/****************************************/ /** EPROG Runde 1: Bsp. 1148 (mittel) **/ /** Programmierer: Michael Zöch **/ /** Matrikelnummer: 0305116 **/ /** E-mail: kongo@gmx.at **/ /** HP: www.8ung.at/kongo/index.html **/ /****************************************/ import java.util.*; import eprog.*; public class Notcheck extends EprogIO { // Konstanten static final char KREUZ = '#'; // Zeichen für einen Halbtonschritt weiter static final String CHROMTL = "c c# d d# e f f# g g# a a# h"; // chromatische Tonleiter static final String[] TON = {"c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h"}; // mögliche Töne static final String[] TONARTEN = {"Dur", "moll"}; // mögliche Tonarten static final int IND_DUR = 0; // Index für TONARTEN static final int IND_MOLL = 1; // Index für TONARTEN static final int[] DURINDEX = {2,2,1,2,2,2,1}; // Indexliste in TON für Dur-Tonart static final int[] MOLLINDEX = {2,1,2,2,1,2,2}; // Indexliste in TON für Moll-Tonart static final char TRENNZEICHEN = '-'; // Trennzeichen bei "Note-Tonart" static final int MAXLENGTH_NOTEN = 30; // maximale Länge des Notenstrings public static void main(String[] args) { String tonart = "", tonartnote = ""; // zweiter Eingabe-String: "Note-Tonart" ArrayList vecnoten = new ArrayList(); // Ein Array der Eingabe-Töne boolean err = true; // true wenn Fehler in Eingabe int i = 0; // Index Variable für Schleifen // do-while Schleife die bei Fehler sofort verlassen wird // dadurch wird err nur einmal überprüft loop_check: do { String noten = ""; // erster Eingabe-String (die Noten) String checknote = ""; // eine einzelne Note int posTrennzeichen; // Position des Trennzeichens in "Note-Tonart" // Noten einlesen und Länge prüfen noten = readWord(); if (noten.length() > MAXLENGTH_NOTEN) break; // FEHLER // jede Note überprüfen und wenn in chromTl dann als eigener String in vecnoten speichern final int notenlength = noten.length(); noten += " "; // um OutOfBounds-Exception zu verhindern ( bei Zugriff noten.charAt(i+1) ) do { // einzelne Note in checknote speichern, zb. "c" oder "c#" if (noten.charAt(i+1) == KREUZ) { checknote = noten.substring(i,i+2); i += 2; } else { checknote = noten.substring(i,i+1); i++; } // checknote prüfen, ob in chromatischer Tonleiter if (checknote.charAt(0) != KREUZ && CHROMTL.indexOf(checknote) != -1) vecnoten.add(checknote); else break loop_check; // FEHLER } while (i < notenlength); // Noten sind korrekt // jetzt Tonart einlesen tonart = readWord(); posTrennzeichen = tonart.indexOf(TRENNZEICHEN); if (posTrennzeichen <= 0) break; // Note und Tonart in eigenen String schreiben tonartnote = tonart.substring(0,posTrennzeichen); tonart = tonart.substring(posTrennzeichen+1); // prüfen ob Note in chromatischer Tonleiter if (tonartnote.charAt(0) == KREUZ || CHROMTL.indexOf(tonartnote) == -1) break; // prüfen of richtige Tonart /*for (i = 0; i < TONARTEN.length; i++) { if (tonart.equals(TONARTEN[i])) { break; } } if (i == TONARTEN.length) break;*/ if (!tonart.equals(TONARTEN[0]) && !tonart.equals(TONARTEN[1])) break; // wenn hier angelangt gab es keinen Fehler im Einlesen der Noten & Tonart err = false; } while (false); if (err) { println("FALSCHE EINGABE"); return; } // Ausgabe ermitteln int[] indexes; // Indexes für Dur/moll int noten_offset, noten_add; // Zur Berechnung der Noten String tonartnoten = ""; // die möglichen Töne der eingegebenen Tonart if (tonart.equals(TONARTEN[IND_DUR])) { // Tonart ist Dur -> Array mit Dur-Indexes indexes = DURINDEX; } else { // Tonart ist moll -> Array mit moll-Indexes indexes = MOLLINDEX; } // die erste Note der Tonart bestimmten und darauf ein Offset in das Array TON speichern noten_offset = -1; do { noten_offset++; } while (tonartnote.equals(TON[noten_offset]) == false); // erlaubte Töne ermitteln noten_add = 0; for (i=0; i < 7; i++) { tonartnoten += TON[(noten_offset+noten_add) % TON.length] + " "; noten_add += indexes[i]; } // Ausgabe boolean klammer = false; // wurde eine Klammer geöffnet String output = ""; // Ausgabestring for (i=0; i < vecnoten.size(); i++) { if (tonartnoten.indexOf((String)vecnoten.get(i)) != -1){ // Ton kommt in Tonart vor if (klammer) { // Klammer schließen output += ")"; klammer = false; } output += (String)vecnoten.get(i); } else { // Ton kommt nicht in Tonart vor if (!klammer) { // Klammer öffnen output += "("; klammer = true; } output += (String)vecnoten.get(i); } } // eine geöffnete Klammer wieder schließen if (klammer) output += ")"; println(); println(tonartnote+"-"+tonart); println("Tonart-Noten: " + tonartnoten); println("Ausgabe: " + output); } // void main } // public Notcheck