みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

c言語についての質問です。

#include<stdio.h>
int main(void){
double a,b;
int c;
printf("Type two numbers\n");
scanf("%lf",&a);
scanf("%lf",&b);
printf("Select 1)addition, 2) subtraction, 3)multiplication or 4)division\n");
scanf("%d",&c);
switch(c){
case1:
printf("%.6f + %.6f = %.6f",a,b,a+b);
break;
case2:
printf("%.6f - %.6f = %.6f",a,b,a-b);
break;
case3:
printf("%.6f * %.6f = %.6f",a,b,a*b);
break;
case4:
printf("%.6f / %.6f = %.6f",a,b,a/b);
break;
default:
printf("Error! Select 1, 2, 3 or 4\n");
break;
}
return 0;



このプログラムをコンパイルして実行しても
正しく動きません。なぜですか?

投稿日時 - 2013-07-15 15:54:35

QNo.8177393

すぐに回答ほしいです

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

具体的に、どう「正しく動きません」なのですか?
修正する場合に、「どんな風に『正しく動作しない』のか?」が重要な手掛りです。

return 0;の後に、main関数の終了を表わる } が抜けているだけっていうことは無いですよね?


switch ~ case ですが、注意が必要なのは「caseはただのラベル」というものです。
caseもdefaultも無い状態でも、コンパイルは正常終了します。
switch(x) {
printf("ここ") ;
}
というプログラムでも「間違い」では無いのです。
(実行した場合、意図した動作をするかどうかはともかく)

このプログラムだと、その「caseが無い」状態になっています。
その代りに「case1」「case2」「case3」「case4」というラベルが定義されています。ですが、使われていません。


コンパイル時に、警告を増やす設定にしてコンパイルしてください。
gccなら -Wall オプションを付けます。Visual Studioなら警告レベルを高いものにする。
そうすれば、case1,case2,case3,case4が「未使用ラベル」として警告されると思います。

投稿日時 - 2013-07-15 16:18:07

ANo.2

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

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

回答(3)

ANo.3

追記:
#1にあるscanf ですが、 scanf("%lf",&b) であり、 %lf は「空白(改行文字も含む)を読みとばしてから、数を読み込む」ものなので、今回は問題ありません。

投稿日時 - 2013-07-15 16:21:43

ANo.1

scanf("%lf",&a);

ここに問題があります。
入力要求ですが、数字を入れたあと、\n(enter)しますよね。
これが残って次の
scanf("%lf",&b);
で読み取られるのです。

投稿日時 - 2013-07-15 16:08:36

あなたにオススメの質問