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.
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
Gracias jvchino.
No pego el code, pero ya le asigne al "contador" no_en_venta 0 y de tipo integer.
Salu2.
: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.
Bueno, olviden mi pregunta ya esta resuelta.
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.