Sebastian Houben Intensivkurs C++ 1. Intensivkurs C++ 21. September 2015



Ähnliche Dokumente
Intensivkurs C++ Tag 1: Grundlagen Sebastian Houben Institut für Neuroinformatik Rahmen Grundlagen Aufgaben


Tutorium Rechnerorganisation

Einführung in die C-Programmierung

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Klausur in Programmieren

Grundlagen. Kapitel 1

Einführung in die Programmierung (EPR)

1 Vom Problem zum Programm

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Einführung in die Programmierung

Vorkurs C++ Programmierung

Angewandte Mathematik und Programmierung

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2015/2016 Wirtschaftsingenieur Bachelor 5. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Programmierung

Zählen von Objekten einer bestimmten Klasse

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Programmierkurs Java

Hochschule Darmstadt Informatik-Praktikum (INF 1) WS 2014/2015 Wirtschaftsingenieur Bachelor 4. Aufgabe Datenstruktur, Dateieingabe und -ausgabe

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

Erwin Grüner

Programmierung in C. Grundlagen. Stefan Kallerhoff

Informatik I (D-MAVT)

Einführung in die C++ Programmierung für Ingenieure

Die Programmiersprache C99: Zusammenfassung

Modellierung und Programmierung 1

Es sollte die MS-DOS Eingabeaufforderung starten. Geben Sie nun den Befehl javac ein.

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

Die Programmiersprache C

1. Übung zu "Numerik partieller Differentialgleichungen"

Grundlagen der Informatik - 6. Praktikum

Grundlagen von Python

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Übung 9 - Lösungsvorschlag

Klausur in Programmieren

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Objektorientierte Programmierung für Anfänger am Beispiel PHP

5. Tutorium zu Programmieren

Objektbasierte Entwicklung

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Native Zeichenketten (C-Strings)

Übungen Programmieren 1 Felix Rohrer. Übungen

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Übersicht Programmablaufsteuerung

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

Kurze Einführung in die Programmiersprache C++ und in Root

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Deklarationen in C. Prof. Dr. Margarita Esponda

Java Kurs für Anfänger Einheit 5 Methoden

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Installation und Inbetriebnahme von Microsoft Visual C Express

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Delegatesund Ereignisse

M. Graefenhan Übungen zu C. Blatt 3. Musterlösung

Fallunterscheidung: if-statement

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29

2. Semester, 2. Prüfung, Lösung

Klausurteilnehmer. Wichtige Hinweise. Note: Klausur Informatik Programmierung, Seite 1 von 8 HS OWL, FB 7, Malte Wattenberg.

Übungen zu C++ Kapitel 1

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 16

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Propädeutikum. Dipl.-Inf. Frank Güttler

Proseminar C-Programmierung. Strukturen. Von Marcel Lebek

FB Informatik. Fehler. Testplan

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

DLLs (dynamic loaded libraries) mit MingW erstellen

Qt-Projekte mit Visual Studio 2005

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Projektverwaltung Problem Lösung: Modulare Programmierung

Praxisorientierte Einführung in C++ Lektion: "Die Compiler-Chain (Vom Quellcode zum ausführbaren Programm)"

Programmiersprachen Einführung in C. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm. Unser erstes C-Programm

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

1Schnelleinstieg 14. 2Wie aus einer einfachen Textdatei. 3 Wie man eigene Programme erstellt 30. Inhaltsverzeichnis. ein Programm wird 20

Kompilieren und Linken

Übungsblatt 3: Algorithmen in Java & Grammatiken

Alltagsnotizen eines Softwareentwicklers

Distributed Computing Group

Einführung in die Programmierung

Objektorientiertes Programmieren für Ingenieure

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Informatik Repetitorium SS Volker Jaedicke

Objektorientierte Programmierung

Wirtschaftsinformatik I

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Eine Einführung in C-Funktionen

Datentypen: Enum, Array, Struct, Union

Fakultät Angewandte Informatik Lehrprofessur für Informatik

SEP 114. Design by Contract

Xcode/Cocoa/Objective-C Crashkurs Programmieren unter Mac OS X

Praktikum Ingenieurinformatik. Termin 2. Verzweigungen (if-else), printf und scanf, while-schleife

Klausur in Programmieren

Transkript:

Sebastian Houben Intensivkurs C++ 1 Intensivkurs C++ 21. September 2015

Themen Sebastian Houben Intensivkurs C++ 2 Warum C++? Ziel dieses Kurses Voraussetzungen Verwandschaft zu C, Java und anderen Sprachen Dateistruktur, Compiler und Linker, Präprozessor Datentypen Kontrollstrukturen Ein- und Ausgabe Typumwandlung Anwesenheitsaufgabe

Formalien Sebastian Houben Intensivkurs C++ 3

Formalien Sebastian Houben Intensivkurs C++ 3 Der Kurs besteht aus 10 Einheiten von je (maximal) 8 Stunden. Jeder Tag wird von einer Vorlesung eingeleitet, an die sich betreute Programmierübungen anschließen. In beiden Wochen stehen die Freitage zur Wiederholung von Stoff zur Verfügung.

Formalien Sebastian Houben Intensivkurs C++ 3 Der Kurs besteht aus 10 Einheiten von je (maximal) 8 Stunden. Jeder Tag wird von einer Vorlesung eingeleitet, an die sich betreute Programmierübungen anschließen. In beiden Wochen stehen die Freitage zur Wiederholung von Stoff zur Verfügung. Die Aufgaben können entweder allein oder zu zweit gelöst werden. Die Bearbeitung aller Aufgaben ist Voraussetzung für die erfolgreiche Teilnahme. Es gibt eine Liste, in der jeden Tag die erfolgreich bearbeiteten Aufgaben abgezeichnet werden.

Formalien Sebastian Houben Intensivkurs C++ 3 Der Kurs besteht aus 10 Einheiten von je (maximal) 8 Stunden. Jeder Tag wird von einer Vorlesung eingeleitet, an die sich betreute Programmierübungen anschließen. In beiden Wochen stehen die Freitage zur Wiederholung von Stoff zur Verfügung. Die Aufgaben können entweder allein oder zu zweit gelöst werden. Die Bearbeitung aller Aufgaben ist Voraussetzung für die erfolgreiche Teilnahme. Es gibt eine Liste, in der jeden Tag die erfolgreich bearbeiteten Aufgaben abgezeichnet werden. Alle Aufgaben sollten um 17:30 fertig bearbeitet sein, da der Raum pünktlich um 18:00 Uhr verlassen werden muss.

Formalien Sebastian Houben Intensivkurs C++ 3 Der Kurs besteht aus 10 Einheiten von je (maximal) 8 Stunden. Jeder Tag wird von einer Vorlesung eingeleitet, an die sich betreute Programmierübungen anschließen. In beiden Wochen stehen die Freitage zur Wiederholung von Stoff zur Verfügung. Die Aufgaben können entweder allein oder zu zweit gelöst werden. Die Bearbeitung aller Aufgaben ist Voraussetzung für die erfolgreiche Teilnahme. Es gibt eine Liste, in der jeden Tag die erfolgreich bearbeiteten Aufgaben abgezeichnet werden. Alle Aufgaben sollten um 17:30 fertig bearbeitet sein, da der Raum pünktlich um 18:00 Uhr verlassen werden muss. Die Aufgaben werden benotet. Die Gesamtnote ergibt sich aus dem Durchschnitt der Tagesnoten.

Formalien Sebastian Houben Intensivkurs C++ 4 Nicht vollständig bearbeitete Aufgaben können am folgenden Freitag derselben Woche nachgereicht werden.

Formalien Sebastian Houben Intensivkurs C++ 4 Nicht vollständig bearbeitete Aufgaben können am folgenden Freitag derselben Woche nachgereicht werden. Es ist möglich, bis zu 3 Tage entschuldigt zu fehlen. Dies betrifft sowohl Krankheit wie auch anderweitige Termine wie z.b. Klausuren. Die Aufgaben können nachgereicht werden (siehe oben).

Formalien Sebastian Houben Intensivkurs C++ 4 Nicht vollständig bearbeitete Aufgaben können am folgenden Freitag derselben Woche nachgereicht werden. Es ist möglich, bis zu 3 Tage entschuldigt zu fehlen. Dies betrifft sowohl Krankheit wie auch anderweitige Termine wie z.b. Klausuren. Die Aufgaben können nachgereicht werden (siehe oben). Es gibt eine Kurs-Homepage mit aktuellem Material auf http://ini.rub.de/courses/ 70-Intensive%20Course%20C++

Formalien Sebastian Houben Intensivkurs C++ 4 Nicht vollständig bearbeitete Aufgaben können am folgenden Freitag derselben Woche nachgereicht werden. Es ist möglich, bis zu 3 Tage entschuldigt zu fehlen. Dies betrifft sowohl Krankheit wie auch anderweitige Termine wie z.b. Klausuren. Die Aufgaben können nachgereicht werden (siehe oben). Es gibt eine Kurs-Homepage mit aktuellem Material auf http://ini.rub.de/courses/ 70-Intensive%20Course%20C++ Viel Spaß mit C++!!!

Warum C++? Sebastian Houben Intensivkurs C++ 5 Stärken: C++ ist schnell! C++ ist unglaublich flexibel. C++ ist typsicher. C++ ist gut organisiert; für sehr große Projekte geeignet. C++ ist ein weit verbreiteter Industriestandard. C++ ist extrem portabel.

Warum C++? Sebastian Houben Intensivkurs C++ 5 Stärken: C++ ist schnell! C++ ist unglaublich flexibel. C++ ist typsicher. C++ ist gut organisiert; für sehr große Projekte geeignet. C++ ist ein weit verbreiteter Industriestandard. C++ ist extrem portabel. Schwächen: C++ erscheint dem Anfänger oft unnötig komplex. Relativ viel boilerplate code. Teilweise kryptische Syntax (bei fortgeschrittenen Konzepten, z.b. Funktionszeiger). Teils schwer lesbare Fehlermeldungen (insbesondere im Zusammenhang mit Templates).

Ziel dieses Kurses Sebastian Houben Intensivkurs C++ 6 Einführung der Grundkonzepte der Programmierprache C++.

Ziel dieses Kurses Sebastian Houben Intensivkurs C++ 6 Einführung der Grundkonzepte der Programmierprache C++. Es ist leicht, mit einer Darstellung von C++ ganze Regalwände zu füllen. C++ ist sehr umfangreich. Deshalb kann dieser Kurs keinen Anspruch auf Vollständigkeit haben.

Ziel dieses Kurses Sebastian Houben Intensivkurs C++ 6 Einführung der Grundkonzepte der Programmierprache C++. Es ist leicht, mit einer Darstellung von C++ ganze Regalwände zu füllen. C++ ist sehr umfangreich. Deshalb kann dieser Kurs keinen Anspruch auf Vollständigkeit haben. Ganz wichtig: Hands on! Dies ist ein Praktikum, keine Vorlesung! Learning by doing, sonst bleibt nur die Hälfte hängen.

Voraussetzungen Sebastian Houben Intensivkurs C++ 7 Jeder Teilnehmer sollte Erfahrung mit einer halbwegs modernen (imperativen) Programmiersprache haben: Java, Javascript, Python, Lua, Pearl, PHP, C, Objective-C, C#,...).

Voraussetzungen Sebastian Houben Intensivkurs C++ 7 Jeder Teilnehmer sollte Erfahrung mit einer halbwegs modernen (imperativen) Programmiersprache haben: Java, Javascript, Python, Lua, Pearl, PHP, C, Objective-C, C#,...). Erfahrung mit einer objektorientierten Sprache (z.b. Java oder Python) ist von Vorteil.

Verwandschaft zu C, Java und anderen Sprachen Sebastian Houben Intensivkurs C++ 8 C++ ist (fast) eine Obermenge von C. Das heißt, dass fast aller C-Code in C++ gültig ist. Allerdings bietet C++ wesentlich bessere Möglichkeiten zur Strukturierung eines Programms und ermutigt deshalb zu einem besseren Stil (modularer, gut wartbarer Code).

Verwandschaft zu C, Java und anderen Sprachen Sebastian Houben Intensivkurs C++ 8 C++ ist (fast) eine Obermenge von C. Das heißt, dass fast aller C-Code in C++ gültig ist. Allerdings bietet C++ wesentlich bessere Möglichkeiten zur Strukturierung eines Programms und ermutigt deshalb zu einem besseren Stil (modularer, gut wartbarer Code). Java verfolgt ähnliche Ziele wie C++. Viele aus Java bekannte Konzepte übertragen sich auf die Programmierung in C++, aber C++ bietet generell mehr Möglichkeiten, mehr Kontrolle, und als Preis dafür leider oft weniger Komfort.

Verwandschaft zu C, Java und anderen Sprachen Sebastian Houben Intensivkurs C++ 8 C++ ist (fast) eine Obermenge von C. Das heißt, dass fast aller C-Code in C++ gültig ist. Allerdings bietet C++ wesentlich bessere Möglichkeiten zur Strukturierung eines Programms und ermutigt deshalb zu einem besseren Stil (modularer, gut wartbarer Code). Java verfolgt ähnliche Ziele wie C++. Viele aus Java bekannte Konzepte übertragen sich auf die Programmierung in C++, aber C++ bietet generell mehr Möglichkeiten, mehr Kontrolle, und als Preis dafür leider oft weniger Komfort. Viele moderne Sprachen orientieren sich an C++, insbesondere an seiner Syntax. Wer eine andere Programmiersprache kennt, wird deshalb vieles wiedererkennen, aber mit Sicherheit auch neue Konzepte lernen, die er dann möglicherweise in anderen Sprachen vermisst.

Hello World Sebastian Houben Intensivkurs C++ 9 Für die ganz Ungeduldigen - Hello World sieht in C++ so aus: helloworld.cpp #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; }

Hello World Sebastian Houben Intensivkurs C++ 9 Für die ganz Ungeduldigen - Hello World sieht in C++ so aus: helloworld.cpp #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } Die Elemente dieses Programms werden nach und nach behandelt. Zuerst gilt es, unsere Arbeitsumgebung kennen zu lernen.

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts!

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld Fügen Sie eine Datei hinzu: Project Add New Item Code C++ File; Name= main.cpp

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld Fügen Sie eine Datei hinzu: Project Add New Item Code C++ File; Name= main.cpp (Menü Project Properties) Configuration Properties Linker System; Setzen Sie Subsystem auf Console.

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld Fügen Sie eine Datei hinzu: Project Add New Item Code C++ File; Name= main.cpp (Menü Project Properties) Configuration Properties Linker System; Setzen Sie Subsystem auf Console. Tippen Sie das Hallo-Welt -Programm ein: #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; }

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld Fügen Sie eine Datei hinzu: Project Add New Item Code C++ File; Name= main.cpp (Menü Project Properties) Configuration Properties Linker System; Setzen Sie Subsystem auf Console. Tippen Sie das Hallo-Welt -Programm ein: #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } Menü Build Build Solution zum Kompilieren und Linken.

Hello World Sebastian Houben Intensivkurs C++ 10 Los gehts! Starten Sie Visual Studio Legen Sie ein neues Projekt an: New Project Empty Project; Name= HelloWorld Fügen Sie eine Datei hinzu: Project Add New Item Code C++ File; Name= main.cpp (Menü Project Properties) Configuration Properties Linker System; Setzen Sie Subsystem auf Console. Tippen Sie das Hallo-Welt -Programm ein: #include <iostream> using namespace std; int main() { cout << "Hello, World!" << endl; return 0; } Menü Build Build Solution zum Kompilieren und Linken. Drücken Sie Ctrl+F5 zum Starten des Programms.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 11 Dateistruktur eines C++-Programms

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Beispiel: Ein Programm besteht aus den Dateien main.cpp, algo.cpp und tools.cpp. Daraus soll ein ausführbares Programm erstellt werden. Folgende Schritte sind notwendig: Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Beispiel: Ein Programm besteht aus den Dateien main.cpp, algo.cpp und tools.cpp. Daraus soll ein ausführbares Programm erstellt werden. Folgende Schritte sind notwendig: 1 Der Compiler übersetzt main.cpp in main.obj. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Beispiel: Ein Programm besteht aus den Dateien main.cpp, algo.cpp und tools.cpp. Daraus soll ein ausführbares Programm erstellt werden. Folgende Schritte sind notwendig: 1 Der Compiler übersetzt main.cpp in main.obj. 2 Der Compiler übersetzt algo.cpp in algo.obj. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Beispiel: Ein Programm besteht aus den Dateien main.cpp, algo.cpp und tools.cpp. Daraus soll ein ausführbares Programm erstellt werden. Folgende Schritte sind notwendig: 1 Der Compiler übersetzt main.cpp in main.obj. 2 Der Compiler übersetzt algo.cpp in algo.obj. 3 Der Compiler übersetzt tools.cpp in tools.obj. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Dateistruktur eines C++-Programms Ein typisches C++-Programm ist über mehrere Dateien (oft mit Endung.cpp) verteilt. Jede Datei kann einzeln vom Compiler in eine sogenannte Objektdatei übersetzt werden. In einem letzten Schritt bündelt der Linker die Objektdateien zu einem ausführbaren Programm. Beispiel: Ein Programm besteht aus den Dateien main.cpp, algo.cpp und tools.cpp. Daraus soll ein ausführbares Programm erstellt werden. Folgende Schritte sind notwendig: 1 Der Compiler übersetzt main.cpp in main.obj. 2 Der Compiler übersetzt algo.cpp in algo.obj. 3 Der Compiler übersetzt tools.cpp in tools.obj. 4 Der Linker setzt main.obj, algo.obj und tools.obj zum ausführbaren Programm (beispiel.exe) zusammen. Sebastian Houben Intensivkurs C++ 11

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 12 Q: Wie können Programmteile (Funktionen, Klassen) in verschiedenen Dateien von einander wissen, so dass sie sich gegenseitig aufrufen können?

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 12 Q: Wie können Programmteile (Funktionen, Klassen) in verschiedenen Dateien von einander wissen, so dass sie sich gegenseitig aufrufen können? A: Meist gibt es zu jeder.cpp-datei eine Header-Datei (.h oder.hpp). Die Header-Datei enthält ausschließlich Deklarationen, während die.cpp-datei die zugehörige Implementierung enthält. Einer.cpp-Datei wird Wissen über andere Programmteile durch Einbinden der entsprechenden Header-Dateien mitgeteilt.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 13 Q: Wo wird definiert, welche Dateien zusammengehören, um ein ausführbares Programm zu bilden?

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 13 Q: Wo wird definiert, welche Dateien zusammengehören, um ein ausführbares Programm zu bilden? A: Das ist nicht Teil der Programmiersprache! Dies wird von jeder Programmierumgebung unterschiedlich gelöst. Visual Studio speichert diese Information in sogenannten Projektdateien (Solutions), die wiederum in Arbeitsbereiche organisiert sind. Jedes Projekt entspricht einer Bibliothek oder einem ausführbaren Programm. Ein Projekt definiert Quellen (.cpp) und Header (.h), sowie welche Bibliotheken verwendet werden sollen und wo diese zu finden sind.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 14 main.cpp #include "square.h" int main() { int s = square(7); } square.h #ifndef SQUARE_H #define SQUARE_H int square(int value); // Deklaration #endif square.cpp int square(int value) { return value * value; } // Implementierung

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 15 Bibliotheken

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 15 Bibliotheken Niemand sollte das Rad neu erfinden. Für viele Standardaufgaben gibt es sehr gute Bibliotheken (z.b. die boost-bibliotheken, die später Thema sein werden).

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 15 Bibliotheken Niemand sollte das Rad neu erfinden. Für viele Standardaufgaben gibt es sehr gute Bibliotheken (z.b. die boost-bibliotheken, die später Thema sein werden). Eine Bibliothek besteht aus zwei Teilen:

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 15 Bibliotheken Niemand sollte das Rad neu erfinden. Für viele Standardaufgaben gibt es sehr gute Bibliotheken (z.b. die boost-bibliotheken, die später Thema sein werden). Eine Bibliothek besteht aus zwei Teilen: Die eigentliche Bibliothek (Windows:.lib oder.dll; Linux:.a oder.so; Mac:.a oder.dylib) enthält die Implementierung, also das, was den.cpp-dateien entspricht). Die Deklarationen zu einer Bibliothek stehen in den entsprechenden Header-Dateien. Diese gehören fest zur Bibliothek.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 16 Beispiel: Unser Programm (main.cpp, algo.cpp, tools.cpp) verwendet die Bibliothek matrix, bestehend aus matrix.lib und matrix.h. Nehmen wir an, dass die Routinen aus matrix nur innerhalb von algo.cpp verwendet werden.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 16 Beispiel: Unser Programm (main.cpp, algo.cpp, tools.cpp) verwendet die Bibliothek matrix, bestehend aus matrix.lib und matrix.h. Nehmen wir an, dass die Routinen aus matrix nur innerhalb von algo.cpp verwendet werden. 1 Der Compiler übersetzt algo.cpp in algo.obj. Er liest die Definitionen aus matrix.h ein, wobei ihm völlig egal ist, ob sich die Implementierungen zu den Definitionen in einer anderen.cpp-datei oder in einer Bibliothek befinden.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 16 Beispiel: Unser Programm (main.cpp, algo.cpp, tools.cpp) verwendet die Bibliothek matrix, bestehend aus matrix.lib und matrix.h. Nehmen wir an, dass die Routinen aus matrix nur innerhalb von algo.cpp verwendet werden. 1 Der Compiler übersetzt algo.cpp in algo.obj. Er liest die Definitionen aus matrix.h ein, wobei ihm völlig egal ist, ob sich die Implementierungen zu den Definitionen in einer anderen.cpp-datei oder in einer Bibliothek befinden. 2 Der Linker setzt main.obj, algo.obj, tools.obj und matrix.lib zum ausführbaren Programm (beispiel.exe) zusammen.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 17 Präprozessor-Macros Alle Präprozessor-Macros beginnen mit dem Symbol #.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 17 Präprozessor-Macros Alle Präprozessor-Macros beginnen mit dem Symbol #. #include "dateiname" wird durch den Inhalt der Datei ersetzt. Die Datei wird zuerst im aktuellen Projekt gesucht. So werden Dateien aus dem eigenen Projekt eingebunden.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 17 Präprozessor-Macros Alle Präprozessor-Macros beginnen mit dem Symbol #. #include "dateiname" wird durch den Inhalt der Datei ersetzt. Die Datei wird zuerst im aktuellen Projekt gesucht. So werden Dateien aus dem eigenen Projekt eingebunden. #include <dateiname> wird durch den Inhalt der Datei ersetzt. Die Datei wird im Include-Suchpfad gesucht. Diese Syntax wird für Header aus Bibliotheken verwendet.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 17 Präprozessor-Macros Alle Präprozessor-Macros beginnen mit dem Symbol #. #include "dateiname" wird durch den Inhalt der Datei ersetzt. Die Datei wird zuerst im aktuellen Projekt gesucht. So werden Dateien aus dem eigenen Projekt eingebunden. #include <dateiname> wird durch den Inhalt der Datei ersetzt. Die Datei wird im Include-Suchpfad gesucht. Diese Syntax wird für Header aus Bibliotheken verwendet. #define NAME oder #define NAME Wert, z.b. #define WIDTH 80. Definition einer Konstanten.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 17 Präprozessor-Macros Alle Präprozessor-Macros beginnen mit dem Symbol #. #include "dateiname" wird durch den Inhalt der Datei ersetzt. Die Datei wird zuerst im aktuellen Projekt gesucht. So werden Dateien aus dem eigenen Projekt eingebunden. #include <dateiname> wird durch den Inhalt der Datei ersetzt. Die Datei wird im Include-Suchpfad gesucht. Diese Syntax wird für Header aus Bibliotheken verwendet. #define NAME oder #define NAME Wert, z.b. #define WIDTH 80. Definition einer Konstanten. #ifdef, #ifndef, #else und #endif werden zur bedingten Kompilierung verwendet. Beispiel: #ifdef DEBUG cout << "Zwischenergebnis: " << z << endl; #endif

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein. Dies geschieht rekursiv, so dass ein einziges #include Statement eine große Menge an Headern einbinden kann.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein. Dies geschieht rekursiv, so dass ein einziges #include Statement eine große Menge an Headern einbinden kann. Deshalb ist oft unklar, ob ein Header bereits (implizit) eingebunden wurde oder nicht.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein. Dies geschieht rekursiv, so dass ein einziges #include Statement eine große Menge an Headern einbinden kann. Deshalb ist oft unklar, ob ein Header bereits (implizit) eingebunden wurde oder nicht. Damit jeder Header nur maximal einmal in eine.cpp-datei eingebunden wird, verwendet man sogenannte include-guards: #ifndef MEIN_HEADER_H #define MEIN_HEADER_H...Inhalt... #endif

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein. Dies geschieht rekursiv, so dass ein einziges #include Statement eine große Menge an Headern einbinden kann. Deshalb ist oft unklar, ob ein Header bereits (implizit) eingebunden wurde oder nicht. Damit jeder Header nur maximal einmal in eine.cpp-datei eingebunden wird, verwendet man sogenannte include-guards: #ifndef MEIN_HEADER_H #define MEIN_HEADER_H...Inhalt... #endif Dabei ist MEIN HEADER H irgendein eindeutiger String, meist einfach der Dateiname.

Dateistruktur, Compiler und Linker, Präprozessor Sebastian Houben Intensivkurs C++ 18 Oft binden Header-Dateien weitere Header ein. Dies geschieht rekursiv, so dass ein einziges #include Statement eine große Menge an Headern einbinden kann. Deshalb ist oft unklar, ob ein Header bereits (implizit) eingebunden wurde oder nicht. Damit jeder Header nur maximal einmal in eine.cpp-datei eingebunden wird, verwendet man sogenannte include-guards: #ifndef MEIN_HEADER_H #define MEIN_HEADER_H...Inhalt... #endif Dabei ist MEIN HEADER H irgendein eindeutiger String, meist einfach der Dateiname.

Kommentare Sebastian Houben Intensivkurs C++ 19 Zeilen-Kommentar: // Diese ganze Zeile ist ein Kommentar. int magic = 42; // siehe "Per Anhalter durch die Galaxis"...

Kommentare Sebastian Houben Intensivkurs C++ 19 Zeilen-Kommentar: // Diese ganze Zeile ist ein Kommentar. int magic = 42; // siehe "Per Anhalter durch die Galaxis"... Block-Kommentar: int magic = /*42*/ 1001; /* Als magische Zahl ist 1001 viel schöner als 42. Das liegt an ihrer Primfaktorzerlegung: 7 * 11 * 13 = 1001. */

Variablen und Funktionen Sebastian Houben Intensivkurs C++ 20 Variablen: Typ Name; int a; int b = 7; int c, d = 3, e = f(b);

Variablen und Funktionen Sebastian Houben Intensivkurs C++ 20 Variablen: Typ Name; int a; int b = 7; int c, d = 3, e = f(b); Funktionen: Typ Name(Parameterliste) int f(int x); // Deklaration von f int f(int x) { return x * (1 - x); } // Implementierung von f int foo(int a, int b, float c, bool flag = true);

Variablen und Funktionen Sebastian Houben Intensivkurs C++ 20 Variablen: Typ Name; int a; int b = 7; int c, d = 3, e = f(b); Funktionen: Typ Name(Parameterliste) int f(int x); // Deklaration von f int f(int x) { return x * (1 - x); } // Implementierung von f int foo(int a, int b, float c, bool flag = true); Funktionsaufrufe int ergebnis = foo(f(7), d, 3.14159); foo(-42, 3, 3.14159, true);

Vorwärtsdeklaration Sebastian Houben Intensivkurs C++ 21 Beispiel: Rekursion über zwei Funktionen. void foo() { if (...) bar(); } void bar() { if (...) foo(); }

Vorwärtsdeklaration Sebastian Houben Intensivkurs C++ 21 Beispiel: Rekursion über zwei Funktionen. void foo() { if (...) bar(); } void bar() { if (...) foo(); } Problem: Der Compiler arbeitet von vorn nach hinten und weiß deshalb nicht, was nach der aktuellen Stelle im Programm noch kommt. Innerhalb der Funktion foo ist bar noch nicht deklariert, wird aber aufgerufen.

Vorwärtsdeklaration Sebastian Houben Intensivkurs C++ 21 Beispiel: Rekursion über zwei Funktionen. void foo() { if (...) bar(); } void bar() { if (...) foo(); } Problem: Der Compiler arbeitet von vorn nach hinten und weiß deshalb nicht, was nach der aktuellen Stelle im Programm noch kommt. Innerhalb der Funktion foo ist bar noch nicht deklariert, wird aber aufgerufen. Fehler!

Vorwärtsdeklaration Sebastian Houben Intensivkurs C++ 21 Beispiel: Rekursion über zwei Funktionen. void foo() { if (...) bar(); } void bar() { if (...) foo(); } Problem: Der Compiler arbeitet von vorn nach hinten und weiß deshalb nicht, was nach der aktuellen Stelle im Programm noch kommt. Innerhalb der Funktion foo ist bar noch nicht deklariert, wird aber aufgerufen. Fehler! Abhilfe: Vorwärtsdeklaration: void bar(); void foo() { if (...) bar(); } void bar() { if (...) foo(); } // Vorwärtsdeklaration von bar

Datentypen Sebastian Houben Intensivkurs C++ 22 void: kein Wert, tritt oft als Rückgabetyp von Funktionen auf

Datentypen Sebastian Houben Intensivkurs C++ 22 void: kein Wert, tritt oft als Rückgabetyp von Funktionen auf Logik: bool, mit Werten true, false, belegt 1 Byte

Datentypen Sebastian Houben Intensivkurs C++ 22 void: kein Wert, tritt oft als Rückgabetyp von Funktionen auf Logik: bool, mit Werten true, false, belegt 1 Byte Ganzzahl: char (8 Bit), int (meist 32 Bit). Konstanten: 42, -5, a, \n, \\, \ Modifikatoren: unsigned, short, long, long long unsigned long long int (= unsigned long long)

Datentypen Sebastian Houben Intensivkurs C++ 22 void: kein Wert, tritt oft als Rückgabetyp von Funktionen auf Logik: bool, mit Werten true, false, belegt 1 Byte Ganzzahl: char (8 Bit), int (meist 32 Bit). Konstanten: 42, -5, a, \n, \\, \ Modifikatoren: unsigned, short, long, long long unsigned long long int (= unsigned long long) Fließkomma: float (meist 32 Bit IEEE), double (meist 64 Bit IEEE) Konstanten: -1.0, 3.14159,.01, +5.77e-18

Datentypen Sebastian Houben Intensivkurs C++ 22 void: kein Wert, tritt oft als Rückgabetyp von Funktionen auf Logik: bool, mit Werten true, false, belegt 1 Byte Ganzzahl: char (8 Bit), int (meist 32 Bit). Konstanten: 42, -5, a, \n, \\, \ Modifikatoren: unsigned, short, long, long long unsigned long long int (= unsigned long long) Fließkomma: float (meist 32 Bit IEEE), double (meist 64 Bit IEEE) Konstanten: -1.0, 3.14159,.01, +5.77e-18 C-Strings: char s[256] = "Hallo, Welt"; (char-array) C++-Strings: string s = "Hallo, Welt"; (String-Objekt)

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Zeiger = Speicheradresse

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg };

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg }; Zusammengesetzte Typen: class, struct, union

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg }; Zusammengesetzte Typen: class, struct, union C-Arrays: int a[20], bool b[64][64]

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg }; Zusammengesetzte Typen: class, struct, union C-Arrays: int a[20], bool b[64][64] STL-Container: vector, list, deque, set, multiset, map, multimap

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg }; Zusammengesetzte Typen: class, struct, union C-Arrays: int a[20], bool b[64][64] STL-Container: vector, list, deque, set, multiset, map, multimap Alias-Namen für Typen: typedef Typ Name; Genauer: typedef [Variablendefinition mit neuem Namen als Variablennamen];

Datentypen Sebastian Houben Intensivkurs C++ 23 Zeiger: int* Referenz: int& Zeiger = Speicheradresse Referenz = anderer Name für eine Variable void*: Zeiger auf untypisierten Speicher Konstante nullptr: ungültiger Zeiger Aufzählungen: enum FileFormat { wav, mp3, ogg }; Zusammengesetzte Typen: class, struct, union C-Arrays: int a[20], bool b[64][64] STL-Container: vector, list, deque, set, multiset, map, multimap Alias-Namen für Typen: typedef Typ Name; Genauer: typedef [Variablendefinition mit neuem Namen als Variablennamen];

Operatoren Sebastian Houben Intensivkurs C++ 24 :: () []. -> ++ -- dynamic cast static cast reinterpret cast const cast typeid ++ --! sizeof new delete * & + - (unary) (type).* ->* * / % + - (binary) << >> < > <= >= ==!= & ˆ && a? b : c = *= /= %= += -= >>= <<= &= ˆ= =,

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 25 Block { } Kommando1; Kommando2;...

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 25 Block { } Kommando1; Kommando2;... Bedingte Ausführung 1 if (Bedingung) Kommando1; [else Kommando2];

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 25 Block { } Kommando1; Kommando2;... Bedingte Ausführung 1 if (Bedingung) Kommando1; [else Kommando2]; Bedingte Ausführung 2 switch (Ausdruck) { case Konstante1: Kommandos1; break; case Konstante2: Kommandos2; break;... default: KommandosN; }

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3;

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3; For-Schleife (range-based) for (Typ Variable : Container/Range) Kommando;

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3; For-Schleife (range-based) for (Typ Variable : Container/Range) Kommando; While-Schleife while (Bedingung) Kommando;

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3; For-Schleife (range-based) for (Typ Variable : Container/Range) Kommando; While-Schleife while (Bedingung) Kommando; Do-While-Schleife do Kommando; while (Bedingung);

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3; For-Schleife (range-based) for (Typ Variable : Container/Range) Kommando; While-Schleife while (Bedingung) Kommando; Do-While-Schleife do Kommando; while (Bedingung); Die Schlüsselwörter break und continue sind in allen Schleifen verfügbar.

Kontrollstrukturen Sebastian Houben Intensivkurs C++ 26 For-Schleife for (Kommando1; Bedingung; Kommando2) Kommando3; For-Schleife (range-based) for (Typ Variable : Container/Range) Kommando; While-Schleife while (Bedingung) Kommando; Do-While-Schleife do Kommando; while (Bedingung); Die Schlüsselwörter break und continue sind in allen Schleifen verfügbar. goto existiert (considered harmful, of course).

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; }

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; } argc: argument count - Anzahl der Parameter (+ 1)

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; } argc: argument count - Anzahl der Parameter (+ 1) argv: argument values oder argument vector

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; } argc: argument count - Anzahl der Parameter (+ 1) argv: argument values oder argument vector Der Typ von argv ist char**: Ein Zeiger auf einen Zeiger von Zeichen (Characters).

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; } argc: argument count - Anzahl der Parameter (+ 1) argv: argument values oder argument vector Der Typ von argv ist char**: Ein Zeiger auf einen Zeiger von Zeichen (Characters). Für heute reicht es aus zu wissen, dass argv[1] das erste Argument des Programms ist.

Programm-Parameter Sebastian Houben Intensivkurs C++ 27 Ein Konsolenprogramm kann mit Parametern aufgerufen werden: beispiel.exe -f 17 message=hallo Diese Parameter stehen der main-funktion zur Verfügung: int main(int argc, char** argv) {... return 0; } argc: argument count - Anzahl der Parameter (+ 1) argv: argument values oder argument vector Der Typ von argv ist char**: Ein Zeiger auf einen Zeiger von Zeichen (Characters). Für heute reicht es aus zu wissen, dass argv[1] das erste Argument des Programms ist. Es ist gültig, falls argc > 1 erfüllt ist.

Konsolen-Ausgabe Sebastian Houben Intensivkurs C++ 28 Das Objekt cout im Namensraum std ist ein sogenannter Stream (Datenstrom).

Konsolen-Ausgabe Sebastian Houben Intensivkurs C++ 28 Das Objekt cout im Namensraum std ist ein sogenannter Stream (Datenstrom). Jedes Konsolenprogramm hat drei Standard-Streams: (Tastatur-)Eingabe (cin), Ausgabe (cout), und Fehler (cerr). Wir benutzen hier nur cout.

Konsolen-Ausgabe Sebastian Houben Intensivkurs C++ 28 Das Objekt cout im Namensraum std ist ein sogenannter Stream (Datenstrom). Jedes Konsolenprogramm hat drei Standard-Streams: (Tastatur-)Eingabe (cin), Ausgabe (cout), und Fehler (cerr). Wir benutzen hier nur cout. Beispiel: #include <iostream> using namespace std; cout << "Eine Zahl: " << 42 << endl;

Konsolen-Ausgabe Sebastian Houben Intensivkurs C++ 28 Das Objekt cout im Namensraum std ist ein sogenannter Stream (Datenstrom). Jedes Konsolenprogramm hat drei Standard-Streams: (Tastatur-)Eingabe (cin), Ausgabe (cout), und Fehler (cerr). Wir benutzen hier nur cout. Beispiel: #include <iostream> using namespace std; cout << "Eine Zahl: " << 42 << endl; Zahlen und Strings können mit Hilfe des Stream-Operators << in den Stream geschoben werden. Bei cout führt dies dazu, dass die Werte in der Konsole ausgegeben werden.

Konsolen-Ausgabe Sebastian Houben Intensivkurs C++ 28 Das Objekt cout im Namensraum std ist ein sogenannter Stream (Datenstrom). Jedes Konsolenprogramm hat drei Standard-Streams: (Tastatur-)Eingabe (cin), Ausgabe (cout), und Fehler (cerr). Wir benutzen hier nur cout. Beispiel: #include <iostream> using namespace std; cout << "Eine Zahl: " << 42 << endl; Zahlen und Strings können mit Hilfe des Stream-Operators << in den Stream geschoben werden. Bei cout führt dies dazu, dass die Werte in der Konsole ausgegeben werden. endl ist eine spezielle Konstruktion, die ein Ende-der-Zeile-Symbol ( \n ) ausgibt und zur Ausgabe von eventuell gepufferten Daten führt.

Typumwandlung Sebastian Houben Intensivkurs C++ 29

Typumwandlung Sebastian Houben Intensivkurs C++ 29 Beispiele statischer Typumwandlung: int a = 3; double b = a; // impliziter cast int -> double double c = 2.7; int d = c; // impliziter cast double -> int: Warnung oder Fehler! int e = (int)c; // expliziter cast (okay), setzt e = 2. int f = int(c); // expliziter cast, neue Syntax. int g = int(round(c)); // setzt g = 3. bool b1 = 17; // 0 -> false, Rest -> true bool b2 = nullptr; // nullptr -> false, alle anderen Zeiger -> true

Typumwandlung Sebastian Houben Intensivkurs C++ 29 Beispiele statischer Typumwandlung: int a = 3; double b = a; // impliziter cast int -> double double c = 2.7; int d = c; // impliziter cast double -> int: Warnung oder Fehler! int e = (int)c; // expliziter cast (okay), setzt e = 2. int f = int(c); // expliziter cast, neue Syntax. int g = int(round(c)); // setzt g = 3. bool b1 = 17; // 0 -> false, Rest -> true bool b2 = nullptr; // nullptr -> false, alle anderen Zeiger -> true Typecasts elementarer Typen sind meist unkritisch

Typumwandlung Sebastian Houben Intensivkurs C++ 29 Beispiele statischer Typumwandlung: int a = 3; double b = a; // impliziter cast int -> double double c = 2.7; int d = c; // impliziter cast double -> int: Warnung oder Fehler! int e = (int)c; // expliziter cast (okay), setzt e = 2. int f = int(c); // expliziter cast, neue Syntax. int g = int(round(c)); // setzt g = 3. bool b1 = 17; // 0 -> false, Rest -> true bool b2 = nullptr; // nullptr -> false, alle anderen Zeiger -> true Typecasts elementarer Typen sind meist unkritisch Das Thema wird im Zusammenhang mit Klassen und Vererbung komplizierter.

Typumwandlung Sebastian Houben Intensivkurs C++ 29 Beispiele statischer Typumwandlung: int a = 3; double b = a; // impliziter cast int -> double double c = 2.7; int d = c; // impliziter cast double -> int: Warnung oder Fehler! int e = (int)c; // expliziter cast (okay), setzt e = 2. int f = int(c); // expliziter cast, neue Syntax. int g = int(round(c)); // setzt g = 3. bool b1 = 17; // 0 -> false, Rest -> true bool b2 = nullptr; // nullptr -> false, alle anderen Zeiger -> true Typecasts elementarer Typen sind meist unkritisch Das Thema wird im Zusammenhang mit Klassen und Vererbung komplizierter. In altem C-Code werden oft Zeiger in Integers und zurück umgewandelt. Das ist sehr gefährlich, denn Zeiger auf 64bit-Systemen passen nicht in einen int!

Typumwandlung Sebastian Houben Intensivkurs C++ 30 Zahlen in Strings wandeln und zurück Umwandlung auf C-Art int wert = 42; char str[50]; sprintf(str, "%d", wert); // str = "42"; int wert2 = strtol(str, nullptr, 10); // wert2 = 42; Umwandlung auf C++-Art int wert = 42; stringstream ss; ss << wert; string str = ss.str(); // str = "42"; int wert2; istringstream(str) >> wert2; // wert2 = 42;

Hilfe, Referenz, Dokumentation Sebastian Houben Intensivkurs C++ 31 gutes Tutorial: http://www.cplusplus.com/doc/tutorial/ Referenz-Dokumentation: http://www.cplusplus.com/doc/ http://www.cplusplus.com/reference/ Linux/Mac: man-pages! Windows: MSDN Weitere Quellen: Programmierfragen, Fehlermeldungen: Google, Stack Overflow. Algorithmen: Wikipedia.

Anwesenheitsaufgabe (10 Punkte) Sebastian Houben Intensivkurs C++ 32 Schreiben Sie ein Programm mit Namen inkrement, das eine ganze Zahl als Argument erwartet, eins addiert, und das Ergebnis ausgibt. Falls kein Argument übergeben wurde soll das Programm eine Fehlermeldung ausgeben. Beispiel: $ inkrement 1234 1234 + 1 = 1235 $ inkrement -1234-1234 + 1 = -1233 $ inkrement Fehler: Es wurde keine Zahl uebergeben.

Anwesenheitsaufgabe (40 Punkte) Schreiben Sie ein Programm mit Namen primzahltest, das als Argument eine positive ganze Zahl erwartet. Prüfen Sie, ob ein Argument vorhanden ist und ob die übergebene Zahl positiv ist. Das Programm bestimmt, ob diese Zahl prim ist oder nicht. Verwenden Sie den folgenden (ineffizienten aber korrekten) Algorithmus (hier als Pseudo-Code): bool ist_prim(unsigned int n) { if (n == 1) return false; schleife: für jedes i >= 2, i*i <= n { if (ist_prim(i)) { if (n durch i teilbar) return false; } } return true; } $ primzahltest 57 57 ist keine Primzahl. $ primzahltest 59 59 ist eine Primzahl. Sebastian Houben Intensivkurs C++ 33

Anwesenheitsaufgabe (30 Punkte) Sebastian Houben Intensivkurs C++ 34 Modifizieren Sie den obigen Algorithmus so, dass das Programm die Primfaktorzerlegung der Zahl ausgibt. Beispiel: $ primfaktorzerlegung 24 24 = 2 * 2 * 2 * 3 $ primfaktorzerlegung 1 1 = 1

Anwesenheitsaufgabe (20 Punkte) Sebastian Houben Intensivkurs C++ 35 Modifizieren Sie das Programm so, dass gleiche Primfaktoren zu Potenzen gruppiert werden. Beispiel: $ primfaktorzerlegung 24 24 = 2 ˆ 3 * 3