ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:kingkong10 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月以降のデータもご指示いただければすぐにご用意いたします。
質問投稿日時:08/04/21 21:51
質問番号:3965914
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:yama5140 >まずはテキストデータを作成しまして、   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 );
}
注:インデントに全角空白を用いています。
  タブに一括変換して下さい。
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/22 15:12
回答番号:No.3
この回答へのお礼わかりやすい解説つきのソースをいただきましてありがとうございました。
おかげさまで 理解をした上での解決をすることができました。
ありがとうございました。

回答

良回答10pt

回答者:yuu_yuu #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");//改行
 }
}

ちなみに、コンパイル環境ないのでコンパイルすら通してません;;
急いで書いたからバグあるかもしれないので、
意味合いだけ読み取って、適切な変換お願いします!!
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/04/22 00:13
回答番号:No.2
この回答へのお礼おお なんかピンときました。
おかげさまで解決できました。これからも精進してまいります。

回答

 

回答者:yuu_yuu う〜ん。。。
>>のようにしたいのですがうまくいきません。
何がうまくいかないのでしょうか??

上に書いてあるデータはテキストファイルと推測して
処理の大雑把な順番として、
1、ファイルからのデータの読み込み
2、読み込んだデータをテーブルに格納
3、格納したテーブル内容の表示
と思いますが、どの部分の何でつまづいているのでしょうか?

範囲が広すぎて回答つけるのが難しい(大変)です。
全部だったりして^^;
種類:補足要求
どんな人:一般人
自信:参考意見
回答日時:08/04/21 22:32
回答番号:No.1
この回答への補足恐れ入ります 文字数の都合上はしょってしまいました。
まずはテキストデータを作成しまして、
fgetsコマンドより1行丸まる吸い出して
画面に出力しようとしたのですが、2月3月が1がつとかぶってしまいました。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示