宿題でデータを入力して分布や平均を求めるプログラムで、
デバックをすると 'error C2050: switch 式の結果は、整数値になりませんでした。'
と、出てきます。解決方法があれば教えてください。
プログラムソース
------------------------------------------------
#include <stdio.h>
struct person{
int age;
float hyde;
char name[20],blood[20];
};
main()
{
struct person human[20];
int i,w,x,y,z;
float heikin1, heikin2,goukei1,goukei2;
w = 0; x = 0; y = 0; z = 0;
for(i=0;i<8;++i){
printf("名前を入力してください\n");
scanf("%s",human.name);
printf("年齢を入力してください\n");
scanf("%d",&human.age);
printf("身長を入力してください\n");
scanf("%f",&human.hyde);
printf("血液型を入力してください\n");
scanf("%s",human.blood);
switch(human.blood)
{
case 'a':
case 'A':
w += 1;
break;
case 'b':
case 'B':
x += 1;
break;
case 'c':
case 'C':
y += 1;
break;
case 'ab':
case 'AB':
z += 1;
break;
default:
printf("?\n");
}
}
for (i=0;i<8;++i){
goukei1 += human.age;
}
for (i=0;i<8;++i){
goukei2 += human.hyde;
}
heikin1 = goukei1 / 8 ;
heikin2 = goukei2 / 8 ;
for(i=0;i<8;++i){
printf("氏名 %s 年齢 %d 体重 %f\n 血液型 %s",human.name,human.age,human.hyde,human[i].blood);
}
printf("平均年齢は%fで平均身長は%fです。\n",heikin1,heikin2);
}
文字入力に関して
Re: 文字入力に関して
デバッグ(デバックではない)という用語は、通常、「コンパイル~ビルドは通ったがmiyabi さんが書きました: デバックをすると 'error C2050: switch 式の結果は、整数値になりませんでした。'
思ったとおりに動かない(つまりバグがある)」プログラムからバグを取り除く作業のことをいいます。
今の質問者さんの状態は、コンパイルが通っていないわけですから、デバッグには至っていません。
さて、
hydeって何ですか?heightならば、身長を表わす変数名として妥当であると思いますが。
blood[20]って、20も必要ですか?せいぜいAB型が格納できればいいのですから、
終端の'\0'を含めてblood[3]で十分だと思います。
20人分のデータを格納したいのですね。ところが、後の方のループでは8人分しか格納しようとしていません。
どうしたいんでしょうか。
w, x, y, zの使い道は何ですか?血液型によってインクリメントしてるようですが、
その後で使っている形跡がありません。使わない変数だったら、定義しなくていいのではないでしょうか。
ここが本題ですね。
switch文の条件として使えるのは整数型です。
human.bloodの型はchar *ですから、使えません。
strcmp関数を使いましょう。
ゼロに初期化していない変数に足し込んではいけません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 文字入力に関して
コードはcodeタグで囲んでください。
switchには文字列は使えないので、ifで地道に判定するしかないですね。
string.hをインクルードして
switchには文字列は使えないので、ifで地道に判定するしかないですね。
string.hをインクルードして
if(strcmp(human[i].blood,"a")==0 || strcmp(human[i].blood,"A")==0) {
w += 1;
else if(strcmp(human[i].blood,"b")==0 || strcmp(human[i].blood,"B")==0) {
x += 1;
else if(strcmp(human[i].blood,"c")==0 || strcmp(human[i].blood,"C")==0) {
y += 1;
else if(strcmp(human[i].blood,"ab")==0 || strcmp(human[i].blood,"AB")==0) {
z += 1;
else {
printf("?\n");
}オフトピック
血液型のC型って何だろう?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 文字入力に関して
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
-
かずま
Re: 文字入力に関して
blood を int に変換するという手もあるのでは。みけCAT さんが書きました:switchには文字列は使えないので、ifで地道に判定するしかないですね。
'AB' の値は処理系定義ですが、VC++ と gcc ではこれでよいみたいです。
#include <stdio.h>
#define MAX_HUMAN 8
int C(const char *t)
{
int v = *t;
while (*++t) v = v<< 8 | *t;
return v;
}
struct person {
int age;
float hyde;
char name[20], blood[20];
};
int main(void)
{
struct person human[MAX_HUMAN];
int i, w, x, y, z;
float heikin1, heikin2, goukei1, goukei2;
w = x = y = z = 0;
for (i = 0; i < MAX_HUMAN; ++i) {
printf("名前を入力してください\n");
scanf("%s", human[i].name);
printf("年齢を入力してください\n");
scanf("%d", &human[i].age);
printf("身長を入力してください\n");
scanf("%f", &human[i].hyde);
printf("血液型を入力してください\n");
scanf("%s", human[i].blood);
switch (C(human[i].blood)) {
case 'a': case 'A': w++; break;
case 'b': case 'B': x++; break;
case 'o': case 'O': y++; break;
case 'ab': case 'AB': z++; break;
default: printf("?\n");
}
}
goukei1 = goukei2 = 0;
for (i = 0; i < MAX_HUMAN; ++i) goukei1 += human[i].age;
for (i = 0; i < MAX_HUMAN; ++i) goukei2 += human[i].hyde;
heikin1 = goukei1 / MAX_HUMAN;
heikin2 = goukei2 / MAX_HUMAN;
for (i = 0; i < MAX_HUMAN; ++i)
printf("氏名 %-10s 年齢 %3d 体重 %5.1f 血液型 %-2s\n",
human[i].name, human[i].age, human[i].hyde, human[i].blood);
printf("平均年齢は%5.1fで平均身長は%5.1fです。\n", heikin1, heikin2);
printf("A: %d B: %d O: %d AB: %d\n", w, x, y, z);
return 0;
}