C言語の最高気温プログラムの要約

このQ&Aのポイント
  • C言語で最高気温プログラムを作成した際に、分散や標準偏差などの計算方法やルートの取り扱いについてわからない箇所があります。
  • プログラムの中で、一週間の最高気温の最大値、最小値、平均値、分散、標準偏差、中央値を計算しています。
  • ルートの計算方法や標準偏差の計算方法について教えてください。
回答を見る
  • ベストアンサー

C言語で分からないところがあるのですが・・・

こんにちは。 C言語で分からないところがあったので質問しに来ました。 ここ一週間の最高気温をユーザから受け取り、それを受けて、一週間の最高気温のmax,min,分散、標準偏差、中央値を求めるプログラムを書いてみました。以下にソースコードと実行結果を貼っておきます。 それで質問なんですが、標準偏差って簡単にいえば分散にルートをかぶせればいいんですよね? C言語でルートってどうやればいいんですか?ただ単純にsqrをつけたところ、エラーが発生したのでよく分からないままです。 もし宜しければお助け下さい。お願いします。 #include <stdio.h> int main(void) { float temp[7]; float min , max , avg; int i,k,l; for(i=0; i < 7 ; i++){ printf("%f INPUT the Maximam tempreture. : ", i + 1); scanf("%f", &temp[i]); } /*平均最高気温を求める*/ avg = 0; for(i = 0; i < 7; i++) avg = avg + temp[i]; printf("The Average Temperature is : %f .\n", avg/7); /*さすがに↓はありえない。minを下回ったり上回ったりした場合は以下に設定されている数値とする。*/ min = 1000000; max = -1000000; for(i=0; i < 7; i++){ if(min > temp[i]) min = temp[i]; if(max < temp[i]) max = temp[i]; } /*様々な値。上から最低、最高、分散、標準偏差、中央値(バブルソード使用)*/ /*英語のスペルが間違っている可能性が高いが無視*/ printf("The Lowest tempreture is : %f\n", min); printf("The Highest tempreture is : %f\n", max); printf("The variance is : %f\n", ((temp[0]-avg/7)*(temp[0]-avg/7)+(temp[1]-avg/7)*(temp[1]-avg/7)+(temp[2]-avg/7)*(temp[2]-avg/7)+(temp[3]-avg/7)*(temp[3]-avg/7)+(temp[4]-avg/7)*(temp[4]-avg/7)+(temp[5]-avg/7)*(temp[5]-avg/7)+(temp[6]-avg/7)*(temp[6]-avg/7))/7); /*↓が例の分からないところです。*/ printf("The standard deviation is : %f\n",((temp[0]-avg/7)*(temp[0]-avg/7)+(temp[1]-avg/7)*(temp[1]-avg/7)+(temp[2]-avg/7)*(temp[2]-avg/7)+(temp[3]-avg/7)*(temp[3]-avg/7)+(temp[4]-avg/7)*(temp[4]-avg/7)+(temp[5]-avg/7)*(temp[5]-avg/7)+(temp[6]-avg/7)*(temp[6]-avg/7))/7); for(i = 1; i < 7 ; ++i) for(k = 6; k >= i; --k){ if (temp[k-1] > temp[k]){ l = temp[k-1]; temp[k-1] = temp[k]; temp[k] = l; } } for(l = 0; l < 7; l++) printf("The tyuuouti is %f.\n", temp[3]); return 0; }

noname#160322
noname#160322

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

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 C言語(というか標準Cライブラリー)においてルート(平方根)を算出してくれる関数はdouble sqrt(double)です。プロトタイプ宣言はmath.hにあります。math.hをインクルードしてsqrt()を使用しましょう。

その他の回答 (1)

回答No.2

#1さんの指摘の他、あなたのプログラムミスを指摘します。 1)整数i に %f は誤りです。%d を使いましょう。 for(i=0; i < 7 ; i++){ printf("%f INPUT the Maximam tempreture. : ", i + 1); ↓ printf("%d INPUT the Maximam tempreture. : ", i + 1); 2)0 は整数です。実数表記の avg=0.0 を使いましょう。 avg = 0; ↓ avg=0.0; 3)平均値の avg なら、後の計算のためにきちんと求めておきましょう。 printf("The Average Temperature is : %f .\n", avg/7); ↓ printf("The Average Temperature is : %f .\n", avg/=7); 4)最小、最大値は初期値を使うようにしましょう。 min = 1000000; max = -1000000; ↓ min=max=temp[0]; 5)また、最小値が求められたら最大値処理は不要です。 for(i=0; i < 7; i++){ if(min > temp[i]) min = temp[i]; if(max < temp[i]) max = temp[i]; } ↓ for(i=1; i < 7; i++){ if(min > temp[i]) min = temp[i]; else if(max < temp[i]) max = temp[i]; } 6)無駄な繰り返しは避けましょう printf("The variance is : %f\n", ((temp[0]-avg/7)*(temp[0]-avg/7)+(temp[1]-avg/7)*(temp[1]-avg/7)+(temp[2]-avg/7)*(temp[2]-avg/7)+(temp[3]-avg/7)*(temp[3]-avg/7)+(temp[4]-avg/7)*(temp[4]-avg/7)+(temp[5]-avg/7)*(temp[5]-avg/7)+(temp[6]-avg/7)*(temp[6]-avg/7))/7); ↓ 分散について勉強してからC記述するようにしましょう。 http://www.geocities.jp/cgengor/arg03.html

関連するQ&A

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • C言語 ファイル出力について

    Excelでも使えるようにCSV形式に書き込みをしたいのですがどのようにすればよいのでしょうか #include <stdio.h> #define N 50 int main(void) { int i, a, n[N], min, temp; for(i=0; i<N; i++) { printf("%2d番目の値:", i+1); scanf("%d",&n[i]); } for(i=0; i<N; i++) { min = i; for(a = i + 1; a < N; a++) { if(n[min] > n[a]) min = a; } temp = n[min]; n[min] = n[i]; n[i] = temp; } printf("小さい順:\n"); for(a=0; a<N; a++){ printf("%2d番目\t%d\n", a+1, n[a]); } return 0; }

  • C言語のソートプログラム

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",&n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<n;i++){ printf("a[%d]",i); scanf("%d",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[%2d]=%d\n",i,a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これを実行すると 最初に入力した配列の順番のまま表示されてしまいます。 例えば n=4 a[0]7 a[1]4 a[2]6 a[3]1 a[i]のソート結果 a[0]7 a[1]4 a[2]6 a[3]1 のようにです。 しかしプログラミング上では for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]       temp=a[i];       a[i]=a[j];            a[j]=temp;        }        }        } のようにiとjを比較して a[0]がa[1]より大きければa[0]とa[1]を交換する。 あとはa[0]とa[2], a[0]とa[3]...a[3]とa[4]まで for文の続く限り繰り返すように書いたはずです。 まだ勉強し始めた私にはどこが間違っているのか分からないので 分かる方はご指摘をお願いします。

  • C言語についてなのですが、

    C言語についてなのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<search.h> int main(void) { int i,j,k,temp,n,count,time,list[65537]; clock_t startTime, endTime; printf("取得する乱数の個数を入力してください\n"); scanf("%d",&n); srand((unsigned)time(NULL)); printf("Before sort\n"); startTime = clock(); for(i = 0; i < n; i++) { list[i] = rand(); /* printf("%d\n", list[i]);*/ } count = 0; for (i = 1; i < n; i++) { for (j = i; j < n-i-1; j++) { count++; if(list[j] < list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } endTime = clock(); printf("\nAfter sort\n"); for(k = 0; k < n; k++) { /* printf("%d\n", list[k]);*/ } printf("\n比較回数:%d\n", count); printf("実行時間:%.4f秒\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); return 0; } 上記のソースコードをcygwinで gcc -Wall -o k5-1-2 k5-1-2.c でコンパイルしようとすると k5-1-2.c:関数'main'内 k5-1-2.c:14:error:called object is not a function と表示されます。 いろいろなサイトを参考にして乱数取得用に srand((unsigned)time(NULL));を使うように書かれていたので使っているのですが、何かだめなのでしょうか?自分ではお手上げ状態で。

  • C言語

    #include <stdio.h> #include <stdib.h> int main (void){ double a[5]={0.0,4.0,0.0,-5.0,1.0}; double x; int i,j,k,n; n=4; x=0.75; for(i=1;i<=n;i++) printf("%10.5f ,",a[i]); printf("\n"); for (i=1; i<=n+1; i++) printf("----------") printf("\n"); while(n>=1){ for(i=1; i<=n; i++) a[i]=a[i-1]*x+a[i]; for(i=1; i<=n; i++) prontf("%10.5f ,"a[i]); printf("\n"); n=n-1; } return 0; }

  • C言語のプログラムでおかしな動作をするのですが教えて頂けないでしょうか?

    VisualStudio2008使用しています。 問題は、サイコロを200回振ってその出た目の数の個数分*を表示するプログラムです。 サイコロの目はランダムで出しています。 次のプログラムは正常に動作するものです。 /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; int y[7]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } */ 次のプログラムが問題で、授業で先生が配列にはstaticをおまじないとしてつけないと暴走すると言われたので、つけて見ると明らかに間違ってると思われるプログラムで動作するのですが原因を教えて頂けないでしょうか? 以下問題のプログラム! 配列の前にstaticをつけたら、添え字をいくつにしても正常に動作します。普通は添え自分しか領域って確保されないですよね??? /* #include <stdio.h> #include<stdlib.h> #include<time.h> #define N 200 int DICE(int min,int max); int main() { int n,i,j; //以下が問題の配列宣言 static int y[2]={0}; srand((unsigned int)time(NULL)); for(i=0;i<N;i++){ n=DICE(1,6); y[n]++; } for(i=1;i<7;i++){ printf(" %2d: ",i); for(j=0;j<y[i];j++){ printf("*"); } printf("\n"); } return 0; } int DICE(int min,int max) { return min+(int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } 質問の意味が正確に伝わらなかった場合は補足しますので、ご回答よろしくお願いします。

  • C言語の問題です!!

    すみません。 詳細表示をする際に、未ソート部の先頭要素の上に記号文字「*」を表示し、未ソート部の最小要素の上に記号文字「+」を表示したいと思い、以下のソースプログラムを作成したのですが、結果が何か違う気がします…。どこが違うのか、教えていただけませんか? また、プログラムを修正していただけませんか? #include<stdio.h> #include<stdlib.h> #include<time.h> #define swap(type,x,y) do{type t=x;x=y;y=t;}while(0) /*--- 単純選択ソート ---*/ void selection(int a[], int n) { int i, j,k,flg; char *disp[]={" ","[* ]","[ +]","[*+]"}; for (i = 0; i < n - 1; i++) { int min = i; for (j = i + 1; j < n; j++) { if (a[min] > a[j]) { min = j; } } for (k = 0; k < n; k++) { flg=0; if(k==i) flg|=1; if(k==min) flg|=2; printf("%s",disp[flg]); } printf("\n"); for (k = 0; k < n; k++) printf("[%2d]", a[k]); printf("\n"); swap(int, a[i], a[min]); } } int main(void) { int i, nx; int *x; printf("要素数 : "); scanf("%d", &nx); x = calloc(nx, sizeof(int)); srand(time(NULL)); for (i = 0; i < nx; i++) { x[i] = rand() % 100; printf("x[%d] = %d\n", i, x[i]); } selection(x, nx); for (i = 0; i < nx; i++) printf("x[%d] = %d\n", i, x[i]); free(x); return 0; }

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語の配列を使ったプログラミングについてです。

    5人の数学と英語の点数の合計が入る二次元配列を用意し、5人の数学 (scores [i] [0]) と英語 (scores [i] [1]) の点数の入力する.5人の数学と英語の合計点を計算し配列に入れる (scores [i] [2]).数学と英語と合計の一覧を表示したあと,合計点の最高点と最低点を表示するプログラムを作れ.という問題で #include<stdio.h> int main() { char score[5][3]; int i, min=0,max=0; for(i=0; i<5; i++){ printf("%d: M E?",i+1); scanf("%d %d", &score[i][0], &score[i][1]); score[i][2]= score[i][0]+score[i][1]; if(score[max]<score[i][2]) max=i; if(score[min]>score[i][2]) min=i; } printf("id Math Eng Total\n"); for(i=0; i<5; i++){ printf("%d %d %d %d\n", i+1, score[i][0], score[i][1], score[i][2]); } printf("min: %d max: %d",score[min], score[max]); } というプログラムを作ったのですが、scanfで改行を入れていないのに、1つ目の数字を入れると2つ目の数字はなぜか改行してしまい、さらに最低点と最高点が正しく出力されませんでした。なぜでしょうか。回答よろしくお願いします。

  • cプログラム

    次の10人の身長を入れ、最大と最小を配列を使って求めるプログラムなんですが、この場合だと一人の身長データしか入力できません どのように直せばいいでしょうか? #include <stdio.h> main () { float h[10],max,min; int i; max=-999; min=999; for(i=0;i<=9;i=i+1){ printf("%d番目の身長を入力してください\n",i+1); scanf("%5.1f",&h[i]); if(h[i]>max){ max=h[i]; } if(h[i]<min){ min=h[i]; } } printf("最大の身長は%5.1f,最小の身長は%5.1fです。\n",max,min); return(0); }

専門家に質問してみよう