C言語 関数の作成 (1)
C言語改訂版1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)
- 作者: 倉薫
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 3人 クリック: 14回
- この商品を含むブログ (3件) を見る
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が代入されているようだが…