Föreläsning 2 Täcker material från lektion 1-4 DrJava Variabler och Datatyper Aritmetik Tecken och strängar Klasser, Objekt Metoder Villkor och iterationer main-metoden programmeringsstil Debugging Fö2 1. Grundläggande begrepp 2. Objekt och metoder 3. If, while, main 4. Objekt och metoder OU1 Föreläsningen kommer ta upp valda delar av detta 1 Java… När java installeras på datorn hamnar bl.a följande där: • Javakompilatorn • Javainterpretatorn • En massa färdiga javaprogram, sk. klasser som hör till språket Java, t.ex. Math, String Fö2 2 Vad är DrJava? • DrJava är ett (gratis)program för att programmera i Java – Utvecklat vid Rice University, USA – DrJava är skrivet i Java • Program för att programmera i kallas för IDE= Integrated Development Environment Compile Run • Med DrJava kan man – Skapa Javaprogram (definitions pane) – Testa enstaka javasatser (interactions pane) – Lista alla öppna filer (files pane) Fö2 3 Compile? Run? • Javasatserna i ett program kallas även för källkoden och den sparas i en javafil (har efternamnet .java) • Med Compile går kompilatorn igenom javafilen och kontrollerar om javasatserna är språkligt riktiga (syntaxkontroll) • Om ok, översätter kompilatorn javasatserna till en annan kod som datorn kan köra (exekvera) classfilen skapas • Med Run går den s.k. javainterpretatorn igenom classfilen och utför de instruktioner som finns där, dvs programmet körs (exekveras) • När vi använder DrJava, finns det tre filer som är associerade till det program vi skriver: .java, .java~, .class (vi kikar på exempel på de tre filerna i programmet TestTurtle) Fö2 4 DrJava – färgkodning av javasatserna underlättar • I Definition Pane färgkodas satserna på lite olika sätt • Detta indikerar huruvida javasatserna tolkas som korrekta • Det finns även en del andra handgrepp man kan utföra i Definitions Pane IndentLines, Uncomment, lokalisera matchande måsvingar, etc • Läraren visar exempel på ovan (programmet TestTurles som flyttar två paddor i varsin cirkelbåge) • Bra tips: Numrering av javasatser kan göras i Edit>Preferences>Display Options Fö2 5 Java… • Språket har strikta regler för hur det skall skrivas, dvs språkets grammatik, det kallas språkets syntax. • Språket byggs upp av identifierare och reserverade ord som sätts ihop till satser. • Identifierare är det som programmeraren själv hittar på namn för, t.ex. variabelnamn • Reserverade ord är de ord som finns inbyggda i språket. • En sats är en instruktion. En sådan avslutas normalt med ett semikolon Fö2 6 Reserverade ord i språket Java abstract assert boolean break byte case catch char class const continue default do double else enum extends false final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static strictfp super switch synchronized this throw throws transient true try void volatile while Ord i fet stil används i kursen Fö2 7 Deklarera variabel Alla variabler som skall användas i ett program måste deklareras, dvs • måste få ett namn och • måste ange vilken sorts variabel det är, dvs ange datatypen Fö2 8 Datatyper primitiv datatyp (exvis int, double) eller objekttyp (exvis Turtle, World) • Primitiva typerna är inbyggda i javaspråket • Objekttyper kan vi definiera själva (Turtle) • Vid deklarationen reserveras ett minnesutrymme i datorn för variabelns värde. • Variabelns namn är ett slags alias för adressen till minnesutrymme Fö2 9 Datorns minne – en enorm byrålåda Vi kan betrakta minnet som en byrå med gigantisk många byrålådor där information kan lagras. När ett javaprogram startas får det tillgång till en del av byrålådan för att lagra sina variabler. När en variabel deklareras i programmet reserveras en byrålåda för variabelns värde. Bra om variabelns namn associerar till vilken information som finns i lådan, det blir då enklare att veta i programmet vad vi använder variabeln till. Variabelns namn blir ett alias för adressen till byrålådan. Del 2: Intro till variabler i Java 10 Exempel: Vi deklarerar och initierar variabler som är s.k. primitiva datatyper: int antal=67; double x=2.5; char c='A'; boolean hungrig=true; x hungrig antal c Fö2 11 Åtta primitiva datatyper • Fyra heltalstyper (numeriska): byte, short, int, long • Två flyttalstyper (numeriska) Finns signed och unsigned heltalstyper, dvs tal med +/- eller bara +. float, double • En teckentyp: char • En boolskt typ (sant eller falskt): boolean Fö2 12 De numeriska datatyper Typ Minnesutrymme Min/Maxvärde byte 8 bit -128 … 127 short 16 -32768 … 32767 int 32 -2147483648 … 2147483647 long 64 +/- 9 x 1018 float 32 double 64 +/- 3.4 x 1038, 7 siffrors nogr. +/- 1.7 x 10308, 15 siffrors nogr. Fö2 13 Tecken • En char-variabel lagrar ett enstaka tecken i två byte (speciellt för Java). • Tecknet kodas först till ett heltal innan det lagras i minnet. • Koden är unicode, se http://www.tamasoft.co.jp/en/general-info/unicode.html. Koden för de vanligaste tecknen finns på ASCII Code The extended ASCII table • Två byte innebär ett minnesutrymme som kan ha värden 0-65536, dvs det finns en kapacitet för 65536 tecken. • Drygt 30000 tecken finns f.n. kodade. Fö2 14 Primitiva datatyperna byte 8 bits short 8 bits 8 bits int 8 bits 8 bits 8 bits 8 bits long 8 bits 8 bits 8 bits 8 bits float 8 bits 8 bits 8 bits 8 bits double 8 bits 8 bits 8 bits 8 bits char 8 bits 8 bits Fö2 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 15 Aritmetik +, -, *, / för addition, subtraktion, multiplikation och division Division med heltal är speciellt ++, -för addition med ett resp subtraktion med ett int i=0; i++; i blir ett % för restberäkning, modulo int z=16; Förklaring, resten av 16 delat med 10: int w=z%10; w blir 6 16/10 = 1 + 6/10 Heltalsdivision int x=5/4; int a=14; int b=a/3; x blir 1 b blir 2 Fö2 16 Typomvandling Konvertera från en datatyp till en annan datatyp • Heltal Flyttal per auto, eller med (double) (…) • Flyttal Heltal – (int) (…) ger trunkering • • • • • Char Heltal: (int) (…) Heltal Char: (char) (…) Flyttal String: Double.toString(…) String Flyttal: Double.parseDouble(…) String Heltal finns motsvarande… Fö2 17 Övning Frågor (http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test1.html) Fö2 18 Varför (1) deklarera och (2) ha många datatyper? 1. ”Säkerhet”: Bara använda variabler som är deklarerade Ex. stavfel: x1=4; x1=xl+8; versaler/gemener: X=x+X; 2. Värden man vill räkna med är av olika sorter – – – – – Bra då att ha variabler som matchar dessa. Minnesutrymmet anpassas till värdena. Beräkningarna anpassas till datatypen. Snabbare beräkningar. ”Ordning och reda” Fö2 19 Klasser och objekttyper Klassen String: representerar textsträngar. Inbyggd i själva javaspråket Klassen Math: samlar matematiska funktioner (i vid mening). Alltid tillgänglig. Klasserna World och Turtle: Definieras i programvara som finns för denna kurs. Fö2 20 Klassen Math Klassen Math används för att samla ihop matematiska funktioner och konstanter (man gör aldrig new Math) Funktionerna (metoderna) anropas via klassnamnet. Exempel: Math.exp(3.5) Math.pow( Math.sin(2.5),2) Math.PI + Math.sinh(x/2) Se Javadokumentationen av klassen Math (http://docs.oracle.com/javase/7/docs/api/java/lang/Math.html) Fö2 21 Klasserna World och Turtle Klasserna World och Turtle gör man vanligen objekt av. Objekt skapas med operatorn new. Exempel: World w = new World(400,400); Turtle t1 = new Turtle(w); Turtle t2 = new Turtle(w); Variablerna w, t1 och t2 håller reda på de skapade objekten (”referenser", ”pekare”). Vi kan ”be” objekten om olika saker genom att anropa metoder. Exempel: t1.turn(90); t2.move(20); Fö2 22 Metoder Vi anropar metoder för att få reda på egenskaper (information) hos objekten. Exempel: int dx = t1.getXPos() – t2.getXPos(); Vi anropar också metoder för att beordra objekten att utföra saker och ändra egenskaperna. Exempel: t1.move(20); Observera skillnaden mot när vi anropar metoder (funktioner) i klassen Math. Fö2 23 Parametrar Ibland vill man skicka information till metoden. För detta används parametrar. Exempel: t1.move(100); t1.turn(45); t2.turnTo(0,0); t1.turnTo(t2); Av anropen framgår dels vilket objekt som skall påverkas och dels eventuell information som skickas till metoden — de aktuella parametrarna Frågor: t1.move( (int)(Math.random()*100) ); Är det OK? t1.turnTo(0,0) och t1.turnTo(t2); Är det OK? Fö2 24 Summering av metoder i klassen Turtle Vi har sett i lektion 2 move(int n) turn(int n) turnTo(int x, int y) turnTo(Turtle t) disablePath() enablePath () setDirection(int d) Flytta n pixlar framåt Rotera n grader Sätt rikningen mot pkt (x,y), pixelkoordinat Sätt riktningen mot paddan t Visa ej spåret Visa spåret Sätt ny riktning d I lektion 3: getXpos(),getYpos() Returnera xpos resp ypos distanceTo(int x,int y) Returnera avståndet till x,y getDirection() Returnera riktningen moveTo(int x, int y) Flytta till pixelkoordinat x,y Frågor (http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/f02/test2.html) Fö2 25 Skriva egna metoder Exempel: /** * Draws a equilateral triangle with a specified size */ public void drawTriangle(int side) { this.move(side); this.turn(120); this.move(side); this.turn(120); this.move(side); } Metoder har en synlighet — i detta fall public en returtyp — i detta fall void som anger att inget värde returneras 0 eller flera formella parametrar — i detta fall en av typ int Fö2 26 Metoder Metoder måste alltid placeras i en klass I DrJava har man den klass som man vill redigera i synlig definitionsrutan En metod kan innehålla lokala variabler. Existerar bara i metoden och ”glöms bort” när man lämnar metoden. Om man ändrat ett program, måste man alltid kompilera det innan programmet kan köras. Fö2 27 Strängar samt utmatning i terminalfönster/konsolen/Interactions Generellt sätt att få se resultat från ett program. Exempel: String namn="Torsten"; System.out.print("Välkommen "); System.out.print(namn); System.out.print('!'); System.out.println(); Kortare: String namn="Torsten"; System.out.println("Välkommen " + namn + '!'); Observera: println får en sträng som parameter. Den bildat genom konkatenering (hopslagning) som utförs med +operatorn Frågor (http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test3.html) Fö2 28 Algoritmer En algoritm är en följd av väldefinierade instruktioner för hur en uppgift skall lösas. Exempel på algoritm: metoden drawTriangle. Fö2 29 Algoritmformuleringar Det finns följande generella sätt att formulera algoritmer med hjälp av de tillgängliga instruktionerna: sekvens — utför en följd av instruktioner i tur och ordning selektion — välj mellan olika alternativa sekvenser iteration — upprepa en sekvens ett antal gånger abstraktion — sätt ihop en algoritm enl ovanstående punkter och ge hopsättningen ett namn Fö2 30 Selektion: if-satsen Generellt if ( villkor ) { satser } Exempel: // Compute the maximum of x and y double max = x; if (y > x) { max = y; } Frågor (http://www.it.uu.se/edu/course/homepage/prog1/ht16/talks/t02/test4.html) Fö2 31 Selektion: if-satsen forts Generellt if (villkor) { satser } else { satser } Exempel: //Compute the roots to x*x +p*x + q = 0 double d = (p*p-4*q)/4; if (d < 0) { System.out.println("Complex roots"); } else { d = Math.sqrt(d); double x1 = -p/2 + d; double x2 = -p/2 - d; System.out.println("x1:" + x1); System.out.println("x2:" + x2); } Satserna i grenarna är godtyckliga satser — t ex if-satser Fö2 32 Iterationer I java finns det tre konstruktioner för upprepning av kod: while, for och do. Här tar vi upp while-satsen Generellt while ( villkor) { satser } Exempel: // Compute x raised to 10 int i = 1; double p = 1; while (i <= 10) { p = p*x; i++; } Kan även lösas med Math.pow(x,10); Fö2 33 main-metoden Vill skapa en värld med några paddor och låta de gå omkring på något sätt dvs lite new, några move, turn, . . . Var skall jag skriva detta? Två möjligheter: i interaktionsrutan i DrJava eller i en metod Interaktionsrutan passar bra för att skriva enskilda uttryck men besvärligare när det blir många uttryck och satser. Dessutom: finns bara i DrJava. Alltså: i en metod!…. Fö2 34 main-metoden Var skall metoden placeras? Måste vara i en klass! Klassen Turtle? Objekt ur klassen Turtle representerar en padda. Onaturligt med en ”vanlig” objektmetod skapar båda världar och paddor: t1.doSomething(); men då måste ju objektet t1 existera… Alternativet är då att skriva en mainmetod. En sådan metod anropas genom att ange klassens namn. En metod som man anropar genom att ange klassens namn kallas klassmetod, vilket i java anges med ordet static Vi studerar två alternativ: • Skriva en mainmetod i klassen Turtle • Skriva en ny klass t ex kallad TestTurtles med en mainmetod. Fö2 35 main-metoden i klassen Turtle Den metoden är en klassmetod som hör till klassen som helhet, inte till enskilda objekt. Anges som static i metodhuvudet. Exempel: public class Turtle { .... public static void main(String[] args) { World w = new World(500,500); Turtle t1 = new Turtle(w); Turtle t2 = new Turtle(w); int distance = 30; int rotation = 15; int loopNr = 1; while (loopNr<20) { t1.move(distance); t1.turn(rotation); t2.move(distance); t2.turn(-rotation); loopNr++; loopNr++; } // while } // main } // class Fö2 36 main-metod i en annan klass public class TestTurtles { public static void main(String[] args) { World w = new World(500,500); Turtle t1 = new Turtle(w); Turtle t2 = new Turtle(w); World w = new World(500,500); Turtle t1 = new Turtle(w); Turtle t2 = new Turtle(w); int distance = 30; int rotation = 15; int loopNr = 1; while (loopNr<20) { t1.move(distance); t1.turn(rotation); t2.move(distance); t2.turn(-rotation); loopNr++; } // while } // main } // class Vi testkör programmet Klassen innehåller en enda metod — main-metoden Det är alltid den aktuella klassens main-metod som körs vid Run Fö2 37 Tidsfördröjning Om man vill se vad som händer i varje steg kan man lägga in en tidsfördröjning i loopen: public class TestTurtles { public static void main(String[] args) throws InterruptedException { World w = new World(500,500); Turtle t1 = new Turtle(w); Turtle t2 = new Turtle(w); int i = 1; while (i<20) { t1.move(30); t1.turn(-15); t2.move(30); t2.turn(15); i++; Thread.sleep(200); // ”Sov” 200 ms } // while } } Notera att throws Interrupted Exception är nödvändig för Thread.sleep Vi testkör programmet Fö2 38 Kodstandard: Namngivning Namn på metoder, variabler, klasser mm skall vara vettiga! Metoder och variabler skall ha liten begynnelsebokstav! Klassnamn skall ha stor begynnelsebokstav! Använd stor bokstav (eller understrykningstecken) för att öka läsbarheten i långa namn (Ex: numberOfTurtles) Namngivna konstanter skrivs med stora bokstäver (Ex: Math.PI) Fö2 39 Kodstandard - layout Indentera raderna systematiskt och enhetligt. Tips: Select All följt av Indent All Lines fixar hela filen Skriv alltid ny sats på ny rad! Skriv inte längre rader än 80 tecken - bryt på vettiga ställen! Kommatecken skall alltid följas av blanktecken Omge alltid operatorer med låg prioritet med blanktecken Fö2 40 Kodstandard: layout Placering av klammertecknen (måsvingarna) Antingen Eller if (x < y) { ... } else if (y == y){ ... } else { ... } if (x < y) { ... } else if (y == y) { ... } else { ... } Varför kodstandard? Jo, ger läsbarhet! Fö2 41 Kodkommentarer Viktigt, men Kommentera inte det som är uppenbart från koden! Förutsätt att den som läser koden kan Java. Se till att kommentarerna inte skymmer koden Felaktiga kommentarer är värre än inga kommentarer! Bra namngivning, struktur och layout gör att koden behöver ett minimum av kommentarer Försök inte förklara dåligt skriven kod med kommentarer — skriv om koden! Fö2 42 Kodkommentarer: Javadoc Det finns en särskild typ av kommentarer — s k javadoc-kommentarer som används för att automatiskt generera dokumentationssidor. Se kommentarerna i klassen Turtle för exempel! Dokumentation av Turtle (http://www.it.uu.se/edu/course/homepage/prog1/commonFiles/new_turtleWorld/doc) Fö2 43 Kodstandard och programmeringstil Läs på sidan kodningsregler på kurshemsidan Fö2 44 Debugging Vi testar DrJava’s debugger med programmet TestTurtles Fö2 45