ユーザー入力を収集する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;
}
'if(menuChoice!= 'Q' || menuChoice!= 'T' || menuChoice!= 'C' || menuChoice!= 'E')'は常に真です。それについてすぐに考えてみてください。 '||'ではなく '&&'が必要であることが分かります。 –
私は知っています。私の質問を読まなかったのですか? "これは明らかにうまくいきません。たとえそれがEでなくてもまだCであれば、それでもエラーメッセージが表示されるからです。 – Moms
@Cool Guyは実際には正しいです。文字が何か他の文字であればエラーを出力したい。つまり、Qではなく、T ANDではない。しかし、Rouxが提供する 'switch'ソリューションはまだまだ良い方法だ。 –