Programmering C: Lösningar till tentamen 2008-01-19

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

b) 7

c) 7

Uppgift 2 (1 p)

a = 1, b = 10, c = 1

Uppgift 3 (1 p)

int temp;
temp = a;
a = b;
b = temp;

Uppgift 4 (4 p)

a) (2p)
double f(double x, double y, double z) {
    return pow(sqrt(x - y) + sqrt(x - z), 2);
}
b) (2p)
int main(void) {
    double x, y, z;

    printf("Ange x: ");
    scanf("%lf", &x);
    printf("Ange y: ");
    scanf("%lf", &y);
    printf("Ange z: ");
    scanf("%lf", &z);

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

    return 0;
}

Uppgift 5 (4 p)

a) (1p)
struct LOK {
    int nummer;
    int vikt;
};
b) (1p)
struct VAGN {
    int tomvikt;
    int lastvikt;
};
c) (2p)
#define MAX_VAGNAR 100

struct TAG {
    struct LOK loket;
    int antal_vagnar;
    struct VAGN vagnarna[MAX_VAGNAR];
};

Uppgift 6 (1 p)

struct LOK ett_lok = { 100, 110 };

Uppgift 7 (4 p)

a) (1p)
void visa_lok(struct LOK loket) {
    printf("Lok nummer %d, som väger %d ton.\n",
           loket.nummer, loket.vikt);
}
b) (1p)
void visa_vagn(struct VAGN vagnen) {
    printf("En vagn som själv väger %d ton, och har %d ton last.\n",
           vagnen.tomvikt, vagnen.lastvikt);
}
c) (2p)
void visa_tag(struct TAG taget) {
    printf("Här börjar tåget.\n");
    visa_lok(taget.loket);
    for (int i = 0; i < taget.antal_vagnar; ++i)
        visa_vagn(taget.vagnarna[i]);
    printf("Här slutar tåget.\n");
}

Uppgift 8 (1 p)

int vagnvikt(struct VAGN vagnen) {
    return vagnen.tomvikt + vagnen.lastvikt;
}

Uppgift 9 (2 p)

int tagvikt(struct TAG taget) {
    int summan;
    summan = taget.loket.vikt;
    for (int i = 0; i < taget.antal_vagnar; ++i)
        summan += vagnvikt(taget.vagnarna[i]);
    return summan;
}

Uppgift 10 (3 p)

void spara_tag(struct TAG taget, char* filnamn) {
    FILE* f;
    if ((f = fopen(filnamn, "w")) == NULL) {
        fprintf(stderr, "Kunde inte spara tåget på filen '%s'.\n",
                filnamn);
        exit(EXIT_FAILURE);
    }
    fprintf(f, "%d %d\n", taget.loket.nummer, taget.loket.vikt);
    fprintf(f, "%d\n", taget.antal_vagnar);
    for (int i = 0; i < taget.antal_vagnar; ++i)
        fprintf(f, "%d %d\n",
                taget.vagnarna[i].tomvikt,
                taget.vagnarna[i].lastvikt);
    fclose(f);
}

Uppgift 11 (4 p)

struct TAG las_tag(char* filnamn) {
    struct TAG taget;
    FILE* f;
    if ((f = fopen(filnamn, "r")) == NULL) {
        fprintf(stderr, "Kunde inte läsa tåget från filen '%s'.\n",
                filnamn);
        exit(EXIT_FAILURE);
    }
    fscanf(f, "%d %d", &taget.loket.nummer, &taget.loket.vikt);
    fscanf(f, "%d", &taget.antal_vagnar);
    for (int i = 0; i < taget.antal_vagnar; ++i)
        fscanf(f, "%d %d\n",
               &taget.vagnarna[i].tomvikt,
               &taget.vagnarna[i].lastvikt);
    fclose(f);
    return taget;
}

Uppgift 12 (4 p)

Alternativ 1:
int main(void) {
    struct TAG taget;

    taget.loket.nummer = 100;
    taget.loket.vikt = 110;
    taget.antal_vagnar = 3;
    taget.vagnarna[0].tomvikt = 4;
    taget.vagnarna[0].lastvikt = 10;
    taget.vagnarna[1].tomvikt = 4;
    taget.vagnarna[1].lastvikt = 20;
    taget.vagnarna[2].tomvikt = 5;
    taget.vagnarna[2].lastvikt = 3;

    spara_tag(taget, "tåg.txt");

    struct TAG andra_taget;
    andra_taget = las_tag("tåg.txt");
    visa_tag(andra_taget);

    return 0;
}
Alternativ 2:
int main(void) {
    struct TAG taget = { { 10, 110 },
                         3,
                         { { 4, 10 }, { 4, 20 }, { 5, 3 } } };

    spara_tag(taget, "tåg.txt");
    struct TAG andra_taget;
    andra_taget = las_tag("tåg.txt");
    visa_tag(andra_taget);

    return 0;
}

Uppgift 13 (5 p)

#include <stdio.h>
#include <:string.h>

void skriv_baklanges(char* s) {
    for (int i = strlen(s) - 1; i >= 0; --i)
        putchar(s[i]);
    putchar('\n');
}

int main(void) {
    char s1[80 + 1 + 1];
    char s2[80 + 1 + 1];

    fgets(s1, sizeof s1, stdin);
    s1[strlen(s1) - 1] = '\0';
    fgets(s2, sizeof s2, stdin);
    s2[strlen(s2) - 1] = '\0';

    if (strlen(s1) > strlen(s2))
        skriv_baklanges(s1);
    else
        skriv_baklanges(s2);

    return 0;
}

Uppgift 14 (5 p)

#include <stdio.h>
#include <string.h>

int main(void) {
    char ops[] = "+-*/%";
    int nops = strlen(ops);

    for (int op1 = 0; op1 < nops; ++op1) {
        for (int op2 = 0; op2 < nops; ++op2) {
            for (int op3 = 0; op3 < nops; ++op3) {
                printf("1 %c 2 %c 3 %c 4\n",
                       ops[op1], ops[op2], ops[op3]);
            }
        }
    }

    return 0;
}


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se) 13 mars 2008