- ベストアンサー
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月以降のデータもご指示いただければすぐにご用意いたします。
- kingkong10
- お礼率31% (19/61)
- C・C++・C#
- 回答数3
- ありがとう数2
- みんなの回答 (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がつとかぶってしまいました。
関連するQ&A
- C言語でのカレンダー作成
今、C言語でカレンダーを表示させるプログラムを作成しています 西暦と月を入力すると、その年、その月の1ヶ月分のカレンダーが表示されるプログラムを作りました そこで、次は入力した月から3ヶ月分のカレンダーを表示させるプログラムを作成したいのですが、どなたか教えてくださいませんか? 配列を使う方法や文字列など色々な方法があると伺って、どの方法が作りやすいのかわからないんです・・・ borland c を使用しています
- ベストアンサー
- C・C++・C#
- 万年カレンダーのC言語プログラムを教えてください
西暦年と月を入力すると、その年月のカレンダーが出てくる万年カレンダーのC言語プログラムを教えてください!お願いします!
- ベストアンサー
- C・C++・C#
- カレンダーのC言語プログラムを教えてください!
西暦年と月を入力すると、その年月のカレンダーが出てくる万年カレンダーのC言語プログラムを教えてください! その出力結果が 2***年 *月 月 火 水 木 金 土 日 月 火 水 木 金 土 日 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 というように二週間ごとに表示するもので、 うるう年の判別ができるものになるようにしたいのですが。 年=n月=g で入力するものを作りたいんです。 よろしくお願いします!!!(>_<)
- ベストアンサー
- C・C++・C#
- C言語のポインタのプログラムの作成依頼です
西暦年と月を入力し、その月の最初の日(一日)の曜日を表す番号(日曜なら0、月曜なら1.......、土曜日なら6という整数)で返す関数 int calc_youbi(int y,int m)とする。また、1か月の日数をdaynumとして、その月の最初の日(1日)の曜日を*youbiとして受け取り、一か月分のカレンダーを出力するとともに、翌月の1日の曜日を*youbiとして受け渡す関数を、void print_calendar(int daynum,int *youbi)とする。 西暦年と月の情報を入力して、最初に calc_youbiを一回、その後にprint_calendarを二回使うことによって二か月分のカレンダーを出力するプログラムを教えてください。 以下は、実行例です。 enter year:2010 enter month:6 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
- 締切済み
- 情報工学
- C言語についていくつか至急教えてください。
3つほどお聞きしたいことがあります。 1つ目は閏年についてです。 2つの年をmain関数内で入力し、その西暦を引数とする関数CheckYearを使い、結果を出すのですが、条件としては1.西暦年が4で割り切れる閏年。 2.1つ目を満たしていても西暦年が100で割り切れるときは閏年ではない。 3.2つ目を満たしていても西暦年が400で割り切れるならば閏年である。 実行結果として、西暦を入力:2000 西暦を入力:2009 2000年 2004年 2008年 閏年は3回あります。 とあるようにならなければなりません。 2個目は、10進数の値(dec)を読み込み4ケタの2進数に変換するものです。 なお、結果表示にはprintf("(10進数)%d%d%d%d\n",dec,d3,d2,d1,d0);を使います。 実行結果としては、7と入力する場合→(10進数)7=(2進数)0111 となります。 3個目は、棒グラフを表示するものです。 要素5個持っている配列dataに10以下の値を入力する。 関数はputbox(void型)を使用しputboxは1行当たり10個の□や■を表示。 引数の値だけ、□を表示し残りは、■を表示する。 配列の要素の値も表示のこと。 実行結果としては、10,9,8,4,0を入力する場合 1:10 2:9 3:8 4:4 5:0 10 □□□□□□□□□□ 9□□□□□□□□□■ 8□□□□□□□□■■ 4□□□□■■■■■■ 0■■■■■■■■■■ となるようにします。 身勝手で尚且つ分かりにくい文章で申し訳ありません。 どうかよろしくお願いいたします。
- 締切済み
- C・C++・C#
- C言語初心者です。
C言語初心者の者です・・。カレンダーを表示するというプログラムを 作成して下さい。という問題でソースが途中まで出来ていてこれを元に 作成するみたいなのですが、今まで、こちらのサイトで同じような質問は無いかなぁと検索してみたのですが、年数やうるう年の計算もされていて、どこをどの様に変えれば良いのかも分かりません。どなたか教えて頂けないでしょうか? 〖問題〗 以下のように、カレンダーを表示するプログラムを書いてください。 int main (void) { /* 1月表示 */ dispCalender(1); return 0; } void dispCalender(int month) { /* 2007年:月毎の最終日を管理する配列 */ int lastday[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31}; /* 2007年:各月が何曜日から始まるか管理する配列 */ int week[12] = {1, 4, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6} /* ※0:日、1:月、2:火 ・・・ 6:土 */ (ここにいっぱいコード書く) } (実行結果) --------------------- [2007年1月] --------------------- 日 月 火 水 木 金 土 --------------------- 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ---------------------
- 締切済み
- C・C++・C#
- C言語でカレンダーを作成しています
こんばんは。 当方プログラミング初心者なのですが、C言語でカレンダーを作成しています。 具体的には年だけ入力すれば一年分のカレンダーが出力され、 年と月を入力すればその年月のカレンダーが出力されるようなプログラムを作りたいと思っています。 例えば2011年と入力すれば2011年一年分のカレンダーが表示され、 2011年2月と入力すれば2011年2月一月分のカレンダーが表示されるといった感じです。 また、年を入力しなかった場合はエラーメッセージを返すようにしたいと考えています。 プログラムの概要は以下のようなものを考えてます。 scanfで年月を入力 if(年だけ入力すれば) 一年分のカレンダーを表示 if else(年月両方を入力すれば) 一ヶ月分のカレンダーを表示 else(それ以外) エラーメッセージ カレンダーを表示するプログラムは完成したのですが、if文の中身をどのようにすればいいのかわかりません。 良い案がありましたら、ご教示お願い致します!
- 締切済み
- C・C++・C#
- アクセスでのテーブルデータ入力
テーブルでデータ入力を作成してますが 日付フィールドで 56/12/01 と入力したいのに、エンターキーで確定すると 31/12/01 と和暦で表示されてしまいます。 どうしたら西暦2桁で表示できますか? データ型は日付/時刻、定型入力は西暦日付の 年/月/日 に設定してあります。
- ベストアンサー
- その他(データベース)
- ★C言語の問題です★
C言語のプログラムの問題なんですが、どなたか以下の問題の1問でも解ける方がいればご回答おねがいします! または、アドバイスだけでもいいのでよろしくお願いします。 【問題】 1 西暦1868年から2007年までの年号を入力して和暦に変更して出力するプログ ラムを作成するプログラム。 例 入力 1868 出力 明治元年 2007 平成19年 2 整数配列が-32768から32767の範囲の数しか扱えないとしたとき、10桁の整数同士 の足し算を行うプログラム。 3 3桁の整数の値を入力していき、-9999が入力されたところで、それまでに入力 された数の個数と合計を整数で、平均を浮動小数点数で出力するプログラム。 4 3つの文字列”Happy”と“New”と“Year”をつないで1つの文字列として出力する プログラム。 5 学籍番号、氏名、出席からなる10人分のデータがある。出席の悪いものから並び替 えて表示するプログラム。 例 CA180002 山田太郎 70 CA170001 山田次郎 60 データは、適当なものを使います。
- ベストアンサー
- C・C++・C#
- 曜日当て
生年月日が与えられた時、その曜日を当てる公式を作りたいです。1月1日が何曜日か分かった時、その年の月日が与えられた時の曜日の当て方は知ってます。下のは、途中まで自分で作ったけど途中で挫折したもので全く正確ではありません。こんな風に作ってほしいってやつです。 求める曜日 =1月1日が火曜日の時の求める月日 + (20-求める西暦の上2桁)日 +(求める西暦の下2桁÷7の余り)日 +((求める西暦の下2桁)÷4の商)日 +(求める西暦が4の倍数の1、2月なら-1)日 +(求める生年月日が100n年の1、2月なら+1)日 語彙力なくてすみません。伝わった方ご回答くださったら嬉しいです!
- ベストアンサー
- 数学・算数
お礼
わかりやすい解説つきのソースをいただきましてありがとうございました。 おかげさまで 理解をした上での解決をすることができました。 ありがとうございました。