2013年5月7日火曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第5章(ポインタと配列)、5.9(ポインタ対多次元配列)、演習5-9を解いてみる。

その他参考書籍

演習 5-9.

コード

sample.c

#include <stdio.h>

int day_of_year(int year, int month, int day);
void month_day(int year, int yearday, int *pmonth, int *pday);

static char daytab[2][13] = {
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};

int main()
{
    int m, d, m1, d1;
    int year = 2013;
    int month = 5;
    int day = 7;

    month_day(1988, 60, &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(1988, m, d));
    
    month_day(1988, 365, &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(1988, m, d));
    
    month_day(1988, 366, &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(1988, m, d));

    month_day(1988, 367, &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(1988, m, d));

    month_day(-10, 60, &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(-10, 2, 29));
    
    month_day(year, day_of_year(year, month, day), &m, &d);
    printf("%d月%d日\n", m, d);
    printf("day of year: %d\n", day_of_year(year, month, day));
    return 0;
}

int day_of_year(int year, int month, int day)
{
    int leap;
    char *p;

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;

    if ( (month <= 0 || month > 12) ||
         (day <= 0 || day > *(daytab[leap] + month)))
        return -1;
    p = daytab[leap];
    while (--month > 0)
        day += *++p;

    return day;
}

void month_day(int year, int yearday, int *pmonth, int *pday)
{
    int leap;
    char *p;
    
    if (year < 0) {
        *pmonth = -1;
        *pday = -1;
        return;
    }

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    p = daytab[leap];
    while (yearday > *++p)
        yearday -= *p;
    
    if ((*pmonth = p - daytab[leap]) > 12) {
        *pmonth = -1;
        *pday = -1;
        return;
    }
    *pday = yearday;
}

入出力結果(Terminal)

$ ./a.out
2月29日
day of year: 60
12月30日
day of year: 365
12月31日
day of year: 366
-1月-1日
day of year: -1
-1月-1日
day of year: -1
5月7日
day of year: 127
$

0 コメント:

コメントを投稿