Arrayer. Indexerade variabler, arrayer, fält Statistiska mått Sortering Sökalgoritmer Rita polygoner Objektarrayer Starta program med argument

Relevanta dokument
Kort om klasser och objekt En introduktion till GUI-programmering i Java

Lite logik. Kap 6: Sid 2

Frivillig Java-swing-Graphics-lab Programmeringsteknik MN1 vt02

Föreläsning 3-4 Innehåll

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Applets med komponenter

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Programmeringsteknik II - HT18. Föreläsning 6: Grafik och händelsestyrda program med användargränssnitt (och Java-interface) Johan Öfverstedt

TENTAMEN OOP

Föreläsning REPETITION & EXTENTA

Lösningar för tenta 3 DAT043,

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Rita Egna Bilder, Timer

Föreläsnings 11 - GUI, Händelsestyrda program, MVC

Två designmönster, MVC och Observer/Observable. Objektorienterad programvaruutveckling GU (DIT011)

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

2D1339 Programkonstruktion för F1, ht 2004

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

ID1004 Laboration 3, 5-6 November 2012

Föreläsning 8 SLUMPTAL, SIMULERING + INTRODUKTION TILL VEKTORER

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Mer om grafiska komponenter. Händelsestyrda program

Objektorienterad programmering i Java

Lab5 för prgmedcl04 Grafik

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

TENTAMEN OOP

Instuderingsfrågor, del D

Föreläsning 2, vecka 8: Repetition

Programmeringsteknik och Matlab. Dagens program. Viktiga datum. Repetitionsexempel. Repetition av if/else, for, while och Scanner

Tentamen i Objektorienterad programmering

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Exempel på användning av arv: Geometriska figurer

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Föreläsning 9-10 Innehåll

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

TENTAMEN OOP

Lösningsförslag till tentamen

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Föreläsning 3. Iteration while-satsen

Föreläsning 5-6 Innehåll

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Laboration 24 Databasen MySQL och java

2D1339 Programkonstruktion för F1, ht 2003

Grundläggande programmering med C# 7,5 högskolepoäng

Grafik, bilder och ljud

5. En metod som anropar sig själv a) får inte förekomma i Java-program b) kallas destruktiv c) kallas iterativ d) kallas rekursiv 6. Vilka värden har

Tentamen OOP

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

DD1342 Programkonstruktion för F1, ht 2007

Dagens föreläsning. Sett i datorsalarna. Mer om arrayer. Matriser. Formatering av utskrifter. Inläsning med hjälp av Scanner-klassen

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Exempelduggan. Luffarschack. Koda spel

Lite om reella tal. Programmering. I java. Om operatorers associativitet och prioritet

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

lgammal2.txt // Lösningar till gammal tentamen // Uppgift 1 a

Del A (obligatorisk för alla)

JAVA Mer om klasser och objektorientering

PROGRAMMERINGSTEKNIK TIN212

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 3

Laboration 4: Game of Life

Detta dokument är ett exempel, cirka andra hälften av en tentamen för TDA545 Objektorienterad programvaruutveckling

Föreläsning 14: Grafik & mera händelsehantering

2D1339 Programkonstruktion för F1, ht 2003

725G61 - Laboration 2 Loopar och arrayer. Johan Falkenjack

[] Arrayer = Indexerad variabel

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Tentamen , Introduktion till Java, dtaa98, dtea53

Iteration while-satsen

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Laboration 13, Arrayer och objekt

Lösningsförslag till tentamen

Föreläsning 6: Metoder och fält (arrays)

Programstruktur och terminologi. Programmet producerar följande utskrift i terminalfönstret: Ett Javaprogram består av en eller flera klasser

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

System.out.println("Jaså du har "+ antalhusdjur+ " husdjur"); if ( antalhusdjur > 5 ) System.out.println("Oj det var många);

Objektorienterad programmering. Telefonboken igen, en bättre version. En jämförelse. Föreläsning 4

TENTAMEN I. OBJEKTORIENTERAD PROGRAMMERING för Z1. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Uppgift: Algoritm för att beräkna kontrollsiffran i ett personnummer givet de 9 första siffrorna. Torrsimning av algoritm för personnummer

Lösningsförslag tentamen FYTA11 Java

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

Tentamen i Objektorienterad programmering E

Transkript:

Swing * Eclipse * Midlets * Android 9 Arrayer Indexerade variabler, arrayer, fält Statistiska mått Sortering Sökalgoritmer Rita polygoner Objektarrayer Starta program med argument Sectordata 2010

Kap 9 : Sid 2 I detta kapitel introduceras begreppet array, motsvarigheten till matematikens indicerade variabler (till exempel x 1, x 2, x i, x n ) och begrppet matris ( = tvådimensionell array). I de inledande avsnitten får du lära dig hur man beräknar summor av tal i arrayer, samt medel-, max- och minvärden Vidare presenteras algoritmer för sortering och sökning. Dessa avsnitt kan eventuellt studeras separat. Därefter följer ett avsnitt som visar hur man utnyttjar arrayer för att rita polygoner. I några övningar får du sedan skapa arrayer av olika typer av objekt. Övningarna Rymdskepp, Personbil, Tarning och Asteroidarray ligger som grund för övningar i senare kapitel.

Kap 9 : Sid 3 Indexerade variabler, arrayer, fält Du deklarerar, som bekant, en vanlig primitiv variabel, t ex en heltalsvariabel, så här: int i; i 17 Du har då reserverat plats i minnet för ett heltal som vi refererar till som i. Variabeln i kan tilldelas heltal, t ex i = 17; Ibland behöver man arbeta med många variabler: int i,j,k, m; i = 17; j = 3; k = 5; m = 21; i j k 17 3 5 m 21 I matematiken arbetar du med variabler (x, y,z, ) När vi behöver många variabler använder vi ofta indexerade variabler. Exempel: x 1, x 2, x 3, x 4, x 5 De nedsänkta tecknen, 1,2, 3 kallas index I de flesta programmeringsspråk kan vi arbeta med sådana indexerade, numrerade, variabler. En uppsättning indexerade variabler kallas en array, ibland ett (endimensionellt) fält. Så här deklarerar man en heltalsarray, vi kallar den a, i Java: int[] a = new int[5]; Talet 5 inom klammer i högerledet dimensionerar arrayen, det vill säga talet anger att att arrayen ska ha 5 element. Med den här deklarationen reserveras plats för variablerna a[0], a[1], a[2], a[3] och a[4] (I matematiken skulle vi förmodligen skriva a 0, a 1, a 2, a 3 och a 4 ) a[0] a[1] a[2] a[3] a[4] Varje enskild variabel i arrayen, t ex a[2], kallas ett element i arrayen. Observera att det första elementet i en java-array alltid har nummer 0 (noll) När vi arbetar med indexerade variabler med många element kan vi av praktiska skäl inte skriva ut varje element. I matematiken skriver vi kanske a 0, a 1, a 2 a i a 999 Vi låter indexet representeras av en bokstav (oftast bokstaven i ) På samma sätt gör vi i dataprogram där arrayer används.

Kap 9 : Sid 4 Övning: Array Vi illustrerar det vi hittills har gått igenom med ett litet konsolprogram. I Eclipse: Skapa projektet Kap09 och klassen ArrayTest som ska innehålla följande kod: import java.util.*; public class ArrayTest{ public static void main( String[] arg ) { Scanner sc = new Scanner(System.in); int[] a = new int[5]; // här deklareras o dimensioneras arrayen for( int i = 0 ; i < 5 ; i++ ) { System.out.print("Skriv in tal nummer " + i + ": " ); a[i] = sc.nextint(); System.out.println("Du matade in dessa tal:"); for(int i=0 ; i < 5 ; i++) { System.out.println("Tal nummer " + i + " är " + a[i]); Du ser hur det fungerar, eller hur? Vi deklarerar arrayen a med 5 element som kommer att heta a[0], a[1], a[2], a[3] och a[4] I den första for-loopen låter vi undan för undan variabeln i anta värdena 0, 1, 2, 3 och 4 Inne i for-loopen kan vi mata in ett värde till a[i], det vill säga till a[0] när loopen körs första varvet, sedan till a[1] och så vidare I den andra for-loopen skrivs de inmatade talen ut på skärmen. Exekvera! Mata in talen 32, 26, 4711, -99 och 13 (ENTER efter varje.) Efter sista inmatningen kommer programmet snällt att skriva ut talen igen a[0] a[1] a[2] a[3] a[4] 32 26 4711-99 13 Lägg till dessa rader i programmet (efter den andra for-loopen i main-metoden): System.out.println("Baklänges:"); for(int i = 4 ; i >= 0 ; i-- ) { System.out.println("Tal nummer " + i + " är " + a[i]); Exekvera. Inmatade tal skrivs ut baklänges.

Kap 9 : Sid 5 Tilldela arrayen värden i koden När man arbetar med arrayer med få element kan man använda ett kort skrivsätt för att deklarera och dimensionera arrayen samt tilldela elementen värden direkt i koden - allt i ett enda svep. Heltalsarrayen, a, ovan, skulle exempelvis kunna deklarerars, dimensioneras och tilldelas värden så här: int[] a = { 32, 26, 4711, -99, 13 ; Vi ska utnyttja detta sätt att skapa arrayer i kommande övningar några sidor längre fram Vi har hittills exemplifierat arrayer med heltalsarrayer. På samma sätt kan vi arbeta med arrayer av flyttal (double), tecken (char) och logiska värden (boolean). Vi kan även använda arrayer av strängar vilket följande övning handlar om: Övning: Array of strings Skapa klassen ArrayTest2. Använd samma kod som i ArrayTest men ändra class-namnet till ArrayTest2 Ändra deklarationen av arrayen så att a i stället blir en en array of strings: String[] a = new String[5]; Ändra i första loopen så att man kan mata in strängar i stället för tal, så här: for( int i = 0 ; i < 5 ; i++ ) { System.out.print("Skriv in namn nummer " + i + ": " ); a[i] = sc.nextline(); Byt ut ordet tal mot namn i alla ledtexter. Kör. Skriv in strängar i stället för tal, t ex namn ( Kalle, Stina, Olle, Pelle, Johan ) Övning: Slumpa tal Vi återgår till heltalsarrayer för fler experiment. Om vi gör arrayerna större blir det arbetsamt att skriva in tal. Vi slumpar talen i stället. I programmet nedan slumpas 100 tal i intervallet 0-999 Skapa klassen SlumpArray och skriv in koden: public class SlumpArray { public static void main( String[] arg ) { int n = 100; int[] a = new int[n]; System.out.print("Arrayens element slumpas och skrivs ut:"); for(int i = 0 ; i < n ; i++) { if(i%10==0) System.out.println(); a[i] = (int)( 1000 * Math.random() ); System.out.print(a[i]+"\t"); if-satsen i loopen gör att vi får radbyte i utskriften efter vart 10-tal. Tecknet \t gör att en utskrift "tabbas fram" till nästa tabulatorläge på skärmen. Detta medför att talen kommer att skrivas i kolumner. Provkör!

Kap 9 : Sid 6 Matriser En "vanlig" variabel, x, kan vi åskådliggöra så här: x En array, ett endimensionellt fält, a, med fem element, kan vi rita så här: a[0] a[1] a[2] a[3] a[4] En matris, ett tvådimensionellt fält, m, med fem rader och tre kolumner ser ut så här: De fem raderna numreras som rad 0 till 4 De tre kolumnerna som kolumn 0 till 2 Exempel: Detta element ligger på rad 2 i kolumn 1 och betecknas m[2][1] m[0][0] m[1][0] m[4][0] m[0][2] m[4][2] Övning: Matris I matrisen ovan, skriv in hur de övriga elementen betecknas! I Java deklareras en matris, m, som innehåller heltal, och som har r rader och k kolumner med satsen int[][] m = new int[r][k]; Skapa klassen SlumpMatris. Skriv in koden nedan. public class SlumpMatris { public static void main( String[] arg ) { int r = 5, k = 3; int[][] m = new int[r][k]; System.out.println("Matriselementen slumpas och skrivs ut:"); for(int i = 0 ; i < r ; i++) { for(int j = 0; j < k; j++){ m[i][j] = (int)( 1000 * Math.random() ); System.out.print(m[i][j]+"\t"); System.out.println(); Studera koden! Matriselementen tilldelas värden och skrivs ut i en nästlad loop. Provkör! Testa andra värden på r och k!

Kap 9 : Sid 7 Statistiska mått Antag nu att vi har en mängd tal lagrade i en array. De kanske har matats in via tangentbordet eller de kanske är hämtade från en fil. (I vår övning nedan är talen slumpade till en array!) Hur gör man för att beräkna talens summa, medelvärde, max- och min-värde? Övning: Summa-medel-max-min Detta program är inledningsvis identiskt med föregående. Ett antal tal slumpas till en array och skrivs ut. Vi tänker oss att dessa tal är det statistiska material som vi ska bearbeta. I projektet Kap09, skapa klassen Statistik. Skriv in denna kod. Provkör ett antal gånger! public class Statistik { public static void main( String[] arg ) { int n = 100; int[] a = new int[n]; System.out.print("Dessa tal slumpas till arrayen:"); for(int i = 0 ; i < n ; i++) { if(i%10==0) System.out.println(); a[i] = (int)( 1000 * Math.random() ); System.out.print(a[i]+"\t"); int summa, max, min; double medel; summa = 0; max = -1; min = 1000; for(int i = 0; i < n; i++) { summa = summa +a[i]; if (a[i]>max) max = a[i]; if (a[i]< min) min = a[i]; medel = (double)summa/n; System.out.println(" "); System.out.println("Summa = " + summa + " Medel = " + medel); System.out.println("Max = " + max + " Min = " + min); Kommantarer till koden: Variabeln summa är från början 0 Vi loopar genom arrayen och för varje varv adderar vi ett element: summa = summa + a[i]; Efter loopen ligger på så sätt talens summa i variabeln summa Om vi då delar med antalet tal, n, bör vi få medelvärdet. Observera att variabeln medel är flyttal. Variabeln max sätter vi före loopen till ett litet tal. Det ska säkert finnas tal i arrayen som är större. Vi väljer max = -1 (Vi vet ju att våra tal finns i intervallet 0-999 ) För varje element i arrayen kollar vi sedan: Om a[i] är störren än max, ja då blir a[i] det nya max-värdet! Det vill säga: if (a[i]>max) max = a[i]; När loopen är slut har vi arrayens största tal lagrad i variabeln max På ett helt analogt sätt tar vi reda på vi arrayens minsta tal, min Observera att min sätts till ett stort tal före loopen. Det ska säkert finnas tal i arrayen som är mindre. Vi väljer min = 1000 (Vi vet ju att våra tal finns i intervallet 0-999 ) Dessa tillvägagångssätt för att finna summa, medel, max och min i ett stort datamaterial är vanliga i dataprogram. De är generella, och kan tillämpas i alla programmeringsspråk.

Kap 9 : Sid 8 Arrayens storlek Om man inte känner till antalet element i en array så kan man använda variabeln length. Exempel: Denna for-sats skriver ut alla elementen i arrayen a : for(int i = 0; i < a.length; i++){ System.out.println( a[i] ); Lägg märke till att om antal element i arrayen är a.length så är arrayens största index a.length - 1 Förkortat skrivsätt Det finns ett förkortat skrivsätt för for-loopen som är användbart när vi vill genomlöpa alla element i en array. Vi behöver inte känna till antal element. Exempel: Denna for-sats skriver ut alla element i heltalsarrayen a : for (int z : a) { System.out.println( z ); Deklarera en variabel här, av samma typ som arrayen Kolontecken Namnet på arrayen Den deklarerade variabeln får, undan för undan, för varje varv i loopen, respektive elements värde. Sortering Arrayer har stor betydelse inom databehandling. Arrayer används för att hålla reda på stora datamängder, för att söka och sortera. Det finns många algoritmer för att sortera tal, mer eller mindre effektiva. Vi ska lära oss några sådana. Men först ska vi se hur man bär sig åt för att få två variabelvärden att "byta plats" (något som behövs i alla sorteringsalgoritmer) : Att låta två variabler byta värde (innehåll) Antag att du har följande: I variabeln x finns ett tal (t ex 17). I variabeln y finns ett annat tal (t ex 82) Vi vill byta plats så att talet i variabeln x hamnar i y, och talet i y hamnar i x. Vilka satser skriver vi då? Försök med x = y; y = x; Vad händer? x får först värdet 82 vilket är OK. Men i nästa sats får y värdet av x, vilket ju nu är 82. Båda varaiblerna får samma värde! x 17 82 y Nytt försök: Inför en slaskvariabel, s, för tillfällig lagring av ett tal. Satser: s = x; x = y; y = s; Nu fungerar bytet! x x x 17 82 y 82 82 y 82 17 y s s s 17 17 17

Kap 9 : Sid 9 Övning: Sortera I projektet Kap09, skapa klassen Sortera. Vi ska deklarera en array och tilldela dess element heltal genom slumpning (som i programmet SlumpArray) Talen ska sedan sorteras så att de läggs in i arrayens element i stigande ordning. Slutligen ska arrayen skrivas ut igen. Studera koden nedan: Programmet är till en början identiskt med programmet SlumpArray. Raderna där sorteringen sker är skriven med fetstil: s är slaskvariabeln som används vid sorteringen Loopen är en så kallad nästlad loop: En yttre for-loop med i som loopvariabel och en inre med j som loopvariabel. Looparna tillser att alla element i arrayen undan för undan jämförs med alla andra element. Om ett element är större än ett annat låter man elementen byta plats. När hela arrayen gåtts igenom ligger talen sorterade Programmet avslutas med att (den nu soretrade) arrayen skrivs ut igen. Skriv in koden och provkör! Testa med olika värden på n ( 1000, 10000, 50000 ) public class Sortera { public static void main( String[] arg ) { int n = 100; int[] a = new int[n]; System.out.print("Dessa tal slumpas till arrayen:"); for(int i = 0 ; i < n ; i++) { if(i%10==0) System.out.println(); a[i] = (int)( 1000 * Math.random() ); System.out.print(a[i]+"\t"); // Här sker sorteringen: int s; for(int i = 0; i < n-1 ; i++ ) { for(int j = i+1; j < n ; j++ ) { if (a[i] > a[j]) { // om a[i] > a[j] byter de plats! s = a[i]; a[i] = a[j]; a[j] = s; // s är slaskvariabel System.out.println(); System.out.print("Efter sortering:"); for(int i = 0 ; i < n ; i++) { if(i%10==0) System.out.println(); System.out.print(a[i]+"\t");

Kap 9 : Sid 10 Övning: BubbleSort En annan vanlig sorteringsalgoritm är bubble sort, ibland benämnd "jämför grannar och byt". I projektet Kap09, skapa klassen Bubble. Kopiera all kod från programmet Sortera. De rader som utför sorteringen (de som skrivits med fetstil på föregående sida) ska bytas mot följande kod: // Sortering med bubblesort: int s; boolean klar = false; while(!klar) { klar = true; for(int i = 0; i < n - 1; i ++ ) { if( a[i] > a[i+1] ) { s = a[i]; a[i]=a[i+1]; a[i+1]=s; klar = false; Studera koden: I for-loppen jämförs ett element med närmast följande element. Om det första elementet är större än det andra så byts innehållet och en boolsk variabel, klar, sätts till false. Arrayen gås igenom, om och om igen, så länge den boolska variabeln klar är false (while!klar ). Slutligen ligger alla talen i rätt ordning, inget byte sker, klar har värdet true och while-loopen avbryts. Studera och försök förstå koden! Provkör! Testa med olika värden på n ( 1000, 10000, 50000 ) Metoden sort() Java har en "färdig" metod för sortering vid namn sort(). (Så dags att avslöja nu!) Det är en klassmetod i klassen Arrays i paketet java.util Övning: Testa Java-metoden sort I projektet Kap09, skapa klassen Sortera2. Kopiera all kod från programmet Sortera. Skriv in denna sats allra först i koden: import java.util.*; De rader som utför sorteringen (de som skrivits med fetstil på föregående sida) ska nu bytas mot ett metodanrop: // Här sker sorteringen: Arrays.sort(a); Provkör! Testa med olika värden på n ( 1000, 10000, 50000 ) Anmärkning: Klassen Arrays har fler användbara metoder, bland annat dessa: Metoden Arrays.fill(arr, varde) ger alla element i arrayen arr värdet varde. Metoden Arrays.equals(arr1, arr2) returnerar true om de båda arrayerna arr1 och arr2 är identiska.

Kap 9 : Sid 11 Sökalgoritmer Antag att vi har en mängd data, t.ex. en mängd heltal. (Varje heltal representerar t.ex. en post i ett register.) En vanlig uppgift för en dator är att söka efter (t.ex.) ett tal och tala om på vilken plats talet finns. För detta ändamål finns flera olika sökmetoder. Sekvensiell sökning Med sekvensiell sökning kollar vi det ena talet efter det andra från början till slut. Antag att vi har denna mängd heltal: 13 15 7 3 11 21 25 23 9 5 17 Vi representear dem i en array, arr: int[] arr = { 13, 15, 7, 3,11, 21, 25, 23, 9, 5, 17 ; Förslag på sökalgoritm (pseudokod): Mata in talet vars position vi söker, t Sätt heltalet pos = -1 Upprepa för alla element i arrayen Om t = arr[i] pos = i index där talet finns hoppa ur loopen Om pos = -1 Meddela att inget tal hittats Annars Meddela talets position, pos Övning: Sekvensiell sökning Skapa klassen SekvensSok (i projektet Kap09). Skriv kod enligt ovanstående algoritm. Försök att skriva programmet på egen hand. (Lösningsförslag finns nedan) import java.util.*; public class SekvensSok { public static void main( String[] arg ) { Scanner sc = new Scanner(System.in); int[] arr = { 13, 15, 7, 3,11, 21, 25, 23, 9, 5, 17 ; int pos = -1; System.out.print("Vilket heltal söker du? "); int t = sc.nextint(); for(int i = 0 ; i < arr.length ; i++) { if( t== arr[i]){ pos = i; break; // loopen slutar if (pos == -1) System.out.println("Talet hittades inte!"); else System.out.println("Talet finns i element nummer " + pos);

Kap 9 : Sid 12 Binär sökning I binär sökning utgår man från en array där talen är sorterade i storleksordning. int[] arr = {3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25 ; Man matar in talet som man söker och jämför det "mittersta" talet i arrayen. Om talet är större än detta så kan man slopa den första halvan av arrayen. Om talet är mindre än detta så kan man slopa den andra halvan av arrayen. Och så vidare. Här är en algoritm: max = största indexet i arrayen min = 0 mata in ett tal ( t ) pos = -1 så länge min <= max och pos == -1 mitten = (max + min) / 2 om t > arr[mitten] min = mitten + 1 annars om t < arr[mitten] max = mitten -1 annars pos = mitten om pos == -1 skriv finns ej annars skriv finns på plats " pos Övning: Binär sökning Skapa klassen BinarSok (i projektet Kap09). Skriv kod enligt ovanstående algoritm. Försök att skriva programmet på egen hand. (Lösningsförslag finns nedan) import java.util.*; public class BinarSok { public static void main( String[] arg ) { Scanner sc = new Scanner(System.in); int[] arr = {3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25; int max, min, t, pos, mitten; min = 0; max = arr.length - 1; System.out.print("Vilket heltal söker du? "); t = sc.nextint(); pos = -1; while(min <= max && pos == -1) { mitten = (max + min)/2; if ( t > arr[mitten]) min = mitten + 1; else if (t < arr[mitten]) max = mitten - 1; else pos = mitten; if (pos == -1) System.out.println("Talet hittades inte"); else System.out.println("Talet finns i element nummer " + pos);

Kap 9 : Sid 13 Rita polygoner I tidigare övningar har du lärt dig hur man ritar rektanglar och ovaler med hjälp av grafikobjketets metoder. I nästa övning möter vi ännu en metod, drawpolygon() med vars hjälp vi ritar polygoner (månghörningar) Som argument ska metoden ha två arrayer och ett heltal. Den första arrayen ska innehålla x-koordinater för polygonens hörn. Den andra arrayen ska innehålla y-koordinater för polygonens hörn. Heltalet ska ange antalet hörn. Övning: Polygoner I programmet nedan deklarerar vi arrayerna x och y. Dessa används sedan som argument då metoden drawpolygon() anropas. import javax.swing.*; import java.awt.*; public class Poly extends JPanel{ int x[] = { 100, 200, 150 ; int y[] = { 100, 120, 50 ; public void paintcomponent(graphics g) { g.setcolor(color.red); g.drawpolygon( x, y, 3 ); public static void main(string[] args) { JFrame f = new JFrame(); f.setdefaultcloseoperation(jframe.exit_on_close); f.setsize(300, 300); f.setlocation(100,100); f.settitle("poly"); Poly p = new Poly(); f.add(p); f.setvisible(true); Skapa klassen Poly ( i projektet Kap09). Skriv in koden ovan och provkör. En triangel visas 150, 50 Byt sedan ut metoden drawpolygon mot fillpolygon Triangeln visas fylld 100, 100 200, 120 Rita ytterligare polygoner med fler hörn

Kap 9 : Sid 14 Övning: Rymdskepp Skapa projektet Kap09_Rymdskepp. Skapa klassen VisaRymdskepp. Skriv in denna kod: // VisaRymdskepp.java import javax.swing.*; import java.awt.*; public class VisaRymdskepp extends JPanel{ Rymdskepp rs; public VisaRymdskepp() { rs = new Rymdskepp(40,60); rs.setposition(100,150); this.setbackground(color.black); public void paintcomponent(graphics g){ super.paintcomponent(g); rs.visa(g); public static void main(string[] args) { JFrame f = new JFrame(); f.setdefaultcloseoperation(jframe.exit_on_close); f.setsize(300, 300); f.setlocation(100,100); f.settitle("visarymdskepp"); VisaRymdskepp p = new VisaRymdskepp(); f.add(p); f.setvisible(true); I konstruktorn finns satsen rs = new Rymdskepp(40,60);. Då denna exekveras instansieras ett objekt, rs, av klassen Rymdskepp. Rymdskeppet har formen av en liksidig triangel med basen 40 och höjden 60 pixlar. I konstruktorn sker vidare anropet rs.setposition(100,150); Detta metodanrop medför att rymdskeppets nos kommer att placeras i positionen 100,150. I metoden paintcomponent() anropas rymdskeppsobjektets visa()-metod varvid rymdskeppet ritas som en grå triangel. Skriv klassen Rymdskepp. Använd samma teknik som när vi skrev klassen Asteroid (kapitel 5 sidan 25). Instansvariabler: private int xpos, ypos, bas, hojd Konstruktorn har parametrar där värden på bas och hojd anges vid anrop. I metoden public setposition(int x, int y) sätts värden på xpos och ypos. I metoden public visa(graphics g) ritas rymdskeppet som en liksidig triangel enligt denna figur. (xpos, ypos) Triangeln ska vara ljusgrå. Triangelns höjd ska markeras med en mörkgrå linje. hojd Lösningsförslag på nästa sida (xpos-bas/2, ypos+hojd) bas (xpos+bas/2, ypos+hojd)

Kap 9 : Sid 15 // Rymdskepp.java import java.awt.*; public class Rymdskepp { private int xpos, ypos, bas, hojd; public Rymdskepp(int b, int h ) { bas = b; hojd = h; public void setposition(int x, int y){ xpos = x; ypos = y; public void visa(graphics g) { int x[] = { xpos, xpos-bas/2, xpos + bas/2; int y[] = { ypos, ypos + hojd, ypos + hojd ; g.setcolor(color.lightgray); g.fillpolygon( x, y, 3 ); g.setcolor(color.darkgray); g.drawline(xpos, ypos, xpos, ypos + hojd);

Kap 9 : Sid 16 Övning: Personbil I kapitel 2 skrev vi klassen KPersonbil ("konsol-personbil"). Här är klassen Personbil - en grafisk klass som är subklass till JPanel. Studera koden och jämför med KPersonbil. import javax.swing.*; import java.awt.*; public class Personbil extends JPanel { protected String marke; protected int arsmodell; protected int nypris; protected int storlek; protected Color farg; public Personbil() { marke = "Volvo"; arsmodell = 2000; nypris = 200000; storlek = 3; farg = Color.gray; this.setpreferredsize(new Dimension(127,48)); public Personbil(String marke, int arsmod, int nypris, int storl, Color farg){ this.marke = marke; this.arsmodell = arsmod; this.nypris = nypris; this.storlek = storl; this.farg = farg; this.setpreferredsize(new Dimension(112 + storlek * 5, 48)); public String fakta() { return marke + " " + arsmodell; public int varde(int ar){ int nupris; nupris = nypris - 10000*(ar - arsmodell); if (nupris < 10000) nupris = 10000; return nupris; public void paintcomponent(graphics g) { g.setcolor(farg); int s = storlek * 5; int x[] = { 0, 0,16,89+s,109+s,109+s,85+s,77+s,48,40 ; int y[] = {20,32,36, 36, 28, 12, 8, 0, 0,12 ; g.fillpolygon( x, y, 10 ); g.setcolor(color.white); int a[] = { 42, 77+s, 73+s,48 ; int b[] = { 14, 14, 4, 4 ; g.fillpolygon( a, b, 4 ); g.setcolor(color.black); g.filloval(15,25,22,22); g.filloval(68+s,25,22,22); g.setcolor(color.gray); g.filloval(19,29,14,14); g.filloval(72+s,29,14,14); g.setcolor(color.white); g.drawstring(this.fakta(),10,32); Instansvariablerna är som synes deklarerade med protected (och inte med private). Detta gör att eventuella subklasser kan ärva variablerna från Personbil.

Kap 9 : Sid 17 Klasserna Personbil och KPersonbil påminner mycket om varandra. Den största skillnaden är att klassen Personbil är en subklass till JPanel och att vi utnyttjar paintcomponent()-metoden för att rita bilen. Din uppgift: Skapa projektet Kap09_Personbil. Skapa klassen Personbil. Skriv in eller kopiera ovanstående kod. Skapa sedan klassen VisaPersonbil. Skriv ett program som deklarerar och instansierar och ett Personbil-objekt med standardkonstruktorn (det vill säga en grå Volvo årmodell 2000) samt visar objektet ( med add()-metoden ). Provkör. Skapa ytterligare ett Personbil-objekt, till exempel en Lincoln årsmodell 2003 som har nypriset 300000 kronor, storleken 7 (limosine) och blå färg. Provkör. Lägg till två etiketter (JLabel-objekt) som visar bilarna pris ett visst år. Provkör. Du ska givetvis utnyttja metoden varde(int ar). Provkör. I exemplet nedan visas vad bilarna är värda år 2010. Lösningsförslag: import javax.swing.*; import java.awt.*; public class VisaPersonbil extends JPanel{ Personbil p1, p2; JLabel l1,l2; public VisaPersonbil () { p1 = new Personbil("Lincoln", 2003, 300000,7, Color.blue); add(p1); p2 = new Personbil(); add(p2); setbackground(color.white); l1 = new JLabel(p1.fakta() + "s värde år 2010: " + p1.varde(2010)); l2 = new JLabel(p2.fakta() + "s värde år 2010: " + p2.varde(2010)); add(l1); add(l2); public static void main(string[] args) { JFrame f = new JFrame(); f.setsize(400, 300); f.setlocation(100,100); f.settitle("visapersonbil"); f.setdefaultcloseoperation(jframe.exit_on_close); VisaPersonbil p = new VisaPersonbil(); f.add(p); f.setvisible(true);

Kap 9 : Sid 18 Övning: Kombibil Skapa en klass, Combi, som subklass till klassen Personbil. Skriv en "standardkonstruktor" och en konstruktor med parametrar. Omdefiniera paintcomponent()-metoden så att en kombibil ritas. Ett lösingsförslag: import java.awt.*; public class Combi extends Personbil{ public Combi() { marke = "Volvo"; arsmodell = 2000; nypris = 200000; storlek = 3; farg = Color.gray; this.setpreferredsize(new Dimension(127,48)); public Combi(String marke, int arsmod, int nypris, int storl, Color farg) { this.marke = marke; this.arsmodell = arsmod; this.nypris = nypris; this.storlek = storl; this.farg = farg; this.setpreferredsize(new Dimension(112 + storlek * 5, 48)); public void paintcomponent(graphics g) { g.setcolor(farg); int s = storlek * 5; int x[] = { 0, 0, 16, 89+s, 109+s, 109+s, 100+s, 77+s, 48, 40 ; int y[] = {20, 32, 36, 36, 32, 12, 0, 0, 0, 12 ; g.fillpolygon( x, y, 10 ); g.setcolor(color.white); int a[] = { 42, 97+s, 93+s,48 ; int b[] = { 14, 14, 4, 4 ; g.fillpolygon( a, b, 4 ); g.setcolor(color.black); g.filloval(15,25,22,22); g.filloval(68+s,25,22,22); g.setcolor(color.gray); g.filloval(19,29,14,14); g.filloval(72+s,29,14,14); g.setcolor(color.white); g.drawstring(this.fakta(),10,32); I programmet VisaPersonbil: Deklarera, skapa och visa ett Combi-objekt. Övning: Cabriolet Skapa en klass, Cab, som subklass till klassen Personbil. I programmet VisaPersonbil: Deklarera, skapa och visa ett Cab-objekt.

Kap 9 : Sid 19 Objektarrayer Precis som vi kan arbeta med arrayer bestående av primitiva variabler kan vi arbeta med arrayer av objekt. (egentligen arrayer av referenser till objekt). Vi exemplifierar med knappar (JButton-objekt) : En ensam knapp deklareras och instansieras med JButton minknapp; minknapp = new JButton( Tryck på mej! ); En array of buttons deklareras med (10 element) JButton[] minknapp = new JButton[10]; Sen måste varje knappobjekt instansieras. for(int i = 0 ; i < 10 ; i++){ Vi lägger instansiering (och utplacering) i minknapp[i] = new JButton("" + i); en loop add( minknapp[i] ); Övning: Array of buttons A. I projektet Kap09, skapa klassen ButtonArray. Skriv koden nedan och kör. import javax.swing.*; import java.awt.*; public class ButtonArray extends JPanel{ //deklarerar array of buttons: JButton[] butt = new JButton[10]; public ButtonArray() { for(int i = 0 ; i < 10 ; i++) { butt[i] = new JButton(" " + i + " "); add( butt[i] ); public static void main(string[] args) { JFrame f = new JFrame(); f.setsize(100, 200); f.setlocation(100,100); f.settitle("buttonarray"); f.setdefaultcloseoperation(jframe.exit_on_close); ButtonArray p = new ButtonArray (); f.add(p); f.setvisible(true); B. Ändra i koden så att knapparna ligger så här:

Kap 9 : Sid 20 C. Lägg till ett textfält. Förse programmet med händelsehantering. Skriv kod så att när en knapp trycks så visas motsvarande siffra i textfältet. Hjälp: Kom ihåg att lägga lyssnare på knapparna. Det gör du lämpligen i loopen, i samband med att knappobjekten instansieras, med satsen butt[i].addactionlistener(this); I actionperformed()-metoden känner du av vilken knapp som tryckts och skriver ut motsvarande siffra, till exempel så här: for(int i = 0; i < 10 ; i++){ if ( e.getsource() == butt[i]){ display.settext("" + i); break; D. Gör så att man kan trycka flera tangenter i följd och då ska motsvarande tal visas i "displayen". Hjälp: Använd en sträng som från början är tom, och som efterhand byggs på med siffror, och skrivs ut. Övning: Spektrumfärger I projektet Kap09, skapa klassen Spektrum. Programmet ska visa sju knappar, så här: Knapparna representerar de sju färgerna i spektrum. När man trycker på en knapp ska panelen få motsvarande bakgrundsfärg. Hjälp: Så här kan programmets inledning se ut: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Spektrum extends JPanel implements ActionListener{ JButton[] fargknapp = new JButton[7]; String s[] = { "Röd", "Orange", "Gul", "Grön", "Blå", "Indigo", "Violett" ; public Spektrum() { for(int i = 0 ; i < 7 ; i++) { fargknapp[i] = new JButton(s[i]); add( fargknapp[i] ); fargknapp[i].addactionlistener(this); I actionperformed()-metoden känner du av vilken knapp som tryckts och ändrar bakgrundsfärg. fargknapp[0] ger Color.red, fargknapp[1] ger Color.orange och så vidare. Färgen indigo är en "blålila" färg. Skapa till exempel Color indigo = new Color(111,0,255);

Kap 9 : Sid 21 Övning: Tarning Skapa projektet Kap09_Yatzi. Kommer du ihåg klassen Tarning som vi skrev i kapitel 8? Kopiera filen Tarning.java i projektet Kap08_Tarning till src i projektet Kap09_Yatzi. Skapa sedan klassen Yatzi och skriv ett program som instansierar fem stycken tärningsobjekt. När man trycker på en knapp ska tärningarna kastas och visa nya värden. Lösningsförslag: import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Yatzi extends JPanel implements ActionListener { Tarning[] t = new Tarning[5]; JButton butt; int k; public Yatzi () { for (int i = 0; i < 5; i++) { t[i]=new Tarning(); k = t[i].kasta(); add(t[i]); butt = new JButton("Kasta!"); butt.addactionlistener(this); add(butt); public void actionperformed(actionevent e) { for(int i = 0; i<5; i++) k = t[i].kasta(); repaint(); public static void main(string[] args) { JFrame f = new JFrame(); f.setsize(400, 140); f.setlocation(100,100); f.settitle("yatzi "); f.setdefaultcloseoperation(jframe.exit_on_close); Yatzi p = new Yatzi (); f.add(p); f.setvisible(true);

Kap 9 : Sid 22 Övning: Lotto Skapa projektet Kap09_Lotto. I projektet Kap08_Kulan finns filerna Kula.java och VisaKula.java. Kopiera dessa till det nya projektet. I Utforskaren: Kopiera filen kula.jpg till mappen Kap08_Kulan. I klassen VisaKula: Deklarera en array med sju stycken Kula-objekt I konstruktorn: Skriv en loop där de sju Kula -objekten instansieras och "adderas". I actionperformed()-metoden: Skriv en loop där slumpatal()-metoden anropas för de sju Kula -objekten. Därefter repaint(); I main()-metoden: Ändra storlek öka bredden. Spara och provkör. När du trycker på knappen slumpas nya tal på kulorna. Som du märker kan samma tal visas på flera kulor. Skriv en variant där varje kula får ett unikt tal. Idé: Skapa en array, dragen, med boolska värden. Från början ska alla element vara false: dragen[1] är false dragen[2] är false osv dragen[35] är false När ett nytt tal slumpas kollar man mot arrayen så att det inte redan är draget. Om till exempel talet 12 dras får dragen[12] värdet true. Det kan vara lämpligt att göra om voidmetoden slumpatal() till en metod som returnerar slumptalet.

Kap 9 : Sid 23 Övning: Asteroidarray Skapa projektet Kap09_Asteroid. Kommer du ihåg klassen Asteroid som vi skrev i kapitel 5? Kopiera klassen Asteroid i projektet Kap05_Asteroid till src i projektet Kap09_Asteroid. Klassen Asteroid har en konstruktor med tre parametrar där man vid instansieringen kan ge värden som påverkar det skapade objektets position och diameter.vi ska förse klassen Asteroid med ytterligare en konstruktor. Den ska vara parameterlös. I denna konstruktor ska position och diameter slumpas fram. I klassen Asteroid, skriv in följande kod: public Asteroid() { // ny konstruktor utan parametrar diam = (int)(math.random()*30 )+ 10; // diametern blir 10 39 pixlar xpos = (int)(math.random()*300); // placering i x-led 0-299 ypos = (int)(math.random()*300); // placering i x-led 0-299 Spara. Skapa sedan klassen VisaAsteroider som en subklass till JPanel. Deklarera i denna klass en array bestående av 10 stycken Asteroid-objekt I konstruktorn ska de tio objekten instansieras med den parameterlösa konstruktorn. I paintcomponent()-medoden ska tio objektens visa()-metod anropas. Spara och kör. Tio asteroider med varierande storlek visas. Exekvera flera gånger så att du ser att asteroidernas placering är slumpmässig. Lösningsförslag: import javax.swing.*; import java.awt.*; public class VisaAsteroider extends JPanel { Asteroid ast[] = new Asteroid[10]; public VisaAsteroider() { for(int i = 0 ; i < 10 ; i++) { ast[i]=new Asteroid(); setbackground(color.black); public void paintcomponent(graphics g){ super.paintcomponent(g); for(int i = 0 ; i < 10 ; i++) { ast[i].visa(g); public static void main(string[] args) { JFrame f = new JFrame(); f.setsize(400, 300); f.setlocation(100,100); f.settitle("visaasteroider"); f.setdefaultcloseoperation(jframe.exit_on_close); VisaAsteroider p = new VisaAsteroider (); f.add(p); f.setvisible(true);

Kap 9 : Sid 24 Starta program med argument Argumenten i main-metoden I kapitel 1 lärde du dig hur ett javaprogram ser ut. Det är en klass som innehåller metoden main(). Så här: public class MittProgram { public static void main( String[] args ) { // kod Vid kommandot (från DOS-prompten) sker anropet java MittProgram MittProgram.main(); varvid det som är definierat i main-metodens utförs (Repetera gärna början på kapitel 1 och avsnittet om klassmetoder i kapitel 2) Som du ser är main-metoden definierad med en parameter, en array av typen String Det betyder att man "skicka med " argument (av typen String) när man startar ett javaprogram. Ovning: Testa programstart med argument A. I projektet Kap09 skapa där klassen ArgsTest. Skriv in detta program: public class ArgsTest { public static void main( String[] arg ) { String txt1, txt2; txt1 = arg[0]; txt2 = arg[1]; System.out.print( txt1 + " " + txt2 ); Vi har deklarerat två String-objekt, txt1 och txt2. Dessa får värdet av angivna argument och skrivs ut. Du kan provköra programmet från DOS-prompten så här: java ArgsTest Stina Olle (Förmodligen måste du även skriva sökvägen till den mapp där javac.exe finns. Se kapitel 0.) Programmet skriver ut de angivna argumenten

Kap 9 : Sid 25 Från Eclipse kan du köra programmet så här: Klicka Run på menyraden, och sedan på menyalternativet Open Run Dialog Ett fönster, Run, öppnas. Kontrollera att det står ArgsTest i rutan Main class Välj sedan fliken Arguments Skriv in argumenten, till exempel namnen Olle Stina och tryck på knappen Run Programmet exekveras. De angivna argumenten skrivs ut i Console-fönstret. B. Skapa klassen ArgsTest2 och skriv in denna kod: public class ArgsTest2 { public static void main( String[] arg ) { int n = Integer.parseInt( arg[1] ); for (int i=0; i < n; i++) System.out.println( arg[0] ); Kör programmet med argumenten Kalle 10 Programmet skriver ut den angivna strängen angivet antal gånger