2017-03-27 13 views
-3

C(Javaプログラマー)が新しく、なぜこのような状況が発生するのか不明です。Cプログラムのelse節が発生しないときに発生する

私は自動販売機をシミュレートしており、ユーザーはコインとして機能する端末に1つのチャーを入力することになっています。

while(leftOverCost > 0){ 
    printf("Enter coin(nqrd): "); 
    char coin; 
    coin = getchar(); 
    if(coin=='N' || coin=='n'){ 
    printf("Nickle detected.\n"); 
    userTotal += 5; 
    leftOverCost -= 5; 
    printf("\tYou have inserted a total of %d cents.\n", userTotal); 
    if(leftOverCost < 0) break; 
    printf("\tPlease insert %d more cents.\n", leftOverCost); 
    } 
    else if(coin=='D' || coin=='d'){ 
    printf("Dime detected.\n"); 
    userTotal += 10; 
    leftOverCost -= 10; 
    printf("\tYou have inserted a total of %d cents.\n", userTotal); 
    if(leftOverCost < 0) break; 
    printf("\tPlease insert %d more cents.\n", leftOverCost); 
    } 
    else if(coin=='Q' || coin=='q'){ 
    printf("Quarter detected.\n"); 
    leftOverCost -= 25; 
    userTotal += 25; 
    printf("\tYou have inserted a total of %d cents.\n", userTotal); 
    if(leftOverCost < 0) break; 
    printf("\tPlease insert %d more cents.\n", leftOverCost); 
    } 
    else if(coin=='R' || coin=='r'){ 
    printf("bye\n"); 
    break; 
    } 
    else{ 
    printf("Unknown coin."); 
    } 
} 

なぜこのelse節が常に実行されるのですか?私は形式で出力が得られます。ユーザーは自分のコードが認識されない何かを入力すると

You have inserted a total of 25 cents. 
     Please insert 30 more cents. 
Enter coin (nqrd): Unknown coin rejected. 

はそれだけで実行されないでしょうか?これはgetchar()メソッドと関係がありますか?認識されない文字を入れると2回発生します。あなたの文字を入力した後C.

+0

あなたはどのキャラクターをお持ちですか?あなたはEnterまたは何かを打った後にエラーが発生します... – Elalfer

+0

それで、それはcharとしてenterを認識しますか?私は文字列を使って作業する方が良いでしょうか、おそらくユーザ入力を整数として格納しているのでしょうか? (私はJavaを使い始めると高レベルに慣れていたと思います) – AeriaGlorisia

+0

あなたが入力したと思った文字は何ですか? –

答えて

0

標準機能getcharは、空白文字を含むすべての文字を読み取ります。

代わりに関数を使用するscanf

scanf(" %c", coin); 

または

if (scanf(" %c", coin) == 1) 
{ 
    //... 
+0

はまだ良いですが、ユーザーはまだコード内に多くの問題があります。 –

+0

@VladfromMoscosw何を意味するのか分かりませんか?私は何を間違えたのか分かりません。 –

+0

@ narusinあなたが理解しているかどうかはあなたの問題です。それは私を気にしない。 –

0

他には理由「\ nを」または「入力」コマンドを実行しています。

あなたはこのようにそれを解決することができます:

while(leftOverCost > 0) { 
       printf("Enter coin(nqrd): "); 
       char coin; 
       coin = getchar(); 
       if(coin=='N' || coin=='n') { 
         printf("Nickle detected.\n"); 
         userTotal += 5; 
         leftOverCost -= 5; 
         printf("\tYou have inserted a total of %d cents.\n", userTotal); 

         if(leftOverCost < 0) 
           break; 
         printf("\tPlease insert %d more cents.\n", leftOverCost); 
       } 
       else if(coin=='D' || coin=='d') { 
         printf("Dime detected.\n"); 
         userTotal += 10; 
         leftOverCost -= 10; 
         printf("\tYou have inserted a total of %d cents.\n", userTotal); 

         if(leftOverCost < 0) 
           break; 
         printf("\tPlease insert %d more cents.\n", leftOverCost); 

       } 
       else if(coin=='Q' || coin=='q') { 
         printf("Quarter detected.\n"); 
         leftOverCost -= 25; 
         userTotal += 25; 
         printf("\tYou have inserted a total of %d cents.\n", userTotal); 

         if(leftOverCost < 0) 
           break; 
         printf("\tPlease insert %d more cents.\n", leftOverCost); 

       } 
       else if(coin=='R' || coin=='r') { 
         printf("bye\n"); 
         break; 
       } 
      /// IMPORTAN HERE 
       else if(coin == '\n') { 
       ; 
       // means do nothing. This is the naiv solution 
       } 
       else { 
       printf("Unknown coin."); 
} 
} 
0

それは私にいくつかの時間がかかったが、私はあなたの問題への解決策を持っています。あなたのコードの問題はbreakです。私はbreakif/elseの文に入れて少し奇妙なことがわかりました。我々は通常、ループから脱出するためにbreakを使用します。あなたがそれを取り除き、内部のifステートメントを修正すれば、あなたの問題のほとんどを解決するはずです。次の問題はgetchar()でした。あなたのコードで使用するのは良い考えではありませんので、scanfコードを試してください。それはずっと簡単です。また、printfscanfステートメントは、leftOverCostの冒頭に追加されているため、追加しないでください。

コード:

#include <stdio.h> 

main(){ 

    float leftOverCost = 345; //Remove '= 345' and add a printf and scanf statement to set the cost. 
    float userTotal; 
    while(leftOverCost > 0) { 
       printf("Enter coin(nqrd): "); 
       char coin; 
       scanf(" %c", &coin); 
       if(coin=='N' || coin=='n') { 
         printf("Nickle detected.\n"); 
         userTotal += 0.05; 
         leftOverCost -= 0.05; 
         printf("\tYou have inserted a total of %f cents.\n", userTotal); 
         printf("%f", leftOverCost); 

         if(leftOverCost > 0){ 
         printf("\tPlease insert %f more cents.\n", leftOverCost); 
         } 
       } 
       else if(coin=='D' || coin=='d') { 
         printf("Dime detected.\n"); 
         userTotal += 0.10; 
         leftOverCost -= 0.10; 
         printf("\tYou have inserted a total of %f cents.\n", userTotal); 

         if(leftOverCost > 0){ 
         printf("\tPlease insert %f more cents.\n", leftOverCost); 
         } 

       } 
       else if(coin=='Q' || coin=='q') { 
         printf("Quarter detected.\n"); 
         leftOverCost -= 0.25; 
         userTotal += 0.25; 
         printf("\tYou have inserted a total of %f cents.\n", userTotal); 

         if(leftOverCost > 0){ 
         printf("\tPlease insert %f more cents.\n", leftOverCost); 
         } 

       } 
       else if(coin=='R' || coin=='r') { 
         printf("bye\n"); 
       } 
       else { 
       printf("Unknown coin."); 
       } 
} 
} 

P.S、私はお金のようなより多くの小数点を作るために、コードを少しアップ変更しました。四分の一は0.25セントです。あなたは私が意味するものを得る。私はfloatを使って小数点のみを保持しています。また、ifの文を追加して、leftOverCostが0より小さいかどうかを確認します。飲み物を与え、変更を戻します。

関連する問題