Goto-Sprünge Speicherintenisv: Komprimierung möglich ?



  • Hallo liebe Community,

    Ich habe letztens ein kleines Programm geschrieben das einen Taschenrechner simuliert, der in der Lage ist die 4 Grundrechenarten anzuwenden, wie auch die Möglichkeit mit letztem Ergebniss weiterzurechnen. Nun zu meiner Frage: ist es möglich dieses Programm etwas kompakter zu schreiben ? Und wenn ich strings miteinbinde, wie kann ich Speicherlecks verhindern ? Ich danke schon mal im vorraus, hier ist mein Programm, ist mit einer CPP-Droid Applikation auf meinem Smartphone geschrieben worden, allerdings beinhaltet die app-libary alle Funktionen wie die Visual-Studio Engine 2013, die ich sonst dafür verwende.

    #include <iostream> #include <conio.h>
    using namespace std;
    int main ()
    {

    main2:

    float Zahl1;
    char Operator1;
    float Zahl2;
    float Zahl3;
    float Zahl4;
    float Zahl5;
    float Zahl6;
    char c;
    Zahl3 = Zahl1 + Zahl2;
    Zahl4 = Zahl1 - Zahl2;
    Zahl5 = Zahl1 * Zahl2;
    Zahl6 = Zahl1 / Zahl2;
    lastop:
    if (Zahl3==Zahl1)
    {
    std::cout << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "Zahl 1: "
    << Zahl2 + Zahl3
    << "\n";
    Zahl1 = Zahl2 + Zahl3;
    goto lastop5;
    }
    if (Zahl4==Zahl1)
    {
    std::cout << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "Zahl 1: "
    << Zahl4 - Zahl2
    << "\n";
    Zahl1 = Zahl4 - Zahl2;
    goto lastop5;
    }
    if (Zahl5==Zahl1)
    {
    std::cout << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "Zahl 1: "
    << Zahl2 * Zahl5
    << "\n";
    Zahl1 = Zahl2 * Zahl5;
    goto lastop5;
    }
    if (Zahl6==Zahl1)
    {
    std::cout << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "Zahl 1: "
    << Zahl6 / Zahl2
    << "\n";
    Zahl1 = Zahl6 / Zahl2;
    goto lastop5;
    }
    std::cout << "Zahl 1 eingeben"
    << "\n"
    << "Enter drücken"
    << "\n"
    << "Operator "
    << "eingeben"
    << "\n"
    << "Enter drücken"
    << "\n"
    << "Zahl 2 eingeben"
    << "\n"
    << "Erneut bestätigen"
    << "\n"
    << "\n"
    << "Operator 1 : +"
    << "\n"
    << "Operator 2 : -"
    << "\n"
    << "Operator 3 : *"
    << "\n"
    << "Operator 4 : /"
    << "\n"
    << "\n";
    std::cout << "Zahl 1: ";
    std::cin >> Zahl1;
    lastop5:
    std::cout << "Operator: ";
    std::cin >> Operator1;
    std::cout << "Zahl 2: ";
    std::cin >> Zahl2;
    std::cout << "\n";

    if (Zahl2)

    switch (Operator1)
    {

    case '+':
    std::cout << "Ergebniss: "
    << Zahl1 + Zahl2
    << "\n"
    << "\n";
    main6:

    if (c!='j')
    {
    std::cout << "Zum fortfahren"
    << " (j) tippen,"
    << "\n"
    << "zum Weiterrechnen"
    << "\n"
    << "mit letztem"
    << " Ergebniss"
    << " (w) tippen"
    << "\n"
    << "und bestätigen."
    << "\n"
    << "Zum beenden"
    << " (e) tippen. : ";
    rego:
    std::cin.get();
    c = getchar();

    if(c!='j'&&c!='w'&&c!='e')
    {
    c = 'p';
    cout << "Ungültige Eingabe ";
    goto rego;
    }
    if(c=='j')
    {
    c = 'p';
    goto main3;
    }
    if(c=='w')
    {
    c = 'p';
    if(Operator1=='+')
    {
    Zahl3 = Zahl1;
    }
    if(Operator1=='-')
    {
    Zahl4 = Zahl1;
    }
    if(Operator1=='*')
    {
    Zahl5 = Zahl1;
    }
    if(Operator1=='/')
    {
    Zahl6 = Zahl1;
    }
    }
    if(c=='e')
    {
    goto end;
    }
    goto lastop;
    }
    main3:

    std::cout << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n"
    << "\n";

    goto main2;

    case '-':
    std::cout << "Ergebniss: "
    << Zahl1 - Zahl2
    << "\n"
    << "\n";
    goto main6;

    case '*':
    std::cout << "Ergebniss: "
    << Zahl1 * Zahl2
    << "\n"
    << "\n";
    goto main6;
    case '/':
    std::cout << "Ergebniss: "
    << Zahl1 / Zahl2
    << "\n"
    << "\n";
    goto main6;
    }
    end:
    return 0;
    }



  • Schau Dir Deinen eigenen Post mal an. Glaubst Du ernsthaft, dass sich das jemand anguckt?!



  • IfundSwitchBuddy schrieb:

    ist es möglich dieses Programm etwas kompakter zu schreiben ?

    Auf keinen Fall. Das ist ein wunderschönes Programm.



  • Ist ja fast schon Kunst 😉

    Stichwort: Funktionen



  • Ich danke für diese Positiven Feedbacks 😃 Das sagt mir schon mal das ich auf dem Richtigen weg bin. Und zur ersten Antwort : ich weiß das es etwas umständlich ist sich durch ein unbekanntes Programm zu wühlen, deshalb gab ich als Titel auch die goto-Sprünge an. Aber wenn das alles so passt, werde ich auch meine zukünftigen Programme in dieser Art schreiben, momentan arbeite ich an einem Brute-Force ähnlichem Programm das verschiedene Algorithmen durch Angabe der ersten 2-5 unbekannten die Reihenfolge replizieren und weiterführen soll. Dazu arbeite ich mit Pi, diese Zahl fasziniert mich einfach. 😮



  • Th69 schrieb:

    Ist ja fast schon Kunst

    Fast? Das wird demnächst im Museum of Modern Art in New York ausgestellt! Gleich neben Jackson Pollock.



  • Was soll denn da speicherintensiv sein? 😕



  • EOP schrieb:

    Th69 schrieb:

    Ist ja fast schon Kunst

    Fast? Das wird demnächst im Museum of Modern Art in New York ausgestellt! Gleich neben Jackson Pollock.

    Haha ich danke dir, das bedeutet mir viel, ich bin ein absoluter Anfänger was das programmieren angeht, hab das ganze vor etwa einem Monat für mich entdeckt. Und ich hatte eben sorgen das die permanenten Sprünge im Programm Probleme mit dem Speicher verursachen, ich habe manchmal bemerkt das mein Smartphone beim compilieren und besonders bei der Ausführung des Programms ab und an hängen bleibt, kann auch sein das dass mit der app zusammenhängt auf der ich das ganze programmiert habe. Aber wie gesagt, danke für die netten Worte und auf eine hoffentlich gute Zusammenarbeit in der Zukunft 🙂



  • Ich möchte dir die Freude nicht verderben, aber: Den Sarkasmus hast du echt nicht bemerkt?
    Das Programm ist absolut verwirrend, nicht nur, weil keine Codetags drum sinds. Goto benutzt man nicht bis gar nicht, das was du erst einmal brauchst sind Funktionen.



  • Ja, mittlerweile habe ich es auch bemerkt, nachdem ich diesen Jackson gegoogelt habe, wieder so ein Forum in denen irgendwelche 9Gag-Egoverseuchten möchtegern trottel unterwegs sind, nur zu eurer Info : Intelligenz basiert auf Vermittlung und nicht auf zur schau Stellung, ihr pausenclowns.



  • IfundSwitchBuddy schrieb:

    Intelligenz basiert auf Vermittlung und nicht auf zur schau Stellung

    Wieso kriegst du dann beides nicht hin? Deine Vermittlung basiert auf schweren Verbrechen gegen das Nominalkompositum der deutschen Sprache, und zur Schau gestellt hast du bisher ein nicht mit Code-Tags formatierten Programmcode, welcher mehr Zeilenumbrüche enthält, als einem lieb sein müsste, und deine Naivität, dass du glaubst, ein Anfänger wie du könnte bezüglich Code-Eleganz noch Alteingesessenen was beibringen. Und außerdem plenkst du noch recht großzügig.

    Oder du bist inzwischen der meiner Zählung nach vierte Versuch eines Trolls in dieser Woche, der sich daran stört, dass man sein Ego nicht liebkost.

    Und für's Archiv: goto ist nicht vollkommen böse. Es gibt genug Anwendungsfälle, wo es die Lesbarkeit erhöhen kann. Dein Programm beinhaltet keinen einzigen davon, also würde ich goto erst mal ignorieren, wenn ich du wäre.

    EDIT: Ich hoffe, ich habe das jetzt anständig vermittelt, und nicht nur zur Schau gestellt. :p



  • IfundSwitchBuddy schrieb:

    Ja, mittlerweile habe ich es auch bemerkt, nachdem ich diesen Jackson gegoogelt hab

    Hahaha, du wirst es nicht glauben, aber manche Leute haben vielleicht etwas mehr Ahnung als du und evtl. gleichzeitig drei völlig unterschiedlichen Fachrichtungen studiert. Sowas soll es geben. In das Dilemma wirst du wohl kaum kommen.



  • Naja, man könnte den Sarkasmus doch auch einfach weglassen und eine normale Erklärung liefern, in anderen Forenabschnitten redet ihr euch doch auch den Mund fusselig. Aber wenn es darum geht einen Newbie auszulachen, rennt man gleich an die front und schmeißt alle Tomaten die man irgendwo finden kann. Das zeugt nicht gerade von reife, wenn man so, wie du es formuliert hast, "in drei Fachrichtungen studiert hat."



  • Dein Programm ist einfach so unterirdisch, dass sich kein Mensch ernsthaft damit beschäftigen will. Unformatierten Code lese ich sowieso nur ganz oberflächlich.



  • Das stimmt allerdings. Mach beim nächsten Mal bitte Codetags drum.
    Hast du das Programm nun mit Funktionen verbessert?



  • Ich hab mir gerade beigebracht wie man Void-Funktionen sowie zeiger und Char Variablen verwendet, jetzt versuche ich das in meinen Rechner einzubauen, allerdings glaube ich das ich den Rechner neu bauen muss weil Funktionen so ganz anders funktionieren als goto Befehle. Aber trotzdem danke für den hinweis.



  • Und das nächste wäre dann Schleifen (while, for) zu verwenden, um komplett auf die goto-Anweisung zu verzichten (denn dies wird als Spaghetticode-Programmierung angesehen).



  • Ich danke dir Th69. Eine frage habe ich jetzt noch, und zwar habe ich es jetzt fast geschafft, mein rechner ist so gut wie fertig, allerdings habe ich ein letztes problem : Ich habe in meinem Taschenrechner die Möglichkeit mit dem letzten ergebnis weiterzurechnen. Allerdings besteht jetzt das problem das ich aus der rechner() funktion das ergebnis übergeben muss. Das habe ich bereits getan um das ergebnis in der haupfunktion nach der ersten rechnung anzuzeigen. Nun möchte ich das ergebnis aber auch an den zweiten rechner übergeben, der mit dem letzten ergebnis weiterrechnet. Wenn ich das über das return ergebnis aus rechner() mache, wird allerdings auch die funktion nocheinmal ausgeführt. Meine frage : wie kann ich den wert einer funktion übergeben ohne die funktion auszuführen ? Danke euch schonmal im vorraus.



  • Ich hoffe ich habe dich richtig verstanden: merke dir einfach das Ergebnis (d.h. den Rückgabewert) in einer Variablen und gebe diese dann an die Funktion weiter.



  • int funktion1( irgendwas_hier );
    int funktion2( int irgendwas );
    
    cout << funktion2( funktion1( irgendwas_hier ) );
    

    So geht das.

    EDIT:
    Huch, hab ne Klammer vergessen. 🙂


Log in to reply