JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=95a692be318f23c33bae041d13324872Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

if - else
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
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

BeitragVerfasst am: 27.05.2007, 16:35    Titel: if - else Antworten mit Zitat

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 Wink

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 16:57    Titel: Antworten mit Zitat

Hi
entferne mal alle ; hinter den }.
Die gehören da nämlich nicht hin Wink
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
Benutzer-Profile anzeigen Private Nachricht senden
.wired
Mini JLI'ler


Alter: 34
Anmeldedatum: 18.10.2006
Beiträge: 3
Wohnort: Diekholzen
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:22    Titel: Antworten mit Zitat

Hey

Danke für die Antwort, aber mein Problem ist, dass der Text eben NICHT ausgegeben wird und das programm ohne Text beendet wird... Sad

MfG .wired
_________________
|||||||||| www.masterplane.de ||||||||||

Was die Natur nicht schafft, erledigt der Mensch für sie...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
pc-dau2
Mini JLI'ler



Anmeldedatum: 26.05.2007
Beiträge: 6

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:36    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Otscho
Super JLI'ler


Alter: 36
Anmeldedatum: 31.08.2006
Beiträge: 338
Wohnort: Gummibären-Gasse
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 17:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:07    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
51m0n
JLI'ler


Alter: 33
Anmeldedatum: 06.01.2006
Beiträge: 167
Wohnort: Erkelenz
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:09    Titel: Antworten mit Zitat

Was spricht gegen meine Lösung?
_________________
Teigwaren
heißen Teigwaren,
weil sie früher einmal Teig waren
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:13    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
manu
Super JLI'ler


Alter: 35
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 18:31    Titel: Antworten mit Zitat

Wenn dann zuerst cin.clear(). Aber das wird auch nicht funktionieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
.wired
Mini JLI'ler


Alter: 34
Anmeldedatum: 18.10.2006
Beiträge: 3
Wohnort: Diekholzen
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 20:09    Titel: problem behoben ;) Antworten mit Zitat

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 Wink ), und gerne nur das erstmal machen würde, was ich auch verstehe, hab ich vorerst nur Otschos Vorschlag ausprobiert, und siehe da, es funktioniert Wink. THX an euch alle Wink

MfG .wired

Ps.: Wieder was gelernt Wink
_________________
|||||||||| www.masterplane.de ||||||||||

Was die Natur nicht schafft, erledigt der Mensch für sie...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
manu
Super JLI'ler


Alter: 35
Anmeldedatum: 09.03.2006
Beiträge: 327
Wohnort: allgäu (DE)
Medaillen: Keine

BeitragVerfasst am: 27.05.2007, 22:24    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
David
Super JLI'ler


Alter: 39
Anmeldedatum: 13.10.2005
Beiträge: 315

Medaillen: Keine

BeitragVerfasst am: 28.05.2007, 06:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum