String in Integer konvertieren und den Integer als ganze Zahl werten
-
@mmm_1482_ Du solltest die konvertierte Zahl erst nach der Schleife ausgeben.
Auch brauchst du nicht auf Buchstaben testen. Alles was keine Zahl ist, gibt einen Fehler und Ende.
Pack die Konvertierung am besten in eine Funktion.
-
@DirkB
Nach der Aufgabenstellung soll jedoch auch die Möglichkeit bestehen, dass der Benutzer ende eintippt hab das formal gemacht, aber hast prinzipiell recht.Und ja das mit nach der Schleife, da hast du auch Recht muss mir das jetzt aber wegen der Variablen kurz zurechtbasteln. Jedoch löst es leider nicht das Problem nur die Optik.
-
@mmm_1482_ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Nach der Aufgabenstellung soll jedoch auch die Möglichkeit bestehen, dass der Benutzer ende eintippt
Dann prüfe direkt nach der Eingabe.
-
@mmm_1482_ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Jedoch löst es leider nicht das Problem.
Doch, wenn man es richtig macht.
-
Du liest/verarbeitest ja nun einzelne Ziffern und fängst ganz links im String damit an. Das musst Du ändern:
Du musst rechts anfangen, also bei str[str.length() - 1] und die gefundenen Ziffern dann mit 10 hoch 0, 10 hoch 1, 10 hoch 2 usw. multiplizieren und die Produkte addieren:str = "203"
zahl = 3 * 10 hoch 0 + 0 * 10 hoch 1 + 2 * 10 hoch 2Das jetzt schön in ein Programm umsetzen, fertig ...
-
@Belli Nein.
so bitte nicht.
-
@mmm_1482_ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
<string>
std::stoi()
ftw. *scnr*
-
@Swordfish sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
@mmm_1482_ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
<string>
std::stoi()
ftw. *scnr*"Wir dürfen dabei keine besonderen Bibliotheken verwenden nur <string> dat wars."
Ah ja ... std::stoi() steht ja in <string>
-
#include <iostream> #include <string> bool isdigit(char ch) { return '0' <= ch && ch <= '9'; } bool isupper(char ch) { return 'A' <= ch && ch <= 'Z'; } char tolower(char ch) { if (!isupper(ch)) return ch; return 'a' + ch - 'A'; } int main() { using std::cin; using std::cout; using std::cerr; using std::string; using std::getline; cout << "Bitte die Zahl, oder das Wort \"Ende\" eingeben: "; string input; if (!getline(cin, input)) { cerr << "Input Error :(\n\n"; return 1; } string word{ input }; for (auto &ch : word) ch = tolower(ch); if (word == "ende") { cout << "Programm endet.\n\n"; return 0; } int number{}; for (auto ch : input) { if (!isdigit(ch)) { cerr << "'" << ch << "' ist keine Ziffer :(\n\n"; return 1; } number *= 10; number += ch - '0'; } std::cout << "Ergebnis: " << number * 2 << "\n\n"; }
?
-
@Swordfish sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
?
Warum ist dein „stoi“ keine Funktion?
-
@DirkB Faulheit.
-
@DirkB sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
@Belli Nein.
so bitte nicht.Warum nicht?
Die Zehnerpotenzen kann man vorher ausrechnen und als Tabelle speichern.Alexandrescu hat mal irgendwann gezeigt, dass das so sogar schneller ist als das ständige Multiplizieren des Zwischenergebnisses mit 10, weil es Datenabhängigkeiten reduziert. https://www.youtube.com/watch?v=mYzaFzAHuZ4&t=500
-
@wob sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Danke, das hatte ich schon gesucht. Sehenswert.
Ansonsten möchte ich mit an das "Warum nicht?" anschliessen und frage mich wie denn sonst? Sehe das Schema von @Belli auch eher als mathematische Hilfestellung. Die Lösung von @Swordfish und typische
atoi
-Implementierungen sind letztendlich auch nur Varianten davon.
-
@Finnegan sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
@wob sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Danke, das hatte ich schon gesucht. Sehenswert.
Ich fand das gar nicht gut. Er labert 13 Minuten lang über etwas, das man in 3 Minuten hätte sagen können. So muss ich mich als Zuhörer anstrengen, die 3 relevanten Minuten aus dem Rauschen auszufiltern, anstatt mich auf den Inhalt zu konzentrieren. Ich weiß jetzt auch gar nicht, was genau das Ergebnis seiner Messung war, da ich am Ende nur noch genervt in 30 Sekundenschritten gesprungen bin, und dabei den einen Satz zu seinem Ergebnis nicht finden konnte, da er stattdessen 5 Minuten darüber geschwurbelt hat, wie toll sein (unbeschriftetes ) Diagramm wäre. Immerhin war ich so glücklich, dass ich beim Spulen zufällig die zwei Sekunden getroffen habe, in denen er sagt, warum das effizienter ist.
-
@Finnegan sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Ansonsten möchte ich mit an das "Warum nicht?" anschliessen und frage mich wie denn sonst? Sehe das Schema von @Belli auch eher als mathematische Hilfestellung. Die Lösung von @Swordfish und typische
atoi
-Implementierungen sind letztendlich auch nur Varianten davon.Warum nicht:
- Weil der "klassische" Algorithmus mit einem Minimum an Code auskommt, keine vorberechneten Konstanten braucht, und sich direkt aus der mathematischen Definition der Darstellung ergibt. Das ist halt einfach elegant, wenn man einen Algorithmus so aufbaut. Das schult im Denken, wenn man lernt, seine Algorithmen so zu bauen.
- Der klassische Algorithmus kommt auch mit einem Minimum an Rechenoperationen aus. Da darf man erst einmal davon ausgehen, dass das wahrscheinlich auch der schnellste Weg ist.
Nun ist die Folgerung aus Punkt 2 halt falsch, weil moderne Prozessorarchitekturen nicht so funktionieren, wie man es naiv erwartet (wie Alexandrescu in 2 Sekunden seines 13 Minuten Vortrags erklärt). Ich finde es aber trotzdem gerechtfertigt, dem Anfänger den klassischen Algorithmus nahe zu bringen, wegen Punkt 1.
-
@SeppJ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
sich direkt aus der mathematischen Definition der Darstellung ergibt
Was soll das denn heißen? Bei "mathematischer Definition" hab ich jetzt an b-adischen Bruch gedacht, was aber das von Belli ist..was meintest du?
-
@Jockelx sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
@SeppJ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
sich direkt aus der mathematischen Definition der Darstellung ergibt
Was soll das denn heißen? Bei "mathematischer Definition" hab ich jetzt an b-adischen Bruch gedacht, was aber das von Belli ist..was meintest du?
Die beiden vorgestellten Methoden ergeben sich beide direkt aus der Definition. Das war nicht zum Vergleich der beiden Methoden gedacht, sondern zur Definition, was ich unter "elegant" verstehe. Der Belli-Algorithmus ergibt sich zwar auch direkt aus der Definition, aber er braucht mehr Code und magische Konstanten und ist deswegen weniger elegant.
Ein Beispiel für einen berühmten Algorithmus, der sich nicht aus der Mathematik ergibt (oder jedenfalls nicht intuitiv ableitbar), nenne ich mal die inverse Quadratwurzel aus Quake 3: https://en.wikipedia.org/wiki/Fast_inverse_square_root
Dieser Algorithmus hat in meinen Augen zwar auch schön, aber "elegant" würde ich es nicht nennen. Mir fällt gerade kein gutes Wort ein. Jedenfalls würde ich ihn nicht empfehlen, wenn eine Hausaufgabe für Anfänger verlangt, dass man eine Wurzel selber implementieren soll.
-
Ich freu mich, dass ich Verfechter für meinen Weg gefunden habe
Ich finde aber auch:
zahl = zahl * 10 + nextZiffer;
eleganter; ich bin nur nicht drauf gekommen
-
@SeppJ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
@Finnegan sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Danke, das hatte ich schon gesucht. Sehenswert.
Ich fand das gar nicht gut. Er labert 13 Minuten lang über etwas, das man in 3 Minuten hätte sagen können.
Das haben fast alle in Videos verpackte Informationen so an sich. Wenn ich schnelle Informationen möchte, bevorzuge ich auch einen kurzen und bündigen Text.
(Ansonsten Geschmackssache, ich finde seinen Stil unterhaltsam und kann mir sowas gut zum relaxen ansehen - daher rührt auch mein "sehenswert". Wenn mir nur die eine kurze Info interessierte, bekäme ich aber wohl auch die Krise, zumal auch die Aufnahmequalität auch noch mäßig ist)
@SeppJ sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Warum nicht:
Ja, den klassichen Algorithmus finde ich für Anfänger auch gut geeignet. Dennoch kann ich auch nichts schlimmes an z.B. einem
zahl += ziffer * wertigkeit; wertigkeit *= 10;
erkennen. Da braucht es auch keine Konstanten und folgt dennoch @Belli s Ansatz. Dass so ein statisches Konstanten-Array für Anfänger verwirrend wäre sehe ich auch so. Ich hatte auch nicht vor, Anfängern hier die Alexandrescu-Lösung zu verkaufen
-
@Finnegan sagte in String in Integer konvertieren und den Integer als ganze Zahl werten:
Dennoch kann ich auch nichts schlimmes an z.B. einem
zahl += ziffer * wertigkeit; wertigkeit *= 10;
erkennen. Da braucht es auch keine Konstanten und folgt dennoch @Belli s Ansatz.Naja es braucht halt mehr Operationen und man muss verkehrt herum über die Zahl iterieren.
Verkehrt herum ist schon OK, so lange man dafür was bekommt. Z.B. mehr Speed bekommt, weil man nen Table aus Zehnerpotenzen verwendet. Aber wenn man nix davon hat? Hm.