690 likes | 1.99k Views
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
E N D
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
Datos de salida(se muestran en el monitor) Empleado Horas Juan, Perez Pedro, Rodriguez Luis, Pozo 160 155 120 Juan, Perez $320 Pedro, Rodriguez $310 Luis, Pozo $240 Valor por hora = $2 Procesamiento: Calcular salarios Datos de entrada(ingresados x teclado) INFORMACIÓN • Es el resultado deseado luego de procesar los datos • Los datos, al ser procesados, se convierten en información útil o resultados.
¿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.
1000 1001 1002 1003 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
100 101 102 103 104 DECLARACION DE VARIABLES Al declarar una variable se le asigna espacio en memoria y una dirección para dicho espacio • 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 4 bytes, dir: 100 int a; char c; 1 byte, dir: 104
1000 1001 1002 1003 DIRECCIONES DE MEMORIA • Las variables • Tienen direcciones de memoria • Si deseamos conocer dicha dirección • En lenguaje C • Se usa el operador & de dirección &a es 1000 • 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 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; • Un identificador que siempre va antecedido del operador * x 1000 3 1001 1002 1003 1000 1004 pt 1005 • int *pt, x; pt almacena la dirección de x, se dice que pt apunta a x • x = 3; • pt = &x;
CONSULTANDO CONTENIDO • Si un puntero apunta a una variable • A través del puntero se puede llegar a conocer todo sobre la variable • Ejemplo: • char c, *pc1, *pc2; • pc1 = &c; • Si quiero conocer la dirección, 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 : printf(“%c”, c); • c = ‘A’ • printf(“%c”, *pc1); • *pc1 = ‘N’ • printf(“%c”,c); Es equivalente a : c = ‘N’ Ejercicio Imprime ‘N’ pues c ya cambio
1000 x 1004 y 1008 p1 1012 p2 EJERCICIO EN CLASE int x,y; int *p1,*p2; x = -42; y = 163; p1 = &x; p2 = &y; *p1 = 17; *p2 = x+5; -42 17 22 163 22 1000 1004 1004 1000 0 1004 1004 0 *p1 = *p2; Es equivalente a escribir x = y; Esto indica que p1 ahora apunta a la misma variable que p2 p1 = p2; p1 = NULL; p2 = NULL; Esto es equivalente a “encerar” el puntero, y decir que no apunta a ninguna variable
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 = 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 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 = 5 printf(“%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:
0 1 2 3 4 99 ARREGLOS • Conjunto de elementos • Finito, Ordenado y Homogéneo, • Todos sus elementos son del mismo tipo • Un arreglo estático se declara int 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 A ...
OPERACIONES Tipo de dato: Conjunto de valores y operaciones definidas solo para esos valores • 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 elemento A[3] = 2; //Almaceno un valor en el elemento 3 de A for(i = 0; i < 100; i++) A[i] = 0;
1000 Lista[0] 1008 Lista[1] Lista[2] 1016 Lista[3] 1024 Lista[4] 1032 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)); • 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í: &Lista[i] -> &Lista[0] + (i*sizeof(Lista[0]))
RESERVA DE MEMORIA DINAMICA a no apunta a otra variable, tiene memoria propia, solo para el • 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 int *a; //No se reserva nada .. /*Cuando se desee, se reserva*/ a = malloc(sizeof(int)); //La variable normalmente *a = 3; #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 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 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 operación cambia un poco • Si un entero ocupa 4 bytes, tomemos este ejemplo int x; int *p; p = &x; • Si la dirección de x es un valor 100 y decimos p = p+2; • Que dirección almacena pi? La suma indica que p se mueva 2 “enteros” mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108 102 108 104
p2 p 1000 Lista[0] 1008 Lista[1] 1016 Lista[2] p1 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); } 1 1.1 1.2 p se mueve 2 desfases 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 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 cabecera float CalcPromedio(float A[], int size); float funct(float B[]); • En el cuerpo de la función float CalcPromedio(float A[], int size){ ….. A[i] = 3; } • Siempre recuerde que • El paso de arreglos, es un paso por referencia Ejercicio
A[0] A[0][0] A[0]1] A[0][2] A[1] A[1][0] A[1][1] A[1][2] A[2] A[2][0] A[2][1] A[2][2] 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 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;
primero inicial ultimo 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, tendrán la misma “estructura” Cada dato tiene diferente tamaño y espacio en memoria Cada dato representa una información diferente snombre 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 enum {Entero, Real} Tdato; 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 union ValorPolimorifco{ int valor_entero; float valor_real; }; ValorPolimorfico a; a.valor_entero = 9; a.valor_real = 8.9;
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