2010-09-01 41 views
4

我必須用C語言編寫一個程序,該程序給定一天的名字,返回本月的所有日期。如何才能找出本月某一天的所有日期?

例如,如果輸入的是「星期日」的輸出應該是:5,12,19,26(這是日(星期日)將在本月底。)

是否有任何人有任何想法如何做到這一點?我嘗試了很多。

+5

您可以告訴我們您嘗試過什麼,以便我們更輕鬆地爲您提供幫助。 – 2010-09-01 12:30:29

+0

@ prateeksaluja20僅僅是當前月份,還是需要一個月份名稱作爲輸入? – Stephen 2010-09-01 12:34:07

+0

它只會顯示 當前月份的日期。 – PrateekSaluja 2010-09-01 12:40:01

回答

2

您可以使用time()函數獲取當前時間。

然後使用localtime()函數獲取包含當前時間的信息(年,月,日,...)的struct(struct tm)。

從「struct tm」獲取tm_mday和tm_wday。使用這些字段來確定下一個或上一個星期日。例如如果tm_mday是12,而tm_wday是3(星期三),那麼我們現在是本月9號是星期日(12-3 = 9)。從這個數字簡單地加上或減去7來獲得所有其他星期日。

+0

的#include 的#include 的#include 無效的主要() { 結構TM * Sys_T = NULL; time_t currenttime; currenttime = time(NULL); Sys_T = localtime(&currenttime); Day = Sys_T-> tm_mday; printf(「%d」,currenttime); getch(); } 我正在試圖獲取系統日期。 但在第一天出現錯誤。 如何閱讀日子? – PrateekSaluja 2010-09-01 13:01:45

+0

你會得到什麼錯誤?我看到那天並沒有被定義。 – Patrick 2010-09-01 15:35:17

1

你也需要知道它給定的一年嗎?或者這僅僅是今年?如果你需要知道它的任何一年,你可以做一個「每月幾天」的枚舉,有一個爲閏年,一個爲非閏年。

你只需要知道在一週中的哪一天開始一年(即:「星期一」,「星期二」,等等)

你,至少,對任何給定的每月5日,所以,你可以有一個固定長度的整數數組。

你知道公曆不斷重複每個年,並且,如果X年開始一天「Y」,那麼,今年X + 1將一天開始(「Y」 + 1) %7如果x不是閏年,如果是閏年,則以天(「Y」+ 2)開始。 可以給你任何一年的第一次約會,並且知道任何一年的所有月份有多少天,你可以很容易地得到該月份的開始日期(「星期一」等)。

然後,所有你需要做的,是一樣的東西

int offset = 0; 
int i; 
while (myDate + offset != monthStartingDate) { 
    offset++; 
} 
i = offset + monthStartingDate; 

(指明MyDate是星期幾的數量,並且monthStartingDate是星期幾的該月的第一天數)

當你走出那個循環時,你將會有第一次發生,然後,你只需加7,直到我超出月份界限。

您可以將每個我入陣..

int res[5] = {0,0,0,0,0} 

for (; i < daysOfMonth(month, year); i += 7) { 
    int res[i/7] = i; 
} 

,那麼你只返回水庫。

哦,我dind't知道你能使用最新功能:PI想鍛鍊; Tibial的想法練C:從輸入P

+0

Bu,當我寫回答的時候,問題是另一回事。這就像「給予一個月和一週的一天......」Blah。 – Marco 2010-09-01 12:59:05

1

1)取一個字符串(工作日名稱)(使用2)將它轉換爲一個數字(使用循環和strcmp在平日表格中找到它的索引),將0分配給星期天,1分配給星期一...

3)獲取當前時間time功能,並將其與localtime功能

4)轉換爲tm結構從tm結構計算的第一天,在給定工作日的當月

first_mday_of_given_wday = (tm_struct.tm_mday + given_wday - tm_struct.tm_wday + 6) % 7 + 1 

5)查明當前有多少天。要做到這一點:

  • 把1到tm_mday和0到您的tm結構
  • tm_isdst複製結構的重複(看上個月的1 tm_mon
  • 增加,這種情況下,增加tm_year!由圖1和設置tm_mon爲1)
  • 轉換展臺strutcs到time_tmktime功能和計算差(只是減去這些time_t值),從秒轉換結果到幾天(除以b收率60 * 60 * 24)

6)運行的環路雖然計算範圍:

for (i = first_mday_of_given_wday; i <= num_days_in_month; i += 7) printf("%d, ", i) 

第五步驟可以在某些情況下被省略。我們知道一個月可以有28到31天。如果當月的任何假設天數29,30,31不能爲給定的工作日,我們可以假設當前月份有28天。
所以簡單 - 假設first_mday_of_given_wday大於3,我們在本月有28天,否則計算如第5步所示的數字。

相關問題