Professional Documents
Culture Documents
Algoritmos Computacionales
3CM4
Trabajo 3° Parcial
͞Actividades del Polilibro͟
Fecha de Entrega
1-Diciembre-2010
1
Elaborado por:
Unidad I
Unidad II
Unidad III
Unidad IV
Unidad V
2
3
A
Unidad I ......................................................................................................................................... 5
Unidad II ........................................................................................................................................ 7
Unidad III ..................................................................................................................................... 12
Unidad IV ..................................................................................................................................... 25
Unidad V ...................................................................................................................................... 30
Conclusiones͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙56
·ibiografía͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙͙
4
a
Compara objetivos, alcance y contenidos de asignaturas similares en al menos 2 planes de
estudios de otras instituciones (por ejemplo a las que asisten vecinos o familiares tuyos,
que se presentan en Internet) y responde las siguientes preguntas. Envía tus respuestas
por correo.
¿Cuáles son las principales diferencias en los aspectos que continuación se enuncian?
@ Temas incluidos.
@ åbjetivo general.
5
@ Respecto a tus expectativas al cursar la asignatura, ¿qué ideas te sugieren
los otros planes de estudio para una mayor coincidencia con el objetivo, la
ubicación y los alcances de esta asignatura?
åtra buena idea es basarse en los conocimientos que se están dando a conocer de otras
escuelas, no siempre ocupar los mismos libros que con el tiempo se van quedando en el
olvido puesto que jamás se actualizaron.
6
a
Desarrolle el algoritmo, utilizando pseudocódigo, para:
@ Ir al cine.
7
"no comprar nada"
}
@ Enviar un e-mail.
$
@ Acceder a una página web.
@ Enviar un e-mail al profesor.
inicio
escribir( "Introduzca primer n mero (entero): " )
leer( a )
escribir( "Introduzca segundo n mero (entero): " )
leer( b )
suma і a + b
si ( suma > 0 )
escribir( "LA SUMA SÍ ES MAYåR QUE CERå." )
sino
escribir( "LA SUMA Nå ES MAYåR QUE CERå." )
fin_si.
10
@ Sumar los primeros cien n meros naturales.
11
a
Ejercicios de estructuras dinámicas.
Ejercicio 1
TYPE
Tlista:^Elemento;
Elemento=RECåRD
Clave:INTEèER;
Info:Tinfo;
Sig:Tlista
END;
12
·EèIN
Ant:=Act;
Act:=Act^.Sig
END;
NEW(Nuevo);
Nuevo^.Info:=Einfo;
Nuevo^.Clave:=Eclave;
Nuevo^.Sig:=Act;
Anterior^.Sig:=Act;
Anterior^.Sig:=Nuevo
END
END;
Ejercicio 2
TYPE
Tlista:^Artículo;
Articulo=RECåRD
Codigo,Cont_Pedida:INTEèER;
Sig:Tlista
END;
Se tiene una lista en la que se han introducido pedidos seg n el orden de llegada,
por lo que puede haber pedidos del mismo artículo. Se pide, codificar un procedimiento
que, dada una lista como la anteriormente descrita, devuelva un nico elemento por cada
artículo, en el cual el campo Cant_Pedida tenga la suma de todas las cantidades pedidas
de ese artículo.
·EèIN
(*Se realize la decision entre los ciclos*)
IF L<>NIL
(*Retorna la información y la guarda en Cod*)
THEN IF L^.Codigo=Cod
13
(*Aqui es donde regresa el resultado al inicio*)
THEN ·EèIN
Aux:=L;
(*Cantidad pedida es igual a cantidad total*)
Suma:=Suma+L^.Cant_Pedida;
L:=L^.Sig;
(*Se inserta el auxiliar*)
DISPåSE(Aux);
Elimina(L,Cod,Suma)
(*Realiza la function A(m,n)Ackerman*)
END
ELSE Elimina(L^.Sig,Cod,Suma)
END;
·EèIN
IF Lista<>NIL
(*Aqui es donde regresa el resultado al inicio*)
THEN ·EèIN
Elimina(Lista^.Sig,Lista^.Codigo,Lista^.Cant_Pedida);
Eli_Codigo(Lista^.Sig)
END
END;
Ejercicio 3
Entradas
+-------------------------+
C | |# + Ù * / ( )|
o +---+---------------------|
n |#|4 1 1 1 1 1 E|
t |+|2 2 2 1 1 1 2|
e |Ù|2 2 2 1 1 1 2|
n |*|2 2 2 2 2 1 2|
i |/|2 2 2 2 2 1 2|
d |(|E 1 1 1 1 1 3|
o +--------------------------+
14
>> RESPUESTA >>
+-------------------------+
C | |# + - * / ( )|
+---+---------------------|C
n | # | 1 1 1 1 1 E C|
t | + | 2 2 1 1 1 2 +| | se elimina
e | - | 2 2 1 1 1 2- ||
n | * | 2 2 2 2 1 2 *|
| / | 2 2 2 2 2 1 2+ /|
| ( | E 1 1 1 1 1 3 (|#
o +-------------------------+
Ejercicio 4
Entradas
+-------------------------+
C | |# + Ù * / ( )|
o +---+---------------------|
n |#|4 1 1 1 1 1 E|
t |+|2 2 2 1 1 1 2|
e |Ù|2 2 2 1 1 1 2|
n |*|2 2 2 2 2 1 2|
i |/|2 2 2 2 2 1 2|
d |(|E 1 1 1 1 1 3|
o +-------------------------+
15
Ejercicios de recursividad
Ejercicio 1
a) PRåCEDURE p1 (a:INTEèER);
·EèIN
IF a>0
THEN ·EèIN
WRITELN;
p1(a-1)
END
ELSE WRITELN('FIN')
END;
Salida: a, a-1, a-2, ..., 1, FIN
Ejercicio 2
Escribir una función recursiva que calcule la suma de todos los elementos
contenidos en un ARRAY de enteros. No se puede utilizar ning n bucle.
Ejercicio 3
Escribir una función que diga si una palabra es o no capic a (la palabra esta en una
tabla)
16
>> RESPUESTA >>
FUNCTIåN Capicua (Palabra:Tpalabra;Ini,Fin:INTEèER):·ååLEAN;
·EèIN
Long palabra=smms;
Long falta, palabrainvertida,resto;
IF Ini>=Fin
char array[25], array2[25];
clrscr();
printf("Ingrese el numero de letras:");
scanf("%i",&x);
printf("\n");
for(n=1;n<=x;n++)
if(array[n]==array2[n])
{
acum=acum+1;
}
THEN Capicua:=TRUE
ELSE Capicua:=(Palabra[Ini]=Palabra[Fin]) AND (Capicua(Ini+1,Fin 1)
END;
Ejercicio 4
+------------------------------------------------+
| |
THEN ELSE |
I($) ------> I(12) ------> I=1 |
| |
| THEN THEN +----+ |
+----> I(6) -------> I(10) -------> |I($)+--+
| | +----+
| |
+-----> I(4) +------> I(4)
Se produce un bucle infinito, el programa no acaba nunca.
17
>> RESPUESTA >>
·EèIN
IF (2>0) AND (2<11)
THEN Incognita:=$(2Ù1)+$(2+4)
ELSE IF Num<=0
THEN Incognita:=0
ELSE Incognita:=1
END;
+------------------------------------------------+
| |
THEN ELSE |
I(2) ------> I(12) ------> I=$ |
| |
| THEN THEN +----+ |
+----> $(1) -------> $(6) -------> |I(2)+--+
| | +----+
| |
+-----> I(-1) +------> (56)
El resultado de la incognita($) es 56.
Ejercicio 5
a) x:=Concurso (0,3)
b) y:=Concurso(10,Ù7)
c) z:=Concurso(5,5)
1$
>> RESPUESTA >>
X no entra dentro de los parámetros establecidos anteriormente, sin embargo, y si ya que
es cero y lo establecido dice que debe estar entre (10, -7), y z tampoco ya que es de 5 5
ambos positivos y anteriormente nos dice que vale 1 no está en el dentro del rango
Ejercicio 6
1
Ejercicio 7
Implementar una función recursiva que dados dos n meros, dé como resultado la
multiplicación del primero por el segundo. Solo se puede utilizar la función SUCC de pascal
(entero) y no se pueden usar bucles.
a*b = a+a+a+...+a b veces.
a+b = a+1,+1,+1,... ----> Hacer b veces SUCC de a.
FUNCTIåN Suma (a,b:INTEèER):INTEèER;
·EèIN
IF b>m
THEN Suma:=Suma(SUCC(a),b,SUCC(m))
ELSE Suma:=a
END;
20
Ejercicio 8
Calcular el valor máximo de n para el que se pueda ejecutar la llamada P(n) sin que se
desborde la pila.Razonar las respuestas.
PRåCEDURE p(n:INTEèER);
PRåCEDURE Recursivo (m,n:INTEèER);
VAR i:INTEèER;
·EèIN
IF m>1
THEN IF n>1
THEN Recursivo(m,nÙ1)
ELSE Recursivo (mÙ1,mÙ1);
i:=m*n;
WRITELN(i);
END;
·EèIN
IF n>=1
THEN ·EèIN (** p **)
Recursivo(n,n);
WRITELN('fin')
END
END;
21
Ejercicio 9
Invertir una pila sin ninguna estructura auxiliar, y con las operaciones: cima, decapitar,
vacía, introducir.
Ejercicio 10
1) PRåCEDURE p2 (a,b:INTEèER);
·EèIN
IF a MåD b <>0
THEN ·EèIN
WRITELN(a);
p2(a+1,b)
END
END;
2) PRåCEDURE p3(a,b:INTEèER);
·EèIN
IF a>0
THEN p3 (aÙ1,b+a)
ELSE WRITELN(b);
END;
2)
Con el siguiente procedimiento se encuentra la secuencia de n meros regresivos a partir
de a
Por ejemplo si introdujéramos los n meros a=6 los resultados que se obtendrían de
ejecutar el procedimiento serian:
6
5
4
3
2
1
24
a
1. Explique el método de ordenamiento de Quick Sort.
2. Elabore una prueba para el algoritmo de Cota Inferior. Utilizando los datos de un
arreglo de $ elementos.
{
int A[100],j,item,temp,i,k,n;
cout<<" [[::::METåDå DE HEAPSåRT::::]]\n\n"<<endl;
cout<<"Introduce la capacidad de la matriz"<<endl;
cin>>n;
cout<<"Introduce los "<<n<<" numeros"<<endl;
for(int i=1;i<=n;i++)
{cin>>A[i];
}
system("cls");
cout<<" [[::::METåDå DE HEAPSåRT::::]]\n\n"<<endl;
cout<<"Los datos en desorden son:\n";
for(int i=1;i<n+1;i++)
{cout<<A[i]<<"\n";
}
for(k=n;k>0;k--)
25
{
for(i=1;i<=k;i++)
{
item=A[i];
j=i/2;
while(j>0 && A[j]<item)
{
A[i]=A[j];
i=j;
j=j/2;
}A[i]=item;
}temp=A[1];
A[1]=A[k];
A[k]=temp;
}cout<<"Los datos en orden son:"<<endl;
for(i=1;i<=n;i++)
cout<<A[i]<< endl;
system("Pause");
return 0;
}
26
3. Explique las variantes del algoritmo de Quick Sort.
void muestraMax(int);
int maximo(int[],int);
27
main()
{int numeros[200],tam,i,j;
cout<<" [[::::MEAXIMå SECUENCIAL::::]]\n\n"<<endl;
cout<<"Introduce la capacidad de la matriz"<<endl;
cin>>tam;
cout<<"Introduce los "<<tam<<" numeros"<<endl;
for(int i=0;i<tam;i++)
{cin>>numeros[i];
}
system("cls");
cout<<" [[::::MAXIMå SECUENCIAL::::]]\n\n"<<endl;
cout<<"Los datos son:\n";
for(int i=0;i<tam;i++)
{cout<<numeros[i]<<"\n";
}
cout<<"\nEl maximo es:\n";
int m=maximo(numeros,tam);
muestraMax(m);
system("Pause");
return 0;
}
2$
Para el arreglo datos = {3,4,6,2,7,,10,5}
2
a
Ejercicio 1. Recursividad
Escribir un procedimiento recursivo que invierta un árbol, que halle su imagen simétrica.
void Refleja(Arbol· T)
{
Arbol· Ti,Td;
if(T!=NULL){
Ti=PodarHijoIzqda·(Raiz·(T),T);
Td=PodarHijoDrcha·(Raiz·(T),T);
Refleja(Ti);
InsertarHijoDrcha·(Raiz·(T),Ti,T);
Refleja(Td);
InsertarHijoIzqda·(Raiz·(T),Td,T);
}
}
Dado un árbol binario de b squeda, escribir una función que devuelva el nivel del nodo con
mayor clave. Hacer lo mismo para un árbol binario que no sea de b squeda.
{
if (n==NULL)
return 0;
else
return 1+numero(HijoIzqda·(n,T),T)+numero(HijoDrcha·(n,T),T);
}
Recorriendo en orden central, comparamos con la actual la clave anterior para ver si está
repetida.
30
#include<iostream>
#include<conio.h>
#define tam 1000
using namespace std;
bool esEntero(char *cad)
{
bool num=true;
if(atoi(cad) == 0 && cad[0] != '0')
num=false;
int cade=atoi(cad);
if(cade<-1000000000||cade>1000000000)
num=false;
return num;
}
int main()
{
char opc,num[10];
int nodo[tam],i=0,resp=0;
bool salir=true;
do{
system("cls");
cout<<"\tArbol\n\n";
cout<<"\t1) Agregar al arbol\n";
cout<<"\t2) ·alance del arbol\n";
cout<<"\t3) Eliminar\n";
cout<<"\t4) Mostrar\n";
cout<<"\t5) Salir\n";
cout<<endl<<"\tElige una opcion: ";
cin>>opc;
switch(opc)
{
case '1':
system("cls");
do{
cout<<"\n\tIngresa un numero entero: ";
cin>>num;
}while(!esEntero(num));
nodo[i]=atoi(num);
i++;
getch();
break;
case '2':
system("cls");
for(int j=0;j<i-1;j++)
31
{
for(int k=0;k<i-1;k++)
{
if(nodo[k]>nodo[k+1])
{
resp=nodo[k+1];
nodo[k+1]=nodo[k];
nodo[k]=resp;
}
}
}
cout<<"\n\tEl arbol se ha balanceado.";
getch();
break;
case '3':
system("cls");
nodo[i]=0;
i--;
cout<<"\tSe borro la ultima captura.";
getch();
break;
case '4':
system("cls");
for(int h=0;h<i;h++)
{
cout<<"\t"<<nodo[h];
if(h<i-1)
cout<<"\n";
} getch();
break;
case '5':
salir=false;
system("cls");
cout<<"\n\t·YE"<<endl;
getch();
break;
default:
cout<<"\tIntroduce una opcion correcta\n";
getch();
}
}
while(salir==true);
getch();
}
32
Ejercicio 4. Hojas de un árbol
Escribir una función recursiva que calcule el n mero de hojas que hay en un árbol.
Implementar una función que diga si dos árboles binarios son iguales.
33
Ejercicio 6. Hojas al mismo nivel
Dada la misma declaración de árbol, escribir una función ·ååLEANA que determine si
todas las hojas del árbol están al mismo nivel.
bool hoja_nivel(arbol:tarbol){
int nivel;
nivel=0;
hoja_nivel=mismo_nivel(a*,nivel,1)
}
bool mismo_nivel(arbol:tarbol,int primera, int nivelact){
if(arbol==NIL)
mismo_nivel:=true;
else if((arbol^.izq==NIL)&&(arbol^.der==NIL))
if(primera=0)
primera=nivelact;
else if((primera<nivelact)||(primera>nivelact))
mismo_nivel:=fal;
else
mismo_nivel:=true;
else if(mismo_nivel(arbol^.izq,primera,nivelact+1))
mismo_nivel=mismo_nivel(arbol^.der,primera,nivelact+1);
}
Codificar una función recursiva que recibiendo como parámetro un árbol binario de
b squeda de N nodos y un n mero entero K menor o igual que N, devuelve el K-esimo
n mero más pequeño del árbol.
No se puede utilizar ninguna estructura auxiliar. No existen n meros repetidos en el árbol.
La llamada a la función seria:
Contador:=0;
Numero:=Kesimo(Arbol,k,Cont);
int kesimo(arbol:tarbol;int k;int contador){
contador=0;
int numero=kesimo(arbol,k,contador);
if((arbol<NIL)||(arbol>NIL)){
kesimo=kesimo(arbol^izq,k,contador);
if(contador<k){
contador=contador+1;
if(contador==k)
kesimo=arbol^.clave;
else kesimo=kesimo(arbol^.der,k,contador);
}
34
}
}
incluir(A1,A2:Tarbol):·ååLEAN{
if (A2==NIL)
incluir = False;
if (A1^.Clave>A2^.Clave)
incluir=incluir(A1^.izda,A2);
if (A1^.Clave<A2^.Clave)
incluir:=incluir(A1^.dcha,A2);
else
incluir:=Igual(A1,A2);
}
igual(A1,A2:Tarbol):·ååLEAN{
if (A2==NIL)
igual=True;
if (A1==NIL)
igual=False;
if (A1^.Clave=A2^.Clave)
igual=igual(A1^.izda,A2^.izda)&&igual(A1^.dcha,A2^.dcha);
else
igual=False;
}
35
Ejercicio 9. Arbol multicamino
Dada esa declaración de tipo, se pide codificar una fución recursiva que recibiendo un
puntero del tipo Tarbol que apunta a un arbol multicamino, que se sabe que es de
b squeda, determine si dicho árbol cumple las caracteristicas de un arbol ·.Cada página
del árbol nicamente podrá ser visitada una vez.
36
Ejercicio 10. Búsqueda de una clave
Se busca la clave hasta que la encontremos o estemos situados sobre un nodo que sea
una hoja.
int hojas(arbol:tarbol;clave:tclave)
aux:tarbol;
int n_hojas(arbol:tarbol){
if(tarbol==NIL)
n_hojas=0;
else if((arbol^.izq=NIL)&&(arbol^.der=NIL))
n_hojas=1;
else n_hojas:=n_hojas(arbol^.izq)+n_hojas(arbol^.der);
}
{
if(arbol==NIL)
hojas=0;
else if(arbol^.clave:=clave)
hojas:=n_hojas(arbol^.izq)+n_hojas(arbol^.der);
else if((arbol^der=NIL)&&(arbol^izq=NIL)){
aux:=arbol;
arbol:=NIL
aux=0;
hojas:=0;
}
else hojas:=hojas(arbol^.izq,clave)+hojas(arbol^.der,clave);
}
37
En este 3er parcial utilizamos todo lo aprendido en el semestre. Nos sirvió para poder
diseñar algoritmos mas elaborados además de aplicar estos para la solución de problemas.
El trabajo en equipo fue indispensable ya que sin la colaboración de todos en este trabajo
no se hubiera podido realizar.
Con el trabajo realizado se pudo tener un mejor entendimiento, sobre las materias que a
futuro cursaremos los ingenieros en informática y los licenciados en ciencias de la informática.
èracias.
3$
·
@ www.uam.edu.mx
@ www.ccm.itesm.mx/informatica
@ http://www.slideshare.com/arboles
@ Java
Ed. Alfaomega, 3° edición
3