Programexempel från C-föreläsning 3, onsdag 13 december 2006 ============================================================ Kom ihåg -------- 1. Labbanmälan i Studentbasen 2. Studieteknik (Läs! Tänk!! Öva!!!) 3. Vi hinner inte gå igenom allt på föreläsningarna 4. Inget "jullov", bara "självstudier" Demonstration ------------- 1. Exempelprogram i GCC: hello, sqrt-3.c 2. Exempelprogram i Visual Studio: hello a) getch b) åäö-problem Flödesscheman och strukturdiagram --------------------------------- Flödesscheman: rutor, sneda rutor och pilar Strukturdiagram: sekvens (rutor), val (o, o, -), repetition (*) Ex: sqrt-3.c från förra föreläsningen In- och utmatning ----------------- getchar putchar scanf: %d %f %c printf: %d %f %c Ett C-program med enkel in- och utmatning ----------------------------------------- #include #include int main(void) { int i; char c; float f; printf("Skriv: "); scanf("%d%c%f", &i, &c, &f); printf("i = %d, c = %c, f = %f\n", i, c, f); return EXIT_SUCCESS; } /* main */ Körexempel ---------- Skriv: 345x4.78 i = 345, c = x, f = 4.780000 Ett annat C-program med enkel in- och utmatning (visa på OH) ------------------------------------------------------------ #include #include int main ( void ) { int heltalet; float flyttalet; char tecknet; printf("Skriv ett heltal, ett flyttal och ett tecken:\n"); scanf("%d", &heltalet); scanf("%f", &flyttalet); scanf("%c", &tecknet); printf("Heltalet var %d, flyttalet %.2f och tecknet %c.\n", heltalet, flyttalet, tecknet); return EXIT_SUCCESS; } /* main */ Körexempel (visa på OH) ----------------------- Skriv ett heltal, ett flyttal och ett tecken: 27 3.2 x Heltalet var 27, flyttalet 3.20 och tecknet . Några utskrifter (visa på OH) ----------------------------- #include #include #include int main ( void ) { unsigned long int i; i = 120; printf("Talet är %-7.4lu.\n"); printf("INT_MAX är %d.\n", INT_MAX); printf("FILENAME_MAX är %d tecken.\n", FILENAME_MAX); return EXIT_SUCCESS; } /* main */ Körexempel (visa på OH) ----------------------- Talet är 0124 . INT_MAX är 2147483647. FILENAME_MAX är 1024 tecken. Aritmetiska uttryck ------------------- float z, R, w, L, C; ... z = sqrt((pow(R, 2) + pow(w*L - 1/(w*C), 2)); Heltals- och flyttalsdivision, heltalsrest ------------------------------------------ 5 / 3 5.0 / 3.0 x / y 5.0 / 3 5 % 3 for-loop -------- int i; ... for (i = 1; i <= 3; i = i + 1) gnorgle(); Motsvarar while-loopen: ----------------------- int i; ... i = 1; while (i <= 3) { gnorgle(); i = i + 1; } Idiom ----- int i; ... for (i = 0; i < 3; i = i + 1) gnorgle(); Utskrift: 5 rader med 10 stjärnor på varje ------------------------------------------ ********** ********** ********** ********** ********** Nästlade loopar --------------- #include #include int main ( void ) { int radnummer, kolumnnummer; for (radnummer = 0; radnummer < 5; ++radnummer) { for (kolumnnummer = 0; kolumnnummer < 10; ++kolumnnummer) printf("*"); printf("\n"); } return EXIT_SUCCESS; } /* main */ Gissaspel: dialogen med användaren ---------------------------------- Gissaspel! Ange minsta tillåtna tal: 100 Ange största tillåtna tal: 200 Gissa ett tal mellan 100 och 200: 347 Inte tillåtet! Gissa ett tal mellan 100 och 200: 150 För litet. Gissa ett tal mellan 100 och 200: 175 För stort. Gissa ett tal mellan 100 och 200: 160 För litet. Gissa ett tal mellan 100 och 200: 170 För litet. Gissa ett tal mellan 100 och 200: 173 Rätt svar! Pseudokoden ----------- 1. läs in gränser 2. slumpa fram tal 3. så länge som användaren inte gissat talet: a. låt användaren gissa b. kolla om det var otillåtet/rätt/för litet/för stort gissaspel-1.c ------------- // Fel... #include #include #include // Glöm först int main(void) { printf("Gissaspel!\n"); printf("Ange minsta tillåtna tal: "); int min; scanf("%d", &min); printf("Ange största tillåtna tal: "); int max; scanf("%d", &max); if (min > max) { // Villkoret... printf("Nix!\n"); exit(EXIT_FAILURE); // exit och EXIT_FAILURE... } srand(time(NULL)); // Glöm först! int tal = min + rand() % (max - min + 1); // Komplicerat, med %... int gissning; printf("Gissa ett tal mellan %d och %d: ", min, max); scanf("%d", &gissning); while (gissning != tal) { if (gissning < min || gissning > max) // Komplicerat, med ||, intervall... printf("Inte tillåtet!\n"); else if (gissning == tal) // else if... printf("Rätt svar!\n"); else if (gissning < tal) printf("För litet.\n"); else if (gissning > tal) printf("För stort.\n"); printf("Gissa ett tal mellan %d och %d: ", min, max); scanf("%d", &gissning); } return EXIT_SUCCESS; } // main Nästa gång: logiska uttryck, intervall...