mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ..,- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: .... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: henning (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Frank Schuessler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank Schuessler (Gast)
Datum:

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

-fs-

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

Autor: Frank Schuessler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Tobi,

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

-fs-

Autor: Frank Schuessler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

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

Aber macht doch nix, der Ansatz stimmt doch :)

Autor: pittbull (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobi H. (tobi-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Aufwand lohnt nicht, nimm einfach itoa

Autor: Tobias P. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es auch so eine Funktion für float Werte ?

spezielle Anwendung:
ADC-Werte auf 7 Segment darstellen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.