最大値を返す関数作成について
Re:助けて><
なるほど、では念のため、最大値についてもご説明しますね。
・最大値計算
これは簡単です。大きい順、小さい順に並び替えるのなら少し考えてプログラムを組む必要がありますが、
大きいものだけ取り出せばいいのなら簡単です。
for文で配列要素数だけループさせ、
int max;
で用意した最大値を格納するmaxという変数に初め、配列の最初の要素を代入します。
配列がxという名前なら
max=x[0];
を最初に書きます。
後はループ文の中で、今の配列要素とmaxの値を比較し、maxより今の配列要素の方が大きければその時maxにその配列要素を代入する操作を繰り返せばいいのです。配列要素の番号を1ずつ進めていきましょう。
これで最大値計算処理が出来ます。
以下ご覧ください。
これを実行してみてください。8が出力されるはずです。
アルゴリズムは上記を参考にしてください。
次は関数についてご説明します。
・最大値計算
これは簡単です。大きい順、小さい順に並び替えるのなら少し考えてプログラムを組む必要がありますが、
大きいものだけ取り出せばいいのなら簡単です。
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:助けて><
最大値を求める関数を作るときは
・ポインタを使う
・最大値を返り値として返す
という2種類の作り方がありますが、問題の回答として後者がふさわしいと思うので、
こちらをご説明します。
まず、最大値とかはおいといて、関数化について考えてみましょう。
メイン関数の中でmax_returnという名前の関数に処理を渡して戻ることを考えます。
どの関数にも「return」と書いてありますね。
これが返り値を示すもので、returnの次に書いてある数字が関数を呼び出したところへ返ります。
つまりこの場合両者とも0が返ってくるわけですね。
では、これならどうでしょう。
つまりmax_return関数をmain関数で呼んだ//★の所に1が返ってきますね。
ということは、iには何が入っているでしょうか?
printfで出力される結果を予想しましょう。
実際に上記プログラムをコンパイルして、その予想とあっているか確かめてください。
仕上げにこちら。
(現時点で考える範囲ではmain関数のreturn 0;はあってもなくても変わらないです。)
ここまで解れば後は簡単です。ここまでで、わからないところがあれば聞いてください。
・ポインタを使う
・最大値を返り値として返す
という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:助けて><
あ、サンプルプログラムを用意していましたが、もう全部出来ました?
一番いいのはサンプルを見ずに全部自分で完成させてしまう事ですが、それが出来たのでしたら
よかったです☆
せっかく作ったのでよければ、サンプル見てください。
これは要素数に影響されず、どんな配列のサイズでも、対応します。
☆アルゴリズム解説☆
最大値を計算する過程で「何回ループするか」を直接先ほど「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回ループが行われているからです。
実際にコンパイルしてみてください。
さっきとは違う「9」が出力されるはずです。
このプログラムがしっかり理解できると
len = sizeof(x) / sizeof(x[0]);
「この処理はmax_return関数内に書いたほうがいいんじゃないの?
そうすれば値を渡す数も1つで済むし」
と思うかもしれませんけど、これは理由があって、
そのまま考えたんじゃ出来ないんです。
max_return関数内でsizeof(x)を行うと「4」になってしまいます。
データ1個分しか無い事になってしまいます。
その辺の奥深い話は興味があったら調べてみてください。
一番いいのはサンプルを見ずに全部自分で完成させてしまう事ですが、それが出来たのでしたら
よかったです☆
せっかく作ったのでよければ、サンプル見てください。
これは要素数に影響されず、どんな配列のサイズでも、対応します。
☆アルゴリズム解説☆
最大値を計算する過程で「何回ループするか」を直接先ほど「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:助けて><
宣伝:
もっと授業が進むとソートアルゴリズムの話になるでしょう。
「再起関数を初めて見て、クイックソートプログラムを見ても意味わかんない!」
なんて時は、
http://dixq.net/sort.html
こちら利用してみてください。きっと解っていただけるはずです♪
もっと授業が進むとソートアルゴリズムの話になるでしょう。
「再起関数を初めて見て、クイックソートプログラムを見ても意味わかんない!」
なんて時は、
http://dixq.net/sort.html
こちら利用してみてください。きっと解っていただけるはずです♪
複数のファイルを使ってコンパイル
初めまして。
つい先日からプログラミングを勉強し始めた者です。
実は、本当に初歩のことなのですが、シューティングゲームの館の方の6番の、『プログラムを分割する』が
上手くいかずに困っています。
全てのファイルが未解決になってしまいます。
Borlandを使っているので、説明どうりに出来ず、どうしていいのかわかりません。
どうすればいいのでしょうか?教えてください。
お願いします。
つい先日からプログラミングを勉強し始めた者です。
実は、本当に初歩のことなのですが、シューティングゲームの館の方の6番の、『プログラムを分割する』が
上手くいかずに困っています。
全てのファイルが未解決になってしまいます。
Borlandを使っているので、説明どうりに出来ず、どうしていいのかわかりません。
どうすればいいのでしょうか?教えてください。
お願いします。
Re:初歩の初歩のことだと思いますが・・・
こんにちは。
そのようにファイルを分割してコンパイルすることを「分割コンパイル」と言います。
Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。
Visual Studioなどでしたらそのままコンパイルするだけで自動的にしてくれるんですが。
http://www.google.co.jp/search?hl=ja&q= ... %83%AB&lr=
この辺を参考にしてみてください。
そのようにファイルを分割してコンパイルすることを「分割コンパイル」と言います。
Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。
Visual Studioなどでしたらそのままコンパイルするだけで自動的にしてくれるんですが。
http://www.google.co.jp/search?hl=ja&q= ... %83%AB&lr=
この辺を参考にしてみてください。
Re:初歩の初歩のことだと思いますが・・・
> Borlandで分割コンパイルしたことがないので、よくわかりませんが、フリー版では結構難しかった覚えがあります。
BCC Developerというフリーの開発環境を使うと、
複数のソースファイルからなるプログラムの開発が
比較的スムーズにできます。
プロジェクトという概念の下に、複数のソースファイル(ヘッダーファイル含む)を
登録しておき、Ctrl+F9一発でビルドします。
BCC Developerというフリーの開発環境を使うと、
複数のソースファイルからなるプログラムの開発が
比較的スムーズにできます。
プロジェクトという概念の下に、複数のソースファイル(ヘッダーファイル含む)を
登録しておき、Ctrl+F9一発でビルドします。
Re:初歩の初歩のことだと思いますが・・・
分割コンパイルは 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
このツールを使ってみるのもいいかと思います。
今後の事も考えるとメイクファイルを使う方式でコンパイルしておくといいと思います。
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
このツールを使ってみるのもいいかと思います。