Forum: Meningen med funktioner...

Forum huvudsida -> Programmering -> Meningen med funktioner...

Sidor: 1

Till botten

Gaburieru 00:43 - 10:e Maj 2008 | Post #1
Medlem
Inlägg: 7


Skicka PM
Hej, jag har lixom aldrig fattat vad det är för mening att använda funktioner, det gör det ju bara mer komplicerat... (Syftar på koderna i guiden, dom sakerna som händer i koderna med funktioner, kan man göra utan funktioner också)

Jag vet att jag förklarar dåligt... =(




HärJ 01:33 - 10:e Maj 2008 | Post #2
Moderator
Inlägg: 1198


Skicka PM
Funktioner är bra eftersom du kan utföra en viss typ av operationer med ett anrop. Då slipper du långa kod-stycken som blir svår lästa och kan leda till fel.
Jag illustrerar.
  1. (defun main ()
  2. (setq ja 0)
  3. (setq nej 0)
  4. (format t "Gillar du bananer?")
  5. (setq svar (read-line))
  6. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  7. ((equal svar "nej") (setq nej (+ nej 1))))
  8. (format t ",,r herj bäst?")
  9. (setq svar (read-line))
  10. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  11. ((equal svar "nej") (setq nej (+ nej 1))))
  12. (format t ",,r detta pedagogiskt?")
  13. (setq svar (read-line))
  14. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  15. ((equal svar "nej") (setq nej (+ nej 1))))
  16. (format t "Dricker du kaffe?")
  17. (setq svar (read-line))
  18. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  19. ((equal svar "nej") (setq nej (+ nej 1))))
  20. (format t "Du svarade ja ~sggr och nej ~sggr" ja nej))

som du märker blir det vad vi i svenskan kallar "störande upprepning". Istället skulle jag ha skrivit:
  1. (defun main ()
  2. (setq ja 0)
  3. (setq nej 0)
  4. (format t "Gillar du bananer?")
  5. (ja-nej-fraga)
  6. (format t ",,r herj bäst?")
  7. (ja-nej-fraga)
  8. (format t ",,r detta pedagogiskt?")
  9. (ja-nej-fraga)
  10. (format t "Dricker du kaffe?")
  11. (ja-nej-fraga)
  12. (format t "Du svarade ja ~sggr och nej ~sggr" ja nej))
  13.  
  14. (defun ja-nej-fraga ()
  15. (setq svar (read-line))
  16. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  17. ((equal svar "nej") (setq nej (+ nej 1)))))

som du ser blir det lättare att läsa och misstag blir kanske färre.
Har inte testkört koden så den kan innehålla buggar.
Hoppas det gav en liten vink av vad man kan ha funktioner tillSmiley

EDIT: tobbez: om du ska klaga kan du börja skriva lispSmiley tror alla buggar ska vara borta nu.

-------------------------
Tänk om jag vore en skalärprodukt!

Senast redigerad 02:01 - 10:e Maj 2008


kode 01:37 - 10:e Maj 2008 | Post #3
Medlem
Inlägg: 45


Skicka PM
Funktioner/metoder har flera nyttor. En av de mest uppenbara är nog det att det underlättar enormt att kunna återanvända samma kod flera gånger. För att ta ett dåligt exempel:

Säg att du ska räkna ut medelvärdet av två tal. Detta görs genom att addera de två talen och dividera med 2 (antalet tal). Säg att du skriver det i din main-funktion precis där du använder det.

Längre fram i körningen behöver du ett medelvärde av två tal igen, och skriver in (kopierar/klistrar in) samma kod igen.

Säg att det här (och liknande situationer) inträffar några gånger till.

Du upptäcker en bugg i din kod. I det här exemplet kan vi kanske ta att du får svaret 0 istället för 0.5 när du ville ha medelvärdet av talen 1 och 0. Du upptäcker att det var för att du råkat utföra heltalsdivision istället för flyttalsdivision på samtliga ställen i koden.

Hade du anropat en funktion för att räkna ut medelvärden i detta fall hade det varit ett ställe att ändra på, nu kanske det är 10. Risken är ju att du dessutom missade ett eller två ställen och buggen kvarstår utan att du kanske direkt upptäcker det.

Som sagt, ett ganska dåligt exempel.

Och givetvis kan man göra samma sak utan funktioner, men det är generellt sett inte att rekommendera (dålig programmeringsstil, et.c.).




ozamosi 01:56 - 10:e Maj 2008 | Post #4
Administratör
Inlägg: 1129


Skicka PM
I guiden används cout, vilket inte är en vanlig funktion, men det är egentligen bara objektorienterings-fluff runt vad som väsentligen är en funktion.

En gång i tiden lärde jag mig 286-assembler. Guiden jag läste gick igenom inmatning och utmatning innan den gick igenom funktioner. Den berättade också att DOS inbyggda inmatning- och utmatning-bibliotek var makalöst sega, jämfört med att helt enkelt ansluta till rätt port i datorn och läsa eller skriva. Alltså: praktiskt taget inga onödiga funktionsanrop (avsluta program, t ex, var såklart funktionsanrop ändå).

Jag satt en hel helg för att lyckas åstakomma ungefär vad herj skriver ovan (dock bara med två frågor - det var Många rader att kopiera per utmatning). Källkoden blev till slut, om jag inte minns fel, över 6 kB - dvs, den innehöll mer än 6 000 tecken.

Herj gjorde just dubbelt så mycket (fyra frågor) på under 400 tecken. Därför har man funktioner.

Nu var det assembly, inte C - en if-sats tar minst 4 rader med runt 10 tecken/rad, men lisp är inte precis sparsamt med tecknena heller.

Varje gång du kopierar kod från en plats till en annan gör du Fel - för det innebär att om det finns ett fel i koden måste du ändra koden på två platser - eller fyra platser i herjs exempel ovan. Och det gör dessutom att du måste kopiera det nästa gång också.

Det blir mycket lättare att läsa vad koden gör om man klipper ut allt äckligt klägg, packar in den i ett hörn någonstans, och ersätter den med ett pedagogiskt valt namn, så vet du att något lite lagom mystiskt som du inte behöver bry dig om kommer att göra precis vad funktionsnamnet säger - och gör det inte det behöver du som sagt bara fixa det i funktionen en gång.

-------------------------
Ljusblå

Senast redigerad 01:58 - 10:e Maj 2008


tobbez 01:56 - 10:e Maj 2008 | Post #5
Medlem
Inlägg: 364


Skicka PM
EDIT: tobbez: om du ska klaga kan du börja skriva lispSmiley tror alla buggar ska vara borta nu.


Ok, här är en finare version av din kod Smiley
  1. (defun main ()
  2. (setq ja 0)
  3. (setq nej 0)
  4. (fraga "Gillar du bananer?")
  5. (fraga ",,r herj bäst?")
  6. (fraga ",,r detta pedagogiskt?")
  7. (fraga "Dricker du kaffe?")
  8. (format t "Du svarade ja ~sggr och nej ~sggr" ja nej))
  9.  
  10. (defun ja-nej-fraga ()
  11. (setq svar (read-line))
  12. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  13. ((equal svar "nej") (setq nej (+ nej 1)))))
  14.  
  15. (defun fraga (str)
  16. (format t str)
  17. (ja-nej-fraga))
  18.  
  19. (main)


Edit: Egentligen var det fult att bara skriva en wrapper runt herjs funktion och lägga till lite funktionalitet, så här borde det varit:

  1. (defun main ()
  2. (setq ja 0)
  3. (setq nej 0)
  4. (ja-nej-fraga "Gillar du bananer?")
  5. (ja-nej-fraga ",,r herj bäst?")
  6. (ja-nej-fraga ",,r detta pedagogiskt?")
  7. (ja-nej-fraga "Dricker du kaffe?")
  8. (format t "Du svarade ja ~sggr och nej ~sggr" ja nej))
  9.  
  10. (defun ja-nej-fraga (fraga)
  11. (format t fraga)
  12. (setq svar (read-line))
  13. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  14. ((equal svar "nej") (setq nej (+ nej 1)))))
  15.  
  16. (main)



Senast redigerad 02:02 - 10:e Maj 2008


HärJ 02:11 - 10:e Maj 2008 | Post #6
Moderator
Inlägg: 1198


Skicka PM
kan hålla med om att tobbez sista kod är snyggare...
men det var ju länge sen jag skrev skrev nåt alls och att då tävla med en Innovativ programmerare... ja vet inteSmiley
men jag lyfter på hatten för tobbez

-------------------------
Tänk om jag vore en skalärprodukt!



tobbez 02:13 - 10:e Maj 2008 | Post #7
Medlem
Inlägg: 364


Skicka PM
    Citat av HärJ:
men jag lyfter på hatten för tobbez


Man tackar ^^




tobbez 02:46 - 10:e Maj 2008 | Post #8
Medlem
Inlägg: 364


Skicka PM
Så här kan man också skriva om man vill, även om det inte ger jättemycket. Frågefunktionen är dock trevligare att använda om man skulle generera frågorna i programmet på något sätt (som en lista).

  1. (defun main ()
  2. (setq ja 0)
  3. (setq nej 0)
  4. (fraga-fragor (list ",,r du en banan?" "Bor du i en skog?" "Bor kottarna i skogen om vintern?" ",,r det här ett nyttigt program?"))
  5. (format t "Du svarade ja ~sggr och nej ~sggr" ja nej))
  6.  
  7. (defun fraga-fragor (fragor)
  8. (if (not (endp fragor))
  9. (progn
  10. (format t (first fragor))
  11. (setq svar (read-line))
  12. (cond ((equal svar "ja") (setq ja (+ ja 1)))
  13. ((equal svar "nej") (setq nej (+ nej 1))))
  14. (fraga-fragor (rest fragor)))))
  15.  
  16. (main)





HärJ 02:51 - 10:e Maj 2008 | Post #9
Moderator
Inlägg: 1198


Skicka PM
listor är ju alltid trevligaSmiley
Det här blir ju bara bättre och bättre.

-------------------------
Tänk om jag vore en skalärprodukt!



tobbez 02:56 - 10:e Maj 2008 | Post #10
Medlem
Inlägg: 364


Skicka PM
Fast nu blir det nog inte så mycket bättre, tror jag.




HärJ 03:27 - 10:e Maj 2008 | Post #11
Moderator
Inlägg: 1198


Skicka PM
Det beror ju på, ska man ha många ja och nej frågor efter varandra är den underbar. Annars är den lite klumpig kanske...
Då skulle man kunna ha båda funktionerna för att använda vid olika tillfällenSmiley

-------------------------
Tänk om jag vore en skalärprodukt!



Gaburieru 20:05 - 10:e Maj 2008 | Post #12
Medlem
Inlägg: 7


Skicka PM
Jag tror att jag fattar nu, tack killar!Smiley




HärJ 21:36 - 10:e Maj 2008 | Post #13
Moderator
Inlägg: 1198


Skicka PM
    Citat av Gaburieru:
Jag tror att jag fattar nu, tack killar!Smiley

tack själv!
Var riktigt kul att komma igång igenSmiley

-------------------------
Tänk om jag vore en skalärprodukt!



Hetzz 19:09 - 11:a Maj 2008 | Post #14
Medlem
Inlägg: 516


Skicka PM
En liknelse som jag kom att tänka på var att jämföra med en fabrik:

En fabrik är ett program, du matar in något och du får ut något.

Beroende på vad fabriken(programmet) gör så finns det olika slag av maskiner(funktioner) som endast har en del av uppgiften.
Detta medför skalbarhet(köpa fler maskiner) och även effektivare felsökning/optimering (jämf. att finna fel på en maskin och tillämpa lösningen på alla liknande)



edit: det blev lite rörigt, bild är påväg...




Bilden ska illustrera en fabrik som tillverkar lådor.

,,garen hade kunnat lösa detta på olika sätt.

Metod 1:
Att bygga fabriken så att den klarar att tillverka de lådor som planerats.

Metod 2:
Att placera maskiner i fabriken som klarar att göra det arbete som efterfrågas.

Metod 2 ger oss fördelen att om man tex vill expandera fabriken i ett senare tillfälle så behöver man endast fixa fler maskiner som gör just det man vill. Man kan även lättare ändra designen utan att behöva designa om hela tillverkningskedjan.


hmm, jag hade allt mycket bättre planerat... får skylla på irl-arbete och annat som kommit i vägen.

-------------------------



Senast redigerad 19:21 - 11:a Maj 2008


ozamosi 19:15 - 11:a Maj 2008 | Post #15
Administratör
Inlägg: 1129


Skicka PM
*vänta nyfiket på att få in klasser i det hela*

-------------------------
Ljusblå



HärJ 19:29 - 11:a Maj 2008 | Post #16
Moderator
Inlägg: 1198


Skicka PM
    Citat av ozamosi:
*vänta nyfiket på att få in klasser i det hela*

KlassKamp!Smiley

-------------------------
Tänk om jag vore en skalärprodukt!



FunkyChicken 20:00 - 11:a Maj 2008 | Post #17
Nyhetsredaktör
Inlägg: 800


Skicka PM
Hetzz: Helt glasklart blev det inte riktigt... men bilden var tjusig =)




achnorr 22:36 - 11:a Maj 2008 | Post #18
Medlem
Inlägg: 82


Skicka PM
mitt bidrag \o/ (lyckades pressa in en klass) Smiley
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. string svar;
  7.  
  8.  
  9. class hantering
  10. {
  11. private:
  12. int antalja;
  13. int antalnej;
  14.  
  15. public:
  16. void janej();
  17. void nolla();
  18. void visa();
  19. };
  20.  
  21. void hantering::janej()
  22. {
  23. cin>>svar;
  24. if(svar == "ja"|| svar == "JA" || svar == "Ja" || svar == "jA") {antalja += 1;}
  25. else {antalnej += 1;}
  26. }
  27.  
  28. void hantering::visa()
  29. {cout<<" du svarade ja "<<antalja<<" ggr och nej "<<antalnej<<" ggr\n";}
  30.  
  31. void hantering::nolla()
  32. {
  33. antalja = 0;
  34. antalnej = 0;
  35. }
  36. int main()
  37. {
  38. hantering test;
  39.  
  40. test.nolla();
  41.  
  42. cout<<" gillar du bananer?\n";
  43. test.janej();
  44. cout<<" gillar du apor?\n";
  45. test.janej();
  46. cout<<" är du en apa?\n";
  47. test.janej();
  48. cout<<" är du en skog?\n";
  49. test.janej();
  50.  
  51. test.visa();
  52.  
  53. cin.get();
  54. cin.get();
  55. return 0;
  56. }


-------------------------
Ohhoo*



Hetzz 13:12 - 12:a Maj 2008 | Post #19
Medlem
Inlägg: 516


Skicka PM
    Citat av FunkyChicken:
Hetzz: Helt glasklart blev det inte riktigt... men bilden var tjusig =)


Tanken var att det i slutskredet skulle finnas flera olika maskiner, att dessa skulle användas i ett vettigt exempel där klasser symboliserades av maskiner och lite dylikt. Det lät nice i huvudet och såg bra ut...




-------------------------





ozamosi 15:20 - 12:a Maj 2008 | Post #20
Administratör
Inlägg: 1129


Skicka PM
Nästa spännande inslag att få med: factories.

-------------------------
Ljusblå



Sidor: 1

Forum huvudsida -> Programmering -> Meningen med funktioner...
Atom feed

Du får inte posta i den här tråden | Till toppen