下記のプログラムはやりたい動作はできましたが999を押したときに終了してほしいのですが正常にプログラムを終了してくれません。エラーが出ているわけではないのでどこがよくないのかわかりません。どこかおかしな点はありますか?
#include <stdio.h>
int main(void)
{
//a=生徒の数、sum=合計、ave=平均
float a[20];
int sum=0, i, j=0;
for(i=1; i<=20; i++)
{
printf("順番にタイムを記録してください\n");
scanf("%f",&a);
sum=sum+a;
}
printf("20人の平均は%5.1fです\n",(double)sum/20);
while(1){
printf("1から20の順番で出力したい記録を入力してください(999で終了)");
scanf("%d",&j);
printf("%5.1f秒です\n",a[j]);
if(j==999)
break;
}
return 0;
}
正常にプログラムを終了できない理由
Re: 正常にプログラムを終了できない理由
メル さんが書きました:どこかおかしな点はありますか?
- for文の終了条件が間違っており、確保されていないa[20]にアクセスしてしまいます。(これは前回も指摘しました)
- while文のループの中でjの範囲をチェックしていないので、999などの0以上20未満の値以外が入力された時、確保されていない領域にアクセスしてしまいます。
- scanfの戻り値をチェックしていないため、特にwhile文の中のscanfで無効な入力を読み込もうとすると無限ループになる可能性があります。
オフトピック
同じようなコードに関する質問が、前のトピックが解決にならないうちに連続して出てくるのも少しおかしい気がします。
解決したトピックは、解決チェックをお願いします。
解決したトピックは、解決チェックをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 正常にプログラムを終了できない理由
[*]for文の終了条件が間違っており、確保されていないa[20]にアクセスしてしまいます。(これは前回も指摘しました)
[*]while文のループの中でjの範囲をチェックしていないので、999などの0以上20未満の値以外が入力された時、確保されていない領域にアクセスしてしまいます。
[*]scanfの戻り値をチェックしていないため、特にwhile文の中のscanfで無効な入力を読み込もうとすると無限ループになる可能性があります。[/list]
とりあえず2番?までは直しました(あってないかもしれません)。3番の戻り値がわからないです。戻り値とはreturnのことですよね?これはどうすればいいのでしょうか。戻り値について調べてもよくわかりません。
#include <stdio.h>
int main(void)
{
//a=生徒の数、sum=合計、ave=平均
float a[20], sum=0;
int i, j=0;
for(i=0; i<20; i++)
{
printf("順番にタイムを記録してください\n");
scanf("%f",&a);
sum=sum+a;
}
printf("20人の平均は%5.1fです\n",(double)sum/20);
while(1){
if(0<=j<20)
printf("1から20の順番で出力したい記録を入力してください(999で終了)");
scanf("%f",&j);
printf("%5.1f秒です\n",a[j-1]);
if(j==999)
break;
}
return 0;
}
[*]while文のループの中でjの範囲をチェックしていないので、999などの0以上20未満の値以外が入力された時、確保されていない領域にアクセスしてしまいます。
[*]scanfの戻り値をチェックしていないため、特にwhile文の中のscanfで無効な入力を読み込もうとすると無限ループになる可能性があります。[/list]
とりあえず2番?までは直しました(あってないかもしれません)。3番の戻り値がわからないです。戻り値とはreturnのことですよね?これはどうすればいいのでしょうか。戻り値について調べてもよくわかりません。
#include <stdio.h>
int main(void)
{
//a=生徒の数、sum=合計、ave=平均
float a[20], sum=0;
int i, j=0;
for(i=0; i<20; i++)
{
printf("順番にタイムを記録してください\n");
scanf("%f",&a);
sum=sum+a;
}
printf("20人の平均は%5.1fです\n",(double)sum/20);
while(1){
if(0<=j<20)
printf("1から20の順番で出力したい記録を入力してください(999で終了)");
scanf("%f",&j);
printf("%5.1f秒です\n",a[j-1]);
if(j==999)
break;
}
return 0;
}
Re: 正常にプログラムを終了できない理由
だいぶ完成しました。あとは結果で999を打ち込んだときそのまま終了してほしいのですが0.0秒ですと表記されて終了してしまいます。助言よろしくお願いします。
#include <stdio.h>
int main(void)
{
//a=生徒の数、sum=合計、ave=平均
float a[20], sum=0;
int i, j=0;
for(i=0; i<20; i++)
{
printf("順番にタイムを記録してください\n");
scanf("%f",&a);
sum=sum+a;
}
printf("20人の平均は%5.1fです\n",(double)sum/20);
while(1){
0<=j;
j<20;
printf("1から20の順番で出力したい記録を入力してください(1000で終了)");
scanf("%d",&j);
printf("%5.1f秒です\n",a[j-1]);
if(j==999){
printf("終了します");
break;}}
return 0;
}
#include <stdio.h>
int main(void)
{
//a=生徒の数、sum=合計、ave=平均
float a[20], sum=0;
int i, j=0;
for(i=0; i<20; i++)
{
printf("順番にタイムを記録してください\n");
scanf("%f",&a);
sum=sum+a;
}
printf("20人の平均は%5.1fです\n",(double)sum/20);
while(1){
0<=j;
j<20;
printf("1から20の順番で出力したい記録を入力してください(1000で終了)");
scanf("%d",&j);
printf("%5.1f秒です\n",a[j-1]);
if(j==999){
printf("終了します");
break;}}
return 0;
}
Re: 正常にプログラムを終了できない理由
scanf("%d",&j);の後、printf("%5.1f秒です\n",a[j-1]);の前にjが999だったら終了する処理を入れてください。メル さんが書きました:あとは結果で999を打ち込んだときそのまま終了してほしいのですが0.0秒ですと表記されて終了してしまいます。助言よろしくお願いします。
また、
というコードは全く意味がなく、コンパイラとオプションによっては警告が出るはずです。メル さんが書きました: 0<=j;
j<20;
戻り値が期待した値かをチェックし、そうでなければ強制終了するのが簡単でしょう。メル さんが書きました:3番の戻り値がわからないです。戻り値とはreturnのことですよね?これはどうすればいいのでしょうか。戻り値について調べてもよくわかりません。
scanf("%f",&a); → if(scanf("%f",&a)!=1)return 1;
scanf("%d",&j); → if(scanf("%d",&j)!=1)return 1;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)