Programexempel från C-föreläsning 9, tisdag 2 januari 2007 ========================================================== Föreläsningsplanering (preliminär) ---------------------------------- Fö 9 (idag, tisdag 2/1): funktioner Fö 10 (onsdag 3/1): funktioner, filer med stdio Fö 11 (måndag 8/1): filer med stdio Fö 12 (tisdag 8/1): felhantering, reservtid, repetition, tentauppgifter Idag: 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 */ Repetition av pekare -------------------- (Vi ritar upp allt detta som lådor och pilar.) float x, y; int i; x = -3.14; i = 12; scanf("%f", &x); float *pf; pf = &x; *pf = 2.72; y = *pf; y = sqrt(3.0 - *pf); pf = &i; /* Fel! Kompilatorn varnar. */ int *ip; ip = &i; *ip = 17; pf = &y; 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)