Pascal/Turbo Pascal - Ayuda con fallo por favor, me estoy volviendo loco

 
Vista:

Ayuda con fallo por favor, me estoy volviendo loco

Publicado por Alvaro (2 intervenciones) el 26/10/2008 01:22:41
Hola buenas, pues tengo un fallo con un ejercicio que estoy haciendo y despues de 3 dias mirandolo no consigo encontrar el fallo, a ver si ustedes me pueden ayudar.

El ejercicio en cuestion es el siguiente:

# Suponga que desea saber que "perfil" tienen sus llamadas telefónicas. Para ello realizará un programa que solicite la duración de las llamadas y calcule:

* la duración total de sus llamadas
* el valor medio
* el número total de llamadas

y los presente por pantalla.

Para este ejercicio hace falta un bucle que vaya pidiendo la duración de las distintas llamadas. Sería algo así como:

* iniciar los valores de las variables necesarias, numero de llamadas y duración total de todas las llamadas
* leer la primera llamada
* mientras llamada sea mayor que cero
o incrementar el numero de llamadas en uno
o incrementar el tiempo total que suman todas las llamadas
o leer otra llamada
* presentar resultados
Si desea hacer un programa más completo, puede clasificar las llamadas en nacionales, provinciales y locales (N, P, L) y realizar los cálculos anteriores para cada tipo de llamadas

--------------------------------------------------------------------------------------------------------------------------

Asi deberia quedar al ejecutarse:

Duracion de la llamada (0 para terminar): 10
Tipo de llamada (N/P/L) N
Duracion de la llamada (0 para terminar): 20
Tipo de llamada (N/P/L) P
Duracion de la llamada (0 para terminar): 30
Tipo de llamada (N/P/L) L
Duracion de la llamada (0 para terminar): 40
Tipo de llamada (N/P/L) l
Duracion de la llamada (0 para terminar): 0
>> Nacional
> Llamadas: 1 Duracion: 10.0 > Media: 10.0
>> Provincial
> Llamadas: 1 Duracion: 20.0 > Media: 20.0
>> Local
> Llamadas: 2 Duracion: 70.0 > Media: 35.0
>> Total
> Numero de llamadas: 4
> Duracion total: 100.0
> Duracion media: 25.0

------------------------------------------------------------------------------------------------------------------------------

Y este es el codigo que yo he escrito:

program llamada;
var
duracion,duracionn:integer;
tipo:char;
duracion_total,duracion_totaln,duracion_totalp,duracion_totall:integer;
numero,numero1,numero2,numero3:integer;
media,median,mediap,medial:real;

begin
duracion_total:=0;
numero:=0 ;
duracionn:=0;
write('Duracion de la llamada (0 para terminar): ');
read(duracion);
while(duracion>0) do
begin
write('Tipo de llamada (N/P/L) ');
readln(tipo);
case (tipo) of
'n','N' : begin numero1:=numero1+1; duracion_totaln:=duracion_totaln+duracion; end;
'p','P' : begin numero2:=numero2+1; duracion_totalp:=duracion_totalp+duracion; end;
'l','L' : begin numero3:=numero3+1; duracion_totall:=duracion_totall+duracion; end;
end;
write('Duracion de la llamada (0 para terminar): ');
readln(duracionn);
numero:=numero+1;
duracion_total:=duracion_totaln+duracion_totalp+duracion_totall;
end;
media:=duracion_total/(numero1+numero2+numero3);
median:=duracion_totaln/numero1;
mediap:=duracion_totalp/numero2;
medial:=duracion_totall/numero3;

writeln('>> Nacional');
writeln(' > LLamadas: ', numero1 , ' Duracion: ', duracion_totaln ,' > Media: ', median);
writeln('>> Provincial');
writeln(' > LLamadas: ', numero2 , 'Duracion: ', duracion_totalp ,'> Media: ', mediap);
writeln('>> Local');
writeln(' > LLamadas: ', numero3 , 'Duracion: ', duracion_totall ,'> Media: ', medial);
writeln('>> Total');
writeln(' > Numero de llamadas: ', numero);
writeln(' > Duracion total: ', duracion_total);
writeln(' > Duracion media: ', media);
end.

----------------------------------------------------------------------------------------------------

Os pediria por favor que compilaseis en un segundo mi codigo para que veais el problema que tengo, que lo vereis rapidamente.

Muchisimas gracias de verdad, y saludos

Soy novato en Pascal
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con fallo por favor, me estoy volviendo l

Publicado por Miguel (159 intervenciones) el 26/10/2008 02:30:14
Bueno a simple vista ese ciclo entra en un Loop infinito, es decir jamas sale por que en la condicion de salida (o de contrlol) del WHILE preguntas sobre la variable duracion, cuando deberias preguntar sobre la variable duracionN, ya que es la que incrementa.
duracion una vez que ingresa al ciclo jamas varía.
Tampoco le das formato cuando mostras las variables reales, es decir van a salir con notacion exponencial.
No vas a visualizar lo que se muestra por pantalla, por que no tenes ninguna pausa al final, usa la UNIT CRT para servirte del READKEY ...
Podrias usar REPEAT tipo:=Upcase(READKEY) UNTIL (tipo='N')OR(tipo='P')OR(tipo='L'); es una forma mas "linda" de ingresar esa opcion...
Otro consejo, yo preguntaria dentro del ciclo si desea cargar una llamada mas o salir (con otra variable, de tipo char)...
Saludos, y perdon que no pude verlo con mayor atencion, ando apurado. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fallo por favor, me estoy volviendo l

Publicado por Alvaro (2 intervenciones) el 26/10/2008 11:44:25
el problema es que lo compilo, y no me da ningun problema, pero al ejecutarlo me pasa lo siguiente:

1ero me pregunta sobre la duracion de la llamada.
el problema es que cuando yo le doy aki un numero mayor que 0, me tendria que salir la frase para elejir tipo de llamada, pero esq lo que me sale es:
Tipo de llamada (N/P/L) Duracion de la llamada (0 para terminar)
Sin darme posibilidad a responder sobre el tipo de llamada.
lo raro es que si esta vez contesto un numero a la duracion de la llamada esta mayor que 0, entonces en la siguiente linea ya me saldria lo de tipo de llamada, y ya me iria todo perfecto.
Es decir, mi problema se encuentra en la segunda linea por que no me deja contestar al tipo de llamada.
pero no lo entiendo porque la segunda linea en teoria usa el mismo bucle que la tercera, que la cuarta, que la quinta.... asi que nose

De todas maneras, si lo ejecutaseis en un segundo en vuestro ordenador veriais a lo que me refiero rapidamente.

------------------------------------------------------------

Lo siento, el codigo que habia copiado no es el que realmente queria, ya que ese lo cree para ir probando cosas nuevas a ver si me salia.
mi codigo es:

program llamada;
var
duracion:integer;
tipo:char;
duracion_total,duracion_totaln,duracion_totalp,duracion_totall:integer;
numero,numero1,numero2,numero3:integer;
media,median,mediap,medial:real;

begin
duracion_total:=0;
numero:=0 ;
duracion:=0;
write('Duracion de la llamada (0 para terminar): ');
read(duracion);
while(duracion>0) do
begin
write('Tipo de llamada (N/P/L) ');
readln(tipo);
case (tipo) of
'n','N' : begin numero1:=numero1+1; duracion_totaln:=duracion_totaln+duracion; end;
'p','P' : begin numero2:=numero2+1; duracion_totalp:=duracion_totalp+duracion; end;
'l','L' : begin numero3:=numero3+1; duracion_totall:=duracion_totall+duracion; end;
end;
write('Duracion de la llamada (0 para terminar): ');
readln(duracion);
numero:=numero+1;
end;
duracion_total:=duracion_totaln+duracion_totalp+duracion_totall;
media:=duracion_total/(numero1+numero2+numero3);
median:=duracion_totaln/numero1;
mediap:=duracion_totalp/numero2;
medial:=duracion_totall/numero3;

writeln('>> Nacional');
writeln(' > LLamadas: ', numero1 , ' Duracion: ', duracion_totaln ,' > Media: ', median);
writeln('>> Provincial');
writeln(' > LLamadas: ', numero2 , 'Duracion: ', duracion_totalp ,' > Media: ', mediap);
writeln('>> Local');
writeln(' > LLamadas: ', numero3 , 'Duracion: ', duracion_totall ,' > Media: ', medial);
writeln('>> Total');
writeln(' > Numero de llamadas: ', numero);
writeln(' > Duracion total: ', duracion_total);
writeln(' > Duracion media: ', media);
end.

---------------------------------------------------------------------------------------

Saludos a todos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con fallo por favor, me estoy volviendo l

Publicado por Miguel (159 intervenciones) el 26/10/2008 19:31:24
Ah, si eso te sale porque tenes que hacer un readln(duracion) antes del ciclo.
De todas el algoritmo no esta bien hecho.
Por ejemplo, que pasa si no ingreso una llamada L.
Se hace este calculo.
medial:=duracion_totall/numero3;
Y numero tres esta en cero. (division por cero, no esta definida)... Y el programa se va a cerrar.
Agregale el READKEY al final por que no vas a visualizar nada.
Yo modificaria eso, y tambien lo que te mencione antes. La forma en que se sale del ciclo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar