kramann.info
© Guido Kramann

Login: Passwort:










Archivmaterial vom Wintersemester 2006/07: Einführung in die prozedurale Programmierung mit C++

Im Wesentlichen soll dieser Kurs dazu dienen, Technikern die Fertigkeit zu vermitteln, Anwendungsprogramme zu schreiben. Theoretisches Hintergrundwissen soll lediglich als Mittel dienen, Sicherheit beim Umgang mit dem Computer zu bekommen. Der Computer wird vornehmlich als Vehikel aufgefasst, in Programmen formulierte Aufgaben zu erledigen. Es wird Wert auf sinnvollen Code gelegt. Nicht hinreichend ist ein syntaktisch korrektes Programm. Vielmehr muss das Programm auch eine sinnvolle Aufgabe erledigen. Im einfachsten Fall muss es dann mindestens einmal Benutzerdaten einlesen, in denen genauer spezifiziert ist, was zu tun ist. Diese Daten müssten mindestens eine Verarbeitungsschicht durchlaufen, woraufhin das Programm wieder in Kontakt mit der Aussenwelt tritt und irgendein Ergebnis präsentiert.

Der Wunsch, ein in dieser Art sinnvolles Programm erstellen zu wollen, erleichtert die Einsicht in die Sinnhaftigkeit der Sprachsyntax, wenn letztere dem Programmierer die Mittel in die Hand gibt, eben dieses Programm zu schreiben.

Die Studierenden werden deshalb ständig mit Aufgaben der Art Konfrontiert:

Schreibe ein Programm, das ...

Der Wunsch, ein sinnvolles Programm erstellen zu wollen, erleichtert die Einsicht in die Sinnhaftigkeit der Sprachsyntax, wenn letztere dem Programmierer die Mittel in die Hand gibt, eben dieses Programm zu schreiben.

Aus diesen Überlegungen heraus wurde der Stoff in folgender Weise aufbereitet: Am Anfang eines Kapitels wird zumeist mit Hilfe eines Flussdiagramms eine Aufgabe beschrieben, die ein Computer bewältigen soll. Im Anschluss daran wird dargestellt, wie diese Anwendung in C++ umgesetzt werden kann. In einem nächsten Schritt wird die Theorie, die dahinter steht beleuchtet. Schliesslich wird, sofern es sich an dieser Stelle anbietet, das Gelernte zusammengefasst und in einen größeren Zusammenhang gestellt. Diese vier Schritte wiederholen sich fortwährend bei der Bearbeitung der einzelnen Themen und werden noch durch Aufgaben ergänzt.

  1. Präsentation einer Aufgabe bzw. einer Anwendung
  2. Umsetzung in C++
  3. Hintergrundinformationen und Theorie
  4. Zusammenfassung, Ergänzungen, Grösserer Zusammenhang

Es folgt eine detaillierte Themenübersicht.

Nr. Thema Beispiel 1 Beispiel 2 Theorie und Relevanz im technischen Bereich neue Sprachelemente
1 Hauptprogramme entwickeln und ablaufen lassen Zahlen addieren Wurzel ziehen Entwicklungsweg der Programmiersprachen von prozeduralen Sprachen zu prozeduralen mit Funktionsaufrufen, hin zu objektorientierten Sprachen. C++ als hybride Sprache. Prozedural und schnell: FEM-Berechnungen, Objekt-orientiert und komplex: Produktion eines Automobils Installation von Bloodshed Dev-C++, Compilieren und Ausführen von Programmen in der Konsole, Aufbau einer main-Methode, Eingabe und Ausgabe an Konsole, Programmverzweigung, #include, using namespace, int main(void), { }, cout, cin, int, double, y=x*x, sqrt(x), return 0, if, do{}while;
2 Funktionen schreiben und aufrufen Rationale Funktion 3. Grades als C++ Berechnungs-Funktion Nullstellen finden mit Regula falsi redundanten Programmcode in Funktionen auslagern, Funktionen Kopf und Rumpf schreiben, Funktionen aufrufen endl, double g(char[] c){...}, double p(double x, double y){...}, return x, return x*y
3 Arrays Mittelwert einer eingegebenen Zahlenfolge finden Streuung einer eingegebenen Zahlenfolge finden und Funktionen in Header-Datei ablegen und einbinden Anlegen eines Arrays fester Größe, Verwendung der for-Schleife, Array-Elemente über Index ansprechen, Header-Dateien bilden #include "statistik.h", double werte[1000], werte[i], mittelwert(werte,anzahl), for(...){...}
4 Textverarbeitung Befehle erkennen und ausführen Textuell zusammenhängend eingegebene Zahlenfolge parsen Text in string-Objekten speichern, Verwendung der Objektmethoden von string, Anwendung von Vergleichsoperatoren auf Texte (Verarbeitung logischer Ausdrücke), Umwandlung von Text in Zahlen, andere Programme vom eigenen Programm aus starten, Endlosschleife und break verstehen #include, if(..){..}else if(..){..}else{..}, break, system(...), string text, text.at(i), text.size(), text.substr(...), if(befehl=="dir"), stringstream, if(a || b), break, while(true)
5 Zeiger Sortieren zweier Zahlen mit Hilfe von Referenzen Vereinfachung des Text-Parsens mit Hilfe einer Referenz Umgehen Zeit-intensiver Speicheroperationen durch Referenzierung des Speicherortes großer Datenmengen, Call by Value und Call by Reference verstehen, Zusammenhang zwischen Bezeichner, Adresse und Wert, Overloading verstehen, Postinkrement-Operator, Risiken bei der Verwendung von Zeigern erkennen int* werte = parse(...), void sortierezwei(int* x, int* y) {...}, sortierezwei(&x,&y), cin.getline(zeile,1000), text[i]=='\\\\0',zeiger = &text[aktuell],i++, atof(...), char* zeiger, bool ende = false, do{..}while(!ende)
6 Fileoperationen Berechnete Teiler von Quarz- und Samplefrequenzen als ASCII-File speichern und wieder einlesen Zahlenfolge als Byte-Stream mit Hilfe von Union laden und speichern Umgang mit nur sequenziell lesbaren Medien, Files als Schnittstelle zwischen verschiedenen Programmen, Aufwändig gewonnene Daten archivieren #include ,ofstream ausgabe,ausgabe.open(),ausgabe.close(),ifstream eingabe(filename),text.data(), int main(int anz,char *wort[]) cerr<<"Fehler",#define MAXWERT 7, const int MAXWERT = 100,if(rest%teiler==0){...}
7 Dynamische Speicherverwaltung Verbesserung der Ladeoperation durch dynamisches Anlegen eines Arrays Polygone beliebiger Ordnung mit einer einzigen Funktion berechnen und visualisieren Erstellung flexibler Programme, indem erst zur Laufzeit Array-Größen festgelegt werden
8 Interpolieren Lineare Interpolation einer Zahlenfolge Lineare Regression Interpolation als Möglichkeit, lückenhaftes Wissen durch die Zusatz-Annahme eines kontinuierlichen, glatten Verlaufes, zu vervollständigen
9 Sortieren Zahlenfolge der Größe nach ordnen mit Bubble-Sort Indizes der sortierten Zahlenfolge bestimmen mit Insertion-Sort: Um den Geamtweg beim Abfahren einer Reihe von Städten zu minimieren, wird immer die nächste noch nicht besuchte Stadt ausgesucht. Zusammenhang zwischen Kompliziertheit eines Algorithmus und seiner Geschwindigkeit aufzeigen: Bei einfachen, nicht zeitkritischen Anwendungen, ist ein einfacher langsamer Algorithmus die bessere Wahl. Wartbarkeit und Effizienz sind gegenläufige Kriterien und gegeneinander abzuwägen. Bedeutung von Sortierverfahren bei Optimierungsproblemen aufzeigen, Bereitstellen von Sortierverfahren sowohl für Werte, als auch für die Indices der geordneten Reihenfolge
10 Auswählen Alle Kombinationen der Eigenschaften für ein geometrisches Objekt durchgehen und als Poscriptdatei ausgeben Sortieren, Glätten, Normieren, reduzieren eines Datensatzes soll in jeder möglichen Reihenfolge durchgeführt werden, um die Kommutativität der Operationen zu überprüfen. Deshalb zunächst alle Permutationen einer Abfolge bestimmen und ausgeben Bedeutung von Auswahlverfahren für Parameterstudien aufzeigen. Hinweis auf das exponentielle Anwachsen von Kombinations- und Auswahlmöglichkeiten und das Erfordernis der Beschränkung. Bereitstellen von Auswahlverfahren, Aufteilen komplexer Vorgänge in Teilaufgaben

Tabelle 0-1: Themen