Prof. Dr. Malte Schilling
Autonomous Intelligent Systems Group
Dieser Kurs kann nicht abdecken:
Tiefgehende Kenntnisse über die Entwicklung von größeren Projekten.
Ursprüngliche Kegel als Metapher gedacht, um Progression von Lernerfahrungen vom Konkreten zum Abstrakten zu zeigen (nicht als Abstufung/ Wertung von Ebenen!).
Following (Dale 1969)
Kurs richtet sich an Programmierer, damit
Following (Anderson und Krathwohl 2001)
Ziel: Erste C++ Programm auf dem Hub laufen lassen und hierin grundlegende Kontrollstrukturen anwenden können.
Malte Schilling
The answer consists of two parts. First, it is indeed true that traditional forms of programming are useful for just a few people. But, programming as we the authors understand it is useful for everyone: the administrative secretary who uses spreadsheets as well as the high-tech programmer.
“To design a program properly, a student must:
All of these are activities that are useful for a businessman, a lawyer, a journalist, a scientist, an engineer, and many others.“
Vorstellung verschiedener Paradigmen zur Modellierung und Programmierung.
In der Vorlesung wird die Sprache C++ anhand von praxisnahen Beispielen vorgestellt. Themen sind u.a.:
Nr. | Termin | Thema |
---|---|---|
1 | 17.4. | Einführung, Perspektiven Sofware Eng., Imperative Progr. |
2 | 24.4. | Datenstrukturen in C und C++: Pointer und Referenzen, Structs, … |
Task | 15.5. | (Generative Sprachmodelle realisieren als einfacher ChatBot) |
3 | 5.6. | Objektorientierte Programmierung und Systementwicklung |
Task | 12.6. | Zweites Beispieltask |
4 | 19.6. | Test-basierte Entwicklung, STL |
5/6 | 26.6. | Programmierwerkzeuge und KI-gestützte Entwicklung, Zusammenfassung |
Abgabe finale Task bis Ende August 2024 |
Fragen während des Kurses dürfen sehr gerne direkt gestellt werden.
Bearbeitung in Kleingruppen von zwei oder drei Personen sinnvoll.
Lerneffekt tritt nur ein, wenn jede(r) an der Bearbeitung aller Aufgaben beteiligt ist.
Honor Code: Angeben von Quellen und von Zusammenarbeit.
Vorlesung wird mit 2 LP kreditiert, dies entspricht 60 Arbeitsstunden (inkl. Arbeit für die Abgabe) über die gesamte Vorlesungszeit.
Can Python do everything C++ can?
As a whole, Python can do the same thing that C++.
There are some slight differences, but Python can use C libraries and C can use Python libraries, so it’s possible to replace one language with another in most cases.
According to Indeed USA, Python is more in-demand than C++.
In terms of salary, C++ developers are paid better than Python developers ($113,561 on average versus $107,397).
https://madnight.github.io/githut/#/pull_requests/2022/3
Dadurch: Benötigt mehr Zeit im Erlernen.
Aber: Dies ermöglicht schnelles Erlernen anderer Programmiersprachen aufbauend auf C++-Kenntnissen.
C++ ist eine multi-paradigmatische und vielseitige Programmiersprache.
Daher: kann für eigenen Programmierstil genutzt werden und eigenen Best Practices für das Schreiben von Code mit C++ können etabliert werden.
C++ kann sehr schnell (und Speicher-effizient) sein.
C++ ist relativ hardware-nah.
#include "stdio.h"
#include "stdlib.h"
int main(int argc, char *argv) {
asm( "sub $0x20,%rsp\n\t" // assembly code!
"movabs $0x77202c6f6c6c6548,%rax\n\t"
"mov %rax,(%rsp)\n\t"
"movl $0x646c726f, 0x8(%rsp)\n\t"
"movw $0x21, 0xc(%rsp)\n\t"
"movb $0x0,0xd(%rsp)\n\t"leaq (%rsp),%rax\n\t"
"mov %rax,%rdi\n\t"
"call __Z6myputsPc\n\t"
"add $0x20, %rsp\n\t"
); return (^) EXIT_SUCCESS;
}
Vorteile:
Warum verwenden wir nicht immer Assembly?
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our string
len equ $ - msg ;length of our string
Sprache | # Assembler Instruktionen für eine Instruktion der PS |
---|---|
C | 2.5 |
C++ | 6 |
Fortran | 4 |
Java | 6 |
Modula-2 | 4 |
Pascal | 4 |
Python | 7 |
Unterschiedliche Programmiersprachen sind für unterschiedliche Probleme besser geeignet.
std::
C++ | JAVA | PYTHON |
---|---|---|
Kompilierte Programmiersprache | Kompilierte Programmiersprache | Interpretierte Programmiersprache |
Unterstützt Operatorüberladung | Unterstützt keine Operatorüberladung | Unterstützt Operatorüberladung |
Bietet sowohl Einfach- als auch Mehrfachvererbung | Bietet teilweise Mehrfachvererbung über Schnittstellen | Bietet sowohl Einfach- als auch Mehrfachvererbung |
Plattformabhängig | Plattformunabhängig | Plattformunabhängig |
Ziel der Modellbildung: Lösung eines Problems.
Festlegen (durch Spezifikation), welches Ziel gelöst werden soll.
Methoden zur Modellbildung: Logische Strukturen, Graphen, Grammatiken, Automatenmodelle, Petri-Netze, UML-Diagramme …
+1
, −1
, Test auf Null
.Eine Variable ist ein Name für eine Stelle im Speicher, an der ein Datum abgespeichert wird. Variablen haben dabei einen Gültigkeitsbereich (engl. scope), in dem auf die Variable zugegriffen werden kann.
static
erlaubt es statische Variablen innerhalb von Funktionen zu deklarieren (analog zu Java).Null
-Wert initialisiert.Vorsicht: Die Verwendung solcher Variablen sollte vermieden werden, da sie zu schwierig zu entdeckenden Fehlern führen kann!
Ein Datentyp ist eine Menge von Werten zusammen mit einer Menge von Operationen, die auf diesen Werten definiert sind.
Ein elementarer Datentyp ist ein Datentyp, dessen Wertemenge nicht weiter in Datentypen zerlegt werden kann.
(Vahrenhold 2022), Def. 1.8
In C gibt es eine Reihe von Basisdatentypen:
char
→ char c = ’a’;
char, short, int, long, long long
→ int i = 42;
float, double, long double
→ double d = 42.23;
Die Größe der Basisdatentypen ist systemabhängig. Abfrage über sizeof
-Operator, z.B. sizeof(int)
. Der Datentyp char
ist jedoch immer auf 1 Byte festgelegt.
unsigned
Beispiele:
char c; //-128 .. 127
= signed char c; //-128 .. 127
unsigned char c; //0 .. 255
Mit dem Typqualifizierer const
können Konstanten definiert werden.
Beispiel: const double PI = 3.1415927;
Häufig wird in C stattdessen ein Makro definiert: #define PI 3.1415927
typedef
und Fixed Width Integer Typestypedef
-Deklaration kann ein neuer Name für einen Typ vereinbart werden.Beispiel: typedef unsigned int uint;
→ uint
wird damit als weiterer Name für den Typ unsigned int
deklariert und kann anschließend überall dort verwendet werden, wo auch der ursprüngliche Typname verwendet werden kann.
Im Header <stdint.h>
sind Integer-Typen mit fester, systemunabhängiger Größe nach folgendem Muster vordefiniert: [u]intx_t
mit
int8_t
= int
mit einer Größe von 1 Byte (entspricht char)
.uint64_t
- unsigned int
mit einer Größe von 8 Byte.Die Typen müssen aber von der Zielplattform unterstützt werden!
printf
Wie gibt man den Wert einer Zahl n
aus?
printf
-Funktion darf Platzhalter enthalten, z. B. %i
für Integer-Typen und %f
für Fließkommazahlen.printf
ersetzt.In C++ wird std::cout <<
genutzt (dafür muss iostream eingebunden werden: include <iostream>
).
Geben Sie die Größe der folgenden Datentypen auf Ihrem System aus:
Im jupyter-book sind verschiedene Aufgaben angegeben:
Hierüber kann dann direkt auf dem Hub eine Umgebung gestartet werden, in der C++ interpretiert wird (wird die ersten Termine genutzt):
// datentypen.cpp
//In C use: #include <stdio.h>
#include <iostream>
int main() {
char c;
short s;
int i;
/* sizeof kann auf Variablen ... */
// In C use: printf("char: %lu\n", sizeof(c));
std::cout << "char: " << sizeof(c) << std::endl;
std::cout << "short: " << sizeof(s) << std::endl;
std::cout << "int: " << sizeof(i) << std::endl;
/* ... oder Datentypen angewandt werden */
std::cout << "long: " << sizeof(unsigned long) << std::endl;
std::cout << "long long: " << sizeof(long long) << std::endl;
std::cout << "float: " << sizeof(float) << std::endl;
std::cout << "double: " << sizeof(double) << std::endl;
std::cout << "long double: " << sizeof(long double) << std::endl;
return 0;
}
In C gibt es erst seit dem C99-Standard einen Boolean-Datentyp (_Bool
, durch inbinden von stdbool.h
lässt sich _Bool
als bool
schreiben).
Generell gilt: Beliebige ganzzahlige Werte können als Wahrheitswerte verwendet werden.
true
false
Bei logischen Verknüpfungen gibt es Unterschiede zu Java:
&
und |
haben nicht die gleiche Bedeutung, wie in Java, sondern bezeichnen bitweise Verknüpfungen:
&
: Bitweises Und;|
: Bitweises Oder.Definition eines Arrays: int data1[42];
int data2[] = {1, 2, 3, 44, 55, 110};
Zugriff auf Elemente:
data2[6] = 24;
array_name.length()
! Die Länge eines Arrays muss separat gespeichert/an Funktionen übergeben werden.Erstellen Sie ein Array mit 1000 Zufallszahlen vom Typ int
und geben Sie anschließend die Anzahl der Elemente aus, die größer als RAND_MAX/2
sind.
Hinweise:
rand()
unter http://en.cppreference.com/w/c/numeric/random/rand.for
-Schleife, um über die Elemente des Arrays zu iterieren.// array.c
#include <stdio.h> // printf
#include <time.h> // time
#include <stdlib.h> // rand und RAND_MAX
int main() {
const int SIZE = 1000;
const int THRESHOLD = RAND_MAX /2;
int a[SIZE];
int count = 0;
srand(time(NULL)); // Initialisierung des Zufallszahlengenerators
// Befüllen des Arrays mit Zufallszahlen
for(int i = 0; i < SIZE; ++i) {
a[i] = rand();
if( a[i] > THRESHOLD ) ++count;
}
printf("%i Elemente sind groesser %i.\n", count, THRESHOLD);
}
In C gibt es keinen Datentyp String!
char
realisiert.Beispiel: Der String "hello"
entspricht {’h’, ’e’, ’l’, ’l’, ’o’, ’\0’}
Umständlich! → Kurzschreibweise:
\0
am Ende vergessen.Ersetzen Sie jedes Vorkommen eines Leerzeichens im String s
durch einen Unterstrich. Nutzen Sie hierfür eine while
-Schleife (Hilfe Kontrollstrukturen).
// stringreplace.cpp
#include <iostream>
int main () {
char s[] = "In C, string literals are of type char[], and can be assigned directly to a (non-const) char*.";
// Ersetzen Sie in s jedes Leerzeichen durch ’_’
int i = 0;
while(s[i] != '\0') {
if(s[i] == ' ') {
s[i] = '_';
}
++i;
}
std::cout << s << std::endl;
}