C言語 関数の作成 (1)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)

C言語の関数の構成は、

開始部分、変数の宣言部分、処理部分、終了部分

  • 開始部分 変数の型 関数名(引数の型, 引数名, 引数の型, 引数名, …) (例 void main () とか、int larger (int a)とか)
  • 変数の宣言部分 さっきやった
  • 処理部分 さっきやった
  • 終了部分 return 変数で返り値を返す(Rと似てる)

結局、どの言語も似たようなことを考えているので、発想は同じらしい。ただ、Rと比較すると「変数の型」に対して厳密さを要求していると感じられる。(Rはいちいち何型か事前に定義しなくても良い)

 

日付を入力すると、曜日を返す関数を作ってみた。

#include        <stdio.h>
#include        <string.h>
#include        <stdlib.h>

void dayfunction (int year, int month, int day) {

        int yeardays;
        int monthdays;
        int totaldays;
        int resyear;
        int nuruu;
        int a[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
        int i;
        int adj;
        int result;
        char dayname[100];

        resyear = year % 4;
        nuruu = year/4;
        monthdays = 0;
        adj = 0;

        if (resyear  == 0) {
                yeardays = (year-1)*365 + nuruu - 1;

                if (month >= 3) {
                        adj = 1;
                }

                        if (month == 1) {
                                monthdays = 0;
                        } else {
                                for (i = 0; i < (month-1); i++) {
                                        monthdays = monthdays + a[i];
                                }
                        }
                monthdays = monthdays + adj;
                totaldays = yeardays + monthdays + day;

        } else {
                yeardays = (year-1)*365 + nuruu;

                        if (month == 1) {
                                monthdays = 0;
                        } else {
                                for (i = 0; i < (month-1); i++) {
                                        monthdays = monthdays + a[i];
                                }
                        }
                totaldays = yeardays + monthdays + day;
        }

        result = totaldays % 7;

        switch (result) {
                case 0:
                        strcpy(dayname,"Satureday");    //文字列の代入はstrcpy関数を使う
                        break;
                case 1:
                        strcpy(dayname,"Sunday");
                        break;
                case 2:
                        strcpy(dayname,"Monday");
                        break;
                case 3:
                        strcpy(dayname,"Tuesday");
                        break;
                case 4:
                        strcpy(dayname,"Wednesday");
                        break;
                case 5:
                        strcpy(dayname,"Thursday");
                        break;
                case 6:
                        strcpy(dayname,"Friday");
                        break;
                default:
                        puts("計算不可");
                        break;
        }
        puts(dayname);
}

main() {
        char yearnum[100];
        int year;
                puts("曜日を求めたい年月日を入力します");
                puts("年を入力");
                gets(yearnum);
                year = atoi(yearnum);   //文字列で取得したyearをint型に変換

        char monthnum[100];
        int month;
                puts("月を入力");
                gets(monthnum);
                month = atoi(monthnum); //文字列で取得したmonthをint型に変換

        char daynum[100];
        int day;
                puts("日を入力");
                gets(daynum);
                day = atoi(daynum);     //文字列で取得したdayをint型に変換

        dayfunction(year,month,day);
}

3時間以上かかりましたが…。最初打ち込んだときは、次の間違いを犯していました。

  • 関数dayfunctionの返り値をchar型(冒頭を char dayfunction (…))として、最後をreturn daynameとしていた ⇒ returnはどうやら相手が数値でないとダメらしい
  • 関数dayfunction中のfor文のiの上限値を i < (month-2) としていた ⇒ for文の変域の間違いはコンパイル時にエラーが出ない(この場合month=1ならエラーのはずが、コンパイル時にはエラーが出ない)。コンパイル時にエラーが出ないと探すのに苦労する。この場合は等号を含むか、month-1としないとダメ。
  • main()部分でatoi関数を使うための冒頭 #include <stdlib.h>をつけ忘れていた ⇒ ヘッダー確認はプログラム作成工程に組み込まないと無駄に苦労する

とりあえず、基本は理解したような気がします。これによるとキリストが生まれた日(1年1月1日)は日曜日だそうです。あれ、生まれた日だっけ??

【付記】

  • int adjを定義した後、当初はadj =0 を書いていなかったことにより、曜日がずれてうまくいかなかった。int adjと書いた時点でデフォルト値(0でない値???)が入っているのか?実験したところ、定義のみ表記した整数には0が代入されているようだが…