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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


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


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Registros en Pascal
« 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.


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: Registros en Pascal
« Respuesta #1 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


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: Registros en Pascal
« Respuesta #2 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.
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 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.
En línea

tugatime

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Registros en Pascal
« Respuesta #4 en: 4 Diciembre 2012, 15:21 pm »

Bueno, olviden mi pregunta ya esta resuelta.
« Última modificación: 4 Diciembre 2012, 17:27 pm por tugatime » En línea

joseanh

Desconectado Desconectado

Mensajes: 8


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


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Información sobre Registros Variantes en Turbo Pascal.
Ejercicios
luistorcol 0 3,577 Último mensaje 25 Noviembre 2009, 02:11 am
por luistorcol
registros es c++
Programación C/C++
bash 1 3,118 Último mensaje 16 Mayo 2010, 16:50 pm
por bash
c++ y registros
Programación C/C++
winnipu 3 3,234 Último mensaje 30 Julio 2010, 16:36 pm
por [L]ord [R]NA
[Registros] existe algún registro para Outlook en los registros de windows?
Windows
moikano→@ 5 7,439 Último mensaje 14 Febrero 2011, 14:56 pm
por dantemc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines