www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Newbee

Gepostet:
02.04.2006 23:37

Programm was die anzahl von Buchstaben angibt  
Hi, ich muss ein programm schreiben, was die Anzahl von buchstaben und sonderzeichen eines strings angibt. Habe aber keine ahnung wie ich das problem anpacken soll.
Das Programm soll die anzahl jedes einzelnen buchstabens eines strings in alphabetischer Reihenfolge wiedergeben.
Sonderzeichen und Leezeichen sollen unter '?' zusammengefasst werden.
Es soll auch zwischen Groß- und Kleinbuchstaben unterschieden werden.
Das Programm soll folgende Signatur haben:
anzahl :: String -> [(Char,Int)]

Hier mal ein Beispiel wie es funktionieren soll:
anzahl "Haskell 98" == [('a',1),('e',1),('k',1),('l',2),('s',1),('H',1),('?',3)]

Ich wäre euch für jede Hilfe dankbar.
Zum Seitenanfang    
 
Jacke

Gepostet:
03.04.2006 10:58

   

anzahl [] list=list
anzahl (x:xs) list
| (istBuchstabe x) = anzahl xs (inlist x list)
| otherwise = anzahl xs (inlist '?' list)
where istBuchstabe chr=(('A'<= chr ) && (chr<='Z')) || (('a'<= chr) && (chr<='z'))
inlist x []= ((x,1):[])
inlist x ((c,count):list)
|(x==c) =(c,(count+1)): list
| otherwise = (c,count): (inlist x list)

so das funktioniert...sortieren der einträge kann man z.b. mit Mergesort machen...also so in der art:
anzahl2 meinstring = sortiere (anzahl meinstring [])


aufruf von anzahl funktioniert so :

anzahl "haskell 98" []
ausgabe:
[('H',1),('a',1),('s',1),('k',1),('e',1),('l',2),('?',3)]



ich hoffe das hilft dir ein bisschen weiter ...

gruß jacke
Zum Seitenanfang    
 
Newbee

Gepostet:
03.04.2006 22:55

   
Danke für die Hilfe, aber ich habe noch ein paar Fragen zur Verständlichkeit des Programms.

1. Warum muss die Signatur so aussehen:

anzahl :: String -> [(Char,Integer)] -> [(Char,Integer)]

und geht es nicht auch irgendwie anders?

2.Sind die ganzen Befehle wie: "list", "inlist" und "count" in HAskell integriert und was genau machen sie?

Ich wäre euch sehr dankbar für eine Antwort.
Zum Seitenanfang    
 
Jacke

Gepostet:
03.04.2006 23:59

   
nein list und count sind nen variablennamen...
inlist ist ne funktion die ich mir selber definiert habe...nach dem schlüßelwort where habe ich mir eine eigene funktion definiert,...die hab ich inlist genannt hätte sie auch blubblub nennen können
ich hätte inlist auch als extra funktion schreiben können...dann hätte sie so ausgesehen und der teil nach dem where wäre weggefallen:

inlist x []= ((x,1):[])
inlist x ((c,count):list)
|(x==c) =(c,(count+1)): list
| otherwise = (c,count): (inlist x list)


istBuchstabe ist auch eine von mir selbstgeschriebene funktion...die hätte man auch extra machen können...nach where kann man sovielfunktionen definieren wie man will...hauptsache sie sind eingerückt


du kannst natürlich auch deine eigene signatur verwenden

zum Beispiel so
anzahl :: String -> [(Char,Integer)]
anzahl String = anzahl2 String []

anzahl2 :: String -> [(Char,Integer)] -> [(Char,Integer)]
anzahl2 [] list=list
anzahl2 (x:xs) list
| (istBuchstabe x) = anzahl2 xs (inlist x list)
| otherwise = anzahl2 xs (inlist '?' list)
where istBuchstabe chr=(('A'<= chr ) && (chr<='Z')) || (('a'<= chr) && (chr<='z'))
inlist x []= ((x,1):[])
inlist x ((c,count):list)
|(x==c) =(c,(count+1)): list
| otherwise = (c,count): (inlist x list)

Zum Seitenanfang    
 
Newbee

Gepostet:
04.04.2006 17:31

   
danke, ich habe aber immernoch Fragen:

Was genau macht die Funktion "inlist"?

Wofür steht "list"?

Was macht "istBuchstabe" und wofür steht "chr"?
was bringt diese Zeichen: || ?


Das wars ertmal. Danke nochmal für die Hilfe.
Zum Seitenanfang    
 
Jacke

Gepostet:
04.04.2006 18:25

   
list ist ein accumulator und darin befindet sich die aktuelle liste...bei jeden durchlauf der rekursion werden element zu der liste list hinzugefügt...oder der zähler wird erhöht wenn der buchstabe schon drin ist...

und inlist macht genau das...es kuckt ist das element schon in der liste drin wenn ja dann erhöht sie den zähler...wenn nein dann fügt sie ein element zur liste hinzu mit wert 1
inlist x []= ((x,1):[]) <---das wird hier gemacht


inlist x ((c,count):list) <---(c,count) ist das erste tupel der liste
|(x==c) =(c,(count+1)): list<---und hier vergleicht man ob man den richtigen buchstaben gefunden hat also ob der buchstabe x = dem c aus dem ersten tupel
| otherwise = (c,count): (inlist x list)<---und ansonsten ruft man rekursiv den rest der liste auf...bis man am ende ist
Zum Seitenanfang