Wie komme ich aus der nervigen Schleife raus????
-
Hallo habe hier ein Problem, dass schneller Lösung bedarf, da es eine Hausaufgabe ist, die ich Montag wieder abgeben muss. Wäre echt nett, wenn mir jemand helfen könnte.
#include <stdio.h>
#include <conio.h>
#include <ctype.h> //für toupper//Deklaration von Unterfunktionen
int menu();
int durchschnitt_lagerdauer();
int lagerumschlagshaufigkeit();//Globale Variablen
int iIndex;
int etc.int main()
{
do
{
menu();
switch(iIndex)
{
case 1:
{
durchschnitt_lagerdauer();
}break;
case 2:
{
lagerumschlagshaufigkeit();
}break;
case 3:
{
printf("Das Programm wird auf ihren Wunsch beendet"); //Hier soll beendet werden!!
}break;
default:
printf("Ungueltige Eingabe");
}
printf("Soll eine Weitere Berechnung erfolgen(J/N)? ");
scanf(" %c",&cNochmal);
cNochmal = toupper(cNochmal);
}
while(cNochmal == 'J');FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));//Verhindert Schließen
getch();
return (0);
}....Definitionen der Unterfunktionen
Das Programm fragt im Menu nach einer Berechnungsart für Lagerkennziffern und nach dem Wunsch das Programm zu beenden und übergibt iIndex an die main-Funktion, es startet eine switch-case Abfrage. Ist z.B. 1 eingegeben worden, wird eine Unterfunktion aufgerufen, die die durchschnittliche Lagerdauer ausrechnet. Danach wird aufgrund einer umgebenden do..while Schleife gefragt, ob eine weitere Berechnung erfolgen soll, wird J oder j eingegeben wird das Menu wieder aufgerufen. Wird im Menu 3 eingegeben, soll erscheint der Text" Das Programm wird beendet" und das Programm soll schließen. Tut es aber nicht, da die switch-case Abfrage innerhalb einer Schleife liegt, anstatt wird der Text ausgegeben und natürlich wieder gefragt ob eine neue Berechnung erfolgen soll, erst wenn man N oder n eingibt wird die Schleife verlassen.
Wie kann ich es trotzdem hinbekommen (auf elegante C Art) bei der Eingabe 3 das Programm beenden zu lassen? Auf keinen Fall soll dies mit goto erfolgen.
Danke für eure Hilfe.
-
... while (index!=3) ...
-
Erstmal, benutze doch bitte Code-Tags.
Dann machst du das einfach so:
#include <stdio.h> #include <conio.h> #include <ctype.h> //für toupper //Deklaration von Unterfunktionen int menu(); int durchschnitt_lagerdauer(); int lagerumschlagshaufigkeit(); //Globale Variablen int iIndex; int etc. int main() { do { menu(); switch(iIndex) { case 1: durchschnitt_lagerdauer(); break; case 2: lagerumschlagshaufigkeit(); break; case 3: printf("Das Programm wird auf ihren Wunsch beendet"); return 0; // Hier wird das Programm Beendet. break; default: printf("Ungueltige Eingabe"); printf("Soll eine Weitere Berechnung erfolgen(J/N)? "); scanf(" %c",&cNochmal); cNochmal = toupper(cNochmal); } while(cNochmal == 'J'); FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));//Verhindert Schließen getch(); return (0); } //....Definitionen der Unterfunktionen
-
Hi,
danke für die Antworten, aber
1. Variante) wie und wo im Text soll ich denn while(iIndex!=3) einbringen?
2. Variante) mit return 0; in der case 3: funktioniert es zwar, aber der Compiler zeigt eine Warnung an, dass der Rest des Textes nie erreicht wird (wird er aber doch?!?); ist return 0; überhaupt ANSI-C oder nur eine Notlösung (wenn eine Warnung kommt sicher eine Notlösung) ?
Ich hab jetzt gelesen das es mit exit(EXIT_SUCCESS) geht.
Gibt es noch elegantere Lösungen; können meinetwegen auch gravierende Änderungen im Text sein, man lernt ja nie aus.
-
Ich kann Dir nur empfehlen für Kommentare
statt:
"//" immer "/:" zu nehmen.
-
Vielleicht doch noch wer der eine elegante Lösung hat? Hilffeee mein Lehrer bringt mich um.
ps: @gloreicher_helfer, es heißt wenn schon anstatt // /* */ und nicht /:
-
die lsg von quizzmaster wird er doch akzeptieren denk ich. denke dein lehrer wird sich eher über die funktion
FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));//Verhindert Schließen
wundern.
das ist kein ansi C was ihr sicher macht.(oder?)
... do { switch(iIndex) { ... }while(iIndex!=3); ...
-
@ Dill
Das mit FlushConsole... hab ich aus der FAQ: Da steht es wäre eleganter als das getchar() am ende, um dass Schließen zu verhindern.
Wusste nicht dass das nicht ANSI-C ist, was ist es denn dann??? Würde mich ja mal interessieren.
-
das ist eine funktion der windows-API.
wird deinem lehrer noch weniger gefallen als eine compiler-warnung.benutz grundsätzlich nur sachen die ihr schon durchgenommen habt.
-
So, einer der sich wenigstens mal mit der Win-API auskennt.
Wieso wird er sich darüber nicht freuen?
Was ist so schlecht an der Win-API? Es gibt doch auch ein Buch von Charles Petzold " Windowsprogrammierung mit der Win32 API", was ich übrigens auch habe, aber leider noch zu schwer, da ich mit Zeigern noch nicht klarkomme; übrigens, was ist ein handle?
Was kann man mit der Win-API machen?
Gibt es eine Möglichkeit das automatische Schliessen der Konsole zu verhindern, ohne die Win-API oder den Befehl getchar(); ?
Gibt es auch eine API nur für die Konsole? Habe nämlich im Forum gelesen, dass so einige fragen, ob man in der Win-Console auch Programme mit grafischen Oberflächen machen kann.
-
hmm... return 0; verlässt nur die main Funktion und beendet somit das Programm.
Was soll daran Notlösungshaft sein?
-
weiß nicht? Habe gedacht es darf nur in jeder Funktion einmal return (); vorkommen. Sonst wäre es nicht mehrt ANSI-C. Na ja egal, es funzt ja.
Weist du wieso trotzdem eine Warnung kommt?Kannst du mir bitte noch meine Fragen zur API beantworten. Danke
-
wenn man in foren auf kostenlosen support hofft sollte man nicht so vorlaut sein, vorallem wenn man nicht mal ein menu programmiert kriegt :p
-
Das war so auch nicht gemeint, ich frage nur schon seit 2 Wochen in allen möglichen Foren und keiner wusste es so richtig.
-
Also die Lösung mit "return 0;" in der switch-Anweisung hätte ich auch bevorzugt - und natürlich ist die ANSI-C, warum sollte das nicht sein?! Nur weil dein Compiler eine Warnung bringt? Das hat nichts zu sagen! Den Abbruch mit "index!=3" herbei zu rufen ist auch elegant - wenn der Aspekt der strukturierten Programmierung im Vordergrund steht, dann nimm diese Lösung. Zum Verdeutlichen der Abbruchbedingung einer while-Schleife hier eine andere Möglichkeit: du definierst eine Variable abbruch mit 0 und setzt sie nur auf 1, wenn der Benutzer das Programm beenden will (ich ziehe dieser Lösung aber das "while(index!=3)" vor). Mal eine andere Frage: wenn du schon eine Menüabfrage mit einem Beenden-Menüpunkt hast, wieso fragst du dann noch einmal explizit ab, ob der Benutzer noch eine Berechnung durchführen will? Finde ich irgendwie doppelt gemoppelt. Ohne diese 2. Abfrage und mit o.a. "abbruch"-Variable würde der Pseudocode nun so ausschauen:
#include <stdio.h> #include <conio.h> #include <ctype.h> //für toupper //Deklaration von Funktionen int menu(); int durchschnitt_lagerdauer(); int lagerumschlagshaufigkeit(); //Globale Variablen int iIndex; int main(void){ short int abbruch=0; do { menu(); switch(iIndex) { case 1: durchschnitt_lagerdauer(); break; case 2: lagerumschlagshaufigkeit(); break; case 3: printf("Das Programm wird auf ihren Wunsch beendet"); abbruch=1; // wir wollen beenden break; default: printf("Ungueltige Eingabe"); break; } }while(!abbruch); // solange, wie wir nicht beenden wollen FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));//Verhindert Schließen getch(); return (0); }
1. Wieso wird er sich darüber nicht freuen?
2. Was ist so schlecht an der Win-API? Es gibt doch auch ein Buch von Charles Petzold " Windowsprogrammierung mit der Win32 API", was ich übrigens auch habe, aber leider noch zu schwer, da ich mit Zeigern noch nicht klarkomme;
3. übrigens, was ist ein handle?
4. Was kann man mit der Win-API machen?
5. Gibt es eine Möglichkeit das automatische Schliessen der Konsole zu verhindern, ohne die Win-API oder den Befehl getchar(); ?
6. Gibt es auch eine API nur für die Konsole? Habe nämlich im Forum gelesen, dass so einige fragen, ob man in der Win-Console auch Programme mit grafischen Oberflächen machen kann.1. Er wird sich nicht darüber freuen, weil es kein ANSI-C ist, sondern OS-spezifisch (Windows). Auch dein getch(); am Ende ist nicht ANSI-C, sondern eine Erweiterung einiger Bibliotheken und Compiler (LCGI / Borland). Benutze statt dessen lieber getchar(), ich sehe keinen Grund, warum du das nicht tun solltest! Vorsicht: wenn du vorher schon einmal ein "char" mit getchar(); eingelesen hast, musst du ein zweites dummy-getchar() hinterher schieben, damit das Carriage-Return-Zeichen überlesen wird (will ich jetzt nicht weiter erklären)!
2. Es ist nichts Schlechtes an der WinAPI, nur sollte man sie nicht benutzen, wenn man nicht gerade Fenster in Windows programmiert, da plattformabhängig.
3. Ein Handle ist AFAIK ein Zeiger zu einem von deinem Programm geöffneten Fenster, bin mir jetzt aber nicht mehr so sicher...
4. Fenster programmieren etc. pp.
5. Ja, das Programm einfach mittels Befehl in der Windows-Eingabeaufforderung aufrufen
6. Es gibt nichts, was es nicht gibt. Z.B. die "improved console"...Ähm... ich muss weg
[ Dieser Beitrag wurde am 11.05.2003 um 10:37 Uhr von RTC editiert. ]