![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_13.png?e8efa67)
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で指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
データの値の近いものをグルー...
-
【Excel VBA】10進数を2進数に...
-
10個の実数に対する降順ソート...
-
平滑化フィルタ
-
途中経過も表示するプログラム
-
'dataType' 引数を Null にする...
-
txtファイルを読み込んで表示関...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
stable diffusionのエラー
-
プロシージャ名の変数にカウン...
-
エクセルシート名の制限を変更...
-
UTF-8で5~6バイトになる文字コ...
-
DataGridViewの特定列に入力さ...
-
10Mバイトて文字数に すると何...
-
Excel 1セル当りの文字数が2...
-
VB.NET LeftBの代用
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ポインター引数の関数でコンパ...
-
stable diffusionのエラー
-
printfの%eで指数部分の桁数を...
-
エクセルVBA:日付データの変換...
-
linuxのシェルでファイル名に先...
-
int型(2バイト)データの分割
-
【Excel VBA】10進数を2進数に...
-
C#でのswitch文
-
データの値の近いものをグルー...
-
C言語 ファイル内のデータと入...
-
10個の実数に対する降順ソート...
-
C言語の構造体にてバブルソート...
-
'dataType' 引数を Null にする...
-
matlabのソースコードをpython...
-
C言語の勉強しています。すみま...
-
c言語での wavファイルの編集(...
-
テキストファイルの結合について
-
C言語についてです! 同じ年の...
-
sort関数でひらがなとカタカナ...
-
matlabでのRRI検出
おすすめ情報