Registros en Pascal

Iniciado por Corso, 26 Diciembre 2005, 02:04 AM

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

Corso

Problema con codigo que no consigo sacar.

Esto es lo que yo e hecho:


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

lectura[i].cuadros.precio;

al registro precio?

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



jvchino

Primero veamos algunas "cosillas" de tu codificación y luego vienen las sugerencias.
Dentro de la función "suma_coleccion" tienes la siguiente sentencia:
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:
CitarY por que no me deja llamar asi
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:
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
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

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

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



sv51

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

tugatime

#4
Bueno, olviden mi pregunta ya esta resuelta.

joseanh

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.