Java的选择结构与循环结构——解决年月日等相关问题

循环结构中的分支结构
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++;
        }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值