黑马程序员技术交流社区

标题: 看视频看累了,在网上找了一道题做了做,使用do while简单... [打印本页]

作者: 孟浩然    时间: 2012-6-20 09:45
标题: 看视频看累了,在网上找了一道题做了做,使用do while简单...
  1. /*
  2. 需求:根据输入的年、月、日 算出那一天是那一年的第多少天
  3. 闰年:能被4整除的年份,如果是整百年的话,只有被400整除的年份才是闰年 闰年2月有29天
  4. 平年:不是闰年就是平年 平年的2月有28天
  5. 思路:假设输入x年y月z天 先判断y年是闰年还是平年
  6. 每年1,3,5,7,8,10,12是31天 4,6,9,11是30天 ,天数没有规律,但是月份是从1-12的,可以用数组的角标表示
  7. 将每月的月数放入数组,如果是闰年就把二月对应的arr[1]换成29,否则换成28
  8. 需要完成的工作:
  9. 1.判断闰年还是平年
  10. 2.判断输入的年、月、日是否合法(其中还要判断输入的月份对应的天数是否合法)
  11. 3.实现各月份天数的累加,一个变量一个循环即可
  12. 4.如果输入正确,算出结果,退出程序;如果输入不正确,打出提示语句,并继续执行程序
  13. 由于键盘录入始终要执行,于是想到了do()while();循环
  14. */
  15. import java.util.Scanner;
  16. class DaysDemo_2
  17. {
  18.         public static void main(String[] args)
  19.         {
  20.                 //System.out.println("Hello World!");
  21.                 //定义数组,用于存储1-12月各月的天数
  22.                 int[] arr={31,28,31,30,31,30,31,31,30,31,30,31};
  23.                 int year,month,day;
  24.                 Scanner sc=new Scanner(System.in);
  25.                 do
  26.                 {
  27.                         System.out.println("请输入年月日,并以空格分开:");
  28.                         year=sc.nextInt();
  29.                         month=sc.nextInt();
  30.                         day=sc.nextInt();
  31.                         //判断输入是否合法
  32.                         if(year>0&&(month>0&&month<13)&&(day>0&&day<32&&day<arr[month-1]+1))
  33.                         {
  34.                                 //使用三元运算符判断是闰年还是平年,闰年就把2月对应的数组中的元素改为29,否则就是28天
  35.                                 arr[1]=(year%4==0||year%400==0)?29:28;
  36.                                 {
  37.                                         int days=0;
  38.                                         for (int x=0;x<month-1 ;x++ )
  39.                                         {
  40.                                                 //输入的月份之前所有月份的天数之和
  41.                                                 days+=arr[x];
  42.                                         }
  43.                                         System.out.println(month+"月"+day+"日是"+year+"年的第:"+(days+day)+"天");
  44.                                 }
  45.                                 break;
  46.                         }
  47.                         else
  48.                                 System.out.println("输入错误,重新输入");
  49.                 }
  50.                 while (true);
  51.         }
  52. }

复制代码
就是一个根据输入的年月日算出那一天是那一年的第多少天。第一眼看到肯定想到是用switch语句做,思路很简单,但是感觉代码有点长;也可以直接使用if else 进行判断,代码也不短;最后我发现可以一个do while就解决了,然后再判断输入的年月日是否合法的时候直接使用一个三元运算符就ok了,代码就少了很多,而且也很容易理解,而且将每月天数放在数组中,也使操作变得简便了。

另外有一个关于三元运算符基础的问题我给忘了,想了好久才想起来,就是
arr[1]=(year%4==0||year%400==0)?29:28;这一句,刚开始我一直写成(year%4==0||year%400==0)?arr[1]=29:arr[1]=28;这样一直报错,最后才想起来三元运算符?两边必须是语句,从if else 语句转换过来应该要注意这个问题.
作者: 耿鑫    时间: 2012-6-20 14:47
本帖最后由 耿鑫 于 2012-6-20 14:52 编辑

其实楼主的代码有许多需要该的地方,虽然功能完成了,但是效果不怎么好,首先就不支持连续的输入校验,运行一次输入一次,用户很麻烦,这是其一,其二就是你代码啰嗦需要改动的地方。
class DaysDemo_2
{
        public static void main(String[] args)
        {
                //System.out.println("Hello World!");
                //定义数组,用于存储1-12月各月的天数
                int[] arr={31,28,31,30,31,30,31,31,30,31,30,31};
                int year,month,day;
                Scanner sc=new Scanner(System.in);
                do
                {
                        System.out.println("请输入年月日,并以空格分开:");
                        year=sc.nextInt();
                        month=sc.nextInt();
                        day=sc.nextInt();
                        //判断输入是否合法
                        if(year>0&&(month>0&&month<13)&&(day>0&&day<32&&day<arr[month-1]+1))//因为arr[month - 1] + 1 永远不可能大于32,和你前面的判断重复了。
                        {
                                //使用三元运算符判断是闰年还是平年,闰年就把2月对应的数组中的元素改为29,否则就是28天
                                arr[1]=(year%4==0||year%400==0)?29:28;//year%4==0和 year%400==0效果一样,
                               {  // 这个代码块完全没必要
                                        int days=0;
                                        for (int x=0;x<month-1 ;x++ )
                                        {
                                                //输入的月份之前所有月份的天数之和
                                                days+=arr[x];
                                        }
                                        System.out.println(month+"月"+day+"日是"+year+"年的第:"+(days+day)+"天");
                                }
                                break;

                        }
                        else
                                System.out.println("输入错误,重新输入");
                }
                while (true);
        }
}

下面附上我修改后的代码:

import java.util.Scanner;

public class Test
{
        public static void main(String[] args)
        {
                int[] arr = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
               
                int year, month, day;
               
                Scanner sc = new Scanner(System.in);
               
                System.out.println("请输入年月日,并以空格分开:");
               
                while(true)
                {
                        year = sc.nextInt();
                        month = sc.nextInt();
                        day = sc.nextInt();

                        if (year > 0 && (month > 0 && month < 13) && (day > 0 && day < 32))
                        {
                                arr[1] = (year % 4 == 0) ? 29 : 28;
                                
                                int days = 0;
                                
                                for (int x = 0; x < month - 1; x++)
                                {
                                        days += arr[x];
                                }
                                
                                System.out.println(month + "月" + day + "日是" + year + "年的第:" + (days + day) + "天");
                        }
                        else
                        {
                                System.out.println("输入错误,重新输入");
                        }
                }
        }
}
作者: 李文龙    时间: 2012-6-20 21:29
while与 do whiie 的区别在于,do while 无论循环的终止条件是什么,都至少执行一次,所以觉得完全可以写出while ,还可以避免输入错误,同时,楼主的程序在输入错误的情况下会报错,我输入了一个2011年2月29日,程序提示输入错误,让我重新输入,但是当我输入一个正确的日期后,程序便退出了循环终止了运行,想要再次查询日期得重新运行一遍,这样不免显得有些麻烦,建议楼主思考一下这个问题,其实想要解决这个问题很简单,但劳请楼主亲自想想,自己得出的结论才是最有效的。最后还有一点建议,希望楼主采纳,每一个程序,无论大小,我们都是希望它完美的,在常人看来,一个电话薄管理系统很简单,也有许多随口就能说出的功能。但是对于学习编程的人,特别是初次编程的人,实现这些功能都需要相应的代码,并非很快就能解决,需要一定的时间,我举这个例子是想说,假若我是一个路人,楼主开发的这个是一个查询当天是当年的多少天的软件,我有意见要反馈,这个程序不好,查一次就没法查第二次了。。。。。。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2