c言語で2000年以降カレンダーを表示するプログラムを書こうと思ってるんですけど、画像のように何故かズレてしまいます。
何がダメなのかわかりません。
おかしなところ及びわからなくなった時の対処法など教えていただきたいです。
未熟ですいません。
ソースコード
#include <stdio.h>
int isLeapYear(int year) {
if (year % 400 == 0){
return 1;
} else if(year % 4 == 0 && year % 100 != 0){
return 1;
}
return 0;
}
int main() {
int year,month,total=0;
int month_date[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int i, y, day;
//西暦入力
do{
printf("西暦を入力してください(2000年以降):");
scanf("%d",&year);
}while(year<2000);
//月入力
do{
printf("月を入力してください:");
scanf("%d",&month);
}while(month<1||month>12);
printf("%d年%d月\n",year,month);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
for(i=0, y=2001; i<year-2000; i++){
total = total + 365 + isLeapYear(y);
y++;
}
if(isLeapYear(year)) month_date[1]++;
for(i=0; i<month-1; i++){
total = total + month_date[i];
}
for(i=0,day=0; i<total%7; i++, day++) printf(" ");
for(i=1; i<=month_date[month-1]; i++, day++){
if(day % 7 == 0) printf("\n");
printf("%3d ", i);
}
printf("\n");
return 0;
}
No.1ベストアンサー
- 回答日時:
> 何がダメなのかわかりません。
凡ミスじゃないかなぁ(笑)。ロジックは間違ってなさそうだし。
焦って視野狭窄にハマった例かもしんない。
> for(i=0,day=0; i<total%7; i++, day++) printf(" ");
単にここでprintfの引数である「空白」の数が足りないだけ、だと思う。
後続で、
> printf("%3d ", i);
ってしてる以上、「一つの曜日で4文字分」必要な設計でしょ?
とすると、前者のprintfは「空白4文字分」出力せんと帳尻が合わんわけですよ。
多分1文字分しか与えてないでしょ?だからズレてる。
凡ミスです。
No.2
- 回答日時:
#1 に同意. 空白の数を間違えているだけだと思う.
あといくつか突っ込んでおく.
・for(i=0, y=2001; i<year-2000; i++) は y を直接使えばいいのでは? そのままにするにしてもなんで y だけループ内でインクリメントする?
・isLeapYear の仕様が微妙. 名前を見る限り
total = total + 365 + isLeapYear(y);
という使い方はしたくない. なお total の値そのものに興味がないならもうちょっと簡単に書ける.
・month_date は要素数を 13 にする方が見やすくないか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】大変な警告
【大喜利】「今このパソコンは大変危険な状態です」という警告メッセージを無視してパソコンを開いたら、こんなことが起こった
-
おすすめの美術館・博物館、教えてください!
美術館・博物館が大好きです。みなさんのおすすめをぜひお聞きしたいです。
-
自分独自の健康法はある?
こうしていると調子がいい!みたいな自分独自の健康法、こだわりはありますか?
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
今から楽しみな予定はありますか?
いよいよ2025年が始まりました。皆さんには、今から楽しみにしている予定はありますか?
-
カレンダープログラム、曜日の出力について。
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・ことしの初夢、何だった?
- ・【お題】大変な警告
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
printf で二進表示を行いたい。
-
wsprintfの書式制御文字列につ...
-
LU分解法のピボット選択機能実...
-
ガウスの消去法、後退代入について
-
ホームページをC言語で作りたい...
-
4の倍数を論理演算で表す。。
-
文字と数字の判定について
-
unsigned int型について
-
コンパイルエラーについて
-
C言語で四則演算を使って10を作...
-
LU分解法のピボッティングにつ...
-
C言語 プログラミング
-
scanfで正しい値を入力できない
-
printf( " %2d", p * q );
-
テキストカーソル位置の取得
-
解説お願いします。
-
円の面積を求めるプログラミン...
-
C言語のじゃんけんゲームのプロ...
-
ブラックジャック
-
C言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printf で二進表示を行いたい。
-
コンパイルエラーについて
-
10個出力で改行したいのですが...
-
コマンドラインに出力した文字...
-
既約分数の表示プログラム
-
【C言語教えてください】sin波...
-
(C言語)めちゃくちゃな値にな...
-
LU分解法のピボット選択機能実...
-
printfの出力内の文字をdefine...
-
ガウスの消去法、後退代入について
-
c言語でAからZまでを表示する...
-
テキストカーソル位置の取得
-
cshの文字列操作(0埋め)
-
printf( " %2d", p * q );
-
strcmp
-
defineで定数が置き換えられな...
-
三角形の判別
-
%P と %X の違い
-
8人分のテストの点数を入力し、...
-
c言語で2000年以降カレンダーを...
おすすめ情報