Está en la página 1de 10

Introduccin a los Computadores

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:

Los elementos del array se almacenan consecutivamente en memoria.


El nombre del array especifica la direccin en memoria del primer elemento del mismo.
El nombre del array es una direccin constante, es decir no puede modificarse su valor.
Como tipo estructurado, no esta permitida la lectura y escritura directa sobre dispositivos de E/S
estndares. Este tipo de operaciones debe realizarse elemento a elemento.
Todas las operaciones disponibles para el tipo base de un array, pueden usarse sobre los componentes
individuales del mismo.

Acceso a componentes de un array (operador selector).


Se puede acceder a cada componente de una variable de array usando su nombre seguido de lo que
denominamos ndice entre corchetes. El ndice de un elemento de un array es un valor entero positivo que
indica el orden o posicin del elemento dentro del array.
nombre_array [ndice]
Los ndices comienzan siempre por 0, es decir el primer elemento de un array tiene ndice 0. De modo que si
el array a tiene n elementos, sus nombres son a[0], a[1], ., a[n-1].
Ejemplos:

const int MAXA = 10;


char a [MAXA];
int i;

// Array de 10 caracteres

Pg 1

Introduccin a los Computadores

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'};

Definicin de tipos (la sentencia typedef)


C++ permite asignar un nombre alternativo a cualquier tipo de datos mediante la sentencia typedef.
Sintaxis:
typedef tipo identificador;
Ejemplo: Declarar objetos de tipo TContador:
typedef int TContador;
const Tcontador K = 1000;
Tcontador i, j;
El objetivo fundamental de esta sentencia es mejorar la claridad del cdigo fuente asociando nombres
simblicos a tipos de datos definidos por el programador.
Pg 2

Introduccin a los Computadores

Prctica 4

typedef char [80] Tlinea80;


Tlinea80 linetxt, msg_error;
Tambin se puede utilizar como un mecanismo para definir un nuevo nombre de tipo:
1. Escribir la sentencia como si una variable del tipo deseado se estuviera declarando.
2. En el lugar donde aparece el nombre de la variable declarada, poner el nuevo nombre de tipo.
3. Delante de todo esto colocar la palabra typedef.

Asignacin e igualdad de arrays


C++ no permite la asignacin o comparacin de dos arrays completos.
Ejemplo:

const int MAXVECTOR = 3;


typedef int Tarray [MAXVECTOR];
TArray u, v;
...
u = v;

// Produce un error de compilacin

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:

const int MAXVECTOR = 3;


typedef int Tvector [MAXVECTOR];
void cambiar (Tvector x)
{
x [0] = 10;
// Modifica parmetro formal.
}
int main ()
{
Tvector v = {1, 2, 3};
cambiar (v);
// El componente v[0] vale ahora 10.
}

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

Introduccin a los Computadores

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;

// Algoritmo de cambio de base

Pg 4

Introduccin a los Computadores

Prctica 4

r ++;
}
cout << "Valor hexadecimal = ";
while (r > 0)
// Saca el resultado
{
r --;
cout << t1 [t2 [r]];
}
cout << endl;
system ("Pause");
return 0;

// Hacer una pausa


// Valor de retorno al S.O.

}
// 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

Introduccin a los Computadores

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"
""

se almacenara como 'L','u','c','a','s','\0' (6 caracteres)


se almacenara como '\0' (1 carcter)

Variables y constantes de cadenas de caracteres.


La definicin de variables de cadena de caracteres como arrays de caracteres sigue las mismas reglas que
para definir cualquier otra variable de array. Aunque con una peculiaridad, ya que C++ permite asignar a una
variable de array de caracteres un literal de forma directa.
Esto puede realizarse usando sentencias de asignacin en el cdigo o bien usando el operador de
inicializacin en la sentencia de declaracin de la variable de cadena.
TCadena nombre_cadena [= <literal>];
Ejemplos:
typedef char TCadena [80];
TCadena frase1 = "hola";
TCadena frase2;
TCadena mitexto = "";
...
int main ()
{
...
frase2 = "adios";
...

// Declaracin de array con inicializacin


// Declaracin de array sin inicializar
// Inicializa a cadena vaca

// Asigna valor de literal al array frase2

La sentencia TCadena frase1 = "hola"; es equivalente a las siguientes asignaciones individuales de


los caracteres del array frase1:
frase1
frase1
frase1
frase1
frase1

[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

Introduccin a los Computadores

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'};

Operaciones con cadenas de caracteres.


Asignacin y comparacin de cadenas de caracteres.
Como se ha visto anteriormente C++ permite la asignacin de literales a variables de cadena de caracteres,
sin embargo, no es posible la asignacin o comparacin de dos variables de cadena o entre variables y
constantes, ya que rigen las mismas limitaciones que para los arrays.
Por ello, para realizar estas operaciones ser necesario desarrollar los correspondientes subprogramas.
Sin embargo, C++ incorpora una librera que incluye diversas operaciones sobre arrays de caracteres, entre
las que se encuentran la asignacin o copia y la comparacin. Se ver ms adelante.
Entrada y salida.
C++, al igual que la mayora de los lenguajes de programacin tienen operadores que permiten la
entrada/salida de cadenas de caracteres por pantalla/teclado de forma directa.
La salida de cadenas de caracteres en C++ se realiza de la misma forma que si fuera un tipo predefinido, es
decir, usando el flujo cout (cout << cadena), tanto para literales como para arrays de caracteres
(variables o constantes). De hecho, en numerosos ejemplos anteriores hemos sacado valores constantes de
cadenas, entre comillas, por pantalla.
Ejemplo:
...
int main()
{
const TCadena CTECADENA = "Esto es una constante.";
TCadena miCadena;
// Variable de array de caracteres
...
cout << "Esto es un literal." << endl;
miCadena = "Y esto es una variable de array de caracteres."
cout << CTECADENA << miCadena << endl;
...
Sacar en pantalla:
Esto es un literal.
Esto es una constante.Y esto es una variable de array de caracteres.
En cuanto a la entrada de cadenas de caracteres, hay varias opciones: desarrollando un procedimiento que
lea una cadena carcter a carcter y los almacene en un array de caracteres.
Ejemplo:
const int MAXCAD = 20;
const char INTRO = '\n';
typedef char TCadena [MAXCAD + 1]; // MAXCAD caracteres + terminador

Pg 7

Introduccin a los Computadores

Prctica 4

void LeeCadena (TCadena &s)


// LeeCadena es un procedimiento debido a que las funciones C++ no
// pueden devolver arrays
{
int i;
char c;

i = 0;
c = cin.get ();
//
while (( i < MAXCAD ) && (
{
s [i] = c;
i ++;
//
c = cin.get4();
//
}
s [i] = '\0';
//

Lectura adelantada
c != INTRO ))

cin.get lee 1 carcter sin saltarse los


de control
Inserta el NULO terminador

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

Introduccin a los Computadores

Prctica 4

Asignacin (copia) de cadenas.


strcpy (TCadena &s1, const TCadena s2);
Copia el contenido de la cadena s2 sobre la variable de cadena s1.
Ejemplo:
...
TCadena s1, s2;
s2 = "ejemplo";
strcpy (s1, s2);
cout << s1 << endl;
strcpy (s1, "literal")
cout << s1 << endl;
...

// Pone en s1 el texto "ejemplo"


// Pone en s1 el texto "literal"

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

("A", "A") << endl;


("A", "B") << endl;
("B", "A") << endl;
("C", "A") << endl;
("hola", "hola") << endl;
("hola", "jola") << endl;
("hola", "holas") << endl;

Sacar en pantalla:
0
-1
1
2
0
-2
-115

->
->
->
->
->
->
->

s1
s1
s1
s1
s1
s1
s1

== s2
< s2
> s2
> s2
== s2
< s2
< s2

ORD ('A') ORD ('B') = 65 66 = -1


ORD ('B') ORD ('A') = 66 65 = 1
ORD ('C') ORD ('A') = 67 65 = 2
ORD ('h') ORD ('j') = 104 106 = -2
ORD ('\0') ORD ('s') = 0 115 = -115

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

Introduccin a los Computadores

Prctica 4

unsigned int strlen (const TCadena s)


Devuelve la longitud de la cadena contenida en s.
Ejemplo:
...
typedef
TCadena
TCadena
TCadena

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

También podría gustarte