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
Promedio: 7.5

-> entero
-> real

Perez Pedro. Rodriguez Luis.INFORMACIÓN Es el resultado deseado luego de procesar los datos  Los datos. Pozo Pedro. al ser procesados. Pozo Valor por hora = $2 155 120 $320 $310 $240 Datos de entrada(ingresados x teclado) Procesamiento: Calcular salarios . Perez Horas 160 Datos de salida(se muestran en el monitor) Juan.  Empleado Juan. se convierten en información útil o resultados. Rodriguez Luis.

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 .¿Cómo representar los datos?  Los seres humanos:   Usamos lenguaje natural o símbolos Ejemplo:   Para representar números.

Año de Nacimiento.   Y las operaciones permitidas para dicho dominio Un conjunto de valores y operaciones definidas solo para esos valores . Numero de multas  Tienen dominio numérico Caen en el dominio de la información tipo texto Nombre.TIPOS DE DATOS  Los datos se clasifican en TIPOS  Son los diferentes dominios existentes. Ejemplo:   Edad. Num. Cedula. Dirección.

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 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 Necesitan participantes (argumentos) de determinado tipo Producen resultados de otro o el mismo tipo  De una constante. variable o expresión     Las operaciones entre datos   .

con decimal Verdadero o Falso(1 o 0) OPERACIONES Sumar. restar. residuo Sumar.TIPOS DE DATOS BASICOS  Los podemos distinguir fácilmente. 0908815533. etc. caracteres. restar. multiplicar por entero . multiplicar. están en el diario vivir:  El Sr. números. Vera de 63 años tiene cedula No. Or. Not NOMBRE Enteros Reales Lógicos Caracteres Letras. y paga $120 de impuestos  Son tipos de datos simples  Que permiten representar información numérica. juntos forman una cadena Sumar carácter + entero restar. dividir. especiales. multiplicar And. dividir. CONJUNTO DE VALORES Negativos y positivos sin decimal Negativos y positivos.

un carácter SIEMPRE ocupara casillas de 1 byte . por su mayor precisión  PERO.Y EN LA COMPUTADORA? 1000 1001  En la computadora 1002  Cada byte es un casillero y tiene una dirección en memoria 1003  Los datos (números y letras) se almacena en estos  Solo vienen integrados los tipos de datos básicos 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.

ALMACENANDO DATOS TIPO DE DATO #bytes Representación 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 .

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.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. char c. 100 101 102 103 104 4 bytes. b. que al final se convierte a real . float c. dir: 100 1 byte. int a.

DIRECCIONES DE MEMORIA   Las variables  Tienen direcciones de memoria En lenguaje C Se usa el operador & de dirección int a. printf(“Valor:%d Dir: %d”. Si deseamos conocer dicha dirección   1000 1001 1002 1003  Ejemplo: &a es 1000  Un puntero  Es una variable que puede almacenar dirección de memoria . a. a = 3. &a).

pt almacena la dirección de x. x.  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. 1000 1001 1002 1003 1004 1005  3 x 1000 pt  Un identificador que siempre va antecedido del operador * int *pt. x = 3. char *pc. pt = &x. se dice que pt apunta a x .DECLARACION DE PUNTEROS int *p.

uso el Es equivalente a : operador *. sobre dicho puntero printf(“%c”. *pc2. pc1 = &c.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.c). *pc1 = „N‟ printf(“%c”.  Si quiero conocer la dirección. uso directamente el puntero printf(“%d”. Es equivalente a : c = „N‟ Imprime „N‟ pues c ya cambio Ejercicio . c). que pc1  Si quiero conocer el contenido al que apunta un puntero. *pc1). c = „A‟ printf(“%c”. *pc1. //Imprimo la dir. //pc2 almacena la misma dir. Almacenada por pc1 pc2 = pc1. pc1).

EJERCICIO EN CLASE int x. 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 x y p1 p2 Esto es equivalente a “encerar” el puntero. p2 = NULL. y = 163. *p2 = x+5. p2 = &y. Es equivalente a escribir x = y. p1 = &x. x = -42. p1 = NULL. p1 = p2.*p2.y. int *p1. y decir que no apunta a ninguna variable . *p1 = *p2. *p1 = 17.

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 .

x).x). void funct(int y){ y = y+1. funct(x). printf(“%d\n”.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. printf(“%d\n”. aunque quemen y destruyan la copia x = 5 printf(“%d\n”. } Se imprime 5.y). el valor de x no cambia aunque la función haya intentado modificarla  Ejemplo: .

x).*py).PASO POR REFERENCIA  Aquí si la función recibe exactamente la variable enviada     No hay copias Si algo se le hace al parámetro. } .x). printf(“%d\n”. funct(&x). 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 * x = 5 printf(“%d\n”. Se imprime 6. se le esta haciendo a la variable Para esto. el valor de x cambió dentro de la función  Ejemplo: Ejercicio void funct(int *py){ *py = *py+1. printf(“%d\n”.

10*2 = 20 2 + 100 = 102 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  ESTRUCTURAS typedef struct TReg{ int ID. 100   En C. }Reg. UNIONES typedef union TUn{ int ID. . char Texto[100]. char Texto[100]. tenemos: }Un. y estructurados  TIPO ARREGLOS FORMATO DECLARACION Bytes int arrEj[10].TIPOS DE DATOS COMPUESTOS  En ocasiones se necesitan tipos de datos mas complejos.

el arreglo ocupa 400 bytes seguidos . es 1 menos que la dimensión  Si el arreglo tiene 100 elementos. 99 En C.  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) A 0 1 2 3 4  Cada elemento del arreglo tiene un índice   . siempre el índice mas pequeño es el 0: limite inferior El limite superior..ARREGLOS  Conjunto de elementos  Finito. Ordenado y Homogéneo. el índice mas alto es el 99  Y si un entero ocupa 4 bytes.

//Almaceno un valor en el elemento 3 de A for(i = 0. A[5]). //Consulto el contenido de los elementos 4 y 5 de A printf(“%d %d”.  A[3] = 2. para ser tratado como un tipo de dato Faltan las operaciones para actuar sobre él  Consulta de un elemento Modificación de un elemento A[i] = 0.OPERACIONES   Tipo de dato: Conjunto de valores y operaciones definidas solo para esos valores No basta con la declaración. i++) . i < 100.A[4].

sizeof(a)). printf(“%d %d”. 1000 Lista[0] Lista[1] Lista[2] Lista[3] Lista[4] 1008 1016  El computador internamente    No almacena la dirección de todos los elementos del 1024 arreglo Solo almacena la dirección del primer elemento 1032 El resto lo calcula así: &Lista[i] -> &Lista[0] + (i*sizeof(Lista[0])) . sizeof(int).REPRESENTACION INTERNA  Cuantos bytes ocupa un tipo de dato o variable?   En C lo indica el operador sizeof Ejemplo: int a.

. solo para el Siempre reserva memoria Aunque la variable no se use. . tiene memoria propia. pero no en la declaración   Si no. se reserva*/ a = malloc(sizeof(int)).h> void *malloc(size_t size). //No se reserva nada . /*Cuando se desee.RESERVA DE MEMORIA DINAMICA  La declaración de una variable   a no apunta a otra variable. Punteros y Las funciones de librería #include <stdlib. a voluntad dentro del programa La reserva seria dinámica  En C se usan   int *a. //La variable normalmente *a = 3. ya se reservo memoria para ella: ESTATICA  Si deseamos reservar memoria.

. main(){ int *arreglo. Dentro del programa.o cualquier expresión . printf(“Ahora tiene %d elementos para trabajar\n”. arreglo = malloc(sizeof(int)*n). n.n). tendremos Queremos usar arreglos dinámicos   Se declara el arreglo “potencial”: int *arreglo. } Para indicar el nuevo tamaño se puede usar una constante o una variable. n = GetInteger()..ARREGLOS DINAMICOS  En ocasiones deseamos usar arreglos   Donde no hayamos “predefinido” cuantos elementos max. se pide memoria cuando se necesite: arreglo = malloc(sizeof(int)*20). printf(“Ingrese el tamaño del arreglo:”)..

Ejercicio ..Y LIBERA.. a = malloc. … free(a). 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...

ARITMETICA DE PUNTEROS  Los operadores + y –   Se pueden usar con punteros Pero el significado de la operación cambia un poco int x. int *p. 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. Que dirección almacena pi? 102 108 104 . tomemos este ejemplo   Si la dirección de x es un valor 100 y decimos p = p+2. p = &x.

EJERCICIO EN CLASE main(){ double Lista[3]. printf(“%d”. p = p + 2. printf(“%d”.*p1. Lista[1] = 1. p2 = &Lista[0]. *p). p1 = Lista+2. } p2 p 1000 1 1008 Lista[0] Lista[1] 1.2. k). Lista[0] = 1.1. p = p . k = p1-p2.*p2. p = Lista. double *p. printf(“%d”.1. *p). int k.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 . Lista[2] = 1.

también debe incluirse como parámetro float CalcPromedio(float A[]. float funct(float B[]). A[i] = 3. int size){ ….  }  Siempre recuerde que  El paso de arreglos.. es un paso por referencia Ejercicio . int size).  En prototipos y cabecera En el cuerpo de la función float CalcPromedio(float A[].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í.

1) (2.0) (2. Ejercicio (2.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].2) .0) (0.ARREGLOS BIDIMENSIONALES La programación ofrece innumerables opciones  Un elemento de un arreglo.0) (1. A[3] es un arreglo de tres elementos Cada elemento es otro arreglo de 3 elementos enteros (0. puede ser otro arreglo     int A[3][3].2) (1.1) (1.1) (0.

char Ultimo[10].  Ejemplo:   Es la declaración del nuevo “tipo de dato”: NombreCompleto Con este tipo de dato. podremos crear “variables”: NombreCompleto snombre. y Se conoce como “elemento” o “campo” de la estructura typedef struct TNombreCompleto{ char Primero[10].ESTRUCTURAS o REGISTROS  Es un grupo de “componentes”. Cada componente   Tiene su propio identificador. . char Inicial. enombre. }NombreCompleto.

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.  La variable seguida de un punto y del nombre del campo. tendrán la misma “estructura” Cada dato tiene diferente tamaño y espacio en memoria Cada dato representa una información diferente snombre ultimo primero inicial Ejercicio . se indica. Los registros de tipo NombreCompleto. Ejemplo snombre.Inicial = „L‟.

sobrara espacio  En una unión    . capaz de almacenar al mas grande de los miembros Si el elemento escogido es mas pequeño. 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 Solo trabajaremos con un miembro a la vez Hay un solo cajón de memoria.UNIONES   Permite que una variable se interprete de varias formas distintas.

ValorPolimorfico a. if a. elseif a. }. float valor_real. typedef union ValorPolimorifco{ int valor_entero. a. printf(“Tipo de dato:”).valor_real = 8. Tdato tipo.9.tipo == Real then a. typedef enum {Entero.tipo = GetInteger(). }. a.tipo == Entero then a. ValorPolimorfico a. . a. float valor_real.UNIONES typedef union ValorPolimorifco{ int valor_entero.9.valor_entero = 9. Real} Tdato.valor_entero = 9.valor_real = 8.

dentro de una función.AMBITO DE VARIABLES  Los parámetros y variables.  Las variables también pueden tener un ámbito “global”   Empiezan a existir desde su declaración. Se la declara static.   Son variables con ámbito local Solo son validas en ese ambiente. y Son liberadas con el alcance de un archivo: variables externas Para que no pueda ser vista por otros archivos. con ámbito global para archivo únicamente  Para darle privacidad a una variable   .

Sign up to vote on this title
UsefulNot useful