Problema con este programa en Pascal.

Iniciado por Manimecker, 20 Marzo 2011, 04:53 AM

0 Miembros y 1 Visitante están viendo este tema.

Manimecker

Me encuentro realizando el siguiente ejercicio:

CitarAñadir al programa anterior lo necesario para que clasifique las llamadas en Nacionales (N), Provinciales (P) y Locales (L) y realizar los mismo cálculos que antes para cada tipo de llamada (duración y numero de llamadas Nacionales, duración y numero de llamadas Provinciales y duración y numero de llamadas Locales). El programa también debe solicitar, después de presentar los resultados, si se desea realizar de nuevo todo el proceso anterior.

El resultado debe ser similar a esto:

Introduzca la duración de la llamada en minutos (0 para terminar): 5
Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: p

Introduzca la duración de la llamada en minutos (0 para terminar): 15
Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: n

Introduzca la duración de la llamada en minutos (0 para terminar): 20
Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: l

Introduzca la duración de la llamada en minutos (0 para terminar): 40
Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: p

Introduzca la duración de la llamada en minutos (0 para terminar): 0



-Especificación llamadas Nacionales, Provinciales y Locales-

El numero de llamadas nacionales a sido: 1 y su duración: 15.00 minutos.
El numero de llamadas provinciales a sido: 2 y su duración: 45.00 minutos.
El numero de llamadas locales a sido: 1 y su duración: 20.00 minutos.

-Totales-

Numero de llamadas: 4
Duración total: 80.00 minutos.
Duración media: 20.00 minutos.

Desea continuar para realizar otra lista de llamadas? S/N: n

Todo lo llevo perfecto, sólo que en la última parte, que pregunta si desea continuar, si pongo n o N, se vuelve a ejecutar el bucle y nunca acaba, y no sé por qué.

Les dejo el código estructurado que llevo hasta ahora en el siguiente enlace.

http://pastebin.com/09M7Fxyc

Dejo el link ya que el código es demasiado extenso y es mejor estructurarlo en un pastebin.

Gracias de antemano.

imoen

#1
no te he mirado el codigo pero digo yo que lo que pasa es que no controlas el fin o la rotura del bucle.



Digamos que deberias de tener esta estructura


Repeat

programa

a = Presiona Y/N
upcase a
until a = " N"

O tambien lo mismo con un bucle while o simplemente

if a = "N" break

un saludo

bs imoen


EDITOOOOO


Vale ya te he visto el codigo

Veamos cosas que se pueden hacer ,
lo primero parece que esta bien, pero prueba una cosa , traza el programa, e inspecciona el valor de chos , yo creo que no coje el valor puede ser poq usas read , aunque sea char inicializala dale un valor.

Cambia el bucle principal por un while asi la condicion se comprueba al principio del bucle. While chos <>  N
begin
end
otra cosa cuando leas chos , pasalo a mayusculas y te ahorras la doble comparacion
creo que es con upcase.

Si me dices el compilador que usas me lo bajo y lo miro XD

Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

Manimecker

Muchísimas gracias por tu ayuda, mira que lo he solucionado, al menos parcialmente.

El problema era en el segundo y último read(), ya que no me detectaba la pulsación o algo así, y los cambie ambos por readln() y ahora sí me lo detectan; viene otro problema, al principio, que pongo:

#
write('Duracion de la llamada (0 para terminar): ');
readln(Dur);
write('Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local : ');
read(Tipo);


En la primera parte, que si pongo 0 se debe terminar el bucle, cuando inserto el 0, en vez de pararlo automáticamente, me pregunta por la otra variable, y entonces ya para el bucle, y quisiera saber como evitar eso.

Muchas gracias.

PD: Uso FreePascal como compilador (si a eso te refieres, soy algo novato en el tema).


Valkyr

Podrías cambiar el repeat por un while y dejar el código de esta forma:

write('Duracion de la llamada (0 para terminar): ');
         readln(Dur);
while(Dur<>0) do
         write('Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local : ');
         read(Tipo);

         if (Tipo = 'N') or (Tipo = 'n') then
            BEGIN
            N1 := N1+1;
            Cont1 := Cont1+Dur
            END;

         if (Tipo = 'P') or (Tipo = 'p') then
            BEGIN
            P1 := P1+1;
            Cont2 := Cont2+Dur
            END;

         if (Tipo = 'L') or (Tipo = 'l') then
            BEGIN
            L1 := L1+1;
            Cont3 := Cont3+Dur
            END;

         Cont01 := Cont01+1;
         Cont0 := Cont0+Dur;
         RE := RE+Dur;
                        write('Duracion de la llamada (0 para terminar): ');
         readln(Dur);
      end.


Así conseguirías que si pones 0 no vuelva a preguntar lo de llamada provincial.......

Espero que te haya ayudado.

PD: No se si habré escrito correctamente lo del while, compruebalo tu mismo con el compilador porque hace ya un año que no uso Pascal xD

Saludos.

imoen

Otra idea que me surge para esa lectura , se podria usar el readkey ?¿ mejor que el readln.


Jeje miles de sugerencias xDD
Medion Akoya p6624
i-3 370
8 gigas DDR 3 RAM //750 hd 5400
gforce gt425 optimus XDD
Esta es mi casa, mi pueblo , o lo que queda de el aun asi lucharemos ... POR BENALIA....!!

srta imoen

skapunky

Seguramente si se puede, pero en general, los "menus" en pascal se hacen de la forma que tienes en el codigo.

Yo soy otro de los que contesta sin mirar tu codigo, pero si tienes declarada la variable Tipo como char, tu codigo es válido completamente. De esta forma siempre he hecho los menus en pascal yo.
Killtrojan Syslog v1.44: ENTRAR