java 2(程序流程控制)【含例题详解】

news2025/1/16 1:56:48

java ——程序流程控制

✍作者:电子科大不知名程序员

🌲专栏:java学习指导

各位读者如果觉得博主写的不错,请诸位多多支持;如果有错误的地方,欢迎在评论区指出

目录

  • java ——程序流程控制
    • 分支结构
      • if-else
      • switch-case
      • scanner
    • 循环
      • for 循环
      • while 循环
      • do-while 循环
    • 嵌套循环
    • break和continue
    • break和continue

三种基本流程结构:顺序结构、分支结构、循环结构

分支结构

if-else

三种结构:

if(条件表达式){
    执行代码块;
}
//二选一
if(条件表达式){
    执行代码块1;
}
else{
    执行代码块2;
}
//多选一
if(条件表达式1){
    执行代码块1;
}
	else if(条件表达式2){
    	执行代码块2;
	}
......
	else{
        执行代码块n;
    }

switch-case

1.格式

switch(表达式){
case 常量1:
	语句1;
	//break;
case 常量2:
	语句2;
    //break;
......
case 常量N:
    语句N;    
    break;
default:
    语句;
    //break;
}

//break的意思是不一定要用break

public class SwitchCaseTest {
	public static void main(String[] args) {
		int number=2;
		switch(number) {
		
		case 0:
			System.out.println("zero");
		
		case 1:
			System.out.println("one");
		
		case 2:
			System.out.println("two");
		
		case 3:
			System.out.println("three");
		
		default:
			System.out.println("other");
		}
	}
}

运行结果如下:

image-20220912233945991

【说明】:

1.根据switch表达式中的值,一次匹配各个case中的常量,一旦匹配成功,进入相应case结构中,调用其执行语句,当调用完执行语句后,则仍然继续向下执行其它case结构中的执行语句,直到遇到break关键字或者switch-case末尾结束为止;

2.要想像if-else那样的多选一:需要在每一个case后加break;

break:可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构;

3.switch结构中的表达式,只能是如下的6种数据类型之一:byte、short、char、int、枚举类型、String类型

boolean isRight=ture;
switch(isRight){              //wrong
        ......
}

4.case后放的是常量,不能作范围判断(相当于判断==)

5.break关键字在switch结构中是可选的(绝大多数情况要加)

6.default相当于if-else结构中的else中类型,当前面情况(case)都不满足时执行

​ default也是可选的,且位置是灵活的(用不到)

实例1:

import java.util.Scanner;
public class SwitchCase3 {
	//对于学生成绩大于60分的,输出“合格”。低于60分的,输出不合格
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int score_1=scan.nextInt();
		int score_2=score_1/10;
		switch(score_2) {
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			System.out.println("Failed");
			break;
		case 6:
		case 7:
		case 8:
		case 9:
		case 10:
			System.out.println("pass");
			break;
		}
	}
}

优化:switch(score_1/60)——这样就分成了及格和不及格的两种情况了

实例2:

package my_first_java_code;

import java.util.Scanner;
public class SwitchCase4 {
	public static void main(String [] args){
		//编写程序:从键盘上输入2022年的月份和日期,通过程序求得这是2022的第几天
		Scanner scan=new Scanner(System.in);
		System.out.println("Please enter a month:");
		int month=scan.nextInt();
		System.out.println("Please enter a day:");
		int day=scan.nextInt();
		//定义一个变量来保存总天数
		int sumDays=0;
		/*方法1:过于的冗余
		 * switch(month) {
		case 1:
			sumDays=day;
		case 2:
			sumDays=31+day;
		case 3:
			...
			}
		 */
		//方法2:我们不妨思考,因为我们到下个月的时候正好要将前面所有月的天数相加,因此不妨将前几个月的天数写在下面,那么没有break的情况下就会自动执行
		switch(month) {
		case 12:
			sumDays+=30;
		case 11:
			sumDays+=31;
		case 10:
			sumDays+=30;
		case 9:
			sumDays+=31;
		case 8:
			sumDays+=31;
		case 7:
			sumDays+=30;
		case 6:
			sumDays+=31;
		case 5:
			sumDays+=30;
		case 4:
			sumDays+=31;
		case 3:
			sumDays+=28;
		case 2:
			sumDays+=31;
		case 1:
			sumDays=day;
		}
		System.out.println("2022年的第"+month+"月第"+day+"日是第"+sumDays+"天");
        //注意用连接符连接
	}
}

通过实例2:我们再次强调,break是可选的马,根据实际要求来

实例3:不仅仅考虑2022年,我们加入对年的思考——需要判断是否是闰年

import java.util.Scanner;
public class SwitchCaseTest5 {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		System.out.println("Please enter a year:");
		int year=scan.nextInt();
		System.out.println("Please enter a month:");
		int month=scan.nextInt();
		System.out.println("Please enter a day:");
		int day=scan.nextInt();
		//定义一个变量来保存总天数
		int sumDays=0;
		switch(month) {
		case 12:
			sumDays+=30;
		case 11:
			sumDays+=31;
		case 10:
			sumDays+=30;
		case 9:
			sumDays+=31;
		case 8:
			sumDays+=31;
		case 7:
			sumDays+=30;
		case 6:
			sumDays+=31;
		case 5:
			sumDays+=30;
		case 4:
			sumDays+=31;
		case 3:
			//根据是否是闰年来决定
			//sumDays+=28;
			if(year%4==0&&year%100!=0||year/400==0) {
				sumDays+=29;   //是闰年
			}
			else {
				sumDays+=28;   //不是闰年
			}
		case 2:
			sumDays+=31;
		case 1:
			sumDays=day;
		}
		System.out.println(year+"年的第"+month+"月第"+day+"日是第"+sumDays+"天");
	}
}

scanner

如何从键盘获取不同类型的变量:需要使用scanner类

具体实现步骤:

1.导包:import java.util.Scanner;

2.Scanner的实例化:Scanner scan=new Scanner(System.in);

3.调用Scanner类的相关方法:next()/nextXxx(),来获取指定类型的变量

对于String类,字符串型采用next();其它的采用/nextXxx()(注意首字母大写)

import java.util.Scanner;
public class ScannerTest {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		
		int num=scan.nextInt();    //int型
		System.out.println(num);
	}
}
import java.util.Scanner;
public class ScannnerTest02 {
	public static void main(String[] args) {
		 Scanner scan=new Scanner(System.in);
		 
		 System.out.println("Please enter your name");
		 String name=scan.next();
		 System.out.println(name);
		 
		 System.out.println("Please enter your age");
		 int age=scan.nextInt();
		 System.out.println(age);
		 
		 System.out.println("Please enter your weight");
		 double weight=scan.nextDouble();
		 System.out.println(weight);
		 
		 System.out.println("Whether you join us (true/false)");
		 boolean isjoin=scan.nextBoolean();
		 System.out.println(isjoin);
	}
}

注意:我们需要根据相应的方法,来输入指定类型的值。如果输入的数据类型与要求的类型不匹配时,会报异常:InputMisMatchExce导致程序终止

循环

循环的四个组成部分:

1.初始化部分------>2.循环条件部分(boolean类型)------->3.循环体部分------>4.迭代部分

for 循环

for(1初始化部分;2循环条件部分;4迭代部分){
    3循环体部分;
}

实例:输入两个数正整数m和n,求其最大公约数和最小公倍数

最大公约数:首先要确定范围:1-两数间的较小数;若要满足最大,那么从两数间的较小数开始循环,找到第一个满足条件的数即可(然后退出循环:break)

最小公倍数:范围:两数中的较大数-两数的乘积;后续同理

package my_first_java_code;
import java.util.Scanner;
public class ForTest {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		System.out.println("请输入第一个正整数");
		int first_num=scan.nextInt();
		System.out.println("请输入第二个正整数");
		int second_num=scan.nextInt();
		//求最大公约数
		//先求出两数的较小数——三目运算符
		int min=(first_num<second_num)?first_num:second_num;
		for(int i=min;i>=1;i--) {
			if(first_num%i==0&&second_num%i==0) {
				System.out.println("最大公约数为"+i);
				break;
			}
		}
		int max=(first_num>second_num)?first_num:second_num;
		for(int j=max;j<first_num*second_num;j++) {
			if(j%first_num==0&&j%second_num==0) {
				System.out.println("最小公倍数为"+j);
				break;
			}
		}
	}
}

while 循环

1初始化条件
while(2循环条件){
    3循环体;
    4迭代条件;
}

do-while 循环

1初始化条件
do{
    3循环体;
    4迭代条件;
}while(2循环条件)

说明:

1.do-while循环至少会执行一次循环体

2.当循环会执行多次时,do-while循环和while循环没有区别

实例:从键盘读入个数不确定的整数,并判断读入数的个数,输入0时为结束条件

import java.util.Scanner;
public class CirculateEG {
	public static void main(String[] args) {
		Scanner scan=new Scanner(System.in);
		int count=0;
		while(true) {
			int import_num=scan.nextInt();
			if(import_num!=0) {
				count++;
				System.out.println("输入的个数为:"+count);
			}
			else
				break;
		}
	}
}

对于该类无法确定循环次数的问题:while(true)/for( ; ; ),然后再用break来控制

【总结】:结束循环的方式:循环条件返回false;循环体中,执行break

嵌套循环

外层控制行数;内层控制列数

常见模型:

/*
*
**
***
****
*****
*/
规律:i=j(=)
for(int i=1;i<=5;i++){
    for(int j=1;j<=i;j++){
        System.out.print("*");
    }
    System.out.println();       //换行
}
/*
*****
****
***
**
*
*/
规律:i+j=5(=)
for(int i=1;i<=5;i++){
    for(int j=1;j<=5-i;j++){
        System.out.print("*");
    }
    System.out.println();       //换行
}

实例1:九九乘法表

public class Nine_nine_multiplication_table {
	public static void main(String[] args){
		for(int i=1;i<=9;i++) {
			for(int j=1;j<=i;j++) {
				System.out.print(i+"*"+j+"="+i*j+" ");
			}
			System.out.println();
		}
	}
}

实例2:输出质数

1:

public class Output_prime_numbers {
	public static void main(String[] args){
	
		
		for(int i=2;i<=100;i++) {
			boolean isFlag=true;
			for(int j=2;j<i;j++) {      //判断i是否是质数
				if(i%j==0) {
					isFlag=false;
				}
			}
		if(isFlag==true) {
			System.out.println(i);
			}
		}
	}
}

这里使用到一个标志:是否除尽;需要特别注意的是:每次在判断完后需要重置isflag的值

2.优化

判断质数时若已经被整除了,那么就不用再循环下去了:break(对非质数有效)

为了判断优化是否有效,我们通过记录运行时间来直观的看是否优化(单位:毫秒)

public class Output_prime_number_optimized_V1 {
	public static void main(String[] args){
		//获取当前时间距离1970-01-01 00:00:00的时间差
		long start_time=System.currentTimeMillis();
		for(int i=2;i<=100000;i++) {
			boolean isFlag=true;
			for(int j=2;j<i;j++) {      //判断i是否是质数
				if(i%j==0) {
					isFlag=false;
					break;
				}
			}
		if(isFlag==true) {
			System.out.println(i);
			}
		}
		//获取当前时间距离1970-01-01 00:00:00的时间差
		long end_time=System.currentTimeMillis();
		System.out.println("该程序运行时间为:"+(end_time-start_time));
	}
}

优化前程序运行时间与优化后程序运行时间如下:

在这里插入图片描述
很明显,时间相差10倍!

这里使用到了:

long start_time=System.currentTimeMillis();

System.currentTimeMillis();的返回值为整型,

3.再优化

方法:数学上有个规律,对于一个小于n的整数x,若n不能整除x,则n必定不能整数n/x,那么带来一个明显的优化就是循环控制语句从2到根号n即可。

修改为:

for(int j=2;j<Math.sqrt(i);j++)

这里对i求根号用到了数学方法:

Math.sqrt();    //括号内放开根数

再次优化后程序运行时间如下:

image-20220913215434083

break和continue

1.break:switch-case/循环结构中 作用:结束当前循环

2.continue:循环结构中 作用:结束当次循环

相同点:在break和continue之后是不能声明执行语句

3.对于嵌套循环内:break默认跳出包裹此关键字最近的一层循环

​ ------>若要结束某一特定的for循环:使用标签(continue同理)

label:for( ; ;){
    for( ; ;){
        
        break label;   //结束指定标识的一层循环结构
    }
}

实例:输出质数的另一种写法

label:for(int i=2;i<=100;i++) {
		for(int j=2;j<=Math.sqrt(i);j++) {      //判断i是否是质数
			if(i%j==0) {                       //如果出现了整除
				continue label;
			}
		}
	//能执行到此步骤的,都是质数
    System.out.println(i);
}

7591011354)]

break和continue

1.break:switch-case/循环结构中 作用:结束当前循环

2.continue:循环结构中 作用:结束当次循环

相同点:在break和continue之后是不能声明执行语句

3.对于嵌套循环内:break默认跳出包裹此关键字最近的一层循环

​ ------>若要结束某一特定的for循环:使用标签(continue同理)

label:for( ; ;){
    for( ; ;){
        
        break label;   //结束指定标识的一层循环结构
    }
}

实例:输出质数的另一种写法

label:for(int i=2;i<=100;i++) {
		for(int j=2;j<=Math.sqrt(i);j++) {      //判断i是否是质数
			if(i%j==0) {                       //如果出现了整除
				continue label;
			}
		}
	//能执行到此步骤的,都是质数
    System.out.println(i);
}

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

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

相关文章

【Redis学习1】Redis安装

Redis基础 什么是Redis REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统&#xff0c;是跨平台的非关系型数据库。 Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-…

什么是钉钉消息推送?

我是3y&#xff0c;一年CRUD经验用十年的markdown程序员&#x1f468;&#x1f3fb;‍&#x1f4bb;常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送&#xff0c;一直没写文章同步到给大家。 像这种接入渠道的工作&#xff0c;虽然我没接入过&…

jQuery 常用API

jQuery 常用API Date: January 19, 2023 Sum: jQuery选择器、样式操作、效果、属性操作、文本属性值、元素操作、尺寸、位置操作 目标&#xff1a; 能够写出常用的 jQuery 选择器 能够操作 jQuery 样式 能够写出常用的 jQuery 动画 能够操作 jQuery 属性 能够操作 jQuery…

Linux教程:基本命令学习

文章目录基本操作命令vim使用Linux yum&apt命令本文采用在Windows操作系统上安装虚拟机Vmware以及Centos的方式。 基本操作命令 登录root [swxlocalhost ~]$ su 密码&#xff1a; [rootlocalhost swx]查看文件夹目录 [rootlocalhost swx]# ls FATE Python-3.…

【ROS学习笔记7】ROS中的常用命令行

【ROS学习笔记7】ROS中的常用命令行 文章目录【ROS学习笔记7】ROS中的常用命令行前言一、rosnode二、rostopic三、rosmsg四、rosservice五、rossrv六、rosparam七、Reference写在前面&#xff0c;本系列笔记参考的是AutoLabor的教程&#xff0c;具体项目地址在 这里 前言 机器…

C++ STL 之双向队列 deque 详解

文章目录Part.I AttentionPart.II FuncitonPart.III CodePart.I Attention deque 是 double-ended queue 的缩写&#xff0c;意即双端队列&#xff0c;详细信息参见官网。deque<T>容器适配器是必须要包含头文件#include <deque>deque相较于vector&#xff1a;①它不…

使用eNSP搭建校园网

哈喽&#xff0c;今天写一篇文章记录一下课上进行的实验说实话&#xff0c;上早八这个脑子他是真的不带转的&#xff0c;家人们有没有什么好方法&#xff0c;能在早八的时候把脑子转起来&#x1f622; 好了&#xff0c;讲一下实验背景。 学校有东西两个校区&#xff0c;东校区…

一文吃透 Spring 中的 AOP 编程

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

C++ STL:容器 Container

文章目录1、序列容器1.1、容器共性1.2、vectorvector 结构* vector 扩容原理* vector 迭代器失效1.3、dequedeque 结构deque 迭代器deque 模拟连续空间1.4、listlist 特殊操作list 结构list 迭代器2、关联式容器2.1、容器共性2.2、容器特性3、无序关联式容器3.1、容器共性3.2、…

【剑指offer】JZ5 替换空格、JZ6 从尾到头打印链表

目录 JZ5 替换空格 思路&#xff1a; 解题步骤&#xff1a; JZ6 从尾到头打印链表 思路&#xff1a; 解题步骤 JZ5 替换空格 描述&#xff1a; 请实现一个函数&#xff0c;将一个字符串s中的每个空格替换成“%20”。 例如&#xff0c;当字符串为We Are Happy.则经过替换之…

LibAFL的安装及基本使用

本教程安装LibAFL使用的是Ubuntu 22.04 操作系统 1. 安装 1.1 Rust 安装 Rust的安装&#xff0c;参照Rust官网&#xff1a;https://www.rust-lang.org/tools/install curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh1.2 LLVM安装 直接apt安装&#xff0c;安…

Day903.自增主键不能保证连续递增 -MySQL实战

自增主键不能保证连续递增 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于自增主键不能保证连续递增的内容。 MySql保证了主键是自增&#xff0c;但不相对连续&#xff1b;帮助开发人员快速识别每个行的唯一性&#xff0c;并提高查询效率。 自增主键可以让主键索引…

2023上半年北京/上海/广州/深圳NPDP产品经理认证报名

产品经理国际资格认证NPDP是国际公认的唯一的新产品开发专业认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年…

【GUI】Robo 3T(Studio 3T Free) for Mongodb安装与使用教程

下载 robo 3T现已更名为studio 3T free&#xff0c;官网即可下载 studio 3T free下载地址 安装 mac电脑下载的是dmg安装包&#xff0c;直接正常安装即可&#xff0c;windows电脑也是一样的&#xff0c;不需要配置环境&#xff0c;安装即可使用。&#xff08;前提是你已经安装…

【C++】二叉搜索树的模拟实现

一、概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

Python---time模块

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;Python在学&#xff0c;希望能够得到各位的支持&#xff01;&#xff01;&#xff01; time模块前言时间戳time.time()将时间戳转换成字符串time.ctime()将时间戳转换为元组time.localtime(时间戳)将元…

大四、非计算机专业,Python该怎么学?

我是非计算机专业&#xff0c;大四时开始学Python&#xff0c;用了大概一个半月时间&#xff0c;现在从事数据挖掘工作&#xff0c;算是有点发言权。虽然之前学了点C&#xff0c;但仅仅是皮毛&#xff0c;为了应付考试&#xff0c;所以我基本是零基础开始学Python的。 总结学习…

Stress压力工具的部署及使用

Stress压力工具的部署及使用 下载地址&#xff1a;wget https://fossies.org/linux/privat/old/stress-1.0.5.tar.gz 1.部署 进入目录执行./autogen.sh [rootiZ2ze1pj93eyq389c2ppi5Z stress-1.0.5]# ./autogen.sh ps&#xff1a;如果执行过程中缺包&#xff0c;安装对应的…

运维自动化——Ansible

一&#xff1a;ansible命令执行过程 1. 加载自己的配置文件 默认/etc/ansible/ansible.cfg 2. 加载自己对应的模块文件&#xff0c;如command 3. 通过ansible将模块或命令生成对应的临时py文件&#xff0c; 并将该文件传输至远程服务器的对应执行用户 $HOME…

leetcode 51~60 学习经历

leetcode 51~60 学习经历51. N 皇后52. N 皇后 II53. 最大子数组和54. 螺旋矩阵55. 跳跃游戏56. 合并区间57. 插入区间58. 最后一个单词的长度59. 螺旋矩阵 II60. 排列序列小结51. N 皇后 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子…