# 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 gewünschte Ergebnis
> %;
# Das Kommando  lprint  liefert die Bildschirmdarstellung der entsprechenden Ausdrücke 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 für 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 für z ein:");
# Zeichenketten, die einen Maple-Ausdruck enthalten, können 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: Für die weitere Anwendung ist zu jedem Neustart des aktuellen Arbeitsblattes der Pfadname desjenigen Verzeichnisses einzustellen, in dem sich die Maple-Arbeitsblätter befinden. Der aktuelle Pfad kann dem unten rechts angegebenen Windows-Fenster entnommen und bei Bedarf dort auch verändert werden. Der Befehl currentdir liefert als Rückgabewert den Namen des gerade benutzten Verzeichnisses: 
> olddir:=currentdir();         #Aktuelles Verzeichnis
;
# Wir erzeugen ein leeres Unterverzeichnis  mit dem Namen  meinverzeichnis,  in das wir später 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 anschließend 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 für die folgenden Anwendungen eine (3x3)- Matrix, die wir anschließend 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 können 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 zurückgibt, wird  dieser Befehl vorzugsweise  für das Einlesen von Textdaten benutzt. 
# Um die verbleibenden Zeilen mit readline  einzulesen, ist der Befehl zu wiederholen.
> readline(filename);
> readline(filename);
> readline(filename);
# Die gegenwärtige Zeigerposition innerhalb der Datei ist das Dateiende. Ein weiterer Aufruf von readline gibt eine null  zurück und  schließt  automatisch die Datei an diesem Punkt.  
# Die Wiederholung des readline-Kommandos lässt 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 können 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 zurück. Die Kürzel 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 schließt Maple hier nicht automatisch die Datei, deshalb wird diese mit dem Befehl close  geschlossen. Die Wiederholung des Kommandos lässt 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 zurückgegeben. Soll beispielsweise die 1. Spalte als Ganzzahl und die 2. und 3. Spalte als Dezimalzahl zurückgegeben werden, dann ist das gewünschte Format anzugeben
> readdata(filename,[integer,float,float]);
# Diese Daten können weiterverarbeitet werden, beispielsweise
> A:=convert(%,Matrix);LinearAlgebra[Determinant](A);
# Auch zum Schreiben von Daten in externe Dateien stehen mehrere Maple-Kommandos zur Verfügung.  Sollen beispielsweise Sequenzen von Zeichen in eine Datei geschrieben werden, dann wird von Maple das Kommando writeline  zur Verfügung 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 Schließen (close) in die Datei geschrieben. 
# Der Befehl writedata vereinigt die Operationen Öffnen und Schreiben der Daten im spezifizierten Format sowie das Schließen 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 abschließende Befehl close schließt 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 für 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 nächste 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 ursprünglichen 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 hängt 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();
> 
;
