Türme von Hanoi (iterativ II)

Werbung
Prog. 1
Prog. 1
Wiederholung Türme von Hanoi (rekursiv)
•
Was passiert beim Aufruf von hanoi(3,1,2,3)?
Algorithmus
hanoi(3,1,2,3)
–
Trivialer Fall: Nur eine Scheibe (n=1)
–
Problemzerlegung: Mehrere Scheiben (n>1)
•
Bewege Scheibe von Quelle nach Ziel
1. Bewege Turm aus den n-1 obersten Scheiben zum Arbeitsbereich
hanoi(2,1,3,2)
2. Bewege n-te Scheibe zum Ziel
4.! Bewege Scheibe
! von 1 nach 3
hanoi(2,2,1,3)
3. Bewege Turm aus n-1 obersten Scheiben vom Arbeitsbereich zum Ziel
•
2.! Bewege Scheibe
! von 1 nach 2
Umsetzung in Java
static void hanoi(int n, int src, int work, int dest )
{
if(n>1) hanoi(n-1, src, dest, work);
System.out.println("Bewege Scheibe von “+src+" nach "+dest);
if(n>1) hanoi(n-1, work, src, dest);
}
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
1
Prog. 1
hanoi(1,1,2,3)
hanoi(1,3,1,2)
hanoi(1,2,3,1)
hanoi(1,1,2,3)
1. Bewege Scheibe
! von 1 nach 3
3.! Bewege Scheibe
! von 3 nach 2
5.! Bewege Scheibe
! von 2 nach 1
7.! Bewege Scheibe
! von 1 nach 3
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
2
Prog. 1
Türme von Hanoi (iterativ)
•
6.! Bewege Scheibe
! von 2 nach 3
Türme von Hanoi (iterativ II)
Iterativer Algorithmus von Bunemann und Levy (1980)
–
1
6
11
16.12.2008
•
Wiederhole solange, bis der gesamte Stapel auf der Zielstange ist
Variation des Algorithmus von Bunemann und Levy
–
Wiederhole solange, bis der gesamte Stapel auf der Zielstange ist
1. Setzte die kleinste Scheibe auf die Stange rechts von ihr (bzw. die erste Stange)
1. Setzte die kleinste Scheibe zwei Scheiben nach rechts (modulo 3)
2. Setzte die zweitkleinste Scheibe auf die einzig mögliche Stange
2. Setzte die zweitkleinste Scheibe auf die einzig mögliche Stange
2
7
12
3
8
13
4
9
14
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
5
1
2
3
4
5
6
7
8
10
15
3
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
4
Prog. 1
Prog. 1
Türme von Hanoi (iterativ in Java)
Weiteres Beispiel für Rekursion (Quick Sort)
•
static void hanoiIterative(int n) {
int [][] bars = new int[3][n+1];
int [] last = {n, 0, 0};
// src, work, dest bar
// start configuration
int pS=0, pos1, pos2, step = 2;
•
// smallest disc on source
for (int i=0; i<n+1; ++i) bars[0][i] = n+1-i; // (n+1 avoid tests)
bars[1][0] = n+1; bars[2][0] = n+1;
// init work & dest
while(bars[2][n]!=1) {
System.out.printf("Smallest disc from %d to %d\n", pS, (pS+step)%3);
bars[pS][last[pS]--] = 0;
pS = (pS+step)%3;
Der Quicksort-Algorithmus ist eines der schnellsten und zugleich
einfachsten Sortierverfahren
Der Algorithmus ist vom Typ: „Teile und Herrsche“:
–
Eingabe: Eine unsortiertes Array a[0],...,a[n-1] mit n Elementen
–
Herrsche:
1.
2.
3.
// smallest disc to the right
bars[pS][++last[pS]] = 1;
pos2 = (bars[(pS+1)%3][last[(pS+1)%3]]>bars[(pS+2)%3][last[(pS+2)%3]]) ?
(pS+2)%3 : (pS+1)%3;
pos1 = 2*(pS+pos2) % 3;
Wähle ein (beliebiges) Element x aus dem Feld a
Setze i=0 und j =n-1
Wiederhole solange i<=j
• Suche von links das erste Element a[i] mit x<=a[i]
•
•
// disc to only possible place
–
if (bars[pos1][last[pos1]] != bars[pos2][last[pos2]]) {
System.out.printf("-------> Disc from %d to %d\n", pos2, pos1);
bars[pos1][++last[pos1]] = bars[pos2][last[pos2]];
Suche von rechts das erste Element a[j] mit a[j]<=x
Falls i<j vertausche a[i] und a[j] und setze i = i+1 und j = j-1
Teile:
1. Behandle rekursiv die beiden Teilfolgen a[0],...,a[j] und a[i],...,a[n-1]
2. Die Rekursion endet, wenn eine Teilfolge die Länge 1 hat
bars[pos2][last[pos2]--] = 0;
–
}
Ausgabe: Das sortierte Array
}
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16.12.2008
5
Prog. 1
Aufwand:
Beispiel
– Ungünstigster Fall
• Das ein Teilstück besteht immer nur
aus einem Element und das Andere
aus den restlichen Elementen
Für die Praxis schnellstes Verfahren
x
j
47
15
18
1
15
3
15
15
18
1
47
i
1
j
18
i
j
15
x
j
i
x
3
15
1
18
15
3
i,x
3
2. Rekursion:
15
i
i
1. Rekursion:
• In jeder Schicht müssen n Elemente
behandelt werden
• Anzahl Operationen: O(n·log2(n))
• Bei einem Feld mit 1000 Einträgen
sind dies etwa 10.000 Operationen
i
3
3
– Günstiger Fall (im Durchschnitt):
• Alle im Verlauf der Rekursion
auftretenden Teilstücke sind in
gleich lang
• Dann ist die Rekusionstiefe log2(n)
Quick Sort (in Java)
j
!
• Dann ist die Rekursionstiefe n-1
• Anzahl Operationen: O(n2)
• Bei einem Feld mit 1000 Einträgen
sind dies 1.000.000 Operationen
•
6
Prog. 1
Aufwand und Beispiel
•
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16.12.2008
i
1
j
j
15
i
i
15
j
15
j
j
18
47
47
i
j
1
47
15
i,x
j
18
47
i
j
i, j
1
3
18
j
i
j
int x = a[(left+right)/2];
!
int i = left, j = right;
!
int tmp;
!
while(i <= j) {
!
while(a[i] < x) i++;
!
while(a[j] > x) j--;
!
if(i <= j) {
!
tmp=a[i]; a[i]=a[j]; a[j]=tmp; // swap a[i] and a[j]
! !
i++;
! !
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
j--;
!
}
}
47
!
i
if(left < j) quickSort(a, left, j);
!
!
16.12.2008
static void quickSort(int a[], int left, int right) {
!
7
16.12.2008
if(i < right) quickSort(a, i, right);
}
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
8
Prog. 1
Prog. 1
(Datei-)Eingabe bzw. Ausgabe
•
In der Praxis werden Daten häufig nicht von der Tastatur sondern aus
Dateien oder Datenbanken gelesen
•
Ebenso werden Daten häufig nicht auf dem Bildschirm ausgegeben
sondern in Dateien oder Datenbanken geschrieben
•
Der Umgang mit Daten/Dateien erfolgt in Java mittels Streams
•
Die Klasse Scanner
Die Klasse Scanner verarbeitet Eingaben (von Tastatur und aus Datei)
– Muss vor dem Benutzen importiert werden
!
import java.util.Scanner;
– Anschließend muss ein Objekt der Klasse Scanner kreiert werden
!
Programmieren 2
•
Scanner keyboard = new Scanner(System.in);
• System.in beschreibt den Standard-Eingabestrom des Systems
– Methoden wie next() bzw. nextInt() oder nextDouble() lesen ein
Wort bzw. einen Wert vom Typ int oder double ein
Seit Java 1.5 gibt es die Klassen Scanner und Formatter mit denen
sich (Datei-)Ein- und Ausgaben kompfortabel(er) realisieren lassen
• Vollständige API-Dokumentation unter
http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16.12.2008
Prog. 1
9
Prog. 1
Die Klasse Scanner (Beispiel)
import java.util.Scanner;
16.12.2008
•
Scanner verfügbar machen
public class ScannerDemo {
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
int row = keyboard.nextInt();
10
Einige Methoden von Scanner
Methoden zur Einlesen von primitiven Datentypen
– nextBoolean(), nextByte(), nextDouble(), nextFloat(),
nextInt(), nextLong(), nextShort()
Eingabe(Objekt)
erzeugen
System.out.print("Bitte geben Sie zwei Zahlen ein: ");
int col = keyboard.nextInt();
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
•
Ganze Zahlen (getrennt durch
Whitespaces) einlesen
Methode zum Einlesen der nächsten Zeichen bis zum ersten
Trennzeichen
– next()
for (int i = 0; i < col; i++) {
– Liefert einen String
– Default-Trenner sind Whitespaces
for (int j = 0; j < row; j++)
System.out.print("*");
System.out.println();
}
}
}
Beispieldialog A:
Beispieldialog B:
Bitte geben Sie zwei Zahlen ein:
2
3
***
***
Bitte geben Sie zwei Zahlen ein:
2 3
***
***
•
– nextLine()
– Zeilenumbruchzeichen ‘\n‘ wird gelesen und entfernt; ist nicht im String
enthalten
– Enthält einen Zeile nichts ausser dem Zeilenumbruchzeichen, wird ein leerer
String zurückgegeben
• Trennung durch Whitespaces, z.B. Blank(s), Tab(s), Zeilenumbruch
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Methode zum Einlesen einer Zeile
11
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
12
Prog. 1
•
Prog. 1
Scanner und andere Input-Trenner
Lokalisierung
Die Symbole, die die Eingabe trennen, können geändert werden
•
– useDelimiter()
– Darstellung von Kommazahlen ist z.B. regional unterschiedlich
import java.util.Scanner;
public class DelimiterDemo {
public static void main(String[] args) {
Scanner keyboardA = new Scanner(System.in);
Scanner keyboardB = new Scanner(System.in);
keyboardB.useDelimiter("#");
System.out.println("Geben Sie Textzeile eins ein: ");
String stringA1 = keyboardA.next();
String stringA2 = keyboardA.next();
System.out.println("Text 1.1: "+stringA1);
System.out.println("Text 1.2: "+stringA2);
System.out.println("Geben Sie Textzeile zwei ein: ");
String stringB1 = keyboardB.next();
String stringB2 = keyboardB.next();
Beispiel:
System.out.println("Text 2.1: "+stringB1);
System.out.println("Text 2.2: "+stringB2); Geben Sie Textzeile eins ein:
a b#c#
}
Text 1.1: a
}
Text 1.2: b#c#
import java.util.Scanner;
import java.util.Locale;
public class LocaleDemo {
public static void main(String[] args) {!
System.out.println("Current Locale: ");
System.out.println(Locale.getDefault().getCountry());
Geben Sie Textzeile zwei ein:
a b#c#
Text 2.1: a b
Text 2.2: c
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16.12.2008
Prog. 1
•
13
Mit Hilfe Klasse Locale kann ein Java Programm an regionale
Besonderheiten angepasst werden
}
}
16.12.2008
Ausgabe:
System.out.println(Locale.getDefault().getDisplayCountry()); Current Locale:
DE
System.out.println(Locale.getDefault().getLanguage());
Deutschland
System.out.println(Locale.getDefault().getDisplayLanguage()); de
Deutsch
System.out.println(Locale.getDefault().getDisplayName());!
Deutsch (Deutschland)
Locale[] available = Locale.getAvailableLocales();
English
Arabic
Locale.setDefault(Locale.ENGLISH);
.
System.out.println(Locale.getDefault().getDisplayName());
.
.
for (Locale l: available)
Norwegian
System.out.println(l.getDisplayName());
.
.
.
English
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
14
Prog. 1
Scanner und Lokalisierung
Pfadangaben
Wie die Trennsymbole können beim Scanner auch andere (lokale)
Eigenschaften (z.B. Darstellung von Dezimalzahlen) geändert werden
•
import java.util.Scanner;
Pfadangaben zu Dateien können
relativ oder absolut erfolgen
•
Beispiele relativer Pfadangaben
– Unix
! ../name.txt
– Relative Pfadangabe
public class ScannerDecDemo {
public static void main(String[] args) {
Korrekte Eingabe ist:
– Windows
! ..\name.txt
• Die Angaben beziehen sich auf das
aktuelle Verzeichnis, in dem die
Anwendung aufgerufen wird
1,2
Scanner keyboard = new Scanner(System.in);!
System.out.print("Bitte Zahl eingeben: ");
double dNumber = keyboard.nextDouble();
System.out.println(dNumber);
}
}
import java.util.*;
– Absolute Pfadangabe
Bitte geben Sie eines Zahl ein: 1.2
• Die Angaben beziehen sich auf das
Wurzelverzeichnis des
Dateisystems
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:819)
at java.util.Scanner.next(Scanner.java:1431)
at java.util.Scanner.nextDouble(Scanner.java:2335)
at ScannerDecimalDemo.main(ScannerDecimalDemo.java:9)
public class ScannerDecDemo2 {
keyboard.useLocale(Locale.ENGLISH);!
Beispiele absoluter Pfadangaben
– Unix
! /usr/irgendjemand/name.txt
– Windows
! z:\java\daten\name.txt
public static void main(String[] args) {
Scanner keyboard = new Scanner(System.in);
•
Lokalisierung des Scanners
System.out.print("Bitte Zahl eingeben: ");
double dNumber = keyboard.nextDouble();
System.out.println(dNumber);
}
}
16.12.2008
Bitte geben Sie eines Zahl ein: 1.2
1.2
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
15
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
16
Prog. 1
Die Klasse Properties
•
Über das Konzept der Properties
kann in Java auf System-Eigenschaften zugegriffen werden
•
Jede Eigenschaft besitzt einen
eindeutigen Namen, unter dem auf
sie zugegriffen werden kann
•
•
String[] s = {“java.version“,
“file.separator“,
public static String
getProperty(String key,
String default)
•
16.12.2008
•
println(System.getProperty(s[i]));
}
Wie 1., jedoch Rückgabe von
default anstatt null, falls
keine Eigenschaft key
Programm-Ausgabe
1.5.0_06
.../JavaVM.framework/Versions/1.5.0/Home
Mac OS X
10.4.8
/
:
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Die Klasse File (aus java.io)
Objekte der Klasse File können
foglendermassen erzeugt werden
– public
File(String pathname)
• Konstruiert File-Objekte zum Dateioder Verzeichnisnamen
– public
File(String parent,
String child)
• Getrennte Übergabe von Verzeichnisund Datei-Namen
– public
File(File parent,
String child)
• Wie 2. jedoch Übergabe von FileObjekt anstatt Verzeichisnamen
import java.util.*;
public class PrintProperties {
public static void main(String[] a) {
Properties sProps =
System.getProperties();
Enumeration propNs =
sProps.propertyNames();
while(propNs.hasMoreElements()){
String propN = (String)
propNs.nextElement();
System.out.println(propN + “=“ +
System.getProperty(propN));
}
}
}
Details: Programmieren II
17
16.12.2008
Prog. 1
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
•
boolean isDirectory()
•
boolean isFile()
•
boolean canRead()
•
boolean canWrite()
–
File f1 = new File(“TestDatei.txt“);
–
/* Unter DOS muss der Backslash
–
doppelt angegeben werden, da er
gleichzeitig Escape-Zeichen für
Strings ist. */
–
File f2 = new
File(“c:\\documents\\docu.doc“);
•
•
Liefert Datei-/Verzeichnis-Namen
Liefert ein String-Array mit den
}
Namen der Dateien/Verzeichnisse
im, durch f bezeichneten, Verzeichnis }
boolean exists()
–
Liefert true, wenn f existiert
long length()
–
16.12.2008
import java.io.*;
public class VerzeichnisInfo {
public static void main(String[] args) {
File fod = new File(".");
Out.println("Name
: "+fod.getName());
Out.println("Pfad
: "+fod.getPath());
Out.println(“Pfad voll : "+fod.getAbsolutePath());
Out.println("Schreiben : "+fod.canWrite());
Out.println("Lesen
: "+fod.canRead());
Out.println("File
: "+fod.isFile());
Liefert true, wenn in f geschrieben
werden kann
String[] list()
File(“/usr/testusr“);
19
Liefert true, wenn f lesbar ist
•
–
File f5 = new
Liefert true, wenn f File ist
String getName()
File(“.“,“Beispiel.java“);
File f4 = new
Liefert true, wenn f Verzeichnis ist
•
–
File f3 = new
18
Methoden der Klasse File
f ist ein File-Objekt:
/* Beispiele für gültige KonstruktorAufrufe */
import java.io.*;
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
// Für Properties und Enumerator
Nebenstehendes Beispiel liefert
alle verfügbaren SystemProperties
File(f4,“FileExample.java“);
16.12.2008
/* Auflisten aller verfügbaren SystemProperties*/
– sowohl system-abhängige als
auch system-unabhängige
Die Klasse File
– stellt eine Abstraktion einer Datei
bzw. eines Verzeichnisses dar
– behandelt nicht den Inhalt einer
Datei, sondern abstrahiert Name
und Zugriffspfad
•
•
}
}
Die Methode getProperties
liefert das Properties-Objekt
mit den System-Properties
Die Methode propertyNames
erzeugt einen Enumerator mit
dem
– durch Aufruf von getProperty
der zugehörige Wert ermittelt
werden kann
for(int i=0; i<s.length; ++i) {
System.out.
Liefert Eigenschaften mit Name key
Die Methode getProperties
– alle Schlüsselwerte
durchlaufen werden können
“path.separator“,
“line.separator“};
Zugriff auf einzelne Properties
–
•
“java.home“,
“os.name“,
“os.version“,
Zugriff auf Systemeigenschaften in
Java über die Klasse Properties
(abgeleitete von Hashtable)
•
•
// Zugriff auf System-Properties
public class PrintProperty {
public static void main(String[] a){
1. public static String
getProperty(String key)
Prog. 1
Prog. 1
Liefert die Anzahl Bytes in f
if(fod.isDirectory()) {
Out.println("Directory : "+fod.isDirectory());
String flist[] = fod.list();
for(int i=0; i<flist.length; ++i)
Out.println("-- "+flist[i]);
}
ProgrammAusgabe:
Name
: .
Pfad
: .
Pfad voll : .../workspace/FileTest/.
Schreiben : true
Lesen
: true
File
: false
Directory : true
-- .classpath
-- .project
-- VerzeichnisInfo.class
-- VerzeichnisInfo.java
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
20
Prog. 1
Prog. 1
Einlesen aus einer Datei
•
•
Schreiben in eine Datei
•
Die Klasse Scanner kann auch zum Einlesen von Daten aus einer
Datei verwendet werden
Beispiel
Einlesen der Datei “datei.dat“ mit den Werten 47 11 0 8 15
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class FileScannerDemo {
public static void main(String[] args)
throws FileNotFoundException
{
String filename = "datei.dat";
File file = new File(filename);
Scanner sc= new Scanner(file);
while (sc.hasNextInt())
{
int zahl = sc.nextInt();
System.out.println(zahl);
}
sc.close();
}
}
16.12.2008
•
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
Es kann sein, dass die Datei
nicht existiert!
(Details über Exceptions in
Programmieren II)
public class FileFormatterDemo {
public static void main(String[] args)
throws FileNotFoundException
{
String filename = "datei.dat";
File file = new File(filename);
Formatter f = new Formatter(file);
f.format("%d %d %d %d %d\n",47,11,0,8,15);
f.close();
}
}
Solange noch Daten
vorhanden sind
Schließe die Datei
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
21
Prog. 1
16.12.2008
Es kann sein, dass die Datei
nicht erstellt werden kann!
(Details über Exceptions in
Programmieren II)
Schreibe Daten formatiert
in die Datei
Schließe die Datei
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
22
Prog. 1
Dateioperationen (Beispiel 1)
•
Um Daten in eine Datei zu schreiben kann die Klassen Formatter
verwendet werden
Beispiel
Die Werte 47 11 0 8 15 in die Datei “datei.dat“ schreiben
Dateioperationen (Beispiel 2)
Schreiben Sie ein Programm Read, das eine Datei zeilenweise einliest
und auf dem Bildschirm ausgibt. Der Name der Datei soll als
Komandozeilen-Parameter übergeben werden
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;
public class Copy {
public static void main(String[] args)
throws FileNotFoundException{
if (args.length < 2) {
System.out.println("usage: java Copy inFile outFile");
System.exit(-1);
}
Scanner input = new Scanner(new File(args[0]));
Formatter output = new Formatter(new File(args[1]));
while(input.hasNextLine()) {
String line = input.nextLine();
output.format(line);
}
input.close();
output.close();
}
}
class Read {
public static void main(String[] args)
throws FileNotFoundException {
if (args.length == 0) {
System.out.println(“usage: java Read filename");
System.exit(-1);
}
Scanner sc = new Scanner(new File(args[0]));
while(sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}
sc.close();
}
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
Schreiben Sie ein Programm Write, das eine Datei zeilenweise
einliest und in eine andere Datei ausgibt. Die Namen der Dateien soll
als Komandozeilen-Parameter übergeben werden
!
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
16.12.2008
•
23
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
24
Prog. 1
Prog. 1
Dateioperationen (Beispiel 3)
•
Beliebte Fehler (Öffnen nicht existierender Dateien)
•
Schreiben Sie ein Programm Add, das alle Zahlen in einer Datei
aufaddieren
Wird eine nicht existierende Datei geöffnet, wird eine
FileNotFoundException ausgelöst
– Mittels try ... catch kann dies abgefangen werden
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Add {
public static void main(String[] args)
throws FileNotFoundException{
if (args.length == 0) {
System.out.println("usage: java Add filename");
System.exit(-1);
}
Versuch eine Datei zu öffnen
public class FileNotFoundDemo {
und einen Scanner zu
public static void main(String[] args) {
verwenden
String filename = "test.dat";!
try {
Scanner sc = new Scanner(new File(filename));
Scanner sc = new Scanner(new File(args[0]));
double sum=0;
while(sc.hasNextDouble())
sum += sc.nextDouble();
sc.close();
// do anything! !
!
Wenn Datei nicht vorhanden
sc.close();
dann gib Meldung aus
// do anything else
} catch (FileNotFoundException e) {
System.out.println("File "+filename+ " does not exist");
}
System.out.println(“Summe: “+sum);
}
}
}
}
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
25
Prog. 1
Beliebte Fehler (Überschreiben existierender Dateien)
•
•
Wird eine existierende Datei geöffnet, dann wird die alte Datei - ohne
vorherige Warnung - zuerst gelöscht
Versehentliches Überschreiben einer Datei kann mittels
file.exists() verhindert werden
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Formatter;
public class NoOverideFileDemo {
public static void main(String[] args) {
String filename = "test.dat";
File file = new File(filename);
if (file.exists()) {
System.out.println("File "+filename+" already exists");
} else {
try {
Formatter f = new Formatter(file);
f.format("%d %d %d %d %d\n",47,11,0,8,15);
f.close();
} catch (FileNotFoundException e) {
System.out.println("File "+filename+ " does not exist");
}
}
}
}
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
27
16.12.2008
FH-Wiesbaden --- Medieninformatik --- WS 08/09 --- Prof. Dr. Ulrich Schwanecke
26
Herunterladen