Sei sulla pagina 1di 20

Estructuras de Datos

Tipos de datos en C

20 Sep 2007 Héctor Alejandro Montes 1


ADVERTENCIA!

No use estas diapositivas como referencia


única de estudio durante este curso. La
información contenida aquí es sólo una guía para
las sesiones de clase y de estudio futuro. Para
obtener información más completa, refiérase a la
bibliografía dada durante la presentación del
curso.

20 Sep 2007 Héctor Alejandro Montes 2


Tipos de datos en C
● C tiene un concepto de “tipo de datos” que se
utilizan para definir una variable antes de su
uso
● La definición de una variable le asigna espacio
de memoria y define el tipo de datos que podrá
contener
● Tipos disponibles: , void, int, float, double, char
y enum

20 Sep 2007 Héctor Alejandro Montes 3


Tipos de datos en C

● Varios de estos tipos de datos pueden utilizar


los siguientes modificadores:
– signed, unsigned, short, long
● Los modificadores definen la cantidad de
espacio asignado a la variable
20 Sep 2007 Héctor Alejandro Montes 4
Tipos de datos en C

Tipo Bytes Bits Rango

short int 2 16 -32,768 -> +32,767 (32kb)


unsigned short int 2 16 0 -> +65,535 (64Kb)
unsigned int 4 32 0 -> +4,294,967,295 ( 4Gb)
int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
long int 4 32 -2,147,483,648 -> +2,147,483,647 ( 2Gb)
signed char 1 8 -128 -> +127
unsigned char 1 8 0 -> +255
float 4 32
double 8 64
long double 12 96

20/09/07 Héctor Alejandro Montes V. 5


Tipos de datos en C
● El tamaño y rango de cualquier tipo de dato
depende del compilador y de la arquitectura

● El archivo float.h a menudo define valores


máximos y mínimos para los diferentes tipos

● Podemos utilizar la función sizeof para


determinar el tamaño en bytes de cualquier tipo
de datos. Ver types.c

20 Sep 2007 Héctor Alejandro Montes 6


Tipos de datos en C
● Calificadores
– volatile
– const
● El valor de la variable no puede ser cambiado después
de inicializarse, ejemplo:
const float pi=3.14159;
– Otra manera de definir constantes es con la
directiva del preprocesador #define que tiene la
ventaja de no usar memoria

20 Sep 2007 Héctor Alejandro Montes 7


Tipos de datos en C
●¿Cuál usar?
● Velocidad de la luz ● double
● Tú nombre ● char
● Tú calificación y/o promedio ● double/float
● Número de estudiantes en ED ● int
● Coordenada de un punto en la ● float/int
pantalla

265
● long int
● $234.77 ● float/double
● La mitad de $234.77 ● float/double
● Bits por segundo transmitido por ● int/float
un módem

20 Sep 2007 Héctor Alejandro Montes 8


Arreglos y apuntadores
● Arreglos
– Un conjunto ordenado (secuencia) con un número
fijo de elementos, todos del mismo tipo
– Donde la operación básica es
● Acceso directo a cada elemento en el arreglo para que
los valores puedan ser recuperados o almacenados
– Acceso directo: accesar un elemento dando su
localización
– En contraste al acceso secuencial, el tiempo de
acceso es el mismo para todo elemento sin
importar su posición
20 Sep 2007 Héctor Alejandro Montes 9
Arreglos
tipo nombre_arr[MAX]
● El compilador reserva un bloque consecutivo de
localidades de memoria, suficiente para contener MAX
valores de tipo tipo
● Los elementos del arreglo se indexan 0, 1, 2, ..., MAX-1
calif[0]
– e.g. double calif[30]; calif[1]
calif[2]
calif[3]
. .
. .
. .
calif[29]

20 Sep 2007 Héctor Alejandro Montes 10


Inicialización de arreglos
● Ejemplo:
double rate[5] = {0.11, 0.13, 0.16, 0.18, 0.21};

0 1 2 3 4
rate 0.11 0.13 0.16 0.18 0.21

double rate[5] = {0.11, 0.13, 0.16};

0 1 2 3 4
rate 0.11 0.13 0.16 0 0

● Es un error si se asignan más valores de lo permitido; su manejo depende


del compilador
● Si no se proveen valores, los elementos del arreglo son indefinidos (basura)

20 Sep 2007 Héctor Alejandro Montes 11


Arreglos tipo caracter
● Inicializados de la misma manera que los númericos
char vowel[5] = {'A', 'E', 'I', 'O', 'U'};
0 1 2 3 4
vowel A E I O U

● Si se proveen menos valores que el tamaño declarado del


arreglo, los ceros de relleno son interpretados como el caracter
nulo '\0' (código ASCII 0)
char collegeName[10]={'C', 'a', 'l', 'v', 'i', 'n'};
0 1 2 3 4 5 6 7 8 9
collegeName C a l v i n \0 \0 \0 \0

20 Sep 2007 Héctor Alejandro Montes 12


Direcciones
● Cuando se declara un arreglo, la dirección del primer byte (o
palabra) en el bloque de memoria asociado con el arreglo se
llama dirección base
● Cada referencia al arreglo debe ser traducida en un
desplazamiento desde la dirección base
printf(“%d\n”, score[3]); score → 0x1396 [0]
[1]
score[3] → 0x1396 + 3 * (sizeof double)
[2]
= 0x1396 + 3 * 8
0x13ae [3]
= 0x13ae . .
. .
. .
[99]

● Esta traducción de dirección se hace cada vez que un elemento


del arreglo se accesa
20 Sep 2007 Héctor Alejandro Montes 13
Arimética de direcciones
● Una referencia al arreglo array_name[index]
● Es quivalente a *(array_name + index)

'*' es el operador de dirección

*ref devuelve el contenido de la localidad de memoria con
dirección ref
● Los siguientes pseudocódigos son equivalentes:
print score[3])
print *(score + 3)
● Advertencia: No se verifican los límites al compilar

20 Sep 2007 Héctor Alejandro Montes 14


Programas ejemplo
● Apuntadores y su arimética (revisión)
– ptr_sample.c
– array_ptr.c
– strcpy.c: contiene strcpm_arr(), strcmp_ptr(),
strcpy_arr(), strcpy_ptr(), strcpy_ptr1()

20/09/07 Héctor Alejandro Montes V. 15


Problemas con los arreglos
● El tamaño de un arreglo no puede cambiar
durante la ejecución del programa
– Desperdicio de memoria
– Errores de fuera de rango

● C++ utiliza arreglos dinámicos a través de la


clase <vector>

20 Sep 2007 Héctor Alejandro Montes 16


Arreglos mutidimensionales
● Los arreglos en 2D son útiles cuando los datos pueden ser
ordenados de manera tabular
● Los arreglos de mayores dimensiones cuando varias
características se asocian con datos
● Ejemplo: Una tabla con calificaciones de varios examenes
Test 1 Test 2 Test 3 Test 4
Student 1 99.0 93.5 89.0 91.0
Student 2 66.0 68.0 84.5 82.0
Student 3 88.5 78.5 70.0 65.0
: : : : :
: : : : :
Student-n 100.0 99.5 100.0 99.0

20 Sep 2007 Héctor Alejandro Montes 17


Arreglos en 2D y 3D
● Declaración: [0] [[1] [2] [3]
[0]
[1]
double scoresTable[30][4]; [2]
[3]

.
.
.
● Inicialización: [29]

double rates[2][3] = {{0.50, 0.55, 0.53}, // primer renglón


{0.63, 0.58, 0.55}}; // segundo...

● Arreglos en 3D
const int RANKS = 10, ROWS = 30, COLUMNS = 4;
typedef double ThreeDimArray[RANKS][ROWS][COLUMNS];
ThreeDimArray gradeBook;

20 Sep 2007 Héctor Alejandro Montes 18


Ejemplos: Operaciones con Matrices

Matriz Multiplicación por escalar

Suma y resta Multiplicación (A*B ≠ B*A)

20 Sep 2007 Héctor Alejandro Montes 19


Ejemplos: Operaciones con Matrices

Transpuesa ((A')' = A) Inversa

Inversa y determinante

20 Sep 2007 Héctor Alejandro Montes 20

Potrebbero piacerti anche