Programexempel från C-föreläsning 4, torsdag 19 november 2009 ============================================================= sqrt-3.c -------- #include #include int main(void) { float x; printf("Tal: "); scanf("%f", &x); while (x != 0.0) { if (x >= 0.0) printf("%f\n", sqrt(x)); else { printf("Kan inte dra roten\n"); printf("ur ett negativt tal.\n"); } scanf("%f", &x); } // while return 0; } // main Körexempel ---------- linux> gcc -W -Wall -Werror sqrt-3.c -o sqrt-3 -lm linux> ./sqrt-3 Tal: 100 10.000000 -3.3 Kan inte dra roten ur ett negativt tal. 14 3.741657 0 linux> ./sqrt-3 Tal: Kalle 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 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(); 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