Anda di halaman 1dari 151

Universidad Nacional de Luján

Departamento de Ciencias Básicas


División Estadística y Sistemas

Cuaderno de Estudio

Metodología de

la Programación

Jorge Peri
Carlos Rodriguez
Jorge Scucimarri
Fernando Bordignon

Material destinado a alumnos que cursen las asignaturas


Computación ó Informática en carreras no relacionadas con los
Sistemas de Información.

Publicación oficial del Departamento de Ciencias Básicas de la Universidad Nacional


de Luján, aprobada en el Concurso Anual de Publicaciones DCB 2002.

Enero - 2004
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

2
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Índice General
Primera Parte: Conceptos Básicos
Introducción 5
Procesamiento 6
Algoritmos 9
Programas 11
Definiciones Básicas 13
Máquina de Von Neumann 14
Lenguajes de Programación 18
Lenguaje de Máquina 18
Lenguaje Ensamblador 19
Lenguajes de Alto Nivel 19
Intérprete 19
Compilador 20
Ventajas de los Lenguajes de Alto Nivel 20
Desventajas de los Lenguajes de Alto Nivel 21
Paradigmas de Programación 21
Metodología de la Programación 24
Sistemas de Información 25
Ingeniería de Software 26
Guía de Lectura - Conceptos Básicos 29

Segunda Parte: Introducción a la Programación


Datos 31
Tipos de Datos Primitivos 32
Variables 33
Declaración de Constantes y Variables 34
Expresiones y Operadores 35
Operadores Aritméticos 35
Operadores Relacionales 36
Operadores Lógicos 40
Orden de Evaluación de los Operadores 42
Funciones del Lenguaje 43
Trabajo Práctico I - Introducción a la Programación. 45

Tercera Parte: Programación Estructurada: Estructuras de Control


Estructogramas o Diagramas Chapín 50
Escritura de Programas 52
Entrada y Salida de Información 53
Estructura Secuencial 57
Trabajo Práctico II - Estructura Secuencial 59

Estructura de Selección 63
Decisiones 63
Estructura Condicional Simple 64
Estructura Condicional Compuesta 66
Selecciones Anidadas 71
Menú de Opciones 75
Estructura de Selección Múltiple 79
Trabajo Práctico III - Estructura Condicional 81

3
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Estructura Repetitiva o Iterativa 87


Estructura Mientras 88
Estructura Repetir 91
Estructura Repetir-Hasta 92
Estructura Para 94
Búsqueda del Extremo 97
Validación de Datos 98
Trabajo Práctico IV - Estructura Repetitiva 100

Cuarta Parte: Programación Estructurada: Archivos Secuenciales


y Arreglos
Archivos Secuenciales 107
Operaciones Sobre Archivos 110
Grabación de Datos 110
Recuperación de Datos Grabados 113
Organización Secuencial 115
Acceso Secuencial 115
Modificaciones de Datos Sobre Archivos Secuenciales 117
Trabajo Práctico V - Archivos Secuenciales 121

Arreglos 125
Ordenamientos de Vectores 133
Ordenamiento por Inserción 138
Búsqueda en Vectores 139
Trabajo Práctico VI – Arreglos 141

Bibliografía 151

4
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Primera Parte
Conceptos Básicos

Introducción

Antes de tratar la problemática de la programación, se debe definir que es una


computadora. Podemos decir que es una máquina capaz de procesar
información, entendiendo por procesar a la tarea de producir un cambio de
forma en la información. Conceptualmente se puede definir al computador como
una máquina que puede realizar tres tareas básicas:

- Ingresar datos
- Procesar datos
- Producir una salida de datos

ENTRADA PROCESO SALIDA

La entrada y salida de datos, son las tareas que permiten que la computadora se
comunique con el exterior, siendo necesario para ello que el mismo posea
mecanismos que permitan al usuario poder ingresar datos y recibir las salidas que
el computador emita. Estos mecanismos se denominan dispositivos de
Entrada/Salida, y es necesario contar con al menos uno de cada tipo para que la
computadora interactué con su contexto.

Existe gran variedad de dispositivos, adecuándose cada uno de ellos a la forma en


que se encuentre la información de entrada o en que deba quedar la de salida.

Dispositivos de entrada

El más utilizado es sin lugar a dudas es el teclado, que se basó en un


mecanismo similar al de las máquinas de escribir, contando a su vez con
una serie de teclas que cumplen funciones específicas.

Otros dispositivos de entrada son el mouse o apuntador que permite


desplazar un puntero por la pantalla para seleccionar una tarea a realizar, el

5
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

lápiz óptico que permite ingresar al computador movimientos en distintas


direcciones, el scanner que posibilita el ingreso de una imagen y una
extensa lista compuesta por dispositivos que se crean para facilitar el
ingreso de información que se encuentra en distintas formas y estados.

Dispositivos de salida

En cuanto a este tipo de dispositivos, los más utilizados son la el monitor y


la impresora. Existe gran variedad de monitores: color, monocromáticos,
de alta y baja resolución, etc. Cada tipo de monitor se adecua al tipo de
datos que se quiera mostrar. La impresora permite la obtención de una
salida permanente que es impresa sobre papel de distintas medidas según
el tamaño deseado. También podemos encontrar distintos tipos de
impresora, variando entre ellas la velocidad de impresión, el tipo de
caracteres que pueden imprimir, la capacidad de graficar o no, la
posibilidad de imprimir a color, etc. El plotter es un dispositivo de
impresión que permite el trazado de líneas de distintos colores, utilizado
generalmente en la impresión de planos.

Dispositivos de Entrada/Salida

Estos dispositivos tienen la capacidad de enviar y recibir datos al


computador y, a su vez, permiten el almacenamiento de información en
forma permanente, esto es, aún después de apagado el computador.
Existen dos grandes grupos dentro de estos dispositivos, los mecánicos y
los magnéticos, tendiendo estos últimos a desplazar a los primeros.

Dentro de los mecánicos se encuentran la tarjeta y la cinta perforada,


ambas casi en desuso.

En el grupo de los magnéticos encontramos a la cinta magnética, que es un


carrete de cinta abierta, que se utiliza generalmente para almacenar
información de resguardo o backup, el casette o cartridge que es un
cartucho de cinta magnética cerrado y se utiliza con fines similares al los de
la cinta abierta. Las tarjetas magnéticas (plástica, metálica o de papel), que
tienen una banda de cinta magnética adherida a ella, y los diskettes y discos
magnéticos, que son los dispositivos de este tipo más utilizados en la
actualidad, por su gran velocidad de lectura y grabación, gran capacidad de
almacenamiento y facilidad de acceso a la información almacenada en los
mismos.

6
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

A estos dispositivos la información llega luego de haber ingresado al


computador por un dispositivo de entrada, y sale al exterior pasando por la
computadora hacia un dispositivo de salida.

DISPOSITIVO
ENTRADA

DISPOSITIVO
COMPUTADORA
SALIDA

DISPOSITIVO
SALIDA

Procesamiento

El computador por sí solo es incapaz de procesar información. El


conjunto de dispositivos descriptos anteriormente conforma un autómata capaz
de efectuar las tareas que se le ordenan, pero carece del conocimiento necesario
para decidir cuáles son esas tareas que debe ejecutar.

Lo que se denomina sencillamente "procesamiento de la información"


constituye una actividad por lo general muy compleja, mientras que la máquina
puede ejecutar solamente tareas elementales, como hacer cuentas,
comparaciones, imprimir, almacenar datos, etc. Veamos un ejemplo típico y
relativamente sencillo:

Ejemplo 1

Liquidación de haberes: Se desea hacer un recibo de sueldo de un determinado


empleado de una empresa, ello requiere una serie de datos de entrada, que
podrían ser los siguientes:

a) Nombre y apellido del empleado.

7
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

b) Número de legajo.
c) Categoría
d) Antigüedad
e) Estado civil
f) Cantidad de hijos
g) Obra social
h) Premios
i) Sindicato
etc.

En función de toda esta información el computador deberá realizar los cálculos


necesarios y producir las siguientes salidas:

a) Recibo de sueldo
b) Cheque
c) Descuento para la caja de jubilación
d) Aporte a la obra social
e) Aporte al sindicato
etc.

En un caso real este proceso se efectúa para muchos empleados, con lo cual los
descuentos y aportes se imprimen en forma de listados. Para poder producir la
salida requerida en función de los datos de entrada, el computador deberá
ejecutar una cantidad de tareas como las siguientes:

a) En función de la categoría, consultar en una tabla cuál es el sueldo


básico.
b) En función de la antigüedad, calcular el adicional por ese concepto.
c) Calcular los adicionales por esposa, hijos y escolaridad.
d) Calcular los aportes a la caja de jubilación, obra social y sindicato.
e) Calcular el neto a cobrar
etc.

Como se ve, el procesamiento necesario para producir una liquidación de


haberes, es el resultado de la ejecución de una serie de tareas básicas, las cuales
pueden descomponerse en otras aún más elementales.

Para que estas tareas básicas conduzcan al resultado que se pretende deben ser
ejecutadas en un cierto orden, y tanto la definición de las tareas como el orden
deben estar definidos previamente al momento de la ejecución. La definición de

8
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

las tareas se efectúa mediante lo que denominamos "instrucciones", que son


órdenes que el computador puede identificar y ejecutar.

Algoritmos

Un algoritmo es la especificación rigurosa de una secuencia de pasos para


alcanzar un resultado deseado en un tiempo finito. En su acepción más general,
el término algoritmo puede aplicarse a casi cualquier actividad de la vida diaria,
son algoritmos las recetas de cocina, los programas de actos, las instrucciones de
uso de un aparato, etc.

En todos estos casos existen dos características vinculadas con el concepto de


algoritmo, por un lado se trata de tareas (batir un huevo, ejecutar una nota
musical, etc.), y por el otro hay un orden cronológico en el cuál deben ser
ejecutadas.

Si se examina una de estas tareas o instrucciones, se observa que su ejecución


implica a su vez la ejecución ordenada de otras tareas más elementales, por
ejemplo para batir un huevo se requiere tomar un recipiente, tomar un batidor,
cascar los huevos, colocarlos dentro del recipiente, etc. A su vez, cada una de
estas tareas puede describirse en función de otras más elementales aún, y así
sucesivamente.

Con este concepto, podemos decir que un algoritmo es un conjunto finito de


algoritmos para producir un proceso determinado, esto es lo que denominamos
"definición recursiva". Para que esta definición no conduzca a una sucesión
infinita, sería necesario definir aquellas instrucciones elementales que no pueden
definirse como algoritmos.

Algoritmos comunes

° Ver una película

1. Buscar la película

2. Si el televisor y la reproductora de vídeo se hallan


apagados, encenderlos

3. Sacar la película del estuche

9
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

4. Introducirla en la videocasetera

5. Tomar el control remoto

6. Sentarse en un sillón

7. Iniciar la reproducción y ajustar controles de imagen y


sonido

8. Ver la película

° Algoritmo para cambiar una rueda a un automóvil.


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

° Determinar el mayor de tres números enteros.

Pasos del algoritmo :

1.- Comparar el primero y el segundo entero,


deduciendo cuál es el mayor.

10
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

2.- Comparar el mayor anterior con el tercero y


deducir cuál es el mayor. Este será el resultado.

Los pasos anteriores se pueden especificar con mayor detalle, es decir


realizar un refinamiento del algoritmo.

1.- Solicitar el primer número (N1)


2.- Solicitar el segundo número (N2)
3.- Comparar N1 con N2 y determinar el mayor
y llamarlo MAYOR; si los números son iguales,
seleccionar N1 y llamarlo MAYOR.
4.- Solicitar el tercer número (N3)
5.- Comparar MAYOR con N3 y seleccionar el
mayor y llamarlo MAYOR; si los dos números
son iguales, seleccionar a MAYOR.
6.- Mostrar el valor MAYOR.
7.- Fin

Programas

El computador es una herramienta para la resolución de problemas, más potente


será cuanto mayor sea su capacidad de modelar soluciones adecuadas para cada
problema.

LLamamos programación a la tarea de construir programas que efectúen el


procesamiento de la información que nos proponemos. Un esquema de
procesamiento de la información puede describirse como sigue:

a) Análisis del Problema, dando como resultado un modelo preciso del


ambiente del problema.

b) Diseño de una solución. Teniendo en cuenta los datos de entrada y de


salida.

11
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

c) Especificación de algoritmos. Es decir, cuál es la secuencia lógica de


instrucciones que el computador debe ejecutar para producir los datos de
salida a partir de los datos de entrada, teniendo en cuenta que una
transformación sobre los mismos datos puede resolverse con una
utilización de recursos diferentes.

d) Escritura de programas. El algoritmo debe expresarse en un lenguaje de


programación concreto y acorde a las característica del problema, que la
maquina pueda interpretar y ejecutar.

e) Verificar. Una vez escrito el programa en un lenguaje determinado se


debe verificar que su ejecución conduce al resultado deseado con datos
representativos del problema real.

Una de las ventajas fundamentales del procesamiento electrónico es que los


tareas descriptas arriba se efectúan una sola vez, y el programa queda disponible
para ejecutarse cuantas veces se desee. En el ejemplo de la liquidación de
haberes, una vez construido el programa, será ejecutado todos los meses para
que produzca la liquidación, cambiando únicamente los datos de entrada, debido
a aumentos, cambios de antigüedad, etc.

12
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Definiciones Básicas
Informática: Disciplina que estudia el análisis y resolución de problemas con la
finalidad de procesar información automáticamente.

Computadora: Maquina electrónica con capacidad de realizar cálculos


numéricos y lógicos, cuya finalidad es ejecutar programas almacenados que
resuelven problemas.

Dato: Es una representación de un hecho.

Información: Son datos recolectados y procesados de alguna forma, que poseen


una relevancia para un observador particular. De forma más estricta,
información es cualquier hecho que reduzca la incertidumbre.

Hardware: Conjunto de elementos físicos relacionados que componen una


computadora.

Software: Son los datos y programas que hacen funcionar a una computadora.
Es de carácter intangible.

Algoritmo: Conjunto finito y no ambiguo de etapas expresadas en un cierto


orden, que a partir de condiciones iniciales pueda resolver un problema en un
tiempo finito.

Programa: Algoritmo codificado en algún lenguaje de programación, que una


computadora es capaz de interpretar y ejecutar , a los efectos de resolver un
determinado problema.

Usuario: Persona que utiliza los servicios que le brinda la computadora.

13
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Máquina de Von Neumann


En el año 1946, John Louis Von Neumann -junto a otros colaboradores-
escribió un artículo de investigación titulado "First Draft of a Report of the
EDVAC". En el mencionado documento se expresaban algunas ideas acerca de
como debía operar una computadora. A tales conceptos, derivados del artículo,
se los conoce con el nombre de Máquina o Arquitectura de Von Neumann; y
han brindado las bases para la construcción y el desarrollo de computadoras
hasta los días actuales.

Hasta antes de Von Neumann la programación de una computadora consistía


directamente en la reordenación física de sus componentes. La arquitectura Von
Neumann se fundamenta en el concepto de programa almacenado; donde de
forma revolucionaria, plantea que las instrucciones y los datos tenían que
almacenarse juntos en un medio común y uniforme -denominado memoria-, en
vez de separados. Así las instrucciones y los datos podían leerse y escribirse bajo
el control del programa. Nótese que un elemento de memoria o celda tiene una
calidad ambigua con respecto a su interpretación -es instrucción o dato-; esta
ambigüedad se resuelve al momento de la ejecución del programa almacenado,
debido a que él mismo determinará que celdas contienen datos y cuales
instrucciones.

Un segundo concepto, introducido por Von Neumann, es la ruptura de


secuencia. Se dotó a la computadora de una instrucción denominada "salto
condicional", donde según el resultado de una operación, se ejecutaría la siguiente
instrucción u otra.

Junto con la arquitectura se definió un ciclo de trabajo, en toda ejecución de


programa, que constaba de las siguientes operaciones:

Mientras haya instrucciones {


Tomar de la memoria la siguiente instrucción.
Decodificar la instrucción.
Tomar de la memoria él o los operandos.
Ejecutar la operación.
Almacenar los resultados.
}

A la computadora debe considerársela como una máquina procesadora de


información capaz de transformar un programa escrito en un lenguaje de alto
nivel -generalmente expresado en lenguaje natural- en un programa en lenguaje

14
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

que el hardware pueda decodificar y ejecutar. La tarea de conversión de lenguaje


de alto nivel a lenguaje de máquina la debe realizar un programa denominado
compilador.

La máquina propuesta por Von Neumann consiste de los siguientes elementos:


(a) una memoria, (b) una Unidad Aritmético Lógica (UAL) , (c) una Unidad
Central de Proceso (UCP) y (d) una Unidad de Control (UC) , cuya función
básica es la de gerenciar el ciclo de trabajo descripto anteriormente.

Memoria
de
trabajo

Unidad de Control

Unidad Unidad
Unidad
de de
Registros Aritmético
Entrada Salida
y Lógica

Unidad Central de Proceso

Flujo de información
Flujo de control

Arquitectura original Von Neumann

Memoria

Es un componente de hardware destinado al almacenamiento de los programas y


los datos. A la memoria de trabajo, donde es posible leer y escribir, se la conoce
con el nombre de memoria de acceso aleatorio (RAM). Su nombre deriva de que
es posible acceder directamente a cualquier lugar de ella. Existe un segundo tipo
de memoria, de solo lectura, denominada ROM; sobre la cual los fabricantes
graban programas y datos básicos para el funcionamiento de la computadora.

Unidad Aritmético y Lógica

La unidad aritmética y lógica es el componente encargado de realizar las


operaciones tanto aritméticas como lógicas derivadas de la ejecución de un
programa, es dirigida por la Unidad de Control.

La UAL comprende:

15
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

• Varios registros de memoria llamados acumuladores, donde se almacenan


los resultados parciales de las operaciones .

• Circuitos dedicados a la suma, resta, multiplicación, división,


comparación y testeo.

La Unidad de Control

La unidad de control es el módulo encargado de coordinar las operaciones que se


deben realizar para procesar la información. Interpreta las instrucciones del
programa y genera señales de control necesarias para gobernar el funcionamiento
del resto de los elementos que componen una computadora.

Un pequeño espacio de memoria denominado "buffer de almacenamiento" se


sitúa en la unidad de control, y en él se mantienen temporalmente los datos que
fluyen desde o hacia la memoria principal. Además existen una serie de registros
de propósito general que sirven como almacenamiento interno a la UCP.
Ejemplos de tales registros son:

El registro de instrucciones o contador de programa (IR), que contiene el


código de la próxima instrucción a ejecutarse.

El registro de próxima dirección (PC), que contiene la dirección de la


siguiente instrucción a ser ejecutada.

El registro de dirección de memoria (MAR) que contiene la dirección de la


posición de memoria a ser leída o escrita.

El registro de datos de memoria (MDR) que contiene el dato a ser leído o


escrito en memoria de trabajo.

Registros de propósito general (R) son utilizados para almacenar resultados


intermedios.

Unidad Central de Proceso

La UCP contiene los siguientes tres módulos:

• la memoria
• la unidad aritmética y lógica

16
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

• y la unidad de control

La UAL y la UC conforman al procesador o microprocesador.

Bus Control

Bus de datos

Bus de direcciones

UCP
Memoria Periférico Periférico
Unidad
de de de
Central
trabajo E/S E/S
de
Proceso

Arquitectura actual

Los periféricos de entrada/salida representan a los dispositivos que permiten la


comunicación con el exterior (Ej, módulo controlador de teclado, vídeo,
reproducción de sonido, etc). A los efectos de interconectar todos los módulos se
implementa un cableado denominado sistema de bus.

Un sistema de bus está compuesto por el conjunto de caminos compartidos que


permiten la interconexión de los distintos componentes: UCP, memoria y
periféricos de entrada/salida. Un bus está formado por un conjunto de líneas
eléctricas que permiten la transmisión de datos en paralelo.

Hay tres tipos de buses:

° de datos,

° de direcciones, donde viajan las direcciones de memoria sobre las


cuales se quiere leer o escribir.

° de control, donde viajan señales que controlan el acceso y el uso a los


buses de datos y de direcciones. Señales de control pueden ser: escribir
en memoria, leer de memoria, escribir o leer en un dispositivo de
entrada/salida, etc.

17
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

En resumen, la máquina de Von Neumann es capaz de ejecutar un programa


almacenado en memoria operando iterativamente, donde en cada ciclo ejecuta
una instrucción de programa.

Las fases que componen un ciclo son:

1. Fase de búsqueda de la instrucción. La UCP activa las señales de control


necesarias para leer de memoria la instrucción a la que apunta el contador
de programa (IR)

2. Fase de decodificación. Donde la UCP recibe la instrucción y la


decodifica

3. Búsqueda de operandos. La UCP, en caso de ser necesario, lee los


operandos de memoria o de los registros

4. Ejecución y almacenamiento del resultado. La UCP genera las señales


necesarias para realizar la operación, y en caso de ser necesario, almacena
el resultado en memoria principal o en un registro.

5. La UCP actualiza el registro contador de programa (IR), y pasa a


ejecutar la siguiente instrucción

Lenguajes de Programación
En toda computadora, las instrucciones deben darse en un lenguaje de
programación que ella pueda decodificar. En las primeras computadoras, la
programación era una tarea difícil y laboriosa ya que llaves tipo on-off de válvulas
de vacío debían configurarse a mano. Programar tareas tan sencillas como
ordenar una lista de nombres requería varios días de trabajo de equipos de
programadores. Desde entonces se han desarrollado varios lenguajes
informáticos, algunos orientados hacia funciones específicas y otros centrados en
la facilidad de uso.

Lenguaje de Máquina

Es el lenguaje propio de cada computadora, está construido en base a


instrucciones y estructuras de datos que el procesador directamente -sin
traducción alguna- puede interpretar y ejecutar. La programación se realiza en

18
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

código binario, y es por ello que es bastante difícil construir programas en este
lenguaje. En general, los programadores evitan construir programas basándose en
lenguaje de máquina, prefieren utilizar un lenguaje de mayor nivel que les brinde
un grado más alto de abstracción.

Lenguaje Ensamblador

Es una herramienta "más amigable" que permite reducir y simplificar la tarea de


construir programas. Se basa en asignar un código mnemotécnico a cada orden
en lenguaje máquina, por lo cual la escritura deja de estar exclusivamente en
sistema binario. Una vez que el programador construyó un programa fuente, se
utiliza un programa auxiliar denominado "ensamblador" cuya función es traducir
el código fuente a lenguaje de máquina (a veces llamado código objeto).

Debido a la dependencia existente entre el lenguaje propio de la computadora y


el lenguaje ensamblador, los programas realizados son dependientes
exclusivamente del tipo de procesador de la computadora donde se desarrollaron.

Ejemplo de instrucciones

mov ax,0002 ; instancia el valor 0002 en el registro ax


mov bx,0004 ; instancia el valor 0004 en el registro bx
add ax,bx ; le suma al contenido de ax el contenido de bx

Lenguajes de Alto Nivel

Los lenguajes de alto nivel proveen un método por el cual en base a


instrucciones redactadas en lenguaje natural, los programadores pueden construir
programas de forma más sencilla y en menos tiempo. Otra característica
importante que poseen los lenguajes de alto nivel, es la independencia de sus
instrucciones con respecto al lenguaje de máquina, esto hace que un mismo
programa fuente pueda llevarse a distintas computadoras, con distintos tipos de
procesadores, y funcionar correctamente. La característica enunciada se
denomina portabilidad.

Una vez que un programa construido en lenguaje de alto nivel está finalizado, hay
que traducirlo al lenguaje de máquina de la computadora donde se desea
ejecutarlo. Para ello se utilizan programas traductores, y son de dos tipos:
intérpretes y compiladores.

Intérprete

19
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Es un programa traductor que toma un programa fuente, lo traduce a lenguaje de


máquina y lo ejecuta línea a línea. Ejemplo: Basic, Prolog, Perl.

Traducción y
Programa
Intérprete ejecución
Fuente
simultánea

Dado que existe un proceso continuo de traducción de instrucciones, los


programas que se ejecutan de forma interpretada corren de forma más lenta que
los compilados (están traducidos a código de máquina).

Compilador

Es un programa que traduce los programas fuentes escritos en lenguajes de alto


nivel a lenguaje de máquina, produciendo un programa objeto que
posteriormente puede ser ejecutado.

Programa Programa
Compilador
Fuente Objeto

Ventajas de los Lenguajes de Alto Nivel

° El tiempo de educación de programadores es menor, comparado con los


programadores de lenguajes de bajo nivel.

° Portabilidad de programas fuentes.

° Permiten escribir programas en términos orientados al problema

° La escritura de programas se basa en lenguaje natural.

° Las modificaciones y ajustes de los programas son simples.

° Es posible lograr una importante producción en el desarrollo de programas.

° No se necesita que el programador conozca detalles sobre el hardware


donde se ejecutará el programa.

20
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Desventajas de los Lenguajes de Alto Nivel

° No se aprovechan en profundidad los recursos internos de la máquina. Se


explotan de mejor manera utilizando lenguajes de bajo nivel.

° Los programas ejecutables, en general, necesitan más recursos en su


corrida.

° En general, los programadores no disponen de librerías de ayuda específica


a los problemas que necesitan resolver.

Paradigmas de Programación
Un paradigma de programación es un modelo básico de diseño y desarrollo de
programas. Los llamados paradigmas de programación son conceptualizaciones
genéricas, que agrupan bajo un nombre a distintos lenguajes de programación.

• Paradigma Imperativo

Esta basado en el modelo Von Neumann, en donde un conjunto de


operaciones primitivas realizan una ejecución secuencial. Se utiliza
esencialmente la instrucción de asignación como constructor básico, sobre
el cual se construyen las instrucciones de control secuencial, alternativo e
iterativo.

Los lenguajes imperativos son orientados a instrucciones y por ello se


consideran conducidos por comandos. Los programas escritos en ellos se
basan en la idea de secuencia de instrucciones que se tienen que llevar a
cabo como una receta, son la transcripción de un algoritmo. La unidad de
trabajo es la instrucción. Un programa consta de una secuencia de
sentencias, y la ejecución de cada sentencia obliga al intérprete o
compilador a cambiar el valor de una o más localizaciones en su memoria.

PROGRAM intercambio;
VAR x,y, tmp;
BEGIN
tmp := x;
x := y;
y := tmp;
END.

21
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Algunos de los lenguajes de este tipo son Pascal, Ada y C.

• Paradigma Lógico

Trata de representar conocimiento mediante relaciones (predicados) entre


objetos (datos). Un programa lógico consiste en un conjunto de relaciones,
y su ejecución vendrá a demostrar que una nueva relación se sigue de las
que constituían el programa. Las relaciones serán especificadas con reglas y
hechos. La ejecución de programas lógicos consiste en la demostración de
hechos sobre las relaciones por medio de consultas. Así, el hecho de
programar consistirá en proporcionar a la computadora un universo finito
en forma de hechos y reglas (base de conocimientos), dotándolo de los
medios para realizar inferencias de un hecho a otro. Si posteriormente se le
hacen las preguntas adecuadas, Prolog buscará las respuestas en dicho
universo y nos las mostrará en pantalla.

La programación lógica trata con relaciones en lugar de con funciones, lo


que nos proporciona mayor flexibilidad, ya que las relaciones no tienen
sentido de la dirección y tratan uniformemente argumentos y resultados
(no hay distinción entre parámetros de entrada y de salida).

La idea central de todo esto se la puede expresar utilizando la ecuación de


Kowalski “algoritmo = lógica + control”, de manera que el control
(estrategia para encontrar la solución) se la deja en manos de la
computadora, y sólo se debe atender la lógica (información acerca del
problema).

En programación lógica las expresiones pueden ser hechos, reglas o


preguntas:

Sócrates es hombre (hecho)


Alguien es mortal si alguien es hombre (regla)

=>¿Sócrates es mortal? (pregunta)


=>SI (respuesta)

Aquí el intérprete obtuvo la respuesta sobre un dato que no se le había


dado en forma explícita. El silogismo anterior escrito en el lenguaje Prolog
quedaría como:

22
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Los hechos: hombre(Socrates)


La regla: mortal(x) :- hombre(x)

La pregunta : ? mortal(Socrates)
La repuesta: YES

Ejemplo en lenguaje Prolog, cálculo del factorial de un número

/* factorial(N,F) <- F es el factorial de N */


factorial(0,1).
factorial(N,F) :- N1 is N-1,
factorial(N1,F1),
F is N*F1.

• Paradigma Funcional

El Programa es una Función (o un grupo de funciones). Usualmente


compuesto de Funciones más simples. La relación entre las funciones son
muy simples:

Una Función puede llamar a otra Función, o el resultado de una Función


puede ser usado como el argumento de otra Función. Las variables,
comandos y efectos laterales son exclusivos. Los programas son escritos
enteramente dentro del lenguaje de expresiones, funciones y declaraciones.

Un "programa¨ funcional es un encadenamiento de funciones que se


invocan y se pasan datos unas a otras.

Ejemplo de programa en Common Lisp, cálculo del factorial de un


número :

( DEFUN FACTORIAL (N)


( IF (= N 0)
1
(* N (FACTORIAL (- N 1))) ) )

Dos de estos lenguajes son Scheme y ML.

23
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Metodología de la Programación
Las siguientes son etapas que deben cumplirse a los efectos de resolver un
problema mediante un programa informático:

Definición del problema

Se debe partir de un enunciado de problema claro y completo.

Análisis del problema

A partir de comprender claramente cual es el problema, se procede a


analizar alternativas de solución, como ser:

• Resultados que se esperan.


• Datos de entrada se brindan.
• Posibles métodos a utilizar para obtener la salida deseada.

Construcción de un algoritmo

Por medio de un lenguaje de especificación (puede ser gráfico o un


seudolenguaje) se procede a construir un algoritmo que resuelva el
problema en estudio. En esta etapa, una vez construido el algoritmo, se
sugiere que el diseñador realice una prueba de escritorio -someter el
algoritmo a diversas ejecuciones, variando los datos de entrada y verificar
su funcionamiento- a los efectos de determinar si el método elegido
funciona correctamente.

Codificación

Utilizando un lenguaje de computadora se traduce el algoritmo a un


programa fuente que una máquina sea capaz de entender y ejecutar. Se
recomienda que el técnico que realice esta tarea -el programador- inserte
comentarios junto a las líneas de código a los efectos de facilitar la lectura
del programa (documentación interna) en instancias superiores de
validación o mantenimiento.

Compilación

24
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Si el lenguaje utilizado en el proceso de codificación requiere de una


traducción a lenguaje de máquina se utiliza un programa compilador a los
efectos de generar un programa objeto. Es importante destacar que una
de las funciones de todo compilador es el análisis sintáctico del programa
fuente a los efectos de detectar errores de sintaxis ocasionados por errores
de codificación. El compilador no analiza semántica, es decir que las fallas
de lógica que pueda existir en el programa fuente no son detectadas por el
compilador.

Prueba

Se ejecutar el programa con distintos juegos de datos de entrada y se


corrigen los errores que se puedan presentar. Al final se obtiene un
programa depurado.

Documentación

Etapa final en la cual se realiza la documentación externa en la cual se


explica lo que el programa hace y cuales son los datos de entrada y salida.
parte de esta documentación es requerida por usuarios y por
programadores encargados del mantenimiento del software.

Sistemas de Información
Un sistema es un conjunto de componentes que interaccionan entre sí para lograr
un objetivo común. Por lo tanto, un sistema de información es un conjunto
ordenado de elementos (no necesariamente computacionales) que permiten
manipular toda aquella información necesaria para implementar aspectos
específicos de la toma de decisiones. Los sistemas de información, surgen de la
necesidad de información que experimentan las organizaciones para implementar
un conjunto específico de toma de decisiones.

Un sistema de información es un conjunto de personas, datos y procedimientos


que funcionan en conjunto. El énfasis en sistema significa que los variados
componentes buscan un objetivo común para apoyar las actividades de la
organización. Estas incluyen operaciones diarias de la empresa, la comunicación
de los datos e informes, la administración de las actividades y la toma de
decisiones.

25
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Los sistemas de información son la base de muchas actividades que ocurren en


las organizaciones y en la sociedad. Todas las organizaciones cuentan con alguna
clase o tipo de sistema de información. Las organizaciones han aprendido como
utilizar la información como un instrumento eficaz para la administración; por
ello, buscan que todos los datos medibles sean organizados de manera que sea
fácil registrarlos, almacenarlos, procesarlos, recuperarlos y comunicarlos, según lo
requieran los usuarios que los operan, teniendo con ello un sistema funcional que
satisfaga sus necesidades que lo requieran.

Los sistemas de información cumplen en las organizaciones tres objetivos


fundamentales:

° Automatización de procesos operativos. (Sistemas transaccionales)

° Proporcionar información que sirva de apoyo al proceso de la toma de


decisiones. (Sistemas de soporte a las decisiones)

° Lograr ventajas competitivas a través de su implementación y


uso.(Sistemas estratégicos)

En todo sistema de información existen tres actividades generales. En primer


lugar, recepción de datos de fuentes internas o externas de la organización como
elementos de entrada. Después, se actúa sobre los datos para obtener
información. Finalmente el sistema produce la información para ser utilizada por
el usuario.

En general, los sistemas de información cuentan con algunos de los siguientes


elementos:

° Dispositivos de ingreso de datos.


° Dispositivos de almacenamiento de datos.
° Equipos de comunicaciones.
° Equipos de procesamiento de datos.
° Dispositivos de visualización.
° Procedimientos, programas, métodos y documentación.
° Profesionales del análisis de sistemas de información, para diseñar,
mantener y utilizar los elementos anteriores.

26
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ingeniería de Software
La Ingeniería de Software es un área de las Ciencias de la Computación, que
ofrece métodos y técnicas para desarrollar y mantener software de calidad que
resuelven problemas de información. Comprende el uso de metodologías,
herramientas y técnicas para resolver problemas prácticos que se presentan en la
construcción, desarrollo, soporte y evolución del software.

Las incumbencias propias de un ingeniero de software son variadas, comprenden


el desarrollo de software de base -módulos de sistemas operativos, compiladores
e intérpretes-, el desarrollo de software para sistemas distribuidos y la
construcción de software de aplicación de la más diversa gama.

Ciclo de Vida del Software

Se ha definido un modelo denominado ciclo de vida de software, el cual es una


forma de plantear el desarrollo de proyectos de software. Las fases que lo
comprenden son:

Análisis de requerimientos

Estadio en el cual, en base a un mandato, se reconoce el problema a


resolver. Se estudia el sistema objeto, se hace una evaluación y un
diagnóstico. Finalmente se especifican todos los requerimientos.

Diseño

Como objetivo de la etapa, atendiendo los requerimientos del cliente, se


modela un sistema que satisfaga las especificaciones derivadas del análisis
de requerimientos.

Desarrollo de requerimientos

Se traduce el diseño a programas computables.

Prueba
Por un lado se valida al sistema informático propuesto ejecutando
pruebas intensas de verificación de comportamiento, y por otro lado
se analiza si el modelo a prueba satisface plenamente las
especificaciones de requerimientos.

27
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Implementación
En esta etapa se implementa el nuevo sistema informático a los
efectos de que la organización demandante lo comience a utilizar.
Mantenimiento
Etapa final que tiene por objetivo ajustar el sistema a nuevos
requerimientos y a cambios en el sistema objeto.

28
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Guía de Lectura - Conceptos Básicos

1. Explique mediante un algoritmo el funcionamiento de la máquina de Von


Neumann

2. ¿ Cómo se transfieren las instrucciones y los datos entre la UCP y la memoria


de trabajo?

3. Describa los pasos necesarios para “programar” una máquina. ¿Qué es un


programa fuente? ¿Qué lenguaje se utiliza? ¿Por qué existen lenguajes de alto,
medio y bajo nivel?

4. Describa qué es un paradigma de programación. Caracterice al paradigma


imperativo.

5. ¿De qué maneras es posible ejecutar un programa? ¿Un algoritmo puede ser
ejecutado por una computadora? Justifique.

6. Especifique tres algoritmos relacionados con su ocupación o hobby.

7. ¿Qué es un sistema? ¿Cuál es el objetivo de los sistemas de información?

29
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

30
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Segunda Parte
Introducción a la Programación

Datos

Todo algoritmo utiliza datos. Los datos representan una abstracción de la


realidad. Por ejemplo, para calcular el sueldo de un empleado se necesita realizar
una abstracción de la información relativa al problema en estudio, tal como:
función o cargo, antigüedad, cantidad de hijos, estudios cursados, días trabajados,
etc.
Los datos son unidades atómicas de información, almacenadas en memoria, a
partir de las cuales se realizan las operaciones determinadas por los programas.
Todo dato presenta una serie de atributos que lo caracterizan. Por ejemplo, un
dato que sea el sueldo percibido el último mes por una persona X tendrá los
siguientes atributos:

• Nombre. Es un identificador, y es un nombre simbólico que se refiere a


un dato determinado, es decir, un nombre para referirse a variables,
funciones y cualquier otro objeto definido por el usuario en un programa.
El dato del ejemplo podría tener por nombre "sueldo_último_mes" a los
efectos de identificar a ese objeto concreto.

• Tipo. El tipo de una variable se refiere a la naturaleza de la información


que contiene. Determina la característica del contenido del objeto, es decir,
la información que va a poder contener. En el ejemplo, el tipo del dato
llamado "sueldo_último_mes" es numérico, porque así se expresa un
número real.

Un tipo de dato se caracteriza por:

• Un dominio de posibles valores

• Un modo común de representación de sus valores

• Un conjunto de operadores asociados

31
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

• Valor. Es el contenido en sí del objeto, y está acorde al tipo definido. En


el ejemplo del sueldo será un valor concreto, tal como 345.78.

Sueldo_ultimo_mes porcentaje_aumento
tipo numérico tipo numérico

345.78 22
nombre-empleado
tipo caracter

Ana Gomez
Extracto de una memoria de trabajo

Tipos de Datos Primitivos


Entero

Cualquier valor que pertenezca al conjunto de los números enteros Z { ...,-


3, -2, -1, 0,1, 2, 3,...} y que este en un rango que el lenguaje pueda aceptar.

Ejemplo

temperatura <- -2
humedad <- 78

Real

Cualquier valor perteneciente al conjunto de los números reales R {..., -7,


..., -2.2, ..., 0, ..., 14.4,..., 33, ...} y que este en un rango que el lenguaje
pueda aceptar.

Ejemplo

salario <- 178.23

32
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

saldo <- -55.98

La siguiente tabla muestra las características de los tipos de datos más comunes:

Tipo Tamaño Rango de valores


booleano 1 bit falso, verdadero
byte 8 bits -128...127 / 0..255
short 16 bits -32768 ... 32767
char 16 bits \u0000 ... \uffff
int 32 bits -2147483648 ... 2147483647
long 64 bits -9,22E18 ... 9,22E18
float 32 bits reales de 32 bits
double 64 bits reales de 64 bits

Caracter

Un caracter es un símbolo válido proveniente de un alfabeto. La


concatenación de caracteres da por resultado una cadena o string.

Ejemplo

apellido <- "Diaz Martinez"


animal_peligroso <- "león de Kenia"

Lógico

Posibilitan la representación de dos estados posibles: F) falso y V)


verdadero.

Ejemplo

vacío <- V
asistirá <- F

Variables

Una variable es una identificación, asignada por el programador, a una dirección


de memoria, donde se aloja un dato.

Ejemplo

33
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Pi <- 3.14
IVA <- 21
institución <- "Universidad Nacional de Luján"

Una constante es un dato almacenado en una variable cuyo contenido no puede


ser modificado durante la ejecución de un programa.

Declaración de Constantes y Variables

La declaración de una constante o una variable implica la asignación de un


espacio de memoria de trabajo que estará asociado a ella. El tamaño dependerá
del tipo de dato y lenguaje de programación con el que se trabaje. Al declarar una
variable o una constante se liga al dato con un nombre o identificador, por el cual
se accederá a tal posición de memoria de allí en más. El tipo de dato y el
identificador de una variable son dos atributos asociados a ella.

Ciertos lenguajes de programación, junto con la buena práctica del oficio, exigen
que todas las variables y constantes de un programa sean previamente declaradas
antes de ser utilizadas.

Cuando se desea inicializar o modificar el valor de una variable se realiza una


operación de asignación. Se la simboliza con los caracteres "<-". Asignar significa
asociar un valor determinado a un identificador.

Ejemplo

vacio <- V
saldo <- saldo_anterior + 500
frase <- "Hola" + " " + "Mundo !!!"
resultado <- ((producción - fallados) ^2) - 678

Existe otro objeto denominado literal y es la forma como se escriben los valores
de cada tipo. Ejemplo 26, 789, -9 son literales numéricos, y "hola mundo", "o" y
"zeta" son literales de caracteres.

La asignación es una instrucción donde se asocia un valor a una variable. Del


lado izquierdo siempre habrá una variable, mientras que del lado derecho de la
asignación podrá haber un literal, otra variable ó una expresión.
Ejemplos

34
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

cantidad_de_vehículos <- (6+8) / 2

Donde se evalúa 6 +8 y a lo obtenido se lo divide por 2. Finalmente


al resultado se lo almacena en la variable cuyo identificador es
cantidad_de_vehículos.

Las variables A, B, y C son de tipo lógico.

A <- 12 < 5 En A se almacena el valor de verdad falso


B <- (7 <= 12) En B se almacena el valor de verdad verdadero
C <- 7 >= 7 En C se almacena el valor de verdad verdadero

Con variables de tipo caracter

empleado <- "Carlos Gomez"


cantidad_empleados <- "veinte"

Expresiones y Operadores

Una expresión es una combinación de elementos del lenguaje que al ser


evaluados dan por resultado un valor. Este valor puede ser un número, un
caracter, una cadena o cualquier otro tipo de dato. El tipo de una expresión está
determinado por los tipos de las partes que la componen y la semántica de sus
operadores.

A los efectos de realizar cálculos y operaciones sobre los datos es necesario


contar con alguna forma de combinación que indique la acción a realizar. Se
utiliza una simbología de operadores para formalizar tales cálculos y operaciones.

Un operador es un símbolo que transforma una variable o la combina de alguna


otra manera con otra variable o literal. Por ejemplo, la siguiente expresión tiene
dos operadores, '*' producto y '/' división:

(costo * 1.22)/desvio_mes;

Operadores Aritméticos

Son operadores que se aplican sobre datos numéricos y devuelven igualmente un


dato numérico.

35
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Operador Significado
** Potenciación
+ Signo más (unario)
- Cambio de signo (unario)
* Multiplicación
/ ó div División real y entera
% ó mod resto de división (reales y enteros)
+ Suma
- Resta

Un operador es unario cuando solo tiene un operando, como por ejemplo los
signos de los números (-7, +7, etc.) Un operador es binario cuando necesita dos
operandos, como por ejemplo la suma (8 + 2). Todos los operandos son binarios
excepto la notación de signos, que son unarios.

Ejemplos

Expresión Comentario
7/5 = 3.5 División real
7 div 2 = 3 División entera
7 mod 2 = 1 Resto de división entera

Operadores Relacionales

Permiten realizar comparaciones de valores de tipo numérico o carácter. Estos


operadores sirven para expresar las condiciones en los algoritmos. Proporcionan
resultados lógicos.

Operador Significado
< Menor que
> Mayor que
= Igual que
<= Menor o igual que
>= Mayor o igual que
<> Distinto de

La sintaxis de las operaciones de comparación es:

36
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

expresión1 operador de relación expresión2

Una vez evaluada la expresión, se obtendrá un resultado que será Verdadero o


Falso.

Dado X <- 12 y Y <- 5

Expresión Resultado
X>Y Es Verdadero
(X-3) < (Y-2) Es Falso
(X-4) >= (Y+3) Es verdadero
"A" > "B" Es verdadero
"z" > "Z" Es verdadero
"uno" = "unos" Es falso
"uno" < "unos" Es verdadero

La Tabla ASCII

La tabla ASCII codifica la equivalencia en bits de todos los números, letras y


símbolos. También contempla una serie de caracteres de control que sirven para
representar algunos datos que poseen función de control en un sistema
informático; por ejemplo el salto de página o línea, los tabuladores o el beep del
parlante.

En el formato ASCII, para representar un carácter son necesarios grupos de ocho


bits --conjunto conocido como byte u octeto--. Haciendo todas las
combinaciones posibles de ceros y unos que hay en ocho bits (2 elevado a 8), el
resultado es de 256 combinaciones o caracteres diferentes; más que suficiente
para representar todos los caracteres necesarios.

Así, la tabla ASCII dice que una "A" binaria es "01000001", y "Z" equivale a
"01011010". Las personas que contamos en base al sistema decimal, recordamos
mucho mejor que una "A" en la tabla ASCII es un 65 y una "Z", un 90.

Reglas de orden de caracteres ASCII

1. Los caracteres correspondientes a dígitos numéricos están en


su orden natural:

37
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

"0">"1"<"2"<"3"<"4"<"5"<"6"<"7"<"8"<"9"

2. Las letras mayúsculas continúan el orden alfabético:

"A"<"B"<"C"<"D"<, . . . . . .,<"Z"

3. Luego continúan las letras minúsculas, pero sus códigos son


mayores que las letras mayúsculas, por lo tanto se ordenan antes.

"a"<"b"<"c"<"d"<, . . . . . .,<"z"
y
"a">"M">"C">"B"

4. El resto de los caracteres.

En la siguiente tabla ASCII se puede observar el conjunto de los 128 primeros


caracteres y sus equivalencias en el sistema decimal.

Valor Caracter Valor Caracter Valor Caracter


Decimal Decimal Decimal
0 NUL \0 42 * 84 T
1 SOH 43 + 85 U
2 STX 44 , 86 V
3 ETX 45 - 87 W
4 EOT 46 . 88 X
5 ENQ 47 / 89 Y
6 ACK 48 0 90 Z
7 BEL 49 1 91 [
8 BS 50 2 92 \
9 HT 51 3 93 ]
10 LF 52 4 94 ^
11 VT 53 5 95 _
12 FF 54 6 96 `
13 CR 55 7 97 a
14 SO 56 8 98 b
15 SI 57 9 99 c
16 DLE 58 : 100 d
17 DC1 59 ; 101 e
18 DC2 60 < 102 f

38
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

19 DC3 61 = 103 g
20 DC4 62 > 104 h
21 NAK 63 ? 105 i
22 SYN 64 @ 106 j
23 ETB 65 A 107 k
24 CAN 66 B 108 l
25 EM 67 C 109 m
26 SUB 68 D 110 n
27 ESC 69 E 111 o
28 FS 70 F 112 p
29 GS 71 G 113 q
30 RS 72 H 114 r
31 US 73 I 115 s
32 SPACE 74 J 116 t
33 ! 75 K 117 u
34 COMILLAS 76 L 118 v
35 # 77 M 119 w
36 $ 78 N 120 x
37 % 79 O 121 y
38 & 80 P 122 z
39 ' 81 Q 123 {
40 ( 82 R 124 |
41 ) 83 S 125 }
126 ~
127 DEL

° Nótese que el alfabeto ocupa posiciones consecutivas y respeta la


ordenación tradicional.

° Nótese que la mayúsculas preceden a la minúsculas.

° Los primeros 32 símbolos se denominan caracteres de control porque


cumplen funciones específicas, pero no representan información
alfanumérica alguna.

Operadores sobre Cadenas

Los operadores tradicionales sobre cadenas son:

39
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

• Concatenación (+), operador que une dos cadenas para formar una
nueva. Por ejemplo "hola" + " mundo" devolverá una nueva cadena que
contenga "hola mundo".

• Multiplicación (*), operador que copia una cadena un número


determinado de veces. Por ejemplo "ba"'*2 nos devolverá la cadena
"baba", '8'*3 devolverá "888".

Operadores Lógicos

Son aquéllos que permiten la combinación de valores de verdad en una


expresión, que al ser evaluada devuelve un valor de verdad.

El resultado de las operaciones lógicas se determina a través de tablas de verdad


correspondientes a cada operador.

Tabla de Verdad del Operador NOT

A NOT A
V F
F V

Donde A es una expresión booleana

Tabla de Verdad del Operador de Conjunción AND

A B A AND B
F F F
F V F
V F F
V V V

Donde A y B son expresiones booleanas

Tabla de Verdad del Operador de Disyunción OR

A B A OR B
F F F

40
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

F V V
V F V
V V V

Donde A y B son expresiones booleanas

Tabla de Verdad del Operador de Disyunción Exclusiva XOR

A B A XOR B
F F F
F V V
V F V
V V F

Donde A y B son expresiones booleanas

Ejemplos

Expresión Resultado
(3 = 4) AND ( 6 < 7) Falso
NOT (4 < 6) Falso
(3=4) EQV (5=6) Verdadero

Orden de Prioridad de las operaciones

Todas las subexpresiones entre paréntesis se evalúan primero. Las


subexpresiones con paréntesis anidados se evalúan desde el centro
hacia los extremos.

Dentro de una expresión, los operadores se evalúan de la siguiente


manera:

° Se analiza la expresión de izquierda a derecha.

° Si en la expresión existen paréntesis, lo que se encuentra


dentro de estos se evalúan de izquierda a derecha según
orden de prioridad de los mismos.

° Si en la expresión se encuentran más de un par de

41
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

paréntesis, la evaluación se realiza comenzando con el


paréntesis que se encuentra más a la izquierda en la
expresión hasta llegar al par de paréntesis que se encuentra
más a la derecha de la expresión.

Orden de Evaluación de los Operadores


Los operadores de una expresión se evalúan según el siguiente orden:

Tipo de Operador Significado Prioridad

Exponenciación 1
Negación 2
Aritméticos Multiplicación/División 3
División entera 4
Módulo 5
Suma/Resta 6

Mayor 7
Mayor igual 7
Menor 7
De relación Menor igual 7
Igual 7
Distinto 7

Complemento (NO- NOT) 8


Conjunción (Y -AND) 9
Lógicos Disyunción (O - OR) 10
Disyunción exclusiva (XOR) 11

De forma tradicional, la evaluación de operadores de igual orden se realiza


siempre de izquierda a derecha.

Ejemplo de evaluación - A

((4 + 2)^2 - 14) / 2 * 5


(6^2 - 14) / 2 * 5
(36 - 14) / 2 * 5

42
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

22 / 2 * 5
11 * 5
Resultado 55

Ejemplo de evaluación - B:

Siendo a = 10, b = 12, c = 13 y d =10

((a > b)or(a < c)) and ((a = c) or (a > = b))


F T F F
T F
Resultado F

Ejemplo de evaluación - C

5 - 2 > 4 and not 0.5 = 1 / 2


5 - 2 > 4 and not 0.5 = 0.5
3 > 4 and not 0.5 = 0.5
falso and not 0.5 = 0.5
falso and not cierto
falso and falso
Resultado FALSO

Funciones del Lenguaje

Una función es un conjunto de declaraciones, definiciones, expresiones y


sentencias que realizan una tarea específica. Cada función tiene la misión de
realizar un algoritmo determinado a partir de datos de entrada, llamados
parámetros o argumentos, obteniendo un resultado o valor de retorno.

En los lenguajes de programación, sus diseñadores incorporan varias funciones


predefinidas. Los programadores pueden hacer uso de tales funciones del
lenguaje e incorporarlas a sus programas. Existen distintas categorías de
funciones: matemáticas, de cadenas de caracteres, de fecha, de entrada y salida,
etc.

La sintaxis general de una función es:

nombre_función(argumento1,..., argumenton).

43
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejemplos de funciones del lenguaje sobre tipos numéricos:

Nombre Significado Ejemplos


abs(-5)
abs Calcula el valor absoluto
abs(x)
int(-2.8)
Devuelve la parte entera de un
int int(12.1)
número real
Genera un número aleatorio
rnd
(mayor a 0 y menor a 1)
round(2.1)
Redondea un dato a un número
round round(7.125, 2)
determinado de cifras
Calcula el coseno del ángulo n
cos cos(n)
(en radianes)
Calcula el seno del ángulo n (en
sin sin(n)
radianes)
sqrt Calcula la raíz cuadrada de n sqrt(n)

Ejemplos de funciones del lenguaje que operan sobre cadenas:

Nombre Significado Ejemplos


length Calcula el largo de una cadena. length("Hola mundo")
Extrae una subcadena de una
substr substr(cadena,2,3)
cadena de caracteres.
Retorna el caracter ASCII
chr equivalente al número decimal chr(65)
brindado como argumento
Devuelve en minúsculas todas lower(cadena)
lower
las letras de una cadena lower("MaLANdro")
Devuelve en mayúsculas todas upper(cadena)
upper
las letras de una cadena upper("malandro)

Nota: Las funciones detalladas anteriormente son a título informativo. El nombre


exacto y la sintaxis de cada función dependerá del lenguaje de programación a
utilizar. Se aconseja verificar en el manual del lenguaje las características de una
función predefinida a utilizar.

44
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico I - Introducción a la Programación

1. Sean A, B y C variables numéricas, D y E variables cadena y X e Y lógicas.


Los valores de las mismas, en un instante dado, son:

A: 3 B:-5 C: 1 D:'libro' E:'librería' X: T Y: F

Calcular los siguientes predicados:


a) (A > 3 OR Y) AND (C = 1 XOR D < E)
b) ((NOT (A<>3) AND X) OR C = 1) AND (D < 'libra')
c) NOT (NOT x AND (A > 5 XOR B > 10)

2. Sean I y J dos variables numéricas enteras, cuyos valores son 6 y 12


respectivamente. Indicar cuáles de los siguientes predicados son verdaderos.

a) 2*I<J
b) 2*I<1
c) I > 0 AND I < 10
d) I > 25 OR (I < 50 AND J < 50)
e) I < 4 OR J > 5
f) NOT I > 6

3. Sean X, Y, Z y T variables numéricas. Escribir los predicados


correspondientes a:

a) Los valores de X e Y son superiores a 3


b) Los valores de X, Y y Z son idénticos
c) Los valores de X, Y y Z son iguales pero difieren del de T
d) El valor de X está comprendido estrictamente entre los valores de Y
y de T, y el valor de Y es inferior al de T

4. Dados los siguientes valores para las variables X, Y, Z, evaluar las expresiones
e indicar el resultado de las siguientes expresiones:

Siendo X=2, Y=0 y Z=1 y los operadores &&=and , ||=or , !=not

a) (X && Y) || (X && Z)
b) (X || ! Y) && (!X || Z)
c) X || Y && Z

45
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

d) ! (X || Y) && Z

5. Dados los siguientes valores de I, J, K y L, añadir los paréntesis que sean


necesarios a las expresiones para que se evalúen todas dando resultado
"verdadero".

I=10, J=19, K=3, L=0

a) I == J || K
b) I >= J || I <= J && K
c) ! K || K
d) ! L && L

6. Modificar los paréntesis, de los problemas del ejercicio anterior, para que el
resultado fuera falso.

46
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Tercera Parte
Programación Estructurada - Estructuras de Control:

Los programas para computadoras deben estar escritos con un alto grado de
estructuración, lo cual les permite ser fácilmente comprensibles en actividades
tales como pruebas, mantenimiento y modificación de los mismos. Mediante la
programación estructurada todas las bifurcaciones de control de un programa se
encuentran estandarizadas, de forma tal que es posible leerlos desde su inicio
hasta su final en forma continua, sin tener que saltar de un lugar a otro del
programa siguiendo el rastro de la lógica establecida por el programador.

Los lenguajes de programación tienen un conjunto mínimo de instrucciones que


permiten especificar un algoritmo, y son:

1. Secuencia: Sucesión simple de dos o mas operaciones.

2. Selección: Bifurcación condicional de una o más operaciones

3. Interacción: Repetición de un conjunto de instrucciones mientras se


cumpla una condición.

Estos tres tipos de estructuras lógicas de control pueden ser combinadas para
producir programas que manejen cualquier tarea de procesamiento de
información.

Un programa estructurado está compuesto de segmentos o bloques , los cuales


pueden estar constituidos por unas pocas instrucciones o por una página o más
de codificación. Cada segmento tiene solamente una entrada y una salida, estos
segmentos, asumiendo que no poseen lazos infinitos y no tienen instrucciones
que jamás se ejecuten, se denominan programas propios. Cuando varios
programas propios se combinan utilizando las tres estructuras básicas de control
mencionadas anteriormente, el resultado es también un programa propio.

La programación Estructurada esta basada en el Teorema de la Estructura, el cual


establece que cualquier programa propio (un programa con una entrada y una
salida exclusivamente) es equivalente a un programa que contiene solamente las
estructuras lógicas mencionadas anteriormente.

47
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Una característica importante en un programa estructurado es que puede ser


leído en secuencia, desde el comienzo hasta el final sin perder la continuidad de la
tarea que cumple el programa, lo contrario de lo que ocurre con otros estilos de
programación. Esto es importante debido a que, es mucho más fácil comprender
completamente el trabajo que realiza una función determinada, si todas las
instrucciones que influyen en su acción están físicamente contiguas y encerradas
por un bloque. La facilidad de lectura, de comienzo a fin, es una consecuencia de
utilizar solamente tres estructuras de control y de eliminar la instrucción de
desvío de flujo de control, excepto en circunstancias muy especiales tales como
la simulación de una estructura lógica de control en un lenguaje de programación
que no la posea.

Como ventajas del uso de la programación estructurada se pueden citar los


siguientes ítems:

° Un programa escrito de acuerdo a las reglas de la programación


estructurada no solamente tendrá una estructura, sino también una
excelente presentación.

° Un programa escrito de esta forma tiende a ser mucho más fácil de


comprender que programas escritos en otros estilos. La facilidad de
comprensión del contenido de un programa puede facilitar el chequeo
de la codificación y reducir el tiempo de prueba y depuración de
programas. Esto último es cierto parcialmente, debido a que la
programación estructurada concentra los errores en uno de los factores
más generador de fallas en programación: la lógica.

° Un programa que es fácil para leer y el cual está compuesto de


segmentos bien definidos tiende a ser simple, rápido y menos expuesto
a mantenimiento. Estos beneficios derivan en parte del hecho que,
aunque el programa tenga una extensión significativa, en
documentación tiende siempre a estar al día, esto no suele suceder con
los métodos convencionales de programación.

El teorema de la estructura establece que un programa propio puede ser escrito


utilizando solamente las siguientes estructuras lógicas de control: secuencia,
selección e iteración.

48
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Un programa se define como propio si cumple con los dos requerimientos


siguientes:

° Tiene exactamente una entrada y una salida para control del programa.

° Existen caminos seguibles desde la entrada hasta la salida que conducen


por cada parte del programa, es decir, no existen lazos infinitos ni
instrucciones que no se ejecutan.

Las tres estructuras lógicas de control básicas, se definen de la siguiente forma:

Secuencia: es la estructura de control más simple y representa una lista ó


secuencia de instrucciones. En términos de diagrama la secuencia es
representada por una instrucción después de la otra, como se muestra a
continuación.

Inicio

Leer num1, num2

suma <- num1 + num2

dif <- num1 - num2

Escribir("SUMA: ", suma)

Escribir("DIFERENCIA: ", dif)

Fin

Selección: Se basa en ejecutar una de dos acciones tomando la decisión en


base al resultado de evaluar una condición. Esta estructura de control es
denominada usualmente condicional.. La representación en forma de
diagrama de flujo de esta estructura lógica de control se muestra a
continuación:

Condición
V F

Instrucción 1 Instrucción 1

.... ....

Instrucción n Instrucción n

49
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Donde V y F son bloques a ejecutar en caso de que la evaluación de la


condición sea verdadero o falso.

Iteración: Esta estructura es utilizada a los efectos que se repita la


ejecución de un conjunto de instrucciones mientras se cumpla una
condición. Generalmente a esta estructura se le conoce como Mientras-
Hacer y su representación se muestra a continuación:

Mientras <condición> hacer

Instrucciones

donde el resultado de la condición a evaluar determinará si se ejecuta el


bloque de instrucciones (en caso de resultar verdadero) o se continua con
la siguiente línea de programa.

Estructogramas o Diagramas Chapín

Los diagramas de Chapin (también conocidas como diagramas de Nassi-


Schneiderman) describen los procedimientos usados para recibir, procesar, y
transmitir información. Los diagramas proporcionan toda la lógica necesaria para
que programadores puedan escribir programas estructurados en cualquier
lenguaje de programación o a los efectos de documentar procedimientos
específicos.

El modelo de diagramas fue desarrollado por Isaac Nassi y Ben Shneiderman,


publicándose en el año 1973. Corresponden a las normas DIN 66261 e ISO/IEC
8631:1989. Dado que muestran las estructuras de un programa, también se
denominan "estructogramas".

El concepto es simple: cada bloque (o secuencia de acciones) se representa


dentro de un rectángulo; cada estructura utiliza una forma de representación
particular, pudiendo a su vez encerrar otros bloques.

50
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

En los diagramas NS existen seis estructuras: Secuencial, Decisión (si


condicional), Selección, Para, Mientras y Repetir.

Inicio

Leer seccion, años

basico <- 800

seccion = 1

V F

sueldo <- basico + 120

Escribir("El sueldo <- basico + 250


años < 5
número es impar") antiguedad = 0
V F

antiguedad <- antiguedad <-


sueldo*10/100 sueldo*20/100

total <- sueldo + antiguedad

escribir("El monto a abonar es ", total)

Fin

Ejemplo de diagrama de Chapín

51
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Escritura de Programas

La utilización de la identación es importante debido a que, cuando se es


consistente en su utilización, facilita la lectura de los programas al mostrar en una
forma ordenada las relaciones existentes entre las distintas instrucciones.
A continuación pueden observarse dos programas, los cuales realizan la misma
función, pero el de la derecha es más fácil de comprender.

Sin identación Con identación


print "Ingrese seccion del empleado: "; print "Ingrese seccion del empleado: ";
$seccion = <STDIN>; chop($seccion); $seccion = <STDIN>; chop($seccion);
print "Ingrese años de antiguedad : ";
$anios = <STDIN>; chop($anios); print "Ingrese años de antiguedad : ";
$basico = 800; $anios = <STDIN>; chop($anios);

if ($seccion == 1) $basico = 800;


{$sueldo = $basico + 120;
if($anios < 5) if ($seccion == 1)
{$antiguedad = $sueldo*10/100;} {
else{$antiguedad = $sueldo*20/100;} $sueldo = $basico + 120;
}else{$sueldo = $basico + 250; if($anios < 5)
$antiguedad = 0;} {
$antiguedad = $sueldo*10/100;
$total = $sueldo + $antiguedad; }
print "El monto a abonar es $total\n"; else
{
$antiguedad = $sueldo*20/100;
}
}
else
{
$sueldo = $basico + 250;
$antiguedad = 0;
}

$total = $sueldo + $antiguedad;

print "El monto a abonar es $total\n";

Adicionalmente se recomienda la inserción de comentarios en los programas.


Tales citas ayudan a los programadores a identificar fácilmente la misión de las
partes con la finalidad de facilitar su mantenimiento.

Normas de Identación

Las siguientes son sugerencias para el desarrollo de una política de identación en


un programa:

a) Se obtiene consistencia si todas las instrucciones de un mismo nivel


comienzan en una misma columna.

52
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

b) En los lenguajes en que se hagan declaraciones sobre las variables a


utilizar, la información quedará mas claramente representada si los
atributos declarados se alinean en forma vertical.
c) El uso de líneas vacías ayuda a mostrar con mas claridad las relaciones
existentes entre distintos ítems agrupados en las declaraciones
d) Las instrucciones son mucho mas fáciles de localizar y de cambiar si no
se escribe mas de una instrucción por línea.
e) La visión de control de las estructuras lógicas o de los bloques se
clarifica si las instrucciones controladas son idénticas por alguna
cantidad constante. Se sugiere una idéntica de tres espacios.

Entrada y Salida de Información

Toda operación que realice una computadora va a estar incluida en una de las
siguientes categorías:

° Recibir entradas. Aceptar información proveniente del mundo exterior.


° Generar salidas. brindar información al mundo exterior.
° Procesar información. Realizar operaciones sobre los datos.
° Almacenar información. En cualquier dispositivo con que opere.

En base a las cuatro operaciones básicas enunciadas, las computadoras realizan


todas sus funciones.

Las operaciones de entrada permiten leer determinados datos -generalmente


ingresados por teclado- y asignarlos a determinadas variables definidas por el
programador. La operación de entrada se conoce como operación de Lectura o
read.

La salida de información es soportada por dispositivos de salida (monitor,


impresora, etc). La operación de salida se denomina escritura o Write.

Generalmente, en la escritura de algoritmos las acciones de lectura y escritura se


representan de la siguiente manera:

° leer ( Nom_variable )

° escribir (lista de variables de salida)

53
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejemplo de ingreso y salida de datos en una especificación de cálculo de


liquidación de horas extras, detallada pseudocódigo:

Inicio
Leer(horas trabajadas)
Leer(valor_de_la_hora_extra)
liquidación <- horas:trabajadas * valor_de_la_hora_extra
Escribir(liquidación)
Fin

Opcionalmente, en el ingreso de datos por teclado puede definirse una lista de


variables como parámetro de la orden leer.

Leer (dato1, dato2, dato3)

Ejemplo:

Ingresando dos números, mostrar por pantalla su suma y su diferencia.

Pseudocódigo

Inicio
Leer(num1, num2)
suma <- num1 + num2
dif <- num1 - num2
Escribir("SUMA: ", suma)
Escribir("DIFERENCIA: ", dif)
Fin

Diagrama NS

54
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Inicio

Leer num1, num2

suma <- num1 + num2

dif <- num1 - num2

Escribir("SUMA: ", suma)

Escribir("DIFERENCIA: ", dif)

Fin

Ejercitación en Lenguaje Perl

Se utiliza la instrucción print cuando se quiere enviar un mensaje a


la salida estandar (generalmente el monitor).

print "Esto es un mensaje\n";

En el ejemplo, se muestra la cadena "Esto es un mensaje" por


pantalla, y al final se inserta un salto de línea (\n), lo cual
posicionará al cursor en un nuevo renglón.

$alfa = 345.2;
$beta = 8;
$resultado = $alfa * $beta;

print "El resultado de multiplicar $alfa por $beta es


$resultado\n\n";

Aquí el mensaje contiene terminos y variables de memoria ($alfa,


$beta y $resultado).

En el siguiente ejemplo se solicitará al operador que ingrese un


dato. El ingreso se solicita con la instrucción <STDIN>, y se
almacena el dato en la variable $d.
print "Ingrese una distancia en centimetros: ";
$d = <STDIN>;
chop($d);
$r = $d / 2.54;

print "$d centimetros equivalen a $r pulgadas\n";

55
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

56
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Estructura Secuencial
La estructura secuencial corresponde a un conjunto de instrucciones que se
ejecutan en una secuencia predeterminada y fija, de arriba hacía abajo.

El diagrama Chapin o NS (Nassi-Schneiderman) de la estructura secuencial es:

Instrucción 1

Instrucción 2

Instrucción 3

...

Instrucción n

Ejemplo:

Construir un algoritmo para pasar una temperatura dada en grados centígrados a


grados Fahrenheit. La fórmula para hacer la conversión es: F = ( 9 * C ) / 5 + 32;
donde C es el valor en grados centígrados y F en grados Fahrenheit.

Inicio
Leer temperatura en grados centígrados y almacenarlo en TC
TF <- ( 9 * TC ) / 5 + 32;

Escribir("La temperatura equivalente en grados Fahrenheit es:",TF)


Fin

Representación del pseudocódigo en un diagrama NS

Inicio

Leer temperatura en grados centígrados y almacenarlo en TC

TF <- ( 9 * TC ) / 5 + 32;

Escribir("La temperatura equivalente en grados Fahrenheit es:",TF)

Fin

Ejemplo de estructura secuencial

57
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Introducir dos números a y b, con partes decimales, luego obtener la suma de las
partes decimales. Por ejemplo : a=16.12 y b=7.33 entonces deberá obtener s =
0.12 + 0.33 = 0.45

Diagrama NS

Inicio

Leer pn, sn

r = (pn - int(pn)) + (sn - int(sn))

Escribir("El resultado es", r)

Fin

Ejercitación en Lenguaje Perl

print "Ingrese el primer número : ";


$pn = <STDIN>; chop($pn);

print "Ingrese el segundo número: ";


$sn = <STDIN>; chop($sn);

$r = ($pn - int($pn)) + ($sn - int($sn));

print "La suma de las partes decimales de $pn y $sn es $r\n";

58
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico II - Estructura Secuencial

Ejercicios

1. Diseñe un algoritmo que halle el área y el perímetro de un rectángulo.


Considere las siguientes fórmulas: área = base x altura, perímetro = 2 x
(base+altura).

2. Diseñe un algoritmo para convertir una longitud dada en centímetros a pies.


Considere que: 1 pie = 30.48 centímetros.

3. Calcular el área de un triángulo, conociendo su altura y su base.

4. En una carrera de turismo carretera el tiempo se mide en minutos, segundos y


centésimas de segundo y, el espacio recorrido se mide en metros. Diseñe un
algoritmo para determinar la velocidad promedio de un automóvil en km/hr.

5. Diseñe un algoritmo que determine la suma de las cifras de un número entero


positivo de 4 cifras.

6. Diseñe un algoritmo que determine el porcentaje de varones y de mujeres que


hay en un recinto

7. Dados dos números a y b, se desea intercambiar sus valores, utilizando una


variable auxiliar

8. Dados dos números a y b, se desea intercambiar sus valores, sin utilizar una
variable auxiliar. Por ejemplo si a=7 y b=12 debe mostrar a=12 y b=7.

9. Dados 2 números a y b, mostrar.

10. Diseñe un algoritmo para sumar dos marcas de tiempo dadas en horas,
minutos y segundos.

11. Se solicita un préstamo por C pesos durante N meses a una tasa de interés
mensual L. Al final de los N meses la cantidad adeudada es C * (1 + I) ^ N.
Hacer un algoritmo al cual se le dan los valores de C, N e L, y calcule e imprima
la suma adeudada.

59
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

12. Construir un algoritmo al cual se le de un valor de X, y los coeficientes A, B y


C del polinomio: P(X)= AX2 + BX + C; y calcule e imprima el valor del
polinomio.

13. Hacer un algoritmo para ingresarle una medida en metros, y que imprima esa
medida expresada en centímetros, pulgadas, pies y yardas. Los factores de
conversión son los siguientes:

1 yarda = 3 pies
1 pie = 12 pulgadas
1 metro = 100 centímetros
1 pulgada = 2.54 centímetros

14. Preparar un algoritmo para darle el diámetro de cualquier círculo, e imprima


el radio, la circunferencia y la superficie.

15. Preparar un programa para darle las notas de cuatro parciales y muestre la
nota promedio.

16. Una empresa de ventas de Alemania paga a sus empleados un salario fijo de
5000 marcos, mas una comisión de 200 marcos por cada venta realizada, mas el 8
% del valor de esas ventas. Preparar un algoritmo para que calcule el sueldo que
le corresponde en un mes determinado, ingresando la cantidad de ventas que
realizó y el valor total de las mismas.

17. Un millonario excéntrico tenía tres hijos: Carlos, José y Marta. Al morir dejó
el siguiente legado: A José le dejó 4/3 de lo que le dejó a Carlos. A Carlos le dejó
1/3 de su fortuna. A Marta le dejo la mitad de lo que le dejó a José. Preparar un
algoritmo para darle la suma a repartir e imprima cuanto le tocó a cada uno.

Aplicaciones

1- ECUACION DE SEGUNDO GRADO: Todos sabemos que las raíces reales


de una ecuación de segundo grado pueden obtenerse usando las fórmulas:

X1 = (-B + SQR(B^2 - 4*A*C)) / (2*A) y X2 = (-B - SQR(B^2 - 4*A*C)) / (2*A)

Realizar un algoritmo para ingresarle los coeficientes A, B y C, y que calcule y


muestre por pantalla las raíces X1 y X2. Observación: este programa funcionará
únicamente cuando las raíces sean reales, es decir cuando ( B ^ 2 - 4 * A * C )

60
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

>= 0; de lo contrario se producirá un error al pretender obtener una raíz


cuadrada de un número negativo.

2- DETERMINANTE DE UNA MATRIZ: Dada una matriz de tres filas por


tres columnas:
| A1 A2 A3 |
| A4 A5 A6 |
| A7 A8 A9 |

puede obtenerse su determinante mediante la fórmula:

D = A1*A5*A9 + A2*A6*A7 + A3*A4*A8 - A3*A5*A7 - A2*A4*A9 - A1*A6*A8

Preparar un programa que permita ingresar por teclado los elementos de la


matriz, y que calcule y muestre por pantalla el determinante.

3- CALCULO FINANCIERO, AMORTIZACIONES: En un préstamo


amortizable en cuotas fijas mensuales, el valor de las mismas esta dado por las
siguientes fórmulas:

CUOTA = CAPITAL * ((1 + I) ^ N - 1) / (I * (1+ I) ^ N)


I = TASA / 100

donde CUOTA es el valor de la cuota a pagar, CAPITAL es la cantidad de dinero


prestado, TASA es el porcentaje de interés mensual, y N es la cantidad de cuotas
a pagar.

Preparar un programa para ingresarle los valores de CAPITAL, TASA y N, y


calcule y muestre por pantalla el valor de la cuota a pagar.

Temas complementarios

1- SISTEMAS DE ECUACIONES: Dado un sistema de ecuaciones con dos


incógnitas:
ax + by = c
dx + ey = f
Preparar un programa para ingresarle los coeficientes, y que calcule por el
método de sustitución los valores de x e y, mostrándolos por pantalla.

2- SISTEMAS DE ECUACIONES: Preparar un programa como el anterior,


pero para un sistema de tres ecuaciones con tres incógnitas, usando el método de

61
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

determinantes.

3. CALCULO FINANCIERO: Transformando adecuadamente la fórmula de la


cuota dada anteriormente, pueden construirse programas que obtengan:

a) El capital a partir del valor de la cuota, de la tasa, y de la cantidad de


cuotas.
b) La cantidad de cuotas a partir del capital, del valor de la cuota, y de la
tasa de interés.

4. CAMBIO DE COORDENADAS: Un vector puede estar definido por sus


coordenadas rectangulares ( x e y), o por sus coordenadas polares ( fi y ro). Para
pasar de un sistema a otro se usa el teorema de Pitágoras y las funciones
trigonométricas. Desarrollar un programa para pasar de rectangular a polar y otro
para pasar de polar a rectangular.

62
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Estructura de Selección

Decisiones

Hasta ahora se han visto algoritmos en los cuales se ingresan ciertos datos, luego
se hacen algunas operaciones aritméticas y finalmente se muestran los resultados
por la pantalla o la impresora. En realidad, esta es una utilización muy pobre de la
computadora, como si solamente se tratara de una calculadora una poco más
sofisticada, con la única ventaja de permitirnos construir un programa una vez y
posteriormente, utilizarlo todas las veces que sea necesario con distintos grupos
de datos.

Como se vio anteriormente, una característica importante que distingue a una


computadora de otras máquinas es la posibilidad de ejecutar operaciones lógicas,
es decir que puede evaluar expresiones del tipo:

1) total > 50
2) alfa < mo
3) be4 <- jota + 6
4) pepe - 4 = alfa + beta

De la evaluación de este tipo de operaciones se pueden obtener dos resultados


posibles: verdadero (V) o falso (F).

En el primer ejemplo, la computadora va a ir a buscar el número que esté


almacenado en la variable total y va a verificar si ese dato es mayor que 50, en
cuyo caso el resultado de la expresión será verdadera; de otra manera, si el
número es igual a 50 o menor, el resultado de la expresión será falso. En el
segundo ejemplo la computadora consultará los contenidos de las variables alfa y
mo, y verificará si se cumple o no que el número almacenado en alfa es menor
que el almacenado en mo.

Los ejemplos tres y cuatro involucran operaciones aritméticas, en estos casos la


computadora consultará los contenidos de las variables en juego, efectuará las
operaciones aritméticas que correspondan y luego comparará los resultados,
verificando si cumplen o no la condición indicada.

Es posible también hacer que la computadora evalúe expresiones más complejas,


por ejemplo, podemos desear verificar si el contenido de la variable samo es
mayor que 45 pero menor que 70, lo que podemos expresar matemáticamente

63
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

como 45 < samo < 70, pero en realidad esta forma de expresarlo está
encubriendo otro operador lógico. En informática escribiremos esta expresión
como:

samo > 45 AND samo < 70

en la que el símbolo AND representa al operador lógico "y" (conjunción).


¿Cómo se evaluará esta expresión?. Primero la computadora obtendrá los
resultados a ambos lados del AND; luego operará con esos dos valores para
obtener el valor de verdad de AND. De forma similar se puede trabajar con el
operador lógico OR (disyunción). Por lo general se dispone también de las
operaciones de negación, disyunción exclusiva, implicación y equivalencia. Esta
capacidad de evaluar expresiones lógicas se utiliza para hacer que la computadora
tome decisiones de las instrucciones a ejecutar en base al resultado obtenido.

Estructura Condicional Simple

En el caso mas sencillo, se le indica a la computadora que ejecute un cierto grupo


de instrucciones si se cumple una cierta condición:

Si (condición) entonces hacer


{
...
(instrucciones)
..
}
Fin Si

Llamaremos "estructura de decisión" o "estructura condicional simple" a este


bloque de instrucciones, la computadora verificará si se cumple la condición
indicada, en cuyo caso pasará a ejecutar las instrucciones que se detallaron, en
cambio si la condición no se cumple no las ejecutará y pasará a las instrucciones
que siguen en el algoritmo. A este caso podemos describirlo con la frase "hacer si
se cumple".

El diagrama Chapin para representar a una estructura condicional simple es el


siguiente:

64
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Condición
V F

Instrucción 1

....

Instrucción n

Ejemplo en pseudocódigo

Si (gama > 22) entonces hacer


{
gama <- gama /3;
....
}
Fin Si

gama > 22
V F

gama <- gama / 3

....

.....

Ejemplo

Suponga que se vende un artículo cuyo precio unitario es de $1235.-, se desea un


algoritmo al cual se le dé la cantidad vendida e imprima el monto de la venta,
teniendo en cuenta que si se venden más de 12 unidades se efectúa un descuento
de $1700.-; la estructura de decisión debe resolver una situación que puede
describirse como sigue: "comprobar si se vendieron mas de 12 unidades, en ese
caso, descontarle al monto $1700.-", :

Si (cantidad > 12) entonces hacer


{
monto <- monto – 1700
}
Fin Si

65
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Agregando las instrucciones de entrada, salida y cálculo, obtenemos el algoritmo


completo que resuelve el problema:

Inicio
Leer(cantidad)
monto <- cantidad * 1235
Si cantidad > 12 entonces hacer
{
monto <- monto - 1700
}
Fin Si
Escribir(monto)
Fin

Ejercitación en Lenguaje Perl

La instrucción de decisión se expresa con el término if, seguido de


una condición y finalmente un bloque (delimitado por llaves) a
ejecutar en caso de que la evaluación de la condición de verdadero.
El bloque puede contener n instrucciones separadas por punto y
coma.

print "Ingrese cantidad a adquirir: ";


$c = <STDIN>; chop($c);
$monto = $c * 1235;

if ($c > 12)


{
$monto = $monto - 1700;
}

print "El monto es $monto\n";

Estructura de Selección Compuesta

En el caso más general, se le indicará a la computadora que ejecute un


determinado grupo de instrucciones si el resultado de una evaluación es V, u otro
grupo si el resultado es F.

Si (condición) entonces hacer


{

66
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

...
(instrucciones)
...
}
de lo contrario hacer
{
...
(instrucciones)
...
}
Fin Si

En diagrama chapín la estructura condicional compuesta se representa:

Condición
V F

Instrucción 1 Instrucción 1

.... ....

Instrucción n Instrucción n

Si (gama > 22) entonces hacer


{
gama <- gama /3;
....
}
de lo contrario hacer
{
escribir("gama no es mayor a 22")
...
}
Fin Si

Ejemplo

67
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Supongamos que una empresa vende un cierto producto a un precio de $215.- la


unidad, pero si el cliente compra mas de 100 unidades, el precio se rebaja a $197.-
la unidad:

Si (C > 100) entonces hacer


{
P <- 197
}
de lo contrario hacer
{
P <- 215
}
Fin Si

Si se desea un programa completo al cual se le ingrese la cantidad vendida e


imprima el monto de la misma, falta agregar las instrucciones correspondientes a
la entrada, salida y cálculos:

Inicio
Leer(cantidad)
Si (cantidad > 100) entonces hacer
{
precio <- 197
}
de lo contrario
{
precio <- 215
}
Fin Si
monto <- cantidad * precio
Escribir(monto)
Fin

En diagrama NS

68
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

inicio

Leer cantidad

cantidad > 100


V F

precio <- 197 precio <- 215

....
monto <- cantidad * precio

..... escribir monto

Fin

Ejercitación en Lenguaje Perl

En el presente ejemplo se utiliza una estructura condicional


compuesta. La alternativa "de lo contrario" se expresa utilizando el
término else seguido de un bloque de instrucciones a ejecutar.
print "Ingrese cantidad : ";
$c = <STDIN>; chop($c);

if ($c > 100)


{
$precio = 197;
}
else
{
$precio = 215;
}

$monto = $c * $precio;

print "El monto es $monto\n";

Otro ejemplo:

Supongamos que se nos presenta el siguiente problema: "Ingresar un número


entero N y mostrar por pantalla un cartel indicando si es par o impar". Para saber
si un número N es par es suficiente comprobar si es divisible por dos, o lo que es
lo mismo, que el cociente N / 2 produzca como resultado un número entero.
Para ello podemos usar la función "parte entera" que está disponible en la
mayoría de los lenguajes de computación, esta función, la indicaremos:

variable1 <- int(variable2)

69
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

permite almacenar en variable1 la parte entera del número guardado en variable2,


o sea que si en variable2 hay un 23.456 en variable1 quedará almacenado un 23.

Por otra parte, se observa que si se almacena en una variable cociente el


resultado de la división entre número y 2, y en otra llamada entero la parte
entera de cociente, tendremos que si número es divisible por 2, el contenido de
entero será igual al de cociente. Teniendo en cuenta ello, proponemos la
siguiente solución para el problema planteado:

Inicio

Leer numero

cociente = numero / 2

entero = int(cociente)

entero = cociente

V F

Escribir("El Escribir("El
número es par") número es impar")

Fin

también puede hacerse:

70
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Inicio

Leer numero

cociente = numero / 2

entero = int(cociente)

fraccion = cociente - entero

fraccion = 0

V F

Escribir("El Escribir("El
número es par") número es impar")

Fin

ó también :

Inicio

Leer numero

numero/2 = int(numero/2)

V F

Escribir("El Escribir("El
número es par") número es impar")

Fin

Selecciones Anidadas

Frecuentemente es necesario efectuar un proceso de decisión dentro de otro, es


decir, según la salida que tenga la primera condición, se debe efectuar una
segunda instrucción de decisión, en forma general, esto puede presentarse como
sigue:

Si (condición 1) entonces hacer (I)

71
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
(instrucciones)
}
de lo contrario
{
(instrucciones)
Si (condición 2) entonces hacer (II)
{
(instrucciones)
}
de lo contrario
{
(instrucciones)
}
Fin Si
}
Fin Si

Llamamos "selecciones anidadas", a esta estructura. Esta disposición de


instrucciones puede ser mucho mas compleja, dado que las instrucciones Si
marcadas con (I) y (II) pueden contener a su vez otras estructuras de selección
dentro de sus respectivas salidas por verdadero y falso.

Decisiones anidadas graficadas en un diagrama NS

Condicion 1

V F

Escribir("El
Condición 2
número es impar")
V F
Instrucciones

Instrucciones Instrucciones

72
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejemplo

Si se nos presenta el siguiente problema: "Una empresa de USA paga a sus


empleados un sueldo básico de U$S 800.-, más un adicional que se calcula de la
siguiente manera:

-Los que trabajan en la sección 1 cobran U$S 120.- más, y sobre el total un
adicional por antigüedad del 10 % si tienen menos de 5 años, y del 20 % si
tienen 5 años o más.

-Los que trabajan en la sección 2 cobran U$S 250.- más, pero no cobran
adicional por antigüedad.

Preparar un algoritmo para ingresarle el número de sección y la antigüedad, y que


muestre por pantalla cuanto cobra el empleado.

En este caso la pregunta por la antigüedad depende de la sección en que trabaje,


una posible solución podría ser:

73
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Inicio

Leer seccion, años

basico <- 800

seccion = 1

V F

sueldo <- basico + 120

Escribir("El sueldo <- basico + 250


años < 5
número es impar") antiguedad = 0
V F

antiguedad <- antiguedad <-


sueldo*10/100 sueldo*20/100

total <- sueldo + antiguedad

escribir("El monto a abonar es ", total)

Fin

Ejercitación en Lenguaje Perl


print "Ingrese seccion del empleado: ";
$seccion = <STDIN>; chop($seccion);

print "Ingrese años de antiguedad : ";


$anios = <STDIN>; chop($anios);

$basico = 800;

if ($seccion == 1)
{
$sueldo = $basico + 120;
if($anios < 5)

74
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
$antiguedad = $sueldo*10/100;
}
else
{
$antiguedad = $sueldo*20/100;
}
}
else
{
$sueldo = $basico + 250;
$antiguedad = 0;
}

$total = $sueldo + $antiguedad;

print "El monto a abonar es $total\n";

Menú de Opciones

Un mismo algoritmo puede ejecutar distintos procesos alternativos, de tal forma


que el usuario al ejecutarlo decida cuál de esas tareas es la que necesita en ese
momento. En este caso el programa debe mostrar al usuario cual es el listado de
tareas que puede hacer, y debe permitir que el operador opte por una de ellas; a
este listado se lo denomina "menú". En el método más sencillo las opciones se
presentan numeradas, de forma que el usuario pueda indicarlas por el número,
éste se ingresa y se almacena en una variable, ejecutándose las instrucciones que
correspondan, en síntesis, la secuencia de tareas es la siguiente:

1- Mostrar por pantalla el menú de opciones.


2- Ingresar el número de opción digitado por el usuario.
3- Según sea el número ingresado, ejecutar el procedimiento
correspondiente.

Ejemplo

Supongamos que se desea un algoritmo para obtener las superficies de distintas


figuras geométricas, para simplificar consideraremos solo tres: triángulo,
rectángulo y círculo. Las fórmulas respectivas son:

stT <- (base * altura) /2


srR <- base * altura
sc <- 3.1416 * radio ^2

75
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Cuando ejecute el programa, el operador tiene que poder elegir que superficie
calcular, para ello el programa muestra el menú de opciones:

Escribir(" Elija una opción")


Escribir(" 1. Triángulo")
Escribir(" 2. Rectángulo")
Escribir(" 3. Círculo")

Cuando aparezca este menú en la pantalla, el operador digitará un número, que


puede ser 1, 2 ó 3, cualquiera sea la respuesta, el programa la almacenará en una
variable:

Ingresar una opción

Una vez ingresado el número, el algoritmo ejecutará el procedimiento que


corresponda al número ingresado, para ello deberá ejecutar instrucciones de
decisión en las cuales compare el número almacenado dentro de la variable
Opción:

Si opción = 1 entonces hacer


{
Ejecutar TRIANGULO
}
Fin Si

Si opción = 1 entonces hacer


{
Ejecutar RECTANGULO
}
Fin Si

Si opción = 1 entonces hacer


{
Ejecutar CIRCULO
{
Fin Si

Donde cada uno de estos procedimientos ingresa los datos necesarios, y efectúa
los cálculos; el siguiente es un listado con el algoritmo completo:

Principio

76
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Escribir(" Elija una opción")


Escribir(" 1. Triángulo")
Escribir(" 2. Rectángulo")
Escribir(" 3. Círculo")

Leer(opcion)

Si opción = 1 entonces hacer


{
Ejecutar TRIANGULO
}
Fin Si

Si opción = 1 entonces hacer


{
Ejecutar RECTANGULO
}
Fin Si

Si opción = 1 entonces hacer


{
Ejecutar CIRCULO
{
Fin Si

Escribir("Superficie":, superficie)

Fin

Procedimiento TRIANGULO
Leer(base, altura)
superficie <- base * altura /2
Fin TRIANGULO

Procedimiento RECTANGULO
Leer(base, altura)
superficie <- base * altura
Fin RECTANGULO

Procedimiento CIRCULO

77
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Leer(radio)
superficie <- 3.1416 * radio ^2
Fin CIRCULO

Obsérvese que en este algoritmo, si el usuario por error digita un número mayor
que 3, no se ejecutará ningún procedimiento, y al final se pretenderá mostrar el
contenido de la variable superficie, en la cual no hay nada almacenado. Esta
situación puede salvarse si se agrega una decisión como la siguiente:

Si opcion > 3 entonces hacer


{
Ejecutar CIRCULO
{
Fin Si

Ejercitación en Lenguaje Perl

$opcion = 0; $superficie = 0;

print "Elija una opcion\n";


print "1. Triangulo\n";
print "2. Rectangulo\n";
print "3. Circulo\n";

$opcion = <STDIN>; chop($opcion);

if ($opcion == 1)
{
&triangulo;
}

if ($opcion == 2)
{
&rectangulo;
}

if ($opcion == 3)
{
&circulo;
}

print "\nLa superficie es $superficie\n";

sub triangulo
{
print "\nIngrese base :";
$base = <STDIN>; chop($base);

78
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

print "\nIngrese altura :";


$altura = <STDIN>; chop($altura);
$superficie = $base*$altura/2;
return($superficie);
}

sub rectangulo
{
print "\nIngrese base :";
$base = <STDIN>; chop($base);
print "\nIngrese altura :";
$altura = <STDIN>; chop($altura);
$superficie = $base*$altura;
return($superficie);
}

sub circulo
{
print "\nIngrese radio :";
$radio = <STDIN>; chop($radio);
$superficie = 3.1416*($radio*$radio);
return($superficie);
}

Estructura de Selección Múltiple

Esta forma es útil cuando se tiene que elegir entre más de dos opciones, se
denomina de selección múltiple. En esta estructura, una variable de control puede
tomar distintos valores. Según el caso, se ejecutan distintas acciones.

Evaluar Selector

Alternati Alternati Alternati De lo


va 1 va 2 y 3 va n contrario

Instrucciones Instrucciones Instrucciones Instrucciones

Reglas:

1. La expresión <selector> se evalúa y se compara con las constantes que


expresan cada caso posible; las constantes son listas de uno o más

79
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

valores de <selector>. Ejecutadas la(s) <instrucciones>, el control se


pasa a la primera instrucción a continuación del Fin del selector.

2. La alternativa "de lo contrario" es opcional.

3. Si el valor de <selector> no está comprendido en ninguna lista de


constantes y no existe la alternativa "de lo contrario", se sigue con el
flujo del programa. En caso de existir la cláusula "de lo contrario" se
ejecutan las instrucciones correspondientes a tal bloque.

Diagrama NS del cuerpo principal del programa menú utilizando una


estructura de selección múltiple.

Inicio

Escribir("Elija una opcion";


"1. Triangulo";
"2. Rectangulo";
"3. Circulo";)

Leer(opcion)

Evaluar opcion

Alterna Alterna Alterna De lo


tiva 1 tiva 2 tiva 3 contrario

Ejecutar(triangulo) Ejecutar(rectangulo) Ejecutar(circulo)

Escribir("La superficie es ",superficie")

Fin

80
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico III - Estructura Condicional

1. Escribir un programa que indique si un número introducido por teclado es


positivo, igual a cero o negativo.

2. Dados dos números a y b, se desea mostrarlos ordenados ascendentemente

3. Ingresar tres números y hallar el mayor.

4. Ingresar tres números y hallar el menor.

5. Ingresar tres números y hallar la diferencia del mayor menos el menor.

6. Ingresar tres números y hallar la diferencia del medio menos el menor.

7. Ingresar un número n y verificar si es múltiplo de 3 o 5.

8. Ingresar tres números, y si los tres son iguales se debe mostrar solamente un
mensaje.

9. Ingresar tres números, y si dos son iguales mostrar un mensaje.

10. Se desea escribir el nombre del día de la semana en función de un número de


día, introducido por teclado. Donde 1 es Domingo, 2 Lunes y así sucesivamente.

11. Haga un programa que determine si un año es bisiesto: si es divisible por 4,


pero no es divisible por 100 o si es divisible por 400. Ejemplos: año 1998 no, año
1996 si, año 1900 no, año 2000 si.

12 Suma de fracciones. Para sumar dos números racionales se utiliza la siguiente


fórmula:

a c ad + bd
- + - = -------
b d bd

13. Diseñe un algoritmo para obtener el grado de eficiencia de un operario de


una fábrica de tornillos, de acuerdo a las siguientes condiciones, que se le
imponen para un período de prueba:

81
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

- Menos de 200 tornillos defectuosos.


- Más de 10000 tornillos producidos.

El grado de eficiencia se determina de la siguiente manera:

- Si no cumple ninguna de las condiciones, grado 5.


- Si sólo cumple la primera condición, grado 6.
- Si sólo cumple la segunda condición, grado 7.
- Si cumple las dos condiciones, grado 8.

14. Diseñe un algoritmo que lea tres longitudes y determine si forman o no un


triángulo. Si es un triángulo determine de que tipo de triángulo se trata entre:
equilátero (si tiene tres lados iguales), isósceles (si tiene dos lados iguales) o
escaleno (si tiene tres lados desiguales). Considere que para formar un triángulo
se requiere que: "el lado mayor sea menor que la suma de los otros dos lados".
15. Diseñe un algoritmo que califique el puntaje obtenido en el lanzamiento de
tres dados en función a la cantidad seis obtenidos, de acuerdo a lo siguiente:

- Seis en los tres dados, excelente.


- Seis en dos dados, muy bien.
- Seis en un dado, regular.
- Ningún seis, pésimo.

16. Una compañía dedicada al alquiler de automóviles cobra $30 hasta un


máximo de 300 km de distancia recorrida. Para más de 300 km y hasta 1000 km,
cobra $30 más un monto adicional de $ 0.15 por cada kilómetro en exceso sobre
300. Para más de 1000 km cobra $30 más un monto adicional de $ 0.10 por cada
kilómetro en exceso sobre 1000. Los precios ya incluyen el 18% del impuesto
general a las ventas, IGV. Diseñe un algoritmo que determine el monto a pagar
por el alquiler de un vehículo y el monto incluido del impuesto.

Aplicaciones

1. FUNCIONES CALENDARIO: La cantidad de días transcurridos entre dos


fechas puede calcularse transformándolas en días Julianos. Esta es una
convención astronómica que representa cada fecha como el número de días
transcurridos desde el 1 de enero de 4713 AC. Para transformar una fecha
expresada como DIA, MES y AÑO en días Julianos se usa la siguiente fórmula:

82
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

DJ = ENT (365.25 * AP) + ENT (30.6001 * MP) +


+ DIA + 1720982

donde DJ es el día Juliano, y AP y MP son dos constantes que se obtienen como


sigue:

Si MES = 1 ó 2:
AP = AÑO - 1
MP = MES + 13

Si MES > 2:
AP = AÑO
MP = MES + 1

La cantidad de días entre dos fechas es igual a la diferencia entre los respectivos
días Julianos:

días = (día Juliano 2) - (día Juliano 1)

Preparar un programa BASIC para ingresarle las dos fechas como DIA1, MES1,
AÑO1, y DIA2, MES2, AÑO2 respectivamente, y muestre la cantidad de días
transcurridos entre ambas.

2. En el cálculo de raíces de la ecuación de segundo grado visto en el capítulo


anterior, el programa no funcionará si la expresión B ^ 2 - 4 * A * C da resultado
negativo, porque en ese caso la ecuación tiene raíces imaginarias. Modifique el
programa para que antes de calcular las raíces evalúe la expresión, y en caso
necesario, muestre el cartel : "RAICES IMAGINARIAS", y termine la ejecución.

Temas Complementarios

1. Pueden construirse otros programas de funciones calendario, que permitan


obtener por ejemplo:

a) Dada una fecha a la cual se le suma una cierta cantidad de días, cual es la
fecha resultante.

b) Dada una fecha, a que día de la semana corresponde. Se dan a


continuación las fórmulas que pueden aplicarse para este tipo de
problemas:

83
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

DIAP = DJ - 1720982

AP = ENT ( (DIAP - 122.1) / 365.25)

MP = ENT ((DIAP - ENT(365.25 * AP))/30.6001)

DIA = DIAP-ENT(365.25 * AP)-ENT(30.6001 * MP)

Si MP = 14 ó 15:
MES = MP - 13

Si MP < 14:
MES = MP -1

Si MES > 2:
AÑO = AP

Si MES = 1 ó 2:
AÑO = AP + 1

Para calcular el día de la semana:

DS = 7 * FRAC ( (DIAP + 5) / 7)

donde
DS = 0 ----> domingo
DS = 1 ----> lunes
.....
DS = 6 ----> sábado

2. SUPERFICIE DEL CUERPO HUMANO (BSA): La superficie de un cuerpo


humano puede estimarse aproximadamente a partir de los datos de peso y altura
(P y H). Por lo general se usa la fórmula de DuBois:

BSA(D)= H ^ 0.725 * P ^ 0.425 * 0.007184

en la cual la altura debe estar expresada en centímetros y el peso en kilogramos,


mientras que la superficie queda dada en metros cuadrados.
Esta fórmula produce un gran error para valores de BSA(D) menores que 0.6

84
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

m2, como ocurre en el caso de los niños. Para valores de BSA(D) menores que el
indicado se usa la fórmula de Boyde:

BSA(B)= H^0.3 * P^(0.7285-0.0188*log(P)) * 0.0003207

en la cual la altura está expresada en cm. y el peso en gramos. La superficie queda


dada en m2.

85
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

86
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Estructura Repetitiva o Iterativa


La estructura repetitiva es utilizada cuando se necesita que un conjunto de
instrucciones (bloque) se ejecuten un cierto número finito de veces. Un bucle,
lazo o ciclo, forma básica de una estructura iterativa, se compone de dos partes:
a) una condición, y b) un cuerpo o bloque.

Mientras x sea distinto de 3 hacer <- condición


{
instrucción 1
Estructura instrucción 2 <- bloque
de control .......................
instrucción n
}
Fin Mientras

Básicamente existen dos tipos de estructuras repetitivas o iterativas: a) donde el


número de ciclos a ejecutar el bloque está perfectamente establecido, y b) donde
el número de ciclos que se ejecutará el bloque se determina por la evaluación de
una cierta condición.

Ejemplo de número de ciclos preestablecidos

Para n igual 0 hasta n igual 10 -incremento 1- hacer


{
Mostrar n^n
n <- n + 1
}
Fin Para

Ejemplo de número de ciclos dependientes de una condición

suma <- 0
contador <- 0
n <- 1
Mientras n sea mayor a 0 hacer
{
Ingrese un número ( 0 finaliza):, número_ingresado
Si número_ingresado es menor o igual a 0 hacer
{

87
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

promedio <- suma / contador


mostrar promedio
}
De lo contrario hacer
{
suma <- suma + número_ingresado
contador <- contador + 1
}
Fin Si
}
Fin Mientras

Las estructuras iterativas más populares son

° Mientras
° Repetir
° Repetir - Hasta
° Para

Estructura Mientras

La estructura repetitiva Mientras es aquella en la que el número de iteraciones no


se conoce por anticipado y el cuerpo del ciclo o bloque se ejecuta repetidamente
mientras que una condición sea verdadera .

Su sintaxis es :

Mientras <condición> hacer


{
instrucción 1
instrucción 2
.......................
instrucción n
}
Fin Mientras

El diagrama Chapin o NS (Nassi-Schneiderman) de la estructura Mientras


es:

88
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Mientras <condición> hacer

Instrucciones

Explicación del modo de funcionamiento :

° La expresión que conforma la condición se evalúa antes y después


de cada ejecución de las instrucciones comprendidas por el bloque.
Si la condición da por resultado verdadero, se ejecuta el bloque, y si
es falsa, el control pasa a la instrucción siguiente al bloque

° Si al evaluar la condición por primera vez, se determina que el


resultado es falso, entonces no se ingresa al bloque y el control pasa
a la instrucción siguiente al bloque. Es decir que el bloque no se
ejecutará nunca.

° Si alguno de los elementos que componen la expresión de


evaluación no se modificase, y la expresión hubiese arrojado -
previamente- verdadero en su evaluación. Se ha ingresado en un
ciclo infinito, del cual nunca se saldrá. Tales ciclos deben evitarse.

Ejemplo:

Construir un algoritmo para calcular e imprimir la suma de los números enteros


comprendidos entre -27 y 34, ambos inclusive.

89
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Inicio

suma <- 0

numero <- -27

Mientras numero <= 34 hacer

suma <- suma + número

numero <- numero + 1

Escribir(suma)

Fin

Ejercitación en Lenguaje Perl

Nótese que la orden mientras se codifica con el término while. Al


bloque se lo delimita con los caracteres {}.

Programa que muestra el menor número natural ingresado por


teclado.

my $i = 0;
my $iterar = 1;
my $mayor = 0;

while ($iterar == 1)
{
print "Ingrese un número natural (0 es fin):";
$i = <STDIN>;
if ($i <= 0)
{
$iterar = 0;
print "\nEl mayor número ingresado es ".$mayor."\n";
}
else
{
if ($i > $mayor)
{
$mayor = $i;
}
}
}

90
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

print "\nFin del programa\n";

Estructura Repetir

La instrucción Repetir permite que se ejecute un bloque de instrucciones y luego


se evalúe una condición a los efectos de ejecutar nuevamente el bloque -en caso
de resultar verdadera- o continuar con la próxima instrucción siguiente al bloque
Su sintaxis es :

Hacer {
instrucción 1
instrucción 2
.......................
instrucción n
} Repetir Mientras <condición>

El diagrama Chapin de la estructura Repetir es:

Instrucciones

Mientras <condición> hacer

Explicación del modo de funcionamiento :

° La condición se evalúa al final del bloque, después de ejecutarse


todas las instrucciones contenidas.

° Si o si siempre se ejecuta al menos una vez el bloque.

91
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

° Si el resultado de la evaluación de la condición da verdadero, se


continua iterando, de lo contrario se continua con la próxima
instrucción de programa.

Ejercitación en Lenguaje Perl

Se utiliza el término do para indicar el comienzo de una estructura


Repetir, a continuación se inserta el bloque de instrucciones,
utilizando los delimitadores {}. Al final de llave de cierre se inserta
la instrucción de evaluación que corresponde al término while.

Programa que ..

my $i = 0;
my $iterar = 1;

do {

if ($i == 0) { $iterar = 0}
print $i."\n";

} while ($iterar == 1)

Estructura Repetir - Hasta

La instrucción Repetir-Hasta permite iterar por un bloque de instrucciones hasta


que la evaluación de una condición da verdadero.
Su sintaxis es :

Haga {
instrucción 1
instrucción 2
.......................
instrucción n
} Repetir Hasta <condición>

El diagrama de la estructura Repetir-Hasta es:

92
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Instrucciones

Repetir Hasta <condición> hacer

Explicación del modo de funcionamiento :

° La condición se evalúa al final del bloque, después de ejecutarse


todas las instrucciones contenidas.

° Si o si siempre se ejecuta al menos una vez el bloque.

° Si el resultado de la evaluación de la condición da verdadero, se sale


del ciclo, de lo contrario se continúa iterando.

Ejercitación en Lenguaje Perl

Se utiliza el término do para indicar el comienzo de una estructura


Repetir, a continuación se inserta el bloque de instrucciones,
utilizando los delimitadores {}. Al final de llave de cierre se inserta
la instrucción de evaluación que corresponde al término until.

Programa que ..
my $i = 0;
my $iterar = 0;

do {

if ($i == 0) { $iterar = 1}
print $i."\n";

} until ($iterar == 1)

93
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Estructura Para

Estructura que se utiliza para iterar en aquellos casos que de antemano se conoce
la cantidad de ciclos a realizar. Por ejemplo: ingresar 10 notas de un alumno y
calcular su promedio y desvío estandar.

Al ejecutarse la orden Para primera vez, a la variable de control se le asigna un


valor inicial (expresion1). Inmediatamente se ejecutan las instrucciones del
bloque asociado y luego se verifica si el valor final (expresión2) es mayor que el
valor inicial (expresión); en caso de no ser así se incrementa o decrementa
automáticamente el contenido de la variable de control en uno y se vuelve a
ejecutar el bloque de instrucciones, hasta que la variable de control sea
mayor/menor que el valor final referido en la expresión2, situación en la que se
finaliza la estructura Para y se continua con la próxima instrucción que continua
al bloque antedicho.
Su sintaxis es :

Para <variable_de_control> <- <expresión1> hasta <expresion2> hacer


{
instrucción 1
instrucción 2
.......................
instrucción n
}
Fin Para

El diagrama de la estructura Repetir-Hasta es:

Para <variable_control> <- <expresión1> .


hasta <expresion2> hacer .

Instrucciones

94
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Explicación del modo de funcionamiento :

° La variable de control se inicializa una sola vez, al inicio de la


primera iteración.

° La condición se evalúa en cada iteración.

° El incremento o decremento se realiza antes de cada evaluación.

° Hay lenguajes en los cuales la condición de finalización está


implícita en la misma estructura. Tal como el caso del lenguaje
Pascal donde la forma de la instrucción Para es: FOR variable:
valor_inicial TO valor_final.

° Al finalizar la ejecución de una estructura de control Para, la variable


de control está instanciada con el valor de expresión2 más un
incremento o decremento, según corresponda.

Ejercitación en Lenguaje Perl

Se utiliza el término for para indicar el comienzo de una estructura


Para, a continuación se inserta el bloque de instrucciones,
utilizando los delimitadores {}.

Programa que ..

for ($n=1; $n<10; $n++) {

print "iteración número:".$n."\n";

print "n contiene ".$n." al salir del la estructura Para\n";

Salida
#> perl p.pl
iteración número:1
iteración número:2
iteración número:3
iteración número:4
iteración número:5

95
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

iteración número:6
iteración número:7
iteración número:8
iteración número:9
n contiene 10 al salir del la estructura Para

Ejemplos de Uso de Estructuras Repetitivas

Se ingresan por teclado las notas de los alumnos en una determinada asignatura,
o un 99 si el alumno estuvo ausente. Preparar un algoritmo para calcular e
imprimir la nota promedio, recordando que el alumno ausente no se promedia.
Luego de la última nota se ingresa un valor negativo.

Principio
suma <-- 0
cantidad <-- 0
Leer(nota)
Mientras nota >= 0 hacer
{
Si nota <> 99 entonces hacer:
{
suma <-- suma + nota
cantidad <-- cantidad + 1
}
Fin Si
Ingresar nota
}
Fin mientras
promedio <-- suma / cantidad
Escribir("Promedio: "; promedio)
Fin

Se ingresan por teclado 100 números enteros. Preparar un algoritmo que cuente y
muestre por pantalla la cantidad de negativos, positivos y ceros que se ingresaron.

Principio
sumaneg <-- 0
sumapos <-- 0
sumacer <-- 0
Para contador = 1 hasta 100 hacer:

96
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
Leer(número)
Si número < 0 entonces hacer:
{
sumaneg <-- sumaneg + 1
}
sino hacer:
{
Si número > 0 entonces hacer:
{
sumapos <-- sumapos + 1
}
sino hacer:
{
sumacer <-- sumacer + 1
}
Fin Si
}
Fin Si
}
Fin Para
Escribir("Negativos: "; sumaneg)
Escribir("Positivos: "; sumapos)
Escribir("Ceros : "; sumacer)
Fin

Búsqueda del Extremo

Un problema típico es el de encontrar el valor extremo entre una serie de valores,


es decir el máximo o el mínimo.

Tomemos el caso más trivial: encontrar y mostrar el mayor de un grupo de


números ingresados por el teclado. La forma simple de pensar el problema es
comparar cada nuevo número que ingresa con el mayor de los que ingresaron
hasta el momento, si el nuevo es mayor lo tomaremos como tal de aquí en más,
sino lo descartamos y comparamos el que sigue:

Ingresar número
Si número > mayor entonces hacer
{

97
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

mayor <-- número


}
Fin Si

De esta manera, en la variable mayor, siempre estará almacenado el mayor de los


números ingresados, ya que cada vez que ingresa uno mayor se reemplaza el valor
anterior por el nuevo. Para ello, cuando ingreso el primero, obviamente es el
mayor por ser el único. El algoritmo completo queda como sigue:

Principio
Leer(n)
Leer(número)
mayor <-- número
Para C = 2 hasta N hacer:
{
Leer(número)
Si número > mayor entonces hacer:
{
mayor <-- número
}
Fin Si
}
Fin Para
Escribir(mayor)
Fin

Obsérvese que C comienza valiendo 2, porque cuando se ingresa en el ciclo ya se


ingresó el primer número.

Validación de Datos

Un refrán utilizado entre los programadores dice: "si ingresa basura, sale basura",
lo que quiere decir que, independientemente de la excelencia del algoritmo, si se
le ingresan datos erróneos producirá resultados también erróneos. La casi
totalidad de los errores se produce en el ingreso de los datos por parte del
operador. Si bien es imposible prever todos los errores que se pueden cometer,
un buen programa debe estar preparado para evitar todos los que sea posible.
Llamamos "validación" a este control de los datos que ingresan.

98
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

La técnica básica parte de la premisa de que hay valores imposibles para ciertos
datos: en una fecha, el día no puede ser mayor que 31 o el mes mayor de 12, la
altura de una persona no puede ser 8 metros, el cónyuge no puede ser más que
1(?), etc.

La mayoría de los datos posee un rango de valores posibles, y cada valor que
ingresa debe estar necesariamente dentro de ese rango. La validación consiste en
verificar que cada dato que ingresa se encuentre dentro del rango, si no es así, se
le indica al operador que ingrese el dato nuevamente:

Leer(variable)
Mientras (variable fuera de rango) hacer:
{
Escribir(mensaje al operador)
Leer(variable)
}
Fin mientras

Ejemplo de validación

Supongamos que en una fecha se ingresa el día, entonces comprobamos que no


sea menor que 1 ni mayor que 31:

Ingresar día
Mientras día <1 ó día > 31 hacer
{
Escribir("dato erróneo, ingrese nuevamente")
Leer(día)
}
Fin mientras

Obsérvese que no es posible asegurar que este algoritmo va a evitar todos los
errores, por ejemplo no detectará si el operador ingresa un 16 en lugar de un 15,
en cambio sí funcionará en la mayoría de las inversiones, es decir si el operador
ingresa un 72 en lugar de un 27, el cual es un error muy común cuando se digitan
números rápidamente.

99
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico IV - Estructura Repetitiva

1. Hallar el máximo común divisor y el mínimo común múltiplo de dos números


naturales.

2. Calcular la suma y el producto de los números pares comprendidos entre 20 y


500.

3. Ingresar un número natural n e indicar si es primo.

4. Dado un número natural n se desea mostrar todos los números primos


anteriores a n.
5. Preparar un algoritmo para ingresarle dos números naturales N1 y N2, hallar el
producto N1 * N2 mediante sumas sucesivas y mostrar el resultado. Recordar
que:

N1 * N2 = N1 + N1 + ... + N1 (N2 veces)


6. Los números perfectos son números naturales que son iguales a la suma de
todos sus divisores propios excepto él mismo. Así, por ejemplo, el 6 es un
número perfecto ya que es igual a la suma de sus tres divisores propios: 1, 2 y 3.
Se pide escribir un programa que calcule los cuatro primeros números perfectos.
7. Escribir un programa que imprima la secuencia de todas las combinaciones de
hora y minuto de un día, comenzando por 01:00 y terminando por 12:59.

8. ¿A cúanto asciende la suma de los números pares comprendidos entre 300 y


1232?

9. Construir un algoritmo para calcular y mostrar por pantalla cuantas


campanadas da un reloj desde una cierta hora H, que se ingresa por teclado,
hasta las doce de la noche, el reloj da una campanada a las y media.

10. Construir un algoritmo para ingresarle un número natural n, y que calcule y


muestre por pantalla el factorial de n. La fórmula general para hallar el factorial
de un número entero positivo es: n! = n * (n - 1)!

11. Construir un algoritmo para ingresarle por el teclado dos números naturales
M y N. Hallar el cociente M/N por restas sucesivas y mostrar por pantalla el

100
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

dividendo, divisor, cociente y resto.

12. Ingresando un número natural N, construir un algoritmo para hallar y


mostrar por pantalla los divisores naturales de N. Usar parte entera (INT).

13. En la sucesión de Fibonacci, los dos primeros números son 0 y 1, y cada uno
de los restantes es igual a la suma de los dos que lo anteceden. Los primeros
términos son: 1, 1, 2, 3, 5, 8, 13, 21, ...
Preparar un algoritmo para ingresarle una cantidad C, y que muestre los primeros
C términos de la sucesión.

14. Completar el algoritmo anterior para calcular también la suma y el producto


de los primeros C términos de la sucesión.

15. Se efectúa una encuesta entre 120 consumidores de cigarrillos. Las respuestas
están codificadas como 1, 2 ó 3 según sea la marca elegida. Preparar un algoritmo
para ingresarle las 120 respuestas, y muestre por pantalla el número de la marca
preferida.

16. Preparar un algoritmo que encuentre e imprima todos los números de tres
dígitos (del 100 al 999) que sean iguales a la suma de los cubos de sus dígitos.
Recordar que un número de tres dígitos, por ejemplo 729, puede construirse
sumando 700 + 20 + 9, o sea: 7 * 100 + 2 * 10 + 9

17. Preparar un algoritmo que encuentre e imprima los números primos


comprendidos entre 1000 y 2000.

Ciclos Anidados

1. Escribir programas que visualicen en pantalla figuras similares a las siguientes

* **** * *
** *** ** *
*** ** *** *
**** * **** *
***
**
*

Siendo variable el número de líneas, debiéndose ingresar por teclado. Para los
casos ejemplo el número de líneas es 4.

101
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Aplicaciones

1. REGRESION LINEAL: Dados una serie de pares de datos correspondientes


a dos variables, pueden obtenerse los coeficientes de la recta que mas aproxima a
los datos. Por ejemplo, si se tienen los siguientes valores de ventas de una
empresa durante los últimos cinco años:

x : año y : ventas (mill)

1985 1.25
1986 1.75
1987 2.00
1988 2.50
1989 3.25

VENTAS|
| *
3 +
|
| *
|
2 + *
| *
|
| *
1 +
|
|
|
0 +-----+-----+-----+-----+-----+----->
85 86 87 88 89 AÑO

A partir de estos datos pueden obtenerse mediante el método de regresión lineal


los coeficientes de una recta que aproxima a estos puntos, y que da la pendiente
del crecimiento de las ventas a través del tiempo. Esta recta tendrá la forma:

VENTAS = A + B * AÑO

o en general:

y=A+B*x

Las fórmulas para hallar los coeficientes A y B son las siguientes:

102
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

B = (Sxy - Sx *Sy / N) / (Sx2 - (Sx) ^ 2 / N)

A = Sy / N - B * Sx / N

donde:
N : Cantidad de pares de datos
Sx : Sumatoria de las x
Sy : Sumatoria de las y
Sx2: Sumatoria de los cuadrados de x
Sxy: Sumatoria de los productos x * y

Para determinar la calidad de la aproximación de la recta con respecto a los datos


se usa el "coeficiente de determinación" (r). Valores de r cercanos a uno indican
mejor aproximación que valores cercanos a cero. La fórmula para la obtención de
r es un poco mas compleja:

r = (Sxy - Sx * Sy / N) ^ 2 / ((Sx2 - Sx ^ 2 / N) * (Sy2 - Sy ^ 2 / N))

nótese una diferencia: Sx2 indica la suma de los cuadrados de x, en cambio en


Sx^2 se efectúa el cuadrado de la suma.

Preparar un programa para ingresarle N, luego ingresarle N pares de datos


correspondientes a ambas variables, y muestre los coeficientes de la recta que los
aproxima y el coeficiente de determinación.

2. CALCULO COMBINATORIO: En la teoría combinatoria se estudia la


manera de ordenar los elementos de un conjunto o la manera de agrupar sus
elementos, obteniendo fórmulas que permitan calcular el número de
ordenaciones o el de grupos que puedan formarse. Los conceptos más
importantes son el de permutación, variación y combinación.
Permutaciones: Son los distintos modos de ordenar los elementos de un
conjunto.
Ejemplo: en el conjunto formado por A, B y C, las permutaciones son: ABC,
ACB, BAC, BCA, CAB y CBA. El número de permutaciones posibles con n
elementos está dado por:

Pn = n! (ver ejercicio de factorial)

Variaciones: Se llama variación de n objetos tomados p a p (o variación de orden


p) a todo conjunto ordenado formado por p objetos seleccionados de cualquier

103
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

manera entre los n objetos dados, considerando distintas dos variaciones cuando
difieran en algún objeto o en el orden en que estén dispuestos. El número de
variaciones de orden p que se pueden formar con n objetos está dada por:

Vn, p = n! / (n - p) !

Combinaciones: Se llama combinación de n objetos diferentes tomados p a p (o


combinación de orden p) a todo conjunto de p objetos elegidos entre los n
objetos dados,
de tal modo que dos conjuntos se diferencien al menos en un objeto. El número
de combinaciones de orden p que se pueden formar con n objetos está dado por:

Cn, p = n! / ( p! * (n - p)! )

Preparar un programa de cálculo combinatorio que presente un menú con las


tres posibilidades.

Temas complementarios

1. MAS SOBRE REGRESION: No siempre es una recta la que mejor ajusta a un


grupo de pares de datos. Damos a continuación las fórmulas para obtener
regresiones exponenciales, logarítmicas y potenciales, con las cuales podrán
construirse los respectivos programas. Ante la duda frente a un determinado
grupo de datos, se pueden efectuar las cuatro regresiones, teniendo en cuenta que
la que mas aproxime a la realidad es aquella que de un mayor coeficiente de
determinación.
Aproximación exponencial. La ecuación de la curva es:

y = A * e ^ (B * x)

donde e es la base de los logaritmos naturales, siendo aproximadamente


2.71828...
Las fórmulas para obtener los coeficientes son:

B = (Sxlny - Sx * Slny / N) / (Sx2 - Sx ^ 2 / N)

A = EXP(Slny / N - B * Sx / N)

r = (Sxlny - Sx * Slny / N) ^ 2 / ((Sx2 - Sx ^ 2 / N) * (Slny2 - Slny ^ 2 / N))

104
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Aproximación logarítmica. La ecuación de la curva es:

y = A + B * LN(x)

Las fórmulas son:

b = (Sylnx - 1 / n * Slnx * Sy) / (Slny2 - 1 / n * Slnx ^ 2)

a = 1 / n * (Sy - b * Slnx)

r = (Sylnx - 1 / n * Slnx * Sy) ^ 2 / ((Slnx2 - 1 / n * Slnx ^ 2) * (Sy2 - 1 / n * Sy ^ 2))

Aproximación potencial: La ecuación general de la curva es:

Y=a*x^b

y las fórmulas correspondientes:

b = (Slnxlny - (Slnx * Slny) / n) / (Slnx2 - Slnx ^ 2 / n)

a = exp(Slny / n - b * Slnx / n)

r = (Slnxlny - (Slnx * Slny) / n) ^ 2 / ((Slnx2 - Slnx ^ 2 / n) * (Slny2 - Slny ^ 2 / n))

donde:

Slnx : sumatoria de los logaritmos naturales de los x.


Slny : sumatoria de los logaritmos naturales de los y.
Slnx2: sumatoria de los cuadrados de los logaritmos naturales de los x.
Slny2: sumatoria de los cuadrados de los logaritmos naturales de los y.
Sxlny: sumatoria de los productos de los x por los logaritmos naturales de
los y.
Sylnx: sumatoria de los productos de los y por los logaritmos naturales de
los x.
Slnxlny: sumatoria de los productos de los logaritmos naturales de los x
por los logaritmos naturales de los y.

Las demás notaciones son las dadas anteriormente.

Con estas fórmulas es posible completar el programa de regresión, presentando


un menú que permita elegir el tipo de ajuste que se desea. Es conveniente que el
usuario pueda probar con distintos ajustes sin tener que volver a ingresar los

105
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

datos cada vez, para ello el menú puede tener una opción para el ingreso.

106
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Cuarta Parte
Programación Estructurada - Archivos Secuenciales
y Arreglos:

Archivos Secuenciales

Como es sabido, las computadoras pueden procesar grandes cantidades de datos.


Por ejemplo, un programa que liquide los sueldos de una empresa de 1000
empleados, necesariamente debe contar con datos básicos para realizar tal tarea,
como ser: números de legajo, apellidos y nombres, categorías, secciones, sueldos
básicos, adicionales, etc., que en total suman un importante volumen de
información. Sin embargo, en los programas desarrollados hasta ahora, se han
procesado cantidades relativamente pequeñas de datos; almacenados
exclusivamente en la memoria de trabajo, la cual posee una capacidad limitada e
inferior a la de cualquier soporte de almacenamiento secundario (disco rígido,
CD-ROM, cinta, etc).

Aquí se deben hacer algunas consideraciones con respecto al momento en que se


usa cada dato, se puede, en principio, pensar que los datos tienen dos tipos de
disponibilidad:

a) los que se están usando en un momento dado por un programa.

b) los que no se están usando en ese momento, pero que serán requeridos
en alguna otra situación futura.

Almacenar datos que no se están utilizando en la memoria de trabajo, es ocupar


espacio inútilmente; sumado a que tal soporte es volátil y por consecuencia, una
vez apagado el equipo la memoria se borra, y desaparece la información
almacenada.

En una computadora, la información que no está siendo procesada,


permanece almacenada en unidades de almacenamiento secundario, que
pertenecen a la categoría de periféricos de entrada-salida. Aquí los datos no están
guardados en variables, sino que permanecen agrupados en bloques de

107
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

información llamados archivos.. Esta forma de ordenar a los datos es análoga a la


que se utiliza en un archivo manual, donde n elementos relacionados se
almacenan juntos en un recipiente contenedor. Por ejemplo fichas de alumnos en
una carpeta, tarjetas de presentación juntas en un tarjetero, etc.
FICHA DEL ALUMNO
Alumno: Gomez, Mirian
Fecha nacimiento: 10/03/1972
Sexo: DEL
FICHA femenino
ALUMNO
Archivo Curso: 7a
Alumno: Ver, Pablo
de datos de Situación:
Fecha regular 11/04/1973
nacimiento:
ALUMNOS Sexo: DEL
FICHA masculino
ALUMNO
Curso: 8b
Alumno: Vega, Ana
Situación:
Fecha regular 09/07/1972
nacimiento:
Sexo: femenino
Curso: 7a
Situación: regular
A la ficha ó
tarjeta del alumno
"Situación" es un se la denomina
item de datos ó "registro"
campo

Obsérvese que la mínima estructura de organización de datos archivo son los


caracteres, los que a su vez se agrupan en estructuras mayores -campos y
registros-, hasta llegar al archivo. De todas estas estructuras préstese especial
atención a la ficha o registro. Este nivel de agrupamiento de los datos presenta
tres características importantes:

a) Cada registro corresponde a un alumno, es decir, centraliza toda la


información que corresponde a un individuo.

b) Todas los registros poseen los mismos items, y éstos están dispuestos
en el mismo orden.

c) Cada vez que se agrega, modifica o se borra información del archivo, se


accede a un registro, aún si solamente se modifica un solo caracter de un
determinado ítem o campo.

En el archivo, los registros se almacenan en algún orden preestablecido. Cada vez


que se incorpora un nuevo alumno se agrega un registro con sus datos, cada vez
que se produce una baja se quita el registro correspondiente ( o se lo marca como
borrado), y cada vez que cambia algún dato se extrae el registro, se lo modifica y
se coloca nuevamente en el archivo.

108
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Cuando se tienen distintos conjuntos de datos por almacenar, para cada


uno se utiliza un archivo, identificándolo con un nombre: "asignaturas",
"profesores", "notas_alumnos", etc.

En un sistema de computación, se emula la forma de estructurar la


información, pero utilizando un soporte físico de almacenamiento distinto, en
lugar de usar carpetas, cajones y tarjeteros se utilizan por lo general medios de
almacenamiento digitales, tales como: discos, cintas, disquetes, CDROM, etc.

Se puede pensar que cada vez que se graba información en el disco, se


realiza una operación equivalente al agregado de una tarjeta a un tarjetero, éste es
pues el paquete de datos que se intercambia entre la memoria central y el medio
de almacenamiento; este bloque de datos se denomina "registro"; un registro es
entonces equivalente a una tarjeta, y en nuestro ejemplo contiene todos los datos
correspondientes a un alumno. Cuando se almacenan o se recuperan datos desde
un disco, la información se transfiere de a bloques que pueden contener uno o n
registros. Al equivalente del ítem en un archivo digital se lo denomina campo, de
tal forma que cada registro se compone de n campos, donde cada uno identifica
un atributo de la entidad que se desea registrar.

Registro del alumno Ana Vega


Campo Alumno Fecha Sexo Curso Situación
Nacimiento
Vega, Ana 09/07/1972 femenino 7a regular
Campo 1 Campo 2 Campo 3 Campo 4 Campo 5

Archivo de alumnos
Gomez, Mirian 10/03/1972 femenino 6c libre
Ver, Pablo 11/04/1972 masculino 7a regular
Vega, Ana 09/07/1972 femenino 7a regular

El siguiente cuadro muestra las analogías entre las estructuras de almacenamiento


de información de un proceso manual y de uno informatizado:

MANUAL MAGNETICO
mueble, tarjetero, cajonera CDROM, disco rígido,
disquete, cinta
ficha, tarjeta registro
item campo
letra, dígito numérico, símbolo caracter

109
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Operaciones Básicas sobre Archivos

En las operaciones de almacenamiento y recuperación de los datos, también


existen analogías entre el procesamiento manual y el electrónico. Retornando al
ejemplo del archivo manual de alumnos, si es necesario modificar la situación de
alumno Gomez, Mirian se deben ejecutar los siguientes pasos:

1. Abrir el tarjetero de "alumnos"


2. Buscar la tarjeta correspondiente al alumno "Gomez, Mirian"
3. Escribir la modificación sobre el ítem "situación".
4. Guardar la tarjeta actualizada en el tarjetero.
5. Cerrar el tarjetero "alumnos"

Con algunas variaciones, se utiliza una secuencia análoga cuando se opera


sobre un archivo informático, donde un algoritmo determinará la secuencia de
pasos correspondientes.

Grabación de Datos

El algoritmo más sencillo es el de creación de un archivo, es decir, crear un


archivo sobre un soporte digital. En este caso, antes que nada, lo primero que se
debe hacer es identificar que se desea almacenar, segundo que atributos se
asociaran a cada registro (los campos), lo que a su vez determina cuales son los
tipos de datos de cada campo.

Primer ejemplo:

Suponiendo que se desea almacenar una agenda telefónica personal en un


soporte digital, y específicamente interesa registrar los siguientes atributos:
apellido, nombre y número de teléfono, el registro quedará configurado como
sigue:

Registro del archivo agenda

Apellido Nombres Teléfono


También debe tenerse en cuenta que a medida que son grabados, los registros se
ubicarán uno a continuación de otro en el archivo:

110
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Registro 1
Registro 2
Registro 3
Registro 4
...
Registro n

En cada registro se almacenan datos existentes en variables de memoria de


trabajo, de tal forma que en cada campo se guarda el dato contenido en una
variable:

variable 1 ---------> campo 1


variable 2 ---------> campo 2
variable 3 ---------> campo 3

Una grabación de un registro sobre un archivo se indica de la siguiente forma:

Grabar en (nombre de archivo) : (variable 1, variable 2,..., variable n)

En el ejemplo, es necesario dar un nombre al archivo, podría ser "AGENDA"; y


las variables se denominan: apellido, nombres y teléfono. La orden de grabación
se definiría de la siguiente forma:

Grabar en AGENDA(apellido, nombres, teléfono)

Existen instrucciones que permiten abrir y cerrar un archivo:

Abrir(nombre de archivo)
Abrir AGENDA
y
Cerrar(nombre de archivo)
Cerrar AGENDA

Los datos que se graban en el archivo AGENDA se toman de variables


almacenadas en la memoria de trabajo, por lo tanto es necesario previamente
instanciar información en tales variables. Un algoritmo completo para grabar un
registro sería el siguiente:

Principio
Abrir AGENDA
Leer(apellido, nombres, teléfono)

111
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Grabar en AGENDA(apellido, nombres, teléfono)


Cerrar AGENDA
Fin.

Este algoritmo graba un registro, es decir, los datos correspondientes a una


persona. En el ejemplo es necesario almacenar los datos de muchas personas,
con lo que las instrucciones de ingreso y grabación deben repetirse una cantidad
no determinada de veces; ello se logra por medio de un ciclo. Hay varias formas
posibles de construir un ciclo como éste, la mas común es mediante una
estructura "mientras", que repetirá las instrucciones hasta que se ingrese algún
carácter determinado, por ejemplo una "x" en la variable apellido:

Principio
Abrir AGENDA
Leer apellido
Mientras apellido <> "x" hacer:
{
Leer(nombres, teléfono)
Grabar en AGENDA(apellido, nombres, teléfono)
Ingresar apellido
}
Fin Mientras
Cerrar AGENDA
Fin

Ejercitación en Lenguaje Perl

Carga del archivo agenda

open(ARCHIVO, ">agenda");

print "\n\nIngrese apellido (x) fin) : ";


$apellido = <STDIN>;
chop($apellido);

while ($apellido ne "x")


{
print "Ingrese nombres : ";
$nombres = <STDIN>;
print "Ingrese telefono : ";
$telefono = <STDIN>;
chop($nombres);chop($telefono);
print ARCHIVO "$apellido,$nombres,$telefono\n";
print "\n\nIngrese apellido (x fin) : ";
$apellido = <STDIN>;

112
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

chop($apellido);
}

close(ARCHIVO);

Después del último registro grabado, la computadora coloca una marca en el


disco que llamamos "marca de fin de archivo" (en inglés "end of file" o EOF),
que posteriormente sirve para identificar hasta donde llegan los registros
grabados en un archivo. Una cuestión importante a tener en cuenta es que el
programa anterior comienza siempre grabando desde el primer registro, borrando
lo que hubiera grabado anteriormente. Si deseamos seguir grabando a
continuación del último existente, en nuestra convención lo indicaremos como:

Grabar al final en (nombre de archivo)


Grabar al final en AGENDA

Con estas instrucciones, la computadora antes de grabar buscará la marca de fin


de archivo (EOF), para grabar los nuevos registros a continuación, cuando
termine colocará el EOF en la nueva posición.

Ejercitación en Lenguaje Perl

Programa que añade un registro al archivo agenda. Nótese que


en la instrucción de apertura del archivo se utiliza el
modificador >> para indicar que su modo de apertura es añadir
al final.
open(ARCHIVO, ">>agenda");

$apellido = "Santolini";
$nombres = "Lucia Micaela";
$telefono = "45322";

print ARCHIVO "$apellido,$nombres,$telefono\n";

close(ARCHIVO);

Recuperación de Datos Grabados

Para leer los datos almacenados en un archivo, el proceso es inverso, o sea que
los datos pasan del registro a variables de memoria central. La operación con la
que indicaremos la lectura es:

113
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Leer de (nombre de archivo)(variable 1, variable 2, .., variable n)

Supongamos que queremos leer un registro de nuestra agenda telefónica, la


instrucción de lectura será:

Leer de AGENDA(apellido, nombres, teléfono)

Segundo ejemplo

Se desea obtener un listado por impresora con todos los datos almacenados en el
archivo AGENDA. Los pasos son: abrir el archivo, leer cada registro e
imprimirlo hasta encontrar el fin de archivo (EOF), y cerrar el archivo:

Principio
Abrir AGENDA
Mientras no (EOF de AGENDA) hacer:
{
Leer de AGENDA(A, N, T)
Escribir(A, N, T)
}
Fin Mientras
Cerrar AGENDA
Fin

Ejercitación en Lenguaje Perl

Programa que lee y muestra por pantallas los campos de los registros que
conforman el archivo agenda.
open(ARCHIVO, "agenda");

$i= 1;
while (!eof(ARCHIVO))
{
$registro_leido = <ARCHIVO>;
chop($registro_leido);
($apellido,$nombres,$telefono) = split(",",$registro_leido);
print "Registro ".$i++.": $apellido * $nombres * $telefono\n";
}

close(ARCHIVO);

114
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

La expresión "EOF de AGENDA" , antes de cada lectura de registro, hace que la


computadora determine si está la marca de fin de archivo, si no la encuentra
quiere decir que hay un nuevo registro para leer, con lo cual la instrucción:

Mientras no EOF de AGENDA

seguida de la instrucción de lectura debe interpretarse como "leer mientras no se


encuentre el fin de archivo", dicho en otras palabras, leer mientras haya registros.

Organización Secuencial

Volviendo al ejemplo del archivo manual, se puede observar que existen


distintas formas de tener ordenadas las tarjetas dentro del mismo, pueden estar
por orden alfabético, por curso, por situación, etc. Algo similar ocurre con los
archivos informáticos.

Se denomina "organización" del archivo a la forma en que está ordenado.


De todas las formas posibles, la más primitiva es tenerlo por orden "de llegada",
es decir, la tarjeta o registro correspondiente a un nuevo alumno se coloca al
final, detrás de todas las demás. En informática es posible grabar los registros de
la misma forma, cada nuevo registro, detrás de los anteriores; a esta organización
se la denomina "secuencial".

Otra forma posible de organización es aquella en que cada ficha de


alumno está identificada con un número, el cual indica el orden en que la tarjeta
está colocada en el tarjetero. Cuando se desea acceder a una tarjeta n se la
localiza por su número, en base a consultar etiquetas asociadas a cada tarjeta que
contienen sus números. A esta organización se la denomina "relativa"

Acceso

Se denomina "acceso" a la manera en que ´se puede buscar un registro


determinado dentro de un archivo. Como se comprenderá, la forma de acceso va
a depender de la estructura del archivo. Esta sección se dedica exlusivamente a
archivos secuenciales.

Acceso Secuencial

De la misma forma que en un archivo manual organizado secuencialmente, el


acceso a un registro determinado obliga a buscar en todos los registros, a partir
del primero, hasta encontrar el que se desea.

115
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

En nuestro ejemplo del archivo de alumnos, supongamos que deseamos mostrar


el curso y situación del alumno "Vega, Ana". Para ello, debemos leer desde el
primer registro, comparando cada nombre de alumno con el buscado, cuando se
lo encuentre, se debe mostrar los datos correspondientes:

Principio
Abrir ALUMNOS
Mientras no (EOF de ALUMNOS) hacer:
{
Leer de ALUMNOS:(APE_NOM, FECHA_N,
SEXO, CURSO, SITUACION)
Si APE_NOM = "Vega, Ana" entonces hacer:
{
Escribir(APE_NOM, FECHA_N,
SEXO, CURSO, SITUACION)
}
Fin Si
}
Fin mientras
Cerrar CLIENTES
Fin

Si deseamos que el algoritmo sirva para buscar los datos de un cliente cualquiera,
reemplazar el nombre "Vega, Ana", por una variable cuyo valor se ingresa por
teclado al principio:
Ejercitación en Lenguaje Perl

Programa que solicita por teclado un apellido, lee del archivo agenda
todos los registros, y solamente muestra todos aquellos que coincidan con
tal apellido.
open(ARCHIVO, "agenda");

print "\n\nIngrese apellido a buscar en el archivo agenda : ";


$x_apellido = <STDIN>; chop($x_apellido);

$i= 1;
while (!eof(ARCHIVO))
{
$registro_leido = <ARCHIVO>;
chop($registro_leido);
($apellido,$nombres,$telefono) = split(",",$registro_leido);
if ($x_apellido eq $apellido)
{
print "$apellido * $nombres * $telefono\n";
}

116
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

close(ARCHIVO);

Modificaciónes de Datos Sobre Archivos Secuenciales

Dado un archivo secuencial, existen tres formas posibles de introducir


modificaciones a los datos contenidos en él:

a) Dar de alta nuevos registros


b) Dar de baja registros
c) Modificar el contenido de un registro existente.

Un proceso que hace estas tareas es clásico en computación, y generalmente


recibe el nombre de "Altas, Bajas y Modificaciones", o abreviadamente ABM.
Este algoritmo puede construirse con tres subrutinas, y un menú que permita al
usuario elegir una de ellas. Analizaremos cada subrutina por separado:

Altas

Por tratarse de un archivo secuencial, cada nuevo registro que se agregue se


grabará al final de los demás; el algoritmo es similar al de creación de un archivo,
pero la grabación se realiza al final. Cuando se abre el archivo hay que indicar que
se lo desea hacer en modo añadir (append), el siguiente es el esquema general de
un módulo que implemente el proceso de altas:

Principio
Abrir (archivo)
Leer(variable de corte)
Mientras (variable de corte) <> (valor de corte) hacer:
{
Leer(variables restantes)
Grabar al final en (archivo)(variables)
Ingresar (variable de corte)
}
Fin Mientras
Cerrar (archivo)
Fin

A los efectos de que el módulo anterior sea realmente operativo, se debería


incluir la validación de los datos que se ingresan.

117
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Bajas

Este es un caso más complejo, ya que es necesario eliminar un registro ubicado


entre los demás. Al extraer un registro, el siguiente pasa a ocupar su lugar,
proceso que se repite hasta el final del archivo. Suponiendo el siguiente archivo
Registro empleado "Perez"
Registro empleado "Diaz"
Registro empleado "Welly"
Registro empleado "Saltz"
Registro empleado "Miranda"
Registro empleado "Trileo"

Si se debe dar de baja el registro del empleado Saltz, todos los que le siguen
deben desplazarse un lugar hacia atrás:

Registro empleado "Perez"


Registro empleado "Diaz"
Registro empleado "Welly"
Registro empleado "Miranda"
Registro empleado "Trileo"
Para poder hacer esto se debe utilizar un archivo auxiliar, ya que si un archivo fue
abierto para lectura, no pueden grabarse datos en él; y por otra parte debemos
leer el archivo a modificar hasta encontrar el registro a dar de baja.
El registro que se debe dar de baja tiene que poder identificarse por un campo,
generalmente un número (socio, cuenta, cliente, legajo, etc.). El algoritmo leerá
cada registro, comparando el número con el que es desea dar de baja, si no es , se
graba en el auxiliar y se pasa a leer el próximo, de lo contrario se va a leer sin
grabar nada. El siguiente es el esquema general del algoritmo:

Principio
Abrir (archivo)
Abrir (auxiliar)
Leer(número-baja)
Mientras no (EOF de archivo) hacer:
{
Leer de (archivo)(número y restantes campos)
Si número-baja <> número entonces hacer:
{

118
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Grabar en (auxiliar)(número y restantes campos)


}
}
Fin Mientras
Cerrar (archivo)
Cerrar (auxiliar)
Fin

Hasta aquí los datos quedaron almacenados en el archivo auxiliar, mientras que
en el original quedaron los datos sin la baja. Es necesario entonces, copiar los
datos del archivo auxiliar al original:

principio
Abrir (archivo)
Abrir (auxiliar)
Mientras (no EOF de auxiliar) hacer:
{
Leer de (auxiliar)(variables)
Grabar en (archivo)(variables)
}
Fin Mientras
Cerrar (archivo)
Cerrar (auxiliar)
Fin

Este algoritmo resulta ineficiente si se pretenden producir muchas bajas de


registros, ya que en cada caso es necesario recorrer todo el archivo y generar el
auxiliar, para solucionar de forma eficiente tales situaciones se utilizan otras
técnicas.

Modificaciones

El esquema del algoritmo es similar al de bajas. Si en el ejemplo se desea


modificar el registro del empleado Saltz en lugar de borrarlo. Se copian todos los
registros en el archivo auxiliar, salvo el que se desea modificar, el cual se graba
con los nuevos datos. La estructura "mientras" del algoritmo se especifica como
sigue:

Mientras no (EOF de archivo) hacer:


{
Leer de (archivo)(número y restantes campos)

119
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Si número = modif entonces hacer:


{
Ingresar (restantes campos)
}
Fin Si
Grabar en (auxiliar) (número y restantes campos)
}
Fin Mientras

120
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico V - Archivos Secuenciales

1.- En un archivo se tienen datos sobre la lluvia caída durante un cierto período.
Cada registro corresponde a un día y contiene:

Archivo LLUVIAS
* DIA
* MES
* AÑO
* PRECIPITACIONES (<=0 si no llovió)

Preparar un algoritmo que lea el archivo y cuente cuantos días hubo sin lluvias,
cuantos días llovió menos de 50 mm., y cuantos llovió 50 mm. o más. Producir
un listado como el siguiente:

INFORME ANUAL DE LLUVIAS


- CANTIDAD DE DIAS
SIN LLUVIAS : XX
MENOS DE 50 mm. : XX
50 mm. O MAS : XX

2.- Perfeccionar el algoritmo anterior para que además informe:

- PORCENTAJES
SIN LLUVIA : XX
MENOS DE 50 mm. : XX
50 mm. O MAS : XX
PRECIPITACIONES TOTALES : XXX

3.- En una estación meteorológica se registran diariamente la temperatura


máxima y la mínima. Preparar un algoritmo para generar un archivo con estos
datos. El programa debe permitir que todos los días un operador
cargue datos validándolos. La estructura del archivo debe quedar como sigue:

Archivo TEMPERATURA
* DIA
* MES
* TEMPERATURA MAXIMA
* TEMPERATURA MINIMA

121
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

4.- Usando el archivo anterior, prepara un algoritmo para que imprima el


siguiente reporte a fin de año:

TEMPERATURA
-INFORME ANUAL
TEMPERATURA MINIMA DEL AÑO : XX
REGISTRADA EL DIA : XX
DEL MES : XX

TEMPERATURA MAXIMA DEL AÑO : XX


REGISTRADA EL DIA : XX
DEL MES : XX

MAXIMA AMPLITUD TERMICA : XX


REGISTRADA EL DIA : XX
DEL MES : XX

Simultáneamente generar otro archivo con las temperaturas medias diarias, ((máx
+ mín)/2).

5.- Se efectúa una encuesta para conocer el nivel de ocupación de los pobladores
de una ciudad. Los encuestados contestaron sobre los siguientes ítems:

- Sexo (1:varón, 2:mujer)


- Edad
- Estado civil (1:soltero, 2:casado, 3:otros).
- Trabaja (0: no, 1: si)
- Estudia (0: no, 1: si)

Preparar algoritmos para procesar información recolectada en base a los


siguientes requerimientos:

a) Generar un programa que permita cargar los registros y validar los datos
en el ingreso.
b) Una vez que se tiene el archivo, imprimir un reporte como el siguiente:

PORCENTAJES
VARONES : XX
MUJERES : XX
MENORES DE 18 AÑOS QUE TRABAJAN : XX

122
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

SOLTEROS : XX
CASADOS : XX

ENCUESTADOS QUE TRABAJAN Y ESTUDIAN : XX


MUJERES QUE TRABAJAN : XX

6.- En un archivo están almacenados los datos correspondientes a los empleados


de una empresa de europea, con la siguiente estructura:

Archivo EMPLEADOS
* LEGAJO
* NOMBRE
* SUELDO - BASICO
* ANTIGUEDAD
* ESTADO CIVIL (0: soltero, 1: casado ,2: otros).
* HIJOS

Prepara un programa que lea el archivo e imprima los recibos de sueldo, con el
siguiente formato:

RECIBO DE HABERES
LEGAJO :XXXX - NOMBRE :XX...

SUELDO BASICO : XXXX


ANTIGUEDAD : XXXX
APORTE JUBILATORIO : XXXX
SALARIO POR ESPOSA : XXXX
SALARIO POR HIJOS : XXXX
NETO A COBRAR : XXXX

Para los cálculos, tener en cuenta las siguientes especificaciones:

a) El adicional por antigüedad es el 2% del sueldo básico.


b) El aporte jubilatorio es el 15 % del sueldo básico más la antigüedad
c) El salario por esposa es una suma fija de 80 Euros
d) El salario por hijos es de 25 Euros por cada uno.

Después de haber impreso el último recibo, imprimir un resumen para la


empresa con los siguientes datos:

CANTIDAD DE EMPLEADOS : XXXX

123
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

TOTAL SUELDOS : XXXX


TOTAL APORTES : XXXX
TOTAL SALARIOS : XXXX
TOTAL A PAGAR : XXXX

124
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Arreglos
En algunos casos a resolver por medio de programas, se puede hallar la dificultad
de tener que almacenar en memoria una gran cantidad de datos de un mismo
tipo.

Supongamos, por ejemplo, que necesitamos hacer un programa que ordene de


forma alfabética cuatro nombres que se ingresan por teclado, con lo visto hasta
este capítulo la solución sería almacenar cada nombre en una variable y luego ir
encontrando en base a decisiones el orden requerido:

Leer(nombre1)
Leer(nombre2)
Leer(nombre3)
Leer(nombre4)

Este ejemplo puede resolverse en la forma planteada pero, ¿ qué ocurriría si la


cantidad a ordenar fuera de 100, 500 ó 1000 nombres ?. La solución planteada
sería ineficiente, pues se necesitarían tantas variables diferentes como nombres a
ingresar.

La causa de este inconveniente esta dada por la imposibilidad de almacenar mas


de un dato en una variable, como solución a ello se utilizan los arreglos.
Consisten en agrupar bajo un mismo nombre a un conjunto de variables, donde
cada dato tendrá una posición dentro del arreglo, y esa posición es definida por
medio de un índice que se adjunta a la variable. Para el caso anterior
necesitaríamos un arreglo capaz de contener cuatro datos.

125
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Elemento

Indice Valor

Segundo elemento del 0 Juan


arreglo nombre
nombre[2] <- "María"
1 Ana
Arreglo nombres
2 María

3 Miguel

Como se ve en el gráfico, se ha definido un arreglo denominado "nombres" que


consta de cuatro elementos, donde para referirse a cada uno de ellas se utilizará
un índice de la siguiente manera :

Primer elemento cuyo valor es Juan: nombres[0]


Segundo elemento cuyo valor es Ana: nombres[1]
Tercer elemento cuyo valor es María: nombres[2]
Cuarto elemento cuyo valor es Miguel: nombres[3]

Este tipo de arreglo también se denomina vector, por agrupar las variables bajo
un solo índice o en una dirección. Para almacenar datos en este tipo de variables
utilizamos los mismos métodos que para cualquier variable de memoria, con la
ventaja que si necesitamos cargar más de una variable del arreglo, podemos
ubicar al ingreso dentro de un ciclo :

Principio
Para c<-0 hasta 3 incrementando 1 hacer :
{
Ingresar(nombres[c])
}
Fin Para
Fin

126
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejercitación en Lenguaje Perl

for($c=0; $c<=3; $c++)


{
print "\ncIngrese el valor del elemento $c :";
$nombres[$c] = <STDIN>;
chop($nombres[$c]);
}

De esta forma el primer nombre que se ingrese será almacenado en nombres[0],


el segundo en nombres[1] y así sucesivamente. De la misma manera para mostrar
el contenido del arreglo también se puede utilizar un ciclo o bien referirse a una
variable específica del arreglo.

Escribir(nombres[3])

Mostrará por pantalla el contenido de la tercer casilla o elemento del arreglo


nombres.

Para c = 0 hasta 3 hacer:


{
Escribir(nombres[c])
}
Fin para

Ejercitación en Lenguaje Perl

for($c=0; $c<=3; $c++)


{
print "El elemento [$c] contiene el valor : $nombres[$c]\n";
}

En este caso se imprimirá el contenido de todas las casillas del vector nombres.

Podemos también definir arreglos de mas de un índice, dependiendo la cantidad


máxima de índices del lenguaje de programación que se esté utilizando. Cada
índice puede imaginarse como una nueva dimensión del arreglo, por ejemplo si se
define el arreglo x[3,4] podemos representarlo :

127
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Elemento x[0,1]
Fila 0, columna 1

x[0,0] x[0,1] x[0,2] x[0,3]

Arreglo x de
x[1,0] x[1,1] x[1,2] x[1,3] 3 filas por cuatro
columnas

x[2,0] x[2,1] x[2,2] x[2,3]

En esta representación el primer índice se refiere al número de fila y el segundo al


de la columna en donde se encuentra ubicada la variable del arreglo. La forma de
cargar este arreglo por filas sería :

Principio
Para f=0 hasta 2 hacer
{
Para c=0 hasta 3 hacer
{
leer(x[f,c])
}
Fin Para
}
Fin Para
Fin

Ejercitación en Lenguaje Perl

for($f=0; $f<=2; $f++)


{
for($c=0; $c<=3; $c++)
{
print "Ingrese el valor del elemento [$f,$c] :";
$nombres[$f][$c] = <STDIN>;
}
}

print "\nImpresión del arreglo\n";

for($f=0; $f<=2; $f++)


{
for($c=0; $c<=3; $c++)

128
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
print "[$f,$c] -> $nombres[$f][$c]";
}
}

En este caso se utilizan dos ciclos, uno para cada índice, según se ubiquen los
índices uno dentro de otro, el arreglo se cargará por filas o por columnas. Para
cargarlo por columnas sería :

Principio
Para c = 0 hasta 3 hacer
{
Para F = 1 hasta 3 hacer
{
Leer(x[f,c])
}
Fin para
}
Fin para
Fin

A los efectos de mostrar u operar con los datos de este arreglo, también se deben
colocar los dos índices. Si quisiéramos mostrar solo la primer fila el algoritmo
sería :

Principio
Para c=0 hasta 3 hacer:
{
Leer(x[1,c])
}
Fin Para
Fin

De esta manera, teniendo cierta precaución con el manejo de los índices,


podemos operar con sectores del arreglo. En un mismo programa podemos
definir varios arreglos de distintas dimensiones, la restricción estará dada por la
capacidad de memoria del equipo o el lenguaje que se está utilizando. Téngase en
cuenta que en los ejemplos planteados hasta el momento, se utilizó para los ciclos
la estructura Para, pudiéndose de igual manera trabajar con arreglos usando las
estructuras Mientras y Hasta.

129
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejemplo A

Se tiene un listado con las ventas realizadas en los 30 días de un mes,


desordenadas. Realizar un algoritmo que totalice la venta de cada día y emita un
listado con dicho total por día y el total mensual. Después del último dato se
ingresa un día negativo.

Principio
Leer(día)
Leer(venta)

Mientras (día > 0) hacer:


{
tot(día) <--- tot(día) + venta
Leer(día)
Leer(venta)
}
Fin Mientras

totmes <--- 0
Escribir("Día Total")

Para I <- 1 hasta 30 hacer:


{
Escribir(I; " "; tot(i))
totmes <--- totmes + tot(i)
}
Fin Para

Escribir("Total del mes: "; totmes)


Fin

Ejercitación en Lenguaje Perl

print "\ndia :";$dia=<STDIN>;chop($dia);


print "\nventa:";$venta=<STDIN>;chop($venta);

while($dia>0)
{
$tot[$dia] = $tot[$dia] + $venta;
print "\ndia :";$dia=<STDIN>;chop($dia);
print "\nventa:";$venta=<STDIN>;chop($venta);
}

130
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

$totmes=0;
print "dia\ttotal\n";

for($i=1;$i<=30;$i++)
{

print $i."\t".$tot[$i]."\n";
$totmes = $totmes + $tot[$i];
}

print "total del mes: $totmes\n";

Ejemplo B

Se tiene almacenado en un vector la altura de 20 plantas numeradas,


correspondientes a un experimento. Hacer un algoritmo que permita ingresar una
altura y muestre los números de las plantas que tienen dicha altura.

Leer(ALTURA)
Para C = 1 hasta 20 hacer:
{
Si V(C) = ALTURA entonces hacer:
{
Escribir(C)
}
Fin Si
}
Fin Para

Si quisiéramos agregar al algoritmo la opción de que muestre un mensaje en el


caso de que no se encuentre alguna planta con la altura deseada, seria:

Leer(ALTURA)
S <--- 0
Para C=1 hasta 20 hacer:
{
Si V(C)=ALTURA entonces hacer:
{
Escribir(C)
S <--- 1
}
Fin Si
}

131
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Fin Para

Si S = 0 entonces hacer:
{
Escribir("No hay plantas de tal altura")
}
Fin

Ejercitación en Lenguaje Perl


print "\naltura :";$altura=<STDIN>;chop($altura);
$s=0;

for($c=1;$c<=20;$c++)
{
if ($v[$c] = $altura)
{
print $c."\nt";
$s = 1;
}
}

if ($s == 1)
{
print "No hay plantas de tal altura\n";
}

La variable S, se denomina señal, y se utiliza para saber si se pasó o no por un


lugar determinado del algoritmo. Este método de búsqueda en un arreglo se
denomina Búsqueda Secuencial, el mismo sería ineficiente para el caso de que
quisiéramos buscar varios valores dentro del arreglo, pues por cada uno de ellos
se deberá recorrer integramente al mismo, haciendo esta tarea muy lenta la
búsqueda, más aún si el arreglo
posee una gran cantidad de datos. La forma de solucionar este problema es
ordenando previamente los datos del arreglo, lo que permitirá utilizar otros
métodos de búsqueda.

Ejemplo C

Dada una matriz N de 25 x 25, hallar la suma de los números almacenados en sus
dos diagonales principales.

Principio
Para FILA=1 hasta 25 hacer:

132
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
Para COL=1 hasta 25 hacer:
{
Leer(N(FILA,COL))
}
Fin Para
}
Fin Para

DIAG1 <--- 0
DIAG2 <--- 0

Para I = 1 hasta 25 hacer:


{
DIAG1 <--- DIAG1 + N(I,I)
DIAG2 <--- DIAG2 + N(I,26-I)
}
Fin Para

Escribir("Diagonal principal: ";DIAG1)


Escribir("Diagonal secundaria: ";DIAG2)
Fin

Ordenamiento de Vectores
En muchos casos nos encontraremos con la necesidad de ordenar el contenido
de un arreglo en forma ascendente o descendente. El ejemplo mas típico es el de
querer ordenar un conjunto de nombres que se ingresaron en un arreglo. Existen
varios métodos para ordenar vectores, nosotros nos dedicaremos en un primer
momento al que se denomina burbujeo. Plantearemos el ejemplo de un vector de
4 elementos que contiene los siguientes datos :

5 4 6 2

V(1) V(2) V(3) V(4)

Si se quieren ordenar de menor a mayor, el resultado deberá ser el siguiente


estado:

133
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

2 4 5 6

V(1) V(2) V(3) V(4)

Comenzaremos comparando los datos almacenados en V(1) y en V(2) y


colocando el valor mayor en V(2). En este caso pasaría el valor 5 a V(2) y el valor
4 a V(1). De la misma manera compararemos luego V(2) con V(3) y V(3) con
V(4). El algoritmo que realizaría esta tarea sería :

Para I=1 hasta 3 hacer:


{
Si (V(I)>V(I+1)) entonces hacer:
{
A <--- V(I)
V(I) <--- V(I+1)
V(I+1) <--- A
}
}
Fin Para

Observemos que en el algoritmo se compara cada V(I) con el siguiente, esto hace
que el ciclo para deba ir hasta el valor N-1 considerando a N como número de
elementos del vector. En nuestro ejemplo los datos del vector se irán
acomodando de la siguiente manera :

5 4 6 2

V(1) V(2) V(3) V(4)

4 5 6 2 I=1

4 5 6 2 I=2

4 5 2 6 I=3

134
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

El resultado de aplicar el algoritmo es, para vectores de cualquier longitud y


siempre que ordenemos de menor a mayor, que el dato mayor queda ubicado en
el último elemento del arreglo. Nótese que si quisiéramos ordenar de mayor a
menor cambiando el sentido de la pregunta quedará el número menor en el
último casillero del vector.
Este algoritmo deberá ejecutarse N-1 veces (considerando a N como el
número de elementos del vector), quedando de esa forma ordenado el vector en
forma completa. La forma de implementarlo seria:

Para VEZ=1 hasta 3 hacer:


{
Para I=1 hasta 3 hacer:
{
Si (V(I)>V(I+1)) entonces hacer:
{
A <--- V(I)
V(I) <--- V(I+1)
V(I+1) <--- A
}
Fin Si
}
Fin Para
}
Fin Para

Siendo el resultado de cada vez:

4 5 2 6 VEZ = 1

4 2 5 6 VEZ = 2

2 4 5 6 VEZ = 3

Notemos que luego de cada vez, no se hace necesario comparar los elementos
que ya quedaron ordenados, esto puede solucionarse haciendo el ciclo de VEZ
desde 3 hasta 1 y realizando el ciclo de I hasta VEZ en lugar de hacerlo siempre
hasta N-1.

135
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Para VEZ=3 hasta 1 (incrementando -1) hacer:


{
Para I=1 hasta VEZ hacer:
{
Si V(I)>V(I+1) entonces hacer:
{
A <--- V(I)
V(I) <--- V(I+1)
V(I+1) <--- A
}
Fin Si
}
Fin Para
}
Fin Para

De esta manera la primera vez el ciclo I ira hasta 3, la segunda hasta 2 y la tercera
hasta 1, haciendo de esta manera mucho más eficiente el algoritmo. En algunos
casos se puede dar que el vector quede ordenado antes de realizar todas las veces
planteadas el ciclo de comparación I, por lo tanto se ejecutará algunas veces sin
necesidad de que así ocurra. La solución para ello es usar una señal que permita
detectar si se realizaron o no intercambios de elementos luego de cada vez.

Para VEZ=3 hasta 1 (incrementando -1) hacer:


{
S <--- 0
Para I=1 hasta VEZ hacer:
{
Si (V(I)>V(I+1)) entonces hacer:
{
A <--- V(I)
V(I) <--- V(I+1)
V(I+1) <--- A
S <--- 1
}
Fin Si
}
Fin Para

Si S=0 entonces hacer:

136
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

{
VEZ <--- 1
}
Fin Si

}
Fin Para

En el caso de detectar mediante la señal S que no se ha producido ningún


intercambio de contenidos, se fuerza la salida del ciclo VEZ asignando a la
variable de control el valor hasta.

Ejemplo D

Se tiene un listado con los nombres y edades de 20 personas. Hacer un algoritmo


que permita cargar los nombres en un vector NOM, las edades en uno EDAD y
emita un listado de los datos ordenados por edad.

Principio

Para I=1 hasta 20 hacer:


{
Leer(NOM(I))
Leer(EDAD(I))
}
Fin Para

Para VEZ=19 hasta 1 (incrementando -1) hacer:


{
S <--- 0
Para I=1 hasta VEZ hacer:
{
Si (EDAD(I)>EDAD(I+1)) entonces hacer:
{
X <--- NOM(I)
NOM(I) <--- NOM(I+1)
NOM(I+1) <--- X
E <--- EDAD(I)
EDAD(I) <--- EDAD(I+1)
EDAD(I+1) <--- E
S <--- 1

137
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

}
Fin Si
}
Fin Para

Si S=0 entonces hacer:


{
VEZ <--- 1
}
Fin Si

}
Fin Para

Para I=1 hasta 20 hacer:


{
Escribir(NOM(I);" ";EDAD(I))
}
Fin Para

Fin

Ordenamiento por Inserción


Algoritmo para ordenar una lista de números de menor a mayor utilizando una
segunda lista inicialmente vacía:

° Paso 1. Si la primera lista tiene sólo un número, sáquelo de la lista,


colóquelo en la primera posición disponible en la segunda lista y termine;
la segunda lista contiene los números de la primera, ordenados de menor a
mayor.

° Paso 2. Recorra la lista completa y encuentre al menor de todos los


números que hay en ella.

° Paso 3. Saque ese número de la primera lista y colóquelo en la primera


posición disponible en la segunda lista.

° Paso 4. Repita el paso 1, pero usando ahora la primera lista reducida, es


decir, sin el número que sacó.

138
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Ejemplo: Aplicando el algoritmo anterior, ordene de menor a mayor la lista (7 3


9 13 2 18 11 2).

Este algoritmo se llama de inserción, ya que va insertando los números de la


primera lista en forma ordenada en la segunda lista. Este algoritmo de ordenación
de una lista lo utilizamos cuando ordenamos un conjunto de naipes para
sujetarlos en la mano. Así, partimos con una lista de naipes desordenados y una
mano sin naipes. Luego tomamos cada uno de los naipes de la primera lista y los
vamos insertando en forma ordenada en la mano. Al final terminamos con
cuando la primera lista no tiene naipes y la mano contiene todos los naipes
iniciales ordenados.

Búsqueda en Vectores
Se había planteado anteriormente que para el caso de tener que realizar muchas
búsquedas en un vector o tener que buscar datos en vectores de gran longitud, es
conveniente ordenar primero el vector y luego utilizar un método mucho más
eficiente que la búsqueda secuencial.

Supongamos que tenemos el siguiente arreglo en memoria y se desea saber si en


algún elemento del mismo se encuentra almacenado el número 43:

23 43 11 56 21 35 33
V(1) V(2) V(3) V(4) V(5) V(6) V(7)

El primer paso será ordenarlo con algún método, con lo que quedará :

11 21 23 33 35 43 56
V(1) V(2) V(3) V(4) V(5) V(6) V(7)

El algoritmo del método, siendo N el número máximo de elementos del vector y


A el valor a buscar, es :

Leer(N)
Leer(A)
S <--- N
I <--- 1

139
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Mientras ((S-I)<>1) hacer:


{
K <--- ENT((S+I)/2)
Si V(K) <= A entonces hacer:
{
I <--- K
}
sino hacer:
{
S <--- k
}
Fin Si
}
Fin Mientras

Si V(I)=A entonces hacer:


{
Escribir(V(I))
}
sino hacer:
{
Si V(S)=A entonces hacer:
{
Escribir(V(S))
}
sino hacer:
{
Escribir(A;"No se encuentra")
}
Fin Si

}
Fin Si

140
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Trabajo Práctico VI - Arreglos


1. Dada una lista de 30 números, realizar un algoritmo que los guarde en un
arreglo y luego los muestre en orden inverso al que fueron ingresados.

2. Se tiene una lista de números, el primer número de la lista indica cual es el total
de números de la lista incluido el primero. Hacer un algoritmo que guarde todos
los datos de la lista en un vector, inclusive el primero.

Principio
Ingresar(cant)
v(1) <--- cant
Para I <- 2 hasta cant hacer
{
Ingresar(v[I])
}
Fin Para
Fin

3. Preparar un algoritmo que realice las siguientes operaciones :

a) Cargue un arreglo X con 50 números.

b) Copie los datos que se encuentren en las casillas con índice par en otro
arreglo Y.

c) Muestre el contenido del arreglo Y por pantalla.

4. Una empresa tiene 10 vendedores que entregan cada uno semanalmente un


listado con las ventas de cada uno de los días sin totalizar. Se pide realizar un
algoritmo que muestre por pantalla el total semanal de cada vendedor, el
promedio de venta semanal de la empresa y el código del vendedor que más
vendió en esa semana.

5. Hacer un algoritmo que almacene en un arreglo 20 números y luego


multiplique a cada
dato por el índice de la casilla en la que se encuentra almacenado.

6. Se tiene un vector V con 30 elementos. Hacer un algoritmo que intercambie el


contenido de la casilla número 1 con el de la 30, el de la 2 con el de la 29 y así

141
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

sucesivamente. Pensar el mismo problema para un vector de 29 elementos.

7. Teniendo en memoria un vector con los saldos de las cuentas corrientes de los
100 clientes de un banco (el número de cuenta coincide con el índice) se pide
realizar un algoritmo que realice las siguientes operaciones :

a) Cargar los movimientos que tuvieron ese día las cuentas corrientes e ir
actualizando los datos del vector. Después del último movimiento se
ingresa un número de cuenta corriente negativo.

b) Emitir un listado con los clientes que tengan saldo negativo.

Ejercicios de ordenamiento

8. Hacer un algoritmo que permita cargar en un vector 10 nombres, los ordene


alfabéticamente y los muestre por pantalla.

9. Al problema anterior se le agrega un vector ALTURA, suponiendo a los tres


vectores ya cargados hacer un algoritmo que emita un listado de los datos
ordenados por altura y
otro listado ordenados por nombre.

10. Se tiene un vector A de M elementos y otro B de N elementos, ambos


ordenados en forma creciente. Desarrollar un algoritmo que construya otro
vector C, ordenado en forma creciente, con los elementos combinados de A y B.
Desechar la solución simple pero ineficiente de colocar un vector a continuación
de otro y luego reordenarlo.

11. Se ingresan por teclado N datos correspondientes a mediciones


experimentales de una cierta magnitud. Hacer un algoritmo que encuentre y
muestre la mediana de esos valores. La mediana es aquel valor de la variable tal
que el 50% de las observaciones son mayores que él y el otro 50% son menores.
Por ejemplo para el conjunto de valores 3, 15, 17, 5, 11, 1, 8, 9 y 7 la mediana es
8; mientras que para 17, 12, 3, 26, 6, 11, 25 y 9 la mediana es 11,5.

Ejercicios con arreglos de dos dimensiones

12. Hacer un algoritmo que almacene en un vector N$ los nombres de 10


personas y en otro E las edades, luego que permita ingresando el nombre de una
persona saber la edad de la misma (si no se encuentra que emita el cartel

142
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

correspondiente), pudiendo realizar esta consulta muchas veces.

13. Se tiene en memoria una matriz de 56 x 72 Hacer un algoritmo que calcule el


promedio de todos los datos almacenados en la matriz.

14. Dada una matriz de 8 x 14 construir un vector con los valores negativos
almacenados en dicha matriz.

15. Dadas dos matrices M y N de 35 x 24, se pide generar una tercer matriz P
cuyos elementos sean la suma de los elementos correspondientes de las otras dos.

16. Dada una matriz de 15 x 15, generar un vector con los elementos de sus
diagonales principales.

17. Se tiene una matriz M de 36 columnas por 54 filas, y un vector V de 36


elementos. Se pide dividir los elementos de cada columna de la matriz por el
elemento correspondiente del vector, guardando los resultados en otra matriz de
36 por 54.

18. Se ingresan por teclado los siguientes datos referidos a los alumnos de una
carrera: número de alumno, código de la materia, y nota obtenida. Hacer un
algoritmo que obtenga e imprima la nota promedio de cada alumno y la nota
promedio de cada materia. La cantidad de materias y la de alumnos se ingresan al
principio por teclado. Como primer paso, llenar la matriz que se use con ceros,
de esta forma quedará un cero en el lugar que corresponda a un alumno ausente
en determinada materia. Luego de la última terna de datos se ingresan tres ceros.

19. Dada una matriz numérica, se denomina punto de silla a aquel que es
simultáneamente máximo de su fila y mínimo de su columna. Determinar
mediante un programa todos los puntos de silla de una matriz generada con
números aleatorios.

20. Un programador que trabaja en un observatorio astronómico recibe datos vía


satélite de la intensidad luminosa de distintas regiones del Cosmos. La
información de cada una de las regiones es recibida por un detector de luz de los
satélites exploradores, y el propio detector la almacena en un arreglo de dos
dimensiones (70 x 20), representando cada elemento del arreglo la cantidad de luz
procedente de la porción de imagen correspondiente. El rango de intensidad
varía entre 0 y 100.
Se supondrá la existencia de una estrella en el área correspondiente a un elemento
del arreglo cuando la suma de la intensidad correspondiente al mismo más la

143
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

media de los 8 puntos circundantes es mayor o igual que 60.


Construir un algoritmo que sea capaz de tratar el arreglo de intensidades medidas
por el detector, y represente en pantalla un asterisco (*) en aquellas zona donde
considera la existencia de una estrella. En las zonas en las que no, presentará en
pantalla un espacio en blanco. (Omitir los cálculos para los puntos situados en la
periferia del arreglo).

Aplicaciones

1. PROMEDIOS MOVILES: Cuando se tiene una serie de datos, generalmente


en función del tiempo, los promedios móviles tienden a suavizar las oscilaciones
bruscas, permitiendo visualizar más claramente las tendencias a largo plazo. En
un promedio móvil, se promedia un número especificado de datos puntuales.
Cuando se incluye un nuevo dato, el primero es descartado para hacer lugar al
mismo. Por ejemplo, en la siguiente serie de datos se muestran los promedios
móviles tomados en grupos de tres:

DATOS PROMEDIOS

41
56 (41 + 56 + 45) / 3 = 47.33
45 (56 + 45 + 37) / 3 = 46.00
37 (45 + 37 + 32) / 3 = 38.00
32 (37 + 32 + 35) / 3 = 34.66
35 (32 + 35 + 29) / 3 = 32.00
29 (35 + 29 + 33) / 3 = 32.33
33 (29 + 33 + 24) / 3 = 28.66
24 (33 + 24 + 28) / 3 = 28.33
28 (24 + 28 + 22) / 3 = 24.66
22

Se observa que si bien los datos presentan altibajos, los valores de los promedios
móviles tienden claramente a bajar. De la misma forma, los datos pueden
mediarse en grupos de distinta cantidad de datos. Por ejemplo en grupos de
cinco:

DATOS PROMEDIOS

1
6

144
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

5 (41+56+45+37+32)/5= 42.20
7 (56+45+37+32+35)/5= 41.00
2 (45+37+32+35+29)/5= 35.60
5 (37+32+35+29+33)/5= 33.20
9 (32+35+29+33+24)/5= 30.60
3 (35+29+33+24+28)/5= 29.80
4 (29+33+24+28+22)/5= 27.20
8
2

Llamaremos "Tamaño de Ventana" a la cantidad de datos de los grupos. Preparar


un programa para que haga lo siguiente:

a) Ingresar la cantidad total de datos.


b) Ingresar los datos.
c) Ingresar el tamaño de ventana.
d) Calcular e imprimir los promedios móviles. El programa debe permitir
el cálculo de los promedios con distintas ventanas sin que se deban
ingresar nuevamente los datos en cada caso.

2. PRODUCTO DE MATRICES: Dada una matriz A de M filas por N


columnas, y otra matriz B de N filas por P columnas, se define el producto A por
B como:

C=A*B

Donde C es una matriz de M filas por P columnas, tal que el elemento de la fila I,
columna J de C es la sumatoria de los productos de los elementos de la fila I de
A, por los elementos de la columna J de B. Por ejemplo:

| -1 2 |
B= | 3 -2 |
| 2 -1 |

| 2 3 -1 | | 5 -1 |
A= | 1 -2 2 | | -3 4 |
| 1 1 -3 | | -4 3 |

Obsérvese que el elemento (2,1) de C, que es -3, se calculó como:

1 * (-1) + (-2) * 3 + 2 * 2 =

145
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

donde 1, -2 y 2 son los elementos de la fila 2 de A, mientras que 1, 3 y 2 son los


elementos de la columna 1 de B.

Para que el producto sea posible, la cantidad de columnas de A debe ser igual a la
cantidad de filas de B. Preparar un programa para multiplicar matrices, haciendo
lo siguiente:

a) Ingresar M, N y P.

b) Ingresar los elementos de A y B.

c) Obtener el producto e imprimir A, B y C.

3. DISTRIBUCION PORCENTUAL: Cuando se tiene una cierta cantidad de


datos de un mismo tipo, puede interesar saber cual es la distribución porcentual
de los mismos, es decir, que porcentaje del total representa cada uno. Para ello se
toma cada dato, se lo multiplica por 100 y se lo divide por la suma de todos.
Supongamos que una persona durante un día consumió las siguientes cantidades
de alimentos:

200 grs. de carne


150 grs. de pan
800 grs. (cm3) de agua
300 grs. de verduras
170 grs. de otros alimentos.

Se desea saber, del total ingerido, que porcentaje consumió de carne, que
porcentaje de pan, etc. En el ejemplo las cuentas son las siguientes:

Cantidades Porcentajes

200 200*100/1620 = 12.35 %


150 150*100/1620 = 9.26 %
800 800*100/1620 = 49.38 %
300 300*100/1620 = 18.52 %
170 170*100/1620 = 10.49 %
---------
1620

Preparar un programa a los efectos de ingresarle una secuencia de datos, y

146
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

obtenga e imprima la distribución porcentual de los mismos.

Aplicaciones en Estadística Descriptiva

Es muy útil disponer de un programa que, dada una serie de valores que
representan la medida de un cierto atributo cuantitativo, permita ordenar los
datos y calcular parámetros estadísticos para su análisis.

Preparar este programa teniendo en cuenta las siguientes definiciones:

a) Distribución de frecuencias: Es la disposición de los datos en clases,


especificando el número de datos u observaciones que caen en cada clase.

Ejemplo: Suponer que los siguientes son valores de pesos de un grupo de


personas: 54, 62, 46, 68, 72, 58, 48, 56, 74, 64, 50, 66, 62, 52, 76, 60, 64, 68,
78, 54. Pueden tomarse cuatro intervalos de 10 Kg. cada uno, con lo cual
queda una tabla como la siguiente:

Intervalo Peso Frecuencia %

1 40<=P<50 2 10
2 50<=P<60 7 35
3 60<=P<70 8 40
4 70<=P<80 3 15
TOTAL: 20 100

b) Media aritmética: (promedio) Si los datos se han dispuestos en forma de


distribución de frecuencias, el cálculo de la media aritmética se abrevia
usando la fórmula:

XM = SXf/Sf

Donde SXf es la sumatoria de los productos de los puntos medios del


intervalo por sus respectivas frecuencias, y Sf es la suma de todas las
frecuencias, en nuestro ejemplo;

SXf = 45 * 2 + 55 * 7 +...
Sf = 2 + 7 +...

147
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

con lo que XM = 61, que es una aproximación del valor real (XM = 60.6)

c) Mediana: Es el valor de la variable tal que el 50% de los datos es menor


que él, y el otro 50% es mayor.

d) Modo: Es el valor del punto medio del intervalo de mayor frecuencia,


en nuestro ejemplo modo = 65.

e) Desviación standard: Sirve para medir la dispersión de los datos. Se


puede calcular mediante:

DE = SQR (SfX2/N - XM^2)

Donde SfX2 es la sumatoria de los productos de los cuadrados de los


puntos medios de los intervalos por las respectativas frecuencias, en
nuestro ejemplo:

SfX2 = 2 * 45^2 + 7 * 55^2 +...

f) Simetría: Se calcula mediante la siguiente fórmula:

S = (XM - modo) /DE

g) Curtosis: Es la medida del achatamiento de la curva, se calcula


mediante:

Curtosis = M4 / DE 4

Donde M4 se calcula:

M4 = (f1 * D1^4 + f2 * D2^4 +...) /N

A su vez, D1, D2, etc son las diferencias entre los puntos medios de los
intervalos y la medida aritmética. En nuestro ejemplo:

D1 = 45 - 61 = -16
D2 = 55 - 61 = -6
D3 = 65 - 61 = 4
D4 = 75 - 61 = 14

Con lo que:

148
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

M4 = (2 * (-16)^4 + 7 * (-6)^4 + 8 * 4^4 + 3 * 14 4) /20

h) Variación relativa: Se obtiene mediante el coeficiente de variación:

V = DE * 100 / XM

149
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

150
UNLu - DCB Cuaderno de estudio "Metodología de la Programación"

Bibliografía

Fundamentos de informática, lógica, resolución de problemas,


programas y computadoras
Autores Allen B. Tucker, W. James Bradley, Robert D. Cupper, David K.
Garnick
Editorial McGraw-Hill Año 1994

Curso de programación
Autores Jorge Castro, Felipe Cucker, Xavier Messeger, Albert Rubio, Luis
Solano, Borja Valles
Editorial McGraw-Hill Año 1993

Fundamentos de programación. Algoritmos y Estructuras de Datos


Autores Luis Joyanes Aguilar
Editorial McGraw-Hill, 2da edición, Año 1998

Algoritmos. Problemas resueltos y comentados


Autores Joaquín Fernández, Francisco J. Oliver, José L. Sánchez
Editorial Paraninfo Año 1992

Algorithms
Autores Ian Craw y John Pulham.
Universidad de Aberdeen.
http://www.maths.abdn.ac.uk/~igc/tch/mx4002/notes/notes.html

El Lenguaje de programación C.
Autores B. Kernighan, B y D.Ritchie.
Editorial Prenctice Hall , 2da edición

Introducción a la programación. Un enfoque práctico


Autores J.M. González, J. Cordero, , R. Martínez, R. Romero
Editorial Algaida Informática, año 1996

151

Anda mungkin juga menyukai