[ Foro de Pascal ]

Los ultimos ejercicios

02-Feb-2013 14:56
Antonio Rodrigues
14 Respuestas

Bueno, ahora voy a empezar con los 2 ultimos ejercicios de mi programa de la cesta. He empezado con el 1º pero tengo un problema.
Dejo aqui el procedimiento:

procedure estadisticas_totales();
         var
            fichero: text;
            linea: string;
            num_pedidos: integer;

         procedure contar_pedidos(var num_pedidos: integer; var linea: string; var mi_cesta: cesta);
                   var
                      fichero2: Tfichero;
                      cesta: string;

                   begin
                        num_pedidos:= 0;
                        cesta:= linea;

                        assign(fichero2, cesta);
                        reset(fichero);

                        read(fichero2, mi_cesta[0]);

                        if (mi_cesta[0].en_cesta=true) then
                           num_pedidos:= num_pedidos+1;

                        close(fichero);
                   end;

         begin
              assign(fichero, 'indice.txt');
              {$I-}
              reset(fichero);
              {$I+}

              if (ioResult=0) then
                 begin
                      while not eof(fichero) do
                            begin
                                 readln(fichero, linea);

                                 contar_pedidos(num_pedidos, linea, mi_cesta);
                            end;
                      writeln('En total hay ',num_pedidos,' pedidos realizados.');
                 end
              else
                  writeln('Lo siento pero ahora mismo no existe ninguna cesta.');
         readln;
         clrscr;
         end;

Lo que tengo que hacer aqui es abrir el fichero de texto "indice.txt" para lectura. Comprobar que existe el fichero. Si no existe sale un mensaje diciendo que no existe ninguna cesta, pero si existe, lo primero que hago es leer la 1º linea (en esta 1º linea esta el nombre de la 1º cesta). Despues de leer la 1º linea, cogo el nombre de la cesta que esta alla y lo llevo al 2º procedimiento donde abro la cesta y comprueba si mi_cesta[0].en_cesta es igual a true o a false. Si es igual a true, aumento en 1 la variable num_pedidos, pero si es igual a false lo dejo como esta.
Despues e terminar con la 1º linea sigo con la siguiente, y asi hasta leer todas las lineas. El problema es que me eta dando problema este procedimiento y no se porque.
Y necesito ayuda para descubrir que falla.


03-Feb-2013 18:23
Luis Torres (+12)

¿Cada cesta es un pedido?. Si la respuesta es afirmativa, entonces supongamos que el archivo "indice.txt" contiene dos cestas, cuando hacemos el primer llamado al procedimiento contar_pedidos, contaría 1, pero cuando volvemos a hacer nuevamente el llamado a dicho prodimiento volvería a contar 1, siempre tendrías 1 independientemente de la cantidad de cestas guardadas en "indice.txt". deberías incluir otra variable, por ejemplo "contador", inicializada a cero y colocas una línea después de la llamada al procedimiento, de la siguiente manera:

         contar_pedidos(num_pedidos,linea,mi_cesta);
         contador:= contador + num_pedidos;

Pero, lo mejor sería utilizar una función contar_pedidos en vez del procedimiento que ya tienes. Es lo más usual.

Saludos.


03-Feb-2013 21:20
Antonio Rodrigues

Gracias Luis por tu observacion, pero ese ahora mismo no es mi problema. Yo tengo un problema en tiempo de ejecucion del programa.
Este procedimiento lo he dejado en el menu principal del programa porque es para saber cuantos pedidos han sido realizados.
Es decir, si no hay ningun pedido sale un mensaje diciendo que no hay pedidos. Si hay pedidos, pero aun no se han realizado (para realizar los pedidos la posicion mi_cesta[0].en_cesta tiene que ser true) sale un mensaje diciendo que primero debe realizar un pedido.
Si hay pedidos y han sido realizados sale otro mensaje diciendo cuando pedidos realizados hay.

Lo que pasa es que cuando yo abro el programa y aun no tengo ningun pedido, es decir, aun no he empezado ni guardado ninguna cesta y le doy a la opcion 4 (es la opcion para este procedimiento) me sale un mensaje diciendo que no hay pedidos ni cesta que no hay nada.
Pero, si yo empiezo una cesta nueva y la guardo y luego elijo la opcion 4 (da igual que mi_cesta[0].en_cesta sea true o false) siempre se me cierra el programa asi sin mas y deja de funcionar. Aqui es donde necesito ayuda.


03-Feb-2013 21:28
Luis Torres (+12)

Por favor, envíame el programa a mi dirección de correo electrónico.

Una pregunta: ¿qué quieres decir con que "se ha hecho el pedido"?, ¿cómo se sabe si se ha hecho el pedido o no?.

Saludos.


04-Feb-2013 01:32
Antonio Rodrigues

Ya te lo he enviado. Mira, te voy a explicar eso del pedido.
Esto es un programa para crear cestas de la compra donde cada cesta tiene sus productos. Cuando abre el programa por primera ves, le das a la opcion 3 para empezar una cesta nueva (porque aun no existe ninguna). Al empezar una cesta nueva, tu introduces los productos que quieres (hasta un maximo de tamxcesta donde tamxcesta es 3). Cuando terminas de crear la cesta con sus productos, guardas esa cesta en un fichero binario.
Cuando haces esto ya tienes 1 cesta, es decir, ya tiene 1 pedido.
Los pedidos los puedes (como decirlo). Mira te pongo un ejemplo.
Cuando vas de compras, tu entras a la tienda y vas cogiendo los productos que quieres comprar. Luego, cuando tienes todos los productos vas a caja a para pagar esos productos.
Pues en el programa pasa lo mismo. Tu creas tu cesta y la guardas pero aun no vas a pagarla. Eso quiere decir que aun puedes modificar la cesta, es decir, cambiar un producto por otro, etc. Aqui la posicion mi_cesta[0].en_cesta es igual a false. Esto significa que tienes un cesta (o un pedido como lo quieras llamar) pero que aun esta abierta, que aun la puedes modificar, etc.
Pero, luego cuando ya tienes tu cesta lista, la puedes cerrar. Cuando la cierras la posicion mi_cesta[0].en_cesta se queda igual a true y cuando lo haces no puedes modificar nada en la cesta. Cuando haces esto quiere decir que ya no vas a modificar nada mas en la cesta y que te estas preparando para pagar los productos.

Luego tambien hay una opcion para entregar la cesta para pagar pero eso ahora no importa.

Bueno, pues la opcion 4 del menu principal, lo que hace es decirnos cuantas cestas hay que estan ya cerradas (que mi_cesta[0].en_cesta=true) y lista para entregar y pagar.

Fue una explicacion un poco larga. Si no has entendido algo dimelo.


04-Feb-2013 05:34
Luis Torres (+12)

Te estoy escribiendo esto rapidamente sin haber leído el mensaje anterior a este escrito por tí y al que estoy respondiendo. Pero sí revisé el código que me enviaste. El error está en que dentro del procedimiento contar_pedidos declaras la variable fichero2, pero no la abres, en su lugar abres la variable fichero, es un error de olvido tuyo, además cierras la variable fichero en vez de cerrar fichero2. Eso es todo.

Saludos.


04-Feb-2013 15:28
Antonio Rodrigues

Gracias Luis. No he habia dado cuenta de eso. Esto es lo que pasa cuando te pones a trabajar estando cansado.


04-Feb-2013 20:53
Antonio Rodrigues

Oye Luis, no se si has leido esa respuesta grande que te he dado, pero no importa. Necesito un favor tuyo. Como tu tienes mi programa que te lo he enviado, necesito que pruebes una cosa y a ver si hago que funciona.
Esta funcion, es para contar cuantas cesta tienen su posicion mi_cesta[0].en_cesta=true.
Una cesta siempre tiene la posicion mi_cesta[0].en_cesta en false.
Para poner esta posicion a true, primero tenemos que crear una cesta. Despues de crear la cesta la guardamos en un fichero binario con el nombre que queramos. Luego tenemos que abrir la cesta con la opcion 2 del menu principal y depues, en el menu secundario que nos sale, le damos a la opcion "Cerrar cesta". Al hacer esto estamos cerrando la cesta (es decir al cerrar la cesta no podemos hacer ningun cambio en ella). Al cerrar la cesta la posicion mi_cesta[0].en_cesta se queda en true.

Pues en el procedimiento, lo primero que tenemos que hacer es comprobar que existe alguna cesta. Para comprobar que existe, comprobamos si existe el fichero de texto "indice.txt" que es donde se guardan los nombres de las cesta existentes.
Si no existe el fichero "indice.txt" nos sale un mensaje diciendo que no existe.
Si si existe, lo que hacemos es leer el primer nombre (esta en la 1º linea) y luego (ese es el nombre de la cesta guardado en el fichero binario) abrimos el fichero binario donde esta guardada la cesta (lo abrimos con el nombre) y comprobamos si esa cesta tiene la posicion mi_esta[0].en_cesta en true o en false. Si esta en true aumentamos nuestro contador en 1, si esta el false lo dejamos igual sin tocar nada.
Esto lo hacemos para todos los nombres que estan en el fichero "indice.txt" (son los nombres de todas las cestas).

Cuando terminemos de hacerlo, nos sale un mensaje diciendo cuantas cesta tienen la posicion mi_cesta[0].en_cesta a true.

Esto es lo que hay que hacer, pero a mi no me sale bien. Me sale cosas que no deberia salir.
Como tu tienes el programa le puedes hechar un vistazo y a ver si descubres que esta mal ?


06-Feb-2013 00:06
Antonio Rodrigues

Vale, olvidado. He descubierto el fallo.


06-Feb-2013 16:58
Luis Torres (+12)

¿Me podrías decir cuál fue el fallo?.

Saludos.


06-Feb-2013 21:12
Antonio Rodrigues

No se si tu te acuerdas que me has dicho que yo ponga una variable llamada "contador" despues de llamar al procedimiento. Pues lo que pasa es que se me olvido poner esa variable y por eso fallaba. Pero ya la he puesto y se me ha solucionado el problema.


07-Feb-2013 16:38
Luis Torres (+12)

Ok. Si me puedes enviar el programa corregido te lo agradecería.

Saludos.


08-Feb-2013 00:50
Antonio Rodrigues

Mira, el programa aun tengo que terminar unas cosas. Te lo puedo enviar ahora antes de terminar o entonces te lo puedo enviar cuando termine.

Tu elije cuando quieres que te lo envie. Pero, antes de elegir te dejo una advertencia. Ahora mismo tengo estado un poco ocupado y no tengo tenido tiempo para trabajar en el programa. Asi que si elijes  que te envie el programa cuando termine, te aviso que puede que tarde un tiempo en terminarlo. Pero voy lo mas rapido posible.


08-Feb-2013 04:58
Luis Torres (+12)

Prefiero que me lo envíes cuando esté totalmente terminado. Por cierto, sería bueno que eliminaras el último readln, para que cuando se elija la opción Salir, no haya que pulsar ENTER para realmente salir del programa.

Saludos.


08-Feb-2013 13:51
Antonio Rodrigues

Pues entonces te lo envio cuando termine. Gracias por el consejo del ultimo realdn.






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