24
Arrays (indicerade variabler) Föreläsning 6

Array, slump

Embed Size (px)

Citation preview

Page 1: Array, slump

Arrays (indicerade variabler)

Föreläsning 6

Page 2: Array, slump

Dagens kluring

int i;

scanf("%d", &i);

switch(i)

{

case 1: printf("1");

case 2: printf("2");

case 3: printf("3");

break;

case 4: printf("4");

break;

case 5: printf("5");

default: printf("6");

break;

}

Vad händer om

användaren matar in 2?

Vad händer om

användaren matar in 7?

Finns det någon rad som

kan avlägsnas utan att

ändra programmets

funktion?

Page 3: Array, slump

Arrays

• Deklaration och användning av array

• Array och for-loop

• Slumptal

• Array med variabel längd

• Arrayer i två dimensioner

• sizeof

• bool i c99

• c99 i Codeblocks

• Sortering

Page 4: Array, slump

Ett första exempel

int a[3];

a[0]=2;

a[1]=7;

a[2]=9;

printf("Test: %d, %d, %d",a[0],a[1],a[2]);

Resultat:

Test: 2, 7, 9

2 a

a[0] a[1] a[2]

9 7

Page 5: Array, slump

Initialisering

När en array deklareras finns en del stöd för att initialisera

den. Läs detta själv i boken.

int a[5]= {1,2,3,4,5};

int a[]= {1,2,3,4,5};

int a[5]={0}; //resulterar i {0,0,0,0,0}

Page 6: Array, slump

Arrays med for

#include <stdio.h>

#define LENGTH 5

int main(void)

{

int a[LENGTH];

int i;

for(i=0;i<LENGTH;i++)

{

a[i]=i+1;

}

for(i=0;i<LENGTH;i++)

{

printf("Pa plats: %d har vi %d\n",i,a[i]);

}

return 0;

}

Pa plats: 0 har vi 1

Pa plats: 1 har vi 2

Pa plats: 2 har vi 3

Pa plats: 3 har vi 4

Pa plats: 4 har vi 5

Page 7: Array, slump

Läsa in till och summera array

#include <stdio.h>

#define LENGTH 5

int main(void)

{

int a[LENGTH];

int i;

for(i=0;i<LENGTH;i++)

{

scanf("%d",&a[i]);

}

int sum=0;

for(i=0;i<LENGTH;i++)

{

sum = sum+a[i];

}

printf("Summan blir: %d \n",sum);

return 0;

}

Page 8: Array, slump

Slumptal

En dator kan inte generera slumptal då den är helt deterministisk, däremot kan den generera pseudo-slumptal 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 dice1 = rand()%6+1; //blir slumptal 1-6

int dice2 = rand()%6+1;

printf("du fick %d och %d",dice1, dice2);

return 0;

}

rand() beräknar nästa slumptal i serien. Resultatet blir mellan 0 och RAND_MAX

Page 9: Array, slump

Exempel med tärningsstatistik

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

int main(void)

{

int freq[13],diceResult,k;

srand(time(0));

for(k=2;k<=12;k++)

freq[k]=0;

for(k=1;k<=10000;k++)

{

diceResult=rand()%6+rand()%6+2;

freq[diceResult]++;

}

for(k=2;k<=12;k++)

printf("Antal %2d: %d. Andel: %.2f%%\n",k,freq[k],100*freq[k]/10000.);

return 0;

}

Antal 2: 318. Andel: 3.18%

Antal 3: 505. Andel: 5.05%

Antal 4: 854. Andel: 8.54%

Antal 5: 1129. Andel: 11.29%

Antal 6: 1395. Andel: 13.95%

Antal 7: 1704. Andel: 17.04%

Antal 8: 1365. Andel: 13.65%

Antal 9: 1112. Andel: 11.12%

Antal 10: 823. Andel: 8.23%

Antal 11: 516. Andel: 5.16%

Antal 12: 279. Andel: 2.79%1

Page 10: Array, slump

Arrays med variabel längd

I C89 måste en array initialiseras med en konstant så att kompilatorn kan allokera rätt storlek på minnet. Från och med C99 kan man använda en variabel när man initialiserar en array. Det gör det möjligt att initialisera en array till en storlek som beror på behovet under körning. En array kan då ha rätt storlek och vi slipper ta i för säkerhets skull. Använd gärna detta när det är praktiskt. Det finns dock en del begränsningar med array’s med variable längd. Bland annat kan de ej initialiseras. Det är alltid ok under kursen att inte använda variabel längd.

int size;

scanf(”%d”, &size);

int w[size];

Page 11: Array, slump

Matriser

#define ROW 3

#define COLUMN 4

int a[ROW][COLUMN];

int i,j;

int count=1;

for(i=0;i< ROW;i++)

{

for(j=0;j< COLUMN;j++)

{

a[i][j]=count;

count++;

}

}

Observera att det går att ha arrayer med ännu fler dimensioner!

1, 2, 3, 4

5, 6, 7, 8

9,10,11,12

Page 12: Array, slump

sizeof-operatorn

sizeof-operatorn svarar på hur många bytes en typ eller variabel är

1 byte är 8 bitar, en bit är 1 eller 0

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;

Men det är bättre att använda #define eller en variabel och det fungerar inte i

funktioner!

Page 13: Array, slump

Boolska värden i C99

C saknar en 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

Page 14: Array, slump

Sortering

Även om datorer idag används till väldigt mycket olika saker är fortfarande två av de viktigaste funktionerna att lagra data och att tillhandahålla valda delar av dessa data.

Mycket forskning har gjorts i hur detta skall göras på bästa/effektivast sätt.

Målet är att man så fort som möjligt ska kunna få tag på valda delar av lagrade data.

För att hitta rätt data behöver man söka igenom tillgänglig data.

Detta kan effektiviseras med bra sökalgoritmer och genom sortering av data i förväg.

(Allra effektivast blir det om man använder nycklar och tabeller för att organisera data – relations-databaser)

Page 15: Array, slump

Bubbelsortering

Vi ska börja med att titta på hur man kan sortera data. 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

Page 16: Array, slump

Steg 1 (14 bubblar upp)

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:

Talet till vänster är större så vi byter plats!

Nu jämför vi tal 1 och 2:

Talet till vänster är mindre så ingen åtgärd. Nu jämför vi tal 2 och 3:

Talet till vänster är större så vi byter plats:

Nu jämför vi tal 3 och 4:

Talet till vänster är större så vi byter plats:

12 8 14 9 2

8 12 14 9 2

8 12 14 9 2

8 12 14 9 2

8 12 9 14 2

8 12 9 14 2

8 12 9 2 14

Page 17: Array, slump

Resultat: Steg 1

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 arrayen utom den sista

platsen.

Page 18: Array, slump

Steg 2 (12 bubblar upp)

Jämför tal 0 och 1:

Ingen åtgärd. Nu jämför vi tal 1 och 2:

Talet till vänster är större så vi byter plats:

Nu jämför Vi tal 2 och 3:

Talet till vänster är större så vi byter plats:

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.

8 9 12 2 14

8 9 2 12 14

8 12 9 2 14

8 12 9 2 14

8 9 12 2 14

Page 19: Array, slump

Steg 3 och 4

Steg 3: Jämför tal 0 och 1:

Ingen åtgärd. Nu jämför vi tal 1 och 2:

Talet till vänster är större så vi byter plats:

Steg 4: Jämför tal 0 och 1:

Talet till vänster är större så vi byter plats:

Vi kan nu vara säkra på att alla tal är i nummerordning!

8 9 2 12 14

8 9 2 12 14

8 2 9 12 14

8 2 9 12 14

2 8 9 12 14

Page 20: Array, slump

Algoritm i pseudokod:

Sortera array f med antal element n:

För i från 0 till n – 2:

För j från 0 till n – 2 – i:

Om f[j]>f[j+1] byt plats

Den inre loopen

bubblar upp ett tal.

För varje varv bubblar

ett nytt tal upp.

Page 21: Array, slump

Algoritm i C

for(i=0;i<length-1;i++)

{

for(j=0;j<length-1-i;j++)

{

if(v[j]>v[j+1])

{

tmp=v[j];

v[j]=v[j+1];

v[j+1]=tmp;

}

}

} Varför fungerar inte:

tal[j]=tal[j+1]

tal[j+1]=tal[j]

Page 22: Array, slump

#include <stdio.h>

#define LENGTH 10

int main()

{

int v[LENGTH];

srand(1);

int i;

for(i=0;i<LENGTH;i++)

{

v[i]=rand()%20;

}

for(i=0;i<LENGTH;i++) printf("%d,",v[i]);

printf("\n");

int j,tmp;

for(i=0;i<LENGTH -1;i++)

{

for(j=0;j<LENGTH -1-i;j++)

{

if(v[j]>v[j+1])

{

tmp=v[j];

v[j]=v[j+1];

v[j+1]=tmp;

}

}

}

for(i=0;i< LENGTH;i++) printf("%d,",v[i]);

printf("\n");

}

Page 23: Array, slump

C89 / C99

1989 kan tyckas länge sen men fortfarande är C89 den mest använda C-standarden. Det är också default-inställningen i mingw. För att köra C99 behöver ni ändra inställningarna i codeblocks. Detta kan gälla även på tentan så lär er detta.

Settings -> Compiler…

I fliken Compiler settings

välj fliken Other options och i fältet skriv in:

-std=c99

tryck ok

Page 24: Array, slump

c89 c99

#include <stdio.h>

#define DIM 10

int main(void)

{

int v[DIM];

int i;

for(i=0;i<DIM;i++)

if(i%2!=0)

v[i]=1;

else

v[i]=0;

for(i=0;i<DIM;i++)

printf("%d",v[i]);

return 0;

}

#include <stdio.h>

#include <stdbool.h>

int main(void)

{

int dim=10;

bool v[dim];

for(int i=0;i<dim;i++)

if(i%2!=0)

v[i]=true;

else

v[i]=false;

for(int i=0;i<dim;i++)

printf("%d",v[i]);

return 0;

}