TU-Programmieren_2/lab1/main.ipynb
2025-04-09 10:22:44 +02:00

161 lines
6.2 KiB
Plaintext

{
"cells": [
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## A. Namensräume\n",
"\n",
"Namensräume (`namespace` s) sind eine Möglichkeit, um Quellcode besser zu organisieren und strukturieren: Namenskonflikte zwischen gleichnamigen Funktionen (wie es beim importieren mehrerer Bibliotheken auftreten kann) können vermieden werden.\n",
"\n",
"**Aufgabe 1:** Setzen Sie die folgenden Schritte in der Datei `taskA.cpp` um:\n",
"\n",
"1. Definieren Sie in einem Namensraum eine Funktion, die einen beliebigen Text (z.B. 'Hello from namespace XXX') in der Konsole ausgibt.\n",
"2. Definieren Sie in einem anderen Namensraum eine zweite Funktion mit gleichem Namen, die einen anderen Text (z.B. 'Hello from namespace YYY') in der Konsole ausgibt\n",
"3. Schreiben Sie eine `main`-Funktion, in der Sie beide Funktionen aufrufen.\n",
"\n",
"**Aufgabe 2:**\n",
"\n",
"Diskutieren Sie Vor- und Nachteile der folgenden drei Header-Dateien: Typen und Werte werden aus der Standardbibliothek inkludiert und für die Schnittstellen (Funktionsdeklarationen) verwendet:\n",
"\n",
"```cpp\n",
"// Option1.hpp \n",
"#include <numbers>\n",
"#include <vector>\n",
"\n",
"using namespace std;\n",
"using namespace std::numbers;\n",
"\n",
"vector<double> doSomething(vector<double> data, double ref = pi);\n",
"```\n",
"\n",
"---\n",
"\n",
"```cpp\n",
"// Option2.hpp\n",
"#include <numbers>\n",
"#include <vector>\n",
"\n",
"std::vector<double> doSomething(std::vector<double> data, double ref = std::numbers::pi);\n",
"```\n",
"\n",
"---\n",
"\n",
"```cpp\n",
"// Option3.hpp\t\n",
"#include <numbers>\n",
"#include <vector>\n",
"\n",
"constexpr double Pi = std::numbers::pi;\n",
"using Vector = std::vector<double>;\n",
"\n",
"Vector doSomething(Vector data, double ref = Pi);\t\n",
"```\n",
"\n",
"**Demonstration:** Führen Sie Ihr Programm aus Teil 1 aus und fassen Sie Ihre Diskussion zu Teil 2 kurz zusammen."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## B. std::vector und Funktionen mit Schleifen und Bedingungen\n",
"\n",
"In der Datei `taskB.cpp` sind ein Vektor `vec` und eine Matrix (*vector of vectors*) `mat` gegeben:\n",
"\n",
"```cpp\n",
"using Vector = std::vector<double>;\n",
"using Matrix = std::vector<std::vector<int>>;\n",
"```\n",
"\n",
"**Aufgabe:** Implementieren Sie die folgenden Funktionen:\n",
"\n",
" 1. `sum`: **Summe** aller Elemente eines `Vector`\n",
" 2. `sum`: **Summe** aller Elemente einer `Matrix`\n",
" 3. `print`: **Formatierte Ausgabe** (in der Konsole) eines `Vectors` (in einer Zeile) \n",
" 3. `print`: **Formatierte Ausgabe** (in der Konsole) einer `Matrix` (Zeile für Zeile) \n",
" 4. `cout_even`: **Abzählen** wie viele Elemente einer `Matrix` gerade sind\n",
" 5. `mean`: **Durchschnitt aller Elemente** einer `Matrix`\n",
"\n",
"**Überlegen Sie sich,**\n",
"- welche Typen die Parameter Ihrer Funktionen benötigen, und\n",
"- ob Ihre Funktionen einen Rückgabewert liefern, und welchen Typ dieser haben soll.\n",
"\n",
"Rufen Sie Ihre Funktionen in der `main`-Funktion auf, und geben Sie jeweils deren Rückgabewert in der Konsole aus.\n",
"\n",
"**Demonstration:** Führen Sie Ihr Programm aus und interpretieren Sie die Ausgaben in der Konsole."
]
},
{
"attachments": {},
"cell_type": "markdown",
"metadata": {},
"source": [
"## C. Nutzung der in `modules` bereitgestellten Bibliotheken\n",
"\n",
"Wir stellen Ihnen in diesem Semester im Repo [`modules`](https://sgit.iue.tuwien.ac.at/360050/modules) Funktionalität zur Verfügung, von der Sie in einigen der folgenden Hausübungen Gebrauch machen sollen. \n",
"\n",
"**Aufgabe:** Setzen Sie die folgenden Schritte in der Datei `taskC.cpp` um:\n",
"\n",
"- Schreiben Sie eine Funktion, die eine $m \\times n$-Matrix (*vector of vectors*) zurückgibt. Die Anzahl der Zeilen und Spalten soll als Funktionsparameter übergeben werden. Die Matrix soll mit aufsteigenden Werten vom Typ `double` gefüllt werden, wobei mit dem Wert `1.0` gestartet und dann reihenweise vorgegangen wird.\n",
"\n",
"- Schreiben Sie eine `main`-Funktion, rufen Sie von dort Ihre Funktion auf und speichern Sie deren Rückgabewert (Matrix) in einer lokalen Variable.\n",
"\n",
"- Rufen Sie die Funktion `iue::io::savetxt()`, die in [`modules/iue-io/csv.hpp`](modules/iue-io/csv.hpp) definiert ist, auf, um die Matrix in eine `.csv`-Datei zu schreiben.\n",
"\n",
"**Hinweise:**\n",
"\n",
"- Ein Beispiel für eine Matrix mit 4 Zeilen und 2 Spalten wäre:\n",
"\n",
" ```\n",
" 1 2\n",
" 3 4\n",
" 5 6\n",
" 7 8\n",
" ```\n",
"\n",
"- Die Funktion `iue::io::savetxt(...)` befindet sich im *namespace* `iue::io` in der Datei [`modules/iue-io/csv.hpp`](modules/iue-io/csv.hpp).\n",
"- Sie müssen die Header-Datei am Anfang Ihres Programms inkludieren (relativer Pfad), und wir empfehlen dazu folgende Vorgehensweise:\n",
"\n",
" ```cpp\n",
" #include \"iue-io/csv.hpp\"\n",
" ```\n",
"\n",
" und zudem den `modules`-Ordner als Include-Pfad (`-I`) beim Kompilieren angeben:\n",
"\n",
" ```shell\n",
" g++ -std=c++20 -Imodules ...\n",
" ```\n",
"\n",
"**Demonstration:** \n",
" \n",
"- Rufen Sie Ihr Programm auf und inspizieren Sie die resultierende `.csv`-Datei. \n",
"- Ändern Sie die Anzahl an Zeilen oder Spalten, kompilieren Sie Ihr Programm erneut und erzeugen Sie eine weitere `.csv`-Datei."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 2
}