added ws202425 courses

This commit is contained in:
2024-11-14 13:11:04 +01:00
parent 800282c2e8
commit beb31897b1
461 changed files with 20368 additions and 0 deletions
+29
View File
@@ -0,0 +1,29 @@
#include <iostream>
using namespace std;
int main(){
int n1 = 10;
int n2 = 20;
int n3 = n1/n2;
float f1 = 10;
float f2 = f1 + 10;
float f3 = f1/f2;
cout << "n3: " << n3 << endl;
cout << "f3: " << f3 << endl;
f3 += 3;
cout << "f3: " << f3++ << endl;
cout << "f3: mit postincr " << f3++ << endl;
cout << "f3: mit preincr " << ++f3 << endl;
bool comp1 = 2*5+5*2 == n2;
n2 = n2*2;
bool comp2 = 2*5+5*2 == n2;
bool comp3 = n3 < f3;
bool comp4 = comp1 && comp3 || comp2;
cout << "comp1, comp2, comp3, comp4: " << comp1 << ", " << comp2 << ", " << comp3 << ", " << comp4 << endl;
}
+54
View File
@@ -0,0 +1,54 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zur Kombination von zusammengesetzen Datentypen
*/
#include <iostream>
#include <vector>
#include <string>
enum class wohnart{HAUS,WOHNUNG};
struct person{
std::string name;
wohnart wa;
unsigned telefonnummer;
};
int main(){
// eine person hat unter anderem einen enum als Feld und kann in einem
// vector gespeichert werden
std::vector<person> telefonbuch = {};
for(unsigned i=0; i< 30; i++){
person p = {"Name"+std::to_string(i) , static_cast<wohnart>((3*i-1)%2), (i*300+23+i/2)};
telefonbuch.push_back(p);
}
person eintrag;
for(unsigned i= 0 ; i< telefonbuch.size(); i++){
eintrag = telefonbuch[i];
if(eintrag.wa == wohnart::HAUS){
std::cout << eintrag.name << " wohnt in einem Haus" << std::endl;
}
}
std::string query;
std::cout << "Welcher Name soll gesucht werden? " ;
std::cin >> query;
bool found = false;
for (unsigned i= 0; i< telefonbuch.size()&&!found; i++){
eintrag = telefonbuch[i];
if (eintrag.name == query){
std::cout << eintrag.name << " hat Telefonnummer: "<< eintrag.telefonnummer << std::endl;
found = true;
}
}
if (!found){
std::cout << query << " ist nicht im Telefonbuch enthalten" << std::endl;
}
}
+19
View File
@@ -0,0 +1,19 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 26.04.2023
Katharina Klost
Beispiele zur Deklaration und Initialisierung von Variablen
*/
#include <iostream>
int main(){
int num1;
//num1 ist nur deklariert und nicht initialisiert und daher ist
//der Inhalt hier nicht definiert (irgendein Wert)
std::cout << num1 << std::endl;
num1 = 10;
std::cout << num1 << std::endl;
}
+66
View File
@@ -0,0 +1,66 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu enums
*/
#include <iostream>
//Ein enum für Wochentage
enum class Wochentag{
Montag,
Dienstag,
Mittwoch,
Donnerstag,
Freitag,
Samstag,
Sonntag
};
//Ein enum für Farben
enum class Farbe {rot, gruen, blau, orange};
// Ein enum für die Zustände von Ampeln
enum class Ampel {gruen, gelb, rot, gelb_rot};
int main(){
// der Name des enums muss immer angegeben werden, da es Felder mit
// dem gleichen Namen in verschiedenen enums geben kann
Ampel ampel1 = Ampel::gruen;
//enums und switch-case sind eine beliebte Kombination
switch(ampel1){
case Ampel::gruen:
std::cout << "Kann fahren" << std::endl;
break;
case Ampel::gelb:
std::cout << "Achtung" << std::endl;
break;
case Ampel::rot:
std::cout << "Stop" << std::endl;
break;
case Ampel::gelb_rot:
std::cout << "Achtung" << std::endl;
break;
default:
std::cout <<"Irgendwas anderes" << std::endl;
break;
}
int number;
std::cout << "Gebe einen Tag ein, (Montag=1,..., Sonntag =7)";
std::cin >> number;
// da enums intern mit Zahlen dargestellt werden, können Zahlen
// explizit in eine enum umgewandelt werden
Wochentag tag = static_cast<Wochentag>(number-1);
// werden enums verglichen gilt die Reihenfolge in der Definition
if (tag >= Wochentag::Samstag){
std::cout << "Es ist Wochenende :)" << std::endl;
}
else{
std::cout << "Es ist ein Arbeitstag :(" << std::endl;
}
}
+21
View File
@@ -0,0 +1,21 @@
#include <iostream>
// Fibonacci numbers
int main() {
int x;
std::cout << "x-th Fibonacci number?: ";
std::cin >> x;
int prev = 0;
int curr = 1;
int tmp;
for (int i = 2; i <= x; ++i) {
tmp = curr;
curr = prev + curr;
prev = tmp;
}
}
+49
View File
@@ -0,0 +1,49 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 26.04.2023
Katharina Klost
Beispiele zu Gültigkeitsbereichen
*/
#include <iostream>
int main (){
int variable1;
std::cin >> variable1;
float variable3;
if (variable1 == 10){
float varible2 = 9.1;
std::cout << varible2 << std::endl;
}
else{
// neue Deklaration von variable3, überschattet die andere variable3
float variable3 = 10.1;
std::cout << variable3 << std::endl;
}
/*
variable2 ist nur in der ersten if-Bedingung definiert und kann daher
hier nicht verwendet werden.
*/
//std::cout << variable2 << std::endl;
//Da diese variable3 nur deklariert aber nicht initialisiert wurde,
// ist der Inhalt hier beliebig
std::cout << variable3 << std::endl;
variable3 = 1.1;
while(variable1<10){
//wird immer wieder neu deklariert
int variable3 = variable1;
std::cout << "variable3 in schleife: " << variable3 << std::endl;
variable1++;
}
std::cout << "variable1 nach erster Schleife: " << variable1 << std::endl;
std::cout << "variable3 nach erster Schleife: " << variable3 << std::endl;
}
@@ -0,0 +1,82 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 26.04.2023
Katharina Klost
Beispiele zu Kontrollstrukturen
*/
#include <iostream>
int main(){
/*
Beispiel für eine komplexere if-then-else Abfrage.
*/
int num ;
std::cout << "Gebe eine Zahl für den if test ein: " ;
std::cin >> num;
if (num == 2) {
num = num*2;
}
else if (num > 1 && num <5) {
num= num*3;
}
else if (num >=10){
num = num*4;
}
else{
num = num*5;
}
std::cout << num << std::endl;
/*
Beispiel für eine switch-case umgebeung
Die einzelnen case Abschnitte sind keine Blöcke, daher gibt es ohne
break einen fallthrough und es können keine Variablen deklariert werden.
Bei modernen Compilern sollte es keine Unterschiede in der Performance
von semantisch gleichen if-Bedingungen und switch-case Umgebungen geben
*/
int num1;
std::cout << "Gebe eine Zahl für den switch-case test ein: ";
std::cin >> num1;
switch(num1){
case 1:
std::cout << "num ist 1" << std::endl; //kein break -> fallthrough
case 2:
std::cout << "num ist 1 oder 2" << std::endl;
break;
case 3:
std::cout << "num ist 3" << std::endl;
break;
case 4:
std::cout << "num ist 4" << std::endl;
break;
default:
std::cout << "num ist nicht 1,2,3 oder 4" << std::endl;
}
/*
Beispiel für eine for-schleife, in <Anweisung3> und <Anweisung1> (vgl. Folien)
Können auch mehrere Anweisungen mit , getrennt stehen.
*/
int num_for = 3;
for (int counter=1; counter <=4; counter=counter+1, num_for ++) {
num_for= num_for*num_for;
std::cout << "num_for in iteration " << counter << ": "<< num_for << std::endl;
}
std::cout << "num_for nach Schleife: " << num_for << std::endl;
/*
Beispiel für eine while-schleife
*/
int num_while = 2;
int goal = 300;
while (num_while < goal) {
num_while = num_while * num_while;
std::cout << "num_while after *: " << num_while << std::endl;
}
std::cout << num_while << std::endl;
}
+19
View File
@@ -0,0 +1,19 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu pairs
*/
#include <iostream>
int main(){
std::pair<std::string, int> mein_paar = {"Hallo", 1234};
std::cout << "Erster Eintrag vom mein_paar: " << mein_paar.first << std::endl;
std::cout << "Zweiter Eintrag vom mein_paar: " << mein_paar.second << std::endl;
mein_paar.first = "Test";
std::cout << "Neuer erster Eintrag: " << mein_paar.first << std::endl;
}
+23
View File
@@ -0,0 +1,23 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu Strings
*/
#include <iostream>
#include <string>
int main(){
std::string ein_string = "Hallo";
char stelle2 = ein_string[2];
std::cout << "An index 2 steht: " << stelle2 << std::endl;
ein_string[2]= 'x';
std::cout << "Stelle 2 verändert: " << ein_string << std::endl;
ein_string = ein_string + " Welt!";
std::cout << ein_string << std::endl;
std::cout << ein_string + 'c' << std::endl;
std::cout << "Der String \"" << ein_string << "\" hat " << ein_string.length() << " Zeichen" << std::endl;
}
+49
View File
@@ -0,0 +1,49 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu structs
*/
#include <iostream>
#include <vector>
struct studi{
std::string name;
int matrikelnummer;
bool bachelor;
std::string studienfach;
};
struct studi2{
std::string name;
int matrikelnummer;
bool bachelor;
std::string studienfach;
};
int main(){
studi luca = {"Luca Muster", 42, true, "Informatik"};
studi mo = {"Mo", 112, true, "Bioinformatik"};
studi alex = {"Alex Müller", 4711, false, "Informatik"};
//mit dem . kann auf ein Feld zugegriffen werden.
std::cout << mo.name << std::endl;
mo.bachelor = false;
std::cout << mo.bachelor << std::endl;
// wegen der Wertsemantik werden die Einträge beim zuweisen kopiert
studi luca2 = luca;
luca2.name = "Luca Mustermann";
std::cout << luca2.name << std::endl;
std::cout << luca.name << std::endl;
studi2 luca3;
//nur structs vom gleichen Typ können einander zugewiesen werden
//luca3 = luca;
//structs können auch in vectoren gespeichert werden
std::vector<studi> tutorium ={luca,mo};
tutorium.push_back(alex);
}
+59
View File
@@ -0,0 +1,59 @@
#include <iostream>
#include <string>
int main() {
// Aufgabe 1a
int x;
std::cin >> x;
int y = 1;
for (int i = x; i > 0; i--) {
y = y * i;
}
std::cout << y << std::endl;
// Aufgabe 1b
int z = 1;
int l = x;
while (l > 1) {
z = z * l;
l--;
}
std::cout << z << std::endl;
// Aufgabe 2
// 1 Load 7
// 2 Write 6
// 3 Add 7
// 4 Jump 2
// 5 Return
// 6 0
// 7 3
// Aufgabe 3
std::string artist;
std::cout << "Wer ist dein Lieblingsartist?" << std::endl;
std::cin >> artist;
std::cout << "Dein Lieblingsartist ist " << artist << std::endl;
std::string album;
std::cout << "Was ist dein Lieblingsalbum?" << std::endl;
std::cin >> album;
std::cout << "Dein Lieblingsalbum ist " << album << std::endl;
int zahl;
std::cout << "Was ist deine Lieblingszahl?" << std::endl;
std::cin >> zahl;
int quad = zahl * zahl;
std::cout << "Deine Lieblingszahl ist " << quad << std::endl;
}
+59
View File
@@ -0,0 +1,59 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 26.04.2023
Katharina Klost
Beispiele zur Ein-und Ausgabe
*/
#include <iostream> // gibt Ein-und Ausgabe
#include <climits> // gibt Minimal- und Maximalwerte für die Datentypen
int main(){
/*Zuweisen einer Gleitkommazahl zu einer Ganzzahl schneidet die
Nachkommastellen ab
*/
int a = 3.5;
std::cout << "a: " << a << std::endl;
int n1 = SHRT_MAX;
short n2 = SHRT_MAX;
short n3 = n2 + n2; // overflow
int n4 = n1 + n2; //der größere Datentyp gewinnt
std::cout << "n3, n4: "<<n3 << ", " << n4<< std::endl;
unsigned int n5 = 5;
int n6 = -6;
// Bei Kombination von unsigned und signed Typen gewinnt
// der unsigned, der Inhalt der Speicherzelle wird dann
// intern anders interpretiert
std::cout << "n5+n6: "<< n5+6 <<std::endl;
// Bei der Kombination von Gleitkommazahlen und Ganzzahlen gewinnt
// die Gleitkommazahl
double f1 = 0.4;
std::cout << f1 + n6<< std::endl;
int i1 = 18;
int i2 = 16;
//implizieter Typcast, es wird erst Ganzzahlig dividiert
// (Nachkommastellen abgeschnitten) und dann umgewandelt
double dv1 = i1 / i2;
//werden Divisor und Divident erst umgewandelt, ist das Ergebnis die
//erwartete Gleitkommazahl
double dv2 = static_cast<double>(i1) / static_cast<double>(i2);
// Wie weiter oben, erst wird geteilt (und abgeschnitten) und dann umgewandelt
// und dann zugewiesen.
double dv3 = static_cast<double>( i1 / i2 );
std::cout << dv1 << ", " << dv2 << ", " << dv3 << std::endl;
}
+139
View File
@@ -0,0 +1,139 @@
#include <iostream>
#include <vector>
#include <string>
int main() {
// 1.
int eingabe0 = -1;
std::cout << "Aufgabe (1) oder (2)?" << std::endl;
std::cin >> eingabe0;
if (eingabe0 == 1){
int eingabe1 = -1;
std::vector<int> zahlenfolge;
int min = 0;
int max = 0;
while (true) {
std::cout << "Geben Sie eine Zahl der Zahlenfolge ein, mit 0 geben sie MIN und MAX aus, mit 9999 geben sie den Mittelwert aus: " << std::endl;
std::cin >> eingabe1;
if (eingabe1 == 0) {
for (unsigned i = 0; i < zahlenfolge.size(); i++){
if (zahlenfolge[i] < min){
min = zahlenfolge[i];
}
if (zahlenfolge[i] > max){
max = zahlenfolge[i];
}
}
std::cout << "Das Maximum der Zahlenfolge ist: " << max << std::endl;
std::cout << "Das Minimum der Zahlenfolge ist: " << min << std::endl;
break;
}
if (eingabe1 == 9999) {
float summe = 0;
for (unsigned i = 0; i < zahlenfolge.size(); i++){
summe += zahlenfolge[i];
}
double mittelwert = summe / zahlenfolge.size();
std::cout << "Der Mittelwert der Zahlenfolge ist: " << mittelwert << std::endl;
break;
}
zahlenfolge.push_back(eingabe1);
}
}
// 2.
if (eingabe0 == 2){
char eingabe01;
std::cout << "Teilaufgabe (a) oder (b) ?" << std::endl;
std::cin >> eingabe01;
// 2 a)
if (eingabe01 == 'a'){
int eingabe2 = -1;
std::cout << "Geben Sie eine Zahl größer 0 ein, von der die Quersumme berechnet werden soll" << std::endl;
std::cin >> eingabe2;
int eingabe3 = -1;
std::cout << "Soll die Quersumme mit einer while (0) oder for (1) Schleife berechnet werden?" << std::endl;
std::cin >> eingabe3;
if (eingabe3 == 0){
int quersummewhile = 0;
while (eingabe2 > 0){
quersummewhile += eingabe2 % 10;
eingabe2 /= 10;
}
std::cout << "Die Quersumme der Zahl ist: " << quersummewhile << std::endl;
}
if (eingabe3 == 1){
int quersummefor = 0;
for (quersummefor; eingabe2 > 0; eingabe2 /= 10){
quersummefor += eingabe2 % 10;
}
std::cout << "Die Quersumme der Zahl ist: " << quersummefor << std::endl;
}
}
// 2 b)
if (eingabe01 == 'b'){
int n;
std::cout << "Geben Sie eine Zahl größer 0 ein: " << std::endl;
std::cin >> n;
for (int i = 0; i <= n; i++) {
std::string output = "";
if (i % 3 == 0) {
std::cout << "bli" << std::endl;
}
if (i % 5 == 0) {
std::cout << "bla" << std::endl;
}
if (i % 7 == 0) {
std::cout << "blub" << std::endl;
}
}
}
}
}
+56
View File
@@ -0,0 +1,56 @@
# 3. Gültigkeitsbereich und Recherche (5+2+3 Punkte)
## (a) Betrachten Sie den folgenden C++-Code und geben Sie für alle Variablen den Gültigkeitsbereich
an.
```cpp
#include <vector>
int main(){
int v1 = 32;
double i = 7.0;
for(int i= 2; i< 30; i++){
v1 *= i; }
std::vector<std::vector<int>> vec = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9, 4 } };
for (i = 0; i<vec.size(); i++){
int v1=20;
for (unsigned int j=0; j<vec[i].size();j++){
v1 = vec[i][j];
}
v1+=1; }
}
```
Die Variable v1 befindet sich in dem Gültigkeitsbereich von main() und auch in dem Gültigkeitsbereich der for-Schleife.
Die Variable i befindet sich in dem Gültigkeitsbereich von main() und in dem Gültigkeitsbereich der ersten for-Schleife. Die Variable i aus dem Gültigkeitsbereich von main() wird für die for-Schleife überschrieben.
Die Variable vec befindet sich in dem Gültigkeitsbereich von main() und in dem Gültigkeitsbereich der zweiten for-Schleife.
Die Variable i aus dem Gültigkeitsbereich der ersten for-Schleife wird für die zweite for-Schleife überschrieben.
Die Variable j befindet sich in dem Gültigkeitsbereich der zweiten for-Schleife.
## (b) Es gibt in C++ noch eine weitere Schleifenart. Recherchieren Sie welche dies ist. Geben Sie die allgemeine Form an und beschreiben Sie die Funktionalität. Denken Sie daran Quellen anzugeben.
Die weitere Schleifenart ist die do-while-Schleife. Die allgemeine Form ist:
```cpp
do {
<Anweisung>;
} while (<Bedingung>);
```
Sie verhält sich wie eine while-Schleife, mit dem Unterschied, dass die Bedingung nach der Ausführung der Anweisung anstatt davor ausgewertet wird. Dadurch wird garantiert, dass die Anweisung mindestens einmal ausgeführt wird, auch wenn die Bedingung niemals erfüllt ist.
[Quelle](https://www.cplusplus.com/doc/tutorial/control/#do_while)
## (c) Finden Sie je einen Anwendungsfall, in dem eine for, while und die weitere Schleife gegenüber den anderen Schleifenarten zu bevorzugen ist.
Die for-Schleife ist zu bevorzugen, wenn die **Anzahl der Durchläufe bekannt** ist.
Die while-Schleife ist zu bevorzugen, wenn die **Anzahl der Durchläufe nicht bekannt** ist.
Die do-while-Schleife ist zu bevorzugen, wenn die **Anweisung mindestens einmal ausgeführt werden soll**.
+43
View File
@@ -0,0 +1,43 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu vector
*/
#include <iostream>
#include <vector>
int main(){
std::vector<int> zahlen = {10,4,20,24,7,34,1,55,34,17,4};
//vector mit 10 Boolean einträgen, die alle 0 bzw false sind
std::vector<bool> wahrheitswerte(10);
//vector mit 5 Einträgen, alle sind "Mo"
std::vector<std::string> montage(5,"Mo");
std::cout << zahlen[3] << std::endl;
zahlen[3] = 100;
std::cout << zahlen[3] << std::endl;
std::cout << zahlen.size() << std::endl;
zahlen.push_back(1234);
std::cout << zahlen.size() << std::endl;
//ACHTUNG! Kein Fehler, wenn wir auf Daten außerhalb des vector zugreifen
std::cout << zahlen[zahlen.size()] << std::endl;
//Wird auf einen Index größer oder gleich size() des vector
// zugegriffen gibt es undefiniertes Verhalten.
// Es kann ein Wert zurückgegeben werde, oder ein Speicherzugriffehler
// ausgegeben werden.
// Wird ein Wert außerhalb der Grenzen zugewiesen, wird die Größe
// des vector nicht angepasst
std::cout << zahlen[100000] << std::endl;
std::cout << zahlen.size() << std::endl;
}
+30
View File
@@ -0,0 +1,30 @@
/* Informatik B - Sommersemester 2023
Vorlesung am 28.04.2023
Katharina Klost
Beispiele zu vector und schleifen
*/
#include <iostream>
#include <vector>
int main(){
std::vector<int> zahlen = {10,4,20,24,7,34,1,55,34,17,4};
int sum = 0;
//Schleife läuft durch alle Indizes des vector und summiert die Einträge auf
for (unsigned int i = 0; i<zahlen.size(); i++){
sum += zahlen[i];
}
std::cout << "Summe des vector: " << sum << std::endl;
//Verschachtelte Schleife geht durch alle Paare i,j mit i<j und i,j < zahlen.size()
std::cout << "Alle paare von Werten: " << std::endl;
for(unsigned i = 0; i< zahlen.size(); i++){
for(unsigned j = i+1; j<zahlen.size(); j++){
std::cout << "(" << zahlen[i] << ", " << zahlen[j] <<")" << std::endl;
}
}
}