電子書籍の厳選無料作品が豊富!

5人分の身長から最も高い身長を表示するプログラムをつくったのですが、エラーがでて実行できません。改善すべきところを教えてください。お願いします。
int main(void)
{
double a[5], max = 0;
int i;

for (i = 1; i <= 5; i++)
{
a[i] = 0;
}
printf("数値を5つ入力してください。\n");

for (i = 1; i <= 5; i++)
{
scanf("%lf", &a[i]);
}

for (i = 1; i <= 5; i++)
{
if (a[i] > max)
max = a[i];
}

printf("最も高い身長は%fです\n", max);

return 0;
}

質問者からの補足コメント

  • うーん・・・

    i = 1; i <= 5; i++は変えない方針でいきたいのですがその場合どうすればいいのでしょうか?

    No.4の回答に寄せられた補足コメントです。 補足日時:2017/09/10 09:41
  • わかりずらくてすみません…。ご指摘ありがとうございます。
    0~4にして5つの数字を扱うということでしょうか。

    No.3の回答に寄せられた補足コメントです。 補足日時:2017/09/10 09:56

A 回答 (6件)

double a[5] ;


と宣言したら、安全に使えるのは a[0] 〜 a[4] です。

なので、このプログラムを安全なものにするなら
・double a[5]はそのまま、 i=0;i<5;i++ にして、 i=0〜4 の範囲で使う
・「i = 1; i <= 5; i++は変えない」 のなら
 ・ i=1〜5を、 0〜4 に対応させて使う
   単純明快なのは、 a[i-1] とすること
 ・double a[5+1] と宣言して、a[5] を安全に使えるようにする。
   a[0] が無駄になるけど気にしない
    • good
    • 1

>i = 1; i <= 5; i++は変えない方針でいきたいのですがその場合どうすればいいのでしょうか?


それでしたら
a[i]を
a[i-1]
に全て変えてください。
    • good
    • 1
この回答へのお礼

わかりました、ありがとうございます。

お礼日時:2017/09/10 09:57

どこが悪いのかは、他の方が既に説明してますので、修正個所だけ。


for (i = 1; i <= 5; i++)

for (i = 0; i < 5; i++)
に変えてください。(3か所全て変えます)
この回答への補足あり
    • good
    • 0

これ、C言語だと「コンパイルエラー」にならないし、実行も正常に動作する(こともある)、というものです。



○コンパイル時にメッセージが出るものには、次の2つがあります。
 ・エラー(error): 致命的な間違いでコンパイルできない
 ・警告(warning): 致命的ではないので、コンパイル自体はできる。
   最終的に問題の原因になる可能性がある
○「コンパイルエラーが出て実行できない」と「実行したらエラーになる」とは別です。


「エラーがでて実行できません。」というのが、どんな状況なのか、正確にわからないと、答える側も答えが難しくなります。
(今回くらいのものなら、なんとかなりますが)

質問するにしろ、自分でなんとかするにしろ、エラーや警告を正確に捉えることが大事です。



(1) printf,scanf が「未定義」という「警告」または「エラー」になる。
C言語だと、宣言していない関数は自動で 「引数任意、戻り値int」で宣言されたものと見做し、コンパイルを進めます。
その旨を警告として表示されることがあります。
今回の場合、たまたま、scanfとprintf は 「引数任意、戻り値int」(と同等)なので、そのまま正常にコンパイルできます。

C++だと、そのような「暗黙の宣言」をしないので、「未定義」のエラーとなります。

printf等の関数を使う場合は、適切なヘッダファイルを#includeしましょう。
C言語なら #include <stdio.h>
C++なら #include <cstdio>


(2) 既に指摘がありますが、 a[5] と宣言した配列で使えるのは a[0]〜a[4] の5つです。
対して、for( i=1;i<=5;i++) { 〜 a[i] 〜 } と、 a[1]〜a[5] を使っています。

C/C++ の場合、a[5] を指定すること自体は間違いではありません。
その結果がどうなるかわからない、というだけです。
たまたまa[5]に該当するのが他に影響の出ない領域で、プログラムが期待通りに動作する、ということ有り得ます。
エラーになるときも、全然関係箇所で実行時エラーになって、本当の原因がよくわからない、ということもあります。

配列を使うときは、プログラム作成者が注意して使うしか、対策はありません。

解決策は 0〜4 になるようにするのが一般的ですが、
a[5+1] にして、a[0]〜a[5] を使えるようにして、 a[0] は使わない、というやり方もあります。
この回答への補足あり
    • good
    • 1

エラー箇所は明白ですが...(a[5])


エラー発生時の対処するには、どんなエラーメッセージが出ているかが、重要な
ヒントになります。
質問する際にも、エラーメッセージを略さず訳さず提示する方が良いです。
    • good
    • 0
この回答へのお礼

すみませんでした。今後は気を付けますね。

お礼日時:2017/09/10 09:52

どこでエラーが出るのかわからないけど、ループの部分はfor(i=0;i<5;i++)でないと配列外を見ちゃうよ。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A