PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wieso funktioniert das nicht?


Azzi
01.06.2002, 00:04
der folgende code funktioniert irgendwie nicht, beim compilieren kommt kein fehler. beim ausführen geht er über "cin >> einkauf;" hinweg. ich hab keine ahnung wo dran das liegt



#include <iostream.h>

void main(void)
{
int cola = 7;
int wasser = 5;
int kosten;
char einkauf;
int anzahl;

cout << "Ein Kasten Wasser kostet 5 Euro\n";
cout << "Ein Kasten Cola kostet 7 Euro\n";
cout << "Was moechten sie kaufen?\n";
cin >> einkauf;
cout << "Wieviel wollen Sie?\n";
cin >> anzahl;

if (einkauf = cola)
{
cout << "Das kostet " << anzahl*cola << "Euro.\n";
cout << "Vielen Dank fuer ihren Einkauf!\n";

}

else if (einkauf = wasser)
{
cout << "Das kostet " << anzahl*wasser << "Euro.\n";
cout << "Vielen Dank fuer ihren Einkauf!\n";
}

else
{
cout << "Bitte ueberprüfen sie ihre Eingabe.\n";
}

}


StoreMaster
01.06.2002, 00:54
hallo!

das ist wirklich keine grosse sache.
verwende bei den if- bedingungen statt dem = mal ein == ;)

wirst bald einen unterschied bemerken.... :)

Azzi
01.06.2002, 11:50
nee, das hats leider nicht gebracht, der erkennt die tastatur eingabe nicht an

Netter Troll
01.06.2002, 12:21
Hi!

Wo lernst du C++? Besorg dir schnellstens ein anderes Buch oder Tutorial ;)
Die Headerdatei für Stream I/O heisst iostream nicht iostream.h und der Rückgabewert von main ist int, nicht void.

Die Variable "einkauf" speichert nur einen Buchstaben, und diesen willst du mit dem Verkaufspreis vergleichen? Einen Vergleich kannst du mit == machen wie StoreMaster dir schon gesagt hat, aber der Vergleich ist trotzdem unsinnig. Probier mal etwas wie dieses hier:


#include <iostream>
#include <string>

int main() {
int cola = 7;
int wasser = 5;
std::string einkauf;
int anzahl = 0;

std::cout << "Ein Kasten Wasser kostet 5 Euro\n";
std::cout << "Ein Kasten Cola kostet 7 Euro\n";
std::cout << "Was moechten sie kaufen?\n";
std::getline(std::cin, einkauf);
std::cout << "Wieviel wollen Sie?\n";
std::cin >> anzahl;

if (einkauf == "Cola") {
std::cout << "Das kostet " << anzahl*cola << "Euro.\n";
std::cout << "Vielen Dank fuer ihren Einkauf!\n";
} else if (einkauf == "Wasser") {
std::cout << "Das kostet " << anzahl*wasser << "Euro.\n";
std::cout << "Vielen Dank fuer ihren Einkauf!\n";
} else {
std::cout << "Bitte ueberprüfen sie ihre Eingabe.\n";
}
return 0;
}

Azzi
01.06.2002, 12:37
ich lerne c++ erst seit montag, vorher hatte ich ein bischen c gemacht. buch habe ich und einige tuts.
bei deiner version bricht er nach der abfrage der anzahl mit überprüfen sie ihre eingabe ab

ich schreib das nur so wie ich es in dem buch gelernt habe

Netter Troll
01.06.2002, 12:43
Was gibt's du denn bei

Was moechten sie kaufen?

ein? Du musst dort Wasser oder Cola eingeben. Wie hattest du dir das denn sonst vorgestellt? Also bei mir funktionierts so.

Azzi
01.06.2002, 12:47
ich hatte cola klein geschrieben. und das hatte er nicht anerkannt

xOOn
01.06.2002, 13:19
der Rückgabewert von main ist int, nicht void.


soviel wie ich weiss funkt void auch (zumindest in linux) nur das SOLLTE man nicht machen weil der exitcode dann alles moeglichr sein kann und am ende soll man aus dem selben frund beim main return 0 schreben

StoreMaster
01.06.2002, 15:58
@Netter Troll
und wo hast du c/c++ gelernt ;) . includes sind headerdatein. so, lt. ansi-c wäre das #include <stdio.h> bzw. <iostream.h> für c++. wo liegt da das problem?

das mit dem rückgabewert int stimmt so auch nicht ganz. es stimmt alles was x00n gesagt hat, nur fehlt noch, dass void immer nocht gültig ist, nur dass es demnächst verschwinden wird. aber es treten unter win mit sicherheit keine probleme auf.

bin mir ausserdem net ganz sicher, aber ich glaube zu meinen dass strings nicht mittels == verglichen werden können. ich nehme dazu strcmp(..., ...)


#include <iostream.h>
#include <string.h>

int main(void)
{
int cola = 7;
int wasser = 5;
int kosten = 0;
char *pEinkauf = (char*)malloc(sizeof(char*));
int anzahl;

cout << "Ein Kasten Wasser kostet 5 Euro\n";
cout << "Ein Kasten Cola kostet 7 Euro\n";
cout << "Was moechten sie kaufen?\n";
cin >> einkauf;
cout << "Wieviel wollen Sie?\n";
cin >> anzahl;

if (strcmp(einkauf, "cola"))
{
cout << "Das kostet " << anzahl*cola << "Euro.\n";
cout << "Vielen Dank fuer ihren Einkauf!\n";

}

else if (strcmp(einkauf, "wasser"))
{
cout << "Das kostet " << anzahl*wasser << "Euro.\n";
cout << "Vielen Dank fuer ihren Einkauf!\n";
}

else
{
cout << "Bitte ueberprüfen sie ihre Eingabe.\n";
}
return 0;
}

und somit funktioniert dieser code bei mir ohne weitere probleme mit dem vc++ compiler....

Netter Troll
01.06.2002, 16:47
Nein, nach dem aktuellen Standard heisst die Header-Datei für C++ "iostream" nicht "iostream.h". Die Header-Dateien mit der .h Endung sind veraltet und sollte nicht mehr benutzt werden. Es wurden Änderungen durchgeführt, unter anderem wurde die komplette STL in den Namensraum "std" verlegt. Siehe dazu:

http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=iostream#Answ

Zum void main:

http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=main#Answ

Es gibt natürlich keine Probleme bei der Ausführung, aber ein aktueller/strenger Compiler sollte void main verbieten oder zu mindest eine Warnung ausgeben.

Zu dem Code: Warum mischt du C und C++? Wenn's möglich ist sollte man das nicht tun. Zu C++ gehört new, nicht malloc und auch auf char-Arrays sollte man verzichten. Dafür gibt's die Klasse std::string (Headerdatei "string"), womit auch Stringvergleiche mit dem == Operator möglich sind. Außerdem sieht das hier nicht gerade glücklich aus:

char *pEinkauf = (char*)malloc(sizeof(char*));

Damit allozierst du nur 4 Bytes Speicher. Ist die Eingabe länger als 4 Zeichen stürtzt das Programm ab (wenn du Glück hast)

StoreMaster
01.06.2002, 16:56
das mit der warnung für void sehe ich genauso wie du.

zum mischen. ich mische es prinzipiell nicht.... ich habe seinen code nur verändert. ich bewege mich immer ( muss ich beim arbeiten, da wir c und c++ codes mischen) im ansi-c standart.
ja das mit dem malloc war unglücklich, hab halt das *2 vergessen....aber egal...

xOOn
01.06.2002, 16:59
also es gibt beide (iostream)!

wenn man std verwendet dass hat das .h nix zu suchen!!


und man kann strings vergleichen nur keine pointer auf char

also
der std::string hat den +, = [] operator und so weiter und das alles auch fuer die char * dashalb funkt es auch, lustiger wirds wenn mans so schreibt

std::string s;

if ("Hallo" == s)

muss mal schauen ob das funkt glaube aber nicht. wenn er sich compilen laesst dann funkts, weil string keine implizite konvertierung nach char * besitzt sondern du darfst ueber c_str () gehen!


wenn man nun 2 char * hat, dann kann man auch die if abfrage machen, nur wird dann der zeiger und nicht der inhalt verglichen!!

xOOn
01.06.2002, 17:01
Damit allozierst du nur 4 Bytes Speicher. Ist die Eingabe länger als 4 Zeichen stürtzt das Programm ab (wenn du Glück hast

windows hat da coole effekte wenn du pech hast stuetzt er ab und zu ab oder aendert dir andert vars cool nicht ?

Netter Troll
01.06.2002, 17:05
ja das mit dem malloc war unglücklich, hab halt das *2 vergessen....aber egal...

Öhm, wie kommst du jetzt auf * 2? Das bringt's doch auch nicht.
Wenn schon C, dann würde ich einen großen Buffer nehmen und die Eingabe mit fgets einlesen, dort kannst du nämlich die Größe des Buffers festlegen und man ist auf der sicheren Seite:


char eingabe[256];
fgets(eingabe, 256, stdin);

Netter Troll
01.06.2002, 17:10
Ich bezeichne es als Glück, wenn das Programm abstürtzt, dann merkt man nämlich den Fehler frühzeitig und kann ihn beheben.

Und sowas funktioniert, hab's ja auch in meinem Code benutzt

std::string s;
if ("Hallo" == s)

xOOn
01.06.2002, 18:36
@Netter Troll jepp das ist gut wenn er abstuertzt weil die fehler findet man sonst nie

Bolle
01.06.2002, 23:58
hmm ich würde dir mal den den tipp geben den eingabespeicher zu löschen, dass machst du mit den beiden methoden cin.sync(); und cin.clear() , die sind ebenfalls in der iostream klasse definiert

cin >> einkauf;
cout << "Wieviel wollen Sie?\n";
cin.sync(); cin.clear();
cin >> anzahl;

dann sollte es auch funktionieren, wenn ich dich recht verstehe