• ベストアンサー
  • すぐに回答を!

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

  • 質問No.7224335
  • 閲覧数269
  • ありがとう数0
  • 回答数4

お礼率 2% (4/146)

#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
解決法が分からず困っています。どなたかお力添えお願いします。

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

  • 回答No.4
  • ベストアンサー

ベストアンサー率 40% (711/1750)

#2です。

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

そこから…?

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

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

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

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

その他の回答 (全3件)

  • 回答No.3

ベストアンサー率 53% (2177/4070)

>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++」のカテゴリありますからそちらの方がふさわしいかと。
  • 回答No.2

ベストアンサー率 40% (711/1750)

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

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

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

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

ベストアンサー率 27% (25/92)

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

お礼率 2% (4/146)

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

その他の関連するQ&Aをキーワードで探す

ページ先頭へ