USO de CASE of en Pascal Veamos Veamos la sintaxis de CASE OF, que nos permite tomar diferentes acciones: PROGRAM uso_case; var nombre : string[40]; BEGI !rite"n#$Ingrese su nombre$%; rea&"n#nombre%; case nombre['] o( $0$))$*$: !rite"n#$Primer caracter &e nombre es n+merico$%; $a$))$,$: !rite"n#$Primer caracter en min+scu"as$%; $A$))$-$: !rite"n#$Primer caracter en ma.+scu"as$%; e"se !rite"n#$Primer caracter es &esconoci&o$%; en&; / case E1)
Se toma desde el teclado un STRIN ! se "uarda en la #aria$le nombre, lue"o se e#alua el contenido del primer car%cter de la #aria$le ! se"&n cual sea se tomaran diferentes acciones, aqu' usamos los dos puntos ())* para que se rellenen los ran"os, es decir '0'..'9' se se expande a '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' , lo mismo ocurre con 'a'..'z' ) ) +a instruccin de$a-o de la pala$ra reser#ada else , slo se e-ecutar% si el primer car%cter no se encuentra en nin"uno de los ran"os anteriores) Alternativa múltiple ( la instrucción case )
.na instrucción alternativa múltiple (o simplemente alternativa múltiple * permite seleccionar, por medio de una expresin, el si"uiente $loque de instrucciones a e-ecutar de entre #arios posi$les) En /ascal, para escri$ir una alternati#a m<iple se utili0a la sintaxis:
case 2e3resi5n6 of 2"ista_&e_constantes_'6 : begin 2b"o7ue_&e_instrucciones_'6 end;
2"ista_&e_constantes_86 : begin 2b"o7ue_&e_instrucciones_86 end; ...
2"ista_&e_constantes_n6 : begin 2b"o7ue_&e_instrucciones_n6 end
[ else begin
2b"o7ue_&e_instrucciones_n9'6 ] ] end end
El resultado de e#aluar la 2e3resi5n6 de$e ser un #alor perteneciente a un tipo de dato finito ! ordenado, es decir, entero, l"ico, car%cter, enumerado o su$ran"o) 1ependiendo del #alor o$tenido al e#aluar la 2e3resi5n6, se e-ecutar% un $loque de instrucciones u otro) En las listas de constantes se de$en escri$ir los #alores que determinan el $loque de instrucciones a e-ecutar, puediendo ser constantes (por e-emplo: 5 '5'* o su$ran"os (por e-emplo: 1..5 '1'..'5' *) Opcionalmente, se puede escri$ir un 2b"o7ue_&e_instrucciones_n9'6 despu2s de la pala$ra reser#ada else) Este $loque de instrucciones se e-ecutar% en el caso de que el #alor o$tenido al e#aluar la 2e3resi5n6, no se encuentre en nin"una de las listas de constantes) Ejemplo 1: Se quiere escri$ir un pro"rama que:
34* /ida por teclado el n&mero (dato entero* de un d'a de la semana) 54* 6uestre por pantalla el nom$re (dato cadena* correspondiente a dic7o d'a) Nota: Si el n&mero de d'a introducido es menor que 3 ma!or que 8, se mostrar% el mensa-e: 9ERROR: 1'a incorrecto)9) En pantalla:
Introduzca dia de la semana: 2 Martes
Introduzca dia de la semana: 9 ERROR: Dia incorrecto.
Cuando un $loque de instrucciones slo contiene una instruccin, las pala$ras reser#adas begin ! end , que enmarcan dic7o $loque, son opcionales) As' pues, podemos escri$ir: program EJE12041; uses Crt; var Dia : Integer; begin ClrScr; GotoXY( 4, 2 ); Write( 'Introduzca dia de la semana: ' ); ReadLn( Dia );
GotoXY( 4, 4 ); case Dia of 1 : Write( 'Lunes' );
2 : Write( 'Martes' ); 3 : Write( 'Miercoles' ); 4 : Write( 'Jueves' ); 5 : Write( 'Viernes' ); 6 : Write( 'Sabado' ); 7 : Write( 'Domingo' ) else Write( 'ERROR: Dia incorrecto.' ) end end. Prorama (!PAS): 1'a de la semana
Cuando en una lista de constantes de una alternati#a m<iple aparece m%s de un #alor, estos se escri$en separados por el car%cter coma (,*) Est&diese el si"uiente e-emplo) Ejemplo ": En la si"uiente ta$la se muestran las cate"or'as a las que pertenecen los si"nos del 0od'aco:
Se quiere escri$ir un pro"rama que: 34* 6uestre el listado de los si"nos del 0od'aco, con sus n&meros asociados) 54* /ida por teclado un n&mero (dato entero* asociado a un si"no del 0od'aco) 4* 6uestre la cate"or'a a la que pertenece el si"no del 0od'aco seleccionado)
Nota: Si el n&mero introducido por el usuario, no est% asociado a nin"&n si"no del 0od'aco, se mostrar% el mensa-e: 9ERROR: ;n&mero< no est% asociado a nin"&n si"no)9) En pantalla:
Listado de signos del zodiaco: 1. Aries 2. Tauro 3. eminis !. "ancer #. Leo $. %irgo &. Li'ra (. Escor)io 9. *agitario 1+. "a)ricornio 12. Acuario 13. ,iscis Introduzca numero de signo: & Es un signo de Aire.
Listado de signos del zodiaco: 1. Aries 2. Tauro 3. eminis !. "ancer #. Leo $. %irgo &. Li'ra (. Escor)io 9. *agitario 1+. "a)ricornio 12. Acuario 13. ,iscis Introduzca numero de signo: 1# ERROR: 1# no esta asociado a ningun signo.
.na posi$le solucin es: program EJE12051;
uses Crt; var Numero : Integer; begin ClrScr; GotoXY( 4, 2 ); Write( 'Listado de signos del zodiaco:' ); 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( 'Introduzca numero de signo: ' ); Read( Numero );
GotoXY( 4, 19 ); case Numero of 1, 5, 9 : Write( 'Es un signo de Fuego.' ); 2, 6, 10 : Write( 'Es un signo de Tierra.' ); 3, 7, 11 : Write( 'Es un signo de Aire.' ); 4, 8, 12 : Write( 'Es un signo de Agua.' ) else Write( 'ERROR: ', Numero, ' no esta asociado a ningun signo.' ) end end. Prorama (!PAS): Si"no del 0od'aco (Solucin 3*
Otra solucin es:
program EJE12052; uses Crt; var Numero : Integer; Categoria : String [6]; begin ClrScr; GotoXY( 4, 2 ); Write( 'Listado de signos del zodiaco:' ); 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( 'Introduzca numero de signo: ' ); Read( Numero ); case Numero mod 4 of 1 : Categoria := 'Fuego'; 2 : Categoria := 'Tierra'; 3 : Categoria := 'Aire'; 0 : Categoria := 'Agua' end;
GotoXY( 4, 19 ); if ( Numero >= 1 ) and ( Numero <= 12 ) then Write( 'Es un signo de ', Categoria, '.' ) else Write( 'ERROR: ', Numero,
' no esta asociado a ningun signo.' ) end. Prorama (!PAS): Si"no del 0od'aco (Solucin 5*
En esta se"unda solucin existen las si"uientes diferencias importantes con respecto a la solucin anterior: •
En el cdi"o se utili0a una alternati#a do$le (if*, adem%s de una alternati#a m<iple ( case*)
•
En la alternati#a m<iple no se escri$e el 2b"o7ue_&e_instrucciones_n9'6)
•
+a 2e3resi5n6 de la alternati#a m<iple es diferente)
•
+a expresin $Es un signo &e $ slo se escri$e una #e0)
•
Se 7a utili0ado una #aria$le m%s: ategoria
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! "ord, byte, lon#int, etc$$$% o C&AR, El CASE puede llevar una sentencia ELSE por si no se cu'ple nin#una de los opciones establecidas, es uno de los pocos co'andos en (ascal que debe de llevar la sentencia EN)* para ter'inar, a e+cepcion del EGIN$ prueba el si#uiente pro#ra'a, si in#resas un nu'ero entre - y . te 'uestra su valor con letra, si el nu'ero no esta en ese ran#o te 'uestra un 'ensa/e de error, esta 0ec0o para que 1uncione con Turbo (ascal 2$3 de orland, qui4a con 1ree pascal 0ay que 0acerle al#unas 'odi5caciones para que 1uncione$ (R6GRAM N7MER6S* 7SES CRT* VAR 6(CI6N ! INTEGER* EGIN CLRSCR* 8RITE9INGRESA 7N N7MER6 ENTRE - : . 9%* REA)LN6(CI6N%* CASE 6(CI6N 6; - ! 8RITELN97N69%* < ! 8RITELN9)6S9%* = ! 8RITELN9TRES9%* > ! 8RITELN9C7ATR69%* ? ! 8RITELN9CINC69%* @ !8RITELN9SEIS9%* 2 ! 8RITELN 9SIETE9%* ! 8RITELN96C&69%*
. ! 8RITELN9N7EVE9%* ELSE 8RITELN9EL N7MER6 N6 ES ENTRE - : .9%* EN)* B)EL CASE REA)DE:* EN)$
case "ace o( ': or en&;
&e oro$%; &e "ata$%; &e bronce$%; suerte "a siguiente ve,$%;
PROGRAM E?ER=@; E R; CAR num_&ia_sem:IEGER; BEGI "rcr; DRIE#$1ia &e "a semana #numero% 6 $%;
E1)
REA1F#num_&ia_sem%;
AE num_&ia_sem O ': DRIEF#$Funes$%; 8: DRIEF#$Martes$%; =: DRIEF#$Mierco"es$%; 4: DRIEF#$?ueves$%; H: DRIEF#$Ciernes$%; @: DRIEF#$aba&o$%; : DRIEF#$1omingo$%; EFE DRIEF#$o es un &ia &e "a semana$%; E1;
Manejo de la Pantalla Como en un monitor funcionando $a-o el modo texto, cada columna ! cada fila de caracteres en la pantalla est%n numerada, es posi$le controlar apectos de la pantalla tales como la posicin donde escri$e un texto, 7allar la posicion del cursor, o $orrar todo el texto de una fila) /ara lle#ar a ca$o estas tareas, la unidad Crt de Tur$o /ascal dispone de #arios procedimientos que permiten tener control so$re como se #isuali0a la informacin en la pantalla)
A continuacin se explicar%n al"unos procedimentos de mane-o de pantalla, usando como e-emplo una pantalla de => x 5? celdas, teniendo en cuenta que las columnas #an numeradas desde 3 7asta =>, partiendo de i0quierda a derec7a ! las filas desde 3 7asta 5?, partiendo de arri$a 7acia a$a-o) Procedimiento GotoXY Este procedimiento permite u$icar del cursor en una coordenada de pantalla especifica, controlando as' la posicin donde se escri$ira un texto) +a sintaxis de este procedimento es la si"uiente: GotoJK#ColumnaL
Fila%;
1onde: Columna ! Fila, como sus nom$res lo indican, representan respecti#amente el numero de la columna ! la fila, en donde se colocar% el cursor) Con el si"uiente pro"rama entender%s me-or el uso del procedimiento #oto$%, ! la diferencia entre columnas ! filas: PROGRAM so_&e_goto3.; /99 Este rograma escribirN un sa"u&o artien&o &es&e "a co"umna 80 . "a (i"a 'H 99 E crt; BEGI FRR; GOO3. #80L 'H%; DRIEF#$o"aQL Amigos &e urbo Pasca"$%;
GOO3. #'L '%; DRIEF#$E" sa"u&o aareci5 en "as coor&ena&as #80L 'H% anta""a$%; DRIE#$Pu"se EER ara sa"ir$%; REA1F; E1)
&e "a
,ara re)roducir sonidos en (ascal tienes que lla'ar a la 1unciFn sound y pasarle co'o parH'etro un n'ero el n'ero representa la nota%, pero atenciFn, despuJs de reproducir una nota 'ediante esta 1unciFn debes detenerla 'ediante el nosound, si no lo 0aces la nota se producira por un tie'po inde5nido, al#o sencillo! (ro#ra' Nota* uses crt* be#in sound-3%* nosound* end$ El pro#ra'a anterior solo producira un pitido, para que este pitido o sonido 'uy breve dure 'Hs tie'po puedes 0acer uso de la 1unciFn delay, por e/e'plo! (ro#ra' Nota* uses crt* be#in sound-3%* delay-33%* nosound* end$ A0ora el sonido se prolon#ara un poco 'Hs de tie'po, tanto co'o el 'is'o delay se lo per'ita, es decir, a 'ayor valor del delay 'Hs tie'po durara el sonido$ Con respecto a los dibu/os con caracteres, puedes colocarlos despuJs del 'is'o sound y antes del delay, asK aparecera un dibu/o por cada nota, por e/e'plo! (ro#ra' Nota* uses crt* be#in clrscr* sound-3%* "rite9+)9%*
delay<33%* clrscr* sound-<%* "rite9%9%* delay<33%* B repetir se#'ento clrscrdelay readey* end$ Esto solo es un e/e'plo, tu pro#ra'a deberKa ser un poco 'Hs elaborado con esto solo intente darte la idea, bueno su erte con tu tarea espero te sirva %
Sound, Nosound ! 1ela! Sound reproduce un sonido en cierta frecuencia de @0) Nosound termina la reproduccion 1ela! termina los milise"undos que quieres que dure el sonido (cada uno de los sonidos, es decir las notas musicales*) /rimero que nada, necesitas sa$er la frecuencia en @0 de las notas musicales) Aqui te la de-o: 7ttp:BBe$delprofesor)ula)#eBcienciasBsaD (para tu$as* 7ttp:BBes)iipedia)or"BiiBFrecuenciasD (piano* 7ttp:BBes)ansers)!a7oo)comBquestionBindD Ve pro$ando con todas 7asta que encuentras la que se adapte) +ue"o, claro sa$erte las notas de la cancion de quieres A7ora si el pro"rama: pro"ram musica uses crt const (aqui pones la frecuencia, de la lista que te pas2))) los n&meros que pon"o son demonstracin para 7acer el e-emplo* do G H?,>H re G 8,3H mi G =5,>8 fa G =8,>8 sol G J8,JJJ
la G 33> si G 35,83 #ar i, op : inte"er $e"in clrscr riteln(KSeleccione dia festi#oK* riteln(K (3*Na#idadK* riteln(K (5* /ascuaK* (aqui si"ues con los dem%s d'as festi#os* riteln(KSeleccione opcionK* readln(op* case op of $e"in 3: $e"in sound (do* dela!(?>>>* L?>>> milise"undos o sea ? se"undosM no sound Ltermina de sonarM Ldependiendo de la cancion, aqui le si"ues con las dem%s notasM end 5: Llo mismo de la opcion 3M end reade! end)
A7ora s', te de-o unas canciones de dias festi#o para que ten"as de donde 7acer el pro"rama (los asteriscos es que la nota es a"uda, en el tercer enlace que te puse #ienen las frecuencias* Noc7e de pa0 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 so$re campana fa fa fa fa mi fa so mi do so so la si$ la so la fa fa fa fa fa mi fa so mi do so so la si$ la so la fa fa la do do re do si$ re do do re do re mi fa do re do si$ la so fa la si$ la so fa do re do si$ la do do Si so do si$ la so fa Faltan cinco paK las doce 7ttp:BBfamilia!tu)comBfaltanPcincoPpaPlaD
&uente(s): 7ttp:BBe$delprofesor)ula)#eBcienciasBsaD (para tu$as* 7ttp:BBes)iipedia)or"BiiBFrecuenciasD (piano* 7ttp:BBes)ansers)!a7oo)comBquestionBindD 'en aqui t de/o un codi#o q produce sonidosen tp 2$3, es super sencillo, t pon#o uno corto y sencillo si'ple'ente para q veas y ten#as una idea d co'o producir sonidos$
pro#ra' sonido* uses crt* var sonido!"ord* be#in CLRSCR* sound <3%* delay <333%* nosound* delay ?333%* sound -<%* delay ?333%* nosound* delay <333%* end$