Uebungsblatt 8


ich versteh nicht wie ich 2 Nat s vergleichen soll ohne <,>,= etc


Sers Leute,

hab mal versucht für die letzte Aufgabe totale Korrektheit die Methode zu schreiben inklusive Asserts. Aber iwie bekomme ich keinen Durchlauf hin ohne dass er mir eine Assertion wirft. Ich gehe so vor dass ich einen Durchgang starte, und dann wenn er einen Error wirft die entsprechende Zeile rausnehme mit (“//”). Ende vom Lied ist aktuell dass alle auskommentiert sind…Kann jemand evtl n Fehler entdecken?

public static long f (int a, int u, int d ){
		
		long r = 0; 
		int i = 0; 
		
		
		assert (2*r == d*(2*a+(d-1)*u)):"1. InVariante nicht ";
		assert (2*r == 2*i*a+i*(i-1)*u): "2.Invariante nicht ";
		assert (r == r+(a+i*u)): "3.Invariante nicht ";
		assert (2*r == i*a+i*i*u): "4.Invariante nicht ";
		
		while (i<d){
			
			
			r = r+(a+i*u);
			assert (2*r == d*(2*a+(d-1)*u)):"1.1 InVariante nicht";
			assert (2*r == 2*i*a+i*(i-1)*u): "2.1 Invariante nicht";
			assert (r == r+(a+i*u)): "3.1 Invariante nicht";
			assert (2*r == i*a+i*i*u): "4.1 Invariante nicht";
	
			i++;
			
		}
		
		return r;
		
	}

NaN ist wie zero eine Ausnahme. zero repräsentiert 0, NaN alle nichtnatürlichen Zahlen. Wie du das implementierst, bleibt dir selbst überlassen, wichtig ist nur, dass die Referenzvergleiche, wie bspw. in toString() funktionieren.

Referenzvergleiche zwischen Objekten sind erlaubt, siehe toString()-Methode.
Ansonsten sind eigentlich keine Vergleiche nötig. Ausnahme hiervon die gcd()-Methode der Aufgabe 8.2b), bei der extra ein Hinweis gegeben ist, wie man einen Vergleich simulieren kann.

Mit welchen Parametern rufst du deine Methode denn auf?


@Volschaf aktuell mit (2,3,6)


Mann, bin ich blind, sorry.

Die Sache ist relativ einfach: Wieso überprüfst du die Invariante zwischen [m]r = r+(a+i*u);[/m] und [m]i++;[/m]?


hmm aktuell gar nicht.

Ich habe nun einmal dass i++; als erste Anweisung des Schleifenblocks eingefügt, und nach der Zuweisung von r . Keiner der beiden Varianten verändern aber dass ich Errors bekomme im Block. Weiß aber nun welche es sein müsste weil ich i nun ausgebe, dennoch stört mich das mit den Errors.


Schieb die Zeile “i++;” vor die Assertions, aber nach “r = r+(a+i*u);”.


@chayyam, hab ich, nach 4 durchgängen ist feierabend und error folgt.

Kommando zurück, hatte noch ganz unten versteckt ein i++;

funktioniert nun Danke!


also kann ich nur equals(a,b) verwenden oder gibts da auch ne Möglichkeit wie man sieht welches der beiden größer ist ?
weil ich hab im Moment bei max(…,…) eine Abhängigkeit von sub und bei sub eine Abhängigkeit von max

edit: kurze frage ist sowas zulässig? : sub(succ(nat1),succ(nat2))=sub(nat1,nat2)


Referenzvergleiche! Mit equals() werden keine Referenzen verglichen, sondern mit dem ==-Operator. Siehe auch aktuelle Übungsfolien, Folien 38 und 39.

Das ist nicht gut, das solltest du beheben.

Ja, das ist zulässig.


muss die Aufgabe 8.2 übersetzbar sein weil in der Aufgabenstellung steht nur die vorgegebenen bzw die im folenden beschriebenen oder so.
ist mit vorgegebenen auch: zero() , NaN(), etc gemeint
wie soll bei einer Methode außer mit substring aus die Vorgänger von 2 Parameter herausfinden
anscheinend soll sub einen String zurückgeben wie es toString vermuten lässt ???
ich blick da überhaupt nicht durch


JA - das gilt für alle Java-Aufgaben, wenn nicht explizit und deutlich was anderes gefordert wurde!

JA: „a) Setzen Sie die Operationen („ops“) des ADT Nat gemäß Aufgabe 8.1 um.“ <= dazu gehört auch NaN, zero, succ, max, sub

Genau das ist ja der Sinn dieser Aufgabe: Lernt, in der Welt der ADTs (und etwas OO) zu denken!
substring ist da definitiv der falsche Weg! Schaut euch stattdessen die axs an, die ihr bei 8.1 ermittelt habt: Sie sollten rekursiv sein sowie ein oder mehrere Basisfälle haben…
NEIN - sub gibt ein Nat-Objekt zurück, DESSEN toString aufgerufen wird - das Thema OO war schon dran…