Dokumentation zu notcheck.java Autor: Florian Bauer e-Mail: flobauer@gmx.at 1.) Aufgabenstellung: Das Programm soll 2 Strings einlesen, wobei der Erste Musiknoten enthält (#=Halbton) und der Zweite die Tonart. Das Programm soll ueberpruefen, ob die angegeben Noten in der angegeben Tonart enthalten sind. Wenn nicht, werden die nichtenthaltenen Noten in () gesetzt. Aneineanderliegende Klammern sollen durch eine einzige ersetzt werden (zB: c(d)(e) soll c(de) sein). 2.) Loesungsweg: *) Einen String mit allen Toenen der chormatischen Tonleiter erzeugen. Der String chromTonl sieht wie folgt aus: ( c (c #) d (d #) e f (f #) g (g #) a (a #) h ) tonindex: 0 1-2 3 4-5 6 7 8-9 10 11-12 13 14-15 16 ==> bei 1,4,8,11,14 befindet sich ein Halbton *) Variablendeklaration (siehe 3.) *) ueberpruefen der maximallaenge des ersten Strings lt. Spezifikation *) ueberpruefen ob nur Noten im Eingabestring verwendet wurden, die auch in der chromatischen Tonleiter vorhanden sind: 2 Schritte: 1.) "zerlegen" des Eingabestrings in lauter einzelne kleine Strings mit jeweils der Note oder Note+"#" (note1-..) 2.) ueberpruefen ob die einzlenen Strings in der chrom.Tonleiter enthalten sind (mithilfe von .indexOF, dieses liefert den Wert -1, wenn ein Ton nicht in der chrom.Tonl. enthalten ist *) ueberprufung ob die eingelesen Tonart auch wirklich eine Tonart ist (s.o.) *) Falls bis hierher keine Fehler aufgetreten sind wird ein String erzeugt, der alle Noten enthaelt, die die angegeben Tonart enthaelt. Dabei wird zuerst der index des Starttons herausgefunden (zB:Startton bei d-moll = d, Index in der cormTonl. von d = 3, s.o.) Danach wird der neue String erzeugt unter zuhilfenahme der Formel der Notenabstaende (welche immer auf den Startton anzuwenden sind) zB.: Bei c-Dur: "cdefgah"; bei e-moll:"ef#gahcd" Dazu werden 7 Strings(noteneu1-7) in der for-Schleife erzeugt, welche die einzelnen vorhandenen Noten enthalten If-else Schleife fuer die Unterscheidung -Dur oder -moll!!! Die Erhoehung des Tonindex erfolgt dabei immer nach den erforderlichen Abstaenden, welche aus den Abstaenden der Notenindizes und den erforderlichen Notenabstaenden lt. Formel resultiert: Bsp: d-Dur: Startton=d, Notenbstaende bei Dur: 2,2,1,2,2,2,1 ( c (c #) d (d #) e f (f #) g (g #) a (a #) h ) tonindex: 0 1-2 3 4-5 6 7 8-9 10 11-12 13 14-15 16 Startton d +Notenabstand:2 -------> e (=>Indexerhoehung: +3) +Notenabstand:2 ------>(f#) (=>Indexerhoehung +2) AUSNAHME (*) +Notenabstand:1 -->g (=>Indexerhoehung:+2) +Notenabstand:2 ---------->a (=>Indexerhoehung: +3) ...... usw. (*) Ausnahmen gibt es an den Indizes 6 und 16, da zu "e" und "h" keine Halbtoene vorhanden sind, daher reduziert sich der Indexsprung um -1 *) Vergleich der angegebenen Noten mit der neu erzeugten Tonart Hier wird ein Vergleich der eingegebenen Noten mit dem NotenString der neu erzeugten Tonart durchgefuehrt,um herauszufinden, welche der eingegebenen Noten enthalten sind und welche nicht. Die nichtenthaltenen Noten muessen laut Spez. in () gesetzt werden. *) Aneinanderliegende Klammern suchen und ersetzen: (lt. Spezifikation) Bsp: "cd(f)(g)h" soll in der Ausgabe als "cd(fg)h" ausgegeben werden 1.) Temporaeren String erzeugen, der die einzelnen Notenstrings enthaelt (die nichtenthaltenen Noten sind schon mit () versehen, siehe oben) 2.) ")(" im String erkennen und "wegschneiden" *) Ausgabe im Shell ----- 3.) Variablendeklaration Strings: *Chrom. Tonleiter : Variable: chromTonl Inhalt: (c,c#,d,d#,e,f,f#,g,g#,a,a#,h) woher?: feste Vorgabe *Eingelesene Noten: Name: eing_noten Inhalt: Werte aus chromTonl woher?: Benutzereingabe ( readWord() ) *Tonart: Name: tonart Inhalt: c-Dur, c#-Dur, d-Dur, d#-Dur, e-Dur, f-Dur, f#-Dur, g-Dur, g#-Dur, a-Dur, a#-Dur, h-Dur c-moll, c#-moll, d-moll, d#-moll, e-moll, f-moll, f#-moll g-moll, g#-moll, a-moll, a#-moll, h-moll woher?:Benutzereingabe *Anfangsnote der Tonart: Name: startton Inhalt: Anfangsnote der Tonart (zB: d-Dur = d, f#-moll= f#, ...) woher?: von String tonart (char0,ev1) *Noten der neuen Tonart: Name: noten_neu Inhalt: Alle Noten, die in der ausgewaehlten Tonart verfuegbar sind woher?: Kombination von chromTonl mit der Ausgewaehlten Tonart Formel: Abstand der vorhandenen Noten : Dur: 2,2,1,2,2,2,1 moll: 2,1,2,2,1,2,2 c,c#,d,d#,e,f,f#,g,g#,a,a#,h 1 1 1 1 1 1 1 1 1 1 1 ------------------------------ Dur: c d e f g a h 2 2 1 2 2 2 1 -------------------------------- moll: c d d# f g g# a# 2 1 2 2 1 2 2 -------------------------------- *Temporärer String vor der Ausgabe: Name: ausga_temp Inhalt: Ist die Zusammensetzung der einzelenen Noten Strings nach der Ueberpruefung ob sie in der Tonart enthalten sind oder nicht, daher sind sie schon mit () versehen, falls nicht enthalten. warum?: letzte Stufe vor der Ausgabe, aneineanderliegende )( werden erkannt und noch entfernt bevor der Ausgabestring erzeugt wird *Ausgabestring: Name: ausg_noten Inhalt: Ausgabestring. Entahltene Noten + nichtenthaltene Noten in () woher?: vergleich eing_noten mit notenneu. Achtung: hintereinanderfolgende () () ersetzen durch ( ) Integers: *final int maxzeichen = 30 //Maximale Anzahl an zulaessigen Zeichen in eing_noten *int i ... fuer charAt auslesen *int length .. laenge des Strings eing_noten *int j ... fuer Ueberpruefung ob nur zulaessige Noten verwendet wurden *int tonindex ... Index an der Stelle an der der erste Ton der Tonleiter steht. Fehlerbehandlung: *spez_err ... boolean ... Fuer >30 Zeichen, falsche Noten, falsche Tonart Verwendete Methoden von String: *.charAt() *.indexOf() Bei Fragen: flobauer@gmx.at ---Ende--- 3||tonindex==16)