Programmering C: Lösningar till tentamen 2015-01-17

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

b) 10

c) 10

d) 11

Uppgift 2 (2 p)

a = 2, b = 0, c = 3, d = 10

Uppgift 3 (5 p)

#include <stdio.h>

int main(void) {
    for (int i = 1; i <= 100; ++i) {
        if (i % 3 == 0 && i % 5 == 0)
            printf("FizzBuzz\n");
        else if (i % 3 == 0)
            printf("Fizz\n");
        else if (i % 5 == 0)
            printf("Buzz\n");
        else
            printf("%d\n", i);
    }

    return 0;
}

Uppgift 4 (4 p)

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

int main(void) {
    double x, y;

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

    double dividend = x - y;
    double divisor = (x + y) * (x + y);

    if (divisor == 0) {
        printf("x + y får inte vara noll.\n");
        exit(EXIT_FAILURE);
    }

    double radicand = dividend / divisor - 1;

    if (radicand < 0) {
        printf("Uttrycket under roten får inte vara negativt.\n");
        exit(EXIT_FAILURE);
    }

    double result = 3.0/4 * sqrt(radicand);

    printf("Resultat: %f\n", result);

    return EXIT_SUCCESS;
}

Uppgift 5 (5 p)

a)
double minmaxsum(double a[], int n) {
    double min, max;
    min = max = a[0];
    for (int i = 1; i < n; ++i) {
        if (a[i] < min)
            min = a[i];
        if (a[i] > max)
            max = a[i];
    }
    return min + max;
}
b)
int main(void) {
    double numbers[10];

    for (int i = 0; i < 10; ++i) {
        printf("Ange tal nummer %d: ", i + 1);
        scanf("%lf", &numbers[i]);
    }

    printf("Min-max-summan: %f\n", minmaxsum(numbers, 10));

    return 0;
}

Uppgift 6 (5 p)

a)
double same_but_reversed(char s1[], char s2[]) {
    int length1 = strlen(s1);
    int length2 = strlen(s2);
    if (length1 != length2)
        return 0;
    int pos1 = 0;
    int pos2 = length2 - 1;
    while (pos1 < length1) {
        if (s1[pos1] != s2[pos2])
            return 0;
        ++pos1;
        --pos2;
    }
    return 1;
}
b)
int main(void) {
    char line1[100+2], line2[100+2]; /* +2 because of '\n' and '\0' */

    printf("Skriv en rad: ");
    fgets(line1, sizeof line1, stdin);
    line1[strlen(line1) - 1] = '\0';

    printf("Skriv en rad till: ");
    fgets(line2, sizeof line2, stdin);
    line2[strlen(line2) - 1] = '\0';

    if (same_but_reversed(line1, line2))
        printf("Samma men baklänges!\n");
    else
        printf("Inte samma men baklänges!\n");

    return 0;
}

Uppgift 7 (8 p)

a)
struct Tatort {
    char namn[40 + 1];
    int folkmangd;
    double latitud;
    double longitud;
};
b)
struct Tatort stora_mellosa = { "Stora Mellösa", 776, 59.21, 15.50 };
c)
double genomsnittlig_folkmangd(struct Tatort tatorter[], int antal) {
    int summa = 0;
    for (int i = 0; i < antal; ++i)
        summa += tatorter[i].folkmangd;
    return (double)summa / antal;
}
d)
int main(void) {
    struct Tatort testorter[] = {
        { "Ort 1", 100, -15.2, 63.0 },
        { "En ort till", 0, 115.2, -77.0 },
        { "Tredje orten", 200, -15.2, 63.0 },
        { "Stora fjärde orten", 1000000, 0, 0 },
        { "Femte och sista stället", 1, 77, 77 },
        { "En sjätte ort som inte ska tas med!", 1, 77, 77 },
    };

    double observerat = genomsnittlig_folkmangd(testorter, 5);
    // double forvantat = (100+0+200+1000000+1) / 5.0; -- blir 200060.2

    printf("Resultat: %f\n", observerat);
    return 0;
}

Uppgift 8 (10 p)

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

int main(int argc, char *argv[]) {
    printf("Ange namnet på datorn eller webbplatsen: ");
    char namn[100 + 1];
    scanf("%s", namn);
    printf("Ange lösenordet: ");
    char losenord[100 + 1];
    scanf("%s", losenord);

    FILE *f = fopen("losenord.txt", "a");
    if (f == NULL) {
        printf("Det gick inte att öppna filen 'losenord.txt'.\n");
        exit(EXIT_FAILURE);
    }
    fprintf(f, "%s %s\n", namn, losenord);
    fclose(f);

    return 0;
}
b)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    printf("Ange namnet på datorn eller webbplatsen: ");
    char sokt_namn[100 + 1];
    scanf("%s", sokt_namn);

    FILE *f = fopen("losenord.txt", "r");
    if (f == NULL) {
        printf("Det gick inte att öppna filen 'losenord.txt'.\n");
        exit(EXIT_FAILURE);
    }

    int hittat = 0;
    char namn[100 + 1];
    char losenord[100 + 1];
    while (fscanf(f, "%s %s", namn, losenord) == 2) {
        if (strcmp(namn, sokt_namn) == 0) {
            printf("%s\n", losenord);
            hittat = 1;
        }
    }
    fclose(f);

    if (hittat == 0)
        printf("Finns inte.\n");

    return 0;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 21 januari 2015