Programmering Java Grunder
 9789175310206, 9175310201

Citation preview

Till denna bok medföljer ett antal övningsfiler som du laddar ner från vår webbplats www.docendo.se: 1. Starta webbläsaren, skriv www.docendo.se i adressfältet och tryck på Enter. 2. Skriv artikelnumret, 1249, i sökrutan och klicka på Sök. 3. Klicka på titeln Programmering A Java. 4. Klicka på filen 1249.zip högst upp på sidan. 5. Klicka på Spara, välj var du vill spara filen, exempelvis på skrivbordet, och klicka på Spara. 6. När filen har hämtats stänger du dialogrutan och avslutar webbläsaren. 7. Om du har valt att spara filen på skrivbordet visas den som en ikon med namnet 1249. Dubbelklicka på ikonen för att packa upp filerna till lämplig mapp på din hårddisk.

Copyright © Docendo AB Detta verk är skyddat av upphovsrättslagen. Kopiering, utöver lärares rätt att kopiera för undervisningsbruk enligt BONUS-avtal är förbjuden. BONUS-avtal tecknas mellan upphovsrättsorganisationer och huvudman för utbildningsanordnare, exempelvis kommuner/universitet. Våra böcker och tillhörande produkter är noggrant kontrollerade, men det är ändå möjligt att fel kan förekomma. Vi tar gärna emot förbättringsförslag. Produkt- och producentnamnen som används i boken är ägarens varumärken eller registrerade varumärken. ISBN: 978-91-7531-020-6 Artikelnummer: 1249E Författare: Jonas Byström Omslag: Iréne Friberg Bild på omslaget ©SuperStock

1

Allmänt om Java

I detta kapitel I detta kapitel kommer du att få veta lite om Java och dess historia. Du kommer också att få reda på lite om vad som kommer att krävas av dig för att bli en fullfjädrad programmerare. Dessutom blir det lite grunder i terminologin och information om hur programmering fungerar.

Historia Programmeringsspråket Java började utvecklas i början av 1990-talet och påminner till stor del om C++, men har till skillnad från C++ många inbyggda funktioner för att det ska vara lätt att köra på många olika typer av datorer. Java konstruerades för att lösa verkliga uppgifter och utvecklades som en biprodukt när man på Sun Microsystems byggde en handdator med bland annat inbyggt trådlöst nätverk. En handdator med Wi-Fi låter måhända inte så spännande idag, men det var avancerat på den tiden (när mobiltelefoner var rariteter som såg ut och vägde som tegelstenar). Ganska snart efter följde webbläsaren Netscape med inbyggt stöd för Java. Precis som C++ så är Java objektorienterat. Objektorienterat innebär att man som programmerare tänker i termer av vilka delar, objekt, som finns med i systemet man ska bygga. Icke objektorienterad programmering tenderar att fokusera mer på hur ett problem ska lösas. Därför är det lättare att ”tänka objektorienterat” och därmed skapa program med färre fel i. Det finns också andra fördelar med objektorientering, till exempel att det är lättare att återanvända objekt nästa gång man gör ett liknande system. Om man förstår C++ så förstår man även språket Java; skillnaderna är relativt små. Men Java är mycket mer än ett språk. Det innehåller också en stor basfunktionalitet: fönster, knappar och menyer för vanliga applikationer; generering av webbsidor och databaskopplingar för webbapplikationer, parallellisering för att utföra flera saker samtidigt, och så vidare.

5

1 Allmänt om Java

Hur fungerar det att programmera? Hårdvara och mjukvara Hårdvara och mjukvara talas det ofta om i databranschen, även kallade maskinvara och programvara. Vad är då detta? Helt enkelt kan man förklara det så att hårdvara är ”hårda saker”, det vill säga saker man kan ta på. Mjukvara är själva programmet, till exempel Windows och Word. Det går ju inte riktigt att ta på Windows eller Word, utan de liknar mer idéer eller funktioner för användaren. För programmeraren, å andra sidan, är ett program en uppsättning instruktioner som talar om för datorn hur den ska bete sig. Ett program kan också kallas en applikation; det är samma sak.

Fel i mjukvaran – avlusning Ibland när programmeraren gör ett fel så blir det märkbart för användaren i slutändan. Då talar man om en ”bugg”. En bugg kan leda till allt ifrån irriterande brister, till exempel att det plötsligt inte går att zooma i Word, till mer allvarliga fel som att hela Windows bryter ihop och visar en blå skärm med felinformation. När man letar efter ett fel med avsikten att ta bort det så kallas det för ”debugging” eller avlusning. Bugg kommer av engelskans bug, och det är som bekant engelska för insekt. Som kuriosa kan man nämna en lustig anekdot om hur det ordet kommit att används för programmeringsproblem. Det har att göra med att de första datorerna såg helt annorlunda ut än dagens. Då användes datorer som fyllde flera stora rum och som drog enorma mängder ström med sladdar och radiorör om vartannat. En dator då hade ungefärligen samma kapacitet som en vanlig, enkel digital termometer har idag. Ett vanligt fel som uppstod vid driften av dessa datorer var att kackerlackor och andra insekter nästlade sig in mellan strömförande ledningar. Samtidigt som de gjorde sig själva en otjänst och blev elektrifierade så lyckades de kortsluta en del av datorn, och programfel tillsköt. Därav bugg.

CPU En mycket central del i varje dators hårdvara är dess CPU som betyder Central Processing Unit, eller centralprocessor. Det är CPU:n som steg för steg utför alla instruktioner som programmeraren matat in för hand. Centralprocessorn innehåller logiska enheter för att kunna utföra addition, subtraktion, multiplikation med mera. Det finns också funktioner för datakopiering och jämförelser, till exempel större än, mindre än eller lika med, lika med, skilt från, et cetera.

6

1 Allmänt om Java

En CPU kan bara läsa och utföra ett särskilt sorts kodsystem. Detta kodsystem kallas maskinkod och varierar mellan olika märken och olika sorters CPU:er. Maskinkod är helt obegripligt för den oinvigde: till exempel betyder 1000101111000011 ”flytta data från b till a” för en Pentium-kompatibel CPU; fullkomligt meningslöst och obegripligt alltså. Det viktiga du behöver veta här är bara att maskinkod är en lista med instruktioner som CPU:n kan förstå.

Källkod För att slippa skriva ettor och nollor så skriver programmeraren ”källkod”, eller ”kod”, som sedan översätts till maskinkod. Källkoden är text i en helt vanlig textfil, men språket man använder har en avsevärt enklare grammatik än vad vi är vana vid. Även i dess mest avancerade form är den väldigt basal och mycket långt ifrån vanlig enkel svenska eller engelska. Java översätts till en slags maskinkod som inte går att köra direkt på din dator, utan i stället emuleras en ”Java-CPU” som kallas Java Virtual Machine eller JavaVM. Detaljerna är inte så väsentliga här, utan det viktiga är att Java har ett ”extra lager” mellan ditt program och datorn, så att ditt program körs i en slags ”sandlåda”. Om programmet ställer till med oreda i sin sandlåda så gör det ingenting, det är bara att starta om med en ny och fräsch sandlåda igen. Det kostar visserligen lite prestanda, men betalar sig i termer av robusthet och säkerhet. Källkoden skriver man in ungefär som vanlig text i en ordbehandlare: rad för rad, i små stycken eller satser. Ett komplett program kan innehålla allt ifrån 10 rader till miljontals rader. En programsats motsvarar ungefär ”en mening” i vanlig skrift. En sats är helt enkelt en grupp med ord som kompilatorn kan förstå.

Nyckelord Specifika ord som används i ett språk kallas nyckelord. Dessa ord är i Java på engelska och är ofta koncisa. Några exempel: if, while, switch och case. I andra programmeringsspråk används andra nyckelord.

Kompilering För att kunna köra programmet så måste man ”översätta” källkoden till maskinkod som CPU:n kan förstå. Den här översättningen från källkod till maskinkod kallas kompilering. Programmet som kompilerar heter kompilator. Ofta används nuförtiden ett integrerande verktyg för att skriva in källkod, kompilera och avlusa. Förr användes ofta ett vanligt textredigeringsverktyg för källkoden och en kompilator som man startade från kommandotolken; om man vill vara lite retro så kan man fortfarande göra på detta vis. Den här kursen kommer att gå in mer djuplodande på ett integrerat verktyg av Sun: NetBeans.

7

1 Allmänt om Java

Kompileringen sker egentligen i två steg: kompilering och länkning. Det beror på att man oftast har flera källkodsfiler som man vill slå ihop till ett enda program. Till exempel kanske man har en källkodsfil för att rita ut 3D-objekt och en annan för TCP/IP-kommunikation. Källkod

Objektkod

Kompilering

Källkod

Exekverbar kod

Länkning

Objektkod

Verktyg Det finns massor av olika verktyg för att jobba integrerat med källkod, kompilering, avlusning, et cetera. Dessa verktyg brukar benämnas utvecklingsverktyg eller utvecklingsmiljöer, på engelska IDE = Integrated Development Environment. Här är några få av de vanligaste idag: • NetBeans • Eclipse • BlueJ • JCreator

Programmeringsspråk Det finns många olika programmeringsspråk; vissa riktar sig mer mot hårdvaran, så kallade lågnivåspråk, andra siktar på att vara enklare att producera och förstå, så kallade högnivåspråk. Varje språk har sin egen kompilator, dock finns det utvecklingsmiljöer som stödjer användning av flera programspråk samtidigt. NetBeans är ett sådant. Lågnivåspråk är ibland plattformsberoende, det vill säga de fungerar bara för en särskild sorts maskinkod och därmed bara en särskild sorts CPU. Lågnivåspråk kan i sällsynta fall vara det enda alternativet när man behöver specialanpassa en liten programsnutt till en specifik plattform. Oftast är dock så ej fallet. Programkod i ett lågnivåspråk är dessutom mer specialiserad och därigenom svårare att producera och förstå.

8

1 Allmänt om Java

Programmeringsspråk som riktar sig mot många plattformar, och har som mål att vara enklare att producera och förstå, kallas för högnivåspråk. Java är ett högnivåspråk.

Programexekvering När ett program exekveras (körs) så kan man tänka på det som att CPU:n läser och utför koden uppifrån och ner, från vänster till höger. Det hela fungerar lite som att läsa en instruktionsbok (till exempel med instruktioner för montering av en möbel).

Loopar Vissa instruktioner kan få CPU:n att ”hoppa” i koden, det vill säga fortsätta exekveringen på en annan position. Detta kan till exempel utnyttjas till att upprepa ett stycke av koden flera gånger fast med olika indata. Då är det vanliga att exekveringen börjar om ifrån början på satsen. Det kallar programmeraren för en loop eller en slinga. Ett vardagsexempel på en loop kan man ofta finna i visor. Verserna i en visa upprepar man inte men på refrängen händer det att man lägger en loop: helt enkelt läser och utför stycket flera gånger. Ett loop-exempel till kan vara att leta rätt på ett namn i en lista. Proceduren för att leta rätt på ett namn är detsamma för varje rad i listan med namnen; det är bara data (namnen) som varierar från en rad till annan.

Oftast kan man urskilja tre övergripande delar i ett mer avancerat program: startfasen, den interaktiva fasen och avslutningsfasen. Under den interaktiva fasen loopar ofta applikationen i väntan på indata från tangentbordet och musen. Ännu ett exempel på varför loopar behövs: se hur Windows fungerar! Om programkoden för Windows exekverades rakt igenom, allt på en gång, så skulle det ju avslutas direkt efter att ha startats – nu fungerar det inte så eftersom Windows har en interaktiv loop som väntar på indata från användaren.

Inspiration Så gott som alla programmeringsuppgifter kan man lösa med Java. Programmeringsspråket uppmuntrar till tydliga, objektorienterade lösningar som underlättar underhåll i framtiden. De allra flesta program som görs idag använder Java. Det gäller allt ifrån stora webbapplikationer till små mobilapplikationer, och till och med Blu-ray-formatet använder sig av Java för menyerna i början på filmen. Med Java kan du enkelt göra i princip vilken applikation du vill.

9

1 Allmänt om Java

Målet med din programmeringskurs måste vara att det ska bli roligt. Det är då man lär sig fortast, och det är då man blir riktigt, riktigt bra på det. Ett av delmålen med detta material är därför att göra det så roligt som det bara går. Försök själv att göra uppgifter och program i materialet så underhållande som möjligt för dig själv. På så sätt kommer du att få ut mesta möjliga av det. I slutet av kursen kommer du att göra en fraktalzoomare, det vill säga en applikation som ritar ut en synnerligen vacker och kaosartad matematisk funktion. Du kommer att få hjälp med hur du går vidare efter kursen och det medföljer fler roliga övningsexempel (public domain) som du kan använda och modifiera som du finner bäst.

Styrkan i Java Genomslagskraften i Java beror på många faktorer, men det är framförallt dessa: • Det är enkelt. • Det är objektorienterat. • Det är standardiserat och fungerar likadant på massor av olika plattformar: PC-datorer, mobiler, konsoller, Blu-ray-spelare, inbyggda system, och så vidare. • Enorm basfunktionalitet; man behöver inte återfinna hjulet och det är lätt att fokusera på vad man vill göra i stället för hur man ska gör det. • En grundläggande säkerhet och robusthet är inbyggt i språket, vilket gör Java särskilt lämpat för bank- och säkerhetsapplikationer. • Prestandan är relativt hög.

10

1 Allmänt om Java

Övningsuppgifter Övning 1.1

Under vilket decennium påbörjades utvecklingen av Java?

Övning 1.2

Vad är hårdvara och vad är mjukvara? Ge även exempel på var och en av dem.

Övning 1.3

Vad kallas ett programmeringsfel?

Övning 1.4

Vad heter den centrala exekverande enheten i datorn?

Övning 1.5

Vad heter den emulerade maskin (eller ”sandlåda”) som en Java-applikation körs i?

Övning 1.6

Vad kallas processen som omvandlar källkod i Java till instruktioner som Java-processorn kan förstå?

Övning 1.7

Man skiljer på två olika nivåer på programspråk. Den ena är specialanpassad till en viss sorts CPU, medan den andra är anpassad för att fungera med många plattformar och vara enklare att skriva och läsa. Vad kallas de två nivåerna?

Övning 1.8

Körs alltid programkoden sekventiellt, eller kan du som programmerare avgöra vilken del som körs härnäst?

11

2

Utvecklingsverktyget

I detta kapitel Här kommer grunderna för hur du arbetar med programmering i allmänhet och med utvecklingsverktyg för Java i synnerhet. Vi har valt utvecklingsverktyget NetBeans IDE 6.8 (NetBeans). Om du arbetar i ett annat program kan du ändå känna igen dig och göra övningarna. Bilder, exempel och instruktioner i detta kapitel visar NetBeans. Men alla övningar i boken är generella och kan göras med en annan version, och även med ett helt annat verktyg.

Utvecklingsverktyg NetBeans (eller något annat utvecklingsverktyg efter eget val) använder du för att skriva källkod i, kompilera den, köra programmen du skrivit och sist, men inte minst, för att avlusa programmen. Du får också veta lite om huvudmetoder och du kommer att få lära dig att skapa en enkel applikation och hur du öppnar ett befintligt projekt.

Säkerhetskopiera Börja med att kopiera övningsfilerna som medföljer materialet. Det bästa är om du hela tiden arbetar med lokala kopior. Lägg till exempel källkoden någonstans under Mina dokument. Om det är lämpligt för dig så skapar du också en ny mapp kallad Java A till vilken du kopierar övningsfilerna.

Arbetssätt När du programmerar så kommer du i mycket stor utsträckning att använda dig av tangentbordet. Det beror på att arbetsgången ser ut som den gör. När en programmerare jobbar brukar det se ut ungefär så här: man skriver korta kodsnuttar, kompilerar, rättar några fel, kompilerar, funderar ett par sekunder, lägger till ytterligare några rader och kompilerar igen. Det hade helt enkelt blivit för irriterande och långdraget om man var tvungen att använda musen i alla moment. Därför kommer du snabbt att lära dig de vanligaste kortkommandona. En trevlig detalj med de allra flesta Java-utvecklingsmiljöer är att de kompilerar källkoden under tiden du skriver och rödmarkerar fel, ungefär som din ordbehandlare rödmarkerar stavfel.

12

2 Utvecklingsverktyget

Starta programmet Du ska börja med att starta programmet (utvecklingsverktyget). 1. Klicka på Start-knappen, välj Alla Program, NetBeans, välj NetBeans IDE 6.8. När programmet startas för allra första gången kan det se annorlunda ut mot hur det ser ut då du startar det fortsättningsvis.

Ser programmet annorlunda ut kan du hoppa över nästföljande steg och gå direkt till avsnittet Arbetsytan. 2. Klicka på Stäng-knappen på startfliken.

13

2 Utvecklingsverktyget

Arbetsytan Du ser nu en tom arbetsyta:

Benämningar De vanligaste delarna du kommer att använda dig av är: • Textytan • Arbetsfältet • Navigeringsfältet • Utdatafältet • Verktygsfältet Verktygsfältet

Arbetsfältet

Navigeringsfältet

Textytan

Utdatafältet

14

2 Utvecklingsverktyget

Textytan Här kommer den faktiska texten i källkoden synas när du programmerar.

Arbetsfältet Ett projekt kan innehålla ett stort antal olika filer. Alla filer i ett projekt kommer att listas i Arbetsfältet. Om du har flera projekt öppna samtidigt, så hittar du samtliga i arbetsfältet.

Navigeringsfältet Detta fält dyker upp när ett projekt är valt. Häri får du överskådlig information om den aktiva källkodsfilen och du kan dubbelklicka på element för att direkt visa den delen av källkodsfilen, vilket är praktiskt när du arbetar med stora filer.

Utdatafältet Även Utdatafältet visas när ett projekt är öppet. I Utdatafältet visas textinformation till dig som användare. Här visas kompileringsinformation när du kompilerar och textutskrifter när du avlusar. Notera att detta endast syns när man har öppnat ett projekt och kört resultatet. När man kompilerar växlar NetBeans automatiskt till ”Build”-utskrifter och när man kör ett program så visas i stället information för avlusning. Build, eller att bygga, kallar NetBeans processen att kompilera och länka ett eller flera projekt till en körbar fil. Ett projekt kan ju innehålla flera individuella källkodsfiler.

Verktygsfältet På verktygsfältet hittar du knappar som du säkert känner igen till namnet: Save all files och Undo. Men det finns även knappar som du måhända inte har sett förut, som till exempel Debug Project.

Skapa en ny applikation Nu ska du skapa ditt första program. Det finns färdiga funktioner i NetBeans för att skapa ett tomt program som inte gör någonting. 1. Gå in under menyn File, New Project...

15

2 Utvecklingsverktyget

Nu visas en dialogruta, se nedan. 2. Välj Java i mitten (kategorikolumnen) och sedan Java Application till höger (projektkolumnen). Klicka på knappen Next. 3. Fältet Project Name är nu markerat; skriv Test1. 4. Klicka på knappen Finish. Projektet är skapat och klart. Källkodsfiler i Java har filtillägget .java. Nu har du även skapat projektfiler för NetBeans som håller reda på innehållet i dina projekt (de viktigaste ligger i katalogen nbproject och heter project.properties samt project.‌xml). I Textytan visas nu källkoden till ditt första program: Main.java.

16

2 Utvecklingsverktyget

• Alla rader med grå text är kommentarer (rader 1—4, 8—11, 14—16, 18). • Rad 6 anger vilket ”paket” källkoden befinner sig i. (Paketering av källkod är ett sätt att visa vilka delar som hör ihop.) Ignorera denna rad tills vidare. • På rad 12 står det vilken klass du jobbar i. Klassen har samma namn som filen det står i; i övrigt kan du ignorera även den här raden tills vidare. • På raderna 17 och 19 står själva programkoden. Alla ord i blått är nyckelord för Java. Det betyder att de är reserverade för en specifik tolkning av kompilatorn.

Huvudmetoden

Dessa färger är standard i NetBeans, men om du använder andra verktyg så kanske du har andra färger. Det går också att ändra inställningarna om du vill ha en annan färgsättning.

main Det är main som är huvudmetoden i en Java-applikation; det vill säga på den raden börjar exekveringen av ditt program. När sista raden i main exekverats så avslutas programmet. main har samma karakteristika som alla andra metoder: • En synlighet. • Noll, en eller flera modifierare. • En returtyp. • Ett namn. • Noll, en eller flera parametrar avskilda med kommatecken och omgärdade med parenteser. • Klammerparenteser som anger innehållet i metoden.

public static void main(String[] args)

Parameter

Returtyp

Synlighet Modifierare

Metodnamn

Du ska få allt detta förklarat grundligt för dig i senare kapitel. Tills vidare nöjer vi oss med att säga att all källkod som du skriver in i main (efter vänster klammerparentes men före höger klammerparentes) kommer att exekveras när du kör programmet.

17

2 Utvecklingsverktyget

När det kommer till vänsterklammerparentesens placering så gäller att den kan placeras hur som helst mellan högerparentesen (i main) och den första satsen.

Kompilera och kör Kommandot Kör Nu ska du testköra applikationen. 1. Gå in under menyn Run, välj Run Main Project (kortkommando F6). 2. Ditt program startas, men det avslutas lika fort, eftersom du inte ännu lagt till något innehåll.

Kompileringsfel Felaktig källkod ger upphov till kompileringsfel. Kompileringsfelen är lätta att upptäcka eftersom de gör att du inte kan kompilera och köra applikationen. De visas även med en röd understrykning i Textytan. Du ska nu testa att orsaka ett kompileringsfel. 1. Lägg till tecknet a i början på parametern String[] args så att det i stället står aString[] args.

Direkt dyker en röd understrykning upp under texten aString, och om du håller pekaren över så visas en inforuta med mer information.

Först i inforutan står felets typ, i detta fall att kompilatorn inte hittar en viss symbol. På andra raden står symbolens namn, det vill säga aString. På sista raden står var felet befinner sig (det är överflödig information i detta läget eftersom vi redan tydligt ser rödmarkeringen). 2. Korrigera felet genom att ta bort a:et så att det återigen står String[] args.

Snabbt om att stega i programmet För att ge dig en bild av hur programexekveringen ser ut, så ska du nu prova att stega igenom programmet. Med ”stega i programmet” menas att du exekverar programmet rad för rad. Varje ny rad körs när du trycker på ”stega-knappen”.

18

2 Utvecklingsverktyget

1. Tryck kortkommandot F7. Programmet laddas och exekveringen börjar på den första och sista raden i programmet (eftersom raden bara innehåller en rad). Sedan pausas exekveringen och NetBeans väntar på att du ska fortsätta exekveringen. Det ska se ut så här:

Den gröna pilen visar vilken rad exekveringen är på för tillfället. 2. Tryck F7 igen. Programmet exekveras färdigt (eftersom det inte finns någon fler kodrad i programmet) och avslutas därför; efteråt blir utdatafältet sig likt igen.

Stänga projekt 1. Stäng Test1.cpp. 2. Gå in under menyn File, välj Close Project (Test1).

Öppna ett projekt Du ska nu öppna ett färdigt projekt som följer med kursen och titta lite på källkoden däri. 1. Välj File, Open Project... 2. Bläddra till den plats där projektfilerna som medföljer kursen finns. Klicka på Telefonbok och klicka sedan på knappen Open Project.

19

2 Utvecklingsverktyget

Projektet Telefonbok har nu öppnats. 3. Visa (expandera) mappen Source Packages genom att klicka på krysset till vänster om Source Packages i arbetsfältet. 4. Expandera sedan paketet telefonbok genom att klicka på krysset till vänster om telefonbok i arbetsfältet. 5. Dubbelklicka på Telefonbok.java. Nu syns källkoden i Textytan.

6. Bläddra runt och kika lite på källkoden. Om du vill kan du också exekvera programmet.

Stäng ännu en gång Nu ska du avsluta även detta projekt. 1. Välj File, Close Project (Telefonbok).

Sammanfattning Du har nu lärt dig hur man skapar ett tomt program. Du vet hur man öppnar källkodsfilen och du vet var du ska skriva in din egen källkod. Körning av program har du också lärt dig, tillsammans med hur det fungerar med kompileringsfel, programstegning och lite allmän hantering av NetBeans.

20

2 Utvecklingsverktyget

Övningsuppgifter Övning 2.1

Vad är orsakerna till att du som programmerare kommer att använda mycket kortkommandon i stället för att arbeta med musen?

Övning 2.2

Vissa delar av källkoden får grå färg i NetBeans, vilka?

Övning 2.3

Vad betyder ord i källkoden med blå färg?

Övning 2.4

Vilket filtillägg används för källkodsfiler?

Övning 2.5

Vad heter huvudmetoden i ett program?

Övning 2.6

Genomför följande procedur: 1. Skapa en ny, enkel applikation och kalla den för MittTest1. 2. Använd kortkommandot för att exekvera. 3. Öppna källkodsfilen. 4. Exekvera igen. 5. Avsluta NetBeans (File, Exit).

21

3

Skriva egen programkod

I detta kapitel Nu ska du lära dig grunderna i Java och de absolut mest fundamentala nyckelorden och begreppen. Dessutom kommer du att skriva några små program.

Kommentarer En bra programmerare lägger hela tiden små förklaringar till vad han eller hon gör i programkoden. Som du snart ska se är kommentarer användbara; inte bara för att få förklaring av vad som sker, utan även när du vill minnas vad din programkod gör. Annars är det vanligt att man går tillbaka och tittar på några månader gammal programkod som man skrivit och inser att man inte förstår någonting. Kommentarer kan skrivas på två sätt: enkelrads- eller flerradskommentarer. Det vanligaste är kommentarer på en rad. Symbolen för en enkelradskommentar är två snedstreck i direkt följd, utan mellanslag. // Detta är en kommentar. // Här är en till! // Alla enkelradskommentarer börjar vid // snedstrecken och slutar när det är slut på // texten på den raden.

En flerradskommentar börjar med ett snedstreck och en asterisk och avslutas med en asterisk och ett snedstreck – i den ordningen. /* Detta är en flerradskommentar. Här kan du skriva hur många rader som helst innan du avslutar kommentaren. */

Ofta ser man i java ”dokumentations-kommentarer”. Kompilatorn behandlar dem precis som en vanlig kommentar, men de kan användas för att automatiskt skapa dokumentation. Såhär kan en sådan kommentar se ut (notera att den börjar med ett snedstreck och dubbla asterisker): /** * @param text * @param id * @return */

the text to be stored in the DB the id to be stored in the DB true if stored, false if failed

22

3 Skriva egen programkod

Slut på satsen Varje gång man skrivit en programsats så måste man informera Java-kompilatorn om det så att den inte blandar ihop kodsnuttar som inte har med varandra att göra. Man markerar slut på satsen med ett semikolon.

Data och algoritmer I programmeringens värld skiljer man på data och algoritmer. Data är det man bearbetar, informationen, och algoritmerna är det som utför bearbetningen. Den källkod som du kommer att skriva kommer att bilda binärkod som beskriver algoritmerna för maskinen, men också reservera utrymme i minnet för data. Senare i materialet finns ett kapitel om just detta, men för stunden nöjer vi oss med att säga att data är utrymme som reserveras för att kunna lagra information.

Variabler Variabler är det samma som data. Det finns olika typer av variabler för olika ändamål. För att kunna använda en variabel så måste man först ”deklarera” den. Det innebär att man ger den ett namn och talar om vilken sorts variabel det är.

Heltal Med heltal kan man göra enkla, diskreta beräkningar. För att deklarera en heltalsvariabel med namnet x så skriver man så här:

Med diskret beräkning (matematik) menas matematik där objekt av uppräkneliga mängder används, till exempel heltal. I begreppet diskret matematik ingår bland andra talteori och algoritmik, som båda tillämpas inom datorvetenskapen.

int x;

Heltal heter integer på engelska, därav ”int”. Semikolonet avslutar satsen. När du deklarerar en variabel på detta vis, så avsätter du alltså en liten, liten del av minnet för att kunna lagra ett heltal i.

int x; Variabeltyp

Variabelnamn

Ett variabelnamn kan i teorin vara hur långt som helst, men det finns några begränsningar: • Namnet får inte börja på en siffra. • Variabeln får inte ha samma namn som något nyckelord. • Namnet får inte innehålla något slags skiljetecken, men understrykningstecknet går bra.

23

3 Skriva egen programkod

I Java går det utmärkt att använda internationella tecken, till exempel å, ä och ö för variabelnamn. Några exempel på acceptabla heltalsdeklarationer är: int int int int

H2O; iint; intt; Hej_På_Dig;

Synlighet I vissa fall när du deklarerar en variabel kan du ange dess ”synlighet”. Nyckelorden public, protected och private reglerar en variabels synlighet; alltså vilka delar av koden som kan läsa från och skriva till den. Nyckelordet public rekommenderas inte eftersom det gör variabeln åtkomlig för hela programmet. Använd i stället nyckelordet private så ofta du kan (och när det är praktiskt). Synlighetsnivån protected har mer med objektorientering att göra, vi kommer till det senare. Du kan bara ange variabelns synlighet när den deklareras inuti en klass, aldrig i en metod. Således går det inte att ange synlighet på variabler i metoden main. En variabel som ligger i en klass kallas antingen för klassvariabel (om den deklarerats med modifieraren static) eller medlemsvariabel. Vi återkommer även om detta i senare kapitel.

Enkel matte För att ge en variabel ett värde så måste man göra en tilldelning. Det kan se ut så här med två kommentarer: // Först deklarerar vi heltalsvariabeln x. int x; // Sedan tilldelar vi den värdet 5000. x=5000;

En tilldelning använder sig alltså av ett likamedtecken. Likamedtecknet kallas i detta fall för en operator, eftersom den utför en tilldelningsoperation på variabeln. Variabeln som är på vänstra sidan om likamedtecknet ges värdet av det som står på högra sidan. Det finns flera olika operatorer. Addition använder ett vanligt plustecken. Ett exempel på en tilldelning med addition är följande: int x; x=4; x=x+5;

// Här deklareras x. // x får värdet 4. // x tilldelas värdet x+5.

24

3 Skriva egen programkod

Vad tror du att x får för värde efter att exekveringen passerat tredje raden? Om du tror att värdet blir 9 så har du alldeles rätt!

På andra raden får x värdet 4. På sista raden står det i vänstra ledet då egentligen 4+5. 4+5 tilldelas x, alltså blir x lika med 9.

Vid en deklaration av ett heltal exekveras ingen programkod, utan då sker bara en reservation av datautrymme för heltalet. Vid tilldelning eller addition skapas maskinkod för att utföra operationerna, men inget datautrymme reserveras. Om du vill kan du deklarera en variabel och tilldela den ett värde på samma gång: int x=710;

Blanksteg Mellan de olika uttrycken i Java är det helt okej att lägga in blanksteg. För en kompilator i Java räknas både mellanslag och tryck på Enter som blanksteg. // Sats ett: x=4534; // Sats två: x = 4534 ;

Sats ett och två ger alltså exakt samma resultat. Detta gäller alla typer av uttryck. Som parentes kan nämnas att det till och med finns tävlingar som går ut på att skriva fungerande programkod som är fullkomligt obegriplig. Vissa deltagare skriver sin kod så att den formar bilder av djur, maskiner, symboler och så vidare. Du kan själv pröva det lite längre fram.

Skriftlägeskänslig Språket Java är skriftlägeskänsligt, det vill säga det gör åtskillnad på gemener och versaler. INT HEJ;

är alltså något helt annat än int hej;

25

3 Skriva egen programkod

Skriva ut avlusningsinformation Nu ska du lära dig att presentera debug-information. Såhär kan en kodsnutt se ut som skriver ut någonting: int x; x=-13000; System.out.print(x);

// Deklarera x. // Ge x värdet -13000. // Skriv ut värdet på x.

System.out.print print är en metod i objektet System.out. Du har alltid tillgång till System.out.print överallt i din kod.

I NetBeans kommer dina utskrifter att visas i Utdatafältet under fliken Output.

Gör-det-själv Nu ska du göra en enkel applikation (det vill säga ett program) där du får prova på att använda dig av de fyra räknesätten och skriva ut resultaten vid addition, subtraktion, multiplikation och division. 1. Starta NetBeans. 2. Skapa en enkel Java-applikation, låt projektet få namnet Matte. 3. Öppna Matte.cpp. I textytan bör du nu se följande källkod. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* * To change this template, choose Tools... * and open the template in the editor. */ package matte; /** * * @author User */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { // TODO code application logic here } }

26

3 Skriva egen programkod

4. Gå till rad 18 och ersätt kommentaren (alltså hela raden) med: System.out.print(11+51);

Nu ska det se ut som följer: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21

/* * To change this template, choose Tools... * and open the template in the editor. */ package matte; /** * * @author User */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) { System.out.print(11+51); } }

Det gör ofta ingenting om du råkar lägga in extra radmatningar eller blanksteg när du skriver in din källkod; det mesta tolereras faktiskt. 5. Kör Matte med kortkommandot Ctrl+F5. Programmet körs och debug-utskriften visas i utdatafältet.

6. Verifiera att 11+51 blev 62. Som du ser så blev det ingen radmatning efter att resultatet skrevs ut. Det fixar vi enkelt. 7. Byt ut print mot println (som i ”print line”): System.out.println(11+51);

8. Kör igen.

27

3 Skriva egen programkod

Nu står resultatet på en egen rad.

9. Byt ut plustecknet mot ett minustecken. Kompilera och kör. Verifiera resultatet. 10. Ersätt println-satsen med: int x=193; int y=-24; System.out.println(x+y); System.out.println(y-x);

Det ska då se ut så här:

11. Testa att det funkar att köra och att svaret blir:

I exemplet ovan skrevs inte x+y och y-x ut, utan i stället värdet av x adderat med värdet av y och värdet av y subtraherat av värdet av x.

12. Byt ut x+y mot x/y och y-x mot y*x. Ett snedstreck betyder ”delat med” och en asterisk betyder ”multiplicerat med”. Kolla att svaret stämmer. Notera att vid division med heltal försvinner decimaldelen. Därför blir 193 delat med -24 lika med -8 i stället för -8,041666... 13. Stäng Main.java. 14. Stäng hela projektet med File, Close Project (Matte).

28

3 Skriva egen programkod

Övningsuppgifter Övning 3.1

Hur skriver man en enkelradskommentar med texten Olje-

rigg?

Övning 3.2

Hur skriver man en flerradskommentar med texten Gråsugga?

Övning 3.3

Vilket tecken markerar slutet på en sats?

Övning 3.4

Vad heter nyckelordet som används när man deklarerar ett heltal?

Övning 3.5

Vilken synlighet rekommenderas för klass- och medlemsvariabler?

Övning 3.6

Vilket tecken har tilldelningsoperatorn?

Övning 3.7

Addition och subtraktion använder tecknet + respektive tecknet –. Men vad har multiplikationsoperatorn respektive divisionsoperatorn för tecken?

Övning 3.8

Hur skriver man för att deklarera en heltalsvariabel x och tilldela den värdet 17?

Övning 3.9

Ge ett exempel på programkod som bara reserverar datautrymme och som inte genererar någon binärkod.

Övning 3.10

Ge ett exempel på programkod som bara genererar binärkod och som inte reserverar något datautrymme. (Anta att en heltalsvariabel x redan är deklarerad.)

Övning 3.11

Skapa ett nytt projekt vid namn Heltalstest. Skriv källkoden enligt följande: 1. Med tre heltalsvariabler x, y och z.

2. Där x och y tilldelas valfria värden.

3. Sedan tilldelas z värdet av x plus y. 4. Skriv ut värdet av z. 5. Testkör. 6. Bolla lite med ursprungsvärdena på variablerna och testa de fyra olika räknesätten. Se om du själv kan komma på någon modifikation till programmet.

29

4

Flödesscheman och pseudokod

I detta kapitel Pseudokod och flödesscheman är två mycket användbara hjälpmedel för att omsätta idéer till programkod. De används av alla programmerare eftersom det är ett mycket trevligare och enklare sätt att tänka än att behöva föreställa sig all källkod direkt. Programexekveringen kan också kallas programflöde. Det är alltså helt enkelt vägen som maskinen går genom koden när den exekveras. Nu ska du lära dig att använda flödesscheman och pseudokod; detta kommer att utgöra grunden för alla dina framtida programmeringskunskaper. Dessa kunskaper är inte bara användbara inom Java-programmering, utan i all typ av problemlösning.

Vad är flödesscheman och pseudokod? Flödesscheman eller flödesdiagram är rutor och pilar som beskriver programflödet på ett sätt som är lättförståeligt för en mänsklig läsare. I rutorna står helt vanlig text med tilldelningar, addition, subtraktion och så vidare. Det brukar även finnas rutor med frågor i och beroende på vad svaret blir så flyttas exekveringen i flödesschemat. Pseudokod fungerar på samma sätt som flödesscheman, men innehåller bara text och inga rutor och pilar. En algoritm är ett antal instruktioner som används för att lösa ett problem. Både pseudokod och flödesscheman kan användas för att beskriva algoritmer.

Vad är syftet med flödesscheman och pseudokod? Ett vanligt fel bland programmerare är att försöka göra ett större program utan att tänka igenom det ordentligt först. Det resulterar ofta i enorma omarbetningar av programkoden. Inte sällan blir det så krävande att man tröttnar eller så dyrt att hela projektet läggs ner. Pseudokod och flödesscheman kan helt enkelt hjälpa dig att ta bort onödiga tankefel vid det initiala skedet av programutvecklingen.

30

4 Flödesscheman och pseudokod

Flödesscheman Ett matnyttigt flödesschema: Start

Nej

Är du hungrig? Ja Ät

Börja i rutan med texten Start, följ sedan pilarna. Alla rutor som ”står upp” är processrutor, det vill säga där utförs någonting. De ”vinklade rutorna” är beslutsrutor och där ställs en fråga. Beroende på svaret så väljer du sedan väg. Om du svarar ”Ja” på frågan om du är hungrig så väljer du pilen neråt. Om du svarar ”Nej” så väljer du pilen som går tillbaka till start.

Bygga på flödesschemat Här kommer ett exempel på en utökning av föregående flödesschema: Start

Nej

Är du hungrig? Ja

Gå och handla!

Nej

Finns det någon mat i kylen? Ja Ät

31

4 Flödesscheman och pseudokod

Pseudokod Matnyttig pseudokod Pseudokoden för föregående flödesschema kan se ut så här: [Start] Hoppa till [Magsäckskontroll]! [Magsäckskontroll] Är du hungrig? Om ”Ja” hoppa till [Kolla_kylen]! Om ”Nej” hoppa till [Start]! [Kolla_kylen] Finns det någon mat i kylen? Om ”Ja” hoppa till [Käka]! Om ”Nej” hoppa till [Handla]! [Handla] Gå och handla! Hoppa till [Käka]! [Käka] Ät! Hoppa till [Start]!

Här har använts en mycket hög nivå på beskrivningen. Till exempel förklaras inte hur man äter, hur man handlar eller ens hur man kollar om det finns mat i kylen. Pseudokod kommer att användas senare i Att implementera kallas steget när promaterialet för att beskriva vilka metoder du grammeraren omsätter pseudokod och ska implementera i Java. Att förstå och kunna flödesscheman till källkod. skriva logisk pseudokod kommer att bli det svåraste steget när du lär dig programmering – själva översättningen från pseudokod till Java är enkel. Ta ordentligt med tid för att göra och förstå uppgifterna i detta kapitel. Observera att du aldrig ska skriva in pseudokod direkt i utvecklingsmiljön, först måste du skriva om pseudokoden till Java, som kompilatorn kan förstå.

Övningsuppgifter Övning 4.1

Försök att rita ett flödesschema med processrutorna ”Start” och ”Sov!” och beslutsrutan ”Är du sömnig?”.

Övning 4.2

Lägg till parametrarna ”Ligger du i sängen?”, ”Lägg dig!” och ”Stig upp!” till flödesschemat i uppgift 4.1.

Övning 4.3

Översätt flödesschemat i uppgift 4.2 till pseudokod.

Övning 4.4

Skriv pseudokod för ett helt eget scenario. Teman kan vara husdjur, cykling, skolan, jobbet, Stålmannen, tv-spel, PROmöten eller något annat som intresserar dig. 32

5

Göra några enkla program

I detta kapitel Du kommer nu att få pröva att göra program med loopar och interaktivitet.

Du skriver ett komplett program Ett program kan knappast kallas komplett förrän det bearbetar någon form av indata. Men först ska du börja med att göra följande enkla program: x = -3

Är x < 43?

Ja

x = x+1

Nej

Jämförande uttryck Att kunna jämföra två variabler kommer strax att visa sig mycket användbart. Ett exempel: x>>

< >= instanceof == != & ^

2 4 5 6 7 8 9

|

10

||

12

&& ?:

= += -= *= /= %= &= ^= |= = >>=

11 13 14

Notera att operatorerna + och – med prioritet 2 inte är addition och subtraktion, utan tecken för positivt och negativt tal. Som du ser finns inte bara ++ för att öka värdet på ett heltal, utan även operatorn –– för att minska det. 63

6 Mer om datatyper

Prioritet Ett exempel för att klargöra prioriteten: int svar = 3 + 6 * 7 - 1;

Här utförs multiplikationen först, eftersom den har högst prioritet. Sedan utförs additionen (den är längst till vänster), sedan subtraktionen och sist tilldelningen. Hade minustecknet bytt plats med plustecknet i exemplet hade subtraktionen utförts före additionen. Variabeln svar tilldelas värdet 44. Om du vill kan du ändra på prioritetsordningen med parenteser: int svar = 3 + 6 * (7 - 1);

Subtraktionen utförs först, sedan multiplikationen och sist additionen. Variabeln svar blir 39.

Division När du dividerar ett heltal med ett annat så försvinner decimaldelen. Den avrundas inte utan trunkeras (klipps av) helt enkelt. Därför blir 9/7=1. Resten, 2, kan du få tag på med modulusoperatorn (se nästkommande avsnitt). Division med noll är ett programfel, eftersom resultatet är odefinierat. Detta försöker man undvika genom att se till att nämnaren aldrig blir noll, eller att helt enkelt låta bli att dividera om nämnaren är noll och i stället skriva ut ett felmeddelande.

Modulus Modulusoperatorn, %, har du kanske inte sett förut. Det är en operator som returnerar resten vid division. Som du minns skriver följande ut ett heltal: System.out.println(7/3);

Vilket? Jo 2! Resten från divisionen, 1, försvinner. Här skrivs resten, 5, i divisionen 23/6 ut: System.out.println(23%6);

Du ska nu göra ett intressant program med multiplikation, division, modulus och parenteser. 1. Skapa en enkel Java-applikation. Kalla programmet FortyYears.

64

6 Mer om datatyper

2. Skriv in koden: long milli_seconds = System.currentTimeMillis(); long seconds = milli_seconds/1000; long hours = seconds/(60*60); long minutes = seconds/60%60; System.out.println(”It has been ”+hours+” hours”+ ” and ”+minutes+” minutes since the 60ies!”);

Detta program skriver ut hur länge det är sedan 1960-talet. Satsen System.‌currentTimeMillis() är ett metodsanrop som returnerar antalet millisekunder sedan nyår 1970. Hela källkoden till FortyYears:

Omvandling mellan datatyper Ibland är det användbart att kunna omvandla ett flyttal till ett heltal eller ett stort heltal till ett litet heltal. Kompilatorn tillåter inte dessa konverteringar utan vidare, utan ger ett felmeddelande för att det är risk för dataförluster. Exempel: double i = 0; byte s = i;

Ovanstående kod ger följande fel i NetBeans: possible loss of precision Detta betyder att eftersom double kan innehålla så mycket större och mindre tal än en byte så är det risk att noggrannheten försvinner och att talet trunkeras. Det löser man med en typkonvertering: double i = 0; byte s = (byte)i;

Här säger man uttryckligen ”jag vill konvertera till en byte”, och då passerar det kompilatorn utan varningar. 65

6 Mer om datatyper

Övningsuppgifter Övning 6.1

Nämn minst två, gärna fyra, olika talsystem.

Övning 6.2

Vad är baserna i det decimala respektive det binära talsystemet?

Övning 6.3

Hur många siffror behövs för att representera noll och ett i det binära talsystemet?

Övning 6.4

Vad kallas en siffra i ett binärt tal?

Övning 6.5

Hur många siffror behövs för att skriva noll, ett, två och tre decimalt med binära siffror?

Övning 6.6

Konvertera 34 decimalt till binär form.

Övning 6.7

Konvertera 10001000 binärt till decimal form.

Övning 6.8

Vad kallas en bitföljd med åtta bitar?

Övning 6.9

Hur många bitar är det i ett heltal?

Övning 6.10

Hur många bitar går det på en byte?

Övning 6.11

Hur lång är en short, räknat i bytes?

Övning 6.12

Antalet bitar som ryms i en long?

Övning 6.13

Hur stora är prefixen kilo och mega i datorsammanhang?

Övning 6.14

Skriv talet -110 med ett åtta bitars binärt tal.

Övning 6.15

Nämn två flyttalstyper.

Övning 6.16

Det finns en typ som är namngiven efter George Boole. En variabel av den typen kan bara anta två värden. Vad heter typen och vilka värden kan den anta?

Övning 6.17

Hur skriver du för att deklarera en array tax med 57 st. 32-bitars heltalselement i?

Övning 6.18

Hur skriver du för att deklarera en array sugga med 833 st. 8-bitars heltalselement i?

Övning 6.19

Hur indexerar du det fjärde elementet i en array sparv?

Övning 6.20

Deklarera en double-array med valfritt namn med fyra värden: 3, 4, 17 och -2.0.

66

6 Mer om datatyper

Övning 6.21

Beskriv skillnader och likheter mellan en char-array och en sträng.

Övning 6.22

Varje enskild bokstav i en ASCII-sträng är en bitföljd av konstant längd. Hur många bitar är det per bokstav, vad kallas ett ord med det antalet bitar och vad heter datatypen som representerar det ordet?

Övning 6.23

Vilken symbol sätter man före och efter ett tecken för att tala om för kompilatorn att tecknet ska tolkas som en bokstav? Ge ett exempel.

Övning 6.24

Vad är det för skillnad på en referens och en adress?

Övning 6.25

Deklarera en referens till ett (eller flera) 32-bitars heltal.

Övning 6.26

Vad är det för skillnader på att skicka ett atomärt objekt som parameter till en metod och att skicka en referens?

Övning 6.27

Vilken av operatorerna + eller / har högst prioritet?

Övning 6.28

Hur skriver man, med minsta möjliga antal tecken, för att minska en int i med ett?

Övning 6.29

Vad är det enklaste sättet att öka en double d med 3.14?

Övning 6.30

Hur ser modulusoperatorn ut och vad gör den?

Övning 6.31

Typkonvertera en double till en short.

Övning 6.32

Skriv ett program som skriver ut dagar, timmar, minuter, sekunder, tiondelar, hundradelar och tusendelar sedan nyår 1970.

67

7

Metoder

I detta kapitel När du har gått igenom detta kapitel så kan du de mest essentiella delarna i Java. Du kommer att finna att metoder är en av de mest kraftfulla hjälpmedlen för att skriva lättläst och strukturerad kod.

Ett bekant exempel Metoden main känner du igen vid det här laget. Den har ett returvärde och två parametrar; synligheten public betyder att den kan anropas från vilken del av koden som helst. Nyckelordet static förklaras i slutet av kapitlet. public static void main(String[] args)

Synlighet

Parameter

Returtyp Modifierare

Metodnamn

Returvärden används till att returnera ett svar. Parametrarna används för att skicka in data till metoden. En metod behöver varken returnera något värde eller ta några parametrar. Om man vill exekvera en metod så säger man att man anropar metoden. Ett anrop till metoden main kan se ut så här: String[] ord = {”Hej”, ”du!”}; main(ord); // Här sker anropet.

Om du vill ta hand om ett returvärde och lagra det i en variabel så skriver du något åt det här hållet: int svar; svar = minMetod(a, b);

Vad som sker i minMetod behöver du inte ta hänsyn till vid anropet; metoden kan ses som en svart låda. Parametrarna stoppas in i den svarta lådan, någonting utförs och returvärdet kommer ut.

68

7 Metoder

Pseudokoden för när JavaVM laddar ett program bör se ut ungefär så här: 1. Ladda programmet. 2. Kör main. 3. Avsluta programmet och frigör resurser.

Källkoden kan se ut ungefär som i följande exempel.

loadProgram(); main(args); cleanUp();

main int x = ...; Calculate(x);

När main jobbat färdigt så returnerar den och då fortsätter exekveringen på nästa rad, i detta fallet med metodsanropet cleanUp.

Varför metoder? Vad används metoder till? Den mest grundläggande orsaken är att det skulle vara oöverblickbart att skriva ett jättestort program i ett enda stycke. När man skriver stora applikationer på hundratusentals rader så måste man dela upp källkoden i olika moduler för att överhuvudtaget kunna hitta det man söker. En metod bör alltså inte vara för lång. För händelser som sker identiskt och många gånger i ett program vill du förstås inte skriva likadan källkod om och om igen! Då lägger du i stället algoritmen i en metod och anropar den varje gång du behöver utföra just den algoritmen. Precis som main anropas i ditt program varje gång du startar det. En annan viktig orsak till att inte ha flera olika kopior på samma källkod i ditt program är att när du hittar en bugg på ett ställe, så behöver du inte leta för att se om exakt samma kod/bugg finns på flera ställen.

Fler metoder Anrop Sammanfattningsvis kan följande sägas om anrop. När du anropar en metod från en godtycklig rad x så kommer exekveringen att hoppa till den metoden. När metoden returnerar kommer exekveringen att fortsätta på raden x+1.

69

7 Metoder

Returvärden Metoder som returnerar ett värde använder alltså return-satsen för att göra det. Det finns även metoder som inte returnerar något värde. De deklareras med nyckelordet void: void Enmetod();

Du ska strax skriva ett program för att kontrollera hur lång sträcka ett objekt hinner falla i vakuum på en given tid. Formeln ser ut så här:

gt2 y=– 2 Där y är höjden i meter mätt från där fallet startar. Gravitationskonstanten, g, ligger på ungefär 9,82 m/s2 här i Sverige. Tiden, t, mäts i sekunder. Som du ser kommer höjden att anta ett negativt värde; det beror på att de flesta saker tenderar faller neråt i vakuum. Du ska skriva en metod som får tiden som inparameter, räknar ut och returnerar höjden. 1. Skapa en Java-applikation, kalla den för FreeFall. 2. Skriv in följande källkod: public static void main(String[] args) { Sdb.createConsole(); System.out.println(”Free falling object”+ ” calculation in vacuum.”); System.out.println(”Enter the time in”+ ” seconds: ”); double time = Sdb.in.nextDouble(); double distance = freeFall(time); System.out.println(”The object fell ”+ distance+” meters in ”+time+” seconds.”); } public static double freeFall(double t) { double g = 9.82; double d = -((g*(t*t))/2); return d; }

Här är det metoden freeFall som gör höjdberäkningen.

70

7 Metoder

3. Kör applikationen. Utdata visas i bilden till höger: I uträkningen i metoden freeFall står många parenteser. Notera

att du lika gärna skulle kunna skriva –g*t*t/2. Anledningen är att operatorordningen inte är relevant i detta fall. Notera också att flyttalsvariabeln distance deklareras och tilldelas returvärdet ifrån freeFall på samma rad. Om du vill kan du lika gärna skriva: double distance; distance = freeFall(time);

Parametrar Se på källkoden i exemplet FreeFall. Vid anropet till metoden freeFall så heter parametern time, men i metodshuvudet för freeFall kallas den för t. Hur fungerar nu detta? Jo, när en metod anropas så skapas alla variabler i metodshuvudet och deras värden kopieras från parametervariablerna. Vid anropet till freeFall skapas alltså variabeln t och den tilldelas värdet som finns lagrat i fime. När freeFall returnerar tas t bort.

Returnera flera värden via referenser Vad händer när du vill returnera två värden eller ännu fler? En metod klarar ju bara ett returvärde. Det löser du med parametrarna. Skicka en referens som parameter så kan du ändra innehållet i variabeln som den adresserar, och därmed finns värdet tillgängligt när metoden returnerar. private static void dummy(int[] change_me) { change_me[0] = 77; } public static void main(String[] args) { int[] value = new int[1]; dummy(value); }

I main skapas en array med ett heltal i, value, sedan skickas array-referensen som parameter till metoden dummy. Vid anropet till dummy skapas en ny referens vid namn change_me. Första elementet i referensen change_me får samma värde som parametern, det vill säga adressen till value. Sedan skrivs värdet 77 till det första elementet som change_me innehåller. När dummy returnerar tas change_me bort, men värdet i value är redan ändrat!

71

7 Metoder

Att ”returnera” värden via en referens fungerar såklart på exakt samma sätt, oavsett hur många värden du returnerar.

Kort om klasser, objekt och instanser Klasser och instanser är kärnan i objektorienteringen. En klass är två saker: dels är det en container för kod och data som hör ihop, dels är det en mall. Alla metoder och alla variabler som finns i en klass kallas för medlemmar. Metoder och data som har modifieraren static hör till containern, och kallas klassmetoder respektive klassvariabler. Varje klassvariabel kan det bara finnas en enda av i hela programmet. Ett objekt och en instans är två ord för exakt samma sak i Java (och flera andra objektorienterade språk). En instans skapas genom att man instansierar en klass, och då får man med alla medlemmar som hör till klassens mall; alla medlemmar som inte har modifieraren static. Alla instansvariabler finns det alltså en kopia av per instans. Det verkar kanske krångligt, men ett exempel torde klargöra: public class Dinosaur { private int teethCount; private int hornCount; private float weight; }

private static int dinosaurCount;

Antal tänder, antal horn och vikten hör till instansen. Det betyder alltså att alla dinosaurier som skapas har unika möjligheter att tappa och få nya tänder och horn samt växa och banta. Det totala antalet dinosaurier kontrolleras av hur många som föds och dör, och det är en klassvariabel. Det totala antalet dinosaurier är inte unikt för varje enskild dinosaurie på det sätt som antal tänder är.

Inkapsling Det finurligaste med objektorientering är att man enkelt kan kapsla in information så att den som anropar inte behöver bekymra sig så mycket om vad som händer under skalet. På samma gång blir det också lättare att förändra och förbättra funktionalitet utan att man ändrar anropen till metoder. Därför ska man försöka att exponera så få variabler som möjligt i klasser och instanser; de ska vara private (eller protected).

72

7 Metoder

I stället ska man låta metoder vara public, så att det är upp till klassen vad den har för data och hur den opererar på sin data. Säg att du behöver information om tio personer. Ett riktigt dåligt sätt att göra det är således: public class TenPersons { public int ages = new int[10]; public float heights = new float[10]; public String names = new String[10]; ... }

Betydligt bättre är: public class Person { public int getAge(); public float getHeight(); public String getName(); ... } Person[] persons = new Person[10];

Om du i en klass däremot har interna klasser (man kan ha klasser i klasser) så är det helt okej med public-variabler, eftersom det är helt privat data som ingen annan kod kan missbruka. Välskriven, objektorienterad källkod är lättare att förstå, både för dig själv och för andra, och den är lättare att återanvända för framtida projekt.

Oinitierade instanser Om du av någon anledningen vill instansiera en referens i ett senare skede så kan du sätta den till ”noll”. Ett par exempel tydliggör: int[] a = null; Person p = null;

Det är ett programfel att använda en instans som är null.

Lokala variabler Lokala variabler är variabler som, till skillnad från medlemsvariabler, deklareras inuti en metod. Kom ihåg att en variabel alltid ska deklareras så nära sin användning som möjligt. Om den bara behövs i en metod ska den deklareras där och inte som en medlemsvariabel.

73

7 Metoder

Några standardmetoder Det finns nästan hur mycket funktionalitet som helst som följer med Java. Nästan. Här är en liten lista på några användbara metoder: Namn

Parametrar

Returnerar

Metod

String.length

int

Returnerar antal tecken i en sträng.

String.toUpperCase

String

Returnerar en sträng med enbart versaler.

String.equals

String anObject

boolean

Returnerar true om strängen är lika med anObject.

String.indexOf

String str

int

Returnerar index av den första förekomsten av str, eller -1.

static Math.abs

int/long/ float/ double/... a

int/long/ float/ double

Returnerar absolutbeloppet av a. Returvärdet är av samma typ som man stoppar in.

static Math.sin

double a

double

Returnerar sinus av a.

static Math.cos

double a

double

Returnerar cosinus av a.

static Math.tan

double a

double

Returnerar tangens av a.

static Math.sqrt

double a

double

Returnerar roten ur a.

static Math.pow

double a, double b

double

Returnerar a upphöjt till b.

static Thread. sleep

long millis

static System.currentTimeMillis System.in.read

byte[] b, int off, int len

Söver processen (tråden) i millis millisekunder. long

Returnerar millisekuder sedan 1970-01-01.

int

Läser in len antal tecken från standard input tilll byte-arrayen b med start på index off.

Det finns tusentals metoder för att öppna fönster, skapa knappar och textfält, skapa HTML-kontroller, rita grafiska primitiv, öppna OpenGL-fönster, rita 3D-objekt, och så vidare. Det är dock lite för avancerat att börja med sådana saker redan.

Gör ett enkelt inloggningsprogram Snart ska du testa att göra ett program som man kan göra skeninloggningar med. Så här ska algoritmen se ut när det är färdigt:

74

7 Metoder

Skriv in användarnamn. Skriv in lösenord. Låtsas processa lösenordet, visa en förloppsmätare. Är användarnamn och lösenord korrekta? Om ”Ja” skriv ut ett hälsningsmeddelande. Annars skriv ut ett felmeddelande.

Hantering och kontroll av användarnamn och lösenord samt förloppsmätaren läggs i en egen metod. 1. Skapa en Java-applikation som du kallar för FakeLogin. Skriv in och kompilera källkoden enligt följande: private static class LoginInfo { public String user; public String password; } private static boolean login(LoginInfo info) { System.out.print(”Enter user name: ”); info.user = Sdb.in.next().toUpperCase(); System.out.print(”Enter password: ”); info.password = Sdb.in.next().toUpperCase();

}

int x = 0; while (x < 30) { System.out.print(’.’); Sdb.sleep(0.1); ++x; } System.out.println(); if (info.user.equals(”AGENT”)) { if (info.password.equals(”007”)) { return true; } } return false;

public static void main(String[] args) { Sdb.createConsole(); LoginInfo info = new LoginInfo(); boolean loginOk; loginOk = login(info); if (loginOk) { System.out.println(”Access granted for”+ ” user ”+info.user+”.”); } else { System.out.println(”Not authorized to ”+ ”access the system.”); } }

75

7 Metoder

Några kommentarer: • I metoden login hämtas användarnamn och lösenord ifrån användarens inmatning. Båda görs om till strängar med enbart versaler. Sedan används en while-slinga för att visa den fejkade förloppsmätaren och sist verifieras användarnamnet och lösenordet. • Efter att användaren matat in användarnamn och lösenord skrivs en rad med punkter ut, det är detta som är förloppsmätaren. Totalt 30 punkter skrivs ut med 100 millisekunders mellanrum; förloppsmätaren tar med andra ord tre sekunder. • Instansmetoden String.equals returnerar true om strängarna är lika. • Endast användarnamnet AGENT och lösenordet 007 accepteras. Om inte både användarnamnet och lösenordet stämmer så returnerar login false. Märk väl att det är irrelevant om användaren matar in gemener eller versaler eftersom både användarnamnet och lösenordet konverteras till en sträng med enbart versaler. • Returvärdet ifrån login är av typen boolean. Om login returnerar true så har användaren skrivit in korrekt användarnamn och lösenord. Om login returnerar false så har användaren inte skrivit in korrekt användarnamn och/eller lösenord.

76

7 Metoder

Konverterar användarnamn och lösenord till versaler. Skriver ut punkterna som utgör förloppsmätaren. Kontroll av användarnamn och lösenord.

Om Login returnerar true så har användaren matat in korrekta inloggningsuppgifter. Annars är inloggningen inte godkänd.

77

7 Metoder

Noterade du att inmatningen av användarnamn och konverteringen till versaler sker på samma rad? Det går såklart utmärkt att skriva på två rader, men koden blir mer koncis såhär. Utdata vid korrekt inmatning av användarnamn och lösenord:

Utdata vid felaktig inmatning:

Övningsuppgifter Övning 7.1

Ange några fördelar med att använda metoder.

Övning 7.2

Förklara begreppen synlighet, returvärde och parameter.

Övning 7.3

Beskriv händelseförloppet från det att en metod med en parameter anropas till dess att den returnerar. Vad händer med variabeln som skickas som inparameter?

Övning 7.4

Hur skriver du ett anrop till int tjena(int i); med valfritt värde på inparametern? Du ska spara returvärdet i en variabel x.

Övning 7.5

Skriv en metod som returnerar en float och tar en chararray och en double som inparametrar. Synligheten ska vara public. Metodsnamnet är valfritt och du behöver inte skriva något innehåll i metoden.

Övning 7.6

Hur gör du om du vill returnera flera värden ifrån en metod?

Övning 7.7

Vad skriver du för nyckelord som returvärde i metodhuvudet på en metod som inte ska returnera något värde?

Övning 7.8

Beskriv lokala, medlems- och klassvariabler.

78

7 Metoder

Övning 7.9

Modifiera inloggningsprogrammet så att ytterligare två användarnamn och lösenord accepteras som korrekta. Dessa är valfria. Försök att inte duplicera någon del av koden.

Övning 7.10

Skriv ett program där användaren får mata in valfri text. Om användaren har matat in substrängen ”ko” så ska programmet skriva ut ”Du skrev det!!! Fånigt!!!” annars ska utskriften lyda ”Det fattas boskap...”.

Övning 7.11

Lägg till fler ord som känns igen till ovanstående uppgift.

Övning 7.12

Gör en miniräknarapplikation som klarar plus, minus, gånger, delat, modulus, roten ur, sinus, cosinus, tangens och upphöjt till. Beräkningarna ska utföras som de matas in: från vänster till höger; du behöver till exempel alltså inte utföra multiplikation före addition (som annars är praxis). När ett likamedtecken matas in ska resultatet av beräkningarna skrivas ut och alla tidigare beräkningar nollställas samt programmet börja om.



Detta är en mycket svår övning för dig som känner att du ligger långt före boken. Nedan finns lite hjälp på vägen om du kör fast. Du kommer bland annat använda metoderna Math.fmod (modulus för flyttal), Math.sqrt (roten ur), Math.sin (sinus), Math.cos (cosinus), Math.tan (tangens) och Math.pow (upphöjt till).

Miniräknarapplikationen ska tolka tecknen % som modulus, v som roten ur, s som sinus, c som cosinus, t som tangens och ^ som upphöjt till (34 matas alltså in som 3^4). Observera att roten ur, sinus, cosinus och tangens används som ”prefix”, det vill säga de utförs på nästkommande tal innan det läggs till den totala summan. För att kontrollera om ett ”prefixtecken” ligger näst i indataströmmen använder du Sdb.in.nextChar till inmatning som vanligt. För att lägga tillbaka ett tecken i indataströmmen använder du metoden Sdb.in.pushLastChar.

79

8

De vanligaste nyckelorden

I detta kapitel Du kan redan principerna för de flesta nyckelord. Ibland går det dock att förenkla programmeringen något genom att använda andra nyckelord med annan syntax. Och så ska du självklart få lära dig något enstaka nytt nyckelord.

Loopar En loop, eller slinga, används när man vill upprepa en eller flera satser en eller flera gånger.

Nyckelordet while Du är redan bekant med while-satsen. while(uttryck) { sats; }

Detta är vad while-satsen gör: 1. Testa uttryck.

2. Om uttryck är sant fortsätt på nästa rad.

3. Om uttryck är falskt hoppa till raden efter hela while-satsen.

4. När exekveringen når slutet på while-satsen hoppar den tillbaka till den första raden i while-satsen och testar uttryck igen.

När ett uttryck evalueras (utvärderas) för att kontrollera om det är sant eller falskt så är det faktiskt så att uttrycket returnerar en boolean: true eller false. Alltså går det att göra som i följande exempel: int x = 10; int y = 100; boolean b = (x*10 < y); b kommer att tilldelas värdet true om uttrycket (x*10 < y) är sant, annars kommer b att få värdet false. Detta gäller alla uttryck, och det får till följd att det while-satsen egentligen testar är en boolean.

80

8 De vanligaste nyckelorden

För att skapa en evighetsloop så skriver du som i följande exempel: while (true) { }

En dylik while-sats kommer att hålla på mycket, mycket länge... Du kan nästla alla typer av uttryck som innefattar flera satser. Nästla kallas det när man lägger en sats inuti en annan sats. Med två nästlade while-satser kan det se ut så här: int y = 0; while (y < 13) { int x = 0; while(x < 10) { ++x; } ++y; }

Här körs alltså en while-loop inuti en annan while-loop.

Nyckelordet do Ibland vill du inte testa uttrycket första gången du kör loopen. Då kan du använda dig av en do...while-sats. do {

sats; } while(uttryck);

Här testas i stället uttrycket på sista raden i loopen. 1. sats; exekveras alltid först.

2. Testa uttryck.

3. Om uttryck är sant så hoppar exekveringen till början på loopen. 4. Annars faller exekveringen igenom och fortsätter på nästa rad.

Nyckelordet for Den troligtvis vanligaste slingan i Java är nog for-loopen. for (sats1; uttryck; sats2) { sats3; }

81

8 De vanligaste nyckelorden

Det är inte lika jobbigt som det ser ut. 1. sats1; exekveras alltid först.

2. Testa uttryck.

3. Om uttryck är sant fortsätt på nästa rad.

4. Om uttryck är falskt hoppa till raden efter hela for-satsen.

5. När exekveringen når slutet på for-satsen hoppar den tillbaka till den första raden i for-satsen, utför sats2 och testar uttryck igen.

Lägg tre saker på minnet här: 1. sats1; utförs bara en gång.

2. sats2 utförs efter varje loop före uttryck testas igen.

3. sats2 ska inte avslutas med semikolon.

Resultatet blir alltså fullkomligt identiskt med en dylik while-sats: sats1; while(uttryck) { sats3; sats2; }

Orsaken till att for-satsen är så vanlig är att man ofta programmerar på just detta vis. Nedan hittar du ett mycket vanligt exempel på hur en for-loop brukar se ut i källkoden: for(int i=0; i= 32 && x < 64) { ... }

Logiska operatorer För att slå ihop flera uttryck till ett stort så kan du använda dig av de logiska operatorerna OCH och ELLER. Logiskt OCH representeras i Java av operatorn &&, logiskt ELLER representeras av operatorn ||. Du kan skriva som i följande exempel. if(uttryck1 && uttryck2 && uttryck3) { sats; } sats; kommer att exekveras om uttryck1 OCH uttryck2 OCH uttryck3 är sanna. Om något av uttrycken är falskt så kommer sats; ej att

utföras. Följaktligen kan du också skriva:

if(uttryck1 || uttryck2 || uttryck3) { sats; } sats; kommer att exekveras om uttryck1 ELLER uttryck2 ELLER uttryck3 är sant. Det räcker alltså om ett enda av uttrycken är sant för att sats; ska utföras.

Logiska uttryck kan även ges olika prioritet med parenteser: if((uttryck1 || uttryck2) && (uttryck3 || uttryck4)) { sats; } sats; kommer att exekveras om (uttryck1 ELLER uttryck2) OCH (uttryck3 ELLER uttryck4) är sanna. Det vill säga minst ett av uttrycken

i den första parentesen måste vara sant och minst ett av uttrycken i den andra.

85

8 De vanligaste nyckelorden

Övningsuppgifter Övning 8.1

Skriv om pseudokod till Java, använd en for-loop:

Talet x tilldelas 100 [A] Om x är större än 13 skriv ut x. Annars hoppa till [B]! Minska x med ett. Hoppa till [A]! [B]

Övning 8.2

Skriv om pseudokod med en for-sats:

Talet x tilldelas fyra. [A] Om x mindre än 200 hoppa till [B]! Skriv ut ”Rackaryrket finns fortfarande i USA.”. Öka x med ett. Hoppa till [A]! [B]

Övning 8.3

Lägg till i ovanstående loop: om x är lika med 119 avbryt loop.

Övning 8.4

Lägg till i ovanstående loop: skriv endast ut strängen om x ligger i intervallet x < 7, 99 < x < 105. Använd endast två if-satser totalt.

Övning 8.5

Använd det mest effektiva nyckelordet för att skriva om pseudokoden till Java:

Låt användaren mata in talet x. Om x är lika med 1 skriv ut ”En!”. Om x är lika med 2 skriv ut ”Tvenne!”. Om x är lika med 3 skriv ut ”Trenne!”. Om x är lika med 4 skriv ut ”Janne!”. Annars skriv ut ”Död åt Tengil!”.

Övning 8.6

Skriv ett valfritt program med en while-sats, en do-sats, en for-sats, en switch-sats och en if-sats med minst tre logiska uttryck i.

86

9

Större projekt

I detta kapitel Nu är det dags för dig att lära dig hur du går tillväga för att skapa ett större projekt och hur de olika delarna hänger samman.

Mycket källkod blir dålig soppa Du har tidigare sett varför man delar upp källkoden i metoder: eftersom det är lättare att använda, organisera, och överblicka. Om du provar att läsa en bok utan meningar, stycken och kapitel så får du nog en idé om hur förvirrat det kan vara. Dock räcker det inte att dela in källkoden i olika metoder eftersom det kan bli en oöverblickbar mängd metoder i en enda fil. Därför läggs metoderna i olika källkodsfiler (.java) som kompileras individuellt och sedan länkas samman till en exekverbar fil.

Namngivning Det finns minst lika många sätt att skriva källkod som det finns programmerare. Som du har sett går det att namnge metoder och variabler på flera sätt. Sedan kan man ju även lägga in blanksteg mellan nyckelord, parenteser, hakparenteser, klammerparenteser, operatorer, et cetera. I följande kod ser du sex olika varianter på hur man kan skriva en metod som tar två argument (char-array och int) och returnerar noll (int): int minFunc(char[] p, int i) { return 0; } int Din_Func(char p[], int i) { return(0); } int hans_func ( char [] p, int i ) { return 0; } int HennesFunc( char p [], int i) { return(0); }

87

9 Större projekt

int dennes_Func ( char[]p , int i ) {return(0);} int _ErFunc(char[]p, int i) { return 0; }

Sun Microsystems kodstandard för Java Den absolut vanligaste kodstandarden är den som Sun Microsystems, som utvecklat Java, själva använder. Den namnger paket med gemener, klasser använder CamelCase med versal inledande bokstav; metoder och variabler använder camelCase med gemen begynnelsebokstav. Man låter endast den allra sista klammerparentesen i en sats stå på egen rad. Såhär: package mypackage; class MyClass { void myMethod(int a) { if (a >= 10) { ... } else if (a >= 5) { .... } else { .... } } }

Du kan läsa mer om Suns kodstandard för Java på webben: http://‌java.‌sun.‌com/docs/codeconv/

88

9 Större projekt

Övningsuppgifter Övning 9.1

Den här övningen går ut på att skapa ett något större projekt. 1. Skapa ett tomt projekt, kalla det Larger. 2. Du ska skriva två .java-filer i projektet. Kalla filerna Main.java och MittTest.java. 3. I Main.java ska metoden main ligga.

4. I MittTest.java lägger du in en egen metod prov.

5. Skriv ut något flummigt med System.out i MittTest.prov. 6. Anropa MittTest.prov från main. 7. Testkör. Övning 9.2

Utöka ovanstående program med fler metoder och försök att åstadkomma något kul resultat.

89

10

Grafisk programmering

I detta kapitel Du kommer snart att få lära dig de mest basala kunskaperna om grafisk programmering. Detta kapitel handlar om hur skärmen är uppbyggd och hur du gör för att rita i ett fönster. Om du har tänkt dig syssla med någon form av grafisk programmering så är det vitalt att du förstår informationen i det här kapitlet.

Bildpunkter Bildpunkter, eller pixlar, är pyttesmå fyrkanter på skärmen som kan sättas till individuella färger. Flera bildpunkter bildar tillsammans en bild. Ju mindre pixlar, desto bättre kvalitet på bilden.

Låg upplösning, stora pixlar

Hög upplösning, små pixlar

På en vanlig skärm har man ofta upplösningar som 1024x768, 1280x1024 eller 1600x1200. Måttet är då i pixlar, det vill säga 1024 pixlar från vänster till höger, 768 pixlar uppifrån och ner, och så vidare. Det är ju inte bara upplösningen som ger skillnaden i bildkvalitet, utan också antalet färger.

RGB RGB betyder Red Green Blue. Alla färger kan representeras av kombinationer av dessa tre. Rött och grönt blandas till gult, rött och blått blir lila, grönt och blått blir någon slags kvasi-pastell-mintgrön, och så vidare.

90

10 Grafisk programmering

När man använder ”true color”, det vill säga 24-bitars färg, så använder grafikkortet en byte var för R, G och B. Ett lågt värde i byten betyder lite av den färgen, ett högt värde i byten betyder mycket färg. Dessa bytes tolkas som unsigned, alltså kan de anta värden ifrån 0 till 255. Till exempel R=150, G=100, B=50 blir någon nyans av brunt. Totalt kan man alltså visa 256x256x256 = 16 miljoner olika färger. Varje enskild bildpunkt kan sättas till valfri färg, och det är på det viset som man frammanar bilder på skärmen. Java tillhandahåller många olika slags grafiska komponenter och klasser. En av klasserna heter java.awt.Canvas, och den kan man använda för att sätta individuella bildpunkter i ett fönster. Med i materialet finns några förenklande metoder för att göra detta, bland annat Sdb.createAnimatedCanvas och Sdb.setPixel. Metoden Sdb.‌setPixel tar bland annat X-koordinat, Y-koordinat och färg som parametrar. X-koordinaten anger kolumnen, Y-koordinaten anger raden. Koordinaten (0; 0) är pixeln i den första kolumnen, på första raden, (4; 77) är alltså bildpunkten i den 5:e kolumnen, 78:e raden. En närbild av skärmen ser ut ungefär som i följande exempel: (0; 0)

(10; 0)

Grafiska applikationer När du skriver grafiska applikationer, till skillnad från konsolapplikationer, så kommer du att instansiera Sdb i stället för att använda den statiska metoden Sdb.createConsole. Utdata kommer att visas i ett grafiskt fönster som du öppnar och stänger efter behag. Du kan själv ställa in storlek med mera på fönstret. Oftast i Java låter man fönsterstorleken bestämmas implicit av innehållet; större komponenter ger ett större fönster, och vice versa.

91

10 Grafisk programmering

Du gör en grafisk applikation Nu ska du göra en enkel grafisk applikation för att få en känsla för hur det fungerar med grafisk programmering. Algoritmen kommer att se ut så här: Skapa en instans av den egna klassen. Öppna ett fönster. Skapa och lägg till en grå rityta med bredden 500 pixlar och höjden 400. Ange att den egna instansen har hand om utritning av fönstret. Visa fönstret. --Varje gång ritytan behöver ritas om, sätt då ut fyra svarta pixlar på följande koordinater: (55; 33), (57; 33), (59; 33) och (65; 33).

RGB-kombinationen för att skapa svart färg är (0; 0; 0), det vill säga samtliga komponenter är färglösa. På motsvarande sätt är (255; 255; 255) vitt och (128; 128; 128) grått. 1. Skapa ett tomt projekt. Kalla det för Window. 2. Om din klass heter Main (förinställt när du skapar nya projekt i NetBeans) så skriv in följande i main: new Main();

Detta kommer att skapa in instans av din klass Main. Vi kommer nu att utöka Main med ett par metoder som sköter själva skapandet av fönsret och utritningen. 3. Skapa en ny metod public Main() { }

4. Den här metoden är en specialmetod som kallas konstruktor. Den har ingen returtyp och anropas bara när man skapar en instans av klassen. I konstruktorn skriver du in: Sdb window = new Sdb(”My First Window”); window.createCanvas(500, 400, Color.gray, this); window.showFrame();

92

10 Grafisk programmering

Nyckelordet this som skickas in som sista parameter till createCanvas anger att vår instans ska sköta utritningen av innehållet i vår Canvas. För att vi ska kunna rita innehållet i fönstret krävs två saker: dels att vi har en metod som kan rita ut innehållet, dels att vår klass är av en särskild typ, en ”utritartyp”. 5. För att ange att vår klass är av typen ”utritare” så lägger du till implements DrawListener i klassdeklarationen: public class Main implements DrawListener { DrawListener är en del av Sdb. Glöm inte att trycka Ctrl+Shift+I (Net-

Beans) om det saknas externa klasser och liknande.

6. Nu återstår bara att lägga till utritningen av våra pixlar. Lägg till en metod med följande utseende och innehåll: public void onDraw(Graphics Sdb.setPixel(g, 55, 33, Sdb.setPixel(g, 57, 33, Sdb.setPixel(g, 59, 33, Sdb.setPixel(g, 65, 33, }

g) 0, 0, 0, 0,

{ 0, 0, 0, 0,

0); 0); 0); 0);

Metoden onDraw kommer att anropas varje gång fönstret behöver ritas om. De tre sista parametrarna anger RGB för pixeln, alltså svart. 7. Testkör. Ett fönster med titeln My First Window skapas (med grå bakgrund) och de fyra svarta pixlarna sätts ut:

93

10 Grafisk programmering

8. Ersätt fönstertiteln My First Window med din egen titel. 9. Ändra koordinat på den sista pixeln till X=200, Y=100 och ändra färgen till vit. Byt alltså ut Sdb.setPixel(g, 65, 33, 0, 0, 0); mot Sdb.setPixel(g, 200, 100, 255, 255, 255);

10. Testkör. 11. Gör dina egna modifieringar på källkoden. Försök få fram röda, gröna och blåa pixlar! Rita ut fler pixlar! Modifiera fönstrets storlek! Experimentera själv!

Övningsuppgifter Övning 10.1

Vad är en pixel?

Övning 10.2

Hur skapas sammansatta färger på grafikkortet?

Övning 10.3

Indexeras rader och kolumner på skärmen ifrån noll eller ett?

Övning 10.4

Använd en for-slinga för att skapa en vertikal, klarröd linje i fönstret från (20; 20) till och med (20; 300).

Övning 10.5

Använd två nästlade for-slingor för fylla hela fönstret med grön färg.

Övning 10.6

Rita ett eget mönster i fönstret genom att sätta individuella pixlar. Färg och form efter eget huvud.

94

11

Skriv en fraktalzoomare

I detta kapitel I detta kapitel kommer du att skriva en fraktalzoomare, det vill säga en applikation som öppnar ett grafiskt fönster och ritar fantastiska matematiska funktioner däri. Fraktalritning är bara ett exempel på hur du kan använda dig av grafisk programmering för att åstadkomma intressanta resultat.

En Mandelbrot-fraktal.

En fraktalzoomare är en applikation som ritar en fraktal och zoomar sig in i den. Fraktalzoomare användes förr ofta som en demoeffekt, med tricks och optimeringar för att kunna göra en realtidszoom på en fraktal; det är det dock inte tal om här. När en fin fraktal ska ritas så krävs hundratals, upp till tusentals, beräkningar per pixel och därför kan det gå ganska långsamt att rita ut dem.

Fraktalteori Du ska inte lära dig matematiken bakom fraktaler. Du kommer bara att skumma lite på ytan. Syftet är inte att du ska lära dig fraktaler, utan bara att påvisa hur kul det är att göra något lite mer avancerat med dina nyvunna kunskaper. Följande avsnitt handlar om mekanismerna bakom fraktaler.

95

11 Skriv en fraktalzoomare

Den man som fått äran för upptäckten av fraktaler var en fransk matematiker vid namn Gaston Julia (1893–1978). Men det var först på 70-talet som Benoit Mandelbrot (1924–) med hjälp av datorgrafik lyckades visa hur fantastiskt vackra resultatet av dessa formler är. Både Mandelbrot och Julia har fått fraktaler uppkallade efter sig. Vad du gör när du tittar på en fraktal är egentligen att titta på ett tvådimensionellt talplan, närmare bestämt det komplexa talplanet. På Y-axeln ligger imaginära värden och på X-axeln ligger reella värden. Varje bildpunkt på skärmen motsvarar därmed en X-Y-koordinat i det komplexa talplanet. Tänk dig sedan att du för varje bildpunkt upprepar en beräkning med en viss formel för att se om just den koordinaten drar sig mot oändligheten. Det låter som tråkig matematik, men du kan tänka på det ungefär som att du känner dig fram för att se om det finns någon botten. Bottenlösa är de svarta sammanhängande fälten i föregående bild, det som är av ljusare nyanser är inte bottenlöst. De svarta fälten tar således längre tid att ”känna sig fram till” än de ljusa. Ju mer du zoomar in på fraktalen desto fler beräkningar måste du använda, för noggrannhetens skull. Du kommer att märka resultatet av detta: det går långsammare och långsammare att rita ut fraktalen ju längre in du zoomar.

Grundplåten Även i detta kapitel kommer du att använda dig av färdig kod för monotona moment som att öppna och stänga fönster. Du kommer att skriva algoritmen som räknar ut det enskilda färgvärdet på varje pixel och anropa metoden som sätter ut pixeln. 1. Skapa en ny Java-applikation som du kallar för Fractal. 2. Skapa en konstruktor i din klass. Om klassen heter Main skapar du en konstruktor såhär: public Main() { }

3. Skriv in i main: new Main();

4. I konstruktorn skapar du fönstret: Sdb window = new Sdb(”Fractal Drawer”); window.showFrame();

96

11 Skriv en fraktalzoomare

5. Testkör. Ett fönster utan innehåll, och med minimal höjd och bredd kommer att öppnas. Sedan kommer applikationen att vänta tills du stänger fönstret. 6. Lägg till i din klassdefinition så att den implementerar DrawListener. (Använd auto-import-funktionen i ditt IDE (utvecklingsverktyg) vid behov.) 7. Skapa en publik metod vid namn onDraw som ska anropas när det är dags att rita ut fraktalen: public void onDraw(Graphics g) { }

8. I konstruktorn, efter fönstret skapas, men före det visas, så lägger du till: window.createCanvas(200, 200, Color.BLACK, this);

9. Testkör. Nu har fönstret fått en svart ruta till innehål. Det är på den du ska rita din fraktal.

Mandelbrot Den matematiska algoritmen för att rita en Mandelbrotfraktal är: z = z*z+c;

Där z och c är komplexa tal, c är en konstant. Denna algoritm utförs tusentals gånger för varje pixel när en Mandelbrotfraktal ritas ut. Upprepning av en dylik beräkning kallas för iteration. Snart kommer du att skriva en metod som utför följande algoritm: Räkna ut avståndet mellan varje pixel i det komplexa talplanet. Räkna ut minimi- och maximivärdena för det komplexa talplanet. Räkna ut hur hög noggrannhet som krävs. Sätt py = 0. [Y-loop] py < Höjden på fönstret? Om ”Nej” hoppa till [Y-slut]! Sätt ci = Y-koordinat. Sätt px = 0. [X-loop] px < Bredden på fönstret? Om ”Nej” hoppa till [X-slut]! Sätt cr = X-koordinat.

97

11 Skriv en fraktalzoomare

Sätt count = 0; Iterera och öka count för varje iteration. *** Normalisera count. Använd count som rött färgvärde och sätt pixeln. Hoppa till [X-loop]! [X-slut] Hoppa till [Y-loop]! [Slut]

Den matematiska formeln utförs i iterationssteget (här markerat med ***). Värdet cr är den reella delen av c, värdet ci är den imaginära delen av c. Iterationen ser ut så här: count = 0 zr = 0 zi = 0 [Iteration] zr_new = zr*zr - zi*zi + cr zi_new = 2*zr*zi + ci zr = zr_new zi = zi_new zr*zr + zi*zi > 4? Om ”Ja” hoppa till [Rita_pixel]! Öka count count > Maximal noggrannhet? Om ”Ja” sätt count=0, hoppa till [Rita_pixel]! Hoppa till [Iteration] [Rita_pixel]

Den reella delen av z heter här zr; zi är den imaginära. Heltalsvariabeln count är en räknare som ökar för varje iteration. Du kan tänka på den som ett mått på hur ”djupt” det är på en viss pixel. Om count når upp till värdet på maximal noggrannhet så antas pixeln vara ”bottenlös”, och färgen sätts till svart.

Implementera algoritmen 1. Skapa en metod som heter drawMandelbrotFractal. Den behöver inte returnera någonting men den ska ta en Graphics, två int och tre double som parametrar, nämligen grafikkontexten för vår Canvas, bredd, höjd, X- och Y-koordinat i talplanet och till sist zoom. Metoden ser ut som i följande exempel: public static void drawMandelbrotFractal( Graphigs g, int width, int height, double real, double imag, double zoom) { }

98

11 Skriv en fraktalzoomare

2. Skriv in följande kod i metoden drawMandelbrotFractal: double pixelStep double realMin double imagMax double exp int maxIterate

= = = = =

5/(width*zoom); real-pixelStep*width/2; imag+pixelStep*height/2; 0.3; (int)(Math.pow(zoom, exp)*30);

for(int py = 0; py < height; ++py) { double ci = imagMax - py*pixelStep; for(int px = 0; px < width; ++px) { double cr = px*pixelStep + realMin; double zr = 0; double zi = 0; double zr2 = 0; double zi2 = 0; int count = 0; while (true) { zr2 = zr2-zi2+cr; zi2=2*zr*zi+ci; zr=zr2; zi=zi2; zr2 *= zr2; zi2 *= zi2; if(zr2+zi2 > 4) { break; } if(++count >= maxIterate) { count = 0; break; } } int color = count*255/maxIterate; Sdb.setPixel(g, px, py, color, 0, 0); } }

Nästan längst ner ser du anropet till Sdb.setPixel. Det är där som varje enskild pixel sätts på skärmen. När du skrivit in hela innehållet i drawMandelbrotFractal så ska du lägga in anropet från onDraw till drawMandelbrotFractal: drawMandelbrotFractal(g, 200, 200, -0.5, 0, 1);

Koordinaten (-0,5; 0) blir centrum på bilden, eftersom de intressanta delarna i en Mandelbrotfraktal är något förskjutna åt vänster. 3. Testkör. Om allt står rätt till ser du nu en fin Mandelbrotfraktal utritad mitt på skärmen.

99

11 Skriv en fraktalzoomare

Nu ska vi utöka programmet med en zoomning. Vi använder följande algoritm: Initial zoom är 0.1. Koordinaten att zooma på är (-0.15519667402918; +1.02730660763040). --För varje utritning: Rita ut Mandelbrot-fraktalen. Öka zoomen med 20 %. --Utritningen ska upprepas var 100:e millisekund.

4. Skriv in följande i din klass: private double real = -0.15519667402918; private double imag = +1.02730660763040; private double zoom = 0.1;

5. Modifiera onDraw så att metodkroppen består av drawMandelbrotFractal(g, 200, 200, real, imag, zoom); zoom *= 1.2;

6. I konstruktorn ändrar du anropet window.createCanvas till window. createAnimatedCanvas. Lägg samtidigt till en parameter på slutet som du anger till 100. Det sista värdet anger en tid, i millisekunder, hur ofta vi vill rita om vår canvas. Här vill vi alltså rita om vår fraktal var 100:e millisekund, vilket motsvarar 10 Hz. Det tar lång tid att rita ut en fraktal, så det värdet kommer ganska snart att ”slå i taket”, och då ritas fraktalen ut så fort det går i stället.

100

11 Skriv en fraktalzoomare

Hela källkoden kan se ut som i följande exempel:

101

11 Skriv en fraktalzoomare

7. Kompilera och kör. Resultatet efter några sekunders zoomande ser ut så här:

Du kan göra enkla, små modifieringar i koden för att få en roligare och häftigare fraktalzoomare. Prova gärna själv!

Övningsuppgifter Övning 11.1

Testa att modifiera färgerna i applikationen. Testa med grönt och blått; försök även att få fram lila och gula fraktaler. Testa vad som händer om du multiplicerar indata till Sdb.setPixel, till exempel såhär:

Sdb.setPixel(g, px, py, color, color*11, color*5);

Övning 11.2

Modifiera bredd och höjd på fönstret. En liten fraktalzoomare går snabbt, en stor går långsammare. Om du vill göra en väldigt liten och snabb zoomare så kan du testa med 50x50. Alltså:

window.createAnimatedCanvas(50, 50, Color.BLACK, this, 100);



Glöm inte att samtidigt ändra höjd- och bredd-parametrarna i anropet till drawMandelbrotFractal.

102

11 Skriv en fraktalzoomare

Övning 11.3

Hur gör du så att du bara behöver ändra på ett ställe för att ändra höjd och bredd? För närvarande måste du ju ändra både i anropet till createAnimatedCanvas och i anropet till drawMandelbrotFractal. Gör det.

Övning 11.4

Modifiera procentenheten vid zoomning; snabbare och långsammare.

Övning 11.5

Försök hitta en annan intressant koordinat att zooma på (det vill säga ändra initialvärdena på real och imag).

Övning 11.6

Du ska nu modifiera fraktalzoomaren så att du i stället klickar dig fram i fraktalen med musen.



Lägg in en metod enligt följande: public void onMouseClick(int buttonIndex, int x, int y) { }



Lägg till ett anrop window.addMouseClickListener(this);



i konstruktorn, före du skapar en Canvas. Gör också så att din klass, utöver DrawListener även implementerar MouseClickListener.



Koden i onMouseClick ska vara sådan att när den anropas (med X- och Y-koordinat) så ska Mandelbrot-fraktalen ritas ut igen, fast inzoomad på den klickade koordinaten. Varje klick ska zoomen på fraktalen dubblas.



Lägg till liknande kod för högerklick, fast då ska fraktalen zoomas ut till 10 gångers förminskning.



Se till så att fraktalen bara ritas ut när man höger- eller vänsterklickar; den ska alltså inte ritas om i 10 Hz längre. För att rita om ditt fönster kan du anropa instansmetoden Sdb. repaintAll.

Övning 11.7

Leta upp information om Julia-fraktaler på Internet. Försök att implementera en sådan (de är väldigt lika Mandelbrot-fraktalen). Lägg implementationen i en ny metod, drawJuliaFractal.

103

11 Skriv en fraktalzoomare

Den typiska Mandelbrot-figuren återfinns oändligt många gånger på en ändlig yta.

104

12

Gå vidare

I detta kapitel Detta är en kort introduktion till övningsexemplen som medföljer materialet samt några tips om hur du kan utvecklas vidare inom programmering.

Programmering Det finns otroligt mycket spännande saker att prova på inom programmering. Du kan specialanpassa algoritmerna för att passa just dig! Några exempel på programmeringsområden som faller de flesta i smaken: • Grafisk programmering, 3D såväl som 2D • Användargränssnitt • Kommunikationsprogram: TCP/IP, HTTP, och så vidare. • Kryptering och säkerhet • Artificiell intelligens • Styr- och reglerteknik • Ljudsystem • Databaser • Fysiksimulering • Systemoptimering Du kanske inte tycker att allt är intressant; hitta då i stället det som passar dig. Det är först när du tycker att det är roligt som du blir riktigt duktig på att programmera.

Medföljande övningsexempel Flera övningsexempel (NetBeans-projekt) medföljer materialet. De är tänkta att belysa hur enkelt du kan göra roliga applikationer med några rader kod. Ta kopior och modifiera koden! Ändra algoritmer eller parametrar (som till exempel färger) och försök åstadkomma något intressant.

Övningsfilen FractalZoom Fraktalzoomaren ifrån det tidigare exemplet.

105

12 Gå vidare

Övningsfilen FractalClick Här kan du använda musen för att klicka dig in och ut i fraktalen ifrån tidigare exempel.

Övningsfilen Sort Programmet sorterar en array med tal i stigande ordning. Sorteringsalgoritmen som används heter Bubble Sort. Bubble Sort är den absolut enklaste sorteringsalgoritmen; i B-kursen kommer det handla en del om sortering och sökning. Med variabeln numberCount kan du enkelt ställa in antalet nummer som ska sorteras.

Övningsfilen Starfield

Ett enkelt stjärnfält. Genom att ändra värdet på variabeln g_uiNumStars kan du lätt ställa in antalet stjärnor. Du kan också ändra färgerna i stjärnfältet vid anropet till SdbDrawPixel.

Övningsfilen Worms Ett enkelt maskspel. Man styr med tangenterna: • w = uppåt, • a = vänster, • s = ner, och • d = höger. Ett ypperligt tillfälle för dig att pröva att lägga till kod så att det går att spela flera spelare. Varje gång det sker en kollision (när du kör in i dig själv) dyker det upp en meddelanderuta som visar texten ”Collision”.

Övningsfilen Sierp Visar en tredimensionell Sierpinski-fraktal. Applikationen använder matristransformer för att rotera objektet. Notera att renderingen är synnerligen ooptimerad här. Orsaken är att varje pixel beräknas och renderas direkt. Här är det enkelt att göra optimeringar. Försök själv!

106

13

Nyckelord i Java

abstract

protected

final

continue

throw

interface

for

byte

static

new

else

void

switch

import

class

assert

public

finally

default

throws

long

goto

case

strictfp

package

enum

volatile

synchronized

instanceof

const

boolean

return

float

do

transient

native

if

catch

super

private

extends

while

this

int

break

short

double

try

implements

char

107

De vanligaste nyckelorden Här hittar du de vanligaste nyckelorden i Java. För varje nyckelord finns beskrivning, syntax och exempel. B Nyckelord

boolean

Beskrivning

Variabeltyp som kan anta två värden: sant och falskt.

Syntax

boolean deklaration;

Exempel

boolean is_active = false;

Nyckelord

break

Beskrivning

Bryter den innersta loopen.

Syntax

break;

Exempel

while(true) { break; }

C Nyckelord

case

Beskrivning

Ett av flera möjliga utfall i en switch-sats. Måste alltid följas av ett konstant heltal och ett kolon.

Syntax

case konstant_heltal:

Exempel

switch(x) { case 3: str = ”Tre!”; break; }

Nyckelord

char

Beskrivning

Variabeltyp för tecken. Används ofta för representera enskilda ASCII-tecken.

Syntax

char deklaration;

Exempel

char ch = '#';

108

Nyckelord

continue

Beskrivning

Fortsätter med nästa steg i en loop.

Syntax

continue;

Exempel

while(true) { continue; }

D Nyckelord

default

Beskrivning

Nyckelordet default används endast i switch-satser. Exekveringen kommer till default-alternativet om inget case-alternativ matchar.

Syntax

default:

Exempel

switch(x) { case 0: str = ”Noll!”; break; case 1: str = ”Ett!”; break; default: str = ”Ej noll/ett!”; break; }

Nyckelord

do

Beskrivning

Loop som testar villkoret på sista raden. Det innebär att loopen alltid kommer att köras minst en gång. Loopen kommer att exekveras till dess att villkoret är falskt.

Syntax

do { } while (villkor);

Exempel

do { } while (true);

Nyckelord

double

Beskrivning

Variabeltyp för flyttal. 15 signifikanta siffor.

Syntax

double deklaration;

Exempel

double d = 3.1415;

109

E Nyckelord

else

Beskrivning

Används enbart efter en if-sats. Exekveringen kommer till elsesatsen om inte villkoret i if-satsen är sant.

Syntax

if (villkor) { } else { }

Exempel

int x = ...; if (x == 1) { str = ”Ett!”; } else { str = ”Inte ett!”; }

F Nyckelord

false

Beskrivning

false är det ena av de två värdena som variabeltypen boolean kan anta. true är det andra. Egentligen inte ett nyckelord utan en konstant.

Syntax

false

Exempel

boolean b = false;

Nyckelord

float

Beskrivning

Variabeltyp för flyttal. 7 signifikanta siffor.

Syntax

float deklaration;

Exempel

float f = 3.1415f;

Nyckelord

for

Beskrivning

En villkorlig loop. Loopen kommer att exekveras till dess att villkoret är falskt.

Syntax

for(uttryck; villkor; uttryck) { }

Exempel

for(int x = 0; x < 3; ++x) { System.out.println(x); }

110

I Nyckelord

if

Beskrivning

Exekverar villkorliga satser. Innehållet i if-satsen kommer att exekveras om villkoret är sant. if-satsen kan kombineras med en else-sats.

Syntax

if (villkor) { satser; }

Exempel

int x = ...; if (x == 3) { System.out.println(x); }

Nyckelord

int

Beskrivning

Variabeltyp för heltal.

Syntax

int deklaration;

Exempel

int i = -385;

L Nyckelord

long

Beskrivning

Variabeltyp för heltal.

Syntax

int deklaration;

Exempel

int l = -287;

M Nyckelord

main

Beskrivning

Inget nyckelord, men bör inte användas till andra deklarationer än huvudmetoden.

Syntax

main

Exempel

public static void main(String[] args) {}

111

N Nyckelord

null

Beskrivning

En oinitierad referens. Egentligen inte ett nyckelord utan en konstant.

Syntax

null

Exempel

String[] stuff = null; int[] ia = null;

R Nyckelord

return

Beskrivning

Returnerar från en metod. Om metoden ska returnera ett värde så ska return ta värdet som parameter. Om det är en void-metod så ska return inte ta någon parameter.

Syntax

return ;

Exempel

void x() { return; } int y() { return 4; }

S Nyckelord

short

Beskrivning

Variabeltyp för heltal.

Syntax

short deklaration;

Exempel

short i = -292;

112

Nyckelord

switch

Beskrivning

Villkorlig exekvering av olika satser beroende på heltalsuttrycket. Används tillsammans med nyckelorden case default.

Syntax

switch(heltalsuttryck) { case x: ... case y: ... case z: ... default: ... }

Exempel

int x = ...; switch(x) { case 10: case 91: case 99: default: }

str str str str

= = = =

”tio”; ”nittioett”; ”nittionio”; ”annat tal”;

break; break; break; break;

T Nyckelord

true

Beskrivning

true är det ena av de två värdena som variabeltypen boolean kan anta. false är det andra. Egentligen inte ett nyckelord utan en konstant.

Syntax

true

Exempel

boolean b = true;

113

V Nyckelord

void

Beskrivning

void används för att ange att en metod inte returnerar något värde.

Syntax

void metoddekaration

Exempel

void setPixel(int x, int y) {}

W Nyckelord

while

Beskrivning

En villkorlig loop. Loopen kommer att exekveras till dess att villkoret är falskt.

Syntax

while (villkor) { }

Exempel

int x = 0; while(x < 3) { System.out.println(x); ++x; }

114

14

Teckentabell

Tecken

ASCII-värde

Namnkod

Funktion

\0

0

NUL

Slut på sträng

\x1

1

SOH

\x2

2

STX

\x3

3

ETX

\x4

4

EOT

\x5

5

ENQ

\x6

6

ACK

\a

7

BEL

Avger en ton

\b

8

BS

Backsteg

\t

9

HT

Tabb

\n

10

LF

Radmatning

\v

11

VT

Vertikal tabb

\f

12

FF

Sidmatning

\r

13

CR

Vagnretur

\xE

14

SO

\xF

15

SI

\x10

16

DLE

\x11

17

DC1

\x12

18

DC2

\x13

19

DC3

\x14

20

DC4

\x15

21

NAK

\x16

22

SYN

\x17

23

ETB

\x18

24

CAN

\x19

25

EM

\x1A

26

SUB

115

Tecken

ASCII-värde

Namnkod

\x1B

27

ESC

\x1C

28

FS

\x1D

29

GS

\x1E

30

RS

\1F

31

US

32

SP

!

33

"

34

#

35

$

36

%

37

&

38

'

39

(

40

)

41

*

42

+

43

,

44

-

45

.

46

/

47

0

48

1

49

2

50

3

51

4

52

5

53

6

54

7

55

Funktion

Mellanslag

116

Tecken

ASCII-värde

8

56

9

57

:

58

;

59




62

?

63

@

64

A

65

B

66

C

67

D

68

E

69

F

70

G

71

H

72

I

73

J

74

K

75

L

76

M

77

N

78

O

79

P

80

Q

81

R

82

S

83

T

84

Namnkod

Funktion

117

Tecken

ASCII-värde

U

85

V

86

W

87

X

88

Y

89

Z

90

[

91

\

92

]

93

^

94

_

95

`

96

a

97

b

98

c

99

d

100

e

101

f

102

g

103

h

104

i

105

j

106

k

107

l

108

m

109

n

110

o

111

p

112

q

113

Namnkod

Funktion

118

Tecken

ASCII-värde

r

114

s

115

t

116

u

117

v

118

w

119

x

120

y

121

z

122

{

123

|

124

}

125

~

126

\x7F

127

Namnkod

Funktion

DEL

119

15

Facit

1.1 1990-talet.

1.2 Hårdvara kan man ta på, till exempel en scanner. Mjukvara är en drivrutin eller ett program, så som Notepad.

1.3 Bugg.

1.4 CPU eller centralprocessor.

1.5 JavaVM.

1.6 Kompilering.

1.7 Högnivåspråk och lågnivåspråk.

1.8 Programmeraren kan styra programexekveringen med olika kommandon.

2.1 Det är för tidskrävande och arbetsamt att använda musen, eftersom de flesta moment upprepas väldigt ofta.

2.2 Kommentarerna.

2.3 Orden som färgas blått är nyckelord.

2.4 .java

120

2.5 main

2.6 –

3.1

// Oljerigg

3.2

/* Gråsugga */

3.3

; (semikolon)

3.4

int

3.5

private

3.6 =

3.7 * (asterisk) respektive / (snedstreck)

3.8

int x; x=17;

3.9

int x;

3.10

x=30001; // 30001 skulle kunna vara // vilket värde som helst.

121

3.11

public static void main(String[] args) { int x; int y; int z; x=12000; y=55; z=x+y; System.out.println(z); }

En intressant modifikation på programmet är att införa flera variabler och använda flera olika räknesätt tillsammans. Se om du kan hitta i vilken ordning som de olika räknesätten exekveras. Start

4.1 Nej

Är du sömnig? Ja Sov!

Start

4.2 Nej

Är du sömnig? Ja

Gå och lägg dig!

Nej

Ligger du i sängen? Ja Sov!

Stig upp!

122

4.3 Såhär kan det se ut: [Start] Hoppa till [Trötthetscheck]! [Trötthetscheck] Är du sömnig? Om ”Ja” hoppa till [Liggkontroll]! Om ”Nej” hoppa till [Start]! [Liggkontroll] Ligger du i sängen? Om ”Ja” hoppa till [Sov]! Om ”Nej” hoppa till [Plats]! [Plats] Gå och lägg dig! [Sov] Sov! [Resning] Stig upp! Hoppa till [Start]!

4.4 Såhär kan lite pseudokod för en vanlig dag i Bamses liv se ut: [Vakna] Bamse vaknar och sätter på sig luvan. [Dagligt arbete] Är Bamse hungrig? Om ”Ja” hoppa till [Ät]! Är Bamse trött? Om ”Ja” hoppa till [Sov]! Är Bamse sugen på action? Om ”Ja” hoppa till [Action]! Vill Bamse ha intellektuell stimulans? Om ”Ja” hoppa till [Stimuli]! Om ”Nej” hoppa till [Dagligt arbete]! [Ät] Bamse äter en burk av Farmors honung. Hoppa till [Dagligt arbete]! [Sov] Bamse hänger av sig luvan på sängen. Bamse går och lägger sig. Bamse somnar och drömmer om Lille Skutt. Hoppa till [Vakna]! [Action] Bamse går till Vargen och knackar på. Håller vargen på med rackartyg? Om ”Ja” hoppa till [Bunta ihop]! Om ”Nej” hoppa till [Dagligt arbete]!

123

[Bunta ihop] Bamse fångar Vargen. Bamse buntar ihop Vargen. Bamse slår halvt ihjäl Vargen. Polisen kommer och ser tacksam ut. Polisen schasar in Vargen i radiobilen. Polisen drar iväg i 170 knyck. Hoppa till [Dagligt arbete]! [Stimuli] Bamse går till Skalman och knackar på. Något svar innefrån Skalmans hus? Om ”Nej” hoppa till [Dagligt arbete]! Bamse & Skalman drar ut på vilda äventyr. (Lille Skutt får inte följa med...) Hoppa till [Dagligt arbete]!

5.1

... else if(arithmetic == ’-’) { System.out.println(n1-n2); } ...

5.2 • • • • • •

Mindre än, < Mindre än eller lika med, Större än eller lika med, >= Lika med, == Skilt från, !=

5.3 4 är fel eftersom number2 ej är deklarerad.

5.4

int x = 0; while (x = 1000) { System.out.println(x); x = x-1; }

124

5.6

Sdb.createConsole(); int start = Sdb.in.nextInt(); int stop = Sdb.in.nextInt(); int x = start; while (x = 0) { return(true); } ...

130

7.12 Denna uppgift kan lösas på enormt många olika sätt. Här visas ett av dem. Sdb.createConsole(); System.out.println(”Calculator 2.0!!”); while (true) { System.out.println(”Enter numbers ”+ ”(ex. v16*c3.1%2-1+s-1.5*t7.7^2/2=):”); double result = 0; char lastArithmetic = ’+’; boolean expectingNumber = true; do { if (expectingNumber) { char prefixArithmetic; prefixArithmetic = Sdb.in.nextChar(); switch (prefixArithmetic) { case ’v’: case ’s’: case ’c’: case ’t’: break; default: Sdb.in.pushLastChar(prefixArithmetic); break; } double number; number = Sdb.in.nextDouble(); switch (prefixArithmetic) { case ’v’:number = Math.sqrt(number); break; case ’s’:number = Math.sin(number); break; case ’c’:number = Math.cos(number); break; case ’t’:number = Math.tan(number); break; } switch (lastArithmetic) { case ’+’: result += number; break; case ’-’: result -= number; break; case ’*’: result *= number; break; case ’/’: result /= number; break; case ’%’: result %= number; break; case ’^’: result = Math.pow(result, number); break; default: System.out.println(”Unknown arithmetic!”); break; } } else { lastArithmetic = Sdb.in.nextChar(); } expectingNumber = !expectingNumber; } while (lastArithmetic != ’=’); System.out.println(”Result: ”+result);

}

131

8.1

for(int x = 100; x > 13; --x) { System.out.println(x); }

8.2

for(int x = 4; x < 200; ++x) { System.out.println(”Rackaryrket finns fortfarande”+ ” i USA.”); }

8.3

for(int x = 4; x < 200; ++x) { System.out.println(”Rackaryrket finns fortfarande”+ ” i USA.”); if (x == 119) { break; } }

8.4

for(int x = 4; x < 200; ++x) { if (x < 7 || (x > 99 && x < 105)) { System.out.println(”Rackaryrket finns ”+ ”fortfarande i USA.”); } if (x == 119) { break; } }

8.5

Sdb.createConsole();

int x = Sdb.in.nextInt(); String s; switch (x) { case 1: s = ”En!”; case 2: s = ”Tvenne!”; case 3: s = ”Trenne!”; case 4: s = ”Janne!”; default: s = ”Död åt Tengil!”; } System.out.println(s);

break; break; break; break; break;

8.6 –

132

9.1 –

9.2 –

10.1 En pixel är ett bildelement i skärmen. Alla pixlar bildar tillsammans en helhet som ses som en bild.

10.2 RGB. Sammansatta färger skapas med olika kombinationer och ljusstyrkor av rött, grönt och blått.

10.3 Noll.

10.4

public void onDraw(Graphics g) { for(int y = 20; y