Está en la página 1de 13

USO de CASE of en Pascal

Veamos la sintaxis de CASE OF, que nos permite tomar diferentes acciones:

PROGRAM uso_case;
var
nombre : string[40];
BEGIN
writeln('Ingrese su nombre');
readln(nombre);
case nombre[1] of
'0'..'9': writeln('Primer caracter de nombre es nmerico');
'a'..'z': writeln('Primer caracter en minsculas');
'A'..'Z': writeln('Primer caracter en maysculas');
else
writeln('Primer caracter es desconocido');
end; { case }
END.

Se toma desde el teclado un STRING y se guarda en la variable nombre, luego se evalua el


contenido del primer carcter de la variable y segn cual sea se tomaran diferentes
acciones, aqu usamos los dos puntos (..) para que se rellenen los rangos, es decir '0'..'9' se
expande a '0' '1' '2' '3' '4' '5' '6' '7' '8' '9', lo mismo ocurre con 'a'..'z'. .

La instruccin debajo de la palabra reservada else, slo se ejecutar si el primer carcter no


se encuentra en ninguno de los rangos anteriores.

Alternativa mltiple ( la instruccin case )


Una instruccin alternativa mltiple (o simplemente alternativa mltiple) permite seleccionar, por medio
de una expresin, el siguiente bloque de instrucciones a ejecutar de entre varios posibles. En Pascal, para
escribir una alternativa mltiple se utiliza la sintaxis:

case <expresin> of
<lista_de_constantes_1> : begin
<bloque_de_instrucciones_1>
end;
<lista_de_constantes_2> : begin
<bloque_de_instrucciones_2>
end;
...
<lista_de_constantes_n> : begin
<bloque_de_instrucciones_n>
end
[ else
begin
<bloque_de_instrucciones_n+1>
end ]
end
El resultado de evaluar la <expresin> debe ser un valor perteneciente a un tipo de dato finito y
ordenado, es decir, entero, lgico, carcter, enumerado o subrango.

Dependiendo del valor obtenido al evaluar la <expresin>, se ejecutar un bloque de instrucciones u otro.
En las listas de constantes se deben escribir los valores que determinan el bloque de instrucciones a ejecutar,
puediendo ser constantes (por ejemplo: 5 '5') o subrangos (por ejemplo: 1..5 '1'..'5').

Opcionalmente, se puede escribir un <bloque_de_instrucciones_n+1> despus de la palabra


reservada else. Este bloque de instrucciones se ejecutar en el caso de que el valor obtenido al evaluar la
<expresin>, no se encuentre en ninguna de las listas de constantes.

Ejemplo 1: Se quiere escribir un programa que:

1) Pida por teclado el nmero (dato entero) de un da de la semana.


2) Muestre por pantalla el nombre (dato cadena) correspondiente a dicho da.

Nota: Si el nmero de da introducido es menor que 1 mayor que 7, se mostrar el mensaje: "ERROR: Da
incorrecto.".

En pantalla:

Introduzca dia de la semana: 2

Martes

Introduzca dia de la semana: 9

ERROR: Dia incorrecto.

Cuando un bloque de instrucciones slo contiene una instruccin, las palabras reservadas begin y end, que
enmarcan dicho bloque, son opcionales. As pues, podemos escribir:

programEJE12041;

usesCrt;

varDia:Integer;

begin
ClrScr;
GotoXY(4,2);
Write('Introduzcadiadelasemana:');
ReadLn(Dia);

GotoXY(4,4);
caseDiaof
1:Write('Lunes');
2:Write('Martes');
3:Write('Miercoles');
4:Write('Jueves');
5:Write('Viernes');
6:Write('Sabado');
7:Write('Domingo')
else
Write('ERROR:Diaincorrecto.')
end
end.
Programa (.PAS): Da de la semana

Cuando en una lista de constantes de una alternativa mltiple aparece ms de un valor, estos se escriben
separados por el carcter coma (,). Estdiese el siguiente ejemplo.

Ejemplo 2: En la siguiente tabla se muestran las categoras a las que pertenecen los signos del zodaco:

Se quiere escribir un programa que:

1) Muestre el listado de los signos del zodaco, con sus nmeros asociados.
2) Pida por teclado un nmero (dato entero) asociado a un signo del zodaco.
3) Muestre la categora a la que pertenece el signo del zodaco seleccionado.
Nota: Si el nmero introducido por el usuario, no est asociado a ningn signo del zodaco, se mostrar el
mensaje: "ERROR: <nmero> no est asociado a ningn signo.".

En pantalla:

Listado de signos del zodiaco:

1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis

Introduzca numero de signo: 7

Es un signo de Aire.

Listado de signos del zodiaco:

1. Aries
2. Tauro
3. Geminis
4. Cancer
5. Leo
6. Virgo
7. Libra
8. Escorpio
9. Sagitario
10. Capricornio
12. Acuario
13. Piscis

Introduzca numero de signo: 15

ERROR: 15 no esta asociado a ningun signo.

Una posible solucin es:

programEJE12051;
usesCrt;

varNumero:Integer;

begin
ClrScr;
GotoXY(4,2);
Write('Listadodesignosdelzodiaco:');
GotoXY(4,4);
Write('1.Aries');
GotoXY(4,5);
Write('2.Tauro');
GotoXY(4,6);
Write('3.Geminis');
GotoXY(4,7);
Write('4.Cancer');
GotoXY(4,8);
Write('5.Leo');
GotoXY(4,9);
Write('6.Virgo');
GotoXY(4,10);
Write('7.Libra');
GotoXY(4,11);
Write('8.Escorpio');
GotoXY(4,12);
Write('9.Sagitario');
GotoXY(4,13);
Write('10.Capricornio');
GotoXY(4,14);
Write('11.Acuario');
GotoXY(4,15);
Write('12.Piscis');
GotoXY(4,17);
Write('Introduzcanumerodesigno:');

Read(Numero);

GotoXY(4,19);
caseNumeroof
1,5,9:Write('EsunsignodeFuego.');
2,6,10:Write('EsunsignodeTierra.');
3,7,11:Write('EsunsignodeAire.');
4,8,12:Write('EsunsignodeAgua.')
else
Write('ERROR:',Numero,
'noestaasociadoaningunsigno.')
end
end.
Programa (.PAS): Signo del zodaco (Solucin 1)

Otra solucin es:


programEJE12052;

usesCrt;

var
Numero:Integer;
Categoria:String[6];

begin
ClrScr;
GotoXY(4,2);
Write('Listadodesignosdelzodiaco:');
GotoXY(4,4);
Write('1.Aries');
GotoXY(4,5);
Write('2.Tauro');
GotoXY(4,6);
Write('3.Geminis');
GotoXY(4,7);
Write('4.Cancer');
GotoXY(4,8);
Write('5.Leo');
GotoXY(4,9);
Write('6.Virgo');
GotoXY(4,10);
Write('7.Libra');
GotoXY(4,11);
Write('8.Escorpio');
GotoXY(4,12);
Write('9.Sagitario');
GotoXY(4,13);
Write('10.Capricornio');
GotoXY(4,14);
Write('11.Acuario');
GotoXY(4,15);
Write('12.Piscis');
GotoXY(4,17);
Write('Introduzcanumerodesigno:');

Read(Numero);

caseNumeromod4of
1:Categoria:='Fuego';
2:Categoria:='Tierra';
3:Categoria:='Aire';
0:Categoria:='Agua'
end;

GotoXY(4,19);
if(Numero>=1)and(Numero<=12)then
Write('Esunsignode',Categoria,'.')
else
Write('ERROR:',Numero,
'noestaasociadoaningunsigno.')
end.
Programa (.PAS): Signo del zodaco (Solucin 2)

En esta segunda solucin existen las siguientes diferencias importantes con respecto a la solucin anterior:

En el cdigo se utiliza una alternativa doble (if), adems de una alternativa mltiple (case).

En la alternativa mltiple no se escribe el <bloque_de_instrucciones_n+1>.

La <expresin> de la alternativa mltiple es diferente.

La expresin 'Es un signo de ' slo se escribe una vez.

Se ha utilizado una variable ms: Categoria

El CASE es una instruccion SELECTIVA Multiple, te ayuda a seleccionar un


opcion dependiendo de una valor de una variable, esta variable tiene que ser
de tipo INTEGER (y sus derivados: word, byte, longint, etc...) o CHAR, El CASE
puede llevar una sentencia ELSE por si no se cumple ninguna de los opciones
establecidas, es uno de los pocos comandos en Pascal que debe de llevar la
sentencia END; para terminar, a excepcion del BEGIN. prueba el siguiente
programa, si ingresas un numero entre 1 y 9 te muestra su valor con letra, si el
numero no esta en ese rango te muestra un mensaje de error, esta hecho para
que funcione con Turbo Pascal 7.0 de Borland, quiza con free pascal hay que
hacerle algunas modificaciones para que funcione.

PROGRAM NUMEROS;
USES CRT;
VAR OPCION : INTEGER;

BEGIN
CLRSCR;
WRITE('INGRESA UN NUMERO ENTRE 1 Y 9 ');
READLN(OPCION);
CASE OPCION OF
1 : WRITELN('UNO');
2 : WRITELN('DOS');
3 : WRITELN('TRES');
4 : WRITELN('CUATRO');
5 : WRITELN('CINCO');
6 :WRITELN('SEIS');
7 : WRITELN ('SIETE');
8 : WRITELN('OCHO');
9 : WRITELN('NUEVE');
ELSE WRITELN('EL NUMERO NO ES ENTRE 1 Y 9');
END; {DEL CASE}
READKEY;
END.

case place of
1: ShowMessage('Medalla de oro');
2: ShowMessage('Medalla de plata');
3: ShowMessage('Medalla de bronce');
else ShowMessage('Mejor suerte la siguiente vez');
end;

PROGRAM EJER36;
USES CRT;
VAR num_dia_sem:INTEGER;
BEGIN
ClrScr;

WRITE('Dia de la semana (numero) -> '); READLN(num_dia_sem);

CASE num_dia_sem OF
1: WRITELN('Lunes');
2: WRITELN('Martes');
3: WRITELN('Miercoles');
4: WRITELN('Jueves');
5: WRITELN('Viernes');
6: WRITELN('Sabado');
7: WRITELN('Domingo');
ELSE
WRITELN('No es un dia de la semana');
END;
END.

Manejo de la Pantalla
Como en un monitor funcionando bajo el modo texto, cada columna y cada fila de
caracteres en la pantalla estn numerada, es posible controlar apectos de la pantalla tales
como la posicin donde escribe un texto, hallar la posicion del cursor, o borrar todo el texto
de una fila. Para llevar a cabo estas tareas, la unidad Crt de Turbo Pascal dispone de varios
procedimientos que permiten tener control sobre como se visualiza la informacin en la
pantalla.
A continuacin se explicarn algunos procedimentos de manejo de pantalla, usando como
ejemplo una pantalla de 80 x 25 celdas, teniendo en cuenta que las columnas van
numeradas desde 1 hasta 80, partiendo de izquierda a derecha y las filas desde 1 hasta 25,
partiendo de arriba hacia abajo.

Procedimiento GotoXY
Este procedimiento permite ubicar del cursor en una coordenada de pantalla especifica,
controlando as la posicin donde se escribira un texto. La sintaxis de este procedimento es
la siguiente:

GotoXY(Columna, Fila);
Donde: Columna y Fila, como sus nombres lo indican, representan respectivamente el
numero de la columna y la fila, en donde se colocar el cursor. Con el siguiente programa
entenders mejor el uso del procedimiento GotoXY, y la diferencia entre columnas y filas:

PROGRAM Uso_de_gotoxy;

{+--------------------------------------------+
|Este programa escribir un saludo partiendo |
|desde la columna #20 y la fila #15 |
+--------------------------------------------+}

USES
crt;

BEGIN
CLRSCR;
GOTOxy (20, 15);
WRITELN('Hola!, Amigos de Turbo Pascal');
GOTOxy (1, 18);
WRITELN('El saludo apareci en las coordenadas (20, 15) de la
pantalla');
WRITE('Pulse ENTER para salir');
READLN;
END.
Para reproducir sonidos en Pascal tienes que llamar a la funcin "sound" y
pasarle como parmetro un nmero (el nmero representa la nota), pero
atencin, despus de reproducir una nota mediante esta funcin debes
detenerla mediante el "nosound", si no lo haces la nota se producira por un
tiempo indefinido, algo sencillo:

Program Nota;
uses crt;
begin
sound(10);
nosound;
end.

El programa anterior solo producira un "pitido", para que este "pitido" o sonido
muy breve dure ms tiempo puedes hacer uso de la funcin "delay", por
ejemplo:

Program Nota;
uses crt;
begin
sound(10);
delay(100);
nosound;
end.

Ahora el sonido se prolongara un poco ms de tiempo, tanto como el mismo


"delay" se lo permita, es decir, a mayor valor del "delay" ms tiempo durara el
sonido.

Con respecto a los dibujos con caracteres, puedes colocarlos despus del
mismo "sound" y antes del "delay", as aparecera un "dibujo" por cada nota,
por ejemplo:

Program Nota;
uses crt;
begin
clrscr;
sound(10);
write('xD');
delay(200);
clrscr;
sound(12);
write('=)');
delay(200);
{ repetir segmento clrscr-delay }
readkey;
end.

Esto solo es un ejemplo, tu programa debera ser un poco ms elaborado con


esto solo intente darte la idea, bueno suerte con tu tarea espero te sirva =)

Sound, Nosound y Delay

Sound reproduce un sonido en cierta frecuencia de Hz.


Nosound termina la reproduccion
Y Delay termina los milisegundos que quieres que dure el sonido (cada uno de los sonidos,
es decir las notas musicales).

Primero que nada, necesitas saber la frecuencia en Hz de las notas musicales. Aqui te la
dejo:

http://webdelprofesor.ula.ve/ciencias/sa (para tubas)


http://es.wikipedia.org/wiki/Frecuencias (piano)
http://es.answers.yahoo.com/question/ind

Ve probando con todas hasta que encuentras la que se adapte.


Luego, claro saberte las notas de la cancion de quieres

Ahora si el programa:

program musica;

uses crt;

const (aqui pones la frecuencia, de la lista que te pas... los nmeros que pongo son
demonstracin para hacer el ejemplo)
do = 65,406;
re = 73,416;
mi = 82,407 ;
fa = 87,307;
sol = 97,999;
la = 110;
si = 123,471 ;

var
i, op : integer;

begin
clrscr;
writeln('Seleccione dia festivo');
writeln(' (1)Navidad');
writeln(' (2) Pascua');
(aqui sigues con los dems das festivos)
writeln('Seleccione opcion');
readln(op);
case op of
begin
1:
begin
sound (do);
delay(5000); {5000 milisegundos o sea 5 segundos}
no sound; {termina de sonar}
{dependiendo de la cancion, aqui le sigues con las dems notas}
end;
2:
{lo mismo de la opcion 1}
end;
readkey;
end.

Ahora s, te dejo unas canciones de dias festivo para que tengas de donde hacer el programa
(los asteriscos es que la nota es aguda, en el tercer enlace que te puse vienen las
frecuencias)

Noche de paz
sol la sol mi
sol la sol mi
re* re* si do* do* so|

la la do* si la sol la sol mi


la la do si la sol la sol mi

re* re* fa* re* si do* mi*


do* sol mi sol| fa re do

re* re* fa* re* si do* mi*


do* sol mi sol fa re do la sol
Campana sobre campana
fa fa fa fa mi fa so| mi do
so| so| la sib la so| la fa
fa fa fa fa mi fa so| mi do
so| so| la sib la so| la fa

fa la do* do* re* do* sib re* do*


do* re* do* re* mi* fa* do* re* do* sib la so| fa

la sib la so| fa do* re* do* sib la


do* do* Si so| do* sib la so| fa

Faltan cinco pa' las doce


http://familiaytu.com/faltan-cinco-pa-la

Fuente(s):

http://webdelprofesor.ula.ve/ciencias/sa (para tubas)


http://es.wikipedia.org/wiki/Frecuencias (piano)
http://es.answers.yahoo.com/question/ind
men aqui t dejo un codigo q produce sonidosen tp 7.0, es super sencillo, t
pongo uno corto y sencillo simplemente para q veas y tengas una idea d como
producir sonidos.

program sonido;
uses crt;
var
sonido:word;

begin
CLRSCR;

sound (820);
delay (2000);
nosound;
delay (5000);
sound (812);
delay (5000);
nosound;
delay (2000);
end.