Tipos De Datos

28,174 views

Published on

Published in: Travel, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
28,174
On SlideShare
0
From Embeds
0
Number of Embeds
155
Actions
Shares
0
Downloads
260
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Tipos De Datos

  1. 1. TIPOS DE DATOS ESTRUCTURAS DE DATOS www.espol.edu.ec www.fiec.espol.edu.ec
  2. 2. OBJETIVOS <ul><li>Manejo correcto y apropiado de punteros y reserva de memoria dinámica </li></ul><ul><li>Reconocer el tipo de dato void y void * en C como una herramienta de potencial importancia </li></ul><ul><li>Diferenciar entre arreglos y estructuras </li></ul><ul><li>Utilizar correctamente las estructuras, punteros a estructuras, arreglos de estructuras, etc. </li></ul>
  3. 3. DATO <ul><li>Información en bruto, sin ningún significado </li></ul><ul><li>Dado un enunciado, evento o acción, los datos </li></ul><ul><ul><li>Permiten representar sus actores o participantes </li></ul></ul><ul><ul><li>Analizándolos, se podrá obtener resultados deseados </li></ul></ul><ul><li>Analicemos el siguiente hecho: </li></ul><ul><ul><li>El estudiante de nombre Pedro Velez de 22 años, tiene un promedio de 7.5 </li></ul></ul><ul><li>Podemos tomar los siguientes datos </li></ul><ul><ul><li>Nombre: Pedro Velez -> Conjunto de Caracteres </li></ul></ul><ul><ul><li>Edad: 22 -> entero </li></ul></ul><ul><ul><li>Promedio: 7.5 -> real </li></ul></ul>
  4. 4. INFORMACIÓN <ul><li>Es el resultado deseado luego de procesar los datos </li></ul><ul><li>Los datos, al ser procesados, se convierten en información útil o resultados. </li></ul>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
  5. 5. ¿Cómo representar los datos? <ul><li>Los seres humanos: </li></ul><ul><ul><li>Usamos lenguaje natural o símbolos </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>Para representar números, usamos el sistema decimal </li></ul></ul></ul><ul><ul><ul><li>Para representar palabras, usamos el abecedario </li></ul></ul></ul><ul><li>La computadora: </li></ul><ul><ul><li>Usa conjuntos de 1s y 0s </li></ul></ul><ul><ul><li>El dato mas pequeño en el computador es </li></ul></ul><ul><ul><ul><li>Un 1 o un 0 -> bit </li></ul></ul></ul><ul><ul><li>El conjunto de 8 bits -> 1 byte </li></ul></ul>
  6. 6. TIPOS DE DATOS <ul><li>Los datos se clasifican en TIPOS </li></ul><ul><li>Son los diferentes dominios existentes. Ejemplo: </li></ul><ul><ul><li>Edad, Año de Nacimiento, Numero de multas </li></ul></ul><ul><ul><ul><li>Tienen dominio numérico </li></ul></ul></ul><ul><ul><li>Nombre, Dirección, Num. Cedula, </li></ul></ul><ul><ul><ul><li>Caen en el dominio de la información tipo texto </li></ul></ul></ul><ul><li>Y las operaciones permitidas para dicho dominio </li></ul>Un conjunto de valores y operaciones definidas solo para esos valores
  7. 7. RECORDAR <ul><li>Un tipo de dato es el conjunto de valores </li></ul><ul><ul><li>Al que puede pertenecer una constante </li></ul></ul><ul><ul><li>Que puede asumir una variable o expresión </li></ul></ul><ul><ul><li>Que puede ser generado por una función </li></ul></ul><ul><li>De una constante, variable o expresión </li></ul><ul><ul><li>Se puede deducir su tipo de dato </li></ul></ul><ul><ul><li>Ya sea de su forma o de su declaración </li></ul></ul><ul><ul><li>Sin necesidad que se ejecute ningún proceso </li></ul></ul><ul><li>Las operaciones entre datos </li></ul><ul><ul><li>Necesitan participantes (argumentos) de determinado tipo </li></ul></ul><ul><ul><li>Producen resultados de otro o el mismo tipo </li></ul></ul>
  8. 8. TIPOS DE DATOS BASICOS <ul><li>Los podemos distinguir fácilmente, están en el diario vivir: </li></ul><ul><ul><li>El Sr. Vera de 63 años tiene cedula No. 0908815533 , y paga $120 de impuestos </li></ul></ul><ul><li>Son tipos de datos simples </li></ul><ul><ul><li>Que permiten representar información numérica, caracteres, etc. </li></ul></ul>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
  9. 9. Y EN LA COMPUTADORA? <ul><li>Solo vienen integrados los tipos de datos básicos </li></ul><ul><li>En la computadora </li></ul><ul><ul><li>Cada byte es un casillero y tiene una dirección en memoria </li></ul></ul><ul><li>Los datos (números y letras) se almacena en estos casilleros </li></ul><ul><li>¿Cuantas casilleros ocupa un dato? </li></ul><ul><ul><li>Depende de su tipo y del hardware de la computadora </li></ul></ul><ul><ul><li>Un entero puede ocupar casillas de hasta 4 bytes </li></ul></ul><ul><ul><li>Un doble siempre ocupara mas, por su mayor precisión </li></ul></ul><ul><li>PERO, un carácter SIEMPRE ocupara casillas de 1 byte </li></ul>1000 1001 1002 1003
  10. 10. ALMACENANDO DATOS TIPO DE DATO #bytes Representación interna En ANSI C ENTEROS 2 4 8 Positivos: conjunto de bits 38 -> 00100110 Negativos:Complemento a Dos -38 -> 11011001 int long REALES 8 16 Mantisa x base (exponente) 387.53 -> 38753 x 10 -2 00000000100101110110000111111110 float double CARACTERES 1 ASCII 11000000 -> ‘A’ char
  11. 11. DECLARACION DE VARIABLES <ul><li>Una declaración de variables en C incluye </li></ul><ul><ul><li>Tipo de dato y </li></ul></ul><ul><ul><li>Nombre de variable(identificador) </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>int a, b; </li></ul></ul></ul><ul><ul><ul><li>float c; </li></ul></ul></ul><ul><li>¿Para que se declaran variables? </li></ul><ul><ul><li>Especifica cuanta memoria debe reservarse y </li></ul></ul><ul><ul><li>Como se van a interpretar dichos datos </li></ul></ul><ul><ul><ul><li>f = a + b </li></ul></ul></ul><ul><ul><ul><li>Es una suma de enteros, que al final se convierte a real </li></ul></ul></ul>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 char c; 100 101 102 103 104
  12. 12. DIRECCIONES DE MEMORIA &a es 1000 <ul><li>Las variables </li></ul><ul><ul><li>Tienen direcciones de memoria </li></ul></ul><ul><li>Si deseamos conocer dicha dirección </li></ul><ul><ul><li>En lenguaje C </li></ul></ul><ul><ul><li>Se usa el operador & de dirección </li></ul></ul><ul><li>Ejemplo: </li></ul><ul><ul><ul><li>int a; </li></ul></ul></ul><ul><ul><ul><li>a = 3; </li></ul></ul></ul><ul><ul><ul><li>printf(“Valor:%d Dir: %d”, a, &a ); </li></ul></ul></ul><ul><li>Un puntero </li></ul><ul><ul><li>Es una variable que puede almacenar dirección de memoria </li></ul></ul>1000 1001 1002 1003
  13. 13. DECLARACION DE PUNTEROS <ul><li>Un tipo de dato </li></ul><ul><ul><li>El puntero solo podrá almacenar direcciones de memoria de variables del tipo especificado </li></ul></ul><ul><ul><li>Se pueden definir punteros de cualquier tipo: </li></ul></ul><ul><ul><ul><ul><li>float *pf; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>char *pc; </li></ul></ul></ul></ul><ul><li>Un identificador que siempre va antecedido del operador * </li></ul>pt almacena la dirección de x, se dice que pt apunta a x x pt int *p; 1000 1001 1002 1003 1004 1005 1000 <ul><ul><ul><ul><li>int *pt, x; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>x = 3; </li></ul></ul></ul></ul><ul><ul><ul><ul><li>pt = &x; </li></ul></ul></ul></ul>3
  14. 14. CONSULTANDO CONTENIDO <ul><li>Si un puntero apunta a una variable </li></ul><ul><ul><li>A través del puntero se puede llegar a conocer todo sobre la variable </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><li>c = ‘A’ </li></ul></ul><ul><ul><li>printf(“%c”, *pc1); </li></ul></ul><ul><ul><li>*pc1 = ‘N’ </li></ul></ul><ul><ul><li>printf(“%c”,c); </li></ul></ul>Es equivalente a : printf(“%c”, c); Es equivalente a : c = ‘N’ Imprime ‘N’ pues c ya cambio <ul><ul><li>char c, *pc1, *pc2; </li></ul></ul><ul><ul><li>pc1 = &c; </li></ul></ul><ul><li>Si quiero conocer la dirección, uso directamente el puntero </li></ul><ul><ul><li>printf(“%d”, pc1); //Imprimo la dir. Almacenada por pc1 </li></ul></ul><ul><ul><li>pc2 = pc1; //pc2 almacena la misma dir. que pc1 </li></ul></ul><ul><li>Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero </li></ul>Ejercicio
  15. 15. 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 -42 22 1000 1004 17 22 0 0 163 1004 1000 1004 1008 1012 x y p1 p2
  16. 16. PASO DE PARAMETROS <ul><li>Las funciones son porciones de código </li></ul><ul><ul><li>Ejecutan una tarea especifica </li></ul></ul><ul><ul><li>Usualmente toman datos de entrada->parámetros </li></ul></ul><ul><ul><li>Y retornan un valor </li></ul></ul><ul><li>Los parámetros se pueden enviar de dos formas: </li></ul><ul><ul><li>Por valor </li></ul></ul><ul><ul><li>Por referencia </li></ul></ul>
  17. 17. PASO POR VALOR <ul><li>La función no recibe la variable enviada </li></ul><ul><ul><li>Recibe una copia </li></ul></ul><ul><ul><li>Similar a cuando va al hacer algún tramite y le piden al cédula </li></ul></ul><ul><ul><ul><li>No entrega la cédula verdadera </li></ul></ul></ul><ul><ul><ul><li>Entrega una copia </li></ul></ul></ul><ul><ul><ul><li>La verdadera estará segura, aunque quemen y destruyan la copia </li></ul></ul></ul><ul><li>Ejemplo: </li></ul>x = 5 printf(“%d ”,x); funct(x); printf(“%d ”,x); void funct(int y){ y = y+1; printf(“%d ”,y); } Se imprime 5, el valor de x no cambia aunque la función haya intentado modificarla
  18. 18. PASO POR REFERENCIA <ul><li>Aquí si la función recibe exactamente la variable enviada </li></ul><ul><ul><li>No hay copias </li></ul></ul><ul><ul><li>Si algo se le hace al parámetro, se le esta haciendo a la variable </li></ul></ul><ul><ul><li>Para esto, se usan punteros </li></ul></ul><ul><ul><li>La función trabaja con un puntero a la variable enviada </li></ul></ul><ul><ul><ul><li>Sabe todo sobre esa variable y se pude acceder a través de * </li></ul></ul></ul><ul><li>Ejemplo: </li></ul>x = 5 printf(“%d ”,x); funct(&x); printf(“%d ”,x); void funct(int *py){ *py = *py+1; printf(“%d ”,*py); } Se imprime 6, el valor de x cambió dentro de la función Ejercicio
  19. 19. TIPOS DE DATOS COMPUESTOS <ul><li>En ocasiones se necesitan tipos de datos mas complejos, y estructurados </li></ul><ul><ul><li>Variables que almacenen mas de un valor </li></ul></ul><ul><ul><li>Variables que representen información de la vida real </li></ul></ul><ul><ul><li>Estarán formados a partir de tipos de datos simples </li></ul></ul><ul><li>En C, tenemos: </li></ul>TIPO FORMATO DECLARACION Bytes ARREGLOS int arrEj[10]; 10*2 = 20 ESTRUCTURAS <ul><li>typedef struct TReg{ </li></ul><ul><ul><li>int ID; </li></ul></ul><ul><ul><li>char Texto[100]; </li></ul></ul><ul><li>}Reg; </li></ul>2 + 100 = 102 UNIONES <ul><li>typedef union TUn{ </li></ul><ul><ul><li>int ID; </li></ul></ul><ul><ul><li>char Texto[100]; </li></ul></ul><ul><li>}Un; </li></ul>100
  20. 20. ARREGLOS <ul><li>Conjunto de elementos </li></ul><ul><ul><li>Finito, Ordenado y Homogéneo, </li></ul></ul><ul><ul><ul><li>Todos sus elementos son del mismo tipo </li></ul></ul></ul><ul><li>Un arreglo estático se declara </li></ul><ul><ul><ul><li>int A[100]; </li></ul></ul></ul><ul><ul><li>El tipo de los elementos, el identificador y </li></ul></ul><ul><ul><li>El numero de elementos (dimensión) </li></ul></ul><ul><li>Cada elemento del arreglo tiene un índice </li></ul><ul><ul><li>En C, siempre el índice mas pequeño es el 0: limite inferior </li></ul></ul><ul><ul><li>El limite superior, es 1 menos que la dimensión </li></ul></ul><ul><ul><ul><li>Si el arreglo tiene 100 elementos, el índice mas alto es el 99 </li></ul></ul></ul><ul><li>Y si un entero ocupa 4 bytes, el arreglo ocupa 400 bytes seguidos </li></ul>... A 0 1 2 3 4 99
  21. 21. OPERACIONES <ul><li>No basta con la declaración, para ser tratado como un tipo de dato </li></ul><ul><li>Faltan las operaciones para actuar sobre él </li></ul><ul><ul><li>Consulta de un elemento </li></ul></ul><ul><ul><li>//Consulto el contenido de los elementos 4 y 5 de A </li></ul></ul><ul><ul><li>printf(“%d %d”,A[4], A[5]); </li></ul></ul><ul><ul><li>Modificación de un elemento </li></ul></ul><ul><ul><li>A[3] = 2; //Almaceno un valor en el elemento 3 de A </li></ul></ul><ul><ul><li>for(i = 0; i < 100; i++) </li></ul></ul><ul><ul><ul><li>A[i] = 0; </li></ul></ul></ul>Tipo de dato: Conjunto de valores y operaciones definidas solo para esos valores
  22. 22. REPRESENTACION INTERNA <ul><li>Cuantos bytes ocupa un tipo de dato o variable? </li></ul><ul><ul><li>En C lo indica el operador sizeof </li></ul></ul><ul><ul><li>Ejemplo: </li></ul></ul><ul><ul><ul><li>int a; </li></ul></ul></ul><ul><ul><ul><li>printf(“%d %d”, sizeof(int), sizeof(a)); </li></ul></ul></ul><ul><li>El computador internamente </li></ul><ul><ul><li>No almacena la dirección de todos los elementos del arreglo </li></ul></ul><ul><ul><li>Solo almacena la dirección del primer elemento </li></ul></ul><ul><ul><li>El resto lo calcula así: </li></ul></ul>&Lista[i] -> &Lista[0] + (i*sizeof(Lista[0])) 1000 1008 1016 1024 1032 Lista[0] Lista[1] Lista[2] Lista[3] Lista[4]
  23. 23. RESERVA DE MEMORIA DINAMICA <ul><li>La declaración de una variable </li></ul><ul><ul><li>Siempre reserva memoria </li></ul></ul><ul><ul><li>Aunque la variable no se use, ya se reservo memoria para ella: ESTATICA </li></ul></ul><ul><li>Si deseamos reservar memoria, pero no en la declaración </li></ul><ul><ul><li>Si no, a voluntad dentro del programa </li></ul></ul><ul><ul><li>La reserva seria dinámica </li></ul></ul><ul><li>En C se usan </li></ul><ul><ul><li>Punteros y </li></ul></ul><ul><ul><li>Las funciones de librería </li></ul></ul>#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
  24. 24. ARREGLOS DINAMICOS <ul><li>En ocasiones deseamos usar arreglos </li></ul><ul><ul><li>Donde no hayamos “predefinido” cuantos elementos max. tendremos </li></ul></ul><ul><ul><li>Queremos usar arreglos dinámicos </li></ul></ul><ul><li>Se declara el arreglo “potencial”: </li></ul><ul><ul><li>int *arreglo; </li></ul></ul><ul><li>Dentro del programa, se pide memoria cuando se necesite: </li></ul><ul><ul><li>arreglo = malloc(sizeof(int)*20); </li></ul></ul>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); ... }
  25. 25. Y LIBERA.. <ul><li>Al pedir memoria dinámicamente </li></ul><ul><li>Se debe liberar dentro del programa </li></ul><ul><li>En C se libera usando la función free </li></ul>int *a; a = malloc...; … free(a); Cuando se libera para una variable Ejercicio
  26. 26. ARITMETICA DE PUNTEROS <ul><li>Los operadores + y – </li></ul><ul><ul><li>Se pueden usar con punteros </li></ul></ul><ul><ul><li>Pero el significado de la operación cambia un poco </li></ul></ul><ul><li>Si un entero ocupa 4 bytes, tomemos este ejemplo </li></ul><ul><ul><ul><li>int x; </li></ul></ul></ul><ul><ul><ul><li>int *p; </li></ul></ul></ul><ul><ul><ul><li>p = &x; </li></ul></ul></ul><ul><li>Si la dirección de x es un valor 100 y decimos </li></ul><ul><ul><ul><li>p = p+2; </li></ul></ul></ul><ul><li>Que dirección almacena pi? </li></ul>102 108 104 La suma indica que p se mueva 2 “enteros” mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108
  27. 27. 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); } p se mueve 2 desfases p retrocede un desfase Da el total de desfases entre p1 y p2 1 1.1 1.2 Ejercicio 1000 1008 1016 Lista[0] Lista[1] Lista[2] p p2 p1
  28. 28. PASO DE ARREGLOS A FUNCIONES <ul><li>Al pasar un arreglo a una función debe tomarse en cuenta </li></ul><ul><ul><li>¿Necesitare también el tamaño del arreglo? </li></ul></ul><ul><ul><li>Si es así, también debe incluirse como parámetro </li></ul></ul><ul><li>En prototipos y cabecera </li></ul><ul><ul><ul><li>float CalcPromedio(float A[], int size); </li></ul></ul></ul><ul><ul><ul><li>float funct(float B[]); </li></ul></ul></ul><ul><li>En el cuerpo de la función </li></ul><ul><ul><ul><li>float CalcPromedio(float A[], int size){ </li></ul></ul></ul><ul><ul><ul><ul><li>… .. </li></ul></ul></ul></ul><ul><ul><ul><ul><li>A[i] = 3; </li></ul></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><li>Siempre recuerde que </li></ul><ul><ul><li>El paso de arreglos, es un paso por referencia </li></ul></ul>Ejercicio
  29. 29. ARREGLOS BIDIMENSIONALES <ul><li>La programación ofrece innumerables opciones </li></ul><ul><li>Un elemento de un arreglo, puede ser otro arreglo </li></ul><ul><ul><li>int A[3][3]; </li></ul></ul><ul><ul><li>A[3] es un arreglo de tres elementos </li></ul></ul><ul><ul><li>Cada elemento es otro arreglo de 3 elementos enteros </li></ul></ul>int A[3][3]; Ejercicio 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]
  30. 30. ESTRUCTURAS o REGISTROS <ul><li>Es un grupo de “componentes”. Cada componente </li></ul><ul><ul><li>Tiene su propio identificador, y </li></ul></ul><ul><ul><li>Se conoce como “elemento” o “campo” de la estructura </li></ul></ul><ul><li>Ejemplo: </li></ul><ul><li>Es la declaración del nuevo “tipo de dato”: NombreCompleto </li></ul><ul><li>Con este tipo de dato, podremos crear “variables”: </li></ul><ul><li>NombreCompleto snombre, enombre; </li></ul>typedef struct TNombreCompleto { char Primero[10]; char Inicial; char Ultimo[10]; } NombreCompleto ;
  31. 31. USANDO ESTRUCTURAS <ul><li>snombre es una variable de tipo NombreCompleto </li></ul><ul><ul><li>Tiene la misma forma que la del nuevo tipo de dato </li></ul></ul><ul><ul><li>Cada miembro/campo ocupa memoria </li></ul></ul><ul><ul><li>Para acceder a un campo, se indica, </li></ul></ul><ul><ul><ul><li>La variable seguida de un punto y del nombre del campo. Ejemplo </li></ul></ul></ul><ul><ul><ul><li>snombre.Inicial = ‘L’; </li></ul></ul></ul>snombre 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 Ejercicio primero inicial ultimo
  32. 32. AMBITO DE VARIABLES <ul><li>Los parámetros y variables, dentro de una función, </li></ul><ul><ul><li>Son variables con ámbito local </li></ul></ul><ul><ul><li>Solo son validas en ese ambiente, </li></ul></ul><ul><li>Las variables también pueden tener un ámbito “global” </li></ul><ul><ul><li>Empiezan a existir desde su declaración, y </li></ul></ul><ul><ul><li>Son liberadas con el alcance de un archivo: variables externas </li></ul></ul><ul><li>Para darle privacidad a una variable </li></ul><ul><ul><li>Para que no pueda ser vista por otros archivos, </li></ul></ul><ul><ul><li>Se la declara static, con ámbito global para archivo únicamente </li></ul></ul>

×