Version [22579]
Dies ist eine alte Version von ProzProg2Programmaufbau erstellt von RonnyGertler am 2013-03-27 15:52:48.
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;
}
//"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.:
/* . . . . .
. . . . . */
. . . . . */
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;
}
{
. . .
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:
Die Eingabe, Verarbeitung und Ausgabe sind die Anweisungen im typischen EVA-Programm:
Typisches Programm. Beispiel
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:
- Alphabet,
- Lexikalische Einheiten,
- Sprachelemente.
Syntaxhierarchie
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.
- 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:
- führt einen Namen ein (wie Deklaration),
- legt Speicherplatz für Daten oder Code an,
- 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;
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.
- Ein Wert kann in einer Variable im Speicher gespeichert werden.
- Ein Wert entsteht nach der Auswertung des Ausdruckes.
- 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 |
CategoryProzProg