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が代入されているようだが…