Zwei Integer addieren (zusammenfuegen)
-
Hallo,
ich habe folgendes Problem:
Ich habe einen Integer (int) und einen Char (eigentlich ein Element aus einem String-Array der string-Klasse).
Dieser Integer enthaelt z.B. die Zahl 2 und ich moechte jetzt eine weitere Zahl (das in dem char enthalten ist) "dazufuegen", z.B. wenn der char die Zahl '5' enthaelt, dass das Ergebnis dann '25' ist.
Hat jemand eine Idee wie das geht?Gruss,
Cartman
-
integer * 10 + (character - '0')
-
funktioniert leider nicht ...
-
Eric Cartman schrieb:
funktioniert leider nicht ...
das ist KEINE hinnehmbare Fehlerbeschreibung
-
char s[64]={0}; int zahl=2; char c='5'; sprintf(s,"%d%d",zahl,c-'0');
EDIT: Ach, du wolltest ein numerisches Ergebnis, ja? Dann sollte Tims Lösung doch eigentlich klappen. Zeig mal, wie du sie angewendet hast.
-
Na schoen
Also ich bin gerade dabei einen "Taschenrechner" - als Uebung zum C++-lernen zu bauen (bisher hab ich nur die Grundlagen gelernt und noch kein OOP).
Hier ein ausfuehrlich dokumentierter Code:
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string Rechnung; cout << "C++ Konsolentaschenrechner" << endl; cout << "**************************\n\n"; do { cout << "\nGeben Sie ihre Rechnung ein: "; getline(cin, Rechnung); //Rechnungseingabe } while(Rechnung == ""); vector<int> Zahlen; // Array fuer die Zahlen vector<char> Operatoren; // Array fuer die Operatoren int PosZahl = 0; // Anzahl der Zahlen int PosOperator = 0; // Anzahl der Rechenzeichen bool LetzterWertZahl = false; // wenn der letzte Wert eine Zahl war, // dann soll sie zur alten Zahl 'hinzugefuegt' // werden for(unsigned int i=0; i<Rechnung.size(); i++) // String auswerten { if(static_cast<char>(Rechnung[i]) == '+' || static_cast<char>(Rechnung[i]) == '-' || static_cast<char>(Rechnung[i]) == '*' || static_cast<char>(Rechnung[i]) == '/') { // wenn es ein Rechenzeichen war, dann fuege es in den Array ein PosOperator++; Operatoren.push_back(Rechnung[i]); LetzterWertZahl = false; } else { if(LetzterWertZahl == false) { // wenn es vorher ein Rechenzeichen war // fuege die neue Zahl in das Array PosZahl++; Zahlen.push_back(static_cast<int>(Rechnung[i]) - static_cast<int>('0')); LetzterWertZahl = true; } else { // ansonsten fuege das neue Zeichen zur alten Zahl // hier ist das Problem // dieser Code klappt nicht Zahlen[PosZahl-1] * 10 + (Rechnung[i] - '0'); } } } // Nur zum Testen ob ich alles bisher richtig gemacht habe: for(int i=0; i<Zahlen.size(); i++) cout << Zahlen[i] << endl; cout << endl; for(int i=0; i<PosOperator; i++) cout << Operatoren[i] << endl; cout << "\nENTER druecken, um zu beenden..."; getline(cin, Rechnung); return 0; }
-
Zahlen[PosZahl-1] * 10 + (Rechnung[i] - '0');
Du rechnest in der betreffenden Zeile zwar schön was zusammen, weist das Ergebnis aber gar nicht zu! In der Zeile passiert quasi gar nix!
-
_matze schrieb:
Zahlen[PosZahl-1] * 10 + (Rechnung[i] - '0');
Du rechnest in der betreffenden Zeile zwar schön was zusammen, weist das Ergebnis aber gar nicht zu! In der Zeile passiert quasi gar nix!
Das fand ich anfangs auch etwas merkwuerdig. Da dies aber in der Sprache funktioniert hat, die ich vorher genutzt habe, dachte ich mir das geht in C++ auch...
Aber wie mache ich das jetzt richtig?
-
Okay, habs nun herausgefunden...
Zahlen[PosZahl-1] = Zahlen[PosZahl-1] * 10 + (Rechnung[i] - '0');
ist richtig.
Zahlen[PosZahl-1] *= 10 + (Rechnung[i] - '0');
ist falsch... Wieso? Ich dachte, es waere das gleiche...
Und dann noch eine Frage... Warum ist das? Warum wird die Zahl mit 10 multipliziert? Kann mir einer die Loesung erlaeutern? Wuerde gern verstehen, wie das funktioniert
Gruss,
Cartman
-
in der einen zeile steht quasi
5
und in der anderen
variable = 5ist das das gleiche?
ich denke eher nicht, auch nicht in anderen sprachenEric Cartman schrieb:
Zahlen[PosZahl-1] = Zahlen[PosZahl-1] * 10 + (Rechnung[i] - '0');
ist richtig.
hier gilt punkt vor strich rechnung...
Eric Cartman schrieb:
Zahlen[PosZahl-1] *= 10 + (Rechnung[i] - '0');
ist falsch... Wieso? Ich dachte, es waere das gleiche...
hier nicht, d.h. die zahl aus dem array wird mit (10+...) multipliziert...
der compiler wertet hier erst die rechte seite komplett aus und rechnet dann erst
-
Du verstehst nicht.
Dies ...
Zahlen[PosZahl-1] *= 10 + (Rechnung[i] - '0');
... ist ein Ausdruck. Wenn du diesen an nichts zuweist, wird der Wert nach dem Berechnen verworfen! Was denn auch sonst? Wo sollte er gespeichert werden, wenn du es nicht angibst?
Man man... nichtmal den Zuweisungsoperator begreifen aber schon Rechner programmieren...
-
Ausdrücker schrieb:
Du verstehst nicht.
Dies ...
Zahlen[PosZahl-1] *= 10 + (Rechnung[i] - '0');
... ist ein Ausdruck. Wenn du diesen an nichts zuweist, wird der Wert nach dem Berechnen verworfen! Was denn auch sonst? Wo sollte er gespeichert werden, wenn du es nicht angibst?
Man man... nichtmal den Zuweisungsoperator begreifen aber schon Rechner programmieren...
Du auch nicht.
Guck mal genauer hin.
Skym0sh0 hat ihm das Problem richtig erklaert.
-
@Skym0sh0
Das meinte ich auch nicht, du hast mich falsch verstanden
In der Sprache, die ich vorher benutzt habe (PB), war folgendes:variable + 5
gleichwertig mit
variable = variable + 5
daher dachte ich, das waere in C++ genauso, nachdem ich den Post von Tim gelesen habe.
Mit dem Rest hast du natuerlich voellig recht, danke fuer die Aufklaerung!
@Ausdruecker
siehe Post von "GyroGearloose"Uebrigens ist mein Rechner jetzt fertig...
Funktioniert einwandfrei, nur leider ohne Punkt-vor-Strich, ohne Kommazahlen und ohne Klammern... dafuer reichen wohl meine Kenntnisse noch nicht ausDanke fuer eure Hilfe...
ich verstehe aber trotzdem noch nicht, wieso ein Integer zuerst mit 10 multipliziert werden muss und erst anschliessend der char dazuaddiert werden kann... das wuerde mich noch interessieren...
Gruss,
Cartman
-
Eric Cartman schrieb:
ich verstehe aber trotzdem noch nicht, wieso ein Integer zuerst mit 10 multipliziert werden muss und erst anschliessend der char dazuaddiert werden kann... das wuerde mich noch interessieren...
Beispiel: du hast die Zahl 25 der du die Ziffer 6 "anhängen" willst. Dazu musst du die 25 um eine Ziffer "nach links verschieben". Das machen wir mit *10. dadurch ist sicher, dass die letzte Ziffer der Zahl 0 ist. Nun addieren wir die Zahlen und das Ergebnis ist da.
25 | *10 250 | +6 256
Allgemein: Das Verfahren funktioniert bei jeder Basis:
neue_zahl = alte_zahl * basis + neue_ziffer
-
Tim schrieb:
Eric Cartman schrieb:
ich verstehe aber trotzdem noch nicht, wieso ein Integer zuerst mit 10 multipliziert werden muss und erst anschliessend der char dazuaddiert werden kann... das wuerde mich noch interessieren...
Beispiel: du hast die Zahl 25 der du die Ziffer 6 "anhängen" willst. Dazu musst du die 25 um eine Ziffer "nach links verschieben". Das machen wir mit *10. dadurch ist sicher, dass die letzte Ziffer der Zahl 0 ist. Nun addieren wir die Zahlen und das Ergebnis ist da.
25 | *10 250 | +6 256
Allgemein: Das Verfahren funktioniert bei jeder Basis:
neue_zahl = alte_zahl * basis + neue_ziffer
Vielen Dank fuer deine ausfuehrliche Erklaerung!
Habs jetzt verstanden - klingt total logisch und einfach - reine MathematikDanke nochmal @ all
Gruss,
Cartman
-
Eric Cartman schrieb:
In der Sprache, die ich vorher benutzt habe (PB), war folgendes:
variable + 5
gleichwertig mit
variable = variable + 5
Welche Sprache denn?