UMEÅ UNIVERSITET
Datavetenskap
050826
LÖSNINGSFÖRSLAG: TENTAMEN
Programmeringsteknik för ing. , 5p
TDBA39
Datum
:
050826
Uppgift 1. (2+2+2+2+2=10p)
a)
Makrot multiplicerar uttrycken a och b. Problem uppstår om uttrycken a och b
innehåller operatorer med lägre prioritet än *.
Exempel på hur fel kan uppstå:
int x;
x = MUL(3+5, 2); /* Borde bli 16, men blir 13 */
Uttrycket ovan expanderas till x = 3+5*2; vilket är 3 + (5 * 2) eftersom * binder
hårdare än +. För att undvika detta bör makrot skrivas:
#define MUL(x,y) ((x) * (y))
b)
argc - anger antalet argument på kommandoraden.
argv - en vektor med pekare till strängar innehållande
respektive argument.
argc
= 4
argv[0]
argv[1]
argv[2]
argv[3]
argv[4]
=
=
=
=
=
”my_test”
”arg”
”77”
”xyz”
””
/* Ja, argv[4] finns faktiskt, men
innehåller bara tomma strängen. */
c)
Köer och stackar är datatyper som oftast är implementerade som dynamiska
strukturer, men kan också implementeras som arrayer. Gemensamt för stackar och
UMEÅ UNIVERSITET 901 87 UMEÅ
Tomas Larsson Tel.: 070-538 65 83 e-mail: [email protected]
Tentamen: Programmeringsteknik För Ing. – C
050826
köer är att de har ett antal operationer på sig som anger hur man gör för att lägga till
och ta bort element från respektive datatyp.
Kö: I en kö tas alltid det först inlagda elementet bort först, first in first out. Vanliga
funktioner relaterade till en kö är: enqueue, dequeue och front. Enbart det element
som finns längst fram i kön är tillgängligt.
Stack: Enbart det översta elementet är tillgängligt i stacken (toppen). I en stack lägger
man alltid till och tar bort element från toppen på stacken, även kallat last in first out.
Vanliga funktioner relaterade med en stack är: push, pop och top.
d)
Assert är en funktion som finns att inkludera i assert.h. Assert tar ett heltalsuttryck
som argument på formen assert(uttryck). Om uttrycket evalueras till 0 (falskt) skrivs
ett felmeddelande ut och programkörningen avbryts. Om uttrycket evalueras till icke 0
(sant) så går programmet vidare utan åtgärd.
e)
Unionen innehåller antingen ett värde i index, eller i data, men inte båda samtidigt.
Den senaste tilldelade variabeln är den som är aktuell. Till skillnad från en struktur
innehåller en union enbart ett värde åt gången, man kan säga att variablerna i unionen
delar på samma minnesområde.
Uppgift 2. (4+4=8p)
a)
int is_triangle(triangle_t *t){
int retval = 0;
if(t->vinkelA > 0 && t->vinkelB > 0 && t->vinkelC > 0){
if (t->vinkelA + t->vinkelB + t->vinkelC == 180)
retval = 1;
}
return retval;
}
b)
int main (void){
triangle_t *t;
t = (triangle_t *)malloc(sizeof(triangle_t));
if (t == NULL) {
printf("Misslyckades allokera minne för
triangeln\n");
exit(-1);
}
printf("\nAnge vinkeln A: ");
scanf("%d",&t->vinkelA);
printf("\nAnge vinkeln B: ");
scanf("%d",&t->vinkelB);
2
Tentamen: Programmeringsteknik För Ing. – C
050826
printf("\nAnge vinkeln C: ");
scanf("%d",&t->vinkelC);
if (is_triangle(t))
printf("Triangeln är giltig\n");
else
printf("Triangeln är ogiltig\n");
free(t); // free returnerar inget värde.
return 0;
}
Uppgift 3. (3p)
int strange(int x) {
if (x <= 0)
return 0;
else
return 1 + strange(x /= 10);
}
Funktionen beräknar antalet siffror i ett positivt heltal. T.ex. ger strange(5)
resultatet 1 och strange(325) blir 3.
Uppgift 4. (4p)
a)
1
3
-1
2
-3
b)
1:
2:
3:
4:
2
1
3
2
7
7
2
7
6
6
7
7
Uppgift 5. (5p)
char *charfind(char *str, char c) {
char *ptr;
ptr = str;
while (*ptr != '\0') {
if (*ptr == c)
return ptr;
else
3
Tentamen: Programmeringsteknik För Ing. – C
050826
ptr++;
}
return NULL;
}
Uppgift 6. (4+2=6p)
a)
#include "hdr.h"
outcome_t compare(rps_t player1, rps_t player2) {
outcome_t result;
if (player1 < rock || player1 > scissors ||
player2 < rock || player2 > scissors) {
printf(“Otillåten indata\n”);
exit(-1);
}
if (player1 == player2)
return tie;
switch (player1) {
case rock :
result = (player2 == scissors) ? win : lose;
break;
case paper :
result = (player2 == rock) ? win : lose;
break;
case scissors :
result = (player2 == paper) ? win : lose;
break;
}
return result;
}
b)
I headerfiler skrivs makron, funktionsprototyper och datatypsdeklarationer. Dessa kan
då lätt inkluderas vid kompilering av källkodsfiler innehållande motsvarande
funktionsdeklarationer som beskrivits i h-filen. Headerfiler används för att kompilera
funktionsbibliotek och beskriver för en användare hur denne kan använda funktioner,
datatyper och makron som deklarerats i headerfilen.
Uppgift 7. (1+1+1+1=4p)
1.
Sant.
c är falskt, så !falskt är sant.
4
Tentamen: Programmeringsteknik För Ing. – C
050826
2.
Falskt.
|| (eller) binder lösare än == (ekvavilens), så hela uttrycket evalueras som följer:
(b == 0) || (a == 'a')
Först evalueras både b == 0 och a == 'a' till falskt eftersom b är 'a', samt
a är 1. Man får nu uttrycket falskt || falskt, vilket är falskt.
3.
Falskt.
Först evalueras (a || b), både a och b är sanna, så uttrycket är sant.
Sedan negeras uttrycket, d.v.s. !(a || b) blir falskt. Man har nu uttrycket
falskt && b, där b är sant, alltså blir hela uttrycket falskt eftersom falskt
&& sant är falskt.
4.
Sant.
a och b är sanna och c är falskt. Alltså kan uttrycket skrivas om som sant ||
falskt && !sant. Först evalueras !sant vilket blir falskt. Uttrycket är nu:
sant || falskt && falskt. && binder hårdare än ||, alltså evalueras
uttrycket som sant || (falskt && falskt), vilket ger uttrycket sant ||
falskt. Således är hela uttrycket sant.
5