[ Foro de Pascal ]

Matrices de dimensión n

10-Oct-2007 16:07
Angel Bravo
1 Respuestas

He empezado a crear el código de un programa capaz de realizar operaciones con matrices (multiplicar, sumar, hallar el determinante..), rehice un código que vi en internet sobre esto, pero...el problema es que no sé como hacer para que el tamaño de la matriz no esté preestablecido por una constante, si miramos este código:

Program MultiplicaMatrices;

Const N=4;

Type tMatriz=array[1..N, 1..N] of real;
Var a,b,prod: tMatriz;

Procedure LeerMatriz(var mat:tMatriz);
Var fil, col: 1..N;
Begin
For fil:=1 to N do
For col:= 1 to N do
Begin
Write(' Introduzca el componente a' ,fil,'.' , col, ' de la matriz: ');
Readln(mat[fil,col]);
End;
End;

funciona cuando asignamos una matriz de orden 4x4 ¿cómo podríamos hacer para que no tuvieramos que definir el orden como una constante sino que pudiera recogerlo como una variable? lo mismo digo una salvajada pero ¿crear un puntero a la matriz una vez que se conoce la dimensión? ni idea, todos mis intentos siempre acaban con un error del compilador tipo "data element too large" o algo similar..


10-Oct-2007 23:52
Nacho Cabanes (+83)

Hay dos soluciones habituales:

  • Sobredimensionar: reservas espacio para una matriz de (por ejemplo) 12x12, y el primer dato que pides es el tamaño de la matriz a usar. Si te indican 4, trabajarás con las primeras 4 filas y las primeras cuatro columnas de la matriz 12x12:

Const N=12;

Type tMatriz=array[1..N, 1..N] of real;
[...]

Write(' Introduzca el tamaño de la matriz: ');
Readln(tamanyo);
if tamanyo > N then { .... mensaje de error .... }

For fil:=1 to tamanyo do
For col:= 1 to tamanyo do
Begin
Write(' Introduzca el componente a' ,fil,'.' , col, ' de la matriz: ');
Readln(mat[fil,col]);
End;

  • Crear las matrices de forma dinámica. Por ejemplo, para una matriz de 9x9 tendrías que reservar espacio para 81 elementos, y acceder al elemento en la posición fila + (columna-1) * tamanyo

Como estás empezando, yo usaría la primera opción.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)