tipos de datos
DESCRIPTION
TIPOS DE DATOS. ESTRUCTURAS DE DATOS. OBJETIVOS. Manejo correcto y apropiado de punteros y reserva de memoria dinámica Reconocer el tipo de dato void y void * en C como una herramienta de potencial importancia Diferenciar entre arreglos y estructuras - PowerPoint PPT PresentationTRANSCRIPT
TIPOS DE DATOS
ESTRUCTURAS DE DATOS
OBJETIVOS
Manejo correcto y apropiado de punteros y reserva de
memoria dinámica
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 Información en bruto, sin ningún significado Dado un enunciado, evento o acción, los datos
Permiten representar sus actores o participantes Analizándolos, se podrá obtener resultados deseados
Analicemos el siguiente hecho: El estudiante de nombre Pedro Velez de 22 años, tiene un promedio de 7.5
Podemos tomar los siguientes datos Nombre: Pedro Velez -> Conjunto de Caracteres Edad: 22 -> entero Promedio: 7.5 -> real
INFORMACIÓN Es el resultado deseado luego de procesar los datos Los datos, al ser procesados, se convierten en
información útil o resultados.
Procesamiento:Calcular salarios
Juan, Perez $320
Pedro, Rodriguez $310
Luis, Pozo $240
Datos de salida(se muestran en el monitor)
Datos de entrada(ingresados x teclado)
Juan, Perez
Pedro, Rodriguez
Luis, Pozo
160
155
120
Empleado Horas
Valor por hora = $2
¿Cómo representar los datos?
Los seres humanos: Usamos lenguaje natural o símbolos Ejemplo:
Para representar números, usamos el sistema decimal Para representar palabras, usamos el abecedario
La computadora: Usa conjuntos de 1s y 0s El dato mas pequeño 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, Año de Nacimiento, Numero de multas Tienen dominio numérico
Nombre, Dirección, Num. Cedula, Caen en el dominio de la información 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 expresión Que puede ser generado por una función
De una constante, variable o expresión Se puede deducir su tipo de dato Ya sea de su forma o de su declaración Sin necesidad que se ejecute ningún 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 fácilmente, están en el diario vivir:
El Sr. Vera de 63 años tiene cedula No. 0908815533, y paga $120 de impuestos
Son tipos de datos simples Que permiten representar información numérica, caracteres, etc.
NOMBRE CONJUNTO DE VALORES OPERACIONES
Enteros Negativos y positivos sin decimal Sumar, restar, dividir, multiplicar, residuo
Reales Negativos y positivos, con decimal Sumar, restar, dividir, multiplicar
Lógicos Verdadero o Falso(1 o 0) And, Or, Not
Caracteres Letras, números, especiales, juntos forman una cadena
Sumar carácter + entero restar, multiplicar por entero
Y EN LA COMPUTADORA? Solo vienen integrados los tipos de datos básicos En la computadora
Cada byte es un casillero y tiene una dirección en memoria
Los datos (números y letras) se almacena en estos 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 precisión
PERO, un carácter SIEMPRE ocupara casillas de 1 byte
1000
1001
1002
1003
ALMACENANDO DATOS
TIPO DE DATO #bytes Representación interna En ANSI C
ENTEROS 248
Positivos: conjunto de bits38 -> 00100110Negativos:Complemento a Dos-38 -> 11011001
intlong
REALES 816
Mantisa x base(exponente)
387.53 -> 38753 x 10-2
00000000100101110110000111111110
floatdouble
CARACTERES 1 ASCII11000000 -> ‘A’
char
DECLARACION DE VARIABLES Una declaración de variables en C incluye
Tipo de dato y Nombre de variable(identificador) Ejemplo:
int a, b;float c;
¿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
Al declarar una variable se le asigna espacio en memoria y una dirección para dicho espacio
int a;4 bytes,dir: 100
1 byte,dir: 104
100101102103104
char c;
DIRECCIONES DE MEMORIA
1000
1001
1002
1003
&a es 1000
Las variables Tienen direcciones de memoria
Si deseamos conocer dicha dirección En lenguaje C Se usa el operador & de dirección
Ejemplo:int a;a = 3;printf(“Valor:%d Dir: %d”, a, &a);
Un puntero Es una variable que puede almacenar dirección de memoria
DECLARACION DE PUNTEROS
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;
Un identificador que siempre va antecedido del operador *pt almacena la
dirección de x, se dice que pt apunta
a x
x
pt
int *p;
100010011002100310041005
1000
int *pt, x;x = 3;pt = &x;
3
CONSULTANDO CONTENIDO Si un puntero apunta a una variable
A través del puntero se puede llegar a conocer todo sobre la variable Ejemplo:
c = ‘A’
printf(“%c”, *pc1);
*pc1 = ‘N’
printf(“%c”,c);
Es equivalente a :printf(“%c”, c);
Es equivalente a :c = ‘N’
Imprime ‘N’ pues c ya cambio
char c, *pc1, *pc2;pc1 = &c;
Si quiero conocer la dirección, uso directamente el punteroprintf(“%d”, pc1); //Imprimo la dir. Almacenada por pc1pc2 = pc1; //pc2 almacena la misma dir. que pc1
Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero
Ejercicio
EJERCICIO EN CLASE
*p1 = *p2;
int x,y;
int *p1,*p2;
x = -42;
y = 163;
p1 = &x;
p2 = &y;
*p1 = 17;
*p2 = x+5;
1000
1004
Es equivalente a escribir x = y;p1 = p2;
Esto indica que p1 ahora apunta a la
misma variable que p2
1004
p1 = NULL;
p2 = NULL; Esto es equivalente a “encerar” el puntero, y decir que no apunta a
ninguna variable
1000
1004
1008
1012
x
y
p1
p2
-42
22
1000
1004
1722
0
0
163
1004
PASO DE PARAMETROS Las funciones son porciones de código
Ejecutan una tarea especifica
Usualmente toman datos de entrada->parámetros
Y retornan un valor
Los parámetros se pueden enviar de dos formas: Por valor
Por referencia
PASO POR VALOR La función no recibe la variable enviada
Recibe una copia Similar a cuando va al hacer algún tramite y le piden al cédula
No entrega la cédula verdadera Entrega una copia La verdadera estará segura, aunque quemen y destruyan la copia
Ejemplo: x = 5printf(“%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 función haya
intentado modificarla
PASO POR REFERENCIA Aquí si la función recibe exactamente la variable enviada
No hay copias Si algo se le hace al parámetro, se le esta haciendo a la variable Para esto, se usan punteros La función trabaja con un puntero a la variable enviada
Sabe todo sobre esa variable y se pude acceder a través de *
Ejemplo: x = 5printf(“%d\n”,x);funct(&x);printf(“%d\n”,x);
void funct(int *py){*py = *py+1;printf(“%d\n”,*py);
}
Se imprime 6, el valor de x cambió dentro de la función
Ejercicio
TIPOS DE DATOS COMPUESTOS En ocasiones se necesitan
tipos de datos mas complejos, y estructurados Variables que almacenen mas de
un valor Variables que representen
información de la vida real Estarán formados a partir de
tipos de datos simples
En C, tenemos:
TIPO FORMATO DECLARACION
Bytes
ARREGLOS int arrEj[10]; 10*2 = 20
ESTRUCTURAS typedef struct TReg{int ID;char Texto[100];
}Reg;
2 + 100 = 102
UNIONES typedef union TUn{int ID;char Texto[100];
}Un;
100
ARREGLOS Conjunto de elementos
Finito, Ordenado y Homogéneo, Todos sus elementos son del mismo tipo
Un arreglo estático se declaraint A[100];
El tipo de los elementos, el identificador y El numero de elementos (dimensión)
Cada elemento del arreglo tiene un índice En C, siempre el índice mas pequeño es el 0: limite inferior El limite superior, es 1 menos que la dimensión
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
0 1 2 3 4 ...
A
99
OPERACIONES No basta con la declaración, 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]);
Modificación de un elementoA[3] = 2; //Almaceno un valor en el elemento 3 de A
for(i = 0; i < 100; i++)A[i] = 0;
Tipo de dato:Conjunto de valores y
operaciones definidas solo para esos valores
REPRESENTACION INTERNA
1000
1008
1016
1024
1032
Lista[0]
Lista[1]
Lista[2]
Lista[3]
Lista[4]
&Lista[i] -> &Lista[0] + (i*sizeof(Lista[0]))
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));
El computador internamente No almacena la dirección de todos los elementos del
arreglo Solo almacena la dirección del primer elemento El resto lo calcula así:
RESERVA DE MEMORIA DINAMICA La declaración de una variable
Siempre reserva memoria Aunque la variable no se use, ya se reservo memoria para ella: ESTATICA
Si deseamos reservar memoria, pero no en la declaración Si no, a voluntad dentro del programa La reserva seria dinámica
En C se usan Punteros y Las funciones de librería
#include <stdlib.h>void *malloc(size_t size);
int *a; //No se reserva nada../*Cuando se desee, se reserva*/a = malloc(sizeof(int)); //La variable normalmente*a = 3;
a no apunta a otra variable,
tiene memoria propia, solo para
el
ARREGLOS DINAMICOS En ocasiones deseamos usar arreglos
Donde no hayamos “predefinido” cuantos elementos max. tendremos Queremos usar arreglos dinámicos
Se declara el arreglo “potencial”:int *arreglo;
Dentro del programa, se pide memoria cuando se necesite:arreglo = malloc(sizeof(int)*20); Para indicar el nuevo tamaño se
puede usar una constante o una variable,o cualquier expresión
main(){int *arreglo, n;printf(“Ingrese el tamaño del arreglo:”);n = GetInteger();arreglo = malloc(sizeof(int)*n);printf(“Ahora tiene %d elementos para trabajar\n”,n);...
}
Y LIBERA.. Al pedir memoria dinámicamente Se debe liberar dentro del programa En C se libera usando la función free
int *a;
a = malloc...;
…
free(a);
Cuando se libera para una variable
Ejercicio
ARITMETICA DE PUNTEROS Los operadores + y –
Se pueden usar con punteros Pero el significado de la operación cambia un poco
Si un entero ocupa 4 bytes, tomemos este ejemploint x;int *p;p = &x;
Si la dirección de x es un valor 100 y decimosp = p+2;
Que dirección almacena pi? 102 108 104
La suma indica que p se mueva 2 “enteros” mas adelante
Cada entero equivale a 4 bytes100 + 2*4 = 108
EJERCICIO EN CLASEmain(){
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);
}
1000
1008
1016
Lista[0]
Lista[1]
Lista[2]
p
p2
p1p se mueve 2 desfases
p retrocede un desfase
Da el total de desfases entre p1 y
p2
1
1.1
1.2
Ejercicio
PASO DE ARREGLOS A FUNCIONES
Al pasar un arreglo a una función debe tomarse en cuenta ¿Necesitare también el tamaño del arreglo? Si es así, también debe incluirse como parámetro
En prototipos y cabecerafloat CalcPromedio(float A[], int size);
float funct(float B[]);
En el cuerpo de la funciónfloat CalcPromedio(float A[], int size){
…..A[i] = 3;
}
Siempre recuerde que El paso de arreglos, es un paso por referencia Ejercicio
ARREGLOS BIDIMENSIONALES La programación 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)
(2,0) (2,1) (2,2)
A[0]
A[1]
A[2]
A[0][0]
A[1][0]
A[2][0]
A[0]1]
A[1][1]
A[2][1]
A[0][2]
A[1][2]
A[2][2]
int A[3][3];
Ejercicio
ESTRUCTURAS o REGISTROS Es un grupo de “componentes”. Cada componente
Tiene su propio identificador, y Se conoce como “elemento” o “campo” de la estructura
Ejemplo:
Es la declaración del nuevo “tipo de dato”: NombreCompleto Con este tipo de dato, podremos crear “variables”:
NombreCompleto snombre, enombre;
typedef struct TNombreCompleto{char Primero[10];char Inicial;char Ultimo[10];
}NombreCompleto;
USANDO ESTRUCTURAS
primero
inicial
ultimo
snombreLos registros de tipo NombreCompleto, tendrán la misma “estructura” Cada dato tiene diferente tamaño y espacio en memoriaCada dato representa una información diferente
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’;
Ejercicio
UNIONES Permite que una variable se interprete de varias formas distintas,
dependiendo de la necesidad En una estructura
Siempre es válido referirse a cualquier miembro de la misma Si hay n miembros, hay n cajones de memoria
En una unión Solo trabajaremos con un miembro a la vez Hay un solo cajón de memoria, capaz de almacenar al mas grande de los
miembros Si el elemento escogido es mas pequeño, sobrara espacio
UNIONES
typedef union ValorPolimorifco{
int valor_entero;
float valor_real;
};
ValorPolimorfico a;
a.valor_entero = 9;
a.valor_real = 8.9;
typedef union ValorPolimorifco{
int valor_entero;
float valor_real;
Tdato tipo;
};
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;
typedef enum {Entero, Real} Tdato;
AMBITO DE VARIABLES Los parámetros y variables, dentro de una función,
Son variables con ámbito local Solo son validas en ese ambiente,
Las variables también pueden tener un ámbito “global” Empiezan a existir desde su declaración, y Son liberadas con el alcance de un archivo: variables externas
Para darle privacidad a una variable Para que no pueda ser vista por otros archivos, Se la declara static, con ámbito global para archivo únicamente