• 締切済み

ファイルの入出力

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

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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
hanaeogami
質問者

補足

#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)の構造体のメンバの渡し方がわかりません。 ページもちゃんとみたのですが…

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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
hanaeogami
質問者

補足

何度もすみません。 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) { } } こうゆうことですか??

回答No.5

> 書式は%dでいいのでしょうか?氏名は%sじゃなくてもいいのですか? まずはやってみる。質問はそれから。

hanaeogami
質問者

補足

やってみたのですが、ものすごい数のエラーがでました。 ファイル名は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; } でいいのでしょうか??

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.4

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

hanaeogami
質問者

補足

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

回答No.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]の結果を追加します。 これ以上は訊くなかれ。 "構成の方法"を示しましたから 「わからない」とは言わせません。 教科書/先生/友人を総動員して解決してください。

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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; } 以上。

回答No.1

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

hanaeogami
質問者

補足

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

関連するQ&A

  • ファイルの入出力

    今までに大統領になった人の就任日、代、名前などデータがCSVファイルとしてあります。そのファイルをfgets関数で1行ずつ読み込み、大統領になった回数が多い順に並び替えて新しいcsvファイルに出力したいと考えています。 構造体にそのデータを入れていきたいと思うのですが、その構造体にデータを入れるにはどのようにしたら良いのでしょうか??またどのような構造体を作れば良いのでしょうか??win98でc言語を使用しています。

  • プログラミング言語C

    名前(char name[20]),年齢(intage),身長(double height),体重(double weight)の4つのメンバを持つ構造体であるperson型を宣言し,以下のようなプログラムを作成せよ. 1.1つの構造体変数を宣言し,それぞれのメンバの値を入力させ表示する. 2.構造体person型の配列を作成し,3人分のデータを入力して表示する. 3.BMIを求める関数double bmi(person *p) を作成し,入力した3人分のデータからそれぞれのBMIを求め表示する. BMIとはBody Mass Indexのことで肥満度を表す指数 体重をw(kg),身長をt(m)とすると,BMI = w/t2 解答お願いします。

  • BMIについて

    身長162センチ、体重50キロ、妊婦です。 身長・体重から計算する肥満度の判定方法のBMI指数だと19くらいです。 ですが、体重計で量るBMIでは28もあり、肥満になります。 やはり体重計のBMIが正しいのでしょうか? 痩せ型ですが、最近妊娠5ヶ月で最近つわりが終わったのもありすごい食べています。(甘いものなども) でも体重は増えてません。 肥満ということになるのでしょうか?

  • Ifステートメントと条件式を用いた、マクロの記述方式について質問です。

    BMI値をもとに、Ifステートメントと条件式を用いて評価をするミクロを作成したいのですが・・・ (BMI値を算出、出力するマクロの記述まではできています) 判定した結果は、Range("B5")に文字列で表示するようにします。 [例]18.5未満の場合であれば「低体重 」となるようにしたいです。 ・BMI値 評価  (1)18.5未満 低体重  (2)18.5以上25未満 普通体重  (3)25以上30未満 肥満度1  (4)30以上35未満 肥満度2  (5)35以上40未満 肥満度3  (6)40以上 肥満度4 とりあえず、  If BMI値 < 18.5 Then 'BMI値が18.5未満の場合 として、その後、ActiveCell.・・・・以降の記述方法が分かりません。。。 1つ分かればあとは応用するだけなので、どなたか模範となる記述方法を示してもらえませんか? よろしくお願いします。

  • BMIはいい加減?

    BMIが18.5未満を痩せと言うそうですが、僕の体重は49kgで身長は164cmでBMIは18.2ですが、お腹が出ていてコレステロールなども高めです。あきらかに肥満です。そうするとBMIは25以上にならなくてはおかしいです。誤差って範囲じゃないです。 BMIはいい加減なんですか?

  • 適正体重について。

    BMIというのは身長体重から割り出して肥満かどうかを調べるそうですが、体脂肪率を含めないと正しく肥満か、痩せかというのはわからないですよね? 筋肉のある方であればお腹が出ていないのに肥満とでてしまう方もいると思います。 体脂肪率や筋肉量を考えたうえで身長などから計算できる適正体重を調べる方法はありますか?

  • BMIの数値って全然アテにならないのでは?

    BMIの数値って全然アテにならないのでは? ※BMI=体重 ÷ 身長(m)の2乗 22前後が標準体重とされる。18.5以下が痩せ。25以上が肥満。 が基本です。 私は身長163cmで体重52kg(体脂肪8%)の標準体型ですが 理想体重は58kgと出ました。私が体脂肪15%の時ですら55kgです。 正直、163cmの身長で58kgってどんだけデブなんだよって思ったぐらいです。 実際に私と同じぐらいの身長で59kgの人いますが、デブです。お腹とかポッチャリしてます BMIの計算方法を考えた人ってデブ専の人なんじゃないでしょうか? 体重と体脂肪率をこまめに見てた方がよっぽど参考になると思うんですが・・・ そりゃ基準ってあるだろうけど、BMIの基準数値の体重って高すぎじゃないですかね?

  • 教えてください!このBMIの算式

    体重(kg)÷身長(m)の2乗     肥満度(%)=(実際の体重ー標準体重)÷標準体重×100     標準体重=22×身長(m)の2乗 私の体重は68kg、身長=175、体脂肪=18です。このBMIの算式で自分の標準体重を知りたいですが、正しく計算できません。どなたか分かる方いらっしゃいますか? よろしくお願い致します。

  • クラス宣言の身長と体重の比較

    適切な範囲の身長(110cm 以上200cm 未満)と体重(0kg を越える)のデータからBMI 体格 指数を計算し、表示するプログラムを下記で作成したのですが、「入力エラー1:身長データ 205.600 cm と体重データ -85.900 kg  110cm 以上200cm 未満の身長で、0kg より重い体重でしか計算できません。」と表示されません。むしろ、「入力エラー3:身長データ 205.600 cm   110cm 以上200cm 未満の身長でしか計算できません」と表示されるのですが、これはどこが違っているのですか?違っていたら例としてどのように直したらいいのか教えてください。 class Student { private double height; private double weight; private double bmi; public void calculate(double ht, double wt) { if(ht>=110 && ht<=200 && wt>=0){ height = ht; weight = wt; bmi = wt/((ht/100)*(ht/100)); System.out.println("下記の学生のBMI体格指数を計算します。"); System.out.println( ht+"cm, "+wt+"kgの学生"); System.out.println("計算結果:BMIの体格指数は"+bmi+"kg/m2です。"); } else if(!(ht>=110 && ht<=200)){ System.out.println("入力エラー3:身長データ"+ht+"cm"); System.out.println("110以上200cm未満の身長でしか計算できませ                     ん。"); } else if(!(wt>0)){ System.out.println("入力エラー2:体重データ"+wt+"kg"); System.out.println(" 0kgより重い体重でしか計算できません。"); } else{ System.out.println("入力エラー1:身長データ"+ht+"cmと体重デー                                タ"+wt+"kg"); System.out.println("110以上200cm未満の身長で、 0kgより重い体重でし                             か計算できません。"); } } } class KNO { public static void main(String args[]) { Student student1 = new Student(); student1.calculate(170.5, 62.3); student1.calculate(205.6, -85.9); student1.calculate(200.8, 102.6); student1.calculate(108.4, 20.9); student1.calculate(165.5, -52.7); } }

    • ベストアンサー
    • Java
  • 携帯電話対応

    携帯電話のサイトで身長・体重から体脂肪率(BMI)計算・表示させるページを作りたいのですが。ネット上の測定サイトはJavaScriptというものを使ってるところが多いようですがそれを参考にしてもうまくいきません。特に計算ボタンが作動しません。 BMI=体重(kg)/身長(m)2 から求められ標準値は22です。 できれば標準体重・肥満度も表示できたら嬉しいです。 サイト作成の知識は初心者レベルですがホームページビルダー10を使用しています。 ちなみに私の携帯はauです。 お願いします。

専門家に質問してみよう