Java程序的逻辑控制

news2024/11/26 8:24:29

 

 一、顺序结构

顺序结构比较简单,如果我们按照代码书写的顺序一行一行执行,将会是这样的:

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
// 运行结果
aaa
bbb
ccc

如果调整代码的书写顺序, 则执行顺序也发生变化:

System.out.println("aaa");
System.out.println("ccc");
System.out.println("bbb");
// 运行结果
aaa
ccc
bbb

二、分支结构

1、if语句

if语句可以帮助我们在面对多种可能的时候执行不同的代码

(1)语法格式1

if(布尔表达式){
// 语句
}
如果布尔表达式结果为 true ,执行 if 中的语句,否则不执行。

(2)语法格式2

if(布尔表达式){
// 语句1
}else{
// 语句2
}
如果布尔表达式结果为 true ,则执行 if 中语句,否则执行 else 中语句

(3)语法格式3

if(布尔表达式1){
// 语句1
}else if(布尔表达式2){
// 语句2
}else{
// 语句3
}
表达式 1 成立,执行语句 1 ,否则表达式 2 成立,执行语句 2 ,否则执行语句 3
在生活中,我们也可以经常使用到if表达式,例如在读书的时候,我们往往将60以上的认为及格,60以下的认为不及格,按照考试成绩,我们可以分成下面这几种情况:
分数在 [90, 100] 之间的,为优秀
分数在 [80, 90) 之前的,为良好
分数在 [70, 80) 之间的,为中等
分数在 [60, 70) 之间的,为及格
分数在 [ 0, 60) 之间的,为不及格
错误数据

那么接下来,我们尝试用if循环来判断以下某名同学的成绩属于哪个档次

if(score >= 90){
System.out.println("优秀");
}else if(score >= 80 && score < 90){
System.out.println("良好");
}else if(score >= 70 && score < 80){
System.out.println("中等");
}else if(score >= 60 && score < 70){
System.out.println("及格");
}else if(score >= 0 && score < 60){
System.out.println("不及格");
}else{
System.out.println("错误数据");
}

 代码风格:

良好的代码风格有助于提高代码的可读性

在看到别人写代码的时候,我们经常能看到两种代码风格,那我们在书写代码的时候,应该采取哪种代码风格呢?

我们先来看第一种:

//第一种代码风格
int x = 10;
if (x == 10) {
// 语句1
} else {
// 语句2
}

再来看看第二种:

//第二种代码风格
int x = 10;
if (x == 10)
{
// 语句1
}
else
{
// 语句2
}
虽然两种方式都是合法的 , 但是 Java 中更推荐使用风格1, 这是因为 放在 if / else 同一行 . 代码更加的紧凑。

分号问题

在使用if语句的时候我们要注意分号的正确使用,不然可能会导致程序出现错误。

例如:

int x = 20;
if (x == 10);
{
System.out.println("hehe");
}
// 运行结果
hehe

在这段代码中,我们可以发现在if循环条件后加了一个分号,这样会使得if语句成为了一条单独的语句,而{}中的代码则成为了和if无关的代码。

悬垂 else 问题

在使用if语句的时候,{}的正确使用也是很重要的一节
我们来看一下下面这段代码:
int x = 10;
int y = 10;
if (x == 10)
if (y == 10)
System.out.println("aaa");
else
System.out.println("bbb");

这段代码中的if语句虽然没有使用{},但是却是正确的,然而在实际的代码书写中,我们并不推荐这样书写代码。

这是因为if语句在不使用{}的时候,只可以和其下面的第一条语句匹配,也就是说,当if语句中含多条语句的时候,我们必须使用{}将其包含在if语句内。

因此,我建议无论是一条语句还是多条语句,都使用{}来减少不必要的错误

2、switch 语句

基本语法

switch(表达式){
case 常量值1:{
语句1;
[break;]
}
case 常量值2:{
语句2;
[break;]
}
...
default:{
内容都不满足时执行语句;
[break;]
}
}

执行流程:

1. 先计算表达式的值
2. case 依次比较,一旦有响应的匹配就执行该项下的语句,直到遇到 break 时结束
3. 当表达式的值没有与所列项匹配时,执行 default

代码示例

现在,我们尝试使用switch语句来完成一道题:根据 day 的值输出星期几

int day = 1;
switch(day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("输入有误");
break;
}
【注意事项】
多个 case 后的常量值不可以重复
switch 的括号内只能是以下类型的表达式:
        基本类型:byte char short int ,注意不能是 long 类型
        引用类型:String 常量串、枚举类型
不能作为switch括号内的变量有:long   double   float   boolean

break 不要遗漏, 否则会失去 "多分支选择" 的效果 !!

int day = 1;
switch(day) {
case 1:
System.out.println("星期一");
// break;
case 2:
System.out.println("星期二");
break;
}
// 运行结果
星期一
星期二
switch 不能表达复杂的条件
// 例如: 如果 num 的值在 10 到 20 之间, 就打印 hehe
// 这样的代码使用 if 很容易表达, 但是使用 switch 就无法表示.
if (num > 10 && num < 20) {
System.out.println("hehe");
}

三、循环结构

1、while 循环

基本语法格式:

while(布尔表达式){
循环语句;
}
循环条件为 true, 则执行循环语句 ; 否则结束循环 .
代码示例 1 : 打印 1 - 10 的数字
int num = 1;
while (num <= 10) {
System.out.println(num);
num++;
}
代码示例 2: 计算 1 - 100 的和
int n = 1;
int result = 0;
while (n <= 100) {
result += n;
n++;
}
System.out.println(num);
// 执行结果
5050

代码示例3: 计算 5 的阶乘

int n = 1;
int result = 1;
while (n <= 5) {
result *= n;
n++;
}
System.out.println(num);
// 执行结果
120
这里我们发现 , 当一个代码中带有多重循环的时候 , 代码的复杂程度就大大提高了 . 而比较复杂的代码就更容易出错 . 后面我们会采用更简单的办法来解决这个问题.
注意事项
1. if 类似 , while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { }
2. if 类似 , while 后面的 { 建议和 while 写在同一行 .
3. if 类似 , while 后面不要多写 分号 , 否则可能导致循环不能正确执行

我们先来看下面这个错误的案例:

int num = 1;
while (num <= 10); {
System.out.println(num);
num++;
}
// 执行结果
[无任何输出, 程序死循环]

此时 ; while 的语句体(这是一个空语句), 实际的 { } 部分和循环无关. 此时循环条件 num <= 10 恒成立, 导致代码 死循环了

2、break

break 的功能是让循环提前结束 .
代码示例 : 找到 100 - 200 中第一个 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 == 0) {
System.out.println("找到了 3 的倍数, 为:" + num);
break;
}
num++;
}
// 执行结果
找到了 3 的倍数, 为:102

执行到 break 就会让循环结束

3、continue

continue 的功能是跳过这次循环, 立即进入下次循环. 

代码示例 : 找到 100 - 200 中所有 3 的倍数
int num = 100;
while (num <= 200) {
if (num % 3 != 0) {
num++; // 这里的 ++ 不要忘记! 否则会死循环.
continue;
}
System.out.println("找到了 3 的倍数, 为:" + num);
num++;
}
执行到 continue 语句的时候 , 就会立刻进入下次循环 ( 判定循环条件 ), 从而不会执行到下方的打印语句 .

4、for 循环

基本语法

for(表达式①;布尔表达式②;表达式③){
表达式④;
}

那么表达式1、2、3内部分别放置什么呢?

表达式 1: 用于初始化循环变量初始值设置,在循环最开始时执行,且只执行一次
表达式 2: 循环条件,满则循环继续,否则循环结束
表达式 3: 循环变量更新方式

执行过程

①②③④--->②③④--->②③④--->②③④--->②③④--->②③④--->...--->②为false,循环结束。

 代码示例: 计算 5 的阶乘 

int result = 1;
for (int i = 1; i <= 5; i++) {
result *= i;
}
System.out.println("result = " + result);
【注意事项】 ( while 循环类似 )
1. if 类似 , for 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句 . 建议还是加上 { }
2. if 类似 , for 后面的 { 建议和 while 写在同一行 .
3. if 类似 , for 后面不要多写 分号 , 否则可能导致循环不能正确执行 .
4. while 循环一样,结束单趟循环用 continue ,结束整个循环用 break

5、do while 循环 

基本语法

do{
循环语句;
}while(循环条件);

执行过程:

先执行循环语句 , 再判定循环条件,循环条件成立则继续执行,否则循环结束。
代码示例:打印 1 - 10
int num = 1;
do {
System.out.println(num);
num++;
} while (num <= 10);
【注意事项】
1. do while 循环最后的分号不要忘记
2. 一般 do while 很少用到 , 更推荐使用 for while.

四、输入输出

1、输出到控制台

基本语法

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
println 输出的内容自带 \n, print 不带 \n
printf 的格式化输出方式和 C 语言的 printf 是基本一致的 .

 代码示例

System.out.println("hello world");
int x = 10;
System.out.printf("x = %d\n", x)

格式化字符串

 2、从键盘输入

使用 Scanner 读取字符串 / 整数 / 浮点数
import java.util.Scanner; // 需要导入 util 包
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的姓名:");
String name = sc.nextLine();
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
System.out.println("请输入你的工资:");
float salary = sc.nextFloat();
System.out.println("你的信息如下:");
System.out.println("姓名: "+name+"\n"+"年龄:"+age+"\n"+"工资:"+salary);
sc.close(); // 注意, 要记得调用关闭方法
// 执行结果
请输入你的姓名:
张三
请输入你的年龄:
18
请输入你的工资:
1000
你的信息如下:
姓名: 张三
年龄:18
工资:1000.0
使用 Scanner 循环读取 N 个数字,并求取其平均值
Scanner sc = new Scanner(System.in);
int sum = 0;
int num = 0;
while (sc.hasNextInt()) {
int tmp = sc.nextInt();
sum += tmp;
num++;
}
System.out.println("sum = " + sum);
System.out.println("avg = " + sum / num);
sc.close();
// 执行结果
10
40.0
50.5
^Z
sum = 150.5
avg = 30.1
注意事项
当循环输入多个数据的时候 , 使用 ctrl + z 来结束输入 (Windows 上使用 ctrl + z, Linux / Mac 上使用 ctrl + d)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/384974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络基础服务器 与SMP、NUMA、MPP 三大体系结构科普

OSI和TCP/IP是很基础但又非常重要的知识&#xff0c;很多知识点都是以它们为基础去串联的&#xff0c;作为底层&#xff0c;掌握得越透彻&#xff0c;理解上层时会越顺畅。今天这篇网络基础科普&#xff0c;就是根据OSI层级去逐一展开的。01计算机网络基础01 计算机网络的分类按…

JVM—类加载子系统

JVM细节版架构图 ​ 本文针对Class Loader SubSystem这一块展开讲解类加载子系统的工作流程 类加载子系统作用 1.类加载子系统负责从文件系统或者网络中加载class文件&#xff0c;class文件在文件开头有特定的文件标识即16进制CA FE BA BE&#xff1b; 2.加载后的Class类信息…

Flink SQL Checkpoint 学习总结

前言 学习总结Flink SQL Checkpoint的使用&#xff0c;主要目的是为了验证Flink SQL流式任务挂掉后&#xff0c;重启时还可以继续从上次的运行状态恢复。 验证方式 Flink SQL流式增量读取Hudi表然后sink MySQL表&#xff0c;任务启动后处于running状态&#xff0c;先查看sin…

IDEA 断点总是进入class文件没有进入源文件解决

前言 idea 断点总是进入class文件没有进入源文件解决 问题 在源文件里打了断点&#xff0c;断点模式启动时却进入了class文件里的断点&#xff0c;而没有进入到java源文件里的断点。 比如&#xff1a;我在 A.java 里打了断点&#xff0c;调试时却进入到了 jar 包里的 A.clas…

基于ensp的小型局域网网络搭建及需求分析

一 需求分析本实验的目的在于建立小型局域网。由于公司由财政部、人事部、科技部三个部门组成&#xff0c;分布在同一个交换机下。设计以下网络&#xff1a;三个个部门使用两台交换机连接&#xff0c;然后连接到汇聚交换机&#xff0c;再通过路由器与外网以及其他部门网络相连。…

java TCP Socket 数据传输,服务端与客户端

java TCP Socket 数据传输&#xff0c;服务端与客户端 1. socket通信基本原理 socket 通信是基于TCP/IP 网络层上的一种传送方式&#xff0c;我们通常把TCP和UDP称为传输层。 如上图&#xff0c;在七个层级关系中&#xff0c;我们讲的socket属于传输层&#xff0c;其中UDP是…

单位冲激函数与单位阶跃函数

目录 单位阶跃函数 单位冲激函数 狄拉克定义&#xff1a; 冲激函数的性质 对时间的积分等于单位阶跃函数 筛分性质 尺度特性 冲击偶的定义&#xff1a;单位冲击函数的导数 各阶导数 离散的阶跃信号与冲激信号 &#xff08;1&#xff09;阶跃信号&#xff0c;其定义为…

vi编辑器操作指令分享

vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的&#xff0c;因此您可以在其他任何介绍vi的地方…

国内vs国外:外贸建站该如何选择?

外贸建站找国内还是国外&#xff1f; 答案是&#xff1a;国内。 随着互联网的发展&#xff0c;越来越多的企业开始意识到在网络上进行商业活动的重要性。 其中&#xff0c;建立一个专业的外贸网站是企业在国际市场上拓展业务的关键。 然而&#xff0c;对于选择国内还是国外…

电脑出问题了怎么重装系统修好

电脑在使用过程中经常会出现各种各样的问题&#xff0c;如系统崩溃、蓝屏、病毒感染等。这些问题如果不能及时得到解决&#xff0c;将会给用户带来很多麻烦和损失。小白一键重装系统是一个功能强大的工具&#xff0c;可以帮助用户快速解决电脑常见问题。下面我们就来详细介绍如…

Vulnhub靶场----8、DC-8

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-8下载地址&#xff1a;https://download.vulnhub.com/dc/DC-8.zip kali&#xff1a;192.168.144.148 DC-8&#xff1a;192.168.144.156 二、渗透流程 1、信息收集nmap -T5 -A -p- -sV -sT 192.168.144.156思路&am…

每日分享(四合一即时通讯聊天源码APP群聊、私聊、朋友圈)

demo软件园每日更新资源,请看到最后就能获取你想要的: 1.Python整洁编程 完整版PDF Python 与其他语言的不同之处在于&#xff0c;它是一种简单而有深度的语言。因为简单&#xff0c;所以谨慎编写代码要重要得多&#xff0c;尤其是在大项目中&#xff0c;因为代码很容易变得复…

ros2创建一个工程

第一步&#xff1a;创建src目录 $ mkdir ros2-demo $ cd ros2-demo/ $ mkdir src $ cd src/第二步&#xff1a;创建功能包cd src$ ros2 pkg create --build-type ament_cmake ros2_demo --dependencies rclcpp std_msgsros2 pkg create --build-type ament_python learning_pkg…

打地鼠游戏-第14届蓝桥杯STEMA测评Scratch真题精选

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第102讲。 蓝桥杯选拔赛现已更名为STEMA&#xff0c;即STEM 能力测试&#xff0c;是蓝桥杯大赛组委会与美国普林斯顿多…

外贸建站多少钱?不同预算对应的建站方案!

外贸建站多少钱&#xff1f; 答案是&#xff1a;3000左右。 作为一个外贸企业的经营者&#xff0c;我们深知一个优质的外贸网站对于企业的重要性。 然而&#xff0c;建立一个优质的外贸网站需要耗费大量的时间和资金&#xff0c;因此我们需要在预算有限的情况下&#xff0c;…

代码随想录算法训练营第三天| 203. 移除链表、707. 设计链表、206.反转链表

977 有序数组的平方题目链接&#xff1a;203 移除链表元素介绍给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。思路一如果要被删除的元素是非头节点&#xff0c;只需要找到前一个节点&…

MySQL之幻读问题

MySQL之幻读问题 导读 在进入今天的主题之前必须先了解事务的四大特性ACID、MVCC、事务隔离级别&#xff08;具体的自行查询&#xff09;&#xff0c;其中I&#xff08;Isolation&#xff09;隔离性所产生的问题涉及到的事务隔离分为不同级别&#xff0c;包括读未提交&#x…

python+pytest接口自动化(7)-cookie绕过登录(保持登录状态)

在编写接口自动化测试用例或其他脚本的过程中&#xff0c;经常会遇到需要绕过用户名/密码或验证码登录&#xff0c;去请求接口的情况&#xff0c;一是因为有时验证码会比较复杂&#xff0c;比如有些图形验证码&#xff0c;难以通过接口的方式去处理&#xff1b;再者&#xff0c…

Java多线程——线程安全、synchronized、volatile关键字以及多线程案例

文章目录前言一、线程安全—多线程不可避免的风险&#xff01;1、线程不安全的示例2、线程不安全的原因二、synchronized关键字1.synchronized的特性1&#xff09;互斥2&#xff09;刷新内存3&#xff09;可重入2、synchronized使用示例3、Java标准库中的线程安全类三、volatil…

【巨人的肩膀】JAVA面试总结(四)

&#x1f4aa;、JVM 目录&#x1f4aa;、JVM1、说一下JVM的主要组成部分及其作用2、什么是JVM内存结构&#xff08;谈谈对运行时数据区的理解&#xff09;3、堆和栈的区别是什么4、堆中存什么&#xff1f;栈中存什么&#xff1f;5、为什么不把基本类型放堆中呢&#xff1f;6、为…