Está en la página 1de 18

TIPOS DE DATOS:

EJERCICIOS

ESTRUCTURAS DE DATOS
www.espol.edu.ec
www.fiec.espol.edu.ec
RECUERDE * Y &
¨ Si tengo una variable y
i Deseo obtener su dirección de memoria antepongo &
Si tengo un puntero y
e Deseo conocer que almacena, antepongo *
e Son operadores que permiten conversión de datos
int *pta, a=5, b;
pta = &a; //a es de tipo int, y con el & se
obtiene un valor int *
b = *pta; // pta es de tipo int *, y con el *
se obtiene un valor int
ERRORES int *pta, *ptb, a, b;

Ð Encuentre los errores en cada línea:


Que pta apunte a a pta = *a;
Que ptb apunte al mismo sitio que pta ptb = &pta;
Que pta cambie de contenido a 8 pta = 8;
Que ptb cambie de contenido aumentando 3 unidades ptb = ptb + 3;
Que ptb apunte a NULL ptb = &NULL;
Que b almacene 8 b = 8;
Que ptb apunte a b *ptb = b;
Que ptb cambie de contenido a a + 10 ptb = a + 10;
Imprima la suma de los contenidos de pta y ptb printf(“%d”, pta +
ptb);
EL DESTINO DE UN PUNTERO
Un puntero puede tener dos posibles caminos durante su
existencia
Puede “apuntar” a un espacio de memoria de otra variable.
int *a, b = 10;
a = &b; //a no tiene memoria propia, es un “ESPEJO” de b

o Puede “apuntar” a un espacio de memoria propio. Ejemplo


int *a, b = 10;
a = malloc (sizeof (int));
*a = b; //a almacena en su propio cajón
de memoria el mismo valor que b
RESULTADOS Y ERRORES
int *ptc, b;
O Descubra los errores b = malloc ( sizeof ( int ) );
*b = 8;
char *pta, ptc = malloc(sizeof(int));
car1; ptc = b+5;
*pta = car1; free(*ptc);
b = *ptc + 10;
s Determine el resultado que almacenan las variables
al final int *ptc, *ptn, b=20;
ptc = &b;
ptn = malloc ( sizeof (int));
*ptn = b + 15;
*ptc = *ptc -1;
ptc = ptn;
*ptc = 2;
ARREGLOS Y PUNTEROS:
RESULTADOS
int AE[4] = {4,1,5,2}, *p;
int i;
p = AE;
for(i = 0; i < 4; i++){
p[i] = p[i] + 3;
}
p = malloc(sizeof(int)*9);
for(i = 0; i < 9; i++){
p[i] = 5;
}
ARITMETICA DE PUNTEROS:
CAMBIAR PROGRAMA
N Cambie el código anterior para usar matemática de
punteros
int AE[4] = {4,1,5,2}, *p;
int i;
p = AE;
for(i = 0; i < 4; i++){
p[i] = p[i] + 3;
}
p = malloc(sizeof(int)*9);
for(i = 0; i < 9; i++){
p[i] = 5;
}
ARITMETICA DE PUNTEROS:
RESUELVA
N Declare un puntero a char llamado B y otro llamado C
r Asígnele memoria a B para 30 caracteres
e Copie en B una palabra cualquiera
l Usando aritmética de punteros, modifique todos los
caracteres de la cadena para que pase de minus. a mayus.
Usando aritmética de punteros C debe apuntar al carácter
de la mitad de la cadena B
a Imprima C, que sale en pantalla?
ARITMETICA DE PUNTEROS:
RESULTADOS
int B[] = {3,4,1,2,7,12,-4};
float f = 4.234, *ptf;
*(B+3) = *B + 15;
ptf = &f;
*B = (int)(*ptf);
f = *ptf + 20;
*(B + 5) = (int)(*ptf);
ARREGLOS DE PUNTEROS
E Un arreglo puede ser de entero, de real, o de puntero a
enteros, o puntero a real, etc.
r Ejemplo:
r int *A[4];
N A es un conjunto de punteros, cada uno puede apuntar a donde
desee,
A otras variables o,
s Comprar uno o varios cajoncitos propios
for(i = 0; i < 3; i++){
A[i] = malloc (sizeof (int) * 3);
}
A[i] = NULL;
ARREGLOS DINAMICOS DE
PUNTEROS
O Al declarar por ejemplo:
e int **A;
& Es un puntero a puntero a entero.
p Como podríamos usar esta variable?
s Que formas habría para manipularla y utilizarla?
EJEMPLO
int **A;
A = malloc(sizeof(int *) * 10);
for(i = 0; i <10; i++){
A[i] = malloc(sizeof(int));
*A[i] = 0;
}

int **A;
A = malloc(sizeof(int *) * 10);
for(i = 0; i <10; i++){
A[i] = malloc(sizeof(int)*5);
for(j = 0; j<5; j++){
A[i][j] = 6;
}
}
EJERCICIOS DE REPASO
P Escriba una función que dado un numero, lo
modifique invirtiendo sus dígitos
i Escriba una función que dada una matriz de NxN,
permita conocer si la diagonal esta llena de
valores diferentes de 0 y si ese es el caso,
calcule la suma de los mismos.
d Escriba una función que dado un arreglo, retorne
otro nuevo solo con los elementos pares
EJERCICIOS DE REPASO
P Escriba una función recursiva que dada dos
cadenas, permita conocer si ambas son iguales.
Escriba una función recursiva que busque un
elemento en un arreglo
r Escriba una función recursiva que determine si
una palabra es o no un palíndromo, sin usar
string y usando aritmética de punteros
EJERCICIOS DE REPASO
P Defina una estructura para representar un termino en un
polinomio. Ejemplo: 3x5.
l Cree una función MultiplicarEscalar que dado un término lo
modifica multiplicándolo por un valor entero.
i Defina una estructura para representar a un polinomio
c Conjunto de n términos
r Escriba una función Evaluar para que dado un polinomio
de n términos y un valor entero, retorne el valor entero
resultante de la evaluación del polinomio.
VOID *
¨ Void significa el vacío, la nada
l En lenguaje C puede tener dos usos
e Indica que una función no retorna NADA, cuando void
es utilizado como tipo de dato de retorno
o void ImprimirEstudiante(Estudiante e);
u Como un puntero genérico, cuando es utilizado como
puntero (void *)
g Un puntero genérico es aquel que puede apuntar a cualquier
tipo de dato, sin ningún problema
EJEMPLOS DE VOID *
char car1=‘B’, car2;
void *ptg;
ptg = &car1;
car2 = *((char *)ptg) + 3;

char cad[20], car3;


void *ptg;
ptg = cad;
strcpy(cad, “Ejemplo”);
car3 = *((char *)(ptg) + 3) + 5;
PARA PENSAR
Ð Se podría declarar un arreglo de void *?
a Que utilidad tendría?