 |
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 |
pfiffikus_86

Anmeldungsdatum: 10.11.2004 Beiträge: 11
|
Verfasst am: 07.01.2005, 18:11 Titel: WICHTIGE Frage, zu einer Schleife |
|
|
Hallo, hab mal ne Wichtige Frage.
Und zwar will ich eine Schleife programmieren, die eine Variable auf zwei Variablen aufteilt.
Diese genannte Variable kann wie folgt aussehen, variable1$ = "" oder variable1$ = "/SPIEL " oder variable1$ = "/SPIEL /RESET ".
Die Aufgabe der Schleife soll nun darin bestehen, zu erkennen, ob in der Variable variable1$ ein "/" auftaucht, und falls ja, soll sie alle Bytes hinter dem "/", bis zum nächsten " " (Leerzeichen) in die Variable namens variable2$ eintragen. Allerdings, und jetzt wird’s schwierig, nur wenn in der variable1$ das zweite mal ein "/" vorkommt, sollen die dahinter liegenden Bytes in die variabel2$ geschrieben werden. Bitte helft mir!
Es wäre klasse wenn mir jemand gleich eine kleine Routine programmieren könnte, Danke!  _________________ Ich programmiere lieber, als aufs Klo zu gehen! |
|
Nach oben |
|
 |
Tomtitom

Anmeldungsdatum: 20.09.2004 Beiträge: 308
|
Verfasst am: 07.01.2005, 18:29 Titel: |
|
|
na das ist ja so eine richtig wichtige Frage, die bestimmt jeden interessiert, der mit QB arbeitet
also ich geb dir mal ein paar wichtige Schlagworte, damit kannst du es bestimmt selbst lösen, denn es macht doch mehr Spaß die Lösung selbst zu finden, als sich von den anderen alles vorgeben zu lassen.
mit
Code: | a$ = MID$(variable1$, x, 1) |
fragst du ein Zeichen im String 'variable1$' an Stelle x ab
Dann kannst du z.B. mit Code: | IF a$ = "/" THEN EXIT DO | deine Do - Loop schleife beenden.
So die Schleife und die If-Abfrage müsstest du ja wohl hinkriegen. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 07.01.2005, 21:35 Titel: |
|
|
Was Du suchst, ist eine split()-Funktion, in PHP auch als explode() bekannt. Siehe dazu das fertige Beispiel
http://beilagen.dreael.ch/QB/SPLIT.BAS
Das zweite Argument bei der SUB-Prozedur ist bei Dir einfach "/" anstelle von " ". _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 09.01.2005, 22:21 Titel: |
|
|
Ich will dann auch mal ein paar Code-Fragmente loswerden
Code: |
number = 0
l = LEN(v$)
FOR checkbyte% = 1 TO l
IF MID$(v$, checkbyte%, 1) = "/" THEN number = number + 1
NEXT
DIM VArrey (1 TO number) AS STRING
number = 1
FOR checkbyte% = 1 TO l
tmp$=MID$(v$, checkbyte%, 1)
IF tmp$ = "/" THEN
number = number + 1
ELSE
VArrey(number) = VArrey(number) + tmp$
END IF
NEXT
|
....
Ich denke, das sollte funktionieren.
Der String wird zwar auf ein Arrey aufgeteilt, und nicht auf einzelne Variablen, aber so wie du dein Problem beschrieben hast, ist das sowiso besser, weil du anscheinend nicht genau festlegen kannst, wie viele einzelne Variablen es einmal werden sollen.... oder?
naja, viel glück mit dem Code!
ciao! |
|
Nach oben |
|
 |
ZaPPa
Anmeldungsdatum: 29.09.2004 Beiträge: 98 Wohnort: Wuppertal
|
Verfasst am: 09.01.2005, 23:42 Titel: |
|
|
@Duskey_Joe
[Klugscheißmode ON]
Es heißt "Array" nich "Arrey"
[Klugscheißmode OFF]
Jah Bless!
ZaPPa _________________ --- ICH BIN DAGEGEN! ---
Jet_X hat Folgendes geschrieben: | Es währe mir sehr geholfen wenn ihr mir Helfen könnt ! |
And remember: Schwund is immer! |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 10.01.2005, 15:18 Titel: |
|
|
ZaPPa hat Folgendes geschrieben: | @Duskey_Joe
[Klugscheißmode ON]
Es heißt "Array" nich "Arrey"
[Klugscheißmode OFF]
Jah Bless!
ZaPPa |
Es hieße auch sowieso, aber das interessiert keinen  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 10.01.2005, 16:17 Titel: |
|
|
Hallo, ich bin neu hier. Ich habe lange QB geproggt, bis BlitzBasic kam. Bin aber nie tiefer in QB eingestiegen. Und nun schreibe ich nach langer QB-Abstinenz meinen ersten Thread und nehme am Programmierwettbewerb teil
Aber zurück zur Frage: Kennt keiner von euch den INSTR-Befehl. Am Anfang wurde gesagt, du soltlest die Lösung selber herausfinden. Also tu das
Jedenfalls lege ich dir ans Herz, in der QuickBasic-Hilfe oder sonst wo unter
INSTR zur suchen.
Das wars auch schon
By |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 10.01.2005, 16:22 Titel: |
|
|
Ich würde INSTR nicht benutzen.
Denn das setzt vorraus, dass entweder im String "/" auch vorkommt, oder, dass man einen entsprechenden Fehlerbehandler schreibt (ON ERROR GOTO).
Da muss man dann wieder prüfen, ob wirklich kein "/" vorhanden ist, oder aber nur eins (wenn man 2 Parameter erlauben möchte) _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 11.01.2005, 17:37 Titel: |
|
|
Das mit dem Error wusste ich nicht. Und wenn kein Backslash"/" im String vorkommt, gibt INSTR doch auch 0 zurück. |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 11.01.2005, 17:41 Titel: |
|
|
Jetzt kommt noch ein wenig Code:
input eingabe$
if instr(eingabe$, "/SPIEL") > 0 then v1$ = "/SPIEL"
if instr(eingabe$, "/RESET") > 0 then v2$ = "/RESET"
So oder so ähnlich stelle ich mir das vor. Da wird dann gar keine Schleife mehr nötig . |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 11.01.2005, 18:18 Titel: |
|
|
Oh, ich habs grade ausprobiert, INSTR liefert dann in der Tat 0!
Mein Fehler trat beim Problem auf, in dem es um die HTML-Tags ging, wahrscheinlich kam irgendeine Funktion nicht mit Null als Wert klar.  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 11.01.2005, 20:44 Titel: |
|
|
Zitat: | Es wäre klasse wenn mir jemand gleich eine kleine Routine programmieren könnte, Danke! |
Willst du das wirklich, oder willst du es doch lieber mal selbst versuchen?
Zitat: | Und zwar will ich eine Schleife programmieren, die eine Variable auf zwei Variablen aufteilt.
|
So ein Ansatz ist in der Regel nicht gut. Denk erstmal nicht daran, dass du eine Schleife haben willst. Das lenkt dich gleich viel zu fest in eine Richtung. Denk erstmal nur über die eigentliche Aufgabenstellung und überhaupt nicht über die Implementierung nach. Wenn du die komplett hast, dann kann man sich viel leichter darüber klar werden, welche Sprachmittel dazu geeignet sind.
Zitat: |
Diese genannte Variable kann wie folgt aussehen, variable1$ = "" oder variable1$ = "/SPIEL " oder variable1$ = "/SPIEL /RESET ".
Die Aufgabe der Schleife soll nun darin bestehen, zu erkennen, ob in der Variable variable1$ ein "/" auftaucht, und falls ja, soll sie alle Bytes hinter dem "/", bis zum nächsten " " (Leerzeichen) in die Variable namens variable2$ eintragen. Allerdings, und jetzt wird’s schwierig, nur wenn in der variable1$ das zweite mal ein "/" vorkommt, sollen die dahinter liegenden Bytes in die variabel2$ geschrieben werden. Bitte helft mir!
|
Also versuchen wir doch mal die einzelnen Punkte heraus zu kristalisieren:
1.) letzten Slash im String finden.
2.) Leerzeichen hinter einer bestimmten Position finden (da passt INSTR() perfekt)
3.) aus den beiden gefundenen Stellen einen Substrung Bilden (da passt Mid$() perfekt).
Punkt 2 und 3 sind also schon erledigt. Bleibt noch Punkt 1. Bau dir eine Funktion die genau das macht. (Du kannst sie auch direkt so allgemein bauen, das sie nicht nach einem Slash sucht, sondern nach einem beliebigen übergebenen Zeichen, aber das hängt davon ab, wie viel du dir schon zutraust.)
Also: mit INSTR die erste Position des Slahs bestimmen. Dann in einer Schleife von dieser Position an solange weiter nach Slashes suchen, bis eine 0 kommt. Dann die [b]zuvor[/] gefundene Position zurückgeben. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 12.01.2005, 11:18 Titel: |
|
|
Helium hat Recht. Du solltest dir erst Gedanken machen, WAS du erreichen willst. Später stellt sich dann die Frage, WIE du es erreichen kannst.
Wahrscheinlich willst du so etwas wie einen Konsolenbefehl schreiben. Wenn man "/RESET" eingibt, soll etwas bestimmtes passieren und wenn man "/CHEATS" oder "/START" oder sonst was eingibt, soll irgendwas entsprechendes passieren.
Wenn also die Reihenfolge egal, was du als erstes eingibst, reicht es, wie schonmanl von mir gepostet, mit INSTR diese Sachen abzufragen.
Code-Fragment:
INPUT eingabe$
eingabe$ = UCASE$(eingabe$) 'Mache alle Buchstaben zu Großbuchstaben
IF INSTR(eingabe$ , "/START") THEN
LEVEL = 1
END IF
IF INSTR(eingabe$, "/CHEATS") THEN
leben = 99
munition = 1000
geld = 10000
END IF
IF INSTR(eingabe$, "/RESET") THEN
leben = 3
munition = 10
geld = 450
END IF
Wenn der Spieler jetzt eingibt: "/START /CHEATS", dann wird der erste und der zweite IF-Block ausgeführt. Genausogut kann aber auch nur der dritte oder alle oder ... oder gar keiner ausgefürht werden.
Alles klar? [/code] |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 12.01.2005, 15:37 Titel: |
|
|
Oder du machst es mit Batch (muhaha, gestern das erste Mal angeschaut )
Du kannst zB. eine Datei SPIEL.BAT nennen, in die du folgende eingibst:
Code: | @Echo off
Echo.%1>>para.txt
Echo.%2>>para.txt
Echo.%3>>para.txt
Echo.%4>>para.txt
Echo.%5>>para.txt
Echo.%6>>para.txt
Echo.%7>>para.txt
Echo.%8>>para.txt
Echo.%9>>para.txt | (oder so, da ich das weder gut kann, noch jetzt ausprobieren möchte, soll es, falls nötig, jemand verbessern!)
Dann könntest du in BASIC halt
Code: | INPUT "Parameter: ", par$
SHELL "SPIEL "; par$
OPEN "para.txt" FOR INPUT AS #1
DO WHILE NOT EOF(1)
LINE INPUT #1, parameter$(y% + 1)
y% = y% + 1
LOOP
CLOSE #1 |
Ich weiß aber nicht, inwiefern es einfacher geht, aber ich hoffe mal, dass das funktioniert!  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
pfiffikus_86

Anmeldungsdatum: 10.11.2004 Beiträge: 11
|
Verfasst am: 14.01.2005, 19:49 Titel: Antwort |
|
|
Hi, sorry das ich mich jetzt erst melde, hatte leider keine Zeit.
Erst mal vielen Dank für die vielen Antworten , echt klasse.
Ich hab noch ein wenig programmiert und gebastelt, bis es dann endlich klappte. Ihr hattet schon recht, dass ich eine COMMAND$ einlesen wollte, da diese allerdings äußerst flexibel ist, stellte sich die Programmierung als recht schwierig heraus.
Nun klappt aber alles, und ich bedanke mich!!!  _________________ Ich programmiere lieber, als aufs Klo zu gehen! |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 14.01.2005, 21:17 Titel: |
|
|
hmm, jetzt mal eben aus dem Kopf:
Code: |
SUB ExtractFromSlashToSpace (source AS STRING, result() AS STRING)
DIM currentIndex AS INTEGER
DIM slashPos AS INTEGER
slashPos = INSTR(source, "/")
DIM spacePos AS INTEGER
DO WHILE (slashPos <> 0)
spacePos = INSTR(slashPos, source, " ")
IF spacePos = 0 THEN
result(currentIndex) = MID$(source, slashPos)
EXIT SUB
END IF
result(currentIndex) = MID$(source, slashPos, spacePos - slashPos)
slashPos = INSTR(spacePos + 1, source, "/")
currentIndex = currentIndex + 1
LOOP
END SUB |
Verwenden würde man es so:
Code: |
DIM testResult(10) AS STRING
ExtractFromSlashToSpace COMMAND$, testResult()
FOR i = 0 TO UBOUND(testResult)
PRINT testResult(i)
NEXT
|
Bei
"uninteressant /toll /super /wahnsinn auch nicht wichtig"
sollte
/TOLL
/SUPER
/WAHNSINN
rauskommen. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
Gremlin

Anmeldungsdatum: 12.12.2004 Beiträge: 142 Wohnort: Heinsberg
|
Verfasst am: 14.01.2005, 21:21 Titel: Re: Antwort |
|
|
pfiffikus_86 hat Folgendes geschrieben: | Nun klappt aber alles, und ich bedanke mich!!!  |
Die Mühe hast du dir anscheinend umsonst gemacht  _________________ Tja, hier konnte ihre Werbung stehen.
Pech gehabt.  |
|
Nach oben |
|
 |
helium

Anmeldungsdatum: 10.09.2004 Beiträge: 397 Wohnort: Leverkusen
|
Verfasst am: 14.01.2005, 21:30 Titel: |
|
|
Ja, aber er kann ja vergleichen, zeigen, was er anders gemacht hat. Da er ordentlich drüber nachgedacht hat, hat seine Lösung vielleicht auch vorteile, die er hier den anderen zeigen kann.
Meine Lösung ist ja nur mal eben in fünf Minuten so dahinprogrammiert. _________________ Bevor Sie aufhören sich körperlich zu betätigen sollten Sie ihren Doktor befragen. Körperliche Inaktivität ist abnormal und gefährlich für Ihre Gesundheit. |
|
Nach oben |
|
 |
|
|
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.
|
|