Está en la página 1de 28

LA PROGRAMACIÓN COMO METODOLOGÍA

DE RESOLUCIÓN DE PROBLEMAS

1. Introducción
El proceso de programar siempre involucra la escritura de un texto llamado
PROGRAMA, el cual debe poder ser ejecutado por una computadora, pero hay que
tener cuidado de creer que la programación es sólo eso, programar es mucho más
complejo que la tarea de escribir dicho texto.
La parte de la programación que consiste en transcribir al lenguaje
correspondiente el método de solución elegido se llama "codificación" y debe
distinguirse del proceso previo de desarrollo del programa que se llama "diseño".
Una etapa fundamental de este proceso es el análisis del problema y la búsqueda
de un método eficiente de resolución. En este capítulo se va desarrollar una
metodología.

2. Objetivos Específicos de la Unidad


Que los estudiantes logren:
Ø Utilizar el método algorítmico y la abstracción en la resolución de problemas.
Ø Capacidad para diseñar e interpretar algoritmos.

3. Contenidos
Los contenidos que se presentarán en esta unidad son:
Ø Etapas en la solución de problemas.
Ø Concepto de algoritmo.
Ø Método Heurístico. Diseño de algoritmos.
Ø Programación Estructurada.
Ø Lenguaje de diseño de programa.
Ø Estructuras algorítmicas fundamentales.
Ø Generalización del concepto de procedimiento.

4. Actividad de los Docentes


Ø Definición de los conceptos fundamentales,
Ø Ejemplificación en áreas de interés. > Dirección de los alumnos en la resolución
de problemas
Etapas en la solución de problemas
En el presente capítulo se describirá la programación como aquella tarea que
permite transformar un problema dado, mediante algún método apropiado, de manera
que la solución del mismo quede expresada como un conjunto de comandos o
sentencias que puedan ser ejecutadas por una computadora.
Con el término proceso de programación se denominará a la tarea de programar,
este proceso involucra una secuencia de etapas a cumplir en el tiempo. Estas etapas
pueden describirse en términos de los siguientes pasos:
Descripción del problema.
Elección de un algoritmo para resolver el problema.
Diseño del algoritmo.
Codificación en un lenguaje que la computadora reconozca. (C++, PASCAL,
FORTRAN, VISUAL BASIC, JAVA y muchos otros).
Ingreso del código y ejecución del programa en una computadora.
Corrección, pruebas y optimización del programa.
Documentación y mantenimiento del programa.

Concepto de algoritmo
La palabra algoritmo se usa en homenaje al matemático UzbekoAl-Kuaritzmi quien
en el año 880 escribió un libro, en el que por primera vez se expresaban métodos
precisos para efectuar las cuatro operaciones básicas, que hoy en día se siguen
utilizando.
La etapa vital de la solución de un problema con una computadora es el diseño del
algoritmo y de la estructura fundamental de datos.
DEFINICIÓN
Un algoritmo es un conjunto finito de instrucciones que especifican una secuencia de
operaciones a realizar en orden para resolver un problema específico. En otras
palabras, un algoritmo es un método para la solución del problema.
Podemos distinguir cuatro propiedades principales: Secuencialidad, Ausencia de
Ambigüedad, Generalidad y Limitación.
Secuencialidad
Se debe especificar sin lugar a dudas la secuencia en la que se deben llevar a cabo
los pasos del algoritmo. Un algoritmo debe tener una instrucción inicial única y cada
instrucción debe tener un sucesor único para un dato de entrada dado. Las
instrucciones son llevadas a cabo de arriba hacia abajo, a menos que las mismas
especifiquen otra cosa.
Las entradas son las partidas de datos presentadas al algoritmo. Un algoritmo
puede tener o no entradas. Si las hay deben ser del tipo para el cual se ha diseñado
el algoritmo.
Las salidas son partidas de datos procesadas que son el resultado de la ejecución
de un programa basado en el algoritmo. Un algoritmo debe producir al menos una
salida.
Ausencia de Ambigüedad:
Un algoritmo debe ser definido, claro, preciso y no ambiguo. La representación de
cada paso de un algoritmo debe dar lugar a una sola interpretación posible.
Esta condición significa que cada vez que se presente para su ejecución un
algoritmo con los mismos datos de entrada, se obtendrán los mismos resultados.
Las instrucciones de un algoritmo deben ordenar a la computadora que solo lleve
a cabo tareas que sea capaz de hacer. Una computadora no puede efectuar una
instrucción si tiene información insuficiente o si el comando no está definido.
Generalidad
Un algoritmo se puede realizar para varios problemas que se relacionan entre sí. Un
algoritmo se aplica a un problema o clase de problemas específicos; el rango de las
entradas o dominio se tiene que definir previamente, ya que esté determina el alcance o
la generalidad del algoritmo.
Limitación
Un algoritmo es finito en tamaño y tiempo. La ejecución de un algoritmo programado
debe finalizar después de que se haya llevado a cabo una cantidad finita de operaciones.
El número de operaciones que se realizan en la ejecución de un algoritmo raramente
es igual al número de pasos en la descripción del algoritmo. La longitud del programa
no es un buen indicador del tiempo de ejecución.
Un ejemplo de problema para determinar claramente un algoritmo través de sus
cuatro propiedades principales, es el siguiente:
Exprese si el procedimiento dado para el siguiente problema:
a) Cumple con las propiedades que debe tener un algoritmo. Justifique su
respuesta.
b) Si el procedimiento no cumple con todas las propiedades, elabore el algoritmo
correspondiente.
Problema: "Obtener una determinada página de un libro"
Procedimiento:
Paso 1: Abrir el libro en la página 1.
Paso 2: Si la página que está examinando es la página 15 deténgase.
Paso 3: En caso contrario, observe la siguiente, pasando una hoja, si es necesario.
Paso 4: Repetir los pasos 2 y 3 tan a menudo como se requiera.
Respuesta
No es un algoritmo.
Justificación
Generalidad: No se verifica ya que sólo permite encontrar la página 15
Limitación: No se verifica, si el libro tiene menos de 15 páginas o no
existe esa hoja no se llega al fin
No ambigüedad: No se verifica, las frases "si es necesario" y "tan a menudo
como se requiera" no son claras y precisas.
Secuencialidad: el orden de los pasos es correcto, pero están ausentes
aquellos que llevarán a cumplir las propiedades anteriores.

Algoritmo:
Paso 1: Obtener el libro y la página que debe encontrarse (NPD: Número de Página
Deseado). Paso 2: Poner el libro en posición derecha.
Paso 3: Abrir el libro en cualquier página cercana a la parte central.
Paso 4: Si el número en la página izquierda es mayor que el NPD, pasar al Paso 9.
Paso 5: Si el número en la página izquíerda es igual a NPD, alto.
Paso 6: Si el número de la página derecha es igual a NPD, alto.
Paso 7: Pasar la Hoja de derecha a izquierda.
Paso 8: Si se ha llegado al fin del libro, la página no existe, de manera que hay que
hacer alto. Paso 9: Pasar la hoja de izquierda a derecha.
Paso 10: Si se ha llegado al extremo del libro, la página no existe. Alto. En caso
contrario, continuar con el paso 4.
Dominio de un Algoritmo
Si el algoritmo no es general dentro de alguna clase de problemas entonces es de
poca utilidad. Por lo tanto, un método para marcar el número telefónico 220234 casi no
tiene valor para nadie, mientras que un método para marcar cualquier número
podrá ser útil. Por supuesto, debe haber alguna restricción a la generalidad de un
algoritmo.
La clase o el conjunto de datos y las condiciones para las cuales un algoritmo trabaja
correctamente se llama dominio. Cuando se trata de resolver cualquier problema
es necesario definir el dominio del algoritmo y después verificar que trabaja para
todos los casos que se encuentran dentro de ese dominio. Es necesario incluir en
el dominio todas las situaciones similares, pero los casos remotos o poco probables se
pueden omitir.
Errores en la Construcción de un Algoritmo
En los algoritmos se pueden presentar dos tipos de errores:

i. Errores de Dominio
Se presentan cuando no se han especificado todas las situaciones que se pueden
presentar en la práctica o se ha descuidado la apreciación de su importancia. Las
pruebas más difíciles son aquellas que verifican que se ha seleccionado un dominio
correcto para el algoritmo. A medida que el problema se presenta, se tiene que
clasificar y hay tres opciones:
a) Ignorarlo porque es improbable y quizás nunca ocurra.
b) Restringir el domínio del algoritmo para excluirlo.
c) Corregir el algoritmo.

ii. Errores de Lógica


Son aquellos errores que se detectan, después de que se ha definido en forma
adecuada el dominio de un algoritmo, en la etapa de prueba o verificación. Se deben
principalmente a las siguientes causas:
a) Etapas incorrectas
b) Secuencia incorrecta de etapas.
El criterio de elección de un algoritmo debe hacerse en base a criterios tales
como:
- Que el algoritmo sea simple, es decir fácil de entender y de escribir.
- Que el algoritmo sea eficiente.
Un algoritmo simple se traducirá en programas que serán fáciles de seguir y corregir.
En cambio, un algoritmo eficiente hará un buen uso de los recursos de memoria y del
tiempo de procesamiento. Desafortunadamente estos criterios, en general, suelen ir
en sentidos opuestos pues los programas eficientes suelen basarse en algoritmos
complejos.

Método Heurístico
Heurística1
La heurística proporciona un esquema o plan para abordar los problemas poco
conocidos, mejora la capacidad de crear soluciones y asegura que el método que se va
usar sea eficiente.
En la etapa de planeación es donde se tiene oportunidad de comparar métodos y
seleccionar el más adecuado.
La necesidad de la heurística, de la planificación, se hace más evidente a medida
que se gana más experiencia. Al principio el nivel de capacidad probablemente será
bajo y aun los problemas más simples requerirán de consideración cuidadosa. Luego, a
medida que aumenta la experiencia y el conocimiento, aumentará la capacidad de
desarrollar soluciones más y más complejas sin tener que recurrir a la planeación
detallada. Sin embargo, siempre habrá un patrón de problema en el cual las
soluciones no se encuentren con facilidad y una vez más tendrá que recurrir a la
heurística.
Entendido el concepto de algoritmo surge la pregunta ¿Cómo se pueden resolver
los problemas para los que no hay un método establecido o para los cuales no
conocemos un algoritmo?.
El método heurístico2 consta de las siguientes etapas:

A- Conciencia
Todos tenemos alguna capacidad para resolver los problemas en forma creativa. A las
personas que resuelven con éxito los problemas le es difícil aceptar la necesidad de la
heurística, ya que consideran que saben lo suficiente; sin embargo pocas de ellas
tendrán un éxito completo y no habrá ninguna posibilidad de mejorar. Por otra parte, los
que se consideran ineptos para manejar problemas que no conocen bien tenderán a
evitar las situaciones difíciles y, por tanto, no podrán descubrir los progresos posibles.
Entonces, como primer paso para mejorar nuestras aptitudes, es necesario estar
conscientes de ellas y saber controlar las habilidades.
Esto conduce al meollo de todos los métodos heurísticos:
Debo estar consciente de lo que estoy haciendo.
Es necesario reconocer deliberadamente cada paso que se tome en la solución de un
problema. Desde el principio se debe adoptar una actitud receptiva. Todas las
propuestas deben considerarse sin importar qué tan obvias o imposibles aparezcan. En
esta forma se creará una conciencia y nuevas soluciones pueden aparecer. Para obtener
algún beneficio de este método es necesario aceptar en forma tentativa todas las ideas
que se presenten.

Es mejor rechazar una idea conscientemente


que estar de acuerdo con ella sin haberla analizado.

B- Definición
La definición de un problema implica la formulación de tres preguntas:
i. ¿Qué resultados se deben obtener?
ii. ¿Qué datos se nos proporciona?
iii. ¿Qué condiciones relacionan los datos con los resultados? ¿Son satisfactorias
estas condiciones (es decir, aseguran que se obtendrán resultados correctos para
todos los datos)?
1
La palabra proviene del griego "heurisko", que significa "yo encuentro”
2
Es un sistema de educación en el cual se entrena al alumno para descubrir las cosas por sí mismo. Se incita a
comprender, a encontrar razones, se da al alumno la oportunidad de descubrir fundamentaciones
Se recomienda realizar las siguientes actividades en esta etapa:
a) Especifique con precisión qué resultados se quieren. Si los resultados van a
tener un uso práctico los datos originales se deben incluir en los resultados
finales.
b) Defina todos los datos en forma precisa. Examine las especificaciones de los
mismos y encuentre cuántos tipos de datos hay. ¿Puede variar éste número?
¿Hay alguna restricción en el tipo de datos?
c) Asegúrese de que no omite condiciones y de que comprende perfectamente los
términos que se utilizan para relacionar los datos y los resultados.
d) A menudo no se pueden establecer correctamente las condiciones hasta que se
analiza más detalladamente el problema. Sin embargo, es posible tener un
conocimiento intuitivo de las condiciones y más adelante se puede revisar esta
definición en función de la experiencia posterior.
e) Trate de introducir una notación adecuada para los datos y resultados,
mediante la cual se puedan expresar las condiciones en forma más clara y
concisa.
Es probable que al tratar de desarrollar una solución, se encuentren fallas en esta
definición y las preguntas se tengan que volver a establecer. Siempre se debe
considerar que una definición preliminar es tentativa. No debe cambiarse sin una razón
positiva y hasta entonces es necesario apegarse estrictamente a ella.

C- Cómo Adquirir Experiencia


En este caso es muy útil el pensamiento creativo. Se puede enfocar en la siguiente
forma:
a) ¿Puedo resolver el problema manualmente? Si es así, ¿Qué hice?. Anótelo.
b) ¿Puedo derivar otra forma de resolverlo manualmente, basándome en las
soluciones obtenidas? Escriba el método.
c) Estudie los componentes individuales del problema y los componentes de sus
soluciones (si tiene alguna). ¿Qué sabe acerca de cada parte y de sus
relaciones con los demás?
d) ¿Puede ver el problema desde otro punto de vista y quizás desarrollar un
nuevo método de resolución? Si es así, escríbalo.
Por ahora no debe intentar hacer la selección del mejor método de resolución del
problema; estudie otros métodos tratando de comprender los procesos que intervienen.
Después juzgará los méritos de las distintas técnicas.
Hay dos aspectos distintos en el trabajo. Las primeras tres preguntas se relacionan
con el trabajo controlado; destruir las cosas y tratar de reconstruirlas. En este caso,
apenas se sabe lo que se debe hacer y es necesario estudiar más a fondo el proceso. La
pregunta C(d) se refiere al otro tipo de trabajo, al no controlado en el cual se buscan
asociaciones casuales que se ajusten a un determinado patrón y conduzcan a una
posible solución.
En los problemas de computación el más útil es el trabajo controlado, que es básico
de todos los casos prácticos que se estudian en este curso.
Este trabajo controlado siempre debe basarse en la resolución manual del problema,
tratando posteriormente de convertir este proceso en un algoritmo útil. Por supuesto,
no es posible resolver todo el problema en forma manual; si lo fuera, no habría
necesidad alguna de elaborar un programa de computadora. Sin embargo, casi siempre
habrá bastante repetición y es posible aislar y examinar el proceso central.
El refinamiento y la evaluación crítica de los métodos se deben retrasar tanto como
sea posible, a menos que haya una razón obvia para proceder a un estudio más
detallado.
Por último, el proceso es personal porque varias decisiones, en realidad el enfoque
total del problema, se basa en la experiencia previa; es posible que en su primer intento
usted haya derivado una solución totalmente distinta.

D- ¿Entiendo el problema? ¿Sé como resolverlo?

(1) Sí
Si usted cree que comprende un problema, el siguiente paso es verificar que está en
lo cierto.
a) ¿He resuelto el problema o uno similar?
b) Estudie las condiciones. ¿Se satisfacen todas?
c) Estudie las condiciones. ¿Ha supuesto condiciones que no existen?. Cuando se
aproxima al éxito, la persona dice: "¡Entiendo el problema!" y procede a
desarrollar un algoritmo, pero a menudo está equivocada. Es necesario
comparar la solución propuesta y los pasos mediante los cuales se obtuvo con
la definición original, para ver si hay discrepancias entre ellas. Por lo general,
las fallas se presentan por imponer condiciones incorrectas, pero también se
deben verificar los datos y los resultados esperados.
La habilidad para seleccionar un buen método depende principalmente de la
experiencia previa, pero se puede indicar una guía importante:
d) Seleccione el procedimiento más sencillo y claro, el que tenga menos sutilezas
La eficiencia de un algoritmo (su rapidez de ejecución) es de gran importancia
y a menudo se utiliza como el criterio básico para seleccionar un método. No
obstante, es mejor buscar y desarrollar el algoritmo que sea más eficiente
desde el punto de vista del que lo resuelve, es decir, la solución que se pueda
convertir en algoritmo con el menor esfuerzo.

(2) No
Además de resolver un problema equivocado, se pueden presentar otros obstáculos.
Quizás la definición del problema es demasiado vaga o que no se haya podido resolver
bien en forma manual. Casi siempre se presentan estas dificultades y se deben a que no
se invierte suficiente esfuerzo en las primeras fases para poder obtener experiencia.
a) ¿Qué es lo que impide resolver el problema?
Primero, es esencial revisar con todo cuidado lo que se ha hecho, comparando
el trabajo realizado con la definición del problema. De este modo sería fácil
retroceder y determinar que cambios son necesarios y, al mismo tiempo,
examinar porque se introdujo este error, para evitar la misma situación en el
futuro. Es obvio que la pregunta C(a) no se ha contestado adecuadamente, ya
que se ha resuelto un problema distinto al que se propuso. 'Si no se ha resuelto
el problema propuesto, es necesario estudiarlo más a fondo.
b) ¿Se puede encontrar un problema del mismo tipo que sea más sencillo?
c) ¿Se ha visto con anterioridad el problema en una forma distinta?
d) ¿Se conoce un problema relacionado o análogo?

Estas preguntas conducirán a un nuevo problema relacionado con el original, que


quizá sea más fácil de resolver.
Cada problema sucesivo es un subproblema del problema anterior. Cuando se ha
definido el nuevo problema, el siguiente paso consiste en tratar de resolverlo. Después
de hacerlo, se considera de nuevo el problema anterior y otra vez se trata de obtener
una solución, y así sucesivamente.
Este es el proceso que se representa en la siguiente figura:
Ahora es posible responder "sí" a la pregunta " ¿comprende el problema C?, aunque
no entienda
los problemas A ni B.

E- Análisis: Segmentación
¿Es posible dividir el método de solución propuesto en varios segmentos lógicos? Si
es así, hágalo. Trate cada segmento o módulo como un problema distinto.
Esta división sólo se puede hacer cuando se está seguro de que los subproblemas son
independientes entre sí. El propósito de esta simplificación es permitir una mayor
concentración de atención en el problema.

Diseño de algoritmos
A continuación expondremos un método eurístico para diseñar algoritmos
denominado DIVIDE AND CONQUER, el cual es una técnica TOP-DOWN. Este
método permite implementar la segmentación, descomposición de un problema largo y
complejo en subproblemas independientes más pequeños y fáciles de resolver que el
problema de partida.
En resumen, la técnica consiste en varias etapas:

a) Descomposición del problema de partida en subproblemas


independientes y determinación de las relaciones entre ellos.

b) Resolución de cada subproblema, si es un subproblema "grande", por


descomposición, y continuando hasta que resulten de la descomposición
subproblemas fácilmente resolubles.

c) Composición de las soluciones de los subproblemas para lograr la


solución final al problema planteado.

El diseño del algoritmo que resuelve un problema, realizado con esta técnica recibe
el nombre de diseño descendente y resulta en algoritmos muy legibles, claros, fáciles
de entender, seguir y corregir.
El diseño de un algoritmo no se hace de una sola vez, sino que se va resolviendo en
una secuencia de pasos (llamados pasos de refinamiento).
En cada paso el problema es refinado agregando detalles significativos, por lo que el
método se conoce como Método de los Refinamientos Sucesivos.
Ejemplo:
Un ingeniero es convocado para construir un edificio:

un subproblema sería

otro subproblema:

un tercer subproblema:

Al utilizar el refinamiento por pasos el diseñador de un algoritmo debe saber donde


detenerse, es decir, debe saber cuando un paso específico del algoritmo es lo
suficientemente claro para no necesitar mas refinamiento (acciones triviales).
Se necesita conocer las capacidades de un procesador no sólo para terminar los
refinamientos, sino para dirigir la forma en que el refinamiento avanza.
Una computadora puede interpretar cualquier cosa expresada de manera adecuada
en un lenguaje de programación. Así, el diseñador de un algoritmo de computadora
puede orientar los pasos y la terminación del refinamiento hacia el tipo de lenguaje de
que trate.
Programación estructurada
Los principios metodológicos básicos de la programación estructurada son los de
subdividir el problema inicial o de partida en partes manejables para su análisis y hacer
de esta manera que se agilice el proceso de entender el problema y su solución.
Básicamente, estas subdivisiones deseadas (llamadas módulos) deben satisfacer los
siguientes requisitos:
a. Los módulos deben estar jerarquizados.
b. Deben ser pequeños y sencillos.
c. Deben esconderle detalles poco importantes a módulos de mayor
jerarquía.
d. Se deberán usar tantos módulos de menor jerarquía como sea necesario
para cumplir con la restricción de ser pequeños y sencillos.
e. Se deberán usar las estructuras de control y de datos adecuadas para
cumplir con el requisito de ser pequeños y sencillos.
f. Los módulos deben ser legibles para cualquier persona aunque tenga
solamente conocimientos elementales de programación.

Lenguaje de Diseño de Programas


Como la meta es escribir algoritmos que sean procesados en una computadora, se va
a introducir un lenguaje de diseño adecuado. Se llamará Lenguaje de Descripción
de Programas (LDP) a la herramienta que permitirá diseñar programas antes de
codificarlos.
Este pseudo lenguaje tiene las siguientes características:
a. Permite expresar de una manera informal las estructuras de programación.
b. Permite expresar las ideas en frases del lenguaje propio o natural
c. Es similar a un lenguaje de programación pero no está ligado a ninguna
regla formal de sintaxis como aquellos.
d. No es un lenguaje compilable.
e. Por convención se hace un sangrado en el texto que ayuda a la percepción
visual de la lógica del diseño.
f. Permite expresar diseños de fácil comprensión que podrán convertirse sin
dificultad a código en el lenguaje de implementación.
g. El pseudo-código generado es más fácil de cambiar y corregir que el código
del programa.
A fin de formalizar el lenguaje de diseño de algoritmos, es importante definir los
siguientes conceptos:
Una "acción A" es un evento que es llevado a cabo por el ejecutante en un lapso de
tiempo finito, produciendo un resultado definido y previsible.
Un "proceso" es un conjunto de acciones Al ; A2 ; ...Ai ;... organizadas en el tiempo
con efecto acumulativo.
"Estado de un proceso" es el conjunto de resultados o valores intermedios
observables en un instante de tiempo dado, al cabo del cual se desarrollaron cierto
número de acciones. Así, en el proceso completo que resuelve un problema, los
datos serán el estado en el instante inicial y los resultados el estado en el
instante final.
Los "objetos" del universo del problema tienen un "nombre" que los identifica
sin ambigüedad, además tienen un "tipo" asociado que indica características comunes a
todos los estados posibles del objeto. Otra característica de los objetos es su "valor",
el que puede cambiar luego de una acción.
Una "variable" es un objeto cuyo valor puede variar y que posee dos atributos:
un nombre y un tipo que describe su uso y el rango de valores que puede tomar.
Una "constante" es un objeto cuyo valor no cambia en el tiempo.
Para "asignar" a una variable un valor se usará la notación:
var  v
Donde var es el nombre de la variable a la que el procesador asigna el valor.
Un "procedimiento" (abstracción procedural) produce una acción definida y se usa
como una caja negra que se resuelve en etapas posteriores.

Estructuras algorítmicas fundamentales


Mostraremos a continuación cuáles son las herramientas existentes para la
construcción de programas.
Como la programación es una actividad disciplinada que nos exige en todo
momento una gran cohesión con las actividades mentales tendientes a describir
adecuadamente el problema que queremos modelar, presentamos las tres
estructuras básicas o fundamentales de la programación estructurada:

 Secuenciación:
Descripción de una acción que se lleva a cabo luego de otra y así sucesivamente. De
allí el nombre de secuencia. Usando el lenguaje de descripción de problemas (LDP), se
describe de la siguiente manera:

Al; A2; A3; …

 Selección:
Esta estructura permite tomar decisiones sencillas ya que permite evaluar, en
tiempo de ejecución, una condición lógica (booleana) para decidir cuál de dos
caminos escoger a continuación, ya que esta condición puede tomar solo uno de dos
valores: Verdadero (True) o Falso (False). Desde el LDP se usa la forma:

SI condición ENTONCES
Al
SINO
A2
FIN SI

 Iteración:
Es la última construcción primitiva definida como estructura algorítmica
fundamental. Luego de evaluar una condición lógica, si la misma es verdadera ejecutará
la acción y continuará haciéndolo mientras la condición siga siendo verdadera. Es claro
que el lazo terminará cuando la condición se haga falsa. Más aún, si es falsa de entrada,
el lazo no se ejecutará nunca. En el LDP, se usa la forma:
MIENTRAS condición HACER
Al
FIN MIENTRAS

Reglas de formación de programas bien construidos


En base a estas tres estructuras algorítmicas fundamentales, se pueden enunciar las
siguientes reglas de formación de programas bien construidos (en algunos textos
recibe el nombre de Teorema Fundamental de la Programación Estructurada).
a. Una acción trivial Al es un programa bien construido (p.b.c.)
b. Si las acciones A 1 ,A2, ...,An son p.b.c. entonces la secuencia Al; A2; ...; An es
un p.b.c
c. Si Al y A2 son p.b.c. entonces la selección de la forma
SI condición ENTONCES
Al
SINO
A2
FIN SI es un p.b.c.

d. Si Al es un p.b.c. entonces la iteración de la forma


MIENTRAS condición HACER
Al
FIN MIENTRAS es un p.b.c.

e. Regla de clausura:
Solamente los programas formados por aplicaciones de las cuatro reglas
precedentes son programas bien construidos.
Partiendo de estas ideas, podemos agregar nuevas estructuras muy utilizadas para
programar, construidas a partir de las estructuras básicas ya presentadas.
Se introducen como definiciones.

 Selección
Caso en que A2 sea un acción nula o vacía
SI condición ENTONCES
Al
FIN SI
SEGUN exp
 conjunto de valores1: Al;
 conjunto de valores2: A2;

 conjunto de valoresn: An;
SINO
: An+1;
FIN SEGUN

 Iteración Condicional
A este tipo de iteración se la conoce como bucle tipo mientras:
REPETIR
Al
HASTA QUE condición
que equivale a:
Al;
MIENTRAS NO condición HACER
Al
FIN MIENTRAS

 Iteración no condicional
A este tipo de iteración se la conoce como ciclo FOR NEXT
HACER n 'VECES (para i de 1 a n)
Al
FIN
que equivale a:
i  1;
MIENTRAS i < n HACER
Al;
i  i+1
FIN MIENTRAS
Formas de reducción de complejidad
Las estructuras algorítmicas fundamentales, base del lenguaje de diseño LDP,
permiten realizar un análisis descendente del problema y diseñar una solución por
refinamientos sucesivos, usando las tres formas de tratamiento siguientes:

 Secuenciación
La secuenciación consiste en la descomposición del problema en una secuencia de
acciones intermedias.
Al;
A2;

An ;
donde A1, A2, … son acciones "elementales o triviales" o son acciones que necesitan
a su vez una descomposición. Se dice entonces que el algoritmo se ha secuenciado
en acciones o pasos donde:
i. Las acciones se ejecutan de a una a la vez.
ii. Cada paso se ejecuta una sola vez, ninguno se repite, ninguno se omite.
iii. Las acciones se ejecutan en el mismo orden en el que están escritas.
iv. La terminación del último paso implica la terminación de la secuencia.

Ejemplo: Dado un número n, que representa un lapso de tiempo medido en


segundos, calcular su equivalente en número de días, horas, minutos y segundos.

Algoritmo: transformar
Datos: n número entero positivo
Salida: d,h,m,s números enteros positivos
Variables: rd,rh de tipo entero

Un primer nivel de diseño consiste en una SECUENCIA de 4 acciones


Al. LEER(n);
A2 convertir;
A3 ESCRIBIR(d,h,m,$);
A4 Parar

LEER y ESCRIBIR son procedimientos que permiten leer datos y escribir


resultados respectivamente. Se consideran acciones triviales, a nivel de diseño no
se refinan.
El subproblema convertir, representado por la acción A2 constituye un nuevo
TOP y es susceptible de una nueva descomposición.
Sabiendo que: 1 min = 60 seg, 1 hora = 3600 seg, 1 día = 86400 seg, la acción
A2 se refina como una SECUENCIA de 6 acciones

A2 convertir
A2.1. d  n/86400;
A2.2. rd  RESTO(n,86400);
A2.3. h  rd/3600;
A2.4. rh  RESTO(rd,3600);
A2.5. m  rh/60;
A2.6. s  RESTO(rh,60);

donde el símbolo / corresponde a la operación cociente aplicada a números enteros.


RESTO(a,b) es un procedimiento que calcula el resto del cociente entero entre
dos valores y b , que puede ser considerada en el diseño como una acción trivial.
Las acciones A21, A22,… , A26 pueden considerarse como acciones triviales.
La solución final del problema se obtiene mediante una "composición" secuencial
de las acciones en que el diseño original fue descompuesto.

 Análisis por Casos


El análisis por casos es otra técnica para reducirla complejidad de un problema.
El mismo se basa en la partición del dominio de los datos en subdominios.
Es decir que los subproblemas surgen a partir de la división en subdominios del
dominio de datos del problema original. La solución final del problema se compone ya
no de una manera secuencial como en el caso anterior, sino de una manera
condicional.
El lenguaje LDP provee tres formas de expresar la composición condicional, de
acuerdo a la forma en que se realice la división del dominio de datos. Ellas son:

i. Condición Excepcional
En la condición excepcional se evalúa el cumplimiento de una condición para
determinar si una acción particular debe ejecutarse o no.
La forma de expresar la misma es:
SI condición ENTONCES
A
FIN SI
donde "condición" especifica la circunstancia bajo la cual la acción A debe ejecutarse.
El procesador debe ser capaz de evaluar la veracidad o falsedad de las condiciones
de la misma manera que es capaz de realizar acciones.
El lenguaje algorítmico debe por lo tanto permitir expresar estas condiciones y más
aún, debe permitir refinar las mismas hasta que sean lo suficientemente detalladas y
precisas como para ser interpretadas.

Ejemplo:
SI b ≠ 0 ENTONCES
cociente  a / b;
FIN SI
En este ejemplo, desde el punto de vista de la subdivisión del dominio de datos en
subdominios, de todos los valores posibles de b sólo interesan aquellos valores
distintos de cero.
O sea que se ha excluido el caso b = O.

ii. Descomposición en dos Subdominios Excluyentes


En este caso el conjunto dominio de los datos se subdivide en dos subdominios
excluyentes. Esta forma de selección evalúa una condición para determinar cual de
dos acciones alternativas (Al o A2) debe ejecutarse.
SI condición ENTONCES
Al
SINO
A2
FIN SI

Ejemplo :
SI x < Z ENTONCES
min  x
SINO
min  Z
En este ejemplo se ha dividido el conjunto de valores posibles de x en dos casos, los
valores de x que son menores que Z, y los que no lo son. Las acciones Al y A2 se
ejecutan de una manera excluyente de acuerdo al subintervalo al que pertenezca el
valor particular con el cual se instancie x.

Ejemplo: Calcular el valor absoluto de un x R, dado como dato.

Algoritmo: valorabs;
Datos: x: número real;
Salida: val: número real no negativo;
v1. LEER(x);
v2. SI x < 0 ENTONCES
v3. val  -x
SINO
X
FIN SI
v3 ESCRIBIR(val);
v4 Parar.

iii. Descomposición en Varios Subdominios Excluyentes


En este caso el conjunto dominio se divide en un número n > 2 de subdominios.
Esta forma de selección permite explicitar el análisis de casos por enumeración de
todos los casos posibles.
SEGUN exp
conjunto de valores1: Al;
conjunto de valores2: A2;
conjunto de valores3: A3;


SINO : An;
FIN SEGUN

En función de los valores del dominio, se determina cuál de las condiciones es la


verdadera y se ejecuta solamente la acción correspondiente.
Ejemplo:
SEGUN antigüedad
0 < antigüedad < 1: sueldo  básico;
1 < antigüedad < 5: sueldo  1.1 * básico;
5 < antigüedad < 10: sueldo  1.5 * básico;
10 < antigüedad < 20: sueldo  2.0 * básico;
SINO : sueldo  2.3 * básico;
FIN SI

En este ejemplo se ha subdividido el dominio del dato antigüedad en cinco


subdominios excluyentes entre sí. El valor que se asigne a la variable sueldo
dependerá a cual de los cinco subdominios pertenezca el valor instanciado de
antigüedad.

Puede ocurrir que alguna de las acciones a realizarse sea a su vez un análisis por
caso, como el ejemplo siguiente:

EJERCICIO
Escriba un algoritmo que lea la identificación numérica de un alumno y sus notas en tres parciales de
una materia. A partir de ellas, su algoritmo debe determinar si el alumno ha promocionado o
regularizado la materia de acuerdo a los siguientes criterios:
• Promociona: Si ha aprobado todos los parciales con 7 o más.
• Regulariza: Si no ha sido aplazado en ningún parcial.

Algoritmo: calificación;
Datos: ident, nl,n2,n3: enteros no negativos;
Salida: id: entero no negativo, condición: texto;

C1. LEER(id, n1 ,n2 ,n3 );


c2. Analiza-condición;
c3. ESCRIBIR(id, condición);
c4. Parar.
C2 Analiza-condición
SI (n1  7) y (n2  7) y (n3  7) ENTONCES
Condición  "Promociona"
SINO
SI (n1  4) y (n2  4) y (n3  4) ENTONCES
Condición  "Regulariza"
SINO
condición  "No Regulariza"
FIN SI
FIN SI

 Análisis Iterativo
Con frecuencia suele ocurrir que el programador se enfrenta a un problema en el
cual el mismo tratamiento se debe aplicar a un gran número de objetos.
Suele ocurrir que el número de estos objetos no es fijo o no se conoce de
antemano.
El tratamiento iterativo se aplica a las denominadas "secuencias de objetos".
Una secuencia de objetos es:
Ø La secuencia vacía
Ø Una secuencia a la que se le agrega un objeto.
Ø Una secuencia no vacía a la que se le quita un objeto.
La secuencia de objetos puede tener un número fijo de objetos o estar terminada por
un elemento de características fácilmente distinguibles del resto de los objetos y que se
designa como marca final.
Esquemáticamente, se puede ver a una secuencia con marca como:
obj1 obj2 obj3 objn MF
La característica fundamental del tratamiento de secuencias es que los elementos se
acceden de a uno por vez en un orden estricto.
Al tratar una secuencia existen diferentes "estados", se pueden considerar los
siguientes estados en el tratamiento iterativo:
Estado inicial = e0
Estados intermedios = e1,e2,...,en 1
Estado final = en
En el estado inicial e0, se está sobre el primer elemento de la secuencia
y el tratamiento aún no se ha aplicado.
En el estado el, se está sobre el segundo elemento de la secuencia y el
tratamiento ya se aplicó al primer elemento.
En el estado ek se está sobre el (k+l)-ésimo elemento de la secuencia y
el tratamiento se aplicó en los k primeros elementos.
En el estado final se está sobre la marca final y el tratamiento se aplicó
a todos los objetos de la secuencia.

Las estructuras iterativas provistas por el lenguaje LDP que serán usadas como
herramientas para la construcción de algoritmos iterativos son:
Iteración Condicional:
MIENTRAS condición REPETIR
A; A
FIN MIENTRAS HASTA QUE condición;

Iteración de un Número Fijo de Veces:


HACER n VECES
A;

PARA i  ValIni HASTA ValFinal HACER


A
FIN PARA;
Se desarrollan a continuación ejercicios donde se pone de manifiesto las distintas
formas del tratamiento iterativo
Ejemplo 1:
Escribir un algoritmo en lenguaje LDP que le permita calcular la n-ésima potencia de un número x.
Como se trata de una forma simple de iteración en la cual el número de
repeticiones se conoce de antemano se usa la forma HACER
Algoritmo: pot;
Datos: x: número real , n: entero positivo;
Salida: p: número real ;
pl. LEER(x,n);
p2. p  1;
p3. HACER n VECES
p <- p*x;
p4. ESCRIBIR(p);
p5. Parar

Ejemplo 2:
Dado un conjunto de números que corresponden a un registro de velocidades tomadas en ruta en un
fin de semana.
Debe Ud. controlar el número de vehículos que superaron la velocidad máxima permitida de 100
km/hr. El fin de los datos se indica con un valor 1000 (marca final).
Por ejemplo si la secuencia tratada fuese: "90 120 100 80 115 130 90 120 1000", el resultado
sería 4. Nótese que la MF no forma parte de la secuencia y que una vez que la MF ha sido
alcanzada, la acción LEER no puede realizarse más.

Algoritmo: control;
Datos: secuencia de números reales >0 (vel) con marca final (MF
= "-1 ");
Salida: cont: entero no negativo
L1. LEER(vel);
L2. Contar-excesos;
L3. ESCRIBIR(cont);
L4. Parar

La acción L2. Contar excesos; será un proceso iterativo en el cual el mismo


tratamiento debe ser aplicado a cada elemento de la secuencia. Se da a continuación
dos versiones distintas del refinamiento de esta acción

L2. Contar-excesos (versión 1)


L2.1 cont  0;
L2.2 MIENTRAS vel  MF
SI vel > 100 ENTONCES
cont  cont + 1
FIN SI
LEER(x,n);
L2. Contar-excesos (versión 2)
L2.1 cont  0;
L2.2 REPETIR
SI vel>100 ENTONCES
cont  cont+1
FIN SI
LEER(x,n);

HASTA QUE vel = MF;

La diferencia entre estas versiones de la acción contar-excesos, es que la versión 1


contempla correctamente la SECUENCIA VACIA, es decir aquella formada
solamente por la MF, que por definición tiene largo cero. La versión 2 no contempla
apropiadamente esta situación, por lo tanto antes de aplicarla se debe estar seguro de
que la secuencia tiene al menos un elemento.
Observando ambas soluciones, se ven los siguientes estados del tratamiento
iterativo:
Estado inicial (e0) en el cual el número de caracteres tratados es cero.
Estados intermedios (e1,e2,...,en 1) en los cuales han sido tratados todos los
caracteres que preceden al carácter corriente. En estos estados se cumple la
condición de continuación de la iteación cc  MF.
Estado final (en), en el cual el tratamiento ya se aplicó a todos los elementos de
la secuencia, además cc = MF, es decir que se cumple la condición de terminación
de la iteración.

Diagramas de flujo
Un diagrama de flujo ("flowchart") es otra técnica de diseño de algoritmos. Consiste
en una serie de símbolos que denotan acciones, decisiones o procedimientos que se
unen mediante flechas y conectores.
Esta representación nos ayudará a conocer la información que tenemos, donde la
tenemos, qué debemos hacer con ella y cómo presentarla. Debe tener las cualidades de
sencillez, claridad y normalización en su diseño.
Veamos a continuación algunos ejemplos de uso:

Ejemplo 1: Diseñar un algoritmo que calcule el mayor de 3 números.

Pseudocodigo Diagrama
LEER(A ,B,C)
SI A > B ENTONCES
Verdadero
SI A > C ENTONCES
ESCRIBIR(A) Falso
SINO Decisión
ESCRIBIR(C) Lógica
FIN SI anidada
SINO
SI B > C ENTONCES
ESCRIBIR(B)
SINO
ESCRIBIR(C)
FIN SI
FIN SI
FIN

Ejemplo 2: Diseñar un algoritmo que sume e imprima la serie 3,6,9,12, … 99.

Pseudocodigo Diagrama

N  0
Ciclo
MIENTRAS N < 99
Repetitivo
N  N + 3 (Bucle)
ESCRIBIR (N)
bucle
FIN MIENTRAS Cuerpo del
FIN

Testeador

Ejemplo 3: Sumar los números pares comprendidos entre 2 y 100.


Otra representación usual de los diagramas de flujo es la siguiente:

Algoritmo Inicio
1. Hacer S igual a 0
2. Hacer N iguala 0 S=0
3. Sumar N a S N=2
4. Sumar 2 a N
5. Si N es menor o igual a 100 ir al paso 3
6. Imprimir el resultado S = S+N
7. Finalizar N = N+2


Pseudocódigo: N<100

no

Fin
S  0
N  2
MIENTRAS N < 1OO
S  S+N
N  N+2
FIN MIENTRAS
ESCRIBIR (S)
FIN

Pregunta: la serie incluirá el valor 100? ;


Generalización del concepto de procedimiento
Considerar el siguiente problema:
Dado un número entero positivo, calcular e imprimir el factorial de ese número.
Algoritmo: Factorial;
Datos: m: entero no negativo;
Salida: f: entero positivo;
Variables: i: entero positivo;

fl. LEER(m); donde


f2. Calcular-f; f2. Calcular-f
f3. ESCRIBIR(f); f2.1. f  1;
f4. Parar; f2.2. i  1;
f2.3. HACER m VECES
f  f*i;
i  i+l;

Variables:

Suponga que se quiere resolver ahora el siguiente problema:


Encontrar el número de combinaciones de n elementos tomados de k en n, con la

n n!
C  
 k  k! n  k!
fórmula:
La acción f2 del ejemplo anterior sólo calcula el factorial de un número designado
con m, sería conveniente poder generalizarla de manera que la misma se use para
calcular cada uno de los factoriales necesarios en esta situación.
En efecto, puede pensarse en una solución general, designando la acción f2 como
fac(n) de manera que sirva para calcular el factorial de cualquier entero.

f2. fac(n)
Argumento: n: entero no negativo;
Resultado: entero positivo;
Variables: f,i: enteros positivos
f2.1. f  1;
f2.2. i  1;
f2.3. HACER n VECES
f  f*i;
i  i+l;
f2.4. fac f;

En el momento de escribir este procedimiento, fac(n), se ha hecho una


ABSTRACCIÓN del particular valor de n para el cual quiere calcularse el factorial; el
mismo se concretará en el momento en que el procedimiento se INSTANCIE para algún
entero en particular.
Esto no es otra cosa que la idea misma de PARAMETRIZACION, así fac(n) designa un
PROCEDIMIENTO PARAMETRIZADO.
Usando esta idea, el algoritmo para resolver el problema planteado puede ser:
Algoritmo: combinación;
Datos: n. k: enteros positivos
Salida: c: entero positivo
c1. LEER(n,k):
c2. c  fac(n)/(fac(k)*fac(n-k));
c3. ESCRIBIR(c);

En un nivel alto de abstracción se puede pensar en fac(n) como una


GENERALIZACIÓN del concepto de acción, es decir que se puede interpretar a este
procedimiento parametrizados como una ACCIÓN PARAMETRIZADA .
En general, parametrizar una acción es hacer una abstracción de los valores
particulares de los objetos sobre los cuales se realiza la misma.
Al realizar el diseño de un algoritmo, en el momento previo a refinar cualquier
acción, se puede también hacer una abstracción de COMO se realizan las
computaciones dentro de la acción que va a refinarse. Así se puede comenzar a
ver a los procedimientos parametrizados como MÓDULOS que permiten el
ocultamiento de detalles (cajas negras) y que sólo se comunican a través de sus
parámetros.
Considerando otro ejemplo, se quiere clasificar tres enteros diferentes entre sí, de
mayor a menor, se podría expresar este algoritmo como acción parametrizada:
Clasificar(a,b,c ; x,y,z).
La definición del tipo de los parámetros a,b,c,x,y,z debe darse al refinar la
acción.
Lo importante es saber que esta acción recibe como PARAMETRÓS DE
ENTRADA. tres valores que se identifican de una manera FORMAL como a, b y c; y
devuelve como PARÁMETROS DE SALIDA, tres valores ordenados que también se
identifican formalmente como x, y ,z.
Esta acción parametrizada puede INVOCARSE con cualquier instancia de los
parámetros, por ejemplo en un diseño se puede tener:

LEER(x,y,z);
clasificar(x,y,z;u,v,w);
ESCRIBIR(u,v,w);

Puede observarse que la lectura y escritura de los datos no se realiza dentro de la


acción misma, pues ésta sólo se dedica a realizar la tarea de clasificar sus
parámetros de entrada para devolverlos en el orden correcto, vía los parámetros de
salida.
Otros ejemplos de acciones parametrizada que se han usado en el presente capítulo
sin requerir mayor refinamiento fueron los procedimientos LEER y ESCRIBIR. Los que
de una manera abstracta representaron las operaciones de entrada y salida de
datos de los algoritmos.
Funciones
Existe un tipo particular de acción parametrizada que devuelve un único valor
asociado con su nombre. En efecto, recuerde la acciones usadas en un ejemplo
anterior:
r  RESTO(x,y);
Estas acciones de tipo "operación" reciben el nombre de FUNCIONES y aparecen
siempre en expresiones a la derecha del símbolo  de asignación.
Se dan a continuación algunos ejemplos de la definición y uso de algunas
funciones.
Ejemplo 1: La siguiente función calcula el resto del cociente entero mediante restas sucesivas.
Función Resto(x,y);
Argumentos: x,y :enteros positivos
Resultado : entero positivo
MIENTRAS x > y
x  x-y;
FIN MIENTRAS
Resto  x;

Ejemplo 2: La función Max devuelve el máximo de sus dos parámetros.


Función Max(x,y);
Argumentos: x,y: enteros
Resultado : entero
SI x > y ENTONCES
Max x
SINO
Max y
FIN SI

un ejemplo de aplicación de esta función sería:



LEER(a,b);
mayor  Max(a,b);
ESCRIBIR(mayor);

LEER(x,y,z);
Mayor  Max(x,Max(y,z));

Ejemplo 3: La función Esvocal recibe un caracter y permite determinar si se trata de una vocal o no.
Función Esvocal(c)
Argumento: c: un caracter
Resultado : lógico (booleano)
SEGUN c
c = “a” o c = “A”
c = “e” o c = “E”
c = “i" o c = “I”
c = “o” o c = “O”
c = "u" o c = “U” : Esvocal  verdadero;

SINO : Esvocal  falso;


FIN SEGUN
Ejemplo 4: Dada una secuencia de caracteres con marca final se quiere contar la cantidad de
vocales presentes en la misma.

5. Actividad de los Estudiantes


Solución de problemas aplicados a conocimientos generales y del área de interés.
Ø Escribir algoritmos para resolver los siguientes problemas, indicando en cada
caso que tipo de descomposición se usa (Secuenciación, análisis por casos,
iteración ). Trate de usar por lo menos dos niveles de refinamiento. Anote todas
las suposiciones que haga.
Ø Se quiere calcular, en segundos, el tiempo de conexión de una computadora a
Internet, los datos son dos horas del día en la forma: horas , minutos y segundos.
Ø Se tiene la identificación de un estudiante y las notas obtenidas en dos
evaluaciones de una materia, a partir de estos datos muestre la identificación del
estudiante y un mensaje diciendo si ha aprobado o no, la condición de aprobación
es que ambas notas sean mayores que 3, en el caso de estar aprobado mostrar
además la nota promedio.
Ø Determinar la cantidad de dinero que recibirá un trabajador por concepto de
horas extras, sabiendo que cuando las horas de trabajo exceden de 40, el resto se
consideran horas extras y estas se pagan el doble de una hora normal cuando no
exceden de 8, si las horas extras exceden de 8 se pagan: las primeras 8 el doble y
el resto el triple. Los datos a leer son horas trabajadas y precio de la hora.
Ø En el Laboratorio de Ensayos de Materiales de Techint se ensayan hasta la rotura.
para dos obras diferentes, cinco probetas de hormigón para cada una de ellas. Se
calculan el valor promedio de rotura para cada obra y el valor mínimo de todas
las ensayadas.
Ø Dado un cierto valor: total y una sucesión de números positivos, se deben sumar
los valores de la sucesión siempre que esa suma no supere a total. Se quiere
conocer el valor de la suma y el número de orden del último dato sumado.
Ø En una planta de hormigón se distribuye a los clientes sus pedidos (según el
volumen) en camiones tolva de 5m' y 7 in' .Se quiere calcular y mostrar el
volumen total de hormigón distribuido durante 15 días, discriminado entre
camiones chicos y camiones grandes. También debe mostrar el total de venta de
la quincena de la planta. Los datos son: día, nro. viajes diarios camión 5, nro.
viajes diarios camión 7 .
Ø A fin de prevenir inundaciones en el próximo verano el Laboratorio de Hidráulica
de la provincia ha realizado estudios sobre los caudales de dos ríos principales de
la provincia.
Ø durante los meses de enero y febrero de este año. Se quiere conocer el valor
promedio de caudal por mes para cada río, y también cuando se tuvo el caudal
máximo y en que río. Los datos leídos son: día mes caudal 1 caudal2.
Ø En una fábrica el proceso de empaque está automatizado y la máquina que lo
realiza trabaja mientras un censor automático le indica con una señal que existe
un producto a embalar. Cada vez que se empaqueta un producto se registra la
hora (con formato: hh mm ss). Se quiere contar cuantos productos se han
envasado y además la velocidad de enlatado (latas/segundo) en el turno
controlado.
Ø Suponer como dato un conjunto de vectores de n elementos y se quiere calcular
cuántos elementos nulos tiene cada vector. Diseñar un algoritmo que calcule lo
pedido, usando una función para realizar el cálculo.
Ø Una compañía tiene una flota de 10 camiones y usa un esquema de coordenadas
(x,y) para indicar su posición:
Se tienen las coordenadas de cada camión y su identificación (1 a 10 Diseñar una
función que determine la distancia de cada camión a la casa central (-1,-1) y otra
función que determine qué camión está más próximo a la casa central. A partir de
los datos mostrar la posición del camión más próximo y su identificación.

6. Referencias Bibliograficas
o Barchini de Giménez, Graciela, Montalvetti, Mario, Avila, Claudia, Silva, 2002,
Informática para Ingenieros, FCEyT — UNSE: 2002.
o Joyanes Aguilar, Luis. Fundamentos de Programación. McGraw Hill: 1998.
o Norton, Peter (2001), Introducción a la Computación. Mc Gravy Hill: 2001.
o Mentz de Acosta, Mabel, Fernández, Patricia, Luccioni Griselda, Juarez Aráoz, Alberto
(2003). Introducción a la Informática, Cooperadora de la FACET, UNT: 2003