(* Programa para la suma y multiplicacion de matrices cuadradas. El programa
   debe mostrar un menu que tenga ademas la opcion de introducir las
   matrices y de salir del programa.

   Practica 3 (Arrays) de IP del curso 96/97

   Autor: Fernando Barber
*)

Program matriz (Input, Output);

CONST
	N=3;

TYPE
	Matrix = ARRAY [1 .. N, 1 .. N] OF INTEGER;

VAR
	opcion   : CHAR;
	a, b, r  : Matrix;
	matrizIn : BOOLEAN;

PROCEDURE IntroMatriz( VAR x: Matrix );
VAR
	i, j: INTEGER;
BEGIN
	FOR i := 1 TO N DO
		FOR j := 1 TO N DO
		BEGIN
			WRITE( ' Fila: ', i:2 );
			WRITE( ' Columna: ', j:2, ' ');
			READLN( X[ i, j ] );
		END;
END;

PROCEDURE PutMatriz( x: Matrix );
VAR
	i, j: INTEGER;
BEGIN
	FOR i := 1 TO N DO
	BEGIN
		FOR j := 1 TO N DO
			WRITE( x[ i, j ], ' ');
		WRITELN;
	END;
END;

PROCEDURE MultMatriz( x, y: Matrix; VAR z: Matrix );
VAR
	i, j, k: INTEGER;
BEGIN
	FOR i := 1 TO N DO
		FOR j := 1 TO N DO
		BEGIN
			z[ i, j ]:= 0;
			FOR k := 1 TO N DO
				z[ i, j ] := z[ i, j ] + x[ i, k ] * y[ k, j ];
		END;
END;

PROCEDURE SumMatriz( x, y: Matrix; VAR z: Matrix );
VAR
	i, j: INTEGER;
BEGIN
	FOR i:= 1 TO N DO
		FOR j := 1 TO N DO
			z[ i, j ]:= x[ i, j ] + y[ i, j ];
END;

BEGIN
	matrizIn := FALSE;

	REPEAT
		WRITELN;
		WRITELN;
		WRITELN( ' 1 - Introducir Matrices');
		WRITELN( ' 2 - Sumar Matrices' );
		WRITELN( ' 3 - Multiplicar Matrices' );
		WRITELN( ' 4 - Salir' );
		WRITELN( '        Introduce Opcion:' );

		REPEAT
			READLN (opcion);
		UNTIL opcion IN [ '1' .. '4' ];

		CASE opcion OF
			'1':	BEGIN
					WRITELN;
					WRITELN( 'Introduce matriz A');
					IntroMatriz( a );
					WRITELN;
					WRITELN( 'Introduce matriz B');
					IntroMatriz( b );
					matrizIn := TRUE;
				END;
			'2':	BEGIN
					IF NOT matrizIn THEN
						WRITELN( 'Introduzca primero las matrices' )
					ELSE
					BEGIN
						SumMatriz( a, b, r );
						PutMatriz( r )
					END;
				END;
			'3':	BEGIN
					IF NOT matrizIn THEN
						WRITELN( 'Introduzca primero las matrices' )
					ELSE
					BEGIN
						MultMatriz( a, b, r );
						PutMatriz( r )
					END;
				END;
			'4':	WRITELN( ' Fin del programa' )
		END;
	UNTIL opcion = '4';
END.

