01Intro.pdf - Informatik
01Intro.pdf - Informatik
01Intro.pdf - Informatik
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Vorlesung <strong>Informatik</strong> I für alle Bachelorstudiengänge <br />
im Fachbereich Maschinenbau und Verfahrenstechnik <br />
und für die Studiengänge "Wirtschaftsingenieurwesen" <br />
!<br />
Thomas Zielke, Prof. Dr.-Ing. M.Sc.<br />
Vorlesungszeiten: donnerstags, 10:00 - 11:30 Uhr<br />
Hörsaal: Audi Max<br />
Materialien: <br />
Vorlesungsfolien zum Download <br />
über:<br />
http://mv.fh-duesseldorf.de/d_pers/Zielke_Thomas <br />
oder www.cvis.de <br />
Prüfung: Klausur<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.1!
Praktikum zur "<strong>Informatik</strong> I" <br />
Prof. Dr.-Ing. M.Sc. Thomas Zielke <br />
B.Eng. Jens Lippel!<br />
Labor-Raum: H26c oder S2<br />
Zeiten: siehe Aushang zwischen S1a und S2, sowie online. <br />
Materialien: Unterlagen zu den Laborversuchen und den<br />
Projektaufgaben werden online<br />
zur Verfügung gestellt. <br />
www.ifi.mv.fh-duesseldorf.de/download/zielke_Inf1P.htm <br />
Kontakt: Jens.Lippel@fh-duesseldorf.de <br />
Raum S1a <br />
Tutorensprechstunde:<br />
Mittwochs 9:00 – 10:30 Uhr, Raum S2<br />
Donnerstags 12:00 – 13:30 Uhr, Raum S2<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.2!
Kommunikation!<br />
thomas.zielke@fh-duesseldorf.de <br />
Sprechstunde:<br />
Dienstags, 14:00 – 15:00 Uhr, <br />
oder nach Vereinbarung (Email) <br />
Raum S4 <br />
Telefon: (0211) 4351-434<br />
(01578) 4544789<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.3!
Was wird in der Vorlesung <strong>Informatik</strong> I behandelt?!<br />
Grundlagen der Programmierung in C (ANSI C) <br />
Ausgewählte Grundlagen der <strong>Informatik</strong><br />
<strong>Informatik</strong> I !<br />
WS13/14 1.4!
Literaturempfehlungen (1)!<br />
Axel Böttcher, Franz Kneißle,<br />
<strong>Informatik</strong> für Ingenieure,<br />
Grundlagen und Programmierung in C,<br />
Oldenbourg Wissenschaftsverlag,<br />
ISBN-13: 9783486705270, 2012.<br />
H.-P. Gumm, M. Sommer,<br />
Einführung in die <strong>Informatik</strong>,<br />
9. Auflage, Oldenbourg Verlag,<br />
ISBN: 3486597116, 2010.<br />
(oder ältere Auflage)<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.5!
Literaturempfehlungen (2)!<br />
Peter A. Darnell, Philip E. Margolis,<br />
C : A Software Engineering Approach,<br />
Springer-Verlag, ISBN: 0387946756, 1996.<br />
B. Kinariwala, T. Dobry, Programming in C,<br />
University of Hawaii, Online Textbook:<br />
http://www-ee.eng.hawaii.edu/Courses/EE150/Book/book.html<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.6!
Literaturempfehlungen (3)!<br />
Helmut Erlenkötter,<br />
C Programmieren von Anfang an,<br />
Rowolt Taschenbuch, ISBN:<br />
3499600749, 2006.<br />
Ulla Kirch und<br />
Peter Prinz,<br />
C - Lernen und professionell<br />
anwenden,<br />
mitp;<br />
ISBN: 978-3826695049,<br />
Auflage: 3., 2013.<br />
Ebook:<br />
http://bibl.eblib.com/patron/FullRecord.aspx?p=1344745<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.7!
Literaturempfehlungen (4)!<br />
<br />
<br />
C von A bis Z (Jürgen Wolf)<br />
http://pronix.linuxdelta.de/C/standard_C/<br />
C-HowTo: Programmieren lernen<br />
mit der Programmiersprache C<br />
(Elias Fischer)<br />
http://www.c-howto.de/<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.8!
Literaturempfehlungen (5)!<br />
Manfred Dausmann et al.,<br />
C als erste Programmiersprache,<br />
Vieweg+Teubner Verlag,<br />
7. Auflage, 2011.<br />
INTERNATIONAL STANDARD, ISO/IEC ISO/IEC 9899:2011,<br />
Programming languages — C.<br />
http://www.iso.org/iso/home/store/catalogue_tc/catalogue_detail.htm?<br />
csnumber=57853<br />
Online "Lexikon" zur Programmiersprache C :<br />
http://www.ifi.mv.fh-duesseldorf.de/download/STD_C/<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.9!
Stationen der Programmentwicklung<br />
Problem-Spezifikation<br />
Algorithmus finden<br />
Programmiersprache<br />
anwenden<br />
Problem<br />
redefinieren<br />
Quelltextdatei editieren<br />
Quelltext kompilieren<br />
Syntax-<br />
Fehler<br />
beseitigen<br />
Objektmodule binden<br />
Programm Testen und „Debuggen<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.10!
Kostenlose C/C++ <br />
Softwareentwicklungsumgebungen!<br />
lcc-win32: A Compiler system for windows by Jacob Navia:!<br />
<br />
Informationen und Download unter:<br />
http://www.cs.virginia.edu/~lcc-win32/<br />
Microsoft Visual Studio 2010 Express :!<br />
Informationen und Download unter:<br />
http://www.microsoft.com/visualstudio/deu/downloads#d-2010-express<br />
Apple Xcode (Version 3 oder 4):!<br />
Informationen und Download unter:<br />
http://developer.apple.com/technologies/tools/ <br />
(Unter Mac OS 10.7. ist separates "Command Line Tool" erforderlich)<br />
oder<br />
"Xcode 3.2.6 and iOS SDK 4.3 for Snow Leopard"<br />
https://developer.apple.com/downloads/<br />
(Entwicklerregistrierung erforderlich)<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.11!
Der FB4 "Online-Compiler" <br />
http://c.mv.fh-duesseldorf.de/ <br />
oder kurz:<br />
cvis.de<br />
Webseite für die<br />
Eingabe des<br />
Programmtexts und<br />
ggf. einer Text-/Zahlen-<br />
Eingabe für einen<br />
Programmlauf.<br />
Übersetzung und<br />
Programmlauf werden<br />
auf dem Webserver<br />
ausgeführt.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.12!
Exkurs: Rechnerarchitektur <br />
Klassisches Rechnerkonzept nach John von Neumann!<br />
• Gemeinsamer Speicher für Daten und Befehle<br />
• Sequentielle Abarbeitung der Befehle <br />
Prozessor (CPU)<br />
Rechenwerk<br />
Steuerwerk<br />
Register<br />
Eingabegeräte<br />
Ausgabegeräte<br />
1946<br />
Hauptspeicher (RAM)<br />
Befehl<br />
Ext. Speicher<br />
Datenwert<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.13!
Vergleich Hochsprache und Maschinensprache <br />
( "C" vs. Assemblersprache)!<br />
Hochsprachen, wie z.B. C, ersparen dem Programmierer<br />
sich um die Einzelheiten der verschiedenen Computer-<br />
Architekturen kümmern zu müssen.<br />
In einer Hochsprache geschriebene Programme sind<br />
einfacher zu lesen und zu warten.<br />
C - Anweisung typ. Assemblersprache<br />
a = b + c -2 ; LOAD b,R0<br />
LOAD c,R1<br />
ADD R0,R1<br />
SUB 2,R1<br />
• a, b und c sind "Variable" (Speicherplätze)<br />
• R0 und R1 sind CPU-Register <br />
STORE R1,a<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.14!
Entwicklungsgeschichte der Sprache C (1)!<br />
1969 Ken Thomson (Bell Laboratories) erstellt erste Version des<br />
Betriebssystems UNIX in Assembler => ist nicht portabel !!!<br />
1970 Ken Thomson entwickelt auf einem Computer PDP/7 (DEC)<br />
die Sprache B als Weiterentwicklung der Sprache BCPL; B ist eine<br />
typlose Sprache, sie kennt nur Maschinenworte<br />
1974 Dennis M. Ritchie Weiterentwicklung von B zu C, erste<br />
Implementation auf einer PDP 11<br />
1978 "The C programming language" von Brian W. Kernighan und<br />
Dennis M. Ritchie (Prentice Hall).<br />
Buch gilt lange Zeit als Quasi-Standard für die<br />
Programmiersprache C<br />
K&R Festlegungen bezüglich Syntax und Semantik<br />
der Programmiersprache C stellten quasi den kleinsten<br />
gemeinsamen Nenner für alle C-Programme dar.<br />
wachsende Verbreitung von C durch das<br />
Betriebssystem UNIX und seine Derivate<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.15!
Entwicklungsgeschichte der Sprache C (2)!<br />
1988 ANSI-Kommitee X3J11 veröffentlicht Sprachstandard<br />
für die Programmiersprache C ⇒ kurz ANSI C genannt<br />
2. Auflage von " Kernighan / Ritchie " ist eines der ersten Bücher zu ANSI C<br />
1999 Standard C99: ISO/IEC 9899:1999<br />
2011 Standard C11: ISO/IEC 9899:2011<br />
Einsatzgebiete von C<br />
Die Programmiersprache C besitzt heute eine sehr weite Verbreitung, da sie einerseits fast<br />
so flexibel wie eine Assembler-Sprache ist (bezüglich der Hardwarenutzung) und<br />
andererseits über viele Möglichkeiten moderner Hochsprachen verfügt.<br />
• Ursprüngliches Hauptanwendungsgebiet: Betriebssystementwicklungen (Unix)<br />
• Heute Universal-Programmiersprache für den technisch/wissenschaftlichen Bereich,<br />
aber auch für Datenbanksysteme, Netzwerksoftware, Dienstprogramme ...<br />
• Breite Verfügbarkeit von Compilern für unterschiedliche Prozessoren,<br />
insbesondere auch für Mikrocontroller (Stichwort: embedded systems)<br />
und Signalprozessoren (z.B. für Telekommunikation)<br />
ANSI = American National Standards Institute<br />
ISO = International Organization for Standardization<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.16!
Merkmale der Programmiersprache C !<br />
C nimmt eine Zwischenstellung zwischen Assemblersprache und<br />
Hochsprache ein. Die Sprache vereint zwei an sich widersprüchliche<br />
Eigenschaften:<br />
<br />
<br />
gute Anpassung an die Rechnerarchitektur (Hardware)<br />
hohe Portabilität ⇒ schnelle Anpassung an eine andere Hardware<br />
C-Compiler erzeugen sehr effizienten Code,<br />
sowohl bzgl. Laufzeit als auch bzgl. Programmgröße<br />
C-Programmierer haben nahezu vollständige Kontrolle über die Hardware<br />
<br />
bei hardware-naher Programmierung kann i.d.R. auf den Einsatz von Assembler-Sprache<br />
verzichtet werden.<br />
Modulares Software-Design wird unterstützt<br />
C ist eine einfache und kleine Sprache (ANSI C kennt nur 32 reservierte<br />
Worte und 4 elementare Datentypen: char, int, float und double),<br />
wurde aber für den erfahrenen Programmierer entworfen!<br />
Nachteil: Großer Unterschied zwischen einem funktionierenden und einem<br />
guten Programm möglich<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.17!
Welche Konzepte sind wichtig?!<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.18!
Vorlesung <strong>Informatik</strong> I <br />
Prof. Dr.-Ing. Thomas Zielke !<br />
Grundlagen der <br />
Programmierung in C <br />
<strong>Informatik</strong> I !<br />
WS13/14 1.19!
Programm Struktur (1) <br />
Minimalelemente!<br />
/*<br />
Dies ist ein C-Programm.<br />
Es tut gar nichts.<br />
*/<br />
#include <br />
int main(void)<br />
{<br />
return 0;<br />
}<br />
Eine geschweifte Klammer (brace), { bzw. }, <br />
markiert Anfang bzw. Ende eines Blocks von<br />
Programmanweisungen. <br />
Die Zeichenkombination<br />
Schrägstrich-Stern, <br />
/* bzw. */ , markiert Anfang<br />
bzw. Ende eines Kommentars. <br />
Wird für Ein- und Ausgaben benötigt.<br />
Könnte hier entfallen. <br />
Jedes C-Programm und jedes<br />
Unterprogramm ist syntaktisch<br />
eine Funktion. Das Hauptprogramm<br />
(die Startfunktion) main()<br />
muss immer vorhanden sein!<br />
Sie hat den Typ void oder int. <br />
Jede C-Anweisung (statement) wird mit<br />
einem Semikolon abgeschlossen.<br />
"return" beendet eine Funktion.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.20!
Programm Struktur (2) <br />
Gutes und schlechtes Hello-World-Programm!<br />
#include /* Standard I/O Definitionen */<br />
/* Dies ist ein C-Programm. Es druckt eine */<br />
/* Meldung auf dem Computer-Bildschirm */<br />
Dieses C-Programm<br />
hat eine klar<br />
erkennbare Struktur<br />
int main(void)<br />
{<br />
printf("Hello world.") ;<br />
return 0;<br />
}!<br />
Hello world.!<br />
Diese beiden C-Programme<br />
führen zum exakt<br />
gleichen ausführbaren<br />
Programm<br />
C ist eine<br />
formatfreie<br />
Sprache<br />
#include<br />
int main(void){printf("Hello world.");return 0;}<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.21!
Kommandozeilen-Programme!<br />
!"#$%&'()<br />
*%+,('-)<br />
3.'&4'#45:/+2'7")8+.41/.9)<br />
!'+.'./#)<br />
:/+2'7");
Programm Struktur (3) <br />
Programmierstil / Strukturiertes Programmieren!<br />
Der C-Compiler ignoriert die Zeilenstruktur des<br />
Quelltextes und auch alle Leerzeichen (white spaces)<br />
Bessere Lesbarkeit für den Programmierer durch<br />
Strukturierung des Quelltextes:<br />
Einrücken von Blocks, Leerzeilen, Kommentare ...<br />
schlechtes Beispiel (keine Kommentare, kein Einrücken,<br />
insgesamt unübersichtliche Formatierung):<br />
#include <br />
int main(void) {<br />
int n, m; int g;<br />
scanf( "%i", &n ); scanf( "%i", &m );<br />
g = m ;<br />
start_wiederholung:<br />
if (m%g!=0) { g = g - 1; goto start_wiederholung ;}<br />
if (n%g!=0) { g = g - 1; goto start_wiederholung ;}<br />
printf( "%s %i", "ggT =", g ); return 0; }<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.23!
* Kommentartext in C-Programmen */!<br />
Der Compiler behandelt einen Kommentar<br />
wie ein Leerzeichen<br />
⇒ Kommentare können überall eingefügt<br />
werden, wo Leerzeichen erlaubt sind*<br />
Beispiele:<br />
/* Kommentare koennen sich ueber<br />
mehrere Zeilen erstrecken.<br />
*/<br />
/***<br />
*** Ein sehr langer Kommentar kann auf<br />
*** diese Weise geschrieben werden, um ihn<br />
*** vom umgebenden Programm abzuheben.<br />
***/<br />
/**************************************/<br />
/* Wenn Sie moechten, koennen Sie */<br />
/* Kommentare auch umrahmen. */<br />
/**************************************/<br />
/* Kommentare<br />
koennen /* nicht */<br />
geschachtelt werden.*/<br />
Um einen Programmteil<br />
(einschließlich der Kommentare)<br />
vorübergehend von der Übersetzung<br />
auszuschließen, können die<br />
Präprozessor-Direktiven<br />
#ifdef und #endif benutzt werden.<br />
Beispiel:<br />
/*<br />
#define DEBUG<br />
*/<br />
#ifdef DEBUG<br />
. . .<br />
#endif<br />
// "Zeilenkommentare" beginnen mit zwei<br />
// Schrägstrichen (nur bei C/C++ Compilern)<br />
*Vorsicht jedoch innerhalb von<br />
Macro-Definitionen und -Aufrufen<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.24!
Syntaxfehler <br />
Programmbeispiele mit Bugs!<br />
/* Case sensitivity example */<br />
/* Case sensitivity example */<br />
void Main()<br />
{<br />
void main()<br />
{<br />
float This_One = 2.0; /* Program constant.*/<br />
float That_One; /* Program variable. */<br />
That_one = 2.0 * This_one;<br />
/* This program will not compile! */<br />
}<br />
/* This program will not compile! */<br />
}<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.25!
Syntaxfehler <br />
Programmbeispiele mit Bugs!<br />
/* Omitting comment delimiters. */<br />
void main()<br />
{<br />
float constant_1 = 2.0; /*Program constant.*/<br />
float variable_1; /*Program variable.<br />
variable_1 = constant_1 + constant_1;<br />
/* This program will compile! But won't work as<br />
expected */<br />
} /* Missing semicolon. */<br />
void main()<br />
{<br />
float This_One = 2.0 /*Program constant.*/<br />
float That_One; /*Program variable.*/<br />
That_One = 2.0 * This_One;<br />
/* This program will not compile! */<br />
}<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.26!
Phasen der Compilierung eines C-Programms <br />
Überprüfung der Syntax und Programmerzeugung!<br />
"Header-Dateien"<br />
Quelltext-<br />
Datei<br />
my_prog.c<br />
Objektmodul-<br />
Datei<br />
my_prog.o<br />
Vorverarbeitung<br />
(Preprocessing)<br />
Lexikalische Analyse<br />
(Lexical Analysis)<br />
Parsen<br />
(Parsing)<br />
Code-Erzeugung<br />
(Code Generation)<br />
stdio.h<br />
Erkennen der<br />
elementaren<br />
Einheiten: "Token" <br />
Einhaltung der<br />
Sprachregeln überprüfen<br />
und<br />
Bedeutung erkennen<br />
Übersetzung der<br />
"verstandenen"<br />
C-Anweisungen<br />
in Maschinen-<br />
Instruktionen<br />
... <br />
my_prog.h<br />
Der C-Präprozessor<br />
(preprocessor) transformiert die<br />
gesamte Quelltext-Datei, z.B.<br />
durch Einfügen von anderen<br />
Textdateien und Ersetzen von<br />
symbolischen Namen. Der<br />
Programmierer kann diese Text-<br />
Vorverarbeitung mit<br />
Präprozessor-Befehlen steuern<br />
(z.B.: #include )<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.27!
Syntax, Grammatik und Semantik <br />
einer Programmiersprache!<br />
Eine Programmiersprache ist nach bestimmten Regeln<br />
aufgebaut, die der Programmierer exakt einhalten muss.<br />
Der Compiler vergleicht ein Vokabular von erlaubten Worten<br />
mit den Worten, die der Benutzer verwendet.<br />
Die Worte (strukturierte Symbole) einer Sprache leiten<br />
sich von einem bestimmten Alphabet ab.<br />
Es gibt Regeln für die richtige Kombination der<br />
Alphabetzeichen (elementare Zeichen bzw. Symbole)<br />
zu Worten.<br />
Weitere Regeln gelten für die Kombination der Worte.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.28!
Syntax, Grammatik und Semantik <br />
einer Programmiersprache!<br />
Syntax<br />
Die Syntax regelt die "Rechtschreibung" einer Programmiersprache. Sie lässt sich<br />
formal festlegen, z.B. mit Syntaxdiagrammen oder in einer Grammatik.<br />
Eine Grammatik ist ein Regelwerk zur Beschreibung der Syntax.<br />
Bei Programmiersprachen wird die Grammatik häufig mit Hilfe der<br />
Backus-Naur-Form<br />
definiert.<br />
Semantik<br />
Die Semantik regelt die Bedeutung einzelner Sprachelemente und ihr<br />
Zusammenspiel.<br />
Sie lässt sich viel schwieriger exakt festhalten.<br />
(Nicht jede syntaktisch richtige Wortfolge hat eine sinnvolle Bedeutung!)<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.29!
Mittel zur Beschreibung einer Syntax!<br />
Erweiterte Backus-Naur-Form,<br />
kurz EBNF, ist eine Erweiterung der Backus-Naur-Form (BNF), die<br />
ursprünglich von Niklaus Wirth zur Darstellung der Syntax der<br />
Programmiersprache Pascal eingeführt wurde. Sie ist eine<br />
formale Metasyntax (Metasprache), die benutzt wird, um<br />
kontextfreie Grammatiken (Grammatiken von<br />
Programmiersprachen) darzustellen.<br />
Die EBNF ist im ISO Standard ISO/IEC 14977:1996 normiert.<br />
Syntaxdiagramm<br />
Ein Syntaxdiagramm zeigt alle gültigen Wege auf, wie ein Stück<br />
Programmtext aus syntaktischen Grundelementen (Zeichen,<br />
Wörter, zusammengesetzte Einheiten) erzeugt werden kann.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.30!
Syntax-Notation nach Backus-Naur (1) <br />
Beispiel: Bildung von Namen (Bezeichner/Identifier)!<br />
"Syntaxbegriffe", hier kursiv und in Grün geschrieben, werden durch<br />
Syntaxregeln erklärt:<br />
identifier = (letter | "_" ) { letter | digit | "_" } ;<br />
Es bedeuten:<br />
kursiv Syntaxbegriff (Nichtterminalsymbol, Name einer Produktionsregel)<br />
= Definition; „ist definiert als (rechte Seite mit Semikolon abschließen!)<br />
| Alternative (Auswahl); bedeutet „oder<br />
A|B bedeutet, dass sowohl A als auch B möglich ist.<br />
{ } Iteration; {A} bedeutet, dass A überhaupt nicht, einmal oder<br />
beliebig oft vorkommen kann.<br />
[ ] Option; [A] bedeutet, dass A vorkommen kann, aber nicht<br />
vorkommen muss.<br />
( ) Gruppierung; zur logischen Gruppierung von Teilausdrücken<br />
Terminalsymbole sind die tatsächlich verwendeten Symbole der Sprache.<br />
Sie werden mit " oder ' eingeschlossen, hier in Farbe:<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.31!
Syntax-Notation nach Backus-Naur (2) <br />
Beispiel: Bildung von Namen (Bezeichner/Identifier)!<br />
digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;<br />
letter<br />
= "a"|"b"|"c"|"d"|"e"|"f"|"g"|"h"|"i"|"j"|"k"|<br />
"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u"|"v"|<br />
"w"|"x"|"y"|"z"|<br />
"A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|<br />
"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|"V"|<br />
"W"|"X"|"Y"|"Z" ;<br />
identifier = (letter | "_" ) { letter | digit | "_" } ;<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.32!
Syntax -Notation nach Backus-Naur (3) <br />
Beispiel: Bildung von Namen (Bezeichner / Identifier)!<br />
Interpretation der Syntaxbegriffe für Bezeichner:<br />
digit eine Ziffer aus der Menge 0 bis 9<br />
letter ein Klein- oder Großbuchstabe (ASCII code)<br />
identifier muss mit einem Buchstaben oder dem Zeichen<br />
_ (underscore) beginnen, kann mit Buchstaben,<br />
Ziffern oder dem Zeichen _ fortgesetzt werden<br />
gültige Bezeichner sind<br />
i, x, liste, sortiert, Fehler, FEHLER,<br />
fehler, text_hoehe, text_breite, _1<br />
ungültige Bezeichner, z.B.<br />
1malEins, Backus-Naur, im_folgenden:, 123, abc@xyz,<br />
Preis_in_$, text_höhe<br />
Gute Programmierer wählen „sprechende Bezeichner!<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.33!
Syntax-Notation nach Backus-Naur (4) <br />
Beispiel: Einfaches C Programm!<br />
C_Programm = ("void" | "int") " "<br />
"main" "(" ["void"] ")"<br />
"{" {Anweisung ";"} "}" ;<br />
Anweisung ist ein Syntaxbegriff, der hier als definiert vorausgesetzt wird!<br />
So könnte eine vereinfachte Syntax-Beschreibung für ein C Programm aussehen.<br />
Die Symbole und Worte in der Farbe Rot sind Teil der Programmiersprache C.<br />
Alle Symbole in der Farbe Blau gehören zur Backus-Naur Syntaxbeschreibung.<br />
#include /* Standard I/O Definitionen */<br />
Entspricht dieses<br />
Programm der oben<br />
definierten Syntax ???<br />
/* Dies ist ein C-Programm. Es druckt eine */<br />
/* Meldung auf dem Computer-Bildschirm */<br />
void main( )<br />
{<br />
printf("Hello world.") ;<br />
}!<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.34!
Metasyntax in Benutzer-Manuals für<br />
Kommandozeilenprogramme <br />
Beispiel: ssh!<br />
SSH(1) BSD General Commands Manual SSH(1)<br />
NAME<br />
ssh -- OpenSSH SSH client (remote login program)<br />
SYNOPSIS<br />
ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]<br />
[-e escape_char] [-F configfile] [-i identity_file] [-L [bind_address:]port:host:hostport]<br />
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R<br />
[bind_address:]port:host:hostport] [-S ctl_path] [-w local_tun[:remote_tun]] [user@]hostname<br />
[command]<br />
DESCRIPTION<br />
ssh (SSH client) is a program for logging into a remote machine and for executing commands on a remote<br />
machine. It is intended to replace rlogin and rsh, and provide secure encrypted communications between<br />
two untrusted hosts over an insecure network. X11 connections and arbitrary TCP ports can also be forwarded<br />
over the secure channel.<br />
Beispielaufruf: ssh -q -l zielke www.fh-duesseldorf.de<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.35!
Syntax - Diagramm (1) <br />
(Railroad-Track Diagram) <br />
Beispiel: Bildung von Namen (Bezeichner / Identifier)!<br />
Ein Syntax-Diagramm zeigt alle gültigen Wege auf,<br />
wie ein Stück Programmtext aus syntaktischen<br />
Grundelementen (Zeichen, Wörter, zusammengesetzte Einheiten) erzeugt<br />
werden kann.<br />
Syntaxbegriffe werden durch Rechtecke, Terminalsymbole durch Kreise<br />
oder Ellipsen dargestellt. Alle Verbindungen sind gerichtete Pfeile.<br />
letter<br />
(Buchstabe)<br />
Terminalsymbol<br />
_<br />
digit<br />
(Ziffer) <br />
Syntaxbegriff<br />
identifier = (letter | "_" ) { letter | digit | "_" } ;<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.36!
Syntax - Diagramm (2) <br />
(Railroad-Track Diagram) <br />
Beispiel: Bedingte Anweisung in C!<br />
if<br />
(<br />
expression )<br />
statement<br />
Als definiert vorausgesetzte<br />
Syntaxbegiffe:<br />
expression (Ausdruck)<br />
statement (Anweisung)<br />
else<br />
statement<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.37!
Syntax - Diagramm (3) <br />
(Railroad-Track Diagram) <br />
Weitere Beispiele!<br />
Zuweisungs-Operator<br />
Buchstaben<br />
Ganzzahl-Konstante<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.38!
Semantische Einschränkungen <br />
Beispiel: Bildung von selbstdefinierten Namen (Bezeichner / Identifier)!<br />
Die Syntaxregeln für die Bildung von Bezeichnern enthalten keine<br />
Angaben über semantische Einschränkungen, wie z.B.:<br />
Einige Compiler-Implementierungen limitieren die Länge von Namen<br />
bzw. die Anzahl der signifikanten Zeichen.<br />
Externe Namen (z.B. Funktionsnamen) können betriebssystembedingt<br />
beschränkt sein (z.B. auf sechs oder acht Zeichen), u.U. ohne<br />
Unterscheidung von Groß- und Kleinschreibung<br />
Namen, die mit einem Unterstrich (underscore: _ ) beginnen sind oft für<br />
Compiler/System-Zwecke reserviert.<br />
Reservierte Namen der Programmiersprache dürfen nicht für<br />
Bezeichner (Identifier) verwendet werden!<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.39!
Syntax der Programmiersprache C <br />
Zeichensätze!<br />
C braucht zwei Zeichensätze:<br />
• Zeichensatz für die Übersetzung<br />
bzw. für die eigentlichen<br />
Sprachelemente<br />
(Source-Zeichensatz)<br />
• Zeichensatz für die Ausführung<br />
(Ausführungszeichensatz;<br />
z.B. für Zeichen in Strings.)<br />
#include <br />
int main (void) {<br />
/* Für Varablen-Namen gilt der <br />
Source-Zeichensatz */<br />
int Hoehe=100;<br />
/* Für die Textausgabe mit printf ist <br />
ein erweiterter Zeichensatz möglich */<br />
printf("Höhe:%i\n", Hoehe);<br />
return 0;<br />
}<br />
Als Source- und Ausführungszeichensatz gilt oft ein reduzierter ASCII Code (American<br />
Standard Code for Information Interchange).<br />
Der Ausführungszeichensatz kann jedoch wesentlich umfangreicher sein.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.40!
Syntax der Programmiersprache C <br />
Source-Zeichensatz!<br />
Großbuchstaben:<br />
A B C D E F G H I J K L M N O<br />
P Q R S T U V W X Y Z<br />
Kleinbuchstaben:<br />
a b c d e f g h i j k l m n o<br />
p q r s t u v w x y z<br />
Ziffern:<br />
0 1 2 3 4 5 6 7 8 9<br />
Sonderzeichen:<br />
( ) [ ] { } < > + - * / % ^ ~<br />
& | _ = ! ? # \ , . ; : ' "<br />
Leerzeichen und Zeilenendezeichen<br />
Steuerzeichen:<br />
horiz. Tabulator, vert. Tab. und <br />
Seitenvorschub<br />
"white space" <br />
Zeichen <br />
<strong>Informatik</strong> I !<br />
WS13/14 1.41!
white space<br />
characters<br />
(Beispiele)<br />
C - Source-Zeichensatz <br />
Gültige Zeichen (auch) außerhalb von Zeichenketten <br />
ASCII Code (American Standard Code for Information Interchange)!<br />
Beispiel:<br />
Das Zeichen 'q' wird im 7-Bit<br />
ASCII Code mit der Bitfolge<br />
1110001 dargestellt.<br />
Das Leerzeichen (SP, engl. space oder blank), zum Beispiel, hat<br />
den hexadezimalen Zahlencode 0x20.<br />
Das Zeichen 0 wird mit der Hexadezimalzahl 0x30 dargestellt,<br />
was dem Dezimalwert 48 entspricht (3*16 + 0 == 4*10 + 8).<br />
Das Zeichen A hat den Dezimalwert 65 (4*16 + 1).<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.42!
Grundsymbole (Token)!<br />
1. Schlüsselwörter (keywords)<br />
2. Bezeichner (identifier), z.B. i text_hoehe c2<br />
3. Operatoren (operators), z.B. + - = < > &&<br />
4. Konstanten (constants), z.B. 8 7.5 'x'<br />
5. Zeichenketten (strings), z.B. "dies ist ein string"<br />
6. Punktsymbole [ ] ( ) { } * , : = ; ... #<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.43!
Schlüsselwörter (keywords) <br />
ANSI C<br />
auto double int struct<br />
break else long switch<br />
case enum register typedef<br />
char extern return union<br />
const float short unsigned<br />
continue for signed void<br />
default goto sizeof volatile<br />
do if static while<br />
• Schlüsselwörter sind reservierte Worte:<br />
– haben eine genau definierte Bedeutung<br />
– können nicht umdefiniert werden<br />
– immer in Kleinschreibung!<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.44!
Konstantennotation <br />
Wie werden die konstanten Werte eines Datentyps ausgedrückt?!<br />
Gleitkommazahl<br />
(floating point number)<br />
Zeichen (character)<br />
' '<br />
'\0' 'A'<br />
'\033' '7' '+'<br />
'\n' '\t'<br />
'@' '_'<br />
Ganzzahl (integer)<br />
0<br />
033 0xA 1 011<br />
11 42 300000<br />
0x3F1B<br />
Zeichenkette (string)<br />
3.14<br />
0.5 0.314e1<br />
100.f 1000.0E-3<br />
5E8 .33333<br />
0.0<br />
"0815" ""<br />
"FH Düsseldorf"<br />
"5" "Hallo\n"<br />
"Warum?"<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.45!
Exkurs: Zahlensysteme (1) <br />
Dezimalsystem!<br />
Jede Ziffer innerhalb einer Zahl besitzt einen Ziffernwert und<br />
einen Stellenwert.<br />
Beispiel:<br />
1234 = 4 * 1 = 4 * 10 0<br />
+ 3 * 10 + 3 * 10 1<br />
+ 2 * 100 + 2 * 10 2<br />
+ 1 * 1000 + 1 * 10 3<br />
"Ziffernwert * Stellenwert"<br />
Verallgemeinerung:<br />
• Der Wert z einer Dezimalzahl ist die Summe über alle Stellen<br />
i = 0, ..., n über die Ziffernwerte a i multipliziert mit dem<br />
Stellenwert 10 i , also<br />
n<br />
z = a i<br />
i= 0<br />
Symbolvorrat:<br />
0 1 2 3 4 <br />
5 6 7 8 9<br />
! "10 i Zeichen bzw.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.46!
Exkurs: Zahlensysteme (2) <br />
Dualsystem!<br />
Zweierpotenzen:<br />
<br />
1 <br />
2 <br />
4 <br />
8 <br />
16 <br />
32 <br />
64 <br />
128 <br />
256 <br />
512 <br />
1024 <br />
... <br />
Beispiel:<br />
Basis B = 2 Ziffern / Zeichenvorrat a i = 0, 1<br />
100 1101 0010 = 0 * 2 0 = 0<br />
+ 1 * 2 1 + 2<br />
+ 0 * 2 2<br />
+ 0 * 2 3<br />
+ 1 * 2 4 + 16<br />
+ 0 * 2 5<br />
+ 1 * 2 6 + 64<br />
+ 1 * 2 7 + 128<br />
+ 0 * 2 8<br />
n<br />
z = Σ a i • B i<br />
i =0<br />
+ 0 * 2 9<br />
+ 1 * 2 10 + 1024<br />
1234 dezimal<br />
Umrechnung von Dual- in Dezimalzahl<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.47!
Exkurs: Zahlensysteme (3) <br />
Oktalsystem und Hexadezimalsystem!<br />
Oktalsystem:<br />
Basis 8<br />
Ziffern: 0 1 2 3 4 5 6 7<br />
Zusammenfassung von 3 Stellen der entsprechenden Dualzahl<br />
Hexadezimalsystem:<br />
Basis 16<br />
Ziffern: 0 1 2 3 4 5 6 7 8 9 A B C D E F<br />
(Kleinbuchstaben auch erlaubt!)<br />
Zusammenfassung von 4 Stellen der entsprechenden Dualzahl<br />
⇒ gute Lesbarkeit von byteweise binären Wertangaben:<br />
ein Byte wird mit jeweils zwei Hex.-Ziffern ausgedrückt,<br />
z.B. 7A Hex entspricht 01111010 Dual<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.48!
Literale Konstanten (1) <br />
Übersicht!<br />
Literale Konstanten sind Bezeichner (Token), die für den Compiler<br />
einen konstanten Wert eines elementaren Datentyps darstellen<br />
• ohne literale Konstanten könnte der Programmierer keiner Variablen einen<br />
definierten Ausgangswert geben!<br />
Zeichen-Konstanten vom Typ char :<br />
Ein Zeichen des Source- oder Ausführungszeichensatzes, eingeschlossen in<br />
Apostrophe, Bsp.: 'a' '$' '.' ' ' 'C' '7'<br />
Escape-Sequenz: ein Zeichen mit vorgestelltem Backslash ( \ ), eingeschlossen in<br />
Apostrophe, Bsp.:<br />
'\n' /*newline*/ '\t' /*tab*/ '\a' /*alert/bell*/ '\\' '\''<br />
Numerische Zeichenangabe: Oktal- oder Hexadezimalzahl mit vorgestelltem<br />
Backslash ( \ ), eingeschlossen in Apostrophe, Bsp.:<br />
'\0' /*Nullzeichen*/ '\033' /*ESC*/ '\x20' /*Leerzeichen*/<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.49!
Literale Konstanten (2) <br />
Übersicht!<br />
Ganzzahlige Konstanten vom Typ int :<br />
Dezimale Angabe (Ziffern 0 ... 9) ohne führende Null! Bsp.:<br />
123 500 5 19 32<br />
Oktale Angabe (Zahl zur Basis 8, Ziffern 0 ... 7) immer mit führender 0, Bsp.:<br />
05 023 040 /* Werte: 5, 19, 32 */<br />
Hexadezimale Angabe (Zahl zur Basis 16, Ziffern 0 ... 9 A ... F) mit führendem<br />
0x oder 0X, Bsp: 0x5 0X13 0x20 /* Werte: 5, 19, 32 */ 0x3F1B 0xff<br />
Gleitkommakonstanten vom Typ double<br />
(bzw. float ⇒ durch Anhängen von f oder F) :<br />
Eine Dezimalzahl mit Punkt, Bsp.: 3.14 .5 3. 3.0f 0.12345 0.5<br />
Eine Ganzzahl mit Exponenten e oder E, Bsp.:<br />
5E8 /* 5 * 10 hoch 8 */ 5e8 3e-1 /* 3 * 10 hoch -1 = 0.3 */<br />
Kombinierte Exponentialschreibweise, Bsp.:<br />
0.314e1 /* 3.14 */ 1.1E4 /* 11000.0 */ 1000.0e-3 /* 1.0 */<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.50!
Elementare Datentypen <br />
Die Standardtypen in C - Übersicht!<br />
Integrale Typen<br />
(repräsentieren ganzzahlige Werte)<br />
Zeichentyp ( char )<br />
Integer-Typen ( int ) mit Vorzeichen<br />
(signed integer types)<br />
• signed char<br />
• [signed] int<br />
• [signed] long [int]<br />
• [signed] short [int]<br />
Integer-Typen ( int ) ohne Vorz.<br />
(unsigned integer types)<br />
• unsigned char<br />
• unsigned [int]<br />
• unsigned long [int]<br />
• unsigned short [int]<br />
Aufzählungstypen (enum)<br />
(enumerating types)<br />
Gleitkommatypen<br />
(repräsentieren reelle Zahlen)<br />
float<br />
double<br />
long double<br />
C ist eine streng typisierte Sprache:<br />
Alle Variablen haben einen vom<br />
Programmierer festgelegten Typ.<br />
Damit wird bestimmt, welche Werte<br />
die Variable annehmen darf.<br />
Die in eckigen Klammen [ ] stehenden Worte<br />
können optional weggelassen werden.<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.51!
Programmbeispiel <br />
Deklarieren von Variablen!<br />
#include /* Einfügen von Standard-I/O-Definitionen */<br />
int main(void)<br />
{<br />
char a_character; /* This declares a character. */<br />
int an_integer; /* This declares an integer. */<br />
float floating_point; /* This declares a floating point.*/<br />
a_character = 'a';<br />
printf("'%c' is a character.\n", a_character);/*Ausgabe ein Zeichen*/<br />
an_integer = 0xf; /* 15 */<br />
floating_point = 27.62;<br />
/* Ausgabe ... */<br />
printf("%i is an integer.\n", an_integer); /* ... ein Integer */<br />
printf("%f is a floating point.\n", floating_point);/*... ein Float*/<br />
return 0;<br />
}<br />
<strong>Informatik</strong> I !<br />
WS13/14 1.52!