Está en la página 1de 12

Volumen 3 Nº 1 INDUSTRIAL DATA Pag.

75 - 80

CLASES DE DATOS
Edgar Ruiz Lizama1
edgar.ruiz@industrial.unmsm.pe

RESUMEN
El artículo presenta un enfoque moderno acerca del estudio de los tipos de datos soportados por un
computador. Para el lenguaje C++, los datos se agrupan en clases de datos los cuales se estudian y
se prueban con programas ejemplos.

ABSTRACT
This article presents a modern focus about the study of the types of data supported by a computer.
For de language C++, the data group in classes of data wich are studied and they are proven with
programs example.

INTRODUCCION
Al igual que C; C++ posee tipos de datos fundamentales o primitivos y tipos de datos
derivados o estructurados. A decir verdad, un enfoque más moderno conceptualiza los tipos de datos
en C++ como correspondientes a clases de datos, siendo estos agrupados en: clase escalar, clase
estructurada y clase apuntador o puntero. Ver figuras 1, 2, 3, y 4.

C++

Clase Clase
Clase escalar
estructurada apuntador

Figura 1: Las clase de datos en C++

Clase
Escalar

Clase Clase
Estandar Enumerada

Clase Clase Clase Clase


Entero Flotante Caracter Booleana

Figura 2: La clase escalar

1
Actualizado por el autor el 06 de Agosto de 2014; para CodeBlocks 13.12
Edgar Ruiz Lizama 1
Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80

Clase
Estructurada

Registro o
Arreglo class
struct

Figura 3: La clase estructurada

Clase
Apuntador

Pilas Colas Listas Arboles

Figura 4: La clase apuntador

LA CLASE ESCALAR

La clase escalar como acabamos de ver se divide en clase estándar y clase enumerada. La
clase estándar a su vez se subdivide en cuatro clases: entero, flotante, caracter y booleana.

CLASE ENTERO

En matemáticas los enteros son positivos y negativos cuya extensión es inconmensurable; es


decir, desde - a +. Sin embargo; en el mundo real de las computadoras y para fines prácticos de
implementación los enteros negativos y positivos tienen un valor definido e incluyen también el cero.
Para algunos compiladores C++, el rango de los enteros estándar va desde -32768 a 32767 y para
otros como Dev-C++, va desde -2147483648 a +2147483647.

Debido a que cada valor que se representa en un computador ocupa una determinada
cantidad en bytes (1 byte = 8 bit) y por cuestiones de eficiencia en el procesamiento; C++ posee
clases de enteros tales como short int, int, unsigned int, long int y unsigned long; tal como puede
verse en la tabla 1

Tabla 1: Tipos de datos en la clase entero

Clase entero Tamaño en bytes Rango de valores


short int o short 1 o2 -128 a 127 o -32768 a +32767
int 4 -2147483648 a +2147483647
unsigned int 4 0 a 4294967295
long int o long 4 -2147483648 a +2147483647
unsigned long 4 0 a 4294967295

Edgar Ruiz Lizama 2


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80

Según el propio Bjarne Stroustrup, la razón para ofrecer más de un tipo entero, más que un
tipo sin signo y más que un tipo de coma flotante es permitir que el programador aproveche las
características del hardware. En muchas máquinas, hay diferencias significativas en los
requerimientos de memoria, tiempo de acceso y velocidad de cálculo entre las variedades de tipos
básicos de datos. Si el programador conoce una máquina le resulta más fácil elegir, el entero
apropiado para una variable en particular, y en contrapartida el compilador no encuentra errores al
realizar la verificación de tipos2.

Resumiendo diré que el tamaño en bytes para un tipo de datos depende de la implementación
o versión del compilador y de la máquina en uso, por lo que los valores de la Tabla 1; podrían ser
diferentes en su máquina. Al respecto, lo animo a probar el ejemplo 1, que sigue a continuación.

Ejemplo 1: El programa Bytes1.cpp realiza la comprobación del tamaño en bytes para la clase entero.

#include <iostream>
// mostrar el uso de la funcion sizeof
using namespace std;

int main() //Bytes1.cpp


{
cout<<"Un int tiene\t\t"<<sizeof(int)<<" Bytes"<<endl;
cout<<"Un unsigned tiene\t"<<sizeof(unsigned)<<" Bytes"<<endl;
cout<<"Un unsigned int tiene\t"<<sizeof(unsigned int)<<" Bytes"<<endl;
cout<<"Un long int\t\t"<<sizeof(long)<<" Bytes"<<endl;
cout<<"Un unsigned long tiene\t"<<sizeof(unsigned long)<<" Bytes"<<endl;
cout<<endl;
return 0;
}

Figura 5: Salida para el programa bytes1.cpp.

La función sizeof es una función predefinida en C y devuelve el tamaño en bytes del objeto
pasado como argumento. Adicionalmente, se puede comentar que sizeof para C++ es un
operador predefinido.

Ejemplo 2: El programa rangos.cpp muestra el rango de valores para la clase entero.

#include <iostream>
#include <climits> /* Para las constantes limites definidas
en los rangos de la clase Entero */
using namespace std;

int main() // rangos.cpp


{

2
Un buen programador prevé los posibles valores que asumirán las variables de sus programas al entrar en
ejecución por lo que elige el tipo de dato adecuado, consiguiendo con ello programas más eficientes y efectivos.
Edgar Ruiz Lizama 3
Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
cout<<"Enteros Maximos y minimos"<<endl<<endl;
cout<<"Entero sin signo maximo\t\t"<<UINT_MAX;
cout<<"\nEntero corto con signo maximo\t"<<SHRT_MAX;
cout<<"\nEntero corto con signo minimo\t"<<SHRT_MIN;
cout<<"\nEntero largo con signo minimo\t"<<LONG_MIN;
cout<<"\nEntero largo con signo maximo\t"<<LONG_MAX;
cout<<"\nEntero con signo maximo\t\t"<<INT_MAX;
cout<<"\nEntero con signo minimo\t\t"<<INT_MIN;
cout<<endl;
return 0;
}

Observe que en el programa rangos1.cpp se incluye la librería <limits> puesto que en ella se
encuentran definidas las constantes para los valores máximos y mínimos de los tipos de datos.

Figura 6: La salida para rangos1.cpp

CLASE FLOTANTE

En términos matemáticos el conjunto de los números reales incluye a todos aquellos valores
cuya representación necesita el punto decimal y que van desde - hasta +. En notación sintáctica
BNF (Backus-Naur Form) un número real se representa como:

<numero-real> ::= (+ | -) <entero> . <entero>

la cual se lee del siguiente modo: un número real es un signo + ó un signo - seguido de un entero
seguido, de un punto, seguido de un entero; donde entero puede ser un dígito decimal o una
secuencia de dígitos decimales. A su vez; entero y digito decimal son:

<entero> ::= <digito-decimal>


<digito-decimal> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

La clase flotante en C++, incluye a todos los enteros y a todo aquel valor que para su
representación necesita del punto decimal; tal como por ejemplo los números: 1.0, 15.24, -4.05, y
3.2728.

La tabla 2 muestra los tipos soportados por la clase flotante: float, double, long
double.

Tabla 2: Tipos de datos en la clase flotante

Clase flotante Tamaño en bytes Rango de valores


float 4 3.4*10-38 a 3.4*1038
-308 308
double 8 1.7*10 a 1.7*10
-4932
long double 10 o 12 3.4*10 a 1.7*104932

Edgar Ruiz Lizama 4


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
Los long double o dobles largos se representan en al menos 10 bytes. Pruebe con su
compilador el programa bytes2.cpp.

Ejemplo 3: El programa bytes2.cpp comprueba el tamaño de bytes de los miembros de la clase


flotante.

#include <iostream>
// Numero de bytes en la clase flotante
using namespace std;
int main() // Bytes2.cpp
{
cout<<"Numero de Bytes para los flotantes\n"<<endl;
cout<<"Un float tiene\t\t"<<sizeof(float)<<" Bytes"<<endl;
cout<<"Un double tiene\t\t"<<sizeof(double)<<" Bytes"<<endl;
cout<<"Un long double tiene\t"<<sizeof(long double)<<" Bytes\n"<<endl;
return 0;
}

Figura 7: La salida del programa bytes2.cpp

CLASE CARACTER

Los símbolos representados en un computador son caracteres. El teclado de su computador


muestra el conjunto de caracteres representables. Las letras, dígitos, signos de puntuación y
símbolos especiales son caracteres, este conjunto de caracteres se representan conforme el código
ASCII (American Standard Code for Information Interchange).

El ASCII es un conjunto que posee 256 códigos (0 al 255); donde cada código es un byte y a
cada código o carácter le corresponde un número, por ello se dice que los caracteres ASCII son
ordinales. La tabla 3 muestra los dos objetos de la clase caracter en C++: char y unsigned char;
caracteres con signo y caracteres sin signo

Tabla 3: Tipos de datos en la clase carácter

Clase caracter Tamaño en bytes Rango de valores


char 1 -128 a 127
unsigned char 1 0 a 255

La tabla 3, indica que los tipos de datos de la clase caracter se representan en 1 byte de
memoria.

Ejemplo 4: El programa bytes3.cpp muestra el tamaño en bytes para la clase caracter.

#include <iostream>
// numero de bytes en la clase caracter
using namespace std;

Edgar Ruiz Lizama 5


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80

int main() // Bytes3.cpp


{
cout<<"Numero de Bytes para los char\n"<<endl;
cout<<"Un char tiene\t\t"<<sizeof(char)<<" Byte"<<endl;
cout<<"Un unsigned char tiene\t"<<sizeof(unsigned char)<<" Byte\n"<<endl;
return 0;
}

Figura 8: La salida para el programa bytes3.cpp.

Ejemplo 5: El programa carascii.cpp muestra los caracteres alfabéticos tanto en mayúsculas como en
minúsculas y sus correspondientes valores ASCII.

#include <iostream>
#include <ctype.h>
using namespace std;

int main() // carascii.cpp


{
char c;
cout<<"\nCaracteres alfabeticos en Mayusculas"<<endl;
for (c='A'; c<='Z'; c++)
cout<<c<<" = "<< toascii(c)<<"\t";
cout<<endl;
cout<<"\nCaracteres alfabeticos en Minusculas"<<endl;
for (c='a'; c<='z'; c++)
cout<<c<<" = "<< toascii(c)<<"\t";
cout<<endl<<endl;
return 0;
}

La función predefinida toascii de la librería <ctype.h> devuelve el valor entero de su argumento,


en este caso el entero asociado con un carácter de la tabla ASCII. Ver la Figura 9.

Figura 9: Salida para el programa carascii.cpp

Edgar Ruiz Lizama 6


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
CLASE BOOL

Todo objeto booleano, posee sólo uno de dos valores; true (verdad) y false (falso). Estos
tienen gran importancia en todo programa que utiliza toma de decisiones es decir; una decisión
implica evaluar una condición y dependiendo del resultado (verdad o falso) se toma una acción o
camino a seguir. La clase bool de C++, define false y true de tal forma que false siempre es
menor que true. Los booleanos se almacenan en un byte de memoria. En general para todo
programa C/C++, false = 0 y true = 1. Ver el ejemplo 6.

Ejemplo 6: El programa boolea_0.cpp prueba los objetos de la clase bool

#include <iostream>
//usando la clase bool
using namespace std;
int main() //boolea_0.cpp
{
cout<<"Objetos de la clase bool\n"<<endl;
cout<<"Valor de false = "<< false <<endl;
cout<<"Valor de true = "<< true <<endl;
return 0;
}

Figura 10: La salida para el programa boolea00.cpp.

A partir de la clase bool es posible crear variables de tipo booleano como son las llamadas
banderas lógicas, muy usadas por los programadores en cuestiones de decisión.

Ejemplo 7: El siguiente programa boolea1.cpp declara bandera como un objeto de la clase bool y lo
inicializa a true, luego se niega el valor de bandera.

#include <iostream>
using namespace std;
int main() // boolea_1.cpp
{
bool bandera;
bandera = true;
cout<<"Valor de bandera =\t"<<bandera<<endl;
cout<<"Negacion de bandera =\t"<<(!bandera)<<endl;
return 0;
}

Figura 11: La salida para el programa boolea01.cpp.

Edgar Ruiz Lizama 7


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
La clase bool es soportada por compiladores modernos de C++ de acuerdo con el estándar
ANSI C++. Si su compilador C++ no la posee, usted puede implementarla mediante alguna de las 3
formas siguientes:

1. Utilizando constantes simbólicas al estilo C


2. Utilizando constantes con tipo al estilo C++
3. Utilizando objetos enumerados; tal como se verá en el ejemplo 2.21, más adelante.

Ejemplo 8: Implementación de objetos booleanos como constantes simbólicas al estilo del lenguaje C.

#include <iostream>
/* constantes simbolicas al estilo del C */
#define FALSE 0
#define TRUE 1
using namespace std;
int main() // Boolea_2.cpp
{
int a, b;
cout<<"ingrese dos numeros: ";
cin>>a>>b;
cout<<"a = "<<a<<" b = "<<b<<endl;
if ( a > b )
cout<<"a es mayor que b; valor logico: "<<TRUE<<endl;
else
cout<<"a No es mayor que b; valor logico: "<<FALSE<<endl;
cout<<endl;
return 0;
}

Figura 12: Una salida para boolea1.cpp.

Ejemplo 9: Implementación de objetos booleanos al estilo del C++.

#include <iostream>
#include <stdlib.h>
// Constantes al estilo del C++
const int FALSE = 0;
const int TRUE = 1;
using namespace std;
int main() // Boolea_3.cpp
{
int a,b;
cout<<"ingrese dos numeros: ";
cin>>a>>b;
cout<<endl;
if ( a > b )
cout<<a<<" Si es mayor que "<<b<<"; valor logico: "<<TRUE<<endl;
else
cout<<a<<" No es mayor que "<<b<<"; valor logico: "<<FALSE<<endl;
cout<<endl;
return 0;
}

Edgar Ruiz Lizama 8


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
Siendo su salida:

Figura 13: Una salida para boolea2.cpp.

CLASE ENUM

La clase enum es heredada del C. Esta clase permite al usuario declarar y usar tipos
enumerados en sus programas. La declaración de datos enumerados se realiza con la palabra
reservada enum, siendo su formato el siguiente,

enum <identificador_clase>{valor1, valor2, ... , valorN};

y a partir de esta declaración se pueden crear objetos de este tipo con:

<identificador_clase> <identificador_objeto>;

Los siguientes, son ejemplos de declaración válidos de objetos de la clase enum.

enum Semana{Dom, Lun, Mar, Mie, Jue, Vie, Sab};


Semana Dia;

enum Paradigma{Estructurado, OrientadoObjeto, Funcional, Logico};


Paradigma Lenguaje;

Los objetos de la clase enum son ordinales y el compilador C/C++, asigna por defecto el valor
0 al primer objeto, 1 al segundo objeto y así sucesivamente. Por ello es que a los objetos de esta
clase se les puede aplicar operaciones relacionales tal como se ve en los ejemplos 10 y 11.

En el programa enum1.cpp del ejemplo 10, se declara Semana como un conjunto de siete
objetos enumerados y especificados dentro de las llaves; es decir la secuencia
{DOM,LUN,MAR,MIER,JUE,VIE,SAB}. Una vez hecho esto; se declara dia como una variable del
tipo Semana. Observe que el primer objeto enumerado DOM se establece a 0, el segundo LUN se
establece a 1, MAR se establece a 2 y así sucesivamente. Por esto, se dice que los objetos de un
conjunto enumerado son ordinales; es decir tienen un orden por lo que pueden establecerse
operaciones relacionales con estos objetos.

Ejemplo 10: Programa enum1.cpp

#include <iostream>
// Trabajando con objetos enumerados
enum Semana{DOM,LUN,MAR,MIER,JUE,VIE,SAB};
Semana dia; // dia es variable del tipo semana
using namespace std;
int main() // enum_1.cpp
{
cout << "Dias de la semana" << endl;
for (int dia = DOM; dia <= SAB;dia++)
switch(dia) {
case 0: cout<<"\n El dia domingo es "<<dia<<endl;
break;

Edgar Ruiz Lizama 9


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
case 1: cout<<"\n El dia lunes es "<<dia<<endl;
break;
case 2: cout<<"\n El dia martes es "<<dia<<endl;
break;
case 3: cout<<"\n El dia miercoles es "<<dia<<endl;
break;
case 4: cout<<"\n El dia jueves es "<<dia<<endl;
break;
case 5: cout<<"\n El dia viernes es "<<dia<<endl;
break;
case 6: cout<<"\n El dia sabado es "<<dia<<endl;
break;
}
cout<<endl;
return 0;
}

Figura 14: Salida para enum1.cpp

Como puede haber observado el primer objeto de una lista de enumerados se establece a 0,
el segundo a 1 ya si sucesivamente; pero el usuario puede cambiar esta asignación por defecto
haciendo que el primer objeto se establezca a 1 (o a cualquier otro valor ordinal) en la propia
declaración. Al respecto el ejemplo 11 muestra una variante del ejemplo anterior

Ejemplo 11:

#include <iostream>
//observe que DOM comienza en 1
enum Semana{DOM = 1, LUN, MAR, MIER, JUE, VIE, SAB};
Semana dia; // dia es variable del tipo semana

using namespace std;


int main() // enum_2.cpp
{
int dia;
cout << "Dias de la semana" << endl;
for (dia = DOM; dia<=SAB; dia++)
switch(dia) {
case 1: cout<<"\n El dia domingo es "<<dia<<endl;
break;
case 2: cout<<"\n El dia lunes es "<<dia<<endl;
break;
case 3: cout<<"\n El dia martes es "<<dia<<endl;
Edgar Ruiz Lizama 10
Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80
break;
case 4: cout<<"\n El dia miercoles es "<<dia<<endl;
break;
case 5: cout<<"\n El dia jueves es "<<dia<<endl;
break;
case 6: cout<<"\n El dia viernes es "<<dia<<endl;
break;
case 7: cout<<"\n El dia sabado es "<<dia<<endl;
break;
}
cout<<endl;
return 0;
}

Figura 15: La salida para enum2.cpp

Ejemplo 12: Implementación de objetos booleanos mediante objetos enumerados.

#include <iostream>
//objetos booleanos con enum
enum Bool{ FALSE, TRUE };

using namespace std;

int main() // Boolea_4.cpp


{
int a, b;
cout<<"ingrese dos numeros enteros: ";
cin>>a>>b;
cout<<"\na = "<<a<<"\t"<<"b = "<<b<<endl;
if (a>b)
cout<<"\nEs verdad a > b: "<<TRUE<<endl;
else
cout<<"\nEs falso a > b: "<<FALSE<<endl;
cout<<endl;
return 0;
}

Edgar Ruiz Lizama 11


Volumen 3 Nº 1 INDUSTRIAL DATA Pag. 75 - 80

Figura 16: Una salida para boolea3.cpp.

Las clases estructurada y la clase puntero se presentaran más adelante.

REFERENCIAS

1. Deitel H.M. y Deitel P.J. (2003) "C++ Cómo Programar". 4ta. Edición. Prentice-Hall
Hispanoamericana, 1320p. México.
2. Kernighan Brian W. & Ritchie Dennis M. (1993) “El Lenguaje de Programación C”. 2da.
Edición. Prentice-Hall Hispanoamericana, 294 p. México.
3. Ruiz Lizama, Edgar (2009) "Programación con C++", 1ra. Edición, Fondo Editorial de la
Universidad Nacional Mayor de san Marcos, 434 p. Lima, Perú.
4. Ruiz Lizama, Edgar (1999) "Curso de Lenguaje C", Universidad Nacional Mayor de san Marcos,
Facultad de Ingeniería Industrial, 150 p. Lima, Perú.
5. Staguaard, Andrew (1998) "Técnicas estructuradas y orientadas a objetos: una introducción
utilizando C++". México. Prentice-Hall Hispanoamericana, 770 p. México.
6. Stroustrup, Bjarne (2002) "El Lenguaje de Programación C++ Edición especial". Addison
Wesley – PEARSON EDUCACION S.A. 1050 p. España.
7. Stroustrup, Bjarne (1993) "El Lenguaje de Programación C++". 2da. Edición. Addison Wesley
Iberoamericana. 710 p. E.U.A.

Edgar Ruiz Lizama 12

También podría gustarte