• ベストアンサー

計算後に配列の中身が入れ替わってしまう

内容を見ていただき、ありがとうございます。私は現在Cを勉強中で、練習の一環として次のようなプログラムを作っていました。 このプログラムは、2つのグループの人数をキーボードから入力して、それぞれのグループの割合を表示するというものです。そこで私の書いたソースは以下の通りです。 /****************** #include<stdio.h> main(){ double score[2]; int i = 0; double sum; ++i; printf("グループ%dの人数:",i); scanf("%lf",&score[i]); ++i; printf("グループ%dの人数:",i); scanf("%lf",&score[i]); sum = score[1] + score[2]; score[1] = score[1] / sum *100; score[2] = score[2] / sum *100; printf("人数の割合は\nグループ1 グループ2\n"); printf("%9.1lf%%%9.1lf%%",score[1],score[2]); return 0; } ***************/ ソースを見る限り、それぞれのグループの割合が表示されるはずだと思ったのですが、これを実行するとグループ2の割合が常に100%になってしまいます。検証してみますと、16行目の sum = score[1] + score[2]; のあとでscore[2]の人数がsumと入れ替わっているようです。この原因は、配列を0から始めなかったことと関係があるのではないかと思い、末尾のプログラムのように配列の開始番号を0からにすると狙い通りに作動しました。 しかし、未だに何故このような動きになるのかがわかりません。このような事態をどのように表現して良いのかもわかりませんので、検索もできませんでした。 そこで、どなたかこの現象についてご存知の方がいらっしゃいましたら、ご教授願えないでしょうか。よろしくお願いいたします。 /********************* #include<stdio.h> main(){ double score[2]; int i = 0; double sum; printf("グループ%dの人数:",i+1); scanf("%lf",&score[i]); ++i; printf("グループ%dの人数:",i+1); scanf("%lf",&score[i]); ++i; sum = score[0] + score[1]; score[0] = score[0] / sum *100; score[1] = score[1] / sum *100; printf("人数の割合は\nグループ1 グループ2\n"); printf("%9.1lf%%%9.1lf%%",score[0],score[1]); return 0; } ***********/

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

  • ベストアンサー
  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

>double score[2]; 間違い、これは「doubleの要素を2個分」の宣言。 >sum = score[1] + score[2]; >score[1] = score[1] / sum *100; >score[2] = score[2] / sum *100; は要素が0~2の「3個分」使用している。 従って double score[3]; が正しい。 ちなみに、「内容が反転」しているわけではなく、 「double score[2];」と二つ分しかないのに「score[2] = 」としたため、 score[]の次に割当たられたメモリ領域(今回の場合はdouble sum;)を破壊しているだけ。 # 何度も投降しなおすのはやめてほしいなぁ。

Caryo_t
質問者

お礼

ありがとうございます。VBから入ったもので、厳密なメモリの使い方などには疎く、とても勉強になります。今は解ったようなつもりになっているだけかもしれませんが、良く解りました。また何か疑問が生じました際には、ご助言のほどよろしくお願いいたします。 また、この度は再投稿を繰り返したため、ご迷惑をおかけいたしました。内容の誤りに気付きましたもので、すみません。次回からは気をつけます。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

double score[2]; と定義したときに, 添え字としてどのような値が使えるかを再度確認してください.

Caryo_t
質問者

お礼

添え字ですね。ありがとうございます。また勉強して、わからないときには再度お伺いしたいと思いますので、その節にはよろしくお願いいたします。

関連するQ&A