Você está na página 1de 24

APUNTES DE ESTRUCTURAS Y BASES DE DATOS

CONTENIDO

Tema 1 ______________________________________________________________ 3
Introduccin__________________________________________________________ 3
1.1 Historia del lenguaje de programacin C y C++______________________________ 3
1.2 Programacin Orientada a Objetos ________________________________________ 4
1.3 Caractersticas de la POO ________________________________________________ 5
TEMA 2 _____________________________________________________________ 8
Tipos de Datos ________________________________________________________ 8
2.1 Tipos de datos bsicos en C _______________________________________________ 8
2.2 Tipo de dato char _____________________________________________________ 10
2.3 Tipo de dato int _____________________________________________________ 12
2.4 Tipo de dato long ____________________________________________________ 16
2.5 Tipo de dato float ____________________________________________________ 17
2.6 Tipo de dato double __________________________________________________ 16
2.7 Tipo de dato long double ______________________________________________ 16
2.8 Representacin en punto flotante _________________________________________ 17
2.9 Aritmtica de punto flotante _____________________________________________ 22
2.10 Representacin en formato estndar IEEE (short real) _____________________ 22
2.11 Pase de entero a short real IEEE ________________________________________ 23
2.12 Tipo de dato void ____________________________________________________ 24
Tema 3 _______________________________________ Error! Marcador no definido.
TIPOS DE DATOS DEFINIDOS POR EL USUARIO _________ Error! Marcador no definido.
3.1 Estructuras _____________________________________ Error! Marcador no definido.
3.2 Creacin de una estructura ________________________ Error! Marcador no definido.
3.3 Unin __________________________________________ Error! Marcador no definido.
Tema 4 _______________________________________ Error! Marcador no definido.
APUNTADORES (POINTERS) ________________________ Error! Marcador no definido.
4.1 Definicin ______________________________________ Error! Marcador no definido.
4.2 Operadores * y & en apuntadores __________________ Error! Marcador no definido.
4.3 Operaciones Aritmticas entre Apuntadores _________ Error! Marcador no definido.
TEMA 5 _____________________________________ Error! Marcador no definido.
CLASES _______________________________________ Error! Marcador no definido.
5.1 Definicin de una clase ___________________________ Error! Marcador no definido.
5.1 Definicin de una clase _______________________ Error! Marcador no definido.

1
TEMA 6 ______________________________________ Error! Marcador no definido.
ASIGNACIN DINMICA DE MEMORIA _______________ Error! Marcador no definido.
6.1 Uso de malloc y free ______________________________ Error! Marcador no definido.
Tema 7 _______________________________________ Error! Marcador no definido.
ESTRUCTURAS DINMICAS DE DATOS ________________ Error! Marcador no definido.
7.1 Listas simplemente enlazadas ______________________ Error! Marcador no definido.
7.2 Listas doblemente enlazadas _______________________ Error! Marcador no definido.
7.3 Estructura de datos llamada Pila _________________ Error! Marcador no definido.
7.4 Estructura de datos llamado Cola (Queue) _________ Error! Marcador no definido.
Tema 8 _______________________________________ Error! Marcador no definido.
RECURSIVIDAD _________________________________ Error! Marcador no definido.
8.1 Recursividad ____________________________________ Error! Marcador no definido.
8.2 Tipos de recursin _______________________________ Error! Marcador no definido.
Tema 9 _______________________________________ Error! Marcador no definido.
RBOLES BINARIOS ______________________________ Error! Marcador no definido.
9.1 rboles Binarios _________________________________ Error! Marcador no definido.
Tema 10 ______________________________________ Error! Marcador no definido.
ARCHIVOS Y CORRIENTES _________________________ Error! Marcador no definido.
10.1 Corrientes _____________________________________ Error! Marcador no definido.
10.2 Archivos ______________________________________ Error! Marcador no definido.
10.3 Apuntadores a archivos __________________________ Error! Marcador no definido.
10.4 Lectura y escritura de Bloques ____________________ Error! Marcador no definido.

2
Tema 1
INTRODUCCIN

1.1 Historia del lenguaje de programacin C y C++


Antes de hablar de C y C++, es necesario explicar qu un lenguaje de programacin es
una herramienta que nos permite comunicarnos e instruir a la computadora para que
realice una tarea especfica. Cada lenguaje de programacin posee una sintaxis y un
lxico particular, es decir, forma de escribirse que es diferente en cada uno por la forma
que fue creado y por la forma que trabaja su compilador para revisar, acomodar y
reservar el mismo programa en memoria

Lenguaje C
El lenguaje C se dise en 1972 (Dennis Ritchie). Ms tarde, en 1983, se defini el
estndar ANSI C (que es el que aqu presentaremos). Ya ha quedado dicho que el
lenguaje C est creado para la programacin estructurada.
El lenguaje C tiene muy pocas reglas sintcticas, sencillas de aprender. Su lxico es
muy reducido: tan solo 32 palabras.
A menudo se le llama lenguaje de medio nivel, ms prximo al cdigo mquina que
muchos lenguajes de ms alto nivel. Y por eso mismo es un lenguaje muy eficiente.
Permite el uso del lenguaje ensamblador en partes del cdigo, trabaja a nivel de bit, y
permite modificar los datos con operadores que manipulan bit a bit la informacin.
Tambin se puede acceder a las diferentes posiciones de memoria conociendo su
direccin.
El lenguaje C permite con facilidad la programacin modular, creando unidades
independientes que pueden compilarse de forma independiente, que pueden
posteriormente enlazarse. As, se crean funciones o procedimientos, que se pueden
compilar y almacenar, creando as bibliotecas de cdigo ya editado y compilado que
resuelve distintas operaciones. Cada programador puede disear sus propias
bibliotecas, que simplifican luego considerablemente el trabajo futuro. El ANSI C posee
una amplia coleccin de bibliotecas de funciones estndar y normalizadas.

Lenguaje C++
En 1980 surge C++ de la mano de Bjarne Stroustrup (tambin de Laboratorios Bell de
AT&T). Disea este lenguaje con el objetivo de aadir a C nuevas caractersticas: clases
y funciones virtuales (de SIMULA67), tipos genricos y expresiones (de ADA), la
posibilidad de declarar variables en cualquier punto del programa (de ALGOL68), y
sobre todo, un autntico motor de objetos con herencia mltiple que permite combinar
la programacin imperativa de C con la programacin orientada a objetos. En 1985 se
realizan pruebas permitiendo el uso de este.

3
El nombre de C++ de debe a Rick Mascitti, significando el carcter evolutivo de las
transformaciones de C (++ es el operador de incremento de C).

C++ ha sido ampliamente revisado y refinado, lo que ha dado lugar a aadir nuevas
caractersticas, como herencia mltiple funciones miembro static y const, miembros
protected, tipos genricos de datos o plantillas y manipulacin de excepciones. Se han
revisado caractersticas como sobrecarga, enlace y manejo de memoria. Adems, se
realizaron cambios para as poder incrementar la compatibilidad con C y se aadieron
la identificacin de tipos durante la ejecucin y los espacios de nombres con el objetivo
de convertir a C++ en un lenguaje mas propicio para la escritura y utilizacin de
bibliotecas.
Apartir la estandarizacin publicada en 1998 llamada estndar ISO C++ (ISO/IEC
International Standardization Organization/ International Electrotechnical Commissin)
14882) se logro tener la biblioteca que actualmente incorpora C++ y que fue escrita con
la intencin de que el cdigo se pueda portar entre diferentes plataformas y de incluir
solo aquellas clases que realmente fueran utilizadas por la mayora de los
programadores. Las facilidades proporcionadas por esta biblioteca estndar las
podemos resumir en los siguientes puntos:

Soporte bsico, como por ejemplo identificacin del tipo de los objetos durante la
ejecucin y gestin de memoria.
Soporte proporcionado para la biblioteca de C (manipulacin de cadenas, archivos,
etc.).
La clase string para la manipulacin de cadenas de caracteres.
Clases para la entrada-salida
Clases contenedor como vectores, listas y mapas.
Algoritmo de bsqueda y de ordenacin.
Clases para trabajar con nmeros como son cmath, complex y cstdlib.

C++ es por lo tanto, un lenguaje hbrido que, por una parte, ha adoptado todas las
caractersticas de la programacin orientada a objetos (POO) que no perjudiquen su
efectividad; por ejemplo, funciones virtuales y la ligadura dinmica (dynamic binding), y
por otra parte, mejora sustancialmente las capacidades de C. Esto, junto con la
biblioteca de clases soportada, dota a C++ de una potencia, eficacia y flexibilidad que
lo convierten en un estndar dentro de los lenguajes de programacin orientados a
objetos.

1.2 Programacin Orientada a Objetos


La programacin orientada a objetos (POO) es una forma especial de programar, ms
cercana a como expresaramos las cosas en la vida real que otros tipos de
programacin. Con la POO tenemos que aprender a pensar las cosas de una manera
distinta, para escribir nuestros programas en trminos de objetos, propiedades, mtodos

Durante aos, los programadores se han dedicado a construir aplicaciones muy


parecidas que resolvan una y otra vez los mismos problemas. Para conseguir que los
esfuerzos de los programadores puedan ser utilizados por otras personas se cre la

4
POO. Que es una serie de normas de realizar las cosas de manera que otras personas
puedan utilizarlas y adelantar su trabajo, de manera que consigamos que el cdigo se
pueda reutilizar con el fin de disminuir el costo del software, aumentando la eficiencia
en la programacin y reduciendo el tiempo necesario para el desarrollo de una
aplicacin.

La programacin orientada a objetos (POO) tiene tres caractersticas bsicas: debe


estar basado en objetos, basado en clases y capaz de tener herencia de clases. Muchos
lenguajes cumplen uno o dos de estos puntos; muchos menos cumple los tres. La
barrera ms difcil de sortear es usualmente la herencia.

La idea central es simple: organizar los programas a imagen y semejanza de la


organizacin de los objetos en el mundo real.

Todo objeto del mundo real tiene 2 componentes: caractersticas y comportamiento. Por
ejemplo, los automviles tienen caractersticas (marca, modelo, color, velocidad
mxima, etc.) y comportamiento (frenar, acelerar, retroceder, llenar combustible,
cambiar llantas, etc.).
Los Objetos de Software, al igual que los objetos del mundo real, tambin tienen
caractersticas y comportamientos. Un objeto de software mantiene sus caractersticas
en una o ms "variables", e implementa su comportamiento con "mtodos". Un mtodo
es una funcin o subrutina asociada a un objeto.

Para redondear estas ideas, imaginemos que tenemos estacionado en nuestra cochera
un Ford Focus color azul que corre hasta 200 km/h. Si pasamos ese objeto del mundo
real al mundo del software, tendremos un objeto Automvil con sus caractersticas
predeterminadas:

Marca = Ford
Modelo = Focus
Color = Azul
Velocidad Mxima = 200 km/h

1.3 Caractersticas de la POO


No hay un acuerdo aceptado por todo el mundo respecto a cules son las caractersticas
que definen la POO, pero al menos todos concuerdan en estas:

Abstraccin:

Es la capacidad de separar los elementos (al menos mentalmente) para poder verlos de
forma singular. Como cuando describimos el cuerpo humano y decimos cabeza,
brazo(s), pierna(s), etc. Cada objeto en el sistema sirve como modelo de un "agente"

5
abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con
otros objetos en el sistema sin revelar cmo se implementan estas caractersticas.

Encapsulamiento:

Tambin conocida como ocultamiento. Se encarga de mantener ocultos los procesos


internos que necesita para hacer lo que sea que haga, dndole al programador acceso
slo a lo que necesita. Esto da dos ventajas iniciales: Lo que hace el usuario puede ser
controlado internamente (incluso sus errores), evitando que todo colapse por una
intervencin indeseada. La segunda ventaja es que, al hacer que la mayor parte del
cdigo est oculto, puedes hacer cambios y/o mejoras sin que eso afecte el modo como
los usuarios van a utilizar tu cdigo. Slo tienes que mantener igual la forma de acceder
a l. Estas puertas de acceso que das a los usuarios son lo que se conoce como interfaz.

Poliformismo:

Esta propiedad indica la posibilidad de definir varias operaciones con el mismo nombre,
diferencindolas nicamente en los parmetros de entrada. Dependiendo del objeto que
se introduzca como parmetro de entrada, se elegir automticamente cual de las
operaciones se va a realizar.

Ya est habituado al operador <<suma>> que est presente en todos los lenguajes de
programacin. Sin embargo, los operadores <<suma de fracciones>> y <<suma de
nmeros complejos>> no existen en casi ningn lenguaje de programacin.

Los lenguajes POO permiten definir un operador <<suma>> tal que reconozca que tipo
de objeto se le est aplicando, a travs de operaciones de objetos. Previamente deber
definir la fraccin y el nmero complejo como una clase y la operacin suma como una
operacin de una clase. Definiendo adecuadamente la operacin suma de fracciones y
suma de nmeros imaginarios, el operador suma devolver, en el caso que los
operandos sean fracciones, una fraccin y en el caso de los nmeros imaginarios, otro
nmero imaginario. Es posible extender el concepto e incluso definir operaciones como
suma de bases de datos.

6
Herencia:

La herencia es la capacidad que tiene una clase de derivar las propiedades y mtodos
de otra. Consiste en la propagacin de los atributos y las operaciones a travs de
distintas subclases definidas a partir de una clase comn. Nos permite crear estructuras
jerrquicas de clases donde es posible la creacin de subclases que incluyan nuevas
propiedades y atributos. Estas subclases admiten la definicin de nuevos atributos, as
como crear, modificar o inhabilitar propiedades.

Para pensarlo de manera ms fcil podemos abstraernos al siguiente ejemplo.


Pensemos en los distintos submodelos asociados a un modelo bsico de automvil. A
partir de este modelo bsico, los fabricantes introducen distintas caractersticas (aire
acondicionado, ABS, distintas tapiceras, acabados, etc.) que crean subclases. Todas
estas subclases tienen en comn la estructura bsica (chasis, direccin , etc.) o varan
slo en algunos de sus componentes.

Asociemos a este tipo bsico una clase cuyos atributos representen las piezas que
componen el coche. Las subclases aportarn sus propios atributos (en el caso de
vehculos con aire acondicionado, todas aquellas piezas que lo componen), permitiendo
la definicin de todos los posibles modelos.

7
TEMA 2
Tipos de Datos

2.1 Tipos de datos bsicos en C

En el manejo del lenguaje C se utilizan diferentes tipos de variables

Variables Numricas: Diferentes valores numricos tienen requisitos de


almacenamiento de memoria variables, y difieren en la facilidad con que ciertas
operaciones matemticas pueden ser ejecutas con ellos.

Los nmeros enteros pequeos ocupan poco espacio de memoria para


almacenamiento, as como las operaciones matemticas (suma, multiplicacin, etc.)
siendo as rpidamente ejecutadas por la computadora.

Los nmeros enteros largos y los valores de punto flotante utilizan ms espacio en
almacenamiento, obteniendo una ejecucin de operaciones ms lentas. Las variables
numricas del C caen en las dos categoras principales:

Las variables enteras guardan valores que no tienen fracciones usan nicamente
nmeros enteros. Dentro de las variables enteras existen con signo y sin signo. Las
variables enteras con signo ayudan a guardar valores positivos o negativos, en
cambio las variables enteras sin signo nicamente guardar valores positivos
incluyendo el 0.

Las variables de punto flotante guardan valores que tienen fracciones (nmeros
reales).

Dentro de estas categoras se encuentran dos o ms tipos especficos de variables.


Ellos estn resumidos en la siguiente tabla, que tambin muestra la cantidad de
memoria en bytes que se requiere para guardar una sola variable de cada tipo cuando
se usa una computadora de arquitectura de 32 bits.

El rango aproximado (como se puede ver en la siguiente tabla) significa los valores
mximos y mnimos que puede guardar una variable dada, (por desgracia las
limitaciones de los espacios impiden listar los rangos exactos para cada una de estas
variables).

Precisin significa la cantidad de dgitos con los cuales es guardada la variable.


Al ver la tabla puede darse cuenta de que los tipos de variable int y short son idnticos,
pero eso es solamente en los sistemas compatibles con la PC de IBM de 32 bits, por
que pueden ser diferentes en cualquier otro tipo de Hardware. En un sistema VAX, un
short y un int no son del mismo tamao, en este caso un short es de dos bytes y un int
es de cuatro.

8
TIPOS DE VARIABLES

Tipo de variables Palabra Bytes Rango


clave requeridos
Carcter char 1 -128 a 127

Entero int 2 -32768 a 32767

Entero Corto short 2 -32768 a 32767

Entero Largo long 4 -2,147,483,648 a


2,147,483,647
Carcter sin signo unsigned char 1 0 a 255

Entero sin signo unsigned int 2 0 a 65535

Entero corto sin unsigned short 2 0 a 65535


signo
Entero largo sin unsigned long 4 0 a 4,294,967,295
signo
Punto flotante de float 4 1.2E-38 a 3.4E38
precisin sencilla
Punto flotante de double 8 2.2E-308 a 1.8E308
doble precisin
Rango
aproximado;
precisin = 7
dgitos
Rango
aproximado; doble
precisin =19
dgitos

Modificadores de tipo signed, unsigned, short y long.

Hay varios modificadores de tipos fundamentales de datos. Los archivos de


cabecera limits.h, float.h, especifican los valores mximos y mnimos para cada
tipo. Los podemos clasificar en:

Tipos enteros: char, short, int, long.


Tipos reales: float, double y long double.
Otros: void.

Cada tipo puede ser calificado por las palabras clave signed o unsigned, lo que
da lugar a tener disponibles los siguientes tipos extras:

9
signed char
unsigned char
signed short
unsigned short
signed int
unsigned int
signed long
unsigned long

Un entero calificado signed es un entero con signo, esto es, un nmero entero
positivo o negativo. Un nmero entero calificado unsigned es un nmero enero
sin signo, el cual es manipulado como un nmero entero positivo.

Si los calificadores signed y unsigned se utilizan sin un tipo especfico, se usa el


tipo int.

Por este motivo las siguientes declaraciones son equivalentes:

signed x;
signed int x;

unsigned y;
unsigned int y;

2.2 Tipo de dato char


char (carcter 1 byte)

El tipo char es utilizado para almacenar un valor entero en el rango de -128 a


127, correspondiente a un carcter del cdigo ASCII. Solamente los valores de
0 a 127 son equivalentes a un carcter.
De forma similar el tipo unsigned char puede almacenar valores en rango de 0
a 255, valores correspondientes a los nmeros ordinales de los 256 caracteres
ASCII.

En ASCII C, signed y unsigned char son tipos diferentes.

Ejemplo, char car;

Este ejemplo declara una variable llamada car de tipo char, capaz de contener
un carcter cuyo cdigo ASCII se corresponder con un valor entero entre 0 y
127. Otros ejemplos son:

char a = z;
signed char b = 0x07;
unsigned char c = 32;

char es la abreviacin de signed char.

ocupa 1 byte de memoria

10
1 byte = 8 bits

8 bits = 1 byte

64 32 16 8 4 2 1 Valor de la posicin

1 2 3 4 5 6 7 8

NOTA: La palabra bit


bit de signo proviene de:
0=+ binary
1=-
bit
Ejemplo: digit
00000000 = + 0
01111111 = + 127
11111111 = - 127
10000001 = -1
10000000 = -0 = -128

Rango de valores char: -128 a +127 (256 valores)


La tabla ASCII tiene 256 caracteres.

11
PROGRAMA # 1

Usando el tipo de dato unsigned char, desplegar en la pantalla la tabla ASCII

#include<conio.h>
#include<string.h>
#include<iostream>
//#include<iomanip.h>

using namespace std;

// PROGRAMA No.1

int main(void)
{
unsigned char c;
cout<<" TABLA ASCII"; cout<<"\n\n\n Este programa despliega en la pantalla la tabla
ASCII";
cout<<"\n En modo caracter y sus valores en decimal y hexadecimal \n\n";
getch();

system("cls");
cout<<"------------------------------------------------------------"<<endl;
cout<<"| CARACTER DECIMAL HEXADECIMAL |"<<endl;
cout<<"------------------------------------------------------------"<<endl;

for(c=0;c<255;c++)
{
cout<<endl<<"| "<<c<<" |"<<"\t"<< dec << (int)c <<" |"<< hex << (int)c <<" |";
getch();
}

cout<<endl<<"| "<<c<<" |"<<"\t"<< dec << (int)c <<" |"<< hex << (int)c <<" |";
cout <<endl;
cout<<"----------------------------------------";
getch();
return(0);
}

12
2.3 Tipo de dato int

Ocupa 2 4 bytes de memoria dependiendo del procesador (32 64 bytes).

short int (entero formato corto ocupa 2 bytes)

El tipo short proporciona un entero en el rango de valores de: -32768 a +32767

De forma similar el tipo unsigned short puede almacenar valores en el rango de:
0 a 65535.

Ejemplo:

short i, j;

Este ejemplo declara i y j como variables enteras con posibilidad de tomar


valores entre -32768 y 32767. Otros ejemplos son:

shor int a = -500;


signed short b = 1990;
unsigned short int c = 0Xf000;

short es la abreviacin de signed short int.

Un entero es para C un nmero sin punto decimal. El rango de valores depende


de la mquina. Igualmente ocurre con el tipo unsigned int. Para una mquina con
un procesador de 16 bits el rango de valores es de:

-32768 a +32767 para el tipo int.


0 a 65535 para el tipo unsigned.

El uso de enteros produce un cdigo compacto y rpido. Para una mquina de


16 bits. Este tipo es equivalente al tipo short y solamente ocupa 2 bytes de
memoria.

En general:

tamao (short) tamao (int)

int ocupa 2 bytes de memoria

Short( entero formato corto 2 bytes)

13
2 bytes = 16 bits

16385 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

bit de signo
0=+
1=-

Ejemplo: Representacin de los valores enteros

0000000000000000 = + 0
0000000000000001 = +1
0111111111111111 = + 32767
1000000000000000 = - 0 = -32768
1111111111111111 = -32767

Rango de valores int (2 bytes): -32768 a +32767


unsigned int: Rango de valores de 0 a 65535

Ejemplos:
int a = 2000;
signed int b= -30;
unsigned int c = oxf003;

int es lo equivalente de signed int.

14
PROGRAMA #2

Programa que sirve para simular el movimiento de un carcter

#include<conio.h>
#include<string.h>
#include <stdio.h>
#include<iostream>
#include<time.h>
#include<ctime>

using namespace std;

void delay(int secs)


{
for(int i = (time(NULL) + secs); time(NULL) != i; time(NULL));
}

/* La funcin time(NULL) nos devuelve el segundo exacto en que estamos.


1. Si le sumamos cierta cantidad de segundos obtenemos una fecha en el futuro.
2. En cada vuelta del ciclo se checa si esa fecha en el futuro es diferente a la fecha
actual.
3. En cuanto las dos fechas son iguales el ciclo acaba y el programa contina.*/

// PROGRAMA No.2

int main(void)
{

int i, j;
int xmin=1,xmax=15,ymin=1,ymax=3;
system("cls");
cout<<"\t\t\t\t\tMANEJO DE DATOS ENTEROS\n\t\SIMULACION DE
MOVIMIENTO\n\n";
cout<<"\n\n\t\tpresione cualquier tecla para continuar";
getch();
system("cls");

for(j=ymin; j<ymax;j++)
{
for(i=xmin;i<=xmax;i++)
{ cout<<">"; delay(1);
cout <<"\b ";
}cout<<endl;
}
cout<<"\n FIN";
getch();

cout<<"\nfin del programa \n\n\n\n\n\npresione cualquier tecla para salir";


getch();
}

15
2.4 Tipo de dato long
(entero largo 4 bytes)

Este tipo de nmeros es idneo para aplicaciones de gestin. Al igual que los
enteros, son nmeros sin punto decimal comprendidos en el rango de:
-2147483648 a 2147483647 para tipo long.
0 a 4294967295 para el tipo unsigned long.
En general:
tamao (int) tamao (long).

2.6 Tipo de dato double


(Reales en doble precisin.- 8 bytes)

Un nmero real en doble precisin es uno que puede tener un punto decimal y
puede estar comprendido en el rango de:

-1.79769E+308 a -2.22507E-308 para nmeros negativos.


2.22507E-308 a 1.79769 E+308 para nmeros positivos.

Un nmero real en doble precisin tiene 16 dgitos significativos. Estos dan


lugar a clculos ms exactos que en simple precisin.

Ejemplo:

double x;

Este ejemplo declara la variable x de tipo real en donde precisin. Otros


ejemplos son:

double a= 3.1415926;
double b= 2.2 e-8

2.7 Tipo de dato long double


(Reales en doble precisin formato largo.- 10 bytes)

Los valores para este tipo estn comprendidos en el rango de:

-1.189731E+4932 a -3.362103E-4932 para nmeros negativos.


3.362103E-4932 a 1.189731E+4932 para nmeros positivos.

16
Un nmero real en doble precisin formato largo no tiene ms de 19 dgitos
significativos. Esto da lugar a clculos ms precisos que en doble precisin.
Ejemplo:

long double x;
long double>=3.17e+425;

2.5 Tipo de dato float

Ocupa 4 bytes de memoria


4 bytes = 32 bits

float (reales en simple precisin.- 4 bytes)

IBM = FORMATO IBM DE PUNTO FLOTANTE


DIGITAL = FORMATO VAX
IEEE = FORMATO IEEE DE PUNTO FLOTANTE

Estos nmeros son los ms recurridos en un lenguaje de programacin. Un real


en simple precisin es un nmero que puede tener un punto decimal y que puede
estar comprendido en el rango de:
-3.402823E+38 a -1.175494E-38 para nmeros negativos.
1.175494E-38 a 3.402823E+38 para nmeros positivos.

Un nmero real en simple precisin no tiene ms de 7 dgitos significativos.


Ejemplo:

float x;

Este ejemplo declara la variable x de tipo real en simple precisin. Otros


ejemplos son:

float a = 3.14159;
float b = 2.2 e-8;

2.8 Representacin en punto flotante

Existen varias formas de almacenar en la memoria, un dato en punto flotante.


Una de ellas es la que se trata aqu.

Las computadoras representan los nmeros reales utilizando una notacin


semejante a la conocida notacin cientfica normalizada

17
Signo exponente signo exponente

+ 0.602 X 10 -22 + 0.101110 X 2 -1100

Mantisa base Mantisa base

NOTACIN CIENTFICA NORMALIZADA REPRESENTACIN EN UN PUNTO


FLOTANTE NORMALIZADA

En todo nmero en punto flotante se distinguen cuatro componentes:

SIGNO: Indica el signo del nmero (0= positivo, 1= negativo)


MANTISA: Contiene la magnitud del nmero (en binario puro)
EXPONENTE: Contiene el valor de la potencia de la base (notacin exceso)
BASE: Queda implcita y es comn a todos los nmeros (habitual base 2)

Otras alternativas menos extendidas para la representacin de los nmeros


reales

Notacin punto fijo (primeros computadores)


Ciertas representaciones involucran el almacenamiento de los logaritmos de
un nmero (las multiplicaciones se pueden implementar mediante sumas).
Notacin racional: se utilizan dos nmeros enteros (a, b) para representar la
fraccin a/b.

Un mismo nmero puede tener varias representaciones (0.11.2 5= 110.22=


0.0110.26). Los nmeros suelen estar normalizados. Un nmero esta
normalizado en base dos si tiene la forma:

0.1 XXXXXXXX 2XXX


Tienen siempre un 1 a la izquierda
Se pueden almacenar de forma
implcita
1. XXXXXXXX 2XXX

FORMATO DE PUNTO FLOTANTE DE 32 BITS

1 bit 8 bits 23 bits

sig exponente mantisa

32 bits

18
El rango de valores representable por cada uno de los campos es:

Exponente (8 bits en exceso 128): -128 +127


Mantisa (23 bits normalizados 1.M): los valores binarios representables
oscilan entre 1.000 y 1.111. (1 y 2-2-23)

OVERFLOW Y UNDERFLOW:

Overflow

Es una situacin de overflow aqulla en la que hemos sobre pasado las


capacidades de que disponemos cuando, por ejemplo, el ordenador nos
indica que no dispone de memoria suficiente para responder a un
requerimiento concreto que le hemos pedido. Un ejemplo ms grfico es el
de una elemental calculadora de 8 dgitos que no puede mostrar en su
pantalla el resultado de una operacin en cientos de millones.

Underflow

Es un estado de underflow aquel que resulta de la pretensin de operar con


cantidades demasiado pequeas.

La cantidad de nmeros representables es 232. El espacio de representacin


no es uniforme: mayor densidad cerca de o!!


-n 0 n 2Xn 4Xn

PRECISIN: Depende del nmero de bits de la mantisa. Con 23 bits es


imposible distinguir entre 2 nmeros que se diferencien en 2-23=10-7.
Precisin 23 bits, precisin 7 dgitos decimales, Epsilon (eps) del computador: 2 -
23

PUNTO FLOTANTE IEEE

El punto flotante es un mtodo muy til para realizar operaciones numricas


cuando estas tienen una magnitud muy diferente, el microprocesador 8088 no
posee en forma nativa la posibilidad de su uso, se deben recurrir a emuladores

19
o coprocesadores para poder usarlos, y si bien actualmente todas las PC que
podemos encontrar poseen coprocesadores, no pasa lo mismo con los
microcontroladores que en su mayora no lo soporta.
Si bien el ensamble posee emuladores de coma flotante, lo que se intenta, es
que se comprenda el uso del punto flotante para luego poder ser utilizado en
cualquier microprocesador o microcontrolador que no posee ninguna
caracterstica de manejo para estos nmeros.

Componentes
Un nmero flotante esta formado por:

- 1 . 10111 X 21101

Exponente
Mantisa (parte decimal)

Mantisa (parte entera)

Signo

Cada una de estas partes del punto flotante tendrn una ubicacin determinada
dentro de la codificacin del nmero, y su longitud detendr el tipo del nmero.

EXPONENTE

El exponente de un nmero de punto flotante es modificado antes de su


almacenamiento.
El nmero a almacenar en la posicin del exponente ser igual a:

eieee = e + 2m-1 -1

Donde e ser el exponente real y me es el nmero de bits del exponente en el


formato elegido. Esta modificacin se realizara para evitar el uso de un bit de
signo, lo que permite realizar comparaciones mas fcil entre exponentes, dado
que estamos sumando 2m-1 -1 que es igual a sumar la mitad del mximo valor
que se puede almacenar en el exponente.

MANTISA

La mantisa debe cumplir 1 = mantisa<2. Por lo tanto la parte entera ser siempre
1 y solo ser guardada en el nmero la parte decimal justificada a la derecha (un
caso particular es el 10 byte real, en el cual el campo de parte entera existe, y
siempre valdr 1).

20
Signo

1 = NEGATIVO
0 = POSITIVO

TIPOS

SHORT REAL NUMBER

Signo: 1 bit
Exponente: 8 bits
Mantisa (parte decimal): 23 bits
Total: 32 bits (4 bytes).

Como la parte entera es siempre 1 directamente lo asume y no lo incluye en la


codificacin

LONG REAL NUMBER

Singo: 1 bit
Exponente: 11 bits
Mantisa (parte decimal): 52 bits
Total: 64 bits (8 bytes)

Como la parte entera es siempre 1 directamente lo asume y no lo incluye en la


codificacin.

21
2.9 Aritmtica de punto flotante

Pase de un nmero real a Short Real IEEE.


Dado un nmero lo pasaremos a punto flotante en base 2

X=3.625
El nmero ser de la forma (-1)5 X f X 2e.

Al ser el nmero del ejemplo positivo entonces ya tenemos la primera incgnita


s=0, f deber ser un nmero cuya parte entera sea 1 por lo tanto debe cumplir
que 1<=f<2

Sacamos el exponente
f X 2e = 3.625

e= int ( ln(3.625)/ ln (2) )


= int(1.85798)
e =1

Dado que 3.625 = f X 21, entonces f= (3.265/ 21 )=1.8125.


Pasamos el resultado a base 2
Parte entera = 1

Parte decimal:
0.8125 X 2 = 1.625 entero =1
0.625 X 2 = 1.25 entero =1
0.25 X 2 = 0.5 entero =0
0.5 X 2 = 1 entero= 1

f= 1.1101

resultado:

x=(-1)0 X 1.1101 X 21

2.10 Representacin en formato estndar IEEE (short real)

Signo= 0
Mantisa = 110100000000000000000002
Exponente:
exp= 1 +27 -1= 1 +127 = 128
exp= 100000002

Resultado
x= 3.625
x= 1.1101x21
22
x= 0_10000000_11010000000000000000000
x=4068000016

2.11 Pase de entero a short real IEEE

Si quisiramos realizar un programa que transformara un nmero apto flotante


este generalmente sera entero, por lo tanto aqu describiremos un mtodo ms
sencillo de pasar de entero apto flotante para ser aplicado a un programa.

A modo de ejemplo necesitamos almacenar el nmero 2356 en formato punto


flotante tipo short real de 32 bits.

Primero debemos realizar una funcin que almacene el valor en el nmero. Est
funcin realizar lo siguiente:
carga el bit de signo con el signo del nmero.
guarda en la mantisa el valor ABSOLUTO del nmero.
Calcular el exponente y guardarlo en el campo correspondiente.

Para la realizacin del clculo del exponente deberemos saber primero como
estamos almacenando el nmero.

Hasta ahora tenemos:

0 00000000 00000000000 100100110100


Donde 235610 = 1001001101002

La mantisa ingresada corresponde a la parte decimal del nmero por lo tanto el


nmero nos quedara expresado como:

x = 1,000000000001001001101 x 2e

Esto significa que el exponente no puede ser 0, sino que ser un nmero que
recorra la coma a la derecha tantos lugares como longitud de mantisa tenga,
para este caso sern 23, adems sabemos que el valor a almacenar en el campo
de exponente es

exp = 23 + 127 = 150

0 10001010 00000000000100100110100

Una vez hecho esto debemos realizar otra operacin llamada normalizacin.
Esta operacin realiza sucesivos shift register a la izquierda al mismo tiempo

23
que se decrementa el exponente hasta que el shift register provoque el desborde
de un uno.

Esto es necesario porque como ya vimos este formato supone la existencia de


un uno como parte entera, condicin que no respetaba el nmero que
ingresemos.
Quedando el nmero final como:

0 10001010 00100110100 000000000000

2.12 Tipo de dato void


El tipo void se utiliza para declarar funciones que no retornan un valor o para
declarar un puntero a un tipo no especificado. Si void aparece entre parntesis
a continuacin del nombre de una funcin, no es interpretado como un tipo, en
este caso indica que la funcin no acepta argumentos.

Ejemplo:

double fx(void);
double fy(void);
void *p;

Este ejemplo declara la funcin denominada fx como una funcin sin argumentos
que devuelve un valor de tipo real de doble precisin; la funcin fy, como una
funcin sin argumentos que no devuelve valor alguno; y un puntero p a un objeto
de un tipo especificado.

PROGRAMA #3

24

Você também pode gostar