Programm um die Anzahl der Ziffern einer Zahl zu ermitteln.
-
Hallo,
ich möchte gerne die Anzahl der Ziffern einer eingegebenen ganzen positiven Zahl ermitteln. Hierzu möchte ich die Zahl so oft durch 10 teilen, bis 1,xxx übrigbleibt.Die Anzahl der möglichen Divisionen + 1 müßte die Ziffernanzahl ergeben.
Das ganze soll mit Hilfe einer Schleife geschehen. Sobald eine Zahl einmal durch
10 geteilt wurde, soll sich der Schleifenzähler um 1 erhöhen.Da am Ende noch 1 zum Schleifenzähler addiert werden müsste, habe ich den Schleifenzähler von vornherein auf 1 gesetzt.
Leider funktioniert das Programm nicht. Hat jemand eine Idee, woran es liegt?
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int main() { double z; std::cout<<"Bitte geben sie eine Zahl ein: "; std::cin>>z; for (int x=1;(z/10)>1;x++) { z=z/10; } std::cout<<"Die eingegebene Zahl hat "<<x<<" Stellen:"; return 0; }
-
Wenn du die Zahl nicht direkt zum Rechnen brauchst kann es auch als String verarbeitet werden:
#include <iostream> #include <string> int main() { std::cout<<"Bitte geben sie eine Zahl ein: "; std::string z; std::cin >> z; std::cout<<"Die eingegebene Zahl hat "<< z.size() <<" Stellen."; }
Mit Zahl:
#include <iostream> int main() { std::cout<<"Bitte geben sie eine Zahl ein: "; int z; std::cin >> z; int stellen = 0; while(z > 0) { z /= 10; ++stellen; } std::cout<<"Die eingegebene Zahl hat "<< stellen <<" Stellen."; }
-
Die Mathematiker haben dafür auch eine extrem fortschrittliche Technik erfunden, die sich Logarithmus nennt...
P.S.: Das ist nicht die schnellste Technik (es gab hier mal eine Art Wettbewerb wer den schnellsten Ziffernzähler schreibt), aber es schadet nicht, bei mathematischen Problemen auch mal über, nun ja, Mathematik als Lösung nachzudenken, anstatt die Stringverarbeitungskeule (noch viel langsamer) rauszuholen. Und Geschwindigkeit ist hier wohl auch nicht von Belang.
-
Du definierst x in der For-Schleife. D.h. x ist hinter der Schleife nicht mehr existent.
So würde es gehen:int x; for (x=1;(z/10)>1;x++) { z=z/10; } std::cout<<"Die eingegebene Zahl hat "<<x<<" Stellen:";
-
Ja,genau - Danke für die Codes und die Erklärung. In for-Schleifen inialisierte Variablen existieren also nur innerhalb dieser
Ich fange gerade erst mit C++ an,(wie man sich vermutlich denken kann...) der Code ist Bestandteil einer Übungsaufgabe mit Schleifen. (Quersumme einer Zahl berechnen).
Das Berechnen der Quersumme mit bekannter Ziffernzahl hatte ich soweit schon fertig, es fehlte halt nur noch dieser Teil.Dachte mir schon, daß es bestimmt eine Funktion für Logarithmen gibt, aber so lernt man den Umgang mit Schleifen besser.
-
redrew99 schrieb:
Ja,genau - Danke für die Codes und die Erklärung. In for-Schleifen inialisierte Variablen existieren also nur innerhalb dieser
Exakt.
Dachte mir schon, daß es bestimmt eine Funktion für Logarithmen gibt,aber so lernt man den Umgang mit Schleifen besser.
Die gibt es schon:
http://www.cplusplus.com/reference/clibrary/cmath/log/
-
drakon schrieb:
redrew99 schrieb:
Ja,genau - Danke für die Codes und die Erklärung. In for-Schleifen inialisierte Variablen existieren also nur innerhalb dieser
Exakt.
Sicher?
{ int i; //Definition for(i = 0/*Initialisierung*/; i < 5; ++i); ... //i existiert noch immer }
Fazit:
In for-Schleifen definierte Variablen existieren also nur innerhalb dieser
-
Wenn schon deklarariert, wenn man so genau sein will.
Ich probiere es zu vermeiden Anfänger mit so Kleinigkeiten zu belästigen. Er scheint die Semantik ja verstanden zu haben.
-
Nix 'deklariert'.
int i;
reserviert den Speicher an der Stelle --> Definition.
Und ob der TE die Semantik kennt ... keine Ahnung. Mich jedenfalls haben Definition/Deklaration/Initialisierung immer mal wieder verunsichert, auch als ich kein blutiger Anfänger mehr war.
Bei Deklaration/Definition bin ich mir in manchen Situationen heute noch nicht sicher; allerdings denke ich, es ist meist auch eher von akademischem als praktischem Interesse.
-
Deklaration und Definition sind je Objekt ja nochmal leicht anders definiert. Bei ner Variable ist eigentlich fast jede Deklaration auch eine Definition, weil Speicher reserviert wird. Eine extern-Deklaration wäre da z.B. was anderes. Grundsätzlich ist Deklaration erstmal nur "Nennung" und bei Definition wird dann wirklich was gebastelt (nicht zwangsläufig Speicherallokation wie man an einer Klassendefinition sieht). Da in einer Schleife eine Deklaration ohne Definition nicht in Frage kommt, ist obige Aussage mit "deklariert" nicht richtiger sondern verwirrender, da man annehmen könnte, dass man irgendwie eine Variable deklarieren könnte ohne sie zu definieren.
*ausatm*
-
Belli schrieb:
Nix 'deklariert'.
int i;
reserviert den Speicher an der Stelle --> Definition.
Und ob der TE die Semantik kennt ... keine Ahnung. Mich jedenfalls haben Definition/Deklaration/Initialisierung immer mal wieder verunsichert, auch als ich kein blutiger Anfänger mehr war.
Bei Deklaration/Definition bin ich mir in manchen Situationen heute noch nicht sicher; allerdings denke ich, es ist meist auch eher von akademischem als praktischem Interesse.Ob eine Variable in einem Scope sichtbar ist hängt lediglich davon ab, ob in dem Scope der Name eingeführt wurde (deklariert) oder nicht. Dass das dort eine Deklaration und Definition stimmt schon, aber grundsätzlich muss man auf Deklarationen achten und nicht auf Definitionen. Jede Definition ist eine Deklaration, aber nicht umgekehrt. Die Initialisierung hat auch nichts mit dem Sichtbarkeitsbereich zu tun.
Oftmals spielt das ganze aber auch nicht eine Rolle, wie du auch selbst sagst. Vielleicht hätte ich nicht "Exakt" schreiben sollen, aber verstanden hat er es ja und auf den Namen rumzureiten verwirrt denke ich nur in diesem Stadium.
@Eisflamme
Es ging mir darum, dass nicht die Definition verantwortlich ist ob es sichtbar ist, sondern die Eigenschaft, dass es eine Deklaration ist.EDTI:
Da in einer Schleife eine Deklaration ohne Definition nicht in Frage kommt, ist obige Aussage mit "deklariert" nicht richtiger sondern verwirrender, da man annehmen könnte, dass man irgendwie eine Variable deklarieren könnte ohne sie zu definieren.
Das geht schon:
int main() { for(extern int i;;) { } }
-
Das geht nicht nur innerhalb des globalen Scopes? Dann hast Du natürlich Recht.
Aber ich verstehe das nicht. Wo soll man die denn jetzt definieren?
-
Meine Lösung des Problems: http://ideone.com/V4g7m
-
Eisflamme schrieb:
Das geht nicht nur innerhalb des globalen Scopes? Dann hast Du natürlich Recht.
Aber ich verstehe das nicht. Wo soll man die denn jetzt definieren?
Naja, auch wenn man das innerhalb des globalen Scopes deklariert, muss man es ja woanders definieren.
Antwort auf Deine Frage also: Irgendwo anders.
-
Was heißt irgendwo anders? Innerhalb der Funktion? Was macht man dann bis zur Definition? Und außerhalb der Funktion, wie wäre da die Syntax?
-
Eisflamme schrieb:
Was heißt irgendwo anders?
Na, irgendwo, Beispiel:
#include <iostream> //extern char i = 1; int main() { for(extern char i; i < 10; ++i) std::cout << static_cast<int>(i) << std::endl; } extern char i = 1;
oder in einer anderen Quelltextdatei, die dann natürlich dazugelinkt werden muss. Wie man extern deklarierte Variablen halt irgendwo definieren muss.
-
drakon schrieb:
Wenn schon deklarariert, wenn man so genau sein will.
Ich glaube, Du hast doch recht,
#include <iostream> int main() { for(extern char i; i < 10; ++i) std::cout << static_cast<int>(i) << std::endl; std::cout << i; } char i = 1;
kompiliert nämlich nicht, wegen Zeile 8.
-
Naja. Deine Aussage war nicht falsch, sondern einfach nicht vollständig. Definitionen sind eine Untermenge von Deklarationen und was die Sichtbarkeit anbelangt ist eben die Deklaration der Variable wichtig und nicht ob sie dort definiert wurde.
Ich hoffe ich habe hier nicht Leute unnötig verwirrt. ^^
-
Mittels Logarithmus kannst du die Anzahl Ziffern sogar einfach für jedes beliebige Zahlensystem bekommen.
#include <iostream> #include <limits> #include <cmath> using namespace std; int main() { /* Die Zahl x hat im Ber-System int( ln(x)/ln(B) )+1 Ziffern. B = Basis des Systems ln = natürlichen Logarithmus int = Damit ist die Abrundung auf die nächst kleinere Ganzzahl gemeint. */ int x = 0; cout << "Eingabe: "; cin >> x; cout << endl << "#Ziffern Hex: " << static_cast<int>( log(x)/log(16) )+1; // in cmath log = ln cout << endl << "#Ziffern Dez: " << static_cast<int>( log(x)/log(10) )+1; cout << endl << "#Ziffern Bin: " << static_cast<int>( log(x)/log(2) )+1; cin.ignore(numeric_limits<streamsize>::max(),'\n'); cin.get(); return 0; }
lg