• ベストアンサー

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("明記してあるどれかの数字を再入力してください"); } }

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

  • ベストアンサー
  • naoya0302
  • ベストアンサー率39% (13/33)
回答No.5

補足ですが、このプログラムはもう少し短くすることができます。 #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; } }

panoda
質問者

お礼

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

その他の回答 (5)

回答No.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 のような変なものをわざわざ使わなくてもいいのではないの、ということ。

panoda
質問者

お礼

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

  • rentahero
  • ベストアンサー率53% (182/342)
回答No.4

a,bとkはこのプログラムでは意味が違うので、別に宣言しましょう。 int a,b,k; ↓こうする int a,b; int k; これならkをintのままにしてa,bをほかの型にできますね。

panoda
質問者

お礼

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

回答No.3

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

panoda
質問者

お礼

回答ありがとうございます。 if ... else if ... else もしこの文を使うとしたらどのようにすれば良いか教えていただけないでしょうか?

  • tamaruy
  • ベストアンサー率0% (0/1)
回答No.2

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

panoda
質問者

お礼

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

  • ballville
  • ベストアンサー率47% (233/487)
回答No.1

intはkだけにして、aとbはdoubleかfloatで宣言しましょう。 scanf,printfの%dを直すのを忘れないように。

panoda
質問者

お礼

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

関連するQ&A

専門家に質問してみよう