Uppgift 1 - Institutionen för datavetenskap

Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Tentamen
Programmeringsteknik för Ingenjörer, 5p
2 december 1997
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
3
7
10
13
40
3.2
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Anvisningar
Programmeringsteknik för Ingenjörer, 5p
2 december 1997
 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 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/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Uppgift 1 (7 p)
När man programmerar är det viktigt att arbeta metodiskt. Strukturerad programmering är en
metod för stora delar av programmeringsarbetet, redogör för de olika momenten som finns i
strukturerad programmering. Försök även motivera varför respektive steg ska finnas med,
exempelvis genom att förklara vad som händer om man hoppar över något moment.
Uppgift 2 (3 p)
Vad skrivs ut av följande kod:
#include <stdio.h>
void fun(const int *c1, const int *c2, int *c3, int *c4, int c5, int c6)
{
c5 = *c2;
c6 = *c1;
*c3 = c5;
*c4 = c6;
*c4 = *c2;
*c3 = *c1;
return;
}
int main(void)
{
int c1,c2,c3,c4,c5,c6;
c1
c2
c3
c4
c5
c6
=
=
=
=
=
=
't';
'a';
'o';
'e';
'x';
'n';
fun(&c1,&c2,&c3,&c4,c5,c6);
printf("%c%c%c%c%c%c\n",c5,c4,c6,c3,c2,c1);
return 0;
}
- 3/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Uppgift 3 (4 + 3 p)
Deluppgift A:
Följande program skrivet i ANSI C innehåller ett antal fel som kompilatorn upptäcker. Vilka
är dessa syntaktiska fel? Hur ska det egentligen vara? ( 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.
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:
27:
28:
29:
#include <stdio.h>
int main(void);
{
int x, y, *z=&y;
double tal;
printf ("Ange två tal skilda från noll\n");
scanf("%d %d",&x,z);
if((x || y) == 0)
printf("Inget av talen får vara 0.\n");
printf("Starta om programmet!\n");
return 1;
else
printf("Talen är korrekta!\n");
/* Beräknar kvoten av talen samt dess invers */
tal = x / y;
inv = 1.0 / tal;
printf("%c/%c=%f\n" tal);
printf("Inversen är: %f\n",inv);
return 0;
}
Deluppgift B:
Om programmet ovan ska läsa in två tal, kolla att inget av talen är noll och till sist skriva ut
kvoten av de inlästa talen samt dess invers. Då finns det också tre semantiska fel som inte
upptäcks av kompilatorn (om man bortser från felen i a och förutsätter att man matar in tal
skilda från 0). Semantiska fel kan hänföras till att programmet faktiskt gör vissa beräkningar,
men felaktiga sådana. Vilka är dessa fel? Visa också hur det borde se ut, utan att göra några
större förändringar av den givna koden.
- 4/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Uppgift 4 (5 + 5 p)
I Svenska Akademins ordlista kan man läsa följande:
palindrom (-å'm) -en -er s. gåta över ord e. d. som ger samma betydelse om det läses
baklänges
Deluppgift A:
Skriv en funktion:
int palindrom(char ord[]);
som avgör om ord är ett palindrom. Funktionen ska returnera logiskt sant om det var ett
palindrom annars falskt. Programmet ska inte göra skillnad på stora och små bokstäver, utan
'a' och 'A' ska räknas som samma bokstav.
I appendix A.14 och A.2 i Kelley/Pohl hittar du funktionerna:
size_t strlen(const char *s)
int tolower(int c)
som kan vara användbara.
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 palindrom för att avgöra vilka ord i denna fil som är ett palindrom.
Varje ord som är ett palindrom ska skrivas ut på stdout.
Till exempel, med följande filinnehåll:
Anna som drack för mycket ozo på marknaden i Kivik fick ihop det med Otto
Ska utskriften bli:
Anna
ozo
i
Kivik
Otto
Ni kan förutsätta att . , ? m m redan är bortfiltrerade m a o de finns inte med i filen.
Felstavade ord behöver ni som synes inte heller ta hänsyn till. Ni kan även anta att orden i
textfilen inte överstiger längden av 50 tecken.
Observera att du får använda funktionen palindrom från deluppgift A även om du inte klarat
av denna.
- 5/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Uppgift 5 (2+2+3+3+3 p)
I ett svensk-engelskt lexikon sparas ett engelskt ord tillsammans med dess svenska
översättning.
En dynamisk Abstrakt DataTyp för detta lexicon kan se ut enligt följande:
Datasstrukturen för att lagra ordlistan:
"avert"
"avleda"
‘a’
"'aback"
"häpna"
NULL
‘zoom’
"surrande"
NULL
‘b’
.
.
.
‘c’
‘z’
.
.
.
"cape"
"udde"
NULL
svens
kengels
kt
"zombie"
"dönick"
svens
Figur. 5.1. Exempel på ett litet lexikon.
Funktionerna för att hantera lexikonet:
/*
Denna funktion initierar varje element i arrayen lexicon till NULL
*/
void initialize(lex_elem *lexicon[]);
/*
Denna funktion sätter in ordparet eng_sve i lexikonet lexicon.
Den behöver inte sätta in i bokstavsordning, ej heller ta hänsyn
till om ordet redan finns där */
void insert(entry eng_sve, lex_elem *lexicon[]);
/*
Returnerar den svenska översättningen av ordet eng_word.
*/
char *lookup(char *eng_word, const lex_elem *lexicon[]);
I appendix A.2 och A.14 i Kelley/Pohl hittar du funktioner som kan vara användbara i
deluppgifterna t ex tolower och strcmp.
- 6/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Med hjälp av denna abstrakta datatyp kan man göra följande:
#include <stdio.h>
#include "lexicon.h"
int main(void)
{
char *ord;
lex_elem *lexicon[NUMCHAR];
entry e1={"avert","avleda"};
entry e2={"aback","häpna"};
entry e3={"cape","udde"};
entry e4={"zombie","dönick"};
entry e5={"zoom","surrande"};
initialize(lexicon);
insert(e1,lexicon);
insert(e2,lexicon);
insert(e3,lexicon);
insert(e4,lexicon);
insert(e5,lexicon);
if (ord = lookup("avert",lexicon))
printf("Det engelska ordet avert betyder %s.\n",ord);
if (ord = lookup("ape",lexicon))
printf("Det engelska ordet ape betyder %s.\n",ord);
return 0;
}
Deluppgift A:
Implementera den dynamiska datastrukturen. D v s göra de typdefinitioner (t ex structs) som
behövs för att använda denna datastruktur (fig. 5.1). Detta gör du lämpligen i en "fil" som du
kallar lexicon.h. Klarar du inte av denna delfråga bör du åtminstone prova på deluppgift e.
Deluppgift B:
Implementera funktionen:
/*
Denna funktion initierar varje element i arrayen lexicon till NULL
*/
void initialize(lex_elem *lexicon[]);
Detta gör du lämpligen i en "fil" som du kallar lexicon.c.
Deluppgift C:
Implementera funktionen:
/*
Denna funktion sätter in ordparet eng_sve i lexikonet lexicon.
Den behöver inte sätta in i bokstavsordning, ej heller ta hänsyn
till om ordet redan finns där */
void insert(entry eng_sve, lex_elem *lexicon[]);
Detta gör du lämpligen i "filen" som du kallade lexicon.c.
- 7/8 -
Umeå Universitet
Institutionen för Datavetenskap
Magnus Jutterström
Tentamen TDBA39
Programmeringsteknik 5 p
971202
Deluppgift D:
Implementera funktionen:
/*
Returnerar den svenska översättningen av ordet eng_word.
*/
char *lookup(char *eng_word, const lex_elem *lexicon[]);
Detta gör du lämpligen i en "fil" som du kallade lexicon.c.
Deluppgift E:
Hur skulle en motsvarande statisk datastruktur se ut. Rita och berätta. Den behöver inte
nödvändigtvis gå att använda tillsamman med funktionerna ovan. Du ska även göra de
typdefinitioner (t e x structs) som behövs. (Tips - Ni använde en statisk datatyp i labbarna).
Vilka är nackdelarna med denna statiska datastruktur ?
- 8/8 -