2016-11-15 1 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; 
} 

Für diesen Code würde es alle Elemente in der GetMenuChoice anzeigen und wenn Sie die Nummer für jedes Element verwenden, würde es eine spezielle Nachricht drucken.Funktionsaufruf in einer Funktion

Alles funktioniert gut, aber es sollte sagen „ungültiger Wert, 0 < Wert < 7:“ wenn ich gebe etwas anderes als 0 oder 1 oder 2 oder 3 oder 4 oder 5 oder 6 oder 7

Ich vermute also, dass meine Funktion getIntlimited in der Funktion getMenuChoice nicht funktioniert. Irgendwelche Gründe warum?

p.s. Ich habe pause() getippt; Für jede Frage, ob SEL ==, kann ich es irgendwie besser machen?

+2

Die gesamte "while" Bedingung sollte durch '&&', nicht '||' verkettet werden. Wie es ist, ist es ziemlich nutzlos. Ein Zeichen darf nicht gleichzeitig zwei Werte sein, so dass eine dieser nicht gleichen Bedingungen immer wahr ist. Es kann auch 'while (1)' sein und wenn das die Absicht ist, dann mach das einfach. – WhozCraig

+0

Ihre "getInt" -Funktion sieht fischig aus. –

+0

Beachten Sie, dass 'clearKeyboard()' auch EOF berücksichtigen muss: 'int ch; while ((ch = getchar())! = EOF && ch! = '\ n'); '. Außerdem sollten Sie den Rückgabewert von 'scanf()' überprüfen; Wenn es nicht 2 ist, hast du Probleme. Nur wenn Sie wissen, dass Sie sowohl eine Zahl als auch ein anderes Zeichen haben, sollten Sie überprüfen, ob das Extra ein Zeilenumbruch ist. –

Antwort

0

Das Hauptproblem ist einige überschüssige Code in getMenuChoice(). Es muss nur das Menü drucken und geben den Wert von getIntLimited(0,7):

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

Ein weiteres Problem ist der Aufruf clearkeyboard() nach dem Aufruf von getMenuChoice() in GrocInvSys(). Dies liest mehr Eingaben bis zum nächsten Zeilenumbruch, aber getInt() hat bereits den Zeilenumbruch gelesen, der die Ganzzahl beendet hat. Es ist nicht notwendig, eine andere Zeile zu lesen, da deren Inhalt einfach ignoriert wird. Entfernen Sie diesen Anruf zu clearkeyboard(), um dieses Problem zu beheben.

Verwandte Themen