--*- coding: utf-8; -*-- INF2270 Oppgaver uke 6 (4.-8.2.2013) (Oppgave 1 og 3 er viktigst. Oppgave 4 er nyttig for å få trening i å bruke lister i C.) Oppgave 1 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 2 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 4 GNU-programmet 'tac' ('cat' baklengs) leser standard-inn og skriver ut innholdet baklengs, dvs siste linje først, så nest siste linje, osv. Eksempel på bruk: $ cat f.txt Første linje Siste linje $ tac f.txt Siste linje Første linje 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 'fgets' leser inn en hele linje fra en fil. Slå opp på man-siden for å se hvilke parametre den har.