Programmering C: Lösningar till tentamen 2014-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. Dessutom har det inträffat i världshistorien att lärare skrivit fel i lösningsförslagen.

Uppgift 1 (1 p)

Vilka värden har följande C-uttryck?

a) 3

b) 3

c) 1

d) 0.5

Uppgift 2 (2 p)

a =3, b = 2, c = 3, d = 5

Uppgift 3 (4 p)

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

int main(void) {
    char rad[100];
    int antal_luftpistol = 0;
    int antal_godis = 0;

    printf("Skriv ett ord per rad. Avsluta med ordet \"klar\".\n");
    gets(rad); // Jaja, vi vet.
    while (strcmp(rad, "klar") != 0) {
        if (strcmp(rad, "luftpistol") == 0)
            ++antal_luftpistol;
        if (strcmp(rad, "godis") == 0)
            ++antal_godis;
        gets(rad); // Jaja, vi vet.
    }

    printf("Antal \"luftpistol\": %d\n", antal_luftpistol);
    printf("Antal \"godis\": %d\n", antal_godis);
    
    return 0;
}

Uppgift 4 (3 p)

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

int main(void) {
    int antal_sidor;
    int resultat;

    printf("Hur många sidor har tärningen? ");
    scanf("%d", &antal_sidor);

    srand(time(NULL)); // Ger pseudoslumptalsgeneratorn ett startvärde
    resultat = rand() % antal_sidor + 1;

    printf("Resultat: %d\n", resultat);

    return 0;
}

Uppgift 5 (1 p)

struct Komplex {
    double re;
    double im;
};

Uppgift 6 (1 p)

struct Komplex k = { 7.4, 2 };

Uppgift 7 (3 p)

void visa_komplex(struct Komplex k) {
    if (k.im == 0)
        printf("%.2f", k.re);
    else if (k.re == 0)
        printf("%.2fi", k.im);
    else
        printf("%.2f + %.2fi", k.re, k.im);
}

Uppgift 8 (3 p)

struct Komplex las_komplex(void) {
    struct Komplex resultat;

    printf("Realdelen: ");
    scanf("%lf", &resultat.re);
    printf("Imaginärdelen: ");
    scanf("%lf", &resultat.im);

    return resultat;
}

Uppgift 9 (2 p)

struct Komplex komplex_plus(struct Komplex k1, struct Komplex k2) {
    struct Komplex resultat;

    resultat.re = k1.re + k2.re;
    resultat.im = k1.im + k2.im;
    
    return resultat;
}

Uppgift 10 (3 p)

double belopp(struct Komplex k) {
    return sqrt(k.re * k.re + k.im * k.im);
}

Uppgift 11 (3 p)

int main(void) {
    struct Komplex tal1, tal2, summa;
    double beloppet;

    printf("Mata in två komplexa tal:\n");
    tal1 = las_komplex();
    tal2 = las_komplex();

    summa = komplex_plus(tal1, tal2);
    visa_komplex(summa);
    printf("\n");

    beloppet = belopp(summa);
    printf("Absolutbeloppet är %.2f.\n", beloppet);

    return 0;
}

Uppgift 12 (3 p)

struct Komplex komplex_summering(struct Komplex talen[], int antal) {
    struct Komplex summan = { 0, 0 };

    for (int i = 0; i < antal; ++i)
        summan = komplex_plus(summan, talen[i]);
    
    return summan;
}

Uppgift 13 (3 p)

int main(void) {
    struct Komplex a[] = { { 1, 10 }, { -2, -20 }, { 1.5, 15 } };
    struct Komplex summan;

    summan = komplex_summering(a, 3);
    if (summan.re != 0.5 || summan.im != 5)
        printf("Fel svar från komplex_summering!\n");

    return 0;
}

Uppgift 14 (4 p)

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

// Definitioner av struct Komplex och las_komplex

int main(void) {
    struct Komplex tal;
    FILE *tsut = fopen("komplexa.txt", "w");

    if (tsut == NULL) {
        fprintf(stderr, "Kunde inte skriva filen 'komplexa.txt'.\n");
        exit(EXIT_FAILURE);
    }

    printf("Mata in komplexa tal. Avsluta med talet 0 + 0i.\n");
    tal = las_komplex();
    while (tal.re != 0 || tal.im != 0) {
        fprintf(tsut, "%f %f\n", tal.re, tal.im);
        tal = las_komplex();
    }
    fclose(tsut);

    return EXIT_SUCCESS;
}

Uppgift 15 (4 p)

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

// Definitioner av struct Komplex, visa_komplex och komplex_plus

int main(void) {
    struct Komplex tal;
    struct Komplex summan = { 0, 0 };
    FILE *tsin = fopen("komplexa.txt", "r");

    if (tsin == NULL) {
        fprintf(stderr, "Kunde inte läsa filen 'komplexa.txt'.\n");
        exit(EXIT_FAILURE);
    }

    while (fscanf(tsin, "%lf %lf", &tal.re, &tal.im) == 2) {
        summan = komplex_plus(summan, tal);
    }    
    fclose(tsin);

    printf("Summan av talen på filen: ");
    visa_komplex(summan);
    printf("\n");

    return EXIT_SUCCESS;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 9 januari 2014