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;
}
No.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具体的にプログラムを提示してくださってありがとうございます。
プログラムのとおり作ってみましたが名前・・・が表示された後エラーがでました。
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)にしました。
No.2
- 回答日時:
>char *name; /*名前用ポインタ変数*/
>fscanf(fp,"%20s %3d %3.1f %3.1f %3d %3d",data[i].name,
そもそも、nameの領域がありませんね。
No.1
- 回答日時:
とりあえず気づいた点としては、fscanf関数に%3.1fなどの精度は指定できません。
また、フィールド幅は固定長レコードファイルのときに使用するものなので、今回は
可変長レコードファイルですから%sとか%fだけで幅は指定しなくてもいけるはずです。
また、double型の場合は%lfになりますのでその辺を確認してみてはいかがでしょうか?
また、どのへんまで実行した時にどんなエラーが出たのか等、もう少し詳しい情報があれば
原因も考えやすくなります。
回答していただき、ありがとうございます。
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 を終了します。 ご不便をおかけして申し訳ありません。
が表示されて終了してしまいます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
linuxのシェルでファイル名に先...
-
【Excel VBA】10進数を2進数に...
-
perlで作った掲示板、エラーが...
-
int型(2バイト)データの分割
-
エクセルVBA:日付データの変換...
-
matlabのソースコードをpython...
-
C言語の構造体にてバブルソート...
-
エクセルVBAで16の16乗を正確に...
-
c言語での wavファイルの編集(...
-
Perlで2つのテキストファイル...
-
C#でのswitch文
-
PICNICのVB制御プログラム
-
matlabでのRRI検出
-
構造体配列のメモリ確保
-
c言語 配列から数字だけをint型...
-
C言語 リスト構造
-
10個の実数に対する降順ソート...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
【Excel VBA】10進数を2進数に...
-
int型(2バイト)データの分割
-
pythonでDBのカラム名で取得し...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
linuxのシェルでファイル名に先...
-
C言語の構造体にてバブルソート...
-
c言語での wavファイルの編集(...
-
'dataType' 引数を Null にする...
-
H8/36064を使ったシリアル通信...
-
オセロゲーム 2次元配列で困...
-
10個の実数に対する降順ソート...
-
c言語の多次元配列で1から100ま...
-
c言語 配列から数字だけをint型...
-
matlabのソースコードをpython...
-
Cのプログラムがどうしても動き...
-
テキストファイルの結合について
おすすめ情報