[ Foro de Pascal ]

Ejercicio ficheros simulando una cesta de la compra

28-Feb-2019 08:32
Invitado (Jose Manuel)
2 Respuestas

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]







01-Mar-2019 05:02
Luis Torres (+18)

Se ve bastante bien.

Saludos.


04-Mar-2019 21:07
Cristina Delgado de la Torre

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