Umu logo

Umeå Universitet
Institutionen för datavetenskap
Programmeringsteknik för tekniska fysiker


Niklas Frykholm, 24 februari 1999

Gruppövning 2

1. Finn sex fel

#include <stdio.h>

int main(void)
{
  printf("3 ^ 5 = %d\n", upphoj(3,5));
  printf("5 ^ 3 = %d\n", upphoj(5,3));
  return 0;
}


/* Beräknar värdet av x upphöjt till y. */
int upphoj(int x, y)
{
  int res, i;

  for (i=0; i<=y; i++)
    res *= i;
}

2. Funktionsvärden

Gammafunktionen används inom relativitetsteorin. Den talar om hur mycket massan ökar och tiden förkortas vid hastigheter nära ljusets. Gammafunktionen beräknas som 1/sqrt(1 - a*a) där a = v/c är kvoten mellan aktuella hastigheten och ljushastigheten.

Skriv ett program som beräknar gammafunktionens värde för a = 0, 0.05, 0.10, 0.15, ... 0.95 och presenterar resultatet som en tabell.

3. Prognosmaskin

Skriv ett program som låter användarna rösta i någon dagsaktuell fråga. Resultatet skall presenteras på följande sätt (exempel taget från VK's hemsida)

Är det rätt att ta pengar från försvaret och lägga på vården?

  1. Ja   (68.0 %)
  2. Nej  (32.0 %)

  3. Avsluta programmet

Välj ett alternativ:

Ditt program skall läsa in användarnas val och skriva ut en ny skärm med uppdaterade procentsiffror ända tills användaren väljer alternativ 3.

Finns det några speciella situationer som ditt program måste hantera?

4. Funktioner

Skriv funktionen int storsta_primtal(int a, int b). Funktionen skall returnera det största primtalet mellan a och b.

Behöver du någon hjälpfunktion?

Finns det några specialfall du bör tänka på?

5. Rekursion

Vad kommer att skrivas ut av följande funktion när den anropas med rek1('E')?

void rek1(char c)
{
   printf("%c ", c);
   if (c != 'A')
      rek1(c-1);
   printf("%c ", c);
}

6. Funktionsuppdelning

Du vill skriva ett C-program som spelar Othello med användarna. Fundera över följande saker:

När du talar om funktionernas in- och utdata så gör gärna det på en högre nivå än i termer av int och double. Du kan t ex säga att "Den här funktionen tar ett bräde och en position som argument." Vi ska senare i kursen se hur sammansatta begrepp som position och bräde kan skapas från enklare, t ex hel- och flyttal.

Ex på en funktionsbeskrivning.

sanningsvärde valid_move(bräde b, position p, färg f)

   Undersöker om det är ett giltligt drag att lägga en
   bricka av färg f på position p på brädet b.

7. Rekursion 2

Skriv en iterativ (icke-rekursiv) funktion som gör samma sak som den rekursiva funktionen nedan:

double rek1(double x, int n)
{
   if (n <= 0)
      return 1.0;
   else
      return 1.0 + x * rek1(x, n-1);
}

8. Loopar

Skriv ett program som läser in ett antal positiva tal från användaren. Nya tal skall läsas in ända tills användaren matar in ett negativt tal (det markerar slutet på talen).

När användaren har matat in alla tal skall ditt program skriva ut medelvärdet, det största talet och det minsta talet.

Kan du skriva ett program som i stället skriver ut det näst största talet? (Utan att använda vektorer.)

9. Rekursion 3

a)

En student försöker skriva en rekursiv funktion för att summera talen mellan 1 och n. Det första försöket ser ut som

int summera(int n)
{
    int summa = 0;
    if (n == 1)
        return 1;

    summa = summa + n;
    summera(n-1);
    return summa;
}

Vad kommer att hända? Kommer programmet att fungera?

b)

Studentens andra försök ser ut som

int summa = 0;

int summera(int n)
{
   summa = summa + n;

   if (n != 1)
      summera(n-1);
   return summa;
}

Vad kommer att hända? Är det en bra lösning?

c)

Skriv en egen rekursiv variant av summera, som fungerar bättre än de två ovan.


© Niklas Frykholm, februari 1999