Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zahlen aus einer Variable lesen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Geforcer



Anmeldungsdatum: 13.09.2006
Beiträge: 2

BeitragVerfasst am: 13.09.2006, 11:30    Titel: Zahlen aus einer Variable lesen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.09.2006, 12:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 13.09.2006, 12:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.09.2006, 13:04    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Geforcer



Anmeldungsdatum: 13.09.2006
Beiträge: 2

BeitragVerfasst am: 13.09.2006, 19:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.09.2006, 22:29    Titel: Antworten mit Zitat

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 (lächeln setzen.
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 13.09.2006, 22:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.09.2006, 22:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 14.09.2006, 08:12    Titel: Antworten mit Zitat

@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
Code:
a% ^ b%

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz