Tenta 101029 + lösningar

Lösningsförslag till tentamen på kurserna
Programmeringsteknik med C och Matlab
Programmering med C
Tid:
Lärare:
Totalt:
Betyg 3:
Betyg 4:
Betyg 5:
29/10 - 10, kl. 9-13
Jonny Pettersson
60 poäng
30 poäng
39 poäng
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!
Kodnummer: _________________
UPPGIFT 1 (5 x 2 poäng)
Betrakta följande C-program:
#include <stdio.h>
int main(void) {
int a = 4, b;
double x = a + 3, y = 5.1;
char c = 'a';
printf("%c\n", c); /* Utskrift 1 */
b = 9/3;
printf("%d %d\n", a/b, a%b); /* Utskrift 2 */
printf("%.2f\n", x/2); /* Utskrift 3 */
x += y;
printf("%.3f\n", x); /* Utskrift 4 */
printf("%d %c %.1f\n", b * a, 'b', x - y); /* Utskrift 5 */
return 0;
}
Vad skriver programmet ut när det körs?
Utskrift 1:
a
Utskrift 2:
11
Utskrift 3:
3,50
Utskrift 4:
12,100
Utskrift 5:
12 b 7,0
Kodnummer: _________________
UPPGIFT 2 (5 poäng)
En pyramids volym är dess basyta gånger dess höjd delat med 3. Skriv en C-funktion som
givet en pyramids basyta och höjd som inparametrar returnerar volymen för motsvarande
pyramid. Din funktion ska ha följande prototyp:
double pyramidVolume(double base, double height);
Svar:
double pyramidVolume(double base, double height) {
return (base * height) / 3;
}
eller
double pyramidVolume(double base, double height) {
double result;
result = (base * height) / 3;
return result;
}
Kodnummer: _________________
UPPGIFT 3 (8 + 4 poäng)
a) Skriv en funktion med prototypen
double getScore(double array[], int length);
Funktionen tar emot en array med domarpoäng och ett heltal som anger hur
många domarpoäng som finns i arrayen. Arrayen kommer alltid att innehålla
minst tre domarpoäng. Funktionen beräknar snittpoängen utan att ta hänsyn till
den högsta och den lägsta poängen, därefter returneras snittpoängen.
b) Skriv en main-funktion som




deklarerar en double-array av längd fem,
fyller arrayen med fem dommarpoäng (tex 3.5, 2.7, 4.9, 1.1, 3.7),
anropar getScore för att räkna snittdomarpoängen (enligt ovan) och
skriver ut det värde som getScore returnerar med en decimals noggrannhet
(följt av en radbrytning).
Tips: Tänk på att du kan göra deluppgift b även om du inte gjort deluppgift a.
Svar:
a)
double getScore(double array[], int length) {
double res, max, min;
int i;
res = array[0];
max = array[0];
min = array[0];
for(i = 1; i < length; i++) {
res += array[i];
if(array[i] > max) {
max = array[i];
}
if(array[i] < min) {
min = array[i];
}
}
res = (res - min - max) / (length - 2);
return res;
}
b)
int main(void) {
double array[] = {3.5, 2.7, 4.9, 1.1, 3.7};
int length = 5;
double score;
score = getScore(array, length);
printf("The resulting score is %.1f\n", score);
return 0;
}
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 + 1;
} else if(n1 > n2 || 3 < n2) {
return n2 - 1;
} else {
return n1/n2;
}
}
int f2(int n3, int n4, int n5) {
int x1 = -n3, x2 = n4/n5, x3 = n4 % n5;
while(x2 >= x1) {
x2--;
x3 += x1;
}
return x3;
}
int f3(int n6, int n7, int n8) {
int i, j;
for(i = 0; i <= n8; i++) {
for(j = i; j > n7; j--) {
n6 *= 2;
}
}
return n6;
}
Vilket returvärde ger följande tre anrop?
f1(5, 5)
4
f2(-1, 5, 2)
3
f3(1, -2, 1)
32
Kodnummer: _________________
UPPGIFT 5 (5 + 4 poäng)
Du har blivit anställd av Umeå universitet för att skriva program som hanterar data om
studenters resultat på universitetets olika kurser. För att komma igång måste du till att
börja med definiera en lämplig datatyp för att hantera en student.
De uppgifter om en student som är intressanta är







Studentens efternamn (max 300 tecken)
Studentens förnamn (max 100 tecken)
Studentens personnummer (13 tecken (ååååmmdd-xxxx))
Antal laborationer (ett heltal)
Resultat på laborationer (en array med max 10 tecken)
Antal poäng på tentamen (ett decimaltal)
Slutligt betyg (ett tecken)
a) Definiera en datatyp studentData i C som är lämplig för att representera
studentdata.
b) Skriv en funktion som tar en studentData som indata och på ett prydligt sätt
skriver ut den information om studenten som finns i datatypen. Din funktion ska
ha följande prototyp:
void printStudentData(studentData student);
Resultatet av ett anrop till funktionen kan till exempel se ut så här:
Studentens namn: Andersson, Anna
Personnummer: 19800601-8581
Resultat på laborationer: G G G
Resultat på tentamen: 52.5
Slutligt betyg: 5
Svar:
a)
typedef struct {
char lastName[301];
char firstName[101];
char personalNumber[14];
int noOfAssignments;
char resultsAssignments[10];
double pointsExam;
char grade;
} studentData;
b)
void printStudentData(studentData student) {
int i;
printf("Studentens namn: %s, %s\n", student.lastName,
student.firstName);
printf("Personnummer: %s\n", student.personalNumber);
printf("Resultat på laborationer: ");
for(i = 0 ; i < student.noOfAssignments ; i++) {
printf("%c ", student.resultsAssignments[i]);
}
printf("\n");
printf("Resultat på tentamen: %.1f\n", student.pointsExam);
printf("Slutligt betyg: %c\n", student.grade);
}
Kodnummer: _________________
UPPGIFT 6 (3 + 7 + 2 poäng)
a) Skriv en funktion
int *allocArray(int length);
som allokerar en int-array av längd length och returnerar en pekare till
arrayen.
b) Skriv en funktion
void sum(int *array, int length, int *sumNumbers,
int *sumSquares);
som
 lagrar summan av alla tal bland de length första elementen i array i
variablen som pekaren sumNumbers pekar på, och
 lagrar summan av alla kvadrater av alla tal bland de length första elementen
i array i variablen som pekaren sumSquares pekar på. Kvadraten av ett tal
är talet gånger sig själv.
c) Skriv en funktion som lämnar tillbaka det minne som allokerats med hjälp av
allocArray.
a)
int *allocArray(int length) {
return (int *)calloc(length, sizeof(int));
}
b)
void sum(int *array, int length, int *sumNumbers, int
*sumSquares) {
int i;
*sumNumbers = 0;
*sumSquares = 0;
for(i = 0; i < length; i++) {
*sumNumbers += array[i];
*sumSquares += array[i] * array[i];
}
}
c)
void freeArray(int *array) {
free(array);
}
Kodnummer: _________________
UPPGIFT 7 (4 poäng)
Betrakta följande C-funktion:
void printStrings(char strings[][10], int length) {
if(length <= 0) {
printf("");
} else {
printStrings(&(strings[1]), length - 1);
printf("%s ", strings[0]);
}
}
strings, som används i anropet till printStrings, är en array med strängar och
length anger hur många av arrayelementen som innehåller giltiga strängar. Följande
textsträngar (avslutade med ’\0’-tecken) finns lagrade i strings:





strings[0]: ”Nu”
strings[1]: ”är”
strings[2]: ”det”
strings[3]: ”äntligen”
strings[4]: ”fredag!”
Vad kommer att skrivas ut vid följande anrop?
printStrings(strings, 5)
Svar:
fredag! äntligen det är Nu