725G61 - Laboration 4 Interaktion och I/O. Johan Falkenjack

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

725G61 - Laboration 2 Loopar och arrayer. Johan Falkenjack

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

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

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

Objektorienterad Programmering (TDDC77)

//Använd main som ett "handtag" för att hålla ihop programmet. //Själva programmet finns i övriga klasser.

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

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

F4. programmeringsteknik och Matlab

OOP Objekt-orienterad programmering

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

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Språkkonventioner och redigering av tal.

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

Föreläsning 6: Undantag, filhantering samt flera användbara klasser

Chapter 4: Writing Classes/ Att skriva egna klasser.

Tentamen , Introduktion till Java, dtaa98, dtea53

OOP Objekt-orienterad programmering

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

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

Föreläsning 3-4 Innehåll

OOP Objekt-orienterad programmering

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

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Föreläsning 14. Filhantering

Felhantering TDDD78, TDDE30, 729A

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Föreläsning 1 & 2 INTRODUKTION

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Algoritmer. Två gränssnitt

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

Tentamen FYTA11 Javaprogrammering

JAVAUTVECKLING LEKTION 7

Föreläsning 3. Stack

TENTAMEN OOP

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

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

"if"-satsen. Inledande programmering med C# (1DV402)

Föreläsning 1 & 2 INTRODUKTION

Tentamen OOP

SMD 134 Objektorienterad programmering

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

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

Objektorienterad Programmering (TDDC77)

Föreläsning 6: Metoder och fält (arrays)

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

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

PROGRAMMERING-Java Omtentamina

Objektorienterad programmering E. Telefonboken, än en gång. Gränssnitt. Telefonboken med gränssnitt specificerat, del 1.

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

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

Objektorienterad programmering i Java

JAVAUTVECKLING LEKTION 4

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

Chapter 3: Using Classes and Objects

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Tentamen , Grundläggande programmering i Java

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

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

Tentamen ID1004 Objektorienterad programmering May 29, 2012

OOP Objekt-orienterad programmering

Fördjupad Java. Undantagshantering. Fel

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

DAT043 Objektorienterad Programmering

Objektorienterad programmering D2

Skillnader mellan Python och Java

Objektorienterad Programmering (TDDC77)

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

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

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

Laboration: Whitebox- och blackboxtesting

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

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

TDDC77 Objektorienterad Programmering

725G61 - Laboration 1 Variabler och villkorssatser. Johan Falkenjack

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Föreläsning 8: Exempel och problemlösning

Föreläsning 12. Föreläsning 12. Rörliga figurer Klassen Timer Undantag Något om applets. Rörliga appletsfigurer Klassen Timer Undantag

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

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

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

Parallellism, återblick

Föreläsning 3. Stack

Objektorienterad Programmering DAT043. Föreläsning 4 23/1-18 Moa Johansson (delvis baserat på Fredrik Lindblads material)

Lösningar för tenta 2 DAT043,

Tentamen i Introduktion till programmering

Ordlistor, filhantering och ut på webben. Linda Mannila

TENTAMEN OOP

Recitation 4. 2-D arrays. Exceptions

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

Föreläsning 2, vecka 8: Repetition

Transkript:

725G61 - Laboration 4 Interaktion och I/O Johan Falkenjack November 5, 2013

1 Inledning I labb 1-3 har vi tittat på de grundläggande byggstenarna i programmering. Vi kommer återkomma till detta ämne när vi börjar titta på objektorientering i labb 5. I den här labben kommer vi dock fokusera på lite mer praktiska detaljer om interaktion. En användare kommunicerar med ett program genom ett gränssnitt. Idag har de allra flesta datorprogram ett GUI, Graphical User Interface. Dessa kan i Java konstrueras t.ex. med ramverket Swing. Att bygga sådana grafiska gränssnitt är dock tidskrävande och förhållandevis komplicerat. Ni kommer få testa ett mycket enkelt fall i slutet av den här kursen. En enklare form av gränssnitt är en textbaserad interaktionsloop. Fram till 90-talet byggde alla program på sådana interaktionsloopar och många mer avancerade användare använder sig fortfarande av program med sådana interaktionsloopar. För er som är Linux-användare eller använt kommandoprompten i Windows är interaktionsloopar inte helt nytt. Interaktionsloopar erbjuder inte lika mycket valfrihet och simultant arbete som ett GUI men å andra sidan kan man arbeta mer fokuserat med en enskild uppgift. Många mer avancerade program har interaktionsloopar som kan hantera mycket långa och komplicerade kommandon som i sig nästan kan kallas för program. Många programspråk, som t.ex. Python och Lisp, kan också programmeras direkt i en sådan interaktionsloop. Vi ska i den här labben bygga upp ett litet program som använder sig av interaktionsloopar. 2 Enkel inmatning I labb två använde vi oss av klassen Scanner för att göra mycket enkel inmatning. Här ska vi titta mer på Scanner och hur den fungerar för olika typer av inmatning. I labb två läste vi bara in strängar, det går dock att mata in andra typer också. 1

Övning 4.1 1 class IntegerInput { 2 public static void main (String[] args) 3 throws Exception { 4 java.util.scanner in = 5 new java.util.scanner (System.in); 6 System.out.print("an integer: "); 7 int int1 = in.nextint(); 8 System.out.print("an integer: "); 9 int int2 = in.nextint(); 10 int sum = int1 + int2; 11 System.out.println("sum: " + sum); 12 13 Exekvera det här programmet flera gånger, mata in olika heltal olika gånger. Vad händer om du tillför programmet ett, två respektive tre heltal vid den första inmatningen? Vad händer om du trycker på returtangenten utan att ha matat in ett heltal? Vad händer om du skriver in ett tecken istället för ett heltal? Scanner är dock bara en wrapper för System.in.read() som ger oss lite extra funktionalitet och gör det lite enklare. I vissa fall används dock System.in.read() direkt. Övning 4.2 1 class CharacterInput { 2 public static void main (String[] args) 3 throws Exception { 4 System.out.print("a charcter: "); 5 char c = (char) System.in.read(); 6 System.out.print("another character: "); 7 int code = System.in.read(); 8 System.out.println("The first character: " 9 + c); 10 System.out.println("The Unicode-code for the " + 11 "second character: " + code); 12 13 Exekvera programmet flera gånger och mata in olika tecken. skapas? Vilken utskrift 2

Övning 4.3 1 class EmptyingBuffer { 2 public static void main (String[] args) 3 throws Exception { 4 System.out.print("a character: "); 5 char c1 = (char) System.in.read(); 6 System.in.read(); 7 // System.in.read(); 8 System.out.print("a charcter: "); 9 char c2 = (char) System.in.read(); 10 System.out.println("the characters: " + 11 c1 + " " + c2); 12 13 Exekvera det här programmet flera gånger, mata in olika tecken olika gånger. Vad händer om ett, två respektive tre tecken tillförs programmet vid den första inmatningen? Vad händer om man bara trycker på returtangenten? Vad händer om kommentarsmarkeringen tas bort? Övning 4.4 Skriv ett program som låter användaren mata in ett heltalsvärde och ett flyttalsvärde, och som sedan undersöker om heltalsvärdet är mindre än flyttalsvärdet, lagrar och skriver ut resultatet av jämförelsen. Exekvera programmet med olika värden, t ex 1 och 1.2, 1 och -1.2, 1 och 1.0 osv. 3 Interaktionsloopen I det här avsnittet, och i resten av labben, kommer vi arbeta med och runt en interaktionsloop. 3

UPPGIFT 4.1 Skapa en ny klass som heter Interaction. Innan vi gör något annat ska vi skapa två egna utskriftsmetoder. Detta kan verka lite konstigt men ni kommer förstå senare i labben varför vi gör detta. Den första metoden ska heta print() och ska ta ett sträng och skriva ut den med System.out.print(), dvs utan en extra radbrytning. Den andra metoden heter printline() och ska ta en sträng, lägga till en radbrytning i slutet, och skicka resultatet till print(). En radbrytning i en sträng representeras av specialtecknet \n. Viktigt att veta är att när man anropar System.out.print() respektive System.out.println() så konverteras automatiskt argumentet till en sträng. Nu när vi skapat våra egna wrappers för dessa måste vi själva konvertera argumentet till en sträng. Det görs för primitiva datatyper med metoden String.valueOf(). UPPGIFT 4.2 I den här uppgiften ska ni lägga grunden för resten av uppgifterna i labben. På alla ställen där något skrivs ut ska ni använda print() och printline() från uppgift 4.1. Skapa en metod i Interaction som heter toploop() som inte tar några argument och inte returnerar något. Metoden toploop() ska innehålla en evig while-loop som skriver ut "» " och sedan läser in ett kommando och hanterar det. Om kommandot är "quit" ska loopen avbrytas (använd en if-sats och break för att avbryta loopen snarare än ett predikat i while-satsen). Annars ska ingenting göras och loopen ska bara fortsätta. Ni ska också skapa en main-metod som skriver ut "Welcome to the program.\nwrite quit to quit.", anropar toploop() och sist skriver ut "Quitting program, goodbye!". Kom ihåg att använda print() och printline(). Här kommer ett exempel på hur det kan se ut när programmet körs: Welcome to the program. Write quit to quit. >> test >> help >> dsfg >> 123 >> gfsd >> >> quit Quitting program, goodbye! Precis som i labb 2 har vi nu skapat en mycket enkel interaktionsloop. Traditionellt sett brukar det dock inte vara så här enkelt att avsluta ett program. Programmerare vill oftast att användarna ska sitta kvar vid programmet så 4

länge så därför vill man vara säker på att användaren verkligen vill avsluta. Härifrån kommer det klassiska "är du säker på att du vill avsluta"-fenomenet. Vissa anser detta vara ett otyg men då man faktiskt ibland gör fel och råkar avsluta för tidigt så ska vi skapa just en sådan funktionalitet i vårt program. UPPGIFT 4.3 Skapa en metod som skriver ut frågan "Write y if you really want to quit: " som sedan läser in en sträng, om strängen är "y" ska metoden returnera true, om strängen är något annat ska metoden returnera false. Anropa metoden på lämpligt sätt från toploop() så att den används när man försöker avsluta. Här kommer en exempelinteraktion: Welcome to the program. Write quit to quit. >> quit Write y if you really want to quit: >> quit Write y if you really want to quit: n >> quit Write y if you really want to quit: yes >> quit Write y if you really want to quit: y Quitting program, goodbye! 4 Hantering av kommandon Normalt sett vill man att ett program ska informera om det får input som det inte kan tolka. Säg t.ex. att vi tror att det finns ett kommando "add" som lägger ihop en serie heltal och skriver ut summan. Om man testar och det visar sig att add inte exister brukar "Unknown command add " eller något liknande skrivas ut. Vi ska nu se till att vårt program gör just det. Men först kommer en övning på att dela upp strängar. 5

Övning 4.5 1 public class SplitExample { 2 public static void main(string args[]) { 3 String fullstring = "fish-eggs-milk"; 4 String delimiter = "-"; 5 String[] temp = fullstring.split(delimiter); 6 for(string part : temp) { 7 System.out.println(part); 8 9 10 Vilken utskrift får du när du exekverar det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. Prova att byta ut strängen fullstring mot olika strängar och delimiter mot olika tecken. UPPGIFT 4.4 Skapa en ny metod handleinput() som tar en String-array som input. Metoden ska sedan skriva ut "Unknown command kommando " där kommando är det första elementet i arrayen. Metoden handleinput() ska anropas från toploop() på ett lämpligt sätt (skriver man inget alls ska loopen bara fortsätta precis som tidigare). Använd den inbyggda metoden split() för strängar för att dela upp inputsträngen som läses in. Här kommer en exempelinteraktion: Welcome to the program. Write quit to quit. >> >> g Unknown command g >> add 1 2 Unknown command add >> quit Write y if you really want to quit: y Quitting program, goodbye! Ofta vill man skicka med argument till ett kommando, som t.ex. add. Till add skickade vi en serie heltal. Implementationen av Scanner innebär dock att vi läser in dessa tal som strängar. På något sätt måste vi alltså konvertera strängarna till heltal. Det fungerar inte att använda vanliga casts så som vi 6

gjorde i labb 1. I klassen Integer finns metoden parseint() som tar en sträng och, om den kan tolkas som ett heltal, returnerar motsvarande heltal. Klassen String har en motsvarande metod, valueof(), som nämndes i uppgift 4.1, som konverterar t.ex. ett heltal till en sträng. Övning 4.6 public class StringConversion { public static void main(string[] args) { System.out.println(1 + 1); System.out.println(String.valueOf(1) + 1); String number = "1"; System.out.println(number + number); System.out.println(number + Integer.parseInt(number)); System.out.println(Integer.parseInt(number) + Integer.parseInt(number)); Vilken utskrift får du när du exekverar det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. 7

UPPGIFT 4.5 I den förra uppgiften försökte, och misslyckades, vi använda kommandot add. I den här uppgiften ska vi implementera just det kommandot. Skapa en metod add() som tar en String-array som innehåller hela add-kommandot (t.ex. "add", "1", "1" och som beräknar och skriver ut summan av de inskickade heltalen, använd String.valueOf() för att konvertera summan till en sträng. Lägg sedan till funktionalitet i handleinput() för att identifiera kommandot add och anropa metoden med samma namn. Andra kommandon ska fortfarande resultera i "Unknown command". a Här kommer en exempelinteraktion: Welcome to the program. Write quit to quit. >> fdsf Unknown command fdsf >> add 0 >> add 1 2 3 6 >> quit Write y if you really want to quit: y Quitting program, goodbye! a Här hade det kunnat vara aktuellt att använda en switch-sats och lägga till fall allt eftersom och ha Unknown command i default-fallet. I den Java-version vi använder i kursen (1.6) kan man dock inte switcha på String utan bara på primitiva datatyper så istället får man använda if. Från och med Java 1.7 går det att switcha även på String. 5 Undantag - Exceptions I tidigare labbar har vi tittat på styrstrukturen if, och i den här labben har vi använt if för att göra viss grundläggande felhantering, dvs att kontrollera att kommandot vi försöker använda faktiskt finns. Ett mer Java-likt sätt att sköta felhantering är att använda undantag, eller exceptions. Undantag är ett sätt att "bevaka" ett program och hantera olika typer av fel när de uppstår och på den mest lämpliga nivån. När vi använder if för felhantering måste vi i förväg komma på var olika fel kan uppstå och kolla att t.ex. indata till en metod inte kommer få metoden att krascha. När vi använder undantag behöver vi bara veta vilken typ av fel som kan uppstå och var det ska hanteras. Undantag används på följande sätt: Omge ett stycke kod med en så kallad try-sats, om ett fel uppstår under körningen av koden i denna try-sats (oavsett 8

hur många funktionsanrop bort) så kastas ett undantag som tas emot av en catch-sats. En catch-sats kan liknas vid en else-sats. Här kommer en övning som visar hur vi kan se till att inte programmet kraschar när vi försöker hämta ut värdet på ett index som inte finns i en array. Övning 4.7 import java.io.*; public class ExcepTest{ public static void main(string args[]){ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); System.out.println("Out of the block"); Vilken utskrift får du när du exekverar det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. Lägg sedan till rader så att det istället ser ut såhär: import java.io.*; public class ExcepTest{ public static void main(string args[]){ try { int a[] = new int[2]; System.out.println("Access element three :" + a[3]); catch(arrayindexoutofboundsexception e) { System.out.println("Exception thrown :" + e); System.out.println("Out of the block"); Vilken utskrift får du när du exekverar det här programmet? Försök att förutsäga vilken utskriften kommer att bli innan du exekverar programmet, kontrollera sedan om det stämmer och analysera resultatet. Vad händer om du byter ut koden i catch-blocket mot följande? e.printstacktrace(); 9

UPPGIFT 4.6 Nu går vi tillbaka till programmet som innehåller vår interaktionsloop, vad händer när du kör add f s? Lägg till en try-catch-sats i metoden add för att fånga exceptions som kastas av Integer.parseInt() när man försöker mata in något annat än heltal som argument. Börja med att fånga det undantag som kastas, dvs ett generellt undantag av typen Exception, och kör i catch-blocket metoden printstacktrace() på undantaget som fångats för att se vilken typ av undantag som kastas. Vad händer med exekveringen av programmet i övrigt när vi lagt till en trycatch-sats i add()? Kommer programmet fortfarande krascha och avslutas? Ändra sedan catch-raden så att bara den specifika undantagstypen som faktiskt kastas kommer att fångas. När det är gjort ska kroppen i catch-satsen ändras så att den avbryter beräkningen av summan och skriver ut "Argument error: The add command can only add integers." Exempelkörning: Welcome to the program. Write quit to quit. >> add 1 2 3 6 >> add 1 d 3 Argument error: The add command can only add integers. >> add 1 2 3 I vissa fall vill man att ens kod ska kasta undantag även där Java självt inte identifierar ett fel. Man kan t.ex. hantera felaktig input redan innan felet orsakat problem i någon operation senare i programmet. För att kasta ett undantag använder man kommandot throw, se Övning 4.8 för ett exempel. Där kan vi också se hur man kan hänga på flera catch-block på en try för att fånga olika typer av undantag, och därmed kunna hantera olika typer av fel på olika sätt. 10

Övning 4.8 public class ThrowExample { public static void main(string[] args) { Scanner in = new Scanner(System.in); int[] positive = {0, 1, 2, 3; try { System.out.println("Input one of the first" + " three positive integers."); int index = Integer.parseInt(in.nextLine()); if (index == 0) { throw new IndexOutOfBoundsException(); System.out.println(positive[index]); catch (NumberFormatException e) { System.out.println("You think that s " + "an integer?!"); catch (IndexOutOfBoundsException e) { System.out.println("Sorry, that " + "index isn t availible!"); Testkör programmet. Vad händer när man skickar in olika värden? Prova att skicka in olika heltal, t.ex. 0 och 2, men också något annat tecken som t.ex. a. 6 Hjälp För att para ihop data när man programmerar kan man i de enklaste fallen använda associationstabeller eller associationslistor. Detta är en typ av datastruktur som används på ett liknande sätt som en array, med den skillnaden att man inte hämtar ut ett värde med ett index utan med en nyckel. En nyckel kan vara t.ex. ett tecken, eller en sträng, eller liknande. Kärt barn har många namn och precis som för subrutiner finns det många namn på associationstabeller. Ett namn som används t.ex. av programmeringsspråket Python är dictionary, detta namn ger ett exempel på hur en associationstabell kan användas, som en ordbok med uppslagsord kopplade till en beskrivning. Ett annat vanligt namn är map, som kommer från det engelska ordet för en funktion som för ett givet input alltid ger ett visst output. Slå upp HashMap i JavaDoc och ta reda på hur en sådan fungerar i Java inför nästa uppgift. Använd Google för att hitta exempel om det behövs. 11

UPPGIFT 4.7 Vi ska nu skapa ett hjälp-kommando. Skapa en global variabel (static-variabel som ligger utanför metoder och direkt i klassen) som heter helpdata och som är en HashMap med strängar både som nyckel och värde. När det är gjort ska ni lägga till alla kommandon som finns i programmet som nycklar och en kort beskrivning av dessa som motsvarande värde (detta bör göras först i mainmetoden), se i exemplet nedan hur beskrivningarna kan se ut. Skapa sedan en metod för kommandot help. Kommandot help ska fungera på följande sätt: >> help Available commands: help add quit >> help add Add a series of integers. >> help help Displays a help message. >> help quit Ends the program. >> help lol Unknown command lol >> 7 Filhantering Vi har nu provat att läsa in från tangentbordet och vi har länge kunnat skriva ut till skärmen. Detta är dock bara en typ av I/O (input/output, dvs ett programs kommunikation med omvärlden). En annan viktig typ av I/O är filhantering, dvs att kunna läsa från och skriva till fil. Det ska vi öva på i det här avsnittet. 12

Övning 4.9 1 class WriteReadExample { 2 public static void main (String[] args) { 3 String f = new String ("seasons.txt"); 4 try { 5 FileWriter fout = new FileWriter(f); 6 fout.write("winter spring summer autumn"); 7 fout.close(); 8 FileReader fin = new FileReader(f); 9 char[] c = new char[100]; 10 int n = fin.read(c); 11 for (int i = 0; i < n; i++) { 12 System.out.print(c[i]); 13 14 fin.close(); 15 catch (IOException e) { 16 e.printstacktrace(); 17 18 19 Vad händer när det här programmet exekveras? Hur ser filen som skapas ut? Vad gör vi på rad 10 och varför? Vilken utskrift får man på standardutmatningsenheten? Titta på JavaDoc för FileWriter om ni behöver. 13

Övning 4.10 1 class BRExample { 2 public static void main (String[] args) { 3 String f = new String ("seasons.txt"); 4 try { 5 FileWriter fout = new FileWriter(f); 6 fout.write("winter\nspring\nsummer\nautumn"); 7 fout.close(); 8 BufferedReader br = 9 new BufferedReader(new FileReader(f)); 10 String line; 11 while ((line = br.readline())!= null) { 12 System.out.println(line); 13 14 br.close(); 15 catch (IOException e) { 16 e.printstacktrace(); 17 18 19 Vad händer när det här programmet exekveras? Hur ser filen som skapas ut? Vilken utskrift får man på standardutmatningsenheten? Vad är fördelen med det här tillvägagångssättet jämfört med en ren FileReader? På kurshemsidan, i anslutning till labbarna, finns javaklassen MakeStory. Ladda ner den och importera den i ditt projekt. Lägg sedan till metoden makestory() som finns nedan i Interaction. Lägg sedan till kommandot story i toploop och i helpdata (med beskrivningen "Generate a story".) och testa att det fungerar att generera en saga. private static void makestory() { Scanner in = new Scanner(System.in); print("what is thy name? "); MakeStory.name = in.nextline(); print("what is thy title? "); MakeStory.title = in.nextline(); print("what is thy appearance? "); MakeStory.appearance = in.nextline(); print("have you got a magic bag? (y/n)"); if (in.nextline().equals("y")) { MakeStory.magic_bag = true; else { 14

MakeStory.magic_bag = false; print("are you happy? (y/n)"); if (in.nextline().equals("y")) { MakeStory.happy = true; else { MakeStory.happy = false; print("have you got a secret? (y/n)"); if (in.nextline().equals("y")) { MakeStory.secret = true; else { MakeStory.secret = false; printline(makestory.generate()); UPPGIFT 4.8 Modifiera kommandot story och metoden makestory() så att man kan ge story ett argument. Argumentet ska vara ett filnamn och när man kör exempelvis följande >> story out.txt så ska den genererade sagan skrivas till filen out.txt istället för att skrivas ut på skärmen. Får story inget argument ska sagan skrivas ut på skärmen som tidigare. Kom ihåg att inte duplicera kod mer än nödvändigt. UPPGIFT 4.9 På kurshemsidan finns filen wizards.txt som är i så kallat CSV-format, Comma Separated Values. Skapa ett kommando generatestories som tar ett filnamn som argument, läser in filen och genererar sagor utifrån de värden som finns i filen och skriver dessa till skärmen. 8 Redovisning Nu när ni är färdiga med alla uppgifter är det dags at lämna in era lösningar för Uppgift 4.1 till 4.9 för rättning. Gå igenom era lösningar en extra gång och se till så att hi har kommenterat er kod, och testkört den noga så att ni är säkra på att alla lösningar fungerar. Samla ihop kodfilerna (filerna som slutar på.java) i ett zip-arkiv och ladda upp zip-filen under Labb4 i LISAM. Glöm inte att skriva namnen på båda gruppmedlemmarna i kommentarsfältet vid inlämningen. 15