dポイントプレゼントキャンペーン実施中!

5名の会社員の健康管理表を作成するプログラムで、データとして「名前(英大文字最大10字)」「年齢」「身長」「体重」「最低血圧」「最高血圧」があらかじめ与えられています。
これをテキストファイルdata.txtに納めておき、プログラムには15人分のデータが入る構造体の配列を用意し、fscanf()関数で読み込んでから、「標準体重」と「高血圧診断結果」を計算した上で、一覧データを画面に表示したいんですが、コンパイルができたもののエラーが出て動きません。どこがまずいんでしょうか?

data.txtの中身

AKIYAMA 35 179.1 72.5 97 145
ENDOU 40 162.5 65.3 85 130
HONNMA 42 171.8 68.9 89 166
SATO 45 167.2 64.1 91 142
YAMADA 50 168.4 59.5 85 151

プログラム

#include <stdio.h> /*標準入出力関数の使用宣言*/
#include <string.h>

struct kenkou{/*健康管理表データの構造体テンプレート作成*/
    char *name; /*名前用ポインタ変数*/
    int age; /*年齢用データ変数*/
    double sintyou; /*身長用データ変数*/
double weight; /*体重用データ変数*/
    double hweight; /*標準体重用データ変数*/
    double lblood; /*最低血圧用データ変数*/
double hblood; /*最高血圧用データ変数*/
    char bloodj[30]; /*血圧診断用データ変数*/
};

voiddisplay(struct kenkou *pa)
{
 printf("名前年齢身長体重 標準体重最低血圧最高血圧血圧診断\n");
  
while(pa->name != NULL)

{
printf("%20s %3d %3.1f %3.1f %3.1f %3d %3d %10s\n",
pa->name,pa->age,pa->sintyou,pa->weight,
pa->hweight,pa>lblood,pa->hblood,pa->bloodj);

pa++;
}
}

int main(void)/*main関数*/
{

FILE *fp;
int i;
struct kenkou data[15];
fp = fopen( "data.txt", "r" );
if( fp == NULL )
{
puts( "data.txtが開けません" );
return 1;
}

for(i=0; i<15 && !feof(fp); i++){
fscanf(fp,"%20s %3d %3.1f %3.1f %3d %3d",data[i].name,
&data[i].age,&data[i].sintyou,&data[i].weight,
&data[i].lblood,&data[i].hblood);
data[i].hweight=(data[i].sintyou-100)*0.9;
if(data[i].lblood<=90&&data[i].hblood<=140){
strcpy(data[i].bloodj,"正常血圧");}
else if(data[i].lblood>=95&&data[i].hblood>=160){
strcpy(data[i].bloodj,"高血圧");}
else{
strcpy(data[i].bloodj,"境界域高血圧");}
i++;
}
fclose(fp);

display(data);

return 0;
}

A 回答 (3件)

正しく動くように手を加えてみました。



#include <stdio.h>
#include <string.h>

typedef struct _kenkou {
  char name[11];
  int age;
  double sintyou;
  double weight;
  double hweight;
  int lblood;
  int hblood;
  char bloodj[30];
} kenkou;

void display(kenkou *pa, int count)
{
  int i;
  
  printf("名前 年齢 身 長 体重 標準体重 最低血圧 最高血圧 血圧診断\n");
  for (i = 0; i < count; i++) {
    printf("%-10s %4d %3.1f %3.1f %3.1f %3d %3d %s\n",
    pa->name, pa->age, pa->sintyou, pa->weight,
    pa->hweight, pa->lblood, pa->hblood, pa->bloodj);
    pa++;
  }
}

int main(void)
{
  FILE *fp;
  int i;
  kenkou data[15];
  
  fp = fopen("data.txt", "r");
  if (fp == NULL) {
    puts("data.txtが開けません");
    return 1;
  }
  
  for (i = 0; i < 15 && !feof(fp); i++) {
    fscanf(fp, "%s%d%lf%lf%d%d",
      data[i].name, &data[i].age, &data[i].sintyou, &data[i].weight,
      &data[i].lblood, &data[i].hblood);
      data[i].hweight = (data[i].sintyou - 100) * 0.9;
    if (data[i].lblood <= 90 && data[i].hblood <= 140) {
      strcpy(data[i].bloodj, "正常血圧");
    }
    else if (data[i].lblood >= 95 && data[i].hblood >= 160) {
      strcpy(data[i].bloodj, "高血圧");
    }
    else {
      strcpy(data[i].bloodj, "境界域高血圧");
    }
  }
  fclose(fp);
  display(data, i);
  return 0;
}

(注)インデントのため、全角空白を使っています。

この回答への補足

すいません,もう一度見直してみるとasuncionさんのものをdata-1になおせば完成しました。お手数おかけしました、ありがとうございます。

補足日時:2008/02/07 23:51
    • good
    • 0
この回答へのお礼

具体的にプログラムを提示してくださってありがとうございます。
プログラムのとおり作ってみましたが名前・・・が表示された後エラーがでました。

printf("%10s%3d%3.1f%3.1f%3.1f%3d%3d%s\n",pa->name,pa->age,pa->sintyou,pa->weight,pa->hweight,pa->lblood,pa->hblood,pa->bloodj);
ここの部分でエラーがでてしまうようです。

display関数の int i;の後ろにprintfでcountを表示させてみると、data.txtの中には5人分のデータしかないにもかかわらず6となったため、main関数内の最後のdiplay関数の呼び出しをdisplay(data,i-1)にしました。

お礼日時:2008/02/07 23:42

>char *name; /*名前用ポインタ変数*/


>fscanf(fp,"%20s %3d %3.1f %3.1f %3d %3d",data[i].name,
そもそも、nameの領域がありませんね。
    • good
    • 0

とりあえず気づいた点としては、fscanf関数に%3.1fなどの精度は指定できません。


また、フィールド幅は固定長レコードファイルのときに使用するものなので、今回は
可変長レコードファイルですから%sとか%fだけで幅は指定しなくてもいけるはずです。
また、double型の場合は%lfになりますのでその辺を確認してみてはいかがでしょうか?

また、どのへんまで実行した時にどんなエラーが出たのか等、もう少し詳しい情報があれば
原因も考えやすくなります。
    • good
    • 0
この回答へのお礼

回答していただき、ありがとうございます。
fscanf関数を
fscanf(fp,"%s %d %lf %lf %d %d",data[i].name,&data[i].age,&data[i].sintyou,&data[i].weight,&data[i].lblood,&data[i].hblood);
に変更してコンパイルし実行すると、何も表示されず

問題が発生したため、kenkou.exe を終了します。 ご不便をおかけして申し訳ありません。

が表示されて終了してしまいます。

お礼日時:2008/02/07 18:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!