INF2270 Oppgaver uke 4 (23.-28.1.2008) Om det ikke blir tid til alle oppgavene, er oppgave 1-3 viktigst. Alle oppgavene ergner seg til ? l?ses ved en datamaskin. Oppgave 1 Skriv et C-program som leser 100 tall og skriver ut summen og det st?rste tallet. Oppgave 2 Tilordningen t = (time(NULL)/3600+1)%24; vil sette t til klokkeslettet, alts? hvilken time det er p? dagen akkurat n?r programmet kj?rer (0-23). (Det er ikke n?dvendig ? forst? hvordan dette skjer, men interesserte kan lese `man 2 time?.) Ta utgangspunkt i ?Hallo, alle sammen!?-programmet som ble vist p? forelesningen 14.1. Modifis?r dette slik at det skriver ?God morgen, alle sammen!? klokken 6-9 ?God dag, alle sammen!? klokken 10-17 ?God kveld, alle sammen!? klokken 18-21 ?God natt, alle sammen!? ellers. Oppgave 3 Skriv C-funksjonen int hexval (unsigned char c) som konverterer et hex-tegn ('0'-'9', 'a'-'f' eller 'A'-'F') til sin verdi 0-15. Vi kan anta at det alltid er et hex-tegn i c n?r funksjonen kalles. Her er et kort testprogram du kan bruke til ? sjekke om funksjonen virker: #include int hexval (unsigned char c) { ... } /* 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 Skriv C-funksjonen int isspacex (unsigned char c) som oppf?rer seg som standardfunksjonen `isspace', dvs returnerer ?sann? (dvs en verdi som ikke er 0) om c er et mellomromstegn, dvs ' ' (blank, ASCII 32), LF (linjeskilletegn, ASCII 10) eller TAB (tabulatortegn, ASCII 9); hvis ikke skal den returnere 0. Skriv ogs? et testprogram. Oppgave 5 Gitt f?lgende program der funksjonen `strcatc' utvider teksten `s' med tegnet `c': #include #include void strcatc (char s[], char c) { ... } 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; } Programmet sjekker om funksjonen virker ved ? teste den p? ulike data. N?r programmet kj?res, skal det skrive: F?r: "". Etter innsetting av 'a': "a". F?r: "a". Etter innsetting av 'b': "ab". F?r: "ab". Etter innsetting av 'c': "abc". F?r: "abc". Etter innsetting av '.': "abc.". F?r: "abc.". Etter innsetting av '.': "abc..". F?r: "abc..". Etter innsetting av '?': "abc..?". Skriv funksjonen `strcatc'. Oppgave 6 Standardfunksjonen int strcmp (unsigned char s1[], unsigned char s2[]) sammenligner to tekster og returnerer en verdi som er <0 om s1 kommer f?r s2 =0 om s1 og s2 er like >0 om s1 kommer etter s2 Skriv `strcmpx' i C; den skal oppf?rer seg likt `strcmp'. Her er et testprogram: #include int strcmpx (unsigned char s1[], unsigned char s2[]) { : } void test (unsigned char s1[], unsigned char s2[]) { printf("strcmpx(\"%s\", \"%s\") gir %d\n", s1, s2, strcmpx(s1,s2)); } int main (void) { test("Abc", "Ab"); test("Abc", "Abc"); test("Abc", "Abcd"); return 0; } Oppgave 7 (Ukens n?tt for spesielt interesserte) Spiller det noen rolle om parametrene i forrige oppgave er deklarert som ?char?, ?signed char? eller ?unsigned char?? Eller, sagt p? en annen m?te: Hvorfor fikk vi negative tall i utskriften vist p? forelesningen 21.1? t[ 0] = 97 = 'a' t[ 1] = 98 = 'b' t[ 2] = 99 = 'c' t[ 3] = 0 = '' t[ 4] = -12 = '?' t[ 5] = -17 = '?' t[ 6] = -114 = '' t[ 7] = 0 = '' t[ 8] = 68 = 'D' t[ 9] = -107 = ''