// EPROG Runde 1: Bsp. 1154 (schwer) // Autor: Michael Zöch // MatrNr: 0305116 // E-mail: kongo@gmx.at // HP: www.8ung.at/kongo // Kurzbeschreibung: // Das Programm liest eine boolsche Funktion in disjunktiver Normalform ein und gibt das // entsprechende Karnaugh-Veitch-Diagramm aus. Eine disjunktive Normalform besteht aus // Disjunktionen von Vollkunjunktionen. Jede Vollkunjunktion wird mit den Buchstaben // "ABCD" angegeben, wobei: // _ _ _ _ // (AnBnCnD)v(AnBnCnD)v... durch AbcD aBcD ... dargestellt wird. // // Am Ende muss ein "=" als eigener String angegeben werden, um das KV-Diagramm auszugeben // und das Programm zu beenden. import eprog.*; public class Disjnorm extends EprogIO { // Konstanten static final String IN_ENDZEICHEN = "="; // Das Endzeichen static final String IN_UPPERCASE = "ABCD"; // Der Eingabestring (in Upper Case) static final String OUT_1 = "1"; // Ausgabezeichen, wenn die entsprechende Vollkunjunktion eingegeben wurde static final String OUT_0 = "0"; // Ausgabezeichen, wenn die entsprechende Vollkunjunktion nicht eingegeben wurde static final String OUT_TRENNZEICHEN = " "; // Das Trennzeichen bei der Ausgabe static final String OUT_ERROR_MESSAGE = "FALSCHE EINGABE"; // Die Fehlermeldung static boolean kvdiag[][] = new boolean[4][4]; // Ein 4x4 Diagramm (das KV-Diagramm) // Verarbeitet jede Eingabe (Vollkunjunktion) des Benutzers zu einem KV-Diagramm Eintrag static boolean toKV(String in) { int row=-1, col=-1; // Reihe, Spalte des KV-Diagramm // Die ersten beiden Charakter ergeben die Reihe if (in.charAt(0) == IN_UPPERCASE.charAt(0)) { if (in.charAt(1) == IN_UPPERCASE.charAt(1)) row = 2; // Beide groß geschrieben, zb. "AB" else row = 1; // Erster groß geschrieben, zb. "Ab" } else { if (in.charAt(1) == IN_UPPERCASE.charAt(1)) row = 3; // Zweiter groß geschrieben, zb. "aB" else row = 0; // Beide klein geschrieben, zb. "ab" } // Der 3. und der 4. Charakter ergeben die Spalte if (in.charAt(2) == IN_UPPERCASE.charAt(2)) { if (in.charAt(3) == IN_UPPERCASE.charAt(3)) col = 1; // beide groß geschrieben, zb. "CD" else col = 2; // Dritter groß geschrieben, zb. "Cd" } else { if (in.charAt(3) == IN_UPPERCASE.charAt(3)) col = 0; // Vierter groß geschrieben, zb. "cD" else col = 3; // Beide klein geschrieben, zb. "cd" } // Sollte der Diagrammeintrag schon einmal vorgekommen sein: Fehler -> gib false zurück if (kvdiag[row][col] == true) return false; // Ansonsten setze den Diagrammeintrag auf true kvdiag[row][col] = true; return true; } public static void main(String[] args) { String input = ""; // Eingabe des Benutzers boolean err = false; // true wenn Fehler in Eingabe do { // Eingaben lesen bis Benutzer "=" eingibt input = readWord(); if (input.equals(IN_ENDZEICHEN)) break; // Fehler schon aufgetreten, nur mehr auf Eingabe von Endzeichen warten if (err) continue; // Prüfen ob Input gleich "ABCD" ist (keine Prüfung der Groß/Kleinschreibung) // wenn nicht -> Fehler if (!input.equalsIgnoreCase(IN_UPPERCASE)) { err = true; continue; } // Sollte noch kein Fehler aufgetreten sein // Eingabe in das KV-Diagramm übertragen // Wurde diese Vollkonjunktion schon einmal eingegeben, liefert die Funktion false zurück if (toKV(input) == false) err = true; } while(true); if (err) { // Fehler -> Fehlermeldung ausgeben println(OUT_ERROR_MESSAGE); } else { // Kein Fehler -> KV-Diagramm ausgeben for (int i = 0; i < 16; i++) { // Zwischen den Reihen ein Trennzeichen einfügen, aber nicht ganz am Anfang if (i != 0 && i%4 == 0) print(OUT_TRENNZEICHEN); // Ist der Diagrammeintrag auf true gesetzt: gibt OUT_1 aus, ansonsten OUT_2 print(kvdiag[i/4][i%4]==true ? OUT_1 : OUT_0); } println(); } } // void main } // class Disjnorm