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:

Alle Wörter eines Strings in ein Array?

 
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
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 13.04.2005, 15:38    Titel: Alle Wörter eines Strings in ein Array? Antworten mit Zitat

Ich habe wieder mal ne Frage; dessen Lösung ich schon seit Vorgestern Abend suche:

Angenommen ich hätte einen String, dessen Inhalt zum Beispiel "Das ist ein Satz mit Wörtern." ist. Wie kann ich jetzt alle Wörter in ein Array/Feld platzieren, so das jedes Wort ein Feld ist also:

String(0) = Das
String(1) = ist
String(2) = ein
String(3) = Satz
String(4) = mit
String(5) = Wörtern.

Also so, dass es nach jeden Leerzeichen (evtl. auch jedes CHR$(13) Zeichen) ein Array anlegt und und diesem ein Wort zuordnet. Die Wörter könnte ja man sicher mit irgendwie INSTR und MID$ Trennen, aber wie zum Teufel bring ich das in ein Feld...
Vieleicht ist es noch erwähnenswert, dass der String in meinem Fall max 119 Zeichen lang ist (aber natürlich auch weniger)...

Danke im vorraus
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 13.04.2005, 15:47    Titel: Antworten mit Zitat

Das ist gar nicht so schwer.

Zunächst brauchst du die Anzahl der Leerzeichen. Bei einem Satz mit 3 Leerzeichen sollte man meinen, dass es dort 4 Wörter gibt. (Überhaupt muss man hier von Leerzeichenausnahmen absehen.)

satz$ = "Dies ist ein Satz"

also erst mal ein Array mit 4 Feldern machen

DIM wort$(4)

Dann sollte so etwas in der Art folgen: Die Wörtersuche


w$ = ""
w% = 0
FOR i% = 1 TO LEN(satz$)
IF MID$(satz$, i%, 1) = " " THEN
w% = w% + 1
wort$(w%) = w$
ELSE
w$ = w$ + MID$(satz$, i%, 1)
NEXT i%

(nicht getestet, aber könnte klappen)

In der IF-Abfrage kann man das Trennzeichnen festlegen. Und solange, der Satz nicht mit einem Leerzeichen beginnt, oder sonstige Ausnamen vorhanden sind, sollte es klappen.
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.04.2005, 15:57    Titel: Antworten mit Zitat

Hallo

Das funktioniert. Ich hatte gerade ein identisches Programm geschrieben und getestet, war aber zu langsam... Deshalb möchte ich nur noch anmerken, dass 119 Zeichen durch 59 Leerstellen in maximal 60 Teile getrennt werden können.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 13.04.2005, 15:58    Titel: Antworten mit Zitat

danke, aber ich weiss lieder nicht, wieviele wörter bzw. leerzeichen in diesem String sein werden missbilligen
Und nen Array mit 60 Feldern anlegen ist auch nicht das gelbe vom ei

PS: Mehrere Leerzeichen sollten wie eines behandelt werden, sonst gibt es wieder probleme traurig
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.04.2005, 16:13    Titel: Antworten mit Zitat

Hallo

Das hier zählt die Worte auch bei mehreren Leerstellen richtig:

Code:
CLS
DIM wort$(59)
satz$ = " Das      ist ein   Satz mit Woertern"
nummer = 0
pause = 0
FOR z = 1 TO LEN(satz$)
z$ = MID$(satz$, z, 1)
IF z$ <> CHR$(32) THEN
wort$(nummer) = wort$(nummer) + z$
pause = 1
ELSE
nummer = nummer + pause
pause = 0
END IF
NEXT
FOR a = 0 TO nummer
PRINT wort$(a)
NEXT


Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 13.04.2005, 16:29    Titel: Antworten mit Zitat

Hey, danke, das funktioniert ja schon sehr gut...

Hat aber jemand noch eine Idee, wie ich das Array verkleinern kann. 59 Felder fressen extrem viel Speicher...
Gibt es da keine schönere Möglichkeit?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 13.04.2005, 16:39    Titel: Antworten mit Zitat

Hallo

Du kannst ja das passende Wort immer erst dann aus dem Satz herausschneiden, wenn du es brauchst ohne es in einem Array zwischenzuspeichern. Dann brauchst du dir höchstens jedesmal zu merken, wieviele Worte schon herausgelesen wurden und holst dir beim folgenden Durchlauf das nächste.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 13.04.2005, 18:18    Titel: Antworten mit Zitat

Oder du legst das Array (per BSAVE?) in eine externe Datei ab.
So kannst du den Speicher anders nutzen, und musst nur kurz für einen Zugriff die Datei laden.
Wenn du aber ziemlich oft auf dein Array zugreifen musst/willst, ist das allerdings eine recht zeitfressende Methode...

Wenn dir wirklich der Speicher ausgehen sollte, versuchs doch einfach mit EMS! Der wird ja von QBX unterstützt! (oder wars XMS? Ich kann sowiso mit keinem von beiden arbeiten... Aber dein Speicherproblem wäre gelöst)
_________________
fully biological degradable

Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2529
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 13.04.2005, 18:25    Titel: Antworten mit Zitat

Ich hatte früher einmal einen Ersatz für split() geschrieben:

http://beilagen.dreael.ch/QB/SPLIT.BAS

Dieses Unterprogramm macht sonst das im Titel Verlangte.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 13.04.2005, 19:17    Titel: Antworten mit Zitat

Leider auch nicht genau das was ich wollte..


Wie müsste ich es denn per Funktion machen?
So das ich nen String und den Wert n, und ich erhalte als Rückgabewert das n. Wort von String...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 14.04.2005, 09:08    Titel: Antworten mit Zitat

Code:

satz$ = "  Dies ist   ein komischer    Satz mit vielen Leerzeichen  .     "
trenn$ = " "

Print "*" + satz$ + "*"


Dim wort$(50)
w$ = ""
n = 0
For i = 1 To Len(satz$)
   z$ = Mid$(satz$, i, 1)
   If z$ <> trenn$ Then
      w$ = w$ + z$
   Else
      If w$ <> "" Then
         n = n + 1
         wort$(n) = w$
         w$ = ""
      End If
   End If

Next

Print "---"
For i = 1 To n
Print "wort$(" + Str$(i) + ") = " + Chr$(34) + wort$(i) + Chr$(34)
Next

End




ist zwar mit Blitzbasic geschrieben, sollte aber kompatibel sein.




Code:


FUNCTION nwort$ ( satz$, pos1)

trenn$ = " "
w$ = ""
n = 0
For i = 1 To Len(satz$)
   z$ = Mid$(satz$, i, 1)
   If z$ <> trenn$ Then
      w$ = w$ + z$
   Else
      If w$ <> "" Then
         n = n + 1
         if n = pos1 THEN nwort$ = w$
         w$ = ""
      End If
   End If

Next

END FUNCTION



so sollte es als FUNCTION aussehen
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
gandro



Anmeldungsdatum: 18.02.2005
Beiträge: 108
Wohnort: Schweiz

BeitragVerfasst am: 15.04.2005, 17:59    Titel: Antworten mit Zitat

PERFEKT! vor Freude klatschen

Danke vielmals, genau das, was ich wollte (war schon dabei eine eigene Funktion zu schreiben, aber hatte etliche Probleme damit)
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