Programexempel från C-föreläsning 6, torsdag 26 november 2009 ============================================================= Kom ihåg: 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 Kom ihåg: Intervall ------------------- i intervallet eller utanför? lägre gränsen och övre gränsen (enligt Gunnars föreläsningsanteckningar kap 2 s 7) Några korrekta loopar som skriver 10 asterisker: ok-loopar.c (oh) ----------------------------------------------------------------- #include #include int main(void) { int i; i = 0; while (i < 10) { printf("*"); ++i; } printf("\n"); i = 0; while (i < 10) { putchar('*'); ++i; } putchar('\n'); int r = 0; while (r < 10) { printf("*"); ++r; } printf("\n"); i = 0; while (i < 10) { putchar('*'); i = i + 1; } putchar('\n'); i = 0; while (i++ < 10) putchar('*'); putchar('\n'); i = 0; do putchar('*'); while (++i < 10); 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'); return EXIT_SUCCESS; } /* main */ Loopar som skriver 10 asterisker - men vilka är rätt? loopar.c (oh) ------------------------------------------------------------------- #include #include int main(void) { int i; i = 0; while (i < 10) { putchar('*'); i++; } putchar('\n'); int antal_asterisker_som_vi_skrivit_hittills = 0; while (antal_asterisker_som_vi_skrivit_hittills < 10) { putchar('*'); antal_asterisker_som_vi_skrivit_hittills++; } putchar('\n'); i = 1; while (i <= 10) { putchar('*'); i++; } putchar('\n'); i = 10; while (i >= 0) { putchar('*'); i--; } putchar('\n'); i = 100; while (i >= 91) { putchar('\n'); i--; } putchar('*'); i = 0; while (++i <= 10) putchar('*'); putchar('\n'); i = 0; do putchar('*'); while (i++ < 10); putchar('\n'); for (i = 1; i < 11; ++i) putchar('*'); putchar('\n'); return EXIT_SUCCESS; } /* main */ En loop med extra tilldelningar av loop-variabeln ------------------------------------------------- int i; for (i = 0; i < 10; ++i) { printf("i = %d\n", i); if (i % 3 == 0) i++; } En loop med mer än en styrvariabel ---------------------------------- int min, max; double mitten; min = 0; max = 10; while (min <= max) { mitten = (min + max) / 2.0; printf("min = %d, max = %d, mitten = %.2f\n", min, max, mitten); if (min % 2 == 0) max -= 2; min++; } Bygg ett heltal av siffror (Gunnars kap 3 sid 2): Körexempel ------------------------------------------------------------ Ge en rad med tecken: 12kh7jsdhsdh8ekjfkjeflkj------77 Siffrorna bildar talet 127877. Bygg ett heltal av siffror (Gunnars kap 3 sid 2): tecken-1.c ------------------------------------------------------------ #include #include int main(void) { int tal = 0; int tecken; printf("Ge en rad med tecken: "); tecken = getchar(); while (tecken != '\n') { if (tecken >= '0' && tecken <= '9') { tal = tal * 10 + tecken - '0'; } tecken = getchar(); } printf("Siffrorna bildar talet %d.\n", tal); return EXIT_SUCCESS; } /* main */ tecken-2.c ---------- #include #include #include int main(void) { int tal = 0; int tecken; printf("Ge en rad med tecken: "); while ((tecken = getchar()) != '\n') { if (isdigit(tecken)) { tal = tal * 10 + tecken - '0'; } } printf("Siffrorna bildar talet %d.\n", tal); return EXIT_SUCCESS; } /* main */ if-satser.c ----------- #include int main(void) { char val; do { printf("R = Read Data\n"); printf("W = Read Data\n"); printf("Q = Quit\n"); printf("Choose: "); scanf("%c", &val); getchar(); if (val == 'R' || val == 'r') { /* Läs data från en fil */ } else if (val == 'W' || val == 'w') { /* Skriv data till filen */ } else if (val == 'Q' || val == 'q') { printf("Hej då!\n"); } else { printf("Ledsen error.\n"); } } while (!(val == 'Q' || val == 'q')); return 0; } switch-sats.c ------------- #include int main(void) { char val; do { printf("R = Read Data\n"); printf("W = Read Data\n"); printf("Q = Quit\n"); printf("Choose: "); scanf("%c", &val); getchar(); switch (val) { case 'R': case 'r': /* Läs data från en fil */ break; case 'W': case 'w': /* Skriv data till filen */ break; case 'Q': case 'q': printf("Hej då!\n"); break; default: printf("Ledsen error.\n"); break; } } while (!(val == 'Q' || val == 'q')); return 0; } Nästa gång: sammansatta datatyper, array, struct, strängar