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