|
11.7.1.3 Text_IO.Complex_IO
Dieses Paket enthält Routinen, um komplexe Zahlen in (aus) Dateien zu schreiben
(lesen), sowie komplexe Zahlen in (aus) Zeichenketten zu wandeln (berechnen).
Das generische Kindpaket "Text_IO.Complex_IO" wird wie folgt deklariert:
with Ada.Numerics.Generic_Complex_Types;
generic
with package Complex_Types is new Ada.Numerics.Generic_Complex_Types
(<>);
package Ada.Text_IO.Complex_IO is
use Complex_Types;
Default_Fore : Field := 2;
Default_Aft : Field := Real'Digits - 1;
Default_Exp : Field := 3;
procedure Get ( File : in File_Type;
Item
: out Complex;
Width
: in Field := 0);
procedure Get ( Item : out Complex; Width :
in Field := 0);
procedure Put ( File : in File_Type;
Item
: in Complex;
Fore
: in Field := Default_Fore;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp);
procedure Put ( Item : in Complex;
Fore
: in Field := Default_Fore;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp);
procedure Get ( From : in String;
Item
: out Complex;
Last
: out Positive);
procedure Put ( To : out String;
Item
: in Complex;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp);
end Ada.Text_IO.Complex_IO;
|
Die zur Verfügung gestellten Prozeduren lesen (schreiben) die geeignet
getrennten Teile von komplexen Zahlen aus (in) Dateien oder lesen diese als Eingabe
von der Tastatur bzw. schreiben diese auf den Bildschirm.
Die Bedeutung der Parameter zur Steuerung der Ausgabe, wie "Fore",
"Aft" oder "Exp", werden in der Beschreibung zu "Text_IO"
in Anlage A erklärt. Für eine Instanz des generischen Pakets "Complex_IO"
können die voreingestellten Werte verändert werden.
Beispiel:
type real_type is new float;
package complex_types is new ada.numerics.generic_complex_types( real_type );
package complex_io is new ada.text_io.complex_io( complex_types );
-- Änderung der Voreinstellung der Vorkommastellen
complex_io.default_fore := 5; |
Es gibt zwei Prozeduren "Put" zum Schreiben von komplexen Zahlen.
Eine schreibt die komplexe Zahl auf den Bildschirm, die zweite in eine Datei und
daher hat diese auch einen zusätzlichen Parameter, den Dateizeiger.
Beispiel:
procedure Put ( File : in File_Type;
Item
: in Complex;
Fore
: in Field := Default_Fore;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp);
procedure Put ( Item : in Complex;
Fore
: in Field := Default_Fore;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp); |
Die Ausgabe enthält nicht nur zwei Gleitpunktzahlen, den reellen und
imaginären Anteil der komplexen Zahl, sondern zusätzliche Zeichen,
die diese beiden Zahlen separieren und als ein Zahlenpaar kennzeichnen.
Die Ausgabe ist durch folgende nacheinander ausgeführten fünf
Schritte charakterisiert:
1. Eine öffnende Klammer wird ausgegeben.
2. Der reelle Anteil der komplexen Zahl wird ausgegeben. Das Format des reelle
Anteils entspricht dem Format, mit dem dieser Anteil als
Gleitpunktzahl durch eine Instanz von "Text_IO.Float_IO" zu "Complex_Types.Real"
mittels "Put" ausgegeben würde unter entsprechender Berücksichtigung
der Parameter "Fore",
"Aft" und "Exp".
3. Ein Komma wird ausgegeben.
4. Der imaginäre Anteil der komplexen Zahl wird ausgegeben. Das Format korrespondiert
mit der Aussage zu "der reelle Anteil".
5. Eine schließende Klammer wird ausgegeben.
Beispiel:
type real_type is new float;
package complex_types is new ada.numerics.generic_complex_types(
real_type );
package complex_io is new ada.text_io.complex_io(
complex_types );
w : complex_types.complex := ( 0.5, 1.0 );
begin
complex_io.put( item => w, aft => 5 );
-- Erzeugt folgende Ausgabe: (-5.0000E-01, 1.00000E+00)
-- Voreinstellung: Default_Fore : Field := 2;
-- Default_Exp : Field := 3; |
Es gibt zwei Prozeduren "Get" zum Lesen von komplexen Zahlen. Eine
liest die komplexe Zahl als
Eingabe von der Tastatur, die zweite aus einer Datei und daher hat diese auch
einen zusätzlichen
Parameter, den Dateizeiger. Beide können komplexe Zahlen lesen, wie sie mit
"Put" erzeugt wurden. Dabei sind folgende Veränderungen ohne Einfluß:
- Leerzeichen, Zeilen- oder Seitenumbrüche zwischen der öffnenden
Klammer und dem reellen Anteil bzw. zwischen dem imaginären Anteil und der
schließenden Klammer.
- Bei fehlendem Komma muß mindestens ein Leerzeichen oder ein Zeilenumbruch
den reellen Anteil vom imaginären Anteil trennen.
- Bei fehlender öffnender Klammer wird auch keine schließende Klammer
erwartet. Das Lesen wird nach dem imaginären Anteil beendet.
Beispiel:
procedure Get ( File : in File_Type;
Item
: out Complex;
Width
: in Field := 0);
procedure Get ( Item : out Complex;
Width
: in Field := 0); |
Zwei Besonderheiten sind zu beachten, wenn der Parameter "Width" ungleich
null ist:
- Fehlt das trennende Komma, so müssen die beiden Anteile mindestens durch
ein Leerzeichen getrennt sein.
- Es werden genau "Width"-viele Zeichen gelesen oder bis zum Zeilenende,
je nachdem, welche Bedingung zuerst eintrifft.
Dabei werden Leerzeichen mitgezählt.
Die Ausnahme "Text_IO.Data_Error" wird beim Lesen ausgelöst,
wenn entweder der reelle bzw. imaginäre Anteil nicht ein Untertyp von "Complex_Types.Real"
ist oder die gelesene Zeichenkette nicht die (oben beschriebene) geforderte Syntax
aufweist.
Es gibt zwei Prozeduren, um aus einer Zeichenkette eine komplexe Zahl zu lesen
bzw. in eine zu schreiben.
Beispiel:
procedure Get ( from : in String;
Item
: out Complex;
Last
: out Positive );
procedure Put ( to : out String;
Item
: in Complex;
Aft
: in Field := Default_Aft;
Exp
: in Field := Default_Exp); |
Der Parameter "Last" der Prozedur "Get" liefert den Index
des letzten gelesenen Zeichens. Stimmt der reelle bzw. der imaginäre Anteil
nicht mit einem Untertyp von "Complex_Types.Real" überein oder
ist die Syntax der Zeichenkette nicht die, wie sie für "Put" auf
eine Datei oben beschrieben wurde, so wird die Ausnahme "Text_IO.Data_Error"
ausgelöst. Ist der durch den Parameter "to" der Prozedur "Put"
reservierte Platz zu klein, um die komplexe Zahl samt den zusätzlichen Zeichen
aufzunehmen, so wird die Ausnahme "Text_IO.Layout_Error" ausgelöst.
Dieses Kindpaket definiert keine Ausnahme, sondern verwendet geeignete aus
"Text_IO", wie "Data_Error" (Prozeduren "Get") und
"Layout_Error" (Prozedur "Put" für Zeichenketten).
|