Arrays en Pascal

Iniciado por Corso, 9 Diciembre 2005, 19:05 PM

0 Miembros y 1 Visitante están viendo este tema.

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.
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.



jvchino

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);

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.
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.



jvchino

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

#4
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.
Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.