http://www.nada.kth.se/kurser/kth/2D1350/progp05/C/index.html
KTH 2D1350, Programmeringsparadigm 2005
Laboration
Nada

Laboration 8

I denna laboration ska du skriva ett litet registerprogram för Viktmästarna. Registret ska implementeras med hjälp av en länkad lista. För att bli godkänd på labben räcker det inte med ett fungerande program utan du måste också kunna svara på en del frågor. Dessa frågor är numrerade och markerade i fetstil. Är du säker på C-programmering kan du börja med programmeringen och göra övriga uppgifter i efterhand.

Uppvärmning

Se till att modulen gcc är laddad (module add gcc). Hämta exempelfilen och kompilera den med kommandot:

    gcc exempel.c
När du kompilerat koden bildas en exekverbar fil. På unix-system heter den ofta a.out, på windows a.exe. Kör programmet. Notera att bmi skrivs ut med flera decimaler. Detta ska du ändra på. Öppna koden i emacs.

Läs i C-häftet (köpes på expeditionen) alternativt i egen bok om printf. Vid redovisning ska du kunna svara på hur man använder printf för att skriva ut heltal, strängar m.m.(1) Ändra koden så att enbart två decimaler skrivs ut.

Ändra i koden

 
    fscanf(stdin, "%f", &lengd);
ta bort &-tecknet så koden blir:
 
    fscanf(stdin, "%f", lengd);
Prova kompilera och köra. Vad händer och varför händer det? Vid redovisning ska du kunna svara varför det står ett &-tecken framför lengd och vad som händer om man inte har det (2)

Preprocessor och make

Hämta filerna: Makefile, program.c, nod.h, nod.c och bmi_namn.txt.

Prova kompilera genom att skriva make i terminal fönstret alternativt M-x compile i emacs. Eventuellt behöver du skriva module add gnu för att köra make. Läs om makefile i häftet alternativt på webben (sök på make tutorial). Vid redovisningen ska du kunna redogöra för vad som är målfiler, beroenden och kommandon(3). Öppna Makefile. Vad är FLAGS för något (4).

Vad gör -g och -W för skillnad vid kompilering? Ta fram man-sidan för gcc (man gcc i terminalfönstret eller M-x man alternativt M-x woman i emacs) Sök på -g och -W (tips sök med tre-fyra mellanslag före minustecknet). I terminalfönstret finns det olika sätt att söka beroende på pager men oftast fungerar '/'. Vid redovisningen ska du kunna redogöra vad -g och -W flaggan är och kunna visa t.ex. sektionen med -Wall i man-sidan för handledaren(5)

Ändra i nod.c, inför en extra radbrytning. Prova kompilera flera gånger efter varandra. Andra gången kompileras inte nod.c varför inte, förklara på redovisningen (6).

Titta i nod.h. Det finns en ful hårdkodning där. Lös det genom att använda #define. Ändra därefter motsvarande fula hårdkodning i nod.c.

Om man inkluderar nod.h flera gånger efter varandra blir det problem. Vad blir det för problem? (7). Lös det genom att skriva en så kallad include-guard genom att använda #define, #ifndef och #endif. Titta hur det är löst i

    
    /usr/include/stdio.h 
Försök att inte härma namnkonventionen utan uppfinn din egen konvention.

Given kod

En del kod är given. Titta i nod.c Varför måste det vara två ** i framför list i funktionen (8)
    void load_names(char * filename, Post ** list)

Hur fungerar villkoret

    fscanf(fil, "%s %f", name, &bmi) == 2
Vid redovisning ska du kunna visa man-sidan för fscanf och förklara vad som skillnaden mellan scanf och fscanf samt vad som returneras (9).

Lab

Nu är det dags att göra labben. Fyll i de tomma funktionerna. Det kan vara bra att börja med funktionen som skriver ut listan. Här är ett körexempel

Programmet behöver inte vara robust. Vi har inte gått igenom felhantering. Att ta bort en post får du implementera som du vill men du måste avallokera minne manuellt, det finns ingen skräphanterare i C. Tänk på speciallfall, tomma listan och en post i listan (10). I C-häftet finns ett exempel med en stack. Du får ändra till en dubbellänkad lista om du vill, då blir lösningen väldigt enkel.

Sen redovisning

För elever som inte hinner redovisa i period två ska följande extrauppgift göras. Ändra i load_names så att namn och efternamn kan läsas in, se filen bmi_namn2.txt.

Extrauppgifter

För de som tycker det gick alltför fort att göra labben kan ni göra uppgiften ovan och implementera substring-sökning så att man kan söka på för eller efternamn.

Lycka till!