Programmering C: Lösningar till tentamen 2012-05-30

Observera att detta är förslag på lösningar. Det kan finnas andra lösningar som också är korrekta, och det kan hända att en del av lösningarna är mer omfattande än vad som krävs för full poäng på uppgiften. En del av lösningarna är kanske inte fullständiga, utan hänvisar bara till var man kan läsa svaret.

Uppgift 1 (1 p)

a) 2

b) 3

c) 3

d) -2

Uppgift 2 (1 p)

ali = 4, bodil = 4, charlie = 0

Uppgift 3 (3 p)

#include <stdio.h>

int main(void) {
    int fel = 0;

    for (int i = 0; i < 357; ++i) {
        printf("Ange tal nr %d:\n", i + 1);
        int talet;
        scanf("%d", &talet);
        if (talet >= 45)
            fel = 1;
    }
    if (fel)
        printf("För stort\n");
    else
        printf("Ok\n");
    
    return 0;
}

Uppgift 4 (2 p)

int inom_intervallet(double x, double min, double max) {
    return x >= min && x <= max;
}

Uppgift 5 (1 p)

int main(void) {
    double talet, min, max;

    printf("Ange talet: ");
    scanf("%lf", &talet);
    printf("Ange intervallets nedre gräns: ");
    scanf("%lf", &min);
    printf("Ange intervallets övre gräns: ");
    scanf("%lf", &max);

    int resultat = inom_intervallet(talet, min, max);
    printf("Resultat: %d\n", resultat);
    
    return 0;
}

Uppgift 6 (1 p)

struct Interval {
    double min;
    double max;
};

Uppgift 7 (2 p)


int inside_interval(double point, struct Interval *intervalp) {
    return inom_intervallet(point, intervalp->min, intervalp->max);
}

Uppgift 8 (3 p)

Ett förslag:

// Enda sättet som intervallen kan vara något annat än överlappande
// är om det ena intervallet (ip1) ligger antingen helt till vänster
// om det andra (ip2), eller helt till höger om det.
int overlapping_intervals(struct Interval *ip1, struct Interval *ip2) {
    return !(ip1->max < ip2->min || ip1->min > ip2->max);
}

Ett annat förslag:

int overlapping_intervals(struct Interval *ip1, struct Interval *ip2) {
    if (ip1->max < ip2->min)
        return 0; // ip1 ligger helt till vänster om ip2
    else if (ip1->min > ip2->max)
        return 0; // ip1 ligger helt till höger om ip2
    else
        return 1; // annars är de överlappande!
}

Kommentar: Det kan vara ganska komplicerat att få till villkoret rätt, så att alla olika sätt som de två intervallen kan förhålla sig till varandra på täcks in. Det finns många sätt att skriva funktionen. Ovanstående två lösningar är två varianter av samma sätt att tänka, som utgår från när intervallen inte är överlappande.

Uppgift 9 (3 p)

int inside_how_many_intervals(double point, struct Interval interval_array[], int nr_intervals) {
    int inside_count = 0;
    for (int i = 0; i < nr_intervals; ++i) {
        if (inside_interval(point, &interval_array[i])) {
            ++inside_count;
        }
    }
    return inside_count;
} // inside_how_many_intervals

Uppgift 10 (3 p)

int main(void) {
    struct Interval some_intervals[] = {
        { 1, 2 },
        { -2, -1 },
        { -1, 1 },
        { 0, 2 },
        { 0, 1 }
    };
    int nr_intervals = sizeof(some_intervals) / sizeof(some_intervals[0]);
    if (inside_how_many_intervals(0.5, some_intervals, nr_intervals) != 3)
        printf("Funktionen inside_how_many_intervals gav fel svar!\n");
    return 0;
}

Uppgift 11 (5 p)

....

Uppgift 12 (6 p)

....

Uppgift 13 (5 p)

....


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 22 mars 2012