• 締切済み

C言語についてです。

EXELEファイルから値を読みこんで、各自のBMIと全体の身長・体重の平均値を求めるプログラムを作成したいんですが…C言語で…。途中までで混乱してしまい、あっているかも分からないのでお願いしたいです。よろしくお願いします。ヒントだけでもありがたいです。 下がそのファイルです。 height weight 170.7 52.9 166.8 71.3 171.4 58.5 173.4 76.7 176.1 80.2 184 89.1 179 64.7 177.2 78.5 177.7 80.7 173.8 64 167.7 60.3 181.6 72.3 162.4 53 177.4 69.6 178 76.4 174 77.2 185.4 86 172 68.5 172.7 60 166.5 62 171.3 69.6 177 79 174.8 82.6 167.5 69.2 176.8 80.1 181.5 76 177.3 76.4 169.4 51.8 165.2 73.2 175.3 72.3 181.5 72.4 171.5 68.8 176 73.2 186 99.8 167.3 65.5 176.1 78 183.3 77.2 177.5 59.5 180.3 62 171.2 74.7 175 87.2 176 80 171.8 50.6 平均身長の値を出すプログラムは出ているので…これもあわせてBMIと平均体重出してくれるとうれしいです。 /* basic claculation */ #include <stdio.h> #include <math.h> int main(void) { int i, ii; int ntotal; double sum_height; double weight[50], height[50]; double mean_height; char w[6],h[6]; FILE *fp; /* initial setting */ /* ntotal: total word number */ /* sum : total character number */ ntotal = 0; sum_height = 0; /* file open */ /* my data file is weight-height.data */ /* which is in my root directory */ fp = fopen("./weight-height.data","r"); /* skip character reading. */ fscanf(fp,"%s,%s",w,h); /* ntotal: total number */ /* sum : total value */ for (i=0;i<=47;i++) { if (feof(fp)) break; fscanf(fp,"%lf,%lf",&weight[i],&height[i]); printf(" weight = %lf height = %lf \n",weight[i],height[i]); sum_height = sum_height + height[i]; } fclose(fp); ntotal = i; printf(" 全人数 = %d \n",ntotal); mean_height = sum_height /ntotal; printf(", 平均身長 = %lf \n",mean_height); return(0); }

みんなの回答

回答No.2

どうぞ。 #include <stdio.h> #include <string.h> #include <math.h> int main() { double totalHeight = 0.0; double totalWeight = 0.0; int count = 0; char buffer[ 64 ]; FILE* stream = fopen( "./weight-height.data", "r" ); if( !stream ) return -1; /*先頭はコメント行がくるものという前提で*/ if( !fgets( buffer, sizeof( buffer ), stream ) ) { fclose( stream ); return -1; } while( fgets( buffer, sizeof( buffer ), stream ) ) { char* token = NULL; /*身長(多分cm単位っぽいよね?)を取得する*/ /*セパレータはタブか,(カンマ)ということで*/ token = strtok( buffer, "\t," ); if( !token ) { printf( "format invalid\n" ); break; } double height = atof( token ); /*体重(kg)を取得する*/ token = strtok( NULL, "\t," ); if( !token ) { printf( "format invalid\n" ); break; } double weight = atof( token ); /*それぞれの身長、体重、BMIを出力する*/ printf( "height=%.1f weight=%.1f BMI=%.1f\n", height, weight, weight / pow( height / 100, 2.0 ) ); /*身長と体重の総和を計算する*/ totalHeight += height; totalWeight += weight; ++count; } fclose( stream ); printf( "----------------------------------\n" ); /*平均身長と平均体重を出力する*/ printf( "height(ave.)=%.1f\nweight(ave.)=%.1f\n", totalHeight / count, totalWeight / count ); return 0; }

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

○コメント、英語で書いてますが、自分その内容を理解できてますか? コメントというのは、後で混乱しないように書いておく覚えがきです。 見てすぐにわからない程度の英語力なら、素直に母国語で書いたらどうです? ○入力はデータがタブで区切られているのでしょうか?(タブだとここに投稿するときに消されてしまいます) それともカンマでしょうか? プログラム中では、fscanfでカンマ区切りのデータとして処理しているようですが。 > if (feof(fp)) break; fscanfで今回のように%f,%s等で文字列を読むと、読み込んだ箇所のすぐ後にある改行文字や空白文字は、まだ読み込まれない状態で残っています。 最後の行を読み終えると、その後の改行は残っているので、ファイルの最後では無いのでfeofは偽です。 しかし、fscanfではもうデータを取り出せません。一応、データが読み込めなかった場合は、対象の変数の値は変わらないことになっていますが、今回はそもそも初期化していないので、何が入っているかわかりません。 しかも、その「何が入っているかわからない」 値をsum_heightに加えてしまいます。 総人数も、「最後の行の後」の分も加わっています。 あと、breakで止まったときのループカウンタiの値を人数に使おうとしてますが、これも混乱のもとだと思います。 終了はfscanfの戻り値で判定する。 fscanfで成功したら人数を増やす、というプログラムにすると、もうすこしすっきりすると思います。 --- あとは > printf(" weight = %lf height = %lf \n",weight[i],height[i]); scanfとprintfで使われる書式はよく似てますが、同じではありません。 printfではdoubleには%fです。lは不要です。 もともとはどうなるか規定が無く、たまたま動作していた状態でした。最近では規格の方が折れて l を付けても、付いて無いもの同じに処理する、となりました。 > for (i=0;i<=47;i++) なんで47? > mean_height = sum_height /ntotal 人数が0のときのエラー処理を入れてもよいでしょう

関連するQ&A

  • C言語(線形リスト)

    #include <stdio.h> #include <string.h> typedef struct { char name[100]; double height, weight; } HW; int main (void) { FILE *fp; int i, ninzu = 0; char name[100]; double height, weight; double hsum = 0.0; double wsum = 0.0; HW class[100]; if ((fp = fopen ("hw.dat", "r")) == NULL) { perror ("\a ファイルをオープンできません。\n"); exit (1); } else { while (fscanf (fp, "%s %lf %lf", class[ninzu].name, &(class[ninzu].height), &(class[ninzu].weight)) == 3) { ninzu++; } for (i = 0; ninzu > i; i++) { printf ("%-10s %5.1f %5.1f\n", class[i].name, class[i].height, class[i].weigh t); hsum += class[i].height; wsum += class[i].weight; } printf ("----------------------------------------\n"); printf ("平均 %5.1lf %5.1lf\n", hsum / ninzu, wsum / ninzu); fclose (fp); } return (0); } このプログラムを100人分のデータをファイルから読み込んで線形リストにするにはどのようにプログラムを改良すれば良いのでしょうか?

  • C言語のプログラミングで困っています

    C言語を勉強しています。まだまだ初心者で分からないことだらけなのですが、今回はファイル入出力の部分が分からず苦戦しています。 『100個の実数が入った2つのテキストファイルから数値を読み込み、  絶対値を求めるなどの計算をする』プログラムを作成しているのですが、 コンパイルし実行すると強制終了してしまいます。 プログラムは、 void main(void) { FILE *fp; double c[50000];   double d[50000];   double e[50000]; int n = 0;   int m = 0;   int i = 0;   char fname[80];   char fname2[80]; printf("ファイル名 : ");    gets(fname); if((fp = fopen(fname, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&c[i])!=EOF){ printf("%3d : %3lf",++n,c[i]); printf("\n"); i++; } printf("\n"); i=0; n=0; printf("ファイル名 : ");    gets(fname2); if((fp = fopen(fname2, "r")) == NULL){ printf("ファイルがオープンできません\n"); exit(1); } printf("\n"); while (fscanf(fp,"%lf",&d[i])!=EOF){ printf("%3d : %3lf",++n,d[i]); printf("\n"); i++; } …(以下計算) のようになっています。 整数のデータで計算を行うと、正常に動くのですが…。 コンパイルしてもエラーが出ないので、どこが悪いのかわからず困っています。 どなたか教えていただけないでしょうか。お願いしますm(_ _)m

  • C言語について

    #include <stdlib.h > #include <stdio.h> double sum ( double data[] , int number) { double result; int a ; result = 0; for (a = 0; a < number; a+1){ result += data[a]; } return (result); } double average ( double data[] , int number) { double result; result = sum(data,number)/number; return (result); } int main ( void ) { double heikin; double data[9]; double average; int number,i; printf("数値の数を入力(1~10) = "); scanf("%d",&number); printf("データを入力 "); for( i=0;i<number;i++ ) { printf("%d個目 = ",i+1); scanf("%d",&data[i]); } heikin = average(data,number); printf("平均は%lfです\n",heikin);//文を使って平均値(heikin)を出力 return(EXIT_SUCCESS); } というプログラムがありエラーで 「35行目」で記述エラーを発見しました。 「function pointer」を付け忘れています。 と出てきます。ほかのサイト様で写真とかありえないといわれましたのでテキストで再度質問させていただきました。 よろしくお願いします。 前投稿から編集もしているので少しプログラムが違います。

  • C言語 データソート

    失礼します。現在テキストファイルを昇順で出力したいのですが うまくいきません、書籍にて勉強しているのですが、打ち間違いなどがみつかりません。 何卒よろしくお願いします。 #include <stdint.h> #pragma warning(disable:4996) typedef struct { char name[100]; double height; double weight; } pdata; void swap(pdata *x, pdata *y) { pdata temp = *x; *x = *y; *y = temp; } void sort(pdata data[], int n) { int k = n - 1; while (k >= 0) { int i, j; for (i = 1, j = -1; i <= k; i++) if (data[i - 1].height > data[i].height) { j = i - 1; swap(&data[i], &data[j]); } k = j; } } int main(void) { FILE *fp; int i; int ninzu = 0; double hsum = 0.0; double wsum = 0.0; pdata data[NUMBER]; if ((fp = fopen("hw.dat", "r")) == NULL) printf("\aファイルをオープンできません\n"); else { while (fscanf(fp, "%s%lf%lf", data[ninzu].name, &data[ninzu].height, &data[ninzu].weight) == 3) { hsum += data[ninzu].height; wsum += data[ninzu].weight; ninzu++; } sort(data, ninzu); for (i = 0; i < ninzu; i++) printf("%-10s %5.lf %5.lf\n", data[i].name, data[i].height, data[i].weight); printf("----------------------------"); printf("平均 %5.1f %5.1f", hsum / ninzu, wsum / ninzu); fclose(fp); } return(0); } エラーメッセージ 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー C2057 定数式が必要です。 helloworld c:\users\documents\visual studio 2015\projects\helloworld\helloworld\helloworld.c 36 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) 識別子 "FILE" が定義されていません helloworld c:\Users\Documents\Visual Studio 2015\Projects\helloworld\helloworld\helloworld.c 30 重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 エラー (アクティブ) 識別子 "NUMBER" が定義されていません helloworld c:\UsersDocuments\Visual Studio 2015\Projects\helloworld\helloworld\helloworld.c 36

  • C言語 ファイル処理に関する事

    テキストエディタで打ち込んだファイル 【hw.dat】 Akiba 160 59.3 Kurata 162 51.6 Masaki 182 76.5 Tanaka 170 60.7 Tsuji 175 83.9 Washio 175 72.5 名前・身長・体重のデータです。 <問>   「hw.dat」から読み込んだデータを身長順にソートした上で   表示するプログラムを作成せよ。 下記のプログラムでは実行結果が何も出てきません。 入門レベルのスキルしかありません。何処が良くないのでしょうか。 教えて下さい。 [プログラム]   #include <stdio.h>   #include <string.h>   void swap_double(double *x, double *y)   {   int temp = *x;   *x = *y;   *y = temp;   }   void swap_name(char *sx, char *sy)   {   char *temp;    strcpy(temp, sx);   strcpy(sx, sy);   strcpy(sy, temp);   }   void sort(double *he, double *we, int n)   {   int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_double((he - 1), he); swap_double((we - 1), we); } } }   void sort_name(double *he, char *na, int n)   {    int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_name((na - 1), na); } } }  int main(void)   {    FILE *fp;    int ninzu = 0;    char *name[100];    double height, weight;    double hsum = 0.0;    double wsum = 0.0;    int i;    char *na[i];    double he[6];    double we[6];    if ((fp = fopen("hw.dat", "r")) == NULL)    printf("\aファイルをオープンできません。\n");    else{   for(i = 0; i < 6; i++){   while (fscanf(fp, "%s%lf%lf", name , &height , &weight) != EOF ){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i];   printf("%-10s %5.1f %5.1f\n", na, height, weight);   }   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);   }   puts("\n身長順にソートしました。");   for(i = 0; i < 6; i++){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i]; }   for(i = 0; i < 6; i++){   sort(he, we, 6);   sort_name(he, *na, 6);   printf("%-10s %5.1f %5.1f\n", *(na + i) , *(he + i), *(we + i));   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);  fclose(fp);   return 0;  }   

  • C言語の質問です。

    前にも質問したのですがなかなかうまくいかないのでよろしくお願いします。 データの書いてあるファイルを読み込んで処理するプログラムを書きたいと考えています。 読み込むデータ 0.012500 0.499167 1.382500 1.534444 2.489167 3.635000 3.775000 5.407500 5.705000 5.916667 6.115833 6.295278 6.825278 7.079722 . . . . この様な数値のかいてあるデータを使って0.5ずつに区切ってその中に何個データがあるか数えたいと考えています。(データは1万5千個以上あります) 例えば上のデータで考えると 0~0.5の範囲のデータは2個 0.5~1の範囲のデータは0個 1~1.5の範囲のデータは1個 1.5~2の範囲のデータは1個 2~2.5の範囲のデータは0個。。。 という風に数えるプログラムにしたいです。 僕が分からないところはどのように場合分けしていくか。。。です。 #include<stdio.h> //#include<process.h> int main(void) { FILE *fp; double n; int cnt,i,Cnt; fp=fopen("1.dat","r"); if(fp==NULL) { printf("file open error!!\n"); exit(1); } i=0; cnt=0; Cnt=0; while(fscanf(fp,"%lf\n",&n)!=EOF){ if(i<=n<(i+0.5)){ cnt++; printf("%lf %d\n",i,cnt); } else if((i+0.5)<=n<(i+1)){ Cnt++; printf("%lf %d\n",i,Cnt); } else{ i++; } } fclose(fp); return 0; } 僕の考えはデータを読み込む 変数 i を使って if文で i <= n <i+0.5の範囲のときはcntを足していく     i+0.5<= n <i+1の範囲のときはCntを足していく それ以外のときは i を+1して同じことを繰り返す というようなやり方を考えました。 しかしうまくいきませんでした。 どのようにすればよいでしょうか。 よろしくお願いします。

  • C言語のプログラムを修正追加お願いします。

    C言語のプログラムがあと少しで完成しそうなのですがつまっています。誰か、修正、追加して完成させて頂けないでしょうか このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。実行結果のとおりになるようお願いします http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています、実行結果も含まれています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; /*read_file関数の宣言*/ void read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; } fclose(fp); printf("ファイルを読み込みました。\n"); return 0; } /*p_all関数の宣言*/ void p_all(void) { int i; printf("名前     身長(cm)   体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } int main(void) { int a; while(1) { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } if (a==1){   read_file(); }   if (a==2){   p_all(); } if (a==3){} if(a==4){ break; } return a; }

  • ファイルのデータがうまく読み込まれません

    こんにちは。ファイルからデータを読み込んで、平均値と標準偏差を求めるプログラムを書いているんですが、計算結果がなぜか違う値になってしまいます。書いているプログラムは、 #include<stdio.h> #include<math.h> #define MAX 200 /* ファイル"sample.txt"から複数の値を入力し、それらの  平均値、標準偏差を出力する.  */ void main(void) { FILE *fp; char text[256],l[256]; int i, n; float a[MAX], sum,sum2,mean,sdev; fp = fopen("sample.dat","r"); /* sample.txt を開く */ if(fp == NULL){ printf("Error!\n");exit(0);}/* sample.txtがなければ停止 */ for(i = 1; i <= 3; i++) fscanf(fp, "%s\n",text); for(i = 0; i < MAX; i++) { if(fscanf(fp, "%s %f\n",l, a[i]) == EOF ) ; } n = i; sum = a[0]; sum2 = a[0]*a[0]; for(i = 0; i < n; i++) { sum += a [i]; sum2 += a[i]*a[i]; } mean = sum/n; /* 平均値の計算 */ sdev = sqrt(sum2/n - mean*mean); /* 標準偏差の計算 */ printf(" mean : %6.2f\n", mean); printf("standard dev.: %6.2f\n",sdev); } で、読み込むファイルは 平均値と標準偏差の計算 クラスA組み 氏名 身長(cm) 鈴木 175.54 佐藤 170.34 清水 165.29 徳田 185.23 赤木 178.61 と、長くなってしまいましたが、if文の中のfscanfの部分が違うんでしょうか?初心者でどこが違うのか分かりません。教えていただけないでしょうか?

  • 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

  • C言語のプログラムを見てください

    ある100行の値がx列、y列の2列あるファイルを読み込んでそれを配列に入れ、yの最小値及びそれと同じ行にあるxの値を表示するプログラムを書きたいのですがy列の最小値を表示するプログラムを書き終えた所でコンパイルして実行してみると正しく値が表示されませんでした。それどころか実行するたびに値が変わってしまいます。どこがおかしいのかわからないため、ご指摘のほどよろしくお願いします。また、できれば同じ行にあるx列の値も表示させるプログラムを教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define N 100 int main(void) { int x[N],i; double y[N],min; FILE *fp; fp=fopen("book.dat","r"); if(fp==NULL){ puts("can't open file!"); exit(-1); } for(i=0;i<N;i++){ fscanf(fp,"%d %lf", &x[N],&y[N]); printf("x=%d\n y=%lf\n",x[N],y[N]); } min=y[0]; for(i=1;i<N;i++){ if(y[i]<min) min=y[i]; } fclose(fp); printf("最小値:%lf\n",min); return 0; }

専門家に質問してみよう