% http://mason.wiwi.uni-bielefeld.de/einfinf/1.php
%


\documentclass[10pt]{article}
\usepackage{a4}
\input{/home/wiwi/pwolf/TEX/texinput/uml-ok.tex}
%\input{/texinput/uml-ok.tex}
\usepackage{verbatim}
\oddsidemargin0mm
\textwidth16cm
\textheight24cm
\topmargin0mm
\parindent0mm
\newcounter{myfigno}\newcommand{\myfig}[1]{\addtocounter{myfigno}{1}
	\begin{center} Abbildung \arabic{myfigno}: {\sl #1} \end{center}\medskip }
\newcounter{mytabno}\newcommand{\mytab}[1]{\addtocounter{mytabno}{1}
	\begin{center} Tabelle \arabic{mytabno}: {\sl #1} \end{center}\medskip }
\newcounter{myprogno}\newcommand{\myprog}[1]{\addtocounter{myprogno}{1}
	\begin{center} Programm-Beispiel \arabic{myprogno}: {\sl #1} \end{center}\medskip }
\newlength{\wei}
\newcommand{\mytable}[1]{
\begin{center}\settowidth{\wei}{#1}\addtolength{\wei}{-0.5\tabcolsep}
\rule{\wei}{.1mm}\\[2ex]
#1\\[1.5ex]\rule{\wei}{.1mm}\end{center}
}
\newcommand{\Hline}{ \\[2ex]\hline\\ }

\newcounter{prnr}\setcounter{prnr}{0}
\newcommand{\prognr}{\rule{0mm}{0mm}
  \marginpar{\addtocounter{prnr}{1}{\tt p~}\arabic{prnr}}
}
\newcommand{\pbegin}{\hspace*{1.5cm}
  \begin{minipage}[t]{14cm}}
\newcommand{\pend}{\end{minipage}}
\newcommand{\smallpage}[1]{
\begin{minipage}[t]{2em}#1\end{minipage}
}
\newcommand{\bigpage}[1]{
\begin{minipage}[t]{14cm}{\raggedright #1

}\end{minipage}
}
%%%%%%%%%%%%%%%%%% FRAGE %%%%%%%%%%%%%%%
\newcommand{\frage}[1]{\bigskip

\smallpage{\sf{\large\sl F:}} {\sf\bigpage{#1}}
}
%%%%%%%%%%%%%%%%%% BEISPIEL %%%%%%%%%%%%%%
\newcommand{\beispiel}[1]{\bigskip

\smallpage{\sf{\large\sl B:}} \bigpage{#1}
}
%%%%%%%%%%%%%%%%%% ANTWORT %%%%%%%%%%%%%
\newcommand{\antwort}[1]{\bigskip

\smallpage{$\to$} {\sf\bigpage{#1}}
}
\newcommand{\normal}[1]{\bigskip

\smallpage{} {\sf\bigpage{#1}}
}
\newcommand{\merke}[1]{\bigskip

\fbox{\parbox{14.5cm}{\sf{\large Merke:} #1}}\bigskip

}
\title{Elementare Programmierkonzepte\\ zur L�sung algorithmischer Probleme\\
$\longrightarrow$ ein kleiner Programmierkurs}
\author{H.~P.~Wolf%
\footnote{Statistik/Informatik,
Fakult�t f�r Wirtschaftswissenschaften, Unversit�t Bielefeld
\newline {\tt http://www.wiwi.uni-bielefeld.de/%
\~{}wolf/lehre/ws0304/progkurs/progkurs.html}}}
\date{WS 2003/04, Datei: {\tt ideen.tex}, Formatierung: \today}
\begin{document}
\maketitle
\renewcommand{\contentsname}{�bersicht}
\tableofcontents
\newpage

\section{Gegenstand}

Dieses Papier zeigt den roten Faden f�r den Programmierkurs,
der erg�nzend zur Einf�hrung in die Informatik angeboten wird.
Einige Diskussionspunkte sind nur skizziert und nicht in vollst�ndigen
S�tzen notiert. Dieses passt zur Angewohnheit in der Computerwelt,
Dinge abzuk�rzen. Besonders sei auf die Abk�rzungen {\sl B:}
und {\sl F:} hingewiesen. Letzteres steht kurz f�r {\em Frage:},
w�hrend {\sl B:} auf eine Beobachtung oder ein Beispiel aus
der uns umgebenden Welt hinweisen soll.

Im Kurs wird zur Demonstration Turbo-Pascal verwendet. Trotzdem sollten
die Programmierbeispiele im Prinzip mit wenigen Ver�nderungen
% (haupts�chlich bzgl.\ Ein- und Ausgabe)
auch mit anderen
Produkten �bersetzbar sein.
Es sei erw�hnt, dass Typen wie {\tt Integer} unterschiedlich implementiert
sein k�nnen, so dass sich bei zu gro�en Zahlen unterschiedliche Ergebnisse
bzw.\ Effekte einstellen k�nnen. Auch ist zu beachten, dass die
Steuerungs-Oberfl�che von Turbo-Pascal zwar f�r den ge�bten Anwender
die Arbeit erleichert, gleichzeitig jedoch die Suche nach
elementaren Prinzipien erschwert.

\section{Motivation}

\frage{Welche Motivation
treibt einen Studierenden der Wirtschaftswissenschaften
in einen Programmierkurs? Heute steht fast an jedem
anspruchsvollen Arbeitsplatz ein Rechner und mit Hilfe dieses Ger�tes
ist ein gro�er Teil der Arbeit zu erledigen. Deshalb mu� man sich einfach
mal mit einem solchen Ding auseinandersetzen. Das klingt einleuchtend,
aber warum muss denn gleich eine Einf�hrung in das Programmieren her?
Die Anwendungen sind doch dazu da, dass man es leicht hat und gerade
nicht erst Programmieraufgaben zu l�sen hat.}

\marginpar{Fehler-\newline erkundung}
\antwort{Stimmt und stimmt auch
nicht! Denn wenn alles klappt, dann muss man in der Tat genauso
wenig �ber Interna nachdenken, wie immer vorgegeben wird. Doch sieht
die (Computer-) Welt oft anders aus! Das Ding macht dann
nicht das, was es tun soll. Das gedruckte Ergebnis sieht anders aus
als vorher am Bildschirm suggeriert, das Anwendungs-Programm stellt
sich stur und reagiert nicht auf die Mausklicks,
es erscheint pl�tzlich eine
unverst�ndliche Warnung oder sogar Fehlermeldung. Was dann?
In solchen F�llen hilft nur noch ein (teurer) Experte oder doch  ein Eintauchen in
die Welt oder besser das Meer der Rechner. Man muss dann
eben unter die Oberfl�che schauen.
}

\frage{Aber ist es dann nicht naheliegend, sich konkret mit
Anwendungen zu besch�ftigen, die -- wie {\sc word,
excel, ...} -- im unternehmerischen Alltag wirklich eingesetzt werden?
Noch dazu wird gemunkelt, dass angeblich sogar so seltsame
Dinge wie {\sc ms-dos} angesprochen werden sollen?
}

\marginpar{Produkt-\newline unabh�ngigkeit}
\antwort{
Eine gut formulierte Beschreibung auf einem Fertiggericht kann verhindern,
dass das Gericht misslingt und man nicht verhungert. Doch wie kann man
sich aus der Aff�re ziehen, wenn man die Anweisungen auf
einem neuen Fertiggericht nicht genau versteht? Will sagen, dass es
f�r ein konkretes Problem nat�rlich die zeitlich effizienteste L�sung
ist, wenn man genau zu dem Problem eine Antwort vorliegen oder
erlernt hat. Jedoch �ndern sich die Zeiten und damit die Dinge, die uns
umgeben in rasender Geschwindigkeit. Und dann ist es schon mittelfristig
eine bessere Strategie, einige ganz elementare Dinge verstanden zu haben.
Manche dieser Elementarteilchen sind nicht nur zuf�lligerweise
in sehr einfachen L�sungen aus vergangenen Computerzeiten
anzutreffen und zwar in Reinkultur.
Deshalb kann die Diskussion �lterer Ans�tze
viel aktueller sein als jene der neusten Version von Produkt {\sc xyz}.
}

\frage{Vielleicht sind diese Antworten doch nicht so ganz
�berzeugend. Denn in gro�en Unternehmen gibt es ein
Vielzahl von Leuten, deren Aufgabe darin besteht, die Rechner
am Laufen zu halten und �ber rechnerspezifische L�sungen nachzudenken.
Da liegt es doch auf der Hand, bei sich einstellenden Problemen
genau diese qualifizierten Leute in Anspruch zu nehmen oder?
}

\marginpar{Konzept-\newline verst�ndnis}
\antwort{Mag sein, dass diese Strategie klappt.
Doch seien zwei Gegenfragen gestattet: Wer stellt eigentlich solche Experten ein
und wer leitet sie gem�� Unternehmenszweck? Und wer f�llt
Entscheidungen, die etwas mit organisatorischen Abl�ufen und
technologischer Infrastruktur zu tun haben? Es ist bei solchen Fragen
schon sehr wichtig, elementare Konzepte und Prinzipien der Rechnerwelt
verstanden zu haben. Denn da viele der elementaren L�sungsans�tze
in den unterschiedlichsten Gew�ndern wieder an die Oberfl�che kommen,
ist ihr Studium eine lohnenswerte Investition. Nat�rlich kann hier
ein kurzer Programmierkurs nicht alle n�tigen Weisheiten vermitteln,
doch bevor man mit dem Laufenlernen beginnt, sollte man
ein paar einfache Geh�bungen machen. Und das ist auch der Grund, warum
dieser Kurs, der sich besonders auch an Teilnehmer mit sehr
geringen Vorkenntnissen richtet, angeboten wird.}

\frage{Aber wieso soll ausgerechnet {\em Programmieren} den
Anfang bilden? Ist das nicht nur etwas f�r Computerfreaks?}

\marginpar{Erfahrungs-\newline wissen}
\antwort{{\em Learning by doing!} Es f�llt viel leichter,
Schwierigkeiten, L�sungsans�tze und Konzepte
dadurch zu verstehen, dass man sich einige ganz einfache Probleme
stellt und diese zu l�sen versucht. Beim Fu�ball in der
Bundesliga lassen sich strukturell verwandte Fehler und Erfolgsans�tze
wie in der Kreisklasse entdecken. Dieses gilt
auch f�r die Rechnerwelt. Schwierigkeiten, die sich bei der
Bearbeitung kleiner Probleme einstellen, sind auch bei gro�en
Projekten anzutreffen und erkl�ren Verhaltensweisen auf dem Markt
erh�ltlicher Produkte. Zusammenfassend lassen sich f�r
das Mittel {\em Programmieren} viele Pluspunkte anf�hren:
\begin{itemize}
\item die Teilnehmer lernen ein wenig zu programmieren und
      k�nnen hierdurch f�r eigene kleine Probleme L�sungen erstellen
\item die Teilnehmer lernen fundamentale L�sungs-Konzepte kennen
\item die Teilnehmer werden sich nach einem solchen Kurs viel schneller
      in eine andere Sprachwelt hineinfinden
\item die Teilnehmer lernen Strategien kennen, Fehler zu suchen und zu vermeiden
\item den Teilnehmern wird es sp�ter leichter fallen, verwendete Konzepte
      zu erkennen und Fehlersituationen zu beheben
\item die Teilnehmer lernen allgemein Strategien zur Probleml�sung kennen
\item den Teilnehmern werden sogar Teile zuk�nftiger Pr�fungen leichter fallen.
\end{itemize}
Vielleicht tr�gt diese Liste etwas dick auf, doch m�ge jeder die �berlegungen
pr�fen, hoffentlich mit dem Erfolg, dass
das Vertrauen in den Kurs ansteigt und die Teilnehmer
nun mit einer verst�rkten Motivation zu Werke gehen.}


\section{Rechner, Betriebssystem, Filesystem}

\beispiel{Damit jeder mitdenken kann, ben�tigen wir ein Problem, das
sich jeder vorstellen kann, ein praktisches Problem:
Stellen Sie sich vor, Sie haben einen wundersch�nen Abend in einem
Restaurant hinter sich und bitten die Bedienung, die Rechnung zu erstellen.
Es ist oft ganz erstaunlich, wie schnell ge�bte Kellner die einzelnen
Betr�ge addieren k�nnen. Hatten Sie nicht auch schon mal das Gef�hl,
dass eventuell das Ergebnis -- der zu zahlende Betrag -- falsch
sein k�nnte? Da liegt der Wunsch nach einem Instrument auf der
Hand, mit dem man leicht die Summe nachrechnen kann. Wir w�nschen
uns nat�rlich sofort einen Rechner mit einem Programm, mit dem wir den Job
erledigen k�nnen -- oder? Was spricht eigentlich f�r die Verwendung eines
Rechners, was dagegen?}

\frage{Welche Vor- und Nachteile hat ein Rechnereinsatz?}

\antwort{
Bei der Verwendung einer Rechnerl�sung haben wir uns
mit verschiedenen Dingen herumzuschlagen:
Ger�te, Software, Oberfl�chen, Sprachen, Fehler, Breakdowns.
Ein Ger�t oder vornehm ausgedr�ckt die Hardware bildet die dingliche Voraussetzung
f�r die computerm��ige Unterst�tzung.
Dass Ger�te auch gro�e Nachteile besitzen, musste der Autor k�rzlich erfahren,
als er bei Dunkelheit mit dem kleinen Zeh mit einer Personenwaage zusammenstie�,
der kurz zuvor ihre neue Wirkungsst�tte zugewiesen worden war.
Man muss sich also �ber Ger�te �rgern und �ber
Programme, die heutzutage fast immer per graphischer Oberfl�che
bedient werden m�ssen. Dieser Umgang setzt zum Beispiel ein Verst�ndnis
f�r kleine Bildchen (Ikonen) voraus. Man muss die Bedeutungen der einzelnen
Elemente bzw.\ der Vokabeln der Sprache zur Kommunikation kennen.
Falls man abweichende Vorstellungen
besitzt, wird man fr�her oder sp�ter seltsam anmutende Ergebnisse
erhalten oder in Fehlersituationen geraten. Dann sitzt man fest, es hat sich
ein Breakdown ereignet. Zur Fehlerbeseitigung m�ssen wir in der Regel unsere
Vorstellungen korrigieren, denn unser Einfluss auf eine Anpassung
von Hardware, Software, Oberfl�chenelemente usw.\ ist meist winzig --
wir sind der vorgesetzten Konfiguration ausgeliefert.
}

\merke{Breakdowns offenbaren Differenzen zwischen der Realit�t und 
den Vorstellungen von der Realit�t, wie man sich am Beispiel des
bargeldlosen Zahlungsverkehr �berlegen kann.}

\beispiel{Haben Sie schon mal ein fremdes Auto gefahren und dann
festgestellt, dass es irgendwie nicht so wie gedacht funktioniert?
Dabei habe ich stillschweigend unterstellt, dass Sie im Besitz einer
Fahrerlaubnis sind.
Oder haben Sie schon mal in einer fremden K�che neue Rezepte ausprobiert
(nein? probieren Sie das mal!)
und dann �berlegt: {\em Da stimmt doch was nicht?}
Man denke nur an Ausrufe, wie: {\em Was hei�t eine Prise Salz?}
Auch sei aus der Rechnerwelt an die karikierende Frage
auf die Message: {\tt press any key} erinnert: {\em Wo ist denn der Any-Key?
Ich hab` so was nicht auf meiner Tastatur!}
}

\frage{Wie kann man den langfristigen Frust beim Umgang mit Rechnern klein halten?}

\antwort{Es scheint langfristig nur eine M�glichkeit
zu geben: Immer auf der Suche nach Grundkonzepten zu sein. Dazu ist es
erforderlich, ein wenig die Kultur zu begreifen. Das gelingt
zum Beispiel dadurch, dass man selbst Hand anlegt, also durch
eigenes Tun. Aus diesem Grund werden bei uns f�r eine Fahrerlaubnis
Fahr�bungen bei einer Fahrschule sowie eine F�hrerscheinpr�fung gefordert.
Dabei soll der Klient theoreti\-sches Wissen und praktische Erfahrungen anh�ufen.
In der Computerei m�sste es auch so sein. Damit w�rden sich manche
Breakdowns vermeiden lassen.}

\merke{Fehlerbehebung erfordert oft konzeptionelles Verst�ndnis und nicht nur Faktenwissen.}

\beispiel{E�kultur lernt man durch Blick in K�chen und
Kochkurse kennen, �brigens erfordert das Maschinenbaustudium ein
handwerkliches Praktikum.}

\frage{Entsprechend k�nnen wir die Frage formulieren:
{\em Wie sieht es eigentlich in der K�che der Programmentwicklung aus?}
Wie kann man sich den Konzepten ann�hern?
}

\antwort{Gehe in einen Programmierkurs, lerne eine Sprache kennen und schreibe
ein eigenes Kneipenabrechnungs�berpr�fungsprogramm: {\sc kaupp}}

\beispiel{Betrachten wir die Arbeit in einer K�che, es muss ja nicht
gleich eine Gro�k�che wie die Mensa sein. Kochen, wie geht das
eigentlich? �berlege, wie Kochen funktioniert. Oder noch einfacher: kann
man mir (der Autor ist Teetrinker und hat vom Kaffeekochen nur eine
sehr diffuse Vorstellung) erkl�ren, wie man Kaffee kocht? Geht Eierkochen
genauso? Und was ist dabei zu beachten?}

\frage{F�r die Programmierung ergibt sich die gro�e Frage:
Welche Schritte beinhaltet der Weg von der Idee bis zum Programmeinsatz?}

\antwort{Bis zum fertigen Produkt ist es oft ein langer, nicht unbedingt
gerader Weg, wie folgende Liste glauben machen k�nnte:
\begin{enumerate}
\item
Ideen: zun�chst muss f�r das gestellte Problem eine Idee, ein Ansatz
her. Man muss schon wissen, in welcher Form man das Problem angehen will.
Ist das gekl�rt, sollte man die Essenz seiner Gedanken unbedingt zu Papier
bringen.
\item
Algorithmus: hat man den L�sungsweg f�r sich verstanden, dann m�ssen die
notwendigen Handlungsanweisungen
in einer Form notiert werden, dass eine fremde Person
die Chance hat, den Weg zu verstehen und zu pr�fen.
\item
Programm: wenn die einzelnen Schritte in ihrem Zweck gekl�rt sind,
k�nnen die Anweisungen gem�� einer sprachlichen Verabredung formuliert werden,
sprich: in eine Programmiersprache �bersetzt werden.
\item
Eintippen: bis einschlie�lich Punkt 3 konnte alles mit Bleistift und Papier
erledigt werden, aber irgendwann kommt der Punkt, dass
wir zum Beispiel unsere {\sc kaupp}-L�sung in den Rechner
eingeben m�ssen. Wir brauchen also eine St�ck Software,
das uns gestattet, unser Programm einzugeben.
\item Speicherung: nach dem Eintippen, m�ssen wir unser Programm
so abspeichern, dass es nicht verloren geht.
\item �bersetzen: da Programmiersprachen (wie wir sie hier im Auge haben)
uns die Formulierung unserer Probleml�sungsstrategie leicht machen sollen,
m�ssen wir unser Programm in eine Darstellung oder Repr�sentation �bersetzen,
die auf dem konkreten Rechner gestartet werden kann. Compiler hei�en
Programme, die solche �bersetzungsaufgaben erledigen.
\item Programmstart: falls die �bersetzung erfolgreich abgeschlossen ist,
kann das �bersetzte Programm getestet und gestartet werden.
\item Programmbedienung: f�r die Bedienung des neu geschriebenen Programms
muss sein Anwender Regeln beachten, die in der
Programmierphase durch den Programmierer festgeschrieben worden sind. 
Dieses gilt zum Beispiel f�r eine ordnungsgem��e
\item Programmbeendigung: beendet hoffentlich
die Auseinandersetzung mit dem Programm nach erfolgreicher Arbeit.
\end{enumerate}

Ein Anwender hat nur noch das Produkt in der Hand. Er kann
�ber die verschiedenen Phasen Vermutungen anstellen. Und doch hat er das
auszul�ffeln, was in den einzelnen Phasen schief ging, also alles,
was vorher eingebrockt worden ist.
Sie sollten sp�ter einmal �berlegen, ob Sie diese Schritte bei
Ihren Probleml�sungen identifizieren k�nnen? Haben Sie sie auch
ordnungsgem�� absolviert?}

\merke{Integrierte L�sungen wie Bedienungsoberfl�chen verdecken 
sehr oft Arbeitsphasen, Denkkonzepte und Abstraktionsebenen}

\beispiel{In Fortf�hrung der K�chenanalogie sei die Frage erlaubt:
Was w�re ein Koch ohne eine anst�ndige K�che? Ein Rezept allein
reicht nicht aus, es muss schon eine Werkstatt her, in der der Koch 
sein Rezept umsetzen kann. Was muss ihm eine K�che bieten?
Er braucht mit Sicherheit einen Herd.
Wie ist sie strukturiert und aufgebaut? Etwas abstrakter formuliert:
Welche Dienste muss eine K�che dem Koch bieten?
K�hlung, Wasserversorgung, Eieruhr, Vorratsschr�nke, Beleuchtung fallen uns sofort
ein.}

\frage{Auch der Entwickler von programmtechnischen L�sungen
muss eine Umgebung haben, in der er wirken kann. Was muss sein
Rechner k�nnen?
Welche Umgebungselemente setzt die Entwicklung von Programmen voraus und
welche Funktionalit�ten m�ssen im Angebot sein? Dem steht das Angebot
moderner Rechner gegen�ber. Wie sind diese aufgebaut?
}

\antwort{
In unserer Aufz�hlung wurde herausgearbeitet, dass das eigene Programm
dauerhaft gespeichert werden muss. Weiter muss das gespeicherte Programm
(durch einen geeigneten Compiler) �bersetzt werden k�nnen. Erst dann kann es
vom Anwender gestartet werden. Schon in dieser kurzen Zusammenstellung
lassen sich Aufgabenfelder erkennen, die nach ihrer N�he zur Hardware
gegliedert werden k�nnen:
}

\normal{
\mytable{\begin{tabular}{ll}
Anwenderebene & Einsatz von Anwendungssoftware\\& wie {\sc word, mail, explorer}
\Hline
Problemebene & Erstellung von Anwendungssoftware \\ &wie {\sc kaupp}
\Hline
Grenzschicht ${ \uparrow \atop \downarrow}$
& Angebot elementarer Programme \\ &wie Eingabeprogramme (Editoren), Compiler
\Hline
Betriebssystemebene & elementare Verwaltung \\&von Speicher,
laufenden Programmen, diversen Ger�ten
\Hline
Hardwareebene & Ger�te\\& wie Prozessor, CD-Laufwerk, Tastatur, Speicher
\end{tabular}}
\myfig{einfaches Schichtenmodell}
}

\normal{
Wenn keine weiteren Probleme bei der Arbeit mit Rechnern auftreten,
sollte der Anwender sich wirklich nur auf der Anwenderebene aufhalten.
Hier im Kurs wollen wir jedoch, wie versprochen, unter die Oberfl�che
schauen und bis zur Ebene des Betriebssystems vorsto�en.
}

\beispiel{Damit ein Koch seine Zutaten wiederfindet, muss er Ordnung halten.
Doch welche Ordnung? Und wie kann man dar�ber sprechen?}

\frage{Ob B�cher, CDs, Spiele oder auch Dinge, die in einem Rechner lagern --
alles sollte so abgelegt sein, dass es wiederzufinden ist. Deshalb
m�ssen wir, bevor wir uns an {\sc kaupp} wagen, hierzu ein paar Gedanken
machen. Was l�sst sich zur Speicherungs-Frage bemerken?
Wo k�nnen wir unsere selbst geschriebenen Programme lassen?}

\antwort{Wenn wir unser noch zu erfindenes Programm eingetippt
haben, wollen wir es speichern. Ganz allgemein k�nnen wir zu speichernde
Dinge als {\em Daten} bezeichnen. Damit wir die Ansammlung der
eingetippten Zeichen, unser Programm, wiederfinden, m�ssen wir es
als Einheit betrachten und mit einem Namen versehen.
Solche unter einem Namen abgelegten Einheiten werden als {\em Dateien}
(oder {\em files}) bezeichnet. Die abstrakten Orte, in denen Dateien
gespeichert werden, hei�en {\em Verzeichnisse} ({\em directories}) oder
auch Ordner. Wie St�dte zu Kreisen, Kreise zu Bundesl�ndern, Bundesl�nder
zu Staaten geh�ren, sind die Verzeichnisse hierarchisch angeordnet.
Sie bilden einen Baum, der als {\em Dateisystem} (file system) bezeichnet wird.
}

\antwort{Der Beh�lter bzw.\ das Verzeichnis auf der obersten Ebene hei�t
{\em Wurzelverzeichnis} oder kurz: {\em Wurzel} ({\em root}) und wird oft
mit einem Schr�gstrich $\backslash$ bezeichnet. Betrachten wir zur Anschauung einen
Ausschnitt eines Dateibaumes, der nicht von unten nach oben, sondern
aus zeichentechnischen Gr�nden von links bis rechts w�chst:
}
\normal{
\unitlength1mm
\begin{picture}(120,90)
\put(8,40){\makebox(0,0){$\bf\backslash$}}
\put(10,40){\line(1,-3){10}}
\put(10,40){\line(1,-2){10}}
\put(10,40){\line(1,-1){10}}
\put(10,40){\line(1,-0){10}}
\put(10,40){\line(1,1){10}}
\put(10,40){\line(1,2){10}}
\put(10,40){\line(1,3){10}}
\put(10,40){\line(1,4){10}}
\put(20,20){\makebox(0,0)[l]{Programme}}
\put(37,20){\line(1,-1){10}}
\put(37,20){\line(1,0){10}}
\put(50,10){\makebox(0,0)[l]{Word}}
\put(20,60){\makebox(0,0)[l]{Home}}
\put(30,60){\line(1,-2){10}}
\put(30,60){\line(1,-1){10}}
\put(30,60){\line(1,0){10}}
\put(30,60){\line(1,1){10}}
\put(30,60){\line(1,2){10}}
\put(40,70){\makebox(0,0)[l]{wiwi}}
\put(40,40){\makebox(0,0)[l]{studs}}
\put(50,70){\line(1,-2){10}}
\put(50,70){\line(1,-1){10}}
\put(50,70){\line(1,0){10}}
\put(50,70){\line(1,1){10}}
\put(60,50){\makebox(0,0)[l]{wolf}}
\put(60,70){\makebox(0,0)[l]{handl}}
\put(70,50){\line(1,-2){10}}
\put(70,50){\line(1,-1){10}}
\put(70,50){\line(1,0){10}}
\put(70,50){\line(1,1){10}}
\put(80,30){\makebox(0,0)[l]{kurs}}
\put(80,60){\makebox(0,0)[l]{briefe}}
\put(90,30){\line(1,-1){10}}
\put(90,30){\line(1,0){10}}
\put(90,30){\line(1,1){10}}
\put(100,40){\makebox(0,0)[l]{pascal}}
\put(110,40){\line(1,-1){10}}
\put(110,40){\line(1,0){10}}
\put(110,40){\line(1,1){10}}
\put(15,80){\makebox(0,0)[l]{$\vdots$}}
\put(35,80){\makebox(0,0)[l]{$\vdots$}}
\put(55,80){\makebox(0,0)[l]{$\vdots$}}
\put(75,60){\makebox(0,0)[l]{$\vdots$}}
\put(95,40){\makebox(0,0)[l]{$\vdots$}}
\put(115,50){\makebox(0,0)[l]{$\vdots$}}
\put(40,25){\makebox(0,0)[l]{$\vdots$}}
\end{picture}
\myfig{Beispieldateibaum}
}
\normal{
Wenn mein Programm {\sc kaupp} nur schon fertig w�re, k�nnte ich
in dem Bild auf die Stelle des Dateibaumes zeigen, wo es hingeh�rt:

Gehe von der Wurzel aus nach {\tt Home}, dann nach {\tt wiwi},
folge dem Pfad in Richtung {\tt wolf} sowie Richtung {\tt kurs}
und wechsle zum Schluss in das Verzeichnis {\tt pascal}.
Dieser Weg- oder {\em Pfad} ist in absoluter Weise, ausgehend von
der Wurzel beschrieben worden. Deshalb hei�t er
{\em absoluter Pfad}. Notiert wird er durch Aufz�hlung der
besuchten Orte (oder Ordner), getrennt durch ein Trennzeichen.
In der {\sc windows}-Welt wurde als Trennzeichen der R�ckstrich ({\em backslash\/})
($\backslash$) gew�hlt. Also l�sst sich der Pfad kurz beschreiben durch:
\begin{center}
{\tt $\backslash$Home$\backslash$wiwi$\backslash$wolf$\backslash$kurs$\backslash$pascal}
\end{center}
}

\antwort{Wenn Sie arbeiten, tun Sie dieses an einem speziellen Ort: am eigenen
Schreibtisch, in der Bib, im H�rsaal usw. Sie befinden sich also irgendwo.
Hier ist es entsprechend. Sie
befinden sich an einer speziellen Stelle im Dateibaum und arbeiten dort.
Wenn sich der Autor an seinem Rechner anmeldet, wird ihm automatisch
der Ort
\begin{center}
{\tt $\backslash$Home$\backslash$wiwi$\backslash$wolf}
\end{center}
zugewiesen. Oft ist es sehr vorteilhaft, die Welt von diesem Ort aus -- also
relativ zu diesem Ort -- zu betrachten.
Von diesem {\em Heimatverzeichnis} aus gesehen lassen sich die Kurs-Programme
in zwei Schritten erreichen: Gehe nach {\tt kurs} und dann nach {\tt pascal}.
Diese Pfadangabe ist relativ zu dem Ausgangspunkt zu interpretieren und der Pfad
hei�t {\em relativer Pfad:}
\begin{center}
{\tt kurs$\backslash$pascal}
\end{center}
Befinden wir uns in dem Ordner {\tt pascal} und wollen den Pfad zu den Briefen
erkl�ren, m�ssen wir im Baum nach oben steigen. Das Verzeichnis �ber dem
Arbeitsverzeichnis wird abgek�rzt mit zwei hinter einander stehenden Punkten: {\tt ..}
und wir erhalten:
\begin{center}
{\tt ..$\backslash$..$\backslash$..$\backslash$briefe}
\end{center}
�brigens gezeichnet ein einzelner Punkt ({\tt .}) den aktuellen Ordner.
}

\antwort{Die Diskussion �ber Orte der Speicherung ist jetzt schon
fast abgeschlossen. Wir m�ssen nur noch verstehen, wie zwischen verschiedenen
Speichermedien unterschieden werden kann. Schon aus Sicherheitsgr�nden
sollten wir immer �ber Sicherungskonzepte, sprich: Sicherungskopien nachdenken.
Bisher ist die Diskette das Hauptsicherungsmedium f�r kleine Dinge, wie zum
Beispiel f�r selbst geschriebene Programmdateien. Solche Datentr�ger werden
mit Hilfe von Diskettenlaufwerken beschrieben und gelesen. Aus diesem
Grund hat sich eingeb�rgert, Orte von Ger�ten allgemein als {\em Laufwerke} zu bezeichnen.
Als Namen werden einfallslos, wie die Welt nun mal ist, in der Regel einfache Buchstaben
verwendet. Oft -- also nicht immer --
wird das Diskettenlaufwerk mit einem {\tt A}, die eingebaute
Festplatte mit einem �{\tt C} und das CD-Laufwerk mit einem {\tt D} bezeichnet.
Ortsangaben f�r Dateien lassen sich nun um die Angabe des Mediums erweitern,
indem man den Laufwerksbuchstaben dem Pfad durch einen Doppelpunkt
getrennt voranstellt:
\begin{center}
{\tt C:$\backslash$Home$\backslash$wiwi$\backslash$wolf$\backslash$kurs}
\end{center}
Falls unser Programm, was leider immer noch nicht vorliegt, den
Dateinamen {\tt kaupp.pas} bekommt, l�sst sich Name mit Ortsangabe
als Einheit schreiben:
\begin{center}
{\tt C:$\backslash$Home$\backslash$wiwi$\backslash$%
wolf$\backslash$kurs$\backslash$pascal$\backslash$kaupp.pas}
\end{center}
So, damit m�sste eine vage Vorstellung von Dateien, Dateibaum,
Pfaden und Laufwerken existieren.
}

\antwort{
Die Speicherfrage l�sst sich auf den verschiedenen, oben aufgef�hrten Ebenen
betrachten. Auf der Hardware-Ebene k�nnen wir Materialien diskutieren
und zum Beispiel fragen, wie lange die Medien halten. Auch auf dieser Ebene
sind �berlegungen angesiedelt, wie es physikalisch gelingt, Informationen zu speichern.
Das Betriebssystem ist daf�r verantwortlich, dass man verschiedene
Speichermedien �hnlich behandeln kann. Oberhalb der Betriebssystemebene
kann man mit der einfachen Vision leben,
dass auf diesen Medien Dateib�ume untergebracht sind. F�gt man die
Dateib�ume gedanklich zusammen, ergibt sich f�r den Anwender
ein gro�er gemeinsamer Speicher. Dennoch schlagen Unterschiede der Hardware
auf den Anwender durch -- der Autor erinnert sich noch mit Grausen an seine ersten
Versuche, eine CD in ein CD-Laufwerk einzubringen.
}

\merke{In der Definition und Bezeichnung von Elementen, Klassen und Strukturen
liegt der Schl�ssel f�r den Aufbau beherrschbarer komplexer Systeme
wie Informationsspeicher aber auch Programmsysteme.}

\beispiel{Geh�rt das Vorw�rmen von Sch�sseln auch zum Kochen selbst?
Wenn Kochen das Umsetzen eines Kochrezeptes ist, welche zus�tzlichen
Handlungen m�ssen im Rahmen des Kochens noch abgewickelt werden?}

\frage{F�r den Rechnerbetrieb ist ein Betriebssystem zur Verwaltung
elementarer Einheiten und Prozesse unerl�sslich. Doch was muss ein
Anwender oder ein Programmierer von den Leistungen wissen?
Und welches sind die aller wichtigsten Operationen?}

\antwort{Dem Anwender von heute sind
die Leistungen des Betriebssystems oft gar nicht mehr bewu�t. 
Denn er kann seine W�nsche mittels
Service-Programmen mit graphischen Oberfl�chen realisieren,
die so hochtrabende Namen wie {\em Dateimanager} haben.
Diese besitzen jedoch den Nachteil, dass nach einer Operation nicht mehr
feststellbar ist, welche Anwenderaktion diese ausgel�st hat und was sich genau
ver�ndert hat. Der Programmentwickler sollte jedoch nicht nur eine rudiment�re
Vorstellung von Dateib�umen, sondern auch von den elementaren
Operationen haben, die mit dem Dateibaum zusammenh�ngen.}

\antwort{Zum Beispiel muss der Entwickler Operationen kennen, um sein
Programm f�r den Anwender angemessen zu platzieren.
Diese Operationen lassen sich gut mit dem alten {\sc dos}
(DOS=DiskOperatingSystem=diskettenbasiertes Betriebssystem)
aus den 80-er Jahren
�ben. Wer begleitend am Rechner probieren will, muss zun�chst eine
sogenannte {\sc dos-box} �ffnen. Klicke unter {\sc windows}
auf {\em Start}, dann auf {\em Programme}, dort ggf.\ auf {\em Zubeh�r}
und zum Schluss auf den Eintrag mit der Ikone mit den Buchstaben
{\sc  ms-dos}. Es sollte sich ein schwarzes Fenster mit einer
Eingabeauf\-forderung �ffnen. Diese {\sc  dos-box} ist nun unser
Fenster zum Betriebssystem, in dem wir Auftr�ge in Form von Befehlen
an das Betriebssystem �bermittlen k�nnen.

Ein Auftrag setzt sich zusammen aus dem Kommando und
-- wenn erforderlich -- angeh�ngte Parameter:
 $\langle${\it Kommando}$\rangle$
$\langle${\it Parameter${}_1$}$\rangle$  $\langle${\it Parameter${}_2$}$\rangle$
}

\antwort{
Neben dieser allgemeinen Syntax ben�tigt man nur noch eine
Liste der Kommandos mit ihren Bedeutungen und der genauen Syntax.
�brigens hat jedes Betriebssystem eigene K�rzel f�r die elementaren
Aufgaben. F�r die ersten Schritte reichen aus:
\mytable{
\begin{tabular}{lll}
Bedeutung & MS-DOS & Linux
\Hline
Verzeichniswechsel & cd & cd \\
Dateien auf\-listen & dir & ls \\
Datei anzeigen & type & cat\\
Datei kopieren & copy & cp \\
Datei umbenennen & move oder rename & mv\\
Verzeichnis erstellen & md oder mkdir & mkdir \\
Datei l�schen & del & rm \\
Laufwerk wechseln & x: & ---\\
editieren & edit & ed
\end{tabular}
}\nopagebreak
\mytab{einige Kommandos zum Umgang mit Dateib�umen}
}

\antwort{Hinweis: In der {\sc windows}-Welt wird zwischen gro�en und kleinen
Buchstaben nicht unterschieden, wohl jedoch in der Welt des
Linux-Betriebssystems.
}

\antwort{
F�r die Syntax d�rften als Anschauung einige Beispiel gen�gen:

\mytable{\begin{tabular}{llp{6cm}}
Kommando / Beispiele & Bemerkung
\Hline
cd $\langle${\it Pfad}$\rangle$
  & change directory\\
cd
  & zeigt Arbeitsverzeichnis an\\
cd $\backslash$Home$\backslash$wiwi
  & definiert neue Arbeitsstelle: $\backslash$Home$\backslash$wiwi\\
cd ..$\backslash$briefe
  & definiert neue Arbeitsstelle:\\
  & einen nach oben und dann ins  Verzeichnis briefe\\
dir $\langle${\it Pfad}$\rangle$ $\langle${\it Parameter${}_2$}$\rangle$
  & directory anzeigen\\
dir
  &  zeigt Objekte des aktuellen Verzeichnisses\\
dir  ..
  &  zeigt Objekte des �bergeordneten  Verzeichnisses\\
dir kurs
  &  zeigt Objekte des untergeordneten Verzeichnisses kurs\\
dir $\backslash$Home
  &  zeigt Objekte des Verzeichnisses Home unter der Wurzel\\
dir $\backslash$Home /p
  &  zeigt Objekte des Verzeichnisses Home seitenweise\\
copy $\langle${\it von}$\rangle$ $\langle${\it nach}$\rangle$
  & kopiert Objekt�\\
copy karl heinz
  & legt eine Kopie der Datei karl unter dem Namen heinz ab\\
del $\langle${\it Pfad}$\rangle\backslash\langle${\it Name}$\rangle$
  & delete \\
del a:$\backslash$test$\backslash$muell.dat
  & l�scht auf a: Datei muell.dat im Verzeichnis test\\
move $\langle${\it von}$\rangle$ $\langle${\it nach}$\rangle$
  & verschiebt Objekt\\
rename $\langle${\it von}$\rangle$ $\langle${\it nach}$\rangle$
  &benennt Objekt um\\
type $\langle${\it Datei}$\rangle$
  & gibt Dateiinhalt auf Bildschirm aus\\
type program.pas
  & gibt Dateiinhalt von program.pas auf Bildschirm aus\\
type program.pas $|$ more
  & gibt Dateiinhalt von program.pas seitenweise aus\\
mkdir $\langle${\it Pfad}$\rangle\backslash\langle${\it Name}$\rangle$
  & make directory \\
mkdir neuverz
  & erstellt unter aktuellem Verzeichnis neuen Ordner neuverz\\
rmdir $\langle${\it Pfad}$\rangle$
  & remove directory\\
rmdir neuverz
  & l�scht Verzeichnis neuverz\\
x:
  & wechselt auf Laufwerk $\langle${\it X}$\rangle$\\
a:
  & wechselt auf Diskettenlaufwerk\\
edit $\langle${\it Datei}$\rangle$
  & startet einfaches Editierprogramm
\end{tabular}}
}
\mytab{{\sc dos}-Kommandos mit Beispielen}

\merke{Vokabeln und Regeln determinieren die M�chtigkeit von Sprachen und nat�rlich auch
von Programmiersprachen.}

\beispiel{Wieso wurden eigentlich Sp�l-, Kaffee- und andere Maschinen erfunden?}

\frage{Was sind Batch- oder Skript-Programme?}

\antwort{Betriebssystemanweisungsfolgenausf�hrungsprogramme. Hierbei
handelt es sich um Dateien, deren Zeilen Betriebssystembefehle oder
Programmaufrage enthalten
und deren Name von der Form $\langle${\em Datei}$\rangle${\tt .bat} ist.
Zum Beispiel k�nnte eine solche Datei {\tt machmal.bat} hei�en. Diese
Datei wird gestartet durch Eintippen von {\tt machmal} hinter der
Eingabeauf\-forderung. Sie  sollten am besten sofort Ihr erstes
Batch-Programm schreiben. Nur zu!}

\merke{Automatisierungen m�ssen vor der Nutzung formal beschrieben werden.}

\merke{Unsere (Computer-) Technologie ist ein Segen und ein Fluch zugleich.
Sie soll uns Werkzeuge zur Vereinfachung an die Hand geben, doch oft werden
wir zu ihren (Be-) Dienern. Damit Menschen die Oberhand behalten, m�ssen sie kl�ger
bleiben. Das geht nur durch
\begin{center}
konzeptionelles Verst�ndnis
\end{center}
-- das zum Teil nur
durch eigene Erfahrungen gebildet werden kann.}

%\newpage

\section{Pascal-Einleitung}

\frage{Welche zentralen Punkte sind unter der �berschrift zu
erwarten?}

\antwort{Einleitung: Historie, Dialekte, Vorgehen, Beispiel\\
         Grunds�tzliches: Programmaufbau, Regeln, elementare Bausteine\\
     Handlungsanweisungen: Zuweisungen, Operationen, Unterprogrammaufrufe\\
     Datentypen: vorhandene und definierbare\\
     Vereinbarungen: Variablen- und sonstige Deklarationen\\
     Spezialfragen: Dateizugriffe, Unterprogramme, sonstige Datenstrukturen}

\merke{Ziel ist hier nicht die Ausbildung professioneller
Programmierer, sondern
\begin{center}
elementare Programmier-Konzepte
\end{center}
vorzustellen und zu verstehen.
F�r deren Vermittlung ist naheliegenderweise eine Sprache zur Beschreibung
und zur Demonstration notwendig. Aus diesem Grund wird nicht der
Schwerpunkt auf m�glichst viele Extras gelegt, sondern auf die
Herausstellung von Konzepten, die in vielen anderen Sprachwelten
wiederkehren und dort zur Konstruktion und zur
Fehlerbehebung unumg�nglich sind.}

\frage{Woher stammt Pascal?}

\antwort{Hoare, Wirth, 1968--1970, problemorientiert, abstrakte Strukturen f�r Daten,
         Lern- und Lehrsprache, effizienter Code}

\frage{Was zeichnet den Entwicklungsprozess eines Pascal-Programms aus?}

\antwort{Oben hatten wir einen 9 Punkte umfassenden Plan aufgestellt.
Unter der Annahme, dass die Ideenphase fruchtbar war und schon ein Algorithmus vorliegt, m�ssen
weiter folgen:
\begin{enumerate}
\item[0.] ggf.~{\em Installation} der notwendiger Hilfsmittel wie Compiler
\item[1.] Reformulierung des Algorithmus in der zu ausgew�hlten {\em Programmiersprache}
              (sowie Eintippen und Speicherung)
\item[2.] {\em �bersetzen} in ein auf der konkreten Hardware lauf\-f�higes Programm
\item[3.] {\em Ausf�hren} des �bersetzten Programms
\end{enumerate}
}
\antwort{Als Abbildung dargestellt ist folgender Prozess zu durchlaufen:
\begin{center}
\unitlength0.7mm
\begin{picture}(100,100)
\put(0,90){\framebox(80,8){Programmtext schreiben: Editor}}
\put(0,80){\makebox(80,8){$\downarrow$}}
\put(0,70){\makebox(80,8){$\langle$name$\rangle$.pas}}
\put(0,60){\makebox(80,8){$\downarrow$}}
\put(0,50){\framebox(80,8){�bersetzen: Compiler}}
\put(42,40){\makebox(80,8){$\searrow$}}
\put(70,30){\makebox(80,8){Fehlermeldungen}}
\put(0,40){\makebox(80,8){$\downarrow$}}
\put(0,30){\makebox(80,8){$\langle$name$\rangle$.exe}}
\put(0,20){\makebox(80,8){$\downarrow$}}
\put(0,10){\framebox(80,8){Programm starten: BS-Aufruf}}
\put(0,0){\makebox(80,8){$\downarrow$}}
\end{picture}
\end{center}
\myfig{Prozess von der Programmentwicklung zur Nutzung}

Nicht zu vergessen sind: testen, ablegen und verwenden}


\frage{Wie k�nnte ein einfaches Pascal-Programm, das ein paar Zahlen zusammenz�hlt, aussehen?}
\bigskip

\prognr\pbegin
\begin{verbatim}
program SummeN (Input,Output);
{
  Programm zur Berechnung der Summe der ersten n Zahlen
  pw 06.10.2003
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
var
  n,i : integer;
  sum : integer;
begin
  write('Berechnung der Summe ');
  writeln('der ersten n natuerlichen Zahlen');
  write('Bitte geben Sie n ein: n=');
  read(n);
  sum:=0;
  for i:=1 to n do
    begin
      sum:=sum+i;
      { writeln(sum); }
    end;
  writeln('Die Summe der Zahlen von 1 bis n=',n);
  writeln('ist: ', sum);
end.
\end{verbatim}
\pend
\medskip
\myprog{Programm zur Summierung ganzer Zahlen}

\frage{Lassen sich wirklich so einfach Programme schreiben?}

\antwort{Ja und nein. Das h�ngt vom eigenen Wissensstand ab.
Zum Beispiel wurden auch bei dem Entwurf des einfachen Programms
einige (Fl�chtigkeits-) Fehler gemacht:}

\begin{quote}
\hspace*{1cm}{\footnotesize
\begin{minipage}{8cm}
\begin{verbatim}
Fehler beim �bersetzen mittels >ppc386 first.pas:
  i nicht deklariert,
  ; vergessen,
  string mit " statt ' geschrieben, ein ' vergessen,
  falsches Objekt (semantischer Fehler): +1 statt +i
\end{verbatim}
\end{minipage}
} % end of footnotesize
\end{quote}

\merke{Empfehlenswert ist es, in Fehlersituationen �ber
\begin{center}
Fehlerentstehung und Fehlervermeidung
\end{center}
nachzudenken!}

\merke{Sprachen werden f�r bestimmte Zwecke entwickelt und ihr
Entwicklungsprozess ist im Kontext mit dem zugeh�rigen Umfeld zu
sehen. Pascal ist ein Kompromiss f�r die Ausbildung, er
vereinigt Problemorientierung mit Einfachheit, erlaubt den Einsatz
von Unterprogrammtechniken wie auch die Konstruktion
problemgerechter, abstrakterer Datenstrukturen. Pascal enth�lt
wichtige elementare Strukturen, die in vielen anderen Sprachen
anzutreffen sind. Deshalb ist eine Auseinandersetzung mit den
Konzepten von
\begin{center}
Pascal als Musterbeispiel
\end{center}
immer noch empfehlenswert. }

%\newpage

\section{Basisstrukturen, Bausteine und fundamentale Regeln}

\frage{Welche Grundstruktur besitzen Pascal-Programme?}

\antwort{Ein Pascal-Programm besteht aus einer fest definierten Reihenfolge
von Teilen. Die Struktur eines Programms ergibt sich aus folgender Abbildung:
\unitlength.7mm
\begin{picture}(120,90)
\put(15,80){\makebox(0,0)[l]{Programm}}
\put(20,75){\line(0,-1){15}}
\put(20,70){\line(1,0){10}}
\put(35,70){\makebox(0,0)[l]{Kopf}}
\put(20,60){\line(1,0){10}}
\put(35,60){\makebox(0,0)[l]{Rumpf}}
\put(40,55){\line(0,-1){45}}
\put(40,50){\line(1,0){10}}
\put(55,50){\makebox(0,0)[l]{Deklarationsteil}}
\put(40,10){\line(1,0){10}}
\put(55,10){\makebox(0,0)[l]{Anweisungsteil}}
\put(60,45){\line(0,-1){25}}
\put(60,40){\line(1,0){10}}
\put(60,35){\line(1,0){10}}
\put(60,30){\line(1,0){10}}
\put(60,25){\line(1,0){10}}
\put(60,20){\line(1,0){10}}
\put(75,40){\makebox(0,0)[l]{Label-}}
\put(75,35){\makebox(0,0)[l]{Konstanten-}}
\put(75,30){\makebox(0,0)[l]{Typ-}}
\put(75,25){\makebox(0,0)[l]{Variablen-}}
\put(75,20){\makebox(0,0)[l]{Unterprogramm-Deklarationen}}
\end{picture}
\myfig{logische Struktur eines Pascal-Programms}
}

\antwort{Die einzelnen Teile der logischen Struktur werden
vom Compiler anhand von Schl�sselw�rtern erkannt, wie aus
folgender Darstellung zu ersehen ist. Die fett geschriebenen
W�rter sind Vokabeln der Sprache von Pascal. Drei Punkte
deuten an, dass noch weitere Eintragungen gleicher Art folgen k�nnen.
Die Bezeichnungen in den spitzen Klammern m�ssen f�r ein
konkretes Programm durch konkrete Bezeichnungen ersetzt werden.
}

\begin{quote}
\hspace*{1cm}\begin{minipage}{10cm}
{\sl
{\bf program} $\langle$Programmname$\rangle$ ($\langle$DateiNamen$\rangle$,...){\tt ;}\\
{\bf label}\\
\hspace*{2em}$\langle$Markenname$\rangle$, ...{\tt ;}\\
{\bf const}\\
\hspace*{2em}$\langle$Konstantenname$\rangle$=$\langle$konstanter Wert$\rangle${\tt ;}...{\tt ;}\\
{\bf type}\\
\hspace*{2em}$\langle$Typname$\rangle$=$\langle$Datentyp$\rangle${\tt ;}...{\tt ;}\\
{\bf var}\\
\hspace*{2em}$\langle$Variablenname$\rangle$:$\langle$Datentyp$\rangle${\tt ;}...{\tt ;}\\
{\bf begin}\\
\hspace*{2em}$\langle$Handlungsanweisung$\rangle${\tt ;}\\
\hspace*{2em}$\langle$weitere Handlungsanweisungen$\rangle$\\
{\bf end.}
}
\end{minipage}
\end{quote}
\myfig{Aufbau eines Pascal-Programms}

\frage{Welche atomistischen Elemente (Vokabeln) kennt Pascal?}

\antwort{Pascal-Programme bestehen aus der Aneinanderreihung 
von Symbolen, die sich in verschiedene Klassen einordnen lassen.
\begin{itemize}
\item Spezialsymbole:

 {\tt \ +\ -\ *\ /\ =\ <\ >\ <>\ <=\ >=
.\ ,\ ;\ '\ (\ )\ \{\ \}\ [\ ]\ :=\ .. \^{}  }
\item Wortsymbole:

{\tt begin end program procedure function\\
and or not if then else case\\
for to do downto while repeat until\\
const type var array of file record set\\
div mod nil in goto label packed with
}
\item {Namen / Bezeichner / Identifier: 

{\tt i, x, KontoNr, Vektor10,Betrag13, ...}}

\item {Zahlen: 

\tt 4 007 +1234 -13 0.1 -0.33333 +31.414E-1\\
 .1 {\rm oder} 1. {\rm sind �brigens unzul�ssig}}

\item {Strings / Zeichenreihen:

\tt 'Hello world!' 'A' 'don''t worry be happy'}

\item {Kommentare:

\tt \{ dies ist ein Pascal-Kommentar \} }

\newfont{\NEWF}{cmsy10 scaled 1000}
\item {Trennzeichen:

zwischen Pascal-Symbolen: "{\NEWF t}", {\itshape newline}
zwischen Anweisungen: "{\tt ;}" und zwischen Parametern "{\tt ,}"
}

\end{itemize}
}

\frage{Welche fundamentalen Regeln sind zu beachten?}

\antwort{Es gibt wenige unbedingt zu beachtende Regeln:
\begin{itemize}
\item Programmbeginn: ein Pascal-Programm beginnt mit 
Schl�sselwort {\tt program}
\item Anweisungsteil: der Teil mit den Handlungsanweisungen  beginnt
mit {\tt begin} und das Programm endet mit {\tt end.}

\item Kommentare: $\{$ und $\}$ schlie�en Kommentartexte ein.

\item Gro�e und kleine Buchstaben: haben identische Wirkung.

\item {\tt;} trennt eine Anweisung von der n�chsten.

\item {\tt;} beendet Deklarationsanweisungen.

\item Leerzeichen ist wie Newline-Zeichen Trennzeichen.

\item Namen m�ssen mit Buchstaben beginnen und k�nnen Ziffern enthalten.

\item Wortsymbole sind nicht ver�nderbar.

\item Deklarationen: Vor der Verwendung von Dingen sind diese im
Programm exakt einzuf�hren. Deshalb m�ssen Variablen oder
Unterprogramme vor ihrer Benutzung deklariert werden. Dieser
strenge Ansatz erleichtert die �bersetzung, gleichzeitig werden
Fehler verhindert, indem zum Beispiel Ergebnisse nur typengerecht
abgelegt werden k�nnen.
\end{itemize}
}

\merke{Exakte Regeln m�ssen sein. Andernfalls kann eine Maschine
Auftr�ge nicht erledigen. Schwierig ist es, f�r das
\begin{center}Regelwerk einer Sprache\end{center}
den richtigen Kompromiss zu finden zwischen der Eignung f�r das
menschliche Denken und f�r die maschinelle Abwicklung. Andere
Sprache besitzen andere syntaktische Regeln als Pascal. Je weniger
streng die Regeln einer Sprache sind, desto lockerer lassen sich
Programme schreiben, doch wachsen gleichzeitig die
Gefahren f�r (versehentlichen) Fehlgebrauch. In der Regel werden sich
angesprochene Fragen wiederholen: Programmstruktur,
Elementar-Bausteine, Verkn�pfung von Bausteinen,
Modellierungsm�glichkeiten von Handlungs- und Datenseite,
Strukturierungsregeln. }

%\newpage

\section{Einfache Handlungsanweisungen}

\beispiel{Ein Koch hat verschiedene kleine Fingerfertigkeiten
-- wie {\em Kneten} oder {\em Unterheben} -- zu lernen.
Z�hlen Sie einige weitere auf.}

\frage{Welche Operationen erkennen wir
im Handlungsteil des Beispielprogramm?}

\antwort{Addition, {\tt sum+i}. Weiter werden unterst�tzt:
\mytable{
\begin{tabular}{ll}
Operator & Bedeutung
\Hline
        {\tt +} & Addition\\
        {\tt -} & Subtraktion\\
        {\tt *} & Multiplikation\\
        {\tt /} & Division\\
        {\tt div} & ganzzahlige Division\\
        {\tt mod} & modolo: ganzzahliger Rest\\
        {\tt =} & rechter gleich linkem Operand?\\
	{\tt <>} & Operatoren verschieden?\\
        {\tt <} & linker kleiner?\\
        {\tt <=} & linker kleiner gleich?\\
        {\tt >=} & linker gr��er gleich?\\
        {\tt >} & linker gr��er?\\
        {\tt and} & gilt linke und rechte Aussage\\
        {\tt or} & gilt linke oder rechte Aussage
\end{tabular}
}
\mytab{Operatoren von Pascal}
}

\antwort{beachte Priorit�tsklassen:
\mytable{\begin{tabular}{ll}
 Priorit�t & Operatoren
 \Hline
 sehr hoch &       {\tt not} \\
 hoch         &       {\tt *,\ /, mod, div, and} \\
 mittel        & {\tt +,\ -, or}\\
 gering      & {\tt =,\ <>,\ <=,\ >=,\ <,\ >}
\end{tabular}}
\mytab{Operatoren nach Priorit�ten klassifiziert}
}

\antwort{Zuweisung: durch {\tt :=} wird der Inhalt, der sich rechts
ergibt, auf der Variablen, die links von {\tt :=} steht, zugewiesen.}

\antwort{Schreibbefehle und Lesebefehl:
{\tt writeln, write, read} sind Aufrufe von Prozeduren.
Syntax von Prozedur-Aufrufen, spezielle Semantik: {\tt write}
gibt (in einfacher Form) die angegebenen Dinge aus, {\tt writeln}
erzeugt nach Ausgabe Zeilenvorschub. {\tt read} liest n�chstes Objekt,
{\tt readln} w�rde zudem noch Zeilenendezeichen einlesen.
Sp�ter wird erkl�rt, dass Pascal neben Prozeduren auch noch Funktionen
-- wie in der Mathematik gebr�uchlich -- anbietet, zum Beispiel:  {\tt sin(x)}.}

\antwort{Die Anweisung {\tt for i:=1 to n do} hei�t {\tt for}-Schleife:
frei �bersetzt bedeutet dieses: erledige die Anweisung(en) hinter
{\tt do} zun�chst f�r {\tt i=1}, dann f�r {\tt i=2} bis
{\tt i=n}. Es wird also {\tt n}-mal dasselbe erledigt, jedoch mit
ver�nderten {\tt i}. {\tt i} und {\tt n} sind die Namen von Variablen.
Statt {\tt i} kann nat�rlich auch ein anderer zul�ssiger Name
verwendet werden.

Statt {\tt n} kann auch ein auswertbarer Ausdruck stehen.
Solche Konstruktionen zur Wiederholung bestimmter
Anweisung(sfolg)en hei�en Schleifen. Neben diesen werden weiter unten noch
die Geschwister {\tt while}- und {\tt repeat-until}-Schleife vorgestellt.
In diesem Atemzug lassen sich auch noch die Vettern
{\tt if-then} und {\tt if-then-else} zur bedingten Ausf�hrung von
Anweisungen nennen.}

\merke{Konzepte wie Operatoren, auswertbare Ausdr�cke,
Priorit�tsregeln, Variablen, Zuweisungen und Unterprogramme finden
wir �berall in der Computerwelt. Gl�ckerlicherweise gleichen sich
oft die vorgeschlagenen Sprachvorschl�ge. Ungl�cklicherweise sind
Automaten Pedanten. Schon winzige Kleinigkeiten k�nnen zeitraubende
\begin{center}Fehlersuchen\end{center}
ausl�sen. Zum Beispiel ist
in manchen Sprachen {\tt =} der Zuweisungs- und {\tt ==} der
Ver\-gleichs\-operator, manchmal kommt es im Gegensatz zu Pascal sehr
wohl auf Gross- und Kleinschreibung an. �brigens muss jeder
mindestens einmal im Leben drei Stunden opfern, um dann
festzustellen, dass {\tt o} und {\tt O} sowie {\tt 0} v�llig
verschiedene Zeichen sind.}

%\newpage

\section{Einfache Datentypen}

\beispiel{Zutaten. Welche Kochzutaten kennen Sie? Wie w�rden Sie
diese klassifizieren? In welchen Mengengr��en werden Zutaten
ben�tigt, zu welchen Mengen lassen sich verschiedenartige Zutaten
zusammenf�gen?}

\frage{Welche Daten ben�tigte das Beispielprogramm in welcher Form?}

\antwort{Daten werden auf Variablen gespeichert. Je nach Qualit�t
werden verschiedene Datentypen unterschieden. Der Typ legt den Bereich der Werte
fest, die eine Variable annehmen kann. Im Beispielprogramm
sind uns nur {\tt integer}-Variablen begegnet. Erforderlich waren
die Variablen {\tt n, i, sum}.}

\frage{Gibt es noch weitere einfache Datentypen?}

\antwort{Als ganz elementare oder skalare Datentypen kennt Pascal:
\mytable{\begin{tabular}{ll}
Datentyp & Bedeutung
\Hline
{\tt Integer} & Ganzzahlen\\
{\tt Real} & reelle Zahlen\\
{\tt Boolean} & Wahrheitswerte\\
{\tt Char} & Zeichen\\
{\tt String} & Zeichenketten\\
{\tt Longint} & Ganzzahlen, sehr viel mehr als bei {\tt integer}
\end{tabular}}
\mytab{elementare Datentypen}
}

\antwort{Pascal kennt einige in der Wirkung ihrem Namen entsprechende
Standardfunktionen wie {\tt sin, cos, exp, sqrt, abs, round}. Deren Ergebnisse 
sind von einem angemessenen Typ.
\mytable{\begin{tabular}{lll}
Funktion & Typ des Resultats & Bedeutung / Input
\Hline
{\tt sin(x)} & {\tt real} & $sin(x)$ -- Sinusfunktion, {\tt x real}\\
{\tt cos(x)} & {\tt real} & $cos(x)$ -- Cosinusfunktion, {\tt x real}\\
{\tt sqrt(x)} & {\tt real} & $sqrt(x)$ -- Wurzelfunktion, {\tt x real}\\
{\tt exp(x)} & {\tt real} & $e^x$ -- Exponentialfunktion, {\tt x real}\\
{\tt abs(i)} & {\tt integer} & absoluter Betrag von Integer {\tt i}\\
{\tt trunc(x)} & {\tt integer} & Abschneiden der reellen Zahl {\tt x}\\
{\tt round(x)} &{\tt integer} & Runden der reelen Zahl {\tt x}
\end{tabular}}
\mytab{Standardfunktionen mit Ergebnistyp}
 {\tt MaxInt} ist �brigens eine vordefinierte
Konstante, die die gr��te Zahl von Typ {\tt integer} zeigt.}

\antwort{F�r Objekte vom Typ {\tt Boolean} sind die Operationen
{\tt and, or, not} definiert.}

\merke{Auswertbare Ausdr�cke gibt es in allen vergleichbaren
Programmierumgebungen.
\begin{center}Zentrale Fragen an Programmiersprachen\end{center}
sind:
\begin{itemize}
\item Welche verschiedenen Objektarten (Typen) gibt es?
\item Welche Operationen (Operatoren, Funktionen) gibt es f�r diese Typen?
\item In welcher Syntax sind die Handlungen zu notieren?
\item Welche Auswertungsregeln -- vgl.\ Klammern
       und Priorit�tsregeln -- kommen zur Anwendung?
\item Wie werden die Auswertungsergebnisse gespeichert, zugewiesen oder
weiterverarbeitet?
\end{itemize}}

\section{Variablen und Flusskontrolle: Abrechnungsprogramm}

\beispiel{Wir wollen bei der Bezahlung im Restaurant gro�z�gig sein
und die Bezahlung der Getr�nke �bernehmen. Deshalb wird eine
ver�nderte Software ben�tigt. Listen Sie wesentliche Eigenschaften
auf!}

\frage{L�sst sich nicht wieder elegant ein Programm in Pascal schreiben,
das die Ums�tze getrennt nach ihrer Qualtit�t zusammenz�hlt?}

\antwort{Klar! Hier ist es:}
\bigskip

{ \footnotesize
\prognr\pbegin
\begin{verbatim}
program EssenUndTrinken (Input,Output);
{
  Programm der Getr�nke-Umsatzsumme
  pw 08.10.2003
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }

var
  Betrag,   { f�r Betragseingabe }
  Speisen,  { f�r den Speiseumsatz }
  Getraenke { f�r den Getr�nkeumsatz }
            : real;
  i : integer; { Variable zum Z�hlen }
  Art : char;  { zeigt Art des Verzehrs an }

begin
  { Initialisierung }
  Speisen:=0.0; Getraenke:=0.0; i:=0;
  writeln('Getr�nkesummenberechnungsprogramm');
  { Vorbereitung der Einlese-Verarbeitungsschleife }
  write('Umsatzart eingeben: g=Getr�nk, s=Speise, x=Exit: ');
  readln(Art);
  { Einlese-Verarbeitungsschleife }
  while Art <> 'x' do
    begin;
      if (Art='s') or (Art='g') then
        begin
          i:=i+1;
          write('Betrag eingeben:'); readln(Betrag);
          { Verbuchen gem�� Art und Betrag }
          if Art='g' then Getraenke:=Getraenke + Betrag;
          if Art='s' then Speisen  :=Speisen   + Betrag;
        end
      else
        { falsch eingegebene Verzehrart bearbeiten }
        writeln('Falsche Eingabe');
      write('Umsatzart eingeben: g=Getr�nk, s=Speise, x=Exit: ');
      readln(Art);
    end;
  { Endauswertung }
  writeln('Es wurden ',i,' Positionen eingegeben.');
  writeln('Die Summe der Speisen ist',  Speisen:10:2);
  writeln('Die Summe der Getraenke ist',Getraenke:10:2);
  writeln('Hoffentlich bekommt es auch gut!');
end.
\end{verbatim}
\pend
} %  end of footnotesize
\myprog{Programm zur Ermittlung von Getr�nke- und Speisekosten}
\bigskip

\frage{Und was gibt es �ber Fehler und zur Entstehung zu berichten?}
\bigskip

\hspace*{2cm}\begin{minipage}{11cm}
{\footnotesize
\begin{verbatim}
  Fehler:
    statt ' Doppelt�ddelchen " geschrieben
    2 * then vergessen
    statt Speisen nur Speise eingetippt
    identische Bedingungen in if-Anweisungen durch copy-and-paste
  Verbesserungen:
    Anzahl Eingaben, Layout, Formate, Bezeichnungen
\end{verbatim}
} %  end of footnotesize
\end{minipage}

\frage{Was zeigt uns das Beispiel zum Thema Variablen und Typen?}

\antwort{Wir sehen Verwendungen des Typs {\tt real} f�r Betr�ge.
  Zwar k�nnte man sich auch mit einer {\tt Integer}-Cent-Rechnung
     behelfen, jedoch w�rden wir bei der Berechnung von
     Umsatzsteuern auf Probleme sto�en.

     �brigens werden {\tt Integer}-Variablen oft mit Namen wie
     {\tt i,j,k,n,m} bezeichnet.

     Weiter wird anhand einer {\tt char}-Variablen der Typ des
     Verzehrs verwaltet.}

\antwort{F�r Variablen gilt die Reihenfolge:
         Deklaration, Initialisierung, Gebrauch}

\merke{Der f�r einen bestimmten Zweck gew�hlte Datentyp mu� alle
die Werte zulassen, die aufgrund der Problemlage (inklusive zu
erwartenden Modifikations\-w�nschen) theoretisch gebraucht werden
k�nnten. Andererseits sollte die
\begin{center}Menge der durch den Datentyp
zugelassenen Werte\end{center}
so klein wie m�glich sein. Denn hierdurch werden
viele falsche, semantisch unzu\-l�ssige Inhalte ausgeschlossen.}

\antwort{Zuweisung: Eine Zuweisung kann f�r Pascal beschrieben durch:
\begin{center}
$\langle${\itshape variable}$\rangle$ {\tt :=}
       $\langle${\itshape auswertbarer ausdruck}$\rangle${\tt ;}
\end{center}
Objekte, die sich nicht �ndern, sollten als Konstanten modelliert
werden.}

\merke{Der Ablauf eines Programmes mit den sich ver�ndernden Speicherzust�nden
wird
\begin{center}Prozess\end{center}
genannt. Er zeichnet sich dadurch aus, dass Variablen mit dem Zeitablauf
ihren Wert aufgrund von Zuweisungen �ndern.
}

\frage{Was zeigt uns das Beispiel zur Schleifenfrage?}

\antwort{{\tt while}-Schleife.

In dem Programm {\tt SummeN} ist uns eine {\tt for}-Schleife
begegnet. Dabei stand vorher fest, wie oft der Rumpf der Schleife
durchschritten werden muss. Ist das vorher nicht klar, wird besser
eine {\tt while}-Schleife verwendet.
Der Rumpf der Schleife wird dann wieder und wieder
durchlaufen, sofern vor dem Durchlauf die Schleifenbedingung {\tt wahr}
ist. Die allgemeine Struktur lautet:
\begin{quote}
{\tt while} $\langle${\itshape bedingung}$\rangle$ {\tt do}\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end;}
\end{quote}
}

\antwort{{\tt repeat}-Schleife.

Die {\tt repeat-until}-Schleife ist der dritte Typ einer Schleife.
Im Unterschied zur {\tt while}-Schleife wird die Schleifenbedingungen
erst nach Durchlauf des Schleifenrumpfes betrachtet, so dass diese
Schleife mindestens einmal durchlaufen wird. Hier ist
die allgemeine Struktur:
\begin{quote}
{\tt repeat}  \\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
{\tt until} $\langle${\itshape bedingung}$\rangle$ {\tt ;}
\end{quote}
}

\antwort{{\tt for}-Schleife.

Der Vollst�ndigkeit halber sei die {\tt for}-Schleife noch
in ihren zwei Varianten pr�sentiert. In der Form, bei der
die Schleifenvariable nach jedem Durchlauf herauf gez�hlt (inkrementiert)
wird, hat sie die allgemeine Gestalt:
\begin{quote}
{\tt for} $\langle${\itshape start der laufvariablen}$\rangle$
{\tt to} $\langle${\itshape maximaler Wert der laufvariablen}
$\rangle$ {\tt do}\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end;}
\end{quote}

In der anderen Form wird nach jedem Durchlauf die Laufvariable
um 1 vermindert (dekrementiert):
\begin{quote}
{\tt for} $\langle${\itshape start der laufvariablen}$\rangle$
{\tt downto} $\langle${\itshape minimaler wert der laufvariablen}
$\rangle$ {\tt do}\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end;}
\end{quote}
}

\merke{Bei Schleifen sind
\begin{center}
erster und letzter Schleifendurchlauf
\end{center}
die Durchl�ufe mit einer hohen Fehlerrate. Man sollte unbedingt
nach Fertigstellung diese beiden Durchl�ufe nochmals �berpr�fen.}

\frage{Was f�r Regeln gelten f�r Anweisungen, die nur unter bestimmten
Bedingungen ausgef�hrt werden sollten?}

\antwort{{\tt if}-Anweisungen erlauben die Definition von Bedingungen
f�r Handlungsauftr�ge. Es sind zwei Formen anzutreffen.
\begin{quote}
{\tt if} $\langle${\itshape bedingung}$\rangle$ then\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end;}
\end{quote}

... hat die Bedeutung: Sofern die angegebene Bedingung erf�llt ist, soll
die Anweisung bzw.\ der Anweisungsblock hinter dem {\tt then} ausgef�hrt
werden. Ein Entweder-Oder wird hingegen von der {\tt if-then-else}-Konstruktion umgesetzt:
\begin{quote}
{\tt if} $\langle${\itshape bedingung}$\rangle$ then\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end \{ kein Semikolon! \}}\\
{\tt else}\\
~~~{\tt begin}\\
~~~~~~$\langle${\itshape auswertbare ausdr�cke}$\rangle$\\
~~~{\tt end;}
\end{quote}
}

\antwort{Beachte: ein {\tt else} geh�rt immer zu dem unmittelbar davor stehenden
{\tt if}, und vor einem {\tt else} darf nie ein {\tt ;} stehen!}

\antwort{F�r die aufgef�hrten Beispiele gilt, dass ein Anweisungsblock,
der aus einer einzigen Anweisung besteht, nicht durch eine
{\tt begin}-{\tt end}-Klammer verpackt werden muss. Andererseits k�nnen
jedoch beliebig viele Anweisungen einer Sequenz in mittels
{\tt begin} und {\tt end} zusammengefasst werden. Zur Umrahmung des
eigentlichen Programms darf das {\tt begin}-{\tt end}-Paar nicht weggelassen
werden.}

\merke{Konstruktionen wie die vorgestellten Schleifen und {\tt if}-Konstruktionen
hei�en
\begin{center}Kontroll-Strukturen.\end{center}
 Die einfachste Struktur ist die Sequenz, die
bisher nur implizit vorgestellt worden ist. Der Name geht darauf zur�ck, dass
durch diese Strukturen der Fluss durch das Programm w�hrend der Ausf�hrung
gesteuert oder kontrolliert wird. Die Typen: Sequenz-, Auswahl- und Wiederholungsstrukturen
findet man in den verschiedensten Sprachwelten und sind deshalb essentiell.
F�r ein konkretes Problem resultiert die Frage, wie sich ein algorithmischer
L�sungsvorschlag unter Verwendung der erlaubten Kontrollstrukturen so hinschreiben
l�sst, dass die Niederschrift m�glichst kurz wird und doch verst�ndlich bleibt.
Dieses erfordert zum Beispiel, Strukturparallelit�ten zu erkennen und mittels Schleifen
zu formulieren.}

\antwort{F�r Interessierte: Pascal bietet auch noch eine {\tt case}-Anweisung an. Was es hiermit
auf sich hat und wie sie syntaktisch korrekt eingesetzt wird, m�ge
jeder selbst nachschlagen.}

\merke{
Stilhinweise:

      Man sollte f�r einen menschlichen Leser nur
      \begin{center}sinnvolle Namen\end{center}
      verwenden, damit der Leser inhaltliche Zuordnungsfehler
      m�glichst im Ansatz erkennt. Weiterhin sollten Dinge mit gro�er
      Verwechselungsgefahr deutlich unterschiedliche Namen bekommen.
      Es ist zweckm��ig, sich bestimmte einpr�gsame Namenskonventionen
      vorzugeben, damit gen�gend Kapazit�t zur Probleml�sung verbleibt.
      Trotzdem bleibt die Erfindung geeigneter Namen eins der
      schwierigsten Probleme in der Informatik.

      F�r die
      \begin{center}Lesbarkeit von Programmen\end{center}
      ist weiter dringend zu empfehlen,
      Klammer- und andere Strukturen, so hinzuschreiben, dass
      mit einem Blick die syntaktische Richtigkeit festgestellt
      werden kann und Beziehungen zwischen Elementen deutlich werden.}

\section{Richtig programmieren mit Unterprogrammen}

\beispiel{Haben Sie schon einmal eine gr��ere Aufgabe erledigt?
Stellen Sie sich vor, Sie wollten ein 5 G�nge-Men� f�r 10 Personen
servieren? Wie w�rden Sie das machen? Die L�sung ist ganz einfach:
F�r den Nachtisch schicken Sie ihren Gehilfen zur Eisdiele, um Eis
zu kaufen. Als eine Vorspeise kann eine Party-Pizza des nahen Pizza-Service
dienen. Der Hauptgang kann mit Leichtigkeit
von McKing oder einer Pommes-Bude bereitgestellt werden und als zweite
Vorspeise zerschneiden Sie selbst ein paar Tomaten. Zum Abschluss gibt�s
Brot und K�se, nat�rlich auch nicht aus eigner Herstellung.
Ihre Aufgabe besteht also darin, die G�nge kreativ auszuw�hlen,
verschiedene Dinge zu strukturieren und das ganze Essen zu managen.}

\frage{Wie l�st man in Pascal komplizierte Aufgaben und
kommt zu vorzeigbaren Programmen?}

\antwort{Verwende Funktionen und Prozeduren!
In Pascal lassen sich zusammenh�ngende Bl�cke
mit Teil-L�sungen zu Funktionen und Prozeduren zusammenschn�ren.
Hierdurch k�nnen diese kleinen L�sungen einfach in zuk�nftigen
L�sungenvorschl�gen integriert werden. Au�erdem wird durch solche
Strukturierungsinstrumente die L�sung �bersichtlicher, lesbarer und
damit verst�ndlicher.

Funktionen wie {\tt sin(x)} wurden oben angesprochen.
Die Prozeduren {\tt Readln, Writeln, Read, Write} haben
wir schon im Einsatz gesehen. Sie erledigen Einlese- und Ausgabeprozesse,
ohne dem Anwender zu offenbaren, wie sie das eigentlich anstellen.}

\antwort{Betrachten wir zun�chst Prozeduren etwas n�her.
Zur Erinnerung hier eine Prozedur-Beispielanwendung:
\begin{quote}
{\tt writeln('Die Summe der Zahlen von 1 bis n=',n);}
\end{quote}

{\tt writeln} ist der Name der Prozedur.
Innerhalb der Klammern werden der Prozedur Informationen �bergeben,
im Beispiel, die zu druckenden Dinge durch Kommata getrennt.}

\antwort{Aufruf ohne Parameter -- Syntax:
\begin{quote}
$\langle${\itshape prozedurname}$\rangle${\tt ;}
\end{quote}

Aufruf mit Parametern -- Syntax:
\begin{quote}
$\langle${\itshape prozedurname}$\rangle${\tt (}
$\langle${\itshape parameter 1\/}$\rangle${\tt ,} %
$\langle${\itshape parameter 2\/}$\rangle${\tt , ... );}
\end{quote}

Die Parameter einer Parameterliste werden also mittels Semikola voneinander
getrennt. �brigens werden in der Regel nur Prozeduren mit Informationsaustausch
verwendet.}

\merke{{\em Teile und herrsche} ist ein altes Sprichwort, das
besonders in der Computerwelt eine neue Relevanz erfahren hat.
\begin{center}
Verst�ndlichkeit und Wiederverwendbarkeit
\end{center}
sind die Ziele.
Modularit�t charakterisiert den Weg zum Ziel. Hiernach werden
gel�ste Dinge in abgeschlossenen Einheiten versteckt, deren innere
Struktur f�r den Anwender v�llig belanglos ist, und er nur
die Regeln f�r den Informationsaustausch -- die Schnittstellendefinition --
kennen muss.}

\beispiel{Sch�n wenn es zum Beispiel einen Pizza-Service gibt,
doch wie l�sst sich ein solcher aufbauen. Das erfordert nat�rlich ein
paar Schritte...}

\frage{Wie kann man zum Beispiel das Schreiben von Meldungen
in eine Prozedur sperren?}

\antwort{Ganz einfach, hier ist die Definition der Prozedur
{\tt ZeigeMeldung:}
\begin{quote}
{\tt procedure ZeigeMeldung ( meldung : string; typ : char );}\\
{\tt begin}\\
~~~{\tt if (typ='e') or (typ='E') then writeln('!!!Fehler!!!');}\\
~~~{\tt if (typ='w') or (typ='W') then writeln('Warnung:');}\\
~~~{\tt if (typ='h') or (typ='H') then writeln('Hinweis:');}\\
~~~{\tt writeln(meldung);}\\
{\tt end;}
\end{quote}

Es ist also das Erkennungswort {\tt procedure} gefolgt vom
gew�hlten Namen sowie einer Liste von Variablen im Kopf der
Prozedur-Deklaration anzugeben. Die Liste besteht aus den
Variablennamen, die intern verwendet werden, sowie der
Angabe des Typs. Achtung: Der Typ des sogenannten {\em Formalparameters}
muss mit dem Typ der �bergebenen Information beim Aufruf
�bereinstimmen!
}

\frage{Das hilft noch nicht weiter, wenn das Unterprogramm
ein Ergebnis erarbeitet, das wie an das aufrufende Programm
zur�ckgeliefert werden soll. So wie bei der Auswertung einer
Funktion.}

\antwort{Neben Prozeduren gibt es auch Funktionen. Betrachten wir eine
Funktion zur Umsatzsteuerberechnung mit dem Namen:
{\tt UmsatzSteuer}. Deren Einsatz k�nnte so aussehen:
\begin{quote}
{\tt Rechnungsbetrag := ...}\\
{\tt Steuer := UmsatzSteuer(Rechnungsbetrag);}\\
{\tt Rechnungsbetrag := Rechnungsbetrag + Steuer;}
\end{quote}
} 

\antwort{Und hier die Prozedur-Definition in einem kompletten Programm:}
\bigskip

{\footnotesize
\prognr\pbegin\begin{verbatim}
   program ReBetragFunc;
   { uses wincrt; }{ fuer Turbo-Pascal notwendig }
   const       UMSTEUERSATZ = 0.16;
   var           Rechnungsbetrag, Steuer : real;
   { ------ Beginn der Deklaration der Funktion UmsatzSteuer ------ }
   function UmsatzSteuer( betrag : real ) : real;
   var
        x : real;
   begin
     x := betrag * UMSATZSTEUERSATZ;
     UmsatzSteuer := x;
   end;
   { ------ Ende der Deklaration der Funktion UmsatzSteuer ------ }
   begin
     write('Bitte Rechnungs-Betrag ohne Umsatzsteuer eingeben: ');
     readln(Rechnungsbetrag);
     Steuer := UmsatzSteuer(Rechnungsbetrag);
     Rechnungsbetrag := Rechnungsbetrag + Steuer;
     writeln('Rechnungsbetrag mit Umsatzsteuer: ',Rechnungsbetrag:7:2);
   end.
\end{verbatim}
\pend
} % end of footnotesize
\myprog{Programm zur Umsatzsteuer mit Funktiondefinition}

\antwort{Es sind sicher einige Bemerkungen erforderlich.

Ergebnistyp: Das Ausgabe-Ergebnis einer Funktion ist der Inhalt, den die Variable
annimmt, deren Name mit dem der Funktion selbst identisch ist.
Hierf�r muss die Funktion in ihrer Kopfzeile mit einer Typvereinbarung
versehen werden.

Struktur:
Funktionen und Prozeduren k�nnen zwischen ihrem Kopf und dem
Handlungsteil einen Vereinbarungsteil zur Definition lokaler Variablen
enthalten.
Damit besitzt die Deklaration eines Unterprogramms dieselbe
Struktur wie das gesamte Pascal-Programm.

Lokalit�t: Gr��en, die au�erhalb und vorher definiert worden sind,
sind aus Sicht der Funktion (und auch einer Prozedur) globale Gr��en und
k�nnen unter ihrem Namen lesend verwendet werden.
Unterprogramm-Objekte,
die im Kopf einer Funktion oder einer Prozedur oder im Vereinbarungsteil
eines Unterprogramms lokal eingef�hrt worden sind, verdecken
gleichnamige Objekte, die au�erhalb bekannt sind.
Lokal eingef�hrte Objekte sind nach Beendigung des
Unterprogramms auch nicht mehr zugreifbar.
}

\merke{Wer von wo aus unter welchem Namen wann
\begin{center}
Speicherzugriffe
\end{center}
in ausf�hrender, lesender oder ver�ndernder Weise t�tigen darf,
ist in der Informatik eine zentrale Fragestellung, die immer wieder
zu schwierigen und folgetr�chtigen Entscheidungen f�hrt.}

\frage{Wie lassen sich in einem Unterprogramm auch kompliziertere
�bergaben realisieren? Zum Beispiel k�nnte ja eine Funktion eine
ganze Rechnung mit sehr vielen Detail-Infos erarbeiten.}

\antwort{F�r komplizierte �bergaben k�nnen im Kopf eines
Unterprogramms Variablen mit dem Zauberwort {\tt var} versehen werden.
Dieses hat zur Wirkung, dass beim Aufruf nicht eine Kopie der �bergebenden
Information verwendet wird. Sondern es werden die Speicherpl�tze
der Variablen verwendet, die beim Unterprogrammaufruf genannt werden.

Beispiel in Parallelit�t zum letzten Beispiel:
}
\bigskip

{\footnotesize
\prognr\pbegin
\begin{verbatim}
   program ReBetragProc;
   { uses wincrt; }{ fuer Turbo-Pascal notwendig }
   const      UMSTEUERSATZ = 0.16;
   var        Rechnungsbetrag : real;
   procedure UmsatzSteuerAddieren( var betrag : real );
   begin
     betrag := betrag + betrag * UMSATZSTEUERSATZ;
   end;

   begin
     write('Bitte Rechnungs-Betrag ohne Umsatzsteuer eingeben: ');
     readln(Rechnungsbetrag);
     UmsatzSteuerAddieren(Rechnungsbetrag);
     { Variable Rechnungsbetrag wird in UmsatzSteuerAddieren angepasst! }
     writeln('Rechnungsbetrag mit Umsatzsteuer: ',Rechnungsbetrag:7:2);
   end.
\end{verbatim}
\pend
} % end of footnotesize
\myprog{Programm zur Umsatzsteuer mit Prozedur-Definition}

\antwort{Es sei darauf hingewiesen, dass durch die
{\tt var}-Parameter-�bergabe -- besonders bei Funktionen -- verdeckte Nebeneffekte
erzielbar sind, die das Verstehen des Programm extrem erschweren k�nnen.
Deshalb sind solche Konstruktionen nur mit ausreichenden Kommentaren einzusetzen.

Die verschiedenen M�glichkeiten mit ihren Auswirkungen werden
in folgendem Demonstrationsprogramm vorgef�hrt:}
\begin{quote}
\begin{quote}
{\footnotesize
\begin{verbatim}
program paratest (input,output);
{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
var    i_global, i_in, i_inout : integer;
procedure vartest(     proc_i_in    : integer;
                   var proc_i_inout : integer);
var   proc_i_local : integer;
begin
   proc_i_local:=4;
   proc_i_local:=proc_i_local * 10;
   i_global    := i_global    * 10;
   proc_i_in   := proc_i_in   * 10;
   proc_i_inout:= proc_i_inout* 10;
   writeln('IN der Prozedur:');
   writeln('i_global:',    i_global);
   writeln('proc_i_in:',   proc_i_in);
   writeln('proc_i_inout:',proc_i_inout);
   writeln('proc_i_local:',proc_i_local);
end;

begin
   i_global := 1;  i_in := 2;  i_inout  := 3;
   writeln('VOR der Prozedur:');
   writeln('i_global:',i_global);
   writeln('i_in:',    i_in);
   writeln('i_inout:', i_inout);
   {   Prozeduraufruf:  }   vartest(i_in, i_inout);
   writeln('NACH der Prozedur:');
   writeln('i_global:',i_global);
   writeln('i_in:',    i_in);
   writeln('i_inout:', i_inout);
end.
\end{verbatim}

\begin{verbatim}
Ausgabe:  VOR der Prozedur:
          i_global:1
          i_in:2
          i_inout:3
          IN der Prozedur:
          i_global:10
          proc_i_in:20
          proc_i_inout:30
          proc_i_local:40
          NACH der Prozedur:
          i_global:10
          i_in:2
          i_inout:30
\end{verbatim}
} % end of footnotesize
\end{quote}
\end{quote}
\antwort{Aus Sicht des Unterprogramms lassen sich folgende f�nf Arten
des Umgangs mit Variablen unterscheiden.
\begin{itemize}
\item globale Variablen:\\
lesender und schreibender Zugriff auf externe Variablen\\
kein Eintrag im Unterprogrammkopf oder UP-Deklarationsteil\\
gef�hrlich!
\item lokale Variablen:\\
Verwendung innerhalb des UPs ohne Au�enwirkung\\
Deklaration im UP-Deklarationsteil\\
ungef�hrlich und n�tzlich
\item Wert�bergabe an Unterprogramm:\\
Deklaration im Unterprogrammkopf\/ {\bf ohne var}\\
f�r rein lesende Zugriffe zu empfehlen
\item Variablen(adressen)�bergabe:\\
Deklaration im Unterprogrammkopf\/ {\bf mit var}\\
f�r auch schreibende Zugriffe notwendig,\\
m�glichst sparsam zu verwenden
\item Funktionswertr�ckgabe (nur bei Funktionen):\\
Deklaration der Funktion gem�� Ergebnistyp,\\
Zuweisung des Ergebnisses auf Namen der Funktion\\
empfehlenswert
\end{itemize}
}

\merke{In der Informatik werden die
\begin{center}
Parameter-�bergabearten
\end{center}
{\em call by value}
und {\em call by reference} unterschieden.}

\antwort{�brigens erlaubt Pascal rekursive und wechselseitige Funktionsaufrufe.
Diese Themen geh�ren jedoch in einen Fortgeschrittenenkurs.}

\section{Zugriffe auf gespeicherte Datenbest�nde -- Dateien}

\beispiel{Was m�ssen Sie eigentlich genau tun, wenn Sie als
Gehilfe f�r einen Freund aus dessen Gew�rzschrank ein
spezielles Gew�rz holen sollen?
Wie w�re es mit folgendem systematischen Vorgehen:
\begin{enumerate}
\item Schrank zeigen lassen
\item Schrank �ffnen
\item Gew�rze im Schrank durchgehen
\item gew�nschtes Gew�rz herausnehmen
\item Schrank schlie�en
\end{enumerate}
�berlegen Sie nun, ob es Gemeinsamkeiten zu der Suche
eines speziellen Rezeptes in einem K�chen-ABC-Buch gibt.}

\frage{Nehmen wir an, dass in einer Datei verschiedene
Dinge, zum Beispiel Kochrezepte oder hier passender Verbrauchsmengen von
Lebensmitteln, nacheinander abgelegt sind.
Was ist wohl zu tun, um diese durchzugehen und zum Beispiel die Summe
der Verbrauchsmengen zu ermitteln? Wir gehen davon aus,
dass die Verbrauchsmengen in einer Datei stehen, deren
Elemente vom Typ {\tt longint} sind.}

\antwort{
Halbformal funktioniert das Summieren wie folgt:
\begin{enumerate}
\item Dateinamen feststellen
\item Datei �ffnen
\item Datei bis zum Ende Schritt f�r Schritt durchgehen und
\item den gefundenen Betrag zur bisherigen Summe hinzu addieren
\item Datei schlie�en und Summe ausgeben
\end{enumerate}
}

\antwort{Eine Pascal-L�sung sieht sehr �hnlich aus:}

{\footnotesize
\prognr\pbegin
\begin{verbatim}
program SummeVonZahlenAusDatei;
{
  Programm zur Addition von Zahlen vom Typ longint,
  die in einer Datei abgelegt sind.
  pw 14.10.2003
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
var
   Dateiname : string;
   zahl      : longint;
   sum       : real;
   i         : integer;
   FileId    : file of longint;
\end{verbatim}
\pend

\pbegin
\begin{verbatim}
begin
   writeln('Wie lautet der Dateiname mit den zu addierenden Zahlen?');
   readln(Dateiname);
   { Namen der Datei mitteilen: }
   assign(FileId,Dateiname);
   { Datei zum Lesen oeffnen: }
   reset(FileId);
   { erstes Element aus der Datei lesen: }
   read(FileId,zahl);
   sum := 0;
   while not Eof(FileId)  do
      begin
         sum := sum+zahl;
         i   := i+1;
         { naechstes Element aus der Datei lesen }
         read(FileId,zahl);
         writeln('eingelesene Zahl: ',zahl);
      end;
   { Datei schliessen: }
   close(FileId);
   writeln('Es wurden ',i,' Werte in der Datei gefunden.');
   writeln('Die Summe der Werte ist',sum:10:2);
end.
\end{verbatim}
\pend
} % end of footnotesize
\myprog{Programm zur Summierung ganzer Zahlen aus Datei}

\antwort{�bersicht �ber die Dateioperationen: {\tt FileId}
bezeichnet dabei den Namen der Variablen, �ber den
die Datei angesprochen werden soll.
\mytable{\begin{tabular}{lp{8cm}}
Befehl & Bedeutung
\Hline
{\tt reset(FileId)}	& Datei zum Lesen �ffnen \\
{\tt rewrite(FileId)}	& Datei zum Schreiben �ffnen \\
{\tt read(FileId,$\langle${\itshape var-name\/}$\rangle$)}
			& Dateisatz lesen und auf Variablen ablegen\\
{\tt write(FileId,$\langle${\itshape var-name\/}$\rangle$)}
			& Variableninhalt an Datei anf�gen\\
{\tt close(FileId)}	& Datei schlie�en\\[1ex]
{\tt eoln(FileId)}	& folgt als n�chstes ein Zeilenende?\\
{\tt eof(FileId)}	&  folgt als n�chstes das Dateiende?
\end{tabular}}
\mytab{elementare Dateioperationen}
}

\merke{Die im Umgang mit sequentiellen Dateien vorgestellten Prozeduren und Funktionen
trifft man �berall in der Informatik an.
Sie bilden den Grundstock von
\begin{center}
Dateizugriffsoperationen.
\end{center}
Erg�nzen lie�e sich die Diskussion noch um Zugriffe, die einen wahlweisen
Zugriff auf Datens�tze erlauben, und um die Verwendung von Zeigern,
mit denen Speicherpl�tze �ber Adressen angesprochen werden k�nnen.}

\antwort{F�r eine Datei mit
Elementen vom Typ {\tt longint} muss vorher die Deklaration
fixiert worden sein:
\begin{quote}
{\tt FileId : file of longint; }
\end{quote}
Das bedeutet, zum Lesen einer Datei, die mit Pascal
geschrieben worden ist, ist die genaue Kenntnis des Typs
erforderlich. Anderfalls werden die abgelegten Inhalte
falsch intepretiert.
}

\merke{
Aus tiefster Sicht sind Dateien nichts anders als eine Abfolge von
Bits, Bytes oder Zeichen. F�r die richtige Interpretation muss deshalb
stets mitgeteilt werden, wie man
\begin{center}
Zeichen zu semantischen Einheiten zusammenfassen
\end{center}
muss. Bei Text-Dateien erkennt der menschliche
Betrachter sofort W�rter und Zahlen, da er unbewusst die passenden
Interpretationsregeln anwendet. Einem Programm m�ssen jedoch
diese Regeln genau einverleibt werden. Im Gegenzug haben wir (Menschen)
kaum eine Chance, Informationen, die in internen Formaten abgelegt sind,
zu verstehen. Wir ben�tigten dann ein passendes �bersetzungsprogramm
-- zu neudeutsch: einen Browser.}

\antwort{Man kann auch Dateien lesen, die aus f�r uns lesbaren
Zeichen bestehen. Ein l�ngeres Beispiel ist dazu im Anhang zu finden.
Der Typ des File-Identifier muss dann {\tt Text} lauten.
Eine Anwendung zeigt folgendes kleines Programm, das nur
Zahlen einliest und wieder ausgibt:}
\medskip

{%\footnotesize
\prognr\pbegin
\begin{verbatim}
program ZahlenAusDateiEinlesen;
{
  Programm zum Einlesen von Zahlen vom Typ longint
  pw 14.10.2003
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
var
   Dateiname : string;
   FileId    : Text;
   zahl      : longint;
begin
   writeln('Wie lautet der Name der Zahlen-Datei?');
   readln(Dateiname);
   assign(FileId,Dateiname);
   reset(FileId);
   writeln('Folgende Zahlen wurden gefunden:');
   while not eof(FileId) do
     begin
       read(FileId,zahl);
       writeln(zahl);
     end;
end.
\end{verbatim}
\pend
} % end of footnotesize
\medskip

\myprog{Programm zum Lesen von Text-Dateien}

\antwort{Dateien k�nnen auch nur w�hrend der Programmlaufzeit
verwendet werden, so dass sie nach Beendigung im Dateisystem
nirgends zu finden sind. Da sich gerade bez�glich des Umgangs mit
Dateien verschiedene Pascal-Compiler unterscheiden,
wird hier im Grundkurs der Umgang mit Datei nicht weiter vertieft.
}

\merke{Gemeinsam ist allen Kommunikationen, sei es mit Dateien oder
mit Ger�ten, dass immer
zwei unterschiedliche Qualit�ten von Informationen ausgetauscht werden m�ssen:
\begin{center}
Steuerinformationen und Dateninformationen
\end{center}
Wenn Probleme auftreten, ist zun�chst Steuerinformationsaustausch zu �berpr�fen
und erst als zweites die Datenseite.
}


\section{Weitere Typfragen: {\tt array, record, set, ...}}

\beispiel{K�chen werden zurecht so eingerichtet, dass Kinder an gef�hrliche
Dinge nicht herankommen, nach dem Motto: Sicherheit durch Beschr�nkung.}

\frage{Oft ben�tigt man nur Teilmengen der Wertebereiche einfacher
Typen. Zum Beispiel werden bis jetzt bei Postleitzahlen keine Zahlen gr��er
als 99999 verwendet. Was bietet Pascal f�r solche Beschr�nkungen an?}

\antwort{{\em Unterbereiche} hei�t das Stichwort. F�r Postleitzahlen
l�sst sich der Bereich durch eine Variablendeklaration der Form
\begin{quote}
{\tt
const\\
~~MaxPLZ = 99999;\\
var\\
~~PLZ : 1..MaxPLZ;
}
\end{quote}
umsetzen.}

\beispiel{Wie berichten wir elegant von unserem letzten
Lebensmitteleinkauf? Ganz einfach: wir halten unseren
Kassenbon hoch, der den Einkauf als Einheit beschreibt.}

\frage{Wie lassen sich in Pascal Dinge zusammenf�gen?}

\antwort{Zum Beispiel lassen sich Geldbetr�ge in einem
sogenannten Vektor ({\tt array}) aus Zahlen zusammenfassen und unter einem
Namen, zum Beispiel: {\tt einkaufsbetraege}, ansprechen.
Hierzu ben�tigt man die Deklaration
\begin{quote}
{\tt
const\\
~~MaxAnzahl = 100;\\
var\\
~~einkaufsbetraege : array[1..MaxAnzahl] of real;
}
\end{quote}

Damit haben wir einen Vektor f�r reelle Zahlen der L�nge 100 beantragt.
Nun k�nnen wir beispielsweise das 37-ste Element per Zuweisung ver�ndern, indem
wir dort {\tt 3.99} ablegen:
\begin{quote}
{\tt
~~einkaufsbetraege[37] := 3.99;
}
\end{quote}
Die eckigen Klammern beschreiben ein Zugriff auf Position oder Index 37, deshalb hei�en
sie auch Indexklammern und der Zugriff Indexzugriff. Entsprechend
verl�uft ein lesender Zugriff:
\begin{quote}
{\tt
~~x := einkaufsbetraege[37];
}
\end{quote}
Als Anwendungsbeispiel folgt mal wieder ein Additionsprogramm:
}

{\footnotesize
\prognr\pbegin
\begin{verbatim}
program SummeVonZahlenMitTastatur;
{
  Programm zur Addition von Zahlen,
  die per Hand einzugeben sind.
  pw 14.10.2003
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
const   MaxAnz = 100;
var
   betraege  : array [1..MaxAnz] of real;
   sum       : real;
   i         : integer;
begin
   i:=0;
   repeat
     begin
       i:=i+1;
       writeln(i,'-ten Betrag eingeben (0=Ende):');
       read(betraege[i]);
     end;
   until (i > (MaxAnz-1)) or (0=betraege[i]) ;
   sum := 0;
   write('Die Summe der ',i);
   while i>0 do
     begin
       sum := sum+betraege[i];
       i   := i-1;
     end;
   writeln(' eingegebenen Zahlen lautet: ',sum:10:2);
end.
\end{verbatim}
\pend
} % end of footnotesize
\medskip

\myprog{Programm zur Summierung unter Verwendung eines {\tt array}}

\antwort{Eigene Typen lassen sich im Vereinbarungsteil hinter dem
Schl�sselwort {\tt type} definieren. Die allgemeine
Struktur lautet:
\begin{quote}
$\langle${\itshape neuer-Typname\/}$\rangle$ {\tt = }%
$\langle${\itshape Typkonstruktion}$\rangle${\tt ;}%
\end{quote}
Dieses macht erst f�r kompliziertere Typen Sinn. Zum Beispiel lie�e sich
der Deklarationskopf oben umformulieren zu
(erg�nzt um eine alternative PLZ-Begrenzung):
{\footnotesize
\begin{quote}
{\tt
const MaxPLZ;\\
type\\
~~~MYVECTOR  = array [1..MaxAnz] of real;\\
~~~PLZTYPE   = 1..MaxPLZ;\\
var\\
~~~betraege~~: MYVECTOR;\\
~~~plz~~~~~~~: PLZTYPE;
}
\end{quote}
} % end of footnotesize
}

\antwort{Zum {\tt record}-Typ sei nur so viel gesagt, dass mit
ihm im Gegensatz zu einem {\tt array} auch verschiedene Typen
zu einer Einheit zusammengebunden werden k�nnen. N�here Diskussionen
erfordern einen F-Kurs. Besonders im Zusammenhang mit dynamischen
Strukturen werden diese Typen interessant. Klingt spannend, nicht wahr?}

\antwort{Wer aus der Mathematik mit Mengen vertraut ist, dem
wird die M�glichkeit erfreuen, Typen durch Aufz�hlung festlegen zu k�nnen:
{\footnotesize
\begin{quote}
{\tt
type~~~Tag~~~= (Mo, Di, Mi, Fr, Sa, So);\\
var~~~~heute~: Tag;
}
\end{quote}
} % end of footnotesize
Erkunden Sie, was es in Pascal mit {\tt set} auf sich hat.
Leider werden hier diese Hinweise nur wie Knochen dem Hund hingeworfen.
Doch wer erst einmal Appetit entwickelt hat, wird
selbst�ndig seine Nase in ein Buch stecken.}

\merke{Jedes Produkt, das vorgibt, eine Programmiersprache umzusetzen,
bietet neben den elementaren Kernfunktionalit�ten
ein reichhaltiges Angebot an Sonderf�higkeiten, Zusatzroutinen,
Unterprogrammbibliotheken usw.\ an. Das ist gut, weil man vor
der selbst�ndigen L�sung schauen kann, ob nicht schon eine L�sung
existiert. Es ist aber auch schlecht, weil man in der Angebotsf�lle
ertrinken kann und man dann den Wald vor lauter B�umen nicht mehr sieht.
Deshalb lautet hier die Empfehlung: Nicht einw�hlen, sondern immer
nach elementaren Prinzipien und Strukturierungsregeln Ausschau halten, sprich:
\begin{center}
suche nach Konzepten!
\end{center}
}

\section{Praktische Hinweise}
\frage{Und wie sollte man vorgehen auf dem Weg vom Problem zur L�sung?}

\antwort{
Leider gibt es hier unendlich viele Antworten:
Sammele, ordne, strukturiere, baue Bausteine,
beschreibe, zerlege das Problem, f�ge Bausteine zusammen,
ber�cksichtige schon bei der
Konstruktion die Behebung von m�glichen Fehlern und
}

\merke{vergesse niemals zu dokumentieren
\begin{center}
 --- {\bf niemals!}
\end{center} }

\antwort{
Das Ergebnis muss auch sp�ter noch verst�ndlich sein, die Bausteine
sollten in sich abgeschlossen sein, Namen m�ssen zweckm�ssig gew�hlt sein,
Teill�sungen m�ssen isoliert pr�fbar sein, Schnittstellen m�ssen klar sein.
}

\antwort{Viel l�sst sich aus Fehlersituationen lernen. Besonders, wenn
man richtig festsitzt. Versuche Fehler einzukreisen. Bis zu welcher Stelle ist
alles ok? Welche Teile sind in Ordnung, wie l�sst sich das �berpr�fen?
Welche Bedingungen m�ssen vor einem Block herrschen? �berpr�fen Sie diese!
Was soll die Einheit eigentlich erarbeiten? Lassen Sie sich Zwischenergebnisse
ausgeben! Welcher Zustand muss nach Blockbeendigung eingetreten sein?
Wie unterscheidet sich der erwartete vom beobachteten Zustand? Machen Sie
wohl�berlegte und systematische Fehlersuchexperimente!
Werden Sie im Zweifelsfall bei einem
Fehler nicht hektisch, sondern legen eine kurze Gedankenpause
(Kaffee?!) ein. Dann gehen Sie die Stellen vor der mutma�lichen Fehlerstelle
durch. Bedenken Sie, dass sehr oft auf die Frage: "Ich habe genau hier einen
Fehler, aber ich finde ihn nicht!" zun�chst von erfahrenden Leuten
die Gegenfrage gestellt wird: "Wo ist denn Ihrer Meinung nach der Fehler
auf keinen Fall zu finden? Dort sollten wir mit der Suche beginnen...!"
}

\antwort{
Dem Autor sind bei der Erstellung dieses Skripts
auch viele Fehler unterlaufen, hier die h�ufigsten:
\begin{enumerate}
\item
{\tt ;} vergessen (Syntaxfehler)
\item
Identifier (Name) falsch geschrieben (Tippfehler)
\item
Variablen falsch deklariert (semantischer Fehler)
\item
{\tt .} am Programm-Ende oder {\tt )} vergessen (Fl�chtigkeitsfehler)
\item
Typ einer Funktionsdefinition vergessen (Verwechselungsfehler)
\item
zusammengesetzte Bedingungen falsch geklammert (Priorit�tsregelfehler)
\item
{\tt !} statt {\tt not} zur Verneinung verwendet (Vokabelfehler)
\item
{\tt <>} statt {\tt =} bei Bedingung (Logikfehler)
\item
{\tt readLN} statt {\tt read} f�r getypte Datei (Verst�ndnisfehler)
\item
{\tt i} falsch gesetzt (Initialisierungsfehler)
\end{enumerate}
}

\merke{Fehler k�nnen auf fundamentalle
\begin{center}
Missverst�ndnisse
\end{center}
hinweisen. Beheben Sie nicht nur den Fehler, sondern
arbeiten Sie an Ihrem Weltbild. Dann ist das Lehrgeld
gewinnbringend angelegt.}

\antwort{
Und beachten Sie, dass Anf�nger wirklich sehr viel l�nger an kleinen
Problemen sitzen als sie vermuten. Das ist wirklich normal!
Doch glauben Sie, es zahlt sich sp�ter einmal aus:
Ohne Flei� kein Preis.
}

\merke{Konstruieren Sie ihre L�sung so, dass diese aus
\begin{center}
leicht verstehbaren Bausteinen in einer einfachen, kontrollierbaren Architektur
\end{center}
zusammengesetzt ist. Dann haben Sie eine gro�e Chance, dass
Ihr Ansatz im Prinzip sofort l�uft und nur Kleinigkeiten repariert werden m�ssen.
}

\antwort{Beachte:

\raggedleft\em
Wir k�nnen die Technik nicht aus unserem Leben verbannen,
die Verkehrsmittel nicht und inzwischen auch die Computer nicht.
Umso wichtiger aber ist es, da� wir dar�ber nachdenken,
wie wir mit den Errungenschaften der Technik in Zukunft umgehen sollen und wollen.

Prof. Dr. Josef Weizenbaum
}

\section{Literatur}
\begin{itemize}
\item
Im Internet finden sich eine grosse Zahl von Kursmaterialien, so dass
ein Suchender schnell f�ndig wird.
Siehe zum Beispiel:

\verb+ http://www.uni-koblenz.de/~schulze/pascal/files/anhang.pdf+

Suchen und finden Sie!
\item
Weiter ist ein kurzer Umdruck im HRZ f�r wenig Geld erh�ltlich:\\
RRZN (2001): Pascal -- ISO-Standard 7185, Uni Hannover.
\item
Zu Ehren von Wirth sei hingewiesen auf:\\
Niklaus Wirth (1983): Algorithmen und Datenstrukturen.
\item
die erw�hnten Arbeitsmaterialien (AM-1 und AM-2) sind zu finden unter
\\ \verb+http://www.wiwi.uni-bielefeld.de/~spitta/download.html+
\item
zu dem Kurs gibt es eine allgemeine Kursseite
\\ \verb+http://www.wiwi.uni-bielefeld.de/~spitta/lehre/GrundkursProg.html+
\item und eine spezielle f�r den Kurs WS 2003/04:
\\\verb+http://www.wiwi.uni-bielefeld.de/~wolf/lehre/ws0304/progkurs/progkurs.html+
\end{itemize}

\newpage

%\section{Platz f�r Notizen}

\newpage

\section{Anhang: Zahleneinleseprogramm}
Das im folgenden abgedruckte Programm liest Zahlen aus einer
Textdatei ein und schreibt sie in eine Output-Datei vom Typ
{\tt longint}. Ein solches Programm kann als Startpunkt hilfreich sein, wenn
man dem Input-Device nicht trauen kann und die Eingaben erst �berpr�ft werden
m�ssen.
\medskip

{ \footnotesize
\prognr\pbegin
\begin{verbatim}
program InputToFile;
{
  Programm zum Einlesen von Integer-Werte aus einer Datei und
  deren Abspeicherung in einer Datei im Pascal-internen Format.
  pw 14.10.2003
  Syntax: Programm starten, dann den Namen der Input-Datei,
          dann den der Output-Datei angeben und drittens,
          zur Sicherheit eine Obergrenze fuer die einzulesenden Zeichen
  unter linux ist zur Uebersetzung der Befehl notwendig:  pcc386 atopas.pas
  mit Turbo-Pascal ist erforderlich die Anweisung:
}{ uses wincrt; }{ fuer Turbo-Pascal notwendig }
var
   zeichen         : char;              { merkt eingelesene Zeichen }
   zahl            : longint;           { zahl merkt gefundene Zahl }
   ziffer,i        : integer;           { ziffer merkt gefundene Ziffer,
                                          i zaehlt Schleifendurchlaeufe }
   InputFile       : Text;              { Variable zum Lesen der Input-Datei }
   OutputFile      : file of longint;   { Variable zum Schreiben der Output-Datei }
   fertig          : boolean;           { zeigt gefundenes Dateiende an }
   teilzahlgelesen : boolean;           { zeigt das Lesen einer Zahl an }
{ die Prozedur DebugHilfe ist entworfen worden, um waehrend der Arbeit
  Informationen ueber den Gang der Dinge auszugeben }
procedure DebugHilfe (typ     : char;      message : string;
                      zeichen : char;      int     : longint;      nl : Boolean);
begin
  if (typ = 'e') or (typ = 'E') then write('ERROR:',   message);
  if (typ = 'z') or (typ = 'Z') then write('Zeichen:', zeichen);
  if (typ = 'm') or (typ = 'M') then write('Meldung:', message);
  if (typ = 'i') or (typ = 'I') then write('Integer:', int);
  if nl then writeln();
end;
{ die Prozedur DateienOeffnen leistet die Initialisierungsarbeit bzgl. Dateien }
procedure DateienOeffnen ( var InFile : Text; var OutFile : file of longint );
var
  Ascii, Pascal : string;
begin
  { Dateien oeffnen }
  writeln('Wie lautet der Dateiname der ascii-Datei?'); readln(Ascii);
  writeln('Wie lautet der Dateiname der Output-Datei?'); readln(Pascal);
  assign(InFile,Ascii); assign(OutFile,Pascal);
  reset(InFile); rewrite(OutFile);
end;
{ die Prozedur FindeZiffer ermittelt, welche Ziffer hinter einem Zeichen steckt }
function FindeZiffer (zeichen : char) : Integer;
begin
  FindeZiffer := ord(zeichen)-ord('0');
end;
{ die Prozedur IstZeichenZiffer stellt fest, ob ein Zeichen eine Ziffer ist }
function IstZeichenZiffer (zeichen : char) : Boolean;
begin
  IstZeichenZiffer := (ord(zeichen) >= ord('0')) and (ord(zeichen) <= ord('9'))
end;
{ Beginn des Hauptprogramms }
begin
  { Initialisierungen }
  DateienOeffnen(InputFile,OutputFile);
  zahl := 0;
  fertig := FALSE;
  teilzahlgelesen := FALSE;
  writeln('Anzahl maximl zu lesender Zeichen: '); readln(i);
\end{verbatim}
\pend

\pbegin\begin{verbatim}
  { Einleseschleife }
  while not fertig and (i>0) do
    begin
       i:=i-1;
       read(InputFile,zeichen);
       DebugHilfe('m','next char','x',0,TRUE);
       DebugHilfe('z','',zeichen,0,TRUE);
       { handelt es sich um eine Ziffer? }
       if IstZeichenZiffer(zeichen) then
         begin
            ziffer := FindeZiffer(zeichen);
            zahl := zahl*10 + ziffer;
            teilzahlgelesen := TRUE;
         end;
       { handelt es sich um ein Leerzeichen? }
       if zeichen = ' ' then
            if teilzahlgelesen then
              begin
                DebugHilfe ('m','Zahl identifiziert','x',zahl,TRUE);
                DebugHilfe ('i','','x',zahl,TRUE);
                write(OutputFile,zahl);
                zahl:=0; teilzahlgelesen:=FALSE;
              end;
       { handelt es sich um ein Zeilenende? }
       if EoLn(InputFile) then
         begin
            DebugHilfe ('m','EOLN gefunden','x',0,TRUE);
            if teilzahlgelesen then
              begin
                DebugHilfe ('m','Zahl identifiziert','x',zahl,TRUE);
                DebugHilfe ('i','','x',zahl,TRUE);
                write(OutputFile,zahl);
                zahl:=0; teilzahlgelesen:=FALSE;
              end;
            read(InputFile,zeichen);
         end;
       { handelt es sich um das Dateiende? }
       if EoF(InputFile) then
         begin
          DebugHilfe ('m','EOF gefunden','x',0,TRUE);
          Fertig := TRUE;
         end;
    end;
    { Dateien schliessen }
    close(InputFile); close(OutputFile);
    DebugHilfe ('m','Dateierstellen fertig','x',0,TRUE);
    { zur Kontrolle noch einmal lesen und zeigen }
    DebugHilfe ('m','Dateiausdruck zur Kontrolle','x',0,TRUE);
    reset(OutputFile);
    while not EoF(OutputFile) do
      begin
        read(OutputFile,zahl); writeln(zahl);
      end;
    close(OutputFile);
    DebugHilfe ('m','Programm fertig','x',0,TRUE);
end.
\end{verbatim}
\pend
} % end of footnotesize

%\section{Platz f�r Notizen}

\end{document}

\section{Vorweg}

Ziel ist, dass nicht nur einige technische Dinge �bermittelt
werden, sondern auch ein wenig Problembewu�tsein und
konzeptionelle Einsicht �bermittelt wird. Dazu sollten die
verschiedenen Punkte in folgender Struktur vorgetragen werden:

\begin{enumerate}
\item[B] Beispiel aus dem Leben
\item[R] real vorstellbares Teil-Problem
\item[E] exemplarische L�sung
\item[A] Analyse auf abstrakter Ebene
\item[K] Konzeptionelle L�sung in metasprachlicher Formulierung
\item[S] sonstige Beispiele
\end{enumerate}

und zwischen durch gilt es, Pausen der Mu�e einzulegen.

\section{Zu vermittelnde Erkenntnisse}

\frage{Wie l��t sich die Rechnerwelt strukturieren?}

\paragraph{B}
3 Skatfreunde (A, B, C)
haben Skat gespielt und wollen jetzt abrechnen.
A hat 120 Pluspunkte, B 40 Minuspunkte, C 360 Pluspunkte.
Jeder Punkt soll 1 Euro-Cent wert sein. Da sie im Kopfrechnen
schwach sind, soll das Problem mittels Computer gel�st werden.

\paragraph{R}
Es sind offensichtlich ein Programm notwendig, mit dem die notwendigen
Berechnungen erledigt werden k�nnen, zum Beispiel Addition.
\paragraph{E}
L�sung: starte Windows-Rechner, starte Excel, gib Daten ein, dr�cke
Berechnungsknopf, vernehme Ergebnis.

Aber was ist, wenn es ein solches
Programm noch nicht gibt?
\paragraph{A}
Was ist eigentlich erforderlich?
Hardware, Betriebssystem, Programm (?)

weiterhin: Algorithmus, Notation in einer Programmier-Sprache,
textuelle Eingabe mit Speicherung, Programm-�bersetzung,
Programm-Integration, Programm-Verwendung
\paragraph{K}
einfaches Schichtenkonzept:

\begin{tabular}{lp{9cm}}
Hardware       & physikalische Maschine\\
Betriebssystem & stellt Dateisystem bereit, verwaltet Kern-Speicher und
und laufende Programme, bietet �bersetzungsprogramme (Compiler)\\
Anwenderebene  & hier hantiert der Anwender und {\em ruft\/}
seine Anwendungen {\em auf.}
\end{tabular}

Nun k�nnen wir uns zu der Schicht bewegen, die uns am
bequemsten ist und dort unsere L�sung erarbeiten.

Hier: ohne L�tkolben, ohne Bitshiften auf der Maschinenebene,
sondern auf einer mittleren Entwicklungsebenen

\paragraph{S}

\frage{Warum ben�tigt man einen Dateibaum?}

Speicheraufgaben:

Das {\em Dateisystem} wird ben�tigt zur Aufbewahrung und Verwaltung der
System-Programme, System-Daten und der Anwenderdaten. Und nat�rlich auch
zur Verwaltung von Programmen, die ein Anwender entworfen hat.
Daten werden in Dateien abgelegt und diese werden in Verzeichnisse
platziert. Die Verzeichnisse sind hierarchisch strukturiert, so dass
man abgelegte Dinge wiederfinden kann. Erforderlich ist nat�rlich,
dass Namensgebung und Hierarchiestruktur zur Sicht des Anwenders (Suchenden)
passt.
\frage{Warum ben�tigt man Operationen f�r Dateibaum?}
Operationen zum Hantieren des Filesystems werden vom Anwender an
das Betriebssystem �bermittelt mittels
\begin{itemize}
\item Kommandointerpreter (shell), der Tastatureingaben entgegennimmt,
interpretiert und ggf.\ ausf�hrt
\item Ereignissen auf der Oberfl�che, zum Beispiel durch besondere Mausklicks.
\end{itemize}

Notwendig: {\em Sprache}

Beispiel: DOS (= Disk Operating System)


\frage{Welches sind die wesentlichsten Operationen mit dem Dateibaum?}
Beispiel: Skatprogramm entwickeln

Elementare T�tigkeiten:
Stelle im Dateibaum suchen und dorthin gehen,
dort ein neues Verzeichnis anlegen,
etwas dorthin kopieren,
dort Unn�tiges l�schen

\frage{Welche Schritte sind zur Programmerstellung n�tig?}

\end{document}

\paragraph{B}
\paragraph{R}
\paragraph{E}
\paragraph{A}
\paragraph{K}
\paragraph{S}

\end{document}
