<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://sibiwiki.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mgrifka</id>
	<title>SibiWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://sibiwiki.de/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mgrifka"/>
	<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Mgrifka"/>
	<updated>2026-04-11T13:37:35Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL-Aufgaben-10&amp;diff=3756</id>
		<title>SQL-Aufgaben-10</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL-Aufgaben-10&amp;diff=3756"/>
		<updated>2025-05-05T19:23:44Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Exkurs: InstaHub */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-10]]&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von [[SQL-10|SQL]]-Aufgaben zur Beispieldatenbank Schule.&lt;br /&gt;
&lt;br /&gt;
* Die Aufgaben sind nach technischen Gesichtspunkten und Schwierigkeitsgrad gegliedert.&lt;br /&gt;
&lt;br /&gt;
* '''Erläuterungen''' zu SQL am Beispiel der Datenbank &amp;quot;Schule&amp;quot; finden sich im Artikel [[SQL-10]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Beispieldatenbank Schule=&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''. &amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Eine Tabelle=&lt;br /&gt;
Die folgenden Aufgaben beziehen sich auf nur eine Tabelle.&lt;br /&gt;
==SELECT, FROM,  WHERE, ORDER BY, DISTINCT, LIKE (mit %) ==&lt;br /&gt;
# Eine Liste aller Lehrer mit Name und Vorname, alphabetisch sortiert nach dem Namen.&lt;br /&gt;
# Eine Liste der Räume: Raumnummer und Anzahl der Plätze, sortiert nach der Anzahl der Plätze und zwar so, dass die großen Räume zuerst kommen.&lt;br /&gt;
# Eine Liste der Unterrichtsfächer; jedes Fach soll in der Liste nur einmal erscheinen.&lt;br /&gt;
# Eine Liste der Räume, deren Raumnummer mit &amp;quot;R&amp;quot; beginnt.&lt;br /&gt;
&lt;br /&gt;
==Aggregatfunktionen: COUNT, SUM, AVG, MAX, MIN==&lt;br /&gt;
# Wieviele Schüler gibt es insgesamt?&lt;br /&gt;
# Wieviele Stunden Unterricht werden insgesamt erteilt?&lt;br /&gt;
# Wieviele Stunden Sport werden erteilt?&lt;br /&gt;
# Wieviele Plätze hat der größte Raum?&lt;br /&gt;
# Wieviele Plätze haben die Räume in der oberen Etage durchschnittlich?&lt;br /&gt;
&lt;br /&gt;
==GROUP BY, AS==&lt;br /&gt;
Die folgenden Abfragen benutzen ''zusätzlich'' die Befehle GROUP BY und AS.&lt;br /&gt;
# Eine Liste der Etagen, in der vermerkt ist, wieviele Räume es jeweils in der Etage gibt. Die Ergebnistabelle soll die Überschriften &amp;quot;Etage&amp;quot; und &amp;quot;Raeume&amp;quot; haben.&lt;br /&gt;
# Eine Liste aller Unterrichtsfächer, in der steht, wieviele Stunden sie jeweils unterrichtet werden; die Unterrichtsfächer mit vielen Stunden sollen oben stehen. Die Ergebnistabelle soll die Überschriften &amp;quot;Fach&amp;quot; und &amp;quot;Stundenzahl&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
=Mehrere Tabellen=&lt;br /&gt;
&lt;br /&gt;
==SELECT, FROM, WHERE==&lt;br /&gt;
Hier werden nur die Befehle SELECT, FROM und WHERE benutzt.&lt;br /&gt;
# Eine Liste der Schüler, aus der hervorgeht, in welcher Klasse sie jeweils sind.&lt;br /&gt;
# Eine Liste der Klassen, jeweils mit Klassenlehrer.&lt;br /&gt;
# Eine Liste der Unterrichtsfächer der Klasse 8B.&lt;br /&gt;
# Eine Liste der Räume, in denen die 8B Unterricht hat.&lt;br /&gt;
# Eine Liste der Schüler, die in Raum R112 Unterricht haben.&lt;br /&gt;
&lt;br /&gt;
==ORDER BY, GROUP BY, COUNT, SUM, AVG, MAX, MIN, AS==&lt;br /&gt;
&lt;br /&gt;
# Eine Liste der Klassen mit der Anzahl der Schüler; sortiert nach der Anzahl der Schüler.&lt;br /&gt;
# Eine Liste der Klassen, aus der hervorgeht, wieviele Stunden Unterricht die jeweilige Klasse hat. Die Liste soll nach der Anzahl der Stunden sortiert sein.&lt;br /&gt;
# Eine Liste der Räume, aus der hervorgeht, wie viele Stunden Unterricht in jedem Raum erteilt wird.&lt;br /&gt;
&lt;br /&gt;
== Exkurs: InstaHub ==&lt;br /&gt;
Fotos, die per Link als Werbung in euren InstaHub eingebunden werden können:&lt;br /&gt;
[[Datei:SIBI Eyeliner.png|mini]]&lt;br /&gt;
[[Datei:Beardpflege im dramatischen Licht.png|mini]]&lt;br /&gt;
[[Datei:SiBi SuperMove im Gelände.png|mini]]&lt;br /&gt;
[[Datei:Trump.png|mini]]&lt;br /&gt;
[[Datei:ElonCar.jpg|mini]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:ElonCar.jpg&amp;diff=3755</id>
		<title>Datei:ElonCar.jpg</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:ElonCar.jpg&amp;diff=3755"/>
		<updated>2025-05-05T19:23:39Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;eloncar&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:Trump.png&amp;diff=3754</id>
		<title>Datei:Trump.png</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:Trump.png&amp;diff=3754"/>
		<updated>2025-05-05T19:23:18Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;trump&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL-Aufgaben-10&amp;diff=3753</id>
		<title>SQL-Aufgaben-10</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL-Aufgaben-10&amp;diff=3753"/>
		<updated>2025-04-29T09:45:49Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-10]]&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von [[SQL-10|SQL]]-Aufgaben zur Beispieldatenbank Schule.&lt;br /&gt;
&lt;br /&gt;
* Die Aufgaben sind nach technischen Gesichtspunkten und Schwierigkeitsgrad gegliedert.&lt;br /&gt;
&lt;br /&gt;
* '''Erläuterungen''' zu SQL am Beispiel der Datenbank &amp;quot;Schule&amp;quot; finden sich im Artikel [[SQL-10]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Beispieldatenbank Schule=&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''. &amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Eine Tabelle=&lt;br /&gt;
Die folgenden Aufgaben beziehen sich auf nur eine Tabelle.&lt;br /&gt;
==SELECT, FROM,  WHERE, ORDER BY, DISTINCT, LIKE (mit %) ==&lt;br /&gt;
# Eine Liste aller Lehrer mit Name und Vorname, alphabetisch sortiert nach dem Namen.&lt;br /&gt;
# Eine Liste der Räume: Raumnummer und Anzahl der Plätze, sortiert nach der Anzahl der Plätze und zwar so, dass die großen Räume zuerst kommen.&lt;br /&gt;
# Eine Liste der Unterrichtsfächer; jedes Fach soll in der Liste nur einmal erscheinen.&lt;br /&gt;
# Eine Liste der Räume, deren Raumnummer mit &amp;quot;R&amp;quot; beginnt.&lt;br /&gt;
&lt;br /&gt;
==Aggregatfunktionen: COUNT, SUM, AVG, MAX, MIN==&lt;br /&gt;
# Wieviele Schüler gibt es insgesamt?&lt;br /&gt;
# Wieviele Stunden Unterricht werden insgesamt erteilt?&lt;br /&gt;
# Wieviele Stunden Sport werden erteilt?&lt;br /&gt;
# Wieviele Plätze hat der größte Raum?&lt;br /&gt;
# Wieviele Plätze haben die Räume in der oberen Etage durchschnittlich?&lt;br /&gt;
&lt;br /&gt;
==GROUP BY, AS==&lt;br /&gt;
Die folgenden Abfragen benutzen ''zusätzlich'' die Befehle GROUP BY und AS.&lt;br /&gt;
# Eine Liste der Etagen, in der vermerkt ist, wieviele Räume es jeweils in der Etage gibt. Die Ergebnistabelle soll die Überschriften &amp;quot;Etage&amp;quot; und &amp;quot;Raeume&amp;quot; haben.&lt;br /&gt;
# Eine Liste aller Unterrichtsfächer, in der steht, wieviele Stunden sie jeweils unterrichtet werden; die Unterrichtsfächer mit vielen Stunden sollen oben stehen. Die Ergebnistabelle soll die Überschriften &amp;quot;Fach&amp;quot; und &amp;quot;Stundenzahl&amp;quot; haben.&lt;br /&gt;
&lt;br /&gt;
=Mehrere Tabellen=&lt;br /&gt;
&lt;br /&gt;
==SELECT, FROM, WHERE==&lt;br /&gt;
Hier werden nur die Befehle SELECT, FROM und WHERE benutzt.&lt;br /&gt;
# Eine Liste der Schüler, aus der hervorgeht, in welcher Klasse sie jeweils sind.&lt;br /&gt;
# Eine Liste der Klassen, jeweils mit Klassenlehrer.&lt;br /&gt;
# Eine Liste der Unterrichtsfächer der Klasse 8B.&lt;br /&gt;
# Eine Liste der Räume, in denen die 8B Unterricht hat.&lt;br /&gt;
# Eine Liste der Schüler, die in Raum R112 Unterricht haben.&lt;br /&gt;
&lt;br /&gt;
==ORDER BY, GROUP BY, COUNT, SUM, AVG, MAX, MIN, AS==&lt;br /&gt;
&lt;br /&gt;
# Eine Liste der Klassen mit der Anzahl der Schüler; sortiert nach der Anzahl der Schüler.&lt;br /&gt;
# Eine Liste der Klassen, aus der hervorgeht, wieviele Stunden Unterricht die jeweilige Klasse hat. Die Liste soll nach der Anzahl der Stunden sortiert sein.&lt;br /&gt;
# Eine Liste der Räume, aus der hervorgeht, wie viele Stunden Unterricht in jedem Raum erteilt wird.&lt;br /&gt;
&lt;br /&gt;
== Exkurs: InstaHub ==&lt;br /&gt;
Fotos, die per Link als Werbung in euren InstaHub eingebunden werden können:&lt;br /&gt;
[[Datei:SIBI Eyeliner.png|mini]]&lt;br /&gt;
[[Datei:Beardpflege im dramatischen Licht.png|mini]]&lt;br /&gt;
[[Datei:SiBi SuperMove im Gelände.png|mini]]&lt;br /&gt;
&lt;br /&gt;
Republicans:&lt;br /&gt;
Elon Car:&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:SiBi_SuperMove_im_Gel%C3%A4nde.png&amp;diff=3752</id>
		<title>Datei:SiBi SuperMove im Gelände.png</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:SiBi_SuperMove_im_Gel%C3%A4nde.png&amp;diff=3752"/>
		<updated>2025-04-29T09:45:37Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;SuperMover&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:Beardpflege_im_dramatischen_Licht.png&amp;diff=3751</id>
		<title>Datei:Beardpflege im dramatischen Licht.png</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:Beardpflege_im_dramatischen_Licht.png&amp;diff=3751"/>
		<updated>2025-04-29T09:45:05Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Bartpflege&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:SIBI_Eyeliner.png&amp;diff=3750</id>
		<title>Datei:SIBI Eyeliner.png</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:SIBI_Eyeliner.png&amp;diff=3750"/>
		<updated>2025-04-29T09:43:59Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eyeliner&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL-10&amp;diff=3715</id>
		<title>SQL-10</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL-10&amp;diff=3715"/>
		<updated>2024-10-01T09:59:15Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-10]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
SQL steht für '''Structured Query Language''' und ist die Standard-Programmiersprache für die Abfrage von Datenbanken.&lt;br /&gt;
&lt;br /&gt;
* Hier finden sich Erläuterungen zu allen SQL-Techniken, die in der 10. Klasse wichtig sind.&lt;br /&gt;
* Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben-10|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
* Alle Beispiele auf dieser Seite kann man selber testen: &amp;lt;br/&amp;gt;'''[http://sibi-wiki.de/sql/ hier_klicken]'''. &amp;lt;br/&amp;gt;Die Zugangsdaten erfahrt ihr im Informatikunterricht.&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/fV1B-EWYPk0 Zusammenfassen mit GROUP BY]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/443ew7CVC0Y SQL-Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
=Übersicht über die SQL-Befehle in Klasse 09=&lt;br /&gt;
&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC, AS&lt;br /&gt;
* Vergleichsoperatoren: =, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE (in Zusammenhang mit %)&lt;br /&gt;
* Logische Operatoren: AND, OR&lt;br /&gt;
* Aggregat-Funktionen: COUNT, SUM, MAX, MIN&lt;br /&gt;
&lt;br /&gt;
=Beispieldatenbank Schule=&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule [http://sibiwiki.de/sql/index.php hier]. Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&lt;br /&gt;
=Aufbau von SQL-Abfragen=&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT ...&lt;br /&gt;
 FROM ...&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein.&lt;br /&gt;
* Die anderen Teile können dabei sein, müssen aber nicht.&lt;br /&gt;
&lt;br /&gt;
=Einfache Abfrage mit SELECT, FROM, WHERE=&lt;br /&gt;
Bei SELECT kann man die '''Attribute''' angeben, die ausgegeben werden sollen. Mehrere Attribute werden durch Komma getrennt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
Eine SQL-Abfrage, die die Raumnummer und Etage zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT nummer, etage&lt;br /&gt;
 FROM raum&lt;br /&gt;
 WHERE plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kann auch '''&amp;lt;code&amp;gt;SELECT *&amp;lt;/code&amp;gt;''' angeben - dann werden alle Attribute ausgegeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
Eine SQL-Abfrage, die alle Attribute zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM raum&lt;br /&gt;
 WHERE plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die Nummer und die Plätze von allen Räumen aus der unteren und der mittleren Etage.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT nummer, plaetze&lt;br /&gt;
   FROM raum&lt;br /&gt;
   WHERE etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LIKE und der Joker &amp;quot;%&amp;quot;==&lt;br /&gt;
Manchmal kennt man nicht die ganze Information, sondern nur einen Teil.&lt;br /&gt;
&lt;br /&gt;
Dann kann man eine Abfrage mit LIKE und % formulieren.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Name und Vorname von allen Schülern, deren Vorname mit &amp;quot;M&amp;quot; anfängt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT name, vorname&lt;br /&gt;
 FROM schueler&lt;br /&gt;
 WHERE vorname LIKE 'M%'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Das %-Zeichen kann für eine beliebige Fortsetzung stehen.&lt;br /&gt;
* Die WHERE-Bedingung trifft zu auf &amp;lt;u&amp;gt;'''M'''&amp;lt;/u&amp;gt;aria Schwarzmüller und &amp;lt;u&amp;gt;'''M'''&amp;lt;/u&amp;gt;ichael Schmidt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Name und Vorname von allen Lehrern, deren Name auf &amp;quot;er&amp;quot; endet.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT name, vorname&lt;br /&gt;
 FROM lehrer&lt;br /&gt;
 WHERE name LIKE '%er'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Das %-Zeichen kann für einen beliebigen Anfang stehen.&lt;br /&gt;
* Die WHERE-Bedingung trifft zu auf Georg Buttenmüll&amp;lt;u&amp;gt;'''er'''&amp;lt;/u&amp;gt; und Erika Hub'''&amp;lt;u&amp;gt;er&amp;lt;/u&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
==ORDER BY==&lt;br /&gt;
Mit ORDER BY kann man angeben, wie die Ausgabe sortiert werden soll.&lt;br /&gt;
&lt;br /&gt;
Dabei wird Text alphabetisch sortiert und Zahlen werden aufsteigend sortiert.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste der Schüler (mit Name und Vorname), sortiert nach dem Namen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT name, vorname&lt;br /&gt;
  FROM schueler&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ORDER BY name'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===ORDER BY ... DESC===&lt;br /&gt;
Mit ORDER BY ... DESC wird '''absteigend''' sortiert.&lt;br /&gt;
&lt;br /&gt;
Dabei wird Text alphabetisch sortiert und Zahlen werden aufsteigend sortiert.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste der Räume (Nummer, Etage und Plätze), '''absteigend''' sortiert nach Plätzen, d.h. der größte Raum steht oben.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT nummer, etage, plaetze&lt;br /&gt;
  FROM raum&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ORDER BY plaetze DESC'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==DISTINCT==&lt;br /&gt;
&lt;br /&gt;
Mit DISTINCT kann man dafür sorgen, dass in der Ausgabe jeder Wert nur einmal vorkommt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine SQL-Abfrage, die für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; die Etagen wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;'''DISTINCT'''&amp;lt;/u&amp;gt; etage&lt;br /&gt;
  FROM raum&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Ohne DISTINCT würde jede Etage mehrfach aufgeführt - so oft, wie es Zeilen in der Tabelle gibt.''&lt;br /&gt;
&lt;br /&gt;
= Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) =&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden SQL-Abfrage kann man ermitteln, wie viele Schüler es gibt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Zeilen &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;. Mit COUNT(&amp;lt;u&amp;gt;'''*'''&amp;lt;/u&amp;gt;) wird nicht ein Attribut gezählt, sondern jede Zeile, die ein Attribut enthält.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht&lt;br /&gt;
   WHERE fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;summiert&amp;lt;/u&amp;gt; (d.h. zusammenaddiert).&lt;br /&gt;
&lt;br /&gt;
=GROUP BY=&lt;br /&gt;
'''Erklärvideo: [https://youtu.be/fV1B-EWYPk0 Zusammenfassen mit GROUP BY]'''&lt;br /&gt;
&lt;br /&gt;
Mit GROUP BY kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT etage, SUM(plaetze)&lt;br /&gt;
   FROM raum&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:'''&lt;br /&gt;
&lt;br /&gt;
* GROUP BY braucht man immer, wenn man in SELECT eine &amp;quot;normale&amp;quot; Abfrage und eine Funktionsabfrage (z.B. SUM) miteinander kombiniert.&lt;br /&gt;
* GROUP BY funktioniert hier wie folgt:&lt;br /&gt;
** Alle Zeilen von zu einer &amp;lt;code&amp;gt;etage&amp;lt;/code&amp;gt; werden zusammengefasst; so gibt es z.B. in der Ergebnistabelle nur eine Zeile für &amp;quot;unten&amp;quot;.&lt;br /&gt;
** Die &amp;lt;code&amp;gt;plaetze&amp;lt;/code&amp;gt; von allen Zeilen, deren &amp;lt;code&amp;gt;etage&amp;lt;/code&amp;gt; &amp;quot;unten&amp;quot; ist, werden aufaddiert.&lt;br /&gt;
* GROUP BY wird am einfachsten auf das Attribut angewendet, das in der SELECT-Abfrage auftaucht (im Beispiel: &amp;lt;code&amp;gt;etage&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
=Umbenennung (Alias, AS)=&lt;br /&gt;
&lt;br /&gt;
Die Spalten, die ausgegeben werden, können umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
Das ist vor allem bei Funktionen hilfreich, weil die Spaltenüberschrift dann manchmal nicht so selbsterklärend ist...&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
Die Überschriften in der Tabelle sind &amp;quot;Etage&amp;quot; und &amp;quot;Plaetze_Insgesamt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT etage &amp;lt;u&amp;gt;'''AS Etage'''&amp;lt;/u&amp;gt;, SUM(plaetze) &amp;lt;u&amp;gt;'''AS PlaetzeInsgesamt'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum&lt;br /&gt;
   GROUP BY etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfrage über mehrere verknüpfte Tabellen=&lt;br /&gt;
'''Erklärvideo: [https://youtu.be/443ew7CVC0Y SQL-Abfragen über mehrere Tabellen]'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Interessant werden Datenbankabfragen erst dann, wenn man Informationen aus mehreren Tabellen miteinander verknüpft!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Abfrage, die angibt, in welchen Räumen die Klasse 8A unterrichtet wird.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT raum.nummer&lt;br /&gt;
 FROM klasse, unterricht, raum&lt;br /&gt;
 '''WHERE raum.id = unterricht.raum_id'''&lt;br /&gt;
 '''AND unterricht.klasse_id = klasse.id'''&lt;br /&gt;
 AND klasse.name = '8A'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Alternativ kann man die Abfrage auch mit JOIN ... ON formulieren:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT raum.nummer&lt;br /&gt;
 FROM klasse &lt;br /&gt;
 '''JOIN unterricht&lt;br /&gt;
 '''   ON unterricht.klasse_id = klasse.id'''&lt;br /&gt;
 '''JOIN raum&lt;br /&gt;
 '''  ON raum.id = unterricht.raum_id'''&lt;br /&gt;
 AND klasse.name = '8A'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterungen:'''&lt;br /&gt;
* Die Abfrage läuft über drei Tabellen: &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;unterricht&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die Tabellen werden wie folgt miteinander verknüpft:&lt;br /&gt;
** &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;unterricht&amp;lt;/code&amp;gt;: Das Attribut &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; in der Tabelle &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; muss mit dem Attribut &amp;lt;code&amp;gt;klasse_id&amp;lt;/code&amp;gt; in der Tabelle unterricht übereinstimmen!&lt;br /&gt;
** &amp;lt;code&amp;gt;unterricht&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt;: Das Attribut &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; in der Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; muss mit dem Attribut &amp;lt;code&amp;gt;raum_id&amp;lt;/code&amp;gt; in der Tabelle unterricht übereinstimmen!&lt;br /&gt;
* '''Wichtig:''' Bei Abfragen über mehrere Tabellen braucht man einen Vergleich weniger als man Tabellen abfragt. D.h. bei drei Tabellen braucht man zwei Verknüpfungen.&lt;br /&gt;
* '''Punkt-Notation:''' Manche Attribute (z.B. &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt;) kommen in mehreren Tabellen vor. Damit SQL weiß, um welche Tabelle es sich handelt, muss man die Tabelle angeben und mit einem Punkt danach das Attribut. Beispiel: &amp;lt;code&amp;gt;raum.id&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Abfrage über mehrere Tabellen mit GROUP BY==&lt;br /&gt;
&lt;br /&gt;
Man kann die Abfrage über mehrere Tabellen auch mit Funktionen und mit GROUP BY kombinieren.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste der Klassen und wieviele Schüler in der Klasse jeweils sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl&lt;br /&gt;
 FROM klasse, schueler&lt;br /&gt;
 WHERE klasse.id = schueler.klasse_id&lt;br /&gt;
 GROUP BY klasse.name&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
oder mit JOIN ... ON formuliert:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT klasse.name, COUNT(schueler.id) AS Schuelerzahl&lt;br /&gt;
 FROM klasse JOIN schueler&lt;br /&gt;
    ON klasse.id = schueler.klasse_id&lt;br /&gt;
 GROUP BY klasse.name&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3705</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3705"/>
		<updated>2024-05-03T09:55:11Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Methoden */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideos==&lt;br /&gt;
&lt;br /&gt;
* '''[https://www.youtube.com/watch?v=dEFJUra_3ZA Java-Crashkurs Teil 1 (28min)] '''&amp;lt;br/&amp;gt;In Teil 1 des Crash-Kurses geht es um Grundlagen der Programmierung einer Klasse, d.h.&amp;lt;br/&amp;gt;Klasse, Attribut, Konstruktor, Methode, Parameter, lokale Variable etc.&lt;br /&gt;
** '''[http://sibiwiki.de/informatik/crashkurs/Taschenrechner.txt Programmiervorlage für den Taschenrechner]'''&lt;br /&gt;
** '''[https://www.jdoodle.com/online-java-compiler/ jdoodle online compiler]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
** '''[[Medium:Java-Crashkurs-Dokumentation.pdf|Cheat sheet für Teil 1 (PDF)]]''' zum Ausdrucken.&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
* '''[[Medium:Taschenrechner-Fehlersuche.pdf|Taschenrechner Fehlersuche zum Ausdrucken (PDF)]]'''&lt;br /&gt;
** '''[http://sibiwiki.de/informatik/crashkurs/Taschenrechner-mit-Fehlern.txt Java-Quelltext für die Fehlersuche]'''&amp;lt;br/&amp;gt;Den Quelltext kann man in [https://www.jdoodle.com/online-java-compiler/ jdoodle] packen und dann die Fehlermeldungen durchklicken!&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
* '''[https://youtu.be/IimFb4cEhUU Java-Crashkurs Teil 2 (40min)] '''&amp;lt;br/&amp;gt;In Teil 2 des Crash-Kurses geht es um get- und set-Methoden, Bedingungen und Schleifen.&lt;br /&gt;
** '''[http://sibiwiki.de/informatik/crashkurs/Taschenrechner2.txt Programmiervorlage für den Taschenrechner (mit allem für Teil 2)]'''&lt;br /&gt;
** '''[https://www.jdoodle.com/online-java-compiler/ jdoodle online compiler]'''&amp;lt;br/&amp;gt;&lt;br /&gt;
** '''[[Medium:Java-Crashkurs-2-Dokumentation.pdf|Cheat sheet für Teil 2 (PDF)]]''' zum Ausdrucken.&lt;br /&gt;
&amp;amp;nbsp;&lt;br /&gt;
* '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&amp;lt;br/&amp;gt;[[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. &amp;lt;br/&amp;gt;Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&amp;lt;br/&amp;gt;&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
 &amp;lt;code&amp;gt; &lt;br /&gt;
  '''public class Baum'''&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen oder &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; für Kommazahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Detaillierte Infos zu den Java-Datentypen finden sich hier: '''[[Java_Basis-Datentypen]]'''&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Auto&amp;lt;/code&amp;gt; können unterschiedlichen Tankstand haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;tankstand&amp;lt;/code&amp;gt;. Dieses hat den Datentyp &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;, weil es eine Kommazahl sein kann.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 public class Auto&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   '''private double tankstand;'''&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einem &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; (für den Stamm) und einem &amp;lt;code&amp;gt;Kreis&amp;lt;/code&amp;gt; (für die Krone). &amp;lt;br/&amp;gt;''Die Klassen &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;Kreis&amp;lt;/code&amp;gt; müssen natürlich schon im Projekt enthalten sein!!''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    '''private Quadrat stamm;'''&lt;br /&gt;
    '''private Kreis krone;'''&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Auto neuesAuto = '''new Auto()''';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Auto&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int tankstand;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    '''public Auto()'''&lt;br /&gt;
    '''{'''&lt;br /&gt;
      '''tankstand = 5.0;'''&lt;br /&gt;
    '''}'''&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch bekommt jedes Auto bei der Erzeugung einen Tankstand von 5.0, d.h. es kann direkt losfahren.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Auto&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private double tankstand;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    '''public Auto(&amp;lt;u&amp;gt;double pTankstand&amp;lt;/u&amp;gt;)'''&lt;br /&gt;
    '''{'''&lt;br /&gt;
      '''tankstand = &amp;lt;u&amp;gt;pTankstand&amp;lt;/u&amp;gt;;'''&lt;br /&gt;
    '''}'''&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung des Autos den Tankstand festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;Auto neuesAuto = '''new Auto(7.0)''';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neuesAuto&amp;lt;/code&amp;gt; den Tankstand 7.0&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Auto soll es die Methode &amp;lt;code&amp;gt;tanken&amp;lt;/code&amp;gt; geben. Außerdem soll man den Tankstand mit der Methode &amp;lt;code&amp;gt;gibTankstand()&amp;lt;/code&amp;gt; auslesen können.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Auto&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private double tankstand;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Auto()&lt;br /&gt;
    {&lt;br /&gt;
      tankstand = 5.0;&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    '''public void tanken(double pLiter)'''&lt;br /&gt;
    '''{'''&lt;br /&gt;
       '''tankstand = tankstand + pLiter;'''&lt;br /&gt;
    '''}'''&lt;br /&gt;
      &lt;br /&gt;
    '''public double gibTankstand()'''   &lt;br /&gt;
    '''{'''&lt;br /&gt;
        '''return tankstand;'''&lt;br /&gt;
    '''}'''&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
'''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     //Attribute&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
     private int preisstufe;&lt;br /&gt;
  &lt;br /&gt;
     //Konstruktor&lt;br /&gt;
     public Automat()&lt;br /&gt;
     {&lt;br /&gt;
        preisstufe = 0;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
     }&lt;br /&gt;
        &lt;br /&gt;
     //Methoden&lt;br /&gt;
    &lt;br /&gt;
     '''public void preisstufeWaehlen(int pPreisstufe)'''&lt;br /&gt;
     {&lt;br /&gt;
        preisstufe = pPreisstufe;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     '''public int gibPreisstufe()'''&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = preisstufe;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     '''public void geldEinwerfen(int betragInCent)'''&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     '''private double steuern(int betrag)'''&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
    &lt;br /&gt;
     '''public int geldZurueckGeben()'''&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public '''void''' geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public '''int''' summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe('''int a, int b''')&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int geldZurueckGeben'''()'''&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;geldEinwerfen&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie viel Geld man einwirft.&lt;br /&gt;
* Dafür haben Methoden '''Parameter''', in diesem Fall &amp;lt;code&amp;gt;betragInCent&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von '''Parameter-Typ'''.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;betragInCent&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
** Detaillierte Infos zu den Java-Datentypen finden sich hier: '''[[Java_Basis-Datentypen]]'''&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
      Automat derAutomat = new Automat();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      derAutomat.geldEinwerfen('''50''');&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* '''&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;''': Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public '''void''' geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;''': Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public '''int''' geldZurueckGeben()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Automat&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public '''Automat''' gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie des Automaten (also ein Objekt der Klasse &amp;lt;code&amp;gt;Automat&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
Detaillierte Infos zu den Java-Datentypen finden sich hier: '''[[Java_Basis-Datentypen]]'''&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public '''int''' gibPreisstufe()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void preisstufeWaehlen('''int pPreisstufe''')&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        int groessere12 = '''gibGroessereZahl(z1, z2);'''&lt;br /&gt;
        int groessere34 = '''gibGroessereZahl(z3, z4);'''&lt;br /&gt;
        int ergebnis = '''gibGroessereZahl(groessere12, groessere34);'''&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''public int gibGroessereZahl(int a, int b)'''&lt;br /&gt;
    {&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG: Das wesentliche Syntax-Element ist der Punkt!''' &amp;lt;br/&amp;gt;Man gibt erst das Objekt an, dann den Punkt, dann die Methode (ggf. mit Parameter).&amp;lt;br/&amp;gt;Z.B. &amp;lt;code&amp;gt; '''stamm.bewegeZuPosition(110,120)''';&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
  &lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm.bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm.sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone.bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone.sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Automat&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     //Attribute&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
   &lt;br /&gt;
     // weitere Attribute, Konstruktor und Methoden&lt;br /&gt;
           &lt;br /&gt;
     public int geldZurueckGeben()&lt;br /&gt;
     {&lt;br /&gt;
        '''int ergebnis''' = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es praktische Abkürzungen für Wertzuweisungen, vor allem '''&amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt;''' und '''&amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
* Beispiel 4:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit '''+=''' 5;&amp;lt;/code&amp;gt;&lt;br /&gt;
** '''&amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt;''' bedeutet: erhöhe um..., d.h. im Beispiel wird Geschwindigkeit wird um 5 erhöht.&lt;br /&gt;
* Beispiel 5:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit'''++''';&amp;lt;/code&amp;gt;&lt;br /&gt;
** '''&amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt;''' bedeutet: erhöhe um eins.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if-else) =&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  '''for(int i=0; i&amp;lt;=333; i++)'''&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&amp;lt;br&amp;gt;&lt;br /&gt;
'''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, &amp;lt;br/&amp;gt;wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. &amp;lt;br/&amp;gt;D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  '''while(zahl &amp;lt; 1000)'''&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     // zahl verdoppeln&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: &amp;lt;br/&amp;gt;Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben &amp;lt;br/&amp;gt;und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
''Die Implementierung von Beziehungen zwischen Klassen ist auf anderen Seiten erklärt, auf die hier nur verwiesen wird.''&lt;br /&gt;
&lt;br /&gt;
'''&amp;quot;kennt&amp;quot;-Beziehung:'''&lt;br /&gt;
&lt;br /&gt;
Wie man kennt-Beziehungen implementiert, kann man hier nachlesen:&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Klassen-_und_Implementationsdiagramm#Java-Quelltext:|Szenario Roller (Quelltext)]]&lt;br /&gt;
&lt;br /&gt;
'''Vererbung:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Vererbung#Implementierung|Szenario Buch - Fachbuch - Hörbuch]]&lt;br /&gt;
&lt;br /&gt;
=NullPointerException=&lt;br /&gt;
Die NullPointerException ist beim Programmieren die häufigste Exception.&lt;br /&gt;
&lt;br /&gt;
'''Die NullpointerException wird auch im Abitur abgefragt!!!'''&lt;br /&gt;
&lt;br /&gt;
Eine NullpointerException tritt auf, wenn man auf eine Methode eines Elementes zugreift, das noch gar nicht erzeugt wurde.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Beispiel 1 zeigt, wie die NullpointerException beim Programmieren im Unterricht am häufigsten auftritt.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class SchuelerVerwaltung{&lt;br /&gt;
    private List&amp;lt;Schueler&amp;gt; schuelerListe;&lt;br /&gt;
  &lt;br /&gt;
    public SchuelerVerwaltung(){&lt;br /&gt;
      Schueler s1 = new Schueler(&amp;quot;Gates&amp;quot;,&amp;quot;Bill&amp;quot;); &lt;br /&gt;
      &amp;lt;font color='red'&amp;gt;'''schuelerListe'''.append(s1);&amp;lt;/font&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Erklärung 1:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
In der roten Zeile kommt es zu einer NullPointerException, weil das Attribut &amp;lt;code&amp;gt;schuelerListe&amp;lt;/code&amp;gt; noch gar nicht erzeugt wurde - es ist &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;.&amp;lt;br/&amp;gt;Für ein Objekt, das den Wert &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;hat, führt der Aufruf einer Methode (in diesem Fall &amp;lt;code&amp;gt;schuelerListe.'''append(s1)'''&amp;lt;/code&amp;gt;) zu einer NullpointerException.&lt;br /&gt;
&lt;br /&gt;
Man kann die NullPointerException vermeiden, indem man &amp;lt;u&amp;gt;vor&amp;lt;/u&amp;gt; der roten Zeile einfügt:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    schuelerListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Beispiel 2: Abituraufgabe'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Das ist eine (verkürzte) Aufgabenstellung aus dem Abitur:&lt;br /&gt;
&lt;br /&gt;
''Analysieren und erläutern Sie, an welcher Stelle des Quellcodes ein Laufzeitfehler durch einen Zugriff auf ein nicht existentes Objekt (eine sogenannte NullPointerException)&lt;br /&gt;
entstehen kann.''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public Team wasErmittleIch(Team pTeam, int pX) {&lt;br /&gt;
    List&amp;lt;Team&amp;gt; auswahl = filtereTeams(pTeam, pX);&lt;br /&gt;
    auswahl.toFirst();&lt;br /&gt;
    int punkte = &amp;lt;font color='red'&amp;gt;'''pTeam'''.berechnePunkte()&amp;lt;/font&amp;gt;;&lt;br /&gt;
    Team g = auswahl.getContent();&lt;br /&gt;
    int d = Math.abs(&amp;lt;font color='red'&amp;gt;'''g'''.berechnePunkte()&amp;lt;/font&amp;gt; - punkte);&lt;br /&gt;
    auswahl.next();&lt;br /&gt;
    ...&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
'''Erklärung 2:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
An den roten Stellen kann es zu einer NullpointerException kommen:&lt;br /&gt;
* Wenn &amp;lt;code&amp;gt;pTeam&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; hat, kann man für &amp;lt;code&amp;gt;pTeam&amp;lt;/code&amp;gt; nicht die Methode &amp;lt;code&amp;gt;berechnePunkte()&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
* Wenn &amp;lt;code&amp;gt;auswahl&amp;lt;/code&amp;gt; eine leere Liste ist: dann hat die lokale Variable &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;, und man kann für &amp;lt;code&amp;gt;g&amp;lt;/code&amp;gt; dann nicht die Methode &amp;lt;code&amp;gt;berechnePunkte()&amp;lt;/code&amp;gt; aufrufen.&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3704</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3704"/>
		<updated>2024-05-03T09:48:55Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Right-Join */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Jahrgang 11-13). Für SQL in der 10. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/J425xx6PVxs Abfragen mit GROUP BY (06:15min)]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/ZPna0CmGuQg Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/rUkVjvlX2Eg Abfragen mit NOT IN bzw. mit IN]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/TZjt6gvRfl8 Abfrage über selbstdefinierte Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
* sonstiges: Die Joker % und *&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
* '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]''' formulieren:&lt;br /&gt;
** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
** mit '''[[SQL#Join|JOIN]]''' bzw. '''LEFT JOIN''' und '''RIGHT JOIN'''&lt;br /&gt;
** mit '''[[SQL#Differenz_(NOT_IN)|Differenz (NOT IN)]]'''&lt;br /&gt;
* '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
* '''[[SQL#SQL_analysieren|SQL analysieren]]''': Häufig sind das geschachtelte SQL-Abfragen.&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''.&amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
===relationales Datenmodell der Datenbank Schule===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
  klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
  lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
  unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
  raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
  ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
  teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Projektion (SELECT) ===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). &amp;lt;br/&amp;gt;&lt;br /&gt;
In unserem Beispiel werden zusätzlich doppelte Zeilen werden entfernt. Dafür braucht man das Schlüsselwort &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt;, das hat aber mit der eigentlichen Projektion auf einzelne Spalten nichts zu tun.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;u&amp;gt;'''SELECT'''&amp;lt;/u&amp;gt; DISTINCT r.etage&lt;br /&gt;
  FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt.''&lt;br /&gt;
&lt;br /&gt;
===Selektion (WHERE)===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
=== Kurze Erklärung ===&lt;br /&gt;
* '''COUNT''': &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''SUM''': &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''AVG''': berechnet den Durchschnitt (average)&lt;br /&gt;
* '''MAX''': bestimmt das Maximum&lt;br /&gt;
* '''MIN''': bestimmt das Minimum&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Man &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt; die Zeilen; deswegen braucht man COUNT (und nicht SUM).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt; &lt;br /&gt;
COUNT(*) übersetzt sich am einfachsten als &amp;quot;Zähle die Zeilen&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn man stattdessen COUNT(s.name) nehmen würde, dann würden nur die Zeilen gezählt, wo beim Namen ein Eintrag vorhanden ist. (Das sind hier aber alle).&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hier muss man die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;addieren&amp;lt;/u&amp;gt;, deswegen braucht man SUM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 3:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage ermittelt man...&lt;br /&gt;
* die maximale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die minimale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die durchschnittliche Zahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''MAX(r.plaetze)''', '''MIN(r.plaetze)''', '''AVG(r.plaetze)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wann braucht man COUNT(...) und wann braucht man SUM(...) ?! ===&lt;br /&gt;
COUNT und SUM werden leicht verwechselt!&lt;br /&gt;
&lt;br /&gt;
Als Faustregel kann man sagen:&lt;br /&gt;
* COUNT, wenn &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt; wird,&lt;br /&gt;
* SUM, wenn &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt; wird.&lt;br /&gt;
&lt;br /&gt;
Das ist aus der Aufgabenstellung nicht immer offensichtlich!&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Räume.&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
* in Beispiel 1 wird die Anzahl der Plätze (im Attribut plaetze) &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;, deswegen SUM(r.plaetze)&lt;br /&gt;
* in Beispiel 2 wird die Anzahl der Räume &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;, deswegen COUNT(r.id) oder COUNT(*)&lt;br /&gt;
&lt;br /&gt;
===COUNT(DISTINCT ...)===&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Wie viele Fächer gibt es?&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT COUNT(DISTINCT u.fach)&lt;br /&gt;
  FROM unterrricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch DISTINCT wird jedes Fach nur einmal berücksichtigt!&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung (AS)==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 '''AND''' 50&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung (UNION)===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===JOIN / INNER JOIN===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
Statt &amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt; kann man auch ausführlicher &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; schreiben. Dies wird in den Analyseaufgaben der Abiturklausuren häufig verwendet.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===RIGHT JOIN===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über selbstdefinierte Tabellen=&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;br /&gt;
&lt;br /&gt;
=ChatGPT nutzen um SQL zu schreiben=&lt;br /&gt;
&lt;br /&gt;
''Last not least will ich nicht verheimlichen, dass ChatGPT ein großartiges Hilfsmittel ist, um SQL zu schreiben!''&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
[https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
==Best practices==&lt;br /&gt;
''Bei unseren &amp;quot;Gehversuchen&amp;quot; mit der SQL-Programmierung mit ChatGPT haben wir festgestellt:''&lt;br /&gt;
* ''ChatGPT kann extrem cool SQL programmieren!!&amp;lt;br/&amp;gt;Es verfügt über einen SQL-Wortschatz, von dem selbst die Informatik-Lehrer noch nie gehört haben!''&lt;br /&gt;
* '''''ABER:''' ChatGPT ist ziemlich begriffsstutzig! Man muss sehr genau erklären, was man will.''&lt;br /&gt;
&lt;br /&gt;
'''Empfehlungen:'''&lt;br /&gt;
&lt;br /&gt;
# Zu Anfang: '''Kontext herstellen!''' (-&amp;gt; Datenbankschema!)&lt;br /&gt;
# '''Genau''' mitteilen, was man will, mit '''Fachbegriffen'''.&lt;br /&gt;
# '''Testen''':&amp;lt;br/&amp;gt;Natürlich macht ChatGPT auch beim Programmieren Fehler. &amp;lt;br/&amp;gt;Der große Vorteil ist aber, dass man das - mit gut gewählten Beispielen - direkt überprüfen kann!&amp;lt;br/&amp;gt;Und wenn der SQL-Code einen Fehler hat, dann hilft nur...&lt;br /&gt;
# '''„Nachkarten“:'''&amp;lt;br/&amp;gt;''Das ist sehr wichtig! Denn mit etwas Hartnäckigkeit kann man ChatGPT dazu bringen, das Richtige zu tun!''&amp;lt;br/&amp;gt;Für das &amp;quot;Nachkarten&amp;quot; empfiehlt sich:&lt;br /&gt;
## '''Fehlermeldungen''' von SQL an ChatGPT weiter geben.&lt;br /&gt;
## '''Fachbegriffe''' verwenden&lt;br /&gt;
## '''Beziehungen klären''' &amp;lt;br/&amp;gt;z.B.: &amp;quot;Die Tabelle schueler ist über die Tabelle klasse mit der Tabelle unterricht verknüpft.&amp;quot;&amp;lt;br/&amp;gt;z.B.: &amp;quot;Fach ist ein Attribut der Tabelle unterricht.&amp;quot;&lt;br /&gt;
## '''Das Datenbankmodell nochmal mit Copy&amp;amp;Paste eintragen.''' &amp;lt;br/&amp;gt;Informationen &amp;quot;verblassen&amp;quot; im Laufe der Zeit.&lt;br /&gt;
## Gegebenenfalls '''SQL-Schlüsselwörter vorgeben''': &amp;lt;br/&amp;gt;z.B. &amp;quot;Verwende NOT IN&amp;quot;&lt;br /&gt;
# Wenn alles nichts hilft:&lt;br /&gt;
## eine '''neue Unterhaltung anfangen''', d.h. einfach nochmal von vorne.&amp;lt;br/&amp;gt;''Die Antworten von ChatGPT beruhen auf Wahrscheinlichkeiten, d.h. es kann gut sein, dass man bei genau der selben Anfrage eine andere Lösung bekommt.''&lt;br /&gt;
## '''Auf Englisch fragen.'''&amp;lt;br/&amp;gt;''ChatGPT wurde mit wesentlich mehr englischen Daten trainiert, d.h. die Erfolgschancen sind auf Englisch größer.''&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* ChatGPT steht ein sehr breites SQL-Vokabular zur Verfügung!&amp;lt;br/&amp;gt;Da sind Schlüsselwörter dabei, die man selber höchstens zum &amp;quot;passiven&amp;quot; Wortschatz zählen würde.&lt;br /&gt;
* ChatGPT kann (wenn alles gut geht) SQL-Statements von ziemlicher Eleganz entwickeln. &lt;br /&gt;
* Wenn man das Datenbankschema mitteilt und die Tabellen und Attribute verständlich benannt hat, dann kann sich ChatGPT auf einen beliebigen Kontext einstellen.&lt;br /&gt;
* Außerdem geht es natürlich extrem schnell.&lt;br /&gt;
&lt;br /&gt;
==Datenbankschema für den Test==&lt;br /&gt;
''Das Datenbankschema muss man direkt am Anfang mitteilen!''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
 klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
 lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
 unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
 raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
 ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
 teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kann man wie üblich hier:&lt;br /&gt;
&lt;br /&gt;
[https://sibiwiki.de/sql/ sibiwiki.de/sql]&lt;br /&gt;
&lt;br /&gt;
(Zugangsdaten beim Informatik-Lehrer am SIBI.)&lt;br /&gt;
&lt;br /&gt;
Wer nicht am SIBI ist, kann sich einen Dump der Datenbank Schule hier herunterladen:&amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3703</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3703"/>
		<updated>2024-05-03T09:48:38Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Left-Join */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Jahrgang 11-13). Für SQL in der 10. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/J425xx6PVxs Abfragen mit GROUP BY (06:15min)]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/ZPna0CmGuQg Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/rUkVjvlX2Eg Abfragen mit NOT IN bzw. mit IN]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/TZjt6gvRfl8 Abfrage über selbstdefinierte Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
* sonstiges: Die Joker % und *&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
* '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]''' formulieren:&lt;br /&gt;
** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
** mit '''[[SQL#Join|JOIN]]''' bzw. '''LEFT JOIN''' und '''RIGHT JOIN'''&lt;br /&gt;
** mit '''[[SQL#Differenz_(NOT_IN)|Differenz (NOT IN)]]'''&lt;br /&gt;
* '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
* '''[[SQL#SQL_analysieren|SQL analysieren]]''': Häufig sind das geschachtelte SQL-Abfragen.&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''.&amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
===relationales Datenmodell der Datenbank Schule===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
  klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
  lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
  unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
  raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
  ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
  teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Projektion (SELECT) ===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). &amp;lt;br/&amp;gt;&lt;br /&gt;
In unserem Beispiel werden zusätzlich doppelte Zeilen werden entfernt. Dafür braucht man das Schlüsselwort &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt;, das hat aber mit der eigentlichen Projektion auf einzelne Spalten nichts zu tun.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;u&amp;gt;'''SELECT'''&amp;lt;/u&amp;gt; DISTINCT r.etage&lt;br /&gt;
  FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt.''&lt;br /&gt;
&lt;br /&gt;
===Selektion (WHERE)===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
=== Kurze Erklärung ===&lt;br /&gt;
* '''COUNT''': &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''SUM''': &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''AVG''': berechnet den Durchschnitt (average)&lt;br /&gt;
* '''MAX''': bestimmt das Maximum&lt;br /&gt;
* '''MIN''': bestimmt das Minimum&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Man &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt; die Zeilen; deswegen braucht man COUNT (und nicht SUM).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt; &lt;br /&gt;
COUNT(*) übersetzt sich am einfachsten als &amp;quot;Zähle die Zeilen&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn man stattdessen COUNT(s.name) nehmen würde, dann würden nur die Zeilen gezählt, wo beim Namen ein Eintrag vorhanden ist. (Das sind hier aber alle).&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hier muss man die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;addieren&amp;lt;/u&amp;gt;, deswegen braucht man SUM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 3:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage ermittelt man...&lt;br /&gt;
* die maximale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die minimale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die durchschnittliche Zahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''MAX(r.plaetze)''', '''MIN(r.plaetze)''', '''AVG(r.plaetze)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wann braucht man COUNT(...) und wann braucht man SUM(...) ?! ===&lt;br /&gt;
COUNT und SUM werden leicht verwechselt!&lt;br /&gt;
&lt;br /&gt;
Als Faustregel kann man sagen:&lt;br /&gt;
* COUNT, wenn &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt; wird,&lt;br /&gt;
* SUM, wenn &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt; wird.&lt;br /&gt;
&lt;br /&gt;
Das ist aus der Aufgabenstellung nicht immer offensichtlich!&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Räume.&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
* in Beispiel 1 wird die Anzahl der Plätze (im Attribut plaetze) &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;, deswegen SUM(r.plaetze)&lt;br /&gt;
* in Beispiel 2 wird die Anzahl der Räume &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;, deswegen COUNT(r.id) oder COUNT(*)&lt;br /&gt;
&lt;br /&gt;
===COUNT(DISTINCT ...)===&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Wie viele Fächer gibt es?&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT COUNT(DISTINCT u.fach)&lt;br /&gt;
  FROM unterrricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch DISTINCT wird jedes Fach nur einmal berücksichtigt!&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung (AS)==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 '''AND''' 50&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung (UNION)===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===JOIN / INNER JOIN===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
Statt &amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt; kann man auch ausführlicher &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; schreiben. Dies wird in den Analyseaufgaben der Abiturklausuren häufig verwendet.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===Right-Join===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über selbstdefinierte Tabellen=&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;br /&gt;
&lt;br /&gt;
=ChatGPT nutzen um SQL zu schreiben=&lt;br /&gt;
&lt;br /&gt;
''Last not least will ich nicht verheimlichen, dass ChatGPT ein großartiges Hilfsmittel ist, um SQL zu schreiben!''&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
[https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
==Best practices==&lt;br /&gt;
''Bei unseren &amp;quot;Gehversuchen&amp;quot; mit der SQL-Programmierung mit ChatGPT haben wir festgestellt:''&lt;br /&gt;
* ''ChatGPT kann extrem cool SQL programmieren!!&amp;lt;br/&amp;gt;Es verfügt über einen SQL-Wortschatz, von dem selbst die Informatik-Lehrer noch nie gehört haben!''&lt;br /&gt;
* '''''ABER:''' ChatGPT ist ziemlich begriffsstutzig! Man muss sehr genau erklären, was man will.''&lt;br /&gt;
&lt;br /&gt;
'''Empfehlungen:'''&lt;br /&gt;
&lt;br /&gt;
# Zu Anfang: '''Kontext herstellen!''' (-&amp;gt; Datenbankschema!)&lt;br /&gt;
# '''Genau''' mitteilen, was man will, mit '''Fachbegriffen'''.&lt;br /&gt;
# '''Testen''':&amp;lt;br/&amp;gt;Natürlich macht ChatGPT auch beim Programmieren Fehler. &amp;lt;br/&amp;gt;Der große Vorteil ist aber, dass man das - mit gut gewählten Beispielen - direkt überprüfen kann!&amp;lt;br/&amp;gt;Und wenn der SQL-Code einen Fehler hat, dann hilft nur...&lt;br /&gt;
# '''„Nachkarten“:'''&amp;lt;br/&amp;gt;''Das ist sehr wichtig! Denn mit etwas Hartnäckigkeit kann man ChatGPT dazu bringen, das Richtige zu tun!''&amp;lt;br/&amp;gt;Für das &amp;quot;Nachkarten&amp;quot; empfiehlt sich:&lt;br /&gt;
## '''Fehlermeldungen''' von SQL an ChatGPT weiter geben.&lt;br /&gt;
## '''Fachbegriffe''' verwenden&lt;br /&gt;
## '''Beziehungen klären''' &amp;lt;br/&amp;gt;z.B.: &amp;quot;Die Tabelle schueler ist über die Tabelle klasse mit der Tabelle unterricht verknüpft.&amp;quot;&amp;lt;br/&amp;gt;z.B.: &amp;quot;Fach ist ein Attribut der Tabelle unterricht.&amp;quot;&lt;br /&gt;
## '''Das Datenbankmodell nochmal mit Copy&amp;amp;Paste eintragen.''' &amp;lt;br/&amp;gt;Informationen &amp;quot;verblassen&amp;quot; im Laufe der Zeit.&lt;br /&gt;
## Gegebenenfalls '''SQL-Schlüsselwörter vorgeben''': &amp;lt;br/&amp;gt;z.B. &amp;quot;Verwende NOT IN&amp;quot;&lt;br /&gt;
# Wenn alles nichts hilft:&lt;br /&gt;
## eine '''neue Unterhaltung anfangen''', d.h. einfach nochmal von vorne.&amp;lt;br/&amp;gt;''Die Antworten von ChatGPT beruhen auf Wahrscheinlichkeiten, d.h. es kann gut sein, dass man bei genau der selben Anfrage eine andere Lösung bekommt.''&lt;br /&gt;
## '''Auf Englisch fragen.'''&amp;lt;br/&amp;gt;''ChatGPT wurde mit wesentlich mehr englischen Daten trainiert, d.h. die Erfolgschancen sind auf Englisch größer.''&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* ChatGPT steht ein sehr breites SQL-Vokabular zur Verfügung!&amp;lt;br/&amp;gt;Da sind Schlüsselwörter dabei, die man selber höchstens zum &amp;quot;passiven&amp;quot; Wortschatz zählen würde.&lt;br /&gt;
* ChatGPT kann (wenn alles gut geht) SQL-Statements von ziemlicher Eleganz entwickeln. &lt;br /&gt;
* Wenn man das Datenbankschema mitteilt und die Tabellen und Attribute verständlich benannt hat, dann kann sich ChatGPT auf einen beliebigen Kontext einstellen.&lt;br /&gt;
* Außerdem geht es natürlich extrem schnell.&lt;br /&gt;
&lt;br /&gt;
==Datenbankschema für den Test==&lt;br /&gt;
''Das Datenbankschema muss man direkt am Anfang mitteilen!''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
 klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
 lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
 unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
 raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
 ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
 teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kann man wie üblich hier:&lt;br /&gt;
&lt;br /&gt;
[https://sibiwiki.de/sql/ sibiwiki.de/sql]&lt;br /&gt;
&lt;br /&gt;
(Zugangsdaten beim Informatik-Lehrer am SIBI.)&lt;br /&gt;
&lt;br /&gt;
Wer nicht am SIBI ist, kann sich einen Dump der Datenbank Schule hier herunterladen:&amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3702</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3702"/>
		<updated>2024-05-03T09:48:11Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Join */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Jahrgang 11-13). Für SQL in der 10. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/J425xx6PVxs Abfragen mit GROUP BY (06:15min)]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/ZPna0CmGuQg Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/rUkVjvlX2Eg Abfragen mit NOT IN bzw. mit IN]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/TZjt6gvRfl8 Abfrage über selbstdefinierte Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
* sonstiges: Die Joker % und *&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
* '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]''' formulieren:&lt;br /&gt;
** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
** mit '''[[SQL#Join|JOIN]]''' bzw. '''LEFT JOIN''' und '''RIGHT JOIN'''&lt;br /&gt;
** mit '''[[SQL#Differenz_(NOT_IN)|Differenz (NOT IN)]]'''&lt;br /&gt;
* '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
* '''[[SQL#SQL_analysieren|SQL analysieren]]''': Häufig sind das geschachtelte SQL-Abfragen.&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''.&amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
===relationales Datenmodell der Datenbank Schule===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
  klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
  lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
  unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
  raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
  ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
  teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Projektion (SELECT) ===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). &amp;lt;br/&amp;gt;&lt;br /&gt;
In unserem Beispiel werden zusätzlich doppelte Zeilen werden entfernt. Dafür braucht man das Schlüsselwort &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt;, das hat aber mit der eigentlichen Projektion auf einzelne Spalten nichts zu tun.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;u&amp;gt;'''SELECT'''&amp;lt;/u&amp;gt; DISTINCT r.etage&lt;br /&gt;
  FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt.''&lt;br /&gt;
&lt;br /&gt;
===Selektion (WHERE)===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
=== Kurze Erklärung ===&lt;br /&gt;
* '''COUNT''': &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''SUM''': &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''AVG''': berechnet den Durchschnitt (average)&lt;br /&gt;
* '''MAX''': bestimmt das Maximum&lt;br /&gt;
* '''MIN''': bestimmt das Minimum&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Man &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt; die Zeilen; deswegen braucht man COUNT (und nicht SUM).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt; &lt;br /&gt;
COUNT(*) übersetzt sich am einfachsten als &amp;quot;Zähle die Zeilen&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn man stattdessen COUNT(s.name) nehmen würde, dann würden nur die Zeilen gezählt, wo beim Namen ein Eintrag vorhanden ist. (Das sind hier aber alle).&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hier muss man die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;addieren&amp;lt;/u&amp;gt;, deswegen braucht man SUM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 3:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage ermittelt man...&lt;br /&gt;
* die maximale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die minimale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die durchschnittliche Zahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''MAX(r.plaetze)''', '''MIN(r.plaetze)''', '''AVG(r.plaetze)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wann braucht man COUNT(...) und wann braucht man SUM(...) ?! ===&lt;br /&gt;
COUNT und SUM werden leicht verwechselt!&lt;br /&gt;
&lt;br /&gt;
Als Faustregel kann man sagen:&lt;br /&gt;
* COUNT, wenn &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt; wird,&lt;br /&gt;
* SUM, wenn &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt; wird.&lt;br /&gt;
&lt;br /&gt;
Das ist aus der Aufgabenstellung nicht immer offensichtlich!&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Räume.&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
* in Beispiel 1 wird die Anzahl der Plätze (im Attribut plaetze) &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;, deswegen SUM(r.plaetze)&lt;br /&gt;
* in Beispiel 2 wird die Anzahl der Räume &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;, deswegen COUNT(r.id) oder COUNT(*)&lt;br /&gt;
&lt;br /&gt;
===COUNT(DISTINCT ...)===&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Wie viele Fächer gibt es?&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT COUNT(DISTINCT u.fach)&lt;br /&gt;
  FROM unterrricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch DISTINCT wird jedes Fach nur einmal berücksichtigt!&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung (AS)==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 '''AND''' 50&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung (UNION)===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===JOIN / INNER JOIN===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
Statt &amp;lt;code&amp;gt;JOIN&amp;lt;/code&amp;gt; kann man auch ausführlicher &amp;lt;code&amp;gt;INNER JOIN&amp;lt;/code&amp;gt; schreiben. Dies wird in den Analyseaufgaben der Abiturklausuren häufig verwendet.&lt;br /&gt;
&lt;br /&gt;
===Left-Join===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===Right-Join===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über selbstdefinierte Tabellen=&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;br /&gt;
&lt;br /&gt;
=ChatGPT nutzen um SQL zu schreiben=&lt;br /&gt;
&lt;br /&gt;
''Last not least will ich nicht verheimlichen, dass ChatGPT ein großartiges Hilfsmittel ist, um SQL zu schreiben!''&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
[https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
==Best practices==&lt;br /&gt;
''Bei unseren &amp;quot;Gehversuchen&amp;quot; mit der SQL-Programmierung mit ChatGPT haben wir festgestellt:''&lt;br /&gt;
* ''ChatGPT kann extrem cool SQL programmieren!!&amp;lt;br/&amp;gt;Es verfügt über einen SQL-Wortschatz, von dem selbst die Informatik-Lehrer noch nie gehört haben!''&lt;br /&gt;
* '''''ABER:''' ChatGPT ist ziemlich begriffsstutzig! Man muss sehr genau erklären, was man will.''&lt;br /&gt;
&lt;br /&gt;
'''Empfehlungen:'''&lt;br /&gt;
&lt;br /&gt;
# Zu Anfang: '''Kontext herstellen!''' (-&amp;gt; Datenbankschema!)&lt;br /&gt;
# '''Genau''' mitteilen, was man will, mit '''Fachbegriffen'''.&lt;br /&gt;
# '''Testen''':&amp;lt;br/&amp;gt;Natürlich macht ChatGPT auch beim Programmieren Fehler. &amp;lt;br/&amp;gt;Der große Vorteil ist aber, dass man das - mit gut gewählten Beispielen - direkt überprüfen kann!&amp;lt;br/&amp;gt;Und wenn der SQL-Code einen Fehler hat, dann hilft nur...&lt;br /&gt;
# '''„Nachkarten“:'''&amp;lt;br/&amp;gt;''Das ist sehr wichtig! Denn mit etwas Hartnäckigkeit kann man ChatGPT dazu bringen, das Richtige zu tun!''&amp;lt;br/&amp;gt;Für das &amp;quot;Nachkarten&amp;quot; empfiehlt sich:&lt;br /&gt;
## '''Fehlermeldungen''' von SQL an ChatGPT weiter geben.&lt;br /&gt;
## '''Fachbegriffe''' verwenden&lt;br /&gt;
## '''Beziehungen klären''' &amp;lt;br/&amp;gt;z.B.: &amp;quot;Die Tabelle schueler ist über die Tabelle klasse mit der Tabelle unterricht verknüpft.&amp;quot;&amp;lt;br/&amp;gt;z.B.: &amp;quot;Fach ist ein Attribut der Tabelle unterricht.&amp;quot;&lt;br /&gt;
## '''Das Datenbankmodell nochmal mit Copy&amp;amp;Paste eintragen.''' &amp;lt;br/&amp;gt;Informationen &amp;quot;verblassen&amp;quot; im Laufe der Zeit.&lt;br /&gt;
## Gegebenenfalls '''SQL-Schlüsselwörter vorgeben''': &amp;lt;br/&amp;gt;z.B. &amp;quot;Verwende NOT IN&amp;quot;&lt;br /&gt;
# Wenn alles nichts hilft:&lt;br /&gt;
## eine '''neue Unterhaltung anfangen''', d.h. einfach nochmal von vorne.&amp;lt;br/&amp;gt;''Die Antworten von ChatGPT beruhen auf Wahrscheinlichkeiten, d.h. es kann gut sein, dass man bei genau der selben Anfrage eine andere Lösung bekommt.''&lt;br /&gt;
## '''Auf Englisch fragen.'''&amp;lt;br/&amp;gt;''ChatGPT wurde mit wesentlich mehr englischen Daten trainiert, d.h. die Erfolgschancen sind auf Englisch größer.''&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* ChatGPT steht ein sehr breites SQL-Vokabular zur Verfügung!&amp;lt;br/&amp;gt;Da sind Schlüsselwörter dabei, die man selber höchstens zum &amp;quot;passiven&amp;quot; Wortschatz zählen würde.&lt;br /&gt;
* ChatGPT kann (wenn alles gut geht) SQL-Statements von ziemlicher Eleganz entwickeln. &lt;br /&gt;
* Wenn man das Datenbankschema mitteilt und die Tabellen und Attribute verständlich benannt hat, dann kann sich ChatGPT auf einen beliebigen Kontext einstellen.&lt;br /&gt;
* Außerdem geht es natürlich extrem schnell.&lt;br /&gt;
&lt;br /&gt;
==Datenbankschema für den Test==&lt;br /&gt;
''Das Datenbankschema muss man direkt am Anfang mitteilen!''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
 klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
 lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
 unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
 raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
 ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
 teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kann man wie üblich hier:&lt;br /&gt;
&lt;br /&gt;
[https://sibiwiki.de/sql/ sibiwiki.de/sql]&lt;br /&gt;
&lt;br /&gt;
(Zugangsdaten beim Informatik-Lehrer am SIBI.)&lt;br /&gt;
&lt;br /&gt;
Wer nicht am SIBI ist, kann sich einen Dump der Datenbank Schule hier herunterladen:&amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3701</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3701"/>
		<updated>2024-05-03T09:38:50Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Jahrgang 11-13). Für SQL in der 10. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/J425xx6PVxs Abfragen mit GROUP BY (06:15min)]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/ZPna0CmGuQg Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/rUkVjvlX2Eg Abfragen mit NOT IN bzw. mit IN]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/TZjt6gvRfl8 Abfrage über selbstdefinierte Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
* sonstiges: Die Joker % und *&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
* '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]''' formulieren:&lt;br /&gt;
** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
** mit '''[[SQL#Join|JOIN]]''' bzw. '''LEFT JOIN''' und '''RIGHT JOIN'''&lt;br /&gt;
** mit '''[[SQL#Differenz_(NOT_IN)|Differenz (NOT IN)]]'''&lt;br /&gt;
* '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
* '''[[SQL#SQL_analysieren|SQL analysieren]]''': Häufig sind das geschachtelte SQL-Abfragen.&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''.&amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
===relationales Datenmodell der Datenbank Schule===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
  klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
  lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
  unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
  raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
  ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
  teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Projektion (SELECT) ===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). &amp;lt;br/&amp;gt;&lt;br /&gt;
In unserem Beispiel werden zusätzlich doppelte Zeilen werden entfernt. Dafür braucht man das Schlüsselwort &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt;, das hat aber mit der eigentlichen Projektion auf einzelne Spalten nichts zu tun.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  &amp;lt;u&amp;gt;'''SELECT'''&amp;lt;/u&amp;gt; DISTINCT r.etage&lt;br /&gt;
  FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt.''&lt;br /&gt;
&lt;br /&gt;
===Selektion (WHERE)===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
=== Kurze Erklärung ===&lt;br /&gt;
* '''COUNT''': &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''SUM''': &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''AVG''': berechnet den Durchschnitt (average)&lt;br /&gt;
* '''MAX''': bestimmt das Maximum&lt;br /&gt;
* '''MIN''': bestimmt das Minimum&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Man &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt; die Zeilen; deswegen braucht man COUNT (und nicht SUM).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt; &lt;br /&gt;
COUNT(*) übersetzt sich am einfachsten als &amp;quot;Zähle die Zeilen&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn man stattdessen COUNT(s.name) nehmen würde, dann würden nur die Zeilen gezählt, wo beim Namen ein Eintrag vorhanden ist. (Das sind hier aber alle).&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hier muss man die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;addieren&amp;lt;/u&amp;gt;, deswegen braucht man SUM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 3:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage ermittelt man...&lt;br /&gt;
* die maximale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die minimale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die durchschnittliche Zahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''MAX(r.plaetze)''', '''MIN(r.plaetze)''', '''AVG(r.plaetze)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wann braucht man COUNT(...) und wann braucht man SUM(...) ?! ===&lt;br /&gt;
COUNT und SUM werden leicht verwechselt!&lt;br /&gt;
&lt;br /&gt;
Als Faustregel kann man sagen:&lt;br /&gt;
* COUNT, wenn &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt; wird,&lt;br /&gt;
* SUM, wenn &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt; wird.&lt;br /&gt;
&lt;br /&gt;
Das ist aus der Aufgabenstellung nicht immer offensichtlich!&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Räume.&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
* in Beispiel 1 wird die Anzahl der Plätze (im Attribut plaetze) &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;, deswegen SUM(r.plaetze)&lt;br /&gt;
* in Beispiel 2 wird die Anzahl der Räume &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;, deswegen COUNT(r.id) oder COUNT(*)&lt;br /&gt;
&lt;br /&gt;
===COUNT(DISTINCT ...)===&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Wie viele Fächer gibt es?&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT COUNT(DISTINCT u.fach)&lt;br /&gt;
  FROM unterrricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch DISTINCT wird jedes Fach nur einmal berücksichtigt!&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung (AS)==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 '''AND''' 50&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung (UNION)===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===Join===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
===Left-Join===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===Right-Join===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über selbstdefinierte Tabellen=&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;br /&gt;
&lt;br /&gt;
=ChatGPT nutzen um SQL zu schreiben=&lt;br /&gt;
&lt;br /&gt;
''Last not least will ich nicht verheimlichen, dass ChatGPT ein großartiges Hilfsmittel ist, um SQL zu schreiben!''&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
[https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
==Best practices==&lt;br /&gt;
''Bei unseren &amp;quot;Gehversuchen&amp;quot; mit der SQL-Programmierung mit ChatGPT haben wir festgestellt:''&lt;br /&gt;
* ''ChatGPT kann extrem cool SQL programmieren!!&amp;lt;br/&amp;gt;Es verfügt über einen SQL-Wortschatz, von dem selbst die Informatik-Lehrer noch nie gehört haben!''&lt;br /&gt;
* '''''ABER:''' ChatGPT ist ziemlich begriffsstutzig! Man muss sehr genau erklären, was man will.''&lt;br /&gt;
&lt;br /&gt;
'''Empfehlungen:'''&lt;br /&gt;
&lt;br /&gt;
# Zu Anfang: '''Kontext herstellen!''' (-&amp;gt; Datenbankschema!)&lt;br /&gt;
# '''Genau''' mitteilen, was man will, mit '''Fachbegriffen'''.&lt;br /&gt;
# '''Testen''':&amp;lt;br/&amp;gt;Natürlich macht ChatGPT auch beim Programmieren Fehler. &amp;lt;br/&amp;gt;Der große Vorteil ist aber, dass man das - mit gut gewählten Beispielen - direkt überprüfen kann!&amp;lt;br/&amp;gt;Und wenn der SQL-Code einen Fehler hat, dann hilft nur...&lt;br /&gt;
# '''„Nachkarten“:'''&amp;lt;br/&amp;gt;''Das ist sehr wichtig! Denn mit etwas Hartnäckigkeit kann man ChatGPT dazu bringen, das Richtige zu tun!''&amp;lt;br/&amp;gt;Für das &amp;quot;Nachkarten&amp;quot; empfiehlt sich:&lt;br /&gt;
## '''Fehlermeldungen''' von SQL an ChatGPT weiter geben.&lt;br /&gt;
## '''Fachbegriffe''' verwenden&lt;br /&gt;
## '''Beziehungen klären''' &amp;lt;br/&amp;gt;z.B.: &amp;quot;Die Tabelle schueler ist über die Tabelle klasse mit der Tabelle unterricht verknüpft.&amp;quot;&amp;lt;br/&amp;gt;z.B.: &amp;quot;Fach ist ein Attribut der Tabelle unterricht.&amp;quot;&lt;br /&gt;
## '''Das Datenbankmodell nochmal mit Copy&amp;amp;Paste eintragen.''' &amp;lt;br/&amp;gt;Informationen &amp;quot;verblassen&amp;quot; im Laufe der Zeit.&lt;br /&gt;
## Gegebenenfalls '''SQL-Schlüsselwörter vorgeben''': &amp;lt;br/&amp;gt;z.B. &amp;quot;Verwende NOT IN&amp;quot;&lt;br /&gt;
# Wenn alles nichts hilft:&lt;br /&gt;
## eine '''neue Unterhaltung anfangen''', d.h. einfach nochmal von vorne.&amp;lt;br/&amp;gt;''Die Antworten von ChatGPT beruhen auf Wahrscheinlichkeiten, d.h. es kann gut sein, dass man bei genau der selben Anfrage eine andere Lösung bekommt.''&lt;br /&gt;
## '''Auf Englisch fragen.'''&amp;lt;br/&amp;gt;''ChatGPT wurde mit wesentlich mehr englischen Daten trainiert, d.h. die Erfolgschancen sind auf Englisch größer.''&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* ChatGPT steht ein sehr breites SQL-Vokabular zur Verfügung!&amp;lt;br/&amp;gt;Da sind Schlüsselwörter dabei, die man selber höchstens zum &amp;quot;passiven&amp;quot; Wortschatz zählen würde.&lt;br /&gt;
* ChatGPT kann (wenn alles gut geht) SQL-Statements von ziemlicher Eleganz entwickeln. &lt;br /&gt;
* Wenn man das Datenbankschema mitteilt und die Tabellen und Attribute verständlich benannt hat, dann kann sich ChatGPT auf einen beliebigen Kontext einstellen.&lt;br /&gt;
* Außerdem geht es natürlich extrem schnell.&lt;br /&gt;
&lt;br /&gt;
==Datenbankschema für den Test==&lt;br /&gt;
''Das Datenbankschema muss man direkt am Anfang mitteilen!''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
 klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
 lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
 unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
 raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
 ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
 teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kann man wie üblich hier:&lt;br /&gt;
&lt;br /&gt;
[https://sibiwiki.de/sql/ sibiwiki.de/sql]&lt;br /&gt;
&lt;br /&gt;
(Zugangsdaten beim Informatik-Lehrer am SIBI.)&lt;br /&gt;
&lt;br /&gt;
Wer nicht am SIBI ist, kann sich einen Dump der Datenbank Schule hier herunterladen:&amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3700</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3700"/>
		<updated>2024-05-03T09:34:39Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Jahrgang 11-13). Für SQL in der 10. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/J425xx6PVxs Abfragen mit GROUP BY (06:15min)]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/ZPna0CmGuQg Abfragen über mehrere Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/rUkVjvlX2Eg Abfragen mit NOT IN bzw. mit IN]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/TZjt6gvRfl8 Abfrage über selbstdefinierte Tabellen]&lt;br /&gt;
&lt;br /&gt;
* [https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
* sonstiges: Die Joker % und *&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
* '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]''' formulieren:&lt;br /&gt;
** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
** mit '''[[SQL#Join|JOIN]]''' bzw. '''LEFT JOIN''' und '''RIGHT JOIN'''&lt;br /&gt;
** mit '''[[SQL#Differenz_(NOT_IN)|Differenz (NOT IN)]]'''&lt;br /&gt;
* '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
* '''[[SQL#SQL_analysieren|SQL analysieren]]''': Häufig sind das geschachtelte SQL-Abfragen.&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule: '''[http://sibiwiki.de/sql/ hier klicken]'''.&amp;lt;br/&amp;gt;Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
** ''Wer nicht am SIBI ist, kann hier einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]''&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
===relationales Datenmodell der Datenbank Schule===&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
  klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
  lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
  unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
  raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
  ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
  teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Selektion (WHERE)===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
===Projektion (SELECT) ===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). &amp;lt;br/&amp;gt;&lt;br /&gt;
In unserem Beispiel werden zusätzlich doppelte Zeilen werden entfernt. Dafür braucht man das Schlüsselwort &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt;, das hat aber mit der eigentlichen Projektion auf einzelne Spalten nichts zu tun.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle &amp;lt;code&amp;gt;raum&amp;lt;/code&amp;gt; eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;'''DISTINCT r.etage'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt.''&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
=== Kurze Erklärung ===&lt;br /&gt;
* '''COUNT''': &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''SUM''': &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''AVG''': berechnet den Durchschnitt (average)&lt;br /&gt;
* '''MAX''': bestimmt das Maximum&lt;br /&gt;
* '''MIN''': bestimmt das Minimum&lt;br /&gt;
&lt;br /&gt;
===Beispiele===&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Man &amp;lt;u&amp;gt;zählt&amp;lt;/u&amp;gt; die Zeilen; deswegen braucht man COUNT (und nicht SUM).&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt; &lt;br /&gt;
COUNT(*) übersetzt sich am einfachsten als &amp;quot;Zähle die Zeilen&amp;quot;. &amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn man stattdessen COUNT(s.name) nehmen würde, dann würden nur die Zeilen gezählt, wo beim Namen ein Eintrag vorhanden ist. (Das sind hier aber alle).&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&amp;lt;br/&amp;gt;&lt;br /&gt;
Hier muss man die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;addieren&amp;lt;/u&amp;gt;, deswegen braucht man SUM.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 3:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage ermittelt man...&lt;br /&gt;
* die maximale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die minimale Zahl der Plätze in einem Raum,&lt;br /&gt;
* die durchschnittliche Zahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''MAX(r.plaetze)''', '''MIN(r.plaetze)''', '''AVG(r.plaetze)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Wann braucht man COUNT(...) und wann braucht man SUM(...) ?! ===&lt;br /&gt;
COUNT und SUM werden leicht verwechselt!&lt;br /&gt;
&lt;br /&gt;
Als Faustregel kann man sagen:&lt;br /&gt;
* COUNT, wenn &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt; wird,&lt;br /&gt;
* SUM, wenn &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt; wird.&lt;br /&gt;
&lt;br /&gt;
Das ist aus der Aufgabenstellung nicht immer offensichtlich!&lt;br /&gt;
&lt;br /&gt;
Beispiel 1:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Plätze in allen Räumen.&lt;br /&gt;
&lt;br /&gt;
Beispiel 2:&amp;lt;br/&amp;gt;&lt;br /&gt;
Man hätte gerne die Anzahl der Räume.&lt;br /&gt;
&lt;br /&gt;
Lösung:&lt;br /&gt;
* in Beispiel 1 wird die Anzahl der Plätze (im Attribut plaetze) &amp;lt;u&amp;gt;addiert&amp;lt;/u&amp;gt;, deswegen SUM(r.plaetze)&lt;br /&gt;
* in Beispiel 2 wird die Anzahl der Räume &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;, deswegen COUNT(r.id) oder COUNT(*)&lt;br /&gt;
&lt;br /&gt;
===COUNT(DISTINCT ...)===&lt;br /&gt;
'''Beispiel:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
Wie viele Fächer gibt es?&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT COUNT(DISTINCT u.fach)&lt;br /&gt;
  FROM unterrricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Durch DISTINCT wird jedes Fach nur einmal berücksichtigt!&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung (AS)==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 '''AND''' 50&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung (UNION)===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===Join===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
===Left-Join===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===Right-Join===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über selbstdefinierte Tabellen=&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;br /&gt;
&lt;br /&gt;
=ChatGPT nutzen um SQL zu schreiben=&lt;br /&gt;
&lt;br /&gt;
''Last not least will ich nicht verheimlichen, dass ChatGPT ein großartiges Hilfsmittel ist, um SQL zu schreiben!''&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
[https://youtu.be/GohWF9SnhWM ChatGPT nutzen, um SQL zu schreiben]&lt;br /&gt;
&lt;br /&gt;
==Best practices==&lt;br /&gt;
''Bei unseren &amp;quot;Gehversuchen&amp;quot; mit der SQL-Programmierung mit ChatGPT haben wir festgestellt:''&lt;br /&gt;
* ''ChatGPT kann extrem cool SQL programmieren!!&amp;lt;br/&amp;gt;Es verfügt über einen SQL-Wortschatz, von dem selbst die Informatik-Lehrer noch nie gehört haben!''&lt;br /&gt;
* '''''ABER:''' ChatGPT ist ziemlich begriffsstutzig! Man muss sehr genau erklären, was man will.''&lt;br /&gt;
&lt;br /&gt;
'''Empfehlungen:'''&lt;br /&gt;
&lt;br /&gt;
# Zu Anfang: '''Kontext herstellen!''' (-&amp;gt; Datenbankschema!)&lt;br /&gt;
# '''Genau''' mitteilen, was man will, mit '''Fachbegriffen'''.&lt;br /&gt;
# '''Testen''':&amp;lt;br/&amp;gt;Natürlich macht ChatGPT auch beim Programmieren Fehler. &amp;lt;br/&amp;gt;Der große Vorteil ist aber, dass man das - mit gut gewählten Beispielen - direkt überprüfen kann!&amp;lt;br/&amp;gt;Und wenn der SQL-Code einen Fehler hat, dann hilft nur...&lt;br /&gt;
# '''„Nachkarten“:'''&amp;lt;br/&amp;gt;''Das ist sehr wichtig! Denn mit etwas Hartnäckigkeit kann man ChatGPT dazu bringen, das Richtige zu tun!''&amp;lt;br/&amp;gt;Für das &amp;quot;Nachkarten&amp;quot; empfiehlt sich:&lt;br /&gt;
## '''Fehlermeldungen''' von SQL an ChatGPT weiter geben.&lt;br /&gt;
## '''Fachbegriffe''' verwenden&lt;br /&gt;
## '''Beziehungen klären''' &amp;lt;br/&amp;gt;z.B.: &amp;quot;Die Tabelle schueler ist über die Tabelle klasse mit der Tabelle unterricht verknüpft.&amp;quot;&amp;lt;br/&amp;gt;z.B.: &amp;quot;Fach ist ein Attribut der Tabelle unterricht.&amp;quot;&lt;br /&gt;
## '''Das Datenbankmodell nochmal mit Copy&amp;amp;Paste eintragen.''' &amp;lt;br/&amp;gt;Informationen &amp;quot;verblassen&amp;quot; im Laufe der Zeit.&lt;br /&gt;
## Gegebenenfalls '''SQL-Schlüsselwörter vorgeben''': &amp;lt;br/&amp;gt;z.B. &amp;quot;Verwende NOT IN&amp;quot;&lt;br /&gt;
# Wenn alles nichts hilft:&lt;br /&gt;
## eine '''neue Unterhaltung anfangen''', d.h. einfach nochmal von vorne.&amp;lt;br/&amp;gt;''Die Antworten von ChatGPT beruhen auf Wahrscheinlichkeiten, d.h. es kann gut sein, dass man bei genau der selben Anfrage eine andere Lösung bekommt.''&lt;br /&gt;
## '''Auf Englisch fragen.'''&amp;lt;br/&amp;gt;''ChatGPT wurde mit wesentlich mehr englischen Daten trainiert, d.h. die Erfolgschancen sind auf Englisch größer.''&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* ChatGPT steht ein sehr breites SQL-Vokabular zur Verfügung!&amp;lt;br/&amp;gt;Da sind Schlüsselwörter dabei, die man selber höchstens zum &amp;quot;passiven&amp;quot; Wortschatz zählen würde.&lt;br /&gt;
* ChatGPT kann (wenn alles gut geht) SQL-Statements von ziemlicher Eleganz entwickeln. &lt;br /&gt;
* Wenn man das Datenbankschema mitteilt und die Tabellen und Attribute verständlich benannt hat, dann kann sich ChatGPT auf einen beliebigen Kontext einstellen.&lt;br /&gt;
* Außerdem geht es natürlich extrem schnell.&lt;br /&gt;
&lt;br /&gt;
==Datenbankschema für den Test==&lt;br /&gt;
''Das Datenbankschema muss man direkt am Anfang mitteilen!''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 schueler(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,name,vorname)&lt;br /&gt;
 klasse(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klassenlehrer_id,name)&lt;br /&gt;
 lehrer(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,name,vorname)&lt;br /&gt;
 unterricht(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑klasse_id,↑lehrer_id,↑raum_id,fach,stunden)&lt;br /&gt;
 raum(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,nummer,etage,plaetze)&lt;br /&gt;
 ag(&amp;lt;u&amp;gt;id&amp;lt;/u&amp;gt;,↑lehrer_id,name)&lt;br /&gt;
 teilnahme(&amp;lt;u&amp;gt;↑schueler_id&amp;lt;/u&amp;gt;,&amp;lt;u&amp;gt;↑ag_id&amp;lt;/u&amp;gt;)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Testen kann man wie üblich hier:&lt;br /&gt;
&lt;br /&gt;
[https://sibiwiki.de/sql/ sibiwiki.de/sql]&lt;br /&gt;
&lt;br /&gt;
(Zugangsdaten beim Informatik-Lehrer am SIBI.)&lt;br /&gt;
&lt;br /&gt;
Wer nicht am SIBI ist, kann sich einen Dump der Datenbank Schule hier herunterladen:&amp;lt;br/&amp;gt;[[Datei:Beispieldatenbank-schule.zip]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3069</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3069"/>
		<updated>2020-06-08T10:51:03Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* GROUP BY */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Datenbanken]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''''Diese Seite ist für die Oberstufe (Klasse 11+12). Für SQL in der 9. Klasse hier klicken: [[SQL-09]]'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier finden sich Erläuterungen zu allen SQL-Techniken, die für das Zentralabitur wichtig sind.&lt;br /&gt;
&lt;br /&gt;
Zu diesen Techniken gibt es auch '''[[SQL-Aufgaben|Aufgaben]]''', die man zur Übung selber bearbeiten kann.&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
&lt;br /&gt;
Vereinigung, Differenz, kartesisches Produkt, Abgleich der Tabellen über..., geschachtelte Abfrage, äußere Abfrage, innere Abfrage&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Außerdem die SQL-Sprachelemente (s.u.)&lt;br /&gt;
&lt;br /&gt;
==SQL-Sprachelemente im Zentralabitur==&lt;br /&gt;
&lt;br /&gt;
Informationen des Zentralabiturs (PDF): [[Datei:Datenbanken-Abi-2012.pdf]]&lt;br /&gt;
&lt;br /&gt;
'''Die folgenden SQL-Befehle muss man im Zentralabitur beherrschen:'''&lt;br /&gt;
* SELECT, SELECT DISTINCT, FROM, WHERE, GROUP BY, ORDER BY, ASC, DESC,  JOIN, LEFT JOIN, RIGHT JOIN, ON, UNION, AS&lt;br /&gt;
* Vergleichsoperatoren: =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, LIKE, BETWEEN, IN, NOT IN, IS NULL&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
&lt;br /&gt;
'''Was man noch können muss:'''&lt;br /&gt;
** '''[[SQL#Abfragen_über_mehrere_Tabellen|Abfragen über mehrere Tabellen]]'''&lt;br /&gt;
*** mit '''[[SQL#Kartesisches_Produkt|kartesischem Produkt]]''' und '''[[SQL#Abgleich_zwischen_mehreren_Tabellen|Abgleich]]'''&lt;br /&gt;
*** mit '''[[SQL#Join|JOIN]]'''&lt;br /&gt;
** '''[[SQL#Geschachtelte_SQL-Ausdrücke|Geschachtelte SQL-Ausdrücke]]'''&lt;br /&gt;
&lt;br /&gt;
==Beispieldatenbank Schule==&lt;br /&gt;
* An der Beispieldatenbank Schule können alle möglichen Datenbankabfragen durchprobiert werden.&lt;br /&gt;
* Die Beispieldatenbank ist mit Absicht sehr schmal gehalten, damit man die Ergebnisse von SQL-Abfragen noch überprüfen kann.&lt;br /&gt;
* Testen kann man SQL-Abfragen auf der Datenbank Schule '''[http://sibiwiki.de/informatikag/videodb/index.php hier]'''. Die Zugangsdaten gibt's bei Herrn Kaibel&lt;br /&gt;
&lt;br /&gt;
[[Datei:Beispieldatenbank-schule.jpg]]&lt;br /&gt;
&lt;br /&gt;
==Aufbau von SQL-Abfragen==&lt;br /&gt;
Für den Aufbau von SQL-Abfragen gilt folgende Reihenfolge:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 '''SELECT ...'''&lt;br /&gt;
 '''FROM ...'''&lt;br /&gt;
 WHERE ...&lt;br /&gt;
 GROUP BY ...&lt;br /&gt;
 ORDER BY ...&lt;br /&gt;
 LIMIT ...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;FROM&amp;lt;/code&amp;gt; müssen auf jeden Fall dabei sein, die anderen Teile sind optional.&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;eine&amp;lt;/u&amp;gt; Tabelle =&lt;br /&gt;
''Begriffsklärung: Relation: (hier:) Tabelle''&lt;br /&gt;
&lt;br /&gt;
Bei Datenbanken versteht man unter einer '''Relationenalgebra''' eine formale Sprache, mit der sich Abfragen über eine oder mehrere Tabellen (=Relationen) formulieren lassen. Sie erlaubt es, Tabellen miteinander zu verknüpfen, zu reduzieren oder komplexere Informationen daraus herzuleiten.&lt;br /&gt;
&lt;br /&gt;
===Selektion===&lt;br /&gt;
Selektion bedeutet, dass Datensätze (=Zeilen) ausgewählt werden, die eine bestimmte Bedingung erfüllen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die alle Nummern der Räume mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r.nummer&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Das entscheidende Schlüsselwort für die Selektion ist &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;, denn hier wird die Bedingung festgelegt.''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Selektionsabfrage, die &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Informationen zu Räumen mit mindestens 30 Plätzen zurückgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;*&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
  &amp;lt;u&amp;gt;'''WHERE'''&amp;lt;/u&amp;gt; r.plaetze &amp;gt;= 30&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Mit dem Joker * im SELECT-Teil der Abfrage werden alle Attribute ausgewählt.''&lt;br /&gt;
&lt;br /&gt;
===Projektion===&lt;br /&gt;
Unter Projektion versteht man die Reduktion der Informationen in dem Ergebnis auf ein oder mehrere Attribute (=Spalten). Doppelte Zeilen werden dabei entfernt.&lt;br /&gt;
&lt;br /&gt;
Formuliere für die Tabelle raum eine Projektionsabfrage, die die Etagen mit Projektion wiedergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT &amp;lt;u&amp;gt;'''DISTINCT r.etage'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  FROM raum r&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Entscheidend für die Projektion ist es, dass man bei &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt; einzelne Attribute angibt (anstelle von &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;).''&lt;br /&gt;
&lt;br /&gt;
''Mithilfe des Schlüsselwortes &amp;lt;code&amp;gt;DISTINCT&amp;lt;/code&amp;gt; erreicht man, dass die doppelten Zeilen entfernt werden.''&lt;br /&gt;
&lt;br /&gt;
=Erläuterung einzelner SQL-Befehle=&lt;br /&gt;
Im folgenden werden einzelne SQL-Befehle jeweils am Beispiel erläutert.&lt;br /&gt;
&lt;br /&gt;
== Aggregat-Funktionen (COUNT, MAX, MIN, SUM, AVG) ==&lt;br /&gt;
Mit den sog. Aggregat-Funktionen kann man Attributwerte aus mehreren Zeilen zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Schüler es gibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''COUNT(*)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM schueler s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Zeilen &amp;lt;u&amp;gt;gezählt&amp;lt;/u&amp;gt;. Mit &amp;lt;code&amp;gt;COUNT(&amp;lt;u&amp;gt;'''*'''&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt; wird nicht ein Attribut gezählt, sondern jede Zeile, die überhaupt irgendein Attribut enthält.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage kann man ermitteln, wie viele Stunden Sport unterrichtet werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT &amp;lt;u&amp;gt;'''SUM(u.stunden)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM unterricht u&lt;br /&gt;
   WHERE u.fach = 'Sport'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die Attributwerte &amp;lt;code&amp;gt;stunden&amp;lt;/code&amp;gt; &amp;lt;u&amp;gt;summiert&amp;lt;/u&amp;gt; (d.h. zusammenaddiert).&lt;br /&gt;
&lt;br /&gt;
==LIKE und der %-Joker==&lt;br /&gt;
Der %-Joker kann in einer Abfrage beliebige Zeichen ersetzen.&lt;br /&gt;
&lt;br /&gt;
Den %-Joker darf man nicht mit dem exakten Vergleich (=) einsetzen; stattdessen nimmt man für den Vergleich das Schlüsselwort '''&amp;lt;code&amp;gt;LIKE&amp;lt;/code&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Eine Liste aller Schüler, die ein Doppel-n ('nn') im Vornamen haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.vorname AS vorname, s.name AS name&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.vorname &amp;lt;u&amp;gt;LIKE '%nn%'&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Vor und hinter dem nn steht ein %-Joker, d.h. hier können beliebige Buchstaben stehen. &amp;quot;Beliebig&amp;quot; kann auch heißen: Kein Buchstabe! D.h. &amp;quot;Johann&amp;quot; wäre auch ein akzeptierter Vorname.&lt;br /&gt;
&lt;br /&gt;
==GROUP BY==&lt;br /&gt;
Mit &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt; kann man Zeilen, die einen gemeinsamen Attributwert aufweisen, zusammenfassen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Mit der folgenden Abfrage erhält man eine Liste der Etagen, und für jede Etage wird notiert, wie viele Plätze in ihr insgesamt enthalten sind.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze)&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   &amp;lt;u&amp;gt;'''GROUP BY'''&amp;lt;/u&amp;gt; r.etage&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Durch &amp;lt;code&amp;gt;GROUP BY r.etage&amp;lt;/code&amp;gt; werden alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'unten' haben, in einer Zeile zusammengefasst. Genauso alle Zeilen, die bei &amp;lt;code&amp;gt;r.etage&amp;lt;/code&amp;gt; den Wert 'Mitte' (bzw. 'oben') haben.''&lt;br /&gt;
&lt;br /&gt;
''Dadurch, dass man so zusammenfasst, kann jetzt für jede Etage die Summe der Plätze berechnet werden.''&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://youtu.be/J425xx6PVxs Erklärvideo zu GROUP BY (06:15min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Umbenennung==&lt;br /&gt;
Attribute können umbenannt werden. &lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage über die Attribute klasse_id, lehrer_id, raum_id, fach und stunden der Tabelle unterricht. Dabei soll klasse_id in klassen-nr, lehrer_id in lehrer_nr und raum_id in raum-nr umbenannt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.klasse_id '''AS''' klassennr,u.lehrer_id '''AS''' Lehrernr,u.raum_id '''AS''' Raumnr,u.fach,u.stunden '''AS''' stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die eine Liste der Etagen zurückgibt. Für jede Etage soll angegeben werden, wie viele Plätze es in der Etage gibt.&lt;br /&gt;
&amp;lt;u&amp;gt;Die Liste soll nach der Anzahl der Plätze sortiert sein&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.etage, SUM(plaetze) &amp;lt;u&amp;gt;AS PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   GROUP BY r.etage&lt;br /&gt;
   &amp;lt;u&amp;gt;ORDER BY PlaetzeInEtage&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Beachte: Für &amp;lt;code&amp;gt;SUM(plaetze)&amp;lt;/code&amp;gt; wird ein Alias (&amp;lt;code&amp;gt;PlaetzeInEtage&amp;lt;/code&amp;gt;) vergeben. Mithilfe des Alias kann man am Ende nach der Anzahl der Plätze sortieren!''&lt;br /&gt;
&lt;br /&gt;
==Mehrere Bedingungen: AND, OR, BETWEEN==&lt;br /&gt;
In SQL-Abfragen kann man mehrere Bedingungen kombinieren. Dafür gibt es die Schlüsselwörter AND, OR und BETWEEN&lt;br /&gt;
&lt;br /&gt;
===AND / OR===&lt;br /&gt;
Mit AND / OR kann man zwei Bedingungen verknüpfen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.etage = 'unten' &amp;lt;u&amp;gt;'''OR'''&amp;lt;/u&amp;gt; r.etage = 'Mitte'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===BETWEEN===&lt;br /&gt;
Mit BETWEEN ... AND kann man Intervalle angeben.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   WHERE r.plaetze &amp;lt;u&amp;gt;'''BETWEEN'''&amp;lt;/u&amp;gt; 30 AND 50&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===LIMIT===&lt;br /&gt;
Mit LIMIT kann man angeben, wie viele Zeilen ausgegeben werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende SQL-Anweisung gibt den Raum (Nummer, Platzanzahl) mit den meisten Plätzen aus.&lt;br /&gt;
&lt;br /&gt;
Es wird eine Liste von allen Räumen erstellt, aber nur die erste Zeile der Liste&lt;br /&gt;
(d.h. der Raum mit den meisten Plätzen) wird ausgegeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   SELECT r.nummer, r.plaetze&lt;br /&gt;
   FROM raum r&lt;br /&gt;
   ORDER BY r.plaetze DESC&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LIMIT 1'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Abfragen über &amp;lt;u&amp;gt;mehrere&amp;lt;/u&amp;gt; Tabellen=&lt;br /&gt;
&lt;br /&gt;
===Vereinigung===&lt;br /&gt;
Vereinigung bedeutet, dass die Ergebnis-Datensätze von zwei Abfragen zu einem Ergebnis zusammengefügt werden. &amp;lt;br/&amp;gt;Voraussetzung dafür ist, dass beide Abfragen &amp;lt;u&amp;gt;gleich viele&amp;lt;/u&amp;gt; Attribute abfragen.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die Name und Vorname von allen Lehrern UND Schülern wiedergibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT l.name, l.vorname&lt;br /&gt;
 FROM lehrer l&lt;br /&gt;
 &amp;lt;u&amp;gt;'''UNION'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Differenz (NOT IN) ===&lt;br /&gt;
Differenz bedeutet, dass die Ergebnis-Datensätze einer Abfrage a1 von den Ergebnis-Datensätzen einer Abfrage a0 abgezogen werden - es bleibt dann ein Rest übrig.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die alle Klassen ausgibt, die KEIN Mathematik haben.&lt;br /&gt;
&lt;br /&gt;
Idee: Die Klassen, die Mathematik haben, von allen Klassen abziehen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT k.name&lt;br /&gt;
 FROM klasse k&lt;br /&gt;
 WHERE k.id &amp;lt;u&amp;gt;'''NOT IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT u.klasse_id &lt;br /&gt;
    FROM unterricht u &lt;br /&gt;
    WHERE u.fach='Mathe'&lt;br /&gt;
 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IN===&lt;br /&gt;
Das logische Gegenteil zu NOT IN ist entsprechend IN.&lt;br /&gt;
Dieses Schlüsselwort kann man u.a. verwenden, wenn man in einer Abfrage zwei Datensätze einer Entitätsmenge hat.&lt;br /&gt;
Beispiel: Welche Schüler sind in der selben Klasse wie Anne Ebert?&lt;br /&gt;
&lt;br /&gt;
Idee: In der äußeren Abfrage werden die Schüler gesucht; mit IN kann man dann die klasse_id von Anne Ebert angeben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name, s.vorname&lt;br /&gt;
 FROM schueler s&lt;br /&gt;
 WHERE s.klasse_id &amp;lt;u&amp;gt;'''IN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 (&lt;br /&gt;
    SELECT s2.klasse_id&lt;br /&gt;
    FROM schueler s2&lt;br /&gt;
    WHERE s2.name = 'Ebert'&lt;br /&gt;
 )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Kartesisches Produkt===&lt;br /&gt;
In der Mathematik bezeichnet man als kartesisches Produkt (nach René Descartes) zweier Mengen A und B die Menge aller geordneten Paare (a,b), wobei a aus A und b aus B ist. (Kombination: „Jedes mit jedem“.) Geschrieben wird es als '''A x B''' gelesen als A kreuz B.&lt;br /&gt;
&lt;br /&gt;
''Kurz: Jeder mit jedem''.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage für das kartesische Produkt von den Tabellen klasse und schueler. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT *&lt;br /&gt;
 FROM &amp;lt;u&amp;gt;'''klasse k, schueler s'''&amp;lt;/u&amp;gt; &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Abfrage liefert als Ergebnis &amp;quot;Jeder mit jedem&amp;quot;. Inhaltlich ist das nicht sinnvoll.&lt;br /&gt;
&lt;br /&gt;
Damit das kartesische Produkt sinnvoll wird, braucht man einen Abgleich zwischen den Tabellen; vgl. [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Abgleich zwischen mehreren Tabellen===&lt;br /&gt;
Formuliere eine Abfrage, die angibt, in welchen Räumen die Klasse 8a unterrichtet wird.&lt;br /&gt;
Die Abfrage läuft über die Tabellen klasse, unterricht und raum.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT r.nummer&lt;br /&gt;
 FROM klasse k, unterricht u, raum r  &lt;br /&gt;
 &amp;lt;u&amp;gt;'''WHERE r.id=u.raum_id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 &amp;lt;u&amp;gt;'''AND u.klasse_id=k.id'''&amp;lt;/u&amp;gt;&lt;br /&gt;
 AND k.name = '8a'&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Wichtig:''' bei Abfragen über mehrere Tabellen braucht man einen Abgleich weniger als man Tabellen abfragt.&lt;br /&gt;
&lt;br /&gt;
Im Beispiel werden drei Tabellen abgefragt; deswegen braucht man zwei Abgleiche.&lt;br /&gt;
&lt;br /&gt;
===Join===&lt;br /&gt;
Join ist die Bildung eines [[SQL#Kartesisches_Produkt|kartesischen Produktes]] gefolgt von einer Selektion, die den (richtigen) Abgleich zwischen den beiden Tabellen leistet.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste der Schüler, in der für jeden Schüler vermerkt wird, in welcher Klasse er ist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
 FROM schueler s &amp;lt;u&amp;gt;'''JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
 '''ON''' s.klasse_id = k.id&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mit einem JOIN werden nur VOLLSTÄNDIGE Datensätze angezeigt. D.h. im Beispiel fallen Schüler, die keine Klasse haben, und Klassen, die keine Schüler haben, raus.&lt;br /&gt;
&lt;br /&gt;
Der Join entspricht der [[SQL#SQL-Abfrage über mehrere verknüpfte Tabellen|SQL-Abfrage über mehrere verknüpfte Tabellen]]&lt;br /&gt;
&lt;br /&gt;
===Left-Join===&lt;br /&gt;
Beim '''Left''' Join werden auch die Zeilen der '''linken''' Tabelle aufgeführt, die keinen Partner in der rechten Tabelle haben. In der rechten Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Left-Join zwischen den Tabellen klasse und schueler durchführt.&lt;br /&gt;
Bewerte das Ergebnis inhaltlich: In welchen Zusammenhängen braucht man Left-Join?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Schüler angezeigt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
===Right-Join===&lt;br /&gt;
Beim '''Right''' Join werden auch die Zeilen der '''rechten''' Tabelle aufgeführt, die keinen Partner in der linken Tabelle haben. In der linken Tabelle wird ggf. mit ''NULL'' aufgefüllt.&lt;br /&gt;
&lt;br /&gt;
Formuliere eine Abfrage, die einen Right-Join zwischen den Tabellen klasse und schueler durchführt. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s &amp;lt;u&amp;gt;'''RIGHT JOIN'''&amp;lt;/u&amp;gt; klasse k&lt;br /&gt;
  &amp;lt;u&amp;gt;'''ON'''&amp;lt;/u&amp;gt; s.klasse_id = k.id&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim RIGHT JOIN werden ALLE Daten der RECHTEN Entitätsmenge angezeigt. Im Beispiel werden also auch die Klassen angezeigt, die keine Schüler haben.&lt;br /&gt;
&lt;br /&gt;
===LEFT JOIN (bzw. RIGHT JOIN) über 3 oder mehr Tabellen ===&lt;br /&gt;
Wenn man einen LEFT JOIN über insgesamt 3 Tabellen machen will, verwendet man am einfachsten zwei LEFT JOIN. &amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel: Eine Liste &amp;lt;u&amp;gt;aller&amp;lt;/u&amp;gt; Schüler, in der steht, welche AGs sie belegen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name as schueler, a.name as ag&lt;br /&gt;
  FROM schueler s&lt;br /&gt;
  LEFT JOIN teilnahme t&lt;br /&gt;
  ON s.id = t.schueler_id&lt;br /&gt;
  LEFT JOIN ag a&lt;br /&gt;
  ON t.ag_id = a.id&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===IS NULL===&lt;br /&gt;
Formuliere eine Abfrage, die alle Schüler zurückgibt, die keine Klasse haben.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT s.name AS schuelername, k.name AS klassename&lt;br /&gt;
  FROM schueler s LEFT JOIN klasse k&lt;br /&gt;
  ON s.klasse_id = k.id&lt;br /&gt;
  WHERE k.id &amp;lt;u&amp;gt;'''IS NULL'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beim LEFT JOIN werden ALLE Daten der LINKEN Entitätsmenge angezeigt, also auch die Schüler, die keine Klasse haben.&lt;br /&gt;
Diese Schüler werden durch &amp;lt;code&amp;gt;k.id IS NULL ausgewählt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Abfragen, bei denen man mehrere Variablen einer Entitätsmenge braucht===&lt;br /&gt;
Formuliere eine Abfrage, die alle Räume wiedergibt, die mehr Plätze haben als Raum R203.&lt;br /&gt;
&lt;br /&gt;
''Idee: ''&lt;br /&gt;
* ''Man hat den &amp;lt;u&amp;gt;bekannten&amp;lt;/u&amp;gt; Raum r1 mit der Nummer &amp;quot;R203&amp;quot;.''&lt;br /&gt;
* ''Außerdem hat man den &amp;lt;u&amp;gt;gesuchten&amp;lt;/u&amp;gt; Raum r2, der mehr Plätze hat als Raum r1.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  SELECT r2.nummer&lt;br /&gt;
  FROM &amp;lt;u&amp;gt;'''raum r1'''&amp;lt;/u&amp;gt;, &amp;lt;u&amp;gt;'''raum r2'''&amp;lt;/u&amp;gt;&lt;br /&gt;
  WHERE r1.nummer = &amp;quot;R203&amp;quot;&lt;br /&gt;
  AND r2.plaetze &amp;gt; r1.plaetze&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Geschachtelte SQL-Ausdrücke=&lt;br /&gt;
Mit ''Geschachtelte SQL-Ausdrücke'' (so heißt das im Zentralabitur...) ist folgendes gemeint:&lt;br /&gt;
&lt;br /&gt;
'''Man kann die Tabellen, die man bei FROM angibt, durch eigene SELECT-Anfrage selber definieren.'''&lt;br /&gt;
&lt;br /&gt;
Die selbstdefinierten Tabellen müssen &amp;lt;u&amp;gt;mit einem Alias benannt&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;durch ein Komma voneinander getrennt&amp;lt;/u&amp;gt; werden.&amp;lt;br/&amp;gt;Dann können sie wie &amp;quot;normale&amp;quot; Tabellen genutzt werden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
''Eine Liste der Klassen, in der steht, wieviel Prozent Sportunterricht sie haben.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* In FROM werden zwei Tabellen definiert: Die Tabelle '''gesamtstunden''' und die Tabelle '''sportstunden'''.&lt;br /&gt;
* Diese Tabellen werden mit einem  '''LEFT JOIN ... ON''' verknüpft.&lt;br /&gt;
* Außerdem erhalten sie mithilfe von AS Aliasnamen: '''AS gesamtstunden''' (bzw. '''AS sportstunden''').&lt;br /&gt;
* Mithilfe dieser Aliasnamen kann die äußere Abfrage auf die beiden Tabellen zugreifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''WICHTIG:'''&lt;br /&gt;
Man muss jeder inneren SELECT-Abfrage mithilfe von '''AS''' einen '''Namen''' geben - nur dann ist sie in der äußeren SELECT-Abfrage ansprechbar!&lt;br /&gt;
&lt;br /&gt;
=SQL analysieren=&lt;br /&gt;
In Klausuren (auch im Abi) muss SQL analysiert werden.&lt;br /&gt;
&lt;br /&gt;
Meistens muss man dabei ein SQL-Statement auf vorliegende Tabellen anwenden; es kann aber auch vorkommen, dass man ein SQL-Statement erläutern muss.&lt;br /&gt;
&lt;br /&gt;
Dafür wird hier ein '''Beispiel''' gegeben.&lt;br /&gt;
&lt;br /&gt;
'''SQL-Statement:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT gesamtstunden.klasse AS klasse, sportstunden.stunden/gesamtstunden.stunden * 100 AS prozent&lt;br /&gt;
 FROM&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k LEFT JOIN unterricht u&lt;br /&gt;
    ON k.id = u.klasse_id&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS gesamtstunden&amp;lt;/u&amp;gt;&lt;br /&gt;
   &amp;lt;u&amp;gt;'''LEFT JOIN'''&amp;lt;/u&amp;gt;&lt;br /&gt;
   (SELECT k.name AS klasse, SUM(u.stunden) AS stunden&lt;br /&gt;
    FROM klasse k, unterricht u&lt;br /&gt;
    WHERE k.id = u.klasse_id&lt;br /&gt;
    AND u.fach = 'Sport'&lt;br /&gt;
    GROUP BY k.name&lt;br /&gt;
   ) &amp;lt;u&amp;gt;AS sportstunden&amp;lt;/u&amp;gt;'''&lt;br /&gt;
 &amp;lt;u&amp;gt;'''ON sportstunden.klasse = gesamtstunden.klasse'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgaben:'''&lt;br /&gt;
# Erläutern Sie die '''Funktionsweise''' dieser SQL-Abfrage.&lt;br /&gt;
# Erläutern Sie, welchem '''Zweck''' diese SQL-Abfrage dient.&lt;br /&gt;
&lt;br /&gt;
Folgendermaßen könnte eine Bearbeitung aussehen; wichtige Schlüsselwörter und Passagen sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Funktionsweise:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage besteht aus einer &amp;lt;u&amp;gt;äußeren Abfrage&amp;lt;/u&amp;gt;, die auf &amp;lt;u&amp;gt;zwei selbstdefinierte&amp;lt;/u&amp;gt; Tabellen zugreift.&lt;br /&gt;
Der ersten selbstdefinierten Tabelle wurde mit &amp;quot;AS gesamtstunden&amp;quot; &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; gegeben, der zweiten selbstdefinierten Tabelle &amp;lt;u&amp;gt;der Name &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; wird mithilfe von GROUP BY eine Liste der Klassen-Namen erstellt, in der für jede Klasse die Gesamtzahl der unterrichteten Stunden angegeben wird. In der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt; geschieht dasselbe für die Sportstunden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;In der äußeren Abfrage werden diese beiden selbstdefinierten Tabellen mithilfe eines LEFT JOIN über die Spalten sportstunden.klasse = gesamtstunden.klasse verknüpft.&lt;br /&gt;
&lt;br /&gt;
So werden in der Ergebnistabellen alle Zeilen der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; berücksichtigt, aber nicht unbedingt alle Zeilen der Tabelle &amp;lt;code&amp;gt;sportstunden&amp;lt;/code&amp;gt;.&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die äußere Abfrage übernimmt im SELECT die Spalte &amp;lt;code&amp;gt;klasse&amp;lt;/code&amp;gt; aus der Tabelle &amp;lt;code&amp;gt;gesamtstunden&amp;lt;/code&amp;gt; und berechnet dann aus &amp;lt;code&amp;gt;sportstunden.stunden&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;gesamtstunden.stunden&amp;lt;/code&amp;gt;, wie viel Prozent Sport erteilt wird.&lt;br /&gt;
&lt;br /&gt;
'''Zweck:'''&lt;br /&gt;
&lt;br /&gt;
Die SQL-Abfrage gibt eine Liste aller Klassen zurück, die Unterricht haben. Für jede Klasse wird angegeben, wie viel Prozent ihrer Unterrichtsstunden Sportstunden sind. Die 8D hat zwar keinen Unterricht, durch die (zweifache) Verwendung von LEFT JOIN wird sie dennoch angezeigt, in der rechten Spalte steht dann NULL statt einer Prozentzahl.&lt;br /&gt;
&lt;br /&gt;
=HAVING=&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;Nicht abiturrelevant, aber sehr nützlich!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Manchmal hat man eine Zahl gerade erst mit einer Aggregatfunktion (z.B. &amp;lt;code&amp;gt;SUM&amp;lt;/code&amp;gt;) ermittelt und möchte für diese Zahl direkt eine Bedingung festlegen.&lt;br /&gt;
&lt;br /&gt;
Das kann man mit &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; nicht tun, denn &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; funktioniert nur für &amp;quot;fest&amp;quot; definierte Zahlen!&lt;br /&gt;
&lt;br /&gt;
Für diesen Fall wurde das Schlüsselwort &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt; entwickelt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Eine Liste der Fächer, in der die Gesamtzahl der Stunden vermerkt ist, die sie unterrichtet werden. &amp;lt;u&amp;gt;Es sollen nur Fächer aufgeführt werden, die mehr als 7 Stunden unterrichtet werden&amp;lt;/u&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
''Beachte: Die Gesamtzahl der Stunden muss mit einer Aggregatfunktion (SUM) ermittelt werden. Deswegen kann man für die Gesamtzahl keine &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt;-Bedingung formulieren - das würde zu einem Syntax-Fehler führen.''&lt;br /&gt;
&lt;br /&gt;
''Lösen lässt sich das mit &amp;lt;code&amp;gt;HAVING&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 SELECT u.fach, SUM(u.stunden) AS stunden&lt;br /&gt;
 FROM unterricht u&lt;br /&gt;
 GROUP BY u.fach&lt;br /&gt;
 &amp;lt;u&amp;gt;HAVING stunden &amp;gt; 7&amp;lt;/u&amp;gt;&lt;br /&gt;
 ORDER BY stunden DESC&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Mit Java auf eine SQL-Datenbank zugreifen=&lt;br /&gt;
Das wird hier erklärt: [[Java-SQL]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2988</id>
		<title>Binärbaum (Methoden)</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2988"/>
		<updated>2020-03-22T10:18:13Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Strategie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''Diese Seite entspricht dem Abi 17 (und folgenden)'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die '''Standard-Strategien''' für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] vorgestellt:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
Außerdem wird erklärt, was eine '''Rahmenmethode''' ist und wie man sie implementiert.&lt;br /&gt;
&lt;br /&gt;
Für das '''Suchen''' und '''Löschen''' von Elementen: siehe [[binärer Suchbaum ab Abi 2017]]&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
&lt;br /&gt;
Rekursion, Abbruchbedingung, rekursiver Aufruf, Sachlogik, Rahmenmethode, Pfaddurchlauf, Linearisierung, Baumliste&lt;br /&gt;
&lt;br /&gt;
=Standard-Strategien=&lt;br /&gt;
Für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] gibt es drei Standard-Strategien:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
&lt;br /&gt;
==Rekursion==&lt;br /&gt;
Binärbäume sind '''rekursive Datenstrukturen''', denn jeder Binärbaum hat zwei Teilbäume - und die sind selber wieder Binärbäume.&lt;br /&gt;
&lt;br /&gt;
Deswegen bietet es sich an, Binärbäume '''rekursiv''' zu durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Bei der Implementierung einer rekursiven Methode für Binärbäume wird der gesamte Baum nur sehr grob betrachtet: Er besteht aus&lt;br /&gt;
* der Wurzel,&lt;br /&gt;
* dem linken Teilbaum (für den die Methode rekursiv aufgerufen wird)&lt;br /&gt;
* dem rechten Teilbaum (für den die Methode nochmal rekursiv aufgerufen wird).&lt;br /&gt;
&lt;br /&gt;
In der '''Sachlogik''' muss man folgende Frage beantworten:&lt;br /&gt;
&lt;br /&gt;
'''''Wie setzt sich das Gesamtergebnis aus der Wurzel, dem Ergebnis des linken Teilbaumes und dem Ergebnis des rechten Teilbaumes zusammen?'''''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;[https://www.youtube.com/watch?v=HDCVf1LXrP0 Erklärvideo zum Vorgehen bei rekursiven Methoden (11:23min)]&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-right:10px; border:1px dotted #000008; padding: 0em 1em 1em 1em; background-color:#F9F9F9;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Bestandteile einer rekursiven Methode:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* eine '''Abbruchbedingung''' oder mehrere Abbruchbedingungen.&amp;lt;br&amp;gt; Diese hängen vom Sachzusammenhang ab - in der Regel braucht man mindestens eine Abbruchbedingung für einen leeren Binärbaum.&lt;br /&gt;
* '''Wurzel auslesen''' ''(=Wurzelbehandlung)''&lt;br /&gt;
* '''rekursive Aufrufe''': Die Methode ruft sich selber auf.&lt;br /&gt;
** Meistens braucht man '''zwei rekursive Aufrufe''': einen für den linken Teilbaum und einen für den rechten Teilbaum.&lt;br /&gt;
** Bei Methoden, die etwas zurückgeben, muss man sich für den Rückgabewert interessieren!&lt;br /&gt;
* '''Sachlogik''': Hier werden die Wurzel und die Ergebnisse der rekursiven Aufrufe behandelt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Das rekursive Vorgehen wird hier beispielhaft an der Methode &amp;lt;code&amp;gt;public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree)&amp;lt;/code&amp;gt; aufgezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree){&lt;br /&gt;
        int ergebnis = 0;&lt;br /&gt;
  &lt;br /&gt;
        '''//Abbruchbedingung'''&lt;br /&gt;
        if(pTree.isEmpty()){&lt;br /&gt;
            return ergebnis;&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        '''//Wurzel auslesen'''&lt;br /&gt;
        int wurzel = pTree.getContent();&lt;br /&gt;
   &lt;br /&gt;
        '''//rekursive Aufrufe'''&lt;br /&gt;
        int summeLinks =  summe(pTree.getLeftTree());&lt;br /&gt;
        int summeRechts = summe(pTree.getRightTree());&lt;br /&gt;
  &lt;br /&gt;
        '''//Sachlogik'''&lt;br /&gt;
        ergebnis += wurzel;&lt;br /&gt;
        ergebnis += summeLinks;&lt;br /&gt;
        ergebnis += summeRechts;&lt;br /&gt;
 &lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Durchlaufen eines Pfades==&lt;br /&gt;
In manchen Situationen, vor allem in Bäumen mit Suchbaumstruktur, reicht es, wenn man einen '''Pfad von der Wurzel bis zu einem Blatt durchläuft'''. Das lässt sich mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife realisieren, d.h. Rekursion ist hier nicht nötig.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Um einen Pfad in dem Binärbaum &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; von der Wurzel zu einem Blatt zu durchlaufen, geht man wie folgt vor:&lt;br /&gt;
* Es wird eine &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife geöffnet, die so lange läuft, bis &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; leer ist.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife wird - abhängig von der Sachlogik - nach links oder nach rechts abgebogen. Das realisiert man, indem man &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; durch seinen linken oder rechten Teilbaum updated.&lt;br /&gt;
* Nach Beendigung der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife ist man dann bei einem leeren Knoten unterhalb eines Blattes angekommen.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Als Beispiel wird die Methode '''einfuegen''' für einen mit Zahlen gefüllten Suchbaum implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public void einfuegen(BinaryTree&amp;lt;Integer&amp;gt; pTree, int pZahl) {&lt;br /&gt;
       //Hilfsbaum definieren, damit man pTree nicht &amp;quot;zersägt&amp;quot;:&lt;br /&gt;
       '''BinaryTree&amp;lt;Integer&amp;gt; b = pTree;'''&lt;br /&gt;
       '''while(!b.isEmpty()){'''&lt;br /&gt;
            int wurzel = b.getContent();&lt;br /&gt;
            '''// UPDATE von pTree'''&lt;br /&gt;
            if(pZahl &amp;lt; wurzel){&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                '''b = b.getRightTree();'''&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // jetzt ist man beim richtigen leeren Knoten angekommen!&lt;br /&gt;
        b.setContent(pZahl);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linearisierung==&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, '''''OHNE eine rekursive Methode zu verwenden'''''.&lt;br /&gt;
&lt;br /&gt;
===Vorgehensweise===&lt;br /&gt;
Die Vorgehensweise wird hier am Beispiel '''Levelorder''' aufgezeigt.&lt;br /&gt;
In Levelorder wird der Binärbaum &amp;quot;schichtenweise&amp;quot; von oben nach unten durchlaufen, d.h. es handelt sich hier um eine '''Breitensuche'''.&lt;br /&gt;
&lt;br /&gt;
Die Idee der Linarisierung ist die folgende:&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung:'''&lt;br /&gt;
# eine Hilfsliste &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird angelegt; in diese Hilfsliste kommen nur Bäume!&lt;br /&gt;
# der ganze Baum wird in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; gepackt, d.h. &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; hat jetzt ein Element.&lt;br /&gt;
# dann wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; mit einer Schleife von vorne bis zum Ende durchlaufen; dabei wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; '''ständig ergänzt!'''&lt;br /&gt;
## bei jedem Schleifen-Durchlauf wird das aktuelle Element (=ein Baum) aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; entnommen.&lt;br /&gt;
## die beiden Teilbäume (wenn sie nicht leer sind) werden hinten an &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; angehängt. &lt;br /&gt;
# Jetzt hat man in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; eine Liste aller Teilbäume von &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Diese Liste kann jetzt für die Sachlogik verwendet werden.&lt;br /&gt;
'''Sachlogik:'''&lt;br /&gt;
# eine Ergebnisliste &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; wird angelegt; in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; kommen die Knoten in der Levelorder-Reihenfolge.&lt;br /&gt;
# &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird mit einer Schleife durchlaufen. Bei jedem Schleifendurchlauf wird...&lt;br /&gt;
## der aktuelle Baum aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; ausgelesen.&lt;br /&gt;
## die Wurzel des aktuellen Baumes in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public List&amp;lt;Object&amp;gt; levelorder(BinaryTree&amp;lt;Object&amp;gt; pTree){&lt;br /&gt;
        '''//Linearisierung'''&lt;br /&gt;
        List&amp;lt;BinaryTree&amp;lt;Object&amp;gt;&amp;gt; baumListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.append(pTree);&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuell = baumListe.getContent();&lt;br /&gt;
            if(!aktuell.getLeftTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getLeftTree());&lt;br /&gt;
            }&lt;br /&gt;
            if(!aktuell.getRightTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getRightTree());&lt;br /&gt;
            }&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        '''// Sachlogik:'''&lt;br /&gt;
        // die baumListe durchlaufen,&lt;br /&gt;
        // von jedem Element (Typ: BinaryTree!)&lt;br /&gt;
        // die Wurzel auslesen und an ergebnisListe anhaengen&lt;br /&gt;
        List&amp;lt;Object&amp;gt; ergebnisListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuellerBaum = baumListe.getContent();&lt;br /&gt;
            Object aktuelleWurzel = aktuellerBaum.getContent();&lt;br /&gt;
            ergebnisListe.append(aktuelleWurzel);&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnisListe;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Rahmenmethode=&lt;br /&gt;
siehe [[Binärbaum#Rahmenmethode|Rahmenmethode]] im Artikel [[Binärbaum]].&lt;br /&gt;
&lt;br /&gt;
=weitere beispielhafte Methoden=&lt;br /&gt;
==Tiefe==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int tiefe(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = &amp;lt;b&amp;gt;-1&amp;lt;/b&amp;gt;;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       // leere Teilbaeume haben Tiefe -1&lt;br /&gt;
       // denn Baeume, die nur aus einem Blatt bestehen, &lt;br /&gt;
       // haben Tiefe 0!&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    // die Wurzel beruecksichtigen!&lt;br /&gt;
    // Bäume mit nur einer Wurzel haben die Tiefe 0.&lt;br /&gt;
    ergebnis = 0;&lt;br /&gt;
    int tiefeLinks = tiefe(pTree.getLeftTree());&lt;br /&gt;
    int tiefeRechts = tiefe(pTree.getRightTree());&lt;br /&gt;
    ergebnis = tiefeLinks;&lt;br /&gt;
    if (ergebnis &amp;lt; tiefeRechts) {&lt;br /&gt;
       ergebnis = tiefeRechts;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Knotenzahl==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int knotenzahl(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = 0;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    ergebnis += 1;   // die Wurzel zaehlen!&lt;br /&gt;
    int knotenLinks = knotenzahl(pTree.getLeftTree());&lt;br /&gt;
    int knotenRechts = knotenzahl(pTree.getRightTree());&lt;br /&gt;
    ergebnis += knotenLinks;&lt;br /&gt;
    ergebnis += knotenRechts;&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blätter==&lt;br /&gt;
Diese Methode gibt alle Blätter eines Baumes in einer Liste zurück.&lt;br /&gt;
&lt;br /&gt;
Die Methode funktioniert rekursiv.&lt;br /&gt;
&lt;br /&gt;
Man braucht zwei Abbruchbedingungen:&lt;br /&gt;
* für einen leeren Baum -&amp;gt; eine leere Liste zurückgeben&lt;br /&gt;
* für ein Blatt -&amp;gt; eine Liste mit nur einem Blatt drin zurückgeben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public List blaetter(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    List ergebnis = new List();&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty()){&lt;br /&gt;
       // pTree ist ein Blatt!&lt;br /&gt;
       ergebnis.append(pTree);&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    List&amp;lt;Object&amp;gt; linkesErgebnis = blaetter(pTree.getLeftTree());&lt;br /&gt;
    List&amp;lt;Object&amp;gt; rechtesErgebnis = blaetter(pTree.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    ergebnis.concat(linkesErgebnis);&lt;br /&gt;
    ergebnis.concat(rechtesErgebnis);&lt;br /&gt;
 &lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Berechnen==&lt;br /&gt;
[[File:Strukturbaum.jpg|thumb|Binärer Strukturbaum (12/4)+(2*3) |300px]]&lt;br /&gt;
Diese Methode berechnet das Ergebnis eines Strukturbaumes aus den Rechenzeichen +, -, *, / und Zahlen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public double berechnen(BinaryTree&amp;lt;String&amp;gt; b) {&lt;br /&gt;
    double ergebnis = 0;&lt;br /&gt;
    if (b.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    String wurzelString = b.getContent();&lt;br /&gt;
    if ( !wurzelString.equals(&amp;quot;+&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;-&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;*&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;/&amp;quot;) &lt;br /&gt;
       ) &lt;br /&gt;
    {&lt;br /&gt;
        double wurzelDouble = Double.parseDouble(wurzelString);&lt;br /&gt;
        ergebnis = wurzelDouble;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    double ergebnisLinks  = berechnen(b.getLeftTree());&lt;br /&gt;
    double ergebnisRechts = berechnen(b.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    if(wurzelString.equals(&amp;quot;+&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks + ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;-&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks - ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;*&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks * ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;/&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks / ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        System.err.println(&amp;quot;unbekanntes Rechenzeichen!&amp;quot;);&lt;br /&gt;
        ergebnis = 0;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2987</id>
		<title>Binärbaum (Methoden)</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2987"/>
		<updated>2020-03-22T10:17:42Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Strategie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''Diese Seite entspricht dem Abi 17 (und folgenden)'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die '''Standard-Strategien''' für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] vorgestellt:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
Außerdem wird erklärt, was eine '''Rahmenmethode''' ist und wie man sie implementiert.&lt;br /&gt;
&lt;br /&gt;
Für das '''Suchen''' und '''Löschen''' von Elementen: siehe [[binärer Suchbaum ab Abi 2017]]&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
&lt;br /&gt;
Rekursion, Abbruchbedingung, rekursiver Aufruf, Sachlogik, Rahmenmethode, Pfaddurchlauf, Linearisierung, Baumliste&lt;br /&gt;
&lt;br /&gt;
=Standard-Strategien=&lt;br /&gt;
Für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] gibt es drei Standard-Strategien:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
&lt;br /&gt;
==Rekursion==&lt;br /&gt;
Binärbäume sind '''rekursive Datenstrukturen''', denn jeder Binärbaum hat zwei Teilbäume - und die sind selber wieder Binärbäume.&lt;br /&gt;
&lt;br /&gt;
Deswegen bietet es sich an, Binärbäume '''rekursiv''' zu durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Bei der Implementierung einer rekursiven Methode für Binärbäume wird der gesamte Baum nur sehr grob betrachtet: Er besteht aus&lt;br /&gt;
* der Wurzel,&lt;br /&gt;
* dem linken Teilbaum (für den die Methode rekursiv aufgerufen wird)&lt;br /&gt;
* dem rechten Teilbaum (für den die Methode nochmal rekursiv aufgerufen wird).&lt;br /&gt;
&lt;br /&gt;
In der '''Sachlogik''' muss man folgende Frage beantworten:&lt;br /&gt;
&lt;br /&gt;
'''''Wie setzt sich das Gesamtergebnis aus der Wurzel, dem Ergebnis des linken Teilbaumes und dem Ergebnis des rechten Teilbaumes zusammen?'''''&lt;br /&gt;
[https://www.youtube.com/watch?v=HDCVf1LXrP0 Erklärvideo zum Vorgehen bei rekursiven Methoden (11:23min)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-right:10px; border:1px dotted #000008; padding: 0em 1em 1em 1em; background-color:#F9F9F9;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Bestandteile einer rekursiven Methode:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* eine '''Abbruchbedingung''' oder mehrere Abbruchbedingungen.&amp;lt;br&amp;gt; Diese hängen vom Sachzusammenhang ab - in der Regel braucht man mindestens eine Abbruchbedingung für einen leeren Binärbaum.&lt;br /&gt;
* '''Wurzel auslesen''' ''(=Wurzelbehandlung)''&lt;br /&gt;
* '''rekursive Aufrufe''': Die Methode ruft sich selber auf.&lt;br /&gt;
** Meistens braucht man '''zwei rekursive Aufrufe''': einen für den linken Teilbaum und einen für den rechten Teilbaum.&lt;br /&gt;
** Bei Methoden, die etwas zurückgeben, muss man sich für den Rückgabewert interessieren!&lt;br /&gt;
* '''Sachlogik''': Hier werden die Wurzel und die Ergebnisse der rekursiven Aufrufe behandelt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Das rekursive Vorgehen wird hier beispielhaft an der Methode &amp;lt;code&amp;gt;public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree)&amp;lt;/code&amp;gt; aufgezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree){&lt;br /&gt;
        int ergebnis = 0;&lt;br /&gt;
  &lt;br /&gt;
        '''//Abbruchbedingung'''&lt;br /&gt;
        if(pTree.isEmpty()){&lt;br /&gt;
            return ergebnis;&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        '''//Wurzel auslesen'''&lt;br /&gt;
        int wurzel = pTree.getContent();&lt;br /&gt;
   &lt;br /&gt;
        '''//rekursive Aufrufe'''&lt;br /&gt;
        int summeLinks =  summe(pTree.getLeftTree());&lt;br /&gt;
        int summeRechts = summe(pTree.getRightTree());&lt;br /&gt;
  &lt;br /&gt;
        '''//Sachlogik'''&lt;br /&gt;
        ergebnis += wurzel;&lt;br /&gt;
        ergebnis += summeLinks;&lt;br /&gt;
        ergebnis += summeRechts;&lt;br /&gt;
 &lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Durchlaufen eines Pfades==&lt;br /&gt;
In manchen Situationen, vor allem in Bäumen mit Suchbaumstruktur, reicht es, wenn man einen '''Pfad von der Wurzel bis zu einem Blatt durchläuft'''. Das lässt sich mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife realisieren, d.h. Rekursion ist hier nicht nötig.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Um einen Pfad in dem Binärbaum &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; von der Wurzel zu einem Blatt zu durchlaufen, geht man wie folgt vor:&lt;br /&gt;
* Es wird eine &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife geöffnet, die so lange läuft, bis &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; leer ist.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife wird - abhängig von der Sachlogik - nach links oder nach rechts abgebogen. Das realisiert man, indem man &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; durch seinen linken oder rechten Teilbaum updated.&lt;br /&gt;
* Nach Beendigung der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife ist man dann bei einem leeren Knoten unterhalb eines Blattes angekommen.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Als Beispiel wird die Methode '''einfuegen''' für einen mit Zahlen gefüllten Suchbaum implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public void einfuegen(BinaryTree&amp;lt;Integer&amp;gt; pTree, int pZahl) {&lt;br /&gt;
       //Hilfsbaum definieren, damit man pTree nicht &amp;quot;zersägt&amp;quot;:&lt;br /&gt;
       '''BinaryTree&amp;lt;Integer&amp;gt; b = pTree;'''&lt;br /&gt;
       '''while(!b.isEmpty()){'''&lt;br /&gt;
            int wurzel = b.getContent();&lt;br /&gt;
            '''// UPDATE von pTree'''&lt;br /&gt;
            if(pZahl &amp;lt; wurzel){&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                '''b = b.getRightTree();'''&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // jetzt ist man beim richtigen leeren Knoten angekommen!&lt;br /&gt;
        b.setContent(pZahl);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linearisierung==&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, '''''OHNE eine rekursive Methode zu verwenden'''''.&lt;br /&gt;
&lt;br /&gt;
===Vorgehensweise===&lt;br /&gt;
Die Vorgehensweise wird hier am Beispiel '''Levelorder''' aufgezeigt.&lt;br /&gt;
In Levelorder wird der Binärbaum &amp;quot;schichtenweise&amp;quot; von oben nach unten durchlaufen, d.h. es handelt sich hier um eine '''Breitensuche'''.&lt;br /&gt;
&lt;br /&gt;
Die Idee der Linarisierung ist die folgende:&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung:'''&lt;br /&gt;
# eine Hilfsliste &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird angelegt; in diese Hilfsliste kommen nur Bäume!&lt;br /&gt;
# der ganze Baum wird in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; gepackt, d.h. &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; hat jetzt ein Element.&lt;br /&gt;
# dann wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; mit einer Schleife von vorne bis zum Ende durchlaufen; dabei wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; '''ständig ergänzt!'''&lt;br /&gt;
## bei jedem Schleifen-Durchlauf wird das aktuelle Element (=ein Baum) aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; entnommen.&lt;br /&gt;
## die beiden Teilbäume (wenn sie nicht leer sind) werden hinten an &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; angehängt. &lt;br /&gt;
# Jetzt hat man in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; eine Liste aller Teilbäume von &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Diese Liste kann jetzt für die Sachlogik verwendet werden.&lt;br /&gt;
'''Sachlogik:'''&lt;br /&gt;
# eine Ergebnisliste &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; wird angelegt; in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; kommen die Knoten in der Levelorder-Reihenfolge.&lt;br /&gt;
# &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird mit einer Schleife durchlaufen. Bei jedem Schleifendurchlauf wird...&lt;br /&gt;
## der aktuelle Baum aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; ausgelesen.&lt;br /&gt;
## die Wurzel des aktuellen Baumes in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public List&amp;lt;Object&amp;gt; levelorder(BinaryTree&amp;lt;Object&amp;gt; pTree){&lt;br /&gt;
        '''//Linearisierung'''&lt;br /&gt;
        List&amp;lt;BinaryTree&amp;lt;Object&amp;gt;&amp;gt; baumListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.append(pTree);&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuell = baumListe.getContent();&lt;br /&gt;
            if(!aktuell.getLeftTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getLeftTree());&lt;br /&gt;
            }&lt;br /&gt;
            if(!aktuell.getRightTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getRightTree());&lt;br /&gt;
            }&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        '''// Sachlogik:'''&lt;br /&gt;
        // die baumListe durchlaufen,&lt;br /&gt;
        // von jedem Element (Typ: BinaryTree!)&lt;br /&gt;
        // die Wurzel auslesen und an ergebnisListe anhaengen&lt;br /&gt;
        List&amp;lt;Object&amp;gt; ergebnisListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuellerBaum = baumListe.getContent();&lt;br /&gt;
            Object aktuelleWurzel = aktuellerBaum.getContent();&lt;br /&gt;
            ergebnisListe.append(aktuelleWurzel);&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnisListe;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Rahmenmethode=&lt;br /&gt;
siehe [[Binärbaum#Rahmenmethode|Rahmenmethode]] im Artikel [[Binärbaum]].&lt;br /&gt;
&lt;br /&gt;
=weitere beispielhafte Methoden=&lt;br /&gt;
==Tiefe==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int tiefe(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = &amp;lt;b&amp;gt;-1&amp;lt;/b&amp;gt;;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       // leere Teilbaeume haben Tiefe -1&lt;br /&gt;
       // denn Baeume, die nur aus einem Blatt bestehen, &lt;br /&gt;
       // haben Tiefe 0!&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    // die Wurzel beruecksichtigen!&lt;br /&gt;
    // Bäume mit nur einer Wurzel haben die Tiefe 0.&lt;br /&gt;
    ergebnis = 0;&lt;br /&gt;
    int tiefeLinks = tiefe(pTree.getLeftTree());&lt;br /&gt;
    int tiefeRechts = tiefe(pTree.getRightTree());&lt;br /&gt;
    ergebnis = tiefeLinks;&lt;br /&gt;
    if (ergebnis &amp;lt; tiefeRechts) {&lt;br /&gt;
       ergebnis = tiefeRechts;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Knotenzahl==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int knotenzahl(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = 0;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    ergebnis += 1;   // die Wurzel zaehlen!&lt;br /&gt;
    int knotenLinks = knotenzahl(pTree.getLeftTree());&lt;br /&gt;
    int knotenRechts = knotenzahl(pTree.getRightTree());&lt;br /&gt;
    ergebnis += knotenLinks;&lt;br /&gt;
    ergebnis += knotenRechts;&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blätter==&lt;br /&gt;
Diese Methode gibt alle Blätter eines Baumes in einer Liste zurück.&lt;br /&gt;
&lt;br /&gt;
Die Methode funktioniert rekursiv.&lt;br /&gt;
&lt;br /&gt;
Man braucht zwei Abbruchbedingungen:&lt;br /&gt;
* für einen leeren Baum -&amp;gt; eine leere Liste zurückgeben&lt;br /&gt;
* für ein Blatt -&amp;gt; eine Liste mit nur einem Blatt drin zurückgeben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public List blaetter(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    List ergebnis = new List();&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty()){&lt;br /&gt;
       // pTree ist ein Blatt!&lt;br /&gt;
       ergebnis.append(pTree);&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    List&amp;lt;Object&amp;gt; linkesErgebnis = blaetter(pTree.getLeftTree());&lt;br /&gt;
    List&amp;lt;Object&amp;gt; rechtesErgebnis = blaetter(pTree.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    ergebnis.concat(linkesErgebnis);&lt;br /&gt;
    ergebnis.concat(rechtesErgebnis);&lt;br /&gt;
 &lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Berechnen==&lt;br /&gt;
[[File:Strukturbaum.jpg|thumb|Binärer Strukturbaum (12/4)+(2*3) |300px]]&lt;br /&gt;
Diese Methode berechnet das Ergebnis eines Strukturbaumes aus den Rechenzeichen +, -, *, / und Zahlen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public double berechnen(BinaryTree&amp;lt;String&amp;gt; b) {&lt;br /&gt;
    double ergebnis = 0;&lt;br /&gt;
    if (b.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    String wurzelString = b.getContent();&lt;br /&gt;
    if ( !wurzelString.equals(&amp;quot;+&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;-&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;*&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;/&amp;quot;) &lt;br /&gt;
       ) &lt;br /&gt;
    {&lt;br /&gt;
        double wurzelDouble = Double.parseDouble(wurzelString);&lt;br /&gt;
        ergebnis = wurzelDouble;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    double ergebnisLinks  = berechnen(b.getLeftTree());&lt;br /&gt;
    double ergebnisRechts = berechnen(b.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    if(wurzelString.equals(&amp;quot;+&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks + ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;-&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks - ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;*&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks * ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;/&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks / ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        System.err.println(&amp;quot;unbekanntes Rechenzeichen!&amp;quot;);&lt;br /&gt;
        ergebnis = 0;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2986</id>
		<title>Binärbaum (Methoden)</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=2986"/>
		<updated>2020-03-22T10:16:32Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Strategie */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;'''Diese Seite entspricht dem Abi 17 (und folgenden)'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hier werden die '''Standard-Strategien''' für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] vorgestellt:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
Außerdem wird erklärt, was eine '''Rahmenmethode''' ist und wie man sie implementiert.&lt;br /&gt;
&lt;br /&gt;
Für das '''Suchen''' und '''Löschen''' von Elementen: siehe [[binärer Suchbaum ab Abi 2017]]&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
&lt;br /&gt;
Rekursion, Abbruchbedingung, rekursiver Aufruf, Sachlogik, Rahmenmethode, Pfaddurchlauf, Linearisierung, Baumliste&lt;br /&gt;
&lt;br /&gt;
=Standard-Strategien=&lt;br /&gt;
Für das Durchlaufen von [[allgemeiner Binärbaum ab Abi 2017|Binärbäumen]] gibt es drei Standard-Strategien:&lt;br /&gt;
* Rekursion&lt;br /&gt;
* Durchlaufen eines Pfades mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife&lt;br /&gt;
* Linearisierung&lt;br /&gt;
&lt;br /&gt;
==Rekursion==&lt;br /&gt;
Binärbäume sind '''rekursive Datenstrukturen''', denn jeder Binärbaum hat zwei Teilbäume - und die sind selber wieder Binärbäume.&lt;br /&gt;
&lt;br /&gt;
Deswegen bietet es sich an, Binärbäume '''rekursiv''' zu durchlaufen.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Bei der Implementierung einer rekursiven Methode für Binärbäume wird der gesamte Baum nur sehr grob betrachtet: Er besteht aus&lt;br /&gt;
* der Wurzel,&lt;br /&gt;
* dem linken Teilbaum (für den die Methode rekursiv aufgerufen wird)&lt;br /&gt;
* dem rechten Teilbaum (für den die Methode nochmal rekursiv aufgerufen wird).&lt;br /&gt;
&lt;br /&gt;
In der '''Sachlogik''' muss man folgende Frage beantworten:&lt;br /&gt;
&lt;br /&gt;
'''''Wie setzt sich das Gesamtergebnis aus der Wurzel, dem Ergebnis des linken Teilbaumes und dem Ergebnis des rechten Teilbaumes zusammen?'''''&lt;br /&gt;
[https://www.youtube.com/watch?v=HDCVf1LXrP0 Erklärvideo zur rekursiven Strategie]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin:0; margin-right:10px; border:1px dotted #000008; padding: 0em 1em 1em 1em; background-color:#F9F9F9;text-align:left&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;Bestandteile einer rekursiven Methode:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* eine '''Abbruchbedingung''' oder mehrere Abbruchbedingungen.&amp;lt;br&amp;gt; Diese hängen vom Sachzusammenhang ab - in der Regel braucht man mindestens eine Abbruchbedingung für einen leeren Binärbaum.&lt;br /&gt;
* '''Wurzel auslesen''' ''(=Wurzelbehandlung)''&lt;br /&gt;
* '''rekursive Aufrufe''': Die Methode ruft sich selber auf.&lt;br /&gt;
** Meistens braucht man '''zwei rekursive Aufrufe''': einen für den linken Teilbaum und einen für den rechten Teilbaum.&lt;br /&gt;
** Bei Methoden, die etwas zurückgeben, muss man sich für den Rückgabewert interessieren!&lt;br /&gt;
* '''Sachlogik''': Hier werden die Wurzel und die Ergebnisse der rekursiven Aufrufe behandelt.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Das rekursive Vorgehen wird hier beispielhaft an der Methode &amp;lt;code&amp;gt;public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree)&amp;lt;/code&amp;gt; aufgezeigt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public int summe(BinaryTree&amp;lt;Integer&amp;gt; pTree){&lt;br /&gt;
        int ergebnis = 0;&lt;br /&gt;
  &lt;br /&gt;
        '''//Abbruchbedingung'''&lt;br /&gt;
        if(pTree.isEmpty()){&lt;br /&gt;
            return ergebnis;&lt;br /&gt;
        }&lt;br /&gt;
  &lt;br /&gt;
        '''//Wurzel auslesen'''&lt;br /&gt;
        int wurzel = pTree.getContent();&lt;br /&gt;
   &lt;br /&gt;
        '''//rekursive Aufrufe'''&lt;br /&gt;
        int summeLinks =  summe(pTree.getLeftTree());&lt;br /&gt;
        int summeRechts = summe(pTree.getRightTree());&lt;br /&gt;
  &lt;br /&gt;
        '''//Sachlogik'''&lt;br /&gt;
        ergebnis += wurzel;&lt;br /&gt;
        ergebnis += summeLinks;&lt;br /&gt;
        ergebnis += summeRechts;&lt;br /&gt;
 &lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Durchlaufen eines Pfades==&lt;br /&gt;
In manchen Situationen, vor allem in Bäumen mit Suchbaumstruktur, reicht es, wenn man einen '''Pfad von der Wurzel bis zu einem Blatt durchläuft'''. Das lässt sich mit einer &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife realisieren, d.h. Rekursion ist hier nicht nötig.&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
Um einen Pfad in dem Binärbaum &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; von der Wurzel zu einem Blatt zu durchlaufen, geht man wie folgt vor:&lt;br /&gt;
* Es wird eine &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife geöffnet, die so lange läuft, bis &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; leer ist.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife wird - abhängig von der Sachlogik - nach links oder nach rechts abgebogen. Das realisiert man, indem man &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt; durch seinen linken oder rechten Teilbaum updated.&lt;br /&gt;
* Nach Beendigung der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife ist man dann bei einem leeren Knoten unterhalb eines Blattes angekommen.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
Als Beispiel wird die Methode '''einfuegen''' für einen mit Zahlen gefüllten Suchbaum implementiert.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public void einfuegen(BinaryTree&amp;lt;Integer&amp;gt; pTree, int pZahl) {&lt;br /&gt;
       //Hilfsbaum definieren, damit man pTree nicht &amp;quot;zersägt&amp;quot;:&lt;br /&gt;
       '''BinaryTree&amp;lt;Integer&amp;gt; b = pTree;'''&lt;br /&gt;
       '''while(!b.isEmpty()){'''&lt;br /&gt;
            int wurzel = b.getContent();&lt;br /&gt;
            '''// UPDATE von pTree'''&lt;br /&gt;
            if(pZahl &amp;lt; wurzel){&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                '''b = b.getRightTree();'''&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        // jetzt ist man beim richtigen leeren Knoten angekommen!&lt;br /&gt;
        b.setContent(pZahl);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Linearisierung==&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, '''''OHNE eine rekursive Methode zu verwenden'''''.&lt;br /&gt;
&lt;br /&gt;
===Vorgehensweise===&lt;br /&gt;
Die Vorgehensweise wird hier am Beispiel '''Levelorder''' aufgezeigt.&lt;br /&gt;
In Levelorder wird der Binärbaum &amp;quot;schichtenweise&amp;quot; von oben nach unten durchlaufen, d.h. es handelt sich hier um eine '''Breitensuche'''.&lt;br /&gt;
&lt;br /&gt;
Die Idee der Linarisierung ist die folgende:&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung:'''&lt;br /&gt;
# eine Hilfsliste &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird angelegt; in diese Hilfsliste kommen nur Bäume!&lt;br /&gt;
# der ganze Baum wird in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; gepackt, d.h. &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; hat jetzt ein Element.&lt;br /&gt;
# dann wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; mit einer Schleife von vorne bis zum Ende durchlaufen; dabei wird &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; '''ständig ergänzt!'''&lt;br /&gt;
## bei jedem Schleifen-Durchlauf wird das aktuelle Element (=ein Baum) aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; entnommen.&lt;br /&gt;
## die beiden Teilbäume (wenn sie nicht leer sind) werden hinten an &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; angehängt. &lt;br /&gt;
# Jetzt hat man in &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; eine Liste aller Teilbäume von &amp;lt;code&amp;gt;pTree&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Diese Liste kann jetzt für die Sachlogik verwendet werden.&lt;br /&gt;
'''Sachlogik:'''&lt;br /&gt;
# eine Ergebnisliste &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; wird angelegt; in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; kommen die Knoten in der Levelorder-Reihenfolge.&lt;br /&gt;
# &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; wird mit einer Schleife durchlaufen. Bei jedem Schleifendurchlauf wird...&lt;br /&gt;
## der aktuelle Baum aus &amp;lt;code&amp;gt;baumListe&amp;lt;/code&amp;gt; ausgelesen.&lt;br /&gt;
## die Wurzel des aktuellen Baumes in &amp;lt;code&amp;gt;ergebnisListe&amp;lt;/code&amp;gt; eingefügt.&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    public List&amp;lt;Object&amp;gt; levelorder(BinaryTree&amp;lt;Object&amp;gt; pTree){&lt;br /&gt;
        '''//Linearisierung'''&lt;br /&gt;
        List&amp;lt;BinaryTree&amp;lt;Object&amp;gt;&amp;gt; baumListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.append(pTree);&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuell = baumListe.getContent();&lt;br /&gt;
            if(!aktuell.getLeftTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getLeftTree());&lt;br /&gt;
            }&lt;br /&gt;
            if(!aktuell.getRightTree().isEmpty()){&lt;br /&gt;
                baumListe.append(aktuell.getRightTree());&lt;br /&gt;
            }&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        '''// Sachlogik:'''&lt;br /&gt;
        // die baumListe durchlaufen,&lt;br /&gt;
        // von jedem Element (Typ: BinaryTree!)&lt;br /&gt;
        // die Wurzel auslesen und an ergebnisListe anhaengen&lt;br /&gt;
        List&amp;lt;Object&amp;gt; ergebnisListe = new List&amp;lt;&amp;gt;();&lt;br /&gt;
        baumListe.toFirst();&lt;br /&gt;
        while(baumListe.hasAccess()){&lt;br /&gt;
            BinaryTree&amp;lt;Object&amp;gt; aktuellerBaum = baumListe.getContent();&lt;br /&gt;
            Object aktuelleWurzel = aktuellerBaum.getContent();&lt;br /&gt;
            ergebnisListe.append(aktuelleWurzel);&lt;br /&gt;
            baumListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnisListe;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Rahmenmethode=&lt;br /&gt;
siehe [[Binärbaum#Rahmenmethode|Rahmenmethode]] im Artikel [[Binärbaum]].&lt;br /&gt;
&lt;br /&gt;
=weitere beispielhafte Methoden=&lt;br /&gt;
==Tiefe==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int tiefe(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = &amp;lt;b&amp;gt;-1&amp;lt;/b&amp;gt;;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       // leere Teilbaeume haben Tiefe -1&lt;br /&gt;
       // denn Baeume, die nur aus einem Blatt bestehen, &lt;br /&gt;
       // haben Tiefe 0!&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    // die Wurzel beruecksichtigen!&lt;br /&gt;
    // Bäume mit nur einer Wurzel haben die Tiefe 0.&lt;br /&gt;
    ergebnis = 0;&lt;br /&gt;
    int tiefeLinks = tiefe(pTree.getLeftTree());&lt;br /&gt;
    int tiefeRechts = tiefe(pTree.getRightTree());&lt;br /&gt;
    ergebnis = tiefeLinks;&lt;br /&gt;
    if (ergebnis &amp;lt; tiefeRechts) {&lt;br /&gt;
       ergebnis = tiefeRechts;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Knotenzahl==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int knotenzahl(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    int ergebnis = 0;&lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    ergebnis += 1;   // die Wurzel zaehlen!&lt;br /&gt;
    int knotenLinks = knotenzahl(pTree.getLeftTree());&lt;br /&gt;
    int knotenRechts = knotenzahl(pTree.getRightTree());&lt;br /&gt;
    ergebnis += knotenLinks;&lt;br /&gt;
    ergebnis += knotenRechts;&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Blätter==&lt;br /&gt;
Diese Methode gibt alle Blätter eines Baumes in einer Liste zurück.&lt;br /&gt;
&lt;br /&gt;
Die Methode funktioniert rekursiv.&lt;br /&gt;
&lt;br /&gt;
Man braucht zwei Abbruchbedingungen:&lt;br /&gt;
* für einen leeren Baum -&amp;gt; eine leere Liste zurückgeben&lt;br /&gt;
* für ein Blatt -&amp;gt; eine Liste mit nur einem Blatt drin zurückgeben&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public List blaetter(BinaryTree&amp;lt;Object&amp;gt; pTree) {&lt;br /&gt;
    List ergebnis = new List();&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if (pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty()){&lt;br /&gt;
       // pTree ist ein Blatt!&lt;br /&gt;
       ergebnis.append(pTree);&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    List&amp;lt;Object&amp;gt; linkesErgebnis = blaetter(pTree.getLeftTree());&lt;br /&gt;
    List&amp;lt;Object&amp;gt; rechtesErgebnis = blaetter(pTree.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    ergebnis.concat(linkesErgebnis);&lt;br /&gt;
    ergebnis.concat(rechtesErgebnis);&lt;br /&gt;
 &lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Berechnen==&lt;br /&gt;
[[File:Strukturbaum.jpg|thumb|Binärer Strukturbaum (12/4)+(2*3) |300px]]&lt;br /&gt;
Diese Methode berechnet das Ergebnis eines Strukturbaumes aus den Rechenzeichen +, -, *, / und Zahlen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public double berechnen(BinaryTree&amp;lt;String&amp;gt; b) {&lt;br /&gt;
    double ergebnis = 0;&lt;br /&gt;
    if (b.isEmpty()) {&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
    String wurzelString = b.getContent();&lt;br /&gt;
    if ( !wurzelString.equals(&amp;quot;+&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;-&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;*&amp;quot;) &amp;amp;&amp;amp;&lt;br /&gt;
         !wurzelString.equals(&amp;quot;/&amp;quot;) &lt;br /&gt;
       ) &lt;br /&gt;
    {&lt;br /&gt;
        double wurzelDouble = Double.parseDouble(wurzelString);&lt;br /&gt;
        ergebnis = wurzelDouble;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    double ergebnisLinks  = berechnen(b.getLeftTree());&lt;br /&gt;
    double ergebnisRechts = berechnen(b.getRightTree());&lt;br /&gt;
 &lt;br /&gt;
    if(wurzelString.equals(&amp;quot;+&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks + ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;-&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks - ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;*&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks * ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else if((wurzelString.equals(&amp;quot;/&amp;quot;)){&lt;br /&gt;
        ergebnis = ergebnisLinks / ergebnisRechts;&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        System.err.println(&amp;quot;unbekanntes Rechenzeichen!&amp;quot;);&lt;br /&gt;
        ergebnis = 0;&lt;br /&gt;
    }&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2828</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2828"/>
		<updated>2019-02-24T13:16:22Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* while-Schleife */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&amp;lt;br&amp;gt;&lt;br /&gt;
Hier gibt es ein '''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (auf youtube, 11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2827</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2827"/>
		<updated>2019-02-24T13:15:13Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* while-Schleife */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
Hier gibt es ein '''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (auf youtube, 11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2826</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2826"/>
		<updated>2019-02-24T13:14:21Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* while-Schleife */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
Hier gibt es ein '''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (auf youtube, 11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2825</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2825"/>
		<updated>2019-02-24T13:13:46Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* while-Schleife */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
Hier gibt es ein '''[https://www.youtube.com/watch?v=kPovFPak0Hs Erklärvideo zu while-Schleifen (auf youtube, 11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2824</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2824"/>
		<updated>2019-02-24T13:11:35Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2823</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2823"/>
		<updated>2019-02-24T13:10:19Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 11:49min)]''' &amp;lt;br/&amp;gt;'' (anhand eines Greenfoot-Szenarios)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2822</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2822"/>
		<updated>2019-02-24T12:51:19Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube, 17:08min)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2821</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2821"/>
		<updated>2019-02-24T12:50:12Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
'''Erklärvideo'''&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/YPVhVxL67xo Erklärvideo zu Methodensignaturen (auf youtube, 11:42min)]'''. &amp;lt;br/&amp;gt;'' (Man lernt, welche Informationen man an einer Methodensignatur ablesen kann.)&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2820</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2820"/>
		<updated>2019-02-24T12:47:32Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Allgemeines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2819</id>
		<title>Java Basis-Sprachelemente</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=2819"/>
		<updated>2019-02-24T12:47:10Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Methodendeklaration / Methodenkopf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
&lt;br /&gt;
=Allgemeines=&lt;br /&gt;
Hier werden die grundlegenden Sprachelemente von Java '''im Detail''' erklärt.&lt;br /&gt;
&lt;br /&gt;
Wer wissen möchte, wie eine '''ganze Klasse''' aussieht:&lt;br /&gt;
* [[Klasse]]&lt;br /&gt;
&lt;br /&gt;
= Anforderungen Zentralabitur =&lt;br /&gt;
Das Zentralabitur fordert die Kenntnis von bestimmten Basis-Sprachelementen, die hier aufgeführt sind.&lt;br /&gt;
&lt;br /&gt;
Im folgenden werden diese und weitere Basis-Sprachelemente erläutert.&lt;br /&gt;
&lt;br /&gt;
'''Stand: 2012 (im April 2013 noch aktuell)'''&lt;br /&gt;
&lt;br /&gt;
*  Klassendefinitionen&lt;br /&gt;
* Beziehungen zwischen Klassen&lt;br /&gt;
** gerichtetete Assoziation&lt;br /&gt;
** Vererbung&lt;br /&gt;
* Attribute und Methoden (mit Parametern und Rückgabewerten)&lt;br /&gt;
* Wertzuweisungen&lt;br /&gt;
* Verzweigungen (if, switch)&lt;br /&gt;
* Schleifen (while, for, do-while)&lt;br /&gt;
&lt;br /&gt;
=  Klasse, Objekt, Klassendefinition =&lt;br /&gt;
''Auf dieser Seite werden Klassen, Objekte etc. Schritt für Schritt erklärt.&lt;br /&gt;
&lt;br /&gt;
''Den erläuterten kompletten Quellcode einer Java-Klasse findet man hier: [[Klasse in Java]]''&lt;br /&gt;
&lt;br /&gt;
* Von einer '''Klasse''' können viele '''Objekte''' erzeugt werden.&lt;br /&gt;
* Beispiel: Es gibt eine Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;, von der man viele einzelne Objekte erzeugen kann.&lt;br /&gt;
* Java: Definiton einer Klasse:&lt;br /&gt;
&amp;lt;code&amp;gt; &lt;br /&gt;
  &amp;lt;u&amp;gt;public class Crab&amp;lt;/u&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute&lt;br /&gt;
          &lt;br /&gt;
     // Konstruktor&lt;br /&gt;
          &lt;br /&gt;
     // Methoden&lt;br /&gt;
  }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Attribute =&lt;br /&gt;
* Attribute beschreiben, welche Eigenschaften bzw. Teil-Objekte die Objekte einer Klasse haben.&lt;br /&gt;
* Jedes Attribut kann für jedes einzelne Objekt einer Klasseeinen anderen Wert, den &amp;lt;u&amp;gt;Attribut-Wert&amp;lt;/u&amp;gt; haben.&lt;br /&gt;
** Beispiel: Die eine Krabbe hat die Geschwindigkeit 5, die andere Krabbe hat die Geschwindigkeit 10.&lt;br /&gt;
* Attribute haben einen &amp;lt;u&amp;gt;Attribut-Typ&amp;lt;/u&amp;gt;. Für Geschwindigkeiten ist beispielsweise ein Zahltyp sinnvoll, etwa &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; für ganze Zahlen. Für Namen eignet sich &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Java:&lt;br /&gt;
** Attribute werden direkt nach der Klassen-Deklaration notiert.&lt;br /&gt;
** Attribute sind in der Regel &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;, d.h. sie können nicht ohne Weiteres von Außen verändert werden.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 1:'''&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt; können unterschiedliche Geschwindigkeiten haben.&lt;br /&gt;
&lt;br /&gt;
Dafür gibt es das Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Crab&lt;br /&gt;
 {&lt;br /&gt;
   // Attribute&lt;br /&gt;
   &amp;lt;u&amp;gt;private int geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
          &lt;br /&gt;
   // Konstruktor&lt;br /&gt;
    &lt;br /&gt;
   // Methoden&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel 2:'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; bestehen aus einen Quadrat (für den Stamm) und einem Kreis (für die Krone).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    &amp;lt;u&amp;gt;private Quadrat stamm;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;private Kreis krone;&amp;lt;/u&amp;gt;&lt;br /&gt;
         &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
       &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Konstruktor =&lt;br /&gt;
'''Aufruf des Konstruktors:'''&lt;br /&gt;
* Um ein neues Objekt einer Klasse zu erzeugen, ruft man den Konstruktor der Klasse auf, z.B.:&lt;br /&gt;
* Java: &amp;lt;code&amp;gt;Crab neueKrabbe = &amp;lt;u&amp;gt;new Crab()&amp;lt;/u&amp;gt;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Deklaration des Konstruktors:'''&lt;br /&gt;
* In der Deklaration des Konstruktors wird festgelegt, was passiert, wenn ein Objekt der Klasse erzeugt wird.&lt;br /&gt;
* Der Konstruktor heißt genauso wie die Klasse.&lt;br /&gt;
* Der Konstruktor hat '''keinen''' Rückgabetyp, also auch kein &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab()&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;turn(50);&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dadurch wird jede Krabbe bei der Erzeugung um 50 Grad gedreht.&lt;br /&gt;
&lt;br /&gt;
== Konstruktor mit Parameter ==&lt;br /&gt;
Man kann im Konstruktor einen Parameter übergeben, z.B. um direkt bei der Erzeugung die Eigenschaft eines Objektes festzulegen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    &amp;lt;u&amp;gt;public Crab(int pGeschwindigkeit)&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;geschwindigkeit = pGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    // Methoden&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dadurch muss man bei der Erzeugung der Krabbe die Geschwindigkeit festlegen.&lt;br /&gt;
&lt;br /&gt;
'''Aufgerufen''' wird dieser Konstruktor dann z.B. so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Crab neueKrabbe = new Crab(3);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Damit hat &amp;lt;code&amp;gt;neueKrabbe&amp;lt;/code&amp;gt; die Geschwindigkeit 3.&lt;br /&gt;
&lt;br /&gt;
= Methoden =&lt;br /&gt;
In Methoden wird festgelegt, was man mit einem Objekt der Klasse machen kann.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
Für ein Objekt der Klasse Krabbe soll die Geschwindigkeit festgelegt werden können. Außerdem soll man die Geschwindigkeit auslesen können.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Crab&lt;br /&gt;
  {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private int geschwindigkeit;   &lt;br /&gt;
     &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Crab()&lt;br /&gt;
    {&lt;br /&gt;
      turn(50);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    // Methoden&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public void setzeGeschwindigkeit(int neueGeschwindigkeit)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
       &amp;lt;u&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
      &lt;br /&gt;
    &amp;lt;u&amp;gt;'''public int gibGeschwindigkeit()'''&amp;lt;/u&amp;gt;   &lt;br /&gt;
    &amp;lt;u&amp;gt;{&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;return geschwindigkeit;&amp;lt;/u&amp;gt;&lt;br /&gt;
    &amp;lt;u&amp;gt;}&amp;lt;/u&amp;gt;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodendeklaration / Methodenkopf ==&lt;br /&gt;
Methoden werden durch den '''Methodenkopf (auch: die Methodensignatur)''' deklariert.&lt;br /&gt;
&lt;br /&gt;
D.h. für Objekte der Klasse kann man dann die Methode aufrufen.&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Automat  {&lt;br /&gt;
     private int eingeworfen;&lt;br /&gt;
 &lt;br /&gt;
     ...&lt;br /&gt;
    &lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public void geldEinwerfen(int betragInCent)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        eingeworfen = eingeworfen + betragInCent;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''private double steuern(int betrag)'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        double ergebnis = betrag * 0.19;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  &lt;br /&gt;
     &amp;lt;u&amp;gt;'''public int geldZurueck()'''&amp;lt;/u&amp;gt;&lt;br /&gt;
     {&lt;br /&gt;
        int ergebnis = eingeworfen;&lt;br /&gt;
        eingeworfen = 0;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der '''Methodenkopf''' ist immer gleich aufgebaut:&lt;br /&gt;
# '''Zugriffsmodifikator''': &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt;-Methoden darf man auch von außen zugreifen; sie sind '''öffentlich'''.&lt;br /&gt;
## Auf &amp;lt;code&amp;gt;private&amp;lt;/code&amp;gt;-Methoden darf nur die Klasse selbst zugreifen, d.h. von außen ist diese Methode nicht sichtbar! Das ist z.B. sinnvoll für Hilfsmethoden, die nicht jeder benutzen soll.&lt;br /&gt;
# '''Rückgabetyp''': &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt; für ''nichts'' bzw. ein Datentyp (wie z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) oder auch eine Klasse.&lt;br /&gt;
## Im Rückgabetyp wird festgelegt, ob und was die Methode zurückgibt. So sollten Methoden, die etwas berechnen, das Ergebnis auch zurückgeben.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; geldEinwerfen(int betragInCent)&amp;lt;/code&amp;gt; gibt ''nichts'' zurück. &amp;lt;code&amp;gt;'''void'''&amp;lt;/code&amp;gt; ist das Schlüsselwort für ''nichts''.&lt;br /&gt;
## Die Methode &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; summe(int a, int b) &amp;lt;/code&amp;gt; gibt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; zurück, d.h. eine ganze Zahl. Methoden, die etwas zurückgeben, brauchen am Ende der Methode ein '''return-Statement''', z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Methodenname''': Methodennamen sind Verben, denn Methoden bezeichnen Tätigkeiten! Außerdem ist es üblich, Methodennamen '''klein''' zu schreiben.&lt;br /&gt;
# '''Parameter''': In der Klammer nach dem Methodenname findet sich der (bzw. die Parameter).&lt;br /&gt;
## Bei den Parametern wird erst der '''Parameter-Typ''' (z.B. &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) und dann der '''Parameter-Name''' angegeben.&lt;br /&gt;
## Mehrere Parameter werden durch Komma getrennt, z.B. &amp;lt;code&amp;gt;public int summe(&amp;lt;u&amp;gt;int a, int b&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
## Methoden ohne Parameter haben leere Klammern, z.B.: &amp;lt;code&amp;gt;public int gelZurueck&amp;lt;u&amp;gt;()&amp;lt;/u&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Parameter ==&lt;br /&gt;
* Manche Methoden brauchen eine zusätzliche Information, um richtig arbeiten zu können.&lt;br /&gt;
* Das ist hier der Fall bei der Methode &amp;lt;code&amp;gt;setzeGeschwindigkeit&amp;lt;/code&amp;gt;: Damit sie sinnvoll arbeiten kann, muss man angeben können, wie groß die Geschwindigkeit sein soll.&lt;br /&gt;
* Dafür haben Methoden &amp;lt;u&amp;gt;Parameter&amp;lt;/u&amp;gt;, in diesem Fall &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Bei Parametern muss immer der Typ festgelegt werden; man spricht von &amp;lt;u&amp;gt;Parameter-Typ&amp;lt;/u&amp;gt;.&lt;br /&gt;
** Der Parameter-Typ von &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;, also eine ganze Zahl.&lt;br /&gt;
* Wenn eine Methode mit Parameter aufgerufen wird, dann muss man den &amp;lt;u&amp;gt;Parameter übergeben&amp;lt;/u&amp;gt;. &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
      Crab neueKrabbe = new Crab();&lt;br /&gt;
      // jetzt kommt der Methodenaufruf mit Parameterübergabe!&lt;br /&gt;
      neueKrabbe.setzeGeschwindigkeit(&amp;lt;u&amp;gt;10&amp;lt;/u&amp;gt;);&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* Bei Methoden ohne Parameter steht nach dem Methoden-Namen nur &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;. Das ist wichtig, um sie von Attribute zu unterscheiden!&lt;br /&gt;
&lt;br /&gt;
== Rückgabetyp einer Methode ==&lt;br /&gt;
Für eine Methode wird immer der Rückgabetyp festgelegt.&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode '''nichts''' zurückgibt (bei einer verändernden Methode).&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;void&amp;lt;/u&amp;gt; setzeGeschwindigkeit(int neueGeschwindigkeit)&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt;: Wenn die Methode eine ganze Zahl (&amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;) zurückgibt.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* Statt &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt; kann auch jeder andere Typ oder auch eine Klasse (z.B. &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) der Rückgabe-Typ einer Methode sein.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;Crab&amp;lt;/u&amp;gt; gibKopie()&amp;lt;/code&amp;gt; : Diese Methode würde eine Kopie der Krabbe (also ein Objekt der Klasse &amp;lt;code&amp;gt;Crab&amp;lt;/code&amp;gt;) zurückgeben.&lt;br /&gt;
&lt;br /&gt;
== sondierende Methode / verändernde Methode ==&lt;br /&gt;
* '''sondierende Methode (=get-Methode)''': Dieser Methodentyp ''gibt eine Information über das Objekt zurück''. Diese Methode braucht einen Rückgabetyp (d.h. nicht &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;) und ein return-Statement.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public &amp;lt;u&amp;gt;int&amp;lt;/u&amp;gt; gibGeschwindigkeit()&amp;lt;/code&amp;gt;&lt;br /&gt;
* '''verändernde Methode (=set-Methode)''': Dieser Methodentyp ''verändert das Objekt''. Häufig hat dieser Methodentyp einen (oder mehrere) '''Parameter'''. Sie hat zumeist den Rückgabetyp &amp;lt;code&amp;gt;void&amp;lt;/code&amp;gt;, denn sie gibt in der Regel nichts zurück.&lt;br /&gt;
** Beispiel: &amp;lt;code&amp;gt;public void setzeGeschwindigkeit(&amp;lt;u&amp;gt;int pGeschwindigkeit&amp;lt;/u&amp;gt;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Methodenaufruf ==&lt;br /&gt;
Methoden der gleichen Klasse werden durch ihren Methodennamen aufgerufen.&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Wenn man eine sondierende Methode aufruft, dann muss man sich für das Ergebnis interessieren!&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Im Beispiel ruft die Methode &amp;lt;code&amp;gt;groessteZahl&amp;lt;/code&amp;gt; dreimal die Methode &amp;lt;code&amp;gt;gibGroessereZahl&amp;lt;/code&amp;gt; auf. Das Ergebnis des Aufrufs wird jeweils in einer lokalen Variable (z.B. &amp;lt;code&amp;gt;groessere12&amp;lt;/code&amp;gt; gespeichert, um damit weiter zu rechnen.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Rechner{&lt;br /&gt;
    public int groessteZahl(int z1, int z2, int z3, int z4)&lt;br /&gt;
    {&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere12 = gibGroessereZahl(z1, z2);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int groessere34 = gibGroessereZahl(z3, z4);&amp;lt;/u&amp;gt;&lt;br /&gt;
        &amp;lt;u&amp;gt;int ergebnis = gibGroessereZahl(groessere12, groessere34);&amp;lt;/u&amp;gt;&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
    public int gibGroessereZahl(int a, int b){&lt;br /&gt;
       int ergebnis;&lt;br /&gt;
       if(a &amp;gt; b)&lt;br /&gt;
       {&lt;br /&gt;
          return a;&lt;br /&gt;
       }&lt;br /&gt;
       else&lt;br /&gt;
       {&lt;br /&gt;
          return b;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Methoden für Objekte anderer Klassen aufrufen ===&lt;br /&gt;
Man kann auf für ein Objekt einer anderen Klasse eine Methode aufrufen; damit wird eine Aufgabe '''delegiert'''.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel :'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
     // Attribute der Klasse Baum&lt;br /&gt;
     private Kreis krone;&lt;br /&gt;
     private Quadrat stamm;&lt;br /&gt;
&lt;br /&gt;
     // Konstruktor der Klasse Baum&lt;br /&gt;
     public Baum()&lt;br /&gt;
     {&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(110,120)''';&lt;br /&gt;
        '''stamm&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;bewegeZuPosition(100,100)''';&lt;br /&gt;
        '''krone&amp;lt;u&amp;gt;.&amp;lt;/u&amp;gt;sichtbarMachen()''';&lt;br /&gt;
     }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erklärung:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; ist ein Objekt vom Typ &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt;; deshalb verfügt &amp;lt;code&amp;gt;stamm&amp;lt;/code&amp;gt; über die Methode &amp;lt;code&amp;gt;sichtbarMachen()&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Im Konstruktor von &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; wird diese Methode mithilfe des Punktes aufgerufen:&lt;br /&gt;
** Attributname -&amp;gt; Punkt -&amp;gt; Methodenname.&lt;br /&gt;
*&lt;br /&gt;
Ein Objekt der Klasse &amp;lt;code&amp;gt;Haus&amp;lt;/code&amp;gt; ruft in einem Objekt der Klasse &amp;lt;code&amp;gt;Quadrat&amp;lt;/code&amp;gt; die Methode&lt;br /&gt;
&lt;br /&gt;
=lokale Variable=&lt;br /&gt;
* '''Lokale Variablen sind nur in dem Block gültig, in dem sie deklariert wurden.'''&lt;br /&gt;
* Lokale Variablen kann man (im Gegensatz zu Attributen) &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; in der ganzen Klasse benutzen. &lt;br /&gt;
* Man benutzt lokale Variablen, um Informationen zu speichern, die man nur kurzfristig braucht.&lt;br /&gt;
** U.a. werden lokale Variablen immer dann eingesetzt, wenn eine Methode ein Ergebnis berechnen und dann zurückgegeben soll.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel aus der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;:'''&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   public boolean hatGrueneBlaetter()&lt;br /&gt;
   {&lt;br /&gt;
      // &amp;lt;u&amp;gt;'''lokale Variable'''&amp;lt;/u&amp;gt;      &lt;br /&gt;
      // die lokale Variable ergebnis deklarieren&lt;br /&gt;
      // und mit true initialisieren&lt;br /&gt;
      // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
      '''&amp;lt;u&amp;gt;boolean ergebnis = true;&amp;lt;/u&amp;gt;'''&lt;br /&gt;
    &lt;br /&gt;
       if(istRot == true)&lt;br /&gt;
       {&lt;br /&gt;
           // wenn der Baum rot ist...&lt;br /&gt;
           // ... hat er keine gruenen Blaetter!&lt;br /&gt;
           ergebnis = false;&lt;br /&gt;
       }&lt;br /&gt;
       // return-Statement: der zurueckgegebene Wert muss den Typ haben&lt;br /&gt;
       // wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
       return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wertzuweisungen =&lt;br /&gt;
* Attributen und lokalen Variablen können Werte zugewiesen werden.&lt;br /&gt;
* Beispiel 1:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = 10;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert 10 zugewiesen.&lt;br /&gt;
* Beispiel 2:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = neueGeschwindigkeit;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;neueGeschwindigkeit&amp;lt;/code&amp;gt; zugewiesen.&lt;br /&gt;
* Beispiel 3:&lt;br /&gt;
** &amp;lt;code&amp;gt;geschwindigkeit = geschwindigkeit + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Damit wird dem Attribut &amp;lt;code&amp;gt;geschwindigkeit&amp;lt;/code&amp;gt; der Wert &amp;lt;code&amp;gt;geschwindigkeit+1&amp;lt;/code&amp;gt; zugewiesen,&lt;br /&gt;
** d.h. die Geschwindigkeit wird '''um 1 erhöht'''!&lt;br /&gt;
&lt;br /&gt;
* Allgemein:&lt;br /&gt;
** '''links vom Gleichzeichen''' steht das Attribut (bzw. die lokale Variable), der ein neuer Wert zugewiesen wird.&lt;br /&gt;
** '''rechts vom Gleichzeichen''' steht der neue Wert.&lt;br /&gt;
&lt;br /&gt;
= Verzweigungen (if, switch) =&lt;br /&gt;
== if - else ==&lt;br /&gt;
Beispiel: die folgende Methode überprüft, welche von zwei Zahlen die größere ist.&lt;br /&gt;
&lt;br /&gt;
Es passiert folgendes: Wenn (&amp;lt;code&amp;gt;if&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; größer als &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; ist, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; gesetzt, sonst (&amp;lt;code&amp;gt;else&amp;lt;/code&amp;gt;) auf &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public int bestimmeDieGroessere(int a, int b)&lt;br /&gt;
  {&lt;br /&gt;
     int ergebnis;&lt;br /&gt;
     '''if(a &amp;gt; b)'''&lt;br /&gt;
     {&lt;br /&gt;
        ergebnis = a;&lt;br /&gt;
     }&lt;br /&gt;
     '''else'''{&lt;br /&gt;
        ergebnis = b;&lt;br /&gt;
     }&lt;br /&gt;
     return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''VORSICHT:'''&lt;br /&gt;
Gleichheit überprüft man mit '''doppeltem''' Gleichzeichen:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   // Wenn x gleich drei ist, ...&lt;br /&gt;
   if(x '''==''' 3)&lt;br /&gt;
   {&lt;br /&gt;
      ...&lt;br /&gt;
   }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== switch ==&lt;br /&gt;
//TODO&lt;br /&gt;
&lt;br /&gt;
= Schleifen (while, for, do-while) =&lt;br /&gt;
Bei Schleifen kommen die Fähigkeiten der Computer besonders zur Geltung: Schleifen ermöglichen es, dass man Aktionen mehrfach (d.h. auch 1.000 oder 1.000.000 mal) wiederholt.&lt;br /&gt;
== for-Schleife ==&lt;br /&gt;
Die for-Schleife ist eine '''Zählschleife'''. Sie wird eingesetzt, wenn man zählen kann, wie oft Aktionen wiederholt werden sollen. Dafür gibt es eine '''Zählvariable''', die häufig &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; heißt, aber jeder andere Name ist auch denkbar.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende for-Schleife gibt die Zahlen 0, 3, 6, ...., 999 an die Konsole aus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  for(int i=0; i&amp;lt;=333; i++)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(3*i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt; hat drei Teile:&lt;br /&gt;
** ''Deklaration und Initialisierung der Zählvariable &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt;:'' i startet bei 0.&lt;br /&gt;
** ''Schleifenbedingung:'' Die Schleife wird so lange wiederholt, wie i &amp;lt;= 333 ist.&lt;br /&gt;
** ''Veränderung bei jedem Schleifendurchlauf:'' i wird bei jedem Schleifendurchlauf um eins erhöht. (&amp;lt;code&amp;gt;i++&amp;lt;/code&amp;gt; bedeutet dasselbe wie &amp;lt;code&amp;gt;i = i+1&amp;lt;/code&amp;gt;). D.h. i nimmt nacheinander folgende Werte an: 0, 1, 2, ..., 333.&lt;br /&gt;
** Im Schleifenrumpf wird mit &amp;lt;code&amp;gt;System.out.println(i);&amp;lt;/code&amp;gt; jeweils das Dreifache von &amp;lt;code&amp;gt;i&amp;lt;/code&amp;gt; an die Konsole ausgegeben, d.h.: 0, 3, 6, ..., 999.&lt;br /&gt;
&lt;br /&gt;
==while-Schleife==&lt;br /&gt;
Die while-Schleife ist eine '''bedingte'''Schleife. Sie wird eingesetzt, wenn Aktionen wiederholt werden sollen, solange die '''Schleifenbedingung''', erfüllt ist.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Die folgende while-Schleife beginnt bei &amp;lt;code&amp;gt;zahl = 1&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; wird dann so lange an die Konsole ausgegeben und verdoppelt, wie &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; kleiner als 1000 ist. D.h. die Ausgabe ist: 1, 2, 4, ..., 256, 512.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  int zahl = 1;&lt;br /&gt;
  while(zahl &amp;lt; 1000)&lt;br /&gt;
  {&lt;br /&gt;
     System.out.println(zahl);&lt;br /&gt;
     zahl = zahl * 2;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterung:'''&lt;br /&gt;
* Die Klammer nach dem &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt; enthält die Bedingung: Wiederhole, solange zahl kleiner 1000 ist.&lt;br /&gt;
* Im Schleifenrumpf wird dann &amp;lt;code&amp;gt;zahl&amp;lt;/code&amp;gt; an die Konsole ausgegeben und dann mit &amp;lt;code&amp;gt;zahl = zahl * 2;&amp;lt;/code&amp;gt; verdoppelt.&lt;br /&gt;
&lt;br /&gt;
= Beziehungen zwischen Klassen =&lt;br /&gt;
TODO&lt;br /&gt;
== gerichtetete Assoziation ==&lt;br /&gt;
TODO&lt;br /&gt;
== Vererbung ==&lt;br /&gt;
TODO&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2818</id>
		<title>Klasse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2818"/>
		<updated>2019-02-24T12:45:05Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Was ist eine Klasse? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
= Was ist eine Klasse? =&lt;br /&gt;
Eine Klasse stellt eine Vorlage (eine Art Bauplan) für Objekte dar, in denen festgelegt wird, welche Eigenschaften ([[Java_Basis-Sprachelemente#Attribute|Attribute]]) die Objekte haben sollen und was man mit den Objekten machen können soll ([[Java_Basis-Sprachelemente#Methoden|Methoden]]).&lt;br /&gt;
&lt;br /&gt;
Ausgehend von einer Anforderungsdefinition plant man eine Klasse. I.d.R. beginnt man, indem man ein [[Klassendiagramm]] zeichnet und das dann in Java umsetzt.&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein [[Medium:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Beispiel 1: Die Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;=&lt;br /&gt;
Hier werden beispielhaft das Klassendiagramm und der Quelltext der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Im Detail erläutert werden die einzelnen Sprachelemente hier: [[Java Basis-Sprachelemente]].&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! '''Baum'''&lt;br /&gt;
|-&lt;br /&gt;
| - stamm: Quadrat&lt;br /&gt;
&lt;br /&gt;
- krone: Kreis&lt;br /&gt;
&lt;br /&gt;
- istRot: boolean&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| + Baum()&lt;br /&gt;
&lt;br /&gt;
+ sichtbarMachen()&lt;br /&gt;
&lt;br /&gt;
+ horizontalBewegen(pDistanz: int)&lt;br /&gt;
&lt;br /&gt;
+ fruehling()&lt;br /&gt;
&lt;br /&gt;
+ herbst()&lt;br /&gt;
&lt;br /&gt;
+ hatGrueneBlaetter(): boolean&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quelltext der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Für Erläuterungen einfach auf die Links in den Kommentaren klicken!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  '''// Klassendeklaration'''&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Attribute|Attribute]]'''&lt;br /&gt;
    private Quadrat stamm;&lt;br /&gt;
    private Kreis krone;&lt;br /&gt;
    private boolean istRot;&lt;br /&gt;
   &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Konstruktor|Konstruktor]]'''&lt;br /&gt;
    public Baum()&lt;br /&gt;
    {&lt;br /&gt;
        '''// Aufruf eines Konstruktors: Schluesselwort new'''&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
   &lt;br /&gt;
        '''// Aufruf einer Methode fuer ein anderes Objekt.'''&lt;br /&gt;
        '''// Attributname -&amp;gt; Punkt -&amp;gt; Methodenname&lt;br /&gt;
        '''// Es wird ein Parameter uebergeben (30)'''&lt;br /&gt;
        stamm.groesseAendern(30);&lt;br /&gt;
     &lt;br /&gt;
        '''// hier werden zwei Parameter uebergeben; getrennt durch Kommas.'''&lt;br /&gt;
        stamm.bewegeZuPosition(30,60);&lt;br /&gt;
    &lt;br /&gt;
        '''// hier wird ein String als Parameter uebergeben: &amp;quot;schwarz&amp;quot;'''&lt;br /&gt;
        stamm.farbeAendern(&amp;quot;schwarz&amp;quot;);&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        krone.bewegeZuPosition(20,20);&lt;br /&gt;
        krone.groesseAendern(50);&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    &lt;br /&gt;
        '''//Aufruf einer Methode der Klasse Baum'''&lt;br /&gt;
        sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Methoden|Methoden]]'''&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void sichtbarMachen()&lt;br /&gt;
    {&lt;br /&gt;
        stamm.sichtbarMachen();&lt;br /&gt;
        krone.sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''//Methode mit einem Parameter: (Parametertyp Parametername)'''&lt;br /&gt;
    public void horizontalBewegen(int distanz)&lt;br /&gt;
    {&lt;br /&gt;
        '''//der Parameter wird weiterverwendet'''&lt;br /&gt;
        stamm.horizontalBewegen(distanz);&lt;br /&gt;
        krone.horizontalBewegen(distanz);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void herbst()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;rot&amp;quot;);&lt;br /&gt;
        istRot = true;&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void fruehling()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    '''//Methode mit einem Rueckgabetyp: boolean'''&lt;br /&gt;
    public boolean hatGrueneBlaetter()&lt;br /&gt;
    {&lt;br /&gt;
       '''// [[Java_Basis-Sprachelemente#lokale_Variable|lokale Variable]]'''      &lt;br /&gt;
       // die lokale Variable ergebnis deklarieren&lt;br /&gt;
       // und mit true initialisieren&lt;br /&gt;
       // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
       boolean ergebnis = true;&lt;br /&gt;
     &lt;br /&gt;
        if(istRot == true)&lt;br /&gt;
        {&lt;br /&gt;
            // wenn der Baum rot ist...&lt;br /&gt;
            // ... hat er keine gruenen Blaetter!&lt;br /&gt;
            ergebnis = false;&lt;br /&gt;
        }&lt;br /&gt;
        // '''return-Statement: der zurueckgegebene Wert muss den Typ haben'''&lt;br /&gt;
        // '''wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiel 2: Die Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;=&lt;br /&gt;
== Anforderungsbeschreibung einer Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Ein paar Oberstufenschüler planen, ein asoziales Netzwerk zu gründen. Die Nutzer des Netzwerkes sollen durch eine Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; realisiert werden. Zu jedem Nutzer sollen folgende Informationen gespeichert werden:&lt;br /&gt;
* Nachname und Vorname des Nutzers&lt;br /&gt;
* Alter des Nutzers&lt;br /&gt;
* ob der Nutzer Brillenträger ist&lt;br /&gt;
* der andere Nutzer des Netzwerks, auf dessen Profil der Nutzer am häufigsten geklickt hat&lt;br /&gt;
&lt;br /&gt;
Außerdem sollen folgende Aktionen auf &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objekte angewendet werden können:&lt;br /&gt;
* man soll den Vornamen und Nachnamen eines &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objektes auslesen können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|get-Methode]])&lt;br /&gt;
* man soll das Alter eines Nutzers eintragen bzw. ändern können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|set-Methode]])&lt;br /&gt;
* falls ein Benutzer nun Brillenträger ist, soll man den entsprechenden Attributwert ändern können&lt;br /&gt;
* falls ein Benutzer einen neuen Lieblingsnutzer hat, soll dieser eingetragen werden können&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Im Klassendiagramm wurden aus Platzgründen nur Teile der sinnvollen Methoden aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| - nachname: String&lt;br /&gt;
&lt;br /&gt;
- vorname: String&lt;br /&gt;
&lt;br /&gt;
- alter: int&lt;br /&gt;
&lt;br /&gt;
- brillentraeger: boolean&lt;br /&gt;
&lt;br /&gt;
- lieblingsnutzer: Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| + Benutzer(pNachname: String, pVorname: String, pAlter: int)&lt;br /&gt;
&lt;br /&gt;
+ getNachname(): String&lt;br /&gt;
&lt;br /&gt;
+ getVorname(): String&lt;br /&gt;
&lt;br /&gt;
+ traegtNunBrille()&lt;br /&gt;
&lt;br /&gt;
+ setLieblingsNutzer(pNeuerLiebling: Benutzer)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umsetzung der Klasse in Java ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Benutzer&lt;br /&gt;
 {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private String nachname;&lt;br /&gt;
    private String vorname;&lt;br /&gt;
    private int alter;&lt;br /&gt;
    private boolean brillentraeger;&lt;br /&gt;
    private Benutzer lieblingsnutzer;&lt;br /&gt;
 &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Benutzer(String pNachname, String pVorname, int pAlter)&lt;br /&gt;
    {&lt;br /&gt;
       nachname = pNachname;&lt;br /&gt;
       vorname = pVorname;&lt;br /&gt;
       alter = pAlter;&lt;br /&gt;
       brillentraeger = false;&lt;br /&gt;
       lieblingsnutzer = null;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // weitere Methoden&lt;br /&gt;
    public String getNachname()&lt;br /&gt;
    {&lt;br /&gt;
       return nachname;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getVorname()&lt;br /&gt;
    {&lt;br /&gt;
       return vorname;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void traegtNunBrille()&lt;br /&gt;
    {&lt;br /&gt;
       brillentraeger = true;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void setLieblingsNuetzer(Benutzer pNeuerLiebling)&lt;br /&gt;
    {&lt;br /&gt;
       lieblingsnutzer = pNeuerLiebling;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:VAB-01_Informatik10_KlassenObjekteAttributeMethoden.pdf&amp;diff=2817</id>
		<title>Datei:VAB-01 Informatik10 KlassenObjekteAttributeMethoden.pdf</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:VAB-01_Informatik10_KlassenObjekteAttributeMethoden.pdf&amp;diff=2817"/>
		<updated>2019-02-24T12:43:45Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2816</id>
		<title>Klasse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2816"/>
		<updated>2019-02-24T12:38:16Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
= Was ist eine Klasse? =&lt;br /&gt;
Eine Klasse stellt eine Vorlage (eine Art Bauplan) für Objekte dar, in denen festgelegt wird, welche Eigenschaften ([[Java_Basis-Sprachelemente#Attribute|Attribute]]) die Objekte haben sollen und was man mit den Objekten machen können soll ([[Java_Basis-Sprachelemente#Methoden|Methoden]]).&lt;br /&gt;
&lt;br /&gt;
Ausgehend von einer Anforderungsdefinition plant man eine Klasse. I.d.R. beginnt man, indem man ein [[Klassendiagramm]] zeichnet und das dann in Java umsetzt.&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;'' (Objekt- und Klassendiagramme kommen auch vor.)&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein * [[Medium:Dokumentation_List_Abi2017.pdf|Arbeitsblatt zum Video (PDF)]]. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
&lt;br /&gt;
= Beispiel 1: Die Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;=&lt;br /&gt;
Hier werden beispielhaft das Klassendiagramm und der Quelltext der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Im Detail erläutert werden die einzelnen Sprachelemente hier: [[Java Basis-Sprachelemente]].&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! '''Baum'''&lt;br /&gt;
|-&lt;br /&gt;
| - stamm: Quadrat&lt;br /&gt;
&lt;br /&gt;
- krone: Kreis&lt;br /&gt;
&lt;br /&gt;
- istRot: boolean&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| + Baum()&lt;br /&gt;
&lt;br /&gt;
+ sichtbarMachen()&lt;br /&gt;
&lt;br /&gt;
+ horizontalBewegen(pDistanz: int)&lt;br /&gt;
&lt;br /&gt;
+ fruehling()&lt;br /&gt;
&lt;br /&gt;
+ herbst()&lt;br /&gt;
&lt;br /&gt;
+ hatGrueneBlaetter(): boolean&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quelltext der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Für Erläuterungen einfach auf die Links in den Kommentaren klicken!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  '''// Klassendeklaration'''&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Attribute|Attribute]]'''&lt;br /&gt;
    private Quadrat stamm;&lt;br /&gt;
    private Kreis krone;&lt;br /&gt;
    private boolean istRot;&lt;br /&gt;
   &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Konstruktor|Konstruktor]]'''&lt;br /&gt;
    public Baum()&lt;br /&gt;
    {&lt;br /&gt;
        '''// Aufruf eines Konstruktors: Schluesselwort new'''&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
   &lt;br /&gt;
        '''// Aufruf einer Methode fuer ein anderes Objekt.'''&lt;br /&gt;
        '''// Attributname -&amp;gt; Punkt -&amp;gt; Methodenname&lt;br /&gt;
        '''// Es wird ein Parameter uebergeben (30)'''&lt;br /&gt;
        stamm.groesseAendern(30);&lt;br /&gt;
     &lt;br /&gt;
        '''// hier werden zwei Parameter uebergeben; getrennt durch Kommas.'''&lt;br /&gt;
        stamm.bewegeZuPosition(30,60);&lt;br /&gt;
    &lt;br /&gt;
        '''// hier wird ein String als Parameter uebergeben: &amp;quot;schwarz&amp;quot;'''&lt;br /&gt;
        stamm.farbeAendern(&amp;quot;schwarz&amp;quot;);&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        krone.bewegeZuPosition(20,20);&lt;br /&gt;
        krone.groesseAendern(50);&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    &lt;br /&gt;
        '''//Aufruf einer Methode der Klasse Baum'''&lt;br /&gt;
        sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Methoden|Methoden]]'''&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void sichtbarMachen()&lt;br /&gt;
    {&lt;br /&gt;
        stamm.sichtbarMachen();&lt;br /&gt;
        krone.sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''//Methode mit einem Parameter: (Parametertyp Parametername)'''&lt;br /&gt;
    public void horizontalBewegen(int distanz)&lt;br /&gt;
    {&lt;br /&gt;
        '''//der Parameter wird weiterverwendet'''&lt;br /&gt;
        stamm.horizontalBewegen(distanz);&lt;br /&gt;
        krone.horizontalBewegen(distanz);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void herbst()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;rot&amp;quot;);&lt;br /&gt;
        istRot = true;&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void fruehling()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    '''//Methode mit einem Rueckgabetyp: boolean'''&lt;br /&gt;
    public boolean hatGrueneBlaetter()&lt;br /&gt;
    {&lt;br /&gt;
       '''// [[Java_Basis-Sprachelemente#lokale_Variable|lokale Variable]]'''      &lt;br /&gt;
       // die lokale Variable ergebnis deklarieren&lt;br /&gt;
       // und mit true initialisieren&lt;br /&gt;
       // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
       boolean ergebnis = true;&lt;br /&gt;
     &lt;br /&gt;
        if(istRot == true)&lt;br /&gt;
        {&lt;br /&gt;
            // wenn der Baum rot ist...&lt;br /&gt;
            // ... hat er keine gruenen Blaetter!&lt;br /&gt;
            ergebnis = false;&lt;br /&gt;
        }&lt;br /&gt;
        // '''return-Statement: der zurueckgegebene Wert muss den Typ haben'''&lt;br /&gt;
        // '''wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiel 2: Die Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;=&lt;br /&gt;
== Anforderungsbeschreibung einer Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Ein paar Oberstufenschüler planen, ein asoziales Netzwerk zu gründen. Die Nutzer des Netzwerkes sollen durch eine Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; realisiert werden. Zu jedem Nutzer sollen folgende Informationen gespeichert werden:&lt;br /&gt;
* Nachname und Vorname des Nutzers&lt;br /&gt;
* Alter des Nutzers&lt;br /&gt;
* ob der Nutzer Brillenträger ist&lt;br /&gt;
* der andere Nutzer des Netzwerks, auf dessen Profil der Nutzer am häufigsten geklickt hat&lt;br /&gt;
&lt;br /&gt;
Außerdem sollen folgende Aktionen auf &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objekte angewendet werden können:&lt;br /&gt;
* man soll den Vornamen und Nachnamen eines &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objektes auslesen können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|get-Methode]])&lt;br /&gt;
* man soll das Alter eines Nutzers eintragen bzw. ändern können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|set-Methode]])&lt;br /&gt;
* falls ein Benutzer nun Brillenträger ist, soll man den entsprechenden Attributwert ändern können&lt;br /&gt;
* falls ein Benutzer einen neuen Lieblingsnutzer hat, soll dieser eingetragen werden können&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Im Klassendiagramm wurden aus Platzgründen nur Teile der sinnvollen Methoden aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| - nachname: String&lt;br /&gt;
&lt;br /&gt;
- vorname: String&lt;br /&gt;
&lt;br /&gt;
- alter: int&lt;br /&gt;
&lt;br /&gt;
- brillentraeger: boolean&lt;br /&gt;
&lt;br /&gt;
- lieblingsnutzer: Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| + Benutzer(pNachname: String, pVorname: String, pAlter: int)&lt;br /&gt;
&lt;br /&gt;
+ getNachname(): String&lt;br /&gt;
&lt;br /&gt;
+ getVorname(): String&lt;br /&gt;
&lt;br /&gt;
+ traegtNunBrille()&lt;br /&gt;
&lt;br /&gt;
+ setLieblingsNutzer(pNeuerLiebling: Benutzer)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umsetzung der Klasse in Java ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Benutzer&lt;br /&gt;
 {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private String nachname;&lt;br /&gt;
    private String vorname;&lt;br /&gt;
    private int alter;&lt;br /&gt;
    private boolean brillentraeger;&lt;br /&gt;
    private Benutzer lieblingsnutzer;&lt;br /&gt;
 &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Benutzer(String pNachname, String pVorname, int pAlter)&lt;br /&gt;
    {&lt;br /&gt;
       nachname = pNachname;&lt;br /&gt;
       vorname = pVorname;&lt;br /&gt;
       alter = pAlter;&lt;br /&gt;
       brillentraeger = false;&lt;br /&gt;
       lieblingsnutzer = null;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // weitere Methoden&lt;br /&gt;
    public String getNachname()&lt;br /&gt;
    {&lt;br /&gt;
       return nachname;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getVorname()&lt;br /&gt;
    {&lt;br /&gt;
       return vorname;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void traegtNunBrille()&lt;br /&gt;
    {&lt;br /&gt;
       brillentraeger = true;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void setLieblingsNuetzer(Benutzer pNeuerLiebling)&lt;br /&gt;
    {&lt;br /&gt;
       lieblingsnutzer = pNeuerLiebling;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2815</id>
		<title>Klasse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Klasse&amp;diff=2815"/>
		<updated>2019-02-24T12:36:27Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
= Was ist eine Klasse? =&lt;br /&gt;
Eine Klasse stellt eine Vorlage (eine Art Bauplan) für Objekte dar, in denen festgelegt wird, welche Eigenschaften ([[Java_Basis-Sprachelemente#Attribute|Attribute]]) die Objekte haben sollen und was man mit den Objekten machen können soll ([[Java_Basis-Sprachelemente#Methoden|Methoden]]).&lt;br /&gt;
&lt;br /&gt;
Ausgehend von einer Anforderungsdefinition plant man eine Klasse. I.d.R. beginnt man, indem man ein [[Klassendiagramm]] zeichnet und das dann in Java umsetzt.&lt;br /&gt;
&lt;br /&gt;
==Erklärvideo==&lt;br /&gt;
&lt;br /&gt;
Hier gibt es ein '''[https://youtu.be/JVeAUGX60-A Erklärvideo zu Klassen, Objekten, Attritbuten &amp;amp; Methoden (auf youtube)]'''. &amp;lt;br/&amp;gt;''. (Objekt- und Klassendiagramme kommen auch vor).&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es hier ein Arbeitsblatt zum Video. Zu Teilen der Aufgaben gibt es die Lösung im Video, die anderen Aufgaben werden erst im Unterricht besprochen.&lt;br /&gt;
= Beispiel 1: Die Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;=&lt;br /&gt;
Hier werden beispielhaft das Klassendiagramm und der Quelltext der Klasse &amp;lt;code&amp;gt;Baum&amp;lt;/code&amp;gt; dokumentiert.&lt;br /&gt;
&lt;br /&gt;
Im Detail erläutert werden die einzelnen Sprachelemente hier: [[Java Basis-Sprachelemente]].&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! '''Baum'''&lt;br /&gt;
|-&lt;br /&gt;
| - stamm: Quadrat&lt;br /&gt;
&lt;br /&gt;
- krone: Kreis&lt;br /&gt;
&lt;br /&gt;
- istRot: boolean&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| + Baum()&lt;br /&gt;
&lt;br /&gt;
+ sichtbarMachen()&lt;br /&gt;
&lt;br /&gt;
+ horizontalBewegen(pDistanz: int)&lt;br /&gt;
&lt;br /&gt;
+ fruehling()&lt;br /&gt;
&lt;br /&gt;
+ herbst()&lt;br /&gt;
&lt;br /&gt;
+ hatGrueneBlaetter(): boolean&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Quelltext der Klasse &amp;lt;code&amp;gt;Baum.java&amp;lt;/code&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
Für Erläuterungen einfach auf die Links in den Kommentaren klicken!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  '''// Klassendeklaration'''&lt;br /&gt;
  public class Baum&lt;br /&gt;
  {&lt;br /&gt;
  &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Attribute|Attribute]]'''&lt;br /&gt;
    private Quadrat stamm;&lt;br /&gt;
    private Kreis krone;&lt;br /&gt;
    private boolean istRot;&lt;br /&gt;
   &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Konstruktor|Konstruktor]]'''&lt;br /&gt;
    public Baum()&lt;br /&gt;
    {&lt;br /&gt;
        '''// Aufruf eines Konstruktors: Schluesselwort new'''&lt;br /&gt;
        stamm = new Quadrat();&lt;br /&gt;
   &lt;br /&gt;
        '''// Aufruf einer Methode fuer ein anderes Objekt.'''&lt;br /&gt;
        '''// Attributname -&amp;gt; Punkt -&amp;gt; Methodenname&lt;br /&gt;
        '''// Es wird ein Parameter uebergeben (30)'''&lt;br /&gt;
        stamm.groesseAendern(30);&lt;br /&gt;
     &lt;br /&gt;
        '''// hier werden zwei Parameter uebergeben; getrennt durch Kommas.'''&lt;br /&gt;
        stamm.bewegeZuPosition(30,60);&lt;br /&gt;
    &lt;br /&gt;
        '''// hier wird ein String als Parameter uebergeben: &amp;quot;schwarz&amp;quot;'''&lt;br /&gt;
        stamm.farbeAendern(&amp;quot;schwarz&amp;quot;);&lt;br /&gt;
        krone = new Kreis();&lt;br /&gt;
        krone.bewegeZuPosition(20,20);&lt;br /&gt;
        krone.groesseAendern(50);&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    &lt;br /&gt;
        '''//Aufruf einer Methode der Klasse Baum'''&lt;br /&gt;
        sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''// [[Java_Basis-Sprachelemente#Methoden|Methoden]]'''&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void sichtbarMachen()&lt;br /&gt;
    {&lt;br /&gt;
        stamm.sichtbarMachen();&lt;br /&gt;
        krone.sichtbarMachen();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''//Methode mit einem Parameter: (Parametertyp Parametername)'''&lt;br /&gt;
    public void horizontalBewegen(int distanz)&lt;br /&gt;
    {&lt;br /&gt;
        '''//der Parameter wird weiterverwendet'''&lt;br /&gt;
        stamm.horizontalBewegen(distanz);&lt;br /&gt;
        krone.horizontalBewegen(distanz);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void herbst()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;rot&amp;quot;);&lt;br /&gt;
        istRot = true;&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    '''// Methode OHNE Rueckgabe und OHNE Parameter: Schluesselwort void, leere Klammern ()'''&lt;br /&gt;
    public void fruehling()&lt;br /&gt;
    {&lt;br /&gt;
        krone.farbeAendern(&amp;quot;gruen&amp;quot;);&lt;br /&gt;
        istRot = false;&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    '''//Methode mit einem Rueckgabetyp: boolean'''&lt;br /&gt;
    public boolean hatGrueneBlaetter()&lt;br /&gt;
    {&lt;br /&gt;
       '''// [[Java_Basis-Sprachelemente#lokale_Variable|lokale Variable]]'''      &lt;br /&gt;
       // die lokale Variable ergebnis deklarieren&lt;br /&gt;
       // und mit true initialisieren&lt;br /&gt;
       // ergebnis wird am Ende zurueckgegeben!&lt;br /&gt;
       boolean ergebnis = true;&lt;br /&gt;
     &lt;br /&gt;
        if(istRot == true)&lt;br /&gt;
        {&lt;br /&gt;
            // wenn der Baum rot ist...&lt;br /&gt;
            // ... hat er keine gruenen Blaetter!&lt;br /&gt;
            ergebnis = false;&lt;br /&gt;
        }&lt;br /&gt;
        // '''return-Statement: der zurueckgegebene Wert muss den Typ haben'''&lt;br /&gt;
        // '''wie im Methodenkopf angegeben. (Hier: boolean)&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispiel 2: Die Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;=&lt;br /&gt;
== Anforderungsbeschreibung einer Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Ein paar Oberstufenschüler planen, ein asoziales Netzwerk zu gründen. Die Nutzer des Netzwerkes sollen durch eine Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; realisiert werden. Zu jedem Nutzer sollen folgende Informationen gespeichert werden:&lt;br /&gt;
* Nachname und Vorname des Nutzers&lt;br /&gt;
* Alter des Nutzers&lt;br /&gt;
* ob der Nutzer Brillenträger ist&lt;br /&gt;
* der andere Nutzer des Netzwerks, auf dessen Profil der Nutzer am häufigsten geklickt hat&lt;br /&gt;
&lt;br /&gt;
Außerdem sollen folgende Aktionen auf &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objekte angewendet werden können:&lt;br /&gt;
* man soll den Vornamen und Nachnamen eines &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt;-Objektes auslesen können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|get-Methode]])&lt;br /&gt;
* man soll das Alter eines Nutzers eintragen bzw. ändern können (-&amp;gt; [[Java_Basis-Sprachelemente#sondierende_Methode / verändernde_Methode|set-Methode]])&lt;br /&gt;
* falls ein Benutzer nun Brillenträger ist, soll man den entsprechenden Attributwert ändern können&lt;br /&gt;
* falls ein Benutzer einen neuen Lieblingsnutzer hat, soll dieser eingetragen werden können&lt;br /&gt;
&lt;br /&gt;
== Klassendiagramm der Klasse &amp;lt;code&amp;gt;Benutzer&amp;lt;/code&amp;gt; ==&lt;br /&gt;
Im Klassendiagramm wurden aus Platzgründen nur Teile der sinnvollen Methoden aufgeführt.&lt;br /&gt;
&lt;br /&gt;
Detaillierte Erläuterungen zu Klassendiagrammen findet man [[Klassen- und Implementationsdiagramm|hier]].&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| - nachname: String&lt;br /&gt;
&lt;br /&gt;
- vorname: String&lt;br /&gt;
&lt;br /&gt;
- alter: int&lt;br /&gt;
&lt;br /&gt;
- brillentraeger: boolean&lt;br /&gt;
&lt;br /&gt;
- lieblingsnutzer: Benutzer&lt;br /&gt;
|-&lt;br /&gt;
| + Benutzer(pNachname: String, pVorname: String, pAlter: int)&lt;br /&gt;
&lt;br /&gt;
+ getNachname(): String&lt;br /&gt;
&lt;br /&gt;
+ getVorname(): String&lt;br /&gt;
&lt;br /&gt;
+ traegtNunBrille()&lt;br /&gt;
&lt;br /&gt;
+ setLieblingsNutzer(pNeuerLiebling: Benutzer)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Umsetzung der Klasse in Java ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Benutzer&lt;br /&gt;
 {&lt;br /&gt;
    // Attribute&lt;br /&gt;
    private String nachname;&lt;br /&gt;
    private String vorname;&lt;br /&gt;
    private int alter;&lt;br /&gt;
    private boolean brillentraeger;&lt;br /&gt;
    private Benutzer lieblingsnutzer;&lt;br /&gt;
 &lt;br /&gt;
    // Konstruktor&lt;br /&gt;
    public Benutzer(String pNachname, String pVorname, int pAlter)&lt;br /&gt;
    {&lt;br /&gt;
       nachname = pNachname;&lt;br /&gt;
       vorname = pVorname;&lt;br /&gt;
       alter = pAlter;&lt;br /&gt;
       brillentraeger = false;&lt;br /&gt;
       lieblingsnutzer = null;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // weitere Methoden&lt;br /&gt;
    public String getNachname()&lt;br /&gt;
    {&lt;br /&gt;
       return nachname;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public String getVorname()&lt;br /&gt;
    {&lt;br /&gt;
       return vorname;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void traegtNunBrille()&lt;br /&gt;
    {&lt;br /&gt;
       brillentraeger = true;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void setLieblingsNuetzer(Benutzer pNeuerLiebling)&lt;br /&gt;
    {&lt;br /&gt;
       lieblingsnutzer = pNeuerLiebling;&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2669</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2669"/>
		<updated>2018-03-16T17:07:09Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* ausführliches Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&amp;lt;!-- {{#ev:youtube|ZJXtvCF7XrQ}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=ZJXtvCF7XrQ}}&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2668</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2668"/>
		<updated>2018-03-16T17:06:15Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&amp;lt;--! {{#ev:youtube|ZJXtvCF7XrQ}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=ZJXtvCF7XrQ}}&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2667</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2667"/>
		<updated>2018-03-16T17:05:35Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&amp;lt;media&lt;br /&gt;
&amp;lt;--! {{#ev:youtube|ZJXtvCF7XrQ}} --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|https://www.youtube.com/watch?v=ZJXtvCF7XrQ}}&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Regul%C3%A4re_Grammatik&amp;diff=2485</id>
		<title>Reguläre Grammatik</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Regul%C3%A4re_Grammatik&amp;diff=2485"/>
		<updated>2017-05-08T17:26:44Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Definition */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:endliche Automaten]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
Eine '''Grammatik''' G wird durch ein 4-Tupel (N, T, S, P) definiert:&lt;br /&gt;
* N ist die Menge der '''Nichtterminalsymbole'''.&lt;br /&gt;
* T ist die Menge der '''Terminalsymbole'''.&lt;br /&gt;
* S &amp;amp;isin; N ist das '''Startsymbol'''.&lt;br /&gt;
* P ist die Menge der '''Produktionsregeln'''.&lt;br /&gt;
&lt;br /&gt;
'''reguläre''' Grammatik: Grammatiken, bei denen &amp;lt;u&amp;gt;alle&amp;lt;/u&amp;gt; Produktionen die folgenden Formen haben, sind regulär:&lt;br /&gt;
* A &amp;amp;rarr; aB &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  ''d.h. Nichtterminalsymbol wird ersetzt durch ein Terminalsymbol gefolgt von einem Nichtterminalsymbol'''&lt;br /&gt;
* A &amp;amp;rarr; a &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  ''d.h. Nichtterminalsymbol wird ersetzt durch ein Terminalsymbol.''&lt;br /&gt;
* A &amp;amp;rarr; &amp;amp;epsilon; &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;  ''d.h. Nichtterminalsymbol wird ersetzt durch nichts. (&amp;amp;epsilon; steht für nichts.)''&lt;br /&gt;
&lt;br /&gt;
=Beispiele=&lt;br /&gt;
&lt;br /&gt;
==KGB-Sprache==&lt;br /&gt;
&lt;br /&gt;
Die KGB-Sprache besteht aus allen Ziffernfolgen, die irgendwo die Zahlenkette &amp;quot;007&amp;quot; enhalten. &lt;br /&gt;
&lt;br /&gt;
Die Grammatik G der KGB-Sprache kann wie folgt definiert werden:&lt;br /&gt;
&lt;br /&gt;
* G= (N, T, S, P)&lt;br /&gt;
* '''Nichtterminalsymbole''' N = {S, A, B, C}&lt;br /&gt;
* '''Terminalsymbole''' T = {0,...,9}&lt;br /&gt;
* '''Startsymbol''' S = S&lt;br /&gt;
* '''Produktionsregeln P = {'''&lt;br /&gt;
** S &amp;amp;rarr; 0A | 0S | 1S | 2S | ... | 9S&lt;br /&gt;
** A &amp;amp;rarr; 0B&lt;br /&gt;
** B &amp;amp;rarr; 7C &lt;br /&gt;
** C &amp;amp;rarr; &amp;amp;epsilon; | 0C | ... | 9C&lt;br /&gt;
* '''}'''&lt;br /&gt;
&lt;br /&gt;
===Beispiel für die Ableitung eines Wortes===&lt;br /&gt;
Dass das Wort &amp;quot;060074&amp;quot; zu der KGB-Sprache gehört, lässt sich durch folgende Ableitung zeigen:&lt;br /&gt;
* S &amp;amp;rarr; 0S &amp;amp;rarr; 06S &amp;amp;rarr; 060A &amp;amp;rarr; 0600B &amp;amp;rarr; 06007C &amp;amp;rarr; 06007&lt;br /&gt;
Bei der letzten Ableitung wurde das C durch nichts (&amp;amp;epsilon;) ersetzt.&lt;br /&gt;
&lt;br /&gt;
==Beispiel für eine nicht-reguläre Grammatik==&lt;br /&gt;
Die folgende Grammatik für den KGB-Automaten ist &amp;lt;u&amp;gt;nicht&amp;lt;/u&amp;gt; regulär:&lt;br /&gt;
&lt;br /&gt;
* G= (N, T, S, P)&lt;br /&gt;
* '''Nichtterminalsymbole''' N = {S, A}&lt;br /&gt;
* '''Terminalsymbole''' T = {0,...,9}&lt;br /&gt;
* '''Startsymbol''' S = S&lt;br /&gt;
* '''Produktionsregeln P = {'''&lt;br /&gt;
** S &amp;amp;rarr; &amp;lt;u&amp;gt;007A&amp;lt;/u&amp;gt; | 0S | 1S | 2S | ... | 9S&lt;br /&gt;
** A &amp;amp;rarr; &amp;amp;epsilon; | 0A | ... | 9A&lt;br /&gt;
* '''}'''&lt;br /&gt;
&lt;br /&gt;
Die unterstrichene Regel verstößt gegen die Anforderungen, denn vor dem Nicht-Terminalsymbol sind drei Terminalsymbole!&lt;br /&gt;
&lt;br /&gt;
''Hinweis:''&lt;br /&gt;
&lt;br /&gt;
''Diese nicht-reguläre Grammatik lässt sich in eine reguläre Grammatik überführen.''&lt;br /&gt;
&lt;br /&gt;
''Das gilt aber nicht für jede nicht-reguläre Grammatik!''&lt;br /&gt;
&lt;br /&gt;
=Beziehung zu deterministischen endlichen Automaten=&lt;br /&gt;
* '''Zu jeder [[reguläre Grammatik|regulären Grammatik]] gibt es einen deterministischen endlichen Automaten.'''&amp;lt;br&amp;gt; &lt;br /&gt;
** Dazu erstellt man aus der regulären Grammatik erst einen [[Nicht-deterministischer endlicher Automaten|Nicht-deterministischen endlichen Automaten]], indem man aus jedem Nichtterminalsymbol einen Zustand macht und aus jeder Produktionsregel einen Übergang.&lt;br /&gt;
** Aus dem [[Nicht-deterministischer endlicher Automaten|Nicht-deterministischen endlichen Automaten]] kann man einen deterministischen endlichen Automaten erstellen. Das ist mühsam, aber es ist bewiesen, dass das immer geht!&lt;br /&gt;
* '''Zu jedem deterministischen endlichen Automaten gibt es eine [[reguläre Grammatik]].'''&lt;br /&gt;
** Diese lässt sich leicht aus dem Übergangsgraphen konstruieren, indem man aus jedem Zustand ein Nichtterminalsymbol macht und aus jedem Übergang eine Regel (mit einem Terminalsymbol und einem Nichtterminalsymbol).&lt;br /&gt;
&lt;br /&gt;
=Beziehung zu regulären Sprachen=&lt;br /&gt;
Aus der Beziehung zu den deterministischen endlichen Automaten folgt direkt:&lt;br /&gt;
* '''Jede reguläre Grammatik erzeugt eine reguläre Sprache.''' &lt;br /&gt;
** ''Denn zu jeder regulären Grammatik gibt es einen deterministischen endlichen Automaten, und dieser erkennt eine reguläre Sprache.''&lt;br /&gt;
* '''Zu jeder regulären Sprache gibt es eine reguläre Grammatik.'''&lt;br /&gt;
** ''reguläre Sprachen sind genau die Sprachen, die von deterministischen endlichen Automaten erkannt werden. Zu jedem deterministischen endlichen Automaten kann man eine reguläre Grammatik finden.''&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2484</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2484"/>
		<updated>2017-05-06T10:45:50Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* ausführliches Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ZJXtvCF7XrQ}}&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2483</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2483"/>
		<updated>2017-05-06T10:18:43Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* ausführliches Erklärvideo */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;854&amp;quot; height=&amp;quot;480&amp;quot; src=&amp;quot;https://www.youtube.com/embed/ZJXtvCF7XrQ&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2482</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2482"/>
		<updated>2017-05-06T10:01:01Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ausführliches Erklärvideo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;854&amp;quot; height=&amp;quot;480&amp;quot; src=&amp;quot;https://www.youtube.com/embed/ZJXtvCF7XrQ&amp;quot; frameborder=&amp;quot;0&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2481</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2481"/>
		<updated>2017-05-06T08:46:01Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Beispiel */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ \; ~ 6079 \\&lt;br /&gt;
+ &amp;amp; ~ \; ~ \; \,492 \\&lt;br /&gt;
+ &amp;amp;~ \; ~ 5267 \\&lt;br /&gt;
&amp;amp; ~ \,_1 ~ \,_2\,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 11838&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2480</id>
		<title>Schriftliches Rechnen</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Schriftliches_Rechnen&amp;diff=2480"/>
		<updated>2017-05-06T07:05:20Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: Die Seite wurde neu angelegt: „Kategorie:Mathematik Kategorie:Mathematik Unterstufe Kategorie:Rechnen  In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt i…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik Unterstufe]]&lt;br /&gt;
[[Kategorie:Rechnen]]&lt;br /&gt;
&lt;br /&gt;
In diesem Kapitel wird das '''schriftliche Rechnen''' erklärt. Das kennt ihr alle schon aus der Grundschule, aber manchmal vergisst man ja, wie das nochmal ging.&lt;br /&gt;
&lt;br /&gt;
= Schriftliche Addition (&amp;quot;plus rechnen untereinander&amp;quot;) =&lt;br /&gt;
Möchte man zwei (oder mehr) Zahlen schriftlich addieren, ist das wichtigste, dass man die Ziffern mit dem gleichen Stellenwert untereinander schreibt.&lt;br /&gt;
Also Einer unter Einer, Zehner unter Zehner, Hunderter unter Hunderter usw. Die [[Stellenwerttafel]] hat eine eigene Erklärseite.&lt;br /&gt;
&lt;br /&gt;
Man fängt hinten an und addiert zuerst alle Einer. Wenn man dabei als Ergebnis auf 10 oder mehr kommt, muss man den Übertrag (Übertrag 1, wenn man bei Zahlen von 10 bis 19 gelandet ist / Übertrag 2, wenn man eine Zahl von 20 bis 29 heraus hatte usw.) in die nächste Stelle schreiben.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;&lt;br /&gt;
\begin{alignat}{5}&lt;br /&gt;
 &amp;amp;~ 1479 \\&lt;br /&gt;
+ &amp;amp; ~ \; \,892 \\&lt;br /&gt;
+ &amp;amp;~ 5267 \\&lt;br /&gt;
&amp;amp; \,_1\,_2 \,_1\\&lt;br /&gt;
&amp;amp; \hline\\&lt;br /&gt;
&amp;amp; 7638&lt;br /&gt;
\end{alignat}&lt;br /&gt;
&amp;lt;/math&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Mathematik_Unterstufe&amp;diff=2479</id>
		<title>Mathematik Unterstufe</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Mathematik_Unterstufe&amp;diff=2479"/>
		<updated>2017-05-05T17:36:43Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: Die Seite wurde neu angelegt: „Kategorie:Mathematik Kategorie:Mathematik-Unterstufe  '''Willkommen bei der Seite der Unterstufe für Mathematik!'''  == Themen == # Rechnen ## Schri…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Mathematik]]&lt;br /&gt;
[[Kategorie:Mathematik-Unterstufe]]&lt;br /&gt;
&lt;br /&gt;
'''Willkommen bei der Seite der Unterstufe für Mathematik!'''&lt;br /&gt;
&lt;br /&gt;
== Themen ==&lt;br /&gt;
# Rechnen&lt;br /&gt;
## [[Schriftliches Rechnen]]&lt;br /&gt;
## [[Rechenausdrücke, Vorfahrtsregeln]]&lt;br /&gt;
## [[Rechnen mit negativen Zahlen]]&lt;br /&gt;
## [[Rechnen mit Brüchen]]&lt;br /&gt;
## [[Rechnen mit Dezimalzahlen]]&lt;br /&gt;
# Einheiten und Größen&lt;br /&gt;
## [[Zeiteinheiten und Gewichte]]&lt;br /&gt;
## [[Längeneinheiten (1D)]]&lt;br /&gt;
## [[Flächeneinheiten (2D)]]&lt;br /&gt;
## [[Volumeneinheiten (3D)]]&lt;br /&gt;
# Geometrie&lt;br /&gt;
## [[Senkrecht, parallel]]&lt;br /&gt;
## [[Flächen (2D)]]&lt;br /&gt;
### [[Dreiecke]]&lt;br /&gt;
### [[Vierecke]]&lt;br /&gt;
### [[Vielecke]]&lt;br /&gt;
### [[Kreise]]&lt;br /&gt;
### [[Winkel]]&lt;br /&gt;
## [[Körper (3D)]]&lt;br /&gt;
### [[Würfel]]&lt;br /&gt;
### [[Quader]]&lt;br /&gt;
## [[Symmetrie]]&lt;br /&gt;
# Statistische Daten&lt;br /&gt;
## [[Diagramme]]&lt;br /&gt;
## [[Anteile, Prozente, Häufigkeiten]]&lt;br /&gt;
## [[Mittelwerte]]&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Hauptseite&amp;diff=2478</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Hauptseite&amp;diff=2478"/>
		<updated>2017-05-05T17:07:31Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Kurse / Klassen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SIBI-Wiki.de =&lt;br /&gt;
'''Willkommen beim Wiki des Siebengebirgsgymnasiums!'''&lt;br /&gt;
&lt;br /&gt;
[http://sibi-honnef.de Homepage des Siebengebirgsgymnasiums]&lt;br /&gt;
&lt;br /&gt;
== Wer kann hier mitarbeiten - und wie? ==&lt;br /&gt;
* Am SIBI-Wiki kann '''jede Schülerin / jeder Schüler / jede Lehrerin / jeder Lehrer des SIBI''' mitarbeiten.  &lt;br /&gt;
* Wer mitarbeiten möchte, meldet sich bitte bei Herrn Kaibel ([[Datei:MailadresseAKaibel.jpg]]) und bekommt einen Account.&lt;br /&gt;
* Sobald man angemeldet ist, sieht man '''über der Seite''' den '''Reiter &amp;quot;Bearbeiten&amp;quot;''' und '''neben jedem Absatz''' den '''Link &amp;quot;Bearbeiten&amp;quot;'''. Einfach draufklicken und die entsprechende Seite bearbeiten!&lt;br /&gt;
&lt;br /&gt;
== Für Newbies (=Neulinge)  ==&lt;br /&gt;
* Im Bearbeiten-Modus sehen Wiki-Seiten erst einmal komisch aus.&lt;br /&gt;
* Aber: '''Wiki-Syntax ist wirklich einfach!''' Am besten das Cheat-Sheet runterladen, ausdrucken und beim Bearbeiten neben den PC legen!&lt;br /&gt;
** '''[http://sibi-leo.de/wiki/images/SIBI-wiki-cheat-sheet.pdf  SIBI-wiki-cheat-sheet]'''&lt;br /&gt;
* '''Ausprobieren''' kann man das auf der '''[[Spielwiese]]'''. Da kann jeder editieren, wie er will. (Die Spielwiese gibt es übrigens auch in der Wikipedia!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Cheat-Sheet für Wiki-Syntax ==&lt;br /&gt;
* Auf dem folgenden Cheat-Sheet wird '''die wichtigste Wiki-Syntax auf einer DIN-A4-Seite''' zusammengefasst.&lt;br /&gt;
* Einfach runterladen, ausdrucken und neben den Rechner legen!&lt;br /&gt;
* '''[http://sibi-leo.de/wiki/images/SIBI-wiki-cheat-sheet.pdf  SIBI-wiki-cheat-sheet]'''&lt;br /&gt;
&lt;br /&gt;
==Fächer==&lt;br /&gt;
* Informatik&lt;br /&gt;
** [[:Kategorie:Informatik|Informatik]]&lt;br /&gt;
** [[:Kategorie:Informatik-Abitur|Informatik Abitur]]&lt;br /&gt;
* Mathematik&lt;br /&gt;
** [[:Kategorie:Mathematik|Mathematik]]&lt;br /&gt;
** [[:Kategorie:Mathematik-Fachschaft|Fachschaft Mathematik]]&lt;br /&gt;
&lt;br /&gt;
== Kurse / Klassen ==&lt;br /&gt;
* Informatik&lt;br /&gt;
** [[Informatik Q2|Informatik Q2]]&lt;br /&gt;
** [[Informatik Q2 ab Abi 2017|Informatik Q2 ab Abi 2017]]&lt;br /&gt;
** [[Informatik Q1 LK|Informatik Q1 LK]]&lt;br /&gt;
** [[Informatik Q1 LK Abi ab 2017|Informatik Q1 LK ab Abi 2017]]&lt;br /&gt;
** [[Informatik Q1 GK|Informatik Q1 GK]]&lt;br /&gt;
** [[Informatik EF|Informatik EF]]&lt;br /&gt;
** [[:Kategorie:Informatik-09|Informatik 09]]&lt;br /&gt;
** [[:Kategorie:Informatik 8|Informatik 08]]&lt;br /&gt;
&lt;br /&gt;
* Mathematik&lt;br /&gt;
** [[Mathematik Unterstufe|Mathematik Unterstufe (Klassen 5,6)]]&lt;br /&gt;
** [[Mathematik Mittelstufe|Mathematik Mittelstufe (Klassen 7,8,9)]]&lt;br /&gt;
** [[Mathematik Oberstufe| Mathematik Oberstufe]]&lt;br /&gt;
*** [[Mathematik EF|Mathematik EF]]&lt;br /&gt;
*** [[Mathematik Q1-Q2 GK|Mathematik Q1-Q2 GK]]&lt;br /&gt;
*** [[Mathematik Q1-Q2 LK|Mathematik Q1-Q2 LK]]&lt;br /&gt;
&lt;br /&gt;
== Fragen? Anregungen? ==&lt;br /&gt;
Per Mail an Herrn Kaibel: [[File:MailadresseAKaibel.jpg]]&lt;br /&gt;
&lt;br /&gt;
== Danke... ==&lt;br /&gt;
* an Fadel Tchalabi für das Aufsetzen und Maintenance dieses Wikis.&lt;br /&gt;
* ebenfalls an Fadel Tchalabi für sehr sehr viele Inhalte!&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Dijkstra-Algorithmus&amp;diff=2303</id>
		<title>Dijkstra-Algorithmus</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Dijkstra-Algorithmus&amp;diff=2303"/>
		<updated>2016-08-11T07:02:46Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Implementierung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
&lt;br /&gt;
[[File:Deutschland-graph.png|thumb|Originalgraph |400px]]&lt;br /&gt;
[[File:Deutschland-graph-dijkstra-kassel.png|thumb|Ergebnis des Dijkstra-Algorithmus für Kassel |400px]]&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Dijkstra-Algorithmus kann man für einen Startknoten die kürzesten Wege zu allen anderen Knoten des Graphen bestimmen.&lt;br /&gt;
&lt;br /&gt;
Der Dijkstra-Algorithmus ist wesentlich effizienter als die Suche nach einem kürzesten Weg mithilfe von [[Backtracking ab Abi 2017|Backtracking]]&lt;br /&gt;
&lt;br /&gt;
Der Dijkstra-Algorithmus bezieht sich auf die Datenstruktur [[Graph]].&lt;br /&gt;
&lt;br /&gt;
= Idee des Dijkstra-Algorithmus=&lt;br /&gt;
==Notwendige Datenstrukturen==&lt;br /&gt;
* Für jeden Knoten wird der Vorgänger und ein Wert &amp;lt;code&amp;gt;distanz&amp;lt;/code&amp;gt; gespeichert; &amp;lt;code&amp;gt;distanz&amp;lt;/code&amp;gt; gibt die bisher beste gefundene Distanz zum Startknoten an.&lt;br /&gt;
* '''gelbe Liste''': In dieser Liste werden Knoten gespeichert, für die schon ein Distanzwert vorliegt, deren Distanz zum Startknoten aber noch nicht abschließend festgelegt werden konnte. Die Knoten erscheinen in der gelben Liste gemäß ihrem Distanzwert, und zwar in aufsteigender Reihenfolge. &lt;br /&gt;
* '''rote Liste''': Man braucht eine Liste, in der alle Knoten gespeichert werden, deren Distanz zum Startknoten abschließend festgestellt wurde. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Algorithmus==&lt;br /&gt;
# Die Distanz des Startknoten wird auf 0 gesetzt; der von allen anderen Knoten auf unendlich.  &lt;br /&gt;
# Der Startknoten wird in die rote Liste eingefügt. &lt;br /&gt;
# Alle Nachbarknoten des Startknotens werden in die gelbe Liste eingefügt, und zwar gemäß ihrer Distanz zum Startknoten.&lt;br /&gt;
# Die folgenden Schritte laufen jetzt so lange, bis die gelbe Liste leer ist:&lt;br /&gt;
## den ersten Knoten aus der gelben Liste (im folgenden &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt;) entnehmen und in die rote Liste einfügen. Denn die Distanz dieses Knotens ist endgültig geklärt.&lt;br /&gt;
## für alle Nachbarknoten von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; überprüft man:&lt;br /&gt;
### wenn sie noch nicht in der gelben Liste sind: Distanz berechnen (=Distanz von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; plus Kantenlänge von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt;) und dann in die gelbe Liste hinzufügen (=gemäß der Distanz einfügen)&lt;br /&gt;
### wenn sie schon in der gelben Liste sind: Überprüfen, ob die Distanz von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; plus Kantenlänge '''kleiner''' ist als die bisher gespeicherte Distanz: Dann hat man eine bessere Route gefunden! Die Distanz des Nachbarknoten wird dann entsprechend verbessert, wodurch sich seine Position in der gelben Liste verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kürzester Weg für einen beliebigen Knoten==&lt;br /&gt;
Die Distanz kann man direkt aus dem Knoten auslesen.&lt;br /&gt;
&lt;br /&gt;
Den kürzesten Weg von einem beliebigen Knoten zum Startknoten kann man jetzt angeben, indem man sich von dem Knoten aus immer zum nächsten Vorgänger hangelt, bis mn schließlich beim Startknoten angekommen ist.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Für den Startknoten Kassel sind die ersten Schritte des Dijkstra-Algorithmus die folgenden.&lt;br /&gt;
&lt;br /&gt;
* Die '''rote Liste''' ist '''fett'' geschrieben und ist von oben nach unten zu lesen.&lt;br /&gt;
* Die '''gelbe Liste''' ist jeweils von links nach rechts zu lesen.&lt;br /&gt;
** Veränderungen in der gelben Liste sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
In der gelben Liste wird in Klammern die aktuelle Distanz zum Startknoten und der Vorgängerknoten (als Nummernschild) angegeben.&lt;br /&gt;
* '''Kassel (0, --)''': Dortmund (160, KS), Hannover (167, KS), Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS)&lt;br /&gt;
* '''Dortmund (160, KS)''': Hannover (167, KS), Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), Bremen (394, DO)&lt;br /&gt;
* '''Hannover (167, KS)''': Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), &amp;lt;u&amp;gt;Bremen (289, H)&amp;lt;/u&amp;gt;, Hamburg (317, H), Berlin (457, H)&lt;br /&gt;
* '''Frankfurt (193, KS)''': Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Karlsruhe (340, F), Berlin (457, H)&lt;br /&gt;
* '''Wuerzburg (209, KS)''': Leipzig (250, KS), Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (457, H)&lt;br /&gt;
* '''Leipzig (250, KS)''': Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), &amp;lt;u&amp;gt;Berlin (438, L)&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Koeln (253, DO)''': Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Bremen (289, H)''': Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Hamburg (317, H)''': Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Nuernberg (319, WÜ)''': Karlsruhe (340, F), Berlin (438, L), Muenchen (485, N), Stuttgart (527, N)&lt;br /&gt;
* '''Karlsruhe (340, F)''': &amp;lt;u&amp;gt;Stuttgart (422, KA)&amp;lt;/u&amp;gt;, Berlin (438, L), Muenchen (485, N)&lt;br /&gt;
* '''Stuttgart (422, KA)''': Berlin (438, L), Muenchen (485, N)&lt;br /&gt;
* '''Berlin (438, L)''': Muenchen (485, N)&lt;br /&gt;
* '''Muenchen (485, N)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den kürzesten Weg von Kassel nach Stuttgart findet man jetzt, indem man in der roten Liste Stuttgart sucht und dann in der roten Liste &amp;quot;rückwärts&amp;quot; geht:&lt;br /&gt;
&lt;br /&gt;
Stuttgart (422, KA) -&amp;gt; Karlsruhe (340, F) -&amp;gt; Frankfurt (193, KS) -&amp;gt; Kassel (0, --)&lt;br /&gt;
&lt;br /&gt;
= Implementierung =&lt;br /&gt;
Diese Implementierung umfasst zwei Klassen:&lt;br /&gt;
* &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DijkstraNode&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt; enthält eine (lange...) Methode &amp;lt;code&amp;gt;initGraph&amp;lt;/code&amp;gt;, damit man das Ganze auch testen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Klasse &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt;:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import graph.Graph;&lt;br /&gt;
 import graph.GraphWithViewer;&lt;br /&gt;
 import gui.GUI;&lt;br /&gt;
 import linear.List;&lt;br /&gt;
 import linear.ListWithViewer;&lt;br /&gt;
 &lt;br /&gt;
 '''public class DijkstraAlgorithmus {'''&lt;br /&gt;
    public GraphWithViewer graph;&lt;br /&gt;
    List&amp;lt;DijkstraNode&amp;gt; gelbeListe;&lt;br /&gt;
    List&amp;lt;DijkstraNode&amp;gt; roteListe;&lt;br /&gt;
 &lt;br /&gt;
    '''public DijkstraAlgorithmus(){'''&lt;br /&gt;
        initGraph();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''public void dijkstra(String pStadt) {'''&lt;br /&gt;
         gelbeListe = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
         roteListe = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
         DijkstraNode startNode = (DijkstraNode)graph.getNode(pStadt);&lt;br /&gt;
         startNode.setDistanz(0);&lt;br /&gt;
         gelbeListe.append(startNode);&lt;br /&gt;
         while(!gelbeListe.isEmpty()){&lt;br /&gt;
            gelbeListe.toFirst();&lt;br /&gt;
            DijkstraNode ersterGelber = gelbeListe.getContent();&lt;br /&gt;
            //System.out.println(&amp;quot;ersterGelber: &amp;quot;+ersterGelber);&lt;br /&gt;
            gelbeListe.remove();&lt;br /&gt;
            ersterGelber.mark();&lt;br /&gt;
            roteListe.append(ersterGelber);&lt;br /&gt;
            List&amp;lt;GraphNode&amp;gt; nachbarn = graph.getNeighbours(ersterGelber);&lt;br /&gt;
            nachbarn.toFirst();&lt;br /&gt;
            while(nachbarn.hasAccess()){&lt;br /&gt;
               DijkstraNode derNachbar = (DijkstraNode) nachbarn.getContent();&lt;br /&gt;
               if (!derNachbar.isMarked()) {&lt;br /&gt;
                //System.out.println(&amp;quot;currentNeighbour: &amp;quot;+currentNeighbour);&lt;br /&gt;
                double streckeErsterZumNachbar = graph.getEdgeWeight(ersterGelber, derNachbar);&lt;br /&gt;
                if (ersterGelber.getDistanz() + streckeErsterZumNachbar &amp;lt; derNachbar.getDistanz()) {&lt;br /&gt;
                    // ueber derNachbar fuehrt eine kuerzere Strecke zu currentNeighbour!&lt;br /&gt;
                    derNachbar.setVorgaenger(ersterGelber);&lt;br /&gt;
                    derNachbar.setDistanz(ersterGelber.getDistanz() + streckeErsterZumNachbar);&lt;br /&gt;
                    inGelbeListeUpdaten(derNachbar);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            nachbarn.next();&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * sorgt dafuer, dass node gemaess seiner Distanz&lt;br /&gt;
     * die richtige Position in gelbeListe bekommt.&lt;br /&gt;
     * wenn pNode noch gar nicht in gelbeListe enthalten ist,&lt;br /&gt;
     * dann wird node an der richtigen Stelle eingefuegt.&lt;br /&gt;
     */&lt;br /&gt;
    '''private void inGelbeListeUpdaten(DijkstraNode pNode) {'''&lt;br /&gt;
        boolean inserted = false;&lt;br /&gt;
        gelbeListe.toFirst();&lt;br /&gt;
        while(gelbeListe.hasAccess()){&lt;br /&gt;
            DijkstraNode aktuell = gelbeListe.getContent();&lt;br /&gt;
            if(aktuell.getDistanz() &amp;gt;= pNode.getDistanz()){&lt;br /&gt;
                gelbeListe.insert(pNode);&lt;br /&gt;
                inserted = true;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            gelbeListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        if(inserted){&lt;br /&gt;
            // ggf. taucht pNode nochmal in der Liste auf!&lt;br /&gt;
            // dann muss er entfernt werden!&lt;br /&gt;
            while(gelbeListe.hasAccess()){&lt;br /&gt;
                DijkstraNode aktuell = gelbeListe.getContent();&lt;br /&gt;
                if(aktuell.getName().equals(pNode.getName())){&lt;br /&gt;
                    gelbeListe.remove();&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
                gelbeListe.next();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            // der Knoten wurde noch nicht eingefuegt!&lt;br /&gt;
            gelbeListe.append(pNode);&lt;br /&gt;
        }&lt;br /&gt;
    }     &lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * erzeugt einen Graph, in dem nur die Dijkstra-Verbindungen eingetragen sind&lt;br /&gt;
     * @param pGraph&lt;br /&gt;
     * @param roteListe&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    '''public GraphWithViewer zeigeDijkstraGraph(){'''&lt;br /&gt;
        Graph pGraph = graph;&lt;br /&gt;
        GraphWithViewer ergebnis = new GraphWithViewer();&lt;br /&gt;
        List&amp;lt;GraphNode&amp;gt; nodes = pGraph.getNodes();&lt;br /&gt;
        for(nodes.toFirst(); nodes.hasAccess(); nodes.next()){&lt;br /&gt;
            ergebnis.addNode((DijkstraNode) nodes.getContent());&lt;br /&gt;
        }&lt;br /&gt;
        for(roteListe.toFirst(); roteListe.hasAccess(); roteListe.next()){&lt;br /&gt;
            DijkstraNode aktuell = roteListe.getContent();&lt;br /&gt;
            DijkstraNode vorgaenger = aktuell.getVorgaenger();&lt;br /&gt;
            if(vorgaenger != null){&lt;br /&gt;
                double distanz = pGraph.getEdgeWeight(pGraph.getNode(aktuell.getName()), pGraph.getNode(vorgaenger.getName()));&lt;br /&gt;
                ergebnis.addEdge(ergebnis.getNode(aktuell.getName()),&lt;br /&gt;
                        ergebnis.getNode(vorgaenger.getName()),&lt;br /&gt;
                        distanz);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        ergebnis.switchToISOMLayout();&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''private void initGraph(){'''&lt;br /&gt;
        graph = new GraphWithViewer();&lt;br /&gt;
 &lt;br /&gt;
        DijkstraNode dortmund = new DijkstraNode(&amp;quot;Dortmund&amp;quot;);&lt;br /&gt;
        graph.addNode(dortmund);&lt;br /&gt;
        DijkstraNode koeln = new DijkstraNode(&amp;quot;Koeln&amp;quot;);&lt;br /&gt;
        graph.addNode(koeln);&lt;br /&gt;
        DijkstraNode frankfurt = new DijkstraNode(&amp;quot;Frankfurt&amp;quot;);&lt;br /&gt;
        graph.addNode(frankfurt);&lt;br /&gt;
        DijkstraNode kassel = new DijkstraNode(&amp;quot;Kassel&amp;quot;);&lt;br /&gt;
        graph.addNode(kassel);&lt;br /&gt;
        DijkstraNode wuerzburg = new DijkstraNode(&amp;quot;Wuerzburg&amp;quot;);&lt;br /&gt;
        graph.addNode(wuerzburg);&lt;br /&gt;
        DijkstraNode bielefeld = new DijkstraNode(&amp;quot;Bielefeld&amp;quot;);&lt;br /&gt;
        DijkstraNode hamburg = new DijkstraNode(&amp;quot;Hamburg&amp;quot;);&lt;br /&gt;
        graph.addNode(hamburg);&lt;br /&gt;
        DijkstraNode berlin = new DijkstraNode(&amp;quot;Berlin&amp;quot;);&lt;br /&gt;
        graph.addNode(berlin);&lt;br /&gt;
        DijkstraNode bremen = new DijkstraNode(&amp;quot;Bremen&amp;quot;);&lt;br /&gt;
        graph.addNode(bremen);&lt;br /&gt;
        DijkstraNode hannover = new DijkstraNode(&amp;quot;Hannover&amp;quot;);&lt;br /&gt;
        graph.addNode(hannover);&lt;br /&gt;
        DijkstraNode leipzig = new DijkstraNode(&amp;quot;Leipzig&amp;quot;);&lt;br /&gt;
        graph.addNode(leipzig);&lt;br /&gt;
        DijkstraNode nuernberg = new DijkstraNode(&amp;quot;Nuernberg&amp;quot;);&lt;br /&gt;
        graph.addNode(nuernberg);&lt;br /&gt;
        DijkstraNode stuttgart = new DijkstraNode(&amp;quot;Stuttgart&amp;quot;);&lt;br /&gt;
        graph.addNode(stuttgart);&lt;br /&gt;
        DijkstraNode muenchen = new DijkstraNode(&amp;quot;Muenchen&amp;quot;);&lt;br /&gt;
        graph.addNode(muenchen);&lt;br /&gt;
        DijkstraNode karlsruhe = new DijkstraNode(&amp;quot;Karlsruhe&amp;quot;);&lt;br /&gt;
        graph.addNode(karlsruhe);&lt;br /&gt;
 &lt;br /&gt;
        graph.addEdge(kassel, dortmund, 160);&lt;br /&gt;
        graph.addEdge(dortmund, koeln, 93);&lt;br /&gt;
        graph.addEdge(frankfurt, kassel, 193);&lt;br /&gt;
        graph.addEdge(kassel, wuerzburg, 209);&lt;br /&gt;
        graph.addEdge(wuerzburg, frankfurt, 119);&lt;br /&gt;
        graph.addEdge(frankfurt, koeln, 189);&lt;br /&gt;
        graph.addEdge(berlin, hamburg, 289);&lt;br /&gt;
        graph.addEdge(hamburg, bremen, 119);&lt;br /&gt;
        graph.addEdge(bremen, hannover, 122);&lt;br /&gt;
        graph.addEdge(hannover, hamburg, 150);&lt;br /&gt;
        graph.addEdge(berlin, hannover, 290);&lt;br /&gt;
        graph.addEdge(berlin, leipzig, 188);&lt;br /&gt;
        graph.addEdge(hannover, kassel, 167);&lt;br /&gt;
        graph.addEdge(leipzig, kassel, 250);&lt;br /&gt;
        graph.addEdge(dortmund, bremen, 234);&lt;br /&gt;
        graph.addEdge(dortmund, hannover, 210);&lt;br /&gt;
        graph.addEdge(leipzig, nuernberg, 278);&lt;br /&gt;
        graph.addEdge(wuerzburg, nuernberg, 110);&lt;br /&gt;
        graph.addEdge(nuernberg, muenchen, 166);&lt;br /&gt;
        graph.addEdge(muenchen, stuttgart, 223);&lt;br /&gt;
        graph.addEdge(nuernberg, stuttgart, 208);&lt;br /&gt;
        graph.addEdge(stuttgart, karlsruhe, 82);&lt;br /&gt;
        graph.addEdge(karlsruhe, frankfurt, 147);&lt;br /&gt;
  &lt;br /&gt;
        // auf ein geeignetes Layout umstellen&lt;br /&gt;
        graph.switchToISOMLayout();&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    '''public static void main(String[] args) {'''&lt;br /&gt;
        DijkstraAlgorithmus da = new DijkstraAlgorithmus();&lt;br /&gt;
        new GUI(da);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Klasse &amp;lt;code&amp;gt;DijkstraNode&amp;lt;/code&amp;gt;:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import graph.GraphNode;&lt;br /&gt;
 &lt;br /&gt;
 public class DijkstraNode extends GraphNode{&lt;br /&gt;
 &lt;br /&gt;
  private DijkstraNode vorgaenger;&lt;br /&gt;
  private double distanz;&lt;br /&gt;
  &lt;br /&gt;
  public DijkstraNode(String pName) {&lt;br /&gt;
        super(pName);&lt;br /&gt;
        vorgaenger = null;&lt;br /&gt;
        distanz = 100000000;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  public void setDistanz(double pDistanz){&lt;br /&gt;
     this.distanz = pDistanz;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public double getDistanz(){&lt;br /&gt;
     return distanz;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public void setVorgaenger(DijkstraNode pNode){&lt;br /&gt;
     this.vorgaenger = pNode;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public DijkstraNode getVorgaenger() {&lt;br /&gt;
     return vorgaenger;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public String toString(){&lt;br /&gt;
         String ergebnis = this.getName()+&amp;quot;: &amp;quot;+this.distanz;&lt;br /&gt;
         if(this.vorgaenger != null){&lt;br /&gt;
             ergebnis += (&amp;quot; (&amp;quot;+vorgaenger.getName()+&amp;quot;)&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
         return ergebnis;&lt;br /&gt;
      }     &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Dijkstra-Algorithmus&amp;diff=2302</id>
		<title>Dijkstra-Algorithmus</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Dijkstra-Algorithmus&amp;diff=2302"/>
		<updated>2016-08-11T07:01:47Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: Die Seite wurde neu angelegt: „Kategorie:Informatik Kategorie:Informatik-Abitur Kategorie:Datenstrukturen(IF)  400px [[File:De…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
&lt;br /&gt;
[[File:Deutschland-graph.png|thumb|Originalgraph |400px]]&lt;br /&gt;
[[File:Deutschland-graph-dijkstra-kassel.png|thumb|Ergebnis des Dijkstra-Algorithmus für Kassel |400px]]&lt;br /&gt;
&lt;br /&gt;
Mit Hilfe des Dijkstra-Algorithmus kann man für einen Startknoten die kürzesten Wege zu allen anderen Knoten des Graphen bestimmen.&lt;br /&gt;
&lt;br /&gt;
Der Dijkstra-Algorithmus ist wesentlich effizienter als die Suche nach einem kürzesten Weg mithilfe von [[Backtracking ab Abi 2017|Backtracking]]&lt;br /&gt;
&lt;br /&gt;
Der Dijkstra-Algorithmus bezieht sich auf die Datenstruktur [[Graph]].&lt;br /&gt;
&lt;br /&gt;
= Idee des Dijkstra-Algorithmus=&lt;br /&gt;
==Notwendige Datenstrukturen==&lt;br /&gt;
* Für jeden Knoten wird der Vorgänger und ein Wert &amp;lt;code&amp;gt;distanz&amp;lt;/code&amp;gt; gespeichert; &amp;lt;code&amp;gt;distanz&amp;lt;/code&amp;gt; gibt die bisher beste gefundene Distanz zum Startknoten an.&lt;br /&gt;
* '''gelbe Liste''': In dieser Liste werden Knoten gespeichert, für die schon ein Distanzwert vorliegt, deren Distanz zum Startknoten aber noch nicht abschließend festgelegt werden konnte. Die Knoten erscheinen in der gelben Liste gemäß ihrem Distanzwert, und zwar in aufsteigender Reihenfolge. &lt;br /&gt;
* '''rote Liste''': Man braucht eine Liste, in der alle Knoten gespeichert werden, deren Distanz zum Startknoten abschließend festgestellt wurde. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Algorithmus==&lt;br /&gt;
# Die Distanz des Startknoten wird auf 0 gesetzt; der von allen anderen Knoten auf unendlich.  &lt;br /&gt;
# Der Startknoten wird in die rote Liste eingefügt. &lt;br /&gt;
# Alle Nachbarknoten des Startknotens werden in die gelbe Liste eingefügt, und zwar gemäß ihrer Distanz zum Startknoten.&lt;br /&gt;
# Die folgenden Schritte laufen jetzt so lange, bis die gelbe Liste leer ist:&lt;br /&gt;
## den ersten Knoten aus der gelben Liste (im folgenden &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt;) entnehmen und in die rote Liste einfügen. Denn die Distanz dieses Knotens ist endgültig geklärt.&lt;br /&gt;
## für alle Nachbarknoten von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; überprüft man:&lt;br /&gt;
### wenn sie noch nicht in der gelben Liste sind: Distanz berechnen (=Distanz von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; plus Kantenlänge von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt;) und dann in die gelbe Liste hinzufügen (=gemäß der Distanz einfügen)&lt;br /&gt;
### wenn sie schon in der gelben Liste sind: Überprüfen, ob die Distanz von &amp;lt;code&amp;gt;ersterGelber&amp;lt;/code&amp;gt; plus Kantenlänge '''kleiner''' ist als die bisher gespeicherte Distanz: Dann hat man eine bessere Route gefunden! Die Distanz des Nachbarknoten wird dann entsprechend verbessert, wodurch sich seine Position in der gelben Liste verbessert.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kürzester Weg für einen beliebigen Knoten==&lt;br /&gt;
Die Distanz kann man direkt aus dem Knoten auslesen.&lt;br /&gt;
&lt;br /&gt;
Den kürzesten Weg von einem beliebigen Knoten zum Startknoten kann man jetzt angeben, indem man sich von dem Knoten aus immer zum nächsten Vorgänger hangelt, bis mn schließlich beim Startknoten angekommen ist.&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Für den Startknoten Kassel sind die ersten Schritte des Dijkstra-Algorithmus die folgenden.&lt;br /&gt;
&lt;br /&gt;
* Die '''rote Liste''' ist '''fett'' geschrieben und ist von oben nach unten zu lesen.&lt;br /&gt;
* Die '''gelbe Liste''' ist jeweils von links nach rechts zu lesen.&lt;br /&gt;
** Veränderungen in der gelben Liste sind &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;.&lt;br /&gt;
In der gelben Liste wird in Klammern die aktuelle Distanz zum Startknoten und der Vorgängerknoten (als Nummernschild) angegeben.&lt;br /&gt;
* '''Kassel (0, --)''': Dortmund (160, KS), Hannover (167, KS), Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS)&lt;br /&gt;
* '''Dortmund (160, KS)''': Hannover (167, KS), Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), Bremen (394, DO)&lt;br /&gt;
* '''Hannover (167, KS)''': Frankfurt (193, KS), Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), &amp;lt;u&amp;gt;Bremen (289, H)&amp;lt;/u&amp;gt;, Hamburg (317, H), Berlin (457, H)&lt;br /&gt;
* '''Frankfurt (193, KS)''': Wuerzburg (209, KS), Leipzig (250, KS), Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Karlsruhe (340, F), Berlin (457, H)&lt;br /&gt;
* '''Wuerzburg (209, KS)''': Leipzig (250, KS), Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (457, H)&lt;br /&gt;
* '''Leipzig (250, KS)''': Koeln (253, DO), Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), &amp;lt;u&amp;gt;Berlin (438, L)&amp;lt;/u&amp;gt;&lt;br /&gt;
* '''Koeln (253, DO)''': Bremen (289, H), Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Bremen (289, H)''': Hamburg (317, H), Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Hamburg (317, H)''': Nuernberg (319, WÜ), Karlsruhe (340, F), Berlin (438, L)&lt;br /&gt;
* '''Nuernberg (319, WÜ)''': Karlsruhe (340, F), Berlin (438, L), Muenchen (485, N), Stuttgart (527, N)&lt;br /&gt;
* '''Karlsruhe (340, F)''': &amp;lt;u&amp;gt;Stuttgart (422, KA)&amp;lt;/u&amp;gt;, Berlin (438, L), Muenchen (485, N)&lt;br /&gt;
* '''Stuttgart (422, KA)''': Berlin (438, L), Muenchen (485, N)&lt;br /&gt;
* '''Berlin (438, L)''': Muenchen (485, N)&lt;br /&gt;
* '''Muenchen (485, N)'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Den kürzesten Weg von Kassel nach Stuttgart findet man jetzt, indem man in der roten Liste Stuttgart sucht und dann in der roten Liste &amp;quot;rückwärts&amp;quot; geht:&lt;br /&gt;
&lt;br /&gt;
Stuttgart (422, KA) -&amp;gt; Karlsruhe (340, F) -&amp;gt; Frankfurt (193, KS) -&amp;gt; Kassel (0, --)&lt;br /&gt;
&lt;br /&gt;
= Implementierung =&lt;br /&gt;
Diese Implementierung umfasst zwei Klassen:&lt;br /&gt;
* &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;DijkstraNode&amp;lt;/code&amp;gt;&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt; enthält eine (lange...) Methode &amp;lt;code&amp;gt;initGraph&amp;lt;/code&amp;gt;, damit man das Ganze auch testen kann.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Klasse &amp;lt;code&amp;gt;DijkstraAlgorithmus&amp;lt;/code&amp;gt;:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import graph.Graph;&lt;br /&gt;
 import graph.GraphWithViewer;&lt;br /&gt;
 import gui.GUI;&lt;br /&gt;
 import linear.List;&lt;br /&gt;
 import linear.ListWithViewer;&lt;br /&gt;
 &lt;br /&gt;
 '''public class DijkstraAlgorithmus {'''&lt;br /&gt;
    public GraphWithViewer graph;&lt;br /&gt;
    List&amp;lt;DijkstraNode&amp;gt; gelbeListe;&lt;br /&gt;
    List&amp;lt;DijkstraNode&amp;gt; roteListe;&lt;br /&gt;
 &lt;br /&gt;
    '''public DijkstraAlgorithmus(){'''&lt;br /&gt;
        initGraph();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''public void dijkstra(String pStadt) {'''&lt;br /&gt;
         gelbeListe = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
         roteListe = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
         DijkstraNode startNode = (DijkstraNode)graph.getNode(pStadt);&lt;br /&gt;
         startNode.setDistanz(0);&lt;br /&gt;
         gelbeListe.append(startNode);&lt;br /&gt;
         while(!gelbeListe.isEmpty()){&lt;br /&gt;
            gelbeListe.toFirst();&lt;br /&gt;
            DijkstraNode ersterGelber = gelbeListe.getContent();&lt;br /&gt;
            //System.out.println(&amp;quot;ersterGelber: &amp;quot;+ersterGelber);&lt;br /&gt;
            gelbeListe.remove();&lt;br /&gt;
            ersterGelber.mark();&lt;br /&gt;
            roteListe.append(ersterGelber);&lt;br /&gt;
            List&amp;lt;GraphNode&amp;gt; nachbarn = graph.getNeighbours(ersterGelber);&lt;br /&gt;
            nachbarn.toFirst();&lt;br /&gt;
            while(nachbarn.hasAccess()){&lt;br /&gt;
               DijkstraNode derNachbar = (DijkstraNode) nachbarn.getContent();&lt;br /&gt;
               if (!derNachbar.isMarked()) {&lt;br /&gt;
                //System.out.println(&amp;quot;currentNeighbour: &amp;quot;+currentNeighbour);&lt;br /&gt;
                double streckeErsterZumNachbar = graph.getEdgeWeight(ersterGelber, derNachbar);&lt;br /&gt;
                if (ersterGelber.getDistanz() + streckeErsterZumNachbar &amp;lt; derNachbar.getDistanz()) {&lt;br /&gt;
                    // ueber derNachbar fuehrt eine kuerzere Strecke zu currentNeighbour!&lt;br /&gt;
                    derNachbar.setVorgaenger(ersterGelber);&lt;br /&gt;
                    derNachbar.setDistanz(ersterGelber.getDistanz() + streckeErsterZumNachbar);&lt;br /&gt;
                    inGelbeListeUpdaten(derNachbar);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            nachbarn.next();&lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * sorgt dafuer, dass node gemaess seiner Distanz&lt;br /&gt;
     * die richtige Position in gelbeListe bekommt.&lt;br /&gt;
     * wenn pNode noch gar nicht in gelbeListe enthalten ist,&lt;br /&gt;
     * dann wird node an der richtigen Stelle eingefuegt.&lt;br /&gt;
     */&lt;br /&gt;
    '''private void inGelbeListeUpdaten(DijkstraNode pNode) {'''&lt;br /&gt;
        boolean inserted = false;&lt;br /&gt;
        gelbeListe.toFirst();&lt;br /&gt;
        while(gelbeListe.hasAccess()){&lt;br /&gt;
            DijkstraNode aktuell = gelbeListe.getContent();&lt;br /&gt;
            if(aktuell.getDistanz() &amp;gt;= pNode.getDistanz()){&lt;br /&gt;
                gelbeListe.insert(pNode);&lt;br /&gt;
                inserted = true;&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
            gelbeListe.next();&lt;br /&gt;
        }&lt;br /&gt;
        if(inserted){&lt;br /&gt;
            // ggf. taucht pNode nochmal in der Liste auf!&lt;br /&gt;
            // dann muss er entfernt werden!&lt;br /&gt;
            while(gelbeListe.hasAccess()){&lt;br /&gt;
                DijkstraNode aktuell = gelbeListe.getContent();&lt;br /&gt;
                if(aktuell.getName().equals(pNode.getName())){&lt;br /&gt;
                    gelbeListe.remove();&lt;br /&gt;
                    break;&lt;br /&gt;
                }&lt;br /&gt;
                gelbeListe.next();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            // der Knoten wurde noch nicht eingefuegt!&lt;br /&gt;
            gelbeListe.append(pNode);&lt;br /&gt;
        }&lt;br /&gt;
    }     &lt;br /&gt;
 &lt;br /&gt;
    /**&lt;br /&gt;
     * erzeugt einen Graph, in dem nur die Dijkstra-Verbindungen eingetragen sind&lt;br /&gt;
     * @param pGraph&lt;br /&gt;
     * @param roteListe&lt;br /&gt;
     * @return&lt;br /&gt;
     */&lt;br /&gt;
    '''public GraphWithViewer zeigeDijkstraGraph(){'''&lt;br /&gt;
        Graph pGraph = graph;&lt;br /&gt;
        GraphWithViewer ergebnis = new GraphWithViewer();&lt;br /&gt;
        List&amp;lt;GraphNode&amp;gt; nodes = pGraph.getNodes();&lt;br /&gt;
        for(nodes.toFirst(); nodes.hasAccess(); nodes.next()){&lt;br /&gt;
            ergebnis.addNode((DijkstraNode) nodes.getContent());&lt;br /&gt;
        }&lt;br /&gt;
        for(roteListe.toFirst(); roteListe.hasAccess(); roteListe.next()){&lt;br /&gt;
            DijkstraNode aktuell = roteListe.getContent();&lt;br /&gt;
            DijkstraNode vorgaenger = aktuell.getVorgaenger();&lt;br /&gt;
            if(vorgaenger != null){&lt;br /&gt;
                double distanz = pGraph.getEdgeWeight(pGraph.getNode(aktuell.getName()), pGraph.getNode(vorgaenger.getName()));&lt;br /&gt;
                ergebnis.addEdge(ergebnis.getNode(aktuell.getName()),&lt;br /&gt;
                        ergebnis.getNode(vorgaenger.getName()),&lt;br /&gt;
                        distanz);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        ergebnis.switchToISOMLayout();&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    '''private void initGraph(){'''&lt;br /&gt;
        graph = new GraphWithViewer();&lt;br /&gt;
 &lt;br /&gt;
        DijkstraNode dortmund = new DijkstraNode(&amp;quot;Dortmund&amp;quot;);&lt;br /&gt;
        graph.addNode(dortmund);&lt;br /&gt;
        DijkstraNode koeln = new DijkstraNode(&amp;quot;Koeln&amp;quot;);&lt;br /&gt;
        graph.addNode(koeln);&lt;br /&gt;
        DijkstraNode frankfurt = new DijkstraNode(&amp;quot;Frankfurt&amp;quot;);&lt;br /&gt;
        graph.addNode(frankfurt);&lt;br /&gt;
        DijkstraNode kassel = new DijkstraNode(&amp;quot;Kassel&amp;quot;);&lt;br /&gt;
        graph.addNode(kassel);&lt;br /&gt;
        DijkstraNode wuerzburg = new DijkstraNode(&amp;quot;Wuerzburg&amp;quot;);&lt;br /&gt;
        graph.addNode(wuerzburg);&lt;br /&gt;
        DijkstraNode bielefeld = new DijkstraNode(&amp;quot;Bielefeld&amp;quot;);&lt;br /&gt;
        DijkstraNode hamburg = new DijkstraNode(&amp;quot;Hamburg&amp;quot;);&lt;br /&gt;
        graph.addNode(hamburg);&lt;br /&gt;
        DijkstraNode berlin = new DijkstraNode(&amp;quot;Berlin&amp;quot;);&lt;br /&gt;
        graph.addNode(berlin);&lt;br /&gt;
        DijkstraNode bremen = new DijkstraNode(&amp;quot;Bremen&amp;quot;);&lt;br /&gt;
        graph.addNode(bremen);&lt;br /&gt;
        DijkstraNode hannover = new DijkstraNode(&amp;quot;Hannover&amp;quot;);&lt;br /&gt;
        graph.addNode(hannover);&lt;br /&gt;
        DijkstraNode leipzig = new DijkstraNode(&amp;quot;Leipzig&amp;quot;);&lt;br /&gt;
        graph.addNode(leipzig);&lt;br /&gt;
        DijkstraNode nuernberg = new DijkstraNode(&amp;quot;Nuernberg&amp;quot;);&lt;br /&gt;
        graph.addNode(nuernberg);&lt;br /&gt;
        DijkstraNode stuttgart = new DijkstraNode(&amp;quot;Stuttgart&amp;quot;);&lt;br /&gt;
        graph.addNode(stuttgart);&lt;br /&gt;
        DijkstraNode muenchen = new DijkstraNode(&amp;quot;Muenchen&amp;quot;);&lt;br /&gt;
        graph.addNode(muenchen);&lt;br /&gt;
        DijkstraNode karlsruhe = new DijkstraNode(&amp;quot;Karlsruhe&amp;quot;);&lt;br /&gt;
        graph.addNode(karlsruhe);&lt;br /&gt;
 &lt;br /&gt;
        graph.addEdge(kassel, dortmund, 160);&lt;br /&gt;
        graph.addEdge(dortmund, koeln, 93);&lt;br /&gt;
        graph.addEdge(frankfurt, kassel, 193);&lt;br /&gt;
        graph.addEdge(kassel, wuerzburg, 209);&lt;br /&gt;
        graph.addEdge(wuerzburg, frankfurt, 119);&lt;br /&gt;
        graph.addEdge(frankfurt, koeln, 189);&lt;br /&gt;
        graph.addEdge(berlin, hamburg, 289);&lt;br /&gt;
        graph.addEdge(hamburg, bremen, 119);&lt;br /&gt;
        graph.addEdge(bremen, hannover, 122);&lt;br /&gt;
        graph.addEdge(hannover, hamburg, 150);&lt;br /&gt;
        graph.addEdge(berlin, hannover, 290);&lt;br /&gt;
        graph.addEdge(berlin, leipzig, 188);&lt;br /&gt;
        graph.addEdge(hannover, kassel, 167);&lt;br /&gt;
        graph.addEdge(leipzig, kassel, 250);&lt;br /&gt;
        graph.addEdge(dortmund, bremen, 234);&lt;br /&gt;
        graph.addEdge(dortmund, hannover, 210);&lt;br /&gt;
        graph.addEdge(leipzig, nuernberg, 278);&lt;br /&gt;
        graph.addEdge(wuerzburg, nuernberg, 110);&lt;br /&gt;
        graph.addEdge(nuernberg, muenchen, 166);&lt;br /&gt;
        graph.addEdge(muenchen, stuttgart, 223);&lt;br /&gt;
        graph.addEdge(nuernberg, stuttgart, 208);&lt;br /&gt;
        graph.addEdge(stuttgart, karlsruhe, 82);&lt;br /&gt;
        graph.addEdge(karlsruhe, frankfurt, 147);&lt;br /&gt;
  &lt;br /&gt;
        // auf ein geeignetes Layout umstellen&lt;br /&gt;
        graph.switchToISOMLayout();&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    '''public static void main(String[] args) {'''&lt;br /&gt;
        DijkstraAlgorithmus da = new DijkstraAlgorithmus();&lt;br /&gt;
        new GUI(da);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Klasse &amp;lt;code&amp;gt;DijktstraNode&amp;lt;/code&amp;gt;:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 import graph.GraphNode;&lt;br /&gt;
 &lt;br /&gt;
 public class DijkstraNode extends GraphNode{&lt;br /&gt;
 &lt;br /&gt;
  private DijkstraNode vorgaenger;&lt;br /&gt;
  private double distanz;&lt;br /&gt;
  &lt;br /&gt;
  public DijkstraNode(String pName) {&lt;br /&gt;
        super(pName);&lt;br /&gt;
        vorgaenger = null;&lt;br /&gt;
        distanz = 100000000;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
  public void setDistanz(double pDistanz){&lt;br /&gt;
     this.distanz = pDistanz;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public double getDistanz(){&lt;br /&gt;
     return distanz;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public void setVorgaenger(DijkstraNode pNode){&lt;br /&gt;
     this.vorgaenger = pNode;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public DijkstraNode getVorgaenger() {&lt;br /&gt;
     return vorgaenger;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  public String toString(){&lt;br /&gt;
         String ergebnis = this.getName()+&amp;quot;: &amp;quot;+this.distanz;&lt;br /&gt;
         if(this.vorgaenger != null){&lt;br /&gt;
             ergebnis += (&amp;quot; (&amp;quot;+vorgaenger.getName()+&amp;quot;)&amp;quot;);&lt;br /&gt;
         }&lt;br /&gt;
         return ergebnis;&lt;br /&gt;
      }     &lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Backtracking&amp;diff=2301</id>
		<title>Backtracking</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Backtracking&amp;diff=2301"/>
		<updated>2016-08-11T06:56:17Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Backtracking für kürzeste Wege auf Graphen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Algorithmen]]&lt;br /&gt;
&lt;br /&gt;
= Idee =&lt;br /&gt;
''Der folgende Text ist gekürzt aus der Wikipedia [http://de.wikipedia.org/wiki/Backtracking] übernommen. ''&lt;br /&gt;
&lt;br /&gt;
Backtracking geht nach dem Versuch-und-Irrtum-Prinzip (''trial and error'') vor, das heißt, es wird versucht, eine erreichte Teillösung zu einer Gesamtlösung auszubauen. Wenn absehbar ist, dass eine Teillösung nicht zu einer endgültigen Lösung führen kann, wird der letzte Schritt beziehungsweise werden die letzten Schritte zurückgenommen, und es werden stattdessen alternative Wege probiert. Auf diese Weise ist sichergestellt, dass alle in Frage kommenden Lösungswege ausprobiert werden können &lt;br /&gt;
&lt;br /&gt;
Backtracking wird am einfachsten rekursiv implementiert.&lt;br /&gt;
&lt;br /&gt;
= Beschreibung des Algorithmus =&lt;br /&gt;
''Die folgende Beschreibung ist gekürzt und leicht verändert aus der Wikipedia [http://de.wikipedia.org/wiki/Backtracking] übernommen. ''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Teillösung ist zu Anfang leer.&lt;br /&gt;
 Stufe ist 0.&lt;br /&gt;
 &lt;br /&gt;
 '''Funktion FindeLoesung (Stufe, Teillösung)'''&lt;br /&gt;
  1. Abbruchbedingung: Wenn die Stufe zu groß ist&lt;br /&gt;
                        oder es keinen Teil-Lösungsschritt mehr gibt.   &lt;br /&gt;
  2. Abbruchbedingung: Wenn eine Lösung erreicht wurde.&lt;br /&gt;
                       Bearbeite ggf. die Lösung!   &lt;br /&gt;
  3. wiederhole, solange es noch neue Teil-Lösungsschritte gibt:&lt;br /&gt;
     a) Wähle einen neuen Teil-Lösungsschritt. &lt;br /&gt;
     b) Erweitere Teillösung um Wahl.      &lt;br /&gt;
     c) rekursiver Aufruf: FindeLoesung(Stufe+1, Teillösung) &lt;br /&gt;
     d) Mache die Erweiterung der Teillösung rückgängig &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Backtracking für kürzeste Wege auf Graphen =&lt;br /&gt;
Um kürzeste Wege auf Graphen zu bestimmen, kann man den Backtracking-Algorithmus verwenden. Allerdings ist dieser sehr langsam; effizienter wird das Problem mit dem [[Dijkstra-Algorithmus ab Abi 2017|Dijkstra-Algorithmus]] gelöst.&lt;br /&gt;
&lt;br /&gt;
==Beispiel==&lt;br /&gt;
[[File:Graph-fuenf-staedte.png|thumb|Graph mit fünf Städten |310px]]&lt;br /&gt;
Gesucht ist die kürzeste Verbindung von '''Frankfurt''' nach '''Dortmund'''&lt;br /&gt;
&lt;br /&gt;
Damit man keine Möglichkeit auslässt, geht man nach einer '''Ordnung''' vor - hier bietet es sich an, die möglichen Nachbarstädte nach dem Alphabet zu betrachten.&lt;br /&gt;
&lt;br /&gt;
Dann ergibt sich für das Backtracking folgende Reihenfolge:&lt;br /&gt;
* Frankfurt -&amp;gt; Kassel -&amp;gt; Dortmund: ''merken!''&lt;br /&gt;
* Frankfurt -&amp;gt; Kassel -&amp;gt; Würzburg: ''Sackgasse''&lt;br /&gt;
* Frankfurt -&amp;gt; Köln -&amp;gt; Dortmund: ''kürzer, also merken!''&lt;br /&gt;
* Frankfurt -&amp;gt; Würzburg -&amp;gt; Kassel -&amp;gt; Dortmund: ''länger, also ignorieren''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Backtracking-Algorithmus für den kürzesten Weg ==&lt;br /&gt;
&lt;br /&gt;
Man braucht die folgenden Attribute:&lt;br /&gt;
* &amp;lt;code&amp;gt;besterWeg&amp;lt;/code&amp;gt;: Hier wird der jeweils beste gefundene Weg gespeichert.&lt;br /&gt;
* &amp;lt;code&amp;gt;besteLaenge&amp;lt;/code&amp;gt;: Die Länge von &amp;lt;code&amp;gt;besterWeg&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;aktuellerWeg&amp;lt;/code&amp;gt;: Der Weg, der gerade untersucht wird.&lt;br /&gt;
* &amp;lt;code&amp;gt;aktuelleLaenge&amp;lt;/code&amp;gt;: Die Länge von &amp;lt;code&amp;gt;aktuellerWeg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe dieser lässt sich der Algorithmus so beschreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   '''findeKuerzestenWegBacktracking (pNode)'''&lt;br /&gt;
     '''Abbruchbedingung:'''&lt;br /&gt;
       Wenn pNode das Ziel ist ''(d.h. der Lösungsvektor ist vollständig!)''&lt;br /&gt;
       dann vergleiche aktuellerWeg mit besterWeg&lt;br /&gt;
            und aktualisiere diesen, wenn es nötig ist.&lt;br /&gt;
     '''Betrachte der Reihe nach alle Nachbarn von pNode.'''&lt;br /&gt;
     Für jeden Nachbarn wird folgendes getan:&lt;br /&gt;
     - den Nachbar zu aktuellerWeg hinzufügen (''d.h. der Lösungsvektor wird erweitert!'')&lt;br /&gt;
     - aktuelleLaenge entsprechend erhöhen&lt;br /&gt;
     - den Nachbarn markieren&lt;br /&gt;
     - '''findeKuerzstestenWegBacktracking (nachbar) aufrufen'''&lt;br /&gt;
     - die Änderungen wieder rückgängig machen (''d.h. die Wahl wird rückgängig gemacht!'')&lt;br /&gt;
       - den Nachbarn aus aktuellerWeg entfernen&lt;br /&gt;
       - aktuelleDistanz wieder zurücksetzen&lt;br /&gt;
       - die Markierung des Nachbarn entfernen&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementierung==&lt;br /&gt;
Die Implementierung setzt auf die Klasse [[Graph]] auf.&lt;br /&gt;
&lt;br /&gt;
Damit während des Backtracking auf die wesentlichen Daten zugegriffen werden kann, werden diese in Attributen gespeichert.&lt;br /&gt;
&lt;br /&gt;
Die wesentlichen Methoden sind die folgenden:&lt;br /&gt;
* die '''Rahmenmethode''' &amp;lt;code&amp;gt;kuerzestenWegFinden(String pStart, String pZiel)&amp;lt;/code&amp;gt;: In der Rahmenmethode wird alles für das rekursive Backtracking vorbereitet.&lt;br /&gt;
* die '''rekursive Backtracking-Methode''' &amp;lt;code&amp;gt;kuerzestenWegFindenBacktracking(GraphNode pNode)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    '''// Attribute'''&lt;br /&gt;
    public GraphWithViewer graph;&lt;br /&gt;
 &lt;br /&gt;
    '''// Attribute fuer das Backtracking'''&lt;br /&gt;
    public ListWithViewer&amp;lt;GraphNode&amp;gt; besterWeg;&lt;br /&gt;
    public ListWithViewer&amp;lt;GraphNode&amp;gt; aktuellerWeg;&lt;br /&gt;
    public int besteLaenge;&lt;br /&gt;
    public int aktuelleLaenge;&lt;br /&gt;
    public GraphNode start;&lt;br /&gt;
    public GraphNode ziel;&lt;br /&gt;
 &lt;br /&gt;
    '''//Methoden'''&lt;br /&gt;
 &lt;br /&gt;
    '''public ListWithViewer&amp;lt;GraphNode&amp;gt; kuerzestenWegFinden(String pStart, String pZiel){'''&lt;br /&gt;
        graph.resetMarks();&lt;br /&gt;
 &lt;br /&gt;
        start = graph.getNode(pStart);&lt;br /&gt;
        ziel = graph.getNode(pZiel);&lt;br /&gt;
 &lt;br /&gt;
        besterWeg = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
        aktuellerWeg = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
        besteLaenge = 10000000;&lt;br /&gt;
        aktuelleLaenge = 0;&lt;br /&gt;
 &lt;br /&gt;
        start.mark();&lt;br /&gt;
        aktuellerWeg.append(start);&lt;br /&gt;
       &lt;br /&gt;
        kuerzestenWegFindenBacktracking(start);&lt;br /&gt;
  &lt;br /&gt;
        return besterWeg;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''private void kuerzestenWegFindenBacktracking(GraphNode pNode) {'''&lt;br /&gt;
        if(pNode.equals(ziel)){&lt;br /&gt;
            if(aktuelleLaenge &amp;lt; besteLaenge){&lt;br /&gt;
                // besterWeg leeren&lt;br /&gt;
                for(besterWeg.toFirst();!besterWeg.isEmpty();){&lt;br /&gt;
                    besterWeg.remove();&lt;br /&gt;
                }&lt;br /&gt;
                // aktuellerWeg in besterWeg kopieren&lt;br /&gt;
                for(aktuellerWeg.toFirst();aktuellerWeg.hasAccess();aktuellerWeg.next()){&lt;br /&gt;
                    besterWeg.append(aktuellerWeg.getObject());&lt;br /&gt;
                }&lt;br /&gt;
                besteLaenge = aktuelleLaenge;&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        List&amp;lt;GraphNode&amp;gt; nachbarn = graph.getNeighbours(pNode);&lt;br /&gt;
        for(nachbarn.toFirst(); nachbarn.hasAccess(); nachbarn.next()){&lt;br /&gt;
            GraphNode derNachbar = nachbarn.getContent();&lt;br /&gt;
            if(!derNachbar.isMarked()){&lt;br /&gt;
                derNachbar.mark();&lt;br /&gt;
                aktuellerWeg.append(derNachbar);&lt;br /&gt;
                double distanz = graph.getEdgeWeight(derNachbar, pNode);&lt;br /&gt;
                aktuelleLaenge += distanz;&lt;br /&gt;
               &lt;br /&gt;
                '''kuerzestenWegFindenBacktracking(derNachbar);'''&lt;br /&gt;
               &lt;br /&gt;
                aktuelleLaenge -= distanz;&lt;br /&gt;
                aktuellerWeg.toLast();&lt;br /&gt;
                aktuellerWeg.remove();&lt;br /&gt;
                derNachbar.unmark();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Backtracking für Arrays: Magisches Quadrat=&lt;br /&gt;
In ein '''magisches Quadrat''' werden die Zahlen von 1 bis 9 (bzw. 1 bis 16, 1 bis 25, ...) eingetragen.&lt;br /&gt;
Die Summe muss in jeder Zeile, Spalte und Diagonale gleich sein.&lt;br /&gt;
&lt;br /&gt;
Lösungen dieses Problems lassen sich gut mit Backtracking finden.&lt;br /&gt;
&lt;br /&gt;
==Implementierung==&lt;br /&gt;
Die folgende Implementierung löst ein 3x3 Quadrat.&lt;br /&gt;
* Als Datenstruktur muss nur das Quadrat bereitgestellt werden, das ein 3x3-Array ist.&lt;br /&gt;
* Die Stufen des Backtracking-Verfahrens sind hier die Felder; dabei gehen die Stufen von 0 bis 8.&lt;br /&gt;
* Aus der Stufe kann man die Koordinaten des Feldes berechnen.&lt;br /&gt;
* Das eigentliche Backtracking findet in der Methode &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;public void findeLoesung(int pStufe)&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; statt; diese Methode wird von der Rahmenmethode &amp;lt;code&amp;gt;public void findeLoesung()&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class MagischesQuadratFertig {&lt;br /&gt;
 &lt;br /&gt;
    private int[][] quadrat;&lt;br /&gt;
   &lt;br /&gt;
    MagischesQuadratFertig(){&lt;br /&gt;
        quadrat = new int[3][3];&lt;br /&gt;
        initialisiere();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void initialisiere(){&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                quadrat[x][y] = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void findeLoesung(){&lt;br /&gt;
        findeLoesung(0);&lt;br /&gt;
        System.out.println(&amp;quot;*** Loesung: ***&amp;quot;);&lt;br /&gt;
        this.ausgeben();&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//Die eigentliche Backtracking-Methode!'''&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public boolean findeLoesung(int pStufe){'''&amp;lt;/u&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        ausgeben();&lt;br /&gt;
       &lt;br /&gt;
        // Abbruch, wenn pStufe ueber das Quadrat hinausgeht.&lt;br /&gt;
        if(pStufe == 3*3){&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        // aus pStufe die x-Koordinate und die y-Koordinate berechnen&lt;br /&gt;
        int x = pStufe % 3;&lt;br /&gt;
        int y = pStufe / 3;&lt;br /&gt;
   &lt;br /&gt;
        // jetzt fuer pStude alle Moeglichkeiten durchlaufen,&lt;br /&gt;
        // d.h. die Zahlen von 1 bis 9&lt;br /&gt;
        for(int i=1; i&amp;lt;= 3*3; i++){&lt;br /&gt;
            // die Zahl i an die richtige Stelle in das Quadrat eintragen&lt;br /&gt;
            quadrat[x][y] = i;&lt;br /&gt;
 &lt;br /&gt;
            // Wenn es die Zahl schon einmal gibt, dann zur naechsten Zahl weiter.&lt;br /&gt;
            if(esGibtDoppelte()){&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
  &lt;br /&gt;
            // wenn man ein magisches Quadrat gefunden hat, dann true zurueckgeben.&lt;br /&gt;
            if(magisch()){&lt;br /&gt;
                return true;&lt;br /&gt;
            }&lt;br /&gt;
           &lt;br /&gt;
            // es gibt keine Doppelten, aber das Quadrat ist (noch) nicht magisch&lt;br /&gt;
            // d.h. man baut die Teilloesung weiter aus.&lt;br /&gt;
            // Dafuer ein rekursiver Aufruf fuer die naechsthoehere Stufe.&lt;br /&gt;
            // Der Aufruf gibt zurueck, ob das Ausbauen der Teilloesung zum Erfolg fuehrte.&lt;br /&gt;
            boolean fertig = findeLoesung(pStufe + 1);&lt;br /&gt;
            if(fertig){&lt;br /&gt;
                return true;&lt;br /&gt;
            }&lt;br /&gt;
        } // end for&lt;br /&gt;
       &lt;br /&gt;
        // Auf dieser Stufe wurden alle Zahlen von 1 bis 9 durchprobiert, ohne Erfolg.&lt;br /&gt;
        // Man loescht die Information auf dieser Stufe...&lt;br /&gt;
        quadrat[x][y] = 0;&lt;br /&gt;
        // und gibt false zurueck&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public boolean esGibtDoppelte(){&lt;br /&gt;
        boolean[] dabei = new boolean[3*3+1];&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                int index = quadrat[x][y];&lt;br /&gt;
                if(index != 0 &amp;amp;&amp;amp; dabei[index]){&lt;br /&gt;
                    return true;&lt;br /&gt;
                }&lt;br /&gt;
                dabei[index] = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public boolean magisch(){&lt;br /&gt;
        if(esGibtDoppelte()){&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // Summen testen&lt;br /&gt;
        int s=0, t=0;&lt;br /&gt;
        // 1. Diagonale&lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) s+=quadrat[x][x];&lt;br /&gt;
        //2. Diagonale&lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) t+=quadrat[3-x-1][x];&lt;br /&gt;
        if (t != s) return false;&lt;br /&gt;
        // Zeilen&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            int k=0;&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                k += quadrat[x][y];&lt;br /&gt;
            }&lt;br /&gt;
            if (k != s) return false;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
            int k=0;&lt;br /&gt;
            for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
                k += quadrat[x][y];&lt;br /&gt;
            }&lt;br /&gt;
            if (k != s) return false;&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(&amp;quot;*** It's magic!!! ***&amp;quot;);&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void ausgeben(){&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                System.out.print(quadrat[x][y]);&lt;br /&gt;
            }&lt;br /&gt;
            System.out.print(&amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        MagischesQuadratFertig mq = new MagischesQuadratFertig();&lt;br /&gt;
        mq.findeLoesung();&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Aufgabe: Backtracking für Arrays: Rucksackproblem selber programmieren=&lt;br /&gt;
Das '''Rucksackproblem''' lässt anhand des folgenden Beispiels beschreiben:&lt;br /&gt;
* In einen Rucksack kann man 200kg laden (=ganz schön schwer...).&lt;br /&gt;
* Es gibt die folgenden Gewichte: 28, 57, 33, 18, 99, 42, 17, 52&lt;br /&gt;
* '''Welche Gewichte muss man in den Rucksack laden, damit die 200kg möglichst gut ausgenutzt, aber nicht überschritten werden?'''&lt;br /&gt;
&lt;br /&gt;
==Implementierung zum Selbermachen==&lt;br /&gt;
Die folgende Implementierung hält neben &amp;lt;code&amp;gt;gewichte&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;maxGewicht&amp;lt;/code&amp;gt; noch folgende Datenstrukturen bereit:&lt;br /&gt;
* &amp;lt;code&amp;gt;boolean[] dabei&amp;lt;/code&amp;gt;: In diesem Array wird festgehalten, welche der Gewichte bei der aktuell untersuchten Lösung dabei sind.&lt;br /&gt;
* &amp;lt;code&amp;gt;int erreichtesGewicht&amp;lt;/code&amp;gt;: Hier wird festgehalten, welches Gewicht die aktuell untersuchte Lösung hat.&lt;br /&gt;
* &amp;lt;code&amp;gt;boolean[] besteLoesung&amp;lt;/code&amp;gt;: In diesem Array wird die bisher beste Loesung festgehalten. &lt;br /&gt;
* &amp;lt;code&amp;gt;int bestesGewicht&amp;lt;/code&amp;gt;: Hier wird festgehalten, welches Gewicht die bisher beste Lösung hat.&lt;br /&gt;
Diese Variablen müssen natürlich im Laufe des Backtracking immer aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Die Implementierung ist noch nicht vollständig; der Backtracking-Teil muss hier noch programmiert werden; dafür muss die Methode &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;sucheBesteLoesung(int pStufe)&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; ergänzt werden.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Viel Spaß beim Programmieren!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Rucksackproblem {&lt;br /&gt;
    public int[] gewichte = {28, 57, 33, 18, 99, 42, 17, 52};&lt;br /&gt;
    public int maxGewicht = 200;&lt;br /&gt;
   &lt;br /&gt;
    public boolean[] dabei = new boolean[gewichte.length];&lt;br /&gt;
    public int erreichtesGewicht = 0;&lt;br /&gt;
   &lt;br /&gt;
    public boolean[] besteLoesung = new boolean[gewichte.length];&lt;br /&gt;
    public int bestesGewicht = 0;&lt;br /&gt;
   &lt;br /&gt;
    public void sucheBesteLoesung(){&lt;br /&gt;
        //Vorbereitung&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            dabei[i] = false;&lt;br /&gt;
        }&lt;br /&gt;
        kopiereInBesteLoesung();&lt;br /&gt;
        // los gehts!&lt;br /&gt;
        sucheBesteLoesung(0);&lt;br /&gt;
        System.out.println(&amp;quot;*** Beste Loesung: ***&amp;quot;);&lt;br /&gt;
        ausgeben(besteLoesung);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;u&amp;gt;public void sucheBesteLoesung(int pStufe) {&amp;lt;/u&amp;gt;&lt;br /&gt;
        dabeiArrayAusgeben();&lt;br /&gt;
        &amp;lt;u&amp;gt;//TODO&amp;lt;/u&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public void ausgeben(boolean[] b){&lt;br /&gt;
        System.out.print(berechneGewicht(b)+&amp;quot;: &amp;quot;);&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            if(b[i]){&lt;br /&gt;
                System.out.print(gewichte[i]+&amp;quot;,&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public void dabeiArrayAusgeben(){&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            if(dabei[i]){&lt;br /&gt;
                System.out.print(&amp;quot;+&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                System.out.print(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    } &lt;br /&gt;
   &lt;br /&gt;
    public void kopiereInBesteLoesung(){&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            besteLoesung[i] = dabei[i];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public int berechneGewicht(boolean[] p){&lt;br /&gt;
        int ergebnis = 0;&lt;br /&gt;
        for(int i=0; i&amp;lt;p.length; i++){&lt;br /&gt;
            if(p[i]){&lt;br /&gt;
                ergebnis += gewichte[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        Rucksackproblem rp = new Rucksackproblem();&lt;br /&gt;
        rp.sucheBesteLoesung();&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Backtracking&amp;diff=2300</id>
		<title>Backtracking</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Backtracking&amp;diff=2300"/>
		<updated>2016-08-11T06:55:52Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: Die Seite wurde neu angelegt: „Kategorie:Informatik Kategorie:Informatik-Abitur Kategorie:Algorithmen  = Idee = ''Der folgende Text ist gekürzt aus der Wikipedia [http://de.wiki…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
[[Kategorie:Algorithmen]]&lt;br /&gt;
&lt;br /&gt;
= Idee =&lt;br /&gt;
''Der folgende Text ist gekürzt aus der Wikipedia [http://de.wikipedia.org/wiki/Backtracking] übernommen. ''&lt;br /&gt;
&lt;br /&gt;
Backtracking geht nach dem Versuch-und-Irrtum-Prinzip (''trial and error'') vor, das heißt, es wird versucht, eine erreichte Teillösung zu einer Gesamtlösung auszubauen. Wenn absehbar ist, dass eine Teillösung nicht zu einer endgültigen Lösung führen kann, wird der letzte Schritt beziehungsweise werden die letzten Schritte zurückgenommen, und es werden stattdessen alternative Wege probiert. Auf diese Weise ist sichergestellt, dass alle in Frage kommenden Lösungswege ausprobiert werden können &lt;br /&gt;
&lt;br /&gt;
Backtracking wird am einfachsten rekursiv implementiert.&lt;br /&gt;
&lt;br /&gt;
= Beschreibung des Algorithmus =&lt;br /&gt;
''Die folgende Beschreibung ist gekürzt und leicht verändert aus der Wikipedia [http://de.wikipedia.org/wiki/Backtracking] übernommen. ''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 Teillösung ist zu Anfang leer.&lt;br /&gt;
 Stufe ist 0.&lt;br /&gt;
 &lt;br /&gt;
 '''Funktion FindeLoesung (Stufe, Teillösung)'''&lt;br /&gt;
  1. Abbruchbedingung: Wenn die Stufe zu groß ist&lt;br /&gt;
                        oder es keinen Teil-Lösungsschritt mehr gibt.   &lt;br /&gt;
  2. Abbruchbedingung: Wenn eine Lösung erreicht wurde.&lt;br /&gt;
                       Bearbeite ggf. die Lösung!   &lt;br /&gt;
  3. wiederhole, solange es noch neue Teil-Lösungsschritte gibt:&lt;br /&gt;
     a) Wähle einen neuen Teil-Lösungsschritt. &lt;br /&gt;
     b) Erweitere Teillösung um Wahl.      &lt;br /&gt;
     c) rekursiver Aufruf: FindeLoesung(Stufe+1, Teillösung) &lt;br /&gt;
     d) Mache die Erweiterung der Teillösung rückgängig &lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Backtracking für kürzeste Wege auf Graphen =&lt;br /&gt;
Um kürzeste Wege auf Graphen zu bestimmen, kann man den Backtracking-Algorithmus verwenden. Allerdings ist dieser sehr langsam; effizienter wird das Problem mit dem [[Dijkstra-Algorithmus]] gelöst.&lt;br /&gt;
&lt;br /&gt;
==Beispiel==&lt;br /&gt;
[[File:Graph-fuenf-staedte.png|thumb|Graph mit fünf Städten |310px]]&lt;br /&gt;
Gesucht ist die kürzeste Verbindung von '''Frankfurt''' nach '''Dortmund'''&lt;br /&gt;
&lt;br /&gt;
Damit man keine Möglichkeit auslässt, geht man nach einer '''Ordnung''' vor - hier bietet es sich an, die möglichen Nachbarstädte nach dem Alphabet zu betrachten.&lt;br /&gt;
&lt;br /&gt;
Dann ergibt sich für das Backtracking folgende Reihenfolge:&lt;br /&gt;
* Frankfurt -&amp;gt; Kassel -&amp;gt; Dortmund: ''merken!''&lt;br /&gt;
* Frankfurt -&amp;gt; Kassel -&amp;gt; Würzburg: ''Sackgasse''&lt;br /&gt;
* Frankfurt -&amp;gt; Köln -&amp;gt; Dortmund: ''kürzer, also merken!''&lt;br /&gt;
* Frankfurt -&amp;gt; Würzburg -&amp;gt; Kassel -&amp;gt; Dortmund: ''länger, also ignorieren''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Backtracking-Algorithmus für den kürzesten Weg ==&lt;br /&gt;
&lt;br /&gt;
Man braucht die folgenden Attribute:&lt;br /&gt;
* &amp;lt;code&amp;gt;besterWeg&amp;lt;/code&amp;gt;: Hier wird der jeweils beste gefundene Weg gespeichert.&lt;br /&gt;
* &amp;lt;code&amp;gt;besteLaenge&amp;lt;/code&amp;gt;: Die Länge von &amp;lt;code&amp;gt;besterWeg&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;aktuellerWeg&amp;lt;/code&amp;gt;: Der Weg, der gerade untersucht wird.&lt;br /&gt;
* &amp;lt;code&amp;gt;aktuelleLaenge&amp;lt;/code&amp;gt;: Die Länge von &amp;lt;code&amp;gt;aktuellerWeg&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mithilfe dieser lässt sich der Algorithmus so beschreiben:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
   '''findeKuerzestenWegBacktracking (pNode)'''&lt;br /&gt;
     '''Abbruchbedingung:'''&lt;br /&gt;
       Wenn pNode das Ziel ist ''(d.h. der Lösungsvektor ist vollständig!)''&lt;br /&gt;
       dann vergleiche aktuellerWeg mit besterWeg&lt;br /&gt;
            und aktualisiere diesen, wenn es nötig ist.&lt;br /&gt;
     '''Betrachte der Reihe nach alle Nachbarn von pNode.'''&lt;br /&gt;
     Für jeden Nachbarn wird folgendes getan:&lt;br /&gt;
     - den Nachbar zu aktuellerWeg hinzufügen (''d.h. der Lösungsvektor wird erweitert!'')&lt;br /&gt;
     - aktuelleLaenge entsprechend erhöhen&lt;br /&gt;
     - den Nachbarn markieren&lt;br /&gt;
     - '''findeKuerzstestenWegBacktracking (nachbar) aufrufen'''&lt;br /&gt;
     - die Änderungen wieder rückgängig machen (''d.h. die Wahl wird rückgängig gemacht!'')&lt;br /&gt;
       - den Nachbarn aus aktuellerWeg entfernen&lt;br /&gt;
       - aktuelleDistanz wieder zurücksetzen&lt;br /&gt;
       - die Markierung des Nachbarn entfernen&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Implementierung==&lt;br /&gt;
Die Implementierung setzt auf die Klasse [[Graph]] auf.&lt;br /&gt;
&lt;br /&gt;
Damit während des Backtracking auf die wesentlichen Daten zugegriffen werden kann, werden diese in Attributen gespeichert.&lt;br /&gt;
&lt;br /&gt;
Die wesentlichen Methoden sind die folgenden:&lt;br /&gt;
* die '''Rahmenmethode''' &amp;lt;code&amp;gt;kuerzestenWegFinden(String pStart, String pZiel)&amp;lt;/code&amp;gt;: In der Rahmenmethode wird alles für das rekursive Backtracking vorbereitet.&lt;br /&gt;
* die '''rekursive Backtracking-Methode''' &amp;lt;code&amp;gt;kuerzestenWegFindenBacktracking(GraphNode pNode)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    '''// Attribute'''&lt;br /&gt;
    public GraphWithViewer graph;&lt;br /&gt;
 &lt;br /&gt;
    '''// Attribute fuer das Backtracking'''&lt;br /&gt;
    public ListWithViewer&amp;lt;GraphNode&amp;gt; besterWeg;&lt;br /&gt;
    public ListWithViewer&amp;lt;GraphNode&amp;gt; aktuellerWeg;&lt;br /&gt;
    public int besteLaenge;&lt;br /&gt;
    public int aktuelleLaenge;&lt;br /&gt;
    public GraphNode start;&lt;br /&gt;
    public GraphNode ziel;&lt;br /&gt;
 &lt;br /&gt;
    '''//Methoden'''&lt;br /&gt;
 &lt;br /&gt;
    '''public ListWithViewer&amp;lt;GraphNode&amp;gt; kuerzestenWegFinden(String pStart, String pZiel){'''&lt;br /&gt;
        graph.resetMarks();&lt;br /&gt;
 &lt;br /&gt;
        start = graph.getNode(pStart);&lt;br /&gt;
        ziel = graph.getNode(pZiel);&lt;br /&gt;
 &lt;br /&gt;
        besterWeg = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
        aktuellerWeg = new ListWithViewer&amp;lt;&amp;gt;();&lt;br /&gt;
 &lt;br /&gt;
        besteLaenge = 10000000;&lt;br /&gt;
        aktuelleLaenge = 0;&lt;br /&gt;
 &lt;br /&gt;
        start.mark();&lt;br /&gt;
        aktuellerWeg.append(start);&lt;br /&gt;
       &lt;br /&gt;
        kuerzestenWegFindenBacktracking(start);&lt;br /&gt;
  &lt;br /&gt;
        return besterWeg;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''private void kuerzestenWegFindenBacktracking(GraphNode pNode) {'''&lt;br /&gt;
        if(pNode.equals(ziel)){&lt;br /&gt;
            if(aktuelleLaenge &amp;lt; besteLaenge){&lt;br /&gt;
                // besterWeg leeren&lt;br /&gt;
                for(besterWeg.toFirst();!besterWeg.isEmpty();){&lt;br /&gt;
                    besterWeg.remove();&lt;br /&gt;
                }&lt;br /&gt;
                // aktuellerWeg in besterWeg kopieren&lt;br /&gt;
                for(aktuellerWeg.toFirst();aktuellerWeg.hasAccess();aktuellerWeg.next()){&lt;br /&gt;
                    besterWeg.append(aktuellerWeg.getObject());&lt;br /&gt;
                }&lt;br /&gt;
                besteLaenge = aktuelleLaenge;&lt;br /&gt;
            }&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        List&amp;lt;GraphNode&amp;gt; nachbarn = graph.getNeighbours(pNode);&lt;br /&gt;
        for(nachbarn.toFirst(); nachbarn.hasAccess(); nachbarn.next()){&lt;br /&gt;
            GraphNode derNachbar = nachbarn.getContent();&lt;br /&gt;
            if(!derNachbar.isMarked()){&lt;br /&gt;
                derNachbar.mark();&lt;br /&gt;
                aktuellerWeg.append(derNachbar);&lt;br /&gt;
                double distanz = graph.getEdgeWeight(derNachbar, pNode);&lt;br /&gt;
                aktuelleLaenge += distanz;&lt;br /&gt;
               &lt;br /&gt;
                '''kuerzestenWegFindenBacktracking(derNachbar);'''&lt;br /&gt;
               &lt;br /&gt;
                aktuelleLaenge -= distanz;&lt;br /&gt;
                aktuellerWeg.toLast();&lt;br /&gt;
                aktuellerWeg.remove();&lt;br /&gt;
                derNachbar.unmark();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Backtracking für Arrays: Magisches Quadrat=&lt;br /&gt;
In ein '''magisches Quadrat''' werden die Zahlen von 1 bis 9 (bzw. 1 bis 16, 1 bis 25, ...) eingetragen.&lt;br /&gt;
Die Summe muss in jeder Zeile, Spalte und Diagonale gleich sein.&lt;br /&gt;
&lt;br /&gt;
Lösungen dieses Problems lassen sich gut mit Backtracking finden.&lt;br /&gt;
&lt;br /&gt;
==Implementierung==&lt;br /&gt;
Die folgende Implementierung löst ein 3x3 Quadrat.&lt;br /&gt;
* Als Datenstruktur muss nur das Quadrat bereitgestellt werden, das ein 3x3-Array ist.&lt;br /&gt;
* Die Stufen des Backtracking-Verfahrens sind hier die Felder; dabei gehen die Stufen von 0 bis 8.&lt;br /&gt;
* Aus der Stufe kann man die Koordinaten des Feldes berechnen.&lt;br /&gt;
* Das eigentliche Backtracking findet in der Methode &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;public void findeLoesung(int pStufe)&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; statt; diese Methode wird von der Rahmenmethode &amp;lt;code&amp;gt;public void findeLoesung()&amp;lt;/code&amp;gt; aufgerufen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class MagischesQuadratFertig {&lt;br /&gt;
 &lt;br /&gt;
    private int[][] quadrat;&lt;br /&gt;
   &lt;br /&gt;
    MagischesQuadratFertig(){&lt;br /&gt;
        quadrat = new int[3][3];&lt;br /&gt;
        initialisiere();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void initialisiere(){&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                quadrat[x][y] = 0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void findeLoesung(){&lt;br /&gt;
        findeLoesung(0);&lt;br /&gt;
        System.out.println(&amp;quot;*** Loesung: ***&amp;quot;);&lt;br /&gt;
        this.ausgeben();&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//Die eigentliche Backtracking-Methode!'''&lt;br /&gt;
    &amp;lt;u&amp;gt;'''public boolean findeLoesung(int pStufe){'''&amp;lt;/u&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        ausgeben();&lt;br /&gt;
       &lt;br /&gt;
        // Abbruch, wenn pStufe ueber das Quadrat hinausgeht.&lt;br /&gt;
        if(pStufe == 3*3){&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
       &lt;br /&gt;
        // aus pStufe die x-Koordinate und die y-Koordinate berechnen&lt;br /&gt;
        int x = pStufe % 3;&lt;br /&gt;
        int y = pStufe / 3;&lt;br /&gt;
   &lt;br /&gt;
        // jetzt fuer pStude alle Moeglichkeiten durchlaufen,&lt;br /&gt;
        // d.h. die Zahlen von 1 bis 9&lt;br /&gt;
        for(int i=1; i&amp;lt;= 3*3; i++){&lt;br /&gt;
            // die Zahl i an die richtige Stelle in das Quadrat eintragen&lt;br /&gt;
            quadrat[x][y] = i;&lt;br /&gt;
 &lt;br /&gt;
            // Wenn es die Zahl schon einmal gibt, dann zur naechsten Zahl weiter.&lt;br /&gt;
            if(esGibtDoppelte()){&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
  &lt;br /&gt;
            // wenn man ein magisches Quadrat gefunden hat, dann true zurueckgeben.&lt;br /&gt;
            if(magisch()){&lt;br /&gt;
                return true;&lt;br /&gt;
            }&lt;br /&gt;
           &lt;br /&gt;
            // es gibt keine Doppelten, aber das Quadrat ist (noch) nicht magisch&lt;br /&gt;
            // d.h. man baut die Teilloesung weiter aus.&lt;br /&gt;
            // Dafuer ein rekursiver Aufruf fuer die naechsthoehere Stufe.&lt;br /&gt;
            // Der Aufruf gibt zurueck, ob das Ausbauen der Teilloesung zum Erfolg fuehrte.&lt;br /&gt;
            boolean fertig = findeLoesung(pStufe + 1);&lt;br /&gt;
            if(fertig){&lt;br /&gt;
                return true;&lt;br /&gt;
            }&lt;br /&gt;
        } // end for&lt;br /&gt;
       &lt;br /&gt;
        // Auf dieser Stufe wurden alle Zahlen von 1 bis 9 durchprobiert, ohne Erfolg.&lt;br /&gt;
        // Man loescht die Information auf dieser Stufe...&lt;br /&gt;
        quadrat[x][y] = 0;&lt;br /&gt;
        // und gibt false zurueck&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public boolean esGibtDoppelte(){&lt;br /&gt;
        boolean[] dabei = new boolean[3*3+1];&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                int index = quadrat[x][y];&lt;br /&gt;
                if(index != 0 &amp;amp;&amp;amp; dabei[index]){&lt;br /&gt;
                    return true;&lt;br /&gt;
                }&lt;br /&gt;
                dabei[index] = true;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public boolean magisch(){&lt;br /&gt;
        if(esGibtDoppelte()){&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
        // Summen testen&lt;br /&gt;
        int s=0, t=0;&lt;br /&gt;
        // 1. Diagonale&lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) s+=quadrat[x][x];&lt;br /&gt;
        //2. Diagonale&lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) t+=quadrat[3-x-1][x];&lt;br /&gt;
        if (t != s) return false;&lt;br /&gt;
        // Zeilen&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            int k=0;&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                k += quadrat[x][y];&lt;br /&gt;
            }&lt;br /&gt;
            if (k != s) return false;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
            int k=0;&lt;br /&gt;
            for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
                k += quadrat[x][y];&lt;br /&gt;
            }&lt;br /&gt;
            if (k != s) return false;&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println(&amp;quot;*** It's magic!!! ***&amp;quot;);&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public void ausgeben(){&lt;br /&gt;
        for ( int y=0 ; y &amp;lt; 3 ; y++ ) {&lt;br /&gt;
            for ( int x=0 ; x &amp;lt; 3 ; x++ ) {&lt;br /&gt;
                System.out.print(quadrat[x][y]);&lt;br /&gt;
            }&lt;br /&gt;
            System.out.print(&amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        MagischesQuadratFertig mq = new MagischesQuadratFertig();&lt;br /&gt;
        mq.findeLoesung();&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Aufgabe: Backtracking für Arrays: Rucksackproblem selber programmieren=&lt;br /&gt;
Das '''Rucksackproblem''' lässt anhand des folgenden Beispiels beschreiben:&lt;br /&gt;
* In einen Rucksack kann man 200kg laden (=ganz schön schwer...).&lt;br /&gt;
* Es gibt die folgenden Gewichte: 28, 57, 33, 18, 99, 42, 17, 52&lt;br /&gt;
* '''Welche Gewichte muss man in den Rucksack laden, damit die 200kg möglichst gut ausgenutzt, aber nicht überschritten werden?'''&lt;br /&gt;
&lt;br /&gt;
==Implementierung zum Selbermachen==&lt;br /&gt;
Die folgende Implementierung hält neben &amp;lt;code&amp;gt;gewichte&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;maxGewicht&amp;lt;/code&amp;gt; noch folgende Datenstrukturen bereit:&lt;br /&gt;
* &amp;lt;code&amp;gt;boolean[] dabei&amp;lt;/code&amp;gt;: In diesem Array wird festgehalten, welche der Gewichte bei der aktuell untersuchten Lösung dabei sind.&lt;br /&gt;
* &amp;lt;code&amp;gt;int erreichtesGewicht&amp;lt;/code&amp;gt;: Hier wird festgehalten, welches Gewicht die aktuell untersuchte Lösung hat.&lt;br /&gt;
* &amp;lt;code&amp;gt;boolean[] besteLoesung&amp;lt;/code&amp;gt;: In diesem Array wird die bisher beste Loesung festgehalten. &lt;br /&gt;
* &amp;lt;code&amp;gt;int bestesGewicht&amp;lt;/code&amp;gt;: Hier wird festgehalten, welches Gewicht die bisher beste Lösung hat.&lt;br /&gt;
Diese Variablen müssen natürlich im Laufe des Backtracking immer aktualisiert werden.&lt;br /&gt;
&lt;br /&gt;
'''Die Implementierung ist noch nicht vollständig; der Backtracking-Teil muss hier noch programmiert werden; dafür muss die Methode &amp;lt;u&amp;gt;&amp;lt;code&amp;gt;sucheBesteLoesung(int pStufe)&amp;lt;/code&amp;gt;&amp;lt;/u&amp;gt; ergänzt werden.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Viel Spaß beim Programmieren!'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Rucksackproblem {&lt;br /&gt;
    public int[] gewichte = {28, 57, 33, 18, 99, 42, 17, 52};&lt;br /&gt;
    public int maxGewicht = 200;&lt;br /&gt;
   &lt;br /&gt;
    public boolean[] dabei = new boolean[gewichte.length];&lt;br /&gt;
    public int erreichtesGewicht = 0;&lt;br /&gt;
   &lt;br /&gt;
    public boolean[] besteLoesung = new boolean[gewichte.length];&lt;br /&gt;
    public int bestesGewicht = 0;&lt;br /&gt;
   &lt;br /&gt;
    public void sucheBesteLoesung(){&lt;br /&gt;
        //Vorbereitung&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            dabei[i] = false;&lt;br /&gt;
        }&lt;br /&gt;
        kopiereInBesteLoesung();&lt;br /&gt;
        // los gehts!&lt;br /&gt;
        sucheBesteLoesung(0);&lt;br /&gt;
        System.out.println(&amp;quot;*** Beste Loesung: ***&amp;quot;);&lt;br /&gt;
        ausgeben(besteLoesung);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;u&amp;gt;public void sucheBesteLoesung(int pStufe) {&amp;lt;/u&amp;gt;&lt;br /&gt;
        dabeiArrayAusgeben();&lt;br /&gt;
        &amp;lt;u&amp;gt;//TODO&amp;lt;/u&amp;gt;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public void ausgeben(boolean[] b){&lt;br /&gt;
        System.out.print(berechneGewicht(b)+&amp;quot;: &amp;quot;);&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            if(b[i]){&lt;br /&gt;
                System.out.print(gewichte[i]+&amp;quot;,&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public void dabeiArrayAusgeben(){&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            if(dabei[i]){&lt;br /&gt;
                System.out.print(&amp;quot;+&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                System.out.print(&amp;quot;-&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        System.out.println();&lt;br /&gt;
    } &lt;br /&gt;
   &lt;br /&gt;
    public void kopiereInBesteLoesung(){&lt;br /&gt;
        for(int i=0; i&amp;lt;dabei.length; i++){&lt;br /&gt;
            besteLoesung[i] = dabei[i];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public int berechneGewicht(boolean[] p){&lt;br /&gt;
        int ergebnis = 0;&lt;br /&gt;
        for(int i=0; i&amp;lt;p.length; i++){&lt;br /&gt;
            if(p[i]){&lt;br /&gt;
                ergebnis += gewichte[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    public static void main(String[] args) {&lt;br /&gt;
        Rucksackproblem rp = new Rucksackproblem();&lt;br /&gt;
        rp.sucheBesteLoesung();&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2295</id>
		<title>Binärer Suchbaum</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2295"/>
		<updated>2016-08-10T08:09:09Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Eigenschaften eines Suchbaumes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
[[File:Binbaum.jpg|thumb|Binärer Suchbaum mit 15 Elementen |600px]]&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
Ein binärer Suchbaum ist ein [[allgemeiner Binärbaum ab Abi 2017|Binärbaum]] mit einer zusätzlichen Eigenschaft:&lt;br /&gt;
* die Elemente im linken Teilbaum sind ''kleiner'' als die Wurzel; die Elemente im rechten Teilbaum sind ''größer'' als die Wurzel.&lt;br /&gt;
* Diese Eigenschaft gilt auch für alle Teilbäume eines binären Suchbaumes.&lt;br /&gt;
Wie ''kleiner'' bzw. ''größer'' definiert werden, hängt dabei vom Anwendungszusammenhang ab; bei Personen kann z.B. das Alter oder die alphabetische Ordnung des Nachnamens das wesentliche Ordnungskriterium sein.&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften eines Suchbaumes=&lt;br /&gt;
* In Binären Suchbäumen kann man sehr schnell Elemente finden (daher der Name...); vgl. [[binärer Suchbaum ab Abi 2017#Suchen (search)|Suchen von Elementen in einem Binären Suchbaum]]&lt;br /&gt;
* Der Inorder-Durchlauf (Links -&amp;gt; Wurzel -&amp;gt; Rechts) eines Suchbaumes ergibt genau die alphabetische Ordnung. (Zu den verschiedenen Durchlaufarten durch Binärbäume: s. [[allgemeiner Binärbaum ab Abi 2017#Traversierung|Traversierung von Binärbäumen]])&lt;br /&gt;
&lt;br /&gt;
=Schnittstelle des Zentralabiturs=&lt;br /&gt;
[[Medium:Dokumentation2017_BinarySearchTree_ComparableContent.pdf|Schnittstelle BinarySearchTree (PDF)]]&lt;br /&gt;
==Erläuterungen zur Schnittstelle ==&lt;br /&gt;
Die Schnittstelle des Zentralabiturs besteht aus zwei Klassen:&lt;br /&gt;
* &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; ist der eigentliche binäre Suchbaum.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComparableCOntent&amp;lt;/code&amp;gt;: In einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; können nur Objekte eingefügt werden, die die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren. &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; erzwingt die Implementierung der Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt;. Dadurch wird festgelegt, wie Objekte in den Suchbaum einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
=Beispiel: Verwendung von &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt;=&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; sollen in einen binären Suchbaum eingefügt bzw. nach bestimmten Titeln gesucht werden. Dabei soll das Ordnungskriterium die alphabetische Ordnung nach dem Titel sein. &lt;br /&gt;
&lt;br /&gt;
Dafür muss die Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren und die Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt; so überschreiben, dass die Bücher nach dem Titel verglichen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Buch &amp;lt;u&amp;gt;&amp;lt;b&amp;gt;implements ComparableContent&amp;lt;Buch&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt;{&lt;br /&gt;
   private String titel;&lt;br /&gt;
   private int regalNr;&lt;br /&gt;
   &lt;br /&gt;
   public Buch(String pTitel, int pRegalNr){&lt;br /&gt;
      titel = pTitel;&lt;br /&gt;
      regalNr = pRegalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public int getRegalNr() {&lt;br /&gt;
      return regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public void setRegalNr(int regalNr) {&lt;br /&gt;
      this.regalNr = regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public String getTitel() {&lt;br /&gt;
      return titel;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;b&amp;gt;&amp;lt;u&amp;gt;public boolean isEqual(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.equals(pBuch.getTitel())){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isLess(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;lt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isGreater(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;gt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&amp;lt;/b&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt können z.B. in einer Klasse &amp;lt;code&amp;gt;Bibliothek&amp;lt;/code&amp;gt; Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; in einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Bibliothek{&lt;br /&gt;
   &lt;br /&gt;
      //hier werden die Buecher gespeichert&lt;br /&gt;
      BinarySearchTree&amp;lt;Buch&amp;gt; buecherBaum;&lt;br /&gt;
 &lt;br /&gt;
      public Bibliothek(){&lt;br /&gt;
         buecherBaum = new BinarySearchTree&amp;lt;Buch&amp;gt;();&lt;br /&gt;
       }  &lt;br /&gt;
 &lt;br /&gt;
      '''public void uebertrageListeInBaum(List&amp;lt;Buch&amp;gt; buecherListe)'''{&lt;br /&gt;
         for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){&lt;br /&gt;
            Buch aktuellesBuch = buecherListe.getContent();&lt;br /&gt;
            &amp;lt;u&amp;gt;buecherBaum.insert(aktuellesBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
     &lt;br /&gt;
      '''public Buch suche(String pTitel)'''{&lt;br /&gt;
          // man muss erst ein Dummy-Buch erzeugen&lt;br /&gt;
          // nach dem kann man dann suchen&lt;br /&gt;
          &amp;lt;u&amp;gt;Buch dummyBuch = new Buch(pTitel, -1);&amp;lt;/u&amp;gt;&lt;br /&gt;
          Buch ergebnis = &amp;lt;u&amp;gt;buecherBaum.search(dummyBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
          return ergebnis;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterungen zur Methode &amp;lt;code&amp;gt;public Buch suche(String pTitel)&amp;lt;/code&amp;gt;''':&lt;br /&gt;
&lt;br /&gt;
Die Implementierung sieht auf den ersten Blick etwas eigenwillig aus, ist aber die einfachste und schnellste. Warum wird das so gemacht?&lt;br /&gt;
&lt;br /&gt;
* In Objekten vom Typ &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;Buch&amp;gt;&amp;lt;/code&amp;gt; kann man nur nach Objekten vom Typ &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; suchen.&lt;br /&gt;
* D.h. man muss erst ein &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; erstellen, das den gewünschten Titel trägt.&lt;br /&gt;
* Da &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert, kann man mithilfe von &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
* &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; gibt dann das &amp;quot;richtige&amp;quot; gesuchte Buch zurück.&lt;br /&gt;
* WICHTIG: &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; ist das &amp;quot;richtige&amp;quot; Buch; &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; wurde nur dafür erstellt, damit man nach einem Titel suchen kann!&lt;br /&gt;
&lt;br /&gt;
=Die Klassen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
* Der BinarySearchTree ''hat'' einen &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; als einziges Attribut, er ''besteht'' also eigentlich nur aus einem &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; hat die Attribute &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; (Wurzelinhalt), &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; (linker und rechter Teilbaum).&lt;br /&gt;
* Analog zu den Klassen [[Queue ab Abi 2017|Queue]] und [[Stack ab Abi 2017|Stack]] wird die Verbindung der Elemente der Datenstruktur also über die Nodes (auch hier: innere (Hilfs-)Klasse) umgesetzt.&lt;br /&gt;
&lt;br /&gt;
Der Beginn der Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class BinarySearchTree&amp;lt;ContentType extends ComparableContent&amp;lt;ContentType&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
    private BSTNode&amp;lt;ContentType&amp;gt; node;&lt;br /&gt;
 &lt;br /&gt;
    // usw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die innere (Hilfs-)Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  private class BSTNode&amp;lt;CT extends ComparableContent&amp;lt;CT&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
     private CT content;&lt;br /&gt;
     private BinarySearchTree&amp;lt;CT&amp;gt; left, right;&lt;br /&gt;
 &lt;br /&gt;
     public BSTNode(CT pContent) {&lt;br /&gt;
        // Der Knoten hat einen linken und rechten Teilbaum, die&lt;br /&gt;
        // beide von null verschieden sind. Also hat ein Blatt immer zwei&lt;br /&gt;
        // leere Teilbaeume unter sich.&lt;br /&gt;
        this.content = pContent;&lt;br /&gt;
        left = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
        right = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ComparableContent: Java-Quellcode==&lt;br /&gt;
Das Interface &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; stellt sicher, dass nur Objekte in einen '''binären Suchbaum''' eingefügt werden, die man miteinander vergleichen kann. (Ohne Objekte als ''größer'', ''gleich'' oder ''kleiner'' vergleichen zu können, wäre ein binärer Suchbaum natürlich sinnlos, man könnte keine Sortierung auf linke und rechte Teilbäume vornehmen.)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public interface ComparableContent&amp;lt;ContentType&amp;gt; {&lt;br /&gt;
    public boolean isEqual(ContentType pContent);&lt;br /&gt;
    public boolean isLess(ContentType pContent);&lt;br /&gt;
    public boolean isGreater(ContentType pContent);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Methoden werden in &amp;lt;code&amp;gt;ContentType&amp;lt;/code&amp;gt; nur deklariert, aber nicht implementiert!&lt;br /&gt;
* Jede Klasse, die &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert (Syntax: &amp;lt;code&amp;gt;public MyClass '''implements ComparableContent'''&amp;lt;/code&amp;gt;), muss diese drei Methoden überschreiben und eine Implementierung anbieten.&lt;br /&gt;
&lt;br /&gt;
=Suchen (search)=&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt;, um Elemente im Baum zu suchen.&lt;br /&gt;
&lt;br /&gt;
Ist das Element enthalten, wird es zurückgegeben. Dies mag auf den ersten Blick sinnlos erscheinen, bietet aber die Möglichkeit, sich ein Objekt mit einem bestimmten Attributwert zu holen, indem man zunächst ein Dummy-Objekt erstellt, das mit dem gesuchten Objekt nur in diesem Attributwert übereinstimmt und sich damit das zugehörige ''wirkliche Objekt'' aus dem &amp;lt;code&amp;gt;BinaryTree&amp;lt;/code&amp;gt; sucht. (''Die überschriebene Methode &amp;lt;code&amp;gt;isEqual()&amp;lt;/code&amp;gt; darf natürlich nur Gleichheit genau auf diesem Attribut testen!'')   -&amp;gt; s. auch Beispiel oben: '''public Buch suche(String pTitel)'''!&lt;br /&gt;
&lt;br /&gt;
Binäre Suchbäume haben den Vorteil, dass man in ihnen sehr schnell Elemente suchen kann: Man muss nicht den ganzen Baum zu durchsuchen, sondern kann - ausgehend von der Wurzel - einen Pfad bis zum Blatt abgehen. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. (''In der Abiturklasse ist allerdings kein klassischer [[Binärbaum (Methoden) ab Abi 2017#Durchlaufen eines Pfades|Pfaddurchlauf]] (mit while-Schleife etc.) umgesetzt, sondern eine rekursive Variante gewählt worden, die aber auch nur den einen notwendigen Pfad durchläuft.'')&lt;br /&gt;
&lt;br /&gt;
==Implementierung (LK)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public ContentType search(ContentType pContent) {&lt;br /&gt;
    if (this.isEmpty() || pContent == null) {&lt;br /&gt;
        // Abbrechen, da es kein Element zu suchen gibt.&lt;br /&gt;
        return null;&lt;br /&gt;
    } else {&lt;br /&gt;
        ContentType content = this.getContent();&lt;br /&gt;
        if (pContent.isLess(content)) {&lt;br /&gt;
            // Element wird im linken Teilbaum gesucht.&lt;br /&gt;
            return this.getLeftTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isGreater(content)) {&lt;br /&gt;
            // Element wird im rechten Teilbaum gesucht.&lt;br /&gt;
            return this.getRightTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isEqual(content)) {&lt;br /&gt;
            // Element wurde gefunden.&lt;br /&gt;
            return content;&lt;br /&gt;
        } else {&lt;br /&gt;
             // Dieser Fall sollte nicht auftreten.&lt;br /&gt;
            return null;&lt;br /&gt;
         }&lt;br /&gt;
    } &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Einfügen (insert)=&lt;br /&gt;
Um Elemente in einen binären Suchbaum einzufügen, muss man ausgehend von der Wurzel einen Pfad bis zu einem leeren Knoten abgehen und dort den eizufügenden Inhalt hineinschreiben. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. Sobald man einen leeren Knoten gefunden hat, ist man an der richtigen Stelle, wo man das Element einfügen kann. In der Abiturklasse wird diese Strategie rekursiv umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Implementierung (LK) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public void insert(ContentType pContent) {&lt;br /&gt;
    if (pContent != null) {&lt;br /&gt;
       if (isEmpty()) {&lt;br /&gt;
          this.node = new BSTNode&amp;lt;ContentType&amp;gt;(pContent);&lt;br /&gt;
       } else if (pContent.isLess(this.node.content)) {&lt;br /&gt;
          this.node.left.insert(pContent);&lt;br /&gt;
       } else if(pContent.isGreater(this.node.content)) {&lt;br /&gt;
          this.node.right.insert(pContent);&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Löschen (remove)=&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet neben der Methode &amp;lt;code&amp;gt;insert&amp;lt;/code&amp;gt; auch die Methode &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, mit der man ein Element aus einem Suchbaum löschen kann - und die Suchbaumstruktur bleibt gewahrt!&lt;br /&gt;
&lt;br /&gt;
Das ist sehr angenehm, denn das Löschen von Elementen aus einem Suchbaum ist eine SEHR mühsame Angelegenheit, weil man genau darauf achten muss, dass die Suchbaum-Struktur nicht zerstört wird.&lt;br /&gt;
&lt;br /&gt;
'''Im folgenden wird dargestellt, wie das Löschen von Elementen aus einem Binären Suchbaum funktioniert.'''&lt;br /&gt;
&lt;br /&gt;
==Implementierung einer Löschmethode==&lt;br /&gt;
[[Datei:loeschen_von_elementen_aus_baeumen.png|400px|thumb|right|Beispiel: Löschen der 34]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt; Diese Methode ist '''nicht''' relevant für das Zentralabitur! &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen von Knoten aus binären Suchbäumen ist insofern nicht ganz einfach, als man darauf achten muss, dass die Struktur des binären Suchbaums nicht zerstört wird. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;font color='green'&amp;gt; TODO: Implementierung des Löschens auf Abi 2017 anpassen!!!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
'''Standardfall'''&lt;br /&gt;
# Den richtigen Knoten suchen: '''K0'''. Außerdem braucht man den '''Vorgänger von K0'''&lt;br /&gt;
# Suche im linken Teilbaum von K0 den Knoten, der am weitesten rechts ist: '''K1'''. Außerdem braucht man den '''Vorgänger von K1'''&lt;br /&gt;
# Hänge den (linken!) Nachfolger von K1 an den Vorgänger von K1.&lt;br /&gt;
# K1 ersetzt jetzt K0, d.h. der Inhalt von K1 wird jetzt in den Knoten K0 geschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ausnahmefälle'''&lt;br /&gt;
&lt;br /&gt;
# K0 ist ein Blatt → einfach löschen.&lt;br /&gt;
# Die Wurzel des Gesamtbaumes enthält das zu löschende Element&lt;br /&gt;
## TODO&lt;br /&gt;
# K0 hat keinen linken Teilbaum → Der Nachfolger von K0 ersetzt K0, d.h.:&lt;br /&gt;
## Im Vorgänger von K0 wird der Nachfolger von K0 als (richtigen!) Nachfolger eingetragen.&lt;br /&gt;
&lt;br /&gt;
'''benötigte Methoden'''&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;public boolean istBlatt(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK0Vorgaenger(BinaryTree pTree, Object pObject)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK1Vorgaenger(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public void loeschen(BinaryTree b, String zahl) {&lt;br /&gt;
    if(b.isEmpty())&lt;br /&gt;
    {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    // wenn das zu loeschende Element die Wurzel ist:&lt;br /&gt;
    // 1. an einen Vater-Knoten anhaengen&lt;br /&gt;
    // 2. loeschen&lt;br /&gt;
    // 3. vaterknoten wieder wegnehmen	&lt;br /&gt;
    if(b.getObject().equals(zahl)){&lt;br /&gt;
      BinaryTree vater = new BinaryTree(&amp;quot;-999999&amp;quot;);&lt;br /&gt;
      vater.setRightTree(b);&lt;br /&gt;
      loeschen(vater, zahl);&lt;br /&gt;
      b = vater.getRightTree();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    BinaryTree K0vorgaenger = this.findeVorgaengerKnoten(b,zahl );&lt;br /&gt;
    System.out.println(&amp;quot;Vorgänger von K0:&amp;quot; + K0vorgaenger.getObject());&lt;br /&gt;
  &lt;br /&gt;
    boolean K0haengtLinksAmVorgaenger = true;&lt;br /&gt;
    BinaryTree K0 = K0vorgaenger.getLeftTree();&lt;br /&gt;
    if(!K0vorgaenger.getRightTree().isEmpty() &amp;amp;&amp;amp; &lt;br /&gt;
      zahl.equals(K0vorgaenger.getRightTree().getObject()))&lt;br /&gt;
    {	&lt;br /&gt;
      K0 = K0vorgaenger.getRightTree();&lt;br /&gt;
      K0haengtLinksAmVorgaenger = false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    String K0String = (String) K0.getObject();&lt;br /&gt;
    System.out.println(&amp;quot;K0String: &amp;quot;+K0String);&lt;br /&gt;
  &lt;br /&gt;
    if(istBlatt(K0)){&lt;br /&gt;
      System.out.println(&amp;quot;istBlatt!&amp;quot;);&lt;br /&gt;
      if(K0haengtLinksAmVorgaenger){&lt;br /&gt;
        K0vorgaenger.setLeftTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      else{&lt;br /&gt;
        K0vorgaenger.setRightTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if(K0.getLeftTree().isEmpty()){&lt;br /&gt;
      K0.setObject(K0.getRightTree().getObject());&lt;br /&gt;
      K0.setLeftTree(K0.getRightTree().getLeftTree());&lt;br /&gt;
      K0.setRightTree(K0.getRightTree().getRightTree());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    BinaryTree K1vorgaenger = vorgaengerVonAmWeitestenRechts(K0.getLeftTree());&lt;br /&gt;
    System.out.println(&amp;quot;K1vorgaenger: &amp;quot; + K1vorgaenger.getObject());&lt;br /&gt;
    BinaryTree K1 = K1vorgaenger.getRightTree();&lt;br /&gt;
    System.out.println(&amp;quot;K1: &amp;quot; + K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    K1vorgaenger.setRightTree(K1.getLeftTree());&lt;br /&gt;
    K0.setObject(K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private boolean istBlatt(BinaryTree pTree) {&lt;br /&gt;
    boolean ergebnis = pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty(); &lt;br /&gt;
    System.out.println(&amp;quot;istBlatt(&amp;quot;+pTree.getObject()+&amp;quot;): &amp;quot;+ergebnis);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private BinaryTree vorgaengerVonAmWeitestenRechts(BinaryTree pTree) {&lt;br /&gt;
    System.out.println(&amp;quot;vorgaengervonAmWeitestenRechts(&amp;quot;+pTree.getObject()+&amp;quot;)&amp;quot;);&lt;br /&gt;
    if(pTree.getRightTree().isEmpty()){&lt;br /&gt;
      System.err.println(&amp;quot;Fehler in vorgaengerVonAmWeitestenRechts&amp;quot;);&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    if(pTree.getRightTree().getRightTree().isEmpty()){&lt;br /&gt;
      return pTree;&lt;br /&gt;
    }&lt;br /&gt;
    BinaryTree ergebnis = this.vorgaengerVonAmWeitestenRechts(pTree.getRightTree());&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private BinaryTree findeVorgaengerKnoten(BinaryTree pTree, String zahl)&lt;br /&gt;
    {&lt;br /&gt;
      System.out.println(&amp;quot;findeVorgaengerKnoten(&amp;quot;+pTree.getObject()+&amp;quot;, &amp;quot;+zahl+&amp;quot;)&amp;quot;);&lt;br /&gt;
      if(zahl.equals(pTree.getObject())){&lt;br /&gt;
        System.err.println(zahl+&amp;quot;ist die Wurzel von pTree selber!!!&amp;quot;);&lt;br /&gt;
        return null;&lt;br /&gt;
      }&lt;br /&gt;
      boolean gefunden = false;&lt;br /&gt;
      int zahl1 = Integer.parseInt(zahl);&lt;br /&gt;
 &lt;br /&gt;
      BinaryTree ergebnis = pTree;&lt;br /&gt;
      while(gefunden == false){&lt;br /&gt;
        String wurzelString = (String) ergebnis.getObject();&lt;br /&gt;
        int wurzelInt = Integer.parseInt(wurzelString);&lt;br /&gt;
 &lt;br /&gt;
        System.out.println(&amp;quot;wurzelInt&amp;quot; + wurzelInt);&lt;br /&gt;
        System.out.println(&amp;quot;zahl&amp;quot; + zahl);&lt;br /&gt;
        System.out.println(&amp;quot;ergebnis.getObject(): &amp;quot; + ergebnis.getObject());&lt;br /&gt;
 &lt;br /&gt;
        if(zahl.equals(ergebnis.getRightTree().getObject()) || &lt;br /&gt;
           zahl.equals(ergebnis.getLeftTree().getObject()))&lt;br /&gt;
        {&lt;br /&gt;
          gefunden = true;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          if(zahl1 &amp;lt; wurzelInt){&lt;br /&gt;
            ergebnis = ergebnis.getLeftTree();&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            ergebnis = ergebnis.getRightTree();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2294</id>
		<title>Binärer Suchbaum</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2294"/>
		<updated>2016-08-10T08:06:26Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Suchen (search) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
[[File:Binbaum.jpg|thumb|Binärer Suchbaum mit 15 Elementen |600px]]&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
Ein binärer Suchbaum ist ein [[allgemeiner Binärbaum ab Abi 2017|Binärbaum]] mit einer zusätzlichen Eigenschaft:&lt;br /&gt;
* die Elemente im linken Teilbaum sind ''kleiner'' als die Wurzel; die Elemente im rechten Teilbaum sind ''größer'' als die Wurzel.&lt;br /&gt;
* Diese Eigenschaft gilt auch für alle Teilbäume eines binären Suchbaumes.&lt;br /&gt;
Wie ''kleiner'' bzw. ''größer'' definiert werden, hängt dabei vom Anwendungszusammenhang ab; bei Personen kann z.B. das Alter oder die alphabetische Ordnung des Nachnamens das wesentliche Ordnungskriterium sein.&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften eines Suchbaumes=&lt;br /&gt;
* In Binären Suchbäumen kann man sehr schnell Elemente finden (daher der Name...); vgl. [[binärer Suchbaum ab Abi 2017#Suchen von Elementen in einem Binären Suchbaum|Suchen von Elementen in einem Binären Suchbaum]]&lt;br /&gt;
* Der Inorder-Durchlauf (Links -&amp;gt; Wurzel -&amp;gt; Rechts) eines Suchbaumes ergibt genau die alphabetische Ordnung. (Zu den verschiedenen Durchlaufarten durch Binärbäume: s. [[allgemeiner Binärbaum ab Abi 2017#Traversierung|Traversierung von Binärbäumen]])&lt;br /&gt;
&lt;br /&gt;
=Schnittstelle des Zentralabiturs=&lt;br /&gt;
[[Medium:Dokumentation2017_BinarySearchTree_ComparableContent.pdf|Schnittstelle BinarySearchTree (PDF)]]&lt;br /&gt;
==Erläuterungen zur Schnittstelle ==&lt;br /&gt;
Die Schnittstelle des Zentralabiturs besteht aus zwei Klassen:&lt;br /&gt;
* &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; ist der eigentliche binäre Suchbaum.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComparableCOntent&amp;lt;/code&amp;gt;: In einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; können nur Objekte eingefügt werden, die die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren. &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; erzwingt die Implementierung der Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt;. Dadurch wird festgelegt, wie Objekte in den Suchbaum einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
=Beispiel: Verwendung von &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt;=&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; sollen in einen binären Suchbaum eingefügt bzw. nach bestimmten Titeln gesucht werden. Dabei soll das Ordnungskriterium die alphabetische Ordnung nach dem Titel sein. &lt;br /&gt;
&lt;br /&gt;
Dafür muss die Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren und die Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt; so überschreiben, dass die Bücher nach dem Titel verglichen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Buch &amp;lt;u&amp;gt;&amp;lt;b&amp;gt;implements ComparableContent&amp;lt;Buch&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt;{&lt;br /&gt;
   private String titel;&lt;br /&gt;
   private int regalNr;&lt;br /&gt;
   &lt;br /&gt;
   public Buch(String pTitel, int pRegalNr){&lt;br /&gt;
      titel = pTitel;&lt;br /&gt;
      regalNr = pRegalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public int getRegalNr() {&lt;br /&gt;
      return regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public void setRegalNr(int regalNr) {&lt;br /&gt;
      this.regalNr = regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public String getTitel() {&lt;br /&gt;
      return titel;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;b&amp;gt;&amp;lt;u&amp;gt;public boolean isEqual(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.equals(pBuch.getTitel())){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isLess(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;lt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isGreater(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;gt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&amp;lt;/b&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt können z.B. in einer Klasse &amp;lt;code&amp;gt;Bibliothek&amp;lt;/code&amp;gt; Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; in einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Bibliothek{&lt;br /&gt;
   &lt;br /&gt;
      //hier werden die Buecher gespeichert&lt;br /&gt;
      BinarySearchTree&amp;lt;Buch&amp;gt; buecherBaum;&lt;br /&gt;
 &lt;br /&gt;
      public Bibliothek(){&lt;br /&gt;
         buecherBaum = new BinarySearchTree&amp;lt;Buch&amp;gt;();&lt;br /&gt;
       }  &lt;br /&gt;
 &lt;br /&gt;
      '''public void uebertrageListeInBaum(List&amp;lt;Buch&amp;gt; buecherListe)'''{&lt;br /&gt;
         for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){&lt;br /&gt;
            Buch aktuellesBuch = buecherListe.getContent();&lt;br /&gt;
            &amp;lt;u&amp;gt;buecherBaum.insert(aktuellesBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
     &lt;br /&gt;
      '''public Buch suche(String pTitel)'''{&lt;br /&gt;
          // man muss erst ein Dummy-Buch erzeugen&lt;br /&gt;
          // nach dem kann man dann suchen&lt;br /&gt;
          &amp;lt;u&amp;gt;Buch dummyBuch = new Buch(pTitel, -1);&amp;lt;/u&amp;gt;&lt;br /&gt;
          Buch ergebnis = &amp;lt;u&amp;gt;buecherBaum.search(dummyBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
          return ergebnis;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterungen zur Methode &amp;lt;code&amp;gt;public Buch suche(String pTitel)&amp;lt;/code&amp;gt;''':&lt;br /&gt;
&lt;br /&gt;
Die Implementierung sieht auf den ersten Blick etwas eigenwillig aus, ist aber die einfachste und schnellste. Warum wird das so gemacht?&lt;br /&gt;
&lt;br /&gt;
* In Objekten vom Typ &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;Buch&amp;gt;&amp;lt;/code&amp;gt; kann man nur nach Objekten vom Typ &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; suchen.&lt;br /&gt;
* D.h. man muss erst ein &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; erstellen, das den gewünschten Titel trägt.&lt;br /&gt;
* Da &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert, kann man mithilfe von &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
* &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; gibt dann das &amp;quot;richtige&amp;quot; gesuchte Buch zurück.&lt;br /&gt;
* WICHTIG: &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; ist das &amp;quot;richtige&amp;quot; Buch; &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; wurde nur dafür erstellt, damit man nach einem Titel suchen kann!&lt;br /&gt;
&lt;br /&gt;
=Die Klassen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
* Der BinarySearchTree ''hat'' einen &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; als einziges Attribut, er ''besteht'' also eigentlich nur aus einem &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; hat die Attribute &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; (Wurzelinhalt), &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; (linker und rechter Teilbaum).&lt;br /&gt;
* Analog zu den Klassen [[Queue ab Abi 2017|Queue]] und [[Stack ab Abi 2017|Stack]] wird die Verbindung der Elemente der Datenstruktur also über die Nodes (auch hier: innere (Hilfs-)Klasse) umgesetzt.&lt;br /&gt;
&lt;br /&gt;
Der Beginn der Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class BinarySearchTree&amp;lt;ContentType extends ComparableContent&amp;lt;ContentType&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
    private BSTNode&amp;lt;ContentType&amp;gt; node;&lt;br /&gt;
 &lt;br /&gt;
    // usw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die innere (Hilfs-)Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  private class BSTNode&amp;lt;CT extends ComparableContent&amp;lt;CT&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
     private CT content;&lt;br /&gt;
     private BinarySearchTree&amp;lt;CT&amp;gt; left, right;&lt;br /&gt;
 &lt;br /&gt;
     public BSTNode(CT pContent) {&lt;br /&gt;
        // Der Knoten hat einen linken und rechten Teilbaum, die&lt;br /&gt;
        // beide von null verschieden sind. Also hat ein Blatt immer zwei&lt;br /&gt;
        // leere Teilbaeume unter sich.&lt;br /&gt;
        this.content = pContent;&lt;br /&gt;
        left = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
        right = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ComparableContent: Java-Quellcode==&lt;br /&gt;
Das Interface &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; stellt sicher, dass nur Objekte in einen '''binären Suchbaum''' eingefügt werden, die man miteinander vergleichen kann. (Ohne Objekte als ''größer'', ''gleich'' oder ''kleiner'' vergleichen zu können, wäre ein binärer Suchbaum natürlich sinnlos, man könnte keine Sortierung auf linke und rechte Teilbäume vornehmen.)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public interface ComparableContent&amp;lt;ContentType&amp;gt; {&lt;br /&gt;
    public boolean isEqual(ContentType pContent);&lt;br /&gt;
    public boolean isLess(ContentType pContent);&lt;br /&gt;
    public boolean isGreater(ContentType pContent);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Methoden werden in &amp;lt;code&amp;gt;ContentType&amp;lt;/code&amp;gt; nur deklariert, aber nicht implementiert!&lt;br /&gt;
* Jede Klasse, die &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert (Syntax: &amp;lt;code&amp;gt;public MyClass '''implements ComparableContent'''&amp;lt;/code&amp;gt;), muss diese drei Methoden überschreiben und eine Implementierung anbieten.&lt;br /&gt;
&lt;br /&gt;
=Suchen (search)=&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt;, um Elemente im Baum zu suchen.&lt;br /&gt;
&lt;br /&gt;
Ist das Element enthalten, wird es zurückgegeben. Dies mag auf den ersten Blick sinnlos erscheinen, bietet aber die Möglichkeit, sich ein Objekt mit einem bestimmten Attributwert zu holen, indem man zunächst ein Dummy-Objekt erstellt, das mit dem gesuchten Objekt nur in diesem Attributwert übereinstimmt und sich damit das zugehörige ''wirkliche Objekt'' aus dem &amp;lt;code&amp;gt;BinaryTree&amp;lt;/code&amp;gt; sucht. (''Die überschriebene Methode &amp;lt;code&amp;gt;isEqual()&amp;lt;/code&amp;gt; darf natürlich nur Gleichheit genau auf diesem Attribut testen!'')   -&amp;gt; s. auch Beispiel oben: '''public Buch suche(String pTitel)'''!&lt;br /&gt;
&lt;br /&gt;
Binäre Suchbäume haben den Vorteil, dass man in ihnen sehr schnell Elemente suchen kann: Man muss nicht den ganzen Baum zu durchsuchen, sondern kann - ausgehend von der Wurzel - einen Pfad bis zum Blatt abgehen. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. (''In der Abiturklasse ist allerdings kein klassischer [[Binärbaum (Methoden) ab Abi 2017#Durchlaufen eines Pfades|Pfaddurchlauf]] (mit while-Schleife etc.) umgesetzt, sondern eine rekursive Variante gewählt worden, die aber auch nur den einen notwendigen Pfad durchläuft.'')&lt;br /&gt;
&lt;br /&gt;
==Implementierung (LK)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public ContentType search(ContentType pContent) {&lt;br /&gt;
    if (this.isEmpty() || pContent == null) {&lt;br /&gt;
        // Abbrechen, da es kein Element zu suchen gibt.&lt;br /&gt;
        return null;&lt;br /&gt;
    } else {&lt;br /&gt;
        ContentType content = this.getContent();&lt;br /&gt;
        if (pContent.isLess(content)) {&lt;br /&gt;
            // Element wird im linken Teilbaum gesucht.&lt;br /&gt;
            return this.getLeftTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isGreater(content)) {&lt;br /&gt;
            // Element wird im rechten Teilbaum gesucht.&lt;br /&gt;
            return this.getRightTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isEqual(content)) {&lt;br /&gt;
            // Element wurde gefunden.&lt;br /&gt;
            return content;&lt;br /&gt;
        } else {&lt;br /&gt;
             // Dieser Fall sollte nicht auftreten.&lt;br /&gt;
            return null;&lt;br /&gt;
         }&lt;br /&gt;
    } &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Einfügen (insert)=&lt;br /&gt;
Um Elemente in einen binären Suchbaum einzufügen, muss man ausgehend von der Wurzel einen Pfad bis zu einem leeren Knoten abgehen und dort den eizufügenden Inhalt hineinschreiben. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. Sobald man einen leeren Knoten gefunden hat, ist man an der richtigen Stelle, wo man das Element einfügen kann. In der Abiturklasse wird diese Strategie rekursiv umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Implementierung (LK) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public void insert(ContentType pContent) {&lt;br /&gt;
    if (pContent != null) {&lt;br /&gt;
       if (isEmpty()) {&lt;br /&gt;
          this.node = new BSTNode&amp;lt;ContentType&amp;gt;(pContent);&lt;br /&gt;
       } else if (pContent.isLess(this.node.content)) {&lt;br /&gt;
          this.node.left.insert(pContent);&lt;br /&gt;
       } else if(pContent.isGreater(this.node.content)) {&lt;br /&gt;
          this.node.right.insert(pContent);&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Löschen (remove)=&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet neben der Methode &amp;lt;code&amp;gt;insert&amp;lt;/code&amp;gt; auch die Methode &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, mit der man ein Element aus einem Suchbaum löschen kann - und die Suchbaumstruktur bleibt gewahrt!&lt;br /&gt;
&lt;br /&gt;
Das ist sehr angenehm, denn das Löschen von Elementen aus einem Suchbaum ist eine SEHR mühsame Angelegenheit, weil man genau darauf achten muss, dass die Suchbaum-Struktur nicht zerstört wird.&lt;br /&gt;
&lt;br /&gt;
'''Im folgenden wird dargestellt, wie das Löschen von Elementen aus einem Binären Suchbaum funktioniert.'''&lt;br /&gt;
&lt;br /&gt;
==Implementierung einer Löschmethode==&lt;br /&gt;
[[Datei:loeschen_von_elementen_aus_baeumen.png|400px|thumb|right|Beispiel: Löschen der 34]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt; Diese Methode ist '''nicht''' relevant für das Zentralabitur! &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen von Knoten aus binären Suchbäumen ist insofern nicht ganz einfach, als man darauf achten muss, dass die Struktur des binären Suchbaums nicht zerstört wird. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;font color='green'&amp;gt; TODO: Implementierung des Löschens auf Abi 2017 anpassen!!!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
'''Standardfall'''&lt;br /&gt;
# Den richtigen Knoten suchen: '''K0'''. Außerdem braucht man den '''Vorgänger von K0'''&lt;br /&gt;
# Suche im linken Teilbaum von K0 den Knoten, der am weitesten rechts ist: '''K1'''. Außerdem braucht man den '''Vorgänger von K1'''&lt;br /&gt;
# Hänge den (linken!) Nachfolger von K1 an den Vorgänger von K1.&lt;br /&gt;
# K1 ersetzt jetzt K0, d.h. der Inhalt von K1 wird jetzt in den Knoten K0 geschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ausnahmefälle'''&lt;br /&gt;
&lt;br /&gt;
# K0 ist ein Blatt → einfach löschen.&lt;br /&gt;
# Die Wurzel des Gesamtbaumes enthält das zu löschende Element&lt;br /&gt;
## TODO&lt;br /&gt;
# K0 hat keinen linken Teilbaum → Der Nachfolger von K0 ersetzt K0, d.h.:&lt;br /&gt;
## Im Vorgänger von K0 wird der Nachfolger von K0 als (richtigen!) Nachfolger eingetragen.&lt;br /&gt;
&lt;br /&gt;
'''benötigte Methoden'''&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;public boolean istBlatt(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK0Vorgaenger(BinaryTree pTree, Object pObject)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK1Vorgaenger(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public void loeschen(BinaryTree b, String zahl) {&lt;br /&gt;
    if(b.isEmpty())&lt;br /&gt;
    {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    // wenn das zu loeschende Element die Wurzel ist:&lt;br /&gt;
    // 1. an einen Vater-Knoten anhaengen&lt;br /&gt;
    // 2. loeschen&lt;br /&gt;
    // 3. vaterknoten wieder wegnehmen	&lt;br /&gt;
    if(b.getObject().equals(zahl)){&lt;br /&gt;
      BinaryTree vater = new BinaryTree(&amp;quot;-999999&amp;quot;);&lt;br /&gt;
      vater.setRightTree(b);&lt;br /&gt;
      loeschen(vater, zahl);&lt;br /&gt;
      b = vater.getRightTree();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    BinaryTree K0vorgaenger = this.findeVorgaengerKnoten(b,zahl );&lt;br /&gt;
    System.out.println(&amp;quot;Vorgänger von K0:&amp;quot; + K0vorgaenger.getObject());&lt;br /&gt;
  &lt;br /&gt;
    boolean K0haengtLinksAmVorgaenger = true;&lt;br /&gt;
    BinaryTree K0 = K0vorgaenger.getLeftTree();&lt;br /&gt;
    if(!K0vorgaenger.getRightTree().isEmpty() &amp;amp;&amp;amp; &lt;br /&gt;
      zahl.equals(K0vorgaenger.getRightTree().getObject()))&lt;br /&gt;
    {	&lt;br /&gt;
      K0 = K0vorgaenger.getRightTree();&lt;br /&gt;
      K0haengtLinksAmVorgaenger = false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    String K0String = (String) K0.getObject();&lt;br /&gt;
    System.out.println(&amp;quot;K0String: &amp;quot;+K0String);&lt;br /&gt;
  &lt;br /&gt;
    if(istBlatt(K0)){&lt;br /&gt;
      System.out.println(&amp;quot;istBlatt!&amp;quot;);&lt;br /&gt;
      if(K0haengtLinksAmVorgaenger){&lt;br /&gt;
        K0vorgaenger.setLeftTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      else{&lt;br /&gt;
        K0vorgaenger.setRightTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if(K0.getLeftTree().isEmpty()){&lt;br /&gt;
      K0.setObject(K0.getRightTree().getObject());&lt;br /&gt;
      K0.setLeftTree(K0.getRightTree().getLeftTree());&lt;br /&gt;
      K0.setRightTree(K0.getRightTree().getRightTree());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    BinaryTree K1vorgaenger = vorgaengerVonAmWeitestenRechts(K0.getLeftTree());&lt;br /&gt;
    System.out.println(&amp;quot;K1vorgaenger: &amp;quot; + K1vorgaenger.getObject());&lt;br /&gt;
    BinaryTree K1 = K1vorgaenger.getRightTree();&lt;br /&gt;
    System.out.println(&amp;quot;K1: &amp;quot; + K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    K1vorgaenger.setRightTree(K1.getLeftTree());&lt;br /&gt;
    K0.setObject(K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private boolean istBlatt(BinaryTree pTree) {&lt;br /&gt;
    boolean ergebnis = pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty(); &lt;br /&gt;
    System.out.println(&amp;quot;istBlatt(&amp;quot;+pTree.getObject()+&amp;quot;): &amp;quot;+ergebnis);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private BinaryTree vorgaengerVonAmWeitestenRechts(BinaryTree pTree) {&lt;br /&gt;
    System.out.println(&amp;quot;vorgaengervonAmWeitestenRechts(&amp;quot;+pTree.getObject()+&amp;quot;)&amp;quot;);&lt;br /&gt;
    if(pTree.getRightTree().isEmpty()){&lt;br /&gt;
      System.err.println(&amp;quot;Fehler in vorgaengerVonAmWeitestenRechts&amp;quot;);&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    if(pTree.getRightTree().getRightTree().isEmpty()){&lt;br /&gt;
      return pTree;&lt;br /&gt;
    }&lt;br /&gt;
    BinaryTree ergebnis = this.vorgaengerVonAmWeitestenRechts(pTree.getRightTree());&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private BinaryTree findeVorgaengerKnoten(BinaryTree pTree, String zahl)&lt;br /&gt;
    {&lt;br /&gt;
      System.out.println(&amp;quot;findeVorgaengerKnoten(&amp;quot;+pTree.getObject()+&amp;quot;, &amp;quot;+zahl+&amp;quot;)&amp;quot;);&lt;br /&gt;
      if(zahl.equals(pTree.getObject())){&lt;br /&gt;
        System.err.println(zahl+&amp;quot;ist die Wurzel von pTree selber!!!&amp;quot;);&lt;br /&gt;
        return null;&lt;br /&gt;
      }&lt;br /&gt;
      boolean gefunden = false;&lt;br /&gt;
      int zahl1 = Integer.parseInt(zahl);&lt;br /&gt;
 &lt;br /&gt;
      BinaryTree ergebnis = pTree;&lt;br /&gt;
      while(gefunden == false){&lt;br /&gt;
        String wurzelString = (String) ergebnis.getObject();&lt;br /&gt;
        int wurzelInt = Integer.parseInt(wurzelString);&lt;br /&gt;
 &lt;br /&gt;
        System.out.println(&amp;quot;wurzelInt&amp;quot; + wurzelInt);&lt;br /&gt;
        System.out.println(&amp;quot;zahl&amp;quot; + zahl);&lt;br /&gt;
        System.out.println(&amp;quot;ergebnis.getObject(): &amp;quot; + ergebnis.getObject());&lt;br /&gt;
 &lt;br /&gt;
        if(zahl.equals(ergebnis.getRightTree().getObject()) || &lt;br /&gt;
           zahl.equals(ergebnis.getLeftTree().getObject()))&lt;br /&gt;
        {&lt;br /&gt;
          gefunden = true;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          if(zahl1 &amp;lt; wurzelInt){&lt;br /&gt;
            ergebnis = ergebnis.getLeftTree();&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            ergebnis = ergebnis.getRightTree();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2293</id>
		<title>Binärer Suchbaum</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rer_Suchbaum&amp;diff=2293"/>
		<updated>2016-08-10T07:55:17Z</updated>

		<summary type="html">&lt;p&gt;Mgrifka: /* Löschen (remove) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Datenstrukturen(IF)]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
[[File:Binbaum.jpg|thumb|Binärer Suchbaum mit 15 Elementen |600px]]&lt;br /&gt;
&lt;br /&gt;
=Definition=&lt;br /&gt;
Ein binärer Suchbaum ist ein [[allgemeiner Binärbaum ab Abi 2017|Binärbaum]] mit einer zusätzlichen Eigenschaft:&lt;br /&gt;
* die Elemente im linken Teilbaum sind ''kleiner'' als die Wurzel; die Elemente im rechten Teilbaum sind ''größer'' als die Wurzel.&lt;br /&gt;
* Diese Eigenschaft gilt auch für alle Teilbäume eines binären Suchbaumes.&lt;br /&gt;
Wie ''kleiner'' bzw. ''größer'' definiert werden, hängt dabei vom Anwendungszusammenhang ab; bei Personen kann z.B. das Alter oder die alphabetische Ordnung des Nachnamens das wesentliche Ordnungskriterium sein.&lt;br /&gt;
&lt;br /&gt;
=Eigenschaften eines Suchbaumes=&lt;br /&gt;
* In Binären Suchbäumen kann man sehr schnell Elemente finden (daher der Name...); vgl. [[binärer Suchbaum ab Abi 2017#Suchen von Elementen in einem Binären Suchbaum|Suchen von Elementen in einem Binären Suchbaum]]&lt;br /&gt;
* Der Inorder-Durchlauf (Links -&amp;gt; Wurzel -&amp;gt; Rechts) eines Suchbaumes ergibt genau die alphabetische Ordnung. (Zu den verschiedenen Durchlaufarten durch Binärbäume: s. [[allgemeiner Binärbaum ab Abi 2017#Traversierung|Traversierung von Binärbäumen]])&lt;br /&gt;
&lt;br /&gt;
=Schnittstelle des Zentralabiturs=&lt;br /&gt;
[[Medium:Dokumentation2017_BinarySearchTree_ComparableContent.pdf|Schnittstelle BinarySearchTree (PDF)]]&lt;br /&gt;
==Erläuterungen zur Schnittstelle ==&lt;br /&gt;
Die Schnittstelle des Zentralabiturs besteht aus zwei Klassen:&lt;br /&gt;
* &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; ist der eigentliche binäre Suchbaum.&lt;br /&gt;
* &amp;lt;code&amp;gt;ComparableCOntent&amp;lt;/code&amp;gt;: In einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; können nur Objekte eingefügt werden, die die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren. &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; erzwingt die Implementierung der Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt;. Dadurch wird festgelegt, wie Objekte in den Suchbaum einsortiert werden.&lt;br /&gt;
&lt;br /&gt;
=Beispiel: Verwendung von &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt;=&lt;br /&gt;
Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; sollen in einen binären Suchbaum eingefügt bzw. nach bestimmten Titeln gesucht werden. Dabei soll das Ordnungskriterium die alphabetische Ordnung nach dem Titel sein. &lt;br /&gt;
&lt;br /&gt;
Dafür muss die Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementieren und die Methoden &amp;lt;code&amp;gt;isEqual&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;isGreater&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;isLess&amp;lt;/code&amp;gt; so überschreiben, dass die Bücher nach dem Titel verglichen werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class Buch &amp;lt;u&amp;gt;&amp;lt;b&amp;gt;implements ComparableContent&amp;lt;Buch&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;/u&amp;gt;{&lt;br /&gt;
   private String titel;&lt;br /&gt;
   private int regalNr;&lt;br /&gt;
   &lt;br /&gt;
   public Buch(String pTitel, int pRegalNr){&lt;br /&gt;
      titel = pTitel;&lt;br /&gt;
      regalNr = pRegalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public int getRegalNr() {&lt;br /&gt;
      return regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public void setRegalNr(int regalNr) {&lt;br /&gt;
      this.regalNr = regalNr;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   public String getTitel() {&lt;br /&gt;
      return titel;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;b&amp;gt;&amp;lt;u&amp;gt;public boolean isEqual(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.equals(pBuch.getTitel())){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isLess(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;lt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   &amp;lt;u&amp;gt;public boolean isGreater(Buch pContent) {&amp;lt;/u&amp;gt;&lt;br /&gt;
      &amp;lt;u&amp;gt;Buch pBuch = pContent;&amp;lt;/u&amp;gt;&lt;br /&gt;
      boolean ergebnis = false;&lt;br /&gt;
      if(titel.compareTo(pBuch.getTitel())&amp;gt;0){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
   }&amp;lt;/b&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jetzt können z.B. in einer Klasse &amp;lt;code&amp;gt;Bibliothek&amp;lt;/code&amp;gt; Objekte der Klasse &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; in einen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; eingefügt werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public class Bibliothek{&lt;br /&gt;
   &lt;br /&gt;
      //hier werden die Buecher gespeichert&lt;br /&gt;
      BinarySearchTree&amp;lt;Buch&amp;gt; buecherBaum;&lt;br /&gt;
 &lt;br /&gt;
      public Bibliothek(){&lt;br /&gt;
         buecherBaum = new BinarySearchTree&amp;lt;Buch&amp;gt;();&lt;br /&gt;
       }  &lt;br /&gt;
 &lt;br /&gt;
      '''public void uebertrageListeInBaum(List&amp;lt;Buch&amp;gt; buecherListe)'''{&lt;br /&gt;
         for(buecherListe.toFirst(); buecherListe.hasAccess(); buecherListe.next()){&lt;br /&gt;
            Buch aktuellesBuch = buecherListe.getContent();&lt;br /&gt;
            &amp;lt;u&amp;gt;buecherBaum.insert(aktuellesBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
         }&lt;br /&gt;
      }&lt;br /&gt;
     &lt;br /&gt;
      '''public Buch suche(String pTitel)'''{&lt;br /&gt;
          // man muss erst ein Dummy-Buch erzeugen&lt;br /&gt;
          // nach dem kann man dann suchen&lt;br /&gt;
          &amp;lt;u&amp;gt;Buch dummyBuch = new Buch(pTitel, -1);&amp;lt;/u&amp;gt;&lt;br /&gt;
          Buch ergebnis = &amp;lt;u&amp;gt;buecherBaum.search(dummyBuch);&amp;lt;/u&amp;gt;&lt;br /&gt;
          return ergebnis;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Erläuterungen zur Methode &amp;lt;code&amp;gt;public Buch suche(String pTitel)&amp;lt;/code&amp;gt;''':&lt;br /&gt;
&lt;br /&gt;
Die Implementierung sieht auf den ersten Blick etwas eigenwillig aus, ist aber die einfachste und schnellste. Warum wird das so gemacht?&lt;br /&gt;
&lt;br /&gt;
* In Objekten vom Typ &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;Buch&amp;gt;&amp;lt;/code&amp;gt; kann man nur nach Objekten vom Typ &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; suchen.&lt;br /&gt;
* D.h. man muss erst ein &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; erstellen, das den gewünschten Titel trägt.&lt;br /&gt;
* Da &amp;lt;code&amp;gt;Buch&amp;lt;/code&amp;gt; die Schnittstelle &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert, kann man mithilfe von &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; aufrufen.&lt;br /&gt;
* &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt; gibt dann das &amp;quot;richtige&amp;quot; gesuchte Buch zurück.&lt;br /&gt;
* WICHTIG: &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; ist das &amp;quot;richtige&amp;quot; Buch; &amp;lt;code&amp;gt;dummyBuch&amp;lt;/code&amp;gt; wurde nur dafür erstellt, damit man nach einem Titel suchen kann!&lt;br /&gt;
&lt;br /&gt;
=Die Klassen &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;=&lt;br /&gt;
&lt;br /&gt;
* Der BinarySearchTree ''hat'' einen &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; als einziges Attribut, er ''besteht'' also eigentlich nur aus einem &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Die Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt; hat die Attribute &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; (Wurzelinhalt), &amp;lt;code&amp;gt;left&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;right&amp;lt;/code&amp;gt; (linker und rechter Teilbaum).&lt;br /&gt;
* Analog zu den Klassen [[Queue ab Abi 2017|Queue]] und [[Stack ab Abi 2017|Stack]] wird die Verbindung der Elemente der Datenstruktur also über die Nodes (auch hier: innere (Hilfs-)Klasse) umgesetzt.&lt;br /&gt;
&lt;br /&gt;
Der Beginn der Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public class BinarySearchTree&amp;lt;ContentType extends ComparableContent&amp;lt;ContentType&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
    private BSTNode&amp;lt;ContentType&amp;gt; node;&lt;br /&gt;
 &lt;br /&gt;
    // usw...&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die innere (Hilfs-)Klasse &amp;lt;code&amp;gt;BSTNode&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  private class BSTNode&amp;lt;CT extends ComparableContent&amp;lt;CT&amp;gt;&amp;gt; {&lt;br /&gt;
 &lt;br /&gt;
     private CT content;&lt;br /&gt;
     private BinarySearchTree&amp;lt;CT&amp;gt; left, right;&lt;br /&gt;
 &lt;br /&gt;
     public BSTNode(CT pContent) {&lt;br /&gt;
        // Der Knoten hat einen linken und rechten Teilbaum, die&lt;br /&gt;
        // beide von null verschieden sind. Also hat ein Blatt immer zwei&lt;br /&gt;
        // leere Teilbaeume unter sich.&lt;br /&gt;
        this.content = pContent;&lt;br /&gt;
        left = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
        right = new BinarySearchTree&amp;lt;CT&amp;gt;();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==ComparableContent: Java-Quellcode==&lt;br /&gt;
Das Interface &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; stellt sicher, dass nur Objekte in einen '''binären Suchbaum''' eingefügt werden, die man miteinander vergleichen kann. (Ohne Objekte als ''größer'', ''gleich'' oder ''kleiner'' vergleichen zu können, wäre ein binärer Suchbaum natürlich sinnlos, man könnte keine Sortierung auf linke und rechte Teilbäume vornehmen.)&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public interface ComparableContent&amp;lt;ContentType&amp;gt; {&lt;br /&gt;
    public boolean isEqual(ContentType pContent);&lt;br /&gt;
    public boolean isLess(ContentType pContent);&lt;br /&gt;
    public boolean isGreater(ContentType pContent);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Die Methoden werden in &amp;lt;code&amp;gt;ContentType&amp;lt;/code&amp;gt; nur deklariert, aber nicht implementiert!&lt;br /&gt;
* Jede Klasse, die &amp;lt;code&amp;gt;ComparableContent&amp;lt;/code&amp;gt; implementiert (Syntax: &amp;lt;code&amp;gt;public MyClass '''implements ComparableContent'''&amp;lt;/code&amp;gt;), muss diese drei Methoden überschreiben und eine Implementierung anbieten.&lt;br /&gt;
&lt;br /&gt;
=Suchen (search)=&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet die Methode &amp;lt;code&amp;gt;search&amp;lt;/code&amp;gt;, um Elemente im Baum zu suchen.&lt;br /&gt;
&lt;br /&gt;
Ist das Element enthalten, wird es zurückgegeben. Dies mag auf den ersten Blick sinnlos erscheinen, bietet aber die Möglichkeit, sich ein Objekt mit einem bestimmten Attributwert zu holen, indem man zunächst ein Dummy-Objekt erstellt, das mit dem gesuchten Objekt nur in diesem Attibutwert übereinstimmt und sich damit das zugehörige ''wirkliche Objekt'' aus dem &amp;lt;code&amp;gt;BinaryTree&amp;lt;/code&amp;gt; sucht. (''Die überschriebene Methode &amp;lt;code&amp;gt;isEqual()&amp;lt;/code&amp;gt; darf natürlich nur Gleichheit genau auf diesem Attribut testen!'')   -&amp;gt; s. auch Beispiel oben: '''public Buch suche(String pTitel)'''!&lt;br /&gt;
&lt;br /&gt;
Binäre Suchbäume haben den Vorteil, dass man in ihnen sehr schnell Elemente suchen kann: Man muss nicht den ganzen Baum zu durchsuchen, sondern kann - ausgehend von der Wurzel - einen Pfad bis zum Blatt abgehen. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. (''In der Abiturklasse ist allerdings kein klassischer [[Binärbaum (Methoden) ab Abi 2017#Durchlaufen eines Pfades|Pfaddurchlauf]] (mit while-Schleife etc.) umgesetzt, sondern eine rekursive Variante gewählt worden, die aber auch nur den einen notwendigen Pfad durchläuft.'')&lt;br /&gt;
&lt;br /&gt;
==Implementierung (LK)==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public ContentType search(ContentType pContent) {&lt;br /&gt;
    if (this.isEmpty() || pContent == null) {&lt;br /&gt;
        // Abbrechen, da es kein Element zu suchen gibt.&lt;br /&gt;
        return null;&lt;br /&gt;
    } else {&lt;br /&gt;
        ContentType content = this.getContent();&lt;br /&gt;
        if (pContent.isLess(content)) {&lt;br /&gt;
            // Element wird im linken Teilbaum gesucht.&lt;br /&gt;
            return this.getLeftTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isGreater(content)) {&lt;br /&gt;
            // Element wird im rechten Teilbaum gesucht.&lt;br /&gt;
            return this.getRightTree().search(pContent);&lt;br /&gt;
        } else if (pContent.isEqual(content)) {&lt;br /&gt;
            // Element wurde gefunden.&lt;br /&gt;
            return content;&lt;br /&gt;
        } else {&lt;br /&gt;
             // Dieser Fall sollte nicht auftreten.&lt;br /&gt;
            return null;&lt;br /&gt;
         }&lt;br /&gt;
    } &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Einfügen (insert)=&lt;br /&gt;
Um Elemente in einen binären Suchbaum einzufügen, muss man ausgehend von der Wurzel einen Pfad bis zu einem leeren Knoten abgehen und dort den eizufügenden Inhalt hineinschreiben. Je nachdem, ob das gesuchte Element kleiner oder größer ist als der gerade betrachtete Knoten, biegt man rechts (bzw. links) ab. Sobald man einen leeren Knoten gefunden hat, ist man an der richtigen Stelle, wo man das Element einfügen kann. In der Abiturklasse wird diese Strategie rekursiv umgesetzt.&lt;br /&gt;
&lt;br /&gt;
== Implementierung (LK) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public void insert(ContentType pContent) {&lt;br /&gt;
    if (pContent != null) {&lt;br /&gt;
       if (isEmpty()) {&lt;br /&gt;
          this.node = new BSTNode&amp;lt;ContentType&amp;gt;(pContent);&lt;br /&gt;
       } else if (pContent.isLess(this.node.content)) {&lt;br /&gt;
          this.node.left.insert(pContent);&lt;br /&gt;
       } else if(pContent.isGreater(this.node.content)) {&lt;br /&gt;
          this.node.right.insert(pContent);&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Löschen (remove)=&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;lt;code&amp;gt;BinarySearchTree&amp;lt;/code&amp;gt; bietet neben der Methode &amp;lt;code&amp;gt;insert&amp;lt;/code&amp;gt; auch die Methode &amp;lt;code&amp;gt;remove&amp;lt;/code&amp;gt;, mit der man ein Element aus einem Suchbaum löschen kann - und die Suchbaumstruktur bleibt gewahrt!&lt;br /&gt;
&lt;br /&gt;
Das ist sehr angenehm, denn das Löschen von Elementen aus einem Suchbaum ist eine SEHR mühsame Angelegenheit, weil man genau darauf achten muss, dass die Suchbaum-Struktur nicht zerstört wird.&lt;br /&gt;
&lt;br /&gt;
'''Im folgenden wird dargestellt, wie das Löschen von Elementen aus einem Binären Suchbaum funktioniert.'''&lt;br /&gt;
&lt;br /&gt;
==Implementierung einer Löschmethode==&lt;br /&gt;
[[Datei:loeschen_von_elementen_aus_baeumen.png|400px|thumb|right|Beispiel: Löschen der 34]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;font color='red'&amp;gt; Diese Methode ist '''nicht''' relevant für das Zentralabitur! &amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das Löschen von Knoten aus binären Suchbäumen ist insofern nicht ganz einfach, als man darauf achten muss, dass die Struktur des binären Suchbaums nicht zerstört wird. &lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;font color='green'&amp;gt; TODO: Implementierung des Löschens auf Abi 2017 anpassen!!!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Strategie===&lt;br /&gt;
'''Standardfall'''&lt;br /&gt;
# Den richtigen Knoten suchen: '''K0'''. Außerdem braucht man den '''Vorgänger von K0'''&lt;br /&gt;
# Suche im linken Teilbaum von K0 den Knoten, der am weitesten rechts ist: '''K1'''. Außerdem braucht man den '''Vorgänger von K1'''&lt;br /&gt;
# Hänge den (linken!) Nachfolger von K1 an den Vorgänger von K1.&lt;br /&gt;
# K1 ersetzt jetzt K0, d.h. der Inhalt von K1 wird jetzt in den Knoten K0 geschrieben.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Ausnahmefälle'''&lt;br /&gt;
&lt;br /&gt;
# K0 ist ein Blatt → einfach löschen.&lt;br /&gt;
# Die Wurzel des Gesamtbaumes enthält das zu löschende Element&lt;br /&gt;
## TODO&lt;br /&gt;
# K0 hat keinen linken Teilbaum → Der Nachfolger von K0 ersetzt K0, d.h.:&lt;br /&gt;
## Im Vorgänger von K0 wird der Nachfolger von K0 als (richtigen!) Nachfolger eingetragen.&lt;br /&gt;
&lt;br /&gt;
'''benötigte Methoden'''&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;code&amp;gt;public boolean istBlatt(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK0Vorgaenger(BinaryTree pTree, Object pObject)&amp;lt;/code&amp;gt;&lt;br /&gt;
# &amp;lt;code&amp;gt;public BinaryTree findeK1Vorgaenger(BinaryTree pTree)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Implementierung===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  public void loeschen(BinaryTree b, String zahl) {&lt;br /&gt;
    if(b.isEmpty())&lt;br /&gt;
    {&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    // wenn das zu loeschende Element die Wurzel ist:&lt;br /&gt;
    // 1. an einen Vater-Knoten anhaengen&lt;br /&gt;
    // 2. loeschen&lt;br /&gt;
    // 3. vaterknoten wieder wegnehmen	&lt;br /&gt;
    if(b.getObject().equals(zahl)){&lt;br /&gt;
      BinaryTree vater = new BinaryTree(&amp;quot;-999999&amp;quot;);&lt;br /&gt;
      vater.setRightTree(b);&lt;br /&gt;
      loeschen(vater, zahl);&lt;br /&gt;
      b = vater.getRightTree();&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
  &lt;br /&gt;
    BinaryTree K0vorgaenger = this.findeVorgaengerKnoten(b,zahl );&lt;br /&gt;
    System.out.println(&amp;quot;Vorgänger von K0:&amp;quot; + K0vorgaenger.getObject());&lt;br /&gt;
  &lt;br /&gt;
    boolean K0haengtLinksAmVorgaenger = true;&lt;br /&gt;
    BinaryTree K0 = K0vorgaenger.getLeftTree();&lt;br /&gt;
    if(!K0vorgaenger.getRightTree().isEmpty() &amp;amp;&amp;amp; &lt;br /&gt;
      zahl.equals(K0vorgaenger.getRightTree().getObject()))&lt;br /&gt;
    {	&lt;br /&gt;
      K0 = K0vorgaenger.getRightTree();&lt;br /&gt;
      K0haengtLinksAmVorgaenger = false;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    String K0String = (String) K0.getObject();&lt;br /&gt;
    System.out.println(&amp;quot;K0String: &amp;quot;+K0String);&lt;br /&gt;
  &lt;br /&gt;
    if(istBlatt(K0)){&lt;br /&gt;
      System.out.println(&amp;quot;istBlatt!&amp;quot;);&lt;br /&gt;
      if(K0haengtLinksAmVorgaenger){&lt;br /&gt;
        K0vorgaenger.setLeftTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      else{&lt;br /&gt;
        K0vorgaenger.setRightTree(new BinaryTree());&lt;br /&gt;
      }&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    if(K0.getLeftTree().isEmpty()){&lt;br /&gt;
      K0.setObject(K0.getRightTree().getObject());&lt;br /&gt;
      K0.setLeftTree(K0.getRightTree().getLeftTree());&lt;br /&gt;
      K0.setRightTree(K0.getRightTree().getRightTree());&lt;br /&gt;
      return;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    BinaryTree K1vorgaenger = vorgaengerVonAmWeitestenRechts(K0.getLeftTree());&lt;br /&gt;
    System.out.println(&amp;quot;K1vorgaenger: &amp;quot; + K1vorgaenger.getObject());&lt;br /&gt;
    BinaryTree K1 = K1vorgaenger.getRightTree();&lt;br /&gt;
    System.out.println(&amp;quot;K1: &amp;quot; + K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    K1vorgaenger.setRightTree(K1.getLeftTree());&lt;br /&gt;
    K0.setObject(K1.getObject());&lt;br /&gt;
 &lt;br /&gt;
    return;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private boolean istBlatt(BinaryTree pTree) {&lt;br /&gt;
    boolean ergebnis = pTree.getLeftTree().isEmpty() &amp;amp;&amp;amp; pTree.getRightTree().isEmpty(); &lt;br /&gt;
    System.out.println(&amp;quot;istBlatt(&amp;quot;+pTree.getObject()+&amp;quot;): &amp;quot;+ergebnis);&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  private BinaryTree vorgaengerVonAmWeitestenRechts(BinaryTree pTree) {&lt;br /&gt;
    System.out.println(&amp;quot;vorgaengervonAmWeitestenRechts(&amp;quot;+pTree.getObject()+&amp;quot;)&amp;quot;);&lt;br /&gt;
    if(pTree.getRightTree().isEmpty()){&lt;br /&gt;
      System.err.println(&amp;quot;Fehler in vorgaengerVonAmWeitestenRechts&amp;quot;);&lt;br /&gt;
      return null;&lt;br /&gt;
    }&lt;br /&gt;
    if(pTree.getRightTree().getRightTree().isEmpty()){&lt;br /&gt;
      return pTree;&lt;br /&gt;
    }&lt;br /&gt;
    BinaryTree ergebnis = this.vorgaengerVonAmWeitestenRechts(pTree.getRightTree());&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    private BinaryTree findeVorgaengerKnoten(BinaryTree pTree, String zahl)&lt;br /&gt;
    {&lt;br /&gt;
      System.out.println(&amp;quot;findeVorgaengerKnoten(&amp;quot;+pTree.getObject()+&amp;quot;, &amp;quot;+zahl+&amp;quot;)&amp;quot;);&lt;br /&gt;
      if(zahl.equals(pTree.getObject())){&lt;br /&gt;
        System.err.println(zahl+&amp;quot;ist die Wurzel von pTree selber!!!&amp;quot;);&lt;br /&gt;
        return null;&lt;br /&gt;
      }&lt;br /&gt;
      boolean gefunden = false;&lt;br /&gt;
      int zahl1 = Integer.parseInt(zahl);&lt;br /&gt;
 &lt;br /&gt;
      BinaryTree ergebnis = pTree;&lt;br /&gt;
      while(gefunden == false){&lt;br /&gt;
        String wurzelString = (String) ergebnis.getObject();&lt;br /&gt;
        int wurzelInt = Integer.parseInt(wurzelString);&lt;br /&gt;
 &lt;br /&gt;
        System.out.println(&amp;quot;wurzelInt&amp;quot; + wurzelInt);&lt;br /&gt;
        System.out.println(&amp;quot;zahl&amp;quot; + zahl);&lt;br /&gt;
        System.out.println(&amp;quot;ergebnis.getObject(): &amp;quot; + ergebnis.getObject());&lt;br /&gt;
 &lt;br /&gt;
        if(zahl.equals(ergebnis.getRightTree().getObject()) || &lt;br /&gt;
           zahl.equals(ergebnis.getLeftTree().getObject()))&lt;br /&gt;
        {&lt;br /&gt;
          gefunden = true;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
          if(zahl1 &amp;lt; wurzelInt){&lt;br /&gt;
            ergebnis = ergebnis.getLeftTree();&lt;br /&gt;
          }&lt;br /&gt;
          else{&lt;br /&gt;
            ergebnis = ergebnis.getRightTree();&lt;br /&gt;
          }&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
      return ergebnis;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mgrifka</name></author>
	</entry>
</feed>