2012-03-24 54 views
0

說明:給定START_GREGORIAN_CALENDAR之後的日期,此函數返回到下一個星期四的天數。例如,對於2011(2011,3,16)3月16日,則該函數將返回1,而對於17 2011年3月(2011,3,17),該函數將返回7.我的日期代碼有問題嗎?

int daysToNextThursday (int year, int month, int day) { 
    int Thursday; 
    Thursday = 7; 
    return (Thursday - day); 
} 

代碼編譯正確,但是當我輸入一個日期,例如2011年6月3日,我沒有得到正確的答案。 請注意,這是我編寫的大量代碼的一部分,完美地工作。

任何想法?

+0

我不明白它是如何工作的,甚至你的例子。 daysToNextThursday(2011,3,17)週四(7)減去日(17)。 7 - 17 = -10,而不是7 – Nikolay 2012-03-24 06:57:30

+0

很難告訴你與你提供的東西少的代碼做什麼,但當然'週四 - day'將是錯的,如果'day'是天而不是一週中的某一天... – jamesdlin 2012-03-24 06:57:33

+0

我猜這是作業嗎?如果是這樣,請將作業標籤添加到此問題。除此之外,算法是有缺陷的。你可能想重新思考每個變量扮演的角色。 – Bart 2012-03-24 07:09:54

回答

0

是的,我有一個想法。我的想法是,你回去重新思考你選擇的算法來確定一天是星期四。這是大錯特錯了:-)

現在,像斷線的時鐘是正確的,一天兩次,你可能會發現輸入參數給你正確的答案,但他們會是例外,而不是規則。

如果你想弄清楚的時候,下週四是從給定日期,C提供日期和時間功能,正是出於這個目的:

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <time.h> 

static char *textday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; 

int main (int argc, char *argv[]) { 
    int year, month, day, today, thursday; 
    struct tm *mytm; 
    time_t mytime; 

    // Get all arguments (minimal error checks). 

    if (argc != 3) { 
     printf ("Usage: next_thursday <year> <month>\n"); 
     return -1; 
    } 
    year = atoi (argv[1]); 
    month = atoi (argv[2]); 

    // Do first fourteen days of the month. 

    for (day = 1; day <= 14; day++) { 

直到有,它只是越來越參數和啓動循環。計算的結果如下,建立一個有用的struct tm,然後強制我們的年,月和日進入它。然後mktime將填寫我們的tm_wday(星期幾)字段,我們可以使用它來計算直到星期四的天數。

 // Make the tm structure based on date (and midday). 

     mytime = time (0); 
     mytm = localtime (&mytime); 
     mytm->tm_year = year - 1900; 
     mytm->tm_mon = month - 1; 
     mytm->tm_mday = day; 
     mytm->tm_hour = 12; 
     mytime = mktime (mytm); 

     // Output filled in fields and days till next Thursday. 

     today = mytm->tm_wday; 
     thursday = (11 - today) % 7; 
     if (thursday == 0) 
      thursday = 7; 
     printf ("%04d-%02d-%02d, weekday = %d (%s), days till Thu = %d\n", 
      mytm->tm_year + 1900, mytm->tm_mon + 1, mytm->tm_mday, 
      today, textday[today], thursday); 
    } 

    return 0; 
} 

注意,thursday計算是位模數弄虛作假的 - 它只是用來給我們幾天的基於下表上的數字:

today thursday 
------- -------- 
0 (sun)  4 
1 (mon)  3 
2 (tue)  2 
3 (wed)  1 
4 (thu)  7 
5 (fri)  6 
6 (sat)  5 

如果你想要一個更可讀的解決方案,你可以使用:

if (today < 4) thursday = 4 - today; 
else   thursday = 11 - today; 

該程序輸出爲2011-03如下:

2011-03-01, weekday = 2 (Tue), days till Thu = 2 
2011-03-02, weekday = 3 (Wed), days till Thu = 1 
2011-03-03, weekday = 4 (Thu), days till Thu = 7 
2011-03-04, weekday = 5 (Fri), days till Thu = 6 
2011-03-05, weekday = 6 (Sat), days till Thu = 5 
2011-03-06, weekday = 0 (Sun), days till Thu = 4 
2011-03-07, weekday = 1 (Mon), days till Thu = 3 
2011-03-08, weekday = 2 (Tue), days till Thu = 2 
2011-03-09, weekday = 3 (Wed), days till Thu = 1 
2011-03-10, weekday = 4 (Thu), days till Thu = 7 
2011-03-11, weekday = 5 (Fri), days till Thu = 6 
2011-03-12, weekday = 6 (Sat), days till Thu = 5 
2011-03-13, weekday = 0 (Sun), days till Thu = 4 
2011-03-14, weekday = 1 (Mon), days till Thu = 3