2016-11-15 4 views
0
#include<stdio.h> 


void clearKeyboard(void){ 
    while(getchar()!='\n'); 
} 


void pause(void){ 
    printf("Press <ENTER> to continue..."); 
    clearKeyboard(); 
} 


void printWelcome(void){ 
    printf ("---=== Grocery Inventory System ===---\n\n"); 
} 



int getInt(void){ 
    int iVal; 
    char charCheck='x'; 
    while (charCheck != '\n'){ 
      scanf ("%d%c",&iVal,&charCheck); 
      if (charCheck != '\n'){ 
        clearKeyboard(); 
        printf ("Invalid integer, please try again: "); 
      } 
    } 
    return iVal; 
} 


int getYesOrNo(void){ 

    //list of variables declared and initialized 
    char ch; 
    int ret; 
    ch = 0; 
    ret = 0; 

    //it will keep asking the user as long as they don't reply with y or n 
    while(ch != 'Y' || ch != 'y' || ch != 'N' || ch != 'n') 
    { 
      scanf(" %c", &ch); 
      clearKeyboard(); 

      if (ch == 'Y' || ch == 'y'){ 

        ret = 1; 
        return ret; 

      } 
      else if (ch == 'N' || ch == 'n'){ 
        ret = 0; 
        return ret; 
      } 
      //if they type other than y or n, it will print out this message 
      else{ 
        printf("Only (Y)es or (N)o are acceptable: "); 
      } 
    } 
    return ret; 


} 




int getIntLimited(int lowerLimit, int upperLimit){ 
    int iVal; 
    do{ 
      iVal = getInt(); 
      if (!(iVal >= lowerLimit && iVal <= upperLimit)) 
        printf ("Invalid value, 0 <= value <= 7: "); 
      }while (!(iVal >= lowerLimit && iVal <=upperLimit)); 
    return iVal; 
} 




int getMenuChoice(void){ 

    int SEL; 
    int temp; 
    printf("1- List all items\n"); 
    printf("2- Search by SKU\n"); 
    printf("3- Checkout an item\n"); 
    printf("4- Stock an item\n"); 
    printf("5- Add new item or update item\n"); 
    printf("6- delete item\n"); 
    printf("7- Search by name\n"); 
    printf("0- Exit program\n> "); 
    scanf("%d", &SEL); 
    if (SEL > 7){ 
      temp = getIntLimited(0,7); 
    } 
    return SEL; 
} 


void GrocInvSys(void){ 
    int SEL; 
    int DONE = 0; 
    SEL = 0; 
    printWelcome(); 

    while (DONE == 0){ 
      SEL = getMenuChoice(); 
      clearKeyboard(); 
      if (SEL == 1){ 
        printf("List Items!\n"); 
        pause(); 
      } 
      if (SEL == 2){ 
        printf("Search Items!\n"); 
        pause(); 
      } 
      if (SEL == 3){ 
        printf("Checkout Item!\n"); 
        pause(); 
      } 
      if (SEL == 4){ 
        printf("Stock Item!\n"); 
        pause(); 
      } 
      if (SEL == 5){ 
        printf("Add/Update Item!\n"); 
        pause(); 
      } 
      if (SEL == 6){ 
        printf("Delete Item!\n"); 
        pause(); 
      } 
      if (SEL == 7){ 
        printf("Search by name!\n"); 
        pause(); 
      } 
      if(SEL == 0){ 
        printf("Exit the program? (Y)es/(N)o): "); 
        DONE = getYesOrNo(); 
      } 
    } 

} 

int main(void){ 
    GrocInvSys(); 
    return 0; 
} 

このコードでは、getMenuChoice内のすべてのアイテムが表示され、使用するたびに各アイテムの番号が入力されると、特別なメッセージが出力されます。ファンクションコールが関数内で機能しない

すべてがしかし、それは言うべきで、正常に動作している「無効な値が、0 <値< 7:」Iは0または1または2または3または4または5または6または7

以外のものを入力したときにだから、私はgetIntl​​imited関数がgetMenuChoice関数で動作していないと推測しています。なぜでしょうか?

p.s.私はpause()をタイプしました。 SEL ==ステートメントの場合はすべて、それを改善できる方法はありますか?

+2

'while '条件全体が' || 'ではなく' && 'によって連鎖されるべきです。つまり、それはかなり役に立たない。文字は同時に2つの値になることはできません。そのため、等しくない条件の1つは常に真です。 'while(1)'とすることもできますし、それが意図であれば、それを実行してください。 – WhozCraig

+0

あなたの 'getInt'関数は不気味です。 –

+0

'clearKeyboard()'もEOFを考慮する必要があることに注意してください。 'int ch; while((ch = getchar())!= EOF && ch!= '\ n'); '。また、 'scanf()'の戻り値をチェックする必要があります。それが2でなければ、あなたは問題を抱えています。あなたが数字と別のキャラクターの両方を持っていることが分かっている場合に限り、余分が改行であることを確認する必要があります。 –

答えて

0

主な問題は、getMenuChoice()にある余分なコードです。

int getMenuChoice(void){ 
    printf("1- List all items\n"); 
    printf("2- Search by SKU\n"); 
    printf("3- Checkout an item\n"); 
    printf("4- Stock an item\n"); 
    printf("5- Add new item or update item\n"); 
    printf("6- delete item\n"); 
    printf("7- Search by name\n"); 
    printf("0- Exit program\n> "); 
    return getIntLimited(0,7); 
} 

もう一つの問題は、GrocInvSys()getMenuChoice()への呼び出し後にclearkeyboard()への呼び出しである:それはちょうど、メニューを印刷し、getIntLimited(0,7)の値を返す必要があります。これは次の改行までさらに多くの入力を読み込みますが、getInt()はすでに整数を終了した改行を読み込んでいます。その内容はちょうど無視されるので、別の行を読む必要はありません。その問題を解決するには、その電話をclearkeyboard()に移動します。

関連する問題