Innhold INF1000 (Uke 12) Sortering og eksmensoppgver Om sortering Sortering v heltll og tekster Litt om dokumentsjon v kode Grunnkurs i progrmmering Institutt for Informtikk Universitet i Oslo Deler v eksmen H03 Are Mgnus Bruset og Arild Wler 2 Oversikt I Oversikt II Lære å løse et vnskelig problem Sortering mnge metoder, her Innstikksortering Sortere hv: Heltll Tekster En tbell (2-dim) etter verdiene i første kolonne Eks : telefonktlogen (sortert på nvn) Lære bstrksjon Når vi hr løst ett problem, kn lignende problemer løses tilsvrende Lære å lge proff progrmvre ved å lge en generell klsse for sortering Hvordn deklrere en slik klsse Jvdoc lge dokumentsjon Testing Hvordn utvikle progrmmet 3 4
Sortering Mnge dttyper kn sorteres Krv: opertorer som <, <=, ==, >, >=,!= må h mening Eksempler Tll Tekster (leksikogrfisk = i smme rekkefølge de ville stått i et leksikon) Tbeller v tekster eller tll Sortering Vi må h en lgoritme (oppskrift) for sortering Det finns mnge titlls (hundretlls) metoder å velge blnt Vi skl se på innstikksortering Dette er den rskeste metoden når vi skl sortere få elementer (typisk færre enn 50 elementer) 5 6 Hvorfor sorterer vi Vi skl først lære å sortere heltll For å få noen tll i en bestemt (stigende eller synkende) rekkefølge Eksempel: lotto-tllene Sortere tekster (nvnelister) for rskere oppslg Sortere et sett v opplysninger som hører smmen, ved å sortere på en v opplysningene Eksempel: Telefonktlogen (nvn, dresse, telefonnummer informsjonen sortert på nvn) Dette skl vi (med minimle endringer) bruke til å sortere: String-rryer (tekster) Smmenhengende opplysninger i en 2-dim rry v tekster (hver linje er opplysninger om ett objekt) Eks : Telefonktlogen nvn dr. postnr. tlf. 7 8
En felles klsse for sortering Clss ISort Vi ønsker en klsse med tre vrinter v sortering: Heltll Tekster To-dimensjonl tekst-rrys (sortert på dt i 1. kolonne) public clss ISort { public sttic void sorter(int [] ) { public sttic void sorter(string [] ) { public sttic void sorteretterkol1(string [] [] ) { // end clss ISort 9 10 clss TestInnstikkSortering { public sttic void min ( String[] rgs) { int [] = {3,1,7,14,2,156,77; String [] nvn = {"Ol", "Kri", "Arne", "Jo"; String [][] telefonliste = { {"Per","22852451", {"Arne","33445566", {"Kri","44452611", {"Jo","55010102"; Heltlls-rry 3 1 7 14 2 156 77 "Ol "Kri "Arne "Jo" // sorter heltll - skriv ut ISort.sorter(); for (int i = 0; i <.length; i++) System.out.println("b[" + i +"]= " + [i]); System.out.println("\n Test tekst-sortering:"); // sorter Stringer - skriv ut ISort.sorter(nvn); for (int i = 0; i < nvn.length; i++) System.out.println("nvn[" + i +"]= " + nvn[i]); System.out.println("\n Test 2dim tekst-sortering:"); // sorter Tbell - skriv ut ISort.sorterEtterKol1(telefonliste); for (int i = 0; i < nvn.length; i++) System.out.println("nvn[" + i +"]= " + telefonliste[i][0] + ", med tlf.: " + telefonliste[i][1] ); 11 En-dimensjonl String-rry To-dimensjonl String-rry nvn telefonliste Pekere for lle rdene "Per "22852451" "Arne "33445566" "Kri "44452611" "Jo 55010102 Pekere for hvert element i rd nr. 3
>jv TestInnstikkSortering Test v test-progrmmet med tomme sortering-metoder b[0]= 3 b[1]= 1 b[2]= 7 b[3]= 14 b[4]= 2 b[5]= 156 b[6]= 77 Test tekst-sortering: nvn[0]= Ol nvn[1]= Kri nvn[2]= Arne nvn[3]= Jo Test 2dim tekst-sortering: telefonliste[0]= Per, med tlf.: 22852451 telefonliste[1]= Arne, med tlf.: 33445566 telefonliste[2]= Kri, med tlf.: 44452611 telefonliste[3]= Jo, med tlf.: 55010102 13 Sortering v heltll innstikksmetoden 3 1 7 14 2 156 77 Se på rryen element for element fr venstre Sorterer det vi hittil hr sett på ved : Hvis det nye elementet vi ser på ikke er sortert i forhold til de vi llerede hr sett på: T ut dette elementet (gjem verdien i en vribel t) Skyv de ndre elementene vi her sett på, en-etter-en, ett hkk til høyre. Slutt når elementet i t kn settes inn på sortert plss Den sorterte delen er nå ett element lenger (sett fr venstre) Når vi hr sett på lle elementene, er hele rryen sortert 14 Sorter 1 på plss i forhold til 3 7 og 14 står riktig, Sorter 2 på plss i forhold til : 1,3,7,14 steg 1 3 1 7 14 2 156 77 steg 4 1 3 7 14 2 156 77 t 1 steg 5 1 3 7 14 2 156 77 steg 2 3 3 7 14 2 156 77 steg 6 1 3 7 14 2 156 77 t 1 t 2 flytt: 3,7,14 ett hkk til høyre steg 7 1 3 3 7 14 156 77 steg 3 1 3 7 14 2 156 77 t 1 steg 8 t 2 1 2 3 7 14 156 77 t 2
i k+1 Kode for å flytte ett element på plss : public clss ISort { 1 3 7 14 2 156 77 i t 2 1 3 7 14 156 77 3 t 2 1 2 3 7 14 156 77 t 2 k+1 // [k +1 ] står muligens på // feil plss, t den ut int t = [k + 1], i = k; // skyv [i] mot høyre ett hkk til // vi finner riktig plss til t while (i >= 0 && [i] > t) { [i + 1] = [i]; i--; // sett t inn på riktig plss [i + 1] = t; public sttic void sorter(int [] ) { for (int k = 0 ; k <.length-1; k++) { // [k +1 ] står muligens på feil plss, t den ut int t = [k + 1], i = k; // skyv [i] mot høyre ett hkk til // vi finner riktig plss til t while (i >= 0 && [i] > t) { [i + 1] = [i]; i--; // sett t inn på riktig plss [i + 1] = t; // end heltll-sortering >jv TestInnstikkSortering b[0]= 1 b[1]= 2 b[2]= 3 b[3]= 7 b[4]= 14 b[5]= 77 b[6]= 156 Resultt v sortering med heltlls-metoden kodet, de to ndre tomme Sortering v tekster (String) "Ol "Kri "Arne "Jo" Test tekst-sortering: nvn[0]= Ol nvn[1]= Kri nvn[2]= Arne nvn[3]= Jo Test 2dim tekst-sortering: telefonliste[0]= Per, med tlf.: 22852451 telefonliste[1]= Arne, med tlf.: 33445566 telefonliste[2]= Kri, med tlf.: 44452611 telefonliste[3]= Jo, med tlf.: 55010102 Vi skl sortere denne ved å bytte om på pekerne (l [0] peker på Arne, osv.) med innstikkmetoden 20
Sortere de to første elementene ved å bytte om pekere t "Ol "Kri "Arne "Jo" t = [1]; "Ol "Kri "Arne "Jo" public sttic void sorter(int [] ) { // Sorterer heltllsrryen ''. for (int k = 0 ; k <.length-1; k++) { int t = [k + 1], i = k; while (i >= 0 && [i] > t) { [i + 1] = [i]; i--; [i + 1] = t; // end heltll-sortering t [1]= [0]; "Ol "Kri "Arne "Jo" t [0]= t; public sttic void sorter(string [] ) { // Sorterer String-rryen ''. for (int k = 0 ; k <.length-1; k++) { String t = [k + 1]; int i = k; while (i >= 0 && ( [i].compreto(t) > 0) ){ [i + 1] = [i]; i--; [i + 1] = t; // end String-sortering >jv TestInnstikkSortering b[0]= 1 b[1]= 2 b[2]= 3 Test med heltll og enkel String-sortering kodet, 2dim sortering tom b[3]= 7 b[4]= 14 b[5]= 77 b[6]= 156 Sortering v 2-dim String rry "Per "22852451" "Arne "33445566" Test tekst-sortering: nvn[0]= Arne nvn[1]= Jo nvn[2]= Kri nvn[3]= Ol "Kri "44452611" "Jo 55010102 Test 2dim tekst-sortering: telefonliste[0]= Per, med tlf.: 22852451 telefonliste[1]= Arne, med tlf.: 33445566 telefonliste[2]= Kri, med tlf.: 44452611 telefonliste[3]= Jo, med tlf.: 55010102 Vi kn sortere denne på to måter: Bytte om på pekerne til rdene (l [0] peker på Arne -rden,..osv) Enklest Bytte om på pekerne til hvert element i hver rd Mye mer rbeid, vnskeligere kode, lngsommere 24
public sttic void sorter(string [] ) { // Sorterer String-rryen ''. for (int k = 0 ; k <.length-1; k++) { String t = [k + 1]; int i = k; while (i >= 0 && ( [i].compreto(t) > 0) ){ [i + 1] = [i]; i--; [i + 1] = t; // end String-sortering public sttic void sorteretterkol1(string [] [] ) { // Sorterer den 2-dim String-rryen ' ettter verdi i kol.1. for (int k = 0 ; k <.length-1; k++) { String [] trd = [k + 1]; int i = k; while (i >= 0 && ( [i][0].compreto(trd[0]) > 0) ){ [i + 1] = [i]; i--; [i + 1] = trd; // end 2-dim String-sortering M:\INF1000\prog2>jv TestInnstikkSortering b[0]= 1 b[1]= 2 Alle sorterings metodene skrevet b[2]= 3 b[3]= 7 b[4]= 14 b[5]= 77 b[6]= 156 Test tekst-sortering: nvn[0]= Arne nvn[1]= Jo nvn[2]= Kri nvn[3]= Ol Test 2dim tekst-sortering: telefonliste[0]= Arne, med tlf.: 33445566 telefonliste[1]= Jo, med tlf.: 55010102 telefonliste[2]= Kri, med tlf.: 44452611 telefonliste[3]= Per, med tlf.: 22852451 Jvdoc proff dokumentsjon v klssene Legg inn spesielle kommentrer i progrmmet ditt (over hver metode og klsse) Kjør progrmmet jvdoc som utomtisk genererer en oversiktlig dokumentsjon 27 /** Klsse for sortering etter 'innstikk-metoden', se Rett på Jv - kp.5.7. Sortering v heltllsrry, tekster og en to-dimensjonl tekst-rry sortert etter verdiene i første kolonne.<br> N.B. Bre velegnet for mindre enn 100 elementer. * Copyright : A.Mus, Univ. i Oslo, 2003 **********************************************************/ public clss ISort { /** Sorterer heltll i stigende rekkefølge @prm heltllsrryen som sorteres * Endrer prmeter-rryen. ********************************************/ public sttic void sorter(int [] ) { /** * Sorterer String-rryer i stigende leksikogrfisk orden. @prm rryen som sorteres * Endrer prmeter-rryen ********************************************/ public sttic void sorter(string [] ) { /** * Sorterer en to-dimensjonle String-rry * etter verdiene i første kolonne. * Nytter pekerombytting v rdpekerne. * Antr t lle rdene hr minst ett element * @prm en to-dimensjonl rry som sorteres * Endrer prmeter-rryen. ******************************************************/ public sttic void sorteretterkol1(string [] [] ) { // end clss ISort
Dokumentsjon v klssen og metodene -jvdoc >jvdoc ISort.jv Loding source file ISort.jv... Constructing Jvdoc informtion... Stndrd Doclet version 1.4.2 Generting constnt-vlues.html... Building tree for ll the pckges nd clsses... Building index for ll the pckges nd clsses... Generting overview-tree.html... Generting index-ll.html... Generting deprected-list.html... Building index for ll clsses... Generting llclsses-frme.html... Generting llclsses-nofrme.html... Generting index.html... Generting pckges.html... Generting ISort.html... Generting pckge-list... Generting help-doc.html... Generting stylesheet.css... 29 Eksmen høsten 2003 Den store bøygen i INF1000 er de obligtoriske oppgvene Hovedformålet med eksmen er å skille ut de som hr skjønt litt om progrmmering fr de som ikke hr skjønt noe For de som hr løst de obligtoriske oppgvene uten mye hjelp, bør eksmen være gnske enkel 32
Eksmen høsten 2003 I dg tr vi oppgve 1 Resten v oppgvesettet gjennomgås senere Oppgve 1.1 Hvilke utsgn er riktige om en vribel deklrert i en objektmetode? Før vi foretr en tilordning til vribelen hr den ingen verdi Den kn h en ksessmodifiktor (f eks privte eller public) Andre objektmetoder i smme klsse hr tilgng (ksess) til vribelen Objektmetoder i ndre klsser hr tilgng (ksess) til den vi prikk-notsjon 33 34 Oppgve 1.1 vurderinger NB! Les oppgveteksten nøye!... i en objektmetode? Vrible i metoder er lltid utilgjengelige utenfr. Derfor er det også uktuelt med ksessmodifiktor Oppgve 1.1 svr Svret på oppgve 1.1 er ltså lterntiv 1: Før vi foretr en tilordning til vribelen hr den ingen verdi Som lle vrible er metodevrible uten verdi i strten. De kn initieres ved deklrsjonen: int x = 0; eller ved en tilordning senere 35 36
Oppgve 1.2 Hvilke utsgn er riktige om en objektvribel? Før vi foretr en tilordning hr den ingen verdi Den kn h en ksessmodifiktor (f eks privte eller public) Objektmetoder i smme klsse hr tilgng (ksess) til vribelen Objektmetoder i ndre klsser hr tilgng (ksess) til den vi prikk-notsjon dersom vribelen er deklrert som public Oppgve 1.2 vurderinger Vi hr følgende ksessmodifiktorer: Privte: skjult for lle ndre klsser Protected: skjult for lle ndre klsser (unnttt subklsser) kun tilgjengelig for klsser i smme pkke public åpen for lle Dere vet ikke hv pkker og subklsser er; det kommer i INF1010 Dere trenger bre å vite: privte skjult public åpen 37 38 Oppgve 1.2 svr Oppgve 1.3 Svret på oppgve 1.2 er d lle lterntivene 1, 2, 3, 4 Hvor mnge heltll settes det v plss til (rrylengde) i setningen int[] tllene = new int[100]; Alterntiver: 99, 100, 101 heltll Svr: 100 heltll 39 40
Oppgve 1.4 Oppgve 1.5 Hvor mnge gnger skrives Eksmen ut? for (int i = 0; i < 100; i++) { for (int j = 0; j < 99; j++) { System.out.println( Eksmen ); Hvor mnge gnger skrives INF 1000 ut? for (int i = 0; i < 3; i++) { for (int j = 0; j <= i; j++) { System.out.println("INF 1000"); Svr: 100 * 99 = 9900 gnger 41 42 Oppgve 1.5 svr Oppgve 1.6 i 0 1 2 Svr: 6 gnger j 0 0, 1 0, 1, 2 Hvilken verdi hr lder etter denne koden? int lder = 4; int nylder = lder--; // A lder += nylder; // B lder++; // C 43 44
Oppgve 1.6 svr Utskrift A B C lder 3 7 8 nylder Svr: lder hr verdien 8 etter t lle setningene er utført 4 4 4 Oppgve 1.7 Ant t vi hr et progrm hvor en v klssene blnt nnet hr følgende objektvribeldeklrsjon: HshMp personer = new HshMp(); Klssen inneholder blnt nnet metoder for å legge inn objekter v klssen Person (med en pssende nøkkel, f eks personnummer) i HshMp-en og for å løpe gjennom lle Person-objektene i HshMpen. Sistnevnte metode, som skl klle på en metode SkrivUt() i hvert v objektene i HshMp-en, ser slik ut: void skrivalle () { Itertor liste = personer.vlues().itertor(); while (liste.hsnext()) {... b.skrivut(); 45 46 Oppgve 1.7 Innholdet i while-løkken ovenfor er ikke ferdig utfylt. Hvilke(t) v følgende lterntiver kn vi ersttte... med slik t metoden virker slik den skl? Person b = it.next(); Person b = (Person)it.next(); Person b = liste.next(); Person b = (Person)liste.next(); Bil b = (Bil)it.next(); Oppgve 1.7 vurderinger NB! En del spørsmål vil være formet slik t de sjekker forståelse. Målet er t de som kopierer blindt fr læreboken eller lysrk, skl tbbe seg ut De fleste eksemplene kller itertoren for it, men i dette eksemplet heter den liste Determnge eksemplermed Bil i læreboken, men de hr ingenting med dette eksemplet å gjøre Derimot demonstrerer eksemplene t mn må typekonvertere når mn bruker en itertor Ingen v lterntivene ovenfor 47 48
Oppgve 1.7 svr Oppgve 1.8 Svret på oppgve 1.7 blir d lterntiv 4: Person b = (Person)liste.next(); 49 Hv skrives ut? int i = 11; int j = i; int k = 32; j er 11, j*i er 121 if (k > j * i k < i) { System.out.println("A"); else { if (k < j * i && k > i) { System.out.println("B"); else { System.out.println("C"); Svr: B 32 > 121 er flse 32 < 11 er flse 32 < 121 er true 32 > 11 er true 50 Oppgve 1.9 Oppgve 1.9 svr Hvordn beregne summen v tllene i? int[] = new int[77]; int sum = 0; int i = 0; while (i <.length) { sum = [i]; i++; int i = 0; while (i <.length) { sum += [i]; ++j; int i = 0; while (i <.length) { sum += [i]; i++; Feil sum, får sum = [76] Feil sum, evig løkke, sum = [0]+[0]+ JA riktig sum 51 int i = 0; while (i++ <.length) { sum += [i-1]; JA riktig sum 52
Oppgve 1.9 svr Oppgve 1.10 Hvilken verdi får k? for (int i = 0; i <.length; i++) { sum += [i]; for (int i = 1; i <=.length; i++) { sum += [i-1]; JA riktig sum JA riktig sum int i = 11; int k = i/3; Alterntiver: 3, 3.67, 4, ingen v lt. Svr: k blir 3 (heltllsdivisjon) for (int i = 0; i <.length; ++i) { sum = sum + [i]; JA riktig sum 53 54 Oppgve 1.11 Oppgve 1.12 void dobleverdi(int k) { k = k * 2; Hv blir k? Alterntiver: 12, 24, 6 Svr: 12 (ikke retur) Ant t følgende progrm utføres: clss Studentregister { public sttic void min (String[] rg) { Student s = new Student("Ole", "Krl Johns gt 1"); Student p = new Student("Mrit","Krl Johns gt 2"); System.out.println(s.fåNvn()+" og "+p.fånvn()); clss Student { String nvn = "Grete"; String dresse = "Blindernveien 3"; int k = 12 dobleverdi(k) System.out.println( Verdien til k er + k); Student (String nvn, String dresse) { this.nvn = nvn; this.dresse = dresse; String fånvn () {return nvn; 55 56
Oppgve 1.12 Hv blir utskriften på skjermen? Grete og Grete Ole og Ole Mrit og Mrit nvn og nvn Ole og Mrit s.fånvn() og s.fånvn() Mrit og Ole Ingen v lterntivene over Oppgve 1.12 vurderinger Det er ingen klssevrible (ngitt med sttic) i denne oppgven, kun vnlige objektvrible Deklrsjonene String nvn = "Grete"; String dresse = "Blindernveien 3"; utføres først hver gng et nytt objekt lges, men overskrives så v det som skjer i konstruktøren: Student (String nvn, String dresse) { this.nvn = nvn; this.dresse = dresse; Metoden fånvn er en vnlig objektmetode og utføres inne i det objektet som ngis i kllet: 57 s.fånvn() og p.fånvn() 58 Oppgve 1.12 svr Det riktige svret på oppgve 1.12 blir d lterntiv 5: Ole og Mrit 59