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:

Buchstaben zählen / Buchstaben vergleichen

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 18.09.2012, 02:19    Titel: Buchstaben zählen / Buchstaben vergleichen Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
schildron



Anmeldungsdatum: 25.08.2008
Beiträge: 86

BeitragVerfasst am: 18.09.2012, 06:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 18.09.2012, 12:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 18.09.2012, 12:35    Titel: nwort Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 18.09.2012, 13:23    Titel: Re: nwort Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


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

BeitragVerfasst am: 18.09.2012, 13:46    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 18.09.2012, 13:54    Titel: Antworten mit Zitat

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 lächeln
_________________
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
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 18.09.2012, 14:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 18.09.2012, 17:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 18.09.2012, 17:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 20.09.2012, 00:53    Titel: Antworten mit Zitat

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! grinsen so wie die anderen 5 Programme die ich zeitgleich schreibe! grinsen grinsen

Ich danke euch für die professionelle und schnelle Hilfe!
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 21.09.2012, 08:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4704
Wohnort: ~/

BeitragVerfasst am: 21.09.2012, 09:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 21.09.2012, 09:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 21.09.2012, 16:43    Titel: Antworten mit Zitat

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... zwinkern
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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