elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  Pascal+Case Of
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pascal+Case Of  (Leído 6,848 veces)
Corso


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Pascal+Case Of
« 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.


« Última modificación: 18 Noviembre 2005, 20:42 pm por Corso » En línea

Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.


jvchino
Solo soy un
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.999


La felicidad no es una meta, es un camino.


Ver Perfil
Re: Pascal+Case Of
« Respuesta #1 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.


« Última modificación: 19 Noviembre 2005, 11:27 am por jvchino » En línea

Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.

No, nada llega tarde, porque todas las cosas
tienen su tiempo justo, como el trigo y las rosas
Corso


Desconectado Desconectado

Mensajes: 337



Ver Perfil WWW
Re: Pascal+Case Of
« Respuesta #2 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.
En línea

Cualquier ciudad es un secreto. Toda palabra traza un laberinto. De cualquier laberinto se sale con palabras.


jvchino
Solo soy un
Ex-Staff
*
Desconectado Desconectado

Mensajes: 1.999


La felicidad no es una meta, es un camino.


Ver Perfil
Re: Pascal+Case Of
« Respuesta #3 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.
En línea

Si ayudo a una sola persona a tener esperanza, no habré vivido en vano.

No, nada llega tarde, porque todas las cosas
tienen su tiempo justo, como el trigo y las rosas
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
programando c++ con switch y case
Programación C/C++
nandeider 6 18,347 Último mensaje 25 Mayo 2011, 19:34 pm
por Norochii
Case label '#' not within a switch statement
Programación C/C++
mistaiker 4 12,298 Último mensaje 27 Agosto 2011, 15:35 pm
por Queta
Filtrar resultados de JTable que no sea Case Sensitive (ni mayus, ni minus)
Java
Aikanáro Anário 5 6,560 Último mensaje 28 Noviembre 2011, 18:32 pm
por ZedGe
Este Case no me anda, no me figuro
Programación C/C++
Anastacio 5 2,599 Último mensaje 20 Febrero 2012, 00:05 am
por Caster
Case en MySQL
Desarrollo Web
Bhrentox 1 1,868 Último mensaje 13 Marzo 2013, 16:29 pm
por 1mpuls0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines