Day05
一、while循环和do-while循环
while循环:
语法结构:
while(表达式){
…代码块…
}理解:表达式的结果必须是boolean类型
true – 执行代码块
false - 跳出整个循环死循环:
while(true){
System.out.println(“死循环”);
}
do-while循环:
语法结构:
do{
…代码块…
}while(表达式);理解:
先执行一遍代码块,再判断表达式
表达式的结果必须是boolean类型
true – 执行代码块
false - 跳出整个循环小结:
1.do-while先循环一遍,再判断
2.在代码块中声明的变量不能在外面使用
知识点:for vs while vs do-while:
表达式的区别:
for(初始化变量;判断条件;更新变量){}
while(判断条件){}
do{}while(判断条件);
注意:三大循环的判断条件,如果是true就执行代码块,如果是false就跳出循环执行顺序的区别:
for:先判断,再执行
while:先判断,再执行
do-while:先执行一遍,再判断应用场景的区别:
for:循环次数确定时
while:循环次数不确定时,先判断,再执行
do-while:循环次数不确定时,先执行一遍,再判断
二、特殊的流程控制语句
知识点:特殊的流程控制语句 – break
含义:作用于循环中,表示跳出/结束当前循环
知识点:特殊的流程控制语句 – continue
含义:作用于循环中,表示跳过循环体剩余部分,进入到下一次循环中
/*案例:循环录入Java课5名学生的成绩,统计分数大于等于80分的学生比例。
解决方案一:*/
Scanner scan = new Scanner(System.in);
int count = 0;//分数大于等于80分的学生个数
for(int i = 1;i<=5;i++){
System.out.println("请输入第" + i + "名学生的成绩:");
double score = scan.nextDouble();
if(score >= 80){
count++;
}
}
double proportion = count/5.0*100;
System.out.println("成绩大于等于80分学生的比例为:" + proportion + "%");
// 解决方案二:
Scanner scan = new Scanner(System.in);
int count = 0;//分数大于等于80分的学生个数
for(int i = 1;i<=5;i++){
System.out.println("请输入第" + i + "名学生的成绩:");
double score = scan.nextDouble();
if(score<80){
continue;
}
count++;
}
double proportion = count/5.0*100;
System.out.println("成绩大于等于80分学生的比例为:" + proportion + "%");
知识点:特殊的流程控制语句 – return
含义:作用于方法中,表示结束当前方法
知识点:特殊的流程控制语句 – label
面试题:
//面试题:以下代码是否会报错?
//答案:不会
https://www.baidu.com/
for(int i = 1;i<=5;i++){
System.out.println("好好学习天天向上");
}
理解:给循环做标记
/*需求: 外层循环5次 内层循环3次 当外层循环到第2次时,在内层循环中关闭掉外层循环 */ public static void main(String[] args){ a:for(int i = 1;i<=5;i++){ for(int j = 1;j<=3;j++){ System.out.println(i + " -- " + j); if(i == 2){ break a;//跳出指定循环 } } } }
三、万年历
知识点:万年历
需求:输入年和月,打印当月的日历
线索:1900年1月1日是星期一要想打印当月的日历,需要哪些数据作为支持?
年份、月份、当月天数、当月第一天是星期几import java.util.Scanner; public class Work01{ /** 万年历需要数据: 年份、月份、当月天数、一号是星期几 线索:1900年1月1日为星期一 */ public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println("请输入年份:"); int year = sc.nextInt(); System.out.println("请输入月份:"); int month = sc.nextInt(); //获取当月天数 int day=0; switch(month){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: day = 31; break; case 4:case 6:case 9:case 11: day = 30; break; case 2: if(year%4==0 && year%100!=0 || year%400==0){ day = 29; } else{ day = 28; } break; } //获取一号是星期几,思路为先计算输入年月到1900年1月1日的天数,再对7取余。 //先算年1900~year-1 int allDayYear=0; int allDayMonth=0; for(int i=1900;i<year;i++){ if(i%4==0 && i%100!=0 || i%400==0){ allDayYear +=366; }else{ allDayYear +=365; } } //再算月1~month-1 for(int i=1;i<month;i++){ switch(i){ case 1:case 3:case 5:case 7:case 8:case 10:case 12: allDayMonth += 31; break; case 4:case 6:case 9:case 11: allDayMonth += 30; break; case 2: if(year%4==0 && year%100!=0 || year%400==0){ allDayMonth += 29; } else{ allDayMonth += 28; } break; } } int week = (allDayYear+allDayMonth+1)%7; if(week==0){ week = 7; } //打印日历 System.out.println(year+"年"+month+"月"); System.out.println("一"+"\t"+"二"+"\t"+"三"+"\t"+"四"+"\t"+"五"+"\t"+"六"+"\t"+"日"+"\t" ); int count=0; for(int i=1;i<week;i++){ System.out.print("\t"); count++; } for(int i=1;i<=day;i++){ System.out.print(i+"\t"); count++; if(count%7==0){ System.out.println(); } } } }
上次练习答案
import java.util.Scanner;
public class Work01{
/**
1.某朋友说,
如果存款超过100万,则入手宝马X5,
否则超过50万,则入手奥迪A6,
否则超过20万,则入手比亚迪,
否则超过10万则玩玩极品飞车游戏,
请为他编写一个购车选择程序,根据输入的金额,提示可以购买的车型。
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入金额:");
double money = scan.nextDouble();
if(money > 1000000){
System.out.println("入手宝马X5");
}else if(money > 500000){
System.out.println("入手奥迪A6");
}else if(money > 200000){
System.out.println("入手比亚迪");
}else if(money > 100000){
System.out.println("玩玩极品飞车游戏");
}else{
System.out.println("好好学习Java~~~");
}
}
}
import java.util.Scanner;
public class Work02{
/**
2.设计一个考试奖励神器,根据录入学员的分数x给予奖励,
如果分数x小于等于80分的则不予奖励并罚一个iphone6s,
如果分数80<x<=90则奖励一个iphone4,
如果分数90<x<=100则奖励一个iphone4,再奖励一个ipad
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入成绩:");
double x = scan.nextDouble();
if(x <= 80){
System.out.println("不予奖励并罚一个iphone6s");
}else if(x > 80 && x<=90){
System.out.println("奖励一个iphone4");
}else if(x > 90 && x<=100){
System.out.println("奖励一个iphone4,再奖励一个ipad");
}
}
}
import java.util.Scanner;
public class Work03{
/**
3.从键盘录入输入3 个数a,b,c,按从大到小进行输出
经验:简单的if分支使用三目运算符代替
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入第一个数字:");
int a = scan.nextInt();
System.out.println("请输入第二个数字:");
int b = scan.nextInt();
System.out.println("请输入第三个数字:");
int c = scan.nextInt();
//最大值
int max = a;
if(max < b){
max = b;
}
if(max < c){
max = c;
}
//最小值
int min = a;
if(min > b){
min = b;
}
if(min > c){
min = c;
}
//中间值
int mid = a+b+c-max-min;
System.out.println(max + ">" + mid + ">" + min);
}
}
import java.util.Scanner;
public class Work04{
/**
4.计算个人所得税,关乎大家的生计
要求使用程序实现个人所得税计算器,
实现从键盘录入当月工资收入,输出应缴个人所得税。
工资个税的计算公式为:
应纳税额 = (工资薪金所得 - 扣除数)* 适用税率-速算扣除数;
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入当月工资:");
double salary = scan.nextDouble();
double deductionAmount = 3500;//扣除数
double taxSalry = salary-deductionAmount;//应该上税工资部分
double taxRate = 0;//税率
double quickCalculationDeduction = 0;//速算扣除数
if(taxSalry > 0){
if(taxSalry < 1500){
taxRate = 0.03;
quickCalculationDeduction = 0;
}else if(taxSalry < 4500){
taxRate = 0.1;
quickCalculationDeduction = 105;
}else if(taxSalry < 9000){
taxRate = 0.2;
quickCalculationDeduction = 555;
}else if(taxSalry < 35000){
taxRate = 0.25;
quickCalculationDeduction = 1005;
}else if(taxSalry < 55000){
taxRate = 0.3;
quickCalculationDeduction = 2755;
}else if(taxSalry < 80000){
taxRate = 0.35;
quickCalculationDeduction = 5505;
}else{
taxRate = 0.45;
quickCalculationDeduction = 13505;
}
double tax = taxSalry * taxRate - quickCalculationDeduction;
System.out.println("当月应上税:" + tax);
}else{
System.out.println("好好努力,你现在的工资不用上税");
}
}
}
import java.util.Scanner;
public class Work05{
/**
5.张三为他的手机设定了自动拨号(switch)
按1:拨爸爸的号
按2:拨妈妈的号
按3:拨爷爷的号
按4:拨奶奶的号
*/
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("请输入快速拨号:");
int num = scan.nextInt();
switch(num){
case 1:
System.out.println("拨爸爸的号");
break;
case 2:
System.out.println("拨妈妈的号");
break;
case 3:
System.out.println("拨爷爷的号");
break;
case 4:
System.out.println("拨奶奶的号");
break;
default:
System.out.println("拨号错误");
break;
}
}
}
练习
- 求出1-100之间偶数和
- 计算从1到100个值以内所有能被3或者17整除的数的和并输出。
- 3000米长的绳子,每天减一半。问多少天这个绳子会小于5米?不考虑小数
- 求2~100之内的素数。【素数 : 只能被1或本身整除的数】
- 模拟ATM取款机的三次密码校验,当天达到3次输入密码错误,则提示“账号被冻结”,其他情况则提示还有多少次输入机会
效果图如下:
6.要求循环录入2个班的学员成绩,假设每个班都有3个学员,依次录入,统计超过90分的学员人数,以及这批超过90分的学员平均分。
7.分别用for和while实现用“*”组成的菱形图。