program matrizenrechnen;
uses crt;

const m=2; n=2;                 {m Spalten, n Zeilen in Matrix}
      lenges=8; lennachk=4;     {Genauigkeit bei Ausgabe}
      ziffern: set of char= ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '-'];

type zahltyp = real;  {Typ der Zahlen, die in die Matrix eingetragen werden}

var matrix : array[1..m, 1..n] of zahltyp;
    ende : boolean;

procedure fehler(fehlertext: string);
  begin
    textcolor(red+blink);
    writeln('Fehler: ', fehlertext);
    sound(400);      {Beep}
    delay(400);
    nosound;
    textcolor(lightgray);
  end;

procedure einlesen;

  var i, j, code : integer;
      zahl       : zahltyp;
      zstr       : string;

  begin
    for j:=1 to n do
      for i:=1 to m do
        begin
          code:=0;
          repeat
            if code>0 then fehler('Fehleingabe: Keine Zahl');
            write('a ', j, ' ', i, '  eingeben: ');
            readln(zstr);
            val(zstr, zahl, code);
          until code=0;
          matrix[i, j]:=zahl;
        end;
    writeln;
  end;

procedure ausgabe;

  var i, j : integer;

  begin
    writeln;
    for j:=1 to n do
      for i:=1 to m do
        begin
          if i=1 then write('  ', j, '. ');
          write(matrix[i, j]:lenges:lennachk, ' ');
          if i=m then writeln;
        end;
    writeln;
  end;

procedure vertauschen(j1, j2: integer);

  var i : integer;
      z : zahltyp;

  begin
    for i:=1 to m do
      begin
        z:=matrix[i, j1];
        matrix[i, j1]:=matrix[i, j2];
        matrix[i, j2]:=z;
      end;
  end;

procedure multiplikation(j: integer; faktor: zahltyp);

  var i : integer;

  begin
    for i:=1 to m do
      matrix[i, j]:=matrix[i, j]*faktor;
  end;

procedure division(j: integer; divisor: zahltyp);

  var i : integer;

  begin
    for i:=1 to m do
      matrix[i, j]:=matrix[i, j] / divisor;
  end;

procedure addition(j1, j2: integer);

  var i : integer;

  begin
    for i:=1 to m do
      matrix[i, j1]:=matrix[i, j1]+matrix[i, j2];
  end;

procedure subtraktion(j1, j2: integer);

  var i : integer;

  begin
    for i:=1 to m do
      matrix[i, j1]:=matrix[i, j1]-matrix[i, j2];
  end;

procedure hilfe;
  begin
    writeln;
    writeln('Befehl allgemein: Befehl | zeile1 Befehl variable');
    writeln('Addition: Zeile1 a Zeile2 ; Ergebnis in Zeile1');
    writeln('Subtraktion: Zeile1 s Zeile2 ; Ergebnis in Zeile1');
    writeln('Multiplikation: Zeile1 m Faktor ; Ergebnis in Zeile1');
    writeln('Division: Zeile1 d Divisor ; Ergebnis in Zeile1');
    writeln('Vertauschen: Zeile1 v Zeile2 ; Zeile2 in Zeile1 und umgekehrt');
    writeln('Ausgabe: a');
    writeln('Hilfe: ?');
    writeln('Beenden: e');
    writeln;
  end;

function verarbeiten: boolean;

  var p2                 : zahltyp;  {p1, p2: Parameter des Befehls}
      i, ivorher         : byte;
      befehl, zahlstring : string;
      zahlen             : boolean;
      code1, code2, p1   : integer;
      befehlschar        : char;

  begin
    zahlen:=false;
    verarbeiten:=false;
    befehl:='';
    textcolor(white);
    write('Befehl (''?''=Hilfe) : '); readln(befehl);
    textcolor(lightgray);

    if (befehl<>'') then       {Falls Befehl die L„nge 0 hat}
      while (befehl[1]=' ') do {Leerzeichen am Anfang loeschen}
        delete(befehl, 1, 1);
    if (befehl<>'') then
      case befehl[1] of
          '?'      : hilfe;
          'a'      : ausgabe;
          'e'      : verarbeiten:=true;
          '1'..'9' : zahlen:=true;
          else       fehler('Kein bekannter Befehl, siehe Hilfe');
        end;

    if zahlen=true then
      begin
        i:=0; code1:=0;          {Parameter 1 als Zahl einlesen}
        repeat
          i:=i+1;
        until not(befehl[i] in ziffern);
        zahlstring:=copy(befehl, 1, i-1);
        val(zahlstring, p1, code1);
        if (code1>0) then
          fehler('1. Parameter keine richtige Zahl oder falscher Typ');

        while ((befehl[i]=' ') and (i<=length(befehl))) do  {Leerzeichen ab Position i loeschen}
          delete(befehl, i, 1);
        befehlschar:=befehl[i];
        i:=i+1;
        befehl:=befehl+' ';            {Befehl h”rt hinter befehlschar auf}
        while ((befehl[i]=' ') and (i<=length(befehl))) do         {Leerzeichen ab Psition i loeschen}
          delete(befehl, i, 1);

        code2:=0; ivorher:=i; i:=0;    {Parameter 2 als Zahl einlesen}
        repeat
          i:=i+1;
        until not(befehl[i+ivorher-1] in ziffern);
        zahlstring:=copy(befehl, ivorher, i-1);
        val(zahlstring, p2, code2);
        if (code2>0) then
          fehler('2. Parameter keine richtige Zahl oder falscher Typ');

        if ((code1>0) or (code2>0))
          then fehler('Befehl nicht ausgef�hrt, da Parameter falsch')
          else case befehlschar of
              'v' : vertauschen(p1, round(p2));
              'a' : addition(p1, round(p2));
              's' : subtraktion(p1, round(p2));
              'm' : multiplikation(p1, p2);
              'd' : division(p1, p2);
              else  fehler('Befehl nicht bekannt');
            end;
      end;
  end;

begin
  clrscr;
  textcolor(7);
  ende:=false;
  einlesen;
  repeat
    ende:=verarbeiten;
  until ende;
  textcolor(lightgray); {Standard-Textfarbe}
end.
{Eingabe: zeile1 Befehl variable
 Addition: Zeile1 a Zeile2 ; Ergebnis in Zeile1
 Subtraktion: Zeile1 s Zeile2 ; Ergebnis in Zeile1
 Multiplikation: Zeile1 m Faktor ; Ergebnis in Zeile1
 Division: Zeile1 d Divisor ; Ergebnis in Zeile1
 Vertauschen: Zeile1 v Zeile2 ; Zeile2 in Zeile1 und umgekehrt
 Hilfe: '?'
 Beenden: 'e' }