Programkonstruktion för F, 2D1342, Laboration 0: Kom igång med Java-programmering - förberedande uppgifter

Relevanta dokument
UNIX. 2D1339 Programkonstruktion Hösten 2001 Datorintroduktion Laboration 1. Mål. Vad laborationen går ut på. Redovisning

Laboration 1: Linser

k 1 k 2 y a b Figur 1: En ljusstråle genom en tunn lins ändrar sin vinkel då den passerar genom linsen. Ljusstrålens lutning före linsen är här k1 = y

Laboration 1: Linser

Att prova på en enkel Applet och att lära sig olika sätt att hämta data från tangentbordet. Du får även prova på att skapa din första riktiga klass.

Laboration 1: Linser

Laboration 1: Linser

2D1339 Programkonstruktion för F1, ht 2003

Laboration 1: Linser

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

Laboration 1: Linser

2D1339 Programkonstruktion för F1, ht 2003

k 2 k 1 = y a a y f = k 1 y f y 2 = y 1 + k 1 (x 2 x 1 ) k 2 = k 1 y 2

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

2D1339 Programkonstruktion för F1, ht 2004

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

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

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

Lab5 för prgmedcl04 Grafik

Föreläsning 5-6 Innehåll

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

(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

2D1342 Programkonstruktion för F1, ht 2006

Kort-kort om utdelade användarkonton och datormiljön på NADA

Laboration 1. "kompilera"-ikonen "exekvera"-ikonen

2D4112 Datalogi I, grundkurs med Java, Labkurs 1. Godkänd Labkurs 1 ger 2p (högskolepoäng) av kursens totalt 10p

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

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

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

OOP Tentamen

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

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.

DD1311 Programmeringsteknik för S1 Laborationer läsåret

Introduktion till Matlab

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Föreläsning 1 & 2 INTRODUKTION

HI1024 Programmering, grundkurs TEN

PROGRAMMERING-Java Omtentamina

Introduktion till Matlab

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

DN1212, Numeriska metoder & grundläggande programmering. Laboration 1 del 1-3 (frivilliga delar) Del 1-3 (dvs upg ) behöver inte redovisas

TENTA: TDDD11 & TDDC68. Tillåtna hjälpmedel. Starta Emacs, terminal och tentakommunikationsfönster. Skicka in frågor och uppgifter

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

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

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

DD1310 Programmering för OPEN1 LAB1: Laborationer i Python läsåret 2011/2012

Objektorienterad programmering i Java. Föreläsning 5 Kort om Java-Applets

DN1240, Numeriska metoder. Laboration 0 (frivilliga delar) (dvs uppgifterna behöver inte redovisas) Introduktion till UNIX och MATLAB

Labora&on 2 Funk&oner, if och loop övningar/uppgi:er

Använda Python Laboration 1 GruDat, DD1344

Föreläsning 3-4 Innehåll

OBS! Snabbinsatt Matlab-intro vissa fönsterhanteringsdetaljer kan vara fel men gör gärna Matlab-uppgifterna. DN1240, Numeriska metoder för OPEN1.

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

Iteration while-satsen

DD1311 Programmeringsteknik för CL1 Laborationer läsåret

KARLSTADS UNIVERSITET 12/8/09 informatik & datavetenskap Johan Öfverberg, Kerstin Andersson Laboration 4, ISG A04 och DVG A08 HT-09

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

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

Programutveckling med Java Development Kit. (JDK 1.1.x) och Programmers File Editor (PFE 7.02)

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

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Applets med komponenter

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

Kort-kort om utdelade användarkonton och datormiljön på NADA

Föreläsning 1 & 2 INTRODUKTION

PROGRAMMERINGSTEKNIK TIN212

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

OOP Objekt-orienterad programmering

Föreläsning 3. Iteration while-satsen

Objektorienterad programmering Föreläsning 2

Objektorienterad Programmering (TDDC77)

SF1672, Linjär Algebra med Matlab för F1 Lab0

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

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

Inledning till OpenOffice Calculator Datorlära 2 FK2005

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

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

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

DATORINTRODUKTION. Laboration E ELEKTRO. UMEÅ UNIVERSITET Tillämpad fysik och elektronik Ulf Holmgren

HI1024 Programmering, grundkurs TEN

DD1342 Programkonstruktion för F1, ht 2007

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

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

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

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

Introduktion till datormiljön och Python

Uppgift 1a (Aktiekurser utan poster)

Laboration 1 Introduktion till Visual Basic 6.0

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

Planering Programmering grundkurs HI1024 HT 2014

Extramaterial till Matematik Y

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

System.out.println("Jaså du har "+ antaldollar + " stycken.");

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

Uppgift 1 ( Betyg 3 uppgift )

JAVA Mer om klasser och objektorientering

Kom igång. Readyonet Lathund för enkelt admin. Logga in Skriv in adressen till din webbsida följt av /login. Exempel:

Transkript:

Programkonstruktion för F, 2D1342, 2008 2009 Laboration 0: Kom igång med Java-programmering - förberedande uppgifter [Sista redovisningsdatum för tidsbonuspoäng: fredagen den 31 oktober 2008] [Grundpoäng: 2] [Tidsbonus: +1] Målsättning Under denna laboration ska du skriva flera små Java-program. Följande ska du kunna när du är klar med labben: För fristående program kompilera och köra fristående program göra enkel inmatning från tangentbordet och utskrifter i terminalfönstret skapa objekt av några biblioteksklasser (Scanner, Random och String) och använda objektens metoder använda villkor använda enkla repetitioner För applets kompilera ett appletprogram och köra det med appletviewer definiera utseendet på skärmen för en applet genom att skriva en egen metod paint() anropa metoder ur klassen Graphics för att rita enkla figurer som streck, ovaler och rektanglar byta koordinatsystem från skärmens pixelkoordinater till mer fysikaliska koordinater skriva och använda små metoder med returvärde skriva och använda små metoder utan returvärde rita en matematisk funktion i en applet Sista uppgiften där man skriver flera egna metoder, byter koordinatsystem och ritar en kurva är större och lite svårare än de övriga. Den uppgiften är en direkt förberedelse för Laboration1: Linser. Man får öva på en av svårigheterna i Linsuppgiften och kan föra över både sina kunskaper och de metoder man skrivit till Linsuppgiften. 1

Tidsplan Laborationen är tänkt att genomföras under veckorna 41 och 42. Den är uppdelad i två delar, avsedda att utföras respektive vecka. Sista redovisningsdag för tidsbonuspoäng är fredagen den 31 oktober vilket är i vecka 44 (det är ingen undervisning på kursen vecka 43). Man bör dock börja med nästa labb under vecka 44 för att hinna med den före sitt bonusdatum! OBS! Det är inte säkert att den schemalagda labtiden räcker för att göra uppgifterna! Förberedelser Som förberedelse bör ni läsa igenom labbanvisningen samt studera anteckningar och utdelat material från föreläsningar och övningar. Tag med detta material till labben så ni kan titta på det när ni jobbar! Det kan också vara bra att förbereda sig genom att skriva programmen eller delar av dem på papper. 2

Första veckan Kursanpassningar För att automatiskt få tillgång till moduler som används på kursen (t.ex. Sima- Manager), direktlänk till kursens hemsida och meddelanden från kursledaren ska följande kommando ges i ett terminalfönster: course join progk08 Res-register För varje kurs här på CSC har vi ett s.k. Res register där delresultat för studenterna på kursen lagras. Ni lägger in er själva i detta register med kommandot res checkin progk08 Det kommer då frågor som ni svarar på efter bästa förmåga. Frågan om grupp är egentligen utan betydelse och det går bra att svara 0. Obs! Man kan bara checka in sig själv från sitt eget konto. Varje person måste göra både course join.. och res checkin.. från sitt eget konto. Ni som jobbar i par får logga ut och logga in igen på den andres konto för incheckning. Gemensam katalog (frivilligt) För er som jobbar två tillsammans är det praktiskt att ha en gemensam katalog som kan nås från båda användarnas konton. Ni kan då arbeta med programmet var för sig och det spelar ingen roll vem av er som loggar in då ni labbar tillsammans. Den gemensamma katalogen kan skapas genom att från den ena gruppmedlemmens konto ge kommandot course labdir progk08 kompisid där progk08 blir namnet på den gemensamma katalogen och kompisid är labbkompisens användarnamn. Ni kan använda ett annat katalognamn om ni vill, t.ex. om någon av er redan har en katalog som heter progk08 och som inte ska vara gemensam. Logga sedan ut, logga in på kompisens konto och ge kommandot från hennes/hans konto med samma katalognamn men använd den första personens användarnamn som kompisid. Den gemensamma katalogen kommer att läggas direkt under hemkatalogen hos båda. Ett annat sätt att få en gemensam katalog är att skapa en katalog med kommandot mkdir från ena kontot, sätta åtkomsträttigheter för kompisen med kommandot fs sa och från kompisens konto med kommandot ln -s skapa en symbolisk länk till den skapade katalogen. Se Unix-häftet för detaljerna, eller fråga en handledare! De åtgärder vi har beskrivit här behöver bara göras en gång. Om ni senare under kursen ska byta labb-kompis eller får problem så be en handledare om hjälp! Kataloger för kursen Om ni inte skapat gemensam katalog enligt föregående stycke, skapa en underkatalog för den här kursen genom att gå till hemkatalogen (antagligen står ni redan där) och skriv mkdir progk08 3

Det är förstås tillåtet att välja ett annat namn på katalogen än just progk08. Gå till den katalogen med cd progk08 Var och en av kursen labbar bör ha en egen underkatalog under progk08 Skapa en underkatalog för den labb ni nu ska göra, t.ex. med mkdir lab0 eller liknande. Labbkatalogerna kan i sin tur ha underkataloger om det behövs. SimaManager för hjälp och redovisning SimaManager är ett program som hanterar kön för hjälp under laborationerna. Ni som läst den frivilliga kursen i Datorintroduktion har redan stött på SimaManager. SimaManager startas genom att man skriver sm i ett terminalfönster. Om man inte loggat in någon gång efter att ha gjort så kan det extra kommandot course join progk08 module add sima behövas innan man kan göra sm. Från och med nästa inloggning fungerar det bra med sm direkt. Efter en liten stund får man upp ett fönster med en lång lista med kursnamnsförkortningar. Välj nu progk i listan och tryck sen på Login-knappen. Då visas den aktuella kön för kursen Programkonstruktion för F. Om ni vill ha hjälp eller redovisa så tryck på knappen Queue och bekräfta med OK. Om ni behöver hjälp med att få igång själva Sima-programmet, kalla förstås på en handledare! 4

Uppgifter på fristående program 1729 1729 är ett intressant tal. Enligt en välkänd anekdot besöker den engelske matematikern Hardy den indiske matematikern Ramanujan på ett sjukhus i London år 1917. Hardy åker taxi till sjukhuset och memorerar taxins nummer, 1729. När Hardy träffar Ramanujan berättar han vilket nummer taxin hade: Taxins nummer var 1729, det verkar vara ett mycket tråkigt tal. Hoppas det inte är ett dåligt tecken. Inte alls svarar Ramanujan. 1729 är ett mycket intressant tal. Det är det minsta (positiva) tal som kan skrivas som summan av två kuber på två olika sätt. Uppgift 1 Skriv ett program som frågar användaren efter två heltal, hämtar dem från terminalfönstret och beräknar och skriver ut deras kubsumma, dvs a 3 + b 3. Det duger bra att beräkna värdet som a a a+b b b! Genom att köra programmet upprepade gånger och prova med olika a och b kannitaredapåvilkadetvåsättenattskriva 1729 som kubsumma är! Hitta alltså de positiva heltalen a, b, c, d som är sådana att a 3 + b 3 = c 3 + d 3 = 1729 och a<b, c<d, a<c.obs!programmetskainte leta efter lösningar, bara hämta in två tal och skriva ut kubsumman! Skriv programmet som en klass med endast en main-metod. Använd klassen Scanner från paktetet java.util för att hämta värden från tangentbordet till programmet! På föreläsningarna och första övningen finns program att använda som förlaga. Skriv in progammet med emacs och lägg det i en fil vars namn börjar på en stor bokstav och slutar på.java, t.ex.kubsumma.java. Kompilera programmet med javac Kubsumma.java Om felmeddelanden skrivs ut, rätta felen i emacs och kompilera igen. När kompileringen gått bra, kör programmet med Slumptal java Kubsumma Många datorprogram behöver använda slumptal. Spelprogram kan använda tärningar, blanda kortlekar eller låta monster dyka upp slumpmässigt. En flygsimulator kan slumpa när oförutsedda besvärliga situationer ska uppstå för flygeleven. Ett glosförhörsprogram slumpar fram nästa glosa att fråga om. I moderna programspråksbibliotek brukar man ha tillgång till s.k. pseudoslumptal, tal som ser ut att vara slumpmässiga men i själva verket beräknas av datorn. I Java finns flera sätt att få tillgång till pseudo-slumptal. Ett av dem är klassen Random. Uppgift 2 Börja med att titta på dokumentationen av klassen Random. Ni hittar hela Javadokumentationen antingen genom att gå via kurshemsidans rubrik Användbara länkar eller genom att skriva in följande i en webbläsare: http://java.sun.com/j2se/1.5.0/docs/api/ I den långa spalten nederst till vänster finns alla biblioteksklasser i bokstavsordning. Leta rätt på Random och klicka på den! I fönstrets högra fält kommer nu dokumentationen om Random upp. Högst upp står namnet på det paket där Random ligger. 5

Vad heter det? En bit ner finns Constructor Summary och Method Summary. Titta särskilt på de två metoderna nextint() och nextint(int n). Ettanrop av den första metoden (för ett Random-objekt) ger ett slumptal som kan vara vilket heltal som helst som datorn kan lagra som typen int, dvs ett tal i intervallet [-2147483648, 2147483647]. Vad ger den andra metoden? Hur kan man använda den för att få ett likadant resultat som från en tärning, dvs ett slumptal som är 1,2,3,4,5 eller 6? Skriv ett program som först skriver ut minst tre olika slumptal slumpade från hela int-intervallet. Låt sedan programmet skriva ut resultaten av två slag med två tärningar. Det ska finnas förklarande text till alla utskrifter. Utskriften från hela programmet kan se ut så här. Rramen ska inte vara med i utskriften, den är bara till för att förtydliga här i labbanvisningen: Tre slumtal: -11731999 1229659244-467093732 Två tärningsslag med två tärningar: Tärning 1: 4 Tärning 2: 6 Tärning 1: 5 Tärning 2: 1 Provkör programmet flera gånger. Det ska bli olika värden på slumptalen. Kontrollera särskilt att tärningsvärdena håller sig inom det tillåtna intervallet! π = 3.14159265... Det lär finnas klubbar där man som inträdesprov har att rabbla några hundra decimaler ur talet π i rätt ordning. I den här uppgiften ska ni skriva ett enkelt program som hjälper en användare att öva på decimalerna i π. Niskasjälvaövaerpåatt använda klassen String ur Javas bibliotek men också öva på if-satser. Katalogen /info/progk08/ är kursbibliotek för progk08. Där kommer kursledaren att lägga diverse filer som är användbara för labbarna. Filen /info/progk08/java/lab0/pi innehåller π med rätt många decimaler. Hela talet ligger på en enda rad. Det finns alltså inga tecken för ny rad i filen även om utskrift av den måste ta upp många rader i terminalfönstret eller i emacs-fönstret. Uppgift 3 Kopiera π-filen enligt ovan till er egen katalog. Läs om klassen String i dokumentationen eller någon annanstans. Hitta den metod som ger längden (antalet tecken) för ett String-objekt. Skriv ett Java-program som skapar ett String-objekt vars värde är π med många decimaler enligt filen PI t.ex. genom att utgå från den filen och fylla i programkod runt om π. Det är tillåtet att korta ner filen lite om ni tycker den är otymplig men gör den inte så kort att det går lätt att se hur många siffror det är!. Låt programmet skriva ut antalet decimaler, t.ex. så här. 6

Programmets PI har 1729 decimaler. Obs! Antalet decimaler ska beräknas av en metod från String. Det duger inte att räkna för hand. Utvidga sedan programmet så att det frågar användaren efter ett förslag på π och hämtar in förslaget som en String, intesomtypendouble eller int. Programmet ska sedan jämföra förslaget med det korrekta π som finns lagrat i programmet och skriva ut en text enligt nedanstående alternativ. Programmets PI har 6480 decimaler Vad är pi? 3.1415 Dina 4 decimaler var rätt! Programmets PI har 6480 decimaler Vad är pi? 3.141592653589793 Dina 15 decimaler var rätt! Programmets PI har 6480 decimaler Vad är pi? 3.1415926535897193 Det var tyvärr fel nånstans! Metoden startswith i klassen String kan användas för att lösa uppgiften. Metoden fungerar så här: Om vi definierar String s1 = "ANNAPANNA"; String s2 = "ANN"; så kommer s1.startswith(s2) att ge värdet true eftersom "ANNAPANNA" börjar med "ANN". s1.startswith("apa") ger däremot false. Observera att programmet får vara lite korkat på så sätt att om någon av de inmatade decimalerna är fel men många är rätt så får man ändå bara veta att det är fel. I sista exemplet ovan är ju 13 decimaler rätt och först den fjortonde är fel. 7

Applet-uppgifter Under detta första labbtillfälle ska ni också prova på applets. Applets är (små) program som startas från webbsidor. På kursbiblioteket finns en fil med en applet som ritar en linje och en oval /info/progk08/java/lab0/rita.java Kopiera filen till er egen katalog eller skriv av den med Emacs. import java.awt.*; import java.applet.*; public class Rita extends Applet { } public void paint(graphics page) { page.drawline(100, 250, 200, 100); page.drawoval(100, 100, 100, 150); } När programmet är en applet måste det startas från en webbsida. Skapa med hjälp av Emacs filen Rita.html med följande innehåll: Detta är html-kod för en minimal webbsida som vi bara använder för att kunna provköra programmet. <applet code="rita.class" width=400 height=300> </applet> Detta betyder att programmet Rita.class är koden för en applet som ska synas i ett fönster som är 400 bildpunkter brett och 300 högt. Applet-programmet kompileras på samma sätt som fristående program javac Rita.java När kompileringen lyckats är det dags att provköra appleten: Medan man utvecklar och testar en applet är det mest praktiskt att göra provkörningar med appletviewer men när programmet är klart kan det vara roligt att ha det på sin egen webbsida. Provkör nu med appletviewer Rita.html Om ni har gjort allt rätt så ska det dyka upp ett nytt fönster med titeln»appletviewer: Rita.class» på skärmen. När appleten har startat ska linjen och ovalen synas i dess fönster. Det finns också en meny med namnet Applet som du framförallt använder för att avsluta provkörningen (alternativet Quit längst ned). 8

Figur 1: Uppgift 4 - appletens utseende När man använder applets så skapar java-systemet ett objekt från den mall som applet-klassen utgör. Här skapas alltså ett objekt av klassen Rita automatiskt, utan att vi själva begärt det med new. Java-systemet anropar också metoden paint() när systemet tycker att det är dags att uppdatera appletens utseende. Dessutom så skickar java-systemet ett objekt av klassen Graphics (till paint(..)). Detta objekt kan bl.a. rita linjer, rektanglar och ovaler. De kan ha olika färger och vara fyllda eller ofyllda. Vårt Graphics - objekt finns tillgängligt inuti paint()-metoden och kallas för page i vår applet. Koordinatsystemet som används har origo i övre vänstra hörnet och y-axeln riktad nedåt, x-axeln åt höger. Alla värden på linjers ändpunkter m.m. är pixelvärden och måste anges som heltal. Uppgift 4 - Ändra i applet-programmet Ändra nu i appletens paint()- metod så att följande ritas Ett kors Fyra parallella horisontella linjer Fyra ovaler som är 100 pixlar höga och 20 pixlar breda. Rita dem bredvid varandra. Två av ovalerna ska vara fyllda med någon färg som inte är svart ochtvåskavaraofyllda. Se figur 1) för ett exempel på hur det kan se ut. Er applet behöver inte se ut exakt som på bilden! 9

Uppgift5-Egenmetodförenegenfigur Skriv en ny applet. Det går bra att utgå från samma fil som den förra, Rita.java men ni får ändra namnet på filen och på klassen. Hitta på en egen figur som ritas upp av minst tre anrop av metoder ur Graphics. Definiera en metod som ritar figuren. Metoden ska ha minst en lägesparameter och minst en storleksparameter. Man ska alltså kunna välja var figuren ska placeras i x-led eller i y-led (eller båda) och minst en storleksparameter ska kunna varieras. Titta gärna på metoden för Smiley-gubben från föreläsning 2! Det duger förstås inte att bara skriva av den! Definiera paint()-metoden i den nya appleten så att er egen figur ritas upp minst fem gånger m.h.a. anrop av den nya metoden. Att redovisa första veckan Observera att detta bara är första halvan av lab0. 1 Programmet som beräknar kubsumman samt lösning på 1729-problemet. 2 Slumptalsprogrammet med utskrift enligt rutan på sidan 6. 3 π-programmet med utskrifter enligt sidan sidan 7. 4 Appleten Rita som ritar kors, parallella streck och ovaler på rad. 5 Applet som ritar er egen figur på fem (eller fler) olika ställen m.h.a. anrop av er egen metod. Ni kan redovisa så snart ni är klara så här långt eller vänta tills ni gjort även nästa veckas uppgifter. Kom ihåg att be om handledarens signatur på kvittensbladet när ni redovisat! 10

Andra veckan Även den här veckan har vi uppgifter både med fristående program och med applets. Uppgifter med fristående program Här kommer vi att öva på följande: Repetitionssater Principen för summera ett okänt antal värden Principen för hur värden överförs från ett steg i en repetition till nästa. Villkor De fristående program som skrivs här kommer att bestå av endast en klass med en main()-metod. Uppgift 1 - Beräkna medelvärde Skriv en klass med enbart en main-metod där följande uppgift utförs: Fråga användaren efter ett antal, n, läs in det från tangentbordet med hjälp av Scanner. Fråga därefter efter n st tal, läs in dem också med Scanner, summera talen och skriv ut deras medelvärde. När det programmet fungerar, utvidga det med en test på det först inlästa värdet, antalet. Om antalet, n, som användaren skrivit är <= 0,ge ett vänligt meddelande om att ett antal > 0 bör anges. Efter meddelandet behöver det inte hända något annat än att programmet avslutas, ni behöver inte upprepa frågan om antalet. Programmet får startas igen ifall man vill ge ett positivt antal. Uppgift 2 - Beräkna Fibonaccital En definition av Fibonacci-talen är följande: f 0 =0 f 1 =1 f n = f n 1 + f n 2 för n =2, 3, 4,... Skriv en klass med enbart en main()-metod där ett värde på max läses in till programmet och alla Fibonacci-tal som är mindre än talet max skrivs ut. Obs! Variabler med index ska inte användas. Man kan ändå inte veta hur många man behöver för att lösa uppgiften. Tre variabler räcker för att lagra Fibonaccitalen. Programmet behöver inte komma ihåg alla! Dessutom behövs förstås en variabel för max-värdet. Så här kan en körning av programmet se ut: Välkommen till Fibonacci-programmet! Hur stora tal vill du ha? 1729 Här kommer alla Fibonacci-tal < 1729: 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 Radbytet efter talet 144 är inlagt i efterhand förattdetskaseprydligtuthäri labbanvisningen. Era program får skriva alla tal på samma rad eller varje tal på egen rad eller göra radbyten på annat sätt, det spelar ingen roll! 11

Uppgift med applet Uppgift 3 - Byt koordinatsystem och rita en kurva Skriv en applet som ritar upp en matematisk funktion genom att i appletens paint()- metod dra små streck mellan punkter på funktionskurvan. Funktionens argument och värden ska anges som decimaltal och inte som heltal. Funktionen ska ritas i ett koordinatystem som har sitt origo ungefär mitt i appletfönstret och där en enhet är mycket mer än en pixel. Skalfaktorn får ni själva bestämma men den ska vara minst 10! Läs hela anvisningen innan ni börjar jobba med uppgiften! För att byta koordinatsystem krävs en del förberedelsearbete. Det går inte att ge datorn ett kommando för att byta utan man måste själv definiera de metoder gör det möjligt att använda det nya koordinatsystemet och som blir redskap för att rita ifönstret. Koordinatsystemet Java, liksom många andra datorbaserade grafiksystem, använder ett för en matematiker lite bakvänt koordinatsystem: origo ligger i övre vänstra hörnet med x-axeln åt höger och y-axeln nedåt. Vi kallar detta för skärmkoordinater med beteckningen x screen respektive y screen. Skärmkoordinaterna är alltid heltal som motsvarar antal bildpunkter. När man arbetar med naturvetenskapliga problem är det ofta mycket mer naturligt att använda ett koordinatsystem med y-axeln riktad uppåt och med reella tal som koordinater. Man vill vanligen också ha en lämplig skala, en enhet längs en koordinataxel ska ofta vara mycket längre än en pixel (motsatsen förekommer förstås). Det är också bekvämt att kunna lägga sitt origo var man vill och inte vara låst till övre vänstra hörnet. (se figur 2). Vi ska alltså rita i samma pixelbaserade fönster som förut men vi ska kunna tänka på fönstret med ett vanligt koordinatsystem. Origo ska vara ungefär mitt i fönstret (inte i övre vänstra hörnet) och punkten (1, 1) ska ligga en synlig bit till höger och uppåt från origo och inte nedåt och jättenära origo som i det ursprungliga systemet. Hur långt ifrån origo punkten (1, 1) ligger beror helt på vilken skalfaktor man valt när man definierat sitt nya koordinatsystem. Nya metoder Till att börja med behövs metoder som räknar om koordinater mellan de två koordinatsystemen. Sedan ska en metod som ritar linjer uttryckta i det nya koordinatsystemet definieras. Denna nya metod ska användas när funktionen ritas upp och inte den metod drawline() som användes förut och som endast kan ta emot parametrar som är heltal. OBS! Uppgiften ska lösas på det sätt som beskrivs här. Det duger inte att bara rita upp en funktion som ser bra ut. Uppgiften är en direkt förberedelse för laborationen Linser där man byter koordinatsystem på samma sätt. Ni får väldigt gärna välja själva vilken funktion som ska ritas och anpassa skalningen av koordinatsystemet och origos placering efter funktionen. Senare i labbanvisningen finns dock ett förslag på funktion och tillhörande lämplig skalning. Koordinatomvandlingar Eftersom x-axlarna respektive y-axlarna i de två koordinatsystemen är parallella kan vi konvertera x-koordinaten och y-koordinaten separat. För att konvertera åt båda hållen behöver vi fyra funktioner: 12

avbildningen x x screen, kallad xtoxscreen avbildningen y y screen, kallad ytoyscreen avbildningen x screen x, kallad xscreentox avbildningen y screen y, kallad yscreentoy Vi kan här begränsa oss till konverteringen från det reella systemet till skärmkoordinater, d.v.s. de två första funktionerna. Det är dessa som behövs när vi ska rita. I Java kan man definiera metoder som motsvarar matematiska funktioner. Metoden för konvertering från x (det reella koordinatvärdet) till x screen eller X (heltalet) kan illustreras med följande figur: x xtoxscreen Givet att metoden xtoxscreen definierats kan man använda den i beräkningsuttryck, t.ex. vid tilldelningar som denna: int xcoord = 2 * xtoxscreen( a + b ); eller vid beräkning av parametrar vid anrop av andra metoder, t.ex. på detta sätt: page.drawline( xtoxscreen( a ), 0, 100, 100 ); För att Java ska kunna utföra sater som innehåller xtoxscreen(..) måste vi definiera vad vi menar med»xtoxscreen». Detta gör man genom att skriva en metoddefinition med följande principiella utseende: X int xtoxscreen( double x ) { return <beräkning av x screen } från x>; Ordet int anger att resultatet från metoden är ett heltal (integer). xtoxscreen är metodens namn. Texten ( double x ) betyder att metoden tar en parameter och att denna parameter är ett ett reellt tal (double betyder reella tal lagrade som flyttal med s.k. dubbel precision). Namnet x används inne i metoddefinitionen för att beteckna värdet av parametern. Det speciella ordet return skall följas av ett beräkningsuttryck som anger hur det resulterande värdet ska beräknas m.h.a. parametern x. Hela uttrycket <...> ska ersättas av beräkningsuttrycket. Metoddefinitioner skall alltid placeras inuti en klassdefinition men utanför alla andra metoddefinitioner. 13

x screen y x y screen Figur 2: Java använder ett koordinatsystem där man räknar i bildpunkter från övre vänstra hörnet (skärmkoordinaterna x screen och y screen). Kalla pixelvärdena för origo i (x,y)-systemet för (x0,y0). Definiera metoderna för koordinatomvandlingar Skriv nu definitionerna för de två metoderna xtoxscreen och ytoyscreen. Välj gärna nya kortare (men ändå tydliga) namn. Tänk först igenom hur koordinaterna ska räknas om. Det är lämpligt att definiera pixelkoordinaterna för nya koordinatsystemets origo samt skalfaktorn som variabler i programmet. Då är det lätt att ändra på dem när man experimenterar med sitt ritande. Tips: Eftersom omvandlingen från ett reellt tal till heltal innebär att man tappar noggranhet (decimalerna försvinner) så måste man uttryckligen begära denna omvandling. Man använder då det speciella skrivsättet: (int)double-uttryck Exempelvis: double a = 3.1415; int k = (int) a; int m = 25 * (int)(a + 0.5); Uttrycket (a + 0.5) beräknas här som ett double-tal som sedan omvandlas till ett heltal. Detta heltal multipliceras sedan med 25 för att få det slutliga heltalet som lagras i variabeln m. Typomvandling med (int) hugger av talets decimaler så att t.ex. (int)3.9 blir 3. En riktigare typomvandling får man genom att avrunda. Metoder för avrundning finns i klassen Math. Det är frivilligt att använda dem. Definiera metoden line Den tredje metoden vi behöver för koordinatsystembytet är line(). Det är en metod som ritar linjer i det nya koordinatsystemet. Vi ska kunna begära att få en linje ritad t.ex. från punkten (0, 0) till punkten (0.17, 3.14). Metoden line() har inte något returvärde. Detta markerar man i definitionen genom att ange»typen» void för resultatet och att utelämna return-satsen. En 14

annan skillnad mot de tidigare metoderna vi skrivit är att vi måste ha mer än en parameter. Metoden line() ska rita en linje mellan punkterna (x1,y1) och (x2,y2). Ritandet kan bara utföras av metoden drawline() som finns i klassen Graphics. Metoden line() måste därför ha tillgång till ett Graphics - objekt som kan utföra ritandet. Närmare bestämt måste det vara det objekt som den aktuella appleten använder. Ett vanligt sätt att ge en metod tillgång till något är att bestämma att metoden skall ha detta något som parameter. Sedan får man vid anropet av metoden se till att rätt sak ges som parameter. Låt alltså line() ha en parameter av typen Graphics. Se till att metoden line() räknar ut vilka pixelvärden som doublevärdena x1, y1, x2, y2 motsvarar med hjälp av koordinatomvandlingsmetoderna och sedan använder drawline() för att rita linjen. Metoden line() bör ha fem parametrar: g x1 y1 x2 y2 line vilket i programform motsvaras av: void line( Graphics g, double x1, double y1, double x2, double y2 ) { satser som ritar linjen m.h.a. drawline, xtoxscreen och ytoyscreen } Metoden line() ska kunna anropas så här: line(page, 0, 0, 0.5, 2.0); och en linje ska då ritas från vårt nydefinierade origo till en punkt 0.5 enheter till höger och 2 enheter uppåt. Om skalfaktorn satts till 80 så betyder det 40 pixels åt höger och 160 pixels uppåt. Definiera metoden line. Börja testa Om ni inte redan gjort det så kopiera skelett-programmet för kurvritningen från följande fil. Listning av filen finns på nästa sida. /info/progk08/java/lab0/ritafunktion.java eller börja från början på en egen applet. Skriv in metoderna för koordinatomvandling samt linjeritning. Kompilera programmet. Rita koordinataxlar Nu är det dags att prova metoden line() genom att anropa den från paint()- metoden för att rita det nya koordinatsystemets axlar. Det är inte noga med att rita exakt till fönstrets kanter. 15

Funktion att rita Funktionen som ska ritas definieras lämpligen också som en metod med samma enkla struktur som xtoxscreen och ytoyscreen men där både parametern x och returvärdet har typen double. Rita funktionen Det som återstår nu är att se till att den vackra funktion ni har valt ritas upp. Det är lämpligt att rita funktionen som några hundra små streck. Enklast är nog att välja ett startvärde på x, ett steg dx i x-led och rita funktionen genom att repetera ritandet av streck mellan punkterna (x, f(x)) och (x+dx, f(x+dx)) för ökande värden på x. Repetera så länge x är mindre än något max-värde. Skelett till kurvritarappleten import java.applet.applet; import java.awt.*; public class RitaFunktion extends Applet { int XMAX = 800, YMAX = 800; int x0 = XMAX/2, y0=ymax/2; // (x0,y0) = origo i // pixelkoordinater double scale = 80; // skalfaktor, // 80 pixlar = 1 enhet. // Definiera metoderna xtoxscreen, ytoyscreen och line här // Här följer ett förslag på funktion att rita // Byt gärna mot någon annan double f (double x) { return 3*Math.sin(4*x)/(4*x); } // I init-metoden kan man initiera (sätta starttillståndet) i // appleten. Här väljer vi att sätta bakgrundsfärgen tillvit // Metoden anropas av Java-systemet när appleten startar public void init () { setbackground(color.white); } } // I paint-metoden bestäms hur det ska se ut på skärmen // när appleten körs public void paint (Graphics page) { // Här ska det stå satser som ser till att // koordinataxlar och funktionskurvan ritas upp } 16

Figur 3: Exempel på applet med uppritad funktion. Ni får naturligtvis gärna definiera en annan funktion att rita och då en annan skalning och placering av origo behövas. En körning av den färdiga appleten kan se ut som i figur 3). Att redovisa från andra labbtillfället 1 Ett fristående program med endast main()-metod som beräknar medelvärdet av n st tal samt skriver felmeddelande om n<0. 2 Ett fristående program med endast main()-metod som beräknar och skriver ut alla Fibonacci-tal som är mindre än något visst tal, max, somläsesin till programmet. 3 Applet som ritar upp koordinataxlar och en vacker funktion. Metoder för koordinattransformationer samt metod som ritar en linje i den nya koordinatsystemet ska finnas med. 17