Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 18.09.2012, 02:19 Titel: Buchstaben zählen / Buchstaben vergleichen |
|
|
Welche Möglichkeiten gibt es die Buchstaben bei einem eingegebenen Wort zu zählen? Die Anzahl der Buchstaben bei dem eingegebenen Wort habe ich bereits. Wird warscheinlich für die Berechnung sicher benötigt.
Meine Idee ist: Den ersten Buchstaben bei dem eingegebenen Wort überprüfen und Zähler um 1 des jeweiligen Buchstaben hoch setzen bzw. mit einem Buchstaben zu vergleichen ob das der gesuchte ist und wenn ja Zähler 1 nach oben.
Nur wie schaffe ich es an die restlichen Buchstaben zu kommen? Die Wörter haben ja unterschiedliche Längen. Ich komme im Moment da irgendwie nicht drauf?!
Mit Code: | BUCHSTABENANZAHL% = LEN(Wort$) | erhalte ich die Anzahl der Buchstaben.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
schildron
Anmeldungsdatum: 25.08.2008 Beiträge: 86
|
Verfasst am: 18.09.2012, 06:46 Titel: |
|
|
Ich verstehe deine Frage nicht ganz, weil du schon selbst erklärst, wie du die Länge eines Wortes berechnenkanst. Möglichkeiten die mir einfallen:
Code: |
' (1) Länge eines Strings mit Leerzeichen
Print Len("TEST")
' (2) Länge eines Strings ohne führende und folgende Leerzeichen
Print Len( LTrim( RTrim(" TEST ") ) )
' (3) Um die Leerzeichen aus einem Satz zu entfernen
Dim As String Eingabe="Test Test Test Test Test"
Dim As String Ausgabestring
For i As integer = 1 To Len(Eingabe)
Dim As String Char = Mid(Eingabe,i,1)
If Char <> " " Then
Ausgabestring = Ausgabestring & Char
EndIf
Next i
Print Ausgabestring
' (4) Die anzahl wie oft einzelne Zeichen in einem Satz vorkommen funktioniert genauso wie (3)
Sleep
|
|
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 18.09.2012, 12:30 Titel: |
|
|
Du machst ein Array von der Größe deines Zeichensatzes (Irgendeine ASCII-Erweiterung, 8 Bit -> 256 Array-Einträge)
Du gehst zeicehnweise durch den String durch
Du erhöhst den Wert des Arrayeintrages Nr. asc(AktuelesZeichen) um eins.
Im Array ist die absolute Häufigkeit jedes Zeichens. |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 18.09.2012, 12:35 Titel: nwort |
|
|
Ich hatte mal eine Function geschrieben, welche dir die einzelen Wörter eines Satzes ausspuckt. In Java und anderen Sprachen ist so eine Funktion als split bekannt:
Ist zwar Blitzbasic, sollte aber 1 zu 1 übertragbar sein:
http://www.blitzforum.de/forum/viewtopic.php?p=198112#198112
mit den einzelnen Wörtern kannst du dann jeweils mit LEN die Länge prüfen.
Edit:
Wenn es dir darum geht, die Häufigkeit jedes vorkommenden Zeichens zu ermitteln:
http://www.blitzforum.de/forum/viewtopic.php?t=38714
( Es hilft ungemein, wenn man sich bei Problemen etwas Zeit nimmt und sie gut und verständlich formuliert :/ ) _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 18.09.2012, 13:23 Titel: Re: nwort |
|
|
SpionAtom hat Folgendes geschrieben: | Edit:
Wenn es dir darum geht, die Häufigkeit jedes vorkommenden Zeichens zu ermitteln:
http://www.blitzforum.de/forum/viewtopic.php?t=38714
( Es hilft ungemein, wenn man sich bei Problemen etwas Zeit nimmt und sie gut und verständlich formuliert :/ ) |
Ja, mir geht es nur um die Häufigkeit eines jeden Buchstaben im Wort.
Zitat: | Das Wort programmieren enthält zum Beispiel:
1x A
2x E
1x G
1x I
2x M
1x N
1x O
1x P
3x R |
Ich will das so in etwa als Ausgabe haben.
Da kommt mir gerade noch eine Idee was man mit so einer Funktion anstellen könnte!
Ich danke euch schon mal für die Antworten!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 18.09.2012, 13:46 Titel: |
|
|
In VBScript würde ich für einen solchen Fall schnell einmal auf ein Dictionary-Objekt zurückgreifen, dito in Java mit einer HashMap, weil man dort als Key-Datentyp einen char verwenden könnte, als Value-Typ einen Integer (Anzahl). => Dann geht man mit einer FOR-Schleife rasch die Zeichenkette durch, macht ein IF, ob der Buchstabe in der Liste schon enthalten ist und fügt sonst den Buchstaben als Listenelement mit Value 1 (=das 1. mal gezählt) ein bzw. erhöht bestehendes Listenelement um 1.
=> Am Schluss ein "For Each key in Liste.Keys" um die Buchstabenliste auszugeben.
Alternativlösung/Ersatz dafür ist sonst ein Array:
Code: | Dim anzahl(Asc("A") To Asc("Z")) As Integer
Dim i As Integer
For i = Asc("A") To Asc("Z")
anzahl(i) = 0
Next i
Dim z As String
z = "Programmieren"
For i = 1 To Len(z)
anzahl(Asc(UCase(Mid(z, i, 1)))) += 1
Next i
For i = Asc("A") To Asc("Z")
If anzahl(i) > 0 Then
Print anzahl(i); "x "; Chr(i)
End If
Next i |
_________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 18.09.2012, 13:54 Titel: |
|
|
Oder wenn man keine fancy Arrays zur Verfügung hat:
Code: | Local meinText$ = " programmieren "
;Text normalisieren: nur Großbuchstaben, keine umrandenden Leerzeichen...
meinText$ = Trim(Upper(meinText$))
Local ascii, char$, pos, gefundeneZeichen
For ascii = 65 To 90 ;fragt nur Großbuchstaben ab, kann man natürlich erweitern
char$ = Chr(ascii)
pos = 1
gefundeneZeichen = 0
While Instr(meinText$, char$, pos) > 0
pos = Instr(meinText$, char$, pos) + 1
gefundeneZeichen = gefundeneZeichen + 1
Wend
If gefundeneZeichen > 0 Then
Print char$ + " x " + gefundeneZeichen
End If
Next
WaitKey
End |
Ein schwieriges Problem ist das nicht wirklich  _________________ Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.09.2012, 14:21 Titel: |
|
|
Das geht wesentlich einfacher und besser...
Wollte eigentlich ein kurzes Beispiel schreiben... bzw, müsste es so gehen...
Code: |
Sub blabla(byval ChrString as String)
Dim ChrCount(0 to 255) as Integer'UByte
Dim StringLen as Integer
StringLen = Len(ChrString)
If (StringLen) Then
For c as Integer=0 to StringLen-1
ChrCount(ChrString[c]) += 1
Next c
Else
Exit Sub
End If
For c as Integer=0 to 255
If (ChrCount(c)) Then ?ChrCount(c), chr(c)
Next c
End Sub
blabla "Test"
sleep
|
nur so nebenbei... liegt das an meiner FBC version oder kann man neuerdings keine For/Next schleifen mehr mit gleichen bezeichnern nutzen? Bug, Absicht? Fehler?
bsp:
Code: |
for t as integer=0 to 100
next t
for t as integer=100 to 1000
next t |
Zitat: |
Compiler output:
D:\FreeBASIC\FBIDETEMP.bas(4) error 4: Duplicated definition, t
for t as integer=100 to 1000
^
D:\FreeBASIC\FBIDETEMP.bas(5) error 243: FOR/NEXT variable name mismatch
next t
^
Results:
Compilation failed
System:
FBIde: 0.4.6
fbc: FreeBASIC Compiler - Version 0.24.0 (08-19-2012) for win32
OS: Windows NT 6.1 (build 7601, Service Pack 1)
|
_________________
 |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 18.09.2012, 17:44 Titel: |
|
|
Deine Fehlermeldung sieht mir aber stark nach -lang qb aus und da ist das in der Tat nicht erlaubt, da das For beim ersten mal schon t festlegt und über den Scope, den man aus -lang fb erwartet, hinaus geht. In -lang qb kannst du dir die Deklaration vollkommen sparen. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.09.2012, 17:58 Titel: |
|
|
Danke MOD, hatte es versehentlich mal aktiviert weil ich was testen wollte und dann einfach vergessen (war schon ganz verwirrt warum auf einmal solche meldungen kommen) _________________
 |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 20.09.2012, 00:53 Titel: |
|
|
Um das Buchstaben zählen geht es mir mittlerweile schon gar nicht mehr. (fast das gleiche programmiere ich, nur ein wenig anders)
Habe mittlerweile was anderes im Sinn und das habe ich ohne eure Quellcodes hinbekommen. Erste Test bestätigen mir, dass das was ich vorhabe funktioniert.
Was ich programmiere erfährt ihr dann wenn ich mal fertig bin!
Kann noch nicht so viel verraten. Nur soviel zum Programm: es wird ein klassiker! so wie die anderen 5 Programme die ich zeitgleich schreibe!
Ich danke euch für die professionelle und schnelle Hilfe! _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 21.09.2012, 08:52 Titel: |
|
|
Eternal_pain hat Folgendes geschrieben: | Das geht wesentlich einfacher und besser... | das lässt sich noch weiter optimieren.
Code: | Sub blabla(byval ChrString as String)
If ChrString = "" Then Exit Sub
Dim ChrCount(0 to 255) as UInteger
For c as Integer=0 to Len(ChrString) - 1
ChrCount(ChrString[c]) += 1
Next c
For c as Integer=0 to 255
If ChrCount(c) > 0 Then Print ChrCount(c), chr(c)
Next c
End Sub
blabla "Test"
sleep
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 21.09.2012, 09:38 Titel: |
|
|
Wozu denn
Zitat: | If ChrString = "" Then Exit Sub |
(bzw. analog die EXIT-SUB-Variante)?
Wenn der String leer ist, wird die erste Schleife gar nicht durchlaufen und die zweite spuckt keine Ergebnisse aus. Da ich mal davon ausgehe, dass nicht übermäßig oft Leerstrings durch die Prozedur gejagt werden, wird die Überprüfung wohl kaum zur Geschwindigkeitssteigerung beitragen, oder? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 21.09.2012, 09:48 Titel: |
|
|
Ich arbeite immer mit UInteger in solchen Schleifen. Und bei mir kommt es dann zu MEA's, wenn ich von 0 bis -1 counte. Daher mach ich ne vorprüfung. hab das mit integer noch nie versucht.
kann also gut sein, das du recht hast, und es unnötig is.
Hab ich jetzt garnicht drauf geachtet und es einfach mit aufgenommen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 21.09.2012, 16:43 Titel: |
|
|
Ist ja nur ein Beispiel ohne wirklich viel Sinn dahinter (vielleicht als funktion...)
Es macht durchaus Sinn (unabhängig ob die schleife Integer oder UInteger ist...) vorab die 'Exit Sub' Prüfung zu machen bevor speicher (das array) initiiert wird, daher denke ich ist der Einwandt (der Verbesserung) durchaus berechtigt...  _________________
 |
|
Nach oben |
|
 |
|