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


30.11.2021
• Minimierung von Automaten
• Weiterlesen im Skript ab S35: Grenzen endlicher Automaten
• Projektvorschlag: Uhrzeitaddierer


29.11.2021
Programm für heute:
• Zusammenhang Reguläre Ausdrücke und Reguläre Sprachen/ Grammatiken


23.11.2021


Mini-Tutorial für NPP-RegEx
##############################

Beispiele
##########
Beispiel Autokennzeichen
------------------------
Regulärer Ausdruck für Notepad++: [A-Z][A-Z][A-Z]?-[A-Z][A-Z]\s[0-9]+

Interpretation:
[A-Z] Exakt ein Zeichen aus der Gruppe A-Z
[A-Z]? Das Zeichen aus der Gruppe A-Z kommt ein- oder keinmal vor.
- Bindestrich (kein Spezialzeichen)
\s Leerzeichen (kann auch Tab oder andere Whitespace sein)
[0-9]+ Das Zeichen aus der Gruppe 0-9 kommt ein- oder mehrmals vor

Das Kennzeichen ST-FG 345 wird erkannt
Das Kennzeichen STA-AT 35 wird erkannt
Das Kennzeichen STA-A 35 wird nicht erkannt
Das Kennzeichen STA-ATA 35 wird nicht erkannt
Das Kennzeichen STA-at 35 wird je nach Einstellung (Groß/Klein beachten) erkannt
Das Kennzeichen STAT-AT 35 wird unvollständig erkannt
Das Kennzeichen D-AT 35 wird nicht erkannt
Das Kennzeichen STA-AT 352342342 wird erkannt

Der Beispiel RegEx ist also nicht perfekt für deutsche Kennzeichen.
Verbesserungsvorschläge:
1• Der "Landkreis" zu Beginn darf auch aus einem Buchstaben bestehen
2• Die Buchstabenfolge in der Mitte hat ein oder 2 Buchstaben
3• Die Zahl am Ende ist ein- bis vierstellig
4• Optional kommt am Ende ein H oder E
5• Spaces zu Beginn und am Ende
6• Weitere Sonderfälle https://de.wikipedia.org/wiki/Kfz-Kennzeichen_(Deutschland)

1•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]\s[0-9]+
2•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9]+
3•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?
4•  [A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?[EH]?
5•  \s[A-Z][A-Z]?[A-Z]?-[A-Z][A-Z]?\s[0-9][0-9]?[0-9]?[0-9]?[EH]?\s

Das Kennzeichen D-AT 35H wird erkannt
Das Kennzeichen D-AT 35E wird erkannt
Das Kennzeichen D-AT 35EH wird nicht erkannt
Das Kennzeichen DDDDDD-AT 35E wird nicht erkannt


Beispiel E-Mail Adresse
------------------------
Regulärer Ausdruck für Notepad++:
[\-\.!\w][-\.!\w]*@([\u\l\d][\u\l\d\-]*[\u\l\d]\.)+[\u\l]{2,4}
(Grammatik für E-Mail-Adressen wurde aus dem Skript "formale Sprachen genommen")

frank.toens@schule.duesseldorf.de
aa@b.com
aa@bb.com
aa@bb.cc.dd.de
aa@ba.cb.dc.d
a@bb.cc.dd.de

Beispiel Tagesdatum
------------------------
Regulärer Ausdruck für Notepad++: \d\d\.\d\d\.\d\d\d\d

Das Datum 01.02.2002 wird erkannt
Das Datum 41.02.0009 wird erkannt
Das Datum 1.02.0009 wird nicht erkannt

Verbesserung:
\s([0-2]?[\d]|3[01]?)\.[0-1]?\d\.\d\d\d\d


Referenz
##########
Metazeichen: [ ] ( ) { } | ? + - * $ \ .

Benutzung von eckigen Klammern (Zeichenklassen) bzw. speziellen Zeichenklassen
• [A-Z] bezeichnet EINEN Buchstaben aus der Menge A-Z
• [A-Z] bezeichnet KEINEN Buchstaben aus der Menge A-Z. Achtung: Dann hat man auch Sonderzeichen wie Newline drin!
• \l einen Kleinbuchstaben
• \u einen Großbuchstaben
• \s ein Whitespace-Zeichen
• \d ein Digit (Ziffer)
• \w ein "Wort"-Zeichen, d.h. [_\d\l\u]
• \x20 findet das Zeichen mit Ascii-Code 20(Hex), also normales Space
• . irgendein Zeichen. Beispiel: \x20\d.\d\x20 findet alle Vorkommen der Art 3a4 oder 3-4

Runde Klammern sind "Capture Groups", denen man auch Namen für spätere Nutzung geben kann. Einfache Nutzung aber z.B. für "oder"-Konstruktionen
• Die Regex S(ipp|chlepp|äck)e findet Sippe Schleppe und Säcke.

Multiplikatoren, die sich auf ein vorangehendes Symbol beziehen
• * kein-, ein- oder mehrmaliges Auftreten
• + ein- oder mehrmaliges Auftreten
• ? kein- oder einmaliges Auftreten
• {5} fünfmaliges Auftreten
• {5,} mindestens fünfmaliges Auftreten
• {5,7} fünf- bis siebenmaliges Auftreten

Positionierung innerhalb einer Zeile:
• Zeilenstart. D.h. die RegEx \x20+ findet alle Zeilen, die mit einem oder mehreren Leerzeichen anfangen
• $ Zeilenende. D.h. die RegEx \x20+$ findet alle Zeilen, die mit einem oder mehreren Leerzeichen anfangen

Verbatim-Mode
• \Q Start und \E Ende des "verbatim mode". Beispiel \Q\*+\Ea+ matches \*+aaaa.


Verbindung mit der theoretischen Informatik
############################################
Die Grammatik (S und B Nichtterminale)
S -> aS | aB
B -> b
erzeugt die folgende Sprache:
ab
aab
aaab usw.

Ein dazu passender Regulärer Ausdruck wäre:
a*b

Ein regulärer Ausdruck ist eine Art Kurzform einer Grammatik. Anwendung ist oft die Suche nach Mustern (also nach Wörtern der regulären Sprache) in langen Texten. Da reguläre Sprachen durch einen DEA (deterministischer endlicher Automat) erkannt werden können, und die Laufzeitkomplexität eines DEA in der Komplexitätsklasse O(n) liegt, ist eine solche Suche effizient durchführbar (im Gegensatz zum Parsing-Schritt bei echten Programmiersprachen).

Beispiel: Suche nach dem Wort "Max" im Text "Das Maximum" mit naiver Suche benötigt ___ Schritte.

In der Praxis gibt es bei regulären Ausdrücken noch "Zusatzfunktionen", die nicht "echt regulär" (im Sinne der Theoretischen Informatik) sind.

Quellen:
##############################
https://npp-user-manual.org/docs/searching/#regular-expressions
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck




15.11.2021
Hausaufgabe: S23 Nr 4
S24 Nr5 ab
S24 Nr7
S24 Nr9 (DEA/NEA)

Link zur Erstellung von Automaten:
https://flaci.com/

Perspektivisch: Einfache Ausdrücke mit einer Variablen auswerten

08.11.2021
Fahrplan für heute:
• HA-check + Präsi eines Lösungsvorschlags
• Thematisierung "reguläre Grammatiken", vgl. Skript S16 Nr2
• Noten des ersten Quartals
• S16 Nr 2 und Nr3
• S18 Nr 7: Erkennung von Sprachen!

Automat für Rechenausdrücke
http://www.plusplanet.de/miscrawhtml/20211108_automat_rechenausdruecke.html

02.11.2021
Syntaxdiagramme
Wenn man nach "sqlite query language select" bilder-googelt, erhält man u.a. folgendes Ergebnis:



25.10.2021
Klärung der Begriffe aus der Vorferienwoche wiederholen:
Assembler
Maschinensprache
Aufrufstapel
- Parameter
- Rücksprungadresse
- Lokale Variablen
Compiler
- Scanner + Parser

Nur Grafik im englischen Artikel zu Compiler
https://en.wikipedia.org/wiki/Compiler

Dann: Arbeit in folgendem Skript (erster Link auf der Seite):
http://www.gierhardt.de/informatik/theorie/index.html


05.10.2021
Klärung folgender Begriffe:
Assembler
Maschinensprache
Aufrufstapel
- Parameter
- Rücksprungadresse
- Lokale Variablen
Compiler
- Scanner + Parser

04.10.2021

1. Überlege dir (auf Papier), wie man eine Funktion schreiben könnte, die das Maximum zweier Zahlen herausfindet!
2. Notiere die beiden ___TODO___ Microcodes unten (auf Papier). Verstehe dazu die anderen Microcodes. Den Abschnitt zum Stack lassen wir erstmal beiseite.
3. Lies die ersten beiden Links ("Assembler" und "Aufrufstapel") am Ende dieses Abschnitts.


Microcodce-Konstruktionen
#########################

Konstruktion von LDV (Load immediate Value)
--------------------------------------------
Funktion: Direkte Angabe eines Operanden, ohne erst aus einer speziellen extra-Speicherstelle (mit TAKE) lesen zu müssen.
Klappt nur, indem man zwei Speicherstellen benutzt.
Microcode: pc++ / pc->ab/ram->db/db->acc/pc++/mc:=0
Beispiel:
10 LDD 000  // Operand hier egal
11 00  077  // zu ladender Wert
12 ......   // hier gehts weiter
Also steht der Befehl LDD z.B. in Speicherstelle 10
In Speicherstelle 11 steht dann der Operand.
Der nächste richtige Befehl steht in Speicherstelle 12.

Konstruktion von JPI (Jump indirect)
--------------------------------------------
Funktion: Sprung an die Adresse, die sich hinter der angegebenen Adresse verbirgt.
Beispiel:
JMP 800  // springt in Speicherstelle 800
JPI 800  // springt an die Adresse, die in Speicherstelle 800 steht.
Microcode: __________TODO__________

Konstruktion von LDI (Load indirect)
--------------------------------------------
Funktion: Lade einen Wert indirekt über eine andere Adresse.
Microcode: ins->ab/ram->db/db->ins/ins->ab/ram->db/db->acc/pc++/mc:=0
Beispiel:
10 LDI 012 // lädt den Wert 77 in den Akkumulator
11 00  077
12 00  011

Konstruktion von STI (Store indirect)
--------------------------------------------
Funktion: Speichere den Akku indirekt über eine andere Adresse.
Microcode: __________TODO__________
Beispiel:
10 STI 012 // Speichert den Akku in Speicherstelle 11
11 00  0??
12 00  011

Konstruktion eines Stacks mit den Befehlen
--------------------------------------------
PUSH 900  (Push Accu on Stack)
POP  900  (POP  Stack value to Accu)
Siehe auch: https://de.wikipedia.org/wiki/Aufrufstapel
Idee: Alle Daten ab Adresse 901 sind stackdaten. Stackpointer ist in Adresse 900 enthalten. Zu Beginn muss dieser also auf 901 stehen.
Der Stackpointer zeigt auf die nächste freie Adresse.
Konstruktion von PUSH
Annahme:
010 PUSH 900
900 00   955

ins->ab  // 900 auf den ab
ram->db  // 955 auf den db
db->ins  // 955 ins ir
ins->ab  // 955 auf den ab
acc->db  // Akkuinhalt auf db
db->ram  // Akkuinhalt in 955 speichern
pc->ab   // PUSH 900 erneut fetchen
ram->db  //
db->ins  //
ins->ab  // 900 auf adressbus
ram->db  // 955 auf datenbus
db->acc  // 955 in akku
acc++    // 955->956 stackpointer++
acc->db  //
db->ram
pc++
mc:=0

Konstruktion von POP
Annahme
010 POP 900
900 00  956

ins->ab // 900 auf den ab
ram->db // 956 auf den db
db->acc
acc--   // stackpointer--, jetzt 955
acc->db
db->ram
db->ins // aktualisierter Stackpointer holen
ins->ab
ram->db
db->acc
pc++
mc:=0


Subroutine MUL, erwartet auf dem Stack: OP1, OP2, RTNAddr
Subroutine MUL hinterlässt auf dem Stack: RESULT
800 POP 900
801 SAVE _OP1
802 POP 900
803 SAVE _OP2
804 NULL
805 SAVE _OP3
806 TAKE _OP3
807 ADD  _OP1
808 SAVE _OP3
809 DEC  _OP2
810 TST  _OP2
811 JMP  805
812 NULL    // hier gehts weiter
813 POP 900 // returnadresse holen
814 SAVE _OP2 // op2 wird mit returnadresse überschrieben
815 TAKE _OP3
816 PUSH 900 // Result bereitstellen
817 JPI  _OP2
818 00    000 // _OP1
819 00    000 // _OP2
820 00    000 // _OP3

Aufruf von MUL:
LDV XXX  // marke für die Fortsetzung
PUSH 900
LDV 5
PUSH 900
LDV 6
PUSH 900
JMP 800
POP 900  // Marke XXX
HLT


Hintergrundwissen:
########################
Artikel Assembler im c64-Wiki:
https://www.c64-wiki.de/wiki/Assembler
Nur Einführungsabsätze und Schlussabsatz ("Nutzung von Assembler heute")

Aufrufstapel
https://de.wikipedia.org/wiki/Aufrufstapel

Nur Grafik im englischen Artikel zu Compiler
https://en.wikipedia.org/wiki/Compiler

Übersicht über Assemblerbefehle vom C64
https://www.c64-wiki.de/wiki/Übersicht_6502-Assemblerbefehle
Beachte insbesondere, dass es Stack-Befehle gibt / dass es unterschiedliche Adressierungsarten gibt.



20.09.2021
Lies das folgende Dokument (Nur Seite 3 bis 10)
Johnny-Doku.pdf


30.08.2021
Fahrplan für heute:
• Noch ein Diffie-Hellman Beispiel
00000000_Kryptographie_Diffie_Hellmann_v20210830.pdf
• Kurzausblick: Digitale Zertifikate (Frage: Wo kommt das vor? Z.B. Digitaler Impfnachweis)
• Wiederholung Datenbanken und Datenbankauswertungen: Beispiel "Zusammenhang Schlaf und Distanzunterricht-zufriedenheit"


23.08.2021
Fahrplan für heute:
• Installation von BlueJ: https://www.bluej.org/
• Installation von Audacity: https://www.audacityteam.org/download/

00000000_Kryptographie_Diffie_Hellmann.pdf
00000000_Kryptographie_Diffie_Hellmann.odt



26.03.2021

http://www.plusplanet.de/miscrawhtml/20210318_kosenamen_test.zip


24.03.2021
Lesestoff für heute:
http://www.plusplanet.de/miscrawhtml/00000000_037_IF11_Punktoperator_und_static.pdf
http://www.plusplanet.de/miscrawhtml/00000000_037_IF11_Uebersicht_Zugriff_Methoden_Eigenschaften.pdf

Erstelle eine ohne BlueJ lauffähgie Version, indem du folgenden Text liest:
http://www.plusplanet.de/miscrawhtml/00000000_036_IF11_main.pdf

Kleines Zwischendurch-Projekt:
• Übernehme das "Kosenamengenerator"-Projekt aus der EF.
• Wandle die Struktur von Arrays in eine Liste um.
• Erlaube das Nachladen von Namen zu Beginn des Programms mit:
http://www.plusplanet.de/miscrawhtml/00000000_156_IF12_Java_io.pdf



12.03.2021

Stand der Dinge nach der heutigen Stunde

public class Haupt {

    public static void main() {
        List population = new List();
        
        for(int i = 0 ; i<10000; i++) {
            Person p = new Person();
            p.init();
            
            population.append(p);
        }
        
        population.currentToFront();
        Person p = (Person) population.getCurrent();
        p.infiziereMitWahrscheinlichkeit(1.0);
        
        for(int i = 0; i < 100; i++) {
            population.currentToFront();
            
            // hier fehlt noch die äußere while-Schleife
            
            Node vergleichsNode = population.getCurrentNode();
            Person vergleichsPerson = (Person) vergleichsNode.inhalt;

            if(vergleichsPerson.isInfected()) {
                population.currentToFront();
                while(population.current != null) {
                    Person opfer = population.getCurrent();
                    if(vergleichsPerson.gleicherOrtWie(opfer)){
                        opfer.infiziereMitWahrscheinlichkeit(0.2);
                    }
                    population.currentNext();
                }
                
            }
            
            wenn pa infiziert
                ist pa am ort wie pb
                    infiziere ggf. pb
                ist pa am ort wie pc
                    infiziere ggf. pc
                ist pa am ort wie pd
                    infiziere ggf. pd
            
            wenn pb infiziert
                ist pb am ort wie pa
                    infiziere ggf. pa
                ist pb am ort wie pc
                    infiziere ggf. pc
                ist pb am ort wie pd
                    infiziere ggf. pd
            
            
            
        }
    }
}


class List {
    
    public Node getCurrentNode() {
        return current;
    }
    
    public void setCurrentNode(Node n) {
        current = n;
    }
    
}




09.03.2021
20210227_pandemie_sim.zip
Pandemie-Video: https://www.youtube.com/watch?v=gxAaO2rsdIs


public class Haupt {

    public static void main() {
        List population = new List();
        
        for(int i = 0 ; i<10000; i++) {
            Person p = new Person();
            p.init();
            
            population.append(p);
        }
        
        population.currentToFront();
        Person p = (Person) population.getCurrent();
        p.infiziereMitWahrscheinlichkeit(1.0);
        
        for( ....i...100 Zeitschritte ) {
            Node vergleichsNode =
                population.getCurrentNode();
            Person vergleichsPerson =
                (Person) vergleichsNode.inhalt;
            
            if(vergleichsPerson.isInfected()) {
                population.currentToFront();
                Person opfer = population.getCurrent();
                if(vergleichsPerson.gleicherOrtWie(opfer)){
                    opfer.infiziereMitWahrscheinlichkeit(0.2);
                }
                
            }
            
            wenn pa infiziert
                ist pa am ort wie pb
                    infiziere ggf. pb
                ist pa am ort wie pc
                    infiziere ggf. pc
                ist pa am ort wie pd
                    infiziere ggf. pd
            
            wenn pb infiziert
                ist pb am ort wie pa
                    infiziere ggf. pa
                ist pb am ort wie pc
                    infiziere ggf. pc
                ist pb am ort wie pd
                    infiziere ggf. pd
            
            
            
        }
    }
}


class List {
    
    public Node getCurrentNode() {
        return current;
    }
    
    public void setCurrentNode(Node n) {
        current = n;
    }
    
}




23.02.2021
Java-Klassen für List, Stack und Queue:

www.plusplanet.de/miscrawhtml/stack_und_queue_und_list.java


15.12.2020
Lesestoff für den Distanzunterricht:
00000000_130a_IF12_Graphen.pdf
00000000_130b_IF12_Datenstrukturen_allg.pdf
00000000_130c_IF12_Datenstruktur_Stack.pdf
00000000_130d_IF12_Datenstruktur_Queue.pdf
00000000_130e_IF12_Datenstruktur_List.pdf


12.08.2020
Java-Programmierung

Das Programm unten gibt eine "Blumenwiese" aus. Ihr könnt es z.B. in BlueJ oder im Browser unter
https://code.sololearn.com/#java
ausführen.

Aufgabe:
• Bei Ausführung des Programms können in der ersten ausgegebenen Zeile Rauten erscheinen, nie aber * oder | oder + Zeichen. Ändere das Programm so, dass auch diese Fälle eintreten. (Es gibt eine einfache Möglichkeit, wo diese drei Zeichen auch in Zeile 1 erscheinen - allerdings nicht zufällg. Das ist für die Lösung dieser Aufgabe aber OK)
• Die "Blumen" haben immer genau eine Raute als "Blüte". Schreibe das Programm so um, dass zwei Rauten als Blüte erscheinen (also von oben nach unten: ##*|+ )
• Das Programm zeichnet die Blumen immer "von oben nach unten". Schreibe ein vergleichbares Programm, wo aber nicht vertikale Blumen, sondern horizontale Fische ( <°)))><  ) ausgegeben werden.
* Das Fisch-Programm soll das Bild nun so zeichnen, dass die Fische zufällig nach links ODER nach rechts schwimmen.

Falls Dir die Aufgabe 1 und 2 nicht innerhalb von 20 Minuten gelingen, melde dich bitte bei Herrn Töns.



import java.math.*;
public class Demo{
    public static void main(String[] args) {
        String zeileAlt = "Dies sind 60 Dummyzeichen, die nie ausgegeben werden........";
        for(int i = 0; i < 60; i++) {
            String zeile = "";
            for(int x = 0; x < 60; x++) {
                boolean unbesetzt = true;
                if(zeileAlt.charAt(x) == '#') {
                    zeile = zeile + "*";
                    unbesetzt = false;
                }
                if(zeileAlt.charAt(x) == '*') {
                    zeile = zeile + "|";
                    unbesetzt = false;
                }
                if(zeileAlt.charAt(x) == '|') {
                    zeile = zeile + '+';
                    unbesetzt = false;
                }
                if(unbesetzt) {
                    if(Math.random() < 0.04) {
                        zeile = zeile + "#";
                    } else {
                        zeile = zeile + " ";
                    }
                }
            }
            System.out.println(zeile);
            zeileAlt = zeile;
        }
    }

}




Ab hier abwärts: Daten aus der EF


12.06.2020
Java-Programmierung
Lieber Informatikkurs,
ich habe bemerkt, dass die Programmierung in Java noch nicht so fluffig läuft, wie es eigentlich geplant ist. Daher noch einmal eine weitere Java-Aufgabe.

Das Programm unter dem Eingabeformular gibt eine "Blumenwiese" aus. Ihr könnt es z.B. in BlueJ oder im Browser unter
https://code.sololearn.com/#java
ausführen.

Eure Aufgabe ist:
A) Erklärt, warum die 60 Dummyzeichen, mit denen der String "zeileAlt" initialisiert wird, zwar nicht ausgegeben wird, aber dennoch nicht einfach als Leerstring angegeben werden kann (also String zeileAlt = "";)
B) Ändert das vorliegende Programm so, dass die "Blumen" auf dem Kopf stehen, also nicht die Raute, sondern das Hütchen immer oben ist.
C) Ändert das vorliegende Programm so, dass die "Blumen" um ein weiteres Zeichen (z.B. "+" ganz am Ende) wachsen, dass also die Blumenlänge nun etwas größer ist.
D) Erkläre, welchen Sinn die Zeile  if(Math.random() < 0.04) { hat.

Die Lösung der Aufgabe schickt ihr mir bis Donnerstag, den 18.06.2020 auf einem der folgenden Wege:
• Entweder Ihr schickt eine E-Mail an mich,
• oder ihr gebt die Lösung über folgendes Rückmeldeformular ein:


Deine Lösung:

Hier unten ist das von Euch zu bearbeitende Programm vorgegeben:

import java.math.*;
public class Demo{
    public static void main(String[] args) {
        String zeileAlt = "Dies sind 60 Dummyzeichen, die nie ausgegeben werden........";
        for(int i = 0; i < 60; i++) {
            String zeile = "";
            for(int x = 0; x < 60; x++) {
                boolean unbesetzt = true;
                if(zeileAlt.charAt(x) == '#') {
                    zeile = zeile + "*";
                    unbesetzt = false;
                }
                if(zeileAlt.charAt(x) == '*') {
                    zeile = zeile + "|";
                    unbesetzt = false;
                }
                if(zeileAlt.charAt(x) == '|') {
                    zeile = zeile + '+';
                    unbesetzt = false;
                }
                if(unbesetzt) {
                    if(Math.random() < 0.04) {
                        zeile = zeile + "#";
                    } else {
                        zeile = zeile + " ";
                    }
                }
            }
            System.out.println(zeile);
            zeileAlt = zeile;
        }
    }

}




25.05.2020
Sortieralgorithmen
Lieber Informatikkurs,
wir haben uns ja jetzt etwas mit Sortierverfahren beschäftigt. Und wir haben auch in JavaScript programmiert. Aber eigentlich müssten wir lehrplankonform in Java programmieren.

Daher versucht ihr nun folgendes:
Installiert euch Java und BlueJ (wenn ihr zu den sogenannten "digital natives" gehören wollt, dann werdet ihr das schon schaffen), so dass ihr damit arbeiten könnt.
Falls das nicht funktioniert, so gibt es eine etwas abgespeckte (und nicht ganz so komfortable) Möglichkeit zur Java-Programmierung ohne Installation direkt im Browser:
https://code.sololearn.com/#java
Beim Klick auf den Link solltet ihr ein mini-Programm sehen. Weiter unten in dem heutigen plusplanet-Abschnitt unter dem Rückmeldeformular ist das Programm aufgeführt, um dass es heute geht. Kopiert diesen Teil in den Webbrowser hinein und startet das Programm. Es sollte ein Array mit Selectionsort sortiert werden..

Eure Aufgabe ist:
A) Ändert das vorliegende Programm (also nicht googeln und irgendwas hinpasten), so dass die Zahlenreihe absteigend (statt aufsteigend sortiert wird) - Dies ist relativ einfach.
B) Ändert das vorliegende Programm so, dass jeweils das sortierte Teilarray nicht zu Beginn sondern am Ende des Arrays aufgebaut wird. - Dies ist etwas kniffliger.

Die Lösung der Aufgabe schickt ihr mir bis Sonntag, den 31.05.2020 auf einem der folgenden Wege:
• Entweder Ihr schickt eine E-Mail an mich,
• oder ihr gebt die Lösung über folgendes Rückmeldeformular ein:


Deine Lösung:


Hier unten ist das von Euch zu ändernde Programm vorgegeben:

public class Demo{
    static int[] zahlen;

    public static void main(String[] args) {
        zahlen = new int[] { 4, 1, 8, 6, 5, 7 };
        
        ausgabe();
        System.out.println("-----------------------");
        selectionsort();
        System.out.println("-------Ende------------");
        ausgabe();

    }

    public static void selectionsort() {
        for (int i = 0; i < zahlen.length - 1; i++) {
            System.out.println("i ist gleich: "+i);
            System.out.println("i-tes Element ist gleich: "+zahlen[i]);
            System.out.println("Wir suchen ab Position "+i+" nun das kleinste Element.");
            int aktmin = zahlen[i];
            int aktminidx = i;
            for (int j = i + 1; j < zahlen.length; j++) {
                if (aktmin > zahlen[j]) {
                    aktmin = zahlen[j];
                    aktminidx = j;
                }
            }
            System.out.println("Das kleinste Element rechts von Position "+i+" ist "+aktmin);
            System.out.println("Dieses Element wird nun an die Position i="+i+" hingetauscht.");
            
            int temp = zahlen[i];
            zahlen[i] = zahlen[aktminidx];
            zahlen[aktminidx] = temp;
            
            ausgabe();
            System.out.println("---- nächster Durchlauf ----");
        }
    }
    
    public static void ausgabe() {
        for (int i = 0; i < zahlen.length; i++) {
            System.out.print(zahlen[i] + ", ");
        }
        System.out.println();
    }
}




18.05.2020
Sortieralgorithmen
Hätten wir normalen Unterricht, so würde ich euch Kärtchen per Hand sortieren lassen - das ist gar nicht so einfach, wenn man ein paar Schwierigkeiten einbaut. Dann merkt man nämlich, dass man eine Strategie - quasi ein Programm - braucht, um erfolgreich ans Ziel zu kommen. Leider müssen wir weiter auf Abstand bleiben.

Neben Bubblesort gibt es noch zwei weitere (vergleichsweise einfache) Sortierverfahren, die man als Informatiker kennen sollte:
Selection-Sort und Insertion-Sort.

Auch hier gibt es wieder zwei gute Erklär-Seiten im Netz:
https://www.inf-schule.de/grenzen/komplexitaet/sortieren/sortieralgorithmen/selectionsort
https://www.inf-schule.de/grenzen/komplexitaet/sortieren/sortieralgorithmen/insertionsort

Aufgabe: Sortiere die Zahlenfolge (8,2,5,1,6,3) mit
a) Selection-Sort
b) Insertion-Sort
und zwar in der Art und Weise, wie in den verlinkten Artikeln.

Die Lösung der Aufgabe schickt ihr mir bis Sonntag, den 24.05.2020 auf einem der folgenden Wege:
• Entweder Ihr schickt eine E-Mail an mich,
• oder ihr gebt die Lösung über folgendes Rückmeldeformular ein:


Deine Lösung:


11.05.2020
Sortieralgorithmen
Manche von Euch haben es schon geahnt: Wenn man den Median einer Zahlenreihe bestimmen möchte, so muss man die Zahlenreihe (also ein Array) erst sortieren.
Es gibt unterschiedliche Möglichkeiten, das von einem Programm erledigen zu lassen. Eine bekannte und noch relativ übersichtliche Methode ist "Bubble Sort"

Eine Einführung für die Schule kann man unter folgendem Link lesen:
https://www.inf-schule.de/grenzen/komplexitaet/sortieren/sortieralgorithmen/bubblesort

Mir persönlich scheint auch das Beispiel in der englischen Wikipedia ganz lehrreich:
https://en.wikipedia.org/wiki/Bubble_sort#Step-by-step_example

Ihr findet bestimmt noch bessere Links im Internet, die Bubble-Sort erklären, wenn ihr die beiden obigen Links nicht gut findet.

Aufgabe zum 17.05.2020:
Sortiert folgende Zahlenreihe mit Bubblesort:
(8,2,5,1,6,3)
Dabei sollt ihr wie das Beispiel aus der englischen Wikipedia Schritt für Schritt vorgehen! (Ich möchte also mehrere Zeilen mit dieser Zahlenreihe sehen, die sich nach und nach verändert!)

Die Lösung der Aufgabe schickt ihr mir bis Sonntag, den 17.05.2020 auf einem der folgenden Wege:
• Entweder Ihr schickt eine E-Mail an mich,
• oder ihr gebt die Lösung über folgendes Rückmeldeformular ein:


Deine Lösung:




04.05.2020
Programmieren mit Javascript

Nach diesen kleinen Programmierübungen wollen wir uns an ein Problem herantasten, welches in der Informatik sehr zentral ist. Ich lasse die Katze aber noch nicht aus dem Sack  :)

Informiert Euch zunächst darüber, was der Median einer Zahlenreihe ist. Folgender Artikel scheint mir sehr einfach verständlich:
https://de.serlo.org/mathe/stochastik/daten-datendarstellung/daten-kenngroessen/median

In der vergangenen Hausaufgabe habt ihr ja bereits die Spannweite einer Zahlenreihe programmtechnisch ermittelt.

Aufgabe: Wie müsste man eine Funktion schreiben, die den Median einer Zahlenreihe findet? Es genügt, wenn ihr die wesentlichen Dinge aufschreibt. Vielleicht gebt ihr auch sogenannten Pseudocode ab - also Programmteile, die nicht wirklich in einer Programmiersprache geschrieben sind, sondern dem Leser eine Programmieridee nahebringen. Der Pseudocode der Funktion "spannweite" könnte so aussehen:

funktion spannweite(Eingabearray a) {
    mommin = a[0]
    mommax = a[0]
    Schleife über alle Elemente des Arrays a mit Laufvariable i {
        wenn mommin > a[i] dann mommin = a[i]
        wenn mommax < a[i] dann mommax = a[i]
    }
    return mommax - mommin
}


Die Lösung der Aufgabe schickt ihr mir bis Freitag, den 08.05.2020 auf einem der folgenden Wege:
• Entweder Ihr schickt eine E-Mail an mich,
• oder ihr gebt die Lösung über folgendes Rückmeldeformular ein:


Deine Lösungen:



28.04.2020
Programmieren mit Javascript
Liebe Informatiker!
Zu wenige von Euch haben sich überhaupt zur Hausaufgabe gemeldet. Selbst, wenn ihr die Aufgabe nicht lösen könnt, so schickt ihr mir bitte eine Mail mit einer Begründung, woran es gelegen hat. Bei Denjenigen, von denen ich gar nichts gehört habe, muss ich davon ausgehen, dass auch gar nicht gearbeitet wurde. Selbst eine gut gestellte Frage zur Hausaufgabe ist manchmal besser als eine schlecht erledigte Hausaufgabe.

Lösung der Aufgabe zu Montag, den 27. April und gleichzeitig Basis für die kommende Aufgabe:
basic4.html

Daher bekommt ihr jetzt eine neue Aufgabe:
Testet die obige Datei basic4.html
Darin seht ihr, dass zunächst vom gegebenen Array der Mittelwert und der kleinste Wert berechnet wird. Außerdem soll die Spannweite (Bedeutung: siehe unten) berechnet werden - was aber noch nicht funktioniert. Das sollt ihr nun lösen.

Ergänze die Funktion "spannweite" und schickt mir die Lösung bis Samstag, den 2. Mai um 16:00 Uhr per E-Mail.
(Hinweis an N.B.: Du hast mir eine Email mit einer "Einmal-Adresse" geschickt, so dass ich darauf nicht antworten kann. Bitte benutze eine funktionierdende Rückadresse.)

Bedeutung "Spannweite": Dies ist die Differenz, also der Unterschied zwischen dem größten und dem kleinsten Wert.
Beispiel: Die Spannweite der Zahlenreihe "5,8,2" ist 6, denn der Unterschied zwischen dem größten Element der Reihe (das ist hier 8) und dem kleinsten Element der Reihe (das ist hier die 2) ist 6, denn 8-2=6.


22.04.2020
Programmieren mit Javascript
Liebe Informatiker!
In den Stunden vor den Ferien habe ich Euch eine "Programmausführung auf dem Papier" machen lassen. Da wir uns aber jetzt sehr lange nicht sehen, möchte ich Euch bitten, daheim auch einmal den Computer zum Programmieren zu benutzen.
Dazu benötigt ihr nur einen Browser (Firefox, Chrome, Internet Explorer, Safari etc. - den habt ihr sowieso) und einen Editor (Notepad ist bei Windows eingebaut, ich persönlich benutze Notepad++, weil der den Text so schön farbig macht).

Aufgabe: Programmiere in Javascript anstatt der Funktion arraymittelwert(arr) (Siehe die bekannte pdf-Datei 00000000_036_IF11_Programmausfuehrung_auf_Papier_pro.pdf) die Funktion kleinsterwert(arr), welche aus einem Array den kleinsten Wert herausfindet. Bei einer Eingabe von 6,7,9,5,3,656,23,4,6 sollte also das Ergebnis 3 herauskommen.

Damit ihr etwas besser einschätzen könnt, was ich meine, habe ich hier ein Video vorbereitet:
http://www.plusplanet.de/video/20200422_ifef.webm

Die dazugehörige HTML-Datei findet Ihr hier:
basic3.html

Bitte schickt mir das Ergebnis Eurer Programmierung (nur die gefragte Funktion) bis zum Montag, den 27.04.2020 an die bekannte E-Mail-Adresse.


31.03.2020
Liebe Informatiker,
da die Situation jetzt noch schlechter abschätzbar ist, als vor zwei Wochen, möchte ich zumindest eine Rückmeldung von Euch haben.
Bitte bearbeitet die gleiche Aufgabe (siehe den letzten Eintrag vom 17. März, nur mit anderen Zahlen) noch ein weiteres mal. Sendet mir euer Ergebnis per Mail an: Bild "Willkommen:email.png"
Aufgabe: Erstelle eine entsprechende Tabelle für die vier Startwerte 2,2, 3 und 9!


17.03.2020
Liebe Informatiker,
da wir uns nun eine Zeit lang nicht sehen, kann ich euch auch schlecht Programmieraufgaben aufgeben. Was aber immer wichtig ist, ist das Verständnis davon, wie ein Computer ein Programm abarbeitet.
Da zu jedem Zeitpunkt jeder Speicherplatz (oder Variablenwert) genau einen Wert hat, kann man diesen auch theoretisch immer selbst (von Hand) angeben, wenn man alle Startbedingungen kennt. Dies soll geübt werden.
Lest euch in folgendem Dokument die erste Seite und den ersten Abschnitt der der zweiten Seite durch:
00000000_036_IF11_Programmausfuehrung_auf_Papier_pro.pdf
Dort abgedruckt ist eine Methode, die ein Array von int-Werten erwartet (dessen Namen ist "a", siehe erste Zeile der Methode) und von diesen Werten den Mittelwert berechnet.
Führt man dieses Programm mit den Startwerten 4,8 und 3 aus (dies sind die Werte, die in der Tabelle unten als Startwerte im Array stehen), so erhält man das Ergebnis 5 (denn 5 ist der Mittelwert aus den obigen Zahlen).
Aufgabe: Erstelle eine entsprechende Tabelle für die Startwerte 7,10 und 11!


10.12.2019
Klausurthemen
* Alle ausgeteilten Materialien sollen verstanden worden sein. Man muss sie nicht auswendig können. Aber man sollte wissen was drin steht.
* Grundlagen der JavaScript-Programmierung:
** Wissen, wie man eine if-Anweisung und eine for-Schleife benutzt.
** Wissen was eine Variable ist, und wie man ihr einen Wert zuweist.
** Wissen wie man Bedingungen für if-Anweisungen formuliert
** Unterschied zwischen = (gleich) und == (gleichgleich) kennen
** Wissen was eine Funktion ist und wie man sie aufruft. Was ist ein Rückgabeparameter (return)? Was ist ein Funktionsargument (was kommt in die Funktion als Parameter hinein)?
** Was ist eine Zeichenkette (eine Reihe von Zeichen in einem sogenannten String), wie greift man auf einzelne zeichen zu?


Hilfsmittel während der Klausur:
* JavaScript Mini Cheat Sheet



<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>JavaScript: Hallo Welt</title>
  <script>
    'use strict';
    
    var gruss = "Moin";  // globale Variable

    // Zeichen an Stelle index im String str mit replacement ersetzen
    // Die Arbeitsweise dieser Funktion ist nicht Teil der Klausur
    function replace(str,index, replacement) {
        return str.substr(0, index) + replacement+ str.substr(index + replacement.length);
    }

    // Hilfsfunktion die überprüft, ob die Eingabe eine Zahl ist, mit der man rechnen kann
    // Die Arbeitsweise dieser Funktion ist nicht Teil der Klausur
    function isNumeric(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    }

    // liefert eine Zufallszahl zwischen von (incl) und bis (excl)
    function zufall(von, bis) {
        var rdm;
        var differenz = bis - von;
        rdm = Math.random();
        rdm = Math.floor(rdm * differenz);
        rdm = von + rdm;
        return rdm;
    }

    // Zufallszahl
    function zufallszahl() {
        var erg = zufall(0,100);
        document.getElementById("ausgabe").textContent = "Zufallszahl von 0 bis 99 : " +erg;
    }

    // gibt einen Gruß für den angegebenen Namen aus.
    function gruessen() {
        var name; // lokale Variable
        name = document.getElementById("eingabe").value;
        document.getElementById("ausgabe").textContent = gruss + " " +name;
        // ohne "return" ist der Rückgabewert "undefined"
    }

    // kehrt die Eingabe um
    function reverse() {
        var name;
        name = document.getElementById("eingabe").value;
        for(var i = 0; i < (name.length / 2); i++) {
            var zeichen1 = name[i];
            var zeichen2 = name[name.length-1-i];
            name = replace(name,i,zeichen2);
            name = replace(name,name.length-1-i,zeichen1);
        }
        document.getElementById("ausgabe").textContent = "Umgedreht: " +name;
    }

    // rotiert die Eingabe um eine Position
    function rotate() {
        var name;
        var erg = "";
        name = document.getElementById("eingabe").value;
        for(var i = 1; i < (name.length); i++) {
            erg = erg + name[i];
        }
        erg = erg + name[0]
        document.getElementById("ausgabe").textContent = "Rotiert: " +erg;
    }

    // quadriert die Eingabe (wenn möglich)
    function square() {
        var name;
        var erg;
        name = document.getElementById("eingabe").value;
        if( isNumeric(name) ) {
            erg = name * name;
        } else {
            erg = "Fehler: "+name+" ist keine Zahl!";
        }
        document.getElementById("ausgabe").textContent = "Quadrieren: " +erg;
    }


    // Wird einmal zu Beginn ausgeführt.
    function init() {
        document.getElementById("ausgabe").textContent = "Wer ist da?";
    }

    window.onload = init;  // Nach Ladevorgang die Variablen initialisieren.

  </script><noscript>Sie haben JavaScript deaktiviert.</noscript>
  
</head>
<body>
    <p>Beispiele für JavaScript</p>
    <input id="eingabe" type="text" value="Dein Name?"><br>
    <button onClick="zufallszahl();">Zufallszahl</button>
    <button onClick="gruessen();">Gruß ausgeben!</button>  
    <button onClick="reverse();">umkehren</button>
    <button onClick="rotate();">rotieren</button>
    <button onClick="square();">quadratzahl</button>
    <div id="ausgabe" style="font-family: monospace;white-space: pre-line;" >Dummy-Text</div>
    Fragen für Checker:<br>
    Warum wird bei der Funktion reverse in der for-Schleife nur bis (name.length / 2) gezählt? Probiere mal aus, die "durch 2" zu entfernen und erkläre das Ergebnis!
</body>
</html>






24.09.2019

HTML und Co

Erzeuge zunächst mehrere HTML-Dokumente, zwischen denen (mit Links) Du hin und her springen kannst.

Lies dann nochmal die "HTML-Grundlagen"-Zettel und erledige die Übungen dort. Gerne auch mit eigenen Einfällen.
Ein mögliches Miniprojekt könnte sein, ein sehr einfaches "TicTacToe" zu bauen. Dafür könnte das Nachschlagen des "table"-Elements sinnvoll sein.




03.09.2019

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.


http://www.plusplanet.de/quizmeister_20210421_ifq1/