<?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=Akaibel</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=Akaibel"/>
	<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Spezial:Beitr%C3%A4ge/Akaibel"/>
	<updated>2026-04-11T13:37:48Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3780</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3780"/>
		<updated>2026-03-21T14:42:55Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Fachbegriffe */&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;
&lt;br /&gt;
''Sie werden hier systematisch aufgeführt, wie man sie sich am besten merkt.''&lt;br /&gt;
* Befehle: &lt;br /&gt;
** SELECT, SELECT DISTINCT ... AS&lt;br /&gt;
** FROM&lt;br /&gt;
** JOIN ... ON, LEFT JOIN ... ON, RIGHT JOIN ... ON&lt;br /&gt;
** WHERE (... z.B. mit IS NULL)&lt;br /&gt;
** GROUP BY&lt;br /&gt;
** ORDER BY ... ASC (bzw. DESC)&lt;br /&gt;
** UNION&lt;br /&gt;
** Tabellen selbst definieren mit AS &lt;br /&gt;
* Vergleichsoperatoren: &lt;br /&gt;
** =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, &lt;br /&gt;
** LIKE (in Verbindung mit dem %-Joker)&lt;br /&gt;
** BETWEEN ... AND&lt;br /&gt;
** IN (SELECT ...) &lt;br /&gt;
** NOT IN (SELECT ...)&lt;br /&gt;
** IS NULL&lt;br /&gt;
* Arithmetische Operatoren: +, -, *, /, (...)&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
* sonstiges: Die Joker % (in Kombination mit LIKE) und * (z.B. SELECT * oder SELECT COUNT(*) )&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, hat folgende Möglichkeiten:''&lt;br /&gt;
** ''Die Beispieldatenbank Schule als SQL-Lite Datenbank herunterladen:&amp;lt;br&amp;gt;[[Datei:Schule.sqlite.zip]]&amp;lt;br&amp;gt;Zum Öffnen braucht man [https://sqlitebrowser.org/ DB Browser für SQLite]''&lt;br /&gt;
** ''Einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br&amp;gt;[[Datei:Beispieldatenbank-schule.zip]] und z.B. mit phpmyadmin in eine eigene Datenbank importieren.''&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 wollen wir 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;
* ''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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3779</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3779"/>
		<updated>2026-03-21T14:39:49Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* SQL-Sprachelemente im Zentralabitur */&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;
&lt;br /&gt;
''Sie werden hier systematisch aufgeführt, wie man sie sich am besten merkt.''&lt;br /&gt;
* Befehle: &lt;br /&gt;
** SELECT, SELECT DISTINCT ... AS&lt;br /&gt;
** FROM&lt;br /&gt;
** JOIN ... ON, LEFT JOIN ... ON, RIGHT JOIN ... ON&lt;br /&gt;
** WHERE (... z.B. mit IS NULL)&lt;br /&gt;
** GROUP BY&lt;br /&gt;
** ORDER BY ... ASC (bzw. DESC)&lt;br /&gt;
** UNION&lt;br /&gt;
** Tabellen selbst definieren mit AS &lt;br /&gt;
* Vergleichsoperatoren: &lt;br /&gt;
** =, !=, &amp;gt;, &amp;lt;, &amp;gt;=, &amp;lt;=, &lt;br /&gt;
** LIKE (in Verbindung mit dem %-Joker)&lt;br /&gt;
** BETWEEN ... AND&lt;br /&gt;
** IN (SELECT ...) &lt;br /&gt;
** NOT IN (SELECT ...)&lt;br /&gt;
** IS NULL&lt;br /&gt;
* Arithmetische Operatoren: +, -, *, /, (...)&lt;br /&gt;
* Logische Operatoren: AND, OR, NOT&lt;br /&gt;
* Funktionen: COUNT, SUM, MAX, MIN, AVG&lt;br /&gt;
* sonstiges: Die Joker % (in Kombination mit LIK) und * (z.B. SELECT * oder SELECT COUNT(*) )&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, hat folgende Möglichkeiten:''&lt;br /&gt;
** ''Die Beispieldatenbank Schule als SQL-Lite Datenbank herunterladen:&amp;lt;br&amp;gt;[[Datei:Schule.sqlite.zip]]&amp;lt;br&amp;gt;Zum Öffnen braucht man [https://sqlitebrowser.org/ DB Browser für SQLite]''&lt;br /&gt;
** ''Einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br&amp;gt;[[Datei:Beispieldatenbank-schule.zip]] und z.B. mit phpmyadmin in eine eigene Datenbank importieren.''&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 wollen wir 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;
* ''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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=3778</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=3778"/>
		<updated>2026-01-23T20:46:25Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Implementierung */&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;
&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;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/to2supzEiO4 rekursive Methoden für Binärbäume implementieren (Youtube)]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Prinzip und Implementierung der Levelorder-Traversierung (Youtube)]&lt;br /&gt;
* [https://youtu.be/UGrrFuV3zjY Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&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 für Binärbäume:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* Die rekursive Methode braucht als einen '''Parameter einen Binärbaum''', damit man rekursiv für den linken bzw. rechten Teilbaum aufrufen kann.&lt;br /&gt;
** Die rekursive Methode wird häufig aus einer '''Rahmenmethode''' aufgerufen.&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;
    //ein Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
  &lt;br /&gt;
    '''//Rahmenmethode'''&lt;br /&gt;
    public int summe(){  &lt;br /&gt;
        // die Rahmenmethode '''delegiert''' die Aufgabe an die rekursive Methode.&lt;br /&gt;
        // dabei übergibt sie den zu behandelnden Baum.&lt;br /&gt;
        return summe(suchbaum);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//rekursive Methode'''&lt;br /&gt;
    '''//Parameter vom Typ BinaryTree''' ist notwendig für rekursive Aufrufe!&lt;br /&gt;
    private 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;
[https://youtu.be/UGrrFuV3zjY Erklärvideo: Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
    //Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
    &lt;br /&gt;
    public void einfuegen(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 = suchbaum;'''&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;
                // &amp;quot;links abbiegen&amp;quot;&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                // &amp;quot;rechts abbiegen&amp;quot;&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;
&amp;lt;font color='red'&amp;gt;'''nur relevant für den Leistungskurs!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, &amp;lt;br/&amp;gt;'''''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: Baumliste erstellen'''&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: Ergebnisliste erstellen'''&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;
''am Beispiel eines Baumes, der Personen enthält''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
    public List&amp;lt;Person&amp;gt; levelorder(BinaryTree&amp;lt;Person&amp;gt; pTree){&lt;br /&gt;
        '''//Linearisierung'''&lt;br /&gt;
        List&amp;lt;BinaryTree&amp;lt;Person&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;Person&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;Person&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;Person&amp;gt; aktuellerBaum = baumListe.getContent();&lt;br /&gt;
            Person 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 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;
    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;
    // der gesamte Baum ist um eins tiefer, wegen der Wurzel&lt;br /&gt;
    ergebnis++;&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 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&amp;lt;Object&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&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.getContent());&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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=3777</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=3777"/>
		<updated>2026-01-23T20:42:03Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Vorgehensweise */&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;
&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;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/to2supzEiO4 rekursive Methoden für Binärbäume implementieren (Youtube)]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Prinzip und Implementierung der Levelorder-Traversierung (Youtube)]&lt;br /&gt;
* [https://youtu.be/UGrrFuV3zjY Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&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 für Binärbäume:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* Die rekursive Methode braucht als einen '''Parameter einen Binärbaum''', damit man rekursiv für den linken bzw. rechten Teilbaum aufrufen kann.&lt;br /&gt;
** Die rekursive Methode wird häufig aus einer '''Rahmenmethode''' aufgerufen.&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;
    //ein Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
  &lt;br /&gt;
    '''//Rahmenmethode'''&lt;br /&gt;
    public int summe(){  &lt;br /&gt;
        // die Rahmenmethode '''delegiert''' die Aufgabe an die rekursive Methode.&lt;br /&gt;
        // dabei übergibt sie den zu behandelnden Baum.&lt;br /&gt;
        return summe(suchbaum);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//rekursive Methode'''&lt;br /&gt;
    '''//Parameter vom Typ BinaryTree''' ist notwendig für rekursive Aufrufe!&lt;br /&gt;
    private 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;
[https://youtu.be/UGrrFuV3zjY Erklärvideo: Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
    //Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
    &lt;br /&gt;
    public void einfuegen(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 = suchbaum;'''&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;
                // &amp;quot;links abbiegen&amp;quot;&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                // &amp;quot;rechts abbiegen&amp;quot;&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;
&amp;lt;font color='red'&amp;gt;'''nur relevant für den Leistungskurs!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, &amp;lt;br/&amp;gt;'''''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: Baumliste erstellen'''&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: Ergebnisliste erstellen'''&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 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;
    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;
    // der gesamte Baum ist um eins tiefer, wegen der Wurzel&lt;br /&gt;
    ergebnis++;&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 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&amp;lt;Object&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&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.getContent());&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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=3776</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=3776"/>
		<updated>2026-01-18T18:18:24Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Implementierung */&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;
&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;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/to2supzEiO4 rekursive Methoden für Binärbäume implementieren (Youtube)]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Prinzip und Implementierung der Levelorder-Traversierung (Youtube)]&lt;br /&gt;
* [https://youtu.be/UGrrFuV3zjY Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&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 für Binärbäume:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* Die rekursive Methode braucht als einen '''Parameter einen Binärbaum''', damit man rekursiv für den linken bzw. rechten Teilbaum aufrufen kann.&lt;br /&gt;
** Die rekursive Methode wird häufig aus einer '''Rahmenmethode''' aufgerufen.&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;
    //ein Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
  &lt;br /&gt;
    '''//Rahmenmethode'''&lt;br /&gt;
    public int summe(){  &lt;br /&gt;
        // die Rahmenmethode '''delegiert''' die Aufgabe an die rekursive Methode.&lt;br /&gt;
        // dabei übergibt sie den zu behandelnden Baum.&lt;br /&gt;
        return summe(suchbaum);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//rekursive Methode'''&lt;br /&gt;
    '''//Parameter vom Typ BinaryTree''' ist notwendig für rekursive Aufrufe!&lt;br /&gt;
    private 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;
[https://youtu.be/UGrrFuV3zjY Erklärvideo: Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
    //Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
    &lt;br /&gt;
    public void einfuegen(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 = suchbaum;'''&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;
                // &amp;quot;links abbiegen&amp;quot;&lt;br /&gt;
                '''b = b.getLeftTree();'''&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                // &amp;quot;rechts abbiegen&amp;quot;&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;
&amp;lt;font color='red'&amp;gt;'''nur relevant für den Leistungskurs!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, &amp;lt;br/&amp;gt;'''''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 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;
    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;
    // der gesamte Baum ist um eins tiefer, wegen der Wurzel&lt;br /&gt;
    ergebnis++;&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 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&amp;lt;Object&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&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.getContent());&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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=3775</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=3775"/>
		<updated>2026-01-18T18:14:51Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Implementierung */&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;
&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;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/to2supzEiO4 rekursive Methoden für Binärbäume implementieren (Youtube)]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Prinzip und Implementierung der Levelorder-Traversierung (Youtube)]&lt;br /&gt;
* [https://youtu.be/UGrrFuV3zjY Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&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 für Binärbäume:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* Die rekursive Methode braucht als einen '''Parameter einen Binärbaum''', damit man rekursiv für den linken bzw. rechten Teilbaum aufrufen kann.&lt;br /&gt;
** Die rekursive Methode wird häufig aus einer '''Rahmenmethode''' aufgerufen.&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;
    //ein Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
  &lt;br /&gt;
    '''//Rahmenmethode'''&lt;br /&gt;
    public int summe(){  &lt;br /&gt;
        // die Rahmenmethode '''delegiert''' die Aufgabe an die rekursive Methode.&lt;br /&gt;
        // dabei übergibt sie den zu behandelnden Baum.&lt;br /&gt;
        return summe(suchbaum);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//rekursive Methode'''&lt;br /&gt;
    '''//Parameter vom Typ BinaryTree''' ist notwendig für rekursive Aufrufe!&lt;br /&gt;
    private 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;
[https://youtu.be/UGrrFuV3zjY Erklärvideo: Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&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;
&amp;lt;font color='red'&amp;gt;'''nur relevant für den Leistungskurs!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, &amp;lt;br/&amp;gt;'''''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 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;
    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;
    // der gesamte Baum ist um eins tiefer, wegen der Wurzel&lt;br /&gt;
    ergebnis++;&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 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&amp;lt;Object&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&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.getContent());&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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Bin%C3%A4rbaum_(Methoden)&amp;diff=3774</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=3774"/>
		<updated>2026-01-18T18:14:26Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Rekursion */&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;
&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;
&lt;br /&gt;
=Erklärvideos=&lt;br /&gt;
* [https://youtu.be/to2supzEiO4 rekursive Methoden für Binärbäume implementieren (Youtube)]&lt;br /&gt;
* [https://youtu.be/SjniaclqvFs Prinzip und Implementierung der Levelorder-Traversierung (Youtube)]&lt;br /&gt;
* [https://youtu.be/UGrrFuV3zjY Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&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 für Binärbäume:&amp;lt;/u&amp;gt;'''&lt;br /&gt;
* Die rekursive Methode braucht als einen '''Parameter einen Binärbaum''', damit man rekursiv für den linken bzw. rechten Teilbaum aufrufen kann.&lt;br /&gt;
** Die rekursive Methode wird häufig aus einer '''Rahmenmethode''' aufgerufen.&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;
    //ein Beispiel-Attribut&lt;br /&gt;
    private BinaryTree&amp;lt;Integer&amp;gt; suchbaum;&lt;br /&gt;
  &lt;br /&gt;
    '''//Rahmenmethode'''&lt;br /&gt;
    public int summe(){  &lt;br /&gt;
        // die Rahmenmethode '''delegiert''' die Aufgabe an die rekursive Methode.&lt;br /&gt;
        // dabei übergibt sie den zu behandelnden Baum.&lt;br /&gt;
        return summe(suchbaum);&lt;br /&gt;
    }&lt;br /&gt;
   &lt;br /&gt;
    '''//rekursive Methode'''&lt;br /&gt;
    '''//Parameter vom Typ BinaryTree''' ist notwendig für rekursive Aufrufe!&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;
[https://youtu.be/UGrrFuV3zjY Erklärvideo: Pfaddurchlauf durch einen Binärbaum implementieren (Youtube)]&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;
&amp;lt;font color='red'&amp;gt;'''nur relevant für den Leistungskurs!'''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/SjniaclqvFs Erklärvideo: Prinzip und Implementierung der Levelorder-Traversierung]&lt;br /&gt;
&lt;br /&gt;
'''Linearisierung''' ist eine Strategie, wie man rekursive Strukturen (z.B. einen Binärbaum) komplett durchlaufen kann, &amp;lt;br/&amp;gt;'''''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 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;
    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;
    // der gesamte Baum ist um eins tiefer, wegen der Wurzel&lt;br /&gt;
    ergebnis++;&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 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&amp;lt;Object&amp;gt; ergebnis = new List&amp;lt;&amp;gt;();&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.getContent());&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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=List&amp;diff=3773</id>
		<title>List</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=List&amp;diff=3773"/>
		<updated>2025-12-01T13:17:42Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: Rückgabetyp der Methode korrigiert.&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;
&amp;lt;font color='red'&amp;gt;'''Diese Seite entspricht dem Abi 17 (und folgenden)'''&amp;lt;/font&amp;gt;&lt;br /&gt;
=Erklärvideo=&lt;br /&gt;
Wie durchläuft man standardmäßig Listen? &lt;br /&gt;
&lt;br /&gt;
Das wird hier anhand der Methode &amp;lt;code&amp;gt;public int gesamtVermoegen()&amp;lt;/code&amp;gt; erklärt.&lt;br /&gt;
&lt;br /&gt;
[https://youtu.be/W3-JBKnl7xk Erklärvideo: Liste durchlaufen am Beispiel &amp;quot;public int gesamtVermoegen()&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
=Fachbegriffe=&lt;br /&gt;
&lt;br /&gt;
Liste, Zeiger, an den Anfang, aktuelles Element, hasAccess(), ist leer (=isEmpty()), einfügen, (hinten) anhängen, (das aktuelle Element) löschen&lt;br /&gt;
&lt;br /&gt;
= Schnittstellenbeschreibung (Zentralabitur) =&lt;br /&gt;
* [[Medium:Dokumentation_List_Abi2017.pdf|Schnittstelle der Klasse List (PDF)]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Standardvorgehen im Umgang mit Listen=&lt;br /&gt;
Meistens werden Listen von vorne nach hinten durchlaufen und dabei wird mit jedem einzelnen Eintrag der Liste etwas gemacht. Das funktioniert folgendermaßen:&lt;br /&gt;
# Zeiger auf den Anfang der Liste setzen&lt;br /&gt;
# while-Schleife, die so lange läuft, wie der Zeiger in der Liste ist. Innerhalb der Schleife...&lt;br /&gt;
## das Element, auf das der Zeiger zeigt, in einer lokalen Variable speichern.&lt;br /&gt;
## mit diesem Element etwas machen (das hängt von der Aufgabe der Methode ab)&lt;br /&gt;
## den Zeiger eins weiterrücken.&lt;br /&gt;
&lt;br /&gt;
=Java=&lt;br /&gt;
In '''Java''' sieht das so aus (die Liste ist in diesem Beispiel mit Objekten vom Typ &amp;lt;code&amp;gt;Person&amp;lt;/code&amp;gt; gefüllt):&lt;br /&gt;
* &amp;lt;code&amp;gt;pList.toFirst();&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;while(pList.hasAccess()){&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Person p = pList.getContent();&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;//TODO: mit der Person p etwas machen!&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;pList.next();&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mit for-Schleife==&lt;br /&gt;
'''Mit einer for-Schleife lässt sich dieses Standard-Verfahren viel einfacher implementieren!'''&lt;br /&gt;
* &amp;lt;code&amp;gt;for(pList.toFirst(); pList.hasAccess(); pList.next()){&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;Person p = pList.getContent();&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;//TODO: mit der Person p etwas machen!&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Beispielmethoden für Listen=&lt;br /&gt;
Hier werden beispielhaft einige Methoden für Listen aufgeführt:&lt;br /&gt;
&lt;br /&gt;
==enthaelt==&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 private boolean enthaelt(List&amp;lt;Person&amp;gt; pList, String pName) {&lt;br /&gt;
   boolean ergebnis = false;&lt;br /&gt;
   pList.toFirst();&lt;br /&gt;
   while(pList.hasAccess()){&lt;br /&gt;
      Person p = pList.getContent();&lt;br /&gt;
      if(p.gibName().equals(pName)){&lt;br /&gt;
         ergebnis = true;&lt;br /&gt;
      }&lt;br /&gt;
      pList.next();&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;
Die Methode zeigt das Standard-Vorgehen zum Durchlaufen von Listen:&lt;br /&gt;
* Es wird ein &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; deklariert. &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; ist vom selben Typ wie der Rückgabetyp der Methode (hier: &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt;). &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; wird mit einem Standardwert versehen: Bevor man die Liste durchsucht, hat man noch nichts gefunden, d.h. &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; ist &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
* Der Zeiger wird auf den Anfang der Liste gesetzt.&lt;br /&gt;
* Mit &amp;lt;code&amp;gt;while(pList.hasAccess())&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;pList.next()&amp;lt;/code&amp;gt; wird die Liste dann komplett durchlaufen.&lt;br /&gt;
* Dabei wird mit &amp;lt;code&amp;gt;Person p = pList.getContent();&amp;lt;/code&amp;gt; jeweils die Person ausgelesen, auf die der Zeiger zeigt.&lt;br /&gt;
* Mit der Person &amp;lt;code&amp;gt;p&amp;lt;/code&amp;gt; wird dann etwas gemacht; in diesem Fall wird ihr Name mit dem Parameter &amp;lt;code&amp;gt;pName&amp;lt;/code&amp;gt; verglichen und wenn das übereinstimmt, dann wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Zum Schluss wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; zurückgegeben.&lt;br /&gt;
&lt;br /&gt;
==Anzahl aus Geburtsjahr==&lt;br /&gt;
Hier wird folgendes algorithmische Verfahren umgesetzt:&lt;br /&gt;
* &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; wird auf 0 gesetzt.&lt;br /&gt;
* die Liste &amp;lt;code&amp;gt;pList&amp;lt;/code&amp;gt; komplett durchlaufen.&lt;br /&gt;
** Für die jeweils aktuelle Person wird geprüft, ob ihr Geburtsjahr dem Parameter &amp;lt;code&amp;gt;pJahr&amp;lt;/code&amp;gt; entspricht.&amp;lt;br/&amp;gt;Wenn ja, wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; um 1 erhöht.&lt;br /&gt;
* Nach dem Ende der Schleife wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; zurückgegeben. &lt;br /&gt;
&lt;br /&gt;
''Hinweis: Hier wird die Liste mit einer for-Schleife durchlaufen. Das ist für die Programmierung viel angenehmer, weil man nicht Gefahr läuft, das &amp;lt;code&amp;gt;next()&amp;lt;/code&amp;gt; zu vergessen!&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public int anzahlPersonenAusGeburtsjahr(List&amp;lt;Person&amp;gt; pList, int pJahr){&lt;br /&gt;
     int ergebnis = 0;&lt;br /&gt;
     for(pList.toFirst(); pList.hasAccess(); pList.next()){&lt;br /&gt;
        Person p = pList.getContent();&lt;br /&gt;
        if(p.getGeburtsjahr() == pJahr){&lt;br /&gt;
           ergebnis += 1;&lt;br /&gt;
        }&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;
==jüngste Person==&lt;br /&gt;
Hier wird folgende Strategie verfolgt:&lt;br /&gt;
* in &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; wird zuerst die erste Person der Liste gespeichert.&lt;br /&gt;
* Dann wird die Liste komplett durchlaufen.&lt;br /&gt;
** Dabei wird die jeweils die Person, auf die der Zeiger zeigt, mit &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; verglichen: Wenn sie jünger ist, dann wird &amp;lt;code&amp;gt;aktuell&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; gespeichert.&lt;br /&gt;
* Am Ende wird &amp;lt;code&amp;gt;ergebnis&amp;lt;/code&amp;gt; zurückgegeben. &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
  public Person juengstePerson(List&amp;lt;Person&amp;gt; pList){&lt;br /&gt;
     Person ergebnis = null;&lt;br /&gt;
     if(pList.isEmpty()){&lt;br /&gt;
         return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
     pList.toFirst();&lt;br /&gt;
     Person ergebnis = pList.getContent();&lt;br /&gt;
     while(pList.hasAccess()){&lt;br /&gt;
        Person p = pList.getContent();&lt;br /&gt;
        if(p.getGeburtsjahr() &amp;lt; ergebnis.getGeburtsjahr()){&lt;br /&gt;
           ergebnis = p;&lt;br /&gt;
        }&lt;br /&gt;
        pList.next();&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;
= Sortierverfahren =&lt;br /&gt;
&lt;br /&gt;
== Sortieren durch Einfügen ==&lt;br /&gt;
siehe [[Insertionsort|Insertionsort]]&lt;br /&gt;
&lt;br /&gt;
== Sortieren durch Auswählen ==&lt;br /&gt;
siehe [[Selectionsort|Selectionsort]]&lt;br /&gt;
&lt;br /&gt;
== Bubblesort ==&lt;br /&gt;
[[Bubblesort|Bubblesort]] ist mit der neuen List-Implementierung nicht mehr sinnvoll, da es keine Möglichkeit gibt die Methode '''Flip''' sinnvoll zu programieren. &amp;lt;br&amp;gt;&lt;br /&gt;
'''Flip''' soll immer dann zwei Werte vertauschen, wenn der im Alphabet vordere Buchstabe hinten steht bzw. die hintere Zahl größer ist.&amp;lt;br&amp;gt;&lt;br /&gt;
Um die Methode jedoch sinnvoll programieren zu können, wären '''komplizierte''' &amp;amp; '''umständliche''' Programierungen notwendig.&amp;lt;br&amp;gt;&lt;br /&gt;
Desweiteren wäre am Ende das Sortierverfahren zu '''Rechenintensiv'''.&lt;br /&gt;
&lt;br /&gt;
== Mergesort ==&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;nicht relevant fürs Zentralabitur!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
siehe [[Mergesort|Mergesort]]&lt;br /&gt;
&lt;br /&gt;
==Quicksort==&lt;br /&gt;
'''&amp;lt;font color='red'&amp;gt;im Zentralabitur nur relevant für den LK!&amp;lt;/font&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
siehe [[Quicksort|Quicksort]]&lt;br /&gt;
&lt;br /&gt;
== istSortiert ==&lt;br /&gt;
für eine Liste, die mit Objekten vom Typ String gefüllt ist.&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 public boolean istSortiert(List&amp;lt;String&amp;gt; pList)&lt;br /&gt;
 {&lt;br /&gt;
    boolean ergebnis = true;&lt;br /&gt;
    pList.toFirst();&lt;br /&gt;
    while(pList.hasAccess())&lt;br /&gt;
       {&lt;br /&gt;
       String aktuell = pList.getContent();&lt;br /&gt;
       pList.next();&lt;br /&gt;
       if(pList.hasAccess() == false)&lt;br /&gt;
       {&lt;br /&gt;
          ergebnis = true;&lt;br /&gt;
          return ergebnis;&lt;br /&gt;
       }&lt;br /&gt;
       String naechster = pList.getContent();&lt;br /&gt;
       if(aktuell.compareTo(naechster)&amp;gt;0)&lt;br /&gt;
       {&lt;br /&gt;
          ergebnis = false;&lt;br /&gt;
          return ergebnis;&lt;br /&gt;
       }&lt;br /&gt;
    }&lt;br /&gt;
    ergebnis = true;&lt;br /&gt;
    return ergebnis;&lt;br /&gt;
 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3772</id>
		<title>Quelltextanalyse Java</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3772"/>
		<updated>2025-09-22T16:42:38Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Klausurlösung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
'''Ziel''' der Quelltextanalyse ist es, die Funktionsweise einer Methode mithilfe geeigneter &amp;lt;u&amp;gt;Fachbegriffe&amp;lt;/u&amp;gt; möglichst &amp;lt;u&amp;gt;kurz&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;präzise&amp;lt;/u&amp;gt; zu beschreiben. Dabei sind &amp;lt;u&amp;gt;Standardformulierungen&amp;lt;/u&amp;gt; hilfreich.&lt;br /&gt;
* '''Fachbegriffe''' dienen der Präzision.&lt;br /&gt;
* '''kurz''' ist deswegen wichtig, weil man bei der Klausur möglichst wenig Zeit auf das Schreiben verwenden sollte.&lt;br /&gt;
* Auf '''Standardformulierungen''' sollte man zurückgreifen können - denn die Beschreibung für das Durchlaufen eines Queues oder einer Liste muss man nicht für jede Klausur neu erfinden.&lt;br /&gt;
** Beispiele für Standardformulierungen finden sich unten.&lt;br /&gt;
* Auf Ästhetik muss '''nicht''' geachtet werden, so sind z.B. Wiederholungen am Satzanfang kein Problem.&lt;br /&gt;
&lt;br /&gt;
=Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' im Zentralabitur=&lt;br /&gt;
Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' kommt im Zentralabitur immer '''nur in Kombination mit einem weiteren Operator''' vor.&amp;lt;br/&amp;gt;Der weitere Operator sagt aus, was zu schreiben ist.&lt;br /&gt;
&lt;br /&gt;
Konkret heißt das:&lt;br /&gt;
* '''''&amp;quot;Analysieren Sie...&amp;quot;'' heißt so viel wie ''&amp;quot;Denken Sie nach über...&amp;quot;'''''&lt;br /&gt;
* Konsequenz:&amp;lt;br/&amp;gt;&amp;lt;font color='red'&amp;gt;Für den Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' muss man &amp;lt;u&amp;gt;gar nichts aufschreiben!!&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss das nicht verstehen. &amp;lt;br/&amp;gt;Aber wer das nicht berücksichtigt, verliert im Abitur sehr viel Zeit.&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt;&lt;br /&gt;
Diese Auffassung von ''&amp;quot;Analysieren Sie...&amp;quot;'' ist sehr spezifisch für das Informatik-Zentralabitur!&amp;lt;br/&amp;gt;Bitte auf keinen Fall auf andere Fächer übertragen!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Aufgabenstellung:&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''Analysieren und erläutern Sie den Algorithmus im Sachkontext.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Was ist zu tun?&amp;lt;/u&amp;gt;&lt;br /&gt;
* ''Analysieren ...'': Einfach nur nachdenken - nichts schreiben!&lt;br /&gt;
* ''... und erläutern Sie den Algorithmus im Sachkontext'': Das ist das, was zu tun ist! &amp;lt;br/&amp;gt;Weil bei dieser Aufgabe &amp;quot;nur&amp;quot; im Sachkontext erläutert werden soll, braucht man überhaupt nicht auf Programmierungs-Details eingehen, wenn sie für den Sachkontext keine Rolle spielen.&lt;br /&gt;
&lt;br /&gt;
=Standardformulierungen=&lt;br /&gt;
Mögliche Standardformulierungen werden hier an einem Beispiel aufgezeigt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Gegeben ist die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; enthält lauter Kunden, die nach Einkommen absteigend sortiert sind, d.h. der Kunde mit dem höchsten Einkommen ist vorne.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 01  private void tueWas(Queue&amp;lt;Kunde&amp;gt; pQueue, Kunde pKunde) {&lt;br /&gt;
       Queue&amp;lt;Kunde&amp;gt; hilfs = new Queue&amp;lt;Kunde&amp;gt;();&lt;br /&gt;
       boolean zzz = false;&lt;br /&gt;
       while (!pQueue.isEmpty()) {&lt;br /&gt;
 05      Kunde k = pQueue.front();&lt;br /&gt;
         if (zzz == false &amp;amp;&amp;amp; pKunde.getGuthaben() &amp;gt; k.getGuthaben()) {&lt;br /&gt;
           hilfs.enqueue(pKunde);&lt;br /&gt;
           zzz = true;&lt;br /&gt;
         }&lt;br /&gt;
 10      hilfs.enqueue(k);&lt;br /&gt;
         pQueue.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
      if(!zzz){&lt;br /&gt;
        hilfs.enqueue(pKunde);&lt;br /&gt;
 15   }&lt;br /&gt;
      while (!hilfs.isEmpty()) {&lt;br /&gt;
        pQueue.enqueue(hilfs.front());&lt;br /&gt;
        hilfs.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
 20 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgabe:'''&lt;br /&gt;
&lt;br /&gt;
* Unterteile die Methode in geeignete Abschnitte und erläutere die Funktionsweise der Abschnitte. Verwende dabei geeignete Fachbegriffe.&lt;br /&gt;
* Erläutere, welchen Zweck die lokale Variable &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; erfüllt und gib ihr einen geeigneten Namen.&lt;br /&gt;
* Benenne den Zweck, den die Methode erfüllt.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Lösung (sehr ausführlich!)==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung ist sehr ausführlich, um möglichst alle Fachbegriffe unterzubringen.&amp;lt;br/&amp;gt;'''Für die Klausur ist das zu ausführlich!! Klausurlösung: siehe nächster Abschnitt!'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Fachbegriffe''' sind '''fett'''; die Lösung enthält möglichst viele Standardformulierungen.&lt;br /&gt;
&lt;br /&gt;
* Die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt; erwartet die '''Parameter''' &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; (vom Typ &amp;lt;code&amp;gt;Queue&amp;lt;/code&amp;gt;) und &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; vom '''Typ''' &amp;lt;code&amp;gt;Kunde&amp;lt;/code&amp;gt;. Die Methode gibt nichts zurück.&lt;br /&gt;
* Zu Beginn (Z. 2-3) werden die '''lokalen Variablen''' &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; '''deklariert'''; &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; wird als leere Queue '''initialisiert''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; mit dem Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird in der '''lokalen Variable''' &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; der jeweils '''vorderste''' Kunde aus &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; gespeichert. &lt;br /&gt;
** '''Wenn''' &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;,&amp;lt;br/&amp;gt;dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Z. 13-15: Wenn &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''';&amp;lt;br/&amp;gt;das geschieht, wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife noch nicht an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wurde.&lt;br /&gt;
* Z. 16-19: Alle Elemente von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
In der Variablen &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; wird festgehalten, ob &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; schon in &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; eingefügt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt deswegen am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ärmer ist als alle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt;, dann wird er hinten angehängt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Klausurlösung==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung würde in der Klausur alle Punkte bringen. ''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Zu Beginn der Methode tueWas wird &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; als Queue erzeugt und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; bekommt den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird immer geprüft, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' der ob der Parameter &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde.&lt;br /&gt;
** '''Wenn ja''', dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Nach dem Ende der Schleife wird geschaut, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat &lt;br /&gt;
** Wenn ja, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt'''.&lt;br /&gt;
** Damit ist man sicher, dass &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; genau einmal an  &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wird.&lt;br /&gt;
* Am Ende werden alle Kunden von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;. ''(Und damit ist klar, was der Zweck der Variable ist.)''&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein, ggf. auch an der letzten Stelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3771</id>
		<title>Quelltextanalyse Java</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3771"/>
		<updated>2025-09-22T16:41:52Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Klausurlösung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
'''Ziel''' der Quelltextanalyse ist es, die Funktionsweise einer Methode mithilfe geeigneter &amp;lt;u&amp;gt;Fachbegriffe&amp;lt;/u&amp;gt; möglichst &amp;lt;u&amp;gt;kurz&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;präzise&amp;lt;/u&amp;gt; zu beschreiben. Dabei sind &amp;lt;u&amp;gt;Standardformulierungen&amp;lt;/u&amp;gt; hilfreich.&lt;br /&gt;
* '''Fachbegriffe''' dienen der Präzision.&lt;br /&gt;
* '''kurz''' ist deswegen wichtig, weil man bei der Klausur möglichst wenig Zeit auf das Schreiben verwenden sollte.&lt;br /&gt;
* Auf '''Standardformulierungen''' sollte man zurückgreifen können - denn die Beschreibung für das Durchlaufen eines Queues oder einer Liste muss man nicht für jede Klausur neu erfinden.&lt;br /&gt;
** Beispiele für Standardformulierungen finden sich unten.&lt;br /&gt;
* Auf Ästhetik muss '''nicht''' geachtet werden, so sind z.B. Wiederholungen am Satzanfang kein Problem.&lt;br /&gt;
&lt;br /&gt;
=Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' im Zentralabitur=&lt;br /&gt;
Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' kommt im Zentralabitur immer '''nur in Kombination mit einem weiteren Operator''' vor.&amp;lt;br/&amp;gt;Der weitere Operator sagt aus, was zu schreiben ist.&lt;br /&gt;
&lt;br /&gt;
Konkret heißt das:&lt;br /&gt;
* '''''&amp;quot;Analysieren Sie...&amp;quot;'' heißt so viel wie ''&amp;quot;Denken Sie nach über...&amp;quot;'''''&lt;br /&gt;
* Konsequenz:&amp;lt;br/&amp;gt;&amp;lt;font color='red'&amp;gt;Für den Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' muss man &amp;lt;u&amp;gt;gar nichts aufschreiben!!&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss das nicht verstehen. &amp;lt;br/&amp;gt;Aber wer das nicht berücksichtigt, verliert im Abitur sehr viel Zeit.&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt;&lt;br /&gt;
Diese Auffassung von ''&amp;quot;Analysieren Sie...&amp;quot;'' ist sehr spezifisch für das Informatik-Zentralabitur!&amp;lt;br/&amp;gt;Bitte auf keinen Fall auf andere Fächer übertragen!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Aufgabenstellung:&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''Analysieren und erläutern Sie den Algorithmus im Sachkontext.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Was ist zu tun?&amp;lt;/u&amp;gt;&lt;br /&gt;
* ''Analysieren ...'': Einfach nur nachdenken - nichts schreiben!&lt;br /&gt;
* ''... und erläutern Sie den Algorithmus im Sachkontext'': Das ist das, was zu tun ist! &amp;lt;br/&amp;gt;Weil bei dieser Aufgabe &amp;quot;nur&amp;quot; im Sachkontext erläutert werden soll, braucht man überhaupt nicht auf Programmierungs-Details eingehen, wenn sie für den Sachkontext keine Rolle spielen.&lt;br /&gt;
&lt;br /&gt;
=Standardformulierungen=&lt;br /&gt;
Mögliche Standardformulierungen werden hier an einem Beispiel aufgezeigt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Gegeben ist die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; enthält lauter Kunden, die nach Einkommen absteigend sortiert sind, d.h. der Kunde mit dem höchsten Einkommen ist vorne.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 01  private void tueWas(Queue&amp;lt;Kunde&amp;gt; pQueue, Kunde pKunde) {&lt;br /&gt;
       Queue&amp;lt;Kunde&amp;gt; hilfs = new Queue&amp;lt;Kunde&amp;gt;();&lt;br /&gt;
       boolean zzz = false;&lt;br /&gt;
       while (!pQueue.isEmpty()) {&lt;br /&gt;
 05      Kunde k = pQueue.front();&lt;br /&gt;
         if (zzz == false &amp;amp;&amp;amp; pKunde.getGuthaben() &amp;gt; k.getGuthaben()) {&lt;br /&gt;
           hilfs.enqueue(pKunde);&lt;br /&gt;
           zzz = true;&lt;br /&gt;
         }&lt;br /&gt;
 10      hilfs.enqueue(k);&lt;br /&gt;
         pQueue.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
      if(!zzz){&lt;br /&gt;
        hilfs.enqueue(pKunde);&lt;br /&gt;
 15   }&lt;br /&gt;
      while (!hilfs.isEmpty()) {&lt;br /&gt;
        pQueue.enqueue(hilfs.front());&lt;br /&gt;
        hilfs.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
 20 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgabe:'''&lt;br /&gt;
&lt;br /&gt;
* Unterteile die Methode in geeignete Abschnitte und erläutere die Funktionsweise der Abschnitte. Verwende dabei geeignete Fachbegriffe.&lt;br /&gt;
* Erläutere, welchen Zweck die lokale Variable &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; erfüllt und gib ihr einen geeigneten Namen.&lt;br /&gt;
* Benenne den Zweck, den die Methode erfüllt.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Lösung (sehr ausführlich!)==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung ist sehr ausführlich, um möglichst alle Fachbegriffe unterzubringen.&amp;lt;br/&amp;gt;'''Für die Klausur ist das zu ausführlich!! Klausurlösung: siehe nächster Abschnitt!'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Fachbegriffe''' sind '''fett'''; die Lösung enthält möglichst viele Standardformulierungen.&lt;br /&gt;
&lt;br /&gt;
* Die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt; erwartet die '''Parameter''' &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; (vom Typ &amp;lt;code&amp;gt;Queue&amp;lt;/code&amp;gt;) und &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; vom '''Typ''' &amp;lt;code&amp;gt;Kunde&amp;lt;/code&amp;gt;. Die Methode gibt nichts zurück.&lt;br /&gt;
* Zu Beginn (Z. 2-3) werden die '''lokalen Variablen''' &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; '''deklariert'''; &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; wird als leere Queue '''initialisiert''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; mit dem Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird in der '''lokalen Variable''' &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; der jeweils '''vorderste''' Kunde aus &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; gespeichert. &lt;br /&gt;
** '''Wenn''' &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;,&amp;lt;br/&amp;gt;dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Z. 13-15: Wenn &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''';&amp;lt;br/&amp;gt;das geschieht, wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife noch nicht an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wurde.&lt;br /&gt;
* Z. 16-19: Alle Elemente von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
In der Variablen &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; wird festgehalten, ob &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; schon in &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; eingefügt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt deswegen am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ärmer ist als alle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt;, dann wird er hinten angehängt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Klausurlösung==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung würde in der Klausur alle Punkte bringen. ''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Zu Beginn der Methode tueWas wird &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; als Queue erzeugt und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; bekommt den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird immer geprüft, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' der ob der Parameter &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde.&lt;br /&gt;
** '''Wenn ja''', dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Nach dem Ende der Schleife wird geschaut, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat &lt;br /&gt;
** Wenn ja, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''';&amp;lt;br/&amp;gt;das geschieht.&lt;br /&gt;
** Damit ist man sicher, dass &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; genau einmal an  &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wird.&lt;br /&gt;
* Am Ende werden alle Kunden von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;. ''(Und damit ist klar, was der Zweck der Variable ist.)''&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein, ggf. auch an der letzten Stelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3770</id>
		<title>Quelltextanalyse Java</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Quelltextanalyse_Java&amp;diff=3770"/>
		<updated>2025-09-22T16:41:02Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Mögliche Lösung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
'''Ziel''' der Quelltextanalyse ist es, die Funktionsweise einer Methode mithilfe geeigneter &amp;lt;u&amp;gt;Fachbegriffe&amp;lt;/u&amp;gt; möglichst &amp;lt;u&amp;gt;kurz&amp;lt;/u&amp;gt; und &amp;lt;u&amp;gt;präzise&amp;lt;/u&amp;gt; zu beschreiben. Dabei sind &amp;lt;u&amp;gt;Standardformulierungen&amp;lt;/u&amp;gt; hilfreich.&lt;br /&gt;
* '''Fachbegriffe''' dienen der Präzision.&lt;br /&gt;
* '''kurz''' ist deswegen wichtig, weil man bei der Klausur möglichst wenig Zeit auf das Schreiben verwenden sollte.&lt;br /&gt;
* Auf '''Standardformulierungen''' sollte man zurückgreifen können - denn die Beschreibung für das Durchlaufen eines Queues oder einer Liste muss man nicht für jede Klausur neu erfinden.&lt;br /&gt;
** Beispiele für Standardformulierungen finden sich unten.&lt;br /&gt;
* Auf Ästhetik muss '''nicht''' geachtet werden, so sind z.B. Wiederholungen am Satzanfang kein Problem.&lt;br /&gt;
&lt;br /&gt;
=Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' im Zentralabitur=&lt;br /&gt;
Der Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' kommt im Zentralabitur immer '''nur in Kombination mit einem weiteren Operator''' vor.&amp;lt;br/&amp;gt;Der weitere Operator sagt aus, was zu schreiben ist.&lt;br /&gt;
&lt;br /&gt;
Konkret heißt das:&lt;br /&gt;
* '''''&amp;quot;Analysieren Sie...&amp;quot;'' heißt so viel wie ''&amp;quot;Denken Sie nach über...&amp;quot;'''''&lt;br /&gt;
* Konsequenz:&amp;lt;br/&amp;gt;&amp;lt;font color='red'&amp;gt;Für den Operator ''&amp;quot;Analysieren Sie...&amp;quot;'' muss man &amp;lt;u&amp;gt;gar nichts aufschreiben!!&amp;lt;/u&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man muss das nicht verstehen. &amp;lt;br/&amp;gt;Aber wer das nicht berücksichtigt, verliert im Abitur sehr viel Zeit.&lt;br /&gt;
&lt;br /&gt;
Hinweis:&amp;lt;br/&amp;gt;&lt;br /&gt;
Diese Auffassung von ''&amp;quot;Analysieren Sie...&amp;quot;'' ist sehr spezifisch für das Informatik-Zentralabitur!&amp;lt;br/&amp;gt;Bitte auf keinen Fall auf andere Fächer übertragen!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Aufgabenstellung:&amp;lt;/u&amp;gt;&amp;lt;br/&amp;gt;&lt;br /&gt;
''Analysieren und erläutern Sie den Algorithmus im Sachkontext.''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Was ist zu tun?&amp;lt;/u&amp;gt;&lt;br /&gt;
* ''Analysieren ...'': Einfach nur nachdenken - nichts schreiben!&lt;br /&gt;
* ''... und erläutern Sie den Algorithmus im Sachkontext'': Das ist das, was zu tun ist! &amp;lt;br/&amp;gt;Weil bei dieser Aufgabe &amp;quot;nur&amp;quot; im Sachkontext erläutert werden soll, braucht man überhaupt nicht auf Programmierungs-Details eingehen, wenn sie für den Sachkontext keine Rolle spielen.&lt;br /&gt;
&lt;br /&gt;
=Standardformulierungen=&lt;br /&gt;
Mögliche Standardformulierungen werden hier an einem Beispiel aufgezeigt.&lt;br /&gt;
&lt;br /&gt;
'''Beispiel:'''&lt;br /&gt;
&lt;br /&gt;
Gegeben ist die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt;. &amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; enthält lauter Kunden, die nach Einkommen absteigend sortiert sind, d.h. der Kunde mit dem höchsten Einkommen ist vorne.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
 01  private void tueWas(Queue&amp;lt;Kunde&amp;gt; pQueue, Kunde pKunde) {&lt;br /&gt;
       Queue&amp;lt;Kunde&amp;gt; hilfs = new Queue&amp;lt;Kunde&amp;gt;();&lt;br /&gt;
       boolean zzz = false;&lt;br /&gt;
       while (!pQueue.isEmpty()) {&lt;br /&gt;
 05      Kunde k = pQueue.front();&lt;br /&gt;
         if (zzz == false &amp;amp;&amp;amp; pKunde.getGuthaben() &amp;gt; k.getGuthaben()) {&lt;br /&gt;
           hilfs.enqueue(pKunde);&lt;br /&gt;
           zzz = true;&lt;br /&gt;
         }&lt;br /&gt;
 10      hilfs.enqueue(k);&lt;br /&gt;
         pQueue.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
      if(!zzz){&lt;br /&gt;
        hilfs.enqueue(pKunde);&lt;br /&gt;
 15   }&lt;br /&gt;
      while (!hilfs.isEmpty()) {&lt;br /&gt;
        pQueue.enqueue(hilfs.front());&lt;br /&gt;
        hilfs.dequeue();&lt;br /&gt;
      }&lt;br /&gt;
 20 }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Aufgabe:'''&lt;br /&gt;
&lt;br /&gt;
* Unterteile die Methode in geeignete Abschnitte und erläutere die Funktionsweise der Abschnitte. Verwende dabei geeignete Fachbegriffe.&lt;br /&gt;
* Erläutere, welchen Zweck die lokale Variable &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; erfüllt und gib ihr einen geeigneten Namen.&lt;br /&gt;
* Benenne den Zweck, den die Methode erfüllt.&lt;br /&gt;
&lt;br /&gt;
==Mögliche Lösung (sehr ausführlich!)==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung ist sehr ausführlich, um möglichst alle Fachbegriffe unterzubringen.&amp;lt;br/&amp;gt;'''Für die Klausur ist das zu ausführlich!! Klausurlösung: siehe nächster Abschnitt!'''''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Fachbegriffe''' sind '''fett'''; die Lösung enthält möglichst viele Standardformulierungen.&lt;br /&gt;
&lt;br /&gt;
* Die Methode &amp;lt;code&amp;gt;tueWas&amp;lt;/code&amp;gt; erwartet die '''Parameter''' &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; (vom Typ &amp;lt;code&amp;gt;Queue&amp;lt;/code&amp;gt;) und &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; vom '''Typ''' &amp;lt;code&amp;gt;Kunde&amp;lt;/code&amp;gt;. Die Methode gibt nichts zurück.&lt;br /&gt;
* Zu Beginn (Z. 2-3) werden die '''lokalen Variablen''' &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; '''deklariert'''; &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; wird als leere Queue '''initialisiert''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; mit dem Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird in der '''lokalen Variable''' &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt; der jeweils '''vorderste''' Kunde aus &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; gespeichert. &lt;br /&gt;
** '''Wenn''' &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde &amp;lt;code&amp;gt;k&amp;lt;/code&amp;gt;,&amp;lt;br/&amp;gt;dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Z. 13-15: Wenn &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''';&amp;lt;br/&amp;gt;das geschieht, wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; in der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-Schleife noch nicht an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wurde.&lt;br /&gt;
* Z. 16-19: Alle Elemente von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
In der Variablen &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; wird festgehalten, ob &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; schon in &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; eingefügt wurde.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt deswegen am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wenn &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ärmer ist als alle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt;, dann wird er hinten angehängt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Klausurlösung==&lt;br /&gt;
&amp;lt;font color='red'&amp;gt;''Diese Lösung würde in der Klausur alle Punkte bringen. ''&amp;lt;/font&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Zu Beginn der Methode tueWas wird die '''lokalen Variablen''' &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; als Queue erzeugt und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; bekommt den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In der &amp;lt;code&amp;gt;while&amp;lt;/code&amp;gt;-'''Schleife''' (Z.4-12) wird &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; '''nach und nach geleert''' und hinten an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''angehängt''' (Z. 4+5+10+11).&lt;br /&gt;
** Dabei wird immer geprüft, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; noch &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; ist '''und''' der ob der Parameter &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; ein größeres Einkommen hat als der vorderste Kunde.&lt;br /&gt;
** '''Wenn ja''', dann wird  &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''' und &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; auf &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; gesetzt.&lt;br /&gt;
* Nach dem Ende der Schleife wird geschaut, ob &amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; den Wert &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; hat &lt;br /&gt;
** Wenn ja, dann wird &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; jetzt an &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; '''hinten angehängt''';&amp;lt;br/&amp;gt;das geschieht.&lt;br /&gt;
** Damit ist man sicher, dass &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; genau einmal an  &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; angehängt wird.&lt;br /&gt;
* Am Ende werden alle Kunden von &amp;lt;code&amp;gt;hilfs&amp;lt;/code&amp;gt; werden wieder auf &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; zurückübertragen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;zzz&amp;lt;/code&amp;gt; heißt am besten &amp;lt;code&amp;gt;schonEingefuegt&amp;lt;/code&amp;gt;. ''(Und damit ist klar, was der Zweck der Variable ist.)''&lt;br /&gt;
&lt;br /&gt;
Die Methode fügt &amp;lt;code&amp;gt;pKunde&amp;lt;/code&amp;gt; gemäß seinem Einkommen an der richtigen Stelle in &amp;lt;code&amp;gt;pQueue&amp;lt;/code&amp;gt; ein, ggf. auch an der letzten Stelle.&amp;lt;br/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Eclipse_Tricks&amp;diff=3769</id>
		<title>Eclipse Tricks</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Eclipse_Tricks&amp;diff=3769"/>
		<updated>2025-08-30T07:44:22Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Shortcuts und Tricks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
* Allgemeine Infos zu Eclipse: [[Eclipse]]&lt;br /&gt;
* Tricks für die Java-Entwicklung: [[Java Tricks]]&lt;br /&gt;
&lt;br /&gt;
=Shortcuts und Tricks=&lt;br /&gt;
Da Eclipse das Tool schlechthin im Informatik-Unterricht der Q1 und Q2 ist, werden hier einige hilfreiche Shortcuts und Tricks aufgeführt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Tipps sind hier '''alphabetisch''' aufgeführt. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ggf. tauchen sie hier auch mehrfach (unter verschiedenen Titeln) auf.&lt;br /&gt;
&lt;br /&gt;
* '''Ansicht wiederherstellen:''': Window -&amp;gt; perspective -&amp;gt; reset perspective&lt;br /&gt;
* '''Breakpoint für Debugging setzen''': Doppelklick ''links'' neben einer Zeilennummer.&lt;br /&gt;
* '''Correct Indentation''' (Einrückungen korrigieren): STRG+a und dann STRG+i (indentation)&lt;br /&gt;
* '''Debugging-Ansicht:''' Debug (rechts oben)&lt;br /&gt;
* '''Debugging starten:''' Den Käfer anklicken.&lt;br /&gt;
* '''Einrückungen korrigieren''' (correct indentation): STRG+a und dann STRG+i (indentation)&lt;br /&gt;
* '''ersetzen (Textfragment)''': STRG+f (find)&lt;br /&gt;
* '''for-Schleife erzeugen''': for STRG+Leertaste&lt;br /&gt;
* '''get-Methoden und set-Methoden erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate getters and setters&lt;br /&gt;
* '''Java-Entwicklungs-Ansicht''': Java (rechts oben)&lt;br /&gt;
* '''Klasse in ein Projekt einfügen:''' Aus dem Windows-Explorer mit Drag&amp;amp;Drop an die richtige Stelle im Package-Explorer (links) ziehen.&lt;br /&gt;
* '''Klasse neu erzeugen:''' File -&amp;gt; New -&amp;gt; Class ''(oder direkt den &amp;quot;C&amp;quot;-Button anklicken)''&lt;br /&gt;
* '''Konstruktor erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate constructor using fields&lt;br /&gt;
* '''main-Methode erzeugen''': main STRG+Leertaste&lt;br /&gt;
* '''neue Klasse erzeugen:''' File -&amp;gt; New -&amp;gt; Class ''(oder direkt den &amp;quot;C&amp;quot;-Button anklicken)''&lt;br /&gt;
* '''rename (Klasse, Attribut oder Methode)''': SHIFT+ALT+R (rename). Damit wird die Klasse (Attribut, Methode) überall umbenannt!&lt;br /&gt;
* '''suchen (Textfragment)''': STRG+f (find)&lt;br /&gt;
* '''toString()-Methode erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate toString()&lt;br /&gt;
* '''umbenennen (Klasse, Attribut oder Methode)''': SHIFT+ALT+R (rename). Damit wird die Klasse (Attribut, Methode) überall umbenannt!&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Eclipse_Tricks&amp;diff=3768</id>
		<title>Eclipse Tricks</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Eclipse_Tricks&amp;diff=3768"/>
		<updated>2025-08-30T07:43:58Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Shortcuts und Tricks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
* Allgemeine Infos zu Eclipse: [[Eclipse]]&lt;br /&gt;
* Tricks für die Java-Entwicklung: [[Java Tricks]]&lt;br /&gt;
&lt;br /&gt;
=Shortcuts und Tricks=&lt;br /&gt;
Da Eclipse das Tool schlechthin im Informatik-Unterricht der Q1 und Q2 ist, werden hier einige hilfreiche Shortcuts und Tricks aufgeführt.&amp;lt;br/&amp;gt;&lt;br /&gt;
Die Tipps sind hier '''alphabetisch''' aufgeführt. &amp;lt;br/&amp;gt;&lt;br /&gt;
Ggf. tauchen sie hier auch mehrfach (unter verschiedenen Titeln) auf.&lt;br /&gt;
&lt;br /&gt;
* '''Ansicht wiederherstellen:''': Window -&amp;gt; reset perspective&lt;br /&gt;
* '''Breakpoint für Debugging setzen''': Doppelklick ''links'' neben einer Zeilennummer.&lt;br /&gt;
* '''Correct Indentation''' (Einrückungen korrigieren): STRG+a und dann STRG+i (indentation)&lt;br /&gt;
* '''Debugging-Ansicht:''' Debug (rechts oben)&lt;br /&gt;
* '''Debugging starten:''' Den Käfer anklicken.&lt;br /&gt;
* '''Einrückungen korrigieren''' (correct indentation): STRG+a und dann STRG+i (indentation)&lt;br /&gt;
* '''ersetzen (Textfragment)''': STRG+f (find)&lt;br /&gt;
* '''for-Schleife erzeugen''': for STRG+Leertaste&lt;br /&gt;
* '''get-Methoden und set-Methoden erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate getters and setters&lt;br /&gt;
* '''Java-Entwicklungs-Ansicht''': Java (rechts oben)&lt;br /&gt;
* '''Klasse in ein Projekt einfügen:''' Aus dem Windows-Explorer mit Drag&amp;amp;Drop an die richtige Stelle im Package-Explorer (links) ziehen.&lt;br /&gt;
* '''Klasse neu erzeugen:''' File -&amp;gt; New -&amp;gt; Class ''(oder direkt den &amp;quot;C&amp;quot;-Button anklicken)''&lt;br /&gt;
* '''Konstruktor erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate constructor using fields&lt;br /&gt;
* '''main-Methode erzeugen''': main STRG+Leertaste&lt;br /&gt;
* '''neue Klasse erzeugen:''' File -&amp;gt; New -&amp;gt; Class ''(oder direkt den &amp;quot;C&amp;quot;-Button anklicken)''&lt;br /&gt;
* '''rename (Klasse, Attribut oder Methode)''': SHIFT+ALT+R (rename). Damit wird die Klasse (Attribut, Methode) überall umbenannt!&lt;br /&gt;
* '''suchen (Textfragment)''': STRG+f (find)&lt;br /&gt;
* '''toString()-Methode erzeugen''': rechte Maustaste -&amp;gt; source -&amp;gt; generate toString()&lt;br /&gt;
* '''umbenennen (Klasse, Attribut oder Methode)''': SHIFT+ALT+R (rename). Damit wird die Klasse (Attribut, Methode) überall umbenannt!&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3767</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3767"/>
		<updated>2025-08-27T17:20:54Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Eclipse: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer '''echten Entwicklungsumgebung''' (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen sonst noch alles können!&lt;br /&gt;
* Man hat '''alles in einem Projekt''' und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse==&lt;br /&gt;
# Die Github-URL (siehe oben) in die Zwischenablage kopieren.&lt;br /&gt;
# Eclipse: File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Clone URI anklicken und Next.&lt;br /&gt;
# URI eintragen. Der Rest erscheint automatisch. Next klicken.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; das Verzeichnis wählen, wo das Projekt hin soll.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3766</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3766"/>
		<updated>2025-08-27T17:20:23Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse==&lt;br /&gt;
# Die Github-URL (siehe oben) in die Zwischenablage kopieren.&lt;br /&gt;
# Eclipse: File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Clone URI anklicken und Next.&lt;br /&gt;
# URI eintragen. Der Rest erscheint automatisch. Next klicken.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; das Verzeichnis wählen, wo das Projekt hin soll.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3765</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3765"/>
		<updated>2025-08-27T17:15:42Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Eclipse: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3764</id>
		<title>Eclipse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3764"/>
		<updated>2025-07-06T15:14:30Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eclipse ist eine professionelle Entwicklungsumgebung für Java. Eclipse ist Open Source und damit gratis.&lt;br /&gt;
&lt;br /&gt;
Am SIBI arbeiten wir in Eclipse vor allem mit dem [[Projekt_java_Q1Q2]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Wenn man Eclipse installiert und das [[Projekt_java_Q1Q2]] runtergeladen und mit Eclipse geöffnet hat, dann hat man softwaremäßig bis zum Abitur ausgesorgt!'''&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;'''D.h. der Aufwand lohnt sich!!!'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Eclipse Installation mit JRE (Java Runtime Environment) =&lt;br /&gt;
''Hier wird nur gezeigt, wie man Eclipse als Paket mit einer JRE (Java Runtime Environment) installiert.&amp;lt;br/&amp;gt;Wer Java schon installiert hat, kann auf eine Installation ohne JRE zurückgreifen. &amp;lt;br/&amp;gt;Die installierte Java-Version muss sich aber für Eclipse eignen! (Das tun nicht alle Java-Versionen.) ''&lt;br /&gt;
&lt;br /&gt;
* [http://www.eclipse.org/downloads/ Eclipse Downloads]&lt;br /&gt;
* Install your favorite desktop IDE packages:&lt;br /&gt;
** Download klicken&lt;br /&gt;
** Download x86_64&lt;br /&gt;
** Auf der nächsten Seite &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; klicken.&amp;lt;br/&amp;gt;Das ist ein Eclipse-Installer, mit dem man verschiedene Eclipse-Versionen installieren kann.&lt;br /&gt;
* Nach dem Runterladen des Installers:&lt;br /&gt;
** Installer &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; mit Doppelklick starten.&lt;br /&gt;
** '''Eclipse IDE for Java Developers''' wählen.&amp;lt;br/&amp;gt;Das ist die minimale Eclipse-Version, die aber VIEL schneller hochfährt als andere Versionen, die noch alles Mögliche sonst können (was man nicht braucht).&lt;br /&gt;
&lt;br /&gt;
=Projekt java_Q1Q2=&lt;br /&gt;
Das ist das große Projekt, was alle Java-Entwicklung für die ganze Oberstufe abdeckt:&lt;br /&gt;
&lt;br /&gt;
[[Projekt_java_Q1Q2]]&lt;br /&gt;
&lt;br /&gt;
=Tricks im Umgang mit Eclipse=&lt;br /&gt;
Wichtige Shortcuts etc., die einem das Leben leichter machen:&lt;br /&gt;
&lt;br /&gt;
[[Eclipse Tricks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Neues Projekt in Eclipse anlegen=&lt;br /&gt;
Wer selber mit Eclipse ein Projekt aufsetzen will, kann wie folgt ein neues Projekt anlegen:&lt;br /&gt;
* File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
* Haken wegnehmen bei &amp;quot;Use default location&amp;quot;&lt;br /&gt;
* Mit &amp;quot;Browse&amp;quot; den Ordner des Eclipse-Projektes angeben.&lt;br /&gt;
* Finish klicken.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3763</id>
		<title>Eclipse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3763"/>
		<updated>2025-07-06T15:14:02Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Graphische Oberflächen mit Eclipse programmieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eclipse ist eine professionelle Entwicklungsumgebung für Java. Eclipse ist Open Source und damit gratis.&lt;br /&gt;
&lt;br /&gt;
Am SIBI arbeiten wir in Eclipse vor allem mit dem [[Projekt_java_Q1Q2]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Wenn man Eclipse installiert und das [[Projekt_java_Q1Q2]] runtergeladen und mit Eclipse geöffnet hat, dann hat man softwaremäßig bis zum Abitur ausgesorgt!'''&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;'''D.h. der Aufwand lohnt sich!!!'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Eclipse Installation mit JRE (Java Runtime Environment) =&lt;br /&gt;
''Hier wird nur gezeigt, wie man Eclipse als Paket mit einer JRE (Java Runtime Environment) installiert.&amp;lt;br/&amp;gt;Wer Java schon installiert hat, kann auf eine Installation ohne JRE zurückgreifen. &amp;lt;br/&amp;gt;Die installierte Java-Version muss sich aber für Eclipse eignen! (Das tun nicht alle Java-Versionen.) ''&lt;br /&gt;
&lt;br /&gt;
* [http://www.eclipse.org/downloads/ Eclipse Downloads]&lt;br /&gt;
* Install your favorite desktop IDE packages:&lt;br /&gt;
** Download klicken&lt;br /&gt;
** Download x86_64&lt;br /&gt;
** Auf der nächsten Seite &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; klicken.&amp;lt;br/&amp;gt;Das ist ein Eclipse-Installer, mit dem man verschiedene Eclipse-Versionen installieren kann.&lt;br /&gt;
* Nach dem Runterladen des Installers:&lt;br /&gt;
** Installer &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; mit Doppelklick starten.&lt;br /&gt;
** '''Eclipse IDE for Java Developers''' wählen.&amp;lt;br/&amp;gt;Das ist die minimale Eclipse-Version, die aber VIEL schneller hochfährt als andere Versionen, die noch alles Mögliche sonst können (was man nicht braucht).&lt;br /&gt;
&lt;br /&gt;
=Projekt java_Q1Q2=&lt;br /&gt;
Das ist das große Projekt, was alle Java-Entwicklung für die ganze Oberstufe abdeckt:&lt;br /&gt;
&lt;br /&gt;
[[Projekt_java_Q1Q2]]&lt;br /&gt;
&lt;br /&gt;
=Tricks im Umgang mit Eclipse=&lt;br /&gt;
Wichtige Shortcuts etc., die einem das Leben leichter machen:&lt;br /&gt;
&lt;br /&gt;
[[Eclipse Tricks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Neues Projekt in Eclipse anlegen=&lt;br /&gt;
Wer selber mit Eclipse ein Projekt aufsetzen will, kann wie folgt ein neues Projekt anlegen:&lt;br /&gt;
* File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
* Haken wegnehmen bei &amp;quot;Use default location&amp;quot;&lt;br /&gt;
* Mit &amp;quot;Browse&amp;quot; den Ordner des Eclipse-Projektes angeben.&lt;br /&gt;
* Finish klicken.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3762</id>
		<title>Eclipse</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Eclipse&amp;diff=3762"/>
		<updated>2025-07-06T15:13:15Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Eclipse Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eclipse ist eine professionelle Entwicklungsumgebung für Java. Eclipse ist Open Source und damit gratis.&lt;br /&gt;
&lt;br /&gt;
Am SIBI arbeiten wir in Eclipse vor allem mit dem [[Projekt_java_Q1Q2]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;'''Wenn man Eclipse installiert und das [[Projekt_java_Q1Q2]] runtergeladen und mit Eclipse geöffnet hat, dann hat man softwaremäßig bis zum Abitur ausgesorgt!'''&amp;lt;/u&amp;gt; &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;u&amp;gt;'''D.h. der Aufwand lohnt sich!!!'''&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Eclipse Installation mit JRE (Java Runtime Environment) =&lt;br /&gt;
''Hier wird nur gezeigt, wie man Eclipse als Paket mit einer JRE (Java Runtime Environment) installiert.&amp;lt;br/&amp;gt;Wer Java schon installiert hat, kann auf eine Installation ohne JRE zurückgreifen. &amp;lt;br/&amp;gt;Die installierte Java-Version muss sich aber für Eclipse eignen! (Das tun nicht alle Java-Versionen.) ''&lt;br /&gt;
&lt;br /&gt;
* [http://www.eclipse.org/downloads/ Eclipse Downloads]&lt;br /&gt;
* Install your favorite desktop IDE packages:&lt;br /&gt;
** Download klicken&lt;br /&gt;
** Download x86_64&lt;br /&gt;
** Auf der nächsten Seite &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; klicken.&amp;lt;br/&amp;gt;Das ist ein Eclipse-Installer, mit dem man verschiedene Eclipse-Versionen installieren kann.&lt;br /&gt;
* Nach dem Runterladen des Installers:&lt;br /&gt;
** Installer &amp;quot;eclipse-inst-jre-win64.exe&amp;quot; mit Doppelklick starten.&lt;br /&gt;
** '''Eclipse IDE for Java Developers''' wählen.&amp;lt;br/&amp;gt;Das ist die minimale Eclipse-Version, die aber VIEL schneller hochfährt als andere Versionen, die noch alles Mögliche sonst können (was man nicht braucht).&lt;br /&gt;
&lt;br /&gt;
=Projekt java_Q1Q2=&lt;br /&gt;
Das ist das große Projekt, was alle Java-Entwicklung für die ganze Oberstufe abdeckt:&lt;br /&gt;
&lt;br /&gt;
[[Projekt_java_Q1Q2]]&lt;br /&gt;
&lt;br /&gt;
=Tricks im Umgang mit Eclipse=&lt;br /&gt;
Wichtige Shortcuts etc., die einem das Leben leichter machen:&lt;br /&gt;
&lt;br /&gt;
[[Eclipse Tricks]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Neues Projekt in Eclipse anlegen=&lt;br /&gt;
Wer selber mit Eclipse ein Projekt aufsetzen will, kann wie folgt ein neues Projekt anlegen:&lt;br /&gt;
* File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
* Haken wegnehmen bei &amp;quot;Use default location&amp;quot;&lt;br /&gt;
* Mit &amp;quot;Browse&amp;quot; den Ordner des Eclipse-Projektes angeben.&lt;br /&gt;
* Finish klicken.&lt;br /&gt;
=Graphische Oberflächen mit Eclipse programmieren=&lt;br /&gt;
&lt;br /&gt;
Um Graphische Oberflächen (Graphical User Interfaces = GUI) zu programmieren, nutzt man am besten das Plugin '''WindowBuilder''', das im SIBI bei Eclipse schon dabei ist.&lt;br /&gt;
RIESIGER Vorteil: Man kann die Oberfläche größtenteils &amp;quot;zusammenklicken&amp;quot;!&lt;br /&gt;
Ein &amp;quot;Kochrezept&amp;quot; dazu gibt es hier:&lt;br /&gt;
'''[[Datei:WindowBuilderCheatSheet.pdf]]'''&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3761</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=3761"/>
		<updated>2025-07-06T10:24:17Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Fachbegriffe */&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;
=Fachbegriffe=&lt;br /&gt;
Die folgenden Fachbegriffe sind für den Unterricht wichtig, damit man zielführend über Implementierung reden kann.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer sich bei Fachbegriffen nicht sicher ist, kann die meisten mit STRG+F auf dieser Seite finden.&lt;br /&gt;
* Anweisung (= eine Zeile, wo etwas &amp;quot;getan&amp;quot; wird, z.B. &amp;lt;code&amp;gt;anzahl++;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''[[Klasse|Klasse]]'''&lt;br /&gt;
** Objekt (Von einer Klasse kann man mehrere Objekte erzeugen.)&lt;br /&gt;
** erzeugen eines Objektes: &amp;lt;code&amp;gt;Person p = '''new''' Person(&amp;quot;Mustermann&amp;quot;, &amp;quot;Max&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
** Attribut&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
** Konstruktor&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Methoden|Methode]]'''&lt;br /&gt;
** Parameter&lt;br /&gt;
** lokale Variable&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
*** Wert erhöhen/verringern um..., z.B. &amp;lt;code&amp;gt;anzahl += 3;&amp;lt;/code&amp;gt;&lt;br /&gt;
*** um eins erhöhen, z.B. &amp;lt;code&amp;gt;anzahl ++;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Rückgabetyp&lt;br /&gt;
** public / private&lt;br /&gt;
** Methode verlassen: &amp;lt;code&amp;gt;return;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wert &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben, z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben (siehe weiter unten)&amp;lt;/i&amp;gt;&lt;br /&gt;
** Methodenaufruf, ggf. mit Parameter und Rückgabe&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Verzweigungen_(if-else)|Bedingung]]'''&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Schleifen_(while,_for,_do-while)|Schleife]]'''&lt;br /&gt;
** Zählschleife (for)&lt;br /&gt;
** bedingte Schleife (while)&lt;br /&gt;
** Schleife verlassen: &amp;lt;code&amp;gt;break;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Schleife beim nächsten Element fortsetzen: &amp;lt;code&amp;gt;continue;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Java_Basis-Sprachelemente#NullPointerException|NullPointerException]]&lt;br /&gt;
* &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben: &amp;lt;code&amp;gt;System.out.println(&amp;quot;Hallo&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben (siehe weiter oben)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fachbegriffe für Algorithmen==&lt;br /&gt;
In der EF geht es um Algorithmen, die Schleifen und Bedingungen enthalten. Man sollte Algorithmen auch in mehrere Methoden zerlegen können, um sie beherrschbar zu machen. Dafür ist das folgende Fachvokabular sinnvoll:&lt;br /&gt;
* Die Methode ... hat als Parameter ... &lt;br /&gt;
* Abbruchbedingung: Wenn ...., wird die Methode verlassen und ... zurückgegeben.&lt;br /&gt;
* eine Variable ... mit Startwert ... festlegen.&lt;br /&gt;
* ... mit einer Schleife ... durchlaufen.&lt;br /&gt;
* für jedes Element...&lt;br /&gt;
* wenn ... (sonst...)&lt;br /&gt;
* Es wird die (Hilfs-)Methode ... mit dem Wert ... aufgerufen. &amp;lt;br/&amp;gt;Die Rückgabe der Methode wird ... .&lt;br /&gt;
* Die Variable ... erhöhen/verringern um ...&lt;br /&gt;
* Am Ende ... zurückgeben.&lt;br /&gt;
&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;
=lokale Variable=&lt;br /&gt;
* lokale Variablen müssen '''deklariert''' werden. &amp;lt;br/&amp;gt;Das heißt: Man legt fest, welchen '''Typ''' die Variable hat. &amp;lt;br/&amp;gt;Häufige Typen von Variablen sind:&lt;br /&gt;
** &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;: Für eine ganze Zahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;: Für eine Kommazahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;: Für einen Text&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:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
     public int summeZahlenBis100Ausgeben()&lt;br /&gt;
     {&lt;br /&gt;
        // Deklaration der lokalen Variable zahl; zahl wird auf 1 gesetzt.&lt;br /&gt;
        '''int zahl = 1''';&lt;br /&gt;
        // Deklaration der lokalen Variable ergebnis; ergebnis wird auf 0 gesetzt.&lt;br /&gt;
        '''int ergebnis = 0''';&lt;br /&gt;
        // Schleife, mit der bis 100 gezählt wird.&lt;br /&gt;
        while( zahl &amp;lt;= 100) {&lt;br /&gt;
           // Ergebnis wird um zahl erhöht.&lt;br /&gt;
           '''ergebnis += zahl''';&lt;br /&gt;
           // zahl wird um 1 erhöht.&lt;br /&gt;
           '''zahl++''';&lt;br /&gt;
        }&lt;br /&gt;
        // ergebnis zurückgeben&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wert zuweisen (Attributen und lokalen Variablen) =&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;
= Bedingungen (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;
&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;
= 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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3760</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=3760"/>
		<updated>2025-07-06T10:22:34Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Wertzuweisungen */&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;
=Fachbegriffe=&lt;br /&gt;
Die folgenden Fachbegriffe sind für den Unterricht wichtig, damit man zielführend über Implementierung reden kann.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer sich bei Fachbegriffen nicht sicher ist, kann die meisten mit STRG+F auf dieser Seite finden.&lt;br /&gt;
* Anweisung (= eine Zeile, wo etwas &amp;quot;getan&amp;quot; wird, z.B. &amp;lt;code&amp;gt;anzahl++;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''[[Klasse|Klasse]]'''&lt;br /&gt;
** Objekt (Von einer Klasse kann man mehrere Objekte erzeugen.)&lt;br /&gt;
** erzeugen eines Objektes: &amp;lt;code&amp;gt;Person p = '''new''' Person(&amp;quot;Mustermann&amp;quot;, &amp;quot;Max&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
** Attribut&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
** Konstruktor&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Methoden|Methode]]'''&lt;br /&gt;
** Parameter&lt;br /&gt;
** lokale Variable&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
** Rückgabetyp&lt;br /&gt;
** public / private&lt;br /&gt;
** Methode verlassen: &amp;lt;code&amp;gt;return;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wert &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben, z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben (siehe weiter unten)&amp;lt;/i&amp;gt;&lt;br /&gt;
** Methodenaufruf, ggf. mit Parameter und Rückgabe&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Verzweigungen_(if-else)|Bedingung]]'''&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Schleifen_(while,_for,_do-while)|Schleife]]'''&lt;br /&gt;
** Zählschleife (for)&lt;br /&gt;
** bedingte Schleife (while)&lt;br /&gt;
** Schleife verlassen: &amp;lt;code&amp;gt;break;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Schleife beim nächsten Element fortsetzen: &amp;lt;code&amp;gt;continue;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Java_Basis-Sprachelemente#NullPointerException|NullPointerException]]&lt;br /&gt;
* &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben: &amp;lt;code&amp;gt;System.out.println(&amp;quot;Hallo&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben (siehe weiter oben)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fachbegriffe für Algorithmen==&lt;br /&gt;
In der EF geht es um Algorithmen, die Schleifen und Bedingungen enthalten. Man sollte Algorithmen auch in mehrere Methoden zerlegen können, um sie beherrschbar zu machen. Dafür ist das folgende Fachvokabular sinnvoll:&lt;br /&gt;
* Die Methode ... hat als Parameter ... &lt;br /&gt;
* Abbruchbedingung: Wenn ...., wird die Methode verlassen und ... zurückgegeben.&lt;br /&gt;
* eine Variable ... mit Startwert ... festlegen.&lt;br /&gt;
* ... mit einer Schleife ... durchlaufen.&lt;br /&gt;
* für jedes Element...&lt;br /&gt;
* wenn ... (sonst...)&lt;br /&gt;
* Es wird die (Hilfs-)Methode ... mit dem Wert ... aufgerufen. &amp;lt;br/&amp;gt;Die Rückgabe der Methode wird ... .&lt;br /&gt;
* Die Variable ... erhöhen/verringern um ...&lt;br /&gt;
* Am Ende ... zurückgeben.&lt;br /&gt;
&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;
=lokale Variable=&lt;br /&gt;
* lokale Variablen müssen '''deklariert''' werden. &amp;lt;br/&amp;gt;Das heißt: Man legt fest, welchen '''Typ''' die Variable hat. &amp;lt;br/&amp;gt;Häufige Typen von Variablen sind:&lt;br /&gt;
** &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;: Für eine ganze Zahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;: Für eine Kommazahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;: Für einen Text&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:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
     public int summeZahlenBis100Ausgeben()&lt;br /&gt;
     {&lt;br /&gt;
        // Deklaration der lokalen Variable zahl; zahl wird auf 1 gesetzt.&lt;br /&gt;
        '''int zahl = 1''';&lt;br /&gt;
        // Deklaration der lokalen Variable ergebnis; ergebnis wird auf 0 gesetzt.&lt;br /&gt;
        '''int ergebnis = 0''';&lt;br /&gt;
        // Schleife, mit der bis 100 gezählt wird.&lt;br /&gt;
        while( zahl &amp;lt;= 100) {&lt;br /&gt;
           // Ergebnis wird um zahl erhöht.&lt;br /&gt;
           '''ergebnis += zahl''';&lt;br /&gt;
           // zahl wird um 1 erhöht.&lt;br /&gt;
           '''zahl++''';&lt;br /&gt;
        }&lt;br /&gt;
        // ergebnis zurückgeben&lt;br /&gt;
        return ergebnis;&lt;br /&gt;
     }&lt;br /&gt;
 &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Wert zuweisen (Attributen und lokalen Variablen) =&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;
= Bedingungen (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;
&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;
= 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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3759</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=3759"/>
		<updated>2025-07-06T10:22:04Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Fachbegriffe */&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;
=Fachbegriffe=&lt;br /&gt;
Die folgenden Fachbegriffe sind für den Unterricht wichtig, damit man zielführend über Implementierung reden kann.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer sich bei Fachbegriffen nicht sicher ist, kann die meisten mit STRG+F auf dieser Seite finden.&lt;br /&gt;
* Anweisung (= eine Zeile, wo etwas &amp;quot;getan&amp;quot; wird, z.B. &amp;lt;code&amp;gt;anzahl++;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''[[Klasse|Klasse]]'''&lt;br /&gt;
** Objekt (Von einer Klasse kann man mehrere Objekte erzeugen.)&lt;br /&gt;
** erzeugen eines Objektes: &amp;lt;code&amp;gt;Person p = '''new''' Person(&amp;quot;Mustermann&amp;quot;, &amp;quot;Max&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
** Attribut&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
** Konstruktor&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Methoden|Methode]]'''&lt;br /&gt;
** Parameter&lt;br /&gt;
** lokale Variable&lt;br /&gt;
*** Wert zuweisen&lt;br /&gt;
** Rückgabetyp&lt;br /&gt;
** public / private&lt;br /&gt;
** Methode verlassen: &amp;lt;code&amp;gt;return;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wert &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben, z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben (siehe weiter unten)&amp;lt;/i&amp;gt;&lt;br /&gt;
** Methodenaufruf, ggf. mit Parameter und Rückgabe&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Verzweigungen_(if-else)|Bedingung]]'''&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Schleifen_(while,_for,_do-while)|Schleife]]'''&lt;br /&gt;
** Zählschleife (for)&lt;br /&gt;
** bedingte Schleife (while)&lt;br /&gt;
** Schleife verlassen: &amp;lt;code&amp;gt;break;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Schleife beim nächsten Element fortsetzen: &amp;lt;code&amp;gt;continue;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Java_Basis-Sprachelemente#NullPointerException|NullPointerException]]&lt;br /&gt;
* &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben: &amp;lt;code&amp;gt;System.out.println(&amp;quot;Hallo&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben (siehe weiter oben)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fachbegriffe für Algorithmen==&lt;br /&gt;
In der EF geht es um Algorithmen, die Schleifen und Bedingungen enthalten. Man sollte Algorithmen auch in mehrere Methoden zerlegen können, um sie beherrschbar zu machen. Dafür ist das folgende Fachvokabular sinnvoll:&lt;br /&gt;
* Die Methode ... hat als Parameter ... &lt;br /&gt;
* Abbruchbedingung: Wenn ...., wird die Methode verlassen und ... zurückgegeben.&lt;br /&gt;
* eine Variable ... mit Startwert ... festlegen.&lt;br /&gt;
* ... mit einer Schleife ... durchlaufen.&lt;br /&gt;
* für jedes Element...&lt;br /&gt;
* wenn ... (sonst...)&lt;br /&gt;
* Es wird die (Hilfs-)Methode ... mit dem Wert ... aufgerufen. &amp;lt;br/&amp;gt;Die Rückgabe der Methode wird ... .&lt;br /&gt;
* Die Variable ... erhöhen/verringern um ...&lt;br /&gt;
* Am Ende ... zurückgeben.&lt;br /&gt;
&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;
=lokale Variable=&lt;br /&gt;
* lokale Variablen müssen '''deklariert''' werden. &amp;lt;br/&amp;gt;Das heißt: Man legt fest, welchen '''Typ''' die Variable hat. &amp;lt;br/&amp;gt;Häufige Typen von Variablen sind:&lt;br /&gt;
** &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;: Für eine ganze Zahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;: Für eine Kommazahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;: Für einen Text&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:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
     public int summeZahlenBis100Ausgeben()&lt;br /&gt;
     {&lt;br /&gt;
        // Deklaration der lokalen Variable zahl; zahl wird auf 1 gesetzt.&lt;br /&gt;
        '''int zahl = 1''';&lt;br /&gt;
        // Deklaration der lokalen Variable ergebnis; ergebnis wird auf 0 gesetzt.&lt;br /&gt;
        '''int ergebnis = 0''';&lt;br /&gt;
        // Schleife, mit der bis 100 gezählt wird.&lt;br /&gt;
        while( zahl &amp;lt;= 100) {&lt;br /&gt;
           // Ergebnis wird um zahl erhöht.&lt;br /&gt;
           '''ergebnis += zahl''';&lt;br /&gt;
           // zahl wird um 1 erhöht.&lt;br /&gt;
           '''zahl++''';&lt;br /&gt;
        }&lt;br /&gt;
        // ergebnis zurückgeben&lt;br /&gt;
        return ergebnis;&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;
= Bedingungen (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;
&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;
= 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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Java_Basis-Sprachelemente&amp;diff=3758</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=3758"/>
		<updated>2025-07-06T10:20:19Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* 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;
=Fachbegriffe=&lt;br /&gt;
Die folgenden Fachbegriffe sind für den Unterricht wichtig, damit man zielführend über Implementierung reden kann.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer sich bei Fachbegriffen nicht sicher ist, kann die meisten mit STRG+F auf dieser Seite finden.&lt;br /&gt;
* Anweisung (= eine Zeile, wo etwas &amp;quot;getan&amp;quot; wird, z.B. &amp;lt;code&amp;gt;anzahl++;&amp;lt;/code&amp;gt;)&lt;br /&gt;
* '''[[Klasse|Klasse]]'''&lt;br /&gt;
** Objekt (Von einer Klasse kann man mehrere Objekte erzeugen.)&lt;br /&gt;
** erzeugen eines Objektes: &amp;lt;code&amp;gt;Person p = '''new''' Person(&amp;quot;Mustermann&amp;quot;, &amp;quot;Max&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
** Attribut&lt;br /&gt;
** Konstruktor&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Methoden|Methode]]'''&lt;br /&gt;
** Parameter&lt;br /&gt;
** lokale Variable&lt;br /&gt;
** Rückgabetyp&lt;br /&gt;
** public / private&lt;br /&gt;
** Methode verlassen: &amp;lt;code&amp;gt;return;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Wert &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben, z.B.: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben (siehe weiter unten)&amp;lt;/i&amp;gt;&lt;br /&gt;
** Methodenaufruf, ggf. mit Parameter und Rückgabe&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Verzweigungen_(if-else)|Bedingung]]'''&lt;br /&gt;
* '''[[Java_Basis-Sprachelemente#Schleifen_(while,_for,_do-while)|Schleife]]'''&lt;br /&gt;
** Zählschleife (for)&lt;br /&gt;
** bedingte Schleife (while)&lt;br /&gt;
** Schleife verlassen: &amp;lt;code&amp;gt;break;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Schleife beim nächsten Element fortsetzen: &amp;lt;code&amp;gt;continue;&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Java_Basis-Sprachelemente#NullPointerException|NullPointerException]]&lt;br /&gt;
* &amp;lt;u&amp;gt;aus&amp;lt;/u&amp;gt;geben: &amp;lt;code&amp;gt;System.out.println(&amp;quot;Hallo&amp;quot;);&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;i&amp;gt;das ist etwas anderes als &amp;lt;u&amp;gt;zurück&amp;lt;/u&amp;gt;geben (siehe weiter oben)&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Fachbegriffe für Algorithmen==&lt;br /&gt;
In der EF geht es um Algorithmen, die Schleifen und Bedingungen enthalten. Man sollte Algorithmen auch in mehrere Methoden zerlegen können, um sie beherrschbar zu machen. Dafür ist das folgende Fachvokabular sinnvoll:&lt;br /&gt;
* Die Methode ... hat als Parameter ... &lt;br /&gt;
* Abbruchbedingung: Wenn ...., wird die Methode verlassen und ... zurückgegeben.&lt;br /&gt;
* eine Variable ... mit Startwert ... festlegen.&lt;br /&gt;
* ... mit einer Schleife ... durchlaufen.&lt;br /&gt;
* für jedes Element...&lt;br /&gt;
* wenn ... (sonst...)&lt;br /&gt;
* Es wird die (Hilfs-)Methode ... mit dem Wert ... aufgerufen. &amp;lt;br/&amp;gt;Die Rückgabe der Methode wird ... .&lt;br /&gt;
* Die Variable ... erhöhen/verringern um ...&lt;br /&gt;
* Am Ende ... zurückgeben.&lt;br /&gt;
&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;
=lokale Variable=&lt;br /&gt;
* lokale Variablen müssen '''deklariert''' werden. &amp;lt;br/&amp;gt;Das heißt: Man legt fest, welchen '''Typ''' die Variable hat. &amp;lt;br/&amp;gt;Häufige Typen von Variablen sind:&lt;br /&gt;
** &amp;lt;code&amp;gt;int&amp;lt;/code&amp;gt;: Für eine ganze Zahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt;: Für eine Kommazahl.&lt;br /&gt;
** &amp;lt;code&amp;gt;String&amp;lt;/code&amp;gt;: Für einen Text&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:'''&lt;br /&gt;
 &amp;lt;code&amp;gt;&lt;br /&gt;
     public int summeZahlenBis100Ausgeben()&lt;br /&gt;
     {&lt;br /&gt;
        // Deklaration der lokalen Variable zahl; zahl wird auf 1 gesetzt.&lt;br /&gt;
        '''int zahl = 1''';&lt;br /&gt;
        // Deklaration der lokalen Variable ergebnis; ergebnis wird auf 0 gesetzt.&lt;br /&gt;
        '''int ergebnis = 0''';&lt;br /&gt;
        // Schleife, mit der bis 100 gezählt wird.&lt;br /&gt;
        while( zahl &amp;lt;= 100) {&lt;br /&gt;
           // Ergebnis wird um zahl erhöht.&lt;br /&gt;
           '''ergebnis += zahl''';&lt;br /&gt;
           // zahl wird um 1 erhöht.&lt;br /&gt;
           '''zahl++''';&lt;br /&gt;
        }&lt;br /&gt;
        // ergebnis zurückgeben&lt;br /&gt;
        return ergebnis;&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;
= Bedingungen (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;
&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;
= 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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Informatik_Fachbegriffe&amp;diff=3757</id>
		<title>Informatik Fachbegriffe</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Informatik_Fachbegriffe&amp;diff=3757"/>
		<updated>2025-07-06T10:01:35Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Algorithmen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik-Abitur]]&lt;br /&gt;
&lt;br /&gt;
Hier werden die wesentlichen Fachbegriffe zusammengestellt, die für das Informatik-Abitur relevant sind.&lt;br /&gt;
&lt;br /&gt;
''Kursiv sind &amp;quot;interne&amp;quot; Begriffe, die anschaulich sind, aber keine echten Fachbegriffe.''&lt;br /&gt;
=Operatoren=&lt;br /&gt;
Die Operatoren definieren, was genau man in einer Aufgabe zu machen hat. Anders als in Mathe sind die Operatoren weitestgehend &amp;quot;intuitiv&amp;quot; verständlich - mit Ausnahme des Operators &amp;quot;Analysieren&amp;quot; (siehe unten).&lt;br /&gt;
* '''Liste der Operatoren:'''&amp;lt;br/&amp;gt;analysieren, angeben, anwenden, begründen, beschreiben, bestimmen, beurteilen, darstellen, dokumentieren, entscheiden, entwerfen, entwickeln, erläutern, ermitteln, erweitern, implementieren, interpretieren, modellieren, modifizieren, Stellung nehmen, überführen, vergleichen, vervollständigen, zeigen&lt;br /&gt;
* '''Vollständige Liste der Operatoren mit Erläuterungen:'''&amp;lt;br/&amp;gt;[https://www.standardsicherung.schulministerium.nrw.de/cms/zentralabitur-wbk/faecher/getfile.php?file=2282 Operatoren Informatik-Abitur (Standardsicherung NRW)]&lt;br /&gt;
* '''Analysieren Sie ... '''.&amp;lt;br/&amp;gt;''Der Operator &amp;quot;Analysieren Sie...&amp;quot; heißt in Informatik nur so viel wie &amp;quot;Denken Sie nach über...&amp;quot;. &amp;lt;br/&amp;gt;Das heißt: &amp;lt;font color='red'&amp;gt;Dazu muss man NICHTS aufschreiben!!&amp;lt;/font&amp;gt;&amp;lt;br/&amp;gt;Der Operator &amp;quot;Analysieren Sie...&amp;quot; steht immer zusammen mit einem anderen Operator - und für den muss man was tun.&lt;br /&gt;
&lt;br /&gt;
=Algorithmen=&lt;br /&gt;
''Algorithmen entwickeln und implementieren'' kann in jedem Teilbereich vorkommen! &lt;br /&gt;
&lt;br /&gt;
'''[[Algorithmus_entwickeln_und_implementieren|zum Nachlesen hier klicken]]'''&lt;br /&gt;
&lt;br /&gt;
* Die Methode ... hat als Parameter ... &lt;br /&gt;
* Abbruchbedingung: Wenn ...., wird die Methode verlassen und ... zurückgegeben.&lt;br /&gt;
* eine Variable ... mit Startwert ... festlegen.&lt;br /&gt;
* ... mit einer Schleife ... durchlaufen.&lt;br /&gt;
* für jedes Element...&lt;br /&gt;
* wenn ... (sonst...)&lt;br /&gt;
* Es wird die (Hilfs-)Methode ... mit dem Wert ... aufgerufen. &amp;lt;br/&amp;gt;Die Rückgabe der Methode wird ... .&lt;br /&gt;
* Die Variable ... erhöhen/verringern um ...&lt;br /&gt;
* Am Ende ... zurückgeben.&lt;br /&gt;
&lt;br /&gt;
=Datenbanken=&lt;br /&gt;
==Entity-Relationship-Modellierung==&lt;br /&gt;
'''[[Entity-Relationship-Modell|zum Nachlesen hier klicken]]'''&lt;br /&gt;
* Kardinalität&lt;br /&gt;
* 1:n&lt;br /&gt;
* n:m&lt;br /&gt;
* Primärschlüssel&lt;br /&gt;
* Attribut&lt;br /&gt;
* Entitätsmenge&lt;br /&gt;
* Entität (=ein Objekt einer Entitätsmenge)&lt;br /&gt;
* Relation (=Beziehung)&lt;br /&gt;
&lt;br /&gt;
==relationales Datenmodell==&lt;br /&gt;
'''[[Relationales Datenmodell|zum Nachlesen hier klicken]]'''&lt;br /&gt;
* Tabelle&lt;br /&gt;
* Relationenschema (damit meint das Zentralabitur eine Tabelle)&lt;br /&gt;
* Datenbankschema (damit meint das Zentralabitur das ganze relationale Datenmodell)&lt;br /&gt;
* Attribut&lt;br /&gt;
* Primärschlüssel: &amp;lt;u&amp;gt;unterstrichen&amp;lt;/u&amp;gt;&lt;br /&gt;
* Fremdschlüssel: ↑&amp;lt;br/&amp;gt;''...bezieht sich auf den Primärschlüssel der Tabelle ...''&lt;br /&gt;
* kombinierter Primärschlüssel&lt;br /&gt;
&lt;br /&gt;
==Normalisierung==&lt;br /&gt;
'''[[Normalisierung|zum Nachlesen hier klicken]]'''&lt;br /&gt;
* atomar&lt;br /&gt;
* nicht eindeutiger Primärschlüssel&lt;br /&gt;
* funktional abhängig von einem Teil des Primärschlüssel (Verstoß gegen 2. NF)&lt;br /&gt;
* funktional abhängig von einem Nicht-Schlüssel-Attribut (Verstoß gegen 3. NF)&lt;br /&gt;
* Anomalien&lt;br /&gt;
** Einfüge-Anomalie&lt;br /&gt;
** Änderungs-Anomalie&lt;br /&gt;
** Lösch-Anomalie&lt;br /&gt;
** die können nach Normalisierung nicht mehr auftreten!&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
'''[[SQL|zum Nachlesen hier klicken]]'''&lt;br /&gt;
* Kartesisches Produkt: &amp;quot;jede(r) mit jedem&amp;quot;&lt;br /&gt;
* Abgleich zwischen Tabellen&lt;br /&gt;
* Verknüpfen (Join) von zwei Tabellen, wobei ... mit ... abgeglichen wird.&lt;br /&gt;
* ''&amp;quot;Drückeberger&amp;quot;'': &amp;lt;code&amp;gt;... LEFT JOIN ... WHERE ... IS NULL&amp;lt;/code&amp;gt;&lt;br /&gt;
* Differenz: &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt;&lt;br /&gt;
* Vereinigung: &amp;lt;code&amp;gt;UNION&amp;lt;/code&amp;gt;&lt;br /&gt;
* selbstdefinierte Tabelle&lt;br /&gt;
* Alias: &amp;lt;code&amp;gt;AS&amp;lt;/code&amp;gt;&lt;br /&gt;
* zusammenfassen von Zeilen: &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;&lt;br /&gt;
* sortieren nach: &amp;lt;code&amp;gt;ORDER BY&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==mit Java auf Datenbanken zugreifen==&lt;br /&gt;
'''[[Java-SQL|zum Nachlesen hier klicken]]'''&lt;br /&gt;
* DatabaseConnector&lt;br /&gt;
* Query (=Abfrage)&lt;br /&gt;
* Variablen (z.B. Parameter) im SQL-Statement&lt;br /&gt;
* Zeilenzahl: &amp;lt;code&amp;gt;int zeilenZahl = queryResult.getRowCount();&amp;lt;/code&amp;gt;&lt;br /&gt;
* Array (2-dim): &amp;lt;code&amp;gt;String[][] data = queryResult.getData();&amp;lt;/code&amp;gt;&lt;br /&gt;
** durchlaufen:&amp;lt;br/&amp;gt;&amp;lt;code&amp;gt;for(int i=0; i&amp;lt;data.length; i++){&amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;String name = data[i][0];&amp;lt;br/&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;String vorname = data[i][1];&amp;lt;/code&amp;gt;&lt;br /&gt;
* In Zahl konvertieren: &amp;lt;code&amp;gt;int zahl = Integer.parseInt(data[i][0]);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Objektorientierte Modellierung und Programmierung=&lt;br /&gt;
'''zum Nachlesen:'''&lt;br /&gt;
* [[Klassen-_und_Implementationsdiagramm|Klassen- und Implementationsdiagramm]]&lt;br /&gt;
* [[Klasse|Klasse]]&lt;br /&gt;
* [[Vererbung|Vererbung]]&lt;br /&gt;
* [[Polymorphie|Polymorphie]]&lt;br /&gt;
* [[Abstrakte Klasse|Abstrakte Klasse]]&lt;br /&gt;
* [[Interface|Interface]]&lt;br /&gt;
* [[Java_Basis-Sprachelemente|Java Basis Sprachelemente]], u.a. Bedingung, Schleife etc.&lt;br /&gt;
* [[Array|Arrays]]&lt;br /&gt;
&lt;br /&gt;
'''Fachbegriffe:'''&lt;br /&gt;
* [[Vererbung|Vererbung]]&lt;br /&gt;
** erbt von &lt;br /&gt;
** ist ein (gleichbedeutend mit &amp;quot;erbt von&amp;quot;!)&lt;br /&gt;
** Super-Klasse&lt;br /&gt;
** Sub-Klasse&lt;br /&gt;
* [[Polymorphie|Polymorphie]]&lt;br /&gt;
** polymorphe Methode&lt;br /&gt;
* [[Abstrakte Klasse|Abstrakte Klasse]] (=Klasse mit mind. einer abstrakten Methode)&lt;br /&gt;
* abstrakte Methode&lt;br /&gt;
* [[Interface|Interface]]&lt;br /&gt;
* [[Implementationsdiagramm|Klassen- und Implementationsdiagramm]]&lt;br /&gt;
* hat-Beziehung&lt;br /&gt;
* Assoziation (=kennt-Beziehung)&lt;br /&gt;
* Multiplizität&lt;br /&gt;
* [[Klasse|Klasse]]&lt;br /&gt;
** Objekt (Von einer Klasse kann man mehrere Objekte erzeugen.)&lt;br /&gt;
** Attribut&lt;br /&gt;
*** public / private&lt;br /&gt;
** Konstruktor&lt;br /&gt;
* [[Java_Basis-Sprachelemente#Methoden|Methode]]&lt;br /&gt;
** Parameter&lt;br /&gt;
** lokale Variable&lt;br /&gt;
** Rückgabetyp&lt;br /&gt;
** public / private&lt;br /&gt;
* ContentType (z.B. für Listen kann man den ContentType angeben.)&lt;br /&gt;
* [[Interface|Schnittstelle (interface, vgl. ComparableContent)]]&lt;br /&gt;
* [[Struktogramm]]&lt;br /&gt;
* Anweisung&lt;br /&gt;
* Methodenaufruf&lt;br /&gt;
* [[Java_Basis-Sprachelemente#Verzweigungen_(if-else)|Bedingung]]&lt;br /&gt;
* [[Java_Basis-Sprachelemente#Schleifen_(while,_for,_do-while)|Schleife]]&lt;br /&gt;
** Zählschleife (for)&lt;br /&gt;
** bedingte Schleife (while)&lt;br /&gt;
** mit Schleife ein Array durchlaufen: &amp;lt;code&amp;gt;for(int i=0; i&amp;lt;array.length; i++)&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Array|Arrays]]&lt;br /&gt;
** Index&lt;br /&gt;
** Wert&lt;br /&gt;
** [[Array#Zweidimensionale_Arrays|zweidimensionales Array]], z.B.: &amp;lt;code&amp;gt; private int[][] einmalEinsTabelle;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Java-Programmierung mit linearen Datenstrukturen=&lt;br /&gt;
'''zum Nachlesen:'''&lt;br /&gt;
* [[Queue#Verwendung_von_Queues|Verwendung von Queues]]&lt;br /&gt;
* [[Stack#Verwendung_von_Stacks|Verwendung von Stacks]]&lt;br /&gt;
* [[List#Standardvorgehen_im_Umgang_mit_Listen|List: Standardvorgehen]]&lt;br /&gt;
* [[Array#Ein_Array_mit_einer_for-Schleife_durchlaufen|Array: durchlaufen]]&lt;br /&gt;
&lt;br /&gt;
'''Fachbegriffe:'''&lt;br /&gt;
* [[Laufzeit_von_Algorithmen|Laufzeit]]&lt;br /&gt;
** O(log(n)): Suchen in einem [[Binärer Suchbaum|Binären Suchbaum]]&lt;br /&gt;
** O(n): Suchen in einer unsortierten Liste&lt;br /&gt;
** O(n*log(n)): Sortieren mit [[Quicksort|Quicksort]]&lt;br /&gt;
** O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;): Sortieren mit [[Bubblesort]], [[Insertionsort]], [[Selectionsort|Selectionsort]]&lt;br /&gt;
* &amp;lt;u&amp;gt;statische&amp;lt;/u&amp;gt; Datenstruktur (Array): &amp;lt;br/&amp;gt;''Man muss vorher angeben, wie viele Einträge das Array hat.''&lt;br /&gt;
* &amp;lt;u&amp;gt;dynamische&amp;lt;/u&amp;gt; Datenstrukturen: Stack, List, Queue (und auch BinaryTree, BinarySearchTree, Graph)&amp;lt;br/&amp;gt;''Dynamische Datenstrukturen können während der Laufzeit &amp;quot;wachsen&amp;quot; und &amp;quot;schrumpfen&amp;quot;.''&lt;br /&gt;
* [[Java_Basis-Sprachelemente#NullPointerException|NullPointerException]]&lt;br /&gt;
* [[Queue|Queue]]: Schlange (vorne - hinten)&lt;br /&gt;
** vorderstes Element: &amp;lt;code&amp;gt;pQueue.front()&amp;lt;/code&amp;gt;&lt;br /&gt;
** anhängen: &amp;lt;code&amp;gt;pQueue.enqueue(...)&amp;lt;/code&amp;gt; &lt;br /&gt;
** vorderstes Element entfernen: &amp;lt;code&amp;gt;pQueue.dequeue()&amp;lt;/code&amp;gt;&lt;br /&gt;
** ist leer: &amp;lt;code&amp;gt;pQueue.isEmpty()&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hilfs-Queue: z.B. um einen Queue zu durchlaufen, ohne ihn zu zustören&lt;br /&gt;
* [[Stack|Stack]]: Stapel (oben)&lt;br /&gt;
** oberstes Element: &amp;lt;code&amp;gt;pStack.top()&amp;lt;/code&amp;gt;&lt;br /&gt;
** oben drauflegen: &amp;lt;code&amp;gt;pStack.push(...)&amp;lt;/code&amp;gt; &lt;br /&gt;
** oberstes Element entfernen: &amp;lt;code&amp;gt;pStack.pop()&amp;lt;/code&amp;gt;&lt;br /&gt;
** ist leer: &amp;lt;code&amp;gt;pStack.isEmpty()&amp;lt;/code&amp;gt;&lt;br /&gt;
** Hilfs-Stack: z.B. um einen Stack zu durchlaufen, ohne ihn zu zustören&lt;br /&gt;
* [[List|List]]: Liste.&amp;lt;br/&amp;gt;''Listen kann man einfach durchlaufen und irgendwo einfügen.''&lt;br /&gt;
** anhängen: &amp;lt;code&amp;gt;pList.append(...)&amp;lt;/code&amp;gt;&lt;br /&gt;
** einfügen vor dem aktuellen Element: &amp;lt;code&amp;gt;pList.insert(...);&amp;lt;/code&amp;gt;&lt;br /&gt;
* [[Array|Array]]: &amp;lt;br/&amp;gt;''statische Datenstruktur - man muss die Anzahl der Elemente vorher festlegen.''&lt;br /&gt;
* durchlaufen (Liste, Array)&lt;br /&gt;
** ein Array durchlaufen: &amp;lt;code&amp;gt;for(int i=0; i&amp;lt;array.length; i++)&amp;lt;/code&amp;gt;&lt;br /&gt;
** eine Liste durchlaufen: &amp;lt;code&amp;gt;for(pList.toFirst(); pList.hasAccess(); pList.next())&amp;lt;/code&amp;gt;&lt;br /&gt;
* aktuelles Element:&lt;br /&gt;
** Array: &amp;lt;code&amp;gt;array[i];&amp;lt;/code&amp;gt;&lt;br /&gt;
** Liste: &amp;lt;code&amp;gt;pList.getContent();&amp;lt;/code&amp;gt;&lt;br /&gt;
* erzeugen&lt;br /&gt;
** erzeugen eines Objektes: &amp;lt;code&amp;gt;Person p = '''new''' Person(&amp;quot;Mustermann&amp;quot;, &amp;quot;Max&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
** erzeugen einer Liste: &amp;lt;code&amp;gt;List&amp;lt;Person&amp;gt; ergebnisListe = '''new''' List&amp;lt;&amp;gt;();&amp;lt;/code&amp;gt;&lt;br /&gt;
** erzeugen eines Arrays: &amp;lt;br/&amp;gt;z.B. &amp;lt;code&amp;gt;Person[] einwohner = '''new''' int[1000];&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;''Vorsicht! In jedem der 1000 Werte steht &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt;!''&lt;br /&gt;
** erzeugen eines zweidimensionalen Arrays: &amp;lt;code&amp;gt;int[][] einmalEinsTabelle = new int[10][10];&amp;lt;/code&amp;gt;&lt;br /&gt;
* Schleife&lt;br /&gt;
** Schleife verlassen: &amp;lt;code&amp;gt;break;&amp;lt;/code&amp;gt;&lt;br /&gt;
** Schleife beim nächsten Element fortsetzen: &amp;lt;code&amp;gt;continue;&amp;lt;/code&amp;gt;&lt;br /&gt;
* Methode verlassen &amp;lt;code&amp;gt;return;&amp;lt;/code&amp;gt;&lt;br /&gt;
* zurückgeben: &amp;lt;code&amp;gt;return ergebnis;&amp;lt;/code&amp;gt;&lt;br /&gt;
* ausgeben: &amp;lt;code&amp;gt;System.out.println(&amp;quot;Hallo&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Sortierverfahren=&lt;br /&gt;
* [[Bubblesort]] &amp;lt;u&amp;gt;nur für Arrays!&amp;lt;/u&amp;gt;, Laufzeit O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* [[Insertionsort]] für Listen, Laufzeit O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* [[Selectionsort]] für Listen, Laufzeit O(n&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&lt;br /&gt;
* nur LK: [[Quicksort]] für Listen, Laufzeit O(n*log(n)) im Average Case&lt;br /&gt;
* Sortieren mit einem [[Binärer Suchbaum|Binären Suchbaum ]]&amp;lt;br/&amp;gt;- Der Reihe nach in den Binären Suchbaum einfügen&amp;lt;br/&amp;gt;- Inorder-Traversierung&amp;lt;br/&amp;gt;Laufzeit O(n*log(n)) im Average Case&lt;br /&gt;
&lt;br /&gt;
=Binärbäume und binäre Suchbäume=&lt;br /&gt;
* Rahmenmethode&lt;br /&gt;
* rekursive Methode&lt;br /&gt;
* Abbruchbedingung&lt;br /&gt;
* ''Wurzelbehandlung''&lt;br /&gt;
* ''Sachlogik''&lt;br /&gt;
* rekursive Aufrufe&lt;br /&gt;
* Traversierung&lt;br /&gt;
* Preorder&lt;br /&gt;
* Inorder (=im Suchbaum: Sortierte Ausgabe!)&lt;br /&gt;
* Levelorder (nur LK)&lt;br /&gt;
* Baumliste für Levelorder (nur LK)&lt;br /&gt;
* ComparableContent&lt;br /&gt;
* implementiert die Schnittstelle (ComparableContent)&lt;br /&gt;
* ''Dummy'': zum Suchen in Suchbäumen.&lt;br /&gt;
&lt;br /&gt;
=Automaten und Grammatiken=&lt;br /&gt;
'''zum Nachlesen:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
[https://sibiwiki.de/wiki/index.php?title=Kategorie:Endliche_Automaten Kategorie endliche Automaten]&lt;br /&gt;
&amp;lt;br/&amp;gt;''Da gibt es Links zu allen Unterüberschriften.''&lt;br /&gt;
==endliche Automaten==&lt;br /&gt;
* [[Deterministischer Endlicher Automat|Deterministischer endlicher Automat (DEA)]]&lt;br /&gt;
** A, Z, d, Q&amp;lt;sub&amp;gt;0&amp;lt;/sub&amp;gt;, E: ''allen Zuhörern doofen Quatsch erzählen''&lt;br /&gt;
* Der DEA '''erkennt''' eine reguläre Sprache&lt;br /&gt;
* Der DEA '''überprüft''' ein Wort, ob es zur Sprache gehört.&lt;br /&gt;
* [[Nicht-deterministischer endlicher Automaten|Nicht-deterministischer endlicher Automat (NEA)]]&lt;br /&gt;
** ''&amp;quot;es gibt einen Weg&amp;quot;''&lt;br /&gt;
* Zustand&lt;br /&gt;
**Anfangszustand&lt;br /&gt;
**Endzustände&lt;br /&gt;
* Übergang&lt;br /&gt;
* Alphabet&lt;br /&gt;
* Zustands-Übergangs-Graph&lt;br /&gt;
* Zustands-Übergangs-Tabelle&lt;br /&gt;
* Zustandsfolge&lt;br /&gt;
** für einen NEA ggf. mit geschweifter Klammer mehrere Zustände zusammenfassen.&lt;br /&gt;
* Senke (=ein Zustand, aus dem es keinen Ausweg mehr gibt)&lt;br /&gt;
* [[Potenzmengenkonstruktion|Potenzmengenkonstruktion]]&lt;br /&gt;
** Potenzmenge (=eine Menge von Zuständen)&lt;br /&gt;
&lt;br /&gt;
==[[Reguläre Grammatik|reguläre Grammatik]]==&lt;br /&gt;
* G = {N, T, S, P} ''Nerds testen Sonys Playstation''&lt;br /&gt;
* linkslineare Grammatik: Nicht-Terminal links&lt;br /&gt;
* rechtslineare Grammatik: Nicht-Terminal rechts&lt;br /&gt;
** &amp;lt;i&amp;gt;linkslineare und rechtslineare Regeln nicht mischen!!!&amp;lt;br/&amp;gt;z.B.: &amp;lt;code&amp;gt;S → aS | Sb&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;ist nicht regulär!!!&amp;lt;/i&amp;gt;&lt;br /&gt;
* Terminal-Symbol&lt;br /&gt;
* Nicht-Terminal-Symbol&lt;br /&gt;
**Startsymbol&lt;br /&gt;
* Produktionsregeln&lt;br /&gt;
* Produktion eines Wortes&lt;br /&gt;
* die RG erzeugt eine (reguläre) Sprache&lt;br /&gt;
&lt;br /&gt;
==[[Kellerautomat|Kellerautomaten (nur LK)]]==&lt;br /&gt;
* Keller-Alphabet&lt;br /&gt;
* Keller-Zeichen&lt;br /&gt;
* Epsilon (ε): Um den Endzustand zu erreichen, darf man das Zeichen ε (=&amp;quot;nichts&amp;quot;) schreiben.&lt;br /&gt;
&lt;br /&gt;
==[[Kontextfreie_Grammatik|kontextfreie Grammatik (nur LK)]]==&lt;br /&gt;
* lässt sich durch Kellerautomaten prüfen&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* [[Parser|Parser für DEA]]&lt;br /&gt;
* [[Kellerautomat#Parser_für_einen_Kellerautomaten|Parser für Kellerautomaten (nur LK)]]&lt;br /&gt;
** Keller (=&amp;lt;code&amp;gt;Stack&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=[[Graph|Graph (nur LK!)]]=&lt;br /&gt;
* Knoten&lt;br /&gt;
* Kante&lt;br /&gt;
* markieren (Knoten oder Kante)&lt;br /&gt;
* Markierung aufheben&lt;br /&gt;
* Gewicht&lt;br /&gt;
* Traversierung (d.h. Breitendurchlauf oder Tiefendurchlauf)&lt;br /&gt;
* [[Graph#Tiefendurchlauf|Tiefendurchlauf]]&lt;br /&gt;
** rekursiv&lt;br /&gt;
* [[Graph#Breitendurchlauf|Breitendurchlauf]]&lt;br /&gt;
** Knotenliste&lt;br /&gt;
* [[Dijkstra-Algorithmus|Dijkstra-Algorithmus]]&lt;br /&gt;
* rote Liste (für Dijkstra-Algo)&lt;br /&gt;
* gelbe Liste (für Dijkstra-Algo)&lt;br /&gt;
&lt;br /&gt;
=[[Datenschutz|Datenschutz]]=&lt;br /&gt;
Schutz von Angaben, aus denen man einen bestimmten Menschen erkennen kann oder die einem bestimmten Menschen zugeordnet werden können. &lt;br /&gt;
&lt;br /&gt;
'''Prinzipien des Datenschutzes:'''&lt;br /&gt;
* &amp;lt;u&amp;gt;Verbot mit Erlaubnisvorbehalt&amp;lt;/u&amp;gt;&lt;br /&gt;
* Datenminimierung&lt;br /&gt;
* Zweckbindung&lt;br /&gt;
* Transparenz&lt;br /&gt;
* &amp;lt;u&amp;gt;Erforderlichkeit&amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=[[Backtracking|Backtracking (nur LK!)]]=&lt;br /&gt;
* Stufe&lt;br /&gt;
* Teillösungsschritt&lt;br /&gt;
* Abbruchbedingung&lt;br /&gt;
** Lösung erreicht&lt;br /&gt;
** Lösung nicht mehr erreichbar&lt;br /&gt;
** maximale Stufenzahl überschritten&lt;br /&gt;
* rückgängig machen&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3749</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3749"/>
		<updated>2025-04-24T17:50:03Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3748</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3748"/>
		<updated>2025-04-24T17:49:52Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3747</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3747"/>
		<updated>2025-04-24T17:49:11Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer '''echten Entwicklungsumgebung''' (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen sonst noch alles können!&lt;br /&gt;
* Man hat '''alles in einem Projekt''' und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3746</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3746"/>
		<updated>2025-04-24T17:48:56Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer '''echten Entwicklungsumgebung''' (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen sonst noch alles können!&lt;br /&gt;
* Man hat '''alles in einem Projekt''' und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3745</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3745"/>
		<updated>2025-04-24T17:48:00Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Stand des Projektes: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer '''echten Entwicklungsumgebung''' (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen sonst noch alles können!&lt;br /&gt;
* Man hat '''alles in einem Projekt''' und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3744</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3744"/>
		<updated>2025-04-24T17:47:17Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Vorteile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer '''echten Entwicklungsumgebung''' (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen sonst noch alles können!&lt;br /&gt;
* Man hat '''alles in einem Projekt''' und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3743</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3743"/>
		<updated>2025-04-24T17:46:20Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Grundlegendes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
''Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.''&amp;lt;br/&amp;gt;&lt;br /&gt;
''Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen &lt;br /&gt;
* Man hat alles in einem Projekt und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3742</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3742"/>
		<updated>2025-04-24T17:44:54Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: LIzenz&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
Das Projekt ist unter der '''Open-Source Lizenz GPL v3.0''' veröffentlicht.&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3741</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3741"/>
		<updated>2025-04-24T17:43:04Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Stand des Projektes: */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 24.04.2025&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3740</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3740"/>
		<updated>2025-04-24T17:42:48Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3739</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3739"/>
		<updated>2025-04-24T17:41:10Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries hinzufügen:'''&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
** Den Ordner &amp;quot;libraries&amp;quot; suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3738</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3738"/>
		<updated>2025-04-24T17:37:47Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
*** Evtl. enthält dieser einen inneren Ordner &amp;quot;javaQ1Q2&amp;quot;!&amp;lt;br/&amp;gt;Dann diesen nehmen.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3737</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3737"/>
		<updated>2025-04-24T17:36:17Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;java-Q1Q2-202021&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;java-Q1Q2-202021-2020-07-28&amp;quot;.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3736</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3736"/>
		<updated>2025-04-24T17:35:37Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.&amp;lt;br/&amp;gt;&lt;br /&gt;
Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!&amp;lt;br/&amp;gt;&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen &lt;br /&gt;
* Man hat alles in einem Projekt und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3735</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3735"/>
		<updated>2025-04-24T17:35:22Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in Eclipse */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.&amp;lt;br/&amp;gt;&lt;br /&gt;
Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!&amp;lt;br/&amp;gt;&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen &lt;br /&gt;
* Man hat alles in einem Projekt und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 24.04.2025&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 27.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3734</id>
		<title>Datei:Schule.sqlite.zip</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3734"/>
		<updated>2025-04-16T17:13:37Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
#Entzippen&lt;br /&gt;
#(''wenn man ihn noch nicht hat:'')&amp;lt;br/&amp;gt;[https://sqlitebrowser.org/ DB Browser für SQLite] runterladen &lt;br /&gt;
#DB Browser für SQLite starten&lt;br /&gt;
#Datei -&amp;gt; Datenbank öffnen -&amp;gt; schule.sqlite auswählen&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3733</id>
		<title>Datei:Schule.sqlite.zip</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3733"/>
		<updated>2025-04-16T17:06:21Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Beschreibung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
#Entzippen&lt;br /&gt;
#DB Browser für SQLite starten&lt;br /&gt;
#Datei -&amp;gt; Datenbank öffnen -&amp;gt; schule.sqlite auswählen&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3732</id>
		<title>SQL</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=SQL&amp;diff=3732"/>
		<updated>2025-04-16T17:05:24Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Beispieldatenbank Schule */&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, hat folgende Möglichkeiten:''&lt;br /&gt;
** ''Die Beispieldatenbank Schule als SQL-Lite Datenbank herunterladen:&amp;lt;br&amp;gt;[[Datei:Schule.sqlite.zip]]&amp;lt;br&amp;gt;Zum Öffnen braucht man [https://sqlitebrowser.org/ DB Browser für SQLite]''&lt;br /&gt;
** ''Einen SQL-Dump der Beispieldatenbank Schule herunterladen: &amp;lt;br&amp;gt;[[Datei:Beispieldatenbank-schule.zip]] und z.B. mit phpmyadmin in eine eigene Datenbank importieren.''&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 wollen wir 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;
* ''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>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3731</id>
		<title>Datei:Schule.sqlite.zip</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Datei:Schule.sqlite.zip&amp;diff=3731"/>
		<updated>2025-04-16T17:00:51Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: - Entzippen
- DB Browser für SQLite starten
- Datei -&amp;gt; Datenbank öffnen -&amp;gt; schule.sqlite auswählen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Beschreibung ==&lt;br /&gt;
- Entzippen&lt;br /&gt;
- DB Browser für SQLite starten&lt;br /&gt;
- Datei -&amp;gt; Datenbank öffnen -&amp;gt; schule.sqlite auswählen&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3730</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3730"/>
		<updated>2025-04-14T20:21:27Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Von GitHub beziehen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.&amp;lt;br/&amp;gt;&lt;br /&gt;
Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!&amp;lt;br/&amp;gt;&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen &lt;br /&gt;
* Man hat alles in einem Projekt und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/javaEF]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaEF&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
==IntelliJ==&lt;br /&gt;
# File -&amp;gt; New -&amp;gt; Project from Version Control&lt;br /&gt;
# https://github.com/akaibel/javaEF&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 27.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 27.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Excel&amp;diff=3729</id>
		<title>Excel</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Excel&amp;diff=3729"/>
		<updated>2025-03-06T20:25:44Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: Die Seite wurde neu angelegt: „Kategorie:Informatik 9 Kategorie:Informatik  ''Es ist unmöglich, auf einer Seite umfassend über Excel zu informieren...''  ''Ziel dieser Seite ist es, in aller Kürze die wesentlichen Informationen zu Excel im Diff-Bereich zusammenzufassen, so dass man das nochmal nachschlagen kann.''  =Wichtige Formeln in Excel= * &amp;lt;code&amp;gt;=SUMME( Bereich )&amp;lt;/code&amp;gt; * &amp;lt;code&amp;gt;=MITTELWERT( Bereich )&amp;lt;/code&amp;gt; * &amp;lt;code&amp;gt;=WENN( Bedingung ; Dann ; Sonst )&amp;lt;/code&amp;gt; * &amp;lt;code&amp;gt;=ZÄHL…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik 9]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
&lt;br /&gt;
''Es ist unmöglich, auf einer Seite umfassend über Excel zu informieren...''&lt;br /&gt;
&lt;br /&gt;
''Ziel dieser Seite ist es, in aller Kürze die wesentlichen Informationen zu Excel im Diff-Bereich zusammenzufassen, so dass man das nochmal nachschlagen kann.''&lt;br /&gt;
&lt;br /&gt;
=Wichtige Formeln in Excel=&lt;br /&gt;
* &amp;lt;code&amp;gt;=SUMME( Bereich )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;=MITTELWERT( Bereich )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;=WENN( Bedingung ; Dann ; Sonst )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;=ZÄHLENWENN( Bereich ; Was soll gezählt werden? )&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;=XVERWEIS( Such-Kriterium ; Such-Bereich ; Ausgabe-Bereich )&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
In der Klammer stehen die '''Parameter''' (=Informationen) für die Formel.&amp;lt;br/&amp;gt;&lt;br /&gt;
Mehrere Parameter trennt man durch '''Strichpunkt''':    ''';'''&lt;br /&gt;
&lt;br /&gt;
==Bereiche angeben==&lt;br /&gt;
Mit '''Doppelpunkt'''!&lt;br /&gt;
&lt;br /&gt;
'''Beispiele für Bereiche:'''&lt;br /&gt;
* &amp;lt;code&amp;gt;A5:A9&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;alle Zellen von  A5 bis  A9&lt;br /&gt;
* &amp;lt;code&amp;gt;B:B&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;die ganze Spalte B&lt;br /&gt;
* &amp;lt;code&amp;gt;A2:D100&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;das Rechteck mit A2 oben links und D100 unten rechts&lt;br /&gt;
* &amp;lt;code&amp;gt;B:F&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;die Spalten B bis F&lt;br /&gt;
 &lt;br /&gt;
==Beispiele für Formeln==&lt;br /&gt;
* &amp;lt;code&amp;gt;=MITTELWERT(A2:A50)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;Der Mittelwert aller Zahlen im Bereich von A2 bis A50&lt;br /&gt;
* &amp;lt;code&amp;gt;=SUMME(B3:D9)&amp;lt;br/&amp;gt;&amp;lt;/code&amp;gt;Die Summe aller Zahlen aus dem Bereich B3 bis D9 : das ist ein Rechteck!&lt;br /&gt;
* &amp;lt;code&amp;gt;=ZÄHLENWENN(A:A;K2)&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;Wie oft kommt in Spalte A die Zahl aus K2 vor&lt;br /&gt;
&lt;br /&gt;
==Absolute Adressierung==&lt;br /&gt;
Manchmal will man verhindern, dass die Zellen beim “Runterziehen” weitergezählt werden. Dafür gibt es die sogenannte “absolute Adressierung” mit dem $-Zeichen.&lt;br /&gt;
&lt;br /&gt;
'''Beispiele:''' 	&lt;br /&gt;
* &amp;lt;code&amp;gt;A$5&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;nimmt immer die 5. Zeile, auch wenn man runterzieht.&lt;br /&gt;
* &amp;lt;code&amp;gt;$A$5&amp;lt;/code&amp;gt;&amp;lt;br/&amp;gt;nimmt immer die Zelle A5, auch wenn man nach rechts und nach unten zieht.&lt;br /&gt;
&lt;br /&gt;
=Zellen formatieren=&lt;br /&gt;
Wenn man Zahlen z.B. als Prozentwert darstellen will.&lt;br /&gt;
* Bereich markieren:&lt;br /&gt;
** entweder UMSCHALT + Pfeiltasten, um einen Bereich zu markieren&lt;br /&gt;
** oder oben die Spalten anklicken, die markiert werden sollen.&lt;br /&gt;
* rechte Maustaste&amp;lt;br/&amp;gt;Kontextmenü aufrufen&lt;br /&gt;
** Zellen formatieren → Zahl → Prozent&lt;br /&gt;
** … und dann alles richtig einstellen!&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3728</id>
		<title>Projekt javaEF</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_javaEF&amp;diff=3728"/>
		<updated>2024-12-28T18:24:24Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: Die Seite wurde neu angelegt: „Kategorie:Informatik Kategorie:Informatik-EF  =Grundlegendes= Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.&amp;lt;br/&amp;gt; Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!&amp;lt;br/&amp;gt; ==Vorteile== * Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt: ** viel bessere Tooltips…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-EF]]&lt;br /&gt;
&lt;br /&gt;
=Grundlegendes=&lt;br /&gt;
Das Projekt javaEF ist relativ neu und deswegen vielleicht noch nicht absolut fehlerfrei.&amp;lt;br/&amp;gt;&lt;br /&gt;
Aber in der Praxis im Schuljahr 2024/25 hat es sich schon als großer Fortschritt erwiesen!!&amp;lt;br/&amp;gt;&lt;br /&gt;
==Vorteile==&lt;br /&gt;
* Man kann mit einer echten Entwicklungsumgebung (VS Code, Eclipse, IntelliJ) programmieren und ist nicht auf BlueJ und Greenfoot angewiesen.&amp;lt;br/&amp;gt;Das heißt:&lt;br /&gt;
** viel bessere Tooltips&lt;br /&gt;
** besseres Debugging&lt;br /&gt;
** besseres Code-Highlighting&lt;br /&gt;
** ... und was echte Entwicklungsumgebungen &lt;br /&gt;
* Man hat alles in einem Projekt und muss nicht dauernd irgendwelche neuen Dateien runterladen etc.&lt;br /&gt;
''(Wer unbedingt BlueJ nutzen will, kann das auch machen. Aber empfehlen tun wir's nicht gerade.)''&lt;br /&gt;
&lt;br /&gt;
=Was man mit JavaEF machen kann=&lt;br /&gt;
* prozedurale Programmierung&lt;br /&gt;
** mit Kara (auf Deutsch)&lt;br /&gt;
** mit Kara (auf Englisch)&lt;br /&gt;
** mit dem Rover (auf Deutsch)&lt;br /&gt;
* objektorientierte Programmierung...&lt;br /&gt;
** mit dem Projekt Formen (wie aus &amp;quot;Objects First&amp;quot;)&lt;br /&gt;
* Programmierung von Arrays&lt;br /&gt;
&lt;br /&gt;
Das Ziel ist es, dass man mit dem Projekt für die EF softwaremäßig ausgesorgt hat!&amp;lt;br/&amp;gt;''(Dieses Ziel ist noch nicht erreicht, aber wir nähern uns dem an...)''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 27.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
Eclipse ist die Entwicklungsumgebung im Unterricht am SIBI.&amp;lt;br/&amp;gt;&lt;br /&gt;
Wer Eclipse installieren will, erfährt hier, wie es geht: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgebung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaEF auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/sibikara https://github.com/akaibel/sibikara]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/sibikara&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 27.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaEF&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaEF.zip https://sibiwiki.de/wiki-files/javaEF.zip]''' runterladen&lt;br /&gt;
* Stand: 27.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;javaEF&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;javaEF&amp;quot;.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3727</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3727"/>
		<updated>2024-12-28T17:46:28Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Von GitHub beziehen=&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Eclipse:==&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe oben).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;java-Q1Q2-202021&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;java-Q1Q2-202021-2020-07-28&amp;quot;.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3726</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3726"/>
		<updated>2024-12-28T17:42:54Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Download und Öffnen in BlueJ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe unten).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
==Von GitHub beziehen==&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
===Eclipse:===&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
===Visual Studio Code===&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
** Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;java-Q1Q2-202021&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;java-Q1Q2-202021-2020-07-28&amp;quot;.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3725</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3725"/>
		<updated>2024-12-28T17:41:40Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Von GitHub beziehen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe unten).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
==Von GitHub beziehen==&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
===Eclipse:===&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
===Visual Studio Code===&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[[Datei:Java Q1Q2.zip]]'''&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;java-Q1Q2-202021&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;java-Q1Q2-202021-2020-07-28&amp;quot;.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
	<entry>
		<id>https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3724</id>
		<title>Projekt java Q1Q2</title>
		<link rel="alternate" type="text/html" href="https://sibiwiki.de/wiki/index.php?title=Projekt_java_Q1Q2&amp;diff=3724"/>
		<updated>2024-12-28T17:38:07Z</updated>

		<summary type="html">&lt;p&gt;Akaibel: /* Von GitHub beziehen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Informatik-Q1]]&lt;br /&gt;
[[Kategorie:Informatik-Q2]]&lt;br /&gt;
&lt;br /&gt;
Das Projekt java_Q1Q2 umfasst ALLE Szenarien, mit denen am SIBI in der Q1 und Q2 Java entwickelt wird.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;D.h. wer sich das einmal runterlädt, der hat softwaremäßig für die Q1 und Q2 ausgesorgt!!!&amp;lt;/u&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=Stand des Projektes:=&lt;br /&gt;
&lt;br /&gt;
* Das Projekt bildet die Schnittstellen des Abi 2018 (und folgende) ab. &lt;br /&gt;
&lt;br /&gt;
* Letztes Update: 28.12.2024&lt;br /&gt;
&lt;br /&gt;
''Der aktuellste Stand des Projektes findet sich immer auf GitHub. (siehe weiter unten).''&lt;br /&gt;
&lt;br /&gt;
=Voraussetzungen=&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt mit jeder Entwicklungsumgebung bearbeiten. Unsere Empfehlung für die Installation zuhause ist Visual Studio Code, weil es einfach zu installieren und einfach zu bedienen ist - und problemlos auch für andere Programmiersprachen genutzt werden kann (mit sogenannten Extensions).&lt;br /&gt;
&lt;br /&gt;
==Visual Studio Code==&lt;br /&gt;
''Man kann sich von ChatGPT durch die Installation von Visual Studio Code führen lassen.&amp;lt;br/&amp;gt;Wichtige Stichworte: Visual Studio Code Java installieren und GIT installieren.&amp;lt;br/&amp;gt;Ansonsten ist hier eine Anleitung:''&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Installation''':&lt;br /&gt;
* [https://www.youtube.com/watch?v=RkU3ape9e24 Erklärvideo zur Installation von VS Code und Java (2:30min)]&lt;br /&gt;
* [https://devblogs.microsoft.com/java/announcing-visual-studio-code-java-installer/ Link zum Artikel (aus dem Video)]&lt;br /&gt;
* [https://aka.ms/vscode-java-installer-win direkter Link zum Installer]&lt;br /&gt;
* Wenn die Installation von VS-Code fehlschlägt:&lt;br /&gt;
** [https://code.visualstudio.com/Download Download von VS-Code]&lt;br /&gt;
** Dann muss man links das Symbol für &amp;quot;Extensions&amp;quot; anklicken,&amp;lt;br/&amp;gt;&amp;quot;Extension Pack für Java&amp;quot; auswählen&amp;lt;br/&amp;gt;und das installieren.&lt;br /&gt;
&lt;br /&gt;
== Eclipse==&lt;br /&gt;
&lt;br /&gt;
Um das Projekt öffnen zu können, muss man '''[[Eclipse]]''' installiert haben. Wie man das tut, erfährt man hier: '''[[Eclipse|Eclipse]]'''.&lt;br /&gt;
&lt;br /&gt;
==BlueJ==&lt;br /&gt;
&lt;br /&gt;
Man kann das Projekt auch mit '''BlueJ''' öffnen. &amp;lt;br/&amp;gt;&lt;br /&gt;
Richtig zu empfehlen ist das nicht, denn BlueJ ist eine &amp;quot;Spielzeug&amp;quot;-Entwicklungsumgebung, die z.B. Visual Studio Code oder Eclipse (oder IntelliJ) weit unterlegen ist.&amp;lt;br/&amp;gt;&lt;br /&gt;
BlueJ sollte man nur nehmen, wenn man es sowieso schon auf dem Rechner hat und überhaupt keine Lust hat sich mit einer vernünftigen Entwicklungsumgeung auseinanderzusetzen.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;u&amp;gt;WICHTIG: &amp;lt;/u&amp;gt;''' Wenn man das Projekt mit BlueJ öffnet, dann muss man alle Klassen über die main-Methode starten:&lt;br /&gt;
&lt;br /&gt;
* rechte Maustaste auf die Klasse -&amp;gt; main auswählen.&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in Eclipse=&lt;br /&gt;
'''''&amp;lt;font color='red'&amp;gt;Dieser Weg ist viel komplizierter als das direkte Runterladen von GitHub (siehe unten).&amp;lt;/font&amp;gt;'''''&lt;br /&gt;
&lt;br /&gt;
'''Runterladen und entpacken:'''&lt;br /&gt;
* '''[https://sibiwiki.de/wiki-files/javaQ1Q2.zip https://sibiwiki.de/wiki-files/javaQ1Q2.zip]''' runterladen&lt;br /&gt;
* Stand: 28.12.2024&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
'''In Eclipse...'''&lt;br /&gt;
&lt;br /&gt;
*File -&amp;gt; New -&amp;gt; Java Project&lt;br /&gt;
*Haken weg bei &amp;quot;Use Default Location&amp;quot;&lt;br /&gt;
*&amp;quot;Browse&amp;quot; klicken und den Ordner &amp;quot;javaQ1Q2&amp;quot; suchen.&lt;br /&gt;
**Evtl. liegt dieser Ordner in einem übergeordneten Ordner &amp;quot;javaQ1Q2&amp;quot;.&amp;lt;br/&amp;gt;Dann den &amp;quot;inneren&amp;quot; der beiden Ordner wählen.&lt;br /&gt;
*&amp;quot;Finish&amp;quot; klicken&lt;br /&gt;
&lt;br /&gt;
'''Die notwendigen Bibliotheken einbauen:'''&lt;br /&gt;
&lt;br /&gt;
* in Eclipse sollten die Bibliotheken eingebaut sein.&lt;br /&gt;
** wenn nicht: &amp;lt;/br&amp;gt;__readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&lt;br /&gt;
* andere IDEs: &lt;br /&gt;
** __readme/notwendige_libraries.odt&amp;lt;br/&amp;gt;''(im Ordner javaQ1Q2)''&amp;lt;br/&amp;gt;zeigt, welche Libraries eingebaut werden müssen. &lt;br /&gt;
&lt;br /&gt;
==Von GitHub beziehen==&lt;br /&gt;
Man kann das Projekt javaQ1Q2 auch von GitHub beziehen. Dort findet sich die aktuelleste Version des Projektes:&lt;br /&gt;
&lt;br /&gt;
'''[https://github.com/akaibel/javaQ1Q2 https://github.com/akaibel/javaQ1Q2]'''&lt;br /&gt;
&lt;br /&gt;
'''So bekommt man es in Eclipse:'''&lt;br /&gt;
# Copy the GitHub URL of the repository to the clipboard.&lt;br /&gt;
# Open Eclipse and choose File -&amp;gt; Import –&amp;gt; Git -&amp;gt; Projects from Git&lt;br /&gt;
# Choose the Clone URI option in the Git import wizard and click Next.&lt;br /&gt;
# Confirm the URI, Host and Repository path parameters and click Next.&lt;br /&gt;
# In &amp;quot;local destination&amp;quot; choose the directory, where the project should go to.&lt;br /&gt;
&lt;br /&gt;
'''So bekommt man das Projekt in Visual Studio Code:'''&amp;lt;br/&amp;gt;&lt;br /&gt;
* ChatGPT befragen mit folgendem Prompt:&lt;br /&gt;
* &amp;lt;code&amp;gt;vs code runterladen https://github.com/akaibel/javaQ1Q2&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Download und Öffnen in BlueJ=&lt;br /&gt;
* '''[[Datei:Java Q1Q2.zip]]'''&lt;br /&gt;
* in einen geeigneten Ordner extrahieren (z.B. &amp;quot;Informatik&amp;quot;)&lt;br /&gt;
* In BlueJ:&lt;br /&gt;
** Project -&amp;gt; Open Non BlueJ   bzw. &amp;lt;br/&amp;gt;Projekt -&amp;gt; Fremdprojekt öffnen&lt;br /&gt;
** Den Ordner &amp;quot;java-Q1Q2-202021&amp;quot; suchen.&lt;br /&gt;
*** Evtl. liegt dieser Ordner im Ordner &amp;quot;java-Q1Q2-202021-2020-07-28&amp;quot;.&lt;br /&gt;
* '''Jetzt noch die notwendigen Libraries laden:'''&lt;br /&gt;
** '''[[Datei:ECLIPSE-LIBRARIES.zip]]''' runterladen und entzippen.&lt;br /&gt;
&lt;br /&gt;
** Tools -&amp;gt; Preferences -&amp;gt; Libraries -&amp;gt; Add bzw.&amp;lt;br/&amp;gt;Werkzeuge -&amp;gt; Einstellungen -&amp;gt; Bibliotheken -&amp;gt; Hinzufügen&lt;br /&gt;
&lt;br /&gt;
** Den Ordner ECLIPSE_LIBRARIES suchen.&lt;br /&gt;
** In diesem Ordner jede jar-Datei einzeln durch Anklicken hinzufügen (=etwas mühsam...)&lt;br /&gt;
* Abschließend mit STRG+UMSCHALT+R die Virtuelle Maschine neu starten.&lt;br /&gt;
* Testen: Im Package _test die Klasse Graphtest: &amp;lt;br/&amp;gt;rechte Maustaste -&amp;gt; main ausführen.&lt;/div&gt;</summary>
		<author><name>Akaibel</name></author>
	</entry>
</feed>