java 程序逻辑控制+猜数字游戏+程序调试【详解篇4】

【前言】:本篇主要以代码举例的形式来讲解顺序结构、分支结构、循环结构以及输入输出的方式,最后写了一个猜数字游戏,并用画图的方式简单说了一下idea的调试方式,旁观者清,如发现有错误,请及时评论或私信指正,欢迎来访!!!

顺序结构

按照代码书写的执行顺序一行一行的执行

如:

System.out.println("aaa");
System.out.println("bbb");
System.out.println("ccc");
// 运行结果
aaa
bbb
ccc

如果调整代码的书写顺序, 则执行顺序也发生变化

System.out.println("aaa");
System.out.println("ccc");
System.out.println("bbb");
// 运行结果
aaa
ccc
bbb

分支结构

if 语句

基本语法形式1:单分支

if(布尔表达式){
    //条件满足时执行代码
}

代码示例:

public static void main(String[] args) {
        int a = 10;
        if (a == 10) {
            System.out.println(a);
        }
}

基本语法形式2:双分支

if(布尔表达式){
    //条件满足时执行代码
}else{
    //条件不满足时执行代码
}
代码示例1:判断一个数是奇数还是偶数
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);//System.in:从键盘获取数据
        int a = scanner.nextInt();//输入一个整数
        System.out.println(a);//将你输入的整数输出
        if (a % 2 == 0) {
            System.out.println("a是偶数");
        } else {
            System.out.println("a是奇数");
        }
    }

1).Scanner scanner = new Scanner();输入一个整数的固定写法,使用Scanner需要导包(import java.util.Scanner),他这个包一般都会自动导入,这个包类似于C语言的include
2).scanner:是我们自己设置的变量
3)System.in:从键盘获取数据
4)不知道Scanner在哪个包底下怎么办?查帮助手册
image-20210808172405834

代码示例2:判段某一年份是否是闰年
public static void main4(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int year = scanner.nextInt();//输入一个整数
        if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
            System.out.println("这一年是闰年");
        } else {
            System.out.println("这一年不是闰年");
        }
    }

闰年

普通闰年:公历年份是4的倍数的,且不是100的倍数(year % 4 == 0 && year % 100 != 0 ),为普通闰年(如2004年、2020年就是闰年)。

世纪闰年:公历年份是整百数的,必须是400的倍数(year % 400 == 0)才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)。

基本语法形式3:多分支

if(布尔表达式){
    //条件满足时执行代码
}else if(布尔表达式){
    //条件满足时执行代码
}else{
    //条件都不满足时执行代码
}
代码示例3:判断一个数字是正数还是负数
 public static void main3(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();//输入一个整数
        if (num > 0) {
            System.out.println("num为正数");
        } else if (num < 0) {
            System.out.println("num为负数");
        } else {
            System.out.println("num既不是正数也不是负数");
        }
    }

注意事项: 悬垂 else 问题

public static void main5(String[] args) {
        //if...else语句不加大括号只能写一条语句,建议加上大括号
        int x = 10;
        int y = 10;
        if (x == 10)
            if (y == 10)
                System.out.println("aaa");
        else
                System.out.println("ccc");
    }

运行结果:image-20210808173652954

1)结论:else只会和与它最接近的if匹配
2)为避免悬垂 else 问题出现:建议加上大括号,if…else语句不加大括号只能写一条语句。
3)注意:java代码风格是将左大括号与if/else 放在同一行

switch语句

基本语法

switch(整数|枚举|字符|字符串){
 case 内容1 : {
 内容满足时执行语句;
 [break;]
 }
 case 内容2 : {
 内容满足时执行语句;
 [break;]
 }
 ...
 default:{
 内容都不满足时执行语句;
 [break;]
 } 
}

代码示例:

 public static void main6(String[] args) {
        // int a=1;
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        switch (a) {//a是switch的参数,类型是int
            case 1:
                System.out.println(1);
                break;
            case 2:
                System.out.println(2);
                break;
            default:
                System.out.println("输入有误");
                break;
        }
    }
代码示例4: 根据 day 的值输出星期
public static void main6(String[] args) {
int day = 1;
switch(day) {
    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 中值的不同, 会执行对应的 case 语句. 遇到 break 就会结束该 case 语句.

如果 switch 中的值没有匹配的 case, 就会执行 default 中的语句,建议一个 switch 语句最好都要带上 default.

注意事项

1)在Java语言当中不能做switch的参数的数据类型有哪些?
long、float、double、boolean
2)不写 break 的时候, case 语句会依次向下执行, 从而失去了多分支的效果.
3)switch中的值只能是整数、枚举、字符、字符串
switch 不能表达复杂的条件如:(num > 10 && num < 20)

循环结构

while循环

基本语法格式:

while(循环条件){ 
循环语句; 
}
循环条件为true,则执行循环语句,否则结束循环
代码示例5:打印1~9的数字
 public static void main(String[] args) {
        int num = 1;
        while (num != 10) {
            System.out.println(num);
            num++;
        }
    }
代码示例6:计算1~100的和
 public static void main10(String[] args) {
        int i = 1;
        int sum = 0;
        while (i <= 100) {
            sum += i;
            i++;
        }
        System.out.println(sum);
    }
代码示例7:计算1~100的奇数和,偶数和
public static void main11(String[] args) {
        int sumOdd = 0;//1~100奇数和
        int sumEve = 0;//1~100偶数和
        int i = 1;
        while (i <= 100) {
            sumOdd += i;
            i += 2;
        }
        System.out.println(sumOdd);
        i = 2;//改变i的初值
        while (i <= 100) {
            sumEve += i;
            i += 2;
        }
        System.out.println(sumEve);
    }

打印结果:image-20210808180721757

代码示例8:计算n的阶乘
 public static void main12(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//输入一个整数
        int ret = 1;
        int i = 1;
        while (i <= n) {
            ret *= i;
            i++;
        }
        System.out.println(ret);
    }

运行结果:image-20210808180950724

代码示例9:求1!+2!+3!+4!+5!(1~n)的阶乘的和
public static void main13(String[] args) {
        Scanner scanner = new Scanner(System.in);//System.in:从键盘获取数值
        int n = scanner.nextInt();
        int sum = 0;
        int j = 1;
    // 外层循环负责求阶乘的和
        while (j <= n) {//循环是可以嵌套的
            int ret = 1;
            int i = 1;
             // 里层循环负责完成求阶乘的细节.
            while (i <= j) {
                ret *= i;
                i++;
            }
            sum = sum + ret;
            j++;
        }
        System.out.println(sum);
    }

打印结果:image-20210808181151806

注意事项

1).和 if 类似, while 下面的语句可以不写 { } , 但是不写的时候只能支持一条语句. 建议还是加上 { }
2).和 if 类似, while 后面的 { 建议和 while 写在同一行.
3).和 if 类似, while 后面不要多写 分号, 否则可能导致循环不能正确执行

break

break 的功能是让循环提前结束.

代码示例:

 public static void main(String[] args) {
        int i = 1;
        while (i <= 10) {
            if (i == 6) {
                break;//break结束所有循环
            }
            System.out.println(i);
            i++;
        }
    }
代码示例10: 找到 100 - 200 中第一个 3 的倍数
 public static void main(String[] args) {
int num = 100; 
while (num <= 200) { 
 if (num % 3 == 0) { 
 System.out.println("找到了 3 的倍数, 为:" + num); 
 break; 
 } 
 num++; 
}
}

打印结果:image-20210808182034953

continue

continue 的功能是跳过这次循环, 立即进入下次循环.

代码示例11: 找到 100 - 200 中所有3 的倍数
 public static void main(String[] args) {
int num = 100; 
while (num <= 200) { 
 if (num % 3 != 0) { 
 num++; // 这里的 ++ 不要忘记! 否则会死循环. 
 continue; 
 } 
 System.out.println("找到了 3 的倍数, 为:" + num); 
 num++; 
}
}

执行到 continue 语句的时候, 就会立刻进入下次循环(判定循环条件), 从而不会执行到下方的打印语句

代码示例12:找到 1~100之间既能被3整除又能被5整除的数字
//方法1: 
public static void main16(String[] args) {
        int i = 1;
        while (i <= 100) {
            if (i % 3 != 0 || i % 5 != 0) {
                i++;
                continue;
            }
            System.out.println(i);
            i++;
        }
    }
//方法2:使用最小公倍数
    public static void main17(String[] args) {
        int i = 1;
        while (i <= 100) {
            if (i % 15 != 0) {
                i++;
                continue;
            }
            System.out.println(i);
            i++;
        }
    }

打印结果:image-20210808182903113

for 循环

基本语法

for(表达式1;表达式2;表达式3){ //表达式2一定是一个布尔表达式
循环体; 
}

//表达式1: 用于初始化循环变量.

//表达式2: 循环条件

//表达式3: 更新循环变量.
//相比于 while 循环, for 循环将这三个部分合并在一起, 写代码时不容易遗漏.
代码示例13:打印1到9的数字
  public static void main18(String[] args) {
        for(int i=1;i<=9;i++){
            System.out.println(i);
        }
    }
代码示例14:计算1-100的和
public static void main19(String[] args) {
        int i=0;
        int sum=0;
        for(i=1;i<=100;i++){
            sum+=i;
        }
        System.out.println(sum);
    }
代码示例15:计算1!+2!+3!+4!+5!
 public static void main21(String[] args) {
        int sum=0;
        int i=1;
        //第一个for循环是产生1到5的数字
        for(i=1;i<=5;i++){
            //第二个for循环是求一个数的阶乘
            int ret=1;
            for(int j=1;j<=i;j++){//
                ret*=j;
            }
            sum+=ret;//求和
        }
        System.out.println("result="+sum);
    }

运行结果:image-20210808183553589

do while循环

基本语法

do{ 
循环语句; 
}while(循环条件);
//先执行循环语句, 再判定循环条件.

代码示例:

 public static void main(String[] args) {
        int i=0;
        do{
            System.out.println("至少执行一次:"+"hehe haha");
        }while(i!=0);
    }

打印结果:image-20210808184249022

注意:
do…while循环:至少会执行一次
do while 循环最后的分号不要忘记

输入输出

输出到控制台

基本语法

System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出

代码示例:

 public static void main23(String[] args) {
        String msg="hello";
        String format="world";
        System.out.println(msg); // 输出一个字符串, 带换行
        int a=10;
        System.out.printf("a=%d\n",a);
        System.out.print(msg); // 输出一个字符串, 不带换行
        System.out.printf(format, msg); // 格式化输出
    }

打印结果:image-20210808185113252

格式化字符串
转换符类型举例
d十进制整数("%d", 100)100
x十六进制整数("%x", 100)64
o八进制整数("%o", 100)144
f定点浮点数("%f", 100f)100.000000
e指数浮点数("%e", 100f)1.000000e+02
g通用浮点数("%g", 100f)100.000
a十六进制浮点数("%a", 100)0x1.9p6
s字符串("%s", 100)100
c字符("%c", 1)1
b布尔值("%b", 1)true
h散列码("%h", 100)64
%百分号("%d.2f%%", 2/7f)0.29%
从键盘输入

读入一个字符 (选学)

public static void main24(String[] args)  {
        //《》
        System.out.println("输入一个字符:");
        char i= 0;//read报错:选到它,按住Alt+回车键,选中第二个,捕获异常
        //这种太复杂,不建议使用
        try {
            i =(char)System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("你输入的字符是:"+i);
    }
Scanner:输入工具类
public static void main25(String[] args) {
        Scanner scanner=new Scanner(System.in);
        String str2=scanner.nextLine();
        //这里的nextLine在读入的时候遇到空格不结束,但它需要放到最上面
        System.out.println(str2);
    
       byte b=scanner.nextByte();
       System.out.println(b);

        float f=scanner.nextFloat();
        System.out.println(f);

        String str1=scanner.next();//这里的next在读入的时候,遇到空格结束,
        System.out.println(str1);
    }

运行结果:image-20210808191238922

注意:如果输入与类型不匹配时会报错

image-20210808191828487

用Scanner循环读入n个数字不结束,想要结束使用ctrl+D

public static void main26(String[] args) {
        Scanner scanner=new Scanner(System.in);
       while(scanner.hasNextInt()){
           int a=scanner.nextInt();
           System.out.println(a);
       }
    }

运行结果:image-20210808190631460

猜数字游戏

游戏规则:
系统自动生成一个随机整数(1-100), 然后由用户输入一个猜测的数字. 如果输入的数字比该随机数小, 提示 “低 了”,
如果输入的数字比该随机数大, 提示 “高了” , 如果输入的数字和随机数相等, 则提示 “猜对了” .

public static void main28(String[] args) {
       Scanner scanner=new Scanner(System.in);
        //电脑随机生成数字
    Random random=new Random(22);
    int rand=random.nextInt(100)+1;//bound:100表示生成[0,100),需要+1生成1~100的数
                while(true) {
                    System.out.println("请输入数字:");
                    int num=scanner.nextInt();
                    if (num < rand) {
                        System.out.println("低了");
                    } else if (num > rand) {
                        System.out.println("高了");
                    } else {
                        System.out.println("等于");
                        break;
                    }
                }
                }
}

运行结果:image-20210808192303309

程序的调试

画图解说:image-20210808192650961

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值