天天看点

《C语言及程序设计》实践参考——玩转日期和时间

【项目2-玩转日期和时间】

定义一个表示时间(包括年、月、日、时、分、秒)的结构体,然后完成下面的功能。

提示:将各个功能分别设计成函数实现,在main函数中调用,进行测试。可以设计一个函数,即刻进行测试,以降低复杂度。

要实现的功能是:

(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;

(2)输出该日在本年中是第几天(注意闰年问题);

(3)输出这是这一天中的第几秒;

(4)输出这是这一年中的第几秒;(不要认为这个数荒唐,在计算中需要取随机数时需要一个不会重复的“种子数”,这个秒数是常用的。)

(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出。

[参考解答]

  最后编好的程序的结构应该如下所示,其中所需要设计,一是存储数据所用的数据结构——结构体,二是整个程序的框架,除了main()函数之外,还要有一系列的其他函数作为支撑。在严格的软件工程中,需要提前将所需要的函数(工程中称之为模块)设计出来,而在学习语法阶段,不妨也便宜行事,需要什么写什么,这样做更快一些。在此基础上,main()函数只要按照题目中的要求,或输入,或调用函数,逐个地写出来即可。

  所以,这个程序最后的结构会是:

  胖子是一口一口吃出来的,程序得一点一点写出来,做一些,就测试一点,保证局部不要出问题。不要妄图全写完了才去测试,医生说食物摄取过量,老百姓讲是吃撑了。

  在这样一种指导思想下,先完成第(1)个要求,主要是写出自定义函数来。将需要多次用到的功能,例如,输入中要保证范围的要求,也“抽象”一下,做成函数getnum()。不少成员的取值范围是确定的,但每月的天数并不都一样有些麻烦,设计一个函数daysofmonth()实现,将有利于整个程序的简洁。

  参考代码可以如下:

  从做练习的角度,程序就是完成了。要完成测试,关键是保证输入时数据取值范围是否能够得到保证,于是需要多次地启动程序,输入各种不同的时间,看是否能体现设计时的限制。需要考虑到的情形包括:

2013年1月20日3时4分5秒 //中规中矩的输入

2012年3月31日3时4分5秒 //重点考察取日期的“边界值”是否接受,类似地可以用其他月份检查,还可以设计出多种情形

……

2013年2月29日3时4分5秒 //2013不是闰年,这个输入会如何处理

2012年2月29日3时4分5秒 //2012是闰年,这个输入会如何处理

2013年13月45日33时4分5秒 //各种的“捣乱”,这在测试中是必须的

  通过这样的多次运行多次输入查看结果是可行的。但是,如果考虑一次运行程序,可以支持多次输入对不同情形进行测试,那自然是更方便的事了。其实,写一个循环,那也不是难事。事实上,这是工程中更常用的方式。

  在这种思路下,main()函数这样写。

  这只是测试所需要的一部分内容。这样测试出的程序,质量信心必涨!好产品得经过严格的测试,放在程序设计中也是这样。

  实现功能角度,增加一个函数dayofyear()即可。涉及到测试时,要靠着键盘输入,那可就烦恼大了:改一点程序,输入若干数据测试,发现错误,改程序,再运行,输入测试数据。这时,可以采用的方法是,用测试用到的数据直接初始化结构体。再进一步,一组测试数据,一起测试,用结构体数组保存数据,测试过程做一个循环。

  实现了的函数和测试用的main()函数如下所示,实现任务(1)中的函数保留不动,它们是整个任务中的一部分,况且(2)任务可能会用到前面的劳动成果,删除不必要。

  参考程序如下:

  体会上面测试数据设计和测试程序(main()函数)设计中的用心,查看运行测试的结果,生产好产品,需要这样做。

  只需要增加一个自定义函数

  请体会上面的测试数据的设计,也可以设计出更好的来

  关于实现功能而言,主体在time afterdays(struct time t,int d)函数,这个求解有些麻烦,但是采用的算法统一从1月0日开始的思路,还是可以将复杂性降下来一些。

在以上对函数的详细测试基础上,完成本项目中的工作,只需要下面的mian函数:

int main()

{

struct time t,nt;

//(1)输入一个时间(注意各部分数据的取值范围)将输入的时间保存在一个结构体变量中;

printf(“请输入一个时间(包括年,月,日,时,分,秒):\n”);

gettime(&t);

outputtime(t);

//(2)输出该日在本年中是第几天(注意闰年问题);

printf(“这是这一年中的第%d天。\n”, dayofyear(t));

//(3)输出这是这一天中的第几秒;

printf(“这是这一天中的第%d秒。\n”, secondofday(t));

//(4)输出这是这一年中的第几秒;

printf(“这是这一年中的第%d秒。\n”, dayofyear(t)*24*3600+secondofday(t));

//(5)求你输入的时间d天后是哪年哪月哪日,将结果保存在一个结构体变量中输出;

int d;

printf(“请输入一个天数: “);

scanf(“%d”, &d);

nt=afterdays(t,d);

printf(“再过%d天, “, d);

outputtime(nt);

return 0;

}

“`

继续阅读