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;
}
No.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] が無駄になるけど気にしない
No.4
- 回答日時:
どこが悪いのかは、他の方が既に説明してますので、修正個所だけ。
for (i = 1; i <= 5; i++)
を
for (i = 0; i < 5; i++)
に変えてください。(3か所全て変えます)
No.3
- 回答日時:
これ、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] は使わない、というやり方もあります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
fortranでプログラムを実行する...
-
適切な変換関数が存在しない???
-
HEWを使用しているのですが、こ...
-
ビルド失敗 指定されたファイ...
-
フォームの作成中にエラーが発...
-
Debug Assertion Failed
-
Visual Studioのstrcpy_sについて
-
Excelのエラーで困ってます。
-
VBScriptのエラーの見つけ方及...
-
Fortran コンパイルエラーについて
-
subまたはfunctionが定義されて...
-
type
-
ユーザフォーム開くとエラーになる
-
visualstudioでコンパイルでき...
-
Dim x As Integer = 0
-
ハンドルされていない例外…
-
新版 明解 C++ 入門編 につ...
-
c#プログラムについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
python エラー
-
エクセルのエラーメッセージ「4...
-
適切な変換関数が存在しない???
-
fortranでプログラムを実行する...
-
Excelのエラーで困ってます。
-
Handlesについて
-
HEWを使用しているのですが、こ...
-
バッチからsqlplusの接続エラー...
-
デバッグ中のエラーのことで教...
-
VB2008で定数に色の設定をした...
-
コンパイルできません。
-
sys/time.hのインクルードがで...
-
multiple definitionというエラー
-
HANDLEの宣言でのエラー
-
BC30002: 型 'ListItem' が定義...
-
visual C++ でビルドの中止がで...
-
RightとLeft関数のライブ...
-
ビルド失敗 指定されたファイ...
-
Visual Studioのstrcpy_sについて
-
エクセルでマクロを実行すると...
おすすめ情報
i = 1; i <= 5; i++は変えない方針でいきたいのですがその場合どうすればいいのでしょうか?
わかりずらくてすみません…。ご指摘ありがとうございます。
0~4にして5つの数字を扱うということでしょうか。