Foro de elhacker.net

Programación => Ejercicios => Mensaje iniciado por: Corso en 18 Noviembre 2005, 20:40 pm



Título: Pascal+Case Of
Publicado por: Corso en 18 Noviembre 2005, 20:40 pm
Buenas. E modificado el programa teléfono (hace unos días pedí ayuda para este código, pero con otra finalidad, que por cierto gracias a jvchino, que no tuve tiempo de responder en el otro post).

En este nuevo código el programa solicita al usuario la duración de sus llamadas y también que tipo de llama es (Nacional, Provincial o Local). Luego presenta los resultados, por un lado, de las llamadas Nacionales, Provinciales o Locales (su duración y el numero realizado de cada tipo) y por otro, los totales (numero total, duración total y media). Por ultimo solicita al usuario si desea realizar otra lista.

Código:
 
program telefonos;

var
    (*Variables control TOTALES*)
   numero: integer;
   duracion: real;
   media: real;
   durac_total:real;
   
   (*Variables control Case of, Nacionales, Provinciales o Locales*)
   tipo:integer;
   N:real;
   P:real;
   L:real;
   duracionN:real;
   duracionP:real;
   duracionL:real;

   (*Variable Repeat until*)
   opcion:char;

begin

   repeat

     writeln('');
     write('Introduzca la duracion de la llamada en minutos (0 para terminar): ');
     readln(duracion);




     duracionN:=0;
     duracionP:=0;
     duracionL:=0;
     durac_total:=0;
     while (duracion>0) do

           begin
       write('Introduzca el tipo de llamada. 1:Nacional, 2:Provincial, 3:Local: ');
       readln(tipo);
       writeln('');

                       case (tipo) of
                            1: duracionN:=duracionN+duracion;
                            2: duracionP:=duracionP+duracion;
                            3: duracionL:=duracionL+duracion;
                       else
                       write('Opcion no permitida.');
                       writeln('');
                       writeln('');
                   end;

           if (tipo=1)then N:=N+1;
              if (tipo=2)then P:=P+1;
                if (tipo=3)then L:=L+1;



       write('Introduzca la duracion de la llamada en minutos (0 para terminar): ');


       durac_total:=durac_total+duracion;
       numero:=numero+1;
       readln(duracion);

           end;

       media:=durac_total/numero;
  writeln('');
  writeln('');
  writeln('');
  writeln('-Especificacion llamadas Nacionales, Provinciales y Locales-');
  writeln('');


  writeln('El numero de llamadas nacionales a sido: ',N:0:0,' y su duracion: ',duracionN:3:2,' minutos.');
  writeln('El numero de llamadas provinciales a sido: ',P:0:0,' y su duracion: ',duracionP:3:2,' minutos.');
  writeln('El numero de llamadas locales a sido: ',L:0:0,' y su duracion: ',duracionL:3:2,' minutos.');

  writeln('');
  writeln('-Totales-');
  writeln('');

  writeln('Numero de llamadas: ',numero);
  writeln('Duracion total: ',durac_total:3:2,' minutos.');
  writeln('Duracion media: ',media:3:2,' minutos.');

   writeln('');
   write('Desea continuar para realizar otra lista de llamadas? S/N: ');
   readln(opcion);
   until ((opcion ='N') or (opcion ='n')) ;

end.

Pues bien, no soy capaz (dentro del case of) a codificarlo para que el usuario pueda meter para las Nacionales una N, para las Provinciales una P y para las Locales una L. Sí lo conseguí hacer, si solo hubiera que "almacenar" la duración, o bien el numero pero ambas a la vez no, ya que para sacar el numero de llamadas de cada tipo, e usado la sentencia selectiva if then (lo intente de otras muchas maneras, pero al final la única que se me salio fue esta.)

Al tener que añadir la sentencia if then, la variable "tipo", no puede almacenar datos de tipo "char", (N, P, L), por que se produce un error entre tipos de datos en las variables (ya que en las variables N, P o L se van a almacenar datos de tipo numérico).

Pues nada más... Si me podéis echar una mano...

Salu2.


Título: Re: Pascal+Case Of
Publicado por: jvchino en 19 Noviembre 2005, 11:24 am
Dentro del "case" puedes colocar varias sentencias para cada opción.

Algunas modificaciones:

  • Puedes declarar la variable "tipo" como "char"
Código:
var
   tipo: char;

[li]Y que lo lea no con "read" sino con "upcase(readkey)"[/li]
Código:
write('Introduzca el tipo de llamada. [N]acional, [P]rovincial, [L]ocal: ');
tipo:=upcase(readkey);

[li]Dentro del "case...of"[/li]
Código:
CASE tipo OF
"N": begin
       duracionN:=duracionN+duracion;
       N:=N+1
     end;
"P": begin
       duracionP:=duracionP+duracion;
       P:=P+1
     end;
"L": begin
       duracionL:=duracionL+duracion;
       L:=L+1
     end
else
      write('Opcion no permitida.');

END;


[li]Antes de pasar a las líneas siguientes, debes considerar una cosa: Si se ingresa una opción no permitida, la durac_total no debe modificarse.  Entonces ¿Qué hacemos con el tiempo ya ingresado? ¿Lo obviamos y que se vuelva a ingresar otro tiempo y tipo de llamada? o ¿Aceptamos el tiempo y pedimos solamente que especifique nuevamente el tipo de llamada? [/li]
[li]Como ves son dos opciones... ¿Qué decides?, de acuerdo a lo que respondas (o propongas) podemos seguir modificando el programa[/li]
[li]Por otro lado, la duracion total (durac_total) y la cantidad total de llamadas (numero) sería mejor colocarlos fuera del while.[/li]
Código:
durac_total := duracionN + duracionP + duracionL;
numero := N + P + L;

[/list]

Saludos.


Título: Re: Pascal+Case Of
Publicado por: Corso en 20 Noviembre 2005, 05:55 am
Ya modifique el programa para que dentro del case of aumente la duración y las llamadas de cada tipo (eso era lo que no sabia como se hacia, como meter dentro del case varias sentencias, que es lo que intente desde el principio), y saque la duración total y el numero total de llamadas del while do (que ahora si se puede hacer, gracias al case of, pero antes no).
 
Por otro lado, no e puesto la asignación a la variable tipo (tipo:=upcase(readkey)) por que no se que significa, si me das una breve explicación...

También había pensado en lo que pasa si se introduce una opción no permitida, actualmente lo que hace es que si metes una opción no permitida omite esa duración y ese numero de llamada.
Si tuviera algo mas de tiempo intentaría hacer la otra opción, que seria que acumulara esa duración pidiendo a continuación el tipo de llamada.
Pero ahora quiero seguir con el tema siguiente que es  programación modular (funciones y procedimientos).

Bueno pues el código final del programa es:

Código:
program telefonos;

var
    (*Variables control TOTALES*)
   numero: real;
   duracion: real;
   media: real;
   durac_total:real;
   
   (*Variables control Case of, Nacionales, Provinciales o Locales*)
   tipo:char;
   N:real;
   P:real;
   L:real;
   duracionN:real;
   duracionP:real;
   duracionL:real;

   (*Variable Repeat until*)
   opcion:char;

begin

   repeat

     writeln('');
     write('Introduzca la duracion de la llamada en minutos (0 para terminar): ');
     readln(duracion);




     duracionN:=0;
     duracionP:=0;
     duracionL:=0;
     durac_total:=0;
     while (duracion>0) do

           begin
       write('Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: ');
       readln(tipo);
       writeln('');
                       
                       case (tipo) of
                       'N','n': begin
                                 duracionN:=duracionN+duracion;
                                 N:=N+1
                                 end;

                       'P','p': begin
                                 duracionP:=duracionP+duracion;
                                 P:=P+1
                                 end;

                       'L','l': begin
                                 duracionL:=duracionL+duracion;
                                 L:=L+1
                                 end
                        else
                                  begin
                                  write('Opcion no permitida.');
                                  writeln('');
                                  writeln('');
                                  end;

                       end;



           write('Introduzca la duracion de la llamada en minutos (0 para terminar): ');
           readln(duracion);




           end;
     durac_total:=duracionN+duracionP+duracionL;
     numero := N + P + L;
     media:=durac_total/numero;

     writeln('');
     writeln('');
     writeln('');
     writeln('-Especificacion llamadas Nacionales, Provinciales y Locales-');
     writeln('');


     writeln('El numero de llamadas nacionales a sido: ',N:0:0,' y su duracion: ',duracionN:3:2,' minutos.');
     writeln('El numero de llamadas provinciales a sido: ',P:0:0,' y su duracion: ',duracionP:3:2,' minutos.');
     writeln('El numero de llamadas locales a sido: ',L:0:0,' y su duracion: ',duracionL:3:2,' minutos.');

     writeln('');
     writeln('-Totales-');
     writeln('');

     writeln('Numero de llamadas: ',numero:0:0);
     writeln('Duracion total: ',durac_total:3:2,' minutos.');
     writeln('Duracion media: ',media:3:2,' minutos.');

     writeln('');
     write('Desea continuar para realizar otra lista de llamadas? S/N: ');
     readln(opcion);

   until ((opcion ='N') or (opcion ='n')) ;

end.


Jvchino muchas gracias por tu ayuda y lo de
 
Citar
Entonces ¿Qué hacemos con el tiempo ya ingresado? ¿Lo obviamos y que se vuelva a ingresar otro tiempo y tipo de llamada?
 
ya esta hecho. Seguiré con las funciones y procedimientos y ya te abrasaré a preguntas xD

Salu2.


Título: Re: Pascal+Case Of
Publicado por: jvchino en 20 Noviembre 2005, 06:28 am
La función "READKEY" asigna el valor de la tecla presionada sin necesidad de darle <enter>, aunque a veces, como en este caso, es mejor lo de "read(variable)", ya que si te equivocas de tecla puedes borrarlo e ingresar la correcta.
Esta función se emplea cuando programas pequeños juegos, tipo la culebrita (esa de los celulares), es decir si presionas las flechas la serpiente se mueve a la derecha, izquierda, etc.

La función "UPCASE" convierte las letras a sus respectivas mayúsculas, por ejemplo si tipo="n" entonces upcase(tipo) devolverá "N", si la variable ya está en mayúsculas no hace nada

Así puedes resumir tu código:

Código:

write('Introduzca el tipo de llamada. N:Nacional, P:Provincial, L:Local: ');
readln(tipo);
tipo:=upcase(tipo)
writeln('');

case (tipo) of
  'N': begin
         duracionN:=duracionN+duracion;
         N:=N+1
       end;

  'P': begin
         duracionP:=duracionP+duracion;
         P:=P+1
       end;

  'L': begin
         duracionL:=duracionL+duracion;
         L:=L+1
       end
.
.
.


Saludos.