# Assert Anweisung



## DrippleTripple (18. März 2009)

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^2
r={3,5,7...}  folgt =>r= r(n-1)+2

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


----------



## vfl_freak (18. März 2009)

DrippleTripple hat gesagt.:


> _*
> 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 

Gruß
Klaus


----------



## DrippleTripple (18. März 2009)

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?


----------



## vfl_freak (18. März 2009)

> 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


----------

