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 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
100
101
102
103
104
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;
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
1000
1004
1008
1012
x
y
p1
p2
-42
22
1000
1004
17
22
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 = 5
printf(“%dn”,x);
funct(x);
printf(“%dn”,x);
void funct(int y){
y = y+1;
printf(“%dn”,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(“%dn”,x);
funct(&x);
printf(“%dn”,x);
void funct(int *py){
*py = *py+1;
printf(“%dn”,*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
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 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
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 trabajarn”,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);
}
1000
1008
1016
Lista[0]
Lista[1]
Lista[2]
p
p2
p1
p 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 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
(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
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
 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

1.Tipos de Datos.ppt

  • 1.
  • 2.
    OBJETIVOS  Manejo correctoy 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.
  • 3.
    DATO  Información enbruto, 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
  • 4.
    INFORMACIÓN  Es elresultado 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
  • 5.
    ¿Cómo representar losdatos?  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
  • 6.
    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
  • 7.
    RECORDAR  Un tipode 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
  • 8.
    TIPOS DE DATOSBASICOS  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
  • 9.
    Y EN LACOMPUTADORA?  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
  • 10.
    ALMACENANDO DATOS TIPO DEDATO #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.
    DECLARACION DE VARIABLES  Unadeclaració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 100 101 102 103 104 char c;
  • 12.
    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
  • 13.
    DECLARACION DE PUNTEROS  Untipo 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
  • 14.
    CONSULTANDO CONTENIDO  Siun 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
  • 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 1000 1004 1008 1012 x y p1 p2 -42 22 1000 1004 17 22 0 0 163 1004
  • 16.
    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
  • 17.
    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(“%dn”,x); funct(x); printf(“%dn”,x); void funct(int y){ y = y+1; printf(“%dn”,y); } Se imprime 5, el valor de x no cambia aunque la función haya intentado modificarla
  • 18.
    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(“%dn”,x); funct(&x); printf(“%dn”,x); void funct(int *py){ *py = *py+1; printf(“%dn”,*py); } Se imprime 6, el valor de x cambió dentro de la función Ejercicio
  • 19.
    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
  • 20.
    ARREGLOS  Conjunto deelementos  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 0 1 2 3 4 ... A 99
  • 21.
    OPERACIONES  No bastacon 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
  • 22.
    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í:
  • 23.
    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
  • 24.
    ARREGLOS DINAMICOS  Enocasiones 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 trabajarn”,n); ... }
  • 25.
    Y LIBERA..  Alpedir 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
  • 26.
    ARITMETICA DE PUNTEROS  Losoperadores + 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
  • 27.
    EJERCICIO EN CLASE main(){ doubleLista[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 p1 p se mueve 2 desfases p retrocede un desfase Da el total de desfases entre p1 y p2 1 1.1 1.2 Ejercicio
  • 28.
    PASO DE ARREGLOSA 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
  • 29.
    ARREGLOS BIDIMENSIONALES  La programaciónofrece 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
  • 30.
    ESTRUCTURAS o REGISTROS  Esun 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;
  • 31.
    USANDO ESTRUCTURAS primero inicial ultimo snombre Losregistros 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 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
  • 32.
    UNIONES  Permite queuna 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
  • 33.
    UNIONES typedef union ValorPolimorifco{ intvalor_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;
  • 34.
    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