// Autor: Martin Heinrich // MatNr: 0125222 // BspNr: 4032 // Titel: Gesamtkapazität eines Kondesatornetzwerkes // Beschreibung: Es soll die Gesamtkapazität eines Kondensatornetzwerkes berechnet werden // Eingabe: Ein String {0..9, +, /, (, )} // Ausgabe: Gesamtkapazität auf int gerundet // Fehlermeldungen: "FALSCHE EINGABE" wenn: // * das Netzwerk aus mehr als 15 Kondensatoren besteht // * ein Kondensator-Wert keine positive Integer-Zahl ist // * beim Parsing ein Fehler auftritt Klassenstruktur --------------- Das Package Kapaz enthält nur die Klasse CapNet, mit deren Hilfe die Aufgabenstellung realisiert werden konnte. Die Klasse Main verwendet nur ein CapNet-Objekt, das Parsing und Berechnen übernimmt, und gibt die entsprechenden Daten aus, wobei die Überprufüng der Kondensatorenobergrenze 15 auch in Main bzw main vorgenommen wird. CapNet: Die folgenden Variablen werden jeweils in prv* gespeichert und mit get*() ausgelesen. *Count gibt an wieviele Kondesatoren im repräsentierten Netzwerk sind. Der Wert 0 gibt an, dass das Netzwerk nicht oder ungültig initialisiert wurde. *Value gibt den Wert (die Kapazität) des repräsentierten Netzwerkes an. Für die aktuelle Aufgabenstellung ist es nicht nötig, dass die tieferen Ebenen des Netzwerkes (also deren CapNet-Objekte) gespeichert werden. findChar() und checkBrackets() sind Klassenmethoden (keine Objektmethoden), weil sie nicht auf die Instanzvariablen zugreifen. Sie könnten auch in einer beliebigen anderen Klasse stehen, in der sie für CapNet zugänglich sind. Codestruktur ------------ setString() dient zur Initialisierung des Kondensatornetzwerkes. Diese Methode vereint die Funktionen von Parsing und Berechnung des Wertes, wobei die Parsingstruktur wie folgt aussieht: Bezeichnung | mögliche Ausdrücke ------------+------------------------------------ Netzwerk | 1. Parallel | 2. Seriell ------------+------------------------------------ Parallel | 1. Parallel/Parallel | 2. "int-Wert > 0" | 3. (Netzwerk) ------------+------------------------------------ Seriell | 1. Seriell+Seriell | 2. "int-Wert > 0" | 3. (Netzwerk) Der einzige nicht reduzierbare Ausdruck ist also "int-Wert > 0". Da untergeordnete Ebenen geklammert sein müssen, ist der erste Schritt die Suche nach + oder /, wobei diese in der aktuellen Ebene sein sollten (also nicht innerhalb runder Klammern). Zu diesem Zweck gibt es die Funktion findChar(). Außerdem dürfen nicht + und / in einer Ebene ungeklammert vorkommen. Eine Ebene enthält + oder / oder keines. In letzterem Fall wird zunächst überprüft, ob die äußeren Zeichen Klammern sind, um den Wert der nächsten Ebene berechnen zu können (Falls die Klammern nicht zum selben Paar gehören, tritt der Fehler in einer unteren Ebene auf). Wenn der Ausdruck weder + noch / enthält, noch geklammert ist, muss es schon der nicht reduzierbare Ausdruck sein, sonst wird die Methode verlassen: Fehler. Wenn ein + oder / gefunden wurde und kein jeweils anderes, werden die Teilstrings links und rechts an die nächste Ebene übergeben. Falls dort keine Fehler gefunden werden, können diese durch die entsprechende Funktion verknüpft werden. Mehrere + oder / werden somit zwar in verschiedenen Ebenen behandelt - also x+(y+z) statt x+y+z oder x/(y/z) statt x/y/z -, aber die Funktionen sind sowieso assoziativ. Falls jedoch die Objektmethode toString() oder andere Ausgaben realisiert werden müssten, sollte das beachtet werden um zu viele Klammern zu verhindern. Der Algorithmus von findChar() (und dementsprechend auch von checkBrackets()) ist vielleicht nicht optimal (der String wird bis zu drei mal durchlaufen), aber... 1. ich konnte diese Passagen nahezu aus meiner Lösung des Beispiels 3061 übernehmen. 2. indexOf() ist möglicherweise besser implementiert als mit Hilfe einer for-Schleife. Das Funktionieren möge man glauben oder überprüfen ;-) Für Fragen stehe ich zur Verfügung. Siehe WhitePages...