Programexempel från C-föreläsning 4, torsdag 20 november 2008 ============================================================= 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(); Idiom i moderna kompilatorer (som klarar C-99 - INTE Visual Studio) -------------------------------------------------------------------å for (int i = 0; i < 3; i = i + 1) gnorgle(); Men se upp: de här två gör inte samma sak! ------------------------------------------ for (i = 1; i <= 3; i = i + 1) printf("%d\n", i); for (i = 0; i < 3; i = i + 1) printf("%d\n", i); Några olika sätt att skriva ut tio asterisker på en rad ------------------------------------------------------- #include int main() { int i; i = 1; while (i <= 10) { putchar('*'); i = i + 1; } putchar('\n'); for (i = 1; i <= 10; i = i + 1) putchar('*'); putchar('\n'); for (i = 0; i < 10; i = i + 1) putchar('*'); putchar('\n'); for (i = 0; i < 10; ++i) putchar('*'); putchar('\n'); /* Idiomatikst rätt sätt i C-99 */ for (int i = 0; i < 10; ++i) putchar('*'); putchar('\n'); int r; for (r = 0; r < 10; ++r) putchar('*'); putchar('\n'); return 0; } /* main */ 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 Logiska uttryck --------------- if (...) ... while (...) ... 0 = falskt 1 (och allt annat) = sant a b a&&b a||b !a - - ---- ---- -- 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 0 Intervall --------- i intervallet eller utanför? lägre gränsen och övre gränsen (enligt Gunnars föreläsningsanteckningar kap 2 s 7) gissaspel-2.c ------------- // Rätt #include #include #include 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) { printf("Nix!\n"); exit(EXIT_FAILURE); } srand(time(NULL)); int tal = min + rand() % (max - min + 1); int gissning; printf("Gissa ett tal mellan %d och %d: ", min, max); scanf("%d", &gissning); while (gissning != tal) { if (gissning < min || gissning > max) printf("Inte tillåtet!\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); } printf("Rätt svar!\n"); return EXIT_SUCCESS; } // main gissaspel-3.c ------------- // Rätt, med en do-while-loop #include #include #include 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) { printf("Nix!\n"); exit(EXIT_FAILURE); } srand(time(NULL)); int tal = min + rand() % (max - min + 1); int gissning; do { printf("Gissa ett tal mellan %d och %d: ", min, max); scanf("%d", &gissning); if (gissning < min || gissning > max) printf("Inte tillåtet!\n"); else if (gissning == tal) printf("Rätt svar!\n"); else if (gissning < tal) printf("För litet.\n"); else if (gissning > tal) printf("För stort.\n"); } while (gissning != tal); return EXIT_SUCCESS; } // main Utvidgningar ------------ 1. Spel åt andra hållet - programmet gissar 2. Elakt spel som ändrar sig medan man spelar 3. ...men inte så det märks