19
Einführung in das Programmieren (für Ing.), Grundlagen 1 IPP.TUC, Christian Vetter Einführung in das Einführung in das Programmieren (für Ingenieure) Programmieren in C Chr. Vetter Übersicht Planung und Entwurf mit Struktogrammen Grundlagen Bedingte Programmierung Bedingte Programmierung • Schleifen • Felder • Funktionen • Dateien • Datenstrukturen • Zeigertechnik Blick in Fensterprogrammierung (event-orientiert)

Einführung in programmieren

Embed Size (px)

DESCRIPTION

Grundlagen

Citation preview

Page 1: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

1IPP.TUC, Christian Vetter

Einführung in dasEinführung in das Programmieren (für Ingenieure)

Programmieren in C

Chr. Vetter

Übersicht• Planung und Entwurf mit Struktogrammen• Grundlagen• Bedingte ProgrammierungBedingte Programmierung• Schleifen• Felder • Funktionen• Dateien• Datenstrukturen• Zeigertechnik• Blick in Fensterprogrammierung

(event-orientiert)

Page 2: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

2IPP.TUC, Christian Vetter

Übersicht• Planung und Entwurf mit Struktogrammen• Grundlagen• Bedingte Programmierung

• Hallo-Programm• Was ist ein Programm?Bedingte Programmierung

• Schleifen• Felder • Funktionen• Dateien• Datenstrukturen

Was ist ein Programm?• C-Zeichensatz• Schreibformat, Kommentare• Bezeichner für Variablen, Funktionen …• Elementare Datentypen

• Ganzzahl – Fließkommazahl

• Konstanten• Zeigertechnik• Blick in Fensterprogrammierung

(event-orientiert)

• Deklaration und Initialisierung• Zuweisung, arithmetische Operationen• Typumwandlungen• Ein- und Ausgaben• Basisstruktur eines C-Programms

Am Anfang kommt ein "Hallo"-Programm

#include <iostream>

using namespace std;

int main()

{

cout << "Hallo, mein erstes Programm!", g

<< endl;

system("PAUSE"); // Warten auf Taste

return(0);

}

Page 3: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

3IPP.TUC, Christian Vetter

Am Anfang kommt ein "Hallo"-Programm

#include <iostream>

using namespace std;

int main()

{

cout << "Hallo, mein erstes Programm!", g

<< endl;

system("PAUSE"); // Warten auf Taste

return(0);

}

Was ist überhaupt ein Programm?

Aus Menschensicht ist ein Programm ein Text (Zeichenfolge),

geschrieben in einer (meist höheren) Programmiersprache,

wie z.B. Fortran, C, Pascal, Java …

Dieser Programmtext wird von einem Übersetzungsprogramm

(Compiler) eingelesen, auf sprachformale(Syntax) Fehler

überprüft und schließlich in ausführbaren Programm-Code

üb t tübersetzt.

Wenn ein Programm gestartet ist, wird der Programm-Code

vom Prozessor abgearbeitet (Maschinensicht).

Page 4: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

4IPP.TUC, Christian Vetter

Programmentstehung und -nutzung

Magnetplatte

Idee zur Lösungeines Fachproblems

Struktogramm

Algorithmus

Editor Programmtexthallo.cpp

Übersetzungs-Progamm

C++-CompilerAusführbares

Programmhallo exe

Programm-Designer(in)

g

Fachaufgabe

Entwicklungs-umgebung

hallo.exe

daten.txt

daten.bin

eigenesProgamm

halloProgramm-Nutzer(in)

Der C-Zeichensatz:

1. Alphanumerische Zeichen: 26 Großbuchstaben, 26 Kleinbuchstaben, Unterstrich (lateinisches Alphabet)--- Groß- und Kleinschreibung werden unterschieden! ---Groß und Kleinschreibung werden unterschieden! 10 Ziffern 0 1 2 3 4 5 6 7 8 9

2. Sonderzeichen: ()[]{}<>+-*/%^~&|=!?#\,.;:'"3. Steuerzeichen:

Leerzeichen(SP), Zeilenende-Zeichen(CR,LF), horizontalerTabulator(HT), vertikaler Tabulator(VT), Seitenvorschub(FF)

4. Zeichen, die leicht verwechselt werden:- Ziffer 0 und Buchstabe O- Ziffer 1 und Buchstaben l, I,J

5. Format von C Programmen: formatfrei(es gibt aber bewährte Schreibkonventionen, die das Lesenvon Programmen für Menschen erheblich erleichtern!)

Page 5: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

5IPP.TUC, Christian Vetter

ASCII-Zeichensatz:

Formatfreiheit – Lesbarkeit#include <iostream>

using namespace std;int main(){cout<<"Hallo, mein erstes Programm!"<<endl;system("PAUSE");return(0);}

#include <iostream>

using namespace std;

int main()

{

cout << "Hallo, mein erstes Programm!"

dl<< endl;

system("PAUSE");

return(0);

}

Page 6: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

6IPP.TUC, Christian Vetter

Kommentare im Programmtext

Ein Programmtext kann nach Belieben des Entwicklers mit

Kommentaren ausgestattet werden. Hierbei gilt es, einen

goldenen Mittelweg zu finden nach der Regel "So viel wie

nötig und so wenig wie möglich". Ein Kommentar soll auch

nach langer Zeit helfen, das Programm schnell zu verstehen.

int ap; // Anzahl Punkte (Rest der Zeile)

/* Kommentar über

mehrere

Zeilen.

*/

Rechenprogramm (Einführungsbeispiel)

#include <iostream>

using namespace std;

int main()

{

int anzahl, anz_a=12, anz_b=5;

anzahl = anz_a + anz_b;

cout << "Die Anzahl ist " << anzahl << "."

<< dl<< endl;

system("PAUSE"); // Warten auf Taste

return(0);

}

Page 7: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

7IPP.TUC, Christian Vetter

Rechenprogramm (Einführungsbeispiel)

#include <iostream>

using namespace std;

int main()

{

int anzahl, anz_a=12, anz_b=5;

anzahl = anz_a + anz_b;

cout << "Die Anzahl ist " << anzahl << "."

<< dl<< endl;

system("PAUSE"); // Warten auf Taste

return(0);

}

Bezeichner und Namen

Bezeichner(identifier) dienen zur Identifizierung von Objekten innerhalb eines C-Programms. Sie sollten ausdrucksvoll gewählt werden, damit an ihrem Namen schon der Zweck erkannt werden kann.Bezeichner bestehen aus einer Folge alphanumerischer Zeichen, wobei das erste Zeichen ein Buchstabe sein muss. Dabei zählt der Unterstrich (_) auch als Buchstabe. Groß- und Kleinschreibung werden unterschieden!Signifikant sind 31 Zeichen bei internen Namen.

S ü ö ( ) füEs gibt reservierte Schlüsselwörter(s. Tabelle), die nicht für eigene Objektbezeichnungen verwendet werden dürfen.

Beispiele: gültige Namen: A, _a, a2, vektor, kraft, bereitungültige Namen: do, 1a, Kraft-Vektor, const

Page 8: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

8IPP.TUC, Christian Vetter

Reservierte Schlüsselwörter

auto double int struct

break else long switchbreak else long switch

case enum register typedef

char extern return union

const float short unsigned

continue for signed voidcontinue for signed void

default goto sizeof volatile

do if static while

Elementare Datentypen

Datentyp stellt dar Zusätze

char Zeichen, ganze Zahl signed

int ganze Zahl short, long,

long long,

unsigned,

float Fließkommazahl in einfachereinfacher Genauigkeit

double Fließkommazahl in doppelter Genauigkeit

long

Page 9: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

9IPP.TUC, Christian Vetter

Grenzen elementarer Datentypen

Datentyp Bereich, Genauigkeit

char 0 255 oder -128 +127char 0 .. 255 oder -128 .. +127

short int 0 .. 65535 oder -32768 .. 32767

int 0 .. 4294967295 oder -2147483648 .. +2147483647

long long int 0 .. 18446744073709551615 oder

-9223372036854775808 .. +9223372036854775807

float {0 0 ±(1 175494351e 38 3 402823466e+38)}float {0.0, ±(1.175494351e-38 .. 3.402823466e+38)}

bei 7 bis 8 Dezimalstellen Genauigkeit

double {0.0, ±(2.2250738585072014e-308 ..

1.7976931348623158e+308)}

bei 15 bis 16 Dezimalstellen Genauigkeit

Speicherbedarf der Datenobjekte

Datentyp Speicherbedarfin Bytes

Sammelbegriffin Bytes

char 1

short int 2 Ganzzahl-

int 4 Datentypen

unsigned int 4g

long long int 8

float 4 Fließkomma-

double 8 Datentypen

Page 10: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

10IPP.TUC, Christian Vetter

Speicherbedarf ermitteln

Ein Datenobjekt beansprucht entsprechend seinem Typ einen bestimmten Speicherplatz. Der minimale Speicher-b i h i t i B t (8 Bit) D S i h b i h d ibereich ist ein Byte (8 Bit). Der Speicherbereich, den einbestimmter Typ benötigt, kann von Compiler zu Compilerunterschiedlich sein.

Um den benötigten Speicherbereich zu ermitteln, kann mandie Funktion sizeof() verwenden.

Ergebnis in Byte Schreibweise in C

4 size = sizeof(int);

4 size = sizeof(long int);

8 size = sizeof(long long int);

4 size = sizeof(float);

Konstanten (I)

Jede Konstante hat einen Datentyp.Konstanten vom Ganzzahlen-Datentyp: Ziffernfolge ohne

Dezimalpunkt. Zahlensystem als Lese- und Schreibschnitt-

0001100125031

0x19Strg-Y EM

p ystelle: dezimal, oktal (0) und hexadezimal (0x)Beispiel: 25(dezimal) = 031(oktal) = 0x19(hexadezimal)

Zeichenkonstanten (char-Konstanten): Darstellung als ganze Zahl gemäß ASCII-Zeichensatz.Beispiele: 'A', 'B', 'C', '_', 'x', 'y', 'z', '3', '7', … , '+', '-', '=', '\n', '\0'

Konstanten vom Fließkomma-Datentyp: Ziffernfolge mitDezimalpunkt; Darstellung mit oder ohne Exponent (Zehnerpotenz).Beispiele: 127.4 = 0.1274e+3

0.00432 = 0.432e-2

Page 11: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

11IPP.TUC, Christian Vetter

Konstanten (II)

Zeichenkettenkonstante:

0110 0001

0110 0010

0110 0011

0110 0100

0000 0000

eine Zeichenkette (string) mit n Zeichen benötigt

Speicherbereich der Länge n+1 wegen desabschließenden Nullzeichens ('\0').

Beispiel: Zeichenkette " b d" wird abgelegtBeispiel: Zeichenkette "abcd" wird abgelegt

als 'a' 'b' 'c' 'd' '\0'. Die Längedieser Zeichenkette beträgt 4. Der Speicher-

bereich ist 5 Bytes groß.

Deklaration und Initialisierung

Alle Variablen eines Programms müssen vor ihrer Benutzung deklariert, d.h. vereinbart werden (siehe Rechenprogramm). Deklarationen bestehen aus Datentyp und einer Liste von Variablen, z B :z.B.:

int lower, upper, step;oder gleichwertig:

int lower; // Anfangswertint upper; // Endwertint step; // Schrittweite

Initialisierung von Variablen in Deklarationen, z.B.int i=0;int i=0;float eps=1.0e-5;

Die Initialisierung, d.h. Anfangswertzuweisung, erfolgt bereits zur Übersetzungszeit und hilft so Laufzeit einzusparen ;-) Zu beachten ist auch der Aspekt einer klaren und sicheren Initialisierungvor einer möglichen Nutzung.

Page 12: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

12IPP.TUC, Christian Vetter

Zuweisung

Um Berechnungen zu veranlassen, gibt es in den meisten Programmiersprachen die Zuweisung:

V i bl (li k S it ) l b i h A d k( ht S it )

amF

amF

: Zuweisungalschrift Rechenvors

:Gleichung als Gesetz

Variable(linke Seite) algebraischer Ausdruck(rechte Seite)

Beispiel (Pascal): F := m*a; // Kraft <- Masse * BeschleunigungBeispiel (C): F = m*a; // Kraft <- Masse * Beschleunigung

Es ist wichtig, zu verstehen, dass bei so genannter proze-duraler Programmierung eine Zuweisung als Anweisung oder Befehl formuliert wird Es handelt sich nicht um eineBefehl formuliert wird. Es handelt sich nicht um eine Gleichung im Sinne der Mathematik!

Der algebraische Ausdruck der rechten Seite wird ausgewertet, und das Ergebnis daraus der Variablen auf der linken Seite zugewiesen.

Arithmetische Operationen –Ergebnis Operand Operator OperandKraft Masse * Beschleunigung

Die Sprache C sieht die üblichen arithmetischen Operationen vor Als Operanden kommen ganze Zahlen oder Fließkomma-vor. Als Operanden kommen ganze Zahlen oder Fließkomma-zahlen in Frage. Als Operatoren stehen + - * /, wie sie allge-mein bekannt sind, zur Verfügung.

Allerdings hängt die Funktionsweise der Division ( / ) von den Typen der Operanden, die der Operator verknüpft, ab. Ist mindestens einer der beiden Operanden vom Fließkommatyp, p yp,so wird eine Fließkommadivision durchgeführt.Beispiel: 7 / 2.0 ergibt 3.5Sind jedoch beide Operanden vom Ganzzahltyp, wird eine Ganzzahldivision durchgeführt!Beispiel: 7 / 2 ergibt 3

Page 13: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

13IPP.TUC, Christian Vetter

Arithmetische Operationen (2)

Passend zur Ganzzahldivision gibt es einen weiteren Operator,der der Restbildung nach einer Ganzzahldivision zweier Ganzzahloperanden dient:

d M d l O tder Modulo-Operator %Beispiel: 7 % 2 ergibt 1

Wozu gibt es diese ungewöhnlich erscheinenden Ganzzahl-operationen / und %? Beispiel:Die Elemente einer m*n-Matrix werden zeilen-weise vom 0 ten bis zum (m*n 1) ten Element

7654

3210

aaaa

aaaa

aaaa

weise vom 0-ten bis zum (m n-1)-ten Element gespeichert. Die Zeilen(z)- bzw. Spalten(s)-indizes erhält man aus der Elementnummer i durch folgende Anweisungen:z = i / n; // Ganzzahldivisions = i % n; // Rest nach Ganzzahldivision

15141312

111098

aaaa

aaaa

Weitere Berechnungen

Weitere Rechenoperationen werden mit Funktionen aus der Mathematik-Bibliothek durchgeführt. Diese enthält neben der Exponentiation mit pow(x,y) z.B. auch eine ganze Reihe von t i t i h F kti (trigonometrischen Funktionen (sin(), cos(), tan(), atan() usw.). Um die Leistungen einer Bibliothek in Anspruch nehmen zu können, muss diese mittels Präprozes-sordirektive bekannt gemacht werden. Im Beispiel der System-Mathematik-Bibliothek mit:#include <math.h>

Mit #include wird formal nur die angegebene Datei einge-lesen. Diese enthält für den Compiler notwendige Informa-tionen. Will man eine eigene so genannte Header-Datei aus dem Projektverzeichnis einlesen, so geschieht dies mit#include "mybib.h"

Page 14: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

14IPP.TUC, Christian Vetter

Informationen über Bibliotheken

Es gibt eine ganze Reihe von Bibliotheken, die man im Allgemeinen nicht kennt und deren Inhalte und Leistungen ebenfalls nicht. Grundsätzlich besteht die Möglichkeit, die H d D t i lb t l E ibt i i Lit tHeader-Dateien selbst zu lesen. Es gibt einige Literatur, von der nur zwei Originale genannt seien:• Kernighan, Ritchie: Programmieren in C• Bjarne Stroustrup: Einführung in die Programmierung mit C++

Die Masse an Literatur muss jeder selbst nach seinem Geschmack bewerten und ggf. daraus selektieren.Es gibt jede Menge an Tutorien und andere Unterlagen g j g gim Internet zu finden, die auch sehr unterschiedlich sind. Als hilfreich hat sich die C++-Referenz auf

http://www.cppreference.com/wiki/starterwiesen. Hier lohnt es sich, zu suchen und den Umgang mit der Seite zu üben.

Typumwandlungen

Es gibt zwei sprachimplizite automatische Typumwandlungen

1. bei Verknüpfungen zweier typunterschiedlicher Operanden in algebraischen AusdrückenOperanden in algebraischen Ausdrücken

2. bei der Zuweisung auf eine Ergebnisvariable

Die Reihenfolge ist dabei zu beachten:erst Auswertung des algebraischen Ausdrucks,dann Anpassung an Ergebnistyp

Achtung!Bei der Anpassung an den Ergebnistyp kann durchaus wieder ein niedrigerer Typ entstehen und dabei das Ergebnis durch Abschneiden verändert werden!

Page 15: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

15IPP.TUC, Christian Vetter

1. Typumwandlung der Operanden

Bei Verknüpfungen von Operanden unterschiedlichen Datentyps findet eine automatische Typumwandlung statt, und zwar

vom „niedrigeren“ zum „höheren“ Datentyp ( char < short int < int < long long int < float < double )

entsprechend der Tabelle:

+, -, *, / int float double

int int float double

Operand 2Operator

int int float double

float float float double

double double double double

Ope

rand

1

Ergebnistyp

2. Typumwandlung bei Zuweisung

Auch bei der Zuweisung findet eine Typumwandlung statt,

wenn sich der Datentyp der Variablen auf der linken Seite

vom Datentyp des Ausdrucks auf der rechten Seite unter-

scheidet.

variable = ausdruck;

Der Datentyp des Ausdrucks wird ohne Rücksicht auf Verluste

i d D t t d Zi l V i bl d ltin den Datentyp der Ziel-Variablen gewandelt.

Explizite Angabe des Zieldatentyps durch type casting:

variable = (Datentyp variable) ausdruck

Page 16: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

16IPP.TUC, Christian Vetter

Beispiele zu Typumwandlungen

Mit folgenden Deklarationen und Initialisierungen sind die

Beispiele nachzuvollziehen:int i=2, j, k=7; float f=2.0, h;

Ergebnistyp und -wert

C-Anweisung Typ und Wert der rechten Seite

int 3 j = k/i; int 3

int 3 j = k/f; float 3.5

float 3.5 h = k/f; float 3.5

Es ist dringend zu empfehlen, die Typumwandlungen durch

eigenes Üben zu studieren.

float 3.0 h = k/i; int 3

float 3.0 h = (float) (k/i); float 3.0

int 3 j = ((float) k)/i; float 3.5

Ein- und Ausgaben

Es gibt grundsätzlich viele Wege zur Ein- und Ausgabe von

Informationen. Zur besseren Verständigung zwischen den

Teilnehmern der Veranstaltung und zur weitestgehenden Ver-

einfachung wird hier auf eine Variante aus der Sprache C++

über die Bibliothek <iostream> zurückgegriffen.

Um Leistungen dieser Bibliothek nutzen zu können, wird sie im

Kopf eines Programms mit der Präprozessordirektive#include <iostream>

und einer wichtigen Anweisung bezüglich des zu verwenden-

den Namensraumesusing namespace std;

bekannt gegeben.

Page 17: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

17IPP.TUC, Christian Vetter

Ausgabe mit cout

Es gibt eine formale Ausgabe-"Datei", die bibliotheksseitig schon mit cout bezeichnet ist. In Wirklichkeit verbirgt sich

dahinter ein Zeichenstrom, der automatisch an das Ausgabe-fenster geschickt wird. Mittels des Operators << wird der

Zeichenstrom zusammen gebaut. Die zusammensetzbaren

Operanden können Zeichen, Zeichenketten, Variablen und

sogar Ausdrücke sein. Das besondere Entgegenkommen der

Bibliothek ist, dass Variablen und ausgewertete Ausdrücke

automatisch in für Menschen lesbare Zeichenketten umge-

wandelt und dem Zeichenstrom (stream) hinzu gefügt werden.cout << "Hallo, Welt!" << endl;

cout << "Die Kraft beträgt " << force << " N." << endl;

cout << "Der Radius ist " << Diam/2.0 << '.' << endl;

Eingabe mit cin

Es gibt eine formale Eingabe-"Datei", die bibliotheksseitig schon mit cin bezeichnet ist. Auch diese ist ein Zeichenstrom,

der jedoch automatisch aus den Tastatureingaben gelesen wird. Mittels des Operators >> wird der Zeichenstrom auf die

angegebene(n) Variable(n) verteilt.

Die wichtige Leistung der Bibliothek ist, die Zeichenketten-

stücke zwischen Whiteblanks automatisch entsprechend den

Datentypen der angegebenen Variablen umzuwandeln.

Beim Einlesen sollte man an einen geeigneten Aufforderungs-

text denken.cout << "Anzahl Messwerte? "; cin >> mess_anz;

cout << "Werte x, y, z? "; cin >> vx >> vy >> vz;

Page 18: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

18IPP.TUC, Christian Vetter

Beispiel mit cin und cout

Basisstruktur eines C-Programms

Die Minimalstruktur eines C-Programms sieht folgendermaßen

aus:int main()

{ // hier beginnt der Rumpf des Hauptprogramms

return(0); // Ergebnisrückgabe

} // hier endet der Rumpf

Die Kopfzeile enthält den Rückgabe-Datentyp, den festgeleg-ten Namen main und eine Parameterliste, die leer sein kann.

Wenn es einen konkreten Rückgabe-Datentyp gibt, muss es dazu passend eine Rückgabe mit return() geben. Als

Parameter wird die Konstante oder Variable angegeben, die

zurück gegeben werden soll. Ein Programm kann so dem

aufrufenden System seinen Erfolg oder Misserfolg mitteilen.

Page 19: Einführung in programmieren

Einführung in das Programmieren (für Ing.), Grundlagen

19IPP.TUC, Christian Vetter

Praktisch erweiterte Basisstruktur

#include <iostream>

#include <math.h>

// ggf. noch mehr #include-Zeilen

using namespace std; // Standard-Namensraum

int main()

{

… // eigentliche Programm-Anweisungen

system ("PAUSE"); // Warten auf Taste

return(0);

}

Blöcke in C

Eine Sequenz von Anweisungen wird als Block aufgefasst und

in ein Paar von geschweiften Klammern {} eingeschlossen. Auch der Rumpf des Hauptprogramms main() ist ein Block.

Es muss zu einer öffnenden Klammer { immer eine zugehörige

schließende Klammer } folgen. Blöcke dürfen beliebig inein-

ander geschachtelt werden, sie dürfen sich aber nicht

überschneiden. Genau deshalb eignen sich Struktogramme

ideal als Vorbereitung von Programmen in blockorientierten

Sprachen. Regelgerechte Struktogrammentwürfe vermeiden

schwere Strukturfehler beim Programmieren in einer konkreten

Sprache. Die im Programmtext oftmals verwirrend erscheinen-

de Struktur von Blöcken kann meist schnell anhand guter

Struktogrammdokumente aufgeklärt werden.