[ Foro de Pascal ]
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.
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;
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
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.
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
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;
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;
?
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;
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.
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
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
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.
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
...
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;
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).
Excelente explicacion profesor ahora si que lo veo mas claro, millones de gracias y por tu paciencia y comprension en mi aprendizaje.
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.)