[ Foro de Pascal ]

duda con funciones y matrices

08-Dec-2010 16:08
Jesús Rodríguez
12 Respuestas

Buenas planteo mi duda aca a ver quien me puede ayudar :P

Estoy estudiando denuevo,tengo años que no veo pascal y no recuerdo mucho su sintaxis y necesito recordarlo o mejor dicho volverlo a aprender :P aparte de q tengo un revuelto de conocimientos mezclados con C xD

la duda es la siguiente:

supongamos que tengo 2 matrices de 2x2 (a y b respectivamente)
cada una con sus valores deseo hacer una funcion que me sume los valores de ellas en otra, es posible pasar cada matriz por parametros de la funcion? o tengo q pasar elemento por elemeto?

osea me explico : es posible esto? (lo escribire en pseudo :P )

fuction (matriz a, matriz b) : matriz
 
 for i=1 to 2 do
   for j=1 to 2 do
      suma[i,j] := matriza[i,j] + matrizb[i,j];
   end;
 end;
return suma
end.

Quiero meter 2 matrices que la funcion me las sume y me regrese otra matriz con la suma de ellas.

como seria la sintaxis para declarar matrices como parametros dentro de la funcion?

Gracias de antemano por toda la ayuda que me puedan prestar


08-Dec-2010 16:54
Antonio P.G.

¡Hola!

Claro que las puedes dar a la función como parámetros :-), pero antes tienes que definir el tipo. Es decir, la cabecera sería:

function Suma2x2 (matriz_a, matriz_b : Tmatriz2x2): Tmatriz2x2;


Hay que tener en cuenta que el tipo "Tmatriz2x2" estaría definido previamente a la función, porque si no ésta no reconoce sus propios parámetros. Así, el tipo:

type
..Tmatriz2x2 = array [1..2,1..2] of integer;

Por ejemplo lo he definido así (hay más formas). NOTA: Los puntos los he escrito para darle sangría.

Creo que eso responde a la pregunta.

¡Ciao!


08-Dec-2010 17:30
Jesús Rodríguez

Hola antonio muchisimas gracias por tu respuesta, me ha ayudado mucho! y me sorprende la velocidad de respuesta jaja pense q se iban a tardar mas me encanta este foro :D

Intentare eso que me dices, tambien habia conseguido esto que lo iba a probar.

"type tMatriz= record datos: array [1..N,1..N] of real;        f,c: 0..N;    
end; "

Declarando la matriz como 1 record. pero usare la forma que me haz dicho porque la veo mas directa.

Ando reaprendiendo y necesito ponerme bien con procedimientos y funciones porque estoy aprendiendo a usar objetos, me lo exige el curso de computacion en el que actualemnte estoy. :P muchisimas gracias nuevamente, seguire posteando por aca cada vez que me salga alguna dudita saludos, en lo poco que pueda ayudar por ahora esto a la orden ^.^ conozco mas de PHP y MySQL por si alguien necesita algo!

Saludos.


09-Dec-2010 15:27
Jesús Rodríguez

Buenas, de nuevo yo con otra duda pasando por aca :P

Les planteo la situacion:

Estoy practicando programacion orientada a objetos intentando hacer un objeto de una matriz, aunque para no complicarme mucho estoy utilizando arrays para no irme tan al fondo solo quiero practicar programando los metodos y eso. ya he programado el metodo para crear la matriz, para imprimirla y para sumar 2 matrices, pero sucede que cuando sumo 2 matrices y utilizo el metodo de impresion de una de ellas me imprime la matriz correcta sumada pero ademas de esto agrega otra matriz con puros valores de 0 y luego me la imprime nuevamente. osea imprime 3 matrices, no es algo tan grave porque por lo menos se q no voy tan mal pero si me gustaria saber porque se comporta de esta manera. les adjunto el unit con la clase matriz q estoy desarrollando y el programa que la implementa, saludos!.


09-Dec-2010 17:34
Antonio P.G.

Hola Jesús.

He descargado el adjunto, y escribo algunos detalles según lo leo. (Recuerda que aquí el profesor es Nacho, y todo lo que yo diga es siempre discutible :-) ).

Primero miro al Unit:

- Creo que no se debe escribir desde las funciones porque pueden generar errores. Esto lo digo por la función de la suma.

- Además, la función "Suma" no devuelve nada. Lo que hace tu función es crearse una variable auxiliar "msuma", pero no la "recoge" para devolverla al exterior. No olvides poner "matriz_cuadrada.suma:= msuma;" antes de que la función termine.

- Con respecto al procedimiento de "Imprimir": lo lógico es que los métodos se refieran al objeto, es decir, que si yo tengo una matriz "A" y la quiero imprimir, diga algo como "¡Matriz A, imprímete!". Sin embargo, tú aquí le das una matriz cualquiera al método "Imprimir" del objeto que es una matriz. Es decir, dices algo como "¡Matriz A, imprime a tu hermana la matriz B!". ¿Entiendes? Entonces, simplemente te propongo que hagas un método que no tenga parámetros de entrada y que imprima la matriz "m" del objeto. Espero haberme explicado en esto.

- Un par de detalles. Antes de los bucles "for", asignas "i:=1; j:=1;". Eso no es necesario, ya que ya lo indicas en la cabecera del bucle "for i:= 1 to 2 do". Ahora bien, recuerda que al terminar los bucles las variables que utilizaste como índices tienen asignado el valor de la última vuelta que dieron (en este caso 2).

El otro detalle es que cuando un bucle contiene una sola instrucción, no es necesario poner "begin...end;". Así, podrías simplificar y escribir:
"
for i:= 1 to 2 do
..for j:= 1 to 2 do begin
....blablabla;
....blablabla;
..end;
"
¿Ok?

Voy con el programa:

- Del programa no tengo nada que comentar, mas que es un buen programa para comprobar que las cosas funcionan o no. Modificaría algunas cosas, en función de lo que he dicho sobre la Unit.

Espero haberme explicado bien. Es una buena idea eso de objetos-matrices. Si hay alguna cosa que no haya quedado clara, escribe, por favor.

Saludos.


09-Dec-2010 19:35
Jesús Rodríguez

Hola de nuevo Antonio, agradecido eternamente por tus correcciones y sugerencias.

- Yo si sabia que con las funciones me faltaba algo, en PHP usaba RETURN y aca no recordaba como hacerlo ya estoy mas claro con eso que me acotaste del "matriz_cuadrada.suma:= msuma;" aunque te comento que me funciono fue colocando "suma:= msuma;" sopongo que fue porque ya en la cabezera de la funcion habia colocado que esa funcion pertenecia a "matriz_cuadrada".

- Te entiendo lo que me dices del procedimiento imprimir y de hecho lo tenia asi antes, pero necesitaba saber si me estaba sumando los valores correctamente y por eso lo coloque asi con parametros para probar. :P

- Lo de los begin y end gracias por el dato ;) aunque es mas costumbre que los coloco xq siento que asi se donde empieza y donde cierran jeje sino me pierdo pero intentare simplificar como dices, por eso amo PHP xq todos los begin y end son {} xD

Nuevamente te agradezco por toda tu ayuda Antonio y te seguire haciendo consulticas cuando me vuelva a trancar :P cuando termine este ejercicio de Matrices empezare con punteros alli si posteare aun mas porque las dudas que tengo con punteros son grandes xD y necesito hacer unos objetos de pilas y colas jeje

Gracias y saludos!


10-Dec-2010 00:19
Nacho Cabanes (+83)

Jesús, apenas dos comentarios:

- En vez de adjuntar ficheros comprimidos, intenta copiar y pegar los fragmentos de código más significativos, para que podamos opinar sin necesidad de descargar nada. Cuanto más fácil se lo hagas a quien deseas que te ayude, más fácil será que te ayude.

- Si pretendes pasar a punteros tras haber hecho sólo un ejercicio de matrices... me temo que no estás profundizando lo suficiente.  ;-D

Algo me dice que tendré que añadir más ejercicios al curso...  XD

Bueno, no puedo evitar dos comentarios más:

- La frase "intentando hacer un objeto de una matriz" da un poco de miedo.  ;-D

- Eso de que yo sea profesor no quiere decir que mi opiniones no sean discutibles. XD


10-Dec-2010 13:53
Jesús Rodríguez

Buenas,

Profesor Nacho, muchísimas gracias por todos sus comentarios, estoy muy agradecido por este foro y de la manera que Ud. comparte sus conocimientos,este fue el curso con el que yo aprendí muchas cosas de pascal en mi primera experiencia con la programación, lo use de referencia muchas veces cada vez que tenia dudas que no entendia del libro que leia en ese momento y lo sigo usando :P no se porque no me registre en ese momento pero ya lo estoy.  xD


- Intentare hacer eso de colocar trozos de codigo, Para la proxima ;-D

- Se que no estoy profundizando mucho, pero no tengo mas ejercicios de orientada a objetos, y en la materia Computacion II que estoy cursando de una se van para listas enlazadas,cabe destacar que yo tengo ciertos conocimientos de programación ya, en pascal,C,php. osea en estructuras de datos y algoritmos yo estoy relativamente bien, lo nuevo para mi es orientada a objetos, esta es mi segunda carrera. :P

- Si tienen mas ejercicios con objetos indiquenme por favor donde estan para ponerme a hacerlos :P ya este de matrices que me decia mi libro ya lo termine :P cuando le termine algunos detalles lo subo para que uds. lo comenten y mejoren si lo quieren usar para ejemplos. ^.^

- Porque le da miedo la frase "Intentando hacer un objeto de una matriz" a mi me parecio lo mas fácil para experimentar xD no se los demas pero yo aprendo haciendo. jeje xD

Agradecido eternamente.

Saludos a todos.


10-Dec-2010 16:30
Jesús Rodríguez

Hola de nuevo :P una vez mas yo por aca con mis dudas :P

Ya tengo casi listo el ejercicio que estaba haciendo de matrices, me solicitaban hacer un objeto de una matriz y que tubiese de métodos: Suma de matrices, Producto de matrices, Diagonal de una matriz, Matriz Identidad, y Producto de un escalar. Todo esto con matrices cuadradas.

Yo, para no complicarme la vida, empecé con matrices cuadradas de 2x2, colocando en todos mis metodos ciclos de 1..2, y asi programar a pequeña escala pensando en cambiar luego ese 2 por alguna variable que denote el tamaño real de la matriz con la que esté trabajando.

Aqui viene la duda, ¿como hago para hacer una matriz que cresca de manera dinamica? , Me explico, que el usuario inserte el numero de filas/columnas (puede ser 1 solo numero ya q seran matrices cuadradas y sabemos q son de igual filas y columnas) y se cree el array del tamaño que el usuario indique. He leido que en pascal no existen las matrices dinamicas y que esto se logra con apuntadores, he alli mi gran falla no logro dominarlos. Solicito una vez mas su gloriosa AYUDAA! xD

Este es el trozo de codigo de mi objeto Matriz_Cuadrada

Tmatriz2x2 = array [1..2,1..2] of real;
 
 matriz_cuadrada = object
     m : Tmatriz2x2;
     procedure nuevamatriz();
     function suma(matriza: Tmatriz2x2) : Tmatriz2x2;
     procedure imprimirmatriz();
     function producto(matriz: Tmatriz2x2) : Tmatriz2x2;
     function escalar(x: real) : Tmatriz2x2;
     function identidad() : Tmatriz2x2;
     function diagonal() : vector;
 end;

Quisiera que ese " array [1..2,1..2] of real; "
Fuera " array [1..N,1..N] of real; ",
¿Es posible? ¿ Como se logra?

Gracias de antemano por todas las ayudas que me puedan dar.
Adjunto El objeto y el programa que lo implementa para que revisen si lo desean.


10-Dec-2010 21:10
Nacho Cabanes (+83)

Decías:

"Quisiera que ese " array [1..2,1..2] of real; "
Fuera " array [1..N,1..N] of real; ",
¿Es posible? ¿ Como se logra?"

En Pascal "no se logra". Me explico... hay dos alternativas:

- La del principiante, sobredimensionar: usar una matriz más grade que lo que esperas necesitar, y uno de los parámetros que pasas a la función es el tamaño. Por ejemplo, una matriz 1..100,1..100 y al llamar indicas que realmente sólo vas a usar 4 filas y 4 columnas.

- La del experto que quiere optimizar espacio, usar variables dinámicas: como las listas enlazadas, pero una lista enlazada es unidimensional, y una matriz como la que propones es bidimensional, así que necesitas una estructura de dos dimensiones (por ejemplo, una lista de listas), que será (bastante) más difícil de manejar y más lenta, pero también más versátil.

Si quieres ejercicios de algún tema concreto, sólo tienes que pedirlos: mi curso de Pascal es "antiguo", últimamente he impartido cursos presenciales de C y C#, así que tengo muchos más ejercicios propuestos en mis cursos de C y C#, la mayoría de los cuales se podrían aplicar a Pascal. Así que sólo tienes que decir "quiero ejercicios de arrays" o "quiero ejercicios de records" o "quiero ejercicios de creación de clases", y te busco unos cuantos enunciados.


10-Dec-2010 21:24
Jesús Rodríguez

Te entiendo nacho, agradecido por tu respuesta.

Puntualmente necesito la solucion que denominas "La del experto", osea el camino dificil :P el siguiente tema que debo aprender son listas enlazadas y con punteros tengo demasiadas dudas no termino de entenderlos a nivel de sintaxis, ya la idea intuitiva la tengo de que un objeto apunta a otro y asi sucesivamente pero en sintaxis no se como programar algo asi, quisiera ver en pascal si es posible un ejemplo donde un objeto apunte a otro y tan solo imprimir en pantalla Objeto A apunta a Objeto B. Con eso seria el empujon que me hace falta para poder empezar a hacer todo lo demas. :P

Saludos y muchas gracias nuevamente por todas sus respuestas.


11-Dec-2010 18:35
Antonio P.G.

Hola.

Publico la respuesta de aquí en otro tema nuevo, porque las columnas se van achicando y porque creo que esto ya se puede considerar otro tema.

¡Ciao!


13-Dec-2010 14:05
Jesús Rodríguez

Ok te leo en el proximo tema gracias






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