2012-03-24 17 views
0

説明:START_GREGORIAN_CALENDARの後の日付を指定すると、この関数は次の木曜日までの日数を返します。例えば、2011年3月16日(2011,3,16)のために、関数は1を返し、2011年3月17日(2011,3,17)のために、機能は7私の日付コードに何か問題がありますか?

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

コードのコンパイルを戻します正しく、しかし、私は日付を入力すると、例えば16 3 2011、私は正解を得ていません。 これは私が書いたより大量のコードで、完全に動作します。

+0

あなたの例でもそれがどのように機能するのか分かりません。 daysToNextThursday(2011、3、17)は木曜日(7)から日(17)を返します。 7 - 17 = -10ではなく、7 - – Nikolay

+0

あなたが提供している小さなコードで何をしているのか正確に伝えるのは難しいですが、もちろん、 'day'がその日であれば' Thursday-day'は間違っています今週の曜日ではなく月の... – jamesdlin

+0

これは宿題だと思いますか?もしそうなら、宿題タグをこの質問に追加してください。それに加えて、アルゴリズムは単純に欠陥がある。各変数がどのような役割を果たしているか考え直すことができます。 – Bart

答えて

0

はい、私は考えがあります。私の考えは、あなたが戻ってあなたが選択したアルゴリズムが木曜日であることを決定するために再考することです。それは間違って死んだ:-)

今は、1日2回右のような壊れた時計のように、あなたは正しい答えを与える入力パラメータを見つけるかもしれませんが、それらはルールではなく例外になります。あなたは次木曜日は、指定した日付からあるときに把握したい場合は

、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++) { 

を、それだけでパラメータを取得し、ループを開始しています。計算の肉は以下の通りです。有用な数値を設定し、年月日を強制的に入力してください。次にmktimetm_wday(曜日)欄に記入し、それを木曜日までの日数を調べるために使用することができます。 、あなたがより読みやすいソリューションが必要な場合

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

:単に私たちに次の表に基づいて日数を与えるために使用されます - thursday計算はモジュラス詐欺のビットであることを

 // 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; 
} 

注意あなたが使用することができます。

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 
関連する問題