[ Foro de Pascal ]
Buenas tardes:
Estuve ojeando el foro y encontré este mismo ejercicio desarrollado por otro usuario, os hago un resumen y si necesitais los enunciados de cada ejercicio me lo comentais, pero creo que en el post de el señor Antonio quedó claro.
Post del foro de Antonio Rodriguez: http://www.aprendeaprogramar.com/mod/forum/discuss.php?d=705
Basicamente el ejercicio pide que teniendo desarrollado un programa donde manejamos arrays de record seamos capaces de añadir la funcionalidad de los ficheros para guardar de forma permanente la información que decidamos.
Ese mismo ejercicio lo he desarrollado con algunas diferencias rescto al de Antonio, llevo poco tiempo estudiando pascal y me gustaría saber que puedo mejorar, el programa me funciona bien.
[code] Program FicheroCesta;
(*
* Fichero: FicheroCesta.pas
* Autor: Jose Manuel
* Descripcion: Programa para guardar y recuperar ficheros binarios
*)
uses
crt;
Const
Tammaxcesta=1000; //Maxima extension de la cesta
Type
Producto=record //Tipo para almacenar las caracteristicas de los productos
nombre:string;
solicita:integer;
precio:real;
en_cesta:boolean;
end;
(*Declaramos el tipo array de producto que nos pìde el ejercicio donde cada
espacio del array es un tipo producto con sus respectivos campos*)
tCesta= array [0..Tammaxcesta] of producto;
(*Tipo fichero para almacenar de forma permanente los datos introducidos*)
tFichero = file of Producto;
var
(*Definimos igualmente las variables a usar a lo largo del programa*)
Carrito:tCesta; //Contiene los productos
NombreFichero:string[10]; //Nombrar fichero
Opcion:Char; //Elegir opciones del menu
EspaciosCesta:integer; //Espacios definidos por el usuario/a
(*Declaramos el procedimiento que nos pide el ejerccio para modificar un
valor dentro de los datos que contiene la tabla, en este caso modificamos el
campo en_cesta dentro del registro tipo producto*)
(*Si en_cesta tiene valor false significa que el producto no tiene stock
y por tanto se actua como si no estuviera disponible o hubiera sido eliminado*)
Procedure Inicializar_Cesta(VAR InicioCarrito:tCesta;initammaxcesta:integer);
var
i:integer;
begin
(*Utlizamos un bucle for-do para recorrer todo el array y modificar en cadena
el atributo en toda la cesta*)
For i:= 1 to Initammaxcesta do
begin
if InicioCarrito[i].en_cesta = true then
begin
InicioCarrito[i].en_cesta:=false;
end;
end;
end;
(*El procedimiento nos va a permitir introducir productos en la cesta, tanto
si empezamos de cero como si hemos trabajado antes con la cesta, para ello
recordamos el valor del campo en_cesta*)
Procedure Leer_Producto(VAR Leecarrito:tCesta; LeeTammaxcesta:integer);
var
i:integer;
stock:char;
Begin
For i:= 1 to LeeTammaxcesta do
begin
if Leecarrito[i].en_cesta = false then
begin
writeln('Vamos a introducir los datos del producto');
writeln('Introduzca el nombre');
readln(Leecarrito[i].nombre);
writeln('Introduzca las unidades solicitadas');
readln(Leecarrito[i].solicita);
writeln('Introduzca el precio');
readln(Leecarrito[i].precio);
writeln('¿Hay stock?: S/N');
readln(stock);
case stock of
's','S':
Leecarrito[i].en_cesta:=true;
'n','N':
Leecarrito[i].en_cesta:=false;
end;
end;
end;
end;
(*Procedimeinto para mostrar unicamente los productos que tienen stock, es
decir el campo en_cesta esta en true*)
Procedure Mostrar_Cesta(VerCarrito:tCesta;VerTammaxcesta:integer);
var
i:integer;
begin
for i:= 1 to Vertammaxcesta do
begin
if Vercarrito[i].en_cesta = true then
begin
writeln('El nombre del producto es: ',VerCarrito[i].nombre);
writeln('La cantidad solicitada es: ',VerCarrito[i].solicita,' unidades.');
writeln('El precio es: ',VerCarrito[i].precio:2:2,' euros.');
writeln('Existencias:',VerCarrito[i].en_cesta);
end;
end;
end;
(*Procedimiento que busca los espacios libres en la cesta, este procedimineto
nos va a servir para incluir productos en la cesta*)
Procedure Busca_Libre(BusCarrito:tCesta;BusTammaxcesta:integer;VAR buslleno:integer);
var
i:integer;
begin
buslleno:=0;
for i:= 1 to BusTammaxcesta do
begin
if Buscarrito[i].en_cesta = false then
begin
inc(buslleno); //Contador de espacios vacios
writeln('Espacio libre en la posicion: ',buslleno);
writeln;
end;
end;
buslleno:=0;
for i:=1 to BusTammaxcesta do
begin
if Buscarrito[i].en_cesta = true then
begin
inc(Buslleno); //Contador de espacios ocupados
if Buslleno = Bustammaxcesta then
begin
buslleno:=0;
writeln('Cesta llena: ',buslleno,' espacios libres');
writeln;
end;
end;
end;
end;
(*Procedimiento para incluir producto en la cesta*)
Procedure Incluir_Producto_en_cesta (VAR InCarrito:tCesta;InTammaxcesta:integer);
var
inlleno:integer;
i:integer;
begin
(*Llamamos al procedimiento anterior que nos permite averiguar los espacios
en la cesta*)
busca_libre(Incarrito,InTammaxcesta,Inlleno);
if inlleno = 0 then
begin
writeln('No hay espacios para incluir producto');
writeln;
end
else
For i:= 1 to Intammaxcesta do
begin
(*Para poder incluir el producto en el espacio vacio es condicion indispensable tener
en_cesta con valor false*)
if incarrito[i].en_cesta = false then
Leer_producto(Incarrito,Intammaxcesta);
end;
end;
(*Procedimiento para buscar un producto en la cesta*)
Procedure Buscar_Producto(VAR LocalizaPro:tCesta;TammaxcestaLo:integer);
var
i:integer;
NombreProducto:string[10]; //Nombre del producto a buscar
encontrado:boolean; //Variable que valora la busqueda
opcion:char; //Variable para elegir opciones
Begin
writeln ('Escriba el nombre del producto que desea encontrar: ');
readln(NombreProducto);
encontrado:=false;
For i:= 1 to TammaxcestaLo do
(*La funcion POS nos devuelve un entero mayor de cero si localiza alguna
coincidencia cuando lee los caracteres*)
if pos(NombreProducto, localizapro[i].nombre) > 0 then
begin
encontrado:=true;
writeln('En la posicion ',i,' se encuentra: ',LocalizaPro[i].nombre);
writeln('Quiere elimnar el producto: S/N: ',LocalizaPro[i].nombre);
readln(opcion);
case opcion of
's','S':
LocalizaPro[i].en_cesta:=false;
'n','N':
LocalizaPro[i].en_cesta:=true;
end;
end;
if not encontrado then
writeln('Producto no encontrado');
end;
(*Desarrollamos el procedimiento para eliminar productos de la cesta, podriamos
haber eliminado el procedimiento Buscar_Producto incorporando el codigo en
Eliminar_producto_de_la_cesta: pero el ejercicio nos pedía invocarlo desde
Eliminar_producto_de_la_cesta*)
Procedure Eliminar_Producto_de_la_cesta (VAR EliCarrito:tCesta;EliTammaxcesta:integer);
begin
Buscar_Producto (EliCarrito,EliTammaxcesta);
end;
(*Procedimiento para guardar en un fichero la cesta de la compra*)
Procedure Guarda_Cesta (VAR GuardaCarrito:tCesta; VAR GuardaNombre:string[10]);
var
i:integer;
Gfichero:tFichero;
Begin
assign(GFichero,GuardaNombre);
rewrite(GFichero);
For i:= 0 to EspaciosCesta do
if GuardaCarrito[i].en_cesta = true then
write(GFichero,GuardaCarrito[i]);
close(GFichero);
end;
(*Procedimiento que nos permite abrir un fichero existente*)
Procedure Recupera_Cesta (VAR RecuCarrito:tCesta; RecuNombre:string);
var
i:integer;
RFichero:tFichero;
Begin
i := 0;
assign(RFichero, RecuNombre);
reset(RFichero);
while ( not(eof(RFichero)) AND (i<EspaciosCesta) ) do begin
i := i+1;
read(RFichero, RecuCarrito[i]);
end;
close(RFichero);
End;
(*Procedimiento para elegir las distintas opciones del programa*)
Procedure Menu(VAR opcionPro:char);
begin
repeat
writeln ('Elige la opcion que deseas realizar: ');
writeln;
writeln ('1. Abrir cesta de compra existente.');
writeln;
writeln ('2. Comenzar cesta de compra nueva.');
writeln;
writeln ('3. Agregar producto a la cesta.');
writeln;
writeln ('4. Eliminar producto de la cesta.');
writeln;
writeln ('5. Guardar cesta.');
writeln;
writeln ('6. Pedir cesta.');
writeln;
writeln ('7. Salir del programa.');
readln(opcionpro);
until opcionpro IN ['1','2','3','4','5','6','7'];
end;
begin
(*Llamamos a los procedimientos para iniciar el programa*)
writeln;
writeln('<<<<<<<<<<<<PROGRAMA PARA CREAR CESTAS DE LA COMPRA>>>>>>>>>>>>>>>>');
writeln;
EspaciosCesta:=1000;
repeat
Menu(opcion);
case (opcion) of
'1':
Begin
writeln('Escriba el nombre de la cesta a buscar: ');
readln(NombreFichero);
Recupera_Cesta (Carrito,NombreFichero);
Mostrar_Cesta(Carrito,EspaciosCesta);
end;
'2':
Begin
writeln('Puede comenzar con la nueva cesta: ');
Inicializar_Cesta(Carrito,EspaciosCesta);
writeln;
write('2: Introduzca la cantidad de productos que va incluir');
writeln(' en la cesta: ');
readln(EspaciosCesta);
Leer_Producto(Carrito,EspaciosCesta);
end;
'3':
Begin
writeln('¿Quiere ampliar o reducir los espacios en cesta?: S/N');
readln(opcion);
if (opcion = 's') or(opcion = 'S') then
begin
writeln('Introduzca la nueva cantidad: ');
readln(EspaciosCesta);
end;
writeln('Escriba el nombre de la cesta a modificar: ');
readln(NombreFichero);
Recupera_Cesta (Carrito,NombreFichero);
Incluir_Producto_en_cesta (Carrito,EspaciosCesta);
end;
'4':
Begin
writeln('Escriba el nombre de la cesta a modificar: ');
readln(NombreFichero);
Recupera_Cesta (Carrito,NombreFichero);
Eliminar_Producto_de_la_cesta (Carrito,EspaciosCesta);
end;
'5':
Begin
writeln('Escriba el nombre de la cesta a guardar: ');
readln(NombreFichero);
Guarda_Cesta (Carrito,NombreFichero);
end;
'6':
Begin
writeln('>>>>>>>>>>>>>LA CESTA HA SIDO ENVIADA<<<<<<<<<<<<<<');
writeln('Aquí tiene el detalle del pedido: ');
Mostrar_Cesta(Carrito,EspaciosCesta);
end;
'7':
end;
until(opcion='7');
end.[/code]
Se ve bastante bien.
Saludos.
Hola a todos:
Veréis, casualmente estoy realizando este mismo ejercicio y me he quedado bloqueada en una de las preguntas del mismo. Una vez realizado el programa, con todos los procedimientos, incluidos "guardar_cesta" y "recuperar_cesta", piden que le demos uso a la posición "0" de la cesta de la compra, que hasta ahora había permanecido vacía. El problema lo tengo cuando me piden modificar los procedimientos de guardar y recuperar cesta para que lean también dicha posición.
Lo que he hecho es lo siguiente;
Procedure Guardar_cesta (var micesta: cesta, nombre: string);
var
i: integer;
fichero: Tfichero;
Begin
Assign (fichero, nombre);
Rewrite (fichero);
For i:= 0 to TAMAXCESTA DO
Begin
If micesta[i].en_cesta = true then
write (fichero, micesta[i];
End;
Close (fichero);
End;
(El problema lo tengo aquí, no se como modificar el "Recupera_Cesta", así es como hice el procedimiento antes del cambio)
Procedure Recupera_cesta (var micesta: cesta, nombre; string);
var
i: integer;
fichero: Tfichero;
begin
i:=0;
Assign (fichero, nombre);
Reset (fichero);
while ((not eof (fichero) and (i<TAMAXCESTA) do
Begin
i:= i + 1;
read (fichero, micesta[i];
End;
Close (Fichero);
End;
Espero que podáis ayudarme, estoy a punto de lanzar el ordenador por la ventana.
Un saludo.
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)