• ベストアンサー

以下のプログラムについて教えてください

#include<iostream.h> int main() { int i; int ninzu=0; int tensu[6]; int rakudai[6]; cout<<"6人の点数を入力!\n"; for(i=0; i<6;i++) { cout<<i+1<<"番:"; cin>>tensu[i]; if(tensu[i]<60) { rakudai[ninzu]=i; ninzu++;} } cout<<"60点未満は"<<ninzu<<"人です。\n"; for(i=0; i<ninzu; i++) cout<<rakudai[i]+1<<"番:"<<tensu[rakudai[i]]<<"点\n"; return(0); } というテストの点数が60点未満の学生の一覧表を出力するというプログラムなんですが、12行目からの rakudai[ninzu]...以降が よくわかりません。配列の数を指定するところに数字以外のものが来るというのはいったいどういうことなのでしょう?どなたか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • natural
  • ベストアンサー率37% (419/1115)
回答No.6

>rakudai[ninzu]=iの、=iっていうのがピンときません。 iは何番目の人かを表します。 え~と、まず落第者が1人目(48点)と6人目(54点)だったとしましょうか。(点数の格納処理は省略して説明します) この場合落第者は2名なのでrakudai配列は2コマ使われるわけですが、この2コマにi、つまり何番目の人だったかを記録します。 1人目の処理はiが0から始まりますので「0番目の人」として処理されます。 そしてninzuも0から始まる為、rakudai[0]に「0番目の人」として記録されます。 そしてninzuは1加算され次の落第者の格納に備えます。 引き続いて1番目、2番目・・・4番目と処理されますが、何れも落第点ではないのでrakudai配列には格納されません。 次に5番目の人(実際には6人目)ですが落第点ですのでrakudai配列に格納されます。 先程ninzuが1になっていたことを思い出してください。 つまりここではrakudai[1]にi、つまり5が格納されたのです。 で、再びninzuがインクリメントされ、2になります。 そして引き続き6番目以降の人の処理が行われますが、落第者は以上でしたね。 結果を見てみましょう。 rakudai[0] → 0が入っている rakudai[1] → 5が入っている ninzu    → 2になっている これを結果表示するときは、 cout<<"60点未満は"<<ninzu<<"人です。\n"; と cout<<rakudai[i]+1<<"番:"<<tensu[rakudai[i]]<<"点\n"; ですから 60点未満は2人です。 1番:48点 6番:54点 となります。 解りにくいかな?(^_^;

yabuchanchan
質問者

お礼

なるほど!!非常によくわかりました。やっぱり、具体的に言って頂くと、ものすごく良く分かります。それにしてもやっぱりプログラムってややこしいですね。 でも、分かるとカイカンです。みなさん、いろいろありがとうございました!!! これからも、勉強つづけて、わかんなくなったらまたここに来たいとおもいます。

その他の回答 (5)

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.5

再びです。 >rakudai[ninzu]=iの、=iっていうのがピンときません ということなので、補足いたします。 08 for(i=0; i<6;i++) 09 { cout<<i+1<<"番:"; 10 cin>>tensu[i]; 11 if(tensu[i]<60) 12 { rakudai[ninzu]=i; 13 ninzu++;} 14 } ※わかり易いように行数つけました。 で、rakudai[ninzu]=i;の i ですが、8行目で、for文のカウンタになっています。 For文は14行目まで続き、繰り返しています。 9行目は、画面表示です。10行目の、入力を促しています。 11行目で、入力された、点数を比較しています。60店以下、残念ながら落第さんの処理に入ります。 12行目で、rakudai配列 ninzu人目(落第の人数だけ)に、i(何番目に入力された受験者か)を代入します。 13行目で、ninzuを+1します。(落第の人数が増えましたから。) なので、iは、受験番号、ninzuは、落第した人間の数 といった感じです。 この辺で、理解できますでしょうか? わからなかったら、補足ください。 でわ

yabuchanchan
質問者

お礼

早速のご回答ありがとうございます。iはforのカウンタですか・・・。やっとわかりました。しかし、まだひとつ疑問点があるのですが、なぜ、iをrakudai配列にiを代入するんでしょう?いまいちピンときません。しつこいようですが、ご回答頂けたら嬉しいです。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.4

更に補足させて頂きます。 >if(tensu[i]<60) >{ rakudai[ninzu]=i; >ninzu++;} >} 特にこの部分だと思いますのでここを重点的に。 まずif文の条件としては「i番目の人の点数は60点未満?」としていますよね。 次にその条件を満たした場合の処理なのですが、rakudaiという配列にはボーダーラインを割った人が誰であるか(つまり何番目の人か:但しここでは0番目からの通番)を記録していきます。 最初の落第者はrakudaiの0番目に記録されるのですが、これはninzuが0で初期化されていますので問題ないですよね? 次の行ではninzuをインクリメントしています。 これはrakudaiの次の落第者を格納する位置に移動する為であると同時に、この変数の名前が示すように落第者の人数そのものを数える役目にもなっています。 こんな感じですが・・・、混乱してしまうようなら無視して下さいね。(^_^;

yabuchanchan
質問者

お礼

お返事ありがとうござます。 説明して頂いた内容はわかったんですが、rakudai[ninzu]=iの、=iっていうのが ピンときません。これの意味を教えていただければ嬉しいです。

  • tediwec
  • ベストアンサー率70% (21/30)
回答No.3

こんにちは。 Haizyさんが書かれたように、配列の要素の指定には 変数を使うことが出来ます。 これができないと、例えば int a[100]; という配列の全ての要素に1を入れたい時に a[0] = 1; a[1] = 1; ... a[99] = 1; とすべて書かなくてはならなくなります。 for(int i = 0; i < 100; i++) a[i] = 1; なら簡単です。

yabuchanchan
質問者

お礼

そうですね。配列の要素に変数使うと、便利ですね。そこまで、本に書いてなかった(というか、まだそこまで進んでなくて)混乱してしまいました。 ありがとうございました。

  • itohh
  • ベストアンサー率45% (210/459)
回答No.2

こんにちは。itohhといいます。 >for(i=0; i<6;i++) >{ cout<<i+1<<"番:"; >cin>>tensu[i]; >if(tensu[i]<60) ここのiについては、おわかりですか? > rakudai[ninzu]=i; だけが、わからないというのもヘンですよ! 例を出して解説すると。 rakudaiというタンスが有ったとします。 タンスの抽斗は6個です。 iというカードを見てカードに書かれている数字が60未満だったら、 ninzuというカウンタ(手のひらの中に入れてカチカチすると数字があがる器械) の数字と同じ番号の抽斗にiというカードをしまいます。 そして、ninzuというカウンタをカウントアップ(カチカチとする)します。 ちょっと下手くそな、こんな説明で解りますかねぇ!!

yabuchanchan
質問者

お礼

お返事ありがとうございます。rakudai[ninzu]=1の部分なんですが、rakudaiという配列の数は、ninzuの数に依存するということなんですよね?つまり、最初は0なんですよね?でも、まだいまいち分からないのは、=iの部分なんです。iというカードをみるっていうところがいまいち分からないんですが・・・・・。

  • Haizy
  • ベストアンサー率40% (404/988)
回答No.1

こんにちは。 rakudai[ninzu]=i; の部分ですか? ninzuは、先に宣言されている変数ですね。 int ninzu=0; 配列部分には、変数を指定する事が可能です。 そのあとで、その変数(60点以下の人数)がカウントされていますね。 疑問点は、このあたりでよろしいでしょうか。 何かありましたら、補足ください。 でわ

yabuchanchan
質問者

お礼

配列部分に変数が来るということは、たとえば、a[n]とした時、nには任意の数字を 代入することが出来るということですね。なんとなく分かりました。

関連するQ&A