Der Rechner


Im Folgenden werden von der Aufgabe ausgehend die zur Beschreibung benötigten Begriffe (blau dargestellt) möglichst sparsam eingeführt.

Das erste Programm soll den Benutzer begrüßen.

 $ = "Guten Tag!" 
Das Ganze ist eine Zuweisung. Sie hat die Struktur
Wertempfänger Zuweisungsoperator Wertlieferant.
Dabei liefert die Konstante "Guten Tag!" einen Wert, den die Variable $ empfängt. Die Variable $ ist insofern eine besondere Variable, als der empfangene Wert nicht wie sonst bei Variablen üblich zwecks späeterer Verwendung gespeichert, sondern in die Ausgabedatei geschrieben wird.
Der Wertempfänger ist hier eine einfache Variable. (Es gibt auch u.a. indizierte Variable.)
Eine einfache Variable ist (bis auf die zwei Ausnahmen $ und &) ein aus Unterstrich, und Klein- und Großbuchstaben (die unterschieden werden) bestehendes Wort.
Der Zuweisungsoperator ist hier das Gleichheitszeichen. (Es gibt auch u.a. inkrementierende Zuweisungsoperatoren.)
Der Wertlieferant ist hier eine Textkonstante (es gibt auch u.a. Zahlenkonstante).
Eine Textkonstante wird mit einfachen oder doppelten Quotierungszeichen notiert. Das Startquotierungszeichen beendet auch die Textkonstante. Innerhalb der Textkonstanten können beliebige Bytes mit Backslashnotation dargestellt werden. \n (Newline), \t(Tab), \r (CarrigeReturn) \\ (Backslash), \" und \' (Quotierungszeichen), \hh, \z999, \o777 (Hex-, Dezimal-, OktalNotation).

Das nächste Programm soll einen Kreis berechnen.

d = 2;
Umfang = d * 3.14;
$ = 'Der Umfang ist ' + Umfang;

Das ganze Programm besteht hier aus einer Sequenz von 3 einfachen Anweisungen (es gibt auch strukturierte Anweisungen, wie z.B Schleifen und Verzweigungen), die nacheinander ausgeführt werden sollen. Einfache Anweisungen werden mit Strichpunkt abgeschlossen. Als Wertlieferanten treten hier in den Zuweisungen noch die Zahlenkonstante und die Operation auf. Es gibt als Zahlenkonstante u.a. ganze Zahlen und Fließpunktzahlen . Ganze Zahlen werden als aus Dezimalziffern bestehende Zeichenketten notiert. Fließpunktzahlen haben zusätzlich noch genau einen Punkt. Operationen bestehen aus genau einem Operator und (soweit es der Operator erlaubt oder gebietet) linke und rechte Operanden . Operatoren sind u.a. die Zeichen für die Grundrechenarten aber auch Namen (z.B trigonometrische Funktionen). Operanden sind Wertlieferanden, u.a. Textkonstante, Zahlenkonstante, Variable und Operationen. Es ist nicht erforderlich zwischen Operationen und Funktionen zu unterscheiden, auch wenn man bei " - PI " die Bezeichnung Operation und bei ' sin PI ' die Bezeichnung Funktion bevorzugt. Bemerkung zur Plusoperation: Wenn mindestens einer der Operanden vom Typ Text ist, wird das Plus zur Textverkettungsoperation und eine evtl. vorhandene Zahl wird dabei Zahl-zu-Text konvertiert.

Term

Am Anfang war der Term. Einen Term zu verstehen und auszuwerten war das erste, was Recapis lernen musste. Ein Term ist u.a. eine Zahl oder eine Operation. Eine Zahl wird als Dezimalzifferstring notiert z.B. "123". Operationen sind u.a. Binär- und Monäroperationen in Infix- Präfixnotation, wie z.B. die Grundrechenarten, Potenzieren, Radizieren, Logarithmieren und trigonometrische Funktionen. "wurzel (3**2+4**2)" wird z.B. zu 5 ausgewertet.

Variable, Zuweisung

Eine Variable wird als Zeichenkette notiert, die aus Buchstaben, Ziffern und Unterstrichen besteht kann. Das erste Zeichen muss ein Buchstabe oder ein Unterstrich sein. Beispiel: "abc_1" ist eine Variable. (Die Anführungsstriche gehören nicht dazu.) Die Variable kann als Ziel einer Zuweisung einen Wert erhalten oder auch in einem Term einen Wert liefern. Dazu werden die Definitionen von Term und Operation erweitert: ein Term ist u.a. eine Zahl, eine Variable oder eine Operation. Eine Operation nimmt als Operanden einen Term. Eine weitere Operation ist die Zuweisung, die wie folgt definiert wird:
Wertempfänger Zuweisungsoperator Wertlieferant
Variable = Term
Nach "a = sin PI/2" hat die Variable a den Wert 1.

Anweisung, Programm

Eine Aufgabe wird in Anweisungen (Arbeitsschritte) aufgeteilt, die nacheinander ausgeführt werden sollen. Die Abfolge dieser Anweisungen ergibt ein Programm. Beispiel: a=3;b=4; // Initialisierungen a_2 = a**2; b_2 = b**2; c = wurzel ( // Hypothenuse berechnen! a_2 + b_2 ); Die einzelnen Anweisungen müssen mit Semikolon abgeschlossen werden. Nach '//' kann der Zeilenrest einen Kommentar enthalten. Leerzeichen und Zeilenschaltung können nach Belieben und Leserlichkeit verwendet werden.

Datentypen

Bislang ab es lediglich den Datentyp Zahl. Neben dem Inhalt (dem Wert) hat die Variable noch die weitere Eigenschaft Datentyp. Beim Datentyp Zahl wird u.a. unterschieden zwischen Ganzzahlen und Floatzahlen.

g = 314; // g hat den Datentyp Ganzzahl
f= 3.14; // f hat den Datentyp Floatzahl

Vektoren, Indizierung

Es wird ein weiter Datentyp Vektor (Array, Feld) eingeführt, der wie folgt allokiert und in einer Variablen abgelegt wird.

iv Ivector 3; // wenn Rechtsargument genau eine Ganzzahl --> Vektorlänge gemeint
fv Fvector (3.14,6.28);
sv Svector ("ab","xyz"); // wenn argument liste --> allok + init gemeint
Das i-te Elemente kann mit arr[i] referenziert werden (sowohl als Zuweisungsquelle denn auch als Zuweisungsziel). Die Elemente werden mit 0 beginnend adressiert.. Nach
 arr Ivector 3;
 arr[0]=12;
 arr[2]=arr[0];
 $=arr[2]; // gibt 12 aus
 delete arr; // danach ist arr unbekannt

Die Funktion split, die einen String bei einem definierten Zeichen in mehrere Teilstrings zerlegt, benötigt eine Variable vom Typ Stringvector, in der diese Teilstrings abgelegt werden sollen.

 sv Svector 2;
 sv split(' ','ab xy');  // zerlegt bei blank
 $=sv[1];                // gibt xy aus

Die Funktion agetfile liest eine Datei 'fn' ein und legt die Zeilen in einem Stringvector sv ab.

 'a\nb\n' putfile 'fn'; // erstellt Datei 'fn' mit 2 Zeilen
 sv agetfile 'fn';      // erstellt Stringvector sv mit 2 Elementen
 $=sv[1];               // gibt 'b' (die 2. Zeile) aus
Die Schreibweise (Vektor links von der Funktion) lehnt sich an die objektorientierte Programmierung an, in der man nach entsprechener Deklaration der Klasse
vector <string> *sv = new vector<string>;
sv.agetfile('fn');
notieren würde. Recapis-typisch kann (aber muss nicht) die Definition des stringvektors entfallen.

Schleife Verzweigung

	for  (init;bedingung;inkrement) // Schleifenkopf
		   {Schleifenrumpf}
	if   (Bedingung)
	     {if-Zweig}
	else {else-Zweig}

Beispiel: Es soll die Summe aller Zahlen von 1 bis 100 berechnetwerden.

sum = 0;
for (i=1;i\lt;=100;i++)
  sum += i;
$ = 'Die Summe ist ' + sum;

Die Schleife lehnt sich eng an die Programmiersprache C++ an. Hier der wesentliche Unterschied in C++.

int sum = 0;
for (int i=1;i<=;;i++)
  sum += i;

Untergrogamme

	function up(a)
    return a+2;
	$=up (10); // gibt 12 aus

Implizite Klammerung

Eine Operation kann 0, 1 oder 2 Operanden haben. o // keine Operanden Larg o // Präfixnotation o Rarg // Postfixnotation Larg o Rarg // Infixnotation Die Operanden können Konstante, Variable oder wertliefernde Operationen sein. einfacher Ausdruck mit nur einem Operator und zwei (Infixnotation) einem (Präfix oder Postfixnotation) oder keinem Argument sind Operator und evtl. Argumente eindeutig. Wenn ein ungeklammerter Ausdruck zwei oder mehr Operatoren enthält, muss

In "a+b*c" kann die Klamerung weggelassen werden, wenn a+(b*c) gemeint ist (Punkt- vor Strichrechnung). Operatoren haben einen Rang, der die Klammerersparnis regelt.

Text

Datentyp Text

	t = 'abc';
	$ = roem 'XIV'+2; // gibt 16 aus
	$ =  'roem 16 = '
	   + roem 16; // gibt 'roem 16 = XVI' aus
Einzelne Zeichen einer Textvariablen können per Indexierung angesprochen werden.
t = 'abc';
t[0] = char (char t[0] + 32);
$ = t; // Abc