Programmeringsteknisk översiktskurs (5DV031) Föreläsning 5
Innehåll Indexerade variabler Arrayer, sortering Läsanvisningar: Kapitel 6.1-6.3
Ett problem Hur sparas data T.ex. när man vill spara resultaten i en tävling med 3 deltagare: int res1; int res2; int res3; Håller detta för 10, 100 eller ett okänt antal? 3
Lösningen Deklarera utrymme för många variabler i en enda deklaration Exempel: int res[10]; En array är en sekvens av värden N element indexeras med 0 till N-1 Exempel: 0 1 2 3 4 5 6 7 8 9 res 79 87 94 82 67 98 87 81 74 91
Fält och hakparanteser Deklaration typ variabelnamn[storlek]; Alla värden har samma typ Storleken måste vara ett positivt heltal och känd vid kompileringen Åtkomst av element variabelnamn[index] // index >= 0 && index < storlek
#include <stdio.h> #include <windows.h> int main(void) { int a[8],k; } a[1]=4; a[2]=a[1]-1; a[3]=a[1]-a[2]; k=4; a[k]=2*a[k-1]; a[k+1]=a[k-2]+a[k]; a[6]=a[a[2]]; a[a[1]+a[2]]=a[a[5]-a[4]]; a[a[a[6]]]++; for(k=1;k<=7;k++) printf("a[%d] = %d\n",k,a[k]); system("pause"); return 0; Exempel 6.2
#include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h> int main(void){ int s2,s3,s4,s5,s6,s7,s8; int s9,s10,s11,s12,k,kast; s2=s3=s4=s5=s6=s7=0; s8=s9=s10=s11=s12=0; srand(time(0)); for(k=1;k<=10000;k++){ } kast=rand()%6+1+rand()%6+1; if (kast==2) s2++; if (kast==3) s3++; if (kast==4) s4++; if (kast==5) s5++; if (kast==6) s6++; if (kast==7) s7++; if (kast==8) s8++; if (kast==9) s9++; if (kast==10) s10++; if (kast==11) s11++; if (kast==12) s12++; printf("antal 2: %d\n",s2); printf("antal 3: %d\n",s3); printf("antal 4: %d\n",s4); printf("antal 5: %d\n",s5); printf("antal 6: %d\n",s6); printf("antal 7: Exempel %d\n",s7); 6.3 printf("antal
#include <stdio.h> #include <windows.h> #include <stdlib.h> #include <time.h> int main(void){ int s[13],kast,k; } srand(time(0)); for(k=2;k<=12;k++) s[k]=0; for(k=1;k<=10000;k++){ kast=rand()%6+rand()%6+2; s[kast]++; } for(k=2;k<=12;k++) printf("antal %2d: %d\n",k,s[k]); system("pause"); return 0; Exempel 6.4 Varför s[13]?
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'};
Initialisera fält med listor Om listan har färre element än deklarerad storlek: int udda[10] = {1, 3, 5, 7}; fylls resten ut med nollor 0 1 2 3 4 5 6 7 8 9 udda 1 3 5 7 0 0 0 0 0 0
Exempel float temps[] = {1, 2, 3, 4}; #define MAX_A 8 int diverse[max_a]; int jamna[max_a] = {2, 4, 6, 8}; const int MAX_ANTAL = 8; float res[max_antal]; int udda[max_antal] = {1,3,5,7,9};
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
Tillämpningar Listor av alla slag Spelplaner Sortering Sökning
Sortering Det finns många algoritmer (planer) för sortering. 29(!) olika algoritmer finns på sidan http://en.wikipedia.org/wiki/sorting_algorithm Hur gör ni när ni sorterar talen 45.0, 34.5, 23.7, 51.9, 45.0, 19.7
Problem: Skriv ett program som arbetar med en kortlek. En kortlek innehåller 13 kort (ess [1], två, tre,..., tio, knekt [11], dam [12], kung [13]) i var och en av fyra färger (klöver, hjärter, ruter och spader). Genom att bestämma någon lämplig numrering av korten kan varje kort identifieras som ett heltal mellan 0 och 51. Programmet ska slumpa ut en pokerhand (5 olika kort) och skriva ut dem på skärmen. Exempel: H2, SD, K8, R2, SE