Autor
|
Tema: Pascal+Case Of (Leído 6,859 veces)
|
Corso
|
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. 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
Mensajes: 1.999
La felicidad no es una meta, es un camino.
|
Dentro del "case" puedes colocar varias sentencias para cada opción. Algunas modificaciones: - Puedes declarar la variable "tipo" como "char"
[li]Y que lo lea no con "read" sino con "upcase(readkey)"[/li] write('Introduzca el tipo de llamada. [N]acional, [P]rovincial, [L]ocal: '); tipo:=upcase(readkey); [li]Dentro del "case...of"[/li] 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] 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
|
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: 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 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
Mensajes: 1.999
La felicidad no es una meta, es un camino.
|
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: 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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
programando c++ con switch y case
Programación C/C++
|
nandeider
|
6
|
18,361
|
25 Mayo 2011, 19:34 pm
por Norochii
|
|
|
Case label '#' not within a switch statement
Programación C/C++
|
mistaiker
|
4
|
12,310
|
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,585
|
28 Noviembre 2011, 18:32 pm
por ZedGe
|
|
|
Este Case no me anda, no me figuro
Programación C/C++
|
Anastacio
|
5
|
2,603
|
20 Febrero 2012, 00:05 am
por Caster
|
|
|
Case en MySQL
Desarrollo Web
|
Bhrentox
|
1
|
1,874
|
13 Marzo 2013, 16:29 pm
por 1mpuls0
|
|