Está en la página 1de 20

UNIVERSIDAD ANDINA DEL CUSCO

REDES Y COMUNICACIÓN DE DATOS II


GUIA DE LABORATORIO
ECP 1 de 20

I. TEMA : APUNTADORES, ESTRUCTURAS Y UNIONES

II. OBJETIVOS DE LA PRACTICA

Al finalizar la práctica, el estudiante:

1. Explica el uso de apuntadores para referenciar variables en el lenguaje de


programación C.
2. Explica el concepto de estructuras y uniones y diferencia sus características.
3. Escribe programas en el lenguaje de programación C, utilizando apuntadores,
estructuras y uniones para resolver problemas de carácter práctico.

III. TRABAJO PREPARATORIO

Para un trabajo con mejores resultados, es imprescindible que el estudiante:

1. Tenga familiaridad con el lenguaje de programación C.


2. Tenga conocimientos básicos de estructuras de datos.
3. Tenga conocimientos básicos sobre el funcionamiento del sistema de memoria real.

IV. MATERIALES NECESARIOS.

Para el desarrollo de la presente práctica es necesario contar con:

1. Sistema operativo Linux


2. Compilador gcc1 instalado
3. Editor de textos

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 2 de 20

V. MARCO TEORICO.

APUNTADORES

Un apuntador es una variable que contiene la dirección, en memoria, de un objeto


específico. Este tiene las siguientes cualidades:

1. Un apuntador puede almacenar la dirección de cualquier objeto de datos válido,


incluyendo un arreglo, una variable singular, una estructura y una unión.
2. Un apuntador puede almacenar la dirección de una función.
3. Un apuntador no puede almacenar la dirección de una constante, con una posible
excepción: una constante string tiene una dirección, que puede almacenarse en
una variable apuntador indirectamente (usualmente como resultado de ser pasado
como un parámetro de una llamada a una función).

Los apuntadores permiten acceder a cualquier bloque de memoria que se desee, pero
existen restricciones:

 Debe tener permisos del sistema operativo para acceder a la memoria (la
memoria accedida debe haber sido asignada a su programa).
 Debe saber dónde se ubica el bloque de memoria que quiere acceder. Para
muchas aplicaciones, saber esta información es fácil porque la memoria habrá
sido asignada al programa, y le será dado al programa la dirección de memoria.
Si la memoria es un bloque común, como un buffer de video, la memoria será
ubicada en una posición fija o un apuntador a la memoria se encontrará en una
ubicación conocida.

Para obtener la dirección de una variable singular y un arreglo, o el elemento en un


arreglo, se debe poner como prefijo al nombre de la variable el operador &.

Cuando se usa apuntadores, se debe indicar al compilador el tamaño del objeto al cual
se hará referencia. Por ejemplo, un apuntador a un carácter (char) apunta a un elemento
de 8 bits, un apuntador a un entero (int) apunta a un elemento de 16 bits, un apuntador
a un entero largo (long) apunta a un elemento de 32 bits. Un apuntador puede
incrementarse o decrementarse para referenciar a un siguiente elemento, por lo que el
compilador necesita esta información porque así podrá determinar la distancia a la cual
se encuentra el siguiente objeto que debe ser referenciado.

Cuando un apuntador se incrementa o decrementa, siempre lo hace en un valor igual a


sizeof() del tipo del apuntador.

DECLARACION DE APUNTADORES

Cuando se declara un apuntador, se utiliza un modificador de tipo, para indicar que este
apuntará a una variable de ese tipo, no que el apuntador será de ese tipo. Por ejemplo:

int contador = 0; //variable de tipo entero

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 3 de 20

int *ptrContador; //apuntador a un entero

ptrContador = &contador; //ptrContador apunta a contador

En este fragmento de código se ha declarado la variable entera denominada contador.


La segunda variable ptrContador, almacena la dirección de contador.

Gráficamente, la declaración de las variables y la asignación de valores se muestran a


continuación:

int contador = 0;
int *ptrContador;

ptrContador = &contador

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 4 de 20

En el siguiente ejemplo, se crean dos variables. Primero se crea e inicializa una cadena
de caracteres llamada cadena y luego se crea un apuntador a dicha cadena.

char cadena[20] = {“Esto es una cadena”};


char *ptrCadena;

ptrCadena = cadena;
ptrCadena = &cadena;
ptrCadena = &cadena[0];

En los tres casos de asignación, ptrCadena contiene el mismo valor y siempre


contiene un apuntador al primer carácter de cadena. Sin embargo existen diferencias en
estas asignaciones:

La primera asignación asigna la dirección del arreglo a ptrCadena. Como resultado, el


apuntador apunta al primer elemento del arreglo.

En la segunda asignación, el compilador asigna la dirección del arreglo a ptrCadena.


En este caso, también se apuntará al primer elemento del arreglo. La diferencia es que,
con un arreglo de más de una dimensión, el compilador tomará en cuenta el indexado.

La tercera asignación asigna un apuntador a un elemento específico en el arreglo.


Algunos compiladores verifican que el elemento especificado está dentro de los límites
del arreglo.

INDIRECCION

El operador * de C se denomina operador de indirección. Este le dice a C que utilice el


valor contenido en memoria referenciado por la variable apuntador.

Por ejemplo, luego de ejecutarse las siguientes instrucciones:

int contador = 13;


int *ptrContador;
ptrContador = &contador;

La variable ptrContador contiene la dirección de la variable contador y


*ptrContador hace referencia al valor almacenado en contador, es decir el entero
13.

En el siguiente ejemplo:

int primerEntero = 100;


int segundoEntero = (int *) primerEntero;

Al terminar la ejecución de la segunda instrucción, la variable segundoEntero


contiene 100, el valor almacenado por primerEntero, ya que el casting (int *)
hace que se devuelva el valor del elemento apuntado por la variable primerEntero.

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 5 de 20

ESTRUCTURAS

Una estructura es una agrupación de variables organizadas de forma que pueden ser
referidas por un mismo nombre. A diferencia de los arreglos, las variables que
conforman una estructura pueden ser de tipos diferentes.

Comúnmente, una estructura se utiliza para la creación de tipos de datos compuestos.


Por ejemplo, un punto geométrico en el plano, se define por sus coordenadas x e y. Un
tipo de datos que describa un punto geométrico necesitará incluir dos variables: la
coordenada en X y la coordenada en Y. Una vez definido este tipo podremos crear
variables de tipo punto geométrico.

DECLARACIÓN DE ESTRUCTURAS

Las estructuras se declaran utilizando la palabra reservada struct

struct <Nombre del tipo de la estructura>


{
<Tipo de datos> <Nombre del campo>
<Tipo de datos> <Nombre del campo>

};

Por ejemplo:

struct punto
{
int x;
int y;
};

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
};

CREACION DE VARIABLES DE TIPO ESTRUCTURA

Para declarar una variable de tipo <Nombre del tipo de la estructura> se


debe utilizar la siguiente regla sintáctica:

struct <Nombre del tipo de la estructura> <Nombre de


variable struct>;

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 6 de 20

Por ejemplo:

struct punto Origen; //Crea la variable Origen de tipo


punto

struct trabajador fijo, temporal; //Crea las variables


fijo y temporal, ambas
de tipo trabajador

Alternativamente, las variables pueden declarase al momento de definirse la estructura:

struct <Nombre del tipo de la estructura>


{
<Tipo de datos> <Nombre del campo>
<Tipo de datos> <Nombre del campo>

} <Nombre de variable>;

Por ejemplo:

struct punto
{
int x;
int y;
} Origen; //Se define y crea la variable Origen de tipo
punto

struct trabajador
{
char nombre[20];
char apellidos[40];
int edad;
char puesto[10];
} fijo, temporal; //se define y crea las variables fijo
y temporal, ambas de tipo trabajador

ACCESO A LOS CAMPOS DE UNA ESTRUCTURA

Para acceder a los campos de una estructura utilizamos la siguiente regla:

Asignación de valores:

<Nombre de variable struct>.<Campo> = <Valor>

Por ejemplo:

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 7 de 20

Origen.x = 0;

temporal.edad=25;

Lectura de valores:

<Variable> = <Nombre de variable struct>.<Campo>

Por ejemplo:

int coordenadaX = Origen.x;

UNION

Similar a una estructura. Con la diferencia que mientras que una estructura reserva
espacio para cada variable, una unión reserva especio solamente para la variable más
grande y ese espacio es compartido por todas las variables. Como resultado, solo una
variable puede ser almacenada a la vez.

La definición de una unión, así como el acceso a sus campos se realiza de la misma
forma en que se gestionan las estructuras.

DECLARACION DE UNA UNION

union <Nombre del tipo de la union>


{
<Tipo de datos> <Nombre del campo>
<Tipo de datos> <Nombre del campo>

};

Por ejemplo

union parametros
{
int nro;
int *ptrNro;
};

Crea la unión denominada parámetro, que contiene dos campos.

CREACION DE VARIABLES DE TIPO UNION

La forma de crear variables del tipo de una unión obedece al siguiente formato:

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 8 de 20

union <Nombre del tipo de la union> <Nombre de variable


union>;

Por ejemplo:

union parametros primerElemento; //Crea la variable


primerElemento de tipo
parámetros.

Como en el caso de las estructuras, se puede utilizar la forma alternativa:

union parametros
{
int nro;
int *ptrNro;
} primerElemento; //define la unión parámetros y
crea la variable primerElemento de
tipo parametros.

ACCESO A LOS CAMPOS DE UNA UNION

Para acceder a los campos de una unión utilizamos la siguiente regla:

Asignación de valores:

<Nombre de variable union>.<Campo> = <Valor>

Por ejemplo:

primerElemento.nro = 10;

primerElemento.ptrNro = &primerElemento.nro;

En este ejemplo, luego de ejecutarse la segunda asignación, el valor del campo nro será
sobrescrito por su dirección.

Lectura de valores:

<Variable> = <Nombre de variable union>.<Campo>

Por ejemplo:

int x = primerElemento.nro;

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 9 de 20

VI. DESARROLLO DE LA PRACTICA

1. Escriba un programa que muestre el contenido de una variable de manera directa y


mediante un apuntador al mismo, programa debe mostrar, además, la dirección de la
variable utilizando el operador & y el valor del apuntador.

Solución

//Nombre : apuntadores
//Proposito : Muestra el contenido de una variable
de manera directa e indirecta
//Autor : Edwin Carrasco
//FCreacion : 23/11/2011
//FModificacion : 21/02/2013

#include <stdio.h>

main ()
{

//Variables
int var = 300;
int *ptr; //Apuntador a una variable entera
ptr = &var; //Inicialización de puntero. ptr almacena la
direccion de var

//Mostrar el valor de "var" directa e indirectamente


printf("\nAcceso Directo: var = %d", var);

printf("\nAcceso Indirecto (mediante su apuntador): var =


%d", *ptr);

//Mostrar la direccion de memoria de "var" de dos maneras


printf("\nDireccion de var mediante el operador &: %d",
&var);

printf("\nDireccion de var mediante el valor almacenado en


su apuntador: %d", ptr);
}

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 10 de 20

2. Escriba un programa que muestre los elementos de tres arreglos que almacenen
datos de tipo short, int y doublé. Además de los datos almacenados, el programa
debe mostrar las direcciones de memoria en que se almacenan estos datos.

Solución

//Nombre : dirArreglos
//Proposito : Muestra las direcciones y contenido de
los elementos de arreglos de tipos
short, int y double.
//Autor : Edwin Carrasco
//FCreacion : 21/02/2013
//FModificacion : ---

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

int main()
{
//Variables
int i;
short arreglo_s[10];
int arreglo_i[10];
double arreglo_d[10];

//Indicar proposito del programa


printf("ESTE PROGRAMA MUESTRA LAS DIRECCIONES Y CONTENIDOS
DE LOS ELEMENTOS\nDE TRES ARREGLOS DE TIPOS SHORT,
INT Y DOUBLE\n\n");

//Inicializar generador de numeros aleatorios


srand(time(NULL));

//Crearemos datos aleatorios


for(i = 0; i < 10;i ++)
{
arreglo_s[i] = (short)(1+rand()%(999));
arreglo_i[i] = (int)(1+rand()%(99999));
arreglo_d[i] = (double)((1+rand()%(999999999-1))*0.1f);
}

//Mostrar salida
printf("\n==============================");

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 11 de 20

printf("==============================\n");

printf("\t\tSHORT\t\tINT\t\tDOUBLE\n");
printf("\t Direc : cont | Direc : cont | Direc:
cont");

printf("\n==============================");
printf("==============================");

//Imprimir la direccion de cada elemento de cada arreglo


for (i=0; i<10; i++)
{
printf("\nElemento %d| %d:%4d | %d:%6d | %d:%8.2f", i,
&arreglo_s[i], arreglo_s[i], &arreglo_i[i],
arreglo_i[i], &arreglo_d[i], arreglo_d[i]);
}

printf("\n=============================");
printf("===============================");

//Salir
return 0;
}

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 12 de 20

3. Escriba un programa que halle la distancia entre dos puntos definidos por sus
coordenadas (x, y) en el espacio. Las coordenadas se deben almacenar en una
estructura.

Solución

//Nombre : distancia
//Proposito : Calcula la distancia entre dos puntos
en el espacio
//Autor : Edwin Carrasco
//FCreacion : 21/02/2013
//FModificacion : ---

#include <stdio.h>
#include <math.h>

//Variables globales
struct coordenada{
int x;
int y;
};

main ()
{
//Variables locales
struct coordenada punto1;
struct coordenada punto2;
double distancia;

//Indicar el proposito del programa


printf("ESTE PROGRAMA DETERMINA LA DISTANCIA ENTRE DOS
PUNTOS\n");

printf("Ingrese la coordenada x del punto 1: ");


scanf("%d", &punto1.x);

printf("Ingrese la coordenada y del punto 1: ");


scanf("%d", &punto1.y);

printf("Ingrese la coordenada x del punto 2: ");


scanf("%d", &punto2.x);

printf("Ingrese la coordenada y del punto 2: ");


scanf("%d", &punto2.y);

//Procesar
distancia = sqrt(pow(punto2.x-punto1.x,2) +
pow(punto2.y - punto1.y,2));

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 13 de 20

//Mostrar resultados
printf("La distancia entre los puntos ingresados es
%.2f\n", distancia);
}

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 14 de 20

4. Escriba un programa que permita la administración de un catálogo de libros. Los


datos de un libro se almacenan en una estructura.

Solución:

//Nombre : libreria
//Proposito : Administra un catalogo de libros
//Autor : Edwin Carrasco
//FCreacion : 01/12/11
//FModificacion : --

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

#define tam 5 //Nro máximo de libros en el catalogo

struct tLibro
{
char titulo[21];
char autor[21];
};

void leerDatos(struct tLibro *l)


{
printf("Ingrese el titulo: ");
scanf("%s", l->titulo);

printf("Ingrese el autor: ");


scanf("%s", l->autor);

void mostrarDatos(struct tLibro *l)


{
printf("El titulo: %s\n", l->titulo);
}

bool buscarTitulo(struct tLibro c[], char criterio[])


{
int i;
for(i=0;i<tam;i++)
{
if(strcmp(c[i].titulo, criterio)==0)
return true;
}
return false;
}

void mostrarMenu()

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 15 de 20

{
puts("******** SISTEMA DE GESTION DE LIBROS ***********");
puts("* *");
puts("* 1. Insertar Libros *");
puts("* 2. Mostrar Catalogo *");
puts("* 3. Buscar por titulo *");
puts("* 4. Buscar por autor *");
puts("* 5. Salir *");
puts("* *");
puts("*************************************************");
}

main()
{
//Variables
struct tLibro catalogo[tam];
char datos[21];
int opcion=0;
int i=0;
int j;

do
{
//Indicar que hace el programa
mostrarMenu();

//Leer datos
printf("\nIngrese una opcion: ");
scanf("%d",&opcion);

switch (opcion)
{
case 1:
//Agregar titulos
if (i < tam)
{
leerDatos(&catalogo[i]);
i++;
}
break;
case 2:
//Mostrar catalogo
for(j = 0; j < tam; j++)
mostrarDatos(&catalogo[j]);
break;
case 3:
//Buscar por titulo
printf("Ingrese el titulo del texto: ");
scanf("%s", &datos);
puts(datos);
if(buscarTitulo(catalogo,datos))

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 16 de 20

printf("El titulo existe en la


biblioteca\n\n");
else
printf("El titulo no existe en la
biblioteca\n\n");
break;
case 4:
break;
case 5:
break;
default:
puts("La opcion no es correcta!!");
break;
}
}while (opcion != 5);
}

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 17 de 20

5. Escriba un programa que almacene el salario de un trabajador en soles y dólares


utilizando una unión

Solución

//Nombre : salario
//Proposito : Almacena el salario de un trabajador
//Autor : Edwin Carrasco
//FCreacion : 21/02/2013
//FModificacion : ---

#include <stdio.h>

main ()
{
//Variables
union Salario
{
int enSoles;
float enDolares;
};

union Salario SalarioJuan;

//Procesar
SalarioJuan.enSoles = 2580;

//Mostrar resultados
//Imprimir en pantalla el Salario de Juan en Soles
printf("Salario de Juan en Soles = %d\n",
SalarioJuan.enSoles);

// Imprimir en pantalla el Salario de Juan en Dolares


SalarioJuan.enDolares = SalarioJuan.enSoles / 2.5;
printf("Salario de Juan en Dolares = %.3f \n",
SalarioJuan.enDolares);
}

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 18 de 20

VII. EJERCICIOS PROPUESTOS.

1. Modifique el programa de administración de catálogo para que permita la búsqueda


por autor.
2. El programa de gestión de catálogo de libros no permite que los nombre de autor o
los títulos puedan tener nombres con espacios. Modifique el programa para que esto
sea posible.
3. Modifique el programa de gestión de catálogo de libros para que se permita agregar
una cantidad ilimitada de libros (utilice listas dinámicas).
4. Escriba un programa que calcule la ruta mínima entre dos nodos en una red de N
equipos con enlaces entre los mismos definidos por el usuario. El programa debe
mostrar los nodos que conforman la ruta. La red debe ser representada mediante un
arreglo.
5. Escriba un programa que calcule la ruta mínima entre dos nodos en una red de N
equipos con enlaces entre los mismos definidos por el usuario. El programa debe
mostrar los nodos que conforman la ruta. La red debe ser representada mediante
estructuras dinámicas.
6. Alcance al docente el código de las soluciones en un CD, cuidando que cada
programa contenga el encabezado que documente los datos del mismo.

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 19 de 20

VIII. EVALUACION

La evaluación de las actividades realizadas en la presente guía de práctica se hará en


función de la siguiente tabla:

SESION 01 SESION 02 SESION 03


ACTIVIDAD
Procedimental Procedimental Procedimental
Ejecución de ejercicios de ejemplo 10 -- --
Resolución del ejercicio propuesto 01 05 -- --
Resolución del ejercicio propuesto 02 05 -- --
Resolución del ejercicio propuesto 03 10 --
Resolución del ejercicio propuesto 04 10 --
Resolución del ejercicio propuesto 05 18
Resolución del ejercicio propuesto 06 02
TOTAL 20 20 20

17/08/2017
UNIVERSIDAD ANDINA DEL CUSCO
REDES Y COMUNICACIÓN DE DATOS II
GUIA DE LABORATORIO
ECP 20 de 20

IX. BIBLIOGRAFIA

1. Deitel & Deitel, “Como Programar En C/C++”. 2da edición. Prentice Hall
2. Hipson, P. “Advanced C”. Sam Publishing. 1992
3. Joyanes L., “Microsoft C/C++ 7. Manual De Bolsillo”. Ed. McGraw Hill 1994
4. Marquez, M. “UNIX. Programación Avanzada”. 2da edición. Editorial Alfaomega
2001.
5. Prata S. “C++ Primer Plus” 5ta edición. Editorial SAMS 2005.

17/08/2017

También podría gustarte