Programmeringsteknik för Bio1 och I1. Dagens program. Så här tillämpar vi det på J-uppgifterna. Allmänna programmeringstips. Övningsgrupp 3 (Sal E33)

Relevanta dokument
Administrativt. Programmeringsteknik för I1. Dagens program. Objektorienterad programmering

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

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

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

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Objektorienterad programmering i Java

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

Lösningar för tenta 2 DAT043,

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

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

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

Fält av referenser. Konstruktorerna används för att skapa Bilar och Trafikljus.

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

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Laboration 1 - Grunderna för OOP i Java

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Tentamen OOP

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

2 b) Följande finns definierat: public class Käk String titel = "Chili con carne"; Krydda[] kryddor = new Krydda[10]; kryddor[0] = new Krydda("Svartpe

Java, klasser, objekt (Skansholm: Kapitel 2)

2 b) Följande finns definierat: public class Spel String titel = "Spel"; Dice[] tärningar = new Dice[10]; tärningar[0] = new Dice("Röd"); tärningar[1]

Objektorientering. Objekt och metoder. Objektorientering. Viktiga begrepp. Klass. Objekt. Deklarativ programmering

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.

Chapter 4: Writing Classes/ Att skriva egna klasser.

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

Språkkonventioner och redigering av tal.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Variabler som hör till enskilda objekt. Deklareras på översta nivån i klassen och i regel som private.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

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.

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

Dagens program. Programmeringsteknik och Matlab. Vad är arv? Vi ärver från GregorianCalendar. Kan vi bygga vidare på existerande klasser?

Malmö högskola 2008/2009 CTS

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

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

2 b) Bodega bodegan = new Bodega(); double moms = 0.235; String namn = "Vargtass"; System.out.println(namn + " " + moms + bodegan.ändra(moms, namn); S

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

DAT043 Objektorienterad Programmering

Idag. statiska metoder och variabler. private/public/protected. final, abstrakta klasser, gränssnitt, delegering. wrapper classes

TENTAMEN OOP

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

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

Laboration 13, Arrayer och objekt

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Kungl. Tekn. Högskolan Förel 1, bild 1 Föreläsning 1: Introduktion ffl Kursinnehåll ffl Javarepetition ffl Referenser ffl Nyckelordet static ffl Klass

Föreläsning 5-6 Innehåll

Lösningar för tenta 3 DAT043,

Tentamen. Lösningsförslag

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

2 b) Följande finns definierat: import java.awt.*; public class Uppgift1b public static void main(string[] mupp) Color färg = Color.blue; Bil[] bilar

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

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

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

TUTORIAL: KLASSER & OBJEKT

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

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

JAVA Mer om klasser och objektorientering

Objekt, Klasser, Paket m. m.

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

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

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

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

Objektsamlingar i Java

F4. programmeringsteknik och Matlab

Föreläsning 14. Filhantering

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

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

Sammanfattning och repetition utgående från typiska tentamensuppgifter

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

Objektorienterad programmering D2

Idag ska vi gå igenom. Programmeringsteknik för S, 2004 Grupp IV. Vad är en klass? Klasser och instanser

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Objekt och referenser

Grundläggande programmering med C# 7,5 högskolepoäng

Lösningsförslag övning 2.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Dagens föreläsning. Arrayer och klasser. Medan ni väntar: Gå till m.voto.se/prog11 och svara på några gamla tentamensfrågor! (26 januari 2018 F3 1 )

JAVAUTVECKLING LEKTION 7

Laboration 3, uppgift En klass för en räknare

Objektorienterad Programmering DAT043

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Omtentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-16, TDA540. Dag: , Tid:

Tentamen , Grundläggande programmering i Java

Felhantering. Andra brott mot språkets regler. Man kan också i programmet bryta mot ett antal olika regler som gäller. Exempelvis:

PROGRAMMERING-Java TENTAMINA

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

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Malmö högskola 2007/2008 Teknik och samhälle

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

Presentation av trafiksimuleringsprojektet

PROGRAMMERINGSTEKNIK TIN212

Fördjupad Java. Undantagshantering. Fel

Transkript:

Programmeringsteknik för Bio1 och I1 Övning 6 Dagens program Övningsgrupp 3 (Sal E33) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d1310/ Övningsanteckningar och diagnostiska prov: http://www.nada.kth.se/ hjorth/teaching/ Allmänna programmeringstips Hur skriver man bra kod? Kort om filhantering Hur läser vi information från fil? StringTokenizer Hur delar man upp en mening i enskilda ord? Snabb sortering Hur sorterar man objekt? Ett programmeringsexempel Hur gör man från början till slut? Allmänna programmeringstips Så här tillämpar vi det på J-uppgifterna Varför är det viktigt att först tänka igenom strukturen på programmet vi ska skriva? Skriva små program är lätt. Skriva stora program är svårt. Genom att dela upp programmet i tillräckligt små oberoende bitar som kan skrivas var och en för sig blir det enklare att få det att fungera. Varje bit kan testköras för sig och fel upptäcks fortare. Vi lägger ner lite mer tid på förarbete, men totalt sett går det snabbare. Hur tillämpar vi det på J-uppgifterna? Kopiera javakoden från er spec. till en java-fil Filen innehåller nu klasser, variabler och metodhuvuden. Se till att koden kompilerar. Metoder som har en returtyp måste returnera ett värde. int sum(int a, int b) { return 1; // Vi vill bara få koden att kompilera När koden kompilerar, börja fylla i satser i en av metoderna. I vårt fall är det ganska enkelt. int sum(int a, int b) { return a + b; Kompilera koden, testa att metoden fungerar som den ska med hjälp av en utskrift. System.out.println(sum(2,3)); // Skriver ut 5 Har det nu blivit fel så tittar vi direkt på den biten av kod vi ändrade senast.

Örjans budord Kort om filhantering Du skall aldrig skriva några satser innan du vet vad metoden som de står i är till för! Använd inte klassvariabler! Instansvariabler ska bara innehålla värden som har betydelse under hela instansens livslängd. Använd ej instansvariabler för att kommunicera mellan metoder. Namngivningen på synliga gränssnittet (metodnamn och parameterar) ska väljas utifrån anroparens perspektiv. En metod som beräknar en triangels area med Herons formel bör inte heta heron utan triangelarea. När programmet stängs glöms allt som ligger i minnet, det är därför bra att kunna spara vår information på ett mer permanent sätt. Då behöver vi kunna läsa och skriva till fil. Vi kommer här gå igenom ett sätt för hur man läser in från fil med hjälp av SimpleTextFileReader, den intresserade rekommenderas att också titta på motsvarande metod för att skriva till fil. Hur gör man då för att komma på hur den ska användas? Har man inga exempel tittar man i källkoden! Använd metoder och klasser för att dela upp problemet så att man inte behöver veta hur andra metoder fungerar när man skriver sin metod. SimpleTextFileReader.java SimpleTextFileReader.java (forts) class SimpleTextFileReader { private BufferedReader in; // Skapa en förbindelse för att läsa från stdin. public SimpleTextFileReader() { in = new BufferedReader(new InputStreamReader(System.in)); // Skapa en förbindelse för att läsa från filen filename. public SimpleTextFileReader(String filename) { try { in = new BufferedReader(new FileReader(filename)); catch(filenotfoundexception e) { e.printstacktrace(); System.exit(0); // Läser en textrad. Returnerar null vid filslut. public String readline() { String str = null; try { str = in.readline(); catch(ioexception e) { e.printstacktrace(); System.exit(0); return str; // Stänger förbindelsen till filen. public void close() { try { in.close(); catch(ioexception e) { e.printstacktrace(); System.exit(0); Observera att SimpleTextFileReader inte existerar i javas standardbibliotek, utan vi måste ladda ner den från kurshemsidan. http://www.nada.kth.se/kurser/kth/2d1311/03-04/j-uppgifter/hjaelpfiler/ Den största fördelen med att använda klassen SimpleTextFileReader är att vi slipper ta hand om IOExceptions.

Hur anropar vi SimpleTextFileReader? Ett exempel Vi skriver ett minimalistiskt program som läser in en textfil rad för rad och skriver ut den på skärmen. class FilTest { SimpleTextFileReader f = new SimpleTextFileReader("hej.txt"); String s; // läser in första raden Vi vill nu skriva ett program som kan läsa in data om ett antal personer från fil och sedan skriva ut dem i åldersordning. Vad behöver vårt program kunna göra? Läsa in personerna från fil while(s!= null) { // kollar om aktuell rad är tom System.out.println(s); // skriver ut raden // läser in nästa rad f.close(); // stänger filen Mellanlagra personerna i en Vector Sortera personerna efter ålder Skriva ut personerna i åldersordning När vi kompilerar och kör koden, ser det ut så här. >javac FilTest.java >java FilTest Hej detta är rad ett. Detta är rad två. Detta är rad tre, vår sista rad i filen. Vi vill skriva programmet stegvis så att det går att testköra varje del för sig. Det går då snabbare att finna de fel som uppkommer än om vi skriver hela programmet och sedan börjar felsöka. Vi skapar en klass för en person Test av vår nya klass Eftersom vi ska arbeta med personer kan det vara vettigt att skapa en klass som har hand om all data om en enskild person. I filen Person.java skriver vi, class Person { private int födelseår; private String ögonfärg; private String kön; Person(int födelseår, String kön, String ögonfärg) { this.kön = kön; this.ögonfärg = ögonfärg; return "En " + ögonfärg + "ögd " + kön + " född " + födelseår; Vi har infört tre instansvariabler samt skrivit en konstruktor och en tostring-metod för utskrift. Vi kommer successivt utvidga den här klassen medan vi kodar. Det här är bara för att komma igång. För att kontrollera att vår Person-klass är korrekt skriver vi en enkel testklass i TestPerson.java class TestPerson { public static void main(string[] inparametrar) { Person p = new Person(1978, "man", "blå"); Om vi kompilerar och kör den här koden, så får vi följande utskrift >javac TestPerson.java >java TestPerson En blåögd man född 0 Koden är tillräckligt korrekt för att kompilatorn ska godkänna den, men det är uppenbarligen något fel med mannens födelseår. Kan ni se felet?

Felsökning! Jakten fortsätter... Vi börjar med att kolla de enklaste möjligheterna till fel först så vi kan utesluta dem. En snabb blick på tostring-metoden och vi konstaterar att den skriver ut rätt variabel. return "En " + ögonfärg + "ögd " + kön + " född " + födelseår; Vi tar och tittar närmare på konstruktorn, Person(int födelseår, String kön, String ögonfärg) { this.kön = kön; this.ögonfärg = ögonfärg; Tilldelningsraden verkar se bra ut, Alltså måste instansvariabeln som innehåller året fått fel värde någonstans, men var? I main-metoden skickar vi in 1978 till konstruktorn. public static void main(string[] inparametrar) { Person p = new Person(1978, "man", "blå"); Tittar vi på konstruktorns formellaparametrar ser vi att den första heter födelseår med stort Å. Person(int födelseår, String kön, String ögonfärg) Både this.födelseår och födelseår är samma variabel. Vi har alltså tilldelat instansvariabeln sitt eget värde och sedan kastat bort den lokala variabeln födelseår. Detta är felet! Lösning: Vi ändrar det stora Å:et till ett litet. Vi skriver ett skal Inläsning från fil Vi skapar en mall för hur klassen Personer ska se ut. Metoderna får förklarande namn, vi vet dock ännu inte exakt hur de ska skrivas inuti. Med SimpleTextFileReader kan vi enkelt läsa in flera personer från en fil. import java.util.*; class Personer { private Vector personer; // här lagras alla personer I filen personer.txt står det, Gustav 2002 man brun Johan 1983 man blå Birgit 1921 kvinna blå Igor 1899 man röd Personer(String filnamn) { // konstruktor personer = new Vector(); läsinfrånfil(filnamn); sorteraålder(); private void läsinfrånfil(string filnamn) { private void sorteraålder() { return "text"; Eftersom varje rad innehåller flera fält med information kommer vi också få användning av StringTokenizer som delar upp en mening i ord. Hur använder vi StringTokenizer? Personer p = new Personer("personer.txt"); Notera att vi i main metoden instansierar ett objekt av klassen Personer. Detta är fullt tillåtet.

StringTokenizer Vi skriver läsainfrånfil-metoden Svaret till hur vi använder StringTokenizer finner vi i Java API. http://www.sgr.nada.kth.se/unix/docs/java/api/ Constructor Summary StringTokenizer(String str) Constructs a string tokenizer for the specified string. Method Summary Observera alla utskrifter, de hjälper oss felsöka ifall något skulle bli fel. private void läsinfrånfil(string filnamn) { SimpleTextFileReader f = new SimpleTextFileReader(filnamn); StringTokenizer st; Person p; String namn, kön, ögonfärg, s; int ålder; // temporära variabler // läser in första raden while(s!= null) { // kollar om aktuell rad är tom System.out.println("Inläst rad: " + s); st = new StringTokenizer(s); // delar upp strängen int counttokens() Calculates the number of times that this tokenizer s nexttoken method can be called before it generates an exception. boolean hasmoretokens() Tests if there are more tokens available from this tokenizer s string. String nexttoken() Returns the next token from this string tokenizer. namn = st.nexttoken(); ålder = Integer.parseInt(st.nextToken()); kön = st.nexttoken(); ögonfärg = st.nexttoken(); // hämtar sista delsträngen p = new Person(namn, ålder, kön, ögonfärg); System.out.println("Persondata: " + p); personer.addelement(p); // spara personen i vektorn // läser in nästa rad f.close(); // stänger filen Kompilera och testkör Personers tostring-metod Vi kompilerar och testkör för att se att vår inläsning fungerar som den ska. >javac Personer.java >java Personer Inläst rad: Gustav 2002 man brun Persondata: Gustav är en brunögd man född 2002 Inläst rad: Johan 1983 man blå Persondata: Johan är en blåögd man född 1983 Inläst rad: Birgit 1921 kvinna blå Persondata: Birgit är en blåögd kvinna född 1921 Inläst rad: Igor 1899 man röd Persondata: Igor är en rödögd man född 1899 Uppgiften för tostring-metoden är att iterera igenom hela vektorn personer och lägga till var och en av dem till strängen som sedan returneras. En String kan inte ändras efter att den skapats. Därför använder vi oss av StringBuffer-klassen och konverterar resultatet till String i slutet. StringBuffer s = new StringBuffer(); Person p; Det ser ut som om inläsningen fungerar, då är nästa steg att kolla att vektorn personer har fyllts på korrekt och sedan att sortera den! for(int i = 0; i < personer.size(); i++) { p = (Person) personer.elementat(i); s.append(i + ": " + p.tostring() + "\n"); return s.tostring(); // Vi använder StringBuffers tostring metod Vi lägger också till en utskrift av p i main-metoden. Personer p = new Personer("personer.txt");

Vi kompilerar och testkör Snabb sortering Vi kompilerar och testkör vårt program, >javac Personer.java >java Personer Inläst rad: Gustav 2002 man brun Persondata: Gustav är en brunögd man född 2002 Inläst rad: Johan 1983 man blå Persondata: Johan är en blåögd man född 1983 Inläst rad: Birgit 1921 kvinna blå Persondata: Birgit är en blåögd kvinna född 1921 Inläst rad: Igor 1899 man röd Persondata: Igor är en rödögd man född 1899 0: Gustav är en brunögd man född 2002 1: Johan är en blåögd man född 1983 2: Birgit är en blåögd kvinna född 1921 3: Igor är en rödögd man född 1899 Det ser bra ut, vektorn med personer skrivs ut på rätt sätt. Tjusigt! Nu är det bara sorteringen som återstår... Java har inbyggda rutiner för sortering. Det enda vi behöver göra är att berätta för algoritmen hur man jämför två personer, det vill säga vilken som ska komma först av de två. Detta gör vi enklast genom att modifiera Person-klassen. Orden implements Comparable efter klassnamnet på nästa sida betyder att vi lovar att implementera metoden compareto vilken behövs för att sorteringen ska fungera. Två nya metoder har tillkommit i Person, först public int getfödelseår() { return födelseår; och sedan compareto-metoden som vi lovade implementera public int compareto(object o) { Person p = (person) o; return födelseår - p.getfödelseår(); Sortera! Vår sorterbara Person-klass Eftersom vi nu har en naturlig ordning på våra Person objekt kan vi använda de inbyggda sorteringsmetoderna för att ordna dem i rätt ordning. Själva sorteringen utförs genom anropet Collections.sort(personer); vilket vi gör i sorteraålder-metoden i Personer-klassen. Hur ser de färdiga klasserna ut? class Person implements Comparable { private String namn; private int födelseår; private String ögonfärg; private String kön; Person(String namn, int födelseår, String kön, String ögonfärg) { this.namn = namn; this.kön = kön; this.ögonfärg = ögonfärg; return namn + " är en " + ögonfärg + "ögd " + kön + " född " + födelseår; public int getfödelseår() { return födelseår; public int compareto(object o) { Person p = (Person) o; return födelseår - p.getfödelseår();

Den uppdaterade Personer-klassen import java.util.*; class Personer { private Vector personer; Personer(String filnamn) { personer = new Vector(); läsinfrånfil(filnamn); sorteraålder(); private void läsinfrånfil(string filnamn) { SimpleTextFileReader f = new SimpleTextFileReader(filnamn); StringTokenizer st; String namn, kön, ögonfärg, s; int ålder; private void sorteraålder() { Collections.sort(personer); StringBuffer s = new StringBuffer(); Person p; for(int i = 0; i < personer.size(); i++) { p = (Person) personer.elementat(i); s.append(i + ": " + p.tostring() + "\n"); return s.tostring(); Personer p = new Personer("personer.txt"); // läser in första raden while(s!= null) { // kollar om aktuell rad är tom st = new StringTokenizer(s); namn = st.nexttoken(); ålder = Integer.parseInt(st.nextToken()); kön = st.nexttoken(); ögonfärg = st.nexttoken(); personer.addelement(new Person(namn, ålder, kön, ögonfärg)); Här har nu metoden sorteraålder blivit implementerad. Vi har även tagit bort en del av utskrifterna till skärmen från läsinfrånfil eftersom vi vet att det fungerar. // läser in nästa rad f.close(); // stänger filen Vi kompilerar och kör Kom ihåg! Vi kompilerar vårt program och kör... >javac Personer.java >java Personer 0: Igor är en rödögd man född 1899 1: Birgit är en blåögd kvinna född 1921 2: Johan är en blåögd man född 1983 3: Gustav är en brunögd man född 2002 Tänk igenom hur programmet ska fungera först Bygg upp programmet stegvis Kompilera om så fort du ändrat något Rätta nya fel direkt Det fungerar! Personerna är sorterade i rätt ordning. Slutet gott allting gott. :-)