C Anfang



  • Hallo!
    Ich bin neu im Forum deswegen erstmal Guten Tag :)! Jetzt zur meiner Frage: Ich habe vor ungefähr einem Jahr mit dem Programmieren mit C++ angefangen. Ich weiß das ist keine Programmiersprache, die für den Anfang gedacht ist aber ich mein die Motivation macht's ;). Hatte eine etwas längere Pause, habe in der Pause aber auch Erfahren, dass C eher Hardwarebezogen ist. Habe mich also an C herangetraut (hatte zufällig ein Buch zuhause). Wie man es kennt fängt man natürlich mit Basics an wie z.B. mit einem Taschenrechner. Hier mein Code:

    #include <stdio.h>
    #include <math.h>
    int Zahl1;
    int Zahl2;
    char Rechenzeichen;
    int Ergebnis;
    
    int main()
    {
        printf("Willkommen zu meinem c Tascenrecher\n");
        printf("Geben sie bitte ihre Rechnung ein\n");
        scanf("%d %c %d", &Zahl1, &Rechenzeichen, &Zahl2);
        printf("Ihr Ergebnis lautet: %d", &Ergebnis);
    
    switch(Rechenzeichen)
    {
        case '+':
        Ergebnis=Zahl1+Zahl2;
        break;
        case '-':
        Ergebnis=Zahl1-Zahl2;
        break;
        case '*':
        Ergebnis=Zahl1*Zahl2;
        break;
        case '/':
        Ergebnis=Zahl1/Zahl2;
        break;
    }
    return 0;
    
    }
    

    Der Anfang klappt nur kommt als Ergebnis eine zufällige Zahl heraus 😞 .. Kann mir vielleicht einer meinen Fehler erklären? Vielen dank im Voraus!

    Grüße David



  • Du solltest das Ergebnis erst ausgeben, nachdem du es berechnet hast.
    Und auch das Ergebnis direkt und keine Adresse.

    Es sieht so aus, als ob printf und scanf ziemlich gleich sind.
    Sie sind es nicht.

    Verzichte auf global Variablen und nutze bitte die Code-Tags (code mit der Maus markieren und auf den C-Button unter dem 😡 klicken)



  • DirkB schrieb:

    Du solltest das Ergebnis erst ausgeben, nachdem du es berechnet hast.
    Und auch das Ergebnis direkt und keine Adresse.

    Es sieht so aus, als ob printf und scanf ziemlich gleich sind.
    Sie sind es nicht.

    Verzichte auf global Variablen und nutze bitte die Code-Tags (code mit der Maus markieren und auf den C-Button unter dem 😡 klicken)

    Fehler gefixt. Dankeschön!! Warum ist das denn so?



  • erst daten eingeben, dann daten verarbeiten, zuletzt daten ausgeben. (EVA-Prinzip)
    edit: du gibst ergebnis aus, obwohl dort noch nichts hinein geschrieben wurde, und daher gibt dir das programm irgendeinen wert aus.

    bei scanf grundsätzlich (d.h. nicht immer, in diesem fall aber schon) &variablenname, bei printf variablenname schreiben.

    und daten, die nur in der main-funktion (also außerhalb von threads o.ä.) verwendet werden, auch in der main-funktion deklarieren.

    außerdem nach scanf getchar() (zumindest erstmal um überhaupt rein zu kommen) aufrufen, um die information über die gedrückte enter-taste zu löschen, sonst hast du beim nächsten scanf probleme. nochmal edit: unter windows darfst du dir auch angewöhnen, nach scanf fflush(stdin) zu schreiben, funktioniert aber nur unter windows.



  • Hör auf mit deinem dummen Geschwätz.
    Der Frager und Leser des Forums könnten denken, man programmiert in C tatsächlich so wie du pubertär und verständnislos mit deinem beschränkten Horizont dahinplapperst.



  • HansKlaus schrieb:

    bei scanf grundsätzlich (d.h. nicht immer, in diesem fall aber schon) &variablenname, bei printf variablenname schreiben.

    Der Hintergrund ist folgender: scanf muss die Adresse einer Variablen haben, um sie befüllen zu können. Und das & ist hier der Adressoperator (&x bedeutet: nimm die Adresse von x).



  • Wutz schrieb:

    Hör auf mit deinem dummen Geschwätz.
    Der Frager und Leser des Forums könnten denken, man programmiert in C tatsächlich so wie du pubertär und verständnislos mit deinem beschränkten Horizont dahinplapperst.

    lässt dich deine freundin irgendwie grad nicht ran oder so? wer ist hier eigentlich der troll?



  • HansKlaus, deine Antworten sind in keinster Weise nützlich. Sie sind höchstens irritierend. Mit den paar wenigen Beiträgen hast du es mittlerweile geschafft, sehr viele hier zu nerven, mich eingeschlossen. Lern bitte etwas richtig, bevor du anfängst, anderen zu "helfen".



  • könntest du dann mal bitte genau sagen, was du meinst?



  • HansKlaus schrieb:

    Wutz schrieb:

    Hör auf mit deinem dummen Geschwätz.
    Der Frager und Leser des Forums könnten denken, man programmiert in C tatsächlich so wie du pubertär und verständnislos mit deinem beschränkten Horizont dahinplapperst.

    lässt dich deine freundin irgendwie grad nicht ran oder so? wer ist hier eigentlich der troll?

    Lass dich nicht provozieren. Das hat gestern einer mit mir auch versucht. Immer cool bleiben. 🙂



  • ja aber was soll denn sowas? es wird nur rumgemault, dass das alles unsinn wäre, aber es kommt kein was, warum, so wäre es besser. 👎



  • Man hat dir in jedem Thread erklärt, warum das was du schreibst, Blödsinn ist. Du bist willst es nur nicht hören. Problematisch ist aber, dass du überhaupt Antworten gibst, ohne dich genau auszukennen.
    Mir hats nach dem Thread hier gereicht:

    https://www.c-plusplus.net/forum/337718

    bei Java wird nicht benötigte Speicher automatisch frei gegeben, das hast du bei c++ soweit ich weiß nicht, Also kannst du nicht mal eben ein neues Objekt zurück geben

    Fängt schon an mit "soweit ich weiß". Du weißt es aber nicht. Deine Antwort ist falsch und es ist in Wirklichkeit um einiges komplizierter. Bringt überhaupt nichts, rumzuraten. Wenn du nicht GENAU weißt, wovon du redest, lass die Antworten bleiben. Du verwirrst nur Leute, die überhaupt keine Ahnung haben.



  • HansKlaus schrieb:

    [...] aber es kommt kein was, warum, so wäre es besser. 👎

    Warum? Weil deine Antworten stümperhafter Quatsch sind.

    HansKlaus schrieb:

    außerdem nach scanf getchar() (zumindest erstmal um überhaupt rein zu kommen) aufrufen, um die information über die gedrückte enter-taste zu löschen, sonst hast du beim nächsten scanf probleme.

    Zanderblues schrieb:

    scanf("%d %c %d", &Zahl1, &Rechenzeichen, &Zahl2);
    

    ➡

    scanf(" %d %c %d", &Zahl1, &Rechenzeichen, &Zahl2);
    //     ^
    

    und gut iss.

    HansKlaus schrieb:

    nochmal edit: unter windows darfst du dir auch angewöhnen, nach scanf fflush(stdin) zu schreiben, funktioniert aber nur unter windows.

    Du bist hier im ISO-C Forum. Platformabhängiges Verhalten ist hier nicht gefragt. Besonders nicht, wenn es überall sonst UB ist.



  • ist es denn nicht so, dass java automatisch irgendwann (nach meinem wissen wird nicht garantiert, dass das überhaupt mal zur laufzeit passiert) den garbagecollector aufruft, und dass es in c++ so etwas nicht gibt? kann ich in java nicht benötigten speicher explizit wie in c++ mit delete freigeben?

    ich meine, ich finds ja toll, dass ihr euch so viel besser auskennt, als ich, aber wenn ich hier irgendwas schreibe und dann von euch außer destruktivem bullshit nichts dazu kommt, dann ist das ich sag mal fragwürdig. 🙄

    fflush(stdin) steht jedenfalls ausdrücklich im msdn drin (KLICK) und ein getchar() nach scanf() ist für den anfang doch erstmal in ordnung. dass es da zig möglichkeiten zur fehlerabfrage gibt, weiß ich auch, belastet am anfang aber erstmal nur.

    edit: ihr habt vielleicht probleme, aber macht ihr mal!


  • Mod

    Dadurch, dass du dich wiederholst, wird der Quatsch¹ auch nicht richtiger. Es beweist bloß, dass du nicht einmal im Ansatz versuchst, die dir gegebenen Antworten zu verstehen. Daher wurden diese Antworten im Lauf der Zeit immer unhöflicher und man spart es sich inzwischen, dir Erklärungen zu liefern. Du liest sie erfahrungsgemäß sowieso nicht. Anscheinend hast du den Eindruck, bereits alles zu wissen.

    ¹: Deine Thesen sind nicht direkt 100% falsch. Sie sind das typische Halbwissen eines Anfängers. Du stellst sie hier aber als fachliche Anleitung anderen Lesern zur Verfügung, die offenbar noch weniger wissen als du, und verbreitest dieses Halbwissen damit weiter. Das ist Quatsch.



  • HansKlaus schrieb:

    ist es denn nicht so, dass java automatisch irgendwann (nach meinem wissen wird nicht garantiert, dass das überhaupt mal zur laufzeit passiert) den garbagecollector aufruft, und dass es in c++ so etwas nicht gibt? kann ich in java nicht benötigten speicher explizit wie in c++ mit delete freigeben?

    Ja, Java ist verdammt schlau, dehalb gibt es auch ca. alle 2 Wochen ein Update wegen bugs ohne Ende.
    Ansonsten gibt es in C/C++ kaum etwas, dass du nicht bewerkstelligen kannst falls du mit etwas Gehirn gesegnet bist.



  • EOP schrieb:

    Ja, Java ist verdammt schlau, dehalb gibt es auch ca. alle 2 Wochen ein Update wegen bugs ohne Ende.

    Wie lange muss ich wohl darauf warten, dass jemand auf diese Aussage in demselben Ton reagiert, wie auf die Texte des HansKlaus?

    Ziemlich lange, vermute ich mal.



  • HansKlaus schrieb:

    außerdem nach scanf getchar() (zumindest erstmal um überhaupt rein zu kommen) aufrufen, um die information über die gedrückte enter-taste zu löschen, sonst hast du beim nächsten scanf probleme.

    Schwachsinn.

    Bis auf %c und %[ überlesen alle anderen Formatspecifier führende Whitespace.
    Aber das kann man durch ein vorangestelltes Whitespace im Formatstring auch erzwingen.
    Ja, ein Whitespace. Dabei ist es egal welches und wieviel. scanf macht da keinen Unterschied.

    Deine Behauptung zeigt, dass du das Problem nicht verstanden hast und mit Halbwissen kannst du nicht wirklich weiterhelfen.

    Du kannst Probleme bekommen, wenn du scanf und fgets mischt. Aber die kann man umgehen.
    Aber daraus kannst du auch keinen allgemein gültigen Satz ableiten.



  • Nochmal zurück zum TO

    Zanderblues schrieb:

    Habe mich also an C herangetraut (hatte zufällig ein Buch zuhause).

    Darf man fragen welches Buch das ist?

    Denn irgendwas ist ja bei der Einführung in das Verständnis für die Programmierung (in C) schief gelaufen.

    Aber schön ist schon mal, dass du nicht versuchst durch irgendwelche Konstrukte die Konsole offen zu lassen.



  • Mirek schrieb:

    EOP schrieb:

    Ja, Java ist verdammt schlau, dehalb gibt es auch ca. alle 2 Wochen ein Update wegen bugs ohne Ende.

    Wie lange muss ich wohl darauf warten, dass jemand auf diese Aussage in demselben Ton reagiert, wie auf die Texte des HansKlaus?

    Hehehe, meine Liebe zu Java dürfte ja wohl bekannt sein.
    Ansonsten war mein Ton völlig akzeptabel imho.


Anmelden zum Antworten