Fehler in einem Programm - Anfänger

  • [/size]

    Kann mir jemand sagen wo der Fehler liegt?
    Ich habe erst vor paar Tagen mit C++ begonnen. Habe das perfekte Buch gefunden für Einsteiger (Praktische C++ Programmierung von Steve Oualline (O'reilly!)). Einzigstes Manko: Zu den Programmierübungen sind keine Lösungen angegeben.

  • Zitat von Guardian

    soweit ich mich noch aus meinen c++ zeiten erinnere fehlt mir ein void main() der sogenannte programmeinsprungspunkt

    nein. void main() wuerde den standard verletzen. der OP hat es richtig gemacht
    und int main() verwendet. im geposteten code fehlt lediglich die '}' am ende.

    das problem liegt in den while scheifen. dort bleibt das programm je nach eingabe
    in einer endlosschleife haengen. ueberleg mal warum.

    ein weiteres problem sind die berechnungen der 5 2 und 1 cent muenzen.
    diese stimmen ueberhaupt nicht. schau dir an wie du es bei den 50, 20 und 10 cent
    muenzen gemacht hast.

    noch ein tip zum code:

    Code
    std::cout << anzahl_1 << " 1er.\n";

    wuerde ich mit:

    Code
    std::cout << anzahl_1 << " 1er." << std::endl;

    tauschen. das '\n' in einem string literal ist nicht so leserlich und der
    stream-manipulator std::endl flushed auch gleich den output.

    lg
    amok

  • Oh mansen...
    Ich sollt wirklich net mehr versuchen zu lernen wenn ich kaum die Augen auf halten kann :)

    Der Hauptfehler war das ich bei den Ifs und whiles die { } vergessen habe. Somit wurde immer nur die erste Anweisung befolgt.
    Dazu kam es bei den whiles auch zu einer Endlosschleife.

    Ausserdem sind die While Schleifen sowieso nicht nötig, habe das jetzt umgeschrieben in IF.

    Und zu guter letzt ist die Restwertbildungsmethode sowieso überflüssig. Ich habs bei den 5er, 2er und 1er nun gemacht wie bei 50er, 20er und 10er...

    Das Prog läuft und ich kann die nächste Übung angehen.

    Danke amok.




    P.S
    Diagonale eines Rechtecks ist Wurzel aus (a²+b²) richtig? Also das gleiche wie (a²+b²)^0.5

    Wie gebe ich diese Rechnung bei C++ ein? Ich hab zwar gelesen das man wurzeln mit sqrt() zieht, aber diesen Befehl kenn ich bisher noch nicht ;)

  • Zitat von ravaged


    Wie gebe ich diese Rechnung bei C++ ein? Ich hab zwar gelesen das man wurzeln mit sqrt() zieht, aber diesen Befehl kenn ich bisher noch nicht ;)

    Code
    #include <cmath>
    ...
    double a, b, c;
    ...
    c = std::sqrt( a*a + b*b );
    ...

    lg
    amok

    ps: wenn du sowas in c machst musst du die math library dazulinken. in c++
    ist es inzwischen in der standardlib drin, was das ganze erleichtert.

  • Hehe, sorry aber du hast nicht verstanden worauf ich hinauswollte.
    In dem Buch steht diese Übung sehr weit vorne. Es ist an dieser Stelle noch gar nicht erklärt worden wie man eine Wurzel zieht.
    Daher will ich sqrt() nicht benutzen :)

    Es muss einen anderen weg geben. (a*a + b*b)^0.5 ungefähr :)

  • Zitat von ravaged


    Es muss einen anderen weg geben. (a*a + b*b)^0.5 ungefähr :)

    Code
    #include <cmath>
    ...
    double a, b, c;
    ...
    c = std::pow(a*a + b*b, 0.5);
    ...

    der grosse vorteil hiervon bleibt mir aber leider verborgen :)

    lg
    amok

  • Zitat von ravaged

    Es muss noch einen anderen Weg geben. Ohne irgendwelche Includes..also denk dir das cmath mal weg...:D

    Dann verweise ich dich auf die Lva's fuer Numerische Mathematik sowie das
    exzelente Buch:
    [2002] William H. Press, Saul A. Teukolsky, William T. Vettering, Brian P. Flannery; Nummerical Recipies in C++; Cambridge University Press

    :P

    lg
    amok

  • also erst mal folgendes:
    du hast dein prog. mit "return(0);" beendet
    ...das funktionniert zwar, aber return ist KEINE funktion
    -> du solltest "return 0;" schreiben...ich habe in der htl den selben fehler gemacht worauf mich dann mein info-prof aufmerksam gemacht hat...

    Zitat von ravaged

    Hehe, sorry aber du hast nicht verstanden worauf ich hinauswollte.
    In dem Buch steht diese Übung sehr weit vorne. Es ist an dieser Stelle noch gar nicht erklärt worden wie man eine Wurzel zieht.
    Daher will ich sqrt() nicht benutzen :)

    Es muss einen anderen weg geben. (a*a + b*b)^0.5 ungefähr :)

    NEIN in c/c++ funktioniert das logischerweise nicht...
    in c wird zb. "a^2" in "a*a" umgewandelt...also einfach ausmultipliziert
    ...wie soll der compiler das aber mit 0.5 machen ?
    -> 2 möglichkeiten:
    1. du verwendest sqrt (egal ob's in dem buch schon erklärt wurde oder nich)
    2. du schreibst dir selbst eine wurzel(a, b) fkt.

    mfg

  • Zitat von marX

    also erst mal folgendes:
    du hast dein prog. mit "return(0);" beendet
    ...das funktionniert zwar, aber return ist KEINE funktion
    -> du solltest "return 0;" schreiben...ich habe in der htl den selben fehler gemacht worauf mich dann mein info-prof aufmerksam gemacht hat...

    das ist eine ziemlich irrelevante stilfrage. es hat ja auch niemand behauptet
    dass return eine funktion waere. die klammerung hier ist zwar nicht noetig,
    man findet diesen stil aber oefters.

    Zitat von marX


    NEIN in c/c++ funktioniert das logischerweise nicht...
    in c wird zb. "a^2" in "a*a" umgewandelt...also einfach ausmultipliziert
    ...wie soll der compiler das aber mit 0.5 machen ?

    entschuldige bitte den rueden ton, aber dein htl lehrer haette dir lieber beibringen sollen, dass der binaere operator ^ sowohl in c als auch in c++ eine bitweise exclusiv-or verknuepfung durchfuehrt und nichts ausmultipliziert oder umwandelt.

    Zitat von marX


    NEIN in c/c++ funktioniert das logischerweise nicht...
    ....
    -> 2 möglichkeiten:
    1. du verwendest sqrt (egal ob's in dem buch schon erklärt wurde oder nich)
    2. du schreibst dir selbst eine wurzel(a, b) fkt.

    contradictio sine qua non! wenn sich der OP selber eine funktion schreiben kann -- und das will er offensichtlich -- geht es natuerlich.

    lg
    amok

  • Zitat von amok

    das ist eine ziemlich irrelevante stilfrage. es hat ja auch niemand behauptet
    dass return eine funktion waere. die klammerung hier ist zwar nicht noetig,
    man findet diesen stil aber oefters.

    na ja...es geht halt darum, dass ein anfänger das vielleicht falsch verstanden hat ... trotzdem ist dies (meiner meinung nach) nicht nur eine stielfrage!

    Zitat von amok

    entschuldige bitte den rueden ton, aber dein htl lehrer haette dir lieber beibringen sollen, dass der binaere operator ^ sowohl in c als auch in c++ eine bitweise exclusiv-or verknuepfung durchfuehrt und nichts ausmultipliziert oder umwandelt.

    schon ok....da hast du natürlich vollkommen recht !!!
    ich weiß auch nicht was mich geritten hat als ich das geschrieben habe ;)
    ...ich habe im letzten jahr so gut wie gar nicht mehr c/c++ programmiert und das '^'-symbol kann ja in einigen sprachen bzw. excel, ... schon als "hoch" verwendet werden!

    mfg

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!