Grundläggande programmering, STS 1, VT 2007. Sven Sandberg Föreläsning 12 I torsdags: Klassen TelefonKostnad Exemplifierar objektorienterad design, metoder, konstruktorer static Standardklassen Math Matematiska funktioner Exemplifierar static Slumptal Mittkurs-utvärdering Idag: Uppföljning mittkurs-utvärdering Arrayer: Motivering, teori och exempel
Mittkurs-utvärdering uppföljning Föreläsningar: Är uppskattade tack! Har bra tempo (20 tycker lagom, 4 snabbt, 1 långsamt) Har halkat efter labbar och lektioner Åtgärd: Hoppar över ett exempel idag och går direkt till arrayer Åtgärd: Vi använder fler reservföreläsningar Åtgärd: Jag använder hela föreläsningstiden Bra varva BlueJ / OH / tavla. BlueJ bäst, tavla sämst Åtgärd: ingen kod eller teori på tavla bara nyckelord, uppgifter etc
Mittkurs-utvärdering uppföljning Examination: Oklara former Boken: Åtgärd: Jag förklarar examinationsformer idag Åtgärd: Jag går igenom dugga, projekt och essä idag Åtgärd: Jag gör kopplingar till boken på föreläsningar Se även hemsidan!
Mittkurs-utvärdering uppföljning Labbar: För långa väntetider Åtgärd: Labhandledarna medvetna om problemet Åtgärd: De som är kvar från förra labben får lägst prioritet Oklara labinstruktioner Åtgärd: Jag kan eventuellt se över lab 4 & 5 MEN: Konkreta exempel efterlyses! Vi vill använda Java på hemsidor Åtgärd: OK, det får ni på lab 5 Lektioner: Några vill ha mer hjälp & mindre redovisning Ingen åtgärd: inte så många tog upp det, och det är knepigt att ändra examinationsformer
Examination För betyg 3: G på varje delmoment För betyg 4 eller 5: Kvalitetspoäng (51 p = betyg 4, 71 p = betyg 5) Fås för: Lektionsuppgifter (poäng för att ha förberett) Labbar (G vid första deadline => 2 p) Projekt (svårt projekt ger mer poäng) Dugga Essä Kvalitetspoäng kan inte användas för att få betyg 3 om något moment saknas Se hemsidan!
Dugga Former: 14 maj 3 timmar Flervalsfrågor Innehåll: Som förra årets dugga, men lättare Se hemsidan, under material / gamla tentor Programförståelse Frågetyper: Vad skriver programmet i uppgiften ut? Lucktext: Vad ska xxx i programmet bytas ut mot? Förberedelse: Skriv / läs programexempel Se under Material på hemsidan!
Essä Former: enskilt arbete ca 1-2 sidor med normal formatering inlämning senast 25 maj Uppgift: rubrik: Objektorienterad programmering som problemslösningsstrategi diskutera OOP som strategi för att lösa programmerings-relaterade problem inom teknik personlig betraktelse: redovisa fakta, bedöm, ta ställning Se hemsidan!
Projekt Former: grupper om 2 (behöver inte vara labgrupper) 16 maj: delredovisning (ca 1-2 sidor) 29 maj: sista inlämning (rapport + kod) 31 maj & 1 juni: redovisning i seminarieform disputation, men snällare varje projektgrupp opponerar på en annan grupp Se hemsidan
Projekt Förslag till projekt: eget fia med knuff platsbokning på SJ räkna med stora tal spelet Life kalender blocket kontaktförmedling Yatzy Max 5 grupper per projekt
Projekt Hur man klarar projektet Kom ihåg FISK! Fundera först (och mest) på vad som finns, därefter på vad som händer Utgå från problemet, inte från Java Koda en bit i taget T.ex. metod eller del av metod Testa M.a.o.: lös delproblem först Enkel main som testar en metod är ofta bra Börja idag. Det stora och svåra problemet är att hitta en bra struktur. Tänk igenom före delredovisningen.
Och nu: ARRAYER!
Arrayer: motivering Uppgift Läs in 6 tal Läs in ett tal till (kalla det x) Tala om ifall x fanns bland de 6 Exempelkörning: Mata in 6 tal: 2713 87 115 62 11 4 Mata in ett till: 11 Talet fanns i listan!
Arrayer: motivering En lösning: Vi behöver spara alla 6 talen 6 variabler i main-metoden: Std.out.println( Mata in 6 tal: ); int tal1, tal2, tal3, tal4, tal5, tal6; tal1 = Std.in.readInt(); tal2 = Std.in.readInt(); tal3 = Std.in.readInt(); tal4 = Std.in.readInt(); tal5 = Std.in.readInt(); tal6 = Std.in.readInt(); Std.out.println( Mata in ett till: ); int tal = Std.in.readInt(); if (tal == tal1 tal == tal2 tal == tal3 tal == tal4 tal == tal5 tal == tal6) Std.out.println( Talet fanns i listan! ); else Std.out.println( Talet fanns inte i listan! );
Arrayer: motivering OK, men om vi ska kunna mata in 100 tal? 100 variabler med olika namn: i main-metoden: Std.out.println("Mata in 100 tal:"); int tal1, tal2, tal3, tal4, tal5, tal6, tal7, tal8, tal9, tal10, tal11, tal12, tal13, tal14, tal15, tal16, tal17, tal18, tal19, tal20, tal21, tal22, tal23, tal24, tal25, tal26, tal27, tal28, tal29, tal30, tal31, tal32, tal33, tal34, tal35, tal36, tal37, tal38, tal39, tal40, tal41, tal42, tal43, tal44, tal45, tal46, tal47, tal48, tal49, tal50, tal51, tal52, tal53, tal54, tal55, tal56, tal57, tal58, tal59, tal60, tal61, tal62, tal63, tal64, tal65, tal66, tal67, tal68, tal69, tal70, tal71, tal72, tal73, tal74, tal75, tal76, tal77, tal78, tal79, tal80, tal81, tal82, tal83, tal84, tal85, tal86, tal87, tal88, tal89, tal90, tal91, tal92, tal93, tal94, tal95, tal96, tal97, tal98, tal99, tal100; tal1=std.in.readint(); tal2=std.in.readint(); tal3=std.in.readint(); tal4=std.in.readint(); tal5=std.in.readint(); tal6=std.in.readint(); tal7=std.in.readint(); tal8=std.in.readint(); tal9=std.in.readint(); tal10=std.in.readint(); tal11=std.in.readint(); tal12=std.in.readint(); tal13=std.in.readint(); tal14=std.in.readint (); tal15=std.in.readint(); tal16=std.in.readint(); tal17=std.in.readint(); tal18=std.in.readint(); tal19=std.in.readint(); tal20=std.in.readint(); tal21=std.in.readint(); tal22=std.in.readint(); tal23=std.in.readint(); tal24=std.in.readint(); tal25=std.in.readint(); tal26=std.in.readint(); tal27=std.in.readint (); tal28=std.in.readint(); tal29=std.in.readint(); tal30=std.in.readint(); tal31=std.in.readint(); tal32=std.in.readint(); tal33=std.in.readint(); tal34=std.in.readint(); tal35=std.in.readint(); tal36=std.in.readint(); tal37=std.in.readint(); tal38=std.in.readint(); tal39=std.in.readint(); tal40=std.in.readint (); tal41=std.in.readint(); tal42=std.in.readint(); tal43=std.in.readint(); tal44=std.in.readint(); tal45=std.in.readint(); tal46=std.in.readint(); tal47=std.in.readint(); tal48=std.in.readint(); tal49=std.in.readint(); tal50=std.in.readint(); tal51=std.in.readint(); tal52=std.in.readint(); tal53=std.in.readint (); tal54=std.in.readint(); tal55=std.in.readint(); tal56=std.in.readint(); tal57=std.in.readint(); tal58=std.in.readint(); tal59=std.in.readint(); tal60=std.in.readint(); tal61=std.in.readint(); tal62=std.in.readint(); tal63=std.in.readint(); tal64=std.in.readint(); tal65=std.in.readint(); tal66=std.in.readint (); tal67=std.in.readint(); tal68=std.in.readint(); tal69=std.in.readint(); tal70=std.in.readint(); tal71=std.in.readint(); tal72=std.in.readint(); tal73=std.in.readint(); tal74=std.in.readint(); tal75=std.in.readint(); tal76=std.in.readint(); tal77=std.in.readint(); tal78=std.in.readint(); tal79=std.in.readint (); tal80=std.in.readint(); tal81=std.in.readint(); tal82=std.in.readint(); tal83=std.in.readint(); tal84=std.in.readint(); tal85=std.in.readint(); tal86=std.in.readint(); tal87=std.in.readint(); tal88=std.in.readint(); tal89=std.in.readint(); tal90=std.in.readint(); tal91=std.in.readint(); tal92=std.in.readint (); tal93=std.in.readint(); tal94=std.in.readint(); tal95=std.in.readint(); tal96=std.in.readint(); tal97=std.in.readint(); tal98=std.in.readint(); tal99=std.in.readint(); tal100=std.in.readint(); Std.out.println("Mata in ett till:"); int tal=std.in.readint(); if (tal==tal1 tal==tal2 tal==tal3 tal==tal4 tal==tal5 tal==tal6 tal==tal7 tal==tal8 tal==tal9 tal==tal10 tal==tal11 tal==tal12 tal==tal13 tal==tal14 tal==tal15 tal==tal16 tal==tal17 tal==tal18 tal==tal19 tal==tal20 tal==tal21 tal==tal22 tal==tal23 tal==tal24 tal==tal25 tal==tal26 tal==tal27 tal==tal28 tal==tal29 tal==tal30 tal==tal31 tal==tal32 tal==tal33 tal==tal34 tal==tal35 tal==tal36 tal==tal37 tal==tal38 tal==tal39 tal==tal40 tal==tal41 tal==tal42 tal==tal43 tal==tal44 tal==tal45 tal==tal46 tal==tal47 tal==tal48 tal==tal49 tal==tal50 tal==tal51 tal==tal52 tal==tal53 tal==tal54 tal==tal55 tal==tal56 tal==tal57 tal==tal58 tal==tal59 tal==tal60 tal==tal61 tal==tal62 tal==tal63 tal==tal64 tal==tal65 tal==tal66 tal==tal67 tal==tal68 tal==tal69 tal==tal70 tal==tal71 tal==tal72 tal==tal73 tal==tal74 tal==tal75 tal==tal76 tal==tal77 tal==tal78 tal==tal79 tal==tal80 tal==tal81 tal==tal82 tal==tal83 tal==tal84 tal==tal85 tal==tal86 tal==tal87 tal==tal88 tal==tal89 tal==tal90 tal==tal91 tal==tal92 tal==tal93 tal==tal94 tal==tal95 tal==tal96 tal==tal97 tal==tal98 tal==tal99 tal==tal100) Std.out.println("Talet finns i listan!"); else Std.out.println("Talet finns inte i listan!");... eller arrayer!
Arrayer: teori förklaring Vanliga variabler innehåller ett värde En array (synonymer: fält, matris) innehåller en tabell av värden Varje element kan användas som en variabel: det kan få ett värde värdet kan användas i beräkningar vanlig variabel: array: 0.1 0.2 0.5 3.1 5.0-10.0 2.8 dessa är arrayens 7 element 5.0
Arrayer: teori typer Varje array har en och samma typ på alla element (t.ex. int, double, String, TelefonKostnad) Exempel: En int-array för 100-tal-exemplet En double-array för att lagra matematiska vektorer En String-array för att lagra namnen på alla studenter i kursen En TelefonKostnad-array för att lagra alla telefoner på Susanna Import & Export
Arrayer: teori deklarera och skapa nya deklaration (skapar en variabel som kan referera till en array): double[] listaavtal; initiering: skapar en doublearray med 5 element listaavtal = new double[5]; låter listaavtal referera till den nya arrayen hakparenteser gör att vi får en referens till array, i stället för bara ett värde
Arrayer: teori deklarera och skapa nya new ger defaultvärde 0 för alla element double[] listaavtal; listaavtal = new double[5]; I minnet: listaavtal: 0.0 0.0 0.0 0.0 0.0
Arrayer: teori åtkomst sker via indexering Varje element i arrayen har ett nummer, som kallas index. Första elementet har index 0 Sista elementet har index: (antal element)-1 double[] listaavtal; listaavtal = new double[5]; index 0 index 1 index 2 index 3 index 4 listaavtal: 0.0 0.0 0.0 0.0 0.0
Arrayer: teori åtkomst sker via indexering Enskilda element i arrayen kommer man åt med indexering double[] listaavtal; listaavtal = new double[5]; listaavtal[1] = 40.0; (sätter element 1 till 40) listaavtal[4] = 2.0; (sätter element 4 till 2) Std.out.println(listaAvTal[0]); (Skriver ut 0.0) Std.out.println(listaAvTal[1]); (Skriver ut 40.0) index 0 index 1 index 2 index 3 index 4 listaavtal: 0.0 40.0 0.0 0.0 2.0
Arrayer: teori åtkomst sker via indexering Kan indexeras med vilket heltal som helst, även variabler och uttryck double[] listaavtal; listaavtal = new double[5]; for (int i = 0; i < 5; i++) listaavtal[i] = i * 2.5; index 0 index 1 index 2 index 3 index 4 listaavtal: 0.0 2.5 5.0 7.5 10.0
Arrayer: exempel 100-tal-uppgiften Kom ihåg: uppgift Läs in 100 tal Läs in ett tal till (kalla det x) Tala om ifall x fanns bland de 6 Exempelkörning: Mata in 100 tal: 2713 87... 11 4 Mata in ett till: 11 Talet fanns i listan!
Arrayer: exempel Vänd på lista Uppgift: Läs in ett heltal n Läs in n stycken flyttal Skriv ut talen i omvänd ordning Exempelkörning: Hur många tal vill du mata in? 3 Mata in 3 tal: 43.4 11 4 Talen i omvänd ordning: 4 11 43.4
Mer array-teori: längd Arrayens längd sparas i instansvariabeln length: double[] listaavtal; listaavtal = new double[5]; Std.out.println(listaAvTal.length); (skriver ut 5) Inte en metod: Kan inte ändras: listaavtal.length() listaavtal.length = 10 index 0 index 1 index 2 index 3 index 4 listaavtal: 0.0 40.0 0.0 0.0 2.0 length = 5
Teori: null Ibland vill man att en variabel av klasstyp (String, TelefonKostnad osv) inte ska referera till något objekt Det görs genom att den får värdet null: String text = null; null är ett nyckelord i Java Varibel som refererar till objekt: var: Varibel med värde null: var:
Teori: null Endast variabler av klasstyp kan vara null. Variabler av atomiska typer (int, boolean osv) kan inte vara null Instansvariabler och metoder kan inte användas. Följande ger fel vid körning: TelefonKostnad olasmobil = null; olasmobil.skickasms(); // metodanrop går inte! olasmobil.variabel = 3; // instansvariabler kan inte använda (varför måste det bli fel?)
Teori: null En variabel av typen String med värdet null är inte en sträng av längd 0 M.a.o.: det är skillnad på String ingetobjekt = null; och String tomsträng = ; Varför? (ledning: se förra OH-bilden)
Teori: Default-värden Klassvariabler och instansvariabler kan deklareras och ges ett värde samtidigt: class Test { private int x = 4; private String namn = Lisa ; } Om de inte ges värde får de default-värde: class Test { private int x; // x blir 0 private String namn; // namn blir null } Beror på typen: default för tal (int, double, osv) är 0 default för boolean är false default för referensvariabler (t.ex. objekt) är null
Teori: Default-värden för arrayer Arrayvariabler är referenser Alltså: defaultvärde null Varje element i arrayen har en typ När en array skapas, får varje element defaultvärdet för typen String[] listaavtexter; int[] listaavheltal; // nu har både listaavtexter och listaavheltal värdet null listaavtexter = new String[3]; listaavheltal = new int[4]; // nu refererar listaavtexter till arrayen { null, null, null } // nu refererar listaavheltal till arrayen { 0, 0, 0, 0 }
Mer array-teori: skapa ny och initiera samtidigt En array kan få sina värden då den skapas måsvingar double[] listaavtal = { 3.1, 7.8, 6.0 }; Std.out.println(listaAvTal.length); (skriver ut 3) Std.out.println(listaAvTal[0]); (skriver ut 3.1) Std.out.println(listaAvTal[1]); (skriver ut 7.8) Std.out.println(listaAvTal[2]); (skriver ut 6.0) Används i stället för new + tilldelning Nu behövs inte new Arrayens längd = antal angivna element listaavtal: index 0 index 1 index 2 3.1 7.8 6.0 length = 3
Mer array-teori: arrayer av objekt En array av objekttyp måsvingar double[] listaavtal = { 3.1, 7.8, 6.0 }; Std.out.println(listaAvTal.length); (skriver ut 3) Std.out.println(listaAvTal[0]); (skriver ut 3.1) Std.out.println(listaAvTal[1]); (skriver ut 7.8) Std.out.println(listaAvTal[2]); (skriver ut 6.0) Nu behövs inte new. arrayens längd = antal angivna element listaavtal: index 0 index 1 index 2 3.1 7.8 6.0 length = 3
Mer array-exempel: månadernas namn Uppgift: Skriv ett program som läser in ett heltal från 1 till 12 och skriver ut namnet på motsvarande månad Använd en array Exempelkörning: Skriv månadens nummer: 5 Månad 5 heter maj
Mer array-exempel: Varannat tal Uppgift: Läs in en array av flyttal Skriv ut summan av alla tal på jämna positioner, summan av alla tal på udda positioner, och summan av alla tal. Exempelkörning: Hur många tal vill du skriva in? 4 Skriv in 4 tal: 1 10 2 20 Summan av tal på jämna positioner: 3 Summan av tal på udda positioner: 30 Summan av alla tal: 33 index 0 index 1 index 2 index 3 index 4 0.0 40.0 0.0 0.0 2.0 jämn udda jämn udda jämn
Mer array-exempel: Summera Uppgift: fyll i det som fattas! class Summera { public static void main(string[] args) { int[] array1 = { 13, -22, 82, 17, 31, 11, 40, -100, -12, 1}; int[] array2 = {-12, 24, -79, -13, -1, -1, 49, 7, 310, 9}; int[] summa = new int[10]; // Summera värden från motsvarande element i array1 och array2 // och spara resultatet i summa. System.out.println("Summor: "); // Skriv ut alla värden i summa. } }
Mer array-exempel: Näst största Uppgift: Läs in en array av flyttal Skriv ut det näst största talet Exempelkörning: Hur många tal vill du skriva in? 4 Skriv in 4 tal: 1 10 2 20 Det näst största är 10
Mer array-exempel: Öka arraykapaciteten Uppgift: Skriv en metod som: tar en int-array som parameter returnerar en int-array som har dubbelt så många element som den givna arrayen första halvan ska innehålla samma värden som den givna arrayen andra halvan ska bara innehålla nollor Exempel: Parameter: 3 7 6 Returvärde: 3 7 6 0 0 0
Mer array-exempel: Rotera array Uppgift: Skriv en metod som: tar en int-array som parameter flyttar alla element ett steg bakåt (till lägre index), utom det första, som läggs sist index 0 index 1 index 2 index 3 index 4
Fundera hemma: Sortering Uppgift: Läs in en array av flyttal Skriv ut arrayen sorterad med det minsta först Exempelkörning: Hur många tal vill du skriva in? 4 Skriv in 4 tal: 8 5 1 2 9 Sorterade: 1 2 5 8 9