www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

KO123

Gepostet:
16.06.2008 20:42

   
Hallo,
Ich habe so eine Augabe zu lösen:
Definieren Sie in Haskell eine Funktion punkte, die fur eine Liste von Fußballpartien und
einen Mannschaftsnamen die erzielten Punkte der Mannschaft berechnet, wobei ein Sieg
3 Punkte, ein Unentschieden 1 Punkt und eine Niederlage keine Punkte einbringt.

data Match = Match String String(Int,Int) deriving (Eq,Show)

punkte a b
| a>b = Match heimm = =3 && gastm == 0 (a,b)
| a<b = Match gastm = =3 && heimm == 0 (a,b)
| a==b = Match heimm = =1 && gastm == 1 (a,b)
Es ist irgendwie falsch, aber bessere Idee habe ich nicht, könnte mir Bitte jemand helfen?
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.06.2008 00:13

   
Hallo,

also mir scheint, du kommst mit den Datenkonstruktoren noch nicht so recht klar. Definiert ist der Datentyp Match durch einen Datenkonstruktor (der auch Match heißt) mit drei Argumenten: String, String und einem Paar von Ints. Einen solchen Konstruktor kannst du jetzt in einer Musteranpassung verwenden (auf der linken Seite) und zum Erzeugen eines Wertes vom Typ Match (auf der rechten Seite). Die "Variablen" im Muster darfst du alle auf der rechten Seite verwenden:
-- Musteranpassung auf der linken Seite:
unentschieden :: Match -> Bool
unentschieden (Match heim gast (toreHeim, toreGast)) = (toreHeim == toreGast)

-- Erzeugung eines Wertes auf der rechten Seite:
finaleWM74 :: Match
finaleWM74 = Match "Deutschland" "Niederlande" (2,1)

Wenn du eine Funktion programmierst, ist es günstig, sich zuerst den Typ deiner Funktion zu überlegen. Du sollst aus einer Liste von Spielen und einem Mannschaftsnamen, einen Punktestand berechnen. Die Signatur von punkte sollte also etwa so aussehen:
punkte :: [Match] -> String -> Int

Es soll nun jedes Spiel der Liste durchgegangen werden und in das Gesamtergebnis einberechnet werden. Es ergeben sich für die Liste also zwei wesentliche Fallunterscheidungen:
-- Die Liste ist leer
punkte [] name = ...
-- Die Liste besteht aus einem Element und einer Restliste
punkte (element : restliste) name = ...

Weiterhin weißt du, daß alle Elemente vom Typ Match sind, der nur einen Konstruktor hat. Also können wir die Musteranpassung auf der linken Seite spezialisieren:
punkte [] name = ...
punkte ((Match heim gast (toreHeim, toreGast)) : restliste) name = ...

Außerdem soll die Restliste mittels Rekursion bearbeitet werden und dieses Ergebnis mit den Punkten des aktuell betrachteten Spiels verrechnet werden:
punkte [] name = ...
punkte ((Match heim gast (toreHeim, toreGast)) : restliste) name = ...
where
restpunkte = punkte restliste name

where definiert sozusagen lokale "Variablen" bzw. Funktionen.

So, das war mal ein sehr ausführlicher Ansatz. Und den Rest schaffst du jetzt allein! ;-)


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
KO123

Gepostet:
17.06.2008 15:33

   
Hallo Siracusa,
danke dir für dein sehr ausführlicher Ansatz
nun möchte ich dich bitten mir noch eine Kleinigkeit zu verraten :-)
Ich habe z.B. Liste [Match"A" "B" (1,2),"Match C" "D" (1,2),Match "A" "B" (2,2),Match "C" "D" (1,2),Match "E" "F" (1,2),Match "A" "B" (3,2)]
dann soll ich schreiben punkte [Match"A" "B" (1,2),"Match C" "D" (1,2),Match "A" "B" (2,2),Match "C" "D" (1,2),Match "E" "F" (1,2),Match "A" "B" (3,2)] "A"
als Ergebniss soll ich bekommen dann "A" 4, wegen einmal remi,einmal unentschieden und einmal gewonnen
ich verstehe nicht wie soll ich der Mannschaft das Ergebnis zuweisen, dass z.B. if a>b then "A" ==3 und "B" == 0 oder soll ich Funktionen defienieren wie Sieg, Unentschieden, Niederlage?
Ich hab grade angefangen im Haskell zu programmieren

Viele Grüsse

KO123
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.06.2008 19:16

   
Du brauchst als Ergebnis keiner Mannschaft einen Wert zuweisen. Das Ergebnis ist der Wert selbst, also z.B. if a<b then 3 else 0. Den Ergebnistyp erkennst du schon am Typ deiner Funktion: [Match] -> String -> Int, angewendet auf eine Liste von Spielen und den Mannschaftsnamen bleibt nur noch Int als Ergebnis übrig, ohne noch einen zusätzlichen String.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
KO123

Gepostet:
17.06.2008 21:32

   
hallo Siracusa,
sowas habe ich bekommen:

data Match = Match String String(Int,Int) deriving (Eq,Show)
punkte:: [Match]->String->Int
punkte [] name = 0
punkte ((Match heim gast (a, b)) : restliste) name
| a > b = 3
| a < b = 0
| a==b = 1
where
restpunkte = punkte restliste name

Aber wir müssen die ganze LIste durchlaufen, irgendwie klappt es nicht.
Ich bekomme immer nur ergebnis von erste Fussballpartie
punkte [Match "A" "B" (0,1), Match "A" "B" (2,2),Match "A" "B" (2,1), Match "A" "C" (2,2)] "C"
ich bekomme 0, weil a<b. Ich glaube, ich muss name und heim oder name und gast in zusammengang bringen
wenn du zeit und lust hast, dann melde dich bitte :-)
Zum Seitenanfang    
 
Siracusa

Gepostet:
17.06.2008 23:11

   
Ja, du mußt noch prüfen, ob name==gast oder name==heim und dann entsprechend die richtige Punktezahl bestimmen. Und um die Punkte der Restliste zu erhalten, mußt du natürlich auch noch die "Variable" restpunkte auf die gerade bestimmten Punkte addieren.
Zum Seitenanfang    
 
KO123

Gepostet:
17.06.2008 23:40

   
Danke dir für deine Gedult :-)
Ich hab's verstanden
Ich hab die Aufgabe endlich gelöst:-)
Nochmal vielen Dank!!!

Gruss

KO123
Zum Seitenanfang