240 likes | 395 Views
Velkommen til Softwarekonstruktion. Aase Bøgh , aabo@noea.dk : Systemudvikling Martin Siegumfeldt, mars@noea.dk : Programmering og databaser. Agenda. Opsamling fra sidste gang Forgreninger, Løkker Arrays Metoder Opgaver Algoritmeskabeloner: Sweep-algoritmer Søge-algoritmer.
E N D
Velkommen tilSoftwarekonstruktion • Aase Bøgh, aabo@noea.dk: Systemudvikling • Martin Siegumfeldt, mars@noea.dk: Programmering og databaser VVU-IT: Softwarekonstruktion
Agenda Opsamling fra sidste gang • Forgreninger, • Løkker • Arrays • Metoder • Opgaver Algoritmeskabeloner: • Sweep-algoritmer • Søge-algoritmer VVU-IT: Softwarekonstruktion
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.”); VVU-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”); } VVU-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 VVU-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; while(i<5) { Console.WriteLine(”Tal er ”+i); i++; }; do-while udføres mindst én gang int i=1;do { Console.WriteLine(”Tal er ”+i); i++; }while(i<5); En variant af while er do–while: VVU-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 VVU-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 skillerummitArray[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 VVU-IT: Softwarekonstruktion
Eksempel: Summen af alle tal i et array • Sæt summen til nul • For hvert element i arrayet: • Aflæs tallet i arrayet, og læg det til summen. Eksempel med foreach: int sum=0; foreach( int tal in mitArray) sum=sum+tal; Console.WriteLine("Summen er "+sum); Eksempel med for: int sum=0; for( int i=0; i< mitArray.Length; i++) sum=sum+mitArray[i]; Console.WriteLine("Summen er "+sum); Length fortæller længden på arrayet Løber hele arrayet igennem. For hvert gennemløb indlæses det næste element i tal VVU-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? 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); } } Returtype Parameter VVU-IT: Softwarekonstruktion
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; } } Hvordan kan man se det er en int? Returner summen som en int VVU-IT: Softwarekonstruktion
Opgaver • Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: • Lav en metode, som beregner gennemsnittet af tallene i et array. • Lav en metode, som tæller antal forekomster af værdien 7 i et array. • Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. • 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. VVU-IT: Softwarekonstruktion
Agenda Opsamling fra sidste gang • Forgreninger, • Løkker • Arrays • Metoder • Opgaver Algoritmeskabeloner: • Sweep-algoritmer • Søge-algoritmer VVU-IT: Softwarekonstruktion
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. VVU-IT: Softwarekonstruktion
Sweep – en algoritmeskabelon • 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 < DO_INIT: initialiseringaf DO operationen >; < INIT: initialiseringaf US (ubesøgtesæt) >; while < !DONE (dvs. US erikketomt)> { < SELECT: udvælgelementernefra US >; < DO: opererpådetudvalgte element>; < REMOVE: fjerndetudvalgte element fra US> } VVU-IT: Softwarekonstruktion
Konkretisering af skabelonen på et array (int[ ] a) 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: INIT: i = 0 DONE: i >= a.length SELECT: a[i] REMOVE: i++ < DO_INIT >; int i = 0; while ( i < a.length ) { < DO something to a[i]) >; i++; } // end while VVU-IT: Softwarekonstruktion
I C# - simplere med for-løkke: < DO_INIT >; for (int i=0 ; i<a.Length ; i++ ) { < DO something to a[i]) >; } // end for Kun, hvis x ikke skal ændres Opgave konkretisering: Nul-tælling DO_INIT: int result= 0; DO: if(a[i]==0) result++ int result= 0; foreach (int x in a){ if (x = = 0) result++; }// end for int result= 0; for (int i=0 ; i<a.Length ; i++){ if (a[i] = = 0) result++; }// end for VVU-IT: Softwarekonstruktion
Opgaver (fra før) – er der nogle sweeps? • Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: • Lav en metode, som beregner gennemsnittet af tallene i et array. • Lav en metode, som tæller antal forekomster af værdien 7 i et array. • Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. • 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. VVU-IT: Softwarekonstruktion
Søgeskabelonen • 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 • Kandidatmængde: KM • Målelement: m • Kandidatelement: k < INITIER KM >; bool found= false; while ( ! found && < KM ¹Ø > ) { < UDVÆLG k fra KM >; if ( k==m ) found = true; else { < SPLIT KM i forhold til k og m > }//end if-else } // end while 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) 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 INITIER: int i = 0 UDVÆLG: k = a[i] KM¹ Ø: i < a.Length SPLIT: i ++ VVU-IT: Softwarekonstruktion
Opgaver (fra før)– er der nogle søgninger? • Alle følgende opgaver tager udgangspunkt i eksemplet med summen af tallene i et array: • Lav en metode, som beregner gennemsnittet af tallene i et array. • Lav en metode, som tæller antal forekomster af værdien 7 i et array. • Lav en metode, som returnerer sand, hvis værdien 3 findes i et array og falsk hvis ikke. • 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. 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 VVU-IT: Softwarekonstruktion
Opgaver i løkker og skabeloner • For alle opgaverne skal det overvejes hvilken skabelon, der benyttes, og hvordan operationerne er konkretiseret: • 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) • Lav en metode, som returnerer antallet af tal i et double[ ], som ligger mellem 10,0 og 20,0. Test den. • 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? • Lav en metode, som finder første forekomst af et tegn i et char[ ]. • 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.) VVU-IT: Softwarekonstruktion