Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Ejercicios => Mensaje iniciado por: Corso en 9 Diciembre 2005, 19:05 PM

Título: Arrays en Pascal
Publicado por: Corso en 9 Diciembre 2005, 19:05 PM
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
Título: Re: Arrays en Pascal
Publicado por: jvchino en 10 Diciembre 2005, 08:05 AM
Me parece que estás un poco confundido con los TIPOS y VARIABLES.  Pero primero empecemos por algo más básico:

EL BUCLE INFINITO
Se 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 VARIABLES
Tienes 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 PROCEDIMIENTOS
Una 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_PRECIOS
Para 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);

Título: Re: Arrays en Pascal
Publicado por: Corso en 11 Diciembre 2005, 21:32 PM
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.
Título: Re: Arrays en Pascal
Publicado por: jvchino en 14 Diciembre 2005, 06:21 AM
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.
Título: Re: Arrays en Pascal
Publicado por: Corso en 21 Diciembre 2005, 01:46 AM
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.