im string suchen

Previous topic - Next topic

xverbatim

Hallo,

wie könnte ich es hinbekommen, eine buchstabenkombination in einem wort zu finden ?
ein beispiel

ich habe zwei string variablen

1) wort$="auto"

2) eingabe$="tau"


jetzt möcht ich überprüfen, ob die eingabe$ im string wort$ vorkommt; hier tut sie es, t ist im auto, a ist im auto, u ist im auto

ich möchte ein spiel schreiben, wo alle möglichen kombinationen erkannt werden; also alle möglichkeiten, wörter aus einem wort zu bilden(die die buchstaben enthalten)

z.B.
autobus = enthält z.b. auto, bus, tau, bau, sut etc...


soweit hatte ich es ja geschaft, nur wenn die variable wort$="autto" enthält ALSO DAS PROBLEM IST WENN BUCHSTABEN DOPPELT vorkommen, dann das richtige Wort
nicht mehr erkannt werden kann...

ich könnte natürlich das eingegebene wort mit einer langen liste vergleichen, aber das möchte ich aus performance gründen lieber nicht machen...

hat jemand einen nachvollziehbaren tipp ? für *newbies ;-)*

Gruß + Danke
Thomas


Code (glbasic) Select


DIM a$[100]
DIM b$[100]

// feld$="auto" und word$="tau"  läuft wenn feld$="autto" und word$="tau" gehts nicht ...

feld$="auto"
word$="tau"

LOADFONT "smalfont.png",0;SETFONT 0

z=0

FOR x=0 TO LEN(word$)-1
FOR i=0 TO LEN(feld$)-1
 
  // wenn ein Buchstabe gefunden z +1
  IF MID$(word$,x,1)=MID$(feld$,i,1)
   INC z,1 
  ENDIF
 
NEXT
NEXT

IF z=LEN(word$)

PRINT "WORT IST VORHANDEN ",100,100

ELSE
PRINT "Wort nicht vorhanden ",100,100
ENDIF

SHOWSCREEN

KEYWAIT

Quentin

annäherungsweise könntest du es mal so versuchen

hat allerdings noch die Schwachstelle, daß z.B. "tatu" auch gefunden würde, obwohl "t" in feld$ nur einmal vorkommt. Wenn du das auch noch abfangen willst, könntest du z.B. jeden gefunden Buchstaben aus feld$ anschließend herauslöschen.

Code (glbasic) Select

feld$="auto"
word$="tau"

LOADFONT "smalfont.png",0;SETFONT 0

// erst mal davon ausgehen, daß alle Buchstaben aus word$ in feld$
// enthalten sind
gefunden = TRUE

FOR x = 0 TO LEN(word$)   
  // jetzt für jeden Buchstaben aus word$ prüfen, ob er in feld$ vorkommt
  // wenn nicht, kann man die Suche abbrechen         
  IF INSTR(feld$, MID$(word$, x, 1)) = -1
    gefunden = FALSE
    BREAK
  ENDIF
NEXT

IF gefunden
  PRINT "WORT IST VORHANDEN ",100,100
ELSE
  PRINT "Wort nicht vorhanden ",100,100
ENDIF

SHOWSCREEN

KEYWAIT

xverbatim

Quote from: Quentin on 2008-Nov-21
annäherungsweise könntest du es mal so versuchen

hat allerdings noch die Schwachstelle, daß z.B. "tatu" auch gefunden würde, obwohl "t" in feld$ nur einmal vorkommt. Wenn du das auch noch abfangen willst, könntest du z.B. jeden gefunden Buchstaben aus feld$ anschließend herauslöschen.

Code (glbasic) Select

feld$="auto"
word$="tau"

LOADFONT "smalfont.png",0;SETFONT 0

// erst mal davon ausgehen, daß alle Buchstaben aus word$ in feld$
// enthalten sind
gefunden = TRUE

FOR x = 0 TO LEN(word$)   
  // jetzt für jeden Buchstaben aus word$ prüfen, ob er in feld$ vorkommt
  // wenn nicht, kann man die Suche abbrechen         
  IF INSTR(feld$, MID$(word$, x, 1)) = -1
    gefunden = FALSE
    BREAK
  ENDIF
NEXT

IF gefunden
  PRINT "WORT IST VORHANDEN ",100,100
ELSE
  PRINT "Wort nicht vorhanden ",100,100
ENDIF

SHOWSCREEN

KEYWAIT


Hi Quentin,

Danke für Deine Mühe...ja, die Sache mit dem löschen ging mir auch durch den Kopf..

ich glaube, Dein Beispiel inspiriert mich, mein Code zu kürzen ;-)
ich mache das alles viel zu kompliziert glaube ich, aber naja, lerne ja noch ;-)

ich hatte es gerade hinbekommen ;-)
hier meine lllllllaaaaaannnnnnnggggggeeeeeee Version, habe bis jetzt kein Fehler entdeckt ;-)
wen´s interessiert

danke nochmal+gruß thomas

Code (glbasic) Select

LOADFONT "smalfont.png",0;SETFONT 0

ja=pruefe_wort("auto","tau")

IF ja=1
PRINT "WORT IST VORHANDEN ",100,100
  ELSE
PRINT "Alle Buchstaben im Wort nicht vorhanden",100,100
ENDIF

SHOWSCREEN
KEYWAIT

// Prüfe ob das wort z.b. eingabe$="tau" in feld$="autobus" vorkommt"
// ------------------------------------------------------------- //
// ---  PRUEFE_WORT  ---
// ------------------------------------------------------------- //
FUNCTION pruefe_wort: feld$, eingabe$
// Diese Variablen sind als LOCAL definiert:
// feld$, eingabe$

FOR x=0 TO LEN(eingabe$)-1

FOR i=0 TO LEN(feld$)

buchstabe$=MID$(eingabe$,x,1)
such$=MID$(feld$,i,1)

IF such$=buchstabe$
anfang$=MID$(feld$,0,i)
ende$=MID$(feld$,i+1,LEN(feld$))
feld$=anfang$+ende$

z=z+1
i=LEN(feld$) //mittlere Schleife beenden

ENDIF
NEXT

NEXT

ende:

IF z=LEN(eingabe$)
state=1

ELSE
state=-1


ENDIF
RETURN state
ENDFUNCTION // PRUEFE_WORT


Quentin

hehe, ja erst mal ist es ja wichtig, daß das Programm so arbeitet, wie es soll. Über Tunigmaßnahmen sollte man sich erst anschließend Gedanken machen.

Kitty Hello

Äh.... INSTR???

Schranz0r

 O_O jetzt hast du mir den Spass verdorben :D
Ich hab das beobachtet, und wollte gucken wer als erstes auf das InStr kommt   :|
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Quentin


Kosta

Stümmt,
Quentin nutzt doch INSTR    :whistle:
Intel QuadCore, Geforce8600GT,512MB,4GB Ram, 26" TFT
HP nw8440 Schläppy
GP2X Mk2 (Firmware 3.0)

GLBASIC Blog:
http://www.glbasic.com/forum/index.php?blog=51.0

BumbleBee

Stimmt, das INSTR seh sogar ich bis hierher.  ;)

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

xverbatim

Hi,

jetzt war ich so stolz, das ich das hinbekommen habe und dann  :puke: kommt mir kitty mit instr  :'(
wäre natürlich am effektivsten gewesen; aber mit instr habe ich früher schon nicht gearbeitet, deshalb wohl
die macht der gewohnheit  :whistle:

wäre das eigentlich irgendwie performancemäßig von bedeutung ?
*frag nur mal so interessehalber*


aber mein code läuft so erstmal 1a und jetzt nochmal mit instr habe ich nicht die muse....
falls jemand aus dem code ein 3 zeiler machen könnte, würde ich den natürlich nehmen  :good:


übrigens wer AUFMERKSAM gelesen hat
--->
"Hi Quentin,
ich glaube, Dein Beispiel inspiriert mich, mein Code zu kürzen ;-)
ich mache das alles viel zu kompliziert glaube ich, aber naja, lerne ja noch ;-)"

Gruß Thomas
p.s. GLBASIC wird mir immer sympathischer ;-)



Schranz0r

Quote from: BumbleBee on 2008-Nov-24
Stimmt, das INSTR seh sogar ich bis hierher.  ;)

Cheers

Quentin ja, xverbatim nicht ;)

Deshalb Gernot -> Says -> INSTR :P
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Kitty Hello

 =D Bitte, bitte, bitte vergleich doch mal 10000 String mit Deiner, und dann mit INSTR und nimm die Zeiten:

start=GETTIMERALL()
Deine()
start2=GETTIMERALL()
Meine()
ende=GETTIMERALL()
PRINT "Deine "+(start2-start)+" Meine "+(ende-start2), 0,0
SHOWSCREEN
WaitForYawdrop()

xverbatim

Quote from: Kitty Hello on 2008-Nov-25
=D Bitte, bitte, bitte vergleich doch mal 10000 String mit Deiner, und dann mit INSTR und nimm die Zeiten:

start=GETTIMERALL()
Deine()
start2=GETTIMERALL()
Meine()
ende=GETTIMERALL()
PRINT "Deine "+(start2-start)+" Meine "+(ende-start2), 0,0
SHOWSCREEN
WaitForYawdrop()

jepp  =D hast mich überzeugt .......
gruß tom