Program 2
Program 2
Unidad 1
Recursión
*1. Conceptos
Esquema Proposicional
Oración
*Generador de proposiciones
Ejemplos:
P[x]=El día x hay clases de programación ll …X pertenece {lunes, martes, miércoles, jueves}
T[x]=El día x hay clases de prog. 2 … x pertenece {lunes, sábado, miércoles} - No satisfacible
*Estado Proposicional
1=1(1+1) /2
=1(2) /2
=2/2
| 1 = 1 | Verdadero
| 1+2+3+…|+n = n(n+1)/2
(n-1) n/2 + n =
(n-1)n + 2n
------------------------ =
N
n2-n+2n
----------------------- =
2
n2+n
------------ =
2
n(n+1)
------------ =
2
| n(n+1)/2 = n(n+1)/2 |
1+2+3+4 = 4(5)/2
10=10
Escribir una función que devuelva la suma de los primeros n números naturales.
//---------------------------------------------------------------------------
int suma(byte n)
{
return n*(n+1)/2;
void Recursivo()
{
ShowMessage("Hola");
Recursivo();
ShowMessage("Mundo");
}
a) Caso base: Tiene al menos una situación en la que la llamada recursiva no se hace.
Se debe resolver el problema para el primer valor del dominio de la variable de recursión.
b) Caso general: Si se hace la llamada recursiva esta debe hacerse de forma que se aproxime
al caso base.
Suponga que ya hay un proceso que hace lo mismo que quiere hacer, pero lo hace para un
dato menos. Utilizando ese proceso terminar el trabajo.
Pasos a seguir para escribir un algoritmo recursivo.
Ejemplos:
1)Escribir una función que devuelva una cadena con los primeros N números naturales.
Dn = [0,255]
String Cadena(byte n)
{ String Pal;
if (n==0)
{
Pal="";
}else
{
if (n==1) {
Pal=Cadena(n-1)+n;
}else{
Pal=Cadena(n-1)+","+n;
}
return Pal;
}
2) Factorial
int factorial(byte n)
{ int fact;
if (n==0)
{
fact=1;
}else
{
fact=n*factorial(n-1);
}
return fact;
}
Algoritmos con números
1)Escribir una función que devuelva la suma de los dígitos de un numero
Ejemplo:
N=variable conceptual
X=374362 => 25
P0) E:Num.Nat.Gr. S:Num.Nat.Pe
P1) VR=n (cant de dígitos de x)
P2) Dx=[0,2exp(32)-1]
Dx=[0,4294967295]
Dx=[0,1,2,3,….,100,……..42567876543]
Dn={1,2,3,4,5,6,7,8,9,10}
Dn=[1,10]interseccion[1,infinito[
P3) Caso base
Caso general
| X=37436|2
23+2=25
unsigned char Suma( int n)
{ unsigned long int a,b;
if (n<10)
{
a=n;
}
else
{
b= n % 10;
a=b+Suma(n/10);
}
return a;
Caso general
X=3456|7 (impar)
X=35
Escribir un proceso para separar en 2 variables los dígitos pares e impares de un número.
P0) X=12345 => x1=24 X2=135
Tarea:
Leer sobre tipos de datos en c++
Bloques en estructuras de control
Estructuras discretas (proposiciones, tablas de verdad)
2° principio de inducción
K=n-1
K=n-2
K=n/2
-----------------------------------------------------------------------------------------------------------------------------------
Estándar
C | C++(android) | C++builder
Vector de | string | string Unicode
Caracteres | length() | ApsiString ASCII
X|H|o|l|a|\0| | erase(p,n) | Delete(p,n)
Strcpy | |
Strcat
1)Escribir una función que devuelva la cantidad de “n” que hay en una cadena
|-------------------| n
Ej.: x=” Bonita mañana”
Combinaciones posibles
. n, a = 0 b= n-1
. a,b n=b-a+1
. a,n b=n+a-1
. b,n a=b-n+1
Ejercicios
1)Cargar randomicamente un vector con n datos
Ej.:
// V |7|3|6|8|4|2|
// V |3|6|7|4|2|8|
n (cant de elementos)
a,b (pos inicial, pos final)
V |7|3|6|8|4|2|
V |3|6|7|4|8|2| (8>2) v o f
Caso base
N=0 => nada
N=1 => nada
Debugger
M=cant de columnas
N=cant de columnas
Ma = fila inicial
Mb=fila final
Na=columna inicial
Nb=columna final
N=nb-na+1
M=mb-ma+1
Tipos de hipótesis
K=m-1 , n-1
K= m-2 , n-2
K=m/2 , n/2
56 posibles soluciones
A={ {1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25} }
V=| | | | | | | | | |
A[(n-1)%n][(n-1]/n]
2)Dada una matriz ordenada, excepto la ultima casilla, ordenar (Colocar el ultimo dato en su
llugar)
Unidad 2
Fundamentos de Algoritmia
1.Conceptos
-Algoritmo
E P S
n=cantidad de datos a procesar
(tamaño de la entrada)
-Computador
Dispositivo electrónico capaz de procesar una gran cantidad de datos en poco tiempo.
X=2*n+5^2*y;
(Adán Lovenaca)
-Eficaz, Eficiente
Complejidad
-Complejidad temporal. Un cálculo es más complejo que otro si su ejecución requiere más tiempo
-Complejidad espacial. Conforme aumenta la complejidad de un cálculo más espacio de
almacenamiento necesita para su ejecución
-Algoritmia
2.Tiempo de Ejecución
2^n
T(n) Te de ene
La cantidad de instrucciones ejecutadas por el algoritmo hasta la solución del problema
3.Grado de complejidad de un algoritmo
O(n) La O grande de N
Es la familia de funciones a la que pertenece la función de tiempo de un algoritmo
Ej:
TA(n)=2n+7
TA(n)=n^2
Grado de complejidad
-Logaritmicos
-N logaritmicos
-Polinomiales{ Lineales,cúbicos,….,etc
-Exponenciales
Sigma(n)
Ej. O(n) Headsort=n*log(n)
O(n) Burbuja = n^2
T(n) Tiempo de ejecución de un algoritmo
1) n!=1*2*3*….*n
n!= { 1 si n=0
{ n*(n-1)! Si n>0
+ + + + + + +
Fibo(n)= 0 , 1 , 1 , 2 , 3 , 5 , 8 …
2) Fibo(n) = { 0 si n=1
{ 1 si n=2
( Fibo(n-2)+Fibo(n-1)
N T(n)
27 1 ms
30 4 ms 2
31 8 1.5 n-27
32 12 1.583 Tfibo(n)=media=1.63 (aprox)
33 19 1.895 o(n)=Exponencial
34 36 1.416
35 51 1.588
36 81 1.617
37 131 212/81 1.618
38 212 343/212 1.617
39 343 553/343 1.611
con la formula
40 553 ms
Ejercicios:
*Algoritmos constantes
T(n)=K
1)
Void Swap(int &x, int &y)
L t
{ int z;
1 1
1 z=x;
2 1
2 X=y;
3 1
3 y=z;
} Tswap(2)=3
Ej: n=71+2+3+4+5+6+7=28
*Algoritmos lineales
T(n)=An+B procesan un conjunto de datos
|----------------|
n
--------------- -Un solo recorrido
-------------- -Cada dato es revisado una sola vez
-----------
------ ----
Etc.
1)Funcion que devuelva las suma de los elementos de un vector
Tsuma(n)03n+4
N=4 3(4)+4
= 16 instrucciones
Paso 1
Establecer las ecuaciones de recurrencia
Paso2
Resolviendo las ecuaciones recurrentes mediante iteraciones
I=0 Tsuma(n)=4+Tsuma(n-1)
1 =4+4+Tsuma(n-2)
=8+Tsuma(n-2)
2 =8+4+Tsuma(n-3)
=12+Tsuma(n-3)
3 =12+4+Tsuma(n-4)
=16+Tsuma(n-4)
. .
. .
. .
I Tsuma(n) =A+Tsuma(0);
Paso 3
Calculo de constantes
Paso 4
Determinación del número de iteraciones
(antes de llamar al caso base)
Paso 5
Sustitucion de i en las constantes
A=4i+4
A=4(n-1)+4
A=4n-4+4
A=4n
Paso 6
Sustitucion de las constantes en la ecuación principal (no recurrente)
Tsuma(n)=A+Tsuma(0)
1) Procesa un dato
2) Obtiene la mitad
3) Repite pasos 1 y 2 hasta que quede solamente 1 dato
Ej:
T(n)=8 T(n)=5*log2(n+1)+4
Probando los resultados
TBuBin(x=7;n=15)=5*log(15+1)+4
=5(4)+4
=24 instrucciones
Bool BusBin(int v[],int a, int b,int x){
Int n; bool hallado;
N=b-a+1;
If (n==0){
Hallado=false;
}else{
Int c=(a+b)/2;
If (x==v[c]){
Hallado=true;
}else if (x<v[c]){
Hallado=BusBin(v,a,c-1,x);
}else{
Hallado=BusBin(v,c+1,b,x);
}
}
}
Paso 1
Establecer las ecuaciones de recurrencia
{4, si n=0 cb
{------------------------------------------------
TBusBin(n)={6 mc cg
{7+TBusBin(n/2) pc
Paso2
Resolviendo las ecuaciones recurrentes mediante iteraciones
I=0 TBusBin(n)=7+TBusBin(n/2)
=7+7+TBusBin(n/4)
I=1 =14+TBusBin(n/4)
=14+7+TBusBin(n/8)
I=2 =21+TBusBin(n/8)
=21+7+TBusBin(n/16)
I=3 =28+TBusBin(n/16)
. . .
. . .
i-1 =A-7+TBusBin(1)
i =A+TBusBin(0)
Paso 3
Calculo de constantes
I 0 1 2 3 ……………….i
A 7+7+7+7+7+7……………….+7
Paso 4
Determinación del número de iteraciones
(antes de llamar al caso base)
N=2^i+1
Log2(n)=log(2^i+1)
Log2(n)=log2(2)(i+1)
Log2(n)=i+1
(antes de la iesima (i-1) )
i=log2(n)
Paso 5
Sustitucion de i en las constantes
A=7+7i
A=7+7log2(n)
Paso 6
Sustitucion de las constantes en la ecuación principal (no recurrente)
TBusBin(n)=A+TBusBin(0)
=7+7los2(n)+4
TBusBin(n)=7log2(n)+11
Algoritmos cuadraticos
n
|-------------------------------------|
----------------------------------- |
----------------------------------- | n
----------------------------------- |
T(n)=An^2+Bn+C
Variaciones
|-------------------------------------|
--------------------------------- |
------------------------------- | n
--------------------------- |
|----|
------ |
---------- | n
-------------- |
T(n)=(An^2)/2+(Bn)/2+C
Ejemplo:
Algoritmo de ordenamiento
Selection short
}
TposMayor(n)=[3n+1,4n]
Unidad 3
Diagrama de clases
Clases
Relaciones {-Herencia
{Asociación
{Agregación
{Composición
{Dependencia
*clases
Tipos de clases
Clases definidas por sus atributos
-Tienen varios atributos
-No almacenan datos (además de los atributos)
-Casi no tienen métodos visibles
Ej:
Fecha Tiempo
Dia Hora
Mes Minuto
Año Segundo
ToStr ToStr
Pila Cola
Tope Frente
Atras
Vacia
Vacia
Llena
Llena
Meter
Meter
Sacar
Sacar
El dato a sacar El dato a sacar es
Es el último en ser ingresado el primero en entrar
Clases de servicio
-No tienen atributos
-No almacenan datos
-Solo tienen métodos
Ej:
Mat
Log
Sin
Cos
Tag
Sqrt
Pow
Notación
Dividido en 3 partes
Nombre (singular)
Atributos
(Nombre Completo)
Metodos ()
*Métodos: Son las cosas que pueden hacer los objetos de la clase (de forma individual)
Tipos de Métodos
a) Por su relación con sus datos
-Constructores
En c++ el destructor tiene el nombre de la clase
Se encargan de:
. Reservan espacio de memoria para los objetos de la clase (Compilador -SO)
. Inicializar los atributos del objeto
*const. De oficio
El implementador es el que decide los datos iniciales
*const. De copia
Se inicializa con datos de otro objeto de la misma clase
*const. Parametrizado
Inicializar con datos recibidos a través de parámetros.
-Destructor
Liberar la memoria ocupada por el objeto.
(Se debe programar si el objeto almacena otros datos además de los atributos)
-Modificadores
Permiten modificar los datos de los atributos previa validación.
Debería haber un modificador por cada atributo
-Selectores
Son funciones que devuelven el contenido de los atributos
Debería haber un selector por cada atributo
b) Por su alcance
Privado/private
Son aquellos que solo los miembros de la clase pueden acceder
Ej. Pivotear. (cualquier método auxiliar)
Protegido/protected
Solo los miembros de la clase y sus herederos tienen acceso
Ej. Hms de la clase tiempo
Publico/public
Son aquellos accesibles por todos
Ej. Ordenar, buscar….
c) Por su visibilidad
No visibles
- Son aquellos métodos que siempre se deben programar en una clase (obvio) por lo tanto No se
debe escribir en el diagrama
Tiempo
Hora
Minuto
Segundo
ToStr
Visibles
Son otras acciones que de manera explícita se quiere indicar que hacen los objetos de la clase.
Ej. ToStr de la clase tiempo y fecha
Tiempo
*Atributos: Son las características que describen a los objetos
de una clase.
Hora
Se reflejan en el diseño. Minuto
Ej. Hora, minuto, segundo de la clase tiempo Segundo
ToStr
Analista/Dis.
Implementador
Usuario
Programador
Campo/Field
Son variables en las que el implementador guardara los datos de los atributos. El guardado será:
1 Atr. 1 campo byte h,m,s;
N Atr. 1 campo Word hms;
1 Atr. n campos Cardinal cod1, cod2;
Propiedad/Properties
Son pseudovariables con las que el implementador creara abstracciones de los atributos al usuario
de la clase.
(pseudovariable: es un tipo de implementación de variable {no es variable} )
Tiempo
Hora
Minuto
Segundo
ToStr
Creando un Modulo
//constructores
*de oficio ()
*de copia (const Clase &)
*parametrizado
//modificadores
//selectores
.h .cpp
Bitwise
Creando un proyecto
Proyecto
Sobrecarga/Overload
*Un método o proceso para realizar más de una tarea
*Son varios procesos que tienen el mismo nombre, pero se diferencian por:
-Tipo de dato de los parámetros
-Cantidad de parámetros
Tipos de operadores
-De funciones(procesos)
-De operadores Ej. + (suma)(concatena)
a+ b
[Los operadores se implementan como funciones]
Estr. OOP
+(a,b) a.+(b)
Operadores
Aritméticos
+ -
*/
%
Relacionales
> <
>= <=
== ¡=
Lógicos
¡ && ||
(~) (and) (or)
Asignación
=
Otros
[],&,|,*,<<,>>,etc.
ToStr
Overwrite/Redefinición
Consiste en que una clase derivada podrá redefinir (hacer su propia implementación) un método
heredado.
Método virtual
Es un método definido e implementado por una clase (base), que podrá ser redefinido por sus
derivadas
-Herencia múltiple
Puede heredar de más de una clase.
Ej.
Base Superclase Padre
t = {10:11:12}
Tiempo Fecha
Hora Día
Minuto Mes
Segundo Año
Virtual ToStr Virtual ToStr
ToStr ToStr
Principio de sustitución
Allí donde se espera un objeto de una clase (base) se puede recibir objetos de esa clase o de
cualquiera de sus derivadas.
Ligadura
Se refiere a la forma en que una variable es asociada a un objeto.
-Ligadura estática/static Binding
La variable y el objeto están asociados en el momento de su definición
-Ligadura dinámica
Una variable podría instanciar con 0,1 o más objetos (aunque no al mismo tiempo)
Polimorfismo (investigar)
Generalización/especialización
Especialización
Primero se crea la clase principal, luego la derivada
Generalización //como la factorización en matemáticas
Primero la clase derivada, luego la principal
*Se identifican los atributos
*luego los métodos
Figura
Punto
Color
Mostrar
Área Área
Rol
Papel desempeñado por los objetos relacionados
Cardinalidad
- 1-1 (uno a uno)
- 1-n (uno a muchos)
- m-n (muchos a muchos)
Participación
- Total (Todos)
- Parcial (Algunos)
*Composición
-Dependencia existencial
El elemento dependiente desaparece al destruirse el que lo contiene y, si es de cardinalidad 1 es
creado al mismo tiempo.
*Agregación
Contenedor contenido
*Dependencia
Clase
De
Servicios
Significa que una clase necesita de otra para prestar sus servicios