c言語の問題。配列を引数とする。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
けいた

c言語の問題。配列を引数とする。

#1

投稿記事 by けいた » 7年前

1.整数の 1 次元配列とその要素数を引数として配列内のすべての要素の和を返す関数 sum_array() を作成、
キーボードから入力した5つの整数を配列に格納し関数に渡して合計を求め表示するプログラムを作成せよ。

2.double 型の 1 次元配列とその要素数を引数として配列内の最小値を返す関数 min_array() を作成、キー
ボードから入力した5つの小数を配列に格納し関数に渡して最小値を求め表示するプログラムを作成せよ。

という問題があったのですが、配列を引数とする場合の仕組みなどが全体的に理解が足りず、わからない状態にあります。そこで、このプログラムの解説をしていただけないでしょうか?よろしくお願いします。

かずま

Re: c言語の問題。配列を引数とする。

#2

投稿記事 by かずま » 7年前

けいた さんが書きました:
7年前
配列を引数とする場合の仕組みなどが全体的に理解が足りず、わからない状態にあります。そこで、このプログラムの解説をしていただけないでしょうか?
配列も関数も理解しているが、関数の引数として配列を
渡すところだけが分からない、ということですか?

1. 配列を使わず、main の中で、int a, b, c, d, e; の 5つの変数に
キーボードから整数を読み込み、その 5個の値を引数として、
そのすべての引数の和を返す関数なら書けるんですよね。

2. 関数 sum_array を使わず、main の中だけで、int a[5]; の配列に
キーボードから整数を読み込み、その配列のすべての要素の和を求める
プログラムなら書けるんですよね。

以上を書いてもらえれば、配列を引数とする場合の仕組みを解説します。

けいた

Re: c言語の問題。配列を引数とする。

#3

投稿記事 by けいた » 7年前

関数に関しては基本的な知識・理解(ローカル・グローバル関数、引数も戻り値もない関数など)はありますが、配列(特に文字列が苦手です・・・)に対しての理解がまだまだ甘いところがあり、そのせいで問題を解く力が足りてないということもあるかと思います・・・。

かずま

Re: c言語の問題。配列を引数とする。

#4

投稿記事 by かずま » 7年前

関数は理解していて、配列の理解が甘いのなら、
配列を使わず int a, b, c, d, e; を使うプログラムは書けるはずです。
書いてください。
書いてもらえれば、配列を引数とする場合の仕組みを解説します。

さて、配列ですが、次のプログラムは理解できますか?

コード:

#include <stdio.h>

int main(void)
{
	int a[5];

	for (int i = 0; i < 5; i++)
		scanf("%d", &a[i]);

	for (int i = 0; i < 5; i++)
		printf(" %d", a[i]);
	putchar('\n');

	int sum = 0;
	for (int i = 0; i < 5; i++)
		sum += a[i];
	printf("sum = %d\n", sum);

	return 0;
}

けいた

Re: c言語の問題。配列を引数とする。

#5

投稿記事 by けいた » 7年前

intを使うプログラムは例えば、入力した数値をそのまま表示させるプログラムです。(完全自作コード)
#include<stdio.h>

int main(void){

int a,b,c,d,e,i;

printf("数値① :");
scanf("%d",&a);
printf("数値② :");
scanf("%d",&b);
printf("数値③ :");
scanf("%d",&c);
printf("数値④ :");
scanf("%d",&d);
printf("数値⑤ :");
scanf("%d",&e);

printf("入力した値は、① :%d ② :%d ③ :%d ④ :%d ⑤ :%dです。\n",a,b,c,d,e);

return 0;

}

 記載してくださっているコードは5つの要素を持った配列aの0番から④番までに、キーボードから入力した値を代入し、その5つの配列中の値の総和を表示するプログラムです。

かずま

Re: c言語の問題。配列を引数とする。

#6

投稿記事 by かずま » 7年前

コードを載せるときは、フォーラムルールに従って、
codeタグを使ってください。

#4 でのお願いは、#2 で挙げた 2つのプログラムのうち
1. の配列を使わず、関数だけ使って和を表示するプログラムの
つもりだったんですが、そうは解釈されなかったようですね。
次のような解答を期待していました。

コード:

#include <stdio.h>

int sum_array(int a, int b, int c, int d, int e)
{
	return a + b + c + d + e;
}

int main(void)
{
	int a, b, c, d, e;

	printf("enter five numbers: ");
	scanf("%d%d%d%d%d", &a, &b, &c, &d, &e);
	printf("sum = %d\n", sum_array(a, b, c, d, e));
	return 0;
}
これを配列を使って書き直すと、

コード:

#include <stdio.h>

int sum_array(int a[], int n)
{
	int sum = 0;
	for (int i = 0; i < n; i++)
		sum += a[i];
	return sum;
}

#define N 5

int main(void)
{
	int a[N];

	printf("enter five numbers: ");
	for (int i = 0; i < N; i++)
		scanf("%d", &a[i]);
	printf("sum = %d\n", sum_array(a, N));
	return 0;
}
配列を使うと、個数を 50個に変更するのも簡単ですね。
配列を使わないと、50個の変数を用意するのは大変です。

さて、配列を関数に引数として渡す仕組みですが、
これは単純変数とは異なっています。

int func(int x) { return x * 2; } という関数があった時、
呼び出し側は、func(3) でも func(i) でも func(i + 3) でも構いません。
引数 x は、呼び出し側の引数の「値」で初期化されます。

配列の場合

コード:

int func2(int v[], int n) { return v[n-1]; }

int main(void)
{
	 int a[5] = { 3, 14, 15, 92, 65 };
	 int b = func2(a, 5);
}
配列 a の 5個の値が全部、配列 v にコピーされるわけではありません。

func2(a, 5) の a は、配列の先頭要素へのポインタに変換されます。
すなわち &a[0] です。

func2 の int v[] も int *v と宣言されたのを同じ解釈がされます。
このポインタ変数 v は、&a[0] の「値」で初期化されます。

v[n-1] というのは、*(v +(n-1)) と同じものと解釈され、
呼び出し元の a[5-1] を参照することができます。

func2 の中で v[0] = 7; を実行すると、呼び出し元の a[0] の値を
変更できます。呼び出し元の配列の要素を変更しない場合は、
int func2(const int *, int v) と書いたほうが良いでしょう。

こんな説明で分かっていただけますか?

最初の質問 #1 の 2 のプログラムは書けそうですか?

けいた

Re: c言語の問題。配列を引数とする。

#7

投稿記事 by けいた » 7年前

ありがとうございます!おかげさまで、完璧ではないですが、ある程度なら理解はできました。1、2も出来そうです!

返信

“C言語何でも質問掲示板” へ戻る