🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

1542閲覧

構造体を用いたプログラムの結果がすべて0になってしまう

ooba

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/11/25 21:48

編集2020/11/25 21:53

#これを実行するとR10_outがすべてゼロになってしまいます。どうしてでしょうか。
#include <stdio.h>
#include <stdlib.h> //for exit();
#include <string.h>

typedef struct {
int ID[15];
char name[15][25];
double height[15];
double weight[15];
double bmi[15];
}Prog2;

#define N 15

//関数のプロトタイプ宣言
int load_data(Prog2 obj);
int write_data(Prog2 obj);
void calc_bmi(Prog2 obj);
void sort_data(Prog2 obj);

int main(void){
Prog2 stdt1={0};

load_data(stdt1); //ファイルからデータの読み込み

 calc_bmi(stdt1); //BMIの計算

sort_data(stdt1);//BMIの降順に配列要素の並び替え

write_data(stdt1);//データをファイルに出力

return 0;
}
//データのファイルからの読み込み
int load_data(Prog2 obj)
{
FILE *fp; //ファイルポインタ
int i; //カウンタ

//入力ファイルのオープン(読み込みモード)
fp=fopen("R10_in.txt","r");
if(fp==NULL){
printf("Can't open 10_in.txt!\n");
exit(1);
}

//入力ファイルからデータの読み込み
printf("%-8s%-12s%12s%12s\n","ID",
"NAME","HEIGHT[cm]","WEIGHT[kg]");
i=0;
while(fscanf(fp,"%d %s %lf %lf", &obj.ID[i], obj.name[i], &obj.height[i],
&obj.weight[i])!=EOF){
//読み込んだデータ(ID, 名前,身長,体重)の画面出力
printf("%-8d%-12s%12.1f%12.1f\n", obj.ID[i],obj.name[i],obj.height[i],
obj.weight[i]);
i++;
}

fclose(fp); //入力ファイルのクローズ

return 0;
}
//データのファイルへの書き込み
int write_data(Prog2 obj)
{
FILE *fp; //ファイルポインタ
int i; //カウンタ

//出力ファイルのオープン(書き込みモード)
fp=fopen("R10_out.txt","w");
if(fp==NULL){
printf("Can't open R10_out.txt!\n");
exit(1);
}

//出力ファイルへのデータの書き込み
for(i=0;i<N;i++){
fprintf(fp,
"%-8d%-12s%10.1f%10.1f%10.1f\n",obj.ID[i],obj.name[i],obj.height[i],obj.weight[i],obj.bmi[i]);
}

fclose(fp); //入力ファイルのクローズ

return 0;
}
//肥満度の計算
void calc_bmi(Prog2 obj)
{
int i;

for(i=0;i<N;i++){
//BMI値の計算
obj.bmi[i]=obj.weight[i]/((obj.height[i]0.01)(obj.height[i]*0.01));
}

}

void sort_data(Prog2 obj)
{
int i,j, //カウンタ
ti; //ID用一時保存変数
double th,tw,to; //一時保存用変数
char wk[25]; //一時保存用配列

//肥満度の昇順に並び替え
for(i=0;i<N-1;i++){ /* i=0(最初のデータ)からi=N-2まで繰り返す /
for(j=i+1;j<N;j++){ /
j=i+1からj=N-1(最後のデータ)まで繰り返す */
if(obj.bmi[i]<obj.bmi[j]){ //もしbmi[i]<bmi[j]なら
//ID[i]とID[j]の交換
ti=obj.ID[i];
obj.ID[i]=obj.ID[j];
obj.ID[j]=ti;

//height[i]とheight[j]の交換
th=obj.height[i];
obj.height[i]=obj.height[j];
obj.height[j]=th;

//weight[i]とweight[j]の交換
tw=obj.weight[i];
obj.weight[i]=obj.weight[j];
obj.weight[j]=tw;

//bmi[i]とbmi[j]の交換
to=obj.bmi[i];
obj.bmi[i]=obj.bmi[j];
obj.bmi[j]=to;

//name[i]とname[j]の交換
strcpy(wk,obj.name[i]);
strcpy(obj.name[i],obj.name[j]);
strcpy(obj.name[j],wk);
}
}
}
}

#R10_inについて
1001 Aoki 172.8 63.1
1002 Enomoto 167.5 68.9
1003 Fujita 182.6 69.3
1004 Hayashi 178.7 55.7
1005 Ishii 170.1 70.2
1006 Kawai 179.3 83.1
1007 Kubo 169.6 56.4
1008 Murakami 165.2 68.7
1009 Nakajima 187.6 61.0
1010 Nomura 172.0 71.5
1011 Okada 180.8 73.8
1012 Sakamoto 177.4 63.7
1013 Shibata 178.2 67.3
1014 Takeda 172.9 78.1
1015 Wada 170.7 65.4

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

mainのstd1を各関数へ渡す時に、値渡しになっています。
これだと、各関数でobjの内容を変えても呼び出し側のstd1に反映されません。
main側
param = 9;
sub(param);
各関数側
int sub (int p1)
{
P1 = P1 + 100;
return 0;
}
とやっても、main側のparamが変更されないのと同じことです。
load_data(&stdt1);
のようにして、ポインターを渡してください。
以下修正版です。

C

1#include <stdio.h> 2#include <stdlib.h> //for exit(); 3#include <string.h> 4typedef struct { 5 int ID[15]; 6 char name[15][25]; 7 double height[15]; 8 double weight[15]; 9 double bmi[15]; 10} Prog2; 11 12#define N 15 13//関数のプロトタイプ宣言 14int load_data(Prog2 *obj); 15int write_data(Prog2 *obj); 16void calc_bmi(Prog2 *obj); 17void sort_data(Prog2 *obj); 18 19int main(void) 20{ 21 Prog2 stdt1 = { 0 }; 22 23 load_data(&stdt1); //ファイルからデータの読み込み 24 25 calc_bmi(&stdt1); //BMIの計算 26 27 sort_data(&stdt1); //BMIの降順に配列要素の並び替え 28 29 write_data(&stdt1); //データをファイルに出力 30 31 return 0; 32} 33 34//データのファイルからの読み込み 35int load_data(Prog2 *obj) 36{ 37 FILE *fp; //ファイルポインタ 38 int i; //カウンタ 39 40//入力ファイルのオープン(読み込みモード) 41 fp = fopen("R10_in.txt", "r"); 42 if (fp == NULL) { 43 printf("Can't open 10_in.txt!\n"); 44 exit(1); 45 } 46//入力ファイルからデータの読み込み 47 printf("%-8s%-12s%12s%12s\n", "ID", 48 "NAME", "HEIGHT[cm]", "WEIGHT[kg]"); 49 i = 0; 50 while (fscanf 51 (fp, "%d %s %lf %lf", &obj->ID[i], obj->name[i], &obj->height[i], 52 &obj->weight[i]) != EOF) { 53//読み込んだデータ(ID, 名前,身長,体重)の画面出力 54 printf("%-8d%-12s%12.1f%12.1f\n", obj->ID[i], obj->name[i], 55 obj->height[i], obj->weight[i]); 56 i++; 57 } 58 59 fclose(fp); //入力ファイルのクローズ 60 61 return 0; 62} 63 64//データのファイルへの書き込み 65int write_data(Prog2 *obj) 66{ 67 FILE *fp; //ファイルポインタ 68 int i; //カウンタ 69 70//出力ファイルのオープン(書き込みモード) 71 fp = fopen("R10_out.txt", "w"); 72 if (fp == NULL) { 73 printf("Can't open R10_out.txt!\n"); 74 exit(1); 75 } 76//出力ファイルへのデータの書き込み 77 for (i = 0; i < N; i++) { 78 fprintf(fp, 79 "%-8d%-12s%10.1f%10.1f%10.1f\n", obj->ID[i], obj->name[i], 80 obj->height[i], obj->weight[i], obj->bmi[i]); 81 } 82 83 fclose(fp); //入力ファイルのクローズ 84 85 return 0; 86} 87 88//肥満度の計算 89void calc_bmi(Prog2 *obj) 90{ 91 int i; 92 93 for (i = 0; i < N; i++) { 94//BMI値の計算 95 obj->bmi[i] = 96 obj->weight[i] / ((obj->height[i] * 0.01) * 97 (obj->height[i] * 0.01)); 98 } 99 100} 101 102void sort_data(Prog2 *obj) 103{ 104 int i, j, //カウンタ 105 ti; //ID用一時保存変数 106 double th, tw, to; //一時保存用変数 107 char wk[25]; //一時保存用配列 108 109//肥満度の昇順に並び替え 110 for (i = 0; i < N - 1; i++) { /* i=0(最初のデータ)からi=N-2まで繰り返す */ 111 for (j = i + 1; j < N; j++) { /* j=i+1からj=N-1(最後のデータ)まで繰り返す */ 112 if (obj->bmi[i] < obj->bmi[j]) { //もしbmi[i]<bmi[j]なら 113//ID[i]とID[j]の交換 114 ti = obj->ID[i]; 115 obj->ID[i] = obj->ID[j]; 116 obj->ID[j] = ti; 117 118//height[i]とheight[j]の交換 119 th = obj->height[i]; 120 obj->height[i] = obj->height[j]; 121 obj->height[j] = th; 122 123//weight[i]とweight[j]の交換 124 tw = obj->weight[i]; 125 obj->weight[i] = obj->weight[j]; 126 obj->weight[j] = tw; 127 128//bmi[i]とbmi[j]の交換 129 to = obj->bmi[i]; 130 obj->bmi[i] = obj->bmi[j]; 131 obj->bmi[j] = to; 132 133//name[i]とname[j]の交換 134 strcpy(wk, obj->name[i]); 135 strcpy(obj->name[i], obj->name[j]); 136 strcpy(obj->name[j], wk); 137 } 138 } 139 } 140} 141

今後、質問時、ソースを提示するときは、以下のようにしてください。
<code>をクリックすると

‘‘‘ここに言語を入力
コード
‘‘‘
の文字が表示されます。

上記のここに言語を入力のところにCと書き、①のところにソースを貼り付けます。
‘‘‘C

‘‘‘

そうすると、きれいなインデントの形でソースが表示されます。

投稿2020/11/25 22:43

編集2020/11/25 22:50
tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ヘルプのソースコードを書きましょうあたりを参照に質問を読みやすくしてください。

で。あなたがどういう原因を想定してるかを伺いたいところではありますが、先に言ってしまうと

C

1#include <stdio.h> 2int func(int v){ 3 v=100; 4 return -1; 5} 6 7int main(void){ 8 int val=0; 9 func(val); 10 printf("%d\n",val); 11 return 0; 12}

このプログラムで0が表示されるのと同じ原理かと思います。

投稿2020/11/25 22:41

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

main()内のstdt1が全て0なので、出力もそうなるでしょう。
load_dataのobjとmain()のstdt1は別のものであることに注意しましょう。
それぞれでアドレスを表示してみるのもいいんじゃないでしょうかね?

main()から呼ばれている各関数の引数は値渡しなので、stdt1のコピーです。

投稿2020/11/25 22:33

setoppu

総合スコア311

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ooba

2020/11/25 22:44

回答ありがとうございます。 では、main()でのloard_data関数の結果をstdt1に入れる。 次にcalc_bmi関数の結果をstdt1に入れる。 といったような処理を加えればいいということでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問