725G61 - Laboration 1 Variabler och villkorssatser. Johan Falkenjack

Relevanta dokument
TDIU01 - Programmering i C++, grundkurs

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

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

725G61 - Laboration 2 Loopar och arrayer. Johan Falkenjack

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

SMD 134 Objektorienterad programmering

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

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

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

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

Objektorienterad Programmering (TDDC77)

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

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

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

Extramaterial till Matematik Y

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Strukturdiagram. Styra. Algoritmer. Val

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna.

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

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

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

F4. programmeringsteknik och Matlab

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

Datastrukturer. Erik Forslin. Rum 1445, plan 4 på Nada

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

TDDC77 Objektorienterad Programmering

Enkla datatyper minne

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

Klasser i Java kan ha metoder och egenskaper. Metoder beskriver funktioner som klassen kan utföra. Egenskaper beskriver innehållet i klassen.

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

TDIU01 - Programmering i C++, grundkurs

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

Anteckningar 1: Grundläggande saker

TDDC77 Objektorienterad Programmering

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

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

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

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

Föreläsning 3.1: Datastrukturer, en översikt

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

Programmeringsteknik med C och Matlab

Användarhandledning Version 1.2

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Objektorienterad programmering Föreläsning 4

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Programmering A. Johan Eliasson

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

Planering Programmering grundkurs HI1024 HT 2014

Föreläsning 3-4 Innehåll

OOP Objekt-orienterad programmering

Övning2. Variabler. Data typer

Övningsuppgifter till föreläsning 2 Variabler och uttryck

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

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

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

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Java, klasser, objekt (Skansholm: Kapitel 2)

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

725G61 - Laboration 3 Metoder och abstrakta datatyper. Johan Falkenjack

Översikt MERA JAVA OCH ECLIPSE. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning. Uttryck och tilldelning

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

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

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

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

Visual Basic, en snabbgenomgång

OOP Objekt-orienterad programmering

D0010E. Hello world! Nedräkning. Sågtand. Övningsuppgifter i Eclipse. Skapa ett program som skriver ut "Hello world" på skärmen.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen OOP

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

Språket Python - Del 1 Grundkurs i programmering med Python

Föreläsning 2 sept 05 (Onsdag v 36). DD Chapter 2.

Programmering för språkteknologer II, HT2011. Rum

Dagens program. Programmeringsteknik och Matlab. Viktiga datum. Ett första exempel. Programmall, vad behöver vi i ett javaprogram?

Objektorienterad programmering i Java

Föreläsning 1 & 2 INTRODUKTION

Lektion Java Grunder. Javas historia. Programmeringsspråket Java. Skillnaderna mellan Java och C++ JVM (Javas Virtuella Maskin)

Översikt 732G11 PROGRAMMERING 1. Personal. Kursens mål. Litteratur. Kursens innehåll

Parameteröverföring. Exempel. Exempel. Metodkropp

1 Texthantering. 1.1 Typen char. Exempel, skriv ut alfabetet

OOP Objekt-orienterad programmering

Typkonvertering. Java versus C

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

TENTAMEN OOP

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

Programmeringsteknik I

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

Variabler och konstanter

Undervisning. Examination

Planering Programmering grundkurs HI1024 HT TIDAA

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

OOP Objekt-orienterad programmering

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.

Heltalsrepresentation. Fler byggstenar. Overflow och Underflow. TvŒ-komplement. FlyttalsvŠrden. Fyra heltalstyper. Tecken-bit

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

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Transkript:

725G61 - Laboration 1 Variabler och villkorssatser Johan Falkenjack October 16, 2013

1 Inledning till labbarna Any sufficiently advanced technology is indistinguishable from magic. - Arthur C. Clarke Citatet ovan speglar mångas upplevelse när de för första gången försöker lära sig att programmera, jag kan inte förneka att jag kände just så. Tanken är att när den här kursen är slut ska åtminstone den tyngsta mystiken skingrats och några av er kommer kanske till och med känna er som magiker. Ärligt talat händer det att jag gör det ibland när jag programmerar. De här labbarna är skrivna specifikt för kursen 725G61 Programmering, grundkurs för Systemvetenskapliga programmet vid LiU. De förutsätter ingen tidigare erfarenhet av programmering men antar att laboranten sedan tidigare har grundläggande datorvana. Om man har programmerat tidigare kan de första labbarna upplevas som väldigt grundläggande och väldigt pratiga. Detta är för att att ge nybörjarna en grund att stå på. Längre fram i labbserien kommer mängden förklaringar minska och ni kommer i större utsträckning förväntas hitta lösningarna själva. Många som aldrig programmerat tidigare vill få allting serverat för sig a la "Detta är våra komponenter och detta är hur vi använder dem". Det är inte möjligt i en Java-kurs. Java är ett enormt kraftfullt verktyg och som sådant är det också väldigt omfattande och tidivis komplicerat. Därför är det viktigt att ni, så fort ni lärt er det mest grundläggande, lär er hur ni själva hittar mer information. Jag som skriver dessa labbar har själv kodat i Java i flera år och det går sällan en dag utan att jag googlar på åtminstone något, det är så det är att vara programmerare. Jag kommer alltså att referera till Google vid ojämna mellanrum i labbarna för att ni själva ska få söka reda på lösningen till ett problem. Java har också ett standardbibliotek som finns dokumenterat med så kallad JavaDoc här: http://docs.oracle.com/javase/6/docs/api/ Ofta är första sökträffen på Google en länk till just denna källa. På vissa ställen i labbarna står det att ni ska kopiera och klistra in kod i Eclipse, ibland kan det bli struligt med formateringen i PDF-dokument så kontrollera att det alltid ser rätt ut när ni kopierar. 1.1 Övningar och Uppgifter I labben finns både Övningar och Uppgifter. Övningar är till för att ni ska få testa och experimentera med Java, ni behöver dock inte lämna in den kod ni skriver för övningarna, ofta handlar det om att testköra och reflektera över given kod. Uppgifter däremot måste lösas och lämnas in för rättning. Är ni vana vid programmering, och speciellt vid Java, så måste ni kanske inte göra alla övningar men jag rekommenderar er att göra så många som möjligt. 1

1.2 Språk Jag rekommenderar starkt att man skriver sin kod "på engelska" oavsett vilket språk programmet i sig använder. Det betyder t.ex. att variabel- och metodnamn samt kommentarer bör vara på engelska. Faktisk interaktion med användaren kan vara på svenska när vi väl kommer till det i labb 3 och i projektet. Anledningen till att man bör hålla sig till engelska i koden är dels att alla inbyggda kommandon är på engelska och man vill ha koden så konsekvent som möjligt och dels att Java kan få problem med Å, Ä och Ö. 2 Ett första Java-program 1 public class HelloWorld { 2 3 public static void main(string[] args) { 4 //Print Hello World! 5 String greeting = "Hello World!"; 6 System.out.println(greeting); 7 8 9 Ovan har vi ett första enkelt Java-program. Det kan verka rörigt vid första anblick men de flesta delar ovan kan ni ta för givna och de kommer förklaras en efter en allt eftersom kursen fortskrider. En kort beskrivning kommer nedan men få inte panik om ni inte förstår särskilt mycket så här tidigt i kursen. Det första vi gör är att skapa en klass som vi döper till HelloWorld. Alla program i Java representeras av en eller flera klasser och varje kodfil innehåller en enda klass 1. Större Java-program med flera klasser består alltså nödvändigtvis av flera filer. Det är inte ovanligt att Java-program i industrin har hundratals eller tusentals klasser. Det som står på rad 1 är en klassdeklaration och det som står inom måsvingarna ({) är klassens kropp. Kroppen består av en enda metod som heter main. För att en klass ska kunna köras, dvs kunna utgöra "framsidan" av ett program måste det finnas en mainmetod. Vad public static void betyder går vi inte in på här men det behövs för alla main-metoder. Efter metodnamnet (main) finns en parentes där metodens parametrar eller argument (termerna används normalt som synonymer) står. Alla main-metoder har samma parametrar, en array av String som heter args. Precis som för klassen så börjar metoden med en deklaration, på rad 3, följt av en kropp inom måsvingar. Main-metodens kropp består av tre rader. Den första raden, rad 4, består av en kommentar. Kommentarer ignoreras av Java när koden körs och finns med för att dokumentera koden. Att lära sig skriva bra och hjälpfulla kommentarer 1 En sanning med modifikation men för den här kursen kan vi anta att så är fallet. 2

är viktigt och gör koden mycket mer lättläst och lätt att underhålla. Man kan också skriva en flerradskommentar, även kallad blockkommentar genom att omge den text man vill utkommentera med /* och */. På rad 5 skapar vi en variabel, greeting, av typen String med innehållet "Hello World" och på rad 6 anropar vi den inbyggda metoden System.out.println som skriver ut innehållet i variabeln greeting på skärmen följt av en radbrytning. När programmet körs kommer alltså "Hello World!" skrivas ut på skärmen. Verkade det krångligt? Ta det lugnt, i den första labben behöver ni bara intressera er för det som hände på rad 4 och 5, vi kommer också titta på villkorssatser, mer om det senare. UPPGIFT 1.1 Starta Eclipse och skapa ett första projekt. Skapa sedan en ny klass i det nya projektet som heter Uppgift1. Som ni märker kommer klassdeklarationen och måsvingarna för klassens kropp genereras automatiskt. Skriv en main-metod som ser ut precis som i exemplet ovan. Kör sedan koden och kolla att "Hello Wold!" skrivs ut i fönstret längst ner i Eclipse. Var inte rädda för att experimentera eller för att fråga assistenterna om hjälp med att komma igång. Övning 1.1 Följande Javaprogram kompileras och exekveras: // a Java program class Message { public static void main (String[] args) { System.out.println("Good luck!"); /* System.out.println("Good luck!"); System.out.println("Good luck!"); */ //a message Vilken utskrift skapas när programmet exekveras? Varför? (Försök att fundera ut det innan du kör programmet - kolla sedan om du hade rätt genom att köra det!) Vad händer om ni tar bort block-kommentaren? 3

Övning 1.2 Skapa ett program som skriver ut följande meddelande (med en tom rad emellan): Programming is fun! Soon I will be able to program really well! 3 Variabler Variabler är en av programmeringens viktigaste grundstenar. En variabel kan betraktas som en behållare som innehåller någon typ av värde. En typ av variabel som ni alla stött på tidigare är de x som brukar förekomma i polynom i gymnasiematematiken, t.ex. x+3. Ordet variabel antyder att behållarens värde är variabelt, dvs det kan ändras. I polynomet ovan kan vi t.ex. bestämma att x ska vara 1 vilket ger polynomet värdet 4 men vi kan också säga att x ska vara 4 vilket ger uttrycket värdet 7. I programmering kan dock en variabel innehålla så mycket mer än bara ett siffervärde, t.ex. kan en variabel också innehålla ett tecken som a, b eller c, eller ett namn som "Lisa" eller en hel datastruktur som representerar t.ex. en fiende i ett spel. I Java måste man som programmerare själv säga vilken typ av värde en viss variabel kan innehålla. Man måste också namnge en variabel innan den kan användas. Detta kallas att deklarera en variabel. I Java kan en typisk variabeldeklaration se ut på följande sätt: 1 //Declare integer variable anumber 2 int anumber; I koden ovan ser vi två rader. Den första raden är bara en kommentar som ignoreras av Java. Den andra raden är den faktiska deklarationen. Först kommer "int" som säger att variabeln ska ha typen heltal (efter engelskans integer), sedan "anumber" som blir namnet på vår variabel, sedan ett semikolon (;) som avslutar raden. Alla uttryck i Java måste avslutas med ett semikolon. Att bara ha en variabel är ju inte så intressant dock vi vill ju lagra något i vår variabel. Att lagra ett värde i en variabel kallas att tilldela variabeln ett värde. Första gången en variabel tilldelas ett värde säger man att den initieras. 1 //Declare and initialize at the same time: 2 int anumber = 1; 3 //Declare: 4 int anothernumber; 5 //Initialize: 6 anothernumber = 3; 4

I koden ovan deklarerar vi två variabler, anumber och anothernumber. På rad 2 tilldelas variabeln anumber värdet 1 i samband med att variabeln deklareras, variabeln anothernumber deklareras först på rad 4 och får sedan värdet 3 på rad 6. 3.0.1 Regler för variabelnamn Variabler kan inte innehålla mellanslag eller andra tecken än bokstäver och siffror. De kan dock inte börja på en siffra och börjar alltid med liten bokstav även om stora bokstäver kan förekomma senare i variabelnamnet. Variabler med sammansatta namn skrivs i Java med sk camel case, t.ex. numbertoadd för ett tal som ska läggas till ett annat tal. Hur ska man namnge sina variabler då? I de här labbarna kommer ni stöta på många variabler som heter i, c1, n osv. Dessa namn är praktiska i exempel men i verkliga program är det viktigt att variabelnamn är semantiskt logiska. Dvs de ska vara namngivna utifrån den funktion de uppfyller i programmet. En variabel som innehåller ett namn bör t.ex. heta name, personname, customername eller liknande beroende på vad variabeln innehåller och hur den ska användas. 3.1 Typer Alla värden och alla variabler i Java har en specifik typ. Hittills i labben har vi stött på två typer, int, för heltal, och String, för textsträngar. När en variabel deklareras måste man säga vilken typ variabeln ska ha. I Java finns 8 så kallade primitiva datatyper, 4 olika heltalstyper, 2 flyttalstyper (för decimaltal), 1 sanningsvärdestyp och 1 teckentyp. 3.1.1 Heltal Datatyperna byte, short, int och long används för att representera heltal. Byte tar minst plats i datorns minne men kan också bara representera tal mellan -128 och 127, long tar mest plats men kan också representera störst tal. Övning 1.3 Skapa en ny klass som heter Test3. Skapa sedan en main-metod i vilken ni skapar två heltalsvariabler med värden ni hittar på själva. Skriv sedan ut summan av dessa med hjälp av System.out.println(). Summan av två heltal kan beräknas med additionsoperatorn +, t.ex.: 1 + 2; Skriv sedan ut resultaten av att använda de andra aritmetiska operationerna, - (subtraktion), * (multiplikation) och / (division). Använd sedan tilldelning för att byta värden på variablerna. Välj värden så att divisionen inte går jämnt ut och skriv ut de fyra beräkningarna en gång till. Vad händer när divisionen inte går jämnt ut? 5

Övning 1.4 Skapa följande program: class OperationsOnAVariable { public static void main (String[] args) { int a = 4; int b = 6; int c = 10; int d = 12; b = b + a; c -= b; d /= a; a = a * 10; a %= 7; System.out.println(a+" "+b+" "+c+" "+d); Vilken utskrift får du när du exekverar det här programmet? Försök räkna ut i förväg vad programmet kommer att skriva ut, kontrollera sedan om ni hade rätt genom att köra programmet. 3.1.2 Flyttal Datatyperna float och double används för att representera decimaltal. Dessa representeras internt som så kallade flyttal och därför kallas decimaltal oftast för flyttal när programmerare pratar med varandra. Double tar dubbelt så stor plats som float men har å andra sidan dubbelt så stor precision, dvs man kan representera dubbelt så många decimaler. Flyttal är inte exakta och man kan få allvarliga avrundningsfel när man använder flyttal, därför använder man sällan dessa i verkliga applikationer där exakta beräkningar är viktigt, t.ex. för vetenskapliga beräkningar eller pengar. För våra syften i den här kursen duger de dock gott och väl. Övning 1.5 Skapa en ny klass som heter Test5. Gör samma sak som i Övning 3 fast med flyttal. Vad händer med divisionen som inte gick jämnt ut? 6

UPPGIFT 1.2 Skapa en ny klass som heter Uppgift2 och en main-metod. Skapa en heltalsvariabel och en flyttalsvariabel och skriv ut resultaten av att använda de 4 räknesätten på dessa. En omgång med heltalet först och en med flyttalet först, totalt ska det vara 8 beräkningar. Titta på utskriften och fundera över vad som händer. Övning 1.6 Ett bibliotek köper in 30 exemplar av en bok och 70 exemplar av en annan bok. Den första boken kostar 125.0 kronor och den andra boken kostar 210.5 kronor. Hur mycket betalar biblioteket för alla dessa böcker? Skapa ett program som utför motsvarande beräkning. 3.1.3 Tecken Datatypen char (för character, det engelska ordet för tecken) används för att representera tecken, t.ex. a, 3 eller?. Viktigt att inse är att det inte är det matematiska värdet 3 vi talar om här utan bara tecknet 3. För att kunna hantera text i våra program måste vi kunna hantera tecken. För att skapa ett tecken skriver vi: 1 //Declare and initialize c1, c2 and c3 2 char letter = a ; 3 char three = 3 ; 4 char query =? ; Viktigt när vi skapar ett tecken är att vi omger tecknet med enkla citationstecken. I en dator representeras ju i grunden allting av ettor och nollor. Så även tecken. Vad ettorna och nollorna representerar för char är positionen i en så kallad teckentabell. Detta innebär att vi kan använda vissa aritmetiska operationer även på char. UPPGIFT 1.3 Skapa en ny klass som heter Uppgift3 och en main-metod. Skapa 4 olika teckenvariabler, välj själv det första tecknet. Det andra tecknet ska vara det första tecknet plus 2, det tredje tecknet ska vara det första tecknet minus 3 och det sista tecknet ska vara summan av det andra och det tredje tecknet. Skriv sedan ut alla fyra tecken. 7

Övning 1.7 class Characters { public static void main (String[] args) { char c1 = A ; char c2 = 65; int n = 65; System.out.println(c1); System.out.println(c2); System.out.println(n); System.out.println(); char c3 = \\ ; char c4 = \n ; char c5 = 48; char c6 = 97; System.out.println(c3); System.out.println(c4); System.out.print(c5); System.out.print( \t ); System.out.println(c6); Vilken utskrift får man när man exekverar det här programmet? Försök räkna ut vad som kommer skrivas ut innan ni exekverar programmet och kolla om ni hade rätt! 3.1.4 Sanningsvärden, boolean Datatypen boolean är unik bland de primitiva typerna i det att den bara har två möjliga värden, true och false. Dessa används för att indikera huruvida ett uttryck i Java är sant eller falskt. Detta kan verka överdrivet enkelt för en hel datatyp men lägger grunden för nästan allting man kan göra i Java. För att skapa en boolean skriver man exempelvis: 1 //Declare and initialize happy and sad 2 boolean happy = true; 3 boolean sad = false; I Java kan alla uttryck och värden tolkas som ett sanningsvärde. Detta kommer vi komma tillbaka till när vi tittar på villkorssatser. Aritmetiska operationer, som addition och subtraktion, är inte intressant när man pratar om sanningsvärden. Det är däremot logiska operationer. Några exempel: 8

//and && boolean b1 = true && true; //or boolean b2 = false true; //not! boolean b3 =!false; //equal boolean b4 = (1 == 1); //not equal boolean b5 = (1!= 2); //less than boolean b6 = (1 < 2); //less than or equal boolean b7 = (1 <= 1); Övning 1.8 Skapa en ny klass som heter Test8 och skapa en main-metod. Klistra in koden ovan och skriv ut värdena av b1 till b7. Experimentera med olika kombinationer av värden. Försök göra så att alla värden blir false istället för true utan att ändra på operatorerna. Övning 1.9 class LogicOperations { public static void main (String[] args) { int m = 2; int n = 5; boolean b1 = m > 2 ^ n >= 5; boolean b2 = m > 2 && n >= 5; boolean b3 = m > 2!(n < 5); System.out.println (b1 + " " + b2 + " " + b3); boolean b4 = m == 2 n >= 5 && m > n; boolean b5 = (m == 2 n >= 5) && m > n; boolean b6 = m == 2 (n >= 5 && m > n); System.out.println (b4 + " " + b5 + " " + b6); Vilken utskrift får du när du exekverar det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. 9

3.1.5 Typecasting, att byta typ Att byta typen av ett värde kan ibland vara viktigt i Java, t.ex. när man vill tilldela värdet av en viss variabel till en variabel av en annan typ. Ibland görs dessa typomvandlingar automatiskt, när det inte finns någon risk att det blir fel, men ibland måste man explicit "casta" värden vid en sådan typomvandling. Här kommer ett exempel med int och float: 1 float afloat = 5.0F; 2 int aninteger = (int)afloat; Vad vi gör är alltså att vi sätter en parentes med den önskade typen framför variabeln vars värde vi vill konvertera. Värdet som lagras i a förändras inte men vår cast tillåter oss att tilldela b värdet av heltalsdelen av a. UPPGIFT 1.4 Skapa en ny klass som heter Uppgift4 och en main-metod. Klistra in följande kod i main-metoden. byte b1 = 10; int i1 = b1; int i2 = 10; byte b2 = i2; System.out.println(i1); System.out.println(b2); float f1 = 2.5F; double d1 = f1; double d2 = 2.5; float f2 = d2; float f3 = 2.5; System.out.println(d1); System.out.println(f2); Koden kommer inte att fungera. Lägg till casts på de ställen där det behövs för att koden ska fungera. Skriv en kommentar till varje rad som behöver castas och förklara varför den casten behövs. Diskutera med en labbassistent om ni behöver hjälp. 4 String, en extra datatyp Utöver de inbyggda datatyperna finns det en datatyp som är central för Java och det är strängen, String. En sträng är en sekvens av tecken som kan användas t.ex. för att representera meningar eller ord, eller hela texter. Varje gång 10

man kör System.out.println(ett_värde) så konverteras ett_värde till en sträng. Inbyggt i Java är att allting har ett strängvärde. För att skapa en sträng skriver vi: 1 //Declare and initialize s1 2 String astring = new String("Here is a String."); 3 //Shortcut for declaring and initializing s2 4 String anotherstring = "Here is a another String." Nu kanske ni reagerar på att String, till skillnad från t.ex. int och char, har ett namn som börjar med stor bokstav. Det beror på att String inte är en primitiv datatyp utan en klass. Det är också därför vi skapar ett nytt objekt genom att använda new-operatorn. Strängen är dock så central för Java att man kan skapa en sträng på samma sätt som man skapar "vanliga" variabler. När man använder operatorn + på två strängar görs så kallad konkatenering, dvs sammanslagning. Exempel: 1 //Declare and initialize s1 2 String name = "Joje"; 3 //Concatenation in a print 4 System.out.println("My name is " + name); UPPGIFT 1.5 Skapa en ny klass som heter Uppgift5 och en main-metod. Skapa två strängvariabler som innehåller ditt förnamn respektive efternamn samt en heltalsvariabel som innehåller ditt födelseår. Skriv sedan ut enligt följande: "Namn Efternamnsson, born 1923." och se till att alla mellanslag och sånt hamnar på rätt ställen. Nu är det dags att använda nätet. Läs på om klassen String genom att slå upp den i JavaDoc för Javas standardbibliotek (tips: känner du att du behöver mer exempel - testa även att Googla på t ex "Java String") för att ta reda på hur du ska lösa följande två uppgifter. UPPGIFT 1.6 Skapa en klass som heter Uppgift6 och skapa en main-metod. Skriv ett program som lagrar textsträngen "abcdefghi" i en variabel, hämtar ut tecknen som finns på position 2 ("b") och 5 ("e") i strängen, samt positionen för bokstaven "g" i strängen, lagrar dem i varsin variabel, och slutligen skriver ut värdena för de tre variablerna på varsin rad. Här i uppgiften menar vi med "position" den siffra i ordningen som en bokstav får om vi börjar räkna från "a" som bokstav nummer 1, "b" som 2 osv - notera att det inte är detsamma som index (se nästa labb för mer om index). Använd lämpliga metoder från klassen String. 11

UPPGIFT 1.7 Skapa en klass som heter Uppgift7 och skapa en main-metod. Skriv ett program som lagrar textsträngen "vi gillar Java" i en variabel, hämtar ut delsträngen "Java" ur den ursprungliga strängen och lagrar den i en ny variabel, samt gör om den nya textsträngen så att alla bokstäver blir versaler, dvs stora bokstäver, och lagrar resultaten i en tredje variabel. Skriv sedan ut de tre textsträngarna. Hitta lämpliga funktioner för att utföra uppgiften genom att läsa på om klassen String. 4.1 Referenser Eftersom String är en klass och inte en primitiv datatyp används en speciell typ av variabel, en så kallad referensvariabel. En referensvariabel innehåller inte ett värde direkt utan innehåller bara en referens till ett värde. I praktiken innehåller en referensvariabel en adress till en plats i datorns minne. När man använder de vanliga jämförelseoperationerna, ==,!=, <, osv. jämför man därför inte värden utan adresser i minnet. För att jämföra det faktiska värdet, de faktiska objekten, som två referensvariabler pekar på använder man metoden equals. Detta kan enklast illustreras genom ett exempel. 1 public class StringReferences { 2 public static void main (String[] args) { 3 String a = new String("same"); 4 String b = new String("same"); 5 System.out.println(a); 6 System.out.println(b); 7 System.out.println(a == b); 8 System.out.println(a.equals(b)); 9 10 Testkör ovanstående kod. Titta specifikt på vad som skrivs ut. Utskrifterna på rad 5, 6 och 8 visar att strängarna är likadana. Utskriften på rad 7 visar dock att det inte är samma sträng. Tänk på det som två exemplar av samma bok. Böckerna är likadana, men det är inte samma bok. När man vill veta om två strängar är likadana vill man alltså alltid använda equals, inte ==. Detta gäller för alla referenser. En annan svårighet med referens-variabler är att de kan referera till samma objekt, men mer om det i nästa labb. 12

5 Villkorssatser Ett program som bara tilldelar variabler och utför aritmetiska operationer är kanske intressant för matematiker och andra som främst jobbar med beräkningar 2. I verkligheten behöver man dock kunna anpassa vad som händer efter den input programmet får. För att göra det använder man så kallade villkorssatser. 5.1 If-satsen En if-sats är en konstruktion som, baserat på ett sanningsvärde, kan välja huruvida viss kod ska köras eller ej. Ett exempel: 1 int a = 1; 2 if (a > 0) { 3 System.out.println("a is larger than 0"); 4 På rad 2 i koden ovan har vi vår if-sats. Inom parentes står ett predikat, ett uttryck som har ett sanningsvärde (predikatet i en if-sats kallas ofta conditional på engelska). I det här fallet, en jämförelse mellan värdet på variabeln a och värdet 0. Om värdet som lagrats i a är större än 0 blir uttrycket sant och koden på rad 3, if-satsens kropp körs. Är uttrycket inte sant, dvs om a är lika med eller mindre än 0, hoppar Java över koden som står mellan måsvingarna. 5.1.1 Måsvingar Måsvingar avgränsar ett så kallat kodblock. Ett kodblock har ett antal intressanta egenskaper, den viktigaste är att den definierar den sk lokala omgivningen, dvs den omgivning i vilka nya variabler blir synliga. Deklarerar ni en variabel inne i ett block är den inte tillgänglig utanför blocket. Block kan innehålla andra block, vi kan t.ex. ha en if-sats i en if-sats och variabler som är deklarerade i ett "yttre" block är tillgängliga i sådana "underblock". Möjligheten att dela in program i sådana block är essentiell för modern programmering. När en if-sats kropp (koden mellan måsvingarna) bara är en rad kan man enligt Java-standarden utelämna måsvingarna. Detta gäller även för while- och for- som vi stöter på i nästa labb. Jag vill starkt avråda från att utnyttja den genvägen! Ett av de vanligaste felen man gör som Java-programmerare är att glömma lägga till måsvingarna om en kropp behöver utökas till fler rader. De flesta företag i industrin har egna kodstandarder som kräver att man alltid använder måsvingar, även när det bara är en rad i kroppen. Alltså är det lika bra att vänja sig direkt. Det förekommer dock exempel här och där utan måsvingar. 5.2 Else-satsen Väldigt ofta är beteendet man vill skapa av typen "antingen eller". Då använder man else-satsen. Else är en konstruktion som bara kan användas i anslutning 2 Som, öh, språkteknologer, t.ex. författaren till dessa labbar. *host* 13

till en if-sats och som används som alternativ. Dvs om predikatet i if-satsen inte är sant så körs koden som hör till else istället. Exempel: 1 int a = 0; 2 if (a > 0) { 3 System.out.println("a is larger than 0"); 4 else { 5 System.out.println("a is less than or equal to 0"); 6 Man kan slå ihop flera if- och else-satser på följande sätt. 1 int a = 0; 2 if (a > 0) { 3 System.out.println("a is larger than 0"); 4 else if (a == 0) { 5 System.out.println("a equal to 0"); 6 else { 7 System.out.println("a is less than 0"); 8 Övning 1.10 Skapa en ny klass som heter Test10 och en main-metod. Klistra in koden ovan i main-metoden och prova att byta ut värdet på a mot olika heltalsvärden och se vad som händer. 14

Övning 1.11 class PerformUnderOneCondition { public static void main (String[] args) { int m = 4; int n = 5; if (m!= n) System.out.println(m + "!= " + n); m = 5; if (m!= n) System.out.println(m + "!= " + n); System.out.println(m + " not equal to " + n); if (m!= n) { System.out.println(m + "!= " + n); System.out.println(m+ " definitely not equal to " + n); if (m >= 2 && m <= 7) System.out.println(m + " lies between 2 and 7"); Exekvera ovanstående program. Vilken utskrift får du? Varför? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. 15

Övning 1.12 class SameLogic { public static void main (String[] args) { int m = 10; if (m < 0) System.out.println( m + " < 0 "); else if (m == 0) System.out.println( m + " == 0 "); else { if (m == 10) System.out.println(m + " == 10"); else System.out.println(m + "!= 10"); if (m < 0) System.out.println(m + " < 0 "); else if (m == 0) System.out.println(m + " == 0 "); else if (m == 10) System.out.println(m + " == 10 "); else System.out.println(m + "!= 10 "); Vilken utskrift får man av det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. UPPGIFT 1.8 Skapa en klass som heter Uppgift8 och skapa en main-metod. Skapa en heltalsvariabel a och ge den ett värde. Skriv sedan en if-sats som skriver ut meddelandet "mellan 1 och 10" om heltalet ligger mellan 1 (inklusive) och 10 (inklusive), eller om heltalet ligger mellan 11 (inklusive) och 100 (inklusive) meddelandet "mellan 11 och 100", eller i annat fall meddelandet "inte mellan 1 och 100". Testa att exekvera programmet med olika värden på a, t.ex. -5, 1, 5, 11, 75, 100 och 110. Det kommer bli nödvändigt att kombinera logiska operationer från avsnitt 3.1.4. 16

5.3 Switch och case Ett alternativ till if-satser, när man har många alternativ, är den så kallade Switch-satsen. Den går ut på att man indikerar vilken variabel man vill inspektera och sedan definierar ett antal fall samt vad som ska göras i varje fall. Ett exempel: int value = 2; switch (value) { case 1: System.out.println("the number 1"); break; case 2: System.out.println("the number 2"); break; case 3: System.out.println("the number 3"); break; case 4: System.out.println("the number 4"); break; default: System.out.println("not 1, 2, 3 or 4"); Anledningen till att det står break sist i varje case är att utan detta fortsätter Java att köra resten av alla cases. Det sista fallet, default, körs om inget annat fall visade sig gälla. Man kan alltså säga att default motsvarar if-satsens else. Övning 1.13 Skapa en ny klass som heter Test13 och en main-metod. Klistra in koden ovan i main-metoden och prova att ta bort några break och se vad som händer. Prova med olika värden på val. UPPGIFT 1.9 Skapa en ny klass som heter Uppgift9 och en main-metod. Skapa en teckenvariabel och tilldela den värdet av en bokstav som du väljer själv. Skriv en switch-sats som kontrollerar om bokstaven är en vokal eller inte. Är det en vokal skrivs meddelandet "vokal" ut, annars "konsonant". Tips: Tänk på hur du bäst använder default för att slippa onödiga fall. 17

6 Redovisning Nu när ni är färdiga med alla uppgifter är det dags at lämna in era lösningar för Uppgift 1.1 till 1.9 för rättning. Gå igenom era lösningar en extra gång och se till så att hi har kommenterat er kod, och testkört den noga så att ni är säkra på att alla lösningar fungerar. Samla ihop kodfilerna (filerna som slutar på.java) i ett zip-arkiv och ladda upp zip-filen under Labb1 i LISAM. Glöm inte att skriva namnen på båda gruppmedlemmarna i kommentarsfältet vid inlämningen. 18