韩顺平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语句注意细节
- 传入的表达式的类型应该与case后边的常量类型保持一致,或是能够转换为可以相互比较的类型的(例如c是char类型 常量是20int类型),如果不一致编译会报错。
- switch(表达式)中表达式的返回值必须是:byte、int、char、enum(枚举)或者String类型的。
- case子句中的值必须是常量(或者是常量表达式),不能是变量。
- default是可选的(可以没有),当所有case都不匹配的时候执行default里的语句。如果没有default又没有匹配的case则不输出任何值。
- 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循环的注意细节
- 循环条件是返回一个布尔值的表达式
- 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); } }
这波反向抽烟,太强了!!!
本文来自博客园,作者:紫英626,转载请注明原文链接:https://www.cnblogs.com/recorderM/p/15643943.html