Föreläsning 2. Föreläsning 2

Relevanta dokument
Föreläsning 2. Föreläsning 2

Primitiva datatyper och selektering

Föreläsning 2. Föreläsning 2. Primitiva datatyper Selektering. Primitiva datatyper Selektering. Operationer på datatypen double

Operationer på datatypen double

Föreläsning 2. Primitiva datatyper Selektering. Operationer på datatypen double. Motsvarande operationer finns för float. a + b addition double

Objektorienterad programmering

Föreläsning 2. Primitiva datatyper Selektering

Primitiva datatyper Selektering

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

Föreläsning 3. Iteration. while-satsen for-satsen do-satsen

Föreläsning 3. Iteration while-satsen

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

F4. programmeringsteknik och Matlab

Iteration while-satsen

Föreläsning 3. Föreläsning 3. Iteration. while-satsen for-satsen do-satsen. while-satsen. do-satsen. Datatypen double

Iteration. Föreläsning 3. TDA540 - Objektorienterad Programmering

Objektorienterad programmering

Lösningsförslag: Instuderingsfrågor, del A

Föreläsning 3. Föreläsning 3

Föreläsning 3. Föreläsning 3

Föreläsning 3-4 Innehåll

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

Föreläsning 7. Nyckelord I Java. Uttryck. Uttryck, Operatorer Och Kontrollflöden

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

OOP Objekt-orienterad programmering

JAVAUTVECKLING LEKTION 7

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

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

Objektorienterad Programmering (TDDC77)

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

SMD 134 Objektorienterad programmering

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

Objektorienterad Programmering (TDDC77)

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

JAVAUTVECKLING LEKTION 4

Föreläsning 2. Täcker material från lektion 1, 2, 3 och 4:

OOP Objekt-orienterad programmering

OOP Objekt-orienterad programmering

TDIU01 - Programmering i C++, grundkurs

Programmering A. Johan Eliasson

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Språkkonventioner och redigering av tal.

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

TDDC77 Objektorienterad Programmering

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 3: Typomvandling, villkor och val, samt textsträngar

Föreläsning 5&6 LOGISKA VARIABLER; IMPLEMENTERA KLASSER; MER ALGORITMER

Parameteröverföring. Exempel. Exempel. Metodkropp

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

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

Föreläsning 1 & 2 INTRODUKTION

JAVAUTVECKLING LEKTION 3

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

OOP Objekt-orienterad programmering

Lösningsförslag till tentamen

Föreläsning 3: Booleans, if, switch

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

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

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Instuderingsfrågor, del A

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

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

Tentamen OOP

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Variabler och konstanter

Föreläsningsmaterial (Syntax och variabler)

l uppgiftsformulering l algoritmkonstruktion l verifikation l kodning l testning och avlusning l validering l dokumentering l underhœll Kapitel 2

Objektorienterad programmering Föreläsning 4

Föreläsning 4. Föreläsning 4. Top-Down Design Metoder Parameteröverföring. Metoder Parameteröverföring. Programmering = modellering

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

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

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

TDDC77 Objektorienterad Programmering

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

Typkonvertering. Java versus C

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Föreläsning 1 & 2 INTRODUKTION

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

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

DD2310. Javaprogrammering för Pythonprogrammerare. Johan Boye

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

Programmeringsteknik I

Föreläsnings 9 - Exceptions, I/O

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.

Programmering för språkteknologer I, VT2012. Rum

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

Lektion 1, del b Utskrifter av variabelvärden Inläsning av värden till variabler

Föreläsning REPETITION & EXTENTA

Föreläsning 2 - Intro till Java

Outline. I Vi kan lätt göra samma sak för fyra variabler... I Hur gör vi för 400 inlästa värden? I Ofta behöver man flera likadana variabler

Att skriva till och läsa från terminalfönstret

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

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

Metoder och top-down design

TDIU01 - Programmering i C++, grundkurs

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

Transkript:

Operationer på datatypen Notation Föreläsning 2 Primitiva datatyper Selektering Betydelse Resultatets datatyp a+b addition a-b subtraktion a*b multiplikation a/b division a%b modulus (rest vid division) a>b större än boolean a<b mindre än boolean a >= b större eller lika med boolean a <= b mindre eller lika med boolean a == b lika med boolean a!= b inte lika med boolean +a samma som a -a negationen av a Föreläsning 2 Motsvarande operationer finns för float. 2 Primitiva datatyper Selektering Omslagsklassen Double Datatyper Omslagsklassen Double innehåller bl.a följande konstanter och metoder: Det finns tre viktiga anledningar till att använda sig av ett typsystem: 1. typer hjälper oss att förstå och organisera våra tankar rörande objekt 2. ett typsystem hjälper oss att se och resonera om unika egenskaper hos specifika typer static final int MAX_VALUE det största värdet som kan lagras i en static final int MIN_VALUE det minsta värdet som kan lagras i en static String tostring( n) ger det reella talet n som en sträng static parsedouble(string str) ger strängen str som en 3. typsystemet hjälper oss att upptäcka fel, t ex felaktig användning av operationer. Anropet Double.parseDouble("12.34") returnerar det reella talet 12.34 Anropet Double.toString(56.78) returnerar strängen "56.78" Satserna System.out.println("Största reella talet: " + Double.MAX_VALUE); System.out.println("Minsta reella talet: " + Double.MIN_VALUE); ger utskriften: 3 Största reella talet: 1.7976931348623157E308 Minsta reella talet: 4.9E-324 4

Problemexempel: In- och utmatning av reella tal Problemexempel: In- och utmatning av reella tal Design: Problem: Algoritm: Skriv ett program som läser två reella och skriver ut summan av talen. 1. Skriv texten Ange första talet:. Känner du igen Analys: 2. Läs tal1. problemet? 3. Skriv texten Ange andra talet:. Indata: De två reella talen som skall adderas. Läs tal2. /* Programmet läser in och adderar två reella samt skriver4.5. Addera ut resultatet. */ tal1 och tal2, samt lagra resultatet i summa. Exempel på körning: 6. Skriv texten Summan av talen är:. public class AddTwoRealNumbers { 7. Skriv ut summa. Känner du igen Datarepresentation: problemet? tal2 och summa är av datatypen. String input = JOptionPane.showInputDialog("Angetal1, första talet"); 5 number1 = Double.parseDouble(input); input = JOptionPane.showInputDialog("Ange andra talet"); number2 = Double.parseDouble(input); sum = number1 + number2; namngivning i Java Problemexempel: In- och utmatning av reella tal JOptionPane.showMessageDialog(null, "Summan av talenregler är " +för sum); //main Alla storheter, t.ex. klasser, variabler och konstanter, som används i ett Implementation: program måste ges unika identifierarnamn. identifierarnamn //AddTwoRealNumbers /* Programmet läser in och adderar två reella samt skriver ut resultatet. */ Utdata: Summan av de inlästa talen. public class AddTwoRealNumbers { String input = JOptionPane.showInputDialog("Ange första talet"); number1 = Double.parseDouble(input); input = JOptionPane.showInputDialog("Ange andra talet"); number2 = Double.parseDouble(input); sum = number1 + number2; JOptionPane.showMessageDialog(null, "Summan av talen är " + sum); //main //AddTwoRealNumbers 6 1. Ett identifierarnamn består endast av bokstäver, siffror, understrykningstecken (_) och dollartecken ($). 2. Ett identifierarnamn får vara godtyckligt långt. 3. Ett identifierarnamn får ej börja med en siffra. 4. De reserverade orden i Java är otillåtna identifierarnamn. 5. Java skiljer på små och stora bokstäver (case case senstive). senstive Exempelvis är hej, Hej och HEJ tre olika identifierare. 6. Namnkonvention i Java är att identifierare på klasser inleds med stor bokstav, identifierare på konstanter enbart innehåller stora bokstäver, medan identifierare på andra entiteter i programmet inleds med liten bokstav. 7 8

Regler för namngivning i Java Reserverade ord Hello, String, JOptionPane abstract case const* else float if int null protected static this try namn på klasser PI, MAXIMUM, SIZE namn på konstanter name, greeting, println namn på entiteter som ej är klasser eller konstanter, t.ex metoder och variabler Välj alltid namnet på en identifierare på så sätt att namnet anger vad identifierarna används till!! Undvik att använda de svenska bokstäverna å, ä och ö. Använd helst engelska namn. 9 boolean cast* continue extends for implements interface operator* public strictfp throw var* break catch default false future* import long outer* rest* super throws void byte char do final generic* inner* native package return switch transient volatile byvalue* class finally goto* instanceof new private short synchronized true while * används ej ännu, men är reserverade för framtiden Mer om variabler 10 Variabler För att handha objekt som avbildas i ett Javaprogram används variabler i vilka man kan lagra data. I Java finns olika slag av variabler och de variabler som används för att lagra primitiva datatyper kallas enkla variabler. Deklarationen int number; innebär att variabeln antal skapas och dess värde blir odefinierat: En variabel har ett namn, är av en viss typ och har ett värde. number? En variabel kan ha olika värden under sin livstid. En variabel kan ses som en namngiven behållare i vilken man kan lagra ett värde av en viss typ. Tilldelningssatserna number = 10; price = 24.75; ger respektive variabel ett specifikt värde: Alla variabler som används i ett program måste deklareras. Vid deklarationen anges variabels namn och typ. Sitt värde får en enkel variabel via en tilldelningssats. number price 10 24.75 En variabel kan tilldelas ett initialt värde direkt i deklarationssatsen. 11 12

Deklaration av variabler Deklaration av konstanter final type NAME = value; type namr; type name1, name2, name3; type namn = value; final int MAXSIZE = 100; final PI = 3.1415; final String PHRASE = "Välkommen"; Obs: Praxis är att använda endast STORA bokstäver för att namnge konstanter int number; int value1, value2, value3; radius = 10.5; String text = "Texten är detta"; Konstanter kan t.ex. användas för att undvika magiska tal, tal d.vs. tal som dyker upp i koden utan någon förklarning. I satsen totalprice = price * 1.25; finns ingen förklarning till talet 1.25. Används en konstant blir koden mer informativ: final TAX = 0.25; totalprice = price * (1 + TAX); public class Hello2 {/* Detta program gerhello2 en hälsning från datorn */ public static void main public class { (String[] { JOptionPane.showMessageDialog(null, /* Dettaargs) program ger en hälsning från datorn */ "Hello world! \n" +main"this is aargs) message from the computer."); public static void (String[] { Indentering Indentering // main JOptionPane.showMessageDialog(null,"Hello world! \n" + För att göra källkoden lättare att läsa och förstå för en mänsklig betraktare // skallhello2 man indentera programmet. Indentering innebär att man "This is a Kompilatorn bryrfrom sig inte om hur källkoden skrivs. Därför skulle man message the computer."); skjuter in programsatserna med extra mellanslag på sådant sätt att de egentligen inte behöva indentera sina program, men koden blir då mer 13 // main // Hello2 satser som hör ihop hamnar på samma avstånd från vänstermarginalen: 14 eller mindre oläsligt: public class Hello2 {/* Detta program ger en hälsning från datorn */ public static void main (String[] args) { JOptionPane.showMessageDialog(null, "Hello world! \n" + "This is a message from the computer."); // main // Hello2 public class Hello2 { /* Detta program ger en hälsning från datorn */ public static void main (String[] args) { JOptionPane.showMessageDialog( null,"hello world! \n" + "This is a message from the computer."); // main // Hello2 Indentera alltid era program! 15 16

Klassen Math matematiska standardfunktioner Kommentarer i programmet I tekniska tillämpningar är det vanligt att man behöver göra numeriska beräkningar. Java tillhandahåller standardklassen java.lang.math, som innehåller en del vanliga matematiska beräkningsfunktioner. I Math finns bland annat följande: För att öka förståelsen av ett program är det möjligt att ge kommentarer i programmet. Kommentarerna ignoreras av kompilatorn (är avsedda endast för den mänskliga läsare). Java stödjer tre olika typer av kommentarer: för att markera att resten av en rad utgörs av en kommentar //Denna rad är en kommentar System.exit(0); //avslutar exekveringen för att markera att en kommentar sträcker sig över flera rader /* Detta är en kommentar som sträcker sig över ett flertal rader!! */ för att kunna generera dokumentation med javadoc /** Detta är en dokumentationskommentar *@author Janne Java *@version 1.0 */ Med javadoc fås dokumentationen i form av HTML-filer med samma format som dokumentationen av Javas API. Konstant Beskrivning static PI konstanten static E konstanten e (basen för den naturliga logaritmen) Metod Beskrivning static int abs(int x) ger absolutbeloppet av heltalet x static exp( p) ger värdet av ep static log( x) ger den naturliga logaritmen (ln) av x. static int max(int a, int b) ger det största av heltalen a och b. static int min(int a, int b) ger det minsta av heltalen a och b. Metoderna abs, min och max finns också för long, float och. 17 Matematiska standardfunktioner Klassen Math matematiska standardfunktioner Metod Beskrivning static pow( a, p) ger värdet av ap static long round( x) ger x avrundat till närmaste heltal static sqrt( x) ger kvadratroten ur x static sin( angle) ger sin för angle static cos( angle) ger cos för angle static tan( angle) ger tan för angle static asin( angle) ger asin för angle static acos( angle) ger acos för angle static atan( angle) ger atan för angle static pow( num, power) klassentitet parameterns typ metodens namn returtyp formella parametrar Metodens namn, returtyp, parametrar och parametertyper utgör metodens gränssnitt. gränssnitt När man använder en metod måste anropetet av metoden överensstämma med metodens gränssnitt. Ett korrekt anrop av metoden pow har följande utseende: x = Math.pow(12.5, 3.0); variabeln x har samma typ som metodens returtyp fullständiga namnet för en klassmetod är klassens namn följt av '.' följt av metodens namn parametrarna till metoden vid anropet överensstämmer till antal, typ och ordning. static todegrees( radians) ger vinkeln radians i grader static toradians( degree) ger vinkeln degree i radianer static random() ger ett slumptal i intervallet [0, 1) 18 19 12.5 3.0 Math.pow 1953.125 20

Problemexempel Analys: Analys Indata: Cylinderns radie och cylinderns höjd. Skriv ett program som läser in radien och höjden av en cylinder och beräknar cylinderns volym. Utdata: Cylinderns volym. Exempel på körning: Volymen V av en cylinder definieras av formeln /*Programmet läser in radien och höjden av en cylinder, samt beräknar och skriver ut volymen av cylindren */ där r och h är radien respektive höjden av cylindern. public class Cylinder { Råd på vägen först, koda sedan! StringTänk input = JOptionPane.showInputDialog("Ange radien av cylindern:"); Ju tidigare du börjar koda, ju längre tid kommer det att ta innan du = program! Double.parseDouble(input); har ettradius fungerande input = JOptionPane.showInputDialog("Ange höjden av cylinden:"); 21 height = Double.parseDouble(input); volume = Math.PI * Math.pow(radius, 2) * height; JOptionPane.showMessageDialog(null, "Volymen av en cylinder med höjden " + height + " och radien " + radius + " är " + volume); //main Implementation: Implementation Design: Design //Cylinder V = r2 h Algoritm: 22 Råd på vägen /*Programmet läser in radien och höjden av en cylinder, samt beräknar och skriver ut volymen av cylindren */ public class Cylinder { String input = JOptionPane.showInputDialog("Ange radien av cylindern:"); radius = Double.parseDouble(input); input = JOptionPane.showInputDialog("Ange höjden av cylinden:"); height = Double.parseDouble(input); volume = Math.PI * Math.pow(radius, 2) * height; JOptionPane.showMessageDialog(null, "Volymen av en cylinder med höjden " + height + " och radien " + radius + " är " + volume); //main //Cylinder 1. Skriv texten "Ange cylinderns radie:" Tänk först, koda sedan! 3. Skriv texten "Ange cylinderns höjd:" tidigare 4.Ju Läs cylinders höjd h. du börjar koda, ju längre tid kommer det att ta innan du 5. Beräkna cylinderns volym V med hjälp av formeln V = r h. har ett fungerande program! 6. Skriv ut cylinderns volym V. 2. Läs cylinderns radie r. 2 Datarepresentation: Cylinderns radie r är ett reellt tal. Cylinderns höjd h är ett reellt tal. Iakttagelse 1: Om vi t.ex ger indatavärdena 2.4 och 6.7 får vi resultatet 1.2403436873373. Är verkligen precisionen i resultatet riktig Cylinderns volym V är ett reellt tal. I standardklassen Math finns konstanten PI att tillgå för att representera. 23 Iakttagelse 2: Vore det inte enklare att läsa in de båda indatavärdena i samma dialogruta? 24

Redigering av utskrifter Redigering av utskrifter: Exempel För att redigera utskrifter kan man använda klassmetoderna System.out.printf vid utskrift i terminalfönstret String.format vid utskrift ien dialogrutor Dessa båda metoder fungerar på likartat sätt. Man anger en formatmall som specificerar hur utskriften skall se ut, samt de utskrifter som skall göras Nedanstående kod illustrera hur utskrifts formateringen går till: System.out.printf("Min: är %3.2f och max är %e\n", 123.123, 567.567); System.out.printf("%5s%-6s%s\n", "AB", "CDE", "FH"); System.out.printf("%2d:%2d:%2d\n", 1, 2, 3); System.out.printf("%02d:%02d:%02d\n", 1, 2, 3); final String HEADER_FORMAT = "%-10s%10s\n"; final String DATA_FORMAT = "%5.2f%10d\n"; System.out.printf(HEADER_FORMAT, "Pris", "Kvantitet"); System.out.printf(DATA_FORMAT, 12.345, 10); Formatmallen har följande uppbyggnad: %[flagga][vidd][.precision] argumenttyp De viktigaste flaggorna och argumenttyperna är: Flagga Betydelse - utskriften vänsterställs (utfyllnad med mellanslag sker till höger) + talets tecken (+ eller -) skrivs alltid ut 0 Argumenttyp Utskrifterna blir: Min: är 123.12 och max är 5.675670e+02 ABCDE FH 1: 2: 3 01:02:03 Pris Kvantitet 12.35 10 utfyllnad sker med 0 istället för mellanslag Betydelse s sträng d heltal på decimal form f reella tal på decimal form med heltalsdel och decimaler e reella tal på exponentform o heltal på oktal form x heltal på hexadecimal form Vid utskrift i ett dialogfönster används metoden String.format för att erhålla den formaterade strängen som skall skrivas ut 25 String output = String.format("Min: är %3.2f och max är %e\n", 123.123, 567.567); JOptionPane.showMessageDialog(null, output); Klassen Scanner 26 Klassen Scanner I ett program som behöver flera indatavärden kan det ibland vara klumpigt att läsa in varje enskilt indatavärde via en egen dialogruta. Ofta vill man kunna ge flera indatavärden i samma dialogruta. För att möjliggöra detta kan man använda sig av klassen Scanner som finns i paketet java.util. import java.util.scanner;... String input = JOptionPane.showInputDialog("Ange det första heltalet och" + " det första reella talet: "); Scanner scan = new Scanner(input); int integervalue = scan.nextint(); Anrop av en konstruktor, realvalue = scan.nextdouble(); vilket är det normala sättet att skapa ett objekt. 27 Ett objekt av klassen Scanner kan dela upp strängen den får i delar, s.k tokens. tokens Tokens avskiljs (by default) av vita tecken (blanktecken, '\t' och '\n'). I klassen Scanner finns bl.a. följande användbara instansmetoder Metod Beskrivning int nextint() returnerar nästa token som en int nextdouble() returnerar nästa token som en boolean nextboolean() returnerar nästa token som en boolean String next() returnerar nästa token som en String boolean hasnextint() returnerar värdet true om nästa token är en int, annars returneras false boolean hasnextdouble() returnerar värdet true om nästa token är en, annars returneras false boolean hasnextboolean() returnerar värdet true om nästa token är en boolean, annars returneras false boolean hasnext() returnerar värdet true om det finns fler tokens, annars returneras false 28

Problemexempel Analys: Analys Detta problem är exakt som föregående problem förutom att en precisering har gjorts avseende hur indata skall läsa och hur utdata skall skrivas. Skriv ett program som läser in radien och höjden av en cylinder och beräknar cylinderns volym. I analyserna av de båda problemen är det således enbart exemplifieringen av hur en körning ser som skiljer sig. /*Programmet läser in radien och höjden av en cylinder, samt beräknar och Volymen V av en cylinder fås av formeln Indata: Cylinderns radie och cylinderns höjd. skriver ut volymen av cylindren */ V = r h, där r är radien och h är höjden av cylindern. Utdata: Cylinderns volym. Inmatningen av cylinderns radie och höjd skall göras i samma Exempel på körning: import java.util.scanner; dialogruta och cylinderns volym skall skrivas ut med exakt 2 decimaler. public class Cylinder2 { String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); Scanner sc = new Scanner(input); radius = sc.nextdouble(); 29 height = sc.nextdouble(); volume = Math.PI * Math.pow(radius, 2) * height; String output = String.format("%s %.2f", "Volymen av cylinden är", volume); JOptionPane.showMessageDialog(null, output); Implementation: Implementation Design: Design //main /*Programmet läser in radien och höjden av en cylinder, samt beräknar och Algoritm: skriver ut volymen av cylindren */ //Cylinder2 2 30 import java.util.scanner; public class Cylinder2 { String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); Scanner sc = new Scanner(input); radius = sc.nextdouble(); height = sc.nextdouble(); volume = Math.PI * Math.pow(radius, 2) * height; String output = String.format("%s %.2f", "Volymen av cylinden är", volume); JOptionPane.showMessageDialog(null, output); //main //Cylinder2 1. Skriv texten "Ange cylinderns radie och höjd:" 2. Läs cylinderns radie r. 3. Läs cylinders höjd h. 4. Beräkna cylinderns volym V mha formeln V = r2 h. 5. Skriv ut cylinderns volym V. Datarepresentation: Cylinderns radie r är ett reellt tal. Cylinderns höjd h är ett reellt tal. Cylinderns volym V är ett reellt tal. I standardklassen Math finns konstanten PI att tillgå för att representera. 31 Obs! Scanner gör ett anropa av Local.getDefault() för att ta reda på vilka konvensioner som används! 32

Implementation: Implementation Inläsning från kommandofönstret /*Programmet läser in radien och höjden av en cylinder, samt beräknar och skriver ut volymen av cylindren */ import java.util.scanner; import java.util.locale; public class Cylinder2UK { Locale.setDefault(Locale.UK); // decimalpunkt används för decimala tal String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); Scanner sc = new Scanner(input); radius = sc.nextdouble(); height = sc.nextdouble(); volume = Math.PI * Math.pow(radius, 2) * height; String output = String.format("%s %.2f", "Volymen av cylinden är", volume); JOptionPane.showMessageDialog(null, output); //main //Cylinder2UK Allt som skrivs in via kommandofönstret hamnar i en s.k. ström med namnet System.in. Genom att koppla System.in till ett objekt av klassen Scanner kan man på ett enkelt sätt läsa data från kommandofönstret. /*Programmet läser in radien och höjden av en cylinder, samt beräknar och I nedanstående program görs inläsning från System.in och skrivning till System.out. skriver ut volymen av cylindren */ import java.util.scanner; public class Cylinder3 { public static void main(string[] arg) { import java.util.scanner; System.out.print("Ange cylinderns radie och höjd: "); Scanner sc = new Scanner(System.in); //kopplar kommandofönstret till Scanner-objektet import java.util.locale; radius = sc.nextdouble(); height = sc.nextdouble(); public class Cylinder2UK { volume = Math.PI * Math.pow(radius, 2) * height; System.out.printf("%s %.2f", "Volymen av cylinden är", volume); //main För att ange decimaltal med decimalkomma ges istället satsen: //Cylinder3 Locale.setDefault(Locale.UK); // decimalpunkt används för decimala tal Locale.setDefault(new Locale("sv", "SE")); // decimalkomma används för decimala tal String input = JOptionPane.showInputDialog("Ange cylinderns radie och höjd:"); 33 34 import java.util.scanner; Scanner sc = new Scanner(input); public class Cylinder3 { radius = sc.nextdouble(); public static void=main(string[] arg) { height sc.nextdouble(); System.out.print("Ange cylinderns radie och höjd: Typkonvertering volume = Math.PI * Math.pow(radius, 2) *"); height; Typkonvertering Scanner sc = new Scanner(System.in); //kopplar kommandofönstret till Scanner-objektet String output = String.format("%s %.2f", "Volymen av cylinden är", volume); Om ett uttryck innehåller flera datatyper och det finns risk för Java är ett starkt typat språk, språk vilket innebär att man inte att förlora information måste en explicit typomvandling kan blanda olika datatyper i uttryck hur som helst. JOptionPane.showMessageDialog(null, radius = sc.nextdouble(); output); göras. //main height = sc.nextdouble(); Tilldelningen int value = 5 + 10.5; int value = 5 + (int) 10.5; //Cylinder2UK volume = Math.PI * Math.pow(radius, 2) * height; är ej tillåten, eftersom variabeln value som skall tilldelas resultatet av uttrycket är int value2 = 5 + (int) (10.5 + 13.6); System.out.printf("%s "Volymen av cylindenvid är", volume); av typen int medan uttrycket innehåller en litteral 10.5%.2f", som är av typen. explicit typomvandling används avhuggning, dvs. efter ovanstående tilldelningar har variabeln value värdet 15 och variabeln value2 värdet 29. Automatisk typomvandling //mainutförs av kompilatorn då en typomvandling kan göras som inte innebär risk att information går förlorad. För att avrunda ett reellt tal till ett heltal används metoden round i klassen Math //Cylinder3 long round( x) Tilldelningen value = 5 + 10.5; är tillåten, eftersom heltalet 5 kan omvandlas till det reella talet 5.0 utan att precisionen i talet förloras. int value3 = 5 + (int) Math.round(10.5); Varför behöver typomvandling göras i ovanstående och nedanstående exempel? int sum = 10 + 16 + 24 + 32; int numbers = 4; mean = () sum / numbers; Automatisk typomvandling sker enligt: byte => short => int => long => float => 35 36

Komponenterna i Java Komponenterna i Java Styrstrukturer: Datastrukturer: De konstruktioner som finns för att avbilda och organisera data. De konstruktioner som finns i språket för att instruera datorn om vilka operationer som skall utföras. Inbyggda primitiva typer Fält Strängar Objekt Sekvens: tilldelningssatsen selektionssatser iterationssatser return-satsen anrop av void-metod programblock exception Systemstrukturer: De konstruktioner som finns för att organisera styrstrukturer och datastrukturer i logiskt sammanhängande enheter. Klasser Metoder Paket Selektion: if-satsen switch-satsen Iteration: while-satsen do-while-satsen for-satsen 37 Selektering: if-satsen Selektering: if-satsen true Den generella if-satsen har följande utseende: if (villkor) sats1; else sats2; och är en tvåvägs-selektering. tvåvägs-selektering evaluera villkor false Satser som kör om villkoret är sant Semantiskt innebär ovanstående if-sats: beräknas villkor till sant utförs sats1 annars utförs sats2 Satser som kör om villkoret är falskt Om satsen i else-delen av en if-sats är en tom sats, som i exemplet nedan true if (villkor) sats1; else Satser som kör ; //tom sats om villkoret är sant kan man utesluta else-delen helt och hållet if (villkor) sats1; Detta betyder att vi har en envägs-selektering. envägs-selektering Satser som kör efter if-satsen Satserna sats1 och sats2 är godtyckliga satser, t.ex. en if-sats (vi får då nästlade if-satser) ett programblock (satser omslutna mellan { och ) en tom sats 38 evaluera villkor false Satser som kör efter if-satsen Semantiskt innebär ovanstående if-sats: beräknas villkoret villkor till sant utförs sats1 annars görs ingenting 39 40

Programblock Selektering: if-satsen Ett programblock grupperar ihop ett antal programsatser till en sammansatt sats. sats Ett block kan användas överallt där en enda programsats är tillåten och får innehålla alla typer av satser. Skriv aldrig en if-sats enligt nedan if (villkor) ; else sats; Görs deklarationer i ett programblock blir dessa lokala deklarationer, deklarationer dvs de blir endast tillgängliga inom det programblock där de har deklarerats. Ett programblock påbörjas med en vänsterklammer { och avslutas med en högerklammer. Negera villkoret och skriv istället en envägs-selektering enligt: if (villkor1) { sats1a;... sats1n; else { sats2a;... sats2n; if (!villkor) sats; Anledningen är att koden blir enklare att läsa och förstå! //tvåvägs-selektering if (villkor2) { sats3a;... sats3n; //envägs-selektering 41 if (villkor2) { //envägs-selektering sats3a; Logiska operatorer i Java.När..ett villkor evalueras fås ett värde av typen boolean. Typen boolean har bara två värden, true och false. sats3n; På datatypen boolean finns följande operationer: Nästlade if-satser: Flervägs-selektering if (villkor1) { sekvens av satser else if (villkor2) { sekvens av satser... else if (villkorn) { sekvens av satser else { sekvens av satser villkor1 42 false Notation true sekvens av satser villkor2 false true sekvens av satser villkorn false true sekvens av satser sekvens av satser Betydelse == lika med!= inte lika med && logiskt och logiskt eller! logiskt icke ^ exklusivt eller Med dessa operationer kan man bilda logiska uttryck eller villkorsuttryck: villkorsuttryck (year % 4 == 0 && year % 100!= 0) year % 400 == 0 Vad beräknas i ovanstående villkor? 43 44

Operatorernas prioritetsordning Logiska operatorer i Java Varje operator har en prioritet som avgör i vilken ordning operatorerna i ett uttryck skall utföras. Har två operatorer samma prioritet utförs de från vänster till höger. Följande prioritetsordning gäller i Java: För de logiska operatorerna && och använder Java lat evaluering. evaluering Vid lat evaluering evalueras ett uttryck bara så långt som det är absolut nödvändigt. Detta innebär att Prioritet om den vänstra operanden till operatorn && blir false så beräknas aldrig den högra operanden om den vänstra operanden till operatorn blir true så beräknas aldrig den högra operanden. Operator högst Lat evaluering är praktiskt i många sammanhang när den högra operanden kan generera exekveringsfel. Betrakta nedanstående villkor: (denom!= 0) && (num / denom > 4) Här vill man undvika att göra division med 0. Vi kontrollerar därför att nämnaren denom inte är 0 innan divisionen num/denom skall utföras. lägst Notation postfix inkrement och dekrement a++, a-- prefix inkrement och dekrement unära + och + logisk icke ++a, --a +a, -a! multiplikation, division, modulus *, /, % addition, subtraktion +, - mindre än, större än, mindre eller lika med, större eller lika med <, >, <=, >= likhet och olikhet ==,!= exklusiv eller ^ logiskt och && logiskt eller 45 46 Operatorernas prioritetsordning Problemexempel Skriv ett program som beräknar porto för brev enligt följande taxa: För att upphäva den fördefinierade prioritetsordningen kan man använda parenteser. Vikt högst (gram) 20 Enligt den fastställda prioritetsordningen kommer uttrycket 100 250 500 2+3*5-4 att beräknas som Porto (kronor) 5.50 11.00 22.00 33.00 Brev över 500 gram räknas som paket. 2 + (3 * 5) - 4 Vill man beräkna uttrycket i annan ordning måste parenteser användas, t.ex (2 + 3) * (5 4) 47 48

Implementation 1: 1 Analys: Analys Indata: Brevets vikt i gram. /* Programmet läser in vikten på ett brev och skriver ut brevets porto */ public class Postage { public static void main( String[] arg) { String input = JOptionPane.showInputDialog("Ange vikten:"); weight = Double.parseDouble(input); if (weight <= 0.0) JOptionPane.showMessageDialog(null, "Du har angivit en ogiltig vikt!!"); if ((weight > 0.0) && (weight <= 20.0)) JOptionPane.showMessageDialog(null, "Portot är 5.50 kronor."); if ((weight > 20.0) && (weight <= 100.0)) JOptionPane.showMessageDialog(null, "Portot är 11.00 kronor."); if ((weight > 100.0) && (weight <= 250.0)) JOptionPane.showMessageDialog(null, "Portot är 22.00 kronor."); if ((weight > 250.0) && (weight <= 500.0)) JOptionPane.showMessageDialog(null,"Portot är 33.00 kronor."); if (weight > 500.0) JOptionPane.showMessageDialog(null, "Måste gå som paket."); // main // Postage Utdata: Brevets porto i kronor. Design: Design Algoritm: /* Programmet läser in vikten på ett brev och skriver ut brevets porto 1. Läs brevets vikt till variabeln vikt. 2. Om vikt 0.0, så skriv att angiven vikt är ogiltig. import javax.swing.joptionpane; 3. Om 0.0public < vikt 20.0, så skriv att portot är class Postage {5.50 kr. import javax.swing.joptionpane; 4. Om 20.0 < vikt 100.0, så skriv att portot är 11.00 kr. public static void main( String[] arg) { public 5. Om 100.0 < vikt class 250.0, så Postage2 skriv att portot { är 22.00 kr. String input = portot JOptionPane.showInputDialog("Ange vikten:"); static void main( String[] arg) { 6. Om 250.0 public < vikt 500.0, så skriv att är 33.00 kr. 7. Om vikt > 500.0, så skrivinput att brevet=måste sändas som paket. String JOptionPane.showInputDialog("Ange vikten:"); weight = Double.parseDouble(input); Datarepresentation: weight = Double.parseDouble(input); */ if (weight <= 0.0) Variabeln vikt är String av datatypen. = ""; output JOptionPane.showMessageDialog(null, "Du har angivit en ogiltig vikt!!"); 49 if (weight <= 0.0) if ((weight > 0.0) && (weight <= 20.0)) output = "Du har angivit en ogiltig vikt!!"; JOptionPane.showMessageDialog(null, "Portot är 5.50 kronor."); if ((weight > 0.0) && (weight <= 20.0)) if ((weight 20.0) && (weight <= 100.0)) output = >"Portot är 5.50 kronor."; JOptionPane.showMessageDialog(null, if ((weight > 20.0) && (weight <= 100.0)) "Portot är 11.00 kronor."); Alternativ implementation: implementation if ((weight 100.0) && (weight <= 250.0)) Alternativ design: I ovanstående implementation skapas en dialogruta i varje är if-sats. I nedanstående design output = >"Portot 11.00 kronor."; implementation skapas istället en dialogruta efter alla if-satser och i if-satsen skapas JOptionPane.showMessageDialog(null, "PortotAlgoritm: är 22.00 kronor."); ((weight > 100.0) den utskrift som skall ståif i dialogrutan för respektive utfall. && (weight <= 250.0)) if ((weight 250.0)är&& (weight <= 500.0)) output = >"Portot 22.00 kronor."; 1. Läs brevets vikt vikt. if ((weight > 250.0) && (weight <= 500.0)) 2. 33.00 Om vikt kronor."); 0 så public class Postage2 { JOptionPane.showMessageDialog(null,"Portot är public static void main( output String[] arg) {= "Portot är 33.00 kronor."; skriv att brevets vikt är ogiltig (negativ). if (weight > 500.0)vikten:"); String input = JOptionPane.showInputDialog("Ange annars om vikt 20.0 så weight = Double.parseDouble(input); if (weight > 500.0) JOptionPane.showMessageDialog(null, "Måste gå som paket."); String output = ""; Måste initieras! skriv att portot är 5.50 kr if (weight <= 0.0) output = "Måste Varför?gå som paket."; output = "Du har angivit en ogiltig vikt!!"; annars om vikt 100.0 så // main if ((weight > 0.0) JOptionPane.showMessageDialog(null, && (weight <= 20.0)) output); skriv att portot är 11.00 kr output= // "Portot är 5.50 kronor."; Postage if ((weight > 20.0) && (weight <= 100.0)) annars om vikt 250.0 så // main output = "Portot är 11.00 kronor."; skriv att portot är 22.00 kr if ((weight > 100.0) && (weight <= 250.0)) // Postage2 output = "Portot är 22.00 kronor."; 50 annars om vikt 500.0 så skriv att portot är 33.00 kr annars skriv att brevet måste sändas som paket if ((weight > 250.0) && (weight <= 500.0)) output = "Portot är 33.00 kronor."; if (weight > 500.0) output = "Måste gå som paket."; JOptionPane.showMessageDialog(null, output); // main // Postage2 51 52

Implementation: Implementation /* Programmet läser in vikten på ett brev och skriver ut brevets porto */ public class Postage3 { public static void main( String[] arg) { String input = JOptionPane.showInputDialog("Ange vikten:"); weight = Double.parseDouble(input); String output; Behöver inte initieras! if (weight <=0.0) Varför? output = "Du har angivit en ogiltig vikt!!"; Bör variabeln initieras? else if (weight <=20.0) output = "Portot är 5.50 kronor."; else if (weight <= 100.0) output = "Portot är 11.00 kronor."; else if (weight <=250.0) output = "Portot är 22.00 kronor."; else if (weight <=500.0) output = "Portot är 33.00 kronor."; else output = "Måste gå som paket."; JOptionPane.showMessageDialog(null, output); // main // Postage3 /* Programmet läser in vikten på ett brev och skriver ut brevets porto */ public class Postage3 { public static void main( String[] arg) { String input = JOptionPane.showInputDialog("Ange vikten:"); weight = Double.parseDouble(input); String output; if (weight <=0.0) output = "Du har angivit en ogiltig vikt!!"; 53 else if (weight <=20.0) output = "Portot är 5.50 kronor."; else if (weight <= 100.0) output = "Portot är 11.00 kronor."; else if (weight <=250.0) output = "Portot är 22.00 kronor."; else if (weight <=500.0) output = "Portot är 33.00 kronor."; else output = "Måste gå som paket."; JOptionPane.showMessageDialog(null, output); // main // Postage3