--*- coding: utf-8; -*-- INF2270 L?sningsforslag til ukeoppgaver uke 4 2013 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"): -1 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"): 1 strcmpu("Abcd", "Abc"): 1 strcmps("Abcd", "Abc"): 1 strcmpx("Abcd", "Abc"): 1 strcmp("Ab?", "Abcd"): 1 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.