Programexempel från C-föreläsning 9, onsdag 17 december 2008 ============================================================ Föreläsningsplanering (preliminär) ---------------------------------- Fö 9 (idag, onsdag 17/12): funktioner Fö 10 (torsdag 18/12): funktioner, filer med stdio Fö 11 (onsdag 7/1): mer om filer med stdio Fö 12 (torsdag 8/1): felhantering, reservtid, repetition, tentauppgifter Idag ==== 1. Kort repetion av pekare 2. Fortsättning på pekare: pekare, poster och arrayer 3. Allegro-biblioteket 4. Funktioner 1. Kort repetion av pekare ========================== int heltalsvariabel; heltalsvariabel = 17; int* pekarvariabel; pekarvariabel = &heltalsvariabel; *pekarvariabel = *pekarvariabel + 1; 2. Fortsättning på pekare: pekare, poster och arrayer ===================================================== Allt på en gång: poster, pekare, arrayer (jfr: Gunnar kap 4 sid 11) ------------------------------------------------------------------- struct Motor { int cyl; double effekt; }; struct Motor m = { 4, 120 }; Pekare till struct (fortsättning) --------------------------------- struct Motor *mp; mp = &m; (*mp).cyl = 6; (*mp).effekt = 160.0; /* Inte: *mp.effekt = 160.0; */ Alternativ: mp->cyl = 6; mp->effekt = 160.0; Array av poster ("vektor av structar) -- jfr "punktuppgifterna" fö 7 -------------------------------------------------------------------- struct Motor a[5]; a[0].cyl = 8; a[0].effekt = 185; struct Motor *mp; mp = a; /* Inte: mp = &a; */ mp[1].cyl = 4; mp[1].effekt = 110; 3. Allegro-biblioteket ====================== Inlämningsuppgift 6 Boken 4. Funktioner ============= Funktioner ---------- "Funktion" i matematiken = avbildning, t. ex. y = f(x) = 2x + 3, där t. ex. värdet x=7 avbildas på y=17 "Funktion" i C: programsnutt En C-funktion kan ta emot värden (via parametrar) och returnera ett värde ("retur-värdet"). (Med olika trick kan man returnera flera värden.) Exempel på funktioner: main, printf, scanf, sqrt En ren programsnutt ------------------- time_t nu; char* nu_text; nu = time(NULL); nu_text = ctime(&nu); printf("Klockan är nu %.8s\n", nu_text + 11); Gör en funktion, och anropa den (klockan.c) ------------------------------------------- #include #include void skriv_tiden() { time_t nu; char* nu_text; nu = time(NULL); nu_text = ctime(&nu); printf("Klockan är nu %.8s\n", nu_text + 11); } int main() { skriv_tiden(); skriv_tiden(); skriv_tiden(); return 0; } /* main */ En funktion som returnerar ett värde (som rand och main) -------------------------------------------------------- int kolla_losenordet() { char s[100 + 1]; printf("Lösenord: "); fgets(s, sizeof s, stdin); if (strcmp(s, "dungeon\n") == 0) return 1; else return 0; } Alternativ ---------- int kolla_losenordet() { char s[100 + 1]; printf("Lösenord: "); fgets(s, sizeof s, stdin); return strcmp(s, "dungeon\n") == 0; } Olika anrop ----------- int main() { int ok_losen; kolla_losenordet(); if (kolla_losenordet()) printf("Rätt!\n"); else printf("Fel!\n"); ok_losen = kolla_losenordet(); if (ok_losen) printf("Rätt!\n"); else printf("Fel!\n"); return 0; } /* main */ Parametrar och argument, formella och aktuella ---------------------------------------------- Funktion: void f(int x, float y, double z) { ... } Anrop: f(3, r, sqrt(r + 2)); x, y och z: "parametrar", "formella parametrar" 3, r och sqrt(r + 2): "argument", "aktuella parametrar" Ett anrop till: f(i, 2.0, 3.0); parametrar.c ------------ #include #include void f(int x, float y, double z) { printf("x = %d\n", x); printf("y = %f\n", y); printf("z = %f\n", z); } int main() { float r; int i; r = 6.2; i = 12; f(3, r, sqrt(r + 2)); f(i, 2.0, 3.0); return 0; } /* main */ parametrar-2.c -------------- #include #include double g(int x, float y, double z) { double summan; summan = x + y + z; return summan; } int main() { float r; int i; double resultat; r = 6.2; i = 12; resultat = g(3, r, sqrt(r + 2)); printf("resultat = %f\n", resultat); printf("resultat = %f\n", g(i, 2.0, 3.0)); return 0; } /* main */ Returnera flera värden ---------------------- 1. Pekare (exempel: scanf) 2. Globala variabler (exempel: errno) 3. Poster (se nedan) Poster som argument och returnerade värden -- helt okej ------------------------------------------------------- Arrayer som argument och returnerade värden -- se upp ----------------------------------------------------- Det som skickas respektive returneras är en pekare till första elementet i arrayen! Ex: en funktion som beräknar medelvärdet av en reell vektor Mer exempel ----------- Ex 1: Funktionen "udda", som returnerar sant om talet är udda (Gunnar 2. 5-7) Ex 2: Funktionen "swap" (som inte fungerar och som fungerar)