disjnorm.txt - best read with emacs or UltraEdit
   Kommentar zu disjnorm.java
   Autor: Michael Kraxner
   MatNr: 9925916
   BspNr: 1154
   Beschreibung: Einlesen einer disjunktiven Normalform und ausgeben des
   dazugehörigen kv Diagramms


Inhalt:
A) Kurzbeschreibung des Programms
B) Detaillierte Beschreibung
Anhang C) Spezifikation 1154 im txt Format mit($..)-Links

A) Kurzbeschreibung des Programms:
==================================
 Dieses Programm liest eine disjunktive Normalform als String ein, berechnet
 das dazugehörige KV - Diagramm und gibt dieses aus.
 Das KV - Diagramm ist eine 4x4 Felder große Tabelle, in der jede Zelle
 eine Vollkonjunktion repräsentiert.



B) Detaillierte Beschreibung
============================
  Ausdrücke wie "$[Zahl]" dienen als Verweise zwischen Spezifikation im Anhang und
  Beschreibung bzw. Quelltext (disjnorm.java).
  Sie signalisieren, dass ein bestimmter Wert in der Spezifikation festgelegt wurde bzw.
  ein Codefragment eine Anforderungen daraus implementiert.
 
  Vorbereitungen:
  ---------------
     Das Ergebniss der Berechnung - eine 4x4 große Tabelle, in der jede Zelle eine
  Vollkonjunktion repräsentiert ("wahr"/"falsch"), wird in der Variable <kvDiagramm>
  abgespeichert.
  Zu Beginn wird diese mit "falsch" Werten vorbelegt.
 
  Wenn ein Fehler im Eingabestring bemerkt wird, merken wir uns das in <istFehler> - zu
  Beginn ist noch alles in Ordnung (<istFehler>="falsch")

  Auswerten des EingabeStrings:
  ----------------------------
     Das Programm wertet nun den Eingabestring Wort für Wort aus, bis es auf
  <AusruckEndeStr> stößt.

  Ist noch kein Fehler aufgetreten, wird das Eingabewort weiter ausgewertet:
      
        Dabei vergleicht es jedes Wort mit <SymbolOrder>, um die richtige Anzahl, Reihenfolge und
     Art der Zeichen zu überprüfen. (Ist ein Fehler aufgetreten, merken wir uns das in <istFehler>)
    
     Dann wird die Position der Vollkonjunktion (die durch ein Wort bestimmt ist) ermittelt:
  
        Spalten- und Zeilenposition einer Zelle werden durch jeweils 2 boolsche Werte
     (Spalte laut Spezifikation durch d/D und c/C, Zeile durch b/B und a/A) festgelegt.
     Dabei repräsentieren Großbuchstaben den logischen Wert "wahr", Kleinbuchstaben "falsch"
     Nach Einlesen jeweils einen Wertes (a/A bzw. c/C) muß noch die Auswahl zwischen
     zwei möglichen Zeilen/Spalten getroffen werden.
     Dies geschieht mittels Bedingungen(if-else Konstrukte), wodurch der Vorgang leicht
     nachvollziehbar und deshalb gut wartbar ist.
        So sind später etwaige Änderungen im Layout des KV-Diagramms schnell zu vollziehen.
    
     Bevor dieses Teilergebnis in der Tabelle <kvDiagram> durch belegen der Zelle mit "wahr"
     gespeichert wird, kontrollieren wir, ob dies verbotenerweise(!) nicht schon geschehen ist.
     (Ist ein Fehler aufgetreten, merken wir uns das in <istFehler>)
     (So wäre es auch möglich eine schöne Fehlermeldung - "Tupel WXYZ doppelt angegeben" -
     auszugeben)
 
  <AusdruckEndeStr> wurde gelesen =>
 
  Ausgabe des Ergebnis:
  ---------------------
  Falls ein Fehler im Eingabestring gefunden wurde, geben wir <AusdruckFehlerStr> aus, sonst
  das KV-Diagramm, wobei wir für mit "wahr" markierte Zellen <kvTrueStr>, mit "falsch"
  markierte Zellen <kvFalseStr> ausgeben und zwischen den Zeilen des KV-Diagramms ein
  <kvDiagramRowSep> einfügen.
  Abschließend noch einen Zeilenvorschub.
  
  Warum soviele Konstanten?
     Genau, damit es leicht an Änderungen angepasst werden kann.

     Konstanten zur Auswertung des Eingabestrings:
       AusdruckEndeStr:
             Zeichenfolge, die das Ende des Eingabestrings kennzeichnet ($1)
             ("=")
       SymbolOrder:
             bestimmt das Format der einzelnen Eingabewörter(Quadrupel) ($3)
             (Das Eingabewort wird vor dem Vergleich mit SymbolOrder in Grossbuchstaben umgewandelt)
             ("ABCD")
        
     Konstanten für die Ausgabe des KV-Diagramms:
       kvTrueStr, kvFalseStr:
             Symbole, die bei Ausgabe des KV-Diagramms den logischen Wert einer Zelle ($5)  darstellen
             ("1","0")
       kvDiagramRowSep: 
             Trennzeichen für die einzelnen Zeilen ($6)
             (" ")

     AusdruckFehlerStr:
             Meldung, die bei fehlerhaften Eingabe ausgegeben wird ($2) 
             ("FALSCHE EINGABE")
    
    
Anhang C)
========

Spezifikation (HTML-Konvertierung):
-----------------------------------
Eine bool'sche Funktion in disjunktiver Normalform wird eingelesen; das entsprechende Karnaugh-Veitsch-Diagramm wird
ausgegeben.
Lesen Sie eine bool'sche Funktion in der disjunktiven Normalform ein.
  Eine disjunktive Normalform besteht aus Diskunktionen von Vollkunjunktionen. (Siehe auch Einführung in die Informatik!)
Dazu wird folgende Notation verwendet: Es gibt genau vier Eingabevariablen, nämlich A,B,C und D.($1)
Diese werden immer in dieser Reihenfolge angegeben; es müssen immer alle vier Variablen vorkommen.
Negierte Variablen werden klein geschrieben; es werden keine Operatoren angegeben.
Jede Vollkonjunktion wird in einem eigenen String eingelesen.
Am Ende des Ausdrucks wird ein "=" geschrieben.  ($2)


Für diesen Ausdruck soll Ihr Programm eine Karnaugh-Veitch-Tabelle mit folgender Variablenanornung erstellen:
   c C C c
 a 0 0 0 0 b
 A 1 0 0 0 b
 A 0 0 0 0 B
 a 1 0 1 0 B
   D D d d

Verwenden Sie die Zeichen "0" und "1" zum Beschreiben der logischen Zustände "falsch" und "wahr".

Eingabedaten:
Lesen Sie die Strings ein, die zusammen die disjunktive Normalform darstellen.
Diese Strings müssen jeweils 4 Zeichen lang sein und die Buchstaben A, B, C, und D in genau ($1)
dieser Reihenfolge beinhalten (wobei es wie gesagt bedeutsam ist, ob die Buchstaben groß oder klein geschrieben werden).
Es dürfen keine zwei gleichen Strings eingegeben werden ($2). Das Ende des Datensatzes wird durch das Zeichen "="
markiert($3).

Ausgabedaten:
Bei korrekten Eingabesätzen soll Ihr Programm die vier Zeilen des Karnaugh-Veitch-Diagramms ausgeben,
also vier Strings zu je vier Zeichen(4$), wobei nur die Zeichen "0" und "1" ($5)vorkommen
(der "Rahmen" der Tabelle 'cCCc' etc. in der oberen Darstellung dient nur zur Erläuterung und soll in der Ausgabe nicht
aufscheinen).
Trennen Sie die vier Strings durch jeweils ein Leerzeichen ($6) und geben Sie am Ende einen Zeilenvorschub ($7) aus.

Fehlerbehandlung:
Sämtliche Eingabedatensätze sind immer bis zum definierten Endezeichen($8) einzulesen.
Generell wird bei fehlerhaften Eingabedatensätzen nur eine einzige Fehlermeldung erzeugt,
weitere Berechnungen werden nicht mehr durchgeführt. ($9)
Sind die Datentypen bei allen Eingaben richtig, die eingegebenen Daten aber inhaltlich nicht korrekt oder
erfüllen nicht die Bedingungen, so soll Ihr Programm "FALSCHE EINGABE"($10), gefolgt von einem Zeilenvorschub($11),
ausgeben.