--*- coding: utf-8; -*-- INF2270 L?sningsforslag til ukeoppgaver uke 4 2014 Oppgave 2 #include #include int main(void) { int v, i, sum, max; FILE *f = fopen("/hom/inf2270/programmer/100.tall", "r"); fscanf(f, "%d", &v); max = sum = v; for (i = 2; i <= 100; ++i) { fscanf(f, "%d", &v); sum += v; if (v > max) max = v; } printf("%d %d\n", sum, max); } Oppgave 3 #include #include int main(void) { int t; t = (time(NULL)/3600+1)%24; if (t>=6 && t<=9) { printf("God morgen, alle sammen!\n"); } else if (t>=10 && t<=17) { printf("God dag, alle sammen!\n"); } else if (t>=18 && t<=21) { printf("God kveld, alle sammen!\n"); } else { printf("God natt, alle sammen!\n"); } printf("Klokken er %d.\n", t); } Oppgave 4 #include int hexval (unsigned char c) { if (c <= '9') return c - '0'; if (c <= 'F') return c - 'A' + 10; return c - 'a' + 10; } /* Ogs? vektorer kan initialiseres! */ unsigned char ca[5] = { '0', '4', 'A', 'b', 'f' }; int main (void) { int i; for (i = 0; i < 5; ++i) printf("hexval('%c') gir %d\n", ca[i], hexval(ca[i])); return 0; } Oppgave 5 #include int isspacex (unsigned char c) { return (c==' ' || c=='\n' || c=='\t'); } unsigned char ctab[5] = { 0, 9, 10, 32, 33}; int main (void) { int i; for (i = 0; i < 5; ++i) printf("isspace(%d) gir %d\n", ctab[i], isspacex(ctab[i])); return 0; } Oppgave 6 #include #include int strcmpx (char s1[], char s2[]) { int ix = 0; while (s1[ix]==s2[ix] && s1[ix]!=0) ++ix; if (s1[ix] < s2[ix]) return -1; if (s1[ix] == s2[ix]) return 0; return 1; } int strcmpu (unsigned char s1[], unsigned char s2[]) { int ix = 0; while (s1[ix]==s2[ix] && s1[ix]!=0) ++ix; if (s1[ix] < s2[ix]) return -1; if (s1[ix] == s2[ix]) return 0; return 1; } int strcmps (signed char s1[], signed char s2[]) { int ix = 0; while (s1[ix]==s2[ix] && s1[ix]!=0) ++ix; if (s1[ix] < s2[ix]) return -1; if (s1[ix] == s2[ix]) return 0; return 1; } void test (char *s1, char *s2) { printf("strcmp(\"%s\", \"%s\"): %d\n", s1, s2, strcmp((unsigned char*)s1,(unsigned char*)s2)); printf("strcmpu(\"%s\", \"%s\"): %d\n", s1, s2, strcmpu((unsigned char*)s1,(unsigned char*)s2)); printf("strcmps(\"%s\", \"%s\"): %d\n", s1, s2, strcmps((signed char*)s1,(signed char *)s2)); printf("strcmpx(\"%s\", \"%s\"): %d\n", s1, s2, strcmpx(s1,s2)); printf("\n"); } int main (void) { test("Abc", "Abcd"); test("Abc", "Abc"); test("Abcd", "Abc"); test("Ab?", "Abcd"); } Oppgave 7 Som kj?ring av koden i forrige oppgave p? en av Ifis Linux-maskiner viser: strcmp("Abc", "Abcd"): -100 strcmpu("Abc", "Abcd"): -1 strcmps("Abc", "Abcd"): -1 strcmpx("Abc", "Abcd"): -1 strcmp("Abc", "Abc"): 0 strcmpu("Abc", "Abc"): 0 strcmps("Abc", "Abc"): 0 strcmpx("Abc", "Abc"): 0 strcmp("Abcd", "Abc"): 100 strcmpu("Abcd", "Abc"): 1 strcmps("Abcd", "Abc"): 1 strcmpx("Abcd", "Abc"): 1 strcmp("Ab?", "Abcd"): 149 strcmpu("Ab?", "Abcd"): 1 strcmps("Ab?", "Abcd"): -1 strcmpx("Ab?", "Abcd"): -1 blir tegn med representasjon >=128 behandlet ulikt. Grunnen er at de oppfattes som negative tall n?r datatypen er ?signed char?. Vi ser ogs? at bare ?char? er det samme som ?signed char? for denne kompilatoren. Ekstrasp?rsm?l: Hva kan grunnen v?re til at standardversjonen av strcmp returnerer s? rare (men lovlige) tall som -100, 100 og 149?