万年カレンダー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アイリ

万年カレンダー

#1

投稿記事 by アイリ » 16年前

初めまして、アイリと申します
4月より専門学校に通い、プログラムの勉強をしているC言語初心者です

現在学校の課題で「万年カレンダー」の製作をしています
明日提出なのですがどうしてもわからないところがあるので
こちらで質問をさせていただきます

仕様は4つの関数利用しmainにて呼び出しというもので
4つの関数は
1、年月入力処理関数
  表示する年、月を入力する
  数字以外、1583年~3999年の範囲外、1月~12月の範囲外の場合再入力を促す
2、日付文字列編集関数
  課題用の関数で入力された年月を文字列へ変換する処理
3、曜日計算処理
  ↑の関数から受け取った文字列を数字へ変換し、
  ゼラーの公式(ツェラー?)で計算し1~6までの数字を返す
4、カレンダ表示データ編集関数
  与えられた年月のカレンダ表示用文字列を
  グローバル変数 char D_date[15][80]に設定する

わからないのは最後の4の関数で現在は
char D_date[15][80];   //グローバル変数宣言
     ・
     ・
void cal_edit (int year, int month, int dayofweek)
{
	int dm, i , j, a = 1;
     ・
     ・
    閏年、月の日数等の分岐
    表示日数をdmに格納する  [例] 2月の閏年→ dm = 29;
     ・
     ・
	printf("日 月 火 水 木 金 土\n");  //曜日の表示
	
	while( a <= dm ){
               for(i = 0 ; i < 15 ; i ++){
		for( j = 0 ; j < 7 ; j++ ){
		    D_date[j] = a ;   // D_dateに日数を格納
			a ++ ;
	          }
	       }
	}
 }
}


このような感じに・・・
1日の前に空白を入れなければいけないのはわかりますが
やり方がいまいちわかりません
上記のやり方では文字化けをおこしてしまいます
わからないのは
・空白の入れ方
・配列への日付の入れ方
・表示
です。

学校では「独習C」という本を使い勉強していて
現在、基礎、制御文、配列、文字列、ポインタまでは終わっています(6章まで)

急ではあると思いますがどうかよろしくお願いします!

ねこ

Re:万年カレンダー

#2

投稿記事 by ねこ » 16年前

文字の追加的処理みたいなので追加のstrcatを使います。

・空白の入れ方
D_date[j] = ' ';
または
strcat( D_date, " " );

・配列への日付の入れ方
char cTemp[ 16 ] = "";
sprintf( cTemp, "%d", a );
strcat( D_date, cTemp );

・表示
for( int i = 0; i < 15; i++ )
 printf( "%s\n", D_date;

アイリ

Re:万年カレンダー

#3

投稿記事 by アイリ » 16年前

ねこさん、回答ありがとうございます

日付の方なのですが
カレンダーなので日~土までの曜日位置に
数字を合わせなければいけませんし、
上記のやり方では1~dmまでの数値が横並びで表示されてしまいます

私の仕方が悪いだけかもしれないのですが
もう少し詳しくお願いできないでしょうか?

ねこ

Re:万年カレンダー

#4

投稿記事 by ねこ » 16年前

前回レス内容は質問に対する処理内容や関数を記述しただけなので、出力した見た目は考慮してません。

<数字を合わせる
例えば
printf("日 月 火 水 木 金 土\n");  // 曜日の表示
の下に合わせた1~7の数字を作るには以下のようにします。
char cDisp[32] = "";
for( int i = 0; i < 7; i++ )
{
	char cTemp[16];
	sprintf( cTemp, "%2d", i + 1 ); // A
	strcat( cDisp, cTemp, " " );
}
printf( cDisp );
数字を文字列にするAの箇所で数字を半角二文字分に合わせます。
その後、曜日の出力と同じように全角スペースを付け加えます。

<上記のやり方では1~dmまでの数値が横並びで表示されてしまいます
D_date配列に1行ずつ格納してください。上記で作った内容を
D_date[0] = 1行目
D_date[1] = 2行目
...
というように入れていけば近い形になると思います。

コピペで動くか分かりませんが、ちょこっと書いたソースを参考においておきます。
char D_date[15][80] = {""};
int i, j, a = 1;
int dayofweek = 2;
int dm = 31;
for(i = 0 ; i < 15 ; i ++){
	for( j = 0 ; j < 7 ; j++ ){
		// 最初の行では開始曜日を考慮する
		if( i == 0 ){
			if( j >= dayofweek - 1 ){
				char cTemp[ 16 ] = "";
				sprintf( cTemp, "%2d", a );
				strcat( D_date, cTemp );	// 数字を入れる
				strcat( D_date, " ");	// 全角スペースで調整
			} else {
				strcat( D_date, "  ");	// 全角スペース2個で調整
				continue;
			}
		} else {
			char cTemp[ 16 ] = "";
			sprintf( cTemp, "%2d", a );
			strcat( D_date, cTemp );		// 数字を入れる
			strcat( D_date, " ");		// 全角スペースで調整
		}
		a++;
		if( a > dm )
			break;
	}
	if( a > dm )
		break;
}
printf( "日 月 火 水 木 金 土" );
for( int ii = 0; ii < 15; ii++ ){
	if( D_date[ii][0] != NULL ){
		printf( "%s", D_date[ii] );
	}
}

box

Re:万年カレンダー

#5

投稿記事 by box » 16年前

>ねこさん
> 	if( D_date[ii][0] != NULL ){

char型と(void *)型とを比べて、大丈夫ですか?
本当は '\0' と書きたかったのですか?

ねこ

Re:万年カレンダー

#6

投稿記事 by ねこ » 16年前

>box様
ただの置き換えミスです。元はC++で書いてたので^^;

アイリ

Re:万年カレンダー

#7

投稿記事 by アイリ » 16年前

度々すみません;

試しにねこさんの上記のプログラムを実行したところ


日 月 火 水 木 金 土
     1  2  3  4  5  6  7 ...
19 20 ...


というような表示になりました
iをインクリメントすれば行が進んで
改行できるのでは?と思うのですが
違うのでしょうか?

sizuma

Re:万年カレンダー

#8

投稿記事 by sizuma » 16年前

横から失礼します
printf( "日 月 火 水 木 金 土\n" );

for( int ii = 0; ii < 15; ii++ ){

	if( D_date[ii][0] != NULL ){

		printf( "%s\n", D_date[ii] );

	}

}
ってすればいけると思います。
char型配列の中に改行コードがないと改行はされないですよ。
putsだと改行されますけど。

アイリ

Re:万年カレンダー

#9

投稿記事 by アイリ » 16年前

無事完成しました
とても分かり易くて助かりました
ありがとうございました><

ねこ

Re:万年カレンダー

#10

投稿記事 by ねこ » 16年前

>sizuma様
補足ありがとうございます。
元がOutputDebugStringを含めたマクロで改行コード不要だったので抜けてましたorz

閉鎖

“C言語何でも質問掲示板” へ戻る