• ベストアンサー

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月以降のデータもご指示いただければすぐにご用意いたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 ); } 注:インデントに全角空白を用いています。   タブに一括変換して下さい。

kingkong10
質問者

お礼

わかりやすい解説つきのソースをいただきましてありがとうございました。 おかげさまで 理解をした上での解決をすることができました。 ありがとうございました。

その他の回答 (2)

  • yuu_yuu
  • ベストアンサー率41% (34/81)
回答No.2

#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");//改行  } } ちなみに、コンパイル環境ないのでコンパイルすら通してません;; 急いで書いたからバグあるかもしれないので、 意味合いだけ読み取って、適切な変換お願いします!!

kingkong10
質問者

お礼

おお なんかピンときました。 おかげさまで解決できました。これからも精進してまいります。

  • yuu_yuu
  • ベストアンサー率41% (34/81)
回答No.1

う~ん。。。 >>のようにしたいのですがうまくいきません。 何がうまくいかないのでしょうか?? 上に書いてあるデータはテキストファイルと推測して 処理の大雑把な順番として、 1、ファイルからのデータの読み込み 2、読み込んだデータをテーブルに格納 3、格納したテーブル内容の表示 と思いますが、どの部分の何でつまづいているのでしょうか? 範囲が広すぎて回答つけるのが難しい(大変)です。 全部だったりして^^;

kingkong10
質問者

補足

恐れ入ります 文字数の都合上はしょってしまいました。 まずはテキストデータを作成しまして、 fgetsコマンドより1行丸まる吸い出して 画面に出力しようとしたのですが、2月3月が1がつとかぶってしまいました。

関連するQ&A

専門家に質問してみよう