--*- coding: utf-8; -*-- INF2270 L?sningsforslag til ukeoppgaver uke 4 2011 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 4 #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; return s1[ix] - s2[ix]; } int strcmpu (unsigned char s1[], unsigned char s2[]) { int ix = 0; while (s1[ix]==s2[ix] && s1[ix]!=0) ++ix; return s1[ix] - s2[ix]; } int strcmps (signed char s1[], signed char s2[]) { int ix = 0; while (s1[ix]==s2[ix] && s1[ix]!=0) ++ix; return s1[ix] - s2[ix]; } 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)); } int main (void) { test("Abc", "Abcd"); test("Abc", "Abc"); test("Abcd", "Abc"); test("Ab?", "Abcd"); test("Ab?", "Abc"); test("Ab?d", "Abc"); } Oppgave 7 Som kj?ring av koden i forrige oppgave p? en av Ifis Linux-maskiner viser: strcmp("Abc", "Abcd"): -1 strcmpu("Abc", "Abcd"): -100 strcmps("Abc", "Abcd"): -100 strcmpx("Abc", "Abcd"): -100 strcmp("Abc", "Abc"): 0 strcmpu("Abc", "Abc"): 0 strcmps("Abc", "Abc"): 0 strcmpx("Abc", "Abc"): 0 strcmp("Abcd", "Abc"): 1 strcmpu("Abcd", "Abc"): 100 strcmps("Abcd", "Abc"): 100 strcmpx("Abcd", "Abc"): 100 strcmp("Ab?", "Abcd"): 1 strcmpu("Ab?", "Abcd"): 149 strcmps("Ab?", "Abcd"): -107 strcmpx("Ab?", "Abcd"): -107 strcmp("Ab?", "Abc"): 1 strcmpu("Ab?", "Abc"): 149 strcmps("Ab?", "Abc"): -107 strcmpx("Ab?", "Abc"): -107 strcmp("Ab?d", "Abc"): 1 strcmpu("Ab?d", "Abc"): 149 strcmps("Ab?d", "Abc"): -107 strcmpx("Ab?d", "Abc"): -107 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. (En annen forskjell er at standardfunksjonen strcmp gir andre svar enn v?re, men begge oppfyller kravene om <0, ==0 og >0.)