kramann.info
© Guido Kramann

Login: Passwort:










Archiv
2 SoSe2022
..2.1 MIK
..2.2 SRT
..2.3 HDL
..2.4 AUT
..2.5 SLE
2 WS2020_21
..2.1 RTS
....2.1.1 day_by_day
..2.2 IE
....2.2.1 day_by_day
..2.3 ES
..2.4 EFSEE
....2.4.1 day_by_day
..2.5 KF
....2.5.1 day_by_day
....2.5.2 Haikus
....2.5.3 Haikus_en
..2.6 CC
....2.6.1 day_by_day
2 WS2021_22
..2.1 RTS
....2.1.1 day_by_day
....2.1.2 Versuch002
....2.1.3 Versuch003
....2.1.4 Versuch004
....2.1.5 Versuch005
....2.1.99 Material
..2.2 FTS
....2.2.1 day_by_day
..2.3 ESY
....2.3.1 day_by_day
..2.4 INFmecha5
....2.4.1 day_by_day
..2.5 REGmecha5
....2.5.1 day_by_day
2 WS2023_24
..2.1 day_by_day_RST
..2.2 day_by_day_SRT
..2.3 day_by_day_FTS
..2.4 day_by_day_KF
3 SoSe2021
..3.1 STR
....3.1.1 day_by_day
..3.2 SLE
....3.2.1 day_by_day
..3.3 HDL
....3.3.1 day_by_day
..3.4 MIK
....3.4.1 day_by_day
3 SoSe2024
..3.1 Mik_21_03_2024
..3.2 Mik_04_04_2024
..3.3 Mik_11_04_2024
..3.4 Mik_18_04_2024
..3.5 Mik_25_04_2024
..3.6 Mik_02_05_2024
..3.7 Mik_16_06_2024
..3.8 Mik_23_05_2024
..3.9 Mik_30_05_2024
..3.10 Mik_05_06_2024
..3.11 Mik_13_06_2024
3 WS2022_23
..3.1 day_by_day_RST_3MB
..3.2 day_by_day_RT2_5MT
..3.3 day_by_day_EMB_7MT
..3.4 day_by_day_ABP_7MT
..3.5 day_by_day_FTS_MMB
..3.6 day_by_day_KF
4 SoSe2023
..4.2 RTS_day_by_day
..4.3 MIK_day_by_day
..4.4 AUT_day_by_day
..4.5 HDL_day_by_day
4 WS2024_25
..4.1 ING_day_by_day
....4.1.1 ING_Do_26_09_2024
....4.1.2 ING_Do_10_10_2024
....4.1.3 ING_Do_17_10_2024
....4.1.4 ING_Do_24_10_2024
....4.1.5 ING_Do_07_11_2024
....4.1.6 ING_Do_14_11_2024
....4.1.7 ING_Do_21_11_2024
....4.1.8 ING_Do_28_11_2024
....4.1.9 ING_Do_05_12_2024
....4.1.10 ING_Do_12_12_2024
....4.1.11 ING_Do_19_12_2024
..4.2 INF_day_by_day
....4.2.1 INF_Fr_27_09_2024
....4.2.2 INF_Fr_04_10_2024
....4.2.3 INF_FR_18_10_2024
....4.2.4 INF_Fr_25_10_2024
....4.2.5 INF_Fr_08_11_2024
....4.2.6 INF_Fr_15_11_2024
....4.2.7 INF_Fr_22_11_2024
....4.2.8 INF_Fr_29_11_2024
....4.2.9 INF_Fr_06_12_2024
....4.2.10 INF_Fr_13_12_2024
....4.2.11 INF_Fr_20_12_2024
....4.2.12 INF_Fr_10_01_2025
..4.3 FTS_day_by_day
....4.3.1 FTS_Mi_25_09_2024
....4.3.2 FTS_Mi_02_10_2024
....4.3.3 FTS_Mi_09_10_2024
....4.3.4 FTS_Mi_16_10_2024
....4.3.5 FTS_Mi_23_10_2024
....4.3.6 FTS_Mi_30_10_2024
....4.3.7 FTS_Mi_06_11_2024
....4.3.8 FTS_Mi_13_11_2024
....4.3.9 FTS_Mi_20_11_2024
....4.3.10 FTS_Mi_27_11_2024
....4.3.11 FTS_Mi_04_12_2024
....4.3.12 FTS_Mi_11_12_2024
....4.3.13 FTS_Mi_18_12_2024
6 Ing
..6.1 Bauplan
....6.1.1 Bootstick
....6.1.2 Xubuntu
....6.1.3 Webserver
....6.1.4 Hotspot
....6.1.5 Videostream
....6.1.6 Lampe
....6.1.7 Chassis
....6.1.8 Akku
....6.1.9 Motore
....6.1.10 Laborsteckboard
....6.1.11 Antriebstest
7 007
..7.1 Einschalten
..7.2 Vorversuche
kramann.info
© Guido Kramann

Login: Passwort:




Inhalte zur Vorlesungswoche #9, Informatik 1 im Wintersemester 2024/25

(EN google-translate)

(PL google-translate)

Themen

  1. Organisatorisches: Termin für Probe-E-Test festlegen
  2. Exkurs zu Java/Processing: Schneeflocken fangen
  3. Genetische Algorithmen: Eine Optimierungsmethode, die auch bei stark zerklüfteten Suchbereichen funktioniert
  4. Zahlen raten mit Genetischer Optimierung

1 Organisatorisches: Termin für Probe-E-Test festlegen

2 Exkurs zu Java/Processing: Schneeflocken fangen

Ohne die Möglichkeit, grafische Elemente darzustellen und unmittelbar Benutzerinteraktion zu erfassen, ist es schwierig ein Hit-And-Run-Spiel zu programmieren. Um das angestrebte Spiel einmal vollständig zu sehen, wurde es nachfolgend mit Java/Processing umgesetzt.

Die Gelegenheit wird genutzt, einmal einen Blick auf eine andere Programmiersprache zu werfen.


Was ist Java? -- 36_Java

Erste Schritte mit Processing -- 78_Processing/02_Erste_Schritte
Quelltext SchneeflockenFangen als (Java-)Processing-Sketch
import java.util.Random;

Random zufall = new Random(System.currentTimeMillis());
ArrayList<int[]> flocken = new ArrayList<int[]>();

int xpos;
int COUNTDOWN = 900;
int PUNKTE = 0;
public void setup()
{
    size(500,500);     //Fenstergröße festlegen
    frameRate(30);     //Bildwiederholgeschwindigkeit für draw()
    textAlign(CENTER); //Koordinatenposition von Texten nach Mitte ausrichten 
    textSize(20);      //Größe der Schneeflocken
    xpos = width/2;    //Position des "Frosches"
}

public void draw()
{
    background(0); //schwarzer Hintergrund
    
    //Frosch einzeichnen an Position xpos:
    stroke(0,255,0); //Zeichenfarbe grün
    strokeWeight(5.0); //Dicke Linie
    noFill(); //nicht ausfüllen
    ellipse(xpos,height-60,30,30);//Kreis
    
    //Punktestand und Restzeit anzeigen:
    fill(255);
    noStroke();
    text(COUNTDOWN,width-40,30);
    text("SCORE:"+PUNKTE,60,30);

    //Spiel läuft, solange Countdown nicht abgelaufenn ist
    if(COUNTDOWN>0)
    {
      //jeden fünften Durchlauf der draw-Methode eine Schneeflocke hinzufügen:
      if(COUNTDOWN%5==0)
          flocken.add(new int[] {zufall.nextInt((int)width),-20});
      for(int i=flocken.size()-1;i>=0;i--)
      {
        int[] arr = flocken.get(i);
        arr[1]+=2;
        if(arr[1]>(int)(height+20))//Schneeflocken zu weit unten entfernen
        {
           flocken.remove(i);
        }   
        else if((arr[0]/8)==(xpos/8) && (arr[1]/8)==((width-60)/8))
        {
           //Schneeflocken im Froschfokus entfernen und Punkte erhöhen
           flocken.remove(i);
           PUNKTE++;
        }   
        text("*",arr[0],arr[1]);
      }
      COUNTDOWN--;
    }    
}

//Callback-Funktion, die auf die Pfeiltasten reagiert
public void keyPressed()
{
    if(key == CODED)
    {      
      if(keyCode == LEFT) 
      {
          xpos-=4;
      }
      if(keyCode == RIGHT) 
      {
          xpos+=4;
      }
    }
}

Code 0-1: Quelltext SchneeflockenFangen als (Java-)Processing-Sketch

Screenshot zu SchneeflockenFangen.

Bild 0-1: Screenshot zu SchneeflockenFangen.

3 Genetische Algorithmen: Eine Optimierungsmethode, die auch bei stark zerklüfteten Suchbereichen funktioniert


50_Simulationstechnik/07_Genalgorithmus

4 Zahlen raten mit Genetischer Optimierung

Saalübung auf Papier und anschließende Programmentwicklung im Unterricht.

**** ÜBUNGSAUFGABEN ****

AUFGABE 1

Schreiben Sie ein zu dem Flussdiagrammen passendes Programm:

Countdown.

Bild 0-2: Countdown.


AUFGABE 2

  • Kontrollstrukturen regeln den Programmfluss.
  • Abhängig von bestimmten Bedingungen, können bestimmte Code-Teile verarbeitet, oder übersprungen werden.
  • Nachfolgend sind einige Kontrollstrukturen in C/C++ aufgeführt:

//if-Anweisung
if(x>7)
{
    cout<<"x ist groesser als 7."<<endl;
}

//while-Schleife
while(x<5)
{
   x++; //Postinkrement-Operator, erhöht x um +1. 
   cout<<"x="<<x<<endl;
}

//for-Schleife
for(int i=0;i<5;i++)
{
   cout<<"i="<<endl;
}

//do-while-Schleife
do
{
   x++;
   cout<<"x="<<x<<endl;
}while(x<5);


Code 0-2: Kontrollstrukturen

  • Kontrollstrukturen besitzen als Argument einen Ausdruck, dessen Ergebnis ein boolscher Wert ist (true oder false).
  • Je nachdem, welches Ergebnis das Argument liefert, werden die Befehle im Rumpf (geschweifte Klammern) der Kontrollstruktur ausgeführt, oder nicht, bzw. übersprungen.
  • Operationen, die boolsche Werte zum Ergebnis haben, sind Vergleichsoperatoren (<,>,==, also ist kleiner als, ist größer als, hat den gleichen Wert wie).
  • Betten Sie alle oben stehenden Kontrollsttrukturen jeweils in funktionierende Programm ein und testen diese.
  • Fertigen Sie ein Flussdiagramm von jedem dieser Programme an.

AUFGABE 3

  • Es macht Sinn, mehrfach mit jeweils verschiedenen Werten ausgeführte Berechnungsvorschriften in Funktionen auszulagern.
  • Dies führt zu übersichtlicherem Quelltext und wiederverwendbaren Strukturen.
  • Insbesondere können nützliche Funktionen in Header-Dateien ausgelagert werden.
  • Eigene Haeder-Dateien können in das Hauptprogramm mit #include "meinefunktion.h" eingebettet werden, wobei meinefunktion.h dann eine Funktion ist, die im gleichen Verzeichnis liegt, wie das Hauptprogramm.
  • Beispiel:
double findeMaximum(double *array, int anzahl)
{
    double ergebnis = array[0];
    for(int i=1;i<anzahl;i++)
    {
        if(array[i]>ergebnis)
        {
            ergebnis = array[i];
        }
    }
    return ergebnis;
}

Code 0-3: maximum.h

#include <iostream>
#include "maximum.h"
using namespace std;
int main(void)
{
    double array[] = {-0.5,3.7,-1.5,2.5,7.3,2.1,3.0};
    int anzahl = sizeof(array)/sizeof(double); //Bestimmung der Anzahl der Array-Elemente

    cout<<"Array: ";
    for(int i=0;i<anzahl;i++)
    {
        cout<<" "<<array[i];
    }
    cout<<endl;

    cout<<"Groesstes Element:"<<findeMaximum(array,anzahl)<<endl;

    return 0;
}

Code 0-4: hauptprogramm.cpp

linux@Xubuntu2004:~/Programm5_LV4_15_April$ g++ -o hauptprogramm hauptprogramm.cpp 
linux@Xubuntu2004:~/Programm5_LV4_15_April$ ./hauptprogramm 
Array:  -0.5 3.7 -1.5 2.5 7.3 2.1 3
Groesstes Element:7.3

Code 0-5: Konsolen Ein- und Ausgaben

  • Ergänzen Sie mit minimum.h eine Funktion, die das Minimum bestimmt und testen sie in dem Hauptprogramm.

Aufgabe3.zip -- studentische Lösung.

AUFGABE 4

  • Schreiben Sie ein Programm, bei dem als Input ein Widerstandswert als Zahl eingegeben wird und das dann den zugehörigen Zahlencode bei Widerständen mit drei Ringen ausgibt.
  • Beispiele: 100 Ohm => braun schwarz braun, 47000 Ohm => gelb lila orange, 2200 Ohm => rot rot rot
  • Dabei gibt der erste Ring den Zehner, der zweite den Einer an und der dritte eine Zehnerpotenz, womit diese Zahl multipliziert wird.
  • Eine entsprechende Tabelle findet sich beispielsweise auf Wikipedia:
Farbkodierung von Widerständen mit 3 oder 4 Ringen, Quelle: Wikipedia, https://de.wikipedia.org/wiki/Widerstand_(Bauelement)#Farbkodierung_auf_Widerst%C3%A4nden

Bild 0-3: Farbkodierung von Widerständen mit 3 oder 4 Ringen, Quelle: Wikipedia, https://de.wikipedia.org/wiki/Widerstand_(Bauelement)#Farbkodierung_auf_Widerst%C3%A4nden

  • Implementieren Sie auch den umgekehrten Fall, bei dem Farbcodes eingegeben werden und der zugehörige Widerstandswert in Ohm daraus bestimmt und ausgegeben wird.

#include <iostream>
using namespace std;
int main(void)
{
    char farben[][100] = {
       "schwarz", //index 0
       "braun",    //index 1
       "rot",      //index 2
       "orange",    //index 3
       "gelb",     //index 4
       "gruen",    //index 5
       "blau",     //index 6
       "violett",   //index 7
       "grau",   //index 8
       "weiss"   //index 9
    };

    int wert;
    cout<<"Geben Sie den Widerstandswert in Ohm ein:"<<endl;
    cin>>wert;

    int potenz = 0;
    while(wert>=100)
    {
        wert/=10;  // identisch zu wert = wert/10;
        potenz++;  // identisch zu potenz = potenz+1;
    }

    cout<<"potenz="<<potenz<<endl;

    //Jetzt die Ziffern extrahieren:
    int ziffer_zwei = wert%10;
    int ziffer_eins = wert/10;

    cout<<"ziffer_zwei="<<ziffer_zwei<<endl;
    cout<<"ziffer_eins="<<ziffer_eins<<endl;

    cout<<"Die Farbringe sind:"<<endl;

    cout<<farben[ziffer_eins]<<" "<<farben[ziffer_zwei]<<" "<<farben[potenz]<<endl;

    return 0;
}

Code 0-6: Musterlösung.

AUFGABE 4b

  • Geheimsprachen, die durch das Ersetzen von Buchstaben funktionieren, lassen sich durch statistische Analyse entschlüsseln:
  • Bestimmte Buchstaben in einer Sprache treten mit einer bestimmten Häufigkeit auf.
  • Der Buchstabe e taucht im deutschen Texten am häufigsten auf.
  • Nachfolgendes Programm bestimmt die Anzahl des Buchstabens e, bzw. E in mehreren Sätzen.

Analysieren, kompilieren und testen Sie folgenden Quelltext:

#include <iostream>
using namespace std;

double bestimmeHaeufigkeitE(char satz[])
{
    int anzahlE=0;
    char c;
    int index=0;
    do
    {
        c=satz[index++];
        if(c=='e')
            anzahlE++;
        else if(c=='E')
            anzahlE++;
    } while(c!='');
    return anzahlE;
}

int main(void)
{
    char texte[][100] = {
        "Das ist ein Satz.",
        "Das ist ein weiterer Satz.",
        "Dieser Satz ist relativ lang."
    };
    int anzahlTexte = sizeof(texte)/sizeof(texte[0]);
    for(int i=0;i<anzahlTexte;i++)
        cout<<texte[i]<<" ... hat "<<bestimmeHaeufigkeitE(texte[i])<<" E(s)."<<endl;
    return 0;
}

Code 0-7: ue4b.cpp

  • Beachten und versuchen Sie sich klar zu machen, wie anzahlTexte bestimmt wird.
  • Modifizieren Sie die Funktion so, dass nun die Anzahl von e bzw. E in Prozent zurück gegeben wird, wobei Leerzeichen unberücksichtigt bleiben sollen.
  • Modifizieren Sie die Funktion so, dass nun auch die Häufigkeit beliebiger Zeichen in Prozent zurück gegeben wird, indem das jeweilige Zeichen mit übergeben wird. Jetzt aber enfällt die gleichzeitige Berücksichtigung von Gross- und Kleinschreibung.
  • Gehen Sie schließlich erneut auf das ursprüngliche Programm zurück und modifizieren es so, dass nun nur vom Benutzer ein einzelner Satz zur Analyse eingegeben wird.

AUFGABE 5 == AUFGABE 4 von letzter Woche


Siehe "Aufgabe 4 -- Neuronales Netz " hier: 04_WS2024_25/02_INF_day_by_day/08_INF_Fr_29_11_2024

AUFGABE 6

Nehmen Sie sich den Processing-Sketch zum Schneeflockensammeln vor und entwickeln das Programm weiter. Sie könnten beispielsweise...

  • ... die Grafik verbessern (richtiger Frosch),
  • ... eine Möglichkeit suchen, den bisher überhaupt erreichten höchsten Punktestand von einem Spiel zum nächsten zu merken (Hieghscore),
  • ... Geräusche ergänzen,
  • ... eine Spielvariante selber programmieren,
  • ...

Siehe oben Quelltext "Code 0-1: Quelltext SchneeflockenFangen als (Java-)Processing-Sketch".