Agenda Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer Övningar nu och då 1
Motivering I de flesta problem ingår att hantera multipla data I de problem vi arbetat med hittills har det gått att utföra hela beräkningsarbetet successivt (vartefter värden matas in av användaren) Ofta behöver man göra fler än en beräkning på hela datamängden Med nuvarande kunskap skulle det bli: int a1,a2,a3,a4,a5,..., a100; scanf( %d,&a1); scanf( %d,&a2);...??? 2
Motivering Men det blir väldigt klumpig kod om man t.ex. behöver undersöka om alla talen är lika ett annat tal: if (a1 == x).. if (a2 == x).. if (a3 == x).. I C finns en konstruktion som brukar kallas array. Den innebär att man sätter ett namn på flera dataplatser, ex: int a[100]; Deklarationen leder till att plats för 100 int skapas då programmet kör. Namnet är a. 3
Deklaration Generellt: en array deklareras som typ namn[uttryck]; Den skapar under körning plats för så många värden av typen typ som uttryck beräknas till. Det minne som reserveras för arrayen är sammanhängande För att komma åt data i arrayen använder man namn namn:... 4
Åtkomst Odefinierade värden efter deklaration. Antag t.ex. deklarationen float pressure[78]; Man kan välja ut ett element i arrayen genom att använda namn och [], t.ex. pressure[2] Tilldelning: pressure[2] = 42; Användning i uttryck, ex: angle = pressure[2] / 100; Elementen numreras från 0: pressure: 0 1 2 77 42... 5
Deklaration vs åtkomst Observera! float pressure[78]; Och pressure[2] = 42; Samma [] används både i deklarationen och tilldelningen. Uttrycket mellan [] betyder dock helt olika saker: I deklaration: Totala antalet element i arrayen I åtkomsten: Ett speciellt element väljs ut Det är av yttersta vikt att du lär dig skillnaden mellan dessa två användningar av []!! 6
Variabel indexering Den stora poängen med arrayer är att indexera dem med en variabel. Ex. int main(void) { float sum=0, pressure[50]; int i; printf( Skriv in 10 tal ); for (i=0; i<10; i=i+1) scanf( %f, &pressure[i]);... for (i=0; i<10; i=i+1) sum = sum + pressure[i];... printf( %d\n, sum); return 0; } 7
Variabelt antal element int main(void) { float sum=0, pressure[50]; int i, n; printf( Hur många tal: ); scanf( %d, &n); for (i=0; i<n; i=i+1) scanf( %f, &pressure[i]);... for (i=0; i<n; i=i+1) sum = sum + pressure[i];... printf( %d\n, sum); return 0; } OBS! Du måste själv hålla reda på det aktuella antalet (variabeln n) och största möjliga antal (50). 8
Övning Koden till detta exempel finns på hemsidan (exempel 5). Lägg till kod före summeringen som gör följande: För varje element som är negativt ska elementet som finns 3 platser före ökas med 1. 9
Makron Kompileringen sker egentligen i två oberoende steg: preprocessning den faktiska kompileringen Preprocessorn sköter (t.ex.) #include och makroexansion #include kopierar in innehållet i angiven fil i din c-fil makroexpansion är en ren textredigering som görs i din C-fil Makroexempel: #define MAX_ANTAL 50 Definierar ett makro med namnet MAX_ANTAL och dess värde till 50 Leder till att varje förekomst av en text MAX_ANTAL i din C-kod byts mot texten 50. 10
Makron användning med arrayer #define MAX_ANTAL 50 int main(void) { float sum=0, pressure[max_antal]; int i, n; printf( Hur många tal: ); } scanf( %d, &n); if (n > MAX_ANTAL)...?? for (i=0; i<n; i=i+1) scanf( %f, &pressure[i]);... for (i=0; i<n; i=i+1) sum = sum + pressure[i];... printf( %d\n, sum); return 0; Övning: Skriv färdigt denna test i din kod på lämpligt sätt 11
Flerdimensionella arrayer Ibland kan man behöva arrayer med flera dimensioner. En tvådimensionell array kan liknas vid en tabell. Ex: int main(void) { int chess_board[8][8], i, j;... if (chess_board[i][j] == KING) give_up();... } return 0; 12
Flerdimensionella arrayer Ibland kan man behöva arrayer med flera dimensioner. En tvådimensionell array kan liknas vid en tabell. Ex: int main(void) { int chess_board[8][8], i, j;... for (i=0; i<8; i++) for (j=0; j<8; j++) Skapar under körning plats för 64 st int if (chess_board[i][j] == KING) threaten_king(); return 0;} 13
Initiering i deklaration Arrayer kan initieras med data inom {}, ex: int array[100]={13, 46, 19, 32}; Oinitierade element blir 0, trick för att 0-ställa alla element: int array[100]={}; Flerdimensionella: {} för varje delarray : int matrix[2][3]={{4, 7, 11}, { 3, 4, 199}}; Endast möjligt i deklarationen Kan aldrig göra operationer på hela arrayer: int array[100]={13, 46, 19, 32}, other[]; other = array; 14
Övning Utgå från exempel 6 på hemsidan. Lägg till kod som Deklarerar en till 2-dim array (oinitierad). Tilldelar den transponatet av arrayen A. Visar att det är korrekt genom att också skriva ut den nya En transponerad matris är en där kolumner och rader byter plats, ex. a b c d e f T = a d b e c f 15
Textsträngar En textsträng är en sekvens av teckenkoder avslutad med teckenkoden 0 (heltalsvärdet 0) Konstantsträngar har vi mött i scanf och printf, ex printf( Summan blev %d, sum); Konstantsträngen är automatiskt avslutad med 0. Strängar kan lagras i arrayer av typen char Kan initieras i deklarationen: char format_string[100] = Summan blev %d ; char arrayer utan [] har samma typ som konstantsträngar: printf(format_string, sum); Strängvärda objekt har konverteringskod %s char name[100] = Anna ; printf("hon heter %s i förnamn\n", name); 16
Textsträngar En textsträng är en sekvens av teckenkoder avslutad med teckenkoden 0 (heltalsvärdet 0) Konstantsträngar har vi mött i scanf och printf, ex printf( Summan blev %d, sum); Konstantsträngen är automatiskt avslutad med 0. Strängar kan lagras i arrayer av typen char Kan initieras i deklarationen: char format_string[100] = Summan blev %d ; char arrayer utan [] har samma typ som konstantsträngar: printf(format_string, sum); Obs! Här anges inget index Strängvärda objekt har konverteringskod %s char name[100] = Anna ; printf("hon heter %s i förnamn\n", name); 17
Textsträngar (forts.) Alternativ utskrift: char name[42]= Eugen ; puts(name); Alternativ inmatning: char name[42]; gets(stdin, 42, name); 18
Funktioner och arrayer Exempel: Ett program som bara läsa in värden från användaren och sedan skriver ut. En funktion för vardera uppgift 19
Funktioner och arrayer void read_array(int A[87], int n) { int i; for (i=0; i<n; i++) scanf( %d, &A[i]); } void print_array(int A[87], int n) { int i; for (i=0; i<n; i++) printf( %d\n, A[i]); } int main(void) { int A[87]; read_array(a, 5); print_array(a, 5); return 0; } 20
Övning Fungerar verkligen exempel 7? - Testa! Väg detta mot påståendet att det är kopior av de aktuella argumenten som skickas vid funktionsanrop. 21
Array som returvärde? Nej! Arrayer kan inte returneras. Det finns inte heller något behov: Om man vill returnera en mängd av data från en funktion så ser man till att den tar en array som parameter 22
Sammanfattning Arrayer underlättar en bra modularisering (uppdelning i funktioner) Skillnad mot enkla variabler: en array-parameter är en pekare (data delas med anroparen) Inga operationer på hela arrayer Strängar lagras i arrayer 23