r ta re ception

advertisement
IN105-javainnogut-1
© Institutt for informatikk - høsten 2000
IN105-javainnogut-3
Hva heter du?
Ludvig van Beethoven
Goddag, Ludvig van Beethoven
snidil:>
import java.io.*;
class Hilsen{ // side 97 i læreboka
public static void main (String [ ] args) throws IOException {
new Hilsen ( ) ; }
Hilsen ( ) throws IOException {
BufferedReader tastatur =
new BufferedReader (new InputStreamReader(System.in));
System.out.println("Hva heter du?");
String name = tastatur.readLine ( );
System.out.println("Goddag, " + name);
snidil:>javac Hilsen.java
}
snidil:>java Hilsen
}
Data fra tastaturet - eksempel
© Institutt for informatikk - høsten 2000
Litt om pakker og
mest om
data inn og ut
buffer
String readLine( )
© Institutt for informatikk - høsten 2000
Double valueOf( )
int parseInt( )
IN105-javainnogut-4
double parseDouble( )
Double
String readLine( )
Integer
int heltall = Integer.parseInt(tastatur.readLine( ) );
……..
double flyttall = Double.parseDouble( tastatur.readLine( ) );
tastatur
IN105-javainnogut-2
BufferedReader
Data
inn fra
tastatur
Lesing av tall – ett pr. linje
© Institutt for informatikk - høsten 2000
import java.io.*;
…….
BufferedReader tastatur = new BufferedReader
(new InputStreamreader (System.in));
….
….
}
lesemetode
tastatur
BufferedReader
BufferedReader tastatur = new BufferedReader
InputStreamReader
(new InputStreamReader (System.in));
…
String streng;
streng = tastatur.readLine ( ); // leser en linje fra tastaturet
void lesemetode (String [ ] args) throws IOException
{ .. .
/* sett opp et objekt 'tastatur' hvis metoder foretar
bufret innlesing fra tastaturet */
import java.io.*;
….
Data inn fra tastaturet
© Institutt for informatikk - høsten 2000
IN105-javainnogut-5
© Institutt for informatikk - høsten 2000
IN105-javainnogut-7
o Legge pakken i nivået over arbeidsnivået og legge til en Classpath dit
– jfr s.124. Krever kunnskap om operativsystem-kommandoen SET
o Opprette en mappe classes under mappen jdk1.2 og legge pakken der
– mappen classes ligger nemlig i Java standard Classpath
o Legge pakken i samme mappe som programmene
o Pakken må den ligge i en "Classpath" – en måte å fortelle Java hvor den
skal lete etter klasser. Dette kan gjøres på tre ulike måter:
o Klassene ligger i en pakke kalt javagently som må importeres
o Stream har de samme metodene, men knyttet til objekter som kontrollerer
datastrømmer
o Text innholder utelukkende klassemetoder – den er altså en verktøykiste –
det er ikke meningen å lage objekter fra den.
o Pakken javagently med klassene Text og Stream er skrevet av J. Bishop
for å forenkle programmeringen av datainn og dataut
Om pakken javagently og klassen Stream
package javagently;
import java.io.*;
import java.util.*;
import java.text.*;
public class Text {
…..
Eksempel: Pakken Javagently starter slik:
* Hver fil kan gjerne inneholde flere klasser, men hver fil kan bare ha
en klasse som er synlig utenfra (public).
* Navnet på denne synlige klassen må også være navnet på filen.
* Fra en fil til en annen i samme pakke kan man imidlertid få tak i
alle klasser, metoder og variable (unntatt når disse er deklarert
private).
En pakke er en samling (Java)filer som ligger i en katalog.
Katalogens navn er pakkens navn, og alle .java-filene må starte med:
package <katalognavn>;
Pakker
}
int readInt (...)
© Institutt for informatikk - høsten 2000
tabulator, linjeskift.
IN105-javainnogut-8
String streng = minskjerm.readString ( );
char readChar (...)
………
class Stream {
double readDouble (...)
Stream ( InputStream in ) { ... }
Stream ( String filename, int why ) { ... }
…
public double readDouble ( ) { …. }
public int readInt ( ) { …. }
public char readChar ( ) { …. }
public String readString (...) { …. } Klassen Stream leser
”tekstbiter” (engelsk: items) eller
…….
tall som er adskilt med blank,
}
Stream minskjerm= new Stream ( System.in ) ;
String readString (...)
Stream
IN105-javainnogut-6
interface Sortable {
Filen Sortable.java
package myutilities;
Klassen javagently.Stream
© Institutt for informatikk - høsten 2000
}
……open ( )…….
class FileMan {
Filen FileMan.java
package myutilities;
For å forenkle lesing og skriving har Judy Bishop
laget en class Stream som behandler
innlesing og utskrift fra fil og tastatur/skjerm:
}
class Dates {
Filen Dates.java
package myutilities;
Dates.java
FileMan.java
List.java
Sort.java
Sortable.java
Pakkestruktur
snidil: java>mkdir myutilities
snidil: java>cd myutilities/
snidil: myutilities>copy ~in105/javapakker/myutilities/*.java .
snidil: myutilities>ls -l
-rw------1 steing
1392 Feb 15 14:16
-rw------1 steing
626 Feb 15 14:16
-rw------1 steing
1800 Feb 15 14:16
-rw------1 steing
696 Feb 15 14:16
-rw------1 steing
95 Feb 15 14:16
snidil: myutilities>
katalogen myutilities
navn
tastatur
Greetings
IN105-javainnogut-9
String readString ( )
String readLine( )
Stream
Her lagres
program
og data
under kjøring
Primærlager
0
1
2
.
.
.
.
.
.
Databuss
Disk
Lokalnett
© Institutt for informatikk - høsten 2000
CPU
Her regner
maskinen
IN105-javainnogut-11
Her lagres program,
oversatte programmer
og data permanent
(på filer)
Her flyttes
data og
program
fram og tilbake
Lesing og skriving på filer på disk (platelager)
© Institutt for informatikk - høsten 2000
snidil:>javac Hilsen.java
snidil:>java Hilsen
Hva heter du ?
Pierre Godefroy
God dag, Pierre
snidil:>
import java.io.*;
import javagently.*;
class Hilsen {
public static void main ( String [ ] args )
throws IOException { new Hilsen ( );
}
Hilsen ( ) throws IOException {
Stream tastatur = new Stream (System.in);
System.out.println("Hva heter du ?");
String navn = tastatur.readString( );
System.out.println("God dag, " + navn );
}
}
Bruk av javagently.Stream
© Institutt for informatikk - høsten 2000
tekst = innfil.readString( );
dtall = innfil.readDouble( );
double dtall; String tekst;
I det siste tilfellet kan vi bruke filen på samme måte som
vi leste data fra tastaturet:
tekst
minfil.txt
123.54
Forelesning
Dette objektet
leser fra filen
”minfil.txt”
innfil
Stream innfil = new Stream(”minfil.txt”, Stream.READ);
BufferedReader innfil = new BufferedReader
(new FileReader (”minfil.txt”));
eller:
Først må vi lage en forbindelse med filen, det
gjør vi med enten
nyttall
sum
tel
tastatur
SumTast
Stream
dtall
IN105-javainnogut-12
Stream
IN105-javainnogut-10
snidil: >javac SumTast.java
snidil: >java SumTast
Tast inn noen tall, avslutt med 0:
34 23 23
34 56 78 362
0
Du skrev 8 tall.
Summen av tallene er: 610
snidil: java>
Innlesing fra fil
© Institutt for informatikk - høsten 2000
import java.io.*;
import Stream;
class SumTast {
public static void main (String [] args) throws IOException {
new SumTast ( );
}
SumTast ( ) throws IOException {
Stream tastatur = new Stream (System.in);
int nyttall = 1; int sum = 0; int tel;
System.out.println("Tast inn noen tall, avslutt med 0: ");
for (tel = 0; nyttall != 0 ; tel ++) {
nyttall = tastatur.readInt( );
sum += nyttall;
} // end for-løkke
System.out.println("Du skrev " + tel + " tall.");
System.out.println("Summen av tallene er: " + sum);
}
}
Summering av tall fra tastaturet
Innlesing fra fil
Filen ”minfil.txt”
(laget f.eks.
med emacs)
utfil.close( );
© Institutt for informatikk - høsten 2000
For at innholdet på den nye filen skal
bevares må vi til slutt si:
utfil.println( ”utskrift” + 17 );
// Utskrift skjer som til skjerm:
resultat
tall
innfil
SumFil
Dette objektet
leser fra filen
”minfil.txt”
Stream
void println()
Stream
IN105-javainnogut-15
minutfil.txt
Dette objektet
skriver på filen
”minutfil.txt”
utfil
SkrivFil
IN105-javainnogut-13
1256 345 245
345 1234 5576 43321
098098 8584
7588
3450 87544
9876 4332 8540289
Stream utfil = new Stream (”minutfil.txt”, Stream.WRITE);
eller:
PrintWriter utfil = new PrintWriter
(new FileWriter (”minutfil.txt”));
Utskrift til fil
© Institutt for informatikk - høsten 2000
snidil: java>javac SumFil.java
snidil: java>java SumFil
Summen er 8812083
snidil: java>
import java.io.*;
import Stream;
class SumFil {
public static void main (String [] args) throws IOException {
new SumFil ( ) ;
}
SumFil ( ) throws IOException {
int resultat = 0, tall;
Stream innfil = new Stream ( "minfil.txt", Stream.READ );
for (int tel = 1; tel<= 15 ; tel ++) {
tall = innfil.readInt( );
resultat += tall ;
}// end for-løkke
System.out.println("Summen er " + resultat);
}
} // end SumFil
}
}
© Institutt for informatikk - høsten 2000
System.out.print("Postnummer: "); tekst1= tastatur.readString( );
System.out.print("Poststed: ");
tekst2= tastatur.readString( );
filut.println("Poststed: "+ tekst1 + " " + tekst2);
filut.close( );
System. out.println("er skrevet på \"minutfil.txt\"");
System.out.print("Gatenavn: ");
tekst1= tastatur.readString( );
System.out.print("Gatenummer: "); tekst2= tastatur.readString( );
filut.println("Adresse: "+ tekst1 + " " + tekst2);
System.out.print("Fornavn: "); tekst1= tastatur.readString( );
System.out.print("Etternavn: "); tekst2= tastatur.readString( );
filut.println("Navn: " + tekst1 + " " + tekst2);
Utskrift til fil - eksempel
import java.io.*;
import Stream;
class InnUt {
public static void main (String [] args) throws IOException {
new InnUt ( ) ; }
InnUt ( ) throws IOException {
String tekst1, tekst2;
Stream tastatur = new Stream (System.in);
Stream filut = new Stream ("minutfil.txt", Stream.WRITE );
Stein 2000
Gjessing
© Institutt for informatikk - høsten
Innlesing fra fil med antall
Dette objektet
skriver på filen
”minutfil.txt”
IN105-javainnogut-16
snidil: java>java InnUt
Fornavn: Per
Etternavn: Petersen
Gatenavn: Solhellinga
Gatenummer: 12
Postnummer: 4990
Poststed: Søndeled
er skrevet på "minutfil.txt"
snidil: java>
Navn: Per Petersen
Adresse: Solhellinga 12
Poststed: 4990 Søndeled
minutfil.txt
filut
IN105-javainnogut-14
Stream
SumFil2
import java.io.*;
innfil
import Stream;
class SumFil2 {
antall
public static void main (String [] args) throws IOException {
new SumFil2 ( ) ;
tall
}
Dette objektet
resultat
SumFil2 ( ) throws IOException {
leser fra filen
int resultat = 0, tall;
”lengdefil.txt”
Stream innfil = new Stream ( "lengdefil.txt", Stream.READ );
int antall = innfil.readInt( );
for (int tel = 1; tel<= antall ; tel ++) {
tall = innfil.readInt( );
resultat += tall ;
}// slutt for-løkke
15
System.out.println("Summen er " + resultat);
1256 345 245
}
345 1234 5576 43321
} // slutt SumFil2
snidil: >javac SumFil2.java
098098 8584
snidil: >java SumFil2
7588
Summen er 8812083
3450 87544
snidil: >
9876 4332 8540289
Stream
© Institutt for informatikk - høsten 2000
IN105-javainnogut-19
private StringTokenizer T;
Integer
private String S;
parseInt
public int readInt ( ) throws IOException {
………
if ( T==null ) refresh ( );
………
while (true) {
<og så hvis feil:>
try {
throw new NumberFormatException( );
return Integer.parseInt(T.nextToken( ) );
………
} catch (NoSuchElementException e1 ) {
……...
refresh ( );
} catch ( NumberFormatException e2 ) {
System.out.println ( "Error in number, try again." );
}
}
}
private void refresh ( ) throws IOException {
S = in.readLine ( );
if ( S==null ) throw new EOFException( );
T = new StringTokenizer ( S );
}
IN105-javainnogut-17
String readString (...)
char readChar (...)
int readInt (...)
double readDouble (...)
streamobjekt.readInt ( )
© Institutt for informatikk - høsten 2000
return Double.valueOf( tekst.trim( )).doubleValue( );
Derfor må metoden readDouble i Stream ta en
tekst som tilsvarer et reelt tall og gjøre det om til
et reelt tall:
Klassen Double har en metode som tilsvarer
parseInt. Men Stream har foreløpig ikke fått med
seg det.
….. return( Integer.parseInt( tekst ) );
Metoden readInt vil returnere et heltall ved å
gjøre en tekst ("token") om til et heltall ved hjelp
av klassen Integer:
Stream tastatur = new Stream ( System.in );
int tall;
tall = tastatur.readInt( );
Lesemetoder i klassen Stream
© Institutt for informatikk - høsten 2000
Skriv inn navnet ditt : John Coltrane
sikrer at ut-bufferens innhold skrives ut med
øyeblikkelig virkning.
System.out.flush( );
....
String navn = tastatur.readLine ( );
System.out.flush();
System.out.print("Skriv inn navnet ditt : " );
IN105-javainnogut-18
No more tokens
IN105-javainnogut-20
void ledetekst ( String tekst) {
System.out.print ( tekst + " : ");
System.out.flush ( );
}
...
ledetekst ( "Skriv inn navnet ditt");
Ledetekster
© Institutt for informatikk - høsten 2000
return
yes
J
a
Read in a line
Create a tokenizer for it
Get the next token
Convert it to an integer
no
Stream tastatur = new Stream ( System.in );
...
Invalid number
Print an error-message
Is the tokenizer empty?
o Generell algoritme for lesemetodene
Innmaten i Stream
resulterer i:
int i = 9, j
utfil.println
utfil.println
utfil.println
9
25
3456
IN105-javainnogut-21
25, k = 3456;
Stream.format ( i, 10 ) );
Stream.format ( j, 10 ) );
Stream.format ( k, 10 ) );
© Institutt for informatikk - høsten 2000
=
(
(
(
=
(
(
(
© Institutt for informatikk - høsten 2000
IN105-javainnogut-23
Husk å sette av plass til
eventuelt fortegn !
25, k = 3456;
Stream.format ( i, 3 ) );
Stream.format ( j, 3 ) );
Stream.format ( k, 3 ) );
Stream.format ( ) - for trang plass
9
25
3456
resulterer i :
int i = 9, j
utfil.println
utfil.println
utfil.println
Stream.format ( ) - heltall
s
(
(
(
(
© Institutt for informatikk - høsten 2000
© Institutt for informatikk - høsten 2000
(IOException)
- Andre feil. Disken er full!
(EOFException)
- Det er slutt på filen
(FileNotFoundException)
- Filen fins ikke
IN105-javainnogut-24
IN105-javainnogut-22
Hvordan unngå
0.700000000000000342 ?
= 43.14, t = 233.566, u = 0.999;
Stream.format ( r, 10, 2 ) );
Stream.format ( s, 10, 2 ) );
Stream.format ( t, 10, 2 ) );
Stream.format ( u, 10, 2 ) );
Unntak ved lesing og skriving
3,00
43,14
233,57
1,00
resulterer i
double r = 3,
utfil.println
utfil.println
utfil.println
utfil.println
Stream.format ( ) - desimaltall
IN105-javainnogut-25
© Institutt for informatikk - høsten 2000
IN105-javainnogut-27
navn: fortsett
import java.io.*;
import javagently.*; // Gsnitt2.java
type: boolean
.... throws IOException {
snidil: >javac Gsnitt2.java
Stream tastatur = new Stream ( System.in );
snidil: >java Gjsnitt2
int nyttall, sum = 0, tel;
Tast inn noen tall, avslutt med 0:
double gjennomsnitt;
45 34
boolean fortsett = true;
System.out.print ( ”Tast inn noen tall, avslutt med 0: ” ); 23 34 456 0
Du skrev 5 tall.
for ( tel = -1; fortsett ; tel ++) {
Gjennomsnitter er: 118.4
nyttall = tastatur.readInt ( );
snidil: >
if ( nyttall == 0 ) {
fortsett = false;
Her er en variant av det
} else {
samme programmet. Se
sum += nyttall;
på de små forskjellene.
}
Legg spesielt merke til
}/
hvordan vi bruker en
if (tel > 0) gjennomsnitt = (double) sum / tel;
logisk variabel til å
else
gjennomsnitt = 0;
kontrollere når vi skal
System.out.println( ”Du skrev ” + tel + ” tall.” );
stoppe repetisjonen:
System.out.println( ”Gjennomsnittet er: ” + gjennomsnitt );
}
Finn gjennomsnitt - 2
© Institutt for informatikk - høsten 2000
} catch ( IOException e ) {
System.out.println ( "Hva skjedde ? Jo,dette : " + e );
System.out.println ( e.message ( ) );
}
} catch ( EOFException e ) {
System.out.println ( "Vi leste hele filen.");
Stream innfil;
try {
innfil = new Stream ("minedata.txt", Stream.READ );
while ( true ) {
// løkka brytes ved unntak
String linje = innfil.readLine ( );
}
} catch ( FileNotFoundException e ) {
System.out.println ("Obs, filen manglet !");
Hvordan håndtere unntakene ?
© Institutt for informatikk - høsten 2000
Finn største tall
gjennomsnitt
nyttall
sum
tel
tastatur
GjsnittTast
IN105-javainnogut-26
Dette objektet leser
fra tastaturet
int readInt ( )
Stream
IN105-javainnogut-28
highest
number
import java.io.*;
import javagently.*;// HighestValue.java
... throws IOException {
Variablen highest
Stream in = new Stream ( System.in );
inneholder høyeste
System.out.println ( "** Finding the highest number **" );
verdi til nå
System.out.println ( "How many numbers (1 or more)?" );
int n = in.readInt ( );
snidil: >javac HighestValue.java
System.out.println("Type them in");
snidil: >java HighestValue
System.out.print ( "1> " );
** Finding the highest number **
int highest = in.readInt ( );
How many numbers (1 or more)? 4
int number;
Type them in
for (int i = 2; i <= n; i++) {
1> 234
System.out.print ( i + ”> ” );
2> 6321
number = in.readInt ( );
3> fem
if (number > highest) { highest = number; }
Error in number, try again.
}
5
System.out.println("That's enough, thanks");
4> 2463
System.out.println("The highest number was ”
That's enough, thanks
+highest);
The highest number was 6321
snidil: >
© Institutt for informatikk - høsten 2000
import java.io.*;
import javagently.*; //Gsnitt1.java
... throws IOException {
Stream tastatur = new Stream ( System.in );
int nyttall = 1, tel, sum;
double gjennomsnitt;
System.out.print ( ”Tast inn noen tall, avslutt med 0: ” );
for (tel = 0; nyttall != 0 ; tel ++) {
nyttall = tastatur.readInt ( );
sum += nyttall;
}
tel --;
if (tel > 0) gjennomsnitt = (double) sum / tel;
else gjennomsnitt = 0;
System.out.println(”Du skrev ” + tel + ” tall.”);
System.out.println(”Gjennomsnittet er: ” + gjennomsnitt );
Finn gjennomsnitt
© Institutt for informatikk - høsten 2000
Tre summer
IN105-javainnogut-29
snidil: >javac Summation3.java
import java.io.*; //Summation3, JG s.108
snidil: >java Summation3
import javagently.*;
How many numbers? 6
...throws IOException {
1> 34
Positivt tall
Stream in = new Stream ( System.in );
2> 56
int count;
Positivt tall
double total = 0, posTotal = 0, negTotal = 0, number;
3> -2
System.out.print ( "How many numbers?" );
Negativt tall
4> 0
count = in.readInt ( );
Negativt tall
Øving:
for (int i = 1; i <= count; i++) {
5> 34
Rett programmet slik
System.out.println ( i+">" );
Positivt tall
at det ikke skriver at
6> -23
number = in.readDouble( );
null er et negativt (eller Negativt tall
total = total + number;
That's enough, thanks.
et positivt) tall
if ( number > 0 ) {
The total is 99.0
posTotal += number;
The pos. total is 124.0
The neg. total is -25.0
System.out.println (”Positivt tall”);
snidil: >
} else {
negTotal += number;
System.out.println (”Negativt tall”);
} // end if
System.out.println("That's enough, thanks.");
} // end for
System.out.println("The total is " + total);
System.out.println("The pos. total is " +posTotal);
System.out.println("The neg. total is " +negTotal);
Download