Problem mit Do while-Schleife

  • Themenstarter Themenstarter ggf_razor
  • Beginndatum Beginndatum
G

ggf_razor

Hallo,
ich habe ein Programm erstellt, welches die Endgeschwindigkeit beim freien Fall bestimmt. Zudem habe ich einen Passwort-Schutz eingebaut, welcher auch funktioniert.
Nur bei der do while-Schleife hängt es ein bisschen. Wenn ich dann nämlich eine Fallhöhe eingebe welche nur 1stellig is funktionirt alles. Aber wenn ich zum Beispiel eine 4 Stellige Zahl eingebe, läuft die Schleife 5x durch und hält dann an, aber ein Ergebnis kommt dann nicht mehr zu stande.
Hier meine Source:
Code:
#include <cmath>
#include <iostream>

using namespace std;

double endgeschwindigkeit(int hoehe)
{
       const double g = 9.81;
       double ergebnis = sqrt(hoehe * 2.0 * g);
       return ergebnis;
}      

int main()
{
   
    string pw ;
cout << " Geben sie das Passwort ein: ";
cin >> pw;
cin.get();
if (pw != "passwort")
{
return 0;
}

char h;
do
{
     
    cout << endl;
    cout << "Nicos Programm zum Berechnen "
         << "der Endgeschwindigkeit beim freien Fall "
         << endl
         << " ********************************************************************"
         << endl << endl;
    cout << " Geben sie die Fallhoehe in Metern ein (b zum Beenden): ";
    
    cin >> h;
    cin.get();
    
    cout << endl;
    
    cout << " Endgeschw.: " << endgeschwindigkeit(h) << "m/s^2";   
    cout << endl << endl;
    } while ( h!= 'b');

return 0;
}

Habt ihr ne Idee was ich anders machen könnte..
 
Moin, jezt hab ichs:D^^

Deine Do - While ok,

Dein problem liegt darin:

Deine Variable h ist ein character. Undzwar nur ein Zeichen lang;) Klar, dass Probleme auftreten, denn Du kannst nicht eine eingabe von "300" (3 zeichen lang) in ein ein zeichen langes Char. Entweder ein Char Array :
C++:
char h[255]
doch dann musst du auf schleifen zurükgreifen, oder ganz einfach:
Nimm doch eine extra double Variable;)

Meine Lösung, kompiled und edited in Visual 2005:
Habe jezt die Lösung mit dem Array gewähl, hoffe du steigst da durch, wenn du hilfe brauchst, helfe ich gerne;)
C++:
#include <stdafx.h>
#include <cmath>
#include <iostream>
#include <string>

using namespace std;

double endgeschwindigkeit(char* hoehe)
{
	atoi(hoehe);
    double ergebnis;
	ergebnis = sqrt(*hoehe * 2.0 * 9.81);
    return ergebnis;
}      

int main()
{
char h[255];   
string pw ;
cout << " Geben sie das Passwort ein: ";
cin >> pw;

if (pw != "passwort")
{
	exit(0);
}

cout << endl;
cout << "Nicos Programm zum Berechnen "
     << "der Endgeschwindigkeit beim freien Fall "
     << endl
     << " ********************************************************************"
     << endl;

do
{   
	cout<< " Geben sie die Fallhoehe in Metern ein (b zum Beenden): "<<endl;
    cin >> h;    
    cout << endl;
    
    cout << " Endgeschw.: " << endgeschwindigkeit(h) << "m/s^2"<<endl;   
	 } while ( *h != 'b');

return 0;
}

MfG Dimitrij B.
 
Zuletzt bearbeitet von einem Moderator:
Meine Lösung, kompiled und edited in Visual 2005:
Nur das Testen hast du wohl vergessen ;)

C++:
double endgeschwindigkeit(char* hoehe)
{
	atoi(hoehe);
    double ergebnis;
	ergebnis = sqrt(*hoehe * 2.0 * 9.81);
    return ergebnis;
}
Du verwirfst den Rückgabewert von atoi und verwendest dann das erste Zeichen es C-Strings (*hoehe) für die Berechnung.

@ggf_razor: Du hast beim Einlesen des Passworts ja schon einen std::string verwendet. Was spricht dagegen, das in der Schleife auch wieder zu tun? Die Umwandlung in einen Zahlenwert kannst du dann z.B. mit einem std::stringstream umsetzen. Sieht dann vielleicht so aus:
C++:
#include <cmath>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

double endgeschwindigkeit(double hoehe)
{
    const double g = 9.81;
    double ergebnis = sqrt(hoehe * 2.0 * g);
    return ergebnis;
}  

int main()
{
    string pw;
    cout << "Geben sie das Passwort ein: ";
    getline(cin, pw);

    if (pw != "passwort") {
      return 0;
    }

    string input;
    while (true) {
        cout << endl;
        cout << "Nicos Programm zum Berechnen "
             << "der Endgeschwindigkeit beim freien Fall "
             << endl
             << " ********************************************************************"
             << endl << endl;
        cout << " Geben sie die Fallhoehe in Metern ein (b zum Beenden): ";

        getline(cin, input); // Eingabe einlesen
        if (!cin) break; // Auf Eingabefehler testen
        if (input == "b") break; // Auf Beendigungsbefehl testen

        stringstream ss(input);
        double h;
        if (ss >> h) { // Versuche, den String als double zu interpretieren...
          // ... bei Erfolg Berechnung durchführen
          cout << " Endgeschw.: " << endgeschwindigkeit(h) << "m/s^2";
          cout << endl << endl;
          cout << ss.str() << endl;
        } else {
          // ... bei Misserfolg Fehlermeldung ausgeben
          cout << " Eingabe fehlerhaft!";
          cout << endl << endl;
        }
    }

    return 0;
}
Es ist allerdings zu beachten, dass die Fehlermeldung nicht ausgegeben wird, wenn die eingelesene Zeile mit (der Dezimalentwicklung) einer Fließkommazahl beginnt und dahinter irgendwelcher Unsinn kommt. Wenn man möchte könnte man das aber auch noch abfangen.

Grüße, Matthias
 
Zuletzt bearbeitet von einem Moderator:
oh^^ mist, doch getestet hatte ich es:D Fiel mir nicht auf gestern, habe auf die ausgabe der Zahlen auch nicht geachtet, war spät;) Moment, ich repariere es mal;)

So, das ist eine bessere Variante;) Immer noch mit Arrays, und funktioniert auch;)
C++:
#include <stdafx.h>
#include <cmath>
#include <iostream>
#include <string>

using namespace std;

double endgeschwindigkeit(char hoehe[255])
{
	int buf;
	buf = atoi(hoehe);
	//cout<<"\t"<<buf<<endl;
    double ergebnis;
	ergebnis = sqrt(buf * 2.0 * 9.81);
    return ergebnis;
}      

int main()
{
char h[255];   
string pw ;
cout << " Geben sie das Passwort ein: ";
cin >> pw;

if (pw != "passwort")
{
	exit(0);
}

cout << endl;
cout << "Nicos Programm zum Berechnen "
     << "der Endgeschwindigkeit beim freien Fall "
     << endl
     << " ********************************************************************"
     << endl;

do
{   
	cout<< " Geben sie die Fallhoehe in Metern ein (b zum Beenden): "<<endl;
    cin >> h;    
    cout << endl;
    
    cout << " Endgeschw.: " << endgeschwindigkeit(h) << "m/s^2"<<endl;   
	 } while ( *h!= 'b');

return 0;
}
 
Zuletzt bearbeitet von einem Moderator:
aah... Vielen Dank, aber ist die Zeile nicht überflüssig:
C++:
int buf;
    buf = atoi(hoehe);
das würde es doch auch tun oder..? Weil cih will die Variable ja nicht weiterverwenden:
C++:
int atoi(hoehe);
 
Zuletzt bearbeitet von einem Moderator:
Überflüssig nicht un bedingt^^ Aber so wie du es hast auf keinen Fall;)

wenn dan so:
C++:
double endgeschwindigkeit(char hoehe[255])
{
    double ergebnis;
    ergebnis = sqrt(atoi(hoehe)* 2.0 * 9.81);
    return ergebnis;
}

atoi ist eine funktion, keine Variable, sie gibt einen Wert (int) zurpck, mit dem musst du ja arbeiten, ich habe den Integer wert wzischen gespeihcert gehabt in buf und damit gerechnet, du kannst jedoch auch drekt wie hier in der funktion, den character umwandeln und dan weter rechnen;) Somit ersparst du dir deine buffer variable;)
 
Zuletzt bearbeitet von einem Moderator:
So, das ist eine bessere Variante;) Immer noch mit Arrays, und funktioniert auch;)
Außer man gibt 255 oder mehr Zeichen ein. Dann entsteht ein Stapelüberlauf. Von daher würde ich von der Verwendung von C-Zeichenketten hier dringend abraten. Abgesehen davon zeigt deine Fassung ein etwas unerwartetes Verhalten, wenn man bei der Passwortabfrage z.B. "passwort 1 2 3" oder "passwort b" eingibt. Passwörter mit Leerzeichen sind so auch nicht möglich.

Grüße, Matthias
 
@ Matthias Reitinger: vollkomen einverstanden, doch wollt ich ggf_razor die Variante mit Arrays zeigen, schätze er lernt den Umgang mit Arrays gerage:) Um das sinnlose Passwordscript hab ich mich garnicht gekümmert, das ist nur ge-coppy-pastet von ggf_razor's Variante;)

@ggf_razor: Strings, ja obwohl man wohl kaum über 255 Zeichen eingeben würde in diesem Programm, empfielt es sich trozdem zum string zu greifen;) Dynamische länge, handhablich und vieles mehr:D

MfG Dimitrij
 
Wenn wir dir geholfen haben, würden sich die Beteiligten sicher freuen eine entsprechende Bewertung zu bekommen:)
 
Zurück