こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語のプログラム添削お願いします

#include<stdio.h>
int main(void)
{
int a[4];
int i=0;
int n;
int sum=0;
printf("正数を入力してください\n");
while(i<=4)
{scanf("%d",&n);
if(n>=0)
{a[i]=n;
sum=sum+a[i];
i++;
}
else{printf("正数を入力してください");}
}
printf("正数の合計値は%dです",sum);
printf("正数の平均値は%lfです",(double)(sum/5));
return(0);
}


上記は正数のみ配列に保存し、その合計と平均を表示するプログラムを
製作しようとして書いたものですが次のような問題点があり正常に機能しません。
(1)a[i]=n;をn=a[i];と置き換えると不正な値が表示される
(2)平均値の小数点以下の値がおかしい
  (例)8+8+8+9+8と入力し合計値41に対し、平均値が8.000000
解決法が分からず困っています。どなたかお力添えお願いします。

投稿日時 - 2012-01-04 11:34:22

QNo.7224335

すぐに回答ほしいです

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

#2です。

> a[i]=n;とn=a[i];は動作上別ということでしょうか?

そこから…?

どういう動作を期待しているのか判りませんが、

a[i]=n;
a[i]にnの値を「代入」する。

n=a[i];
nにa[i]の値を「代入」する。

このときnの値は入力しているから判っているけど、a[i]の値はまだ決まっていないので、何が入るか判らない。

投稿日時 - 2012-01-06 10:37:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

Wr5

>int a[4];
で、
>while(i<=4)
のループをして見せたり、
バッファオーバーラン前提で、
>printf("正数の平均値は%lfです",(double)(sum/5));
5個と思っている時点でどうかと……。

int a[4];
で用意されるのは、
a[0]、a[1]、a[2]、a[3]という「4個」のint型の変数です。

「4以下」のループは4も含みますから、4つの箱に5個納める方法を考えないといけません。
CPUにとってはそんなコト知ったことではありませんから…隣にあると思われる箱にとりあえず放り込んで完了です。
隣にある箱はiかも知れません。
# 5回目の入力で「2」を入力したときにどうなりますかね?

他の部分については既に回答がありますので。

あと……「C/C++」のカテゴリありますからそちらの方がふさわしいかと。

投稿日時 - 2012-01-04 15:15:57

ANo.2

(1)a[i]=n;をn=a[i];と置き換えると不正な値が表示される

何のために置き換えるのかが判りません。
a[i]は値が不定です。

(2)平均値の小数点以下の値がおかしい

(double)にキャストする前に「sum/5」の段階がint/intの計算なので、intしか答えがない。
(double)sum/5
で正しい結果が出る。

投稿日時 - 2012-01-04 12:17:38

ANo.1

(1)a[i]=n;をn=a[i];と置き換えると不正な値が表示される
・・・a[i]=は初期値が指定されていないので、不定です。
   従って、実行時のメモリー状態がそのまま利用されます。
(2)平均値の小数点以下の値がおかしい
・・・キャストの対象が整数演算の結果になっているためです。
   ((double)sum/5))でいいとおもいます。

投稿日時 - 2012-01-04 12:12:58

補足

a[i]=n;とn=a[i];は動作上別ということでしょうか?
それすら分からないので・・・
a[i]=n;だとたまたまコンパイルに成功してしまうのか、
n=a[i]の形式だから駄目なのか。
前者だとしたら全く見当違いのプログラムを組んでいたことになりますが・・・・・・

投稿日時 - 2012-01-05 01:36:39