Autor
|
Tema: Arrays en Pascal (Leído 23,659 veces)
|
Corso
|
Buenas... Esto va mas que nada dirigido a jvchino, que al pobre lo tengo abrasado ya... (mis disculpas). Bueno, tengo que codificar un programa que gestione dos tablas, y el resultado debe ser algo como esto: Coleccion 1: Introduza los precios Cuadro 1: 100 Cuadro 2: 200 Cuadro 3: 300 Cuadro 4: 400 Coleccion 2: Introduza los precios Cuadro 1: 300 Cuadro 2: 500 Cuadro 3: 600 Cuadro 4: 1000 Coleccion 2 vale mas que coleccion 1 Introduzca el precio a buscar en las tablas (cero para terminar): 200 Coleccion 1: > Encontrado precio 200.0 en cuadro 2 Coleccion 2: > Precio 200.0 no encontrado. Introduzca el precio a buscar en las tablas (cero para terminar): 600 Coleccion 1: > Precio 600.0 no encontrado. Coleccion 2: > Encontrado precio 600.0 en cuadro 3 Introduzca el precio a buscar en las tablas (cero para terminar): 300 Coleccion 1: > Encontrado precio 300.0 en cuadro 3 Coleccion 2: > Encontrado precio 300.0 en cuadro 1 Introduzca el precio a buscar en las tablas (cero para terminar): 50 Coleccion 1: > Precio 50.0 no encontrado. Coleccion 2: > Precio 50.0 no encontrado. Introduzca el precio a buscar en las tablas (cero para terminar): 0 Coleccion 1: > Precio 0.0 no encontrado. Coleccion 2: > Precio 0.0 no encontrado.
Y “mi”, codigo; program galeria;
const tamcoleccion=4;
type coleccion=array[1..tamcoleccion] of integer; coleccion2=array[1..tamcoleccion]of integer;
var muestratablas:coleccion;
procedure lee_tabla(VAR Lectura1:coleccion;lectura2:coleccion2;tamcoleccion:integer);
var i:integer; o:integer; sumatab1:integer; sumatab2:integer;
begin
writeln('--Coleccion 1--'); writeln('Introduzca los precios'); writeln; for i:=1 to tamcoleccion do begin write('Cuadro ',i,': '); readln(lectura1[i]); sumatab1:=sumatab1+lectura1[i]; end; writeln; writeln('--Coleccion 2--'); writeln('Introduzca los precios'); for o:=1 to tamcoleccion do begin write('Cuadro ',o,': '); readln(lectura2[o]); sumatab2:=sumatab2+lectura2[o]; end; writeln; if sumatab1 > sumatab2 then writeln('Coleccion 1 vale mas que coleccion 2');
if sumatab1 < sumatab2 then writeln('Coleccion 2 vale mas que coleccion 1'); writeln; end;
(*Estre procedimiento, lo codeo jvchino, para otro ejercicio que era similar, yo lo e intentado adaptar, pero no soy capaz...*) procedure busca_precios (Lectura1:coleccion;lectura2:coleccion2;tamcoleccion:integer);
var i:integer; o:integer; busca:real; encontrado:boolean;
begin write('Introduzca el precio a buscar en las tablas (0 para terminar)'); readln(busca);
while (busca>0) do begin encontrado:=false; writeln('Coleccion 1: '); for i:=1 to tamcoleccion do if busca=lectura1[i] then begin writeln('Encontrado precio ',busca:0:1,' en cuadro ',i); encontrado:=true; end;
if not encontrado then writeln('Precio ',busca:0:1,' no encontrado');
writeln('Coleccion 2: '); for o:=1 to tamcoleccion do if busca=lectura2[o] then begin writeln('Encontrado precio ',busca:0:1,' en cuadro ',o); encontrado:=true; end;
if not encontrado then writeln('Precio ',busca:0:1,' no encontrado'); end; end; begin lee_tabla(muestratablas,muestratablas,tamcoleccion); busca_precios(muestratablas,muestratablas,tamcoleccion); end.
Pues el primer problema... Hice un for justa al comienzo del procedimiento busca_precios, para ver que tenia dentro la tabla lectura2 for o:=1 to tamcoleccion do Writeln(lectura2[o]); Pues tiene cojones la cosa, que esa tabla, dentro de ese procedimientos, tiene los mismos valores que la tabla lectura1 (en el primer procedimiento no, la tabla1 tiene guardados los valores que se le metieron, y la tabla2 los suyos, pero la uso en este procedimiento... Y a tomar por culo) El segundo problema... Si compilais el programa, toda salta bien hasta ‘Introduzca el precio a buscar en las tablas (0 para terminar)... Si metes por ejemplo 100, a parte de que se produce un bucle que no para, suelta Colección 1: Encontrado precio 100 en cuadro ‘el que sea en este caso’ Colección 2: Encontrado precio 100 en cuadro ‘el que sea en este caso’ Bueno esto es por lo de antes, por que como los valores de lectura1 pasan también a lectura2, pues es lo mismo... Lo que no entiendo es por que lo del bucle infinito... Sin esos dos problemas... Tendría que funcionar... Salu2.
|
|
|
En línea
|
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.999
La felicidad no es una meta, es un camino.
|
Me parece que estás un poco confundido con los TIPOS y VARIABLES. Pero primero empecemos por algo más básico: EL BUCLE INFINITOSe da porque dentro del WHILE...DO no cambia el valor de "BUSCA", es decir te falta agregar: write('Introduzca el precio a buscar en las tablas (0 para terminar)'); readln(busca); TIPOS Y VARIABLESTienes dos tipos que son idénticos type coleccion = array[1..tamcoleccion] of integer; coleccion2= array[1..tamcoleccion] of integer; Y una sola variable "muestratablas" del tipo "coleccion". Cuando haces este llamado: busca_precios( muestratablas, muestratablas,tamcoleccion); Y tienes como cabecera del procedimiento: procedure busca_precios ( lectura1:coleccion; lectura2:coleccion2;tamcoleccion:integer) El parámetro lectura1 toma el valor de la variable muestratablas; y lectura2 también coge los valores de muestratablas (Lo puse en colores para que vieras la correspondencia). Es por eso que dentro del procedimiento ambas tienen los mismos valores. Lo correcto sería tener dos variables tabla1 y tabla2 ambas del mismo único tipo: type coleccion = array[1..tamcoleccion] of integer;
var tabla1,tabla2:coleccion;
EL POR QUÉ DE LOS PROCEDIMIENTOSUna de las razones de la existencia de los procedimientos y funciones es evitar que se repitan códigos con lo cual se reduce el programa. Me refiero a que en "lee_tabla" el método para obtener los datos de una tabla (coleccion 1) lo repites luego para la otra tabla (Coleccion 2). Basta con hacer que lea una tabla, y llamarla dos veces desde el programa principal. Procedure lee_tabla(var lectura:coleccion; tamcoleccion, n:integer,); var i:integer;
begin writeln('-- Coleccion ',n,'--'); writeln('Introduzca los precios'); writeln; for i:=1 to tamcoleccion do begin write('Cuadro ',i,': '); readln(lectura[i]) end end;
{programa principal} lee_tabla(tabla1,tamcoleccion,1); lee_tabla(tabla2,tamcoleccion,2);
EL PROCEDIMIENTO BUSCA_PRECIOSPara buscar el precio, puedes utilizar el mismo código que has posteado con pequeñas modificaciones: 1) La cabecera: procedure busca_precios(lectura1,lectura2:coleccion;tamcoleccion:integer); 2) la variable "busca" no debe ser real sino entera (Ya que los precios están definidas del tipo integer) 3) Antes de la iniciar la búsqueda en la segunda coleccion, debes asignar otra vez FALSE a encontrado: . . . encontrado:=false; writeln('Coleccion 2: '); . . . 4) No es necesario agregar la variable "o", puedes volver a usar la "i" para la segunda coleccion . . . encontrado:=false; writeln('Coleccion 2: '); for i:=1 to tamcoleccion do . . . 5) No te olvides de lo que tienes que agregar para evitar el bucle infinito. Y el llamado desde el programa principal sería: busca_precios(tabla1,tabla2,tamcoleccion); Con esto solucionas tus dos problemas. Saludos. P.D. Como puedes ver, tu procedimiento utiliza las mismas sentencias (los mismos pasos, el mismo procedimiento, el mismo método) para encontrar los precios en ambas colecciones. ¿Podrás modificarla (igual que "lee_tabla") para reducir la codificación y llamarla dos veces?, algo así: busca_precios(tabla1,tamcoleccion); busca_precios(tabla2,tamcoleccion);
|
|
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
Corso
|
Bueno, pues definitivamente así e dejado el code (todas las posibilidades posibles funcionan). program galeria;
const tamcoleccion=4; type coleccion=array[1..tamcoleccion] of integer;
var tabla1:coleccion; tabla2:coleccion;
procedure lee_tabla(VAR lectura1,lectura2:coleccion; tamacoleccion:integer);
var i:integer; suma:integer; suma2:integer;
begin writeln; writeln('--Coleccion 1--'); writeln('Introduzca el precio de los cuadros'); writeln; for i:=1 to tamcoleccion do begin write('Cuadro ',i,': '); readln(lectura1[i]); suma:=suma+lectura1[i]; end;
writeln; writeln('--Coleccion 2--'); writeln('Introduzca el precios de los cuadros'); writeln; for i:=1 to tamcoleccion do begin write('Cuadro ',i,': '); readln(lectura2[i]); suma2:=suma2+lectura2[i]; end;
writeln; if suma>suma2 then writeln('Coleccion 1 vale mas que coleccion 2'); if suma<suma2 then writeln('Coleccion 2 vale mas que coleccion 1');
end;
procedure busca_precios (lectura1,lectura2:coleccion;tamcoleccion:integer);
var i:integer; busca:integer; encontrado:boolean; begin
write('Introduzca el precio a buscar en las tablas, (0 para terminar)'); readln(busca);
while (busca > 0) do begin encontrado:=false; writeln('Coleccion 1'); for i:= 1 to tamcoleccion do if busca=lectura1[i] then begin encontrado:=true; writeln('Encontrado precio ',busca,' en cuadro ',i); end;
if encontrado=false then writeln('Precio ',busca,' no encontrado');
encontrado:=false; writeln('Coleccion 2'); for i:=1 to tamcoleccion do if busca=lectura2[i] then begin encontrado:=true; writeln('Encontado precio ',busca,' en cuadro ',i); end;
if encontrado=false then writeln('Precio ',busca,' no encontrado');
writeln; write('Introduzca el precio a buscar en las tablas (0 para terminar)'); readln(busca); end; end;
begin lee_tabla(tabla1,tabla2,tamcoleccion); busca_precios(tabla1,tabla2,tamcoleccion);
end.
El reto que me “tirastes”, pues no e sido capaz... Si fui capaz que presente las dos tablas en el mismo procedimiento, sin codearlas dos veces... Pero y luego? Como trabajo con los datos de las tablas? (para por ejemplo sacar Colección “tal”, vale mas que “cual”.)... De la manera que tu dices, se llama al procedimiento lee_tabla, tantas veces como sea necesario, pero yo necesito guardas esos datos en algún lado para luego trabajar con ellos... No se si me explique... Muchas gracias por la explicación, y si tienes un rato y ganas y me explicas como podríamos hacer de la manera que tu dices, para sacar que colección vale mas... (hay veré como trabajas con los datos, y imagino que ya sería capaz a sacar el procedimientos busca_precios...). Salu2. PD: Hasta el fin de semana no podré mirar nada... Pero tu postea, que yo luego leo xD PD2: Dios, y mira que no ver lo del while... ainss.
|
|
|
En línea
|
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.
|
|
|
jvchino
Solo soy un
Ex-Staff
Desconectado
Mensajes: 1.999
La felicidad no es una meta, es un camino.
|
Puedes declarar las variables SUMA1 y SUMA2 como globales y enviarselas como parámetros:
Cabecera de Procedimiento procedure lee_tabla(VAR lectura:coleccion; VAR suma:integer; tamacoleccion:integer);
Llamado al procedimiento lee_tabla(tabla1, suma1, tamcoleccion); lee_tabla(tabla2, suma2, tamcoleccion); compara_precios(suma1,suma2); {Llamado a otro procedimiento donde se comparan los precios}
Saludos.
|
|
|
En línea
|
Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
No, nada llega tarde, porque todas las cosas tienen su tiempo justo, como el trigo y las rosas
|
|
|
Corso
|
Se que a pasado mucho tiempo, pero lo deje un poco aparcado, y hoy me dio por ponerme y... SORPRESA... program galeria;
const tamcoleccion=4; type coleccion=array[1..tamcoleccion] of integer;
var tabla1:coleccion; tabla2:coleccion; suma,suma1,suma2,busca:integer;
procedure lee_tabla(n:integer;tamacoleccion:integer; Var lectura:coleccion; Var suma:integer);
var i:integer;
begin
writeln; writeln('--Coleccion',n, '--'); writeln('Introduzca el precio de los cuadros'); writeln; for i:=1 to tamcoleccion do begin write('Cuadro ',i,': '); readln(lectura[i]); suma:=suma+lectura[i]; end;
end;
procedure busca_precios(n:integer;tamcoleccion:integer;lectura:coleccion;busca:integer);
var i:integer; encontrado:boolean;
begin encontrado:=false; writeln('Coleccion ',n); for i:=1 to tamcoleccion do if busca=lectura[i] then begin encontrado:=true; writeln('Encontrado precio ',busca, ' en cuadro ',i); end; if encontrado=false then writeln('Precio ',busca,' no encontrado.');
end;
begin suma1:=0; lee_tabla(1,tamcoleccion,tabla1,suma1); suma2:=0; lee_tabla(2,tamcoleccion,tabla2,suma2);
if suma1>suma2 then writeln('Coleccion 1 vale mas que coleccion 2'); if suma1<suma2 then writeln('Coleccion 2 vale mas que coleccion 1');
writeln; write('Introduzca el precio a buscar en las tablas (0 para terminar): '); readln(busca);
while (busca>0) do begin busca_precios(1,tamcoleccion,tabla1,busca);
busca_precios(2,tamcoleccion,tabla2,busca);
writeln; write('Introduzca el precio a buscar en las tablas (0 para terminar): '); readln(busca); end;
end.
JVCHINO, LO SAQUE xDD No hice el procedimiento, por que en el ejercicio no se me permitia codear mas procedimientos ni funciones, por eso lo hice en el programa principal. Muchas gracias.. ahora sigo, y ya te tendré que preguntar . Salu2.
|
|
« Última modificación: 21 Diciembre 2005, 01:52 am por Corso »
|
En línea
|
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.
|
|
|
|
|