当前位置: 首页 > news >正文

硅基计划2.0 学习总结 贰


一、程序逻辑控制(顺序、选择&循环)

顺序结构就不多介绍了,就是各个语句按照先后顺序进行执行

(1)选择结构

三大选择类型:if、if-else、if-else if-else以及悬浮else的问题

基本已经在之前在C语言文章已经讲过,这里不过多赘述

只需要注意两个问题

1、Java中条件表达式只能是布尔型(Boolean,即结果是True或False)

2、表达式不能写的太复杂,比如你把短路表达式写进去,编译器可能会报错之前的C语言博客https://blog.csdn.net/Pluchon/article/details/147186769?fromshare=blogdetail&sharetype=blogdetail&sharerId=147186769&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link

这里我们着重来讲下在Java中代码书写风格:示例代码↓

int num1 = 5;
if (num1 % 2 == 0) {System.out.println("是偶数");} else {System.out.println("是奇数");
}
int num2 = -1;
if (num2 > 0) {System.out.println("是正数");} else if (num2 < 0) {System.out.println("是负数");} else {System.out.println("是0");
}

在Java中,我们起始大括号“{”写在条件判断右边

而结束大括号“}”写在左边并且写在else之前

如果你有很多代码需要格式化成这种格式怎么办?

在Java的一个编译器Idea中,我们可以选中区域按住快捷键Ctrl+Alt+L

这个之前也有介绍过,但是在Java中有几个特殊之处:之前的博客文章https://blog.csdn.net/Pluchon/article/details/147191166?fromshare=blogdetail&sharetype=blogdetail&sharerId=147191166&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link

1、Switch表达式可写字符型,比如下面这段代码,结果自然就是输出正确啦

char str1 = '中';switch (str1) {case '中':System.out.println("输出正确");break;default:System.out.println("输出错误");break;}

2、表达式不能是Long、Float、Double、Boolean这四大类

(2)循环结构

这个之前也介绍过了,但是在Java中有几个特殊之处:之前的博客文章https://blog.csdn.net/Pluchon/article/details/147191166?fromshare=blogdetail&sharetype=blogdetail&sharerId=147191166&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link1、Java中不可用写while(1)这种死循环,要写也只能写while(true)

2、Java中创建循环有快捷方式:输入for后选择fori,直接生成循环模板

3、之前的博客文章有个寻找素数的题,里面有个循环终止条件

4.在Java中我们开平方可直接写成Math.sqrt()即可

我们写一个求水仙花数的Java代码:

public static void main6(String[] args) {//求出0~n之间的所有“水仙花数”并输出int simple4 = 1;while(simple4<10){System.out.print(simple4+" ");simple4++;}System.out.print("\n");int num3 = 10;while(num3<=99999){int count = 0;//先统计是几位数int temp = num3;while(temp != 0) {temp /= 10;count++;}int sum = 0;//用来计算次方和temp = num3;while(temp != 0){sum += Math.pow(temp%10,count);temp /= 10;}if(sum==num3){System.out.print(num3+" ");}num3++;}}

二、程序输入&输出

(1)程序的输出

基本上跟C语言差不多,唯一有区别的就是print和println,以下是区别:

System.out.println("hello world");//这个是换行输出
System.out.print("hello world"+" ");//这个是不换行输出
System.out.printf("%s","hello world");//这个是格式化规范输出,很少使用

(2)程序的输入

对比C语言我们Java的输入需要使用Scanner包装类处理我们的输入

其中必须写的一行代码:

import java.util.Scanner;
Scanner sc = new Scanner(System.in);

注意:我们在输入Scanner后回车,会自动进行导包操作

Scanner后面的sc可以取其他名字,但建议sc


其次,我们再创建变量,接收我们输入的值

int input = sc.nextInt();

注意:你输入的是什么类型,初始化成什么类型,目前只能读取到一个输入的值

这里我们讲下next和nextLine的区别:next遇到空格读取停止,而nextLine会读取一行的内容


在你处理完输入程序后,最后可以选择关闭Scanner的资源

sc.close();

System.out.println("年龄");int age = sc.nextInt();System.out.println("姓名");String high = sc.nextLine();//注意看这里是nextLineSystem.out.println("年龄:"+age);System.out.println("姓名:"+high);

为什么我输入年龄后敲完空格回车直接打印结果了呢,我姓名都没来得及输入啊

注意看代码,nextLine读取的是一行的内容,而你输入完年龄后回车会产生一个空行

nextLine把这一行误以为是你输入的内容,把它读取走了

只需要再添加一个nextLine来读取空白行就好

System.out.println("年龄");int age = sc.nextInt();sc.nextLine();//单独添加这一行,让这一行把空行读走System.out.println("姓名");String high = sc.nextLine();System.out.println("年龄:"+age);System.out.println("姓名:"+high);


循环输入,我们就写一个求和的循环输入吧

int sum = 0;while(sc.hasNextInt()) {int input = sc.nextInt();//←毕竟这里是nextIntsum += input;}System.out.println(sum);

hasNextInt中int类型表示你输入除整数以外的数循环终止

建议输入什么就写什么类型的hasNext

注意这段代码有个陷阱:

你提前终止循环输入,会导致你输入的数没有加到sum中去,你输入完数后回车以下
此时再按ctrl+d才会有正确结果

三、使用方法

public static void main(String[] args) {

我们上面那一行就是main方法的基本格式

public static是修饰符,void是返回类型,main是方法名,括号里的东西是形参

你可以把方法理解成一个工厂,原材料进去成品出来

Java中的方法不需要声明,而且你写哪里都可以

毕竟Java是全局搜索的,而且方法不可以嵌套,不像C/C++函数一样

其生命周期,作用域,就是在“{}”内部,进入开始,出去结束 如何调用方法呢?

我们这里创建一个求两数之和的方法,然后就跟C语言调用函数一样去调用方法

public static int addSimple (int num1,int num2){int ret = num1+num2;return ret;}

如果这个方法有返回类型,我们就用一个变量来接收

如果方法无返回值,则默认是为void,不需要写变量来接收

注意你方法返回的是什么类型,你就需要用什么类型去接收

int result = addSimple(1,2);

因此我们方法的创建和调用之间形成了三匹配:

方法返回类型,返回值类型,接受方法返回值的变量的类型

你肯定写过在C语言中通过函数交换两个数字,用的是地址

但是在Java中,不存在地址的概念,所以Java很安全

public static void swap(int num3,int num4){//这个是方法的定义int temp = num3;num3 = num4;num4 = temp;
}int num3 =1,num4 = 2;swap(1,2);System.out.println(num3+" "+num4);

我们发现并没有交换,原理跟C语言差不多,你形参只是实参的一份临时拷贝

也就是说形参有自己的一块空间,你交换了形参并不等于交换了实参

在Java中只有传值调用,而且方法调用同样是要在栈上开辟空间

四、方法重载

接着我们将方法重载,这个跟C++很像

我们每个重构的方法可以去相同的方法名,在方法调用的时候编译器自己选择

重载三个条件

方法名相同,(参数列表/参数类型/参数个数)不同,并且和返回类型无关!!

我们就拿两数之和来举例

public static int addSimple (int num1,int num2){int ret = num1+num2;return ret;//return作为方法结束的标志}public static double addSimple (double num1,double num2){double ret = num1+num2;return ret;}int ret1 = addSimple(1,2);double ret2 =addSimple(1.5,2.5);

下满那个方法就是addSimple方法的重载,这个重构的方法是专门求浮点型的

函数返回值支持链式表达式,比如return (1/2)+6

仅仅改变方法返回值类型是不会构成方法重载的

 五、方法递归

在C语言中函数有递归,那在Java中方法自然也有递归,基本上和C语言类似

这里列出特殊之处:如果你无线递归下去,没有终止条件,会导致栈溢出,报错如下

给出一个例题练习:递归一个数字,并把各个位数数字求和,比如2255,各个位数之和是14

public static void print(int num){if(num<10){System.out.print(num+" ");}else {print(num / 10);//递推System.out.print(num % 10+" ");//回归的时候打印}}int ret5 = addPlus(2255);
System.out.println(ret5);

为什么不写else会导致栈溢出?
这是因为在if中不存在return语句,return语句作用就是终止后面代码执行
即使你的num小于了10,上面执行完了,下面的else部分还是会执行


之前在C语言已经写过很多递归练习,这里给出之前写的博客链接,写法基本上一致

C语言中递归介绍和练习https://blog.csdn.net/Pluchon/article/details/147530549?fromshare=blogdetail&sharetype=blogdetail&sharerId=147530549&sharerefer=PC&sharesource=Pluchon&sharefrom=from_linkC语言中递归经典练习https://blog.csdn.net/Pluchon/article/details/147514375?fromshare=blogdetail&sharetype=blogdetail&sharerId=147514375&sharerefer=PC&sharesource=Pluchon&sharefrom=from_link

这里给出Java递归的汉诺塔问题的代码

public static void hanNuoTa (int num,char pos1,char pos2,char pos3){if(num==1) {//递归终止条件System.out.print(pos1+"→"+pos3+" ");}else {//一定要写else,因为递归式子中无return,会导致无限递归hanNuoTa(num - 1, pos1, pos3, pos2);System.out.print(pos1 + "→" + pos2+" ");hanNuoTa(num - 1, pos2, pos1, pos3);}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int input = sc.nextInt();hanNuoTa(input,'A','B','C');}


作者基础不是很强,文章撰写难免会有疏漏之处,欢迎指出,我们友好交流


Git码云仓库链接:

本文章使用的代码https://gitee.com/pluchon/java-career/tree/master/TestProject20250515/src


END

http://www.xdnf.cn/news/459469.html

相关文章:

  • SQL:MySQL函数:空值处理函数(NULL Handling Functions)
  • 阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)
  • React和Vue在前端开发中, 通常选择哪一个
  • 机器学习 day03
  • stm32使用freertos时延时时间间隔不对,可能是晶振频率没设置
  • CF每日5题(1300-1500)
  • 提高成功率!课题中的立项依据深度写作
  • Python中plotext 库详细使用(命令行界面中直接绘制各种图形)
  • [IMX] 03.时钟树 - Clock Tree
  • 力扣310.最小高度树(拓扑排序,无向图),力扣.加油站力扣.矩阵置零​​​力扣.二叉树中的最大路径和
  • AI数字人:技术革新与应用全景解析
  • Linux中安装samba服务
  • (C语言)超市管理系统 (正式版)(指针)(数据结构)(清屏操作)(文件读写)
  • CVPR-2022《Efficient Deep Embedded Subspace Clustering》
  • 机器学习 --- 模型选择与调优
  • java17
  • 【Pandas】pandas DataFrame diff
  • 【Linux】gcc从源码编译安装,修改源码,验证修改的源码
  • 数据科学和机器学习的“看家兵器”——pandas模块 之三
  • undefined reference to CPUAllocatorSingleton::instance
  • EasyExcel集成使用总结与完整示例
  • 【歌曲结构】2:小节与歌曲结构信息整合
  • 【ROS2】编译Qt实现的库,然后链接该库时,报错:/usr/bin/ld: XXX undefined reference to `vtable for
  • 跨系统数据烟囱如何破局?豪森智源HSMES重构制造协同新范式‌
  • Java基础(网络编程)
  • 【软件设计师】模拟题五
  • gitlab+portainer 实现Ruoyi Vue前端CI/CD
  • 内网互通原则详解!
  • Apache HttpClient 5 用法-Java调用http服务
  • 文章复现|(1)整合scRNA-seq 和空间转录组学揭示了子宫内膜癌中 MDK-NCL 依赖性免疫抑制环境