4103/0040777000113000011500000000000010166517273011004 5ustar prippripeadm4103/polynom.html0100666000113000011500000001703110166517273013366 0ustar prippripeadm EPROG-LU - Aufgabe 4103 (Polynome)
4103 polynom Polynome
Kategorie:Mathematik
Klasse:mittel
Eingabe:Siehe Spezifikation
Ausgabe:Siehe Spezifikation
Abzugebende Files: polynom.txt, Main.java, polynom/*.java , 10489.txt, 10998.txt

Kurzbeschreibung:

Schreiben Sie eine Klasse Polynom die mathematische Polynome mit einer Variablen darstellen kann. Außerdem sollen Methoden für grundlegende Rechenarten zur Verfügung gestellt werden.

Allgemeine Hinweise:

Aufgabenstellung:

Ein String, der die Koeffizienten eines Polynoms (mathematische Ausdrücke der Form a0 + a1*x + a2*x^2 + a3*x^3 +... + an*x^n) enthält soll eingelesen werden.

Implementieren Sie die Operation Polynom add(Polynom a), welche 2 Polynome addiert. Desweiteren werden auch die Operation Polynom mul(Polynom a) fü die Multplikation und Polynom sub(Polynom a) benötigt.

Schreiben Sie eine Routine welche zwei Polynome miteinander vergleicht. Die Ordnung zweier Polynome sei definiert durch a<b gdw. Grad(a)<Grad(b). Desweitern gilt a=b gdw. Grad(a)=Grad(b) sowie a>b gdw. Grad(a)>Grad(b).

Eingabedaten:

Lesen Sie einen String ein, der aus folgenden Zeichen bestehen darf: Ziffern, den Klammerzeichen "()", Operatoren "-+*<>=", dem negativen Vorzeichen "-", sowie Komma zum Trennen der einzelnen Koeffizienten.

Dieser String muß einen gültigen mathematischen Term (z.B. Klammersetzung) enthalten und darf nur einen Operator enthalten.

Die Koeffizienten werden dabei in der Reihenfolge (a0,a1,...,an) sind durch Kommas voneinander getrennt. Weiters gilt für alle Koeffizienten daß sie vom Typ short sein müssen, für fehlende Koeffizienten wird in den Eingabedatensätzen eine "0" angegeben. Es muß zumindest ein Koeffizient ungleich 0 in jedem Polynom eingelesen werden.

Ausgabedaten:

Bei korrekten Eingabesätzen soll Ihr Programm das Resultat einer Berechnungen der Form a0+a1x+a2x^2+a3x^3,...,anx^n ausgeben. Koeffizienten, welche den Wert 0 haben werden bei der Ausgabe nicht berücksichtigt.

Falls als Ergebnis ein Nullpolynom vorliegt (Polynom 0-ten Grades mit Koeffizient=0), so geben Sie 0 aus.

Bei Vergleichsoperatoren geben Sie das entweder "TRUE" oder "FALSE" aus.

Schließen Sie die Ausgabe mit einem Zeilenvorschub ab.

Fehlerbehandlung:

Generell wird bei fehlerhaften Eingabedatensätzen nur eine einzige Fehlermeldung erzeugt, weitere Berechnungen werden nicht mehr durchgeführt.

Enthält der Eingabedatensatz einen ungültigen numerischen Datentyp, so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub, ausgegeben werden.

Wenn dann der Eingabestring nicht den Bedingungen genügt, so soll Ihr Programm die Fehlermeldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Beispiele:

Eingabedaten
(1,0,-4,1)>(0,2,2)

(3,1,-4,2)*(-1,2,1)

Ausgabedaten
TRUE

-3+5x+9x^2-9x^3+2x^5


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Main < polynom.i1 > polynom.out1

Das erzeugte File polynom.out1 können Sie dann mit dem mitgelieferten Outputfile polynom.o1 vergleichen. 4103/polynom.i10100664000113000011500000000002310166517273012722 0ustar prippripeadm(1,0,-4,1)>(0,2,2) 4103/polynom.o10100664000113000011500000000000510166517273012730 0ustar prippripeadmTRUE 4103/polynom.i20100664000113000011500000000002410166517273012724 0ustar prippripeadm(3,1,-4,2)*(-1,2,1) 4103/polynom.o20100664000113000011500000000002510166517273012733 0ustar prippripeadm-3+5x+9x^2-9x^3+2x^5 4103/10489/0040777000113000011500000000000010166517273011471 5ustar prippripeadm4103/10489/Anzeige.java0100444000113000011500000001625210166517273013713 0ustar prippripeadm/* * Stefan Ralisch * Matrikelnummer: 0407039 * Programm 3126 - 7 Segment LED Anzeige */ import eprog.*; public class Anzeige { /* * Die Funktion getTag bestimmt anhand des Datums den entsprechenden Wochentag. * Dazu wird eine Formel verwendet, die den Wochentag des 1.1 des entsprechenden * Jahres liefert (0 fr Sonntag - 6 fr Samstag). Dieser wird dann als return-Wert * zurckgeliefert. */ public static int getTag(int Tag, int Monat, int Jahr) { int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; if (Jahr < 100) { // Da 2-stellige Jahresangaben im 20. Jahrhundert angesiedelt Jahr=Jahr+1900; // sein solln, wird im entsprechenden Fall 1900 zur Jahreszahl addiert. } double temp = 0; temp = ( (Jahr + Math.floor((Jahr-1)/4) - Math.floor((Jahr-1)/100) + Math.floor((Jahr-1)/400)) ); int t11 = (int) temp; t11=t11 % 7; // Diese Formel liefert den Wochentag des 1.1 des Jahres int anzahl = 0; for (int i=0; i 2) anzahl++; anzahl=anzahl+Tag-1; anzahl=anzahl % 7; return (t11+anzahl) % 7; } /* * Die Funktion checkdate prft die Eingabedaten auf Korrektheit (z.b. kein 30. Februar). */ public static boolean checkdate(int Tag, int Monat, int Jahr) { if (Monat<1 || Monat>12) return false; if ((Monat==4) || (Monat==6) || (Monat==9) || (Monat==11)) if (Tag>30) return false; if (Tag>31) return false; if ((Tag==0) || (Monat==0)) return false; if (Monat == 2) { if ((Jahr % 4) == 0) { if (Tag>29) // Falls ein Schaltjahr return false; } else if (Tag>28) // Wenn kein Schaltjahr return false; } return true; } /* * Checktime berprft die Korrektheit der eingegebenen Uhrzeit. */ public static boolean checktime(int Stunde10, int Stunde1, int Minute10, int Minute1) { if (((10*Stunde10) + Stunde1) > 23) { return false; } if (((10*Minute10) + Minute1) > 59) { return false; } return true; } public static void main(String[] args) { int Tag = 0; int Monat = 0; int Jahr = 0; int Stunde10 = 0; int Stunde1 = 0; int Minute10 = 0; int Minute1 = 0; boolean fehler = false; char trennzeichen = 0; // Einlesen String eingabe = EprogIO.readWord (); // Trennzeichen suchen for (int i=0; i57) ) { trennzeichen=eingabe.charAt(i); break; } } // Trennzeichen berprfen if (Character.isLetterOrDigit(trennzeichen)) fehler=true; String sTag=""; String sMonat=""; String sJahr=""; String sStunde10=""; String sStunde1=""; String sMinute10=""; String sMinute1=""; // Tag, Monat, Jahr, Stunde und Minute werden in einzelne Strings zerlegt if (trennzeichen == 0) { // ohne Trennzeichen if (eingabe.length() != 10) { fehler = true; } else { try { sTag = eingabe.substring(0,2); sMonat = eingabe.substring(2,4); sJahr = eingabe.substring(4,6); sStunde10 = eingabe.substring(6,7); sStunde1 = eingabe.substring(7,8); sMinute10 = eingabe.substring(8,9); sMinute1 = eingabe.substring(9,10); } catch (Exception E) {fehler=true;} } } else { // mit Trennzeichen try { int i = eingabe.indexOf(trennzeichen); sTag = eingabe.substring(0,i); int j = eingabe.indexOf(trennzeichen, i+1); sMonat = eingabe.substring(i+1, j); int k = eingabe.indexOf(trennzeichen, j+1); sJahr = eingabe.substring(j+1, k); int l = eingabe.indexOf(trennzeichen, k+1); sStunde10 = eingabe.substring(k+1, k+2); sStunde1 = eingabe.substring(k+2, l); sMinute10 = eingabe.substring(l+1, l+2); sMinute1 = eingabe.substring(l+2, eingabe.length()); } catch (Exception E) { fehler=true; } } try { // in Zahl umwandeln Tag = Integer.parseInt(sTag); Monat = Integer.parseInt(sMonat); Jahr = Integer.parseInt(sJahr); Stunde10 = Integer.parseInt(sStunde10); Stunde1 = Integer.parseInt(sStunde1); Minute10 = Integer.parseInt(sMinute10); Minute1 = Integer.parseInt(sMinute1); } catch (Exception E) { fehler = true; } if (!fehler) fehler = !checkdate(Tag,Monat,Jahr); //Gltigkeit des Datums if (!fehler) fehler = !checktime(Stunde10,Stunde1,Minute10,Minute1); // Gltigkeit der Zeit if (!fehler) { int day = getTag(Tag, Monat, Jahr); // Wochentag switch (day) { case 0: EprogIO.print("13467 123456 "); break; // Sonntag case 1: EprogIO.print("12356 123456 "); break; // Montag case 2: EprogIO.print("123456 56 "); break; // Dienstag case 3: EprogIO.print("12356 56 "); break; // Mittwoch case 4: EprogIO.print("123456 123456 "); break; // Donnerstag case 5: EprogIO.print("1567 123567 "); break; // Freitag case 6: EprogIO.print("13467 123567 "); break; // Samstag default: break; } switch (Stunde10) { case 0: EprogIO.print("123456 "); break; // 0 case 1: EprogIO.print("23 "); break; // 1 case 2: EprogIO.print("12457 "); break; // 2 case 3: EprogIO.print("12347 "); break; // 3 case 4: EprogIO.print("2367 "); break; // 4 case 5: EprogIO.print("13467 "); break; // 5 case 6: EprogIO.print("134567 "); break; // 6 case 7: EprogIO.print("1236 "); break; // 7 case 8: EprogIO.print("1234567 "); break; // 8 case 9: EprogIO.print("123467 "); break; // 9 default: break; } switch (Stunde1) { case 0: EprogIO.print("123456 "); break; case 1: EprogIO.print("23 "); break; case 2: EprogIO.print("12457 "); break; case 3: EprogIO.print("12347 "); break; case 4: EprogIO.print("2367 "); break; case 5: EprogIO.print("13467 "); break; case 6: EprogIO.print("134567 "); break; case 7: EprogIO.print("1236 "); break; case 8: EprogIO.print("1234567 "); break; case 9: EprogIO.print("123467 "); break; default: break; } switch (Minute10) { case 0: EprogIO.print("123456 "); break; case 1: EprogIO.print("23 "); break; case 2: EprogIO.print("12457 "); break; case 3: EprogIO.print("12347 "); break; case 4: EprogIO.print("2367 "); break; case 5: EprogIO.print("13467 "); break; case 6: EprogIO.print("134567 "); break; case 7: EprogIO.print("1236 "); break; case 8: EprogIO.print("1234567 "); break; case 9: EprogIO.print("123467 "); break; default: break; } switch (Minute1) { case 0: EprogIO.println("123456"); break; case 1: EprogIO.println("23"); break; case 2: EprogIO.println("12457"); break; case 3: EprogIO.println("12347"); break; case 4: EprogIO.println("2367"); break; case 5: EprogIO.println("13467"); break; case 6: EprogIO.println("134567"); break; case 7: EprogIO.println("1236"); break; case 8: EprogIO.println("1234567"); break; case 9: EprogIO.println("123467"); break; default: break; } } else EprogIO.println("FALSCHE EINGABE"); // Wenn Eingabefehler vorhanden } } 4103/10489/Anzeige.txt0100444000113000011500000000226710166517273013612 0ustar prippripeadmName: Stefan Ralisch Matrikelnummer: 0407039 Programm: 3126 - 7 Segment LED Anzeige Aufgabenstellung: Es soll ein String mit einem Datum und einer Uhrzeit eingelesen werden. Dieser muss in einem der beiden folgenden Formate vorliegen: TTMMJJHHMM oder Tag*Monat*Jahr*Stunde*Minute, wobei * fr ein beliebiges Trennzeichen steht. Anhand dieses Datums soll der Wochentag berechnet werden und zusammen mit der Uhrzeit eine 7 Segment LED Anzeige ansteuern und dort ausgegeben werden. Programmablauf: Der eingelesene String wird auf ein Trennzeichen untersucht. Sollte keines vorhanden sein, muss jede Angabe 2-stellig sein, also gegebenfalls mit fhrender Null. Wenn Trennzeichen verwendet werden, mssen sie alle gleich sein. Anschlieend wird der String entsprechend in Tag, Monat, Jahr, Stunde und Minute zerlegt. Dann werden die Funktionen checkdate und checktime aufgerufen, die die Gltigkeit des eingegebenen Datums und der Zeit berprfen. Danach wird die Funktion getTag ausgefhrt, die anhand des Datums den Wochentag berechnet. Zum Schluss werden noch alle Daten als stilisierte Segmente einer 7 Segment LED Anzeige ausgegeben. Im Fehlerfall wird "FALSCHE EINGABE" ausgegeben.4103/10489/312603.gif0100644000113000011500000000654410166517273012720 0ustar prippripeadmGIF87a1l@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,1l H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳh۷prK.ۍvūܾz;wp]L0&`1ɖ/O\9]Ǟ{9ѤKgFIb댨S_kЫq[=鏴=?Y{bqױUkvrݏ}V4j#gw~]p1wXrC~GoX]vB?ۭCȵ=`Eq6D!DS6qePkbB: +zW"#&PX ژ)"Z3#A *IB"%Sg'$ORX_F䣏,fYIG:x%xf\:Y`sly{֘("inYZbb}} )*&ZjRꝬNpڤ(^*kڪꩠªЦ~~J%+ ҢZmblZznKihݮ:#.[ZVJ/>cP+Ŋ-"onƻÎN3+0pɤZ.'j1<$;̧ɳ-lB 7LF{Lks VjtH#_-36T0]5j]tط 2ʹN?wcݶ^L7߁6QSv ︑x\O~܆MН.3S 9Ǿ~^w{6 y槃֢{]/N'ׯYD=;>>ȳ|_->w껾ko3_waz;^d?L_,| ۗAJ0i{D9.oc㊗^ t >5X7Aj8jʎMĦUvSxEoXCwh!DD vq4a~aKj0nܣڈzP2 tF4d cd%HNN҉acWFFDW1+?KM҂ճb!DRd$+FJOT SHS%/K/b p B@v8(&^& 7ɉMvJTwkL%xzs\$2} Ҝ '5gz 4=+ LqrhEhl%I)^DG9 cڒMkiSԧi%_Q4IRMǩSUV=1Uc6UG_LsVYݒUUk{V,mv)`WWկqM`]:We]UnulYر6Tku_;H]f7ִleZȦmlgKH=j.a[5=ny+\9d:UGtqGc ZԌ.ךtF\VWm|[\pjhM[ͼu.=]6ŻS73M]T&{ks  YԾoz_&x%o'b ?Dk]X7^o Msn9bWZ">5c/~t z:r--xF5hr=A(OBeSHMhZmńEXCHUg(jh]XoX#miOcHyȆ{Y(aVx؈8Xx؉8Xx؊8X9;4103/10489/312602.gif0100644000113000011500000000271610166517273012714 0ustar prippripeadmGIF87aZ@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,Z H*\ȰÇ#JHŋ3jȱǏ C^@Ɉ$I\0eJ0 |&A6sé&Ϟ0])tɢFC"Mq)ӎNn*5#ժ#ib8sԙWKٳ]-۷jKWۺt+/ʰUPTqN!0P1 QsS+Mk9h;/]۸\צOfYMN-kIMX6BN`~Ҋ*hDr裐$螔>YpT*Y$Mʸ$~)"%a8]&3fssYCZ)&qeP%cz(w:U(zjBrɨ.X^ꥧeb 湦IjvZA 뫎:YkΊ뭒+Ij|#:Ko(V;iKR6 ḭkZKgi%Ujλ뭺ܲ ˫#+0;0"\O{n;pBp q _|ɐz\c0Ln\,-l(7lv2E M/.G NKuGݵb[<ݳRmqjÍB|o;Ml݊V.ӑl8ٖ7pIc.W域Rzz?~қ}e⥯<ِovks^)_$j̓(aK=is?>ݓ]?=.6>_S]^7nvF)v*hA- mЁL »-΄ cx;.[@A ox+!1/Db{(´ِ5 @>!x+*nC"Q,V-Qd&A!qiHG2э3D#DB.QP ?>Qse'=*uc)FMr팝L'9iHO69td%EiDDB}ciF/2dY [є %s9]2'!i YR|f-)FbRӤ+Cy`⎛f3L`qݔa9FLf6N\3g<K^d?Ng'IOL3g: ʀBt(<P^:FHP:#Ef;3QR-hDb2r)B? ST(OITT= Ku:OUVs|dM)qԡ;EV V_UG~̟8֔Yח^[Wu}]`5؅VU5lZXܕ_ٕ EPROG-LU - Aufgabe 3126 (7 Segment LED Anzeige)

3126 Anzeige 7 Segment LED Anzeige
Kategorie:Elektrotechnik
Klasse:mittel
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Anzeige.txt, Anzeige.java, *.java

Kurzbeschreibung:

Die Balken der 7-Segment-Anzeige einer Digital-Uhr werden "angesteuert", umein eingelesenes Datum samt Uhrzeit auszugeben.

Allgemeine Hinweise:

Aufgabenstellung:

Ihr Programm soll ein Datum und eine Uhrzeit einlesen und daraus Zahlenkolonnen berechnen, die angeben, welche Segmente einer sechsstelligen Sieben-Segment-Anzeige man aktivieren muß, um den Wochentag und die Zeit anzuzeigen.

Die Anzeige sieht folgendermaßen aus:

Die Balken jeder Ziffer sind wie folgt numeriert:

Nummern werden auf der Anzeige wie folgt dargestellt:

Die ersten zwei Ziffern der Anzeige sollen verwendet werden, um den Wochentag anzuzeigen. (MO, DI, MI, DO, FR, SA bzw. SO). Dabei müssen klarerweise manche Buchstaben stililiert werden; verwenden Sie folgende Zahlenkolonnen für die Darstellung der Buchstaben:


         A -> 123567
         D -> 123456
         F -> 1567
         I -> 56
         M -> 12356
         O -> 123456
         R -> 123567
         S -> 13467
Für jede Ziffer der darzustellenden Zeit soll eine Kolonne geliefert werden, die angibt, welche Segmente aufleuchten sollen. Dabei sollen die Ziffern jeder Kolonne aufsteigend sortiert sein. 1 wird z.B. als 23 codiert.

Für die Ermittlung des Wochentages können Sie folgende Formel benutzen; diese liefert den Wochentag des 1. Jüanner eines gegebenen Jahres. Daraus können Sie dann den Wochentag des gegebenen Datums ermitteln.

Wochentag 1.1. = (Jahr + floor((Jahr-1)/4) - floor((Jahr-1)/100) + + floor((Jahr-1)/400)) mod 7

wobei floor(x) für die größte ganze Zahl <= x steht.

Diese Formel liefert 0 für Sonntag, 1 für Montag, ... , 6 für Samstag.

Eingabedaten:

Lesen Sie einen String ein, der das Datum und die Uhrzeit enthält. Dieser String muß in einem der folgenden Formate vorliegen:

"TTMMJJHHMM" oder "Tag*Monat*Jahr*Stunde*Minute", wobei * für ein beliebiges Trennzeichen (keine Ziffer, kein Buchstabe) steht und alle Trennzeichen identisch sein müssen.
2-Stellige Jahresangaben sind im 20. Jahrhundert angesiedelt. 93 -> 1993

Hierbei ist zu beachten, daß im ersten Fall jede der Komponenten Tag, Monat, Jahr, Stunden und Minuten zweistellig angegeben sein muß, also gegebenenfalls mit führender Null.

Das Datum und die Zeit müssen gültig sein (z.B. kein 30. Februar).

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm die sechs Zahlenkolonnen ausgeben, die zur Darstellung von Wochentag und Uhrzeit notwendig sind. Die Uhrzeit wird immer mit 4 Stellen ausgegeben, gegebenenfalls wird bei Stunde bzw. Minute eine 0 vorangeschrieben. Trennen Sie die sechs Strings durch jeweils ein Leerzeichen und geben Sie am Ende einen Zeilenvorschub aus.

Fehlerbehandlung:

Entsprechen die eingelesenen Daten nicht den Bedingungen, so geben Sie die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, aus.

Beispiele:

Eingabedaten
0112930312

Ausgabedaten
12356 56 123456 12347 23 12457


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Anzeige < Anzeige.i1 > Anzeige.out1

Das erzeugte File Anzeige.out1 können Sie dann mit dem mitgelieferten Outputfile Anzeige.o1 vergleichen. 4103/10998/0040777000113000011500000000000010166517273011476 5ustar prippripeadm4103/10998/Anzeige.java0100644000113000011500000001347010166517273013721 0ustar prippripeadm// Muhamed Kesetovic BspNr.1090 // verndert von Thomas Semper // BspNr.3126 | 7-Segment Led Anzeige import eprog.*; public class Anzeige { static String ausgabe = ""; //String fr Ausgabe public static void main(String[] args) { int Tag = 0; int Monat = 0; int Jahr = 0; int Stunde = 0; int Minute = 0; boolean fehler = false; char trennzeichen = 0; // einlesen String eingabe = EprogIO.readWord (); // trennzeichen suchen for (int i=0; i57) ) { trennzeichen=eingabe.charAt(i); break; } } // trennzeichen berprfen if (Character.isLetterOrDigit(trennzeichen)) fehler=true; String sTag=""; String sMonat=""; String sJahr=""; String sStunde=""; String sMinute=""; // Tag, Monat, Jahr, Stunde, Minute | Knnte mithilfe von String Tokenizer viel einfacher gelst werden ;-) if (trennzeichen == 0) { // ohne trennzeichen try { if (eingabe.length() > 10) fehler = true; sTag=eingabe.substring(0,2); sMonat=eingabe.substring(2,4); sJahr=eingabe.substring(4,6); sStunde=eingabe.substring(6,8); sMinute=eingabe.substring(8,10); } catch (Exception E) {fehler=true;} } else { // mit trennzeichen try { if (eingabe.length() > 14) fehler = true; int i = eingabe.indexOf(trennzeichen); sTag = eingabe.substring(0,i); int j = eingabe.indexOf(trennzeichen,i+1); sMonat = eingabe.substring(i+1,j); int k = eingabe.indexOf(trennzeichen,j+1); sJahr = eingabe.substring(j+1,k); int l = eingabe.indexOf(trennzeichen,k+1); sStunde = eingabe.substring(k+1,l); sMinute = eingabe.substring(l+1,eingabe.length()); } catch (Exception E) { fehler=true; } } try { // in Integer umwandeln Tag = Integer.parseInt(sTag); Monat = Integer.parseInt(sMonat); Jahr = Integer.parseInt(sJahr); Stunde = Integer.parseInt(sStunde); Minute = Integer.parseInt(sMinute); } catch (Exception E) { fehler = true; } if (!fehler) fehler = checkDate(Tag,Monat,Jahr); //Gltigkeit des Datums if (!fehler) fehler = checkZeit(Stunde, Minute); //Gltigkeit der Zeit if(!fehler) { int day = getDay(Tag, Monat, Jahr); // Wochentag ausgabe = ausgabe(day, Stunde, Minute); //Methode die ausgabe vorbereitet EprogIO.println(ausgabe); } if(fehler) EprogIO.println("FALSCHE EINGABE"); //Ausgabe bei Fehler } public static int getDay(int Tag, int Monat, int Jahr) { //wurde 1:1 von mir bernommen int days[] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; Jahr=Jahr+1900; double temp = 0; temp = ( (Jahr + Math.floor((Jahr-1)/4) - Math.floor((Jahr-1)/100) + Math.floor((Jahr-1)/400)) ); int t11 = (int) temp; t11=t11 % 7; int anzahl = 0; for (int i=0; i 2) anzahl++; anzahl=anzahl+Tag-1; anzahl=anzahl % 7; return (t11+anzahl) % 7; } public static boolean checkDate(int Tag, int Monat, int Jahr) { //wurde geringfgig verndert if (Monat<1 || Monat>12) return true; if (Jahr>99) return true; if ((Monat==4) || (Monat==6) || (Monat==9) || (Monat==11)) if (Tag>30) return true; if (Tag>31) return true; if ((Tag==0) || (Monat==0)) return true; if (Monat == 2) { if ((Jahr % 4) == 0) { if (Tag>29) return true; } else if (Tag>28) return true; } return false; } public static boolean checkZeit(int Stunde, int Minute) { if (Stunde < 0 || Stunde > 24) return true; if (Minute < 0 || Minute >60) return true; return false; } public static String ausgabe(int day, int Stunde, int Minute) { //ausgabe = Wochentag switch (day){ case 0: ausgabe += "13467 123456 "; break;//SO case 1: ausgabe += "12356 123456 "; break;//MO case 2: ausgabe += "123456 56 "; break;//DI case 3: ausgabe += "12356 56 "; break;//MI case 4: ausgabe += "123456 123456 "; break;//DO case 5: ausgabe += "1567 123567 "; break;//FR case 6: ausgabe += "13467 123567 "; break;//SA } //ausgabe = Wochentag + Uhrzeit if (Stunde < 10) ausgabe += "123456 "; if (Stunde > 9 && Stunde < 20) { ausgabe += "23 "; Stunde -= 10; } if (Stunde > 19) { ausgabe += "12457 "; Stunde -=20; } switch (Stunde){ case 0: ausgabe += "123456 "; break;//0 case 1: ausgabe += "23 "; break;//1 case 2: ausgabe += "12457 "; break;//2 case 3: ausgabe += "12347 "; break;//3 case 4: ausgabe += "2367 "; break;//4 case 5: ausgabe += "13467 "; break;//5 case 6: ausgabe += "134567 "; break;//6 case 7: ausgabe += "1236 "; break;//7 case 8: ausgabe += "1234567 "; break;//8 case 9: ausgabe += "123467 "; break;//9 } if (Minute < 10) ausgabe += "123456 "; if (Minute > 9 && Minute < 20) { ausgabe += "23 "; Minute -= 10; } if (Minute > 19 && Minute < 30) { ausgabe += "12457 "; Minute -= 20; } if (Minute > 29 && Minute < 40) { ausgabe += "12347 "; Minute -= 30; } if (Minute > 39 && Minute < 50) { ausgabe += "2367 "; Minute -= 40; } if (Minute > 49 && Minute < 60) { ausgabe += "13467 "; Minute -= 50; } switch (Minute){ case 0: ausgabe += "123456 "; break;//0 case 1: ausgabe += "23 "; break;//1 case 2: ausgabe += "12457 "; break;//2 case 3: ausgabe += "12347 "; break;//3 case 4: ausgabe += "2367 "; break;//4 case 5: ausgabe += "13467 "; break;//5 case 6: ausgabe += "134567 "; break;//6 case 7: ausgabe += "1236 "; break;//7 case 8: ausgabe += "1234567 "; break;//8 case 9: ausgabe += "123467 "; break;//9 } return ausgabe; } } 4103/10998/Anzeige.txt0100644000113000011500000000211010166517273013604 0ustar prippripeadmThomas Semper Mr: 0426850 BspNr. 3126 Eingabe mit EprogIO; Es wird zwischen Eingabe mit und ohne Trennzeichen unterschieden Eingabe wird auf Lnge hin berprft, also mit TZ 14 und ohne nur 10 Zeichen erlaubt Methoden: getDay() findet mithilfe der angegebenen Formel den ersten Tag im Jahr checkDate() berprft das angegeben Datum auf Korrektheit( Anzahl der Tage etc.) checkZeit() berprft eingegebene Uhrzeit auf Korrektheit ausgabe() erstellt mithilfe von case Blcken einen AusgabeString fr Datum und Uhrzeit 4103/10998/312603.gif0100644000113000011500000000654410166517273012725 0ustar prippripeadmGIF87a1l@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,1l H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳϟ@ JѣH*]ʴӧPJJիXjʵׯ`ÊKٳh۷prK.ۍvūܾz;wp]L0&`1ɖ/O\9]Ǟ{9ѤKgFIb댨S_kЫq[=鏴=?Y{bqױUkvrݏ}V4j#gw~]p1wXrC~GoX]vB?ۭCȵ=`Eq6D!DS6qePkbB: +zW"#&PX ژ)"Z3#A *IB"%Sg'$ORX_F䣏,fYIG:x%xf\:Y`sly{֘("inYZbb}} )*&ZjRꝬNpڤ(^*kڪꩠªЦ~~J%+ ҢZmblZznKihݮ:#.[ZVJ/>cP+Ŋ-"onƻÎN3+0pɤZ.'j1<$;̧ɳ-lB 7LF{Lks VjtH#_-36T0]5j]tط 2ʹN?wcݶ^L7߁6QSv ︑x\O~܆MН.3S 9Ǿ~^w{6 y槃֢{]/N'ׯYD=;>>ȳ|_->w껾ko3_waz;^d?L_,| ۗAJ0i{D9.oc㊗^ t >5X7Aj8jʎMĦUvSxEoXCwh!DD vq4a~aKj0nܣڈzP2 tF4d cd%HNN҉acWFFDW1+?KM҂ճb!DRd$+FJOT SHS%/K/b p B@v8(&^& 7ɉMvJTwkL%xzs\$2} Ҝ '5gz 4=+ LqrhEhl%I)^DG9 cڒMkiSԧi%_Q4IRMǩSUV=1Uc6UG_LsVYݒUUk{V,mv)`WWկqM`]:We]UnulYر6Tku_;H]f7ִleZȦmlgKH=j.a[5=ny+\9d:UGtqGc ZԌ.ךtF\VWm|[\pjhM[ͼu.=]6ŻS73M]T&{ks  YԾoz_&x%o'b ?Dk]X7^o Msn9bWZ">5c/~t z:r--xF5hr=A(OBeSHMhZmńEXCHUg(jh]XoX#miOcHyȆ{Y(aVx؈8Xx؉8Xx؊8X9;4103/10998/312602.gif0100644000113000011500000000271610166517273012721 0ustar prippripeadmGIF87aZ@ @ @@@@@``@``@@@@ @ @ @ @@ @ @ ` `@ ` ` @ @ @ @ @@@@@@ @ @@ @ @@@@@@@@@@`@`@@`@`@@@@@@@@@@@@@@@@@@@@``@``` ` @` ` `@`@@`@`@````@``````@````@````@````@``@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@@ @ @@@@@``@``@@@@!,Z H*\ȰÇ#JHŋ3jȱǏ C^@Ɉ$I\0eJ0 |&A6sé&Ϟ0])tɢFC"Mq)ӎNn*5#ժ#ib8sԙWKٳ]-۷jKWۺt+/ʰUPTqN!0P1 QsS+Mk9h;/]۸\צOfYMN-kIMX6BN`~Ҋ*hDr裐$螔>YpT*Y$Mʸ$~)"%a8]&3fssYCZ)&qeP%cz(w:U(zjBrɨ.X^ꥧeb 湦IjvZA 뫎:YkΊ뭒+Ij|#:Ko(V;iKR6 ḭkZKgi%Ujλ뭺ܲ ˫#+0;0"\O{n;pBp q _|ɐz\c0Ln\,-l(7lv2E M/.G NKuGݵb[<ݳRmqjÍB|o;Ml݊V.ӑl8ٖ7pIc.W域Rzz?~қ}e⥯<ِovks^)_$j̓(aK=is?>ݓ]?=.6>_S]^7nvF)v*hA- mЁL »-΄ cx;.[@A ox+!1/Db{(´ِ5 @>!x+*nC"Q,V-Qd&A!qiHG2э3D#DB.QP ?>Qse'=*uc)FMr팝L'9iHO69td%EiDDB}ciF/2dY [є %s9]2'!i YR|f-)FbRӤ+Cy`⎛f3L`qݔa9FLf6N\3g<K^d?Ng'IOL3g: ʀBt(<P^:FHP:#Ef;3QR-hDb2r)B? ST(OITT= Ku:OUVs|dM)qԡ;EV V_UG~̟8֔Yח^[Wu}]`5؅VU5lZXܕ_ٕ EPROG-LU - Aufgabe 3126 (7 Segment LED Anzeige)

3126 Anzeige 7 Segment LED Anzeige
Kategorie:Elektrotechnik
Klasse:mittel
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Anzeige.txt, Anzeige.java, *.java

Kurzbeschreibung:

Die Balken der 7-Segment-Anzeige einer Digital-Uhr werden "angesteuert", umein eingelesenes Datum samt Uhrzeit auszugeben.

Allgemeine Hinweise:

Aufgabenstellung:

Ihr Programm soll ein Datum und eine Uhrzeit einlesen und daraus Zahlenkolonnen berechnen, die angeben, welche Segmente einer sechsstelligen Sieben-Segment-Anzeige man aktivieren muß, um den Wochentag und die Zeit anzuzeigen.

Die Anzeige sieht folgendermaßen aus:

Die Balken jeder Ziffer sind wie folgt numeriert:

Nummern werden auf der Anzeige wie folgt dargestellt:

Die ersten zwei Ziffern der Anzeige sollen verwendet werden, um den Wochentag anzuzeigen. (MO, DI, MI, DO, FR, SA bzw. SO). Dabei müssen klarerweise manche Buchstaben stililiert werden; verwenden Sie folgende Zahlenkolonnen für die Darstellung der Buchstaben:


         A -> 123567
         D -> 123456
         F -> 1567
         I -> 56
         M -> 12356
         O -> 123456
         R -> 123567
         S -> 13467
Für jede Ziffer der darzustellenden Zeit soll eine Kolonne geliefert werden, die angibt, welche Segmente aufleuchten sollen. Dabei sollen die Ziffern jeder Kolonne aufsteigend sortiert sein. 1 wird z.B. als 23 codiert.

Für die Ermittlung des Wochentages können Sie folgende Formel benutzen; diese liefert den Wochentag des 1. Jüanner eines gegebenen Jahres. Daraus können Sie dann den Wochentag des gegebenen Datums ermitteln.

Wochentag 1.1. = (Jahr + floor((Jahr-1)/4) - floor((Jahr-1)/100) + + floor((Jahr-1)/400)) mod 7

wobei floor(x) für die größte ganze Zahl <= x steht.

Diese Formel liefert 0 für Sonntag, 1 für Montag, ... , 6 für Samstag.

Eingabedaten:

Lesen Sie einen String ein, der das Datum und die Uhrzeit enthält. Dieser String muß in einem der folgenden Formate vorliegen:

"TTMMJJHHMM" oder "Tag*Monat*Jahr*Stunde*Minute", wobei * für ein beliebiges Trennzeichen (keine Ziffer, kein Buchstabe) steht und alle Trennzeichen identisch sein müssen.
2-Stellige Jahresangaben sind im 20. Jahrhundert angesiedelt. 93 -> 1993

Hierbei ist zu beachten, daß im ersten Fall jede der Komponenten Tag, Monat, Jahr, Stunden und Minuten zweistellig angegeben sein muß, also gegebenenfalls mit führender Null.

Das Datum und die Zeit müssen gültig sein (z.B. kein 30. Februar).

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm die sechs Zahlenkolonnen ausgeben, die zur Darstellung von Wochentag und Uhrzeit notwendig sind. Die Uhrzeit wird immer mit 4 Stellen ausgegeben, gegebenenfalls wird bei Stunde bzw. Minute eine 0 vorangeschrieben. Trennen Sie die sechs Strings durch jeweils ein Leerzeichen und geben Sie am Ende einen Zeilenvorschub aus.

Fehlerbehandlung:

Entsprechen die eingelesenen Daten nicht den Bedingungen, so geben Sie die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, aus.

Beispiele:

Eingabedaten
0112930312

Ausgabedaten
12356 56 123456 12347 23 12457


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Anzeige < Anzeige.i1 > Anzeige.out1

Das erzeugte File Anzeige.out1 können Sie dann mit dem mitgelieferten Outputfile Anzeige.o1 vergleichen. 4105/0040777000113000011500000000000010166517273011006 5ustar prippripeadm4105/intersec.html0100666000113000011500000002307610166517273013515 0ustar prippripeadm EPROG-LU - Aufgabe 4105 (Ueberdeckungen berechnen)

4105 intersec Ueberdeckungen berechnen
Kategorie:Graphik
Klasse:leicht
Eingabe:Siehe Spezifikation
Ausgabe:Siehe Spezifikation
Abzugebende Files: intersec.txt, Main.java, intersec/*.java , 10525.txt, 10789.txt

Kurzbeschreibung:

Schreiben Sie eine Klasse Intersection, die einfache geometrische Objekte einliest, und diese auf Überdeckungen überprüft.

Allgemeine Hinweise:

Aufgabenstellung:

Ein String, der einfache geometrische Objekte wie Rechtecke und Kreise enthält soll eingelesen werden.

Rechtecke können durch die Angabe von 2 Koordinatenpunkte (x1,y1) und (x2,y2) in der Form R(x1,y1;x2,y2) eingeben werden, wobei die 2 Punkte den linken unteren bzw. rechten oberen Eckpunkt des Rechteckes darstellt. Die Seiten des Rechteckes seien achsenparallel und für die Punkte muß folgende Bedingung gelten: x1<x2, y1<y2.

Rechtecke können aber auch durch den linken unteren Eckpunkt und die Angabe der beiden Seiten a und b definiert werden, wobei die Seite a wiederum parallel der x-Achse und die Seite b parallel der y-Achse verläuft. Die Eingabe hat dann die Form R(x1,y1,a,b).

Bei einem Quadrat reicht allerdings die Eingabe einer einzigen Seite in der Form R(x1,y1,a), wobei x1,y1 den linken unteren Eckpunkt darstellt.

Kreise werden als K(x1,y1;r) eingegeben wobei (x1,y1) den Mittelpunkt und r den Radius definiert, oder auch durch die Angabe eines den Kreis umschreibenden Quadrat K(x1,y1,a); x1 und y1 sind der linke untere Eckpunkt und a ist die Seitenlänge des Quadrats.

Jedem Objekt soll eine eindeutige Objektnummer zugeordnet sein.

Schreiben Sie eine Routine welche zwei geometrische Objekte miteinander vergleicht. Der Vergleich zweier Objekte sei definiert durch a<b gdw. Objekt a innerhalb vom Objekt b liegt, wobei Berührungen der Objektgrenzen gestattet sind. Desweiteren gilt a<<b gdw. Objekt a innerhalb vom Objekt b liegt, wobei in diesem Fall keine Berührungen an den Objektgrenzen existieren dürfen.

Genauere Informationen zur Ausgabe entnehmen Sie bitte dem Abschnitt "Ausgabedaten".

Eingabedaten:

Lesen Sie zuerst alle Objekte in Form von Strings ein. Jedes Objekt muß mit dem Buchstaben "R" oder "K" beginnen, die Form der Eingabe von Rechtecken und Kreisen wurde in der Aufgabenstellung bereits definiert.

Sämtliche Zahlenangaben müssen ganzzahlig und Zahlen vom Typ Short sein, zusätzlich müssen Seitenlängen/Radius positiv und größer 0 sein.

Jedem Objekt soll eine eindeutige und fortlaufende Objektnummer zugeordnet werden, diese ist selbstverständlich ebenfalls ganzzahlig und beginnt mit 1 für das erste Objekt.

Der abschließende String stellt die Abfrage dar, dieser besteht entweder nur aus dem Zeichen "?", oder aus 2 Objektnummern getrennt durch einen der beiden Vergleichsoperatoren "<" oder "<<". Zu den Objektnummern müßen auch Objekte existieren.

Die einzelnen Strings sind im Eingabedatensatz durch Leerzeichen getrennt.

Ausgabedaten:

Bei korrekten Eingabesätzen soll Ihr Programm das Resultat der Berechnung wie folgt ausgeben. Die gefundenen Objektgruppen werden im Ausgabestring nach Anzahl der Objekten absteigend sortiert und durch ein Leerzeichen getrennt ausgegeben, innerhalb einer Gruppe sollen die Objekte nach den Nummern aufsteigend sortiert und durch ein Bindestrich getrennt sein.

Geben Sie immer nur die Objektnummern sowie die Trennzeichen aus. Ist die Anzahl der Objekte bei 2 Gruppen identisch, so soll hier noch zusätzlich nach Objektnummer aufsteigend sortiert werden.

Falls keine Überdeckung existiert, so geben Sie 0 aus.

Bei Vergleichsoperatoren geben Sie das entweder "TRUE" oder "FALSE" aus.

Schließen Sie die Ausgabe mit einem Zeilenvorschub ab.

Fehlerbehandlung:

Generell wird bei fehlerhaften Eingabedatensätzen nur eine einzige Fehlermeldung erzeugt, weitere Berechnungen werden nicht mehr durchgeführt.

Enthält der Eingabedatensatz einen ungültigen numerischen Datentyp, so soll einmal das Zeichen "?", gefolgt von einem Zeilenvorschub, ausgegeben werden.

Wenn dann der Eingabestring nicht den Bedingungen genügt, so soll Ihr Programm die Fehlermeldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Beispiele:

Eingabedaten
R(0,0;2,2) R(2,0,1) R(4,0,1,2) R(4,2;5,3) R(4,1,1,1) K(1,0,2) K(5,3;1) ?

R(0,0;3,3) K(1,1;1) 2<1

Ausgabedaten
1-2-6 3-5 4-7

TRUE


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Main < intersec.i1 > intersec.out1

Das erzeugte File intersec.out1 können Sie dann mit dem mitgelieferten Outputfile intersec.o1 vergleichen. 4105/intersec.i10100664000113000011500000000011110166517272013040 0ustar prippripeadmR(0,0;2,2) R(2,0,1) R(4,0,1,2) R(4,2;5,3) R(4,1,1,1) K(1,0,2) K(5,3;1) ? 4105/intersec.o10100664000113000011500000000001610166517272013052 0ustar prippripeadm1-2-6 3-5 4-7 4105/intersec.i20100664000113000011500000000003010166517272013041 0ustar prippripeadmR(0,0;3,3) K(1,1;1) 2<1 4105/intersec.o20100664000113000011500000000000510166517272013051 0ustar prippripeadmTRUE 4105/10525/0040777000113000011500000000000010166517272011461 5ustar prippripeadm4105/10525/Compstring.java0100644000113000011500000002556710166517272014461 0ustar prippripeadm// Autor: Stemer Bertram // Matr.Nr.: 0257071 // Studienkennzahl: E033535 // Beispiel: 3 // Beispielnummer: 3138 import eprog.*; public class Compstring extends EprogIO { //Deklaration der Variabeln static String sInput, sSearch, Output = "NEIN"; static String spezSign = "*^?[]\\"; static final char questionmark = '?'; static final char backslash = '\\'; static final char braceOpen = '['; static final char braceClose = ']'; static final char exception = '^'; static final char asterik = '*'; static boolean flBrCount = false, flStLength = false, flAsterik, flBrace, flBraceSlash, flNoBraceSlash; static int brOpCount, brClCount, asCount, countException, countAsterik, indBegin, indEnd, indBegWhile, indEndWhile; static int indBegAsterik, indEndAsterik, indBegAstWhile, indEndAstWhile, iAst, len; static String subString, subAstString, subInput; static char[] subArray, sArray, iArray, spezArray, subAstArray; //Methode um Strings einzulesen public static void readInput() { sInput = readWord(); sSearch = readWord(); //prueft laenge des ersten Strings if (sInput.length() > 30) { Output = "FALSCHE EINGABE"; flStLength = true; } //pruef laenge des zweiten Strings else if (sSearch.length() > 30) { Output = "FALSCHE EINGABE"; flStLength = true; } } //end readInput //Methode zur Suche des Zeichens '*' public static String searchAsterik() { //Hier wird die Position des Sterns gesucht indBegAsterik = sSearch.indexOf(asterik); indEndAsterik = sSearch.lastIndexOf(asterik); indBegAstWhile = indBegAsterik; //Wenn nur ein Stern vorhanden ist, kommt die Ausgabe JA if(indBegAsterik == 0 && sSearch.length() == 1) { Output = "JA"; flAsterik = true; } //Zaehlt die Anzahl der '*' im searchString mit asCount while(indBegAstWhile >= 0) { asCount++; indBegAstWhile++; indBegAstWhile = sSearch.indexOf(asterik, indBegAstWhile); } //Wenn die Anzahl der '*' ist 1, dann diese IF-Schleife if(asCount == 1) { //Wenn '*' an der ersten Stelle steht if(indBegAsterik == 0) { //Erstellt einen Substring nach dem Stern und wandelt diesen in ein Array um subAstString = sSearch.substring(indBegAsterik+1); //Laenge fuer die Methode regionMatches wird erstellt len = subAstString.length(); //Schleife zur Pruefung des Substringes mit der Eingabe for(int i=0; i < sInput.length(); i++) { //Erstellt einen neuen Substring zum Laengenvergleich im IF-Statement String iSubString = sInput.substring(i); //Prueft die beiden Strings auf Gleichheit - Var i verschiebt die Pruefung immer um eine Stelle if(sInput.regionMatches(false, i, subAstString, 0, len) && iSubString.length() == len) { Output = "JA"; flAsterik = true; break; } } } //Wenn '*' an der letzten Stelle steht else if(indEndAsterik == (sSearch.length()-1)) { //Erstellt einen SubString ohne '*' und wandelt diesen in ein Array um subAstString = sSearch.substring(0, (sSearch.length()-1)); subAstArray = subAstString.toCharArray(); //iArray wird hier initialisiert iArray = sInput.toCharArray(); // for(int i=0; i < subAstString.length(); i++) { //Wenn die Zeichen gleich sind, zaehlt der Counter if(subAstArray[i] == iArray[i]) { countAsterik++; } //Der Counter wird mit der laenge des Substrings verglichen if(countAsterik == subAstArray.length) { Output = "JA"; flAsterik = true; break; } } } } //Wenn 2 '*' vorhanden und Stern steht am Anfang und am Ende if(asCount == 2 && indBegAsterik == 0 && indEndAsterik == (sSearch.length()-1)) { //Erstellt einen Substring zwischen '*' und wandelt diesen in ein Array um subAstString = sSearch.substring(indBegAsterik+1, indEndAsterik); subAstArray = subAstString.toCharArray(); //Laenge des Substrings fuer die Methode regionMatches wird erstellt len = subAstString.length(); //Prueft die ob der Substring mit der Eingabe uebereinstimmt for(int i=0; i < sInput.length(); i++) { String iSubString = sInput.substring(i); //Prueft Uebereinstimmung zwischen Eingabe und Substring if(sInput.regionMatches(false, i, subAstString, 0, len)) { Output = "JA"; flAsterik = true; break; } } } return Output; } //end searchAsterik //Methode zur Pruefung auf Gleichheit public static String searchEquals() { //hier werden die Strings in eine Array umgewandelt iArray = sInput.toCharArray(); sArray = sSearch.toCharArray(); //Wenn beide gleich und die Laenge 30 nicht ueberschritten und kein Stern gefunden, dann dieses IF-Statement if(sSearch.equals(sInput) && flStLength == false && flAsterik == false) { Output = "JA"; flBrCount = true; } //Wenn im Searchstring ein Fragezeichen, dann wird dieses Statement aufgerufen else if(sSearch.indexOf(questionmark) >= 0 && sInput.length() == sSearch.length() && flStLength == false) { //erstellt eine Laufzeitvariable um die beiden Arrays miteinander zu vergleichen for(int i=0; i < sSearch.length(); i++) { if(iArray[i] == sArray[i] || sArray[i] == questionmark) { Output = "JA"; break; } else if(iArray[i] != sArray[i]) { Output = "NEIN "; break; } } } //else if(sSearch.length() != sInput.length() && flStLength == false && flAsterik == false && flBrace == false && flBraceSlash == false) Output = "NEIN"; return Output; } //end searchEquals //Methode um nach einem Backslash zu suchen public static void searchBackslash(String subStrg) { //suche nach Backslash und gibt die Position zurueck int indBackslash = subStrg.indexOf(backslash); //wandelt den String spezSign in ein Array um spezArray = spezSign.toCharArray(); subArray = subStrg.toCharArray(); //wenn ein Backslash vorhanden, dann dieses Statement if(indBackslash >= 0 && flStLength == false && indBegin >= 0 && indEnd >=0) { //prueft die Position des Backslashes und schaut was dahinter kommt for(int i=0; i < spezArray.length; i++) { //wenn es uebereinstimmt, dann wird das Flag gesetzt if(subArray[indBackslash] == backslash && subArray[indBackslash+1] == spezArray[i]) { //setzt ein Flag, wenn sonderzeichen gefunden switch(spezArray[i]) { case questionmark: case braceOpen: case braceClose: case asterik: case exception: flBraceSlash = true; break; } break; } } } //wenn kein Backslash, doch ein Sonderzeichen, dann diese Schleife if(indBackslash == -1 && flStLength == false && indBegin >= 0 && indEnd >= 0) { //Sonderzeichen wird gesucht und setzt ein Flag for(int i=0; i < spezArray.length; i++) { for(int j=0; j < subArray.length; j++) { if(subArray[j] == spezArray[i]) { Output = "FALSCHE EINGABE"; flNoBraceSlash = true; break; } } } } } //end searchBackslash //Methode um die Klammer zu finden public static String searchBraces() { //Suche nach der eckigen Klammer und gibt die Position an indBegin = sSearch.indexOf(braceOpen); indEnd = sSearch.lastIndexOf(braceClose); indBegWhile = indBegin; indEndWhile = indEnd; //Suche nach Ausname '^' an Stelle '['+1 int indException = sSearch.indexOf(braceOpen)+1; //Wenn eckige Klammer Auf und Zu vorhanden if(indBegin >= 0 && indEnd >= 0 && flStLength == false) { //erzeugt einen Substring zwischen den eckigen Klammer und wandelt diesn in ein Array um subString = sSearch.substring((indBegin+1), indEnd); //Zaehlt wieviel Klammern Auf vorhanden sind while(indBegWhile >= 0) { ++brOpCount; indBegWhile = indBegWhile + 1; indBegWhile = sSearch.indexOf(braceOpen, indBegWhile); } //Zaehlt wieviel Klammern Zu vorhanden sind while(indEndWhile >= 0) { ++brClCount; indEndWhile = indEndWhile - 1; indEndWhile = sSearch.lastIndexOf(braceClose, indEndWhile); } //Wenn Klammer Auf und - Zu vorhanden nicht aber Exception '^', dann dieses Statement if(sArray[indException] != exception && brOpCount >= 1 && brClCount >= 1 == flNoBraceSlash == false) { //Ruft die Methode auf um den Backslash zu ueberpruefen searchBackslash(subString); if(flNoBraceSlash == false) { //Erzeugt Laufzeitvariabeln um die einzelnen Zeichen aus der Klammer mit dem input Array zu vergleichen for(int i=0; i < iArray.length; i++) { for(int j=0; j < subString.length(); j++) { if(iArray[i] == subArray[j]) { Output = "JA"; //i und j setzen die beiden for-Schleifen zurck, so dass diese abgebrochen werden. i = iArray.length; j = subString.length(); flBrace = true; } //Wenn das Ende der FOR-Schleife erreicht ist, dann passt kein Zeichen aus der Klammer if((i+1) == iArray.length && (j+1) == subArray.length) { Output = "NEIN"; flBrace = true; break; } } } } } //Wenn an zweiter Stelle der Klammer Auf das Zeichen Exception '^' steht else if (sArray[indException] == exception) { //erzeugt einen Substring nach dem zeichen Exception '^' und vor dem Ende der Klammer Zu subString = sSearch.substring((indBegin+2), indEnd); searchBackslash(subString); //Laufzeitvariable zur Pruefung ob ein Zeichen passt for(int i=0; i < iArray.length; i++) { for(int j=0; j < subArray.length; j++) { //Bei gleichen Zeichen wird die Variable countException um eines erhoeht if(iArray[i] == subArray[j]) countException++; } } //wenn countException ist Null, dann stimmt keines ueberein if(countException == 0 && flNoBraceSlash == false) Output = "JA"; //wenn countException ist groesser als 1, dann stimmt diese Eingabe nicht else if(countException > 0 && flNoBraceSlash == false) Output = "NEIN"; } //prueft auf mehrere Klammer und else if(brOpCount > 1 && flBraceSlash == false|| brClCount > 1 && flBraceSlash == false) { Output = "FALSCHE EINGABE"; } } return Output; } //end searchBraces //Methode fuer die Ausgabe public static void display() { if(Output != null) EprogIO.println(Output); } //end display } //end class 4105/10525/Wildcard.java0100644000113000011500000000056410166517272014053 0ustar prippripeadm// Autor: Stemer Bertram // Matr.Nr.: 0257071 // Studienkennzahl: E033535 // Beispiel: 3 // Beispielnummer: 3138 public class Wildcard { public static void main(String [] args) { Compstring compstr = new Compstring(); compstr.readInput(); compstr.searchAsterik(); compstr.searchEquals(); compstr.searchBraces(); compstr.display(); } } 4105/10525/Wildcard.txt0100644000113000011500000002377310166517272013760 0ustar prippripeadm/*************************** * Autor: Stemer Bertram * * Matr.Nr.: 0257071 * * Studienkennzahl: E033535 * * Beispiel: 3 * * Beispielnummer: 3138 * ****************************/ Aufgabenstellung: ================= Es werden zwei Strings mit readWord() eingelesen. Diese String duerfen eine max. Laenge von 30 Zeichen nicht ueberschreiten. Der erste String unterliegt keinerlei syntaktischen Begrenzung. Der zweite String ist der Suchstring, mit welchem geprft wird, ob eines der Zeichen im ersten String enthalten ist. Beim Suchstring gibt es Suchzeichen wie '*', '^', '\', '[', ']' und '?'. Diese Zeichen haben alle eine besondere Bedeutung welche ich hier kurz beschreiben will. Klammer-Auf '[': Diese ist nur sinnvoll in Kombination mit der Klammer-Zu. Alle Zeichen welche in dieser Klammer enthalten sind z.B. [abc] werden mit dem ersten String geprueft und bei Uebereinstimmung wird die Meldung "JA" ausgegeben. Klammer-Zu ']': Siehe hierzu Klammer-Auf Ausnahme '^': Dieses Zeichen tritt nur in Kombination mit der Klammer-Auf auf. Es kommt an zweiter Stelle und sagt aus, dass nur die Zeichen welche nicht zwischen den Klammern stehen mit dem ersten String passend sind. z.B. [^abc] kommt keines der Zeichen im ersten String vor, dann wird die Meldung "JA" ausgegeben. Fragezeichen '?': Dieses Zeichen steht stellvertretend fuer ein anderes Zeichen. Im Suchstring kann an jeder Stelle das Fragezeichen eingesetzt werden. Sind die beiden Strings dann immer noch gleich lang, dann wird die Ausgabe "JA" ausgedruckt. Stern '*': Der Stern steht fuer einen Teilstring. Steht der Stern am Anfang des Suchbegriffes, dann muss der restliche Teilstring mit dem hinteren Teil des ersten Stringes uebereinstimmen. Steht der Stern jedoch am Ende des Suchbegriffes, dann muss der erste Teilstring mit dem ersten String uebereinstimmen. Backslash '\': Dieses Zeichen soll im Suchbegriff alle Sonderzeichen aufheben. Gibt es im Suchstring eine syntaktisch Falsche Eingabe, wie z.B. [a[b], dann wird die Fehlermeldung "FALSCHE EINGABE" ausgegeben. Beide Strings muessen vollstaendig eingelesen werden. Verwendete Methoden: ==================== Klasse Methode Beschreibung ====== ======= ============ String: regionMatches() -> vergleicht einen String mit einem anderen laenge und position kann mit angegeben werden String: toCharArray() -> wandelt einen String in ein Char Array um String: length() -> gibt die Laenge eines Strings oder Arrays aus String: indexOf() -> sucht nach einem Zeichen und gibt die erste Pos. aus String: lastIndexOf() -> sucht nach einem Zeichen und gibt die letzte Pos. aus String: substring() -> erstellt einen Substring ab einem bestimmten Zeichen Dokumentation: ============== Es wurden zwei Java-Dateien erstellt. Zum einen die Compstring.java und zum anderen die Wildcard.java. Die Wildcard.java enthaelt die Main-Methode und steuert die Methoden der Compstring-Klasse. In der Compstring.java steht der gesamte Programmcode mit den einezelnen Methoden. Es gibt hier folgende Methoden leseEingabe(), searchBackslash(), searchAsterik(), searchEquals(), searchBraces() und display(). Zuerst importiert das Programm die Klasse eprog.*, damit die Eingabe und Ausgabe korrekt gemacht werden kann. Anschlieend erzeugt man mit class die neue Klasse Compstring, welche von der EprogIO abgeleitet wird. Ab der Zeile 11 steht die Deklaration der Variabeln. Hier gibt es String, char, char[], int und boolean Variabeln, welche zur Laufzeit des Programmes initialisiert werden. Methode readInput() =================== Diese Methode liet zwei Strings aus der Commandline ein und ueberprueft diese beiden String auf ihre laenge, welche max. 30 Zeichen haben darf. Beim ueberschreiten dieser Laenge, schreibt sie "FALSCHE EINGABE" in die Output-Variable und setzt eine Flag, damit andere Methoden nicht mehr in diese Variable schreiben duerfen. Methode searchAsterik() ======================= Diese Methode hat keinen Ruekgabewert. Zuerst sucht sie nach der Position des Sternes und schreibt dies in eine Variable. Interessant ist die Anfangs- und die Schlussposition, welches mit der Methode indexOf() und lastIndexOf() unterschieden wird. Ist nur ein Stern vorhanden und sonst kein Nachfolgezeichen, dann stimmt der Suchbegriff mit dem ersten String ueberein. In einer while-Schleife werden die vorhandenden Sterne gezaehlt und in eine int Variable asCount geschrieben. Ist im Suchstring nur ein Stern vorhanden und steht dieser am Anfang, dann erzeugt die If-Schleife einen (substring()) Substring. Die Methode length() schreibt die Laenge des Substrings in die Variable "len". Eine For-Schleife erzeugt eine Laufzeitvariable "i" welche in der neuen Methode regionMatches() bentigt wird. Dieser Methode mssen noch Argumente mitgegeben werden, wie eine boolean Var fuer ignoreCase, Position des ersten Strings(ist Var. i), Postition des Suchstrings und die Laenge (Var. len). Gibt es hier eine Uebereinstimmung des Substringes mit dem ersten String, dann setzt sie hier die Ausgabe "JA". Ist der Stern jedoch am Ende des Suchstrings, dann tritt die naechste If-Schleife in kraft. Auch diese erstellt einen neuen Substring des Suchstrings und wandelt diesen mit der Methode toCharArray() in ein Char-Array um. Dieses Substring Array wird mit dem ersten String-Array verglichen und erhoeht eine Countervariable "countAsterik" um eines wenn sie uebereinstimmen. Nur wenn diese Variable genau so gro ist wie die Laenge des subAstArray, setzt sich die Ausgabe "JA" und bricht die For-Schleife ab. Ist der Stern zweimal vorhanden, dann springt das Programm in die naechste If-Schleife. Hier prueft es auf die Position des Sterns. Diese soll am Anfang oder am Ende sein. Ist dies der Fall, dann erzeugt die Methode substring() wieder einen neuen SubString des Suchbegriffes zwischen den beiden Sternen und wandelt diesen mit der Methode toCharArray() in ein Array um. Durch eine For-Schleife erzeugt man eine Laufzeitvariable welche fuer die Pruefung des ersten Strings benoetigt wird. Diese beiden Strings werden wieder mit der Methode regionMatches() miteinander verglichen, wie schon im ersten Absatz dieser Methode beschrieben ist. Kommt es hier zu einer Uebereinstimmung, gibt das Programm die Meldung "JA" aus. Die generierten Ausgaben werden mit dem return-Statement an die Methode zurueck gegeben. Methode searchEquals() ====================== searchEquals() ueberprueft mit der Methode equals() die beiden Strings miteinander. Sind beide gleich, dann erzeugt sie die Ausgabe "JA" und setzt ein Flag "flBrCount" auf true. Ist in diesem Suchstring ein Fragezeichen zu finden und ist die Laenge der beiden Strings immer noch gleich, so faellt man in die else if-Schleife und prueft mittels einer Laufzeitvariable die beiden Strings auf Gleichheit. Die Strings wurden in ein Array umgewandelt, damit jedes einzelne Zeichen geprueft werden kann. Stimmt die Laenge des ersten Strings mit dem Suchbegriff nicht ueberein, generiert das Programm die Meldung "NEIN" ueber die else If-Schleife. Rueckgabetyp der Methode ist das Stringobjekt "Output". Methode searchBackslash() ========================= Dieser Methode muss ein String mitgegeben werden. Das Programm wandelt diesen String in ein Array und prueft auf das vorhandensein eines Backslashes. Ist dieser vorhanden und steht dieser Zwischen zwei eckigen Klammern, dann startet eine For-Schleife und vergleicht die Zeichen nach dem Backslash auf Sonderzeichen. Sind Sonderzeichen vorhanden, dann setzt die Switch-Schleife ein Flag, welches in der Methode searchBrace() benoetigt wird. Das zweite If-Statement ruft sich auf, wenn kein Backslash aber Sonderzeichen zwischen Klammern vorhanden sind. Ist dies der Fall, dann gibt es eine Fehlermeldung "FALSCHE EINGABE". Die Methode hat keinen Rckgabewert. Methode searchBraces() ====================== Die Methode searchBraces() dient dazu, vorhanden Klammern (Auf und/oder Zu) im Suchbegriff zu finden. Zuerst sucht das Programm, mit der Methode indexOf(), nach KlammerAuf und schreibt die Position in die Var. indBegin. Dann sucht das Programm die KlammerZu und verwendet dazu die Methode lastIndexOf(). Sind beide vorhanden faellt man in die If-Schleife. Hier wird zwischen den Klammern, ein neuer Substring erzeugt und in die Variable subString geschrieben. In der If-Schleife gibt es zwei While-Schleifen mit welchen die Anzahl der KlammerAuf bzw. KlammerZu abgezaehlt wird. Diese Variable benoetigt das naechste If-Statement zusammen mit dem nicht vorhandensein der Exception '^' kommt man in dieses Statement. Jetzt uebergibt man die Variable SubString der Methode searchBackslash(). Diese sucht nach Backslash und oder Sonderzeichen und setzt passende Flags. Ist kein Backslash vorhanden, werden alle Zeichen zwischen den Klammern mit dem ersten String ueberprueft. Ist eines davon richtig, setzt sich die Ausgabe auf "JA". Laeuft die Schleife bis ans Ende durch, dann kommt die Meldung "NEIN". In einer Else If-Schleife prueft das Programm auf das Ausnahmezeichen. Ist dieses vorhanden, erzeugt das Programm einen neuen Substring und uebergibt diesen der searchBackslash() Methode. Diese Methode setzt die benoetigten Flags, wie oben beschrieben. Mit einer For-Schleife werden Uebereinstimmungen zwischen dem ersten String und dem String zwischen der Klammer geprueft und erhoeht einen Counter um den Wert eins. Ist diese Var. countException groeer als eins, dann stimmt ein Zeichen mit dem Suchstring ueberein und die Ausgabe "NEIN" generiert sich. Hier handelt es sich um die Negation was soviel bedeutet, dass nur Zeichen welche nicht zum ersten String gleich sind, die Ausgabe "JA" erzeugen. Sobald eines passt, wird die Meldung "NEIN" generiert. Eine weitere else If-Schleife erzeugt die Fehlermeldung "FALSCHE EINGABE", wenn mehr als zwei Klammern vorhanden sind und das Flag von der searchBackslash() Methode gesetzt wurde. Methode display() ================= Diese Methode erzeugt die Ausgabe, sofern die Variable Output nicht null ist. 4105/10525/Wildcard.html0100664000113000011500000001603210166517273014076 0ustar prippripeadm EPROG-LU - Aufgabe 3138 (Wildcards)

3138 Wildcard Wildcards
Kategorie:String
Klasse:mittel
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Wildcard.txt, Wildcard.java, *.java

Kurzbeschreibung:

Ein String wird mit einem Suchbegriff verglichen.

Allgemeine Hinweise:

Aufgabenstellung:

Ihr Programm soll zwei Strings einlesen. Der zweite String enthält einen Suchbegriff. Im Suchbegriff haben die folgenden Zeichen eine spezielle Bedeutung:

? * [ ] ^ \

Diese Zeichen werden "Wildcards" genannt. Dabei steht ein Fragezeichen für ein beliebiges Zeichen, ein Stern für einen beliebigen Teilstring (kann auch leer sein) und in eckige Klammern eingeschlossene Zeichen für eines dieser Zeichen.
Wenn aber das erste Zeichen in der eckigen Klammer ein Hochzeichen ^ ist, dann ist jedes Zeichen, das nicht in der Klammer vorkommt, passend. (Siehe hierzu auch die Spezifikation des Erstrundenbeispiels, wo diese Themen erschöpfend erläutert werden).

Mit dem verkehrten Schrägstrich wird die Spezialbedeutung des nächsten Zeichens aufgehoben.

Ihr Programm soll feststellen, ob der Suchbegriff zum ersten String paßt.
Dazu müssen sie den Suchbegriff in Einzelteile zerlegen (jeweils zwischen 2 Sternen) und für jeden Teil prüfen, ob Sie eine Übereinstimmung im ersten String finden (wobei Sie für jeden Teil erst ab der Stelle suchen dürfen, wo Sie mit dem vorhergehenden Teil aufgehört haben). Wenn der Suchbegriff nicht mit einem Stern beginnt, muß der erste Teil mit dem Anfang des ersten Strings übereinstimmen; analoges gilt für das Ende.

Eingabedaten:

Lesen Sie zwei Strings ein. Der erste String darf maximal 30 Zeichen lang sein und unterliegt keinerlei syntaktischen Beschränkungen.

Der zweite String enthält den Suchbegriff. Die Sonderzeichen müssen syntaktisch korrekt gesetzt werden oder durch einen Backslash aufgehoben werden (Falsch wäre z.B. [a[b] , da die zweite öffnende Klammer an dieser Stelle nicht stehen darf. Statt dessen müßte [a\[b] eingegeben werden.)

Der zweite String darf maximal 30 Zeichen lang sein.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm "JA" ausgeben, falls der Vergleich positiv ist, ansonsten "NEIN". Geben Sie danach einen Zeilenvorschub aus.

Fehlerbehandlung:

Bei fehlerhaften Eingabedaten ist die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, auszugeben.

Lesen Sie aber auf jeden Fall beide Strings ein, auch wenn schon der erste fehlerhaft ist.

Beispiele:

Eingabedaten
Erich E?*[gh]

Hallo H*x*

Ausgabedaten
JA

NEIN


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Wildcard < Wildcard.i1 > Wildcard.out1

Das erzeugte File Wildcard.out1 können Sie dann mit dem mitgelieferten Outputfile Wildcard.o1 vergleichen. 4105/10789/0040777000113000011500000000000010166517273011476 5ustar prippripeadm4105/10789/Compchar.java0100444000113000011500000000526210166517273014071 0ustar prippripeadmimport eprog.*; public class Compchar{ public static void main(String[] args){ try{ //Deklaration: char VglzeichenChar; int Vglzeichen; int i = 0; String VglZeichenString = new String(); String SuchbegriffString = new String(); char SuchbegriffChar; int SuchbegriffZeichen; String Ergebnis = new String(); Ergebnis = "NEIN"; int Backslash = 92; int KlammerAuf = 91; int Ausnahme = 94; //Eingabe einlesen VglZeichenString = EprogIO.readWord(); //Vergleichszeichen einlesen SuchbegriffString = EprogIO.readWord(); //Suchbegriff einlesen VglzeichenChar = VglZeichenString.charAt(0); //Das Vergleichszeichen String wird in ein einziges Zeichen umgewandelt Vglzeichen = (int)VglzeichenChar; // Und jetzt in eine Zahl SuchbegriffChar = SuchbegriffString.charAt(i); //Das selbe beim Suchbegriff String, das Zeichen an der Stelle i wird umgewandelt SuchbegriffZeichen = (int)SuchbegriffChar; //Vergleich //1.Sonderzeichen: Backslash in der Schleife while (SuchbegriffZeichen == Backslash){ i++; SuchbegriffChar = SuchbegriffString.charAt(i); SuchbegriffZeichen = (int)SuchbegriffChar; //zum nchsten Zeichen springen } if (SuchbegriffZeichen == Vglzeichen){ Ergebnis = "JA"; } //2.Sonderzeichen: Fragezeichen ergibt JA int Fragezeichen; Fragezeichen = 63; if (SuchbegriffZeichen == Fragezeichen){ Ergebnis = "JA"; } //3.Sonderzeichen: KlammerAuf if (SuchbegriffZeichen == KlammerAuf){ i++; SuchbegriffChar = SuchbegriffString.charAt(i); SuchbegriffZeichen = (int)SuchbegriffChar; //zum nchsten Zeichen springen if (SuchbegriffZeichen == Ausnahme){ int y; //Hilfsvariable mit kurzer Lebensdauer y = SuchbegriffString.indexOf(VglzeichenChar); //Suchbegriff wird mit indexOf nach dem Vergleichszeichen durchsucht, gibt -1 aus, falls nicht enthalten. if (y < 0){ //JA, wenn es nicht enthalten ist Ergebnis = "JA"; } }else{ int x; //Hilfsvariable mit kurzer Lebensdauer x = SuchbegriffString.indexOf(VglzeichenChar); //indexOf gibt bei Erfolg die Stelle des Zeichens aus, also eine Zahl >= 0 if (x >= 0){ //jetzt groesser null Ergebnis = "JA"; } } } EprogIO.println(Ergebnis); //Das Ergebnis wird ausgegeben }catch(Exception e){EprogIO.println("FALSCHE EINGABE");} } } //Fertig 4105/10789/Wildcard.java0100444000113000011500000000305210166517273014061 0ustar prippripeadmimport eprog.*; public class Wildcard { public static void main(String[] args) { try { //Eingabe des Wortes das eberprueft werden soll String eingabe = EprogIO.readWord(); //Eingabe des Suchebgriffs String suchbegriff = EprogIO.readWord(); //Ein leerer String namens muster wird geffnet String muster = ""; for (int i = 0; i < suchbegriff.length(); i++) { //wenn im Suchbegriff ein ? vorkommt, soll er dieses Zeichen in //einen . umschreiben if (suchbegriff.charAt(i) == '?') { muster += "."; // wenn im Suchbegriff ein * vorkommt wird dieser in einen //Punkt umgeschrieben } else if (suchbegriff.charAt(i) == '*') { muster += ".*"; //Wenn im Suchbegriff ein \ vorkommt, soll das Programm //eien \ machen, das nchste zeichen einfach uebernehmen // und zum uebernaechen Zeichen weiterspringen } else if (suchbegriff.charAt(i) == '\\') { muster += "\\"; if (i+1 < suchbegriff.length()){ muster += suchbegriff.charAt(i+1); i++; } } else { muster += suchbegriff.charAt(i); } } // nun wird ueberprueft of die eingabe mit dem muster ebereinstimmt // wenn ja, dann soll JA ausgegeben werden if (eingabe.matches(muster)) { EprogIO.println ("JA"); } // wenn eingabe und muster nicht bereinstimmten, wird NEIN // ausgegeben else { EprogIO.println ("NEIN"); } } catch (Exception e) { EprogIO.println ("FALSCHE EINGABE"); } } } 4105/10789/Wildcard.txt0100444000113000011500000000546510166517273013771 0ustar prippripeadm * * * * * * * * * * * * * * * * * *Name: Spitzer Peter * *MatrNr. 0425549 * *E-MAil: peter_spitzer@gmx.at * * * * * * * * * * * * * * * * * * * * Kategorie: String Klasse: mittel Kurzbeschreibung: Ein String wird mit einem Suchbegriff verglichen. Aufgabenstellung: Ihr Programm soll zwei Strings einlesen. Der zweite String enthlt einen Suchbegriff. Im Suchbegriff haben die folgenden Zeichen eine spezielle Bedeutung: ? * [ ] ^ \ Diese Zeichen werden "Wildcards" genannt. Dabei steht ein Fragezeichen fr ein beliebiges Zeichen, ein Stern fr einen beliebigen Teilstring (kann auch leer sein) und in eckige Klammern eingeschlossene Zeichen fr eines dieser Zeichen. Wenn aber das erste Zeichen in der eckigen Klammer ein Hochzeichen ^ ist, dann ist jedes Zeichen, das nicht in der Klammer vorkommt, passend. Mit dem verkehrten Schrgstrich wird die Spezialbedeutung des nchsten Zeichens aufgehoben. Ihr Programm soll feststellen, ob der Suchbegriff zum ersten String pat. Dazu mssen sie den Suchbegriff in Einzelteile zerlegen (jeweils zwischen 2 Sternen) und fr jeden Teil prfen, ob Sie eine bereinstimmung im ersten String finden (wobei Sie fr jeden Teil erst ab der Stelle suchen drfen, wo Sie mit dem vorhergehenden Teil aufgehrt haben). Wenn der Suchbegriff nicht mit einem Stern beginnt, mu der erste Teil mit dem Anfang des ersten Strings bereinstimmen; analoges gilt fr das Ende. Beispiele: Eingabedaten Erich E?*[gh] Hallo H*x* Ausgabedaten JA NEIN PERSOENLICHE BESCHREIBUNG DES PROGRAMMS: Ich arbeite in dieser Runde mit regulren Ausdrcken (siehe eingabe.MATCHES(muster)) Zu Beginn des Programms werden 2 Strings (eingabe und suchbegriff) eingelesen. Anschlieend wird ein leerer String namens "muster" geffnet. Nun wird der string "suchbegriff" zeichen fr zeichen durchgelaufen und ueberprueft ob sich eins, wie in der Spezifikation genanntes, Sonderzeichen darin befindet. Bei regulren Ausdrcken sind "[ ]" bzw "^" schon deffiniert. Aus diesem Grund muessen nur das "?", "*" und "\" nher behandelt werden. Im Falle des "?" schreibt das Programm das Zeichen in einen "." und im Falle eines "*" in ".*" um. Wenn sich nun ein "\" in dem Suchebegriff befindet (welches dazu dient das das nchste Zeichen "gequotet" wird, d.h. einfach uebernommen), dann schreibt das Programm einen "\" , das naechste Zeichen wird bernommen und spring zum naechsten Zeichen weiter (i++) Dieser umgeaenderte "suchbegriff" wird unter "muster" abgespeicher. Und anschlieend mittels der Operation matches verglichen. Wenn der EingabeString nun mit dem MusterString bereinstimmt, wird ein "JA" ausgegeben, andern Falls ein "NEIN". Im Falle einer Exception wird "FALSCHE EINGABE" ausgegeben. 4105/10789/Wildcard.html0100664000113000011500000001603210166517273014112 0ustar prippripeadm EPROG-LU - Aufgabe 3138 (Wildcards)

3138 Wildcard Wildcards
Kategorie:String
Klasse:mittel
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Wildcard.txt, Wildcard.java, *.java

Kurzbeschreibung:

Ein String wird mit einem Suchbegriff verglichen.

Allgemeine Hinweise:

Aufgabenstellung:

Ihr Programm soll zwei Strings einlesen. Der zweite String enthält einen Suchbegriff. Im Suchbegriff haben die folgenden Zeichen eine spezielle Bedeutung:

? * [ ] ^ \

Diese Zeichen werden "Wildcards" genannt. Dabei steht ein Fragezeichen für ein beliebiges Zeichen, ein Stern für einen beliebigen Teilstring (kann auch leer sein) und in eckige Klammern eingeschlossene Zeichen für eines dieser Zeichen.
Wenn aber das erste Zeichen in der eckigen Klammer ein Hochzeichen ^ ist, dann ist jedes Zeichen, das nicht in der Klammer vorkommt, passend. (Siehe hierzu auch die Spezifikation des Erstrundenbeispiels, wo diese Themen erschöpfend erläutert werden).

Mit dem verkehrten Schrägstrich wird die Spezialbedeutung des nächsten Zeichens aufgehoben.

Ihr Programm soll feststellen, ob der Suchbegriff zum ersten String paßt.
Dazu müssen sie den Suchbegriff in Einzelteile zerlegen (jeweils zwischen 2 Sternen) und für jeden Teil prüfen, ob Sie eine Übereinstimmung im ersten String finden (wobei Sie für jeden Teil erst ab der Stelle suchen dürfen, wo Sie mit dem vorhergehenden Teil aufgehört haben). Wenn der Suchbegriff nicht mit einem Stern beginnt, muß der erste Teil mit dem Anfang des ersten Strings übereinstimmen; analoges gilt für das Ende.

Eingabedaten:

Lesen Sie zwei Strings ein. Der erste String darf maximal 30 Zeichen lang sein und unterliegt keinerlei syntaktischen Beschränkungen.

Der zweite String enthält den Suchbegriff. Die Sonderzeichen müssen syntaktisch korrekt gesetzt werden oder durch einen Backslash aufgehoben werden (Falsch wäre z.B. [a[b] , da die zweite öffnende Klammer an dieser Stelle nicht stehen darf. Statt dessen müßte [a\[b] eingegeben werden.)

Der zweite String darf maximal 30 Zeichen lang sein.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm "JA" ausgeben, falls der Vergleich positiv ist, ansonsten "NEIN". Geben Sie danach einen Zeilenvorschub aus.

Fehlerbehandlung:

Bei fehlerhaften Eingabedaten ist die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, auszugeben.

Lesen Sie aber auf jeden Fall beide Strings ein, auch wenn schon der erste fehlerhaft ist.

Beispiele:

Eingabedaten
Erich E?*[gh]

Hallo H*x*

Ausgabedaten
JA

NEIN


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Wildcard < Wildcard.i1 > Wildcard.out1

Das erzeugte File Wildcard.out1 können Sie dann mit dem mitgelieferten Outputfile Wildcard.o1 vergleichen. 4113/0040777000113000011500000000000010166517274011006 5ustar prippripeadm4113/html.html0100666000113000011500000002611210166517274012637 0ustar prippripeadm EPROG-LU - Aufgabe 4113 (HTML Parser)

4113 html HTML Parser
Kategorie:Informatik
Klasse:schwer
Eingabe:Siehe Spezifikation
Ausgabe:Siehe Spezifikation
Abzugebende Files: html.txt, Main.java, html/*.java , 10390.txt, 10823.txt

Kurzbeschreibung:

Das Programm soll eine eingeschränkte Menge von HTML Tags (<HEAD>, <BODY>, ...) nach vorgegebenen Regeln verarbeiten knnen. Eingeben wird eine Stringfolge (maximale Länge 300), die aus den HTML Tags und dem Text besteht. Die Einhaltung der vorgegebenen Syntax soll überprüft werden (z. B. Tags mssen wieder geschlossen werden) und bei fehlerhafter Syntax soll eine Fehlermeldung ausgeben werden.

Allgemeine Hinweise:

Aufgabenbeschreibung

Bitte beachten Sie, dass dieses Programm eine Eingabe ähnlich zu HTML Dokumenten verarbeiten können soll, jedoch nur der folgenden Spezifikation genügen und eben diesen Funktionsumfang erfüllen soll.

Das Programm soll eine Stringfolge einlesen und die unten nher spezifizierten HTML Tags interpretieren knnen. Der Text kann nicht formatiert ausgegeben werden, es soll daher nur angegeben werden, in welcher Art er erscheinen wrde (d. h. eine kurze Interpretation (<h2> = Text_sehr_gross, <h3> = Text_gross, ..), gefolgt von einem Leerzeichen, dem unformatierten Text sowie einem Semikolon und einem Leerzeichen. Für Tabellen soll "Tabelle" ausgegeben werden, danach jeweils mit Leerzeichen getrennt wie viele Spalten und Zeilen sie hat und schlielich der Text der Zellen (so formatiert wie oben genannt). Grafiken, Stylesheets und Scripte sind nicht erlaubt. Tags mssen immer geschlossen werden, d. h. einem <xxxx> folgt immmer ein entsprechendes </xxxx>. Einzige Ausnahme ist das Tag <BR>, fr das es kein schieendes Tag gibt (falls doch so ist das als fehlerhaft anzusehen). Die Ausgabe des gesamten Programms wird mit "Ende" abgeschlossen.

Erlaubte Tags und die anzuzeigende Interpretation, wobei "-" fr keine Interpretation steht:

<xxxx>: Interpretation

<HTML> Konstruktor, muss immer vorhanden sein: -

<HEAD> innerhalb dieses Tags darf nur folgender Tag stehen

<TITLE>: fr <HEAD> -, fr <TITLE> "Titel"

<BODY> alle anderen Tags sollen innerhalb dieses Tags stehen : -

<h2> innerhalb dieses Tags ist Text : "Text_sehr_gross"

<h3> innerhalb dieses Tags ist Text : "Text_gross"

<h4> innerhalb dieses Tags ist Text : "Text_mittel"

<h5> innerhalb dieses Tags ist Text : "Text_normal"

<BR> Zeilenumbruch soll auch in Ausgabe vollzogen werden: -

<TABLE> Konstruktor fr eine Tabelle; fr jede Tabelle ist "Tabelle" gefolgt von einem Leerzeichen, der Spaltenzahl, Leerzeichen, Zeilenzahl auszugeben; danach folgt der Inhalt der Zellen formatiert wie oben angegeben. Alle folgenden Tags stehen innerhalb dieses Tags (<TBODY> muss genau ein mal innerhalb dieses Tags stehen): -

<TBODY> die folgenden zwei Tags stehen innerhalb: -

<TR> fr neue Zeile: -

<TD> fr neue Spalte: -

Weiters gelten folgende Einschränkungen und Hinweise:

Eingabedaten:

Lesen Sie die Stringfolge ein und interpretieren Sie diese entsprechend den Vorgaben. Um die Verarbeitung zu erleichtern werden von der String-Einlesefunktion immer Strings geliefert, die entweder aus Tags oder aus Text bestehen (und nicht beides gemeinsam). Der Eingabedatensatz wird immer mit dem </HTML> Tag abgeschlossen.

Ausgabedaten:

Die Ausgabedaten sind gem obenstehender Aufgabenbeschreibung zu auszugeben. Beachten Sie dabei bitte insbesonders den Unterabschnitt "Einschrnkungen und Hinweise".

Fehlerbehandlung:

Alle Datenstze sollen immer bis zum Ende eingelesen werden. Bei fehlerhaften Eingabestzen (fehlerhafte bzw. fehlende Tags, nicht geschlossene Tags) soll ein "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgegeben werden.

Die maximal zulässige Gesamtlänge errechnet sich aus der Summe der Teillängen der jeweils von der String-Einlesefunktion gelesenen Teilstrings. Bei einer Überschreitung ist mit "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub zu reagieren. Jedenfalls sind die Eingabedaten bis zum Ende des Datensatzes einzulesen.

Beispiele:

Eingabedaten
<HTML> <HEAD> <TITLE> Hallo </TITLE> </HEAD> <BODY> <BR> <h2> Dies ist ein Interpreter </h2> <BR> <h4> kleiner </h4> </BODY> </HTML>

<HTML> <HEAD> <TITLE> Hallo </TITLE> </HEAD> <BODY> <TABLE> <TBODY> <TR> <TD> <h5> Tabelle </h5> </TD> </TR> </TBODY> </TABLE> </BODY> </HTML>

Ausgabedaten
Titel Hallo;
Text_sehr_gross Dies ist ein Interpreter;
Text_mittel kleiner; Ende

Titel Hallo; Tabelle 1 1 Text_normal Tabelle; Ende

Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Main < html.i1 > html.out1

Das erzeugte File html.out1 können Sie dann mit dem mitgelieferten Outputfile html.o1 vergleichen. 4113/html.i10100664000113000011500000000020510166517273012174 0ustar prippripeadm Hallo

Dies ist ein Interpreter


kleiner

4113/html.o10100664000113000011500000000012110166517273012177 0ustar prippripeadmTitel Hallo; Text_sehr_gross Dies ist ein Interpreter; Text_mittel kleiner; Ende 4113/html.i20100664000113000011500000000021710166517274012201 0ustar prippripeadm Hallo
Tabelle
4113/html.o20100664000113000011500000000006310166517274012206 0ustar prippripeadmTitel Hallo; Tabelle 1 1 Text_normal Tabelle; Ende 4113/10390/0040777000113000011500000000000010166517274011462 5ustar prippripeadm4113/10390/Konvneck.java0100644000113000011500000001151110166517274014073 0ustar prippripeadm/*Author: Slavica Barbaric Bsp:3154 */ import eprog.*; //importieren der eprog-Klasse import java.util.*; public class Konvneck { public static class EOF extends java.lang.Throwable {}; public static class Punkt //Definition einer neuen Klasse "Punkt", //die die Koordinaten x, y und folgende //Methoden enthaelt: { float x; float y; public Punkt(float x1,float y1) //Konstruktor der Klasse Punkt { this.x = x1; this.y = y1; }; public Punkt() throws EprogException,EOF { String readstr =EprogIO.readWord(); readstr.trim(); //delete whitespace if ((readstr.charAt(0) != '(') || (readstr.charAt(readstr.length()-1) != ')')){ if (readstr.charAt(0) == '='){ throw(new EOF()); //This is not an error but merely the end of input }else{ throw(new EprogException("Parserfehler beim Koordinatenpaar [sollte in form (x,y) sein]")); } } if ((readstr.length() < 5) || (readstr.indexOf(",") == -1)) throw new EprogException(); // das Eingabekoordinatenpaar hat mindestens laenge 5: (0,0) this.x=Float.parseFloat(readstr.substring(1,readstr.indexOf(','))); //string representation of the x value is here this.y=Float.parseFloat(readstr.substring(readstr.indexOf(',')+1,readstr.length()-1));//string representation of the y value is here if (!this.InputTest()) throw new EprogException("Falscher Eingabebereich"); } public Boolean Equals(Punkt p) //Methode um zu testen, ob sich zwei //Punkte paarweise voneinander //unterscheiden { return (this.x == p.x && this.y == p.y); } public Boolean InputTest() //Methode um die Zulaessigkeit der //Eingabe zu pruefen { if ((x < -100) || (x > 100) || (y < -100) || (y > 100 )) return false; else return true; } public float isLeft(Punkt a,Punkt b) { return ( (b.x - a.x) * (this.y - a.y) - (this.x - a.x) * (b.y - a.y) ); } } public static boolean cross(Punkt g1, Punkt g2, Punkt f1, Punkt f2) { if ( (f1.isLeft(g1,g2) < 0) != (f2.isLeft(g1,g2)<0 )) { if((g1.isLeft(f1,f2) <0 ) != (g2.isLeft(f1,f2) <0)) { return true; /* Geraden Schneiden da sowohl die Punkte g1 und g2 auf verchiedenen Seiten gegenueber der geraden durch (f1, f2) liegen, als auch DIE pUNKTE F1 UND F2 GEGENUEBER DER gERADEN (g1,g2)*/ } } return false; } public static void main(String[] args) //Methode main { //try-catch-Block um Exceptions zu fangen try { //Erzeugung von 3 Objekten des Typs Punkt und Einlesen //der Punktekoordinaten mittels der EprogIO Vector v= new Vector(); boolean konkav=false; int konvex=0; //0=unknown 1=konvex boolean falscheEingabe=false; try{ while(true){ try { v.addElement(new Punkt()); } catch (EprogException e){ //Siehe Fehlerbehandlung: Es sind so lange strings einzulesen bis = eingegeben wird. //Fehler heiszt also nicht dasz nicht weiterhin eingelesen werden soll falscheEingabe = true; } if (v.size() > 2){ float f=v.elementAt(v.size()-1).isLeft(v.elementAt(v.size()-3), v.elementAt(v.size()-2)); if (f==0) falscheEingabe = true; if( !konkav && (((konvex < 0) && (f >0)) || ((konvex > 0) && (f <0)) ) ) { konkav = true; } } } } catch (EOF e) {} //exit when EOF is caught if (falscheEingabe) throw new EprogException(); // No undefined characters Read if ((v.size() < 3) || (v.size() >15)) throw new EprogException(); //vector size is OK if (!konkav ){ //Ueberpruefe den ersten Punkt bez. der letzten 2 float f=v.elementAt(0).isLeft(v.elementAt(v.size()-2), v.elementAt(v.size()-1)); if (f==0) throw new EprogException(); if( !konkav && (((konvex < 0) && (f >0)) || ((konvex > 0) && (f <0))) ){ // entweder Konkavitaet schon festgestellt, oder tangente hat naechsten punkt auf entgegenge- //setzter Seite im Vergleich zur Vorgaengertangente konkav = true; } } int i =0, j=0; for ( ; i v= new Vector()] Weiter im Program wird auf konvexivitaet und konkavitaet ueberprueft. Was das ist ist in der Spezifikation gegeben.4113/10390/315401.gif0100644000113000011500000000337110166517274012703 0ustar prippripeadmGIF89a3f3333f333ff3fffff3f̙3f3f3333f3333333333f333333f3f33f3ff3f3f33333f33̙33333f3333333f333ff3fffff3f3f33ff3f3f3fffff3fffffffffff3ffff̙fff3fffffff3fffff3f3333f333ff3fffff3f̙̙̙3̙f̙̙̙3f3f̙3333f3̙33ff3fff̙ff3f̙̙3f̙3f̙3f3333f333ff3fffff3f̙3f3f, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗$ IM2oSL>ɳQA&-HӧPXzR`65Y9ɖ=iՄjʽSaܹx_˗޾i LXˆ]N̸ǐ#KL˘Q^Π~MҨNMz5kЮ?M۸szbl Σ+_۸甴7wSzqѩW>dv s;xӟ$o|O>_?I_}Ԁ#ȟ|)1hQbxq "ؠX!!h8)x9"y":I1QEby#yٛqِUɚ e҉ Ṧ񙐟qgRnr(^hvx|&(B)l}̥A:*jzM뙧5Z +ifh,")=ۧ+f[жvޞ ;of;o?ooWZ\_T63 .\U81#i_@~g`F.Au! ( ;4113/10390/Konvneck.html0100664000113000011500000001670410166517274014131 0ustar prippripeadm EPROG-LU - Aufgabe 3154 (konvexes Vieleck)
3154 Konvneck konvexes Vieleck
Kategorie:Grafik
Klasse:schwer
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Konvneck.txt, Konvneck.java, *.java

Kurzbeschreibung:

Die Eckpunkte eines Vielecks werden eingelesen; es wird überprüft, ob die Kanten des Vielecks einander schneiden. Wenn dies nicht der Fall ist, wird festgestellt, ob das Vieleck konvex ist.

Allgemeine Hinweise:

  • Sie haben Lösungen (und Spezifikationen) aus der 1. Runde von anderen Studenten erhalten, die Ihnen Ihre Aufgabe erleichtern sollen. Wählen Sie eine Lösung aus, die Ihnen hinsichtlich Lesbarkeit, Programmierstil, Korrektheit und Verwendbarkeit am besten erscheint. Verwenden Sie diese Lösung in Ihrem Programm. Sie können auch die anderen Lösungen einsetzen.
  • Merken Sie sich die Lösungsnummer des ausgewählten Beispieles für die Abgabe. Diese Nummer müssen Sie bei der Abgabe angeben. Geben Sie nur jene Lösungsnummer an, die Sie auch wirklich ausgewählt haben.
  • Erstellen Sie für alle Lösungen zu diesem Beispiel (siehe: "Abzugebende Files") ein File mit dem Namen <number>.txt. und schreiben in dieses File ein Review (=Kritik) zu der Lösung. Diese Reviews erhalten dann die TeilnehmerIn von dem/der die Lösung stammt. Beachten Sie das bitte bei der Form Ihrer Kritik.
  • Sie können für die Lösung der gewählten Aufgabe eine oder mehrere Klassen programmieren. Die Klasse Konvneck.java muß aber die Methode main enthalten. Weiters müssen alle abgegebenen Klassenfiles in demselben Verzeichnis vorliegen, Pfadangaben sind nicht gestattet.
  • Achten Sie auf die korrekten Konventionen der Groß/Kleinschreibung bei Klassen und Methoden!
    [Wir tun das jetzt auch :-)]
  • Falls Ihre Lösung einen Exit Code zurueckliefert, so achten Sie darauf, dass dieser den Wert 0 hat. Bei allen anderen Werten können Probleme bei der Bewertung und in weiterer Folge unbeabsichtigte Punkteabzüge auftreten.
  • Ihre Lösung darf nur genau jene Ausgabedaten liefern, die in der Spezifikation verlangt werden. Die Ausgaben Ihrer Lösung werden automatisch mit Referenzdaten verglichen; etwaige Abweichungen führen zu Punkteabzügen!
  • Testen Sie Ihre Lösung vor der Abgabe mit der mitgelieferten Eingabedatei. Geben Sie Ihre Lösung erst ab, wenn die Ausgaben Ihrer Lösung mit der ebenfalls mitgelieferten Ausgabedatei übereinstimmen! Testen Sie Ihre Lösung auch mit anderen Eingabedaten.
  • Verwenden Sie nur das von uns mitgelieferten Package eprog für Ihre Ein/Ausgaben. Klassen, die Packages oder Klassen ausserhalb der verwendeten Übungsumgebung (Java2, Standard Edition, Version 1.5.0) verwenden, können von uns nicht getestet werden und werden daher mit 0 Punkten bewertet!
  • Schreiben Sie Ihre Klasse(n) möglichst allgemein und kommentieren Sie diese gut. Erstellen Sie weiters eine übersichtliche und verständliche Dokumentation. Damit erhöhen Sie Ihre Chancen, daß andere Studenten in der nächsten Runde Ihre Lösung wählen und Ihnen damit zu Zusatzpunkten verhelfen!

Aufgabenstellung:

Lesen Sie die Koordinatenpaare der Eckpunkte eines Vielecks ein. Prüfen Sie, ob sich zwei Kanten des Vielecks schneiden, wie dies im folgenden Beispiel der Fall ist:

(0,0) (2,0) (2,4) (4,4) (4,2) (0,2)

Wenn dies nicht der Fall ist, stellen Sie fest, ob das Vieleck konvex ist (daß heißt, das alle Innenwinkel<180 sind). Dazu sollen Sie wie folgt vorgehen:

Seien P1, P2, ..., Pn die Eckpunkte des Vielecks. Ermitteln Sie die Lage des Punktes P3 bezüglich der Gerade, die durch P1 und P2 geht (verwenden Sie dazu das Programm aus der ersten Runde). Wenn dieser Punkt LINKS liegt, dann muß auch P4 links bezüglich (P2,P3) liegen, P5 links bezüglich (P3,P4), ..., Pn bez. (Pn-2,Pn-1), P1 bez. (Pn-1,Pn) und P2 bez. (Pn, P1).

Klarerweise gilt die Umkehrung, wenn P3 RECHTS bezüglich (P1,P2) liegt: Dann muß auch P4 RECHTS bez. (P2,P3) liegen usw.

Wenn einer der Punkte AUF der Geraden seiner Vorgängerpunkte liegt, dann ist der Eingabedatensatz fehlerhaft (weil einer der Punkte gar kein Eckpunkt ist).
ACHTUNG: Diese Bedingung muß von Ihrem Programm auch dann überprüft werden, wenn Sie festgestellt haben, daß sich zwei Kanten schneiden!

Eingabedaten:

Lesen Sie die Koordinatenpaare des Vielecks als Strings ein, die folgenden Aufbau haben müssen: "(x,y)" wobei x und y Zahlen sind (z.B. "(-5.5,2.75)" ). Die eingelesenen x- und y-Koordinaten müssen im Bereich [-100,100] liegen.

Der Datensatz wird durch das Zeichen "=", das anstatt eines neuen Koordinatenpaares eingegeben wird, abgeschlossen. Es müssen mindestens 3 und maximal 15 Koordinatenpaare eingegeben werden. Die oben genannte Bedingung, daß keiner der Eckpunkte auf der Gerade seiner Vorgänger liegen darf, muß erfüllt sein.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm "SCHNEIDET" ausgeben, wenn sich mindestens zwei Kanten schneiden, "KONVEX", wenn sich keine Kanten schneiden und das Vieleck konvex ist und "KONKAV", wenn sich keine Kanten schneiden und das Vieleck nicht konvex ist.

Geben Sie danach einen Zeilenvorschub aus.

Fehlerbehandlung:

Genügen die eingegebenen Daten nicht den Bedingungen, so soll Ihr Programm die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Es sind aber solange Strings einzulesen, bis das Abschlußzeichen "=" eingegeben wird.

Beispiele:

Eingabedaten
(0,0) (2,0) (2,4) (4,4) (4,2) (0,2) =

(0,0) (2,0) (4,2) (4,4) (2,4) (0,2) =

Ausgabedaten
SCHNEIDET

KONVEX


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Konvneck < Konvneck.i1 > Konvneck.out1

Das erzeugte File Konvneck.out1 können Sie dann mit dem mitgelieferten Outputfile Konvneck.o1 vergleichen. 4113/10823/0040777000113000011500000000000010166517274011463 5ustar prippripeadm4113/10823/Konvneck.java0100644000113000011500000001312610166517274014100 0ustar prippripeadmimport eprog.*; import java.util.*; import java.awt.geom.*; public class Konvneck extends EprogIO { public static void main(String[] args){ // einlesen der KoordinatenPaare Vector points = new Vector(15); boolean error = false; Point2D.Double prevPoint = null; boolean schnitt = false; String zwLage = ""; for (String input = readWord(); !input.equals("="); input = readWord()) { try { Point2D.Double currentPoint; points.add(currentPoint = koordinaten(input)); // hollt den Punkt aus dem String if(prevPoint != null){ // wenn es nicht der erste Punkt ist if(currentPoint.equals(prevPoint)){ // dann ueberprueft es ob Sie gleich sind error = true; } } prevPoint = currentPoint; } catch (Exception e) { error = true; } } if(points.size() < 3 || points.size() > 15 || error == true){ println("FALSCHE EINGABE"); return; } Vector lines = new Vector(15); for (int k = 1; k < points.size(); k++){ lines.add(new Line2D.Double((Point2D.Double) points.get(k-1), // verbindet vorrigen Punkt (Point2D.Double) points.get(k))); // mit dem folgenden Punkt } lines.add(new Line2D.Double((Point2D.Double) points.lastElement(), // schliess Polygon (Point2D.Double) points.firstElement())); if(schneidet(lines)){ // wenn sich etwas schneidet dann schnitt = true schnitt = true; } int summe = 0; int zwWert = 0; int count = 0; Point2D.Double punkt1, punkt2, punkt3; for(int n = 1; n < (points.size() - 1); n++){ punkt1 = (Point2D.Double) points.get(n-1); punkt2 = (Point2D.Double) points.get(n); punkt3 = (Point2D.Double) points.get(n+1); zwWert = pruefe(punkt1, punkt2, punkt3); // ueberprueft ob es konkav, konvex summe += zwWert; // oder ein Eckpunkt auf einer Kante liegt count++; } int secondLast = (points.size() - 2); punkt1 = (Point2D.Double) points.get(secondLast); punkt2 = (Point2D.Double) points.lastElement(); punkt3 = (Point2D.Double) points.firstElement(); zwWert = pruefe(punkt1, punkt2, punkt3); summe += zwWert; zwLage = lage(summe, count); if(zwLage == "FALSCHE EINGABE"){ // wenn ein Eckpunkt auf einer Kante liegt println(zwLage); // dann gibt es "FALSCHE EINGABE" aus }else{ if(schnitt == true){ // anderenfalls wenn sich Kanten schneiden println("SCHNEIDET"); // wird "SCHNEIDET" ausgegeben }else{ println(zwLage); // wenn das nicht der Fall ist dann } // soll ausgegeben werden ob es Konvex } // oder Konkav ist } // parameter input: die Eingabe in der Form (x,y) // gibt aus: Point2D.Double mit den rausgefilterten Koordinaten static Point2D.Double koordinaten(String input){ StringTokenizer tk = new StringTokenizer(input, "(,)", false); double x = 0,y = 0; String[] koord = new String[tk.countTokens()]; for(int i = 0; i < koord.length; i++){ koord[i] = tk.nextToken(); } x = Double.parseDouble(koord[0]); y = Double.parseDouble(koord[1]); return new Point2D.Double(x,y); } // parameter summe: ein abgespeicherte Wert // parameter count: die anzahl der Schleifendurchgnge // gibt aus: String ob es FALSCHE EINGABE , KONKAV oder KONVEX ist static String lage(int summe, int count){ int remainder = summe % count; String location = ""; if(summe > 1000){ location = "FALSCHE EINGABE"; }else{ if(remainder == 0){ location = "KONKAV"; } if(remainder == 1){ location = "KONVEX"; } } return location; } // parameter punkt1-punk3: Point2D.Double mit den Koordinaten // gibt aus: einen Wert der angibt ob der 3te Punkt rechts, links oder darauf ist bzg. // der Geraden die mit den ersten 2 Punkten gebildet wird static int pruefe(Point2D.Double punkt1, Point2D.Double punkt2, Point2D.Double punkt3){ double x[] = new double[3]; double y[] = new double[3]; x[0] = punkt1.getX(); y[0] = punkt1.getY(); x[1] = punkt2.getX(); y[1] = punkt2.getY(); x[2] = punkt3.getX(); y[2] = punkt3.getY(); int value = 0; double d1 = (x[0] * y[1]) - (x[1]* y[0]); double d2 = x[2] *(y[1] - y[0]) + y[2] *(x[0] - x[1]); if(d2 < d1){ value = 1; //links } if(d2 > d1){ value = 2; //rechts } if(d2 == d1){ value = 1000; //drauf } return value; } // parameter lines: Vector mit Line2D.Double Objekten welche ein Polygon bilden // gibt aus: true wenn sich Kanten des Polygons schneiden static boolean schneidet(Vector lines){ boolean schnittPunkt = false; for (int l = 0; l < lines.size(); l++) { Line2D.Double line1 = (Line2D.Double) lines.get(l); for (int m = 0; m < lines.size(); m++) { Line2D.Double line2 = (Line2D.Double) lines.get(m); if (!line1.equals(line2) && !line1.getP1().equals(line2.getP2()) && !line1.getP2().equals(line2.getP1())){ if (line1.intersectsLine(line2)){ schnittPunkt = true; } } } } return schnittPunkt; } } 4113/10823/Konvneck.txt0100644000113000011500000000150010166517274013767 0ustar prippripeadmTadeusz Slapak Matr.Nr. 0425075 ----------------- Dieses Programm verwendet java.awt.geom.* Klassen Line2D und Point2D. In der Java API Doku stehen mehr Informationen ber diese Klassen. Die main methode liesst den input, konvertiert es zu Line2D.Double Vektoren und dann werden diese ueberprueft mit den jeweiligen methods. koordinaten: konvertiert den input String in Point2D.Double. pruefe: ist der erste Teil der Ueberpruefung ob das Polygon konkav, konvex oder ob ein EckPunkt auf einer Kante liegt filtert die x und y werte raus und schaut ob der 3te Punkt rechts, links oder auf der Geraden liegt (die aus den ersten 2 Punkten gebildet wird) lage: ist der zweite Teil der Ueberpruefung gibt aus ob es konvex, konkav oder ob die Angabe falsch war schneidet: schaut ob sich Kanten schneiden4113/10823/315401.gif0100644000113000011500000000337110166517274012704 0ustar prippripeadmGIF89a3f3333f333ff3fffff3f̙3f3f3333f3333333333f333333f3f33f3ff3f3f33333f33̙33333f3333333f333ff3fffff3f3f33ff3f3f3fffff3fffffffffff3ffff̙fff3fffffff3fffff3f3333f333ff3fffff3f̙̙̙3̙f̙̙̙3f3f̙3333f3̙33ff3fff̙ff3f̙̙3f̙3f̙3f3333f333ff3fffff3f̙3f3f, H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\ɲ˗$ IM2oSL>ɳQA&-HӧPXzR`65Y9ɖ=iՄjʽSaܹx_˗޾i LXˆ]N̸ǐ#KL˘Q^Π~MҨNMz5kЮ?M۸szbl Σ+_۸甴7wSzqѩW>dv s;xӟ$o|O>_?I_}Ԁ#ȟ|)1hQbxq "ؠX!!h8)x9"y":I1QEby#yٛqِUɚ e҉ Ṧ񙐟qgRnr(^hvx|&(B)l}̥A:*jzM뙧5Z +ifh,")=ۧ+f[жvޞ ;of;o?ooWZ\_T63 .\U81#i_@~g`F.Au! ( ;4113/10823/Konvneck.html0100664000113000011500000001670410166517274014132 0ustar prippripeadm EPROG-LU - Aufgabe 3154 (konvexes Vieleck)

3154 Konvneck konvexes Vieleck
Kategorie:Grafik
Klasse:schwer
Eingabe:siehe Spezifikation
Ausgabe:siehe Spezifikation
Abzugebende Files: Konvneck.txt, Konvneck.java, *.java

Kurzbeschreibung:

Die Eckpunkte eines Vielecks werden eingelesen; es wird überprüft, ob die Kanten des Vielecks einander schneiden. Wenn dies nicht der Fall ist, wird festgestellt, ob das Vieleck konvex ist.

Allgemeine Hinweise:

  • Sie haben Lösungen (und Spezifikationen) aus der 1. Runde von anderen Studenten erhalten, die Ihnen Ihre Aufgabe erleichtern sollen. Wählen Sie eine Lösung aus, die Ihnen hinsichtlich Lesbarkeit, Programmierstil, Korrektheit und Verwendbarkeit am besten erscheint. Verwenden Sie diese Lösung in Ihrem Programm. Sie können auch die anderen Lösungen einsetzen.
  • Merken Sie sich die Lösungsnummer des ausgewählten Beispieles für die Abgabe. Diese Nummer müssen Sie bei der Abgabe angeben. Geben Sie nur jene Lösungsnummer an, die Sie auch wirklich ausgewählt haben.
  • Erstellen Sie für alle Lösungen zu diesem Beispiel (siehe: "Abzugebende Files") ein File mit dem Namen <number>.txt. und schreiben in dieses File ein Review (=Kritik) zu der Lösung. Diese Reviews erhalten dann die TeilnehmerIn von dem/der die Lösung stammt. Beachten Sie das bitte bei der Form Ihrer Kritik.
  • Sie können für die Lösung der gewählten Aufgabe eine oder mehrere Klassen programmieren. Die Klasse Konvneck.java muß aber die Methode main enthalten. Weiters müssen alle abgegebenen Klassenfiles in demselben Verzeichnis vorliegen, Pfadangaben sind nicht gestattet.
  • Achten Sie auf die korrekten Konventionen der Groß/Kleinschreibung bei Klassen und Methoden!
    [Wir tun das jetzt auch :-)]
  • Falls Ihre Lösung einen Exit Code zurueckliefert, so achten Sie darauf, dass dieser den Wert 0 hat. Bei allen anderen Werten können Probleme bei der Bewertung und in weiterer Folge unbeabsichtigte Punkteabzüge auftreten.
  • Ihre Lösung darf nur genau jene Ausgabedaten liefern, die in der Spezifikation verlangt werden. Die Ausgaben Ihrer Lösung werden automatisch mit Referenzdaten verglichen; etwaige Abweichungen führen zu Punkteabzügen!
  • Testen Sie Ihre Lösung vor der Abgabe mit der mitgelieferten Eingabedatei. Geben Sie Ihre Lösung erst ab, wenn die Ausgaben Ihrer Lösung mit der ebenfalls mitgelieferten Ausgabedatei übereinstimmen! Testen Sie Ihre Lösung auch mit anderen Eingabedaten.
  • Verwenden Sie nur das von uns mitgelieferten Package eprog für Ihre Ein/Ausgaben. Klassen, die Packages oder Klassen ausserhalb der verwendeten Übungsumgebung (Java2, Standard Edition, Version 1.5.0) verwenden, können von uns nicht getestet werden und werden daher mit 0 Punkten bewertet!
  • Schreiben Sie Ihre Klasse(n) möglichst allgemein und kommentieren Sie diese gut. Erstellen Sie weiters eine übersichtliche und verständliche Dokumentation. Damit erhöhen Sie Ihre Chancen, daß andere Studenten in der nächsten Runde Ihre Lösung wählen und Ihnen damit zu Zusatzpunkten verhelfen!

Aufgabenstellung:

Lesen Sie die Koordinatenpaare der Eckpunkte eines Vielecks ein. Prüfen Sie, ob sich zwei Kanten des Vielecks schneiden, wie dies im folgenden Beispiel der Fall ist:

(0,0) (2,0) (2,4) (4,4) (4,2) (0,2)

Wenn dies nicht der Fall ist, stellen Sie fest, ob das Vieleck konvex ist (daß heißt, das alle Innenwinkel<180 sind). Dazu sollen Sie wie folgt vorgehen:

Seien P1, P2, ..., Pn die Eckpunkte des Vielecks. Ermitteln Sie die Lage des Punktes P3 bezüglich der Gerade, die durch P1 und P2 geht (verwenden Sie dazu das Programm aus der ersten Runde). Wenn dieser Punkt LINKS liegt, dann muß auch P4 links bezüglich (P2,P3) liegen, P5 links bezüglich (P3,P4), ..., Pn bez. (Pn-2,Pn-1), P1 bez. (Pn-1,Pn) und P2 bez. (Pn, P1).

Klarerweise gilt die Umkehrung, wenn P3 RECHTS bezüglich (P1,P2) liegt: Dann muß auch P4 RECHTS bez. (P2,P3) liegen usw.

Wenn einer der Punkte AUF der Geraden seiner Vorgängerpunkte liegt, dann ist der Eingabedatensatz fehlerhaft (weil einer der Punkte gar kein Eckpunkt ist).
ACHTUNG: Diese Bedingung muß von Ihrem Programm auch dann überprüft werden, wenn Sie festgestellt haben, daß sich zwei Kanten schneiden!

Eingabedaten:

Lesen Sie die Koordinatenpaare des Vielecks als Strings ein, die folgenden Aufbau haben müssen: "(x,y)" wobei x und y Zahlen sind (z.B. "(-5.5,2.75)" ). Die eingelesenen x- und y-Koordinaten müssen im Bereich [-100,100] liegen.

Der Datensatz wird durch das Zeichen "=", das anstatt eines neuen Koordinatenpaares eingegeben wird, abgeschlossen. Es müssen mindestens 3 und maximal 15 Koordinatenpaare eingegeben werden. Die oben genannte Bedingung, daß keiner der Eckpunkte auf der Gerade seiner Vorgänger liegen darf, muß erfüllt sein.

Ausgabedaten:

Bei korrekten Eingabedaten soll Ihr Programm "SCHNEIDET" ausgeben, wenn sich mindestens zwei Kanten schneiden, "KONVEX", wenn sich keine Kanten schneiden und das Vieleck konvex ist und "KONKAV", wenn sich keine Kanten schneiden und das Vieleck nicht konvex ist.

Geben Sie danach einen Zeilenvorschub aus.

Fehlerbehandlung:

Genügen die eingegebenen Daten nicht den Bedingungen, so soll Ihr Programm die Meldung "FALSCHE EINGABE", gefolgt von einem Zeilenvorschub, ausgeben.

Es sind aber solange Strings einzulesen, bis das Abschlußzeichen "=" eingegeben wird.

Beispiele:

Eingabedaten
(0,0) (2,0) (2,4) (4,4) (4,2) (0,2) =

(0,0) (2,0) (4,2) (4,4) (2,4) (0,2) =

Ausgabedaten
SCHNEIDET

KONVEX


Testen:

Diese Beispiele dienen nur zur Verdeutlichung der Spezifikation und müssen nicht korrekt formatiert sein. Die korrekte Formatierung entnehmen Sie bitte dem mitgelieferten Outputfile. Zum Testen Ihrer Lösung können Sie aus den mitgelieferten Eingabedaten wie folgt eine Ausgabedatei erzeugen:

java Konvneck < Konvneck.i1 > Konvneck.out1

Das erzeugte File Konvneck.out1 können Sie dann mit dem mitgelieferten Outputfile Konvneck.o1 vergleichen.

Fr Jul 30 13:54:24 CEST 2021
patent_button.gif valid-html401.png elektra.jpg fsfe-logo.png valid-css.png vim.gif anybrowser.gif