HI124 Grundkurs Programmering F7b: Funktioner på djupet! A. Cajander, STH
6 1 5 42 3.14f a float char short circuit order of subexp eval. Dagens fokus = + - * / % ++ -- + - * / % & ^ << >> ==!= > < >= <=! && ~ & ^ << >> a[i] * & a->b a.b fn(), A?B:C sizeof() && comp. ass. i*i++, [ ] Integer overflow Index out of range #define =; Aritmetic If () { } [else { }] Compound assign. qualifiers Comparison 5 switch () case : typedef Sequencing [deafult :] casting Implicit promotion, Explicit. 3 2 Precedence, Operands Assosiativity Selection Reference Iteration Abstract 4 Aggregates Jump Compound Literals Functions 7 Logical Bitwise Referens Other {,,,} overf/index Basic Side effects / Und. behavior DATA TYPES PRG CORR Imp. dependent Syntax related Logical related CTRL STRUCT PRG IN LARGE ; { } /*comment*/ or // makefile Exceptions King 9.6 & 1 while () do while () for (;;) break continue lable:goto return exit Directives main(void){ declarations statements } 1
Den första sammansatta datatypen, matris! RAM RAM 46 47 48 49 4A 4B _ 3 mo 46 2 tu 47 1 3 we 48 1 th 49 1 fr 4A sa _ 4B su 1 _ 4 4 4 4 4 _ 4 4 2 box[] box[1] box[2] box[3] box[4] box[5] box[6] mo = 3; box[] = 3; for ( i=; i<weekdays; i++) box[ i ] = 4; box[ box[ ] ] = 2;
Sammantaget Alla element är av samma typ! Indexen är från till storleken-1! Det går e att tilldela en hel matris till en annan! Matriser måste kopieras element för element! Ett element fungerar exakt som en variabel av elementtypen! Saknas element i ett aggregat ( {1,2,3} ) tilldelas! Ingen run-time test för index-out-of-bounds! Viktigt vid utskrift av innehållet i matriser???
Funktioner Lättbegripligt! Obegripligt! Återanvändbart. Ingen in-data! Ingen ut-data! Ingen ut-data! Namn! Ingen in-data!
Observationer Returtypen kan vara, float, char men e array! Precis som main kan throwdice ha egna variabler. De existerar dock bara när datorn kör funktionen throwdice! Och de döljer då andra globala variabler med samma namn! c fungerar enligt principen copy-by-value. Det betyder att när return ska returnera ett värde så beräknar den först värdet av throw, säg 5, som den därefter returnerar. Den returnerar m.a.o en kopia av resultatet (och e en referens till throw, för throw finns e när funktionen är avslutad!)
Funktioner Kallas för (in-)parameter och fungerar som en lokal variabel i funktionen! Den får sitt värde, via copy-by-value, när funktionen anropas! Värdet eller uttrycket som anges i funktionsanropet kallas för argument. Återkommande! Återanvändbart! Ingen in-data! Ut-data: kast! Antal ögon En funktion kan ha flera inparametrar, då åtskiljda med komma ( a, char ch).
Observationer RAM 46 47 48 49 4A 4B 6 i size Beräknas, copy-by-value! En parameter fungerar som en lokal variabel. Det går bra att ändra värdet, men det påverkar e argumentet som användes vid anropet!!!
Matriser box[ ] & thebox[ ] är samma minnesceller! RAM 46 47 48 49 4A 4B 4C 2 1 1 1 1 7 box[], thebox[] box[1], thebox[1] box[2], thebox[2] box[3], thebox[3] box[4], thebox[4] box[5], thebox[5] box[6], thebox[6] thesize 46 7 Wow! Innehållet kan uppdateras!!!
Observationer RAM 46 5 46 47 48 49 4A 4B 2 1 1 1 1 5 box[], thebox[] box[1], thebox[1] box[2], thebox[2] box[3], thebox[3] box[4], thebox[4] box[5] box[6] thesize 4B 2 Kom ihåg när [ ] ska vara med, och e. Kom ihåg storleken!
Observationer RAM 46 5 46 47 48 49 4A 4B 2 1 1 1 1 2 box[] box[1] box[2] box[3] box[4] box[5], thebox[] box[6], thebox[1] thesize 4B 2 Kom ihåg när [ ] ska vara med, och e. Kom ihåg storleken!
Observationer RAM WOW! 46 47 48 49 4A 4B 2 3 4 2 tmp[], thebox[] tmp[1], thebox[1] tmp[2], thebox[2] thesize Namnlös 1-dim matris perfekt för att testa (Unit Test = UT) en funktion! Kom ihåg när [ ] ska vara med, och e. Kom ihåg storleken!
2 dim matriser RAM w rad 46 1 w[][] 47 2 w[][1] 48 3 w[][2] 49 4 w[][3] 4A 5 w[][4] 4B 6 w[][5] 4C 7 w[][6] 4D 1 w[1][] rader kolumner 1 NO! 2 YES!
Lösningsförslag Luffarschack
Test! Indata? Utdata?
Test! Indata? Utdata? Deklaration, Definition
Test Indata? Utdata?
Test Indata? Utdata? Funktionslokal variabel!
Test Indata? Utdata?
Test Indata? Utdata? Copy-by-value!
Test Indata? Utdata?
Test Indata? Utdata? 2-dim arrays
NYTT! Rekursion En funktion kan anropa sig själv, den är då rekursiv! T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1.
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 n 4 3
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 3 n n 4 3 3 2
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 3 2 n n n 4 3 3 2 2 1
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 3 2 1 n n n n 4 3 3 2 2 1
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 3 2 n n n 4 3 3 2 2 1
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 3 n n 4 3 3 2
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4 n 4 6
Rekursion En funktion kan anropa sig själv, den är då rekursiv! RAM T.ex. kan fakulteten av ett tal n lätt beräknas som: n! = n * (n 1)! Där n! = 1. 46 47 48 49 4A 4B 4!=24
Lokal vs Global variabel Variabeln w sägs vara lokal därför att den deklarerats inuti en funktion! En lokal variabel skapas varje gång koden passeras under exekvering där den är deklarerad, och den glöms bort så snart funktionen når sitt slut! M.a.o kan den hamna på olika ställen i minnet Automatic storage duration, Block scope (visability)
Lokal vs Global variabel Variabeln w sägs vara global därför att den deklarerats utanför alla funk! En global variabel skapas när koden passeras under exekvering där den är deklarerad, och den finns kvar så länge kod från samma fil exekveras. En global variabel är synlig i hela filen från den punkt där den deklareras! Den kan dock skuggas av lokala variabler/parametrar. Static storage duration, File scope (visability)
Lokal vs Global variabel X Svårt att hitta fel, omöjligt att återanvända, förbjudet i kursen!
Bottom up vs Top Down Programutvecklingsmetodik
Bottom up vs Top Down Wow!!!! den måste ha en brutal motor!
Bottom up vs Top Down Sen behövs det kanske någon form av styrning också... Wow!!!! den måste ha en brutal motor!
Bottom up vs Top Down Javisst, en på-knapp behövs också Sen behövs det kanske någon form av styrning också... Wow!!!! den måste ha en brutal motor!
Bottom up vs Top Down Den behöver ett bra gränssnitt
Bottom up vs Top Down Den behöver ett bra gränssnitt som exponerar styrdatorns alla program
Bottom up vs Top Down Den behöver ett bra gränssnitt som exponerar styrdatorns alla program så att motorn körs på rätt sätt!
Bottom up vs Top Down Javisst, en på-knapp behövs också Den behöver ett bra gränssnitt Sen behövs det kanske någon form av styrning också... som exponerar styrdatorns alla program Wow!!!! den måste ha en brutal motor! så att motorn körs på rätt sätt! Det är ofta smart att försöka förstå problemet top-down Det är också ofta smart att utveckla koden top-down
Modultänk init() put() DATA get() Användargränssnitt pr() store() load() Finns redan! init() put() DATA get() pr() store() load() Måste utvecklas!
RPN miniräknare 1P6 1 2 3 * + = 7 5 8 * 4 9 - / = -8 Q (quit) Läs in nästa tecken Om tal, tryck på stacken! Om op, utför op med de två översta talen på stacken! så länge tecknet är tal eller op!..9,+ - * / = Ingen felkod! STACK!
Top-down översikt, nu behöver vi en stack! float Vilken datatyp hjälper oss mest?! char
Top-down översikt, nu behöver vi en stack! stack top SIZE-1 Hum en 1-dim matris kan kanske användas det är svårt att trycka ner tal men ingen vet om de hamnar sist i stället indexet top får markera nästa lediga position push placerar talet på indexet top och ökar top med ett pop returnerar talet på indexet top-1 och minskar top med ett... varför e spara indexet top sist i matrisen ok att skippa alla tester för fel. SIZE
Top-down översikt, nu behöver vi en stack! Push 2 Push 4 Pop 4 stack stack stack stack top 2 2 2 top 4 top top SIZE-1 SIZE-1 1 2 SIZE-1 1 SIZE
Top-down översikt, nu behöver vi en stack! stack top Egentligen behöver bara sista elementet sättas till (=top), men smart att :a alla element. SIZE-1 Programmet behöver e en funktion som skriver ut hela stacken men den är bra att ha!!!!!!!!!!!!!!!!! SIZE
Top-down översikt, nu behöver vi en stack! stack top Egentligen behöver bara sista elementet sättas till (=top), men smart att :a alla element. SIZE-1 Programmet behöver e en funktion som skriver ut hela stacken men den är bra att ha!!!!!!!!!!!!!!!!! SIZE
Top-down översikt, nu behöver vi en stack! stack top SIZE-1 SIZE
Top-down översikt, nu behöver vi en stack! Push 2 Push 4 Pop 4 stack stack stack stack top 2 2 2 top 4 top top SIZE-1 SIZE-1 1 2 SIZE-1 1 SIZE
Top-down översikt, nu behöver vi en stack! Push 2 Push 4 Pop 4 stack stack stack stack top 2 2 2 top 4 top top SIZE-1 SIZE-1 1 2 SIZE-1 1 SIZE
Top-down översikt, nu behöver vi en stack! stack top SIZE-1 SIZE OK!
Användargränssnittet stack top 1 2 3 * + = 7 5 8 * 4 9 - / = -8 PROBLEMBESKRIVNING! Q (quit) Pseudokod datatyper bibliotek återanvända?! Läs in nästa tecken Om tal, tryck på stacken! Om op, utför op med talen på stacken! så länge tecknet är tal eller op! Int main(void) { SIZE-1 } SIZE Nöjd chef Nöjd användare $$$ Bättre kodbibliotek Säkrare utvecklare
stack top SIZE-1 SIZE OK!
Statistik
6 1 5 42 3.14f a float char short circuit order of subexp eval. Dagens fokus = + - * / % ++ -- + - * / % & ^ << >> ==!= > < >= <=! && ~ & ^ << >> a[i] * & a->b a.b fn(), A?B:C sizeof() && comp. ass. i*i++, [ ] Integer overflow #define =; Aritmetic If () { } [else { }] Compound assign. qualifiers Comparison 5 switch () case : typedef Sequencing [deafult :] casting Implicit promotion, Explicit. 3 2 Precedence, Operands Assosiativity Selection Reference Iteration Abstract 4 Aggregates Jump Compound Literals Functions 7 Logical Bitwise Referens Other {,,,} overf/index Basic Side effects / Und. behavior DATA TYPES PRG CORR Imp. dependent Syntax related Logical related CTRL STRUCT PRG IN LARGE ; { } /*comment*/ or // makefile Exceptions while () do while () for (;;) break continue lable:goto return exit Directives main(void){ declarations statements } 1
Övning #7b: -
Rev history 15724.1 AC Rekursion. 15725.5 AC Scope 15726 1. AC Prg.utv.metodik.
file struct [ ] Kursens uppbyggnad Aritmetic If () { } [else { }] Compound assign. qualifiers Comparison 5 switch () case : typedef Sequencing [deafult :] Logical casting Implicit promotion, Explicit. 3 Bitwise 2 Precedence, Referens Operands Assosiativity Selection 9 Reference Repetition 12 Abstract 4 11 Aggregates Jump 1 Compound DATA CTRL 6 Literals Functions 7 1 TYPES STRUCT Basic 5 Exceptions Side effects = + - * / % ++ -- + - * / % & ^ << >> ==!= > < >= <=! && ~ & ^ << >> a[i] * & a->b a.b fn(), A?B:C sizeof() && comp. ass. Other 42 3.14f a float char short circuit i*i++, Integer overflow Index out of range {,,,} text order of subexp eval. uninit var. overf/index #define =; / Und. behavior PRG CORR Imp. dependent Syntax related Logical related PRG IN LARGE ; { } /*comment*/ or // makefile while () do while () for (;;) break Continue lable:goto return exit Directives main(void){ declarations statements } 1 8 Algoritmer I 13 14 Algoritmer II Outlook, not on exam!