--*- 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?