Programmieren In C - Heidelberg University

Transcription

Programmieren in C Christian KreidlInstitut für Technische Informatik (ziti)Universität Heidelberg1 / 126

Kurs-InfosMontag - Freitag, 9:15 - 16:30UhrMittagspause: 12:30 - 13:30Uhr1 LP/CP bei regelmäßiger, aktiver TeilnahmeAnwesenheitsliste in HeiConf wird geführtAbgabe Ihrer Programme per Email2 / 126

HeiConfFür Vorlesung und Gruppenarbeit:Vorlesung: 43wBreakout-Räume für Gruppenarbeit. Max. 5 Personen.3 / 126

KursinhaltEinführungWas heißt eigenlich “Programmieren” ?Erstes Programm: Hallo Welt!Werkzeuge, Einführung in die Linux KonsoleElementare Datentypen & OperatorenStrukturierte und Prozedurale ProgrammierungKontrollstrukturen If ,Then, Else.FunktionenZeiger & SpeicherverwaltungZusammengesetzte Datentypen4 / 126

KursinhaltObjektorientiere ProgrammierungKlassen & MethodenVererbungWeiterführende ThemenDie C StandardbibliothekWeitere nützliche Bibliotheken5 / 126

LiteraturDie “Bibel” von Bjarne Stroustrup, dem Erfinder:Die CPP Programmiersprache (Orig.: The C Programming Language)Gutes Nachschlagewerk auch von Bjarne Stroustrup incl. c 11:A Tour of C Online Dokumentation der Standardbibliothek: http://www.cplusplus.comBeschreibung der Klassen string, vector, iostream, fstream, uvm.Nützliche Funktionen und Typumwandlungen.Mathematik Bibliothek cmath: sin(), cos(), sqrt(), round(), uvm.6 / 126

Lektion 1Was heißt eigentlichProgrammieren?7 / 126

Wieso eigentlich C lernen?C ist eine sehr hardwarenahe Programmiersprache:Direkte und effiziente Übersetzung möglichDirekten Zugriff auf Speicher: Belegung und FreigabeDirekte Unterstützung für paralleles Arbeiten auf mehreren ProzessorenCompiler sind frei verfügbar und in jeder Linux Distribution vorhanden. z.B.GNU Compiler CollectionSehr flexibel und erweiterbar: riesige Menge an Bibliotheken verfügbar8 / 126

Wofür eigentlich C lernen?C bietet eine umfangreiche Standardbibliothek. Eine Vielzahl von freienBibliotheken stellen zusätzliche Funktionalitäten zur Verfügung:Mathematik und Fit Algorithmen (z.B. boost oder ROOT)Erweiterungen für paralleles Rechnen (z.B. OpenMPI)Bibliotheken zum Rechnen auf Grafikkarten (z.B. CUDA)Zugriff auf DatenbankenWebservices und Netzwerkkommunikation9 / 126

Wie entstand C ?C wurde 1985 als Erweiterung der Programmiersprache C entwickelt mit dem Ziel Objekt Orientierung(Klassen) in die Sprache C einzubringen.Die Sprache C wurde 1970 zusammen mit dem Betriebssystem UNIX eingeführtAus C mit Klassen entwickelte sich dann C als eine objektorientierte Programmiersprache.1985 gilt mit der Veröffentlichung des Buches “The C Programming Language"von Bjarne Stroustrup”als das Geburtsjahr von C .1998 wurde die Sprache erstmals standardisiert.Der Standard von 2003 kann als Nachbesserung des ersten Standards verstanden werdenDer Standard c 11 bringt erstmals deutliche Neuerungen und nützliche ErweiterungenAktuell gibt es noch c 14 und c 17, die Verbesserungen zu c 11 nachreichen.10 / 126

Was heißt eigentlich “Programmieren”?Programmieren fängt bereits beim Erfassen der Problemstellung an und umfasstnicht nur die Umsetzung der Lösung auf einem Computer, sondern auch ektur, AlgorithmenImplementierungTestsWartung11 / 126

Vom Problem zur ArchitekturWas wollen die eigentlich von mir?Konkrete Problemstellungz.B. Ballistischer WurfAnalyse der Anforderungenz.B. Plot verschiedener TrajektorienFestlegen der Architekturz.B. Struktogramm des groben ProgrammablaufesFehlerquellenUnklare ProblemstellungFalsch verstandene AnforderungenDenkfehler in der Architektur12 / 126

Von der Architektur zum ProgrammWie bringe ich mein Problem dem Computer bei?Implementieren der Architekturz.B. C Quellcode schreibenTest des Programmesz.B. Vergleich der Plotdaten mit von Hand gerechneten WertenFehlerquellenTippfehler, syntaktische FehlerWerden vom Übersetzer (compiler) gefundenSemantische Fehler, Denkfehler im AlgorithmusMüssen vom Programmierer gefunden werden13 / 126

Was ist ein Algorithmus ?Ein Algorithmus ist eine genaue Beschreibung aller Einzelschritte, die zurLösung eines Problems notwendig sind.Beispiel: ’Finde die kleinste von N Zahlen’ (Z[1] . . . Z[N ])Ein erster Versuch (nicht gut. Was ist bei N 1 ?)1234Setze x Z[1]Setze i 2Wenn Z[i] x, dann setze x Z[i]Setze i i 1. Wenn i N , dann fertig, sonst mache bei 3 weiter.Unterschiedliche Algorithmen, die das gleiche Problem lösen, könnenunterschiedlich schnell seinunterschiedlich viel Speicher benötigen.14 / 126

Wie setze ich meine Lösung in Code um?Oft führt mehr als eine Lösung zum Ziel.Welche ist die Einfachste / Eleganteste?Welches die Schnellste?Welches die Flexibelste?Welche kann ich an anderer Stelle wiederverwenden?15 / 126

Ziel des KursesErfassen einfacher ProblemstellungenErlernen der syntaktischen Struktur von C Erlernen der Sprachsemantik von C Erlernen des Umgangs mit den nötigen WerkzeugenAm Ende dieses Kurses sollte jeder Teilnehmer befähigt sein, einfacheProgramme zur Lösung einfacher Probleme zu schreiben und sich die fürkomplexere Probleme nötigen Kenntnisse eigenständig zu erarbeiten.16 / 126

Lektion 2Hallo Welt!17 / 126

Das erste Programm in C 1#include iostream 234567int main (){// Textausgabe:std::cout "Hallo Welt!" std::endl;891011}// Programm beendenreturn 0;Programm1:hello.cpp18 / 126

Übersetzen und Bindencompiling and linkingQuelltext ist von Menschen lesbare FormComputer will ausführbare FormÜbersetzen erzeugt Objektdateig -c hello.cppBinden erzeugt ausführbare Dateig -o hello hello.oAufrufen des Programms./helloHallo Welt!Änderungen immer im Quelltext, Erneutes übersetzen und Binden nötig.19 / 126

Zurück zum Quelltext.#include iostream lädt Ein-/Ausgabe BibliothekEigentliche Funktionalität in main()Kommentare beginnen mit //Blöcke von Kommentaren über mehrere Zeilen mit/ .Kommentar Block. /Ausgaben über std::coutstd::cout kann mit alles "zugeworfen" werden,was ausgegeben werden sollProgramm endet mit Rückgabe an Betriebssystemreturn 0;20 / 126

Eine Frage des guten StilesDie Strukturierung des Programms ist wichtigEinrückungen deuten logische Struktur anLeerzeichen verbessern die LesbarkeitKommentare vermitteln VerständnisEine Anweisung pro Zeileint i 3;float d 6.124;float z i*d;i ; //so nichtBereits nach einem Monat ist selbstgeschriebener Quellcode ohneKommentare nur noch schwer zu verstehenBedenken Sie, dass möglicherweise andere Ihren Quellcode lesen undwarten müssenSchauen Sie sich andere Programme an21 / 126

Eine Frage des guten StilesGewöhnen Sie sich einen einheitlichen Stil an. z.B.:Objekte immer mit Großbuchstaben:MyVectorFunktionen entweder:addVectorToOtherVector()(CamelCase)oder add vector to other vector()so ist es schwieriger zu lesen:addvectortoothervector()22 / 126

Lektion 3Werkzeuge23 / 126

Unix ProgrammeGutes Unix Tutorial: dls -la [ dir ]cd dir .path/to/dirmkdir dir rmdir dir Aktuelles Verzeichnis anzeigenDateien in einem Verzeichnis anzeigenVerzeichnis wechseln (z.B. cd ./test/v1)Aktuelles VerzeichnisÜbergeordnetes VerzeichnisVerkettung von Verzeichnissen mit /Neues Verzeichnis anlegen(leeres) Verzeichnis löschen24 / 126

Unix ProgrammeDateiencp src dest mv src dest rm file cat file less file Datei kopierenDatei verschieben / umbenennenDatei löschen (kein Papierkorb!)Datei ausgebenDatei seitenweise ausgeben( Beenden: q )Platzhalter? exakt ein beliebiges Zeichen* beliebig viele (oder kein) Zeichen25 / 126

Weitere ProgrammeSuchenfind dir -name file grep pattern file Hilfeman cmd infoDatei suchenAusdruck in Datei suchenBeschreibung zu Kommando anzeigenHilfesystem anzeigenProgrammierungg -c codefile g -o file obj [ obj ]gdb executable C Datei übersetzenObjektdateien bindendebugger aufrufen26 / 126

Weitere Linux TippsMit der Taste Hochpfeil kann durch frühere Kommandos geblättert werden.Mit Tabulator wird eine begonnene Eingabe automatisch vervollständigt,soweit das möglich ist (z.B. werden Dateinamen vervollständigt bis esmehrere Möglichkeiten gibt).Ein Programm kann mit Strg c (auf engl. Tastaturen Ctrl) abgebrochenwerdenEin Programm wird mit & am Ende der Kommandozeile unabhängig vomEingabefenster ausgeführt,z.B. kate file.cpp &Blockiert ein Programm die Shell (das Eingabefenster), so kann es mit Strg z bg ret in den Hintergrund geschickt werden.27 / 126

TexteditorNicht zu verwechseln mit Textverarbeitung: Word, LibreOfficespeichert Text als reinen ASCII- oder UTF8-Text ohne FormatierungenLinux Console: vim, nano, joe und viele mehrBeispiele:Linux GUI: kate, gvim, PlumaWindows: Notepad, notepad , Programmers NotepadMacOS: TextEdit, BBEdit, TextWrangler28 / 126

Dateienkeine Umlaute, Leer- oder Sonderzeichen in Dateinamen verwendenC Quellcode-Dateien mit Endung .cpp oder .cc anlegen,sonst akzeptiert g die Datei nichtausführbare Dateien haben keine Endung29 / 126

GNU Compilererzeugen der Objektdateieng -Wall -c hello.cppg : Compiler-Programm-Datei-Wall : Optionsschalter der alle Compiler-Warnungen einschaltet-c : nur übersetzen, nicht linkenhello.cpp : die C Programmcode-TextdateiDieser Aufruf erzeugt eine Objektdatei mit der Endung .oDie Objektdatei enthält den Programmcode in Maschinensprache.30 / 126

GNU Compilererzeugen des Programmsg -Wall -o hello hello.og : Compiler-Programm-Datei-o : Name der zu erzeugenden Programmdateihello.o : die ObjektdateiDieser Aufruf erzeugt eine ausführbare Programmdatei durch das verbinden(linken) von Objektdateien und Bibliotheken.31 / 126

Lektion 4Elementare Datentypen &Operatoren32 / 126

Programme arbeiten mit DatenZum Rechnen werden Variablen und Operatoren benötigtVariablen enthalten Daten des Programmes z.B. Position des Geschosses aufTrajektorieVariablen haben jeweils Typ und Namenz.B. ganzzahlig, reell, .Es gibt jeweils unterschiedliche Genauigkeiten (byte, int,.)Operatoren ( , -, &, , .) manipulieren die in Variablengespeicherten Werte33 / 126

Elementare DatentypenGanze Zahlenshort, int , longunsigned short, unsigned intunsigned longuint8 t, uint16 t, uint32 tReele Zahlenfloatdoublelong double 7, 42, 123456789positive Zahlen incl. 0positive Zahlen mitfester Bit-Zahl (in stdint.h )1.0, .5, 3.1415, 1.6022E 19höhere Genauigkeit, mehr Stellen,größerer Wertebereichnoch höhere GenauigkeitWahrheitswertebool true, false (1,0)Zeichen (Buchstaben)char ’a’ , ’Z’, ’3’ , ’?’ , .Leerer Datentypvoid34 / 126

Definition von VariablenEinfache Definitionint index; float x;Mehrfache Definition (alle gleicher Typ)float a, b, c;Definition mit Initialisierung int i 5;unsigned long grosse zahl 123456789;float g 9.81, v 3.4;float g, v 3.4; Achtung! Nur v bekommt einen Wert Variablen solltenimmer initialisiert werden.Definition einer Konstanten, die später im Programm nicht mehr verändertwerden kannconst float pi 3.14159;35 / 126

Namen von Variablen, Funktionen,.Buchstaben: a . z und A . ZGroß-/Kleinschreibung wird unterschiedenUnterstrich oder camelCase für Namen benutzenZiffern: 0.9 Nicht als erstes Zeichen!Umlaute und Sonderzeichen sind nicht erlaubtSinnvolle Namen verwenden!Namen sollten für die jeweilige Funktion sprechen:kontostand, start value, numberOf V alues, .Für Zähler und Indizes (int) reicht meist ein Buchstabe. Oft: i, j, k, l, m, n.Für reele Zahlen: a, x, y, .Einheitliche Konventionen verwenden, auch für Groß-/Kleinschreibung36 / 126

LiteraleDefinitionZeichenfolgen, die zur Darstellung der Werte von Basistypen definiert bzw.zulässig sindz.B. true, false , ’A’, ’4’ , 15, 3.14159, .Literale sind typisierttrue, falsebool-7, 23, 42int23uunsigned1., 1e0, 23f floatGanzzahlige ZahlenbasisDezimal:Hexadezimal (0x.):Oktal (führende Null)Binär (0b.):’a’ , ’Z’, ’3’1234l42ul42lfcharlongunsigned longdouble-7, 23, 420xaffe , 0xD00F077, 01230b001010100137 / 126

Vorsicht!12int iint i 3.5; 011;// i ist 3// i int 9 (Oktal-schreibweise)345float x 6 / 5;float x 6. / 5.0;// x ist 1 !// so ist x 1.2 korrekt!38 / 126

WertebereicheTatsächliche Größe nicht standardisiertLediglich Mindestgröße und aufsteigende ReihenfolgeWertebereiche über #include limits zugänglich12#include iostream #include limits 3456789101112int main(){std::cout "int: " std::numeric limits int ::min() " . " std::numeric limits int ::max() std::endl;return 0;}39 / 126

WertebereicheÜbersicht der Wertebereiche auf einem 64 bit SystemTypboolcharshortintlonglong longfloatdoublelong doubleuint8 tuint16 t.Anzahl Bits18163264643264128816Min00 32768 2147483648 9223372036854775808 92233720368547758081.17549E 382.22507E 3083.3621E 33720368547758073.40282E 381.79769E 3081.18973E 493225565535int8 t,uint16 t sind Teil der Standardbibliothek stdint.h und bieten Datentypen mit garantierter Größe.40 / 126

Arithmetische OperatorenEinfache Operatoren() /%Klammerung von AusdrückenAddition und Subtraktion, bzw. unäres MinusMultiplikation und DivisionModulo (Rest einer ganzzahligen Division)Inkrement und Dekrement präfix bzw. postfix Inkrement und Dekrementb a ; ist dasselbe wie b a; a a 1;b a; ist dasselbe wie a a 1; b a;Zuweisung x ? A1 : A2;einfache Zuweisungzusammengesetzte Zuweisungb a; b b a; etc.Ausdruck ergibt A1 oder A2, abhängig von x:z.B. y (x 3) ? 5.0 : 7.0;41 / 126

Logische und bitweise OperatorenVergleiche ! Gleichheit, Ungleichheitkleiner, gößerkleiner oder gleich, größer oder gleichLogische Verknüpfungen!&& unäres logisches nichtlogisches und, logisches oderBitweise Operatoren & ˆ unäres bitweises nichtbitweises und,oder,exclusiv-oderBits nach links- bzw. rechts schieben42 / 126

TypumwandlungImplizite Typumwandlungint a, b 10;float pi 3.14159;a b * pi; // b wird nach float gewandelt,

WofüreigentlichC lernen? C ahlvonfreien rVerfügung: