• 締切済み

C言語のポインタ配列について

ポインタ配列を使って、各組(横一列が1組)の最高点と平均点、学年平均を表示するプログラムを考え中です。 各組の最高点を求める部分をどのように書けばいいのか迷ってます。 下記のプログラムでマズイ部分などありましたら教えていだたきたいです。 #include <stdio.h> int main(void) {   int ten1[] = { 52, 38, 79, 89, 57, 71, 90, -999};   int ten2[] = { 67, 89, 56, 45, 91, -999};   int ten3[] = { 89, 34, 67, 65, 67, 55, -999};   int* p[3];   int k;   int i;   int sum;   int total;   float ave;   int nin = 18;      p[0] = ten1;   p[1] = ten2;   p[2] = ten3;      total = 0;   for (k = 0; k < 3; k++)   {     i = 0;     sum = 0;     while (p[k][i] != -1)     {       sum += p[k][i];       i++;     }     ave = ave = (float)total / 3;     total += sum;     printf("平均点%3.1f\n", ave);   }   ave = (float)total / nin;   printf("学年平均点:%3.1f\n",ave);      return 0; }

noname#60861
noname#60861

みんなの回答

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

おっと失礼。最高点を求めるロジックが抜けていました。 #include <stdio.h> int main(void) { int ten1[] = { 52, 38, 79, 89, 57, 71, 90, -999}; int ten2[] = { 67, 89, 56, 45, 91, -999}; int ten3[] = { 89, 34, 67, 65, 67, 55, -999}; int *p[3], k, i, sum, total, nin, max; p[0] = ten1, p[1] = ten2, p[2] = ten3; for (total = nin = k = 0; k < 3; k++) { for (sum = i = 0, max = p[k][0]; p[k][i] != -999; i++, nin++) { if (p[k][i] > max) { max = p[k][i]; } sum += p[k][i]; total += p[k][i]; } printf("最高点:%d, 平均点:%3.1f\n", max, (double) sum / i); } printf("学年平均点:%3.1f\n", (double) total / nin); return 0; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.4

こういうことでしょうか。 #include <stdio.h> int main(void) { int ten1[] = { 52, 38, 79, 89, 57, 71, 90, -999}; int ten2[] = { 67, 89, 56, 45, 91, -999}; int ten3[] = { 89, 34, 67, 65, 67, 55, -999}; int *p[3], k, i, sum, total, nin; p[0] = ten1, p[1] = ten2, p[2] = ten3; for (total = nin = k = 0; k < 3; k++) { for (sum = i = 0; p[k][i] != -999; i++, nin++) { sum += p[k][i]; total += p[k][i]; } printf("平均点%3.1f\n", (double) sum / i); } printf("学年平均点:%3.1f\n", (double) total / nin); return 0; }

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

変数totalを初期化するタイミングと加算するタイミングに 問題がありそうです。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.2

> 下記のプログラムでマズイ部分などありましたら教えていだたきたいです。 バッファオーバーランします。 >  int ten1[] = { 52, 38, 79, 89, 57, 71, 90, -999}; >  int ten2[] = { 67, 89, 56, 45, 91, -999}; >  int ten3[] = { 89, 34, 67, 65, 67, 55, -999}; 各配列の終端は「-999」です。 >    while (p[k][i] != -1) -1が見つかるまでループします。 ポインタが進んでいって、たまたま-1になった箇所を指すまで進みます。 >    ave = ave = (float)total / 3; この「3」はどこから? # 「ave = ave = 」になっているのはただのコピペミスでしょう。 >  int nin = 18; >  ave = (float)total / nin; この18というのはどこから? # ten1[]、ten2[]、ten3[]の有効データの数。 # と思われますが有効データ数が変わったら修正が必要になります。 # 合計点数の算出のループで件数が出てきますからそこから加算する方がよいでしょう。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>while (p[k][i] != -1) いつまで while ループをまわすつもりですか?

関連するQ&A

  • C言語 構造体でつまずいています

    以下、番号と点数を入力して構造体配列に入力し、番号に0が入力されたら、入力処理をやめ、平均点を表示するプログラムです。  今のコードでは、最初から番号に0を入力すると、0除算になりエラーになります。どうすれば良いのでしょうか? #include <stdio.h> #define MAX 50 //配列の要素数を定義 int count=0; //グローバル変数 struct data { //構造体の定義 int num; //メンバの宣言 int ten; }; void nyuryoku(struct data *); //プロトタイプ宣言 float heikin(struct data *); //プロトタイプ宣言 void main() { struct data score[MAX]; //構造体の宣言 printf("**学生番号/点数入力**\n"); printf("\n"); nyuryoku(score); //nyuryoku関数呼び出し printf("\n**以上%d名の平均点:%0.1f点**\n",count,heikin(score)); //heikin関数の戻り値表示 } //nyuryoku関数 //機能:構造体配列にデータを入力する void nyuryoku(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; for(i=0;i<MAX;i++){ printf("学生番号>>"); scanf("%d",&pd->num); if(pd->num==0){ //学生番号に0を入力するとループを抜ける break; } printf("点  数>>"); scanf("%d",&pd->ten); count++; //人数のカウント pd++; //構造体配列を一つずらす } } //heikin関数 //機能:構造体配列の点数の平均を計算、戻り値として返す float heikin(struct data *pd) //仮引数pdに構造体ポインタが渡る { int i; int sum=0; float ave=0; for(i=0;i<MAX;i++){ if(pd->num==0){ break; } else{ sum+=pd->ten; //点数を加算 pd++; } } ave=(float)sum/count; //平均値を求める return(ave); //平均値を戻り値として返す }

  • c言語

    n人の名前、と国数英の点数を読み込み各人の平均点、標準偏差を求め見やすく出力するぷろぐらむです osはlinuxでコンパイラはgccです。 変数が多くなってしまいよくわかりません。 もっと簡単になりますか? #include<stdio.h> #include<math.h> #define N 50 main() { int eng[N], jap[N], math[N], n=0, i=0; char name[N][12]; double sum[N], SUM, sum1, sum2, sum3, ave1, ave2, ave3, vari, s_devi; printf("名前 合計点"); while(scanf("%s %d %d %d",&name[n],&eng[n],&jap[n],&math[n]) != EOF) { sum[i] = eng[n]+jap[n]+math[n]; sum1 += eng[n]; sum2 += jap[n]; sum3 += math[n]; printf("%-12s%4d",name[n], sum[i]); n++; i++; } ave1 = sum1/n; ave2 = sum2/n; ave3 = sum3/n; for(i=0; i<n; i++) { SUM += (eng[i]-ave1)*(eng[i]-ave1); } vari = SUM/n; s_devi = sqrt(vari); printf("English\n average = %f\nstandard deviation = %f\n\n",ave1,s_devi); for(i=0; i<n; i++) { SUM += (jap[i]-ave2)*(jap[i]-ave2); } vari = SUM/n; s_devi = sqrt(vari); printf("japanese\n average = %f\nstandard deviation = %f\n\n",ave2,s_devi); for(i=0; i<n; i++) { SUM += (math[i]-ave3)*(math[i]-ave3); } vari = SUM/n; s_devi = sqrt(vari); printf("math\n average = %f\n standard deviation = %f\n\n",ave3,s_devi); }

  • c言語超初心者です。2

    #include <stdio.h> int main(void) { int na,nb, nc; int sum; double ave; puts("三つの整数を入力してください."); printf("整数A:"); scanf("%d", &na); printf("整数B:"); scanf("%d", &nb); printf("整数C:"); scanf("%d", &nc); sum=na+nb+nc; ave=(double)sum/3; printf("それらの合計は%5dです。\n", sum); printf("それらの平均は%5.1fです。\n",ave); return(0); } とういうのを作ったんですが、最後のそれらの合計は%5dとやりその5の意味は整数を10進法で少なくても5桁で表示とありますが、例えば1,2,3と入力しても合計は6とでて5桁ででないんですけど。そういう意味ではありませんか?あとave=(double)sum/3;のところをave=sum/3.0としても問題なくできるのですが、どっちでやったほうがいいとかはありますか?もしあったらその理由も教えてください。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語が分からないので分かる方説明お願いします

    C言語が分からないので分かる方説明お願いします #include<stdio.h> int main(void) { int i; int tensu[5]; int sum=0; printf(”点数を入力してください。”); for(i=0;i<5;i++){ printf(”%2d番:”,i+1); scanf(”%d”,&tensu[i]); sum+=tensu[i]; } printf(”合計点:%5d¥n”,sum); printf(”平均点:%5.1f¥n”,(double)sum/5); return(0); } 実行すると 点数を入力してください。 1番:95 2番:83 3番:85 4番:63 5番:89 合計点:415 平均点:83.0 できるだけ詳しく教えてください

  • C++のscanfについて

    今C++をやり始めたばかりの者です 下記のように打って、コンパイルして実行すると、数字はちゃんと出るんですが英語は入るとループがかかってしまいます。 英語のループを回避して、平均が出るように出来ないでしょうか。。。。 返答よろしくお願いします。。。。。 /********************************************** 平均を求める ***********************************************/ #include <stdio.h> #define END -1 //-1が入力されたら終わり void main() { //変数の宣言 int score; //得点 int total; //合計 double ave; //平均点 int i; //回数のカウント //入力と合計の計算 total = 0; //初期設定 i = 0; //最初の得点を入力 printf("%d科目めの得点を入力 : ", i+1); scanf("%d" , &score); //入力 while( score > END ) { total += score; i++; printf("%d科目目の得点を入力 : ", i+1); scanf("%d" , &score); //次を入力 } ave = (double)total / i; //平均を求める //表示 printf("合計:%5d点 平均:%7.1lf点\n" , total , ave); }

  • C++の配列について教えてください。

    C++の配列について教えてください。 なぜ平均のところだけ少数以下がすべて0になってしまうのでしょうか。 ご教授お願いします。 //--- ソース --- #include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { int no[100],ten1[100],ten2[100],ten3[100],i,n; double a[100]; scanf("%d", &n); for(i=0; i<n; i++) scanf("%d%d%d%d", &no[i], &ten1[i], &ten2[i], &ten3[i]); for (i=0; i<n; i++) { a[i] = (ten1[i] + ten2[i] + ten3[i]) / 3; } printf("番号 地理 歴史 日本史 平均\n"); for(i=0; i<n; i++) printf("%2d%8d%5d%4d%7.1f\n", no[i], ten1[i], ten2[i], ten3[i], a[i]); return 0; } //--- 実行結果 --- 10 1 35 57 45 2 57 69 67 3 74 65 84 4 45 67 39 5 26 67 29 6 86 77 57 7 13 26 67 8 98 85 58 9 54 50 34 10 45 63 19 番号 地理 歴史 日本史 平均 1 35 57 45 45.0 2 57 69 67 64.0 3 74 65 84 74.0 4 45 67 39 50.0 5 26 67 29 40.0 6 86 77 57 73.0 7 13 26 67 35.0 8 98 85 58 80.0 9 54 50 34 46.0 10 45 63 19 42.0 3.14159 3.14159

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

  • C言語を始めたばかりですが、なかなか難しいです。

    C言語を始めたばかりですが、なかなか難しいです。 下記のプログラムですが、誤りを指摘して頂けないでしょうか? /************************************************************************ 合計と平均を求める ************************************************************************/ #include <stdio.h> #define KAMOKU 3 main() { int ten[KAMOKU]={73,59,92}; /*得点*/ int goukei=0; /*合計点*/ double heikin; /*平均点*/ char shimei[20]="太郎"; /*氏名*/ char kamokuName[KAMOKU][10]={"国語","数学","英語"}; int i; /*科目数*/ /*合計点と平均点の算出*/ for(i = 0; < KAMOKU;i++) { goukei+=ten[i]; } heikin=(double)goukei / i; /*画面に表示*/ printf("氏名:%s\n",shimei); for(i = 0; < KAMOKU;i++) { printf("%-6s:%3d点\n",kamokuName[i],ten[i]); } printf("\n"); printf("%sさんの合計:%3d点 平均:%5.1f点\n",shimei,goukei,heikin); エラーメッセージは for.c: In function ‘main’: for.c:18: error: expected expression before ‘<’ token for.c:27: error: expected expression before ‘<’ token です。 どうぞ宜しくお願い致します。

  • 答えがおかしい

    配列と関数を使って教科ごとの平均点を求めるC言語のプログラムを 作りました。しかし、結果がおかしくいろいろ考えてみたのですが、 よくわからないので質問に出すことにしました。 作ったものは以下です。どうすればよいでしょうか? #include <stdio.h> #define NUMBER 3 /*--- 要素数noの配列の平均値を求める ---*/ double ave_of(int vb[], int no) { int i, sum, ave; for (i=1;i<no; i++) sum+=vb[i]; ave=(double)sum/NUMBER; return(ave); } int main(void) { int i; int a[NUMBER]; int b[NUMBER]; int c[NUMBER]; double ave_a, ave_b, ave_c; printf("%d人の点数を入力してください。\n",NUMBER); for(i=0;i<NUMBER; i++){ printf("[%d番]理科:",i+1); scanf("%d",&a[i]); printf("   数学:"); scanf("%d",&b[i]); printf("   社会:"); scanf("%d",&c[i]); } ave_a=ave_of(a, NUMBER); ave_b=ave_of(b, NUMBER); ave_c=ave_of(c, NUMBER); printf("【理科】平均点:%.1f\n", ave_a); printf("【数学】平均点:%.1f\n", ave_b); printf("【社会】平均点:%.1f\n", ave_c); return(0); } 結果は例えば45.2 というような感じで出したいです。

専門家に質問してみよう