C言語 入力した数値の平均値の近似値

このQ&Aのポイント
  • C言語でn個の数値の平均値にもっとも近い値を求めるプログラムが正しく動作しない。
  • プログラムでは指定の入力に対して誤った結果が出力される。
  • プログラムの修正が必要で、どこを修正すればよいか教えてほしい。
回答を見る
  • ベストアンサー

C言語 入力した数値の平均値の近似値

n個の数値を入力して、その平均値にもっとも近い値を求めよ。(double型の配列を用いること) nは実数データの前に最初に入力するものとする。 必要ならばnは100以下と仮定せよ。 答えは指数なしの表現で、欄の最小幅は8とし、精度は3とする。 という問題なのですが、作ってみたプログラムでは正しく動作できませんでした。 どこが違うのか教えてください。 以下が私の作ったプログラムです。 _____________________________________________________________________________________________________________________ #include <stdio.h> int main (void) { int i,n; double c[100],sum,avg,num1,num2,ans; sum=0.0; scanf("%d",&n); for(i=0;i<n;i=i+1) { scanf("%lf",&c[i]); sum=sum+c[i]; } avg=sum/n; num1=avg-c[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-c[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2); num1=num2; } printf("%8.3f",num1); return(0); } _____________________________________________________________________________________________________________________ ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずなのですが、 私のでは「4.667」と表示されてしまいます。 よろしくお願いします。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

if(num1>num2); num1=num2; ここが、おそらく意図したものではない、というのが1点 ここでは、「常に」num1=num2; が実行されます。 そのため、最後の |平均 - 11.0| が printf("%8.3f",num1); によって出力されています。 printf("%8.3f",num1); ここで、num1(平均と値との差)を出力している、というのがもう1点 「差がnum1のときのc[?]の値」を出力する必要があります。 そのためには、「差がnum1のときのc[?]の値」をなんらかの方法で記録する必要があります。 ?の値を記憶てもいいし、c[?]の値を記憶してもよいです。 そういえば、ansという変数は使われていませんね

butamushi
質問者

お礼

kmee さんの言うとおり、まずif(num1<num2)のところが{}でくくれてなかったのでif文の中身が常に実行されてしまうようになっていました。 あと、出力するものも間違えてました。 if(num1<num2)のときにansにc[i]の値を代入させてansを出力したらできました。 助かりました。 ありがとうございました。

関連するQ&A

  • C言語 入力した数値の平均値の近似値(関数を利用)

    double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素の平均を値として返す関数 double average(double a[], int n) および、double型の配列 a[] と、要素数 n を受け取り、 a の最初の n 要素のなかで、それら n 要素の平均値と最も近い値を返す関数 double closest_to_average(double a[], int n) を作成して、main関数で、平均値と最も近い値を出力しろ という問題をやってみたのですが、私のプログラムでは実行して、数値を入力した後強制終了されてしまいます。 どこが間違えているのか教えていただけないでしょうか? 以下が私の作ったプログラムです。 ---------------------------------------------------------------------- #include <stdio.h> double average(double a[], int n) { int i; double sum,avg; sum=0; for(i=0;i<n;i=i+1){ sum=sum+a[i]; } avg=sum/n; return(avg); } double closest_to_average(double a[], int n) { int i; double avg,num1,num2,ans; avg=average(a,n); num1=avg-a[0]; if(num1<0){ num1=num1*(-1); } for(i=1;i<n;i=i+1){ num2=avg-a[i]; if(num2<0){ num2=num2*(-1); } if(num1>num2){ num1=num2; ans=a[i]; } } return(ans); } int main (void) { int i,n; double a[100]; double ans; scanf("%d",&n); for(i=0;i<n;i=i+1){ scanf("%d",a[i]); } ans=closest_to_average(a,n); printf("%f",ans); return(0); } ---------------------------------------------------------------------- ちなみに「3 3.0 5.0 11.0」と入力すれば「5.000」となるはずです。 よろしくお願いします。

  • C言語の添削

    「C言語基礎課題1」 #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <tchar.h> #include <ctype.h>                                       #include <string.h> #define MAX 100 /*点数*/ int flag; double avg(double t[],int n); int str_check(char s[]);                                        int main() { int number; //人数 double score[MAX]; //点数 char temp[MAX]; char str[MAX]; //名前 double ans; //平均成績 int i=0; //カウンタ変数 //人数の決める printf("人数を入力して下さい。\n"); scanf("%d",&number); //名前の入力 for(i=0;i<number;i++) { printf("%d番様の名前を入力して下さい。\n",i+1); scanf("%s",&str[i]); } //点数の入力 for(i=0;i<number;i++) { printf("%d番様の点数を入力して下さい。\n",i+1); scanf("%s",&temp); str_check(temp); if(flag==1) { score[i]=atoi(temp); //点数入力で有効範囲をチェック if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } if(flag==0) { printf("点数を数字で入力して下さい。\n"); i--; } } ans =avg(score,number); printf("\n=====入力内容一覧と成績平均値======\n"); for(i=0;i<number;i++) { printf("%d番の点数は%3.2lfです。\n",i+1,score[i]); } printf("平均点は%3.2lfです。\n",ans); printf("=====================================\n"); getch(); return 0; } /*avg関数の定義*/ double avg(double t[],int n) { int i; double sum; sum = 0.0; for(i=0;i<n;i++) { sum += t[i]; } return sum/n; } /*点数入力で文字か数字かチェック*/ int str_check(char s[]) { int i=0,n; //カウンタ変数 n=strlen(s); while(s!='\0') { if(s[i]>='0'&&s[i]<='9'||s[i]=='.') { i++; } else { break; } } if(i==n) { flag=1; } else { flag=0; } return flag; } [最初に組んだソースプログラム] #include<stdio.h> #include<stdio.h> #define NUM 3 /*点数*/ #define Name 3 /*人数*/ #include<conio.h> double avg(int t[]); struct stList{ char str[Name][100]; int score[NUM]; int i,j; }; int main(void) { int score[NUM]; //char str[Name]; char str[100]; int i,j; double ans; printf("名前を入力して下さい。\n",Name); for(i=0;i<Name;i++){ scanf("%s",&str[Name]); } // if(score[NUM]=0 || score[NUM]<=100) //{ // printf("点数を入力して下さい。\n",NUM); //} printf("点数を入力して下さい。\n",NUM); for(i=0;i<NUM;i++) { scanf("%d",&score[i]); if(score[i]<0 || score[i]>100) { printf("0-100点の範囲を入力して下さい。\n"); i--; } } for(j=0;j<NUM;j++){ printf("%d番目の人の点数は%dです。\n",j+1,score[j]); } ans =avg(score); printf("平均点は%3.2lfです。\n",ans); getch(); return 0; } /* avg関数の定義 */ double avg(int t[]) { int i; double sum; sum = 0.0; for(i=0;i<3;i++){ sum += t[i]; } return sum/Name; } 「一人分のデータを保持する構造体(文字列と整数の変数をメンバに持つ)を用意し、3人分の名前と成績 (最大値100、最小値0)を入力でき、入力が終了したら、入力内容一覧と成績の平均値を表示する プログラムを作成せよ。 ※考えうる限りの異常系処理の導入、関数化を行うこと。」 研修で以下の指摘を受けました。 (1)compare関数が使われていない。 (2)名前入れる変数が3つ不明 (3)カウンタ変数がi,j,s,tになっている理由は? (4)名前を入力しなかった時の処理 (5)点数を処理しなかった時の処理 (6)定数NUMで人数3を指定できるようにしているのにプログラムはそれを利用仕切れていない(名前入力が固定3人)ので無意味 (7)if(tmp=0 || tmp<=100)←これなんでしょうか? (8)平均点表示の少数点以下有効桁数はどうなっているのか? (9)点数入力で文字を入れたときの処理 (10)点数入力で有効範囲外の数字を入れた時の処理 ちなみに最大値、最小値はdefineして欲しいです。理由は(2)に読めば分かる (11)変数名が謎なのが多い 課題のキーワードのどこにも出て来ないですし言葉だから 後、添付ファイルを添付します。 最初のソースプログラム名「最初に組んだもの」修正したものが「C言語基礎課題1」と名付けています。 いづれのソースプログラムも構造体を用意出来てないように思うのですがいかかですか?

  • C言語 繰り返しの問題

    C言語の初心者です。 キーボードから値を入力して、1から入力された値までの奇数の和を求めて出力するプログラムを作成します。以下のように組んでみましたが、全然うまくいきません。誰か教えていただけませんか? #include<stdio.h> int main(void) { int i,n,sum; sum=0; printf("入力値:",n); scanf("%d",&n); if(n<=0) { printf("\n合計値:0\n"); } else { printf("入力値:\n",n); for(i= 1; i<= n; i=i+2) { if(n%2=1) { sum=sum+i; } } } printf("\n合計値\n",sum); }

  • c言語で平均をだす

    #include<stdio.h> int main(void) { int num; int sum; printf("テストの点数を入力してください。\n"); do{ scanf("%d",&num); sum+=num; }while(num); printf("テストの合計点は%dです\n",sum); return 0; } テストの平均点をだすプログラムを作りたいのですが、合計を出すまではわかったのですが、ここから、平均を出すようにするにはどうすればよいですか。

  • C言語に詳しい方、教えていただけませんか?

    n個の実数をキーボードから入力して総和を求めるプログラムを書いたのですが、結果が+NANとなってしまいます。 また、値をキーボードから入力する際、小数にするとすぐにプログラムが終了してしまいます。例えば、a[0]=1.0とすると、 a[1]=a[2]=a[3]=a[4]=合計は+NANと表示され終了してしまいます。 ちゃんと小数を入力でき、結果も正しく表示されるように間違いを指摘していただけませんか?よろしくお願いします。 (nは5としました) #include <stdio.h> #define n 5 double souwa(double a[n]); int main(void) { int i; double sum, a[n]; for(i=0; i<=n-1; i++){ printf("a[%d] = ",i); scanf("%d",&a[i]); } sum = souwa(a); printf("合計は%f\n",sum); return 0; } double souwa(double a[n]) { int i; double sum = 0.0; for(i=0; i<=n-1; i++){ sum += a[i]; } return sum; }

  • c言語 for文

    /*指定された個数だけ整数を読み込んで合計値・平均値を算出*/ #include <stdio.h> int main(void) { int i; int sum=0; int num,tmp; printf("整数は何個ですか:"); scanf("%d",&num); for(i=0;i<num;i++) {printf("No.%d:",++i); scanf("%d",&tmp); sum = sum + tmp; } printf("合計値:%d\n",sum); printf("平均値:%.2f\n",(double)sum / num); return(0); } C言語の勉強を始めたばかりのものです。 指定された個数だけ読み込めません 汗 前置と後置をまぜたあたりがよくないのかなと思うのですが。。。 どうしておかしくなるのか教えてください。 内部でどういった処理が行われているのかまだあまりわからない状態です。 ちなみに4と入力した結果は以下です。 整数は何個ですか:4 No.1:4 No.3:3 合計値:7 平均値:1.75

  • 平均の問題(2)

    間違って前回の質問を締め切ってしまったので、もう一度お願いします。 申し訳ありません。 C言語の問題です。 1つの整数n(最大20)をキーボードから入力する。 続いてn人分の身長をキーボードから入力する。 平均身長、それぞれの身長、その身長と平均身長との差を1行ずつ出力せよ。 #include < stdio.h > int main(void) { int i, n; int s[20]; int sum; sum=0; scanf("%d", &n); for(i=0; i<n; i++){ if(n<=20){ scanf("%d", &s[i]); sum += s[i]; } } printf("平均:%f\n", (double)sum/n); for(i=0; i<n; i++){ printf("%d\n", s[i] ); printf("%f\n", s[i]-(double)sum/n); } return(0); } という風に考えたのですが、これだと結果が1行で表示されません・・・。 1行で表示するにはどうしたら良いのでしょうか? 初歩的な質問ですみません。 回答よろしくお願いします。

  • 平均の問題

    C言語の問題です。 1つの整数n(最大20)をキーボードから入力する。 続いてn人分の身長をキーボードから入力する。 平均身長、それぞれの身長、その身長と平均身長との差を1行ずつ出力せよ。 という問題なのですが、「それぞれの身長、その身長と平均身長との差を1行ずつ出力」という部分のプログラムの書き方がわかりません。 平均の身長を出す部分まで考えてみたのですが・・・ #include < stdio.h > int main(void) { int i, n, sum; int s[20]; sum=0; scanf("%d", &n); for(i=0; i<n; i++){ if(n<=20){ scanf("%d", &s[i]); sum += s[i]; } } printf("%f\n", (double)sum/n); return(0); } ここからどのようにすればいいのでしょうか? ご指導いただけたら嬉しいです。 回答よろしくお願いします。

  • C言語!プログラム書いたのですがエラーです!

    課題内容 キーボードから数字を入力してその値までの合計を表示する。 さらに入力した値が偶数なら0から入力した値までのすべての偶数の和を 入力した値が奇数なら1から入力した値までのすべての奇数の和を表示するプログラム。 #include<stdio.h> int main(void) { int i, n, sum; sum=0; scanf("%d",&n); printf("入力値:%d\n", n); if(n%2 = 0) { for(i=0;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } else { for(i=1;i<=n;i+=2) { sum=sum+i; } printf("合計値:%d\n",sum); } return(0); } これでコンパイルすると10行目に左辺値が必要とでます。 どうすればよいでしょうか? 教えてください。よろしくお願いします。

  • c言語 

    答えを0にするこまち算のプログラムを組んでみたのですが、ここからどうしても進まなくなってしまいました。 自分ではいけるかなと思ったのですが、9-8-7+65-4321=9など答えがありえない数になってしまいます。 どこがいけないか教えてください。むしろ最初から組み直した方がよいのでしょうか… #include <stdio.h> int cul(); int num[9] ={9,8,7,6,5,4,3,2,1}; int total;/**/ int kigou[8]={0,0,0,0,0,0,0,0}; int main(){ for(kigou[0]=0;kigou[0]<3;kigou[0]++){ for(kigou[1]=0;kigou[1]<3;kigou[1]++){ for(kigou[2]=0;kigou[2]<3;kigou[2]++){ for(kigou[3]=0;kigou[3]<3;kigou[3]++){ for(kigou[4]=0;kigou[4]<3;kigou[4]++){ for(kigou[5]=0;kigou[5]<3;kigou[5]++){ for(kigou[6]=0;kigou[6]<3;kigou[6]++){ for(kigou[7]=0;kigou[7]<3;kigou[7]++){ keisan(); } } } } } } } } return 0; } int keisan(){ int n =0; int flag = 0; int t = 0; int i = 0; total = num[0]; /* for (n=0;n<9;n++) printf("kigou[%d] == %d",n,kigou[n]);確かめ*/ for(;n<8;n++){ if(kigou[n] == 0 && n == 0){ total = total * 10 + num[n+1]; for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ total = total * 10 + num[n+flag+1]; } n = n + flag; } flag=0; if(kigou[n]!= 0){ for(flag=1;kigou[n+flag]==0 && (n+flag)<9 ;flag++){ t = num[n+1] * 10 + num[n+flag+1]; } n = n+ flag; total = total + t; } } /*0になる計算式の表示*/ kigou[8]=2;/*表示しないために空白を入れる*/ if(total==0){ for(i=0;i<9;i++){ printf("%d",num[i]); if(kigou[i]==0) printf("+"); if(kigou[i]==1) printf("-"); if(kigou[i]==2) printf(""); } printf("=%d\n",total); } return 0; }

専門家に質問してみよう