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