Uppgift 1 - Institutionen för datavetenskap

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 = ⅈ
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 -