Efterår 2009VVU-IT: Softwarekonstruktion1 Velkommen til Softwarekonstruktion Aase Bøgh, Systemudvikling Martin Siegumfeldt, Programmering og
Agenda Opsamling fra sidste gang –Forgreninger, –Løkker –Arrays –Metoder –Opgaver Algoritmeskabeloner: –Sweep-algoritmer –Søge-algoritmer Efterår 2009VVU-IT: Softwarekonstruktion2
if-sætningen int etTal=3, etAndetTal=7; if(etTal>7){ Console.WriteLine("Tal er større end 7"); } else{ if(etTal<7){ Console.WriteLine("Tal er mindre end 7"); } else { Console.WriteLine("Tal er lige med 7"); } } if((etTal==7) && (etAndetTal != 3)) Console.WriteLine(”Hallo.”); else Console.WriteLine(”Hello.”); Efterår 20093VVU-IT: Softwarekonstruktion
switch – en variant af if-sætningen Mange forgreninger Valg styret af en simpel værdi F.eks. månedsnavn ud fra månedsnummer: //indlæs månedsnummer i int nr switch(nr){ case 1: Console.WriteLine(”Januar”); break; case 2: Console.WriteLine(”Februar”); break; //fortsættes case 3: Console.WriteLine(”Marts”); break; //osv.….. case 12: Console.WriteLine(”December”); break; default: Console.WriteLine(”Ikke en måned”); } Efterår 20094VVU-IT: Softwarekonstruktion
Specielt ved fejl (exceptions) Hvis der sker en fejl, kan der kastes en exception, f.eks try{ double d= System.Convert.ToDouble(s); //en hel masse kode med d } catch{ System.Console.WriteLine(”Ikke et decimaltal); } Hvis s ikke er et gyldigt decimaltal, så kastes en exception fra …ToDouble(-) Hvis der kom en exception springes til catch-blokken Efterår 20095VVU-IT: Softwarekonstruktion
for eller while? Normalt bruges while, hvis man ikke ved hvor mange gange løkken skal løbes igennem, f.eks: –Led efter den første 7’er i et spil kort int i=1; do { Console.WriteLine(”Tal er ”+i); i++; }while(i<5); int i=1; while(i<5) { Console.WriteLine(”Tal er ”+i); i++; }; En variant af while er do–while: do-while udføres mindst én gang Efterår 20096VVU-IT: Softwarekonstruktion
for eller while ? for-sætningen bruges normalt når man ved hvor mange gange løkken skal køre, f.eks; –Tæl antal 7’ere i en kort-hånd (Du er nødt til at undersøge alle kort) Hvis man skal igennem en mængde af data kan man bruge foreach –Se eksempel med array om lidt Efterår 20097VVU-IT: Softwarekonstruktion
Array Æske-metaforen: Du kan betragte et array som en æske med et antal skillerum med samme størrelse. I hvert rum kan ligge en variabel af samme datatype. Rummene nummeres fra 0 til antal-1. Erklæring af et array: –int [] mitArray = {1,2,3,4,5}; //Opret og tildel værdier på een gang eller: –int [] mitArray = new int[5]; //Gør plads til 5 skillerum mitArray[0]=1; mitArray[1]=2; osv. Aflæs værdi fra arrayet: –int etTal = mitArray[3], //etTal får så værdien 4, hvorfor? Tildel værdi til en celle i arrayet: –mitArray[3]=etTal*2; //Nu står der 8 på den fjerde plads Efterår 20098VVU-IT: Softwarekonstruktion
Eksempel: Summen af alle tal i et array Eksempel med foreach: int sum=0; foreach( int tal in mitArray) sum=sum+tal; Console.WriteLine("Summen er "+sum); Sæt summen til nul For hvert element i arrayet: Aflæs tallet i arrayet, og læg det til summen. Eksempel med for: int sum=0; for( int i=0; i< mitArray.Length; i++) sum=sum+mitArray[i]; Console.WriteLine("Summen er "+sum); Løber hele arrayet igennem. For hvert gennemløb indlæses det næste element i tal Length fortæller længden på arrayet Efterår 20099VVU-IT: Softwarekonstruktion
Metoder Metoder kan betragtes som funktioner til et objekt. Metoder kan bruges til kode, der skal kaldes flere gange Metoder gør koden lettere at forstå og vedligeholde. Dette er en del af det begreb, der kaldes indkapsling WriteLine(..) er et eksempel på en metode i Console En metode kan kendes på, at der er parenteser! Man skelner mellem private og public metoder: –”public” metoder kan tilgås udenfor objektet: –”private” metoder kan ikke tilgås udefra, men bruges internt i objektet Er Length en metode på et array? Efterår VVU-IT: Softwarekonstruktion
Eksempel: tælleriet fra før class EnKlasse { static void Main(string[] args) { for(int i=1; i<5;i++) UdskrivTal(i); } private static void UdskrivTal(int n) { Console.WriteLine("Tal er "+n); } Efterår VVU-IT: Softwarekonstruktion Returtype Parameter
Et andet eksempel: sum class Sum { static void Main(string[] args) { int [] mitArray={12,3,4,7,3,1,7,8,7,9,10}; Console.WriteLine("Summen er " + beregnSum(mitArray)); } private static int beregnSum(int [] etArray) { int sum=0; foreach (int etTal in etArray) sum+=etTal; return sum; } Returner summen som en int Hvordan kan man se det er en int? Efterår VVU-IT: Softwarekonstruktion
Opgaver Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: 1.Lav en metode, som beregner gennemsnittet af tallene i et array. 2.Lav en metode, som tæller antal forekomster af værdien 7 i et array. 3.Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. 4.Generaliser opgave 2 og 3, så der kikkes efter en vilkårlig værdi (ind-parameter til metoderne) i stedet for 7 og 3 resp. Efterår VVU-IT: Softwarekonstruktion
Agenda Opsamling fra sidste gang –Forgreninger, –Løkker –Arrays –Metoder –Opgaver Algoritmeskabeloner : –Sweep-algoritmer –Søge-algoritmer Efterår 2009VVU-IT: Softwarekonstruktion14
Algoritmeskabeloner Mange forskellige problemer kan løses af algoritmer, som har et fælles mønster, en fælles struktur. Denne struktur kan genbruges med klarere og mindre fejlbehæftede programmer til følge Skabelonen har et navn, så man kan snakke om den Vi vil kigge på to: –Sweep-algoritmer: gennemløber altid hele datamængden og gør noget ved (nogen af) elementerne –Søge-algoritmer: leder efter et element med en bestemt egenskab og stopper når et (det første) element med egenskaben er fundet. Efterår VVU-IT: Softwarekonstruktion
Gennemløber altid hele datamængden og gør noget ved (nogen af) elementerne INIT, DONE, SELECT, REMOVE afhænger af sættets data repræsentation Konkretiseringen af DO og DO_INIT afhænger ydermere af den konkrete opgave Sweep – en algoritmeskabelon ; while { ; } Efterår VVU-IT: Softwarekonstruktion
INIT, DONE, SELECT og REMOVE kan konkretiseres til en tæller i, der Indikerer starten af det ubesøgte sæt (US) Indsættes dette i skabelonen, fås: Konkretisering af skabelonen på et array (int[ ] a) ; int i = 0; while ( i < a.length ) { ; i++; } // end while INIT: i = 0 DONE: i >= a.length SELECT: a[i] REMOVE: i++ Efterår VVU-IT: Softwarekonstruktion
I C# - simplere med for-løkke: Opgave konkretisering: Nul-tælling DO_INIT:int result= 0; DO:if(a[i]==0) result++ ; for (int i=0 ; i<a.Length ; i++ ) { ; } // end for int result= 0; for (int i=0 ; i<a.Length ; i++){ if (a[i] = = 0) result++; } // end for int result= 0; foreach (int x in a){ if (x = = 0) result++; } // end for Efterår VVU-IT: Softwarekonstruktion Kun, hvis x ikke skal ændres
Opgaver (fra før) – er der nogle sweeps? Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: 1.Lav en metode, som beregner gennemsnittet af tallene i et array. 2.Lav en metode, som tæller antal forekomster af værdien 7 i et array. 3.Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. 4.Generaliser opgave 2 og 3, så der kikkes efter en vilkårlig værdi (ind-parameter til metoderne) i stedet for 7 og 3 resp. Efterår VVU-IT: Softwarekonstruktion
Leder efter et element med en bestemt egenskab og stopper når et (det første) element med egenskaben er fundet. INITIER, KM Ø, UDVÆLG, SPLIT afhænger af sættets data repræsentation Søgeskabelonen ; bool found= false; while ( ! found && ) { ; if ( k==m ) found = true; else { }//end if-else } // end while Kandidatmængde:KM Målelement:m Kandidatelement:k Efterår VVU-IT: Softwarekonstruktion
INITIER:int i = 0 UDVÆLG:k = a[i] KM Ø:i < a.Length SPLIT:i ++ int k; int i= 0; bool found= false; while ( !found && i<a.Length ) { k = a[I]; if (k == m) found= true; else i ++; } // end while Efterår VVU-IT: Softwarekonstruktion Konkretisering af skabelonen på et array (int[ ] a) Igen kan flere skridt konkretiseres til en tæller i, der indikerer starten af det ubesøgte sæt (US)
Opgaver (fra før) – er der nogle søgninger? Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: 1.Lav en metode, som beregner gennemsnittet af tallene i et array. 2.Lav en metode, som tæller antal forekomster af værdien 7 i et array. 3.Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. 4.Generaliser opgave 2 og 3, så der kikkes efter en vilkårlig værdi (ind-parameter til metoderne) i stedet for 7 og 3 resp. Efterår VVU-IT: Softwarekonstruktion
Algoritmeskabeloner - opsummering Algoritmeskabeloner kan (gen)bruges til at løse mange forskellige problemer En god implementering karakteriseres ved –Tydelig identifikation af de enkelte skridt –Tydelig skelnen mellem traversering af datasæt og udførsel af den specifikke opgave Efterår VVU-IT: Softwarekonstruktion
Opgaver i løkker og skabeloner For alle opgaverne skal det overvejes hvilken skabelon, der benyttes, og hvordan operationerne er konkretiseret: 1.Lav en metode, som returnerer antallet af lige tal i et int[ ]. Test den. (Vink: et tal er lige, hvis rest ved division med 2 er 0) 2.Lav en metode, som returnerer antallet af tal i et double[ ], som ligger mellem 10,0 og 20,0. Test den. 3.Lav en metode, som tager en int x som parameter, og returnerer true, hvis x findes i et int [ ]. Ændr metoden, så index på første forekomst af x i arrayet returneres. Hvad hvis x ikke findes i array’et? 4.Lav en metode, som finder første forekomst af et tegn i et char[ ]. 5.Lav en metode, som finder antallet af vokaler i et char[ ]. (Vink: lav først en metode, som tager et bogstav som parameter, og returnerer true, hvis bogstavet er en vokal, ellers false.) Efterår VVU-IT: Softwarekonstruktion