http://www.pronix.de -> Forum -> C-Programmieren -> Code-Schnipsel

Unterseiten

Code-Schnipsel

Moderatoren: broesel, Martin Conrad, Patrick

Thema: [EDIT] - Ziffern aus einer Zahl auslesen

  • (nur registrierte Mitglieder)
Das von mir in C++ geschriebene und unter der GPL stehende Programm liest die Ziffern aus einer Zahl aus und speichert diese.


// 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...

 
Hallo,

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;
}
 
Alles klar, ich habe das Programm nun korrigiert und 2 Zeilen eingefügt, die dem Programm das Verarbeiten von negativen Ganzzahlen ermöglicht (auch wenn die Ausgabe nicht schön aussieht).


#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...

 

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.
 
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...

 
  • (nur registrierte Mitglieder)