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

b) 7

Uppgift 2 (1 p)

18

Uppgift 3 (1 p)

struct Rymdskepp {
    int nummer;
    char namn[10 + 1];
    int x, y;
    double maxfart;
};

Uppgift 4 (1 p)

struct Rymdskepp r = { 17, "Olle", 0, 0, 10.0 };

Uppgift 5 (1 p)

void visa_rymdskepp(struct Rymdskepp rymdskeppet) {
    printf("Nummer: %d\n", rymdskeppet.nummer);
    printf("Spelare: %s\n", rymdskeppet.namn);
    printf("Position: x = %d, y = %d\n", rymdskeppet.x, rymdskeppet.y);
    printf("Maxfart: %f\n", rymdskeppet.maxfart);
}

Uppgift 6 (2 p)

struct Rymdskepp las_rymdskepp() {
    struct Rymdskepp r;
    printf("Rymdskeppets nummer: ");
    scanf("%d", &r.nummer);
    while (getchar() != '\n')
	;
    printf("Spelarens namn: ");
    gets(r.namn); /* Använd inte gets i riktiga program! */
    printf("Position, y-koordinat: ");
    scanf("%d", &r.x);
    printf("Position, y-koordinat: ");
    scanf("%d", &r.y);
    printf("Maxfart: ");
    scanf("%lf", &r.maxfart);
    while (getchar() != '\n')
	;
    return r;
}

Uppgift 7 (2 p)

int krock(struct Rymdskepp rymdskepp1, struct Rymdskepp rymdskepp2) {
    return rymdskepp1.x == rymdskepp2.x && rymdskepp1.y == rymdskepp2.y;
}

Uppgift 8 (2 p)

int main(void) {
    struct Rymdskepp rymdskepp1, rymdskepp2;

    printf("Mata in data om rymdskepp nummer 1!\n");
    rymdskepp1 = las_rymdskepp();
    printf("Mata in data om rymdskepp nummer 2!\n");
    rymdskepp2 = las_rymdskepp();
    if (krock(rymdskepp1, rymdskepp2))
	printf("Rymdskeppen har krockat.\n");
    else
	printf("Rymdskeppen har inte krockat.\n");

    return 0;
}

Uppgift 9 (3 p)

int hinner(struct Rymdskepp rymdskeppet, int x, int y) {
    double avstand = sqrt(pow(rymdskeppet.x - x, 2) + pow(rymdskeppet.y - y, 2));
    return avstand <= rymdskeppet.maxfart;
}

Uppgift 10 (5 p)

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

int main(void) {
    char sokt_namn[10 + 1];
    printf("Ange namn: ");
    scanf("%s", sokt_namn); /* Undvik scanf("%s", ...) i riktiga program */
    FILE* f = fopen("namn.txt", "r");
    int antal = 0;
    char detta_namn[10 + 1];
    while (fscanf(f, "%s", detta_namn) == 1)
	if (strcmp(detta_namn, sokt_namn) == 0)
	    ++antal;
    printf("Antal %s: %d\n", sokt_namn, antal);
    return 0;
}

Uppgift 11 (5 p)

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

#define ANTAL 1000

int main(void) {
    int utfall[ANTAL];
    srand(time(NULL));
    for (int i = 0; i < ANTAL; ++i)
	utfall[i] = rand() % 6 + 1;
    int antal[7];
    for (int i = 1; i <= 6; ++i)
	antal[i] = 0;
    for (int i = 0; i < ANTAL; ++i)
	antal[utfall[i]]++;
    for (int i = 1; i <= 6; ++i)
	printf("Antal %d: %d\n", i, antal[i]);
    return 0;
}

Uppgift 12 (5 p)

En lösning med en binärfil blir enklast:
#include <stdlib.h>
#include <stdio.h>

    /* Vi upprepar inte definitionerna från de tidigare uppgifterna. */

int main(void) {
    struct Rymdskepp rymdskepp1, rymdskepp2;

    printf("Mata in data om rymdskepp nummer 1!\n");
    rymdskepp1 = las_rymdskepp();
    printf("Mata in data om rymdskepp nummer 2!\n");
    rymdskepp2 = las_rymdskepp();
    FILE* f = fopen("filen.bin", "wb");
    if (rymdskepp1.maxfart > rymdskepp2.maxfart)
	fwrite(&rymdskepp1, sizeof rymdskepp1, 1, f);
    else
	fwrite(&rymdskepp2, sizeof rymdskepp2, 1, f);
    fclose(f);
    return 0;
}

Uppgift 13 (5 p)

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

    /* Vi upprepar inte definitionerna från de tidigare uppgifterna. */

int main(void) {
    struct Rymdskepp rymdskepp[MAX_ANTAL], temp;
    int antal_rymdskepp = 0;
    int antal_krockar = 0;

    printf("Mata in rymdskepp. Avsluta med ett rymdskepp med nummer 0.\n");
    temp = las_rymdskepp();
    while (temp.nummer != 0) {
	rymdskepp[antal_rymdskepp++] = temp;
	printf("Mata in rymdskepp. Avsluta med ett rymdskepp med nummer 0.\n");
	temp = las_rymdskepp();
    }
    for (int x = 0; x < antal_rymdskepp; ++x)
	for (int y = x + 1; y < antal_rymdskepp; ++y)
	    if (krock(rymdskepp[x], rymdskepp[y]))
		++antal_krockar;
    printf("Antal krockar: %d\n", antal_krockar);
    return 0;
}

Uppgift 14 (5 p)

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

int main(void) {
    char rad[100 + 1];
    int antal[13];
    for (int i = 1; i <= 12; ++i)
	antal[i] = 0;
    printf("Ange ett personnummer (avsluta med tom rad): ");
    fgets(rad, sizeof rad, stdin);
    while (rad[0] != '\n') {
	int m = (rad[2] - '0') * 10 + (rad[3] - '0');
	++antal[m];
	printf("Ange ett personnummer (avsluta med tom rad): ");
	fgets(rad, sizeof rad, stdin);
    }
    int maxantal = antal[1];
    int maxmanad = 1;
    for (int i = 2; i <= 12; ++i) {
	if (antal[i] > maxantal) {
	    maxantal = antal[i];
	    maxmanad = i;
	}
    }
    printf("Flest personer var födda i månad nummer %d.\n", maxmanad);
    return 0;
}


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se) 11 maj 2007