Certamen 1 - Departamento de Electrónica

Anuncio
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
28/8/2005
Solución Primer Certamen
Pregunta 1 (20 puntos) :
a.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *palindrome(char *str)
{
int largo = 0;
char *temp;
int i;
if (str == NULL)
return NULL;
largo = strlen(str);
temp = (char *) malloc((2*largo)+1);
for (i = 0; i < largo ; i++)
temp[i] = str[i];
for (i = 0; i < largo ; i++)
temp[i+largo] = str[largo-1-i];
return temp;
}
b.
main()
{
printf("%s\n", palindrome("calabaza"));
}
Tipos de memoria:
- global: fija, no cambia durante programa. e.g.: “calabaza” en main( ).
- stack: variables en funciones, automáticas. e.g.: “str” en palindrome( ).
- heap: memoria pedida dinámicamente. e.g.: “temp” en palindrome( ).
Pregunta 2 (20 puntos) :
a. Compara los dos strings hasta el largo de s o hasta n caracteres.
-- n decremento los caracteres a comparar. En el ejemplo retorna 0.
30-08-2005
1
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
b. itoa esta definido en el libro de K&R (p. 64) :
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n)
n = -n;
i = 0;
do {
s[i++] =
} while ((n /=
if (sign < 0)
s[i++] =
s[i] = ‘\0’;
reverse(s);
< 0)
/* record sign */
/* make n positive */
/* generate digits in reverse order */
n % 10 + ‘0’; /* get next digit */
10) > 0);
/* delete it */
‘-‘;
}
Pregunta 3 (40 puntos) : Una posible solución.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct moldenodo
{
char *clave;
struct moldenodo *proximo;
} *pnodo, nodo;
int intercambio(pnodo lista, char *clave1, char* clave2)
{
pnodo temp=NULL;
pnodo temp2=NULL;
pnodo temp3=NULL;
pnodo pn1=NULL;
pnodo pn2=NULL;
if (lista == NULL)
return 1;
for(temp=lista->proximo; temp->proximo != lista->proximo; temp=temp>proximo)
{ // buscar nodos a intercambiar (hace busqueda desde el 2do nodo en
lista)
if(!strcmp((temp->proximo)->clave,clave1))
pn1 = temp; // encontro el nodo que apunta al nodo 1
else if(!strcmp((temp->proximo)->clave,clave2))
pn2 = temp; // encontro el nodo que apunta al nodo 2
}
if ((pn1 == NULL)||(pn2 == NULL))
{ // temp apunta a la cola (ver el primer nodo para buscar pn1 o pn2...)
30-08-2005
2
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
if(!strcmp((temp->proximo)->clave,clave1))
pn1 = temp; // encontro el nodo que apunta al nodo 1
else if(!strcmp((temp->proximo)->clave,clave2))
pn2 = temp; // encontro el nodo que apunta al nodo 2
if ((pn1 == NULL)||(pn2 == NULL)) // si todavia no los encontramos
return 1;
}
temp=pn1->proximo;
// temp apunta a nodo 1
temp2=pn2->proximo;
// temp2 apunta a nodo 2
temp3 = temp->proximo; // temporal para no perder a lo que nodo1 apunta
pn1->proximo = temp2; // pn1 ahora apunta al nodo 2
pn2->proximo = temp; // pn2 ahora apunta al nodo 1
temp->proximo = temp2->proximo; // nodo1 apunta a lo que apuntaba nodo2
temp2->proximo= temp3; // nodo2 apunta a lo que apuntaba nodo1
if (temp2->proximo==temp2)
temp2->proximo= temp;
if (temp->proximo==temp)
temp->proximo= temp2;
// si nodo2 queda con un
//
nodo2 debe apuntar
// si nodo1 queda con un
//
nodo1 debe apuntar
loop entonces : ...
a nodo1
loop entonces : ...
a nodo1
return 0;
}
pnodo insertar(pnodo lista, char *str)
{
pnodo ult;
pnodo temp = (pnodo) malloc(sizeof(nodo));
temp->clave = (char *) malloc(sizeof(str));
temp->proximo = lista;
strcpy(temp->clave, str);
if (lista != NULL)
{ // hacer que el ultimo nodo apunte al nuevo
for(ult=lista; ult->proximo != lista; ult=ult->proximo)
;
ult->proximo=temp;
}
else
temp->proximo=temp;
return(temp);
}
pnodo borrar(pnodo lista, char *str)
{
pnodo temp;
pnodo del;
if (lista == NULL)
return NULL;
30-08-2005
3
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
for(temp=lista; temp->proximo != lista; temp=temp->proximo)
{ // buscar nodo a borrar (hace busqueda desde el 2do nodo en lista)
if(!strcmp((temp->proximo)->clave,str))
{ // encontre el nodo a borrar
del = temp->proximo;
temp->proximo=temp->proximo->proximo;
free(del->clave);
free(del);
return lista->proximo;
}
}
if(!strcmp((temp->proximo)->clave,str))
{ // si estamos aca el nodo a borrar puede ser el primer nodo en lista
del = temp->proximo; // nodo a borrar (temp->proximo=lista->proximo)
if (temp->proximo == temp->proximo->proximo) // unico nodo
lista->proximo = NULL;
// centinela apunta a NULL
else
{
lista=temp->proximo->proximo; // nuevo primer nodo de lista
temp->proximo=temp->proximo->proximo; // enlazar ultimo al primero
}
free(del->clave);
free(del);
}
return lista->proximo;
}
main()
{
// crear centinela
pnodo lista = (pnodo) malloc(sizeof(nodo));
lista->clave = (char *) malloc(2);
strcpy(lista->clave,"0");
lista->proximo = NULL;
lista->proximo
lista->proximo
lista->proximo
lista->proximo
lista->proximo
=
=
=
=
=
insertar(lista->proximo,
insertar(lista->proximo,
insertar(lista->proximo,
insertar(lista->proximo,
insertar(lista->proximo,
"jose");
"pedro");
"miguel");
"andres");
"juan");
intercambio(lista, "jose", "juan");
lista->proximo
lista->proximo
lista->proximo
lista->proximo
lista->proximo
=
=
=
=
=
borrar(lista->proximo,
borrar(lista->proximo,
borrar(lista->proximo,
borrar(lista->proximo,
borrar(lista->proximo,
"andres");
"jose");
"juan");
"pedro");
"miguel");
// liberar centinela
free(lista->clave);
free(lista);
}
30-08-2005
4
UNIVERSIDAD TECNICA FEDERICO SANTA MARIA
DEPARTAMENTO DE ELECTRONICA
ELO320 Estructuras de Datos y Algoritmos
Pregunta 4 (20 puntos):
a.
&&
: AND lógico, if (A && B)
&
: AND bits, int a=101&100; / dirección de variable, &var
||
: OR lógico, if (A || B)
|
: OR bits, a=101|100;
->
: referenciar puntero, p->clave;
~
: complementar bits, a=~1101
%
: modulo, a=5%2; / especificación de tipo de dato en formato, %d
=
: asignación, a=2;
==
: prueba de igualdad lógica, if (A == TRUE)
!=
: prueba de inigualdad lógica, if (A != TRUE)
b.
make sirve para organizar proyectos de desarrollo de software, el makefile (e.g. test.mak) es
una descripción de los pasos necesarios para compilar los archivos fuente y enlazar los
objetos del proyecto para obtener un ejecutable.
EXE = test
OBJECTS = main.o librerias1.o librerias2.o
CFLAGS = -g
all: $(EXE)
$(EXE): $(OBJECTS)
g++ $(CFLAGS) -o $(EXE) $(OBJECTS)
main.o: main.cc
g++ $(CFLAGS) -c $(INCDIR) -o main.o main.cc
librerias1.o: librerias1.cc
g++ $(CFLAGS) -c $(INCDIR) -o librerias1.o
librerias1.cc
librerias2.o: librerias2.cc
g++ $(CFLAGS) -c $(INCDIR) -o librerias2.o
librerias2.cc
30-08-2005
5
Descargar