P. Pfahler, E. Stümpel

Programmieren in Java, Winter 1997/98

10. Übungsblatt, Lösungsvorschlag


Aufgabe 17 (Binär-Eingabe/Text-Ausgabe)

Aus einer Binärdatei, die mit der Klasse java.io.DataOutputStream erstellt wurde, sollten die Daten einer Versandhausbestellung wieder ausgelesen und in geeignet formatierter Form zusammen mit dem errechneten Gesamtwert der Bestellung als Rechnung ausgegeben werden. Die Daten der Bestellung bestehen aus einer Folge von Artikel-Daten, wobei ein Artikel durch vier Größen beschrieben wird:

Hier ein Java-Programm mit den gewünschten Eigenschaften erstellt von Ralf Bilger und Martin Otto:


import java.io.*;

public class Einlesen
{
        public static void main(String [] args) 
        {
                FileInputStream dis=null;               // arbeitet auf dem Eingabefile
                DataInputStream in=null;                // arbeitet auf dem Eingabestrom aus dem Eingabefile
                long bestnummer;                        
                String artikel;
                float preis;
                int anzahl;
                float kosten=0;                         // summiert Gesamtkosten
		double r_kosten;			// gerundete Kosten
                String zwischen,zeile="";               // fuer die schoene Formatierung
                if (args.length!=1)                     // Kontrolle, ob die Eingabedatei mit angegeben wurde
                {       System.out.println("Bitte die Eingabedatei in der Kommandozeile mit eingeben !");
                        System.exit(1);
                }
                try
                {
                        dis= new FileInputStream(args[0]);      // Fehlersicheres oeffnen der beiden Stroeme
                        in=new DataInputStream(dis);            // dabei muss die Eingabedatei als Parameter da sein
                }
                catch (FileNotFoundException e)                 // faengt Fehler, falls Eingabefile nicht existiert
                {       System.out.println("Existiert das file : "+args[0]+" ueberhaupt ?");
                        System.exit(1);
                }
                System.out.println("Rechnung :\n");
                System.out.println("Bestellnummer  Artikelbezeichnung               Preis    Stueck");
                System.out.println("=============  =============================    =====    ======\n");
                try
                {
                        for (;;)                                // ewige Schleife : unbekannte file-Groesse
                                                                // also Abbruch mit Exception
                        {       zeile="";
                                bestnummer=in.readLong();       // Bestellnummer einlesen
                                zwischen=java.lang.Long.toString(bestnummer);   // in einen String verwandeln
                                for (int i=0;i<(12-zwischen.length());i++)      // fuer Layout : rechtsbuendig in die 
                                                                                // dafuer vorgesehene Spalte
                                        zeile+=" ";
                                zeile+=zwischen;                                // und in String zeile geben
                                artikel=in.readUTF();                           // dasselbe Vorgehen wie bei bestnummer
                                zwischen=artikel.toString();
                                zeile+="   "+zwischen;
                                for (int i=0;i<30-zwischen.length();i++)
                                        zeile+=" ";
                                preis=in.readFloat();                           // dasselber Vorgehen wie bei bestnummer
                                zwischen=java.lang.Float.toString(preis);
                                anzahl=new Float(preis).intValue();             // bis auf hier : damit die Dezimalpunkte
                                                                                // buendig sind, muss Vorkommateil
                                                                                // betrachtet werden !
                                zwischen=java.lang.Integer.toString(anzahl);
                                for (int i=0;i<5-zwischen.length();i++)         // Vorspann an Spaces mittels Vorkommateil !
                                        zeile+=" ";
                                zeile+=java.lang.Float.toString(preis);
                                if (java.lang.Float.toString(preis).length()==java.lang.Integer.toString(anzahl).length()+2)
                                        zeile+=" ";                             // wenn nur eine Nachkommastelle => + " "
                                zeile+="  ";
                                anzahl=in.readInt();                            // dasselbe Vorgehen wie bei bestnummer
                                kosten+=preis*anzahl;
                                zwischen="";
                                zwischen=java.lang.Integer.toString(anzahl);
                                for (int i=0;i<5-zwischen.length();i++)
                                        zeile+=" ";
                                zeile+=zwischen;
                                System.out.println(zeile);                      // und fertig formatierte Zeile ausgeben
                        }
                }
                catch (IOException e)   { }                                     // faengt die Fehlerquelle "file zuende" auf
                zeile="               Gesamtkosten :                ";
		r_kosten=Math.round(kosten*100)/100.0;				// Runden auf Pfennige
                zwischen=java.lang.Double.toString(r_kosten);
                for (int i=0; i<5-java.lang.Integer.toString(new java.lang.Double(kosten).intValue()).length(); i++)
                                                                                // hier wird ein neues Float Object mit dem
                                                                                // Gesamtpreis initialisiert, dann der
                                                                                // Vorkommateil benutzt, um mittels des
                                                                                // Integer-Objektes die Laenge der
                                                                                // Stringdarstellung des Vorkommateils zu
                                                                                // ermitteln. So wird der Dezimalpunkt
                                                                                // buendig !
                        zeile+=" ";
                zeile+=zwischen;
                System.out.println(zeile);
                try
                {
                        dis.close();                                            // fehlersicheres Schliessen des files
                }
                catch (IOException e)   {       }
        }
}


Man erhät damit die folgende Ausgabe:


Rechnung :

Bestellnummer  Artikelbezeichnung               Preis    Stueck
=============  =============================    =====    ======

   123454444   Digital Thermometer              15.98      1
   123456543   Eiskratzer                        2.99      2
   123454420   Türschloss-Enteiser               3.59      5
     5134336   Glühwein                          4.59      3
     7227434   Handschuhe                       42.5       1
     7227435   Schal, Wolle                     22.1       1
               Gesamtkosten :                  118.28

Hier das Programm zum mitnehmen: Sourcecode

Aufgabe 18 (Applet für sensitives Bild)

Vorgegeben war der unkommentierte Source-Code eines Applets zu dem 10 Fragen beanwortet werden sollten.