Einführung in C

Werbung
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
Herunterladen