Programmering C: Lösningar till tentamen 2014-06-04

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. Dessutom har det inträffat i världshistorien att lärare skrivit fel i lösningsförslagen.

Uppgift 1 (1 p)

a) 2

b) 2

c) 1

d) 0

Uppgift 2 (2 p)

x = 4.1, y = 2.2, z = 2.3, t = 3.3

Uppgift 3 (2 p)

#include <stdio.h>

int main(void) {
    double tum;
    printf("Ange längden i tum: ");
    scanf("%lf", &tum);
    printf("Det är %f cm.\n", tum * 2.54);
    return 0;
}

Uppgift 4 (3 p)

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

int main(void) {
    double kroppsvikt;
    printf("Ange patientens kroppsvikt: ");
    scanf("%lf", &kroppsvikt);
    int tabletter = kroppsvikt * 60 / 500;
    printf("Ta inte mer än %d tabletter!\n", tabletter);
    return 0;
}

Uppgift 5 (1 p)

Jämförelsen a[in_rest] > a[smallest_in_rest] ska tvärtom vara a[in_rest] < a[smallest_in_rest]. Som det är nu sorterar funktionen arrayen i fallande ordning och inte stigande.

Uppgift 6 (3 p)

#define MAX_NUMBERS 1000

int main(void) {
    int a[MAX_NUMBERS];
    int nr_numbers;
    int i;
    int nr_in_result;

    printf("Antal heltal? ");
    scanf("%d", &nr_numbers);
    while (nr_numbers < 0 || nr_numbers >= MAX_NUMBERS) {
        printf("Nej! Gör om!\n");
        printf("Antal heltal? ");
        scanf("%d", &nr_numbers);
    }

    for (i = 0; i < nr_numbers; ++i) {
        printf("Ange tal %d: ", i + 1);
        scanf("%d", &a[i]);
    }

    sort_array(a, nr_numbers);

    if (nr_numbers < 7)
        nr_in_result = nr_numbers;
    else
        nr_in_result = 7;

    printf("De minsta talen:\n");
    for (i = 0; i < nr_in_result; ++i) {
        printf("%d\n", a[i]);
    }

    return 0;
}

Kommentarer: Den här implementationen gör mer felkontroller än vad som krävs i uppgiften. I modernare C kan man använda en array med variabel storlek: int a[nr_numbers];

Uppgift 7 (10 p)

a) (2p)
#define MAX_NAMNLANGD 35

struct Tatort {
    int kod;
    char namn[MAX_NAMNLANGD + 1];
    char kommun[MAX_NAMNLANGD + 1];
    int folkmangd;
};

b) (1p)

struct Tatort tatorten = { 6076, "Odensbacken", "Örebro kommun", 1374 };

c) (2p)

void visa_tatort(struct Tatort t) {
    printf("Kod: %d\n", t.kod);
    printf("Namn: %s\n", t.namn);
    printf("Kommun: %s\n", t.kommun);
    printf("Folkmängd: %d\n", t.folkmangd);
}

d) (3p)

void las_tatort(struct Tatort *tp) {
    printf("Ange tätortens kod: ");
    scanf("%d", &tp->kod);
    while (getchar() != '\n')
        ;
    printf("Ange tätortens namn: ");
    gets(tp->namn); // Använd inte gets på riktigt!
    printf("Ange kommunens namn: ");
    gets(tp->kommun); // Använd inte gets på riktigt!
    printf("Ange tätortens folkmängd: ");
    scanf("%d", &tp->folkmangd);
    while (getchar() != '\n')
        ;
}

e) (2p)

int main(void) {
    struct Tatort t1, t2;

    las_tatort(&t1);
    las_tatort(&t2);

    if (strlen(t1.namn) > strlen(t2.namn))
        visa_tatort(t1);
    else
        visa_tatort(t2);

    return 0;
}

Uppgift 8 (3 p)

a) En enda rad med tio stjärnor, och fyra tomma rader

b) Sex rader med elva stjärnor på varje

c) Rätt: Fem rader med tio stjärnor på varje

Uppgift 9 (5 p)

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

int main(void) {
    FILE *udda, *jamna;
    int tal;

    udda = fopen("udda.txt", "w");
    if (udda == NULL) {
        fprintf(stderr, "Kunde inte skriva filen 'udda.txt'.\n");
        exit(EXIT_FAILURE);
    }
    jamna= fopen("jamna.txt", "w");
    if (jamna == NULL) {
        fprintf(stderr, "Kunde inte skriva filen 'jamna.txt'.\n");
        exit(EXIT_FAILURE);
    }

    printf("Skriv heltal. Avsluta med talet noll.\n");
    scanf("%d", &tal);
    while (tal != 0) {
        if (tal % 2 == 0)
            fprintf(jamna, "%d\n", tal);
        else
            fprintf(udda, "%d\n", tal);
        scanf("%d", &tal);
    }
    fclose(jamna);
    fclose(udda);

    return EXIT_SUCCESS;
}

Uppgift 10 (5 p)

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

int main(void) {
    int antal_jamna = 0;
    int antal_udda = 0;
    int tal;
    FILE *jamna = fopen("jamna.txt", "r");
    if (jamna == NULL) {
        fprintf(stderr, "Kunde inte läsa filen 'jamna.txt'.\n");
        exit(EXIT_FAILURE);
    }
    while (fscanf(jamna, "%d", &tal) == 1)
        ++antal_jamna;
    fclose(jamna);
    FILE *udda = fopen("udda.txt", "r");
    if (udda == NULL) {
        fprintf(stderr, "Kunde inte läsa filen 'udda.txt'.\n");
        exit(EXIT_FAILURE);
    }
    while (fscanf(udda, "%d", &tal) == 1)
        ++antal_udda;
    fclose(udda);
    if (antal_jamna > antal_udda)
        printf("Flest jämna tal.\n");
    else if (antal_jamna < antal_udda)
        printf("Flest udda tal.\n");
    else
        printf("Lika många udda och jämna tal.\n");

    return EXIT_SUCCESS;
}

Kommentar: Den här implementationen gör mer felkontroller än vad som krävs i uppgiften.


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 18 juni 2014