こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語のswitch文について間違っているところを教えてください

初めに初心者ですので間違っているところは説明つきの回答をしていただければありがたいです。
今回switch文を使って 「足し算、引き算、掛け算、割り算」のプログラムを作ったつもりなのですが、intを使うと割り算の小数点が出ないしfioat文を使うとswitch文には、使えないと出るしどのようにしたら良いのか御回答よろしくお願いします。
(今は、int文でプログラムを作っているつもりです。)
#include <stdio.h>
void main (void)
{
int a,b,k;
printf("どのような計算をしたいか数字を選んでください。\n");
printf(" 1.足し算 (例 a+b)\n");
printf(" 2.引き算 (例 aーb)\n");
printf(" 3.掛け算 (例 a×b)\n");
printf(" 4.割り算 (例 a÷b)\n");
printf("計算したい番号を入力してください ");
scanf("%d",&k);
switch (k){
case 1:
printf("aを入力してください ");
scanf("%d",&a);
printf("bを入力してください ");
scanf("%d",&b);
printf("\n答えは a+b で %d です\n",a+b);
break;
case 2:
printf("aを入力してください ");
scanf("%d",&a);
printf("bを入力してください ");
scanf("%d",&b);
printf("\n答えは aーb で %d です\n",a-b);
break;
case 3:
printf("aを入力してください ");
scanf("%d",&a);
printf("bを入力してください ");
scanf("%d",&b);
printf("\n答えは a×b で %d です\n",a*b);
break;
case 4:
printf("aを入力してください ");
scanf("%d",&a);
printf("bを入力してください ");
scanf("%d",&b);
printf("\n答えは a÷b で %d です\n",a/b);
break;
default:
printf("明記してあるどれかの数字を再入力してください");
}
}

投稿日時 - 2005-11-23 21:19:52

QNo.1797380

すぐに回答ほしいです

質問者が選んだベストアンサー

補足ですが、このプログラムはもう少し短くすることができます。

#include <stdio.h>
void main (void)
{
float a,b;
int k;
printf("どのような計算をしたいか数字を選んでください。\n");
printf(" 1.足し算 (例 a+b)\n");
printf(" 2.引き算 (例 aーb)\n");
printf(" 3.掛け算 (例 a×b)\n");
printf(" 4.割り算 (例 a÷b)\n");
printf("計算したい番号を入力してください ");
scanf("%d",&k);

printf("aを入力してください ");
scanf("%f",&a);
printf("bを入力してください ");
scanf("%f",&b);
switch(k){
case 1:
printf("\n答えは a+b で %d です\n",a+b);
break;
case 2:
printf("\n答えは a-b で %d です\n",a-b);
break;
case 3:
printf("\n答えは a*b で %d です\n",a*b);
break;
case 4:
printf("\n答えは a/b で %d です\n",a/b);
break;
}
}

投稿日時 - 2005-11-24 17:45:19

お礼

補足ありがとうございます。
a,bの位置を変えるだけでかなり少なくてすむようになるのですね。私には、そのようなすばらしいひらめきは、起こりませんでした。とても勉強になりました。
ありがとうございました。

投稿日時 - 2005-11-24 23:34:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

#3 です。
>もしこの文を使うとしたらどのようにすれば良いか
>教えていただけないでしょうか?

自分で調べろよと言いたいけど答えちゃうよ。
/* 4通りの場合わけをするのであった */
もし(場合1)なら、{
 処理1しちゃうよ;
}そうでなくて、もし(場合2)なら{
 処理2しちゃうよ;
}そうでなくて、もし(場合3)なら{
 処理3しちゃうよ;
}それ以外は{
処理4しちゃうよ;

という感じであるのであった。
つまり、
if (P1) {
A1
} else if (P2) {
A2
} else if (P3) {
A3
} else {
A4
}

というか、言いたいのは、swich case のような変なものをわざわざ使わなくてもいいのではないの、ということ。

投稿日時 - 2005-11-25 01:34:51

お礼

回答ありがとうございます。
なぜswich case を使ったかと言いますと、ifの場合elseを使わないといけないとまで考えて実際に作ってみたのですが、出来なかったので違うものを使ってみようと言うことでこれにしたしだいです。

投稿日時 - 2005-11-25 17:09:38

ANo.4

a,bとkはこのプログラムでは意味が違うので、別に宣言しましょう。

int a,b,k;
↓こうする
int a,b;
int k;

これならkをintのままにしてa,bをほかの型にできますね。

投稿日時 - 2005-11-24 16:13:36

お礼

回答ありがとうございます。
一つにしても分けても結局同じことになるのですね。
勉強になりました。
ありがとうございました。

投稿日時 - 2005-11-24 23:32:52

switch ... case 文を使わないで、if ... else if ... else 文を使った方が良いのではないでしょうか。

投稿日時 - 2005-11-23 23:15:43

お礼

回答ありがとうございます。
if ... else if ... else

もしこの文を使うとしたらどのようにすれば良いか教えていただけないでしょうか?

投稿日時 - 2005-11-24 23:31:09

ANo.2

割り算部分以外に影響を及ぼしたくないのであれば、aかbをdouble(又はfloat)へキャストし、書式もそれに合わせます。

printf("\n答えは a÷b で %f です\n", (double) a/b);

投稿日時 - 2005-11-23 22:52:40

お礼

回答ありがとうございます。
そのような方法もあったのですか。
ぜひ試してみたいと思います。
ありがとうございました。

投稿日時 - 2005-11-24 23:29:18

ANo.1

intはkだけにして、aとbはdoubleかfloatで宣言しましょう。

scanf,printfの%dを直すのを忘れないように。

投稿日時 - 2005-11-23 21:31:34

お礼

ありがとうございました。
やってみると出来ました。もしlong doubleを入れたら
「scanf,printfの %?」 のところを教えてください。

投稿日時 - 2005-11-23 22:42:03