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 (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.
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
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).
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.
Otra idea que me surge para esa lectura , se podria usar el readkey ?¿ mejor que el readln.
Jeje miles de sugerencias xDD
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.