Forum: PC-Programmierung Zahl in Einer,Zehner, usw Stellen zerlegen


von Daniel (Gast)


Lesenswert?

Hallo zusammen!

Ich grübel zur Zeit an einer Funktion, die mir eine Integer-Zahl in die
einzelnen Dezimal-Stellen zerlegt. Also wenn ich z.B. 3426 übergebe,
soll mir die Funktion einzeln 3, 4, 2 und 6 zurück geben (evtl. in
einem Array). Die Funktion an sich ist mir nicht so wichtig, mich
interessiert vor allem der benätigte Algorithmus. Wahrscheinlich ist
das Problem trivial und schon tausend mal gelöst, aber ich komme
einfach nicht auf einen grünen Zweig.

Bin für alle Ideen/Vorschlöge dankbar!

Gruß
Daniel

von ..,- (Gast)


Lesenswert?

3426 / 1000 = 3
(3426 - 3*1000) / 100 = 4
(3426 - 3*1000 - 4*100) / 10 = 2
(3426 - 3*1000 -4*100 - 2*10) = 6

usw.

Sind alles Integerdivisionen.

von .... (Gast)


Lesenswert?

hmm das ward variante a die nur funzt wenn du die zahl kennst also
ruß.->tschuldigung.

besser geht das mit dem modulo opperator %  dieser führt eine
ganzahldivison aus und  gibt den rest als rückgabewert.
also

in c -syntax
....
x=3246;
a=x%10;
x=x/10;
b=x%10;
x=x/10;
.....

!! a wäre dann also 6, b wäre  also 4, ....
!!! und noch eines bei dieser variante zerlegst du dir dein x !

natürlich kann man das auch in ne schleife packen und dabei dann
jedesmal denn arrayindesx erhöhen.

Mischa

von henning (Gast)


Lesenswert?

sehr bewährt:

x ist int
array[4] ist unsigned char

array[3] = x / 1000;
array[2] = x % 1000 / 100;
array[1] = x % 100 / 10;
array[0] = x % 10;

von Frank Schuessler (Gast)


Lesenswert?

So geht's auch
Beispiel bei 16 stelliger Zahl

int i=0;
int zahl_i = 1234567890123456;
char zahl_c[17];
snprintf(zahl_c, sizeof(zahl_c), "%d", zahl_i);

dann ist

zahl_c[0]=1
zahl_c[1]=2
zahl_c[2]=3
.... usw

strlen(zahl_c) gibt die Anzahl der Char Elemente in dem Array zurück
(bis zur Terminierung mit \0); in diesem Fall 16

von Frank Schuessler (Gast)


Lesenswert?

kleine Ergänzung, natürlich kann ein 16 bit int nicht 1234567890123456
gross werden

-fs-

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

@Frank
Stehen in dem array dann nicht die Ascii Codes der Zahlen drin?

von Frank Schuessler (Gast)


Lesenswert?

@Tobi,

koennte sein, dann z.B. mit atoi(zahl_c[x]) wieder in int
konvertieren.

-fs-

von Frank Schuessler (Gast)


Lesenswert?

verdammt, warum vergess ich nur immer die Hälfte, ich glaube das "%d"
beim snprintf bewirkt dass die Int Zahl auch als solche im Char Array
steht. Habe gerade keine Entwicklungsumgebung  bzw Debugger hier um's
auszuprobieren, hab sowas aber schon öfter auf obige Weise gelöst.

-fs-

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

atoi lohnt sich da nicht, es reicht das:
zahl = zahl_c[0] - 48; usw...

Aber macht doch nix, der Ansatz stimmt doch :)

von pittbull (Gast)


Lesenswert?

oder so:
char *numstr (unsigned int v)
{
  static char t[10] = {0,0,0,0,0,0,0,0,0,0};
  char *p = t + 9;
  while(1)
  {
    unsigned int z = v/10;
    *p = '0' + (char)(v-(z<<3)-(z<<1));
    if (!z)
      break;
    v = z;
    p--;
  }
  return p;
}

aufrufen dann so:
char *p = numstr(12345);

in p[0] steht dann '1', in p[1] '2' usw. p[5] enthält eine 0 als
ende-kennung

von Tobi H. (tobi-) Benutzerseite


Lesenswert?

Der Aufwand lohnt nicht, nimm einfach itoa

von Tobias P. (Gast)


Lesenswert?

Gibt es auch so eine Funktion für float Werte ?

spezielle Anwendung:
ADC-Werte auf 7 Segment darstellen.

von Karl H. (kbuchegg)


Lesenswert?

> zahl = zahl_c[0] - 48;

Ist prinzipiell schon richtig.
Nur schreibs als:

zahl = zahl - '0';

Sieht erstens besser aus.
Zweitens muss sich niemand fragen warum
den nu 48
Drittens geht das dann auf jedem System, auch
wenn es nicht ASCII benutzt.

von Karl H. (kbuchegg)


Lesenswert?

> Gibt es auch so eine Funktion für float Werte ?

itoa =   int to alphanumeric
ftoa =   float to alphanumeric

... falls dein Compiler diese Funktionen überhaupt anbietet.
Beides sind nicht-standard Funktionen.

Ansonsten kannst Du immer sprintf benutzen. Das hat dann
auch den Vorteil, daß Du die Formatierung wesentlich besser
steuern kannst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.