Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)




Tentamen i

Programmeringsmetodik

för D2, SDU2 m fl

torsdag 21 augusti 2008 kl 8:00 - 11:00

Gäller som tentamen för:
DT2010 Datateknik B, Programmeringsmetodik, provkod 0100
DT2006 Datateknik B, Tillämpad datavetenskap B, provkod 0110





Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
Resultat och lösningar: Meddelas på kursens hemsida eller via e-post senast torsdag 11 september 2008.
Återlämning av tentor: Efter att resultatet meddelats kan tentorna hämtas på institutionen. Man kan också få sin rättade tenta hemskickad.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-73 47 013.



LYCKA TILL!

Uppgift 1 (10 p)

En textfil som heter personer.txt innehåller data om personer med nummer, namn, adress och skonummer:

1 Olle Karlsson Strutsvägen 7, 640 50 Garphammar 42 4 Svea Svensson Granvägen 319, 702 21 Örebro 39 3 Lisa Karlsson Strutsvägen 7, 640 50 Garphammar 41 och så vidare

Som vi kan se står varje uppgift på en egen rad, så varje person upptar fyra rader i filen. Numret och skonumret är heltal. Såväl namnet som adressen kan innehålla högst 40 tecken.

Skriv ett C-program som läser filen, och lagrar alla personernas data i en länkad lista av poster (eller "structar", som man också kan säga). Programmet ska fråga användaren efter ett skonummer, och sen ska det skriva alla personer med det skonumret på en ny fil, som ska heta utvalda.txt. Den nya filen ska ha samma format som den ursprungliga.

Uppgift 2 (10 p)

Vi ska (någon annan dag) skriva ett program för att lagra data om böckerna i ett bibliotek, och därför behöver vi ett funktionsbibliotek för att hantera böcker. Följande ska finnas i det biblioteket:

a) Skriv (hela) header-filen bok.h, som innehåller en definition av posttypen, och deklarationer av funktionerna.

b) Skriv (hela) filen bok.c, som innehåller funktionernas definitioner, dvs "funktionskropparna" med programkod.

c) Skriv (hela) filen bokmain.c, som innehåller en enkel main-funktion som använder sig av bokpaketet ovan. Den main-funktionen ska ha en variabel av typen Bok, den ska läsa in data till den med hjälp av las_bok, och den ska skriva ut den med hjälp av skriv_bok.

Uppgift 3 (20 p)

Statistiska Centralbyrån, SCB, genomför ett ambitiöst projekt för att ta reda på årsinkomsten för alla människor i hela världen. En del av dem tjänar noll kronor om året, en del tjänar bara en krona om året, och en del tjänar miljoner eller till och med miljarder kronor.

SCB lagrar alla årsinkomsterna i en binärfil med heltal av typen int. Det finns drygt sex miljarder människor på jorden, så filen kommer att innehålla mer än sex miljarder heltal, ett för varje människa på jorden. Filen heter inkomster.bin. Inkomsterna anges i kronor.

Nu vill vi veta typvärdet för årsinkomsten, alltså vilken av årsinkomsterna som förekommer flest gånger i filen. Skriv ett C-program som ska räkna ut det!

Gör hur du vill!

Tips: Du behöver någon form av datastruktur som kan hålla reda på inkomsterna, och för varje inkomst även antalet förekomster. Det kommer att finnas sammanlagt mer än sex miljarder förekomster, men bara några miljoner olika inkomster.

Men!

För full poäng på uppgiften krävs att programmet har acceptabla prestanda. Ett program som lagrar inkomsterna i poster, med antal kronor och antal förekomster i varje post, och sen placerar de posterna i en osorterad länkad lista, kommer att behöva flera år på sig för att köra klart, även på en modern och snabb dator. För varje inkomst som programmet läser från filen, måste det nämligen söka igenom den länkade listan, och efter ett tag blir den listan flera miljoner steg lång. Moderna datorer är snabba, och kan faktiskt stega igenom en länkad lista med flera miljoner steg utan att användaren ens hinner märka det, men här ska den göra det sex miljarder gånger. Då tar det lång tid.

En bra lösning kräver därför en snabbare datastruktur, till exempel ett binärt träd eller en hashtabell.