MODULO PROGRAMACION-2002-v16 - Universidad Nacional de

Anuncio
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
2
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Índice General
Primera Parte:
Conceptos Básicos
Introducción
Procesamiento
Algoritmos
Programas
Definiciones Básicas
Máquina de Von Neumann
Lenguajes de Programación
Lenguaje de Máquina
Lenguaje Ensamblador
Lenguajes de Alto Nivel
Intérprete
Compilador
Ventajas de los Lenguajes de Alto Nivel
Desventajas de los Lenguajes de Alto Nivel
Paradigmas de Programación
Metodología de la Programación
Sistemas de Información
Ingeniería de Software
Guía de Lectura - Conceptos Básicos
Segunda Parte:
Introducción a la Programación
Datos
Tipos de Datos Primitivos
Variables
Declaración de Constantes y Variables
Expresiones y Operadores
Operadores Aritméticos
Operadores Relacionales
Operadores Lógicos
Orden de Evaluación de los Operadores
Funciones del Lenguaje
Trabajo Práctico I - Introducción a la Programación.
Tercera Parte:
5
6
9
11
13
14
18
18
19
19
19
20
20
21
21
24
25
26
29
31
32
33
34
35
35
36
40
42
43
45
Programación Estructurada: Estructuras de Control
Estructogramas o Diagramas Chapín
Escritura de Programas
Entrada y Salida de Información
Estructura Secuencial
Trabajo Práctico II - Estructura Secuencial
Estructura de Selección
Decisiones
Estructura Condicional Simple
Estructura Condicional Compuesta
Selecciones Anidadas
Menú de Opciones
Estructura de Selección Múltiple
Trabajo Práctico III - Estructura Condicional
3
50
52
53
57
59
63
63
64
66
71
75
79
81
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Estructura Repetitiva o Iterativa
Estructura Mientras
Estructura Repetir
Estructura Repetir-Hasta
Estructura Para
Búsqueda del Extremo
Validación de Datos
Trabajo Práctico IV - Estructura Repetitiva
Cuarta Parte:
87
88
91
92
94
97
98
100
Programación Estructurada: Archivos Secuenciales
y Arreglos
Archivos Secuenciales
Operaciones Sobre Archivos
Grabación de Datos
Recuperación de Datos Grabados
Organización Secuencial
Acceso Secuencial
Modificaciones de Datos Sobre Archivos Secuenciales
Trabajo Práctico V - Archivos Secuenciales
Arreglos
Ordenamientos de Vectores
Ordenamiento por Inserción
Búsqueda en Vectores
107
110
110
113
115
115
117
121
125
133
138
139
141
Trabajo Práctico VI – Arreglos
Bibliografía
151
4
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
SALIDA
COMPUTADORA
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Máquina de Von Neumann
En el año 1946, John Louis Von Neumann -junto a otros colaboradoresescribió 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
de
Entrada
Unidad
Aritmético
y Lógica
Registros
Unidad
de
Salida
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
• Varios registros de memoria llamados acumuladores, donde se almacenan
los resultados parciales de las operaciones .
• Circuitos dedicados
comparación y testeo.
a la
suma, resta, multiplicación, división,
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
• 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
de
trabajo
Periférico
de
E/S
Unidad
Central
de
Proceso
Periférico
de
E/S
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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.
Programa
Fuente
Intérprete
Traducción y
ejecución
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
Fuente
Compilador
Programa
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Alguien es mortal si alguien es hombre
(hecho)
(regla)
=>¿Sócrates es mortal?
=>SI
(pregunta)
(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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Los hechos:
La regla:
hombre(Socrates)
mortal(x) :- hombre(x)
La pregunta :
La repuesta:
? mortal(Socrates)
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
30
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
• 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
tipo numérico
porcentaje_aumento
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
saldo <- -55.98
La siguiente tabla muestra las características de los tipos de datos más comunes:
Tipo
booleano
byte
short
char
int
long
float
double
Tamaño
1 bit
8 bits
16 bits
16 bits
32 bits
64 bits
32 bits
64 bits
Rango de valores
falso, verdadero
-128...127 / 0..255
-32768 ... 32767
\u0000 ... \uffff
-2147483648 ... 2147483647
-9,22E18 ... 9,22E18
reales de 32 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
B <- (7 <= 12)
C <- 7 >= 7
En A se almacena el valor de verdad falso
En B se almacena el valor de verdad verdadero
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Operador
**
+
*
/ ó div
% ó mod
+
-
Significado
Potenciación
Signo más (unario)
Cambio de signo (unario)
Multiplicación
División real y entera
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
7/5
7 div 2
7 mod 2
Comentario
= 3.5 División real
= 3 División entera
= 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
X>Y
(X-3) < (Y-2)
(X-4) >= (Y+3)
"A" > "B"
"z" > "Z"
"uno" = "unos"
"uno" < "unos"
Resultado
Es Verdadero
Es Falso
Es verdadero
Es verdadero
Es verdadero
Es falso
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
"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
Decimal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Caracter
NUL \0
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
Valor
Decimal
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
38
Caracter
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
Valor
Decimal
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
Caracter
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
DC3
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
RS
US
SPACE
!
COMILLAS
#
$
%
&
'
(
)
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
• 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
V
F
NOT A
F
V
Donde A es una expresión booleana
Tabla de Verdad del Operador de Conjunción AND
A
F
F
V
V
B
F
V
F
V
A AND B
F
F
F
V
Donde A y B son expresiones booleanas
Tabla de Verdad del Operador de Disyunción OR
A
F
B
F
A OR B
F
40
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
F
F
V
V
B
F
V
F
V
A XOR B
F
V
V
F
Donde A y B son expresiones booleanas
Ejemplos
Expresión
(3 = 4) AND ( 6 < 7)
NOT (4 < 6)
(3=4) EQV (5=6)
Resultado
Falso
Falso
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Aritméticos
De relación
Lógicos
Significado
Prioridad
Exponenciación
Negación
Multiplicación/División
División entera
Módulo
Suma/Resta
1
2
3
4
5
6
Mayor
Mayor igual
Menor
Menor igual
Igual
Distinto
7
7
7
7
7
7
Complemento (NO- NOT)
Conjunción (Y -AND)
Disyunción (O - OR)
Disyunción exclusiva (XOR)
8
9
10
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Ejemplos de funciones del lenguaje sobre tipos numéricos:
Nombre
Significado
abs
Calcula el valor absoluto
int
Devuelve la parte entera de un
número real
rnd
Genera un número aleatorio
(mayor a 0 y menor a 1)
round
Redondea un dato a un número
determinado de cifras
cos
sin
sqrt
Calcula el coseno del ángulo n
(en radianes)
Calcula el seno del ángulo n (en
radianes)
Calcula la raíz cuadrada de n
Ejemplos
abs(-5)
abs(x)
int(-2.8)
int(12.1)
round(2.1)
round(7.125, 2)
cos(n)
sin(n)
sqrt(n)
Ejemplos de funciones del lenguaje que operan sobre cadenas:
Nombre
Significado
length
Calcula el largo de una cadena.
Extrae una subcadena de una
substr
cadena de caracteres.
Retorna el caracter ASCII
chr
equivalente al número decimal
brindado como argumento
Devuelve en minúsculas todas
lower
las letras de una cadena
Devuelve en mayúsculas todas
upper
las letras de una cadena
Ejemplos
length("Hola mundo")
substr(cadena,2,3)
chr(65)
lower(cadena)
lower("MaLANdro")
upper(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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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)
Sean I y J dos variables numéricas enteras, cuyos valores son 6 y 12
2.
respectivamente. Indicar cuáles de los siguientes predicados son verdaderos.
a)
b)
c)
d)
e)
f)
2*I<J
2*I<1
I > 0 AND I < 10
I > 25 OR (I < 50 AND J < 50)
I < 4 OR J > 5
NOT I > 6
3.
Sean X, Y, Z y T variables numéricas.
correspondientes a:
a)
b)
c)
d)
Escribir los predicados
Los valores de X e Y son superiores a 3
Los valores de X, Y y Z son idénticos
Los valores de X, Y y Z son iguales pero difieren del de T
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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 MientrasHacer 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 NassiSchneiderman) 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
años < 5
número es impar")
V
antiguedad <sueldo*10/100
sueldo <- basico + 250
antiguedad = 0
F
antiguedad <sueldo*20/100
total <- sueldo + antiguedad
escribir("El monto a abonar es ", total)
Fin
Ejemplo de diagrama de Chapín
51
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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: ";
$seccion = <STDIN>; chop($seccion);
print "Ingrese años de antiguedad : ";
$anios = <STDIN>; chop($anios);
$basico = 800;
print "Ingrese seccion del empleado: ";
$seccion = <STDIN>; chop($seccion);
if ($seccion == 1)
{$sueldo = $basico + 120;
if($anios < 5)
{$antiguedad = $sueldo*10/100;}
else{$antiguedad = $sueldo*20/100;}
}else{$sueldo = $basico + 250;
$antiguedad = 0;}
$basico = 800;
$total = $sueldo + $antiguedad;
print "El monto a abonar es $total\n";
print "Ingrese años de antiguedad
$anios = <STDIN>; chop($anios);
if ($seccion == 1)
{
$sueldo = $basico
if($anios < 5)
{
$antiguedad =
}
else
{
$antiguedad =
}
}
else
{
$sueldo = $basico
$antiguedad = 0;
}
: ";
+ 120;
$sueldo*10/100;
$sueldo*20/100;
+ 250;
$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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
56
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
>= 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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)
2)
3)
4)
total > 50
alfa < mo
be4 <- jota + 6
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
...
(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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
inicio
Leer cantidad
cantidad > 100
V
F
precio <- 215
precio <- 197
....
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
número es par")
Escribir("El
número es impar")
Fin
también puede hacerse:
70
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Inicio
Leer numero
cociente = numero / 2
entero = int(cociente)
fraccion = cociente - entero
fraccion = 0
V
F
Escribir("El
número es par")
Escribir("El
número es impar")
Fin
ó también :
Inicio
Leer numero
numero/2 = int(numero/2)
V
F
Escribir("El
número es par")
Escribir("El
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
71
(I)
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
(instrucciones)
}
de lo contrario
{
(instrucciones)
Si (condición 2) entonces hacer
{
(instrucciones)
}
de lo contrario
{
(instrucciones)
}
Fin Si
}
Fin Si
(II)
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
Instrucciones
Instrucciones
72
F
Instrucciones
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Inicio
Leer seccion, años
basico <- 800
seccion = 1
V
F
sueldo <- basico + 120
Escribir("El
años < 5
número es impar")
V
antiguedad <sueldo*10/100
sueldo <- basico + 250
antiguedad = 0
F
antiguedad <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
: ";
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
$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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
print
print
print
"Elija una opcion\n";
"1. Triangulo\n";
"2. Rectangulo\n";
"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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
va 1
Instrucciones
Alternati
va 2 y 3
Alternati
va n
Instrucciones
Instrucciones
De lo
contrario
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
tiva 1
Ejecutar(triangulo)
Alterna
tiva 3
Alterna
tiva 2
Ejecutar(rectangulo)
Ejecutar(circulo)
Escribir("La superficie es ",superficie")
Fin
80
De lo
contrario
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
- 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
86
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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.
Estructura
de control
Mientras x sea distinto de 3 hacer
{
instrucción 1
instrucción 2
.......................
instrucción n
}
Fin Mientras
<- condición
<- bloque
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
° 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
1985
1986
1987
1988
1989
y : ventas (mill)
1.25
1.75
2.00
2.50
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
datos cada vez, para ello el menú puede tener una opción para el ingreso.
106
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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.
Archivo
de datos de
ALUMNOS
FICHA DEL ALUMNO
Alumno: Gomez, Mirian
Fecha nacimiento: 10/03/1972
Sexo: DEL
femenino
FICHA
ALUMNO
Curso: 7a
Alumno:
Ver, Pablo
Situación:
regular 11/04/1973
Fecha
nacimiento:
Sexo: DEL
masculino
FICHA
ALUMNO
Curso: 8b
Alumno:
Vega, Ana
Situación:
regular 09/07/1972
Fecha
nacimiento:
Sexo: femenino
Curso: 7a
Situación: regular
"Situación" es un
item de datos ó
campo
A la ficha ó
tarjeta del alumno
se la denomina
"registro"
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Vega, Ana
Campo 1
Fecha
Nacimiento
Sexo
09/07/1972 femenino
Campo 2
Campo 3
Curso
7a
Campo 4
Situación
regular
Campo 5
Archivo de alumnos
Gomez, Mirian
Ver, Pablo
Vega, Ana
10/03/1972 femenino 6c
11/04/1972 masculino 7a
09/07/1972 femenino 7a
libre
regular
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
mueble, tarjetero, cajonera
ficha, tarjeta
item
letra, dígito numérico, símbolo
MAGNETICO
CDROM, disco rígido,
disquete, cinta
registro
campo
caracter
109
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
}
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Si número = modif entonces hacer:
{
Ingresar (restantes campos)
}
Fin Si
Grabar en (auxiliar) (número y restantes campos)
}
Fin Mientras
120
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
MENOS DE 50 mm.
50 mm. O MAS
: XX
: XX
: XX
2.- Perfeccionar el algoritmo anterior para que además informe:
- PORCENTAJES
SIN LLUVIA
MENOS DE 50 mm.
50 mm. O MAS
PRECIPITACIONES TOTALES
: XX
: XX
: XX
: 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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
REGISTRADA EL DIA
DEL MES
: XX
: XX
: XX
TEMPERATURA MAXIMA DEL AÑO
REGISTRADA EL DIA
DEL MES
: XX
: XX
: XX
MAXIMA AMPLITUD TERMICA
REGISTRADA EL DIA
DEL MES
: XX
: XX
: 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
MUJERES
MENORES DE 18 AÑOS QUE TRABAJAN
122
: XX
: XX
: XX
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
SOLTEROS : XX
CASADOS : XX
ENCUESTADOS QUE TRABAJAN Y ESTUDIAN
MUJERES QUE TRABAJAN
: XX
: 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
SUELDO BASICO
ANTIGUEDAD
APORTE JUBILATORIO
SALARIO POR ESPOSA
SALARIO POR HIJOS
NETO A COBRAR
:XX...
: XXXX
: XXXX
: XXXX
: XXXX
: XXXX
: 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
123
: XXXX
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
TOTAL SUELDOS
TOTAL APORTES
TOTAL SALARIOS
TOTAL A PAGAR
: XXXX
: XXXX
: XXXX
: XXXX
124
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Elemento
Indice
Segundo elemento del
arreglo nombre
nombre[2] <- "María"
Valor
0
Juan
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Elemento x[0,1]
Fila 0, columna 1
x[0,0]
x[0,1]
x[0,2]
x[0,3]
x[1,0]
x[1,1]
x[1,2]
x[1,3]
x[2,0]
x[2,1]
x[2,2]
x[2,3]
Arreglo x de
3 filas por cuatro
columnas
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
$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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
Fin Para
Si S = 0 entonces hacer:
{
Escribir("No hay plantas de tal altura")
}
Fin
Ejercitación en Lenguaje Perl
print "\naltura
$s=0;
:";$altura=<STDIN>;chop($altura);
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
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
V(1)
4
6
V(2)
V(3)
2
V(4)
Si se quieren ordenar de menor a mayor, el resultado deberá ser el siguiente
estado:
133
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
2
V(1)
4
5
6
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
V(2)
V(3)
4
5
6
2
I=1
4
5
6
2
I=2
4
5
2
6
I=3
V(1)
134
2
V(4)
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
{
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
}
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
V(1)
43
V(2)
11
V(3)
56
V(4)
21
V(5)
35
V(6)
33
V(7)
El primer paso será ordenarlo con algún método, con lo que quedará :
11
V(1)
21
V(2)
23
V(3)
33
V(4)
35
V(5)
43
V(6)
56
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
41
56
45
37
32
35
29
33
24
28
22
PROMEDIOS
(41 + 56 + 45) / 3 = 47.33
(56 + 45 + 37) / 3 = 46.00
(45 + 37 + 32) / 3 = 38.00
(37 + 32 + 35) / 3 = 34.66
(32 + 35 + 29) / 3 = 32.00
(35 + 29 + 33) / 3 = 32.33
(29 + 33 + 24) / 3 = 28.66
(33 + 24 + 28) / 3 = 28.33
(24 + 28 + 22) / 3 = 24.66
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
5
7
2
5
9
3
4
8
2
(41+56+45+37+32)/5=
(56+45+37+32+35)/5=
(45+37+32+35+29)/5=
(37+32+35+29+33)/5=
(32+35+29+33+24)/5=
(35+29+33+24+28)/5=
(29+33+24+28+22)/5=
42.20
41.00
35.60
33.20
30.60
29.80
27.20
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:
B=
A=
|
|
|
2
1
1
3
-2
1
-1 |
2 |
-3 |
| -1
| 3
| 2
2 |
-2 |
-1 |
| 5
| -3
| -4
-1 |
4 |
3 |
Obsérvese que el elemento (2,1) de C, que es -3, se calculó como:
1 * (-1) + (-2) * 3 + 2 * 2 =
145
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
200
150
800
300
170
--------1620
Porcentajes
200*100/1620 = 12.35 %
150*100/1620 = 9.26 %
800*100/1620 = 49.38 %
300*100/1620 = 18.52 %
170*100/1620 = 10.49 %
Preparar un programa a los efectos de ingresarle una secuencia de datos, y
146
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
1
2
3
4
40<=P<50
50<=P<60
60<=P<70
70<=P<80
TOTAL:
Frecuencia %
2
7
8
3
20
10
35
40
15
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
mediante:
de la curva, se calcula
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
150
Cuaderno de estudio "Metodología de la Programación"
UNLu - DCB
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
Descargar