#1
by Rum » 5年前
C言語を勉強し始めて,一か月がたとうとしている者です。
任意の年月を入力して,その時のカレンダーを出力するというプログラムを作成しています。
参考書のコードを写して考えていたのですが,わからないことが2つありました。
①
コードでは先にインクリメントしているのですが,後にインクリメントするとカレンダーが崩れてしまいました。また,後に+1するとさらにカレンダーが崩れてしまいました。
そこで,このコードにおいて先にインクリメントすることと後にインクリメントすることの違いというのは何ですか? そして,インクリメントすることと+1することのちがいとは何ですか?
②
dayofweek関数ツェラーの公式を使って,曜日を求めています。その関数を変数wdに置き換えて使っていました。 直接この関数を入れると,エラーとなりました。
関数をインクリメントすることはできないのでしょうか?
なお,質問しているところは二か所とも(/* Q */)のところです。
長くなってしまってごめんなさい。 よろしくお願いします。
コード:
#include <stdio.h>
/*---各月の日数---*/
int mday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
/*---年月日の曜日を求める---*/
int dayofweek(int year, int month, int day)
{
if (month == 1 || month == 2)
{
year--;
month += 12;
}
return (year + year / 4 - year / 100 + year / 400 + (13 * month + 5) / 5 + day) % 7; //ツェラーの公式(決めた年月の曜日を計算する)
}
/*---うるう年を計算---*/
int is_leap(int year)
{
return year / 4 && year / 100 != 0 || year / 400 == 0;
}
/*---年月の日数計算---*/
int monthdays(int year, int month)
{
if (month-- != 2) //二月以外の時
{
return mday[month];
}
return mday[month] + is_leap(year); //二月の時
}
/*---年月のカレンダーを表示---*/
void put_calender(int y, int m) //選択した年月を引数で持ってくる
{
int i;
int wd = dayofweek(y, m, 1); //y年m月1日の曜日を求める(0~6で返ってくる)
int days = monthdays(y, m); //y年m月の日数を求める
printf("San Mon Tue Wed Thu Fri Sat\n");
printf("---------------------------\n");
printf("%*s", 4 * wd, ""); //ついたち前の曜日を空欄にする
for (i = 1; i <= days; i++) //その月の曜日を出力する
{
printf("%3d ", i); //土曜日になったら 改行
if (++wd % 7 == 0) /* Q */
{
putchar('\n');
}
}
if (wd % 7 != 0) //カレンダーの一番最後の日付けで 改行
{
putchar('\n');
}
}
int main(void)
{
int y, m;
printf("カレンダーを表示します。");
printf("Year\n");
scanf_s("%d", &y);
printf("Month\n");
scanf_s("%d", &m);
putchar('\n');
put_calender(y, m);
}
C言語を勉強し始めて,一か月がたとうとしている者です。
任意の年月を入力して,その時のカレンダーを出力するというプログラムを作成しています。
参考書のコードを写して考えていたのですが,わからないことが2つありました。
①
コードでは先にインクリメントしているのですが,後にインクリメントするとカレンダーが崩れてしまいました。また,後に+1するとさらにカレンダーが崩れてしまいました。
そこで,このコードにおいて先にインクリメントすることと後にインクリメントすることの違いというのは何ですか? そして,インクリメントすることと+1することのちがいとは何ですか?
②
dayofweek関数ツェラーの公式を使って,曜日を求めています。その関数を変数wdに置き換えて使っていました。 直接この関数を入れると,エラーとなりました。
関数をインクリメントすることはできないのでしょうか?
なお,質問しているところは二か所とも(/* Q */)のところです。
長くなってしまってごめんなさい。 よろしくお願いします。
[code]
#include <stdio.h>
/*---各月の日数---*/
int mday[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
/*---年月日の曜日を求める---*/
int dayofweek(int year, int month, int day)
{
if (month == 1 || month == 2)
{
year--;
month += 12;
}
return (year + year / 4 - year / 100 + year / 400 + (13 * month + 5) / 5 + day) % 7; //ツェラーの公式(決めた年月の曜日を計算する)
}
/*---うるう年を計算---*/
int is_leap(int year)
{
return year / 4 && year / 100 != 0 || year / 400 == 0;
}
/*---年月の日数計算---*/
int monthdays(int year, int month)
{
if (month-- != 2) //二月以外の時
{
return mday[month];
}
return mday[month] + is_leap(year); //二月の時
}
/*---年月のカレンダーを表示---*/
void put_calender(int y, int m) //選択した年月を引数で持ってくる
{
int i;
int wd = dayofweek(y, m, 1); //y年m月1日の曜日を求める(0~6で返ってくる)
int days = monthdays(y, m); //y年m月の日数を求める
printf("San Mon Tue Wed Thu Fri Sat\n");
printf("---------------------------\n");
printf("%*s", 4 * wd, ""); //ついたち前の曜日を空欄にする
for (i = 1; i <= days; i++) //その月の曜日を出力する
{
printf("%3d ", i); //土曜日になったら 改行
if (++wd % 7 == 0) /* Q */
{
putchar('\n');
}
}
if (wd % 7 != 0) //カレンダーの一番最後の日付けで 改行
{
putchar('\n');
}
}
int main(void)
{
int y, m;
printf("カレンダーを表示します。");
printf("Year\n");
scanf_s("%d", &y);
printf("Month\n");
scanf_s("%d", &m);
putchar('\n');
put_calender(y, m);
}
[/code]