#include <stdio.h>
#define YEAR 2010
#define MONTH 6
typedef enum {
w_sun, w_mon, w_tue, w_wed, w_thu, w_fri, w_sat
} wday_t;
typedef struct {
int s_period; // 開始時限
int e_period; // 終了時限
} period_t;
typedef struct {
char *lname; // 授業名(NULLの場合は無効なデータを表す)
char *sname; // 授業略称(NULLの場合はlnameをsnameとしても使う)
wday_t wday; // 開講曜日
period_t period; // 開講時限
char *room; // 講義室
} course_t;
course_t course[] = {
// 2年科目
{"物理学実験", "物理実験", w_mon, {5, 7}, "?"},
{"電気回路", NULL, w_wed, {5, 6}, "D3505"},
{"計算機ハードウェア", "ハード", w_thu, {1, 2}, "D4103"},
{"上級プログラミング演習I", "上級プロI", w_thu, {3, 4}, "電算室"},
{"計算機言語論I", "言語論I", w_thu, {7, 8}, "D4703"},
{"人工知能I及び演習", "人工知能I", w_fri, {3, 5}, "D5202"},
{"工業数学II", NULL, w_fri, {9, 10}, "D5902"},
// 再履修
{"離散数学", NULL, w_mon, {3, 4}, "D1301"},
{"情報科学基礎及び初級プログラミング演習", "初級プロ", w_wed, {1, 4}, "電算室"},
// 無効データ
{NULL, NULL, w_sun, {0, 0}, NULL},
};
char *wday_name[] = {
"日", "月", "火", "水", "木", "金", "土",
};
// year年month月の最後の日付を求める
int get_last_mday(int year, int month);
// year年month月mday日の曜日を求める
int get_wday(int year, int month, int mday);
// wday曜日のs_period時限に始まる講義を取得
course_t get_course(int wday, int s_period);
// 表の横線を表示する
void insert_line(void);
int main(void){
int year, month;
int mday, last_mday, period;
wday_t wday;
course_t course = {"dummy", NULL, w_sun, {0, 0}, NULL};
char *room[10] = {0};
year = YEAR;
month = MONTH;
last_mday = get_last_mday(year, month);
wday = get_wday(year, month, 1);
printf("-------------------- %4d年%2d月の予定表 --------------------\n", year, month);
insert_line();
for (mday = 1 ; mday <= last_mday ; mday++){
printf("%2d/%2d(%s)|", month, mday, wday_name[wday]);
for (period = 1 ; period <= 9 ; period += 2){
if (course.wday == wday &&
period >= course.period.s_period && period <= course.period.e_period)
{
// このコマの半分で終了
if (period == course.period.e_period){
printf("----> |");
}
// このコマの最後で終了
else if (period+1 == course.period.e_period){
printf("--------->|");
}
// 次のコマ以降に続く
else {
printf("----------|");
}
}
else {
course = get_course(wday, period);
if (course.lname != NULL){
room[period] = course.room;
if (course.sname == NULL){
printf("%-10s|", course.lname);
}
else {
printf("%-10s|", course.sname);
}
}
else {
room[period] = "";
printf(" |");
}
}
}
puts("");
printf(" |");
for (period = 1 ; period <= 9 ; period += 2){
printf("%-10s|", room[period]);
}
puts("");
insert_line();
wday = (wday+1) % 7;
}
for (wday = w_mon ; wday < w_sun ; wday++){
printf("%s\n", wday_name[wday]);
}
return 0;
}
int get_last_mday(int year, int month){
if (month == 2){
// 閏年の判定
// 400で割り切れるか、4で割り切れ100で割り切れなければ閏年
if (((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0)))){
return 29;
}
else {
return 28;
}
}
else if (month == 4 || month == 6 || month == 9 || month == 11){
return 30;
}
return 31;
}
// ツェラーの公式による曜日の計算
int get_wday(int year, int month, int mday){
int w, r;
// 1月、2月は前年の13月、14月として扱う
if (month == 1 || month == 2){
year --;
month = month + 12;
}
w = year + year/4 - year/100 + year/400 + (13*month+8)/5 + mday;
r = w % 7;
return r;
}
// wday曜日のs_period時限に開始される授業を返す
course_t get_course(int wday, int s_period){
int i = 0;
while (course[i].lname != NULL){
if (course[i].wday == wday && course[i].period.s_period == s_period){
return course[i];
}
i++;
}
// 該当する授業がないときは、lnameがNULLであるようなcourse_t型の値を返す
return course[i];
}
void insert_line(void){
int period;
printf("---------+");
for (period = 1 ; period <= 9 ; period += 2){
printf("----------+");
}
puts("");
}