Programmering C: Lösningar till tentamen 2010-01-16

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) 0

b) -1

c) 3

d) 3.5

Uppgift 2 (1 p)

x = 4.0, y = 2.0, z = 8.0

Uppgift 3 (1 p)

printf("x = %f, y = %f, z = %f\n", x, y, z);

Uppgift 4 (2 p)

a) x = 3.14, y = 6.28, z = 6.28

b) Både p1 och p2 pekar på variabeln y.

Uppgift 5 (2 p)

double max3(double d1, double d2, double d3) {
    if (d1 >= d2 && d1 >= d3)
        return d1;
    else if (d2 >= d3)
        return d2;
    else
        return d3;
}

Uppgift 6 (3 p)

double arraymax(double a[], int n) {
    double max = a[0];
    for (int i = 1; i < n; ++i)
        if (a[i] > max)
            max = a[i];
    return max;
}

Uppgift 7 (3 p)

int main(void) {
    printf("max3(7.0, 7.1, -13.3) = %f\n", max3(7.0, 7.1, -13.3));
    double a[] = { 3.9, 2.9, -10.1, 9.1, 9.2, 9.3, 9.2, 9.1, -1000 };
    printf("arraymax(a, sizeof(a)/sizeof(a[0])) = %f\n",
           arraymax(a, sizeof(a)/sizeof(a[0])));
    return 0;
}

Uppgift 8 (1 p)

struct Monster {
    char namn[10 + 1];
    double tuffhet;
    int antal_tander;
};

Uppgift 9 (1 p)

struct Monster monstret = { "Uschlo", 12.5, 300 };

Uppgift 10 (2 p)

void visa_monster(struct Monster m) {
    printf("Namn: %s\n", m.namn);
    printf("Tuffhet: %.2f\n", m.tuffhet);
    printf("Tänder: %d\n", m.antal_tander);
}

Uppgift 11 (2 p)

void las_monster(struct Monster *mp) {
    printf("Namn: ");
    scanf("%s", mp->namn);
    printf("Tuffhet: ");
    scanf("%lf", &mp->tuffhet);
    printf("Tänder: ");
    scanf("%d", &mp->antal_tander);
}

Uppgift 12 (1 p)

int lever(struct Monster m) {
    return m.tuffhet >= 0;
}

Uppgift 13 (3 p)

void attackera(struct Monster *aggressorp, struct Monster *offerp) {
    if (rand() % 2 == 0)
        offerp->tuffhet -= aggressorp->antal_tander;
}

Uppgift 14 (4 p)

int main(void) {
    struct Monster monster1, monster2;

    srand((unsigned int)time((time_t*)NULL));

    las_monster(&monster1);
    las_monster(&monster2);

    attackera(&monster1, &monster2);
    attackera(&monster2, &monster1);

    if (lever(monster1))
        visa_monster(monster1);
    if (lever(monster2))
        visa_monster(monster2);

    return EXIT_SUCCESS;
}

Uppgift 15 (4 p)

#include <stdlib.h>
#include <stdio.h>

// Definition av "struct Monster" och funktionen "las_monster"

int main(void) {
    FILE *f;
    int antal_monster;

    f = fopen("monster.txt", "w");
    if (f == NULL) {
        printf("Kunde inte skriva filen 'monster.txt'.\n");
        exit(EXIT_FAILURE);
    }

    printf("Hur många monster vill du mata in? ");
    scanf("%d", &antal_monster);

    for (int i = 0; i < antal_monster; ++i) {
        struct Monster m;
        las_monster(&m);
        fprintf(f, "%s %f %d\n", m.namn, m.tuffhet, m.antal_tander);
    }
    fclose(f);
    return EXIT_SUCCESS;
}

Uppgift 16 (9 p)

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#define MAX_ANTAL_MONSTER 1000

// Definition av "struct Monster", "visa_monster", "lever" och "attackera"

int main(void) {
    FILE *f;
    struct Monster monster[MAX_ANTAL_MONSTER];
    int antal_monster = 0;
    struct Monster m;

    srand((unsigned int)time((time_t*)NULL));

    f = fopen("monster.txt", "r");
    if (f == NULL) {
        printf("Kunde inte läsa filen 'monster.txt'.\n");
        exit(EXIT_FAILURE);
    }
    while (fscanf(f, "%s %lf %d", m.namn, &m.tuffhet, &m.antal_tander) == 3) {
        if (antal_monster >= MAX_ANTAL_MONSTER) {
            printf("Varning: För många monster. Resten ignoreras.\n");
            break;
        }
        monster[antal_monster++] = m;
    }
    fclose(f);

    while (antal_monster > 1) {
        int aggressor = rand() % antal_monster;
        int offer;
        do
            offer = rand() % antal_monster;
        while (offer == aggressor);
        attackera(&monster[aggressor], &monster[offer]);
        if (!lever(monster[offer])) {
            printf("Glufs! %s dödade %s.\n",
                   monster[aggressor].namn, monster[offer].namn);
            monster[offer] = monster[antal_monster - 1];
            --antal_monster;
        }
    }

    visa_monster(monster[0]);

    return EXIT_SUCCESS;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 7 januari 2010