Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Prctica n 4
Introduccin.
Un tipo de datos estructurado es un tipo de datos formado por una coleccin organizada de componentes
de algn otro tipo de datos. Podremos hacer referencia tanto a la coleccin de elementos completa como a
cada uno de sus componentes de forma individual.
El array es un tipo de datos estructurado formado por un nmero fijo de elementos del mismo tipo. Se
caracteriza porque se puede acceder de manera directa a sus elementos.
El tipo de los elementos del array se conoce como tipo base y la cantidad de elementos como dimensin.
Declaracin de variables de array.
Una variable array se declara de forma similar a otras variables, excepto que se debe indicar el tamao o
longitud del array (dimensin).
tipo nombre_array [dimensin];
Donde tipo es el tipo base del array, y dimensin es un nmero entero positivo mayor que cero que indica
la cantidad de elementos del array (equivalente a la cardinalidad del tipo ndice del array).
Ejemplos:
int vector [10];
// Array de 10 enteros
char frase [80];
// Array de 80 caracteres
bool flags [5], logicos [10]; // Array de 5 lgicos y otro de 10 lgicos
Una variable de array se puede ver como un conjunto de variables del mismo tipo (tipo base del array) a las
que denominamos con un nombre comn.
Algunas caractersticas importantes de los arrays son:
// Array de 10 caracteres
Pg 1
Prctica 4
i = 7;
a [7] = 'c';
if (a [i] < 'Z')
...
El ndice es calculable, es decir, como ndice para seleccionar un elemento de un array podemos usar una
expresin, el valor resultante de la evaluacin de la misma se utilizar entonces como ndice para seleccionar
un elemento concreto.
Importante: C++ no avisa de indexaciones del array fuera del rango.
Inicializacin de variables array.
Al igual que con cualquier otra variable, es necesario asignar valores a los componentes de un array antes
de utilizarlos. Esto puede realizarse usando sentencias de asignacin individuales sobre los componentes o
usando el operador de inicializacin.
La inicializacin de un array se puede realizar en la misma sentencia en la que se declara:
tipo_base nombre_array [dimensin] = {elemento_1, elemento_2, ..., elemento_N};
Ejemplo:
int a [3] = {10, 20, 30};
Es equivalente a:
int a [3];
a [0] = 10;
a [1] = 20;
a [2] = 30;
Constantes de array.
C++ permite la existencia de constantes de array. Para definir un array constante, se declara como si se
tratara de una variable de array pero usando el modificador const y se aade a continuacin el operador de
inicializacin para darle valor.
const tipo_base nombre_array [dimensin] = {valor_1, valor_2, ... , valor_N};
Ejemplo:
const char nombre [5] = {'L','u','c','a','s'};
Prctica 4
Aunque el tipo de los arrays u y v es el mismo, el compilador detectar un error. La razn es que C++
intenta realmente asignar la direccin base del array v al array u, y al ser esta constante, se produce el
error (Recurdese que el nombre de un array representa la direccin base del mismo en la memoria, y que
sta es constante, no puede modificarse)
De igual manera ocurre en las comparaciones, ya que lo que realmente compara C++ son las direcciones
base de los arrays y no su contenido.
Por ello, para realizar estas operaciones ser necesario desarrollar los correspondientes subprogramas.
Funciones y arrays
Un array se puede pasar como argumento de una funcin, aunque lo que se pasa realmente es una
referencia al primer elemento del array (la direccin base del array).
CUIDADO: En C++ los parmetros de arrays siempre se pasan por referencia, aunque no se indique as en
la definicin de la funcin.
Ejemplo:
El resultado devuelto por una funcin NO puede ser un array, por tanto es errneo declarar funciones que
devuelvan tipos array.
Para devolver un array desde una funcin ser necesario utilizar un parmetro pasado por referencia.
Pg 3
Prctica 4
El operador sizeof.
El operador sizeof devuelve el nmero de bytes necesarios para contener una variable del tipo indicado por
su argumento.
sizeof (NombreTipo)
Si se usa el operador sizeof sobre un tipo array, devolver el nmero de bytes necesarios para almacenar el
array completo. De esta forma, conociendo el tipo base de un array podemos calcular su dimensin mediante
el cociente sizeof (TipoArray) / sizeof (TipoBase).
EJEMPLO: El siguiente programa realiza el cambio de base 10 a base 16 de un nmero natural introducido
por teclado.
/*---------------------------------------------------------------|
Autor:
|
|
Fecha:
Versin: 1.0
|
|-----------------------------------------------------------------|
|
Descripcin del Programa: convhexa.cpp
|
|
|
| Arrays, enteros, caracteres y bucles.
|
|
|
| Este programa realiza el cambio de base 10 a base 16 de un
|
| nmero natural.
|
| ----------------------------------------------------------------*/
// Incluir E/S y Libreras Standard
#include <iostream>
#include <cstdlib>
using namespace std;
// Zona de Declaracin de Constantes
const int MAX_DIGITOS = 16;
// Los 16 digitos hexadecimales
const int MAX_CIFRAS = 20;
// Numeros de hasta 20 cifras hexadecimales
// Zona de Declaracin de Tipos
typedef char Tdigitos [MAX_DIGITOS];
typedef int Tnumero [MAX_CIFRAS];
// Zona de Cabeceras de Procedimientos y Funciones
// Programa Principal
int main()
{
// Zona de Declaracin de Variables del Programa principal
const Tdigitos t1 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};
Tnumero t2;
unsigned int r, num;
// Zona de instrucciones
cout << "Conversion decimal-hexadecimal." << endl;
cout << "Introducir numero decimal a convertir: ";
cin >> num;
r = 0;
while (num != 0)
{
t2 [r] = num % 16;
num = num / 16;
Pg 4
Prctica 4
r ++;
}
cout << "Valor hexadecimal = ";
while (r > 0)
// Saca el resultado
{
r --;
cout << t1 [t2 [r]];
}
cout << endl;
system ("Pause");
return 0;
}
// Implementacin de Procedimientos y Funciones
Cadenas de caracteres.
En C++ existe un tipo de datos especfico para las cadenas de caracteres, el tipo string, sin embargo
tambin es posible simular cadenas de caracteres mediante arrays de caracteres de la siguiente manera:
typedef char TCadena [dimensin];
Tanto para un tipo como para otro, C++ dispone de libreras de operaciones especficas de manejo de
cadenas de caracteres.
Sin embargo, existe una diferencia importante entre ambas formas de cadenas de caracteres. En el caso del
tipo string, los objetos de dicho tipo almacenan no solo los caracteres que componen la cadena sino
tambin la longitud de la misma. Las operaciones definidas sobre el tipo string contemplan dicho hecho.
Sin embargo, las cadenas definidas como arrays de caracteres no almacenan la longitud, siendo necesaria la
utilizacin de un carcter delimitador o terminador para indicar el final de la cadena en el array. C++ utiliza el
carcter NULO (valor ordinal cero '\0') como terminador de fin de cadena. Por ello, a la hora de definir un
tipo cadena con un array de caracteres, hay que considerar siempre la dimensin del array con un espacio
adicional al mximo de caracteres que tengamos previsto que se puedan almacenar para contener dicho
terminador. Las operaciones definidas sobre arrays de caracteres contemplan este hecho, por eso tambin
se conoce a este tipo de implementar cadenas como stringz
Nosotros usaremos nicamente este modelo de cadenas, implementadas como arrays de caracteres.
IMPORTANTE: EN C++ TODAS LAS CADENAS DE CARACTERES DEBEN LLEVAR EL CARCTER 0
(NULO) COMO TERMINADOR.
Valores de cadenas de caracteres: Literales
C++ permite valores constantes para los tipos cadena, los llamados literales, que pueden usarse
indistintamente con el tipo string o con arrays de caracteres.
Un valor de cadena o literal es cualquier combinacin de caracteres (incluso ninguno) encerrados entre
comillas dobles.
<literal> ::= "{<carcter>}"
Ejemplos:
"Lucas"
"hola"
"soy un literal"
"
"
""
//
//
//
//
//
<<<<<-
Literal
Literal
Literal
Literal
Literal
con
con
con
con
con
longitud
longitud
longitud
longitud
longitud
5
4
14
6
0 (Cadena vaca)
Pg 5
Prctica 4
Hay que tener en cuenta que en la implementacin con arrays de caracteres, C++ aade automticamente el
carcter NULO al final del literal, por lo que el espacio de almacenamiento necesario para el literal ser un
carcter ms que su longitud, incluyendo el caso de la cadena vaca.
As por ejemplo:
"Lucas"
""
[0]
[1]
[2]
[3]
[4]
=
=
=
=
=
'h';
'o';
'l';
'a';
'\0';
La sentencia TCadena mitexto = ""; es equivalente a las siguientes asignaciones individuales de los
caracteres del array mitexto:
mitexto [0] = '\0';
Por ltimo, la sentencia frase2 = "adios"; es equivalente a las siguientes asignaciones individuales
de los caracteres del array frase2:
frase2
frase2
frase2
frase2
frase2
frase2
[0]
[1]
[2]
[3]
[4]
[5]
=
=
=
=
=
=
'a';
'd';
'i';
'o';
's';
'\0';
El resto de los elementos de los arrays anteriores quedarn sin inicializar, aunque a efectos prcticos esto
tiene poca importancia, ya que el valor de la cadena almacenada en el array finaliza con el carcter
terminador, no tenindose en cuenta para nada el resto de caracteres del array.
Pg 6
Prctica 4
Para definir un array de caracteres constante, se declara igual que un array constante, usando el modificador
const y se aade a continuacin el operador de inicializacin para darle valor. El valor en este caso puede
expresarse tambin mediante un literal.
const TCadena nombre_cadena = <literal>;
Ejemplo:
const TCadena nombre = "Lucas";
es equivalente a :
const TCadena nombre = {'L','u','c','a','s','\0'};
Pg 7
Prctica 4
i = 0;
c = cin.get ();
//
while (( i < MAXCAD ) && (
{
s [i] = c;
i ++;
//
c = cin.get4();
//
}
s [i] = '\0';
//
Lectura adelantada
c != INTRO ))
La otra opcin, que adems es la ms adecuada, es el uso de la funcin getline sobre el objeto cin, la
cual permite leer una cadena de caracteres hasta un nmero mximo de caracteres o un separador que se le
indique. Dicha funcin getline tiene tres parmetros: la cadena de caracteres, el nmero mximo de
caracteres a leer por teclado (que ser el tamao del array donde se guarda la cadena menos uno, para dejar
cabida al terminador) y opcionalmente el valor de un carcter separador, que en caso de indicarse, detendr
la lectura al detectar en la entrada dicho carcter. Si no se indica este ltimo parmetro, se recogern todos
los caracteres de la entrada hasta llegar al final de lnea (carcter INTRO o de fin de lnea).
cin.getline (TCadena &cadena, int max_caracteres [, char separador])
Donde el ltimo parmetro (separador) es opcional.
La funcin getline se encarga de colocar la cadena correctamente en el array, incluyendo el carcter
terminador al final.
Esta funcin ser la que utilicemos normalmente para leer cadenas de caracteres, ya que, aunque debemos
pasarle como parmetros tanto el nmero mximo de caracteres como opcionalmente el separador de
cadenas, la llamada cin.getline (s, MAXCAD, INTRO), o simplemente cin.getline (s, MAXCAD),
tiene exactamente el mismo funcionamiento que la funcin LEER (s) definida para el pseudolenguaje.
Ejemplo:
...
int main()
{
TCadena miCadena;
...
cout << "Introduzca una cadena de caracteres: ";
cin.getline (miCadena, MAX_NUM_CAR);
/* Lee por teclado una
cadena terminada por
"INTRO" o hasta completar
MAX_NUM_CAR caracteres y la
pone en 'miCadena' */
cout << "Cadena leda: " << miCadena << endl;
...
Otras operaciones.
Como se ha dicho anteriormente, C++ incluye una librera estndar con numerosas funciones de manejo de
cadenas de caracteres implementadas con arrays de caracteres. Se trata de la librera cstring.
Para usar dicha librera es necesario incluir la clusula del preprocesador:
#include <cstring>
Algunas de las operaciones ms interesantes que incluye esta librera son las siguientes:
Pg 8
Prctica 4
Sacar en pantalla:
ejemplo
literal
Comparacin de cadenas.
int strcmp (const TCadena s1, const TCadena s2)
Compara el contenido de las cadenas s1 y s2. Si ambas cadenas son iguales devuelve 0, en caso contrario
devuelve la diferencia entre los primeros caracteres distintos encontrados en las cadenas (diferencia de los
ordinales de los caracteres), de tal manera de que si s1 es mayor que s2 (en orden alfabtico) el resultado
ser positivo, y si s1 es menor que s2 el resultado ser negativo.
Por tanto, el resultado e strcmp ser:
0
si s1 == s2
<0
si s1 < s2
>0
si s1 > s2
Ejemplo:
...
cout
cout
cout
cout
cout
cout
cout
...
<<
<<
<<
<<
<<
<<
<<
strcmp
strcmp
strcmp
strcmp
strcmp
strcmp
strcmp
Sacar en pantalla:
0
-1
1
2
0
-2
-115
->
->
->
->
->
->
->
s1
s1
s1
s1
s1
s1
s1
== s2
< s2
> s2
> s2
== s2
< s2
< s2
Existe tambin la funcin stricmp que tiene la misma sintaxis y funciona exactamente igual que strcmp
pero sin distinguir entre letras maysculas y minsculas.
Longitud de cadenas.
Pg 9
Prctica 4
char
s1 =
s2 =
s3 =
TCadena [80];
"Pedro Picapiedra";
"Pablo Marmol";
"";
cout << s1 << " " << strlen (s1) << " " << sizeof (s1) << endl;
cout << s2 << " " << strlen (s2) << " " << sizeof (s2) << endl;
cout << s3 << " " << strlen (s3) << " " << sizeof (s3) << endl;
...
Sacar en pantalla:
Pedro Picapiedra 16 80
Pablo Marmol 12 80
0 80
Concatenacin.
strcat (TCadena &s1, const TCadena s2);
Aade al contenido de la cadena s1 el contenido de la cadena s2.
Ejemplo:
...
TCadena s1 = "Adios mundo";
TCadena s2 = " cruel";
strcat (s1, s2);
cout << s1 << endl;
...
Sacar en pantalla:
Adios mundo cruel
Conversiones.
int atoi (TCadena s)
Devuelve el valor del nmero entero (int) que se encuentra almacenado como una cadena de caracteres en
s.
float atof (TCadena s)
Devuelve el valor de nmero real (float) que se encuentra almacenado como una cadena de caracteres en
s.
Pg 10