Nighthawk.dk

Grundlæggende C#: Funktioner

Skrevet d. 11. May 2022 af Claus Nielsen.

Brug funktioner til at genbruge og forenkle din kode.

Funktioner

Et vigtigt koncept de fleste programmeringssprog er funktioner, og lad os starte med et eksempel:

// Her laver vi vores nye funktion
static void MinFunktion()
{
	Console.WriteLine("Indtast et heltal:");
	int tal = Convert.ToInt32(Console.ReadLine());

	if(tal > 5)
	{
		Console.WriteLine("Tallet {0} er større end 5", tal);
	}
	else
	{
		Console.WriteLine("Tallet {0} er IKKE større end 5", tal);
	}
}

// Main-funktionen hvor programmet starter
static void Main()
{
	// Kald funktionen 3 gange
	MinFunktion();
	MinFunktion();
	MinFunktion();
}

Der er flere ting at lægge mærke til i eksemplet, men bemærk først og fremmest at det meste af koden nu står udenfor kodeblokken til static void Main(), som har været udeladt i de tidligere kode-eksempler.

Dette er fordi static void Main() i sig selv definerer en funktion: nemlig Main-funktionen, hvor dit program starter.

I eksemplet ovenfor er der lavet endnu en funktion, kaldet MinFunktion og også med ordene static void foran, et par paranteser bagefter, samt en tilhørende kodeblok.

Kodeblokken, som hører til en funktion, kan køres ved at man kalder en funktion - og det er netop dét, der er gjort tre gange nede i Main-funktionen: Funktionen MinFunktion bliver kaldt når man skriver funktionens navn (med paranteser) efterfulgt af ; som i eksemplet.

Hvis man bruger en funktion som i kode-eksemplet ovenfor kan man ligeså godt bruge et loop (eller kalde funktionen i et loop), men det kan gøre dit program nemmere at overskue, hvis nogle dele af programmet deles ud i forskellige funktioner, som så kan kaldes.

Opgave 22

Lav et program med en funktion der kan udskrive 8-tabellen, og kald funktionen fra Main.

Funktioner kan dog bruges til meget mere end hvad kode-eksemplet ovenfor viser! Man kan f.eks. sende en variabel med til en funktion, som i dette eksempel:

// En funktion der kan modtage en værdi (parameter)
static void UdskrivTal(int a)
{
	Console.WriteLine("Tallet er {0}", a);
}
	
static void Main()
{
	// Kald funktionen med nogle tal
	UdskrivTal(1);
	UdskrivTal(4);
	
	// Kald funktionen med en variabel
	int tal = 10;
	UdskrivTal(tal);
}

Når funktionen i dette eksempel defineres i linie 2 laves altså en variabel med navnet a af typen int (heltal). Denne variabel kan bruges i kodeblokken som hører til funktionen.

Værdien af variablen a bestemmes når man kalder funktionen nede fra Main-funktionen: a får den værdi, som står mellem paranteserne, når funktionen kaldes.

Hvis man kalder funktionen med en variabel (f.eks. med variablen tal sidst i eksemplet ovenfor), så får a værdien af denne variabel i funktionen.

Variabler der defineres i paranteserne af en funktion, som a ovenfor, kaldes en parameter til funktionen. Når man kalder funktionen med en værdi, kaldes denne værdi for argumentet, som man kalder funktionen med.

Funktionen UdskrivTal i eksemplet ovenfor har altså én parameter, int a, og bliver kaldt tre gange med de forskellige argumenter 1, 4 og tal (10).

Opgave 23

Lav et program med en funktion der kan udskrive tabeller. Du skal bruge en parameter til at angive, hvilken tabel funktionen skal udskrive.

Husk også at tjekke i funktionen, om parameteren er et positivt tal!

Opgave 24

Lav en funktion med en parameter af typen string, og lad funktionen udskrive denne tekst-streng.

Kald funktionen fra Main-funktionen med argumentet "Hello world!".

Funktioner kan have flere parametre, de skal bare adskilles af et komma:

// En funktion med tre parametre
static void FindHoejesteTal(int a, int b, int c)
{
	if(a > b)
	{
		if(a > c)
		{
			Console.WriteLine("{0} er den højeste værdi!", a);
		}
		else
		{
			Console.WriteLine("{0} er den højeste værdi!", c);
		}
	}
	else
	{
		if (b > c)
		{
			Console.WriteLine("{0} er den højeste værdi!", b);
		}
		else
		{
			Console.WriteLine("{0} er den højeste værdi!", c);
		}
	}
}
	
static void Main()
{
	// Kald funktionen med forskellige argumenter
	FindHoejesteTal(1, 2, 3);
	FindHoejesteTal(4, -2, 30);
}
Opgave 25

Lav en funktion med tre parametre af typen \ic{int}, som tjekker om værdien af parametrene er forskellige.

Opgave 26

Lav en funktion med tre parametre af typen double, som tjekker om værdien af 3. parameter ligger mellem værdien af de to første parametre.

Husk at holde styr på hvilken af værdierne af de to første parametre, der er størst og hvilken, der er mindst.

I eksemplet nedenfor vises en funktion, som tjekker tegnene i en tekst-streng. Bemærk at typen char kan indeholde ét tegn (f.eks. et bogstav), og at enkelte tegn kan angives med enkelte apostroffer (i stedet for anførselstegn som med tekst-strenge).

// Funktion der tjekker hvor mange gange tegnet c findes i strengen s
static void TjekTegn(string s, char c)
{
	// Tæller, der holder styr på hvor mange gange tegnet er fundet
	int counter = 0;
	
	// Loop med variabel 'i' der løber fra 0 til mængden af tegn i strengen
	for(int i = 0; i < s.Length; i++)
	{
		// Tjek et tegn, hvor tallet/variablen mellem [ og ] angiver nummeret
		// på det tegn der skal tjekkes (læs evt. videre om Arrays)
		if(s[i] == c)
		{
			counter += 1;	// Tegnet blev fundet, tæl en op
		}
	}

	Console.WriteLine("Tegnet {0} blev fundet {1} gange!", c, counter);
}
	
static void Main()
{
	// Prøv forskellige argumenter - der er forskel på små og store bogstaver!
	TjekTegn("Hello World!", 'l');
	TjekTegn("Hello World!", 'L');
}
Opgave 27

Lav en funktion der finder ud af om der er flest vokaler eller konsonanter i en string.

Opgave 28

Lav en funktioner der tjekker hvor mange store bogstaver, og hvor mange små, der er i en string.

Opgave 29

Lav en funktion der tæller antallet af ord i en string.

Opgave 30

Lav en funktion der finder det bogstav, som forekommer oftest i en string.

Funktioner er meget nyttige, men de kan endnu mere end vi har set på nu! Noget af de vigtigste ved mange funktioner er, at de kan returnere en værdi, dvs. sende en værdi tilbage til det sted i koden, hvor vi kalder funktionen.

Dette er illustreret her:

// En funktion - bemærk at void er ændret til int
static int GivMigEtTal()
{
	return 42;	// Send værdien 42 tilbage
}
	
static void Main()
{
	// Kald funktionen, og gem den returnerede værdi i en variabel
	int a = GivMigEtTal();
	Console.WriteLine("Funktionen gav tallet {0}!", a);
}

Der er primært to ting at lægge mærke til her: først og fremmest skal du vælge en retur-type når du definerer din funktion, og så skal du bruge return inden i funktionen til at sende en værdi tilbage.

Selve retur-typen skrives mellem static og navnet på funktionen, ligesom der er valgt int på linie 2 i eksemplet ovenfor.

I Main-funktionen og tidligere eksempler på funktioner har vi brugt void som retur-type, men void er en speciel "type" der bare betyder, at der ikke sendes nogen værdi tilbage fra funktionen.

Bemærk: Brug af return

Hvis du angiver en anden retur-type end void for en funktion, så skal din funktion sende en værdi af den valgte type tilbage med return.

Hvis du bruger retur-typen void kan du stadig godt bruge return - du kan bare ikke sende nogen værdi med. Dette kan stadig være brugbart, da return altid afbryder en funktion (ligesom \ic{break} afbryder et loop).

Opgave 31

Lav en funktion med to parametre af typen double, som returnerer den største værdi af parametrene.

Opgave 32

Lav en funktion der returnerer antallet af ord i en string.

Opgave 33

Lav en funktion tager en string som parameter, og returnerer en string hvor der er byttet om på små og store bogstaver.

Opgave 34

Lav en funktion tager en string som parameter, og returnerer en string hvor bogstavet 'e' er byttet ud med 'd' (og omvendt).

Hvis du udvider denne funktion til at bytte om på flere tegn kan du bruge funktionen til at kryptere en tekst!

Husk at du også skal kunne afkode (dekryptere) en krypteret besked igen - det behøver ikke at være med samme funktion.

Opgave 35

Lav en funktion der returnerer arealet af en cirkel. Radius på cirklen skal være parameter til funktionen.

Test funktionen for forskellige værdier af radius, og regn efter med en lommeregner. Hvis resultatet af funktionen ikke passer, så overvej om du bruger den rigtige variabel-type.

Opgave 36

Lav en funktion der returnerer længden af hypotenusen af en retvinklet trekant. Kateternes længder skal parametre til funktionen.

Test funktionen for forskellige værdier af katete-længderne, og regn efter med en lommeregner. Hvis resultatet af funktionen ikke passer, så overvej om du bruger den rigtige variabel-type.

Relaterede ressourcer
C# Grundbog

Niels Hilmar Madsen og Michell Cronberg,
Libris, 2003

×