Code-Schnipsel
Moderatoren: broesel, Martin Conrad, PatrickThema: [EDIT] - Ziffern aus einer Zahl auslesen
[EDIT] - Ziffern aus einer Zahl auslesen
hostlin am 04.07.2008 um 14:47
// ziffern.cpp
#include <iostream>
using namespace std;
// Anzahl der Ziffern einer Zahl zurueckgeben
int cntz(int zahl)
{
int i;
int ziffernanzahl = 1;
for (i = 10; i < zahl; i=i*10)
{
if (i < zahl)
{
++ziffernanzahl;
}
}
return ziffernanzahl;
}
/*
getz() gibt einen int* Zeiger auf einen dynamisch reservierten Speicherbereich
zurueck, indem sich die Ziffern befinden. Das erste Element ist auch gleich
zeitig die hoechste Dezimalstelle.
*/
int *getz(int zahl)
{
int i, stellenwert = 10;
int ziffernanzahl = cntz(zahl);
int *zptr = new int[ziffernanzahl];
for(i = ziffernanzahl-1; i >= 0; i--, stellenwert *= 10)
{
zptr[i] = (zahl % stellenwert) / (stellenwert/10);
}
return zptr;
}
int main(int argc, char **argv)
{
int zahl, i;
cout << "Bitte geben sie eine Zahl ein: ";
cin >> zahl;
if (!cin)
{
cout << "Es ist bei der Eingabe ein Fehler aufgetreten!\n";
return 1;
}
int *zptr = getz(zahl);
for (i = 0; i < cntz(zahl); i++)
{
cout << zptr[i] << "\n";
}
delete [] zptr;
return 0;
}
--
we would change the world if god gave us the source code...
and remember, science is nothing more than reverse engineering nature...
Re: Ziffern aus einer Zahl auslesen
norman am 05.07.2008 um 21:25
dein Programm hat einen Fehler: bei Zehnerpotenzen wird die Anzahl der Ziffern falsch gezaehlt. Was dazu fuehrt, dass die hoechstwertige Stelle der Zahl nicht eingelesen wird.
Ich habe dein Programm korrigiert und ein wenig optimiert.
#include <iostream>
using namespace std;
int cntz(int zahl)
{
int i, ziffernanzahl = 1;
for (i = 10; i <= zahl; i *= 10)
ziffernanzahl++;
return ziffernanzahl;
}
int *getz(int zahl, int ziffernanzahl)
{
int i, stellenwert = 10;
int *zptr = new int[ziffernanzahl];
for (i = ziffernanzahl - 1; i >= 0; i--, stellenwert *= 10)
zptr[i] = (zahl % stellenwert) / (stellenwert / 10);
return zptr;
}
int main(int argc, char **argv)
{
int zahl, i, ziffernanzahl;
int *zptr;
cout << "Bitte geben Sie eine Zahl ein: ";
cin >> zahl;
if (!cin) {
cout << "Es ist bei der Eingabe ein Fehler aufgetreten!\n";
exit(1);
}
ziffernanzahl = cntz(zahl);
zptr = getz(zahl, ziffernanzahl);
for (i = 0; i < ziffernanzahl; i++)
cout << zptr[i] << endl;
delete [] zptr;
return 0;
}
Re: Ziffern aus einer Zahl auslesen
hostlin am 06.07.2008 um 12:04
#include <iostream>
using namespace std;
int cntz(int zahl)
{
if (zahl < 0)
zahl *= (-1);
int i, ziffernanzahl = 1;
for (i = 10; i <= zahl; i *= 10)
ziffernanzahl++;
return ziffernanzahl;
}
int *getz(int zahl, int ziffernanzahl)
{
int i, stellenwert = 10;
int *zptr = new int[ziffernanzahl];
for(i = ziffernanzahl-1; i >= 0; i--, stellenwert *= 10)
{
zptr[i] = (zahl % stellenwert) / (stellenwert/10);
}
return zptr;
}
int main(int argc, char **argv)
{
int zahl, i;
int ziffernanzahl;
cout << "Bitte geben sie eine Zahl ein: ";
cin >> zahl;
if (!cin)
{
cout << "Es ist bei der Eingabe ein Fehler aufgetreten!\n";
exit(1);
}
ziffernanzahl = cntz(zahl);
cout << "Ziffernanzahl: " << ziffernanzahl << "\n";
int *zptr = getz(zahl, ziffernanzahl);
for (i = 0; i < cntz(zahl); i++)
{
cout << zptr[i] << "\n";
}
delete [] zptr;
return 0;
}
--
we would change the world if god gave us the source code...
and remember, science is nothing more than reverse engineering nature...
Re: Ziffern aus einer Zahl auslesen
norman am 06.07.2008 um 18:17
for (i = 0; i < cntz(zahl); i++) {
cout << zptr[i] << "\n";
}
Warum willst du die Anzahl der Ziffern bei jeder Iteration ermitteln lassen?
Das ist unnoetig, die Zahl ist konstant. Das erzeugt einen riesigen Overhead im Vergleich zu einer einfachen Abfrage der Variablen ziffernanzahl. So kann der Compiler auch besser optimieren und setzt ohne Abfrage immer wieder die gleiche Zahl ein.
Und die Definition von zptr wuerde ich in eine Deklaration am Anfang der Funktion und in eine Zuweisung aufteilen. Ist sauberer und uebersichtlicher. Die befindet sich sowieso im gleichen Gueltigkeitsbereich wie die Deklarationen am Anfang, daher macht es keinen Unterschied in der initialen Groesze des Stackframes.
Aber wie du es letztlich machst, ist hier technisch voellig egal.
Re: Ziffern aus einer Zahl auslesen
hostlin am 06.07.2008 um 22:13
Zitat:
Warum willst du die Anzahl der Ziffern bei jeder Iteration ermitteln lassen?
Das will ich natürlich nicht, ich hatte mir bezüglich der Performance allerdings hier keine grossen Gedanken gemacht, da hier ich eh' nicht mit grossen Datenmengen hantiere. Ich habe das wohl einfach übersehen, sonst hätte ich das verbessert.
Zitat:
Und die Definition von zptr wuerde ich in eine Deklaration am Anfang der Funktion und in eine Zuweisung aufteilen.
Ansichtssache.
--
we would change the world if god gave us the source code...
and remember, science is nothing more than reverse engineering nature...
