ich war hier: ProzProg2Programmaufbau
 (image: http://wdb.fh-sm.de/uploads/QualipaktLehre/BMBF_Logo_klein.jpg)

Prozedurale Programmierung - Kapitel 2 - Programmaufbau


Inhalte von Dr. E. Nadobnyh

2.1. Bestandteile eines Programms


Das erste Programm


Da formale Beschreibungen etwas trocken sind, wird traditionell mit dem einfachen Beispiel angefangen.

//Ziel dieses Programms ist es, die Textfolge
//"Hallo Welt" auf dem Bildschirm auszugeben.
#include <iostream>  
using namespace std;
int main ( )
{       cout<<"Hallo Welt";  
         return 0;  
}


Drei Bestandteile des Quellcodes:
a) Kommentare beginnen mit oder abgegrenzt, z.B.:

 /* . . . . .  
                                . . . . . */


2.Einzeilige Kommentare beginnen mit


Kommentare dürfen nicht verschachtelt werden.


Präprozessor


Ein Präprozessor ist ein Programm, welches Präprozessordirektiven verarbeitet und die Kommentare ausblendet.

Besonderheiten:
1. Er wird vor dem Compiler gestartet und sucht den Quelltext nach seinen Direktiven durch.
2. Direktiven beginnen mit einem # (Rautenzeichen) als ersten Zeichen einer Zeile.
3. Ein Präprozessor arbeitet auf Textebene, versteht (fast) nichts von C/C. Deshalb keinerlei Fehlerprüfung.
4. Wichtigste Direktiven sind #define und #include.

Mit der Direktive
#define text ersatztext
wird die beliebige Zeichenfolge text durch ersatztext überall im Programm ersetzt. Beispiel:
#define PI 3.1415

Eine Programmbibliothek ist eine Datei, die eine oder mehrere C/C
-Funktionen beinhaltet.

Damit ein Programm von diesen Funktionen Bescheid weiß, müssen diese eingebunden werden. Das geschieht mit der #include- Direktive.

Beispiele für die wichtigen Header-Dateien, welche die Funktionsprototypen enthalten:

#include <iostream> für cout
#include <math.h> für sin
#include <iomanip> für setprecision
#include <stdio.h> für printf


main-Funktion


Ein Programm kann mehrere Funktionen enthalten. Jedes Programm muss die main-Funktion enthalten, die als Hauptprogramm bezeichnet wird. Bei der Programmausführung wird die main-Funktion vom Betriebssystem gestartet. Ser main-Körper ist durch die geschweiften Klammern abgegrenzt und enthält Definitionen und Anweisungen.

int main ( )
{    
         . . .
 
     return 0;
}



Variablendefinitionen und Anweisungen


Ein einfaches typisches Programm besteht aus mehreren Variablendefinitionen und Anweisungen:

1. Variablendefinitionen (Vereinbarungen) erklären dem Compiler die vom Programmierer eingefügten Variablennamen.
Durch die Variablendefinition erhält jede Variable einen Datentyp. Der Datentyp legt die erlaubten Wertebereiche und die zulässigen Operatoren fest. In folgendem Beispiel ist int ein Datentyp integer:
int a, b; int s;

2. Anweisungen sind ausführbare Sprachelemente, die den eigentlichen Algorithmus beinhalten, z.B.:
s = a + b;


Typische Programmmuster


Der Aufbau eines einfachen typischen Programms folgt in den meisten Fällen diesem Muster:
 (image: http://ife.erdaxo.de/uploads/ProzProg2Programmaufbau/pp12.gif)

Die Eingabe, Verarbeitung und Ausgabe sind die Anweisungen im typischen EVA-Programm:
 (image: http://ife.erdaxo.de/uploads/ProzProg2Programmaufbau/pp13.gif)


Typisches Programm. Beispiel
 (image: http://ife.erdaxo.de/uploads/ProzProg2Programmaufbau/pp14.gif)


2.2. Syntax


Syntax und Semantik
Unter Syntax einer Sprache versteht man die Menge der
grammatikalischen Regeln, die bestimmen, wie die
Symbole einer Sprache korrekt zu benutzen sind.

Die Semantik beschreibt die Bedeutung der syntaktisch
korrekten Sätze, d.h. wie sie sich verhalten, wenn sie auf
Rechnern ausgeführt werden.

Syntax ist hierarchisch aufgebaut:


  1. Alphabet,
  1. Lexikalische Einheiten,
  1. Sprachelemente.


Syntaxhierarchie


 (image: http://ife.erdaxo.de/uploads/ProzProg2Programmaufbau/pp15.gif)


Alphabet


Das gesamte Alphabet der Grundzeichen ist in Zeichen eingeteilt, die für die Syntaxregeln relevant sind:

  • Kleinbuchstaben: a .. z
  • Großbuchstaben: A .. Z
  • Unterstreichungszeichen: _
  • Ziffern: 0 .. 9
  • Sonderzeichen:
! # $ % & * + , − . / : ; < >
? @ | \ ~ { } " ' ( ) [ ]
  • Nichtdruckbare Zeichen:
    • ’ ’ -Leerstelle, Leelzeichen,
    • ’\n’ -neue Zeile, Zeilenwechsel Return, Enter,
    • ’\t’ -Tabulator,
    • ‘\0’ -Null-Zeichen ua.


Lexikalische Einheiten


Lexikalische Einheiten (Sinneinheiten, Token) sind bestimmte regelhaft gebildete Wörter (Zeichengruppen) eines Programms, die durch Trennzeichen voneinander abgetrennt sind.

1. Namen (Identifikator, Bezeichner)
  • Namen sind Zeichenfolgen, die nur Buchstaben, Ziffern, oder das Unterstreichungszeichen “ _“ enthalten.
  • Umlaute und “ß“ sind nicht erlaubt.
  • Meist 31 Zeichen, strenge Unterscheidung zwischen groß und klein.
  • Erstes Zeichen darf keine Ziffer sein.
  • Unterstreichungszeichen als erstes Zeichen ist füt Dienstnamen reserviert.
  • Standardfunktionen wie sin() oder fopen() sollen nicht umfunktioniert werden.

2.Schlüsselwörter (Wortsymbole, keyword)
  • Bestimmte Wörter haben eine besondere Bedeutung, beispielsweise main, while und if.
  • C hat eine geringe Anzahl von Schlüsselwörtern, etwa dreißig.
  • Schlüsselwörter dürfen nicht als Namen verwendet werden.

3. Literale (Konstanten, constant, literal)
Es gibt Literale für Ganzzahlen, Gleitpunktzahlen, Zeichen, Zeichenketten, Wahrheitswerte.

4.Operatoren
Festgelegte Zeichen, z.B.: + oder Zeichengruppen, z.B.: <<.

5.Trennzeichen (separator)
z.B.: Zwischenraum (space), Zeilenwechsel, Operatoren.


Einige Schlüsselwörter in C


auto break case char const continue default do double else enum extern float for goto if int long register return
short signed sizeof static struct switch typedef union unsigned void volatile while


Klammern


Klammern dienen in der Schriftsprache als Satzzeichen zur Gliederung der syntaktischen Form.

Benennung Zeichen Verwendungsbeispiel
Runde ( ) Berechnungsreihenfolge
Eckige [ ] Index-Operator
Geschweifte { } Blockgrenzen
Spitze < > Header
Einfache Hochkommas ' ' Zeichenliterale
Anführungszeichen (Gänsefüßchen) " " Zeichenketten



Sprachelemente


Sprachelemente (Sprachkonstrukte) sind Bestandteile eines Programms. Sie sind aus lexikalischen Einheiten gebaut und durch Syntaxregeln definiert. Es gibt zwei Arten von Sprachelementen: Datenbeschreibungen und Anweisungen.

1. Datenbeschreibungen repräsentieren Daten, welche in einem Rechner bearbeitet werden. Mit Daten sind folgende Begriffe verbunden: Wert, Variable, Konstante, Feld, Struktur, Datentyp, Operand, Verweis, Zeiger.

2. Anweisungen bestimmen, welche Aktionen ausgeführt werden, um Daten zu verarbeiten. Mit Anweisungen sind folgende Begriffe verbunden: Operatoren, Ausdrücke (Terme), Kontrollstrukturen, Aufrufe, Prozeduren, Funktionen, Blöcke.


Namen


Einige Sprachelemente werden durch Namen repräsentiert. Das sind hauptsächlich Variablen, Konstanten, Felder, Funktionen und Typen. Namen werden vom Programmierer festgelegt und mit einer Bedeutung versehen.

Einige Namenskonventionen:
1) Je mehr man von einem Namen auf seine Semantik assoziiert, desto lesbarer kann ein Programm sein.

2) Üblicherweise schreibt man Variablen-, Felder- und Funktionsnamen in Kleinbuchstaben, Konstanten und symbolische Literale dagegen in Großbuchstaben.

3) Einige Zeichen sind vorsichtig zu verwenden, weil sie können beim Lesen leicht verwechselt werden, z.B.:
  • Ziffer 0 und Buchstabe O
  • Ziffer 1 und Buchstaben l, I, J.


Kontexte


Namen können in drei verschiedenen Kontexten vorkommen:

1)Deklaration,
2)Definition und
3)Verwendung

Jeder Name muss unbedingt vor der Verwendung definiert oder mindestens deklariert werden.


Deklaration, Definition


1. Eine Deklaration führt einen Namen in ein Programm ein und gibt dem Namen eine Bedeutung, z.B. der Name sin wird für eine bestimmte Funktion reserviert.

In einem Programm können mehrere gleiche Deklarationen für einen Namen gegeben werden.

2. Eine Definition bereitet ein Sprachelement zur Verwendung vor:
  1. führt einen Namen ein (wie Deklaration),
  1. legt Speicherplatz für Daten oder Code an,
  1. beschreibt die innere Struktur eines Datentyps, aus der sich der benötigte Speicherplatz ergibt.

In einem Programm kann nur eine einzige Definition für einen Namen gegeben werden.


Beispiele für Sprachelemente


Variablendeklaration extern int a;
Variablendefinition int a;
Variablenverwendung (Speicher-Zugriff) a= 5;
Funktionsdeklaration void f();
Funktionsdefinition int f(){ return 5; }
Funktionsverwendung (Aufruf) f();



2.3. Variablendefinition


Variablendefinition


Ein zentrales Konzept in den meisten Programmiersprachen sind die Variablen.

Eine Variable ist ein Bereich im Rechnerspeicher (Behälter), deren Inhalte während des Programmlaufs verändert werden können.
Jede Variable muß definiert sein, bevor sie verwendet werden kann.

Eine Definition dient drei Zwecken:

1) Der Name und der Datentyp der Variable werden dem Compiler bekanntgegeben.
2) Der Speicherplatz wird vom Compiler reserviert.
3) Die Variable wird initialisiert, d.h. in ihrem Speicherplatz wird ein bestimmter Wert gespeichert.

Eine Variablendefinition hat die Syntax:
type name = init;


Variablendefinition. Details


1) Auch in der Mathematik spricht man von Variablen. Eine Variable bezeichnet dort aber immer einen bestimmten Wert.

2) Mehrere Definitionen dürfen aneinander gereiht werden: type name1, name2, ..., name3;

3) Variablen können bei ihrer Definition auch mit Ausdrücken initialisiert werden.

4) Im allgemeinen enthält eine uninitialisierte Variable einen zufälligen Wert.


Analogie für Variablen


Man kann sich Variablen als Behälter vorstellen. Eine Variable hat:
  • einen Namen (der Behälter ist mit einem Namensschildchen versehen) und
  • einen Wert (der Behälter hat einen Inhalt).
  • Beispiel: int laenge=25;

 (image: http://ife.erdaxo.de/uploads/ProzProg2Programmaufbau/pp16.gif)


Attribute einer Variablen


Eine Variable besitzt folgende Attribute: Wert, Typ, Adresse, Namen, Zugriffsrecht, Gültigkeitsbereich, Lebensdauer.

1. Ein Wert ist der Inhalt einer Variablen.

2. Ein Typ beschreibt die Wert- und Variableneigenschaften.

3. Eine Adresse zeigt die Position der Variable im Speicher.

4. Ein Variablenname ist ein symbolischer Verweis auf die Variable. Bei der Definition wird die entsprechende Adresse dem Variablennamen zugeordnet. Über den Variablennamen kann auf den aktuellen Wert zugegriffen werden.


Adresse


Jedes Byte im Speicher ist unter einer Adresse gespeichert. Adressen sind natürliche Zahlen. Auf einem 32-Bit-Rechner beträgt die Adressbreite 4 Byte.

Wenn eine Variable mehrere Bytes enthält, wird die Adresse der ganzen Variablen durch Adresse vom ersten Byte bestimmt. Die Adresse der Variablen kann über den so genannten Adress-Operator & ermittelt werden.

Beispiel: int a=3; cout<< &a; //0x28ff0c

⇒ Demo 2


Konstante


Eine Konstante ist ein Bereich im Rechnerspeicher (wie Variable), deren Inhalte während des Programmlaufs nicht verändert werden können. Jede Konstante muß definiert und dabei auch initialisiert sein, bevor sie verwendet werden kann.

Syntax: const type name = init;

Beispiel: const float pi=3.14;


2.4. Verwendung von Variablen


Ausdruck


Eine Variablenverwendung bzw. Zugriff bedeutet, dass den Variablenwert entweder gelesen oder ersetzt (aktualisiert) wird.

Ein Ausdruck ist eine Folge von Operatoren und Operanden, z.B.: a+4;

Wenn ein Variablenname als Operand in einem Ausdruck vorkommt, wird der Variablenwert gelesen. Dadurch wird die Variable ausgewertet.

Jeder Ausdruck hat einen Wert, der sich bei der Ausdruck- uswertung ergibt.

Anmerkung: Eine Variable muss zuerst definiert werden und nur danach verwendet werden.


Wert


Es gibt drei Orte, wo sich ein Wert zur Laufzeit befinden kann.
  1. Ein Wert kann in einer Variable im Speicher gespeichert werden.
  1. Ein Wert entsteht nach der Auswertung des Ausdruckes.
  1. Ein Literal ist ein Wert, der direkt im Ausdruck-Code liegt.


Operand


Ein Operand ist

1) ein Variablenname oder
2) ein Konstantenname oder
3) ein Literal oder
4) ein Teilausdruck oder
5) ein Funktionsaufruf.

Geschachtelte Ausdrücke werden wie in der Mathematik aus einigen Teilausdrücken in runden Klammern zusammengesetzt.

Als Operand kann ein Funktionsaufruf benutzt werden. Beispiel:
cout<< 1 + sin(3.14) / cos(3.14); //0.998407

Mathematische Funktionen sind nicht in der Sprachdefinition festgelegt und werden als Bibliothekfunktionen zur Verfügung gestellt.


Einige Funktionen aus <math.h>


Funktion Bemerkung
sin, cos, tan Sinus, Kosinus, Tangens
asin, acos Arcus sinus. Ergebnis zwischen -pi/2 und pi/2;
Arcus cosinus. Ergebnis zwischen 0 und pi;
Beide für Parameter zwischen -1 und +1,
atan Arcus tangens, Ergebnis zwischen -pi/2 und pi/2;
exp Potenz von e. exp(1) liefert die Euler'sche Zahl e
log Natürlicher Logarithmus, ln(x)
log10 Logarithmus zur Basis 10
pow Potenzfunktion
sqrt Quadratwurzel (square root)
fabs Absolutwert des Parameters



Zuweisung


Ein lesender Zugriff auf die Variable kommt in Ausdruck vor. Ein schreibender Zugriff auf die Variable kommt in der Zuweisung vor.

Mit einer Zuweisung (Wertzuweisung, assignment) wird einer Variablen ein neuer Wert zugewiesen. Ein vorher gültiger Wert wird dabei kommentarlos und ersatzlos überschrieben.

Eine Zuweisung besteht aus einer linken (das Ziel) und einer rechten Seite (die Quelle). Links muß eine Variable genannt werden, rechts kann ein beliebiger Ausdruck stehen.

Syntax: var = ausdruck;

Anmerkung: In C/C++ ist jede Zuweisung wiederum ein Ausdruck.

Eine Zuweisung läuft in zwei Schritten ab, die nacheinander ausgeführt werden:

1) der Wert des Ausdrucks auf der rechten Seite wird ausgerechnet;

2)dieser Wert wird an die Variable auf der linken Seite zugewiesen.
Beispiel: a=b+4;

Ein Variablenname spielt links und rechts des Zuweisungszeichens eine unterschiedliche Rolle. Rechts ist er Platzhalter für ihren Wert, links ist er Platzhalter für ihren Speicherort.
Beispiel: a=a+4;

Anmerkung: Die Zuweisung darf nicht mit dem mathematischen Gleichheitszeichen verwechselt werden. Mathematisch ist die Anweisung a=a+4 sinnlos.


L-Wert und R-Wert


Die Zuweisung ist asymmetrisch:

1. Links muss ein Variablenname (oder ein Verweis) stehen, die ein Ort im Speicher bezeichnet. Ein Variablenname (oder ein Verweis) wird als L-Wert bezeichnet (das "L" stammt von "links").

2. Rechts darf ein Ausdruck stehen, der sich zu einem Wert auswerten läßt. Ein Ausdruck (oder ein Wert) wird als R-Wert bezeichnet (das "R" stammt von "rechts").

3. Jeder L-Wert kann auch rechts verwendet werden, aber nicht umgekehrt.


Initialisierung und Zuweisung


Beide verwenden das Gleichheitszeichen.

Eine Initialisierung kann nur bei der Variablendefinition auftreten, z.B.:
int a=3;

Eine Zuweisung ändert (aktualisiert) eine schon vorhandene Variable, z.B.:
int a; a=3;

In C++ kann man für die Initialisierung auch andere Syntax verwenden, z.B.:
int a(3);



CategoryProzeduraleProgrammierung
Diese Seite wurde noch nicht kommentiert.
Valid XHTML :: Valid CSS: :: Powered by WikkaWiki