Rechnen mit Strings????



  • ich versuchs auch nochmal im guten...

    zunächst zu deiner Fehlermeldung:

    Raven2 schrieb:

    #include <string>
    using namespace std;
    
    	long anfangsjahr(const std::string &anfangs_jahr)
    	{ 
                  // bla
    	}
    	long endjahr(const std::string &end_jahr)
    	{ 
                 // bla
     	}
    
    int main()
    {
             // bla
    	string anfangs_jahr;
    	string end_jahr;
             // bla
    	jahresdifferenz = endjahr - anfangsjahr;//Hier kommt der Fehler
             // bla
    	return 0;
    }
    

    In der Zeile mit dem Fehler ziehst du zwei Funktionsnamen (keine Variablen oder Werte) voneinander ab (die Funktionen werden dabei nicht aufgerufen, solches muss bei dir in der Form

    endjahr(end_jahr)
    

    geschehen.

    Dies bedeutet, dass der string end_jahr an die Funktion übergeben wird, dort in eine Zahl (long) umgewandelt und zurückgegeben wird (siehe Funktionsdeklaration long anfangsjahr(const std::string &anfangs_jahr)). Der Rückgabewert vom Typ long kann dann auch für eine Subtraktion verwendet werden.

    Wenn du noch die Ausgabezeile korrigierst (auch hier übergibst du Funktionsnamen, als wären es Werte vom Typ string) wird die Sache richtig erfolgreich:

    jahresdifferenz = endjahr(end_jahr) - anfangsjahr(anfangs_jahr);//Hier kommt jetzt kein Fehler mehr
        cout<<anfangs_jahr<<"-"<<end_jahr<<"="<<jahresdifferenz<<endl;
    

    p.s. wenn du programmieren lernen willst und nicht an C++ gebunden bist... gibt es deutlich anfängerfreundlichere Programmiersprachen, in denen man auch den Unterschied zwischen Funktionen und Werten und Variablen und Ausdrücken usw lernt. So richtig klasse zum Lernen fand ich beispielsweise Turbo Pascal, das hatte aussagekräftige Fehlermeldungen und ein schönes Hilfesystem.

    / Mibo



  • gibt es deutlich anfängerfreundlichere Programmiersprachen, in denen man auch den Unterschied zwischen Funktionen und Werten und Variablen und Ausdrücken usw lernt

    was soll das? was hat eine programmiersprache damit zu tun, was man lernt?
    und was soll das mit den 2 funktionen? bestaerke ihn doch nicht bei dem mist.



  • PeterTheMaster schrieb:

    gibt es deutlich anfängerfreundlichere Programmiersprachen, in denen man auch den Unterschied zwischen Funktionen und Werten und Variablen und Ausdrücken usw lernt

    was soll das? was hat eine programmiersprache damit zu tun, was man lernt?

    Wie schon gesagt.. ich finde C++ ausgesprochen anfängerunfreundlich, da bekommt man viel zu mächtige Werkzeuge in die Hand... ich würd einen Fahranfänger auch nicht in ein 500-PS-Auto stecken...

    Fehlermeldungen wie von ihm zitiert

    error C2296: '-' : Ungültig, da der linke Operand vom Typ 'long (__cdecl *)(const class std::basic_string<char,struct std::char_traits<char>,class std::allocato 
    r<char> > &)' ist
    

    haben einfach _null_ Aussagekraft wenn man nicht wenigstens ein bisschen durchblickt. Zig andere Sprachen würden da eine deutlich besser lesbare Meldung bringen, einfach weil deren Funktionalität keine Templates und namespaces usw. her gibt. Aber meinetwegen... richtig gelernt ist sicher auch C++ als Einstieg möglich.

    PeterTheMaster schrieb:

    und was soll das mit den 2 funktionen? bestaerke ihn doch nicht bei dem mist.

    Wenn ich den Code an zig Stellen ändere, dann blickt Raven doch wieder nicht, wo die kritischen Fehler lagen. Bin der Meinung, dass man erst die Synatx einer Sprache raffen muss ehe man sich für eine sinnvolle Strukturierung interessiert...



  • @Raven2
    Also ich würde dir auch raten, nochmal die Grundlagen durchzugehen. Dein Code zeigt, dass du anscheinend keine Ahnung hast, wofür Funktionen überhaupt da sind und wie man sie dann auch richtig aufruft.

    Du hast gefragt, warum goto so verpöhnt ist? Ganz einfach. Der Code wird dadurch unübersichtlich für andere Programmierer und auch für dich. Denn wenn du den Quellcode 3 Monate lang nicht mehr angeschaut hast und dann dich wieder einarbeiten musst, dann wirst du dich selber verfluchen. Es ist dann nämlich ziemlich schwierig, die ganzen Sprünge nachzuvollziehen.



  • Das nennt man spagettie code da er mit den GoTos so verstickt is wie spagetties 😋



  • @Mibo
    Danke für den Schlüssel zum Problem, jetzt kann ich endlich mal weiterarbeiten.

    @die anderen
    Wieso habt ihr nich gleich gesagt das das Problem sich so einfach Lösen lässt?? Einarbeiten muß ich mich sicherlich noch, hatte wahrscheinlich n paar tuts die nich so das Gelbe vom Ei waren, naja wenigstens hat sich jetzt mal einer gefunden der mir helfen konnte.

    Zum goto, ich weis das das wie Spagetti aussehen kann, tuts in dem Fall aber nicht, weils nur 2 Sprungpunkte giebt auf die alle Vergleiche bei Fehlern zurückspringen.



  • Raven2 schrieb:

    Zum goto, ich weis das das wie Spagetti aussehen kann, tuts in dem Fall aber nicht, weils nur 2 Sprungpunkte giebt auf die alle Vergleiche bei Fehlern zurückspringen.

    doch, goto ist hier bloedsinn. am besten du gewoehnst dir goto gleich wieder ab.



  • @Raven2
    hmm, langsam weiss ich nicht mehr ob du ein Troll bist oder wirklich nur ein Anfänger.

    Lies dir doch endlich mal ein C++ Buch durch. Dann musst du nicht behaupten, dass Dinge die in BASIC in den 60/70ern für gut befunden wurden heute noch gut sein, vorallem, weil goto spätestens seit den 80er Jahren zu Recht verteufelt wurden. Außerdem würdest du wissen, was Funktionen sind (ohne das du natürlich Alternativen zu goto kennst, ist goto natürlich aus deiner Sicht das beste).

    Am besten liest du dir auch noch folgenden Text durch

    http://www.catb.org/~esr/faqs/smart-questions.html

    weil du wohl auch nicht weisst, wie man sich in einem Forum verhält

    HTH HAND



  • @raven
    Ja die oberflächliche Lösung ist einfach und wurde dir eigentlich schon auf der ersten Seite unterbreitet. Aber dein grundlegendes Problem bleibt und das haben wir versucht zu lösen, denn dann wärst du ganz allein auf dein Problem beim Quellcode gestoßen.

    Wegen goto:
    Man gewöhnt sich viel zu schnell an gewisse Sachen. Auch wenn es bei deinem Beispiel nicht schlimm ist mit den gotos, dann könnte dein nächstes Projekt komplett damit durchsetzt sein und das gibt ein Chaos. Besser man gewöhnt sich erst gar nicht an die gotos, dann braucht man sie sich auch nicht wieder abgewöhnen.



  • Um nochmal was zu der gegebenen Lösung zu sagen, eigentlich sollte man sich eine Umwandlungsfunktion schreiben: StrToLong...

    Okay, jetzt kann es aber mal passieren, daß ich nen int brauch oder nen float... macht ja nix, man kann ja neue schreiben. Vielleicht hab ich ja auch mal ein ganz anderes Objekt??? Also keinen String, sondern ein eigenes Objekt...

    Das ganze riecht nach einem template!

    also:

    template <typename Dest, typename Source>
    DType Convert(const Source & toConvert)
    {
       std::stringstream s;
       s << toConvert;
       Dest res;
       s >> res;
       return res;
    }
    

    Vielleicht könnte man sogar noch den stringstream als template-Parameter mit stringstream als Default implementieren, falls man mal nen anderen Konverter braucht.

    MfG Jester
    MfG Jester


Anmelden zum Antworten