C komme nicht weiter....
thomas
- sonstiges
Guten Morgen zusammen, ich habe ein Problem, ein ziemlich simples, aber ich komme nicht weiter und zwar hätte ich gerne, dass des Programm das Menü erneut aufruft, nachdem ich den Menü Punkt '2' gewählt habe und keinen weiteren Knoten erstellen möchte. Was muss ich da in den else Zweig schreiben? Vielen Dank im voraus:
#include <stdio.h>
#include <stdlib.h>
#include <stdafx.h>
struct daten{
char name[20];
char vname[20];
int alter;
};
struct Knoten {
int zahl;
struct daten x;
struct Knoten *next;
};
int main()
{
char j, b;
int menue=0, i=0, gesucht;
struct Knoten *anfang=0, *ptr, *ende, *p0, *p1, zzahl;
printf("\t- - - M A I N M E N U - - -\n\n\n\tWas moechten sie tun?\n\n");
printf("\t[1] Knoten anfuegen \n\t[2] Knoten ausketten\n\t[3] Knoten suchen\n\t[4] Ende\n\n\n\t\t");
printf("Ihre Wahl: ");
fflush(stdin);
scanf("%i" ,&menue);
if (menue == 1)
{
while (1)
{
printf("\tNeuer Knoten?j/n: ");
fflush(stdin);
j=getchar();
if(j == 'j')
{
ptr= (struct Knoten*) malloc (sizeof (struct Knoten));
if (!anfang)
{
anfang = ende = ptr;
}
else
{
ende -> next = ptr;
ende = ptr;
}
printf("Zahl eingeben: ");
fflush (stdin);
scanf("%d", &zzahl.zahl);
++i;
ende -> next = 0;
}
else
{
printf ("\tSie haben %i Knoten erstellt\n\n\n",i);
}
}
}
else if (menue == 2)
{
while(1)
{
printf("Knoten ausketten?j/n: ");
fflush (stdin);
b=getchar();
if ( b == 'j')
{
if(i>0)
{
if (anfang)
{
ptr=anfang;
anfang = anfang -> next;
}
printf("Knoten wurde erfolgreich entfernt.\n\n\n");
--i;
}
else
{
printf("Kein Knoten vorhanden, der entfernt werden kann.\n");
}
}
}
}
else if (menue == 3)
{
anfang=p0=0;
ende -> next = ptr;
ende = ptr;
printf("Welche Zahl möchten sie suchen?");
fflush(stdin);
scanf("%i", &gesucht);
if(!anfang)exit (2);
while (p1 && gesucht != p1 ->zahl)
{
p0 =p1;
p1=p1->next;
}
}
else if (menue == 4)
{
return 0;
}
}
Hallo Thomas,
leg doch einfach eine while(true) Schleife um deine Tastaturabfrage und schliess dann entsprechend mit continue, beziehungsweise break in den einzelnen Menuepunkten ab. (break wird dann wahrscheinlich nur beim Punkt 4 - Programmende nötig sein. Alle anderen Punkte gehen danach mit continue zur nächsten Tastatureingabe)
liebe Grüße mbr
P.S.: ich seh übrigens gerade, dass du im Menuepunkt 2 bereits eine while(1) Schleife drin hast (Was dasselbe wie while(true) ist - Bitte jetzt keine Prügel von den Experten ;-) Ich weiss schon, dass es noch einen kleinen feinen Unterschied gibt...) Allerdings hast du damit dort im Menuepunkt 2 IMHO eine Endlosschleife...
Ja, aber die Frage ist doch, wie löse ich das Problem? Klar ich könnte das ganze Prog umschreiben... Aber "wir haben doch keine Zeit", es muss doch irgendeine schnellere Lösung geben.
Danke, LG Thomas2 IMHO eine Endlosschleife...
Hi Thomas!
Ja, aber die Frage ist doch, wie löse ich das Problem? Klar ich könnte das ganze Prog umschreiben...
Wenn es dir zu einem besseren Programmierstil verhilft, wäre das gar nicht so schlecht. [1]
Aber "wir haben doch keine Zeit", es muss doch irgendeine schnellere Lösung geben.
Du _musst_ in deinem Programm eine do-while- oder while-Schleife unterbringen. Ansonsten kann es ja gar nicht an den Programmanfang springen und das Menü wieder anzeigen. Oder du erklärst mir, wie du das machen würdest. ;-)
[1]Ich möchte damit keinesfalls andeuten, dass dein Stil schlecht ist. Darüber möchte ich mir kein Urteil erlauben, denn jeder strukturiert sein Programm anders. Aber ich kann dir meine Meinung sagen und wie ich es realisieren würde. :)
MfG Hopsel
Hi,
Du _musst_ in deinem Programm eine do-while- oder while-Schleife unterbringen. Ansonsten kann es ja gar nicht an den Programmanfang springen und das Menü wieder anzeigen. Oder du erklärst mir, wie du das machen würdest. ;-)
Schleifen und Bedingungen kann man mit den verschiedensten Methoden erzeugen. Sei es ganz brutal mit einem "goto" oder mit mehreren Funktionen. Es gibt auch noch longjmp(3) benebst Anverwandten. Wahrscheinlich gibt es auch noch andere Methoden und Funktionen, mehr fallen mir auf die Schnelle aber nicht ein.
Ich persönlich bevorzuge für solche Warteschleifen 'for(;;)', aber das ist natürlich reine Geschmacksache.
so short
Christoph Zurnieden
Hi Christoph!
Deine qualifizierten Antworten sind immer wieder beeindruckend. Kann man die das Wissen irgendwie absaugen und in mein Gehirn spritzen? :)
MfG H☼psel
Hi,
Deine qualifizierten Antworten sind immer wieder beeindruckend. Kann man die das Wissen irgendwie absaugen und in mein Gehirn spritzen? :)
Tut mir leid aber das unterliegt dem Betäubungsmittelgesetz, da müsstest Du schon ein Rezept vorlegen.
BTW: die Krankenkasse übernimmt die Kosten auch nicht.
so short
Christoph Zurnieden
Hallo Thomas
Ja, aber die Frage ist doch, wie löse ich das Problem? Klar ich könnte das ganze Prog umschreiben... Aber "wir haben doch keine Zeit", es muss doch irgendeine schnellere Lösung geben.
Wie Hopsel schon gesagt hat: Ohne eine Schleife wirst du wohl nicht auskommen...
Außerdem heißt das doch (noch) nicht, das ganze Programm umzuschreiben. Es sind lediglich ca. 7 Zeilen einzufügen. Ne "schnellere" Lösung wirst du nicht finden.
liebe Grüße mbr
P.S.: Im Gegensatz zu mir hat dir Hopsel sogar das Beispiel schon komplett umgebaut - selbst wenn es wie gesagt nur wenige Zeilen sind. Und auch sein Kommentar bezüglich Kommentaren ist durchaus beachtenswert.
Hi thomas!
Was muss ich da in den else Zweig schreiben?
Gar nix. Versuche es mal mit einer do-while-Schleife und einer switch-Verzweigung.
#include <stdio.h>
#include <stdlib.h>
#include <stdafx.h>struct daten{
char name[20];
char vname[20];
int alter;
};
struct Knoten {
int zahl;
struct daten x;
struct Knoten *next;
};int main()
{
char j, b;
int menue=0, i=0, gesucht;
struct Knoten *anfang=0, *ptr, *ende, *p0, *p1, zzahl;
//Schleife, die den Programmablauf regelt.
do {
printf("\t- - - M A I N M E N U - - -\n\n\n\tWas moechten sie tun?\n\n");
printf("\t[1] Knoten anfuegen \n\t[2] Knoten ausketten\n\t[3] Knoten suchen\n\t[4] Ende\n\n\n\t\t");
printf("Ihre Wahl: ");
fflush(stdin);
scanf("%i" ,&menue);
/* * Folgender Quellcode ist nicht
* vollständig und soll nur zum
* Verständnis beitragen
*/
switch(menue) {
case 1: //Knoten hinzufügen
break;
case 2: //Knoten entfernen
break;
case 3: //Knoten anzeigen
break;
case 4: break;
default: //Falsche Eingabe
break;
}
//Programm wird beendet, wenn die 4 gewählt wird
} while(menue != 4)
return 0;
}
Was mir noch auffällt, ist, dass du gar nicht kommentierst. Du nutzt auch nicht die Auslagerung von Programmteile in Funktionen. Das ist bei einem so kleinen Programm sicher noch nicht essentiell, aber später wirst du es zu schätzen wissen, wenn du eine gewisse Form einhältst.
MfG Hopsel
Hi,
Oh, eine Hausaufgabe? ;-)
#include <stdafx.h>
Bitte bleibe vorerst bei Standard-C.
struct daten{
char name[20];
char vname[20];
int alter;
};
Du solltest Deinen Strukturen besser Namen geben, das ist dann später einfacher. Ein 'typedef' ist dafür z.B. geradezu prädestiniert.
int main()
{
char j, b;
Es sollten normalerweise alle Variablen mit einem Wertz initialisiert werden falls es nicht automatisch geschieht.
int menue=0, i=0, gesucht;
Der Datentyp 'int' sollte nur gewählt werden, wenn die Größe von 'int' bekannt ist. Passendere Datentypen gibt es in 'stdint.h'.
struct Knoten *anfang=0
Einen Pointer sollte man normalerweise mit dem Macro "NULL" initialisisieren. Dafür ist es da.
fflush(stdin);
fflush() kann danebengehen, die Rückgabe ist also auf Fehler zu testen ("errno" wird ebenfalls gesetzt).
scanf("%i" ,&menue);
scanf() kann danebengehen, die Rückgabe ist also auf Fehler zu testen.
printf("\tNeuer Knoten?j/n: ");
fflush(stdin);
Da Du das öfter benutzt würde ich daraus eine eigene Funktion machen.
j=getchar();
getchar() kann danebengehen, die Rückgabe ist also auf Fehler zu testen.
if(j == 'j')
'J' funktioniert dann nicht. Vorschlag:
#include <ctype.h>
j = tolower(j);
if(j == 'j')
{
ptr= (struct Knoten*) malloc (sizeof (struct Knoten));
Das Ergebnis von malloc() muß man vielleicht bei Experimenten und den riesigen Speichern heutzutage nicht mehr unbedingt testen, aber sowas sollte man sich gar nicht erst angewöhnen!
++i;
Der Unterschied zwischen i++ und ++i ist eigentlich nur noch für den Obfuscated C Contest von Bedeutung. Klarer Aufbau ist vorzuziehen.
else if (menue == 2)
Aufgrund der Tatsache, das es sich bei "menue" um einen Integerdatentyp handelt wäre evt ein switch() vorzuziehen.
if(!anfang)exit (2);
Für den Parameter von exit() gibt es die Macros "EXIT_FAILURE" und "EXIT_SUCCESS", die den jeweils passenden Rückgabewert auflösen.
while (p1 && gesucht != p1 ->zahl)
Klammern tun nicht weh und verbrauchen keinen Sprit. Nutze sie.
else if (menue == 4)
{
return 0;
}}
Die Funktion main() muß ein 'int' zurückgeben.
so short
Christoph Zurnieden