INF1070 Oppgaver uke 7 (13.-18.2.2008) (Om det ikke er tid til ? l?se alle oppgavene, er 2, 3 og 6 viktigst; deretter oppgave 5.) Oppgave 1 Skriv i assemblerspr?k funksjonen int sum3 (int a, int b, int c) som summerer tre heltall. Skriv ogs? et testprogram i C som sjekker om funksjoner virker. Oppgave 2 Skriv i assemblerspr?k funksjonen int f (int a, int b, int c) som beregner funksjonen f(a,b,c) = a+3b+c. Oppgave 3 Skriv i assemblerspr?k funksjonen int intcmp (int a, int b) som sammenligner to heltall og returnerer et negativ tall om ab. Hint: Hvordan kan vi f? dette til ved bare ? bruke + og - ? Oppgave 4 Standardfunksjonen char *strdup (char *s) lager en kopi (med `malloc?) av teksten `s? og returnerer en peker til den. Skriv funksjonen `strdup? i C. Hint. Det kan v?re lurt ? kalle den `my_strdup? for ? unng? forvirring med standardfunksjonen. Oppgave 5 Funksjonen char *my_itoa (int v) gj?r det motsatte av `atoi? som var oppgave for et par uker siden: den lager en tekst som inneholder sifrene i tallet `v? og returnerer en peker til denne. Skriv denne funksjonen i C (uten ? bruke `sprintf?). Bruk `strdup? (se oppgave 4) til ? lage en kopi av teksten. Eksempler my_itoa(212) = "212" my_itoa(-13) = "-13" my_itoa(1231) = "1231" my_itoa(0) = "0" Hint. Ved ? dele p? 10 flere ganger, finner man sifrene i tallet; disse kan s? konverteres til tekst og settes sammen. 1231 % 10 = 1 1 + '0' = '1' 1231 / 10 = 123 123 % 10 = 3 3 + '0' = '3' 123 / 10 = 12 12 % 10 = 2 2 + '0' = '2' 12 / 10 = 1 1 % 10 = 1 1 + '0' = '1' 1 / 10 = 0 Men sifrene kommer i motsatt rekkef?lge av det vi ?nsker. Hvordan kan vi snu dem? Oppgave 6 F?lgende program #include int main (void) { short a, b, sum; a = 20000; b = 20000; sum = a+b; printf("%d + %d = %d\n", a, b, sum); } gir dette resultatet n?r det kj?res: 20000 + 20000 = -25536 Dette er galt. Forklar hvorfor feilen oppst?r. Oppgave 7 (ukens n?tt) I ukeblad kan man ofte finne f?lgende tabell: | A | B | C | D | E | | | | | | | | 16 | 8 | 4 | 2 | 1 | | 17 | 9 | 5 | 3 | 3 | | 18 | 10 | 6 | 6 | 5 | | 19 | 11 | 7 | 7 | 7 | | 20 | 12 | 12 | 10 | 9 | | 21 | 13 | 13 | 11 | 11 | | 22 | 14 | 14 | 14 | 13 | | 23 | 15 | 15 | 15 | 15 | | 24 | 24 | 20 | 18 | 17 | | 25 | 25 | 21 | 19 | 19 | | 26 | 26 | 22 | 22 | 21 | | 27 | 27 | 23 | 25 | 23 | | 28 | 28 | 28 | 26 | 25 | | 29 | 29 | 29 | 27 | 27 | | 30 | 30 | 30 | 30 | 29 | | 31 | 31 | 31 | 31 | 31 | Med denne kan man imponere sine venner. Be dem velge et tilfeldig tall mellom 1 og 31 og kun fortelle deg i hvilke kolonner det st?r. (For eksempel st?r 19 i kolonne A, D og E, s? det eneste du f?r vite er ?A, D og E?.) Da kan du p? et ?yeblikk fortelle dem at de tenkte p? 19 ved ? summere de ?verste tallene i de angitte kolonnene. (A+D+E = 16+2+1 = 19.) Ofte er tallene i hver kolonne blandet tilfeldig (med unntak av det ?verste tallet) for at det skal se enda vanskeligere ut. Hva er hemmeligheten med tabellen? Hvordan er den blitt til? Hint. Dette har noe med bin?rtall ? gj?re. Ett tall i tabellen er galt; hvilket?