Assert Anweisung

Hi,

ich habe hier folgende Aufgabe bekommen:

Gegeben sei die folgende Java-Methode:

static int f(int n) {
assert n >= 0; // Vorbedingung P
int s = 0,
r = 1;
for (int i = 0; i <= n; i++) {
s = s + r;
r = r + 2;
}
assert ...; // Nachbedingung Q (*)
return s;
}

Welche Werte besitzen die Variablen s und r zum Zeitpunkt der Ausführung der assert-Anweisung (*)? Formulieren Sie eine entsprechende Nachbedingung Q. Schreiben Sie Q als Java-Ausdruck, sodass dieser in der assert-Anweisung (*) verwendet werden kann.



Also ganz salopp hätte ich gesagt, dass Q gleich s>=1 ist, aber ich denke ich muss dass in Abhängigkeit von n angeben. Sprich meine Werte s=s+r und r = r+2 als n angegeben werden müssen:

Nehmen wir an n sei 3, dann wird die schleife genau 3 mal durchlaufen:
1) s=1+0=1
r= 1+2=3

2) s=1+3=4
r=3+2=5

3) s=4+5=9
r=5+2=7

Also habe ich für s und r jeweils eine arithmetische Folge.
s = {1,4,9...} folgt => s(n)= n^2
r={3,5,7...} folgt =>r(n)= r(n-1)+2

Wie formuliere ich denn nun meine Nachbedingung? Irgendwie kann ich dass nicht in einen Javacode übersetzen...
 

for (int i = 0; i <= n; i++) { ... }
Nehmen wir an n sei 3, dann wird die schleife genau 3 mal durchlaufen
Moin,
nein, kleiner Gedankenfehler - dass ist so nicht ganz richtig! Sie wird 4-mal durchlaufen, da "i <= n" gilt! Also wird i die Werte 0, 1, 2 und 3 annehmen. Mithin ist dann am Ende s=16 und r=9 !
Passt das noch zu deiner Bedingung? Bin da zu lange raus :rolleyes:

Gruß
Klaus
 
Hi,

ah ja stimmt das Gleichzeichen übersehen... na ja passt trotzdem in die Folge.

Aber wie formuliere ich dass dann in java?

einfach:

assert s<=(n*n)

muss ich da noch r irgendwie berücksichtigen?
 
na ja passt trotzdem in die Folge.
assert s<=(n*n)

Moin,

nein, sie passt eben nicht! ;-]

Bei "n=3" ist am Ende "s=16" !
Dein Assert stellt aber sicher, dass "s" kleiner oder gleich 3*3, also 9, ist .......

Vielleicht sowas ? ? ?
assert s = ( (n*n) + r);

Gruß
Klaus
 

Neue Beiträge

Zurück