UNIVERSIDAD TECNICA FEDERICO SANTA MARIA

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
4/5/2010
Primer Certamen
Pregunta 1 (50 pts):
struct nombre_completo
{
char *nombre;
char *apellido;
};
a) Diseñe una función que compare dos nombres completos pasados como punteros. Si el
entero flag es 0 la función le da prioridad al apellido, si es 1 le da prioridad al nombre al
comparar. Si el primer nombre (*pnom1) es mayor retorna un número > 0, si es menor < 0,
de otra forma 0:
int strcmp2(char *str1, char *str2)
{
for ( ; *str1==*str2 ; str1++, str2++)
{
if (*str1 == 0) // llegamos al nulo retorna 0
return 0;
}
return *str1 - *str2; // encontramos un caracter distinto retornar la diferencia
}
int name_comp(nombre_completo *pnom1, nombre_completo *pnom2, int flag)
{
int comp1=0;
if ((pnom1==0)||(pnom2==0))
printf("error: pnom1, pnom2 = NULL\n");
// manejar pnom1 y pnom2: 5 pts
if (flag==0)
// usar flag: 10 pts
{ // comparar apellido primero
comp1=strcmp2(pnom1->apellido,pnom2->apellido); // comparar strings:10 pts
if (comp1 != 0)
return (comp1);
else
return (strcmp2(pnom1->nombre,pnom2->nombre));
}
else if (flag==1)
{ // comparar nombre primero
comp1=strcmp2(pnom1->nombre,pnom2->nombre);
if (comp1 != 0)
return (comp1);
else
20-05-2010
1
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
return (strcmp2(pnom1->apellido,pnom2->apellido)); // retornar numero: 5 pts
}
return 0;
}
b) Escriba un main( ) que utilice name_comp( ) dado un input de ejemplo. Muestre el
contenido de todos los parámetros y las variables en el stack usadas en su programa antes
de entrar, justo al entrar, antes de salir y al retornar de esta. Que valor retorna la función?
int main(void)
{
nombre_completo nom1={"Juan","Pereza"};
nombre_completo nom2={"Juan","Perez"};
// inicializar nom1 y nom2: 5 pts
printf("%d\n", name_comp(&nom1,&nom2,1));
// llamar name_comp: 5 pts
return 0;
}
Antes de entrar y al salir de name_comp se ven las variables locales de main solamente:
nom1 - 0x40203c nom1.nombre = “Juan”
// 5 pts
0x402041 nom1.apellido = “Pereza”
nom2 - 0x40204c nom1.nombre = “Juan”
0x402051 nom1.apellido = “Pereza”
Al entrar y al salir de name_comp se ven sus variables locales y argumentos:
comp1 = 0;
// 5pts
pnom1 = 0x27ccf0
pnom2 = 0x27cce8
flag = 1
Pregunta 2 (50 puntos):
a) Usando una lista simplemente enlazada y las variables globales top, cabeza, cola,
num_elementos, implemente una cola FIFO usando estas funciones: int QueueEmpty(),
void QueuePut(nombre_completo *pnom), nombre_completo *QueueGet(). Asuma que
tiene CreaNodo(nombre_completo *pnom).
typedef struct moldenodo
{
nombre_completo clave;
struct moldenodo *proximo;
} nodo, *pnodo;
20-05-2010
2
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
pnodo top=0;
pnodo cabeza=0;
pnodo cola=0;
int num_elementos=0;
// variables 5 pts
int QueueEmpty()
{
return(num_elementos==0);
}
// 5 pts
void QueuePut(nombre_completo *pnom) // 10 pts
{
if (cabeza==NULL)
{
cabeza=CreaNodo(pnom);
cola=cabeza;
top=cabeza;
}
else
{
cola->proximo=CreaNodo(pnom);
cola=cola->proximo;
}
num_elementos++;
}
nombre_completo *QueueGet()
// 10 pts
{
nombre_completo temp_nombre_completo;
temp_nombre_completo.nombre=cabeza->clave.nombre;
temp_nombre_completo.apellido=cabeza->clave.apellido;
cabeza=cabeza->proximo;
free(top);
top=cabeza;
num_elementos--;
return(&temp_nombre_completo); // esta dirección debe ser usada de inmediato al salir
}
// de la función o se puede perder
También sirve (es más correcto del punto de vista del uso de variables en el stack pero es
más lento):
20-05-2010
3
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
nombre_completo QueueGet()
// 10 pts
{
nombre_completo temp_nombre_completo;
temp_nombre_completo.nombre=cabeza->clave.nombre;
temp_nombre_completo.apellido=cabeza->clave.apellido;
cabeza=cabeza->proximo;
free(top);
top=cabeza;
num_elementos--;
return(temp_nombre_completo);
}
b) Implemente main( ) usando las funciones correspondientes para agregar tres
nombre_completo y después saque estos nombres uno por uno. Muestre diagramas con
todas las variables correspondientes y los contenidos del stack a medida que se agregan y
sacan los nombres.
int main(void)
{
nombre_completo nom1={"Juan","Perez"};
// definición variables 5 pts
nombre_completo nom2={"Juan","Pereza"};
nombre_completo *pnom;
nombre_completo tmp_nom;
QueuePut(&nom1);
QueuePut(&nom2);
// uso QueuePut 5 pts
if (!QueueEmpty()){
// uso QueueEmpty 5 pts
pnom=QueueGet();
tmp_nom=*pnom;
}
printf("nombre=%s, apellido=%s\n", tmp_nom.nombre,tmp_nom.apellido);
if (!QueueEmpty()){
pnom=QueueGet();
tmp_nom=*pnom;
}
printf("nombre=%s, apellido=%s\n", tmp_nom.nombre,tmp_nom.apellido);
return 0;
}
Para los diagramas basta con mostrar el contenido de las variables globales: top, cabeza,
cola, num_elementos y las variables locales mostrando el uso del stack (e.g. pnom,
temp_nombre_completo, nom1, nom2, tmp_nom).
// diagrama 5 pts
20-05-2010
4
Descargar