[ Foro de Pascal ]

Como comparar dos columnas en una matriz

15-Dec-2010 06:46
Emanuel Bazan
6 Respuestas

Hola estimados!!!
Necesito con suma urgencia que me ayuden con estos problemas... rindo este viernes y siento que me falta una mano con los procedimientos y funciones.

Escriba un programa en lenguaje Pascal que conste de las siguientes partes:
1.  Un procedimiento que genere una matriz de tamaño m × n, siendo m y n datos ingresados por el
usuario, de manera que los elementos de dicha matriz sean 0 o 1, elegidos aleatoriamente.
2.  Un función que decida si hay dos columnas en la matriz que son iguales.
3.  Un procedimiento que emita la posición de la columna con mayor cantidad de unos. Si hay más de
una columna con mayor cantidad de unos, emitir la posición de cualquiera de ellas.

Muchas Gracias!!!

La parte 1 me salio, ahora lo que no me sale es como buscar si hay dos columnas iguales y la columna que tiene la mayor cantidad de 1.  

program matriz;

const
 maxf=100;
 maxc=100;
type numerosale=array[1..maxf,1..maxc] of integer;

var i,j,filas, columnas: integer;
   a: numerosale;

procedure matrizmxn(m:integer;n:integer);
begin
(*genera la matriz de 0 y 1*)
randomize;
for i:=1 to m do begin
for j:=1 to n do begin
a[i,j]:= random(2)
 end
end
end;

procedure escribirmatrizmxn(m:integer;n:integer);
begin
for i:=1 to m do begin
for j:=1 to n do
write(a[i,j]:4);
writeln
end;
end;

begin
writeln('Ingrese la cantidad de filas de la matriz');
readln(filas);
writeln(' ahora de columnas');
readln(columnas);
writeln;
matrizmxn(filas,columnas);
escribirmatrizmxn(filas,columnas);
writeln;
writeln('** Fin **')
end.


PD: Les adjunto como son mis examenes.


15-Dec-2010 17:54
Antonio P.G.

Hola.

Creo que con "una función que decida" te refieres a una "función que indique". Esto puede mirarse desde varios puntos de vista:

- Una función que simplemente indique "sí, hay al menos dos columnas iguales" o "no hay columnas iguales";
- Una función que indique "éstas son las columnas iguales"...;
...

En fin, yo te diré más o menos en lenguaje "hablado" cómo haría yo la función a la que denominaré:

"HayIguales (a : tmatriz; filas, columnas : integer):boolean;".

- Voy a recorrer todas las columnas, hasta que se me acaben las columnas, o hasta que encuentre dos iguales.

- Comenzaré, obviamente, por la primera. La compararé con todas las que están por encima hasta que me pase de la última o hasta que encuentre que es igual que otra. Así tendré dos bucles condicionales de recorrido "no completo" (es decir, no "for").

- Para comparar columnas usaré la función booleana "Iguales" que dice si dos columnas dadas son iguales y que ahorita paso a describirla. E

Este bucle estaría dentro del bucle principal "repeat" o "while" del la función. Por cierto, son_iguales es un boolean que nos sirve para quedarnos o marcharnos del bucle.

Paso a describir la función "Iguales".

Esta función comparar los valores de dos columnas, fijadas dichas columnas, y recorriendo sus filas. Te haré esta porque me canso de describir y es más fácil hacerla:

function Iguales (a:tmatriz; col1,col2,filas : integer):boolean;
   var
     contador    : integer;
 begin
   contador:= 0;
   repeat
     Inc (contador); { Suma 1 a "contador". }
   until (contador > filas) or (a[contador,col1] <> a[contador,col2]);
   if contador > filas then {Han sido todos los elementos iguales. }
     Iguales:= true
   else
     Iguales:= false;
 end;

Resumiendo la función principal "Hay_Iguales":
- Selecciono columna hasta llegar a la última o hasta "Iguales".
- Comparo la seleccionada con las superiores hasta pasarme o hasta "Iguales".

Si no te queda claro, pregunta, ¿ok?, que se ha hecho un poco largo.

Ciao. Respondo al otro procedimiento más abajo.


15-Dec-2010 18:19
Antonio P.G.

Hola otra vez. :-)

El procedimiento de mayor número de unos es más sencillo.

- Tú empiezas diciendo que hay cero unos (que es posible), dándole el valor cero a una variable, llamémosla  "n_1_max".

- Vas de columna en columna (tienes que recorrerlas todas) con un bucle, contando cuantos unos tiene la columna en cuestión (esto, a su vez, con otro bucle dentro del principal).

- Almacenas el número de unos de la columna que acabas de contar en la variable, por ejemplo, "n_1_parcial".

- Comparas las variables "n_1_max" y "n_1_parcial", y si la segunda es mayor, es que el máximo encontrado es ahora ese, por lo que asignamos el valor de "n_1_parcial" a la variable "n_1_max".

- ¡Y siguiente columna! (Así hasta que n haya más columnas, claro. :-P.

Espero que lo hayas entendido. Si no, ya sabes.

¡Ciao!


15-Dec-2010 20:19
Emanuel Bazan

Gracias por tus respuestas pero me perdí cuando pones la función  HayIguales (a : tmatriz; filas, columnas : integer):boolean creo que la entiendo pero esta otra...function Iguales (a:tmatriz; col1,col2,filas : integer):boolean; ¿qué valores toma col1 y col2?
Disculpa si no entiendo pero el miedo del examen del viernes me nubla.


15-Dec-2010 23:29
Antonio P.G.

No pasa nada, hombre ;-).

A ver, la función que yo llamé "Hay_Iguales" devuelve "TRUE" si al menos hay dos columnas iguales en la matriz. Si no, devuelve "FALSE". Te escribo en pseudocódigo:

función HayIguales (a: tmatriz; filas, columnas : integer):boolean;
 Mientras que (No encontrado_iguales) y (i< columnas) hacer
   Mientras que (No encontrado_iguales) y (j< columnas) hacer
     encontrado_iguales:= Iguales (i,j);

Más o menos. Tal vez le falte algo, pero eso te lo dejo a ti. Tan sólo te diré que "i" empieza en 1 y que "j" empieza en el siguiente a "i". Por cierto, la última columna no la comparas con ninguna otra...

Respecto a "col1" y "col2" son números. Son los índices de las columnas, en plan:

"¿Son iguales las columnas 2 y 4?" = "Iguales (2,4)"

¡Ciao!


16-Dec-2010 01:32
Emanuel Bazan

Gracias, creo que entendí pero te digo que en estos momentos ni se como me llamo...
Estoy viajando rumbo a la ciudad donde rindo, voy a un hotel y al otro día rindo.
Espero estar despejado y salir bien, muchas gracias y estaré revisando los mensajes del foro hasta el último instante.
Saludos y Gracias nuevamente!!!!


16-Dec-2010 10:52
Antonio P.G.

Muy bien.

Por cierto, en lo último que escribí: me he dado cuenta de un pequeño fallo, y es que según lo estaba contando, no sería "Iguales(2,4)", sino que sería "Iguales (a,2,4)".

Ciao.






(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.)