PROGRAM matrizen;

USES
  Crt;

TYPE
  Tmat = ARRAY [1..10,1..10] OF INTEGER;

PROCEDURE
  matrixan(VAR matrix:Tmat; m,n:INTEGER);

VAR
  i,j     :INTEGER;
  eingabe :INTEGER;

BEGIN
  FOR i:=1 TO m DO
    FOR j:=1 TO n DO BEGIN
      Writeln(i,'. Zeile, ',j,'. Spalte');
      Writeln('Bitte geben Sie eine Zahl ein');
      Readln(eingabe);
      matrix[i,j]:=eingabe
    END;
END;

(*Die Funktion berechnet die Zeilensumme in einer ausgew„hlten Zeile*)
FUNCTION zeilensumme (matrix : tmat; zeile:INTEGER; n : INTEGER): INTEGER;

VAR
  i     : INTEGER;
  summe :INTEGER;

BEGIN
  summe:=0;
  FOR i:=1 TO n DO
      summe:=summe + matrix[zeile,i];
  zeilensumme:=summe;
END;

(*Die Funktion berechnet den Zeilendurchschnitt einer ausgew„hlten Zeile*)
FUNCTION zeilendurch (matrix:Tmat; zeile: INTEGER; n: INTEGER) : REAL;

VAR
  i     : INTEGER;
  summe : INTEGER;
  durch : REAL;

BEGIN
  summe:=0;
  FOR i:=1 TO n DO BEGIN
    summe:=summe + matrix[zeile,i];
    durch:=summe/i;
  END;
  zeilendurch:=durch;
END;

(*Die Funktion berechnet die Spaltensumme einer ausgew„hlten Spalte*)
FUNCTION spaltensumme(matrix : Tmat; spalte : INTEGER; m : INTEGER):INTEGER;

VAR
  summe: INTEGER;
  j : INTEGER;

BEGIN
  summe:=0;
  FOR j:=1 TO m DO
    summe:=summe + matrix[j,spalte];
  spaltensumme:=summe;
END;

(*Die Funktion berechnet den Spaltendurchschnitt einer ausgew„hlten Spalte*)
FUNCTION spaltendurch(matrix:Tmat; spalte:INTEGER; m:INTEGER):REAL;

VAR
  j     : INTEGER;
  summe : INTEGER;
  durch : REAL;

BEGIN
  summe:=0;
  FOR j:=1 TO m DO BEGIN
    summe:=summe + matrix[j,spalte];
    durch:=summe/j;
  END;
  spaltendurch:=durch;
END;

(*Die Funktion berechnet die Abweichung von einem Monat auf dem anderen*)
FUNCTION
  vormonatsab(matrix:Tmat; monat1,monat2:INTEGER; zeile:INTEGER):REAL;

VAR
  abweichung :REAL;

BEGIN
  abweichung:=(matrix[zeile,monat2]/matrix[zeile,monat1]-1)*100;
  vormonatsab:=abweichung
END;

(*Prozedur welche die Zeilen einer Matrix nach einer bestimmten Spalte sortiert*)
PROCEDURE
  matrixsort(VAR matrix:Tmat; spalte:INTEGER; m,n:INTEGER);

VAR
  i,j,k,l   :INTEGER;   (*Laufvariablen fr die FOR-Schleifen*)
  zeile     :INTEGER;   (*Zur Bestimmung der Zeile wo das Minimum ist*)
  anz       :INTEGER;   (*Z„hlt die Anzahl der Durchl„ufe in der WHILE-S.*)
  min       :INTEGER;   (*Minimum der Spalte*)
  hilf      :INTEGER;
  minpos    :INTEGER;

BEGIN
  FOR i:=1 TO m-1 DO BEGIN
    minpos:=i;
    min:=matrix[i, spalte];
    FOR j:=i+1 TO m DO BEGIN
      IF matrix[j, spalte]<min THEN BEGIN
        minpos:=j;
        min:=matrix[j, spalte]
      END
    END;
    FOR j:=1 TO n DO BEGIN
      hilf:=matrix[minpos,j];
      matrix[minpos, j]:=matrix[i,j];
      matrix[i,j]:=hilf
    END
  END
END;

FUNCTION
  anteilsumme(matrix:Tmat; n:INTEGER; zeile,spalte :INTEGER):REAL;

VAR
  anteil  :REAL;
  i,j     :INTEGER;
  summe   :INTEGER;

BEGIN
  summe:=0;
  FOR i:=1 TO n DO
      summe:=summe + matrix[zeile,i];
  anteil:=matrix[zeile,spalte]/summe*100;
  anteilsumme:=anteil;
END;

(*Prozedur zur Ausgabe der Matrix*)
PROCEDURE
  matrixaus(matrix:Tmat; m,n:INTEGER);

VAR
  i,j :INTEGER;

BEGIN
  FOR i:=1 TO m DO  BEGIN
    Write(i,'. Zeile:');
    FOR j:=1 TO n DO
      Write(matrix[i,j]:5);
    Writeln;
  END;
END;

(*Hauptprogramm*)
VAR
  matrix        :Tmat;
  m,n           :INTEGER;
  eingabe       :INTEGER;
  zeile,spalte  :INTEGER;
  monat1,monat2 :INTEGER;
  produkt       :INTEGER;

BEGIN
  ClrScr;
  Writeln('Geben Sie bitte an wie viele Zeilen die Matrix haben soll');
  Readln(m);
  Writeln('Geben Sie bitte die Anzahl der Spalten an');
  Readln(n);
  Writeln('=========================Was wollen Sie machen======================');
  Writeln; Writeln;
  Writeln('   Zeilensummen        (1)');
  Writeln('   Spaltensummen       (2)');
  Writeln('   Zeilendurschnitt    (3)');
  Writeln('   Spaltendurschnitt   (4)');
  Writeln('   Matrixsortierung    (5)');
  Writeln('   Vormonatsabweichung (6)');
  Writeln('   Anteilsummen        (7)');
  Readln(eingabe);
  Writeln; Writeln; Writeln;
  CASE eingabe OF
    1:  BEGIN
          matrixan(matrix,m,n);
          Writeln('Bitte geben Sie eine Zeile an');
          Readln(zeile);
          zeilensumme(matrix,zeile,n);
          matrixaus(matrix,m,n);
          Writeln('Die Summe der ',zeile,'. Zeile betr„gt ',zeilensumme(matrix,zeile,n))
        END;
    2:  BEGIN
          matrixan(matrix,m,n);
          Writeln('Bitte geben Sie eine Spalte an');
          Readln(spalte);
          zeilensumme(matrix,spalte,m);
          matrixaus(matrix,m,n);
          Writeln('Die Summe der ',spalte,'. Spalte betr„gt ',zeilensumme(matrix,spalte,m))
        END;
    3:  BEGIN
          matrixan(matrix,m,n);
          Writeln('Bitte geben Sie eine Zeile an');
          Readln(zeile);
          zeilendurch(matrix,zeile,n);
          matrixaus(matrix,m,n);
          Writeln('Der Durschnitt der ',zeile,'. Zeile betr„gt ',zeilendurch(matrix,zeile,n) :6:2)
        END;
    4:  BEGIN
          matrixan(matrix,m,n);
          Writeln('Bitte geben Sie eine Spalte an');
          Readln(spalte);
          spaltendurch(matrix,spalte,m);
          matrixaus(matrix,m,n);
          Writeln('Der Durschnitt der ',spalte,'. Spalte betr„gt ',spaltendurch(matrix,spalte,m) :6:2)
        END;
    5:  BEGIN
          matrixan(matrix,m,n);
          Writeln('Bitte geben Sie eine Spalte an');
          Readln(spalte);
          matrixsort(matrix,spalte,m,n);
          matrixaus(matrix,m,n);
        END;
    6:  BEGIN
          Writeln('Die Monate sind die Spalten, die Produkte sind die Zeilen');
          matrixan(matrix,m,n);
          matrixaus(matrix,m,n);
          Writeln('Bitte geben Sie den ersten (Vor)Monat an');
          Readln(monat1);
          Writeln('Bitte geben Sie den zweiten Monat an');
          Readln(monat2);
          Writeln('Bitte geben Sie ein Produkt an');
          Readln(produkt);
          vormonatsab(matrix,monat1,monat2,produkt);
          Write('Im ',monat2,'. Monat hat Sie ',vormonatsab(matrix,monat1,monat2,produkt) :6:2,'% Umsatz im Verh„ltnis zum ');
          Writeln(monat1,'. Monat des Jahres');
        END;
    7:  BEGIN
          matrixan(matrix,m,n);
          matrixaus(matrix,m,n);
          Writeln('Bitte geben Sie die Zeile an, von wessen Elementen Sie dann Bezge machen wollen');
          Readln(zeile);
          Writeln('Bitte geben Sie eine Spalte an, von welcher Sie Bezug zur Zeilensumme machen wollen');
          Readln(spalte);
          anteilsumme(matrix,n,zeile,spalte);
          Writeln('Das ',produkt,'. Produkt macht ',anteilsumme(matrix,n,zeile,produkt):6:2,'% zum Ganzen aus')
        END;
    END;
  Readln
END.