Los programas trabajan con datos. Ahora bien, un dato es información que puede ser de cualquier tipo. Una fecha es un dato, la cantidad de dinero en la cuenta de ahorro, otro dato, el signo del zodiaco otro, el color de tu mascota otro, y así la lista se hace prácticamente interminable.
Los programas que escribimos en C++ también trabajan con datos de distintos tipos. Para que el programa pueda trabajar con un dato primero debe reconocer de qué tipo es para así, tratarlo correctamente.
El C++ reconoce siete tipos de datos distintos. Estos se conocen como tipos de datos integrales, porque están integrados al lenguaje. Esto no quiere decir que el lenguaje no reconozca otros tipos, solo que es posible su utilizarlos sin la incorporación de recursos de biblioteca. No es necesario utilizar la directiva de pre-procesador # include.
Los tipos de datos integrales son aquellos proporcionados por el lenguaje. Para su utilización en algún programa no es necesario la inclusión de ningún recurso de biblioteca mediante la directiva #include.
Es el más de elemental de los tipos de datos. Su tamaño es de 1 byte. Permite almacenar un caracter. Para declarar y definir una variable tipo caracter hacemos
char a; o bien char c='m';
Si queremos escribir más de una palabra debemos utilizar un array de caracteres o string. Esto lo desarrollaremos más adelante.
//datosChar.cpp
#include <iostream>
using namespace std;
int main(){
char c='s';
cout << "\n\t la variable c contiene:"<< c << endl;
c='z';
cout << "\n\t Ahora contiene: " << c << endl;
return 0;
}
// Instrucción para compilar desde el terminal.
// g++ -o datosChar datosChar.cpp
El tipo int o entero es capas de almacenar valores enteros. El rango está determinado por la plataforma. Además es posible utilizar un rango mayor o uno mínimo dependiendo de las necesidades del programa. Para ello se utilizan los modificadores short y long.
Pero no nos apresuremos. Podemos declarar variables tipo int con las siguientes instrucciones:
int a,b,c; // declaración y definición, pero no inicialización.
int x=3;
int y=0; //En todos lo casos, declaración, definición e inicialización,
int z=4;
Un ejemplo con tipos enteros
//datosInts.cpp
#include <iostream>
using namespace std;
int main() {
int a, b;
int c=0;
int d=25;
cout << "\n\tEl contenido de a es: " << a;
cout << "\n\tEl contenido de b es: " << b;
cout << "\n\tEl contenido de c es: " << c;
cout << "\n\tEl contenido de d es: " << d;
a=100;
b=a;
cout << "\n\tEl contenido de a ahora es: " << a;
cout << "\n\tEl contenido de b ahora es: " << b;
cout << "\n\n";
return 0;
}
// g++ datosInts datosInts.cpp
Este programa mostrará el contenido de las variables a, b, c y d. En los dos primeros casos mostrará lo que se conoce como "basura". Lo que quedó de la utilización de esa región de la memoria por otro programa. Por eso se considera una buena práctica de programación inicializar todas la variables.
Quiero hacer notar qué sucede en la memoria cuando se realiza alguna de estas acciones:
int a;
Esta instrucción declara una variable de tipo entera, es decir, reserva un espacio de la memoria capaz de almacenar un número entero de un determinado tamaño y le pone un nombre que nos permite acceder a esa zona de la memoria. Esa variable cuyo nombre es a tiene una dirección que se puede conocer anteponiendo al nombre el operador &, es decir &a.
Además, con la instrucción anterior no se modifica el contenido que estaba previamente en ese lugar de la memoria. Se interpreta los bits de cada byte que conforma el int como números enteros. La buena práctica de programación recomienda iniciarla a cero si no se conoce el valor inicial de la variable al momento de crearlas.
Por lo tanto la declaración anterior tendría que ser:
int a=0;
int base=5;
El siguiente programa muestra el contenido de una variable antes de inicializarlas, su dirección y después de inicializarlas.
// declaYDefi.cpp
#include <iostream>
using namespace std;
int main() {
int a, base;
cout << "\n\tEl contenido de a es: " << a << endl;
cout << "\n\tLa dirección de a es: " << (int)&a << endl;
cout << "\n\tEl contenido de base es: " << base << endl;
cout << "\n\tLa dirección de base es: " << (int)&base << endl;
a=0;
base=20;
cout << "\n\tAhora el contenido de a es: " << a << endl;
cout << "\n\tAhora el contenido de base es: " << base << endl;
return 0;
}
// g++ -o declaYDefi declaYDefi.cpp
Los dos siguientes muestran los datos que se espera, 0 en el primer caso y 25 en el otro. Por último, se les asignan a a y b el valor 100 y se los muestra.
Hemos utilizado un concepto que creo que es mejor que comprendas desde el comienzo. Es el concepto de variable.
Una variable es un lugar el la memoria correspondiente a un tipo de datos que puede cambiar de valor muchas veces durante la ejecución de un programa. Para definir una variable se debe proporcionar el tipo, el nombre y, opcionalmente un valor inicial. Cuando declaramos y definimos algunos tipos de datos, lo que venimos realizando es precisamente declarar y definir variables.
A veces podemos hablar indistintamente de tipos de datos y variables, pero esto no siempre es así. Podemos reservar una porción de memoria para almacenar un tipo de dato entero como en los casos anteriores, pero poner en dicha zona un valor que no cambia durante toda la ejecución de un programa. Un tipo que no puede cambiar su valor durante toda la ejecución se llama constante.
const int tamArray=10;
La instrucción anterior declara y define una constante. Como es una constante y el contenido no cambia en tiempo de ejecución necesariamete se debe también inicializar. En este caso lo hemos inicializado una variable de tipo entera constante en 10. Una vez compilado siempre el dientificador tamArray tendrá ese valor. Si deseamos cambiarlo por otro deberemos compilar nuevamente para que se actualice.