Upload
david-ahoua
View
16
Download
0
Embed Size (px)
DESCRIPTION
Grundlagen
Citation preview
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)
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);
}
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).
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!)
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);
}
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);
}
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
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
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
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
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.
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
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"
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!
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
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.
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;
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.
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.