INF1070 Oppgaver uke 6 (6-10.2.2006) (Oppgave 2 og 4 er viktigst, men både 1 og 3 er ganske raske å løse om man kjenner sin C.) Oppgave 1 Skriv et program som ber om et tall; så skal det skrive ut hvor mange dusin dette er, og hvor mange som blir til overs. (Et dusin er 12 stykker.) Gi et antall: 29 29 er 2 dusin og 5. Hint: Operatorene «+», «-», «*» og «/» gir som forventet sum, differanse, produkt og kvotient. Ved divisjon av heltall får man svaret _uten_ avrunding, så 9 / 5 gir 1 Operatoren «%» gir resten ved en divisjon, for eksempel 9 % 5 gir 4 Oppgave 2 Skriv en makro #define STREQ(s1,s2) som sjekker om de to tekstene er like. Tanken er at den kan brukes i if-tester: if (STREQ(s,"Abc")) ... Hint Hvordan sammenligner man to tekster i C? Oppgave 3 På forelesningen ble det på ark 4 vist en MIN-makro med mange parenteser: #define MIN(x,y) ((x)<(y) ? (x) : (y)) Hvorfor er ikke definisjonen kun #define MIN(x,y) x int main(int argc, char *argv[]) { int ix; for (ix = 1; ix < argc; ix++) { printf("%s", argv[ix]); if (ix < argc-1) printf(" "); } printf("\n"); } Da vil følgende skje når vi bruker programmet `wc': % wc echo.c 12 30 186 echo.c Filen har altså 12 linjer, 30 ord og 186 tegn. En linje er definert som «tekst avsluttet med '\n'» mens ord er definert som «sekvens av ikke-blanke tegn». Hint Hvis man henter inn definisjonsfilen ctype.h ved å skrive #include får man funksjonen «isspace(c)» som kan brukes til å teste om «c» er et blankt tegn eller ikke. Blanke tegn omfatter vanlig mellomrom (' '), linjeskift ('\n'), tabulator ('\t') og andre. Skriv programmet «wc» slik at det leser filen angitt som parameter og skriver ut hvor mange linjer, ord og tegn det er der. Oppgave 5 GNU-programmet `tac' leser standard-inn og skriver ut innholdet baklengs, dvs siste linje først, så nest siste linje, osv. Eksempel på bruk: > tac Første linje Siste linje «Kontroll-D» Siste linje Første linje (Man trykker på «Kontroll-D» (dvs «Control»- og «D»-tasten samtidig) for å angi slutt på filen når man leser fra tastaturet.) Skriv dette programmet. Anta at ingen linjer er på mer enn 200 tegn. Hint: Bruk en liste til å ta vare på linjene. Hint: C-funksjonen `gets' leser inn en hele linje fra en fil. Slå opp på man-siden for å se på hvilke parametre den har.