Title: Diapositiva 1
1UNIVERSIDAD LATINA (UNILA)
III. DISEÑO DE ALGORITMOS PARA LA SOLUCIÓN DE
PROBLEMAS.
2Niveles de abstracción para la construcción de
algoritmos
La construcción de algoritmos se basa en la
abstracción de las características del problema a
través de un proceso de análisis, que permitirá
seguir con el diseño de una solución basada en
modelos, los cuales ven su representación
tangible en el proceso de implementación del
algoritmo.
3Niveles de abstracción para la construcción de
algoritmos.
Análisis .- Consiste en reconocer cada una de las
características del problema, lo cual se logra
señalando y modelando los procesos, fórmulas o
efectos que lo rodean. Los procesos pueden
identificarse como operaciones o formulas que se
aplican a las variables del problema. Al analizar
las actividades, procedimientos, funciones o
métodos del problema, se deben relacionar con sus
variables y sus relaciones entre éstos. El
resultado esperado de esta fase de la
construcción es un modelo que represente la
problemática encontrada y permita encontrar sus
características mas relevantes.
4Niveles de abstracción para la construcción de
algoritmos.
Diseño .- Una vez que se ha analizado las causas
del problema y se ha identificado su proceso
sobre el cual se debe actuar para llegar a una
solución, comienza el modelado de una solución
factible o diseño del algoritmo. En esta etapa se
diseña el modelo apropiado que describe al
problema y se realizan las pruebas
correspondientes a este modelo.
5Niveles de abstracción para la construcción de
algoritmos.
Implementación .- La implementación es llevar el
modelo y los resultados esperados surgidos en las
pruebas a un código de lenguaje de programación
para que éste sea implementado en una computadora
y tengamos un resultado resuelto del sistema de
información, automatizado de propósito general
para la toma de decisiones.
6- Estructuras de diseño básicas en un algoritmo.
- Ciclos
- Contadores
- Acumuladores
- Condicionales
- Interruptores
- Funciones (recursivas)
7Ciclos
Se caracterizan por iterar o repetir
instrucciones en función de una condición que
debe cumplirse en un momento bien definido.
Existen dos tipos de ciclos while y
do-while. while se caracteriza por realizar la
verificación de la condición antes de ejecutar
las instrucciones asociadas al ciclo. do-while
evalúa la condición después de ejecutar las
instrucciones una vez. En este tipo de ciclos el
número de repeticiones que se realizarán es
variable y depende del contexto de ejecución del
algoritmo.
mientras ltcondiciongt hacer Instruccion1
Instruccion2 ... Instrucción n fin mientras
8Contadores
Se caracteriza por iterar o repetir instrucciones
en función de una condición que debe cumplirse en
un momento conocido y está representado por la
instrucción para (for). Esta estructura se
evalúa el valor de una variable a la que se
asigna un valor conocido al inicio de las
iteraciones este valor sufre incrementos o
decrementos en cada iteración y suspende la
ejecución de las instrucciones asociadas una vez
que se alcanza el valor esperado .
Para ltvariablegt ltvalor inicialgt hasta ltvalor
topegt ltIncrementogt hacer Instruccion1
Instruccion2 ... Instrucción n Fin para
ltvariablegt
9Acumuladores o totalizadores
Son variables que tienen por objeto almacenar
valores incrementales o decrementales a lo largo
de la ejecución del algoritmo. Este tipo de
variables utiliza la asignación recursiva de
valores para no perder su valor anterior. Son
útiles para calcular totales en diferentes
valores o cantidades La asignación recursiva de
valor a este tipo de variables se ejemplifica a
continuación ltvariablegt ltvariablegt
ltincrementogt total total cantidad o
tambien suma valor i
10Condicionales (if.. else)
Se utiliza para ejecutar selectivamente secciones
de código de acuerdo con una condición
definida. Sólo tiene dos posibilidades si la
condición se cumple, se ejecuta una sección de
código si no, se ejecuta otra sección, aunque
esta parte puede omitirse.
si ltcondiciongt entonces Instruccion1
Instrucción n si no Instrucción 3
Instrucción n Fin si
11Interruptores
Son variables globales del programa que se
utilizan en combinación con las estructuras
cíclicas y selectivas para habilitar o
deshabilitar secciones de código. Un ejemplo de
este tipo de variables son las banderas que,
dependiendo del valor que almacenen, condicionan
el comportamiento del programa. Ejemplo Si
flag 1 entonces escribe el encabezado del
reporte. O return 1
12Técnicas de diseño de algoritmos
- Algunas técnicas de diseño de algoritmos son
- Refinamiento progresivo
- Procesamiento regresivo
- Divide y vencerás
- Estrategia Greedy
- Programación dinámica
- Inducción
13Técnicas de diseño de algoritmos
-Refinamiento progresivo Es una técnica de
análisis y diseño de algoritmos que se basa en la
división del problema principal en problemas más
simples. Este tipo de procedimiento se conoce
como Top-Down y también es aplicable a la
optimización del desempeño y a la simplificación
de un algoritmo. -Procesamiento regresivo Parte
de la existencia de múltiples problemas y se
enfoca en la asociación e identificación de
características comunes entre ellos para diseñar
un modelo que represente la solución para todos
los casos de acuerdo con la parametrización de
las entradas. Esta técnica también es conocida
como Bottom-Up y puede aplicarse en la
optimización y simplificación de
algoritmos. -Divide y vencerás Dividir un
problema en subproblemas del mismo tipo y
aproximadamente todos ellos del mismo tamaño,
resolver los subproblemas recursivamente y,
finalmente, combinar la solución de los
subproblemas para dar una solución al problema
original. La recursión finaliza cuando el
problema es pequeño y la solución es fácil de
construir directamente.
14Técnicas de diseño de algoritmos
-Estrategia Greedy Un algoritmo Greedy elige, en
cada paso, una solución local optima. Las
estrategias greedy encuentra una solución maxima
al problema. (ejem. Rutas de entrega) -Programaci
ón dinámica Es un método para reducir el tiempo
de ejecución de un algoritmo mediante la
utilización de subproblemas superpuestos y
subestructuras óptimas. Una subestructura óptima
significa que soluciones óptimas de subproblemas
pueden ser usadas para encontrar las soluciones
óptimas del problema en su conjunto. Se pueden
resolver problemas con subestructuras óptimas
siguiendo estos tres pasos Dividir el problema
en subproblemas más pequeños. Resolver estos
problemas de manera óptima usando este proceso de
tres pasos recursivamente. Usar estas soluciones
óptimas para construir una solución óptima al
problema original. -Inducción A través de la
inducción matemática se puede definir un
mecanismo para encontrar todos los posibles
elementos de un conjunto recursivo partiendo de
un subconjunto conocido, o bien, para probar la
validez de la definición de una función recursiva
a partir de un caso base.
15- LOS DATOS A PROCESAR PUEDEN SER
- SIMPLES
- Ocupan solo una casilla de memoria. (enteros,
caracteres, decimales). - Ejem.- 567
- COMPLEJOS O ESTRUCTURADOS .- Hacen referencia a
un grupo de casillas de memoria y son construidos
a partir de los datos simples. - Arreglos o vectores, matriz, árboles, registros,
archivos, Bases de Datos, etc. -
16Tipos simples.
Las En C/C existen básicamente cuatro tipos de
datos, aunque como se verá después, podremos
definir nuestros propios tipos de datos a partir
de estos cuatro. TIPO Tamaño char 1
byte int 2 bytes float 4 bytes
double 8 bytes
17QUE SON LOS ARREGLOS O VECTORES ? Es un conjunto
o lista de datos estructurados Es una colección
finita, homogenea y ordenada de
elementos Finita.- Indica el número
máximo Homogenea.- Son del mismo tipo (entero,
reales, caracteres) Ordenada.- Llevan un orden
consecutivo a través de un índice Ejem.-
A 34 45 12 05 93 Datos (0) (1) (2) (3) (4) I
ndices
18Los índices hacen referencia a los componentes
(datos) en forma individual. Ejem.-
A 34 45 12 05 93 Datos (0) (1) (2) (3) (4) I
ndices En forma individual.- A2 12 Cuanto
vale A1, A4 ?
19DECLARACIÓN DE UN ARREGLO EN C/C La sintaxis
de declaración de arreglos es tipo
nombre_arreglo numero_de_elementos Ejem
int A5 //Define un arreglo de 5 numeros
int CoordenadasDePantalla5 // Un arreglo de 5
enteros char IDCompania20 //Un arreglo de
20 caracteres float Calificación3 //Arreglo
de 3 números decimales
20- Que podemos programar con Arreglos ?.
- Las operaciones básicas con Arreglos son
- Lectura de un arreglo
- Despliegue de datos de un arreglo
- Llenado de un arreglo
- Ordenacion de un arreglo
- Búsqueda de datos en un arreglo
-
21LLENADO/LECTURA DE UN ARREGLO Pseudocodigo Dame
los 10 datos ? PARA i desde 0 hasta 10
incrementa LEE Ai. Codigo en C o C printf
("Dame los 10 datos") for (i0 ilt10
i) scanf ("d", valor i)
22DESPLIEGUE DE UN ARREGLO Y OPERACIONES CON SUS
COMPONENTES Pseudocodigo PARA i desde 0 hasta 10
incrementa Inicio DESPLIEGA Valor, Indice
1, valor SUMA los valores del arreglo termina Cod
igo en C o C for (i0 ilt10 i) printf
("Valor d d\n", i1, valor i) suma
valor i
23- PRACTICA (5)
- HACER UN PROGRAMA (ProgArreg.cpp) EN C o C QUE
PIDA EL PROCESO PARA N CALIFICACIONES Y LOS DATOS
DESPLEGANDO AL FINAL SU PROMEDIO.
24include ltstdio.hgt include ltconio.hgt int i,
valor 100, suma0, n, num0, num10, aux0,
pos0, pos10 float promedio main () printf
("Cuantas calificaciones ? ") scanf ("d",
n) printf ("Dime los d Datos en el mismo
renglon\n", n) for (i0 iltn i) scanf
("d", valori) for (i0 iltn i) printf
("Valor d d\n", i, valor i) suma valor
i
promedio (float) suma/n printf ("El promedio
es .2g\n", promedio) numvalor0 num1valor0
for(i1 iltn i) // saca el valor
mayor if(valorigtnum) pos
i numvalori
// saca el valor menor
if(valoriltnum1) pos1 i
num1valori printf ("El
mayor es d\n", num) printf ("En posicion
d\n\n", pos) printf ("El menor es d\n",
num1) printf ("En posicion d\n\n",
pos1) getch()
25ARREGLOS MULTIDIMENCIONALES Un vector es un
array unidimensional, es decir, sólo utiliza un
índice para referenciar a cada uno de los
elementos. Su declaración será tipo nombre
tamaño Una matriz es un array
multidimensional. Se definen igual que los
vectores excepto que se requiere un índice por
cada dimensión. Su sintaxis es la siguiente
tipo nombre tamaño 1tamaño 2... Una
matriz bidimensional se podría representar
gráficamente como una tabla con filas y columnas.
26ARREGLOS MULTIDIMENCIONALES Ejem.- Una matriz de
2X3 (2 filas por 3 columnas) se inicializa en
C/C como int matriz23
20,50,30 ,
4,15,166
Otra manera es llenar el arreglo mediante
una instrucción FOR anidada
27ESTRUCTURA DE DATOS ( ARREGLOS )
/ Matriz bidimensional. / include
ltstdio.hgt include ltconio.hgt main() /
Rellenamos una matriz / int x,i,numeros34
/ rellenamos la matriz / printf("Dime los
valores de matriz 3X4\n") for (x0xlt3x) for
(i0ilt4i) scanf("d",numerosxi) /
visualizamos la matriz / for (x0xlt3x)
for (i0ilt4i) printf("d",numerosxi
) getch()
28ESTRUCTURA DE DATOS ( ARREGLOS )
int numeros341,2,3,4,5,6,7,8,9,10,11,12
quedarían asignados de la siguiente manera
numeros001 numeros012
numeros023 numeros034 numeros10
5 numeros116 numeros127
numeros138 numeros209
numeros2110 numeros2211
numeros2312
29PRACTICA (9)HACER UN PROGRAMA DE UNA MATRIZ QUE
SIMULE UN TABLERO DE AjEDREZ DE 8x8 / Programa
Matriz_tablero.cpp. Simula una matriz de 8x8
/ include ltstdio.hgt include ltconio.hgt main()
int suma, x,i,numeros88 printf("Dime los
valores de matriz 8X8\n") for (x0xlt8x) for
(i0ilt8i) scanf("d",numerosxi) for
(x0xlt8x) // visualizamos la matriz
printf("\n") for (i0ilt8i)
printf("d",numerosxi)
printf("\n") getch() // Al finalizar
hacer un programa que calcule una suma de
valores en casillas
30QUE SON ORDENAMIENTOS DE DATOS ?
- SORT / ORDENACION.-
- Es reagrupar un grupo de datos en una secuencia
especifica de orden - (mayor -gt menor o menor -gt mayor)
31LA ORDENACION DE ELEMENTOS PUEDE SER
- Ordenación Interna.- En memoria principal
(arrays, listas). - Ordenación Externa.- En memoria secundaria.
(dispositivos de almacenamiento externo.-
archivos y Bases de datos).
32TIPOS DE ORDENACION
- Los mas usuales son
- POR INTERCAMBIO (Compara e intercambia
elementos.- Burbuja) - POR SELECCIÓN (Selecciona el mas pequeño y lo
intercambia) - POR INSERSION (Inserta los elementos en una
sublista ordenada) - METODO SHELL (Es una insersión mejorada)
- ORDENACION RAPIDA (Quick Sort.- divide una lista
en dos partes)
33POR INTERCAMBIO (Burbuja o bubble sort )
- El bubble sort, también conocido como
ordenamiento burbuja, funciona de la siguiente
manera - Se va comparando cada elemento del arreglo con el
siguiente si un elemento es mayor que el que le
sigue, entonces se intercambian esto producirá
que en el arreglo quede como su último elemento,
el más grande. - Este proceso deberá repetirse recorriendo todo
el arreglo hasta que no ocurra ningún
intercambio. - Los elementos que van quedando ordenados ya no se
comparan. "Baja el más pesado".
34EJEMPLO Ordenamiento por Burbuja o bubble sort
Consiste en comparar pares de elementos
adyacentes e intercambiarlos entre sí hasta que
estén todos ordenados. Sea un array de 6 números
de empleados 40,21,4,9,10,35 Primera
pasada 21,40,4,9,10,35 lt-- Se cambia el 21 por
el 40. 21,4,40,9,10,35 lt-- Se cambia el 40 por
el 4. 21,4,9,40,10,35 lt-- Se cambia el 9 por el
40. 21,4,9,10,40,35 lt-- Se cambia el 40 por el
10. 21,4,9,10,35,40 lt-- Se cambia el 35 por el
40. Segunda pasada 4,21,9,10,35,40 lt-- Se
cambia el 21 por el 4. 4,9,21,10,35,40 lt-- Se
cambia el 9 por el 21. 4,9,10,21,35,40 lt-- Se
cambia el 21 por el 10. Ya están ordenados, pero
para comprobarlo habría que acabar esta
segunda comprobación y hacer una tercera.
35Que son las funciones ?
Funciones.- Son bloques de código utilizados
para dividir un programa en partes mas
pequeñas Prototipo de función.- Es la
declaración de la función en el
código Variables Gobales.- Nivel
programa locales.- Nivel funcion
36// Definimos una función donde Aarreglo y
Ntamaño int bubblesort(int A,int N)
int i,j,AUX for(i2iltNi)
//siguiente for(jNjgtij--)
//anterior
if(Aj-1gtAj) //si i gt d intercambio
AUXAj-1 //guardamos
en AUX
Aj-1Aj //pasamos d a i
AjAUX //copiamos AUX en d
return 1
37- Practica Hacer un programa con Arreglos que
ordene por el método de la burbuja Bubblesort en
forma ascendente un vector de 10 números de
empleados de una empresa.
Códificación main() int A10 llenavector(
A,10) // es uma función printf("ORDENAMIENTO POR
BURBUJA \n") printf("Numeros a ordenar
\n") salida(A,10) // es uma función printf("\n\n
Numeros ordenados \n") bubblesort(A,10) // es
uma función salida(A,10) // es uma
función getch()
Pseudocódigo 1.- Inicio 2.- Definir un vector de
10 números 3.- Llenar el vector con los
números 4.- Mostrar la salida de los números
capturados en desorden 5.- Ordenar el vector por
el método bubblesort 6.- Mostrar la salida con
los números ordenados del vector
38Función que llena el vector con los números
- int llenavector(int A,int N)
- int c
- int x
- coutltlt"Ingrese 10 numeros de
empleados"ltltendl - for(c1cltNc)
- cingtgtx // lee x numero
- Acx // lo graba en el
vector -
- return 1
-
39Ordenar el vector por el método bubblesort
- int bubblesort(int A,int N)
- int i,j,AUX
- for(i2iltNi)
- for(jNjgtij--)
- if(Aj-1gtAj)
- AUXAj-1
//Intercambio - Aj-1Aj
- AjAUX
-
-
-
- return 1
-
40Muestra la salida de los números en el arreglo.
- int salida(int A,int N)
- int c
- for(c1cltNc)
- printf("d, ",Ac) // muestra
el vector -
- return 1
-
- // Nota este mismo procedimiento fue el que se
utilizó para mostrar los datos desordenados.(solo
se escribe una vez)
41- Practica S01 Construir el programa con
Arreglos que ordene por el método de la burbuja
Bubblesort en forma ascendente un vector de 10
números de empleados de una empresa. - Librerias
- include ltstdlib.hgt
- include ltstdio.hgt
- include ltiostreamgt
- include ltconio.hgt
- using namespace std