# Lektion 11
# Ein- und Ausgabe von Daten
#  2017  Friedrich U. Mathiak, 
# mathiak@mechanik-info.de
# 
> restart:
# Die Steuerung der Ein- und Ausgabe erfolgt in Maple ber 
# 1.) den Bildschirm oder 
# 2.) die Tastatur.
# Mit dem Befehl print erfolgt die Ausgabe auf dem Bildschirm. 
> print(Olli,Berta,Banane);
> print(Matrix(3,3,m));
# Achtung, bei Benutzung des  ditto-Operators  kommt nicht das gewnschte Ergebnis
> %;
# Das Kommando  lprint  liefert die Bildschirmdarstellung der entsprechenden Ausdrcke in einem eindimensionalen Format
> lprint(Olli,Berta,Banane);
> lprint(Matrix(3,3,m));
# Auch hier gilt wieder
> %;
# Mit dem Befehl  printf  kann eine formatierte Ausgabe erzeugt werden. Dazu folgende Beispiele:
> printf("%s\n %d ",Olli,123);
> for i to 5 do printf("%5d %3d\n",i,2-i^2) end do;
> printf("%-10g  %G  %g", 123, 123*(1/456), 123456789);
> x:=15;y:=-1/x;
> printf("x=%+06.2f y=%+0*.*f y=%a ",x,6,2,y,y);
> printf("Der %-s fr das Leben\n%-s %-s %-s",Preis,ist,der,Tod);
# Zum Lesen von Text ber die Tastatur ist der Befehl  readline  zu verwenden:
> text:=readline(terminal);
# Um einen Ausdruck ber den Bildschirm einzugeben, verwenden wir den Befehl readstat
> xyz:=readstat("Geben Sie den Wert fr z ein:");
# Zeichenketten, die einen Maple-Ausdruck enthalten, knnen mit dem Befehl  parse  in einen Maple-Ausdruck umgewandelt werden.
> a:='a':x:='x':
> str:="a*x^2+b*x+c";
> poly:=parse(str);
> x:=1;
> poly;
# Achtung: Fr die weitere Anwendung ist zu jedem Neustart des aktuellen Arbeitsblattes der Pfadname desjenigen Verzeichnisses einzustellen, in dem sich die Maple-Arbeitsbltter befinden. Der aktuelle Pfad kann dem unten rechts angegebenen Windows-Fenster entnommen und bei Bedarf dort auch verndert werden. Der Befehl currentdir liefert als Rckgabewert den Namen des gerade benutzten Verzeichnisses: 
> olddir:=currentdir();         #Aktuelles Verzeichnis
;
# Wir erzeugen ein leeres Unterverzeichnis  mit dem Namen  meinverzeichnis,  in das wir spter Daten hineinschreiben. Bei wiederholtem Aufruf zeigt Maple an, dass das Verzeichnis bereits existiert und nicht leer ist.
> filename:="meinverzeichnis";       #Filename
;
> mkdir(filename);              #Erstellen eines neuen Verzeichnisses
;
# Wir wechseln jetzt in das neue Verzeichnis:
> currentdir(filename):currentdir();
# Um Zuordnungsanweisungen einer Maple-Sitzung in dem gerade benutzen Verzeichnis zu speichern, kann der Befehl save eingesetzt werden.Wir geben im Folgenden einige Zuordnungsanweisungen an, die anschlieend abgespeichert werden.
> x:='x':a3:=x^3;a2:=x^2;a1:=x;poly:=3*a1+4*a2+a3;
> save a3,a2,a1,poly,filename;
# Wir lassen uns den Inhalt des aktuellen Verzeichnisses anzeigen:
> ssystem(dir);               #Zeigt den Inhalt des aktuellen Verzeichnisses an
;
# Der Inhalt der Datei  matrixdaten.txt   kann unter Windows mit dem Texteditor angesehen werden. 
# Zum Einlesen von Files, die Maple-Zuordnungsanweisungen enthalten, kann der Befehl read benutzt werden.
> read filename;
# Wir erstellen fr die folgenden Anwendungen eine (3x3)- Matrix, die wir anschlieend unter dem Dateinamen matrixdaten.txt  mit dem Befehl  ExportMatrix  in das aktuelle Verzeichnis schreiben:
> L:=Matrix(3,3,[1,0.5,0.7,2,5.6,7.0E4,3,4.3,8.4]);
> filename:="matrixdaten.txt";
> ExportMatrix(filename,L):
# Mit dem Befehl  ImportMatrix  kann eine Matrix eingelesen werden.
> C:=ImportMatrix(filename);LinearAlgebra[Transpose](C);
# Wir lassen uns den Inhalt des Verzeichnisses anzeigen:
> ssystem("dir");
# Mit dem Befehl readline knnen die Daten der Datei matrixdaten.txt  zeilenweise eingelesen werden.
> readline(filename);whattype(%);
# Der Befehl readline  ffnet die Datei  matrixdaten.txt  und liest die erste Zeile. Die Daten werden als Zeichenkette (string) interpretiert. Da das Kommando readline die Daten als Zeichenkette zurckgibt, wird  dieser Befehl vorzugsweise  fr das Einlesen von Textdaten benutzt. 
# Um die verbleibenden Zeilen mit readline  einzulesen, ist der Befehl zu wiederholen.
> readline(filename);
> readline(filename);
> readline(filename);
# Die gegenwrtige Zeigerposition innerhalb der Datei ist das Dateiende. Ein weiterer Aufruf von readline gibt eine null  zurck und  schliet  automatisch die Datei an diesem Punkt.  
# Die Wiederholung des readline-Kommandos lsst sich in einer Schleife bewerkstelligen.
> liesfile1:=proc(s::string)
> local werte;
> do werte:= readline(s);
>   if werte = 0 then break end if;
>   print(werte);
> end do;
> end proc:
> liesfile1(filename);
# Mit Hilfe des Befehls fscanf knnen zum zeilenweisen Lesen einer Datei gezielt Formatspezifikationen vorgenommen werden. Damit lassen sich Dateien einlesen, die sowohl Text als auch Zahlen enthalten. Der Befehl gibt eine Liste des gescannten Objekts zurck. Die Krzel d und f  bezeichnen dabei eine Ganz-  bzw. Gleitpunktzahl.
> fscanf(filename,"%d%f%f");
# Um die verbleibenden Zeilen einzulesen, ist der Befehl zu wiederholen. Allerdings schliet Maple hier nicht automatisch die Datei, deshalb wird diese mit dem Befehl close  geschlossen. Die Wiederholung des Kommandos lsst sich wieder durch eine Prozedur erledigen.
> fscanf(filename,"%d%f%f");fscanf(filename,"%d%f%f");fscanf(filename,"%d%f%f"); close(filename);
# Das readdata Kommando liest nummerische Daten (Ganzzahlen oder Dezimalzahlen) aus einer Textdatei. Nach dem Lesen wird die Datei automatisch geschlossen. Ist n die Anzahl der Spalten in der Textdatei, dann lautet der Befehl
> readdata(filename,3);
# Bei diesem Aufruf ohne Formatangabe werden alle Werte als Dezimalzahlen zurckgegeben. Soll beispielsweise die 1. Spalte als Ganzzahl und die 2. und 3. Spalte als Dezimalzahl zurckgegeben werden, dann ist das gewnschte Format anzugeben
> readdata(filename,[integer,float,float]);
# Diese Daten knnen weiterverarbeitet werden, beispielsweise
> A:=convert(%,Matrix);LinearAlgebra[Determinant](A);
# Auch zum Schreiben von Daten in externe Dateien stehen mehrere Maple-Kommandos zur Verfgung.  Sollen beispielsweise Sequenzen von Zeichen in eine Datei geschrieben werden, dann wird von Maple das Kommando writeline  zur Verfgung gestellt. Wir schreiben zwei Textzeilen in die Datei Ausgabe_01:
> T1:="Das ist ein Text": T2:="Das ist noch ein Text":
> writeline("Ausgabe_01",T1,T2); close("Ausgabe_01");
# Die Anzahl der  in die Ausgabedatei geschrieben Zeichen wird angegeben. Da die Daten gepuffert werden, wird erst beim Schlieen (close) in die Datei geschrieben. 
# Der Befehl writedata vereinigt die Operationen ffnen und Schreiben der Daten im spezifizierten Format sowie das Schlieen der Datei. 
> B:=convert(A,array);
> writedata("Ausgabe_02",B,[integer,integer,float]);
# Da wir den beiden ersten Spalten das Format integer zugeordnet haben, steht nun in der Datei Ausgabe_02 folgendes
> s:=readdata("Ausgabe_02",[integer,integer,float]);
# Sollen die Daten formatiert ausgegeben werden, dann kann der Befehl fprintf benutzt werden. In die neue Datei mit dem Namen Ausgabe_03 werden die Daten gepuffert geschrieben. Der abschlieende Befehl close schliet diese gepufferte Datei.
> for wert in s do
> fprintf("AUSGABE_03","%d %e %E\n",wert[1],wert[2],wert[3]);
> end do:
> close("AUSGABE_03");
# Das Kommando  fprintf  schreibt die Werte jeder Sequenz innerhalb der Sequenz s in eine Zeile der Ausgabedatei AUSGABE_03. Die Argumente  %d   %e  %E  legen das Datenformat fest. Der erste Wert ist demnach eine Ganzahl (Integer) und die beiden folgenden Werte werden in wissenschaftlicher Darstellung ausgegeben. Damit folgt beispielsweise fr die 1. Zeile 
# 1      0.000000e+00     7.000000E-01
# Ein Zwischenraum (blank) separiert die Daten innerhalb einer Zeile. Nach einem Zeilensprung mit \n wird der nchste Datensatz in eine neue Zeile geschrieben.
# Die Befehle writeto und appendto   kopieren alle nachfolgenden Maple-Kommandos in eine Datei  (hier MapleCopy.mw) . Die nach dem Befehl writeto von Maple erzeugten Ergebnisse werden nicht auf dem Bildschirm dargestellt.  Die Anweisung writeto berschreibt eine bestehende Datei. Die Befehle writeto(terminal) und auch appendto(terminal) veranlassen  Maple, die jeweils nachfolgenden Zeilen auf den ursprnglichen Ausgabekanal (Bildschirm) zu schicken
> currentdir();
> writeto("MapleCopy.mw");
> z:=ln(3*x+I*y);
> #Das ist ein Text
;
# Dies ist auch ein Text, der aber nicht kopiert wird!
> diff(z,x);
> writeto(terminal); #Es erfolgt wieder die Standardausgabe auf dem Bildschirm 
;
> f:=x^2+2*x-4;solve(f);
# Der Befehl appendto hngt weitere Befehlszeilen an die Datei MapleCopy.mw (falls diese besteht), ohne diese jedoch zu berschreiben. Besteht die Datei nicht, dann wirkt appendto wie writeto.
> appendto("MapleCopy.mw");
> r:=print(L):
> f:=Transpose(L);
> appendto(terminal);#Es erfolgt wieder die Standardausgabe auf dem Bildschirm 
;
> ln(3.);
> currentdir(olddir):currentdir();
> 
;
