Programmering A : Java [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

L

Innehåll

11

l. Datorer och program 1.1 Datorns funktion 1.2 Programkörning 1.3 En kort historik 1.4 Studietekniska tips

13 13 16

2. Introduktion till Java 2.1 Arbetssätt vid programmering 2.2 Ett Javaprograms struktur

23 23 23 25 27 32 34 36

3. Variabler och inmatning 3.1 Datalagring och variabeldefinitioner 3.2 Tilldelningsoperatorn (=) 3.3 Inmatningar 3.4 Variabeltyper 3.5 Typomvandlingar 3.6 Fält 3.7 Teckensträngar

41 41 44 45 47 47 48

4.0peratorer 4.1 Aritmetiska operatorer 4.2 Tilldelande aritmetiska operatorer. 4.3 Förändringsoperatorer 4.4 Relationsoperatorer 4.5 Logiska operatorer 4.6 Prioritering

55 55 56 57

5. Algoritmer och kontrollstrukturer

65 65

6. Villkorssatser 6.1 if-else 6.2 if 6.3 if-else if 6.4 switch-case 6.5* Villkorsoperatorn ? :

7 7 8 10

70 72

74 78 87 87 95 99 103

5. I Algoritmer och pseudokod 5.2 Kontrollstrukturer 5.3 Strukturdiagram

7. Repetitionssatser 7.1 for 7.2 while 7.3 do 7.4 * Hoppsatser

Programmering A Java

112 115 116 117 119 121 123

8. Metoder 8.1 Programstruktur 8.2 Att använda en metod 8.3 Metoder med flera parametrar 8.4 Värdeparametrar 8.5 Metoder utan returvärde 8.6 Fält som parameter 8.7* Överlagrade metoder 8.8 Standardmetoder

131 131 133 135 138 143

9. Applets 9.1 Att köra en applet 9.2 En enkel applet 9.3 Färger 9.4 Ritmetoder 9.5 Typsnitt

151 151 153

10. Programkonstruktion och projektuppgifter 10.1 Arbetsgång vid programkonstruktion 10.2 Projektuppgifter

158

Appendix A: ASCII-tabellen

159 159 160

Appendix B: klassen Keyboard Metoder Källkod

164 165 166 167

Appendix C: talbaser C.1 Det binära talsystemet C.2 Det oktala talsystemet C.3 Det hexadecimala talsystemet

168

Svar på repetitionsfrågor

173

Lösningar till övningar

197

Register

111 111

=-

••

Programmering A Java

1. Datorer och program En dator är, som namnet antyder, en maskin som utför databehandling, d.v.s. läser, bearbetar och skriver data. För att kunna utföra detta måste den ges instruktioner. Programmering handlar om att, med hjälp av mer eller mindre användarvänliga språk, få datorn att utföra dessa instruktioner. För att programmera med ett högnivåspråk som Java behöver man inte i detalj känna till hur en dator arbetar. Däremot underlättas arbetet om man har en viss kunskap om datorns olika delar och hur de samverkar med varandra. I det första kapitlet beskriver vi kort datorns viktigaste beståndsdelar och hur ett program lagrat i en vanlig textfil omvandlas till en kod som datorn kan tolka. Vi ger också en kort historik om bakgrunden till programmeringsspråket Javas tillkomst.

1.1 Datorns funktion Det som gör en dator till en sådan användbar maskin är att den har förmåga att lagra stora mängder information och att bearbeta denna med hög hastighet. En dator består i huvudsak av de fyra delar som illustreras i figuren: primärminne, processor, in- och utenhet. Pilarna markerar riktningen på data flödet mellan de olika enheterna. Via en inenhet skickas data till primärminnet. Processorn behandlar sedan dessa data och resultatet kan presenteras på en lämplig utenhet.

Primärminne

Processor

ALU Styrenhet

Primärminne All data som ska bearbetas måste först lagras i primärminnet. Primärminnet är en följd av s.k. minnesceller, var och en med sin bestämda adress som gör det möjligt att komma åt innehållet i den. Man kan jämföra minnet med en stor byrå. Minnescellerna är då byråns lådor och där lagras alltså informationen. För att ett program ska kunna köras måste även det lagras i primärminnet. Programinstruktionerna hämtas och utförs av processorn.

Processor Processorn kallas även för centralenhet eller CPU (från engelskans Central Processing Unit). Den består av två delar, den aritmetisklogiska enheten (ALU) och styrenheten. I den aritmetisklogiska enheten utförs grundläggande aritmetiska operationer som addition och subtraktion och logiska operationer som jämförande av data. Styrenhetens uppgift är att transportera data mellan datorns olika delar.

1. Datorer och program In- och utenhet För att kommunicera med datorn används in- och utenheter. Via inenheter överför man data till primärminnet och utenheter används för lagring eller presentation av resultat. Exempel på inenheter är tangentbord, pekdon, joystick, scanner och diskar, som hårddisk, disketter och CD-skivor. Till utenheter räknas bildskärm, skrivare och olika diskar för lagring av data.

1.2 Programkörning

I

När en dator ska utföra en uppgift måste den ges anvisningar som i detalj förklarar vad som ska göras. Dessa måste ges på ett språk som datorn förstår, s.k. maskinspråk. En instruktion skriven i maskinspråk består aven sekvens av ettor och nollor. De första programmen skrevs direkt i maskinkod och det fungerade bra så länge programmen bara bestod av några hundra instruktioner. För lite längre program blev det besvärligt att hålla reda på alla ettor och nollor. Därför uppfanns de s.k. assemblerspråken där varje instruktion gavs ett förklarande namn. Dessa översattes sedan till maskinspråk av program som kallas för assemblerare. En nackdel med assemblerspråken var att de var olika för olika datortyper. Ett program som skrevs för en datortyp måste alltså skrivas om för att kunna köras på en annan. En annan nackdel var att programmeraren fortfarande var tvungen att tänka i termer av datorns maskininstruktioner när programmen skrevs. När programmen fortsatte att växa i storlek blev även assemblerspråken svåra att hantera. Därför uppfanns högnivåspråken som underlättade behandlingen av mer komplexa problem. ågra av de först utvecklade högnivåspråken var FORTRA ,som användes för naturvetenskapliga tillämpningar, och COBOL, som användes för administrativa och ekonomiska tillämpningar. Andra exempel på högnivåspråk är Pascal, Ada, C, C++ och Java. Dessa språk ligger närmare det mänskliga språket än assemblerspråken vilket underlättar då ett program ska skrivas.

Att skapa ett körbart program Figuren visar de olika steg som måste utföras för att ett program skrivet i något av ovanstående högnivåspråk, Java undantaget, ska kunna köras på en dator.

exekverbar kod

l i"~bj'~k~k~d"':

.......................... ;

• Med ett textredigeringsprogram skrivs programkoden (källkoden) in och lagras i en fil. • Därefter översätts källkoden till maskinkod eller objektkod som den också kallas och även den lagras i en fil. Översättningen görs av ett program som kallas för kompilator.

1. Datorer och program • De flesta program som skrivs idag består av flera olika delar som har kompilerats var för sig. Ett program består alltså av flera objektfiler. Länkaren sätter samman innehållet i objektfilerna och resultatet blir det körbara programmet. Filen som innehåller den körbara versionen av programmet kallas för exekveringsfil. För att skriva egna program måste man alltså ha tillgång till en textredigerare, en kompilator och en länkare. Maskinkoden som genereras av kompilatorn är anpassad till datortypen där källkoden kompileras. Har programmet skapats på en pe med operativsystemet Windows 98 kan det inte köras på en Macintosh med MacOS eller på en dator från Sun med Solaris. Det är möjligt att köra ett program skrivet i ett högnivåspråk på flera olika typer av datorer, men då måste filen med källkod överföras till den andra datortypen och kompileras där. Java skiljer sig från övriga högnivåspråk då det är plattformsoberoende. Ett Javaprogram kan köras på flera olika plattformar, t.ex. Windows, MacOS, Solaris, Linux eller en webbläsare, utan att behöva kompileras om. Orsaken till detta är att Javakompilatorn inte översätter källkoden till en datorspecifik maskinkod utan till s.k. Javabytekod. En interpretator (Java Virtual Machine) kan sedan läsa och utföra instruktionerna i bytekoden. Programmet behöver bara kompileras. Det kan sedan köras på alla plattformar som har en Javainterpretator. Varje gång programmet körs översätter alltså interpretatorn Javabytekoden. En nackdel med detta är att programmen blir långsammare än om de hade varit i maskinkod.

:

_

:

: bytekod : .......................... :

För att skriva och köra ett Javaprogram ska följande punkter utföras. • Med ett textredigeringsprogram skrivs programkoden (källkoden) in och lagras i en fil. • Därefter kompileras källkoden till Javabytekod och även den lagras i en fil. • Instruktionerna i bytekoden utförs aven interpretator. Varje plattform med en Javainterpretator kan tolka instruktionerna i bytekoden. För att skriva och köra ett Javaprogram behövs alltså en textredigerare, en kompilator och en interpretator.

1. Datorer och program

1.3 En kort historik l början av sjuttiotalet arbetade Dennis Ritchie och Ken Thompson vid Bell Laboratories med att ta fram operativsystemet UNIX. Ritchie utgick då från ett av Thompson utvecklat programmeringsspråk vid namn B och skapade 1972 språket C. Syftet var att skapa ett språk som inte bara var användarvänligt utan även utnyttjade datorernas kapacitet på ett effektivt sätt. BASIC, som var populärt då, var mycket lätt att lära sig för nybörjare men var samtidigt ineffektivt. Dessutom hade stora program skrivna i BASIC nackdelen att lätt bli oöverskådliga, eftersom språket flitigt använde sig av hopp mellan olika delar i koden. C hade många fördelar jämfört med redan befintliga språk. C använde en strukturerad programmeringsteknik, som gjorde det lättare att följa programkoden och förstå dess olika delar. Det blev naturligt att arbeta med modulära program, d. v.s. att dela upp större program i ett antal mindre och begripliga moduler. Det var en stor fördel för programmerare, som arbetade i större projekt eftersom det var lätt att överblicka stora program och att dela upp utvecklingsarbetet mellan deltagarna i projektet. Dessutom var det möjligt att optimera koden så att C-program utnyttjade den kapacitet som fanns hos snabba datorer. C växte snabbt i popularitet och har använts för att tillverka åtskilliga program och system världen över. Programutvecklingen gav med tiden allt större och mer komplexa program. l början av åttiotalet började dansken Bjarne Stroustrup vid Bell Laboratories att arbeta med en utveckling av C. Han ansåg att det borde gå att effektivisera C genom att göra vissa tillägg, bl.a. av klasser. Dessa tillägg ledde så småningom fram till så stora förändringar, att språket gavs ett nytt namn, C++. Det blev tillgängligt för allmänheten 1985. Det som framför allt utmärker C++ och skiljer det från C är att det är ett objektorienterat språk. Objekt är sammansatta datatyper som kan lagra en mängd olika egenskaper och använda olika metoder för att bearbeta dessa. Genom att införa objekt blev det lättare att överföra verkliga problem till dataprogram. C++ blev snabbt populärt och är tillsammans med Java, som är en utveckling av C++ , ett av våra största programmeringsspråk. Java släpptes ut på marknaden 1995 av Sun Microsystems. C++ användes som bas, vissa tillägg gjordes och annat plockades bort. Huvudanledningen till att Java skapades var att det fanns behov av ett plattformsoberoende språk för att skriva program till elektroniska apparater som mikrovågsugnar och diskmaskiner. För att en processor ska kunna köra ett program skrivet i exempelvis C++ krävs en kompilator som är anpassad både för processorn och för programmeringsspråket. Det är emellertid dyrt och tidskrävande att tillverka kompilatorer för varje system. Fördelen med program skrivna i Java är att de kan köras på olika typer av processorer. Samtidigt med Javas tillkomst växte WorldWideWeb lavinartat. En mängd olika datortyper med olika operativsystem och processorer kopplades samman i ett enormt nätverk. Java var som klippt och skuret för alla de olika plattformar som var sammankopplade och utvecklas nu i en snabb takt för att möta de nya behov som har uppstått med Internet.

1. Datorer och program

1.4 Studietekniska tips Programmering är ett ämne som du inte kan lära dig bara genom att läsa böcker. Det är absolut nödvändigt att tillbringa många timmar framför datorn för att skriva kod och testa. Du kommer att göra en del fel och misstag och genom dessa kommer du att lära dig mycket. Du kommer att upptäcka att programmeringsproblem kan lösas på många olika sätt och du kommer successivt att lära dig att skriva tydligare, effektivare och bättre program. Den processen är omöjlig om du inte skriver mycket kod och själv provar hur olika lösningar förändrar dina programkörningar. I boken finns det gott om färdiga programexempel. Studera alltid dessa och läs noggrant kommentarerna, som följer efter varje exempel. När du känner att du har förstått vad som händer i varje steg i det program du studerar, gör du den efterföljande övningen. Den är tillverkad för att likna det givna exemplet och syftet är att du ska prova om du kan överföra den teknik du tillägnat dig till ett nytt men ganska likartat problem. När du på detta sätt har gjort klart ett kapitel, läser du sammanfattningen och besvarar de repetitionsfrågor som finns i slutet av kapitlet. Till sist försöker du lösa kapitlets avslutande programmeringsuppgifter som testar dina kunskaper på det du har arbetat med hittills. I läroboken finns det lösningsförslag på de övningar som följer efter varje programexempel. Det finns dessutom svar på repetitionsfrågorna.

Programmering A Java

2. Introduktion till Java I det här kapitlet ska vi diskutera uppbyggnaden av ett enkelt program i Java och de olika typer av fel du kan råka ut för vid programkonstruktion. Vi ska även kortfattat beskriva hur man använder Sun's utvecklingssystem för att skapa ett körbart program.

2.1 Arbetssätt vid programmering Innan du kan börja skriva dina egna program måste du lära dig att använda ett programutvecklingssystem. I detta avsnitt ska vi titta lite närmare på hur de används för att skapa ett körbart program. Det finns flera utvecklingssystem på marknaden, men oberoende av vilket du väljer måste följande steg utföras för att producera ett program. l. Skapa en fil och skriva in programmets text, källkoden. En fil med text till ett Javaprogram kallas för källfil och den ska ha suffixet java. Exempel på ett filnamn kan vara MittProgram.java. 2. Kompilera källkoden, d.v.s. översätta den till Javabytekod. Vid kompileringen skapas en fil som innehåller bytekoden och den får suffixet dass. Den kallas för klassfil. 3. Köra programmet. Programkörning kallas också exekvering. Javainterpretatorn översätter och utför instruktionerna i klassfilen. Låt oss som exempel se hur ovanstående uppgifter utförs på en Windowsplattform med Sun's utvecklingssystem Java 2 SDK. Det har både en kompilator och en interpretator och kan laddas hem från Sun's hemsida utan kostnad. Adressen är www.javasoft.com. Där ges även instruktioner om hur installationen går till och de inställningar som bör göras på din dator. För att skriva ett program behövs även en textredigerare. Vi använder programmet Anteckningar, då det medföljer operativsystemet Windows. Det finns textredigerare som fungerar bättre och på bokens hemsida finns det länkar till några. Fördelarna med dessa är bl.a. att de färglägger och strukturerar programkoden. Instruktionerna nedan beskriver i detalj de steg som ska utföras för att skriva och exekvera ett Javaprogram. Det ger utskriften Mi tt första program i ett kommandofönster på skärmen.

2. Introduktion till Java l. Skapa en källfil. Starta Anteckningar eller någon annan textredigerare och skriv in programtexten nedan. Observera att m och p har skrivits med versaler i Mi t tProgram.

public class MittProgram{ public static void main(String[] args){ System.out.print("Mitt första program"); }

}

Spara filen i valfri mapp och ge den namnet MittProgram. java. Som dialogrutan visar har vi valt att spara filen i en mapp med namnet j avaprogram som ligger direkt under c : . Lägg märke till att filnamnet ska omges med citationstecken. Om citationstecknen utelämnas blir namnet MittProgram.java.txt och då kan filen inte kompileras. En källfil måste avslutas med . java.

613

Spara som

Filnarnn:

1"MiUProgram.iava'l

EiWOlffiat:

ITextdokument

.s.par.3 .

1I

Avbr!!i

2. Kompilera källfilen till en klassfil som innehåller bytekod. Starta ett kommandofönster genom att välja Program> MS-DOS-prompt från Start-menyn (Windows 95/98) eller Program> Kommandotolken (Windows NT). Då visas ett fönster som påminner om detta.

Av prompten C : \ WIN9 8 > framgår att den aktuella mappen är win9 8 på enhet c : . För att kompilera källfilen måste du byta till den mapp där filen finns. Då vi har valt att lägga källfilen i mappen j avaprogram direkt under c: ska vi skriva

cd c:\javaprogram följt aventer. Prompten C: \ javaprogram> visar att vi har hamnat rätt.

l l·72

2. Introduktion till Java Vill vi se vilka filer som ligger i mappen skriver vi kommandot dir och trycker enter. l vårt exempel finns bara en fil, nämligen Mi t tProgram. java.

För att kompilera källfilen skrivs följande:

javac MittProgram.java Namnet på javakompilatorn är javac (java compiler). Då enter-tangenten trycks ned kompileras filen.

:

..

~~



'j

r

_ =- ' .'

r'

'f

~

- -

-

1'._

'l,

En kIassfil med namnet MittProgram.class har då bildats automatiskt. Den innehåller programmets bytekod. Skrivs dir vid prompten kan vi se att mappen har utökats med filen MittProgram.class.

3. För att köra programmet skrivs följande:

java MittProgram Då enter-tangenten trycks ned startar Javainterpretatorn och den exekverar programmet i filen MittProgram. class. Texten Mitt första program skrivs ut i kommandofönstret. • I.'~--

:

"'1'

__

-

-.

.... ::

••

.

-

';

- -

-

-

~

'

Som bilden visar skrivs ett 7 -tecken istället för Ö. Detta beror på att vi har skrivit källkoden i ett Windowsprogram och dess utdata visas i ett DOS-fönster. Även å och ä kommer att visas felaktigt. Om koden istället skrivs med en DOS-editor, t.ex. Edit, kommer alla tecken att visas korrekt.

2. Introduktion till Java

2.2 Ett Javaprograms struktur Nu ska vi titta närmare på programmet från föregående avsnitt. Koden var public class MittProgram{ public static void main(String[] args) { System.out.print("Mitt första program"); }

Alla program i Java har samma grundläggande struktur och då det är ett objektorienterat språk bygger det på s.k. klasser. Vårt program består aven klass med namnet Mi t tProgram. Klassnamnet kan man själv bestämma, men det är god programmeringssed att inleda med en stor bokstav. Beskrivningen av klassen inleds med en vänsterklammer ({) på första raden och avslutas med en högerklammer (} ) på programmets sista rad. Alla Javaprogram, förutom applets (se kapitel 9), har en main-metod och där startar programmet. Orden public, static och void ska föregå main. Anledningen till detta förklaras inte nu utan du får acceptera att de program du skriver ska inledas på detta sätt. Mellan mai n-metodens klamrar skrivs de satser som ska utföras. För att ge en utskrift aven text på skärmen, Mitt första program, skrivs satsen: System. out .print ("Mitt första program") ; Sys tern. ou t är en s.k. ström som är kopplad till bildskärmen och då metoden pr in t anropas skrivs texten, som ska omges av citationstecken, mellan parenteserna ut. Lägg märke till semikolonet. Alla satser i Java avslutas med ett semikolon. I exempel 2.1 visas ett program som ger en utskrift av två meningar. Radnumreringen ingår inte i programtexten. Den har lagts in för att underlätta efterföljande kommentarer.

Exempel 2.1 1. 2.

3. 4. 5. 6. 7.

II Utskrift av två meningar public class Ex21{ public static void main(String[] args){ System. out .print ("Vilket namn ska filen ges? "); System. out .print ("Ex21. java") ; } }

Rad l: För att göra koden i ett program tydligare brukar man kommentera den. En kommentar inleds med teckensekvensen / /. Allt som står på samma rad och bakom /1 hoppas över av kompilatorn. Här kan då förklaringar och andra upplysningar skrivas.

2. Introduktion till Java Rad 2: Klassnamnet är Ex21. Filen med denna klass måste sparas under namnet Ex21 . j ava då dess namn ska vara detsamma som klassnamnet. Rad 3 till 6: Mellan vänsterklammern, {, på rad 3 och högerklammern, }, på rad 6 återfinns programtexten. Satserna mellan klamrarna kommer att utföras i tur och ordning. I vårt enkla program finns det bara två satser och de ger en utskrift på en rad på skärmen. Raderna 4 och 5 kan ersättas med

System.out.print("Vilket namn ska filen ges? Ex21.java"); Då texten var för lång för att rymmas på en rad på sidan skrev vi den på två rader. Alternativt hade vi kunnat skriva

System.out.print("Vilket namn ska filen ges? " + "Ex21.java") ; Utskriften blir fortfarande densamma. Den s.k. + -operatorn kan alltså användas om radbrytning är nödvändig. Rad 7: Här slutar beskrivningen av klassen Ex21.

Övning 2.1 Skriv in programtexten, tecken för tecken, precis som det står. Kompilera sedan och kör programmet. Kom ihåg att filen ska sparas som Ex21 . j ava. Vilka filer har bildats? Byt ut raderna 4 och 5 mot

System.out.print("Vilket namn ska filen ges? " + "Ex21. java") ; Kompilera och kör programmet. Kontrollera att utskriften blir densamma.

Namngivning av klasser Man kan själv bestämma vilket namn en klass ska ha. Det kan bestå av bokstäver, siffror, understrykningstecken och dollartecken. Det får dock inte börja med en siffra.

Olika typer av fel Det är endast i undantagsfall som ett lite större program fungerar första gången det körs. Du kommer att upptäcka att du får ägna en hel del tid åt att leta efter fel i dina program. När man rättar till felaktigheter i ett program säger man att man avlusar, eller debuggar, del. Det kan förekomma tre olika typer av fel i ett program: • kompileringsfel • exekveringsfel • logiska fel Kompileringsfel uppkommer om de språkregler som gäller i Java inte har följts. Exempel

på sådana fel är stavfel (Lex. System. ut .print istället för System. out .print)

2. Introduktion till Java och glömda semikolon eller parenteser. Kompileringsfelen upptäcks av kompilatorn som skriver ut ett felrneddelande. Tyvärr är felmeddelandena inte alltid helt lätta att tolka. Ett annat problem är att ett fel på en rad kan få kompilatorn att upptäcka "felaktigheter" i efterliggande satser trots att de är korrekta. Av denna orsak bör du börja från början i fellistan och rätta till ett fel åt gången. En korrigerad felaktighet i början av programmet kan minska antalet fel meddelanden ordentligt. Som programmerare kommer du att få många kompileringsfel och det är bra att bli bekant med felrneddela ndena tidigt. Lägg därför in några fel i exempel 2.1 och se om du kan tolka felmeddelandena. Pröva t.ex. först med att utelämna semikolonet på rad 4 och därefter med att utelämna void på rad 3 (skriv public static main (String [] args) ). Figuren visar hur ett felrneddelande kan se ut då ett semikolon saknas.

Exekveringsfel är fel som uppkommer först då programmet körs. Programmet är alltså språkligt korrekt, så inga felmeddelanden ges. Ett exekveringsfel gör att körningen av programmet avbryts i förtid. Ett vanligt fel är division med noll. Jämför med en beräkning med miniräknare, du kan slå in 5/0, men beräkningen avbryts och du får ett felrneddelande. Logiska fel gör att programmet kan köras men inte ger det förväntade resultatet. Denna typ av fel är svårast att hitta och korrigera.

Programmeringsstil Det är viktigt att de program du skriver är tydliga och lättlästa. Med en bra struktur kommer bl.a. felsökningen av programmet att underlättas avsevärt. Studera därför bokens exempel noggrant och lägg speciellt märke till hur vi använder oss av blanktecken, tomma rader och indenteringar (indrag av text). Kompilatorn bryr sig inte om dessa tecken och de kan därför användas för att göra programmen mer lättlästa. I exempel 2.1 syns det t.ex. tydligt var main-metoden börjar och slutar, då utskriftssatserna har dragits in. Programmet i exempel 2.1 skulle ha kunnat skrivas på följande sätt, men det är inte att rekommendera, då programmets uppbyggnad inte framträder lika tydligt.

II Utskrift av två meningar public class Ex21{ public static void main(String[] args){ System. out .print ("Vilket namn ska filen ges? "); System.out.print(IEx21.java") ;}}

2. Introduktion till Java Ett program med reserverade tecken och utmatning på två rader I Java är citationstecknet reserverat för att ange var en textsträng börjar och slutar, som exempel 2.1 visade. Om du vill att ett citationstecken ska skrivas ut på skärmen måste det föregås av ett backslashtecken, \. Koden

System.out.print("Ett citationstecken: \"."); ger alltså utskriften

Ett citationstecken:

"

På motsvarande sätt måste ett backslashtecken föregås aven backslash för att kunna skrivas till skärmen.

Exempel 2.2 1. 2. 3. 4.

II Reserverade tecken och utmatning på två rader public class Ex22{ public static void main(String[] args){ System.out.println("Textsträngar omges med" + "\"-tecknet.") ; System.out.print("Ett \\-tecken i en " + "textsträng måste föregås " + "av ett \\-tecken.");

5.

6. 7.

a

Il':·"\'I.,!llldl (llr"p·'. dl"

i

I ji

l

i : "t !. l • 11

l 1 i I ; l'

'.

j .... i t

1"l j l

~

j

II:

t 11 .~.; l'

i

Il ~"

I

,

,,'

!.j

Som körexemplet visar ger teckensekvenserna \ " på rad 4 och \ \ på rad 5 utskrifterna " och \. På rad 4 anropas metoden println. Den skriver ut texten mellan parenteserna och byter rad. Utskriften på rad 5 sker därför på en ny rad.

Övning 2.2 Skriv ett program som ger utskriften inklusive citationstecknen

"To be or not to be. that is the question" Observera den tomma mittraden.

I

2. Introduktion till Java

Sammanfattning Syntax

Beskrivning

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

Den grundläggande strukturen hos ett Javaprogram.

System. out .print ("Textsträng" ) ;

Texten mellan citationstecknen skrivs till skärmen.

System.out.println("Textsträng") ;

Texten mellan citationstecknen skrivs till skärmen och en radbrytning sker.

\" och \\

Citations- och backslashtecknet måste föregås aven backslash för att skrivas till skärmen.

2. Introduktion till Java

Repetitionsfrågor R2.1 Vilka fel finns i programmet nedan?

public class Skriv{ public void Main(String[] args){ System.out.println('Det finns tre fel'); }

}

R2.2 Vilka tre olika typer av fel kan uppstå då man konstruerar ett program? R2.3 Hur ser utskriften från nedanstående kod ut?

System. out .print ("kompilera, "); System.out.println("interpretera") ; System.out.print("och exekvera");

Uppgifter 2.1

Skriv ett program som skriver ut ditt namn och din adress på tre rader på skärmen.

2.2

Skriv ett program som ger utskriften:

JJJ

J

J J

J

J

JJJJJ

JJJ 2.3

J J

J J

J

J

J

J

J

J

J

J

J

J J

J J J

J J

JJJJJ J

J

Skriv ett program som ritar figuren nedan:

\ \

/ /

o

o

u

Programmering A Java

3. Variabler och inmatning Ordet variabel har latinskt ursprung och kommer från variare som betyder skifta. I det svenska språket har ordet bl.a. fått betydelsen föränderlig storhet. I programmering är en variabel en lagringsplats för data. Namnet kommer från att dessa data kan förändras under programkörningen. Vi ska i detta kapitel visa hur variabler används samt metoder för inmatning av data från tangentbordet.

3.1 Datalagring och variabeldefinitioner Programmering handlar till stor del om att hantera data. Ett program tar emot, lagrar, bearbetar och sänder data. All data som hanteras placeras på olika platser i datorns minne. Innan man kan lagra data måste man precisera datatypen genom en variabeldefinition. Det innebär att ett lagom stort minnesutrymme reserveras. Satsen

int tal; är en variabeldefinition som gör att systemet reserverar plats i minnet för ett heltal med namnet tal. Ordet int kommer från engelskans integer som betyder heltal. En bra liknelse är att betrakta minnet som en stor byrå med många lådor av olika storlek. Satsen ovan sätter då etiketten tal på en av lådorna. Man kan också sätta etiketter på flera lådor i samma sats, t.ex. så här:

int tall,

ta12, summa;

Det får till följd att tre utrymmen av typen int reserveras i minnet. En variabeldefinition placerar inget värde i den reserverade lådan. Detta kan göras genom en s.k. tilldelning eller genom en inmatning från exempelvis tangentbordet.

3.2 Tilldelningsoperatorn (=) Innan en variabel får användas måste den ges ett värde. Det kan göras med hjälp av tilldelningsoperatom (=). Under förutsättning att variabeln tal har definierats tidigare kan en sådan tilldelning skrivas:

tal == 23; Detta innebär att lådan med etiketten tal fylls med värdet 23. Tilldelningsoperatorn (=) tilldelar variabeln som står till vänster (kallad lvalue) värdet från den högra sidan (kallad rualue). lvalue måste alltid vara en variabel. Man kan inte skriva

23 == tal;

II ej tillåtet

Ett minnesutrymme kan reserveras och tilldelas ett värde i samma sats. De två satserna

int tal; tal == 23;

3. Variabler och inmatning kan ersättas med satsen int tal

=

23;

Då definition och tilldelning sker i samma sats kallas det för initiering. Ingenting hindrar att värdet hos variabeln ändras vid ett senare tillfälle. Variabeln tal kan användas i en utskriftsats: Systern.out.print(tal);

II inga citationstecken!

Det får till följd att talet 23 skrivs ut, eftersom systemet hämtar information från den lagringsplats som har etiketten tal. Om man vill skriva ut både en text och ett variabelvärde i samma sats kan man skriva så här: Systern.out.print("Vårt tal är " + tal); Man behöver alltså inte upprepa Sys tern. ou t . pr in t i två satser. Man använder istället operatorn + mellan textsträngen och variabeln. Den omvandlar det numeriska värdet hos variabeln tal till en texts träng (i det här fallet" 23") som skrivs ut. Utskriften blir: Vårt tal är 23

Förändring av datainnehåll Det är vanligt att man vill öka en variabels värde med ett. Det kan man göra med satsen

=

tal

tal+1;

Det innebär att tal tilldelas värdet av tal+1. Om vi antar att tal har värdet 23 kommer högerledet, tal +1, få värdet 24, vilket tilldelas variabeln tal. Observera skillnaden mot likhetstecknet inom matematiken. x = x + l saknar matematisk mening eftersom det är en olösbar ekvation. Exempel 3.1 visar några olika tilldelningssatser och avslutas med en sammansatt utskriftssats, där textsträngar och variabelvärden skrivs ut växelvis.

Exempel 3.1 L

2. 3. 4. 5. 6. 7. 8. 9. 10.

II tilldelningsoperatorn public class Ex31{ public static void rnain(String[] args) { int a = 8; int b = 13-a; b = b-a; a = a*a; Systern.out.println("a " + a +" b } }

= "

+ b);

3. Variabler och inmatning

a

Följande händer i tur och ordning: Rad 4: a tilldelas värdet 8 Ca = 8) Rad 5: b tilldelas värdet hos 13 - a Cb = 13 - 8 = 5) Rad 6: b tilldelas värdet hos b - a Cb = 5 - 8 = -3) Rad 7: a tilldelas värdet hos a * a Ca = 8 . 8 = 64) Rad 8: Varje byte mellan utskrift av teckensträng och variabelvärde kräver + -operatorn.

Övning 3.1 Vilka rader ger felmeddelande vid exekvering? Testa om du är osäker.

1. 2. 3. 4. 5. 6. 7.

public class Övning31{ public static void main(String[] args){ int a = 4, b; b = 13-a; 2*b = 10; 12 = a; }

8.

}

3.3 Inmatningar Java är ett programspråk som har sitt största användningsområde vid grafiska presentationer, exempelvis i form av applets på webben. Det är också ett program som ska fungera på alla plattformar och det är förmodligen bakgrunden till att det inte finns några enkla rutiner inbyggda i språket för inmatning av data. Då tal, tecken eller textsträngar ska matas in från tangentbordet till den typen av enkla applikationsprogram som vi arbetar med, är det med andra ord ganska omständigt. Av den anledningen har vi tillverkat en klass, Keyboard, med färdigskrivna programdelar som kan ta hand om dessa inmatningar. Det innebär att du inte behöver fundera över hur det i detalj går till att läsa data från tangentbordet. Du kan istället använda metoderna i den färdiga klassen. Det enda du behöver fundera över är vilken typ av indata som förväntas. För att Keyboard . class ska kunna användas ska du placera den i samma mapp som det aktuella javaprogrammet. Om du skapar nya mappar för dina javaprogram måste du tänka på att placera nya kopior av klassen i dessa. På Gleerups hemsida under nättjänster, under bokens avdelning kan du ladda hem denna fil. Dessutom finns Keyboard som bilaga i slutet av boken. Om du saknar möjligheter att gå in på Gleerups hemsida kan du skriva av den i ett textredigeringsprogram, spara den som Keyboard . j ava och kompilera den med kommandot j avac Keyboard . j ava. Den klassfil som då skapas kan du använda vid inmatningar.

3. Variabler och inmatning All data som matas in måste placeras på någon lagringsplats, t.ex. i en int-variabel. Innan eller i samband med inmatning ska denna variabel definieras. Inmatning av ett heltal kan göras genom int tal; tal = Keyboard.readlnt(); Det går emellertid också bra att slå samman dessa rader till en sats: int tal

I

=

Keyboard.readlnt();

Vi definierar en int-variabel, som ges namnet tal. Genom Keyboard . readlnt ( ) anropas metoden readlnt i klassen Keyboard. Den metoden är skriven för att ta emot data från tangentbordet till en heltalsvariabel. Det inmatade värdet placeras i variabeln tal. För att ta emot decimaltal kan en metod vid namn readDouble istället användas. Variabler som kan lagra decimaltal kan definieras genom satsen double tal; I följande exempel ska vi visa ett par enkla inmatningar.

Exempel 3.2 1. 2. 3. 4. 5. 6. 7. 8.

9. 10.

II inmatning med Keyboardklassen public class Ex32{ public static void main(String[] args) { System.out.print(nMata in ett heltal: n); int tall = Keyboard.readlnt(); System.out.print(nMata in ett decimaltal: n); double ta12 = Keyboard.readDouble(); System.out.println(nDu har matat in talen n + tall + " och" + ta12); } }

~la1 a 111

eH he It al: 7~ fl p ( 1111 a It a I: 5O. 2f J hat Illalat 111 ldlel1 75 orlt 50. 2~

~1 a j.J 111 P H

nu

Varje inmatning följer efter en utskrift, som anger vilken typ av inmatning som förväntas. Då ett heltal ska matas in (rad 5) används metoden readlnt och vid inmatning av ett decimaltal (rad 7) används readDouble. Observera i körexemplet att decimaltal skrives med punkt. Utskriften på rad 8 visar hur vi kan skriva om vi ska kombinera en utskrift aven textsträng och ett variabelvärde. Operatorn + anger att innehållet i den variabel som följer efter strängen ska göras om till en sträng (exempelvis n75 n) och skrivas ut.

3. Variabler och inmatning Övning 3.2 Gör ett program som låter dig mata in tre heltal och som beräknar och presenterar summan av dessa tre tal.

3.4 Variabeltyper Det finns fyra grundtyper av variabler. Dessa är heltal, flytta!, teckenvariabler och boaIska variabler. Precis som namnen antyder innehåller heltalsvariabler heltal och flyttalsvariabler decimaltal. En teckenvariabel innehåller ett tecken, t.ex. en bokstav. Värdet hos en boolsk variabel är sant eller falskt. Det finns fyra olika heltalsvariabler, byte, short, int och long som kan lagra tal av olika storlek. Av samma anledning finns det två flyttalstyper, float och double.

Tabell 3.1 Variabeltyper Heltal

Flyttal

Tecken

Boolsk

byte

float

char

boolean

short

double

int long

Namngivning Program innehåller som regel ett flertal variabler. En god programmeringsstil är att varje variabel ska definieras så nära dess första användning som möjligt och ges ett namn, av vilket det tydligt framgår variabelns betydelse. Första tecknet bör dessutom vara en gemen (liten bokstav). Sammansatta ord markeras ofta med en versal (stor bokstav) som t.ex. kostnadBil och kostnadHus. Det finns tre grundregler som måste följas vid namngivning av variabler: 1. De enda tecken som får användas är bokstäver, siffror, dollartecken och under-

strykningstecknet. 2. Det första tecknet får inte vara en siffra. 3. Språkets reserverade ord får inte användas som namn. Det är dessutom viktigt att känna till att versaler och gemener tolkas som olika tecken och att det inte finns några begränsningar på namnets längd.

3. Variabler och inmatning

-

Heltalstyperna byte, short, int och long Den allra minsta minnesenheten är en cell, vilken rymmer en bit. Innehållet i en sådan cell kan vara en O:a eller en l :a. Beteckningen byte används för en grupp av åtta bitar. Om en byte, d. v.s. åtta bitar, används för att lagra information kan det finnas 28 = 256 kombinationer: 00000000 00000001 00000010

256 kombinationer

11111110 11111111

Om istället två bytes används finns det 2 16 = 65536 kombinationer och om fyra bytes reserveras för en variabel kan den anta 232 = 4 294 967 296 olika värden. Då de heltal som ska kunna lagras också kan vara negativa blir det högsta värdet, som en heltalsvariabel kan hantera, ungefär hälften av antalet kombinationer. En sammanställning av typerna byte, short, int och long visas i tabell 3.2.

Tabell 3.2 Heltalsvariabler

--

Typ

Reserverat utrymme

Talintervall

byte

en byte

-128 till 127

short

2 bytes

-32 768 till 32 767

int

4 bytes

-2 147483 648 till 2 147 483 647

long

8 bytes

-9223372 036 854775808 till 9223 372 036 854 775 807

Systemet varnar som regel inte om man försöker lagra för höga tal. Om ett variabelvärde passerar det högsta tillåtna värdet med ett steg erhåller den istället det minsta värdet ungefär som en klocka går från 23 till 00 på en timme.

-

1101

1100

0100

-

1011

Talen -8 till 7 representerade i fyra bitars binär form.

1010

Om talet 7 räknas upp ett steg erhålls talet -8.

1000

...

3. Variabler och inmatning Flyttalstyperna float och double Flyttalstyperna skiljer sig från heltalsttyperna framför allt genom att de kan representera decimaltal. De kan också representera mycket stora tal och mycket små tal. Det finns två sätt att skriva ut eller mata in flyttal. Det ena är den vanliga decimalformen (Lex. 3.067) och det andra kallas E-notation och bygger på matematikens grundpotensform. Ett stort tal som 5 975 876 301 kan i grundpotensform skrivas 5, 975876301 . 10 9 • I Java skrivs det 5.975876301E9. På motsvarande sätt kan ett litet tal, 0,000 023, skrivas 2,3 . 10-5. I Java skrivs det 2.3E-5. Ett negativt tal som -0,0012 skrives -1.2E-3. E kan bytas mot e. Det finns två olika flyttalstyper som skiljer sig åt avseende noggrannhet (antalet gällande siffror) och storlek. Dessa visas i tabell 3.3.

Tabell 3.3 Flyttalsvariabler Typ

Reserverat utrymme

Talintervall

float

4 bytes

± 3,4 . 10 38

double

8 bytes

±1,7 . 10 308

Antalet gällande siffror är 7 för en float och 15 för en double.

literaler En literai är ett datavärde skrivet som ett tal, exemplevis 3 och 2.75. Java tolkar alla heltalsliteraler som typen int och alla decimaltalsliteraler som typen double. Om man använder andra typer än dessa i sitt program är det lätt att göra misstag så att programmet inte kan kompileras. Exempelvis accepterar inte Java att man skriver

float tal = 2.75; eftersom vänsterledet är av typen float och högerledet är av typen double. Literalen 2.75 kan dock göras om till en float genom att lägga till F eller f efter taleL Satsen accepteras om den istället skrives

float tal

=

2.75F;

Teckenvariabeln char Typen char används primärt för att lagra tecken (Lex. 4, h, Z, + och *). Ett tecken omsluts alltid av två apostrofer i en programkod enligt följande:

char tecken = 'a'; Varje tecken lagras i form av ett heltal enligt en speciell kod kallad Unicode. Den använder 16 bitar för att kunna representera 65 536 olika tecken. Det innebär att bokstäver och symboler från många olika länder kan ingå i Unicode. De första 256 tecknen är identiska med

3. Variabler och inmatning ASCII-tabellen, vilken används i andra språk som Lex. C++ (se bilaga A). Exempelvis representeras tecknet Talet 97 och tecknet 'a' lagrat i binär form. 'a' av talet 97. Genom tilldelningssatsen ovan lagras talet 97 i variabeln tecken. Exempel 3.3 visar hur en char-variabel initieras till ett värde och hur en inmatning av ett tecken kan skrivas.

Exempel 3.3 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

/ / char public class Ex33 { public static void main(String[] args) { char tecken = 'a'; System.out.println(Htecken = H + tecken); System.out.print(HMata in ett nytt tecken: tecken = Keyboard.readChar(); System.out.println(Htecken = H + tecken);

H);

}

-

'Pd.Ptl - CI \1al.l III lf'ckt'11

a

pH tlyil h'rkf'tl: Il Il

-

Variabeln tecken definieras och tilldelas ett värde på rad 4. Lägg märke till apostroferna. På rad 7 får användaren mata in ett nytt värde till variabeln tecken, i vårt körexempel b. Vid inmatning ska inga apostrofer användas. Utmatningen på rad 8 visar att variabeln tecken har fått ett nytt värde.

Övning 3.3 Eftersom tecknet' a' motsvarar talet 97 kan man byta uttrycket char tecken = , a' mot char tecken = 97. Undersök om det går bra. Prova gärna också med andra tal. Du kan också prova att byta en inmatning av b mot talet 98 för att se om det fungerar. Fundera och dra slutsatser.

-

-

3. Variabler och inmatning Esca pe-sekvenser En del tecken kan inte skrivas till programmet på vanligt sätt. Önskar vi åstadkomma en ny rad i en utskriftssats kan vi inte trycka på returtangenten. Det leder bara till en förflyttning en rad ner i programtexten. Det går av samma anledning inte heller att lagra tecknet för Tabell 3.4 Escapesekvenser ny rad i en char genom att använda returtangenKod Effekt ten. Det finns istället s.k. escapesekvenser (escape betyder fly, vilket här kan tolkas som att man flyr ny rad \n från språkets begränsningar för specialtecken) som kan användas istället för speciella tecken eller horisontell tab \t tangenter. Tecknet för ny rad skrives \n, vilket backsteg \b kan stoppas in på de platser i en textsträng där vi önskar åstadkomma en radbrytning. citationstecken Du har redan stött på ett par escapesekvenser i backslashtecken \\ kapitel 2. Tabell 3.4 är en sammanställning av de mest användbara. Satsen (med escapesekvenserna markerade med fetstil för att öka tydligheten) \

II

System.out.print("Sven \ttel: 123456\nAnna\ttel: 654321"); ger utskriften

Sven Anna

tel: 123456 tel: 654321

Datatypen boolean Detta är den enklaste av alla datatyper. En variabel av typen boolean kan bara anta ett av två värden, nämligen true eller fal se. Satsen

boolean vaken = true; medför att variabien vaken tilldelas värdet true. Vi kommer att diskutera denna datatyp närmare i kommande kapitel.

Konstanter De vanligaste konstanterna är våra tal. Talet 12 är alltid talet 12 och kan inte ändra värde. Man kan också lägga till nyckelordet f inal framför en variabeltyp för att skapa en konstant. Den kan inte ändras under exekveringen efter det att den har fått sitt värde. Satserna

final int TARNINGSSIDOR = 6; final double PI = 3.14159; tilldelar variablerna TARNINGSSIDOR och PI värden som inte kan ändras. Konstanter skrivs ofta med versaler.

3. Variabler och inmatning

3.5 Typomvandlingar Ibland är det bra att kunna byta typ på en variabel. Vid en division mellan två heltal blir alltid resultatet ett heltal. Uttrycket 7/2 ger t.ex. resultatet 3. Om vi vill att resultatet aven heltalsdivision ska presenteras i decimalform måste en eller båda heltalsvariablerna typomvandlas. Det kan åstadkommas genom att sätta den önskade variabeltypen inom parentes framför den variabel eller det uttyck som ska typomvandlas. Om tall och ta12 är av typen int så ger följande uttryck en double: (double)tall/ta12; Uttrycket får till följd att tall typomvandlas till en double och det räcker att en av variablerna är en double för att resultatet ska bli en double. Det går också att lägga till ett D eller d till ett heltal och omvandla det till en double. Satserna double tal = 7/2; och double tal

=

7D/2;

ger värdet 3 respektive 3.5 till variabeln tal. Vissa typomvandlingar gör Java automatiskt. Förutsättningen är att ingen information kan gå förlorad. Av den anledningen kan en short omvandlas till en int eller en float till en double automatiskt, eftersom int och double har plats för större tal än short respektive float. Om vi har en short-variabel tall som har värdet 12 är följande sats godkänd: int ta12 = tall; Däremot får vi ett fel meddelande om vi skriver byte ta13

=

tall;

Oavsett om värdet 12 får plats i en byte-variabel så kan information gå förlorad eftersom en short kan innehålla tal upp till 32 767 medan det högsta talet hos en byte är 127. Ibland kan det var användbart att typomvandla en char till en int. Dessa rader ger en utskrift av ASCII-koden och numret i Unicode för tecknet m (l09): char tecken = 'm'; System.out.print((int)tecken); Här följer ett program som utnyttjar diverse typomvandlingar:

-

-

3. Variabler och inmatning

Exempel 3.4 II typomvandlingar 2. public class Ex34{ 3. public static void main(String[] args) { 4. System.out.print("Mata in ett heltal: "); 5. int tall = Keyboard.readlnt(); 6. System.out.print("Mata in ett decimaltal: n); 7. double ta12 = Keyboard.readDouble(); 8. System.out.print("Mata in en bokstav: n); 9. char tecken = Keyboard.readChar(); 10. System.out.println("Vanlig division ger: " + tall/ta12) ; 11. System.out.println("Heltalsdivision ger: " + tall/(int)ta12) ; 12. System.out.println(tecken + " har ASCII-" + "koden" + (int) tecken) ;

1.

13. 14.

} }

Rad 10 ger resultatet aven division i decimalform eftersom ta12 är en double. På rad 11 typomvandlas ta12 till en in t så resultatet blir heltalsdelen av divisionen 21 / 2. Utskriften på rad 12 presenterar ASCIl-koden för tecken genom att typomvandla variabeln från en char till en int.

Övning 3.4 Gör ett program som låter dig mata in tre heltal till variabler av typen int och som beräknar summan och medelvärdet av dessa tre tal. Eftersom medelvärdet kan vara ett decimal måste du göra en typomvandling då det resultatet ska presenteras.

3. Variabler och inmatning

3.6 Fält Då ett program ska hantera flera data av samma typ och som beskriver något enhetligt som löner, längdhopp i en tävling eller vikter hos en grupp individer, är fält (arrays på engelska) mycket användbart. En del föredrar att kalla det för arrayer medan andra säger vektorer. I Java finns det dock en klass som heter Vector och som inte får förväxlas med detta. Vi kommer därför att använda beteckningen "fält" i denna bok. Ett fält kan definieras så här: int[] vikt = new int[30]; Det skapas då utrymme i minnet för 30 int-värden. De får namnen vikt [O], vikt [1] , vikt [2] ... vikt [28] och vikt [29] . Observera att numreringen går från O till 29 och inte från l till 30. Om man vid kodningen inte vet hur stort fält man behöver kan man välja en storlek som säkert räcker för ändamålet. Det spelar sedan ingen roll om inte alla fältpositioner används. De olika fältpositionerna kan fyllas på vanligt sätt, t.ex. genom en tilldelning: vikt[7]

=

82;

/ / (Den åttonde fältpositionen får värdet 82)

Notera att talet i hakparenteserna visar fältets storlek endast vid definitionen. Därefter anger alltid detta tal ett speciellt fältvärde. På samma sätt som vi kan definiera och tilldela en vanlig variabel i samma sats, kan vi initiera ett fält. Satsen double[] hopp

=

{6.78, 7.56,

7.34, 8.02,

6.99,

7.87};

definierar ett fält av typen double och tilldelar det värden. Kompilatorn hittar sex värden och anpassar fältets storlek till det. Du får dock inte skriva en 6:a i hakparentesen. Om inte fältet initieras (ges värden då det definieras) måste man använda new-operatorn enligt ovanstående modell. Det är mycket vanligt att man vill byta plats på fältvärden och det används bl.a. vid sortering. Nästa exempel visar hur man byter plats på två värden i ett fält. 6.78

7.56

7.34

8.02

6.99

7.87

hopp[O]

hopp[1]

hopp[2]

hopp[3]

hopp[4]

hopp[5]

• • •



3. Variabler och inmatning

Exempel 3.5 II fält public class Ex35{ public static void main(String[] args) { int[] vikt = {67, 54}; System.out.println("Innehåll i fältet vikt: " + vikt[O] + " " + vikt[l]);

1. 2. 3. 4. 5.

6. 7. 8.

int temp = vikt [O]; vikt [O] = vikt [1] ; '. .... vikt [1] = temp;.. . "

. ....

"

~

.

. ....................

vikt[O]

vikt[l]

temp

vikt[O]

vikt[l]

temp

vikt[l]

temp

50J_6_7_ . . ., 1_ 60J

·············. . 1 .... ".

"

. ......

__ 54

vikt[O]

9.

System.out.println("Innehåll i fältet vikt: " + vikt[O] + " " + vikt[l]);

10. 11.

}

Illtwll.J111 taltl I \'11.1: f,? 'J I IllllPI1.dll t lJIIl tl.'1tlHllJlllldt pd

G

1~ ~b lP,

[J odllldl ~ hrd,\lavpr.

Strängarna namn och tel skapas samtidigt som de ges värden på rad 5 och 7. Vid utskriften på rad 9 använder vi två av de metoder som finns för stränghantering.

Övning 3.6 Gör ett program som uppmanar användaren att mata in ett engelskt ord och dess svenska översättning. Efter inmatningen ska programmet skriva ut följande mening: "Det engelska ordet ... betyder ... på svenska", där punkterna ersatts av de inmatade orden.

3. Variabler och inmatning

Sammanfattning



Variabler

Typ byte,

Beskrivning short,

int,

long

char float,

Heltalstyper av olika storlek



Typ som hanterar tecken Flyttalstyper av olika storlek

double

boolsk typ med innehållet true eller false

boolean

Fält

Typ typ [] namn

Beskrivning new typ [storlek]

Fält med storlek positioner. Enstaka fältvärden erhålles med namn [n] , där n är ett tal mellan O och storlek-l

Strängar

Typ

Beskrivning

String namn

Ett String-objekt



3. Variabler och inmatning

Repetitionsfrågor R3.1 Beskriv vad orden definiera, tilldela och initiera betyder. R3.2 Beskriv vad som skiljer sig i betydelsen av tecknet' = ' i matematik och i programmering. R3.3 Hur många kombinationer (uttryckt i tvåpotensform) av l:or och O:or kan en, två respek-

tive fyra bytes hantera? R3.4 Vilka av dessa mer eller mindre lämpliga variabelnamn är formellt godkända?

Tal 1 tal_l l_tal tal antalBilar antalBåtar antal-bussar R3.5 Vad är Unicode? R3.6 Beskriv vad ett fält är samt hur det definieras, initieras och tilldelas värden. R3.7 Hur initieras en String-variabel?

Uppgifter 3.1

Definiera två variabler, en double och en char i ett program. Tilldela dem oväntade värden, t.ex. en char respektive en int (exempelvis genom double ta12 = a ' ; och char tecken = 102 i ). Låt avslutningsvis en sats skriva ut variablernas värden. Dra slutsatser. I

3.2

a Skriv ett program som läser in ett tecken och skriver ut tecknets numeriska värde enligt Unicode. b Skriv ett program som läser in ett tal och skriver ut motsvarande tecken enligt Unicode.

3.3

Skriv ett program som med hjälp av typomvandling omvandlar ett inmatat decimaltal till närmsta heltal. Det innebär att exempelvis talet 35.8 ska avrundas till 36.

3.4

Skapa en fältvariabel med plats för 4 decimaltal. Låt användaren mata in dessa under programkörningen varefter programmet ska redovisa medelvärdet av de fyra värdena.

3.5

Skriv ett program där användaren först får mata in ett förnamn och därefter ett efternamn. Låt sedan programmet skriva ut det fullständiga namnet.

Programmering A Java

4. Operatorer Ordet operera kommer från det latinska ordet operari som betyder arbeta. Vanligtvis associerar vi ordet med att (medicinskt) utföra en operation men det används också i betydelsen verka. I programmering är en operator något som verkar på data. Det finns många olika typer av operatorer. Vi ska studera några av de vanligaste.

4.1 Aritmetiska operatorer Det finns fem aritmetiska operatorer. Fyra av dem motsvarar räknesätten addition, subtraktion, multiplikation och division. Den femte operatorn, modulus, används för att beräkna den rest som kan uppstå vid en division mellan två tal. Dessa operatorer presenteras i tabell 4.1.

Tabell 4.1 Aritmetiska operatorer Operator

Symbol

Verkan

Exempel

addition

+

som vanlig addition

3 + 5 = 8

som vanlig subtraktion

4- 7

subtraktion

-3

=

multiplikation

*

som vanlig multiplikation

6 * 4,2

division

/

som vanlig division då minst ett flyttal används, ger heltalsdelen av resultatet då heltal används

23,0/5 = 4,6 23/5 = 4

modulus

%

ger resten vid division

23 % 5

=

=

25,2

3

De tre förstnämnda operatorerna fungerar precis som man kan förvänta sig, liksom division då minst ett av de ingående värdena är flytta!, Lex. en double eller f loa t (se exemplen i tabellen). De värden som operatorn hanterar kallas för operander. Det räcker att en av operanderna är av flyttalstyp för att resultatet ska bli ett flyttal. Heltalsdivision skiljer sig delvis från vanlig division. Om man dividerar 23 med 5 på vanligt sätt blir resultatet ett decimaltal, 4,6. Heltalstyper saknar emellertid decimaler. Det innebär att vid en division mellan två heltal eller heltalsvariabler "kastas" eventuella decimaler bort och uttryckets värde blir bara heltalsdelen. Följden blir att resultatet av heltalsdivisionen 23 / 5 blir 4. .. . Vid division kan det uppstå en rest. Om exempelvis 23 ~ ~. kameler vid ett arv ska delas upp på fem syskon får de fyra kameler var, vilket är resultatet av heltalsdivisionen 23 / 5. • Då återstår det tre kameler. Resten då 23 delas med 5 blir alltså 3. Modulusoperatorn (%) ger resten vid en division. : :

. 23 / 5

4

23 % 5

3

.

4. Operatorer Detta innebär att 23 % 5 = 3. Den får, till skillnad från hur den används i C++ , även användas med flyttal som operander. Exempelvis ger 23.5 % 5 resultatet 3.5. Vi har tidigare sett exempel på hur operatorer används i tilldelningssatser som tal

=

I

tal1+ta12;

men de kan också användas i andra satstyper, t.ex. i en System. out. print-sats: System. out .print (tal1+ta12);

II Värdet av tal1+ta12 skrivs ut.

I exempel 4.1 testar vi ett par av operatorerna, division och modulus.

Exempel 4.1 1. 2. 3. 4. 5. 6. 7. 8.

9. 10. 11.

II aritmetiska operatorer public class Ex41{ public static void main(String[] args) { System.out.print("Mata in tall: "l; int tall = Keyboard.readlnt(); System.out.print("Mata in tal 2: "l; int ta12 = Keyboard.readlnt(); System.out.println(tal1 + "I" + ta12 + " tal1/ta12) ; System.ouLprintln(tal1 + "%" + ta12 +" tal1%ta12); }

= "

+

"+

}

Eftersom variablerna tall och ta12 är av heltalstyp blir resultatet av divisionen på rad 8 ett helta!, 3. Decimalerna kastas bort. Talet 27 kan skrivas 3 . 7 + 6, vilket innebär att 27 % 7 på rad 9 blir 6. Satserna på rad 8 och 9 varvar utskrift av variabler och strängar. Då operatorn + används mellan olika utskriftsdelar är det inte den vanliga additionsoperatorn. Den typomvandlar istället numeriska värden till text och skriver ut den sammanslagna textsträngen.

Övning 4.1 Byt typen int mot double i ovanstående exempel. Vad händer?

4. Operatorer

Ett användningsområde för modulus Det är mycket användbart med en operator som ger resten vid en heltalsdivision. Ett exempel på det är tidsomvandlingar. 100 sekunder kan skrivas om till l minut och 40 sekunder. Minuttalet fås genom heltalsdivisionen 100 / 60, vilket blir 1. De resterande 40 sekunderna erhålles med hjälp av modulusoperatorn genom uttrycket 100 % 60. Exempel 4.2 visar hur en tidsomvandling från sekunder till minuter och sekunder kan skrivas.

Exempel 4.2 1. 2. 30 40 50 6. 70

80 90

II modulusdivision public class Ex42{ public static void main(String[] args) { int tid 800; int min = tid/60~ int sek = tid%60; Systemooutoprintln(tid + " s - " + min + " min" + sek + " s"); }

}

800 s ' 13

a

1t1ltl

20 s

Följande händer: Rad 5: min tilldelas värdet av 800 / 60 vilket blir 13 (med en rest på 20). Rad 6: sek tilldelas värdet av 800 % 60 vilket blir 20. Rad 5 och 6 ger tillsammans tiden i minuter och sekunder (13 min och 20 s).

Övning 4.2 Tillverka ett program som omvandlar en av användaren inmatad tidsangivelse i månader till år och månader.

4. Operatorer

4.2 Tilldelande aritmetiska operatorer En metod att öka värdet hos en variabel har vi studerat tidigare. Satsen

tal = tal+8; ökar värdet hos variabeln tal med 8. Det finns emellertid ett kortare skrivsätt som ger samma resultat:

tal += 8; Vi använder då en operator (+=) som kombinerar addition med tilldelning genom att öka värdet hos variabeln till vänster med värdet hos högerledet. På motsvarande sätt kan vi kombinera de andra aritmetiska operatorerna med tilldelningsoperatorn. Tabell 4.2 visar en sammanställning av de fem operatorer som kombinerar aritmetiska beräkningar med en tilldelning.

Tabell 4.2 Tilldelande aritmetiska operatorer Operator

addera och tilldela

Symbol

+=

subtrahera och tilldela

Exempel

Resultat

tall += ta12

tall = tall + ta12

tall

= ta12

tall

tall

tall * ta12

ta12

multiplicera och tilldela

*=

tall *= ta12

tall

dividera och tilldela

1=

tall 1= ta12

tall = tall I ta12

modulus och tilldela

%=

tall %= ta12

tall

tall % ta12

Exempel 4.3 visar hur operatorn * = kan användas

Exempel 4.3 1. 2. 3. 4. 5. 6. 7. 8. 9.

II tilldelande aritmetisk operator public class Ex43{ public static void main(String[] args) { int produkt = 4; int tal = 5; produkt *= tal; System.out.println( "produkt "+ produkt);

}

4. Operatorer

nrodukt - lO

a

Satsen på rad 6 tilldelar produkt resultatet av produkt * tal, d.v.s. 4 . 5.

Övning 4.3 Förändra exempel 4.3 så att du kan prova de andra operatorerna i tabellen.

4.3 Förändringsoperatorer Det är vanligt att variabelvärden räknas upp eller ner ett steg. Uppräkning kan, som du har sett tidigare, göras med någon av satserna

tal = tal+1; och

tal += 1; Ett kortare skrivsätt för att åstadkomma detta är att använda tillväxtoperatorn (++):

tal++; Vid nedräkning ett steg används minskningsoperatorn (--) på motsvarande sätt. Om variabeln tal har värdet 23 innebär satsen

tal--; att tal får värdet 22. De två förändringsoperatorerna visas i tabell 4.3.

Tabell 4.3 Förändringsoperatorer Operator tillväxt

minskning

Symbol

++

Exempel

Resultat

tal++ eller ++tal

tal = tal + 1

tal- - eller - - tal

tal

tal

1

Som du ser i tabellen kan förändringsoperatorerna placeras både före och efter en variabel. Satsen

tal++; ger samma resultat, d.v.s. att tal räknas upp med l, som

++tal;

4. Operatorer

-

Däremot blir resultaten olika om man skriver int tal = 2; System.out.print(tal++) ;

/ / skriver ut värdet 2

int tal = 2; System.out.print(++tal) ;

/ / skriver ut värdet 3

eller

Den första modellen, med operatorn efter tal, gör att variabelns värde skrivs ut innan det ökar med 1. Den andra medför istället att värdet ökar med l innan det skrivs ut. Allmänt gäller att om operatorn är placerad efter en variabel används variabelns värde innan det räknas upp eller ner. Om den är placerad före räknas variabelns värde upp eller ner innan det används. Programkoden i exempel 4.4 visar detta.

Exempel 4.4 l. 2. 3. 4.

II tillväxtoperatorn public class Ex44 { public static void main(String[] args){ int c = 4; lid tilldelas värdet 4, därefter får c värdet 5 int d = c++; System.out.println("c = " + c + ", d = " + d);

5. 6.

7. 8. 9. 10.

lic får värdet 6, därefter tilldelas e värdet 6 int e = ++c; System.out.println("c = " + c + ", e "+ e); }

r . S. tl I r . b. e' b

Rad 5: När operatorn placeras efter c kallas den postfix. Då används c:s ingångsvärde så att d tilldelas värdet 4. Därefter ökar c:s värde från 4 till 5. Utskriften på rad 6 visar detta. Rad 7: När operatorn placeras före c kallas den prefix. Då ökar dess värde från 5 till 6 innan e tilldelas värdet. Utskriften på rad 8 visar att båda variablerna har fått värdet 6.

Övning 4.4 Tillverka ett program som visar att resultaten blir olika för utskrifterssatserna System.out.print(tal--); och System.out.print(--tal);.

--

-

4. Operatorer

4.4 Relationsoperatorer Relationsoperatorer används för att jämföra två operander. Från matematiken känner du kanske igen olikheter som x> 5, vilket betyder att variabeln x är större än 5. I programmering är uttrycket x > 5 ett villkor som kan vara sant eller falskt, beroende på om x är större än 5 eller inte. Operatorn > jämför de två operanderna. Om villkoret är sant, d.v.s. om x är större än 5, får uttrycket värdet true, annars värdet fal se. Följande ganska meningslösa sats tilldelar värdet true till variabeln test eftersom villkoret är sant: boolean test = (7 > 5)

i

Tabell 4.4 Relationsoperatorer Relationsoperator

Symbol

lika med

Exempel

Värde

3

false

5

skilt från

!=

3 != 5

true

större än

>

3 > 5

false

3 >= 5

false

3 < 5

true

3 = < 15

&&

tid < 19)

Värdet av uttrycket är true endast om båda villkoren är sanna, annars fal se. De logiska operatorerna presenteras i tabell 4.5.

t

4. Operatorer Tabell 4.5 Logiska operatorer Logisk operator

Symbol

Exempel

Värde

OCH

&&

true om båda är sanna, annars false

ELLER

II

true om minst ett är sant, annars false

ICKE

uttryck

false om uttryck är sant, annars true

Vi återkommer med exempel på hur de logiska operatorerna används i kapitel 6.

4.6 Prioritering Om flera operatorer ingår i samma uttryck ska de utföras i en given ordning. Som du kanske känner igen från matematiken utförs multiplikation före addition. Det innebär att uttrycket 2 + 3 . 4 har värdet 14. Vill vi ändra prioritetsordningen kan vi använda parenteser: (2 + 3) . 4 får värdet 20. På samma sätt är det i programmering. Tabellen i sammanfattningen ger prioritetsordningen mellan de operatorer vi har behandlat. Du behöver inte lägga den på minnet eftersom prioriteringsreglerna är valda på ett sådant sätt att de inte ska ställa till några problem. Följande exempel illusterar prioritetsordningen mellan några operatorer.

Exempel 4.5 1. 2. 3. 4. 5. 6. 7.

II prioriteringsregler public class Ex45 { public static void main(String[] args) { int tall = 4+5; int ta12 = 2+3*6; System.out.println("tal1 = " + tall); System.out.println("ta12 = " + ta12);

boolean svar1 = 2+3*27 && 9>8; System.out.println("svar1 = System.out.println("svar2 =

8. 9. 10. ll.

12. 13.

}

}

" "

+ svarl); + svar2);

4. Operatorer

a

Rad 4: 4 + 5 beräknas först. Därefter tilldelas tall detta värde. Rad 5: 3 . 6 beräknas först. Därefter adderas 2. Slutligen tilldelas ta12 detta värde. Rad 8: 3 . 2 beräknas först. Därefter adderas 2 och resultatet blir 8. Sedan görs jämförelsen 8 < 7, vilket blir falskt och svar1 tilldelas fal se. Rad 9: 8> 7 beräknas först till true. Därefter beräknas 9> 8 till true. true && true ger värdet true, som tilldelas svar2.

Övning 4.5 Vilka värden får variablerna i följande ibland något konstruerade satser?

int tall = 5+6%4; int ta12 = (5+6)%4; double ta13 = 5; ta13 *= 2.5+1; Skriv ett program som undersöker det.

I

4. Operatorer

Sammanfattning Operatorer med inbördes prioritetsordning Prioritet

Symbol

Namn

Beskrivning

++

tillväxtoperator, postfix

Ökar operanden med ett

l

minskningsoperator, postfix

Minskar operanden med ett

l

logiskt ICKE

Returnerar true om operandens värde är false

2

tillväxtoperator, prefix

Ökar operanden med ett

2

minskningsoperator, prefix

Minskar operanden med ett

2

*

multiplikation

Multiplicerar operanderna

3

/

division

Dividerar vänster operand med höger

3

%

modulus

Returnerar resten vid division

3

+

addition

Adderar operanderna

4

subtraktion

Subtraherar operanderna

4


=

större än eller lika med

Jämför två operander och returnerar true eller false

S

lika med

Jämför två operander och returnerar true eller false

6

++

4. Operatorer

Symbol

Namn

Beskrivning

Prioritet

!=

inte lika med

Jämför två operander och returnerar true eller false

6

&&

logiskt OCH

Returnerar true om operandernas värden är true

7

II

logiskt ELLER

Returnerar true om minst en operand har värdet true

8

=

tilldelning

lvalue tilldelas värdet hos rvalue

9

*=

multiplicera och tilldela

lvalue tilldelas värdet av lvalue*rvalue

9

/=

dividera och tilldela

lvalue tilldelas värdet av lvalue/rvalue

9

%=

modulusdividera och tilldela

lvalue tilldelas värdet av lvalue%rvalue

9

+=

addera och tilldela

lvalue tilldelas värdet av lvalue + rvalue

9

subtrahera och tilldela

lvalue tilldelas värdet av lvalue-rvalue

9

4. Operatorer

Repetitionsfrågor R4.1 Det finns åtskilliga metoder att öka en variabels värde med 1. Nämn fyra sådana. R4.2 Vad returnerar modulusoperatorn? Vilka tänkbara användningsområden finns? R4.3 Vad är likheten och skillnaden mellan postfix- och prefix-användning av tillväxtoperatorn

++? R4.4 Vilka utskrifter ger följande satser?

double tall = 8; int ta12 = 8; int ta13 = 5; System.out.println(tal1/ta13) ; System.out.println(ta12/ta13) ; System.out.println(ta12%ta13) ; System.out.println(ta12++) ; System.out.println(++ta13) ; R4.5 Vilka utskrifter erhålls av följande satser?

System.out.println(56789*100/100) ; System.out.println(56789/100*100) ; System.out.println( (56789+50)/100*100); System.out.println( (56789+500)/1000*1000); System.out.println( (int) (234.56+0.5)); Ge ett användrtingsområde för de tre sista utskriftsmetoderna.

4.0peratorer

Uppgifter 4.1

Testa dina svar på repetitionsfrågorna 4.4 och 4.5 i ett program.

4.2

Tänk dig följande matematiska gåta: Tänk på ett heltal. Addera l. Multiplicera med 2. Subtrahera 6. Halvera. Addera 3. Subtrahera ditt ursprungliga tal. Nu har du fått talet l!!! Gör ett program som testar om påståendet är sant. Använd huvudsakligen de tilldelande aritmetiska operatorerna. Prova med olika tal. Det tal du tänker på ska matas in från tangentbordet eller bara anges en gång i inledningen av programmet.

4.3

Gör ett program som avrundar ett inmatat tal till hela tusental och skriver ut det. En inmatning av t.ex. 76560 ska avrundas uppåt till 77000.

4.4

Gör ett program som omvandlar ett bråktal till ett tal i blandad form. En inmatning av talet 5/3 ska resultera i talet lj-. En programkörning kan se ut så här:

Mata in täljare: 5 Mata in nämnare: 3 Talet 5/3 blir i blandad form: 1 2/3 4.5

Gör ett program som låter användaren mata in en tid i sekunder. Denna tid ska av programmet omvandlas till en tidsangivelse i timmar, minuter och sekunder.

Programmering A Java

5. Algoritmer och kontrollstrukturer En algoritm består av ett begränsat antal instruktioner som ska utföras för att lösa ett problem. De program du har arbetat med är algoritmer skrivna i språket Java. Om samma instruktioner uttrycks på vanligt språk kallas det istället för pseudokod. Pseudokod används för att få struktur på hur ett problem ska lösas innan den översätts till ett programspråk, Lex. Java. Ett annat sätt att illustrera en algoritm är att använda sig av strukturdiagram. Det består av ett antal symboler sammanbundna med pilar som tillsammans illustrerar hur en uppgift löses. Varje symbol representerar en speciell instruktion. Det finns olika metoder för att påverka i vilken ordning och hur många gånger instruktioner ska utföras. Dessa metoder kallas för kontrollstrukturer. KapitelS ger en liten inblick i hur algoritmer skrivs i pseudokod, hur kontrollstrukturer påverkar genomförandet av instruktioner och hur strukturdiagram används.

5.1 Algoritmer och pseudokod Vi ska börja med att titta på en algoritm, som är skriven i programkod:

double tall, tal2; System.out.printl"Mata in tall: "); tall = Keyboard.readDouble(); System. out .print ("Mata in tal 2: "); tal2 = Keyboard.readDouble(); double summa = tall + tal2; System.out.println("Summan av talen blir" + summa); Algoritmen är en del av ett program som låter användaren mata in två tal och som beräknar och skriver ut summan av dessa tal. Samma algoritm kan uttryckas på följande sätt: Läs in två tal. Beräkna summan av talen. Skriv ut summan.

När ett antal instruktioner presenteras på den här formen kallas det för pseudokod. I det här exemplet översatte vi programkod till pseudokod men normalt går man åt andra hållet, d. v.s. utgår från en pseudokod och översätta den till programkod. Då en större uppgift, som kanske består av flera delproblem, ska lösas, är det bra att först strukturera uppgiften med hjälp av pseudokod. Fördelen är att man inte behöver grubbla över hur programkoden ska skrivas utan helt och hållet kan koncentrera sig på hur problemet ska lösas. Först när den processen är avslutad översätts pseudokoden till något lämpligt programspråk. I de kommande kapitlen och i synnerhet i de avslutande projektuppgifterna finns det anledning att använda pseudokod innan kodningen påbörjas.

5. Algoritmer och kontrollstrukturer Övning 5.1 Översätt följande pseudokod till programkod och kör programmet.

Läs in tre tal. Multiplicera talen med 2, 3 respektive 4. Addera resultaten. Skriv ut slutvärdet.

5.2 Kontrollstrukturer Det finns tre kontrollstrukturer:

I

• sekvens eller följd • selektion eller val • iteration eller upprepning

Sekvens De program, som du hittills har skrivit, består aven serie instruktioner som utförs i tur och ordning. En sådan struktur kallas för sekvens. Det är den allra vanligaste kontrollstrukturen och förekommer i alla program. Satserna utförs utan undantag i den ordning de kommer.

Selektion Selektioner används för att styra hur en programkörning ska fortsätta då det finns olika vägar att välja. Du stöter på det i de allra flesta program du använder. Exempelvis kan du få markören att förflytta sig åt olika håll beroende på vilken piltangent du trycker ned då du skriver programkod. Du har gjort ett val då du trycker ner tangenten och det avgör hur programmet fortsätter. Vi behandlar den här kontrollstrukturen i kapitel 6.

Iteration Iteration betyder upprepning. Det finns ofta anledningen att låta ett antal satser utföras flera gånger, att itereras. Programkörningen gör då ett hopp tillbaka till en tidigare sats, varvid de efterföljande satserna utförs en gång till. Hur många gånger dessa ska upprepas kan vara förutbestämt, men det kan också styras av vad som händer under programkörningen. När iterationen är avslutad fortsätter programmet med den sats som följer närmast efter iterationssatserna. Kapitel 7 visar hur denna kontrollstruktur används.

4

_

5. Algoritmer och kontrollstrukturer

5.3 Strukturdiagram För att illustrera hur ett program arbetar används ibland strukturdiagram eller flödesplaner, som det också kallas. Dessa diagram bygger på att varje algoritm kan delas upp i ett begränsat antal instruktioner. Varje instruktion illustreras aven symbol och dessa förbinds med pilar. Diagrammet ger på detta sätt en överskådlig bild av vad som händer då programmet körs.

(

J Start eller stopp

Något utförs

Ett val mellan två alternativ

Det finns olika symboler för olika ändamål, vilka illustreras i figuren. Rektangeln med de avrundade hörnen används för att beteckna start- respektive slutpunkt för programmet. Den vanliga rektangeln symboliserar en beräkning eller att någonting utförs. Romben illustrerar att ett val ska ske mellan två alternativ. Om det finns fler än två valmöjligheter görs upprepade val mellan två alternativ. Figuren ger en bild av de tre kontrollstrukturerna sekvens, selektion och iteration. Observera att alla tre har en "ingång" och en "utgång".

sekvens

selektion

iteration

Vi ska titta på hur tre uppgifter kan omsättas till pseudokod och strukturdiagram.

5. Algoritmer och kontrollstrukturer Sekvens Det första exemplet hämtar vi från avsnitt 5.1. Summan av två inlästa tal ska beräknas och skrivas ut.

Exempel 5.1 Pseudokod:

Strukturdiagram:

Läs in två tal. Beräkna summan av talen. Skriv ut summan.

summa = tal1 + tal2

a

Detta är ett exempel på en sekvens, vilket också framgår av diagrammet. Instruktionerna i rutorna bör skrivas så kortfattat och enkelt som möjligt men samtidigt på ett sätt som tydligt visar vad som ska utföras.

Övning 5.2 Tillverka pseudokod och strukturdiagram för uppgiften att omvandla en tidsangivelse i timmar, minuter och sekunder till endast sekunder.

5. Algoritmer och kontrollstrukturer

Selektion I exempel 5.2 ska vi se hur man beskriver en valsituation med hjälp av pseudokod och strukturdiagram. Uppgiften är att jämföra två inmatade tal och skriva ut det tal som är störst.

Exempel 5.2 Pseudokod:

Strukturdiagram:

Läs in två tal, tall och ta12. Om tall är större än ta12

skriv ut tall annars

skriv ut ta12.

a

Efter inläsning av två tal jämförs dessa. Hur programmet fortsätter beror av resultatet. l pseudokoden har vi uttryckt det på formen om-annars och gjort ett indrag av texten som beskriver det som ska utföras under respektive alternativ. I diagrammet skriver vi ett uttryck som är sant eller falskt i romben och låter pilar visa de två vägar som programmet kan ta. Observera att vägarna möts igen innan programmet avslutas. Detta är nödvändigt. Då ett program kan ta två vägar måste dessa förr eller senare mötas igen.

Övning 5.3 En affär ger 10% rabatt på lösviktsgodis om vikten överstiger S hg. Skriv pseudokod och rita ett strukturdiagram för en algoritm som ger kostnaden för ett inköp. Programmets indata är vikten i hg och priset per hg.

5. Algoritmer och kontroll strukturer Iteration I det avslutande exemplet är uppgiften att läsa in summera ett antal tal. Då talet O matas in ska inmatningen avslutas och summan skrivas ut.

Exempel 5.3 Pseudokod:

Strukturdiagram:

Ge summa startvärdet O. Läs in tal. Upprepa så länge tal inte är O Öka summa med värdet hos tal. Läs in tal. Skriv ut summa.

I

falskt

G

Först ges variabeln summa startvärdet O. Efter inläsning av det första talet undersöks dess värde. Om det inte är lika med O räknas summa upp med värdet hos det inmatade talet. Därefter sker en ny inläsning. Så länge som inte talet O läses in, upprepas uppräkningen av summa och inläsningen av tal. I pseudokoden har vi uttryckt det på formen "upprepa så länge ... " och gjort ett indrag av den text som beskriver det som ska upprepas. Inuti romben i diagrammet skriver vi uttrycket tal ! = O (tal är inte lika med O). Om det är sant går programmet nedåt i diagrammet och återvänder sedan till romben. När talet O har matats in blir uttrycket falskt och programmet går til\ rutan Skriv summa. Observera att det bara finns en utväg från iterationen.

Övning 5.4 Skriven pseudokod och rita ett strukturdiagram för algoritmen att skriva ut talen 10, 9, 8, ... 2 och 1.

d

5. Algoritmer och kontrollstrukturer Pseudokod och strukturdiagram i praktiken Pseudokod och strukturdiagram är bra att använda på det sätt som vi har visat då mindre problem ska analyseras. Då programmerare arbetar med lite större uppgifter går det inte att rita den här typen av strukturdiagram. Om varje instruktion ska få en ruta blir det alldeles för omfattande för att kunna överblickas. Tänk dig själv att rita ett strukturdiagram med 10000 instruktioner. Pseudokod är ett mer flexibelt sätt att beskriva en algoritm. En rad i koden kan beskriva allt från en enstaka instruktion till en större uppgift. Fördelen med strukturdiagram är att det tydligt visar hur instruktionerna i ett mindre program utförs.

Sammanfattning Begrepp

Beskrivning

algoritm

En serie instruktioner·för att lösa en given uppgift.

pseudokod

En algoritm skriven på vanligt språk.

stru kturdiagram

En grafisk presentation av hur en uppgift löses steg för steg.

sekvens

En följd av instruktioner som utförs i den ordning de står.

selektion

Ett val mellan olika vägar att fortsätta en programkörning.

iteration

En upprepning av ett antal instruktioner.

I

5. Algoritmer och kontrollstrukturer

Repetitionsfrågor RS.l Vad är en algoritm? RS.2

ämn tre olika sätt att uttrycka en algoritm.

RS.3 Vad kallas den kontrollstruktur som har använts i de program, som du har arbetat med i

de tidigare kapitlen?

5. Algoritmer och kontrollstrukturer

Uppgifter 5.1

En försäljare har en grundlön på 15000 kronor i månaden. Dessutom tillkommer 8% på försäljningssumman. Skriv pseudokod och tillverka ett strukturdiagram för en algoritm som ger försäljarens månadsinkomst.

5.2

Skriv pseudokod och rita ett strukturdiagram för en algoritm som läser in två tal och undersöker om det första är jämnt delbart med det andra (Om du dividerar det första med det andra får du ingen rest).

5.3

För att tillverka ett program, som ger en av användaren önskad multiplikationstabell, skrivs följande pseudokod. Omsätt den till ett strukturdiagram. Läs in tal. antal = 1. Upprepa så länge an tal är mindre än 11. skriv ut an tal * tal. öka an tal med 1.

5.4

Vilken uppgift löser algoritmen i strukturdiagrammet?

forbrukn = 10*literBensin/antaIKm

Programmering A Java

6. Villkorssatser Dagligen hamnar vi i valsituationer. Ska vi gå på bio? Vilken film ska vi se? Ska vi ta cykel eller buss? I de allra flesta program vi arbetar med, görs också många val under programmets gång. Beroende på bl.a. användarens agerande, tar programmet olika vägar. Man kan likna ett program med en resa. Om vi ska färdas mellan två orter finns det oftast flera vägar att välja. Vägvalet är kanske inte klart vid resans början utan händelser som inträffar under dess gång får avgöra vilken väg vi väljer. I detta kapitel ska vi diskutera de satser som används för att hantera valsituationer.

6.1 if-else Vi ska börja med att visa hur ett program behandlar ett val mellan två alternativ. Om ett givet villkor är uppfyllt ska programmet välja en väg, annars en annan. Formen för detta val är

if (uttryck) sats_l else sats_2 Ut tryck är vanligtvis ett villkor som är sant eller falskt. Om det är sant utförs sa ts_l men inte sats_2. Är det falskt utförs endast sats_2. Vi ska överföra en vanlig valsituation från vardagslivet till ett program. Mia, som börjar bli lite trött, tittar på klockan. Om den är mer än 22.00 tänker hon gå och lägga sig, annars sätter hon sig och läser en god bok. Innan vi skriver programkoden ska vi se hur pseudokoden och strukturdiagrammet kan se ut. Mata in tiden. Om tid är större än 22 skriv: "Gå och lägg dig!" annars skriv: "Läs en bok!':

Skriv "Gå och lägg dig!"

6. Villkorssatser

Exempel 6.1 II if-else 2. public class Ex61{ 3. public static void main(String[] args) { 4. System. out .print ("Hur mycket är klockan? "); 5. double tid = Keyboard.readDouble(); 6. if (tid> 22) 7. System.out.print("Gå och lägg dig"); 8. else 9. System.out.print("Läs en bok"); 10. }

1.

11.

}

Uur 111yrk P I.H kl(frldtl'} /l. lO l;,j Ilf IlI.H)f! dill

Villkorssatsen börjar på rad 6 och slutar på rad 9. Den testar om värdet hos variabeln tid är mer än 22, Om detta är sant utförs satsen på rad 7, annars utförs satsen på rad 9, Det hade varit möjligt att skriva allt på en och samma rad men läsningen av programmet underlättas av denna modell. Senare ska vi bygga på med fler satser och då är det viktigt att ha en tydlig och lättläst struktur på programkoden.

Övning 6.1 Gör ett program som ställer frågan: "Vill du testa en villkorssats? (j/n)" och som vid svaret 'j' skriver "Du svarade ja. Det fungerar!". Annars blir utskriften "Du svarade nej. Var det sant?".

6. Villkorssatser if-else med flera satser Tänk dig att vi vill bygga på exempel 6.1 med ytterligare en utskriftssats:

System.out.println(" och ta dig en kopp kaffe."); Avslutningen på programmet får då följande utseende:

6. 7. 8. 9. 10.

if (tid> 22) System.out.print("Gå och lägg dig"); else System.out.print("Läs en bok"); System. out.println (" och ta dig en kopp kaffe.");

Är tid mindre än eller lika med 22 blir resultatet av programkörningen

Läs en bok och ta dig en kopp kaffe. Är däremot tid större än 22 blir uppmaningen

Gå och lägg dig och ta dig en kopp kaffe. Det kanske inte är vad vi hade tänkt oss. Om villkoret är sant exekveras rad 7 samtidigt som rad 9 hoppas över, eftersom den kommer direkt efter else. Rad 10 exekveras däremot oavsett vilket val som görs. Det är bara den sats som kommer närmast efter i f respektive else som påverkas av villkorets värde. Det finns naturligtvis en lösning på detta. Då flera satser ska utföras inom ett och samma valaiternativ binds dessa satser samman med klamrar.

if (uttryck){ sats a_l sats a_2

}

else{ sats b_l sats b_2

}

Satserna a_l, a_2 o.s.v. utförs då uttrycket är sant. Satserna b_l, b_2 o.s.v. hoppas över. Är uttrycket falskt gäller det omvända. Det är bra att ta för vana att använda klamrar även om bara en sats ingår i ett valaiternativ. Det inträffar ofta att man lägger till satser i efterhand och då är det lätt att glömma klamrarna. En utbyggnad av programmet från exempel 6.1 kan istället göras på följande sätt:

6. Villkorssatser

Exempel 6.2 1.

II if-else med klamrar

2. 3. 4. 5. 6. 7.

public class Ex62{ public static void main(String[) args) { System.out.print(nHur mycket är klockan? n); double tid = Keyboard.readDouble(); if (tid> 22) { System.out.print(nGå och lägg dign);

8.

}

9. 10. 11.

else{ System.out.print(nLäs en bokn); System.out.println(n och ta dig en n + nkopp kaffe. n); }

12. 13. 14.

}

HU t ttl Yr k p i .l t kI or 1.;. t1";' [,d orh Idqq dlq

n

l r,

Satser som ingår i samma valaiternativ placeras innanför klamrar. Följden blir att utskriften på rad 11 bara utförs tillsammans med den på rad 10 om tid inte är större än 22. Programmet fortsätter därefter i båda fallen på rad 13, vilket innebär att programmet avslutas. Lägg märke till hur raderna vänsterjusteras för att programmet ska bli lättläst. Det framgår tydligt vilka satser som hör ihop.

Övning 6.2 Marcela är ute och kör bil. Tanken rymmer 50 l. Priset per liter är 9,50 kronor. Skriv ett program som frågar efter hur mycket bensin det finns i tanken. Om mängden är mindre än 10 liter ska programmet presentera en utskrift, där det framgår att hon bör tanka, hur mycket hon kan fylla på och vad det kostar att få full tank. Är mängden minst 10 liter innehåller utskriften bara en uppmaning att köra vidare.

6. Villkorssatser if-else-satsen med den logiska operatorn && Vid sammansatta villkor måste en eller flera logiska operatorer användas. Låt oss illustrera detta i ett program som klassificerar en pudel. En pudel får bara kallas dvärgpudel om dess mankhöjd ligger mellan 28 och 35 cm.

Exempel 6.3 II if-else med den logiska operatorn && public class Ex63{ public static void main(String[] args) { System. out. print ( "Ange pudelns mankhöj d: "); double höjd = Keyboard.readDouble(); if (höjd> 28 && höjd < 35){ System. out. println ( "En dvärgpudel.") ;

1.

2. 3. 4. 5. 6. 7. 8.

}

9. 10.

else{ System.out.println("Inte en dvärgpudel.");

11.

}

12. 13.

}

\tiljf' flilii"li;'"

III.mUl' Ifl.

,)q

hll!··.Hf'111Ii~,·i

a

Genom att använda &&-operatorn blir uttrycket på rad 6 sant endast för mankhöjder mellan 28 och 35 cm.

Övning 6.3 Personer mellan 15 år och 65 år åker stadsbuss för 10 kronor. För övriga är taxan 5 kronor. Gör ett program som efterfrågar en resenärs ålder och som sedan skriver ut avgiften. Lös uppgiften med hjälp av &&-operatorn.

if-else-satsen med den logiska operatorn " Vi ska även illustrera hur II-operatorn kan användas i ett exempel som illustrerar att en golfspelare måste slå ett slag som är kortare än 150 meter eller längre än 190 meter för att undvika en vattenfylld damm.

6. Villkorssatser

Exempel 6.4 1. 2. 3. 4. 5. 6. 7. 8. 9.

10.

II if-else med den logiska operatorn I I public class Ex64{ public static void main(String[] args){ System.out.print("Hur långt blev slaget? double längd = Keyboard.readDouble(); if (längd < 150 I I längd> 190){ System.out.println("Grattis!"); } else{ System.out.println("Ingen höjdare!");

11.

12. 13 .

• Hut lal1qi ble\' slagpj? 155 111 fl P 11 fl o IlJ...H (' I

a

Genom att använda II-operatorn blir uttrycket på rad 6 sant om längd är mindre än ISO eller större än 190. Inget av dessa villkor var uppfyllIt i vårt körexempel.

Övning 6.4 Personer som är yngre än IS år eller äldre än 65 år åker stadsbuss för S kronor. För övriga är taxan 10 kronor. Gör ett program som efterfrågar en resenärs ålder och som sedan skriver ut avgiften, Lös uppgiften med hjälp av II-operatorn.

6.2 if Om vi inte vill ha en alternativ väg utan valet står mellan att utföra ett block av satser eller inte kan else-satsen lämnas tom eller utelämnas helt. Formen blir då if (uttryck) { satser }

Vi illustrerar detta i ett exempel om ett inköp. Om pengarna i börsen inte räcker måste man ta ut pengar på någon automat (om man inte handlar på kort och banken är stängd). Räcker pengarna, avstår man från uttaget.

6. Villkorssatser

Exempel 6.5 1.

2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

II if public class Ex65{ public static void main(String[] args) { System.out.print("Hur mycket pengar har du? "); double pengar = Keyboard.readDouble(); System.out.print("Hur mycket kostar det? "); double kostnad = Keyboard.readDouble(); int uttag = O; if (pengar < kostnad) { II Detta fattas i kronor. double skillnad = kostnad-pengar; II Ger hundratalssiffran. int hundratal = (int) (skillnad1100); II Ger uttag i hela hundratal. uttag = (hundratal+1) *100; System.out.println("Ta ut " + uttag + " kronor.");

14. 15.

}

System.out.println("Efter köpet återstår" + (pengar+uttag-kostnad) + " kronor.");

16. 17.

} }

Hurmyckelpe"Qdrhardu 7 2~O Hur myckel koslar deP SY8 Td ul ,WO krotIOr. [fler kopel alersl,,}r 'V. O krotlor.

På rad 8 initieras variabeln u t tag till O, eftersom inget uttag har beslutats på det stadiet. Villkorstestet på rad 9 undersöker om det är för lite pengar. Är detta sant utförs satserna på rad 10 till 13. Utskriften på rad 15 görs alltid. Konstruktionen på rad 10 till 12 kräver nog en förklaring: Det är lättare att förstå vad som händer om vi provar med lite värden. Låt oss anta att kos tnad är 598 och pengar är 240. Differensen räknas ut i rad 10. Den blir 358. För att få hundratalssiffran av 358 delar vi med 100 (ger 3,58) samt typ omvandlar till en int (ger 3) i rad Il. 300 kronor ligger emellertid under det erforderliga beloppet så i rad 12 adderas 1, varvid hundratalssiffran blir 4. Samma rad avslutas med en multiplikation med 100 vilket då ger beloppet 400 kronor.

6. Villkorssatser Övning 6.5 För att slå klubbrekord i en längdhoppstävling måste hoppet vara längre än 7,92 och vindstyrkan högst 2,0 m/s. Skriv ett program som låter användaren mata in värden och som skriver "Grattis!" om det är ett nytt rekord.

6.3 if-else if Med en if-else-sats kan man bara hantera ett val mellan två olika alternativ. Ibland är det inte tillräckligt. Många situationer är sådana att valet står mellan tre eller fler alternativ. Vi ska visa detta i ett program som räknar ut portot för ett brev. Tabellen visar hur portokostnaden beror av vikten. Vikten är uppdelad i tre intervall, vilket innebär att en if-else-sats inte räcker för att beräkna portot. 0-20 5 Vi kan först låta programmet testa om vikten är mindre än eller lika med 20. Är resultatet falskt, vilket 20 - 100 10 innebär att vikten överstiger 20, måste ytterligare ett 100 20 villkor undersökas. Pseudokoden ser ut så här: Läs in vikt. Om vikt mindre än eller lika med 20 porto = 5 annars om vikt är mindre än eller lika med 100 porto = 10 annars porto = 20 Mata ut porto-värdet.

I vårt exempel ska programmet välja ett alternativ av tre möjliga. Vid flera successiva jämförelser används med fördel if-else if-satsen. Den allmänna formen är: if (uttryck_l) { satser 1 }

else if (uttryck_2) { satser_2 }

else if (uttryck_3){ satser 3

else{ satser }

6. Villkorssatser Programmet undersöker varje uttryck tills det hittar ett som är sant, varvid tillhörande satser utförs. Efterföljande testvillkor hoppas över. Om exempelvis u t tryck_1 är falskt och uttryck_2 och uttryck_3 är sanna utförs endast satser_2. Satserna i det avslutande else-blocket utförs om inget villkor är sant. Detta block är inte obligatoriskt och kan i vissa fall utelämnas. u är det dags att se på programkoden.

Exempel 6.6 1. II if-else if 2. public class Ex66{ 3. public static void main(String[] args) { 4. System.out.print("Mata in brevets vikt: "); 5. double vikt = Keyboard.readDouble(); 6. double porto; 7. if (vikt ta12 ? tall : ta12;

Du kan läsa satsen så här: Om tall är större än ta12, tilldelas variabeln max värdet hos tall, annars värdet hos ta12. Motsvarande kod om en if-else-sats används blir if (tall> ta12) { max tall; }

else{ max = ta12; Villkorsoperatorn ger alltså en mer kompakt kod. Ett program som utnyttjar villkorsoperatorn för att hitta det största av två tal kan se ut så här:

6. Villkorssatser

Exempel 6.9 1. 2. 3. 4. 5. 6. 7. 8. 9.

II Villkorsoperatorn ? : public class Ex68{ public static void main(String[] args) { System.out.print("Mata in tall: "l; int tall = Keyboard.readlnt(l; System.out.print("Mata in tal 2: "l; int ta12 = Keyboard.readlnt(l; int max = tall> ta12 ? tall: ta12; System.out.println("Det största talet är " + max) ; 10. } 11.

}

~1 a i

n

i el I l: i.J I .>: 11 Del \tor\td talet ar 31

a

111

~1 d l el 111

a

På rad 8 jämförs tall och ta12 och resultatet av den jämförelsen avgör om max tilldelas värdet från tall eller ta12.

Övning 6.9 Gör ett program som skriver ut det minsta av två inmatade tal.

Utskriftssats med villkorsoperatorn I följande exempel ska vi se hur ett villkorsuttryck kan integreras i en utskriftssats.

Exempel 6.10 1. 2. 3. 4. 5. 6.

7. 8.

II Villkorsoperatorn ? : i en utskriftssats public class Ex21{ public static void main(String[] args) { System.out.print("Hur många bilar har du? "); int antal = Keyboard.readlnt(l; System.out.println("Du angav" + antal + (antal == 1 ? " bil." : " bilar."l);

}

el

6. Villkorssatser

11111 111.1111, .. hil.1I fl.Jt dll'" 111) -11111·-1\' : hil.l!.

a



Utskriften på rad 6 ska avslutas med strängen" bil." eller" bilar." beroende på värdet hos variabeln antal. Villkorsuttrycket innanför parenteserna ska läses så här: Om antal har värdet l skriv ut "bil. ", annars" bilar. ".

Övning 6.10



Gör ett program som frågar efter ditt kön och som ger svarsalternativen m och k. Därefter ska utskriften bli: "Du är en man" eller "Du är en kvinna", beroende på om du matat in ett 'm' eller inte.

6. Villkorssatser

Sammanfattning Syntax

Beskrivning

if (uttryck) { satser

Om uttryck är sant utförs satser.

if (uttryck) { satser_1

Om uttryck är sant utförs satser_l, annars satser 2.

}

else{ satser 2 }

if (uttryck _1) { satser 1 }

else if (uttryck _2){ satser_2

Om uttryck_1 är sant utförs satser_l, annars om uttryck_2 är sant utförs satser_2 o.s.v. Är alla uttryck falska utförs satser i else-blocket.

}

else{ satser }

switch (heltalsuttryck){ case konstant 1: satser_1 breakj case konstant 2: satser_2 breakj

default: satser }

Om heltalsuttryck är lika med konstant_1 utförs satser_l, om det är lika med konstant_2 utförs satser_2 o.s. v. Påträffas ingen likhet utförs sa tser i defaul t-blocket.

6. Villkorssatser



Repetitionsfrågor



R6.1 Ibland ska flera satser utföras vid ett val mellan olika alternativ. Hur binds dessa satser

samman till ett block? R6.2 Hur översätts "om vikt ligger mellan 60 och 70, öka antal med l" till programkod? R6.3 Hur översätts "om vikt är mindre än 60 eller större än 70, minska antal med l" till

programkod? R6.4 Hur översätts "om tall är lika med ta12, tilldela tall värdet hos ta13" till program-

kod? R6.S Det finns exempel när en if-else if-sats inte kan ersättas aven switch-sats.

• • •

• •

Ge ett sådant exempel. R6.6 Skriv om följande med hjälp aven if-else if-sats.

if

(uttryck_1){ sats 1



}

else{ if (uttryck_2) { sats_2 }

else{ sats 3 }

R 6.7 Hitta alla misstag i följande program: public class StörstaTal{ public static void main(String[] args){ System.out.print("Mata in t a l l : "); double tall = Keyboard.readDouble(); System.out.print("Mata in tal 2: "); double ta12 = Keyboard.readDouble(); System.out.println("Här kommer talen i " + "storleksordning: "); if (tall => ta12); System.out.println("tall " + tall) ; System.out.println("ta12 " + ta12); else { System.out.println("ta12 " + ta12) ; System.out.println("tall " + tall); } }



6. Villkorssatser R6.8 Tre av satserna i vänsterspalten (som använder logiska operatorer) har precis samma inne-

börd som tre i högerspalten (utan logiska operatorer) . Para ihop de som har samma innebörd.

A

B

1

if (uttryck_l && uttryck_2) sats

if (uttryck_l) sats else if (uttryck_2) sats

2

if (uttryck_l sats

3

if (uttryck_l) sats - 1 if ( !uttryck_l) sats 2

if (uttryck_l) if (uttryck_2) sats

4

if (uttryck_l && uttryck_2) { sats - 1 sats 2

if (uttryck_l) sats 1 else sats 2

}

II

uttryck_2)

if (uttryck_l) sats_l if (uttryck_2) sats 2

De två satserna som återstår kan under vissa omständigheter ge samma resultat. När?

6. Villkorssatser

Uppgifter

-

6.1

Du är ute och cyklar och kommer fram till en avtagsväg åt höger. Valet står mellan att svänga till höger och att fortsätta rakt fram. Tillverka ett program som frågar efter ditt val och som ger en lämplig utskrift för det alternativ som väljs.

6.2

För att vid en deklaration få göra avdrag för dubbel bosättning krävs det att avståndet till arbetet överstiger 50 km och att arbetet varar högst ett år för ensamstående och tre år för sammanboende. Konstruera ett program som låter användaren mata in aktuella data och som meddelar om användare har rätt till ett skatteavdrag eller inte.

6.3

Gör ett program som frågar efter ett tal. Efter inmatning undersöker programmet tecknet på talet och presenterar en utskrift som meddelar om talet är positivt, O eller negativt.

6.4

Använd en swi tch-sats i ett program som låter dig välja mellan fyra alternativa färdsätt för en mindre resa, cykel, bil, buss eller tåg. Utskriften ska presentera ditt val.

6.5*

Gör ett program som med hjälp av villkorsoperatorn adderar eller subtraherar två inmatade tal. Användaren ska ges tillfälle att välja mellan tecknen' + ' och'-'.

6.6

Tillverka programmet "Gissa mitt hemliga tal (l, 2 eller 3)". Vid rätt svar ska programmet ge en utskrift: "Rätt svar. Du klarade det på ett försök". Vid fel svar ges utskriften: "Fel svar. Gissa en gång till". Om det blir rätt svar nu blir utskriften: "Rätt svar. Du klarade det på två försök". Annars blir utskriften: "Ou lyckades inte klara det på två försök!". Talet som ska hittas kan läggas in i programkoden, varvid man får låta någon annan köra programmet. Alternativt kan en slumptalsgenerator plocka fram ett tal mellan l och 3, varvid du kan köra programmet själv.

6.7

Sambandet mellan kön och lön jämfördes i ett företag. Fördelningen framgår av tabellen.

Lön \ kön

Man

Kvinna

Minst 20000 kr

12

3

Mindre än 20000 kr

5

8

Tillverka ett program som ger aktuell statistik i form aven tabell och som därefter frågar efter en ny inmatning av kön och lön. Efter inmatningen ska en aktualiserad tabell presenteras. 6.8

Utveckla föregående program med en meny med följande val: l. Presentera statistik 2. Mata in en ny uppgift 3. Mata in helt ny statistik Vid val l ska ovanstående tabell presenteras. Vid val 2 ska en inmatning efterfrågas, varefter en aktualiserad tabell presenteras. Då alternativ 3 väljs ska fyra nya värden ges för de olika grupperna. Även detta alternativ avslutas med en presentation av statistiken i tabellform.

6. Villkorssatser 6.9

AB Diskriminering söker nya anställda. För att du ska få en tjänst hos detta företag måste minst två av följande tre villkor vara uppfyllda. 1. du ska vara man. 2. du ska vara under trettio år. 3. du ska inte ha barn.

Skriv ett program som ställer tre frågor till användaren och som genom en utskrift redovisar om personen är godkänd för ett arbete hos AB Diskriminering. Utskriften ska se ut exempelvis så här: "Eftersom du är man och under 30 år är du kvalificerad för jobbet."

6. Villkorssatser

Repetitionsfrågor R 6.1 Ibland ska flera satser utföras vid ett val mellan olika alternativ. Hur binds dessa satser

samman till ett block? R6.2 Hur översätts "om vikt ligger mellan 60 och 70, öka antal med l" till programkod? R6.3 Hur översätts "om vikt är mindre än 60 eller större än 70, minska antal med 1" till programkod? R6.4 Hur översätts "om tall är lika med ta12, tilldela tall värdet hos ta13" till programkod?

a

R6.S Det finns exempel när en if-else if-sats inte kan ersättas aven switch-sats. Ge ett sådant exempel.

.,

R6.6 Skriv om följande med hjälp aven if-else if-sats. if (uttryck_l) { sats 1 }

else{ if (uttryck_2){ sats 2 }

else{ sats 3 }

R6.7 Hitta alla misstag i följande program: public class StörstaTal{ public static void main(String[] args) { System.out.print("Mata in t a l l : "l; double tall = Keyboard.readDouble(); System.out.print("Mata in tal 2: "l; double ta12 = Keyboard.readDouble(); System.out.println("Här kommer talen "storleksordning: if (tall => ta12); System.out.println("tal1 " + tall) System.out.println("ta12 " + ta12) else { System.out.println("ta12 " + ta12) System.out.println("tal1 " + tall) }

} }

i " + "); ; ; ; ;

6. Villkorssatser R6.8 Tre av satserna i vänsterspalten (som använder logiska operatorer) har precis samma inne-

börd som tre i högerspalten (utan logiska operatorer). Para ihop de som har samma innebörd.

A

B

if (uttryck_l sats

&&

uttryck_2)

if (uttryck_l) sats else if (uttryck_2) sats

2

if (uttryck_l sats

II

uttryck_2)

if (uttryck_l) sats_l if (uttryck_2) sats 2

3

if (uttryck_l) sats_l if (!uttryck_l) sats 2

4

if>~Ck_l

&&

s a t s _1--- _____ sats 2

}

if (uttryck_l) if (uttryck_2) sats uttryck_2){

if (uttryck_l) sats 1 else sats 2

De två satserna som återstår kan under vissa omständigheter ge samma resultat. När?

6. Villkorssatser

Sammanfattning Syntax

Beskrivning

if (uttryck){ satser

Om uttryck är sant utförs satser.

}

if (uttryck) { satser_1

Om uttryck är sant utförs satser_l, annars satser 2.

}

else{ satser_2 if (uttryck _1) { satser 1 }

else if (uttryck _2){ satser_2

Om uttryck_1 är sant utförs satser_l, annars om u t tryck_2 är sant utförs satser_2 O.S.v. Är alla uttryck falska utförs satser i else-blocket.

}

else{ satser }

switch (heltalsuttryck){ case konstant 1: satser_1 break; case konstant_2: satser_2 break;

default: satser }

Om heltalsuttryck är lika med konstant_1 utförs satser_l, om det är lika med konstant_2 utförs satser_2 o.s.v. Påträffas ingen likhet utförs satser i defaul t-blocket.

I

6. Villkorssatser

Repetitionsfrågor R6.1 Ibland ska flera satser utföras vid ett val mellan olika alternativ. Hur binds dessa satser

samman till ett block? R6.2 Hur översätts "om vikt ligger mellan 60 och 70, öka antal med l" till programkod? R6.3 Hur översätts "om vikt är mindre än 60 eller större än 70, minska antal med l" till

programkod? R6.4 Hur översätts "om tall är lika med ta12, tilldela tall värdet hos ta13" till program-

kod? R6.S Det finns exempel när en if-else if-sats inte kan ersättas aven swi tch-sats.

Ge ett sådant exempel. :

R6.6 Skriv om följande med hjälp aven if-else if-sats.

if (uttryck_l) { sats 1 }

else{ if (uttryck_2) { sats_2 }

else{ sats 3 } }

R6.7 Hitta alla misstag i följande program: public class StörstaTal{ public static void main(String[] args) { System.out.print("Mata in t a l l : "); double tall = Keyboard.readDouble(); System.out.print("Mata in tal 2: "); double ta12 = Keyboard.readDouble(); System.out.println("Här kommer talen i " + "storleksordning: "); if (tall => ta12); System.out.println("tal1 " + tall) ; System.out.println("ta12 " + ta12) ; else { System.out.println("ta12 " + ta12); System.out.println("tal1 " + tall) ; } } }

6. Villkorssatser R6.8 Tre av satserna i vänsterspalten (som använder logiska operatorer) har precis samma inne-

börd som tre i högerspalten (utan logiska operatorer). Para ihop de som har samma innebörd.

A

B

1

if (uttryck_l && uttryck_2) sats

if (uttryck_l) sats else if (uttryck_2) sats

2

if (uttryck_l sats

3

if (uttryck_l) sats - 1 if ( ! uttryck_l) sats 2

if (uttryck_l) if (uttryck_2) sats

4

if (uttryck_l && uttryck_2){ sats - 1 sats 2

if (uttryck_l) sats 1 else sats 2

}

II

uttryck_2)

if (uttryck_l) sats_l if (uttryck_2) sats 2

De två satserna som återstår kan under vissa omständigheter ge samma resultat. När?

6. Villkorssatser

l, II. Jl Il dl d II'} i 1,II.Jr.

11111 l j Id t 1I!.el

[III .J 11 'I d""

a

.;

Utskriften på rad 6 ska avslutas med strängen" bil." eller" bilar." beroende på värdet hos variabeln antal. Villkorsuttrycket innanför parenteserna ska läses så här: Om antal har värdet l skriv ut "bil. ", annars" bilar. ".

Övning 6.10 Gör ett program som frågar efter ditt kön och som ger svarsalternativen m och k. Därefter ska utskriften bli: "Du är en man" eller "Du är en kvinna", beroende på om du matat in ett 'm' eller inte.

-

6. Villkorssatser

Sammanfattning Syntax

Beskrivning

if (uttryck) { satser

Om uttryck är sant utförs satser.

if (uttryck) { satser 1

Om uttryck är sant utförs satser_l, annars satser 2.

}

else{ satser 2 }

if (uttryck _1){ satser_1 }

else if (uttryck _2){ satser 2

Om uttryck_1 är sant utförs satser_l, annars om u t tryck_2 är sant utförs satser_2 o.s.v. Är alla uttryck falska utförs satser i el se-blocket.

}

else{ satser }

switch (heltalsuttryck) { case konstant 1: satser_1 break; case konstant_2: satser_2 break;

default: satser }

Om heltalsuttryck är lika med konstant_1 utförs satser_l, om det är lika med konstant_2 utförs satser_2 o.s.v. Påträffas ingen likhet utförs satser i defaul t-blocket.

6. Villkorssatser utförs raderna 16 till 22. Variabeln dag är definierad som en char, men någon annan heltalstyp, Lex. en int, kan också användas. l så fall ska apostroferna kring casekonstanterna utelämnas.

Övning 6.8 Gör ett program som tar emot en inmatning av veckodag med siffrorna 1-7 och som ger utskriften "En vardag" om inmatningen ligger mellan l och 5, annars "En helgdag". I programmet ska två utskriftsatser och två break-satser placeras på lämpliga ställen.

6.5 * Villkorsoperatorn

?:

Villkorsoperatorn kan i vissa enklare fall ersätta en if-else-sats. Du klarar dig dock utan den så det här avsnittet kan du betrakta som överkurs. Villkorsoperatorn används för att låta programmet välja ett av två värden. Den kan exempelvis utnyttjas för att hitta det största av två tal. Syntaxen för villkorsoperatorn är: uttryck_l? uttryck_2 : uttryck_3; u t tryck_l är vanligtvis ett villkor som antingen är sant eller falskt. Om u t tryck_l är sant får hela uttrycket samma värde som uttryck_2, annars får det samma värde som u t tryck_3. Följande rad gör att varibeln max tilldelas villkorsuttryckets värde, d.v.s. det största värdet av tall och ta12. max

=

tall> ta12 ? tall: ta12;

Du kan läsa satsen så här: Om tall är större än ta12, tilldelas variabeln max värdet hos tall, annars värdet hos ta12. Motsvarande kod om en if-else-sats används blir if (tall> ta12) { max tall; }

else{ max

=

ta12;

}

Villkorsoperatorn ger alltså en mer kompakt kod. Ett program som utnyttjar villkorsoperatorn för att hitta det största av två tal kan se ut så här:

G. Villkorssatser

ExempelG.9 1. 2. 3. 4. 5. 6. 7. 8. 9.

10.

II Villkorsoperatorn ? : public class Ex68{ public static void main(String[] args){ System.out.print(HMata in tall: H); int tall = Keyboard.readInt(); System.out.print(HMata in tal 2: H); int ta12 = Keyboard.readInt(); int max = tall> ta12 ? tall: ta12; System.out.println(HDet största talet är H + max) ; }

11.

}

~1 a t a III ~l.:lid III

t a I I: tdl 2:

n ~1

J1f'1 \tOt\td L.llpl

dl

31

I

a

På rad 8 jämförs tall och ta12 och resultatet av den jämförelsen avgör om max tilldelas värdet från tall eller ta12 .

Övning G.9 Gör ett program som skriver ut det minsta av två inmatade tal.

Utskriftssats med villkorsoperatorn I följande exempel ska vi se hur ett villkorsuttryck kan integreras i en utskriftssats.

ExempelG.10 1. 2. 3. 4. 5. 6. 7. 8.

II Villkorsoperatorn ? : i en utskriftssats public class Ex21{ public static void main(String[] args){ System.out.print(HHur många bilar har du? H); int antal = Keyboard.readInt(); System.out.println(HDu angav H + antal + (antal == 1 ? H bil. H : H bilar. H));

6. Villkorssatser 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.

case '-': System.out.println((tal1-ta12)) ; break; case '*': System.out.println((tal1*ta12)) ; break; case 'I': System.out.println((tal1/ta12)) ; break; default: System.out.println("Felinmatning") ;

} }

--

-

På rad 11 inleds swi tch-satsen. Variabeln räknesä t t kommer i tur och ordning att jämföras med tecknen +, -, * och /. På rad 12 jämförs räknesätt med +. Vid likhet utförs satsen på rad 13 samt break-satsen på rad 14, varvid programmet lämnar swi tch-satsen. Om räknesätt inte är +, går programmet vidare till nästa jämförelse på rad 15 o.S.V. Det finns en reservutväg: defaul t. Den används om inget av alternativen har samma värde som räknesätt. Den behöver inte avslutas med en break-sats eftersom programmet ändå kommer att lämna swi tch-satsen då default-satsen är avklarad. Här används den för att meddela att en felinmatning har gjorts. Detta exempel kunde också ha konstruerats med en if-else if-sats. Koden blir dock tydligare och mer lättläst med swi tch -case.

Övning 6.7 Gör ett bankkonto-program med hjälp aven swi tch-sats och en meny där du kan välja alternativ enligt figuren. Ge behållningen startvärdet 1000. Vid insättning och uttag ska aktuellt belopp efterfrågas och efter transaktionen ska den nya behållningen skrivas ut. Det ska inte vara möjligt att ta ut mer än det finns på kontot.

I.

lti'i.atttlitll]

L. uttag 3. viq Il ef1all t1 it1lJ

--

6. Villkorssatser Utelämnade break-satser Det är lätt hänt att man glömmer skriva break-satser. Resultatet blir då att programmet fortsätter att utföra de satser som ingår i nästa alternativ. Det finns dock situationer då det är användbart att utelämna break-satser. Låt oss, som exempel, studera ett program som ska skriva ut resterande dagar i en vecka.

Exempel 6.8 1.

2. 3. 4.

II switch-case utan break-satser public class Ex68 { public static void main(String[] args) { System.out.print("Ange veckodag med ett tal (1 = måndag): "); char dag = Keyboard.readChar(); System.out.print("Återstående dagar är "); switch (dag) { case '1': System.out.print(" måndag, "); case '2': System.out.print("tisdag, "); case '3': System.out.print("onsdag, "); case '4': System.out.print("torsdag, "); case '5': System. out. print ( fredag, "); case '6': System.out.print("l ördag och "); case '7': System.out.println(" söndag."); break; default: System. out .println ("Felinmatning") ;

Il

+

Il

5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.

Il

} }

;\tlQ l' Vl'( ko d



HTML-koden för att ladda en applet med namnet MinApplet med bredden 200 punkter och höjden 100 punkter.

e

9. Applets Metoder i java.awt.Graphics Metod

Beskrivning

void drawString(String text, int x, int y}

Skriver ut en text

void drawLine(int startX, int startY, int slutX, int slutY}

Ritar en linje

void drawRect(int x, int y, int bredd, int höjd}

Ritar en ofylld rektangel

void fillReet(int x, int bredd, int höjd}

Ritar en fylld rektangel

int y,

void drawRoundReet(int x, int y, int bredd, int höjd, int xDiam, int yDiam}

Ritar en ofylld rektangel med runda hörn

void fillRoundReet(int x, int y, int bredd, int höjd, int xDiam, int yDiam}

Ritar en fylld rektangel med runda hörn

void drawOval(int x, int y, int bredd, int höjd}

Ritar en ofylld ellips

void fillOval(int x, int y, int bredd, int höjd}

Ritar en fylld ellips

void drawAre(int x, int y, int bredd, int höjd, int startV, int svepV}

Ritar en båge

void fillAre(int x, int y, int bredd, int höjd, int startV, int svepV}

Ritar ett segment aven ellips

void setColor(Color e}

Förgrundsfärgen sätts till e

void setFont(Font f}

'TYpsnittet sätts till f

9. Applets Metoder i java.awt.Applet Metod

Beskrivning

void setBaekground(Color e)

Bakgrundsfärgen sätts till den färg som anges av e

Void setForegound(Color e)

Förgrundsfärgen sätts till den färg som anges av e

Color getBaekground()

Ger den färg som har satts med metoden setBaekground

Color getForeground()

Ger den färg som har satts med metoden setForeground

9. Applets

Repetitionsfrågor R9.1 Vilka steg krävs för att tillverka och köra en applet?

R9.2 När anropas metoderna ini t och paint? R9.3 Då du skriver applets importerar du en eller flera av klasserna java.applet.Applet; java.awt.Graphics; java.awt.Color; java.awt.Font; När behövs de olika klasserna?

9. Applets

Uppgifter 9.1

Skriven applet som undersöker hur utskriften ser ut med följande tre rader:

int tärning = 6; String text = "Tärningen visar "; g.drawString(text + tärning, 10, 20); 9.2

Förändra programmet från uppgift 9.1 så att två tärningars värde slumpas fram och presenteras. De ska presenteras med typsnittet Aria!, fetstil och storleken 20 punkter.

9.3

Låt en applet ha bakgrundsfärgen röd. En fylld cirkel med fast storlek ska sakta tona fram från bakgrundsfärgen till gul med hjälp aven fördröjningsslinga (enligt exempel 9.6) och genom att RGB-koden successivt ändras i en for-loop från (255,0,0) till (255,255,0).

9.4

Kombinera exempel 9.6 och uppgift 9.3 så att en fylld cirkel tonar över från gult till rött mot en blå bakgrund samtidigt som den växer.

9.5

Skriven applet som ritar 15 kvadrater med slumpmässigt valda sidor och positioner. Den största kvadraten ska vara blå och de övriga ska vara gula.

9.6

Rita en streckgubbe som rör sig från vänster till höger på skärmen.

Programmering A Java

10. Programkonstruktion och projektuppgifter Vill du bli en bra programmerare räcker det inte med att du lär dig ett programmeringsspråks syntax. Att skriva källkod är nämligen bara en liten del av det arbete som krävs för att skriva ett väl fungerande program. Ett vanligt misstag bland ovana (och vana) programmerare är att de sätter sig vid datorn och börjar skriva koden direkt efter att uppgiften har presenterats. För mindre program kan detta arbetssätt fungera, men för att lösa ett lite större och mer sammansatt problem krävs ett annat tillvägagångssätt. I detta kapitel ska vi diskutera de olika steg som ett större programmeringsprojekt innehåller. Avslutningsvis ska du få testa dina kunskaper genom att lösa projektuppgifter, gärna tillsammans med en kamrat.

10.1 Arbetsgång vid programkonstruktion Att översätta en ide till ett färdigt datorprogram innebär betydligt mer än bara programmering. För att lyckas med ett programmeringsprojekt är det viktigt att det planeras noggrant och att man arbetar systematiskt. I ett projekt av lite större omfattning ingår de moment som illustreras i figuren.

Förstå problemet

Strukturera problemet

Konstruera algoritmer

Förstå problemet En förutsättning för att man ska kunna skriva ett program är att man har förstått det problem som det ska lösa. Det första momentet i en programmerares arbete är därför att sätta sig in i problemet och bestämma vad som ska göras. Några av de frågor som ska kunna besvaras innan man går vidare är • Vilka är indata? • Hur ska ogiltiga indata hanteras? • Hur ska utdata presenteras?

10. Programkonstruktion och projektuppgifter Strukturera problemet Det är svårt att överblicka stora problem. Vid programkonstruktion använder man sig därför aven metod som innebär att det ursprungliga problemet delas in i ett antal mindre delar som blir lättare att överskåda. Varje del kan sedan behandlas i tur och ordning utan att man behöver störas av detaljerna i de andra. Uppgiften att skriva ett stort program har då förändrats till att skriva flera mindre programdelar, vilket är betydligt enklare. Detta arbetssätt möjliggör också för flera programmerare att arbeta med samma program, då var och en kan arbeta med sina egna delar. Att strukturera en uppgift genom att dela in den i väl avgränsade delar är kanske det viktigaste momentet för en programmerare. Med en väl genomtänkt indelning kommer det fortsatta arbetet att underlättas avsevärt. När man har bestämt varje dels uppgift kan man gå vidare till nästa moment. I objektorienterad programmering sker den här uppdelningen vanligtvis genom att man arbetar med flera klasser, där varje klass har sina speciella variabler och metoder. I vår grundläggande programmeringskurs arbetar vi bara med en klass i varje uppgift. Vi får därför nöja oss med att strukturera vår kod enbart med hjälp av metoder, även om den strategin inte är särskilt vanligt förekommande i Java.

Konstruera algoritmer Man ska sträva efter att utforma algoritmer så exakt att instruktionerna direkt kan överföras till programkod. Svårigheterna vid konstruktion av algoritmer är ofta inte att hitta en lösning, utan att det kan finnas så många algoritmer som fungerar och det kan vara svårt att bestämma vilken som är bäst. Blir man osäker är det klokt att använda en så enkel algoritm som möjligt, eftersom det då är större sannolikhet att den fungerar. Om tillräckligt med tid ägnas åt detta steg behövs mindre tid att skriva och felsöka programmet.

Skriv programmet Nu först är det dags att översätta algoritmerna till ett programspråk. Om man har en detaljerad algoritm att utgå ifrån blir detta moment rent rutinarbete. Som du ser utgör detta bara en liten del aven programmerares arbete. Ett vanligt fel är att man börjar koda innan algoritmerna är färdiga. Risken är då stor att man får problem eftersom man kanske tvingas göra förändringar under arbetets gång.

Dokumentera programmet Det kan ta flera dagar t.o.m. månader att skriva ett större program. En del av programmet, som verkade självklar då du skrev den för en månad sedan, kan vara svår att förstå då du ser den idag. Skriv därför alltid förklarande kommentarer samtidigt som du skriver källkoden. Ett program ska vara så väldokumenterat att andra lätt kan läsa, använda och förändra det. Det är svårt att läsa programkod, så det gäller att underlätta för läsaren så mycket som möjligt. Följande råd kan vara bra att följa vid dokumentationen: • Då en variabel eller konstant definieras ska man förklara vad den representerar och hur den kommer att användas om det inte framgår av namnet.

10. Program konstruktion och projektuppgifter • Inled viktiga delar av programmet med en kommentar som beskriver vad de gör och hur de fungerar. Läsbarheten ökar också om man använder sig av mellanrum, tomma rader och indrag. På så vis kan man lätt se vilka delar av programmet som hör ihop.

Testa programmet Det är ovanligt att stora program fungerar korrekt första gången de körs. Svårigheterna att hitta fel i ett program ökar med dess storlek. Det har förekommit att programmeringsprojekt har tvingats lägga ned för att det har varit omöjligt att upptäcka varför de inte fungerar. Om man använder det arbetssätt som diskuteras i detta avsnitt får man färre fel i programmen och även lättare att finna de som återstår. Nästan oberoende av hur noggrann man är kommer programmet att irmehålla logiska fel. Till och med de bästa programmerarna måste ägna sig åt felsökning så för att bli en bra programmerare måste du vara skicklig på att felsöka program. Vid testning körs programmet med en samling data valda så att eventuella fel ska upptäckas. Som ett minimum bör man välja testdata på följande sätt: • Enkla värden: Data som är lätta att kontrollera för hand. • Realistiska värden: Data som valts med tanke på hur programmet kommer att användas.

Kontrollera även nu om möjligt resultatet för hand. • Extremvärden: Om vissa data ligger i ett intervall var då noga med att testa ändpunkter-

nas värden. Om en variabel kan anta värden från l till 10, testa då värdena l och 10. • Ogiltiga värden: Ett program ska designas så att det uppför sig väl även om det får

ogiltiga indata.

10.2 Projektuppgifter Då ska du äntligen få prova på dina kunskaper genom att lösa en lite större uppgift. I arbetslivet arbetar oftast flera programmerare tillsammans för att projekten ska avslutas inom rimlig tid. Vi rekommenderar därför att du provar detta arbetssätt och löser uppgiften tillsammans med en kamrat. Du kommer att lära dig mycket av de diskussioner som uppstår under projektets gång. För att det slutgiltiga programmet ska vara lättläst är det angeläget att det får ett enhetligt utseende. En som läser koden ska inte kunna se att det är skrivet av två olika personer. Innan ni börjar skriva är det därför viktigt att ni enas om vilken programmeringsstil ni ska använda. Kom även ihåg att dokumentera koden så väl att andra som läser ert program lätt kan förstå hur det är uppbyggt. Vi har gett ett kortfattat förslag till hur den första uppgiften kan struktureras. Ni behöver givetvis inte följa detta, men de kan fungera som en modell för hur långt ni bör ha kommit i era tankar innan ni fördelar arbetet mellan er.

10. Programkonstruktion och projektuppgifter Projektuppgift 1

Yatzy

Resultat

Yatzy är ett tärningsspel med fem tärningar. Varje omgång består av tre kast. I det första kastas alla tärningar och i de två följande är det tillåtet att hålla på en eller flera. Syftet är att åstadkomma så bra tärningskombinationer som möjligt och att fylla en tabell med de erhållna resultaten. Ett spel består av 15 omgångar och tabellen ser ut så här: ~

Poäng

Ettor Tvåor Treor Fyror Femmor

Poängen på de tärningar som ingår i den aktuella kombinationen räknas samman och förs in på lämplig rad. Kombinationen 2 3 3 5 5 kan ge 2 poäng om den förs in på 2:01', 6 poäng på 3:01', 10 poäng på 5:or eller par, 16 poäng på 2-par eller 18 poäng på chans. Alla andra val ger Opoäng.

Sexor Summa Bonus 1 par

Liten stege består av 1 2 3 4 5 i valfri ordning. 2 par

Stor stege består av 2 3 4 5 6. Tretal

Kåk är ett tretal plus ett par. Fyrtal

Chans är summan av alla tärningar oavsett kombination. Liten stege

Yatzy erhålles om alla tärningar visar lika och ger 50 poäng. Stor stege

Bonus på 50 poäng erhålles om delsumman i tabellen är minst 63 poäng.

Kåk

Efter 15 omgångar är hela tabellen fylld och spelet är slut.

Chans YATlY SUMMA

Tillverka ett yatzyspel och utgå gärna från följande ideer om hur det kan konstrueras. Du behöver två fält, tärningVärde och tärningSpara, på vardera fem positioner. Det första motsvarar tärningarnas värden och det andra håller reda på vilka du vill spara respektive kasta om i varje spelomgång (exempelvis kan värdet 1 betyda spara och 2 kasta om). Du behöver också två fält, tabellVärde och tabellVald på minst 15 positioner. Det första lagrar erhållna poäng och det andra vilka rader du har fyllt i. Du bör arbeta med metoder och då är följande lämpliga: void presentation ( ) , som ger instruktioner för användaren. void kasta (tärningSpara [], som inte ska sparas.

tärningVärde [] ) , som kastar de tärningar

void spara (tärningSpara [ ], kas tnurruner) , som sparar tärningar efter La och 2:a kastet.

10. Programkonstruktion och projektuppgifter void presenteraTabell ( tabellVärde [J ) , som presenterar aktuell tabell. void fylliTabell ( tabellVarde [J , tabellVald [J ), som fyller i vald rad om den är ledig. Programmet kan med ovanstående metoder byggas upp på följande sätt: Ge instruktioner. Ge fälten lämpliga startvärden. Upprepa 15 gånger. Upprepa 3 gånger. Kasta. Spara. Presentera tabell. Fyll i tabell. Presentera tabell. Presentera slutresultatet.

Förslag till förbättringar • Lägg till möjligheten att avsluta programmet mitt i ett spel. • Lägg till möjligheten att meddela att du är nöjd redan efter ett eller två kast. • Utveckla programmet så att man kan låta flera spelare tävla mot varandra. • I metoden fylliTabell ska du själva räkna ut ditt värde och mata in det. Inför en metod beräkna (tärningVärde , radNr), som kan anropas då en rad ska fyllas i och som beräknar rätt värde för den rad som har valts. Här är det klokt att skapa ett nytt fält med sex positioner som anger hur många 1:or, 2:or, o.s.v. upp till 6:01' som finns efter dina tre slag. Detta fält kan sedan användas för att testa om villkoren för aktuell rad är uppfyllda och beräkna poängsumman. • Använd grafiken hos ditt system så att tärningar och tabell ritas upp på skärmen.

Projektuppgift 2 Tjugoett Skriv ett program så att du kan spela kortspelet tjugoett mot datorn. Det gäller att komma så nära 21 poäng som möjligt men inte förbi. Klädda kort ger 10 poäng, ess ger l eller 11 och övriga ger den poäng valören anger. Vid lika vinner datorn. Spelaren drar kort tills han är nöjd. Datorn tar nya kort så länge summan är högst 16.

10. Programkonstruktion och projektuppgifter Projektuppgift 3 Mastermind Mastermind går ut på att hitta rätt färgkombination hos en rad med dolda pjäser. Spelaren gissar på en rad och spelledaren markerar hur många pjäser som är helt rätt (rätt färg och rätt position) med en svart pjäs respektive som har rätt färg men fel position med en vit pjäs. Exempel: Rätt rad: Gissning: Markering:

röd blå svart

röd röd vit

blå grön

gul blå

Spelledaren markerar då ett helt rätt (den röda pjäsen) och en riktig färg men på fel position (en av de blåa pjäserna). Spelaren får dock inte veta vilken eller vilka av pjäserna som är riktiga. Tillverka ett Mastermind med siffror istället för färger (om du inte vill jobba med grafik). Låt programmet slumpa fram fyra siffror, exempelvis mellan l och 6, vilka placeras i ett fält som inte visas för spelaren. Spelaren ska sedan gissa talet och efter varje gissning få veta sitt resultat. När spelaren har hittat rätt kombination ska programmet meddela det samt ange hur många gissningar som behövdes.

Projektuppgift 4 Nollställen till en given funktion Uppgiften kräver vissa matematiska kunskaper om funktioner och dess nollställen. Ibland går det inte att exakt bestämma en funktions nollställen. Gör ett program som bestämmer ett nollställe till en given funktion (som får skrivas in i programkoden) inom ett av användaren givet intervall och med en noggrannhet som också användaren bestämmer.

Projektuppgift 5 Talbaser Gör ett program som låter användaren mata in ett tal samt vilken talbas som används (binärt, oktalt, decimalt eller hexadecimalt). Därefter ska användaren välja vilken bas som önskas, varvid programmet ska presentera talet i den nya talbasen. För information om talbaser, se bilaga D.

10. Programkonstruktion och projektuppgifter Projektuppgift 6 Lotto och tips Tillverka ett program som låter användaren välja en spelform av lotto, måltips och stryktips. Programmet ska beräkna sannolikheterna för den valda spelformen att få O, 1, 2 rätt o.s.v. upp till alla rätt genom att presentera i hur många fall av alla möjliga kombinationer man får de olika utfallen. Lotto går ut på att välja 7 nummer av 35. Detta kan göras på 6724520 olika sätt. Låt datorn räkna ut hur många gånger av dessa man bör få 7, 6, 5,4,3,2, 1 respektive Orätt. Jobba förslagsvis med ett antal for-slingor inuti varandra. Låt din rad ligga i ett fält med 7 positioner och jämför med ett annat fält av samma storlek som får löpa igenom alla tänkbara kombinationer. Se till att lotto-funktionen fungerar innan du går vidare i programtillverkningen. För lotto kan utskriften se ut så här:

l måltipset ska man välja ut de 8 målrikaste matcherna av 26. Detta kan göras på 1562275 olika sätt. I stryktips ska man tippa 1, x eller 2 på tretton matcher. Detta kan göras på 1594323 olika sätt. Låt programmet göra motsvarande utskrifter för dessa två alternativ.

Projektuppgift 7 Ett primitivt ritprogram Gör ett program som sätter ett kryss mitt i dosfönstret eller motsvarande. Genom att trycka på u, n, h eller v ska programmet sätta ytterligare ett kryss uppåt, neråt, till höger eller till vänster om det föregående. Detta ska sedan kunna upprepas så länge användaren vill. I själva verket är det nog lämpligast att rensa skärmen efter varje visning och låta programmet rita om alla gamla kryss samtidigt som det nya läggs till. Förslagsvis kan du jobba med ett antal teckenfält, som från början är fyllda med blanktecken.

A. ASCII-tabellen

Tabell A.1 ASCII-tabellen Decimalt tal

Tecken

Decimalt tal

Tecken

Decimalt tal

Tecken

Decimalt tal

O

NUL SOH STX ETX EOT ENO ACK BEL BS

32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

mellanslag

64 65 66 67 68 69 70 71

@

96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

HT LF VT FF CR SO SI DLE DCl DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US

! "

# % & ,

( )

72

* + ,

73 74 75 76

-

77

/

O

1 2 3 4 5 6 7 8 9 , < =

>

?

78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

A B C D E F G H I J

K L M N O P

O R S T U V W

X Y Z [ \ ] f\

-

Tecken a b

c d

e f

g h i j

k I

m n o P q r

s t u v w

x Y

z { I }

DEL

Appendix B: klassen Keyboard Metoder Metod

Förklaring

public static String readString()

Returnerar en sträng. Returnerar null om fel uppstår vid läsningen.

public static String readWord()

Returnerar ett ord. Returnerar null om fel uppstår vid läsningen.

public static char readChar()

Returnerar en char. Returnerar MIN_VALDE om fel uppstår vid läsningen.

public static int readlnt()

Returnerar en int. Returnerar MIN_VALDE om fel uppstår vid läsningen.

public static long readLong()

Returnerar en long. Returnerar MIN_VALDE om fel uppstår vid läsningen.

public static float readFloat()

Returnerar en float. Returnerar NaN om fel uppstår vid läsningen.

public static double readDouble()

Returnerar en double. Returnerar NaN om fel uppstår vid läsningen.

B. Keyboard

Källkod I I Keyboard . java import java.io.*; import java.util.*;

public class Keyboard{ private static String lastToken = null; private static StringTokenizer input; private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); II Undersöker om token finns private static String getToken(boolean readDelimiters){ String token; if (lastToken == null){ token = getNextToken(readDelimiters); }

else{ token = lastToken; lastToken = null; }

return token; }

II Hämtar nästa token private static String getNextToken(boolean readDelimiters){ final String delimiters = " \t\n\r\f"; String token = null; try{ if (input == null) { input = new StringTokenizer (br.readLine(), delimiters, true); }

while (token == null I I (delimiters.indexOf(token) >= O && lreadDelimiters) ){ while (!input.hasMoreTokens()) { input = new StringTokenizer (br.readLine(), delimiters,true); }

token } }

=

input.nextToken();

B. Keyboard catch(Exception e){ token = null; return token;

II Returnerar en sträng. public static String readString() { String str; try{ str = getToken(true); while (input.hasMoreTokens()) { str = str + getToken(true); } }

catch(Exception e){ System.out.println("Fel vid strängläsning.") ; str = null; }

return str; }

II Returnerar ett ord. public static String readWord(){ String token; try{ token = getToken(false); }

catch(Exception e){ System.out.println("Fel vid läsning av ord."); token = null; }

return token; }



B.Keyboard II Returnerar ett tecken. public static char readChar(){ String token = getToken(true) i char valuei try{ if (token.length() > 1){ lastToken = token.substring (1, token.length()) } else{ lastToken = nulli } value = token.charAt (O)i } catch(Exception e){ System.out.println("Fel vid läsning av tecken") i value = Character.MIN_VALUEi } return valuei } II Returnerar en int. public static int readlnt() { String token = getToken(false) i int valuei try{ value = Integer.parselnt(token) i } catch(Exception e){ System.out.println("Fel vid läsning av int") value = Integer.MIN_VALUEi

return valuei }

i

i

B. Keyboard II Returnerar en long. public static long readLong(){ String token = getToken(false) i long valuei try{ value = Long.parseLong(token)

i

}

catch(Exception e){ System.out.println("Fel vid läsning av long") value = Long.MIN_VALUE;

i

}

return value;

II Returnerar en float. public static float readFloat() { String token = getToken(false); float valuei try{ value = (new Float(token)) .floatValue(); }

catch(Exception e) { System.out.println("Fel vid läsning av float"); value = Float.NaN; }

return value; }

II Returnerar en double. public static double readDouble() { String token = getToken(false); double value; try{ value = (new Double(token)) .doubleValue(); }

catch(Exception e) { System.out.println("Fel vid läsning av double"); value = Double.NaN; return value; } }

Appendix C: talbaser Vårt talsystem har basen 10. Det innebär att det finns tio tecken (O, 1,2, ... 8,9). Värdet av ett godtyckligt tal fås genom att addera entalssiffran, tiotalssiffran· 10, hundratalssiffran ·100 o.s.v. Talet 8021 ger värdet 8 ·1000 + 0·100 + 2·10 + l eller 8000 + O + 20 + l. Ett annat sätt att skriva samma uttryck är 8· lO' + O· lO' + 2.10 1 + l. Denna teknik används för att bestämma värdet hos tal i samtliga talsystem. Innan vi tittar närmare på hur de viktigaste talsystemen fungerar visar vi en tabell över de decimala talen O till IS, skrivna i tre andra talsystem.

Tabell C.1 Olika talsystem Decimalt

O

Binärt

Oktalt

Hexadecimalt

0000

O

O

0001 2

0010

2

2

3

0011

3

3

4

0100

4

4

5

0101

5

5

6

0110

6

6

7

0111

7

7

8

1000

10

8

9

1001

11

9

10

1010

12

A

11

1011

13

B

12

1100

14

C

13

1101

15

D

14

1110

16

E

15

1111

17

F

I det binära talsystemet har vi valt att ta med inledande O:or, för att alla tal ska få lika många positioner.

c. Talbaser

C.1 Det binära talsystemet Det binära talsystemet har basen 2. Det innebär att det bara finns två tecken, O och 1.

Omvandling från binärt till decimalt Värdet av ett binärt tal fås på samma sätt som för ett decimalt tal men med basen 2 istället för basen 10. Talet 11001001 har värdet 1.2 7 + 1.26 + 0.2 5 + 0.2 4 + 1.23 + 0.2 2 + 0·2' + 1 eller om vi räknar ut varje potensuttryck 128 + 64 + O + O + 8 + O + O + l

=

201 (med basen lo).

Omvandling från ett binärt tal till ett decimalt tal görs enklast på detta sätt.

Omvandling från decimalt till binärt Då ett decimalt tal ska omvandlas till ett binärt kan man först försöka skriva om det som en kombination av talen 1,2,4,8, 16,32,64, 128 o.s.v. Gemensamt för dessa tal är att de kan skrivas som en potens med basen 2. Exempelvis är 32 och 25 samma tal. För att hitta rätt kombination kan man helt enkelt prova sig fram. Det decimala talet 155 kan efter lite prövning skrivas som 128 + 16 + 8 + 2 + 1. Detta kan i sin tur skrivas om som 1.2 7 + 0.2 6 + 0.2 5 + 1.2 4 + 1.23 + 0.2 2 + 1·2' + l Det ger det binära talet 10011011. Det finns dock en annan teknik för att hitta det decimala talet. Den bygger på upprepade heltalsdivisioner med 2. Vi ska illustrera tekniken med ett exempel. Låt oss anta att vi ska omvandla talet 87 till ett binärt tal. 87/2 43/2 21/2 10/2

5/2

= =

=

43 21

=

lo

=

5

2

2/2 = l 1/2 = O

rest: rest: rest: rest: rest: rest: rest:

1 l 1 O

1 O

l

Det eftersökta talet är då 1010111.

c. Talbaser C.2 Det oktala talsystemet Det oktala talsystemet har basen 8. Det finns med andra ord 8 tecken: O, 1,2,3,4,5,6 och 7.

Omvandling från oktalt till decimalt Återigen fås värdet på samma sätt som för ett decimalt tal men med basen 8. Talet 5107 i basen 8 har alltså värdet 5 . 83 + l· 82 +

o· 8' + 7

eller med potensuttrycken uträknade 5·512 + 1·64 + 0·8 + 7 = 2631 (med basen 10).

Omvandling från decimalt till oktalt Omvandlingar från ett decimalt tal till ett oktalt görs på samma sätt som till binära tal men med basen 8. Antingen skriver man om talet som en kombination av 1,8,64,512 o.s.v. (dessa är heltalspotenser av basen 8), där varje tal får multipliceras med högst 7, eller utför man ett antal heltalsdivisioner med 8 istället för med 2. Det decimala talet 1000 kan skrivas som 1·512 + 7·64 + 5·8 + O vilket i sin tur kan skrivas som 1.83 + 7.8 2 + 5·8' + O. Det ger det oktala talet 1750. Metoden med heltalsdivisioner för samma tal ger 1000/8 = 125 125/8 = 15 15/8 = l 1/8 = O Talet blir 1750.

rest: rest: rest: rest:

O 5 7 l

c. Talbaser Omvandlingar mellan binära och oktala tal Dessa omvandlingar är mycket enkla och görs genom att dela upp det binära talet i grupper om tre tecken i varje och där varje grupp om tre positioner motsvarar ett oktalt tal mellan O och 7 (se tabell C.l).

~

Binärt:

'----v----' '----v----' '----v----'

Oktalt:

I

I

3

2

I

I

6

Det är lätt att gå i båda riktningarna vid omvandlingar.

C.3 Det hexadecimala talsystemet Det hexadecimala talsystemet har 16 tecken. Det innebär att våra siffror inte räcker till utan har kompletterats med bokstäverna A-F, som motsvarar talen 10-15 i det decimala talsystemet (se tabell C.l).

Omvandlingar mellan hexadecimala och decimala tal Omvandlingar mellan det hexadecimala talsystemet och det decimala följer precis samma mönster som för det binära eller oktala men man arbetar med basen 16 istället. Vi visar bara två korta exempel: lC7 A,G = 1·16' + 12.16 2 + 7 ·16' + 10 = 7290 10 • (Nedsänkt tal anger basen)

Talet 5327 i basen 10 ger med heltalsdivision: 5327/16 = 332 332/16 = 20 20/16 = l 1/16 = O

rest: rest: rest: rest:

15 (motsvarar F) 12 (motsvarar C) 4 l

Talet blir 14CF i basen 16.

Omvandlingar mellan binära och hexadecimala tal Dessa görs på samma sätt som mellan binära och oktala tal med den skillnaden att det binära talet delas i grupper om fyra tecken. Samma binära tal som i föregående exempel ger: Binärt:

~ '--v----J '--v----J

Hexadecimalt:

I

D

I

6

I

Det är även här lätt att gå i båda riktningarna vid omvandlingar.

Svar på repetitionsfrågor

-

2. Introduktion till Java R2.1 Följande rader har rättats:

class Skriv{ public static void main(String[] args){ / /static har lagts till. Stor bokstav i main har korrigerats System.out.println("Det finns tre fel"); / /apostrofer har ersatts av citationstecken } }

R2.2 Det finns kompileringsfel, exekveringsfel och logiska fel. R2.3 kompilera,

interpretera och exekvera

3. Variabler och inmatning R3.1 definiera: Namnge, typspecificera och reservera minnesutrymme i en sats

(t.ex. in t tal;). tilldela: Ge ett värde till en variabel. (t.ex. tal = 5;). initiera: Definiera och tilldela i samma sats (t.ex. in t tal R3.2

=

5;).

= i matematiken betyder att vänsterled och högerled är lika. i programmering innebär att variabeln till vänster tilldelas värdet av uttrycket till höger om likhetstecknet. =

R3.3 l byte:

2 bytes: 4 bytes:

2" 2'6 2"

R3.4 Tall··············· Inte godkänd eftersom mellanslag inte är tillåtet.

tal_l l_tal' tal antalBilar antalBåtar antal-bussar·····

Godkänd. Inte godkänd eftersom första tecknet inte får vara en siffra. Godkänd. Godkänd. Godkänd. . Inte godkänd eftersom bindestreck är förbjudet.

R3.S Varje tecken representeras av ett tal då de ska lagras och användas. Unicode låter varje

tecken representeras av ett 16-siffrigt binärt tal, vilket ger möjlighet att kod specificera 65 536 tecken. R3.6 Ett fält är en datatyp som kan lagra ett antal värden av samma typ.

Fältdefinition: typ [] namn = new typ [storlek] Fältinitiering: typ [] namn = {värdel, värde2, ... } Tilldelning: namn [posi tion] = värde

Svar på repetitionsfrågor R3.7 String namn = "innehåll" eller String namn = new String ( "innehåll" )

4. Operatorer R4.1 tal++, ++tal, tal += 1 och tal = tal+1.

R4.2 Modulusoperatorn returnerar resten vid en division. Den kan exempelvis användas vid tidsomvandlingar och bråkräkning. R4.3 Båda ökar värdet hos variabeln med l, postfix efter att ha använt det tidigare värdet och prefix före användandet av värdet. R4.4 System.out.println(tall/ta13);

System.out.println(ta12/ta13) ; System.out.println(ta12%ta13) ; System.out.println(ta12++) ; System.out.println(++ta13) ;

utskrift: utskrift: utskrift: utskrift: utskrift:

R4.5 System.out.println(56789*100/100);

utskrift: System.out.println(56789/100*100) ; utskrift: System.out.println((56789+50)/100*100); utskrift: System.out.println((56789+500)/1000*1000); utskrift: System.out.println((int) (234.56+0.5)); utskrift:

1.6 1 3 8 6 56789 56700 56800 57000 235

Gemensamt för de tre sista utskrifterna är att de gör en matematiskt korrekt avrundning och det är med andra ord en enkel metod för att avrunda ett tal till önskat antal värdesiffror.

5. Algoritmer, pseudokod och kontrollstrukturer R5.1 Ett begränsat antal instruktioner som ska utföras för att lösa ett problem. R 5.2 Pseudokod, strukturdiagram och källkod. R 5.3 Sekvens.

4

Svar på repetitionsfrågor 6. Villkorssatser R6.1 Med en vänster- och en högerklammer ({, }) R6.2 if

(vikt> 60 && vikt < 70) { antal++;

}

R6.3 if

(vikt < 60 antal--;

II

vikt> 70) {

}

R6.4 if

(tall == ta12){ tall = ta13;

}

R6.S if

(tal < 10) { satser

}

else if (tal < 20) { satser }

else{ satser }

Eftersom tal kan anta oändligt många olika värden inom olika intervall kan dessa satsrader inte ersättas aven swi tch-sats. R6.6 if

(uttryck_l) { sats 1

}

else if (uttryck_2){ sats 2 }

else{ sats 3

Svar på repetitionsfrågor R6.7 Operatorn i if (tall => ta12) ska vara >=. Det avslutande semikolonet ska bort i samma rad. Det ska vara klamrar före och efter de två satserna inom i f-alternativet. Ett riktigt program kan se ut så här: public class StörstaTal{ public static void main(String[] args){ System.out.print("Mata in t a l l : "l; double tall = Keyboard.readDouble(); System.out.print("Mata in tal 2: "); double ta12 = Keyboard.readDouble(); System.ouLprintln("Här kommer talen i " + "storleksordning: "); if (tall >= ta12) { System.out.println("tal1 " + tall); System.out.println("ta12 " + ta12); }

else { System.out.println("ta12 " + ta12); System.out.println("tal1 " + tall); }

R6.8 Al - B3 A2 - Bl A3 -B4

A4 - B2 ger samma resultat om uttryck_1 och uttryck_2 båda är sanna eller falska.

7. Repetitionssatser R 7.1 En gång. R 7.2 Tills programmet bryts av användaren (n = 2 är en tilldelning). R 7.3 En whi l e-sats undersöker ett villkor innan dess satser utförs. I en do-sats utförs satserna en gång innan ett villkor undersöks. R 7.4 Det blir en evighetsslinga utan slut. sats utförs gång på gång. R 7.5 sats utförs en gång. R 7.6 De medför att exekveringen fortsätter på en annan rad än den som följer. Det är lätt att tappa kontrollen över program med för många hopp.

I

Svar på repetitionsfrågor 8. Metoder R 8.1 En separat programmodul som vanligtvis löser en avgränsad uppgift och som kan ta emot, bearbeta och returnera data. R 8.2 En egen metod måste definieras och anropas. R8.3 a double area (double bredd, double höjd) {... b void skrivUt(char namn[]) {... c int surnma(int tal[], int antal) {... R8.4 a Korrekt. b Parametertypen måste anges i definitionens huvud. R8.5 Den första raden ska ej avslutas med ett semikolon. R8.6 Två fel finns i metodanropet. Den första parametern ska bara bestå av fältnamnet resul ta t och den andra parametern ska inte typspecificeras. Satsen med anropet ska skrivas: double medel = medelvärde (resultat, antal);

9. Applets R9.1 Skriva källkod, kompilera den, tillverka en html-fil och öppna den i exempelvis en webbläsare. R9.2 Metoden ini t anropas bara en gång, vilket sker i inledningen av programkörningen. Varje gång en appiet måste ritas om (exempelvis om fönstret varit täckt av något annat) anropas metoden paint. R9.3 java. applet. Applet java. awt. Graphics java. awt . Color java. awt. Font

behövs för att skriva en applet. behövs då en applet arbetar med grafikobjekt av klassen Graphics. behövs för att hantera färger. behövs för att hantera typsnitt.

Lösningar till övningar 2. Introduktion till Java 2.2

II utskrift

public class Övning22{ public static void main(String[] args) { System.out.println(U\"To be or not to be,"); System.out.println(""); System.out.println "that is the question\" u; }

3. Variabler och inmatning 3.1

livad är tillåtet public class Övning31{ public static void main(String[] args) { int a = 4, b; b = l3-a; 112*b = 10; Ej tillåtet 1112 = a; Ej tillåtet }

3.2

11 inmatning public class Övning32{ public static void main(String[] args){ System.out.print(UMata in tall: U); int tall = Keyboard.readlnt(); System.out.print("Mata in tal 2: "); int ta12 = Keyboard.readlnt(); System.out.print("Mata in tal 3: "l; int ta13 = Keyboard.readlnt(); int summa = tal1+ta12+ta13; System.out.println(USumman blir U + summa); }

}

3.3

II char public class Övning33{ public static void main(String[] args){ char tecken = 98; System.out.println("tecken = " + tecken); System.out.print("Mata in ett nytt tecken: "); tecken = Keyboard.readChar(); IIMata in t.ex. 98 System.out.println("tecken = " + tecken); }

Lösningar till övningar 3.4

II summan och medelvärdet av tre tal public class Övning34{ public static void main(String[] args) { System. out. print ("Mata in tal l: "); int tall = Keyboard.readlnt(); System.out.print("Mata in tal 2: "); int ta12 = Keyboard.readlnt(); System.out.print("Mata in tal 3: "); int ta13 = Keyboard.readlnt(); int summa = tall+ta12+ta13; double medel = summa/3D; I I eller (double) summa/3 System. out.println ( "Summan är " + summa); System.out.println("Medelvärdet är " + medel); } }

3.5

I I fält med platsbyte public class Övning35{ public static void main(String[] int[] tal = new int[3]; System.out.print("Mata in tal tal[O] = Keyboard.readlnt(); System.out.print("Mata in tal tal [l] = Keyboard.readlnt(); System.out.print("Mata in tal tal[2] = Keyboard.readlnt();

args) { l:

");

2:

");

3:

");

int temp = tal [O] ; tal [O] tal [2] ; tal[2] = temp; System.out.print("Innehåll i fältet: "); System.out.println(tal[O] + " " + tal[l] + " " + tal [2] ) ; } }

Lösningar till övningar 3.6

I I textsträngar public class Övning36{ public static void main(String[] args){ System.out.print("Mata in ett engelskt ord: "); String engOrd = Keyboard.readString(); System.out.print("Mata in den svenska" + "översättningen: "); String sveOrd = Keyboard.readString(); System.out.println("Det engelska ordet" + engOrd + " betyder " + sveOrd + " på svenska.");

4. Operatorer 4.1

II Aritmetiska operatorer public class Övning4l{ public static void main(String[] args){ System.out.print("Mata in tal l: "); double tall = Keyboard.readDouble(); System.out.print("Mata in tal 2: "l; double ta12 = Keyboard.readDouble(); System.out.println(tall + "I" + ta12 + " tall/ta12); System.out.println(tall + "%" + ta12 + " tall%ta12) ;

= "

+

= "

+

}

Resultaten blir decimaltal. 4.2

I I modulusdivision public class Övning42{ public static void main(String[] args){ System.out.print("Ange antalet månader: "); int månad = Keyboard.readlnt(); int år = månad/12; månad = månad%12; System.out.println("Det blir" + år + " år och" + månad + " månader.");

Lösningar till övningar 4.3

II tilldelande aritmetisk operator public class Övning43{ public static void main(String[] args) { int tal = 5;

double kvot = 8; kvot 1= tal; System. out.println ( "kvot = " + kvot); int surruna = 4; summa += tal; System.out.println("surruna = " + summa); int differens = 7; differens -= tal; System.out.println("differens

" + differens);

int modulus = 23; modulus %= tal; System.out.println("modulus = " + modulus) ; } }

4A

II postfix och prefix public class Övning44{ public static void main(String[] args){ int tal = 5; System.out.println("tal "+ tal--); tal = 5; System.out.println("tal "+ --tal); }

4.5

I I prioriteringsregler public class Ex45{ public static void main(String[] args){ int tall = 5+6%4; int ta12 = (5+6)%4; double tal3 = 5; tal3 *= 2.5+1;

System.out.println("tal1 = " + tall); I I 7 System.out.println("ta12 " + ta12); I I 3 + ta13); 1117.5 System.out.println("ta13 II

} }

Lösningar till övningar 5. Algoritmer, pseudokod och kontrollstrukturer 5.1

/ / pseudokod public class Övning51{ public static void main(String[] args) { System.out.print("Mata in tall: "); int tall = Keyboard.readInt(); System.out.print("Mata in tal 2: "); int ta12 = Keyboard.readInt(); System.out.print("Mata in tal 3: "); int ta13 = Keyboard.readInt(); tall *= 2; ta12 *= 3; ta13 *= 4; int värde = tall + ta12 + ta13; System.out.println("Värdet blir" + värde); }

5.2

Pseudokod:

Strukturdiagram:

Läs in antal timmar, minuter och sekunder Öka sekunder med timmar . 3600. Öka sekunder med minuter . 60. Skriv ut antalet sekunder.

Öka sekunder med 3600*antal timmar

Öka sekunder med 60*antal minuter

Skriv ut antalet sekunder

Lösningar till övningar 5.3

Pseudokod:

Strukturdiagram:

Läs in vikt (hg) Läs in pris (kr/hg) Om vikt är minst S kostnad = 0,90 * vikt * pris annars kostnad = vikt * pris Skriv ut kostnaden.

-

kostnad = O.90*pris*vikt

5.4

Pseudokod: Ge tal startvärdet 10. Upprepa så länge tal är större än Skriv ut tal. Minska tal med 1.

Strukturdiagram:

o.

kostnad = pris*vikt

Lösningar till övningar 6. Villkorssatser 6.1

I I if-else public class Övning61{ public static void main(String[] args) { System.out.print("Vill du testa en + "v illkorssats? (j In)? "); char svar = Keyboard.readChar();; if (svar == 'j') System.out.println("Du svarade ja. + liDet fungerar! ") ; else System.out.println("Du svarade nej. + liVar det sant?"); II

II

II

} }

6.2

I I if-else med klamrar public class Övning62{ public static void main(String[] args){ System.out.print("Hur mycket bensin har du? "); double bensin = Keyboard.readDouble(); if (bensin < 10){ System.out.print("Du bör tanka. Tanka + (50-bensin) + liter. Det kostar + (50-bensin)*9.5 + kronor. ") ; II

II

II

II

}

else{ System.out.println("Kör vidare!");

}

6.3

II if-else med den logiska operatorn && public class Övning63{ public static void main(String[] args) { System.out.print("Ge din ålder: "); int ålder = Keyboard.readlnt(); if (ålder> 15 && ålder < 65) { System.out.println("Det kostar 10 kr."); }

else{ System.out.println("Det kostar 5 kr."); } } }

Lösningar till övningar 6.4

I I if-else med den logiska operatorn OR public class Övning64{ public static void main(String[] args) { System.out.print("Ge din ålder: "); int ålder = Keyboard.readlnt(); if (ålder < 15 I I ålder> 65) { System.out.println("Det kostar 5 kr."); }

else{ System.out.println("Det kostar 10 kr."); }

II if-satsen public class Övning65{ public static void main(String[] args){ System.out.print("Mata in längd: "l; double längd = Keyboard.readDouble(); System.out.print("Mata in vindstyrka: double vind = Keyboard.readDouble(); if (längd> 7.92 && vind behållning) { System.out.print("Går ej "); uttag = O; }

behållning -= uttag; break; case '3': break; default: System.out.print("Fel!\n") ; }

System.out.println("Du har" + behållning + " på kontot."); System.out.print("Vill du fortsätta? "); svar = Keyboard.readChar(); }while (svar == 'j' I I svar == 'J'); } }

7.11

/ / utan break public class Övning711{ public static void main(String[] args){ int tal = 1; System.out.print("exp. \t2"exp. \n\n"); for (int n = 1; n