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 -