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.
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
).
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!
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); }
Lav en funktion med tre parametre af typen \ic{int}, som tjekker om værdien af parametrene er forskellige.
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'); }
Lav en funktion der finder ud af om der er flest vokaler eller konsonanter i en string
.
Lav en funktioner der tjekker hvor mange store bogstaver, og hvor mange små, der er i en string.
Lav en funktion der tæller antallet af ord i en string
.
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.
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).
Lav en funktion med to parametre af typen double
, som returnerer den største værdi af parametrene.
Lav en funktion der returnerer antallet af ord i en string
.
Lav en funktion tager en string
som parameter, og returnerer en string
hvor der er byttet om på små og store bogstaver.
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.
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.
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.