TIPOS DE DATOS ESTRUCTURAS DE DATOS www.espol.edu.ec www.fiec.espol.edu.ec
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 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
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 char c; 100 101 102 103 104
DIRECCIONES DE MEMORIA &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
1000 1001 1002 1003
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; 1000 1001 1002 1003 1004 1005 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 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
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 -42 22 1000 1004 17 22 0 0 163 1004 1000 1004 1008 1012 x y p1 p2
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
”,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
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
”,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
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 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 0 1 2 3 4 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 elemento
A[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
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
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); ... }
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 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?
102 108 104 La suma indica que p se mueva 2 “enteros” mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108
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
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
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
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’;
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
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
0 comments
Post a comment