Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Tentamen Programmeringsteknik för Ingenjörer, 5p 13 januari 1998 Hjälpmedel: Miniräknare och en av följande böcker. A. Kelley & I. Pohl: "A Book on C", (2nd or 3rd edition) M. Waite, S. Prata & D. Martin: "Programming in C" U. Bilting & J. Skansholm: "Vägen till C" J. Ek & R. Ekman "C programmering" Födelsedatum: Namn: Namnteckning: Maxpoäng: 40 Gräns för 3: 20 (50%) Gräns för 4: 26 (65%) Gräns för 5: 32 (80%) Markera de uppgifter som du har löst Uppgift Löst Maxpoäng Poäng Resultat / Betyg Signatur 1 2 3 4 5 Totalt Bonus 7 4 6 10 13 40 3.2 Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Anvisningar Programmeringsteknik för Ingenjörer, 5p 13 januari 1998 Skrivtid 16-22 Hjälpmedel: Miniräknare och EN av följande böcker. A. Kelley & I. Pohl: "A Book on C", (2nd or 3rd edition) M. Waite, S. Prata & D. Martin: "Programming in C" U. Bilting & J. Skansholm: "Vägen till C" J. Ek & R. Ekman "C programmering" Maxpoäng: 40 Gräns för 3: 20 (50%) Gräns för 4: 26 (65%) Gräns för 5: 32 (80%) Uppgifterna är slumpmässigt ordnade. Läs igenom alla deluppgifter innan du börjar på uppgiften. Lös uppgifterna på avsett papper och inte i häftet för tentamensuppgifterna. Börja varje uppgift och helst varje deluppgift på nytt blad och skriv uppgiftsnummer längst upp till höger på bladet. Skriv namn på varje blad. Även om du inte klarar av hela uppgiften kan du få poäng. Lös så mycket du kan! Skriv algoritmer till programeringsuppgifter. Dessa kan utgöra grund för poäng. Använd er av ANSI C. Resultatet kommer att anslås på WWW så snart jag rättat klart. (1-2 veckor.) Lösningsförslag kommer också att finnas på WWW. Tentan kan hämtas på mitt rum så snart resultatet kommit upp. Fråga om något är oklart. Jag kommer till tentasalen några gånger. Måste ni göra egna antaganden, skriv ner dessa. Kom ihåg att göra kursutvärderingen. Den är obligatorisk. Ni har fått lösenord via mejl och det finns en länk i kursidan på WWW. Lycka Till / Magnus - 2/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Uppgift 1. (3+4 p) Deluppgift a: Vad är en abstrakt datatyp och vad används den till? Deluppgift b: I programspråket C finns det stöd för utveckling av stora program. Ge fyra exempel på detta stöd. Varje korrekt sak med motivering ger 1p. - 3/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Uppgift 2 (4 p) Vad skrivs ut av följande kod: #include <stdio.h> #include <math.h> #define PI 3.14159265359 void hun (int *t1, int *t2, int *t3, int *t4, int t5, int t6) { int temp = *t3 * (int) cos(*t2*PI); if (temp < t5) { int temp = *t4 * (int) sin(((double)*t1/2)*PI); *t1 = temp; } t5 = t6; *t2 = temp; *t3 = t5; *t4 = *t3; } int main (void) { int t1=1,t2=2,t3=3,t4=4,t5=5,t6=6; hun(&t1,&t2,&t3,&t4,t5,t6); printf("%d+%d+%d+%d+%d+%d=%d\n",t1,t2,t3,t4,t5,t6,t1+t2+t3+t4+t5+t6); return 0; } Felaktigt svar utan motivering ger 0p. Ett felaktigt svar med bra motivering hur du har tänkt ger poäng för de saker som du beskrivit rätt. Ledning: =1 2 sin = 0 sin 2 = 0 sin 3 = 0 sin 4 = 0 sin 5 = 0 sin 6 = 0 … sin cos 2 =0 cos = -1 cos 2 = 1 cos 3 = -1 cos 4 = 1 cos 5 = -1 cos 6 = 1 … - 4/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Uppgift 3 (6 p) Följande program skrivet i ANSI C innehåller ett antal fel. Förklara vad som är fel. (Använd gärna radnummer för att referera till satserna.) Minuspoäng utdelas för korrigeringar av saker som inte är fel. Ni kan dock aldrig få mindre än 0 poäng totalt. Tips - Man kan indela felen i programmet som syntaktiska eller semantiska. Syntaktiska fel är fel som kompilatorn upptäcker. Semantiska fel kan hänföras till att programmet faktiskt gör vissa beräkningar, men felaktiga sådana. Det är 2 rena syntaktiska fel i programmet nedan. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: include <stdio.h> void gun(double *d1,int *ipek , int i, char c) { i = c; return; } int main (void) { double d1; int *i, ii; char c = 'a'; printf("Skriv in heltalet du vill beräkna kvadratroten av:\n>"); scanf("%d",ii); d1 = sqrt(ii); i = &ii; gun(&d1,&ii,*i,c); gun(&d1,i,ii,c); gun(&d1,i,*ii,c); gun(&d1,i,ii,c); gun(&d1,ii,*i,c); gun(&d1,&ii,c,c); printf("Kvadratroten av %d är %f\n",*i,d1); } - 5/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Uppgift 4 (5 + 5 p) Ett personnummer har följande uppbyggnad: 49 År 09 Mån 24 Dag - 24 Regionsnr 3 Kön 2 Kontrollsiffra Kontrollsiffran visar om personnumret är giltigt. Den beräknas på följande sätt: Varannan siffra i personnumret (med början på den 1:a siffran) multipliceras med 2 för att skapa ett nytt nummer. OBS! Detta görs bara på de första 9 siffrorna eftersom det är den tionde man ska räkna ut. Ex: x = 490924243 212121212 890944446 Givet till denna uppgift är en C-funktion som löser denna uppgift: unsigned new_num(unsigned e1) { unsigned new_num=0; int i,n; for (i=1,n=100000000;n>0;n/=10,i++){ new_num += n * (e1/n * (i%2+1)); e1 %=n; } return new_num; } Funktionsanropet new_num(490924243) returnerar 89094446. Kontrollsiffran kan nu beräknas med hjälp av: Kontrollsiffra = (100 - S) mod 10 Där S är Siffersumman av det framräknade nya numret. För exemplet ovan blir S: S = 8 + 9 + 0 + 9 + 4 + 4 + 4 + 4 + 6 = 48 Kontrollsiffra = (100 - 48) mod 10 = 2 D v s personnumret 490924-2432 är giltigt. OBS - Modulus operatorn är % i C. - 6/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Deluppgift A: Skriv en funktion: int valid(unsigned first_six, unsigned last_four); som avgör om personnumret bestående av first_six och last_four är giltigt. Är det inte giltigt ska funktionen returnera logiskt falskt 0 annars logiskt sant 1. Denna funktion ska anropa new_num enligt tidigare. Deluppgift B: Skriv ett huvudprogram som läser in namnet på en text fil, öppnar denna på lämpligt sätt, samt använder funktionen valid för att avgöra vilka personnummer i denna fil som är ogiltiga. Varje personnummer som är ogiltigt ska skrivas ut på stdout tillsammans med namnet. Till exempel, med följande filinnehåll: Edblom Lennart Emdin Karl Pontusson Pier Sjöström Magnus Scherdin Petter Elmqvist Jonas Eriksson Magnus Waernulf Johan Sandström Linda Rydberg Jonas Björn Jenny Edlund Christer 490924 751025 671025 661029 671202 730817 710120 760104 740227 760131 680420 711219 2432 8515 3266 8520 8221 7850 8572 0210 8534 8939 3518 0413 Ska utskriften bli: Personnumret 671025-3266 är ogiltigt Pier Pontusson har uppgivit fel uppgifter Personnumret 661029-8520 är ogiltigt Magnus Sjöström har uppgivit fel uppgifter Personnumret 730817-7850 är ogiltigt Jonas Elmqvist har uppgivit fel uppgifter Personnumret 740227-8534 är ogiltigt Linda Sandström har uppgivit fel uppgifter Ni kan förutsätta att filen inte innehåller fel som felaktigt antal siffror i personnumret. Ni kan även anta att namnen i textfilen inte överstiger längden av 50 tecken. Observera att du får använda funktionen valid från deluppgift A även om du inte klarat av denna. - 7/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Uppgift 5 (5+2+3+3 p) På bostadsförmedlingen i Umeå indelas de sökande efter födelsemånad och kön. Till denna kategoriindelningen använder man lämpligen den sökandes personnummer. Som bekant har ett personnummer följande uppbyggnad: 49 År 09 Mån 24 Dag - 24 Regionsnr 3 Kön 2 Kontrollsiffra Man skulle kunna visualisera kategoriindelningen av personerna Anna Stolt Martin Holt Nils Cajander Sara Öhlin Kristina Vest Niklas Blom 760126-8522 670114-8573 720323-7857 771226-8322 770115-7844 720115-8555 enligt följande: K 1 M Anna Stolt 760126-8522 Martin Holt 670114-8573 Kristina Vest 770115-7844 Niklas Blom 720115-8555 ... ... K ... 2 M ... K 3 M ... K 12 M Nils Cajander 720323-7857 Sara Öhlin 771226-8322 ... ... ... ... Funktioner för att kunna göra denna kategoriindelningen: Skapa en ny tom struktur av kategorier . Lägga in ett data d v s personnummer med namn. Man behöver inte ta hänsyn till bokstavsordning ej heller ta hänsyn till om datat redan finns. Hitta ett data. Enklast genom att söka på personnummer eftersom det inte finns två personer med samma namn. - 8/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Deluppgift A (5 p): Hur skulle du implementera en datastruktur för kategoriseringen. Du får själv välja om den ska vara statisk eller dynamisk. Er implementation behöver inte likna figuren ovan. Dessutom är denna figur inte en tillräcklig beskrivning för en implementation i C. Den behöver kompletteras. Rita och berätta. Beskriv fördelar och nackdelar med er implementation. Du ska även göra de typdefinitioner (t e x structs) som behövs. (Tips - Ni använde en statisk datatyp i labbarna). Deluppgift B (2 p): Implementera funktionen initialize: /* Denna funktion skapar en tom datastruktur */ kategorier Parametrar och returvärde avgör du. Men ett förslag är: void initialize(kategorier k); Detta gör du lämpligen i en "fil" som du kallar kat.c. Deluppgift C (3 p): Implementera funktionen insert: /* Lägger in ett data d v s personnummer med namn. Man behöver inte ta hänsyn till bokstavsordning ej heller ta hänsyn till om datat redan finns katagoriserat. Returnerar logiskt falskt 0 om något gick fel. */ Parametrar och returvärde avgör du. Men ett förslag är: int insert(data d, kategorier k); Detta gör du lämpligen i "filen" som du kallade kat.c. - 9/10 - Umeå Universitet Institutionen för Datavetenskap Magnus Jutterström Tentamen TDBA39 Programmeringsteknik 5 p 980113 Deluppgift D (3 p): Implementera funktionen lookup: /* Letar upp ett data, d v s personnummer med namn, genom att söka på personnummer */ Parametrar och returvärde avgör du. Men ett förslag är: data *lookup(pers_nr p_nr, const kategorier k); Detta gör du lämpligen i "filen" som du kallade kat.c. Tips! Med hjälp av de föreslagna funktionerna kan man göra följande: #include <stdio.h> #include "kat.h" int main(void) { kategorier bf_kat; data d1 = {"Anna","Stolt",{760126,8522}}; data d2 = {"Martin","Holt",{670114,8573}}; data d3 = {"Nils","Cajander",{720323,7857}}; data d4 = {"Sara","Öhlin",{771226,8322}}; data d5 = {"Kristina","Vest",{770115,7844}}; data d6 = {"Niklas","Blom",{720115,8555}}; data *ans; pers_nr ask_p_nr = {771226,8322}; initialize(bf_kat); insert(d1, insert(d2, insert(d3, insert(d4, insert(d5, insert(d6, bf_kat); bf_kat); bf_kat); bf_kat); bf_kat); bf_kat); ans = lookup(ask_p_nr,bf_kat); return 0; } Där ans innehåller information att skriva ut följande: Den efterfrågade personen är: Sara Öhlin 771226-8322 Dina funktioner kan komma att kräva andra anrop men det är OK. - 10/10 -