Programmering C: Lösningar till tentamen 2015-02-28

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

c) -1

d) 8

Uppgift 2 (2 p)

a[0] = 1
a[1] = 2
a[2] = 3
b = 3
c = 0

Uppgift 3 (4 p)

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

int main(void) {
    double inkomst;

    printf("Ange årsinkomsten: ");
    scanf("%lf", &inkomst);

    while (inkomst != 0) {
        double skatt;
        if (inkomst <= 100000)
            skatt = 0;
        else
            skatt = (inkomst - 100000) * 0.50;
        printf("Skatt: %f\n", skatt);
    
        printf("Ange årsinkomsten: ");
        scanf("%lf", &inkomst);
    }

    return 0;
}

Uppgift 4 (5 p)

a) 3

b) 4

c) 3

d) 0

e) 3

f) 43000

g) 1

h) 2

i) 3

j) Oändligt många. Loopen tar aldrig slut.

Uppgift 5 (10 p)

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

struct Cirkel {
    double centrum_x;
    double centrum_y;
    double radie;
};

struct Cirkel stora_cirkeln = { 1, 3, 1 };

#define PI 3.14159265358979323846

double area(struct Cirkel c) {
    return PI * c.radie * c.radie;
}

double centrumavstand(struct Cirkel c1, struct Cirkel c2) {
    return sqrt(pow(c1.centrum_x - c2.centrum_x, 2) +
                pow(c1.centrum_y - c2.centrum_y, 2));
}

double avstand(struct Cirkel c1, struct Cirkel c2) {
    return centrumavstand(c1, c2) - c1.radie - c2.radie;
}

int main(void) {
    struct Cirkel lilla_cirkeln = { 5, 4.9, 0.5 };

    printf("Stora cirkelns area: %f\n", area(stora_cirkeln));
    printf("Cirklarnas centrumavstånd: %f\n",
           centrumavstand(stora_cirkeln, lilla_cirkeln));
    printf("Cirklarnas kantavstånd: %f\n",
           avstand(stora_cirkeln, lilla_cirkeln));
    
    return 0;
}

Uppgift 6 (5 p)

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

void visa_array(int a[], int antal) {
    int antal_pa_raden = 0;
    for (int i = 0; i < antal; ++i) {
        printf(" %d", a[i]);
        if (++antal_pa_raden == 10 || i == antal - 1) {
            printf("\n");
            antal_pa_raden = 0;
        }
    }    
}

int main(void) {
    int a[47];
    printf("Ange 47 heltal:\n");
    for (int i = 0; i < 47; ++i)
        scanf("%d", &a[i]);
    printf("Talen, med tio per rad:\n");
    visa_array(a, 47);
    
    return 0;
}

Uppgift 7 (5 p)

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

int main(void) {
    int avsluta = 0;

    while (!avsluta) {
        printf("Kommando: ");
        char kommando[20]; // Vi bara antar att inmatningen får plats
        scanf("%s", kommando);
        if (strcmp(kommando, "avsluta") == 0 || strcmp(kommando, "quit") == 0) {
            avsluta = 1;
        }
        else if (strcmp(kommando, "stjärnor") == 0) {
            int antal;
            printf("Ange antalet stjärnor: ");
            scanf("%d", &antal);
            for (int i = 0; i < antal; ++i)
                printf("*");
            printf("\n");
        }
        else if (strcmp(kommando, "plus") == 0) {
            double tal1, tal2;
            printf("Ange ena talet: ");
            scanf("%lf", &tal1);
            printf("Ange andra talet: ");
            scanf("%lf", &tal2);
            printf("Summan: %f\n", tal1 + tal2);
            printf("\n");
        }
        else {
            printf("Felaktigt kommando. Försök igen!\n");
        }
    }
    
    return 0;
}

Uppgift 8 (8 p)

a)

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

int main(void) {
    FILE *f = fopen("cirklar.txt", "w");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte öppna filen 'cirklar.txt'\n");
        exit(EXIT_FAILURE);
    }
    srand(time(NULL));
    int antal_cirklar = 1 + rand() % 1000000; // Mellan ett och en miljon
    for (int i = 0; i < antal_cirklar; ++i) {
        double centrum_x = rand() % 1000000 / 10000.0 - 50.0;
        double centrum_y = rand() % 1000000 / 10000.0 - 50.0;
        double radie = rand() % 1000000 / 100000.0;
        fprintf(f, "%f %f %f\n", centrum_x, centrum_y, radie);
    }
    fclose(f);

    return EXIT_SUCCESS;
}

b)

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

// Definitioner av struct Cirkel, PI och area

int main(void) {
    FILE *f = fopen("cirklar.txt", "r");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte öppna filen 'cirklar.txt'\n");
        exit(EXIT_FAILURE);
    }
    double max_area = 0;
    struct Cirkel c;
    while (fscanf(f, "%lf %lf %lf\n",
                  &c.centrum_x, &c.centrum_y, &c.radie) == 3) {
        double denna_area = area(c);
        if (denna_area > max_area)
            max_area = denna_area;
    }
    fclose(f);
    printf("Största arean: %f\n", max_area);

    return EXIT_SUCCESS;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 22 februari 2015