Programexempel från C-föreläsning 5, onsdag 25 november 2009 ============================================================ Programspråkens "popularitet" ----------------------------- http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html 1 Java 18.373% 2 C 17.315% 3 PHP 10.176% 4 C++ 10.002% 5 (Visual) Basic 8.171% 6 C# 5.346% 7 Python 4.672% 8 Perl 3.490% 9 JavaScript 2.916% 10 Ruby 2.404% 11 Delphi 2.127% 12 PL/SQL 0.908% 13 Objective-C 0.893% 14 SAS 0.816% 15 Pascal 0.654% 16 ABAP 0.643% 17 Lisp/Scheme 0.618% 18 MATLAB 0.611% 19 Lua 0.544% 20 D 0.543% ... 22 COBOL 0.430% 25 Fortran 0.376% 29 Ada 0.305% 32 Erlang 0.261% 36 Prolog 0.234% ... APL Algol Bourne shell C shell ML Mathematica XSLT Idiom i moderna kompilatorer (som klarar C-99 - inte Visual Studio) ------------------------------------------------------------------- for (int i = 0; i < 3; i = i + 1) gnorgle(); 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'); /* Idiomatiskt 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 */ 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); 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