Programmering C: Lösningar till (vissa uppgifter på) tentamen 2006-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.

Uppgift 1 (1 p)

Alternativ 1:
x = sqrt(4*a*b + sqrt(3-r));

Uppgift 2 (1 p)

a) 10

b) 1

Uppgift 3 (1 p)

-2

Uppgift 4 (1 p)

struct Program {
  char namn[30 + 1];
  char kanal[20 + 1];
  int starttimme;
  int startminut;
  int sluttimme;
  int slutminut;
};

Uppgift 5 (1 p)

struct Program csi = { "CSI", "Kanal 5", 21, 0, 22, 0 };

Uppgift 6 (2 p)

void visa_program(struct Program programmet) {
  printf("%.2d:%.2d - %.2d:%.2d (%s): %s\n",
	 programmet.starttimme,
	 programmet.startminut,
	 programmet.sluttimme,
	 programmet.slutminut,
	 programmet.kanal,
	 programmet.namn);
} // visa_program

Uppgift 7 (3 p)

int krockar(struct Program program1, struct Program program2) {
  int p1start = program1.starttimme * 60 + program1.startminut;
  int p1slut = program1.sluttimme * 60 + program1.slutminut;
  int p2start = program2.starttimme * 60 + program2.startminut;
  int p2slut = program2.sluttimme * 60 + program2.slutminut;

  return p1slut > p2start && p2slut > p1start;
} // krockar

Uppgift 8 (2 p)

int fel(struct Program program1, struct Program program2) {
  return krockar(program1, program2)
         && strcmp(program1.kanal, program2.kanal) == 0;
} // fel

Uppgift 9 (2 p)

struct Program las_program() {
  struct Program p;

  printf("Ange data för ett TV-program.\n");
  printf("Start-timme: ");
  scanf("%d", &p.starttimme);
  printf("Start-minut: ");
  scanf("%d", &p.startminut);
  printf("Slut-timme: ");
  scanf("%d", &p.sluttimme);
  printf("Slut-minut: ");
  scanf("%d", &p.slutminut);
  while (getchar() != '\n')
    ;
  printf("Programmets namn: ");
  gets(p.namn); // gets är osäker, och bör egentligen undvikas!
  printf("Sänds i kanal: ");
  gets(p.kanal); // gets är osäker, och bör egentligen undvikas!

  return p;
} // las_program

Uppgift 10 (2 p)

...

Uppgift 11 (5 p)

...
Kommentarer: Kursmaterialet använder void main, trots att C-standarden (i de flesta sammanhang) egentligen kräver int main. Jag använder int main i mina lösningar, men ger inga poängavdrag för void main.

Uppgift 12 (4 p)

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

int main(void) {
  float bensinforbrukning; // Liter per kilometer
  float bensinpris; // Kronor per liter
  float denna_stracka; // Kilometer
  float summa_av_strackorna; // Kilometer

  printf("Ange bensinförbrukningen för din bil (liter per mil, avsluta med 0): ");
  scanf("%f", &bensinforbrukning);

  while (bensinforbrukning != 0) {

    printf("Ange bensinpriset (kronor per liter): ");
    scanf("%f", &bensinpris);

    summa_av_strackorna = 0;

    printf("Ange längden på en sträcka (kilometer, avsluta med 0): ");  
    scanf("%f", &denna_stracka);

    while (denna_stracka != 0) {
      summa_av_strackorna += denna_stracka;

      printf("Ange längden på en sträcka (kilometer, avsluta med 0): ");  
      scanf("%f", &denna_stracka);
    }

    printf("Sammanlagd bensinkostnad: %.2f\n",
	   summa_av_strackorna / 10 * bensinforbrukning * bensinpris);

    printf("Ange bensinförbrukningen för din bil (liter per mil, avsluta med 0): ");
    scanf("%f", &bensinforbrukning);
  }

  return 0;
}

Uppgift 13 (4 p)

...

Uppgift 14 (5 p)

...

Uppgift 15 (7 p)

...


Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se) 22 augusti 2006