- ベストアンサー
C言語でうまく組めません。
恐れ入ります。C言語の勉強を今している者です。 ひとつ大きな難問に出会ってしまい困っています。ご教授ください。 カレンダーの問題です。 西暦で4桁 一ヶ月を42コマ用意します。 そして日曜日からはじまり月曜日で終わります。 たとえば2009年で考えますと(3ヶ月分のデータです) 2009 000000000102030405060708091011121314151617181920212223242526272829303100000000000000 010203040506070809101112131415161718192021222324252627280000000000000000000000000000 010203040506070809101112131415161718192021222324252627282930310000000000000000000000 2文字づつ拾って"00"の時はスペースを入れ、カレンダーを作成するプログラムを作成しようとしています。 DOS画面で表示される時は 2009年カレンダー 1月 2月 3月 4月 6月 7月 8月 9月 10月 11月 12月 13月 のようにしたいのですがうまくいきません。 どなたかご教授ください。4月以降のデータもご指示いただければすぐにご用意いたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>まずはテキストデータを作成しまして、 1. >fgetsコマンドより1行丸まる吸い出して 2. >画面に出力しようとしたのですが、 3. >2月3月が1がつとかぶってしまいました。 1.2.はできたのですね。 2.3.のソースを補足して頂くと早く解決するかも・・。 >そして日曜日からはじまり月曜日で終わります。 (週2日のカレンダー?) そして月曜日からはじまり日曜日で終わります。 の単純ミスですよね。 > 1月 2月 3月 > 4月 6月 7月 > 8月 9月 10月 >11月 12月 13月 5月の代わりに、13月??? ★些末なミスに気づかない → ちょっと心配 >ひとつ大きな難問に出会ってしまい困っています。 ★もう習得したであろう for 文だけで実現できるよ・・。 ・どこに「月のタイトルを表示する」部分を入れるかは、考えて。 ・「年」レコードがある場合は、while の前に fgets ---------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> /* データ(12レコード) 000000000102030405060708091011121314151617181920212223242526272829303100000000000000 010203040506070809101112131415161718192021222324252627280000000000000000000000000000 010203040506070809101112131415161718192021222324252627282930310000000000000000000000 ・ (略) ・ として */ void main() { FILE *fp; int iLine = 0, m, k, n, j; char cBuf[128], cStore[12][128]; fp = fopen( "Z:\\Test.txt", "r" ); if( fp == NULL ) exit( 0 ); while( NULL != fgets( cBuf, 128, fp ) ){ strcpy( cStore[iLine++], cBuf ); } if( 12 != iLine ) exit( 0 ); for( m = 0; m < 12; m += 3 ){ // 1月から12月(縦) for( n = 0; n < 42; n += 7 ){ // 1コマから42コマ(縦) for( k = m; k < ( m + 3 ); k++ ){ // 3ケ月(横) for( j = n; j < ( n + 7 ); j++ ){ // 1週間(横) if( ( '0' == cStore[k][j*2] ) && ( '0' == cStore[k][j*2+1] ) ){ cStore[k][j*2 ] = ' '; cStore[k][j*2+1] = ' '; } printf( "%c%c", cStore[k][j*2], cStore[k][j*2+1] ); } printf( " " ); // 月と月の間 } printf( "\n" ); // 週の改行 } printf( "\n" ); // 3ケ月の改行 } fclose( fp ); } 注:インデントに全角空白を用いています。 タブに一括変換して下さい。
その他の回答 (2)
- yuu_yuu
- ベストアンサー率41% (34/81)
#1です。 そこですか^^ 一番早いのは、全データメモリに読み込んで、 1月の1週、2月の1週、3月の1週と処理してしまうのが簡単と思います。 テーブルに格納するときはCalendar[i][j]=(char)atol(抜き出した2バイト); 表示するときはprintf("%02d",Calendar[i][j]);を使用する事を前提。 考え方は2通り、 1、テキストから読み込むときに、苦労する方法。 (テキストを読み込んで表示する順序にテーブルに格納する) char Calendar[24][21];と用意して 1月の1週を[0][0]~[0][6] 1月の2週を[1][0]~[1][6] : 1月の6週を[5][0]~[5][6] 2月の1週を[0][7]~[0][13] 2月の2週を[1][7]~[1][13] : 2月の6週を[5][7]~[5][13] : : 12月の1週を[18][14]~[18][20] 12月の2週を[19][14]~[19][20] : 12月の6週を[23][14]~[23][20] と格納し、順番に表示する。 2、テーブルから読み出すときに、苦労する方法。 (テキストから読み込んだイメージでそのままテーブルに格納し、 表示するときに工夫する) char Calendar[12][42];と用意し // 12ヶ月を3ヶ月づつ表示するので4回ループ for( i = 0; i < 4; i++ ) { //スイッチ文の記述方法忘れました^^; if(i==0) printf(" 1月 2月 3月\n"); if(i==1) printf(" 4月 5月 6月\n"); if(i==2) printf(" 7月 8月 9月\n"); if(i==3) printf("10月 11月 12月\n"); //1ヶ月6週間 for( j = 0; j < 6; j++ ){ // 左(1月、4月、7月、10月) for( k = 0; k < 7; k++ ){ if(Calendar[i*3][j*7+k]==0){ printf(" ");//スペース表示 }else{ printf("%02d ",Calendar[i*3][j*7+k]); } } // 中(2月、5月、8月、11月) for( k = 0; k < 7; k++ ){ if(Calendar[i*3+1][j*7+k]==0){ printf(" ");//スペース表示 }else{ printf("%02d ",Calendar[i*3+1][j*7+k]); } } // 右(3月、6月、9月、12月) for( k = 0; k < 7; k++ ){ if(Calendar[i*3+2][j*7+k]==0){ printf(" ");//スペース表示 }else{ printf("%02d ",Calendar[i*3+1][j*7+k]); } } printf("\n");//改行 } } ちなみに、コンパイル環境ないのでコンパイルすら通してません;; 急いで書いたからバグあるかもしれないので、 意味合いだけ読み取って、適切な変換お願いします!!
お礼
おお なんかピンときました。 おかげさまで解決できました。これからも精進してまいります。
- yuu_yuu
- ベストアンサー率41% (34/81)
う~ん。。。 >>のようにしたいのですがうまくいきません。 何がうまくいかないのでしょうか?? 上に書いてあるデータはテキストファイルと推測して 処理の大雑把な順番として、 1、ファイルからのデータの読み込み 2、読み込んだデータをテーブルに格納 3、格納したテーブル内容の表示 と思いますが、どの部分の何でつまづいているのでしょうか? 範囲が広すぎて回答つけるのが難しい(大変)です。 全部だったりして^^;
補足
恐れ入ります 文字数の都合上はしょってしまいました。 まずはテキストデータを作成しまして、 fgetsコマンドより1行丸まる吸い出して 画面に出力しようとしたのですが、2月3月が1がつとかぶってしまいました。
お礼
わかりやすい解説つきのソースをいただきましてありがとうございました。 おかげさまで 理解をした上での解決をすることができました。 ありがとうございました。