![Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht](misc/logos/logo.png) |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Onkel Paul
Anmeldungsdatum: 24.11.2016 Beiträge: 3
|
Verfasst am: 24.11.2016, 22:07 Titel: Dezimalzahl Kommastelle verrücken |
|
|
Abend zusammen,
ich wollte mich nach langer Abstinenz wieder etwas mit QB befassen. Gedacht ist eine schriftliche Division. Stecke jetzt aber schon am Anfang fest.
Folgendes ist gedacht:
Z.B. Eingabe 5/3,55
Jetzt soll der Nenner ausgelesen werden Stelle für Stelle. Klappt auch ganz gut (inkl Rückgabe der einzelnen Zeichen). Nun wollte ich gern haben, daß QB "sieht", daß da ein Komma und wie hier z.B. 2-Nachkommastellen sind. Für unser Bsp soll nun die 3,55 mit 100 multipliziert werden (ebenso der Nenner). Als nächstes evtl eine Kürzung des Bruches und dann die Berechnung.
Leider will das Prog mir nicht z.B. die Anzahl der Zeichen rechts vom Komma geben.
Habe erstmal in einem seperaten "Testprogramm" versucht, daß QB bei erreichen des "Kommas" mit dem Zählen abbricht. Eventuell bin ich ja nur auf dem Holzweg.... |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 25.11.2016, 00:52 Titel: |
|
|
Wenn du hier eine INPUT-Eingabe verwendest, vermute ich einmal ganz stark, dass das Komma als Trennzeichen für die Eingabe gesehen wird - sprich: es wir nur bis (ausschließlich) zum Komma gelesen. Abhilfe kann da LINE INPUT schaffen. Wenn es an was anderem liegt, poste mal ein Minimalbeispiel, dann sieht man besser woran es hakt. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Onkel Paul
Anmeldungsdatum: 24.11.2016 Beiträge: 3
|
Verfasst am: 25.11.2016, 22:21 Titel: [GELÖST] Komma verschieben |
|
|
Also,
ich habe normalen INPUT genommen.
Zitat: | CLS
INPUT "Zaehler:", z#
z$ = STR$(z#) 'Anzahl Stellen Z„hler
'Ermitteln Anzahl Stellen (inkl Komma)
Anzahl% = LEN(z$) - 1
PRINT "Stellen Zaehler:"; Anzahl%
Ziffer$(stelle%) = MID$(z$, Anzahl%, 1)
FOR stelle% = 1 TO LEN(z$) - 1
'Ausgabe der akt. Stelle
PRINT MID$(z$, stelle% + 1, 1)
SLEEP 1
NEXT stelle%
'Ausgabe Stelle nach Komma
PRINT
komma% = 2 * Anzahl% - stelle% - 1
PRINT
PRINT "nach Komma:"; komma%
'Kommaverschiebung
neu% = (10 ^ komma%) * z#
PRINT "vorher:"; z#; "=> nachher:"; neu%
END
|
Wenn ich zB 3.56 eingebe, erhalte ich folgende Ausgabe:
Zitat: | Zaehler:3.56
Stellen Zaehler: 4
3
.
5
6
vorher: 3.56 => nachher: 356
|
Bin also erstmal ein Stück weiter (hab einfach mal rumprobiert).
Jetzt kann ich mit dem nächsten Teil weitermachen!
Danke!
Gruß |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
Onkel Paul
Anmeldungsdatum: 24.11.2016 Beiträge: 3
|
Verfasst am: 26.11.2016, 19:12 Titel: |
|
|
Nach rumprobieren bin ich jetzt fast am Ziel!
Zitat: | CLS
INPUT "Zaehler:", zaehler#
'Testen ob Zahl negativ
IF zaehler# < 0 THEN
z# = zaehler# * (-1)
ELSE z# = zaehler#
END IF
'Testen ob Zahl zw. 0 und 1
WHILE z# < 1
z# = z# * 10
WEND
PRINT "Zahl="; z#
WHILE z# <> INT(z#)
z# = z# * 10
PRINT "neu#="; z#
WEND
z$ = STR$(z#) 'Anzahl Stellen Z„hler
'Ermitteln Anzahl Stellen (inkl Komma)
anzahl# = LEN(z$) - 1
PRINT "Stellen Zaehler:"; anzahl#
Ziffer$(stelle%) = MID$(z$, anzahl#, 1)
FOR stelle# = 1 TO LEN(z$) - 1
'Ausgabe der akt. Stelle
'PRINT MID$(z$, stelle# + 1, 1)
'SLEEP 1
NEXT stelle#
'Ausgabe Stelle nach Komma
PRINT
komma# = 2 * anzahl# - stelle# - 1
PRINT "KO="; komma#
WHILE komma# < 1
komma# = komma# + 1
PRINT "K="; komma#
WEND
'Exponent ermitteln
exponent# = 10 ^ komma#
PRINT "E="; exponent#'Exponent
SLEEP
'Kommaverschiebung
IF 0 > zaehler# < 1 THEN
neu# = exponent# * zaehler#
ELSE neu# = exponent# * z#
END IF
IF neu# > z# THEN
neu# = neu# / 10
ELSE neu# = neu# * 10
END IF
PRINT "vorher:"; zaehler#; "=> nachher:"; neu#
END |
Nun ein paar Bsp, was noch nicht so optimal läuft.
Eingabe: 0.123
Zitat: | Zaehler:0.123
Zahl= 1.23
neu#= 12.3
neu#= 123
Stellen Zaehler: 3
KO= 1
E= 10
vorher: .123 => nachher: 12.3 |
Eingabe: 12.01
Zitat: | Zaehler:12.01
Zahl= 12.01
neu#= 120.1
neu#= 1201
Stellen Zaehler: 4
KO= 2 'so sollte es immer sein
E= 100 'richtiger Exponent
vorher: 12.01 => nachher: 12010 'nur hier stört die überflüssige Stelle |
Irgendwelche Ideen, was ich da noch falsch mache? |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
nemored
![](images/avatars/18585278245ddb8b9d8710.png)
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 26.11.2016, 22:00 Titel: |
|
|
Code: | WHILE z# < 1
z# = z# * 10
WEND |
kann ein bisschen dauern, wenn z# = 0 ist.
Was mich irritiert, ist
Code: | komma# = 2 * anzahl# - stelle# - 1 |
Da berechnest du die Position des Kommas ausschließlich über die Länge des Strings (stelle# ist nach Durchlauf der FOR-Schleife gleich LEN(z$)).
Um die Position des Kommas zu bestimmen, würde ich innerhalb der FOR-Schleife überprüfen, ob die aktuelle Stelle das Komma (bzw. der Punkt) ist oder nicht.
Code: | FOR stelle# = 1 TO LEN(z$) - 1
IF MID$(z$, stelle#, 1) = "." THEN komma# = stelle#
NEXT stelle# |
Funktioniert aber nur mit der originalen Angabe, in der der Dezimalpunkt noch drin ist ... _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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.
|
|