[ Foro de Pascal ]

Problema con bucle repeat

26-Jan-2013 02:29
Antonio Rodrigues
10 Respuestas


 
procedure f(var num_productos: integer);
          var
             opcion: char;
 
          begin
               incluir_producto_en_cesta(mi_cesta, exito, posicion2);
 
               repeat
                     write('Quiere añadir otro producto (s o n): ');
                     readln(opcion);
                     clrscr;
 
                     if ((opcion='s') or (opcion='S')) then
                        incluir_producto_en_cesta(mi_cesta, exito, posicion2);
               until ((opcion='n') or (opcion='N') or (num_productos=tamxcesta));
          end;
 



Este es mi procedimiento.
Lo que pasa es lo siguiente.
Bueno antes de decir mi problema voy a decir unas cosas.
La variable num_productos, es el numero total de productos que hay en la cesta. La variable tamxcesta es el numero maximo de productos que puede tener la cesta.

Bueno empecemos. Lo que pasa es que si yo elijo la opcion de añadir un nuevo producto me trae a este procedimiento. Aqui primero añadimos 1 producto con el procedimiento "incluir_producto_en_cesta". Luego viene el bucle repeat donde preguntamos si queremos añadir otro producto. Si la respuestas es si añadimos otro productos, pero si la respuestas es no simplesmente no volvemos al menu.

El problema esta que yo introduzco el 1º producto, luego me pregunta si quiero poner otro y yo le doy a si y introduzco el 2º producto y luego le vuelvo a dar que si y introduzco el 3º producto (tamxcesta es de 3). Cuando introduzco el 3º producto se supone que le doy a intro y se tiene que volver al menu porque ya esta la cesta llena, pero en ves de volver al menu me vuelve a preguntar si quiero introducir otro producto y solo vuelve al menu cuando le doy a que no.

Yo quiero saber si alguien me puede decir que es lo que falla y porque me pregunta si quiero introducir otro producto si la cesta ya esta llena.


26-Jan-2013 05:10
Luis Torres (+12)

Te faltó:
- Primero, inicializar num_productos a cero; y
- Segundo, incrementar la variable num_productos cada vez que añades un producto a la cesta.
Saludos.


26-Jan-2013 13:32
Antonio Rodrigues

Pero esas 2 cosas ya las hago en otro procedimiento, y por eso he pasado num_productos por referencia para que se quede igual. A lo mejor tengo que hacerlo de todas formas no ?


26-Jan-2013 16:35
Luis Torres (+12)

Pues, si es como tu dices, debería salirse del Repeat-Until cuando num_productos sea igual a 3. Por favor, escribe el o los procedimientos a los que se llama en este procedimiento.
Saludos.


26-Jan-2013 17:36
Antonio Rodrigues

Luis con la 1º respuesta que me has dado me he puesto a pensar y he resolvido el problema.
Por cierto, he cambiado el programa de la cesta. Le he hecho unas grandes modificaciones y te lo voy a enviar para que veas como ha quedado.


27-Jan-2013 00:48
Luis Torres (+12)

Ya revisé muy someramente el programa y la verdad es que me gusta más esta presentación que tiene actualmente. Ahora sí tiene las opciones que debería tener el Menú Principal y los secundarios. No obstante, para ser críticos, pues yo le pondría la opción guardar cesta en el menú secundario; de todas maneras así está muy bien.
Nuevamente te felicito por la forma tan clara de programar, el código está bien estructurado, muy bien indentado, fácil de seguir y de entender. Ahora, no basta con lo anterior, también hace falta que coloques comentarios en cada procedimiento y para algunas variables para indicar lo que se pretende que hagan dentro del programa, además, debes incluir al principio del código la descripción del mismo, tu nombre y algo que tú quieras resaltar. Claro está, eso debes hacerlo cuando lo vayas a entregar al profesor. No sé si te exigen que lo hagas.
Algo que observé fue que cuando abro una cesta nueva, introduzco dos productos, luego elimino el primer producto y, elijo la opción de mostrar cesta, muestra el producto como si fuese el segundo, cuando para este momento ya debería ser el primero, ¿no?.
Cuando veas la parte de validación, pues notarás que hay que validar cada entrada, de manera que no entre "basura" al sistema.
En términos generales está muy bien tu programa. Congratulaciones. Lo guardaré para tenerlo como una referencia.
Saludos.


27-Jan-2013 02:03
Antonio Rodrigues

Hola Luis. Primero quiero agradecer tu comentario y tu sugestiones.
Ahora vamos a lo que importa.
Me has dicho que la opcion para guardar la cesta queda mejor en el menu secundario. La verdad es que no se si ponerlo o no. Supongo que se quedaria mejor. Asi que, dejo aqui esta pregunta, tu que me aconsejas, que deje la opcion en el menu principal o la ponga en el secundario ??

Cuanto a los comentarios te doy las gracias que me lo recuerdes. Es que le quite los comentarios  y la verdad no me acuerdo porque lo hice. Pero te agradezco que me lo recuerdes, asi ahora cuando tenga tiempo vuelvo a ponerlos.

Has dicho que cuando abres una cesta nueva y pones 2 productos, si eliminas el 1º producto el 2º producto deberia quedar 1º pero no se queda. Este es un problema que tengo desde que he creado el programa pero que con el tiempo se me habia olvidado y la verdad cuando hacia las pruebas no me fijaba en él. He intentado solucionar el problema sin quitar eso de Producto 1 y Producto 2 pero no he encontrado ninguna solucion. Te doy las gracias que me lo recuerdes y ya que estamos me gustaria saber si me puedes  ayudar a resolver este problema (porque yo no se como hacerlo) ??

Por ultimo hay una cosa que no he entendido lo que quieres decir con ella. Es lo siguiente:

"Cuando veas la parte de validación, pues notarás que hay que validar cada entrada, de manera que no entre "basura" al sistema."

Cuando dices esto, a que te refieres ?? Es que no lo entiendo.

Una ves mas gracias por tu comentario.


27-Jan-2013 18:16
Luis Torres (+12)

Te planteo la posibilidad de que sea mejor colocar la opción Guardar Cesta en el menú secundario porque me parece mucho más fácil para el usuario que después que introduzca los productos, tenga esa opción a la mano para inmediatamente poder almacenarlos en una cesta. A mí me parece mejor así, lo que no significa que realmente sea la mejor manera, te lo planteo para que lo consultes con tus profesores o para que el mismo profesor Nacho Cabanes nos de su opinión.

Para solucionar lo de los productos que se eliminan y luego cuando muestras los que quedaron aparecen con numeración errada, pues en este momento no se me ocurre nada. Sólo quise hacerte la observación porque fue algo que me pareció extraño.

Validar significa que cuando se te pidan valores de un tipo, el usuario debe introducirlos de ese mismo tipo, de lo contrario el programa no lo dejará avanzar y le indicará que hubo un error. Por ejemplo, si en el campo Cantidad de Productos el usuario introduce una letra o un número negativo, el programa debería rechazar ese valor (sin salirse abruptamente del programa) indicándole que el valor debe ser entero y mayor o igual a uno. De todas maneras, noto que no te lo han exigido, así que olvídate de hacerlo. Tu programa está muy bien. Ahora, lo que te aconsejo es que ningún programa es perfecto y siempre se le pueden hacer mejoras y ampliaciones, siempre hay algo que corregir o mejorar, así que, tenlo siempre presente. Tú aprendes muy rápido y si lograste hacer todo esto con tan poca ayuda, no me imagino lo que puedes llegar a hacer cuando tengas más tiempo programando.
Saludos.


27-Jan-2013 20:39
Antonio Rodrigues

Como tu has dicho, voy a probar en poner eso de guardar la cesta dentro del menu secundario y a ver como se queda. Se me acaba de ocurrir una idea para hacerlo, asi que voy a probarla.

Luego ese problema de la enumeracion de los productos voy a ver si encuentro una solucion a ese problema.

Y cuando a eso de validar, ahora ya entiendo lo que quieres decir y voy a ponerlo en el programa.

Ahora mismo este ejercicio ta se lo he enviado a mi tutor asi que ahora mismo trabajo en el programa por mi cuenta para mejorarlo y tambien me sirve como repaso para el examen.

Y ademas se eso, aun me falta añadir al programa 2 funiones mas que aun no tiene. Pero esas 2 funciones van a ser un poco dificiles para mi y luego cuando me ponga con ellas vendre a ver si me podeis ayudar. Pero eso cuando llegue.

Una ves mas gracias por tu ayuda Luis.


28-Jan-2013 01:52
Luis Torres (+12)

Yo creo que tienes un error general en cuanto al planteamiento de la solución del problema. Claro está, no lo tomes a mal y no te pongas a cambiarlo ahora que ya tienes tu programa hecho funcionando casi totalmente bien. Te digo lo anterior porque yo creo que es "muy importante" el mantener guardado, en alguna parte (variable) la cantidad de productos de la cesta, es algo super importante, porque en el caso de solucionar el problema que se presenta cuando borras algún producto y luego lo muestras, la forma de corregirlo sería mucho más sencilla si tuvieras a la mano la cantidad de productos de la cesta. Así, si por ejemplo borras el elemento 1, podrías correr (mover) los demás elementos una posición hacia la izquierda en el arreglo. Para hacer casi todas las operaciones utilizas el hecho de que el campo "en_cesta" de cada elemento del arreglo sea igual a "true" cuando lo más normal es hacer todas las operaciones valiéndote de alguna variable que guarde la cantidad de productos de la cesta.

Cuando termines todo el programa, por favor, envíamelo para tenerlo guardado y usarlo como referencia. Yo tengo que hacer uno similar al tuyo, pero manejando un mayor número de archivos.

Saludos.


28-Jan-2013 02:44
Antonio Rodrigues

Luis no lo toma a mal, por el contrario te agradezco los comentarios que haces. Si, eso del producto fue una idea mia para mejorar el programa, pero cuando lo he puesto nunca imagine que me fuera a dar este problema.
Bueno, intentare resolverlo y a ver en como termina esto.






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