Java从入门到实战总结-1.3、Java流程控制
文章目录
- Java从入门到实战总结-1.3、Java流程控制
- 1、接收用户输入
- 2、执行结构概述
- 3、if分支
- 4、switch
- 5、循环和while循环
- (1)、循环简介
- (2)、while循环
- 6、do while循环
- 7、for循环
- 8、循环嵌套图形打印
- 9、break和continue
- 10、如何退出多重循环
- 11、图形打印详解
- 12、判断用户输入类型
- 13、代码练习
1、接收用户输入
System类除了out和err两个输出流之外,还有in输入流的实例对象作为类成员,它可以接收用户的输入。
程序中用到了System类的输入流也就是类变量in,它可以接收用户的输入信息,并且是标准的输入流实例对象。另外Scanner类是Java的扫描器类,它可以从输入流中读取指定类型的数据或字符串。
说明:在使用Scanner类时,必须在源代码顶端导入这个类,导入语句为“import java.util.Scanner;”
package day3;import java.util.Scanner;
public class demo1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
//用于接收各种数据类型,比如int
// System.out.println("请输入一段数字: ");
// int i = input.nextInt();
// System.out.println(i);
//接收文字和接收一行文字
//next会以空格或者回车结束
System.out.println("请输入next接收的内容:");
String str1 = input.next();
System.out.println(str1);
//nextLine和next不要同时使用,nextLine可以识别出来空格,直到回车结束
// System.out.println("清输入nextline接收的内容:");
// String str2 = input.nextLine();
// System.out.println(str2);
}
}
使用next:
使用nextLine:
2、执行结构概述
1996 年,计算机科学家 Bohm 和 Jacopini 证明了:任何简单或复杂的算法都可以由顺序结构、分支结构和循环结构这三种基本结构组合而成。
它们的共同点是都包含一个入口和一个出口,它们的每个代码都有机会被执行,不会出现死循环。
顺序结构
- 顺序结构是一种基本的控制结构,它按照语句出现的顺序执行操作
分支结构
- 分支结构又被称为选择结构,根据条件成立与否来执行操作,
循环结构
- 循环结构是一种重复结构,如果条件成立,它会重复执行某一循环体,直到出现不满足的条件为止。
3、if分支
if 条件结构是根据条件判断之后再做处理
if(条件语句){…}
if (条件语句){…}else{…}
if (条件语句){…}else if(条件语句){…}
if (条件语句){…}else if(条件语句){…}else{…}
例子:用户输入学生成绩,判断成绩是否及格,判断条件为 优良: > 90、良好:81-90、中:60-80、不及格:<60
package day3;import java.util.Scanner;
public class Demo2 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("清输入成绩:");
int scores = input.nextInt();
//91优 81-90良 60-80中 60差
if(scores >= 91) {
System.out.println("您的成绩是优秀,继续加油哦!");
} else if(scores >= 81 & scores < 91) {
System.out.println("您的成绩是良好!还要努力哦!");
} else if(scores >= 60 & scores < 81) {
System.out.println("您的成绩是中等!还要加倍努力哦!");
} else {
System.out.println("您的成绩是差!准备补考吧!");
}
}
}
4、switch
switch(表达式){
case 取值 1: 语句块 1;break;
case 取值 n: 语句块 n;break;
default: 语句块 n+1;break;
}
switch 语句有关规则
表达式的返回值必须是下述几种类型之一:int, byte, char, short,String;
case 子句中的取值必须是常量,且所有 case 子句中的取值应是不同的;
default 子句是可选的;
break 语句用来在执行完一个 case 分支后使程序跳出 switch 语句块;如果 case 后面没有写 break 则直接往下面执行!
Case 后面的执行体可写{ }也可以不写{ }
例题:多分支月份输出天数(充分利用语句特性)
package day3;import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入月份:");
int month = input.nextInt();
switch(month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
System.out.println(month + "月共有 31 天");
break;
case 4:
case 6:
case 9:
case 11:
System.out.println(month + "月共有 30 天");
break;
case 2:
System.out.println(month + "月共有 28 天");
break;
default :
System.out.println("友情提示,您输入有误!");
break;
}
}
}
5、循环和while循环
(1)、循环简介
循环语句功能
在循环条件满足的情况下,反复执行特定代码
循环语句分类
for 循环
while 循环
do/while 循环
(2)、while循环
符合条件,循环继续执行;否则,循环退出
特点:先判断,再执行
while语法:
while(条件表达式){
//语句块;
}
实现示例:
录入班级人数和学员成绩,计算班级学员的平均成绩
使用 while 循环的步骤
1、分析循环条件和循环操作
2、套用 while 语法写出代码
3、检查循环是否能够退出
package day3;import java.util.Scanner;
public class Demo4 {
public static void main(String[] args) {
int sum = 0;
int score = 0;
int avg = 0;
int studentNum = 20;
int i = 0;
Scanner input = new Scanner(System.in);
while(i <= studentNum) {
System.out.print("请输入第" + i + "位同学的成绩:");
score = input.nextInt();
sum = sum + score;
i++;
}
avg = sum / studentNum;
System.out.println(avg);
}
}
6、do while循环
先执行一遍循环操作,符合条件,循环继续执行;否则,循环退出
特点:先执行,再判断
语法:
do {
循环操作
}while ( 条件表达式 );
while 循环和 do-while 循环的区别?
while:先判断条件,如果条件满足,再执行循环操作
do while:先执行一遍循环操作,然后再判读条件,如果条件满足,继续执行循环操作。
示例:
package day3;public class Demo5 {
public static void main(String[] args) {
testWhile();
testDoWhile();
}
public static void testDoWhile() {
int i = 5;
System.out.println("测试do while");
do {
i++;
System.out.println(i);
} while (i < 5);
}
public static void testWhile() {
int i = 5;
System.out.println("测试while");
while(i < 5) {
i++;
System.out.println(i);
}
}
}
7、for循环
语法:
for(初始化参数;判断条件 ;更新循环变量){
循环体;
}
应用举例:
package day3;public class Demo6 {
public static void main(String[] args) {
//打印文字从0到9
int i = 0;
for(i = 0; i < 10; i++) {
System.out.println(i);
}
}
}
8、循环嵌套图形打印
主要利用for循环的嵌套执行来进行,需要仔细理解下列结论:
- 外层循环控制行数
- 内层循环控制列数
public class Demo7 {
public static void main(String[] args) {
//循环嵌套
//外层循环控制行数
for(int i = 0;i < 10; i++) {
//内层循环控制列数
for(int j = 0; j < 10; j++) {
System.out.print("* ");
}
System.out.println();
}
}
}
9、break和continue
- break是用于终止本轮所有循环,即不执行本次循环中break后面的语句,直接跳出循环
- continue是用于终止本次循环,即本次循环中continue后面的代码不执行,进行下一次循环的入口判断
public class Demo8 {
/**
* break与continue语句
* break是用于终止本轮所有循环,即不执行本次循环中break后面的语句,直接跳出循环
* continue是用于终止本次循环,即本次循环中continue后面的代码不执行,进行下一次循环的入口判断
*/
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
if(i == 5) {
break;
}
if(i == 3) {
continue;
}
System.out.println(i);
}
}
}
10、如何退出多重循环
利用命名空间的特性对一段循环进行命名后在break时判断退出哪一个空间的循环。
package day3;public class Demo9 {
public static void main(String[] args) {
First:for(int i = 0; i < 10; i++) {
for(int j = 0;j < 10; j++) {
System.out.println("i="+i+", j="+j);
if(i == 5 && j == 5) {
//不加该空间First的话break只会跳出该内层for循环
break First;
}
}
}
}
}
11、图形打印详解
打印直角三角形、等腰三角形、菱形
package day3;public class Demo10 {
public static void main(String[] args) {
//直角三角形
for(int i = 1; i < 6; i++) {
for(int j = 0; j < i;j++) {
System.out.print("* ");
}
System.out.println();
}
//等腰三角形
for(int i = 0; i < 5; i++) {
for(int j = i+1; j < 5;j++) {
System.out.print(" ");
}
for(int j = 0; j < i*2 + 1;j++) {
System.out.print("*");
}
System.out.println();
}
//菱形
int size = 9;
for(int i = 0; i < size/2 + 1; i++) {
for(int j = i+1; j < size/2 + 1;j++) {
System.out.print(" ");
}
for(int j = 0; j < i*2 + 1;j++) {
System.out.print("*");
}
System.out.println();
}
for(int i = size/2 + 1; i < size; i++) {
for (int j = 0; j < i - size / 2; j++) {
System.out.print(" ");
}
for (int j = 0; j < 2 * size - 1 - 2 * i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
12、判断用户输入类型
input的接口进行判断,比如input.hasNextInt()
package day3;import java.util.Scanner;
public class Demo11 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入一个数字:");
if(input.hasNextInt()) {
int num = input.nextInt();
System.out.println("你输入的是:"+num);
} else {
System.out.println("你输入的类型错误");
}
}
}
13、代码练习
1、选择结构训练
1、某市出租车,起步价(2 公里以内)为 8 元,超过 2 公里的按照每公里 4.5 元计算。要求根据路程计算费用。
2、输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被
400 整除。)
3、要求输入月份,判断该月所处的季节并输出季节(假设:12、1、2 月为冬季,依次类推)
4、根据《国家电网销售电价表》,居民生活用电按 3 个梯度收费:月用电量 150 千瓦时及以下部分,
每千瓦时 0.43 元,151—400 千瓦时部分为 0.45 元,401 千瓦时以上部分为 0.52 元,请编写程序,当输入
用户的用电量时,计算出所需付的费用。package day3;
import java.util.Scanner;
public class Homework10101003 {
/**
* switch分支语句练习:
* 1、某市出租车,起步价(2 公里以内)为 8 元,超过 2 公里的按照每公里 4.5 元计算。要求根据路程计
算费用。
2、输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被
400 整除。)
3、要求输入月份,判断该月所处的季节并输出季节(假设:12、1、2 月为冬季,依次类推)
4、根据《国家电网销售电价表》,居民生活用电按 3 个梯度收费:月用电量 150 千瓦时及以下部分,
每千瓦时 0.43 元,151—400 千瓦时部分为 0.45 元,401 千瓦时以上部分为 0.52 元,请编写程序,当输入
用户的用电量时,计算出所需付的费用。
*/
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入打车公里数:");
int distance = input.nextInt();
float money = taximeterSys(distance);
System.out.println("需要打车费用:"+money+"元");
System.out.println("请输入要判断闰年的年份:");
int year = input.nextInt();
System.out.println(year+"是否是闰年:"+isLeapYear(year));
System.out.println("请输入要判断季节的月份:");
int month = input.nextInt();
System.out.println(month+"月是:"+judgeSeason(month));
System.out.println("请输入电量:");
int elec = input.nextInt();
double elec_money = calculationElectricity(elec);
System.out.println("需要电费:"+elec_money+"元");
}
/**
* 某市出租车,起步价(2 公里以内)为 8 元,超过 2 公里的按照每公里 4.5 元计算。要求根据路程计
算费用。
参数:distance:路程
返回值:正确返回需要的费用,错误返回-1
*/
public static float taximeterSys(int distance) {
if(distance >0 && distance <= 2) {
return 8;
} else if(distance > 2) {
int tmp = distance - 2;
return (float) (8 + (tmp * 4.5));
}
return -1;
}
/**
* 输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被
400 整除。)
参数:year:年份
返回值:是闰年返回true,不是返回false
*/
public static boolean isLeapYear(int year) {
if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
return true;
}
return false;
}
/**
* 要求输入月份,判断该月所处的季节并输出季节(假设:12、1、2 月为冬季,依次类推)
* 参数:month:月份
* 返回值:正确返回字符串“春、夏、秋、冬”,错误返回“NULL”
*/
public static String judgeSeason(int month) {
//这里我们使用switch去实现,当然也可以使用if条件判断
switch(month) {
case 3:
case 4:
case 5:
return "春";
case 6:
case 7:
case 8:
return "夏";
case 9:
case 10:
case 11:
return "秋";
case 12:
case 1:
case 2:
return "冬";
}
return "NULL";
}
/**
* 根据《国家电网销售电价表》,居民生活用电按 3 个梯度收费:月用电量 150 千瓦时及以下部分,
每千瓦时 0.43 元,151—400 千瓦时部分为 0.45 元,401 千瓦时以上部分为 0.52 元,请编写程序,当输入
用户的用电量时,计算出所需付的费用。
参数:electricity:电量 千瓦
返回值:正确返回电费,错误返回-1
*/
public static double calculationElectricity(int electricity) {
if(electricity > 0 && electricity <= 150) {
return (0.43 * electricity);
} else if(electricity > 150 && electricity <= 400) {
return (0.43 * 150 + (electricity - 150) * 0.45);
} else if(electricity > 400) {
return (0.43 * 150 + 0.45 * (400 - 150) + (electricity - 400) * 0.52);
}
return -1;
}
}
2、while
人工智能的概念刚兴起时,网上流传了一段价值一个亿的代码,如下图:
运行效果如下图:
package day3;import java.util.Scanner;
public class Homework10101004 {
public static void main(String[] args) {
System.out.println("请开始输入文字进行AI交互,结束输入后按下enter:");
AI();
}
/**
* 简单的问句交互AI程序
*/
public static void AI() {
Scanner scanner = new Scanner(System.in);
String question;
while(true) {
//考虑到字中可能有空格,使用nextLine可能更好一些
question = scanner.nextLine();
//去调字符串中的吗
question = question.replace("吗", "");
//将字符串中的我替换为我也
question = question.replace("我", "我也");
//中文的问号替换中文叹号
question = question.replace("?", "!");
//英文的问号替换英文叹号
question = question.replace("?", "!");
System.out.println(question);
}
}
}
3、计算应缴金额
商场根据会员积分打折:
2000 分以内打 9 折,
4000 分以内打 8 折,
8000 分以内打 7.5 折,
8000 分以上打 7 折,使用 if-else-if 结构,实现手动输入购物金额和积分,
计算出应缴金额
4、计算该年该月天数
一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为
1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平
年的二月只有 28 天,而闰年的二月有 29 天,由用户在控制台输入年份和月份,
程序计算该年该月的天数。
5、图形打印任务
在控制台中,编写三个 Demo,分别输出如下图形:
6、打印九九乘法表 ,效果如图:
7、打印三位数中的所有水仙花数
所谓“水仙花数”即一个整数满足其值等于各个数位的立方和。
如: 153 是一个水仙花数,因为 153= 1³+5³+3³
package day3;import java.util.Scanner;
public class Homework10101005 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//作业1:
System.out.println("请输入积分:");
int integral = scanner.nextInt();
System.out.println("请输入购物金额:");
double money = scanner.nextDouble();
System.out.println("应缴金额:"+countMoney(money, integral));
//作业2:
System.out.println("请输入年份:");
int year = scanner.nextInt();
System.out.println("请输入月份:");
int month = scanner.nextInt();
System.out.println(year+"年"+month+"月"+getMonthNum(year, month)+"天");
//作业3:
printGraph();
//作业4:
printNineNineMutlTable();
//作业5:
printDaffodilsNum();
}
/**
* 计算应缴金额
商场根据会员积分打折:
2000 分以内打 9 折,
4000 分以内打 8 折,
8000 分以内打 7.5 折,
8000 分以上打 7 折,使用 if-else-if 结构,实现手动输入购物金额和积分,
计算出应缴金额
参数:money:钱;
integral:积分
返回值:正确的则返回折扣价,错误则返回-1
*/
public static double countMoney(double money, int integral) {
if(integral >= 0 && integral <= 2000) {
return money * 0.9;
} else if(integral > 2000 && integral <= 4000) {
return money * 0.8;
} else if(integral > 4000 && integral <= 8000) {
return money * 0.75;
} else if(integral > 8000) {
return money * 0.7;
}
return -1;
}
/**
* 输入年份,判断输入的年份是否是闰年。(闰年的条件是能被 4 整除,但不能被 100 整除;或能被
400 整除。)
参数:year:年份
返回值:是闰年返回true,不是返回false
*/
public static boolean isLeapYear(int year) {
if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
return true;
}
return false;
}
/**
* 计算该年该月天数
一年中有 12 个月,而每个月的天数是不一样的。其中大月 31 天,分别为
1,3,5,7,8,10,12 月,小月 30 天,分别 为 4,6,9,11 月。还有二月比较特殊,平
年的二月只有 28 天,而闰年的二月有 29 天,由用户在控制台输入年份和月份,
程序计算该年该月的天数。
参数:year:年份
month:月份
返回值:正确返回对应年份月份的天数,否则返回-1
*/
public static int getMonthNum(int year, int month) {
if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10
|| month == 12) {
return 31;
} else if(month == 4 || month == 6 || month == 9 || month == 11) {
return 30;
} else if(month == 2) {
if(isLeapYear(year))
return 29;
return 28;
}
return -1;
}
/**
* 打印demo中的图形,利用for循环嵌套
*/
public static void printGraph() {
//第一种:五行五列的直接三角形
System.out.println("打印图形1:");
for(int i = 1; i <= 5; i++) {
for(int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
//第二种:把第一种上下颠倒
System.out.println("打印图形2:");
for(int i = 1; i <= 5; i++) {
for(int j = 5; j >= i; j--) {
System.out.print("*");
}
System.out.println();
}
//第三种:打印五行9列的等腰三角形
System.out.println("打印图形3:");
for(int i = 1; i <= 5; i++) {
for(int j = 5; j > i; j--) {
System.out.print(" ");
}
for(int j = 1; j <= 2 * i - 1; j++) {
System.out.print("*");
}
System.out.println();
}
}
/**
* 打印九九乘法表
*/
public static void printNineNineMutlTable() {
System.out.println("打印九九乘法表:");
for(int i = 1; i <= 9; i++) {
for(int j = 1; j <= i; j++) {
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
}
}
/**
* 计算一个数的各位的立方和
* */
public static int addUpTheCubedNum(int num) {
int sum = 0;
int temp = num;
while (temp != 0) {
sum += ((temp % 10)*(temp % 10)*(temp % 10));
temp /= 10;
}
return sum;
}
/**
* 打印三位数中的所有水仙花数
所谓“水仙花数”即一个整数满足其值等于各个数位的立方和。
如: 153 是一个水仙花数,因为 153= 1³+5³+3³
*/
public static void printDaffodilsNum() {
int num = 100;
System.out.println("打印三位数中的水仙花数:");
while(num <= 999) {
if(addUpTheCubedNum(num) == num) {
System.out.print(num+" "+"\t");
}
num++;
}
}
}