%Einige einfache Beispiele zu MATLAB-Sprachelementen.
%Kommentare werden zeilenweise durch % (Prozentzeichen) eingeleitet.
%Nach dem Aufruf von MATLAB (Klicken bei windoofs-Rechnern,
%Tippen des Wortes "matlab" in ein Kommandofenster bei Suns)
%erscheint in jedem Fall ein Fenster mit einem 'Prompt' >>
%Danach werden Befehle sofort ausgefuehrt:
format loose %das Gegenteil von compact
x=3*4+5
disp('Viel Luft im Format: Enter-Taste druecken'); pause
%Will mann nicht soviel Luft zwischen den Zeilen, schreibe man
format compact
x=pi*4
disp('Luft ist weg und langes Format kommt: Enter-Taste druecken'); pause
%Moechte man mehr Stellen sehen, schreibe man
format long
x=pi*4
%Moechte man wieder zur kurzen Form zurueckkehren, schreibe man 
format short
disp('diverse Rechnungen: Enter-Taste druecken'); pause
%Laengere Programme schreibe man in eine Datei der Form "datei.m"
%Dabei ist die Endung .m notwendig. Diese Programme werden 
%als MATLAB-Programme identifiziert und mit Tippen von
%"datei" (ohne " ") und ohne Endung aufgerufen.
%Wesentlich in MATLAB sind Variablen vom Typ Matrix oder Vektor,
%wobei explizite Deklarationen nicht moeglich  sind. 
%Vektoren sehen entweder so aus
x=[1 2 3 4 5] %Zeilenvektoren oder so
y=[1;2;3;4;5] %oder mit der gleichen Bedeutung
y=[1
   2
   3
   4
   5]; %Spaltenvektor
disp('Matrix: 2 Zeilen, 3 Spalten');
A=[1 2 3; 4 5 6]
%oder
A=[1 2 3
   4 5 6];
       %x kann aber im vorliegenden Fall auch einfach in der Form
x=1:5; %geschrieben werden. Man kann leicht einen 
       %Zeilen- in einen Spaltenvektor umwandeln
y=x';  %Jetzt ist y ein Spaltenvektor wie oben.
       %Das Semikolon am Ende hat eine total neue Bedeutung: 
       %Es verhindert das Ausgeben auf den Bildschirm.
y;     %allein bewirkt, dass y auf dem Schirm angezeigt wird.
       %Man kann Operationen auf alle Vektorkomponeneten gleichzeitig anwenden:
disp('x/3:');
x/3
disp('x+3:');
x+3
disp('x.^2:');
x.^2
disp('x.^x: Enter-Taste druecken'); pause
     %Operationen wie .* oder ./ oder .^ wirken komponentenweise 
     %auf den ganzen Vektor und entsprechend auch
x.^x
disp('x./x: Enter-Taste druecken'); pause
x./x
disp('A.^2: Enter-Taste druecken'); pause
A.^2
     %Ist 
x=0:0.01:2*pi;   %also x=0,0.01,0.02,...,2*pi, so ist 
y=sin(x); %entsprechend der Vektor sin(0),sin(0.01),sin(0.02),...,sin(2*pi)
%Ein Zeichenbefehl hat dann die Foerm
disp('Sinus-Kurve in blau: Enter-Taste druecken'); pause
plot(x,y);
disp('Koennen Sie auch noch beim naechsten Mal die x-Achse einzeichnen?');
disp('2 Punkte verbinden: Enter-Taste druecken'); pause
%Will man zwei Punkte (x,y), (u,v) geradlinig verbinden, so ist
x=0;y=0;u=2;v=-1; %und
plot([x u],[y v]) %der geignete Befehl. Moechte man eine rote Linie, 
disp('dieselben Punkte in rot verbinden: Enter-Taste druecken'); pause
%so schreibe man
plot([x u],[y v],'r');
disp('dasselbe gepunktet (suchen, wo sind die Punkte?): Enter-Taste druecken'); pause 
plot([x u],[y v],'r.');
disp('Jetzt kommt etwas Langes, naemlich help plot: Enter-Taste druecken'); pause
%Ein wesentliche Informationsquelle sind die beiden Befehle
disp('help plot [langer Ausdruck]'); pause(3)
help plot %(plot nur als Beispiel) und
disp('Jetzt kommt lookfor cyan (dauert), Enter-Taste druecken'); pause
lookfor cyan
disp('cyan kommt also im Programm "cool" vor');
%help gibt Informationen ueber bestehende Programme, 
%lookfor "text" sucht in den Kommentaren aller vorhandenen Programme 
%(auch in den selbst geschriebenen) nach dem Wort "text" 
%(ohne Anfuehrungszeichen).

%Ein wesentlicher Unterschied zu Pascal: Alle Schleifen und alle if-Abfragen
%muessen mit "end" (oder "end;") beendet werden. Als Schleifen gibt es "for"-
%und "while"-Schleifen, kein "repeat". Ein "case ... of" gibt es in der Form 
%von "switch".

%Prozeduren muessen in separate Dateien name.m ausgelagert werden.
%Das .m am Ende ist obligatorisch. Aufgerufen werden sie nur mit dem 
%Dateinamen name. Der Dateiname "name" sollte mit mit dem Prozedurnamen
%uebereinstimmen. Bei Abweichung wird der Dateiname genommen.
%Prozeduren haben immer die Form

%function [Ausgabeliste]=name(Eingabeliste). 
%Anweisungsteil

%Die Eingabeliste wird nicht ueberschrieben, ist also nach 
%Beendigung der Prozedur wieder mit den alten Werten besetzt.
%Der Ausgabeteil und auch der Eingabeteil koennen leer sein.

%Im Gegensatz zu Pascal, kann bei der Formulierung der Prozedur die Anzahl 
%der eingehenden oder ausgehenden Parameter abgefragt werden mit: 
%"nargin", "nargout". Strings koennen ueber eval(String) direkt ausgefuehrt
%werden, bei Funktionen mit feval(String,x),  beispielsweise 
disp('Sinus an der Stelle 0.4 ueber einen String: Enter-Taste druecken'); pause
s='sin'; y=feval(s,0.4) %gibt y=sin(0.4);  %oder
for j=1:4
  s=['print -dpsc Bild',int2str(j),'.ps'];
  eval(s); %Es werden Dateien mit den Namen Bild1.ps,...,Bild4.ps erzeugt
end;
%Der Befehl int2str(j) wandelt die ganze Zahl j in einen String um, 
%entsprechend arbeitet num2str(x) fuer eine reelle Zahl x.

disp('Probieren Sie zuerst im Dialogfenster alles Moegliche aus!');
disp('Schreiben Sie aber schliesslich Ihre Programme in Dateien.');
disp('Schluss der Demonstration!');
