Tutorial de Lógica Computacional y Programación

116
Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez TUTORIAL DE LÓGICA COMPUTACIONAL Y PROGRAMACIÓNUNIDAD I. LÓGICA COMPUTACIONAL. 1. Conceptos generales. Lenguajes de programación: Permiten escribir programas. Algunos son comprensibles de forma directa por la computadora. Otros requieren pasos intermedios de traducción para ser comprendidos por la computadora. Clasificación: Lenguaje de máquina Lenguaje de bajo nivel o ensamblador Lenguaje de alto nivel Lenguaje Máquina. Lenguaje básico, propio de cada computadora, ya que está relacionado con el diseño del hardware de la misma (dependiente de la máquina). Por lo general consisten en cadenas de números al final reducidos ceros y unos (sistema numérico binario). Lenguaje Ensamblador. Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nemotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son: en inglés: ADD, SUB, DIV, etc.; en español: SUM, RES, DIV, etc. Una instrucción típica de suma sería: ADD M, N, P 1

Transcript of Tutorial de Lógica Computacional y Programación

Page 1: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

TUTORIAL DE LÓGICA COMPUTACIONAL Y PROGRAMACIÓN.

UNIDAD I. LÓGICA COMPUTACIONAL.

1. Conceptos generales.

Lenguajes de programación: Permiten escribir programas. Algunos son comprensibles de forma directa por la computadora. Otros requieren pasos intermedios de traducción para ser comprendidos por la computadora.

Clasificación:Lenguaje de máquinaLenguaje de bajo nivel o ensambladorLenguaje de alto nivel

Lenguaje Máquina.Lenguaje básico, propio de cada computadora, ya que está relacionado con el diseño del hardware de la misma (dependiente de la máquina). Por lo general consisten en cadenas de números al final reducidos ceros y unos (sistema numérico binario).

Lenguaje Ensamblador.

Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nemotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son: en inglés: ADD, SUB, DIV, etc.; en español: SUM, RES, DIV, etc.

 Una instrucción típica de suma sería:

ADD M, N, P

         Esta instrucción significa "sumar el contenido en la posición de memoria M al número almacenado en la posición de memoria N y situar el resultado en la posición de memoria P”. Evidentemente es más sencillo recordar la instrucción anterior con un nemotécnico que su equivalente en código máquina.

0110 1001 1010 1011

        Un programa escrito en lenguaje ensamblador, requiere de una fase de traducción al lenguaje máquina para poder ser ejecutado directamente por la computadora.

        El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje máquina se conoce como programa objeto, el cual ya es directamente entendible por la computadora.

1

Page 2: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Consiste en abreviaturas similares al inglés, llamadas instrucciones mnemotécnicas, que permiten representar las operaciones elementales de la computadora (dependiente de la máquina).Lenguaje de Alto Nivel.

        Estos lenguajes son los más utilizados por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y ensambladores. Un programa escrito en lenguaje de alto nivel es independiente de la máquina (las instrucciones no dependen del diseño del hardware o de una computadora en particular), por lo que estos programas son portables o transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificación en diferentes tipos de computadorasPermite a los programadores escribir instrucciones en un lenguaje más familiar para ellos y que contiene notaciones matemáticas comúnmente utilizadas (independiente de la máquina).

Ejemplos de lenguajes de alto nivel por orden de aparición:

- FORTRAN - C- ALGOL - Turbo C- COBOL - Turbo Basic- BASIC - Turbo Pascal- PL/I - C++- PROLOG - Visual C, C++, etc.- LISP - Java- SMALLTALK- PASCAL- ADA

1.1 Diagrama de Entrada-Proceso-Salida (E-P-S).

Tarjeta I/O Genérico

Proceso

Impresora

Teclado

INICIO

FIN

Archivo de Pantalla

Archivo dedatos

2

Page 3: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Fig. 1.- Diagrama de entrada-proceso-salida

1.2 Algoritmos.

Algoritmo: es un método para resolver un problema mediante una serie de pasos definidos, precisos y finitos.

Un algoritmo debe ser preciso e indicar el orden de realización de cada paso.

Un algoritmo debe ser deterministico. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.

Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea, debe tener un número finito de pasos.

Algoritmos Cotidianos.

        Se refiere a todos aquéllos algoritmos que nos ayudan a resolver problemas diarios, y que los hacemos casi sin darnos cuenta de que estamos siguiendo una metodología para resolverlos.

 Algunos ejemplos son:

   Diseñar un algoritmo para cambiar una llanta a un coche.

1. Inicio. 2. Traer gato. 3. Levantar el coche con el gato. 4. Aflojar tornillos de las llantas. 5. Sacar los tornillos de las llantas. 6. Quitar la llanta. 7. Poner la llanta de repuesto. 8. Poner los tornillos. 9. Apretar los tornillos. 10. Bajar el gato. 11. Fin

1.3 Metodologías para la construcción de programas.

Programación lineal. Programación estructurada. Programación orientada a objetos.

3

Page 4: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

2. Programación lineal.

2.1 Definición.

La programación lineal permite escribir algoritmos de una forma secuencial, es decir, cada instrucción ejecuta hasta que la anterior se haya realizado, no obstaante, podemos referenciar a una línea desde nusestra secuencia que no sea la siguiente, de tal forma que al terminar una secuencia de instrucciones podemos referenciar a la línea que continuaba en nuestra ejecución.

2.2 Diagramas de flujo.

Un Diagrama de Flujo representa la esquematización gráfica de un algoritmo , el cual muestra gráficamente los pasos o procesos a seguir para alcanzar la solución de un problema . Su correcta construcción es sumamente importante porque, a partir del mismo se escribe un programa en algún Lenguaje de Programación. Si el Diagrama de Flujo está completo y correcto, el paso del mismo a un Lenguaje de Programación es relativamente simple y directo.

Los diagramas de flujo representan la forma más tradicional para especificar los detalles algorítmicos de un proceso. Se utilizan principalmente en programación, economía y procesos industriales; estos diagramas utilizan una serie de símbolos con significados especiales. Son la representación gráfica de los pasos de un proceso, que se realiza para entender mejor al mismo. Son modelos tecnológicos utilizados para comprender los rudimentos de la programación lineal.

Simbología.

No es indispensable usar un tipo especial de símbolos para crear un diagrama de flujo, pero existen algunos ampliamente utilizados por lo que es adecuado conocerlos y utilizarlos, ampliando así las posibilidades de crear un diagrama más claro y comprensible para crear un proceso lógico y con opciones múltiples adecuadas.

Flecha. Indica el sentido y trayectoria del proceso de información o tarea.

Rectángulo. Se usa para representar un evento o proceso determinado. Éste es controlado dentro del diagrama de flujo en que se encuentra. Es el símbolo más comúnmente utilizado.

Rectángulo redondeado. Se usa para representar un evento que ocurre de forma automática y del cuál generalmente se sigue una secuencia determinada.

Rombo. Se utiliza para representar una condición. Normalmente el flujo de información entra por arriba y sale por un lado si la condición se cumple o sale por el lado opuesto si la condición no se cumple. Lo anterior hace que a partir de éste el proceso tenga dos caminos posibles.

Círculo. Representa un punto de conexión entre procesos. Se utiliza cuando es necesario dividir un diagrama de flujo en varias partes, por ejemplo por razones de espacio o simplicidad. Una referencia debe de darse dentro para distinguirlo de otros. La mayoría de las veces se utilizan números en los mismos.

Existen además una variedad de formas especiales para denotar las entradas, las salidas, los almacenamientos, etcétera.

4

Page 5: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Tabla 1. Símbolos Estándar para Diagramas de Flujo

Nombre Símbolo Función

Terminal

Representa el inicio y fin de un programa. También puede representar una parada o interrupción programada que sea necesaria realizar en un programa.

Entrada/Salida

Cualquier tipo de introducción de datos en la memoria desde los periféricos o registro de información procesada en un periférico.

Proceso

Cualquier tipo de operación que pueda originar cambio de valor, formato o posición de la información almacenada en memoria, operaciones aritméticas, de transformaciones, etc.

Decisión

Indica operaciones lógicas o de comparación entre datos (normalmente dos) y en función del resultado de la misma determina (normalmente si y no) cual de los distintos caminos alternativos del programa se debe seguir.

Conector Misma Página

Sirve para enlazar dos partes cualesquiera de un diagrama a través de un conector en la salida y otro conector en la entrada. Se refiere a la conexión en la misma pagina del diagrama

indicador de dirección o línea de flujo

Indica el sentido de la ejecución de las operaciones

Conector diferente página

Conexión entre dos puntos del organigrama situado en páginas diferentes.

ImpresoraSe utiliza en ocasiones en lugar del símbolo de salida. El dibujo representa un pedazo de hoja.

EntradaSe utiliza en ocasiones en lugar del símbolo de entrada. Originalmente representa una tarjeta perforada.

5

Page 6: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Teclado Se utiliza en ocasiones en lugar del símbolo de entrada.

Pantalla Se utiliza en ocasiones en lugar del símbolo de salida.

Un diagrama de flujo es una representación gráfica de los pasos que seguimos para realizar un proceso; partiendo de una entrada, y después de realizar una serie de acciones, llegamos a una salida.

Cada paso se apoya en el anterior y sirve de sustento al siguiente:

6

Page 7: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

7

Diagrama de flujo que encuentra el factorial de un número

Diagrama de flujo que

encuentra la suma de los

primeros 50 numeros

naturales

Page 8: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Reglas de construcción.

De acuerdo al estándar ISO, los símbolos e incluso las flechas deben de tener ciertas características para estar dentro del estándar. En el caso de los círculos de conexión se debe usar sólo cuando se conecta con un proceso contenido dentro de la misma hoja.

También existen conectores de página, que son como una casita y se utilizan para unir actividades que se encuentran en otra hoja.

Existe siempre un camino que permite llegar a una solución Existe un único inicio del proceso Existe un único punto de fin para el proceso de flujo, salvo del rombo que indica una comparación

con dos caminos posibles y ademas una gran ayuda Evite sumideros infinitos, burbujas que tienen entradas pero no salidas. Evite las burbujas de generación espontánea, que tienen salidas sin tener entradas, porque son

sumamente sospechosas y generalmente incorrectas. Tenga cuidado con los flujos y procesos no etiquetados. Esto suele ser un indicio de falta de

esmero, pero puede esconder un error aún más grave: a veces el analista no etiqueta un flujo o un proceso porque simplemente no se le ocurre algún nombre razonable.

Los Diagramas de flujo deben escribirse de arriba hacia abajo, y/o de izquierda a derecha. Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica la dirección

que fluye la información procesos, se deben de utilizar solamente líneas de flujo horizontal o verticales (nunca diagonales).

Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del diagrama a un sitio distinto, se pudiera realizar utilizando los conectores.  Se debe tener en cuenta que solo se vana utilizar conectores cuando sea estrictamente necesario.

No deben quedar líneas de flujo sin conectar Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas

palabras. Todos los símbolos pueden tener más de una línea de entrada, a excepción del símbolo final. Solo los símbolos de decisión pueden y deben tener más de una línea de flujo de salida.

2.3 Prueba de escritorio

3. Programación estructurada.

El creciente empleo de los computadores ha conducido a buscar un abaratamiento del desarrollo de software, paralelo a la reducción del costo del hardware obtenido gracias a los avances tecnológicos. Los altos costos del mantenimiento de las aplicaciones en producción normal también han urgido la necesidad de mejorar la productividad del personal de programación.

DEFINICIONES

La programación estructurada (en adelante simplemente PE ), es un estilo de programación con el cual el programador elabora programas, cuya estructura es la más clara posible, mediante el uso de tres estructuras básicas de control lógico, a saber :

8

Page 9: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

a. SECUENCIA. b. SELECCIÓN. c. ITERACIÓN.

Un programa estructurado se compone de funciones, segmentos, módulos y/o subrutinas, cada una con una sola entrada y una sola salida. Cada uno de estos módulos (aún en el mismo programa completo), se denomina programa apropiado cuando, además de estar compuesto sólamente por las tres estructuras básicas, tiene sólo una entrada y una salida y en ejecución no tiene partes por las cuales nunca pasa ni tiene ciclos infinitos.

La PE tiene un teorema estructural o teorema fundamental, el cual afirma que cualquier programa, no importa el tipo de trabajo que ejecute, puede ser elaborado utilizando únicamente las tres estructuras básicas (secuencia, selección, iteración).

DEFINICIÓN DE LAS ESTRUCTURAS BÁSICAS DE CONTROL LÓGICO

1.- SECUENCIA

Indica que las instrucciones de un programa se ejecutan una después de la otra, en el mismo orden en el cual aparecen en el programa. Se representa gráficamente como una caja después de otra, ambas con una sola entrada y una única salida.

Las cajas A y B pueden ser definidas para ejecutar desde una simple instrucción hasta un módulo o programa completo, siempre y cuando que estos también sean programas apropiados.

2.- SELECCIÓN

También conocida como la estructura SI-CIERTO-FALSO, plantea la selección entre dos alternativas con base en el resultado de la evaluación de una condición o predicado; equivale a la instrucción IF de todos los lenguajes de programación y se representa gráficamente de la siguiente manera:

9

Page 10: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

En el diagrama de flujo anterior, C es una condición que se evalúa; A es la acción que se ejecuta cuando la evaluación de este predicado resulta verdadera y B es la acción ejecutada cuando indica falso. La estructura también tiene una sola entrada y una sola salida; y las funciones A y B también pueden ser cualquier estructura básica o conjunto de estructuras.

3.- ITERACIÓN

También llamada la estructura HACER-MIENTRAS-QUE, corresponde a la ejecución repetida de una instrucción mientras que se cumple una determinada condición. El diagrama de flujo para esta estructura es el siguiente:

Aquí el bloque A se ejecuta repetidamente mientras que la condición C se cumpla o sea cierta. También tiene una sola entrada y una sola salida; igualmente A puede ser cualquier estructura básica o conjunto de estructuras.

VENTAJAS DE LA PROGRAMACIÓN ESTRUCTURADA

Con la PE, elaborar programas de computador sigue siendo una labor que demanda esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con este nuevo estilo podemos obtener las siguientes ventajas:

1. Los programas son más fáciles de entender. Un programa estructurado puede ser leído en secuencia, de arriba hacia abajo, sin necesidad de estar saltando de un sitio a otro en la lógica, lo cual es típico de otros estilos de programación. La estructura del programa es más clara puesto que las instrucciones están más ligadas o relacionadas entre si, por lo que es más fácil comprender lo que hace cada función.

2. Reducción del esfuerzo en las pruebas. El programa se puede tener listo para producción normal en un tiempo menor del tradicional; por otro lado, el seguimiento de las fallas o depuración (debugging) se facilita debido a la lógica más visible, de tal forma que los errores se pueden detectar y corregir más fácilmente.

3. Reducción de los costos de mantenimiento. 4. Programas más sencillos y más rápidos. 5. Aumento en la productividad del programador. 6. Se facilita la utilización de las otras técnicas para el mejoramiento de la productividad en

programación. 7. Los programas quedan mejor documentados internamente.

10

Page 11: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

3.1 Técnica Top-Down.

Técnica para diseñar que consiste en tomar el problema en forma.

Inicial como una cuestión global y descomponerlo sucesivamente en problemas más pequeños y por lo tanto, de solución más sencilla.

La descomposición del problema original (y de las etapas subsecuentes), puede detenerse cuando los problemas resultantes alcanzan un nivel de detalle que el programador o analista pueden implementar fácilmente.

Objetivos básicos del Top-Down

Simplificación del problema y de los subprogramas de cada descomposición.

Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas.

El programa final queda estructurado en forma de bloque o módulos lo que hace más sencilla su lectura y mantenimiento.

Ejemplo de un diseño descendente (top-down ) de un control de almacén :

Módulo. Tipos de módulo.

11

Page 12: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Proceso de modularización.

¿Qué es programación modular?

Uno de los métodos más conocidos para resolver un problema es dividirlo en problemas más pequeños, llamados subproblemas. De esta manera, en lugar de resolver una tarea compleja y tediosa, resolvemos otras más sencillas y a partir de ellas llegamos a la solución. Esta técnica se usa mucho en programación ya que programar no es más que resolver problemas, y se le suele llamar diseño descendente, metodología del divide y vencerás o programación top-down.

Es evidente que si esta metodología nos lleva a tratar con subproblemas, entonces también tengamos la necesidad de poder crear y trabajar con subprogramas para resolverlos. A estos subprogramas se les suele llamar módulos, de ahí viene el nombre de programación modular. En Pascal disponemos de dos tipos de módulos: los procedimientos y las funciones.

Diagrama de árbol.

Un diagrama de árbol es una representación gráfica de un experimento que consta de r pasos, donde cada uno de los pasos tiene un número finito de maneras de ser llevado a cabo. Ejemplos:1. Un médico general clasifica a sus pacientes de acuerdo a: su sexo (masculino o femenino), tipo de sangre (A, B, AB u O) y en cuanto a la presión sanguínea (Normal, Alta o Baja). Mediante un diagrama de árbol diga en cuantas clasificaciones pueden estar los pacientes de este médico. 

NSolución: A

A BN

B AB

M AB NA

O B

A

NF B A

BAB

BO A

B  Si contamos todas las ramas terminales, nos damos cuenta que el número de clasificaciones son 2 x 4 x 3 = 24 mismas que podemos enumerar;MAN, MAA, MAB, MBN, MBA, MBB, etc, etc.

12

Page 13: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

 

3.2 Estructuras lógicas.

Secuenciales.

         Es aquélla en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así suscesivamente hasta el fin del proceso. La estructura secuencial tiene una entrada y una salida. Su representación gráfica es la siguiente:

ESTRUCTURA SECUENCIAL

  

PSEUDOCODIGO DE UNA ESTRUCTURA SECUENCIAL

 Inicio

           :

                :

acciones

:

:

fin

  Ejemplo:

        Calcular el salario neto de un trabajador en función del número de horas trabajadas, precio de la hora de trabajo y considerando unos descuentos fijos al sueldo bruto en concepto de impuestos (20 por 100).

  Pseudocódigo

Inicio13

Page 14: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

{cálculo salario neto}

leer nombre, horas, precio_hora

salario_bruto horas * precio

impuestos 0.20 * salario_bruto

salario_neto salario_bruto_impuestos

escribir nombre, salario_bruto, salario_neto_bruto, salario_neto

Fin

   Diagrama de flujo

 

Condicionales.

14

Page 15: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

        La especificación formal de algoritmos tiene realmente utilidad cuando el algoritmo requiere una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existen un número de posibles alternativas resultantes de la evaluación de una determinada condición.

         Las estructuras selectivas se utilizan para tomar decisiones lógicas; de ahí que se suelan denominar también estructuras de decisión o alternativas.

         En las estructuras selectivas se evalúa una condición y en función del resultado la misma se realiza una opción u otra. Las condiciones se especifícan usando expresiones lógicas. La representación de una estructura selectiva se hace con palabras en pseudocódigo (if, then, else o bien en español si, entonces, sino), con una figura geométrica en forma de romba o bien con un triángulo en el interior de una caja rectangular.

 

Las estructuras selectivas o alternativas pueden ser:

Simples Múltiples

  Alternativa Simple (si-entonces/if-then)

        La estructura alternativa simple si-entonces (en inglés if-then o bien IF-THEN ) ejecuta una determinada acción cuando se cumple una determinada condición. La selección si-entonces evalúa la condición y . . .

           Si la condición es verdadera, entonces ejecuta la acción S1 (o acciones caso de ser S1 una acción compuesta y constar de varias acciones).

 

          Si la condición es falsa, entonces no hacer nada.

 

A continuación se muestra la gráfica de la estructura condicional simple.

 

                                                         15

Page 16: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Pseudocódigo en español

Si     <condición>   Entonces

      <acción S1>

Fin_si

 Pseudocódigo en inglés

If    <condición>   then

   <acción S1>

end_if

 

Alternativas Múltiples (según_sea, caso de / case)

         Cuando existen más de dos elecciones (alternativas) posibles, es cuando se presenta el caso de alternativas múltiples. Si el número de alternativas es grande puede plantear serios problemas de escritura del algoritmo y naturalmente de legibilidad.

         La estrucura de decisión múltiple evaluará una expresión que podrá tomar n valores distintos 1,2,3,4,..n . Según que elija uno de estos valores en la condición, se realizaráa una de las n acciones, o lo que es igual, el flujo del algoritmo seguirá un determinado camino entre los n posibles.

 

La representación gráfica se muestra a continuación:

 

 Diagrama de Flujo

 

 Pseudocódigo

 En inglés la estructura de decisión múltiple se representa

16

Page 17: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

 Case expresión of

[e1]: acción S1

[e2]: acción S2

:

[en]: acción Sn

 else

acción Sx

 

end_case

  Ejemplo:

        Se desea diseñar un algoritmo que escriba los nombres de los días de la semana en función del valor de una variable DIA introducida por teclado.

        Los días de la semana son 7; por consiguiente, el rango de valores de DIA será 1..7, y caso de que DIA tome un valor fuera de este rango se deberá producir un mensaje de error advirtiendo la situación anómala.

 

Inicio

Leer DIA

Según_sea DIA hacer

1: escribir('Lunes')

2: escribir('Martes')

3: escribir('Miércoles')

4: escribir('Jueves')

5: escribir('Viernes')

6: escribir('Sabado')

7: escribir('Domingo')

else

escribir('Error')

17

Page 18: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

fin_según

fin

Repetitivas.

Estructura Mientras (while)

    La estructura repetitiva while, es aquélla en que el cuerpo del bucle se repite mientras se cumple una determinada condición, su representación gráfica es:

 

Pseudocódigo en español                               Pseudocódigo en inglés

Mientras condición hacer                              while   condición   do

Acción S1                                                              <Acciones>

Acción S2                                                                        :

      :                                                                  End_while

acción Sn

Fin_mientras

18

Page 19: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Ejemplo:

        Contar los números enteros positivos introducidos por teclado. Se consideran dos variables enteras NUMERO y CONTADOR (contará el número de enteros positivos).  Se supone que se leen números positivos y se detiene el bucle cuando se lee un número negativo o cero.

 Pseudocódigo

                Inicio

                  contador 0

                   Leer (numero)

                  Mientras numero > 0 hacer

                        contador   contador+1 

                       Leer (numero)

                    Fin_Mientras

                   Escribir('El número de enteros positivos es : ', contador)

                    Fin

3.3 Pseudocódigo.

El pseudocódigo o seudocódigo es una manera genérica de describir un algoritmo usando las convenciones de los lenguajes de programación.

El pseudocódigo describe un algoritmo utilizando una mezcla de frases en lenguaje común, instrucciones de programación y palabras clave que definen las estructuras básicas.

El objetivo del pseudocódigo es permitir que el programador se centre en los aspectos lógicos de la solución, evitando las reglas de sintaxis de los lenguajes de programación.

No siendo el pseudocódigo un lenguaje formal, los pseudocódigos varían de un programador a otro, es decir, no hay un pseudocódigo estándar.

Secuencia

    Inicio

        acción1

        acción2

        :

        acción n

19

Page 20: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

    Fin

     Decisión

   Simple

si condición entonces

acción1

acción2

:

acción n

   Doble

si condición then

acción1

acción2

:

en caso contrario

acción1

acció2

   Iteracción

   Fija

para   var. Entera inicial   hasta   final    hacer

acción1

acción2

:

acción n

 

   Condicional al inicio

mientras   condición    hacer

20

Page 21: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

acción1

acción2

:

acción n

 

   Condicional al final

Repetir

acción1

acción2

:

acción n

Hasta que condición

     Selección

casos   selector   de

valor1 : acción1

acción2

 valor2 : acción1

acción2

         valor n : acción1

        acción2

 3.4 Proceso general para la construcción de programas.

1). Investigación Preliminar: La solicitud para recibir ayuda de un sistema de información puede originarse por varias razones: sin importar cuales sean estas, el proceso se inicia siempre con la petición de una persona.

2). Determinación de los requerimientos del sistema: El aspecto fundamental del análisis de sistemas es comprender todas las facetas importantes de la parte de la empresa que se encuentra bajo estudio. Los analistas, al trabajar con los empleados y administradores, deben estudiar los procesos de una empresa para dar respuesta a las siguientes preguntas clave:

21

Page 22: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

¿Qué es lo que hace?

¿Cómo se hace?

¿Con que frecuencia se presenta?

¿Qué tan grande es el volumen de transacciones o decisiones?

¿Cuál es el grado de eficiencia con el que se efectúan las tareas?

¿Existe algún problema? ¿Qué tan serio es? ¿Cuál es la causa que lo origina?

3). Diseño del sistema: El diseño de un sistema de información produce los detalles que establecen la forma en la que el sistema cumplirá con los requerimientos identificados durante la fase de análisis. Los especialistas en sistemas se refieren, con frecuencia, a esta etapa como diseño lógico en contraste con la del desarrollo del software, a la que denominan diseño físico.

4). Desarrollo del software: Los encargados de desarrollar software pueden instalar software comprobando a terceros o escribir programas diseñados a la medida del solicitante. La elección depende del costo de cada alternativa, del tiempo disponible para escribir el software y de la disponibilidad de los programadores.

Por lo general, los programadores que trabajan en las grandes organizaciones pertenecen a un grupo permanente de profesionales.

5). Prueba de sistemas: Durante la prueba de sistemas, el sistema se emplea de manera experimental para asegurarse de que el software no tenga fallas, es decir, que funciona de acuerdo con las especificaciones y en la forma en que los usuarios esperan que lo haga. 

Se alimentan como entradas conjunto de datos de prueba para su procesamiento y después se examinan los resultados.

6). Implantación y evaluación: La implantación es el proceso de verificar e instalar nuevo equipo, entrenar a los usuarios, instalar la aplicación y construir todos los archivos de datos necesarios para utilizarla. Una vez instaladas, las aplicaciones se emplean durante muchos años. Sin embargo, las organizaciones y los usuarios cambian con el paso del tiempo, incluso el ambiente es diferente con el paso de las semanas y los meses.

4. Programación orientada a objetos.

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.

4.1 Conceptos básicos.

22

Page 23: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Objetos, mensajes, clases y métodos. Herencia, encapsulación y polimorfismo.

La programación orientada a objetos es una nueva forma de programar que trata de encontrar solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad ("métodos"). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).

Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, y/o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente.

Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

Características de la POO

Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

Abstracción: cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

Encapsulamiento: también llamado "ocultación de la información". Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones

23

Page 24: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Poliformismo

El polimorfismo es una nueva característica aportada por la OOP. Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre, diferenciándolas únicamente en los parámetros de entrada. Dependiendo del objeto que se introduzca como parámetro de entrada, se elegirá automáticamente cual de las operaciones se va a realizar.

Herencia

La herencia es la última de las propiedades relativas a la OOP, Consiste en la propagación de los atributos y las operaciones a través de distintas sub-clases definidas a partir de una clase común.

4.2 Proceso general para la construcción de programas.

Las metodologías orientadas a objetos se centran en las estructuras de datos que sin embargo se relegan a un segundo plano en los modelos procedurales. La base de esta metodología es que una estructura de datos debe contener las operaciones que los modifican. La técnica que se utiliza para obtener esta <<abstracción de datos>> es la encapsulación de los mismos en una estructura conocida como clase.

El acceso a los datos contenidos en la clase se realiza mediante las operaciones que la propia clase define. Por tanto, la metodología orientada a objetos complementa el punto de vista procedural de operaciones realizadas sobre un flujo de datos, al asociar a cada dato el conjunto de operaciones que lo modifican. Como podrá ver, ambos enfoques son complementarios.

UNIDAD II. ESTRUCTURAS DE DATOS.

Se trata de un conjunto de variables de un determinado tipo agrupadas y organizadas de alguna manera para representar un comportamiento. Lo que se pretende con las estructuras de datos es facilitar un esquema lógico para manipular los datos en función del problema que haya que tratar y el algoritmo para resolverlo. En algunos casos la dificultad para resolver un problema radica en escoger la estructura de datos adecuada. Y, en general, la elección del algoritmo y de las estructuras de datos que manipulará estarán muy relacionadas.

Según su comportamiento durante la ejecución del programa distinguimos estructuras de datos:

- Estáticas: su tamaño en memoria es fijo. Ejemplo: arrays.- Dinámicas: su tamaño en memoria es variable. Ejemplo: listas enlazadas con punteros, ficheros, etc.

1. Datos.

1.1 Definición.

Un dato es una representación simbólica (numérica, alfabética, etc.), de un atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado

24

Page 25: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

(procesado) se puede utilizar en la realización de cálculos o toma de decisiones. Es de empleo muy común en el ámbito informático.

En programación un dato es la expresión general que describe las características de las entidades sobre las cuales opera un algoritmo.

1.2 Clasificación.

Por su temporalidad: constantes y variables.

Variable.

En programación, las variables son estructuras de datos que, como su nombre indica, cambian a lo largo de la ejecución de un programa. Una variable corresponde a un área reservada en la memoria principal del computador pudiendo ser de longitud:

Fija, cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo las colecciones de datos y las cadenas o arrays.

Variable, cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos y arrays.

Constantes.

En programación, las constantes son tipos de datos (con valores numéricos o de cadena) que permanecen invariables, sin posibilidad de cambiar el valor que tienen durante el curso del programa.

Una constante corresponde a una longitud fija de un área reservada en la memoria principal del ordenador, donde el programa almacena valores fijos.

Por ejemplo:

El valor de pi = 3.141592

Por conveniencia, el nombre de las constantes suele escribirse en mayúsculas en la mayoría de lenguajes.

Por su estructura: simples y agrupados.

Tipos de datos simples.

Los tipos simples, que incluyen tipos ordinales y tipos reales, definen conjuntos ordenados de valores.

25

Page 26: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Es uno de los conceptos fundamentales de cualquier lenguaje de programación. Estos definen los métodos de almacenamiento disponibles para representar información, junto con la manera en que dicha información ha de ser interpretada.

Para crear una variable (de un tipo simple) en memoria debe declararse indicando su tipo de variable y su identificador que la identificará de forma única. La sintaxis de declaración de variables es la siguiente:

TipoSimple Identificador1, Identificador2;

Un tipo de datos se llama simple si sus datos son atómicos; esto es, consisten en elementos simples que no pueden dividirse.

Un tipo de datos se dice estructurado cuando sus datos son colecciones de elementos.

1.3 Naturaleza de los datos.

Numéricos.

Son valores enteros y reales.

El tipo de dator real define un conjunto de números que pueden ser representados con la notación de punto-flotante.

Tipo Tamaño Rango Cifras

Real 6...

11-12

Single 4...

7-8

Double 8...

15-16

Extended 10...

19-20

Comp1 8...

19-20

Alfanuméricos.

Son valores de tipo carácter o cadena de caracteres, números y caracteres especiales. Por ejemplo:

Nombre = “Hola mundo”

Ordinales.

26

Page 27: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

En el conjunto de los tipos ordinales se incluyen:

Tipo de dato entero.

Un tipo de dato entero en computación es un tipo de dato que puede representar un subconjunto finito de los números enteros. El número mayor que puede representar depende del tamaño del espacio usado por el dato y la posibilidad (o no) de representar números negativos. Los tipos de dato entero disponibles y su tamaño dependen del lenguaje de programación usado así como la arquitectura en cuestión.

La familia de los enteros esta formada por los siguientes tipos según su rango de valores (el tamaño de almacenamiento se da en bits):

Tipo Tamaño Rango

ShortInt 8 -128 ...127

Integer 16 -32.768 ...32.767

LongInt 32 -2.147.483.648 ...2.147.483.647

Byte 8 0 ...255

Word 16 0 ...65.535

Tipo de dato carácter.

Cualquier signo tipográfico. Puede ser una letra, un número, un signo de puntuación o un espacio.

Tipo de dato lógico (booleano).

El tipo de dato lógico o booleano es en computación aquel que puede representar valores de lógica binaria, esto es, valores que representen falso o verdadero.

Tipo de dato enumerado.

Un tipo enumerado define un conjunto ordenado de valores con el simple hecho de listar los identificadores que denotan tales valores. Los valores no tienen un significado/valor inherente al nombre del identificador y su ordinalidad sigue la secuencia en la cual los identificadores se listan.

Definición.

Para definir un tipo enumerado se utiliza la siguiente sintaxis:

(Ident-1, ident-2,..., ident-n)

Aplicaciones.

La lista de valores que definen un tipo enumerado de datos se puede asociar con un identificador en la sección de tipos. Este identificador se puede usar después para especificar el tipo de variables, parámetros formales y valores de funciones. Ejemplo:

TYPE DiasDeSemana = (Lunes, Martes, Miercoles,

27

Page 28: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Jueves, Viernes, Sabado, Domingo)

VAR Dia: DiasDeSemana;

Tipo de dato 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:

0..9 — este tipo subrango consta de los elementos 0,1,2,3,4,5,6,7,8,9

'0'..'9' — este subrango consta de los caracteres '0','1','2','3','4','5','6','7','8', '9'

'A'..'F' — este subrango consta de los caracteres 'A','B','C','D','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

Lógicos.

El tipo de dato lógico o booleano es en computación aquel que puede representar valores de lógica binaria, esto es, valores que representen falso o verdadero.

Gráficos.

Son valores que contienen una imagén o dibujo asignado a este tipo de dato.

1.4 Especificaciones de pseudocódigo.

2. Conjuntos.

28

Page 29: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

2.1 Definición.

Intuitivamente, un conjunto es una agrupación, clase o colección de objetos abstractos, a cada uno de los cuáles se le denomina elemento del conjunto.

2.2 Referencia de los componentes.

2.3 Operaciones con los conjuntos.

Igualdad de conjuntos

Dos conjuntos y se dicen iguales, lo que se escribe si constan de los mismos elementos. Es decir, siempre que para cualquiera que sea el elemento , se verifique

Subconjuntos y Superconjuntos.

Un conjunto se dice subconjunto de otro , si todo elemento de es también elemento de , es decir, cuando se verifique

,

Sea cual sea el elemento . En tal caso, se escribe .

Cabe señalar que, por definición, no se excluye la posibilidad de que si , se cumpla A = B. Si tiene por lo menos un elemento que no pertenezca al conjunto , pero si todo elemento de es

elemento de , entonces decimos que es un subconjunto propio de , lo que se representa por .

Si es un subconjunto de , decimos también que es un superconjunto de , lo que se escribe

. Así pues

,

y también

,

29

Page 30: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Significando que es superconjunto propio de .

Unión.

Los elementos que pertenecen a o a o a ambos y , forman otro conjunto, llamado unión de y , escrito . Así pues, se tiene

.

Intersección.

Los elementos comunes entre y forman un conjunto denominado intersección de y , representado por :

.

Si dos conjuntos y son tales que , entonces y se dicen conjuntos disjuntos.

Ejemplos: si tenemos los conjuntos

Entonces:

30

Page 31: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Diferencia.

Los elementos de un conjunto que no se encuentran en otro conjunto , forman otro conjunto llamado diferencia de y , representado por, :

.

Vemos que

,

de manera que

. Pero también

,

de modo que

2.4 Especificaciones de pseudocódigo para conjuntos.

3. Registros.

3.1 Definición.

Un registro (record) es un tipo de datos estructurado denominado (dato record) que consta de un conjunto de elementos que pueden ser del mismo tipo o de tipos diferentes.

31

Page 32: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Los componentes de un registro se llaman campos. Cada campo tiene un nombre llamado identificador de campo, que es algún identificador elegido por el programador cuando se declara de tipo registro y un tipo que se identifica cuando se declara el tipo de dato record.

3.2 Referencia de los componentes.

Formato

TypeTiporegistro = recordCampo 1 :tipol;..Campo N : tipoN;

End;

Tipoarchivo = file of tiporegistro.

Var

Archivol : tipoarchivo;Registro1 : tiporegistro;

TypeNombre reg = recordLista id1 : Tipo1;Lista id2 : Tipo2;Lista id3 : Tipo3;...Lista idN : TipoN;

End;

Nombre reg: Nombre de la estructura o registro.

Lista id: Lista de uno o más nombres de campos que componentes el registro.

Tipo: Puede ser cualquier tipo de dato est´andar o definido por el usuario.

Por ejemplo, el registro:

TypeEmpleado = recordNombre : String[30];Edad : Integer;Domicilio : String[40];Salario : Real;

End;

32

Page 33: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

se puede representar gr´aficamente como:

Acceso a Campos de un Registro.

Se puede acceder a cada campo de un registro directamente ulizando un designador o selector de campo de la forma:NombreReg.NombreCampo.

Los datos mostrados en el ejemplo anterior se pueden setear ediante una secuencia de sentencias de asignación:

Empleado.Nombre := ’Juan P´erez’;Empleado.Edad := 34;Empleado.Domicilio := ’Av. Espa~na’;Empleado.Salario := 250000;

Un registro puede representarse gráficamente en función de sus campos.

3.3 Aplicaciones.

Ejemplo:

Program Registro; {EL siguiente programa captura 10 empleados y sus datos personales en un arreglo con la utilización de registros}Uses Crt;Const MaxEmpleados=10;Type registro_empleado = Record

33

Page 34: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

nombre : string[30]; profesion : string[20]; puesto : string[20]; sueldo : real end;Var registro : registro_empleado; empleado :array[1..MaxEmpleados] of registro_empleado; i,col,ren :byte;begin ClrScr; Write(' Nombre Profesión Puesto Sueldo'); col:=1;ren:=2; for i:=1 to MaxEmpleados do begin With registro do begin gotoxy(col,ren); ReadLn(empleado[i].nombre); gotoxy(col+21,ren); ReadLn(empleado[i].profesion); gotoxy(col+40,ren); ReadLn(empleado[i].puesto); gotoxy(col+59,ren); ReadLn(empleado[i].sueldo); inc(ren); col:=1; end end; ReadKeyend.

3.4 Especificaciones de pseudocódigo para registros.

4. Arreglos.

34

Page 35: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

4.1 Definición.

Un array es un tipo de estructura de datos que consta de un número fijo de elementos del mismo tipo. En una máquina, dichos elementos se almacenan en posiciones contiguas de memoria.

4.2 Referencia de los componentes.

Es una estructura homogénea de datos de tamaño constante accediendo a cada uno de sus elementosmediante un identificador comun y uno o varios índices.

o Todos los elementos del array son del mismo tipo.

o El número de ellos no varía durante la ejecución del programa.

o Accedemos a un elemento de la estructura mediante un identificador común, el nombre delarray, y con el valor que toman uno o varios indices. Al número de indices necesarios paradesignar un elemento del array se le denomina dimensión del array.

o El número máximo de valores posibles que puede tomar cada indice se denomina rango de esa dimensión o indice. Los valores han de ser consecutivos, por lo que el indice ha de ser de un tipo ordinal.

La declaración más general de un array es la siguiente:

Type

Rango1 = tipoordinal1;Rango2 = tipoordinal2;

Var

Notas:tipoordinal1;Curso:tipordinal2;

4.3 Arreglos multidimensionales.

Arrays unidimensionales.

Un array de una dimensión (vector o lista) es un tipo de datos estructurado compuesto de un número de elementos finitos, tamaño fijo y elementos homogéneos.

Supongamos que desea conservar las edades de 10 personas. Para almacenar estas edades se necesita reservar 10 posiciones de memoria, darle un nombre al array, y a cada persona asignarle su edad correspondiente.

35

Page 36: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Arrays bidimensionales (tablas)

Un array bidimensional (tabla o matríz) es un array con dos índices, al igual que los vectores que deben ser ordinales o tipo subrango.

Para localizar o almacenar un valor en el array se deben especificar dos posiciones (dos subíndices), uno para la fila y otro para la columna.

Formato:

1. identificador = array [índice1, indice 2] of tipo de elemento

2. identificador = array [ índice 1 ] of array [ indice 2 ] of tipo de elemento

Supongase que se desea almacenar las calificaciones de 5 alumnos obtenidas en 3 examenes y mostrar en orden ascendente sus promedios respectivamente. En este caso se usará un array bidimensional (tabla o matríz) de 5 filas y 4 columnas en la cual se almacenará las calificaciones de 3 examenes en 3 columnas y la cuarta columna se utilizará para almacenar su promedio respectivo, además de un array unidimensional (vector) donde en forma paralela se almacenarán los nombres de los alumnos de la siguiente forma :

36

Page 37: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Arrays multidimensionales.

Turbo Pascal no limita el número de dimensiones de un array, pero sí que debe estar declarado el tipo de cada subíndice.

Formato :

 

1. identificador = array [índice1] of array [índice 2]..of array [índice n] of tipo de elemento

2. identificador = array [índice 1, índice 2,...,índice n] of tipo de elemento

Ampliando el ejemplo anterior supongase que ahora deseamos capturar calificaciones para 3 materias en cuyo caso aplicaremos un array tridimensional. De la siguiente forma :

(nombre,examen,materia)

4.4 Arreglos con componentes tipo registro.

4.5 Aplicaciones.

Ejemplo:

Program Matriz_Vector; {El siguiente programa captura las calificaciones de 5 alumnos en 3 examenes, y despliega en pantalla los promedios ordenados en forma descendente }Uses Crt;Const MaxAlumno = 5; MaxExamen = 4;{Columna 4 almacena el promedio}Var Alumno :array[1..MaxAlumno] of string[10]; examen :array[1..MaxAlumno,1..MaxExamen] of real; aux_examen :array[1..MaxExamen] of real;

37

Page 38: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

{reserva 20 posiciones de memoria de datos reales :5 filas por 4 columnas} promedio :real; aux_alumno :string [10]; i,j,col,ren :byte;begin ClrScr; {lectura de arrays paralelos de manera simultánea} gotoxy(5,5);Write('Nombre'); gotoxy(20,5);Write('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=6; for i:=1 to MaxAlumno do begin gotoxy(col,ren); ReadLn(alumno[i]); {lectura de vector} col:=22;promedio:=0; for j:=1 to MaxExamen-1 do begin gotoxy(col,ren); ReadLn(examen[i,j]); {lectura de matríz} promedio:=promedio+examen[i,j]; col:=col+10 end; examen[i,j+1]:=promedio/3; gotoxy(col,ren);Write(promedio/3:3:2); inc(ren); col:=5 end; {ordenación} for i:=1 to MaxAlumno-1 do for j:=i+1 to MaxAlumno do begin if examen[i,MaxExamen]<examen[j,MaxExamen] then begin {intercambio de nombres en vector} aux_alumno:=alumno[i]; alumno[i] :=alumno[j]; alumno[j] :=aux_alumno; {intercambio de calificaciones en matríz} move(examen[i],aux_examen,SizeOf(aux_examen)); move(examen[j],examen[i],SizeOf(aux_examen)); move(aux_examen,examen[j],SizeOf(aux_examen)) end end; {recorrido de matríz y vector} gotoxy(25,14);Write('Datos ordenados'); gotoxy(5,16);Write('Nombre'); gotoxy(20,16);Write('Examen1 Examen2 Examen3 Promedio'); col:=5;ren:=17; for i:=1 to MaxAlumno do begin gotoxy(col,ren); Write(alumno[i]); col:=22; for j:=1 to MaxExamen do begin gotoxy(col,ren); Write(examen[i,j]:3:2); col:=col+10 end; col:=5; inc(ren) end; readkey

38

Page 39: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

end.

4.6 Especificaciones de pseudocódigo para arreglos de datos.UNIDAD III. PROGRAMACIÓN ESTRUCTURADA BÁSICA.

1. Declaración de las estructuras de datos.

1.1 Tipos de datos.

1.2 Constantes.

En programación, las constantes son tipos de datos (con valores numéricos o de cadena) que permanecen invariables, sin posibilidad de cambiar el valor que tienen durante el curso del programa.

Una constante corresponde a una longitud fija de un área reservada en la memoria principal del ordenador, donde el programa almacena valores fijos.

Por ejemplo:

El valor de pi = 3.141592

Por conveniencia, el nombre de las constantes suele escribirse en mayúsculas en la mayoría de lenguajes.

1.3 Variables.

En programación, las variables son estructuras de datos que, como su nombre indica, cambian a lo largo de la ejecución de un programa. Una variable corresponde a un área reservada en la memoria principal del computador pudiendo ser de longitud:

fija, cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo las colecciones de datos y las cadenas o arrays.

variable, cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos y arrays.

39

Page 40: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

2. Operaciones básicas.

2.1 Asignación de valores a variables.

¿Como definir una variable?

Para definir una variable siempre necesitaremos un nombre con el que nos referiremos a ella durante nuestro "programa", seguido de dos puntos (:) y a continuación el tipo de variable que utilizamos, en nuestro caso: texto o número.

Escalón: texto

Iniciar una variable.

Para iniciar una variable, poner un valor inicial que más tarde podremos modificar, lo haremos de la siguiente forma. (Debemos tener en cuenta que una variable siempre debe tener un valor inicial).

2.2 Lectura y escritura.

Almacenar resultados en variables.

Nosotros podemos almacenar valores en nuestras variables de la misma manera que las iniciaremos. Variable = Valor. Este "almacenamiento" de información la podemos hacer en cualquier lugar del código. Debemos pensar que este valor puede ser sustituido por una operación y almacenar el resultado en la variable. Veamos un ejemplo: Variable = 5 + 3 de esta forma cuando nosotros deseemos ver el contenido de Variable podremos observar que es un 8.

Podemos utilizar una variable como un contador. Un contador no es más que una variable que se va incrementado de forma que podemos contar, por ejemplo, las veces que pasamos por un lugar determinado, las veces que se realiza una función, etc... La estructura de un contador sería la siguiente. Contador = Contador + 1.

Explicaremos como funcionaría este contador. A la derecha del igual se produce la operación, que es este caso es Contador + 1, de esta forma se coge el valor que tiene Contador y se le suma 1. El resultado de la operación se guarda en la variable que tenemos a la derecha del igual, que este caso es la misma variable Contador. Si esta línea la pusiéramos dentro de un bucle, podríamos ver como la Variable va aumentando de 1 en 1 hasta que se cumpliera la condición del bucle.

2.3 Evaluación de expresiones.

Aritméticas.

40

Page 41: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Son operaciones de tipo matemático, que permiten procesar la información de tal forma que se obtenga un valor. Por ejemplo:

Suma = A + B

La Operación Asignación.

variable = expresión;

La sentencia de asignación es un modo de darle valores a una variable.

La expresión se evalúa y el resultado es asignado a la variable.

La sentencia de asignación modifica el contenido de una variable.Variable = valor constante; x = 3;Variable = variable; x = y;Variable = expresión; x = (y + 1)/2;

Expresiones

Puede ser:

Una variable

Una constante

Una combinación de operadores y operandos.

Operandos: constantes, variables u otras expresiones.

Operadores: Símbolo que indica al compilador que ejecute determinadas operaciones con los elementossobre los que opera (aritméticos, lógicos, de cadena y relacionales).

De relación.

Permite realizar una serie de operaciones anidadas, a partir de una expresión que utilize los concectores and, not y or (y, no y o respectivamente), generalmente se utilizan en las estructuras lógicas condicionales. Por ejemplo:

Si (A < B) y (J + H = C) entonces D = A

Lógicas.

Se utilizan para evaluar expresiones que sólo pueden devolver un valor de verdadero o falso. Por ejemplo:

Edad > 18

41

Page 42: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

La expresión es verdadera si la variable edad tiene un valor mayor a 18, de lo contrario será falsa.

2.4 Estructuras lógicas.

Introducción al concepto de bucle.

Un bucle no es más que una serie de instrucciones que se repiten.

Podemos tener dos tipos de bucles según lo que nos interese comprobar. Tenemos un bucle que se repite mientras se cumple una condición determinada, y otro que se realiza hasta que se cumple la condición que marcamos. En esta lección nos encargaremos del primer tipo.

A la hora de utilizar un bucle, sea del tipo que sea, debemos ir con cuidado y pensar cuando debe acabar ya que si no tuviéramos en cuenta esto podríamos entrar en un bucle sin fin, osea que iríamos repitiendo las mismas líneas teniendo que abortar la aplicación, para poderla finalizar. Por esto es de suma importancia que pensemos, antes de hacer nada, en que momento, como, donde y porque debe acabar el bucle. 

Secuenciales.

    Inicio

        acción1

        acción2

        :

        acción n

    Fin

Condicionales.

Estructura básica de una condición.

En nuestro curso esta estructura se representará de la siguiente manera:

42

Page 43: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Otra estructura condicional.

Ahora veremos como es la nueva estructura condicional. Esta estructura, como ya hemos dicho anteriormente es muy útil en el momento en el que debemos tomar diferentes decisiones de una misma condición. La estructura sería la siguiente:

En caso <condición> hacer

<valor 1>

<instrucciones>

<valor 2>

<instrucciones>

...

Fin caso

Repetitivas.

Estructura básica.

En nuestro curso esta estructura básica de un bucle Mientras se representará de la siguiente manera:

Otra estructura repetitiva.

Ahora vamos a ver el mismo ejemplo que hemos puesto antes pero utilizando una nueva estructura repetitiva. Primero veamos la estructura y después como la podemos aplicar.

Repetir

<instrucciones>

Hasta que <condición>

43

Page 44: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Otra estructura repetitiva.

Ahora vamos a ver el mismo ejemplo que hemos puesto antes pero utilizando una nuevas estructura de repetición. Primero veamos la estructura y después como la podemos aplicar.

Desde <Variable> = <ValorInicial> Hasta <ValorFinal>

<instrucciones>

Fin Desde

2.5 Especificaciones de pseudocódigo con las operaciones básicas.

3. Archivos.

3.1 Definición.

Un archivo es una estructura de datos que reside en memoria secundaria o dispositivo de almacenammiento, tales como disquetes, CDs, discos duros, y cintas magnéticas, entre otros.

Un archivo es una estructura homogénea de datos consistente en una secuencia de elementos llamados registros, todos del mismo tipo, ya sea simple o estructurado. Un archivo se almacena en un dispositivo auxiliar (discos, cintas, etc), de forma que los datos obtenidos antes, durante y después del procesamiento de los datos, no se pierden. Para declarar una variable archivo es necesario definir previamente la naturaleza de sus registros.

3.2 Campos y registros.

Los archivos estan compuestos por registros y a su vez por un conjunto de datos, los cuales se pueden manipular de forma conjunta, en otras palabras, los registros se encuentran conformados por campos, que son datos específicos sobre algún conjunto de individuos u objetos.

Los componentes de un registro se llaman campos. Cada campo tiene un nombre llamado identificador de campo, que es algún identificador elegido por el programador cuando se declara de tipo registro y un tipo que se identifica cuando se declara el tipo de dato record.

3.3 Organización.

Secuencial.

Los registros se encuentran organizados en posiciones consecutivas, y sólo se pueden acceder a ellos de uno en uno a partir del primero.

44

Page 45: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Esta organización consiste en la disposición consecutiva de los registros a medida que se adicionan al archivo, o sea que el orden de los registros es el de entrada; para recuperar un registro en particular es necesario recorrer el archivo desde el primer registro hasta el registro buscado.Igual ocurre en la carpeta donde se guardan los exámenes de los alumnos a medida que los entregan. Si se necesita el examen de alguien en particular es necesario buscar desde el comienzo en toda la carpeta. Como se puede observar esta organización no es muy eficiente para recuperar registros da un archivo cuando su cantidad es muy grande.

Archivos de acceso secuencial

Los archivos de acceso secuencial son llamados también archivos de texto, están formados por cadenas de caracteres separadas unas de otras por los códigos retorno de carro/avance de línea, que corresponden a los caracteres 13/10 del código ASCII. El final del archivo se indica mediante el caracter ASCII 26, que también se expresa como ^Z o EOF.

Es posible visualizar estos archivos con la orden TYPE del sistema operativo DOS y se pueden editar con cualquier editor de textos.

Este tipo de archivos solo permiten operaciones de lectura y escritura secuenciales, la unica forma de modificarlos es agregando líneas al final del archivo.

Los pasos para leer o escribir en un archivo de este tipo son:

Declarar una variable de tipo texto y asociarla al nombre de un archivo. A esto también se le llama declarar el archivo. Abrir el archivo ya sea para lectura o escritura. Leer o escribir datos en el archivo. Cerrar el archivo

Declaración de un archivo

Para declarar un archivo primero se declara una variable tipo text de la siguiente forma:

VARVarArchivo : Text;

Una vez declarada la variable se asigna al nombre de algun archivo:

ASSIGN (VarArchivo, NombreArchivo); Donde NombreArchivo es una cadena de caracteres que contiene el nombre del archivo, la unidad de disco donde se encuentra y el directorio. Por ejemplo:

ASSIGN (VarArchivo, 'C:\DOS\PRUEBA.TXT');

Abrir archivos

Exsiten tres formas de abrir un archivo:

Rewrite Reset Append

45

Page 46: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Escribir datos en un archivo

Para escribir datos a un archivo se utilizan las instrucciones Write y WriteLn, como si se quisiera escribir a la pantalla, con la diferencia de que se especificará la variable de archivo ya declarada. Ejemplo:

WriteLn(VarArchivo, 'Prueba de archivos'); Esta sentencia grabaría el texto 'Prueba de archivos' en el archivo asignado a VarArchivo.

Leer datos de un archivo

Para leer los datos de un archivo de acceso secuencial se utilizan las instrucciones Read y ReadLn.

La instrucción Read lee uno o varios datos del archivo abierto y deja el puntero en el mismo renglón en el cual leyó los datos, en cambio ReadLn lee los datos y mueve el puntero al siguiente renglón.

Fin del archivo

Normalmente los archivos de este tipo se leen renglón por renglón hasta llegar al final del mismo. Cuando se conoce de antemano el tamaño del archivo es posible utilizar un ciclo FOR, pero es más seguro utilizar la función EOF la cual es verdadera despues de que el programa lee la última linea de un archivo de acceso secuencial.

La sintaxis de la función EOF es:

EOF (VaribleArchivo);

Es común realizar la verificación de la función con un ciclo WHILE como en el ejemplo siguiente:

WHILE NOT EOF(Archivo) DOBEGINReadLn(Archivo, Datos);WriteLn(Datos);END;

Cerrar archivos

Para asegurar que toda la información se grabe en el disco correctamente es necesario cerrar el archivo antes de que se termine la ejecución del programa, de lo contrario se corre el riego de que la última información que se haya accesado no se grabe en su totalidad.

La instrucción para cerrar un archivo es Close, y su sintaxis es:

Close (VaribleArchivo);

Función Eoln

La función Eoln sirve para verificar si el puntero ha llegado al final de la linea. Regresa el valor verdadero si se encuentra al final. Comunmente se utiliza en las lecturas caracter por caracter.

Agregar datos a un archivo de texto

Para añadir datos a un archivo de texto son necesarios los siguientes pasos:

46

Page 47: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Asignar un archivo a una variable con Assign Agregar los datos con el procedimiento Append Escribir los datos Cerrar el archivo

A continuación se ilustra un ejemplo de un programa que agrega una linea a un archivo de texto:

PROGRAM Archivo;VARTexto : TEXT;

BEGINAssign (Texto, 'PRUEBA.DAT');Append(Texto);WriteLn(Texto, 'Agregando una linea al archivo PRUEBA.DAT');Close (Texto)END.

Relativa.

También conocida como organización directa o aleatoria. Los registros se colocan y acceden al indicar el lugar que ocupan dentro del archivo.

Archivos de acceso directo

Un archivo de acceso directo esta formado por un conjunto de partes individuales que pertenecen al mismo tipo de datos. Cada uno de los componentes del archivo es llamado registro.

Cada uno de los componentes de este tipo de archivos es accesible directamente.

Los archivos de acceso directo son también llamados archivos con tipos o tipeados.

Estructura del archivo

A diferencia de los archivos secuenciales, los archivos tipeados no estan compuestos de lineas de caracteres, sino que se acomodan en registros con estructuras fijas. La longitud de los registros esta determinada por la cantidad de bytes que se necesitan para almacenar el tipo de datos que contendrá el registro.

Por ejemplo, si se van a almacenar números enteros en un archivo, cada registro servirá para un número específico y ocupará 2 bytes, el siguiente registro utilizará los dos bytes siguientes del archivo y así sucesivamente hasta completar la cantidad de datos que se vayan a almacenar.

Este tipo de archivos no pueden ser visualizados con la instrucción type del sistema operativo debido al formato utilizado para guardarlos.

Declaración de un archivo

Para declarar un archivo de acceso directo se realiza con las palabras reservadas FILE OF, su sintaxis es la siguiente:

47

Page 48: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

VariableArchivo : FILE OF TipoElementos;

Esta declaración se realiza en la sección correspondiente a la declaración de las variables. Ejemplo:

PROGRAM Archivo_Tipeado;VARArchivo : FILE OF Integer;BEGINEND.

Normalmente no se desea crear archivos que puedan almacenar un solo tipo de datos ya que se requeririan varios archivos, por ejemplo para alguna base de datos: uno para los nombres, otro para apellidos, otro para la edad, etc. Para evitar este inconveniente es posible usar registros del tipo RECORD, que permiten grabar en un solo registro un grupo de datos que pueden ser de diferentes tipos, uno de tipo INTEGER, uno de tipo STRING, etc.

Los registros del tipo record deben ser declarados antes de las variables en una sección llamada TYPE con el siguiente formato:

TYPE Nombre_Reg = RECORD Campo_del_registro_1 : Tipo; Campo_del_registro_2 : Tipo; ... Campo_del_registro_n : Tipo; END;

Donde Nombre_Reg es el nombre del registro que se utilizará, Campo_del_Registro_x son las variables que estarán contenidas en el registro y Tipo es el tipo de cada una de las variables del registro.

La sección TYPE se escribe antes de la declaración de las variables.

Como ejemplo, si se quiere crear un archivo el que se guarden el nombre, domicilio, edad y estado civil de un grupo de personas el primer paso a realizar es crear un registro que contenga todos estos campos:

TYPE Datos = RECORD Nombre : String[40]; Domicilio : String[60]; Edad : Integer; EdoCivil : String[10]; END;

El siguiente paso es declarar un archivo del tipo Datos así como una variable del mismo tipo de los que se utilizarán en el archivo:

VAR Archivo : FILE OF Datos; Persona : Datos;

48

Page 49: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Asignación de un archivo

Aún cuando se tenga declarado el archivo no es posible grabar nada en él si no se le asigna un nombre real para guardarlo en el disco. El proceso de dicha asignación es el mismo que para los archivos de texto:

Assign (Archivo, 'Nombre.ext');

Nombre.txt puede ser una constante, una variable o estar escrita directamente en el programa. Naturalmente debe cumplir con todas las reglas para nombrar un archivo.

Abrir archivos

Una vez declarado un archivo ya es posible abrirlo. En caso de querer abrir un archivo nuevo se utiliza la instrucción Rewrite, o si el archivo ya existe en el disco se abre con el procedimiento Reset.

No existe ninguna diferencia entre la apertura de un archivo de acceso directo para su lectura o para su escritura.

Si al utilizar el procedimiento Rewrite el archivo asignado ya existía se eliminará del disco y se creará uno nuevo, por lo mismo se debe tener ciudado al momento de abrir estos archivos.

Registro actual y tamaño de un archivo

La función FileSize regresa el tamaño de un archivo, o mejor dicho devuelve el número de registros contenidos en éste.

Al momento de abrir un archivo nuevo la función FileSize regresa el valor de 0, lo que significa que el archivo no tiene datos guardados en él.

Posicionamiento en el interior de un archivo

Cada uno de los registros de un archivo esta referenciado por un número específico comenzando desde el registro 0 y aumentando de 1 en 1.

La función FilePos devuelve el número de registro actual, su sintaxis es:

FilePos (VariableArchivo)

VariableArchivo es la variable a la cual se asignó un nombre de archivo en el disco.

Para moverse a un registro determinado se utiliza la función Seek, con la siguiente sintaxis:

Seek (VariableArchivo, NumRegistro);

Para moverse al final del archivo para agregar un nuevo registro se utiliza este mismo comando con el parametro NumRegistro como sigue:

Seek (VariableArchivo, FileSize(VariableArchivo));

Cuando se avanza en un archivo registro por registro se utiliza la función EOF para determinar si ya se llegó al final del archivo.

49

Page 50: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Lectura y escritura de archivos

Para la lectura y escritura en un archivo de acceso directo unicamente se utilizan los procedimientos Read y Write. Despues de cada operacion de lectura o escritura el puntero se posiciona en el siguiente registro.

Para estar seguros de que se leera el registro que se desea se debe emplear el procedimiento seek antes de cualquier procedimiento de lectura o escritura.

Cerrar un archivo

Para cerrar los archivos abiertos se procede igual que en uno de acceso secuencial, utilizando el procedimiento close:

Close (VariableArchivo);

Indexada.

Esta organización consiste en la disposición de los registros en los archivos con base en el valor de uno o más campos llamados índices, con el propósito de facilitar su recuperación. Así funcionan los diccionarios, los registros se presentan ordenados alfabéticamente y se llega a las proximidades del registro buscado con la ayuda del índice.Esta organización es eficaz para recuperar registros de un archivo grande, pero no para agregar registros, ya que requiere hallar la localización precisa del nuevo registro entre los registros existentes en el archivo, antes de almacenarlo. Este caso no ocurre con la organización secuencial, en la cual los nuevos registros simplemente se agregan al final del archivo.

Para definir esta organización es importante definir tres conceptoss:

a) Area primaria: contiene registros.

b) Campo clave: Es un campo con un valor que identifica de forma única un registro, por lo que su valor no puede aparecer repetido en otro registro.

c) Area índices: Es un archivo secuencial en el que cada registro establece la clave de un registro del área primaria y su ubicación (direccción). De esta forma el sistema accede de forma directa a una dirección del área primaria a partir del índice. Para comprender mejor este tipo de organización, consideraremos el ejemplo clásico en el que buscamos un tema y posteriormente abrimos el libro en esa página.

3.4 Acceso a los registros.

Secuencial.

El acceso secuencial a un registro se reaaliza desde el primero y los sucesivos hasta lllegar al registro seleccionado. Este método de acceso se puede utilizar con cualquier soporte y organización.

Aleatoria.

50

Page 51: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

El acceso aleatorio sólo se puede realizar en los llamados soportes direccionables, como los discos magnéticos, éste consiste en accesar a un registro directamente, es decir, sin accesar los registros anteriores.

3.5 Tipos de archivos.

Texto.

Contienen datos de tipo carácter, este tipode archivos consiste en varias líneas que constan de un número varible de caracteres. El archivo puede leerse o escribirse, ya sea línea por línea o carácter por carácter. Tambien puede ser accesado desde cualquier editor de texto y programa de aplicación específica, como procesadores de palabras, etc.

También conocidos como (Slream File) son utilizados para almacenar documentos que consisten en texto; En ellos, cada registro es un solo símbolo o código de control.

El leer estos archivos recibimos la información en orden secuencial en el que aparece cuando lo vemos en un monitor.

Los archivos de texto son una secuencia de líneas separadas por marcas de fin de línea.

Binario.

Son archivos que no tienen una estructura definida, sólo procesan la información, generalmente se usan para copiar o mover archivos de estructura desconocida y se requiere de protocolos o lenguajes especiales para codificar el contenido de éstos.

es un archivo que lee byte por byte sin asumir ninguna estructura. Los archivos Binarios no son un nuevo tipo de archivo, pero si una nueva forma de manipular cualquier tipo de archivo. Las técnicas de archivo binarios permiten leer o cambiar cualquier byte de un archivo. Son herramientas extremadamente potentes, pero como toda herramienta potente debe manejarse con cuidado

Estructurado.

Son archivos que utilizan estructuras de datos simples y/o agrupadas, donde todos los elementos se emncuentran relacionados entre si, el programa no necesita traducir el contenido del archivo para entenderlo, ya que debe disponer de una estructura definida.

3.6 Especificaciones de pseudocódigo para archivos.

4. Operaciones con archivos.

4.1 Creación y eliminación de archivos.51

Page 52: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Creación de Archivo.- En este proceso se pretende solamente crear un archivo nuevo en disco, con su nombre, tipo y especialidad de almacenamiento de datos apropiado.

Apertura de Archivos.- En este caso se pretende abrir un archivo ya existente en disco para procesarlo, ya sea cargar o grabar datos en sus registros, o leer algun registro en especial para mandarlo a una variable de cualquier tipo.

rewrite crea un nuevo archivo (o sobre-escribe en uno existente) y lo abre para procesamiento con el apuntador de registro colocado en el registro 0.

rewrite (nombre_archivo).

erase (nombre_archivo) Borra un archivo externo.

4.2 Lectura y escritura de registros.

Write (f,v1,v2) Borra un archivo externo.

erase (f,v1,v2) Borra un archivo externo.

f variable tipo archivo

v1,v2 variable de tipo datos

4.3 Proceso de un archivo secuencial.

Actualización de archivos secuenciales. Un archivo maestro representa un panorama estático de algún aspecto de una empresa. Sin embargo muchos de los aspectos de dicha organización no son estáticos, sino que continuamente ocurren cambios internos y/o externos que afectan directa o indirectamente a la empresa, como puede ser la contratación de personal, despidos, los ajustes de precios, etc. Para que un archivo pueda reflejar un estado actual lo más confiable posible, nuestro archi.vo debe ser actualizado.

Ventajas y Desventajas.La ventaja más importante de la técnica de organización secuencial de archivos es la capacidad de acceso al "siguiente" registro rápidamente: Mientras que el patrón de acceso a un archivo secuencial se conforme al ordenamiento de registros en el archivo, los tiempos de acceso serán muy buenos. Sin embargo, si el patrón de acceso al programa no se conforma al patrón de ordenamiento de los registros, entonces la eficiencia del programa puede ser terrible. Otra ventaja de los archivos de organización secuencial es que son muy sencillos de usar y aplicar.

Almacenamiento De Archivos Secuenciales. Los archivos secuenciales pueden almacenarse en dispositivos de acceso serial o directo. Con frecuencia los dispositivos de acceso serial son considerablemente menos caros que los dispositivos de acceso directo en un sistema de cómputo, pero de hecho, los dispositivos de almacenamiento de acceso directo en una computadora siempre proporcionan mayor capacidad de almacenamiento y acceso más rápido que los dispositivos de acceso serial.

52

Page 53: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Declaración De Archivos Secuenciales. Casi todos los lenguajes proporcionan facilidades para declarar archivos secuenciales.

Creación de un archivo secuencial. La creación de un archivo secuencial incluye la escritura de registros en una secuencia deseada dentro del medio de almacenamiento. La creación de un archivo secuencial de transacciones incluye la tarea de recolectar datos, convertir los datos a una forma legible para la máquina, editar los datos, convertir los movimientos rechazados y ordenar los datos editados.

Recuperación De Información De Archivos Secuenciales.

Los registros deben ser recuperados de un archivo secuencial en orden consecutivo. El orden en el cual los registros fueron grabados en el archivo, determina el orden en el cual los registros pueden recuperarse. De hecho, en realidad se hace todo lo contrario: el orden deseado para recuperar los registros debe dictar el orden en el cual deben grabarse.

La recuperación de información de un archivo secuencial puede clasificarse, ya sea en generadora de reportes o para hacer consultas, dependiendo del volumen de información producida. Los archivos secuenciales son frecuentemente accesados en el modo de generación de reportes. Debido a que los registros deben ser accesados consecutivamente, es bastante eficiente accesar cada registro del archivo.

Generación de archivos.

Una desventaja de los archivos secuenciales es que en el proceso de actualización, la mayoría de los archivos secuenciales no pueden ser actualizados, más bien habrá que reescribirlos totalmente. Para llevar a cabo este proceso existirá un archivo maestro anterior y otro actual. Estas versiones sucesivas del archivo son normalmente conocidas como generaciones de archivo. Si el archivo maestro viejo perteneció a la generación 1, entonces el archivo nuevo del día pertenecerá a la generación 2, y así sucesivamente.

El tener varias generaciones del archivo se hace con el objetivo de obtener reportes históricos que podrían ayudar en un momento dado para la toma de decisiones de una empresa.

4.4 Proceso de un archivo relativo.

Se utiliza la organización relativa cuando existe la necesidad de accesar registros individuales directamente. En un archivo relativo existe una relación predecible entre la llave usada para identificar un registro y su localización dentro del archivo. Sin embargo es importante comprender que el ordenamiento lógico de los registros no necesita tener ninguna relación con su secuencia física. Los registros no necesariamente aparecen físicamente ordenados de acuerdo al valor de sus llaves. A cada archivo relativo debe definírsele una relación que será utilizada.

4.5 Proceso de un archivo indexado.

Cuándo deben crearse índices.

Cuando piense si debe crear un índice, debe evaluar dos factores para asegurarse de que el índice será más eficiente que una exploración de tabla: la naturaleza de los datos y la de las consultas basadas en la tabla.

53

Page 54: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Por qué se debe crear un índice.

Los índices aceleran la recuperación de los datos. Por ejemplo, si no utiliza un índice, deberá examinar un libro entero, página a página, para buscar información acerca de un tema.

SQL Server utiliza índices para señalar la ubicación de información específica en una página de datos, en lugar de tener que buscar en todas las páginas de datos de una tabla. Debe tener en cuenta los siguientes hechos y directrices acerca de los índices:

Los índices suelen acelerar las consultas que combinan tablas y realizan operaciones de ordenación o agrupación.

Los índices exigen que las filas sean únicas si se definió esta propiedad al crear el índice. Los índices se crean y mantienen en orden ascendente. Los índices son más útiles en las columnas con un alto grado de selectividad, es decir, columnas o

combinaciones de columnas en las que la mayor parte de los datos son únicos.

Por qué no debe crear un índice

Los índices consumen espacio de disco y producen costos de proceso y de mantenimiento. Debe tener en cuenta los siguientes hechos y directrices acerca de los índices:

Cuando se modifican datos en una tabla indizada, SQL Server tiene que actualizar los índices asociados.

El mantenimiento de los índices requiere tiempo y recursos. Por lo tanto, no debe crear índices que no vaya a utilizar con frecuencia.

Los índices de las tablas pequeñas probablemente aporten pocas ventajas, porque puede ser más costoso buscar en las páginas de índice que explorar la tabla completa.

Nota Los índices no son obligatorios. Puede consultar y manipular los datos sin necesidad de utilizar un índice. No obstante, el acceso a los datos es considerablemente más rápido cuando existen índices apropiados.

Directrices para la indización.

El entorno de la compañía, las características y el uso de los datos determinan las columnas que se deben especificar para generar los índices. La utilidad de un índice depende directamente del porcentaje de filas de una tabla que devuelve una consulta. Los porcentajes bajos o las consultas muy selectivas obtienen las máximas ventajas de los índices.

Cuando se crea un índice sobre una columna, ésta se denomina columna de índice. Un valor de una columna de índice se denomina valor de clave.

Nota Todas las columnas de una tabla pueden estar indizadas y cualquier columna puede formar parte de más de un índice, aunque esto generalmente resta eficacia.

Columnas que debe indizar

Debe crear índices en las columnas donde lleve a cabo búsquedas frecuentemente, como:

Claves primarias Claves externas u otras columnas que se utilizan con frecuencia para combinar tablas Columnas en las que se buscan intervalos de valores de clave

54

Page 55: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Columnas en las que el acceso se realiza por orden de clasificación

Columnas que no debe indizar

No debe crear índices sobre columnas que tengan las características siguientes:

Rara vez se hace referencia a ellas en las consultas. Contienen pocos valores únicos. Por ejemplo, un índice sobre una columna que sólo contiene dos

valores, como masculino y femenino, devuelve un alto porcentaje de filas y no aporta ventajas. Están definidas con los tipos de datos bit, texto e imagen. Las columnas con datos de estos tipos

no pueden indizarse.

Crear y eliminar índices.Los índices se crean con la instrucción CREATE INDEX y se eliminan con la instrucción DROP INDEX.

Uso de la instrucción CREATE INDEX

La instrucción CREATE INDEX se utiliza para crear índices. También se puede emplear el Asistente para creación de índices del Administrador corporativo de SQL Server. Al crear un índice sobre una o más columnas de una tabla, debe tener en cuenta los hechos y directrices siguientes:

SQL Server crea índices automáticamente cuando se crea una restricción PRIMARY KEY o UNIQUE en una tabla. Es mejor definir una restricción PRIMARY KEY o UNIQUE que crear índices estándar.

Para poder ejecutar la instrucción CREATE INDEX debe ser el propietario de la tabla. No pueden crearse índices sobre vistas. SQL Server almacena la información de los índices en la tabla de sistema sysindexes. Antes de crear un índice sobre una columna, averigüe si ya existen índices sobre esa columna. Mantenga los índices en un tamaño pequeño; para ello, limite los valores de clave a una o dos

columnas. Normalmente, los índices pequeños son mas eficientes que los que tienen valores de clave grandes.

Seleccione las columnas basándose en que contengan valores únicos para que cada valor de clave identifique a un pequeño número de filas.

Sintaxis

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]INDEX nombreDeÍndice ON tabla (columna [, ...n])[WITH[PAD_INDEX][[,] FILLFACTOR = factorDeRelleno][[,] IGNORE_DUP_KEY]

Si no se especifica UNIQUE en la instrucción CREATE INDEX, el índice admitirá duplicados. Si no se especifica CLUSTERED en la instrucción CREATE INDEX, se creará un índice no agrupado.

EjemploEn este ejemplo se crea un índice agrupado sobre la columna lastname (apellidos) de la tabla member (miembro).

55

Page 56: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

CREATE CLUSTERED INDEX cl_lastnameON library..member (lastname)

Uso de la instrucción DROP INDEX

La instrucción DROP INDEX se utiliza para eliminar un índice de una tabla. Al eliminar un índice, debe tener en cuenta los hechos siguientes:

Cuando se ejecuta la instrucción DROP INDEX, SQL Server recupera el espacio de disco que ocupaba el índice.

No se puede utilizar la instrucción DROP INDEX en índices creados mediante restricciones PRIMARY KEY o UNIQUE. Para eliminar estos índices, se debe eliminar antes la restricción.

Cuando se elimina una tabla, también se eliminan todos sus índices. Cuando se elimina un índice agrupado, se reconstruyen automáticamente todos los índices no

agrupados de la tabla. La base de datos en la que reside un índice que se desea eliminar debe ser la base de datos actual. No se puede utilizar la instrucción DROP INDEX en las tablas de sistema.

Sintaxis

DROP INDEX tabla.índice [, ...n]

EjemploEn este ejemplo se elimina el índice cl_lastname de la tabla de miembro.

USE libraryDROP INDEX member.cl_lastname

UNIDAD IV. PROGRAMACIÓN ESTRUCTURADA INTERMEDIA.

Estrucutra de un Programa PASCAL.

56

Page 57: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

1. Procedimientos y funciones.

1.1 Definición.

Procedimientos.

Un procedimiento es un subprograma que realiza alguna de las tareas del programa, y que no devuelve ningún valor al subprograma que lo invocó.

Un procedimiento está compuesto de un grupo de sentencias a las que se asigna un nombre (identificador) y constituye una unidad del programa. La tarea asignada al procedimiento se ejecuta siempre que Pascal encuentra el nombre del procedimiento.

En Turbo Pascal resulta obligatorio declarar los procedimientos antes de ser referenciados en el cuerpo del programa.

1.2 Ámbito local y global.

El ámbito de una variable hace referencia a la limitación de uso, esto es, de lectura y/o escritura de una variable dentro de una aplicación. Este puede ser:

Local: Cuando la misma sólo es accesible desde un único procedimiento hijo, no pudiendo ser leída o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condición, bucles, etc de tal modo que sólo pueda accederse a ellas en el propio bloque.

Se tiene este tipo de variables cuando, un subprograma tiene sus propias variables declaradas en la sección correspondiente del subprograma. Este tipo de variables se crean cada vez que se llama a

57

Page 58: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

ejecución el subprograma y al salirse de él se pierden, permitiendo en algunos casos manejar el mismo nombre de variable en el programa principal y en el subprograma como de tipos diferentes o del mismo tipo sin que esto pueda alterar en algo algunos de los valores.Puede decirse entonces, que las variables locales son aquellas variables que se emplean únicamente donde fueron declaradas. Por ejemplo, en el la unidad del formulario se tiene la siguiente declaración:

Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicación, como en todos los procedimientos y funciones de la misma.

Se tiene este tipo de variables cuando se realiza la declaración de las mismas en la sección implementation, justo después de las directivas del sistema. Si llega a emplearse en un subprograma y no está declarada en este, entonces se dice que se tienen variables de tipo global, esto implica que si en el subprograma se altera el valor, también en el programa principal resultará alterado o repercute en él. Por ejemplo, se puede tener en el programa la siguiente declaración:

Funciones.

La diferencia principal entre un procedimiento y una función es que el identificador de la función asume un valor, y cuando la función termina su tarea, devuelve ese valor al módulo que la invocó; mientras que el procedimiento no devuelve ningún valor.

Puesto que el nombre de la función toma un valor, dicho nombre debe tener asociado un tipo de dato.

Constantes y variables.

Las reglas para formar los identificadores en Pascal son las siguientes:

1. Pueden estar compuestos de caracteres alfabéticos, numéricos y el carácter de subrayado ( _ ).2. Deben comenzar con un carácter alfabético o el carácter de subrayado.3. Puede ser de cualquier longitud (sólo los 63 primeros caracteres son significativos).4. No se hace distinción entre mayúsculas y minúsculas.5. No se permite el uso de los IDENTIFICADORES RESERVADOS en los nombres de variables, Constantes, programas o sub-programas.

Identificadores válidosNombreCadenaEdad_MaximaX_Y_ZEtiqueta2

Identificadores no válidosNum&Dias : carácter & no válidoX nombre : Contiene un blancobegin : es una palabra reservadaeje@s : carácter @ no válido

Declaración de constantes y variables.

58

Page 59: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Para declarar las constantes se utiliza la palabra reservada CONST seguida de un identificador al que se le dará un valor determinado, un signo de igual "=", el valor que recibirá el identificador y al final un punto y coma ";". Ejemplo: CONST pi = 3.1415926;

De esta forma el identificador pi recibirá el valor de 3.1415926 y no será posible cambiarlo en el transcurso del programa.

Es posible declarar varias constantes sucesivamente, puede ser una por renglón o varias en un solo renglón. Cuando se hace ésto, la palabra CONST solo se pone una sola vez como cabecera y a continuación todas las constantes por definir. Ejemplo:

CONSTPI = 3.1415926;Nombre = 'Juan Gutiérrez';Unidad = 1;

Otra forma de escribir lo mismo es así:

CONST PI = 3.1415926; Nombre = 'Juan Gutiérrez'; Unidad = 1;

Pero por cuestiones de legibilidad es preferible la primera opción.

La declaración de variables se lleva a cabo de la misma forma, solo que en lugar de la palabra CONS utilizamos la palabra VAR, y en lugar de "= valor;", utilizamos : tipo , sustituyendo "tipo" por alguna clase válida de datos en Turbo Pascal. Ejemplo:

VAR Num_entero : Integer;Nombre : String;

Procedimientos y funciones del usuario.

Declaración de un procedimiento.

La sintaxis para declarar un procedimiento es :

Formato 1 :

procedure nombre_procedimiento; declaraciones locales begin cuerpo del procedimiento end;

Formato 2:

59

Page 60: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

procedure nombre_procedimiento(parámetros formales); declaraciones locales begin cuerpo del procedimiento end;

La existencia de parámetros_formales dependerá de la naturaleza del procedimiento, esto es, de la tarea que va a realizar y de la forma en que lo ha estructurado su creador.

Invocación al procedimiento.

Para invocar a un procedimiento, la sintaxis es :

<nombre_de_procedimiento> (parámetros_actuales) ;

Donde la existencia de parámetros_actuales dependerá de que en la declaración del procedimiento se hayan utilizado parámetros formales.

Declaración de funciones.

La declaración de una función tiene la siguiente forma :

function Nombre (p1,p2,...):tipo {declaraciones locales y subprogramas}begin <cuerpo de la función> Nombre := valor de la funciónend;

p1,p2,... lista de parámetros formalestipo tipo de dato del resultado que devuelve la función

Ejemplos :

function verifica : boolean ;{ Función sin parámetros formales} function cambia(Var valor_1, valor_2: real):real; function potencia( base, exponente : real ):real;

Invocación de funciones.

Las funciones se invocan de la siguiente manera :

<nombre_función> (parámetros_locales) ;

60

Page 61: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

 donde :

parámetros_locales es una lista de variables y/o constantes separadas por comas. La existencia de parámetros_locales dependerá de que existan parámetros formales en la declaración de la función.

1.3 Parámetros.

Paso de parámetros.

Al invocar a un subprograma se le pueden pasar parámetros, los cuales pueden consistir de valores de variables declaradas en el módulo invocador. El paso de tales parámetros puede hacerse de dos maneras :

Por valor Por referencia

Paso por valor.

El paso de parámetros por valor consiste en enviar una COPIA del valor de la variable al módulo invocado.

De esta manera se asegura que el valor de la variable sólo puede ser modificado por el módulo que la declaró.

Si la palabra Var no aparece delante del parámetro formal en un procedimiento, Turbo Pascal supone que el parámetro formal es un parámetro por valor.

Ejemplo:

Program Suma_por_Valor; {El siguiente programa realiza la suma de dos numeros }Uses Crt;Var A,B,C:integer;

procedure suma(A,B,C :integer);begin C := A + Bend;

begin ClrScr; C:=10; A:=10; B:=10; suma(A,B,C); WriteLn(A,',',B,',',C); ReadKey; ClrScrend.

61

Page 62: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

El resultado de la ejecución del programa sería :

10,10,10

El valor de C no se modifica puesto que es un parámetro por valor.

Paso por referencia.

En el caso de que se requiera que el valor de una variable sea modificado por el módulo invocado, debe hacerse el paso de parámetro por referencia, por medio del cual el módulo invocado tiene acceso a la dirección en que se guarda el valor a modificar.

Para aclarar los conceptos de paso por valor y paso por referencia, analicemos el programa de suma y multiplicación de matrices dado en la sección anterior.

Observamos que las invocaciones a subprogramas son similares en los casos de paso por valor y paso por referencia.

Por ejemplo, las invocaciones a los procedimientos imprime y suma quedan de la siguiente manera:

imprime('C',mat_c,ren_a,col_b); suma(mat_a,mat_b,mat_c,ren_a,col_a);

y sus respectivas declaraciones son :

procedure imprime(nmat:char;mat_f:mat;ren_f,col_f:integer); procedure suma(mat_f_a,mat_f_b:mat;Var mat_f_c:mat;ren_f,col_f:integer);

Vemos que en la declaración del procedimiento suma existe la parte: Var mat_f_c : mat

la cual significa lo siguiente :

"La variable mat_f_c contiene la dirección de la variable correspondiente en la invocación ( mat_c ) , y es de tipo mat "

Esto significa que el paso del parámetro mat_c se hizo por referencia, y que el procedimiento invocado (suma) puede modificar el valor de mat_c .

Ejemplo:

 Program Suma_por_Referencia;

{El siguiente programa realiza la suma de dos números }Uses Crt;Var A,B,C:integer;

procedure suma(A,B:integer;Var C:integer);begin

62

Page 63: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

C := A + Bend;

begin ClrScr; C:=10; A:=10; B:=10; suma(A,B,C); WriteLn(A,',',B,',',C); ReadKey; ClrScrend.

El resultado de la ejecución del programa sería :

10,10,20

El valor de C se modifica puesto que es un parámetro por referencia.

Nota : En Turbo Pascal no se permite el paso de procedimientos y funciones como parámetr

1.4 Unidades.

Definición.

Declaración de unidades.

Las unidades son módulos independientes del programa que, aunque no son ejecutables por si mismos, pueden ser utilizados por el programa principal sin necesidad de reescribir el código que contienen. Para la utilización de estos "subprogramas" es necesaria su declaración.

La palabra reservada USES cumple el propósito de declarar las unidades en el formato siguiente:

USES crt, dos;

Esta linea declara y habilita para su uso a la unidad crt y a la unidad dos

Cada unidad que se declara debera estar separada de la siguiente por una coma. Al final de todas las unidades declaradas se deberá colocar un punto y coma ";".

Las unidades estándar de turbo pascal son:

Crt

Dos

Graph

63

Page 64: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Overlay

Printer

System

Procedimientos y funciones predefinidos.

Procedimientos INC y DEC.

El procedimiento INC incrementa en 1 el contenido de cualquier variable de tipo entero, es lo mismo en un programa teclear: Variable := Variable + 1;

o telcear:

Inc(Variable);

El procedimiento DEC decrementa en 1 el valor de cualquier variable de tipo entero que se le indique, se usa igual que INC:

DEC (Variable);

Truncamiento y redondeo.

La función Round (número) redondea un número real al entero más cercano y devuelve el resultado como un número real.

La función Trunc (número) elimina la parte decimal del número real y devuelve el resultado como tipo entero.

Funciones exponenciales y logarítmicas.

La función Sqr devuelve el cuadrado del valor utilizado como parámetro.

Sqrt regresa la raíz cuadrada del valor dado como parámetro, el resultado siempre es real aunque se utilice un número de tipo entero como argumento.

Funciones aritméticas.

Abs regresa el valor absluto del identificador que se le pase como parámetro. El valor que devuelve será del mismo tipo que el argumento. Abs(-24) {Regresa el valor 24}La función Int devuelve la parte entera de un valor real, como tipo real.

La función Frac regresa la parte decimal de un valor real, también como valor real.

64

Page 65: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Funciones trigonométricas.

Las funciones trigonometricas definidas en Turbo Pascal son: Sin(valor), Cos(valor) y Arctan(valor), todas las demas pueden definirse desde estas:

Tan(x) Sin(x) / Cos(x)

Cot(x) Cos(x) / Sin(x)

Sec(x) 1 / Cos(x)

Csc(x) 1 / Sin(x)

Procedimientos y funciones para el manejo de cadenas.

Pos Copy Insert Delete UpCase Str Val

Las cadenas de caracteres son secuencias de caracteres con longitudes que varían desde 1 hasta los 255 caracteres. El tipo identificador de las cadenas es String. Cuando declaramos una variable de tipo string será posible introducir hasta 255 caracteres en ella, pero también es factible declarar cadenas más cortas agregando al momento de la declaración la longitud de la variable, por ejemplo:

VARMensaje : String[120]; {Longitud maxima = 120 caracteres}

Comparación de cadenas

La comparación de cadenas es una operación muy común en Turbo Pascal; estas comparaciones se realizan con base en el orden del código ASCII, por ejemplo la cadena 'Prueba' es menor a la cadena 'prueba' ya que el valor del código ASCII de P es 80 y el de p es 112.

Así también podemos diferenciar las cadenas con respecto a su tamaño: 'Hola' es menor a 'Bienvenido'

Existe un caso especial de una cadena, que es cuando no tiene ningún caracter en ella, en ese momento decimos que es una cadena nula o vacía. Se recomienda ampliamente inicializar todos los valores de las cadenas a cadenas nulas al inicio del programa, ya que podrían contener datos extraños e indeseables.

Manejo de los elementos de la cadena

Es posible leer cada elemento de una cadena por separado, por ejemplo, si en la variable Calle almacenamos la cadena 'Hidalgo' es posible asignar a otra cadena el valor de Calle[x] donde x es el caracter de la cadena que se quiere leer, así también es posible visualizar el caracter en pantalla usando la instrucción WriteLn. Ejemplo:

PROGRAM Caracter;VARCalle : String;Letra : String;BEGINCalle := 'Hidalgo';WriteLn(Calle[2]); {Visualiza el segundo caracter de Calle}

65

Page 66: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Letra := Calle[1]; {Guarda en Letra el primer caracter de Calle}WriteLn(Caracter) END.

Para conocer la longitud de una cadena utilizamos la función Length, la longitud es la cantidad de caracteres que contiene la cadena en un momento determinado.

Su sintaxis es:

Length (cadena); La función regresa un valor entero.

PROGRAM Funcion_Length;VARCadena : String;BEGINCadena := 'Prueba de longitud';WriteLn ('Longitud de la cadena: ', Length (Cadena));END.

El programa imprime en la pantalla un mensaje con la longitud de la cadena almacenada en memoria, en este caso específico 18.

En ocasiones es necesario combinar dos o más cadenas de caracteres en una sola, para lograr ésto utilizamos los siguientes métodos.

Operador +

Es una de las formas más sencillas de unir dos cadenas y se maneja exactamente como una suma, la única limitante es que en caso de ser mayor la longitud resultante de la suma que la longitud que pueda manejar la variable en que se almacenará se truncarán los caracteres sobrantes. Ejemplo:

Cadena1 := 'Buenos ';Cadena2 := 'dias ';Cadena3 := Cadena1 + Cadena2;WriteLn (Cadena3);

Se imprimirá en la pantalla: 'Buenos dias'. (Notese que este ejemplo es solo una sección del programa, para ejecutarlo es necesario completar la estructura).

Función Concat

La función concat produce los mismos resultados que la concatenación, es posible incluir cualquier número de cadenas que se necesiten concatenar.

La suma de las cadenas no deberá sobrepasar la longitud que la variable, a la cual se asignará dicha suma, puede manejar. Ejemplo:

Cadena := Concat (Cad1, cad2, cad3);

Pos

Laa función Pos nos sirve para localizar una determinada cadena dentro de otra, en otras palabras para verificar si una cadena es subcadena de otra segunda.

Los parámetros que requiere son: la cadena que se buscará y la cadena donde se buscará la primera:

66

Page 67: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Pos (Cadena1, Cadena2);

Cuando encuentra la cadena la función devuelve su posición inicial, en caso de que no la encuentre devuelve el valor de 0.

Ejemplo:

Cadena := 'Domingo Lunes Martes Miercoles Jueves Viernes Sabado';WriteLn(Cadena);WriteLn(Pos('Lunes', Cadena)); {Muestra 9}WriteLn(Pos('Jueves', Cadena)); {Muestra 32}WriteLn(Pos('Ayer', Cadena)); {Muestra 0}

Copy

La función copy regresa una subcadena de una variable o constante dada como parámetro. Su sintaxis es: Copy (Cadena, Inicio, Cantidad);

Donde Cadena es la fuente de la subcadena, Inicio es la posición desde la cual se obtendrá la subcadena y Cantidad es el número de caracteres que se extraerán.

Los valores de Inicio y Cantidad deben ser de tipo entero.

Ejemplo:

Cadena := "Nuevos horizontes";WriteLn (Copy(Cadena, 8, 10)); {Visualiza: horizontes}

Insert

El procedimiento Insert sirve para insertar una cadena dentro de otra en alguna posición determinada. Sintaxis: Insert (Cadena1, Cadena2, Posición)

Donde Cadena1 es la que se insertará, Cadena2 es donde se insertará y Posición es el lugar donde se insertará. El parámetro Posición debe ser de tipo entero.

Delete

Este procedimiento elimina un determinado número de caracteres de una cadena. Su sintaxis es: Delete (Cadena, Inicio, Número) Cadena es la variable en la cual se eliminarán los caracteres, Inicio es la posición del primer caracter a eliminar y Número es la cantidad de caracteres que se borrarán.

UpCase

La función UpCase regresa la letra mayuscula correspondiente al caracter dado como parámetro. Es muy común trabajando con cadenas que se quiera convertir una que contiene un número a su valor numérico, para poder utilizarlo en operaciones matemáticas, así como convertir un número a su equivalente en una cadena.

Esto es más fácil de entender si consideramos que no es lo mismo el valor 75 y el valor '75', en el primer caso es un número mientras que en el segundo es un par de caracteres ASCII.

Para lograr estos cambios de tipo en Turbo Pascal utilizamos los procedimientos siguientes:

67

Page 68: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Str

El procedimiento Str obtiene una cadena a partir de un valor numérico. Su sintaxis es: Str(Valor, Cadena) Donde valor es el número a convertir y Cadena es la variable donde se almacenará la cadena ya convertida.

Val

Este procedimiento convierte una cadena en un valor de tipo numérico, el problema con esta función es que si la cadena no esta formada exclusivamente de números siguiendo las reglas para el tipo de datos que se vallan a obtener se generará un error. Sintaxis: Val (Cad, Num, Código)

Cadena contiene la cadena que será procesada, Num es la variable de tipo numérico donde se guardará el valor de la cadena y Código es una variable de tipo entero (Integer) que contendrá el valor de 0 si no hubo errores y un valor diferente en caso de que no se haya podido convertir la cadena, el valor de Código representa la posición de la cadena donde ocurrio el error.

ClrEol

Sintaxis: ClrEol; Este procedimiento borra todos los caracteres de la linea actual desde la posición del cursor hasta el final de la linea. Ejemplo:

PROGRAM Proc_ClrEol;USES Crt;VAR x,y : Integer;

BEGINFOR x := 1 TO 24 DOFOR y := 1 TO 80 DOWrite('#');GotoXY(15,15);ClrEol;END.

ClrScr

Sintaxis: ClrScr; Se utiliza para borrar la pantalla completa o la ventana actual y situa el cursor en la esquina superior izquierda. Ejemplo:

PROGRAM LimpiarPantalla;USES Crt;VAR x,y : Integer;Prb : String;

BEGINFOR x := 1 TO 24 DOFOR y := 1 TO 80 DOWrite('#');WriteLn('Presione [ENTER] para borrar la pantalla');ReadLn(Prb);ClrScr;

68

Page 69: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

WriteLn('Se borró la pantalla');END.

Delay

Sintaxis: Delay(Tmp : Word); Detiene la ejecución del programa durante un tiempo especificado en Tmp en milisegundos. El intervalo válido es desde 0 hasta 65535, la precisión del retardo depende de la precisión del reloj interno de la computadora. Ejemplo:

PROGRAM Retardo;USES Crt;

BEGINWriteLn('Inicia retardo de aproximadamente 5 segundos');Delay(5000);WriteLn('Fin del retardo');END.

DelLine

Sintaxis: DelLine; Borra la linea donde se encuentra el cursor y las lineas inferiores suben una posición. Ejemplo

PROGRAM BorrarLinea;USES Crt;VAR x : Integer;prb : String;BEGINClrScr;For x := 1 to 20 DOWriteLn('Linea número: ', x);WriteLn('Presione [ENTER] para borrar la linea 6');GotoXY(0,6);DelLine;WriteLn('Linea 6 eliminada');END.

GotoXY

Sintaxis: GotoXY(x, y : Byte); Posiciona el cursor en las coordenadas especificadas por x y y.El byte x representa la columna partiendo de izquierda a derecha y el byte y representa la fila partiendo de arriba hacia abajo. Ejemplo:

PROGRAM Posición;USES Crt;BEGINGotoXY(10,10);Write('*');GotoXY(20,20);Write('*');END.

69

Page 70: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

HighVideo

Sintaxis: HighVideo; Activa la pantalla de video de alta intensidad.

InsLine

Sintaxis: InsLine Inserta una linea en blanco en la posición actual del cursor.

NoSound

Sintaxis: NoSound; Desactiva el sonido iniciado con el procedimiento Sound.

Sound

Sintaxis: Sound (Frecuencia : Word); Genera un sonido en la bocina de la computadora a una frecuencia determinada por el valor de Frecuencia. Para detener el sonido es necesario ejecutar el procedimiento NoSound.

TextBackground

Sintaxis: TextBackGround (Color : byte); Se utiliza para seleccionar el color del fondo de la pantalla. Los valores que puede utilizar son del 0 al 7, también es posible utilizar las constantes predefinidas para los colores.

TextColor

Sintaxis: TextColor (Color : Byte); El procedimiento TextColor se usa para seleccionar el color del texto en la pantalla.

TextMode

Sintaxis: TextMode (Modo : Word); Define el modo de video, ésto es, el número de filas y columnas que se podrán mostrar en pantalla, también si se mostrarán en blanco y negro o en color.

Los modos válidos de pantalla de texto son:

Constante Valor Modo de video

BW40 0 40x25 Blanco y negro en tarjeta de color

CO40 1 40x25 Color

BW80 2 80x25 Blanco y negro en tarjeta de color

CO80 3 80x25 Color

Mono 7 80x25 Monocromático

Window

Sintaxis: Window (x1, y1, x2, y2 : Byte);

70

Page 71: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Define las coordenadas de la ventana de texto activa; x1 y y1 son las coordenadas de la esquina superior izquierda, x2 y y2 son las coordenadas de la esquina inferior derecha.

Las siguientes son las funciones de la unidad CRT:

KeyPressed

Tipo: Boolean

La función KeyPressed devuelve el valor de True si se pulsó alguna tecla y false si no se ha presionado ninguna.

ReadKey

Tipo: Char

Esta función lee un caracter del teclado, se utiliza mucho para leer teclas de dirección, teclas de control y de funciones.

WhereX

Tipo: Byte

WhereX devuelve el número de la columna donde se encuentra el cursor.

WhereY

Tipo: Byte

La función WhereY devuelve el número de la fila donde se encuentra el cursor al momento de llamar a la funcioacute;n.

1.5 Especificaciones mediante pseudocódigo para procedimientos y funciones.

{PROGRAMA PARA SUMAR Y MULTIPLICAR MATRICES}INICIO IMPRIME encabezado. LEE las dimensiones de las matrices A y B. SI las matrices no son compatibles para la suma, ENTONCES IMPRIME mensaje_1. SI las matrices no son compatibles para la mult., ENTONCES IMPRIME mensaje_2. SI son compatibles para la suma o para la mult. , ENTONCES INICIO LEE las matrices A y B. IMPRIME las matrices A y B. SI son compatibles para la suma, ENTONCES INICIO SUMA las matrices A y B.

71

Page 72: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

IMPRIME la matriz resultado C. FIN SI son compatibles para la multiplicacion, ENTONCES INICIO MULTIPLICA las matrices A y B. IMPRIME la matriz resultado D. FIN FINFIN.

2. Impresión de reportes.

2.1 Estructura general de un reporte.

Líneas de detalle.

Es la impresión de la información del archivo bajo ciertos criterios, presentada en columnas según el campo indicado en columnas según el campo indicado en los encabezados de página.

Líneas de totales.

Información impresa al final del reporte, tal como totales, datos estadísticos del resumén o la conclusión del reporte.

Encabezados de página.

Información impresa al principio de cada página como número de página, fecha, título de la página y los encabezados de las columnas.

Pies de página.

Información impresa al final de cada página, como fecha, o número de página.

REPORTES DELPHI

Imprimir toda la tabla significa muchas hojas de impresora.

Primero se deberá quitar el filtro en la tabla y segundo entender lo que tienen en común todas las hojas de impresora que se ocupan para imprimir la tabla.

72

Page 73: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Primero todas las hojas ocupan un mismo encabezado o un mismo pie de página, donde puede ir por ejemplo la fecha o el número de página.

La primera hoja de todo el reporte, cuando menos debe llevar una banda de titulo, con el nombre de la compañía, el titulo y propósito de la tabla, la fecha, etc.

Todo los renglones de la tabla, ocuparan muchas hojas de impresora para desplegarse, incluyendo un encabezado para todas las columnas que están en la hoja, repito necesitamos un encabezado para columnas y que aparezca en todas las paginas.

Probablemente, en la hoja final, seria conveniente añadir algunos contadores y acumuladores, por ejemplo la cantidad de renglones, algún acumulado de alguna columna numérica en especial, etc.

QReport, usa este modelo de bandas para la construcción de reportes, es decir, en la practica anterior se uso un componente QRShape, para dividir el reporte en dos partes, secciones o bandas, pero QReport trae incorporado un componente llamado QRBand que permite dividir en partes, secciones o bandas todo el reporte.

Este componente QRBand, en su propiedad BandType, permite construir los siguientes seis tipos importantes de banda.

BANDA NOTAS

PAGE HEADER Banda de encabezados de páginas.

Aparece en todas las hojas impresas.

Poner dentro componentes para número de página, etc.

TITLE Banda de Titulo o encabezados del Reporte.

Solo aparece en la primera hoja impresa.

Poner componentes qrlabel con el nombre de la compañía, el propósito de la tabla, fecha, etc.

COLUMM HEADER Banda de o para encabezados de columnas.

Aparece en todas las hojas impresas.

Poner dentro componentes qrlabel con el encabezado que lleva cada columna de la tabla.

DETAIL Banda de detalle.

Es la mas importante, porque es la que contiene los datos de los renglones de la tabla.

Es la que constituye el grueso de las hojas impresas.

Solo colocar dentro de esta banda los componentes de datos impresos, QRDBText y QRDBImage

73

Page 74: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

SUMMARY Banda de resumen.

Solo aparece en la hoja final de impresión.

Poner dentro de ella componentes de operaciones como es QRExpr y estudiarlo en la ayuda, para conocer sus métodos (funciones) y aplicarlas.

PAGE FOOTER Banda de pie de pagina.

Aparece en todas las hojas impresas.

Su función es similar a la banda de encabezado.

De hecho, en un reporte solo se usa la b banda de encabezado o la banda de pie de página, pero no las dos.

Solo poner dentro de esta banda, componentes de número de página, o de fechas, o de hora, etc.

Lo más importante a tomar en cuenta es cada componente QRBand que se ponga dentro de un reporte, se deberá definir usando su propiedad BandType, como una cualquiera de los seis tipos de bandas, es decir,

QRBand1 = banda de encabezado,

QRBand2 = Banda de titulo,

QRBand3 = Banda de detalle, etc.

En general el procedimiento completo es:

1.-Poner un componente Table en la forma y nadamas cargarle sus tres propiedades básicas( no usar filtros).

2.-Poner un Componente QuickRep( es la hoja de impresión) y cargarle las propiedades ya descritas en procedimiento de impresión anterior.

3.- Colocar y expandir un primer componente QRBand dentro del componente QuickRep y primero asociarle el tipo de banda que representa, por ejemplo de encabezado o de titulo, recordar que un reporte no necesariamente tiene que llevar las seis bandas.

A este componente QRBand, cambiarle propiedades de font, frame, color, etc.

4.- Colocar dentro del componente QRBand1, los componentes necesarios y apropiados como se indico en el cuadro anterior de bandas y significados, por ejemplo QRLabel, etc.

5.-Colocar otro componente QRBand en la hoja de impresión, expanderlo y definirlo como banda de titulo o banda de encabezado de columnas, etc.

6.-Repetir los pasos anteriores, hasta completar todas las bandas.

7.- Colocar un botón de ordenes OK, y asociarle el código de Preview o de impresión.

74

Page 75: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

2.2 Contadores y acumuladores.

CONTADOR: Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad constante cada vez que se produce un determinado suceso o acción. Los contadores se utilizan con la finalidad de contar sucesos o acciones internas de un bucle; deben realizar una operación de inicialización y posteriormente las sucesivas de incremento o decremento del mismo. La inicialización consiste en asignarle al contador un valor. Se situará antes y fuera del bucle.

Representación:<nombre del contador> ¬ nombre del contador> + <valor constante>Si en vez de incremento es decremento se coloca un menos en lugar del más.

Ejemplo: i = i + 1

ACUMULADOR O TOTALIZADOR:Es una variable que suma sobre sí misma un conjunto de valores para de esta manera tener la suma de todos ellos en una sola variable. La diferencia entre un contador y un acumulador es que mientras el primero va aumentando de uno en uno, el acumulador va aumentando en una cantidad variable.Representación: <Nombre del acumulador> ¬ <nombre del acumulador> + <valor variable>

75

Page 76: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

3. Lenguajes de programación estructurada.

3.1 Quick Basic.

(frecuentemente abreviado, correctamente, como QB, o incorrectamente, como QBasic) es un descendiente del lenguaje de programación BASIC que Microsoft Corporation desarrolló para su uso con el sistema operativo MS-DOS. Estaba ligeramente basado en GW-BASIC pero añadía tipos definidos por el usuario, estructuras de programación mejoradas, mejores gráficos y soporte de disco, y un compilador además del intérprete. Microsoft sacó a la venta QuickBasic como un paquete de desarrollo comercial.

Microsoft publicó la primera versión de QuickBASIC el 18 de agosto de 1985, en un único disquete de 5.25". QuickBASIC usaba un entorno de desarrollo integrado (IDE) radicalmente diferente al que acompañaba a las versiones anteriores de BASIC. Los números de línea ya no eran necesarios puesto que los usuarios podían insertar y quitar líneas directamente mediante un editor de textos en pantalla.

QuickBASIC incluía el "Compilador PC BASIC", que servía para compilar los programas en ejecutables DOS. El editor poseía un intérprete con el cual el usuario podía ejecutar un programa sin tener que cerrar el editor en absoluto, y podía usarse para depurar un programa antes de crear el fichero ejecutable. Desgraciadamente, había ciertas pequeñas diferencias entre el intérprete y el compilador, por lo que programas que ejecutaban perfectamente en el intérprete no lo hacían en su versión compilada o incluso no llegaban a compilar.

La última versión de QuickBASIC fue la 4.5 aunque se siguió desarrollando como el Professional Development System (PDS), cuya última versión fue la 7.1. A la versión PDS también se le llamó a veces QuickBASIC Extendido. El sucesor de QuickBASIC y PDS fue Visual Basic 1.0, que salió en dos versiones incompatibles entre sí, una para DOS y otra para Windows. Las versiones posteriores de Visual Basic no incluían versiones para DOS, ya que Microsoft quería que los desarrolladores se concentraran en las aplicaciones para Windows.

A partir de MS-DOS 5, las versiones de DOS incluían un sustituto de GW-BASIC basado en QuickBASIC 4.5. Ese sustituto se llamaba QBASIC. En comparación con QuickBASIC, está limitado ya que le faltan unas pocas funciones, sólo puede manejar programas de un tamaño limitado, no tiene soporte para módulos separados, y sólo es intérprete. Al carecer de compilador, no puede producir

76

Page 77: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

directamente programas ejecutables, aunque los programas desarrollados con QBASIC pueden ser compilados mediante QuickBasic 4.5, PDS 7.1 o VBDOS 1.0, si se dispone de alguno de ellos.

3.2 Pascal.

Pascal es un lenguaje de programación ideado en 1968 por Niklaus Wirth en Zurich, como una evolución del lenguaje ALGOL 60. Su nombre es en honor del matemático francés Blaise Pascal, que creó una máquina de calcular. Este lenguaje fue el primero en incorporarse a los conceptos de la programación estructurada. Ha sido definido un estándar del lenguaje Pascal por ANSI/ISO en 1990.

Pascal es un lenguaje de programación desarrollado por un profesor suizo llamado Niklaus Wirth a finales de los años 60. Su objetivo era crear un lenguaje que facilitara el aprendizaje de la programación a sus alumnos. Sin embargo con el tiempo su utilización excedió el ámbito académico para convertirse en una herramienta para la creación de aplicaciones de todo tipo.

Pascal se caracteriza por ser un lenguaje de programación estructurado fuertemente tipado. Esto implica que:

El código esta dividido en porciones fácilmente legibles llamadas funciones o procedimientos. De esta forma Pascal facilita la utilización de la programación estructurada en oposición al antiguo estilo de programación monolítica.

El tipo de dato de todas las variables debe ser declarado previamente para que su uso quede habilitado.

El nombre de Pascal fue escogido en honor al matemático Blaise Pascal.

Características únicas.

A diferencia de lenguajes de programación descendientes de C, Pascal utiliza el símbolo := para la asignación en vez de =. Si bien el segundo es más conciso, la práctica ha demostrado que muchos usuarios utilizan el símbolo de igualdad para comparar valores en lugar del comparador de C que es el símbolo ==. Esta sintaxis conduce a muchos errores [bugs] difíciles de rastrear en código C. Dado que Pascal no permite dentro de expresiones y utiliza sintaxis distinta para asignaciones y comparaciones, no sufre estos errores.

Otra diferencia importante es que en Pascal, el tipo de una variable se fija en su definición; la asignación a variables de valores de tipo incompatible no están autorizadas (En C, en cambio, el compilador hace el mejor esfuerzo para dar una interpretación a casi todo tipo de asignaciones). Esto previene errores comunes donde variables son usadas incorrectamente porque el tipo es desconocido. Esto también evita la necesidad de notación húngara, esto es prefijos que se añaden a los nombres de las variables y que indican su tipo.

Implementaciones.

Las primeras versiones del compilador de Pascal, entre ellas la más distribuida fue UCSD Pascal, traducían el lenguaje en código para una máquina virtual llamada máquina-P. La gran ventaja de este enfoque es que para tener un compilador de Pascal en una nueva arquitectura de máquina solo hacía falta reimplementar la máquina-P. Como consecuencia de esto, solo una pequeña parte del interprete tenía que ser reescrita hacia muchas arquitecturas.

77

Page 78: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

En los años 1980, Anders Hejlsberg escribió el compilador Blue Label Pascal para la Nascom-2. Más tarde fue a trabajar para Borland y reescribió su compilador que se convirtió en Turbo Pascal para la IBM PC. Este nuevo compilador se vendió por $49, un precio orientado a la distribución masiva.

El económico compilador de Borland tuvo una larga influencia en la comunidad de Pascal que comenzó a utilizar principalmente en el IBM PC. Muchos aficionados a la PC en busca de un lenguaje estructurado reemplazaron el BASIC por este producto. Dado que Turbo Pascal, solo estaba disponible para una arquitectura, traducía directamente hacia al código de máquina del Intel 8088, logrando construir programas que corrían mucho más rápidamente que los producidos en los esquemas interpretados.

Durante los años 1990, estuvo disponible la tecnología para construir compiladores que pudieran producir código para diferentes arquitecturas de hardware. Esto permitió que los compiladores de Pascal tradujeran directamente a código de la arquitectura donde correría.

Con Turbo Pascal versión 5, Borland, agregó programación orientada a objetos a Pascal.

Sin embargo, Borland después decidió mejorar esa extensión del lenguaje introduciendo su producto Delphi, diseñado a partir de estándar Object Pascal propuesto por Apple como base. Borland también lo llamó Object Pascal en las primeras versiones, pero cambio el nombre a lenguaje de programación Delphi en sus últimas versiones.

3.3 C.

C es un lenguaje de programación creado en 1969 por Ken Thompson y Dennis M. Ritchie en los Laboratorios Bell como evolución del anterior lenguaje B, a su vez basado en BCPL. Al igual que B, es un lenguaje orientado a la implementación de Sistemas Operativos, concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque también se utiliza para crear aplicaciones.

Se trata de un lenguaje fuertemente tipado de medio nivel pero con muchas características de bajo nivel. Dispone de las estructuras típicas de los lenguajes de alto nivel pero, a su vez, dispone de construcciones del lenguaje que permiten un control a muy bajo nivel. Los compiladores suelen ofrecer extensiones al lenguaje que posibilitan mezclar código en ensamblador con código C o acceder directamente a memoria o dispositivos periféricos.

La primera estandarización del lenguaje C fue en ANSI, con el estándar X3.159-1989. El lenguaje que define este estándar fue conocido vulgarmente como ANSI C. Posteriormente, en 1990, fue ratificado como estándar ISO (ISO/IEC 9899:1990). La adopción de este estándar es muy amplia por lo que, si los programas creados lo siguen, el código es portable entre plataformas y/o arquitecturas. En la práctica, los programadores suelen usar elementos no-portables dependientes del compilador o del sistema operativo.

Historia

Desarrollo inicial

El desarrollo inicial de C se llevó a cabo en los Laboratorios Bell de AT&T entre 1969 y 1973; según Ritchie, el periodo más creativo tuvo lugar en 1972. Se le dio el nombre "C" porque muchas de sus características fueron tomadas de un lenguaje anterior llamado "B".

78

Page 79: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Hay muchas leyendas acerca del origen de C y el sistema operativo con el que está íntimamente relacionado, Unix. Algunas de ellas son:

El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no tenían suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa máquina no tenía sistema operativo, así que decidieron escribir uno. Finalmente decidieron portar el sistema operativo del PDP-11 que había en su oficina, pero era muy costoso, pues todo el código estaba escrito en lenguaje ensamblador. Entonces decidieron usar un lenguaje de alto nivel y portable para que el sistema operativo se pudiera portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de las funcionalidades necesarias para aprovechar algunas características avanzadas del PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.

La justificación para obtener el ordenador original que se usó para desarrollar Unix fue crear un sistema que automatizase el archivo de patentes. La versión original de Unix se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para poder reescribir el sistema operativo.

En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix, originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Este fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en Algol en 1961).

UNIDAD V. PROGRAMACIÓN ORIENTADA A OBJETOS.

La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.

De esta forma, un objeto contiene toda la información, (los denominados atributos) que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases (e incluso entre objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos). A su vez, dispone de mecanismos de interacción (los llamados métodos) que favorecen la comunicación entre objetos (de una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan (ni deben separarse) información (datos) y procesamiento (métodos).

Dada esta propiedad de conjunto de una clase de objetos, que al contar con una serie de atributos definitorios, requiere de unos métodos para poder tratarlos (lo que hace que ambos conceptos están íntimamente entrelazados), el programador debe pensar indistintamente en ambos términos, ya que no debe nunca separar o dar mayor importancia a los atributos en favor de los métodos, ni viceversa. Hacerlo puede llevar al programador a seguir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen esa información por otro (llegando a una programación estructurada camuflada en un lenguaje de programación orientado a objetos).

Esto difiere de los lenguajes imperativos tradicionales, en los que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programación estructurada anima al programador a pensar sobre todo en

79

Page 80: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. Los programadores de lenguajes imperativos escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo qué realicen esos métodos en sí mismos.

Origen

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidos por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían afectar unas a las otras. La idea ocurrió para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.

La programación orientada a objetos tomó posición como la metodología de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++ , una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación orientada a eventos.

Las características de orientación a objetos fueron agregadas a muchos lenguajes existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp, Pascal, y otros. La adición de estas características a los lenguajes que no fueron diseñados inicialmente para ellas condujo a menudo a problemas de compatibilidad y a la capacidad de mantenimiento del código. Los lenguajes orientados a objetos "puros", por otra parte, carecían de las características de las cuales muchos programadores habían venido a depender. Para saltar este obstáculo, se hicieron muchas tentativas para crear nuevos lenguajes basados en métodos orientados a objetos, pero permitiendo algunas características imperativas de maneras "seguras". El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores.

La Programación Orientada a Objetos (POO) como solución

La programación orientada a objetos es una nueva forma de programar que trata de encontrar solución a estos problemas. Introduce nuevos conceptos, que superan y amplían conceptos antiguos ya conocidos. Entre ellos destacan los siguientes:

Objeto: entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad ("métodos"). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa).

Clase: definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas.

Método: algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

80

Page 81: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Evento: un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente.

Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó.

Propiedad o atributo: contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecución de algún método.

Estado interno: es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos).

En comparación con un lenguaje imperativo, una "variable" no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto.

Características de la POO

Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):

Abstracción: cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

Encapsulamiento: también llamado "ocultación de la información". Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento correspondiente al objeto que se esté usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden

81

Page 82: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un objeto pertenece a más de una clase se llama herencia múltiple; esta característica no está soportada por algunos lenguajes (como Java).

Lenguajes orientados a objetos

Entre los lenguajes orientados a objetos destacan los siguientes:

Ada C++ C# VB.NET Clarion Delphi Eiffel Java Lexico (en castellano) Objective-C Ocaml Oz PHP PowerBuilder Python Ruby Smalltalk

Conceptos generales de la programación orientada a objetos.

Clase: Es una plantilla que define la estructura de un conjunto de objetos, que al ser creados se llamarán las instancias de la clase. Esta estructura está compuesta por la definición de los atributos y la implementación de las operaciones (métodos).

Objeto: Es la instanciación de una clase, es decir, una ocurrencia de esta, que tiene los atributos definidos por la clase, y sobre la que se puede ejecutar las operaciones definidas en ella.

Identidad: Caracteristica de cada objeto que lo diferencia de los demás, incluyendo de aquellos que pudieran pertenecer a la misma clase y tener los mismos valores en sus atributos.

Herencia: La herencia es uno de los mecanismos de la programación orientada a objetos, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad. Una de sus funciones más importantes es la de proveer Polimorfismo y late binding.

La idea es la de partir de las situaciones más generales e ir derivando hacia las más particulares, creando categorías, de la misma forma en que piensa el ser humano.

1. Especificaciones para el pseudocódigo.

1.1 Declaración de clases y subclases.1.2 Declaración de objetos, datos estructurados y métodos.

82

Page 83: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

1.3 Operaciones básicas entre objetos.

2. Proceso para el desarrollo de soluciones.

La metodología de modelado de objetos tiene las siguientes etapas.

Análisis. El método de análisis es una abstracción precisa y concisa de los requerimientos del usuario sobre lo que realizará el sistema y no como lo hará. Un buen modelado puede ser entendido y croticado por expertos de la aplicación que no son programadores.

Abstracción. Consiste en enfocar aspectos esenciales de una entidad e ignorar las propiedades accidentales.

Diseño del sistema. El objetivo es organizar en subsistemas basados en la estructura del análisis y la arquitectura propuesta.

Diseño de objetos. El diseñador adiciona detalles al modelo del diseño de acuerdo a la estrategia establecida durante el diseño del sistema.

Implementación. La programación debe ser relativamente meenor y una parte mecánica del ciclo de desarrollo, porque las decisiones difíciles deben hacerse durante el diseño.

Métodos. Un método es la implementación de una operación para una clase. Sin embargo, cada método debe ser iplementado por diferentes piezas de código y dependen sólo de la clase del objeto.

2.1 Definición del problema.

2.2 Identificar los objetos y sus clases.

2.3 Definir los métodos requeridos para cada objeto y clase.

2.4 Desarrollo del programa principal.

83

Page 84: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

3. Lenguajes de programación orientada a objetos.

3.1 Smalltalk

Smalltalk es un sistema informático que permite realizar tareas de computación mediante la interacción con un entorno de objetos virtuales. Se puede considerar que un Smalltalk es un mundo virtual donde viven Objetos que se comunican mediante el envio de mensajes.

Un sistema Smalltalk esta compuesto por:

Máquina virtual Imagen virtual que contiene todos los objetos del sistema Lenguaje de programación (también conocido como Smalltalk) Biblioteca de Objetos reusables Entorno de desarrollo

Los orígenes de Smalltalk se encuentran en las investigaciones realizadas por Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg y otros durante los años setenta en el Palo Alto Research Institute de Xerox (conocido como Xerox Parc), para la creación de un sistema informático orientado a la educación. El objetivo era crear un sistema que permitiese expandir la creatividad de sus usuarios, proporcionando un entorno para la experimentación, creación e investigación.

84

Page 85: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

Se busca que todo lo que se pueda realizar con un ordenador se pueda realizar mediante un Sistema Smalltalk, por lo que en algunos casos se puede considerar que incluso sirve como Sistema Operativo.

Smalltalk es considerado el primero de los lenguajes orientados a objetos (OOP). En Smalltalk TODO es un objeto, incluidos los números reales o el propio entorno Smalltalk.

Como lenguaje tiene las siguientes características:

Orientación a Objetos Pura Tipado dinámico Interacción entre objetos mediante envio de mensajes Herencia simple y con raíz común Reflexión completa Recolección de basura Multiplataforma Interpretado

Smalltalk ha tenido gran influencia sobre otros lenguajes como Java o Ruby, y de su entorno han surgido muchas de las prácticas y herramientas de desarrollo promulgadas actualmente por las metodologías ágiles (refactorización, desarrollo incremental, desarrollo dirigido por tests, etc.).

A pesar de ser un lenguaje muy simple, muy poderoso, y que promueve buenas prácticas de programación, Smalltalk (hasta el 2002) no había llegado a ser un lenguaje muy popular. Esto se debe a la poca aceptación de lenguajes interpretados en los años 1980 y 1990. A pesar de esto algunas empresas como Digitalk, Visual Works e IBM llegaron a tener relativo éxito con la plataforma como una herramienta de desarrollo rápido que competía contra herramientas como Power Builder y en menor grado contra Visual Basic que eran muy populares en los años 80 y 90.

3.3 C++

C++ es un lenguaje de programación, diseñado a mediados de los ochenta, por Bjarne Stroustrup, como extensión del lenguaje de programación C.

Es un lenguaje híbrido, que se puede compilar y resulta más sencillo de aprender para los programadores que ya conocen C. Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes como ROOT (enlace externo). Las principales características del C++ son: el soporte para programación orientada a objetos y el soporte de plantillas o programación genérica (templates). Por ende, se puede decir que C++ es un lenguaje que abarca tres paradigmas de la programación: La programación estructurada, la programación genérica y la programación orientada a objetos.

Además posee una serie de propiedades difíciles de encontrar en otros lenguajes de alto nivel:

Posibilidad de redefinir los operadores (sobrecarga de operadores) Identificación de tipos en tiempo de ejecución (RTTI)

C++ está considerado por muchos como el lenguaje más potente, debido a que permite trabajar tanto a alto como a bajo nivel, sin embargo es a su vez uno de los que menos automatismos trae (obliga a hacerlo casi todo manualmente al igual que C) lo que "dificulta" mucho su aprendizaje.

85

Page 86: Tutorial de Lógica Computacional y Programación

Tutorial de Lógica Computacional y Programación M.S.C. Alejandro Cárdenas Núñez

El nombre C++ fue propuesto por Rick Masciatti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, "C++" significa "uno más de C" y se refiere a que C++ es una extensión de C.

3.3 Turbo Pascal.

Turbo Pascal o Borland Pascal es el IDE más utilizado en ambientes MS-DOS a la hora de programar en Pascal. Creado por Borland, es el predecesor del IDE Delphi.

La primera versión data de 1983. A partir de la versión 5.5, publicada en 1989, se añade soporte para programación orientada a objetos (Object Pascal). Esta versión puede conseguirse gratuitamente en la web de Borland desde 2002.

La última edición, Borland Pascal 7.0, podía compilar para MS-DOS y Windows. Fue sustituido por Delphi en 1995.

86