Está en la página 1de 34

TIPOS DE DATOS

ESTRUCTURAS DE DATOS

OBJETIVOS
Manejo correcto y apropiado de punteros y reserva

de memoria dinmica
Reconocer el tipo de dato void y void * en C como

una herramienta de potencial importancia


Diferenciar entre arreglos y estructuras Utilizar correctamente las estructuras, punteros a

estructuras, arreglos de estructuras, etc.

DATO
Informacin en bruto, sin ningn significado Dado un enunciado, evento o accin, los datos

Permiten representar sus actores o participantes


Analizndolos, se podr obtener resultados deseados El estudiante de nombre Pedro Velez de 22 aos, tiene un promedio de 7.5
Nombre: Pedro Velez Edad: 22 Promedio: 7.5 -> Conjunto de Caracteres -> entero -> real

Analicemos el siguiente hecho:

Podemos tomar los siguientes datos


INFORMACIN
Es el resultado deseado luego de procesar los datos Los datos, al ser procesados, se convierten en

informacin til o resultados.


Datos de salida(se muestran en el monitor)
Juan, Perez
Pedro, Rodriguez Luis, Pozo

Empleado Juan, Perez

Horas 160

Pedro, Rodriguez
Luis, Pozo Valor por hora = $2

155
120

$320
$310 $240

Datos de entrada(ingresados x teclado)

Procesamiento: Calcular salarios

Cmo representar los datos?


Los seres humanos: Usamos lenguaje natural o smbolos Ejemplo:
Para representar nmeros, usamos el sistema decimal Para representar palabras, usamos el abecedario

La computadora: Usa conjuntos de 1s y 0s El dato mas pequeo en el computador es

Un 1 o un 0 -> bit

El conjunto de 8 bits -> 1 byte

TIPOS DE DATOS
Los datos se clasifican en TIPOS Son los diferentes dominios existentes. Ejemplo: Edad, Ao de Nacimiento, Numero de multas

Tienen dominio numrico

Nombre, Direccin, Num. Cedula,

Caen en el dominio de la informacin tipo texto

Y las operaciones permitidas para dicho dominio

Un conjunto de valores y operaciones definidas solo para esos valores

RECORDAR
Un tipo de dato es el conjunto de valores Al que puede pertenecer una constante Que puede asumir una variable o expresin Que puede ser generado por una funcin De una constante, variable o expresin Se puede deducir su tipo de dato Ya sea de su forma o de su declaracin Sin necesidad que se ejecute ningn proceso Las operaciones entre datos Necesitan participantes (argumentos) de determinado tipo Producen resultados de otro o el mismo tipo

TIPOS DE DATOS BASICOS

Los podemos distinguir fcilmente, estn en el diario vivir:

El Sr. Vera de 63 aos tiene cedula No. 0908815533, y paga $120 de impuestos

Son tipos de datos simples

Que permiten representar informacin numrica, caracteres, etc.


CONJUNTO DE VALORES Negativos y positivos sin decimal Negativos y positivos, con decimal Verdadero o Falso(1 o 0) Letras, nmeros, especiales, juntos forman una cadena OPERACIONES Sumar, restar, dividir, multiplicar, residuo Sumar, restar, dividir, multiplicar And, Or, Not Sumar carcter + entero restar, multiplicar por entero

NOMBRE Enteros Reales Lgicos Caracteres

Y EN LA COMPUTADORA?
Solo vienen integrados los tipos de datos bsicos 1000 En la computadora

Los datos (nmeros y letras) se almacena en estos

1001 1002 Cada byte es un casillero y tiene una direccin en memoria 1003

casilleros
Cuantas casilleros ocupa un dato?

Depende de su tipo y del hardware de la computadora Un entero puede ocupar casillas de hasta 4 bytes Un doble siempre ocupara mas, por su mayor precisin

PERO, un carcter SIEMPRE ocupara casillas de 1 byte

ALMACENANDO DATOS

TIPO DE DATO

#bytes

Representacin interna

En ANSI C

ENTEROS

Positivos: conjunto de bits 38 -> 00100110 Negativos:Complemento a Dos -38 -> 11011001 Mantisa x base(exponente) 387.53 -> 38753 x 10-2 00000000100101110110000111111110 ASCII 11000000 -> A

int long

REALES

8 16 1

float double char

CARACTERES

DECLARACION DE VARIABLES Al declarar una variable se


le asigna espacio en memoria y una direccin para dicho espacio

Una declaracin de variables en C incluye Tipo de dato y Nombre de variable(identificador) Ejemplo: int a;
int a, b; float c;

char c;

Para que se declaran variables? Especifica cuanta memoria debe reservarse y Como se van a interpretar dichos datos
f = a + b

100 101 102 103 104

4 bytes, dir: 100 1 byte, dir: 104

Es una suma de enteros, que al final se convierte a real

DIRECCIONES DE MEMORIA

Las variables

Tienen direcciones de memoria En lenguaje C Se usa el operador & de direccin


int a; a = 3; printf(Valor:%d Dir: %d, a, &a);

Si deseamos conocer dicha direccin



1000 1001 1002 1003

Ejemplo:

&a es 1000

Un puntero

Es una variable que puede almacenar direccin de memoria

DECLARACION DE PUNTEROS
int *p;
Un tipo de dato

El puntero solo podr almacenar direcciones de memoria de variables del tipo especificado 1000 Se pueden definir punteros de cualquier1001 tipo: 3

float *pf; char *pc;

1002 1003 1004 1005

1000 pt

Un identificador que siempre va antecedido del

operador *

int *pt, x; x = 3; pt = &x;

pt almacena la direccin de x, se dice que pt apunta a x

CONSULTANDO CONTENIDO
Si un puntero apunta a una variable

A travs del puntero se puede llegar a conocer todo sobre la variable char c, *pc1, *pc2; Ejemplo:
pc1 = &c;

Si quiero conocer la direccin, uso directamente el puntero


printf(%d, pc1); //Imprimo la dir. Almacenada por pc1 pc2 = pc1; //pc2 almacena la misma dir. que pc1

Si quiero conocer el contenido al que apunta un puntero, uso el Es equivalente a : operador *, sobre dicho puntero printf(%c, c);
c = A printf(%c, *pc1); *pc1 = N printf(%c,c);
Es equivalente a : c = N Imprime N pues c ya cambio

Ejercicio

EJERCICIO EN CLASE
int x,y; int *p1,*p2; x = -42; y = 163; p1 = &x; p2 = &y; *p1 = 17; *p2 = x+5; *p1 = *p2; p1 = p2; p1 = NULL; p2 = NULL;
Es equivalente a escribir x = y; Esto indica que p1 ahora apunta a la misma variable que p2

1000
1004 1008 1012

-42 17 22 163 22 1000 1004 0 1000 1004 1004 0 1004

y p1
p2

Esto es equivalente a encerar el puntero, y decir que no apunta a ninguna variable

PASO DE PARAMETROS
Las funciones son porciones de cdigo

Ejecutan una tarea especifica


Usualmente toman datos de entrada->parmetros Y retornan un valor

Los parmetros se pueden enviar de dos formas:


Por valor Por referencia

PASO POR VALOR


La funcin no recibe la variable enviada Recibe una copia Similar a cuando va al hacer algn tramite y le piden al cdula
No entrega la cdula verdadera Entrega una copia x = 5 La verdadera estar segura, aunque quemen y destruyan la printf(%d\n,x); copia Se imprime 5, el valor de x no

Ejemplo:

funct(x); printf(%d\n,x);

cambia aunque la funcin haya intentado modificarla

void funct(int y){ y = y+1; printf(%d\n,y); }

PASO POR REFERENCIA


Aqu si la funcin recibe exactamente la variable

enviada
No hay copias Si algo se le hace al parmetro, se le esta haciendo a la variable Para esto, se usan punteros = 5 La funcin x trabaja con un puntero Se a imprime la variable enviada 6, el valor de x cambi

Sabe

Ejemplo:
Ejercicio

printf(%d\n,x); todo sobre esa variable y funct(&x); printf(%d\n,x);

dentro de la funcin se pude acceder a travs de *

void funct(int *py){ *py = *py+1; printf(%d\n,*py); }

TIPOS DE DATOS COMPUESTOS


En ocasiones se necesitan

tipos de datos mas complejos, y estructurados

TIPO ARREGLOS

FORMATO DECLARACION

Bytes

int arrEj[10];

10*2 = 20 2 + 100 = 102

Variables que almacenen mas de un valor Variables que representen informacin de la vida real Estarn formados a partir de tipos de datos simples

ESTRUCTURAS typedef struct TReg{ int ID; char Texto[100];

}Reg;
UNIONES

typedef union TUn{


int ID; char Texto[100];

100

En C, tenemos:

}Un;

ARREGLOS
Conjunto de elementos Finito, Ordenado y Homogneo,

Todos sus elementos son del mismo tipo

Un arreglo esttico se declara int A[100]; El tipo de los elementos, el identificador y El numero de elementos (dimensin) A Cada elemento del arreglo tiene un ndice En C, siempre el ndice mas pequeo es el 0: limite inferior 0 1 2 3 El limite superior, es 1 menos que la dimensin

... 99

Si el arreglo tiene 100 elementos, el ndice mas alto es el 99

Y si un entero ocupa 4 bytes, el arreglo ocupa 400 bytes

seguidos

OPERACIONES

Tipo de dato: Conjunto de valores y operaciones definidas solo para esos valores

No basta con la declaracin, para ser tratado como

un tipo de dato
Faltan las operaciones para actuar sobre l

Consulta de un elemento

//Consulto el contenido de los elementos 4 y 5 de A printf(%d %d,A[4], A[5]);

Modificacin de un elemento
A[i] = 0;

A[3] = 2; //Almaceno un valor en el elemento 3 de A for(i = 0; i < 100; i++)

REPRESENTACION INTERNA
Cuantos bytes ocupa un tipo de dato o

variable?

1000

Lista[0] Lista[1] Lista[2] Lista[3] Lista[4]

En C lo indica el operador sizeof Ejemplo:


int a; printf(%d %d, sizeof(int), sizeof(a));

1008
1016

El computador internamente No almacena la direccin de todos los elementos 1024 del arreglo Solo almacena la direccin del primer elemento 1032 El resto lo calcula as:
&Lista[i] -> &Lista[0] + (i*sizeof(Lista[0]))

RESERVA DE MEMORIA DINAMICA

La declaracin de una variable


a no apunta a otra variable, tiene memoria propia, solo para el

Siempre reserva memoria Aunque la variable no se use, ya se reservo memoria para ella: ESTATICA

Si deseamos reservar memoria, pero no en la declaracin


Si no, a voluntad dentro del programa La reserva seria dinmica

En C se usan

int *a; //No se reserva nada .. /*Cuando se desee, se reserva*/ a = malloc(sizeof(int)); //La variable normalmente *a = 3;

Punteros y Las funciones de librera

#include <stdlib.h> void *malloc(size_t size);

ARREGLOS DINAMICOS
En ocasiones deseamos usar arreglos Donde no hayamos predefinido cuantos elementos max. tendremos Queremos usar arreglos dinmicos Se declara el arreglo potencial:
int *arreglo;

Dentro del programa, se pide memoria cuando se necesite:


arreglo = malloc(sizeof(int)*20);
main(){ Para indicar el nuevo tamao se puede usar una constante o una variable,o cualquier expresin

int *arreglo, n; printf(Ingrese el tamao del arreglo:); n = GetInteger(); arreglo = malloc(sizeof(int)*n); printf(Ahora tiene %d elementos para trabajar\n,n); ... }

Y LIBERA..
Al pedir memoria dinmicamente Se debe liberar dentro del programa En C se libera usando la funcin free

Cuando se libera para una variable

int *a; a = malloc...; free(a);

Ejercicio

ARITMETICA DE PUNTEROS
Los operadores + y Se pueden usar con punteros Pero el significado de la operacin cambia un poco

Si un entero ocupa 4 bytes, tomemos este

ejemplo

int x; int *p; p = &x; p = p+2;

La suma indica que p se mueva 2 enteros mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108

Si la direccin de x es un valor 100 y decimos Que direccin almacena pi?


102 108 104

EJERCICIO EN CLASE
main(){ double Lista[3]; double *p,*p1,*p2; int k; Lista[0] = 1; Lista[1] = 1.1; Lista[2] = 1.2; p = Lista; p = p + 2; printf(%d, *p); p = p - 1; printf(%d, *p); p1 = Lista+2; p2 = &Lista[0]; k = p1-p2; printf(%d, k); }

p2

1000 1 1008

Lista[0]
Lista[1]

1.1
1016 1.2
p se mueve 2 desfases

Lista[2]

p1

p retrocede un desfase
Da el total de desfases entre p1 y p2

Ejercicio

PASO DE ARREGLOS A FUNCIONES

Al pasar un arreglo a una funcin debe tomarse en

cuenta

Necesitare tambin el tamao del arreglo? Si es as, tambin debe incluirse como parmetro
float CalcPromedio(float A[], int size); float funct(float B[]);

En prototipos y cabecera
En el cuerpo de la funcin
}
.. A[i] = 3;

float CalcPromedio(float A[], int size){

Siempre recuerde que El paso de arreglos, es un paso por referencia Ejercicio

ARREGLOS BIDIMENSIONALES

La programacin ofrece innumerables opciones


Un elemento de un arreglo, puede ser otro arreglo int A[3][3]; A[3] es un arreglo de tres elementos Cada elemento es otro arreglo de 3 elementos enteros

int A[3][3];
(0,0) (0,1) (0,2) (1,0) (1,1) (1,2)
A[0] A[1] A[2]
A[0][0] A[0]1] A[0][2] A[1][0] A[1][1] A[1][2] A[2][0] A[2][1] A[2][2]

Ejercicio

(2,0) (2,1) (2,2)

ESTRUCTURAS o REGISTROS
Es un grupo de componentes. Cada componente

Tiene su propio identificador, y Se conoce como elemento o campo de la estructura


typedef struct TNombreCompleto{ char Primero[10]; char Inicial; char Ultimo[10]; }NombreCompleto;

Ejemplo:

Es la declaracin del nuevo tipo de dato:

NombreCompleto
Con este tipo de dato, podremos crear variables:

NombreCompleto snombre, enombre;

USANDO ESTRUCTURAS
snombre

es una variable de tipo NombreCompleto

Tiene la misma forma que la del nuevo tipo de dato Cada miembro/campo ocupa memoria Para acceder a un campo, se indica,

La variable seguida de un punto y del nombre del campo. Ejemplo

Los registros de tipo NombreCompleto, tendrn la misma estructura Cada dato tiene diferente tamao y espacio en memoria Cada dato representa una informacin diferente

snombre.Inicial = L; snombre
primero

inicial

ultimo

Ejercicio

UNIONES
Permite que una variable se interprete de varias formas

distintas, dependiendo de la necesidad


En una estructura

Siempre es vlido referirse a cualquier miembro de la misma


Si hay n miembros, hay n cajones de memoria Solo trabajaremos con un miembro a la vez Hay un solo cajn de memoria, capaz de almacenar al mas grande de los miembros Si el elemento escogido es mas pequeo, sobrara espacio

En una unin

UNIONES
typedef enum {Entero, Real} Tdato; typedef union ValorPolimorifco{

typedef union ValorPolimorifco{


int valor_entero; float valor_real; }; };

int valor_entero; float valor_real; Tdato tipo;

ValorPolimorfico a; a.valor_entero = 9; a.valor_real = 8.9;

ValorPolimorfico a; printf(Tipo de dato:); a.tipo = GetInteger(); if a.tipo == Entero then a.valor_entero = 9; elseif a.tipo == Real then a.valor_real = 8.9;

AMBITO DE VARIABLES
Los parmetros y variables, dentro de una funcin,

Son variables con mbito local Solo son validas en ese ambiente,

Las variables tambin pueden tener un mbito global

Empiezan a existir desde su declaracin, y


Son liberadas con el alcance de un archivo: variables externas Para que no pueda ser vista por otros archivos, Se la declara static, con mbito global para archivo nicamente

Para darle privacidad a una variable

También podría gustarte