INF2270 Lųsningsforslag til ukeoppgaver uke 4 2008 Oppgave 1 #include int main (void) { int v, i, sum, max; scanf("%d", &sum); max = sum; for (i = 2; i <= 100; ++i) { scanf("%d", &v); sum += v; if (v > max) max = v; } printf("Summen er %d\nMax er %d\n", sum, max); return 0; } Oppgave 2 #include #include int main(void) { int t; t = (time(NULL)/3600+1)%24; if (t < 6) { printf("God natt, alle sammen!\n"); } else if (t < 10) { printf("God morgen, alle sammen!\n"); } else if (t < 18) { printf("God dag, alle sammen!\n"); } else if (t < 22) { printf("God kveld, alle sammen!\n"); } else { printf("God natt, alle sammen!\n"); } printf("Klokken er %d.\n", t); } Oppgave 3 #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 5 #include #include void strcatc (char s[], char c) { int lx = strlen(s); s[lx] = c; s[lx+1] = 0; } char teststr[20]; void test (char c) { printf("Fųr: \"%s\".", teststr); strcatc(teststr, c); printf("\tEtter innsetting av '%c': \"%s\".\n", c, teststr); } int main (void) { strcpy(teststr, ""); /* Initiering er nųdvendig! */ test('a'); test('b'); test('c'); test('.'); test('.'); test('å'); 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"): 132 strcmps("Abē", "Abcd"): -124 strcmpx("Abē", "Abcd"): -124 strcmp("Abē", "Abc"): 1 strcmpu("Abē", "Abc"): 132 strcmps("Abē", "Abc"): -124 strcmpx("Abē", "Abc"): -124 strcmp("Abēd", "Abc"): 1 strcmpu("Abēd", "Abc"): 132 strcmps("Abēd", "Abc"): -124 strcmpx("Abēd", "Abc"): -124 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 svare enn våre, men begge oppfyller kravene om <0, ==0 og >0.