Programmering C: Lösningar till tentamen 2014-08-21

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

b) -4

c) 1

d) 1

Uppgift 2 (2 p)

x = 3.0, y = 3.0, z = 3.0

Uppgift 3 (3 p)

#include <stdio.h>

int main(void) {
    int grans;
    int antal_mindre = 0;
    int antal_storre = 0;
    int inmatat;

    printf("Gräns: ");
    scanf("%d", &grans);
    
    do {
        printf("Tal: ");
        scanf("%d", &inmatat);
        if (inmatat < grans)
            ++antal_mindre;
        if (inmatat > grans)
            ++antal_storre;
    } while (inmatat != grans);

    printf("Antal mindre: %d\n", antal_mindre);
    printf("Antal större: %d\n", antal_storre);

    return 0;
}

Uppgift 4 (3 p)

void replace_char(char s[], char gamla, char nya) {
    int n = strlen(s);
    for (int i = 0; i < n; ++i)
        if (s[i] == gamla)
            s[i] = nya;
}
En annan lösning för den som tycker om pekare:
void replace_char_2(char *s, char gamla, char nya) {
    while (*s != '\0') {
        if (*s == gamla)
            *s = nya;
        ++s;
    }
}

Uppgift 5 (3 p)

int main(void) {
    char rad[100];
    char gamla;
    char nya;

    printf("Skriv en rad: ");
    gets(rad);

    printf("Ange ett tecken som ska bytas ut: ");
    gamla = getchar();

    while (getchar() != '\n')
        ;

    printf("Ange det nya tecknet: ");
    nya = getchar();

    replace_char(rad, gamla, nya);

    printf("Resultat: %s\n", rad);

    return 0;
}

Uppgift 6 (6 p)

a)
int strlen(char *s) {
    int length = 0;
    while (s[length] != '\0') {
        ++length;
    }
    return length;
}
En annan lösning för den som tycker om pekare:
int strlen(char *s) {
    char *start = s;
    while (*s++ != '\0')
        ;
    return s - start;
}

En kommentar: Enligt C-standarden returnerar strlen en size_t och inte en int, men för enkelhets skull använder vi int här. Det är dock bara att byta till size_t om man vill.

b)

char *gets(char *s) {
    int length = 0;
    int c = getchar();
    while (c != '\n') {
        s[length] = c;
        ++length;
        c = getchar();
    }
    s[length] = '\0';
    return s;
}
c)
int getchar(void) {
    return getc(stdin);
}

Uppgift 7 (7 p)

a)
char spelplan[50][50];
b)
void visa_spelplanen(char spelplan[50][50]) {
    int min_rad = 50, max_rad = -1, min_kolumn = 50, max_kolumn = -1;

    // Börja med att hitta ytterlägena för markerade rutor
    for (int rad = 0; rad < 50; ++rad) {
        for (int kolumn = 0; kolumn < 50; ++kolumn) {
            if (spelplan[rad][kolumn] != '.') {
                if (rad < min_rad)
                    min_rad = rad;
                if (rad > max_rad)
                    max_rad = rad;
                if (kolumn < min_kolumn)
                    min_kolumn = kolumn;
                if (kolumn > max_kolumn)
                    max_kolumn = kolumn;
            }
        }
    }
    // Skriv ut den intressanta delen av spelplanen. Obs: <= och inte <
    for (int rad = min_rad; rad <= max_rad; ++rad) {
        for (int kolumn = min_kolumn; kolumn <= max_kolumn; ++kolumn) {
            putchar(spelplan[rad][kolumn]);
        }
        putchar('\n');
    }
}

Uppgift 8 (5 p)


....

Uppgift 9 (5 p)


....

Uppgift 10 (5 p)

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

int main(void) {
    int tal;
    int maxpoang[20];
    int antal_uppgifter = 0;
    int i;
    int denna_poang;
    int poangsumma = 0;

    srand(time(NULL));

    printf("Ange poängen på uppgifterna. Avsluta med talet noll.\n");
    scanf("%d", &tal);
    while (tal != 0) {
        maxpoang[antal_uppgifter++] = tal;
        scanf("%d", &tal);
    }

    printf("Tentaresultat:\n");
    for (i = 0; i < antal_uppgifter; ++i) {
        denna_poang = rand() % (maxpoang[i] + 1);
        printf("%d ", denna_poang);
        poangsumma += denna_poang;
    }
    printf("\n");
    printf("Summa: %d\n", poangsumma);

    return EXIT_SUCCESS;
}


Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se), 22 augusti 2014