Grundlagen der Informatik Vorlesung Einführung in die Programmiersprache C Prof. Dr.-Ing. Thomas Wiedemann Fachgebiet Informatik / Mathematik Überblick zur 6. Vorlesung • Einführung und kurze Historie • Grundlegende Vorgehensweise • Aufbau von C-Programmen • Grundbefehle – if () then {} else { } – Do { } until ( ) – for () Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 2 •1 Einführung und kurze Historie Entwicklung der Programmiersprachen • zu Beginn direkte Maschinenbefehle (Assembler) – sehr aufwändig und fehleranfällig, – dafür extrem effizient und schnell • Erste Hochsprachen – FORTRAN für naturwissenschaftliche Berechungen (auch heute noch) – COBOL für betriebswirtschaftliche Programme – große Anzahl weiterer Sprachen mit geringer Bedeutung (PL1, ADA) Problem: Sprachen entweder sehr Prozessor-nah oder Anwendungsnah • Eine neue Entwicklung sollte für alle Ebenen einheitlich sein: C und C++ als universelle Sprache für Anwendung und Systemprog. • C und C++ sind aktueller Industriestandard (Hauptgrund der Verwendung im Kurs) Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 3 Vom Algorithmus zum Programm (Wiederholung) Aufgabe Bis hier sind alle Arbeiten unabhängig von der konkreten Umsetzung (Rechner, Betriebssystem, Compiler). Denken !!!!!!!!!!!! Algorithmus Programmieren Maschinell lesbare Beschreibung des Algorithmus als Quelltextprogramm (Sourcecode) Übersetzen (Compilieren) Algorithmus in maschinell ausführbaren Anweisungen In der Regel noch unabhängig von konkretem Rechner und Betriebssystem. Jedoch Compilerspezifisch !!! Prozessor-, Rechner- und Betriebssystemspezifisch !!!. Maschinenprogramm Ausführen (Starten) Prozessor Prozessor(Hardware) (Hardware) Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 4 •2 Allgemeine Eigenschaften von C und C++ • C wurde 1972 von Dennis Ritchie (Bell Laboratories) entwickelt • Nachfolger der erfolglosen Sprachen A und B • entworfen und verwendet zur Programmierung des UNIX-Betriebssystems (zu etwa 95 % in C geschrieben, Rest in Assembler) • 1978 Referenzbuch ``The C Programming Language`` von Kernighan & Ritchie • C++ ist eine Erweiterung von C der 80 er Jahre (Details später) • Vorteile von C : Nachteile von C : + sehr effizienter Sourcecode - schlecht lesbar und wartbar + relativ schnell (- langsamer als Assembler) + direkter Speicherzugriff (Pointer) - sehr fehleranfällig und empfindlich + Prozessorunabhängig - Detailprobleme bei Portierung + wenige Befehle zum Lernen - große Funktionsvielfalt + Beachtung Groß-/Kleinschreibung - viele Schreibfehler Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 5 Allgemeine Vorgehensweise bei der C-Programmierung • Nachfolgende Erklärungen sind noch allgemeingültig • Konkrete Bedienung der Programme ist systemabhängig Ablauf der Programmentwicklung • Entwicklung des Algorithmus (auf Papier oder mit Hilfsmitteln) • Erstellung eines Projektes zur Ablage aller Entwicklungsdateien eines Programmes (enthält Sourcecode, kleine Grafikbibliotheken (Icons), internationale Texte, Steuerdateien, ...) • Schreiben des eigenen Sourcecodes (oder Zusammenkopieren aus Hilfetexten oder Beispielen - ist unter Beachtung des Copyrights meist legitim und zur Vermeidung von Schreibfehlern ratsam !!!) und Ermittlung benötigter Funktionsbibliotheken • Compilieren und Programmtest (in der Regel iterativer, mehrfach ablaufender Prozeß) – Fehler 1. Art : Syntaxfehler : Sourcecode entspricht nicht den Regeln – Fehler 2. Art : Laufzeitfehler : Source entspricht den Regeln, führt aber bei der Ausführung zu Problemen (Überlauf, Schutzverletzung, IO-Probleme ...) – Fehler 3. Art : logische Fehler: Programm läuft, führt aber NICHT zu den gewünschten Ergebnissen - Test und Fehlersuche durch Beispiele (auch WORST CASE !!!) Eigene THESE: Programmieren ist 95% Fehlersuche ! !! Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 6 •3 Übersetzung von C-Programmen Der Ablauf ist C-spezifisch ! Teilweise Abweichungen bei anderen Programmiersprachen. Algorithmus / Struktogramm Der Präprozessor führt eine erste Analyse des Quelltextes aus und dient für vorbereitende Wandlungen, Einbinden externer Bibliotheken mit #include ... oder bedingte Übersetzungen. Ergebnis ist u.U. ein modifiziertes Quelltextprogramm. Programm schreiben Quelltextprogramm (Sourcecode) Übersetzen Übersetzen Neuer Quelltext Der Compiler analysiert den Quelltext und erzeugt einen Zwischencode (Objektcode), welcher schon relativ nahe am Maschinencode orientiert ist. C-Präprozessor C-Compiler C-Linker Vorhandene Bibliotheken Der Linker verbindet den erzeugten Objektcode des Programms mit bereits vorliegenden Objektcode der Bibliotheken. Ergebnis ist ein lauffähiges Maschinenprogramm. Maschinenprogramm Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 7 Allgemeine Regeln bei der C-Programmierung Verwendbare Zeichen für eigene Bezeichner (Variablen, Funktionen ...) • Buchstaben A-Z a-z - keine deutschen Umlaute (-> Fehler "Illegal Character") • C unterscheidet streng zwischen Groß- und Kleinschreibung Berechne() ist eine andere Funktion als berechne() • Ziffern 0 – 9 Nicht zulässig für Bezeichner sind : • Sonderzeichen ! ? " ' ( ) [ ] { } + - < > \ / . , : ; * & # % ^ ~ | • Alle nicht druckbaren Zeichen ( 0-31) der ASCII-Codetabelle (z.B. Neue Zeile ) Trennzeichen • Dienen zur Trennung einzelner Morpheme • Verwendbar als Trennzeichen sind: Leerzeichen, Tabulator, Zeilenumbruch, Kommentar • in der englischen Literatur auch als White Spaces bezeichnet • Für den Compiler zählt nur die Existenz mindestens eines Trennzeichens, weitere werden ignoriert. Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 8 •4 Kommentare und Identifikatoren Kommentare • enthalten beliebigen Text und werden durch Compiler ignoriert • Einleitung mit /* und Abschluß mit */ Nicht schachteln ! • oder Kommentar bis Zeilenende beginnend mit // • Beispiel.: /* Das ist ein Demoprogramm */ • Mit Kommentaren können Codeteile kurzzeitig auch ausgeblendet werden, ohne das diese gelöscht werden müssen (spart Arbeit und Zeit) Identifikatoren • Dienen zur Bezeichnung von Datentypen, Variablen, Konstanten und Funktionen • definiert als Folge von Buchstaben und Ziffern • das erste Zeichen muß ein Buchstabe sein ! • da Leerzeichen als Trennzeichen fungieren, wird statt Leerzeichen in Identifikatoren meist ein Unterstrich eingesetzt alpha i anzahl_Personen 1wert #Wert Grundlagen der Informatik I - 1 /* Korrekte Namen */ Ähnlichkeit /* falsch */ - T.Wiedemann- Seite 9 Schlüsselworte Schlüsselworte • Schlüsselworte sind Identifikatoren, welchen in C bereits eine feste Bedeutung zugeordnet wurde • kann als grundlegender Befehlsvorrat von C aufgefasst werden • alle weiteren C-Funktionen basieren auf diesen Grundbefehlen • eine Neudefinition oder Verwendung als Identifikatoren für eigene Variablen ist nicht zulässig ! • Schlüsselworte in C : auto break case char const continue default do double else enum extern float for goto if int long register return short sizeof static struct switch typedef union unsigned while signed void volatile Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 10 •5 Variablen Variablen dienen zur Speicherung von Daten. • sie müssen in C vor der ersten Anwendung definiert werden ! • bei der Definition reserviert der Compiler Speicher • alle Variablendefinitionen müssen vor den ersten Programmanweisungen erfolgen (bei C++ besteht diese Einschränkung nicht mehr) • Allgemeine Schreibweise: int a; Datentyp Identifikator; /* ganze Zahl – meist 16 bit */ long b; /* ganze Zahl – meist 32 bit */ float d; /* Gleitkommazahl einfacher Genauigkeit ( 7 Stellen) */ double e; /* Gleitkommazahl mit doppelter Genauigkeit (15 Stellen) */ char c; /* Zeichen (genau in Zeichen) */ char s[100] /* Text mit 100 Zeichen */ Bei der Definition können gleichzeitig mehre durch Komma getrennte Variablen definiert werden. Es kann auch prinzipiell ein Anfangswert gesetzt werden (siehe auch Folgeseite): int j, k, i= 100; float d = 1.23; char c = 'j'; Variablen ohne Anfangswert sind undefiniert, d.h. enthalten zufällige Werte ! Weitere Datentypen folgen später. Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 11 Konstanten Konstanten bleiben während der Zeit der Ausführung unverändert • dienen zum Bereitstellen bekannter Werte wie PI oder einen festen Anzahl • Der Versuch einer Änderung wird als Fehler erkannt. • Schreibweise: 4331 -503 /* normale Dezimalzahl */ 071 012 0x31ff /* führende 0 kennzeichnet Oktalzahl zur Basis 8 !! */ /* 0x -> ganze Hexadezimalzahl zur Basis 16 (Ziffern a=10... F=15 ) */ 0.233 .22 -3.22 /* Gleitkommazahl (auch mit Weglassen der führenden 0 )*/ 2.1e-4 3E12 /* Gleitkommazahl in Exponentialschreibweise */ 'g' /* Zeichenkonstante (genau in Zeichen) */ '\n' /* \ steht für Kodierung nicht druckbarer Zeichen (\n = Neue Zeile)*/ "Hallo" /* Zeichenkette für Textdarstellung (zweifache Anführungsstriche )*/ Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 12 •6 Anweisungen Anweisungen sind eine Kombination von Operatoren, Konstanten und Variablen. Ergibtanweisung • • • ist die häufigste Form der Anweisung in Programmen rechte Seite definiert eine Berechnung und weist das Ergebnis der linken Seite zu wird abgeschlossen mit einem Semikolon (Fehlen führt zu Syntaxfehler ) y = x * 300 + z ; • Achtung : auch ein einzelnes ; ist gültig - so genannte leere Anweisung ! Dies kann zu sehr gefährlichen Endlosschleifen o.ä. führen .... • bei gleichzeitiger Verwendung einer Variable wird der alte Inhalt überschrieben: y = y +10; // alter y-Wert wird überschrieben x = x +1; für einfaches Hochzählen kann auch x++; verwendet werden x = x - 1; für einfaches Herunterzählen kann auch x++; verwendet werden Blockanweisungen • sind eine Zusammenfassung mehrerer Anweisung zu einem Block durch geschweifte Klammern, welcher wie eine Anweisung eingesetzt werden kann { y = x * 300 + z ; anzahl = y * 3 + lagerbestand ; } • Blockanweisungen sind insbesondere bei Verzweigungsbefehlen notwendig, da diese nur eine Anweisung oder eine Blockanweisung verarbeiten können Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 13 Grundaufbau von C-Programmen /* Demoprogramm */ #include <conio.h> #include <stdio.h> • Programmkopf mit Kommentar // • Einbinden von Funktionsbibliotheken (Erklärung später -> Präprozessor) a = 20; b= 40; c = ( a * b ) / 100; • Kopf der Hauptfunktion (es muß genau ein main() pro Programm geben !!!) • Start des Funktionsrumpfes – Deklaration von Variablen (auch Anfangswerte können gesetzt werden) – Anweisungen werden mit ; beendet !! – Anweisungen (einfache Zuweisungen) – Berechnung printf("Summe= %f",c) ; } – Ausgabe auf den Bildschirm • Ende des Funktionsrumpfes void main() { int a, b =0 ; double c; Beliebige Folge von Anweisungen ALLE SCHWARZEN PROGRAMMTEXTE SIND DIREKT UND OHNE JEGLICHE ÄNDERUNGEN ZU ÜBERNEHMEN ! Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 14 •7 Steueranweisungen ( IF ELSE ) • Die wichtigste Anweisung ist der logische Test mit bedingter Ausführung der Folgeoperationen: – entspricht den einfachen Prozessorbefehlen zur Verzweigung – dient zum Aufbau aller anderen Steuerbefehle • Syntax (genaue Schreibregel - jede Abweichung führt zum Syntaxfehler – insbesondere müssen die Klammern nach dem if wirklich IMMER geschrieben werden, die geschweiften BLOCK-Klammern sind optional ) if ( Bedingung ) { Anweisungen_wenn_wahr; } else { Anweisungen_wenn_falsch; } Beispiel: if ( i > 10 ) { i =1; } else { i = i+1; } Was bewirkt dieser Programmcode bei mehrfachem, wiederholten Aufruf ? Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 15 Steueranweisungen ( IF ELSE ) II • Der ELSE-Zweig kann auch entfallen ! if ( Bedingung ) { Anweisungen_wenn_wahr; } • Bei nur genau einer Anweisung können die {} entfallen ! (VORSICHT!) if ( Bedingung ) Anweisung1; Anweisung2; // Anweisung 2 wird immer auusgeführt ! • Es kann auch ein IF-ELSE in ein anderes geschachtelt werden ! if ( i > 10 ) { if ( z > 10 ) i =-z; else i=1; else { i = i+1; } Grundlagen der Informatik I - 1 - T.Wiedemann- } Seite 16 •8 Steueranweisungen ( switch case ) • Die SWITCH-Anweisung entspricht einer mehrfachen IF-Kette: – einfachere und schnellere Programmierung – die Bedingung muß nur einmal angegeben werden, beliebig viele Fälle (=case) sind möglich – Übersichtlicher und besser strukturierbar switch ( Zahlenwert ) { case 1 : { Anweisungen; break; } case 2 : { Anweisungen; break; } ... default : { Anweisungen_ansonsten; } } • Es können nur Zahlen (oder Einzelbuchstaben) verarbeitet werden ! • Falls kein Break geschrieben wird, setzt der Prozessor die Arbeit in der Folge-Case-Zeile fort -> extrem gefährlich und meist absolut falsch ! • Das default dient zum Abfangen von nicht gefundenen Fällen. Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 17 Typische Anwendung von switch case • Die SWITCH-Anweisung wird meist bei einer größeren Anzahl von Alternativen eingesetzt. • häufige Anwendung bei der Auswertung von Anwenderkommandos Befehlsnr = ... ; // Eingabe Befehlsnr switch ( Befehlsnr ) { case 1 : { Drucken; break; } case 2 : { Eingeben; break; } ... default { Falscher_Befehl; } } • Die Anweisungen Drucken und Eingeben stellen Funktionen dar, welcher die eigentlichen Aktionen ausführen (-> siehe Funktionen ) Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 18 •9 Steueranweisungen ( while until ) • Universelle Schleife mit frei definierbarer Abbruchbedingung – entspricht den einfachen Prozessorbefehlen – dient zum Aufbau aller anderen Steuerbefehle • Syntax (genaue Schreibregel - jede Abweichung führt zum Syntaxfehler) // Kopfgesteuerte Schleife - läuft bei falscher Bedingung überhaupt NICHT durch die Anweisungen !!! while ( Bedingung ) { Anweisungen_wenn_wahr; } • Solange die Bedingung richtig ist, werden die Anweisungen ausgeführt ! • Es besteht bei Schleifen potentiell immer die Gefahr einer Endlos-Schleife ! • Innerhalb der Anweisungen sollte potentiell die Bedingung beeinflussbar sein ! // Fußgesteuerte Schleife - läuft mindestens einmal durch do { Anweisungen_wenn_wahr; } while ( Bedingung ) Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 19 Steueranweisungen - Zählschleife ( for ( ) ) • Zählschleife mit definierter Anzahl von Zyklen – dient zum Aufbau aller anderen Steuerbefehle • Syntax (genaue Schreibregel - jede Abweichung führt zum Syntaxfehler) for(Startwert; Endbedingung; Zählaktion ) { Anweisungen; } • Es besteht kaum die Gefahr einer Endlos-Schleife, da diese Schleife für eine genau definierte Anzahl von Durchläufen verwendet wird. • Die Startwert-Aktion wird genau einmal am Anfang ausgeführt ! • Die Endbedingung wird nach jeder Schleife geprüft. • Die Zählaktion wird nach jeder Prüfung und erneuten Schleifenlauf ausgeführt ! int i; for( i=1; i<10 ; i=i+1) { printf("Die Zahl i=%i", i); } Grundlagen der Informatik I - 1 - T.Wiedemann- Seite 20 •10