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
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
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:
Bild 0-2: Countdown.
AUFGABE 2
|
//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
|
|
AUFGABE 3
|
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
|
Aufgabe3.zip -- studentische Lösung.
AUFGABE 4
|
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
|
#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
|
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
|
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...
|
Siehe oben Quelltext "Code 0-1: Quelltext SchneeflockenFangen als (Java-)Processing-Sketch".