文字入力に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
miyabi

文字入力に関して

#1

投稿記事 by miyabi » 13年前

宿題でデータを入力して分布や平均を求めるプログラムで、
デバックをすると '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);
}

box
記事: 2002
登録日時: 15年前

Re: 文字入力に関して

#2

投稿記事 by box » 13年前

miyabi さんが書きました: デバックをすると 'error C2050: switch 式の結果は、整数値になりませんでした。'
デバッグ(デバックではない)という用語は、通常、「コンパイル~ビルドは通ったが
思ったとおりに動かない(つまりバグがある)」プログラムからバグを取り除く作業のことをいいます。
今の質問者さんの状態は、コンパイルが通っていないわけですから、デバッグには至っていません。
さて、
miyabi さんが書きました:

コード:

    float            hyde;
hydeって何ですか?heightならば、身長を表わす変数名として妥当であると思いますが。
miyabi さんが書きました:

コード:

    char             name[20],blood[20];
blood[20]って、20も必要ですか?せいぜいAB型が格納できればいいのですから、
終端の'\0'を含めてblood[3]で十分だと思います。
miyabi さんが書きました:

コード:

    struct person human[20];
20人分のデータを格納したいのですね。ところが、後の方のループでは8人分しか格納しようとしていません。
どうしたいんでしょうか。
miyabi さんが書きました:

コード:

    int	i,w,x,y,z;
w, x, y, zの使い道は何ですか?血液型によってインクリメントしてるようですが、
その後で使っている形跡がありません。使わない変数だったら、定義しなくていいのではないでしょうか。
miyabi さんが書きました:

コード:

		switch(human[i].blood)
ここが本題ですね。
switch文の条件として使えるのは整数型です。
human.bloodの型はchar *ですから、使えません。
strcmp関数を使いましょう。

miyabi さんが書きました:

コード:

			goukei1 += human[i].age;
			goukei2 += human[i].hyde;
ゼロに初期化していない変数に足し込んではいけません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 文字入力に関して

#3

投稿記事 by みけCAT » 13年前

コードはcodeタグで囲んでください。
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で殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: 文字入力に関して

#4

投稿記事 by box » 13年前

miyabi さんが書きました:

コード:

	case 'c':
	case 'C':
これは気づかなかったなぁ。C型っていう血液型が発見されたのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

miyabi

Re: 文字入力に関して

#5

投稿記事 by miyabi » 13年前

Boxさん みけcatさんありがとうございました
血液型CはOのミスです。

box
記事: 2002
登録日時: 15年前

Re: 文字入力に関して

#6

投稿記事 by box » 13年前

それで、私が僭越ながら指摘したいくつかの事項についてはどうですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

かずま

Re: 文字入力に関して

#7

投稿記事 by かずま » 13年前

みけCAT さんが書きました:switchには文字列は使えないので、ifで地道に判定するしかないですね。
blood を int に変換するという手もあるのでは。
'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;
}

閉鎖

“C言語何でも質問掲示板” へ戻る