天天看點

《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;

}

“`

繼續閱讀