2017-04-04 16 views
0

私は自動販売機をシミュレートしようとしています。私のプログラムは、入力された金額を価格としてコマンドラインから受け取り、プログラムが中止されるまでプロンプトを表示し続けます。私は間違っていなければならないことがわかっているwhile-doループを通してこれを達成しようとしています。私はコインの書き込み量を挿入した後でも、コインへの入力を促し続けるプログラムが必要です。 Eが選択されるまで、Cコードが無限のdo-whileループに詰まっています

$ pop 225 
Price must be from 10 to 100 cents 
$ pop 86 
Price must be a multiple of 5. 
$ pop 50 
Welcome to my Vending Machine! 
Pop is 50 cents. Please insert nickels, dimes, or quarters. 

Enter coin [NDQ]:d 
You have inserted a dime 
Please insert 40 more cents. 
Enter coin [NDQ]:d 
You have inserted a dime 
Please insert 30 more cents. 
Enter coin [NDQ]:d 
You have inserted a dime 
Please insert 20 more cents. 
Enter coin [NDQ]:d 
You have inserted a dime 
Please insert 10 more cents. 
Enter coin [NDQ]:d 
You have inserted a dime 
Pop is dispensed. Thank you for you business! Please come again. 
Enter coin [NDQ] 

が終わり、それはコインを入力することができることにまでさかのぼるかを参照してください。コマンドラインを表し - $:

コードが遵守のようになります方法の例は、これがあります出る。私はこれをしようとしているが、私のコードは、N、D、またはQの初期入力時に無限ループに詰まっている。ありがとうございました!あなたの中の状態で

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h> 
#define NI 5 
#define DI 10 
#define QU 25 



bool isValid(int num) { 
    return (num >= 10 && num <= 100); 
} 

bool isMultiple(int num) { 
     return (num % 5 == 0); 
} 

int 
main (int argc, char *argv[]) 
{ for (int i = 1; i != argc; ++i) { 
     int price = atoi(argv[i]); 
     if (!isValid(price)) { 
      printf("Price muse be from 10 cents to 100 cents.\n"); 
      break; 
     } else if (!isMultiple(price)) { 
       printf("Price must be a multiple of 5.\n"); 
       break; 
     } else { 
       printf(" Welcome to my Vending Machine!\n"); 
       printf("Pop is %d cents. Please enter nickels, dimes, or quarters\n", price); 


       char coin; 

       do 
       { 
        printf(" PLease enter a coin [NDQR]\n"); 
        scanf (" %c", &coin); 


         int cents = 0; 

         while (cents <= price) { 


         if (coin == 'N'|| coin == 'n') { 
           cents = cents + NI; 
           printf(" You have inserted 5 cents\n"); 
         } 
         else if (coin == 'd' || coin == 'D') { 
           cents = cents + DI; 
           printf("You have inserted 10 cents\n"); 
         } 
         else if (coin == 'Q' || coin == 'q') { 
           cents = cents + QU; 
           printf("You have entered 25 cents\n"); 


         } else { 
           printf("Unknown coin. Rejected.\n"); 
         } 

         int balance = price - cents; 
         printf("You have entered a total of %d cents\n", cents); 

         if (balance > 0) { 
         printf("You must enter %d more cents\n", balance); 
        } else { 


         int change = cents - price; 
         int dimes = change/10; 
         int remainder = change % 10; 
         int nickles = remainder/5; 
         int remainder2= nickles % 5; 

         printf("Change returned. %d nickles and %d dimes",nickles, dimes); 
        } 

        } 
       } while (coin != 'E' && coin != 'e'); 


       printf("DONE!\n"); 
       return 0; 
} 
} 
} 
+4

'coin!= 'E' ||コイン!=「e」は常に真です。 –

+0

Eを入力するまでループするようにするにはどうすればよいですか? – JVAN

+0

[De Morganの法則](https://en.wikipedia.org/wiki/De_Morgan%27s_laws)をご覧ください – fvu

答えて

2

:それはEの一つまたはeから少なくとも違うので、coin != 'E' || coin != 'e'は、falseすることはできません。あなたはコインのためにユーザに要求し、値を読み取る

あなたが意味coin != 'E' && coin != 'e'、またはその特定のケースではtolower(e)!='e'

+0

...または!(コイン= 'E' ||コイン= 'e') – ThingyWotsit

+0

またはそうです。 "tolower(e)== 'e'' –

0

あなたprintfscanfは各コインを処理し、あなたのwhile (cents <= price)ループの外です。だから、あなたは無限ループに陥ってしまうのです。

開始時に、このループ内でこれらの2行を移動する必要があります。また、外部のdo...whileループも必要ありません。ユーザーが全額を支払った後で、より多くのコインを投入する必要はありません。

  printf(" Welcome to my Vending Machine!\n"); 
      printf("Pop is %d cents. Please enter nickels, dimes, or quarters\n", price); 

      char coin; 
      int cents = 0; 

      while (cents <= price) { 
       printf(" PLease enter a coin [NDQR]\n"); 
       scanf (" %c", &coin); 

       ... 
      } 
      printf("DONE!\n"); 

それは常にtrueと評価されますよう条件(coin != 'E' || coin != 'e')は無効ですが、それは無限ループのソースではありません。前述したように、外側ループはまったく必要ありません。

+0

追加の売り上げの手段として全額を払っても、もっと多くのコインを投入できるようにするプログラムが必要です – JVAN

+0

@JVANこれは' forループを実行し、コマンド行に入力された各価格を繰り返します。 – dbush

+0

はい、そのループは1つの価格を設定します。だから、基本的にマシンには1つのタイプのポップがあり、ユーザーはその1つのポップの価格を設定します。ユーザーが価格を設定してから40セントとすると、プログラムが中止されるまでの価格は常に40セントになります。 – JVAN

関連する問題