www.r-krell.de
Webangebot für Schule und Unterricht, Software, Fotovoltaik und mehr

Willkommen/Übersicht  >  Informatik  >  Informatik mit Java, Teil b)   >  Java-Aufzug-Simulation


Simulation eines Aufzugs

Bedienungsanleitung:

Der Aufzug kann mit den Zifferntasten [0] bis [6] oder
durch Mausklick auf einen Knopf zu einer Etage gerufen werden.
Mit der Taste [N] wird der Aufzug(schacht) neu gezeichnet.

Bitte speichern Sie zunächst die Programmdatei

Aufzug(r-krell.de).jar (45 kB)

auf Ihrem Computer und starten ("öffnen") Sie dann die herunter geladene Datei durch Anklicken.
Am besten schieben Sie danach das geöffnete Programmfenster nach oben links,
sodass Sie gleichzeitig diese Seite lesen können.

Mehr zum Start von Java-Programmen als Application (und nicht mehr als Applet) auf meiner Extraseite Übersicht über meine Java-Programme - Appletprobleme und Downloads (öffnet sich in neuem Browser-Tab).


Nachfolgend Hinweise zu meinem Programm, dessen Java-Quelltext und weiterführende Aufgaben:

Vom Schüler Alessandro Conte gibt's übrigens noch eine optisch viel ansprechendere Fahrstuhl-Version auf einer Extraseite




zum Inhaltsverzeichnis (oben) / zum Seitenende

Aufgabenstellung, Schwierigkeiten und Struktogramm

Die Idee zu diesem Programm kam mir, als ich im Urlaub im Hotel einen Aufzug fand, der - wenn man vom Erdgeschoss in den dritten Stock wollte - gelegentlich an der dritten Etage vorbei zuerst in die fünfte fuhr, nur weil dort offenbar jemand vor mir auf den Knopf gedrückt hatte, während ich noch im Erdgeschoss eingestiegen war und bevor ich im Aufzug die „3" drücken konnte. Mit dem Gast aus dem fünften Stock fuhr der Fahrstuhl dann zur dritten Etage, bevor dessen Wunsch ausgeführt wurde.

Zum Glück arbeiten die meisten Aufzüge besser und halten unterwegs an, auch wenn der entsprechende Haltewunsch erst später als der ursprüngliche Zielwunsch geäußert wurde. Im Informatik-Leistungskurs der Stufe 11 (Bildungsgang 1) sollte deshalb ein „guter" Aufzug simuliert werden. Tatsächlich zeigte sich, dass viele Schüler schon Probleme hatten, das Verhalten eines solchen Aufzugs in der Umgangssprache ordentlich zu formulieren. Es dauerte lange, bis klar wurde, dass es sinnvoll ist, aufwärts immer bis zum obersten gedrückten Stockwerk hoch zu fahren, bevor man einen Richtungswechsel erlaubt.

Auch dann konnte das Struktogramm eines entsprechenden Algorithmus nur mit Mühe entwickelt werden: Lange blieb strittig, wo am besten notiert wird, dass der Aufzug auch dann hält, wenn auf der aktuellen Etage nochmal der Knopf gedrückt wird. Außerdem war fraglich, ob neben den Fahrtrichtungen aufwärts und abwärts noch eine dritte Möglichkeit eingeräumt werden muss für den Fall, dass der Aufzug alle Wünsche abgearbeitet hat und keinen weiteren Rufe auszuführen muss, sondern in der letzten angesteuerten Etage ruhig wartet. Man mache sich klar, dass beim nachstehenden Struktogramm während eines solchen Ruhezustand ständig die Fahrtrichtung gewechselt wird, ohne dass der Aufzug fährt!



Schließlich war noch eine geeignete Datenstruktur für das Verwalten der Wünsche zu finden. Weil im Unterricht gerade Reihungen (arrays) behandelt worden waren, lag eine solche Struktur nahe. Die Reihung boolean[] gewünscht hat für jedes Stockwerk 0 bis 6 eine Komponente, die true ist, falls der Aufzug die entsprechende Etage anfahren soll (sonst false). Mit Schleifen wird diese Reihung in geeigneten Methoden nach dem höchsten bzw. niedrigsten gerade gedrückten Stockwerk durchsucht. Es bedurfte des Nachdenkens um einzusehen, dass ohne jeden Wunsch als höchstes Stockwerk besser eine niedrige Zahl (-1) bzw. als niedrigstes gewünschtes Stockwerk eine große Nummer (7) ausgegeben werden musste, um den Algorithmus so einfach zu halten, d.h. zusätzliche Abfragen zu vermeiden. Das Geheimnis eleganter Struktogramme sind auch hier volle Papierkörbe mit vorläufigen, hier nicht dargestellten Entwürfen! Weitere Details sind dem nachfolgenden Quelltext zu entnehmen.




zum Inhaltsverzeichnis (oben) / zum Seitenende

Erste Java-Datei: „AufzugGrafik.java" -- Bauplan für Schacht und Aufzug

//Teil 1/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03

import stiftUndCo.*;

public class AufzugGrafik
{
 Bildschirm fenster;
 BuntStift stift, rotStift, blauStift;
 Maus maus;
 Tastatur taste;
 
final int xLi = 30, xRe = 60, xLa = 80;
 
final int etagenHöhe = 50;
 
int etagenZahl = 0;
 
int y0;

 
public AufzugGrafik (int stockwerke)
 {
  
if (stockwerke < 3 || stockwerke > 10) {stockwerke = 7;}
  etagenZahl = stockwerke;
  y0 = (
int) etagenZahl*etagenHöhe + 20;
  fenster =
new Bildschirm (120, etagenZahl*etagenHöhe+40, "Aufzug");
  stift =
new BuntStift();
  rotStift =
new BuntStift();
  rotStift.setzeFarbe(Farbe.ROT);
  rotStift.setzeFuellMuster(
1);
  blauStift =
new BuntStift();
  blauStift.setzeFarbe(Farbe.BLAU);
  maus =
new Maus();
  taste =
new Tastatur();
  zeichneSchacht();
 }
 
 
private void zeichneSchacht()
 {
  stift.zeichneLinie (xLi-
5, 20, xLi-5, y0);
  stift.zeichneLinie (xRe+
5, 20, xRe+5, y0);
  
for (int stock = 0; stock < etagenZahl; stock++)
  {
   stift.zeichneLinie (xRe+
5, y0-stock*etagenHöhe, xLa, y0-stock*etagenHöhe);
   stift.bewegeBis (xLa-
5, y0-stock*etagenHöhe-25);
   stift.schreibe (
""+stock);
   lampeAus (stock);
  }
  stift.bewegeBis (
10,y0+15);
  stift.schreibe (
"Tastatur o. Maus");
 }
 
 
public void lampeAn (int stock)
 {
  rotStift.normal();
  rotStift.bewegeBis (xLa+
15, y0-stock*etagenHöhe-30);
  rotStift.zeichneKreis (
5);
  stift.bewegeBis (xLa+
15, y0-stock*etagenHöhe-30);
  stift.zeichneKreis (
5);
 }
 
 
public void lampeAus (int stock)
 {
  rotStift.radiere();
  rotStift.bewegeBis (xLa+
15, y0-stock*etagenHöhe-30);
  rotStift.zeichneKreis (
5);
  stift.bewegeBis (xLa+
15, y0-stock*etagenHöhe-30);
  stift.zeichneKreis (
5);
 }
 
 
private void zeichneAufzug (double y, boolean sichtbar)
 {
  
if (sichtbar)
   {
    blauStift.normal();
   }
   
else
   
{
    blauStift.radiere();
   }
  blauStift.bewegeBis (xLi, y);
  blauStift.zeichneRechteck (xRe-xLi+
1, etagenHöhe-10);
 }
 
 
public void zehntelHoch (double start)
 {
  
double y = y0-start*etagenHöhe-40;
  
for (int dy = 0; dy<etagenHöhe/10.0; dy++)
  {
   zeichneAufzug (y-dy,
true);
   Hilfe.warte (
20);
   zeichneAufzug (y-dy,
false);
  }
 }
 
 
public void zehntelRunter (double start)
 {
  
double y = y0-start*etagenHöhe-40;
  
for (int dy = 0; dy<etagenHöhe/10.0; dy++)
  {
   zeichneAufzug (y+dy,
true);
   Hilfe.warte (
20);
   zeichneAufzug (y+dy,
false);
  }
 }

 
public void halte (int stock)
 {
  
double y = y0-stock*etagenHöhe-40;
  zeichneAufzug (y,
true);
  stift.bewegeBis (xLi+
6, y+15); stift.schreibe ("Tür");
  Hilfe.warte (
40);
  stift.radiere(); stift.bewegeBis (xLi+
6, y+15); stift.schreibe ("Tür"); stift.normal();
 }

 
public int liesWunsch()
 {
  
int stock = -1;
  
if (taste.wurdeGedrueckt())
  {
   
char bst = taste.zeichen();
   
int nr = (int)bst - (int)'0';
   
if (nr>=0 && nr<etagenZahl)
   {
    stock = nr;
   }
  }
  
if (maus.istGedrückt())
  {
   
int x = maus.hPosition();
   
int y = maus.vPosition();
   
if (x >= xLa+10 && x <= xLa+20)
   {
    
for (int i=0; i<etagenZahl; i++)
    {
     
if (y <= y0-i*etagenHöhe-25 && y >= y0-i*etagenHöhe-35)
     {
      stock = i;
     }
    }
   }
  }
  
return (stock);
 }

}


zum Inhaltsverzeichnis (oben) / zum Seitenende

Zweite Java-Datei: „AufzugSteuerung.java" -- Bauplan für die Aufzug-Bewegung

//Teil 2/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03
public class AufzugSteuerung
{
 
final int etagenZahl = 7;
 
boolean[] gewünscht = new boolean [etagenZahl];
 AufzugGrafik aufzug =
new AufzugGrafik (etagenZahl);
 
boolean aufwärts = true;
 
int etage = 0;

 
public void steuere()
 {
  anhalten();
  
for (int i=0; i<etagenZahl; i++)
  {
   gewünscht[i] =
false;
  }
  
while (true)
  {
   erkenneWunsch();
   
while (gewünscht[etage])
   {
    anhalten();
   }
   
if (etage < höchsterWunsch() && aufwärts)
   {
    hoch();
   }
   
else
   
{
    aufwärts =
false;
   }
   
if (etage > tiefsterWunsch() && !aufwärts)
   {
    runter();
   }
   
else
   
{
    aufwärts =
true;
   }
  }
 }
 
 
private void erkenneWunsch ()
 {
  
int stock = aufzug.liesWunsch();
  
if (stock >= 0)
  {
   gewünscht[stock] =
true;
   aufzug.lampeAn (stock);
  }
 }
 
 
private void anhalten ()
 {
  
for (int i=0; i<6; i++)
  {
   aufzug.halte (etage);
   erkenneWunsch();
  }
  gewünscht[etage] =
false;
  aufzug.lampeAus (etage);
  
for (int i=0; i<6; i++)
  {
   aufzug.halte (etage);
   erkenneWunsch();
  }
 }
 
 
private void hoch ()
 {
  
for (double y=etage; y<etage+0.91; y=y+0.1)
  {
   aufzug.zehntelHoch(y);
   erkenneWunsch();
  }
  etage++;
 }
 
 
private void runter ()
 {
  
for (double y=etage; y>etage-0.91; y=y-0.1)
  {
   aufzug.zehntelRunter(y);
   erkenneWunsch();
  }
  etage--;
 }
 
 
private int höchsterWunsch ()
 {
  
for (int i=etagenZahl-1; i>=0; i--)
  {
   
if (gewünscht[i])
   {
    
return (i);
   }
  }
  
return (-1);
 }
 
 
private int tiefsterWunsch ()
 {
  
for (int i=0; i<etagenZahl; i++)
  {
   
if (gewünscht[i])
   {
    
return (i);
   }
  }
  
return (etagenZahl);
 }
}


zum Inhaltsverzeichnis (oben) / zum Seitenende

Dritte Java-Datei: „AufzugStart.java" -- Startdatei

//Teil 3/3 der Bewegung eines Aufzugs
//Java ab 1.1 -- R. Krell -- 19.5.03
class AufzugStart
{
 
public static void main(String[] s)
 {
  AufzugSteuerung lift =
new AufzugSteuerung();
  lift.steuere();
 }
}

Diese Startdatei startet den Aufzug als Application. Für den nicht mehr erlaubten Start als Applet aus einer Webseite heraus finden Sie alles Wichtige bei meinem Autorennen!


zum Inhaltsverzeichnis (oben) / zum Seitenende

Weiterführende Aufgaben

  1. Kommentieren Sie den vorstehenden Quelltext!

  2. Schreiben Sie ein Aufzugprogramm, das drei Aufzüge in drei nebeneinander verlaufenden Schächten steuert. Auf jeder Etage gibt es zwei Knöpfe: einen Aufwärtspfeil, wenn man nach oben will, und einen Abwärtspfeil, wenn man nach unten möchte. Im Aufzug gibt's die üblichen Nummern. Wird im Aufzug eine „3" gedrückt, so muss natürlich genau dieser Aufzug in der dritten Etage anhalten. Wird aber im dritten Stock der Aufwärtspfeil gedrückt, so muss irgendein Aufzug dort halten und den Fahrgast mit nach oben nehmen! Wieder soll die Aufzugsteuerung möglichst optimal verlaufen!

  3. Im Sommer und Herbst 2003 bewarb die Firma Thyssen-Krupp in Zeitungsanzeigen und Fernsehspots ihre Innovationskraft. Kinder erzählten von den Neuerungen, die ihre Eltern in der Firma entwarfen. Eine Anzeige lautete: „Der Vater von Tobias hat ein innovatives Aufzugssystem mitentwickelt. Erstmals ist es möglich, zwei Kabinen unabhängig voneinander in einem Schacht zu betreiben." Überlegen Sie, welchen Vorteil ein solches System haben könnte, und programmieren Sie es (mit einem Aufzugschacht) in Java!
    (Hinweis: Thyssen-Krupp empfiehlt das System erst in Hochhäusern mit mindestens drei parallelen Aufzugschächten. In einem Schacht muss ein einzelner Aufzug bleiben, damit man auch von ganz unten nach ganz oben fahren kann. Auf jeder Etage muss man beim Ruf schon angeben, wohin man fahren will).

  4. Vom Schüler Alessandro Conte gibt's eine optisch viel ansprechendere Fahrstuhl-Version als mein einfaches Modell - auch nur unter Benutzung der Stift&Co-Bibliothek in Java programmiert! Verwenden Sie diese Version als Anregung für eigene (grafische) Verbesserungen.


zurück zur Seite „Informatik mit Java, Teil b)"




zum Anfang dieser Seite
Willkommen/Übersicht   -   Was ist neu?   -   Software   -   Mathematik   -   Physik   -   Informatik   -   Schule: Lessing-Gymnasium und -Berufskolleg   -   Fotovoltaik   -   & mehr   -   Kontakt: e-Mail,  News-Abo, Gästebuch, Impressum   -   Grußkarten, site map, Download und Suche

Diese Seite ist Teil des Webangebots https://www.r-krell.de.