Java从入门到实战总结-1.3、Java流程控制


文章目录

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:

Java从入门到实战总结-1.3、Java流程控制_i++

使用nextLine:

Java从入门到实战总结-1.3、Java流程控制_整除_02

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("您的成绩是差!准备补考吧!");
}
}
}

Java从入门到实战总结-1.3、Java流程控制_整除_03

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;
}
}

}

Java从入门到实战总结-1.3、Java流程控制_java_04

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);
}

}

Java从入门到实战总结-1.3、Java流程控制_java_05

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);
}
}
}

Java从入门到实战总结-1.3、Java流程控制_java_06

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);
}
}

}

Java从入门到实战总结-1.3、Java流程控制_整除_07

8、循环嵌套图形打印

主要利用for循环的嵌套执行来进行,需要仔细理解下列结论:

  • 外层循环控制行数
  • 内层循环控制列数
package day3;

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();
}
}
}

Java从入门到实战总结-1.3、Java流程控制_i++_08

9、break和continue

  • break是用于终止本轮所有循环,即不执行本次循环中break后面的语句,直接跳出循环
  • continue是用于终止本次循环,即本次循环中continue后面的代码不执行,进行下一次循环的入口判断
package day3;

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);
}
}

}

Java从入门到实战总结-1.3、Java流程控制_i++_09

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;
}
}
}

}

}

Java从入门到实战总结-1.3、Java流程控制_java_10

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();
}
}

}

Java从入门到实战总结-1.3、Java流程控制_java_11

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("你输入的类型错误");
}
}

}

Java从入门到实战总结-1.3、Java流程控制_java_12

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;
}
}

Java从入门到实战总结-1.3、Java流程控制_i++_13

2、while

人工智能的概念刚兴起时,网上流传了一段价值一个亿的代码,如下图:

Java从入门到实战总结-1.3、Java流程控制_整除_14

运行效果如下图:

Java从入门到实战总结-1.3、Java流程控制_java_15

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);
}

}

}

Java从入门到实战总结-1.3、Java流程控制_i++_16

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,分别输出如下图形:

Java从入门到实战总结-1.3、Java流程控制_整除_17

6、打印九九乘法表 ,效果如图:

Java从入门到实战总结-1.3、Java流程控制_java_18

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++;
}
}
}

Java从入门到实战总结-1.3、Java流程控制_i++_19