Programmering C: Lösningar till tentamen 2010-05-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.

Uppgift 1 (1 p)

a) 3

b) 2

c) 1

Uppgift 2 (1 p)

alpha = 3, bravo = 3, charlie = 3

Uppgift 3 (1 p)

struct Radio {
    double effekt;
    double frekvens;
    double kanslighet;
    double latitud;
    double longitud;
};

Uppgift 4 (1 p)

struct Radio radion = { 1.5, 75.95, 0.13, 59.25393, 15.24727 };

Uppgift 5 (2 p)

void visa_radio(struct Radio *rp) {
    printf("Effekt: %f\n", rp->effekt);
    printf("Frekvens: %f\n", rp->frekvens);
    printf("Känslighet: %f\n", rp->kanslighet);
    printf("Position: lat %f, long %f\n", rp->latitud, rp->longitud);
}

Uppgift 6 (2 p)

void las_radio(struct Radio *rp) {
    printf("Ange radions effekt: ");
    scanf("%lf", &rp->effekt);
    printf("Ange frekvens: ");
    scanf("%lf", &rp->frekvens);
    printf("Ange känslighet: ");
    scanf("%lf", &rp->kanslighet);
    printf("Ange latitud: ");
    scanf("%lf", &rp->latitud);
    printf("Ange longitud: ");
    scanf("%lf", &rp->longitud);
}

Uppgift 7 (2 p)

double avstand(struct Radio r1, struct Radio r2) {
    return sqrt(pow(57.03*(r1.longitud - r2.longitud), 2) + pow(111.40*(r1.latitud - r2.latitud), 2));
}

Uppgift 8 (1 p)

int kan_kommunicera(struct Radio r1, struct Radio r2) {
    return avstand(r1, r2) < 5;
}

Uppgift 9 (3 p)

int main(void) {
    struct Radio radio1, radio2;
    las_radio(&radio1);
    las_radio(&radio2);
    if (kan_kommunicera(radio1, radio2))
        printf("De kan kommunicera.\n");
    else
        printf("De kan inte kommunicera.\n");
    return 0;
}

Uppgift 10 (5 p)

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

/* Definitioner av posten struct Radio och funktionen las_radio */

int main(void) {
    FILE* f = fopen("radiosar.txt", "w");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte skriva filen 'radiosar.txt'.\n");
        exit(EXIT_FAILURE);
    }
    printf("Mata in radioapparater. Avsluta med en radio med effekten 0.\n");
    printf("\n");
    struct Radio r;
    las_radio(&r);
    while (r.effekt > 0) {
        fprintf(f, "%f %f %f %f %f\n", r.effekt, r.frekvens, r.kanslighet, r.latitud, r.longitud);
        las_radio(&r);    
    }
    fclose(f);
    return EXIT_SUCCESS;
}

Uppgift 11 (5 p)

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

/* Definitioner av posten struct Radio och funktionerna las_radio, avstand och kan_kommunicera */

int main(void) {
    printf("Mata in en radioapparat!\n");
    struct Radio basstationen;
    las_radio(&basstationen);
    FILE* f = fopen("radiosar.txt", "r");
    if (f == NULL) {
        fprintf(stderr, "Kunde inte läsa filen 'radiosar.txt'.\n");
        exit(EXIT_FAILURE);
    }
    struct Radio r;
    int antal_som_kan_kommunicera = 0;
    while (fscanf(f, "%lf %lf %lf %lf %lf", &r.effekt, &r.frekvens, &r.kanslighet, &r.latitud, &r.longitud) == 5) {
        if (kan_kommunicera(basstationen, r))
            ++antal_som_kan_kommunicera;
    }
    fclose(f);
    printf("Antal som kan kommunicera: %d\n", antal_som_kan_kommunicera);
    return EXIT_SUCCESS;
}

Uppgift 12 (5 p)

Om man kommer ihåg funktionen fabs kan man skriva så här:
#include <stdio.h>
#include <math.h>

int main() {
    double t1, t2;
    printf("Ge två temperaturer: ");
    scanf("%lf %lf", &t1, &t2);
    while (t1 != 0.0 && t2 != 0.0) {
        if (fabs(t1 - t2) > 2.5)
            printf("Differensen är %f grader! För hög!\n", fabs(t1 - t2));
        else
            printf("Temperaturerna OK!\n");
        scanf("%lf %lf", &t1, &t2);
    }
    return 0;
}
Om man inte kommer ihåg funktionen fabs kan man skriva så här i stället:
#include <stdio.h>

int main() {
    double t1, t2;
    printf("Ge två temperaturer: ");
    scanf("%lf %lf", &t1, &t2);
    while (t1 != 0.0 && t2 != 0.0) {
        double differens;
        if (t1 > t2)
            differens = t1 - t2;
        else
            differens = t2 - t1;
        if (differens > 2.5)
            printf("Differensen är %f grader! För hög!\n", differens);
        else
            printf("Temperaturerna OK!\n");
        scanf("%lf %lf", &t1, &t2);
    }
    return 0;
}

Uppgift 13 (6 p)

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

int main() {
    char personnummer[13 + 2]; /* 19631211-1658 = 13 positioner, plus  och \0 */
    int personer[2011]; /* Slöseri med plats, men det blir enklare så! */
    for (int i = 1900; i < 2011; ++i)
        personer[i] = 0;
    printf("Ange ett personnummer (avsluta med tom rad): ");
    fgets(personnummer, sizeof personnummer, stdin);
    while (personnummer[0] != '\n') {
        int artal;
        sscanf(personnummer, "%4d", &artal);
        ++personer[artal];
        printf("Ange ett personnummer (avsluta med tom rad): ");
        fgets(personnummer, sizeof personnummer, stdin);
    }
    int max_ar = 1900;
    for (int i = 1901; i < 2011; ++i)
        if (personer[i] > personer[max_ar])
            max_ar = i;
    printf("Flest personer var födda %d.\n", max_ar);
    return 0;
}
Kommentarer:


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 18 maj 2010