2013年5月6日月曜日

開発環境

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

その他参考書籍

演習 5-8.

コード

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 = 6;

    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, 400, &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 i, leap;

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    
    if ( (month <= 0 || month > 12) ||
         (day <= 0 || day > daytab[leap][month]))
        return -1;
        
    for (i = 1; i < month; i++)
        day += daytab[leap][i];
    return day;
}

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

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

入出力結果(Terminal)

$ ./a.out
2月29日
day of year: 60
-1月-1日
day of year: -1
-1月-1日
day of year: -1
5月6日
day of year: 126
$

0 コメント:

コメントを投稿