Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Grundkurs Programmering F7b: Funktioner på djupet!
A. Cajander, STH
HI1024
Dagens fokus…
DATA TYPES
CTRL STRUCT
PRG IN LARGE
PRG CORR Directives
int main(void){ declarations statements } /*comment*/ or //
Sequencing
Selection
Iteration
Side effects
Und. behavior
Imp. dependent
Basic
Compound Literals
Aggregates
Operands casting
Reference Abstract
Jump
Syntax related Logical related
typedef qualifiers
makefile
Precedence, Assosiativity
Implicit promotion, Explicit.
Functions
Exceptions 1
float int
3.14f 42
int/int
1
Aritmetic
Comparison Logical
Bitwise
Compound assign.
Referens Other
2
= + - * / % ++ -- + - * / % & | ^ << >>
== != > < >= <= ! && ||
~ & | ^ << >>
a[i] * & a->b a.b fn() , A?B:C sizeof()
order of subexp eval. i*i++,
short circuit && || comp. ass.
”#define =; ”
; { }
If () { } [else { }] switch () case : [deafult :] 3
for (;;)
while () do while ()
break continue lable:goto return exit
4
King 9.6 & 10
char 5
Integer overflow
’a’
5
6 [ ]
{,,,}
Index out of range overf/index
7
Den första sammansatta datatypen, matris!
RAM
46 47 48 49
int box[0]
4A 4B
int int int int int int
box[1] box[2] box[3] box[4] box[5] box[6]
2 1 1 1 0 0 1
box[ box[ 0 ] ] = 2;
RAM
46 47 48 49
int mo 0
4A 4B
int tu 0 int we 0 int th 0 int fr 0 int sa 0 int su 0
mo = 3; box[0] = 3;
3 _ _ 3
for (int i=0; i<WEEKDAYS; i++) box[ i ] = 4;
4 4 4 4 4 4
_ _ _ _ _ _ _
2 _
4
Sammantaget
Alla element är av samma typ! Indexen är från 0 till storleken-1! Det går inte 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 0! 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 int, float, char men inte array!
Precis som main kan throwDice ha egna variabler. De existerar dock bara när datorn kör funk-tionen 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 inte en referens till throw, för throw finns inte när funktionen är avslutad!)
Funktioner…
Återkommande! Återanvändbart! Ingen in-data! Ut-data: kast!
”Antal ögon”
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.
En funktion kan ha flera in-parametrar, då åtskiljda med komma (int a, char ch).
Observationer…
RAM
46 47 48 49
int i
4A 4B
int size
0
6
Beräknas, copy-by-value!
En parameter fungerar som en lokal variabel. Det går bra att ändra värdet, men det påverkar inte argumentet som användes vid anropet!!!
Matriser
RAM
46 47 48 49
int box[0], theBox[0]
4A 4B
int int int int int int
2 1 1 1 0 0 1
46 7
Wow! Innehållet kan uppdateras!!!
box[1], theBox[1] box[2], theBox[2] box[3], theBox[3] box[4], theBox[4] box[5], theBox[5] box[6], theBox[6] 4C
int
box[ ] & theBox[ ] är samma minnesceller!
theSize 7
Observationer…
RAM
46 47 48 49
int
4A 4B
int int int int int int
box[5] box[6]
2 1 1 1 0 0 1 46 5
Kom ihåg när [ ] ska vara med, och inte. Kom ihåg storleken!
4B 2
box[0], theBox[0] box[1], theBox[1] box[2], theBox[2] box[3], theBox[3] box[4], theBox[4]
theSize 5 int
Observationer…
RAM
46 47 48 49
int
4A 4B
int int int int int int
box[5], theBox[0] box[6], theBox[1]
2 1 1 1 0 0 1 46 5
Kom ihåg när [ ] ska vara med, och inte. Kom ihåg storleken!
4B 2
box[0] box[1] box[2] box[3] box[4]
theSize 2 int
Observationer…
RAM
46 47 48 49 4A 4B
Kom ihåg när [ ] ska vara med, och inte. Kom ihåg storleken!
WOW!
”Namnlös” 1-dim int matris perfekt för att testa (Unit Test = UT) en funktion!
int tmp[0], theBox[0] int int
2 3 4
tmp[1], theBox[1] tmp[2], theBox[2] theSize 2 int
2 dim matriser
”rader” ”kolumner”
RAM
46 47 48 49
int w[0][0]
4A 4B
int int int int int int
1 2 3 4 5 6 7
w[0][1] w[0][2] w[0][3] w[0][4] w[0][5] w[0][6] 4C
4D int w[1][0] 1
”rad 0”
”1”
”2”
w
NO!
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
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.
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3 3 2
int n 3
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3 3 2
int n 3
2 1
int n 2
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3 3 2
int n 3
2 1
int n 2 int n 1
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3 3 2
int n 3
2 1
int n 2
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.
RAM
46 47 48 49
int n
4A 4B
4
4 3 3 2
int n 3
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.
RAM
46 47 48 49
int n
4A 4B
4
4 6
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.
RAM
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 dekla-reras! Den kan dock skuggas av lokala variabler/parametrar.
Static storage duration, File scope (visability)
Lokal vs Global variabel…
Svårt att hitta fel, omöjligt att återanvända, ”förbjudet” i kursen!
X
Bottom up vs Top Down
Programutvecklingsmetodik
Bottom up vs Top Down
Wow!!!! den måste ha en brutal motor!
Bottom up vs Top Down
Wow!!!! den måste ha en brutal motor!
Sen behövs det kanske någon form av styrning också...
Bottom up vs Top Down
Wow!!!! den måste ha en brutal motor!
Sen behövs det kanske någon form av styrning också...
Javisst, en på-knapp behövs också…
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
Wow!!!! den måste ha en brutal motor!
Sen behövs det kanske någon form av styrning också...
Javisst, en på-knapp behövs också…
Den behöver ett bra gränssnitt…
…som exponerar styrdatorns alla program…
…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…
Användargränssnitt
DATA init()
put() get()
print() store()
load()
DATA init()
put() get()
print() store()
load()
Finns redan!
Måste utvecklas!
Vi vill fokusera på tjänsterna och dölja bort vald datastruktur!
RPN miniräknare 10P6
1 2 3 * + = 7 5 8 * 4 9 - / = -8 Q (quit)
STACK!
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!
0..9,+ - * / = Ingen felkod!
Top-down översikt, nu behöver vi en stack!
Vilken datatyp hjälper oss mest?!
float
char
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
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 inte spara indexet top sist i matrisen… …ok att skippa alla tester för fel.
(I lab2 är det förbjudet att lagra eventuella räknare i eventuella matriser!) Ni ska träna på ett annat koncept!!!
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
Push 2 stack
0
1 SIZE-1
top 2
stack 0
2
top
2
Push 4
4
stack 0
1 SIZE-1
2
Pop 4
top
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
Egentligen behöver bara sista elementet sättas till 0 (=top), men smart att 0:a alla element.
Programmet behöver inte en funktion som skriver ut hela stacken men den är bra att ha! !!!!!!!!!!!!!!!!
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
Egentligen behöver bara sista elementet sättas till 0 (=top), men smart att 0:a alla element.
Programmet behöver inte en funktion som skriver ut hela stacken men den är bra att ha! !!!!!!!!!!!!!!!!
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
Top-down översikt, nu behöver vi en stack!
SIZE
stack 0
0 SIZE-1
top
Push 2 stack
0
1 SIZE-1
top 2
stack 0
2
top
2
Push 4
4
stack 0
1 SIZE-1
2
Pop 4
top
Top-down översikt, nu behöver vi en stack!
SIZE
stack 0
0 SIZE-1
top
Push 2 stack
0
1 SIZE-1
top 2
stack 0
2
top
2
Push 4
4
stack 0
1 SIZE-1
2
Pop 4
top
Top-down översikt, nu behöver vi en stack!
stack
SIZE
0
0 SIZE-1
top
OK!
stack
SIZE
0
0 SIZE-1
top
Användargränssnittet…
1 2 3 * + = 7 5 8 * 4 9 - / = -8 PROBLEMBESKRIVNING! Q (quit)
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!
Pseudokod… …datatyper… …bibliotek… …återanvända?!
Int main(void) { }
Nöjd användare Nöjd chef
Bättre kodbibliotek Säkrare utvecklare
$$$
stack
SIZE
0
0 SIZE-1
top
OK!
Nästan perfekt…
Vi har nu en handfull återanvändbara rutiner som tillsammans utgör det som krävs för att hantera en stack… …två saker återstår för att det ska vara helt perfekt:
1) Programmeraren vet att stacken är en array & 2) Stacken kan bara hantera int
…något som är svårt att helt kringgå i c, utan det får vänta tills ni läser Java!
Statistik…
Dagens fokus…
DATA TYPES
CTRL STRUCT
PRG IN LARGE
PRG CORR Directives
int main(void){ declarations statements } /*comment*/ or //
Sequencing
Selection
Iteration
Side effects
Und. behavior
Imp. dependent
Basic
Compound Literals
Aggregates
Operands casting
Reference Abstract
Jump
Syntax related Logical related
typedef qualifiers
makefile
Precedence, Assosiativity
Implicit promotion, Explicit.
Functions
Exceptions 1
float int
3.14f 42
int/int
1
Aritmetic
Comparison Logical
Bitwise
Compound assign.
Referens Other
2
= + - * / % ++ -- + - * / % & | ^ << >>
== != > < >= <= ! && ||
~ & | ^ << >>
a[i] * & a->b a.b fn() , A?B:C sizeof()
order of subexp eval. i*i++,
short circuit && || comp. ass.
”#define =; ”
; { }
If () { } [else { }] switch () case : [deafult :] 3
for (;;)
while () do while ()
break continue lable:goto return exit
4
5
char 5
Integer overflow
’a’
6 [ ]
{,,,}
overf/index
7
Övning #7b: -
Rev history
150724 0.1 AC Rekursion. 150725 0.5 AC Scope 150726 1.0 AC Prg.utv.metodik.
Kursens uppbyggnad…
DATA TYPES
CTRL STRUCT
PRG IN LARGE
PRG CORR Directives
int main(void){ declarations statements } /*comment*/ or //
Sequencing
Selection
Repetition
Side effects
Und. behavior
Imp. dependent
Basic
Compound Literals
Aggregates
Operands casting
Reference Abstract
Jump
Syntax related Logical related
typedef qualifiers
makefile
Precedence, Assosiativity
Implicit promotion, Explicit.
Aritmetic
Comparison Logical
Bitwise
Compound assign.
Referens Other
Functions
Exceptions
; { }
If () { } [else { }] switch () case : [deafult :]
for (;;)
while () do while ()
break Continue lable:goto return exit
1
1
2 3
char float int ’a’ 3.14f 42
int/int
4
5
6 7
9
8 Algoritmer I
10 11
12
[ ] struct
”text” {,,,}
file
Algoritmer II Outlook, not on exam!
13 14
= + - * / % ++ -- + - * / % & | ^ << >>
== != > < >= <= ! && ||
~ & | ^ << >>
a[i] * & a->b a.b fn() , A?B:C sizeof()
order of subexp eval. i*i++,
short circuit && ||
uninit var.
comp. ass.
Integer overflow Index out of range
overf/index
”#define =; ”
5