韩顺平java04(程序流程)

  • if等分支较简单就不举例了

Scanner sc = new Scanner(System.in);
int month;
int age;
int hot_price = 60;
int cold_price = 40;
System.out.println("please enter month");
month = sc.nextInt();
System.out.println("please enter age");
age = sc.nextInt();
if (age >= 0){
    if (month >=1 && month <= 12){
        if (month >= 4 && month <=10){
            if (age >= 18 && age <= 60){
                System.out.println("您的票价为:" + hot_price);
            }else if (age >= 0 && age < 18){
                System.out.println("您的票价为:" + hot_price/2);
            }else if (age > 60 ){
                System.out.println("您的票价为:" + hot_price/3);
            }

        }
        else{
            if (age >= 18 && age <= 60){
                System.out.println("您的票价为:" + cold_price);
            }else{
                System.out.println("您的票价为:" + cold_price/2);
            }
        }

    }
    else{
        System.out.println("月份有误");
    }
}else{
    System.out.println("请输入正确的年龄");
}

 

switch语句

 

 

 

  •  如果没有加break则会不判断直接执行第二个语句块,这种现象称之为“穿透”
Scanner sc = new Scanner(System.in);
        char c = sc.next().charAt(0);
        switch (c){
            case '1' :
                System.out.println(1);
                break;
            case '2' :
                System.out.println(2);
                break;
            case '3' :
                System.out.println(3);
                break;
       
default:
          System.out.println(666);
}
  • switch语句注意细节
  1. 传入的表达式的类型应该与case后边的常量类型保持一致,或是能够转换为可以相互比较的类型的(例如c是char类型 常量是20int类型),如果不一致编译会报错。
  2. switch(表达式)中表达式的返回值必须是:byte、int、char、enum(枚举)或者String类型的。
  3. case子句中的值必须是常量(或者是常量表达式),不能是变量。
  4. default是可选的(可以没有),当所有case都不匹配的时候执行default里的语句。如果没有default又没有匹配的case则不输出任何值。
  5. break语句用来在执行完case后跳出switch分支(程序继续运行),如果没有break语句程序会按顺序执行到switch结尾。
  • switch练习
//判断学生成绩是否及格
        System.out.println("请输入成绩:");
        Scanner sc = new Scanner(System.in);
        double score = sc.nextDouble();
        int c = (int)score/60;


        switch (c){
            case 0 :
                System.out.println(score + "不及格");
                break;
            case 1 :
                System.out.println(score + "及格");
                break;
            default:
                System.out.println("请输入正确的成绩");
        }

踩坑:一开始把0和1加上了‘’,导致一直走default,注意case后面常量的值的类型一定要与表达式保持一致!

 

//根据季节输出对应的月份
        System.out.println("请输入月份:");
        Scanner sc = new Scanner(System.in);
        byte month = sc.nextByte();
        
        switch (month){
            case 1 :

            case 2 :
                System.out.println("winter");
                break;
            case 3 :
            case 4 :
            case 5 :
                System.out.println("spring");
                break;
            case 6 :
            case 7 :
            case 8 :
                System.out.println("summer");
                break;
            case 9 :
            case 10 :
            case 11 :
                System.out.println("fall");
                break;
            case 12 :
                System.out.println("winter");
                break;

            default:
                System.out.println("请输入正确的月份");
        }

使用了穿透

 

  • if语句和switch的选择

  

 

 for循环

  • 基本语法

 

 

 

 

 

  •  for循环的注意细节
  1. 循环条件是返回一个布尔值的表达式
  2. for(;循环条件;)中的初始值和变量迭代可以写到其他位置,但是两边的分号不能省略。   
int i = 0;
        for (; i < 10; ) {
            i++;
            System.out.println("666");
        }

for(; ;){ xxxx}表示一个死循环

        3.循环的初始条件可以有多条语句,但要求类型一致且用逗号分隔开。变量迭代语句也可以有多条,也是用逗号隔开。

int max = 3;
for(int i = 0, j = 0; i < max ; i ++ , j +=2){
System.out.println("i =" + i + "j = " + j);
}

 

  • 增强for循环
 //增强for循环
        int [] a = {1,5,6,9};
        for (int i:a){
            System.out.println(i);
        }

 

 

  • 练习

找出范围内x的倍数

Scanner sc = new Scanner(System.in);
        System.out.println("从:");
        int start = sc.nextInt();
        System.out.println("到:");
        int end = sc.nextInt();
        System.out.println("多少的倍数:");
        int mod = sc.nextInt();

        int sum = 0;
        int count = 0;

        for (;start<=end;start++){
            if (start % mod ==0){
                System.out.println("范围内是"+mod+"的倍数的数有:"+ start);
                count++;
                sum+=start;
            }
        }
        System.out.println("共有" + count +"个");
        System.out.println("和为" + sum);

 思想:化繁为简 先死后活(数据普适)

 

while循环

 

 

 

  •  while练习
        Scanner sc = new Scanner(System.in);

        int start_num; //范围左边界
        int end_num; //范围有边界
        int mod;    //倍数

        System.out.println("please enter start number:");
        start_num = sc.nextInt();
        System.out.println("please enter end number:");
        end_num = sc.nextInt();
        System.out.println("please enter mod:");
        mod = sc.nextInt();
        System.out.println("from\t" + start_num + "\tto\t" + end_num +"\thas:");
        while (start_num <= end_num) {
            if (start_num % mod == 0) {
                System.out.println(start_num);
            }
            start_num++;

        }

 踩坑:变量迭代一定要放在最后!! 

 

do while 循环

 

 

 

  •  与while区别:while先问还不还钱,不还再打。dowhile先打一顿再问还不还钱。
 Scanner sc = new Scanner(System.in);
            char answer = ' ';
            do {
                System.out.println("还不还钱!(y/n)");

                answer = sc.next().charAt(0);
                System.out.println("你的回答:" + answer);

            } while (answer != 'y');

            System.out.println("放你一马");
    }

 

多重循环控制

  • 练习1:九九乘法表
for (int j =1;j<=9;j++) {

            for (int i = 1; i <= j; i++) {
                System.out.print(j + "*" + i + "=" + (j * i) + "\t");
            }
            System.out.println("\t");
        }
//化繁为简思想:先打印矩形,再通过
i <= j去掉多余的

  • 练习2:输入三个班学生成绩
Scanner sc = new Scanner(System.in);

        double totalScore = 0;//总成绩
        int passNum = 0;//及格人数
        for (int i = 1; i <= 3; i++) {
            double sum = 0;//班级总成绩
            int passNum_class = 0;//及格人数
            for (int j = 1; j <= 5; j++) {
                System.out.println("请输入"+i+"班第"+j+"名同学的成绩:");
                double score = sc.nextDouble();
                if (score>=60)passNum_class++;
                System.out.println(i+"班第"+j+"名同学的成绩为:" + score);

                sum += score;

            }
            totalScore += sum;
            passNum += passNum_class;
            System.out.println(i+"班总成绩为:"+sum+"平均成绩为:"+sum/5+"及格人数为:" + passNum_class);
        }
        System.out.println("三个班总成绩为:"+totalScore+"平均成绩为:"+totalScore/15);
        System.out.println("三个班第及格人数为:" + passNum);

 

  • 练习3(经典):空心金字塔
//空心金字塔
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入空心金字塔层数:");
        int level = sc.nextInt();
        for (int j = 1; j <= level; j++){
            for (int k = 1; k <= level-j ; k++){
                System.out.print(" ");//每行前面加空格
            }
            for (int i = 1; i <= 2 * j - 1; i ++) {
                if (i == 1 || i == 2*j - 1 ||j == level ){
//                    只在首尾和最后一行打印*
                    System.out.print("*");
                }else{
//                    其余打印空格
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
//思想:1.先打印矩形 2.打印半个金字塔 3.打印整个金字塔 4. 思考怎样空心

 

  • 练习4:空心菱形(金字塔翻转-1行)
//空心菱形
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入空心菱形塔层数:");
        int level = sc.nextInt();
        for (int j = 1; j <= level; j++){
            for (int k = 1; k <= level-j ; k++){
                System.out.print(" ");
            }
            for (int i = 1; i <= 2 * j - 1; i ++) {
                if (i == 1 || i == 2*j - 1 ){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();

        }
        for (int j = level-1; j >= 0; j--){

            for (int k = 0; k <= level-1-j ; k++){
                System.out.print(" ");
            }

            for (int i = 1; i <= 2 * j - 1; i ++) {
                if (i == 1 || i == 2*j - 1 ){
                    System.out.print("*");
                }else{
                    System.out.print(" ");
                }
            }
            System.out.println();
        }

 

跳转控制语句——break

 

 

 

 

//1-100求和,找出求和结果第一次>20的数
        int i = 1;
        int sum = 0;
        for (; i <= 100; i++) {
            sum += i;
            if (sum>=20){
                break;
            }
        }
        System.out.println(sum + " " + i);

 

  • 字符串比较使用.equal()方法

 

 

//输入用户名和密码 判断是否是 “顶针”“666” 有三次机会
        Scanner sc = new Scanner(System.in);
        String name;
        String password;
        int chance = 3;

        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名:");
            name = sc.next();
            System.out.println("请输入密码:");
            password = sc.next();

            if ("顶针".equals(name) && "666".equals(password)){
                System.out.println("success");
                break;

            }
                chance --;
                System.out.println("错误,剩余机会:" + chance);

        }

踩坑:注意变量的作用域,一开始将输入用户名和密码放在了for循环外面,导致一次输入三次判断。

 

continue

 

 

  •  小例子
    int i = 1;
            while (i <= 4) {
                i++;
                if (i == 2) continue;
                System.out.println(i);
            }
        }
    //因为i=2的时候continue,跳过了输出语句,所以输出3 4 5
     
label1:
        for (int i = 0; i < 4; i++) {
            label2:
            for (int i1 = 0; i1 < 10; i1++) {
                if ( i1 == 2){
                    continue ;//等价于continue label2
                }
                System.out.println(i1);
            }
        }

注:label标签可以是任何名字,可以和break和continue配合,实际操作中不建议使用

 

return

 

 

 

本章作业

1.

//初始10 0000元,>5 0000时没过一个路口扣 5% <= 5 0000 每个路口扣1000 输出通过的路口数
        double money = 100000;
        byte count = 0;
        while (money > 50000 ){

            money = (1-0.05)*money;
            count ++;
            if (money <=50000){
                break;
            }

        }
        System.out.println(money);
        while (money < 50000 && money >=1000 ){

            money -= 1000;
            count ++;
            if (money <=0){
                break;
            }

        }

        System.out.println("可以通过路口数:" + count + "剩:" + money);

 

老师版本

double money = 100000;
        byte count = 0;
        while (true) {
            if (money > 50000) {
                money *= .95;
                count++;
            } else if (money >= 1000) {
                money -= 1000;
                count++;
            }else{
                System.out.println("余额不足!");
                break;
            }
        }
        System.out.println("可以通过路口数:" + count + "剩:" + money);

 

2.判断闰年

//判断闰年
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入年份:");
        int year = sc.nextInt();
        if (year % 4 ==0 && year % 100!=0 || (year % 400 ==0)){
            System.out.println(year + "是闰年");
        }else{
            System.out.println(year + "不是闰年");
        }

 

3.判断水仙花数

//判断水仙花数 —— 三位数的各位数字之和等于它本身
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数字:");
        int num = sc.nextInt();
        int hundred_num = num / 100; //百位
        int shi_num = num % 100 /10; //十位
        int ge_num = num % 10;       //个位

        if (hundred_num * hundred_num * hundred_num + shi_num * shi_num * shi_num + ge_num * ge_num*ge_num ==num){
            System.out.println(num + "是水仙花数");
        }else{
            System.out.println(num + "不是水仙花数");
        }

 

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

        //每五个一行输出 1-100之间不能被5整除的数
        int count = 0; //用来分行
        for (int i = 0; i < 100; i++) {
            if (i % 5 !=0){
                System.out.print(i+"\t");
                count++;
                if (count % 5 ==0) System.out.println(); //每五个一换行
            }
        }
System.out.println()可以用来换行,相当于System.out.print("\n")。


5.字母表 正向打印小写字母反向打印大写字母

//字母表
        int a = 97;
        for (int i = 0; i < 26; i++) {
            System.out.print((char) a+"\t");
            a++;
        }
        System.out.println();
        int z = 90;
        for (int j = 0; j < 26; j++) {
            System.out.print((char) z+"\t");
            z--;
        }

 

老师方法

for(char c1 = 'a'; c1 <= 'z' ;c1++){
System.out.println(c1);
}
for(char c2 = 'Z'; c1 >= 'A' ;c2--){
System.out.println(c2);
}

 

6.数列求和(1-1/2+1/3-1/4... ...-1/100)

double sum = 0;
        
        for (int i = 1; i <= 100; i++) {
            if (i%2 == 0){
                sum-=1/i;
            }else {
                sum+=1/i;
            }

        }
        System.out.println(sum);

输出结果为1 原因:用1/i 得到的只能是int型的结果 这里应该把 1换成1.0

老师改进

double sum = 0;

        for (int i = 1; i <= 100; i++) {
            if (i%2 == 0){
                sum-=1.0/i;
            }else {
                sum+=1.0/i;
            }

        }
        System.out.println(sum);

 

7.

 

 

int sum = 0;

        for (int i = 1; i <= 100; i++) {
            for (int j = 1; j <= i ;j++ ){
                sum += j;
            }

        }

        System.out.println(sum);

 

8.求质数

Scanner sc =new Scanner(System.in);
        System.out.println("请输入范围:");
        long num = sc.nextLong();

        for (int i = 2; i <= num; i++) {
            boolean flag = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
//如果除一个数能除尽那么就不是质数 flag
= false; break; } } if (flag) {
//输出不是不是质数的 System.out.println(i); } }

这波反向抽烟,太强了!!!

posted @ 2021-12-05 01:57  紫英626  阅读(54)  评论(0编辑  收藏  举报

紫英