![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
EXELEファイルから値を読みこんで、各自のBMIと全体の身長・体重の平均値を求めるプログラムを作成したいんですが…C言語で…。途中までで混乱してしまい、あっているかも分からないのでお願いしたいです。よろしくお願いします。ヒントだけでもありがたいです。
下がそのファイルです。
heightweight
170.752.9
166.871.3
171.458.5
173.476.7
176.180.2
18489.1
17964.7
177.278.5
177.780.7
173.864
167.760.3
181.672.3
162.453
177.469.6
17876.4
17477.2
185.486
17268.5
172.760
166.562
171.369.6
17779
174.882.6
167.569.2
176.880.1
181.576
177.376.4
169.451.8
165.273.2
175.372.3
181.572.4
171.568.8
17673.2
18699.8
167.365.5
176.178
183.377.2
177.559.5
180.362
171.274.7
17587.2
17680
171.850.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);
}
A 回答 (2件)
- 最新から表示
- 回答順に表示
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;
}
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
空白を含んだ文字列がうまく格...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
フレーム画像の連続保存について
-
配列から構造体へデータコピー
-
C言語のシリアル通信について
-
Ç言語でファイルサイズを変更す...
-
char型2つを結合し、short型に...
-
エラーについて質問です。
-
終了条件Ctrl+zについて,結果表...
-
C メモリの解放について
-
C言語のプログラムで、途中で止...
-
C++で指定文字列のカウント方法...
-
c言語
-
#define _CRT_SECURE_NO_WARNIN...
-
信頼区間の1.96や1.65ってどこ...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
C言語のプログラムで、途中で止...
-
矢印キーを押下してコンソール...
-
char型2つを結合し、short型に...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
終了条件Ctrl+zについて,結果表...
-
空白を含んだ文字列がうまく格...
-
プログラミングの授業の課題です
-
リストの作成と出力(C言語)
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
-
エラーについて質問です。
-
reallocでエラー
-
C言語でのCSVファイルの読み出...
-
Cプログラムについて
-
なぜ無限ループになるかが分か...
-
C++で指定文字列のカウント方法...
おすすめ情報