INF1070 Oppgaver uke 6 (7-11.2.2005) 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. 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 Standardfunksjonen int atoi (char *s) leter frem heltallet i teksten `s?, omformer det til vanlig bin?r form for heltall og returnerer det. Skriv funksjonen i C (og kall den `my_atoi?). NB! Det er ikke lov ? bruke `sscanf?. Eksempler my_atoi("212") = 212 my_atoi(" -13") = -13 my_atoi(" 1231- ") = 1231 my_atoi("") = 0 Hint. For ? konvertere et tall p? tekstform til intern bin?r form, m? man ta siffer for siffer og konvertere. Man m? ogs? gange med 10 for hvert siffer. '2' - '0' = 2 2 '1' - '0' = 1 2*10 + 1 = 21 '2' - '0' = 2 21*10 + 2 = 212 Oppgave 6 Funksjonen char *my_itoa (int v) gj?r det motsatte: 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 7 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 8 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; hvilket?