小テスト (5月27日)


問題1

次のプログラムは、月と日を入力し、それを1月1日からの経過日数に 変換して表示するプログラムである。 (但し閏年は考慮していない。)
#include <stdio.h>

int main(void)
{
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int m, d, s, i;

    scanf("%d", &m);
    scanf("%d", &d);

    s = 0;
    for (i=0; i<m-1; i++) {
        s += days[i];
    }
    s += d;

    printf("%d\n", s);

    return 0;
}
以下は実行結果。
% ./a.out
1
1
1
% ./a.out
12
31
365
% ./a.out
5
28
148
% 

この変換機能を関数md2totalに切り出し、ある月日と別の月日の間の 経過日数を表示するプログラムを作れ。

#include <stdio.h>

int md2total(int m, int d)
{
    // ここを埋める。
}

int main(void)
{
    int m1, d1, m2, d2;

    scanf("%d", &m1);
    scanf("%d", &d1);
    scanf("%d", &m2);
    scanf("%d", &d2);

    printf("%d\n", md2total(m2, d2) - md2total(m1, d1));

    return 0;
}
実行すると、例えば次のようになる。
% ./a.out
5
28
7
31
64
% 
(5月22日から7月31日までは70日。)

問題2

次のプログラムは、問題1の逆、すなわち 1月1日からの経過日数を入力し、それを月と日に 変換して表示するプログラムである。
#include <stdio.h>

int main(void)
{
    int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int s, i;

    scanf("%d", &s);

    for (i=0; i<12; i++) {
        s -= days[i];
        if (s <= 0) {
            s += days[i];
            break;
        }
    }

    printf("%d %d\n", i + 1, s);

    return 0;
}
実行例は以下の通り。
% ./a.out
1
1 1
% ./a.out
200
7 19
% ./a.out
365
12 31
% 
この変換機能を関数total2mdに切り出し、同じような動作をする プログラムを作れ。 total2mdは2つの値を返す必要があり、そのためポインタ渡しで 「書き換えてもらう」形にする。
#include <stdio.h>

void total2md(int s, int *m, int *d)
{
    // ここを埋める。
}

int main(void)
{
    int m, d, x;

    scanf("%d", &x);

    total2md(x, &m, &d);
    printf("%d %d\n", m, d);

    return 0;
}

小テスト (5月27日) /