MezData-Logo Creative Commons License 388 Lösungen Button :PI-BLUEJ: Passwort-Projekt

Synopsis:

How do I scanf, readln, etc. in Java? http://www.cafeaulait.org/javafaq.html

Lösungen: Passwort.java

 Klasse Passwort -zwei Listen Name und Passwort

Gegeben Klasse:

public class Passwort{
  static String namen[] = {"Anna","Bert","Kalleman"};
  static String pswd[] = {"f1c4e","123gaga","babe"};
  
  public static boolean check(String n, String p){
    // Ihr Programmcode      
  }
  public static boolean aenderePswd(String n,String ap,String np){
    // Ihr Programmcode   
  }

Entwickeln Sie die Methode check(n,p:Text):Boolean, mit Rückgabe true, wenn Name n und dazugehöriges Passwort p in den Feldern vorhanden ist, sonst Rückgabe false.

Entwickeln Sie die Methode aenderePswd(n,ap.np:Text):Boolean, zum Ändern des Passworts, dabei ist n der Name und ap,np altes und neues Passwort. Rückgabe true bei Erfolg, false sonst.

Formatiertes Ausgeben

0. Anna f1c4e
1. Bert 123gaga
2. Kalleman babe
Erstellen Sie eine Methode ausgeben(), die alle Namen nebst Passwörtern auf der Konsole ausgibt.

Schönere Ausgabe erzeugen

1. Anna       f1c4e
2. Bert       123gaga
3. Kalleman   babe
Erstellen Sie eine Methode ausgeben2(), die alle Namen nebst Passwörtern formatiert auf der Konsole ausgibt.
Die Namen sollen 10 Zeichen breit dargestellt werden. Zeichen Sie ein Struktorgramm. Lösung..

Formatiertes Ausgeben mit printf

In praktisch jeder Programmierumgebung gibt es Funktionen um Ausgaben zu formatieren. Hier soll die Java-Methode printf vorgestellt werden.

 1. Anna       f1c4e 
 2. Bert       123gaga 
 3. Kalleman   babe 
public static void ausgebenPrintf(){
  int i;
  for(i=0;i<namen.length;i++){
    System.out.printf("%2d. %-10s %s %n",i+1,namen[i],pswd[i]);
  }  
}

Format-Spezifizierer Wirkung
%2d Ausgabe zweistellige Dezimalzahl, rechtsbündig
%-10s Ausgabe als String 10 Zeichen Platz durch - linksbündig
%s Ausgabe String ohne besondere Formatierung
%n Ausgabe neue Zeile-Zeichen

Links zur Vertiefung

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 4.9 Formatieren von Ausgaben

printf, Formatstrings : http://java.sun.com/javase/6/docs/api/java/util/Formatter.html#syntax

http://java.sun.com/javase/6/docs/api/java/io/Console.html#printf(java.lang.String,%20java.lang.Object...)

1 1,19
2 2,38 
Übung: Erstellen Sie Methode ausgebenTabelle() für formatierte Tabelle Nettopreis und Bruttopreis mit 19% Steuer.
Verwenden Sie dazu die Format-Spezifizierer d und f: "%2d %4.2f %n"

Speichern der Daten in einer Datei

Daten in Dateien (Files) zu speichern geschieht praktisch immer nach folgendem Prinzip:

aus <- öffneDatenstrom(filename)
BufferedWriter aus = new BufferedWriter(new FileWriter(filename));
aus.schreibe("Hallo hier Daten")
aus.write("Hallo hier Daten");
aus.schliesseDatei()
aus.close();

Es können dabei Probleme auftreten -Dateipfad existiert nicht, Datei ist schon durch anderes Programm geöffnet usw.
In modernen Programmiersystemen werden Probleme in aufgerufenen Methoden durch Ausnahmefehlermeldungen (Exceptions) an die darüber liegenden Programmebenen gemeldet und dort bearbeitet. Galileo Computing -- Java ist auch eine Insel (8. Auflage) – 8 Exceptions

In Java wird hierzu das try-catch-Konstrukt verwendet.

public static void ausgebenDatei(String filename)  { // try-catch nicht im Struktogramm darstellbar
  int i;
  try {  // versuchen wir mal folgenden Code aus zu führen
    BufferedWriter aus = new BufferedWriter(new FileWriter(filename));
    aus.write(namen.length); // Anzahl der Daten speichern
    for(i=0;i<namen.length;i++){
      aus.write(namen[i]+"\t"+pswd[i]+"\n"); // schreibe Datensatz mit Tabulator getrennt  
    }  
    aus.close();
  } catch (IOException e) {  // falls ein IO-Ausnahmefehler auftritt tue folgendes
     System.out.println("IOException: " + e);  // gib den Fehler auf der Konsole aus   
  }
}

StruktogrammDie Anzahl der Datensätze wird hier mit abgespeichert, um beim späteren Lesen eine ausreichende Anzahl Listenplätze zu reservieren.

Implementieren Sie den Quelltext und testen Sie die Methode ausgebenDatei().

Hinweis: Sie müssen ganz oben im Quelltext die IO-Methoden importieren: import java.io.*;

Struktogramm: Ein Strukogramm zu erstellen gestaltet sich schwierig, da try-catch-Blöcke unbekannt waren als Strukogramme entwickelt wurden. Eine mögliche Lösung besteht darin, schlicht diese Exception-Blöcke im Struktogramm weg zu lassen.

Übung: Erstellen Sie Methode ausgebenTabelle(filename:Text) für formatierte Tabelle Nettopreis und Bruttopreis mit 19% Steuer.

Links zur Vertiefung

Galileo Computing -- Java ist auch eine Insel (8. Auflage) – 14 Dateien und Datenströme

Galileo Computing -- Java ist auch eine Insel (8. Auflage) – 14.7 Datenströme filtern und verketten

Lesen der Daten aus Datei

Auch beim Lesen wird zunächst ein Datenstrom geöffnet. Es können einzelne Informationen oder auch ganze Zeilen gelesen werden.

ein <- öffneDatenstrom(filename)
BufferedReader ein = new BufferedReader(new FileReader(filename));
anzahl <- ein.lese()
anzahl = ein.read();
zeile <- ein.leseZeile()
zeile = ein.readLine()
ein.schliesseDatei()
ein.close();
public static void leseDaten(String filename)  { // try-catch nicht im Struktogramm darstellbar
  int anzahl=0;
  String zeile;
  try { // versuchen wir mal folgenden Code aus zu fuehren
    BufferedReader ein = new BufferedReader(new FileReader(filename)); // oeffne Datenstrom
    anzahl = ein.read(); // Anzahl der Datensaetze lesen
    System.out.printf("Anzahl der Datensätze: %d",anzahl);
    while ((zeile = ein.readLine())!= null){ // solange Datensaetze vorhanden, lese Zeile
      System.out.println(zeile); // gib Zeile aus
    }
    ein.close(); // schliesse Datenstrom
  } catch (IOException e) { // falls ein IO-Ausnahmefehler auftritt tue folgendes
    System.out.println("IOException: " + e); // gib den Fehler auf der Konsole aus  
  }
}

Am Ende der Datei (End Of File - EOF) gibt die readLine() Methode einen null - Verweis zurück.

Tokenizer.

Einlesen in die zwei Arrays

Entwickeln Sie Methode ..

Fragen:

  1. Was ist ein Dateisystem?
  2. Was ist eine Exception?
  3. Wozu ist try-catch nötig?
  4. Warum ist die Anweisung import java.io.*; notwendig?
  5. Welche Schritte sind für Dateiausgabe notwendig?
  6. Warum müssen Dateien wieder geschlossen werden?

Formelsammlung für Klassenarbeit

printf(Format-String, Parameter)

Format-Spezifizierer Wirkung Beispiel Ausgabe
%2d Ausgabe zweistellige Dezimalzahl, rechtsbündig
printf("|%2d|%2d|%2d|%-2d|",1,10,100,1)
| 1|10|100|1 |
%-10s Ausgabe als String 10 Zeichen Platz durch - linksbündig
printf("|%5s|%-5s|","AB","BA")
|   AB|BA   |
%s Ausgabe String ohne besondere Formatierung
%n Ausgabe neue Zeile-Zeichen
%5.2f Ausgabe FKZ mit Platz für 5 Zeichen,
davon ein Komma und zwei Nachkommastellen, rechtsbündig
printf("|%5.2f|%n|%5.2f|",1.0,10.0)
| 1,00|
|10,00|

Dateiausgabe

public static void ausgebenDatei(String filename) {
  try {
    BufferedWriter aus = new BufferedWriter(new FileWriter(filename));
    aus.write("Bla Bla");
    aus.close();
  } catch (IOException e) {
    System.out.println("IOException: " + e);
  } 
}

Aus Datei lesen

public static void leseDaten(String filename) {
  String zeile;
  try {
    BufferedReader ein = new BufferedReader(new FileReader(filename));
    while ((zeile = ein.readLine())!= null){
      System.out.println(zeile);
    }
    ein.close();
  } catch (IOException e) {
    System.out.println("IOException: " + e);
  }
}

Übungen

Erstellen Sie eine Methode ausgebenQuadrate(n:GZ), die Quadratzahlen von 1 bis n formatiert in eine Datei quadrate.txt ausgibt.

Ausblick

http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

http://openbook.galileocomputing.de/javainsel8/javainsel_12_003.htm#mjfa399b69b708ffbc0f6b5529f49e2684