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 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 Fö2 1
När java installeras på datorn hamnar bl.a följande där: Javakompilatorn Javainterpretatorn Java 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 Med DrJava kan man Skapa Javaprogram (definitions pane) Testa enstaka javasatser (interactions pane) Lista alla öppna filer (files pane) Compile Run 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 antal hungrig c Fö2 11
Åtta primitiva datatyper Fyra heltalstyper (numeriska): byte, short, int, long Två flyttalstyper (numeriska) float, double En teckentyp: char En boolskt typ (sant eller falskt): boolean Finns signed och unsigned heltalstyper, dvs tal med +/- eller bara +. 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 10 18 float 32 +/- 3.4 x 10 38, 7 siffrors nogr. double 64 +/- 1.7 x 10 308, 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 short int long float 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits double 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits 8 bits char 8 bits 8 bits Fö2 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; int w=z%10; w blir 6 Heltalsdivision int x=5/4; x blir 1 int a=14; int b=a/3; b blir 2 Förklaring, resten av 16 delat med 10: 16/10 = 1 + 6/10 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) Flytta n pixlar framåt turn(int n) Rotera n grader turnto(int x, int y) Sätt rikningen mot pkt (x,y), pixelkoordinat turnto(turtle t) Sätt riktningen mot paddan t disablepath() Visa ej spåret enablepath () Visa spåret setdirection(int d) 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; Vi testkör int rotation = 15; int loopnr = 1; programmet while (loopnr<20) { t1.move(distance); t1.turn(rotation); t2.move(distance); t2.turn(-rotation); loopnr++; } // while } // main } // class 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 if (x < y) {... } else if (y == y){... } else {... } Varför kodstandard? Jo, ger läsbarhet! Eller if (x < y) {... } else if (y == y) {... } else {... } 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