Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programación en C++ Con C++ Builder - Zeitoune y Rettore
Programación en C++ Con C++ Builder - Zeitoune y Rettore
con
C++Builder
Versin de borrador N3
Ao 2004
Angel A. Zeitoune
(azeitoune@yahoo.com.ar)
y
Ricardo A. Rettore
(ricadorettore@yahoo.com.ar)
* Esta es una versin borrador, cualquier duda o sugerencia por favor escribir a cualquiera
de los autores.
Introduccin.
Este curso es fruto de la experiencia profesional y la accin pedaggica de varios
aos de docencia de los autores. Es por esta ltima, que luego de una incansable bsqueda
de algn libro que permitiese aprender a programar en C++ al mismo tiempo que ensease
a utilizar como herramienta a C++Builder, y dada su carencia en el mercado, decidimos
desarrollarlo.
C++Builder es herramienta de desarrollo rpido de aplicaciones (RAD, rapid
application development) para Windows, en lenguaje de C++, que posee varias
caractersticas importantes, lo cual facilita el desarrollo de aplicaciones grficas.
Queremos aclarar que en este curso, no se pretende la enseanza a fondo de las
herramientas de programacin C++Builder. Se presenta una breve introduccin a su uso y
conocimientos mnimos para lograr el aprendizaje del lenguaje.
Creando un proyecto.
Al iniciarse, C++Builder, esta listo para comenzar un nuevo proyecto. Si estabamos
en el entrono y queremos crear uno nuevo existen dos formas de hacerlo:
En el men principal File/New, donde se nos presenta una ventana de new item,
donde seleccionamos Application.
Un nuevo proyecto esta formado (por defecto) por los archivos de proyecto, y un
formulario con su respectiva unit.
Tambin podremos incluir a nuestro proyecto, nuevos formularios, units, mdulos
de datos, archivos de texto, etc. con la opcin File/New.
Lo primero que realizaremos, es grabar nuestro proyecto con nombres significativos
al programa que estemos realizando en una carpeta especialmente destinada a nuestro
proyecto.
Sugerencia: Al nombre del archivo de proyecto le antepondremos una P (por ej.
PNombre.bpr) y al nombre de la unit asociada al formulario le antepondremos una F (por
ej. FNombre.cpp), y a una unit sin formulario con una U (por ej. UNombre.cpp).
Contenido
.h
.cpp
.dfm
.bpr
Archivo de proyecto
.exe
Programa ejecutable.
.res
.obj
.tds
Form:
El formulario representa la ventana de una aplicacin. Un formulario, a su vez,
puede contener otros componentes, como Button, Label, CheckBox, etc.
Propiedades:
Name: Representa el nombre lgico con el que se referencia al componente.
Caption: permite modificar el texto del ttulo del formulario.
Font: modifica el tipo de letra (fuente, estilo de fuente, tamao, etc.) de los
componentes que estn contenidos en el formulario.
Position: especifica la posicin del formulario. Puede ser por diseo, en el centro de
la pantalla, centro del escritorio, etc.
Height y Width: representan el alto y ancho del formulario en pixeles.
Left y Top: posicin izquierda y superior del extremo superior izquierdo del
formulario en pixeles.
Eventos:
OnCreate: este evento ocurre cuando el formulario se crea.
OnShow: ocurre cuando el formulario es mostrado (cuando el propiedad Visible es
True).
OnActivate: ocurre cuando se activa el formulario (cuando el formulario recibe el
foco).
OnPaint: ocurre cuando el formulario es redibujado (redraw).
Nota: al crearse un formulario, la creacin de este sigue esta secuencia de eventos
mencionados, OnCreate, OnShow, OnActivate y On Paint.
OnClose: ocurre cuando el formulario se cierra.
Left y Top: posicin izquierda y superior del extremo superior izquierdo del botn
relativa al del formulario en pixeles.
Enabled: Habilita o deshabilita la respuesta del botn a eventos.
Hint: es un pequeo texto que aparecer sobre el botn cuando el usuario coloque el
mouse sobre el botn. Para que aparezca el Hint debe colocarse la propiedad ShowHint en
valor True. Estas propiedades se encuentran en la mayora de los componentes visuales.
Visible: determina cuando el botn aparece en el formulario.
Glyph (slo en BitBtn y SpeedButton): permite especificar el bitmap que aparece en
el botn.
Kind (slo en BitBtn): determina el tipo de algunos bitmap predefinidos.
Flat (slo en SpeedButton): hace desaparecer el efecto 3D de los botones.
Down (slo en SpeedButton): especifica cuando el botn est presionado. Para
quedar presionado la propiedad GroupIndex debe ser distinta de cero.
TabOrder: especifica el orden en el que los componentes tendrn el foco.
Sugerencia: probar cambiar el color de la fuente en todos los botones.
Eventos:
OnClick: ocurre cuando se hace click sobre el botn.
OnMouseMove: ocurre cuando se mueve el mouse sobre el botn.
Mtodos:
SetFocus: coloca el foco en el botn.
Label:
Componente que permite mostrar texto en un formulario. Es usado para mostrar
resultados e informacin al usuario, debido a que l no puede editarlo. No puede contener
el foco en una aplicacin.
Propiedades:
Name: Representa el nombre lgico con el que se referencia al componente.
Caption: permite modificar el texto del label (etiqueta).
Font: modifica el tipo de letra (fuente, estilo de fuente, tamao, etc.) del caption.
Alignment: permite especificar la alineacin del texto. Puede ser hacia la derecha,
izquierda o centrada.
Edit:
Caja de edicin, que permite editar un texto de una sola lnea. Se utiliza para que el
usuario introduzca informacin.
Propiedades:
Name: Representa el nombre lgico con el que se referencia al componente.
Text: es el texto asociado al edit.
Font: modifica el tipo de letra (fuente, estilo de fuente, tamao, etc.) del caption.
CharCase: permite especificar los caracteres en mayscula o minscula.
MaxLength: cantidad mxima de caracteres que se pueden introducir.
ReadOnly: especifica que el texto es de solo lectura.
Eventos:
OnChange: ocurre cuando le texto es modificado.
CheckBox y RadioButton:
Son componentes de seleccin. Se diferencian en que el primero permite seleccionar
varias opciones simultneamente, mientras el segundo slo permite la seleccin de un nico
elemento dentro de un mismo grupo.
De ahora en adelante slo veremos las propiedades, mtodos y eventos que
caracterizan a los componentes.
Propiedades:
Checked: especifica cuando el componente est seleccionado.
Investigar: cmo puedo especificar diferentes grupos de RadioButton, de manera
que me permitan seleccionar una opcin de cada grupo?
ListBox:
Es un componente que permite visualizar y manipular una lista de elementos
(items).
Propiedades:
Items: contiene los elementos del ListBox; es del tipo TStrings (lista de strings).
Esta clase, a su vez, contiene mtodos que permiten manipular elementos como agregar
(Add), insertar (insert), eliminar (delete) y mover (move).
Columns: especifica el nmero de columnas.
MultiSelect: permite seleccionar varios elementos al mismo tiempo.
Sorted: ordena automticamente los elementos alfabticamente.
Programacin en C++ con C++Builder
Mtodos:
Clear: Borra todos los elementos del ListBox.
Memo:
Es un componente estndar de Windows, que permite manipular texto multilnea,
tanto para el ingreso por parte del usuario como informar textos de gran longitud.
Propiedades:
Lines: contiene los lneas de texto que estn contenida en el Memo; es del tipo
TStrings (lista de strings), al igual que los tems del ListBox.
ScrollBars: determina cuales barras de desplazamientos se van a mostrar.
Mtodos:
Clear: Borra el contenido del Memo.
Otros:
Una vez experimentado con estos componentes, se sugiere continuar investigando,
otros como:
MainMenu.
ComboBox.
Panel.
StringGrid.
Image.
StatusBar.
Timer.
Encapsulamiento
Herencia.
Polimorfismo.
Clases (class).
Una clase es una abstraccin, que modela las caractersticas y comportamientos de
un objeto, la cual debe incluir funcionalidades que permitan informar o modificar el estado
de esa entidad, como as tambin, realizar diversas acciones para las cual fue diseado.
Para el modelaje de esta clase, se debe determinar un conjunto de atributos que la
definen, y un conjunto de funcionalidades que representan sus posibilidades de interaccin.
10
Primero aprenderemos a definir una clase y luego veremos como podemos usarla
creando un objeto, creando una clase derivada o como atributo de otra clase.
La definicin de una clase se divide en dos partes, la declaracin de la cabecera y la
implementacin (implementacin de los mtodos).
La declaracin de la cabecera se realiza mediante la palabra reservada class. Una
clase esta dividida en diferentes secciones, de acuerdo a la caracterstica determinante de
sus miembros. Cada seccin esta encabezada por especificadotes de seccin, las cuales
pueden ser:
private: indica que los miembros pertenecientes podrn ser accedidos solamente
dentro de la clase.
public: indica que los miembros pertenecientes podrn ser accedidos tanto dentro de
la clase como por otras clases.
protected: indica que los miembros pertenecientes podrn ser accedidos dentro de la
clase y por sus descendientes, pero son privados para otras clases.
published: los miembros pertenecientes, son idnticos a public, pero adems toda
propiedad ser visualizada en el inspector de objetos.
La estructura es la siguiente:
class NombreDeLaClase {
private:
tipo variable1;
public:
void Metodo1(void);
void Metodo2(tipo variable2);
tipo Metodo3(void);
};
Las palabras reservadas private y public son especificadores de acceso
privado y publico respectivamente, es decir, todos los mtodos declarados en el rea
publica podrn ser accedidos por cualquier clase, mientras los privados slo por la misma
clase. Otros especificadores de acceso son protected, published, y automated.
Se puede observar en esta estructura, que hemos declarado en la seccin privada una
variable global y dos mtodos en la seccin pblica.
Cada variable debe ser de un tipo, es decir, a un tipo de dato existente en
C++Builder. Como puede ser float, double, int, etc. Tambin puede ser un tipo de
dato definido por el programador. Adems una variable posee un nombre lgico que la
representa variable1.
En la declaracin de los mtodos, vemos que en el primer mtodo llamado
Metodo1 se antepone la palabra reservada void la cual hace referencia que este mtodo
11
no devuelve un ningn valor. Luego del nombre aparece encerrado entre parntesis la
palabra reservada void que representa que el mtodo no recibe ningn valor como
parmetro.
El Metodo2, al igual que el anterior, no devuelve ningn valor, mientras que este
recibe un parmetro un variable llamada variable2 del tipo de dato tipo.
Para el Metodo3, este mtodo devuelve un valor del tipo de dato tipo, mientras
no recibe ningn parmetro.
Para la implementacin de los mtodos, se debe anteponer al nombre del mtodo el
nombre de la clase con doble dos puntos (::) entre ellos, luego se encierra entre llaves ({
...}) el cdigo que se va a ejecutar cuando sea llamado este mtodo. Podemos observar la
implementacin del Metodo1:
void NombreDeLaClase::Metodo1(void)
{
// cdigo
}
Para aclarar este concepto vamos a disear una clase que modele un rectngulo a la
cual llamaremos TRectangulo, la cual debe poder calcular su superficie a partir de los
lados.
Primero debemos pensar que elementos caracterizan un rectngulo, con lo cual
encontramos el ancho, el alto y la superficie. Luego, necesitamos mtodos que nos permitan
manipular estos datos, para ello tenemos debemos incorporar los datos mediante los
mtodos IngresarAncho e IngresarAlto, un mtodo que calcule la superficie
llamado CalcularSup y por ltimo uno que devuelva o informe el valor de la superficie
llamado InformarSup.
Observacin: el modelado de una clase puede variar de un programador a otro, por
lo que no existe una nica solucin posible, ni una sola solucin correcta.
La declaracin de la cabecera clase se escribe como sigue:
class TRegtangulo {
private:
float Ancho, Alto;
float Superficie;
public:
void IngresarAncho(float Anchoi);
void IngresarAlto (float Altoi);
void CalcularSup(void);
float InformarSup(void);
12
};
La implementacin de los mtodos es:
void TRegtangulo::IngresarAncho(float Anchoi);
{
Ancho = Anchoi;
}
void TRegtangulo::IngresarAlto (float Altoi);
{
Alto = Altoi;
}
void TRegtangulo::CalcularSup(void)
{
Superficie = Ancho * Alto;
}
float TRegtangulo::InformarSup(void)
{
return Superficie;
}
Para el mtodo CalcularSup se observa que se realiza la asignacin de las
variables recibidas como parmetro a los atributos de la clase.
Observacin: toda expresin debe terminar con un punto y coma (;).
Diagrama de clase.
Un modelo sencillo, que nos ayuda a esquematizar una clase para acelerar su diseo,
es el diagrama de clase. A su vez, nos permite interpretar rpidamente el diseo de una
clase con una rpida lectura, con la particularidad de ser independiente del lenguaje con que
se implemente la clase.
13
Constructor.
El mtodo constructor es un mtodo especial de la clase que permite inicializar
atributos u otras variables necesarias de la clase. Este mtodo es invocado automticamente
cuando se crea un objeto de esta clase. Posee algunas caractersticas importantes como:
Puede recibir parmetros de cualquier tipo con excepcin de la misma clase (si un
puntero).
Para continuar con el ejemplo anterior, supongamos que deseamos inicializar los
valores del ancho y alto del rectngulo con los valores 10 y 20 respectivamente, y que
realice el clculo de la superficie para estos valores.
La declaracin del constructor se realiza en la parte pblica, como se observa:
class TRegtangulo {
private:
float Ancho, Alto;
float Superficie;
public:
TRectangulo(void);
14
Destructor.
Tambin se trata de un mtodo especial de una clase, pero que es invocado cuando
se destruye un objeto de esta clase. En l se debe liberar toda memoria o recurso especial
que se halla pedido la clase. Posee algunas caractersticas importantes como:
No recibe parmetros.
Para su declaracin se utiliza el smbolo ~ seguido por el mismo nombre que la clase.
La declaracin del constructor se realiza en la parte pblica, como se observa:
class TRegtangulo {
private:
float Ancho, Alto;
float Superficie;
public:
TRectangulo(void);
~TRectangulo(void);
void IngresarAncho(float Anchoi);
void IngresarAlto (float Altoi);
void CalcularSup(void);
float InformarSup(void);
Programacin en C++ con C++Builder
15
};
La implementacin del constructor, para realizar lo pedido sera:
~TRectangulo::TRectangulo(void)
{
// no es necesario realizar nada para nuestro ejemplo
}
16
Entonces, para que construimos clases? Una clase es en esencia una estructura
compleja cuya vida es dinmica, en la cual sus atributos van cambiando con el tiempo, pero
siempre realizando una accin especfica. Por ejemplo, podramos tener una clase que se
encargue de manejar el puerto serie. Entonces esta clase deber saber como abrir el puerto,
configurarlo, leer y escribir datos en l, generar un mensaje cuando halla ledo un nuevo
dato, etc. Vemos que las obligaciones de esta clase son complejas, pero con una accin
especfica.
Encapsulamiento
Como definimos antes, el encapsulamiento es el agrupamiento de atributos y
servicios dentro de una clase. Esto significa, que podemos comunicarnos con una clase a
travs de sus interfaces bien definidas, pero no conocer como se encuentran implementadas.
Aunque podramos conocer los detalles de su implementacin de una clase, no debe
escribirse cdigo que dependa de ello, esto significa que la implementacin de una clase en
particular puede ser modificada o reemplazada sin afectar al resto del sistema, siempre y
cuando no cambie la interfaz public y published;
Herencia.
Una de las relaciones ms importantes entre clases es la herencia. Es uno de los
pilares fundamentales de la POO, mediante la cual se produce la transmisin de atributos y
funcionalidades de una clase a otra, lo cual trae aparejado grandes ventajas como la de
reutilizacin de cdigo en la que se crean nuevas clases a partir de clases ya existentes por
medio de la absorcin de sus atributos y comportamientos, sobreponindolos o
mejorndolos con las capacidades que las nuevas clases requieran.
La herencia, nos permite definir una clase modificando una o ms clases ya
existentes. Estas modificaciones pueden consistir en aadir nuevos atributos y
funcionalidades a la clase que se est definiendo, aunque tambin se pueden redefinir
funcionalidades ya existentes.
A partir de lo anterior, se deduce que existe una clase primitiva (ya existente) de la
que partimos, a la cual llamaremos clase base o clase padre, y una nueva clase que
definiremos, a la cual llamaremos clase derivada o clase hija.
Esta clase hija, puede ser, a su vez, la clase padre de una o ms nuevas clases
derivadas. Crendose de esta manera, una jerarqua de clases.
Para especificar el uso de la herencia, despus del nombre de la clase hija, se agrega
el operados dos puntos (:), seguido por un especificador de acceso y luego el nombre de la
clase padre, como se observa:
class NombreClaseHija: public NombreClasePadre {
private:
//
Programacin en C++ con C++Builder
17
public:
//
};
El especificador de acceso (en este caso public), describe la forma de acceso a los
miembros heredados de la o las clases padres. Puede ser:
Public: todos los miembros public de la clase base son miembros public de la
clase derivada. Miembros protected de la clase base son miembros protected de
la clase derivada. Miembros private de la clase base permanecen privados a la clase
base.
Private: tanto los miembros public y protected de la clase base son miembros
private de la clase derivada. Miembros private de la clase base permanecen
privados a la clase base.
Resumiendo en una tabla:
Identificador
private
protected
public
protected
public
protected
public
private
protected
public
protected
protected
public
18
19
float InformarVolumen(void);
};
La implementacin de los mtodos es:
void TPrisma::IngresarAltura(float Alturai);
{
Altura = Alturai;
}
void TPrisma::CalcularVolumen(void);
{
CalcularSup();
// Aqu llamamos al mtodo que calcula
// la superficie de la base
// perteneciente a la clase padre
Volumen = InformarSup() * Altura;
}
float TPrisma::InformarVolumen(void);
{
return Volumen;
}
Es muy importante tener en cuenta que en la relacin de herencia publica, la clase
hija hereda automticamente todo el contenido declarado en la parte publica en la clase
madre y por ende puede utilizarla como si fuesen propios, pero a la parte privada slo se
puede acceder a travs de sus mtodos.
Veremos a continuacin, un segmento de cdigo que ejemplifica la implementacin
del evento click de un botn del formulario, en el cual declaramos la instancia u objeto
particular de la clase TPrisma.
Nota: en la instanciacin, slo hacemos referencia a la clase hija, no se instancia la
clase madre.
void __fastcall TForm1::BotonClick(TObject *Sender)
{
TPrisma Prisma;
20
Prisma.IngresarAncho = StrToFloat(Edit1->Text);
Prisma.IngresarAlto = StrToFloat(Edit1->Text);
Prisma.IngresarAltura = StrToFloat(Edit1->Text);
Prisma.CalcularVolumen();
Label1->Caption = FloatToStr(Prisma.InformarVolumen());
}
Clases contenedoras.
El uso de clases contenedoras se centra en la idea que los objetos pueden estar
formados (o contienen) a otros objetos, llamados objetos miembro. Los objetos miembro se
convierten en atributos de nuestra nueva clase. Esta capacidad de contener a otros objetos
tambin es llamada composicin.
Llevando este concepto a la vida real, podemos pensar a los objetos como formados
por piezas de distinta naturaleza que contribuyen a un mismo fin. Este es el caso del objeto
auto, el cual esta compuesto por otros objetos que son parte integra de l, como son el
objeto motor, rueda, volante, etc.
Imaginemos ahora, un pndulo de un reloj
bidimensional, como la conjuncin de un rectngulo (brazo
del pndulo) y un crculo (peso del pndulo), al cual
queremos calcular el rea.
La clase contenedora TPendulo, contendr a las
clases miembro TRectangulo y TCirculo. Para
continuar con el concepto de reutilizacin de cdigo,
utilizaremos a la clase TRectangulo antes definida y
slo disearemos a la clase TCirculo y modelaremos la
clase TPendulo.
Modelo bidimensional
del pndulo de un reloj
class TCirculo {
private:
float Radio;
float Superficie;
public:
void IngresarRadio(float Radioi);
void CalcularSup(void);
float InformarSup(void);
};
La implementacin de los mtodos es:
21
22
}
void TPendulo::IngresarAnchoBrazo(float Anchoi)
{
Rect.IngresarAncho(Anchoi);
}
void TPendulo::CalcularSup(void)
{
Rect.CalcularSup();
Circ.CalcularSup();
Superficie = Rect.InformarSup() + Circ.InformarSup();
}
float TPendulo::InformarSup(void)
{
return Superficie;
}
En este ejemplo de contencin se instanci las clases miembro en la parte privada
de la clase (tambin se puede realizar en la parte publica, pero varia su implementacin). Se
implementaron mtodos para ingresar los atributos, los cuales no se almacenaron en
variables pertenecientes a esta clase, sino, se asignaron directamente a la clase contenida
correspondiente.
En el mtodo CalcularSup(), se llam a los mtodos CalcularSup() de
cada una de las clases contenidas para que realicen el clculo de su superficie y dispongan
su valor, para realizar la suma de ambas superficies.
Avanzado: Los objetos miembro se construyen en el orden en el que se declaran.
Registros (struct).
Los registros son los predecesores de las clases. Permiten definir tipos de datos
agregados que se construyen empleando elementos de otros tipos, es decir, una estructura
es un conjunto de diferentes datos agrupados bajo una nica declaracin. Un ejemplo de
esta definicin:
struct Tiempo {
int hora;
int minutos;
23
int segundos;
};
En este ejemplo vemos que la palabra reservada struct define la estructura, que
permitir crear instancias de ella. La palabra Tiempo es el nombre del tipo de estructura.
Ahora podemos declarar instancias de esta estructura, de la forma:
Tiempo Inicio;
Y podemos asignar valores a sus elementos usando el nombre de la instancia
seguido por . (punto), luego el nombre del elemento, igual como vimos su uso en clases,
dado que las clases son una evolucin de las estructuras.
Inicio.hora = 10;
Inicio.minutos = 35;
Inicio.segundos = 21;
24
25
Expresin lgica.
Una expresin lgica es una combinacin de constantes, variables y funciones
lgicas, con operadores lgicos y relacionales.
Para comenzar a entender su uso, podemos definir una variables lgicas como una
variable que puede contener slo dos valores posibles: verdadero (trae o 1) o falso (false o
0). En C++ este tipo de variable se llama bool.
Los operadores lgicos son aquellos que nos permiten concatenar o modificar
expresiones lgicas, resultando un valor lgico. Ellos son:
Operador
Nombre
Operacin lgica
not
negacin
&&
and
y lgico
||
or
o lgico
Para entender mejor su uso, vamos a ver como trabajan a traves de un ejemplo.
Supongamos que tenemos dos variables lgicas A y B.
A
0
1
!A
1
0
A
0
0
1
1
B
0
1
0
1
A && B
0
0
0
1
A || B
26
0
0
0
0
1
1
1
0
1
1
1
1
Los operadores relacionar relacionales son aquellos que nos permiten comparar dos
valores, resultando un valor lgico. Ellos son:
Operador
Nombre
Operacin lgica
>
mayor
mayor que
<
menor
menor que
<=
menor o igual
>=
mayor o igual
!=
distinto
distinta que
==
igual
igual que
Observacin: No hay que confundir el operador ==, con el operador =, dado que
el primero significa comparacin, mientras el segundo asignacin. declaran.
Vamos a ver como trabajan a travs de un ejemplo. Supongamos que tenemos tres
variables A=5, B=5 y C=7.
Expresin
Resultado
A>B
A>=B
A<=C
A!=B
A!=C
A==B
A==C
0
1
1
0
1
1
0
Estructura condicional if
Es una estructura simple que permite ejecutar una instruccin o un bloque de
instrucciones slo si se cumple una expresin lgica, es decir, se ejecuta slo si el resultado
de la expresin lgica es verdadero.
if (expresin_lgica)
{accin;};
Programacin en C++ con C++Builder
27
if (A)
C = A - B;
28
29
que impliquen desigualdad (> o <), tampoco para datos de tipo flotante dato que no poseen
un secuencia bien definida.
Vamos a ver dos ejemplos de su uso. En el primero queremos analizar la paridad de
un nmero ingresado por el usuario, almacenando en una variable lgica (bool) llamada
par:
switch (num%2) {
case 0: {par = true; break;}
case 1: {par = false; break;}
};
Se analizan solamente los casos 0 y 1 dado a que el resto de la divisin por 2 slo
puede tomar estos valores.
El mismo ejemplo se podra haber resuelto de tres formas ms sencillas para
analizar:
if (num%2 == 0)
par = true;
else
par = false;
if (!num%2)
par = true;
else
par = false;
par = !bool(num%2)
30
Ciclo for.
La estructura for (durante), se utiliza para realizar, generalmente, una accin
cierta cantidad determinada y definida de veces. Para ello, consta de tres parmetros que
debemos definir:
Inicializacin,
Condicin de salida
Incremento
31
Antes de entrar
al for
Primer paso
Segundo paso
Tercer paso
exponente paso
Saliendo del for
Condicin if
Condicin
Finalizacin
-----
Resultado
No existe
true
true
true
true
true
false
1
2
3
...
exponente
No existe
No existe
Base
Base^2
Base^3
Base^exponente
Base^exponente
Depende del signo
del exponente
32
Ciclo while
El ciclo while ("mientras") difiere del ciclo for en que slo contiene una condicin
de prueba, que se verifica al principio de cada iteracin. Mientras la condicin sea true el
ciclo contina funcionando. La sintxis correspondiente es:
while (expresin_lgica) {accin_1;
accin_2;
.
.
accin_n;};
En la misma, la accin se realiza mientras la expresin lgica sea verdadera (valor
distinto de cero). Es de vital importancia que la accin tenga alguna forma de modificar el
valor de la expresin lgica, para que, en algn momento, sea falsa y el ciclo finalice. Si de
entrada la expresin lgica da falsa, la accin del ciclo nunca se realiza.
Veamos un ejemplo de la utilizacin de esta estructura, supongamos que obtener la
potencia a la cual hay que elevar el nmero 2 para obtener el valor 1024.
33
Hacemos:
int x = 1024;
int n;
while (x >= 2){
n++;
//n lo utilizo de contador
x = x / 2;
}
Ahora, n guarda el valor de la potencia de 2 para obtener el valor 1024. Notamos
nuevamente que el valor de la variable de control x, cambia dentro del propio ciclo,
evitando que el ciclo se haga infinitamente.
Ciclo do-while.
Este ciclo es prcticamente igual al while. Sin embargo, la diferencia entre los dos
es importante, ya que el ciclo while evala la expresin condicional al principio del ciclo;
en el caso de do-while ("hacer mientras"), la expresin se evala al final del
propio ciclo. La sintaxis de este bucle es:
do {accin;} while (exprlgica);
Debido a la manera como funciona el ciclo do-while, el cdigo en el cuerpo del
ciclo se ejecuta al menos una vez, sin importar el valor de la condicin de prueba (ya que se
evala al final del ciclo). En el caso del while, la condicin se evala al principio, por lo
que es posible que nunca se ejecute el cuerpo del ciclo.
Tambin en este caso, la modificacin de la expresin lgica debe ser explcita en el
bloque de cdigo, para que el ciclo finalice en algn momento, cuando la expresin
condicional resulte falsa.
Un ejemplo sera:
int x = 1024;
int n;
do {x = x / 2;
n++;}
while (x > 1);
34
Donde n, guarda nuevamente la potencia a la que hay que elevar el valor 2 para
obtener el nmero 1024.
Es un error comn, que se trate de realizar una accin en el do que no se pueda
realizar, es decir, hay que tener en cuenta que como el ciclo siempre se ejecuta al menos
una vez, no debemos por ejemplo implementar en el cuerpo del do, una accin imposible
tal como el la divisin por cero, por ejemplo.
Para ver ms grficamente el error, analizaremos un cdigo errneo para
ejemplificar.
float
float
do {y
x
x = 0;
y;
= 512 / x; //error al tratar de dividir por cero!!!
= x + 2.0;} //acumulo en x el valor anterior de x ms 2
//x en este caso es un acumulador
while (y != 1);
35
for(;;){
if(LeerBitControl())break;
}
int x = LeerDato();
En este caso, el for se utiliza a modo de delay o retardo hasta que llegue la
confirmacin de lectura del puerto.
Avanzado: verificar que si al for le falta alguno o varios de sus parmetros,
tambin funciona, si utilizamos la sentencia break.
En el caso que consideremos usar un bit de status para que haga comenzar o detenga la
adquisicin del dato, segn sea true o false.
int x=0;
for(;;){
if(LeerBitStatus())break;
for(;;){
if(LeerBitControl())break;
}
x += LeerDato();
}
Para ejemplificar el uso de la instruccin continue, podemos considerar el caso
anterior, haciendo la salvedad de que el siguiente ejemplo es un ciclo infinito, y es slo a
modo de ejemplo.
int x=0;
while(!detener){
if(LeerBitStatus())continue;
for(;;){
if(!LeerBitControl())break;
}
x += LeerDato();
}
36
Vector[1]
Vector[2]
Vector[3]
Vector[4]
Valor int A
Valor int B
Valor int C
Valor int D
Valor int E
37
38
char
Es un tipo de dato que permite definir un carcter de la tabla ASCII (Anexo I). Esta
tabla es una tabla de correspondencia entre un caracter y un nmero asociado al mismo
entre 0 y 255.
En este ejemplo definimos un variable llamada Caracter a la cual le asignamos
el mismo caracter A de dos maneras diferentes:
char Caracter = A;
char Caracter = 65;
c-string
Es un arreglo de caracteres, es decir, es una cadena de caracteres que se define en
forma de un vector de caracteres. Esta definicin es heredada del lenguaje c aunque su
uso ha disminuido. Pero conserva algunas ventajas como son su simpleza y el menor
recurso ocupado. Se definicin tiene la forma:
Char Nombre[longitud];
Donde Nombre es el nombre de la variable que definimos y longitud es la
cantidad de caracteres que va a contener. En este ejemplo, vemos que se permite asignarle
toda una cadena de forma directa.
char Cadena[12] = Computacion;
Nota: es importante diferenciar cuando se asigna un carcter a una variable se
utiliza comillas simple (A), mientras para las cadenas se utilizan comillas dobles
(Computacin)
Tambin se puede realizar la asignacin a cada caracter:
Cadena[2] = n;
39
c++ string
Es una clase asociada a un arreglo de caracteres que posee mtodos para su
manipulacin. Para su utilizacin no es necesario especificar la longitud en la definicin,
dado que se puede modificar en forma dinmica con la asignacin de una nueva cadena.
string Cadena = Bioingenieria;
Esta clase es muy flexible y prctica aunque no la vamos a desarrollar dado que
C++Buider posee su propia definicin de cadena de caracteres que veremos a
continuacin.
AnsiString
Es una clase especialmente diseada para la manipulacin de cadenas de caracteres
definida por Borland. Su definicin tiene la forma:
AnsiString Cadena = Bioingenieria;
Nota: es importante diferenciar que en la cadena c++string el subndice del primer
caracter es el 0 (cero), mientras que para AnsiString es el 1 (uno).
Esta clase define varios mtodos que facilitan la manipulacin de las cadenas, entre
las cuales se destacan (los ejemplos son siempre sobre la cadena original Bioingenieria):
Delete(pos, cant)
Permite borrar una cantidad (cant) de caracteres de la propia cadena a partir de
una posicin (pos)
Cadena.Delete(1, 3); // Cadena = ingenieria
SubString(pos, cant)
Devuelve una nueva cadena que es una subcadena de la propia. La subcadena
contiene cant caracteres y comienza desde pos.
Sub = Cadena.SubString(6, 2); // Sub = ge
40
Length()
Devuelve la longitud (el nmero de bytes) de la cadena
int Longitud = Cadena.Length();
// Longitud = 13
Insert(subcadena, pos)
Inserta una subcadena en nuestra cadena en la posicin pos.
SubCad = Super;
Cadena.Insert(Subcad, 1);
// Cadena = SuperBioingenieria
SetLength(cant)
Cambia la longitud de la cadena a la especificada por cant. Si la cant es menor
que la longitud de la cadena, entonces la trunca, es decir, borra todos los caracteres desde la
posicin cant+1 en adelante. Si cant es mayor a la longitud, el contenido de los
caracteres restantes es incierto.
Cadena.SetLength(10);
// Cadena = Bioingenie
Pos(subcadena)
Devuelve la posicin del inicio donde se encuentra la subcadena dentro de la cadena
original. Si la cadena no posee la subcadena retorna el valor 0 (cero). Si la cadena posee
repetida la subcadena dentro de ella, devuelve la posicin del primero.
int posicion = Candena.Pos(in);
// posicion = 4
LowerCase()
Devuelve la cadena en minscula.
AnsiString cad = Cadena.LowerCase(); // cad = bioingenieria
UpperCase();
Devuelve la cadena en mayscula.
AnsiString cad = Cadena.UpperCase(); // cad = BIOINGENIERIA
41
42
ios::out
ios::ate
ios::app
ios::nocreate
ios::noreplace
ios::trunc
ios::binary
ofstream
ifstream
fstream
ios::out | ios::trunc
ios::in
ios::in | ios::out
43
Contenido archivo
En este primer ejemplo vemos como se inserta una simple cadena de caracteres a un
archivo de texto tipo ofstream llamado ArchivoSal
ArchivoSal << alumno;
alumno
44
Hola
Hola1
Hola 2
Ahora vemos que podemos tambin realizar la insercin del contenido una variable
entera, cuyo contenido se convierte de forma automtica en una cadena de caracteres. A
dems se puede observar otra forma de insertar el caracter de fin de lnea agregando \n
int num = 1;
ArchivoSal << num << Hola\n;
Num++;
ArchivoSal << num << Hola\n;
1Hola
2 Hola
HolaMundo
Hola Mundo
21
3 2
3 3
Hola4
4Mundo
45
Cdigo ejemplo
Contenido archivo
variables
En este primer ejemplo vemos como extrae una simple cadena de caracteres de un
archivo de texto tipo ifstream llamado ArchivoEnt.
string Texto;
ArchivoEnt >> Texto;
alumno
Texto = alumno
En este par de ejemplos, vemos como el mismo cdigo permite leer cadenas de
caracteres sucesivos independientes que estn separadas por un caracter de espacio o de fin
de lnea.
string Texto1, Texto2;
ArchivoSal >> Texto1 >> Texto2;
string Texto1, Texto2;
ArchivoSal >> Texto1 >> Texto2;
alumno1 alumno2
Texto1 =
Texto2 =
alumno1
alumno2
Texto1 =
Texto2 =
alumno1
alumno2
alumno1
alumno2
alumno 1
Texto = alumno
num = 1
46
get() y getline():
Estos mtodos permiten realizar la lectura de toda una lnea, hasta que encuentra un
caracter de terminacin.
Reciben tres parmetros. El primero es un puntero a un vector de caracteres (buffer),
el segundo el tamao del vector, y el tercero (opcional) el caracter de terminacin. Por
defecto este caracter es el \n, llamado caracter de fin de lnea.
Si el primer caracter de la lnea es el carcter de terminacin, devuelven un vector
de longitud cero. Pero su gran diferencia radica, en que el mtodo get() se detiene, y una
segunda llamada al mtodo devuelve el mismo resultado, hasta que se cambie el caracter de
terminacin. En cambio, una segunda llamada al mtodo getline() devuelve la
siguiente lnea, por lo que normalmente se utiliza este mtodo.
Otra diferencia radica en que el mtodo get() puede ser llamado sin ningn
parmetro. En este caso devuelve el caracter siguiente..
Mtodos especiales
eof()
is_open()
Este mtodo devuelve true si se abri correctamente el archivo.
good()
Este mtodo devuelve true si no ocurri ningn error.
bad()
Este mtodo devuelve true si ocurri algn error con el buffer.
fail()
Este mtodo devuelve true si ocurri algn error que no afecte al buffer.
47