画像(logo)

HOME/[C言語 入門]小学生でもわかるC言語2 目次/三日目 関数(まとめ)

広告

[C言語 入門 小学生でもわかるC言語2]
三日目 関数(まとめ)

広告

↓2016年02月29日発売↓

12歳からはじめる ゼロからのC言語 ゲームプログラミング教室

目次へ戻る

渡して受け取る

今回は関数のまとめとして他の関数に値を渡して、その関数から値を受け取るという一連の流れをやっていきましょう。

四角形の面積を計算するプログラムを作ります。

1・縦と横の長さを関数「menseki()」に渡す

2・関数「menseki()」で受け取った縦と横の長さを計算して答えの面積を出す

3・関数「menseki()」で計算された答えを受け取る

という流れでいきたいと思います。

/*三日目 プログラム1*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int menseki(int ,int);

int main(){
	
	int tate,yoko,ans;

	printf("四角形の面積を計算します!\n");
	printf("縦の長さを入力してください>");
	scanf("%d",&tate);

	printf("横の長さを入力してください>");
	scanf("%d",&yoko);

	ans = menseki(tate,yoko);

	printf("\n四角形の面積は%dです!\n",ans);

	return 0;
}

int menseki(int tate,int yoko){
	int ans;
	ans = tate * yoko;
	return ans;
}

■実行結果■

画像(ce_3_1)

#define _CRT_SECURE_NO_WARNINGS

こちらは「小学生でもわかるC言語」でも説明しましたが「scanf()」など一部の古いタイプの関数を使う時に必要なおまじないでしたね。

まずはプロトタイプ宣言です

int menseki(int ,int);

関数「menseki」に渡すのは縦の長さと横の長さの2つの数字なので(int ,int)となります。

そして答えとして返ってくるのが面積にあたる数字です。なので先頭も「int」ですね!

では関数「menseki」の中を見てみましょう。

int menseki(int tate,int yoko){
	int ans;
	ans = tate * yoko;
	return ans;
}

「int main()」から渡された縦と横の長さを変数「tate」と「yoko」として、「tate × yoko」を計算し答えの面積にあたる変数「ans」に代入します。

そして「int main()」に答えの「ans」を返します。

return ans;

これで他の関数に値を渡して、その関数から値を受け取るという一連の流れができました!

広告

良い関数・悪い関数

関数を作る時は

1・目的をはっきりさせる

2・他のプログラムでも使えるようにする

この2点が大事だそうです。

次のプログラムを見てください。

「5人分の点数の平均、一番、ビリを表示する」

プログラムです。

1・平均を求める関数

2・1番の点数を求める関数

3・ビリの点数を求める関数

4・結果を画面に表示する関数

という4つの関数を用意して「int main()」で組み合わせていきます。

/*三日目 プログラム2*/
#include <stdio.h>

int heikin(int[]);
int itiban(int[]);
int biri(int[]);

void disp(char,int);

int main(){
		
	int ary[5] = {80,70,40,30,90};
	int ans;
	char disp_type;

	disp_type = 'a';
	ans = heikin(ary);
	disp(disp_type,ans);

	disp_type = 'b';
	ans = itiban(ary);
	disp(disp_type,ans);

	disp_type = 'c';
	ans = biri(ary);
	disp(disp_type,ans);

	return 0;
}

int heikin(int ary[]){
	int ans;
	ans = ((ary[0] + ary[1] + ary[2] + ary[3] + ary[4]) / 5);
	return ans;
}

int itiban(int ary[]){
	int ans;
	ans = ary[0];

	if(ans < ary[1])ans = ary[1];
	if(ans < ary[2])ans = ary[2];
	if(ans < ary[3])ans = ary[3];
	if(ans < ary[4])ans = ary[4];

	return ans;
}

int biri(int ary[]){
	int ans;
	ans = ary[0];

	if(ans > ary[1])ans = ary[1];
	if(ans > ary[2])ans = ary[2];
	if(ans > ary[3])ans = ary[3];
	if(ans > ary[4])ans = ary[4];

	return ans;
}

void disp(char disp_type,int ans){
	switch(disp_type){
	case 'a' :
		  printf("平均 = %d\n",ans);
		  break;
	case 'b' :
		  printf("1番 = %d\n",ans);
		  break;
	case 'c' :
		  printf("ビリ = %d\n",ans);
	default :
		  break;
	}
}

■実行結果■

画像(ce_3_2)

あらためて、

「5人分の点数の平均、一番、ビリを表示する」

プログラムです。

まずは内容を見てみましょう。

平均「heikin()」

1番「itiban()」

ビリ「biri()」

表示「disp()」

という4つの関数を使ってますね。

平均などの計算は大丈夫でしょうか?

「みんなの点数を全部足して、その合計を人数で割る」が平均ですね。

ans = ((ary[0] + ary[1] + ary[2] + ary[3] + ary[4]) / 5);

次に関数「itiban」と「biri」では数字を比べる時に便利な方法を使ってます

ans = ary[0];

if(ans < ary[1])ans = ary[1];
if(ans < ary[2])ans = ary[2];
if(ans < ary[3])ans = ary[3];
if(ans < ary[4])ans = ary[4];

まず仮の答えとして点数を入れた配列の先頭を変数「ans」に代入します。

ans = ary[0];

そして他の点数と比べていくわけです。

上の場合は比べた数が現在の「ans」より大きかったら入れ替えをしてるので結果一番大きい数が残る事になりますね。

そして上のプログラムは同じカタチにキレイにそろっているのがわかります。

なので

ans = ary[0];

for(i=1;i<5;i++){
	if(ans < ary[i])ans = ary[i];
}

こんな感じで書き換えられます。

これなら100人分でも200人分でも大丈夫ですね!

良い関数・悪い関数

話を戻します。

例えばさきほどの関数「itiban()」を見てみます。

int itiban(int ary[]){
	int ans;
	ans = ary[0];

	if(ans < ary[1])ans = ary[1];
	if(ans < ary[2])ans = ary[2];
	if(ans < ary[3])ans = ary[3];
	if(ans < ary[4])ans = ary[4];

	return ans;
}

もとのカタチではこの決まった5人分しか計算できないので人数が増えた時にいちいち書き直さなければいけないのでスゴイ大変ですよね。

なので何人分の点数が来てもその一番を求められるようにこの関数を変えたいトコロです。

たくさんの人数を計算するのはさきほどの「for」文などを使うとしてその人数の情報を増やせばいけそうですね!

int itiban(int ary[],int count){
	int ans;
	int i;

	ans = ary[0];

	for(i=1;i<count;i++){
		if(ans < ary[i])ans = ary[i];
	}

	return ans;
}

このように書き直せば

「いくつかの数の中から一番大きい数を探す」

という関数になりますね。

1・目的をはっきりさせる

2・他のプログラムでも使えるようにする

この2点をなんとか押さえてそうですね。

では続いて関数「disp」の方を見てみましょう。

void disp(char disp_type,int ans){
	switch(disp_type){
	case 'a' :
		  printf("平均 = %d\n",ans);
		  break;
	case 'b' :
		  printf("1番 = %d\n",ans);
		  break;
	case 'c' :
		  printf("ビリ = %d\n",ans);
	default :
		  break;
	}
}

こちらは結果を表示するという目的ははっきりしてますが、他のプログラムには使えそうにありません。

でも表示の仕方を変えたい時はこの関数の内容を書き換えれば良いのでわかりやすいですね。

こんな感じで最初に言った

1・目的をはっきりさせる

2・他のプログラムでも使えるようにする

この2点を心がける事によって「変更や修正がしやすい」良いプログラムを書く第一歩になりますので常に頭に入れてプログラミングしましょう。

ではこのへんで関数の学習は終わりにして、次回は「これぞC言語!」と言われる「ポインタ」について見ていきたいと思います。

次回

四日目 ポインタ

□ページの先頭へ□

□目次へ戻る□

□HOME□

広告

↓2017年06月16日発売↓

やさしいC 第5版 (「やさしい」シリーズ)

新品価格
¥2,700から
(2017/5/1 13:05時点)

↓2014年08月09日発売↓

新・明解C言語 入門編 (明解シリーズ)

新品価格
¥2,484から
(2017/5/1 13:08時点)

↓2016年02月20日発売↓

新・解きながら学ぶC言語

新品価格
¥2,160から
(2017/5/1 13:10時点)

↓2017年02月11日発売↓

C言語プログラミング基本例題88 88

新品価格
¥3,024から
(2017/5/1 13:12時点)

↓2016年12月15日発売↓

Cの絵本 第2版 C言語が好きになる新しい9つの扉

新品価格
¥1,490から
(2017/5/1 13:13時点)

↓2017年02月08日発売↓

新・明解C言語で学ぶアルゴリズムとデータ構造 (明解シリーズ)

新品価格
¥2,700から
(2017/5/1 13:15時点)