アプリ版:「スタンプのみでお礼する」機能のリリースについて

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;
}

「c言語で2000年以降カレンダーを表示す」の質問画像

A 回答 (2件)

> 何がダメなのかわかりません。



凡ミスじゃないかなぁ(笑)。ロジックは間違ってなさそうだし。
焦って視野狭窄にハマった例かもしんない。

> for(i=0,day=0; i<total%7; i++, day++) printf(" ");

単にここでprintfの引数である「空白」の数が足りないだけ、だと思う。
後続で、

> printf("%3d ", i);

ってしてる以上、「一つの曜日で4文字分」必要な設計でしょ?
とすると、前者のprintfは「空白4文字分」出力せんと帳尻が合わんわけですよ。
多分1文字分しか与えてないでしょ?だからズレてる。
凡ミスです。
「c言語で2000年以降カレンダーを表示す」の回答画像1
    • good
    • 0
この回答へのお礼

半角スペースが一個足りませんでした
ありがとうございます

お礼日時:2021/04/29 13:13

#1 に同意. 空白の数を間違えているだけだと思う.



あといくつか突っ込んでおく.
・for(i=0, y=2001; i<year-2000; i++) は y を直接使えばいいのでは? そのままにするにしてもなんで y だけループ内でインクリメントする?
・isLeapYear の仕様が微妙. 名前を見る限り
total = total + 365 + isLeapYear(y);
という使い方はしたくない. なお total の値そのものに興味がないならもうちょっと簡単に書ける.
・month_date は要素数を 13 にする方が見やすくないか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています