[ Foro de Pascal ]

lectura

28-Mar-2014 22:36
Invitado (fer97)
16 Respuestas

hola buenas, agradecido con su ayuda.
queria preguntar a traves de un ejemplo como puedo leer datos para una matriz de 3*3, donde cada fila almacena valores de informacion diferente, podrian darme un ejemplo de como hacer esa lectura, es decir , no la lectura tipìca de los elementos de una matriz , sino que por cada fila se le haga al usuario un writeln y un readln referente a los valores que se van a almacenar en cada fila, muchas gracias.


29-Mar-2014 18:13
Luis Torres (+18)

Se hace de igual forma, solo que debes acomodar un writeln en un punto del programa tal que te indique la fila sobre la cual leerás los datos. El código sería el siguiente:


  for i:=1 to 3 do
   begin
       writeln('Escribe los elementos de la fila ',i);
       for j:=1 to 3 do
         begin
             write('Elemento ',j); 
             readln(Mat[i,j]);
         end;
   end;

30-Mar-2014 01:00
Invitado (fer97)

hola luis gracias por responderme siempre eres muy amable, sin embargo en esta ocasion no se si no me hice entender, pero mira lo que quisiera es porejemplo imaginate que debe pregunrse al usuario que ingrese las edades de n personas, entonces porejemplo para ea primera fila de la matriz se deberia preguntar, digite las edades de la persona 1 a N  Y luego leidos estos valores se pregunte porejemplo por el numero de hijos de cada una de esas edades de personas, que serian los valores para la segunda fila de la matriz y que para la tercera fila de esa matriz se preguntara porejemplo ingrese los años de casado, es decir para cada llenado de fila que se permitan diferentes mensajes de ingreso de datos segun la fila de llenado. espero  me haya hecho explicar y puedas plasmarmelo en un ejemplo como el que me diste pero para este caso que te comento, muchas gracias luis


30-Mar-2014 16:38
Luis Torres (+18)

Pues el código que se pasé te debe da un idea de cómo se haría. Cuando te dije que incluyeras un writeln me refería a que debes incluir en esa posición del programa el código que te permita generar mensajes diferentes para cada fila. Para el problema que acabas de plantear, lo podríamos hacer con condicionales (if) para cada valor de fila "i", éstos condicionales se colocarían en la misma posición del writeln; otra opción sería con el uso de un "case" y cada opción sería igualmente el valor "i" de cada fila. Yo supongo que eso lo sabrás hacer tú.

Saludos.


30-Mar-2014 17:23
Invitado (fer97)

Hola compañero luis, gracias como siempre, pero podrias por favor indicarmelo a traves de un pequeño ejemplo quiza lo entendere mejor, disculpa las molestias


30-Mar-2014 18:31
Luis Torres (+18)

Bueno, justamente donde tienes el writeln, debes colocar algo como así:


case i of
    1:  writeln('Ingrese las edades de las 3 personas: ');
    2:  writeln('Ingrese la cantidad de hijos de cada persona: ');
    3:  writeln('Ingrese los años de casado de cada person: ');
end;

30-Mar-2014 18:46
Invitado (fer97)

hola luis, gracias, solo una cosa mas por favor, en ese caso de colocar el case ya no vendria despues:


for j:=1 to 3 do
         begin
             write('Elemento ',j); 
             readln(Mat[i,j]);
         end;


?


30-Mar-2014 19:10
Invitado (fer97)

luis hola, podria ser algo asi : ??? si es asi , se te ocurre una forma mas compacta o reducida ?? , gracias luis.


for i:=1 to 3 do
   begin
       case i of
           1:  begin
                  writeln('Ingrese las edades de las 3 personas: ');
                  for j:=1 to 3 do
                     begin
                        writeln('edad ',i, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;
           2:  begin
                  writeln('Ingrese la cantidad de hijos de cada persona: ');
                  for j:=1 to 3 do
                     begin
                        writeln('cantidad hijos persona ',i, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;



           3:   begin
                  writeln('Ingrese los años de casado de cada persona: ');
                  for j:=1 to 3 do
                     begin
                        writeln('años de casado persona ',i, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;
      
   end;



30-Mar-2014 20:07
Luis Torres (+18)

Así no está bien hecho. Tienes que hacer las corridas de mesa para saber si algo está correctamente bien implementado o no.  En la forma en que yo te sugerí hay que sustituir el writeln del primer código por el código del case, se deja igual el resto (o sea, que se deja igual el for j ..... ). Solo que así te va a preguntar, para i:=1,  por las edades, luego debes ingresar cada una de las edades sin preguntarte expresamente por ellas, sino como elemento 1, elemento 2 y elemento 3.
Si no sabes manejar el case, debes aprender a hacerlo, cuando lo entiendas bien, sabrás como implementarlo en un código.
Saludos.


30-Mar-2014 21:07
Invitado (fer)

luis pero que es lo que esta en si mal en el programa que plantee segun entonces esa idea como podria ser el codigo amigo , es que estoy confundido por favor.gracias


30-Mar-2014 23:53
Nacho Cabanes (+84)

Veamos, fer97... si haces varios pequeños cambios, el fuente podría estar "casi bien pero muy mal".

Con "casi bien" me refiero a que funcionará si completas el código y corriges algún "error menor", como que debes usar "j" en vez de "i" en la siguiente línea


writeln('cantidad hijos persona ',i, ': '); 


(si usas variables como "numeroDePersona" en vez de "j", tardarás un poco más en teclear el programa, pero perderá muchísimo menos tiempo en detectar errores como ese).

Con "muy mal" me refiero a que es una aberración usar un array bidimensional para datos tan distintos. O bien usas varios arrays individuales, o bien, si son datos algo relacionados, un array de registros.

Si no sabes de arrays de registros, mira este apartado de la nueva versión del curso:
http://www.nachocabanes.com/pascal/cupas5/cupas04c.php


31-Mar-2014 00:33
Luis Torres (+18)

Disculpa, en realidad estaba bien, es lo que leí muy por encima y hubo cosas que no me cuadraron. Está bien salvo las observaciones que hizo el prof. Nacho Cabanes. Por cierto, muy válidas aquella en la que señalaba que leer datos de distintos tipos para un array es algo descabellado, salvo algunas excepciones. Para manejar datos de distintos tipos están mandado a hacer las estructuras, tal como ya te lo dijo.
Saludos.


31-Mar-2014 19:54
Invitado (fer97)

EXCELENTES explicaciones y lo hago con un mayuscula por que realmente son magistrales sus aclaraciones a mi codigo, entiendo tambien ahora una vez leido el tema que me sugirio el profesor nacho acerca de arrays de estructuras, tambien lo de mi error con el i siendo realmente j, sin embargo no se si estoy mal seguramente si pues estoy aprendiendo a penas, pero profesor nacho y luis una cosa que me dejan con cierta inquietud es lo referente a que segun mi manera de ver el problema, no se estan tratando datos de distinto tipo, de hecho la matriz esta definida para datos de tipo integer, sino mas bien que es una forma de acomodar los mensajes que se desean para el usuario, entonces no entiendo por que ambos coinciden en que mi solucion con las correcciones señaladas aun asi sigue siendo una aberraccion o algo descabellado, si pueden matizarme sobre ello estare inmensamente agradecido, por que tan solo me queda esa duda, de que si aun corriendo bien el programa con las correcciones del i por el j, y a mi modo de ver datos al fin y al cabo del mismo tipo, sigue estando descabellada la solucion que plantee, millones de gracias por su intervencion y comprension a mis dudas


31-Mar-2014 19:57
Invitado (fer97)



...
var Mat:array[1..3,1..3] of integer;
...
for i:=1 to 3 do
   begin
       case i of
           1:  begin
                  writeln('Ingrese las edades de las 3 personas: ');
                  for j:=1 to 3 do
                     begin
                        writeln('edad ',j, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;
           2:  begin
                  writeln('Ingrese la cantidad de hijos de cada persona: ');
                  for j:=1 to 3 do
                     begin
                        writeln('cantidad hijos persona ',j, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;
 
 
 
           3:   begin
                  writeln('Ingrese los años de casado de cada persona: ');
                  for j:=1 to 3 do
                     begin
                        writeln('años de casado persona ',j, ': '); 
                        readln(Mat[i,j]);
                    end;
                end;
 
   end;



31-Mar-2014 20:01
Nacho Cabanes (+84)

Esta alternativa es mucho más legible, menos propensa a errores... e incluso ocupa bastante menos (usando 3 arrays independientes)...


var
  edades, hijos, anyosCasado: array[1..3] of integer;

writeln('Ingrese las edades de las 3 personas: ');
for j:=1 to 3 do
begin
    writeln('edad ',j, ': '); 
    readln(edades[j]);
end;

writeln('Ingrese la cantidad de hijos de cada persona: ');
for j:=1 to 3 do
begin
    writeln('cantidad hijos persona ',j, ': '); 
    readln(hijos[j]);
end;
  
writeln('Ingrese los años de casado de cada persona: ');
for j:=1 to 3 do
begin
    writeln('años de casado persona ',j, ': '); 
    readln(anyosCasado[j]);
end;



Y esta es también más legible y posiblemente más elegante (usando un array de registros, ya que todo son datos de una persona):


var
  datos: array[1..3] of record
    edad, hijos, anyosCasado: integer;
    end;

writeln('Ingrese las edades de las 3 personas: ');
for j:=1 to 3 do
begin
    writeln('edad ',j, ': '); 
    readln(datos[j].edad);
end;

writeln('Ingrese la cantidad de hijos de cada persona: ');
for j:=1 to 3 do
begin
    writeln('cantidad hijos persona ',j, ': '); 
    readln(datos[j].hijos);
end;
  
writeln('Ingrese los años de casado de cada persona: ');
for j:=1 to 3 do
begin
    writeln('años de casado persona ',j, ': '); 
    readln(datos[j].anyosCasado);
end;


Esta última se podría compactar más aún si usas un único "for", para pedir los 3 datos de cada persona:


var
  datos: array[1..3] of record
    edad, hijos, anyosCasado: integer;
    end;

for j:=1 to 3 do
begin
    writeln('edad de la persona',j, ': '); 
    readln(datos[j].edad);
    writeln('cantidad de hijos de la persona ',j, ': '); 
    readln(datos[j].hijos);
    writeln('años de casado persona ',j, ': '); 
    readln(datos[j].anyosCasado);    
end;


Lo terriblemente peligroso (y que debes evitar a toda costa) de tu solución es la falta de legibilidad: 20 minutos después de escribir el código, ya no recordarás si "Mat[2,3]" era una edad, o una cantidad de hijos o qué era (y no digamos si el fuente lo tiene que manipular otra persona que no seas tú). Estás agrupando datos que, aunque todos sean Integer, no deberían estar agrupados, porque corresponden a bloques distintos de información. Eso supone que haya que volver a buscar la definición de los datos para ver a qué se refería cada cosa.

Debes perseguir que cada fragmento de tu programa sea entendible por sí solo, y coincidirás conmigo en que "datos[3].edad" y "edades[3]" son alternativas mucho más entendibles que "Mat[2,3]".

Es una máxima que intento inculcar a mis alumnos, porque en un proyecto real se pierde mucho más tiempo en ampliarlo y en corregir errores que en crear la estructura inicial, y una de las formas de evitar esas pérdidas de tiempo (dentro de lo posible) es buscando legibilidad en el programa: bloques con cometidos claros, variables con nombres que ayuden a entender la lógica, comentarios que precedan a los bloques y expliquen cual es la misión de ese bloque... de forma que de un vistazo rápido se pueda saber qué hacía ese fragmento de programa, y se pueda ampliar o corregir en muy poco tiempo (y, por tanto, con poco coste).


31-Mar-2014 20:33
Invitado (fer97)

Excelente explicacion profesor ahora si que lo veo mas claro, millones de gracias y por tu paciencia y comprension en mi aprendizaje.


31-Mar-2014 20:38
Nacho Cabanes (+84)

Nada, para eso estamos.  ;-)

¡A seguir aprendiendo!






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