next up previous contents
Nästa: 17. Fler datatyper Upp: 16. Funktioner Förra: 16.4 Uppdelad källkod

16.5 Funktioner och sammansatta datatyper

I det här avsnittet ska vi diskutera poster och fält som argument och returvärden för funktioner.

I likhet med variabler, kan också namn på postslag vara globala. I följande program, som liknar några av programmen i avsnitt 15.4, skickas en post som argument till en funktion. Namnet på postslaget deklareras globalt så att det kan användas såväl i main som vid deklarationen av funktionens argument.

#include <stdio.h>

struct varupostslag {
  int antal;
  float pris;
};

float varde(struct varupostslag vara)
{
  return vara.antal*vara.pris;
}

int main(int argc,char *argv[])
{
  struct varupostslag semla;
  float kostnad;

  semla.antal=3;
  semla.pris=14.95;
  kostnad=varde(semla);
  printf("Kostnaden för semlorna är %.2f kr.\n",kostnad);
return 0;
}

Funktionen varde tar ett argument av typen struct varupostslag, och lämnar ett flyttal som värde. Till denna funktion skickar huvudprogrammet posten semla för beräkning av det sammanlagda värdet.

Här är en mer fullständig versionen av programmet, där wienerbröden får vara med:

#include <stdio.h>

struct varupostslag {
  int antal;
  float pris;
};

float varde(struct varupostslag vara)
{
  return vara.antal*vara.pris;
}

int main(int argc,char *argv[])
{
  struct varupostslag semla={3,14.95},wienerbrod={6,9.90};
  float kostnad;

  kostnad=varde(semla)+varde(wienerbrod);
  printf("Totalkostnaden är %.2f kr.\n",kostnad);
return 0;
}

Nästa exempel visar att funktioner kan ha poster som värde.

#include <stdio.h>

struct varupostslag {
  int antal;
  float pris;
};

struct varupostslag las_in_vara(void)
{
  struct varupostslag vara;

  printf("Ange pris och antal: "); 
  scanf("%f%d",&vara.pris,&vara.antal);
return vara;
}

int main(int argc,char *argv[])
{
  struct varupostslag semla;
  float kostnad;

  semla=las_in_vara();
  kostnad=semla.antal*semla.pris;
  printf("Kostnaden för semlorna är %.2f kr.\n",kostnad);
return 0;
}

Funktionen las_in_vara läser in en post av slaget varupostslag och lämnar den inlästa posten som värde; sedan tilldelas semla detta värde. En exempelkörning:$ semlor
Ange pris och antal: 14.95 3
Kostnaden för semlorna är 44.85 kr.
$

Funktioner kan inte ha fält som returvärden, men man får använda fält som argument till funktioner. Då ett fält deklareras som argument till en funktion behöver man inte ange hur stort fältet är. Man behöver alltså inte skriva int falt[7] utan det räcker med int falt[]. En annan egenhet som man måste känna till är att om något av elementen i fälten ändras i funktionen, så bevaras ändringen efter funktionsanropet. Skälet till dessa egenheter ska vi beskriva i ett senare avsnitt.

Som exempel på fält som funktionsargument ska vi ge en ny version av programmet antalpersoner. Den nya versionen fungerar på exakt samma sätt som den gamla, men det nya programmet är uppdelat i ett antal funktioner.  

#include <stdio.h>

#define MAXPOANG 6

void nollstall(int falt[])
{
  int i;

    for (i=0; i<=MAXPOANG; i=i+1)
      falt[i]=0;
}

void oka(int falt[],int index)
{
  if (index>=0 && index<=MAXPOANG)
    falt[index]=falt[index]+1;
}

void skriv_ut(int falt[])
{
  int i;

  for (i=0; i<=MAXPOANG; i=i+1)
    if (falt[i]==1)
      printf("    1 person   hade %d poäng\n",i);
else
      printf("%5i personer hade %d poäng\n",falt[i],i);
}

int main(int argc,char *argv[])
{
  int antal_personer[MAXPOANG+1],antal_poang;

  printf("Ange ett antal heltal mellan 0 och %d\n",MAXPOANG);
printf("Avsluta med Ctrl-d.\n");

  nollstall(antal_personer);
  while (scanf("%d",&antal_poang)==1)
oka(antal_personer,antal_poang);
  skriv_ut(antal_personer);
  return 0;
}

När vi i funktionerna ovan deklarerar falt som ett heltalsfält, anger vi inte hur stort fältet är. Lägg märke till att elementen i fältet antal_personer ändrar värde i funktionerna nollstall och oka.


next up previous contents
Nästa: 17. Fler datatyper Upp: 16. Funktioner Förra: 16.4 Uppdelad källkod
Goran Andersson
1999-03-08