2016-03-31 1 views
0

ユーザー入力を収集するwhileループメニューシステムがあります。しかし、選択肢が限られていることは明らかです(この例では4と6です)。ユーザーがCで無効な数字または文字を入力したときにprintステートメントエラーを出す方法

メニューワン:

私が持っている最初のメニューは、ユーザーの入力がアクションを選択するための文字を使用しています。メニューに使用されていない文字を使用した場合、無効な文字を入力したというprintfステートメントを取得します。これは、以下のコードです:私は、現時点で使用

printf("\n\nOption | Action\n"); 
    printf("  Q | Quit\n"); 
    printf("  T | Loan Table\n"); 
    printf("  C | Calculate Loan\n"); 
    printf("  E | Explanation\n"); 
    printf("Select Option: "); 
    fseek(stdin, 0, SEEK_END); 
    scanf("%c", &menuChoice); 
    menuChoice = toupper(menuChoice); 

私の現在のエラー・ハンドルがある:

if(menuChoice != 'Q' || menuChoice != 'T' || menuChoice != 'C' || menuChoice != 'E') 
    { 
    printf("Error! Choose a valid menu option.");   
    } 

それは例えばEではないが、それでもCである場合、これは明らかに理由は動作しません。それでもエラーメッセージが表示されます。私はそれ以来これを削除しました。ループは、現時点ではこれを使用しながら

私は、しかし、それは何もしていないと私はまだループはC.

で作業しながら、このメニューのための私の質問は、私は印刷をプルアップはどうすればよいですかに非常に初心者ですこのメニューのステートメントエラー?

メニュー2:

私が持っている他のメニューは、それが数システムを使用すると、もう少し複雑です。基本的には上記のメニューに似ていますが、数字だけで表示されます。しかし、より多くの条件があります。メニューコード:

printf("\nYou selected option C.\n"); 
     printf("\nLoan Calculator\n"); 
     printf("Option | Plan\n"); 
     printf("  1 | LF1\n"); 
     printf("  2 | LF2\n"); 
     printf("  3 | BBPL\n"); 
     printf("  4 | ILZERO\n"); 
     printf("  5 | ILFIVE\n"); 
     printf("  6 | LS5\n"); 
     printf("Select Plan: "); 
     fseek(stdin, 0, SEEK_END); 
     scanf("%d", &planCode); 
     //CHECK IF IT IS A NUMBER BETWEEN 1 AND 6 
     printf("Cost of car: "); 
     fseek(stdin, 0, SEEK_END); 
     scanf("%d", &carCost); 
     //CHECK IF IT IS A NUMBER 
     printf("Deposit: "); 
     fseek(stdin, 0, SEEK_END); 
     scanf("%d", &deposit); 
     //CHECK IF IT IS A NUMBER 
     printf("Length of Loan (years): "); 
     fseek(stdin, 0, SEEK_END); 
     scanf("%d", &loanLength); 
     //CHECK IF IT IS A NUMBER AND IS BETWEEN 1 AND 10 

示されているように、より多くの条件があります。私はエラーをキャッチしようと多くの方法を試みたが、プログラムが常にクラッシュするか、条件が満たされなくてもprintステートメントが表示される。

私は!isdigit()を試しましたが、数字であってもそれを再生します。

どのようにこれらのエラーをキャッチしますか?

私はC言語ではかなり新しく、C言語の制限元がありますので、お手伝いをしてください。

が含まれています::

#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 
#include <math.h> 

計算:

double calcPayment(double loanAnnualRate, double loan, int length) 
{ 
    double retv; 
    int payments; 
    double mul; 
    double rate; 
    rate = loanAnnualRate/12; 
    payments = length * 12; 
    mul = pow(1 + rate, payments); 
    retv = (loan * mul * rate)/(mul - 1); 
    return retv; 
} 

メイン:これは十分な情報がない場合はここで

事前

でのおかげで、私が書いたコード全体で

int main() 
{ 
    char menuChoice; 
    int planCode; 
    int carCost, deposit, loanLength; 
    double loanInitial; 
    double loanPayments; 
    double IALSpecialRate; 
    double fee; 
    do 
    { 
     printf("\n\nOption | Action\n"); 
     printf("  Q | Quit\n"); 
     printf("  T | Loan Table\n"); 
     printf("  C | Calculate Loan\n"); 
     printf("  E | Explanation\n"); 
     printf("Select Option: "); 
     fseek(stdin, 0, SEEK_END); 
     scanf("%c", &menuChoice); 
     menuChoice = toupper(menuChoice); 

     if (menuChoice == 'T') 
     { 
      printf("\nYou selected option T.\n"); 
      printf("\nVendor Loan Details List\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| | Loan Vendor | Loan Product Code | Initial Fee | Monthly Fee | Interest Rate % | Max. Loan Amount | Min. Loan Amount |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 1 | Leaf-Friend | LF1    | $150  | $0   | 6.14%%   | $70,000   | $5,000   |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 2 | Leaf-Friend | LF2    | $155  | $0   | 6.24%%   | $70,000   | $1,000   |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 3 | Big Bank | BBPL    | $150  | $0   | 6.30%%   | $80,000   | $5,000   |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 4 | ITSALOAN | ILZERO   | $149  | $0   | 7.10%%*  | $50,000   | $1,000   |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 5 | ITSALOAN | ILFIVE   | $140  | $5   | 7.10%%*  | $50,000   | $1,000   |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("| 6 | Loan Sheep | LS5    | $349  | $0   | 5.91%%   | $50,000   | $500    |\n"); 
      printf("+-----------------------------------------------------------------------------------------------------------------------+\n"); 
      printf("NOTE*: ITSALOAN has a special promotion on at the moment for any loan above $20000 the interest rate drops to 6.1%"); 
     } 
     if (menuChoice == 'C') 
     { 
      printf("\nYou selected option C.\n"); 
      printf("\nLoan Calculator\n"); 
      printf("Option | Plan\n"); 
      printf("  1 | LF1\n"); 
      printf("  2 | LF2\n"); 
      printf("  3 | BBPL\n"); 
      printf("  4 | ILZERO\n"); 
      printf("  5 | ILFIVE\n"); 
      printf("  6 | LS5\n"); 
      printf("Select Plan: "); 
      fseek(stdin, 0, SEEK_END); 
      scanf("%d", &planCode); 
      //CHECK IF IT IS A NUMBER BETWEEN 1 AND 6 
      printf("Cost of car: "); 
      fseek(stdin, 0, SEEK_END); 
      scanf("%d", &carCost); 
      //CHECK IF IT IS A NUMBER 
      printf("Deposit: "); 
      fseek(stdin, 0, SEEK_END); 
      scanf("%d", &deposit); 
      //CHECK IF IT IS A NUMBER 
      printf("Length of Loan (years): "); 
      fseek(stdin, 0, SEEK_END); 
      scanf("%d", &loanLength); 
     //CHECK IF IT IS A NUMBER AND IS BETWEEN 1 AND 10 
     if (planCode == 1) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 5000.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with LF1.\nTry either LF2, ILZERO or ILFIVE.\n"); 
      } 
      if (loanInitial > 70000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with LF1.\nTry BBPL.\n"); 
      } 
      if (loanInitial >= 5000.00 && loanInitial <= 70000.00) 
      { 
       loanPayments = calcPayment(0.0614, loanInitial, loanLength); 
       fee = 150; 

       printf("Loan Size     : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial); 
      } 
     } 
     if (planCode == 2) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 5000.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with LF2.\nTry LS5\n"); 
      } 
      if (loanInitial > 70000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with LF2.\nTry BBPL.\n"); 
      } 
      if (loanInitial >= 1000.00 && loanInitial <= 70000.00) 
      { 
       loanPayments = calcPayment(0.0624, loanInitial, loanLength); 
       fee = 155; 

       printf("Loan Size      : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial); 
      } 
     } 
     if (planCode == 3) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 5000.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with BBPL.\nTry either LF2, ILZERO or ILFIVE.\n"); 
      } 
      if (loanInitial > 80000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with BBPL.\nTry a cheaper car below $80,000.\n"); 
      } 
      if (loanInitial >= 5000.00 && loanInitial <= 80000.00) 
      { 
       loanPayments = calcPayment(0.063, loanInitial, loanLength); 
       fee = 150; 

       printf("Loan Size     : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial); 
      } 
     } 
     if (planCode == 4) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 1000.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with ILFIVE.\nTry LS5.\n"); 
      } 
      if (loanInitial > 50000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with ILFIVE.\nTry either LF1, LF2, BBPL or LS5.\n"); 
      } 
      if (loanInitial >= 1000.00 && loanInitial <= 50000.00) 
      { 
       if (loanInitial >= 20000) { IALSpecialRate = 0.061; } 
       else IALSpecialRate = 0.071; 
       loanPayments = calcPayment(IALSpecialRate, loanInitial, loanLength); 
       fee = 149; 

       printf("Loan Size     : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial); 
      } 
     } 
     if (planCode == 5) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 1000.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with ILFIVE.\nTry LS5.\n"); 
      } 
      if (loanInitial > 50000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with ILFIVE.\nTry either LF1, LF2, BBPL or LS5.\n"); 
      } 
      if (loanInitial >= 1000.00 && loanInitial <= 50000.00) 
      { 

       if (loanInitial >= 20000) { IALSpecialRate = 0.061; } 
       else IALSpecialRate = 0.071; 

       loanPayments = calcPayment(IALSpecialRate, loanInitial, loanLength); 
       loanPayments = calcPayment(0.071, loanInitial, loanLength); 
       fee = 40; 

       printf("Loan Size     : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee + (60 * loanLength)); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments + 5); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12 + 60); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial + (60 * loanLength)); 
      } 
     } 
     if (planCode == 6) 
     { 
      loanInitial = carCost - deposit; 

      if (loanInitial < 500.00) 
      { 
       printf("\nSorry! Your loan is too low to be used with LS5.\n"); 
      } 
      if (loanInitial > 55000.00) 
      { 
       printf("\nSorry! Youe loan is too high to be used with LS5.\nTry either LF1, Lf2 or BBPL.\n"); 
      } 
      if (loanInitial >= 500.00 && loanInitial <= 55000.00) 
      { 
       loanPayments = calcPayment(0.0591, loanInitial, loanLength); 
       fee = 349; 

       printf("Loan Size     : $ %8.2lf", loanInitial); 
       printf("\nTotal Repayment    : $ %8.2lf", loanPayments * 12 * loanLength + fee); 
       printf("\nMonthly Repayments   : $ %8.2lf", loanPayments); 
       printf("\nAnnual Repayment(s)   : $ %8.2lf", loanPayments * 12); 
       printf("\nTotal Repayment Without Fees : $ %8.2lf", loanPayments * 12 * loanLength); 
       printf("\nTotal Fees     : $ %8.2lf", fee); 
       printf("\nActual Loan Cost    : $ %8.2lf", loanPayments * 12 * loanLength + fee - loanInitial); 
      } 
     } 
    } 
    if (menuChoice == 'E') { printf("\nYou selected option E.\n"); } 
    if (menuChoice == 'Q') 
    { 
     printf("\nExiting Program...\n"); 
     exit(0); 
    } 
} while (menuChoice != 'Q' || menuChoice != 'T' || menuChoice != 'C' || menuChoice != 'E'); 
printf("\nPlease Choose a valid option.\n"); 

_getch; 
return 0; 

}

+3

'if(menuChoice!= 'Q' || menuChoice!= 'T' || menuChoice!= 'C' || menuChoice!= 'E')'は常に真です。それについてすぐに考えてみてください。 '||'ではなく '&&'が必要であることが分かります。 –

+0

私は知っています。私の質問を読まなかったのですか? "これは明らかにうまくいきません。たとえそれがEでなくてもまだCであれば、それでもエラーメッセージが表示されるからです。 – Moms

+1

@Cool Guyは実際には正しいです。文字が何か他の文字であればエラーを出力したい。つまり、Qではなく、T ANDではない。しかし、Rouxが提供する 'switch'ソリューションはまだまだ良い方法だ。 –

答えて

2

私があなただったら、私は私の小さな機能を使用してメニュー二つためのscanf関数の入力を検証することができます

最初のパラメータは、入力値が格納されるポインタです.2番目と3番目のパラメータは、入力がチェックされる範囲です。 範囲チェックを行わない場合は、0〜minとmaxを指定できます。

、あなたがサブ行う-ながら、あなたのコード内のループこの方法でそれを使用することができます。

 do { 
      printf("Select Plan: "); 
      //CHECK IF IT IS A NUMBER BETWEEN 1 AND 6 
     } while (!readAndValidateInput(&planCode, 1, 6)) 

     do { 
      printf("Cost of car: "); 
      // supply 0 for min and max to omit range validation 
     } while(!readAndValidateInput(&carCost, 0, 0)); 

がdo-ものの、それは有効な入力になるまでループは、新しい入力用 同じ方法を実行し、プロンプトユーザーになります入力のリセットを検証できます。

注:あまりにもあなたのファイルでの#include < stdbool>ヘッダを追加します。

また、LinkからのSCANF(...)とその戻り値の意味について読む必要があります。

そして、メニュー文の選択にswitch文を使用するには、Roux postを考慮する必要があります。

+0

うわー。どうもありがとうございます。実装が簡単で、実際にうまく機能します。失われた ';'のような構文エラーがありました。しかしそれ以外は。素晴らしい。 – Moms

1

お試しswich声明、多分?それはあなたが "メニュー選択"の特定の値のためのアクションを選択し、 "すべての他の値"のアクションを選択することができます。ここでは例です:

switch (menuChoice) 
{ 
    case 'Q': 
    do_whatever_q_does(); 
    break; 
    case 'E': 
    do_whatever_e_does(); 
    break; 
    (and so on) 
    default : 
    throw_error_message(); 
} 

また、if(menuChoice != 'Q' && menuChoice != 'T' && menuChoice != 'C' && menuChoice != 'E')が「真」でなければなりません何のためにQ、T、C及びE以外

+0

ユーザーが複数の文字を入力するとどうなるか考えてください。たとえば、「QT」です。何が起こるはずですか?現在のコードはこれを回答「Q」として受け入れます。 – FredK

関連する問題