Wir haben uns folgendes klargemacht: 1. Es gibt unterschiedliche Möglichkeiten, eine Menge von Objekten automatisch zu sortieren. Dazu gehört:
1a: Insertion-Sort.
Funktionsweise:
Beispiel: alphabetische Sortierung einer Wortliste.
Man beginnt mit einem ersten Wort. Dann schaut man sich das zweite Wort an und stellt fest, dass man dies entsprechend vor oder nach dem ersten Wort einsortiert. Dann hat man bereits eine "sortierte Liste" bestehend aus 2 Wörtern. Man nimmt dann wiederum das nächste "unsortierte Wort" und fügt ("insert") es in die Liste der bereits sortierten Worte ein. Man fährt fort, bis die "unsortierte Liste" leer ist.
1b: Bubble-Sort.
Funktionsweise:
Man vergleicht erstes und zweites Wort und tauscht ggf..
Nächster Vergleich: 2. mit 3. Wort
Nächster Vergleich: 3. mit 4. Wort
.... bis man ganz durch ist. Dann steht das alphabetisch letzte Wort bereits an der richtigen Stelle.
Dieser Vorgang muss so oft wiederholt werden, wie es Elemente (-1) in der Wortliste gibt.
2. Anzahl der Vergleiche
Bei Bubble-Sort war es einfach, die Anzahl der Vergleiche zu zählen. Beispielsweise konnten 10 Elemente mit 45 Vergleichen sortiert werden. Bei 20 Elementen benötigt man schon 190 Vergleiche. Bei n Elementen benötigt man ½·((n-1)² + (n-1)) = ½·n² - ½·n Vergleiche.
3. Akinator
Wir haben uns den "Akinator" angesehen, der durch mehrmaliges Fragen eine Person aus "deinen Gedanken erraten" kann. Angenommen (Optimalfall!), jede Frage teilt die Menge der noch verbleibenden Personen in zwei gleichgroße Teile (wovon nur noch ein Teil, also die Hälfte, für die nächste Frage relevant ist). Dann benötigt man bei 8 Personen 3 Fragen. Bei 32 Personen benötigt man 5 Fragen (Denn 2 hoch 5 = 32 und log2(32) = 5) und bei n Personen benötigt man Aufrunden(log2(n)) Fragen.
4. Komplexitätsbetrachtungen:
Beim Bubble-Sort mit n Elementen kommt man auf folgende Formel: AnzVergleiche(n) = ½·n² - ½·n
Beim Akinator mit n Personen in der Datenbank kommt man auf die Formel: AnzFragen(n) = Aufrunden(log2 (n))
Beim Travelling-Salesman-Problem mit n Städten kommt man auf die Formel: AnzVergleichsstrecken(n) = (n-1)!
Das n in den obigen Formeln heißt "Problemgröße".
Da die sogenannte "binäre Suche" (z.B. im Telefonbuch) mit jedem Schritt die Menge der zu untersuchenden Namen halbiert, gilt hier die gleiche Formel wie beim Akinator. Man könnte auch sagen, Akinator und binäre Suche sind "strukturgleich".
Für die Problemgröße n=1000 erhalten wir:
-- beim Bubblesort AnzVergleiche(1000) = 499500
-- beim Akinator AnzFragen(1000) = 10
-- beim TSP: AnzVergleichsstrecken(n) = (zu hoch für GTR)
Die Ergebnisse sind offenbar völlig unterschiedlich. Wenn man diese drei Algorithmen vergleicht, so kann man sagen, dass das Akinator-Vorgehen in einer gewissen Art "besser" oder "schneller" oder "effizienter" als der Bubble-Sort ist. Natürlich sind die Anwendungsgebiete ("Sortieren" oder "Personen erraten") völlig unterschiedlich. Dennoch kann man die beiden Formeln vergleichen und sagen: Für große Werte von n benötigt man beim Akinator weniger "Schritte".
Wenn man solche Formeln in der Theoretischen Informatik vergleicht, so interessiert man sich bei der Bubble-Sort-Formel gar nicht mehr für den Vorfaktor ½ oder den zweiten Summanden " - ½·n ", da dies im Vergleich zu anderen Formeln (wie die Akinator-Formel) gar nicht mehr ins Gewicht fällt. Man sagt (ungenau): Bubble-Sort hat eine Komplexität von "n²", während Akinator eine Komplexität von "log(n)" hat.
5. Herausforderungen:
Wir stellen fest, dass der Bubble-Sort selbst bei moderaten Werten für n schon verflixt viele Schritte benötigt (ganz zu schweigen vom TSP). Da fragt man sich, ob es neben Bubble-Sort noch andere Sortierverfahren gibt, die "schneller sind", also ein besseres Komplexitätsverhalten haben. Die gibt es! Das kommt erst in der Q1, aber man kann schonmal sagen: Die Sortierverfahren "Quicksort" oder "Mergesort" haben eine Komplexität von "n·log2(n)".
Wir vergleichen mal: Angenommen, wir sortieren 1000 Elemente. Dann ergibt sich mit der "ungenauen" Bubblesort-Komplexität von n² eine Größenordnung von 1Mio Vergleichen. Mit der "ungenauen" Quicksort-Komplexität "n·log2(n)" ergibt sich 1000·10 = 10tsd (also 50 mal besser). Das ist schon schneller. Für höhere Werte von n ergibt sich:
n = 1Mio
Bubble-Sort: n² -> 1 Billion = 1 000 000 000 000
Quicksort: n·log2(n) -> 1Mio · 20 = 20 000 000
also 50tsd mal besser!
Man sagt daher auch: Quicksort (oder Mergesort) liegt in einer anderen Komplexitätsklasse als Bubble-Sort.
18.05.2022
Sortierverfahren und Komplexität von Algorithmen
Wir haben uns folgendes klargemacht:
1. Es gibt unterschiedliche Möglichkeiten, eine Menge von Objekten automatisch zu sortieren. Dazu gehört:
1a: Insertion-Sort. Funktionsweise: _____
1b: Bubble-Sort. Funktionsweise: _____
2. Bei Bubble-Sort war es einfach, die Anzahl der Vergleiche zu zählen. Beispielsweise konnten 10 Elemente mit 45 Vergleichen sortiert werden. Bei 20 Elementen benötigt man schon ____ Vergleiche. Bei n Elementen benötigt man ____ Vergleiche.
3. Wir haben uns den "Akinator" angesehen, der durch mehrmaliges Fragen eine Person aus "deinen Gedanken erraten" kann. Angenommen (Optimalfall!), jede Frage teilt die Menge der noch verbleibenden Personen in zwei gleichgroße Teile (wovon nur noch ein Teil, also die Hälfte, für die nächste Frage relevant ist). Dann benötigt man bei 8 Personen 3 Fragen. Bei 32 Personen benötigt man ___ Fragen und bei n Personen benötigt man _____ Fragen.
4. Komplexitätsbetrachtungen:
Beim Bubble-Sort mit n Elementen kommt man auf folgende Formel:
AnzVergleiche(n) = ½·n² - ½·n
Beim Akinator mit n Personen in der Datenbank kommt man auf die Formel:
AnzFragen(n) = Aufrunden(log2 (n))
Das n in den obigen Formeln heißt "Problemgröße". Für die Problemgröße n=1000 erhalten wir:
-- beim Bubblesort AnzVergleiche(1000) = ____
-- beim Akinator AnzFragen(1000) = ____
Die Ergebnisse sind offenbar völlig unterschiedlich. Wenn man diese beiden Algorithmen vergleicht, so kann man sagen, dass das Akinator-Vorgehen in einer gewissen Art "besser" oder "schneller" oder "effizienter" als der Bubble-Sort ist. Natürlich sind die Anwendungsgebiete ("Sortieren" oder "Personen erraten") völlig unterschiedlich. Dennoch kann man die beiden Formeln vergleichen und sagen: Für große Werte von n benötigt man beim Akinator weniger "Schritte".
Wenn man solche Formeln in der Theoretischen Informatik vergleicht, so interessiert man sich bei der Bubble-Sort-Formel gar nicht mehr für den Vorfaktor ½ oder den zweiten Summanden " - ½·n ", da dies im Vergleich zu anderen Formeln (wie die Akinator-Formel) gar nicht mehr ins Gewicht fällt. Man sagt (ungenau): Bubble-Sort hat eine Komplexität von "n²", während Akinator eine Komplexität von "log(n)" hat.
5. Herausforderungen:
Wir stellen fest, dass der Bubble-Sort selbst bei moderaten Werten für n schon verflixt viele Schritte benötigt. Da fragt man sich, ob es neben Bubble-Sort noch andere Sortierverfahren gibt, die "schneller sind", also ein besseres Komplexitätsverhalten haben. Die gibt es! Das kommt erst in der Q1, aber man kann schonmal sagen: Die Sortierverfahren "Quicksort" oder "Mergesort" haben eine Komplexität von "n·log2(n)".
Wir vergleichen mal: Angenommen, wir sortieren 1000 Elemente. Dann ergibt sich mit der "ungenauen" Bubblesort-Komplexität von n² eine Größenordnung von 1Mio Vergleichen. Mit der "ungenauen" Quicksort-Komplexität "n·log2(n)" ergibt sich 1000·10 = 10tsd (also 50 mal besser). Das ist schon schneller. Für höhere Werte von n ergibt sich:
n = 10000
Bubble-Sort: n² ->
Quicksort: n·log2(n) ->
n = 1Mio
Bubble-Sort: n² -> 1 Billion = 1 000 000 000 000
Quicksort: n·log2(n) -> 1Mio · 20 = 20 000 000 also 50tsd mal besser!
Man sagt daher auch: Quicksort (oder Mergesort) liegt in einer anderen Komplexitätsklasse als Bubble-Sort.
ToDo für die heutige Stunde:
• Recherchiere das Interface KeyListener
• Implementiere alle drei notwendigen Methoden. Hier ein "Steinbruch":
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()== KeyEvent.VK_DOWN) {
System.out.println("down Pressed");
}
else if(e.getKeyCode()== KeyEvent.VK_UP) {
System.out.println("up Pressed");
}
}
• Alle Elemente der GUI sollen mit "addKeyListener" versehen werden
• Probleme dieser Art der Tastaturerfassung formulieren
08.04.2022
Mini-Projekt: Maximum aus einem Array von int-Zahlen herausfinden:
import java.util.*;
public class Kram {
public static void start() {
int[] meinArr = new int[10];
for(int i =0 ; i < meinArr.length; i++) {
meinArr[i] = (int)(Math.random() * 100);
}
System.out.println("Array: "+Arrays.toString(meinArr));
System.out.println("Maximum: "+max(meinArr));
}
public static int max(int[] p) {
int momMax = p[0];
for(int i =0 ; i < p.length; i++) {
if(momMax < p[i]) {
momMax = p[i];
}
}
return momMax;
}
}
08.04.2022
Schnellübungen (die so auch in der Klausur auftauchen könnten)
• Im Pong-Spiel: die Bälle sollen eine zufällige Größe zwischen 4 und 8 Pixeln bekommen
• Im Pong-Spiel: wenn kein Ball mehr "lebt", soll die Nachricht erscheinen: "Spiel zuende"
• Im Pong-Spiel: wenn kein Ball mehr "lebt", soll die Nachricht erscheinen: "Spiel zuende"
• Im Pong-Spiel: wenn ein Ball an einem Rand abprallt, soll die Farbe geändert werden
• Allgemein: Schreibe eine Methode, die das größte Element in einem int-Array herausfindet.
• Allgemein: Wann kommt der Fehler "Null-Pointer-Exception"? Kannst Du eine Null-Pointer-Exception im Pong-Spiel mutwillig herbeiführen?
06.04.2022
Infos zur Klausur
Klausurthema: Java-Programmierung: 1. Grundlagen, die wir bei der letzten Klausur in JavaScript bearbeitet haben, müssen nun auch in Java gekonnt werden:
• Variablen, Wertzuweisungen
• if-Anweisungen und Bedingungen incl. else-Block
• for-Schleife
• Handhabung von Strings (Zeichenketten)
• Handhabung von Arrays
• Funktionen: Eingabeparameter ("Argumente") und Rückgabewerte
• Korrektes Einrücken von Programmen
• Wie man Programmabläufe aufschreiben kann: 00000000_036_IF11_Programmausfuehrung_auf_Papier_pro_JavaScript.pdf
2. Objektorientierte Programmierung
• Sichere Unterscheidung von Klasse, Objekt, Eigenschaft und Methode.
• Bedeutung der unterschiedlichen Schlüsselwörter: class, new, void, static, null
• Bedeutung der atomaren Datentypen int, double usw.
• Funktionsweise von Referenztypen (wie z.B. JButton aber auch eigene Klassen wie JGrafikPanel)
• Vererbung und Schnittstellen (Interfaces) sind nicht Klausurthema!
• Verständnis unseres "Pong"-Programms (20220401_grafik_simpel2_vor_std.zip)
• Verständnis des Skriptes 20220114_TOE_Java_Einfuehrung.pdf mit Ausnahme der Seiten 21, 22 (Vererbung), 23 (char und String), 24 (Java außerhalb von BlueJ). Die Seite 25 ist aber wieder hilfreich.
01.04.2022
Bitte lest folgende Abschnitte zum nächsten Mal. Bitte habt dabei im Hinterkopf, dass in unserem momentanen Programm folgende Zeile steht: public class JGrafikPanel extends JPanel
Also: Die selbstprogrammierte Klasse JGrafikPanel ist eine Art der Klasse JPanel (die bei Java eingebaut ist und eigentlich nur einen eigenschaftslosen Bereich im Fenster markiert).
Wir wiederholen ein paar Grundlagen und lesen dafür einige Abschnitte in dem sehr guten und ausführlichen Buch "Java ist auch eine Insel". Bitte lest folgende (Unter-)Kapitel:
Eigentlich sollte euch alles bekannt vorkommen. Als "Nachweis" der Aufgabenerledigung schreibt ihr bitte ein paar Kommentare (Fragen/Unklarheiten/neue Einblicke) zum Text auf. "Nichts aufschreiben" ist eine nicht gemachte Aufgabe.
Programm für heute:
• Wiederholung: Eigenschaften und Methoden
• Ein kleines Java-Spiel
• Kleine Java-Dokumentation von mir: 20211203_TOE_Java_Einfuehrung.pdf
/*
* GUI (Graphical User Interface), mit einem eigenen Layout
*/
public class Startklasse implements ActionListener{
JButton but1, but2;
JTextField eingabezeile1;
JLabel lab1;
JFrame frame;
JTextArea textArea;
public void zeigeFenster() {
frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setTitle("Null Layout");
frame.setLayout(null);
but1 = new JButton("Klick mich!");
but1.setBounds(10,10,200,30);
but1.addActionListener(this);
frame.add( but1 );
eingabezeile1 = new JTextField("Hier kann man schreiben...");
eingabezeile1.setBounds(220,10,200,30);
frame.add( eingabezeile1 );
textArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
textArea.setEditable(true);
scrollPane.setBounds(10,50,410,200);
frame.add(scrollPane);
but2 = new JButton("TextArea loeschen");
but2.setBounds(210,260,200,30);
but2.addActionListener(this);
frame.add( but2 );
lab1 = new JLabel("Informatik macht Spaß.");
lab1.setBounds(10,260,190,30);
frame.add(lab1);
public static void main() {
Startklasse sk = new Startklasse();
sk.zeigeFenster();
}
}
26.11.2021
Programm für heute:
• Abenteuer-Spielerweiterung abgeben
• Einblick in Java und BlueJ
public class Haupt {
public static void main() {
String a = javax.swing.JOptionPane.showInputDialog(null, "Name:");
System.out.println("Wert von a "+a);
System.out.println(Integer.parseInt(a) + 4);
}
}
Hausaufgabe zum 5.11.2021
Hier die Funktion, die das größte von drei Elementen herausfindet:
001 function maximum(a,b,c) {
002 var max =a;
003 if (max < b) {
004 max = b;
005 }
006 // max ist der größere Wert von a und b
007 if (max < c) {
008 max = c;
009 }
010 return max;
011 }
Beispiel für das tabellarische Abarbeiten einer Funktion:
meinArray = [6,5,8]; // so könnte die Funktion
myMax = arrayMaximum(meinArray); // arrayMaximum aufgerufen werden
001 function arrayMaximum(a) {
002 var momMax = a[0];
003 for(var i = 0; i < a.length; i++) {
004 if(a[i] > momMax) {
005 momMax = a[i];
006 }
007 }
008 return momMax;
009 }
Dein Name: <input id="eingabe" type="text"> <br>
<button onclick="gruss();">Klick!</button>
<div id="ausgabe">Es wurde noch nichts erzeugt!</div>
</body>
</html>
4. Klausurthemen:
Klausurthema: JavaScript-Programmierung:
* Variablen, Wertzuweisungen
* if-Anweisungen und Bedingungen incl. else-Block
* for-Schleife
* Handhabung von Strings (Zeichenketten)
* Handhabung von Arrays
* Funktionen: Eingabeparameter ("Argumente") und Rückgabewerte
* Korrektes Einrücken von Programmen
* Wie man Programmabläufe aufschreiben kann: 00000000_036_IF11_Programmausfuehrung_auf_Papier_pro_JavaScript.pdf
Vertiefte HTML-Kenntnisse werden nicht verlangt. Der Aufbau unseres Standard-Dokuments muss aber geläufig sein. Man muss verstehen, dass man beim Klick auf einen Button eine JavaScript-Funktion aufruft, die auch Benutzereingaben verarbeiten kann.
5. Ideen für kleine Algorithmen:
* Zufall(z) (Eingabe: ganze, positive Zahl z / Return: ganze Zufallszahl im Bereich von 0 bis z-1 )
* Maximum(z1,z2) bzw. Minimum (z1,z2) (Return: Zahl)
* Maximum(z1,z2,z3) bzw. Minimum (z1,z2,z3) (Return: Zahl)
* Potenzieren(z1,z2) (Eingabe: Zahl z1 und ganze,positive Zahl z2 / Return: Ergebnis der Rechnung "z1 hoch z2")
* IstPrimzahl(z) (Eingabe: Ganze, positive Zahl z die auf Primzahleigenschaft untersucht wird / Return: true oder false)
* GanzzahligeWurzel(z) (Eingabe: Zahl z / Return: ganze Zahl w mit der Eigenschaft, dass w*w <= z und (w+1)*(w+1) > z )
* TeilbarDurch(z1,z2) (Überprüft, ob z1 duch z2 teilbar ist. Realisierung mit floor(z1/z2)*z2 == z1. / Return: true oder false)
* Divisionsrest(z1,z2) (Eingabe: zwei ganze positive Zahlen / Return: Der Rest bei der Division von z1 durch z2 )
* ArraySpannweite(arr) (Eingabe: Array mit Zahlen / Return: größtes Element minus kleinstes Element)
* ArrayMaximum(arr) bzw. ArrayMinimum(arr) (Eingabe: Array mit Zahlen / Return: größter bzw. kleinster Wert)
* ArrayRotiereLinks(arr) bzw. ArrayRotiereRechts(arr) (Eingabe: Array mit beliebigem Typ / Return: Array um 1 nach links rotiert)
* ArrayRotiereLinks(arr,n) (Eingabe: Array arr und ganze, positive Zahl n / Array wird nicht um eine, sondern um n Stellen nach links rotiert)
* ArrayShuffle(arr) (Eingabe: Array beliebigen Typs / Return: gemischtes Array)
* ArrayReverse(arr) (Eingabe: Array beliebigen Typs / Return: umgekehrtes Array)
// Liefert eine Zufallszahl im Bereich von 0 bis (anz-1)
// Argumente: anz (Typ: ganze, positive Zahl oder 0)
// Rueckgabe: z (Typ: ganze, positive Zahl oder 0)
function zufall(anz) {
var z = Math.random()*anz;
z = Math.floor(z);
return z;
}
// Findet das Maximum der beiden Zahlen z1 und z2
// Eingabe: z1 (Typ: Zahl) , z2 (Typ: Zahl)
// Rückgabe: (Typ: Zahl)
function maximum(z1,z2) {
var max;
if(z1 < z2) {
max = z2;
} else {
max = z1;
}
return max;
}
// Findet das Minimum der beiden Zahlen z1 und z2
// Eingabe: z1 (Typ: Zahl) , z2 (Typ: Zahl)
// Rückgabe: (Typ: Zahl)
function minimum(z1,z2) {
var min;
if(z1 > z2) {
min = z2;
} else {
min = z1;
}
return min;
}
// Rechnet "a hoch b"
// Eingabe: a (Typ: Zahl), b (Typ: ganze, positive Zahl)
// Rückgabe: (Typ: Zahl)
function potenz(a,b) {
var erg = 1;
for(var i = 0; i < b ; i++) {
erg = erg*a;
}
return erg;
}
// Überprüft, ob a duch b teilbar ist.
// Eingabe: a, b (Typ: ganze, positive Zahlen)
// Rückgabe: (true oder false)
function istTeilbarDurch(a,b) {
var teilbar;
var quotientOhneRest = Math.floor(a/b);
if((quotientOhneRest * b) == a) {
teilbar = true;
} else {
teilbar = false;
}
return teilbar;
}
// Untersucht die übergebene Zahl auf Primzahleigenschaft.
// Eingabe: z (Typ: ganze, positive Zahl)
// Rückgabe: (true oder false)
function istPrimzahl(z) {
var istPrim = true; // wir nehmen erst an, dass die Zahl Primzahl ist
// und suchen dann mögliche Teiler als Gegenbeweis
for(var i = 2; i < (z-1); i++) {
if(istTeilbarDurch(z,i)) {
istPrim = false;
}
}
if(z == 1) {
istPrim = false; // Sonderfall
}
return istPrim;
}
// Liefert einfach nur ein Array mit zufälliger Länge mit zufälligen Zahlen
// Rückgabe: (Typ: Array mit Zahlen)
function zufallsArray() {
var arrLen = zufall(10) + 4; // Mindestens 4, maximal 13
var erg = new Array(arrLen);
for(var i = 0; i < arrLen; i++) {
erg[i] = zufall(100); // Zufallszahlen zwischen 0 und 99
}
return erg;
}
// Findet das größte Element im Array
// Eingabe: a (Typ: Array mit Zahlen)
// Rückgabe: (Typ: Zahl)
function arrayMaximum(a) {
var momMax = a[0];
for(var i = 0; i < a.length; i++) {
if(a[i] > momMax) {
momMax = a[i];
}
}
return momMax;
}
// Funktion, die unsere Algorithmen testet
function ausgabeFunktion() {
var ausgabe = "";
var a = Math.floor(Math.random() * 100); // Zahl von 0 bis 99
var b = Math.floor(Math.random() * 100); // Zahl von 0 bis 99
var c = Math.floor(Math.random() * 5)+1; // Zahl von 1 bis 5
var d = zufallsArray();
ausgabe = ausgabe + "Maximum von "+a+" und "+b+" ist:"+maximum(a,b)+"<br>";
ausgabe = ausgabe + "Minimum von "+a+" und "+b+" ist:"+minimum(a,b)+"<br>";
ausgabe = ausgabe + "Berechnung von "+a+" hoch "+c+": "+potenz(a,c)+"<br>";
ausgabe = ausgabe + "Ist "+a+" durch "+c+" teilbar? "+istTeilbarDurch(a,c)+"<br>";
ausgabe = ausgabe + "Ist "+a+" eine Primzahl? "+istPrimzahl(a)+"<br>";
ausgabe = ausgabe + "Vom Array ["+d.toString()+"] ist das Maximum: "+arrayMaximum(d)+"<br>";
Dein Name: <input id="eingabe" type="text"> <br>
<button onclick="ausgabeFunktion();">Klick!</button>
<div id="ausgabe">Es wurde noch nichts erzeugt!</div>
// Erzeugt ein Fabelwesennamen mit dem angegebenen grammatischen Geschlecht.
// Das Geschlecht muss eine der folgenden Zeichenketten sein:
// Entweder "m" oder "w" oder "n".
// Argumente: genus (Typ: Zeichenkette)
// Rueckgabe: (Typ: Eine Zeichenkette)
function fabelwesen(genus) {
var erstworte =["Zauber","Fabel","Horror","Flug","Schleim"];
var zweitworte;
if(genus == "m") {
zweitworte = ["vogel","yeti","ork"];
}
if(genus == "w") {
zweitworte = ["fee","hexe","furie","bestie"];
}
if(genus == "n") {
zweitworte = ["orakel","hirn"];
}
var erstwort = erstworte[zufall(erstworte.length)];
var zweitwort = zweitworte[zufall(zweitworte.length)];
return erstwort+zweitwort;
}
// Erzeugt einen kompletten Satz.
// Argumente: -
// Rueckgabe: (Typ: Zeichenkette)
function satz() {
var f1 = fabelwesen("m");
var f2 = fabelwesen("w");
var schablonen = ["Ich glaube, ich sehe ein "+f1 , "Wenn der "+f1+" auch noch die "+f2+" gesehen hätte, hätte es ein Unglück gegeben!"];
return schablonen[zufall(2)];
}
// Liefert eine Zufallszahl im Bereich von 0 bis (anz-1)
// Argumente: anz (Typ: ganze, positive Zahl oder 0)
// Rueckgabe: z (Typ: ganze, positive Zahl oder 0)
function zufall(anz) {
var z = Math.random()*anz;
z = Math.floor(z);
return z;
}
</script>
<noscript>
Sie haben JavaScript deaktiviert.
</noscript>
</head>
<body>
<p>Minimalbeispiel für JavaScript</p>
function zufall(anz) {
var z = Math.random()*anz;
z = Math.floor(z);
return z;
}
</script>
<noscript>
Sie haben JavaScript deaktiviert.
</noscript>
</head>
<body>
<p>Minimalbeispiel für JavaScript</p>
function aendereText() {
var rdm;
var gesamterText = document.getElementById('textteil').textContent;
var letzteZeile;
var naechsteZeile;
var neuerText;
naechsteZeile = "";
// Jedes Pixel der letzten Zeile besuchen
for(var i = 0; i < letzteZeile.length; i++) {
// Nachbarschaften inc. Randbedingungen ermitteln
var ln = letzteZeile.charAt((i-1)%zeilenlaenge);
var mn = letzteZeile.charAt(i);
var rn = letzteZeile.charAt((i+1)%zeilenlaenge);
// Regel .....
var nn = ".";
if(ln == "#" && mn == "#" && rn == "#") {
nn = ".";
}
// hier fehlt etwas
• Bewertungskriterien: Qualität der Mitarbeit, (ggf. auch Quantität, falls themenbezogen), Fachsprache, Selbständigkeit, bei Hausaufgaben: Ernsthafte Ansätze müssen erkennbar sein.
• Bitte einen USB-Stick anschaffen
• Wer hat Zugriff auf einen PC mit Tastatur und Maus? Vorkenntnisse?
Grundlagen Windows
• Erstelle auf dem Desktop ein Verzeichnis mit dem Namen "Informatikhelden"
• Erstelle ein Dokument (ein einfacher Kurztext wie "Hallo Informatik" genügt) in der Textverarbeitungssoftware "Open-Office" und speichere es ab in dem Ordner "Informatikhelden"
• Erstelle ein Dokument in dem Programm "Notepad" oder "Notepad++" (beides auf dem Desktop zu finden) mit dem gleichen Text wie in der vorigen Aufgabe. Auch Dieses Dokument soll wieder in dem Verzeichnis "Informatikhelden" abgespeichert werden.
• Schaue Dir den Inhalt des Ordners "Informatikhelden" mit dem Datei-Explorer an und erkläre, welche Unterschiede die beiden abgespeicherten Dateien besitzen.
• Tastaturtraining: Erstelle in Notepad++ eine Kopie von folgendem kleinen Bärchen:
• Kopiere dieses Bärchen in das Open-Office-Dokument hinein und erkläre, warum die Grafik nicht mehr schön aussieht.
• Daten im Zahlenformat anzeigen Dafür gibt es z.B. einen Dienst im Internet: https://hexed.it/ Betrachte die txt-Datei und die odt-Datei mit diesem Programm
• Wie funktioniert ein QR-Code?
• Ein IPhone12 Pro aus dem Jahr 2020 besitzt 6 Gigabyte RAM. Wie groß müsste ein QR-Code (Pixelgröße 1mm) sein, der diese Datenmenge speichern könnte?
• Lösche das Verzeichnis "Informatikhelden". Sind die Daten wirklich weg?