Softwareentwicklung I - Übung 1

Angabe

Aufgabe 1

Lösungsidee

Der Algorithmus wird in einer Schleife realisiert, welche beendet wird, wenn die eingelesene Zahl (number) negativ ist. Die zwei größten Werte werden in Variablen (biggest und secondBiggest) gespeichert. In der Schleife wird überprüft ob die eingelesene Zahl über einem der Werte in den Variablen liegt. Eine weitere Variable (counter) wird zur Überprüfung, wie viele Zahlen eingelesen wurden, genutzt. Nach Beendigung der Schleife werden die Werte in den Variablen ausgegeben.

a) Algorithmus in stilisierter Prosa

  1. Initialisierung:
    Setze counter (Anzahl der eingelesenen Zahlen), biggest (größte Zahl), secondBiggest (zweitgrößte Zahl) = 0.
  2. Einlesen:
    Einlesen einer ganzen Zahl number.
  3. Schleife:
    Während number größer gleich 0 ist, führe die Schritte 3-8 aus, ansonsten gehe zu Schritt 9
  4. Counter erhöhen:
    Erhöhe counter um 1.
  5. Größte od. zweigrößte Zahl:
    Wenn number größer secondBiggest ist, dann gehe zu Schritt 6, ansonsten zu Schritt 8.
  6. Größte Zahl:
    Wenn number größer gleich biggest ist, dann setze biggest gleich number (bisherige größte Zahl) und gehe zu Schritt 8, ansonsten gehe zu Schritt 7.
  7. Zweitgrößte Zahl:
    Setze secondBiggest gleich number (bisherige zweitgrößte Zahl).
  8. Einlesen:
    Einlesen einer ganzen Zahl number.
  9. Zu wenig Zahlen:
    Wenn counter kleiner 2 (weniger als 2 positive Zahlen eingeg.), dann gib Text "Zu wenig Zahlen eingegeben!" aus, ansonsten gehe zu Schritt 10.
  10. Ergebnis:
    Gib das Ergebnis, also die Zahlen biggest und secondBiggest aus.

b) Ablaufdiagramm

c) Struktogramm

 

d) Vergleich der drei Darstellungsformen

Die stilisierte Prosa finde ich zur Darstellung von Algorithmen relativ ungeeignet. Schleifen- und Bedingungs-Strukturen können sehr schlecht dargestellt werden. Der Leser muss den gesamten Text eingehend studieren und die versch. Schritte bildlich zusammensetzen, um sich selbst ein vernünftiges Bild von der Struktur schaffen zu können.
Schleifen- und Bedingungsstrukturen können in Abaufdiagrammen und Struktogrammen wesentlich besser dargestellt werden. Bei vielen Bedingungen würde ich das Ablaufdiagramm dem Struktogramm vorzuziehen, da beim Struktogramm der Platzbedarf sehr groß wird.
Generell finde ich das Ablaufdiagramm geeigneter, da man flexibler bei der Darstellung als beim Struktogramm ist.

Aufgabe 2

Lösungsidee

Um die Primfaktoren und deren Häufigkeit für eine bestimmte ganze Zahl zu bestimmen muss geprüft werden, welche Primzahlen beginnend bei 2 Divisoren der geg. Zahl sind, wobei nach jeder Prüfung durch den gefundenen Divisor dividiert wird und die sich ergebende Zahl für die nächste Prüfung wieder beginnend bei 2 herangezogen wird. Dabei muss natürlich gemerkt werden, wie oft durch die entspr. Primzahl dividiert wird, dies ergibt die Häufigkeit.

Für das Einlesen der Zahlen wird die von Softwareentwicklung I zur Verfügung gestellte Klasse IO verwendet. Die Methode IO.readInt() gibt bei einer ungültigen Eingabe den Wert 0 zurück und liest keine Zahlen mehr ein, daher wird dies als Abbruchkriterium definiert.

a) Ablaufdiagramm

b) Java-Programm

Source

/**
 * 
 * Softwareentwicklung I - Exercise 1/2.
 * Finding prime factors of a number. 
 * 
 * @author Daniel Brunthaler
 * @version 1.0
 * 
 */
public class PrimeFactors {

	/**
	 * Finds the prime factors of a number and puts it in a significant String.
	 * 
 	 * @param number which should be checked.
	 * @return the prime factors of the number as a String in the format 
	 *  		p1^f1 * p2^f2 * p3^f3 * ... 
	 *          where p is the prime number and f the frequency
 	 */
	static String primeFactors(int number) {
		
		int factor_count;			// frequency of prime factor
		String strFactors = "";		// prime factors and frequency in a String
		
		for (int factor = 2;factor <= number;factor++) {
		   // start with prime factor = 2 and increase it until > number
			for (factor_count = 0;number % factor == 0;factor_count++) {
				number = number / factor;
			}
			if (factor_count > 0) {
				if (strFactors.length() > 0) {
					strFactors = strFactors + " * ";
				}
				strFactors = strFactors + factor + "^" + factor_count;
			}
		}
		
		if (strFactors.length() == 0) {
			return "number not valid!";
		} else {
			return strFactors;
		}
	}
	
	public static void main(String[] args) {
		int number = IO.readInt();
		while (number != 0) {
			System.out.println(primeFactors(number));
			number = IO.readInt();
		}
	}
}

  

Test