Arrays (indicerade variabler) Föreläsning 4

Relevanta dokument
Arrays (indicerade variabler) Föreläsning 6

Indicerade variabler

Indexerade variabler

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

Föreläsning 9. Repetition och exempelproblem

Funktioner och programstruktur. Föreläsning 5

Loopar och datatyper. Föreläsning 3

Loopar och datatyper. Föreläsning 3

översiktskurs (5DV031)

Föreläsning 11. Strängar

Planering Programmering grundkurs HI1024 HT 2014

Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

Planering Programmering grundkurs HI1024 HT TIDAA

Föreläsning 10. Pekare (Pointers)

Planering Programmering grundkurs HI1024 HT data

Uttryck och villkor. Föreläsning 2

1,3,5,7,9,...,99. Skriv ett program som genererar en multiplikationstabell med följande utseende

HI1024 Programmering, grundkurs TEN

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Klassdeklaration. Metoddeklaration. Parameteröverföring

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Föreläsning 6. Slumptal Testa slumptal Slumptal för olika fördelningar Grafer Datastrukturen graf

Funktioner och programstruktur. Föreläsning 5

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

HI1024 Programmering, grundkurs TEN

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

HI1024 Programmering, grundkurs TEN

HI1024 Programmering, grundkurs TEN

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

HI1024 Programmering, grundkurs TEN

En kort text om programmering i C.

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

#include <stdio.h> #include <string.h>

Programmeringsteknik med C och Matlab

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Programmering i C, 7,5 hp

*Pekarvärden *Pekarvariabler & *

Föreläsning REPETITION & EXTENTA

C++ Slumptalsfunktioner + switch-satsen

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Enkla datatyper minne

Att använda pekare i. C-kod

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Att komma igång. Föreläsning 1

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

3.3 for-satsen. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 3

Programmering B med Visual C

TDIU01 - Programmering i C++, grundkurs

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

C-programmering, föreläsning 2 Jesper Wilhelmsson

Föreläsning 8: Exempel och problemlösning

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Repetition C-programmering

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Funktioner. Jan Erik Moström,

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Typkonvertering. Java versus C

Data, typ, selektion, iteration

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Introduktion C-programmering

Parameteröverföring. Exempel. Exempel. Metodkropp

Föreläsning 3. Programmering, C och programmeringsmiljö

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Föreläsning 5 Innehåll

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Objektorienterad programmering Föreläsning 10. Copyright Mahmud Al Hakim Sorteringsalgoritmer

Enkla uppgifter. Uppgift 1. Uppgift 2

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Metoder - en funktion: medel

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Visual Basic, en snabbgenomgång

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Att komma igång. Föreläsning 1

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Övning från förra gången: readword

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Uttryck och villkor. Föreläsning 2

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

[] Arrayer = Indexerad variabel

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

TDDC77 Objektorienterad Programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Transkript:

Arrays (indicerade variabler) Föreläsning 4

Dagens kluring Hitta felet (ska skriva ut 10,9,8,7,6,5,4,3,2,1): int n; for(n=10;n<0;n--) printf("%d,",n); Vad skriver detta ut? int n,m; for(n=4;n>0;n--) for(m=0;m<n;m++) printf("%d,",m);

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

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 a[0] a[1] a[2] a 2 7 9

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

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

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;

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

Exempel med tärningsstatistik #include <stdio.h> #include <stdlib.h> #include <time.h> 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 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;

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];

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

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!

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

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)

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

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: 12 8 14 9 2 Talet till vänster är större så vi byter plats! 8 12 14 9 2 Nu jämför vi tal 1 och 2: 8 12 14 9 2 Talet till vänster är mindre så ingen åtgärd. Nu jämför vi tal 2 och 3: 8 12 14 9 2 Talet till vänster är större så vi byter plats: 8 12 9 14 2 Nu jämför vi tal 3 och 4: 8 12 9 14 2 Talet till vänster är större så vi byter plats: 8 12 9 2 14

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.

Steg 2 (12 bubblar upp) Jämför tal 0 och 1: 8 12 9 2 14 Ingen åtgärd. Nu jämför vi tal 1 och 2: 8 12 9 2 14 Talet till vänster är större så vi byter plats: 8 9 12 2 14 Nu jämför Vi tal 2 och 3: 8 9 12 2 14 Talet till vänster är större så vi byter plats: 8 9 2 12 14 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.

Steg 3 och 4 Steg 3: Jämför tal 0 och 1: 8 9 2 12 14 Ingen åtgärd. Nu jämför vi tal 1 och 2: 8 9 2 12 14 Talet till vänster är större så vi byter plats: 8 2 9 12 14 Steg 4: Jämför tal 0 och 1: 8 2 9 12 14 Talet till vänster är större så vi byter plats: 2 8 9 12 14 Vi kan nu vara säkra på att alla tal är i nummerordning!

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 För varje varv bubblar ett nytt tal upp. Den inre loopen bubblar upp ett tal.

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]

#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");

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

c89 #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]); c99 #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; return 0;

Studieanvisningar F4 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, observera att vi inte gått igenom initialisering men det ingår absolut 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 (8.3 har vi inte heller gått igenom!) Gör K8 P7 Gör P9 om du hinner E-excercises, P-programming projects