UNIVERSIDAD NACIONAL EXPERIMENTAL DE GUAYANA

MATERIA: PROGRAMACIÓN I

PROF. ENNIS URBAEZ

 

ESTRUCTURAS REPETITIVAS Y TIPOS DE DATOS DEFINIDOS POR EL USUARIO .

 

ESTRUCTURAS REPETITIVAS

 

WHILE-DO

 

La estructura repetitiva while(mientras) es aquella en la que el número de iteraciones no se conoce por anticipado y el cuerpo del bucle se ejecuta repetidamente mientras que una condición sea verdadera .

Su formato es :

 while <condición> do
 begin
  <instrucciones>;
 end; 

y su diagrama :

Reglas de funcionamiento :

  1. La condición se evalúa antes y después de cada ejecución del bucle. Si la condición es verdadera, se ejecuta el bucle, y si es falsa, el control pasa a la sentencia siguiente al bucle.
  2. Si la condición se evalúa a falso cuando se ejecuta el bucle por primera vez, el cuerpo del bucle no se ejecutará nunca.
  3. Mientras la condición sea verdadera el bucle se ejecutará. Esto significa que el bucle se ejecutará indefinidamente a menos que "algo" en el interior del bucle modifique la condición haciendo que su valor pase a falso. Si la expresión nunca cambia de valor, entonces el bucle no termina nunca y se denomina bucle infinito lo cual no es deseable.

 

ejemplos:

Program Ej_While;
Uses Crt;
 {El siguiente programa captura una cadena,
 hasta que se presione la tecla Esc(escape),
 cuyo ordinal es el #27.}
Const
  Esc = #27;
Var
  nombre : string[30];
  tecla  : char;
  cont   : word;
begin
  ClrScr;
  cont:=1;
  While (tecla<>Esc) do
    begin
      Write(cont,' Nombre : ');
      ReadLn(nombre);
      inc(cont);
      tecla:=ReadKey
    end
end.

 

REPEAT-UNTIL

La acción de repeat-until es repetir una serie de instrucciones hasta que se cumpla una determinada condición .

Su formato es :

 repeat
  <instrucción.1> ;
  <instrucción.2> ;
  ..................
  .................. 
  <instrucción.N> ;
 until <condición>;

Aquí las palabras repeat y until sirven también como delimitadores de bloque.

Su diagrama de flujo es :

Reglas de funcionamiento:

  1. La condición se evalúa al final del bucle, después de ejecutarse todas las sentencias.
  2. Si la condición es falsa, se vuelve a repetir el bucle y se ejecutan todas sus instrucciones.
  3. Si la condición es falsa, se sale del bucle y se ejecuta la siguiente instrucción a until.
  4. La sintaxis no requiere begin y end.

Analícense los diagramas de while-do y repeat-until, para comprender las diferencias entre ambas formas.

Ejemplo:

Program Ej_Repeat;
Uses Crt;
 {El siguiente programa captura una cadena,
  hasta que se presione la tecla Esc(escape), 
  cuyo ordinal es el #27.}
Const
  Esc = #27;
Var
  nombre: string[30];
  tecla : char;
  cont  : word;
begin
  ClrScr;
  cont:=1;
  Repeat
    Write(cont,' Nombre : ');
    ReadLn(nombre);
    inc(cont);
    tecla:=ReadKey
  Until (tecla=Esc)
end.

 

FOR-TO-DO

Cuando se sabe de antemano el número de veces que deberá ejecutarse un ciclo determinado, ésta es la forma más conveniente.

El formato para for-to-do es :

for <contador>:=<expresión.1> to <expresión.2> do
  begin
    <instrucciones> ;
  end;

 

Al ejecutarse la sentencia for la primera vez, a contador se le asigna un valor inicial(expresion.1), y a continuación se ejecutan las intrucciones del interior del bucle, enseguida se verifica si el valor final (expresión.2) es mayor que el valor inicial (expresión.1); en caso de no ser así se incrementa contador en uno y se vuelven a ejecutar las instrucciones, hasta que el contador sea mayor que el valor final, en cuyo momento se termina el bucle.

Aquí, contador no puede ser de tipo real.

Ejemplo:

Program Ej_For;
Uses Crt;
 {El siguiente programa despliega en pantalla el
  numero de veces que se ejecuta las instrucciones
  contenidas en el bucle for}
Var
  Valor_final,contador : integer;
Begin
  ClrScr;
  Write('Escribe el número de iteraciones : ');
  ReadLn(valor_final);
  for contador:=1 to valor_final do
   WriteLn('Iteración : ',contador);
  ReadKey
end.

El contador se puede decrementar sustituyendo la palabra to por la palabra downto.

Formato:

for <contador>:=<expresión.1> downto <expresión.2> do
  begin
    <instrucciones> ;
  end;

Ejemplo:

Program Ej_Downto;
Uses Crt;
 {El siguiente programa despliega en pantalla el
  numero de veces que se ejecuta las instrucciones
  contenidas en el bucle for}
Var
  Valor_final,contador : integer;
Begin
  ClrScr;
  Write('Escribe el número de iteraciones : '); 
  ReadLn(valor_final);
  for contador:=valor_final downto 1 do
   WriteLn('Iteración : ',contador);
  ReadKey
end.

 

TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR

 

Hasta aquí, hemos considerado los tipos simples estándar integer, real, boolean, char y byte proporcionados por Turbo Pascal.

Estos tipos de datos pueden ser utilizados para declarar variables numéricas, de caracteres y/o lógicas. Sin embargo, es posible que ninguno de ellos satisfaga los requerimientos de un determinado problema, haciéndose necesaria la utilización de otros tipos como:

TIPO SUBRANGO

El tipo de dato más simple que se puede definir en un programa Pascal es el tipo subrango o intervalo. Estos tipos son útiles, sobre todo por la facilidad que ofrecen para verificar automáticamente errores. Un tipo subrango se define de un tipo ordinal, especificando dos constantes de ese tipo, que actúan como límite inferior y superior del conjunto de datos de ese tipo. Un tipo subrango es un tipo ordinal y sus valores se ordenan de igual modo que en el tipo patrón de que se deducen.

Ejemplos:

1. 0..9 
este tipo subrango consta de los elementos
0,1,2,3,4,5,6,7,8,9 
2. '0'..'9'
este subrango consta de los caracteres 
'0' a '9'
3. 'A'..'F'
este subrango consta de los caracteres 
'A' a 'F' 

Se pueden crear variables cuyos valores se restrinjan a un subrango dado. Las declaraciones de tipo subrango se sitúan entre las declaraciones de constantes y de variables.

Formato:

type
  Nombre = límite inferior .. límite superior

Ejemplos:

Program Positivos;
Uses Crt;
  {El siguiente programa realiza una validación 
   para que sólo se acepten valores positivos
   entre 0 y 32767 por medio de un tipo subrango}
Type
  NumPositivo = 0..MaxInt;
Var
  numero : NumPositivo;
Begin
  ClrScr;
  {numero:=-1; (está instrucción provocaría un error}
  Write('Escribe un número entero positivo : ');
  ReadLn(numero);
  ReadKey
end.

Nota: Puesto que Turbo Pascal no siempre produce un error cuando el valor de un tipo subrango está fuera de su rango definido. Sin embargo se puede tener la posibilidad de visualizar dichos errores mediante la directiva de compilador:

Por default esta desactivada. Sólo se debe usar durante la fase de depuración.

 

TIPOS ENUMERADOS

En estos tipos de datos simples, se listan los identificadores que serán asociados con cada valor a utilizar.

Por ejemplo :

Type 
 dias_semana    =(lunes,martes,miercoles,jueves,
                  viernes,sabado,domingo);
 colores_baraja =(espada,oro,basto,copa);

De igual forma las variables pueden ser de tipo enumerado:

Var
   dias     : dias_semana;
   baraja : colores_baraja;

Formato:

Type 
 nombre = (constante1,constante2,...,constanteN)

Los datos de tipo colores_baraja sólo podrán tomar los valores denotados por : espada, oro, basto, copa . La posición de cada valor en la lista define su orden, por lo que para el tipo dias_semana tenemos que :

domingo > viernes   da como resultado true 
sabado  < martes    da como resultado false 
jueves <> miercoles da como resultado true

Características:

  • Un tipo de dato enumerado es un tipo ordinal cuyo orden se indica por la disposición de los valores en la definición.
  • El número de orden de cada elemento comienza en 0 para el primer elemento.
  • Las variables de tipo enumerado sólo pueden tomar valores de estos tipos.
  • Los únicos operadores que pueden acompañar a los tipos ordinales son los operadores de relación y asignación.

A los valores de los tipos enumerados se les pueden aplicar las funciones estándar succ (de sucesor), pred (de predecesor) y ord (de ordinal).

En el caso del valor máximo de un tipo enumerado, succ no está definido, y, para su valor mínimo, no está definido pred.

La función estándar ord es aplicable a los argumentos que sean valores de tipo enumerado. La relación biunívoca se da entre los valores del tipo y los enteros comprendidos entre 0 y N-1, donde N es la cardinalidad del tipo enumerado.

El tipo estándar boolean es equivalente a un tipo enumerado de la forma :

boolean = ( false, true); 

Aplicación de las funciones Ord, Pred, Succ

Argumento(x)

Tipos de datos

Ord(x)

Pred(x)

Succ(x)

lunes

dias_semana

0

Indefinido

martes

oro

colores_baraja

1

espada

basto

22

Integer

22

21

23

0

Integer

0

-1

1

-20

Integer

-20

-21

-19

MaxInt

Integer

MaxInt

MaxInt-1

Indefinido

false

Lógico

0

Indefinido

true

Ejemplo:

Program Dias_Semana;
Uses Crt;
  {El siguiete programa muestra los dias de
   la semana por medio de tipos enumerados}
Type
  Dia_Semana = (Lunes,Martes,Miercoles,Jueves,
                Viernes,Sabado,Domingo);
Var
  dias :Dia_Semana;
  i    :byte;
Begin
  ClrScr;
  dias:=lunes;
  for i:=1 to 7 do
  begin
    case dias of
        Lunes     :WriteLn('Lunes    ');
        Martes    :WriteLn('Martes   ');
        Miercoles :WriteLn('Miercoles');
        Jueves    :WriteLn('Jueves   ');
        Viernes   :WriteLn('Viernes  ');
        Sabado    :WriteLn('Sabado   ');
        Domingo   :WriteLn('Domingo  ')
    end;
    dias:=succ(dias)
  end;
  ReadKey
end.

 

Conjuntos (sets)

Un conjunto es una colección de objetos relacionados. Cada objeto en un conjunto es llamado miembro o elemento del conjunto.

Aunque en matemáticas no hay restricciones para que los objetos puedan ser elementos de un conjunto, Pascal sólo ofrece una forma restringida de conjuntos, por lo que :

  1. Los elementos de un conjunto deben ser del mismo tipo, llamado el tipo base.
  2. El tipo base debe ser un tipo simple, excepto el tipo real.

Representación de conjuntos:

Elementos

Notación Matemática

Pascal

1,2,3,4,5

{1,2,3,4,5}

[1,2,3,4,5]

a,b,c

{a,b,c}

['a','b','c']

Aunque se puede utilizar notación de tipo subrango para especificar secuencia de valores que pertenezcan a un conjunto, los elementos del conjunto no tienen una ordenación interna particular. La única relación entre los miembros de un conjunto es: existe o no existe en el conjunto.

[5,5] y [5] son equivalentes (contienen un sólo elemento)

Ejemplos de conjuntos:

[1,3,5]

conjunto de tres enteros

[1..3,8..10]

conjunto de seis enteros [1,2,3,8,9,10]

[ ]

conjunto vacío (ningún elemento)

['a','b','A'..'D']

conjunto de seis elementos ['a','b','A','B','C','D']

Un conjunto especial, denominado conjunto vacío, es aquel que no contiene ningún elemento.

El formato para la definición de un tipo conjunto es :

type
  <identificador> = set of <tipo_base> 

Ejemplos :

Type
  dias_mes   = set of 0..31;
  mayusculas = set of 'A'..'Z'; 
  caracteres = set of char; 
  equipos    = (Chivas,Santos,Pumas,
                Toluca,Tigres,America,
                Leon);
  futbol     = set of equipos;
Var
  GrupoA,GrupoB : futbol;

En Turbo Pascal, el máximo número de elementos permitidos en un conjunto es 256, y los valores ordinales del tipo base deben estar en el rango de 0 a 255 .

 

Asignación en conjuntos

Los elementos se ponen en los conjuntos utilizando una sentencia de asignación.

        GrupoA := [Chivas,Santos,Toluca];
        GrupoB := [Tigres..Leon];

Si dos tipos de conjuntos son compatibles (tienen los tipos de base compatibles: igual tipo de dato, o uno subrango de otro, o ambos del mismo tipo patrón), sus variables representativas se pueden utilizar en sentencias de asignación.

  GrupoA := GrupoB;
  GrupoB := [];{asignación del conjunto vacío}

 

La relación In

El operador relacional In y una expresión relacional nos permite conocer si un elemento dado pertenece a un conjunto dado.

Formato:

elemento in [ lista de elementos ]

El resultado de evaluar la expresión relacional puede ser true o false. El tipo de datos de elemento y la lista de elementos deben ser compatibles.

Ejemplo:

Program Hasta_Si;
 {El siguiente programa obtiene del teclado un nombre
  hasta que se presiona la tecla 's' o 'S' o Esc}
Uses Crt;
Const
  Esc  =#27;
Var
  nombre : string[30];
  tecla  : char;
begin
  Repeat
    ClrScr;
    Write('Escribe tu nombre : ');
    ReadLn(nombre);
    Write('Desea Salir S/N ? : ');
    Tecla:=Readkey
  Until tecla in['s','S',Esc];
  ClrScr
end.
 

Operaciones con conjuntos

Una vez creados los conjuntos y las variables tipo conjunto es posible realizar tres operaciones binarias sobre ellos: unión, intersección y diferencia. La siguiente tabla resume el funcionamiento de las operaciones con conjuntos A y B.

Operaciones sobre dos conjuntos A y B

Operación

Notación
Pascal

Conjunto resultante

Unión

+

A+B es el conjunto que contiene todos los elementos que están en A, en B o en ambos.

Intersección

*

A*B es el conjunto cuyos elementos pertenecen a A y B simultáneamente.

Diferencia

-

A-B es el conjunto cuyos elementos son de A pero no de B.

Ejemplo:

Operación

Resultado

[1,3,4,5]+[1,2,4]

[1,2,3,4,5]

[1,3,4,5]*[1,2,4]

[1,4]

[1,3,4,5]-[1,2,4]

[3,5]

[1,2,3]+[ ]

[1,2,3]

[1,2,4]*[3,5,6]

[ ]

[1,2,3]-[ ]

[ ]

Reglas de prioridad

Cuando una expresión de conjuntos contiene dos o más operadores de conjunto, éstos se evalúan de acuerdo a la siguiente prioridad:

*

Prioridad más alta

+,-

Prioridad más baja

En caso de operaciones con igual prioridad se evalúan de izquierda a derecha.

 

Comparación de conjuntos (operadores de relación)

Los conjuntos se pueden comparar entre sí mediante el uso de los operadores relacionales (==, <>,<=,>=). Los operandos deben ser del mismo tipo base. El resultado de la comparación es un valor lógico: true o false.

Operadores de relación de conjuntos A y B

Operador

Nombre del operador

Resultado

< =

Subconjunto

El valor de A< = B es true. Si cada elemento de A es también de B. En caso contrario es false.

=

Igualdad

El valor de A = B es true si cada elemento de A está en B y cada elemento de B está en A. En caso contrario A = B es falso, A=B equivale a (A<=B) and (B<=A).

< >

Desigualdad

El valor de A < > B es true si el valor de A = B es false y viceversa.

> =

Superconjunto

A < > B equivale a not (A = B), A >= B es true si B<=A es true.

 

Ejemplos :

Comparación

Resultado

[3,5] = [3,5]

true

[ ] = [1]

false

[ ] <= [1,5]

true

[1,2] >= [1,2,3,4]

false

[ ] >= [1,2]

false

[1,4,5] = [4,5,1]

true

Prioridad de operadores :

Operador

Prioridad

not

1 (más alta)

*,/,div,mod,and

2

+,-,or

3

=,<>,<,<=,>,>=,in

4 (más baja)

 

Lectura de conjuntos

Algunas operaciones no se pueden ejecutar sobre variables de conjunto. Por ejemplo, no se puede leer cinco ciudades en un conjunto Mundo con la siguiente sentencia:

ReadLn(Mundo)

La razón es que la computadora no puede saber cuantos elementos existen en el conjunto.

Si se desea leer y almacenar datos en un conjunto se debe utilizar un bucle.

for elemento:=1 to 5 do
  begin
    {leer un dato}               
    {almacenar el valor en el
     siguiente elemento del conjunto}
  end;

 

Reglas :

  1. Inicializar A al conjunto vacío.
    A := [ ];
  2. Leer cada elemento x del conjunto y añadirlo al conjunto A con la operación unión (+)
    ReadLn(x);
    A := A + [x];

 

Escritura de conjuntos

Los valores de conjuntos no se pueden visualizar con la sentencia Write.

Para visualizar los elementos de un conjunto A se debe utilizar el siguiente algoritmo:

1.      Copiar los elementos de A en un conjunto auxiliar Aux que tenga un tipo base compatible con el de A.

2.      Declarar x una variable del tipo base de Aux e inicializar x al primer elemento de esté tipo base.

3.      Mientras x es diferente del último elemento de esté tipo base y Aux no está vacía, hacer :

I. Si x pertenece a Aux, entonces visualizar x y eliminarlo de Aux
II. Sustituir x con su sucesor.

 

Ejemplo:

Program Impares;
 {El siguiente programa encuentra y muestra todos los
  números impares menores o igual a un número dado n
  que esté entre el límite 1..255}
Uses Crt;
Type
  numeros = set of 1..255;
Var
  impares,Aux :numeros;
  x,MaxNum,i  :byte;
begin
  ClrScr;
  Write('Escribe un número entero : ');
  ReadLn(MaxNum);
  impares:=[];   {inicializa a conjunto vacío}
  for i:=1 to MaxNum do
   begin
     if odd(i) then
       impares:=impares + [i]
  {añadir elementos al conjunto}
   end;
  {visualizar elementos del conjunto}
  Aux:=impares;
  x:=1;
  while (x<>MaxNum+1) and (Aux<>[]) do
    begin
      if x in Aux then
        begin
          WriteLn(x);
          Aux:=Aux-[x]
        end;
      x:=succ(x)
    end;
  ReadKey;
  ClrScr
end

 

 

TOMADO DE : http://www.itlp.edu.mx/publica/tutoriales/pascal/