01.03.2014 Aufrufe

01Intro.pdf - Informatik

01Intro.pdf - Informatik

01Intro.pdf - Informatik

MEHR ANZEIGEN
WENIGER ANZEIGEN

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!

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!