Selección. CASE. - Departamento de Electrónica

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
14. Selección. CASE
14.1. Generalidades.
Adicionalmente a la instrucción de alternativa, if then else, que permite seleccionar una de
dos alternativas de acuerdo al valor de la condición, se dispone de la instrucción case que
permite seleccionar una de varias acciones. Una traducción posible es 'caso de'.
La forma de escribir esta claúsula es:
case expresión of
valor1 : instrucción1;
valor2 : instrucción2;
.
.
valorn : instrucciónn
end
Nótese la indentación empleada.
Si en el momento de la ejecución, la expresión toma el valor (valor i), se selecciona para
ejecución la instruccióni. Luego de ésto, se continúa la ejecución en la instrucción ubicada
después del end que delimita el case.
La expresión se denomina selector y debe ser del tipo ordinal (no se permite tipo real); los
valores que denotan las instrucciones, deben ser de igual tipo que el selector.
Si para varios valores, debe realizarse la misma acción, puede abreviarse:
valor1,valor2,..,valori : instruccion;
Prof. Leopoldo Silva Bijit.
07-07-2003
164
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
Si al evaluarse la expresión, resulta un valor que no figura en las listas de valores que
referencian instrucciones, no se realizará acción.
No pueden escribirse valores iguales para referenciar a instrucciones diferentes.
No es preciso que los valores estén ordenados. Pero si es conveniente hacerlo, para
mejorar la legibilidad.
14.2. Sintaxis.
<instrucción de selección> ::=
'case' <expresion ordinal> 'of'
{ ( {<constante>* ',' } ':' <instruccion> )* ';' }
'end'
Puede asociarse a algunos valores una acción nula; es decir, un punto y coma.
Esta acción debe planearse cuidadosamente, pues si la expresión toma valores que (por no
ser considerados inicialmente) no figuren en las listas, pueden producirse errores lógicos
difíciles de detectar. Esto debido a que los errores no son detectados en la compilación, sino
que en la ejecución.
Varias versiones de compiladores Pascal, han agregado la palabra otherwise, para
referirse a todos aquellos casos no considerados en las listas. Esta palabra se coloca al final
de las listas de valores, va seguida de dos puntos, y de la instrucción que se realiza en este
caso.
Algunos recomiendan su empleo en caso de acciones mutuamente excluyentes. Prefiriendo
esta instrucción que la cadena de if then else equivalente.
Por otra parte, en forma análoga, se recomienda esta instrucción cuando los valores de la
lista son esencialmente adyacentes. Es decir, que no queden "huecos" en el dominio del tipo
de la expresión.
Prof. Leopoldo Silva Bijit.
07-07-2003
165
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
La alternativa discrimina respecto a una expresión booleana, el case permite seleccionar en
forma más flexible. Y en algunos casos mejora la legibilidad, destacando con precisión el
secuenciamiento de las acciones.
Esta instrucción está especialmente diseñada para manipular registros con variantes que
representan a la estructura matemática denominada uniones discriminadas.
14.3 Aplicaciones.
14.3.1 Uso del case para desarrollar instrucciones de entrada y salida de tipos enumerativos.
Sea el siguiente espacio:
var dias:(lu,ma,mi,ju,vi,sa,do);
dd :1..7;
El siguiente segmento permite escribir en la salida estándar:
..
case dias of
lu : write('lunes');
ma : write('martes');
mi : write('miercoles');
ju : write('jueves');
vi : write('viernes');
sa : write('sabado');
do : write('domingo')
end;
..
La lectura puede lograrse :
..
read(dd);
case dd of
1 : dias:=lu;
2 : dias:=ma;
3 : dias:=mi;
4 : dias:=ju;
5 : dias:=vi;
Prof. Leopoldo Silva Bijit.
07-07-2003
166
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
6 : dias:=sa;
7 : dias:=do
end;
..
Prof. Leopoldo Silva Bijit.
07-07-2003
167
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
14.3.2 Listas de selección.
El siguiente segmento ilustra el empleo de listas de valores para referenciar las
instrucciones:
case dias of
lu,ma,mi,ju,vi : write('dia habil');
sa,do
: write('dia descanso')
end;
14.3.3 Huecos en el dominio.
No conviene usar la selección en casos como el siguiente, asumiendo que i es entero :
case i of
7: a1;
21: a2;
38: a3
end;
Ya que gran parte del dominio no tiene asociada acciones; y sólo en tres casos el case
seleccionará una acción. Es preferible codificar con if then else en esta situación.
14.3.4. Clasificación de caracteres.
El siguiente ejemplo ilustra el anidamiento de casos de selección.
var ch : char;
..
case ch of
'0'..'9' : write('es dígito');
'A'..'z' : case ch of
'A'..'Z' : write('es letra mayúscula');
'a'..'z' : write('es letra minúscula')
end
end;
Se anotan las listas como subrangos; algunos compiladores lo aceptan. El caso estándar
requiere listas de valores, separados por comas.
Prof. Leopoldo Silva Bijit.
07-07-2003
168
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
14.3.5 Menúes.
En programación interactiva, suelen realizarse las acciones principales, bajo el control de
un segmento como el siguiente:
write('Entre su eleccion : '); readln(opcion);
case opcion of
'E','e' : entrada;
'C','c' : calculos;
'S','s' : salida;
'H','h' : ayuda;
'R' : retorno_al_sistema_operativo
end;
14.3.6 Rutina de conversión.
El siguiente programa convierte una secuencia de caracteres que forman un número
hexadecimal, en un número entero decimal equivalente.
La representación externa es una secuencia de caracteres, la interna equivalente es un valor
de tipo entero.
El el programa siguiente se emplea entrada sin eco, que en Pascal estándar es simplemente
read. Sin embargo, en varias implementaciones se define un dispositivo (no estándar)
denominado keyboard, que significa teclado. También se suele emplear kbd (En Turbo
Pascal) como abreviatura.
program hex(keyboard,output);
var ch : char;
dec: integer;
begin
dec:=0;
while not eoln(keyboard) do
Prof. Leopoldo Silva Bijit.
07-07-2003
169
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
begin
repeat read(keyboard,ch)
until (ch in ['0'..'9','A'..'F']) or eoln(keyboard);
if not eoln(keyboard) then
begin
case ch of
'0'..'9':dec:=16*dec+ord(ch)-ord('0');
'A'..'F':dec:=16*dec+ord(ch)-ord('A')+10
end;
{case}
write(ch) {eco}
end
end;
write(dec:10); readln(keyboard)
end.
Notas :
El dispositivo que lee sin eco se denomina keyboard; es no estándar.
Se posterga el readln, para escribir el resultado en la misma línea.
Se acepta sólo caracteres hexadecimales válidos; el programa no contempla entrar
caracteres en minúsculas.
Sólo se da eco a los caracteres aceptados.
Otra implementación de la rutina de conversión:
La siguiente versión, acepta la secuencia hexadecimal terminada en un punto. No se emplea
la función eoln.
Adicionalmente, el programa acepta repetir la entrada de una secuencia hasta digitar una q
minúscula.
Puede comprobarse que la aritmética entera es módulo maxint.
Esto puede verse ingresando un número hexadecimal, cuya equivalencia sea mayor que
maxint. En este caso se escribirá un número negativo.
program hex (input,output);
var ch : char;
dec : integer;
Prof. Leopoldo Silva Bijit.
07-07-2003
170
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
Programación en Pascal
Capítulo 14. Selección. CASE.
procedure lea(var ch:char);
begin
repeat
read(kbd,ch)
{no estándar}
until (ch in ['0'..'9','A'..'F']) or (ch='.') or (ch'q');
write(ch)
end;
begin
writeln('De hexadecimal a decimal. ');
repeat
dec:=0;write('>');
repeat
lea(ch);
case ch of
'0'..'9' : dec:=16*dec+ord(ch)-ord('0');
'A'..'F' : dec:=16*dec+ord(ch)-ord('A')+10;
'.' : write(' == ',dec:10);
'q' : write(chr(07),' ==> Nos vamos ')
end {case}
until (ch='.') or (ch='q');
writeln
until ch='q'
end.
Prof. Leopoldo Silva Bijit.
07-07-2003
171
Descargar