流程控制语句
流程控制语句是什么呢?
流程控制语句:在一个程序执行过程中,各条语句的执行顺序对程序的运行结果是有影响的,也就是说程序的流程对运行结果是由直接影响的,因此有必要知道每条语句的执行流程,而且正常情况下需要通过控制流程语句来实现要完成的功能。
流程控制语句的分类
1、顺序结构:从上到下依次执行
2、分支结构:多个分支选择其中一个分支执行
3、循环结构:重复执行某些代码
顺序结构是程序中最基本的流程控制,美哟特定的语法结构,按照代码的先后顺序依次执行,程序中的大多数代码都是按照顺序结构执行的。可以说成是写在前面的程序先执行,后面的程序后执行。
接下来我们介绍较为重要的选择语句:
选择结构:
也叫分支结构。 根据条件的不同,有选择的执行某一片代码 ,Java提供了两种
- if 结构
- switch 结构
if分为三种格式:
1、单分支结构
语法格式:
if(条件表达式){
当条件表达式成立时需要执行的语句块;
}
执行过程:
条件成立,就执行{}其中的语句块,不成立就不执行。
注意:
(1)if(条件表达式)中的条件表达式的结果必须是boolean类型
(2)当{}中的语句只有一个语句(简单的语句,也可以是一个复合语句)时,可以省略{}
示例代码:
int year = 2020;
int day = 26;
if(year%4==0 && year%100!=0 || year%400==0){
day = 29;
}
2、双分支结构
语法格式:
if(条件表达式){
当条件表达式成立(true)时需要执行的语句块1;
}else{
当条件表达式不成立(false)时需要执行的语句块2;
}
执行过程:
当条件表达式成立(true)时执行语句块1,否则执行语句块2
注意的是else后面没有表达式,只有if后面有。
示例代码:
int num = 15;
if(num%2==0){
System.out.println(num + "是偶数");
}else{
System.out.println(num + "是奇数");
}
3、多分支结构
语法格式:
if(条件表达式1){
当条件表达式1成立的时候,
执行的语句块1;
}else if(条件表达式2){
当条件表达式1不成立,条件表达式2成立的时候,
执行的语句块2;
}else if(条件表达式3){
当条件表达式1不成立,条件表达式2也不成立,条件表达式3成立的时候,
执行的语句块3;
}else{
当以上所有的条件表达式都不成立,
需要执行的语句块n+1;
}
执行过程:
(1)多个条件顺序往下判断,如果上面有一个条件成立了,下面的条件就不看了
(2)多个分支也只会执行其中的一个
注意:当多个条件是“互斥”关系(没有重叠部分),顺序可以随意;当多个条件是“包含”关系(有重叠部分),顺序不能随意,小的在上,大的在下面。
示例代码:
int score = 88;
if(score==100){
System.out.println("满分");
}else if(score>=80){
System.out.println("优秀");
}else if(score>=60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
4、嵌套
执行过程:
当嵌套在if中,就是当外面的if成立时,才会看里面的条件判断;
当嵌套在else中,就当外面的else满足时,才会看里面的条件判断;
而switch结构为:
语法格式:
switch(表达式){
case 常量值1:
语句块1;
break;
case 常量值2:
语句块2;
break;
.........
default:
语句块n+1;
break;
}
执行过程:
(1)入口
①当switch(表达式)的值与case后面的某个常量值匹配,就从这个case进入;
②当switch(表达式)的值与case后面的所有常量值都不匹配,寻找default分支进入;
(2)一旦从“入口”进入switch,就会顺序往下执行,直到遇到“出口”
(3)出口
①自然出口:遇到了switch的结束}
②中断出口:遇到了break等
注意:
(1)switch(表达式)的值的类型,只能是:4种基本数据类型,两种引用数据类型。
(2)case后面必须是常量值,而且不能重复。
循环结构
循环结构的分类:
- for循环
- while循环
for循环
语法格式:
for(初始化表达式语句;判断条件语句;控制条件语句){
循环体语句;
}
执行流程:
- 执行初始化表达式语句
- 执行判断条件语句
如果是true,就继续执行
如果是false,就结束循环- 执行循环体语句
- 执行控制条件语句
- 回到2继续实行
注意:
(1)for(;;)中的两个;不能多也不能少。
(2)循环条件必须是boolean类型。
示例代码:
for(int i=1; i<=100; i++){//每次循环的步幅是1
if(i%2==0){
System.out.println(i);
}
}
while循环
语法格式:
while(true){
循环体语句块;
if(条件表达式){
break;
}
}
执行过程:
(1)先判断循环条件
(2)如果循环条件成立,就执行循环体语句块;然后回到(1)
(3)如果循环条件不成立,就结束while循环;
如果在循环体语句块中,遇到break,也会结束while循环;
注意:(1)while(循环条件)中循环条件必须是boolean类型。
示例代码:
int num = 2;
while(num<=100){
System.out.println(num);
num+=2;
}
循环结构的四要素
(1)循环变量的初始化表达式
(2)循环条件
(3)循环变量的修改的迭代表达式
(4)循环体语句块
for和while的小区别
使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
循环使用推荐for -- while
for ,while循环必须先判断条件是否成立,然后再决定是都执行循环体语句
习题实战
1、
/*
数据:a b c delt r1 r2
步骤:
1.提示用户输入abc三个参数
2.计算delt=b*b-4*a*c
3.判断delt的值
3.1 delt>0
输出两个解
3.2 delt==0
输出一个解
3.3 delt<0
无实数解
*/
import java.util.Scanner;
class Demo03_01{
public static void main(String[] args){
//1.提示用户输入abc三个参数
Scanner scanner=new Scanner(System.in);
System.out.print("请输入a,b,c:");
double a=scanner.nextDouble();
double b=scanner.nextDouble();
double c=scanner.nextDouble();
//2.计算delt=b*b-4*a*c
double delt=b*b-4*a*c;
//3.判断delt的值
if(delt>0){
double r1=(-b+Math.sqrt(delt))/(2*a);
double r2=(-b-Math.sqrt(delt))/(2*a);
System.out.printf("r1=%.2f,r2=%.2f",r1,r2);
}else if(delt==0){
double r=(-b-Math.sqrt(delt))/(2*a);
System.out.printf("r=%.2f",r);
}else{
System.out.println("无实数解!");
}
}
}
2、
/*
数据:a b c d e f
步骤:
1.输入数值
2.判断k的值
3.计算x y
*/
import java.util.Scanner;
public class Demo03_02 {
public static void main(String [] args) {
//1.输入数值
Scanner input = new Scanner(System.in);
System.out.print("请输入a、b、c、d、e、f的值:");
double a = input.nextDouble();
double b = input.nextDouble();
double c = input.nextDouble();
double d = input.nextDouble();
double e = input.nextDouble();
double f = input.nextDouble();
//2.判断k的值
double k = a * d - b * c ;
if(k == 0)
System.out.println("无结果 ");
else {
//3.计算x y
double x = (e * d - b * f)/(a * d - b * c);
double y = (a * f - e* c)/(a * d - b * c);
System.out.println("x的值:" + x +"y的值:" + y);
}
}
}
3、
/*
数据:今天的周几 未来的天数 未来的周几
(0+12)%7=5
(4+4)%7=1
(今天的周几+未来的天数)%7=未来的周几
1月1日是周一 1%7=1
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20
1月20日 20%7=6
步骤:
1.输入今天是周几
2.输入未来的几天
3.打印未来的几天是周几
*/
import java.util.Scanner;
class Demo03_03{
public static void main(String[] args){
//1.输入今天是周几
Scanner scanner=new Scanner(System.in);
System.out.print("今天是周几:");
int today=scanner.nextInt();
//2.输入未来的几天
System.out.print("未来的几天:");
int future=scanner.nextInt();
//3.打印未来的几天是周几
int futureDay=(today+future)%7;
String todayStr="";
String futureDayStr="";
if(today==0){
todayStr="周日";
}else if(today==1){
todayStr="周一";
}else if(today==2){
todayStr="周二";
}else if(today==3){
todayStr="周三";
}else if(today==4){
todayStr="周四";
}else if(today==5){
to
4、
/*
数据:num
步骤:
1.输入一个数字
2.拼接出该数字的反序
3.输出
12345
12345%10=5 12345/10=1234
1234%10=4 1234/10=123
123%10=3 123/10=12
12%10=2 12/10=1
1%10=1 1/10=0
54321
5*10000+4*1000+3*100+2*10+1
(5*1000+4*100+3*10+2)*10+1
((5*100+4*10+3)*10+2)*10+1
(((5*10+4)*10+3)*10+2)*10+1
((((0*10+5)*10+4)*10+3)*10+2)*10+1
sum=0
sum=sum*10+5; //5
sum=sum*10+4; //54
sum=sum*10+3; //543
sum=sum*10+2; //5432
sum=sum*10+1; //54321
*/
import java.util.Scanner;
class Demo03_04{
public static void main(String[] args){
//1.输入一个数字
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
int temp=num;
//2.拼接出该数字的反序
int sum=0;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
sum=sum*10+num%10;
num/=10;
if(sum==temp){
5、
/*
数据:电脑随机产生的一个数字com 用户输入的一个数字usr
步骤:
1.提示用户输入一个两位数字
2.计算机随机产生一个两位数字
3.将每个数字拆开,分别进行对比,分输赢
a=usr%10; b=usr/10; c=com%10; d=com/10
*/
import java.util.*;
class Demo03_05{
public static void main(String[] args){
//1.提示用户输入一个两位数字
Scanner scanner=new Scanner(System.in);
System.out.print("请输入 一个数:");
int usr=scanner.nextInt();
//2.计算机随机产生一个两位数字
Random random=new Random();
int com = random.nextInt(99);
String.format("%02d",usr);
int m = usr;
int n = com;
//3.将每个数字拆开,分别进行对比,分输赢
int a=m%10;
int b=m/10;
int c=n%10;
int d=n/10;
if(usr == com){
System.out.println("奖金10000美元");
}else if(a==d&&b==c){
System.out.println("奖金300美元");
}else
if(a==c||a==d||b==c||b==d){
System.out.println("奖金1000美元");
}else{
System.out.println("没有获奖");
}
}
}
6、
/*
数据:电脑随机产生的一个数字com 用户输入的一个数字usr
0 1 2
剪刀 石头 布
步骤:
1.提示用户输入一个数字
2.计算机随机产生一个数字
3.将两个数字进行对比,分输赢
平局 com==usr
用户赢 usr=0 com=2 | usr=1 com=0 | usr=2 com=1
用户输 剩下的都是用户输
随机数
Math.random() [0,1.0)*3 -> [0,3.0)->(int)[0,3.0)
Random nextInt(n)
*/
import java.util.*;
class Demo03_06{
public static void main(String[] args){
//1.提示用户输入一个数字
Scanner scanner=new Scanner(System.in);
System.out.print("请输入 剪刀0 石头1 布2:");
int usr=scanner.nextInt();
//2.计算机随机产生一个数字
Random random=new Random();
int com=random.nextInt(3);
String usrStr="";
String comStr="";
switch(usr){
case 0: //if usr==0
usrStr="剪刀";
break;
case 1:// if usr==1
usrStr="石头";
break;
case 2:// if usr==2
usrStr="布";
break;
}
switch(com){
case 0:
comStr="剪刀"
7、
/*
数据:星期几 h 某月的第几天 q 月份m 世纪数 j 该世纪第几年k 年份year
步骤:
1.提示用户输入年份,月份,日期
2.若月份为1月2月则m=13 14 year=year-1
3.计算星期hj
*/
import java.util.Scanner;
class Demo03_07{
public static void main(String[] args){
//1.提示用户输入年份,月份,日期
Scanner scanner=new Scanner(System.in);
System.out.print("请输入年份:");
int year = scanner.nextInt();
System.out.print("请输入月份1-12:");
int m = scanner.nextInt();
System.out.print("请输入日期1-31:");
int q = scanner.nextInt();
//2.若月份为1月2月则m=13 14 year=year-1
if(m == 1 || m == 2){
year = year - 1;
m = m + 12;
}
//3.计算星期hj
int h =(day+26*(month+1)/10+year%100+year%100/4+year/100/4+5*year/100)%7;
String hStr="";
switch(h){
case 0:
System.out.println("今天是星期日");
break;
case 1:
System.out.println("今天是星期一");
break;
case 2:
System.out.p
8、
/*
数据:圆的圆心 圆的半径 点的坐标 距离
步骤:
1.提示用户输入点的坐标
2.计算点到圆心之间的距离
3.判断距离和半径之间的关系
距离>半径 点在圆外
距离==半径 点在圆上
距离<半径 点在圆内
*/
import java.util.Scanner;
class Demo03_08{
public static void main(String[] args){
//1.提示用户输入点的坐标
Scanner scanner=new Scanner(System.in);
System.out.print("请输入坐标点:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
//2.计算点到圆心之间的距离
double xo=0;
double yo=0;
double radius=10;
double distance=Math.sqrt(Math.pow(x-xo,2)+Math.pow(y-yo,2));
//3.判断距离和半径之间的关系
if(distance>radius){
System.out.println("点在圆外");
}else if(distance==radius){
System.out.println("点在圆上");
}else{
System.out.println("点在圆内");
}
}
}
9、
/*
数据:三角形的三个顶点的坐标
步骤:
1.提示用户输入一个点的坐标
2.先大致判断一下坐标的范围
3.再精确的判断坐标的范围
*/
import java.util.Scanner;
class Demo03_09{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.提示用户输入一个点的坐标
System.out.print("请输入一个坐标:");
double x=scanner.nextDouble();
double y=scanner.nextDouble();
//2.先大致判断一下坐标的范围
//3.再精确的判断坐标的范围
if(x>=0&&x<=200&&y<=-0.5*x+100){
System.out.println("点再三角形内");
}else{
System.out.println("点再三角形外");
}
}
}
10、
/*
数据:大矩形的中点坐标、宽、高;小矩形的宽、高、中点坐标
步骤:
1.先输入大矩形的中心,宽和高
2.再输入小矩形的中心,宽和高
3.找小矩形在大矩形中极限
4.找小矩形与大矩形重叠的极限
*/
import java.util.Scanner;
class Demo03_10{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.先输入大矩形的中心,宽和高
System.out.print("请输入第1个矩形的信息:");
double x1=scanner.nextDouble();
double y1=scanner.nextDouble();
double w1=scanner.nextDouble();
double h1=scanner.nextDouble();
//2.再输入小矩形的中心,宽和高
System.out.print("请输入第2个矩形的信息:");
double x2=scanner.nextDouble();
double y2=scanner.nextDouble();
double w2=scanner.nextDouble();
double h2=scanner.nextDouble();
//3.找小矩形在大矩形中极限
double inXMin=x1-(w1-w2)/2;
double inXMax=x1+(w1-w2)/2;
double inYMin=y1-(h1-h2)/2;
double inYMax=y1+(h1-h2)/2;
//4.找小矩形与大矩形重叠的极限
double outXMin=x1-(w1+w2)/2;
double outXMax=x1+(w1+w2)/2;
double outYMin=y1-(h1+h2)/2;
11、
/*
数据:输入de数字
1.输入一个数字
2.再判断数字是否为0如果为0则退出不是则继续
3.计算总和,正的数的个数,负的数个数,平均值
*/
import java.util.Scanner;
class Demo03_11{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
double sum=0; //总和
int positives=0; //正数的个数
int negatives=0; //负数的个数
//1.输入一个数字
System.out.print("请输入若干数字:");
while(true){ //不管三七二十一 先进来再说
int num=scanner.nextInt();
//2.再判断数字是否为0如果为0则退出不是则继续
if(num!=0){
sum+=num;
if(num>0){
positives++;
}else{
negatives++;
}
}else{
break; //跳出当前循环
}
}
//3.
if(positives+negatives==0){
System.out.println("没有其他数字的输入,除了0");
}else{
System.out.println("正数的个数"+positives);
System.out.println("负数的个数"+negatives);
System.out.println("总和"+sum)
12、
/*
数据:n1 n2 gcd
步骤:
1.输入两个数字
2.检查是否为公约数
3.输出最大公约数gcd
*/
import java.util.Scanner;
class Demo03_12{
/*
21 42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16~21
3 7
*/
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
//1.输入两个数字
System.out.print("请输入两个数字:");
int n1=scanner.nextInt();
int n2=scanner.nextInt();
//2.检查是否为公约数
int gcd=1;
for(int i=n1<n2?n1:n2;i>=1;i--){
if(n1%i==0&&n2%i==0){
gcd=i;
break;
}
}
//3.输出最大公约数
System.out.println(gcd);
}
}
13、
/*
120 2~120 ->2
60 2~60 ->2
30 2~30 ->2
15 2~15 ->3
5 2~5 ->5
1
*/
import java.util.Scanner;
class Demo03_13{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=scanner.nextInt();
while(true){
for(int i=2;i<=num;i++){
if(num%i==0){
System.out.print(i+" ");
num=num/i;
break;
}
}
if(num==1){
break;
}
}
}
}
14、
/*
数据:给出的数字模型
1.for循环每个的行数
2.for循环没行的空隔
3.for循环每行的列数
分析
4 3 2 1 2 3 4
-3 -2 -2 0 1 2 3
第4行 x∈[-3,3] y=|x|+1
第5行 x∈[-4,4] y=|x|+1
*/
import java.util.Scanner;
class Demo03_14{
public static void main(String[] args){
Scanner scanner=new Scanner(System.in);
System.out.print("请输入行数:");
int line=scanner.nextInt();
for(int i=1;i<=line;i++){ //行数
for(int k=1;k<=(line-i);k++){ //空格
System.out.print(" ");
}
for(int x=-(i-1);x<=i-1;x++){ //列
if(line<10){
System.out.printf("%-2d",Math.abs(x)+1);
}else{
System.out.printf("%-3d",Math.abs(x)+1);
}
}
System.out.println();
}
}
}
15、
/*
数据:给出的数字模型
步骤:
1.for循环每个的行数
2.for循环每行的列数
*/
class Demo03_15{
public static void main(String[] args){
//第一个
for(int i=1;i<=6;i++){ //行数
for(int j=1;j<=i;j++){ //列
System.out.print(j+" ");
}
System.out.println();//换行
}
//第二个
System.out.println("==========");
for(int i=1;i<=6;i++){ //行数
for(int j=1;j<=7-i;j++){ //列
System.out.print(j+" "); //输出数字
}
System.out.println(); //换行
}
//第三个
System.out.println("==========");
for(int i=1;i<=6;i++){ //行数
for(int k=1;k<=6-i;k++){ //空格数
System.out.print(" ");
}
for(int j=i;j>=1;j--){
System.out.print(j+" "); //输出数
}
System.out.println();///换行
}
//第四个
System.out.println("==========");
fo
16、
/*
数据:数据:给出的数字模型
1.for循环每个的行数
2.for循环没行的空隔
3.for循环每行的列数
分析:
第4行
1 2 4 8 4 2 1
0 1 2 3 2 1 0
x -3 -2 -1 0 1 2 3
第5行
1 2 4 8 16 8 4 2 1
0 1 2 3 4 3 2 1 0
x -4-3-2-1 0 1 2 3 4
*/
class Demo03_16{
public static void main(String[] args){
for(int i=1;i<=8;i++){
for(int k=1;k<=8-i;k++){
System.out.print(" ");
}
for(int x=-(i-1);x<=i-1;x++){
System.out.printf("%4d",(int)Math.pow(2,i-1-Math.abs(x)));
}
System.out.println();
}
}
}
/*
提示:
对于打印一些对称性的三角形图案或者是类似的问题
尽量向绝对值考虑
*/