Indexerade variabler

Indexerade variabler
•
•
•
•
•
Vad har vi lärt oss så här långt…
Den första sammansatta (compound) datatypen: matris.
Att arbeta med 1-dimensionella matriser.
Att arbeta med flerdimensionella matriser.
Matriser med variabel dimension.
•
•
•
•
•
Att generera slumptal.
En till skalär (basic, built-in) datatyp: boolean
Sortering, en första introduktion.
En till operator: sizeof()
Vad har vi lärt oss i dag…
• Varför vill någon skriva ett program?
• Varför vill någon skriva ett program?
Arbetsintensiv
Monoton
Automatisera en manuell process…
Farlig
Läs av trycket…
Beräkna korrigering…
Ställ in korrigering…
Börja om!
Felkänslig
Sekvens (Imperative)
Procedurer (Functional)
Struktur (Structual)
OTROLIGT
• Varför vill någon skriva ett program?
…använd ett språk som gör det
”lätt” att skriva ett program som
speglar verkligheten!
Java
Ada
C
LISP
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
variabler?
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
Ett namn på en plats i minnet…
variabler?
…vars innehåll kan vara kopplad till något i verkligheten.
MINNE
P
R
O G
R
A
M
V A
0x00 0x01
R
I
A
B
L
E
R
37
0xFD
temp
”temp=37”
CPU
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
Ett namn på en plats i minnet…
variabler?
…vars innehåll kan vara kopplad till något i verkligheten.
• Varför är en variabel av en viss typ?
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
Ett namn på en plats i minnet…
variabler?
…vars innehåll kan vara kopplad till något i verkligheten.
• Varför är en variabel av en viss typ?
Styr minnesbehov och hjälper kompilatorn hitta fel!
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
Ett namn på en plats i minnet…
variabler?
…vars innehåll kan vara kopplad till något i verkligheten.
• Varför är en variabel av en viss typ?
Styr minnesbehov och hjälper compilatorn hitta fel!
• Så här långt har vi lärt oss använda några skalära (basic, builtin, ”ett värde”) datatyper…
2.0
0xFA
tryck
37
0xFD
temp
’N’
0xFF
mod
• Varför vill någon skriva ett program?
Arbetsintensiv Monoton
Automatisera en manuell process…
Farlig Felkänslig
• Programmet består av instruktioner som styr i vilken ordning
som olika operationer utförs på programmets variabler. Vad är
Ett namn på en plats i minnet…
variabler?
…vars innehåll kan vara kopplad till något i verkligheten.
• Varför är en variabel av en viss typ?
Styr minnesbehov och hjälper compilatorn hitta fel!
• Så här långt har vi lärt oss använda några skalära (basic, builtchar
int
float
in, ”ett värde”) datatyper…
2.0
0xFA
tryck
37
0xFD
temp
’N’
0xFF
mod
int mo=0,tu=0,we=0,th=0;
int fr=0,sa=0,su=0;
0
0
0
0
0
0
Skriv ut askens innehåll:
0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
su
mo
we
th
fr
sa
tu
printf(”%d\n”,mo);
printf(”%d\n”,tu);
printf(”%d\n”,we);
printf(”%d\n”,th);
printf(”%d\n”,fr);
printf(”%d\n”,sa);
printf(”%d\n”,su);
0
0
0
0
0
0
0
0
Antal element!
OBS: Elementen numreras från 0!
W[1] är det andra elementet!
Alla element
har samma typ!
int w[7]={0,0,0,0,0,0,0};
0
0
0
0
0
0
Skriv ut askens innehåll:
0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
w[0] w[1] w[2] w[3] w[4] w[5] w[6]
for (int i=0;i<7;i++)
printf(”%d\n”,w[i]);
0
0
0
0
0
0
0
0
Antal element!
OBS: Elementen numreras från 0!
W[1] är det andra elementet!
Alla element
har samma typ!
int w[7]={0,0,0,0,0,0,0};
0
0
0
0
0
0
Skriv ut askens innehåll:
0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
w[0] w[1] w[2] w[3] w[4] w[5] w[6]
for (int i=0;i<7;i++)
printf(”%d\n”,w[i]);
INDEX UTANFÖR FÄLTET!
0
0
0
0
0
0
0
0
Antal element!
OBS: Elementen numreras från 0!
W[1] är det andra elementet!
Alla element
har samma typ!
int w[7]={0,0,0,0,0,0,0};
0
0
0
0
0
0
Skriv ut askens innehåll:
0xF9 0xFA 0xFB 0xFC 0xFD 0xFE 0xFF
w[0] w[1] w[2] w[3] w[4] w[5] w[6]
Byt 7 till
SIZE
for (int i=0;i<7;i++)
printf(”%d\n”,w[i]);
INDEX UTANFÖR FÄLTET!
#define SIZE 7
0
0
0
0
0
0
0
0
#include <stdio.h>
#define SIZE 7
int main(void)
{
int w[SIZE];
printf(”Tabletter per veckodag?\n”);
for(int i=0;i<SIZE;i++)
scanf("%d",&w[i]);
printf(”Kontrollutskrift!\n”);
for(int i=0;i<SIZE;i++)
printf(”%d\n",w[i]);
return 0;
}
Tabletter per veckodag?
2
1
2
1
2
1
1
Kontrollutskrift!
2
1
2
1
2
1
1
Antal element per dimension!
OBS: Elementen numreras från 0!
Alla element
har samma typ!
”rader”
Skriv ut askens innehåll:
int w[4][7]={{1,2,3,4,5,6,7},
”kolumner”
{1,2,3,4,5,6,7},
{1,2,3,4,5,6,7},
{1,2,3,4,5,6,7}};
for (int r=0;r<4;r++){
for (int c=0;c<7;c++)
printf(”%d ”,w[r][c]);
printf(”\n”);
}
1
1
1
1
2
2
2
2
3
3
3
3
4
4
4
4
5
5
5
5
6
6
6
6
7
7
7
7
I normalfallet är ett fälts längd alltid en konstant…
int w[7]={0,0,0,0,0,0,0};
I den ”nya” C-standarden (C99) kan det vara en variabel,
något som är mycket ovanligt, utom i ett specialfall som vi
återkommer till i en senare föreläsning!
int size;
scanf(”%d”, &size);
int w[size];
#include <stdio.h>
#define SIZE 7
int main(void)
{
int w[SIZE];
int average=0;
printf(”Temperatur per veckodag?\n”);
for(int i=0;i<SIZE;i++)
scanf("%d",&w[i]);
printf(”Medelvärde!\n”);
for(int i=0;i<SIZE;i++)
average=average+w[i];
printf(”%d\n”,average/SIZE);
return 0;
}
Temperatur per veckodag?
15
16
17
18
19
20
21
Medelvärde!
18
•
En dator kan inte generera slumptal då den är helt deterministisk, däremot kan den generera pseudoslumptal som kan fås att upplevas som slumptal:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
srand(time(NULL)); //Anropas EN gång för att sätta frö
int tarning1 = rand()%6+1; //blir slumptal 1-6
int tarning2 = rand()%6+1;
printf("du fick %d och %d",tarning1, tarning2);
return 0;
}
•
rand() beräknar nästa slumptal i serien. Resultatet blir mellan 0 och RAND_MAX
•
C saknaren speciell typ för att representera sant och falskt (de flesta språk har det) och använder
istället 1 och 0. I C99 har man lagt till en header som delvis fixar detta. Boken använder detta så
därför går vi igenom det nu:
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
bool flag;
flag = true;//eller false
if(flag)
{
printf("Sant!");
}
return 0;
}
• flag är egentligen en int men kan bara anta värdet 0 och 1. flag=5 ger flag värdet 1
• Codeblocks > Settings > Compiler…
Drivkraften att skapa datorer var ursprungligen behovet att
felfritt utföra en stor mängd komplicerade beräkningar…
…i dag används datorer till allt från smarta eltandborstar till att
styra farkoster till främmande planeter…
…att sortera en sekvens tal är något som en programmerare
dagligen stöter på, vilket har inneburit att vedertagna sätt att
lösa problemet har arbetats fram!
Det finns ett antal vedertagna strategier att ta till beroende på
”när” informationen kan bearbetas samt en avvägning mellan
komplexitet och snabbhet i vald algoritm…
Vi ska börja med att titta på hur man kan sortera data med en
metod som kallas ”bubbelsortering”. Andra sorteringsalgoritmer
tas upp i senare kurser.
I exemplet tittar vi på hur man sorterar heltal, men metoden
fungerar lika bra på alla sorters data som kan ordnas i en
bestämd sekvens, t.ex decimaltal, bokstäver, ord.
Algoritmen vi ska titta på kallas bubbelsortering eftersom de
större talen tillåts bubbla upp (till höger).Ex:
12
8
14
9
2
Jämför talen två och två från vänster till höger. Om talet till vänster är
större byter man plats. Jämför tal 0 och 1:
BYT!
12
8
14
Talet till vänster är större så vi byter plats!
9
2
8
12
14
9
2
Nu jämför vi tal 1 och 2:
OK!
8
12
14
9
2
Talet till vänster är mindre så ingen åtgärd. Nu jämför vi tal 2 och 3:
BYT!
8
12
14
Talet till vänster är större så vi byter plats:
8
12
9
Nu jämför vi tal 3 och 4:
8
12
9
Talet till vänster är större så vi byter plats:
8
12
9
9
2
14
2
14
2
BYT!
2
14
Vad har vi då åstadkommit?
Jo vi kan vara säkra på att det största talet befinner sig längst till
höger. Detta gäller oberoende hur det såg ut från början.
Övertyga gärna dig själv om detta!
Vad gör vi nu? Jo samma sak med fältet utom den sista platsen.
”klart!”
Jämför tal 0 och 1:
OK!
8
12
9
Ingen åtgärd. Nu jämför vi tal 1 och 2:
8
12 BYT!
9
Talet till vänster är större så vi byter plats:
8
9
12
Nu jämför Vi tal 2 och 3:
2
14
2
14
2
14
8
9
12 BYT!
Talet till vänster är större så vi byter plats:
2
14
12
14
8
9
2
Vi kan nu vara säkra på att det näst sista talet är det näst högsta. Nu
behöver vi bara upprepa algoritmen två gånger till för att vara säkra
på att alla tal kommer i nummerordning.
”klart!”
Steg 3: Jämför tal 0 och 1:
OK!
8
9
2
12
Ingen åtgärd. Nu jämför vi tal 1 och 2:
BYT!
8
9
2
12
Talet till vänster är större så vi byter plats:
8
2
9
12
Steg 4: Jämför tal 0 och 1:
8
14
14
”klart!”
BYT!
8
2
9
12
Talet till vänster är större så vi byter plats:
2
14
9
12
Vi kan nu vara säkra på att alla tal är i nummerordning!
14
14
0
1
n-2 n-1
Sortera fält f med antal element n:
För i från 0 till n – 2:
För varje varv bubblar
ett nytt tal upp.
För j från 0 till n – 2 – i:
Den inre loopen
Om f[j]>f[j+1] byt plats
bubblar upp ett tal.
Varför fungerar inte:
tal[j]=tal[j+1]
tal[j+1]=tal[j]
for(i=0;i<antal-1;i++){
for(j=0;j<antal-1-i;j++){
if(tal[j]>tal[j+1]){
tmp=tal[j];
tal[j]=tal[j+1];
tal[j+1]=tmp;
}
}
}
• sizeof-operatorn svarar på hur många bytes (1 byte är 8 bitar,
en bit är 1 eller 0) en typ eller variabel är
sizeof(char); //ger alltid 1
sizeof(int);//kan variera på 32-bitars dator oftast 4
int j;
sizeof(j);//går också bra
• Vad ska man ha detta till? Tex:
int i,a[5];
for(i=0;i<sizeof(a)/sizeof(a[0]);i++)
a[i]=1;
• Matriser (array)
• Introduktion sortering
• Tentafrågor…
int a[]={1,2,3,4};
Int b[]={1,2,3,4};
a[4]=-4;
b=a;
printf(”%d\n”, a[b[2]]);
(1-dim matriser som parameter, föreläsning 5.)
(2-dim matriser som parameter, föreläsning 8.)
• Skriv ett program som läser in 10 siffror från användaren till en array och som
sedan kontrollerar hur många åttor arrayen innehåller och skriver ut detta
• Skriv ett program som lagrar 2 slumptal i en array och sedan sorterar dessa
• Försök att förstå sorteringsalgoritmen och ändra sedan koden så att den
sorterar med störst först
• Läs 7.6 och Boolean Values in C99 sid 85 i 5.2
• Läs 8.1
• Gör K8 P1, P2, P3
Börja med att sätta dig in i programmet!
Vad gör n%10? 234%10 ger 4
Vad gör n/=10? 234/=10 ger 23
• Läs 8.2 och 8.3
• Gör K8 P7
• Gör P9 om du hinner
E-excercises, P-programming projects