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:

?speichern von isoloierten ziffern in variablen?

 
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
5T3PH4N



Anmeldungsdatum: 01.10.2005
Beiträge: 145
Wohnort: Braunshardt

BeitragVerfasst am: 09.10.2005, 20:18    Titel: ?speichern von isoloierten ziffern in variablen? Antworten mit Zitat

hallo, freunde der programmiersprache, die wir alle basic nennen!
ich bin es wieder, mit einer neuen frage.
vorher: es handelt sich zwar (wieder) um eine hausaufgabe, aber ich möchte nicht dass ihr sie für mich macht, sondern habe mir gedanken gemacht und brauche hilfe.

also: aufgabe war, dass der benutzer eine mehrstellige zahl eingibt, und die einzelnen ziffern getrennt voneinander gespiecht werden.
(ich weiß nicht was mein lehrer damit will, vielleicht quersummen rechnen oder so...)

ich habe mir gedacht, dass man das man dafür den left$ oder right$ befahl nehmen könnte. wenn man das in eine do loop schleife schreibt, müsste das so oft wiederholt werden, bis alle ziffern isoliert sind.
dann kommt die erste frage auf:
-wann soll der computer aufhören, wenn man nicht den benutzer "zahl.0" eingeben lassen will und einfach until variable = .0 schreibt?
angenommen das ist geschafft, müssen die variablen gespeichert werden, denn wenn man das nicht macht, steht eine ziffer ja in einer variablen und wird beim zweiten durchgang wieder überschrieben. also:
-wie speichere ich die wenn ich nicht x-mal x=a1 x=a2... schreiben will?
angenommen, die variablen einer zb. 5 stelligen zahl sind gespeichet und man will wirklich die quersumme ausrechnen (unabhängig vom unterricht, aus interesse^^), wie macht man das dann?
-wie erkennt der computer, wie viele zahlen gespeichert wurden (und er addieren muss)?

so das waren drei fragen und ich hoffe dass die reativ verständlich gestellt sind.

gruß,
Stephan
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 09.10.2005, 20:23    Titel: Antworten mit Zitat

Nimm als Eingabe einen String und isoliere jedes einzelne Zeichen mit MID$(Eingabe$, Position, 1).

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 09.10.2005, 20:31    Titel: Antworten mit Zitat

Hallo!

Wenn ich das jetzt richtig verstanden habe geht's so: (nur ein Lösungsweg von evtl. vielen:

Die Zahlen einzeln speichern:

Code:

DIM SHARED isolierte.zahlen$ (50) ' Hier müsste schon mal vorweg angegeben werden wieiviele Stellen die Zahl hat. Andere Möglichkeit wäre ein dynamisches Array

INPUT "Zahlen eingeben: ", zahlenkette$

FOR zahlen.isolieren=0 to len(zahlenkette$)
    isolierte.zahlen$(zahlen.isolieren)=MID$(zahlenkette$, zahlen.isolieren, 1)
NEXT zahlen.isolieren


Dann wären die Zahlen schonmal "zerlegt" und in das Array gespeichert.



Zitat:

-wie erkennt der computer, wie viele zahlen gespeichert wurden (und er addieren muss)?


Code:

anzahl.der.zahlen=LEN(zahlenkette)



Zitat:

man will wirklich die quersumme ausrechnen (unabhängig vom unterricht, aus interesse^^), wie macht man das dann?


Da müsste man aber nicht nur die Zahlen einzeln speichern, sondern von 1234 die Zahlen folgendermaßen zerlegen: 1000, 200, 30, 4.
Diese addiert man und teilt sie - soweit ich weiß - durch die Anzahl der Zahlen. Hier also 4. Ergibt

Code:

1000+200+30+4 / 4 = 308.5


Bestimmt ein Denkfehler drine.... peinlich

Moment...war mal Aufgabe beim deutschen QB-Wettbewerb von Stormy. Hier ist der Link.
http://www.storm-master.de/Wettbewerb/newbie.php?site=download&show=1&type=1

//edit: Diese verdammten Denkfehler Kopf schütteln peinlich : naja, Code berichtigt: Um die Strings in Zahlen umzuwandeln nimm folgendes:

Code:

DIM SHARED isolierte.zahlen.integer(50)

for umwandeln=0 to 50
   isolierte.zahlen.integer(umwandeln)=val(isolierte.zahlen$(umwandeln))
next umwandeln


Danach sind alle Ziffern in "isolierte.zahlen.integer" gespeichert. Für evtl. Infos zu Arrayn benutze die MonsterFAQ oder frage einfach nach! zwinkern


Greetings,
Mao
_________________
Eine handvoll Glück reicht nie für zwei.
--


Zuletzt bearbeitet von Mao am 09.10.2005, 20:38, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
jb



Anmeldungsdatum: 14.01.2005
Beiträge: 2010

BeitragVerfasst am: 09.10.2005, 20:35    Titel: Antworten mit Zitat

Ja, da ist ein Denkfehler drin zwinkern

Quersumme von 1234 = 1+2+3+4 = 10 zwinkern

Also:
Code:

FUNCTION Quersumme% (Zahl AS INTEGER)

quer% = 0
w$ = RTRIM$(LTRIM$(STR$(Zahl)))

 FOR i = 1 TO LEN(w$) STEP 1
  quer% = quer% + VAL(MID$(w$, i, 1))
 NEXT i

Quersumme% = quer%

END FUNCTION

jb
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 09.10.2005, 20:39    Titel: Antworten mit Zitat

Ich weiß ich bin eigentlich noch ziemlich jung - aber um die Zeit bin ich meistens ein wenig abwesend wenn's ums coden geht. grinsen

Was ich oben mehr oder weniger vorgerechnet habe war das arithmetische Mittel - der Durchschnitt. zwinkern

Greetings,
Mao
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 10.10.2005, 06:13    Titel: Antworten mit Zitat

Hallo Mao,

Zitat:
1000+200+30+4 / 4 = 308.5

Zitat:
Was ich oben mehr oder weniger vorgerechnet habe war das arithmetische Mittel - der Durchschnitt.


Mit dem obigen Rechenbeispiel kommst du aber auch nicht auf den Durchschnitt, weil auf Grund der Operator-Vorrangregeln (Punkt- vor Strichrechnung) die Division vor der Addition durchgeführt wird. Konkret geht der Computer in deinem Beispiel so vor:

Code:
1000+200+30+4/4 = ?
  (1) 4/4 = 1
  (2) 1000+200+30+1 = 1231

Du müsstest Klammern setzen, um diese Vorrangregel außer Kraft zu setzen und die Division auf die gesamte Quersumme wirken zu lassen:
Code:
(1000+200+30+4)/4 = 308.5

Zur eigentlichen Frage - mein Lösungsansatz wäre:

Code:
DEFINT A-Z
FUNCTION Quersumme% (Zahl AS INTEGER)

  quer% = 0
  localZahl% = Zahl%

  DO WHILE localZahl%
    quer% = quer% + (localZahl% MOD 10)
    localZahl% = localZahl% \ 10
  LOOP

  Quersumme% = ABS(quer%)

END FUNCTION

Ich meine, dass diese Lösung etwas effizienter ist als die von jb vorgeschlagene, da man hier einige Funktionsaufrufe, nicht zuletzt die besonders aufwändigen Konvertieroperationen zwischen String und Zahl, einsparen kann. Und schließlich schaut der Code auch etwas übersichtlicher aus.
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Mao



Anmeldungsdatum: 25.09.2005
Beiträge: 4409
Wohnort: /dev/hda1

BeitragVerfasst am: 10.10.2005, 11:25    Titel: Antworten mit Zitat

@pinkpanther:

Ich hab's ja auch mathematisch gemeint und nicht in BASIC-Code! zwinkern

Greetings,
Mao
_________________
Eine handvoll Glück reicht nie für zwei.
--
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 10.10.2005, 11:59    Titel: Antworten mit Zitat

Code:
FUNCTION Quersumme% (BYVAL Zahl%)

  quer% = 0

  DO WHILE Zahl%
    quer% = quer% + (Zahl% MOD 10)
    Zahl% = Zahl% \ 10
  LOOP

  Quersumme% = quer%

END FUNCTION

Ich hab den Code grad ma bisschen umgebaut:
*localZahl ist unnötig, einfach die Funktion mit BYVAL aufrufen..
*DEFINT A-Z ist unnötig da du alle Variablen mit % bereits als Integer deklariert hast.
*quer% wird nicht negativ -> ABS kann man sich sparen.
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pinkpanther



Anmeldungsdatum: 28.05.2005
Beiträge: 79
Wohnort: Wien

BeitragVerfasst am: 10.10.2005, 21:31    Titel: Antworten mit Zitat

Hallo MisterD!

Ist das eine Herausforderung zu einer Art Effizienz-Wettbewerb? durchgeknallt
Genial! Gerne! durchgeknallt

Allerdings gilt's zu bedenken:

1) Das BYVAL-Attribut wurde erst mit der Quick-Basic-Version 7 eingeführt, in der weitverbreiteten QuickBasic-Version 4.5 hingegen kann BYVAL nur in DECLARE-Anweisungen für Nicht-BASIC Prozeduren angewandt werden. Deine Lösungsvariante funktioniert daher nur mit PDS und VB/DOS.

2) DEFINT ist im vorliegenden Beispiel tatsächlich unnötig, weil ich alle Variablen mit Typkennzeichen versehe. DEFINT ist für mich eine Art Sicherheitsnetz, falls ich doch mal ein % vergessen sollte. Nachdem DEFINT nur eine Compiler-Anweisung ist, tut's der Effizienz des Programms letztlich keinen Abbruch.

3) quer% kann wohl negative Werte annehmen - dann nämlich, wenn der Ausgangswert Zahl% negativ ist. Negative Quersummen machen sich aber nicht gut. Entweder prüft man also nun, ob Zahl% negativ ist - und liefert diesfalls bspw. -1 als eine Art Fehlerflag zurück - oder man geht davon aus, dass auch Quersummen von negativen Zahlen errechnet werden sollen, wobei das Ergebnis aber jedenfalls positiv sein soll. Ich habe mich für letztere Variante entschieden.

4) Natürlich kann man die Effizienz dieser Mini-Prozedur noch weiter steigern. Wem's gefällt: So kann man quer% als statische Variable deklarieren und damit verhindern, dass (etwas aufwändiger) über den Stapel operiert werden muss, oder man fasst sich gleich ein Herz und codet das Problem in Assembler.

Die Frage ist letztlich, inwieweit sich's im Gesamtzusammenhang auszahlt oder ob's letztlich um Zeitgewinne im Millisekundenbereich geht, für die Stunden an Coderei wirklich nicht lohnen. Wenn die Prozedur aber irgendwann mal in ein Programm eingebaut werden soll, das 100.000 Quersummen am Stück errechnen muss, schaut das Aufwand-Nutzen-Verhältnis vielleicht schon wieder anders aus...

Die erste Lösung, die mit String/Zahlen-Konversionen operiert, ist so offenkundig ineffizient (schon weil sowohl Ausgangspunkt als auch Ergebnis der Berechnung jeweils eine Zahl sind), dass sich einfach durchzuführende Verbesserungen jedenfalls lohnen sollten, denke ich.

Dein Zug... zwinkern
_________________
lG
pinkpanther lächeln
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 10.10.2005, 21:55    Titel: Antworten mit Zitat

na gut, ich denk zu sehr freebasicisch zwinkern mit den Augen rollen
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 11.10.2005, 18:23    Titel: Dazu habe ich mir für die QB-MonterFAQ Folgendes vorgemerkt: Antworten mit Zitat

Dazu habe ich mir für die QB-MonterFAQ Folgendes vorgemerkt:

---------------------------------------------------------------------------------

Frage deutsch
~~~~~~~~~~~~~~~~
Wie speichere ich die Ziffern einer Zahl in einzelnen Variablen?


Question English
~~~~~~~~~~~~~~~~
How to store the decimal places of an numeric value in different variables?


Antwort 1
~~~~~~~~~~~~~~~~
[ von Mao und Thomas Antoni im QB-Forum, 11.10.2005 ]

Das geht ganz einfach, wenn man die Zahl mit STR$() in einen Text umwandelt und
diesen mit dem MID$()-Befehl in seine Einzelbuchstaben zerlegt. Unser folgendes
Programm zeigt, wie das funktioniert:

Code:

'*******************************************************************
' ZAHL2ZIF.BAS = Ziffern einer Ganzzahl isoliert abspeichern
' ============
' Dieses QBasic-Programm fragt vom Anwender eine doppelt lange
' Ganzzahl ab und wandelt sie in einen Textstring um. Dieser
' Textstring wird nun Zeichen für Zeichenb zerlegt, um die einzelnen
' Buchstaben und damit die einzelnen Dezimalziffern zu isolieren.
' Die Ziffern werden als Textzeichen in einem Feld abgelegt und
' auf dem Bildschirm zeilenweise angezeigt.
'
' (c) Mao und Thomas Antoni, 11.10.2005
'********************************************************************
DIM Ziffern$(10) 'Textfeld für max.10 isolierte Einzelziffern
INPUT "Gib eine Ganzzahl ein (maximal 2 Milliarden): ", Zahl#
Zahltext$ = STR$(Zahl#) 'Zahl in Textstring umwandeln
FOR Stelle% = 1 TO LEN(Zahltext$)
    Ziffern$(Stelle%) = MID$(Zahltext$, Stelle%, 1)
    PRINT Ziffern$(Stelle%)
NEXT Stelle%


Antwort 2
~~~~~~~~~~~~~~~~
[ von jb im QB-Forum, 9.10.2005 ]

Ich will das mal am Beispiel einer Quersummenbildung erläutern. Bei einer
Quersumme muss man ja ebenfalls die einzelnen Ziffern einer Ganzzahl isolieren.

Code:

FUNCTION Quersumme% (Zahl AS INTEGER)
quer% = 0
w$ = RTRIM$(LTRIM$(STR$(Zahl)))
FOR i = 1 TO LEN(w$) STEP 1
  quer% = quer% + VAL(MID$(w$, i, 1))
NEXT i
Quersumme% = quer%
END FUNCTION

Anmerkung von pinkpanter und MisterD
-------------------------------------
Ich meine, dass diefolgende Lösung etwas effizienter ist als die von jb
vorgeschlagene, da man hier einige Funktionsaufrufe, nicht zuletzt die besonders
aufwändigen Konvertieroperationen zwischen String und Zahl, einsparen kann. Und
schließlich schaut der Code auch etwas übersichtlicher aus.

Code:

FUNCTION Quersumme% (Zahl%)
  quer% = 0
  DO WHILE Zahl%
    quer% = quer% + (Zahl% MOD 10)
    Zahl% = Zahl% \ 10
  LOOP
  Quersumme% = quer%
END FUNCTION

---------------------------------------------------------------------------------
_________________
+++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Xolios
aka Ray


Anmeldungsdatum: 07.12.2004
Beiträge: 589
Wohnort: Wildeshausen

BeitragVerfasst am: 11.10.2005, 20:06    Titel: Re: Dazu habe ich mir für die QB-MonterFAQ Folgendes vorgeme Antworten mit Zitat

Hallo.

Thomas Antoni hat Folgendes geschrieben:
Zahltext$ = STR$(Zahl#) 'Zahl in Textstring umwandeln


hmmm geht das auch andersrum? Also einen Textstring in eine
Zahlenstring umwandeln?

Gruß
Ray
_________________
www.ray-earth.de
Anm.: Neue ICQ
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen Yahoo Messenger MSN Messenger
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 11.10.2005, 20:09    Titel: Antworten mit Zitat

VAL heißt die Funktion
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 11.10.2005, 20:09    Titel: Antworten mit Zitat

a$="123457"
zahl% = VAL(a$)
_________________
MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
5T3PH4N



Anmeldungsdatum: 01.10.2005
Beiträge: 145
Wohnort: Braunshardt

BeitragVerfasst am: 11.10.2005, 20:27    Titel: Re: Dazu habe ich mir für die QB-MonterFAQ Folgendes vorgeme Antworten mit Zitat

danke für eure antworten!
funtioniert!
ps: wir berechneten im unterricht tatsächlich die quersumme^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Progger_X
Mr. Lagg


Anmeldungsdatum: 24.11.2004
Beiträge: 784
Wohnort: Leipzig

BeitragVerfasst am: 11.10.2005, 21:30    Titel: Antworten mit Zitat

Also ich weiß ja nicht, aber mir ist sofort was völlig anderes eingefallen, was mir irgendwie einfacher erscheint.

Code:

DIM zahlen(50)
x=1
WHILE taste$<>CHR$(27)
   taste$=INKEY$
   SELECT taste$
      CASE "1": zahlen(x)=1 :x=x+1
      CASE "2": zahlen(x)=2:x=x+1
      CASE "3": zahlen(x)=3:x=x+1
      CASE "4": zahlen(x)=4:x=x+1
      CASE "5": zahlen(x)=5:x=x+1
      CASE "6": zahlen(x)=6 :x=x+1
      CASE "7": zahlen(x)=7:x=x+1
      CASE "8": zahlen(x)=8:x=x+1
      CASE "9": zahlen(x)=9:x=x+1
      CASE "0": zahlen(x)=0 :x=x+1
  END SELECT
WEND
[/code]
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mjs



Anmeldungsdatum: 26.09.2005
Beiträge: 75
Wohnort: Adelheidsdorf

BeitragVerfasst am: 11.10.2005, 22:53    Titel: Antworten mit Zitat

Oder noch einfacher:

Code:
DIM zahlen(50)
x=1
WHILE taste$<>CHR$(27)
   taste$=INKEY$
   IF taste$>="0" AND taste$<="9" THEN zahlen(x)=val(taste$) :x=x+1
WEND


Gruß,
Mark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Thomas Antoni



Anmeldungsdatum: 12.10.2004
Beiträge: 220
Wohnort: Erlangen

BeitragVerfasst am: 12.10.2005, 19:09    Titel: Damit lautet der FAQ-Eintrag jetzt wie folgt ... Antworten mit Zitat

Damit lautet der erweiterte QB-MonsterFAQ-Eintrag jetzt wie folgt :

---------------------------------------------------------------------------------

Frage deutsch
~~~~~~~~~~~~~~~~
Wie speichere ich die Ziffern einer Zahl in einzelnen Variablen?


Question English
~~~~~~~~~~~~~~~~
How to store the decimal places of a numeric value in different variables?


Antwort 1
~~~~~~~~~~~~~~~~
[ von Mao und Thomas Antoni im QB-Forum, 11.10.2005 ]

Das geht ganz einfach, wenn man die Zahl mit STR$() in einen Text umwandelt und
diesen mit dem MID$()-Befehl in seine Einzelbuchstaben zerlegt. Unser folgendes
Programm zeigt, wie das funktioniert:

Code:

'*******************************************************************
' ZAHL2ZIF.BAS = Ziffern einer Ganzzahl isoliert abspeichern
' ============
' Dieses QBasic-Programm fragt vom Anwender eine doppelt lange
' Ganzzahl ab und wandelt sie in einen Textstring um. Dieser
' Textstring wird nun Zeichen für Zeichen zerlegt, um die einzelnen
' Buchstaben und damit die einzelnen Dezimalziffern zu isolieren.
' Die Ziffern werden als Textzeichen in einem Feld abgelegt und
' auf dem Bildschirm zeilenweise angezeigt.
'
' (c) Mao und Thomas Antoni, 11.10.2005
'********************************************************************
DIM Ziffern$(10) 'Textfeld für max.10 isolierte Einzelziffern
INPUT "Gib eine Ganzzahl ein (maximal 2 Milliarden): ", Zahl#
Zahltext$ = STR$(Zahl#) 'Zahl in Textstring umwandeln
FOR Stelle% = 1 TO LEN(Zahltext$)
    Ziffern$(Stelle%) = MID$(Zahltext$, Stelle%, 1)
    PRINT Ziffern$(Stelle%)
NEXT Stelle%



Wenn Du die einzelnen Ziffern nicht als Textzeichen sondern als numerische
Variable isolieren willst, dann kannst Du die einzelnen Ziffernnzeichen mit dem
VAL()-Befehl wieder in eine Zahl zurückwandeln. Schreibe dazu ans Ende der FOR-
Schleife z.B. den Befehl


ZifferZahl%(Stelle%) = VAL(Ziffern$(Stelle%))


Antwort 2
~~~~~~~~~~~~~~~~
[ von progger_X und mjs im QB-Forum, 11.10.2005 ]

Wenn die zu zerlegende Zahl nicht als Variable vorliegt, sondern erst vom
Anwender eingegeben werden soll, kannst Du die Ziffern auch wie folgt
bereits während der Eingabe isolieren:

Code:

DIM zahlen(10)
PRINT "Gib eine Ganzzahl ein (maximal 2 Milliarden): ";
LOCATE , , 1             'Cursor fuer d.Eingabe sichtbar machen
x = 1
WHILE taste$ <> CHR$(13) 'Abschluss der Eingabe mit Eing.Taste
  DO
    taste$ = INKEY$
  LOOP WHILE taste$ = "" 'Warten auf Tastenebetaetigung
  IF taste$ >= "0" AND taste$ <= "9" THEN
    zahlen(x) = VAL(taste$)
    PRINT taste$;
    x = x + 1
 END IF
WEND
PRINT
FOR i = 1 TO x - 1
  PRINT zahlen(i)
NEXT


Antwort 3
~~~~~~~~~~~~~~~~
[ von jb im QB-Forum, 9.10.2005 ]

Ich will das mal am Beispiel einer Quersummenbildung erläutern. Bei einer
Quersumme muss man ja ebenfalls die einzelnen Ziffern einer Ganzzahl isolieren.

Code:

FUNCTION Quersumme% (Zahl AS INTEGER)
quer% = 0
w$ = RTRIM$(LTRIM$(STR$(Zahl)))
FOR i = 1 TO LEN(w$) STEP 1
  quer% = quer% + VAL(MID$(w$, i, 1))
NEXT i
Quersumme% = quer%
END FUNCTION


Anmerkung von pinkpanter und MisterD
-------------------------------------
Ich meine, dass diefolgende Lösung etwas effizienter ist als die von jb
vorgeschlagene, da man hier einige Funktionsaufrufe, nicht zuletzt die besonders
aufwändigen Konvertieroperationen zwischen String und Zahl, einsparen kann. Und
schließlich schaut der Code auch etwas übersichtlicher aus.

Code:

FUNCTION Quersumme% (Zahl%)
  quer% = 0
  DO WHILE Zahl%
    quer% = quer% + (Zahl% MOD 10)
    Zahl% = Zahl% \ 10
  LOOP
  Quersumme% = quer%
END FUNCTION


---------------------------------------------------------------------------------
_________________
+++ Die beliebte QBasic CD-ROM von QBasic.de - 670 MB QBasic-Stuff mit komfortabler HTML-Oberfläche. Für nur 5 EUR bestellbar auf www.antonis.de/qbcdueb.htm +++
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