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)