Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
09.02.11, 23:31
|
#1
|
Newbie
Registriert seit: Nov 2010
Ort: PL
Beiträge: 83
Bedankt: 48
|
Wo ist der Fehler?
Hallo Leute,
ich probiere gerade ein bisschen rum, jedoch erkenne ich den Fehler nicht. Es wird immmer das 1. Ereignis ausgegben von bomk für bong und pstar?
Was ist daran verkehrt?
Code:
#include <iostream>
using namespace std;
void main()
{
int Namen;
int bomk=1, bong=1, pstar=1;
cout <<"Welchen Namen möchten Sie benutzen?:\nbomk\nbong\npstar\n\n";
cin >> Namen;
if (Namen = bomk)
{
cout << "Low";
}
else if (Namen = bong)
{
cout << "Test";
}
else if (Namen = pstar)
{
cout << "Bla";
}
system("pause");
}
|
|
|
09.02.11, 23:39
|
#2
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
if(x == y)
|
|
|
10.02.11, 00:31
|
#3
|
Newbie
Registriert seit: Nov 2010
Ort: PL
Beiträge: 83
Bedankt: 48
|
funktioniert nicht, dann gibts beispielsweise bei bong überhaupt keine Ausgabe mehr
|
|
|
10.02.11, 01:04
|
#4
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 8
Bedankt: 1
|
Was willst Du überhaupt machen?
Der Code im ersten Post hat gleich mehrere Fehler!
1. = ist eine Zuweisung, kein Vergleich
In deiner ersten if weist Du der Variablen Namen den Wert von bomk (1) zu.
Die Bedinung ist dann erfüllt (true), wenn der Inhalt der beiden Variablen nicht 0 ist.
Sprich: Im Moment setzt du Namen=1, damit ist die Bedingung erfüllt.
Würdest Du bspw. if(Namen=0) schreiben, wäre die Bedingung nicht erfüllt.
2. Du willst einen Vergleich machen, deshalb musst Du == schreiben.
if(Namen == bomk) ist schonmal richtiger, aber an sich immernoch falsch.
Um mal in Worten zu erklären, was dein Programm aktuell macht:
Du deklarierst die Integer-Variable Namen, weist ihr aber noch keinen Wert zu.
Du deklarierst die Variablen bomk, bong und pstar und initialisierst sie alle mit dem Wert 1.
Du hast jetzt also an sich 3 identische Variablen.
Jetzt liest du von der Konsole einen Wert ein und speicherst ihn in der Variablen Namen.
So weit so gut, aber jetzt:
Du prüfst im ersten Fall, ob der Inhalt (!) der Variablen Namen mit dem Inhalt (!) der Variablen bomk übereinstimmt.
Das ist der Fall, wenn der User in der Konsole die 1 eingetippt hat, weil du ja bomk=1 initialisiert hast.
Wenn der User aber nicht die 1 sondern bspw. die 2 eintippt, dann ist diese Bedingung nicht erfüllt, (weil der Inhalt von Namen ist 2, der Inhalt von bomk ist 1).
Also gehts weiter im Code.
Jetzt wird verglichen, ob der Inhalt der Variablen Namen mit dem Inhalt der Variablen bong übereinstimmt. Du hast bong aber mit 1 initialisiert.
Der Fall, dass Namen == 1 ist, ist aber schon bei bomk abgearbeitet worden.
Stattdessen müsstest Du also nur bong mit 2 und pstar mit 3 initialisieren (und natürlich als user 1,2 oder 3 eingeben).
Und nicht vergessen, bei allen if-Vergleichen zwischen die Variablen ein == statt ein = zu setzen.
Damit sollte es dann funktionieren
|
|
|
10.02.11, 01:13
|
#5
|
Newbie
Registriert seit: Nov 2010
Ort: PL
Beiträge: 83
Bedankt: 48
|
Das Problem ist aber, das ich nicht 1,2 oder 3 eingeben möchte, sondern die Nicknames
|
|
|
10.02.11, 01:21
|
#6
|
Ist öfter hier
Registriert seit: Sep 2010
Beiträge: 276
Bedankt: 280
|
Warum deklarierst Du sie dann als Integer und nicht als String?
|
|
|
10.02.11, 01:34
|
#7
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 8
Bedankt: 1
|
Dann funktioniert das so mal ganz und gar nicht...
Du willst also einen Text als User eingeben und versuchst den dann in Namen zu speichern. Namen ist aber vom Typ int, also vorzeichenbehaftete Ganzzahlen (~~-4 Mio, ... -1, 0, 1, 2, ... ~~4Mio)
Darin kannst Du also den eingelesenen Kram gar nicht speichern. Eigentlich sollte dir das ganze so einen Laufzeitfehler produzieren. Du musst die eingelesenen Daten also entweder in einem char-Array oder einem string speichern (string = Zeichenkette, nicht das was Du jetzt wieder denkst).
Aufgrund deiner bisherigen Probleme, nehme ich mal an, dass Du relativ frisch in C++-Programmierung bist, weshalb wir das mit dem Array erst mal hinten anstellen (Du wirst im weiteren Verlauf bei halbwegs effektiver Programmierung eh nicht dran vorbei kommen:-P )
Du brauchst also den Datentyp string. Den gibts in C++ nicht einfach so standardmäßig, deshalb muss der erst eingebunden werden
Dann kannst Du ihn wie jeden anderen Datentyp auch verwenden
string Namen;
Auch die drei anderen Variablen (bomk und Co.) kannst Du löschen (ein Glück. Ich musste JEDESmal hochscrollen um zu gucken, wie die jetzt heißen).
Stattdessen codierst Du die möglichen Namen einfach hart in den Programmcode. (Das wirst Du später anders machen [wollen], aber jetzt ists einfacher und führt auch zum Ergebnis.)
Dann wäre noch zu sagen, dass Du den Inhalt, den Du in string-Variablen schreibst (oder damit vergleichst etc.) immer hin doppelte Anführungsstriche " setzen musst.
Namen = "bomk"; speichert also bomk selber in der Variablen.
Namen = bonk; würde hingegen den Inhalt (!) der Varbiablen bonk in Namen speichern.
Der Code müsste dann in etwa so aussehen:
Code:
#include <iostream>
#include <string>
using namespace std;
void main()
{
string Namen;
cout <<"Welchen Namen möchten Sie benutzen?:\nbomk\nbong\npstar\n\n";
cin >> Namen;
if (Namen == "bomk")
{
cout << "Low";
}
else if (Namen == "bong")
{
cout << "Test";
}
else if (Namen == "pstar")
{
cout << "Bla";
}
system("pause");
}
Ich hab den Code jetzt allerdings nicht getestet ;-)
|
|
|
10.02.11, 01:46
|
#8
|
Newbie
Registriert seit: Nov 2010
Ort: PL
Beiträge: 83
Bedankt: 48
|
Funktioniert einwandfrei, danke für die Hilfe
Ja ich bin relativ frisch (seit ungefähr 2 Tagen  )
|
|
|
10.02.11, 01:52
|
#9
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 8
Bedankt: 1
|
Bitte, gerne :-)
Noch das obligatorische: Wenn Du wirklich lernen willst wie das geht, dann leg Dir mal ein gutes Buch zu. Ich weiß, alle schreien bei sowas gleich nach Büchern. Aber ich hab die Erfahrung gemacht, dass man am besten lernt, wenn man schrittweise vorgeht und nicht als allererstes mal zusätzliche Klassen (string ;-) ) einfügt.
Im Zweifel einfach mal bei Wiki-Books C++ eintippen. Ich denke der Wunsch nach einem vernünftigen (gedruckten) Lehrbuch kommt mit der Zeit eh von alleine ;-)
Gruß und viel Spaß :-)
|
|
|
10.02.11, 06:33
|
#10
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
mit if bitte keine strings vergleichen, das könnte nach hinten losgehen.
Nutze stattdessen strcmp() oder ein C++ Äquivalent, sofern es eins gibt.
|
|
|
10.02.11, 07:37
|
#11
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Bei string ist normalerweise der ==-Operator so überladen, dass er ohne Probleme funktioniert. Ich würde es auf jeden Fall so lassen.
|
|
|
10.02.11, 15:36
|
#12
|
Ist öfter hier
Registriert seit: Sep 2010
Beiträge: 276
Bedankt: 280
|
Zitat:
Zitat von cjs
(string = zeichenkette, nicht das was du jetzt wieder denkst).
|
Nice
|
|
|
10.02.11, 15:39
|
#13
|
Banned
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
|
Oh das wusst ich nicht germgerm, sorry
|
|
|
11.02.11, 19:20
|
#14
|
Erfahrenes Mitglied
Registriert seit: Jul 2010
Beiträge: 489
Bedankt: 236
|
Hab zwar eher wenig Ahnung von C++, aber sollte man diesen ganzen If-Baum nicht einfach durch ein Switch-Case erstzen?
|
|
|
11.02.11, 19:28
|
#15
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 8
Bedankt: 1
|
Kann man durchaus machen. Viele Wege führen nach Rom.
Aber da der Threadersteller ja gerade erst eingestiegen ist, wollte ich ihm nicht erklären, warum er alles ganz anders machen sollte, sondern ihm bei seinem eigentlichen Problem (if-Bedingung) helfen.
|
|
|
12.02.11, 09:48
|
#16
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Zitat:
Zitat von Thelvan
Hab zwar eher wenig Ahnung von C++, aber sollte man diesen ganzen If-Baum nicht einfach durch ein Switch-Case erstzen?
|
Nein, geht nicht.
Switch kann im Case nur mit normalen Konstanten arbeiten.
|
|
|
12.02.11, 12:04
|
#17
|
Anfänger
Registriert seit: Nov 2010
Beiträge: 8
Bedankt: 1
|
Was sind denn "normale Konstanten"?
Schau Dir mal meine Lösung an ( [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ] ) die effective wohl auch übernommen hat. Dort stehen die Namen ja jeweils in " " fest im Code. Meinst Du das mit "normalen Konstanten"? Weil dieser Code müsste -meiner bescheidenen Meinung nach- absolut problemlos durch ein switch-case-Konstrukt ersetzt werden können.
Code:
#include <iostream>
#include <string>
using namespace std;
void main()
{
string Namen;
cout <<"Welchen Namen möchten Sie benutzen?:\nbomk\nbong\npstar\n\n";
cin >> Namen;
switch (Namen)
{
case "bomk":
cout << "Low";
break;
case "bong":
cout << "Test";
break;
case "pstar":
cout << "Bla";
break;
}
system("pause");
}
Aber auch dieser Code ist jetzt nicht getestet, weshalb ich (insbesondere Syntax-) Fehler nicht ausschließe ;-)
|
|
|
12.02.11, 12:34
|
#18
|
Banned
Registriert seit: Jan 2011
Beiträge: 16
Bedankt: 12
|
So dumm kann doch keiner sein!
Das muss ein Troll sein!
|
|
|
12.02.11, 17:32
|
#19
|
bla
Registriert seit: Mar 2010
Beiträge: 312
Bedankt: 302
|
Zitat:
Zitat von cjs
Weil dieser Code müsste -meiner bescheidenen Meinung nach- absolut problemlos durch ein switch-case-Konstrukt ersetzt werden können.
|
Das funktioniert vielleicht in C#, aber nicht in C++.
"bomk", "bong", "pstar" sind in C keine normalen Konstanten. Vereinfacht ausgedrückt sind das C-Strings, auf die ein Pointer zeigt.
|
|
|
02.03.11, 21:56
|
#20
|
Anfänger
Registriert seit: Jul 2009
Beiträge: 3
Bedankt: 2
|
jepp, wird nicht mit switch funktionieren.
switch funktioniert nur bei datentypen, die auf nen integer abgebildet werden können.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:25 Uhr.
().
|