Kurs:Einführung in die Informatik mit Java/Kurs 2007/Part 3/Kapitel 10

Aus Wikiversity

Zusammenfassung[Bearbeiten]

Startet hier und hier ist die Sitemap. Es gibt einen Test und wieder Aufgaben. --Michael Reschke 00:19, 23. Jun. 2007 (CEST)

IO = "In- und Output"; Pakete sind Sammlungen von Klassen, die von anderen Programmen verwendet werden können; das java.io ist das meist verwendete "Paket" für Input- und Output-Aufgaben; Eingabedaten werden als Eingabestrom und Ausgabedaten werden als Ausgabestrom bezeichnet; es kann mehrere Ein- ("lesen") und Ausgabeströme ("schreiben") geben, in dieser Einführung werden zumeist folgende Ströme vorkommen:

  • System.in — der Eingabestrom.
  • System.out — der Ausgabestrom für die normalen Ergebnisse. (Hatten wir bei "System.out.println(...);)
  • System.err — der Ausgabestrom für Fehlermeldungen.

System.in ist normalerweise mit der Tastatur verbunden, Datentyp der Eingabe i. d. R. "char", die beiden anderen mit dem Bildschirm; Ausnahmen, "throws IOException"; new-Operator --Michael Reschke 00:19, 23. Jun. 2007 (CEST)

Das Beispielprogramm sieht so aus:

package kapitel10;

import java.io.*; 

class Echo
{
	  public static void main (String[] args) throws IOException {
		  
	    InputStreamReader inStream =
	        new InputStreamReader( System.in ) ;
	    BufferedReader stdin =
	        new BufferedReader( inStream );

	    String inData;

	    System.out.println("Geben Sie Daten ein:");
	    inData = stdin.readLine();

	    System.out.println("Sie haben eingegeben: " + inData );
  }
}

Kapitel 10 erläutert die einzelnen Schritte des Programms... Verkürzt lautet das Programm dann:

package kapitel10;

import java.io.*;
class Echo2
{
  public static void main (String[] args) throws IOException
  {
    BufferedReader stdin =
      new BufferedReader(new InputStreamReader(System.in));
   
    String inData;

    System.out.println("Geben Sie Daten ein:");
    inData = stdin.readLine();

    System.out.println("Sie haben eingegeben: " + inData );
  }
}

Persönlicher Eindruck: Ich bin das erste Mal so gar nicht mitgekommen... --Michael Reschke 00:19, 23. Jun. 2007 (CEST)

Hinweis: Der Eingabestrom (engl. "InputStream") "system.in" verbindet das Javaprogramm mit den Tastatureingaben. Falls Du nun auf der Eingabezeile Korrekturen vornehmen willst - also z.B. den Cursor zuruecksetzen moechtest - wuerde die Betaetigung der Cursortaste nicht etwa den Cursor zuruecksetzen, sondern eine Eingabe entsprechend dem Tastencode der Cursortaste verursachen. Denn der "InputStream" ist ein byteorientierter Eingabestrom. Zur Interpretation der Bytes als Zeichen muss beim Einlesen eine Art "Interpretation" der eingegebenen Bytes stattfinden. Dies macht ein "InputStreamReader".
Dabei koennte man es belassen. Somit waere das obige Beispiel auch schreibbar als:
package kapitel10;

import java.io.*;
class Echo2
{
  public static void main (String[] args) throws IOException
  {
    InputStreamReader stdin =
      new InputStreamReader(System.in);
   
    String inData;

    System.out.println("Geben Sie Daten ein:");
    inData = stdin.read();

    System.out.println("Sie haben eingegeben: " + inData );
  }
}
Nunmehr wuerde aber jeder Tastendruck bereits als Eingabe entgegengenommen und der nachfolgende Befehl ausgefuehrt werden. Soll aber eine Korrektur der Eingabezeile ermoeglicht werden - also eine Art "Interpretation der Tastencodes" - zB. der Cursortasten - stattfinden, benoetigt man einen "BufferedReader". Dieser puffert die Eingabezeichen. Dadurch ermoeglicht er eine zeilenorientierte Eingabe (im Unterschied zur zeichenorientierten Eingabe). Erst mit dem Druck der ENTER-Taste geht die gesamte Eingabezeile an das Programm. --Exxu 00:17, 26. Jun. 2007 (CEST)

Programmieraufgaben[Bearbeiten]

4 Programmieraufgaben --Michael Reschke 23:42, 16. Jun. 2007 (CEST)

Lösung für Aufgabe 1 - Fläche eines Kreises[Bearbeiten]

package kapitel10;
import java.io.*;
class kreisflaeche 
{

	public static void main(String[] args) throws IOException
	{   
	    String inData;
	    int radius;
	    double kreisflaeche;
	    
		BufferedReader stdin =
		      new BufferedReader(new InputStreamReader(System.in));

	    

	    System.out.println("Geben Sie den Radius des Kreises ein:");
	    inData = stdin.readLine();
	    
	    
	    radius = Integer.parseInt(inData);
	    kreisflaeche = radius*radius*Math.PI;
	    
	    System.out.println("Der Radius ist"+radius+ "Die Fläche beträgt:"+
	    		+kreisflaeche);
	}

}

-- Toni Krause 20:47, 27. Jul. 2007 (CEST)

Anmerkung zur Lösung
Die Ergebnisausgabe würde sich schöner präsentieren, wenn Leerzeichen (und eventuell auch ein Zeilenwechsel) mit ausgegeben würden. ZB.:
	    System.out.println("Der Radius ist: "+radius+ "\nDie Fläche beträgt: "+
	    		+kreisflaeche);
Unberücksichtigt bleibt übrigens auch die Möglichkeit, fehlerhafte Zeichenfolgen für den Radius einzugeben. Dies würde nämlich eine "NumberFormatException"[1] auslösen, was zum Programmabruch führen würde. Gruß --Exxu 09:47, 28. Jul. 2007 (CEST)

Lösung für Aufgabe 2 - Cent zu Dollar[Bearbeiten]

package kapitel10;

import java.io.*;

class centZuDollar 
{

		public static void main(String[] args) throws IOException
		{
			String inData;
		    int cent;
		    int dollar;
		    		    
			BufferedReader stdin =
			      new BufferedReader(new InputStreamReader(System.in));

		    

		    System.out.println("Geben Sie die Cent ein:");
		    inData = stdin.readLine();
		    
		    
		    cent = Integer.parseInt(inData);
		    dollar = cent/100;
		    cent = cent%100;
		    
		    System.out.println("Das ergibt "+dollar+ " Dollar und "+
		    		+cent+" Cents.");

		}

}
Anmerkung zur Lösung
Auch hier bleibt die Möglichkeit, fehlerhafte Zeichenfolgen für den Centbetrag einzugeben unberücksichtigt. Dies würde nämlich eine "NumberFormatException" auslösen, was zum Programmabruch führen würde. Gruß --Exxu 10:04, 28. Jul. 2007 (CEST)
Soweit ich weiß, war "NumberFormatException" noch nicht Gegenstand des Lehrstoffes. Deshalb habe ich bei meiner Lösung darauf verzichtet. Technisch gesehen natürlich vollkommen richtig. Gruß --Toni Krause 11:03, 28. Jul. 2007 (CEST)

Lösung zu Aufgabe 3 - Wechselgeld[Bearbeiten]

package kapitel10;
import java.io.*;
class wechselgeld 
{

	
	public static void main(String[] args) throws IOException
	{
	  String inData;
	  int cent;
	  int quarter;
	  int dime;
	  int nickel;
		
	  BufferedReader stdin = 
	    new BufferedReader(new InputStreamReader(System.in));
		
	  System.out.println("Geben Sie die Cent ein:");
          inData = stdin.readLine();
	    
          cent = Integer.parseInt(inData);
	    System.out.println(cent+ "Cent entsprechen: ");
	  quarter = cent/25;
	    System.out.println(quarter + " Quarter");
	  cent = cent - 25*quarter;			
	  dime = cent/10;
	    System.out.println(dime +  " Dime");
	  cent = cent - 10*dime;				
	  nickel = cent/5;
	    System.out.println(dime +  " Nickel");
	  cent = cent - 5*nickel;
	    System.out.println(cent +  " Cent");
		
	}

}
Anmerkung zur Lösung
Mein Vorschlag verzichtet auf Modulo-Berechnungen und kommt ohne eine zusätzliche Zwischenspeichervariable aus. Stattdessen wird immer Ganzzahl-Division durchgeführt und die Variable "cent" immer um den Wert gemindert, der bereits in eine der anderen Münztypen "ausgelagert" wurde.--Toni Krause 12:04, 28. Jul. 2007 (CEST)

Lösung zu Aufgabe 4 - Ohm'sches Gesetz[Bearbeiten]

package kapitel10;
import java.io.*;
class ohmsLaw 
{

	public static void main(String[] args) throws IOException
	{
	  String inData;
          double u;  //Spannung
	  double r;  //Widerstand
	  double i;  //Stromstärke
		
	  BufferedReader stdin = 
            new BufferedReader(new InputStreamReader(System.in));
		
	  System.out.println("Geben Sie die Spannung in Volt ein: ");
	  inData = stdin.readLine();
	  u = Integer.parseInt(inData) + 0.0;   //Umwandeln des Inputs in einen Integer, dann in einen Double
	    
	  System.out.println("Geben Sie den Widerstand des Gerätes in Ohm ein: ");
	  inData = stdin.readLine();
	  r = Integer.parseInt(inData) + 0.0;
	    
	  i = u/r;
	    
	  System.out.println("Die Stromstärke beträgt: "+ i + " Ampere.");
	    
	}

}

--Toni Krause 12:32, 28. Jul. 2007 (CEST)

Anmerkung zur Lösung
Das "Parsen" des eingebenen Volt-Wertes mittels
Integer.parseInt(...)
"verschluckt" allerdings die Nachkommastellen. So würde eine Eingabe von "4.5" als "4" interpretiert werden. Daher könnte das "Parsen" eventuell besser mittels
Double.parseDouble(...)
erledigt werden[2]. Gruß --Exxu 17:39, 28. Jul. 2007 (CEST)
Das ist wie immer eine zweifellos richtige Anmerkung, sie überschreitet aber auch erneut das Wissen, über das ein Kurs-Teilnehmer zu diesem Zeitpunkt verfügen kann. Das Parsen in Double-Werte ist erst Gegenstand des nächsten Kapitels.--Toni Krause 22:58, 28. Jul. 2007 (CEST)

Referenzen[Bearbeiten]

  1. siehe API-Dokumentation zu NumberFormatException
  2. siehe API-Dokumentation zu Double