循环结构中的分支结构
1、单分支
if(条件){代码}
2、双分支
if(条件){代码1}else{代码2}
3、多分支
if(条件1){代码1}else if(条件2){代码2}…else{代码N}
switch(算术表达式){case 常量1:代码1;break;…default:代码N;}
★if做区间条件,switch做等值条件(贯穿现象,只支持long以下的整数(char,枚举),JDK1.8之后开始支持String)
4、嵌套分支
if(){
if(){}
switch(){}
}
★ 多个变量构成复杂条件,建议使用嵌套分支,一层只负责一个变量构建的条件
某年某月有多少天
Scanner input =new Scanner(System.in);
int year,month,day=0;
year = input.nextInt();
month = input.nextInt();
//4的倍数的,且不是100的倍数 400的倍数
boolean isLeapYear = (year%4==0 && year%100!=0)|| year%400==0;
System.out.println(year+(isLeapYear?"是":"非")+"闰年");
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:
day=isLeapYear ? 29:28;
break;
}
System.out.println(MessageFormat.format("{0}年{1}月有{2}天",year,month,day));
输入两个日期(年月日),计算这两个日期之间相差多少天
方法一:两个日期分别距离1900年有多少天,然后再用两个时间差进行相减
Scanner input = new Scanner(System.in);
int year1, month1, date1, year2, month2, date2, monthDay = 0, totalA = 0, totalB = 0, allDay = 0;
System.out.print("请输入第一个日期的年份:");
year1 = input.nextInt();
System.out.print("请输入第一个日期的月份:");
month1 = input.nextInt();
System.out.print("请输入第一个日期的号数:");
date1 = input.nextInt();
System.out.print("请输入第二个日期的年份:");
year2 = input.nextInt();
System.out.print("请输入第二个日期的月份:");
month2 = input.nextInt();
System.out.print("请输入第二个日期的号数:");
date2 = input.nextInt();
for (int i = 1900; i < year1; i++) {
totalA += (i % 4 == 0 && i % 100 != 0) || i % 400 == 0 ? 366 : 365;
}
for (int i = 1; i <= month1; i++) {
switch (i) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
monthDay = 31;
if (i < month1) {
totalA += monthDay;
}
break;
case 4: case 6: case 9: case 11:
monthDay = 30;
if (i < month1) {
totalA += monthDay;
}
break;
case 2:
monthDay = (year1 % 4 == 0 && year1 % 100 != 0) || year1 % 400 == 0 ? 29 : 28;
if (i < month1) {
totalA += monthDay;
}
break;
}
}
totalA += date1;
for (int i = 1900; i < year2; i++) {
totalB += (i % 4 == 0 && i % 100 != 0) || i % 400 == 0 ? 366 : 365;
}
for (int i = 1; i <= month1; i++) {
switch (i) {
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
monthDay = 31;
if (i < month1) {
totalB += monthDay;
}
break;
case 4: case 6: case 9: case 11:
monthDay = 30;
if (i < month1) {
totalB += monthDay;
}
break;
case 2:
monthDay = (year1 % 4 == 0 && year1 % 100 != 0) || year1 % 400 == 0 ? 29 : 28;
if (i < month1) {
totalB += monthDay;
}
break;
}
}
totalB += date2;
allDay =totalA>totalB ? totalA-totalB:totalB-totalA;
System.out.print("两个日期之间相差"+allDay+"天");
方法二:①两个日期间的年份相差多少;
②两个日期间的月份相差多少;
③两个日期间的日数相差多少;
如:2006年5月1日与2020年9月24日
相差07、08、09、10、11、12、13、14、15、16、17、18、19,共13年;
相差05、06、07、08、09、10、11、12 加上01、02、03、04、05、06、07、08、这么些月份
相差的日数为:-1+24天
int sy=2006,by=2020,sm=5,bm=9,sd=1,bd=24,diff=0,ml=12;
//整数年的天数
for(int i=sy+1;i<=by-1;i++){
diff +=(i%4==0 && i%100!=0)|| i%400==0 ? 366 :365;
}
//小年剩余月份的天数
diff=diff+bd-sd;
for (int i = sm; i <=ml ; i++) {
switch(i){
case 1: case 3:case 5:case 7:case 8:case 10:case 12:
diff +=31;
break;
case 4:case 6:case 9:case 11:
diff +=30;
break;
case 2:
diff += (sy%4==0 && sy%100!=100)|| sy%400==0 ? 29 :28;
break;
}
if(i==12){
i = 0;
ml = bm-1;
}
}
System.out.println("两个日期之间相差"+diff+"天");
这一天是这一年的第几天
同样的处理方法,利用switch与if相结合的方法,加上相应月份的天数
Scanner input = new Scanner(System.in);
int year,month,date,monthDay=0,total=0,allDay=0;
System.out.print("请输入年份:");
year = input.nextInt();
System.out.print("请输入月份:");
month = input.nextInt();
System.out.print("请输入日期:");
date = input.nextInt();
for (int i= 1; i<month; i++){
switch(i){
case 1: case 3:case 5: case 7:case 8: case 10:case 12:
monthDay = 31;
total +=monthDay;
break;
case 4: case 6:case 9: case 11:
monthDay = 30;
total +=monthDay;
break;
case 2:
monthDay = (year % 4==0 && year%100 !=0) || year%400==0 ? 29:28;
total +=monthDay;
break;
}}
allDay=total+date;
System.out.println("这一天是这一年的第"+allDay+"天");
输入年月,输出该月日历
与前几题不同的是:
①需要注意:在switch中计算月份天数时只需要计算到该月的第一天的总天数。最后制表时,需要用到total%7==6来控制日历中的换行,所以total会在最后的循环中实现该月的total++。
②为达到计算该月第一天时,total不含该月的天数。而制作该月月份表时含有该月的月数。在switch中,只是月份加总到计算目标月份的上一月就行了,但还是弄出了该月的天数,只是当时没有计算到total中。
如:
for (int i= 1; i<= month; i++){
switch(i){
case 1: case 3:case 5: case 7:case 8: case 10:case 12:
monthDay = 31;
if(i<month){
total +=monthDay;
}
break;
完整代码如下:
Scanner input = new Scanner(System.in);
int year,month,total=1,weekDay=0,monthDay=0;
System.out.print("请输入年份:");
year = input.nextInt();
System.out.print("请输入月份:");
month = input.nextInt();
for(int i = 1900; i<year ; i++){
total +=(i % 4==0 && i%100 !=0) || i%400==0 ? 366:365;
}
for (int i= 1; i<= month; i++){
switch(i){
case 1: case 3:case 5: case 7:case 8: case 10:case 12:
monthDay = 31;
if(i<month){
total +=monthDay;
}
break;
case 4: case 6:case 9: case11:
monthDay = 30;
if(i<month){
total += monthDay;
}
break;
case 2:
monthDay = (year % 4==0 && year%100 !=0) || year%400==0 ? 29:28;;
if(i<month){
total +=monthDay;
}
break;
}
}
weekDay = total%7;
System.out.println("日\t一\t二\t三\t四\t五\t六");
for(int i = 0; i<weekDay; i++){
System.out.print("\t");
}
for(int i =1; i<=monthDay ; i++){
System.out.print( i+"\t");
if(total%7==6){
System.out.println();
}total++;
}