You are on page 1of 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

Analicemos el siguiente hecho:

El estudiante de nombre Pedro Velez de 22 aos, tiene un promedio de 7.5

Podemos tomar los siguientes datos

Nombre: Pedro Velez -> Conjunto de Caracteres

Edad: 22
Promedio: 7.5

-> entero
-> real

INFORMACIN
Es el resultado deseado luego de procesar los datos Los datos, al ser procesados, se convierten en informacin til o resultados.

Empleado Juan, Perez Horas 160

Datos de salida(se muestran en el monitor)


Juan, Perez
Pedro, Rodriguez Luis, Pozo

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 Caen en el dominio de la informacin tipo texto

Nombre, Direccin, Num. Cedula,

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 Se puede deducir su tipo de dato Ya sea de su forma o de su declaracin Sin necesidad que se ejecute ningn proceso Necesitan participantes (argumentos) de determinado tipo Producen resultados de otro o el mismo tipo

De una constante, variable o expresin


Las operaciones entre datos


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) OPERACIONES Sumar, restar, dividir, multiplicar, residuo Sumar, restar, dividir, multiplicar And, Or, Not

NOMBRE Enteros Reales Lgicos

Caracteres

Letras, nmeros, especiales, juntos forman una cadena

Sumar carcter + entero restar, multiplicar por entero

Y EN LA COMPUTADORA?
1000 1001 En la computadora 1002 Cada byte es un casillero y tiene una direccin en memoria 1003 Los datos (nmeros y letras) se almacena en estos

Solo vienen integrados los tipos de datos bsicos

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

2 4 8 8 16 1

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

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, b; float c; int a; char c;

100 101 102 103 104

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

Para que se declaran variables?


Especifica cuanta memoria debe reservarse y Como se van a interpretar dichos datos
f = a + b

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 Se pueden definir punteros de cualquier tipo:
float *pf; char *pc;
1000 1001 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 Ejemplo:
char c, *pc1, *pc2; 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 operador *, sobre dicho puntero Es equivalente a :
c = A Pc1=&c printf(%c, *pc1); *pc1 = N printf(%c,c);
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 La verdadera estar segura, aunque quemen y destruyan la copia
x = 5 printf(%d\n,x); funct(x); printf(%d\n,x); void funct(int y){ y = y+1; printf(%d\n,y); }
Se imprime 5, el valor de x no cambia aunque la funcin haya intentado modificarla

Ejemplo:

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 La funcin trabaja con un puntero a la variable enviada

Sabe todo sobre esa variable y se pude acceder a travs de *


x = 5 printf(%d\n,x); funct(&x); printf(%d\n,x);
Se imprime 6, el valor de x cambi dentro de la funcin

Ejemplo:

Ejercicio

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
0 1 2 3 4

Cada elemento del arreglo tiene un ndice


... 99

En C, siempre el ndice mas pequeo es el 0: limite inferior El limite superior, es 1 menos que la dimensin

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
Modificacin de un elemento
A[i] = 0;

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

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?

En C lo indica el operador sizeof Ejemplo:


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

1000

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

1008
1016

El computador internamente

No almacena la direccin de todos los elementos del 1024 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(){ 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); ... } Para indicar el nuevo tamao se puede usar una constante o una variable,o cualquier expresin

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


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

Si un entero ocupa 4 bytes, tomemos este ejemplo

Si la direccin de x es un valor 100 y decimos


p = p+2;

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
float CalcPromedio(float A[], int size){
.. A[i] = 3;

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
(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]

int A[3][3];
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 snombre.Inicial = L;

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
ultimo

primero

inicial

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 elementos, hay n cajones de memoria


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

En una unin

UNIONES
typedef union ValorPolimorfico{
int valor_entero; float valor_real; };

typedef enum {Entero, Real} Tdato; typedef union ValorPolimorifco{ int valor_entero; float valor_real;

Tdato tipo;
};

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

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

You might also like