elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Ingresar Registrarse
08 Septiembre 2008, 11:05  



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

Desconectado Desconectado

Mensajes: 335



Ver Perfil WWW
Registros en Pascal
« en: 26 Diciembre 2005, 02:04 »

Problema con codigo que no consigo sacar.

Esto es lo que yo e hecho:

Código:
program cuadros;

const
     tamcoleccion=3;

type

    Tcuadro=record
              NumCuadro:integer;
              Titulo:string;
              Autor:string;
              Precio:real;
    end;
             
    Tcoleccion= array [1..tamcoleccion] of Tcuadro;


procedure lee_cuadro(Var cuadros:Tcuadro);

begin
     writeln;
     write(' Numero de cuadro: ');
     readln(cuadros.NumCuadro);
     write(' Titulo cuadro: ');
     readln(cuadros.Titulo);
     write(' Autor: ');
     readln(cuadros.Autor);
     write(' Precio: ');
     readln(cuadros.Precio);
     writeln;
end;

procedure imprime_cuadro(cuadros:Tcuadro);

begin
     writeln;
     writeln(cuadros.NumCuadro,': ',cuadros.Titulo);
     writeln('   Autor: ',cuadros.Autor);

     if cuadros.Precio=0 then
        writeln('   Precio: No en venta')
     else
         writeln('   Precio: ',cuadros.Precio:0:2);

     writeln('---');
end;

procedure lee_coleccion (VAR lectura:Tcoleccion;tamcoleccion:integer);

var
   i:integer;
   
begin
     for i:=1 to tamcoleccion do
         lee_cuadro(lectura[i]);
end;

procedure imprime_coleccion (lectura:Tcoleccion;tamcolecion:integer);

var
   i:integer;
   
begin
     for i:=1 to tamcoleccion do
         imprime_cuadro(lectura[i]);
end;

function suma_coleccion(lectura:Tcoleccion;tamcoleccion:integer;VAR no_en_venta:real):real;

var
   i:integer;

begin
     for i:=1 to tamcoleccion do
         if no_en_venta=0 then
            no_en_venta:=i;
     
     for i:=1 to tamcoleccion do
         suma_coleccion:=suma_coleccion+lectura[i].cuadros.precio;
end;



var
   coleccion1:Tcoleccion;
   suma:real;
   no_en_venta:real;

begin
     writeln('>Datos primera coleccion: ');
     lee_coleccion(coleccion1,tamcoleccion);

     writeln('>Datos de los cuadros: ');
     imprime_coleccion(coleccion1,tamcoleccion);
     
     suma:=suma_coleccion(coleccion1,tamcoleccion,no_en_venta);

     writeln('La suma es: ',suma:0:2);
     writeln('Y hay ',no_en_venta,' cuadro no en venta');

end.


Tengo que hacer esto:


Añadir al programa anterior una función de nombre suma_coleccion. Esta función devuelve como resultado de la función el valor total de la colección. Pero como es posible que algunos cuadros no estén a la venta, esta función además devolverá como parámetro por referencia el número de cuadros que no están en venta.


Y llamarlo de esta manera, y no puedo hacerlo de otra:

Código:

 (* -- Cálculo de la suma  --*)
  suma := suma_coleccion(coleccion1, TAMCOLECCION, no_en_venta);
 
  (* -- Presentación de resultados --*)
  writeln('>Datos de los cuadros');
  imprime_coleccion(coleccion1, TAMCOLECCION);

  writeln('> La suma es: ', suma:0:2);
  writeln('> Y hay ', no_en_venta, 'cuadro no en venta');


De lo que yo e codeado, se que todo funciona menos la función suma_coleccion que se me solicita codear y llamar de esa precisa manera...

Ideas?

Lo de
Código:
   
for i:=1 to tamcoleccion do
   if no_en_venta=0 then
          no_en_venta:=i;
está claro que no es así pero no se me ocurre ninguna manera..

Y por que no me deja llamar asi
Código:
lectura[i].cuadros.precio;
al registro precio?

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
Colaborador

Desconectado Desconectado

Mensajes: 1.976


La felicidad no es una meta, es un camino.


Ver Perfil
Re: Registros en Pascal
« Respuesta #1 en: 26 Diciembre 2005, 06:49 »

Primero veamos algunas "cosillas" de tu codificación y luego vienen las sugerencias.
Dentro de la función "suma_coleccion" tienes la siguiente sentencia:
Código:
function suma_coleccion(lectura:Tcoleccion;tamcoleccion:integer;VAR no_en_venta:real):real;
.
.
   suma_coleccion := suma_coleccion + .......
.
.
end;

Eso se llama "Recursividad", es decir dentro de una función llamas a la misma funcion.  Eso es válido pero hay que saber usarlo.  Personalmente no me gusta mucho la recursividad pero algunas veces su uso es necesario.
Además que te faltarían los parámetros:
 suma_coleccion := suma_coleccion(parámetros)

Dicho esto, pasamos a:
Citar
Y por que no me deja llamar asi
Código:
lectura[i].cuadros.precio;
al registro precio?

Aclarando que "PRECIO" no es un registro sino un CAMPO de un registro.
Para acceder a un campo del registro va: variable_tipo_registro.campo
En este caso las variables tipo registro son cada una de los datos del array coleccion1, es decir coleccion1[1], coleccion1[2] y coleccion1[3]; que en la función son asignadas al array "lectura"
En resumen: Para acceder al campo precio (dentro de la función) debes escribir:  lectura.precio

Ahora sí pasamos a la parte más importante.
Primero debes tener una variable suma_aux dentro de la función:
Código:
function suma_coleccion(lectura:Tcoleccion;tamcoleccion:integer;VAR no_en_venta:real):real;
var
  i:integer;
  s_aux:real;
begin
  s_aux:=0;
  for i:=1 to tamcoleccion do
    if lectura[i].precio = 0 then
         no_en_venta := no_en_venta + 1
    else s_aux := s_aux + lectura[i].precio;
  suma_coleccion:=s_aux
end;


Sugerencias final:
La variable "no_en_venta" al ser un contador debería ser del tipo integer.
Esta variable deber tener como valor inicial "CERO".  Algunos compiladores inicializan automáticamente las variables numéricas con cero, por lo cual ya no es necesario escribir la sentencia (En mi version del Turbo Pascal 5.5 sí es necesario inicializarlo)


SUERTE
En línea

Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.
Corso

Desconectado Desconectado

Mensajes: 335



Ver Perfil WWW
Re: Registros en Pascal
« Respuesta #2 en: 26 Diciembre 2005, 14:47 »

Gracias jvchino.
No pego el code, pero ya le asigne al "contador" no_en_venta 0 y de tipo integer.

Salu2.
En línea

Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.


sv51

Desconectado Desconectado

Mensajes: 3


Ver Perfil
Re: Registros en Pascal
« Respuesta #3 en: 21 Junio 2008, 02:24 »

 :laugh: gracias a Corso por publicar ese registro en pascal, yo estoy haciendo una agenda y no me salia el array pero al ver el ejemplo de Corso lo pude corregir.

Gracias a Corso y a todos los usuarios de este foro.
En línea
Páginas: [1] Ir Arriba Imprimir 
Ir a:  







Consolas     La Web de Goku     MilW0rm     MundoDivx

Hispabyte     Truzone     TodoReviews     ZonaPhotoshop

hard-h2o modding    Foros de ayuda    Yashira.org    Videojuegos    indetectables.net   

Noticias Informatica    Seguridad Informática    ADSL    Foros en español    eNYe Sec

Todas las webs afiliadas están libres de publicidad engañosa.

Powered by SMF 1.1.5 | SMF © 2006-2008, Simple Machines LLC