5(16) Tentamen på kurserna Programmeringsteknik med C och Matlab Programmering i C Tid: 2/11-11, kl. 9-13 Lärare: Jonny Pettersson Totalt: 60 poäng Betyg 3: 30 poäng Betyg 4: 39 poäng Betyg 5: 48 poäng Inga hjälpmedel tillåtna. Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad. Om du behöver mer plats, skriv dina lösningar på extrablad. Lös bara en uppgift på varje extrablad. Se till att ditt kodnummer och uppgiftens nummer är tydligt markerade på varje extrablad du lämnar in. Se till att C-kod som ingår i dina lösningar är vettigt indenterad. Glöm inte att markera med ett kryss de uppgifter du lämnar in svar på. Besvara varje fråga så tydligt och strukturerat som möjligt. Om det inte går att läsa dina lösningar kan de inte ges poäng. Observera att tentamen är tryckt dubbelsidig. Läs alltså båda sidorna av varje blad. Lycka till!
6(16) Kodnummer: UPPGIFT 1 (5 x 2 poäng) Betrakta följande C-program: #include <stdio.h> int main(void) { int f = 15, g = 4; double x = f - 12, y = 4.3; char c = 'k'; char *s = "Hej"; printf("%d %c\n", 3 + 4, c); /* Utskrift 1 */ printf("%d %d\n", g/f, g%f); /* Utskrift 2 */ f = y + 10; printf("%d %.2f\n", f/g, y/2); /* Utskrift 3 */ y *= x; printf("%s %.3f\n", s, y); /* Utskrift 4 */ x += y * 2; printf("%s %.1f\n", "x = ", x); /* Utskrift 5 */ return 0; Vad skriver programmet ut när det körs? Utskrift 1: Utskrift 2: Utskrift 3: Utskrift 4: Utskrift 5:
7(16) Kodnummer: UPPGIFT 2 (4 poäng) Skriv en C-funktion som givet tre tal som parametrar returnerar värdet på det lägsta talet. Din funktion har följande funktionsdeklaration: double lowest(double n1, double n2, double n3); Skriv funktionsdefinitionen.
8(16) Kodnummer: UPPGIFT 3 (7 + 4 poäng) a) Skriv en funktion med funktionsdeklarationen double meanofpositive(int array[], int length); Funktionen tar emot en array med heltal och ett heltal som anger hur många heltal som finns i arrayen. Funktionen beräknar och returnerar medelvärdet av alla positiva tal. Ett positivt tal är ett tal som är strikt större än talet noll (0). Om inget positivt tal finns i arrayen ska funktionen returnera 0. b) Skriv en main-funktion som deklarerar en int-array av längd sju, fyller arrayen med sju tal (tex 3, -2, 4, -1, 3, 7, -8), anropar meanofpositive för att beräkna medelvärdet av alla positiva heltal (enligt ovan) och skriver ut det värde som meanofpositive returnerar med två decimalers noggrannhet (följt av en radbrytning). Tips: Tänk på att du kan göra deluppgift b även om du inte gjort deluppgift a.
Kodnummer: Uppgift: 9(16)
10(16) Kodnummer: UPPGIFT 4 (2 + 3 + 3 poäng) Betrakta följande C-funktioner: int f1(int n1, int n2) { if(n1 == n2 && -1 < n1) { return n1 + n2; else if(3 < n2 n1 > n2) { return n2 * n2; else { return n1 - n2; int f2(int n3, int n4, int n5) { int x1 = n3 % 2, x2 = n4 + n4, x3 = n4 - n5; do { x2 -= n3; x3 += x3; while (x2 >= x1); return x3; int f3(int n6, int n7, int n8) { int i, j; for(i = 11; i > n7; i -= 2) { for(j = i; j < n8; j++) { n6 += 1; return n6; Vilka returvärden ger följande tre anrop? f1(5, 3) f2(2, 3, 1) f3(0, 3, 8)
11(16) Kodnummer: UPPGIFT 5 (5 + 3 poäng) Givet följande datatypsdefinitioner: typedef struct{ char firstname[201]; char lastname[201]; int birthyear; person; typedef struct { char title[1001]; person author; int publishingnumber; book; I denna uppgift ska du skriva funktioner för att skriva ut data. Följande är ett exempel på hur utskriften av en array av book ska se ut: Bok 1 Titel: Matlab Namn: Andersson, Anna Födelseår: 1980 Publiceringsnummer: 2 Bok 2 Titel: DoA efter C Namn: Carlsson, Cecilia Födelseår: 1971 Publiceringsnummer: 1 a) Skriv en funktion printbook som skriver ut informationen som finns i en datastruktur av typen book. Din funktion ska ha följande funktionsdeklaration: void printbook(book b); I funktionen väljer du själv om du vill använda dig av en extra separat funktion för att skriva ut delar av innehållet. Denna eventuella funktion måste du i så fall skriva i ditt svar. b) Skriv en funktion printbookarray som skriver ut informationen som finns i en array av datastruktur av typen book. I funktionen ska du använda dig av funktionen printbook. Din funktion ska ha följande funktionsdeklaration: void printbookarray(book *bookarray, int length);
Kodnummer: Uppgift: 12(16)
13(16) Kodnummer: UPPGIFT 6 (3 + 8 + 2 poäng) a) Skriv en funktion double *allocarray(int length); som allokerar en double-array av längd length och returnerar en pekare till arrayen. b) Skriv en funktion void separate(const double *array, double *posarray, double *negarray, int length, int *noofpos, int *noofneg); som kopierar alla positiva tal bland de length första elementen i array till arrayen posarray och i variablen som noofpos pekar på sparar antalet positiva heltal som fanns i array kopierar alla negativa tal bland de length första elementen i array till arrayen negarray och i variablen som noofneg pekar på sparar antalet negativa heltal som fanns i array Inga tal med värdet 0 ska kopieras eller räknas. Arrayerna posarray och negarray har båda minst längden length. Eventuella värden i posarray och negarray ska ligga i element efter varandra. Efter ett anrop till separate kan det till exempel se ut så här i arrayerna (tecknet? i ett element innebär att värdet i elementet ej påverkats): array: -2 0 4 3-1 posarray : 4 3??? negarray: -2-1??? c) Skriv en funktion som lämnar tillbaka det minne som allokerats med hjälp av allocarray.
Kodnummer: Uppgift: 14(16)
Kodnummer: Uppgift: 15(16)
16(16) Kodnummer: UPPGIFT 7 (2 + 2 + 2 poäng) Betrakta följande C-program: #include <stdio.h> int main(void) { int a = 3, b = 7; int *x, *y; int array[2]; y = &a; x = y; *x = 5; x = &b; printf("%d %d\n", a, *x); /* Utskrift 1 */ *y += *x; b = a - *x; y = &b; printf("%d %d\n", a, *y); /* Utskrift 2 */ a = 1, b = 2; x = &array[1]; *x = b; array[0] = a; y = array; printf("%d %d\n", array[1], *y); /* Utskrift 3 */ return 0; Vad skriver programmet ut när det körs? Utskrift 1: Utskrift 2: Utskrift 3: