第二回レポート総評

基本的に写して実行するだけの問題が多かったので、完答している人も多かったようです。
間違いは larger 関数に集中していました。


larger 関数に関して

正解例は以下の通り。
int larger(int x, int y){
	if(x>y){
		return x;
	}else{
		return y;
	}
}


以下のように、z を定義した人が多かったようです。(main 関数で z が使われているから?)
int larger(int x, int y){
	int z;

	if(x>y){
		z = x;
	}else{
		z = y;
	}

	return z;
}
もちろん間違いではありませんが、この程度ならそのまま x や y を return した方がすっきりしているかもしれません。



あとは多かった間違い例をいくつか。
int larger(int x, int y){
	if(x>y){
		printf("z=%d\n",x);
	}else{
		printf("z=%d\n",y);
	}
}
画面には z の値が表示されますが、第三回に注意したように、 これでは main 関数に値が返されません。



int larger(int x, int y){
	int z;

	if(x>y){
		z=x;
	}else if(y>x){
		z=y;
	}

	return z;
}
一見良さそうですが、x と y が等しい時、何が return されるかわからないので 間違いです。



int larger(int x, int y){
	int z;

	if(x>y){
		z=x;
		printf("z=%d\n",z);
	}else{
		z=y;
		printf("z=%d\n",z);
	}

	return z;
}
これは間違いではないのですが、printf 文を larger 関数に含めているのが 不自然な感じがします。printf 文は main 関数に含めたほうが良いでしょう。



int larger(int x, int y){
	if(x>y){
		return x;
	}else{
		return y;
	}

	return 0;
}
これも一応間違ってはいませんが、最後の return 0; は実行されることは ありません。return 文が実行されると、そこでその関数は終了して、 前の関数 (ここでは main 関数) に処理を移すからです。




ポインタに関して

ポインタについてわからない、という感想があったので補足しておきます。

4番のプログラムを実行した直後のスタック領域の模式図が下図 (a) になります。
この時点ではポインタ c はどこを指しているか不定ですから、c の指す値に アクセスしてはいけません。

c = a; (または c= &a[0]; とかいても同じ) を実行することで、 初めてポインタ c は配列 a[5] の先頭を指すようになります。


この状態で、「a[i]」、「c[i]」、「*(c+i)」 は全て同じ値を意味するようになります。

ただし、この (ややわざとらしい) 例では、ポインタのありがたみは わからないかも知れません。
第三回の演習で触れた「ポインタ引数」や、(今後扱う予定の) 「メモリの動的管理」を学ぶと、ポインタの必要性が実感できると思います。




C から入る C++ に戻る