/********************************** * verändert in der 2. Runde von * * Peter Greiner * * MatNr 0101750 * * email greiner.peter@aon.at * ********************************** * Autorin: Janna Rapf * Matr.nr.: 9700580 * E-Mail: janna.r@gmx.at * Bsp.nr.: 1138 * Beschreibung: Silbentrennung */ import eprog.*; import String.*; import StringBuffer.*; public class testen { static String Vokale = "aeiou"; // für Buchstabenvergleich auf Vokal public static String perform() { String WortListe = null, // Eingabestring, der zu trennende Wörter enthält output = ""; // Ausgabestring StringBuffer SilbeNeu = new StringBuffer(), // vorige Silbe, wird später ausgegeben SilbeAlt = new StringBuffer(); // aktuelle Silbe WortListe = EprogIO.readWord(); // gesamte Wortliste einlesen, bis zum 1. Leerzeichen oder EOF if ( (WortListe == null) || (!(IstWortListeGueltig(WortListe)) ) ) { return "FALSCHE EINGABE\n"; } int indexListe = 0, laengeWortListe = WortListe.length(); // damit keine Endlosschleife entsteht char BuchstabeListe = ' ', BuchstabeListeAlt = ' ', Trennzeichen = ';', SilbenTrenner = '-'; boolean flagNaechsteSilbe = false, // Silbe trennen? flagDual = false; // wenn Dual ("ei", "ie") vorkommt while (indexListe < laengeWortListe) { // nächsten Buchstaben aus der Wortliste holen // für Verarbeitung Kleinbuchstaben verwenden (nicht case-sensitiv) BuchstabeListeAlt = BuchstabeListe; // vorigen Buchstaben merken BuchstabeListe = Character.toLowerCase(WortListe.charAt(indexListe)); if (BuchstabeListe != Trennzeichen) { SilbeNeu.append(WortListe.charAt(indexListe)); } if (SilbeNeu.length() > 1) { // Silbe trennen? // ist der Buchstabe ein Vokal? (d.h. er kommt im String Vokale vor) if (Vokale.indexOf(BuchstabeListe) > -1) { // ei und ie dürfen nicht getrennt werden if (indexListe < laengeWortListe - 1) { // existiert nächster Buchstabe? char naechster_buchstabe = WortListe.charAt(indexListe + 1); if ( ((BuchstabeListe == 'e') && (naechster_buchstabe == 'i')) || ((BuchstabeListe == 'i') && (naechster_buchstabe == 'e')) ) { flagNaechsteSilbe = false; flagDual = true; } else { // auf zur nächsten Silbe! flagNaechsteSilbe = true; } } // ei und ie dürfen nicht getrennt werden } else { // d.h. Buchstabe ist ein Konsonant // voriger Buchstabe auch Konsonant? if (Vokale.indexOf(BuchstabeListeAlt) < 0) { // ja // an alte Silbe dranhängen, wenn vorhanden if (SilbeAlt.length() > 0) { // nach der 1. Silbe? SilbeAlt.append(SilbeNeu.charAt(0)); // 1. Buchstaben zur alten Silbe SilbeNeu.deleteCharAt(0); // von neuer Silbe abtrennen } flagNaechsteSilbe = false; // Silbe noch nicht trennen } else { // Silbe trennen wenn nur 1 Konsonant flagNaechsteSilbe = true; } } } // letzter Buchstabe? if ((BuchstabeListe == Trennzeichen) || (indexListe == laengeWortListe - 1)) { // letzte Silbe ausgeben flagNaechsteSilbe = true; // letzte Silbe nur 1 Buchstabe? if (SilbeNeu.length() == 1) { SilbeAlt.append(SilbeNeu.charAt(0)); BuchstabeListeAlt = ' '; flagNaechsteSilbe = false; } } if (flagNaechsteSilbe) { // falls > 1. Silbe if (SilbeAlt.length() > 0) { output += SilbeAlt; // alte Silbe ist abgeschlossen und kann ausgegeben werden if ((SilbeNeu.length() > 1) && (BuchstabeListe != Trennzeichen)) { output += "-"; // innerhalb des Wortes Trenner ausgeben } } // aktuelle Silbe merken (in alte Silbe kopieren) SilbeAlt = new StringBuffer(SilbeNeu.toString()); SilbeNeu.setLength(0); // initialisieren für neue Silbe BuchstabeListeAlt = ' '; flagNaechsteSilbe = false; } // Wortende? (d.h. Trennzeichen oder Ende der Eingabe) if ((BuchstabeListe == Trennzeichen) || (indexListe == laengeWortListe-1)) { output += SilbeAlt; // letzte Silbe ausgeben if (BuchstabeListe == Trennzeichen) { // Trennzeichen nur ausgeben, wenn in Eingabe vorhanden output += ";"; //TODO allg. Konstante "Trennzeichen" statt ";" verwenden } // neues Wort -> Silben löschen SilbeAlt.setLength(0); SilbeNeu.setLength(0); } indexListe++; // nächster Buchstabe } // while return output; } // String perform() public static boolean IstWortListeGueltig(String woerter) { boolean flagGueltig = true, flagVokal = false; char buchstabe; int index = 0, buchstaben_vorkommnis = 1, wortlaenge = 0, wortzaehler = 0, laengeWoerter = woerter.length(); while (flagGueltig && (index < laengeWoerter) ) { buchstabe = Character.toLowerCase(woerter.charAt(index)); if (buchstabe != ';') { wortlaenge++; } // Wort zu lang/zu kurz? if (wortlaenge > 20) { flagGueltig = false; break; } // Strichpunkt oder gültiger Buchstabe? // (alles außer Sonderzeichen, Ziffern, deutsche Umlaute etc.) if ((buchstabe != ';' ) && (!((buchstabe >= 'a') && (buchstabe <= 'z'))) ) { flagGueltig = false; break; } // Vokal? (Wort muss mind. 1 Vokal enthalten) if (Vokale.indexOf(buchstabe) > -1) { flagVokal = true; } if ( (buchstabe == ';') || (index + 1 == laengeWoerter) ) { wortzaehler++; if ( (wortzaehler > 5) || (wortlaenge < 1) ) { // nach Spez., besser wäre <2 flagGueltig = false; break; } // kam mind. 1 Vokal im Wort vor? if (!flagVokal) { // nein flagGueltig = false; break; } // Zähler für nächstes Wort zurücksetzen wortlaenge = 0; buchstaben_vorkommnis = 1; flagVokal = false; index++; // mit nächstem Zeichen fortsetzen (";" im Wort nicht erlaubt) continue; } // mehr als 3 gleiche Buchstaben hintereinander? if (index + 1 < laengeWoerter) { if (buchstabe == woerter.charAt(index + 1)) { //charAt gibt Buchstabe zurück buchstaben_vorkommnis++; if (buchstaben_vorkommnis > 3) { flagGueltig = false; break; } } else { buchstaben_vorkommnis = 1; } } index++; } // while return flagGueltig; } // boolean IstWortListeGueltig }