こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

ファイルの入出力

氏名・身長・体重が入っているファイルからデータを構造体として読み取りその人の肥満度を表示するプログラムを作りたいのですが一考にわかりません。。。誰か知恵を貸してくれませんか
肥満度は20未満が「やせすぎ」20以上25未満は「普通」25以上は「肥満」としています。ファイルには27にんのデータが入っています。肥満度の計算は関数を作成で、関数名はbmiで引数は構造体、戻り値は実数です。肥満度の計算は体重÷身長÷身長です。
構造体は自分で定義します。よろしくお願いします

投稿日時 - 2007-07-17 21:42:34

QNo.3176593

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(7)

ANo.7

★????
>こうゆうことですか??
 ↑
 全然、アドバイスした所が修正されていないけど。なぜ?

・次の点をもう一度見直して修正して下さい。
 (1)fscanf() の書式制御文字(%s %d %d とか3つにします)
 (2)fscanf() の引数(ここには構造体メンバを3つ渡します)
 (3)if() 文の条件で calc_bmi ではなく戻り値の a で比較すべきです。
 (4)else if () 文の条件式が全然直っていませんが…。→if(20<calc_bmi=<25) はエラーです。
 (5)main() 関数に void data() の関数は定義できません。Java 言語ではないですから。
  main() 関数の外で void data() を定義して下さい。
 (6)printf() 関数では『やせすぎ』、『普通』、『肥満』の3つを表示するのに
  なぜ?氏名、身長、体重を出力しているの?
  質問の内容と違いますが、どちらが正しいのですか?
・順番に修正してから全ソースなどを補足などに貼り付けて下さい。
 http://www9.plala.or.jp/sgwr-t/c/sec15-2.html
 ↑
 ここのページをよく読みましょう。
 そうすれば(1)、(2)はできます。
・以上。もう少し落ち着いて頑張って下さいな。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec15-2.html

投稿日時 - 2007-07-18 06:18:27

補足

#include <stdio.h>

struct calc_bmi{
int sintyo,taijyu;
char name[80];
};

int main(void)
{
double a;
FILE *fp;
 
if ( (fp = fopen("bmi.dat","r")) != NULL ){ 
while ( fscanf(fp,"%s %d %d",&name,&sintyo,&taijyu) == 3 ){

a = bmi(&calc_bmi);
   
if(20>=a){
printf("%s %d %d やせすぎ",name,sintyo,taijyu);
}else if(20<a)&&(a=<25){
printf("%s %d %d 普通",name,sintyo,taijyu);
}else{
printf("%s %d %d 肥満",name,sintyo,taijyu);
}
  }
fclose( fp );
}
return 0;
}

void data (struct calc_bmi data[],int count)
{

}
これであっているでしょうか?
(2)の構造体のメンバの渡し方がわかりません。
ページもちゃんとみたのですが…

投稿日時 - 2007-07-18 15:02:41

ANo.6

>やってみたのですが、ものすごい数のエラーがでました。
>でいいのでしょうか??
 ↑
 エラーが出ているので良くないです。
 実際ソースを見ても構造体が使われていなかったり、if 文の条件式が正しくないです。
・まず構造体はどこに定義しているのか補足して欲しいです。
 あと fscanf() の書式制御文字は引数に応じて複数指定できるので『%s,%d,%d』などと
 3つにします。今回は name、sintyo、taijyu がそれぞれ文字列型、整数型、整数型なので
 『%s』、『%d』、『%d』となるのです。間にカンマを入れていますが氏名、身長、体重の
 データがカンマ文字で区切られていると想定してのアドバイスです。もし、空白文字で
 区切られている場合は『%s %d %d』とします。
 http://www9.plala.or.jp/sgwr-t/c/sec05.html を参考に。

その他:
・fscanf() で読み込んだ値(name、sintyo、taijyu)を構造体にセットしてから bmi() 関数に
 渡して下さい。計算結果を calc_bmi に代入するところはあっています。
>calc_bmi=taijyu/sintyo/sintyo;
 ↑
 この指定では構造体メンバにセットできませんよ。
・if 文の条件式
>}else if(20<calc_bmi=<25){
 ↑
 は『20以上25未満』を想定しているようですが、このような記述はできません。
 よって2つに条件式を分けます。
 (1)20以上
 (2)25未満
 この2つの条件を AND(&&) で結合します。
・つまり、
 『else if ( (1)の式 && (2)の式 )』
 という感じになります。

参考文献:
http://homepage3.nifty.com/mmgames/c_guide/index.html→『苦しんで覚えるC言語』
 にある
http://homepage3.nifty.com/mmgames/c_guide/16-01.html→『異なる型の変数をまとめる』
http://homepage3.nifty.com/mmgames/c_guide/16-02.html→『構造体の引数』
http://homepage3.nifty.com/mmgames/c_guide/16-03.html→『構造体の配列』
http://homepage3.nifty.com/mmgames/c_guide/16-q.html→『練習問題16』
 を参照して下さい。ここにほぼ答えらしき内容が載っています。
・以上。

参考URL:http://www9.plala.or.jp/sgwr-t/c/sec15-2.html

投稿日時 - 2007-07-18 00:50:54

補足

何度もすみません。
include <stdio.h>

struct calc_bmi{
int sintyo,taijyu;
char name[80];
};

int main(void)
{
double a;
FILE *fp;
 
if ( (fp = fopen("bmi.dat","r")) != NULL ){ 
while ( fscanf(fp,"%d",&name,&sintyo,&taijyu) == 3 ){

a = bmi(&calc_bmi);
   
if(20>=calc_bmi){
printf("%s %d %d",name,sintyo,taijyu);
}else if(20<calc_bmi=<25){
printf("%s %d %d",name,sintyo,taijyu);
}else{
printf("%s %d %d",name,sintyo,taijyu);
}
  }
fclose( fp );
}
return 0;

void data (struct calc_bmi data[],int count)
{

}
}
こうゆうことですか??

投稿日時 - 2007-07-18 01:52:45

ANo.5

> 書式は%dでいいのでしょうか?氏名は%sじゃなくてもいいのですか?

まずはやってみる。質問はそれから。

投稿日時 - 2007-07-17 23:55:30

補足

やってみたのですが、ものすごい数のエラーがでました。
ファイル名はbmi.datです。

include <stdio.h>
int main(void)
{
double a;
int sintyo,taijyu,name;
FILE *fp;
 
if ( (fp = fopen("bmi.dat","r")) != NULL ){ 
while ( fscanf(fp,"%d",&name,&sintyo,&taijyu) == 3 ){
 
calc_bmi=taijyu/sintyo/sintyo;

a = bmi(&calc_bmi);
   
if(20>=calc_bmi){
printf("%s %d %d",name,sintyo,taijyu);
}else if(20<calc_bmi=<25){
printf("%s %d %d",name,sintyo,taijyu);
}else{
printf("%s %d %d",name,sintyo,taijyu);
}
  }
fclose( fp );
}
return 0;
}


でいいのでしょうか??

投稿日時 - 2007-07-18 00:12:43

ANo.4

★回答者 No.2 です。一部訂正。
 場所⇒while ( fscanf("書式制御文字",&氏名メンバ,&身長メンバ,&体重メンバ) == 3 ){
 修正⇒while ( fscanf(fp,"書式制御文字",&氏名メンバ,&身長メンバ,&体重メンバ) == 3 ){
 ※fscanf() に『fp』を忘れてしまいました。第一引数に必要でした。
・以上。

投稿日時 - 2007-07-17 22:57:45

補足

書式は%dでいいのでしょうか?氏名は%sじゃなくてもいいのですか?

投稿日時 - 2007-07-17 23:14:24

ANo.3

> ファイルの開け方、閉め方、fscanfなどの単語の意味はわかっていますが

ならば
struct Record {
 char name[64]; /* 名前 */
 double height; /* 身長 */
 double weight; /* 体重 */
};

struct Record table[27];

1. ファイルを開け、
2. その内容を読み込んで table[0]~table[26] に格納し、
3. ファイルを閉じてください。
4. 確認のため、読み込まれたtable[]を全部プリントしてみてください。
5. 次に問題の関数bmi:
double bmi(struct Record* rec)
を実装します。

そこまでできたら[4]に[5]の結果を追加します。

これ以上は訊くなかれ。
"構成の方法"を示しましたから
「わからない」とは言わせません。
教科書/先生/友人を総動員して解決してください。

投稿日時 - 2007-07-17 22:47:37

ANo.2

★アドバイス
>ファイルの開け方、閉め方、fscanfなどの単語の意味はわかっていますが、
>どういう風に書いていけばいいのかわかりません。
>構成の方法がわかりません。
 ↑
 全体的に次のようにすれば良いでしょう。

// 肥満度の計算プログラム
int main( void )
{
 double ret;
 FILE *fp;
 
 if ( (fp = fopen("ファイル名","r")) != NULL ){ ←ファイルの開け方
  // 氏名,身長,体重の入力(構造体の各メンバに入力)
  while ( fscanf("書式制御文字",&氏名メンバ,&身長メンバ,&体重メンバ) == 3 ){
   // ここで BMI の計算(肥満度)
   ret = bmi( &構造体名 ); ←ここで構造体を渡す(体重÷身長÷身長)
   
   // ここで条件分岐(表示)
   /*
   肥満度は20未満が「やせすぎ」
   20以上25未満は「普通」
   25以上は「肥満」としています。
   */
   ↑
   if()、else if()、else を使いましょう。
  }
  fclose( fp ); ←ファイルの閉め方
 }
 return 0;
}

以上。

投稿日時 - 2007-07-17 22:41:32

ANo.1

"わかりません"だけでは答えようがありません。
どこまでわかってて、なにが/どうわからないかを
クリアにしないと"丸投げ"とみなされますよ。

投稿日時 - 2007-07-17 21:52:04

補足

ファイルの開け方、閉め方、fscanfなどの単語の意味はわかっていますが、どういう風に書いていけばいいのかわかりません。構成の方法がわかりません。

投稿日時 - 2007-07-17 22:12:39

あなたにオススメの質問