Programmeringsmetodik: Lösningar till tentamen 2011-08-18

Observera att detta är ett förslag på lösningar. Det finns andra lösningar som också är korrekta.

1. Uppgift för betyget 3 respektive G

Ladda ner: avstandskoll-1.c

/* avstandskoll.c */

#include <stdio.h>
#include <string.h>
#include <math.h>
#include "tatorter.h"
#include "avstand.h"

#ifdef _WIN32
    #include <conio.h>
#endif

int main(void) {
    int a; /* Används som index i avståndsarrayen */
    int t; /* Används som index i tätortsarrayen */

    /* Gå igenom alla avstånd i avståndsarrayen */
    for (a = 0; a < antal_avstand; ++a) {
        int startortsindex = -1;
        int slutortsindex = -1;

        /* Leta rätt på startplatsens index i tätortsarrayen */
        for (t = 0; t < antal_tatorter && startortsindex == -1; ++t) {
            if (strcmp(tatorter[t].namn, avstand[a].startort) == 0)
                startortsindex = t;
        }

        /* Leta rätt på slutplatsens index i tätortsarrayen */
        for (t = 0; t < antal_tatorter && slutortsindex == -1; ++t) {
            if (strcmp(tatorter[t].namn, avstand[a].slutort) == 0)
                slutortsindex = t;
        }

        /* Räkna ut och jämför med avståndet fågelvägen, om det går att räkna ut */
        if (startortsindex != -1 &&
            slutortsindex != -1 &&
            tatorter[startortsindex].latitud != -9999 &&
            tatorter[slutortsindex].latitud != -9999 &&
            tatorter[startortsindex].longitud != -9999 &&
            tatorter[slutortsindex].longitud != -9999) {

            /* Både startplatsen och slutplatsen fanns i tätortsarrayen, och alla fyra koordinatvärdena finns */
            double lat_diff = tatorter[startortsindex].latitud - tatorter[slutortsindex].latitud;
            double long_diff = tatorter[startortsindex].longitud - tatorter[slutortsindex].longitud;
            double formel_avstand = sqrt(57.03 * 57.03 * long_diff * long_diff + 111.40 * 111.40 * lat_diff * lat_diff);
            if (avstand[a].avstand < formel_avstand) {
                printf("Konstigt avstand: %s - %s, %d kilometer, är mindre än beräknade fågelvägen, %.2f kilometer.\n",
                       avstand[a].startort, avstand[a].slutort, avstand[a].avstand, formel_avstand);
            }
        }
    } /* för varje avstånd */

    #ifdef _WIN32
        printf("Tryck en tangent för att avsluta: ");
        _getch();
    #endif

    return 0;
}

2. Uppgift för betyget 4 respektive VG

Ingen lösning än.

3. Uppgift för betyget 5

Ingen lösning än.


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 18 augusti 2011