Aufgaben

** 4. Juni **
Nun denn, heute sollte alles funktionieren. Vielleicht. Wir werden mit Lego Mindstorm loslegen. Hier einige wichtige Links sowie Files:
Manual: http://pks.wikidot.com/local--files/aufgaben/robi.pdf (vor allem Seite 5)
Link1 zum File: http://www.educatec.ch/doc/documentation/ROBOLAB_Einf./file/
Link2 einige Aufgaben: http://maven.smith.edu/~streinu/Teaching/Courses/SSSP/Summer00/inventor.htm
Link3 neueres aus dem Legoland: http://www.lernklick.ch/lego_robolab.htm

Es gilt, mehrere Aufgaben zu lösen. Im Begleitmaterial gibt es einige witzige Konstruktionen. Dennoch, Grundlagen gibt es immer wieder. Also: zuerst die folgenden Aufaben lösen, danach eine Konstruktion erstellen, welche eine beliebige Aufgabe löst.

  • Bsp. 1: Fahrzeug 10 s fahren lassen auf Energiestufe 4
  • Bsp. 2: Endlosschleife programmieren: 3 s fahren, 3 s stoppen
  • Bsp. 3: Ein Quadrat abfahren
  • Bsp. 4: Lampe einschalten, wenn gegen ein Hindernis gefahren wird
  • Bsp. 5: Lampe ausschalten, wenn der Untergrund sich plötzlich ändert
  • Bsp. 6: Das gleiche wie Aufgabe 5, jedoch Bewegunsrichtung ändern, sollte sich der Untergrund ändern
  • Bsp. 7: Der Robotor fährt selbstständig auf einem Tisch rum und fällt nicht vom Tisch runter.

.
.

** 12. Mai **
Anwendungen aus der Informatik: Sortierprobleme sowie 'Game of Life'. Dazu Theorie und Praxis.

.
.

** 5. Mai **
lange angekündigt … LEGO. Leider gibt es technische Probleme. :-(.
Als Schmackerl aber ein auf den ersten Blick langweiliges Thema. Sortieralgorithmen. Viele Übungen und ein gemeinsames erarbeiten eines Kapitels aus dem Buch 'Abenteuer Informatik' von Jens Gallenbacher.

.
.

** 2. April **
Wiederum … hier das aktuelle file:
http://pks.wikidot.com/local--files/aufgaben/4gewinnt_komplette_version.html
Hinweis:

  • das File enthält noch bugs … so reagiert es zum Beispiel allergisch, wenn ein Stein an der 8. Stelle eingesetzt werden möchte
  • das layout des Brettes ist noch ziemlich rudimentär
  • im nächsten Schritt gilt es, eine Logik zu entwicklen, wie denn getestet werden könnte, ob eine 'Vierer'-Sequenz vorhanden ist.

.

26. März
Das aktuelle File ist hier: http://pks.wikidot.com/local--files/aufgaben/4gewinnt_abgespeckte_version.html.
Aufgaben:

  • Test für den Input fortsetzen
  • Langsam wird das Spiel ein Spiel: der Computer soll Züge machen. In einem ersten Schritt soll der Computer auf die Eingabezüge des Spielers x mit Zufallszügen antworten.
  • Erste Ideen entwickeln, wie denn getestet werden könnte, ob nun eine Vierersequenz vorhanden ist. Als Start nur ein Test, ob eine vertikale oder horizontale Reihe vorhanden ist

.

** 19. März **
Das aktuelle file kann (http://pks.wikidot.com/local--files/aufgaben/4gewinnt4.html) hier runtergeladen werden. Inhalt: eine einfache Lösung zur Gravitiy-Funktion.
Aufgaben … wie bisher, noch nicht eine gute Schlussvariante …

  • gravitiy-funktion … genau überlegen, was denn wirklich gebraucht wird. Eigentlich braucht es nicht einmal den igravitiyarray. !!!
  • Für die beiden Spieler müssen verschiedene Symbole auf dem Spielbrett erscheinen. Auch hierzu … genau überlegen, wo denn alles gespeichert wird
  • Test für den input machen
  • schöneres Spielbrett … (html!)

.

** 12. März **
Erste Lösung einer 'gravitiy'-Funktion:

//    beste (....) lösung für die gravitiy-funktion .... es braucht eigentlich gar keine ... ! ein array mit den angaben, wieviele
//    steine pro spalte vorhanden ist genuegt eigentlich !!!!

var igravitiyarray = new Array(ispalte);    //    + rst

// initialisierung ....

for (var i = 0; i < ispalte; i++) {
    igravitiyarray[i] = 0;         //    + rst
}

while (ifinish == 0 && izaehler <= 6) {
    ispalte1 = window.prompt("In welche Spalte soll der Stein gelegt werden? ", "")
//
//    input testen ... rueckgabewert 0: alles in ordnung, alles andere nicht in ordnung, entsprechender rueckgabewert machen.
//
//      itest = checkinput(ispalte1);     
//    
//    if (itest == 0) {
//
//    naechste zeile ist neu ... ganze idee hinter der gravitation ... 
//
            igravitiyarray[ispalte1] =  igravitiyarray[ispalte1] + 1 ;    // +rst
        izeile1 = igravitiyarray[ispalte1];                            //    +rst 
//        document.write("<br> ARRAY-wert von igravitiyarray= " + izeile1);        //    +rst

            writecBoard(ispalte1, izeile1, izaehler) ;
            izaehler++;
//    }
}

.

26. Februar resp. 12. März

Wie weiter …. :

  • Es gilt immer noch, eine 'gravitiy'-Funktion einzuführen … ABER: im Grunde genommen ist diese gar nicht nötig! Welche Information wird wirklich gebraucht? Im Plenum und selbstständig soll an dieser Aufgabe maximal noch eine halbe Stunde gearbeitet werden.
  • Einfacher sollte ein Test sein, welcher die Eingabe kontrolliert. Bisher wurden die Spaltenangaben einfach übernommen … ohne irgendwelche Tests. Ergänze die Funktion 'checkinput' und führe die notwendigen Tests durch. Aber welche? 'DAU'. Siehe auch:

http://de.selfhtml.org/javascript/beispiele/formulareingaben.htm#quelltext

  • Schwierig (Intellektuell) wird folgende Funktion sein: Wie kann erkennt werden, ob nun vier Steine in einer Reihe (horizontal, vertikal sowie diagonal) vorliegt. Vorgehen: zuerst soll nur eine horizontale sowie vertikale Anordnung erkennt werden.

.

12. Februar
Das Programm 4-gewinnt soll weiter entwickelt werden. Unten der aktuelle source-code.
Was gibt es als nächstes zu tun?

  • bisher muss dem Programm die Spalte sowie Zeile mitgegeben werden, wirklich notwendig ist aber nur die Spalte. Schreibe eine Funktion (gravity), welche dieses Feature behebt. Einige Schritte sind schon gemacht. Siehe dazu den Sourcecode an.
  • bisher wurden die Spaltenangaben einfach übernommen … ohne irgendwelche Tests. Ergänze die Funktion 'checkinput' und führe die notwendigen Tests durch. Aber welche? 'DAU'.
  • für zwischendurch: die Darstellung des Spielfeldes ist ziemlich rudimentär … schöner machen.

.
Und hier der aktuelle Sourcecode:

<html>
<head>
<title>Test</title>
<script type="text/javascript">

document.write( "<br> <br>########### vier gewinnt ##################### <br> <br>" );

// folgende dinge gilt es zu tun:
//      array 2-dimensional                                gemacht ...
//    fragen nach dem zug
//    ueberlegen, welcher zug waere zu tun
//    antwort

//     **********************************************************************************************************************
//     **********************************************************************************************************************

function clearMe()
{
  var _s=top;
  var _d=_s.document;
  _d.open();
  _d.write("");
  _d.close();
}

//     **********************************************************************************************************************
//     **********************************************************************************************************************
//    output
//    *****######----    * computer, # gegner, - leer
//    * * * * * # # # # # # - - - -

//    writecBoard macht einen Ascii-Print des aktuellen Spielfeldes
//    Achtung: das Spielfeld muss von oben-nach-unten ausgegeben werden

function writecBoard(ispalte1, izeile1, izaehler)
{
       Para = 'scrollbars=yes,resizable=yes,WIDTH=400,HEIGHT=500, screenX=100, screenY=30';

//     definiere das neues fenster mit einem namen ... hier 'neues_Fenster'

       neues_Fenster = window.open ('', 'fenster',Para);

//    bei jedem Aufruf dieses fenster soll der bisherige Inhalt geloescht werden ... voila:

       neues_Fenster.document.open();
       neues_Fenster.document.write('');
       neues_Fenster.document.close();

//     here we go ... neues fenster machen und Dinge reinschreiben

       neues_Fenster.document.open();
     neues_Fenster.document.write('<HTML><HEAD><TITLE></TITLE></HEAD><BODY>');
       neues_Fenster.document.write('<BR>');
       neues_Fenster.document.write("  aktueller Spielzug: " + izaehler);
       neues_Fenster.document.write("  <br>    ");
       neues_Fenster.document.write("  Neuer Zug bei Spalte " + ispalte1 + " zeile " + izeile1);

//    wichtiger schritt: fuelle das cboard mit den antworten ...

       cboard[izeile1-1][ispalte1-1] = '#';

//    also denn, zeichne das aktuelle spielfeld

       neues_Fenster.document.write("   aktuelles Spielfeld   <br> ")
       neues_Fenster.document.write("  <br>    ")
       neues_Fenster.document.write("  <br>    ")

    for (var i=4;  i >= 0; i--) {
        neues_Fenster.document.write(" &nbsp; &nbsp; &nbsp; zeile " + (i+1) + ": ");
        for (var j=0; j < 8; ++j) {
            neues_Fenster.document.write(cboard[i][j] + " ");
        }
        neues_Fenster.document.write("<br>");
        if (i == 0) {
            neues_Fenster.document.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
            for (var j=1; j <= 8; ++j) {
                neues_Fenster.document.write(j + " ");
            }
        }
      }
    neues_Fenster.document.write(" <br> ")
    neues_Fenster.document.write(" <br> ")

      neues_Fenster.document.write('</BODY></HTML>');
}

//     **********************************************************************************************************************
//     **********************************************************************************************************************
//
//    soll aufgrund des spaltenwertes als returnwert den zeilenwert liefern, bis wohin denn der stein fallen kann 
//
    function gravity(ispalte1) {
        var ibishierhin;    
//
//    ... an dieser stelle algorithmus
//
        ibishierhin = 1;    // dieser wert natuerlich voellig falsch
        return ibishierhin;
    }

//     **********************************************************************************************************************
//     **********************************************************************************************************************
//
//    some tests, if given input o.k.
//
    function checkinput(ispalte1){
        var iok;
        iok = 0;
//
//    an dieser stelle (einige) tests machen hinsichtlich des inputs, welche ????
//
        return iok;
    }

//     **********************************************************************************************************************
//
//    MAIN PROGRAMM ...
//
//    Definition des Spielfeldes ....
//    ispalte: anzahl felder in x-richtung (horizontal)
//    izeile: anzahl felder in y-richtung (vertikal) 
//    kreiere den 2-D-Array und fuelle ihn mit leeren werten: '-'
//    der Array sei folgendermassen definiert:
//
//        zeile 5: - - - - - - - -         ^ y (izeile)
//        zeile 4: - - - - - - - -         ¦
//        zeile 3: - - - - - - - -         ¦
//        zeile 2: - - - - - - - -         ¦
//        zeile 1: - - - - - - - -         ¦            
//               1 2 3 4 5 6 7 8        --------> x (ispalte)
//
//    HINWEIS: es waere auch moeglich, einen quadratischen Array zu gestalten, ABER: sehr viele Fehler ergeben sich bei
//        2-dimensionalen Arrays dadurch, dass die x resp. y-Koordinate verwechselt wird. Sehr schwer zu findende Fehler.
//
//
//        zeile 5: - - - - - - - -         
//        zeile 4: - - X - - - - -         
//        zeile 3: - - - - - - - -         
//        zeile 2: - - - - - - - -         
//        zeile 1: - - - - - - - -                     
//               1 2 3 4 5 6 7 8        
//
//
//    das feld in spalte 3 und in zeile 4 wird folgendermassen angesprochen: cboard[3][4]    waere foellig falsch ... nummerierung beginnt bei 0!
//            zeilennummer: 3, spaltennummer: 2 ... also korrekt: cboard[3][2] = '-';

var ispalte = 8;
var izeile = 5;
var cboard = new Array(ispalte);
for (var i = 0; i < izeile; ++i) {            // achtung: izeile    !!!!
  cboard[i] = new Array(ispalte);            // achtung: ispalte    !!!!
}

//    fuelle die Felder mit '-', initialisierung ...

for (var i=0;  i < izeile; ++i) {
    for (var j=0; j < ispalte; ++j) {
        cboard[i][j] = '-';
    }
}

// just for testing:

//    cboard[3][4] = 'a';
//    cboard[2][3] = 'b';
//    cboard[3][2] = 'c';

//     aufruf der print-funktion. Test, ob Spielfeld vernuenftig gefuellt ist.
//    writecBoard() ;

var izug = "";
var ifinish = 0;
var izaehler = 1;
var itest;

//     hier ist der eigentliche spiel-loop ...
//    aufruf eines popups, welcher nach dem zu setzenden stein macht
//    information einlesen, dann neues board anzeigen
//    compi gegenzug ausrechnen lassen

while (ifinish == 0 && izaehler <= 6) {
    ispalte1 = window.prompt("In welche Spalte soll der Stein gelegt werden? ", "")
    izeile1 = window.prompt("In welche Zeile soll der Stein gelegt werden? ", "")
//    itest = checkinput(ispalte1);    
//    izeile1 = gravity(ispalte1);        // auf diese art kann der rueckgabewert der funktion gravitiy in die variable
                            // izeile gefuellt werden.
    document.write("<br> returnwerte von gravitiy = " + izeile1);

    writecBoard(ispalte1, izeile1, izaehler) ;
    izaehler++;
}

</script>
</head>

</body></html>

.

8. Januar
Die Programmierung des 'vier-gewinnt-Spieles' geht weiter. Nach anfänglichen Problemen (…) sollte der Einstieg nun möglich sein. Folgende Gedanken sollten zu Beginn jeder grösseren Programmierung gemacht werden:
Analysieren des Problems! Mögliche Gedanken:

  • wie soll das Spielfeld dargestellt (eindimensionaler oder zweidimensionaler Array)
  • Eingabe der Spielzüge
  • Berechnung des nächsten Spielzuges (Abbrechen nach einer bestimmten Zeitdauer)

Es bietet sich an, die einzelnen (!) Probleme in kleinen, seperaten Files zu lösen und bei Erfolg in das grosse, komplette Programm zu integrieren. Bisher von den meisten vernachlässigt: Kommentarzeilen in das Programm einfügen. Später ist es oft nicht mehr klar, was denn programmiert wurde.

.

Einige technische Hinweise:
2-dimensionaler versus 1-dimensionaler Array:
Funktionsaufruf innerhalb eines Programmes:

document.write( "<br> <br>########### vier gewinnt ##################### <br> <br>" );

// folgende dinge gilt es zu tun:
//      array 2-dimensional
//    fragen nach dem zug
//    ueberlegen, welcher zug waere zu tun
//    antwort

//    output
//    *****######----    * computer, # gegner, - leer
//    * * * * * # # # # # # - - - -

//    writecBoard macht einen Ascii-Print des aktuellen Spielfeldes
//    Achtung: das Spielfeld muss von oben-nach-unten ausgegeben werden

function writecBoard() {
    document.write("   aktuelles Spielfeld   <br> ")
    document.write("  <br>    ")
    document.write("  <br>    ")

    for (var i=4;  i >= 0; i--) {
        document.write(" &nbsp; &nbsp; &nbsp; zeile " + (i+1) + ": ");
        for (var j=0; j < 8; ++j) {
            document.write(cboard[i][j] + " ");
        }
        document.write("<br>");
        if (i == 0) {
            document.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
            for (var j=1; j <= 8; ++j) {
                document.write(j + " ");
            }
        }
      }
    document.write(" <br> ")
    document.write(" <br> ")
}

//     **********************************************************************************************************************
//
//    Definition des Spielfeldes ....
//    ispalte: anzahl felder in x-richtung (horizontal)
//    izeile: anzahl felder in y-richtung (vertikal) 
//    kreiere den 2-D-Array und fuelle ihn mit leeren werten: '-'
//    der Array sei folgendermassen definiert:
//
//        zeile 5: - - - - - - - -         ^ y (izeile)
//        zeile 4: - - - - - - - -         ¦
//        zeile 3: - - - - - - - -         ¦
//        zeile 2: - - - - - - - -         ¦
//        zeile 1: - - - - - - - -         ¦            
//               1 2 3 4 5 6 7 8        --------> x (ispalte)
//
//    HINWEIS: es waere auch moeglich, einen quadratischen Array zu gestalten, ABER: sehr viele Fehler ergeben sich bei
//        2-dimensionalen Arrays dadurch, dass die x resp. y-Koordinate verwechselt wird. Sehr schwer zu findende Fehler.
//
//
//        zeile 5: - - - - - - - -         
//        zeile 4: - - X - - - - -         
//        zeile 3: - - - - - - - -         
//        zeile 2: - - - - - - - -         
//        zeile 1: - - - - - - - -                     
//               1 2 3 4 5 6 7 8        
//
//
//    das feld in spalte 3 und in zeile 4 wird folgendermassen angesprochen: cboard[3][4]    waere foellig falsch ... nummerierung beginnt bei 0!
//            zeilennummer: 3, spaltennummer: 2

var ispalte = 8;
var izeile = 5;
var cboard = new Array(ispalte);
for (var i = 0; i < izeile; ++i) {            // achtung: izeile    !!!!
  cboard[i] = new Array(ispalte);            // achtung: ispalte    !!!!
}

//    fuelle die Felder mit '-'

for (var i=0;  i < izeile; ++i) {
    for (var j=0; j < ispalte; ++j) {
        cboard[i][j] = '-';
    }
}

// just for testing:

cboard[3][4] = 'X';
cboard[2][3] = 'a';
cboard[3][2] = 'b';

//     aufruf der print-funktion. Test, ob Spielfeld vernuenftig gefuellt ist.

writecBoard() ;

.

Ein Blick auf den output zeigt, dass noch nicht alles perfekt ist:

vier1.jpg

Probleme ergeben sich vor allem mit einem genauen Abgleich der Spaltenzahlen mit den Feldern.
Frage 1: wie kann dies gelöst werden?
Frage 2: Wie kann nun also das Feld in Spalte 3, Zeile 4, angesprochen werden?


18. Dezember
Nach dem Programmieren von relativ langweiligen Aufgaben nun endlich eine Herausforderung: Spielprogrammierung. Als Einstieg möge 4 gewinnt sein. Das Grundprinzip sollte jeder kennen: Ordne Steine in vertikaler, horizontaler resp. diagonaler Anordnung derart an, dass sie eine Linie von mindestens 4 Steinen aufweisen.
Am Schluss dieser Aufgabe sollen alle 4 Gruppen gegeneinander antreten.

.
.

11. resp. 18. Dezember
Bevor die vorherige Aufgabe 11 gelöst werden kann, gilt es, einfache Zahlenmanipulationen durchzuführen. Viele sind vielleicht schon aus anderen Programmen wie z.B. Excel bekannt.
Unter http://de.selfhtml.org/javascript/objekte/math.htm sind Hinweise zu den verschiedenen Funktionen.
Unter http://die-glückspilze.de/blog/0611/01Lesen/javascript_ajax/06_zufall_001.htm ist ein interessanter Artikel zum Zufall zu lesen.

Also denn:

A) Runde die Zahl 4.77 auf 5 auf resp. runde sie auf 4 ab.

B) Runde die Note 4.71 auf Viertelnote (4.75), Halbnote (4.5) oder Ganznote (5.0)

C) Eine Zufallszahl zwischen 0 und 1 generieren lassen

D) Die Zufallszahl x zwischen 0 und 1 soll derart gerundet werden, dass die Werte zwischen
0.00 <= x < 0.25 als 1,
0.25 <= x < 0.50 als 2,
0.50 <= x < 0.75 als 3 und
0.75 <= x < 1.00 als 4 interpretiert werden.
Aufgabe D soll möglichst flexibel, das heisst ohne if-else-Abfragen programmiert werden!

E) Ein Würfel soll simuliert werden … das heisst, jeder 'Wurf' soll eine Zahl von 1 bis 6 liefern.

F) Zähle in 100'000 Würfen, ob die Zahlen 1, 2, … 6 gleichmässig verteilt sind.
Die Effizienz des Codes soll durch ein Timing berechnet werden. Siehe dazu auch
http://weblogs.asp.net/dneimke/archive/2003/09/23/28713.aspx
Was ist damit gemeint: Vor und nach zeitintensiven Operationen, z.B. Schleife über 100000 Iterationen,
wird folgender code gesetzt:

var startTime=new Date() ;
    for( var i = 0; i < 200000; i++ )
    {
       tu was
    }
    var endTime=new Date();
    document.write(" Zetidauer fuer loop = " + (endTime-startTime)) ;

G) Die Zahl pi soll gemäss folgender Formel berechnet werden:

pi.png

Es sollen die ersten hundert Stellen berechnet werden. Was fällt auf?

H) Aufgabe 11 sollte nun keinerlei Probleme bereiten.

.


20. November - 4. Dezember

Aller Anfang ist schwer … sehr schwer beim programmieren. Deshalb gibt es für heute einen Test, ohne Noten natürlich, einfach als Standortbestimmung. Schummeln ist blöde, und schliesslich ist dies ein Freifach.

Die Aufgaben werden das nächste Mal gemeinsam besprochen, jeder muss mindestens einmal seine Lösung vorstellen.

Die Lösungen am Schluss per email an steigerrainer ###at### kanti.ch senden.
Header: Name, im Anhang das entsprechende .html-file

Hinweis: die Umwandlung von Integer to Float oder umgekehrt erweist sich oftmals als Hürde. Neu: unter Allgemeins, Javascript gibts nun Hinweise, wie dies gemacht werden könnnte.

.

Das Lösungfile sollte folgenden Namen haben:

name_vorname.html Beispiel: steiger_rainer.html

Alle Aufgaben können innerhalb des gleichen Files gemacht werden. Lösungen sollen per document.write() ausgegeben werden. Beispiel:

document.write( "<br> <br>####### Aufgabe 1 … klein-gross ##### <br> <br>" );

code …

document.write("<br> String kleingeschrieben = " + stringklein);

document.write( "<br> <br>####### Aufgabe 2 … anzahl … ##### <br> <br>" );

.

Aufgaben
Aufgabe 1 - 4:
Ein gegebener String (z.B. 'Karl der Grosse lebte vor langer Zeit.') soll analysiert und zerpflückt werden. Aufgaben:
1) alles kleingeschrieben, alles GROSSGESCHRIEBEN
2) die Anzahl aller Buchstaben bestimmen, die Anzahl der Buchstaben 'e' bestimmen, die Anzahl Leerschläge
3) durch eine 'if' Abfrage soll geprüft werden, ob die Totalanzahl der Buchstaben grösser als 42 ist. Wenn ja, document.write(" mehr als 42 Buchstaben"); wenn nein document.write(" weniger als 42 Buchstaben");
4) der String soll automatisch rückwärts ausgegeben werden (kein document.write(".tiez regnal etc."); !)

.

5) In einem loop sollen die Zahlen von 1 bis 999 ausgegeben werden
6) Die beiden String x= 'James' und y = 'Bond' sollen als 'James Bond' ausgegeben werden (Leerschlag zwischen den beiden Strings! Stichwort 'concat'
7) Die Integerzahl 7 soll in den String 007 umgewandelt werden. Hinweis: siehe Allgemein, Javascript
8) In einem loop soll die Ausgabe 'James Bond 001', 'James Bond 002', 'James Bond 003' bis 'James Bond 999' gemacht werden.

.

9) kreiere einen Array x mit den Inhalten 'anna', 'hund', 'sugus', 'katze'
10) Es soll untersucht werden, welche Wörter innerhalb des Arrays x ('anna', 'hund', 'sugus', 'katze') vorwärts wie auch rückwärts das gleiche Wort ergeben
11) Die Inhalte des Arrays x sollen zufällig ausgegeben werden und statistisch ausgewertet werden. Vorgehen: Ein loop von 0 bis 10'000, jedesmal wird ein Element des Arrays ausgegeben und intern gezählt, wieviel Mal nun der Begriff anna, hund, sugus oder katze erscheint. Am Schluss eine Ausgabe mit einer kleinen Auswertung.

.



13. November
Das wirkliche Programmieren hat gar nicht begonnen … beim Programmieren geht es zuerst einen Idee zu finden, wie denn ein Problem denn gelöst werden kann, sprich: finde einen Algorithmus, der das Problem möglichst effizient löst. Das übersetzen in eine Programmiersprache ist dann oftmals nur noch ein technisches Problem, welches zwar auch sehr wichtig ist, aber sich natürlich von einer Programmiersprache zu einer anderen unterscheiden kann.

.

Algorithmus-Ideen nun für den Cäsar …

Problem: ersetze alle Buchstaben durch einen anderen Buchstaben.
Beispiel: aus dem Wort 'Hans' soll mit der Vorschrift

h -> i        a -> b         n -> s        s -> t

werden. Ein simples replace liefert jedoch nicht das erwünschte Resultat 'ibst' sondern vieleher ein 'ibtt'. Solche Probleme gilt es während des Entwickelns von Code zu bedenken und zu erkennen. Nun also, wie kann das Problem gelöst werden?? Algorithmus??

.

Wie kann den nun das Problem mit replace und dynamisch gelöst werden? Das Problem:

var teststring = 'rainer';
var string_to_be_replaced = 'r';
var new_string = 'xyz'
teststring.replace(/r/g, 'xyz');                             // funktioniert, Variante A
teststring.replace(/r/g, new_string);                            // funktioniert, Variante B
teststring.replace(/var string_to_be_replaced/g, new_string);           // funktioniert nicht, Variante C

Variante C wäre extrem praktisch, um die replace-Funktion innerhalb eines Loops auszurufen ….

Eine Websuche könnte auf folgende Seite führen:
http://www.drweb.de/javascript/search_replace.shtml (danke Rolf!).

.

Technisches:

.


6. November

Wir bleiben dem Cäsar treu, code entwickeln, verfeinern. Das Ziel ist es, einen eigenen Code zu schreiben, auch wenn das Kopieren von kompletten Lösungen von anderen Seiten auf den ersten Blick sehr viel einfacher und schneller ist. Der Lerneffekt bleibt aber bei null komma null.

Schritte welche gelöst werden sollten-müssten:

Chiffrierung:

  • kleinGROSS-Schreibung unterstützen? ja-nein … was spricht dafür-dagegen? Leerschläge? Zahlen?
  • ersetze alle z.B. A durch C etc. das Resultat muss in einem neuen String gespeichert werden. Wieso?

Dechiffrierung, schlau:

  • Textanalyse des chiffrierten Textes… wieviele Male kommt z.B. A etc. vor
  • Textanalyse eines nicht chiffrierten Textes: wieviele Male kommt z.B. E etc. vor
  • was kann daraus gefolgert werden?

Dechiffrierung, Brute Force:

  • selber drauf kommen

Was danach?
Wenn alles innerhalb eines fixen Files funktioniert, so Wert legen auf mehr Interaktivität. Das heisst, es sollte ein Formularfeld erzeugt werden, wo ich den zu chiffrierenden Text eingeben kann, Feld für den Schlüssel. Feld für chiffrierten Text.
Gleich sollte mit dem zweiten Teil verfahren werden: Dechiffrierung.

Hinweise:
Es gibt einen schwierigen Schritt, und zwar bei der replace-Funktion. Wenn diese dynamisch sein soll, das heisst, es ist beim code-erstellen noch nicht klar, was durch was ersetzt werden soll, so bieten sich 'Regular Expression', kurz RegEx an.

.


30. Oktober
Kryptographie
Nach den ersten Gehversuchen wird es langsam konkret. Als erste Anwendung soll ein Kryptographieprogramm geschrieben werden. Was ist denn überhaupt die Kryptographie? Aus wikipedia, 22.10.06:

Kryptografie bzw. Kryptographie (vom griechischen kryptós, „verborgen“, und gráphein, „schreiben“) ist im ursprünglichen Sinne die Wissenschaft der Verschlüsselung von Informationen („Geheimschriften“). Heutzutage beschäftigt sie sich allgemein mit dem Schutz von Daten durch deren Transformation, in der Regel unter Einbeziehung von geheimen Schlüsseln. Die Kryptografie bildet mit der Kryptanalyse zusammen die Kryptologie.

Im folgenden werden wir einen 'Cäsar' programmieren … viel Spass! Hinweis: unter der Rubrik 'links' sind ziemlich viele Einführungen zum Thema Kryptographie zu finden.

.

Also denn, wie sieht ein Pseudo-Algorithmus für den Cäsar aus?
Lösung gemeinsam erarbeiten …

  • über Dialogfeld für Text und Schlüssel den Text verschlüsseln
  • decodieren … Häufigkeitsanalyse eines Textes machen, dito für verschlüsselten Text oder brute-force
  • automatisch erkennen, ob Text entschlüsselt wurde

Das Ziel ist es, über einen Dialogtext einen Text zu verschlüsseln, code:
(aus http://de.selfhtml.org/javascript/sprache/objekte.htm#this)

<html><head><title>Test</title>
</head><body>
<form name="Eingabe">
<input type="text" name="Feld">
<input type="button" value="OK" onclick="alert(this.form.Feld.value)">
</form>
</body></html>

Mit dem Schlüsselwort this können Sie auf ein aktuelles Objekt Bezug nehmen. Im Beispiel wird ein Formular mit einem Eingabefeld und einem Button definiert. Wenn der Anwender auf den Button klickt, tritt der Seite Event-Handler onclick in Aktion, der als Attribut in dem HTML-Tag für den Button notiert ist. Im Beispiel wird in einem Meldungsfenster der Wert ausgegeben, den der Anwender in dem Eingabefeld eingegeben hat. Normalerweise würde der Befehl so notiert:
alert(document.Eingabe.Feld.value)
Da der Befehl jedoch innerhalb des Formulars steht, auf das er sich bezieht, dürfen Sie auch schreiben:
alert(this.form.Feld.value)

Wie sieht ein code denn aus, wenn noch Funktionen und weiteres im head-Teil definiert werden … (from http://de.selfhtml.org/javascript/sprache/funktionen.htm)

<html>
<head>
<title>Test</title>
<script type="text/javascript">
function PrimzahlCheck (Zahl) {
  var Grenzzahl = Zahl / 2;
  var Check = 1;
  for (var i = 2; i <= Grenzzahl; i++)
    if (Zahl % i == 0) {
      alert(Zahl + " ist keine Primzahl, weil teilbar durch " + i);
      Check = 0;
    }
  if (Check == 1)
    alert(Zahl + " ist eine Primzahl!");
}
</script>
</head>
<body>
<form name="PrimzahlFormular" action="">
<p>Geben Sie eine Zahl ein. Es wird geprüft, ob es sich um eine Primzahl handelt.</p>
<input type="text" name="Eingabezahl">
<input type="button" value="auf Primzahl checken"
onclick="PrimzahlCheck(document.PrimzahlFormular.Eingabezahl.value)">
</form>
</body>
</html>

23. Oktober
Debugging, Teil 1
Fehler und Programmieren ist fast ein Synonym, jedenfalls für Anfänger wie auch für Profis.
Aufgaben:

  • Unter Allgemeines, Javascript, Debugging sind allererste Hinweise wie denn Fehler gefunden werden können. Lesen!
  • eigene Beiträge in das Forum schreiben, ein howto befindet sich unter Forum, howto

.

Teil 2 … je nach Zeit
eigentlich Kryptographie, aber nun verschoben auf den 30. Oktober


25. September
Nach den ersten Schritten mit den Stringmanipulationen geht es weiter. Die Aufgaben vom 18. September abschliessen. Aufgabe an alle:

  • Im entsprechenden Schüler-Ordner die eigenen Lösungen hinschreiben. Vorgehen wie im Lehrer-Ordner.
  • Unter http://www.wikidot.com/doc:wiki-syntax#toc21 wird genau beschrieben, wie ein html-code sich in den wiki-syntax einbinden lässt. Stichwort 'Code Blocks'.
  • unter http://de.selfhtml.org/javascript/index.htm, Objektreferenz, Array finden sich wichtige Hinweise für die Benutzung von Arrays.
  • Hinweis Aufgabe 9, 'schöne' Printausgabe: es soll eine tabellarische Ausgabe gemacht werden, dermassen dass:
Gesamt Prozent
a 7 A 9 16 3.5%
b
..
z
  • eine weitere Tabelle soll die Resulatate sortiert vorstellen, z.B.
Gesamt Prozent
e 12 E 15 31 20.03 %
i
..
q 0 0 %

18. September
Egal, mit welcher Sprache programmiert wird, es gibt immer wieder die gleichen Probleme. Aus meiner Erfahrung gliedern sich die Probleme folgendermassen:

  • Stringmanipulation (Bsp. alle x durch ein y ersetzen in einem Wort)
  • Daten (Zahlen, Buchstaben) vernünftig speichern, zum Beispiel in einem Array
  • Daten einlesen resp. ausgeben
  • Algorithmus allgemein (Bsp. alle Primzahlen zwischen 2 und 1000)

Im folgenden werden zuerst die möglichen Stringmanipulationen genauer erörtert.
Als Testfile möge das stringfile.html dienen. Dies enthält eine Variable Teststring, welche es zu
verändern gilt. Als Helpseite möge http://de.selfhtml.org/javascript/objekte/string.htm dienen. Für weitere Fragen …: Internet! Hinweis: unter http://www.mozilla.org/projects/venkman/ gibts einen Debugger.

Aufgaben:

  1. ersetze alle "a" durch A
  2. ersetze alle " " (Leerschlag) durch "@@@"
  3. gib den Teststring nur mit Kleinbuchstaben oder Grossbuchstaben aus
  4. Welcher Buchstabe steht an der 3, 5, 45 Position? Welcher an der ersten-letzten Position?
  5. Bestimme die Anzahl der Wörter! Welches ist das 13. Wort?
  6. Gib in einem loop jeweils die buchstabenfolge a, ab, abc, abcd, …. bis zu abc..xyz aus. pro zeile eine buchstabenfolge
  7. Schreibe jedes Wort in eine neue Zeile.
  8. gib den Teststring rückwärts aus
  9. mache eine Analyse und zähle die Anzahl der Buchstaben a, b, c … z … A, B, C … Z. Die Printausgabe soll 'schön' sein.
  10. suche alle Wörter innerhalb des Teststringes, welche die Wortkombination "ei" enthalten und bestimme deren Anzahl

Die Lösungen sollen im Ordner Schüler (mit Angabe den Namens) hinterlegt werden.

Hier noch das Testfile


11. September
Nun denn, möge das Programmieren beginnen, eine gute Sprache ist javascript (dankeschön Andreas!). Vorteil: sie ist gratis, kein Compiler nötig, sie kann direkt mit einem Texteditor und einem Browser verwendet werden, der sprachliche Syntax ist identisch mit Actionscript.

Einstieg: unter http://www.galileocomputing.de/openbook/javascript/ gibt es ein ganzes Buch als Donwload, gratis!

Die Kapitel 2-4 geben einen sehr guten Start. Genau durchlesen … die Kapitel 3 und 4 werden in schriftlicher Form ausgegeben.

Unter selfhtml: http://de.selfhtml.org/javascript/ weitere Ideen.
Unter http://www.50links.de/javascript.html viele viele weitere Links

JavaScript ist Case-Sensitiv… unter http://lambda-the-ultimate.org/node/1114 gibts nen langen blog, eine endgültige Antwort steht aber noch aus.

Aufgaben: es sollen einfache Programme geschrieben werden, welche

  • eine String-Variable x und y aufweisen, diese in einem WRITE-statement wieder ausgeben
  • Integer-Variablen miteinander multiplizieren, addieren etc. und das Resultat wieder ausgeben
  • String-Variablen entweder alle klein oder gross ausgeben

Vorgehen: jeder Schüler hinterlegt auf dem Schülerordner jeweils verschiedene Files. Im Source-Code soll geschrieben werden,
was das JavaScript denn macht und was die Ausgabe sein sollte. Zudem sollen weitere Files hinterlegt werden, welche Fehler aufweisen … die Mitschüler sollen diese anschauen und debuggen …
Beispiele dieser Aufgabe sind im Schülerordner schon angelegt.


4. September

Es gilt, folgende Begriffe möglichst kurz und klar zu definieren. Diese Angaben sollten allgemein sein und sich nicht auf eine spezifische Programmiersprache beziehen. Nun also, die Begriff-Liste:

  • Array
  • Integer (-)
  • Real
  • Character
  • String (-)
  • loop (-)
  • condition (if … then) (-)
  • compiler (-)
  • boolean
  • integer arithmetic - real arithmetic
  • hierarchy of operations
  • intrinsic functions
  • debugging a program (-)
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.