elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  Arrays en Pascal
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Arrays en Pascal  (Leído 23,659 veces)
Corso


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Arrays en Pascal
« 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;

Código:

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
Código:
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 Desconectado

Mensajes: 1.999


La felicidad no es una meta, es un camino.


Ver Perfil
Re: Arrays en Pascal
« Respuesta #1 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:
Código:
   write('Introduzca el precio a buscar en las tablas (0 para terminar)');
   readln(busca);


TIPOS Y VARIABLES
Tienes dos tipos que son idénticos
Código:
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:
Código:
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.
Código:
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:
Código:
  .
  .
  .
  encontrado:=false;
  writeln('Coleccion 2: ');
  .
  .
  .

4) No es necesario agregar la variable "o", puedes volver a usar la "i" para la segunda coleccion
Código:
  .
  .
  .
  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


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Re: Arrays en Pascal
« Respuesta #2 en: 11 Diciembre 2005, 21:32 pm »

Bueno, pues definitivamente así e dejado el code (todas las posibilidades posibles funcionan).

Código:

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 Desconectado

Mensajes: 1.999


La felicidad no es una meta, es un camino.


Ver Perfil
Re: Arrays en Pascal
« Respuesta #3 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.
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


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Re: Arrays en Pascal
« Respuesta #4 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...

Código:

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.


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
No entiendo los arrays
PHP
Riki_89D 7 3,706 Último mensaje 1 Diciembre 2010, 22:29 pm
por Shell Root
problema con pascal (arrays)
Ejercicios
claryortiz 0 2,644 Último mensaje 29 Marzo 2017, 03:00 am
por claryortiz
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines