Rechnermodell nach J. von Neumann

Steuereinheit Befehlsregister Befehls-Zählerregister

Eingabeeinheit Speicher

Ausgabeeinheit

Recheneinheit

Zentralregister

[figure] [figure] [figure] [figure] [figure] [figure] [figure]

Steuersignale

[figure]

Daten und Befehle

Literatur

Programmiersprache C++ (C++11/14)

B. Stroustrup: Programming: Principles and Practice Using C++. Second Edition. Addison-

Wesley 2014. B. Stroustrup: The C++ Programming Language. Fourth Edition. Addison-Wesley 2013. U. Breymann: Der C++ Programmierer. Hanser 2015. N. Josuttis: The C++ Standard Library - A Tutorial and Reference. Addison-Wesley 2012.

Programmiersprache C (ANSI C)

B. W. Kernighan, D. M. Ritchie: Programmieren in C. Zweite Ausgabe, ANSI C. Hanser Verlag

1990. P. J. Plauger: The Standard C Library. Prentice-Hall 1992.

Online-Referenzmaterial

   • http://cppreference.com (C/C++)
   • http://cplusplus.com/reference (C++)

Der hypothetische Rechner M

1. Aufbau:

Der Rechner besteht aus dem Zentralregister ZR und N + 1 Speicherzellen S 0,…,SN, die sowohl Zahlen als auch Befehle beinhalten können. Schreibweise: ⟨Sn⟩:=Inhalt der Speicherzelle Sn.

2. Befehlsvorrat:

Ein-/Ausgabe:

READ  Einlesen der nächsten auf dem Eingabemedium zur Verarbeitung anste- henden Zahl ins ZR

PRINT Ausgabe von ⟨ZR⟩ auf das Ausgabemedium PRINT(n) Ausgabe von ⟨Sn⟩ auf das Ausgabemedium WRITE ”… ” Ausgabe des Textes … auf das Ausgabemedium … darf den Textbegrenzer ” nicht enthalten

Transporte:

STORE(n) ⟨ZR⟩ nach Sn kopieren RECALL(n) ⟨Sn⟩ nach ZR kopieren CHANGE(n) ⟨ZR⟩ und ⟨Sn⟩ austauschen

Arithmetik:

ADD(n) ⟨ZR⟩ + ⟨Sn⟩ nach ZR bringen SUB(n) ⟨ZR⟩ − ⟨Sn⟩ nach ZR bringen MULT(n) ⟨ZR⟩ ∗ ⟨Sn⟩ nach ZR bringen DIV(n) ⟨ZR⟩/⟨Sn⟩ nach ZR bringen, falls ⟨Sn⟩ ≠ 0 ADD, MULT analog, wobei hier auch als zweiter Operand statt Sn das ZR fungiert

Funktionen:

SIGN  sgn(⟨ZR⟩)  (Vorzeichen) nach ZR bringen
ABS  |⟨ZR⟩|  (Betrag) nach ZR bringen
ENTIER  [⟨ZR⟩]  (größte ganze Zahl kleiner gleich) nach ZR bringen
SQRT  \sqrt{⟨ZR⟩}  (Quadratwurzel) nach ZR bringen, falls ⟨ZR⟩ ≥ 0

CONST(x) die Zahl x im ZR erzeugen

Verzweigungen:

GOTO(n) Fortführung des Programmablaufs mit dem Befehl in Zelle Sn

\begin{matrix}LESS(n) & falls ⟨ZR⟩ < 0 \\ GREATER(n) & falls ⟨ZR⟩ > 0 \\ EQUAL(n) & falls ⟨ZR⟩ = 0 \end{matrix} \}

Fortführung des Programmablaufs mit dem Befehl in Zelle Sn

Programmsteuerung:

START(n)  Dieser Befehl muß in Zelle S0 stehen und definiert den Programmanfang; erster Programmbefehl steht in Zelle Sn

STOP beendet den Programmablauf

NOP Leeranweisung; Register und Speicherzellen bleiben unverändert Beispiel 1 (Heronsche Formel)

a, b, c: Seiten eines Dreiecks F = \sqrt{s(s − a)(s − b)(s − c)} mit s = (a + b + c)/2 : Dreiecksfläche Eingabe: a,b,c Ausgabe: F

Maschinenprogramm:

Adr. Befehl ZR S1 S2 S3 S4 Kommentar
S0 START(5)
S1  Speicherplatz für a
S2  “  b
S3  “  c
S4  “  s
S5 READ  a  read(a)
S6 STORE(1)  a
S7 READ b read(b)
S8 STORE(2)  b
S9 READ c read(c)
S10 STORE(3)  c
S11 ADD(1)  c + a
S12 ADD(2)  c + a + b
S13 STORE(4)  c + a + b
S14 CONST(2)  2
S15 CHANGE(4) a + b + c 2
S16 DIV(4)  (a + b + c)/2
S17 STORE(4)  s
S18 SUB(1)  s − a
S19 CHANGE(2) b s − a
S20 SUB(4)  b − s
S21 MULT(2)  (b − s)(s − a)
S22 CHANGE(3) c (b − s)(s − a)
S23 SUB(4)  c − s
S24 MULT(3)  (c − s)(b − s)·
(s − a)
S25 MULT(4)  s(s − a)(s − b)·
(s − c)
S26 SQRT  F
S27 WRITE “F = “
S28 PRINT  Ausgabe von F
S29 STOP

C++-Programm in Datei heron.cpp:

#include <iostream>
#include <cmath>
using namespace std;
int main()
{
 double a,b,c,s,F;
 cout << "a b c: ";
 cin >> a >> b >> c;
 s = (a+b+c)/2.0;
 F = sqrt(s*(s-a)*(s-b)*(s-c));
 cout << "F=" << F << endl;
 return 0;
}

                                   Übersetzen: c++ heron.cpp (oder: clang++ heron.cpp)

Starten:  ./a.out

Beispiel 2 (Berechnung des arithmetischen Mittels aus Messdaten)

Messdaten: x_{k} ≥ 0, k = 1, …, n mit n ∈ ℕ, z.B. aus einem physikalischen Experiment Eingabe: x_{1}, x_{2}, …, x_{n}, −1 ⟵ Endekennung Die Messdaten können nicht gespeichert werden.

Ausgabe: x̄ = \frac{1}{n} ∑_{k=1}^{n} x_{k}

Maschinenprogramm:

Adr. Befehl  ZR  S1 S2 Kommentar
S0 START(6)
S1  k − 1
S2  s_{k−1} := ∑_{i=1}^{k−1} x_{i}
S3  nicht belegt
S4  “
S5  “
S6 CONST(0)  0  Initialisieren
S7 STORE(1)  0  “
S8 STORE(2)  0  “
S9 READ  x_{k}  Schleifenanfang
S10 LESS(17)
S11 ADD(2)  s_{k−1} + x_{k}
S12 STORE(2)  s_{k}
S13 CONST(1)  1
S14 ADD(1)  (k − 1) + 1
S15 STORE(1)  k
S16 GOTO(9)  Schleifenende
S17 RECALL(2) s_{n} n s_{n}
S18 DIV(1)  s_{n}/n
S19 WRITE “MW=“  MW ausgeben
S20 PRINT “
S21 STOP

Die im Kommentar angegebene Speicherbelegung (S1-S2) bezieht sich auf die Situation nach Ausführung der Anweisung S9.

C++-Programm in Datei mittelw.cpp:

#include <iostream>
using namespace std;
int main()
{
 int k=0;
 double x,s=0;
 cout << "x1 ... xn -1: ";
 cin >> x;
 while(x>=0) {
   s=s+x;
   k=k+1;
   cin >> x;
 }
 cout << "MW=" << s/k << endl;
 return 0;
}

                              Übersetzen: c++ mittelw.cpp (oder: clang++ mittelw.cpp)

Starten:  ./a.out