11. Anlage
 
zurück
11.6. Anlage F "Informationssysteme"


Die Anlage "Informationssysteme" erleichtert die Entwicklung kommerzieller Anwendungen in Ada, die traditionell in COBOL geschrieben wurden. Sie stellt Möglichkeiten zur Berechnung und berichtsorientierten Ausgabe von dezimalen Zahlen zur Verfügung:
  • eine dezimale Arithmetik mit mindestens 18 Ziffern Genauigkeit;
  • lesbare Formate mit Steuerungsmöglichkeiten für die Form und die Position des Währungssymbols, des Vorzeichens, des Zifferntrennzeichens und der Radixmarkierung, d. h. des Trennzeichens zwischen dem ganzen und dem gebrochenen Anteil einer Zahl;
  • Schnittstellen zu Daten, die von anderen Sprachen erzeugt wurden, oder Programmen, die in anderen Sprachen geschrieben wurden (insbesondere in C oder COBOL).
Bemerkung:
Die Regeln für die aufbereiteten Ausgaben basieren auf COBOL (ANSI X3.23:1985, bestätigt von der ISO als ISO 1989-1985), mit folgenden Unterschieden:
  • Die COBOL-Vorkehrungen für die Zeichenkettenfestlegung und für das "P"-Format fehlen in Ada
  • Die folgenden Möglichkeiten von Ada gibt es in COBOL nicht:
    - die Plazierung des Währungssymbols hinter der Zahl,
    - die Festlegung von aufbereiteten Ausgabezeichenketten für Währungszeichenketten aus mehreren Zeichen, einschließlich der   Unterstützung von längenerhaltenden und längenerweiternden Währungssymbolen in den Musterzeichenketten,
    - die Festlegung der Radixmarkierung, des Zifferntrennzeichens und des Füllzeichens und
    - die Klammerung von negativen Werten.
Die Grenze von 30 Zeichen für Max_Picture_Length stimmt mit der in COBOL überein.


Eine Attributvereinbarungsklausel legt die Grundzahl für einen dezimalen Untertyp fest.

Machine_Radix kann für einen ersten dezimalen Untertyp mit einer Attributvereinbarungsklausel (attribute_definition_clause <BNF>) festgelegt werden. Der Ausdruck einer solchen Klausel muß statisch sein, und die Werte müssen 2 oder 10 sein. Ein Wert von 2 ergibt einen binären Basisbereich; ein Wert von 10 ergibt einen dezimalen Bereich.

Für die interne Darstellung von Objekten des Untertyps S sollte "packed decimal" verwendet werden, wenn S'Machine_Radix = 10 gilt.

Beispiel:

type Money is delta 0.01 digits 15;
for Money’Machine_Radix use 10;


Das Paket "Decimal" vereinbart eine Menge von Konstanten, die die implementierungs-abhängige Ausdehnung für dezimale Typen festlegen, und eine generische Prozedur für die dezimale Division.

Das Bibliothekspaket "Decimal" hat folgende Vereinbarung:

package Ada.Decimal is
   pragma Pure(Decimal);
   Max_Scale : constant := implementierungsabhängig;
   -- Max_Scale ist das größte N, mit dem 10.0**(-N) als Delta eines
   -- dezimalen Typs zulässig ist. Sein Typ ist Universal_Integer.
   -- Decimal.Max_Scale soll mindestens 18 sein.

   Min_Scale : constant := implementierungsabhängig;
   -- Min_Scale ist das kleinste N, mit dem 10.0**(-N) als Delta eines
   -- dezimalen Typs zulässig ist. Sein Typ ist Universal_Integer.
   -- Decimal.Min_Scale soll höchstens 0 sein.

   Min_Delta : constant := 10.0**(-Max_Scale);
   -- Min_Delta ist der kleinste Wert, der für delta in einer
   -- dezimalen Festpunktvereinbarung (decimal_fixed_point_definition
   -- <BNF>) zulässig ist. Sein Typ ist Universal_Real.

   Max_Delta : constant := 10.0**(-Min_Scale);
   -- Max_Delta ist der größte Wert, der für delta in einer dezimalen
   -- Festpunktvereinbarung (decimal_fixed_point_definition <BNF>)
   -- zulässig ist. Sein Typ ist Universal_Real.

   Max_Decimal_Digits : constant := implementierungsabhängig;
   -- Max_Decimal_Digits ist der größte Wert, der für Ziffern in einer
   -- dezimalen Festpunktvereinbarung (decimal_fixed_point_definition
   -- <BNF>) zulässig ist. Sein Typ ist Universal_Integer.
   -- Max_Decimal_Digits soll mindestens 18 sein.

   generic
      type Dividend_Type is delta <> digits <>;
      type Divisor_Type is delta <> digits <>;
      type Quotient_Type is delta <> digits <>;
      type Remainder_Type is delta <> digits <>;
   procedure Divide (Dividend : in Dividend_Type;
   Divisor : in Divisor_Type;
   Quotient : out Quotient_Type;
   Remainder : out Remainder_Type);
   -- Divide hat folgende Wirkung: Der Wert von Quotient ist
   -- Quotient_Type(Dividend/Divisor). Der Wert von Remainder ist
   -- Remainder_Type(Intermediate), wobei Intermediate der Unterschied
   -- zwischen Dividend und dem Produkt von Divisor und Quotient ist.
   -- Dieses Ergebnis wird mit hoher Genauigkeit berechnet.
   pragma Convention(Intrinsic, Divide);
end Ada.Decimal;

Die Entscheidung, ob bei der Division gerundet oder abgeschnitten wird, wird entweder durch die Anwendung des Funktionsattributes Quotient_Type’Round oder durch die Anwendung der Konvertierung Quotient_Type auf den Ausdruck Dividend/Divisor erreicht.

Die Kindpakete "Text_IO.Editing" und "Wide_Text_IO.Editing" unterstützen die formatierte und lokal bestimmte Ausgabe von dezimalen Daten, die auf Musterzeichenketten basiert.

Aufbereitete Ausgabe für dezimale Daten:
  • Bilden einer Musterzeichenkette |
  • Erzeugung einer aufbereiteten Ausgabe |--Links zu den Kapiteln 11.6.1 ..4
  • Das Paket "Text_IO.Editing" |
  • Das Paket "Wide_Text_IO.Editing" |
Siehe auch Festpunkttypen und Operationen auf Festpunkttypen, Typkonvertierungen, Darstellungsattribute, Schnittstelle zu COBOL und Anlage G "Numerik".

Die Pakete für die Zeichen- und Zeichenkettenbehandlung in Anlage A "Vordefinierte Sprachumgebung" sind auch für Informationssysteme wichtig.

Wenn COBOL (beziehungsweise C) in der Zielumgebung weit verbreitet ist, sollten Implementierungen, die die Anlage F "Informationssysteme" verwirklichen, das Kindpaket "Interfaces.COBOL" (beziehungsweise C) bereitstellen, das in Anlage B festgelegt ist, sodaß Ada-Programme Schnittstellen zu dieser Sprache haben können.

Aufbereitete Ausgabe für dezimale Typen

Die Kindpakete "Text_IO.Editing" und "Wide_Text_IO.Editing" sehen die lokal bestimmte formatierte Textausgabe vor, die als aufbereitete Ausgabe (edited output) bekannt ist. Eine aufbereitete Ausgabezeichenkette ist eine Funktion eines numerischen Wertes, programmabhängigen lokalen Elementen (program-specifiable locale elements) und einem Steuerungswert für das Format. Der numerische Typ ist von einem dezimalen Typ. Die lokalen Elemente sind:
  • die Zeichenkette für die Währung (currency string),
  • das Trennzeichen für Zifferngruppen,
  • das Markierungszeichen für den Radix (Trennzeichen zwischen dem ganzen und dem gebrochenen Anteil einer Zahl) und
  • das Füllzeichen, das führende Nullen eines numerischen Wertes ersetzt.
Bei Text_IO.Editing sind die aufbereitete Ausgabe und die aktuelle Zeichenkette vom Typ String, und die lokalen Zeichen sind vom Typ Character. Bei Wide_Text_IO.Editing werden entsprechend die Typen Wide_String und Wide_Character verwendet.

Jedes lokale Element hat einen Standardwert, der ersetzt oder explizit überschrieben werden kann.

Der Wert für die Formatsteuerung ist vom privaten Typ Picture (Muster). Er bestimmt die Zusammensetzung der aufbereiteten Ausgabezeichenkette und steuert die Form und die Position des Vorzeichens, die Position der lokalen Elemente und der dezimalen Ziffern, die An- oder Abwesenheit einer Radixmarkierung, die Unterdrückung von führenden Nullen und das Einfügen besonderer Zeichenwerte.

Ein Musterobjekt (picture object) wird aus einem Zeichenkettenwert und einem booleschen Wert zusammengesetzt. Die Musterzeichenkette (picture string) dient als Schablone für die aufbereitete Ausgabezeichenkette. Der boolesche Wert legt fest, ob eine Zeichenkette mit allen Leerzeichen erzeugt wird, wenn die Zahl 0 ist. Die Musterzeichenkette enthält eine Folge von Symbolen aus einem oder zwei Zeichen, wobei jedes als Platzhalter für ein Zeichen oder eine Zeichenkette an der entsprechenden Stelle in der aufbereiteten Ausgabezeichenkette dient. Die Symbole für die Musterzeichenkette werden in mehrere Kategorien eingeteilt. Die Einteilung ergibt sich aus der Wirkung auf die aufbereitete Ausgabenzeichenkette.

Syntaktische Kategorien

Dezimale Ziffer "9"
Radixsteuerung "." "V"
Vorzeichensteuerung "+" "-" "<" ">" "CR" "DB"
Währungssteuerung "$" "#"
Nullunterdrückung "Z" "*"
Einfache Einfügung "_" "B" "0" "/"

Die Einträge können groß oder klein geschrieben werden. Gemischte oder kleingeschriebene Formen von "CR" und "DB" und kleingeschriebene Formen von "V", "Z" und "B" haben die gleiche Wirkung wie die großgeschriebenen Formen.

Ein Beispiel für eine Musterzeichenkette ist <###Z_ZZ9.99>. Wenn die Währungszeichenkette "FF", das Trennungszeichen "," und die Radixmarkierung "." ist, dann sind die Musterzeichenketten für die dezimalen Werte 32.10 und -5,432.10 "bbFFbbb32.10b" beziehungsweise "(bFF5,432.10)", wobei "b" das Leerzeichen angibt.

Die generischen Pakete "Text_IO.Decimal_IO" und "Wide_Text_IO.Decimal_IO" (siehe Ein/Ausgabe für reelle Typen Anlage A) stellen die Texteingabe und nicht aufbereitete Textausgabe für dezimale Typen zur Verfügung.

Eine Musterzeichenkette ist vom Typ Standard.String, sowohl für Text_IO.Editing als auch für Wide_Text_IO.Editing.


 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.