Search Home Preferences Login Help  

Zur Ordnungswirkung fundamentaler Ideen der Informatik am Beispiel der theoretischen Schulinformatik

Beispiel 3: LOGO für Arme

Eckart Modrow

Max-Planck-Gymnasium
Theaterplatz 10
37073 Göttingen
emodrow@astro.physik.uni-goettingen.de




Der Applet-Quelltext

import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class LOGOfuerArme extends Applet implements KeyListener
{
  TextField rein, raus; // erforderliche Objekte/Variable incl. Turtle
  String eingabe, ausgabe;
  Turtle t;
  int breite, hoehe;
  Image im; // gezeichnet wird im Hintergrund (double-buffering)
  Graphics bg;

  public void init() // Oberfläche erzeugen
  {
    breite = getSize().width;
    hoehe = getSize().height;
    setLayout(null);
    rein = new TextField("hier LOGO-Befehle eingeben!");
    rein.setBounds(2, hoehe - 50, breite - 10, 20);
    rein.setFont(new Font("Courier", 0, 12));
    rein.addKeyListener(this);
    add(rein);
    raus = new TextField("hier erscheinen Meldungen!");
    raus.setBounds(2, hoehe - 25, breite - 10, 20);
    raus.setFont(new Font("Courier", 0, 12));
    add(raus);
    hoehe = hoehe - 53;
    im = createImage(breite, hoehe);
    bg = im.getGraphics();
    t = new Turtle(bg, (int) Math.round(breite / 2), (int) Math.round(hoehe / 2));
    t.clear(breite-5,hoehe);
  }

  public void update(Graphics g) // alte Ergebnisse nicht löschen (muss hier nicht sein)
  {
    paint(g);
  }

  public void paint(Graphics g)
  {
    g.drawImage(im, 0, 0, this); // gespeichertes Bild anzeigen
  }

  public void keyTyped(KeyEvent e) // s.o.
  {
    if ( (int) e.getKeyChar() == 10)
    {
      werteAus(rein.getText());
    }
  }

  public void keyPressed(KeyEvent e)
  {} // brauchen wir hier nicht, müssen aber angegeben

  public void keyReleased(KeyEvent e)
  {} // werden

  private String scan(String s)
  {
    String h = "";
    for (int i = 0; i < s.length(); i++)
    {
      if (s.charAt(i) != ' ') // Leerzeichen rauswerfen
      {
        h = h + Character.toUpperCase(s.charAt(i)); // Großbuchstaben wählen
      }
    }
    rein.setText(h); // Ergebnis anzeigen …
    return h; // … und zurückgeben
  }

  private void execute(String s)
  {
    Turtleinterpreter ti = new Turtleinterpreter();
    ti.fuehreAus(s, t);
  }

  private boolean parse(String s)
  {
    Turtleparser tp = new Turtleparser(); //neuen Parser erzeugen
    char c;
    boolean fertig = false;
    String f = "";
    boolean result = false;
    while ( (s.length() > 0) && !fertig) //Zeichenkette abarbeiten
    {
      c = s.charAt(0);
      s = s.substring(1);
      tp.verarbeite(c); //Parser aufrufen
      if ( (tp.s < 10) || (tp.s == 99))
      {
        f = f + " ";
      }
      else //ein Fehler ist aufgetreten
      {
        f = f + "^ Fehler Nr." + tp.s + ": ";
        fertig = true;
      }
    }
    switch (tp.s) //Fehlermeldung erzeugen …
    {
      case 20:
      {
        f = f + "Befehl <u,d,h,c,m,t,r> erwartet!"; break;
      }
      case 21:
      {
        f = f + "<;> erwartet!"; break;
      }
      case 22:
      {
        f = f + "Ziffer erwartet!"; break;
      }
      case 23:
      {
        f = f + "Ziffer oder <;> erwartet!"; break;
      }
      case 24:
      {
        f = f + "Ziffer oder <{> erwartet!"; break;
      }
      case 25:
      {
        f = f + "Befehl oder <}> erwartet!"; break;
      }
      case 26:
      {
        f = f + "keine geschachtelten Schleifen erlaubt!"; break;
      }
      default:
        if (tp.s != 99)
        {
          f = f + "^ Fehler Nr.99: unerwartetes Ende der Eingabe!";
        }
      else
      {
        f = "ok";
      }
    }
    raus.setText(f); //… und ausgeben
    result = tp.s == 99; //Funktionsergebnis in Abhängigkeit vom erreichten Zustand festlegen
    return result;
  }

  private void werteAus(String s) // s.o.
  {
    s = scan(s);
    if (parse(s))
    {
      execute(s);
    }
    repaint();
  }
 

}

Benutzer: gast • Besitzer: schwill • Zuletzt geändert am: