1 2 | nächste Seite |
Gepostet: |
Programm was die quersumme berchnet. | ||||||||||
Hallo ich bin noch ziemlich neu mit Haskell zugange und habe daher noch nicht wirklich einen plan davon. Ich muss jetzt für die Schule ein programm schreiben, dass unter anderem die quersumme einer Zahl berechnen muss. Ich habe zwar ein Programm gefunden das funktioniert, aber ich versteh es nicht wirklich. Daher wäre es sehr nett, wenn es mir jemand erklären könnte, oder jemand ein einfacheres Programm hätte. Hier ist das was ich nicht ganz verstehe: machefeld :: Int -> [Int] -> [Int] machefeld a b |(div a 10) == 0 = b++[a] |otherwise = machefeld (div a 10)(b++[(mod a 10)]) quersumme1 :: [Int] -> Int -> Int quersumme1 a b |a == [] = b |otherwise = quersumme1 (tail a) ((head a) + b) quersumme :: Int -> Int quersumme a |(div a 10) == 0 = a |otherwise = quersumme (quersumme1 (machefeld a []) 0) Ich sag schonmal vielen Dank für die Hilfe. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ich erklär einfach mal deinen code also: machefeld :: Int -> [Int] -> [Int] wenn du noch fragen hast, frag ruhig,...:-) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, meiner Meinung nach ist das Programm doch unnötig umständlich geschrieben, denn es geht wesentlich einfacher:
Beim Aufruf von quersumme x wird geprüft, ob x=0. Falls ja, wird 0 als Ergebnis zurückgegeben. Sonst wird die letzte Ziffer der Zahl abgetrennt und dazu die Quersumme vom vorderen Teil der Zahl addiert. Beispiel: quersumme 123 = (123 mod 10) + quersumme (123 div 10) = 3 + quersumme 12 = 3 + (12 mod 10) quersumme (12 div 10) = 3 + 2 + quersumme 1 = 3 + 2 + (1 mod 10) + quersumme (1 div 10) = 3 + 2 + 1 + quersumme 0 = 3 + 2 + 1 + 0 = 6 Viele Grüße! |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ok geht wirklich einfacher hast recht..:D gruß jacke |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen Dank für eure Hilfe. Ich hätte da noch ne weitere Frage zu diesen Programm. Das Ergebnis der Quersumme soll nämlich darauf geprüft werden, ob es eine Schnapszahl ist oder nicht. Sprich ob die quersumme einstellig ist bzw. eine zahl aus gleichen ziffern (zB. 77, 999,....)ist oder eben nicht. Wie kann man das denn hinbekommen. Vielen Dank schonmal für die Hilfe. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
--and prüft ob in ner liste alle true sind ...das mit den eckigen klammern ist list comprehension...und prüft ob alle zahlen in der liste gleich der ersten zahl sind... und machefled macht ne liste aus der zahl |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Danke erstmal. Kannst du mir vieleicht mal einige Zeilen genauer erklären? Was macht dieser Teil hier: schnapszahl zahl= allequal (machefeld zahl []) where allequal (x:xs)= and [(x==y) | y<-xs] wofür steht das "zahl" (steht das "zahl" nur für die zahl die untersucht werden soll? - Sprich die quersumme?) was bringt das "allequal" (ist das ein fester Begriff in Haskell?) Vielen Dank schonmal. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ich habe noch eine Frage: Wie kann ich es denn schaffen, dass die quersumme einer Zahl überprüft wird ob sie, die quersumme, eine Schnapszahl ist? Also wie kann ich die beiden Programme zusammenführen? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
zur ersten frage : zahl ist ne variable ...hätte ich auch blub nennen können..und ist in der tat die zahl die untersucht werden soll allequal ist ne extra funktion die ich mir definiert habe...so wie machefeld zum beispiel...nach where kann man auch eigene funktionen definieren...allequal hab ich sogenannt weil es in haskell eine ähnliche funktion gibt und damit ich die anlogie dazu verdeutliche...ist aber auch nur nen name , kann man auch total anders nennen... "and" hingegen ist wirklich eine richtige haskellfunktion ...die prüft ob alle elemente eine liste true sind und das [x==y |y<-xs] erzeugt ne liste von bools...dabei wird immer mit dem ersten x aus der lsite verglichen... und es kommt sowas raus wie [True,True,False]..oder ebend [True,True,True..] wenn alle zahel gleich sind...and [True,True,False] liefert False und and [True,True] liefert True so würde schnapszahl auch gehen...aber mit where ist es kompakter
zu deiner zweiten frage : das macht man dann so: neuesprog ::Int -> Bool neuesprog zahl = schnapszahl (quersumme zahl) gruß jacke |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen Dank für die Hilfe, aber etwas ist mir noch nicht ganz klar: was macht die Funktion "allequal"? |
|||||||||||
Zum Seitenanfang | |||||||||||
1 2 | nächste Seite |