Grundläggande programmeringsteknik Arrayer Kapitel 6 Grundläggande programmeringsteknik Ett problem • Hur sparas data … • T.ex. när man vill spara resultaten i en tävling • med 3 deltagare: int resultat1; int resultat2; int resultat3; • Håller detta för 10, 100 eller ett okänt antal? HT2012 thomasj, marie, [email protected] F4-2 Grundläggande programmeringsteknik Lösningen • Deklarera utrymme för många variabler i en enda deklaration • En array är en sekvens av värden • N element indexeras med 0 till N-1 • Exempel: 10 element 0 resultat HT2012 1 2 3 4 5 6 7 8 9 79 87 94 82 67 98 87 81 74 91 thomasj, marie, [email protected] F4-3 Grundläggande programmeringsteknik Fält och hakparanteser • Deklaration typ variabelNamn[storlek]; • Alla värden har samma typ • Storleken måste vara ett positivt heltal • Åtkomst av element variabelNamn[index] // index >= 0 HT2012 && index < storlek thomasj, marie, [email protected] F4-4 Grundläggande programmeringsteknik Indexerade variabler • Enklare hantering av många värden float sum[15]; • Numreras från 0 till storlek - 1 • Enskilda element nås med index sum[0] = 14.2; • Kan användas som vilket värde som helst. sum[0] = sum[1] + 10; HT2012 thomasj, marie, [email protected] F4-5 Grundläggande programmeringsteknik Arrayer i minnet int resultat[10]; resultat[0] = 17; resultat[1] = 12; resultat[9] = 25; Resultat[0] 17 Resultat[1] 12 Resultat[2] Resultat[3] Resultat[4] Resultat[5] resultat[10] = 50; Fel ! utanför arrayen Resultat[6] Resultat[7] Resultat[8] Resultat[9] HT2012 thomasj, marie, [email protected] 25 F4-6 Grundläggande programmeringsteknik Initialisera fält med listor • Hela fältet kan initialiseras vid deklarationen • Endast vid deklarationen • Antalet element i listan anger storleken int enheter[] = {147, 323, 89, 933, 540, 269, 97}; char kursNiva[] = {'A', 'B', 'C', 'D'}; HT2012 thomasj, marie, [email protected] F4-7 Grundläggande programmeringsteknik Initialisera fält med listor • Om listan har färre element än deklarerad storlek: …fylls resten ut med nollor int udda[10] = {1, 3, 5, 7}; udda HT2012 0 1 2 3 4 5 6 7 8 9 1 3 5 7 0 0 0 0 0 0 thomasj, marie, [email protected] F4-8 Grundläggande programmeringsteknik Exempel #include <stdio.h> #include <stdlib.h> printf("Talen i omvänd ordning\n"); printf("Tal 10: %d\n",s10); printf("Tal 9: %d\n",s9); printf("Tal 8: %d\n",s8); printf("Tal 7: %d\n",s7); printf("Tal 6: %d\n",s6); printf("Tal 5: %d\n",s5); printf("Tal 4: %d\n",s4); printf("Tal 3: %d\n",s3); printf("Tal 2: %d\n",s2); printf("Tal 1: %d\n",s1); int main(void){ int s1,s2,s3,s4,s5; int s6,s7,s8,s9,s10; s1=s2=s3=s4=s5=0; s6=s7=s8=s9=s10=0; printf("Mata in 10 tal\n"); scanf("%d", &s1); scanf("%d", &s2); scanf("%d", &s3); scanf("%d", &s4); scanf("%d", &s5); scanf("%d", &s6); scanf("%d", &s7); scanf("%d", &s8); scanf("%d", &s9); scanf("%d", &s10); HT2012 return 0; } thomasj, marie, [email protected] F4-9 Grundläggande programmeringsteknik Enklare lösning #include <stdio.h> #include <stdlib.h> printf("Talen i omvänd ordning\n"); int main(void) { int s[10] = {0}; int i; for (i = 9; i >= 0; i--) { printf("Tal %2d: %d\n", i + 1, s[i]); } printf("Mata in 10 tal\n"); return 0; for (i = 0; i < 10; i++) { scanf("%d", &s[i]); } HT2012 } thomasj, marie, [email protected] F4-10 Grundläggande programmeringsteknik Testkörning HT2012 thomasj, marie, [email protected] F4-11 Grundläggande programmeringsteknik Tillämpningar • Listor av alla slag • Spelplaner • Sortering (se Bubblesort Ex.6.8!) • Sökning HT2012 thomasj, marie, [email protected] F4-12 Grundläggande programmeringsteknik Indexkontroll • Väl skapat är fältets storlek fixt • Programmerarens ansvar att index refererar till existerande element – Index måste vara i intervallet 0…storlek-1 • Index kontrolleras inte under körning! – Man kan nå minnesadresser utanför arrayen HT2012 thomasj, marie, [email protected] F4-13 Grundläggande programmeringsteknik Exempel #include <stdio.h> #include <stdlib.h> max = tal[0]; // Varför ? min = tal[0]; int main(void) { int tal[10]; int i, max, min; for(i = 0; i < 1000; i++) // Obs ! { if(tal[i] > max) max = tal[i]; if(tal[i] < min) min = tal[i]; } printf("Mata in 10 tal\n"); for (i = 0; i < 10; i++) { scanf("%d", &tal[i]); } HT2012 printf("Största talet: %d\n",max); printf("Minsta talet : %d\n",min); return 0; } thomasj, marie, [email protected] F4-14