Una duda con las matrices en pascal

Mi problema esta en como puedo hacer para que un usuario me pida una matriz NxM y el programa me la llene automáticamente... También puede ser que el usuario la llene pero me interesa más que la llene el programa por si solo
Osea cual es la estructura de un programa así... Yo lo puedo hacer cuando NxM son iguales pero si son distintas no me sale
Te pongo un ejemplo para que me entiendas
Supone que el usuario ingrese
N:=4 y M:=2
Entonces la matriz me debería quedar algo así
1 2 3 4
1 2 3 4
¿Cómo hago eso?
También pueden ser otras NxM... Con números muchos más grandes y distintos

2 respuestas

Respuesta
1
Esto son ARRAYS DINÁMICOS.
Veo que ya conoces lo que es un arreglo (ARRAY en inglés)-
Pues esta temática, he estado tratando de resolverla durante un largo rato, buscando información, y salvo que te metas con punteros (memoria dinámica) no podría ayudarte. Y no creo que sea lo que te piden, así que la única solución que te puedo ofrecer es que declares un array más grande de lo que preveas que el usuario va a introducir, y para que la máquina lo rellene por sí sola, hagas algo así:
(...)
Begin
RANDOMIZE;//Crea una nueva semilla de números aleatorios
(...)
FOR i:=1 TO m DO
 FOR j:=1 TO n DO
  BEGIN
   matriz[m,n]:=RANDOM(HIGH(INTEGER));//Número aleatorio desde 0 hasta el más alto del tipo INTEGER -1 ya que RANDOM utiliza MOD por dentro.
   IF Random(2)=0 THEN  matriz[m,n]:=-matriz[m,n];//Para los signos, ya que el Random utiliza la operación algebraica MOD (Módulo)
  END;
(...)
END.
yava...explicamelo otra vez q pascal me da un poco de errores cuando lo compilo
Me da error cuando coloco esto
matriz[m,n]:=RANDOM(HIGH(INTEGER));
Si me puedes colocar el programa especifico de como se crea la matriz... así ya con todas las variables declaradas, y ya todo hecho... es para verlo mejor
Agradezco tu respuesta
Un ejemplillo compilado con FreePascal 2.2.0 (mi favorito^^)
PROGRAM Crea_Array_Aleatorio;
USES crt;
CONST m=3;
      n=3;
TYPE TMatriz=ARRAY[1..m,1..n] OF INTEGER;
VAR i,j:WORD;
    matriz:TMatriz;
PROCEDURE Rellenar_Matriz_RANDOM(VAR matriz:TMatriz);
 VAR i,j:WORD;
 begin
  RANDOMIZE;
  for i:=1 TO m DO
   for j:=1 TO n DO
    begin
     matriz[i,j]:=RANDOM(HIGH(INTEGER)+1);
     IF RANDOM(2)=0 THEN matriz[m,n]:=-matriz[m,n];
    end;
 end;
PROCEDURE Escribir_Matriz(matriz:TMatriz);
 VAR i,j:WORD;
 begin
  for i:=1 TO m DO
   begin
    for j:=1 TO n-1 DO
     begin
      write(matriz[i,j],'  ');
     end;
    writeln(matriz[i,n]);
   end;
 end;
begin
 CLRSCR;
 Rellenar_Matriz_RANDOM(matriz);
 Escribir_Matriz(matriz);
 write('Pulse una tecla para finalizar el programa...');
 READKEY;
end.
Cualquier duda, no dudes en preguntar xD
Gracias esta bastante bueno... pero se me originan dos dudas
1. Porque los numero que me salen son mayormente negativo e inmensos... en cual de todos los random hago para poder decir hasta donde quiero que lleguen los numero
2. Como hago para que el NxM lo introduzca el usuario... osea si lo ejecuta bien... pero uno tiene que ingresar el numero... y si el usuario no quiere esa matriz si no una que el quiera en donde modifico pra que me haga eso
Gracias de antemano
Respuesta 1: RANDOM(x) devuelve un número natural que ca desde 0.. x-1 hasta x-1. Entonces, si quieres que te salgan números más pequeños, pues la "x" la pones más pequeña. El siguiente RANDOM (RANDOM(2)) es para que devuelva 2 valores: 0 ó 1, y dependiendo, le ponga signo negativo o no, porque como acabamos de ver, el RANDOM devuelve SOLO POSITIVOS. De alguna manera había que meter los engativos aleatoriamente también, ¿no?
Respuesta 2: Las constantes m y n las pones GRANDES, como para que el usuario pueda meter el nº que quiera y siempre sea menor. Debes ser consciente de que está consumiendo TODA LA MEMORIA, aunque lego el usuario solo emplee "un trocito" (por si te lo preguntan, que sepas que no es lo más eficiente).
Entonces, el usuario metería el "mmax" y el "nmax", que podrían tomar valores entre 1.. m y 1.. n, de forma que el usuario pueda "crear" una "submatriz" dentro de la tuya. Solo le estás limitando en la grande, nada más. Entonces, en el procedimiento de crear aleatoriamente la matriz, le tendrías que añadir los 2 parámetros que metió el usuario:
PROCEDURE Rellenar_Matriz_RANDOM(VAR matriz:TMatriz;mmax,nmax:WORD{los "máximos" de la matriz del usuario});
Y en los bucles FOR que hay, pues en vez de hasta m y n, hasta mmax y nmax (que, repito, son más pequeñas o iguales a m y n); y al mostrar la matriz, igual. Que escriba soo los valores hasta los que escribió el usuario.
Igual que antes... me perdí en el ejercicio y no encontré el RANDOM (x) del que me hablas... tampoco pude hacer que me dejara de imprimir numero negativos... por más que le haga cada vez que lo corro TODOS me dan numero NEGATIVOS
Y tampoco tengo la más mínima idea de como hacer que lea una matriz NxM y que el N yel M los introduza el usuario
Igual que antes me puedes colocar un ejercicio donde me aparezca esas cosas
Disculpa la molestia... pero tiene que salir todo perfecto... XD
Busca bien anda, que el RANDOM está dentro del procedimiento de rellenar la matriz.
No siempre salen negativos, ni siempre salen positivos. Es "aleatorio".
Si no quieres que salgan negativos, quita la parte del "IF RANDOM(2)=0 THEN (...);"
Ok... ya encontré en donde cambiarle lo del random y ya vi cual era el que me colocaba los numero en negativos... ahora lo único que me falta es saber el ciclo que tengo que hacer para que el NxM lo ingrese el usuario por pantalla y no sea predeterminao (con esto me refiero a que en el programa ya esta explicito que tiene que ser de ese tamaño)... yo se que se puede cambiar y ser más grande la matriz
Pero como te dije antes el programa tiene que ser perfecto y ese es el único error que le queda
PROGRAM Array_RANDOM;
USES crt;
CONST m=10;
            n=10;
VAR maxm,maxn:WORD;
PROCEDURE Rellenar_Matriz_RANDOM(VAR matriz:TMatriz;maxm,maxn:WORD);
 VAR i,j:WORD;
 begin
  RANDOMIZE;
  for i:=1 TO maxm DO
   for j:=1 TO maxn DO
    begin
     matriz[i,j]:=RANDOM(HIGH(INTEGER)+1);
     IF RANDOM(2)=0 THEN matriz[m,n]:=-matriz[m,n];
    end;
 end;
PROCEDURE Escribir_Matriz(matriz:TMatriz;maxm,maxn:WORD);
 VAR i,j:WORD;
 begin
  for i:=1 TO maxm DO
   begin
    for j:=1 TO maxn-1 DO
     begin
      write(matriz[i,j],'  ');
     end;
    writeln(matriz[i,maxn]);
   end;
 end;
begin
CLRSCR;
writeln('Introduzca el máximo de filas [1..',m,']:');
readln(maxm);
writeln('Introduzca el máximo de columnas [1..',n,']:');
readln(maxn);
//maxm y maxn deben ser menores o iguales a m y n respectivamente
CLRSCR;
Rellenar_Matriz_RANDOM(matriz,maxm,maxn);
 Escribir_Matriz(matriz,maxm,maxn);
 write('Pulse una tecla para finalizar el programa...');
 READKEY;
end;
Gracias man... aunque el programa que me pasaste le faltaba declararle algunas variables... pero no importa... eran errores mínimos que se solucionaban fácil
En fin... te doy las 5 estrellas... y disculpa las molestias
Próximamente te estaré preguntando otra vez
Saludos
Respuesta
1
tenes que usar dos for anidados, por ejemplo:
for i:=1 to n do
begin    matriz:=i;
            for j:=1 to m do
                        matriz:=i+1
end;
Espero que te sirva, perdón por esta presurosa respuesta casi sin dedicación.
Abrazo...

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas