You are on page 1of 54

FUNDAMENTOS DE PROGRAMACIÓN

Unidad 1: programas de computadora

1. Introducción

Casi cualquier problema en las áreas de tecnología servicios y negocios


puede ser resuelto con programas de computadora, estas soluciones
generalmente son más confiables y de menor costo.

Los programas de computadoras son parte esencial para la solución de


problemas a cualquier nivel, estas soluciones son llamadas aplicaciones y
son realizadas por un equipo multidisciplinario donde se encuentran los
programadores, diseñadores y analistas de sistemas, entre otros
especialistas.

Los programadores utilizan lenguajes de programación para desarrollar las


aplicaciones, estos lenguajes sirven como puente de enlace entre el análisis
realizado por el equipo de desarrolladores y la capacidad de cálculo que
ofrece la computadora. En otras palabras por medio del lenguaje de
programación, el programador le indicará al computador la secuencia de
instrucciones que se deben ejecutar para obtener la solución esperada por
los clientes.

Por todo lo anteriormente mencionado deducimos que el programador debe


tener cierta lógica para trabajar con el lenguaje, esto es, debe saber
exactamente las capacidades brindadas por el lenguaje y mas aun debe
tener nociones claras de los fundamentos generales de la programación.

La programación requiere una serie de conocimientos básicos comunes a


cualquier lenguaje de programación que permitan indicarle al computador
inequívocamente las tareas a realizar. Dichos conocimientos se conocen
como fundamentos de programación, los cuales son un conjunto de reglas
técnicas y conceptos que ayudan a definir lo que se puede hacer con un
lenguaje de programación y así dar los primeros pasos para la solución de
problemas computacionales.

2. Sistema de procesamiento

Un ordenador es una maquina de procesamiento de información. Maquina


porque tiene cables, circuitos y otros elementos mecánicos; de
procesamiento porque es capaz de transformar o procesar datos y de
información porque maneja conjuntos ordenados de datos.

3. Algoritmos

Proceso para resolver problemas.


Conjunto de acciones o secuencia de operaciones que ejecutadas en un
determinado orden resuelven un problema planteado.
Creado por: Abú Jafar Mohammed Imn Musa Khwararizmi

Características:
 Tiene que estar bien definido
 Tiene que ser preciso
 Tiene que ser finito

Básicamente un algoritmo es un proceso que define una serie finita de


pasos sencillos y sin ambigüedades para la solución de un problema.

La programación consiste adaptar un algoritmo al ordenador. El algoritmo


es independiente de la implementación en algún lenguaje de programación.

4. Metodología para diseñar algoritmos

El diseño de un algoritmo es un proceso creativo ya que no existe un


conjunto de reglas que indiquen expresamente como escribir un algoritmo
correctamente.

Sin embargo, existen una serie de pasos que permiten resolver el problema
de una manera más conveniente:

 Análisis del problema


 Diseño del algoritmo
 Verificación del algoritmo

4.1 Análisis del problema

El primer paso es identificar el problema. Se debe revisar cuidadosamente


el problema para determinar que tipo de información se necesita producir
como salida. Luego se identifica toda la información que se necesita para
encontrar la solución. En otras palabras es importante considerar lo que se
nos esta pidiendo, con que elementos se cuenta y cuales se deben solicitar
para así establecer el camino a seguir o la solución a implementar.

4.2 Implementación del algoritmo

Es necesario buscar la manera más fácil para simplificar la propuesta. Una


forma de hacerlo es identificar los procesos más importantes y colocarlos en
orden ascendente según su importancia y precedencia, esto sirve como
algoritmo inicial. Este puede ser refinado en sucesivas operaciones hasta
obtener la solución más detallada y más fácil de traducir a un lenguaje de
programación.
4.3 Verificación del algoritmo
Cuando el algoritmo está listo, es necesario comprobar que cumple con los
procesos diseñados y produce el resultado esperado. Una manera de
hacerlo es por medio de la ejecución manual, que consiste en realizar una
prueba con datos significativos y comprobar que al ejecutar todos los
procesos se obtienen los resultados esperados.

5. programas de computadora

Es una secuencia de instrucciones que le indican al computador que realice


operaciones específicas para lograr un resultado deseado. Consiste en uno o
más módulos o rutinas, cada uno de los cuales puede estar compuesto de
varios subprogramas. Un programas es un conjunto de instrucciones que
ejecutadas ordenadamente resuelven un problema, es la implementación de
un algoritmo.

Un programa de computadora no es:


 Una caja mágica
 Intrínsicamente correcto.

Un programa de computadora es:


 Una solución a un problema.
 Secuencia de instrucciones hechas para ejecutarse en una
computadora
 Sólo tan correcto como un programador lo haya hecho.

1. Definiciones básicas

Lenguaje de alto nivel: es un lenguaje de programación orientado al


problema, es el más cercano al lenguaje humano. Ejemplo: cobol, PL/I,
fortran, java, etc.

Algunos lenguajes de alto nivel se denominan orientados a objetos (ó


OOPL): smalltalk, java, c++, eiffel, etc.

Ventajas:
 Son independientes del procesador.
 Fáciles de aprender, implementar y mantener.
 Tienen carácter genérico.

Desventajas:
 Menos eficientes en el manejo de los recursos.
 Requiere un proceso de traducción.

Lenguajes de bajo nivel (ensamblador): es un lenguaje fuente que usa


el programador para codificar sentencias simbólicas que un compilador
puede convertir una a una en instrucciones de lenguaje de maquina, hace
uso de mnemotecnicos, abreviaturas, para representar instrucciones de
maquina.

Ventajas:
 No es tan complicado como el lenguaje de maquina.
 Eficiente en el manejo de los recursos.

Desventajas:
 Cada procesador tiene su propio juego de instrucciones en
ensamblador.
 Debe ser traducido.

Lenguaje de maquina: puede ser interpretado directamente por los


circuitos internos de la computadora y está basado de ceros (0) y unos (1).

Ventajas:
 No necesita ser traducido.
 Opera directamente con la maquina.
 Puede llegar a ser muy eficiente en el manejo de los recursos.

Desventajas:
 Extremadamente difícil de aprender, implementar y mantener.
 Es único y particular de cada procesador.

Compilar: traducir un programa hecho en un lenguaje de alto nivel a un


lenguaje de maquina. Generalmente una instrucción de alto nivel se traduce
a varias de lenguaje de maquina.

El proceso de compilar se divide en 2 pasos:


1. Compilar las instrucciones de alto nivel para producir lo que se
denomina el código objeto.
2. Enlazar (link) que es tomar el código objeto generado y cualquier
otro código objeto requerido para que el programa este completo
y colocarlos juntos para tener el programa ejecutable.

Base de datos: colección de datos completa e integrada, organizada para


evitar duplicados, que permite recuperar información para satisfacer a una
amplia variedad de usuarios,

Sistema operativo: es una colección organizada de software que se usa


para ayudar y controlar las operaciones de una computadora.

Almacenamiento: se refiere a un dispositivo en el que los datos se


pueden ingresar y retener y posteriormente recuperar.

2. Crear un programa de computadora

Para crear un programa el programador debe escribir las instrucciones del


código fuente en un editor. Este conjunto de instrucciones se denominan
archivo fuente, éste es la entrada para el compilador, que lo convierte en un
conjunto de comandos entendibles por el computador llamado “programa
ejecutable”

Si se encuentra algún error en la sintaxis de los comandos en el archivo


fuente, el compilador listará cada uno de ellos y no produce el ejecutable.
3. Funcionamiento del compilador/enlazador

El compilador crea un archivo objeto y un listado del programa respalda la


salida. El archivo objeto se usa como entrada al enlazador para realizar lo
que se denomina el paso de “edición de enlace”. El enlazador combina el
archivo objeto con otros archivos objetos ya existentes (éstos generalmente
se encuentran en un archivo en disco llamado librería de enlace) para
producir un programa ejecutable.

4. Datos, tipos de datos, operaciones incorporadas

Para que un programa de computadora pueda ser ejecutado debe ser


cargado en memoria. La unidad del procesamiento del computador sólo
puede trabajar con los datos instrucciones cargadas en memoria.

1.1 Dato
Es cualquier elemento de información que se usa a lo largo del programa,
son elementos sobre los que se opera cuando se efectúa alguna instrucción.

Normalmente un dato tiene un nombre que lo identifica y distingue de los


demás, dicho nombre no es más que otra forma de referenciar la dirección
de memoria que ocupa el dato.

Los datos pertenecen a un tipo de dato específico, que indica el rango de


valores que dicho dato puede aceptar y las operaciones que sobre él se
pueden hacer.

1.2 Tipo de dato


Es una definición que agrupa los valores válidos para un conjunto de datos
y las operaciones que se pueden realizar sobre ellos.

Los tipos de datos pueden ser:

 Primitivo: tipos básicos o simples predefinidos en el sistema o


definidos por el usuario.
o numéricos: enteros, real.
o lógicos o boléanos.
o carácter.
o cadena o string.
 Complejos: agregados por el programador.

Los diversos lenguajes de programación pueden añadir más tipos de datos.


En algunos lenguajes se definen tipos especiales para la fecha y hora, sobre
todo en los mas modernos tales como java.

1.3 Constantes y variables


Las constantes son instancias de un tipo de dato cualquiera que tiene un
valor fijo, que se le da cuando se define. Este valor no puede ser modificado
durante la ejecución del programa.

Las variables son instancias de un tipo de dato cualquiera cuyo valor pude
cambiar durante la ejecución del programa. Las variables deben declararse
indicando su nombre y su tipo, antes de usarlas.

El nombre que se le da a una variable tiene que ser significativo, éste será
un conjunto de caracteres que dependiendo del lenguaje pueden tener
ciertas restricciones, a esto se le conoce como reglas para construir
identificadores.

Un identificador es una palabra que no es propia del lenguaje, la construye


el programador basándose en ciertas reglas.

En algunos lenguajes las variables pueden tomar un valor por defecto si al


declararla no se le asigna un valor inicial.

Las constantes pueden llevar asociados un nombre o no, si no lo llevan se


llaman literales. Su valor hay que darlo al momento de la declaración y ya
no puede cambiar a lo largo del programa. Y en cuanto al tipo de dato en
algunos lenguajes hay que ponerlo, en otros no hace falta.

1.4 Relación entre variables y constantes en memoria

Al declarar una variable o constante con nombre, el sistema reserva un


espacio de memoria. El espacio reservado depende del tipo de dato de la
variable o constante.

En esa zona es en la que se guarda el valor asociado a la variable o


constante y cuando el programa use la variable o constante, irá a ese lugar
a buscar el valor.

2. Expresiones: tipos y operadores

Una expresión es una combinación de constantes, variables, signos de


operación, paréntesis y nombres especiales, con un sentido univoco y
definido. De la evaluación de una expresión resulta un único valor o
resultado.

Toda expresión tiene asociada un tipo que se corresponde con el tipo del
valor que devuelve la expresión cuando se evalúa. Existen expresiones
numéricas y lógicas.
2.1 Expresiones numéricas: operadores aritméticos
Es una combinación de variables y constantes numéricas con operadores
aritméticos y que al evaluarla devuelve un valor numérico. Los operadores
más comunes: +,-,*,/.

Otras operaciones aritméticas soportadas en algunos lenguajes de


programación son:

Operación resto: devuelve el resto de una división

lenguaje operador ejemplo resultado


c % 5%2 1
pascal mod 5mod2 1

Operación división entera: devuelve el cociente de una división entera en la


que no se consideran los decimales.

lenguaje operador ejemplo resultado


c / 5/2 2
pascal div 5 div 2 2

Operación potencia: devuelve el valor de una base elevada a una potencia


dada.
lenguaje operador ejemplo resultado
basic ^ 5^2 25

Todos los anteriores son operadores binarios, el operador de coloca en el


medio y toma 2 operandos. También existen los operadores que utilizan
sólo un operando y se denominan unarios.

El signo negativo: devuelve el valor actual del operando multiplicado por


(-1)

lenguaje operador ejemplo resultado


c - x=5; -x x=-5

Operador decremento e incremento: devuelven el valor actual


decrementado o incrementado en una unidad.

--5;
++5;

2.2 Reglas de precedencia

El orden en que se evalúan los operadores aritméticos dentro de una


expresión influye directamente en el resultado que retorna en dicha
expresión veamos el siguiente ejemplo para comprender:

2+3*2+3;
Si se evalúa en el orden de aparición tendríamos algo como lo siguiente
(((2+3)*2)+3);
Resultado: 13
Si se evalúa primero las sumas y luego la multiplicación se tendrá la
siguiente expresión:
(2+3)*(2+3);
Resultado: 25

Si se evalúa primero la multiplicación y luego la suma se tendría la


expresión:
2+(3*2)+3;
Resultado: 11

Entonces, como resolver esta situación potencialmente problemática?


La solución es aplicar prioridad entre los operadores de modo que ante la
posibilidad de usar varios operadores aritméticos en una misma expresión
siempre aplicaremos primero el de mayor prioridad.

Cada lenguaje puede establecer sus propias reglas de prioridad. Siempre se


puede utilizar los paréntesis para definir y cambiar el orden en que se
evalúa una expresión aritmética.
El orden de precedencia definido comúnmente para los operadores
aritméticos básicos es:
1. ^
2. *, /, div y mod
3. +y-

Entre dos operadores que tienen la misma precedencia para resolver la


ambigüedad hay que usar la regla de asociatividad. La más normal es la de
la asociatividad por la izquierda.

1.2 expresiones lógicas: operadores relaciónales y lógicos

Una expresión lógica es aquella que solo puede devolver uno de dos valores
(verdadero o falso). Los valores que pueden aparecer en una expresión
lógica son de dos tipos. Lógicos y relacionales. Los operadores lógicos solo
trabajan sobre expresiones o datos que retornan valores booleanos. Los
operadores relacionales trabajan con expresiones numéricas para realizar
comparaciones que retornan un valor booleanos. Es común tener
expresiones que combinan tanto los operadores lógicos como relacionales,
en estas expresiones se evalúan más de una condición o relación por medio
de operadores lógicos.

Los operadores relacionales mas usados son:


< menor que
> mayor que
= igualdad (= =)
<> diferente (en c: ¡=)
<= menor o igual que
=> mayor o igual que
¿Cómo se evalúa una expresión relacional?
1. se evalúa el primer operando y se sustituye por su valor
2. se evalúa el segundo operando y se sustituye por su valor.
3. se evalúa el operador relacional y se devuelve el valor booleano
correspondiente.

((5*4)+1 –(5^2)) <(2-1);


-4 < 1; la expresión retorna a verdadero.

UNIDAD 2: CONCEPTOS DE DISEÑO ESTRUCTURADO


1. Introducción
Las técnicas para facilitar el entendimiento del problema son:
 El diseño TOP-DOWN (de arriba hacia abajo)
 Los diagramas de estructura
 Los diagramas de flujo
 El pseudocódigo

2. Conceptos de Diseño Estructurado


Las características del diseño estructurado son:
 Tiene una entrada y una salida con variaciones ocasionales
 Utiliza programación modular
 Elimina el uso de la sentencia GOTO.

3. Diseño Top Down (refinamiento “paso a paso”)


El diseño top down, que implica ir de lo más general a lo más específico, es
el proceso de dividir un problema en subproblemas más pequeños.

Para entender el diseño top down vea el siguiente problema:

Se le ha solicitado que escriba un programa para una tienda de


videos. El objetivo del programa es permitir que un cliente registrado
en la tienda alquile videos.

La tienda tiene un conjunto de reglas que deben cumplirse para que un


cliente alquile
un video, las cuales son:
 El cliente es un miembro registrado
 No tiene ningún alquiler vencido
 No debe nada a la tienda
 La película está en el inventario
 La película no está reservada

Un programa de alto nivel será:


 Alquilar un video.

Al descomponer este programa de alto nivel, se obtienen los siguientes sub-


programas:
 Verificar si el cliente es un miembro registrado
 Verificar los alquileres vencidos
 Verificar si el miembro debe algún dinero
 Verificar si la película está en el inventario
 Verificar si la película ha sido ya reservada
Al descomponer de nuevo, cada uno de los pasos anteriores, se obtiene:

1. Verificar si el cliente es un miembro registrado:


 Ingresar el número de teléfono u otra identificación del cliente en el
sistema
 Leer la pantalla para ver si el sistema ha encontrado un perfil que
coincide

2. Verificar los alquileres vencidos:


 Ver si el perfil refleja cualquier alquiler vencido en el sistema

3. Verificar si el miembro debe algún dinero:


 Ver si el perfil refleja algún cargo pendiente

4. Verificar si la película está en el inventario:


 Ingresar el nombre de la película al sistema
 Verificar si hay alguna copia que no está alquilada

5. Verificar si la película ha sido ya reservada:


 Ver si las copias que no están alquiladas no están reservadas.

De nuevo, al descomponer el sub-programa "Verificar si el cliente es un


miembro registrado"

1.1. Verificar si el cliente es un miembro registrado


 Preguntar el número de teléfono u identificación al cliente

1.2. Ingresar el número de teléfono en el sistema:


 Seleccionar del menú la opción de verificar el número de miembro
 llenar el número de teléfono del cliente en el prompt
 Presionar la tecla que indica al sistema que se está listo para que
éste verifique por un número que coincida con el que se ha ingresado

1.3. Leer la pantalla para ver si el sistema ha encontrado alguna


coincidencia
 Visualmente, verificar si el sistema dice que 'sí' o 'no' es un miembro.

4. Diagramas de Estructura
Es una manera gráfica de representar el diseño top down. Nos Permite
representar en forma clara la organización de alto nivel de un programa.

Un diagrama de estructura parcial del ejemplo anterior:

Alquilar una película

Verificar si Verificar alq. Verificar deudas Verificar sí esta Verificar si no


es miembro vencidos pendientes en Inventario está reservada

Preguntar Ingresar No Examinar Perfil


No TEL TEL
Diagrama de Estructura del Problema Anterior

5. Diagramas de Flujo
Es una representación gráfica de la lógica del diseño. Generalmente,
está a un nivel de detalle más bajo que los diagramas de estructura. Un
diagrama de flujo resulta adecuado cuando se desea seguir bajando a un
nivel con mayor detalle, tal como agregar bifurcación de condicionales y/o
iteración.

5.1 Símbolos

Líneas de flujos Conectores

Proceso
Pantalla
Entrada / salida

Condición Teclado

Principio y Fin

Entrada / salida por Disco


Subprograma

5.3 Metodología para resolver un problema con diagramas de flujo

Determinar Requerimientos
del proceso

Determinar Requerimientos
del post-proceso

Crear Diagrama de flujo

Verificar Diagrama de flujo

¿Diagrama de NO
Flujo OK?
SI
Metodología para resolver un problema con Diagrama De Flujo
FIN
6. Diagramas N-S O de Nassi-Schederman:
Es una forma de representación semejante al diagrama de flujo, pero sin
flechas y cambiando los símbolos de condición y repetición. Está
conformado por una serie de cajas de procesos que constituyen las
secuencias de acciones necesarias para presentar el algoritmo. Las cajas de
proceso o acción van unidas entre sí. Los Diagramas N-S son muy útiles
para representar diagramas estructurados.
Representación de Condiciones:
Condición

Condición
SI NO
Bifurcación

<Acción 1 > <Acción 2 >

Estructuras Repetitivas:

Mientras <Condición> <Acciones> Para var desde V1 hasta V2


Ciclos Repetitivos
<Acciones> <Acciones>
Repetir hasta <Condición>

6.1 Ejemplo de Diagrama N-S o de Nassi-Schederman


Se presenta a continuación de nuevo el problema de determinar el producto
de un conjunto de enteros representada la solución con un diagrama de N-
S.
INICIO

p=1

Leer num

Mientras (num >= O)

P = P x num
Leer num

Escribir p

FIN

Figura 2.4: Diagrama de NS para el Cálculo del Producto de Enteros

7. Pseudocódigo
El Pseudocódigo es un lenguaje de documentación de programas similar al
inglés (o español) que se parece a cualquier lenguaje de programación de
alto nivel, pero no necesita seguir ninguna regla específica, como si lo
requieren los programas que van a ser traducidos o compilados. El
pseudocódigo normalmente no es muy específico para las áreas de E/S.
El pseudocódigo tiene la ventaja que se puede crear fácilmente con
cualquier editor de texto. No hay ningún estándar en la industria definido
para los pseudocódigos.

Un ejemplo de pseudocódigo parecido a PL/I, se muestra a continuación:


do while(count = O )
do process
count = count - 1
end
Un ejemplo de pseudocódigo parecido a COBOL:
perform until count = O
perform process
subtract 1 from count
end-perform

El pseudocódigo también puede utilizar una serie de palabras claves o


palabras especiales que van indicando lo que significa el algoritmo.

Ejemplo de palabras claves en pseudocódigo:


1. Inicio y Fin: Por donde empieza y termina el algoritmo.

2. Si <condición>
Entonces <acciones>
Sino <acciones>

3. Mientras <condición> hacer

4. Repetir / hasta <condición>

5. Desde / hasta

6. Según sea (Para evaluar opciones múltiples)

Los comentarios van encerrados entre llaves.


Hay que utilizar la identación.

La estructura recomendada para los algoritmos en pseudocódigo es:

Algoritmo <nombre algoritmo>


Var
<nombre>: <tipo>
Inicio
<Instrucciones>
Fin

8. Programación Modular
Cuando se trabaja con programas grandes se hace difícil:
 Desarrollar la lógica
 Escribir el código
 Probar totalmente el código
 Realizar el mantenimiento

La solución para esto es usar la programación modular.


La programación modular rompe el programa en unidades o módulos
más pequeños y manejables. Estas unidades más pequeñas se llaman
subprogramas, procedimientos o funciones dependiendo del lenguaje
que se esté usando.

El ejemplo de la Tienda de video representado en forma modular se


presenta en la siguiente Figura.

Módulo Principal

Módulo Cliente Módulo Películas

Verificar Cliente
Verificar Existencia
Verificar
Verificar Reservaciones
Alquileres vencidos
Deudas pendientes

Representación de la Programación Modular de la Tienda de


video

UNIDAD 3: PROGRAMACIÓN ESTRUCTURADA

1. Introducción

La característica fundamental de la programación estructurada es que se


basa en el uso únicamente de tres estructuras de control. Para ello se apoya
en los siguientes conceptos:

• Recursos abstractos: Son los recursos que se tienen en el


momento de programar, Estos recursos se tienen que ir
transformando en recursos concretos.
• Diseño descendente (top down): Se trata de ir descomponiendo
el problema en niveles cada vez más sencillos
• Estructuras básicas de control: Para construir un programa se
siguen los pasos de razonamiento anteriores y al final se codifica el
programa usando tres tipos de secuencias: repetitivas, alternativas y
secuenciales.

Al final todo programa va a tener una única entrada y una única salida.
Desde la entrada tienen que existir caminos que permiten pasar por todas
las partes del programa y llegar a la salida, no se van a permitir los bucles
infinitos.

2. Estructuras Secuenciales

En las estructuras secuenciales una instrucción sigue a otra en secuencia,


es decir, la salida de una instrucción es la entrada de la siguiente.

FLUJOGRAMA Diagramas N-S PSEUDOCODIGO


Leer num
num = num * 2
Escribir num

3. Estructuras Selectivas

Se evalúa una condición y en función del resultado lógico (verdadero o


falso) se ejecuta un conjunto de instrucciones u otro. Son también
denominadas estructuras de control de flujo, estructuras condicionales y de
toma de decisiones. Hay tres tipos: simples, dobles o múltiples.

3.1 Estructura Selectiva Simple

La estructura selectiva simple es la estructura condicional elemental y


básica. Presenta la forma:

Sí <condición> entonces
<Acciones>
Fin si

Evaluamos la condición. Si el resultado es verdadero, ejecutamos el


conjunto de acciones asociadas al bloque entonces. Si el resultado es falso,
no ejecutamos acción alguna.

FLUJOGRAMA Diagramas N-S PSEUDOCODIGO


Si <condición>
SI

Condición
SI
Condición Entonces
Acciones <Acciones>
Acciones
Acciones
Fin si

3.2 Estructura Selectiva Doble


La estructura selectiva doble es una estructura condicional que evalúa una
condición dada. Si es verdad, se ejecutan el conjunto de acciones asociadas
a la parte entonces. Si es falso se ejecutan el conjunto de acciones
asociadas a la parte sino.

FLUJOGRAMA Diagramas N-S PSEUDOCODIGO

Si <condición> Entonces
Condición Condición
<Acciones>
SI No
SI Sino
Acciones Acciones <Acciones>
Acciones Acciones
Fin si
Acciones

Acciones

3.2 Estructura Selectiva de Alternativa Múltiple

Se evalúa una condición o expresión que puede tomar n valores


distintos. Según sea el valor de la expresión en ese instante de tiempo
se ejecutan las acciones correspondientes al valor. En muchos lenguajes
se conocen como sentencias Case o Switch.

Es una sentencia de la forma:

Según sea <expresión>


<valor1>: <acciones 1>
<valor2>: <acciones 2>
[<otro>: <acciones n>]
fin según

En la opción Otro: las acciones asociadas a éste se ejecutan cuando la


expresión no toma ninguno de los valores que aparecen antes. El valor
con el que se compara la expresión es dependiente de los lenguajes de
programación. Por lo general se espera un tipo de dato determinístico y
con valores secuencia les tales como los enteros y caracteres. En general
ese valor puede ser un valor constante, un rango de valores
deterministico o incluso otra condición.

FLUJOGRAMA Diagramas N-S PSEUDOCODIGO


Según sea <expresión>
<valor1>:<acciones>
Expr Expr <valor2>:<acciones>
V1 V2 Vn otr [<otro> : <acciones>]
V1 V2 Fin según
Vn

4. Estructuras Repetitivas o de Ciclo

Las estructuras repetitivas o de ciclo contienen o representan un bucle o


conjunto de instrucciones que se repiten un número finito de veces. Cada
repetición del bucle se llama una iteración. Todo bucle tiene asociada una
condición, que es la que va a determinar si se ejecuta el bucle y hasta
cuando.

Existen tres tipos de básicos de estructuras repetitivas:

1. Mientras-hacer (While do)


2. Repetir-hasta (Repeat until)
3. Desde (For)

4.1 Estructura Repetitiva Mientras-hacer

Aquí la condición de entrada al ciclo se evalúa antes realizar


cualquier iteración del bucle. Si la condición no se cumple, el ciclo no se
ejecuta y el programa continúa con la secuencia de acciones siguientes al
ciclo. Si la condición es verdadera, se comienza a ejecutar las acciones del
Mientras-hacer.

Después de la última acción, se repite el proceso de evaluación de la


condición; si la condición es verdadera de nuevo, se repite las acciones.
Este proceso se conoce como un bucle y continua hasta que la condición sea
falsa, y la ejecución prosigue con la sentencia siguiente del programa.

Al evaluarse la condición antes de entrar en el bucle al principio, si la


condición al ser evaluada la primera vez es falsa, no entraremos
nunca en el bucle, el bucle puede que se ejecute O veces, por tanto se
usará este tipo de bucle en el caso de que exista la posibilidad de que el
bucle pueda ejecutarse O veces.

4.2 Estructura Repetitiva Repetir-hasta

Aquí la condición del ciclo se evalúa después de realizar la primera


iteración del bucle. Este bucle se repite mientras la condición evaluada al
final se mantenga falsa. Al cumplirse la condición y ser verdadera, se sale
del bucle. De allí su nombre "repetir hasta" que se cumpla la condición.

Se repite el bucle hasta que la condición sea verdadera. En otras palabras,


el bucle se repite y ejecuta mientras la condición sea falsa. La
condición se evalúa siempre al final del bucle, si es falsa volvemos a
ejecutar las acciones, si es verdad se sale del bucle. Como la condición se
evalúa al final se pasa al menos una vez por el bucle. Es decir que
cuando un bucle se tenga que ejecutar como mínimo una vez, se puede
usar una estructura repetir hasta. Si se quiere usar una estructura mientras
hacer, la única diferencia es que se debe asegurar que la condición de
entrada sea verdadera para dicho ciclo.

4.3 Estructura Repetitiva Desde


Se usa cuando se sabe el número exacto de veces que se va ha
ejecutar el bucle. El bucle lleva asociado una variable que se denomina
variable índice, a la que le asigna un valor inicial y se establece cual va a
ser su valor final. La variable índice se incrementa o decrementa en cada
iteración del bucle en un valor constante de manera automática. El
programador no se tiene que ocupar de actualizar el valor de esta variable
en cada iteración del bucle; es una operación implícita.

Por tanto en cada iteración del bucle, la variable índice se actualiza


automáticamente y cuando alcanza el valor que se establecido como final se
termina la ejecución del bucle.

5. Estructuras Anidadas

Las estructuras selectivas como los bucles se pueden escribir unas dentro
de otras. Esto se conoce como estructuras anidadas.

5.1 Anidación de Condicionales

En ocasiones se requiere evaluar un conjunto de condiciones en forma


secuencial y separada. En estos casos, se recomienda utilizar una anidación
de condicionales. La ventaja de anidar sentencias condicionales, es que
cuando una se cumple no hay por que evaluar las condiciones que están
debajo o que le siguen.

Sintaxis:

Si <condicion1> Entonces <sentencia1>


Sino si <condicion2> Entonces <sentencia2>
Sino si <condicion3> Entonces <sentencia3>
Fin si
Fin si
Fin si

OJO: La sentencia según sea (case) siempre equivale a una anidación de


condicionales, pero lo contrario no es cierto.

5.2 Bucles Anidados

Al igual que se pueden colocar unas expresiones dentro de otras, los bucles
pueden estar unos dentro de otros. Al anidar bucles hay que tener en
cuenta que el bucle interno funciona como una sentencia más en el
bloque del bucle externo, por lo tanto, en cada iteración del bucle
externo se van a ejecutar todas las iteraciones del bucle interno.

Los bucles deben estar bien formados y ser sintácticamente, nunca pueden
cruzarse las sentencias de los bucles. Si se tiene un ciclo desde que
internamente posee un ciclo mientras hacer, es necesario finalizar las
sentencias o instrucciones del ciclo más interno en este caso mientras-hacer
antes de colocar la culminación del ciclo externo desde.
Si el bucle más externo se repite n veces y el más interno se repite m
veces, si por cada iteración del más externo se repite el más interno, el
número total de iteraciones será el producto de m * n.

Los bucles que se anidan pueden ser de igual o distinto tipo. Ejemplo:

Desde i=1 hasta 8


Desde k=1 hasta 5
Escribir "Profesor n” i “introduzca asignatura Nº” k Leer
asignatura
Fin desde
Fin desde

Note como cada ciclo interno termina antes de cerrar el más


Externo.

No existen limitaciones en cuanto al número de sentencias y estructuras


anidadas que se pueden anidar en un mismo bloque, esto depende del
lenguaje que se está usando. No obstante no se recomienda abusar de los
anidamientos ya que resultan en un código difícil de leer y por lo tanto difícil
de mantener.

6. Control de Datos de Entrada

Existen una serie de situaciones comunes en programación donde se toman


datos desde un dispositivo de entrada y se requiere de alguna forma de
control implementada por bucles.

6.1 Usando un Valor Centinela que Determina el Fin del Bucle

En este caso se espera la entrada de un valor centinela para decidir si se va


ingresar al ciclo o no de entrada de datos.

El bucle se va a repetir mientras no se lea un valor determinado.

La primera lectura se va a realizar fuera del bucle. Si al ingresar el dato de


entrada, éste es el valor centinela no se entra en el bucle y se seguirá con
el resto del algoritmo. En caso contrario, se entra en el bucle para seguir
con la entrada de datos.

Se recomienda utilizar una estructura Mientras-hacer.

Ejemplo:

Centinela = 9
Leer opción
Mientras (opción <> centinela) hacer
<Acciones>
Leer opción
Fin mientras
6.2 Lectura Secuencial de un Archivo

Los datos de entrada pueden estar en un archivo, el cual debe ser leído
desde el primer al último registro para recuperar todos los datos, para ello
se realiza una lectura secuencial de todos los registros del archivo.

Una estrategia común de lectura para un archivo con acceso secuencial es:

• Abrir el archivo,
• Leer un registro del archivo,
• Verificar si no es fin de archivo al entrar a un ciclo para recorrer el
archivo realizar operaciones con los datos de entrada,
• Volver a leer datos del archivo, con cada operación de lectura se
avanza de registro en registro en los datos del archivo
• Regresar al ciclo hasta que sea fin de archivo.

Ejemplo:

Archivo mi_archivo
Abrir_Archivo (mi_archivo)
Leer_Archivo (mi_archivo)
Mientras (NOT (Fin_de_Archivo(mi_archivo))) Hacer
<acciones con los datos del archivo>
Leer_Archivo (mi_archivo)
Fin mientras

6.3 Cuando se Sabe el Número Exacto de Veces que se Ejecuta


una

Acción o Proceso

Cuando se sabe el número exacto de veces que se ejecuta una acción o


proceso la opción natural para realizar el control de entrada es utilizar
un ciclo o bucle Desde...Hasta.

Normalmente, el número de veces que se desea repetir el proceso a


controlar es solicitado como un valor de entrada o es suministrado
desde alguna otra fuente (variable de entorno, constante, archivo de
configuración, entre otros). Una vez que se obtiene este valor, se le
asigna a la variable de índice para el ciclo Desde. Se efectúa la
operación hasta que se cumpla el número de veces deseado.

Ejemplo:

i: Entero
Mostrar "Ingrese el numero da materias a registrar:”
Leer número materias
Desde i =1 Hasta numero materias
Mostrar "Ingresar datos Materia numero “
Leer materia
<Acciones a realizar con materia>
Fin desde

6.4 Control de Datos Para no Permitir Datos Erróneos

El control de ingreso de datos para evitar datos de entrada erróneos se


usa cuando se controla al usuario para que introduzca los datos
correctos. Por ejemplo: un valor numérico dentro de un rango
determinado. En estos casos se recomienda usar un ciclo
Repetir...Hasta.

Ejemplo:

opcion: Entero
opción=0
Repetir
Mostrar "Menú:”
Mostrar "1. Crear Archivo"
Mostrar "2. Borra Archivo"
Mostrar "3. Incluir Registro"
Mostrar "4. Salir del sistema"
Mostrar "Su opción:"
Leer opción
Hasta (opción >= 1) Y (opción <= 4)

UNIDAD 4: PROCEDIMIENTOS Y FUNCIONES

1. Introducción

La programación modular es una de las técnicas fundamentales de la


programación. Se apoya en el diseño descendente y en la filosofía de
"divide y vencerás”

Siempre existirá un módulo o programa principal donde comienza la


ejecución de todo el programa. A partir de éste, se van llamando al resto de
los módulos que posea el sistema. Cada vez que se invoca a un
subprograma se le pasa la información que necesita en la llamada,
seguidamente comienza a ejecutarse y cuando éste termina su ejecución, el
control se devuelve a la instrucción siguiente a la línea de código en la cual
se efectuó la llamada en el programa o subprograma.

La estructura de un subprograma es muy similar a la estructura de un


programa normal, va a tener una información de entrada que es la que se le
pasa al hacer la llamada y que se coloca junto al nombre del subprograma.
Esta información de entrada se denomina parámetros formales del
subprograma o argumentos formales. Dentro del cuerpo del subprograma
se pueden colocar cualquier número de acciones o sentencias de código, e
incluso declarar variables y llamar a otros módulos tal como se hace desde
un programa principal. Al terminar la ejecución del modulo o subprograma
puede que este ultimo devuelva o no resultados o valores al programa que
lo llamó. A los subprogramas que pueden retornar valores
usualmente se les denominan funciones, mientras que a los
subprogramas que no poseen valor de retorno se les denomina
comúnmente procedimientos.

2. Funciones

Desde el punto de vista matemático, una función es una' operación que


toma uno o varios operandos (parámetros) y devuelve un resultado. Desde
el punto de vista algorítmico una función es un subprograma que toma uno
o varios parámetros como entrada y devuelve a la salida un único
resultado.

Existen dos tipos de funciones:

• Internas o Incorporadas: vienen definidas por defecto en el


lenguaje.
• Externas o del Usuario: las define el usuario y tienen un nombre
o identificador.

Para llamar a una función se da su nombre y entre paréntesis van los


argumentos o parámetros que se le quieren pasar a la función.

2.1 Declaración de una Función

La estructura de una función es semejante a la de cualquier subprograma.


Tendrá una cabecera con el nombre y los parámetros, y un cuerpo
con la declaración de los parámetros de la función y las
instrucciones.

2.1.1 Sintaxis

La sintaxis para la declaración de una función depende del lenguaje de


programación utilizando, se propone un esquema que usa la palabra
Función para indicar el inicio de la función seguido del identificador o
nombre, la lista de parámetros, el tipo de dato de retorno de la función y
por último el cuerpo de la función enmarcado entre sentencias de inicio y fin
de bloque de código.

Funcion <nombre funcion> (nombre parámetro: tipo): tipo retorno


Var <variables locales de la funcion>
Inicio
<acciones>
retorno <valor>
fin <nombre función>

La lista de parámetros es la información que se le tiene que pasar a la


función. Los parámetros dentro del cuerpo de la función se utilizan como
variables locales definidas en la función. Es necesario definirle a cada
parámetro su nombre y tipo de dato al momento de declarar la función. El
nombre de la función lo da el programador y debe ser un nombre
significativo.

En las variables locales se declaran las variables que se desea utilizar


dentro de la función.
Dentro del cuerpo de la función se escriben todas las acciones o sentencias
de código destinadas a cumplir el propósito de la función. Por definición una
función siempre debe devolver algún valor. Algunos lenguajes de
programación declaran un tipo de dato nulo para permitir así que las
funciones "no retornen" valores, aunque en realidad retornan un tipo no
utilizado.

Los parámetros que aparecen en la declaración de la función se denominan


parámetros formales. Los parámetros que se utilizan cuando la función es
invocada se denominan parámetros actuales o reales. Estos últimos son las
constantes, valores de retorno, expresiones, variables u otro elemento del
contexto de la llamada que es necesario pasarle a la función.

2.2 Invocar una función

Para llamar o invocar a una función se coloca el nombre de la función y


entre paréntesis se añaden los parámetros reales que necesita la función.
Los parámetros reales pueden ser variables, expresiones e incluso
constantes, pero siempre deben corresponder al mismo tipo de datos que
los parámetros formales asociados con la función.

Por ejemplo:

Funcion sumarEnteros (num1: Entero, num2:Entero): Entero


Var
resultado: Entero
Inicio
Resultado=num1 + num2
Retornar resultado
Fin sumarEnteros
La función puede ser llamada desde el programa principal o desde cualquier
otro subprograma así:
Var
resultado : Entero
numero : Entero
Inicio
Resultado=sumarEnteros(8, 9)
Mostrar “8 + 9 es: " resultado
numero=12;
resultado= sumarEnteros(numero, 5)
Mostrar "12 + 5 es:” resultado
Mostrar "2 + 2 es:” sumarEnteros(2, 2)
Fin

Para que una función pueda ser invocada desde cualquier parte de un
programa, es necesario que la definición de dicha función ya sea del
conocimiento previo del compilador antes de usarla.

A través de los parámetros reales de la llamada se proporciona a la función


la información que necesita para cumplir su cometido y, al momento de
hacer la llamada se produce una asociación automática entre los
parámetros reales y los parámetros formales. Esta asociación se realiza
según el orden de aparición de izquierda a derecha de los parámetros
formales de la función.

Como regla general el parámetro real y su correspondiente parámetro


formal deben ser del mismo tipo.

2.3 Pasos para Hacer la Llamada a una Función

Cuando se efectúa la llamada, se cede el control a la función y se asocia, es


decir, se asigna el valor de cada parámetro real al parámetro formal
correspondiente.

Si la llamada a la función es válida entonces se ejecutan las acciones de la


función hasta que se encuentre una instrucción del tipo retorno <valor>.
Esta instrucción pondrá fin a la ejecución de la función y el control se pasa
al punto siguiente de donde se efectuó la llamada. Pueden existir varias
sentencias de retorno en la misma función, colocadas en diferentes bloques
de código y normalmente dependen de sentencias condicionales para su
ejecución.

3. Procedimientos

Un procedimiento es un subprograma que realiza una determinada tarea,


pero que tras ejecutar esa tarea no tiene ningún valor asociado a su
nombre como ocurre en las funciones. Si un procedimiento devuelve
información, lo hace a través de parámetros de entrada-salida o de salida.

Al invocar a un procedimiento, se le cede el control, comienza a ejecutarse


y cuando termina devuelve el control a la instrucción siguiente al punto
donde se efectuó la llamada.

3.1 Diferencias entre Funciones y Procedimientos

• Las funciones están diseñadas para devolver un único valor y un


procedimiento puede devolver ningún o muchos valores por medio de
sus argumentos o parámetros.
• Ninguno de los resultados devueltos por el procedimiento se asocia a
su nombre como ocurre con la función.
• Mientras que la llamada a una función siempre puede formar parte de
una expresión, la llamada a un procedimiento es una instrucción
aislada, que por sí sola no puede formar parte de una expresión.

3.2 Sintaxis

La sintaxis para declarar un procedimiento es esencialmente la misma que


para definir una función, sólo que no se coloca un tipo de retorno
asociado. La cabecera va a estar formada por el nombre del procedimiento
que será un identificador válido y que debe ser significativo. Luego, entre
paréntesis, se deben colocar los parámetros o argumentos formales que
requiere el procedimiento. Por cada parámetro es necesario indicar el tipo
de paso de parámetro.

Hay dos tipos fundamentales de paso de parámetros:

• Por valor
• Por referencia

Si no se declara explícitamente el tipo de paso de parámetros, se asume por


omisión el tipo de paso de parámetros por valor.

En el cuerpo del procedimiento se colocan todas las sentencias necesarias


para cumplir con su tarea y no habrá ninguna sentencia de tipo retorno
<valor>. Ahora bien, si el procedimiento devuelve resultados a través de
sus parámetros, cosa que sólo podrá hacer a través de los parámetros que
se pasan por referencia, tendrán que existir sentencias de asignación de
valores a estos parámetros pasados por referencia para devolver los
resultados.

3.3 Pasos para Hacer la Llamada a un Procedimiento

En primer lugar, desde el programa principal o subrutina, se coloca el


nombre del procedimiento con su lista de parámetros reales entre
paréntesis como una sentencia única. Esto cede el control al procedimiento
que se llama y después de esto lo primero que se hace es sustituir cada
parámetro formal de la definición por el parámetro actual o real de la
llamada asociado a él. Esta asociación entre parámetros formales y reales
se realiza de izquierda a derecha por orden de ubicación. Para que se pueda
producir la asociación tienen que existir el mismo número de parámetros
formales que reales y además, el tipo de dato tiene que coincidir con el del
parámetro formal asociado. Se produce un error en la llamada al
procedimiento si no se cumple alguna de estas condiciones

Finalmente se cede el control a la instrucción siguiente a la que efectuó la


llamada al procedimiento.

Ejemplo:

Procedimiento mitad(num:entero, ent-sal med: real)


Inicio
med = num/2
Fin mitad
Algoritmo calcular_mitad
Var
n: entero
mit: real
Inicio
Escribir "Introduce un número"
Leer n
mitad (n, mit)
Escribir "La mitad esu mit
fin

En el ejemplo anterior ent-sal med: real, se usa para indicar que el


parámetro del tipo real med es de entrada-salida o que es un parámetro por
referencia.

4. Ámbitos: Variables Globales y Locales

El ámbito de un identificador ya sea variable, constante, función, entre


otros, se refiere a la parte del programa en la que se conoce y por tanto se
puede usar a un identificador cualquiera. Recuerde que un identificador es
un nombre construido bajo ciertas reglas de sintaxis y se asocia aún
elemento del programa.

Existen dos tipos de ámbitos básicos:

• El ámbito global: Se refiere a los identificadores que se declaran


dentro del programa principal y fuera de cualquier otro bloque de
código. Al ser declarados de esta forma los identificadores globales
están disponibles a lo largo del programa y podrán ser usados en
cualquier parte del mismo, de allí su nombre de globales porque se
dice que son globales al programa .
• El ámbito local: Se refiere a los identificadores declarados dentro de
un bloque de código diferente al programa principal, como por
ejemplo una subrutina o procedimiento, siendo visibles y accesibles
por lo tanto sólo dentro de ese bloque de código especifico.

Como regla general todo identificador sólo es visible y accesible dentro del
bloque de código que lo declara y dentro de los bloques anidados que este
último pueda tener. Lo contrario no es cierto, es decir, los identificadores
declarados en un subbloque de código no son visibles ni accesibles desde el
bloque de código del cual depende.

El ámbito es importante cuando se trabaja con variables, por lo que se


tienen variables locales y globales

4.1 Variable Local

Una variable local es aquella que está declarada y definida dentro de un


subprograma o subbloque de código. Esto quiere decir que la variable no
tiene ningún significado, no se conoce y no se puede acceder a ella desde
fuera del subprograma o bloque de código. Las variables locales a un
subprograma se definen en la parte de la definición de variables del mismo.

Si se tiene una variable local con el mismo identificador que una variable
global, las referencias que se hacen dentro del bloque de código en que se
declara la variable local harán referencia a dicha variable local y no a la
variable global.

4.2 Variable Global

Es aquella que está definida a nivel del programa, es decir, su ámbito es


el programa o algoritmo principal y todos los subprogramas que dependen
de este último.

Una variable global se puede acceder desde cualquiera de los


subprogramas y el programa principal, salvo que alguno de esos
subprogramas tenga definida una variable local con el mismo nombre que la
variable global. Hay que ser cuidadosos a la hora de usar variables globales
ya que como todos los subprogramas las pueden modificar, esta es la razón
por la cual no se deben utilizar variables globales para pasar información
entre los subprogramas, se recomienda usar variables locales por medio de
parámetros reales para tal fin.

4.3 Procedimientos Anidados

La anidación de procedimientos no se permite en todos los lenguajes y


consiste en que dentro de un procedimiento se pueda definir o
declarar el código completo de otros procedimientos.

Si la anidación de procedimientos está permitida, se plantean más


problemas en cuanto al ámbito, desde este punto de vista, se dice que una
variable local se conoce en el procedimiento en el que está definida y en
todos los procedimientos anidados que componen el ámbito de dicho
procedimiento, salvo que en alguno de esos procedimientos anidados este
definida una variable local con el mismo nombre que la anterior, en cuyo
caso, dentro de ese procedimiento, siempre se va a referir a la variable
local porque siempre se considera el ámbito más restringido.

Veamos el siguiente ejemplo de declaración de variables en diferentes


ámbitos.

5. Comunicación entre Subprogramas: Paso de Parámetros

La mejor forma para llevar a cabo la comunicación ente subprogramas, es


el paso de parámetros. Cuando se invoca una función o procedimiento se le
pasa a través de los parámetros los datos que necesita. En el caso de un
procedimiento los resultados también se devuelven a través de sus
parámetros. Para ello se define el tipo del parámetro a principio del
subprograma, que es lo que se conoce como parámetros formales. Al hacer
la llamada se pasan los datos a través de los parámetros reales.

5.1 ¿ Cómo se Efectúa la Correspondencia entre Parámetros


Formales y Reales?:

Existen dos métodos para realizar la correspondencia entre parámetros


formales y reales:
5.1.1 Correspondencia Posicional:

En este caso se hacen corresponder los parámetros formales y reales por la


posición que ocupan (orden de declaración) de izquierda a derecha. Para
esto, tiene que haber el mismo número de parámetros formales y reales y
deben ser del mismo tipo.

Si se tiene el procedimiento:

Proc(x : entero, y real)

Una llamada valida es:

Proc(8, a)

Donde 8 es una constante literal entera y a es una variable real previamente


definida. En este caso al efectuar la llamada al parámetro formal x se le
asigna el valor de 8 y al parámetro formal y se le asignara el valor que
tenga almacenado el parámetro real definido por la variable a.

5.1.2 Correspondencia por Nombre Implícito:

En este enfoque en la llamada al subprograma se coloca explícitamente a


que parámetro formal corresponde cada parámetro real.

En la llamada se coloca el nombre del parámetro formal, separado por dos


puntos (:) y seguido por el nombre del parámetro real que se pasa, de esta
forma no importa la posición en la que se colocan los argumentos del
procedimiento o función.

Ejemplo: Proc(x : 8, y : a) Proc(y : a, x : 8)

5.2 Tipos de parámetros:

Existen tres tipos básicos de parámetros según se usen para entrada de


datos o para obtener resultados. Son estos:

• De entrada: Son parámetros que sólo aportan datos de entrada al


subprogama al que pertenecen como parámetros. Sólo pueden ser
leídos, pero no modificados. Aunque se modificasen dentro de un
subprograma, esa modificación no va a tener efecto fuera del
subprograma.
• De salida: Se usan sólo y exclusivamente para devolver
resultados. Su valor al hacer la llamada al subprograma no es de
relevancia. Ese valor sólo va a tener sentido cuando termine la
ejecución del subprograma.
• De entrada y salida: El valor del parámetro tiene importancia tanto
a la entrada como a la salida del subprograma. Aporta dato cuando
se llama al subprograma y por otra parte, devuelve a través de él
los resultados. En este caso tiene sentido tanto poder leer como
actualizar el parámetro.
La mayoría de los lenguajes sólo permiten dos tipos de parámetros; de
entrada, sólo para leer datos, y de entrada-salida para leer datos y devolver
resultados.

5.3 Métodos de Paso de Parámetros:

Existe una variedad de métodos, sólo se estudiarán dos de ellos por ser los
más utilizados y conocidos en las herramientas de programación.

El paso de parámetros se va a clasificar en:

 Paso de parámetros por copia o por valor.


 Paso de parámetros por referencia.

5.3.1 Paso de Parámetros por Copia o Valor:

La característica fundamental de este método es que la función invocada


no puede modificar el valor de los parámetros reales. Al realizarse la
llamada a la función, se copia el valor del argumento en el parámetro
formal de la función. El parámetro formal de la función tiene asociada una
dirección de memoria diferente a la dirección de memoria del parámetro
real, por lo tanto, este parámetro formal se comporta como una variable
local en la función a la cual pertenece. Se puede cambiar el valor del
parámetro dentro de la rutina y no repercutirá en el argumento
originalmente transferido ya que comparten direcciones de memoria
diferentes e independientes.

Veamos el siguiente ejemplo:

Procedimiento Duplicar(x: entero)

Inicio

x=x* 2

Escribir x

Fin Duplicar

Algoritmo CopiaValor

Var a : entero

Inicio

a =3

Duplicar (a)

Escribir a
Fin

El valor de a será 3 y el de x será 6.

5.3.2 Paso de Parámetros por Referencia:

La característica fundamental de este método es que la función invocada


puede modificar el valor de los parámetros reales.

Al realizar la llamada a la función, no se copia el valor del argumento en el


parámetro de la función. Se almacena la dirección de memoria de su
parámetro real asociado, es decir, el parámetro formal apunta a la dirección
de memoria del parámetro real que tiene asociado. Cualquier
modificación que. se efectúe sobre el parámetro formal dentro de la
función, tendrá un efecto directo en el parámetro real asociado, ya
que se modificará el valor almacenado en la dirección de memoria que
indica el parámetro formal que es a su vez la dirección de su parámetro real
asociado.

El parámetro no real puede ser ni constantes ni expresiones. Sólo pueden


ser variables. Para indicar que el tipo de paso de parámetro es por
referencia se va a utilizar la palabra clave ent-sal precediendo al parámetro
que se pasa por referencia.

Procedimiento Duplicar(ent-sal x : entero)

Inicio

x=x*2 ¡,

Fin Duplicar

Algoritmo Referencia

Var a

Inicio

a=3

Duplicar (a)

Escribir (a)

Fin

Al finalizar el algoritmo, el valor de a será igual a seis, valor asignado a x en


el subprograma Duplicar ().

Podemos resumir lo siguiente:


• Por valor: el parámetro actual no cambia de valor.
• Por referencia: el parámetro actual puede cambiar de valor.

6. Recursividad

Se dice que un subprograma es recursivo cuando se llama a si


mismo. La recursividad se puede utilizar en subprogramas que se pueden
definir en términos recursivos, es decir, en término de sí mismo, como
procesos de alguna manera repetitivos.

Un ejemplo de definición recursiva es el de la función matemática factorial


donde:

Factorial(x) = x * Factorial(x-1)

Hay que ser cuidadosos al utilizar la recursividad e incluso evitarla siempre


que sea posible utilizando algoritmos iterativos, ya que cada vez que un
subprograma se llama a si mismo hay que almacenar en la pila del sistema
(lugar de memoria especial) la dirección de retorno de ese subprograma,
con lo cual si se efectúan muchas llamadas recursivamente se irá llenando
la pila del sistema pudiendo agotarse la memoria disponible en un momento
dado. Esta situación se conoce como desborde de la pila del sistema.

Todo programa recursivo tiene que tener alguna condición que ponga
fin a la recursividad, un punto en el que el subprograma deje de llamarse
a sí mismo cuando se cumpla la condición. De otra forma, se forma un
bucle infinito con el consecuente error de desbordamiento de pila
mencionado anteriormente.

Ejemplo de la función factorial la condición de control es que el factorial de


todo número menor o igual a 1 es 1:

si x >1

Factorial(x) = x * Factorial(x-1)

sino Factorial(x)=1

UNIDAD 5: ESTRUCTURA DE DATOS: ARREGLOS

1. Introducción

En las unidades anteriores se estudiaron los conceptos de algoritmos y


programas, así como una serie de elementos, entre ellos, la lógica, que
ayudan a resolver problemas computacionales. También se discutió cómo
un programa o algoritmo puede ser representado gráficamente mediante un
diagrama de flujo y se trabajo con los principios de la programación
estructurada, sus recursos y técnicas. Aquí de estudiaremos una de las
representaciones de datos más usadas la programación llamada
denomina arreglo. Los arreglos se utilizan para almacenar datos
consecutivos de un mismo tipo, por lo que se usan generalmente en
algoritmos de clasificación, ordenamiento y búsqueda.

2. Arreglos Unidimensionales: Vectores

Un arreglo unidimensional o vector es un conjunto finito, consecutivo y


organizado de elementos homogéneos, es decir, elementos
pertenecientes a un mismo tipo de dato.

Se dice que es:

Finito: El arreglo tiene un número determinado de elementos.

Homogéneo: Todos los elementos del arreglo son del mismo tipo.

Organizado: Existe una forma de referenciar cada elemento del arreglo y


de acceder a cada uno de sus elementos de manera independiente.

Consecutivo: Por la forma en que se almacena o representa un vector en


la memoria del computador en posiciones consecutivas de la memoria.

El índice (valor que referencia la posición del arreglo) tiene que ser de
cualquier tipo de datos escalar, porque en un escalar se puede definir un
orden y entre dos elementos consecutivos no puede haber infinitos
elementos, ejemplo de datos escalar son los enteros y caracteres.

Para referenciar un elemento de un arreglo se usa el nombre del arreglo y


entre corchetes [ ] el índice que determina la posición de ese elemento en
el arreglo.

El rango o longitud de un vector o arreglo lineal es la diferencia entre el


índice de valor máximo y el índice de valor mínimo de ese arreglo + 1.
Normalmente los índices comienzan enumerarse desde O o 1 como el valor
mínimo del índice dependiendo del lenguaje (en Pascal inician con 1 y en C
inician con O). Sin embargo, nada impide que comiencen con cualquier otro
valor.

Los arreglos se almacenan siempre en posiciones consecutivas de


memoria. Un índice no tiene porque ser un valor constante, sino que puede
ser también una variable o una expresión que al ser evaluada devuelva el
índice.

Para definir un arreglo se da el nombre del arreglo, el rango de sus índices


y el tipo de los datos que contiene. Ejemplo:

sueldo: arreglo [8] de real

i: entero

i=2
sueldo[i]= 23.5

Si el valor mínimo del rango del índice es 1 la sentencia sueldo[i]= 23.5,


asigna el valor 23.5 a la segunda posición de un arreglo de ocho elementos.

Sí el valor mínimo del rango del índice es O la sentencia asigna el valor 23.5
a la tercera posición de un arreglo dado que el valor del índice i es 2.

Se considera un error intentar acceder a una posición del arreglo que este
fuera del rango del índice. Este error se denomina comúnmente índice fuera
de rango.

2.1 Operaciones con Vectores

Se va a usar la declaración de vector:

ventas: arreglo[12] de entero

2.1.1 Asignar un Dato a una Posición del Arreglo

Consiste en asignar un valor dado a una posición del arreglo dada por un
índice.

1 2 3 4 5 6 7 8 9 10 11 12

Ejemplo: ventas[5] =60000

2.1.2 Lectura y Escritura de Datos

Consiste en usar una posición cualquiera del arreglo definida por un índice
para operaciones de entrada y salida.

Ejemplo:

Desde i = 1 Hasta 12

Escribir "Introduce las ventas del mes” i

Leer ventas[i]

Fin Desde

Desde i = 1 Hasta 12

Escribir "Ventas del mes " i “=” ventas [i]

Fin Desde

2.1.3 Recorrido o Acceso Secuencial de un Arreglo

Consiste en pasar por todas las posiciones del arreglo para procesar su
información.

Ejemplo:

Desde i = 1 Hasta 12

ventas[i] = ventas[i] + 1000000

Fin Desde

2.1.4 Actualización de un Arreglo:

Añadir datos:

Es un caso especial de la operación de inserción de un elemento en un


arreglo donde el elemento se agrega después de la última posición que
contiene información válida en el arreglo. Para hacer esta operación es
necesario que, si actualmente el arreglo tiene k posiciones de
información válida, tenga un tamaño de al menos k + 1 para que se
pueda añadir otro elemento a continuación del elemento en la posición
k.

Sintaxis:

<nom_arreglo>[k + 1] = valor

Insertar datos:

Consiste en introducir un elemento en el interior de un arreglo, para lo


cual será necesario desplazar todos los elementos situados a la derecha
del que vamos a insertar una posición a la derecha con el fin de
conservar el orden relativo entre los elementos.

Para que se pueda insertar un nuevo elemento en el arreglo si ya


existen n elementos con información en el arreglo, el arreglo tendrá que
tener un tamaño al menos de n + 1 para poder insertar el nuevo
elemento.

C E F J M O

Al insertar G en la cuarta posición queda:

C E F G J M O

Si k es la posición donde se va a insertar el nuevo elemento, n el número de


elementos válidos en el arreglo en el momento de la inserción y suponiendo
un tamaño mínimo de n + 1, el algoritmo de inserción es:

Desde i= k Hasta n

A[i+1]=A[i]
Fin Desde

Eliminar Datos:

Para eliminar un elemento de un arreglo, si ese elemento está posicionado


al final del arreglo, no hay ningún problema, simplemente si el tamaño del
arreglo era n, ahora será n-1.

Si el elemento a eliminar ocupa cualquier otra posición entonces se tendrá


que desplazar todos los elementos situados a la derecha del elemento a
borrar una posición hacia la izquierda para que el arreglo quede organizado.

C E F J M O

Al borrar el elemento J de la cuarta posición.

C E F M O

Suponiendo que el número de elementos validos actualmente es n y que se


desea borrar el elemento de la posición k.

Desde i = k Hasta n - 1

A[i]=A[i+1]

Fin Desde

3. Arreglos Bidimensionales: Matrices m x n

Un arreglo bidimensional de M x N elementos es un conjunto de M x N


elementos, todos del mismo tipo, cada uno de los cuales es referenciado a
través de 2 subíndices. El primer subíndice varía entre 1 y M si ha
empezado a numerar el índice en 1. El segundo índice varía entre 1 y N, sí
ha empezado a numerar el índice en 1.

En general se puede definir un arreglo de 2 dimensiones de la siguiente


manera: <nombre_arreglo>: arreglo[rangoI, rangoII] de <tipo>

Ventas mensuales de cinco años:

ventas: arreglo[5, 12] de real tamaño = m x n = 5 x 12 = 60

M es el número de filas y N es el número de columnas, es decir, la 1ª


dimensión indica las filas y la 2ª indica las columnas. Al acceder a un
elemento I, J se está accediendo al elemento que ocupa la fila I y la
columna J.

En memoria, todos los elementos del arreglo se almacenan en posiciones


contiguas.

Matriz de ventas 5 x 12, total de 60 elementos.


1 2 3 4 5 6 7 8 9 10 11 12
1
2
3
4 120
5

ventas[4, 3] = 120

3.1 Manejo de Matrices:

Operaciones comunes con las matrices bidimensionales:

3.1.1 Colocar el valor de cero a todos 105 elementos de la matriz.

Esta es una operación útil cuando se desea inicializar todos los elementos
de la matriz a un valor dado.

Sintaxis:

M: arreg1o[m, n] de entero
Var i, j : entero
Desde i=1 Hasta m
Desde j=1 Hasta n
M[i, j] = 0
Fin Desde
Fin Desde

3.1.2 Colocar el valor de cero a sólo los elementos de una fila dada

En este caso se mantiene fija la fila y se recorren las columnas asignándoles


un valor suministrado, usualmente ese valor es cero.

Sintaxis:

M: arreg1o[m, n] de entero
Var i, j : entero
i = fila
Desde j=1 Hasta n
M[i, j] = 0
Fin desde
ventas: arreg1o[5, 12] de entero
Var i, j : entero
i=3
Desde j = 1 Hasta 12
M[i, j] = 0
Fin desde

En este caso se le asignó el valor de cero a los elementos de la tercera fila


de la matriz ventas.
4. Arreglos Multidimensionales: Matrices m x n x ... z

Un arreglo multidimensional es una matriz de 3 ó más dimensiones. Si se


tiene un arreglo de N dimensiones, donde cada dimensión es de tamaño d1,
d2, .. ,dN, el número de elementos del arreglo será d1 *d2 * .. *dN.

Para acceder a un elemento del arreglo se utilizan N índices, cada uno de


los cuales referencia a una posición dentro de una dimensión, siempre
según el orden de declaración.

En memoria, el arreglo se sigue almacenando en posiciones consecutivas.


La declaración de un arreglo multidimensional será:

nombre_arreglo: arreglo[rangoI, rangoII, ... , rangoN] de tipo

Ejemplo:

Matriz de ventas mensuales por cinco años para tres vendedores:

ventas : arreglo[3, 5, 12] de real

ventas [2, 4, 10]=1200.5

5. Almacenamiento de Arreglos en Memoria

Un arreglo en memoria siempre se almacena en posiciones contiguas a


partir de la dirección base de comienzo del arreglo, la cual se asigna cuando
se declara una variable del tipo arreglo.

El tamaño que ocupa el arreglo en memoria es el producto del número de


sus elementos por el tamaño de cada uno de ellos.

Arreglo[100] de carácter

Si se asume que cada carácter necesita un byte para ser almacenado


entonces el arreglo necesita un total de 100 bytes de memoria.

1 byte * 100 elementos = 100 bytes

En el caso de un arreglo multidimensional, también se almacena en


posiciones contiguas de memoria. Su tamaño será el producto de sus
elementos por el tamaño requerido para representar cada elemento en
memoria.

Arreglo[3, 5, 12] de enteros

Si se asume que cada entero necesita dos byte para ser almacenado y se
tiene un total de 3 x 5 x 12 = 180 elementos, entonces el arreglo requiere
un total de 360 bytes de memoria.

2 byte * (3 * 5 * 12) elementos = 360 bytes


UNIDAD 6: REPRESENTACION DE DATOS

1. Introducción

Las computadoras al igual que los seres humanos necesitan de un lenguaje


para comunicarse con su entorno. En los sistemas computacionales se han
establecido formas para representar internamente los datos y la información
que será procesada por un programa o aplicación. Entre ellos están los
sistemas de representación numérica y los sistemas de representación de
caracteres como el ASCII o el UNICODE.

2. Representación de Datos

Caracteres

ASCII

EBCDIC

Numéricos

Binario

Decimal

Hexadecimal

Las computadoras leen unos y ceros (1,0) y las personas leen caracteres
como m, T, 4 ó !. Para codificar los datos legibles por las personas a datos
que entienda la computadora se debe tener alguna forma de traducción.

El dato carácter normalmente se representa con código ASCII en las


computadoras estaciones de trabajo y en EBCDIC en las computadoras
grandes (mainframe). El dato numérico decimal se almacena típicamente en
formato binario o hexadecimal en todas las computadoras.

Todas estas formas de representación se discuten en detalle a continuación.

3. Notación Binaria

Las características de la notación binaria se pueden resumir en:

 La notación binaria es la forma más simple de representar los datos.


Las computadoras pueden usar directamente esta forma.
 El modo binario significa que sólo hay dos estados en que puede
estar el dato: APAGADO (0) o ENCENDIDO (1). Cada componente
binario (0 ó 1) se llama bit.
 El sistema de numeración binaria se usa en la mayoría de las
computadoras como un medio para representar los valores de los
datos. Cada bit, digito binario, en una localidad de almacenamiento
particular se establece en 0 o en 1.
 En la mayoría de las computadoras se agrupan 8 bits para formar lo
que se conoce como un byte.

Note que mientras la notación binaria es la forma más fácil a utilizar por la
computadora, es el más difícil para las personas.

4. Representación de Valores de Caracteres

Cualquier carácter se puede representar usando configuraciones únicas de


bit. Las representaciones actualmente más usadas son: EBCDIC y ASCII.

En EBCDIC, los ocho bits se usan para representar el carácter. Esto permite
representar 256 caracteres diferentes. Unos representan letras, otros
números, otros signos de puntuación, y otros caracteres especiales
llamados "caracteres de control".

ejemplos de letras: 1100 0100 representan la D, y 1000 0100


representan la d.

Los valores del carácter para los números

0 =1111 0000
1 = 1111 0001
2 = 1111 0010
3 = 1111 0011
4 = 1111 0100
5 = 1111 0101
6 = 1111 0110
7 = 1111 0111
8 = 1111 1000
9 = 1111 1001

Representación Binaria

La sigla EBCDIC viene de Extended Binary Coded Decimal Interchange Code


(Código de Intercambio Decimal Codificado en Binario Extendido). Fue
desarrollado inicialmente por IBM y lo usan los sistemas de computadoras
grandes (mainframes) y algunas computadoras más pequeñas. Se han
separado los ocho bits de un byte en dos grupos de cuatro bits, esto lo hace
fácil de leer. Actualmente se denominan los primeros cuatro bits la porción
zona y los últimos cuatro bits la porción digitos.

Ejemplos de caracteres de control es:

NULL significa nulo (todos los bits son cero)


LF que quiere decir retorno de línea (0010 0101)

5. Caracteres ASCII

El código ASCII también usa un código de 8 bits. En ASCII, por ejemplo el


carácter A se representa por 0110 0101 Y el carácter B se representa por
0110 011O.

Si dos computadoras van a comunicarse entre sí y la computadora que


transmite el mensaje almacena los datos en EBCDIC y la receptora
almacena los datos en ASCII, los códigos de EBCDIC deben convertirse a los
códigos ASCII correspondientes.

La mayoría de las computadoras de escritorio, como las PCs usan el código


ASCII.

Las siglas ASCII viene de American Standard Code for Information


Interchange (Código Estándar Americano para el Intercambio de
Información). El código ASCII fue desarrollado con la intención de
simplificar y estandarizar la comunicación máquina-a-máquina y sistema-a-
sistema.

6. Representación de Valores Numéricos

La representación de los datos numéricos en una computadora se lleva a


cabo asignando un valor específico a cada bit. Se pueden usar grupos de
bits para representar valores decimales.

A cada bit se le asigna el valor decimal: 1, 2, 4, Y 8 respectivamente.


Determinando sí el bit está ENCENDIDO o APAGADO se agrega el valor
decimal al total.

El siguiente ejemplo representa el número 13 decimal.

1 1 0 1 Numero Binario

23 (=8) + 22 (= 4) + 21 (=2) + 2° (=1) valor del bit

1x8+ 1x4+ 0x2+ 1x1 valor decimal

El valor se calcula agregando el valor de cada componente que tiene el


valor de uno "1." En el ejemplo anterior, 8 + 4 + 1 = 13.

El valor más grande que puede representarse en un patrón de bits que


consta de cuatro dígitos binarios 1111 es equivalente al número decimal 15.

También es común usar el bit de orden mayor, él más a la izquierda, para


indicar si el valor es positivo o negativo. Cuando se usa se le llama el bit de
signo.

El rango de números que se pueden representar en una combinación binaria


de 8 bits con signo es de -127 a +127. Si en cambio se usan los 8 bits
completos para representar datos sin signo, entonces el rango va de 0 a
255.

7. Convertir de Decimal a Binario

Para convertir un número entero decimal de base 10 a base 2 binario, se


divide el número por el valor binario más grande que lo divida. Repita la
operación de la división con el resto hasta que el cociente sea 0. Cuando un
número puede ser dividido por un valor binario haga esa posición del bit a 1
(encendido), en otro caso cero.

Como ejemplo se va a convertir el número decimal 149 a su equivalente


binario:

Número Decimal 149

2048 1024 512 256 128 64 32 16 8 4 2 1


0 0 0 0 1 0 0 1 0 1 0 1

Número Binario Valor Bit

El sistema convierte el formato decimal que se esté usando a binario.

8. Convertir de Binario a Decimal

Para convertir un número binario a uno decimal se usa lo que se denomina


notación extendida.

Como ejemplo se va a convertir el número binario 100110 a decimal:

100110 = (1X2)5 + (0X2)4 + (0X2)3 + (1X2)2 + (1X2)1+ (0x2)0

= 32 + 0 + 0+ 4 + 2 + 0

= 38

9. El Sistema Numérico Hexadecimal

La notación que normalmente se usa es la del sistema numérico


hexadecimal llamada también "hex". En hexadecimal se agrupan cuatro
dígitos binarios para representar un dígito hexadecimal.

Los símbolos válidos del hexadecimal son: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, Y


F. La siguiente tabla muestra valores equivalentes para binario,
hexadecimal y decimal.

BINARIO HEXADECIMAL DECIMAL


0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

Tabla de Valores de los Diferentes Sistemas

El sistema hexadecimal se le llama también sistema numérico base 16.

10. Convertir de Decimal a Hexadecimal

Para convertir de decimal a hexadecimal, se mostrará un método diferente


al que se usó para la conversión binaria. Divida el número decimal entre 16,
y convierta el resto a un número hexadecimal para obtener el digito más a
la izquierda del hexadecimal. Entonces divida el cociente entre 16 y use el
resto para el segundo dígito. Repita hasta que el resto sea cero.

Para dar un ejemplo se va a convertir el decimal 1710 a su equivalente


número hexadecimal 6AF

6 A F

0 resto 6

16 6 resto 10

16 106 resto 14

16 1710 resto

Conversión de Decimal a Hexadecimal

11. Convertir de Hexadecimal a Decimal

Para convertir de hexadecimal a decimal, se usa el mismo método para


convertir en número en representación binaria a decimal, sólo que se
multiplica por 16 en lugar de 2 las bases.

Ejemplo: convertir el hex 9C4D a su equivalente número decimal 40,013:


9C4D=(9x163)+(Cx16 2
)+(4x161)+(Dx160)=(9x4096)+(Cx256)+(4x16)+
(Dx1)

= (9x4096)+(12x 256)+(4 x16)+(13x1)

=36,864+3,072+64+13

= 40,013

12. Decimal Empaquetado

Para los campos numéricos que usan EBCDIC todas las posiciones de la
zona del campo, se usan salvo un byte que contiene el signo para el
número. Para conservar el almacenamiento, pueden usarse los datos
decimales condensados (empaquetados).

La representación de datos en forma decimal empaquetado contiene dos


dígitos decimales por byte, salvo el medio-byte más a la derecha que
contiene un dígito y un signo de 4 bits.

Digitos Signo

Representación Decimal Empaquetado


D D D D D D D S
La representación de datos decimales empaquetados es una forma
económica de representar los datos numéricos internamente en la
BYTE
computadora. BYTE
El hecho de que BYTE
el dato de carácter EBCDIC tienen un campo
BYTE
de "zona" de F para todos los números implica que hay realmente un
desperdicio de espacio. De manera, que es posible empaquetar los campos
de datos numéricos eliminando el medio byte de campo del campo zona y
utilizar esos cuatro bits para representar otro dígito del número.

Debido a la necesidad de los números positivos o negativos, se usa una de


las ubicaciones del campo de zona como un indicador del signo para el
número completo. Éste se coloca en el último medio byte como se mostró
anteriormente.

Para los números decimales empaquetados los códigos binarios 0000-1001


se conocen como los dígitos decimales y los códigos restantes, 1010-1111.
se usan como señales. Los códigos tienen el significado siguiente:

Código Hex A B C D E F
Valor 1010 1011 1100 1101 1110 1111
Binario
Signo + - + - + +

* *
* Códigos predefinidos

Un campo decimal empaquetado que contiene un valor negativo 38,264


ocupará tres bytes de almacenamiento y aparecerá en la memoria como:

38 26 4D

Número Decimal Empaquetado en la Memoria

Para determinar el número de bytes requerido para un número decimal


empaquetado, agregue uno, para el medio-byte de signo, al número de
digitos con el que está representado y divídalo entre dos.

13. Límites del Almacenamiento

Los bits se combinan, en grupos de 8 para formar los bytes. La


computadora referencia los datos en lo que se denomina palabras. La
disposición de bytes en palabras permite que el procesador sea eficiente
cuando carga las instrucciones y los datos.

0000 0001 0002 0003 0004 0005 0006 0007


BYTE BYTE BYTE BYTE BYTE BYTE BYTE BYTE
HALF HALF HALF HALF
FULL FULL
DOUBLE WORD

Limites del Almacenamiento

La computadora necesita tener sus datos en un formato que sea fácilmente


accesible. Esto significa que deben ser colocados en límites de sean
predecibles y útiles. Los elementos de un programa y los datos que usa se
alinearán típicamente en uno de los tres límites de palabras como se mostró
anteriormente.

Las direcciones dentro de la computadora son descritas en uno de estos


cuatro "límites": byte, media palabra, palabra o palabra doble. Un límite de
media palabra es divisible entre dos, una palabra completa es divisible entre
cuatro y una palabra doble es divisible entre ocho.

14. Del Bit a la Base de Datos

A continuación se presenta la "jerarquía" de datos, del elemento más


pequeño representado por el bit hasta al más grande constituido por la base
de datos, con los que generalmente se trabaja en un programa de
computadora.

Los programas generalmente trabajan con los datos ubicados en nivel más
alto de la jerarquía, representado por campos, registros o archivos.
0 Bit

0101100 Byte
1

5962 Campo

5962 Southern Lee, Robert E. 1069A ... Registro

5962 Lee. Robert E. 10691069A


2447 Lincoln 1 n7? Dixon. Mason Archivo
1070
.
.
.
Jerarquía de los Datos

UNIDAD 7: ENTRADA Y SALIDA

1. Introducción

La solución a problemas de la vida real mediante computadoras incluye el


uso de programas especializados para resolver dichos problemas. Los
programas generalmente usarán, leyendo y escribiendo, datos provenientes
de fuentes externas. Para que esto sea posible las computadoras ofrecen
capacidades de entrada y salida que le permiten a las aplicaciones
comunicarse con ese entorno que se encuentra fuera del programa mismo.

Aquí se introducen los conceptos básicos de entrada y salida mediante los


cuales los programas de computadora pueden intercambiar, capturar y
mostrar datos para la soluciones de problemas específicas.

2. Entrada y Salida de un Programa

Un programa se carga en la computadora en el Procesador o la Unidad


Central de Procesamiento (CPU). Cuando el programa se ejecuta, necesitará
probablemente leer datos o escribir datos a algún dispositivo.

El lenguaje que se use para escribir un programa tendrá algunos comandos


especiales o funciones que se pueden usar para realizar la entrada y salida.

La entrada y salida generalmente son las partes más complejas de cualquier


programa o cualquier lenguaje de programación. La transferencia real de
datos hacia o desde los dispositivos de E/S será generalmente la parte más
lenta de un programa.

Los comandos que se usan para la entrada son normalmente: read, get o
sean. Los comandos de la salida son por su parte: print, write o put.

3. Buffer de Datos

Los datos externos que se procesan en un programa se leen y escriben


realmente en un buffer que maneja la computadora. El sistema lee
físicamente los datos de algún dispositivo externo a un buffer de entrada y
los escribe en un buffer de salida. El sistema es propietario de los buffers y
los administra.

El programa accede a los datos usando estos buffers del sistema. Lee del
buffer de entrada y escribe al buffer de salida.

Cuando se empieza el procesamiento con una operación de entrada, el


sistema lee los datos del dispositivo de entrada y llena el buffer de entrada.
A medida que se vacían los datos del buffer de entrada, el sistema sigue la
pista del buffer y llena el buffer desde el dispositivo cuando está vacío. El
buffer de salida también es monitoreado por el sistema dado que
gradualmente lo llena. Cuando está lleno, el sistema escribe el contenido
del buffer de salida al dispositivo de salida designado.

Todo este movimiento de datos externo lo maneja el sistema denominado


Sistema de Control de I/O (IOCS). El IOCS corre "asincrónicamente" a la
ejecución del programa. Esto significa que se puede continuar haciendo lo
que se quiere a los datos y el sistema se ocupa de transportarlos hacia y
desde los dispositivos de E/S.

...
LEER
HACER MIENTRAS
(read)
(MAS DATOS)
Entrada LEER
/*PROCESAR*/
ESCRIBIR ESCRIBIR
(write) FIN HACER
Salida ...

Buffers de Datos
4. Imprimir Datos

Imprimir la salida a una impresora requiere ciertas consideraciones


especiales:

• Separar los formatos de salida para las líneas de datos y las líneas
del título
• Contadores de línea
• Contadores de páginas
• Encabezados de páginas

• Caracteres de control de carro en las líneas de salida

Estos elementos enumerados anteriormente deben ser manejados en el


programa.

Se requiere de algunas consideraciones de formato especiales cuando se


escriben datos a un dispositivo de impresión. Un contador de línea se
mantiene para tener seguimiento de cuántas líneas se han impreso para
que así se pueda tener control de cuándo saltar a una nueva página y
colocar los encabezados en una nueva página de salida. El contador de
páginas permite colocar el número de la página en la nueva página.

Formatos de líneas separados se requieren para imprimir las líneas de datos


y líneas de encabezado. Normalmente el encabezado de la página requiere
de formatos únicos de línea para las múltiples líneas de encabezado y los
encabezados de columna.

El control de carro de impresora le indica a la impresora dónde imprimir la


próxima línea.

5. Control de Carro de Impresora

La mayoría de los lenguajes de programación que proporcionan acceso


directo a una impresora, también proporcionan un medio para controlar
dónde se va a imprimir una línea. Esto generalmente se hace con un
carácter de control en la primera posición de la impresión de cada línea. En
la Figura 7.3 se presenta los caracteres de control.

Caracteres Acción de Control


espacio Espaciar 1 línea
O Espaciar 2 línea
- Espaciar 3 línea
Saltar a una nueva
1
página
+ Suprimir espaciado
Caracteres de Control

Los caracteres de control se colocan en la primera posición de la impresión


de cada línea y no se verán en la copia impresa. Este carácter de control
siempre se aplica a la línea que se va a imprimir.

Cuando se usa el carácter de control "0" se da la apariencia de doble


espacio. El "+" puede usarse para suprimir el espaciado de línea, para dar
apariencia de sobreImpresión (overstrike) o de negrita.

6. Imprimir Salida: Reportes

Cuando se escriben los reportes a una impresora, el programador tiene que


considerar cosas tales como los encabezados de páginas, números de las
páginas, contadores de página y pie de páginas.

Existen varios tipos de líneas que deben definirse:

 Línea de título: Contiene el nombre del reporte y aparece en .parte


superior de cada página
 Líneas de encabezados: Los encabezados de las columnas deben ser
alineados con el de los datos
 Líneas de Datos: Los detalles del reporte
 Las líneas resumen: totales finales o información complementaria
 Líneas de pie de página: Contiene los números de la página, fecha,
información de seguridad, etc.

El programador define la información para las partes constantes de las


líneas de título, encabezado y de pie de página. Estos registros constantes
se imprimirán mediante una rutina que se llama cuando se alcanza el fin de
una página.

El fin de una página se determina contando las líneas y probando este valor
contra un número máximo deseado de líneas por página. Cuando se alcanza
el límite de la página, el programa debe imprimir una línea de pie de página
opcional en la página actual y luego imprimir una línea de título en una
nueva página. Si se usan encabezados de columnas, éstos deben imprimirse
antes de continuar la impresión y contar las líneas de detalle.

La rutina que maneja el procesamiento de la línea de título también debe


ocuparse de la a del titulo para la primera página.

7. Encabezados de Páginas

El programador define el tamaño de la página y una variable contador de


línea. El contador de línea se inicializa con el tamaño de la página para que
la rutina de encabezado de página sea llamada para la primera página.

Las consideraciones para el contador de línea son:


• El contador de línea se debe comparar (>=) con el tamaño de página
después de imprimir cada línea de detalle para determinar cuándo se
debe llamar a la rutina de encabezado de página.
• Se debe incrementar inmediatamente después de imprimir una línea,
basado en el espaciado simple, doble o triple.
• Siempre debe reflejar el número de la línea de la última línea escrita.
• La rutina de encabezado de página debe reinicializar el contador de
línea.
• El tamaño de la página es el número máximo de líneas a ser impresas
en la página. El programador decide el número que será y lo fija
como una constante en el programa.
• La rutina de encabezado de página también debe ocuparse de la
variable contador de página. Debe incrementase cada vez que una
nueva página se escribe. Esta variable puede ser parte de la línea del
titulo o de pie de página.

8. Entrada/Salida de Archivo: Formatos de Registros

Los datos escritos o leídos desde un archivo generalmente se manejan


como un registro. Existen típicamente dos formas en que pueden
procesarse los datos de un registro, como registros fijos ó como registros
variables. Los registros también pueden bloquearse para lograr eficiencia.

Otros tipos de E/S usan un archivo de disco o cinta. Este medio


normalmente trabaja con registros de datos, que requiere que el
programador considere los formatos del registro.

El tamaño de los registros fijos se establece generalmente como un


parámetro en el proceso de E/S. El tamaño de los registros variables varía
para cada registro y se coloca en la cabecera del registro para indicar el
número de bytes que éste ocupa.

Esto también se cumple para bloques de datos. El número de registros en


cada bloque :e un conjunto de datos de bloque fijo se da como un
parámetro del sistema de E/S. Sin embargo, el tamaño para bloque variable
puede ser diferente para cada bloque, así que el tamaño también es
embebido en una porción de la cabecera de cada bloque.

Organizar datos en los bloques permite al sistema de control de E/S leer o


escribir múltiples registros, el valor de un bloque, para cada transacción en
el flujo de los datos.

NOTA: EN LA GUÍA EXISTE UN PROBLEMA PROPUESTO Y UN


ALGORITMO PARA LA SOLUCIÓN DEL MISMO.

UNIDAD 8: EJEMPLOS DE PROGRAMAS


Verificar la Secuencias

Una secuencia puede ser:

 Una serie continua o conectada: el alfabeto


 Un orden consecutivo o por rango: los naipes
 Un conjunto de elementos ordenados: los números naturales

Una verificación de secuencia es el proceso de garantizar el orden correcto


de los registros al procesar un archivo secuencial, esto implica que esos
datos se han ordenado previamente y requiere una jerarquía de datos y un
valor clave para determinar el orden correcto

Verificar la secuencia implica trabajar con un archivo de registros de datos


que se ha ordenado previamente, generalmente en orden ascendente.
Ejemplos de valores claves para ordenar pueden ser el número del
empleado para registros de empleado o el número de parte para los
registros del inventario.

El proceso de ordenar las cosas en orden ascendente es un problema de


programación clásico. Esto se puede realizar a través de alguna función del
sistema o proceso periférico fuera del programa que se está produciendo.

1. Rupturas de Control

La ruptura de control (Control Break) es el reconocimiento de un cambio en


el valor clave cuando se procesa secuencias de registros que contienen
múltiples registros para

una clave. Normalmente se usa para procesar registros en secuencia en un


sistema que

contiene múltiples actualizaciones a registros maestros.

La ruptura de control normalmente implica recolectar subtotales o imprimir


los resúmenes intermedios.

Un ejemplo de procesamiento con ruptura de control es el procesamiento de


promedio de notas de los estudiantes de un salón de clase. La clave para
hacer la ruptura de control puede ser ellO del estudiante o el nombre del
estudiante.

A medida que el programa lee el conjunto ordenado de los registros de


notas del estudiante, promedia las notas de todos los cursos del estudiante
en particular y rompe el control cuando encuentra un nuevo ID de
estudiante o nombre.

Al interrumpir el control, este programa calcula el promedio de notas del


estudiante y luego reinicializa todos los acumuladores para preparar el
procesamiento del próximo estudiante.
2. Emparejar Transacciones

Emparejar Transacciones es emparejar el valor clave de un registro de un


archivo contra el valor clave de los registros en un archivo maestro

El Archivo Maestro es una colección de registros que contienen los datos


permanentes o acumulados para un sistema.

Archivo Maestro

Transacciones

00120
01655 01655
59437
24898
76990
59437
76990
98144

Transacciones

Emparejar transacciones es una actividad común en el procesamiento de


archivos. Típicamente hay muchos registros de transacción para ser
procesados contra sólo un registro en el archivo maestro con el valor clave.

Algunos ejemplos dónde se aplica son:

• Las notas del estudiante de un semestre, las transacciones,


emparejado contra los registros de notas permanentes para la
cohorte, el archivo maestro
• La comprobación diaria y la actividad de depósito, las transacciones,
emparejado contra el registro de cuenta para la cuenta corriente, el
archivo maestro
• Diariamente el punto de venta y la actividad de reabastecer, las
transacciones, emparejado contra la información detallada de
inventario actual para un producto, el archivo maestro

Ejercicio de Punto de Chequeo

Diseñe un programa para generar un informe del resumen de ventas para


un grupo de departamentos. El formato del informe debe reflejar el número
del departamento y las ventas totales. Cada departamento puede tener
múltiples registros de entrada. Se requiere verificar la secuencia del número
del departamento. Si un registro de entrada está fuera de la secuencia,
imprima un mensaje de error, los resultados acumulados y termine el
programa. Su informe debe contener las cabeceras de las columnas y debe
ocuparse de páginas múltiples. Un título para e[ informe es optativo. Su
tarea será examinar los registros de entrada y el formato del informe
deseado y hacer [o siguiente:
• Liste la entrada, salida y localidades de almacenamiento de proceso
requeridas
• Liste los requisitos de pre-proceso, proceso y post-proceso
• Dibuje un diagrama de flujo que muestre una solución correcta
• Verifique su solución usando los dos juegos de entrada que se
muestran a continuación:

Entrada 1: Entrada 2:

5 200.00
5 200.00
5 100.00
5 100.00
5 100.00
5 100.00
16 300.00
6 50.00
16 200.00
6 200.00
9 50.00
16 300.00
Salida 1: Salida
6 2:
200.00
16 100.00
Dpto. No. Ventas Dpto. No. Ventas

5 400.00 5 400.00

6 250.00 16 500.00

16 400.00 Error de Secuencia

Punto de Chequeo

You might also like