最大値を返す関数作成について

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

最大値を返す関数作成について

#1

投稿記事 by かな » 18年前

学校で「数値配列の最大値を返す関数を作成しなさい」というものがでました。
誰かおしえてください。

管理人

Re:助けて><

#2

投稿記事 by 管理人 » 18年前

こんにちは。管理人です。

では、どの辺まで理解していらっしゃいますか?
この関数を作成するには

・関数への値渡し
・最大値計算
・返り値渡し

が理解できていれば出来るものと思います。

main関数のみで最大値を求めなさいと言われたら作成できますか?
今どの辺までできていらっしゃるでしょうか。

かな

Re:助けて><

#3

投稿記事 by かな » 18年前

最大値計算はできると思うのですが・・・・数値配列の意味と「返す」というところがわからないです。

管理人

Re:助けて><

#4

投稿記事 by 管理人 » 18年前

なるほど、では念のため、最大値についてもご説明しますね。


・最大値計算


これは簡単です。大きい順、小さい順に並び替えるのなら少し考えてプログラムを組む必要がありますが、
大きいものだけ取り出せばいいのなら簡単です。
for文で配列要素数だけループさせ、
int max;
で用意した最大値を格納するmaxという変数に初め、配列の最初の要素を代入します。
配列がxという名前なら
max=x[0];
を最初に書きます。
後はループ文の中で、今の配列要素とmaxの値を比較し、maxより今の配列要素の方が大きければその時maxにその配列要素を代入する操作を繰り返せばいいのです。配列要素の番号を1ずつ進めていきましょう。

これで最大値計算処理が出来ます。

以下ご覧ください。
#include <stdio.h>
int main(){
	int i,x[5]={1,8,3,6,7},max;
	max=x[0];
	for(i=0;i<5;i++)
		if(max<x)
			max=x;
	printf("%d",max);
	return 0;
}


これを実行してみてください。8が出力されるはずです。
アルゴリズムは上記を参考にしてください。
次は関数についてご説明します。

管理人

Re:助けて><

#5

投稿記事 by 管理人 » 18年前

最大値を求める関数を作るときは

・ポインタを使う
・最大値を返り値として返す

という2種類の作り方がありますが、問題の回答として後者がふさわしいと思うので、
こちらをご説明します。

まず、最大値とかはおいといて、関数化について考えてみましょう。

メイン関数の中でmax_returnという名前の関数に処理を渡して戻ることを考えます。
#include <stdio.h>

int max_return(){

    return 0;
}

int main(){
  
    max_return();

    return 0;
}
これが最小限の処理になりますが、ここまで大丈夫ですか?
どの関数にも「return」と書いてありますね。
これが返り値を示すもので、returnの次に書いてある数字が関数を呼び出したところへ返ります。
つまりこの場合両者とも0が返ってくるわけですね。

では、これならどうでしょう。
#include <stdio.h>

int max_return(){

    return 1;
}

int main(){
	int i;

	i=max_return();//★

	printf("%d  \n",i);

    return 0;
}
return で書いた数字はその関数をよんだところに返るといいましたね。
つまりmax_return関数をmain関数で呼んだ//★の所に1が返ってきますね。
ということは、iには何が入っているでしょうか?
printfで出力される結果を予想しましょう。

実際に上記プログラムをコンパイルして、その予想とあっているか確かめてください。

仕上げにこちら。
#include <stdio.h>

int max_return(int a){

	a = a+5;

    return a;
}

int main(){
	int max;

	max=max_return(6);

	printf("max = %d\n",max);

    return 0;
}
出力されるprintf文には何が出力されるか考え、実際にコンパイルして実行し、確認してください。
(現時点で考える範囲ではmain関数のreturn 0;はあってもなくても変わらないです。)

ここまで解れば後は簡単です。ここまでで、わからないところがあれば聞いてください。

かな

Re:助けて><

#6

投稿記事 by かな » 18年前

たいへんよくわかりました☆
本当にありがとうございました≧ー≦。

管理人

Re:助けて><

#7

投稿記事 by 管理人 » 18年前

あ、サンプルプログラムを用意していましたが、もう全部出来ました?

一番いいのはサンプルを見ずに全部自分で完成させてしまう事ですが、それが出来たのでしたら

よかったです☆

せっかく作ったのでよければ、サンプル見てください。

これは要素数に影響されず、どんな配列のサイズでも、対応します。


☆アルゴリズム解説☆

最大値を計算する過程で「何回ループするか」を直接先ほど「5」としましたが
渡される要素数は何個かわからないので、いつも「5」とするわけにはいきません。
ですから、配列の大きさを事前にチェックし、その値も渡してやるとよいでしょう。

len = sizeof(x) / sizeof(x[0]);

ここの部分ですが、sizeof関数は、そのデータのある領域サイズを返す関数です。
int型という変数は1つで4バイトという領域の大きさを取ります。
int i;
と宣言すれば、i用の4バイトの領域が確保されます。
int i[3];
と宣言すれば、i用の12バイトの領域が確保されます。
i[3]
の「3」が今わからないとして、この3を調べるにはどうしたらいいでしょうか?
それは「全体の領域サイズ÷1つの領域サイズ」を調べてやればいいですね。
よって

len = sizeof(x) / sizeof(x[0]);

このように書くことで、lenには配列の要素数が入り、この数だけループすればいいことがわかります。
ですから、max_return関数には、xだけでなく、このlenも渡し、lenだけループさせてみてください。

今回はxの要素数を7としました。
要素数を変更しましたが、きちんと最大値が求まっています。
max_return関数内で、きちんと7回ループが行われているからです。
#include <stdio.h>

int max_return(int x[/url],int len){
	int max,i;
	max=x[0];
	for(i=0;i<len;i++)
		if(max<x)
			max=x;
	return max;
}

int main(){
	int m,x[7]={4,5,1,8,3,6,9},len;

	len = sizeof(x) / sizeof(x[0]);

	m=max_return(x,len);

	printf("最大値は[%d]\n",m);

	return 0;
}



実際にコンパイルしてみてください。
さっきとは違う「9」が出力されるはずです。

このプログラムがしっかり理解できると

len = sizeof(x) / sizeof(x[0]);

「この処理はmax_return関数内に書いたほうがいいんじゃないの?
そうすれば値を渡す数も1つで済むし」
と思うかもしれませんけど、これは理由があって、
そのまま考えたんじゃ出来ないんです。
max_return関数内でsizeof(x)を行うと「4」になってしまいます。
データ1個分しか無い事になってしまいます。
その辺の奥深い話は興味があったら調べてみてください。

管理人

Re:助けて><

#8

投稿記事 by 管理人 » 18年前

宣伝:

もっと授業が進むとソートアルゴリズムの話になるでしょう。
「再起関数を初めて見て、クイックソートプログラムを見ても意味わかんない!」

なんて時は、

http://dixq.net/sort.html

こちら利用してみてください。きっと解っていただけるはずです♪

夢霧

複数のファイルを使ってコンパイル

#9

投稿記事 by 夢霧 » 18年前

初めまして。
つい先日からプログラミングを勉強し始めた者です。
実は、本当に初歩のことなのですが、シューティングゲームの館の方の6番の、『プログラムを分割する』が
上手くいかずに困っています。
全てのファイルが未解決になってしまいます。
Borlandを使っているので、説明どうりに出来ず、どうしていいのかわかりません。
どうすればいいのでしょうか?教えてください。
お願いします。

管理人

Re:初歩の初歩のことだと思いますが・・・

#10

投稿記事 by 管理人 » 18年前

こんにちは。

そのようにファイルを分割してコンパイルすることを「分割コンパイル」と言います。

Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。

Visual Studioなどでしたらそのままコンパイルするだけで自動的にしてくれるんですが。

http://www.google.co.jp/search?hl=ja&q= ... %83%AB&lr=

この辺を参考にしてみてください。

box

Re:初歩の初歩のことだと思いますが・・・

#11

投稿記事 by box » 18年前

> Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。

BCC Developerというフリーの開発環境を使うと、
複数のソースファイルからなるプログラムの開発が
比較的スムーズにできます。

プロジェクトという概念の下に、複数のソースファイル(ヘッダーファイル含む)を
登録しておき、Ctrl+F9一発でビルドします。

Justy

Re:初歩の初歩のことだと思いますが・・・

#12

投稿記事 by Justy » 18年前

 分割コンパイルは BCCの場合、幾つか方法があります。

 今後の事も考えるとメイクファイルを使う方式でコンパイルしておくといいと思います。

http://www.geocities.co.jp/Milano/8000/bcc/make.html
http://www.neco.nu/gohodoji/bccfaq/bccfaq.html


 これが面倒なら
http://www.hi-ho.ne.jp/jun_miura/bccdev.htm

 このツールを使ってみるのもいいかと思います。

夢霧

Re:初歩の初歩のことだと思いますが・・・

#13

投稿記事 by 夢霧 » 18年前

ありがとうございます!
いろいろ参考にさせていただきます!

閉鎖

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