Arrays (indicerade variabler) Föreläsning 6

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

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

översiktskurs (5DV031)

Föreläsning 11. Strängar

Loopar och datatyper. Föreläsning 3

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

Loopar och datatyper. Föreläsning 3

Programmering i C, 7,5 hp

Föreläsning 10. Pekare (Pointers)

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

En kort text om programmering i C.

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

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

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

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

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

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

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

Planering Programmering grundkurs HI1024 HT 2014

Klassdeklaration. Metoddeklaration. Parameteröverföring

HI1024 Programmering, grundkurs TEN

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

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

C++ Slumptalsfunktioner + switch-satsen

*Pekarvärden *Pekarvariabler & *

Uttryck och villkor. Föreläsning 2

Programmeringsteknik med C och Matlab

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

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

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

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

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

HI1024 Programmering, grundkurs TEN

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

Funktioner och programstruktur. Föreläsning 5

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

HI1024 Programmering, grundkurs TEN

Enkla datatyper minne

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

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

Enkla uppgifter. Uppgift 1. Uppgift 2

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Planering Programmering grundkurs HI1024 HT TIDAA

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

Data, typ, selektion, iteration

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

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

Att använda pekare i. C-kod

Uttryck och villkor. Föreläsning 2

HI1024 Programmering, grundkurs TEN

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

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

Planering Programmering grundkurs HI1024 HT data

Övningsuppgifter till föreläsning 2 Variabler och uttryck

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

Programmering i C. Christer Sandberg, Gunilla Eken, Stefan Bygde Olof Andersson Linus Källberg Caroline Uppsäll Johan Hägg

Programmering Grundkurs (HI1900) Teoridel

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

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Repetition C-programmering

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

Föreläsning REPETITION & EXTENTA

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

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

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Detta är andra problemlösningsföreläsningen, vi diskuterar problemen ur Problem II.

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

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.

HI1024 Programmering, grundkurs TEN

TDIU01 - Programmering i C++, grundkurs

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

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

Introduktion C-programmering

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

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

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

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

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

Funktioner. Jan Erik Moström,

Metoder - en funktion: medel

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

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

C++-programmets beståndsdelar

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

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Programmering B med Visual C

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

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

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

[] Arrayer = Indexerad variabel

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

Föreläsning 6 pekare och pekare tillsammans med arrayer

TDIU01 - Programmering i C++, grundkurs

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Inledande programmering med C# (1DV402) Summera med while"-satsen

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

Transkript:

Arrays (indicerade variabler) Föreläsning 6

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?

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> int main(void) 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 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;