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