やっとできたー、だいぶ期間が開いてしまったのでとりあえず前編で、課題6-1から課題6-4までです。
んで、6-1から6-4までは全部6章のList6-12のプログラムを編集する問題なので、1個のプログラムに全部やりました。
とりあえず問題。
6-1 横に3個並べる3か月分のカレンダーの間に、3個の空白文字があるが、右端にはいらないので70桁のコンソールに入りきらない。入るようにしんさい。
6-2 開始年月と終了年月のチェックをしてないので、チェックを入れんさい。
6-3 各月を6週間分とっているが、必要なとこだけに合わせんさい。
6-4 カレンダーがずれないように、月の最終日以降に空白文字で埋めている。表示幅を指定して整形すればその部分は必要なくなるので、そうしんさい。
てな感じです。詰まったのが6-3で、ポインタで比較してた部分を*bufにして中身を比較するようにしたらやっといけた。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int mday[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int dayofweek(int year, int month, int day);
int is_leap(int year);
int monthdays(int year, int month);
void make_calendar(int y, int m, char s[7][22]);
void print(char sbuf[3][7][22], int n);
void put_calendar(int y1, int m1, int y2, int m2);
int main(void)
{
int y1, m1, y2, m2;
int retry=0;
do{
if(retry==1){
puts("再入力してください。");
retry=0;
}else
printf("カレンダーを表示します。\n");
printf("開始年月日は?\n");
printf("年:"); scanf("%d", &y1);
printf("月:"); scanf("%d", &m1);
printf("終了年月は?\n");
printf("年:"); scanf("%d", &y2);
printf("月:"); scanf("%d", &m2);
if(y1 > y2){
puts("開始年の方が大きいよ");
retry=1;
}
if(m1 < 1 || m1 > 12){
puts("開始の月がおかしいよ");
retry=1;
}
if(m2 < 1 || m2 > 12){
puts("終了の月がおかしいよ");
retry=1;
}
}while(retry==1);
putchar('\n');
put_calendar(y1, m1, y2, m2);
return 0;
}
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+8)/5 + day) % 7);
}
int is_leap(int year)
{
return(year % 4 == 0 && 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 make_calendar(int y, int m, char s[7][22])
{
int i, k;
int wd = dayofweek(y, m, 1);
int mdays = monthdays(y, m);
char tmp[4];
sprintf(s[0], "%10d / %02d ", y, m);
for(k=1; k<7; k++)
s[k][0]='\0';
k=1;
sprintf(s[k], "%*s", 3 * wd, "");
for(i = 1; i <= mdays; i++){
sprintf(tmp, "%3d", i);
strcat(s[k], tmp);
if(++wd % 7 ==0)
if(s[k])
k++;
}
// if(wd % 7 == 0)
// k--;
// else{
// for(wd %= 7; wd < 7; wd++)
// strcat(s[k], " ");
// }
while(++k < 7 )
sprintf(s[k], "");
}
void print(char sbuf[3][7][22], int n)
{
int i, j;
if(n==3){
for(i=0; i<2; i++)
printf("%21s ", sbuf[i][0]);
printf("%21s", sbuf[2][0]);
putchar('\n');
for(i=0; i<2; i++)
printf(" 日 月 火 水 木 金 土 ");
printf(" 日 月 火 水 木 金 土 ");
putchar('\n');
for(i=0; i<2; i++)
printf("---------------------- ");
printf("---------------------");
putchar('\n');
for(i=1; i<7; i++){
for(j=0; j<2; j++)
printf("%-22s ", sbuf[j][i]);
printf("%-22s", sbuf[2][i]);
if(i==5)
if(*sbuf[0][6]==*sbuf[1][6] && *sbuf[1][6]==*sbuf[2][6])
i+=2;
putchar('\n');
}
putchar('\n');
}else{
for(i=0; i<n; i++)
printf("%22s ", sbuf[i][0]);
putchar('\n');
for(i=0; i<n; i++)
printf(" 日 月 火 水 木 金 土 ");
putchar('\n');
for(i=0; i<n; i++)
printf("---------------------- ");
putchar('\n');
for(i=1; i<7; i++){
for(j=0; j<n; j++)
printf("%-22s ", sbuf[j][i]);
putchar('\n');
}
putchar('\n');
}
}
void put_calendar(int y1, int m1, int y2, int m2)
{
int y = y1;
int m = m1;
int n = 0;
char sbuf[3][7][22];
while(y <= y2){
if(y == y2 && m > m2) break;
make_calendar(y, m, sbuf[n++]);
if(n==3){
print(sbuf, n);
n = 0;
}
m++;
if(m==13 && y < y2){
y++;
m = 1;
}
}
if(n)
print(sbuf, n);
}
実行結果
カレンダーを表示します。 開始年月日は? 年:2014 月:1 終了年月は? 年:2014 月:12 2014 / 01 2014 / 02 2014 / 03 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 ---------------------- ---------------------- --------------------- 1 2 3 4 1 1 5 6 7 8 9 10 11 2 3 4 5 6 7 8 2 3 4 5 6 7 8 12 13 14 15 16 17 18 9 10 11 12 13 14 15 9 10 11 12 13 14 15 19 20 21 22 23 24 25 16 17 18 19 20 21 22 16 17 18 19 20 21 22 26 27 28 29 30 31 23 24 25 26 27 28 23 24 25 26 27 28 29 30 31 2014 / 04 2014 / 05 2014 / 06 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 ---------------------- ---------------------- --------------------- 1 2 3 4 5 1 2 3 1 2 3 4 5 6 7 6 7 8 9 10 11 12 4 5 6 7 8 9 10 8 9 10 11 12 13 14 13 14 15 16 17 18 19 11 12 13 14 15 16 17 15 16 17 18 19 20 21 20 21 22 23 24 25 26 18 19 20 21 22 23 24 22 23 24 25 26 27 28 27 28 29 30 25 26 27 28 29 30 31 29 30 2014 / 07 2014 / 08 2014 / 09 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 ---------------------- ---------------------- --------------------- 1 2 3 4 5 1 2 1 2 3 4 5 6 6 7 8 9 10 11 12 3 4 5 6 7 8 9 7 8 9 10 11 12 13 13 14 15 16 17 18 19 10 11 12 13 14 15 16 14 15 16 17 18 19 20 20 21 22 23 24 25 26 17 18 19 20 21 22 23 21 22 23 24 25 26 27 27 28 29 30 31 24 25 26 27 28 29 30 28 29 30 31 2014 / 10 2014 / 11 2014 / 12 日 月 火 水 木 金 土 日 月 火 水 木 金 土 日 月 火 水 木 金 土 ---------------------- ---------------------- --------------------- 1 2 3 4 1 1 2 3 4 5 6 5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20 19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 30