/* Beispielloesung zu Blatt 13 - AI 1 - WS 2006/07 nh - 01/2007 */ import IOulm.*; public class EssAahPee { public static final int SURCHARGE = 10; // Zuschlag vom Land public static final int MAX_HEATING_COST_PERCENTAGE = 5; // Max. % Heizkosten public static final int MIN_RESERVES_PERCENTAGE = 7; // Min. % Rueckl. public static final int MAX_RESERVES_PERCENTAGE = 11; // Max. % Rueckl. public static final int MIN_EXCURSION_COST = 10000; // Min. Reisen Euro public static final int MAX_EXCURSION_COST = 20000; // Max. Reisen Euro /* liest eine Integerzahl ein und gibt als Eingabeaufforderung den String aus, der uebergeben wurde; die eingelesene Integerzahl ist auch der Rueckgabewert dieser Methode */ public static int getIntegerValue(String prompt) { boolean readSuccess = false; while (!readSuccess) { Write.Line(prompt); if (Urc.readInt()) { return Urc.getInt(); } Write.Line("Fehler beim Einlesen... Bitte erneut versuchen!"); } return -1; } /* Unter Verwendung der zuvor geschriebenen Methode getIntegerValue lesen wir hier die Anzahl der Studenten ein */ public static int getNumberOfStudents() { return getIntegerValue("Bitte geben Sie die Studierendenanzahl ein!"); } /* Unter Verwendung der zuvor geschriebenen Methode getIntegerValue lesen wir hier die Studiengebuehr pro Student ein */ public static int getFeePerStudent() { return getIntegerValue("Bitte geben Sie Hoehe der Studiengebuehr ein!"); } /* Aus den Eingaben wird hier gemaess Ziffer 3 der Satzung die Hoehe der verfuegbaren Gebuehren berechnet. */ public static int calculateFee(int students, int feePerStudent) { double tmp = (double)(100 + SURCHARGE) / (double)100; return (int) (students * feePerStudent * tmp); } /* Gibt TRUE zurueck, wenn der uebergebene Wert "val" im Intervall von "min" und "max" (ebenfalls als Parameter uebergeben) liegt. */ public static boolean validateLimits(int val, int min, int max) { return (val >= min && val <= max); } /* Unter Verwendung der bereits implementierten Methoden getIntegerValue und validateLimits sowie der relevanten Konstanten wird hier die Hoehe der Heizkosten (in Prozent) eingelesen und sogleich auf "Satzungskonformitaet" ueberprueft; das Einlesen wird solange wiederholt, bis ein gueltiger Wert gelesen werden konnte. */ public static int getHeatingCosts(int fee) { boolean validHeatingCostsEntered = false; int heatingPercentage = 0; while (!validHeatingCostsEntered) { heatingPercentage = getIntegerValue("Bitte geben Sie den Prozentsatz " + "fuer Heizkosten ein!"); validHeatingCostsEntered = validateLimits(heatingPercentage, 0, MAX_HEATING_COST_PERCENTAGE); if (!validHeatingCostsEntered) { Write.Line("Der eingegebene Heizkosten-Prozentsatz " + " ist nicht zulaessig!"); } } return (int)(fee*heatingPercentage/100); } // Analog zur Methode zuvor erfolgt hier das Einlesen der Ruecklagen public static int getReserves(int fee) { boolean validReservesCostsEntered = false; int reservesPercentage = 0; while (!validReservesCostsEntered) { reservesPercentage = getIntegerValue("Bitte geben Sie die Hoehe der " + "geplanten Ruecklagen (in Prozent) ein: "); validReservesCostsEntered = validateLimits(reservesPercentage, MIN_RESERVES_PERCENTAGE, MAX_RESERVES_PERCENTAGE); if (!validReservesCostsEntered) { Write.Line("Die eingegebenen Ruecklagen sind nicht zulässig!"); } } return (int)(fee*reservesPercentage/100); } // Und last but not least: das Einlesen der Geschaeftsreisekosten wie zuvor public static int getChairExcursionCosts() { boolean validExcursionCostsEntered = false; int excursion = 0; while (!validExcursionCostsEntered) { excursion = getIntegerValue("Bitte geben Sie die Kosten des " + "Betriebsausflugs (in Euro) ein: "); validExcursionCostsEntered = validateLimits(excursion, MIN_EXCURSION_COST, MAX_EXCURSION_COST); if (!validExcursionCostsEntered) { Write.Line("Die eingegebenen Kosten fuer den Betriebsausflug " + "sind nicht zulässig!"); } } return excursion; } /* Prueft ob die verfuegbaren Gebuehren abzgl. der Summe von Heizkosten- anteil, Ruecklagen und Reisekosten kleiner ist als die Haelfte der verfuegbaren Gebuehren (Punkt 7 der Satzung) */ public static boolean checkRemainder (int fee, int heat, int reserves, int excursion) { return (fee - (heat + reserves + excursion) >= fee / 2); } /* Am vorgegebenen Hauptprogramm ist _nicht_ veraendert worden! */ public static void main (String[] args) { int numberOfStudents = getNumberOfStudents(); // Anzahl Studenten einlesen int feePerStudent = getFeePerStudent(); // Gebuhr pro Student lesen // Verfuegbare Gebuehr berechnen (siehe Satzung, Punkt 3) int availableFee = calculateFee(numberOfStudents, feePerStudent); // Erste Ausgabe zur Kontrolle Write.Line("Bei einem Studierendenaufkommen von " + numberOfStudents + " Studierenden"); Write.Line("und einer Pro-Kopf-Studiengebuehr von " + feePerStudent + " Euro"); Write.Line("zuzueglich Zuschuss von " + SURCHARGE + "% erhalten wir " + availableFee + " Euro!"); /* Jetzt wird es schwieriger... ... checkRemainder soll pruefen, ob die verbleibende Summe (nach Ziffer 7 der Satzung) mehr als die Haelfte der verfuegbaren Gebuehren ausmacht; dazu muessen noch die Prozentsaetze fuer Heizkosten und Ruecklagen sowie die Reisekosten in Euro eingelesen werden. */ if (checkRemainder(availableFee, getHeatingCosts(availableFee), getReserves(availableFee), getChairExcursionCosts())) { Write.Line("Ja! Die eingegebenen Werte sind satzungskonform!"); } else { Write.Line("Leider fuehren die eingebenen Werte zu einer"); Write.Line("nicht satzungskonformen Gebuehrenverwendung."); } } }