Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
.wired Mini JLI'ler
Alter: 34 Anmeldedatum: 18.10.2006 Beiträge: 3 Wohnort: Diekholzen Medaillen: Keine
|
Verfasst am: 27.05.2007, 16:35 Titel: if - else |
|
|
Hi, ich hab ein dickes Problem mit if-else. Ich bin nicht wirklich geübt im programmieren, da ich grade erst angefangen habe, und hoffe, dass ich niemanden mit dieser Lapaille aufrege. Ich habe bereits in dem Programm 30 Fehler ausgemerzt, so dass es keine Syntaxfehler mehr gibt. Aber ich komme einfach nicht mit dem String "Antwort" zurecht. Wenn man in der .exe bei der ersten Frage 2 drückt, beendet er das programm, und gibt nicht die Promillewerte mit den Auswirkungen aus. Vielen Dank im Voraus.
PS.: die Umlaute sind im Programm bereits weg
Code: | int main(void)
{
int Antwort;
cout << "Willkommen zum alc_tester.\nHier koennen Sie ihren Blutalkoholgehalt"
"berechnen und etwas ueber Alkohol \nerfahren. Moechten Sie zuerst"
"ihren Promillewert berechnen \noder etwas ueber Alkohol, seine "
"Auswirkungen und noch einiges Interessantes \nerfahren???"
"Bitte geben Sie die entsprechende Zahl ein und druecken Sie Enter\n \n \n \n";
cout << "1. Ich will meinen Blutalkoholgehalt berechnen\n"
"2. Ich will etwas ueber Alkohol erfahren\n"
"3. Beides\n\n\n\n";
cin >> Antwort;
if(Antwort==1)
{
int Antwort2;
cout << "Sind Sie maennlich oder weiblich? \n\n";
cout << "1. Maennlich \n";
cout << "2. Weiblich \n";
cin >> Antwort2;
if(Antwort2==1)
{
r=0,7;
cout << "Bitte geben Sie ihr Gewicht ein (bitte nur als Zahl) \n";
cin >> Gewicht;
cout << "Bitte geben Sie die Menge in Liter an, die Sie getrunken"
"haben (ohne l) \n";
cin >> Menge;
cout << "Zuletzt brauchen wir nur noch den Alkoholgehalt des"
"Getraenks, welches Sie getrunken haben (in Prozent, aber"
"ohne das Zeichen %";
cin >> GetraenkeProzent;
// Berechnung
A = ( ( Menge / 100 ) * GetraenkeProzent ) * 0,8;
c=A/(r*Gewicht);
cout << "Ihr Promillewert betraegt " << c;
};
else if(Antwort2==2)
{
r=0,6;
cout << "Bitte geben Sie ihr Gewicht ein (bitte nur als Zahl) \n";
cin >> Gewicht;
cout << "Bitte geben Sie die Menge in Liter an, die Sie getrunken"
"haben (ohne l) \n";
cin >> Menge;
cout << "Zuletzt brauchen wir nur noch den Alkoholgehalt des"
"Getraenks, welches Sie getrunken haben (in Prozent, aber"
"ohne das Zeichen %";
cin >> GetraenkeProzent;
// Berechnung
A = ( ( Menge / 100 ) * GetraenkeProzent ) * 0,8;
c=A/(r*Gewicht);
cout << "Ihr Promillewert betraegt" << c;
};
};
else if(Antwort==2)
{
cout << "Auswirkungen einiger Promillewerte (ohne Gewaehr) \n";
cout << "0,3 Promille: man beginnt, die Wirkung des Alkohols zu spueren \n";
cout << "0,5 Promille: deutliches Waermegefühl, Anheiterung \n";
cout << "0,8 Promille: deutlich eingeschraenkte Reaktionsfaehigkeit \n";
cout << "1,0 Promille: Konzentrations- und Koordinationsschwierigkeiten, ";
cout << "Beeintraechtigung der Muskelkontrolle und des Gleichgewichts, erste Sprachstoerungen \n";
cout << "1,5 Promille: starke Betrunkenheit \n";
cout << "2,0 Promille: unkontrolliertes Torkeln, Vollrausch, Erbrechen \n";
cout << "2,5 Promille: ab hier besteht Lebensgefahr \n";
cout << "3,0 Promille: man kann sich nicht mehr aufrecht halten, verliert das Bewusstsein \n";
cout << "4,0 Promille: tödliche Dosis \n";
};
}; |
MfG .wired |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 27.05.2007, 16:57 Titel: |
|
|
Hi
entferne mal alle ; hinter den }.
Die gehören da nämlich nicht hin
Falls du meinst, dass sich das Fenster sofort wieder schließt nachdem der Text ausgegeben wurde dann guck dir das mal an:
http://www.c-plusplus.de/forum/viewtopic-var-t-is-111042.html _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
.wired Mini JLI'ler
Alter: 34 Anmeldedatum: 18.10.2006 Beiträge: 3 Wohnort: Diekholzen Medaillen: Keine
|
Verfasst am: 27.05.2007, 17:22 Titel: |
|
|
Hey
Danke für die Antwort, aber mein Problem ist, dass der Text eben NICHT ausgegeben wird und das programm ohne Text beendet wird...
MfG .wired _________________ |||||||||| www.masterplane.de ||||||||||
Was die Natur nicht schafft, erledigt der Mensch für sie... |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 27.05.2007, 17:32 Titel: |
|
|
hm..evtl. schließt sich das Programm einfach nur so schnell das du den Text gar nicht mehr siehst?
Schreib einfach mal ein
CPP: | std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get(); |
ans Ende.
Bei mir funktioniert das. _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
pc-dau2 Mini JLI'ler
Anmeldedatum: 26.05.2007 Beiträge: 6
Medaillen: Keine
|
Verfasst am: 27.05.2007, 17:36 Titel: |
|
|
Hi,
und das Programm lässt sich fehlerfrei übersetzen?
Kommawerte müssen nen Punkt als Trennzeichen haben.
Dann frage ich mich wo und wie du die Variablen deklariert hast die du benutzt!? |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 27.05.2007, 17:48 Titel: |
|
|
51m0n hat Folgendes geschrieben: | hm..evtl. schließt sich das Programm einfach nur so schnell das du den Text gar nicht mehr siehst?
Schreib einfach mal ein
CPP: | std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get(); |
ans Ende.
Bei mir funktioniert das. |
Dass das Funktioniert ist allerdings hoch Implementationsabhängig. Man sollte lieber darauf achten das keine unnötigen Reste im Puffer bleiben. |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 27.05.2007, 17:54 Titel: |
|
|
Wie wärs eigentlich wenn man am Schluss einfach sowas hinschreibt:
Code: | cout << "Drücken sie Enter um das Programm zu beenden";
int i;
cin >> i; |
Nur so ein Gedanke. |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 27.05.2007, 18:07 Titel: |
|
|
Wenn noch Reste im Puffer von cin stehen hat das keinen Sinn. Die müssen erst raus. Aber nicht auf die Weise von 51m0n. Lieber den ganzen Unsinn auslesen ohne das ein Fehler auftritt.
CPP: | if ( !cin.good() )
{
std::string tmp;
cin.clear();
getline( cin, tmp );
}
cin.get();
|
grüße
Zuletzt bearbeitet von David am 27.05.2007, 18:26, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
51m0n JLI'ler
Alter: 33 Anmeldedatum: 06.01.2006 Beiträge: 167 Wohnort: Erkelenz Medaillen: Keine
|
Verfasst am: 27.05.2007, 18:09 Titel: |
|
|
Was spricht gegen meine Lösung? _________________ Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 27.05.2007, 18:13 Titel: |
|
|
Weil die Lösung nicht portabel ist und darum vermieden werden soll. Es gibt Implementationen bei denen in_avail() "falsche" Werte zurückliefert. Drum sollte man sich eine bessere Lösung suchen.
Alternativ wäre auch folgendes Möglich:
CPP: | std::cin.clear();
std::cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
|
Zuletzt bearbeitet von David am 27.05.2007, 18:45, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
manu Super JLI'ler
Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 27.05.2007, 18:19 Titel: |
|
|
wie stehst mit?
CPP: | std::cin.seekg(0, std::ios::end);
std::cin.clear();
std::cin.get();
|
so hat das glaub mal DXer hier gepostet, wenn mich nicht alles täuscht und seitdem verwende ich es auch so und bin recht zufrieden^^ |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 27.05.2007, 18:31 Titel: |
|
|
Wenn dann zuerst cin.clear(). Aber das wird auch nicht funktionieren. |
|
Nach oben |
|
|
.wired Mini JLI'ler
Alter: 34 Anmeldedatum: 18.10.2006 Beiträge: 3 Wohnort: Diekholzen Medaillen: Keine
|
Verfasst am: 27.05.2007, 20:09 Titel: problem behoben ;) |
|
|
Hi,
Vielen Dank an euch alle für eure Hilfe. Da ich noch nicht so weit bin, dass ich die Funktionsweise von "den Puffer von cin rausmachen" ( sorry, wusste nicht, wie ich es sonst schreiben soll ), und gerne nur das erstmal machen würde, was ich auch verstehe, hab ich vorerst nur Otschos Vorschlag ausprobiert, und siehe da, es funktioniert . THX an euch alle
MfG .wired
Ps.: Wieder was gelernt _________________ |||||||||| www.masterplane.de ||||||||||
Was die Natur nicht schafft, erledigt der Mensch für sie... |
|
Nach oben |
|
|
manu Super JLI'ler
Alter: 35 Anmeldedatum: 09.03.2006 Beiträge: 327 Wohnort: allgäu (DE) Medaillen: Keine
|
Verfasst am: 27.05.2007, 22:24 Titel: |
|
|
David hat Folgendes geschrieben: | Wenn dann zuerst cin.clear(). Aber das wird auch nicht funktionieren. |
wieso zu erst das clear?
so wie es jetzt ist funktioniert es auf jeden Fall bestens |
|
Nach oben |
|
|
David Super JLI'ler
Alter: 39 Anmeldedatum: 13.10.2005 Beiträge: 315
Medaillen: Keine
|
Verfasst am: 28.05.2007, 06:00 Titel: |
|
|
Nein es wird definitiv nicht funktionieren. Nämlich dann nicht wenn eine Fehlerhafte Eingabe vorangegangen ist. Die Methode clear() löscht die Fehlerbits, bevor das nicht getan wurde schlagen alle weiteren Aufrufe erstmal fehl, drum auch zuerst clear. Und seekg ist für stdin total irrelevant.
Die Lösung funktioniert nicht! Probiers doch einfach aus.
Wie gesagt, am besten man regelt die Eingaben so das keine Reste im Puffer bleiben, also per String einlesen.
CPP: | template< typename T, typename S >
T lexical_cast( const S& src )
{
std::stringstream cnv;
T result;
if ( !( cnv << src && cnv >> result && ( cnv >> std::ws ).eof() ) )
{
throw std::logic_error( "lexical_cast failed" );
}
return result;
}
int main()
{
std::string line;
int i = 0;
try
{
std::getline( std::cin, line );
i = lexical_cast< int >( line );
}
catch ( const std::logic_error& e )
{
std::cout << "Error: " << e.what() << std::endl;
}
std::cout << i;
std::cin.get();
}
|
Alternativ bietet boost noch eine viel bessere Implemtation für lexical_cast an. Wer den Umweg nicht über den stringstream gehen will verwendet ignore( +große nummer ).
CPP: | int main()
{
int i = 0;
std::cin >> i;
if ( !std::cin.good() )
{
std::cin.clear();
}
std::cout << i;
std::cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n' );
std::cin.get();
}
|
Oder eben per getline versuchen die letzten Reste rauszulesen.
CPP: | int main()
{
int i = 0;
std::cin >> i;
if ( !std::cin.good() )
{
std::cin.clear();
}
std::cout << i;
std::string tmp;
std::getline( std::cin, tmp );
std::cin.get();
}
|
Mit den beiden letzten Lösungen sollte man sogar bei der Konsole gut fahren, da die Eingaben ja Zeilenweise gemacht werden.
grüße |
|
Nach oben |
|
|
|