www.plusplanet.de
Schulinfos von F. Töns


30.03.2020
Ich danke Euch herzlich für Eure Mind-Maps zum Thema "künstliche Intelligenz".
Auf Seite 3 des Skriptes (siehe unten) wird erklärt, wie man mit Hilfe von "Matrix mal Vektor" das Ergebins der Propagierungsfunktion berechnen kann.
Dies ist nichts anderes als die Arbeit mit Übergangsmatrizen!
Erledige - als kleine Mathe-Abiturvorbereitung - folgende Aufgabe:
Im Beispiel wird der Eingabevektor mit zwei Einsen benutzt. Als Ergebnis erhält man den Vektor (0,2 / 0,3 / -0,2)
Berechne das Ergebnis für folgende Eingabevekoren (ohne Anwendung der tanh-Funktion)
(0 / 1)
(1 / 0)
(0 / 0)

Das Ergebnis nehme ich gerne als E-Mail entgegen.

Viele Grüße und frohes Gelingen - Frank Töns


10.03.2020
Liebe Informatiker,
Ich hatte bislang noch kein Material für Euch online gestellt, weil erstens die Kommunikation aufgrund technischer Probleme nur eingeschränkt funktionierte und weil andere Kurse wichtiger waren. Ich nehme auch an, dass ihr Euch gerade mehr auf Eure Abi-Fächer konzentrieren möchtet. Aber Schulpflicht ist Schulpflicht, und da dürfen wir hier jetzt nicht schludern. Allerdings haben wir den Vorteil, dass wir uns jetzt ein Luxusthema rausgreifen können: Bei der künstlichen Intelligenz trifft Biologie auf Mathe und Informatik. Daher ist die Beschäftigung mit dieser Thematik für euch - auch im Hinblick aufs Abitur - keine vergeudete Zeit.

Aufgabe bis Mittwoch, den 25.03.202:
Erstelle eine MindMap zum Thema "Künstliche Intelligenz"

Lade dazu eine Version von FreeMind herunter und installiere sie:
http://freemind.sourceforge.net/wiki/index.php/Download

Der Wikipedia-Artikel zur Künstlichen Intelligenz liefert einen guten Überblick über das Thema.

Speichere dein Ergebnis erstens als .mm Datei ab (FreeMind-Datenformat) und exportiere die Mindmap auch als png. Dieses PNG möchte ich dann gerne per Mail geschickt bekommen.

Aufgabe bis Freitag, den 27.03.2020:
Ladet Euch folgendes Skript herunter
Mini-Skript "Neuronale Netze" www.plusplanet.de/pp_files/20190311_eigenes_Skript.zip
Um die Zip-Datei zu öffnen, benötigt man ein Passwort. In diesem Fall ist es der Vorname des Namenspatrons unserer Schule (kleingeschrieben).
Beispiel: Hieße unsere Schule "Konrad-Adenauer-Grundschule Düsseldorf" so wäre das Passwort "konrad".
Lest und versteht bis Freitag Seite 1 und 2 des Skripts!



10.03.2020

Eine kleine Office-Tour:
Erstelle ein OpenOffice Calc (also die "Excel-Variante" von Open Office) Dokument mit dem Namen 20200310_DeinName_Uebung.ods

A1) Erstelle ein Tabellenblatt mit einer einfachen Formel: Erstelle das "Tanken"-Beispiel von
http://www.der-pc-anwender.de/excel-2013-lernen/formeln-eingeben.htm
Dort wird viel über Excel geredet (was im einzelnen nicht immer für OpenOffice gilt).

A2) Tippe in einem neuen zweiten Tabellenblatt in den Spalten 1 und 2 jeweils die Vor- und Nachnamen unserer Kursteilnehmer ein. Aus diesen Daten soll eine Kursliste erstellt werden. Dazu müssen die Namen nach Nachname und als zweites Kriterium nach Vorname sortiert werden. Die Rohdaten sollen zunächst nicht weiter "angefasst" werden. Nun soll im dritten Tabellenblatt die eigentliche "schöne" Kursliste erstellt werden: Dazu muss man Bezüge zur zweiten Tabelle machen. Diese "schöne" Kursliste hat Spaltenüberschriften und hat die Namen in der Art "Butz, Niklas" direkt mit einem Komma verkettet. Dazu muss man:
* das zweite Tabellenblatt referenzieren, z.B. mit "=Tabelle1.A1"
* Texte verketten (mit der Funktion "=VERKETTEN(A1;", ";A2)
Desweiteren lässt man am Besten in der Ersten Spalte laufende Nummern entstehen, indem man die Zahlenfolge "herunterzieht".

A3) Theorie zu Formeln:
Lies: http://www.der-pc-anwender.de/excel-2013-lernen/formeln-kopieren.htm
Erstelle dann ein viertes Tabellenblatt, welches in der ersten Zeile 6 Zellen mit Phantasiezahlen enthält.
Gib dann folgende Formeln in folgenden Zellen ein:
A2: "=SUMME(A1:C1)"
B2: "=SUMME(A1;C1)"
C2: "=SUMME($A1;$C1)"
Kopiere die drei Formeln in die Zellen D,E,F rechts daneben. Erkläre dann, was die Formeln bewirken.

A4) Finde heraus, wie du eine Multiplikationstabelle für das große 1x1 in Excel/Calc (ohne einzeln einzutippen!) erstellst und füge sie in dein Dokument ein. Dazu musst Du schlau Formeln nutzen und die "Herunterziehen"-Funktion nutzen.
Also in der Art:

    1   2   3   4   5  ...  20
1   1   2   3   4   5  ...
2   2   4   6   8  10  ...
3   3   6   9  12  15  ...
...
20          .. ... ...      400


A5) Erstelle eine neue Tabellendokument-Datei mit den Einträgen:
Name, Vorname
Butz, Niklas
Bosse, Nicole
usw...
Erstelle dann ein Writer-Dokument, welches diese Daten als Datenquelle für einen Serienbrief nutzt.


05.03.2020
Link zum Johnny-Assembler...
https://www.inf-schule.de/rechner/johnny
oder direkt zur webbasierten Version:
http://dev.inf-schule.de/content/7-rechner/3-johnny/johnny2/

Übungshinweise zum Test:
1. Programmierung: Ihr müsst wissen, wie man z.B. den Inhalt der Speicherstelle 5 mit Inhalt der Speicherstelle 6 multipliziert und das Ergebnis in Speicherstelle 7 ablegt.
2. Microcode: Ihr müsst wissen, wie man Befehle selbst "baut": Z.B. den INC Befehl nachbauen können, oder selbst einen DBL-Befehl bauen können.


Auszug aus der Dokumentation von Johnny:

5. Einfache Assemblerbeispiele
5.1. Addieren zweier Zahlen und Abspeichern des Ergebnisses
Soll die Zahl aus Speicherzelle 10 zur Zahl aus Speicherzelle 11 addiert und das Ergebnis in Speicherzelle 12 gespeichert werden, so lässt sich dies durch das folgende einfache Maschinenprogramm realisieren:
001: TAKE 010
002: ADD 011
003: SAVE 012
004: HLT 000
5.2. Multiplizieren zweier Zahlen und Abspeichern des Ergebnisses
Hier muss man nun zwei Speicherstellen mit Hilfswerten belegen: Zum Beispiel Speicherstelle 9 mit 1 und die Speicherstelle 12, in der nachher das Ergebnis stehen soll, mit 0.
000: NULL 012
001: TAKE 012
002: ADD 010
003: SAVE 012
004: DEC 011
005: TST 011
006: JMP 001
007: HLT 000
Das Programm addiert nacheinander immer wieder den Wert in Speicherstelle 10 auf den Wert in Speicherstelle 12 auf und speichert das Ergebnis wieder in Speicherstelle 12 ab. In jedem solchen Zyklus vermindert das Programm dann den Wert in Speicherstelle 11 um 1. Das geschieht so lange, bis in Speicherstelle 11 der Wert 0 steht. Dann springt das Programm aus der Schleife heraus und hält an.



05.03.2020
Schreibe einen Microcodebefehl DBL, der den Inhalt der angegebenen Speicherstelle verdoppelt.
Schreibe einen Microcodebefehl SKP ("Skip"), der den nächsten Befehl erst in der übernächsten Speicherstelle ausführt, so dass man mal eben eine Datenspeicherstelle "dazwischenschieben" kann.

Für Programmteile, die öfters wiederverwendet werden müssen, schreibt man in Java eine Methode. Bei JohnnyAssembler wäre z.B. eine Multiplikationsmethode hilfreich. Überlege, welche Mechanismen man bei Johnny-Assember benötigt, um eine Art "Methode" schreiben zu können (Ein einfaches JMP genügt nicht! Warum nicht?). Notiere dazu Stichpunkte.


03.03.2020
Schreibe die Microcodebefele

110: LDI (Load indirect)
120: STI (Store indirect)  // Anderer Name für SVI, wird vom BlueJ-Projekt erkannt
130: JPI (Jump indirect)

Schreibe dann ein Programm, welches eine "Schachbrettlinie" (weiß - dunkelgrau im Wechsel) zeichnet. Nutze die Befehle LDI und STI, damit der eigentliche Maschinencode nicht verändert werden muss, sondern nur Speicherstellen für Variablen. Schreibe das Programm so, dass es sich zu Beginn anständig initialisiert, also dass das Programm durch einfaches Drücken des "Reset"-Knopfs erneut ausgeführt werden kann.

26.02.2020
Schreibe zunächst den Microcodebefehl SVI:

ins-ab
ram-db
db-ins
ins-ab
acc-db
db-ram
pc++
mc:=0

Schreibe dann das Programm:

000 .. ... TAKE 006
001 .. ... SVI  007
002 .. ... INC  007
003 .. ... JMP  000
004 00 000
005 00 000
006 00 044
007 00 008

Erläutere, was SVI bewirkt. Schreibe dann die entsprechende Version für TAKE und erstelle ein Demoprogramm (z.B. eines, welches sich selbst kopiert).


11.02.2020
Aufgaben:
Lies im Johnny-Skript noch einmal die Seite 8 aufmerksam durch. Dort werden zwei Programme vorgestellt. Mit diesem Vorwissen sollen nun folgende Programme geschrieben werden:
A) Schreibe ein Programm, welches die Zahl, die in Speicherstelle 20 steht, quadriert.
B) Wieder steht zu Beginn in Speicherstelle 20 eine Zahl. Diese nennen wir für diese Aufgabe N. Schreibe ein Programm, welches die Summe aller natürlichen Zahlen kleiner gleich N berechnet:
Beispiele:
  N=4: Ergebnis ist 4+3+2+1 = 10
  N=5: Ergebnis ist 5+4+3+2+1 = 15
C) Zu Beginn des Programms stehen in den Speicherstellen 100 bis 109 insgesamt 10 unterschiedliche Zahlen. Schreibe ein Programm, welches die Quadrate der oben genannten Zahlen berechnet ud in Speicherstelle 200 bis 209 speichert.



06.02.2020

Programmieren in Maschinensprache/Assembler
Lade folgendes Programm herunter:
https://sourceforge.net/projects/johnnysimulator/
Lies das darin enthaltene Skript durch bis Seite 8.



04.02.2020

Übung zu regulären Ausdrücken

RegEx-Aufgaben: Finde reguläre Ausdrücke in Notepad++ um folgende Dinge in Texten zu finden:
1. Postleitzahl
2. Datumsangaben
3. Hauptwörter (großgeschrieben)
4. Kommazahl
5. E-Mail-Adressen

Informiere Dich auf: https://www.regular-expressions.info/quickstart.html



Maschinensprache
Informiere Dich (auf Wikipedia) zu folgenden Themen:
https://de.wikipedia.org/wiki/Mikrocontroller
https://de.wikipedia.org/wiki/Assemblersprache
https://de.wikipedia.org/wiki/8-Bit-Architektur
https://stackoverflow.com/questions/5616237/how-are-everyday-machines-programmed
https://de.wikipedia.org/wiki/MOS_Technology_6502
Im Casio-Taschenrechner scheint eine Variante von folgendem Prozessor verbaut zu sein:
https://www.renesas.com/us/en/products/microcontrollers-microprocessors/superh/sh7780/sh7724.html



23.01.2020
Turing-Maschine
http://math.hws.edu/eck/js/turing-machine/TM.html

21.01.2020
Zusammenfassung bisheriger Erkenntnisse
Automaten: Automaten akzeptieren (oder lehnen ab) Wörter einer Sprache. Ein Wort ist akzeptiert, wenn sich der Automat nach der Eingabe in einem Endzustand befindet. Es gibt NEAs und DEAs. NEAs lassen sich in DEAs umwandeln (denn diese lassen sich einfacher programmieren)
DEAs lassen sich ggf. minimieren.
Grammatiken: Grammatiken sind Regeln, nach denen Wörter einer Sprache gebildet werden. Reguläre G. lassen sich direkt in einen NEA wandeln.
Reguläre Sprachen sind Sprachen, zu denen es eine reguläre Grammatik gibt. Aber Vorsicht:
(mit S und B Nichtterminalsymbole, a Terminalsymbol)
S -> aBa
B -> aB | a
Ableitung eines Wortes:
S -> aBa -> aaBa -> aaaa
(Die Sprache besteht aus allen Wörtern mit  3 oder mehr 'a')
Die erste Regel S -> aBa macht die Grammatik zu einer nicht-regulären Grammatik.
Aber: Die Sprache ist dennoch regulär, denn:
S -> aB
B -> aC
C -> aC | a
Diese Grammatik IST regulär und erzeugt die gleiche Sprache wie die erste (aber nichtreguläre) Grammatik. Weil es eine reguläre Grammatik für die Sprache gibt, ist die Sprache regulär.

Es gibt Sprachen, die von einem DEA oder NEA nicht erkannt werden können. (Z.B. korrekt geformte Klammerterme)
Die Sprache der korrekt gerformten Klammerterme ist nicht mehr eine reguläre Sprache. Sie ist eine kontextfreie Sprache.

(Nichtdeterministische ) Kellerautomaten akzeptieren genau die kontextfreien Sprachen.
Aber auch dieses Automatenmodell hat Grenzen (d.h. es gibt Sprachen, die mit diesem Modell nicht erkannt werden können)

Für die kontextsensitiven und die Typ-0-Sprachen ist das Modell der Turingmaschine hilfreich.

Turingmaschinen können (wie die einfacheren DEA bzw. NEA Automatenmodelle auch) entscheiden, ob ein Wort zu einer bestimmten Sprache gehört - oder nicht: Man definiert bei einer Turingmaschine einfach bestimmte Zustände als "akzeptierende" Zustände. Endet ein Programm in einem solchen Zustand, so ist ein Wort akzeptiert (und ist Teil der Sprache) - andernfalls nicht.
Auf Turingmaschinen kann man auch sogenannte "fleißige Biber" programmieren. Dies sind TM mit einer vorgegebenen Anzahl von Zuständen, deren Aufgabe es ist, möglichst viele Einsen auf ein anfangs leeres Band zu schreiben - und schließlich auch zu halten. (Es ist sehr einfach, ein TM-Programm zu schreiben, welches unendlich viele Einsen auf das Band schreibt. Der Kniff liegt darin, terminierende Programme zu entwerfen)
Dabei entsteht regelmäßig das Problem, dass man bei dem Versuch, einen solchen fleißigen Biber zu schreiben, entscheiden muss, ob das Programm wirklich terminiert (also irgendwann anhält). Dieses Problem ist nicht allgemein lösbar bzw. entscheidbar.

In der Theoretischen Informatik bedeutet dies ganz allgemein: Es gibt klar definierte Probleme (hier: zu entscheiden, ob ein Entwurf für einen fleißigen Biber tatsächlich terminiert), die nachweislich unlösbar sind. Es gibt also Grenzen für die Lösbarkeit von Problemen.

Lösungen und Übungsmaterial zu DEA und NEA
20200200_Formale_Sprachen_Loesungen_zum_Skript_low.pdf
20200200_dea_minimieren2.pdf
20200200_nea_in_dea_wandeln.pdf


08.01.2020
Simulator für Automaten:
https://flaci.com/home/
und dort dann "abstrakte Automaten"

10.12.2019
Mitschrift aus dem Unterricht:

Klärung der Begriffe am Beispiel
"Rechenausdrücke bis Klasse 6"
Alphabet, Wort, Menge aller Wörter,
formale Sprache, Syntax und Semantik

Alphabet: 0,1,2,3,4,5,6,7,8,9,+,-,*,/,(,),.
Beispiele für Wörter:
11     1+1     (5+4)*3
-+3     (Wort über dem Alphabet, allerdings
        kein gültiges Wort der Sprache)    
1=1    (Das "=" ist kein Element desAlphabets,
        daher ist 1=1 nicht einmal ein Wort
        über dem obigen Alphabet
Die Formale Sprache der "Rechenausdrücke bis K6" sind alle
gültigen Wörter, d.h. alle wirklich korrekt notierten
Rechenausdrücke, die man zu einer Zahl ausrechnen kann.

Ein syntaktisch korrektes, aber semantisch fragwürdiges Wort wäre: 2/0


Ein Beispiel für eine eigene Grammatik
N = {Raumnr,Etage,Nr,Ziffer}
T = {"R",".","E","0"..."9"}
S = Raumnr
P = {
Raumnr = "R" Etage "." Nr   |  "E" Nr
Etage  = "1" | "2"
Nr     = Ziffer Ziffer
Ziffer = "0" | "1" | ...  "9"
}

Erstellung einer Ableitung:
Raumnr -> "E" Nr -> "E" Ziffer Ziffer
          -> "E" "1" "1"   bzw. E11
Raumnr -> "R" Etage "." Nr
          -> "R" "1"   "." Ziffer Ziffer
          -> "R" "1"   "."   "0"   "1"
          Bzw: R1.01   

Beispiele für Ableitungen dieser Grammatik:
R1.13
R2.17
R1.26
E14
E16

HA:
Skript S16 Nr1a und 1b. Hier ist "Bezeichner" das Startsymbol. 1b: jeweils 3



03.12.2019

Der erste Link auf
http://www.oberstufeninformatik.de/theorie/index.html
ist ein Skript zu theoretischer Informatik:
http://www.oberstufeninformatik.de/theorie/Formale_Sprachen.pdf



07.11.2019
Stoff für den Kryptografie-Test:
Caesar-Verschlüsselung können
Vigenere-Verschlüsselung können
Vigenere-Verschlüsselung mit Autokey können
Diffie-Hellman Schlüsselaustausch durchführen können (wenn Formeln gegeben sind)


Kryptosystem "Vigenere mit Autokey"
Klartext:   treffenumneunamturm
Schlüssel:  ottotreffenumneunam
Geheimtext: HKXTYVRZRRROZNQNHRY

Diffie-Hellman-Schlüsselaustausch
Alice und Bob kommunizieren
Carlo ist der Angreifer

1) Alice schlägt Bob zwei Zahlen vor:
Eine große Primzahl p (z.B. 5)
und eine ganze Zahl g aus [1;p[  (z.B. 2)
2) Alice erzeugt im Geheimen eine Zahl
a (z.B. 3) aus [1;p[
Alice berechnet: x = g^a mod p
          hier   x = 2³ mod 5
                   = 8 mod 5 = 3      
Alice schickt nun dieses x=3 an Bob
3) Bob erzeugt im Geheimen eine Zahl
b (z.B. 4) aus [1;p[
Bob berechnet:   y = g^b mod p
          hier:  y = 2^4 mod 5
         y = 16 mod 5 = 1
Bob schickt diese y=1 an Alice
4) Alice rechnet: s = y^a mod p = 1³ mod 5 = 1
   Bob   rechnet: s = x^b mod p = 3^4 mod 5= 1
Diese Zahl s kann als Schlüssel für z.B.
Vigenere + Autokey verwendet werden.
  
Was kann Carlo folgern? Er kennt:
p=5 g=2 x=3 y=1   (unbekannt: a=3, b=4)
Alices Rechnung 3 = 2^a mod 5
Bob    Rechnung 1 = 2^b mod 5
Um s zu bestimmen benötigt Carlo a oder b
Er versucht z.B.  3 = 2^a mod 5  zu lösen.
Dazu braucht er den mod-Logarithmus.
Im Allgemeinen geht das nur mit Probieren
Carlo rechnet:
    a                    1    2    3    4
2^a mod 5                2    4    3    1
                                       AHA a muss 3 sein
Dann erst kann Carlo s bestimmen.   

Übung: Berechne s, wenn Alice und Bob
folgende Zahlen austauschen:
p=13 g=8  a=5  b=12
Alice rechnet: x = 8^5 mod 13
                 = 32768 mod 13 = 8
               x wird an Bob gesendet!
Bob rechnet:   y = 8^12 mod 13
                 = 68719476736 mod 13 = 1
   y wird an Alice gesendet!

Schlüsselbestimmung von Alice:
s = y^a mod p = 1^5 mod 13 = 1
Schlüsselbestimmung von Bob
s = x^b mod p = 8^12 mod 13 = 1

Carlo kennt: p=13 g=8 x=8 und y=1
Carlo will nun a ermitteln und probiert:
   8^a mod 13 = 8
  
Wertetabelle:
a                  1   2    3    4   5 .... 12
8^a mod 13         8   12            8
.                                          Hurra!
  



24.09.2019
Programmiere zunächst das Chatprogramm fertig.
Formuliere Vor- und Nachteile dieser Methode.

Überfliege den Wikipedia Artikel zum OSI-Modell, lies das Briefpost-Beispiel am Artikelende und übertrage das Beispiel auf das "TCP/IP-Referenzmodell" (siehe entsprechende Spalte in der Tabelle).

Lies den Abschnitt "Allgemeines" des Wiki-Artikels "Transmission Control Protocol". Überfliege dann den Artikel zu HTTP.



17.09.2019

###################################
Alle Benutzer, die schonmal die Note 4 bei einem Film vergeben haben.
select distinct Benutzer.Name from Benutzer, sah where Benutzer.BenutzerID=sah.BenutzerID AND sah.Zensur = 4;
###################################
Alle Romantik-Filme
select Film.Titel from Film,Genre where
Genre.Name = "Romantik" AND Film.GenreID = Genre.GenreID;
###################################
Alle Benutzer, die einen Romantik-Film gesehen haben
select distinct Benutzer.Name
from Benutzer, sah, Film, Genre
where Benutzer.BenutzerID=sah.BenutzerID
AND   sah.FilmID=Film.FilmID
AND   Film.GenreID=Genre.GenreID
AND   Genre.Name = "Romantik";
###################################
Alle Benutzer, die Inception gesehen haben
select distinct Benutzer.Name
from Benutzer,sah, Film
where Benutzer.BenutzerID = sah.BenutzerID
AND   sah.FilmID=Film.FilmID
AND   Film.Titel = "Inception";
###################################
Durchschnittsnote eines jeden Films (mit Anzahl der eingeflossenen Bewertungen)
select Film.Titel, avg(sah.Zensur) AS mittel, count(sah.Zensur) AS anz
from Film,sah
where Film.FilmID = sah.FilmID
group by Film.Titel
having anz>2
order by mittel;

##############################################
Welches Filmgenre ist am öftesten vertreten?
select Genre.Name, count(Genre.Name) AS c
from Film, Genre
where Film.GenreID = Genre.GenreID
group by GenreID
order by c desc;
##############################################
Wer hat die meisten/wenigsten Filme gesehen?

select Benutzer.Name,
      count(Benutzer.Name) AS c
from Benutzer,Film,sah
where Benutzer.BenutzerID=sah.BenutzerID
AND Film.FilmID = sah.FilmID
group by Benutzer.BenutzerID
order by c desc;
##############################################
Finde zu jedem Genre die Anzahl der Filme, die von diesem Genre gesehen wurden.

select Genre.Name, count(Genre.Name)
from Benutzer,sah,Film,Genre where
Benutzer.BenutzerID = sah.BenutzerID AND
sah.FilmID = Film.FilmID AND
Film.GenreID = Genre.GenreID
group by Genre.GenreID;

##############################################
Finde zu jedem Genre das Durchschnittsgeburtsjahr der Zuschauer

select Genre.Name, avg(Benutzer.Geburtsjahr)
from Benutzer,sah,Film,Genre where
Benutzer.BenutzerID = sah.BenutzerID AND
sah.FilmID = Film.FilmID AND
Film.GenreID = Genre.GenreID
group by Genre.GenreID;

##############################################
Bestimme die Anzahl der Einsen, Zweien, Dreien etc., die insgesamt vergeben wurden.

select count(sah.Zensur), sah.Zensur
from sah group by sah.Zensur;

##############################################
Bestimme die Anzahl der Einsen, Zweien, Dreien etc., die bei den Filmen vergeben wurden, die auch wirklich von existierenden Benutzern gesehen worden sind.

select count(sah.Zensur), sah.Zensur
from Benutzer,sah,Film,Genre where
Benutzer.BenutzerID = sah.BenutzerID AND
sah.FilmID = Film.FilmID AND
Film.GenreID = Genre.GenreID
group by sah.Zensur;

##############################################
"Vorlage" für select-Anweisungen:
select ..... Spaltenauswahl ....
from ..... Tabelle(n)....
where ....Bedingungen....
group by ...nach welchem Attribut soll
              gruppiert werden? ...


03.09.2019
Digitale Versionen der Dokumentation von vor den Ferien
sqlite_tutorial_select.pdf
sqlite_tutorial_create_insert.pdf
20190519_kartesisches_produkt.pdf

Aggregatfunktionen in sqlite:
https://sqlite.org/lang_aggfunc.html

Ein Beitrag des OKCupid-Blogs:
https://theblog.okcupid.com/a-womans-advantage-82d5074dde2d



08.07.2019
EVA am Montag

Liebe Informatiker, leider bin ich unerwartet am Montag nicht anwesend. Daher bitte ich Euch, folgende Aufgaben zu erledigen:

Aufgabe 1. Jedes Team erstellt ein Textdokument mit folgendem Inhalt:
A) Eine "Frage" nach einer interessanten Information, die man aus der Datenbank entnehmen könnte (z.B. "Welcher Benutzer hat die meisten Action-Filme gesehen?")
B) Welche Tabellen sind für die Beantwortung dieser Frage notwendig? (Hier: "Benutzer","sah","Filme","Genre")
C) Versuch einer Formulierung der passenden SQL-Abfrage.

Aufgabe 2: Ihr sollt auf humoristische Art und Weise die erste Seite einer GBG-Schulzeitung in Bildzeitungsstil zusammenstellen: Am Besten mit fotomontierten Bildern, Schlagzeilen (die "kreativ mit der Wahrheit umgehen") etc. Der Phantasie sind keine Grenzen gesetzt: Hauptsache es ist lustig, reißerisch und es bezieht sich auf das GBG. Vielleicht lassen sich die Ideen später mal verwerten (wir haben kurz nach dem Künstlerabend ja schonmal über eine mögliche "Heute-Show"-Einlage beim Künstlerabend gesprochen)

Die Ergebnisse von Aufgabe 1 und Aufgabe 2 sollen auf den Share-Ordner abgelegt werden.



19.06.2019
Themen für den Test: Datenbanken
Zettel:
* Doppelseitiger Zettel: (Englisch) Creating and dropping tables ...
* Doppelseitiger Zettel: (Englisch) Select statement ...
* Buchkope: Transformation in ein relationales Modell
* DinA5-Zettel: Schreibweisen und kartesisches Produkt

Themen allgemein:
* ER-Diagramm verstehen / ergänzen können
* Normalisierungsregeln (siehe Wikipedia-Artikel)
  -> Versucht die Beispiele zu verstehen
* Transformationsregeln (ER-Diagramm -> relationales Modell)
* SQL

Update: die versprochenen Dokumente
20190603_interessendb2.png
20190605_interessen_db_schema.pdf



22.05.2019
Hausaufgabe zum 29.05.2019:
Lies: https://de.wikipedia.org/wiki/Normalisierung_(Datenbank)#Normalformen
Dort werden mehrere Normalformen unterschieden. Für uns relevant sind die ersten drei. Die Texte sind zum Teil etwas schwer verständlich. Sinnvollerweise schaut ihr euch aber auf jeden Fall die Beispiele an! Da solltet ihr dann zumindest das Problem verstehen!


21.05.2019
Daten sind mächtig - ein Beispiel

https://theblog.okcupid.com/dont-be-ugly-by-accident-b378f261dea4

11.02.2019
Eine Datei direkt in einen String einlesen

String text = new Scanner(new File("dateiname.txt")).useDelimiter("\\Z").next();


07.01.2019
Miniübungen zum Warmwerden

a) Schreibe ein Programm, welches eine Benutzereingabe darauf testet, ob sie länger als 6 Zeichen ist.
Tipp: Benutzereingabe:

        String eingabe = JOptionPane.showInputDialog(null,
                "Geben Sie etwas ein!",
                "Eine Eingabeaufforderung",
                JOptionPane.PLAIN_MESSAGE);

b) Erweitere: Die Benutzereingabe soll darauf getestet werden, ob ein Großbuchstabe darin enthalten ist.
Tipp: Schreibe eine Schleife, die solange läuft, wie Zeichen in der Eingabe enthalten sind. Extrahiere dann dass i-te Zeichen mit charAt(i)
Tipp: Benutze public static char isUpperCase(char ch) der Klasse Character.

c) Erweitere: Die Benutzereingabe soll darauf getestet werden, ob eine Ziffer darin enthalten ist.
Tipp: Benutze public static boolean isDigit(char ch) der Klasse Character.

d) Erweitere das Programm so, dass die Teile a, b und c vereint werden um praktisch einen Passworttest durchzuführen, so dass am Ende ausgegeben wird, ob das Passwort den Sicherheitsanforderungen genügt.

Erstelle ein neues Programm
e) Schreibe ein Programm, welches eine Benutzereingabe darauf testet, ob ausschließlich Ziffern darin enthalten sind.
f) Schreibe ein Programm, welches solange eine Benutzereingabe verlangt, bis der Benutzer eine Zahl (ausschließlich Ziffern) eingegeben hat.
Tipp: Benutze eine while-Schleife
g) Schreibe ein Programm, welches die Quersumme einer Zahl (Benutzereingabe) berechnet.
Tipp: Benutze int zahl = Integer.parseInt(eingabe); um eine Zeichenkette in eine Zahl umzuwandeln!

h) Schreibe ein Programm, welches überprüft, ob eine vom Benutzer eingegebene Zahl eine Primzahl ist.
Tipp: Die Teilbarkeit durch die z.B. Zahl 17 kann man mit if(testzahl%17 == 0) überprüfen.

i) Schreibe ein Programm, welches überprüft, ob eine vom Benutzer eingegebene Zahl ein Teil der Fibonaccifolge ist.




03.12.2018
Schnittstellen
Lies die (Unter-)Kapitel 6.7 / 6.7.1 / 6.7.2 / 6.7.3
http://openbook.rheinwerk-verlag.de/javainsel/06_007.html
Formuliere dann einen Beitrag für unsere Vokabelliste mit dem Titel "Interface".


Lies die (Unter-)Kapitel 9.1 / 9.1.1 / 9.1.2 / 9.1.3 (für uns nebensächlich) / 9.1.4 (nur der erste Abschnitt)
http://openbook.rheinwerk-verlag.de/javainsel/09_001.html
Formuliere dann einen Beitrag für unsere Vokabelliste mit dem Titel "Comparable und compareTo".

Lies die Beschreibung der Methode Arrays.sort(Object[] o):
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(java.lang.Object[])
Erstelle schließlich ein kleines Demoprogramm in der Art:

String[] worte = new String[4];
worte[0] = "Hase"; worte[1] = "Affe"; worte[2] = "Löwe"; worte[3] = "Nilpferd";
Arrays.sort(worte);
// dann noch Ausgabe des Arrays

Erkläre schließlich den Programmcode, indem du ihn zeilenweise exakt beschreibst.



12.11.2018
Wichtige Vokabeln im Informatikunterricht (Update)

Array: Ein Array ist eine Zusammenfassung mehrerer Elemente gleichen Typs. Die Anzahl der Elemente, die in einem Array Platz finden sollen, muss beim Anlegen des Arrays festgelegt werden. Im Speicher werden die Elemente dann direkt hintereinander gespeichert, so dass man auf ein bestimmtes Element einfach über einen Index (also einer Zahl zwischen 0 und <Arraygröße - 1> ) zugreifen kann. Arrays kann man daher nicht einfach vergrößern oder verkleinern - denn wahrscheinlich ist hinter dem Array gar kein freier Speicher verfügbar. Für eine Vergrößerung müsste man daher ein neues Array mit neuer Größe anlegen und die alten Arrayelemente dort hineinkopieren.
Beispiel:
String[] worte = new String[4];
worte[0] = "Hase"; worte[1] = "Affe"; worte[2] = "Löwe"; worte[3] = "Nilpferd";


Verkettete Liste: In einer "Verketteten Liste" kann man - ähnlich einem Array - mehrere Elemente gleichen Typs zusammenfassen. Anders als bei einem Array werden die Elemente nicht im Speicher hintereinander abgelegt. Stattdessen wird für jedes Element einzeln Speicher reserviert. Dort wird das Element selbst und eine Referenz auf das nächste Element (next-Referenz) gespeichert. Diese beiden Teile zusammen nennt man "Knoten". Um auf das zehnte Element der verketteten Liste zuzugreifen, muss man sich daher vom Beginn der Liste bis dorthin durchhangeln. Vorteil gegenüber Arrays: Die Listengröße ist beliebig veränderbar, Elemente können beliebig eingefügt oder gelöscht werden, ohne dass der Rest der Liste betroffen wäre.
Nachteil gegenüber Arrays: Zugriff auf ein einzelnes Element ist nur möglich, indem man sich "durchhangelt" - Dies kann im Zweifelsfall (Bei Millionen von Elementen) länger dauern.

Implementierung: Die "ausprogrammierte Version" von einem Algorithmus. Wenn wir beispielsweise die in Java eingebaute Methode "sort" benutzen, so interessiert uns nur, WIE wir sie benutzen müssen. Was genau hinter den Kulissen passiert, wird bei der Programmierung - der Implementierung - der Methode "sort" festgelegt, und ist für einen Benutzer der Methode nebensächlich.

Interface: Um neben den Eigenschaften und Methoden einer Oberklasse auch Methoden anderer Typen bereitzustellen, kann man das Konzept "Interface" (Schnittstelle) verwenden.
Beispiel: Sowohl Lastwagen-Objekte als auch Haustier-Objekte könnten das Interface "Kaufbar" implementieren, so dass all diese Objekte eine Methode "int preisErfragen()" bereitstellen. D.h. dass man von allen Objekten, die "Kaufbar" sind, auch den Preis erfragen kann.
Der Unterschied zur Vererbung ist, dass Methoden, die in einem Interface festgelegt sind, nicht vererbt werden: Stattdessen muss eine Klasse mit diesem Interface selbst die Implementierung enthalten.
Man könnte einwenden, dass man diese Idee auch über Vererbungsbeziehungen realisieren könnte, so dass in diesem Fall sowohl Lastwagen als auch Haustiere von einer Oberklasse "KaufbareObjekte" erben. Aber wenn man zusätzlich z.B. noch "krankenversicherbare" Objekte unterscheiden will, so wird es knifflig: Sowohl Haustiere als auch Menschen könnte man krankenversichern - nicht aber Lastwagen. Andererseits kann man zwar Haustiere und Lastwagen kaufen - nicht aber Menschen. Somit kann man in solchen Fällen keine sinnvolle Vererbungsbeziehung herstellen! Da eine Klasse aber mehrere Interfaces implementieren kann (nicht aber mehrere direkte Oberklassen haben kann), kann man das dargestellte Problem mit zwei Interfaces "Kaufbar" und "Krankenversicherbar" lösen.

Comparable und compareTo: Objekte, die das Interface "Comparable" implementieren, können sich untereinander selbst vergleichen. Je nachdem, ob eines der beiden verglichenen Objekte "größer" oder "kleiner" als das andere Objekt ist, wird eine positive oder negative Zahl zurückgegeben. Die in Java eingebaute Methode "sort" aus der Klasse "Array" sortiert Elemente aus einem Array mit Hilfe des Comparable-Interfaces: Wenn jedes Element des Arrays "Comparable" ist, so können die Elemente des Arrays miteinander verglichen und automatisch sortiert werden.

Klasse: In einer Klasse sind Methoden und Eigenschaften festgelegt.
Die Klasse dient als Vorlage oder Schablone, mit der beliebig viele Objekte erzeugt werden können.
Beispiel: Eine Klasse namens "Ort" könnte die Eigenschaften "Name, x-Koordinate, y-Koordinate" besitzen und die Methode "int abstandVon(Ort zweiterOrt)" bereitstellen.

Objekt: Ein Objekt ist eine konkretes Exemplar einer Klasse (Man sagt auch, ein Objekt ist eine Instanz einer Klasse). Ein Objekt muss immer erst mit "new" neu angelegt werden, denn dabei wird Speicherplatz für das Objekt reserviert.
Beispiel: Von der Klasse Ort könnten einzelne konkrete Objekte angelegt werden, wie "Freiburg", "Kiel" etc. mit deren Koordinaten.

Eigenschaft: Eine Eigenschaft gehört zu einem Objekt (und wird in einer Klasse deklariert - d.h. der Typ wird festgelegt, nicht aber ein Wert))
Beispiel: x-Koordinate eines Ortes

Methode: Handlungen, die ein Objekt ausführen kann (oder Anfragen, die es beantworten kann, oder Nachrichten, die einem Objekt geschickt werden können)
Beispiel:
Die in Java eingebaute Klasse String kennt die Methode "length()", welche eine Zahl zurückgibt.
Die in Java eingebaute Klasse Point kennt die Methode "setLocation(int x, int y)", welche die x- und die y-Eigenschaft des Punktes verändert.

Das Schlüsselwort static: Normalerweise schreibt man komplexere Javaprogramme so, dass man unterschiedliche Objekte anlegt und schließlich Methoden dieser Objekte aufruft. Beispielsweise erzeugt man mit String freundin = "Susi"; eine Zeichenkette. Mit freundin.length() erfragt man über die Methode length die Länge der Zeichenkette (in diesem Fall ist das Ergebnis 4).
Gelegentlich möchte man aber Methoden aufrufen können, ohne erst ein Objekt anlegen zu müssen. Solche Methoden müssen mit static markiert werden.
Insbesondere ist die Hauptmethode main, mit der ein Programm beginnt, immer static, da ja noch gar kein Objekt bei Programmbeginn existiert.

Das Schlüsselwort this: In einer (nicht statischen) Methode kann es vorkommen, dass wir eine Referenz auf das aktuelle Objekt ("in" dem wir uns gerade "befinden") benötigen. In diesem Fall benötigen wir this, welches dann so wie ein Objektname verwendet werden kann.
Beispiel: In Java kann man mit einem (etwas umständlichen Mechanismus) dafür sorgen, dass eine Methode unseres Objektes alle 3 Sekunden aufgerufen wird. Das könnte dann (vereinfacht) so aussehen:
System.RufeAlleDreiSekundenAuf(this);

Datentyp: die Art und Weise, wie der Wert einer Variablen gespeichert ist.
Beispiele: int, boolean, String, char sind Datentypen. In einer Variablen vom Typ "int" werden ganze Zahlen gespeichert. Im Programm führt die Zeile "int a = 3.23;" zu einem Fehler, da in einer int-Zahl keine Kommazahl gespeichert werden kann.

atomare Datentypen und Referenztypen:
Atomare Datentypen sind bei Java fest eingebaute Datentypen wie int, char, boolean etc. bei denen der Wert "direkt in" der Variablen gespeichert wird. Bei Referenztypen (wie String, oder auch eigene Klassen wie Ort) liegt "hinter dem" Variablennamen ein Verweis auf den Speicherbereich, in dem die eigentlichen Daten stehen. Eine Variable, welche einen Referenztyp hat, muss nicht zwingend auf einen Speicherbereich verweisen - der Verweis kann auch "null" sein, d.h. es existiert kein Speicherbereich, in dem die eigentlichen Daten stehen. Daher kann es bei Referenztypen zur "Null Pointer Exception" kommen, bei atomaren Datentypen aber nicht.

Variable: Eine Variable ist der Name einer Eigenschaft oder eines Wertes, den man im Programm benutzt. Eine Variable hat immer einen Datentyp.
Beispiel: int i = 7;
Die Variable i erhält den Wert 7. i kann sowohl Eigenschaft einer Klasse oder eine lokale Variable sein.

Argument: In der Informatik ist mit "Argument" ein Wert gemeint, welcher einer Methode übergeben wird.
Beispiel: Man könnte sich eine Methode "int zaehleVokale(String zeichenkette)" schreiben, welche die Anzahl der Vokale im übergebenen String ermittelt. In diesem Beispiel ist "zeichenkette" das Argument und "int" ist der Datentyp des Rückgabewertes.

Konstruktor: Immer, wenn ein Objekt mit "new" angelegt wird (und Speicherplatz für das neue Objekt geschaffen wird), wird ein Konstruktor der Klasse aufgerufen. Das ist eine spezielle Methode, die den gleichen Namen hat, wie die Klasse selbst. Ein Konstruktor ist sinnvoll, um die Eigenschaften des Objektes mit sinnvollen Werten vorbelegen zu können.
Wenn man keinen eigenen Konstruktor schreibt, wird von Java automatisch ein "leerer Konstruktor" angelegt, der keine Argumente erwartet und nichts tut. Dieser leere Konstruktor steht allerdings nicht mehr zur Verfügung, wenn man eigene Konstruktoren schreibt. D.h. wenn nur ein Konstruktor existiert, der mehrere Argumente erwartet, so kann man den leeren Konstruktor nicht mehr aufrufen!
Beispiel: ein Konstruktor einer Klasse "Bruch" sollte sich sinnvollerweise darum kümmern, dass bei Erstellung eines neuen Bruchs der Nenner nicht Null ist (da eine Null im Nenner eines Bruches mathematisch nicht erlaubt ist).

Vererbung: Durch Vererbung werden Eigenschaften und Methoden einer Klasse in eine andere Klasse übernommen. Vererbung ist am Schlüsselwort "extends" erkenbar: Eine Unterklasse erweitert (extends) die Eigenschaften und Methoden einer Oberklasse.
Beispiel: Oberklasse "Bildungseinrichtung" mit Unterklassen "Schule", "Uni", "FH", "VHS"
Oberklasse "Tier" mit Unterklassen "Reptil", "Säugetier"

Oberklasse und Unterklasse: Durch Vererbung werden Eigenschaften und Methoden einer Oberklasse in eine andere Klasse, einer sogenannten Unterklasse, übernommen. Siehe auch: Vererbung

Die Klasse "Object": Jede Klasse besitzt (automatisch) die Oberklasse Object. Weil die (in Java eingebaute) Klasse Object eine toString()-Methode bereitstellt, erbt jede (auch selbstgeschriebene) Klasse diese Methode.

Type-Casting (oder einfach: "casten"): Casten bedeutet, eine Typumwandlung vorzunehmen. Diese Umwandlung kann scheitern (dann gibts eine Exception).
Beispiel: Ein Objekt mit Namen "ortsobjekt" vom Typ Ort kann möglicherweise in ein Hauptstadt-Objekt gecastet werden mit der Programmzeile  Hauptstadt h = (Hauptstadt) ortsobjekt;
Beispiel: Betrachte die Programmzeile:
int ergebnis = (int) (10 * Math.random());

Die Methode random() aus der Klasse Math gibt eine Kommazahl (Typ: double) zwischen 0 und 1 zurück. Multipliziert ist es eine Kommazahl zwischen 0 und 10. Da eine Kommazahl aber keine int-Zahl ist, müssen wir eine Typumwandlung vornehmen: Das "(int)" in Klammern macht genau das.

Typ-Abfrage mit instanceof: Angenommen, wir haben eine Klasse Person und die Unterklassen Lehrer und Schueler. Es ist dann durchaus möglich, sowohl Lehrer als auch Schüler in einem einzigen Array des Typs Person zu speichern. Wenn wir nun überprüfen wollen, ob ein bestimmtes Array-Element tatsächlich ein Lehrer-Objekt ist, so schreiben wir:
if(arrayelement instanceof Lehrer) { .....


Methoden überschreiben: Soll die Methode einer Unterklasse eine andere Funktion ausüben als die der Oberklasse, so muss die Methode überschrieben werden.

Das Schlüsselwort super: Es kann bei Vererbungsbeziehungen vorkommen dass wir auf Eigenschaften oder Methoden der Oberklasse zugreifen müssen. In diesem Fall ist super eine Referenz auf den Namensraum der Oberklasse.
Beispiel: Angenommen, wir haben die Oberklasse Obi und die Unterklasse Unti. Außerdem kennen beide Klassen die Methode einfaerben(String farbe) - d.h. die Unterklasse Unti überschreibt die Methode der Oberklasse. Wenn in der Methode der Unterklasse nun dennoch die Methode der Oberklasse aufgerufen werden soll, so muss man super.einfaerben(...) verwenden.
Beispiel2: Auch im Konstruktor einer Unterklasse möchte man gelegentlich den Konstruktor der Oberklasse aufrufen. Dies muss man mit super(...) machen.

Stack: Ein Stack ist ein Stapel von Elementen (eine Datenstruktur) bei dem man immer nur das oberste Element einsehen bzw. entfernen kann oder oben auf dem Stapel etwas auflegen kann. D.h. ein Stack arbeitet nach dem FILO-Prinzip (first in-last out)

Queue: Eine Queue ist eine Schlange (Datenstruktur), bei der immer nur das erste Objekt einsehbar bzw. entfernbar ist und neue Objekte nur hinten angefügt werden können. D.h. eine Queue arbeitet nach dem (FIFO-Prinzip: (first in, first out) )

try-catch / Exceptions Exceptions (Ausnahmen) werden dann erzeugt, wenn in einem Java-Programm eine Ausnahme auftritt. Diese kann man entsprechend behandeln, ohne dass das Programm abbrechen muss. Gelegentlich wird man dazu gezwungen, eine Ausnahmebehandlung zu programmieren.
Beispiel: Wenn ein Dateizugriff nicht gelingt (try), so muss der Fehler(die Exception) behandelt werden (im catch-Abschnitt).

Thread / Runnable Ein Programm kann mehrere Threads, also Programmstränge, gleichzeitig ablaufen lassen. Damit kann man z.B. in unterschiedlichen Threads jeweils Endlosschleifen ablaufen lassen.
Runnable ist ein Interface, welches verlangt, dass man eine Methode namens "run()" implementiert. Diese Methode wird beim Starten des Threads aufgerufen.

Generics / <Typplatzhalter>
Mit Generics kann man eine Datenstruktur, welche z.B. für Strings funktioniert, auf einen allgemeinen Typ verallgemeinern, so dass man praktisch identischen Programmcode nicht für unterschiedliche Typen neu programmieren muss.





31.10.2018
Exaktes Lesen von Programmcode

Folgende Methode werden wir nun übertrieben exakt lesen und beschreiben. Dabei geht es nicht darum, den Sinn der Methode zu begreifen (es gibt hier gar keinen), sondern darum, die Struktur des Programms zu erfassen.


01 public static void testmethode() {
02     int k = 4;
03     boolean b;
04     b = false;

05     String flens;
06     flens = "Flensburg"; // Kurzform für new String(....);

07     Ort s = new Ort(flens,263,131);

08     Ort[] ortsliste = new Ort[3];

09     flens = "Was Anderes!";

10     ortsliste[0] = s;

11 }



public static void testmethode() {
In dieser Zeile wird eine Methode mit Namen "testmethode" definiert. Sie erwartet keine Argumente (Übergabeparameter). Sie gibt nichts zurück (an void erkennbar). Sie ist (wegen "public") von anderen Klassen aufrufbar. "static" bedeutet hier: die Methode kann aufgerufen werden, obwohl noch kein Objekt der Klasse existiert, in der diese Methode definiert ist.

int k = 4;
Die Variable mit Namen k vom Typ int erhält den Wert 4, d.h. sie wird deklariert (also der Typ wird festgelegt) und gleichzeitig definiert (d.h. der Wert wird festgelegt).

boolean b;
Die Variable mit Namen b vom Typ boolean wird deklariert (also der Typ wird festgelegt).

b = false;
Der Variablen b wird der Wert "false" zugewiesen.

String flens;
Die Variable mit Namen flens vom Typ String wird deklariert (also der Typ wird festgelegt).

flens = "Flensburg"; // Kurzform für new String(....);
Der Variablen flens wird der Wert "Flensburg" zugewiesen. Da der Datentyp String kein atomarer Datentyp ist, wird im Hintergrund tatsächlich ein new String(...) aufgerufen, d.h. es wird Speicherplatz für das Objekt geschaffen.

Ort s = new Ort(flens,263,131);
Eine Variable s vom Typ Ort wird deklariert und gleichzeitig definiert. Wegen "new" wird Speicherplatz für ein Objekt geschaffen. Wenn man "new" sieht, wird immer der Konstruktor der betreffenden Klasse aufgerufen. In diesem Fall existiert ein Konstruktor, der drei Argumente erwartet: ein String und zwei int-Werte.

Ort[ ortsliste = new Ort[3];]
Ein Array wird deklariert, welches Objekte vom Datentyp "Ort" aufnehmen kann. Es wird auch direkt Speicherplatz für ein Array mit drei Elementen geschaffen. Wichtig ist hier, dass nur der Speicherplatz für das Array geschaffen wird, nicht aber für die drei "Ort"-Objekte selbst.

flens = "Was Anderes!";
Die Variable flens bekommt einen neuen Wert zugewiesen. Speicherplatz des alten Wertes wird automatisch wieder freigegeben (Stichwort "garbage collection"), wenn er nicht mehr gebraucht wird. Hier jedoch wird der alte Wert "Flensburg" noch als Eigenschaft der Ort-Variable s beibehalten.

ortsliste[0 = s;]
Der Indexposition 0 des Arrays ortsliste wird eine Referenz auf das Ort-Objekt s zugewiesen. Auf den Ort mit dem Namen "Flensburg" kann nun entweder über die Variable s oder über das Array mit ortsliste[0] zugegriffen werden. Das Objekt selbst existiert aber nur einmal im Speicher.

}
Schließende Klammer der Methode "testmethode".





10.10.2018
Exaktes Lesen von Programmcode

Eine Diagrammvorlage:
20181010_Objektdiagramm.dia

Eine Testmethode, an der wir das exakte Lesen von Programmcode üben werden:

01 public static void testmethode() {
02     int k = 4;
03     boolean b;
04     b = false;

05     String flens;
06     flens = "Flensburg"; // Kurzform für new String(....);

07     Ort s = new Ort(flens,263,131);

08     Ort[] ortsliste = new Ort[3];

09     flens = "Was Anderes!";

10     ortsliste[0] = s;

11 }



17.09.2018
Kleiner Tipp für die Eingabe bei einfachen Java-Programmen


import javax.swing.JOptionPane;
public class InputDialogTest{
    public static void main(String[] bla){
        String eingabe = JOptionPane.showInputDialog(null,
            "Geben Sie Ihren Namen ein",
            "Eine Eingabeaufforderung",
            JOptionPane.PLAIN_MESSAGE);
        System.out.println("Die Eingabe war: "+eingabe);
    }
}


Link zum Kurz-Lehrplan:
20180830_SiLP_IF.png





12.07.2018
Eine kleine Informatik-Tour, Teil 2

A1) Finde heraus, wie du eine Multiplikationstabelle für das große 1x1 in Excel/Calc (ohne einzeln einzutippen!) erstellst und füge sie in dein Dokument ein.
Also in der Art:

    1   2   3   4   5  ...  20
1   1   2   3   4   5  ...
2   2   4   6   8  10  ...
3   3   6   9  12  15  ...
...
20          .. ... ...      400


A2) Erstelle eine Bild-Datei, die 500*500 Pixel groß ist. Dieses Bild soll ein Schachbrettmuster mit 10*10 Feldern enthalten (je schwarz weiß abwechselnd) - d.h. jedes einzelne Feld ist 50*50 Pixel groß.

A3) Erzeuge einen sogenannten "Blindtext", also eine Plazhaltertext (oft wird "lorem ipsum" verwendet) - der mindestens 10000 Zeichen lang sein soll! Dabei soll sich kein Textteil wiederholen! (d.h. copy paste gilt nicht!)


28.06.2018
Liebe Informatiker

Leider ist zum "Schuljahressaisonendestress" und den Nachprüfungen auch noch eine Erkältung dazugekommen. D.h.: Eure Noten sind noch nicht fertig. Aber noch vor der Zeugniskonferenz werde ich Euch kontaktieren, um Euch Eure Noten mitzuteilen.

Für die heutige Doppelstunde ist macht das Halten von Referaten wenig Sinn, wenn ich sie nicht begutachten kann.
Als kleinen Ausflug sollt ihr heute daher eine kleine Webseite erstellen, indem ihr das Tutorial unter https://wiki.selfhtml.org/wiki/HTML/Tutorials/Einstieg durcharbeitet.
Selbstverständlich könnt ihr eine Webseite über euer Lieblingsthema bauen.
Mir ist nur wichtig, dass ihr einen Einblick in die Technik von HTML bekommt. Speichert die Ergebnisse der heutigen Doppelstunde mit passendem Namen im Share-Ordner ab.


21.06.2018
Vormittagskurs:
Ausarbeitungen, Präsentationen etc. die noch nicht bei mir eingegangen sind, können noch bis Freitag, den 22.6 um 20 Uhr bei mir per Mail eingereicht werden.
Email: plusplanet@plusplanet.de



19.06.2018
Nachmittagskurs:
Hinweise zu den Referaten:
Die Ausarbeitung und die 3 Fragen sollen bis Sonntag, der 24. Juni, 16:00 Uhr an Herrn Töns geschickt werden. Email: plusplanet@plusplanet.de




19.06.2018
Vormittagskurs:
Hinweise zu den Referaten:

Bitte am Donnerstag vorlegen und halten können.
Alle Dokumente (elektronisch oder in Papierform) können abgegeben werden - auch die Folien.



19.06.2018
Demonstration des Tests: http://www.plusplanet.de/quizmeister_demo

16.06.2018
Überprüfung
Kleiner Hinweis für Dienstag: Dort schreiben wir einen kleinen Informatik-Test über die Themen der Klausur. Ihr habt ja Klausur und Musterlösung bekommen.

Referate
Leider muss ich zugeben, dass die versprochenen Bemerkungen zu Euren Referaten nicht bereits am Donnerstag online waren. Aber hier sind sie jetzt endlich:

Thema "Binäre Zahlen": OK, (ggf. auf die Zweierkomplement-Darstellung negativer Zahlen eingehen)

Thema "EMP-Bombe": Vielleicht die Wirkung im Hinblick auf Computer konkretisieren (was genau geht kaputt?) und ggf. Verteidigungsmöglichkeiten erörtern.

Thema "Handysucht": Bitte Definition und Abgrenzung zu normalem Verhalten erörtern

Thema "Computersucht Spielesucht": Reihenfolge ggf. umändern (erst Begriffsbestimmung und Erkennungsmerkmale, dann den Rest)

Thema "Frauen in der Informatik": alles OK

Thema "Kryptografie": alles OK

Thema "Computerviren":  Den Gliederungspunkt "Was sind Computerviren" genauer ausführen zu "Wie funktionieren Viren". Gliederungspunkt "Wie bekommt man diese" umformulieren in "Übertragungswege". Beim Gliederungspunkt "Wie schützt man sich" auch Probleme von Virenscannern ansprechen (die ja auch selbst eine Angriffsfläche für Viren bieten, weil sie so tief ins Betriebssystem eingreifen)!

Thema "Geschichte der Informatik": Vorsicht vor reinem Abhaken von Daten. Schöner wirds, wenn man auch technische Entwicklungen und Entdeckungen mit einbringen kann (z.B. "Warum konnte man nicht schon 1920 einen Computer bauen?")

Thema "Urheberrecht": Vielleicht auch konkrete Fälle reinbringen. Sonst OK

Thema "Hacken": alles OK

Thema "Künstliche Intelligenz": Alles OK

Thema "Architektur von Mikroprozessoren": Alles OK

Thema "Cyberwar": alles Ok

Thema "Betriebssysteme": "Ist ein Betriebssystem wirklich wichtig?" sollte sich eigentlich schon aus den Aufgaben eines Betriebssystems erschließen. Vielleicht kann man diesen Gliederungspunkt umformulieren

Thema "MP3": Mir ist nicht ganz klar, was du mit "Spezifikationen" meinst, wenn du schon das Verfahren erklärst. Es wäre schön, wenn Du beim Verfahren mehr erklärst, als dass die Musik "irgendwie komprimiert" wird.

Thema "Datenschutz": (Bereits geklärt)


13.06.2018

Eine kleine Informatik-Tour:
Erstelle ein OpenOffice Writer Dokument mit dem Namen 20180614_Name_iftour
Am Ende deiner Tour soll das Dokument in pdf konvertiert werden und auf unserem share-Ordner abgegeben werden.

A1) Mache eine Screenshot deines Browserfensters und erstelle eine Beschreibung von mindestens 5 Fensterelementen. Beispiel (allerdings ein anderes Fenster) Fenster.png).

A2) Erstelle ein Diagramm (z.B. mit dem Programm Dia) mit den Beziehungen der Hauptpersonen deines Lieblingsfilms.
(Beispiel eines (thematisch anderen) Diagramms: er_diagramm.png )

A3) Mache dich mit den Tastenkürzel: Ctrl-X, Ctrl-C und Ctrl-V vertraut!
Füge nach jedem "Thema" in deinem Dokument einen Seitenumbruch ein!

A4) Lade ein z.B. ein StarWars-Bild aus dem Netz herunter und ersetze die Köpfe durch Trump und Merkel und zeichne auch eine Sprechblase hinein. Benutze dazu z.B. ein Bildbearbeitungsprogramm (z.B. IrfanView oder Paint).

A5) Finde heraus, wieviel mal das Wort "Gott" in der deutschen Bibel vorkommt. (Beschreibe, wie du vorgehst!)

A6) Finde heraus, wie du eine Multiplikationstabelle für das große 1x1 in Excel/Calc (ohne einzeln einzutippen!) erstellst und füge sie in dein Dokument ein.
Also in der Art:

    1   2   3   4   5  ...  20
1   1   2   3   4   5  ...
2   2   4   6   8  10  ...
3   3   6   9  12  15  ...
...
20          .. ... ...      400


A7) Meine Festplatte zuhause kann 2 Terabyte Daten fassen. Auf Millimeterpapier sind die kleinen Kästchen genau 1 Quadratmillimeter groß. Diese Kästchen kann man als einzelne Bits auffassen (die man schwarz oder weiß anmalen kann). Wie groß müsste eine quadratische Fläche aus Millimeterpapier sein, um 2 TB Daten zu speichern? (Rechenweg!)

A8) Erkläre den Unterschied zwischen HTML und HTTP
A9) Erkläre den Anwendungsbereich und Sinn folgender Dateiformate: doc, pdf, jpg, gif, png, exe, zip, txt, csv, xls, ppt
A10) Erkläre die Idee hinter "asymmetrischer Verschlüsselung"

A11) Wenn man unter Windows eine Datei mit dem rechten Mausbutton in einen neuen Ordner zieht, so öffnet sich ein Menü: "Hierher kopieren, hierher verschieben, Verknüpfung erstellen". Erkläre Unterschiede. Welche der Optionen wird gewählt, wenn man eine Datei nur mit dem linken Mauszeiger in einen neuen Ordner zieht?




13.06.2018
Tipps fürs Referat: 20180613_Referat_tipps.pdf

Beispielreferat:
20160518_Toens_Compiler.pdf
20160518_Toens_Compiler_Paper.pdf


04.06.2018

Unterrichtsvorhaben: Geschichte der Datenverarbeitung und Grundlagen des Datenschutzes

Idee: Jeder von euch soll ein Mini-Referat vorbereiten und halten, welches ziemlich genau 7 Minuten dauert. Dazu soll es digital eine kurze Ausarbeitung geben (ca. eine halbe bis ganze DinA4-Seite). Am Ende dieser Ausarbeitung sollen 3 Fragen+Antworten stehen, die ein Informatiker kennen sollte (die also zum "Informatik-Allgemeinwissen" gehören sollten).
Vorsicht: "Kurz" bedeutet nicht "wenig Arbeit"! Eher ist das Gegenteil der Fall.

Die Aufgabe für heute lautet:
1. Finde ein Thema für dein Mini-Referat (Suche dir ein eigenes Thema oder bediene dich bei der Themenliste unten). Hole dir von Herrn Töns ein OK für das Thema.
2. Schreibe ein kurzes "Inhaltsverzeichnis" in einem Texteditor und lade es auf unseren Share-Ordner hoch. Vergib dabei einen Dateinamen in der Art "20160511_Melanie_Binärzahlen.txt" (also in der Struktur DATUM_NAME_THEMA.txt)
3. Hausaufgabe: Suche Material für dein Thema. Internetrecherche reicht für unsere Zwecke aus. Vorsicht: einfaches Absaugen eines Referates von "www.referate.de" (oder wie solche Seiten heißen) wird garantiert in die Hose gehen (Ein Vortragender muss schon mehrere Quellen anzapfen, um ein Thema wirklich zu verstehen: nach dem Referat können nämlich noch Fragen gestellt werden - die der Vortragende auch beantworten können sollte, denn er steht schließlich als Experte vorn.)

Genauere Anweisungen, wie das Referat auszusehen hat gibts später.

Mögliche Themen sind:
Geschichte der Rechenmaschinen (vom Rechenschieber bis zum Smartphone)
Programmiersprachen (allgemein oder auch eine spezielle im Vergleich zu Java)
Binäre Zahlen
Kryptographie=Verschlüsselungstechnologie (vom Cäsar-Chiffre bis zu asymmetrischen Verfahren)
Betriebssysteme (Windows, Linux, MacOS, Android und andere - ggf. Vergleich)
Compiler (also Programme, die ein vom Menschen geschriebenes Programm in Maschinensprache übersetzen)
Internet, TCP/IP (Was ist die Technik hinter dem Internet)
WWW und HTTP (Vorsicht: WWW ist nicht gleich Internet)
Email
Datenbanken
Komprimierung mit zip
Bildformate: Vektorformate vs. Rasterformate
Zahlendarstellung: "Kommazahlen" nur mit Nullen und Einsen
MP3
Videoformate
Computerviren, Gefahren, Selbstschutz, Sinn und Unsinn von Virenscannern
HTML und CSS
Speichermedien (nichtflüchtig): Diskette, CDRom, Festplatten: HDD oder SSD, USB-Sticks
Architektur von Mikroprozessoren
Algorithmen: Sortieren, Suchen, Kürzester Weg über 20 Städte, Komplexität von Algorithmen
"Cyberwar": (Vorsicht: gerade hier keine unkritische Übernahme von Kampfbegriffen)
Hacken (Vorsicht: gerade hier keine unkritische Übernahme von Kampfbegriffen)
Skriptsprachen: z.B. PHP oder PERL oder LUA oder Python oder JavaScript etc.
Schnittstellen am Computer: USB, SATA, IDE .... Eigenschaften und Zusammenspiel mit dem Computer
Steckkarten für den PC: Grafikkarten, Soundkarten etc. Warum braucht man die? Vorteile und Nachteile?
Frauen in der Informatik
Datenschutz
Urheberrecht
Computersucht / Handysucht / Spielesucht: Schaden uns die digitalen Medien?





17.03.2018
Sortieralgorithmus "auf Papier" ausführen:

Denke Dir 4 Zahlen (unsortiert, andere als der Sitznachbar!) aus und sortiere sie mit Hilfe von folgendem Programm:


00        
01  for (int i = 0; i < (zahlen.length - 1); i++) {
02      int indexA = 0;
03      int indexB = 1;
04      for(int j = 0; j < (zahlen.length - 1) ; j++) {
05          if(zahlen[indexA]>zahlen[indexB]) { tausche (zahlen,indexA,indexB);}
06          indexA = indexA + 1;
07          indexB = indexB + 1;
08      }
09  }


Die Tabelle soll folgendermaßen beginnen:

Schritt  Zeile  zahlen[0]  zahlen[1]  zahlen[2]  zahlen[3]  i  j  indexA  indexB
0        0      (ausgedachte zahlen hier eintragen.....)    -  -   -      -
1        1      







20.03.2018
Klausurthemen:
1. Programmausführung auf Papier mit einer Tabelle (siehe Beispiel weiter unten auf dieser Seite).
2. Exaktes Lesen von Programmcode (siehe Beispiel weiter unten auf dieser Seite).
3. Idee "Vererbung" verstehen. Einsatz des Schlüsselwortes "extends". Bei Vererbung erbt die Unterklasse alle öffentlichen Eigenschaften und Methoden der Oberklasse. Beispiel: unser "GrafikObjekt" als Oberklasse und unsere "Mauer" als Unterklasse. Mauer erbt dabei die x- und y-Koordinate von GrafikObjekt. Eine Mauer hat aber ggf. noch andere spezielle Eigenschaften, die ein Smiley nicht hat.
4. Erstellung und Durchlauf von Arrays mit einer for-Schleife. Auch ein Array von Objekten muss erstellt und bearbeitet werden können.


22.02.2018
Hausaufgabe für den G1-Kurs (Aufgabe vom Donnerstag):

Erstelle eine Tabelle für folgendes Programm:

    01 public static int pot(int g, int h) {
    02     int erg = 1;
    03     for(int i = 1; i <= h; i++) {
    04         erg = erg * g;
    05     }
    06     return erg;
    07 }


Die Tabelle soll folgendermaßen beginnen:

Schritt  Zeile  g    h    erg     i
1        1      2    4     -      -
2        2      2    4     1      -
3        3      2    4     1      1
4        4      2    4     2      1
5        5    (Ende Schleifenblock, zurück zu Zeile 3)
6        3      ....... hier sollt ihr fortfahren!







22.02.2018
EVA-Unterricht am 22.02.2018 im Kurs G1.

Zunächst arbeitet ihr an eurem Spiel weiter. Ich werde zwischendurch reinschauen und euch bei Fragen kurz beraten. Nach wie vor gilt, dass die "Schnipsel" auf dem Share-Ordner der Reihe nach bei euch eingebaut werden sollten.

15.02.2018
Exaktes Lesen von Programmcode

Bild "Informatik_Q2_Abi2020:20180214_programmcode_lesen.jpg"

Zeile 01 - 04: Da wir andere Klassen der Java-Umgebung nutzen, müssen wir bekanntmachen, welche Teile das sind.
Zeile 06: Wir deklarieren die Klasse Mauer. "public" bedeutet hier, dass die Klasse für andere Programmierer "sichtbar" ist, also auch benutzbar ist. "extends GrafikObjekt" bedeutet, dass unsere Klasse Mauer eine Unterklasse von der Oberklasse GrafikObjekt ist. Damit erbt die Klasse Mauer alle öffentlichen Eigenschaften und Methoden der Oberklasse.
Zeile 07 und 08: Die Klasse Mauer hat zwei Eigenschaften: Die Eigenschaft "name" (vom Typ String, also eine Zeichenkette) und die Eigenschaft img (vom Typ BufferedImage - wir wissen vielleicht zwar nicht genau, was für ein Typ das ist, aber dem Namen nach zu urteilen, lassen sich damit offenbar Bilddaten speichern). Die Eigenschaft img wird zusätzlich auf null initialisiert, d.h. bei img sind zunächst keine gültigen Bilddaten hiterlegt.
Zeile 10: Der Konstruktor der Klasse Mauer wird eingeleitet (weil diese "besondere Methode" genauso heißt, wie die Klasse selbst). Dieser ist auch public, kann also von fremden Programmierern benutzt werden.
Zeile 11 und 12:  Die Variablen x und y werden auf den Zahlenwert 0 (nicht "null" im Sinne einer Referenz auf ein Objekt!) gesetzt. Merkwürdig scheint auf den ersten Blick, dass x und y nirgendwo deklariert (also eine Typfestlegung) wurden. Daher muss es so sein, dass x und y Eigenschaften der Oberklasse GrafikObjekt sind, die die Unterklasse ja automatisch erbt.
Zeile 13, 15 und 16: Eine try-catch-Konstruktion kennen wir eigentlich noch nicht. Das Wort "Exception" legt aber nahe, dass es hier um eine Ausnahmebehandlung geht. Mehr dazu bzgl. Zeile 14:
Zeile 14: Die Eigenschaft img (siehe Zeile 08) wird hier mit einem Wert belegt. Offenbar wird hier das Bild "mauer.png" eingelesen. Genauer passiert hier folgendes: mit "new File("mauer.png")" wird ein neues Objekt des Typs File angelegt. Also ein Objekt, welches eine Datei auf der Festplatte repräsentiert. Dieses Dateiobjekt wird über die Methode "read" der Klasse ImageIO als Bilddatei eingelesen. (Bei dieser ganzen Angelegenheit können Fehler auftreten: Was ist, wenn diese Datei gar nicht existiert? Daher muss man sich um solche Ausnahmen, also Exceptions, Gedanken manchen (siehe try-catch). Das passiert hier nicht wirklich, da wir nur ein kleines Spiel schreiben. In professionellen Programmen passiert in den catch-Blöcken einiges.)
Zeile 19: Die Methode updateTimer wir hier definiert. Sie ist "public" (kann also von fremden Programmierern genutzt werden) und hat keinen Rückgabewert (void).
Zeile 20: Das super bezieht sich auf die Oberklasse. Hier wird also die Methode updateTimer der Oberklasse aufgerufen. Weil in unserer Methode nichts weiteres passiert, hätte man die Zeilen 19 bis 21 eigentlich völlig weglassen können, da ja ohnehin beim Aufruf von updateTimer auf einem Mauer-Objekt die Methode der Oberklasse aufgerufen worden wäre (sie wird ja vererbt!). Dass die Zeilen 19 bis 21 dennoch hier stehen hat den Grund, dass man im Falle von Animationen diese Methode ausbauen muss und man hier schonmal das Gerüst stehen hat.
Zeile 23: Die Methode paintOn wird hier definiert. Sie ist public (kann also von fremden Programmierern genutzt werden) und hat einen Rückgabewert vom Typ Graphics. Ebenso erwartet sie ein Objekt vom Typ Graphics. Dieses erwartete Objekt hat in der Methode den Namen g.
Zeile 24: Auf das Graphics-Objekt g wird die Methode drawImage aufgerufen (Hinweis: Graphics ist eine Klasse, die in Java schon existiert. Man kann sich im Internet in der sogenannten Java-API darüber informieren, welche Methoden die Klasse Graphics bereitstellt). Offenbar wird hier das Mauer-bild (in img gespeichert) an die Stelle mit den Koordinaten x und y auf das Graphics-Objekt gezeichnet. Das Graphics-Objekt repräsentiert den Zeichenbereich im Benutzeroberflächenfenster.
Zeile 25: Das Objekt g wird als Rückgabewert festgelegt (siehe Zeile 23: der Rückgabewert muss vom Typ Graphics sein).
Zeile 26: Ende der Methode paintOn
Zeile 27: Ende der Klasse Mauer


09.01.2018

Spielereien mit Buttons:


import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class Startklasse implements ActionListener{
    JButton butR, butY;
    JTextField eingabezeile1;
    JLabel lab1;
    JFrame frame;

    public void zeigeFenster() {
        frame = new JFrame();
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.setTitle("Null Layout");
        frame.setLayout(null);

        butR = new JButton("Nach Rechts");
        butR.setBounds(10,10,200,30);
        butR.addActionListener(this);
        frame.add( butR );

        butY = new JButton("Mach's Yellow!");
        butY.setBounds(10,50,200,30);
        butY.addActionListener(this);
        frame.add( butY );

        eingabezeile1 = new JTextField("Hier kann man schreiben...");
        eingabezeile1.setBounds(220,10,160,30);
        frame.add( eingabezeile1 );

        lab1 = new JLabel("Informatik macht Spaß.");
        lab1.setOpaque(true);
        lab1.setBounds(10,100,190,30);
        frame.add(lab1);
        
        frame.pack();
        frame.setSize(430,180);
        frame.setResizable(false);
        frame.setVisible( true );
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == butR) {
            Rectangle rect;
            rect = butR.getBounds();
            rect.x = rect.x + 5; // 5 Pixel nach rechts
            butR.setBounds(rect);
        }
        if(e.getSource() == butY) {
            butY.setBackground(Color.yellow);
            lab1.setBackground(Color.yellow);
        }
        
    }

    public static void main() {
        Startklasse sk = new Startklasse();
        sk.zeigeFenster();
    }
}




10.11.2017
Klausurthemen
Im Unterricht wurden folgende Blätter ausgeteilt:
Ausgeteilte Blätter:
1) Hilfreiche Befehle in Java-Kara Programmen
2) Struktur eines einfachen Java-Kara Programms
3) Variablen in Java
4) Methoden in Java-Kara-Programmen (Teil 1 bis 3)
5) Klassen und Objekte

Zu den oben genannten 5 ausgeteilten Blättern (bzw. Blättersammlungen) ist folgendes zu sagen:
Zu 1:
Das Blatt werde ich als Hilfsmaterial der Klausur beilegen. Es ist nicht notwendig, Befehle auswendig zu lernen. Man sollte aber wissen, welche Befehle es in Java-Kara gibt!

Zu 2:
Nur Ideen verstehen. Ihr müsst aber wissen, dass man mit geschweiften Klammern Programmblöcke einschließt. Eine mögliche Aufgabe wäre folgende: Das Programm dieses Blattes wird vorgegeben, wobei jede geschweifte Klammer aus dem Programm entfernt wurde. Die Klammern müssen nun von Euch wieder an die richtigen Stellen gesetzt werden.

zu 3:
Datentypen int, boolean und double kennen (d.h. beschreiben können, welche Art von Daten man darin speichert). Wissen dass man mit einem einzigen = eine Wertzuweisung beschreibt. Die Operatoren < oder > oder <= oder >= oder != oder == sind für Vergleiche reserviert. Damit muss man z.B. if-Bedingungen formulieren können.

zu 4:
Das Blatt "Methoden in Java-Programmen" bildet zusammen mit den "Kontrollstrukturen" (siehe Text "Grundlegende Kontrollstrukturen in Java" unten) den Kern der Klausur. Ihr müsst wissen, wie man selbst while-Schleifen und if-Abfragen realisiert oder eigene Methoden schreibt.

Beispielaufgabe 1:
Schreibe ein Programm für Kara, so dass Kara mitzählt, wie weit sie geradeaus gehen kann, bis sie vor einem Baum steht. Die Anzahl der Schritte soll mit tools.showMessage() ausgegeben werden. (Es müsste dann nur die Methode myProgram() geschrieben werden).
Lösungsbeispiel:


public void myProgram() {
    int zaehl = 0;
    while (!kara.treeFront() ) {
        zaehl = zaehl + 1;
        kara.move();
    }
    tools.showMessage("Schritte bis Baum: "+zaehl)
}


Beispielaufgabe 2:
Folgendes Programm sorgt dafür, dass Kara prüft, ob links neben ihr ein Kleeblatt liegt und dies im Falle des Falles aufnimmt:


public void myProgram() {
    if ( blattLinks() ) {
        kara.turnLeft();
        kara.move();
        kara.removeLeaf();
    }
}


Das Programm benutzt aber die Methode blattLinks(), die nicht Bestandteil der Java-Kara-Umgebung ist und selbst programmiert werden muss. Programmiere die Methode blattLinks();

Lösungsvorschlag:

public boolean blattLinks() {
    boolean antwort = false;
    kara.turnLeft();
    kara.move();
    if( kara.onLeaf() ) {
        antwort = true;
    }
    kara.turnRight();
    kara.turnRight();
    kara.move();
    kara.turnLeft();
    return antwort;
}


Zu 5:
Beispiele wie auf dem Arbeitsblatt bringen können (Begriffe Klasse, Objekt, Eigenschaft und Methode unterscheiden können!)

Zusätzlich zu den ausgeteilten Blättern ist noch dieser Screenshot zur if-Anweisung und zur while-Anweisung wichtig:
Bild "Informatik_Q2_Abi2020:20171110_Kontrollstrukturen.png"




12.10.2017
Programm-Vorlage für die heutige Stunde
20171012_NullLayout_mit_actionPerformed.zip


12.09.2017
Java-Kara Download:
download


31.08.2016

Light-Bot

Das LightBot-Spiel: www.plusplanet.de/swf_lightbotMUELL/lightbot.html

Selbstprogrammierter Light-Bot-Simulator mit "Level-Designer":
http://www.plusplanet.de/lightbotsimulator/index.php

Demo-Level: https://pastebin.com/3QXMLrnG

Speichere folgenden Text als Textdatei (mit Namen test.pbm) auf den Desktop:

P4 144 16
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
zzzzzzzzOOOOOOOO
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz
OOOOOOOOzzzzzzzz



Daten im Zahlenformat anzeigen

Dafür gibt es z.B. einen Dienst im Internet: https://hexed.it/

Daten hörbar machen:

Download von Audacity, einem Audioeditor:
http://downloads.sourceforge.net/portableapps/AudacityPortable_2.1.1.paf.exe?download
Beliebige Daten können damit "hörbar" gemacht werden, indem man folgendes tut:
Datei->Importieren...->Raw-Audio
Dann erscheint ein Fenster mit Einstellungen (am Besten die Voreinstellungen unverändert lassen).

Daten sichtbar machen

Mit dem Programm IrfanView kann man Daten als Grafik interpretieren lassen, wenn man folgende Schritte befolgt:
Zunächst muss fügt man am Anfang der Textdatei folgende Zeile ein:
P4 200 150
(Dies ist notwendig, damit IrfanView die Datei als Grafikdatei im PBM-Format erkennt. Dabei bedeuten die Zahlen 200 und 150, dass das Bild 200 Pixel breit und 150 Pixel hoch ist)
Als nächstes muss man die Dateinamenserweiterung von .txt in .pbm umbenennen. Schließlich kann man diese Datei dann in IrfanView hineinladen.