Programmering C: Lösningar till tentamen 2015-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) 3

b) 3

c) 2

d) 2.5

Uppgift 2 (2 p)

a = 5
b = 3
x = 6.0
y = 3.5
z = 1.0

Uppgift 3 (4 p)

/* uppgift-3.c */

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

#define PI 3.1415926535

int main(void) {
    double inkomst;

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

    while (inkomst != 0) {
        double x = inkomst;
        double skatt = x/2 + 1.0/2*sin(x/PI)*sqrt(x+1000);
        printf("Skatt: %f\n", skatt);
    
        printf("Ange årsinkomsten: ");
        scanf("%lf", &inkomst);
    }

    return 0;
}

Uppgift 4 (5 p)

/* uppgift-4.c */

#include <stdio.h>

int main(void) {
    int forsta, sista, tal, summa = 0;

    printf("Ge första talet: ");
    scanf("%d", &forsta);

    printf("Ge sista talet: ");
    scanf("%d", &sista);

    if (forsta > sista) {
        int temp = forsta;
        forsta = sista;
        sista = temp;
    }

    for (tal = forsta; tal <= sista; ++tal) {
        printf("%d", tal);
        if (tal != sista)
            printf(" + ");
        summa += tal;
    }

    printf(" = %d\n", summa);

    return 0;
}

Uppgift 5 (5 p)

/* uppgift-5.c */

#include <stdio.h>

int main(void) {
    double a[5];
    double procent;

    printf("Ge fem reella tal: ");
    for (int i = 0; i < 5; i++)
        scanf("%lf", &a[i]);

    printf("Ge ökning i procent: ");
    scanf("%lf", &procent);

    for (int i = 0; i < 5; i++)
        a[i] *= (1 + procent/100);

    printf("Ny array:");
    for (int i = 0; i < 5; i++)
        printf(" %.2f", a[i]);
    printf("\n");

    return 0;
}

Uppgift 6 (4 p)

a)
void rita_fyrkant(int r, int k) {
    for (int i = 0; i < r; ++i) {
        for (int j = 0; j < k; ++j) {
            printf("*");
        }
        printf("\n");
    }
}
b)
int main(void) {
    int r, k;
    printf("Antal rader: ");
    scanf("%d", &r);
    printf("Antal kolumner: ");
    scanf("%d", &k);
    rita_fyrkant(r, k);
    
    return 0;
}

Uppgift 7 (10 p)

/* uppgift-7.c */

#include <stdio.h>

#define MAX_PLANETNAMN 20
#define MAX_BESKRIVNING 30

struct Utryckning {
    char datum[10 + 1];
    char tid[5 + 1];
    char planet[MAX_PLANETNAMN + 1];
    char beskrivning[MAX_BESKRIVNING + 1];
};

struct Utryckning u = { "2210-08-12", "18:04", "Saturnus", "Fortkörning" };

void visa_utryckning(struct Utryckning* up) {
    printf("Datum: %s\n", up->datum);
    printf("Tid: %s\n", up->tid);
    printf("Plats: %s\n", up->planet);
    printf("Angående: %s\n", up->beskrivning);
}

void las_utryckning(struct Utryckning* up) {
    printf("Datum: ");
    scanf("%s", up->datum);
    printf("Tid: ");
    scanf("%s", up->tid);
    printf("Plats: ");
    scanf("%s", up->planet);
    /* Kasta radslutstecknet, så gets kan läsa nästa rad */
    while (getchar() != '\n')
        ;
    printf("Angående: ");
    gets(up->beskrivning); /* Jaja, vi vet! */
}

int main(void) {
    struct Utryckning u1, u2;

    printf("Mata in två utryckningar!\n");
    las_utryckning(&u1);
    las_utryckning(&u2);
    printf("De två utryckningarna:\n");
    visa_utryckning(&u1);
    visa_utryckning(&u2);

    return 0;
}

Uppgift 8 (3 p)

/* uppgift-8.c */

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

// Definitioner av struct Utryckning mm bortklippta

int main(void) {
    FILE *f;
    struct Utryckning u;

    printf("Mata in en utryckning!\n");
    las_utryckning(&u);

    f = fopen("utryckningar.txt", "a");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte öppna filen med utryckningar!\n");
        exit(EXIT_FAILURE);
    }

    fprintf(f, "%s %s %s %s\n", u.datum, u.tid, u.planet, u.beskrivning);
    fclose(f);

    return 0;
}

Uppgift 9 (6 p)

/* uppgift-9.c */

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

#define MAX_PLANETNAMN 20

struct Planet {
    char namn[MAX_PLANETNAMN + 1];
    int antal;
};


int main(void) {
    FILE *f;
    char sokt_planet[MAX_PLANETNAMN + 1];
    char last_planet[MAX_PLANETNAMN + 1];
    int antal_utryckningar = 0;

    printf("Ange namnet på en planet: ");
    scanf("%s", sokt_planet);

    f = fopen("utryckningar.txt", "r");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte öppna filen med utryckningar!\n");
        exit(EXIT_FAILURE);
    }

    while (fscanf(f, "%*s %*s %s %*[^\n]", last_planet) != EOF)
        if (strcmp(sokt_planet, last_planet) == 0)
            ++antal_utryckningar;
    fclose(f);

    printf("Antal utryckningar till %s: %d\n", sokt_planet, antal_utryckningar);

    return 0;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 28 maj 2015