Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: Corso en 26 Diciembre 2005, 02:04 am



Título: Registros en Pascal
Publicado por: Corso en 26 Diciembre 2005, 02:04 am
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.


Título: Re: Registros en Pascal
Publicado por: jvchino en 26 Diciembre 2005, 06:49 am
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


Título: Re: Registros en Pascal
Publicado por: Corso en 26 Diciembre 2005, 14:47 pm
Gracias jvchino.
No pego el code, pero ya le asigne al "contador" no_en_venta 0 y de tipo integer.

Salu2.


Título: Re: Registros en Pascal
Publicado por: sv51 en 21 Junio 2008, 02:24 am
 :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.


Título: Re: Registros en Pascal
Publicado por: tugatime en 4 Diciembre 2012, 15:21 pm
Bueno, olviden mi pregunta ya esta resuelta.


Título: Re: Registros en Pascal
Publicado por: joseanh en 29 Junio 2013, 03:40 am
Ayuda con este ejercicio, no corre porque el array de registro esta lleno, que hago?

program registro(input,output);
uses crt;
const numpersona=3;
type
   carasteristica=record
   cedula,edad,telefono: integer;
   apellido,nombre,sexo,nacionalidad: string;
end;

lista=Array[1..numpersona] of carasteristica;
var personas:lista; var cant:integer;

procedure insertar(var personas:lista; var cant:integer);

var ced,ed,tel,x:integer;
var ape,nom,nac:string;
var encontrado:integer;
begin
     encontrado:=0;
    writeln('ingrese cedula');
    readln(ced);
      if (cant=0) then
          encontrado:=0
      else
          for x:=1 to cant do
               begin
               if (ced=personas
  • .cedula) then
                  begin
                     encontrado:=1;

                  end;
                 end;
            
    if (encontrado=0) then
       begin
            cant:=cant+1;
           writeln('ingrese apellido');
           readln(ape);
           writeln('ingrese nombre');
           readln(nom);
           writeln('ingrese edad');
           readln(ed);
           writeln('ingrese nacionalidad');
           readln(nac);
           writeln('ingrese telefono');
           readln(tel);

            personas[cant].cedula:=ced;
            personas[cant].apellido:=ape;
            personas[cant].nombre:=nom;
            personas[cant].edad:=ed;
            personas[cant].nacionalidad:=nac;
            personas[cant].telefono:=tel;

       end
    else
        writeln(' Registro ya existe');
  end;

procedure mostrar(var personas:lista; var cant:integer);
 var x: integer;
 begin
  for x:=1 to cant do
  writeln(' cedula: ',personas
  • .cedula,' apellido: ',personas
  • .apellido,' nombre: ',personas
  • .nombre,' edad: ',personas
  • .edad,' nacionalidad: ',personas
  • .nacionalidad,' telefono: ',personas
  • .telefono);
readkey;
 end;
begin

end.

procedure ordenar(var personas:lista; var cant:integer);
var x,y,z:integer;
var aux:dat;
begin
   for x:=1 to cant do
     begin
     for y:=x+1 to cant do
       begin
       if personas
  • >cant[y] then
          for z:=1 to cant do
             begin
                aux
  • :=cant[z];
                cant[z]:=cant[y];
                cant[y]:=aux[z];
              end;
           end;
        end;
     end;

procedure modificar(var personas:lista; var cant:integer);
var x,valor,encon,posicion,nuevodat:integer;
var opcion:string;

begin
repeat
      clrscr;
      encon:=0;
      writeln('ingrese valor a modificar');
      readln(valor);
           for x:=1 to cant do
           begin
           if (valor= personas
  • .cedula)then
           begin
                encon:=1;
                posicion:=x;
           end;
          end;

    if encon=0 then
    writeln('dato no encontrado')
     else
       begin
         for x:=posicion to cant do
             personas
  • .cedula:=cant[nuevodat];
            end;

    writeln('ingrese nueva dato');
    readln(nuevodat);
    personas
  • .cedula:=cant[nuevodat];

    writeln('desea buscar otra opcion');
    readln(opcion);
    until (opcion='n') or (opcion='N');
end;

procedure buscar(var personas:lista; var cant:integer);
var valor:integer;
var x,encontrado:integer;
var opcion:string;
begin
repeat
clrscr;
encontrado:=0;
writeln('ingrese valor a buscar');
readln(valor);

    for x:=1 to cant do
begin
    if (valor= personas
  • .cedula) then
begin
    encontrado:=1;
       end;
     end;

if encontrado=0 then
writeln('no encontrado');
else
begin
writeln('valor encontrado',valor);
writeln('desea buscar otro?');
end;
readln(opc);
until (opc='n') or opc(='N');
end;

procedure eliminar(var personas:lista; var cant:integer);
var x,i,encontrado,posicion,cedula:integer;
var opci,valor:string;

begin
repeat
      clrscr;
      encontrado:=0;
      writeln('eliminar valor');
      readln(valor);

      for x:=1 to cant do
      if (valor= personas
  • .cedula) then
begin
      encontrado:=1;
      posicion:=x;
   end;
      if encontrado=0 then
         writeln('datos no encotrados')
      else
           for x:=posicion to cant do
begin
               personas
  • .cedula:=cant[x+1,1];
               personas
  • .cedula:=cant[x+1,2];
               personas
  • .cedula:=cant[x+1,3];
               personas
  • .cedula:=cant[x+1,4];
               personas
  • .cedula:=cant[x+1,5];
           end;

personas[x,1]:='';
personas[x,2]:='';
personas[x,3]:='';
personas[x,4]:='';
personas[x,5]:='';
writeln('Quiere borrar otra fila');
readln(opci);
until opci='n';
end;

var opcion:integer;
begin
repeat
clrscr;
       writeln('menu principal');
       writeln('1 insertar');
       writeln('2 mostrar');
       writeln('3 ordenar');
       writeln('4 modificar');
       writeln('5 buscar');
       writeln('6 eliminar');
       writeln('7 salir');
repeat
      readln (opcion);
until (opcion >0) and (opcion <8);
clrscr;
case (opcion) of
1:insertar(personas);
2:mostrar(personas);
3:ordenar(personas);
4:modificar(personas);
5:buscar(personas);
6:eliminar(personas);
end;
until opcion=7;
readkey;
end.