C言語勉強会
第5回C言語勉強会
公開日:
2020/08/22
第5回C言語勉強会

今日やること

前回は関数とポインタについてやりました。しんどかったと思います。なので今回はゆるめに列挙型と再帰についてやります。 列挙型は難しくないと思います。再帰は慣れるまで苦労しますが頑張って使えるようになりましょう。

列挙型

列挙型は定数に名前をつけたというようなものです。逆に、それぞれの名前に数字を振り分けたと考えた方がいいかもしれません。 定義は以下のようにします。

enum タグ名{定数のリスト}変数名;

変数名はなくても大丈夫です。後から定義する場合

タグ名 変数名  ;

と書きます。 例えば、月曜日から水曜日に数字を振り分けたい場合列挙型を使うと

enum Days{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};

と定義します。こう書くとMondayは0、Tuesdayは1と左から順に0,1,2,3....と数字が割り振られたいきます。
割り振りたい数字を指定したいときは Monday = 3 みたいにして数字を指定することができます。 この場合、後の要素に振り分けられる数字は値を指定し無い限り連続したものになります。例えば、

enum Days{Monday,Tuesday,Wednesday = 12,Thursday,Friday,Saturday,Sunday};

とした場合、割り当てられる定数は左から順に0,1,12,13,14,15,16となります。 また、定義後のそれぞれが表す定数の変更は環境によってはできる場合もあるみたいですが、できない場合もあるので 値の変更は無理なもの(定数)として使いましょう。
この列挙型はswitch文と共によく使われます。例えば、各曜日にするゲームの時間を出力する場合、以下のようにかくとコードが分かりやすくなります。

#include <stdio.h>

enum Days{Monday,Tuesday,Wednesday ,Thursday,Friday,Saturday,Sunday};

void ShowHours(enum Days d){
  switch(d){
  case Monday:
  printf("2hours\n");
    break;
  case Tuesday:
  printf("1.5hours\n");
    break;
		case Wednesday:
  printf("2hours\n");
    break;
  case Thursday:
  printf("2.5hours\n");
    break;
		case Friday:
  printf("1hours\n");
    break;
  case Saturday:
  printf("4.5hours\n");
    break;
		case Sunday:
  printf("3hours\n");
    break;
		
    defaule:break;
  }
}

int main(){
ShowHours(Tuesday);
return 0;
}

以上が列挙型についてでした。

再帰

再帰とはある関数内で自身を再び呼び出すことを言います。再帰をうまく使うことができればコードが簡単に書けたり、見やすくなったりと いろいろな利点があります。実際に使ってみて慣れましょう! 例えば、引数をxとして1からxまでの整数を昇順に表示する場合は以下のように書きます。

void ShowNum(int x){
	if(x>0){
		ShowNum(x-1);
		printf("%d\n",x);
	}
}

これはprintfする前に引き数の値をx-1としたShoeNumを呼び出しているの小さい方から数が表示されるのです。
なので、1からxまでの整数を降順に表示したい場合は

void ShowNum(int x){
	if(x>0){
		printf("%d\n",x);
		ShowNum(x-1);
	}
}

と書けばいいわけです。 再帰はreturnで呼び出すことも多いです。例えば、1からxまでの整数の和を返すコードは下のように書きます。

int Sum(int x){
	if(x<1) return 0;
	else if(x==1)return 1;
	else return x+Sum(x-1);
}

xが1のときは1を、1より大きいときはx+Sum(x-1)を返すので、xから1ずつ引数が減少した関数が呼び出されていき、最後は1となって 値が返されることで逆順処理的にしたから次々と総和が返されていくわけです。
この説明だけではわかりにくいの実際に練習していきましょう。

練習しよう

練習として以下の問題を解きましょう。
1. 引数xをとり、xの階上の値を返す関数を再帰を用いて書け。
2. 引数xをとり、1からxまでの階上の値を昇順に表示する関数を再帰を用いて書け。
3. 変数のポインタを引数としてとり、その変数の値を2倍にするプログラムをかけ。(ポインタの復習)
4. 引数xをとり、フィボナッチ数列の第x項の値を返す関数を再帰を用いて書け。

最後に

お疲れ様でした。練習しようが1人で書けるくらいになれば再帰の基本的な事に関しては大丈夫だと思います。 難しいと思う場合は何度も練習して慣れていきましょう!

loading...