Java流程控制

Java流程控制,第1张

语句
在所有的编程语言中遵循的最基础的代码结构是"顺序结构"
	顺序结构:代码从上到下依次开始执行

在部分编程语言中,会在顺序结构中出现了特殊的流程控制

流程控制
	流程控制语句(语句必须应用在代码块(方法)中)
		分支结构
			条件判断语句:if语句
			条件选择语句:switch语句
		循环结构
			for语句
			while语句
			dowhile语句
		
	流程控制代码块(暂不涉及,代码块必须应用在类文件中)
		调用结构:
			方法(在程序中执行特殊功能的代码块)

学习流程控制语句的小技巧:
	1.记住流程控制语句的基本格式
	2.记住流程控制语句的执行流程
	3.理解并精通流程控制语句的实际应用
if 语句
if语句的第一种格式:
	if (条件判断语句) {
		语句体
	}
执行流程:
	1.先确认条件判断语句的结果是true还是false
	2.如果是true,执行语句体,if语句结束;
	  如果是false,if语句结束;

需求:
	判断指定的整数是否为偶数,如果是进行打印
		System.out.println("开始");
		//声明并初始化一个整数
		int num = 124;

		//判断num是否为偶数
		if (num % 2 == 0) {
			System.out.println(num + "是偶数");
		}

		System.out.println("结束");
if语句的第二种格式
	if (条件判断语句) {
		语句体1
	} else {
		语句体2
	}

执行流程:
	1.先确认条件判断语句的结果是true还是false
	2.如果是true,执行语句体1,if语句结束;
	  如果是false,执行语句体2,if语句结束;
需求:判断指定整数的奇偶性并进行打印
		//声明并初始化一个整数
		int num = 123;

		//判断num是否为偶数
		if (num % 2 == 0) {
			System.out.println(num + "是偶数");
		} else {
			System.out.println(num + "是奇数");
		}
三元运算符和if语句第二种格式的注意事项:
	在实际开发中更推荐使用if语句第二种格式,因为三元运算符具有一定的局限性,最终执行的代码只能是结果值,只有在非常简单且 *** 作值的if语句可以用三元运算符进行改写
		//声明并初始化一个整数
		int num = 124;
		//判断num是否为偶数
		if (num % 2 == 0) {
			System.out.println(num + "是偶数");
		} else {
			System.out.println(num + "是奇数");
		}
		System.out.println("====================");
		String result = num % 2 == 0 ? (num + "是偶数") : (num + "是奇数");
		System.out.println(result);
if语句的第三种格式:
	if (条件判断语句1) {
		语句体1
	} else if (条件判断语句2) {
		语句体2
	}
	......
	else if (条件判断语句n) {
		语句体n
	} else {
		语句体n+1
	}

执行流程:
	1.先确认条件判断语句1的结果是true还是false;
	2.如果是true,执行语句体1,if语句结束;
	  如果是false,再确认条件判断语句2的结果是true还是false;
	......
	3.当所有的条件判断语句的结构都是false时,执行else中的语句体n+1

注意事项:
	if语句的第三种格式可以将else语句省略不写,但可能存在安全隐患,推荐写上
需求:判断两个执行整数之间的关系(<,>,=)
		//声明并初始化两个整数
		int a = 4;
		int b = 4;

		//进行关系判断
		if (a > b) {
			System.out.println("a > b");
		} else if (a < b) {
			System.out.println("a < b");
		} else {
			System.out.println("a == b");
		}
exer1 :
		x和y的关系满足如下:
			x>=3 y = 2x + 1;
			-1
		//声明并初始化x变量
		int x = 5;
		//声明变量y
		int y;

		//考虑到有3种选择情况,选择if语句第3种格式
		if (x >= 3) {
			y = 2 * x + 1;
		} else if (x > -1 && x < 3) {
			y = 2 * x;
		} else {
			y = 2 * x - 1;
		}
		System.out.println("y = " + y);
exer2:通过指定考试成绩,判断学生等级
	90-100		优秀
	80-89		好
	70-79		良
	60-69		及格
	60以下		不及格
		//声明并初始化学生的考试成绩
		int score = 100;
		//判断学生考试成绩的有效性
		if (score >= 0 && score <= 100) {
			if (score >= 90 && score <= 100) {
				System.out.println("优秀");
			} else if (score >= 80 && score <= 89) {
				System.out.println("好");
			} else if (score >= 70 && score <= 79) {
				System.out.println("良");
			} else if (score >= 60 && score <= 69) {
				System.out.println("及格");
			} else {
				System.out.println("不及格");
			} 
		} else {
			System.out.println("成绩有误");
		}
Switch 语句
switch语句的格式:
	switch (数据值) {
		case 数据值1:
			语句体1
			break;
		case 数据值2:
			语句体2
			break;
		......
		case 数据值n:
			语句体n
			break;
		default:
			语句体n+1
			break;
	}

执行流程:
	1.先确认switch()中的数据值是多少;
	2.选择数据值1和switch()中的数据值进行匹配,看是否匹配成功;
	3.如果匹配成功,执行语句体1,执行break,switch语句结束;
	  如果匹配失败,选择数据值2和switch()中的数据值进行匹配,看是否匹配成功;
	......
	4.当所有选择的数据值都和switch()中的数据值匹配失败,执行default中的语句体n+1,执行break,
需求:  通过数字匹配星期
		
		//声明并初始化指定数字
		int weekday = 5;
		//进行选择
		switch (weekday) {
			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;
		}
switch语句的注意事项:
	1.switch语句()中数据值的数据值:
		基本类型:
			原则上基本类型只支持int类型数据,考虑到自动提升,基本类型也支持byte,short,char即使是这三种数据类型,进行到switch语句中也会自动提升成int型
		引用类型:
			在JDK5.0(包含)以后,支持枚举类型Enum
			在JDK7.0(包含)以后,支持字符串类型String
	2.switch语句中default语句的作用和if语句第三种格式中else作用类似,都可以省略不写,推荐default写上
	3.switch语句中case和default的位置可以互换,但不影响编译,推荐将default写在case下面
	4.switch语句中break可以省略不写,但是会出现case穿透效果
		int num = 5;
		switch (num) {
			case 1:
				System.out.println("你好");
				//break;	
			case 2:
				System.out.println("我好");
				//break;
			case 3:
				System.out.println("大家好");
				//break;
			default:
				System.out.println("他好我也好");
				//break;
		}
需求:定义一个月份,输出该月份对应的季节。
	一年有四季 
	3,4,5	春季
	6,7,8	夏季
	9,10,11	秋季
	12,1,2	冬季
 分析:
	A:指定一个月份
	B:判断该月份是几月,根据月份输出对应的季节
		if
		switch
	if语句和switch语句在实际开发中更推荐使用if语句,if语句的判断条件可以表示范围,
	而switch语句只能表示数据值,从内存角度分析,switch语句执行过程中更节约内存,
	但是节约的内存在硬件过剩的今天可以忽略不计
			switch (month) {
			case 3:
			case 4:
			case 5:
				System.out.println("春季");
				break;

			case 6:
			case 7:
			case 8:
				System.out.println("夏季");
				break;

			case 9:
			case 10:
			case 11:
				System.out.println("秋季");
				break;

			case 1:
			case 2:
			case 12:
				System.out.println("冬季");
				break;

			default:
				System.out.println("月份有误");
				break;
		}
for 语句
for语句的格式:
	for (初始化语句;循环条件语句;迭代语句) {
		循环体语句
	}

名词解释:
	初始化语句:声明并初始化的循环变量
	循环条件语句:判断循环变量是否满足循环的条件
	迭代语句:循环的后续 *** 作
	循环体语句:重复执行多次的代码片段

执行流程:
	1.先执行初始化语句;
	2.再确认循环条件语句的结果是true还是false;
	3.如果是true,执行循环体语句;
	  如果是false,for语句结束;
	4.执行迭代语句
	5.跳回第2步,继续执行
需求:打印10HelloWorld
		for (int i = 1; i <= 10 ; i++) {
			System.out.println("HelloWorld");
		}
通过循环语句打印1-5和5-1

注意事项:
	for语句中的初始化语句声明的变量只在for的()中和{}中有效
		for (int i = 1; i <= 5 ; i++ ) {
			System.out.println(i);
		}
		System.out.println("========================");
		for (int i = 5; i >= 1; i-- ) {
			System.out.println(i);
		}
使用循环求出1-5之间数据之和

		//声明并初始化求和变量
		int sum = 0;
		for (int i = 1; i <= 5 ; i++ ) {
			sum += i;//sum = sum + i;
		}
		System.out.println("sum = " + sum);
练习:求出1-100之间偶数和
		//声明初始化求和变量
		int sum = 0;

		//遍历1-100之间所有的整数
		for (int i = 1; i <= 100 ; i++ ) {
			//进行数据的筛选
			if (i % 2 == 0) {
				sum += i;
			}
		}
		//打印求和变量
		System.out.println("sum = " + sum);
练习:打印所有的水仙花数

 分析:
	什么是水仙花数呢?
		所谓的水仙花数是指一个三位数,其各位数字的立方和等于该数本身。
		举例:153就是一个水仙花数。
		153 = 1*1*1 + 5*5*5 + 3*3*3

	1.三位数其实就告诉了我们水仙花数的范围
		100-999
	2.如何获取一个数据的每一个位上的数呢?
		举例:我有一个数据153,请问如何获取到个位,十位,百位
		个位:153%10 = 3;
		十位:153/10%10 = 5;
		百位:153/10/10%10 = 1;
		千位:...
		万位:...
	3.让每个位上的立方和相加,并和该数据进行比较,如果相等,就说明该数据是水仙花数,在控制台输出
		//遍历所有的三位数
		for (int i = 100; i < 1000 ; i++ ) {
			//获取每个三位数的个位,十位,百位
			int ge = i % 10;
			int shi = i / 10 % 10;
			int bai = i / 100 % 10;
			
			//数据的筛选
			if (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
				System.out.println(i);
			}
		}
练习:打印所有的水仙花数共***有多少个***
		//声明并初始化水仙花数的计数器变量
		int count = 0;
		//遍历所有的三位数
		for (int i = 100 ; i < 1000 ; i++) {
			//获取每个三位数上的个位,十位,百位
			int ge = i % 10;
			int shi = i / 10 % 10;
			int bai = i / 100 % 10;
			//进行数据的筛选
			if (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
				//计数器变量累加
				count++;
			}
		}
		//打印计数器变量
		System.out.println("水仙花数共有" + count + "个");
分析以下需求,并用代码实现:
(1)打印出四位数字中个位+百位=十位+千位并且个位数为偶数,千位数为奇数的数字,并打印符合条件的数字的个数
(2)符合条件的数字,每行显示5个,用空格隔开,打印格式如下:
	1012 1034 1056 1078 1100 
	1122 1144 1166 1188 1210
	//......
	符合条件的数字总共有: 165个
		//声明并初始化计数器变量
		int count = 0;
		//遍历所有四位数
		for (int i = 1000; i < 10000 ; i++) {
			int ge = i % 10;
			int shi = i / 10 % 10;
			int bai = i / 100 % 10;
			int qian = i / 1000 % 10;

			//进行条件的筛选
			if ((ge + bai == shi + qian) && (ge % 2 == 0) && (qian % 2 == 1)) {
				//计数器累加
				count++;

				//打印符合要求的数字
				if (count % 5 == 0) {
					System.out.println(i);
				} else {
					System.out.print(i + " ");
				}
			}
		}
		System.out.println("符合条件的数字总共有: " + count + "个");
while 语句
while语句的格式:
	while (循环条件语句) {
		循环体语句
	}

执行流程:
	1.确认循环条件语句的结果是true还是false;
	2.如果是true,执行循环体语句;
	  如果是false,while语句结束;
	3.跳回第1步,继续执行

为了和for语句进行互换,衍生出while的扩展格式
	初始化语句
	while (循环条件语句) {
		循环体语句
		迭代语句
	}
		for (int i = 1 ; i <= 10 ; i++) {
			System.out.println("HelloWorld");
		}

		System.out.println("=========================");

		int i = 1;
		while (i <= 10) {
			System.out.println("HelloWorld");
			i++;
		}
趣味折纸:
题目:
	世界最高山峰是珠穆朗玛峰,它的高度是8848.86米,假如我有一张足够大的纸,它的厚度是0.1毫米。
	请问,折叠多少次,不低于珠穆朗玛峰的高度?
		 //声明初始化珠峰高度变量
		int zf = 88488600;
		//声明初始化纸的厚度变量
		int zhi = 1;
		int count = 0;

		//考虑到不清楚循环次数或循环范围,使用while语句
		while (zhi < zf) {
			count++;
			//进行折叠
			zhi *= 2;
		}
		System.out.println("count = " + count);
doWhile 语句
dowhile语句的格式:
	do {
		循环体语句
	} while (循环条件语句);

执行流程:
	1.执行循环体语句
	2.再确认循环条件语句的结果是true还是false
	3.如果是true,跳回第1步继续执行;
	  如果是false,dowhile语句结束;

为了和for循环语句进行转换,衍生出dowhile循环扩展格式
	初始化语句
	do {
		循环体语句
		迭代语句
	} while(循环条件语句);
		for (int i = 1; i <= 10 ; i++ ) {
			System.out.println("HelloWorld");
		}

		System.out.println("======================");

		int i = 1;
		do {
			System.out.println("HelloWorld");
			i++;
		} while (i <= 10);
三种循环的区别
三种循环的区别:
	从代码格式角度分析:
		1.循环变量的作用域不同:
			for语句的循环变量在循环结束后自动消失达到节约内存目的,while和dowhile扩展格式语句循环变量需要等到所在方法结束后才进行消失,浪费内存资源
		2.执行相同需求,循环条件语句判断次数不同
			dowhile语句的循环条件语句判断次数比for语句和while语句少一次
		3.循环体语句最少执行次数
			for语句和while语句循环体语句最少执行0次
			dowhile语句循环体语句最少执行1次
	从实际开发角度分析:
		1.有明显的循环范围或次数选择for语句进行遍历
		2.没有明显循环范围或次数选择while语句进行遍历
		3.在实际开发中不会选择dowhile
			(1)当别人的代码出现了dowhile语句,我们可以看懂格式和分析执行流程
			(2)部分源码中会遇到dowhile语句
		for (int i = 1; i <= 10 ; i++ ) {
			System.out.println("HelloWorld");
		}

		System.out.println("=========================");

		int i = 1;
		while (i <= 10) {
			System.out.println("HelloWorld");
			i++;
		}

		System.out.println("======================");

		int j = 1;
		do {
			System.out.println("HelloWorld");
			j++;
		} while (j <= 10);
注意事项
流程控制语句的注意事项(针对if语句第一种格式,for语句,while语句):
	当流程控制语句(dowhile除外)里面的语句体有且仅有一句的时候,流程控制语句的{}可以省略不写,如果不写代码阅读性较低,所以推荐写上
		System.out.println("开始");

		if (false) 
			System.out.println("Hello");
			System.out.println("World");
		

		System.out.println("结束");

		System.out.println("============================");

		for (int i = 1; i <= 10 ;i++ )
			System.out.println("Hello");
			System.out.println("World");
控制语句
控制语句:
	break
	continue
	return(暂不涉及)

break关键字:
	场景:
		1.switch语句中
		2.循环语句中
	作用:
		1.结束switch语句
		2.结束循环语句

continue关键字:
	场景:
		循环语句中
	作用:
		结束当次循环,继承下一次循环

控制语句的注意事项:
	在控制语句同一作用域内,控制语句后面不写编写任何代码,否则编译报错,因为永远执行不到
			for (int i = 1; i <= 10 ; i++ ) {

			if (i == 3) {
				break;
				System.out.println("HelloWorld");
			}

			System.out.println(i);
		}
死循环语句
死循环语句:
	含义:循环条件语句永远判断为true的循环

分类:
	for死循环语句
	while死循环语句

格式:
	for的死循环格式:
		for (;;) {
			循环体语句
		}

	while的死循环格式:
		while (true) {
			循环体语句
		}

区别:
	在实际开发中更推荐选择while的死循环格式,格式上更简洁明了;在编写框架源码,算法,设计模式等,更推荐使用for的死循环格式,for的死循环格式效率更高
		for (; ;) {
			System.out.println("HelloWorld");
		}

		while (true) {
			System.out.println("HelloWorld");
		}
循环嵌套
循环嵌套:
	在一个循环语句中存在另外一个循环语句(循环嵌套往往指代的是for语句嵌套)
	内层循环:在循环嵌套中存在内部的循环语句
	外层循环:在循环嵌套中存在外部的循环语句
	内层循环和外层循环是一对相对的概念

循环嵌套语句的格式:
	for (外层循环的初始化语句;外层循环的循环条件语句;外层循环的迭代语句) {
		for (内层循环的初始化语句;内层循环的循环条件语句;内层循环的迭代语句) {
			内层循环的循环体语句
		}
	}

执行流程:
	1.执行外层循环的初始化语句;
	2.确认外层循环的循环条件语句的结果是true还是false;
	3.如果是false,for语句嵌套语句结束;
	  如果是true,执行外层循环的循环体语句,开始执行第a步;
		a.执行内层循环的初始化
		b.确认内层循环的循环条件语句的结果是true还是false;
		c.如果是false,内层循环语句结束,开始执行第4步;
		  如果是true,执行内层循环的循环体语句;
		d.执行内层循环的迭代语句;
		e.跳回第b步,继续执行;
	4.执行外层循环的迭代语句;
	5.跳回第2步,继续执行
需求:按照固定的格式打印一天中的时间
		固定格式:  XXfor (int h = 0; h < 24 ; h++) {
				for (int m = 0; m < 60 ; m++) {
					System.out.println(h + "时" + m + "分");
				}
			}
循环嵌套语句的注意事项:
	外层循环的初始化语句执行了1次
	内层循环的初始化语句执行了(外层循环的循环次数)次
	内层循环的循环体语句执行了(外层循环的循环次数*内层循环的循环次数)次
练习
	花100文钱买100只鸡
	公鸡5文1只
	母鸡3文1只
	小鸡1文3只
	花100文钱正好买100只鸡

分析:
	一种一种的可能性进行尝试
		//gong代表公鸡只数
		for (int gong = 0; gong <= 100 ; gong++ ) {
			//mu代表母鸡只数
			for (int mu = 0; mu <= 100 ; mu++ ) {
				//xiao代表小鸡只数
				for (int xiao = 0; xiao <= 100 ; xiao++) {
					//进行数据的筛选
					if ((xiao % 3 == 0) && (gong + mu + xiao == 100) && (5*gong + 3*mu + xiao/3 == 100)) {
						System.out.println("公鸡" + gong + "只,母鸡" + mu + "只,小鸡" + xiao + "只");
					}
				}
			}
		}
百钱买百鸡的优化
 		//循环次数:1030301
		//gong代表公鸡只数
		for (int gong = 0; gong <= 100 ; gong++ ) {
			//mu代表母鸡只数
			for (int mu = 0; mu <= 100 ; mu++ ) {
				//xiao代表小鸡只数
				for (int xiao = 0; xiao <= 100 ; xiao++) {
					//进行数据的筛选
					if ((xiao % 3 == 0) && (gong + mu + xiao == 100) && (5*gong + 3*mu + xiao/3 == 100)) {
						System.out.println("公鸡" + gong + "只,母鸡" + mu + "只,小鸡" + xiao + "只");
					}
				}
			}
		}

		System.out.println("======================================");

		//循环次数:72114
		for (int gong = 0; gong <= 20 ; gong++ ) {
			for (int mu = 0; mu <= 33 ; mu++ ) {
				for (int xiao = 0; xiao <= 100 ; xiao++) {
					if ((xiao % 3 == 0) && (gong + mu + xiao == 100) && (5*gong + 3*mu + xiao/3 == 100)) {
						System.out.println("公鸡" + gong + "只,母鸡" + mu + "只,小鸡" + xiao + "只");
					}
				}
			}
		}

		System.out.println("======================================");

		//循环次数:714
		for (int gong = 0; gong <= 20 ; gong++ ) {
			for (int mu = 0; mu <= 33 ; mu++ ) {
				int xiao = 100 - gong - mu;
				if ((xiao >= 0) && (xiao % 3 == 0) && (5*gong + 3*mu + xiao/3 == 100)) {
					System.out.println("公鸡" + gong + "只,母鸡" + mu + "只,小鸡" + xiao + "只");
				}
			}
		}

		System.out.println("======================================");

		//循环次数:714
		for (int gong = 0; gong <= 20 ; gong++ ) {
			for (int xiao = 0; xiao <= 100 ; xiao += 3 ) {
				int mu = 100 - gong - xiao;
				if ((mu >= 0) && (5*gong + 3*mu + xiao/3 == 100)) {
					System.out.println("公鸡" + gong + "只,母鸡" + mu + "只,小鸡" + xiao + "只");
				}
			}
		}
打印1-100之间所有的质数
	
质数的特点:
	1.只能被1或本身进行整除
	2.1不是质数

分析:
	通过分析发现质数的因数只有2个,除了这2次外再可以进行整除的数都不会是质数
		//外层循环:控制被除数	循环次数:1133
		for (int i = 2; i <= 100 ; i++) {
			//声明并初始化被除数质数标记变量(true为质数,false不是质数)
			boolean flag = true;

			//内层循环:控制除数
			for (int j = 2; j < i ; j++) {
				//进行整除判断
				if (i % j == 0) {
					//判定该被除数肯定不是质数,修改标记变量
					flag = false;
					break;
				}
			}

			//判断被除数因数的个数
			if (flag) {
				System.out.println(i);
			}
		}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/871620.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)