Java学习-第一部分-第一阶段-第四节:控制结构

控制结构

笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html)

顺序

程序从上到下逐行地执行,中间没有任何判断和跳转。

顺序控制举例和注意事项

Java中定义成员变量时采用合法的前向引用。如:

public class Test{
​ int num1 = 12;
​ int num2 = num1 + 2;
}
错误形式:
public class Test{
​ int num2 = num1 +2;//错误
​ int num1 = 12;
}

分支(if , else,switch)

单分支

基本语法

if(条件表达式){
执行代码块;(可以有多条语句.)
}

如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。

案例

Scanner myScanner = new Scanner(System.in);
System.out.println("请输入年龄");
//把年龄保存到一个变量int age
int age = myScanner.nextInt();//使用if判断,输出对应信息
if(age > 18){
    System.out.println("你年龄大于18,要对自己的行为负责,送入监狱");
}
System.out.println("程序继续...");

双分支

基本语法

if(条件表达式){
执行代码块1;}
else {
执行代码块2;
}
说明:当条件表达式成立,即执行代码块1,否则执行代码块2.如果执行代码块只有一条语句,则{}可以省略,否则,不能省略
案例演示

Scanner myScanner = new Scanner(System.in);
system.out.println("请输入年龄");
//把年龄保存到一个变量int age
int age = myScanner.nextInt();//使用if-else郸判断,输出对应信息
if(age > 18) {
    System.out.println("你年龄大于18,要对自己的行为负责,送入监狱");
}else {//双分支
    System.aut.println("你的年龄不大这次放过你了");
}
System.out.print1n("程序继续...");

编写一个程序,可以输入人的年龄,如果该同志的年龄大于18岁,则输出"你年龄大于18,要对自己的行为负责,送入监狱"。否则,输出"你的年龄不大这次放过你了."

流程图

image

单分支和双分支练习题

  1. 对下列代码,若有输出,指出输出结果。

    int x = 7;
    int y = 4;
    if (> 5){
        if (y > 5){
            System.out.println(x + y);
        }
            System.out.printIn("韩顺平~");
    }else
        System.out.println("x is " + x);
    //输出的内容是?
    //韩顺平~  
    
  2. 编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和。

    double d1 = 33.5;
    double d2 = 2.6;
    if(d1 > 10.0 && d2 <20.0)i
        System. out.println("两个数和="+(d1 +d2));
    }
    
  3. 【课后自己练】定义两个变量int,判断二者的和,是否能被3又能被5整除,打印提示信息

    int num1 = 10;
    int num2 = 1;
    int sum = num1 + num2;
    if(sum % 3 == 0 && sum % 5 ==0) {
        System.out.println("和可以被3又能被5整除");
    }else{
        System.out.println("和不能被3和5整除..");
    }
    
  4. 判断一个年份是否是闰年,闰年的条件是符合下面二者之一:(1)年份能被4整除,但不能被100整除;(2)能被400整除

    int year = 2020;
    if( (year % 4 == 0 &8 year % 100 !=0)llyear % 400 == 0 ) {
        System.out.println(year +”是闰年");
    }else{
        System.out.println(year + ”不是闰年");
    }
    

多分支

基本语法

if (条件表达式1){
执行代码块1;
}else if(条件表达式2){
执行代码块2;
}
.…….
else{
执行代码块n;
}

特别说明:(1)多分支可以没有else,如果所有的条件表达式都不成立,则一个执行入口都没有(2)如果有else ,如果所有的条件表达式都不成立,则默认执行else代码块。

流程图

image

案例演示1
输入建国同志的芝麻信用分:
如果:
1.信用分为100分时,输出信用极好;
2.信用分为(80,99]时,输出信用优秀;
3.信用分为[60,80]时,输出信用一般;
4.其它情况,输出信用不及格
5.请从键盘输入建国的芝麻信用分,并加以判断

Scanner myScanner = new Scanner(System.in);
//接收用户输入
System.out.println("请输入信用分:");
int grade = myScanner.nextInt();
//因为有4种情况,所以使用多分支
if(grade == 100){
    System.out.println("信用极好");
}else if (grade > 80 && grade <=99){//信用分为(80,99]时,
    System.out.println("信用优秀");
}else if(grade >= 60 && grade <= 80){/ /信用分为[60,80]时,       
    System.out.println("信用一般");
}else{//其它情况,输出信用不及格
    System.out.println("信用不及格");
}

**案例演示2

/代码,看看输出什么?
boolean b = true;
if(b == false) //【
    System.out.println("a");
else if(b)
    System.out.println("b");
else if(!b)
    System.out.println("c");
else
    System.out.println("d");
//b

嵌套分支

基本介绍
在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。老师建议:不要超过3层(可读性不好)
●基本语法
if(){
if(){
//if-else....
​ }else{
​ //if-else
​ }
}

应用案例
参加歌手比赛,如果初赛成绩大于8.0进入决赛,否则提示淘汰。并且根据性别提示进入男子组或女子组。输入成绩和性别,进行判断和输出信息。

Scanner myScanner = new Scanner(System.in);
System.out.print1n("请输入该歌手的成绩");
double score = myScanner.nextDouble();
if(score > 8.0 ){
    System.out.println("请输入性别");
    char gender = myScanner.next( ).charAt(0);
    if( gender =='男’){
        System.out.println("进入男子组");}
    else if(gender == '女'){
        System.out.println("进入女子组");
    }else{
        System.out.println("你的性别有误,不能参加决赛");
    }
}else{
    System.out.println( "sorry ,你被淘汰了~");
}

switch分支结构

基本语法

switch(表达式){
case常量1: //当.…
​ 语句块1;
​ break;
​ case常量2;
​ 语句块2;
​ break;
​ case常量n;
​ 语句块n;
​ break;
​ default:
​ default语句块;
​ break;
}

解读switch
1.switch关键字,表示swtich分支2表达式对应一个值
3.case常量1:当表达式的值等于常量1,就执行语句块1
4.break :表示退出swtich
5.如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2
6.如果一个都没有匹配上,执行default

流程图

image

快速入门

案例:
1.请编写一个程序,该程序可以接收一个字符,比如:a,b,c.d,e,f,g
2.a表示星期一,b表示星期二..
3.根据用户的输入显示相依的信息.要求使用 switch语句完成

Scanner myScanner = new Scanner(System.in);
System.out.println("请输入一个字符(a-g)");
char c1 = myScanner.next().charAt(O); //
//在java中,只要是有值返回,就是一个表达式
switch(c1){
    case 'a' :
        System.out.print1n( "今天星期一,猴子穿新衣");break;
    case 'b' :
        System.out.println("今天星期二,猴子当小二");break;
    case 'c' :
        System.out.print1n("今天星期三,猴子爬雪山..");break;
    //.....
    default:
        System.out.println("你输入的字符不正确,没有匹配的");
}
System.out.println("退出了switch ,继续执行程序");

switch注意事项和细节讨论

  1. 表达式数据类型,应和case后的常量类型一致,或者是可以自动转成可以相互比较的
    类型,比如输入的是字符‘a’,而常量是97,则它们相等。

    char c = '1';
    switch(c){
     case 2 ://c能够实现自动转换再比较
         System.out.println( "ok3");
         break;
     case "1" ://报错
         System.out.println( "ok2");
         break;
    }
    
  2. switch(表达式)中表达式的返回值必须是:(byte,short,int, char,enum[枚举],String)

    double c = 1.1;
    switch(c){//错误
        case 1.1 ://错误
            System.out.println( "ok3");
            break;
        case "1.1" ://错误
            System.out.println( "ok2");
            break;
    }
    
  3. case子句中的值必须是常量(具体的值),而不能是变量(例:int a)

  4. default子句是可选的,当没有匹配的case时,执行default

  5. break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有写break,程序会顺序执行到switch结尾

switch课堂练习
1.使用switch 把小写类型的char型转为大写(键盘输入)。只转换a, b, c, d, e.其它的输出"other"。

Scanner myScanner = new Scanner(System.in);
System.out.println("请输入a-e");
char c1 = myScanner.next().charAt(O); //
//在java中,只要是有值返回,就是一个表达式
switch(c1){
    case 'a' :
        System.out.print1n( "A");break;
    case 'b' :
        System.out.println("B");break;
    case 'c' :
        System.out.print1n("C");break;
    //.....
    default:
        System.out.println("你输入的字符不正确");
}

2.对学生成绩大于60分的,输出"合格"。低于60分的,输出"不合格"。(注:输入的成绩不能大于100),提示成绩/60

double score = 88.5;
switch ((int)(score / 60)) {
    case 0 :
        System.out.println("不合格");
        break ;
    case 1 :
        System.out.println("合格" );
        break ;
    default :
        System.out.println("输入有误" );
}

3.根据用于指定月份,打印该月份所属的季节。3,4,5春季6,7,8夏季9,10,11秋季12, 1,2冬季[,提示使用穿透]

Scanner myScanner = new Scanner(System.in);
System.out.println("输入月份");
int month = myScanner 。nextInt() ;
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("你输入的月份不对(1-12)");
}

●switch和if的比较

  1. 如果判断的具体数值不多,而且符合byte、short 、int、char, enum[枚举],String这6种类型。虽然两个语句都可以使用,建议使用swtich语句。
  2. 其他情况:对区间判断,对结果为boolean类型判断,使用if, if的使用范围更广

循环(for , while , dowhile ,多重循环)

for循环

●基本语法
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(多条语句);
}

流程图

image

➢老韩说明

  1. for关键字,表示循环控制
  2. for有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
  3. 循环操作,这里可以有多条语句,也就是我们要循环执行的代码
  4. 如果循环操作(语句)只有一条语句,可以省略{},建议不要省略

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式

  2. for(;循环判断条件:;)中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。

  3. 循环初始值可以有多条初始化语句,但要求类型-样,并且中间用逗号隔开,循环变量迭代也可以有多 条变量迭代语句,中间用逗号隔开。

  4. 用内存分析法,分析输出下面代码输出什么?

    int count = 3;
    for (inti = 0,j= 0; i < count; i++,j +=2) {
        System.out.println("i="+ i +”j="+ j);
    }
    /*
    0 0
    1 2
    2 4
    */
    

    ●for循环练习题

    1. 打印1 ~100之间所有是9的倍数的整数,统计个数及总和。

      int count = 0; //统计9的倍数个数变量
      int sum = 0; //总和
      int start = 1;
      int end = 100;
      for(int i= start; i : <=' end; i++){
          if(i%9==0){
              System . out . println("i=",+i);
              count++;
              sum += i;//累积
          }
      }
      System.out.println("count=" + count);
      System。out。println("Sum="+ sum);
      
    2. 完成下面的表达式输出

      0+5=5
      1+4=5
      2+3=5
      3+2=5
      4+1=5
      5+0=5

      int n=5;
      for(inti=0;i<=n;i++){
          System.out.println(i +"+"+ (n-i) + '='+n);
      }
      

while循环控制

●基本语法

循环变量初始化;
white(循环条件){
循环体(语句);
​ 循环变量迭代;
}

说明

  1. while循环也有四要素
  2. 只是四要素放的位置和for不一样.

●流程图

image

案例

int i = 1;!/循环变量初始化
while( i <=10 ) {//循环条件
    System.out.println("你好,韩顺平教育"+ i);//执行语句
    i++;//循环变量迭代
}
System.out.print1n("退出while ,继续..");

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式
  2. while循环是先判断再执行语句

课堂练习题

  1. 打印1—100之间所有能被3整除的数[使用while]

  2. 打印40—200之间所有的偶数[使用while]

答案:略

do..while循环控制

基本语法

循环变量初始化;
do{
循环体(语句);
循环变量迭代;
}while(循环条件);

说明:

  1. do while是关键字
  2. 也有循环四要素,只是位置不一样
  3. 先执行,再判断,也就是说,一定会执行一次3.最后有一个分号;
  4. while和do..while区别举例:要账

流程图

image

例:

//输出10句你好,韩顺平教育
int i =;//循环变量初始化
do{
    //循环执行语句
    System.out.println("你好,韩顺平教育”+ i);
    //循环变量迭代
    i++;
}while(i <= 10);

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式

  2. do..while循环是先执行,再判断,因此它至少执行一次

多重循环控制(难点!重点!)

介绍

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do...while均可
    以作为外层循环和内层循环。【建议一般使用两层,最多不要超过3层,否则,代码的可读性很差】

  2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,坷结束外层的当次循环,开始下一次的循环[听不懂,走案例]。

  3. 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行m*n次。

例:

for( int i=1; i<= 7; i++){
    for( int j =1;j<= 2; j++){
        System.out.println("ok~~");//7*2=14
}

应用实例:

  1. 统计3个班成绩情况,每个班有5名同学,求出各个班的平均分和所有班级
    的平均分[学生的成绩从键盘输入]。

  2. 统计三个班及格人数,每个班有5名同学。

    //1.2.
    scanner myScanner = new Scanner(System.in);
    int passNum = ;//累积及格人数
    double totalscore = 0;//累积所有学生的成绩
    for( int i = 1; i <= 3; i++){//i表示班级
        double sum = 0;//一个班级的总分
        for( int j = 1; j <= 5; j++){//j表示学生
            System.out.println("请数第"+i+"个班的第"+j+"个学生的成绩");
            double score = myScanner.nextDouble();
            if(score >= 60){
                passNum++;
            }
            sum += score;//累积
            System.out.print1n("成绩为"+ score);
        }
        //因为sum是5个学生的总成绩
        System.out.println( "sum=" + sum + ”平均分=" + (sum / 5));
        //把sum累积到totalScore
        totalscore += sum;
    }
    System.out.println("三个班总分="+ totalScore+"平均分="+ totalScore /15);
    System.out.println("及格人数=”+ passNum);
    
  3. 打印出九九乘法表

    答案:略

●经典的打印金字塔
使用for循环完成下面的案例
请编写一个程序,可以接收一个整数,表示层数(totalLevel),打印出金字塔。[化繁为简,先死后活]

image

//1
public class HelloWorld {
    public static void main(String []args) {
       for(int i=1;i<=5;i++){
		   for(int j=1;j<=i;j++){
			   System.out.print('*');
		   }
		   System.out.print("\n");
	   }
    }
}
//2
public class HelloWorld {
    public static void main(String []args) {
       for(int i=1;i<=5;i++){
		   for(int j=1;j<=5-i;j++){
			   System.out.print(' ');
		   }
		   for(int j=1;j<=i*2-1;j++){
			   System.out.print('*');
		   }
		   System.out.print("\n");
	   }
    }
}
//3
public class HelloWorld {
    public static void main(String []args) {
       for(int i=1;i<=5;i++){
		   for(int j=1;j<=5-i;j++){
			   System.out.print(' ');
		   }
		   for(int j=1;j<=i*2-1;j++){
			   if((j==1||j==i*2-1)||i==5){
				   System.out.print('*');
			   }else{
				   System.out.print(' ');
			   }
		   }
		   System.out.print("\n");
	   }
    }
}

break

看下面一个需求
随机生成1-100的一个数,直到生成了97这个数,看看你一共用了几次?

提示使用(int)(Math.random() *100)+1 (注意:0.0<=Math.random()<1.0)
思路分析:

循环,但是循环的次数不知道.-> break ,当某个条件满足时,终止循环通过该需求可以说明其它流程控制的必要性,比如break

基本介绍:
break语句用于终止某个语句块的执行,一般使用在switch或者循环[for , while , do-while]中

基本语法:
{......
break;
......
}

以while使用break为例,画出示意图

image

注意事项和细节说明:

  1. break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块

  2. 标签的基本使用
    label1:{ ………
    label2: {……
    label3: { ......
    ​ break label2;
    ​ ......
    ​ }
    ​ }
    ​ }

    (1)break语句可以指定退出哪层(2)label1是标签,由程序员指定。
    (3)break后指定到哪个label就退出到哪里
    (4)在实际的开发中,尽量不要使用标签.(因为可读性差)
    (5)如果没有指定break,默认退出最近的循环体

课堂练习题:

  1. 1-100以内的数求和,求出当和第一次大于20的当前数【for + break】

    int sum = 0;//累积和
    //注意i的作用范围在for{}
    int n = 0;
    for(int i = 1; i <= 100; i++){
        sum += i;//l累积
        if(sum > 20){
            System.out.println("和>20时候当前数i=" + i);
            break;
        }
        System.out.println("当前数=" +n);
    }
    
  2. 实现登录验证,有3次机会,如果用户名为"丁真”,密码"666"提示登录成功,否则提示还有几次机会,请使用for+ break完成

    scanner myScanner = new Scanner(System.in);
    String name = "";
    String passwd = "";
    int chance = 3;//登录一次,就减少一次
    for( int i = 1; i <= 3; i++){
        System.out.print1n("请输入名字");
        name = myScanner.next();
        System.out.println("请输入密码");
        passwd = myScanner.next();
        //比较输入的名字和密码是否正确
        //补充说明字符串的内容比较使用的方法equals
        if("丁真".equals(name)&&"666".equals(passwd)) {
            System.out.println(“恭喜你,登录成功~“);break;
        }
        //登录的机会就减少一次
        chance--;
        System.out.print1n("你还有"+chance+"次登录机会");
    }
    

continue

基本介绍:

  1. continue语句用于结束本次循环,继续执行下一次循环。
  2. continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环,这个和前面的标签的使用的规则一样.

基本语法:

{ ......
​ continue;
​ ......
}

以while使用continue为例,画出示意图

image

快速入门案例

int i=1;
while (i <=4){
    i++;
    if (i == 2){
        continue;
    }
    System.out.println( "i=" + i);
}

细节案例分析和说明:

label1:
for(int j = 0; j< 4; j++){
    label2:
    for(int i = 0; i< 10; i++){
        if(i == 2){
            //看看分别输出什么值,并分析
            //continue ;
            //continue label2;
            continue label1;
        }
        System.out.println("i = " + i);
    }
}

return

介绍
return使用在方法,表示跳出所在的方法,在讲解方法的时候,会详细的介绍,这里我们简单的提一下。注意:如果return写在main方法,退出程序..

for(int i=1;i<=5;i++){
    if(==3) {
        System.out.println("韩顺平教育“+i);
        return;
        //continue;
        break;
    }
    System.out.println("Hello World!");
}
System.out.println("go on..");

本章练习

  1. 编程实现如下功能
    某人有100,000元,每经过一次路口,需要交费,规则如下:
    1)当现金>50000时,每次交5%
    2)当现金<=50000时,每次交1000
    编程计算该人可以经过多少次路口,要求:使用while break方式完成

    double money=100000;
    int count=0;
    while(true){
        if (money>50000){
            money=money-money*0.05;
            count++;
        }else if(money>=1000){
            money-=1000;
            count++;
        }else{
            System.out.println(count);
            break;
        }
    }
    
  2. 实现判断一个整数,属于哪个范围:大于0;小于0;等于0

    答案:略

  3. 判断一个年份是否为闰年

    答案:略

  4. 判断一个整数是否是水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如:153 = 1*1*1 +3*3*3 + 5*5*5

    //输出所有水仙花数
    for(int i=100;i<1000;i++){
        int n1=i/100;//百位
        int n2=i%100/10;//十位
        int n3=i%10;//个位
        if(n1*n1*n1+n2*n2*n2+n3*n3*n3==i)
        {
            System.out.println(i);
        }
    }
    
  5. 看看下面代码输出什么?

    class Demo{
        public static void main(String[] args){
            int m=0,n=3;
            if(m>0){
                if(n>2)
                    System.out.println("OK1");
                else
                    System.out.println("OK2");
            }
        }
    }
    

​ //没有输出

  1. 输出1-100之间的不能被5整除的数,每5个一行

    int count = 0;//统计输出的个数
    for(int i = 1; i <= 100; i++){
        if(i % 5 !=O){
            count++;
            System.out.print( i + " ");
            //判断,每满5个,就输出一个换行..
            if( count 5 ==) {
                System.out.println();
            }
        }
    }
    
  2. 输出小写的a-z以及大写的Z-A

    for(char c1 = 'a'; c1<= 'z'; c1++) {
        System.out.print(c1 +" ");
    }
    System.out.println( "============" );//灵活的使用,编程..
    for(char c1 = 'z'; c1 >= 'A'; c1--) {
        System.out.print(c1 +" ");
    }
    
  3. 求出1-1/2+1/3-1/4.....1/100的和

    double sum = 0;
    for(int i = 1; i <= 10日; i++){
        //判断是奇数还是偶数,然后做不同的处理
        if( i %2 !=0){//分母为奇数
            sum += 1.0/i;
        }else{//分母我偶数
            sum -= 1.0/i;
        }
    }
    System.out.print1n( "sum=" + sum);
    
  4. 求1+(1+2) +(1+2+3)+(1+2+3+4) +....+(1+2+3+..+100)的结果

    int sum = 0;
    for(int i = 1; i <= 100; i++) {
        for(int j = 1;j <= i; j++){//内层对1-i进行循环
            sum += j;
        }
    }
    System.out.println("sum=" + sum);
    
posted @ 2022-06-21 16:55  文杰2000  阅读(221)  评论(0编辑  收藏  举报