Вы находитесь на странице: 1из 8

INTRODUCCIN A PROGRAMACIN PRCTICA 7 OBJETIVOS

Introducir los tipos de datos enumerado y subrango Introducir la composicin iterativa for de Pascal, equivalente a la composicin RECORRIENDO de la notacin. Presentar la forma de definir en Pascal el tipo de datos TABLA de la notacin. Utilizar los conceptos estudiados para realizar prcticas con tablas.

Tipo Enumerado

Los tipos enumerados son tipos definidos por el usuario, se denominan enumerados porque se definen listando las constantes que forman el tipo, es decir: su dominio es especificado como una lista de literales y se considera ordenado seg n la posicin que ocupa cada literal en la lista, por lo que se trata de un tipo escalar y ordinal. Las nicas operaciones permitidas con valores enumerados son la asignacin, las operaciones de comparacin, y las operaciones sucesor y predecesor propias de un tipo ordinal. !l formato de una declaracin es:
Nombre_tipo = (lista de literales);

Type meses = (enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre); colores = (rojo, verde, azul); figuras = (rectangulo, cuadrado, elipse, circulo); var circulo1, cuadrado2 : figuras; mes : meses;

La finalidad de este tipo es favorecer la legibilidad de los programas. Pensemos que si este tipo no es proporcionado por un determinado lengua"e, el programador se ver obligado a sustituir el con"unto de literales por un intervalo de n meros enteros, lo que oscurece el programa. !l siguiente cdigo ilustra la e#presividad de este nuevo tipo.
mes : meses; Begin ..... mes := enero; ..... if (mes = julio) or (mes = diciembre) then paga := paga * 2;

Tipos Subrango

$lgunas veces no se necesita un nuevo tipo de datos, sino slo una parte de un tipo ya e#istente. Pascal, y la mayor%a de los legua"es, nos permiten definir un tipo de datos que es un rango especificado de un tipo ordinal. Por e"emplo, en alguno de los problemas de los guiones anteriores, la variable Nota no deber%a tomar valores fuera del rango &..'&. Para ello (ar%amos la siguiente declaracin:
Type Notas = 0..10; {Dominio de valores: 0,1,2,3,4,5,6,7,8,9,10}

var

nota: notas;

!l subrango puede ser tanto de un tipo primitivo, como de un tipo definido por el usuario, siempre que sea un tipo ordinal.
Type meses = (enero, febrero, marzo, abril, mayo, junio, julio, agosto, septiembre, octubre, noviembre, diciembre); Minuscula = 'a'..'z'; Verano = junio..septiembre;

Composicin for en Pascal

La estructura iterativa de Pascal equivalente a la composicin RECORRIENDO estudiada en clase de teor%a es la composicin for. $ continuacin se muestran las equivalencias entre las dos variantes de esta composicin: )otacin
i RECORRIENDO [a, b] HACER S; FIN_RECORRIENDO i RECORRIENDO [a, b] EN SENTIDO INVERSO HACER S; FIN_RECORRIENDO

Pascal
for i := a to b do

S;
for i := b downto a do

S;

Las reglas de la instruccin for son similares a las empleadas en seudocodigo para la instruccin recorriendo. La variable de control, i, el valor inicial, a, y el valor final, b, deben ser del mismo tipo, que ser de un tipo ordinal, ya que la variable i se incrementa o decrementa, en una unidad, de forma automtica. La variable de control, variable i, debe estar declarada en el mbito donde es utilizada. Las instrucciones del cuerpo del bucle pueden utilizar el valor de la variable de control, pero no pueden modificar este valor *uando se completa la e"ecucin de la instruccin for, la variable de control queda indefinida. )o debe suponerse la reevaluacin de los l%mites inferior y superior de la iteracin, caso de ser e#presiones en las que intervengan variables. +e (ec(o, conviene que no var%en.

Ejemplo: !"ecute los siguientes programas, y aseg rese que comprende el funcionamiento de la instruccin for.
Program entero; Var i : integer; linf, lsup : integer; Begin for i := 1 to 10 do writeln (i); for i:= 1 to 10 do writeln ('1'); writeln ('Inroduzca el lmite inferior y limite superior'); readln (linf, lsup); for i:= linf-3 to lsup*2 do writeln (i) end.

Program anidado; Var i : char; j : integer; Begin for j := 1 to 10 do for i := 'a' to 'z' do writeln (j, i) end.

Tablas en Pascal

Los tipos de dato tabla vistos en la notacin algor%tmica se declaran en Pascal utilizando la palabra reservada array. $ continuacin se muestra la equivalencia entre una declaracin de tipo tabla unidimensional en la notacin algor%tmica y en Pascal: Notacin Pascal nombre_tipo = TIPO TABLA [a, b] DE Tipo_Base; nombre_tipo = array [a..b] of Tipo_Base;

!l acceso a los elementos de una variable de tipo tabla se (ace mediante el uso de corc(etes. Por e"emplo, si t fuese una variable de tipo nombre_tipo, acceder%amos a sus elementos mediante e#presiones tales como t[i], t[k+j], etc,tera, suponiendo, claro, que las e#presiones anteriores fuesen del tipo ordinal correspondiente a la declaracin del tipo tabla y que sus valores estuviesen en el intervalo adecuado -que es .a, b/ en este caso0.

$ continuacin se muestra un e"emplo que implementa en Pascal el algoritmo 1.1 del libro de te#to:
Program Algoritmo6_6; uses crt; const LMAX = 100; type Rango = 1..LMAX; Vector = array [Rango] of Real; var a, b : Vector; producto : Real; long : Rango; i : Rango; procedure Leer_Vector (var a : Vector; n : Rango); var i : Rango; begin for i := 1 to n do begin write ('Introduzca el componente ', i, ': '); readln (a[i]) end end; begin clrscr; writeln; writeln ('*** Algoritmo 6.6. Producto escalar de dos vectores ***'); writeln; write ('Introduzca la longitud de los vectores: '); readln (long); writeln; writeln ('Vector 1: '); Leer_Vector (a, long); writeln; writeln ('Vector 2: '); Leer_Vector (b, long); producto := 0.0; for i := 1 to long do producto := producto + a[i] * b[i]; (* INV producto = a[1]* b[1] + a[2]* b[2] + .. a[i] * b[i] *) writeln; writeln ('El producto escalar es: ', producto:1:2); writeln; write ('Pulse enter para terminar'); readln end.

Problema 1: +ada una tabla de enteros t definida sobre el intervalo .'..n/ con n2&, escriba un algoritmo que realice el desplazamiento circular a la derec(a de t. 3ean t y t' los valores inicial y final respectivamente de la tabla t -es decir, los valores de t antes y despu,s de realizar la accin de desplazamiento0. !l desplazamiento se caracteriza por el predicado: t'' 4 tn, t'5 4 t56', para todo 5 .7..n/.

3e muestra una primera solucin en la cual el problema se descompone en dos etapas: primero se crea una tabla intermedia z en la que se colocan los elementos seg n su posicin final, y posteriormente se copia la tabla z sobre la tabla t. !scriba una segunda solucin sin recurrir a una tabla intermedia. 89u, tipo de esquema iterativo se est utilizando: Identifique el tratamiento inicial, la condicin de terminacin y el tratamiento que se realiza a cada elemento. 89u, diferencias e#isten entre el tratamiento de una secuencia representada en una mquina secuencial, y en una tabla:
Program problema_1_con_tabla_z; const N = 10; type vector = array [1 .. N] of Integer; var i : integer; {declaracin e inicializacin de un vector t} t : vector = ( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ); z : vector; begin { rotacin en la tabla 'z' } z[1] := t[N]; for i := 2 to N do z[i] := t[i-1]; { copia a la tabla 't' } for i := 1 to N do t[i] := z[i]; {escribir el resultado } for i := 1 to N do write (t[i], ', ') end.

Problema 2: +ado un te#to formado por letras min sculas y espacios en blanco, representado en una secuencia de caracteres del segundo modelo, escriba un algoritmo que obtenga la frecuencia de aparicin de cada letra del alfabeto en el te#to. ;ecuerde que el %ndice de una tabla puede ser cualquier tipo ordinal y la caracter%stica de las tablas de acceso inde#ado.

89u, esquema iterativo es el ms adecuado: 8*ul es el tratamiento de cada elemento:

!l algoritmo debe mostrar: la cantidad total de apariciones de cada letra que aparezca al menos una vez -las que no aparezcan no deben mostrarse en el resultado final0 "unto con la frecuencia relativa de aparicin con respecto a todas las letras min sculas, en tanto por cierto. +ise<e el algoritmo en la notacin de clase de teor%a y transcr%balo despu,s a Pascal.

Trabajo Personal

Problema : 3ea una funcin que implementa una funcin matemtica f-x0 de una variable con dominio y rango definidos en los reales, continua en el intervalo .a, b/.
L!"ICO ## $ierta %&n$i'n (e &n par)metro rea* +&e (e,&e*,e &n ,a*or rea* : funcin -. : Rea*/ Rea* ;

+e esta funcin no conocemos detalles, tan slo podemos llamarla para que nos devuelva el valor de f-x0 para cualquier valor de x en el mencionado intervalo. $ partir de esta funcin deseamos: a0 !scriba una funcin cuya cabecera es la siguiente:
Trape0oi(es : funcin -a, b : Rea*; n : entero/ Rea* ;

que calcule una apro#imacin a la integral de la funcin matemtica que implementa la funcin anterior en el intervalo .a, b/, mediante la suma de las reas de los n trapecios de igual base que define la funcin en dic(o intervalo. La siguiente figura muestra como zonas sombreadas las reas que esta funcin debe calcular, supuesto que el grfico mostrado representa la funcin , para un intervalo .a, b/ fi"o y tres valores distintos de n:

n=1

n=2

n=3

b0 !scriba, utilizando la funcin anterior, un programa que calcule una apro#imacin a integral de la funcin =, el usuario decidir el n mero de trapecios, n, en que el que se divide el intervalo .a, b/. Pruebe el programa con una funcin sencilla, por e"emplo: f-#0 4 7#, f-#0 4 # > 7, f-#0 4 ?#7 >@. Problema !: !scriba un programa que cuente todas las apariciones de letras dobles -dos letras seguidas iguales0, que (aya en una l%nea de te#to. 3e supone que una l%nea no tiene ms de oc(enta caracteres. Problema ": !scriba un programa, similar al anterior, pero a(ora lo que debe detectar son palabras dobles seguidas, anlogo al corrector automtico de Aord. La l%nea de te#to no contendr mas que letras y blancos, y las palabras no sern mas largas de diez letras. *ada vez que se detecte una palabra repetida, se preguntar al usuario si desea eliminarla, si es as% se eliminar. 3e recomienda la utilizacin de una accin que vaya obteniendo las palabras de la l%nea de te#to, y otra que actualice la l%nea en caso necesario. !l programa mostrar la l%nea una vez procesada.

#ne$o% El &ipo de da&o String


!n programacin es muy frecuente mane"ar tablas de caracteres para representar secuencias de caracteres, com nmente denominadas strings, o hileras o cadenas de caracteres. Borland Pascal y =reePascal introducen el tipo strin4 para representar cadenas. !ste tipo corresponde a una tabla de caracteres -un array de caracteres0 e incluye un con"unto de operaciones muy tiles que nos (acen ms fcil su mane"o. Para declararlo, se utiliza la palabra reservada strin4 seguida de la longitud m#ima que podrn tener las variables de ese tipo, encerrada entre corc(etes. Por e"emplo, la declaracin:
type linea = string [80];

establece que los valores de las variables de tipo *inea podrn ser cadenas de como m#imo C& caracteres. !sta declaracin determina la longitud m#ima de las cadenas de tipo *5nea. 3i en la definicin del tipo cadena no se especifica la longitud m#ima, se toma como valor por defecto 7DD, que es la longitud m#ima que puede tener una cadena de tipo string. !l dominio de este tipo est formado por todas las posibles secuencias de caracteres con longitud menor o igual a n, & n 7DD. Los procedimientos para lectura y escritura -6rite y Rea(0 pueden tener como argumentos variables de tipo strin4. !n la e"ecucin del siguiente cdigo -ba"o el sistema operativo AindoEs0, al introducir desde el teclado una cadena, ,sta ser visualizada por la operacin 6riteLn. 3i la (ilera tiene ms de 7& caracteres, slo los veinte primeros sern asignados a la variable s y, por tanto, sern los nicos visualizados.
var begin end. s : string [20]; ReadLn (s); WriteLn (s)

Las cadenas de tipo string, poseen las operaciones propias de los arrays: asignacin y comparacin con los operadores = y , 789 !ntre cadenas, e#iste una relacin de orden por lo que es posible aplicar los operadores 7, 8, 7=, y 8=9 $s% mismo, como indicamos al principio, disponen de una
serie de funciones y acciones predefinidas.

$ continuacin se relacionan las operaciones del tipo string (e &so m)s %re$&ente:
Concat (st1, st2, ...,stn : string) : string +evuelve como resultado la cadena obtenida al concatenar todas las (ileras definidas en la lista de parmetros. !l operador : tambi,n se puede usar para concatenar cadenas. !ste es un e"emplo de operador polimrfico, ya que puede tener diferentes efectos, dependiendo del tipo de sus operandos. Copy (st : string; posi, num : integer) : string +evuelve la subcadena de st formada por num caracteres a partir de la posicin posi. Delete (var st : string; posi, num : integer) !limina en la cadena st, num caracteres a partir de la posicin posi. Insert (st2, st1 : string; posi : integer) Inserta la cadena st2 en la (ilera st1 a partir de la posicin posi.

Length (st : string; posi) : integer +evuelve la longitud de st . Pos (st2, st1 : string) : byte 3i st2 es una subcadena de st1, devuelve la posicin a partir de la cual se encuentra, si no devuelve &. Str (val : numero; var st : string) Fnumero se refiere a cualquier tipo num,rico de PascalG *onvierte el valor del parmetro num,rico val en una cadena y lo asigna a st. Val (st : string; var val : numero; var error : integer) Fnumero se refiere a cualquier tipo num,rico de PascalG *onvierte la cadena st en un valor num,rico y lo asigna a la variable val. La cadena debe estar formada por una constante num,rica. $signa a error la posicin del primer carcter de la (ilera que no es de los permitidos.

Ejemplo: !l siguiente procedimiento transforma en may sculas todos los caracteres en min scula de la variable de tipo String que recibe como parmetro:
Program Cadena; Var a : string; procedure A_Mayusculas (var s : String); const dist = ord ('A') ord ('a'); var i : integer; begin for i := 1 to length(s) do if (s[i] >='a') and (s[i]<='z') then s[i] := chr (ord (s[i]) + DIST); end;

Begin Readln (a); A_mayusculas (a); Writeln (a); Readln End.

Вам также может понравиться