Dezimalzahl stellenweise nach Array kopieren

MrChipsy

Level-1
Beiträge
11
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
ich suche eine Möglichkeit eine eingegebene Dezimalzahl stellenweise in ein Array zu speichern.
Beispielsweise wird 345 übergeben, jetzt soll die 5 nach array[0], die 4 nach array[1] und die 3 nach array[2] geschoben werden. Ein array[..]= 0 ist das
Abbruchkriterium. Möglicherweise stehe ich nur auf dem Schlauch oder das Ganze ist so einfach nicht zu machen. Welche Datentypen würdet ihr nehmen?
Die Sprache ist ST.
Ich hoffe ihr könnt mir helfen und bedanke mich schonmal vorab.:D
 
Hallo MrChipsy,
ich hätte da 2 Ideen:
Variante 1:
Du läufst in einer Schleife von 1 bis len(int_to_string(deineVariable))
und fischt dann das laufende Zeichen raus, wandelst es wieder in ein Byte und ab ins Array.
Oder
Variante 2:
Du läufst in einer Schleife wo du die Größe deiner variable runterrechnset und ...
Du nimmst einfach deine Zahl, teilst durch 10 mal 10 und ziehst dieses wiederum von deiner Zahl ab.
Somit bekommst du immer die 1.er Stelle...
Jetzt nur noch in der Schleife durch 10 Teilen, damit deine Zahl immer um den Faktor 10 kleiner wird.
Ich hoffe mich nicht zu kompliziert ausgedrückt zu haben.

LG
Shrimps
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe das mal auf die schnelle probiert:
Die tmp1 und tmp2 sind nur kleine Hilfen fürs tracen, kann man alles logischerweise zusammencrunchen...
Die Schrittkette ist nur für mein Gewissen :cool:

LG
Shrimps
Code:
PROGRAM MAIN
VAR

    aZahlen    : ARRAY [0..9] OF INT;
    iTest    : INT := 3456;
    Index    : INT;
    iLen        : INT;
    Schritt     : UINT;
    tmp1, tmp2    :  INT;
END_VAR

CASE Schritt OF

0:
    iLen    := LEN(INT_TO_STRING(iTest));
    Schritt := 10;

10:
    FOR Index := 0 TO iLen - 1 DO;
        tmp1 := itest / 10 * 10;
        tmp2 := itest - tmp1;
        aZahlen[Index] := tmp2;
        itest := itest / 10;
    END_FOR

    Schritt := 20;

20: ;

END_CASE
 
Vielen Dank für die Tipps.
Die Berechnung von tmp1 erschließt sich mir noch nicht. itest/10 *10 =>itest.
Kannst du deine Berechnung nochmal erleutern?
 
Hi,
ich war etwas "schmutzig":
Da die variable temp1 als INT deklariert ist, nutze ich diese zum Runden.
Wenn du also 3456 /10 * 10 rechnest, kommt 3450 raus !
Daher: 3456 - 3450 = 6 !!!

usw...


LG
Shrimps
 
Als Alternative könnte man auch die Zahl in ein String wandeln (INT to String) und dann auf die einzelnen Zeichen (CHAR) zugreifen!
Entweder wandelt man jedes einzelnes Zeichen dann wieder zurück in INT (String to INT) wenn man es in Array schreibt,
oder man kann auch den Zeichenwert – 30hex nehmen und hat somit den Zahlenwert.
 
Hallo,

ich habe auch noch etwas. Um an die Länge zu kommen könnte man anstelle von
Code:
iLen    := LEN(INT_TO_STRING(iTest));
auch mit dem Logarithmus arbeiten
Code:
iLen    := LOG(iTest)+1;

Hier jetzt noch eine Lösung mit while Schleife
Code:
WHILE iTest<>0 DO
    temp := iTest/10;
    aZahlen[Index] := iTest-temp*10;
    iTest := temp;
    Index := Index+1;
END_WHILE

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mist,

jetzt habe ich auch noch den Modulo vergessen

Code:
WHILE iTest <>0 DO
    aZahlen[Index] := iTest mod 10;
     iTest := iTest/10;
     Index := Index+1;
 END_WHILE

Gruß
 
Zuletzt bearbeitet:
Hallo Thruser,
die Idee mit dem LOG() habe ich nachgestellt und bei meiner Typendeklaration (INT) geht dies nicht !
Gibt ne Fehlermeldung !!!
(Fehler 4010: Unverträgliche Typen, kann REAL nicht in INT konvertieren )
Geht demnach nur mit
iLen := rela_to_int(log(iTest)) + 1;

LG
Shrimps
 
Hallo Shrimps,

das habe ich weiter überprüft. Wollte nur zeigen wie man auch mathematisch die Anzahl der Stellen bestimmen kann.

@Fragesteller
mir ist gerade aufgefallen, daß das Abbruchkriterium nicht funktioniert. Du kannst damit keine Zahlen angeben die eine Null enthalten. Schon bei der 10 wird als erstes die 0 geschriebeen Array[0]=0. Als Abbruchkriterium müßte man dann entweder >9 oder <0 wählen.

Was mir gestern Abend noch eingefallen ist: Das ist ja eigentlich eine der typischen Übungsaufgaben für Anfänger. Meistens muß man da ja eine Zahl in einen String wandeln. Vielleicht finden sich noch andere Lösungen die man hier sammeln könnte. Man könnte ja auch mal versuchen möglichst komplizierte oder aufwendige Varianten anzugeben.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da hast du recht, es handelt sich wirklich um eine Anfängerfrage. Ich beschäftige mich in der Berufsschule mit SPS und vertiefe es privat.
Vielen Dank nochmal für die tolle Hilfe.
 
Zurück
Oben