Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Geforcer
Anmeldungsdatum: 13.09.2006 Beiträge: 2
|
Verfasst am: 13.09.2006, 11:30 Titel: Zahlen aus einer Variable lesen |
|
|
Hallo
ich wollte mal wissen ob ich 2 bestimmte zahlen aus einer 5 stelligen zahl lesen kann und damit rechnen kann?
mein genaues Vorhaben ist das sich sagen wir mal variable Z% sich bei einer schleife hochzählt und ich daraus 5 weitere Variablen baue
und zwar
a% = 1. und 2. zahl von Z%
b% = 2. und 3. zahl
c% = 3. und 4. zahl
d% = 4. und 5. zahl
das grösste problem ist das die erste zahl der 5 stelligen nummer auch ruhig ne null sein kann!also die zahl muss immer 5 stellig sein! habe mir überlegt Z% 6 stellig zu machen und erst ab der 2. Stelle auszulesen, bekomme das auslesen aber irgendwie nicht hin! könnt ihr mir vielleicht sagen wie ich das machen könnte?
Mfg Dennis |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.09.2006, 12:05 Titel: |
|
|
Hallo und Wilkommen im Forum!
Du könntest es so machen:
Code: | CLS
zahl = 123
zahl$ = STR$(zahl)
zahl$ = RIGHT$(zahl$, LEN(zahl$) - 1)
DO
IF LEN(zahl$) < 5 THEN zahl$ = "0" + zahl$
LOOP UNTIL LEN(zahl$) = 5
FOR stelle = 1 TO 5
ziffer(stelle) = VAL(MID$(zahl$, stelle, 1))
PRINT ziffer(stelle)
NEXT |
- Zahl in eine Stringvariable umwandeln
- führendes Leerzeichen (Platzhalter für Minuszeichen) entfernen
- führende Nullen hinzufügen
- Einzelne Zeichen des Strings auslesen und in Zahl zurückwandeln
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 13.09.2006, 12:25 Titel: |
|
|
Mit ein wenig rumprobieren ist das herausgekommen:
Code: | 1 CLS
zahl% = 32767
s1% = zahl% MOD 10
s2% = zahl% \ 10 MOD 10
s3% = zahl% \ 100 MOD 10
s4% = zahl% \ 1000 MOD 10
s5% = zahl% \ 10000 MOD 10
PRINT "Zahl:"; zahl%
PRINT "Einer: "; s1%
PRINT "Zehner: "; s2%
PRINT "Hunderter: "; s3%
PRINT "Tausender: "; s4%
PRINT "Zehntausender:"; s5% |
Möchtest du immer 2 statt nur einer Stelle haben, dann musst für die MOD 10 einfach MOD 100 einsetzen, bei 3 Stellen MOD 1000 usw... Außerdem musst du die Teiler anpassen, ach ich zeigs dir nochmal:
Code: | 1 CLS
zahl% = 32767
s1% = zahl% MOD 100
s2% = zahl% \ 100 MOD 100
s3% = zahl% \ 10000 MOD 100
s4% = zahl% \ 1000000 MOD 100
s5% = zahl% \ 100000000 MOD 100
PRINT "Zahl:"; zahl%
PRINT "s1:"; s1%
PRINT "s2:"; s2%
PRINT "s3:"; s3%
PRINT "s4:"; s4%
PRINT "s5:"; s5% |
Und jetzt nochmal, weil mir so langweilig war, das ganze als Routine, wobei man nur die Zahl und die Größe der Zahlenblöcke angeben muss. Gespeichert werden die Werte in einem Array, das von 0 bis gr% geht.
Wie man sieht, hab ich es geschafft, ganz auf Stringbefehle zu verzichten. (Obs nun Performancevorteile gibt, wage ich zu bezweifeln.)
Code: | CLS
'Vorbereitungen
DIM zahl AS LONG
DIM teilgr AS INTEGER
zahl = 3111984
teilgr = 2
'Hier wird die Zahl aufgeteilt und in ein Array gespeichert
'Groesse des Arrays ermitteln
k% = 0: s& = 1: WHILE zahl / s& > 1: s& = s& * 10: k% = k% + 1: WEND
gr% = k% / teilgr
'Array erstellen
DIM Z(0 TO gr%) AS INTEGER
FOR i% = 0 TO gr%
Z(i%) = zahl \ ((10 ^ (i% * teilgr))) MOD 10 ^ teilgr
NEXT
'Und den ganzen Mist anzeigen
'CLS
PRINT zahl
FOR i% = 0 TO gr%
PRINT Z(i%)
NEXT
|
_________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.09.2006, 13:04 Titel: |
|
|
Hallo
@SpionAtom: Deine Version ist besser weil einfacher. Vielleicht das Ganze noch in eine Schleife packen und für die Ziffern ein Array benutzen.
Code: | CLS
zahl% = 123
FOR stelle = 4 TO 0 STEP -1
s%(stelle) = zahl% / 10 ^ stelle MOD 10
PRINT s%(stelle)
NEXT |
@Geforcer: Wenn du die Variable als Integer deklarierst, kannst du nur bis maximal 32767 gehen.
Gruss
Skilltronic
EDIT: hatte das EDIT des letzten Beitrags noch nicht gesehen... _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Geforcer
Anmeldungsdatum: 13.09.2006 Beiträge: 2
|
Verfasst am: 13.09.2006, 19:54 Titel: |
|
|
erst mal vielen dank für die vielen antworten aber komme bei meinem programm wieder mal nicht weiter könnt ihr euch mal angucken wasich falsch mache? bekomme immer ein überlauf fehler von d1
Code: | 1 CLS
e% = 6442
DIM zahl AS LONG
DIM a1 AS LONG
DIM b1 AS LONG
DIM c1 AS LONG
DIM d1 AS LONG
DIM e1 AS LONG
FOR zahl = 100000 TO 199999
a% = zahl \ 10 MOD 100
b% = zahl \ 100 MOD 100
c% = zahl \ 1000 MOD 100
d% = zahl \ 10000 MOD 100
a1 = a% * a% * a% * a% + 80
b1 = b% * b% * b% * b% * b% * 5
c1 = c% * c% * c% - 100
d1 = d% * d% * d% * d% * d% + 1234
e1 = a1 + b1 + c1 + d1 + 100
IF e% = e1 THEN PRINT zahl and goto 100
NEXT zahl
100
end
|
|
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.09.2006, 22:29 Titel: |
|
|
Hallo
Ist zwar nur Spekulation, weil ich nicht genau weiss, wie der Interpreter im Detail im Hintergrund arbeitet, aber es könnte sein, das er beim Multiplizieren das Format der Variable d% (also Integer) verwendet und deshalb die Überlaufmeldung kommt. Wenn man nämlich
d% * d% * d% * d% * d%
durch
d% ^ 5
ersetzt, funktioniert es. Ich verstehe aber nicht ganz, was du machen willst. Für das Aufsplitten einer Zahl in ihre Ziffern, hat dir SpionAtom ja ein funktionierendes Beispiel geschrieben.
Gruss
Skilltronic
EDIT: Ach ja, und das "PRINT zahl AND GOTO 100" mag sich zwar sprachlich gut anhören, in QB ist AND aber eine logische Verknüpfung und kann so nicht verwendet werden. Du müsstest statt des AND einen Doppelpunkt ( setzen. _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 13.09.2006, 22:37 Titel: |
|
|
Für das Extrahieren der einzelnen Stellen gibt es grundsätzlich zwei Wege: via String und mittels Herausdividieren. Beide Wege werden in
http://beilagen.dreael.ch/QB/ZIFFEXTR.BAS
kurz gezeigt. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 13.09.2006, 22:54 Titel: |
|
|
Hallo
@dreael: Du kennst dich doch mit sowas aus - liege ich mit meiner Erklärung, warum d% fünf mal hintereinander multiplizieren nicht geht, d%^5 dagegen schon ungefähr richtig?
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 14.09.2006, 08:12 Titel: |
|
|
@Skilltronic:
Normale Multiplikationen bewegen sich im Körper der 16-Bit-Ganzzahlen. Daher kommt man schnell über die 32767-Obergrenze hinaus, womit das Ganze wie von Dir korrekt beobachtet mit einem Overflow Error endet...
Der Potenzoperator - dies muss man wissen - arbeitet immer im Fliesskommamodus und ist deswegen entsprechend langsam im Vergleich zu Integer-Multiplikationen. Ein
wird sogar in Wirklichkeit intern als
Code: | EXP(LOG(CSNG(a%)) * CSNG(b%)) |
verarbeitet. Dies nur, damit man sich einmal bewusst wird, was man da alles an Operationen auslöst. Und EXP() und LOG() sind analog SIN() und COS() aufwändige Reihenoperationen, die entsprechend Rechenzeit kosten.
Ich denke, Leute, die wie A.K. mit Assembler programmieren, wissen schon, von was ich rede... _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
|