UMEÅ UNIVERSITET
Inst. för Datavetenskap
Per Lindström
tel. 090-786 6124 (arb)
090-130475 (hem)
2000-04-29
Tentamen i Programmeringsteknik A, 3 poäng
Teknisk Fysik, Energiteknik och Molekylär Biofysik
Skrivtid: Lör 29/4 2000, kl. 9.00-15.00 i sal 1 Östra paviljongerna
Tillåtna hjälpmedel:
En av nedanstående böcker.
Kelley, Pohl: A Book on C
Kernighan, Ritchie: The C Programming Language
OBS! Uppgifterna är slumpvis ordnade utan tanke på svårighetsgrad.
OBS! Om formuleringen av någon uppgift är oklar så bör du beskriva din tolkning av uppgiften och
lösa den utifrån denna tolkning.
Var vänlig och följ nedanstående:
1) Börja varje uppgift på nytt blad. Skriv ditt namn och uppgiftens nummer överst på varje sida.
2) Lösningarna skall var snyggt och prydligt nedskrivna. Tankegången skall vara lätt att följa.
Halva totalpoängen krävs normalt för godkänt betyg.
Lycka till!
UMEÅ UNIVERSITET 901 87 UMEÅ Tel.: 090-786 6124 Fax: 090-786 61 26 e-mail: [email protected]
Uppgift 1 (2+3+1 poäng)
Givet är följande definition på gcd (greatest common divisior = största gemensamma delare) :
För alla naturliga tal a och b (a,b > 0) gäller
b
omm a mod b  0

gcd(a,b) = 
annars
gcd( b,a mod b)
där mod är resten vid heltalsdivision.
a)
Skriv en funktion i C som returnerar gcd(a, b) där a och b ges som parametrar.
b)
Skriv en annan funktion i C som returnerar gcd(a, b) med en iterativ metod C.
c)
Beskriv för- och nackdelarna i allmänhet med en rekursiv metod jämfört med en iterativ.
Uppgift 2 (6 poäng)
En digital bild är uppbyggd av bildpunkter, sk pixels. Varje pixel innehåller i detta fall ett
tal i intervallet 0 till 63 som beskriver svärtningen i punkten (0=svart, 63=helt vitt). En bild
representeras i denna uppgift av en heltalsmatis vars aktuella dimensioner (antal rader
resp kolumner) anges vid anropet av den ”servicefunktion” som du ska skriva. Se nedan.
Man kan göra olika operationer för att “förbättra” en digital bild. I denna uppgift ska du
implementera en metod som utjämnar kontraster i bilden genom att i varje “innre” punkt i
matrisen ersätta talvärdet med medelvärdet av talvärdena i punkten och dess 8 “grannar”
(avrundat till närmaste heltal). “kantpunkternas” (förutom “hörnpunkterna”) talvärde
ska ersättas med medelvärdet av talvärdet i kantpunkten och dess 5 grannar och
hörnpunkternas talvärde ska ersättas med medelvärdet av talvärdet i hörnpunkten och
dess 3 grannar. Även dessa nya värden ska avrundas till närmaste heltal.
OBS! Resultatet av utjämningen ska vara oberoende av den ordning i vilken man behandlar
punkterna (elementen i matrisen).
Exempel på en liten matris med endast en innre punkt före och efter utjämning.
Före
Efter
5 2 0
4 3 1
7 2 0
5 4 2
9 7 3
6 5 3
Skriv en funktion i C med namn jaemna_ut och inparametrar A och m resp n. A betecknar en
heltalsmatris, innehållande en bild enligt ovan, med m rader och n kolumner. Funktionen ska
beräkna de utjämnade värdena enligt ovan i matrisen A. Funktionen ska kunna behandla matriser
som är deklarerade int A[25][25]. Modularisera din lösning!
Funktionshuvudet bör alltså se ut som
void jaemna_ut(int A[][25], int m, int n)
2(5)
Uppgift 3 (4+3+1 poäng)
Nedanstående algoritm beskriver en sorteringsmetod med namn Selection sort i sin enklaste variant.
Algoritmen nedan förutsätter att en array med n st heltalselement, med index 1, 2, …., n, ska
sorteras i stigande ordning (minsta talet ska lagras i a[1] och största talet i a[n]).
Ledning: I C indexeras det ju som bekant från 0 till n-1.
Algoritm Selection sort
for i=1 to n-1 do
for j= i+1 to n do
if (a[j] < a[i]) then
byt(a[j], a[i]);
a) Skiv i C en function med huvud
void select_a(int a[], int n)
som implementerar Selection sort algoritmen ovan. De sorterade talen ska finnas i
samma array som där de osorterad finns vid anropet. Du ska även skriva funktionen
byt som ju används för att byta värdet mellan elementen som är parametrar vid anrop
av funktionen byt.
b) Skriv i C en function med huvud
int *select_b(int a[], int n)
som implementerar Selection sort algoritmen ovan. Funktionen ska i detta fall retunera en
pekare till int. Pekarvärdet är adressen till första elementet i en array som du allokerar minne
för i funktionen. Denna nya array ska ”vid return” innehålla alla talen från arrayen a men nu
sorterade i stigande ordning.
c) Hur många jämförelser görs då Selection sort algoritmen genomlöps? Svaret ska bero
av n. När du vet hur många jämförelser som görs kan du också ange komplexitetsordningen på Selection sort.
Uppgift 4 ( 4+4 poäng)
Pig Latin är en form av kodat språk som kan användas för nöjes skull. Det finns flera olika varianter av
språket men i denna uppgift gäller följande:
Översättning av ett engelskt ord till pig Latin görs genom att flytta första bokstaven i ordet efter den
sista bokstaven i ordet och dessutom addera bokstäverna ’ay’ på slutet av ordet.
Ex: ordet ’jump’ översätts till ’umpjay’, ’the’ översätts till ’hetay’ och ’computer’ översätts till
’omputercay´.
a) I denna deluppgift ska du skriva en funktion i C som översätter en engelsk mening till pig Latin och
dessutom skriver ut den översatta meningen på skärmen. Orden i orginalmeningen skiljs åt med
blanktecken eller något av tecknen ’,’, ’-’, ’_’, ’;’, ’:’ och meningen avslutas med en punkt. Varje ord
3(5)
består av minst två bokstäver. Vid utskrift av den översatta meningen ska varje ord åtskiljas med ett
blanktecken. Dvs specialtecknen ’,’, ’-’, ’_’, ’;’, ’:’ samt ’.’ ska inte skrivas ut.
Funktionshuvudet kan tex se ut som följer
void pig_Latin(char *s)
Ledning: använd funktionen strtok() för att ”plocka ut” varje ord ur orginalmeningen. Se
beskrivning i bilaga.
b) Testa funktionen pig_Latin() genom att skriva en main-funktion som läser rader från
tangentbordet mha biblioteksfunktionen gets(). För varje ny rad som läses in anropas
pig_Latin(). Avbryt main då texten SLUT matas in först på ny rad.
Uppgift 5 ( 8 poäng)
I denna uppgift ska du jobba med en textfil som innehåller data om olika länders medaljskörd i OS.
Filen heter ”medaljer.txt” där informationen om varje land finns på två rader enligt:
landsnamn
tal1 tal2 tal3
där tal1 är ett heltal som säger hur många guldmedaljer landet i fråga erövrat. tal2 och tal3 är
motsvarande tal för antal silver- respektive bronsmedaljer.
Du ska lösa problemet att presentera en medaljpoängställning och skriva ut denna på skärmen i
ordning med "bästa landet" först. Om flera länder får samma poäng spelar utskriftsordningen dem
emellan ingen roll.
Beräkning av ett lands poäng görs genom formeln
poängguld*tal1+poängsilver*tal2+poängbrons*tal3
där poängguld, poängsilver respektive poängbrons är den poäng som respektive medalj är
värd då poängställningen ska beräknas. Dessa värden ska läsas in från tangentbordet och valideras så
att poängguld>poängsilver>poängbrons>0.
Se till att ”ta hand om” ev fel på ett lämpligt sätt i samband med att man öppnar filen för läsning.
Exempelutskrift (förutsatt att poängguld=3, poängsilver=2, poängbrons=1)
Norge
3
2
0
13
USA
2
2
1
11
....
....
I implementationen ska du bl.a. använda följande deklarationer
4(5)
#define
maxland
100
typedef
struct{
char namn[30];
int guld,silver,brons;
int points;
} land;
land array[maxland];
Lös problemet genom att skriva ett program i C. Modularisera din lösning!
5(5)