UNIVERSIDAD LATINA (UNILA)
III. DISEÑO DE ALGORITMOS PARA LA
SOLUCIÓN DE PROBLEMAS.
LE, EI, Profesor Ramón Castro Liceaga
Niveles 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.
LE, EI, Profesor Ramón Castro Liceaga
Niveles 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.
Niveles 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.
Niveles 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.
Estructuras de diseño básicas en un
algoritmo.
1.
2.
3.
4.
5.
6.
Ciclos
Contadores
Acumuladores
Condicionales
Interruptores
Funciones (recursivas)
LE, EI, Profesor Ramón Castro Liceaga
Ciclos
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 <condicion> hacer
Instruccion1
Instruccion2
...
Instrucción n
fin mientras
Contadores
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 <variable> = <valor inicial> hasta
<valor tope> <Incremento>] hacer
Instruccion1
Instruccion2
...
Instrucción n
Fin para <variable>
Acumuladores 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:
<variable> = <variable> + <incremento>
total = total + cantidad;
o tambien suma += valor [i];
Condicionales (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 <condicion> entonces
Instruccion1
Instrucción n
[si no
Instrucción 3
Instrucción n]
Fin si
Interruptores
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;
Té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
Té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.
Té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.
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.
Tipos 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
char
int
float
double
Tamaño
1 byte
2 bytes
4 bytes
8 bytes
QUE 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
(0)
45
(1)
12
(2)
05
(3)
93
(4)
Datos
Indices
Los índices hacen referencia a los componentes (datos) en forma individual.
Ejem.-
A=
En forma individual.-
34
(0)
45
(1)
A[2]=
12
Cuanto vale A[1], A[4] …?
12
(2)
05
(3)
93
(4)
Datos
Indices
DECLARACIÓN DE UN ARREGLO EN C/C++
La sintaxis de declaración de arreglos es:
tipo nombre_arreglo [numero_de_elementos];
Ejem:
int A[5]; //Define un arreglo de 5 numeros
int CoordenadasDePantalla[5]; // Un arreglo de 5 enteros
char IDCompania[20]; //Un arreglo de 20 caracteres
float Calificación[3]; //Arreglo de 3 números decimales
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
LLENADO/LECTURA DE UN ARREGLO
Pseudocodigo:
Dame los 10 datos ?
PARA i desde 0 hasta 10 incrementa
LEE A[i].
Codigo en C o C++
printf ("Dame los 10 datos");
for (i=0; i<10; i++)
{
scanf ("%d", &valor [i]);
}
DESPLIEGUE 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
Codigo en C o C++
for (i=0; i<10; i++)
{
printf ("Valor %d = %d\n", i+1, valor [i]);
suma += valor [i];
}
PRACTICA (5):
A) HACER UN PROGRAMA (ProgArreg.cpp) EN C o C++ QUE
PIDA EL PROCESO PARA N CALIFICACIONES Y LOS
DATOS DESPLEGANDO AL FINAL SU PROMEDIO.
#include <stdio.h>
#include <conio.h>
promedio = (float) suma/n;
printf ("El promedio es %.2g\n", promedio);
int i, valor [100], suma=0, n, num=0, num1=0, aux=0,
pos=0, pos1=0;
num=valor[0];
float promedio;
num1=valor[0];
main ()
for(i=1; i<n; i++)
{
{
// saca el valor mayor
if(valor[i]>num){
printf ("Cuantas calificaciones ? ");
scanf ("%d", &n);
pos = i;
printf ("Dime los %d Datos en el mismo renglon\n", n);
num=valor[i];
for (i=0; i<n; i++)
}
{
// saca el valor menor
scanf ("%d", &valor[i]);
if(valor[i]<num1){
}
pos1 = i;
for (i=0; i<n; i++)
num1=valor[i];
}
{
printf ("Valor %d = %d\n", i, valor [i]);
}
suma += valor [i];
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();
}
ARREGLOS 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 1][tamaño 2]...;
Una matriz bidimensional se podría representar gráficamente
como una tabla con filas y columnas.
ARREGLOS MULTIDIMENCIONALES:
Ejem.- Una matriz de 2X3 (2 filas por 3 columnas) se inicializa en C/C++
como:
int matriz[2][3] = {
{ 20,50,30 },
{ 4,15,166 }
};
Otra manera es llenar el arreglo mediante una instrucción FOR anidada
ESTRUCTURA DE DATOS ( ARREGLOS )
/* Matriz bidimensional. */
#include <stdio.h>
#include <conio.h>
main() /* Rellenamos una matriz */
{
int x,i,numeros[3][4]; /* rellenamos la matriz */
printf("Dime los valores de matriz 3X4\n");
for (x=0;x<3;x++)
for (i=0;i<4;i++)
scanf("%d",&numeros[x][i]);
/* visualizamos la matriz */
for (x=0;x<3;x++)
for (i=0;i<4;i++)
printf("%d",numeros[x][i]);
getch();
}
ESTRUCTURA DE DATOS ( ARREGLOS )
int numeros[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
quedarían asignados de la siguiente manera:
numeros[0][0]=1
numeros[1][0]=5
numeros[2][0]=9
numeros[0][1]=2
numeros[1][1]=6
numeros[2][1]=10
numeros[0][2]=3
numeros[1][2]=7
numeros[2][2]=11
numeros[0][3]=4
numeros[1][3]=8
numeros[2][3]=12
PRACTICA (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 <stdio.h>
#include <conio.h>
main() {
int suma, x,i,numeros[8][8];
printf("Dime los valores de matriz 8X8\n");
for (x=0;x<8;x++)
for (i=0;i<8;i++)
scanf("%d",&numeros[x][i]);
for (x=0;x<8;x++){ // visualizamos la matriz
printf("\n");
for (i=0;i<8;i++){
printf("%d",numeros[x][i]);
}
}
printf("\n");
getch();
} // Al finalizar hacer un programa que calcule una suma de valores en casillas
QUE SON ORDENAMIENTOS DE DATOS ?
SORT / ORDENACION.Es reagrupar un grupo de datos en una
secuencia especifica de orden
(mayor -> menor o menor -> mayor)
EI, Profesor Ramón Castro Liceaga
LA 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).
EI, Profesor Ramón Castro Liceaga
TIPOS 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)
EI, Profesor Ramón Castro Liceaga
POR 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".
EI, Profesor Ramón Castro Liceaga
EJEMPLO: 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} <-- Se cambia el 21 por el 40.
{21,4,40,9,10,35} <-- Se cambia el 40 por el 4.
{21,4,9,40,10,35} <-- Se cambia el 9 por el 40.
{21,4,9,10,40,35} <-- Se cambia el 40 por el 10.
{21,4,9,10,35,40} <-- Se cambia el 35 por el 40.
Segunda pasada:
{4,21,9,10,35,40} <-- Se cambia el 21 por el 4.
{4,9,21,10,35,40} <-- Se cambia el 9 por el 21.
{4,9,10,21,35,40} <-- 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.
EI, Profesor Ramón Castro Liceaga
Que 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
// Definimos una función donde A=arreglo y N=tamaño
int bubblesort(int A[],int N){
int i,j,AUX;
for(i=2;i<=N;i++){ //siguiente
for(j=N;j>=i;j--){ //anterior
if(A[j-1]>A[j]){ //si i > d intercambio
AUX=A[j-1]; //guardamos en AUX
A[j-1]=A[j]; //pasamos d a i
A[j]=AUX; //copiamos AUX en d
}
}
}
return 1;
}
EI, Profesor Ramón Castro Liceaga
• 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()
Pseudocódigo:
{
1.- Inicio
2.- Definir un vector de 10 números
3.- Llenar el vector con los números
int A[10];
llenavector(A,10); // es uma función
printf("ORDENAMIENTO POR BURBUJA \n");
4.- Mostrar la salida de los números
capturados en desorden
printf("Numeros a ordenar: \n");
5.- Ordenar el vector por el método
bubblesort
printf("\n\nNumeros ordenados: \n");
6.- Mostrar la salida con los números
ordenados del vector
salida(A,10); // es uma función
bubblesort(A,10); // es uma función
salida(A,10); // es uma función
getch();
}
EI, Profesor Ramón Castro Liceaga
Función que llena el vector con los números
int llenavector(int A[],int N){
int c;
int x;
cout<<"Ingrese 10 numeros de empleados:"<<endl;
for(c=1;c<=N;c++){
cin>>x; // lee x numero
A[c]=x; // lo graba en el vector
}
return 1;
}
EI, Profesor Ramón Castro Liceaga
Ordenar el vector por el método bubblesort
int bubblesort(int A[],int N){
int i,j,AUX;
for(i=2;i<=N;i++){
for(j=N;j>=i;j--){
if(A[j-1]>A[j]){
AUX=A[j-1]; //Intercambio
A[j-1]=A[j];
A[j]=AUX;
}
}
}
return 1;
}
EI, Profesor Ramón Castro Liceaga
Muestra la salida de los números en el arreglo.
int salida(int A[],int N){
int c;
for(c=1;c<=N;c++){
printf("%d, ",A[c]); // muestra el vector
}
return 1;
}
// Nota: este mismo procedimiento fue el que se utilizó para
mostrar los datos desordenados.(solo se escribe una vez)
EI, Profesor Ramón Castro Liceaga
• 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 <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
EI, Profesor Ramón Castro Liceaga
Descargar

Diapositiva 1 - .: Docencia FCA-UNAM