2016-03-31 11 views
0

girdiğinde yazdırma bildirimi hatası nasıl verilir Kullanıcı girişlerini toplayan bir süre döngü menüsü var. Bununla birlikte, seçim yapmak için sınırlı sayıda seçenek vardır (bu örnekte 4 ve 6).Kullanıcı geçersiz bir sayının veya harfin C

Menü Bir:

Ben ilk menü kullanıcı girişi eylemi seçmek için harfleri kullanır. Kullanıcının, menüde kullanılmayan harflerden herhangi birini kullanması durumunda geçersiz bir harf girdiklerini belirten bir printf ifadesi almasını istiyorum. Şu anda kullanmak

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); 

Benim şu anki hata kolu olan: örneğin e değil ama yine de C ise bu besbelli çünkü çalışmıyor

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

Bu, aşağıdaki kodu hala hata mesajını çekecektir. Bunu kaldırdığımdan beri.

Benim döngü ancak hiçbir şey yapmaz şu anda bu kullanırken ve hala döngüler C. çalışırken nasıl çok acemi değilim

bu menü için Sorum ben bir baskı yukarı çekiyorsunuz nasıl Bu menü için ifade hatası?

Menü İki: Bir numara sistemi kullanır gibi var

diğer menü biraz daha karmaşıktır. Temelde yukarıdaki menüye benziyor, aksine sadece sayılarla. Ancak daha fazla koşul var. Menü kodu:

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 

Gösterildiği gibi daha fazla koşul var. Hatayı yakalamaya çalışmanın birçok yolunu denedim, ancak koşul karşılanmasa bile program her zaman çökecektir veya yazdırma ifadesini gösterecektir.

!isdigit()'u denedim, ancak bir rakam olsa bile ifadeyi yine de çalar.

Bu hataları nasıl yakalarım?

C'ye oldukça yeni yaşıyorum ve bunların çevrimiçi ortamda sınır kaynakları olduğuna inanıyorum, umarım yardımcı olabilirsiniz.

içerir:

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

Hesaplamalar:

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; 
} 

Ana: Bu yeterli bilgi değilse İşte

peşin

teşekkürler yazdım bütün kodudur

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')' her zaman doğru olacaktır. Bir an için düşün. İhtiyacınız olan şey olduğunu anlayacaksınız. –

+0

Biliyorum. Sorumu okumadın mı? “Açıkçası işe yaramıyor çünkü eğer örneğin E olmasa da yine de C hala hata mesajını çekecek. Bunu kaldırdım.” – Moms

+1

@Cool Guy aslında haklıdır. Eğer karakter başka bir şey varsa o zaman bir hata yazdırmak istersiniz. Bu, eğer Q VEYA T VE DEĞİL ise ... Ama Roux tarafından sağlanan 'switch' çözümü hala daha iyidir. –

cevap

2

dışında herhangi bir şey için "gerçek" olmalıdır: İşte bir örnek aşağıda:

bool readAndValidateInput(int* input, int min, int max) { 
fseek(stdin, 0, SEEK_END); 
if (scanf(" %d", input) != 1) { 
    fprintf(stderr, "Invalid input.\n"); 
    return false; 
} 

if (min == 0 && max == 0) 
    return true; 

if (*input < min || *input > max) { 
    fprintf(stderr, "Input not in range.\n"); 
    return false; 
} 

return true; } 

İlk parametre giriş değeri, ikinci ve üçüncü parametre girişi kontrol edilecek aralığı, depolanacak işaretçidir. , aralık kontrolü yapmak istemiyorsanız 0 ila maks.

ve bir alt ile kullanabilirsiniz do-while kodunuzda döngü bu şekilde:

 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-ederken geçerli bir girdi olana kadar döngüler çalıştırmak ve yeni giriş için istemi kullanıcı olacak, aynı şekilde Girişlerin sıfırlanmasını onaylayabilirsiniz.

NOT: Çok dosyanıza # ekleme < stdbool> başlığı ekleyin.

Ayrıca SCANF (...) ve bu Link anlamındaki dönüş değeri hakkında okuma yapmanız da gerekebilir.

Ayrıca, Menü Birimi seçimleri için anahtar deyimini kullanmak için Roux yazısını düşünmelisiniz.

+0

Vay. Çok teşekkür ederim. Gerçekten iyi uygulanması ve çalışması kolaydır. ';' Gibi bazı sözdizimi hataları vardı. ama başka o zaman. fantastik. – Moms

1

swich ifadesini kullanın, belki? "Menü seçimi" nin belirli değerleri için eylemler seçmenize ve "tüm diğer değerler" için bir eyleme izin verir.

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

Alternatif if(menuChoice != 'Q' && menuChoice != 'T' && menuChoice != 'C' && menuChoice != 'E') seni olsaydı ben benim küçük işlevini kullanarak Menü İki için scanf giriş doğrulamak olabilir Q, T, C ve E

+0

Kullanıcı birden fazla karakter yazıyorsa ne olacağını düşünmelisiniz. Örneğin, "QT". Ne olmalı? Mevcut kodlar bunu "Q" cevabı olarak kabul ederdi. – FredK