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:

Dezimalzahl Kommastelle verrücken

 
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
Onkel Paul



Anmeldungsdatum: 24.11.2016
Beiträge: 3

BeitragVerfasst am: 24.11.2016, 21:07    Titel: Dezimalzahl Kommastelle verrücken Antworten mit Zitat

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 24.11.2016, 23:52    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 24.11.2016
Beiträge: 3

BeitragVerfasst am: 25.11.2016, 21:21    Titel: [GELÖST] Komma verschieben Antworten mit Zitat

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



Anmeldungsdatum: 24.11.2016
Beiträge: 3

BeitragVerfasst am: 26.11.2016, 18:12    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 26.11.2016, 21:00    Titel: Antworten mit Zitat

Code:
WHILE z# < 1
z# = z# * 10
WEND

kann ein bisschen dauern, wenn z# = 0 ist. lächeln

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