Sie sind auf Seite 1von 25

WI16

Einführung in die Programmierung G-WI-INF-01

1. Semester
Programmieren mit C
08.12.2016
Begleitmaterial zur Lehrveranstaltung - Steven Müller

Dieses Material stellt eine stark verkürzte und unvollständige Übersicht der besprochenen Lehrinhalte
bereit. Es ist teilweise nur in Verbindung mit den Vorträgen, Übungen und Erläuterungen zur
Lehrveranstaltung sinnvoll und sollte durch eigene Notizen ergänzt und korrigiert werden.

Zwar wurde das Begleitmaterial hinreichend geprüft, ein Korrektheitsanspruch ist hiermit jedoch
ausdrücklich nicht verbunden. Fehler in Text, Abbildungen, Tabellen oder Quellcodebeispielen sind
nicht ausgeschlossen. Betrachten Sie dieses Material daher lediglich als Ergänzung zur Vorlesung.

Inhalt
1 Softwareentwicklung vs. Programmierung
1.1 Kleiner Einblick in die Softwareentwicklung
1.1.1 Entstehung von Software
1.1.2 Begriff der Softwareentwicklung
1.1.3 Softwarelebenszyklus
1.2 Programmieren im Großen und im Kleinen
1.2.1 Programmieren im Großen
1.2.2 Programmieren im Kleinen
1.3 Übersicht Programmierkonzepte und -paradigmen
1.3.1 Hauptparadigmen
1.3.2 Weiterführende Paradigmen
1.4 Einordnung in den Kontext der Lehrveranstaltung

2 Prozedurale Algorithmierung
2.1 Begriffe und Eigenschaften eines Algorithmus
2.1.1 Einführung zentraler Begriffe
2.1.2 Eigenschaften eines wohlstrukturierten Algorithmus
2.2 Darstellungsmittel für Algorithmen
2.2.1 Pseudocode
2.2.2 Programmablaufplan (PAP)
2.2.3 Nassi-Shneiderman-Diagramm - DIN 66261
2.3 Grundelemente und Strukturen
2.3.1 Allgemeine Elementkategorien
2.3.2 Unstrukturierte und strukturierte Datentypen
2.3.3 Darstellung von Datentypen
2.3.4 Strukturen zur Ablaufsteuerung eines Algorithmus
2.3.5 Dialoge zur Mensch-Maschine-Interaktion
2.3.6 Fehlertoleranz der Benutzerschnittstelle
2.4 Vorgehensweise Analyse und Entwurf eines Algorithmus
2.4.1 Analyse und Spezifikation
2.4.2 Prinzipen der Konstruktion von Algorithmen

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 1
3 Programmiersprachen und Programmieren
3.1 Computer Linguistik
3.1.1 Relevanz und Anforderungen an eine Programmiersprache
3.1.2 Generationen und Arten von Programmiersprachen
3.1.3 Strukturebenen einer Programmiersprache
3.1.4 Kompilierende und interpretierende Implementation
3.2 Möglichkeiten zur Darstellung der Syntax (Metaebene)
3.2.1 Syntaxgraph Notation
3.2.2 Erweitere Backus-Naur-Form
3.3 Ausgewählte Aspekte zum Programmierstil
3.3.1 Ziel und Methoden
3.3.2 Gestaltung und Strukturierung des Quelltextes
3.3.3 Bezeichner
3.3.4 Globale und lokale Variablen
3.3.5 Zentrale Entwurfsmuster in C

4 Die Programmiersprache C
4.1 Überblick und Hintergrund C
4.1.1 Ursprung, praktische Bedeutung und Nutzungsfeld von C
4.1.2 Einordnung weiterer C Sprachen
4.2 Funktionsweise, Struktur und grundlegende Syntax
4.2.1 Programmiertechnische Charakteristik
4.2.2 Grundstruktur
4.3 Integrierte Entwicklungsumgebung
4.3.1 Bestandteile und Programmierwerkzeug einer IDE
4.3.2 Hintergrund und Installation Code Blocks::

5 Einführung in die Programmierung mit C


5.1 Elementare Datentypen und Variablen
5.1.1 Elementare Datentypen
5.1.2 Variablen
5.1.3 Symbolische Konstanten
5.1.4 Definition, Deklaration und Initialisierung
5.2 Ausdrücke und Operatoren
5.2.1 Ausdrücke
5.2.2 Unäre Operatoren
5.2.3 Binäre Operatoren
5.2.4 Ternäre Operatoren
5.2.5 Priorität von Operatoren
5.2.6 Höhere Rechenoperationen
5.3 Anweisungen
5.3.1 Einfache Anweisungen
5.3.2 Verbundanweisungen
5.4 Ablaufsteuerung, Schleifen
5.4.1 Auswahl und Verzweigung
5.4.2 Wiederholungsanweisung – Iterationen, Schleifen
5.4.3 Sprunganweisungen
5.5 Strukturierte Datentypen
5.5.1 Feldtypen
5.5.2 Strukturierte Typen
5.5.3 Unions - Vereinigungstyp
5.5.4 Typdefinitionen
5.6 Zeigervariablen
5.6.1 Deklaration von Zeigervariablen
5.6.2 Referenzierung und Dereferenzierung
5.6.3 Beziehungen zwischen Feldern und Zeigern
5.6.4 Zeigerarithmetik
5.6.5 Zeiger auf Strukturen
5.7 Funktionen
5.7.1 Funktionen und prozedurales Paradigma
5.7.2 Funktionsdeklaration und Prototypen
5.7.3 Funktionsdefinitionen
5.7.4 Funktionsaufruf
5.7.5 Parameterübergabe an Funktionen
5.7.6 Deklaration und Definition in einer Headerdatei
5.8 Speicherklassen
5.8.1 Die Speicherklassse extern
5.8.2 Die Speicherklasse static
5.8.3 Die Speicherklasse auto
5.8.4 Die Speicherklasse register

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 2
Literatur
• [1] RRZN: „ANSI C – Programmierung“

• [2] RRZN: „Die Programmiersprache C. Ein Nachschlagewerk“

• [3] Horn, C.; Kerner, I. O.: „Lehr- und Übungsbuch Informatik - Grundlagen und Überblick“ Band
1 Fachbuchverlag Leipzig

• [4] Horn, C.; Kerner, I. O.: „Lehr- und Übungsbuch Informatik - Praktische Informatik“ Band 3
Fachbuchverlag Leipzig

• [5] Zuser, Grechenig, Köhle: „Software Engineering“ Pearson Studium, München

• [6] Watt: „Programmiersprachen“ Hanser Verlag, München

• [7] Ehses: „Algorithmen und Programmierung“, FH Köln

• [8] Gaicher: „Programmieren in C“, tredition, Hamburg

• [9] Herglotz: „Das Einsteigerseminar C“, bhv, Neuss

• [10] Zuse: „Geschichte der Programmiersprachen“, TU Berlin

• [11] Fischer: „Programmieren mit C“, Technik Verlag Berlin

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 3
1 Softwareentwicklung vs. Programmierung
Dieses Kapitel soll helfen das Thema der LV „Einführung in Programmierung“ grob in den Kontext des
Softwareentwicklungsprozesses einordnen zu können. Es wird vorausgesetzt, dass der Begriff Software
und diesbezügliche Unterscheidungen, wie bspw. zwischen System- und Anwendungssoftware
hinreichend bekannt sind.

1.1 Kleiner Einblick in die Softwareentwicklung

1.1.1 Entstehung von Software

Softwaresysteme sind Produkte außerordentlicher hoher Komplexität. Bei der Erstellung komplexer
Softwaresysteme, an denen mehrere Entwickler beteiligt sind und die hunderte Einzelfunktionen
aufweisen, ist diese Vorgehensweise nicht zielführend. Vielmehr muss der Herstellungsprozess
organisiert werden. (vgl. [5], S. 30).

Wie wird Software hergestellt?

1. Methodisches Vorgehen: WAS hat WANN mit WELCHEN Techniken zu geschehen?

2. Techniken: WIE hat etwas zu geschehen?

3. Werkzeug: WOMIT hat etwas zu geschehen?

1.1.2 Begriff der Softwareentwicklung

Softwareentwicklung bezeichnet allgemein Methoden und Techniken zur Herstellung von Software.
Diese Methoden und Werkzeuge sind oftmals noch unzureichend. Dies resultiert letztlich daraus, dass
Softwareentwicklung eine relativ junge Ingenieursdisziplin ist.

Das Ziel der Softwareentwicklung besteht darin, ein korrektes, effizientes und verständliches System
zu entwickeln, das als Basis für spätere Weiterentwicklung brauchbar ist (vgl. [7], S.5).

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 4
Historischer Hintergrund Softwareentwicklung:

Anfangs war Programmieren Handwerk. Das heißt talentierte Amateure (Physiker, Mathematiker,
Maschinenbauer) erstellen Programme als spezielle Werkzeuge für eine einzelne Aufgabe.

Mitte der 1960er bis 70er war der Begriff Softwarekrise gegenwärtig, der sich auf die nicht ändernde
schlechte Qualität der erzeugten Software-Systeme bezog.

1967 wurde von einer Forschungsgruppe der NATO der Begriff Software Engineering gebildet (vgl. [5],
S. 22). Software Engineering beschreibt den Prozess einer professionellen ingenieurtechnischen
Softwareentwicklung zur Herstellung von Software-Systemen als Industrieprodukt.

Die Wissenschaft Software Engineering (SE) thematisiert die Entwicklung geeigneter Methoden und
Vorgehensmodelle für die Projektarbeit im Rahmen der Softwareentwicklung (vgl. [5], S. 23).

Software Engineering ist gekennzeichnet durch geplantes, systematisches Vorgehen bei den Prozessen
der Softwareentwicklung. Primäres Ziel ist die wirtschaftliche Produktion qualitativ hochwertiger
Software im Rahmen eines Projektes (vgl. [4], S. 45).

Darüber hinaus ermöglicht dies die Lösung der Problemlage: Trennung zwischen Auftraggeber und
Entwickler (detailliert [4], S. 43ff.).

Ein weiteres Merkmal in Softwareprojekten ist die Heterogenität des erforderlichen Personals. Daraus
resultiert ein hoher Kommunikations- und Koordinationsaufwand, worunter die Produktivität leidet.
SE bietet Lösungsansätze für eine arbeitsteilige Entwicklung in Softwareprojekten. Dementsprechend
entwickeln Systemanalytiker (genaue Anforderungen an die Software), Entwickler (Entwurf der
Softwarearchitektur), GUI-Designer (Usability), Programmierer etc. Darüber hinaus werden auch
Fachleute benötigt, die für die inhaltlichen Anforderungen verantwortlich sind. Häufig sind bereits in
der Entwicklungsphase spätere Benutzer und Benutzerinnen des Produktes involviert, um deren
künftige Akzeptanz zu gewährleisten.

Trotz fortgeschrittener Lösungsansätze in der SE werden die Planungs- und Managementprobleme


immer noch nicht zufriedenstellend beherrscht. Letztlich werden die Fortschritte in der
Softwaretechnik durch zunehmende Anforderungen an Umfang und Funktionalität der Software
infrage gestellt. Darüber hinaus gibt es aber auch zu wenige qualifizierte Entwickler (vgl. [7], S.7).

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 5
1.1.3 Softwarelebenszyklus

Softwareentwicklungsprozesse sind iterativ, das heißt sie basieren auf einem fortlaufenden
evolutionären Prozess (vgl. später Vorgehensmodelle).

Grundsätzliche Entwicklungsprozesse sind:

• Analyse (Anforderungsspezifikation),
• Entwurf (Modellierung)
• Implementierung (Programmierung und Test)
• Wartung (Anpassungen, Fehlerbeseitigung)

Das entstehende Softwareprodukt ist kein statisches Endprodukt sondern unterliegt ebenfalls einem
evolutionären Prozess, der Softwarelebenszyklus genannt wird.

Der Softwarelebenszyklus ist ein Modell für alle Aktivitäten während der Existenz einer Software.

Die Evolution einer Software beginnt mit der völligen Neuentwicklung (Forward Engineering) und setzt
sich mit der Anpassung und Übernahme vorhandener Komponenten einer Lösung im Reengineering
fort (ausführlich hierzu [3], S. 46 ff. und [4], S. 248 ff.).

1.2 Programmieren im Großen und im Kleinen

Entsprechend der Komplexität der zu lösenden Problemstellung sind unterschiedliche Methoden für
die Entwicklung von Software einzusetzen. Die Softwaretechnik teilt diesbezügliche Methoden in zwei
Bereiche: in die Programmierung im Großen und in Programmierung im Kleinen.

1.2.1 Programmieren im Großen

Programmieren im Großen bezieht sich auf die Entwicklung von Programmen zu Problemen sehr hoher
Komplexität. Grundprinzip ist die Zerlegung des Gesamtproblems in überschaubare Teile.

Diese Zerlegung orientiert sich beim Programmieren im Großen an den Elementen (Daten, Objekte)
des Problembereichs. Die Datenstrukturen sowie Prozeduren zum Zugriff und zur Manipulation der
Daten werden in Komponenten (Module, Klassen) zusammengefasst. Diese werden strukturiert
zusammengesetzt und bilden die sogenannte Architektur des Softwaresystems.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 6
1.2.2 Programmieren im Kleinen

Unter Programmierung im Kleinen sind Methoden zu verstehen, die Erstellen von Programmen
geringerer Komplexität nötig sind. Ziel ist die Entwicklung korrekter und effizienter
Softwarefunktionen. Bei der Programmierung im Kleinen richtet sich die Zerlegung daher an den
einzelnen Funktionalitäten des Programms aus.

Diese sind für das Gelingen großer Projekte nicht von zentraler Bedeutung wie etwa die Aspekte der
Programmierung im Großen. Dennoch ist die Bedeutung der Programmierung im Kleinen nicht
unerheblich. Programmierfehler werden im Kleinen gemacht! Viele Systemüberlegungen lassen sich
nicht verstehen, wenn man nicht vorher eine solide Grundlage erworben hat.

Die zentrale Aufgabe der Programmierung im Kleinen ist der Entwurf eines Lösungsalgorithmus. Das
Problem wird sukzessive in Teilprobleme zerlegt, und die dazu jeweils gefundenen Teillösungen
werden schließlich zur Gesamtlösung zusammengesetzt. Bausteine des Programmierens im Kleinen
sind Prozeduren. Dementsprechend wird auch von prozeduraler Zerlegung Gesprochen.

Die Methoden und Vorgehensweise der Programmierung im Kleinen werden im Abschnitt 2


besprochen.

1.3 Übersicht Programmierkonzepte und -paradigmen

1.3.1 Hauptparadigmen

Die Eigenschaften jeder Programmiersprache und die Methoden Programme zu entwickeln, werden
durch die zu Grunde liegenden Paradigmen entscheidend geprägt. Diese unterscheiden sich
hinsichtlich ihrer Konzepte zur Repräsentation dynamischer und statischer Elemente und in der
methodischen Herangehensweise zur Strukturierung des Quellcodes.

Um eine Programmiersprache effektiv zur Entwicklung wohlstrukturierter Programme einsetzen zu


können, ist ein grundlegendes Verständnis des jeweiligen Sprachkonzeptes notwendig. Ebenfalls
erforderlich ist dieses Verständnis wenn zu entscheiden ist welche Programmiersprache zum Lösen
eines gegebenen Problems am besten geeignet ist (ausführlich [6], S.2 ff.).

Paradigma heißt grundsätzliche Denkweise, Lehrmeinung.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 7
Programmierparadigmen bezeichnen Prinzipien, mit denen die Ausführung von Programmen
beschrieben wird. Die zwei Hauptparadigmen, die als Grundlage für alle weiteren Verfeinerungen
dienen, sind die imperative Programmierung und die deklarative Programmierung.

Zu unterscheiden sind zwei elementare Programmierparadigmen:

• Imperative Programmierung

Programme werden als verzweigte Folgen von Anweisungen (Befehlen) formuliert. Diese
enthalten Zuweisungen, die bei ihrer Ausführung Werte von Variablen und damit den
Programmzustand verändern (Berechnungen). Verzweigungen im Programm werden durch
Bedingungen über Variable entschieden. Parametrisierte Funktionen werden verwendet, um
Berechnungen zu abstrahieren und an verschiedenen Stellen im Programm aufzurufen.

• Deklarative Programmierung

Im Gegensatz zum imperativen Paradigma beschreiben deklarative Programme nicht welche


Befehle ausgeführt werden sollen, sondern welches Ergebnis resultieren werden soll. Es bleibt
dem Programm überlassen, sich mit Hilfe entsprechender Algorithmen den korrekten
Lösungsweg zu suchen.

1.3.2 Weiterführende Paradigmen

Programmier-
paradigmen

Imperative Deklarative
Konzepte Konzepte

Prozedurales Objektorientiertes Funktionales Logisches


Paradigma Paradigma Paradigma Paradigma

Abbildung 1: Ausgewählte Programmierparadigmen

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 8
Prozedurale Programmierung

Bei der prozeduralen Programmierung wird die Gesamtaufgabe, die eine Software lösen soll, in
kleinere Teilprobleme zerlegt. Die bei der Aufgabenlösung entstehenden Programm-Module werden
Prozeduren bzw. Funktionen genannt.

Diese Teilaufgaben sind einfacher zu beschreiben, programmieren und testen. Der Quellcode
wiederverwendbar und universell implementiert werden. Prozeduren und Funktionen lassen sich zu
Bibliotheken zusammenfassen, die dann verteilt und in beliebig viele andere Programme eingebunden
werden können.

Praktisch alle imperativen Programmiersprachen beinhalten den prozeduralen Ansatz.

Objektorientierte Programmierung

Bei der objektorientierten Methodik erfolgt die Modularisierung dadurch, dass die charakteristischen
Elemente des Anwendungsgebietes sowie ihre Eigenschaften, Verhaltensweisen und Beziehungen
modelliert werden.

Daten und Funktionen werden zu Objekten zusammengefasst. Diese Objekte können auf vielfältige
Weise miteinander in Verbindung stehen, indem sie gegenseitig ihre Methoden aufrufen oder ein
Objekt andere Objekte enthält. So bilden die Objekte einer Software ein sehr flexibles Gesamtsystem.

Im Detail gilt es zwischen objektbasierter und objektorientierter Programmierung zu differenzieren.


Diese Themen werden im Modul Softwaretechnik intensiver betrachtet. (ausf. [5] S. 59, [6] S.232)

Funktionale Programmierung

In einem funktionalen Programm wird die Reihenfolge der Berechnungsschritte in der Regel nicht
festgelegt. Die Grundelemente der funktionalen Programmierung sind rekursive Funktionen und deren
Aufrufe. Berechnungen werden als Auswertung mathematischer Funktionen verstanden.

Funktionale Programmiersprachen erlauben es Funktionen (wie Daten) als Argumente und


Rückgabewerte anderer Funktionen zu behandeln. Dadurch ist es einfach Operatoren auf Funktionen
zu definieren. (weiterführend [3] S.201, [6] S.251)

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 9
Logische Programmierung

Die logische Programmierung basiert auf der Prädikatenlogik. Ein logisches Programm kann als Folge
von prädikatenlogischen Formeln verstanden werden. Um eine Aufgabe zu lösen, beschreibt man
Eigenschaften, die eine Lösung erfüllen muss, statt einen Rechenweg, der eine Lösung findet.

(weiterführend [6] S.275)

1.4 Einordnung in den Kontext der Lehrveranstaltung

Im Rahmen der Lehrveranstaltung erfolgt eine Einführung in die Programmierung im Kleinen.

Das heißt die Entwicklung und Implementierung prozeduraler Algorithmen steht im Vordergrund.
Diesbezüglich werden Vorgehensweisen zur prozeduraler Lösungsalgorithmen und entsprechender
prozeduraler Zerlegung in Teillösungen besprochen.

Basierend auf dem Paradigma der prozedurale Programmierung werden elementare Sprachkonstrukte
wie Syntaxbeschreibung, Typen, Operatoren, Ablaufsteuerung am Beispiel der Sprache C vorgestellt
und mit Programmierübungen gefestigt.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 10
2 Prozedurale Algorithmierung

2.1 Begriffe und Eigenschaften eines Algorithmus

2.1.1 Einführung zentraler Begriffe

Algorithmierung

Die Entwicklung eines allgemeinen Lösungsplans, der festlegt wie man schrittweise von der
Aufgabenstellung zur Lösung kommt, heißt Algorithmierung. Der Lösungsplan soll generisch sein und
heißt Algorithmus (vgl. [3], S.143).

Algorithmus

Ein Algorithmus ist folglich eine vollständige Vorschrift zur Durchführung von Operationen in endlich
vielen Schritten.

Programmierung

Formulierung des Algorithmus in einer für eine Maschine interpretierbaren Sprache. Programmierung
ist der Prozess der Umsetzung einer algorithmischen Idee in eine formale Sprache (vgl. [3], S.143).

Prozeduraler Algorithmus

Ansatz der prozeduralen Programmierung ist es, einen Algorithmus in überschaubare generische Teile
(Module) zu zerlegen. Im Wesentlichen werden hierbei Eingabeinformationen in einem System von
Regeln in Ausgabeinformationen übertragen (vgl. [3], S.143).

Module

Module sind schließlich Programmbausteine, die separat entwickelt und getestet werden können. Ein
Modul stellt ein Algorithmus als verfügbare Handlung für ein Teilprogramm zur Verfügung.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 11
2.1.2 Eigenschaften eines wohlstrukturierten Algorithmus

Die wichtigsten Eigenschaften prozeduraler Algorithmen sind:

Terminierung Determiniertheit

Finitheit Algorithmus Komplexität

Korrecktheit

Abbildung 2: Eigenschaften eines Algorithmus

Finitheit

Statische Finitheit: Umfang des Quelltextes ist endlich.

Dynamische Finitheit: Begrenzung der erforderlichen Ressourcen (Speicherplatz, Rechenkapazität).

Terminierung

Algorithmus soll berechenbar sein. Die Berechenbarkeit soll universell sein.

Determiniertheit

Ausgabewerte sind eindeutig durch die Eingabewerte bestimmt.

Korrektheit:

Ein Fehler heißt Bug. Die Fehlersuche heißt Debugging.

Komplexität

Für die Berechnung erforderliche Aufwand an Rechenzeit und Speicherplatz.

Zeitkomplexität: Die Bewertung von Algorithmen erfolgt durch die so genannten Zeitkomplexität T(n),
d.h. die Rechenzeit T(n) in Abhängigkeit von der Zahl n der bearbeitenden Datenelemente.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 12
Abbildung 3: Zeitkomplexität

2.2 Darstellungsmittel für Algorithmen

Es existieren verschiedene darstellerische Mittel um einen Algorithmus zu beschreiben. Zunächst


helfen tabellarische Übersichten, EVA-Tabellen und Druckbildentwürfe / Bildschirmlayout zur näheren
Beschreibung der Problemstellung.

Die Entwicklung des Algorithmus beginnt mit einer Strukturierung oder Modularisierung der
Lösungsidee in abgegrenzte Blöcke. Die Darstellung des Algorithmus kann im Wesentlichen mittels
Pseudocode, PAP und Struktogramm erfolgen.

2.2.1 Pseudocode

Im Pseudocode wird die logische Folge der einzelnen Schritte durch Verwendung formalisierter Worte
deutlich gemacht.

<Wiederhole solange bis> <Bedingung> erfüllt

<Wenn> <Bedingung> <dann> …<andernfalls>

2.2.2 Programmablaufplan (PAP)

Mittels grafischer Symbole wird die logische Folge der einzelnen Arbeitsschritte des Algorithmus
dargestellt.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 13
Abbildung 4: Elemente Programmablaufplan

2.2.3 Nassi-Shneiderman-Diagramm

Darstellung des Algorithmus mittels Struktogramm.

Strukturblöcke haben folgende Eigenschaften:

• inhaltlich zusammenhängende Lösungsschritte werden zusammengefasst

• Beziehungen zwischen Strukturblöcken sind entweder völlig unabhängig oder völlig abhängig.
Eine teilweise Überlappung von Blöcken ist nicht möglich.

• Jeder Strukturblock hat genau einen Eingang und einen Ausgang

• Jeder Block kann benutzt werden ohne genaue Kenntnis seiner internen Realisierung, nur mit
Kenntnis der Funktion und Bereitstellung der benötigten Eingangsinformationen.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 14
Abbildung 5: Elemente Struktogramm

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 15
2.3 Grundelemente und Strukturen

2.3.1 Allgemeine Elementkategorien

Zur Implementation von Algorithmen stellen imperative Programmiersprachen u.a.


Ausdrucksmöglichkeiten für folgende Kategorien bereit:

• Datentypen
• Operatoren
• Kontrollstrukturen
• Variablen

Die einzelnen Programmiersprachen unterscheiden sich im Wesentlichen in den verfügbaren


Datentypen und in der Vielfalt und im Abstraktionsgrand der Operatoren.

Nachfolgend werden grundsätzliche Datentypen und allgemeingültige Strukturelemente zur


Ablaufsteuerung und Dialogführung besprochen.

C-spezifische Datentypen, Operatoren und Variablen werden im Kapitel 5 eingeführt.

2.3.2 Unstrukturierte und strukturierte Datentypen

Informationen und Datenobjekte mit denen ein prozedurales Programm arbeiten kann lassen sich in
elementare (unstrukturierte) Typen und in komplexe (strukturierte) Typen unterteilen.

Unstrukturierte Datentypen

Zahl:

Zeichenkette:

Logische Werte:

Konstante:

Adresse:

Index:

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 16
Strukturierte Datentypen

Strukturierte Datentypen entstehen durch die Zusammenfassung von Repräsentanten einfacher


Datentypen (vgl. [3], S. 203).

Feld:

Matrix:

Liste:

Datensatz:

Baum:

Datei:

2.3.3 Darstellung von Datentypen

In Abhängigkeit der Bitbreite und der Kodierung ergibt sich für jeden Typ ein begrenzter Wertebereich.

Wertebereiche für Ganzzahl

Als grundlegender arithmetischer Datentyp sind Integer in nahezu jeder Programmiersprache


verfügbar. In vielen Sprachen werden verschiedene Integer-Arten bereitgestellt, die sich in der
Darstellung, der Länge oder dem Vorhandensein eines Vorzeichens unterscheiden.

C Datentyp Byte bit Zahlenbereich


unsigned char 0 .. 256
unsigned int 0 .. 65.535
unsigned long 0 .. 4.294.967.295
char -128 .. 127
int -32.768 .. 32.767
long -2.147.483.648 .. 2.147.483.647
Tabelle 1: Wertebereich Ganzzahl

Wertebereiche für Fließkommazahlen

Die Repräsentation reeller Zahlen ist aufwändiger und unterliegt Beschränkungen. Es existieren
verschiedene Lösungsansätze um reelle Zahlen auf Rechenmaschinen (seit Abakus) abzubilden. Für
diese gilt, dass deren Wertebereiche im Gegensatz zur reellen Zahl praktisch endlich sind.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 17
Festkommazahlen bestehen aus einer festen Anzahl von Ziffern. Die Position des Kommas ist fest
vorgegeben.

Eine weitere Möglichkeit sind Fließkommazahlen, die eine approximative Darstellung einer reellen
Zahl realisieren.

Die Berechnung mit Fließkommazahlen ist aufwendiger als mit Festkommazahlen, dafür ist der
Wertebereich von Fließkommazahlen bei gleichem Speicheraufwand größer (auch in [3] S. 202).

Darstellung Fließkommazahl

Bei einer Fließkommazahl muss eine Information zur Position des Kommas mitgespeichert werden.

Mathematisch erfolgt die Repräsentation daher mit zwei Werten in Expotentialschreibweise:

±
ℎ =± (z.B. 13.000.000 = 1,3 ∙ 10 )

Bsp. Festlegung beim IEEE 754 (Standard for Floating-Point Arithmetic) existiert für den Typ Single
folgender Wertebereich:

C Datentyp Bit m Genauigkeit e Zahlenbereich


float 32 23 bit 7 Dezimalstellen 8 bit 1,7 ∙ 10 . . 3,4 ∙ 10
Tabelle 2: Wertebereich Fließkommazahl

Wertebereiche für Zeichen

Es sind verschiedene Zeichensätze gebräuchlich, wie bspw. ASCII oder Unicode. Die Zeichen selbst
werden über einen Ganzzahlwert repräsentiert, der entsprechend des zugeordneten Zeichensatzes ein
bestimmtes Zeichen darstellt.

ASCII American Standard Code for Information Interchange

C Datentyp Zeichensatz bit Zeichen


char ASCII 7 127
char ISO 8859-2 8 256
Tabelle 3: Wertebereich Zeichen

ISO 8859-2 umfasst ergänzend zum ASCII-Zeichensatz eine Erweiterung um bestimmte Zeichen
mitteleuropäischer Sprachen, wie Deutsch.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 18
2.3.4 Strukturen zur Ablaufsteuerung eines Algorithmus

Wie in 2.2.3 dargelegt wurde, liegt der strukturierten Programmierung das Blockkonzept auf Basis der
drei Kontrollstrukturen Sequenz, Iteration und Alternative zu Grunde. Kontrollstrukturen bestimmen
die Reihenfolge und Häufigkeit der Ausführung von Aktionen in einem Algorithmus (ausführlich in [3]
S. 148 ff.). Diese werden im Folgenden betrachtet.

Sequenz

Eine Sequenz besteht aus einer Anzahl von Verarbeitungen, die nacheinander durchlaufen werden. Die
Sequenz repräsentiert eine einfache Reihung von Anweisungen oder Blöcken, die als
Verarbeitungsblock zusammengefasst ist. Damit stellt die Sequenz ein wesentliches Hilfsmittel für die
hierarchische Strukturierung von Abläufen dar (siehe [3] S. 149).

Auswahl / Alternative

Die einfache Auswahl oder Selektion beschreibt die bedingte Durchführung von Strukturblöcken in
Abhängigkeit von Bedingungen. Unterscheidbar sind bedingte Verarbeitung und einfache Alternative.

Fallauswahl

Die Fallauswahl ist eine Mehrfachalternative und erlaubt in einem einzigen Konstrukt bei mehreren
Bedingungen genau die Durchführung des zu dieser Bedingung gehörenden Strukturblocks.

Iteration (Wiederholung)

Bei einer Iteration wird in Abhängigkeit von einer bestimmten Bedingung ein gewisser Strukturblock
mehrfach ausgeführt, wobei die steuernden Parameter sich ändern müssen.

Es werden vier Grundformen der Wiederholung unterschieden:

• Wiederholung mit vorausgehender Bedingungsprüfung (kopfgesteuert)

• Wiederholung in Abhängigkeit von einer Zählvariablen

• Wiederholung mit nachfolgender Bedingungsprüfung (fußgesteuert)

• Wiederholung ohne Bedingungsprüfung (Endlosschleife)

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 19
Wiederholung mit vorausgehender Bedingungsprüfung

Wird auch als abweisende oder kopfgesteuerte Iteration oder Schleife bezeichnet. Wenn die
Eintrittsbedingung bereits bei der ersten Überprüfung nicht erfüllt ist, wird der Strukturblock niemals
ausgeführt.

Wiederholung mit nachfolgender Bedingungsprüfung

Hier wird zunächst der Strukturblock ausgeführt und erst danach eine Bedingung abgeprüft. Im
Gegensatz zu oben muss die Schleife mindestens einmal durchlaufen werden. Sie wird beendet, wenn
die Abbruchbedingung das erste Mal den Wert „wahr“ annimmt oder die Wiederholungsbedienung
nicht erfüllt ist (Wert „falsch“).

Wiederholung ohne Bedingungsprüfung

Hier wird die Bedingung ohne veränderliche Parameter formuliert und es entsteht faktisch eine
Endlosschleife. Die meisten Programmiersprachen verfügen darüber hinaus über Befehle, dass sich die
Möglichkeit ergibt im Strukturblock die Schleife abzubrechen (exit) oder an den Beginn der Schleife
zurückzukehren (loop).

2.3.5 Dialoge zur Mensch-Maschine-Interaktion

Anwender kommunizieren mit den von ihnen genutzten Computersystemen. Dazu existieren
heutzutage vielfältige Möglichkeiten, die sehr stark vom System und Anwendungskontext abhängen.

In ISO 9241 werden Richtlinien der Mensch-Computer-Interaktion beschrieben. Die Normenreihe trägt
Titel Ergonomie der Mensch-System-Interaktion.

Der Teil 110 der DIN EN ISO 9241 beschreibt folgende Grundsätze für die Gestaltung und Bewertung
einer Schnittstelle zwischen Benutzer und System (Dialoggestaltung):

• Aufgabenangemessenheit
• Selbstbeschreibungsfähigkeit
• Lernförderlichkeit
• Steuerbarkeit
• Erwartungskonformität
• Individualisierbarkeit
• Fehlertoleranz

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 20
Im Kontext dieser LV werden vor allem Konsolenanwendungen entwickelt, für die folgende Dialogarten
relevant sein können:

Mensch Dialogform Maschine

Opponent - Frage-Antwort-Dialog Proponent


(trifft Auswahl oder Antwort) - Menüdialog (stellt Frage, Menü-Angebot
- Formulardialog oder Formular)

Proponent - Kommandotechnik Opponent


(Kommando) (Reaktion)

Proponent - Auskunftssystem Opponent


(stellt Fragen) - Query-System (antwortet)

Tabelle 4: Dialogarten

Verdeutlichung der Dialoge am Beispiel Volumenberechnung aus Übung 2.3

Abbildung 6: Gestaltung Menüdialog Konsole

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 21
Abbildung 7: Gestaltung Frage-Antwort-Dialog Konsole

Abbildung 8: Gestaltung Formulardialog Konsole

2.3.6 Fehlertoleranz der Benutzerschnittstelle

Bei der Entwicklung der Benutzerschnittstelle ist der Lösungsalgorithmus so zu gestalten, dass die
Funktionsweise des Programms auch bei unvorhergesehene Eingaben des Nutzers aufrechterhalten
wird. Es existieren verschiedene Stufen der Fehlertoleranz, die im Rahmen dieser LV jedoch nicht
weiter betrachtet werden.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 22
Im Kontext dieser Lehrveranstaltung zielt die Fehlertoleranz der Benutzerschnittstelle darauf, eine
korrekte bzw. definierte Programmausführung trotz fehlerhafter Eingaben zu realisieren sowie dem
Benutzer geeignete Korrekturunterstützung mit geringen Korrekturaufwand bei Fehleingaben zu
ermöglichen.

Entsprechend der Grundsätze der Dialoggestaltung nach ISO 9241-110 sind u.a. anzustreben:

• Unterstützung bei der Vermeidung von Eingabefehlern (Plausibilisierung)


• Keine Systemabbrüche oder undefinierten Systemzustände
• Fehlererläuterungen zu Korrekturzwecken
• Zusätzliche Erläuterungen auf Anforderung
• Prüfung und Bestätigung vor Ausführung

2.4 Vorgehensweise Analyse und Entwurf eines Algorithmus

Dieser Abschnitt beschreibt rudimentär elementare Vorgehensweisen die zur Entwicklung eines
Algorithmus erforderlich sind. Eine ausführliche Bearbeitung der Themen Analyse und Entwurf erfolgt
im Rahmen des Moduls Software Engineering.

2.4.1 Analyse und Spezifikation

Analyse

1. Anforderungen aus Sicht des Nutzers formulieren.

2. Überlegungen zur Einordnung in die organisatorische Umgebung

• Datenanalyse

• Prozessanalyse

• Kommunikationsanalyse, Organisationsanalyse, Benutzeranalyse

Spezifikation

Die Spezifikation ist eine Präzisierung der Analyseergebnisse und führt schließlich zu einer
verbindlichen Vereinbarung von Anforderungen zwischen Auftraggeber und Entwickler.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 23
EVA – Struktur (Eingabe-Verarbeitung-Ausgabe)

Was ist einzugeben?

Symbol Bedeutung Wertebereich Datentyp Maßeinheit


Höhe Zylinder
Durchmesser Zylinder
Zahl PI
Tabelle 5: Beispiel Eingabedaten Volumenberechnung

Was soll verarbeitet werden?

= ∙ ∙ℎ = ∙ 0,1 ∙ 0,1 = 7,85! "# = ∙ 100 ∙ 100 = 785.399!

Was soll ausgegeben werden?

Symbol Bedeutung Wertebereich Datentyp Maßeinheit


Fassungsvermögen
Tabelle 6: Beispiel Ausgabeinformationen Volumenberechnung

Zur Strukturierung der Eingabe-Verarbeitung-Ausgabe wird eine so genannte EVA-Tabelle verwendet.

Eingabe Verarbeitung Ausgabe

Tabelle 7: Beispiel EVA Volumenberechnung

2.4.2 Prinzipen der Konstruktion von Algorithmen

Folgende Prinzipien gemeinsam führen zur strukturierten Programmierung und sind neben anderem
Ausdruck des „defensiven Ansatzes“ der Softwaretechnologie. Dieser Ansatz soll die Verständlichkeit
des Quelltextes für Dritte erleichtern und so die Wartbarkeit verbessern. So gilt nicht der kompakteste
und so am schwersten lesbare Programmcode als der Beste, sondern derjenige mit der größten
Übersichtlichkeit

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 24
1. Prinzip: Top-Down-Entwicklung und schrittweise Verfeinerung

Schrittweise Verfeinerung

Top-Down-Entwicklung

Abbildung 9: Top-Down-Entwicklung

2. Prinzip: der beschränkten Ablaufsteuerung

Schlechte Erfahrungen mit zu liberalen Programmiermethoden haben zu schlecht wartbaren, weil


unübersichtlichen Programmen geführt. Durch Programmierdisziplin, wie Verzicht auf Sprungstellen
und die Nutzung einer minimalen Anzahl von Strukturen zur Ablaufsteuerung eines Programms, kann
diese Situation erheblich verbessert werden.

Steven Müller Einführung in die Programmierung Stand: 08.12.2016


Begleitmaterial WI16 Programmieren mit C Seite 25

Das könnte Ihnen auch gefallen