<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.168.23.194</id>
	<title>FreitagsrundenWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.stageing.freitagsrunde.org//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.168.23.194"/>
	<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//Spezial:Beitr%C3%A4ge/192.168.23.194"/>
	<updated>2026-10-29T16:40:42Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.45.6</generator>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Informatik_4_(StuPO90)/Semaphoren&amp;diff=7368</id>
		<title>Informatik 4 (StuPO90)/Semaphoren</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Informatik_4_(StuPO90)/Semaphoren&amp;diff=7368"/>
		<updated>2006-05-22T10:35:53Z</updated>

		<summary type="html">&lt;p&gt;192.168.23.194: /* 4. &amp;quot;Priority&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Eine &amp;quot;Pattern Language&amp;quot; für die Benutzung von  Semaphoren =&lt;br /&gt;
::(Nach http://c2.com/cgi/wiki?PatternLanguage)&lt;br /&gt;
&lt;br /&gt;
Dafür zu sorgen, dass mehrere nebenläufige Prozesse korrekt miteinander arbeiten, ist erstaunlich schwierig. Speziell Mehrseitige Synchronisation bereitete mir beim Verstehen und Erklären besondere Probleme. Um die dabei auftretenden Probleme übersichtlicher zu erklären, habe ich diese &amp;quot;Pattern Language&amp;quot; formuliert.&lt;br /&gt;
&lt;br /&gt;
Ich würde mich sehr über Feedback (mhaecker at cs.tu-berlin.de) zu den Beispielen und Formulierungen freuen.&lt;br /&gt;
&lt;br /&gt;
Folgende Probleme werden behandelt:&lt;br /&gt;
* Locking für kritische Sektionen&lt;br /&gt;
* Locking für beschränkten Zugriff (n clients)&lt;br /&gt;
* Locking zum gegenseitigen Ausschluss von zwei Gruppen&lt;br /&gt;
* Locking für Priorisierung einer von mehreren Gruppen&lt;br /&gt;
* Einseitige Synchronisation&lt;br /&gt;
&lt;br /&gt;
Zu diesem Zweck werden hier in der Vorlesung Semaphoren eingesetzt, die eine P() (Passieren) und eine V() (Vreigeben) Operation haben. Außerdem können Semaphoren mit einem Wert initialisiert werden, der vorgibt, wie oft P() aufgerufen werden kann, bevor der Aufrufer blockiert wird. Für genauere Erklärungen siehe das Informatik 4 Skript.&lt;br /&gt;
&lt;br /&gt;
== 1. &amp;quot;Critical Section&amp;quot; ==&lt;br /&gt;
Eine kritische Sektion ist ein Stück Code, in dem nur ein Prozess gleichzeitig sein darf. Eine Möglichkeit das durchzusetzen ist, diese Bereiche mit Semaphoren zu schützen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
criticalSection = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	... etwas in der kritischen Sektion tun ...&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. &amp;quot;Restricted Section&amp;quot; ==&lt;br /&gt;
Will man einer bestimmten Anzahl von Prozessen den Aufenthalt in einem Bereich gestatten, nennt man das eine beschränkte Sektion. Dies setzt man um, indem man diese Sektion in die P()- und V()-Operationen einer Semaphore fasst, die mit dem gewünschten Wert initialisiert ist. Streng genommen ist dies also eine Erweiterung der &amp;quot;Critical Section&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
restrictedSection = Semaphore(n)&lt;br /&gt;
&lt;br /&gt;
restrictedSection.P()&lt;br /&gt;
	... etwas in der begrenzten Sektion tun ...&lt;br /&gt;
restrictedSection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt können maximal n Prozesse den kritischen Abschnitt gleichzeitig betreten.&lt;br /&gt;
&lt;br /&gt;
== 3. &amp;quot;Mutual Exclusion&amp;quot; ==&lt;br /&gt;
Wenn ein Stück Code nur von jeweils einer Art von Prozessen betreten werden darf, dann verwendet man eine Semaphore, um gegenseitigen Ausschluss zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
wenn ich der erste Prozess meiner Art bin der den kritischen Abschnitt betreten will:&lt;br /&gt;
	hole ich mir die Semaphore&lt;br /&gt;
&lt;br /&gt;
... etwas in dem kritischen Abschnitt erledigen,&lt;br /&gt;
	 in dem jetzt diese Prozesse unter sich sind ...&lt;br /&gt;
&lt;br /&gt;
wenn ich der letzte Prozess meiner Art bin der den kritischen Abschnitt verlässt:&lt;br /&gt;
	gebe ich die Semaphore frei&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den Test, ob man der erste bzw. letzte seiner Art ist, macht man üblicherweise über einen Zähler, der nach dem Inkrementieren bzw. Dekrementieren abgefragt wird. Damit wird sowohl der Eingangs- als auch der Ausgangsbereich selbst eine Critical Section und muss entsprechend behandelt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
criticalSection = Semaphore(1), mutualExclusion = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	howManyInCriticalSection++&lt;br /&gt;
	if 1 == howManyInCriticalSection:&lt;br /&gt;
		mutualExclusion.P()&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
&lt;br /&gt;
... etwas in dem kritischen Abschnitt erledigen,&lt;br /&gt;
	 in dem jetzt diese Prozesse unter sich sind ...&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	howManyInCriticalSection--&lt;br /&gt;
	if 0 == howManyInCriticalSection:&lt;br /&gt;
		mutualExclusion.V()&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier wird das Muster &amp;quot;Critical Section&amp;quot; zusätzlich gebraucht, damit der Zähler zwischen seiner Veränderung und dem Test, welchen Wert er hat, nicht von einem anderen Prozess verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Kombiniert man &amp;quot;Critical Section&amp;quot; mit &amp;quot;Mutual Exclusion&amp;quot;, dann kann man entweder die &amp;quot;Critical Section&amp;quot; direkt um den kritischen Abschnitt legen, oder sie um das Ganze außen herum &amp;quot;wickeln&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Alle weiteren Prozessgruppen verwenden die selbe Semaphore für den gegenseitigen Ausschluss, aber eigene Semaphoren und eigene Zähler für den kritischen Abschnitt.&lt;br /&gt;
&lt;br /&gt;
== 4. &amp;quot;Priority&amp;quot; ==&lt;br /&gt;
Zwei ineinander verschachtelte Semaphoren können genutzt werden, um eine Art von Prozessen gegen andere zu priorisieren.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
äußerer kritischer Abschnitt &amp;lt;- An dieser Semaphore bleiben alle Prozesse &amp;quot;hängen&amp;quot; bis auf einen&lt;br /&gt;
	innerer kritischer Abschnitt &amp;lt;- an dieser Semaphore ist also immer nur maximal ein Prozess gleichzeitig&lt;br /&gt;
&lt;br /&gt;
		... kritischer Bereich ...&lt;br /&gt;
&lt;br /&gt;
	innerer Kritischer Abschnitt&lt;br /&gt;
äusserer kritischer Abschnitt&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Semaphore, die den inneren kritischen Abschnitt schützt, kann jetzt von einem anderen Prozess aus einer anderen Prozessgruppe gesperrt werden. Das funktioniert, da die anderen Prozesse ja gerade &#039;&#039;&#039;nicht&#039;&#039;&#039; auch an der äusseren Semaphore warten müssen. Damit muss der priorisierte Prozess maximal so lange warten, bis der Prozess, der die innere Semaphore gerade besitzt, sie wieder freigibt. Da nur maximal ein Prozess aus der niederprioren Gruppe an der Semaphore &amp;quot;hängen&amp;quot; kann, werden alle Prozesse überholt, die an der äußeren Semaphore warten.&lt;br /&gt;
&lt;br /&gt;
Etwas formaler:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
outerCriticalSection = Semaphore(1), innerCriticalSection = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
outerCriticalSection.P()&lt;br /&gt;
	innerCriticalSection.P()&lt;br /&gt;
		&lt;br /&gt;
		... kritischer Bereich ...&lt;br /&gt;
	&lt;br /&gt;
	innerCriticalSection.V()&lt;br /&gt;
outerCriticalSection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man &amp;quot;Priority&amp;quot; mit &amp;quot;Mutual Exclusion&amp;quot; kombinieren, dann wird der erste Block der &amp;quot;Mutual Exclusion&amp;quot; in den kritischen Bereich der &amp;quot;Priority&amp;quot; verlegt. Die priorisierten Prozesse sperren dann zusätzlich zu der Ausschluss-Semaphore noch die Semaphore des inneren kritischen Abschnitts.&lt;br /&gt;
&lt;br /&gt;
Die niederprioren Prozesse:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
outerCriticalSection = Semaphore(1), innerCriticalSection = Semaphore(1), lowPriorityCounterProtection = Semaphore(1), mutex = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
outerCriticalSection.P()&lt;br /&gt;
	innerCriticalSection.P()&lt;br /&gt;
		lowPriorityCounterProtection.P()&lt;br /&gt;
			lowPriorityCounter++&lt;br /&gt;
			if 1 == lowPriorityCounter&lt;br /&gt;
				mutex.P()&lt;br /&gt;
		lowPriorityCounterProtection.V()&lt;br /&gt;
	innerCriticalSection.V()&lt;br /&gt;
outerCriticalSection.V()&lt;br /&gt;
&lt;br /&gt;
... kritischer Bereich ...&lt;br /&gt;
&lt;br /&gt;
lowPriorityCounterProtection.P()&lt;br /&gt;
	lowPriorityCounter--&lt;br /&gt;
	if 0 == lowPriorityCounter&lt;br /&gt;
		mutex.V()&lt;br /&gt;
lowPriorityCounterProtection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die hochprioren Prozesse:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
highPriorityCounterProtection = Semaphore(1)&lt;br /&gt;
// &amp;quot;mutex&amp;quot; und &amp;quot;innerCriticalSection&amp;quot; sind global und werden hier mitbenutzt&lt;br /&gt;
&lt;br /&gt;
highPriorityCounterProtection.P()&lt;br /&gt;
	highPriorityCounter++&lt;br /&gt;
	if 1 == highPriorityCounter&lt;br /&gt;
		innerCriticalSection.P()&lt;br /&gt;
		mutex.P()&lt;br /&gt;
highPriorityCounterProtection.V()&lt;br /&gt;
&lt;br /&gt;
... kritischer Bereich ...&lt;br /&gt;
&lt;br /&gt;
highPriorityCounterProtection.P()&lt;br /&gt;
	highPriorityCounter--&lt;br /&gt;
	if 0 == highPriorityCounter&lt;br /&gt;
		mutex.V()&lt;br /&gt;
		innerCriticalSection.V()&lt;br /&gt;
highPriorityCounterProtection.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Will man &amp;quot;Priority&amp;quot; mit &amp;quot;Restricted Section&amp;quot; kombinieren, ist zu beachten, dass die begrenzte kritische Sektion der Gruppe, die überholt werden soll, natürlich den gesamten Code mit einschließt, der die Priorität sichert. Tut man das nicht, kann das Überholen nicht garantiert werden. &lt;br /&gt;
&lt;br /&gt;
Auf der anderen Seite, bei den Prozessen, die überholen sollen, muss die begrenzte kritische Sektion innerhalb des Codes liegen, der die Priorität garantiert, da andernfalls in dem Spezialfall, in dem die Restriction auf eins liegt, das Überholen nicht funktioniert. (Vorsicht: Natürlich muss bei &amp;quot;Restricted Section&amp;quot; jede Prozessgruppe eine eigene Semaphore für die Beschränkung haben.)&lt;br /&gt;
&lt;br /&gt;
Der dritte wichtige Punkt ist das Holen und Freigeben der &#039;&#039;innerCriticalSection&#039;&#039; im niederprioren Prozess. Das holen muss &#039;&#039;&#039;vor&#039;&#039;&#039; dem &#039;&#039;mutex&#039;&#039; und das Freigeben &#039;&#039;&#039;nach&#039;&#039;&#039; dem &#039;&#039;mutex&#039;&#039; passieren, da das System sonst ein Deadlock produzieren kann.&lt;br /&gt;
&lt;br /&gt;
== 5. &amp;quot;Reduction&amp;quot; ==&lt;br /&gt;
Die Lösungen, die man aus der Kombination dieser Muster erhält, verwenden in Spezialfällen mehr Semaphoren als unbedingt nötig. Man kann daher manchmal einige der Semaphoren weglassen, da ihre Funktion schon von einer der anderen Semaphoren erfüllt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Rausgenommen, da dies ein Beispiel mit zwei einseitigen Synchronisationen ist - wir wollen erst ein Beispiel mit einer einseitigen, und daraus dann dieses entwickeln.&lt;br /&gt;
&lt;br /&gt;
== 6. &amp;quot;Einseitige Synchronisation&amp;quot; (Erzeuger- / Verbraucher-Probleme) ==&lt;br /&gt;
Will man Erzeuger und Verbraucher koordinieren, so braucht man im allgemeinen Fall zwei Semaphore. Eine regelt den vorhandenen &amp;quot;Lagerplatz&amp;quot;, die andere im Lager vorhandene Ressourcen.&lt;br /&gt;
&lt;br /&gt;
Als Veranschaulichung dieses Konzeptes soll ein Lagerplatz mit einer Kapazität von n dienen. Die &amp;quot;LagerplatzVoll-Semaphore&amp;quot; dient dazu dass der Lieferant feststellen kann, dass noch Platz im Lager ist, während die &amp;quot;LagerplatzLeer-Semaphore&amp;quot; dem Konsument dazu dient festzustellen, ob noch Produkte im Lager sind.&lt;br /&gt;
&lt;br /&gt;
Produzent:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
storageFull = Semaphore(n), storageEmpty = Semaphore(0)&lt;br /&gt;
// Lagerplatz ist am Anfang leer&lt;br /&gt;
&lt;br /&gt;
while true:&lt;br /&gt;
	storageFull.P()&lt;br /&gt;
	produceAGoodAndPlaceInStorage()&lt;br /&gt;
	storageEmpty.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konsument:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
// storageFull und storageEmpty sind global und werden hier mitbenutzt&lt;br /&gt;
while true:&lt;br /&gt;
	storageEmpty.P()&lt;br /&gt;
	getGoodFromStorageAndDoSomethingWithIt()&lt;br /&gt;
	storageFull.V()&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieses Konzept ist auf alle Situationen anwendbar, die dieses Verhalten zeigen, oder bei denen Signale wie die hier gezeigten übermittelt werden müssen. Sei es nun der Kino-Wärter, der die Vorstellung beginnen soll, nachdem der Saal voll ist, oder das Flugzeug, das startet, wenn die Passagiere an Bord sind, etc.&lt;br /&gt;
&lt;br /&gt;
Soll nur einmal ein Signal übermittelt werden, beispielsweise dass alle notwendigen Vorraussetzungen für eine einmalige Aktion jetzt erfüllt sind, dann genügt natürlich auch eine Semaphore.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Informatik 4|&amp;lt;- Zurück zur Informatik 4 Seite]]&lt;/div&gt;</summary>
		<author><name>192.168.23.194</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Informatik_4_(StuPO90)/Semaphoren&amp;diff=7339</id>
		<title>Informatik 4 (StuPO90)/Semaphoren</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Informatik_4_(StuPO90)/Semaphoren&amp;diff=7339"/>
		<updated>2006-04-19T09:26:34Z</updated>

		<summary type="html">&lt;p&gt;192.168.23.194: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A Pattern Language for the usage of Semaphores&lt;br /&gt;
----------------------------------------------&lt;br /&gt;
(Nach http://c2.com/cgi/wiki?PatternLanguage)&lt;br /&gt;
&lt;br /&gt;
Dafür zu sorgen, dass mehrere nebenläufige Prozesse korrekt miteinander arbeiten, ist erstaunlich schwierig. Speziell Mehrseitige Synchronisation bereitete mir beim Verstehen und Erklären besondere Probleme. Um die dabei auftretenden Probleme übersichtlicher zu erklären habe ich diese &amp;quot;Pattern Language&amp;quot; formuliert.&lt;br /&gt;
&lt;br /&gt;
Ich würde mich sehr über Feedback (mhaecker@cs.tu-berlin.de) zu den Beispielen und Formulierungen freuen.&lt;br /&gt;
&lt;br /&gt;
Folgende Probleme werden behandelt:&lt;br /&gt;
- Locking für kritische Sektionen&lt;br /&gt;
- Locking für beschränkten Zugriff (n clients)&lt;br /&gt;
- Locking zum gegenseitigen Ausschluss von zwei Gruppen&lt;br /&gt;
- Locking für Priorisierung einer von mehreren Gruppen&lt;br /&gt;
&lt;br /&gt;
1. &amp;quot;Critical Section&amp;quot;&lt;br /&gt;
---------------------&lt;br /&gt;
Eine kritische Sektionen ist ein Stück Code, in dem nur ein Prozess gleichzeitig sein darf. Diese Bereiche kann man schützen, indem man sie in Semaphoren &amp;quot;verpackt&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
--- snip ---&lt;br /&gt;
criticalSection = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	.. etwas in der kritischen Sektion tun ..&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
2. &amp;quot;Restricted Section&amp;quot;&lt;br /&gt;
-----------------------&lt;br /&gt;
Will man einer bestimmten Anzahl von Prozessen den Aufenthalt in einem Bereich gestatten, nennt man das eine beschränkte Sektion. Dies setzt man um, indem man diese Sektion in die P()- und V()-Operationen einer Semaphore fasst, die mit dem gewünschten Wert initialisiert ist. Streng genommen ist dies also eine Erweiterung der &amp;quot;Critical Section&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
--- snip ---&lt;br /&gt;
restrictedSection = Semaphore(n)&lt;br /&gt;
&lt;br /&gt;
restrictedSection.P()&lt;br /&gt;
	... etwas tun in der kritischen Sektion&lt;br /&gt;
restrictedSection.V()&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
Jetzt können maximal n Prozesse den kritischen Abschnitt gleichzeitig betreten.&lt;br /&gt;
&lt;br /&gt;
3. &amp;quot;Mutual Exclusion&amp;quot;&lt;br /&gt;
---------------------&lt;br /&gt;
Wenn ein Stück Code nur von jeweils einer Art von Prozessen betreten werden darf, dann verwendet man eine Semaphore um gegenseitigen Ausschluss zu realisieren.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
--- snip ---&lt;br /&gt;
wenn ich der erste Prozess meiner Art bin der den kritischen Abschnitt betreten will:&lt;br /&gt;
	hole ich mir die Semaphore&lt;br /&gt;
&lt;br /&gt;
.. etwas im kritischen Abschnitt tun ..&lt;br /&gt;
&lt;br /&gt;
wenn ich der letzte Prozess meiner Art bin der den kritischen Abschnitt verlässt:&lt;br /&gt;
	gebe ich die semaphore frei&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
Sowohl der erste als auch der zweite Test, ob man der erste bzw. letzte ist, ist natürlich /*TODO: ist das echt so natürlich?Wenn man den Zähler dazu erwähnt schon*/ ein kritischer Abschnitt und muss entsprechend gelockt werden. Etwas formaler:&lt;br /&gt;
&lt;br /&gt;
--- snip ---&lt;br /&gt;
criticalSection = Semaphore(1), mutualExclusion = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	howManyInRestrictedSection++&lt;br /&gt;
	if 1 == howManyInCriticalSection:&lt;br /&gt;
		mutualExclusion.P()&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
&lt;br /&gt;
.. etwas in dem kritischen Abschnitt erledigen,&lt;br /&gt;
	 in dem jetzt diese Prozesse unter sich sind ...&lt;br /&gt;
&lt;br /&gt;
criticalSection.P()&lt;br /&gt;
	howManyInRestrictedSection--&lt;br /&gt;
	if 0 == howManyInCriticalSection:&lt;br /&gt;
		mutualExclusion.V()&lt;br /&gt;
criticalSection.V()&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
Hier wird das Muster &amp;quot;Critical Section&amp;quot; zusätzlich gebraucht, damit der Zähler zwischen seiner Veränderung und dem Test welchen Wert er hat nicht von einem anderen Prozess verändert werden kann.&lt;br /&gt;
&lt;br /&gt;
Kombiniert man &amp;quot;Critical Section&amp;quot; mit &amp;quot;Mutual Exclusion&amp;quot; dann kann man entweder die &amp;quot;Critical Section&amp;quot; direkt um den kritischen Abschnitt legen, oder sie um das gesamte außen herum &amp;quot;wickeln&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
4. &amp;quot;Priority&amp;quot;&lt;br /&gt;
-------------&lt;br /&gt;
Zwei ineinander verschachtelte Semaphoren können genutzt werden, um eine Art von Prozessen gegen andere zu priorisieren. Dies ist eine Ergänzung des vorhergehenden Musters.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
--- snip ---&lt;br /&gt;
äusserer kritischer Abschnitt &amp;lt;- An dieser Semaphore bleiben alle Prozesse &lt;br /&gt;
				 &amp;quot;hängen&amp;quot; bis auf einen&lt;br /&gt;
	innerer Kritischer Abschnitt &amp;lt;- an dieser Semaphore ist also immer &lt;br /&gt;
					nur maximal ein Prozess gleichzeitig&lt;br /&gt;
&lt;br /&gt;
		.. kritischer Bereich ..&lt;br /&gt;
&lt;br /&gt;
	innerer Kritischer Abschnitt&lt;br /&gt;
äusserer kritischer Abschnitt&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
/*TODO: und die andere Prozessart?*/&lt;br /&gt;
&lt;br /&gt;
Die Semaphore, die den inneren kritischen Abschnitt schützt, kann jetzt von einem anderen Prozess aus einer anderen Prozessgruppe gelockt werden. Wenn das passiert, dann muss er maximal so lange warten, bis sie der Prozess der sie gerade besitzt freigibt, da nur einer aus dieser Gruppe daran &amp;quot;hängen&amp;quot; kann. Er hat also alle anderen Prozesse die an der äusseren Semaphore warten überholt.&lt;br /&gt;
&lt;br /&gt;
Etwas Formaler:&lt;br /&gt;
--- snip ---&lt;br /&gt;
outerCriticalSection = Semaphore(1), innerCriticalSection = Semaphore(1)&lt;br /&gt;
&lt;br /&gt;
outerCriticalSection.P()&lt;br /&gt;
	innerCriticalSection.P()&lt;br /&gt;
		&lt;br /&gt;
		.. kritischer Bereich ..&lt;br /&gt;
	&lt;br /&gt;
	innerCriticalSection.V()&lt;br /&gt;
outerCriticalSection.V()&lt;br /&gt;
--- snap ---&lt;br /&gt;
&lt;br /&gt;
Um dieses Muster anzuwenden muss man es mit dem Muster &amp;quot;Mutual Exclusion&amp;quot; kombinieren, indem der erste einer anderen Gruppe sich die Semaphore des inneren kritischen Abschnitts &amp;quot;sichert&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Will man &amp;quot;Priority&amp;quot; mit &amp;quot;Restricted Section&amp;quot; kombinieren, ist zu beachten, das die begrenzte kritische Sektion der Gruppe die überholt werden soll natürlich den gesamten Code mit einschließt, der die Priorität sichert. Tut man das nicht, kann das Überholen nicht garantiert werden. Auf der anderen Seite, bei den Prozessen, die überholen sollen, muss die begrenzte kritische Sektion innerhalb des Codes liegen, der die Priorität garantiert, da andernfalls in dem Spezialfall, in dem die Begrenzung auf eins liegt, das Überholen nicht funktioniert.&lt;br /&gt;
&lt;br /&gt;
/*TODO: hier einen Punkt einfügen, der einseitige Synchronisationabdeckt*/&lt;br /&gt;
&lt;br /&gt;
5. &amp;quot;Reduction&amp;quot;&lt;br /&gt;
--------------&lt;br /&gt;
Die Lösungen, die man aus der Kombination dieser Muster erhält, verwenden in Spezialfällen mehr Semaphoren als unbedingt nötig. Man kann daher manchmal einige der Semaphoren weglassen, da ihre Funktion schon von einer der anderen Semaphoren erfüllt werden.&lt;/div&gt;</summary>
		<author><name>192.168.23.194</name></author>
	</entry>
	<entry>
		<id>wiki.stageing.freitagsrunde.org//index.php?title=Javakurs2006/Uebungsaufgaben&amp;diff=7207</id>
		<title>Javakurs2006/Uebungsaufgaben</title>
		<link rel="alternate" type="text/html" href="wiki.stageing.freitagsrunde.org//index.php?title=Javakurs2006/Uebungsaufgaben&amp;diff=7207"/>
		<updated>2006-04-05T16:06:13Z</updated>

		<summary type="html">&lt;p&gt;192.168.23.194: /* Selbst einige Methoden schreiben! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Variablen =&lt;br /&gt;
* Das gleiche Thema im Buch [http://www.galileocomputing.de/openbook/javainsel5/javainsel02_002.htm#Rxx747java02002040000A91F032100 Java ist auch eine Insel]&lt;br /&gt;
== Variablendeklaration und Initialisierung ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Beispiel {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		int aWholeNumber;&lt;br /&gt;
		double notAWholeNumber;&lt;br /&gt;
		String aString;&lt;br /&gt;
&lt;br /&gt;
		aWholeNumber = 0;&lt;br /&gt;
		notAWholeNumber = 0.0;&lt;br /&gt;
		aString = &amp;quot;&amp;quot;;&lt;br /&gt;
		System.out.println(aWholeNumber);&lt;br /&gt;
		System.out.println(notAWholeNumber);&lt;br /&gt;
		System.out.println(aString);&lt;br /&gt;
&lt;br /&gt;
		int anotherWholeNumber = 0;&lt;br /&gt;
		double anotherNotSoWholeNumber = 0;&lt;br /&gt;
		String anotherString = &amp;quot;&amp;quot;;&lt;br /&gt;
		System.out.println(anotherWholeNumber);&lt;br /&gt;
		System.out.println(anotherNotSoWholeNumber);&lt;br /&gt;
		System.out.println(anotherString);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* An welcher Stelle im Programm wird die Variable &#039;&#039;aWholeNumber&#039;&#039; definiert?&lt;br /&gt;
* An welcher Stelle im Programm wird die Variable &#039;&#039;aWholeNumber&#039;&#039; initialisiert?&lt;br /&gt;
Beantworte diese Fragen auch für die Variablen: &#039;&#039;notAWholeNumber&#039;&#039;, &#039;&#039;aString&#039;&#039;, &#039;&#039;anotherWholeNumber&#039;&#039;, &#039;&#039;anotherNotSoWholeNumber&#039;&#039;, &#039;&#039;anotherString&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Erkläre deine Meinung einem Tutor.&lt;br /&gt;
&lt;br /&gt;
== Selber Deklarationen und Definitionen durchführen ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Beispiel {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		// deklariere eine Variable &amp;quot;birnen&amp;quot;  vom Typ int&lt;br /&gt;
		&lt;br /&gt;
		// weise ihr den Wert drei zu&lt;br /&gt;
&lt;br /&gt;
//		System.out.println(&amp;quot;3 erwartet: &amp;quot; + birnen);&lt;br /&gt;
		// addiere fünf zu dem Wert&lt;br /&gt;
&lt;br /&gt;
//		System.out.println(&amp;quot;8 erwartet: &amp;quot; + birnen);&lt;br /&gt;
		// deklariere eine Variable &amp;quot;aepfel&amp;quot; und weise ihr den Wert fünf zu&lt;br /&gt;
&lt;br /&gt;
//		System.out.println(&amp;quot;5 erwartet: &amp;quot; + aepfel);&lt;br /&gt;
		// subtrahiere zwei von dem Wert&lt;br /&gt;
&lt;br /&gt;
//		System.out.println(&amp;quot;3 erwartet: &amp;quot; + aepfel);&lt;br /&gt;
&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Zuweisung an Variablen ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Beispiel {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		System.out.println(0);&lt;br /&gt;
		int zero = 0;&lt;br /&gt;
		System.out.println(zero);&lt;br /&gt;
		int one = 1;&lt;br /&gt;
		int whatsThis = zero;&lt;br /&gt;
		System.out.println(whatsThis);&lt;br /&gt;
		whatsThis = one;&lt;br /&gt;
		System.out.println(whatsThis);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Überlege dir, was dieses Code-Fragment ausgeben würde.&lt;br /&gt;
Führe es aus und vergleiche die Resultate: Kopiere hierfür den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus.&lt;br /&gt;
* Was sind die Unterschiede?&lt;br /&gt;
* Warum?&lt;br /&gt;
Erkläre einem Tutor, zu welchem Schluss du gekommen bist und frage ihn, ob du Recht hast.&lt;br /&gt;
&lt;br /&gt;
== Variablen ändern ihre Werte ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		int number = 1;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
		number = 1;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
		number = 2;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
		number = 3;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
		number = 1;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
		number = 17;&lt;br /&gt;
		System.out.println(number);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Überlege dir, was dieser Code ausgeben würde.&lt;br /&gt;
Schreibe ihn in eine Datei, kompiliere ihn und führe ihn aus.&lt;br /&gt;
* Was gibt er tatsächlich aus?&lt;br /&gt;
* Gibt es Unterschiede?&lt;br /&gt;
&lt;br /&gt;
== Formatierung und Namen ==&lt;br /&gt;
Wieso haben wir die Code-Beispiele nach den geschweiften Klammern eingerückt und die Variablen so benannt, wie wir es taten und nicht so:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class _{static long _&lt;br /&gt;
(long __,long  ___) {&lt;br /&gt;
return __==0 ?___+ 1:&lt;br /&gt;
___==0?_(__-1,1):_(__&lt;br /&gt;
-1,_(__, ___-1)) ;  }&lt;br /&gt;
static  {int _=2 ,___&lt;br /&gt;
= 2;System.out.print(&lt;br /&gt;
&amp;quot;a(&amp;quot;+_+’,’+___+ &amp;quot;)=&amp;quot;+&lt;br /&gt;
_ (_,  ___) ) ;System&lt;br /&gt;
.exit(1);}}//(C) Ulli&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nenne mindestens einen Grund und erkläre ihn deinem Tutor.&lt;br /&gt;
&lt;br /&gt;
Etwas weniger Extrem, wieso haben wir unser zweites Beispiel nicht so gestellt?&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Beispiel {public static void main&lt;br /&gt;
	(String [] ignored) {&lt;br /&gt;
	System.out.println(0); int zero = 0;&lt;br /&gt;
			System.out.println(zero);&lt;br /&gt;
		int one = 1;&lt;br /&gt;
		int whatsThis = zero;&lt;br /&gt;
			System.out.&lt;br /&gt;
		println(whatsThis);&lt;br /&gt;
	whatsThis = one;		System.out.println(whatsThis)&lt;br /&gt;
;}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nenne mindestens einen Grund und erkläre ihn deinem Tutor.&lt;br /&gt;
&lt;br /&gt;
Wieso haben wir unser zweites Beispiel nicht so gestellt?&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class b {&lt;br /&gt;
	public static void main(String [] i) {&lt;br /&gt;
		System.out.println(0);&lt;br /&gt;
		int a = 0;&lt;br /&gt;
		System.out.println(a);&lt;br /&gt;
		int b = 1;&lt;br /&gt;
		int c = a;&lt;br /&gt;
		System.out.println(c);&lt;br /&gt;
		c = b;&lt;br /&gt;
		System.out.println(c);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
Nenne mindestens einen Grund und erkläre ihn deinem Tutor.&lt;br /&gt;
&lt;br /&gt;
== Variablen mit verschiedenen Typen zuweisen ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Test {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= if =&lt;br /&gt;
== Einfache if-Bedingung ==&lt;br /&gt;
Überlege dir, was das folgende Code-Fragment macht.&lt;br /&gt;
Führe es aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
* Was sind die Unterschiede?&lt;br /&gt;
* Warum?&lt;br /&gt;
Erkläre einem Tutor, zu welchem Schluss du gekommen bist und frage ihn, ob du Recht hast.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class If_Uebung1 {&lt;br /&gt;
    /* Eure Aufgabe:&lt;br /&gt;
     * Versucht nachzuvollziehen, was dieses Programm macht &lt;br /&gt;
     * und schaut Euch den Code an.&lt;br /&gt;
     */&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        /* &lt;br /&gt;
         * Wir erzeugen uns hier eine Zufallszahl im&lt;br /&gt;
         * Bereich 1-6. Warum funktioniert das so?&lt;br /&gt;
         * Math.random ist eine statische Funktion im &lt;br /&gt;
         * Math-Paket, die uns eine double-Zahl kleiner&lt;br /&gt;
         * als 1.0, aber groesser oder gleich 0 liefert.&lt;br /&gt;
         * Mit 6 multipliziert und um Eins erhöht erhalten wir&lt;br /&gt;
         * Zahlen von 1.0 bis 6.99999...&lt;br /&gt;
         * Durch das Umwandeln in int werden die Nachkommastellen abgeschnitten&lt;br /&gt;
         * und wir erhalten ein int von 1 bis 6.&lt;br /&gt;
         */&lt;br /&gt;
        int wuerfelzahl = (int) (1 + (6 * Math.random()));&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Zur Kontrolle geben wir das Ergebnis aus &lt;br /&gt;
         */&lt;br /&gt;
        System.out.println(&amp;quot;Der Würfel hat &amp;quot; + wuerfelzahl + &amp;quot; ergeben.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * Ist das Ergebnis groesser als 3 ?&lt;br /&gt;
         */&lt;br /&gt;
        if (wuerfelzahl &amp;gt; 3) {&lt;br /&gt;
            // Wenn ja gib diesen Text aus:&lt;br /&gt;
            System.out.println(&amp;quot;mehr als 3!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== if-else-Konstrukt ==&lt;br /&gt;
Überlege dir, was das folgende Code-Fragment macht.&lt;br /&gt;
Führe es aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
* Was sind die Unterschiede?&lt;br /&gt;
* Warum?&lt;br /&gt;
Erkläre einem Tutor, zu welchem Schluss du gekommen bist und frage ihn, ob du Recht hast.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class If_Uebung2 {&lt;br /&gt;
&lt;br /&gt;
    public static void main (String[] args){&lt;br /&gt;
&lt;br /&gt;
        int x=10;&lt;br /&gt;
        if (x&amp;gt;5) {&lt;br /&gt;
             System.out.println(&amp;quot;x ist groesser als 5&amp;quot;); &lt;br /&gt;
        } else {&lt;br /&gt;
             System.out.println(&amp;quot;x ist kleiner/gleich 5&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mehrere if-Bedingungen ==&lt;br /&gt;
Überlege dir, was das folgende Code-Fragment macht.&lt;br /&gt;
Führe es aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
&lt;br /&gt;
Was macht das Programm für verschiedene Werte von &#039;&#039;wert&#039;&#039;?. &lt;br /&gt;
&lt;br /&gt;
Welche If-Abfragen sind unnötig, weil man die Ausgaben in else-Zweige von bereits vorhandenen schreiben könnte?&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class If_Uebung3 {    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        &lt;br /&gt;
        int wert;&lt;br /&gt;
        &lt;br /&gt;
        wert = 5;&lt;br /&gt;
        &lt;br /&gt;
        if (wert&amp;lt;5){&lt;br /&gt;
            System.out.println(&amp;quot;Der Wert ist echt kleiner 5.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (wert&amp;gt;5){&lt;br /&gt;
            System.out.println(&amp;quot;Der Wert ist echt groesser 5.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (wert==5){&lt;br /&gt;
            System.out.println(&amp;quot;Der Wert ist gleich 5&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (wert&amp;gt;=5){&lt;br /&gt;
            System.out.println(&amp;quot;Der Wert ist groesser oder gleich 5&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (wert&amp;lt;=5){&lt;br /&gt;
            System.out.println(&amp;quot;Der Wert ist kleiner oder gleich 5&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= while =&lt;br /&gt;
== Einfache Schleife ==&lt;br /&gt;
Schreibe eine Schleife die unendlich oft &amp;quot;Hallo Welt!&amp;quot; ausgibt.&lt;br /&gt;
&lt;br /&gt;
== Begrenzte Schleifen ==&lt;br /&gt;
* Schreibe eine for-Schleife, die 10 mal &amp;quot;Hallo Welt!!&amp;quot; ausgibt.&lt;br /&gt;
* Verändere diese Schleife, so dass sie abwechselnd &amp;quot;Hallo Welt!&amp;quot; und &amp;quot;Ich bin im Javakurs!&amp;quot; ausgibt&lt;br /&gt;
** Es gibt zwei Möglichkeiten das zu realisieren - finde die andere.&lt;br /&gt;
&lt;br /&gt;
== einfache while-Schleife ==&lt;br /&gt;
Überlege dir, was das folgende Code-Fragment macht. Welche Zahlen werden ausgegeben?&lt;br /&gt;
Führe es aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class While_Uebung1 {&lt;br /&gt;
&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        int x=10;&lt;br /&gt;
        while (x&amp;gt;0){&lt;br /&gt;
            System.out.println(&amp;quot; x=&amp;quot; + x);  // Anhaengen von x an den String&lt;br /&gt;
            x=x-1;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= for =&lt;br /&gt;
== for-Schleifen zum Zählen ==&lt;br /&gt;
Überlege dir, was das folgende Code-Fragment macht. Welche Zahlen werden ausgegeben?&lt;br /&gt;
Führe es aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class For_Uebung1 {&lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;erste for Schleife:&amp;quot;);&lt;br /&gt;
        for (int i = 1; i &amp;lt;= 10; i = i + 1) {&lt;br /&gt;
            System.out.print(&amp;quot; &amp;quot; + i);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(); // Zeilenumbruch&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;zweite for Schleife:&amp;quot;);&lt;br /&gt;
        for (int i = 1; i &amp;lt;= 10; i = i + 2) {&lt;br /&gt;
            System.out.print(&amp;quot; &amp;quot; + i);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(); // Zeilenumbruch&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;dritte for Schleife:&amp;quot;);&lt;br /&gt;
        for (int i = 1; i &amp;lt;= 10; i = i * 2) {&lt;br /&gt;
            System.out.print(&amp;quot; &amp;quot; + i);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(); // Zeilenumbruch&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== for-Schleife und if-Bedingung ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
public class ForIf_Uebung {&lt;br /&gt;
    &lt;br /&gt;
    // Welche Zahlen gibt dieses Programm aus ?&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        for (int i=1;i&amp;lt;10;i++){&lt;br /&gt;
            if ((i % 2)==0){ // % ist der Modulo-Operator &lt;br /&gt;
                System.out.println(&amp;quot;Die Zahl &amp;quot;+i+&amp;quot; ist gerade.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
== Argumente ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
class Beispiel {&lt;br /&gt;
	public static void main(String [] ignored) {&lt;br /&gt;
		ausgabe(1, &amp;quot;Martin&amp;quot;);&lt;br /&gt;
		ausgabe(&amp;quot;Arthur&amp;quot;, 2);&lt;br /&gt;
		ausgabe(3, &amp;quot;Florian&amp;quot;);&lt;br /&gt;
		ausgabe(&amp;quot;Robert&amp;quot;, 4);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	static void ausgabe(int i, String string) {&lt;br /&gt;
		System.out.println(i + &amp;quot;: &amp;quot; + string);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Überlege was dieses Beispiel ausgibt.&lt;br /&gt;
* Probiere es aus und erkläre den Unterschied. (Wenn Fehler auftreten, erkläre wieso)&lt;br /&gt;
* Erkläre das einem Tutor&lt;br /&gt;
&lt;br /&gt;
== Was tut das? ==&lt;br /&gt;
Überlege dir, was das folgenden Code-Fragmente machen. Welche Zahlen werden ausgegeben?&lt;br /&gt;
Führe sie aus und vergleiche mit deinen Erwartungen. &lt;br /&gt;
&lt;br /&gt;
(Kopiere den Beispiel-Code in eine Datei, kompiliere sie und führe sie aus)&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
//file: Methoden1.java&lt;br /&gt;
class Methoden1 {&lt;br /&gt;
    public static void main (String[] arguments) {&lt;br /&gt;
        System.out.println( gibMirNeZahl() );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static double gibMirNeZahl() {&lt;br /&gt;
        return 15.3;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//file: Methoden2.java&lt;br /&gt;
class Methoden3 {&lt;br /&gt;
    public static void main (String[] arguments) {&lt;br /&gt;
        System.out.println( mathematik(1, 2) );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static boolean mathematik(int argument1, int argument2) {&lt;br /&gt;
        return (argument1 + 5) &amp;lt; (argument2 * 2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//file: Methoden3.java&lt;br /&gt;
class Methoden3 {&lt;br /&gt;
    public static void main (String[] arguments) {&lt;br /&gt;
        System.out.println( mathematik(1, 2) );&lt;br /&gt;
        System.out.println( mathematik(1, 5) );&lt;br /&gt;
        System.out.println( mathematik(3, 4) );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static boolean mathematik(int argument1, int argument2) {&lt;br /&gt;
        return (argument1 + 5) &amp;lt; (argument2 * 2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//file: Methoden4.java&lt;br /&gt;
class Methoden4 {&lt;br /&gt;
    public static void main (String[] arguments) {&lt;br /&gt;
        int eineZahl = 2;&lt;br /&gt;
        System.out.println( mathematik(4, eineZahl) );&lt;br /&gt;
        eineZahl = 5;&lt;br /&gt;
        System.out.println( mathematik(2, eineZahl) );&lt;br /&gt;
        System.out.println( mathematik(eineZahl, 4) );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static boolean mathematik(int argument1, int argument2) {&lt;br /&gt;
        return (argument1 + 5) &amp;lt; (argument2 * 2);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Selbst einige Methoden schreiben! ==&lt;br /&gt;
Im Folgenden wollen wir einige (mathematische)-Methoden programmieren.&lt;br /&gt;
&lt;br /&gt;
* Lege eine neue Klasse &amp;quot;MatheAufgabe&amp;quot; an.&lt;br /&gt;
* Füge eine &amp;lt;code&amp;gt;public static void main(Strings[] arguments)&amp;lt;/code&amp;gt; Methode hinzu.&lt;br /&gt;
* Deklariere innerhalb der &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;-Methode eine &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;-Variable.&lt;br /&gt;
* Belege diese Variable dem Wert &amp;lt;code&amp;gt;5/3&amp;lt;/code&amp;gt; und gib den Inhalt der Variable auf dem Bildschirm aus.&lt;br /&gt;
* Schreibe nun eine Methode &amp;lt;code&amp;gt;public static double add(double x, double y)&amp;lt;/code&amp;gt;, die die Summe der beiden übergebenen Zahlen &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; zurückgibt.&lt;br /&gt;
** Teste deine Methode mit verschiedenen Eingaben wie z.B.&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
System.out.println(&amp;quot; 1.0 + 2.0 = &amp;quot; + add ( 1.0 , 2.0 ) );&lt;br /&gt;
double x = 5.0;&lt;br /&gt;
System.out.println( &amp;quot; &amp;quot; + x + &amp;quot; + 2.0 = &amp;quot; + add ( x , 2.0) );&lt;br /&gt;
System.out.println( &amp;quot; 2.0 + &amp;quot; + x + &amp;quot; = &amp;quot; + add ( 2.0 , x) );&lt;br /&gt;
x = add ( x , 2.0);&lt;br /&gt;
System.out.println( x);&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
* Schreibe nun eine Methode &amp;lt;code&amp;gt;sub&amp;lt;/code&amp;gt;, welche die Differenz zweier übergebener Werte zurückgibt.&lt;br /&gt;
** Teste deine Methode wie eben!&lt;br /&gt;
** Überprüfe, ob x == (x - y ) + y gilt! (natürlich mit deinen &amp;lt;code&amp;gt;sub&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;add&amp;lt;/code&amp;gt;-Modthoden)&lt;br /&gt;
* Schreibe nun eine &amp;lt;code&amp;gt;mul&amp;lt;/code&amp;gt;-Methode.&lt;br /&gt;
** Benutze dazu nicht den operator *. Rufe statt dessen deine add-Methode auf.&lt;br /&gt;
** Teste deine Methode wie eben!&lt;br /&gt;
* Schreibe nun eine &amp;lt;code&amp;gt;public static double pow ( double basis, int exponent)&amp;lt;/code&amp;gt;, die &amp;lt;code&amp;gt;basis&amp;lt;/code&amp;gt; hoch &amp;lt;code&amp;gt;exponent&amp;lt;/code&amp;gt; zurückgibt. &amp;lt;code&amp;gt;pow(2,3)&amp;lt;/code&amp;gt; wurde z.B. 2^3=8 zurückgeben.&lt;br /&gt;
** Benutze auch hier weder *, noch Math.pow(). Nutze statt dessen deine ebend geschriebene mul-Methode.&lt;br /&gt;
** Teste deine Methode wie gehabt!&lt;br /&gt;
**: Was liefert deine Methode wenn der Exponent 0 ist?&lt;br /&gt;
**: Was liefert deine Methode wenn der Exponent negativ ist?&lt;br /&gt;
&lt;br /&gt;
= Arrays (eindimensional und n-dimensional) =&lt;br /&gt;
== Eindimensionale Arrays ==&lt;br /&gt;
Folgendes Array-Konstrukt wird initialisiert&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
int[] meinArray1 = new int[5];&lt;br /&gt;
meinArray1[0] = 0;&lt;br /&gt;
meinArray1[1] = 1;&lt;br /&gt;
meinArray1[2] = 2;&lt;br /&gt;
meinArray1[3] = 3;&lt;br /&gt;
meinArray1[4] = 4;&lt;br /&gt;
&lt;br /&gt;
int[] meinArray2 = new int[3];&lt;br /&gt;
meinArray2[0] = 0;&lt;br /&gt;
meinArray2[1] = 1;&lt;br /&gt;
meinArray2[2] = 2;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Was geben die folgenden &amp;quot;system.out.println&amp;quot; jeweils aus?&lt;br /&gt;
Vergleiche die Ausgabe mit Deinem Ergebnis.&lt;br /&gt;
&lt;br /&gt;
1.1.&lt;br /&gt;
 System.out.println(meinArray1.length);&lt;br /&gt;
&lt;br /&gt;
1.2.&lt;br /&gt;
 System.out.println(meinArray2.length);&lt;br /&gt;
&lt;br /&gt;
1.3.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray1[1]);&lt;br /&gt;
&lt;br /&gt;
1.4.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray2[1]);&lt;br /&gt;
&lt;br /&gt;
1.5.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray1[4]);&lt;br /&gt;
&lt;br /&gt;
1.6.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray2[4]);&lt;br /&gt;
&lt;br /&gt;
1.7.&lt;br /&gt;
 System.out.println(meinArray1.length-1);&lt;br /&gt;
&lt;br /&gt;
1.8.&lt;br /&gt;
 System.out.println(meinArray2.length-1);&lt;br /&gt;
&lt;br /&gt;
1.9.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray1[0]);&lt;br /&gt;
&lt;br /&gt;
1.10.&lt;br /&gt;
 System.out.println(&amp;quot;Ergebnis:&amp;quot;+meinArray2[0]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Zweidimensionale Arrays ==&lt;br /&gt;
Folgendes Array-Konstrukt wird initialisiert&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
int[][] meinArray3 = new int[2][3];&lt;br /&gt;
meinArray3[0][0] = 1;&lt;br /&gt;
meinArray3[1][1] = 2;&lt;br /&gt;
meinArray3[0][2] = 1;&lt;br /&gt;
meinArray3[1][0] = 2;&lt;br /&gt;
meinArray3[0][1] = 1;&lt;br /&gt;
meinArray3[1][2] = 2;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was geben die folgenden &amp;quot;system.out.println&amp;quot; jeweils aus?&lt;br /&gt;
Vergleiche die Ausgabe mit Deinem Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Tipp: Aus der Mathematik kennst Du Matrizen. Ihre Größe wird mit (n x m) angegeben. &lt;br /&gt;
&lt;br /&gt;
 System.out.println(meinArray3[0][0]+meinArray3[0][1]+meinArray3[0][2]);&lt;br /&gt;
 System.out.println(meinArray3[1][0]+meinArray3[1][1]+meinArray3[1][2]);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Dreidimensionale Arrays ==&lt;br /&gt;
Folgendes Array-Konstrukt wird initialisiert&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
int[][][] meinArray3D = new int[2][2][2];&lt;br /&gt;
meinArray3D[0][0][0] = 1;&lt;br /&gt;
meinArray3D[0][1][1] = 2;&lt;br /&gt;
meinArray3D[0][1][0] = 2;&lt;br /&gt;
meinArray3D[0][0][1] = 1;&lt;br /&gt;
&lt;br /&gt;
meinArray3D[1][0][0] = 3;&lt;br /&gt;
meinArray3D[1][1][1] = 4;&lt;br /&gt;
meinArray3D[1][1][0] = 4;&lt;br /&gt;
meinArray3D[1][0][1] = 3;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Was geben die folgenden &amp;quot;system.out.println&amp;quot; jeweils aus?&lt;br /&gt;
Vergleiche die Ausgabe mit Deinem Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Tipp: Aus der Mathematik kennst Du mehrdimensionale Obejekte. &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
System.out.println(meinArray3D[0][0][0]+meinArray3D[0][0][1]);&lt;br /&gt;
System.out.println(meinArray3D[0][1][0]+meinArray3D[0][1][1]);&lt;br /&gt;
System.out.println(meinArray3D[1][0][0]+meinArray3D[1][0][1]);&lt;br /&gt;
System.out.println(meinArray3D[1][1][0]+meinArray3D[1][1][1]);&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Klassen =&lt;br /&gt;
(todo)&lt;/div&gt;</summary>
		<author><name>192.168.23.194</name></author>
	</entry>
</feed>