黑马程序员技术交流社区

标题: 一道比较不错的初级练习题. [打印本页]

作者: ㄒんeゞSeven    时间: 2013-11-15 21:05
标题: 一道比较不错的初级练习题.
题目: 输入一个日期,根据这个日期排列出其所在本周的日期.如有更好的方法,欢迎讨论.
[hide=d9999]import java.util.Scanner;
import java.util.Calendar;

/*
输入一个日期,根据这个日期排列出其所在本周的日期.
*/
public class CalendarTest1{
    public static void main(String[] args){
        int infoDay;//输入日
        int infoMonth; //输入月
        int infoYear;//输入年
        int week;//获取星期
        Calendar day = Calendar.getInstance();//创建日历对象
        Scanner input = new Scanner(System.in);
        //获取日期
        System.out.print("输入年份: ");
        infoYear = input.nextInt();
        System.out.print("输入月份: ");
        infoMonth = input.nextInt();
        System.out.print("输入日期: ");
        infoDay = input.nextInt();

        day.set(infoYear, infoMonth-1, infoDay);//向日历对象储存获取到的日期
        week = day.get(Calendar.DAY_OF_WEEK)-1;//返回输入日期的星期数
        /*
          计算排列,输入日期所在本周的日期
        */
        infoDay = infoDay-week;
        //如果输入的星期数是星期7
        if(week == 0){
            infoDay = infoDay - 7;
        }
       
        for(; week-7 <= 7; week++){
            if((week-7)>0){
                infoDay++;
                System.out.println(infoYear + "年" + infoMonth + "月" +infoDay + "日: 星期" + (week-7) + "\t");
            }
        }
    }
}[/hide]


QQ截图20131115205842.png (28.93 KB, 下载次数: 51)

输出结果

输出结果

作者: 寻丶丶觅    时间: 2013-11-15 21:27
看看  隐藏的什么?
作者: 王裕秋    时间: 2013-11-15 22:04
:handshake
作者: 天ya~_琼楼    时间: 2013-11-15 23:13
看看好玩不
作者: 黑马戴帅军    时间: 2013-11-15 23:38
知识看看那
作者: 天ya~_琼楼    时间: 2013-11-15 23:43
楼主的方法思路挺好,调用了Java中日历类的方法,计算输出也挺准确。
但是存在一个漏洞:那就是月份、日期没有限制,比如输入13月也可以运行,56日也能计算。
楼主在存储日期前可先进行判定,看输入的日期是否合法,也可声明异常让用户输入正确的日期。
而且如果输入日期是在月初或者月末返回的七天中日期会越界,甚至出现负数日期。
这方面需要很多计算,每个月天数不同,例如遇到2月份还要计算是否是闰年。
我还没有接触过日历中的方法,对其功能不了解,不知道它能否直接给于年月日的计算来返回正确的日期值。以上仅为个人看法,希望楼主加油,早日解决。

QQ截图20131115233119.png (3.15 KB, 下载次数: 60)

输入日期不合法

输入日期不合法

QQ截图20131115170523.png (3.1 KB, 下载次数: 50)

计算日期越界

计算日期越界

QQ截图20131115233041.png (3.02 KB, 下载次数: 50)

日期没有返回上一个月

日期没有返回上一个月

QQ截图20131115233107.png (3.12 KB, 下载次数: 48)

输入日期不合法

输入日期不合法

作者: 张鹏_2013    时间: 2013-11-16 02:11
看看是什么。
作者: 马明杨    时间: 2013-11-16 08:36
回复可见
作者: ㄒんeゞSeven    时间: 2013-11-16 23:11
本帖最后由 ㄒんeゞSeven 于 2013-11-16 23:13 编辑
天ya~_琼楼 发表于 2013-11-15 23:43
楼主的方法思路挺好,调用了Java中日历类的方法,计算输出也挺准确。
但是存在一个漏洞:那就是月份、日期 ...

万分感谢! 我已经把代码修改了.
1,输入日期是否合法的问题,就如你所说,用异常很容易就能处理了, 这里就不做修改了
2,针对输出日期出现负数的问题,我修改的代码如下.
import java.util.Scanner;
import java.util.Calendar;

/*
输入一个日期,根据这个日期排列出其所在本周的日期.
*/
public class CalendarTest1{
    public static void main(String[] args){
        int infoDay;//输入日
        int infoMonth; //输入月
        int infoYear;//输入年
        int week;//获取星期
        int infoDayC; //返回输入日期所在月的前一个月的天数
        Calendar day = Calendar.getInstance();//创建日历对象
        Calendar c = Calendar.getInstance(); //创建输入日期所在月的前一个月的日历对象
        Scanner input = new Scanner(System.in);
        //获取日期
        System.out.print("输入年份: ");
        infoYear = input.nextInt();
        System.out.print("输入月份: ");
        infoMonth = input.nextInt();
        System.out.print("输入日期: ");
        infoDay = input.nextInt();

        day.set(infoYear, infoMonth-1, infoDay);//向日历对象储存获取到的日期
        week = day.get(Calendar.DAY_OF_WEEK)-1;//返回输入日期的星期数
        /*
         计算排列,输入日期所在本周的日期
        */
        infoDay = infoDay-week;
        c.set(infoYear, infoMonth-2, 1);//储存输入日期所在月的前一个月的开始日期.
        //如果输入的星期数是星期7的情况
        if(week == 0){
            infoDay = infoDay - 7;
        }
        //记录输入日期所在星期一的日期是前一个月的
        infoDayC = c.getActualMaximum(Calendar.DAY_OF_MONTH)+infoDay;
        int temp =0;//用于输出 客户输入日期所在月的第一天
        for(; week-7 <= 7; week++){
            if((week-7)>0){
                //如果infoDay<1 说明出现日期所在星期跨月的情况
                if(infoDay < 1){
                    //处理跨月后日期错误
                    if(infoDayC > c.getActualMaximum(Calendar.DATE)){
                        temp++;
                        System.out.println(infoYear + "年" + infoMonth + "月" + temp + "日: 星期" + (week-7) + "\t");
                    }else{
                        infoDayC++;
                        System.out.println(infoYear + "年" + (infoMonth-1) + "月" +infoDayC + "日: 星期" + (week-7) + "\t");
                    }
                }else{
                     infoDay++;
                     System.out.println(infoYear + "年" + infoMonth + "月" +infoDay + "日: 星期" + (week-7) + "\t");
                }
            }
        }
    }
}


我也是初学者, 想到这里已经是极限了, 算法确实有点复杂, 期待简化或更好的算法.






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