2011-12-25 19 views
0

無能を無視してください!C - 年Xから年Yまでの全ての日付を計算する

実際にいくつかの基本的なファイルを混乱させていますが、実際にはいくつかのネストされたループでは出力されませんが、私はそれを動作させることはできません。

#include <stdio.h> 

int main(void) { 
FILE *pFile; 
pFile = fopen("dates.txt", "w"); 
int day, month, year; 
for(day = 1; day <= 31; day++) { 
for(month = 1; month <= 12; month++) { 
    for(year = 1900; year <= 2050; year++) { 
if(day < 10 && month < 10) { 
    fprintf(pFile, "0%d/0%d/%d\n", day, month, year); 
}else { 
    fprintf(pFile, "%d/%d/%d\n", day, month, year); 
} 
    } 
} 
} 
return 0; 
} 

そして頭を上げると、これは宿題の仕事ではなく、ほんのいくつかの実験です。

乾杯。

+0

'pFile'を解放することを忘れないでください。 – Aan

+1

'%02d'をフォーマット仕様として試してみると、途中に' if'が保存されます。 – Mat

+2

@Adban: 'free()'?あなたはおそらく 'fclose()'を念頭に置いています。いい視点ね。 –

答えて

0

月ループの前の月ループの前に年ループが必要です(現在の順序の逆)。

閏年のルールを知る必要がある(1900年はうるう年、ペースMS Excel、2000年ではなかったことを指摘してください)

あなただけの単一printf()文を必要とするので、あなたは、月と日の2桁の数字を印刷する%02dまたは%.2dを使用することができます。

1

をあなたが実際にあなたがたりないかもしれない接頭月に日と月の4つの組み合わせを持つことができます0を指定します。他の場合は1つで処理しようとしています。

ケース1:曜日と月ともに< 10、最初のifで処理されます。

ケース2:日> 10月< 10、非取り扱い

ケース3:日< 10月> 10、非取り扱い

ケース4:両方とも> 10.で処理されelse。

%02dは、すべてのケースを処理するオプションです。

3

mktimeを使用して日付を作成できます。その後、1日追加して次の日付を作成します。 この方法で、繰り返し実行できます。

次のコードは最初の200個の日付を示しています。 epoch背後日数を働くことところで

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

int main(){ 
    struct tm *lt; 

    int i=200; 

//time_t t=0; // first second on epoch 
    time_t t=-2209010000; // first second on 1900 (works on GCC, dind't test MSVS compiler) 

    while(i--){ 
     lt = localtime(&t); 
     printf("YYYY:MM:DD = %04d:%02d:%02d\n", lt->tm_year+1900, lt->tm_mon+1,  lt->tm_mday); 
     lt->tm_hour+=24; // adding 24 hours 
     t = mktime(lt); 
    } 
    return 0; 
} 

。少なくとも私のgcc version 4.4.3x86_64 GNU/Linux

+0

エポックが問題になる前に、日付があまりにも遠すぎると、特に32ビットシステムで、1901年12月13日金曜日に戻ってくることがあります(いくつか不運です!)。同様に前進しています。 32ビットシステムは、1970年1月1日00:00:00 + 00:00の時代を経て、2038年1月に蒸気を使い果たします。必要な範囲(1900〜2050)はこれらの制限を超えています。 64ビットシステムでは、うまくいくかもしれません。 –

+0

@JonathanLeffler更新を参照してください。それは1900年の日付を示しています。それは64ビットLinuxに起因するのでしょうか?私はわかりません。私のシステムはすべて64ビットです。 –

+0

はい - MacOS Xのような64ビットシステムは、1 AD(CE)に向かって(1を超えて)後方に細かく動作し、9999 AD(CE)を超えて転送します。 32ビットシステムは、エポックのいずれかの側に±68年(1ヶ月程度与えてください)に制限されています。私が'32ビットシステム 'と言うとき、私は 'time_t'が32ビットの符号付きタイプ(ほとんどの32ビットシステムの場合)であるシステムを意味します。 –

関連する問題