Dagens plan. Inf1000 (Uke 8) Mer om objekter og filbehandling. Hva er en metode. Mer om metoder/klasser/objekter. Tilslutt noen råd til oblig 3

Like dokumenter
Dagens plan. Inf1000 (Uke 8) Mer om objekter og filbehandling. Hva er en metode. Mer om metoder/klasser/objekter. Tilslutt noen råd til oblig 3

Inf1000 (Uke 8) Mer om objekter og filbehandling

Hva er en metode. Hva skjer når vi kaller en metode

INF1000 : Forelesning 5

Java 6. Eksempel med to-dimensjonal array Filbehandling Tekster

Forelesning inf Java 5

Oversikt. Filer. Litt mer om tekster. INF1000 Uke 6. Lese og skrive fra/til fil. Eksempel. Vi importerer pakken easyio. Klassene In og Out i easyio

Inf1000, uke 5 19 sept. 2006

INF1000 Uke 5. Litt om objekter, filer med easyio, tekst

Ole Christian Lingjærde, 12. september 2013

Forelesning inf Java 4

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

Oversikt. INF1000 Uke 6. Objekter, pekere og null. Lese og skrive fra/til fil. Litt om objekter, pekere og null Filer og easyio. Litt mer om tekster

Spørsmål fra forrige forelesning. INF1000 Forelesning 7. Oppførselen til inword()/inint()/etc. Operator-presedens i Java

Inf1000 uke sept 2011

Inf1000 uke sept 2011

Hva er en metode? INF1000 Forelesning 8. Hva skjer når vi kaller en metode? Hvorfor bruke metoder?

Metodekall. INF1000 Uke 5. Overlasting av metoder. Bruk av arrayreferanser som parametre

Inf1000 (Uke 5) Arrayer, filer og tekst

INF1000 Forelesning 8. Litt repetisjon: Metoder og klasser Innkapsling av variable og metoder Hvordan gripe an et stort problem?

INF1000 (Uke 11) Programmering

Innhold. INF1000 (Uke 11) Programmering. Rep: Metoder. Rep: Hva er en metode? Litt repetisjon. To måter å programmere på

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

1. Separatorer (skilletegn) i easyio

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

INF1000 (Uke 4) Mer om forgreninger, While-løkker

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Repetisjon. Mer om forgrening While-løkker

UNIVERSITETET I OSLO

Generelt om oblig 3. Oppgaveteksten kort sammendrag. Deloppgaver/menyvalg 15/03/2010. INF1000 Forelesning 9

I dag INF1000 (Uke 4) Mer om forgreninger, While-løkker. Tre måter å lese fra terminal. Tre måter å lese fra terminal.

Java-program. INF1000 høst Numeriske typer. long og float

INF1000 høst 2010 Forelesning 3: Avrunding av elementær innføring

UNIVERSITETET I OSLO

Dagens tema Kapittel 8: Objekter og klasser

! " ##$ % 4 2, &/ ( & +, )-. &* &/ ),* 0, 1 1 ( &/ 2& &, & &/ &,, &/" 2 &/ 2 ) *

( & ( &/ 2& , )-. &* &/ ),* 0, &/ 2 ) *

Uke 9 INF okt 2012 Om separatorer I easyio, Eliza (bruk av HashMap), + mer om metoder og klasser. Arne Maus OMS, Ifi, UiO

I dag. Rep: Oppsummering - variabler. Rep: Datatyper. INF1000 (Uke 3) Mer om uttrykk, terminal I/O, forgreninger

Eksamensrelevant repetisjonsstoff. Deklarasjoner og variabeltyper. Konstanter

Uke 11 noen tips og råd + eksempel. Noen muligheter. Valg av datamodell: eksempel. Valg av datamodell: oblig 4

Innhold uke 4. INF 1000 høsten 2011 Uke 4: 13. september. Deklarasjon av peker og opprettelse av arrayobjektet. Representasjon av array i Java

INF1000: noen avsluttende ord

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Tre måter å lese fra terminal. Java 4. Eksempel. Formatert utskrift til skjerm

UNIVERSITETET I OSLO

s 678 * Hvordan designe og programmere objektorientert * Støtte til oppstart på Oblig 4: Jobbe frem eget forslag til datastruktur

INF 1000 høsten 2011 Uke 10: 25. november

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF Uke 10. Ukesoppgaver oktober 2012

Forelesning inf Java 4

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

Forelesning inf Java 5

Forelesning inf Java 5

Java 4. Mer om easyio Mer om forgreninger Løkker. 7. september 2004

UNIVERSITETET I OSLO

Mer om uttrykk, terminal I/O, forgreninger. Grunnkurs i programmering Institutt for Informatikk Universitet i Oslo

INF1000 (Uke 6) Mer om metoder, tekster

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Rep: Metoder. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. 3 typer variable: Klassevariable. Java-programmene så langt i kurset:

Blokker og metoder INF1000 (Uke 6) Metoder

Bruk av class Scanner, FileWriter og Formatter som alternativ til EasyIO i INF1000.

INF 1000 høsten 2011 Uke september

INF1000 : Forelesning 4

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF 1000 høsten 2011 Uke 3 6. september

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

INF1000: Forelesning 7

INF1000: noen avsluttende ord

Innhold uke 3. INF 1000 høsten 2011 Uke 3 6. september. Uttrykk. Variabel: En plass i hukommelsen

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

INF1000 (Uke 6) Mer om metoder, tekster

Gjennomgang av eksamen H99

UNIVERSITETET I OSLO

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

Orakeltjeneste på Abel Hjelp til Obligatorisk oppgave 2. INF1000 (Uke 6) Mer om metoder, tekster. Rep: Metoder. Rep: Metoder

INF1000: Forelesning 7. Konstruktører Static

INF1000: Forelesning 6. Klasser og objekter del 1

UNIVERSITETET I OSLO

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Oversikt. INF1000 Uke 3. Repetisjon Program. Repetisjon Program. Litt repetisjon Program Variabler og Uttrykk Presedens Matematiske funksjoner

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(i*j); System.out.println();

UNIVERSITETET I OSLO

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

UNIVERSITETET I OSLO

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

Oblig 4Hybelhus litt mer tips enn i oppgaven

Repetisjon INF 1000 våren 2006

Transkript:

Dagens plan Inf1000 (Uke 8) Mer om objekter og filbehandling Grunnkurs i programmering Institutt for Informatikk Universitetet i Oslo Anja Bråthen Kristoffersen og Are Magnus Bruaset Mer om metoder/klasser/objekter private/public/package Flere eksempler med objekt orientert programmering Filbehandling å ta vare på resultatene for ettertiden å lese inn data fra fil Tilslutt noen råd til oblig 3 06.03.2006 2 Kall på en metode: skrivantallganger() i objektet b tre ganger Hva er en metode En metode er et valgfritt antall programsetninger som vi har gitt et navn All kode i programmet er inne i en eller annen metode (som igjen er inne i en klasse) med unntak av deklarering av klassevariable og objektvariable som skjer utenfor metoder Skiller mellom å deklarere en metode (= skrive Javakode for metoden) Utføre en metode (det som skjer når vi kaller den) Når vi deklarerer en metode, skjer det ingen ting Hvis en metode aldri blir kalt på blir den heller aldri brukt En metode blir utført hver gang den kalles. Kallet skjer fra koden i en annen metode: da hopper utførelsen av programmet til starten av den kalte metoden har den kalt metoden parametere, kopieres verdiene brukt i kallet til metodens parameter (de er som lokale variable i den kalte metoden) 06.03.2006 3 class BB { int antall = 0; void skrivantallganger() { antall++; System.out.println(" Du har kalt meg: " + antall + " ganger"); class AA { public static void main ( String[] args) { BB b = new BB(); b.skrivantallganger(); // Kall nr. 1 b.skrivantallganger(); // Kall nr. 2 b.skrivantallganger(); // Kall nr. 3 06.03.2006 4

class C { Hva skjer når vi kaller en metode Når vi kaller en metode, blir det opprettet et metodeobjekt, verdiene brukt i kallet blir kopiert over til parametrene. Dette metodeobjektet inneholder alle lokale variabler og parametrene til metoden når setningene i metoden utføres, brukes disse variablene og parametrene av metoden metodeobjektet fjernes automatisk når metoden er ferdig utført 06.03.2006 5 int skrivantall(int i){ System.out.println(" Du har kalt meg med: " + i); return i+10; class D { static int dobbel( int k) { return 2*k; void gjørmye(c cc, int v) { System.out.println(" gjørmye kalt"); int j = cc.skrivantall(v); System.out.println(" 1.verdien av j: " + j); j = dobbel(j); System.out.println(" 2.verdien av j: " + j); System.out.println(" 3.verdien av skrivantall(j): " + cc.skrivantall(j) ); public static void main (String[] args) { C c = new C(); D megselv = new D(); megselv.gjørmye(c,2); 06.03.2006 6 Hvorfor bruke metoder Problemløsning med metoder Vi deler opp programmet i metoder fordi: Noen programsetninger brukes flere steder, eller: Vi vil dele opp programmet i mindre deler Alle metoder bør være små og oversiktlige! Hver del gjør noe veldefinert som fremgår av navnet: regner ut en bestemt formel skriver ut en meny leser noen data fra terminal eller fil skriver ut opplysninger på skjermen... 06.03.2006 7 Når vi har laget en metode, og vi har forsikret oss om at den er riktig (dvs. metoden gjør det vi vil at den skal gjøre), så har vi laget en ny operasjon. Vi kan i resten av koden se på metoden som en tilgjengelig operasjon som vi kan bruke som om den var innebygd i Java eks: skrive ut en meny, regne ut en bestemt formel,.. Vi trenger da ikke tenke på alle detaljene om hvordan denne operasjonen blir utført, bare at den blir gjort. En metode er et (lite) verktøy / en operasjon som kan gjenbrukes og lett løsningen av vårt større problem (hele systemet) Denne måte å programmere på heter bottom-up programmering og nyttes mye. Eks: Java-biblioteket kan best forstås som en diger verktøykasse med nyttige operasjoner og datastrukturer vi kan (og ofte bør) bruke for å lage vårt program 06.03.2006 8

Hva er en klasse Skille mellom deklarasjon og bruk av en klasse En klasse er en beskrivelse av hvordan ett objekt av en bestemt type i vårt problem er. Inneholder variable som beskriver egenskaper for ett slikt objekt eks: Navn, adresse, studiepoeng, kurs... for klassen Student Registreringsnummer, eier, type, årsmodel for klassen Bil Inneholder metoder som er fornuftig handlinger for ett slikt objekt eks: skrivutvitnemål(), meldpåemne(),.. i klassen Student beregnårsavgift(), skifteier(),.. i klassen Bil 06.03.2006 9 Når vi deklarerer en klasse (= skriver Javakoden) skjer det ingen ting i programmet Når vi oversetter og starter opp programmet vårt med javac og java, skjer lite : De variable og metodene det står static foran er tilgjengelig Ingen kode (med unntak av main) utføres Først når vi sier new på en klasse, får vi laget et objekt av klassen Objektet inneholder alle variable og metoder som ikke har static foran deklarasjonen (objektvariable og objektmetoder) Når vi sier new, kaller vi en konstruktørmetode i klassen. Først når konstruktørmetoden er ferdig, returnerer new det nye objektet med verdier fra konstruktørmetoden. 06.03.2006 10 class Bil { String eier,regnum; Bil (String eier, String nr) { this.eier = eier; regnum = nr; class E { public static void main (String[] args) { Bil b; b String eier, num; In tast = new In(); System.out.print("Gi eier: "); eier = tast.inword("\n"); System.out.print("Gi nummer: "); num = tast.inword("\n"); b = new Bil(eier,num); b System.out.println("BIL.eier: " + b.eier + ", nummer: " + b.regnum); eier regnum 06.03.2006 11 Repetisjon av this this: en peker til seg selv. Et hvert objekt inneholder en slik peker. this refererer til objektvariabelen. For at vi i forrige eksempel ikke skulle få konflikt mellom parameteren eier og objektvariabelen eier måtte vi bruke this når objektvariabelen skulle tilordnes. Bil (String eier, String nr) { this.eier = eier; regnum = nr; parameteren eier objektvariabelen eier 06.03.2006 12

class Konto1 { String eier; int kontonum, saldo = 0; Konto1(String e) { eier = e; void settinn(int beløp) { saldo = saldo + beløp; boolean taut(int beløp){ saldo = saldo beløp; return saldo > 0; //bank med mulighet for et overtrekk på kontoen. class Bank1 { Konto1[] kontiene = new Konto1[100000]; public static void main( String[] args) { Bank1 b = new Bank1(); for (int i = 0; i < b.kontiene.length; i++) { b.kontiene[i] = new Konto1("kunde nr." + i); b.kontiene[i].settinn(100); System.out.println( Antall kontoer: + b.kontiene.length); System.out.println( Saldo konto 1: + b.kontiene[0].saldo); Forskjeller mellom klasser og metoder Begge lager objekter når de kalles, men: Et metode-objekt: fjernes når metoden returnerer inneholder lokale variable og parametere som alle er skjult for resten av programmet Et objekt laget med new: er i hukommelsen etter at det er laget (så lenge det minst er en peker som peker på det) kan inneholde både metoder og variable, som kan nyttes av resten av programmet (med en peker og.) 06.03.2006 13 06.03.2006 14 Ikke alt i et objekt bør være synlig fra resten av programsystemet - innkapsling Vi ønsker ofte at resten av systemet bare skal se deler av et objekt eks: int saldo i Konto1-objektet bør være skjult, resten av programmet skal bare bruke settinn() og taut() metodene. Vi kan regulere tilgangen til variable og metoder ved å sette enten : private public package foran en metode eller deklarasjonen av en variabel 06.03.2006 15 For små systemer hvor alle.java filene ligger på samme filområde, gjelder: Skriver vi: ingenting foran en deklarasjon/metode, så er slike deklarasjoner fullt tilgjengelige for alle annen kode kompilert på samme filområde, men usynlig /sperret for kode kompilert på andre filområder. package har samme virkning. private foran en deklarasjon/metode, så er den bare synlig fra kode i metoder deklarert i samme klasse, usynlig/sperret for all annen kode public så er metoden/variabelen synlig for all annen kode. Slik delvis sperring av adgang til variable, sikrer oss at vi kan bestemme fullt ut selv i en klasse hvordan en variabel skal endres. 06.03.2006 16

private og get/set metoder I større systemer lar vi aldri andre klasser direkte endre variable, men går alltid via get- og setmetoder. Variablene er da deklarert som private. Eksempel: Hvordan representere en konto med private og get/set metoder settinn() og taut() og overførtilannenkonto() er set-metoder gisaldo() er en get-metode 06.03.2006 17 class Konto { private static int nummer = 0; //private og static (klassevariabel) private int kontonummer, saldo; //private private String eier, adresse; //private Konto() { saldo = 0; bestemkontonummer(); //Konstruktørmetode når ingen parametere er brukt i kallet. Konto(String e, String adr, int s) { eier = e; adresse = adr; saldo = s; bestemkontonummer(); //Konstruktørmetode når parametrene e, adr og s er brukti kallet. void bestemkontonummer() { nummer++; kontonummer = nummer; //Finner nytt ubrukt kontonummer void settinn(int innskudd) { saldo = saldo + innskudd; //beregner ny saldo ved innskudd på konto boolean taut(int uttak) { if (uttak > saldo) return false; saldo = saldo - uttak; return true; /* sjekker om du overtrekker kontoen ved å ta ut beløpet uttak, hvis ok beregner ny saldo */ 06.03.2006 18 boolean overførtilannenkonto(konto tilkonto, int beløp) { if (taut(beløp)) { tilkonto.settinn(beløp); return true; else return false; /* sjekker om det er nok penger på kontoen, hvis ja overfører beløpet og beregner ny saldo */ int gisaldo() { return saldo; //returnerer verdien saldo // end class Konto class Bank { public static void main ( String[] args) { Bank b = new Bank(); Konto a = new Konto(); a.settinn(500); Konto k = new Konto("Anja", "Ifi, UiO", 1000); System.out.print("a.saldo: " + a.gisaldo()); System.out.println(", k.saldo: " + k.gisaldo()); a.overførtilannenkonto(k, 400); System.out.print("a.saldo: " + a.gisaldo()); System.out.println(", k.saldo: " + k.gisaldo()); 06.03.2006 19 Minner om viktige prinsipper En metode skal bare bruke objektvariable deklarert i egen klasse. selv om man lett kan få tak i variable fra andre klasser, men bruk av variable fra andre klasser vil føre til rotete programmering hvor det senere blir vanskelig å endre på programmet. For eksempel slette en variabel (som viser seg å være brukt av en annen klasse). Hvis en metode viser seg vanskelig eventuelt lang å programmere del den i mindre metoder. små enkle metoder som hovedsakelig kun gjør en oppgave (høyden noen få som klart hører sammen) gjør programmet lett lesbart for andre i ettertid. 06.03.2006 20

Lese fra fil Vi må først importere pakken easyio Vi åpner filen for lesing class LesFraFil { In fil = new In("filnavn"); Lesemetoder Tabellen under viser resultatet av å kalle på inint(), inchar(), inword() og inline() etter første, andre og tredje kall. 1 5 _ 5 3 5 _ 3 5 2 2 String s = fil.inline(); System.out.println("Første linje var: " + s); Her leses hele første linje av filen 06.03.2006 21 Kall nr 1 2 3 inint() eller indouble() 15 535 3 inchar() '1' '5' ' ' inword() "15" "535" "3" inline() "15 " " _ 535 _ " "3 522 " 06.03.2006 22 Les bit for bit Eksempel Metoder: inint() for å lese et heltall indouble() for å lese et flyttall inword() for å lese et ord inword("\n") for å lese første ikketomme linje lastitem() for å sjekke om slutten av filen er nådd Eksempel: fil hvor hver rad inneholder et heltall og en tekst: In fil = new In("fil.txt"); while (!fil.lastitem()) { int k = fil.inint(); String s = fil.inword("\n"); System.out.println(k + " " + s); 06.03.2006 23 Programmet leser en fil med desimaltall, hvor tallene er atskilt med blanke tegn og/eller linjeskift. Vi finner slutten av filen med lastitem(). class LesFraFil2 { double[] x = new double[100]; // antar max 100 tall på fil In innfil = new In("fil.txt"); int ant = 0; while (!innfil.lastitem()) { x[ant] = innfil.indouble(); ant = ant + 1; // Nå ligger det verdier i x[0], x[1],..., x[ant-1] 06.03.2006 24

Lese linje for linje Metoder: inline() for å lese en linje (ikke tomme) readline() for å lese en linje (også tomme) endoffile() for å sjekke om slutten av filen er nådd Eksempel Program som leser en tekstfil linje for linje: class LesFraFil3 { String [] s = new String[100]; // antar max 100 linjer på innfilen In innfil = new In("fil.txt"); int ant = 0; Eksempel: In fil = new In("fil.txt"); while (!fil.endoffile()) { String s = fil.inline(); System.out.println(s); while (!innfil.endoffile()) { s[ant] = innfil.readline(); ant = ant + 1; // Nå ligger det tekststrenger i s[0], s[1],..., s[ant-1] 06.03.2006 25 06.03.2006 26 Lese tegn for tegn Eksempel Metoder: inchar() for å lese et tegn (også blanke og linjeskift) endoffile() for å sjekke om slutten av filen er nådd Eksempel: In fil = new In("fil.txt"); while (!fil.endoffile()) { char c = fil.inchar(); System.out.println(c); 06.03.2006 27 Program som leser en tekstfil tegn for tegn og skriver ut på skjerm, sammen med antall tegn i filen: class LesFraFil4 { public static void main(string[] args) { In innfil = new In("fil.txt"); int antall = 0; while (!innfil.endoffile()) { System.out.print(innfil.inChar()); antall++; System.out.println("Antall tegn: " + antall); 06.03.2006 28

lastitem og endoffile endoffile() sjekker om siste tegn på fila er lest lastitem() søker seg fram til første ikke-blanke tegn og returnerer true hvis slutten av fila nås og false ellers. Eksempel: Fil som skal leses 3.253 12.65-23.553 = ny linje (enter, carriage return) = blankt tegn (mellomrom, tabulator) Samme fil, slik den ser ut for datamaskinen 3.253 12.65-23.553 lastitem() leser forbi disse og møter slutten av fila Her står lesemerket rett Her står lesemerket rett etter etter at første tall er lest at siste tall er lest 06.03.2006 29 Når filens lengde er kjent Når et program skal lese en fil, må programmet ha en mulighet til å avgjøre når slutten av filen er nådd - ellers kan det oppstå en feilsituasjon. Metodene lastitem() og endoffile() kan benyttes til dette. Noen ganger er filens lengde kjent på forhånd: lengden er kjent før programmet kjøres lengden ligger lagret i begynnelsen av filen Da kan vi i stedet benytte en for-løkke. 06.03.2006 30 Eksempel: fil med kjent lengde Nok at tallene er atskilt Program som leser en fil med 10 desimaltall, hvor tallene er atskilt med blanke tegn og/eller linjeskift: class LesFraFil5 { double [] x = new double[10]; In innfil = new In("fil.txt"); for (int i=0; i<10; i++) { x[i] = innfil.indouble(); // Nå kan vi evt. gjøre noe med verdiene i arrayen x 06.03.2006 31 Programmet på forrige foil ville gitt akkurat samme resultat for alle disse filene: 15.2 6.23 3.522 3.6 8.893-3.533 65.23 22.01 45.02 7.2 15.2 6.23 3.522 3.6 8.893-3.533 65.23 22.01 45.02 7.2 15.2 6.23 3.522 3.6 8.893-3.533 65.23 22.01 45.02 7.2 06.03.2006 32

Eksempel: fil med lengde-info Program som leser en fil med desimaltall, hvor tallene er atskilt med blanke tegn og/eller linjeskift. Antall tall som skal leses ligger øverst i filen. class LesFraFil6 { double[] x; // bestemmer ikke lengden ennå In innfil = new In( fil.txt ); int lengde = innfil.inint(); x = new double[lengde]; // nå vet vi lengden for (int i=0; i<lengde; i++) { x[i] = innfil.indouble(); // Nå kan vi evt. gjøre noe med verdiene i arrayen x 06.03.2006 33 Eksempel: fil med sluttmerke Program som leser en fil med desimaltall, hvor tallene er atskilt med blanke tegn og/eller linjeskift. Slutten av filen er markert med tallet -999. class LesFraFil7 { double[] x = new double[100]; // antar max 100 tall på fil In innfil = new In("fil.txt"); double siste = 0; int ant = 0; while (siste!= -999) { siste = innfil.indouble(); if (siste!= -999) { x[ant] = siste; ant = ant + 1; // Nå ligger det verdier i x[0], x[1],..., x[ant-1] 06.03.2006 34 Anta at vi skal lese en fil med følgende format: Først er det en linje med 3 overskrifter (separert av blanke tegn) Deretter kommer det en eller flere linjer, som hver består av et heltall, et desimaltall og en tekststreng (separert av blanke tegn) Eksempel: Lese en fil med mer komplisert format Antall Pris Varenavn 35 23.50 Oppvaskkost 53 33.00 Kaffe 97 27.50 Pizza.................. Dataene som leses skal programmet ta vare på for senere formål. 06.03.2006 35 Framgangsmåte Den første linja er spesiell, og vi tenker oss her at den ikke er så interessant - vi ønsker bare å få lest forbi den. Det kan vi gjøre med inline(). De andre linjene har samme format, så vi kan lage en løkke hvor hvert gjennomløp av løkken leser de tre delene på en linje. Vi bruker da henholdsvis inint(), indouble() og inword(). For å vite når filen er slutt, kan vi enten bruke endoffile() eller lastitem(). Siden vi leser filen bitvis, er det mest naturlig å bruke lastitem(). Da får vi heller ikke problemer dersom det skulle ligge noen blanke helt på slutten av filen. Vi hopper over detaljene. PRØV SELV. 06.03.2006 36

Noen nyttige hjelpemidler (ikke pensum) Sjekke om det finnes en fil med et bestemt navn: if (new File("filnavn").exists()) { System.out.println("Filen finnes"); Slette en fil: if (new File("filnavn").delete()) { System.out.println("Filen ble slettet"); Avgjøre hvilket filområde programmet ble startet fra: String curdir = System.getProperty("user.dir"); Lage liste over alle filer og kataloger på et filområde: String[] allefiler = new File("filområdenavn").list(); Merk: 06.03.2006 klassen File ligger i pakken java.io som derfor må importeres først. 37 Skrive til fil Vi må først importere pakken easyio Vi åpner filen for skriving class SkrivTilFil { Out fil = new Out("filnavn"); fil.outln("dette er første linje"); fil.close(); Vi må huske å lukke filen til slutt Her skrives en linje med tekst til filen 06.03.2006 38 Hvilke skrivemetoder finnes? Oppgave Datatyp e int double char String Eksempel fil.out(x); fil.out(x, 6); fil.out(x, 2); fil.out(x, 2, 6); fil.out(c); fil.out(s); fil.out(s, 6); fil.outln(); fil.close(); Beskrivelse Skriv x Skriv x høyrejustert på 6 plasser Skriv x med 2 desimaler Skriv x med 2 desimaler på 6 plasser Skriv c Skriv s Skriv s på 6 plasser (venstrejustert) Skriv linjeskift Lukk filen Lag et program som: leser en tekstfil erstatter alle forekomster av en bestemt tekststreng s med en ny tekststreng t skriver resultatet til en ny tekstfil Merk: dersom antall plasser spesifiseres og det ikke er plass til det som skal skrives 06.03.2006 39 ut, vil det som skrives ut avsluttes med tre punktumer:... 06.03.2006 40

class ByttOrdMain { ByttOrd b = new ByttOrd(); b.erstattord(args[0], args[1], args[2], args[3]); class ByttOrd { void erstattord(string innfilnavn, String utfilnavn, String ord, String nyttord) { In innfil = new In(innfilNavn); Out utfil = new Out(utfilNavn); while (!innfil.endoffile()) { String s = innfil.inline(); String t = ""; int n = ord.length(); int k = s.indexof(ord); while (k >= 0) { t = t + s.substring(0, k) + nyttord; s = s.substring(k+n); k = s.indexof(ord); t = t + s; utfil.outln(t); utfil.close(); 06.03.2006 41 Noen ord i forkant av oblig 3 Mange vil synes oblig 3 er: mye å gjøre ny måte å tenke på stort sprang fra de små eksemplene på forelesningene De obligatoriske oppgavene er ikke i første rekke ment å teste kunnskapsnivået deres, men å videreutvikle det og forberede dere for nytt stoff (og naturligvis for eksamen). Oppgavene har m.a.o. et helt annet siktemål enn f.eks. en deleksamen. Derfor: det er høyst normalt om du synes oppgaven er mye jobb. Til gjengjeld vil de fleste av dere lære mye av obligen. Vi skal nå se på noen generelle råd vedrørende løsning av en større oppgaver. 06.03.2006 42 Råd 1: Skriv programmer "ovenfra og ned" Bestem først hvilke klasser som skal være med (og deres rolle). Fyll inn de mest sentrale variablene (de som utgjør datastrukturen), og skriv eventuelle nye klasser som trengs i datastrukturen Skriv metodene på toppnivå (dvs. de som styrer den overordnede programflyten, f.eks. en kommandoløkke). Kall på metoder ved behov, selv om disse ennå ikke er skrevet. Skriv metodene du kaller på ovenfor, og fortsett til programmet er ferdig. Råd 2: skriv metoder "utenfra og inn" Når du skal skrive en metode, bestem først av alt hva som er input og output til metoden: Input: Eventuelle parametere til metoden Kan også være klassevariable/objektvariable. Output: Eventuell returverdi fra metoden Kan også være modifikasjoner av klassevariable/objektvariable 06.03.2006 43 06.03.2006 44

Råd 3: Deleger oppgaver Et viktig kjennetegn ved god programmering er at man delegerer oppgaver når det er naturlig dvs. kaller på metoder for å utføre deloppgaver. Dermed blir hver enkelt del av programmet oversiktlig, og faren for feil minimeres. Det blir også lettere å finne feil senere. Eksempel: Hvert case i en kommandoløkke kaller på en metode som utfører den ønskede kommandoen, i stedet for at alt gjøres inni selve kommandoløkken. NB: ikke overdriv delegering. Det er f.eks. ofte ikke naturlig at hvert eneste objekt har metoder for å lese fra terminal - det kan i mange tilfeller være bedre å gjøre slike ting sentralt (og heller kalle på metoder i objektene for å oppdatere deres variable). 06.03.2006 45 Dårlig: Råd 4: formater alltid programkoden underveis Det øker lesbarheten class Eksempel { int x = 0; for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); 06.03.2006 46 Råd 5: ikke endre på forutsetningene i oppgaven Bra: class Eksempel { int x = 0; for (int i=0; i<10; i++) { x = x + 1; if (x < 0) { System.out.println("Det var rart"); 06.03.2006 47 Selv om mange oppgaver tar utgangspunkt i problemer fra virkeligheten, er de ikke nødvendigvis laget for å være særlig realistiske. Ikke endre på forutsetningene i slike tilfeller - uansett hvor fristende det måtte være. Løs oppgaven slik den er formulert. Hvis du mener oppgaven gir rom for flere tolkninger på et punkt: gjør dine egne (rimelige) forutsetninger - og skriv i oppgaven hva disse er. 06.03.2006 48