100 likes | 203 Views
Loops og algoritmer. Sweep – for-loop Søgning – while-loop. Algoritmeskabeloner – eller mønstre. Mange problemer kan løses ved algoritmer, som følger et givet mønster Et mønster er en abstrakt beskrivelse af løsning på en familie af problemer Et mønster beskriver en velprøvet og god løsning
E N D
Loops og algoritmer Sweep – for-loop Søgning – while-loop IntroJava2006 - AAU
Algoritmeskabeloner – eller mønstre • Mange problemer kan løses ved algoritmer, som følger et givet mønster • Et mønster er en abstrakt beskrivelse af løsning på en familie af problemer • Et mønster beskriver en velprøvet og god løsning • Ved eksplicit at arbejde med mønstre • udgår man at opfinde den dybe tallerken hver gang (genbruger gode ideer) • det bliver lettere at dokumentere og kommunikere løsninger • Mønstre (ikke kun for algoritmer) er et centralt begreb i softwarekonstruktion IntroJava2006 - AAU
Algoritmemønstre … • Der findes mange: • Sweep Pattern • Search Pattern • Merge Pattern • Divide and Conquer Pattern • Greedy Pattern • Backtracking Pattern • Dynamic Programming Pattern • And many others… • Vi ser kun på swep og search her. IntroJava2006 - AAU
Sweep-algoritmer • Gennemløber en collection (fx array) af elementer, ser på hvert element og gør evt. noget ved elementet • Løber altid hele collectionen i gennem • Eksempler: • Summere tallene i et array, finde gennemsnit, finde maximum og/eller minimum • Tælle antal elementer med en eller anden egenskab; fx tælle antal studenter, som har opnået en given karakter • Beregne en kundes totale køb IntroJava2006 - AAU
Søgealgoritmer • Finder et objekt med en bestemt egenskab i en collection • Terminerer, når første element med den eftersøgte egenskab findes • Eksempler: • Afgør om et bestemt tal findes i et array • Finde index på første forekomst af en værdi i et array • Finde en kunde med navn ”Hansen” IntroJava2006 - AAU
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). Sweep gennem arrayet public int countEvens(int[] a) {//sweep int count= 0; for(int i= 0; i<a.length; i++) { if(a[i]%2 == 0)//a[i] is even count++; } return count; } Tæl op, hvis tallet er lige public class LoopSolutions{ private int[] myArray1= {11, 2, 5 , 3}; private int[] myArray2= {1, 22, 5 , 13, 12, 1}; public void main(){ System.out.println("Antal lige: “ + countEvens(myArray2)); } //--- IntroJava2006 - AAU
Lav en metode, som tager en int x som parameter, og returnerer true, hvis x findes i et int [ ]. Stop når elementet findes public boolean findX(int[] a, int x) {//search boolean found= false; int i= 0; while(!found && i<a.length){ if(a[i]==x) found= true; else i++; } return found; } …eller hvis der ikke er flere elementer public class LoopSolutions{ private int[] myArray2= {1, 22, 5 , 13, 12, 1}; public void main(){ System.out.println("Er 13 i myArray2?: " + findX(myArray2,13)); System.out.println("Er 7 i myArray2?: " + findX(myArray2,7)); } IntroJava2006 - AAU
Lav en metode, som finder antallet af vokaler i et char[ ]. Først et sweep Med en søgning blandt alle vokaler!! public int countVocals(char[] a) {//sweep int count= 0; for(int i= 0; i<a.length;i++){ if(isVocal(a[i])) count++; } return count; } Hvordan laves den? private boolean isVocal(char ch){ char[] vocals= {'a','e','i','o','u','y'}; boolean found= false; int i= 0; while(!found && i<vocals.length){ if(ch==vocals[i]) found= true; else i++; } return found; } Her er vokalerne Her søges IntroJava2006 - AAU
Og test: public class LoopSolutions { private char[] charArray= {'s','a','w','a','o','i'}; public void main() { System.out.println("Antal vokaler: "+ countVocals(charArray)); } //--- } public int countVocals(char[] a){ //--- if(isVocal(a[i])) //--- } private boolean isVocal(char ch){ //--- if(ch==vocals[i]) //--- } IntroJava2006 - AAU
Og resten…? Arrays Tag udgangspunkt i klassen Methods i projektet javaFundamentals (.zip) • 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 [ ]. Ænder metoden, så index på første forekomst af x i arrayet returneres. • 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.) Loops Tag udgangspunkt i projektet Drawer (.zip). Brug loops. • Ænder højhusmetoden, så der tegnes vha. et loop • Lav en metode, som tegner en trappe. • Overvej, hvordan en figur kan animeres. Afprøv din løsning på en simpel figur, fx en ”flyvende box”. IntroJava2006 - AAU