Problem mit else und if... :P


portege_moi

Still Fresh
Joined
Aug 19, 2010
Messages
15
Hallo Leute!

Ich bin im Moment noch ziemlich am Anfang, mir Programmierkenntnisse anzueignen. Ich habe mich mit für C entschieden.

Jetzt wollte ich mal so ein kleines Textadventure fürs Terminal schreiben, aber irgendwas funzt einfach nicht, ich denke mal mein fehler ist ein ganz einfacher, dummer :) aber ich komm einfach nicht drauf:

hier der Code:
Code:
/* hallo.c */

#include <stdio.h>


int main (void) {
	int i;

	printf("\n");
	printf("..............................\n");
	printf("...Willkommen zu Terminal.....\n");
	printf(".......Detective.!.!.!........\n");
	printf("..............................\n");
	printf("\n");
	printf("Wählen Sie ein Level aus:\n");
	printf("[1] Das Messer\n");
	printf("[2] Der Diebstahl\n");
	printf("[3] Beenden\n");
	scanf("%d" ,&i);
	

	if(i == 1) {
	printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
	}
	if(i == 2) {
	printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
	}
	if(i == 3) {
	exit(0);
	}
	else {
	printf("Ungültige Eingabe\n");
	}	

	return 0;

	}

aber leider hängt mir das Terminal bei meinen Eingaben 1 bzw. 2 am schluss immer "Ungültige Eingabe" drann

sieht dann so aus:
..............................
...Willkommen zu Terminal.....
.......Detective.!.!.!........
..............................

Wählen Sie ein Level aus:
[1] Das Messer
[2] Der Diebstahl
[3] Beenden
2
Sie haben Level 2, Der Diebstahl, ausgewählt!
Ungültige Eingabe

Könnt ihr mir da bitte weiterhelfen :) versuche nämlich, mir Kenntnisse anzueignen um auch mal (in hoffenltich naher Zukunft) für den Caanoo was zu schreiben ;)

danke im voraus....
 
Hi,
ich hab's kurz überflogen, dein Fehler liegt darin das die ersten 2 If-Blocke unabhängig von dem letzten mit Else abgearbeitet werden! Schnapp dir mal dein Tutorial oder Buch und schau nach Switch-Klausel, sollte dann so aussehen :
Code:
 switch(i) {
case 1:
   Printf ....
Case 2:
   Printf ....
Case 3:
   Ende
Default:
   Printf falsche Eingabe
}

is blöd geschrieben, aber besser bekomm ich's auf die schnelle mit Apfeltelefon nicht. Hin.
MfG
 
Ja da fehlt dir ein bisschen. Erstmal der korrigierte Code, dann die Erläuterung.
Code:
<i>
</i>if(i == 1) {
printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
}
else if(i == 2) {
printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
}
else if(i == 3) {
exit(0);
}
else {
printf("Ungültige Eingabe\n");
}

Wie du es vorher gemacht hast gab es 3 Abfragen.

1. Wenn 1 dann Ausgabe
2. Wenn 2 dann Ausgabe
3. Wenn 3 dann Ausgabe ansonsten "negative Aussage"

Wenn i jetzt 1 ist. Gibt er den ersten Text aus. Dann geht der weiter und sieht das i nicht 2 ist und springt weiter. Dann sieht er das i nicht 3 ist und gibt dann das else aus. Das wird also immer Ausgegeben wenn i nicht 3 ist.

Wenn du jetzt aber immer ein else if nutzt, springst du vorzeitig aus der Abfrage raus und er wird nie zum else kommen wenn i = 1, 2 oder 3 ist.

Du machst damit sozusagen aus 3 Abfragen eine Einzige ;) Ich hoffe ich hab es verständlich erklärt ^^
 
... ja :) habs kapiert :D

danke!

hab das ganze jetzt aber so:

mit switch, case lösen können ;) (was für ein triumph! :p)
Code:
scanf("%d" ,&i);
	
	switch (i)
	{
	case 1:
	i = 1;
	printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
	break;
	
	case 2:
	i = 2;
	printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
	break;

	case 3:
	i = 3;
	exit(0);
	break;
	
	default:
	printf("Ungültige Eingabe\n");
	}

danke nochmal!

lg

-- Sa Aug 21, 2010 00:43 --

hm... sry dass ich nochmal störe ;)

aber diese else if sache hab ich scheinbar doch nicht kapiert.... der compiler sagt mir bei der ausgabe:
Code:
hallo.c: In function ‘main’:
hallo.c:62: error: ‘else’ without a previous ‘if’
hallo.c:66: error: ‘else’ without a previous ‘if’
hallo.c:70: error: ‘else’ without a previous ‘if’
hallo.c:91: error: ‘else’ without a previous ‘if’
hallo.c:120: warning: incompatible implicit declaration of built-in function ‘exit’
hallo.c:130: error: expected declaration or statement at end of input
(die letzten zwei Zeilen hab ich schon seit dem Anfang... aber funktioniert hats trozdem... aber das mit dem else without a previous if finde ich schon seltsam :)

hier mein Code:
Code:
/* hallo.c */

#include <stdio.h>


int main (void) {
	int i;
	int nr1;

	printf("\n");
	printf("..............................\n");
	printf("...Willkommen zu Terminal.....\n");
	printf(".......Detective.!.!.!........\n");
	printf("..............................\n");
	printf("\n");
	again_start:
	printf("Wählen Sie ein Level aus:\n");
	printf("[1] Das Messer\n");
	printf("[2] Der Diebstahl\n");
	printf("[3] Ueber Terminal Detective\n");
	printf("[4] Beenden\n");

	scanf("%d" ,&i);
	
	switch (i)
	{
	case 1:
	i = 1;
	{
	if (i == 1); {
	printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
	
	printf("\n");
	printf("_____________________________________________________________\n");
	printf("______________________________________||____________||_______\n");	
	printf("___###################################||############||_______\n");
	printf("__________############################||############||_______\n");
	printf("_________________#############________||____________||_______\n");
	printf("_____________________________________________________________\n");
	printf("_____________________________________________________________\n");

	printf("Chief: 'Im Stadtpark wurde ein Blutverschmiertes Messer gefunden... \n");
	printf("Chief: ... und es ist nun ihre Aufgabe, herauszufinden, was es damit auf \
sich hat.'\n");
	
	printf("Wise: 'Sie haben keine näheren Informationen dazu? Nur dieses Messer aus \
dem Park??? Wo soll ich da nur anfangen?’\n");
	
	printf("Chief: ’Das obliegt ganz ihnen. Entscheiden Sie selbst wo Sie das angehen wollen.'\n");
	printf(".... der Chief überreicht ihnen das Messer in einer Plastiktüte.\n");
	
	printf("Wofür entscheiden Sie sich?:\n");
	printf("[1] Ab ins Labor, mal das Messer genauer unter die Lupe nehmen...\n");
	printf("[2] Los, in den Stadtpark, wir sehen uns den Fundort genauer an...\n");
	printf("[3] Erstmal einen Kaffe trinken gehen und mit den Kollegen etwas plaudern...\n");
	printf("[4] Auf eigene Faust das Messer ansehen.\n");
	scanf("%d" ,&nr1);
	if (nr1 == 1); {

	printf("Also los ins Labor!\n");
	}
	else if(nr1 == 2); {

	printf("Auf gehts,... in den Stadtpark!\n");
	}
	else if(nr1 == 3); {

	printf("Mal sehen was beim Kaffeeautomaten so los ist!\n");
	}
	else if(nr1 == 4); {
	
	printf("Sie oeffnen die Plastiktüte und nehmen das Messer heraus...\n");
	printf("Chief: ’Was zum Teufel machen Sie das WISE? Seit wann begutachten \
wir die Beweisstücke? Sie haben das Stück noch nicht einmal nach Fingerabdrücken untersucht\
und nun sind überall Ihre eigenen darauf!!! Machen Sie sich vom Acker!!!\n");
	printf("\n");
	printf("Sie haben Beweismaterial verunreinigt, der Chief hat Sie in den Urlaub geschickt... \
wie lange wissen Sie noch nicht... sorry, aber...\n");
	printf("\n");
	printf("\n");
	printf("_________________________________________________________________________\n");
	printf("_________________________________________________________________________\n");
	printf("______###_____###___##___##__#####________###___#___#__#####__#####______\n");
	printf("_____#_______#___#__#_###_#__#___________#___#__#___#__#______#___#______\n");
	printf("_____#_______#___#__#__#__#__####________#___#___#_#___####___#####______\n");
	printf("_____#__##___#####__#_____#__#___________#___#___#_#___#______#___#______\n");
	printf("_____####____#___#__#_____#__#####________###_____#____#####__#___#______\n");
	printf("_________________________________________________________________________\n");
	}

	else {
	printf("Ungültige Eingabe\n");
	}
	}
	

	break;
	case 2:
	i = 2;
	printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
	printf("\n");
	printf("blablabla\n");
	break;

	case 3:
	i = 3;
	printf("\n");
	printf("Über Terminal Detective:\n");
	printf("In Terminal Detective schlüpfen Sie in die Rolle des \
Detective Wise, welcher verschiedene Verbrechen aufklären soll. \
Sie werden dabei von Ort zu Ort geleitet und haben die \
möglichkeit, selbst zu entscheiden wie es weiter gehen soll. \
	...Viel Spaß!\n");
	printf("\n");
	goto again_start;


	case 4:
	i = 4;
	exit(0);
	break;
	
	default:
	printf("Ungültige Eingabe\n");
	goto again_start;
	}	

	return 0;

	}

Ich denke mal, mein Code is momentan noch relativ leicht verständlich ;) Gibts eigentlich noch Text-Adventure-Fans?

Danke für jede Hilfe im voraus :)

lg und gute nacht :D
 
Nicht das ich wirklich einen Durchblick habe...
Zu deinen "if else": Die ";" hinter den Klammern sollten weg.
Als Beispiel:
Code:
if ( i == 1 ) {
     printf("Eins\n");
} else if ( i == 2 ) {
     printf("Zwei\n");
} else {
     printf("Fehler\n");
}

Zu deinem switch Aufruf: Die "i = 1" usw. kannst du dir knicken.
Wenn du mit switch die Variable "i" prüfst dann hat sie schon der Wert.
Code:
switch (i) {
    case 1:
    printf("Eins\n");
    break;

   case 2:
   printf("Zwei\n");
   break;

   default:
   printf("Fehler\n");
}

Alle Angaben ohne Gewähr. Zu Risiken und Nebenwirkungen... ;)

Mein Buch mit dem ich vor einer Ewigkeit C angefangen habe war "C-Programmierung für Linux in 21 Tagen" von Markt+Technik. Mir hat der Aufbau des Buches gefallen mit kleinen Beispielen und Aufgaben zur Fehlersuche mit guter Erklärung zu jedem Thema und das Stichwortverzeichnis hinten ist auch so aufgebaut das ich damit zurecht kam.
Meine Ausgabe ist allerdings aus dem Jahre 2000 und war mal recht teuer als Hardcover-Ausgabe.
Es hat sich einen ewigen Platz in meiner Bücherecke erkämpft ;)
 
portege_moi said:
[...] diese else if sache hab ich scheinbar doch nicht kapiert.... der compiler sagt mir bei der ausgabe:
Code:
hallo.c: In function ‘main’:
hallo.c:62: error: ‘else’ without a previous ‘if’
hallo.c:66: error: ‘else’ without a previous ‘if’
hallo.c:70: error: ‘else’ without a previous ‘if’
hallo.c:91: error: ‘else’ without a previous ‘if’
(...)
Ich versuche nochmal, das von JohnDavidson geschriebene etwas deutlicher darzustellen und verwende dazu einen anderen Einrückungsstil mit extra vielen Abständen. Bei dir sah es in etwa so aus:
Code:
<i>
</i>if (i == 1)
{
	printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
}



if (i == 2)
{
	printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
}



if (i == 3)
{
	exit(0);
}
else
{
	printf("Ungültige Eingabe\n");
}
Drei mal "if", das letzte davon mit einem "else". Das "else" wird immer dann ausgeführt, wenn i einen anderen Wert als 3 hat, die oberen beiden "if" haben damit gar nichts zu tun da sie einzeln stehen.

JohnDavison hat es wie folgt abgeändert:
Code:
<i>
</i>if (i == 1)
{
	printf("Sie haben Level 1, Das Messer, ausgewählt!\n");
}
else if (i == 2)
{
	printf("Sie haben Level 2, Der Diebstahl, ausgewählt!\n");
}
else if (i == 3)
{
	exit(0);
}
else
{
	printf("Ungültige Eingabe\n");
}
Durch die "else" vor allen außer den ersten "if" ist das ganze nun zu einer einzigen Verkettung geworden, ergo wird "else" nur dann ausgeführt, wenn i weder 1 noch 2 noch 3 entspricht.

Nun, was ich damit eigentlich zum Ausdruck bringen wollte:
Einrückung ist sehr wichtig. Der von dir vorgebrachte Quellcode ist durchzogen von verschiedenen Stilen, an einigen Stellen fehlen Einrückungen (oder ist das aus irgendeinem Grund durch durch das Forum entstanden?). Wenn du dir nicht einen Stil aussuchst ( http://en.wikipedia.org/wiki/Indent_style ) und dich strikt daran hältst, dann wirst du immer wieder den Überblick verlieren.

Das habe ich schon bei vielen Programmieranfängern gesehen, sehr häufig entstehen dadurch Fehler die bei mehr kontinuität im Code womöglich von den Personen selbst entdeckt oder vermutet worden wären, worüber sich diejenigen Leute aber anfangs gar nicht im Klaren sind. Für die Anfänge empfehle ich dir "K&R", der Stil ist am einfachsten zu lesen. Später kannst du dann ja immer noch auf "1TBS" oder was auch immer umsteigen wenn du möchtest.

Bitte nicht falsch verstehen, das soll kein Angriff sein. Es ist tatsächlich so, dass das eine sehr wichtige Sache ist. Deswegen sage ich dir das, BEVOR du das erste Mal wegen eines vergessenen "break" in Selbstzweifel ausbrichst (hoch lebe "goto" in C#!). :)
 
Christoph.K said:
Für die Anfänge empfehle ich dir "K&R", der Stil ist am einfachsten zu lesen. Später kannst du dann ja immer noch auf "1TBS" oder was auch immer umsteigen wenn du möchtest.
Ist finde ich Gewöhnungs- und Geschmackssache.

Ich finde 1BTS übersichtlicher.
 
T4b said:
Christoph.K said:
Für die Anfänge empfehle ich dir "K&R", der Stil ist am einfachsten zu lesen. Später kannst du dann ja immer noch auf "1TBS" oder was auch immer umsteigen wenn du möchtest.
Ist finde ich Gewöhnungs- und Geschmackssache.

Ich finde 1BTS übersichtlicher.
Ich auch. :) Ich meinte, dass ich ihn für für Einsteiger am einfachsten lesbar halte.
 
Hi,
hab ma ne kleine Nebensächlichkeit, warum pocht ihr darauf die Antwort 100% an die Frage anzulehnen, ich meine ist ja irgendwo richtig und logisch. Aber in diesem Fall wäre doch die Variante mit switch die Übersichtlichere und einfachere, somal es sich um einen Anfänger handelt. Die ganzen if-else-Verschachtelungen werden auf Dauer mühsam zu debuggen, vorallem für Anfänger!

MfG
 
Hi :)

danke für die Hilfe!


Ja ich weiß das bei meinem Stil echt was zu tun ist... Um ehrlich zu sein, ich hab sogar noch versucht :p in übersichtlicher zu machen, ist mir wohl nicht gelungen ;)

Werd mir mal K&R und 1TBS ansehen. (Ich hab echt gedacht es ist halbwegs übersichtlich xD)

Auf jeden Fall danke für eure schnelle Hilfe und die Tipps ;)

Werd mich sicher bald mit meinem nächsten Problem melden ;)
 
Hi,

was du beachten solltest um die Übersichtlichkeit zu wahren ist das:

https://computing.llnl.gov/linux/slurm/coding_style.pdf (und es ist ganz Witzig)

Der Rest ist eine Vorliebe und hängt dazu noch vom Anwendungfall ab und spielt eigentlich keine Rolle :p .

Schönen Gruß
Rene
 
danke, werd ich mal durchlesen :)

muss mir ja irgendwie die zeit vertreiben während ich auf meinen Caanoo warte ;)
 
Also welchen Stil du dir angewöhnst ist echt nicht wichtig. Hauptsache du hast irgendwann ein durchgängigen Stil, damit du selbst besser deinen Code überblicken kannst. Du kannst auch nen abstraktes "Kunstwerk" aus deinem Programmcode machen ;)

Und wenn wir schon mal dabei sind Tipps zu geben. Ich kann dir das Kommentieren deines Codes herzlichst empfehlen. So kannst du später, wenn du mal nach Jahren/Monaten wieder dein altes Programm siehst, viel schneller nachvollziehen, was du denn damals so gemacht hast. Auch wenn du im Team arbeitest oder du deinen Quellcode veröffentlichen willst, ist es immer für den Dritten einfacher da durch zu blicken ;)

Ansonsten Toi Toi Toi, du schaffst es ;)
 
und da bin ich wieder...

Im moment habe ich nicht wirklich ein großes Problem, sondern eine Frage..

und zwar: Welche Möglichkeiten gibt es in einem Auswahlmenü außer dem "goto" ?

Wird ja ziemlich unübersichtlich, wenn ich das bei jedem Menü so löse...
 
Hi,
naja mit GOTO ist das, meiner Meinung nach kein guter Weg. In meinem derzeitigen Projekt habe ich das mit State-Variablen gelöst, einfach ein variable definieren die speichert in welchem Menü du gerade bist (z.B. hauptmenü 0,Spiel laden 1 USW.). Dann die Darstellungen und Tastaturabfragen mit switch ;) verschachteln.
Das ist jetzt mein Weg, vllt. Auch nicht der beste aber er funktioniert und ich komm damit klar!

p.s.: Jabb ich liebe switch-Anweisungen!!!! :)
 
hm.... okay :)

danke für die Idee, werds gleich mal so probieren (mir raucht der Kopf, wie. :p )
 
Hi,

goto = böse, Adolf, Krieg, Teufel, Hülle .......

Zu einem ist die Lösung Switch und der zweite Teile ist Funktionen zu machen, die du dann immer wieder aufrufen kannst wenn du sie brauchst. Funktionen sind aber sowieso ein muss, denn du kannst davon ausgehen das jeder Coder der länger als ca. eine Bildschirmseite ist unleserlich wird.

Schönen Gruß
Rene
 
Am besten ist es außerdem, du speicherst deine Texte nicht im Quellcode, sondern legst dir externe Dateien dafür an. Auch die Auswahlmöglichkeiten und die daraus resultierenden nächsten Texte könntest du auslagern und so einen sehr kurzen Code bekommen. Außerdem musst du dann natürlich nicht jedes mal neu kompilieren, wenn du etwas an der Story änderst.

Brauchst du Beispielcode dazu, oder verstehst du was ich meine?
 
Verstehen tu ichs schon, aber ich hab absolut keine Ahnung wie das umzusetzten ist... so gut bin ich noch nicht ;)

mit einem Beispiel wäre mir echt geholfen :)
 
Back
Top