--*- coding: utf-8; -*-- INF2270 Oppgaver uke 10 (2.-6.3.2015) Oppgave 1 Skriv fire funksjoner, ¨Śn for hver an disse formlene: f1(int x) = (x+1)*4 f2(int x) = x^4 /* der ^ betyr ?opph?yd i? */ f3(int a, int b, int c) = if a < 0 then b else c f4(int a, int b) = (a^2 + b^2)/2 Oppgave 2 Skriv funksjonen int odd(int x) som returnerer 1 hvis x er et oddetall, og 0 ellers. Hint. Denne oppgaven kan l?ses uten bruk av divisjonsinstruksjoner; tenk p? hvordan bin?re tall lagres som bit. 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. Oppgaven kan l?ses med cmp og hopp, men det er ogs? mulig ? bare regne seg frem til resultatet. Pr?v det. Oppgave 4 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 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 og uten ? bruke 'sprintf'. Bruk 'strdup' (pr?v 'man strdup' for ? lese om den) 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?