z u m . d e


 



Rheinland-Pfalz;  Informatik                                 

2007; letzte Aktualisierung:  19.6.2014; Claus Schmitt

Zurück zur Startseite Informatik / Rheinland-Pfalz Startseite Informatik-Rheinland-Pfalz

Das Problem
Ein Struktogramm

Java-Quelltexte

Installation von Java-Entwicklungsumgebung und Editor

Editieren, kompilieren, starten des Programmes

Technische Hintergründe

Fachbegiffe suchen für alle Java-Seiten (Index)

Alle Java-Quelltexte
Quellen

 zurück zur Java Startseite

 

 

 

 


Einstieg in Java über ein echtes Problem...

Wenn ich mir vornehme, eine neue Programmiersprache zu lernen, bin ich oft enttäuscht, wenn es dann am Anfang nur für das "Hello world"-Programm reicht..
Das Problem bei der Einführung ist meist, dass der Autor genug mit den Besonderheiten der Syntax und der Benutzeroberfläche zu tun hat, so dass das Problem eher dienenden Charakter hat...
In Wirklichkeit sind Programmiersprachen aber nur ein (austauschbares, dienendes) Werkzeug, um Probleme zu lösen. 
Lassen Sie uns also ein Problem in den Mittelpunkt  und die technischen Randbedingungen zurück stellen!

Wir beginnen tatsächlich mit einem "phänomenalen Problem", das uns in seiner Erstaunlichkeit durchaus auch noch in der Abiturklasse (Theoretische Informatik / Halteproblem) beschäftigen kann:

        Die Ulam-Folge:

  • Wähle als Startzahl n eine beliebige natürliche Zahl.
  • Für gerades n entsteht das nächste Element der Folge, indem man n halbiert.
  • Für ungerades n muss man n entsprechend verdreifachen und dann 1 addieren.


Bekanntlich (aber bis heute nicht bewiesen) hat sich durch ausgiebiges Testen ergeben, dass es für jede Startzahl n ein letztes Folgenglied gibt, und zwar 1  !!!
Obiges Ulam-Verfahren terminiert also jeweils, und das wäre in der vermuteten Allgemeingültigkeit eine wesentliche Bedingung für einen Algorithmus.

Lassen Sie uns ein Struktogramm entwickeln für diesen "Algorithmus":

Jetzt können wir uns anschauen, wie dieses Struktogramm in Java-Quelltext übertragen wird:
Lassen Sie sich von fremdartigen Begriffen nicht irritieren, sondern versuchen sie nur die Zusammenhänge mit dem Struktogramm zu entdecken.
Außerdem kann man sicher davon ausgehen, dass bei Ihnen  Erfahrungen mit mindestens
einer höheren Programmiersprache vorliegen.

zum Anfang der Seite    Begriffe Suchen

class Ulam  {
	public static void main (String[] args)  {	      
	  int n = 13;
	  System.out.println(n);
	  while(n != 1) {
	     if(n % 2 == 0)  n = n / 2;
	     else            n = 3*n + 1;
	     System.out.println(n);   
	  }
     }
}
Es ergibt sich folgende Ausgabe:

  • Mit n % 2  wird der Modulo-Operator verwendet; n % 2 liefert also den Rest bei Ganzzahldivision durch 2.
    z.B. 13 % 2 = 1       und   13 / 2 = 6
  • Die Mengenklammern markieren Blöcke, wie man sie z.B. von der "BEGIN END Klammerung" bei Pascal kennt.

zum Anfang der Seite    Begriffe Suchen

Da es unpraktisch ist, den Startwert n immer neu zu editieren, sieht man eine kommandozeilenorientierte Eingabe vor:
(Die aktuellen Parameter werden als Zeichenketten gelesen; nach  einer Leerstelle folgt der nächste Parameter; auf den ersten  greift man über args[0] zu; mit Konvertierungsfunktionen kann man geeignete Übergabewerte in Zahlen umwandeln s.u.)
class Ulam  {
	public static void main (String[] args)  {
          //Der erste Parameter hat die Nummer 0
	    int n = Integer.parseInt(args[0]); 
          //Die While-Schleife klammert einen Block von Anweisungen
	    while(n != 1) {      
	      if(n % 2 == 0)               
		  n = n / 2;                 
		else                         
		  n = 3*n + 1;               
		System.out.printf("%d,  ",n);    
	    }
              //im Formatstring ist %d ein Platzhalter für eine ganze Zahl
	}
}                                            

Liefert mit dem aktuellen Parameter 27: 

zum Anfang der Seite    Begriffe Suchen

Zur vernünftigen Darstellung der Ulam-Folge fehlt jetzt nur noch eine geeignete Formatierung:
class Ulam  {
  public static void main (String[] args)  {
    int n = Integer.parseInt(args[0]);
    int i = 0;
    while(n != 1) {
    
//Index für das Ulam-Folgenglied
     i = i +1;                       
     if(n % 2 == 0)    
         n = n / 2;
     else    
        n = 3*n + 1;
     // 7 Plätze für jede Zahl
     System.out.printf("%7d,",n); 
     // Zeilenwechsel immer nach 10 Zahlen  
     if (i%10 == 0 )
        System.out.println();      
    }
        // Schleife beendet  
  
//%n steht für einen Zeilenwechsel                               
   System.out.printf("%n%nDiese Ulamfolge umfasst %d Zahlen.%n",i); 
    }
}

zum Anfang der Seite    Begriffe Suchen

Man kann im Unterricht ein Problembewusstein entwickeln, dass die Termination dieser Entwicklung keinesfalls selbstverständlich ist, indem man z.B. den Term 3n + 1 durch 3n - 1 ersetzen lässt; die Schüler werden dann sehr schnell nachstehende Folgenentwicklung (und damit eine Endlosschleife) erkennen: 
                                          5, 14, 7, 20, 10, 5, 14,...

I
m Wettbewerb der Gruppenarbeit ist es immer eine spannende Angelegenheit, die Startzahl zu finden, welche die längste (?) Ulamfolge bewirkt...

Bis die Ulamfolge eine Zweierpotenz trifft, entwickeln sich oft sehr große Zahlen; im obigen Beispiel ist 9232 das größte Folgenglied. 
In unserem Java-Programm ist das eine schöne Gelegenheit, auch eine einseitige Verzweigung zu berücksichtigen:
class Ulam  {
  public static void main (String[] args)  {
    int n = Integer.parseInt(args[0]);
    //Zunächst wird das Maximum auf den Startwert gesetzt.
    int max = n;     
    int i = 0;
    while(n != 1) {
     i = i +1;
     if(n % 2 == 0)    
        n = n / 2;
     else    
       n = 3*n + 1;
     if (n > max)
       max = n;
    }
    System.out.printf("%nDiese Ulamfolge umfasst %d Zahlen; %n",i);
         System.out.printf("das groesste Folgenglied ist %d.%n",max);   
  }
}        

zum Anfang der Seite    Begriffe Suchen

Nun ist es an der Zeit,
Die Installation von Java
zu erläutern:
  1. Download der Java-Entwicklungsumgebung "Java Development Kit" (JDK)  (JDK 6;offline Installation; )
  2. Installieren in ein Programmverzeichnis für das JDK, indem man die *.exe-Datei ausführt.
  3. Umgebungsvariable Path für die ausführbaren Dateien  im JDK setzen :
    Start -> Systemsteuerung -> System -> Registerkarte Erweitert -> Umgebungsvariablen -> Bearbeiten Path -> Pfad der JDK mit Semikolon anhängen ( z.B.                     ;C:\Programme\Java\jdk1.6.0_03\bin).
  4. Auf Betriebssystemebene testen, indem man javac eingibt; ist der Pfad richtig gesetzt, werden die möglichen Parameter von javac aufgelistet (Kontrolle auch mit SET).
  5. Download Java-Editor Joe (auspacken und Setup in ein Programmverzeichnis).

 

Der Editor:

  1. Falls bei der Installation des Editors noch nicht automatisiert erledigt, kann man über "Optionen (3) / Einstellungen" den Compiler javac.exe und den Interpreter java.exe samt Pfad ...\jdk1.6.0_03\bin einstellen. 
    Damit ist mein Installationsvorschlag schon beendet!

     

    zum Anfang der Seite    Begriffe Suchen

Die erste Eingabe eines Java-Quelltextes.
Man erzeugt sich im Editor eine neue Seite und gibt ganz nach Geschmack einen der obigen Ulam-Quelltexte ein; eine Datei legt man möglichst gleich am Anfang mit  "Speichern unter" (1)  in das übliche Verzeichnis für die eigenen Daten; der Dateinamen muss gleich dem Namen der Klasse sein, also hier Ulam; der Editor fügt selbst die Dateinamenerweiterung .java an, also Ulam.java  (Groß- kleinschreibung unbedingt beachten).
Der Compiler untersucht den Quelltext auf Syntax-Fehler.
Nach Drücken der Taste (4) erscheinen in einem unteren Fester die i.d.R. zahlreichen Fehlermeldungen...
Der Compiler übersetzt den Quelltext  in sog. Bytecode ...
...sobald man alle Fehler verbessert hat...
Gleichzeitig wird dieser Bytecode in das gleiche Datenverzeichnis, unter dem gleichen Namen, aber mit der  Dateinamenerweiterung .class gespeichert; also hier Ulam.class  .
Der Bytecode wird von dem Interpreter gestartet,

indem man die Taste (5) auslöst. Die Ausgabe erscheint in einem weiteren unteren Fenster.
Falls das Programm Parameter in der Kommandozeile vorsieht, kann man diese vor dem Start über einen Menübefehl (2) eingeben.
zum Anfang der Seite    Begriffe Suchen

Hintergründe: Ein Java-Bytecode  läuft auf Windows, Linux , Solaris...

Das Dateihandling läuft also mit dem Editor ziemlich automatisch und auf Windowsebene; oft will man aber ohne diese Oberfläche unmittelbar mit dem "Java Development Kit" arbeiten:

  1. Dazu muss man sich auf DOS-Ebene begeben; z.B. mit unserem Editor kommt man mit Knopf (6) unmittelbar zur Eingabeaufforderung im aktuellen Datenverzeichnis (ansonsten über: Start -> Ausführen -> cmd).
  2. Den Compiler startet man " von Hand" mit         javac Ulam.java
  3. Nach erfolgter Übersetzung ist der Bytecode Ulam.class nicht unmittelbar ausführbar, sondern wird für MS-Windows via 
    java Ulam
    interpretiert (dies ist insofern universal, da es zum gleichen Bytecode für die div. Betriebssysteme jeweils einen spezifischen Interpreter gibt). 

Quellen

  1. Vorlesung "Einführung in die Programmierung" von Prof. Dr. Herbert Göttler im WS 2007 / 2008 an der Universität Mainz.
  2. Reinhard Schiedermeier — Programmieren mit Java  ISBN: 978-3-8273-7116-4
    480 Seiten; Sprache: Deutsch; € 39,95 [D]
  3. Herrn Mahdi D-Manesh / Universität Mainz / Fachbereich Informatik bin ich für die Durchsicht der Vorlage und die 
    hilfreichen Anregungen sehr dankbar.

zum Anfang der Seite    Begriffe Suchen

Weitere Literaturempfehlungen
    finden Sie hier

Ergänzungen und Anregungen bitte an Claus Schmitt

Zurück zur Startseite Informatik / Rheinland-Pfalz Startseite Informatik-Rheinland-Pfalz