PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zahl in Ziffern zerlegen



Murus
06.11.2005, 11:21
Hallo zusammen,

ich muss bei nem Programm eine Zahl in ihre zwei Ziffern zerlegen und diese als Variablen speichern. Wie mache ich das, ohne die Zahl in einen String zu zerlegen und dann mit "mid" zu arbeiten?

ChrisM
06.11.2005, 11:33
Hi,

die Einerstelle kriegst du einfach mit Modulo 10, die Zehnerstelle mit Modulo 100 und dann teilen durch 10 (mit Abrundung, was das Standardverhalten bei fast allen Sprachen ist).
Den Modulo 100 kannst du dir auch sparen, wenn du weißt, dass die Zahl zweistellig ist.

ChrisM

darwin.nuernberg
06.11.2005, 11:50
In welcher Programmiersprache möchtest du dies Realisieren?

Für Bascom wäre folgende Lösung denkbar:
Verwende die Befehle ABS() und MOD



$regfile = "m8def.dat"
$crystal = 16000000
Baud = 9600

' Dieses Beispiel zerlegt eine Zahl (bis 99) in die Zehner und Einer.

Dim Ix1 As Integer ' Quelle Source Variable
Dim Ix2 As Integer ' Erstes Ergebniss
Dim Ix3 As Integer ' zweites Ergebniss

Dim Fx As Single ' Fliepßkomma Variable (Temporär)

Ix1 = 25

Fx = Ix1 / 10
Ix2 = Abs(fx)
Ix3 = Ix1 Mod 10

Print " Eingabe = ";
Print Ix1
Print " 1. Wert (10er) = ";
Print Ix2
Print " 2. Wert (1er) = ";
Print Ix3

End 'end program


Als Ausgabe erscheint:

Eingabe = 25
1. Wert (10er) = 2
2. Wert (1er) = 5

Murus
06.11.2005, 11:57
Zum Modulo: Wie meinst du das?
Hmm, 17 mod5 ist doch 2, oder?
Aber wie hilft mir das`?
Und was macht Abs?

Ah, logisch! Habs rausgefunden
Abs nimmt nur die Stelle vor dem Komma, und mit dem Mod 10 krieg ich den Einer! Alles klar! Danke!

Anstelle dem "Integer" kann ich auch ein Byte nehmen, oder?

Was ist vom Code her besser? Die Zahl in einen String zu verwandeln und dann mit "mid" oder die obige Variante?

darwin.nuernberg
06.11.2005, 12:06
Wieso mod 5?

Du möchtest doch die einzelnen Stellen 10er und 1er erhalten oder nicht.

Also musst du durch 10 teilen

Wenn Du etwas anderes beabsichtigst dann stelle Deine Frage genauer!

Die Zehner
erhälst Du wenn du die Absolute Zahl ermittelst 17/10 = 1,7 davon die Absolute = 1

Die Einer
17 mod 10 = 7

Natürlich kannst Du noch erweitern wenn Du mehr Stellen willts dazu musst du dann der Quelle das Ergebniss abziehen

Oder wolltest Du in Oktal oder Hexadezimal arbeiten, dann kommst Du um eine String Konvertierung nicht herum.

Murus
06.11.2005, 12:08
Nene, du verstehst mich falsch. Die 17mod5 waren nur ein Beispiel für die Modulo-Rechnung, habs fast vergessen.
Der Weg ist mir klar!
Vielen Dank

darwin.nuernberg
06.11.2005, 12:13
Anstelle dem "Integer" kann ich auch ein Byte nehmen, oder?

Was ist vom Code her besser? Die Zahl in einen String zu verwandeln und dann mit "mid" oder die obige Variante?

Klar, wenn deine Zehhner nicht größer als 255 werden kannst Du auch Byte verwenden,
Die Einer werden in diesem Beispiel auch nicht größer als 9

Aber wenn Du was anderes Machst (z.B Zahlen mit größerem Startwert) dann solltest Du den Worst Case erst einmal berechnen ob der dann keinen Fehler verusracht,


Strings:
Du hattest doch eine Lösung ohne Strings gewünscht, also nimmst Du diese Losung auch gefälligst, sonst werd ich Sauer :-k

Da reißt ma sich den Arsch (das Hinterteil) auf und dann sowas....

Murus
06.11.2005, 12:40
Wowow, easy...

Klar nehm ich diese Lösung, bei dem String hab ich das Problem, wenn die Zahl kleiner als 10 wird, dann gehts nicht mehr sauber auf und ich muss extra "nachhelfen". Hab ich hier net... Mich hats einfach wunder genommen, was jetzt grösser ist.

darwin.nuernberg
06.11.2005, 13:48
wenn die Zahl kleiner als 10 wird, dann gehts nicht mehr sauber auf und ich muss extra "nachhelfen".

Naja, ist doch klar:
Bei der Stringbehandlung muss man halt vorher abfragen wie lange die Zeichenkette ist { if len(string) >1 then.... else....}