TOLEDO MARTNEZ
CONTENIDO DE LA LECCIN 3
ABSTRACCIN DE DATOS, CLASES Y OBJETOS DE DATOS
1.
2.
3.
4.
5.
6.
Introduccin
Tipos abstractos de datos
Especificacin de los TAD
Clases de datos
Examen breve 3-1
La clase estndar de datos en C++
3
3
7
8
10
11
11
6.1.1. Constantes
6.1.1.1. Constantes enteras
6.1.1.2. Ejemplos 3.1, 3.2
13
13
15
16
16
17
20
20
22
Palabras reservadas
Identificadores
Ejemplo 3.8
Ejemplo 3.9
Expresiones simples
Operaciones aritmticas binarias
Operaciones aritmticas unarias
Expresiones mixtas
Precedencia
Asociatividad
FUNDAMENTOS LECCIN 3
23
24
26
26
26
26
28
29
29
31
31
32
33
33
34
37
37
37
38
38
39
39
40
40
43
44
44
45
46
46
48
3-1
48
50
50
51
53
56
16.1. Preguntas
16.2. Problemas
FUNDAMENTOS LECCIN 3
56
58
3-2
LECCIN 3
ABSTRACCIN DE DATOS, CLASES Y OBJETOS DE DATOS
INTRODUCCIN
Conforme se avanza en el proceso de diseo de sistemas computacionales, los distintos tipos de datos necesarios, as como las operaciones que deben ser ejecutadas con estos datos se hacen notar. En este punto puede ser utilizado un tipo especial de abstraccin
conocido como abstraccin de datos. Esto involucra una descripcin abstracta o lgica,
tanto de los datos requeridos por el sistema informtico, como de las operaciones que pueden ser ejecutadas con esos datos. El uso de la abstraccin de datos durante el desarrollo de
software permite al diseador concentrarse en cmo son usados los datos en el sistema para
resolver el problema que le ocupa, sin tener que preocuparse de cmo son los datos representados y tratados en la memoria de la computadora.
En esta leccin se introducen las clases de datos (tipos de datos) fundamentales que
ofrece C++. De hecho, una de las caractersticas que con frecuencia distingue a un lenguaje
de programacin de otros son las clases de datos fundamentales que ofrece el lenguaje.
C++ tiene un rico conjunto de clases de datos fundamentales que permiten crear y operar,
entre otros, con los enteros, reales, caracteres y booleanos.
Objetivos de esta leccin:
FUNDAMENTOS LECCIN 3
3-3
no! Lo que tiene que hacer es proporcionar la informacin para que la operacin de suma
realice su trabajo y revisar la informacin que regresa. En otras palabras, todo lo que tiene
que saber es lo que debe suministrar a la operacin y cmo le responder. A la manera en
que los tipos abstractos de datos (TAD) actuarn y reaccionarn para una operacin determinada se conoce con el nombre de desempeo.
El trmino desempeo cuando se asocia con un TAD, tiene que ver con la forma en que el
TAD actuar o reaccionar para una operacin determinada.
FUNDAMENTOS LECCIN 3
3-4
FUNDAMENTOS LECCIN 3
3-5
Conviene pensar en esto como en una muralla que separa el programa de aplicacin
de la implementacin del tipo de datos. La nica comunicacin posible hacia el tipo de datos es a travs de los parmetros de las rutinas de acceso. El nico resultado de vuelta hacia
el programa de aplicacin es a travs de la informacin que devuelven las rutinas de acceso. Sin usar las rutinas de acceso adecuadas, es imposible penetrar la muralla que rodea la
implementacin de un tipo de datos. Esta situacin se ilustra en la figura 3.1.
MURALLA
Programa de
aplicacin
Rutina de
acceso
Programa de
aplicacin
Implementacin del
TAD
Acceso
directo
FUNDAMENTOS LECCIN 3
3-6
a11 a12 L a 1m
a 21 a 22 L a 2 m
M
L
M
an 1 an 2 L an m
Donde a ij representa el elemento de la fila i y la columna j. Existen numerosas operaciones definidas sobre las matrices. Algunas de stas son:
1.
2.
3.
El desarrollo informtico de este TAD debe aportar algn medio para representar
elementos matriciales y para disear y construir las operaciones descritas ms arriba. TpiFUNDAMENTOS LECCIN 3
3-7
Tomemos nuevamente, como ejemplo, la clase de datos de los enteros. Estos incluyen todos los valores de datos de nmeros enteros entre menos infinito a ms infinito.
Ms an, hay una serie de operaciones especficamente definidas para los enteros. Estas
operaciones incluyen la suma, resta, multiplicacin y divisin, entre otras, como las que
se muestran en la figura 3.2. La serie de nmeros enteros desde menos infinito a ms infinito, junto con sus operaciones relacionadas, forman una clase. Cualquier objeto creado
por esta clase entero, como una variable entera, puede ser slo un valor de nmero entero
y slo se utiliza en una operacin especficamente definida para los enteros. De hecho,
decimos que la clase entero forma un tipo abstracto de datos o TAD.
Un tipo abstracto de datos (TAD) es una clase que describe los atributos de los datos y
desempeo de sus objetos.
FUNDAMENTOS LECCIN 3
3-8
Escalar
Estructurada
Arreglos
Estndar
Enumerada
Entero
Flotante
Estructuras
Apuntador
Clases
Pilas
Colas
Carcter
Booleano
Listas
rboles
La clase escalar es aquella cuyos objetos de datos estn ordenados. Por ordenados,
se entiende que dados dos objetos definidos por la clase, un objeto es igual ( = ), mayor
que ( > ) o menor que ( < ) el otro objeto. Los datos numricos como los enteros y los
FUNDAMENTOS LECCIN 3
3-9
reales o de punto flotante, son claramente escalares porque todos lo nmeros tienen esta
propiedad de ordenamiento. Pronto ver que los caracteres son tambin ordenados, por lo
tanto, se consideran una clase escalar.
Observe en el diagrama que la clase escalar puede ser estndar o enumerada. La
clase estndar es aquella predefinida en el lenguaje C++. Estas consisten en nmeros enteros y de punto flotante, datos de carcter y booleano. La clase enumerada es aquella
que el usuario de C++ define para solucionar un problema de aplicacin dado. En otras
palabras, una clase enumerada describe valores de datos que sern creados dentro del programa C++ para un propsito especfico. Por ejemplo, es posible que quiera definir la serie
de todos los das de la semana (Dom, Lun, Mar, Mir, Jue , Vie, Sb) como una clase
enumerada de datos. En este caso, los valores de los datos son los das individuales y se
ordenan de Dom a Sb. Como resultado, estos valores se pueden manejar dentro de su
programa en forma similar a la clase estndar. Al principio, la idea de crear su propia serie
de valores de datos le puede parecer extraa. La visibilidad de la codificacin ser mucho
ms clara. Al final de esta leccin ver con ms detalle este concepto.
La categora de clase estructurada consiste en clases llamadas arreglos, estructuras y clases (arrays, structs y class). Estas son clases de datos complejos, pues se hacen a
partir de otras clases de datos ms simples. Los arreglos no son ms que una coleccin de
datos del mismo tipo, con un nombre comn. Por otra parte, su nombre, direccin y nmero telefnico (datos de diferentes tipos) pueden ser combinados para formar un registro.
Esta estructura consiste en enteros y caracteres, ambos son clases de datos simples. En
otras palabras, la clase estructurada se forma usando combinaciones de clases escalares
ms simples como bloques de construccin.
La categora clase (class) proporciona la base para la programacin orientada a objetos (POO) en C++. La clase de C++ le permite crear sus propias clases de datos o TAD.
Por ejemplo, suponga que ha sido contratado para escribir un programa de aplicacin para
controlar un cajero automtico. El cajero automtico se requiere para manejar diferentes
objetos de datos con operaciones especficas definidas por aquellos objetos, como depsitos y retiros. No parece una aplicacin ideal para una clase, porque una clase es una coleccin de objetos de datos junto con una serie de operaciones definidas para aquellos objetos? Obviamente, no hay una clase de cajero automtico estndar construida dentro del
lenguaje C++. Sin embargo, la construccin clase de C++ le permite construir su propia
clase, digamos cajeroAutomtico, la cual definir todos los atributos de los datos y desempeo asociado con una mquina cajeroAutomtico.
Como una estructura, una clase se compone de clases de datos ms simples. Adems, una clase incluye funciones que operan sobre los datos de la clase. Estas funciones
definen el desempeo de la clase. De esta manera, la clase C++ es ideal para la impleme ntacin de TAD, porque se puede usar para definir los atributos de los datos de los TAD as
como el desempeo de los mismos.
Por ltimo, la clase apuntador (pointer) se usa para formar los TAD llamados pilas, colas, listas ligadas y rboles binarios. El uso de apuntadores es fundamental para los
lenguajes C y C++; aprender sobre este tema, as como sobre pilas, colas y listas, en otro
curso.
EXAMEN BREVE 3-1
FUNDAMENTOS LECCIN 3
3-10
Como ya sabe, los enteros son todos los nmeros completos (sin parte decimal).
Pueden ser positivos, negativos o cero. Su rango es de menos infinito (- ) a ms infinito (+
). Sin embargo, hay lmites prcticos en el mundo real de las computadoras. En C++, los
valores enteros ms grandes y ms pequeos posibles dependen del hardware y del compilador que se use.
El lenguaje C++ define seis clases de enteros que definen seis rangos diferentes. stos son short int (enteros cortos o pequeos), unsigned short int (enteros cortos sin signo),
int (enteros), unsigned int (enteros sin signo), long int (enteros largos o grandes) y unsigned long int (enteros grandes sin signo).
La definicin de C++ no especifica el tamao de un int, depende del hardware y del
compilador que se utilice. Los informticos dicen que el tamao de un int es dependiente de
la implementacin o que el implementador del compilador es libre de elegir el tamao de
un int. Normalmente se elige como int el tipo de datos entero ms eficiente del hardware
utilizado. Para la mayora de las PC este tamao es de 16 bits (2 bytes). Un entero de 16
bits en complemento a dos puede representar enteros entre -32,768 y 32,767. Para estaciones de trabajo UNIX, un int ocupa normalmente 32 bits (4 bytes). Las computadoras ms
recientes soportan enteros de 64 bits (8 bytes). Para estas computadoras el diseador podra
escoger 64 bits para representar un int.
La especificacin de C++ tampoco indica el tamao en bits de los tipos de datos
short y long. Sin embargo, especifica que un short no ser ms grande que un int y que un
int no ser ms grande que un long . Esto es:
numeroDeBitsshort <= numeroDeBits int <= numeroDeBitslong
En sistemas basados en PC, un short ocupa normalmente 8 bits y un long 32 bits.
En sistemas UNIX, un short normalmente ocupa 16 bits, mientras que un long ocupa normalmente 32 o 64 bits.
Deber sorprenderle por qu hay diferentes clases de enteros. Por qu no slo definir una clase que proporcione suficiente rango para la mayora de las aplicaciones? Por
ejemplo, por qu no usar la clase long int todo el tiempo?, ya que proporciona el rango de
valores ms grande. La razn por la que C++ soporta 6 tipos de datos enteros es que hoy en
da muchos artefactos se controlan mediante una computadora: horno de microonda, automviles, videos y equipos estreo, etc. Los sistemas en los cuales la computadora juega
un papel central en el funcionamiento del sistema se denominan sistemas empotrados (embedded systems). En la mayora de ellos, la memoria que se utiliza para almacenar el programa que controla el sistema es un recurso valioso que no debe malgastarse.
FUNDAMENTOS LECCIN 3
3-11
Por ejemplo, los hornos de microondas actuales, incluyen una CPU que acepta la
entrada de un panel situado enfrente y que controla las operaciones del ho rno. Uno de los
costos asociados con la fabricacin del horno se encuentra en el nmero de chips de memoria que se necesitan para almacenar el programa que controla el funcionamiento del horno.
Al tenerse clases enteros de varios tamaos, C++ permite al programador optimizar el uso
de la memoria en el programa. Escogiendo el tipo de objeto de tamao adecuado, el programador puede reducir las necesidades de memoria del programa. Si el diseo resulta en
menos chips de memoria, obviamente el precio del horno ser menor.
Por otra parte, si por ejemplo, un int requiere dos bytes de memoria para representar un valor y un long int requiere lo doble, o sean cuatro bytes, tomar el doble de espacio
en memoria para representar enteros long int, que lo que requiere un entero int; adems,
tomar el doble de tiempo encontrar un long int que un int, usando una CPU de 16 bits. La
idea es usar el tipo de entero que tiene rango suficiente para satisfacer una aplicacin determinada. Para la mayora de las aplicaciones, int es suficiente, proporciona una ejecucin
y utilizacin de memoria eficiente.
Finalmente la clase int en cualquiera de sus variantes (short int, unsigned short
int, int, unsigned int, long int, unsigned long int), proporciona las operaciones aritmticas normales, como suma, resta, multiplicacin, divisin y una nueva, la operacin de
mdulo. C++ tambin tiene operadores para comparar dos objetos enteros. Las seis operaciones de comprobacin son: igual, distinto, menor que, mayor que, menor o igual que
y mayor o igual que.
La tabla 3.1 muestra los diferentes rangos de un compilador C++ tpico.
NOTA:
Dependiendo de su aplicacin, en algunas ocasiones requerir trabajar con valores en base octal
o en base hexadecimal . En tal caso, requiere una notacin para indicarle al compilador que desea trabajar con valores que no son decimales. Si precede a un valor numrico con 0, tal como 077, el compilador
tratar al valor as escrito como un valor en octal . De igual manera, si precede a un valor con 0x o 0X, tal
como 0xFFFF, el compilador tratar al valor como hexadecimal (observe algunos valores en hexadecimal en la tabla 3.1).
NOTAS DEL COMPILADOR
Sepa que el estndar ANSI C++ reconoce que los rangos de las clases de datos estndar dependen
de la computadora y del compilador. Como resultado, el rango de las diferentes clases de datos dentro del
lenguaje C++ puede diferir de un compilador a otro. Por ejemplo, su compilador puede especificar el rango
de int desde -32768 a +32767, mientras otro compilador puede definir este rango desde -2147483648 a
+2147483647.
FUNDAMENTOS LECCIN 3
3-12
Tamao en bytes
2
int
2o4
unsigned int
2o4
Rango
-32768 a 32767
Ejemplos
2456
0 a 65535
0xFF,
42324
Depende de la plataforma:
-32768 a 32767 para 16 bits,
-2147483648 a 2147483647
para 32 bits.
Depende de la plataforma:
0 a 65535 para 16 bits,
0 a 4294967295 para 32 bits
-2147483648L a 2147483647L
0L a 4294967295L
4175
0xFFFF,
65535
0xFFFFL,
-123456L
123456L
CONSTANTES
La forma ms fcil para escribir una constante entera en C++ es escribir simplemente el nmero. Por ejemplo : 38, 89, 625, 378. Son cuatro constantes enteras vlidas en
C++. Cuando se escribe una constante entera, el compilador le asigna una clase de datos en
C++. Generalmente, ser de clase int, pero la clase asignada depender del tamao de la
constante y de si tiene un sufijo. Por ejemplo, para escribir una constante entera que sea
tratada como clase long, el programador en C++ puede aadir una l o L al final del nmero.
As, las constantes: 29L, 47L, 294L, 568L son de clase long. No es aconsejable utilizar una
l minscula, ya que se puede confundir fcilmente con el dgito 1. No hay modo de especificar constantes enteras de clase short. Si la constante entera no tiene sufijo, entonces el
compilador escoge la clase basndose en el tamao del valor. Si el valor se puede almacenar como un int, entonces su clase es int. Sin embargo, si el valor es demasiado grande para
almacenarse como un int, pero se puede almacenar como un long, el compilador tratar a la
constante como un long. Si el valor es demasiado grande para almacenarse como un long,
el compilador podra mostrar un error.
En algunas ocasiones, es conveniente especificar constantes utilizando una base
diferente. C++ ofrece la posibilidad de escribir constantes enteras en bases 8 (octal) y 16
(hexadecimal). Una constante entera que comienza con un cero se asumir que es un nme-
FUNDAMENTOS LECCIN 3
3-13
ro en base 8. Las siguientes constantes: 048, 087L, 047, 020, son nmeros en base 8 que representan los valores decimales 40, 71, 39 y 16. Todos, excepto el segundo, son de clase int.
El segundo es de clase long. Si la constante est en base 8, los caracteres 8 y 9 no pueden
aparecer en la constante. As, las constantes: 078, 098, 0679 son constantes no vlidas en
C++.
Para utilizar base 16, se debe emplear el prefijo 0x o 0X. En una constante hexadecimal, los caracteres entre a y f o A y F representan los dgitos que se encuentran entre 10 y
15. Las constantes: Ox9a, 0x75, 0XdfL, 0xA2e, representan los valores decimales 154, 117, 223
y 2606. El tercer valor es de clase long, mientras que los otros son de clase int. La sintaxis
general para constantes enteras en octal o hexadecimal es:
Secuencia de uno o ms dgitos
octales; el primero debe ser cero
L o l opcional
digitosOctales [ L | l ]
Comienza con 0x o 0X
secuencia de uno o ms
dgitos hexadecimales
especificador de
tipo opcional
( 0x | 0X ) digitosHexadecimales [ L | l ]
En el ejemplo anterior, la sintaxis de C++ se describe empleando diagramas sintcticos anotados. Por ejemplo, el diagrama sintctico que describe las constantes decimales
es:
Secuencia de uno o ms dgitos
el primero debe ser distinto de cero
Especificador de tipo
opcional l o L
dgitos [ L | l ]
Se utiliza la barra vertical ( | ) para especificar una de varias alternativas. Los corchetes que encierran un elemento indican que ste es opcional. As, un especificador de tipo
puede ser una L o una l, o bien puede omitirse. En un diagrama sintctico, los smbolos en
itlica se conocen como smbolos no terminales. Esto es, representan un conjunto de posibilidades. En el diagrama anterior, el smbolo dgitos representa los dgitos 0, 1, , 9. Los
comentarios empleados en la notacin indican que el primer dgito no puede ser un cero.
Quiz sea interesante comentar que no se ha hecho ninguna mencin de los nmeros
negativos. La razn es que las constantes enteras son siempre no negativas. Para construir
un valor negativo se puede aplicar el signo menos a las constantes, pero la interpretacin
formal es que el operador unario menos se aplica a la constante. El signo menos no forma
parte de la constante. El signo mas tambin se puede aplicar a una constante entera y no
cambia el valor de la constante. C++ incluye el signo ms por simetra con el operador
unario menos.
Veamos algunos ejemplos:
FUNDAMENTOS LECCIN 3
3-14
Ejemplo 3.1
Cul de los siguientes valores de clases int no es legal de acuerdo con la tabla 3.1?
a. +45
b. 45
c. 248
d. 0
e. 2.7182
f. 32,745
g. 32768
Solucin
Los valores en a, b, c y d son todos valores int legales en C++, porque todos ellos tienen
nmeros dentro del rango definido de int. Note que +45 y 45 son ambos representaciones
legales del valor entero 45.
Los valores e, f y g no son valores int legales en C++. El valor 2.7182 no es un entero. El
valor 32,745 es un entero dentro del rango predefinido, pero no es legal en C++, porque
contiene una coma. Las comas no se permiten como partes de valores numricos en C++.
Por ltimo, el valor 32768 no es un valor int legal en C++, porque est fuera del rango
predefinido int.
SUGERENCIA DE DEPURACIN
Est consciente especialmente de los lmites de rango de los enteros impuesto por C++ cuando realice clculos de enteros dentro de sus programas C++. Por ejemplo, multiplicando dos enteros puede fcilmente producir un resultado entero ms all de este rango, dando un resultado incorrecto. Esto se conoce como
estado de desbordamiento o sobreflujo (overflow). Dependiendo de dnde ocurra la condicin de desbord amiento, se puede o no generar un mensaje de error durante la compilacin o ejecucin del programa. Incluso
si ningn mensaje de error de desbordamiento es generado, la operacin siempre producir un resultado
incorrecto.
Ejemplo 3.2
Cul de las siguientes operaciones int generar una condicin de desbordamiento en
C++? (Use la tabla 3.1 para determinar el rango legal de int, suponga que el smbolo *
significa multiplicacin y el smbolo / significa divisin).
a.
b.
c.
31 * 1000
33 * 1000
(100 * 1000) / 5
a.
31 * 1000 = 31000 est dentro del rango predefinido int. No existe condicin de
desbordamiento.
33 * 1000 = 33000 est fuera del rango predefinido int. La condicin de desbordamiento dar un resultado entero incorrecto.
(100 * 1000) / 5 = 100000 / 5 = 20000. Aunque el resultado final est dentro del
rango predefinido int, ocurrir una condicin de desbordamiento generando un
resultado incorrecto. Por qu? Porque el resultado de la multiplicacin en el
numerador resulta un valor fuera del rango int.
Solucin
b.
c.
FUNDAMENTOS LECCIN 3
3-15
Los valores de datos de punto flotante incluyen todos los nmeros enteros as como cualquier valor entre todos los nmeros enteros que deben representarse usando el punto decimal. Ejemplos:
-5.56
2.7182
-5.0
Todos los valores anteriores se escribieron usando la notacin punto decimal fijo. La notacin de punto decimal fijo requiere un signo, seguido por un entero sin signo, seguido por
un punto decimal, seguido por otro entero sin signo.
CONSTANTES EN PUNTO FLOTANTE
C++ tambin ofrece una variedad de formas de escribir constantes en punto flotante. La sintaxis para construir una constante en punto flotante es:
Secuencia de uno o
ms dgitos
Secuencia de uno o
ms dgitos
Especificador de
tipo opcional
dgitos.dgitos [ f | F | l | L ]
Por ejemplo: 3.74, 2.7182, 48.00, .56, 0.27, son todas constantes en punto flotante
vlidas en C++. Para las constantes en punto flotante, la clase es siempre double, a no ser
que se especifique lo contrario. De forma similar a las constantes enteras, el tipo se puede
especificar utilizando las letras f, F, l y L como sufijo. Las letras f o F especifican que la
constante es de clase float; las letras l o L especifican que la constante es de clase long
double. Las clases de las siguientes constantes en punto flotante: 5.7f, 0.91L, 78.3F, 2003.1
son float, long double, float y long double.
C++ tambin ofrece la posibilidad de expresar constantes en punto flotante empleando notacin cientfica. Recuerde que en notacin cientfica, un nmero se expresa
como potencia de 10. El nmero 7.23 103 es un nmero en notacin cientfica. Este nmero se lee como 7 punto 23 por 10 elevado al 3. El nmero anterior es igual a 7230.0. La
forma general de un nmero en notacin cientfica es: mantisa 10 n. La sintaxis de C++
para representar nmeros en notacin cientfica es:
FUNDAMENTOS LECCIN 3
3-16
Secuencia de cero o
ms dgitos
Exponente
opcional
Especificador de
tipo opcional
digitos.digitos [ exponente ] [ f | F | l | L ]
Donde exponente es :
Comienza con e o E
Signo opcional
Uno o ms dgitos
( e | E ) [ + | - ] dgitos
0.65 10-4
9.5 1023
32.86 1012
en notacin cientfica estndar. El tipo de una constante en punto flotante se puede especificar utilizando los sufijos mencionados anteriormente. En el ejemplo anterior, puesto que
no hay ningn sufijo, todos los nmeros son de clase double. Las constantes:
1.23E10F
0.23E-4f
45.e+23L
26.68E12L
tienen los mismos valores que los nmeros expresados en notacin cientfica, pero los dos
primeros son de clase float y los dos segundos son de clase long double.
De forma anloga a lo que se describi sobre las constantes enteras, las constantes
en punto flotante no tienen signo. Una constante se puede hacer negativa aplicndola el
signo menos.
Veamos algunos ejemplos:
Ejemplo 3.3
Convierta los siguientes valores exponenciales a valores decimales fijos.
a.
b.
c.
d.
2.32e3
1.45e-6
-45.02e-4
-7.333e7
Solucin
a.
b.
FUNDAMENTOS LECCIN 3
3-17
c.
d.
Ejemplo 3.4
En comunicacin de datos, a menudo se ven cantidades expresadas con los prefijos de la tabla 3.2
Smbolo
Significado
pico
nano
micro
mili
kilo
mega
giga
p
n
m
k
M
G
10 -12
10 -9
10 -6
10 -3
10 +3
10 +6
10 +9
Solucin
a.
b.
Para expresar cada uno en formato decimal fijo, simplemente mueva el punto decimal
de acuerdo con el valor del exponente.
225 ps = 225e-12 segundos = 0.000000000225 segundos
1.3 kHz = 1.3e3 hertz = 1300.0 hertz
15 MHz = l5e6 hertz = 15000000.0 hertz
2.25 ms = 2.25e-3 segundos = 0.00225 segundos
27.3 s = 27.3e-6 segundos = 0.0000273 segundos
375 ns = 375e-9 segundos = 0.000000375 segundos
FUNDAMENTOS LECCIN 3
3-18
Ejemplo 3.5
C++ incluye algunas funciones estndar que pueden ser accesadas para realizar funciones
especficas. Una funcin estndar es una operacin predefinida que el compilador C++ reconoce y evala para dar un resultado.
Una de dichas funciones es la funcin sqrt() La funcin sqrt() se utiliza para buscar la raz
cuadrada de un nmero de punto flotante. Por ejemplo, la ejecucin de sqrt(2) regresar el
valor de 1.414. Por otra parte, una operacin no incluida como una funcin estndar es la
funcin square (al cuadrado). Deber escribir su propia funcin para realizar la operacin
al cuadrado. Dada la funcin estndar sqrt(), determine el resultado de las operaciones siguientes:
a.
b.
c.
sqrt(4.9)
sqrt(-75)
sqrt(49e-30)
Solucin
a.
b.
c.
sqrt(4.9) = 2.21
sqrt(-75) es imaginaria y genera un error en tiempo de ejecucin.
sqrt(49e-30) = 7e-15
Se preguntar si hay algn lmite prctico para el rango de valores de punto flotante
que se pueda usar en C++. As como con los enteros, C++ define diferentes clases de datos
de punto flotante con rangos de valores diferentes. El rango de valor es determinado por la
computadora y el compilador C++ que se utilice. Como ejemplo, la tabla 3.3 resume las
clases de punto flotante definidos para un compilador tpico C++.
Tabla 3.3. Clase punto flotante y rangos correspondientes en un compilador C++
Tipo de dato
float
Rango
3.4E-38 a 3.4E+38 y
-3.4E-38 a -3.4E+38
double
1.7E-308 a 1.7E+308 y
-1.7E-308 a -1.7E+308
long double
Tamao en bytes
10
3.4E-4932 a 1.1E+4932 y
-1.1E-4932 a 3.4E+4932
Ejemplos
2.35
-52.354
1.3e+10
12.354
-2.5e+100
-78.32544
8.5e-3000
A mayor rango de valor, mayor ser la precisin que se obtendr cuando se utilicen
valores de punto flotante. Sin embargo, como puede ver en la tabla 3.3, cuesta ms espacio
de memoria obtener una gran precisin cuando usa clases de punto flotante. La aplicacin
sugerir la precisin requerida y por lo tanto, la clase de punto flotante que deber utilizar.
Para la mayora de las aplicaciones, la clase float proporciona la precisin necesaria. Sin
embargo, muchos programadores prefieren usar la clase double para asegurar una precisin
adecuada.
C++ proporciona las operaciones aritmticas usuales sobre tipos de datos en punto
flotante, as como operaciones de comparacin.
FUNDAMENTOS LECCIN 3
3-19
CLASE CARCTER
Todos los smbolos del teclado de su computadora son caracteres: los alfabticos
minsculas y maysculas, los de puntuacin, los nmeros, las teclas de control, y los
correspondientes a smbolos especiales. La mayora de los compiladores C++ emplean la
serie de caracteres del American Standard Code for Information Interchange (ASCII) que
se muestra en la tabla 3.4.
Como puede ver en la tabla 3.4, cada carcter tiene un cdigo de representacin
numrico nico. Para que la CPU trabaje con datos de carcter, los caracteres individuales
deben ser convertidos a cdigo numrico. Cuando presiona un carcter sobre el teclado, la
CPU observa la representacin numrica de ese carcter, no el carcter mismo. La tabla
3.4 proporciona equivalentes decimales de los caracteres ASCII.
Ejemplo 3.6
C++ incluye una funcin estndar llamada toascii( ). Esta funcin se usa para generar o
regresar, la representacin numrica para cualquier carcter. Determine el resultado de
las siguientes operaciones usando la tabla 3.4.
a.
b.
c.
d.
e.
toascii(
toascii(
toascii(
toascii(
toascii(
A)
Z)
a)
z)
#)
Solucin
Con el uso de la tabla 3.4, obtendr lo siguiente:
a.
b.
c.
d.
e.
toascii(
toascii(
toascii(
toascii(
toascii(
A ) = 65
Z ) = 90
a ) = 97
z ) = 122
# ) = 35
El ejemplo anterior seala algunas caractersticas de la clase carcter. Primero, cada carcter tiene una representacin numrica nica dentro de la computadora. Debido a que
para cada uno hay una representacin numrica nica, los caracteres estn ordenados. Esta es la razn del porque se clasifican como escalares. Por ejemplo, A < Z , porque la representacin numrica para A (65) es menor que la representacin numrica para Z
(90). De igual manera, # < a < z , ya que 35 < 97 < 122. Observe que cuando se especifica un carcter, se encierra en comillas simples como stas: a . Esto lo requiere el compilador C++.
FUNDAMENTOS LECCIN 3
3-20
Char
^@ NUL
^A SOH
^B STX
^C ETX
^D EOT
^ E ENQ
^F ACK
^G BEL
^H BS
^I HT
^J LF
^K VT
^L FF
^M CR
^N SO
^O SI
^P DLE
^Q DC1
^R DC2
^S DC3
^T DC4
^U NAK
^V SYN
^W ETB
^X CAN
^Y EM
^Z SUB
^[ ESC
^\ FS
^] GS
^^ RS
^ -- US
Dec
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Char
SPC
!
#
$
%
&
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
Dec
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Char
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
--
Dec
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
Char
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
Recuerde que hay diferentes clases de enteros y valores de punto flotante definidos
por el compilador C++. Estas diferentes clases definen el rango de valores que son legales
para una clase dada. Lo mismo es cierto para los caracteres. Hay tres diferentes clases de
caracteres definidos por C++: char, signed char, y unsigned char, ambos se muestran en
la tabla 3.5.
Tabla 3.5. Clase carcter y rangos en C++
Tipo de dato
Char
signed char
unsigned char
FUNDAMENTOS LECCIN 3
Tamao en bytes
1
1
1
Rango
-128 a 127
-128 a 127
0 a 255
Ejemplos
A, !
23
200, 0x1A
3-21
La clase char permite todos los caracteres ASCII mostrados en la tabla 3.4. La clase unsigned char tambin permite todos los caracteres ASCII mostrados en la tabla 3.4
pero, adems, le permite una serie de caracteres extendidos como los definidos por la PC
de IBM. (Si requiere conocer la serie de caracteres extendidos vea la documentacin de su
PC). La aplicacin sugerir qu tipo de carcter usar. La clase char es suficiente para la
mayora de las aplicaciones en estas lecciones.
Los caracteres se almacenan en la computadora como valores enteros, de manera
que podr realizar operaciones aritmticas sobre los datos de clase carcter. Por ejemplo,
podr adicionar 1 al carcter A y obtener el carcter B . ste es un ejemplo de la flexibilidad del lenguaje C++; sin embargo, con esta flexibilidad existe mayor responsabilidad.
Otros lenguajes, como Pascal, no le permiten realizar operaciones aritmticas de caracteres.
PRECAUCIN
C++ le permitir realizar operaciones aritmticas con datos de caracteres. Sin embargo, tenga cuidado porque algunas veces los resultados pueden ser difciles de predecir. Qu se obtendr cuando adicione
un carcter A al carcter B o cuando multiplique estos dos caracteres?
CADENA DE CARACTERES
Una cadena (string) es simplemente una coleccin de caracteres. Ejemplos de cadenas son su nombre, direccin y nmero de telfono, as como la oracin que est leye ndo ahora. Cuando opera con cadenas, debe recordar que todava est operando con caracteres individuales.
La figura 3.4 muestra cmo C++ almacena las cadenas en la memoria. Como puede ver, cada carcter individual se coloca en una celda de memoria de 1 byte. La coleccin
de celdas que tienen la cadena se llama arreglo (array). Estudiaremos los arreglos con
ms detalle en otra leccin. Por ahora slo es importante que comprenda cmo se usan
para almacenar datos cadena.
Las celdas individuales en el arreglo se identifican por un nmero que indica su posicin, empezando por la [0]. La ltima posicin en el arreglo cadena siempre contiene el
carcter \0 para terminar la cadena. Este carcter \0 se conoce con el nombre de carcter
de terminacin nulo o simplemente carcter nulo. El carcter nulo le dice a C++ dnde
finaliza la cadena en la memoria.
Como se observa en la figura 3.4, el carcter C se localiza en la posicin [0] del
arreglo y el carcter nulo se localiza en la posicin [3] del arreglo. Observe que el arreglo requiere cuatro celdas para almacenar una cadena de tres caracteres debido al requerimiento del carcter nulo.
C
[0]
+
[1]
+
[2]
\0
[3]
Figura 3.4. C++ almacena cadenas de caracteres en arreglos que finalizan con un carcter
nulo.
FUNDAMENTOS LECCIN 3
3-22
Las cadenas C++ siempre se encierran en dobles comillas, como stas: "C++".
Recuerde que los caracteres individuales se encierran en comillas sencillas. As a , denota un carcter individual, mientras "a" significa una cadena de un carcter.
Ejemplo 3.7
De acuerdo con las siguientes cadenas, determine cuntos bytes se requieren para guardar cada
cadena y muestre cmo aparecern en la memoria.
a.
b.
c.
Solucin
a.
b.
c.
Esta cadena necesita 29 bytes de almacenamiento. El arreglo de la cadena correspondiente se muestra en la figura 3.5a.
Esta cadena necesita 2 bytes de almacenamiento. El arreglo de la cadena correspondiente se muestra en la figura 3.5b.
Esta cadena necesita 5 bytes de almacenamiento. El arreglo de la cadena correspondiente se muestra en la figura 3.5c.
E
[0] [1]
[2]
[3]
[4]
[5]
[6]
[7] [8]
\0
[18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28]
(a)
w
\0
(b)
4
\0
(c)
Figura 3.5. Soluciones para el ejemplo 3.7.
SUGERENCIAS DE PROGRAMACIN
Las dobles comillas que encierran un nmero, como "4321", indican una cadena de caracteres y no
datos numricos. De hecho, la cadena "4321" requiere 5 bytes de almacenamiento, mientras que int 4321
requiere nicamente 2 bytes. Adems, las operaciones aritmticas no pueden realizarse con la cadena
"4321". Por estas razones, los datos numricos deben representarse usando una clase numrica y no la
clase carcter.
FUNDAMENTOS LECCIN 3
3-23
Nombre ASCII
Nueva lnea
Tabulador horizontal
Tabulador vertical
Retroceso (backspace)
Alimentacin de pgina
Alerta o pitido
Retorno de carro
Barra invertida (backslash)
Comilla simple
Comillas dobles
Signo de interrogacin
NL
HT
VT
BS
FF
BEL
CR
\
\n
\t
\v
\b
\f
\a
\r
\\
\
\"
\?
"
?
FUNDAMENTOS LECCIN 3
3-24
\xhh
\6
\177
\x1b
x6
\x7f
Los caracteres:
FUNDAMENTOS LECCIN 3
3-25
Los valores de los objetos variable se almacenan en la memoria principal de trabajo para despus ser usados dentro de un programa. Cada objeto variable tiene un nombre
simblico que localiza su valor en memoria. Esta idea se muestra en la figura 3.6. El contenido de la memoria localizado por los smbolos x, y, y contador puede cambiar durante
la ejecucin del programa. Como consecuencia, estos smbolos se conocen como objetos
variables.
FUNDAMENTOS LECCIN 3
3-26
Figura 3.6. Cada objeto variable tiene un nombre simblico que localiza su valor en memoria.
x1
puntuacion
datos
puntuacionMedia
temp
num_intentos
caliente?
$al
A#
Los nombres son sensibles a las maysculas y minsculas; esto es, para que dos
nombres sean iguales, deben deletrearse de la misma forma, incluyendo si las letras son
maysculas o minsculas. Por ejemplo los nombres: numDeIntentos y numdeIntentos son
diferentes debido a que el primero emplea una d mayscula y el segundo una minscula.
Una cuestin interesante es la longitud que puede tener un nombre. La definicin
de C++ no impone ningn lmite a la longitud de un nombre. Sin embargo, algunas implementaciones de C++ son deficientes en esta rea y slo pueden utilizar los primeros n
FUNDAMENTOS LECCIN 3
3-27
Algunas palabras son reservadas como parte del lenguaje y no pueden ser utilizadas por el programador para nombrar objetos. Estos nombres especiales se denominan palabras reservadas. La tabla 3.6 lista las palabras reservada de C++.
Las palabras reservadas tienen un significado especial para el compilador y no pueden ser cambiadas por el programador. Ya se han tratado algunas de estas palabras reservadas: short, int, long, float, double, bool y char son clases fundamentales de C++. A
medida que profundice en el estudio de C++ aprender el significado del resto de las palabras reservadas.
Tabla 3.6. Palabras reservadas en C++
asm
else
auto
enum
operator
private
throw
true
bool
explicit
protected
try
break
case
extern
false
public
register
typedef
typeid
catch
char
float
for
reinterpret_cast
return
typename
union
class
friend
short
unsigned
const
const_cast
goto
if
signed
sizeof
using
virtual
continue
default
inline
int
static
static_cast
void
volatile
delete
long
struct
wchart_t
do
double
mutable
namespace
switch
template
while
dynamic_cast
new
this
Recuerde que los nombres son sensibles a las maysculas y minsculas y, por definicin, las palabras reservadas constan nicamente de letras minsculas. As, las cadenas
de caracteres: Continue, Do, Char, no son palabras reservadas.
FUNDAMENTOS LECCIN 3
3-28
IDENTIFICADORES
Un identificador es un nombre definido y con significado, dado por el programador. La regla para construir un identificador vlido es que debe ser un nombre vlido en
C++ y no puede ser una palabra reservada. Ejemplos de identificadores vlidos en C++
son:
impuesto
precio
flujo
primer_valor
tmp
Una buena prctica de programacin consiste en elegir identificadores que connoten el propsito del objeto que se esta nombrando. Por ejemplo, suponga que est escribiendo un programa que calcula y almacena el nmero de estudiantes de una clase. Se podra elegir el identificador e para nombrar el objeto que almacenar el nmero de estudia ntes de la clase, pero este identificador no es muy descriptivo. En el otro extremo, se podra
elegir numero_de_estudiante_de_la_clase, pero este identificador podra ser tedioso de
escribir. Normalmente, hay un trmino medio. El identificador: numEstudiantes, es mucho ms corto y bastante claro. En estas lecciones, se adoptarn varias convenciones para
escoger y construir los identificadores a utilizar para nombrar objetos. En primer lugar se
intentar utilizar palabras nicas como identificadores. Sin embargo, cuando se ut ilicen
identificadores construidos por dos o ms palabras con el propsito de que sea claro, se
seguir la convencin de escribir en mayscula la primera letra a partir de la segunda palabra. As, por ejemplo, se podran utilizar los siguientes identificadores:
contadorPalabras
tiempo
bitsPorSegundo
periodoTiempo
numEmpleados
cntPalabra
Cuando surja la necesidad, a medida que se desarrollen otros programas, se introducirn nuevas convenciones de nombrado.
Uso de subrayados
Aunque C++ permite el uso del carcter de subrayado al comienzo de los nombres, su uso debera evitarse. Los identificadores que comienzan con dos caracteres de
subrayado se reservan para ser utilizados por el compilador de C++. De igual forma,
los nombres que comienzan con un nico subrayado deberan evitarse, ya que son reservados por algunos compiladores de C para nombrar las rutinas del sistema operativo. Algunas implementaciones de C++ utilizan bibliotecas de C.
DECLARACIN DE OBJETO CONSTANTE VERSUS DEFINICIN DE OBJETO VARIABLE
Los objetos constante y variable que se van a usar en un programa C++ se deben
declarar o definir antes de que se utilicen en el programa. La razn por la que debemos
declarar constantes y definir variables en un lenguaje es doble. Primero, el compilador
debe conocer el valor de una constante antes de utilizarla y debe reservar las localizaciones
FUNDAMENTOS LECCIN 3
3-29
de memoria para almacenar las variables. Segundo, el compilador debe conocer las clases
de las constantes y variables para saber los atributos y comportamiento de tales objetos.
Las palabras definir y declarar se usan a menudo en forma equivalente cuando se
utilizan en los lenguajes de programacin. En realidad, una declaracin especifica el
nombre y los atributos de un valor, pero no reserva almacenaje. Por otro lado, una definicin es una declaracin que tambin reserva almacenaje. sta es la razn por la que declaramos objetos constante y definimos objetos variable en C++.
Una definicin introduce el nombre del objeto en el programa y especifica la clase
del objeto. Una forma comn de una definicin en C++ es:
Una clase conocida
donde clase es una clase fundamental o una clase que ha sido previamente definido por el
programador, e id es un identificador en C++. La definicin:
int suma;
define un objeto denominado suma que es de clase int y que no tiene valor inicial; Esto es,
el objeto tiene un nombre y tiene memoria asignada, pero no tiene un valor inicial dado.
Otros ejemplos de esta forma de definicin son:
int x;
int cntPalabras, radio, altura;
float tiempoDeVuelo, kilometraje, velocidad;
La definicin:
int suma = 0;
es equivalente a la primera definicin, pero inicia liza suma a cero. Otros ejemplos de este
tipo de definicin son:
float impuesto = 0.06;
char letra = a ;
FUNDAMENTOS LECCIN 3
3-30
Se pueden definir e iniciar varios objetos en una nica sentencia. Por ejemplo:
int cont = 0, bits = 16, grande = -1;
declara tres objetos, todos ellos de clase int: cont con valor inicial 0, bits con valor inicial
16 y grande con valor inicial -1.
Las dos formas de definicin que se han presentado se pueden emplear juntas. La
siguiente definicin de C++
int i, j = 4, k, l = 10;
crea cuatro objetos de clase int: i, j, k y l. Los objetos i y k no tienen valor inicial, mientras
que j y l se inician con valores 4 y 10, respectivamente.
A continuacin haremos un estudio ms a detalle de lo antes expuesto:
FORMATO DE DECLARACIN DE UNA CONSTANTE
Para declarar un objeto constante, se debe usar la palabra reservada const, como
sigue.
const <clase> <identificador del objeto> = <valor constante>;
Solucin
Para usar el formato dado con anterioridad, el precio de la estampilla y su impuesto podran declararse como sigue:
const float ESTAMPILLA
const float TASA_IMPUESTO
FUNDAMENTOS LECCIN 3
= 0.50;
= 0.07;
3-31
Con estas declaraciones, puede simplemente usar las palabras ESTAMPILLA y TASA_IMPUESTO cuando realice los clculos dentro del programa. Por ejemplo, para calcular el impuesto de un artculo que cuesta $100 puede escribir la expresin:
impuestoVentas = 100 * TASA_IMPUESTO;
Cuando el programa se compila, el compilador simplemente sustituye el valor
constante 0.07 por el identificador TASA_IMPUESTO.
Qu hay de la palabra impuestoVentas en esta expresin? Es un objeto constante o variable? Es un objeto variable, porque su valor cambiar dependiendo del precio de venta
del artculo. Qu clase de datos debe ser impuestoVentas? En otras palabras, qu clase
de datos se generan como resultado de la operacin: entero, punto flotante o carcter?
Punto flotante, porque impuestoVentas a menudo da como resultado un valor decimal. As,
impuestoVentas se debe definir como un objeto variable de punto flotante.
SUGERENCIA DE ESTILO
Se sugiere que codifique los identificadores constantes en maysculas para que puedan identificarse
fcilmente como constantes dentro de su programa. De igual manera, se sugiere que codifique los identificadores variables en minsculas. Si el identificador de una variable esta formado por palabras compuestas, se
sugiere que todas las letras estn en minsculas a excepcin de la primera letra de cada palabra, a partir de
la segunda, las cuales deben de estar en maysculas.
Observe en el ejemplo 3.8 que el identificador constante TASA_IMPUESTO consta de dos palabras, TASA e IMPUESTO. El compilador C++ no le permite separar identificadores de varias palabras usando espacios, por eso, se ha elegido separar las dos palabras
con el smbolo guin bajo o subrayado ( _ ). Tambin observe que el identificador de objeto variable impuestoVentas consta de dos palabras (las dos palabras van juntas y en minsculas, con la primera letra de la segunda palabra en mayscula). Estas dos tcnicas se utilizarn a lo largo de estas lecciones cua ndo se usen identificadores de varias palabras.
Probablemente se preguntar por qu debemos declarar constantes usando identificadores. Por qu no slo se inserta el valor constante dentro de la expresin cuando sea
necesario?, as:
impuestoVentas = 100 * 0.07;
Como los precios de las estampillas y las tasas de impuestos de las ventas cambian.
Estos tipos de constantes no son constantes siempre. As, cuando use constantes como
stas, que estn sujetas a cambio en el futuro, es ms fcil declararlas al principio del programa. Si posteriorme nte se necesitan modificar, slo tiene que hacer un simple cambio en
su programa. De otra manera, debe cambiarlas en cada lugar donde se usa la constante
dentro del programa.
FORMATO DE DECLARACIN DE OBJETO CONSTANTE DE CADENA
Recuerde que una cadena en C++ se forma con un arreglo de caracteres. Por lo
tanto, para declarar un objeto constante de cadena, deber aplicar la clase char para un
identificador de cadena, usando el siguiente formato:
FUNDAMENTOS LECCIN 3
3-32
Como puede ver, las dos palabras reservadas const y char son seguidas por un
identificador de la cadena. Una serie de corchetes vacos debe seguir al identificador para
denotar un arreglo. Los corchetes son seguidos por un signo igual que, a su vez, es seguido
por un valor de cadena encerrado entre comillas. Por ltimo, un punto y coma para terminar la declaracin. Veamos un ejemplo para ilustrar la idea.
Ejemplo 3.9
Defina tres constantes que puedan usarse para representar su nombre, direccin y nmero
telefnico.
Solucin
Con el uso de la palabra reservada const, las declaraciones apropiadas pueden ser:
const char NOMBRE[ ]
const char DIRECCION[ ]
const char NUMERO_TELEFONO[ ]
Cuando se compila una cadena constante, se crea un arreglo con un byte por cada carcter
en el arreglo, ms un byte final para el carcter nulo. Por lo tanto, la constante NOMBRE
en el ejemplo 3.9 ocupar 29 bytes de cdigo de programa por cada lugar en que aparezca
en el programa. Cuente los caracteres y aada uno para el terminador nulo para saber si
est de acuerdo. Recuerde que los espacios y los signos de puntuacin se deben contar como caracteres.
Probablemente se preguntar cmo y dnde se usan las constantes de cadena. Un uso comn es representar informacin que debe imprimirse a menudo, tal como una informacin
de encabezado. Por ejemplo, cada vez que necesita imprimir su nombre en un reporte, debe
simplemente insertar una instruccin dentro del programa para imprimir el identificador
constante NOMBRE.
FORMATO DE DEFINICIN DE OBJETO VARIABLE
Antes de poder utilizar una variable en un programa C++, sta deber definirse.
Cuando define un objeto variable, el compilador reserva un lugar dentro de la memoria de
la computadora para el valor de la variable. Para legibilidad y claridad del programa, los
objetos variable deben definirse al inicio de sus programas C++. Sin embargo, C++ le
permite definir una variable en cualquier lugar siempre y cuando sea definida antes de
usarse. Para definir un objeto variable, debe especificar su clase, su nombre y un valor de
inicializacin opcional. ste es el formato:
<clase> <identificador de objeto variable>;
<clase> <identificador de objeto variable> = <valor de inicializacin opcional>;
<clase> <identificador de objeto variable1> [=valor inicial1], identificador de objeto variable2[=valor inicial2], ...;
Los formatos anteriores indican que primero se especifique la clase variable, despus el identificador de objeto variable o nombre. Es posible terminar la definicin con un
punto y coma o puede adicionar un smbolo opcional de igual, =, seguido por un valor, y
despus el punto y coma para terminar la definicin.
FUNDAMENTOS LECCIN 3
3-33
El fragmento del programa siguiente declara tres variables utilizando las clases int,
float y long:
#include <iostream.h>
void main(void)
{
int
calificaciones;
float
salario;
long int distancia;
}//Fin de main()
Cuando declara mas de una variable de la misma clase, C++ le permite separar los
nombres de las variables mediante comas, el siguiente enunciado, por ejemplo, declara tres
variables de punto flotante:
float
NOTA DE PROGRAMACIN
Es una prctica recomendable inicializar las variables cuando se definen. Cuando no se inicializa
una variable, su valor inicial ser un valor arbitrario de la memoria. Por lo general, variables numricas se
inicializan con el valor 0 o 1 y variables de carcter se inicializan con el carcter espacio. Las cadenas
(arreglos de caracteres) deben inicializarse con terminadores nulos.
Ejemplo 3.10
Hay una relacin simple en electrnica, llamada la ley de Ohm, que le permite encontrar
ya sea el voltaje, la corriente o la resistencia, conocidas las otras dos cantidades. La ley de
Ohm dice que el voltaje es igual al producto de la resistencia por la corriente. En smbolos,
V =C R
donde:
V es el voltaje en volts.
C es la corriente, en amperes.
R es la resistencia, en ohms.
Suponga que debe escribir un programa C++ para calcular el voltaje usando la ley de
Ohm. Defina los tres objetos variable (V, C y R) que se usarn en el programa para realizar los clculos.
Solucin
Los identificadores objeto variable son V, C y R. Ahora, la pregunta es: a qu clase pertenecen estos objetos variable? Se sabe que V, C y R se usarn para representar datos numricos, as la decisin de sus clases se reduce a entero o punto flotante. Si define V, C y R
como enteros, se encontrar limitado a usar valores de nmeros enteros para estas variables dentro de su programa; sin embargo, esto crea un problema porque los valores de voltaje, corriente y resistencia a menudo son valores decimales. As que vamos a definirlos
como objetos de punto flotante:
FUNDAMENTOS LECCIN 3
3-34
float V = 0.0;
float C = 0.0;
float R = 0.0;
Observe que cada variable se define como un objeto de punto flotante y se inicializa con el
valor 0.0. Por supuesto, dado que son objetos variable, sus valores cambiarn durante la
ejecucin del programa.
Ejemplo 3.11
Deber escribir un programa para calcular el impuesto de un artculo vendido con una tasa de impuesto de ventas de 7 %. Declare los objetos constante apropiados y defina los objetos variable necesarios.
Solucin
Primero, debe decidir qu identificadores usar. Siempre use identificadores con palabras
que mejor describan la relacin constante o variable. Emplearemos la palabra impuestoVentas para identificar el clculo resultante, la palabra precio para identificar el costo del
artculo y la palabra TASA_IMPUESTO para identificar la tasa de impuesto de ventas. As
que, con el uso de estos identificadores, los clculos de impuestos de ventas debern ser:
impuestoVentas = precio * TASA_IMPUESTO;
Ahora, la pregunta es: qu objetos son constantes y cules son variables? Obviamente los
objetos precio e impuestoVentas son variables, porque cambiarn dependiendo del costo
del artculo. Sin embargo, TASA_IMPUESTO es un objeto constante, sin importar el costo
del artculo. As que, definiremos a precio e impuestoVentas como objetos variable y TASA_IMPUESTO como un objeto constante:
const float TASA_IMPUESTO
float impuestoVentas
float precio
= 0.07;
= 0.0;
= 0.0;
Observe que ambos objetos variable se definen de punto flotante, porque ambos sern valores decimales. Suponga que defini la tasa de impuesto como un objeto variable ms que
como un objeto constante y que lo inicializ con el valor 0.07, as:
float tasaImpuesto = 0.07;
No hay problema con esta definicin. El compilador reservar almacenamiento para el objeto variable tasaImpuesto y coloca el valor inicial de 0.07 en una localidad de memoria.
Sin embargo, el programa puede cambiar el valor de tasaImpuesto, mientras que no podra
modificarlo si se declarara como objeto constante.
SUGERENCIA DE ESTILO
La mayora de los compiladores C++ permiten identificadores o nombres, que tengan cualquier longitud, siempre y cuando los primeros 32 caracteres sean significativos. Por lo tanto, sus programas sern
mucho ms legibles y se documentarn por ellos mismos si usa palabras, ms que letras y smbolos, para
representar objetos variable. Por ejemplo, la definicin de los objetos variable en el ejemplo 3.10 sera mucho ms legible para un usuario no tcnico si se hubieran definido voltaje, corriente y resistencia de este
modo:
float voltaje
FUNDAMENTOS LECCIN 3
= 0.0;
3-35
Observe el uso del smbolo, =, en esta ecuacin. Es la forma para asignar cantidades en C++, por esta razn se le conoce con el nombre de operador de asignacin, ejemplos:
edad
= 32;
salario
= 25000.75;
distanciaLuna = 238857;
Nota:
Observe el uso de punto y coma al final del enunciado. Las cantidades no deben de llevar
los separadores de millares (la coma).
Ejemplo 3.12
Seleccione un nombre apropiado y defina un objeto variable que pueda usarse para representar los das de la semana. Suponga que los das de la semana se representan por la primera letra de cada da.
Solucin
Vamos a seleccionar un identificador variable significativo, como diasSemana. Ahora, debido a que los das de la semana se representarn con la primera letra de cada da, el obje-
FUNDAMENTOS LECCIN 3
3-36
to debe ser de clase carcter. Cuando se definen objetos carcter, se utiliza la palabra reservada char en la definicin del objeto, como sigue:
char diasSemana;
Hay algn problema en la definicin del ejemplo 3.12? No hay errores de sintaxis y es
perfectamente legal en lo que respecta a C++. Pero hay algn problema asociado con el
uso de este objeto? Un objeto carcter est limitado para representar un carcter sencillo
en un momento determinado. Esto es porque cada da de la semana se debe representar por
una sola letra. Sin embargo, el uso de la primera letra de cada da crea un problema. Una
M representa Martes o Mircoles? La solucin a este dilema se encuentra en los objetos
variable cadena.
FORMATO DE DEFINICIN DE UN OBJETO VARIABLE DE CADENA SIN UN VALOR INICIAL
Solucin
Para representar cualquier nmero de caracteres consecutivos es posible usar un objeto
cadena. Definamos diasSemana como un objeto cadena de la siguiente manera:
FUNDAMENTOS LECCIN 3
3-37
char diasSemana[10];
Con esta definicin, del objeto diasSemana se puede representar el da completo de la semana (Lunes, Martes, Mircoles, etc.) Por qu seleccionar 10 como la longitud mxima de
la cadena? Porque la palabra ms larga del da de la semana es Mircoles, la cual consta
de 9 caracteres. Sin embargo, se deber dejar espacio para el carcter terminador nulo,
haciendo el tamao de la cadena de 10.
Es posible inicializar el objeto cadena para Mircoles con la siguiente definicin:
char diasSemana[ ] = "Mircoles";
Con esta definicin, la cadena "Mircoles" se almacena en memoria y se localiza por medio del identificador diasSemana. El compilador automticamente inserta el carcter nulo
despus del ltimo carcter, s .
Ejemplo 3.14
Suponga que deber escribir un programa en C++ para pedir al usuario del programa que
ingrese su nombre, direccin y nmero telefnico. Seleccione los identificadores de cadena
apropiados y defina tres objetos cadena para representar esta informacin.
Solucin
Vamos a llamar a los objetos nombre, direccion y numeroTelefonico respectivamente.
Ahora, deber decidir la longitud mxima de cada objeto cadena. No olvide incluir los espacios, smbolos especiales y el carcter de terminador nulo. Supongamos que una longitud
de 31 ser suficiente para nombre, 31 para direccion y 14 para numeroTelefonico. Si no
est seguro, es mejor sobrestimar, ms que subestimar la longitud. Al utilizar los identificadores de los objetos y las longitudes de las cadenas anteriores, la definicin apropiada es:
char nombre[31]
char direccion[31]
char numeroTelefonico[14]
= " \0";
= "\0";
= "\0";
Observe que cada objeto cadena se inicializa con una cadena de terminador nulo. Los valores cadena deben cambiarse dentro del programa y posteriormente mostrarse en el monitor.
OBJETOS BOOLEANOS
Como ya se mencion, las variables booleanas se usan a menudo dentro de un programa para propsitos de toma de decisiones. Un compilador que cuenta con el ANSI C++
estndar contiene la clase booleana estndar, llamada bool, la cual contiene los elementos
true y false. Los objetos booleanos se definen de igual manera que cualquier otro objeto.
A continuacin se muestra un ejemplo con esta idea.
Ejemplo 3.15
Defina un objeto booleano llamado bandera para utilizarlo en una operacin de toma de
decisiones. inicialice el objeto con un valor booleano false.
FUNDAMENTOS LECCIN 3
3-38
Solucin
Las variables booleanas suelen ser tiles en la toma de decisiones. Una variable booleana,
conocida como bandera, se puede definir para este propsito como sigue:
bool bandera = false;
Con esta definicin, la variable bandera se puede usar en un programa tomando uno de los
valores: true o false conforme lo necesite la lgica del programa. Si su compilador no
cuenta con el estndar ANSI C++, deber definir objetos booleanos usando la clase enumerada. La clase enumerada y sus objetos son tema de la seccin que hemos llamado clase
enumerada y sus objetos.
Ejemplo 3.16
Finalmente veamos algunos ejemplos en que se muestren definiciones de objetos variable utilizando
los modificadores de tipo:
unsigned int inventario;
register int contador;
long int numeroGrande;
long int segundosMes;
long int gananciasCompania;
short int clave;
short int numeroPequeno;
signed char valorByte;
signed char seleccionMenu;
Combinando modificadores:
unsigned long int numeroGrande;
unsigned long int deudaNacional;
register unsigned bandera;
EXPRESIONES
EXPRESIONES
Recuerde que un objeto es un conjunto de atributos o valores y las operaciones que
se pueden realizar sobre ellos. Una expresin es un mecanismo de C++ que permite aplicar
operaciones a los objetos. Conceptualmente, una expresin es un medio por el cual se calculan nuevos objetos a partir de otros. Los objetos o valores sobre los que se opera se denominan operandos. El proceso de aplicar una operacin a unos operandos se conoce como
evaluacin de la expresin. La evaluacin de una expresin produce un resultado que tiene
un tipo, as como un valor.
FUNDAMENTOS LECCIN 3
3-39
EXPRESIONES SIMPLES
El punto y coma despus de cada expresi n es el delimitador que emplea C++ para
separar o terminar una expresin.
Una expresin tambin puede ser un objeto sin ninguna operacin aplicada. El resultado de evaluar este tipo de expresiones es el valor del objeto. Por ejemplo:
int coordenadaX = 23;
coordenadaX;
OPERACIONES ARITMETICAS BINARIAS
C++ tiene varios operadores para realizar operaciones aritmticas sobre datos enteros y de punto flotante. El trmino binario indica que el operador se aplica a dos operandos. Debido a que las reglas de C++ para realizar operaciones binarias son algo complicadas, se van a considerar primero las operaciones binarias que se aplican a valores enteros.
Posteriormente, se considerarn expresiones que involucran operadores binarios aplicados a
valores en punto flotante. Finalmente veremos cmo maneja C++ las expresiones que involucran valores de clase entero y en punto flotante.
Los operadores aritmticos binarios que se aplican a enteros se listan en la tabla 3.7.
Todos los ejemplos utilizan el tipo int. Como se muestra en la tabla, estos operadores, en su
mayor parte, hacen justo lo que se piensa que deberan hacer.
Tabla 3.7. Operadores binarios de aritmtica entera
OPERACION
OPERADOR
Suma
Resta
Multiplicacin
Divisin
Residuo o Mdulo
FUNDAMENTOS LECCIN 3
EJEMPLO
2 + 3;
5 + 10
13 4;
4 7;
3 * 4;
5 * 11;
8 / 2;
6 / 4;
11 / 4;
4 / 5;
6 / 0;
10 % 3;
23 % 4;
5 % 0;
RESULTADO
< 5, int >
< 15, int >
< 9, int >
< -3, int >
< 12, int >
< 55, int >
< 4, int >
< 1, int >
< 2, int >
< 0, int >
< indefinido, int >
< 1, int >
< 3, int >
< indefinido, int >
3-40
son -5 y -6. Dependiendo del compilador y de la computadora, se puede obtener uno de los
siguientes resultados: < -5, int > o < -6, int > (la respuesta es -5 o -6 entero)
Finalmente, hay un caso que merece especial atencin. Si el divisor es cero, el resultado de la divisin es indefinido. De hecho, en la mayora de las computadoras, dividir entre cero provoca que el programa se pare con un mensaje de error.
Muy relacionado con la divisin se encuentra el operador %, que obtiene como resultado el residuo de la divisin. Este operador tambin se conoce como operador mdulo.
Debido a que el operador mdulo normalmente se implementa utilizando la instruccin de
divisin que ofrece la computadora, comparte muchas caractersticas con el operador de
divisin. En primer lugar, si el operador de la derecha es cero, el resultado de la operacin
es indefinido. En segundo lugar, si el operando es negativo y el resultado es distinto de cero
(es decir, hay un residuo), el valor del resultado depender de cmo realiza la divisin la
computadora en uso. Siempre se da el caso de que la expresin:
(a /b )* b + a %b
es igual a a si b es distinto de 0. As, por ejemplo, si 7 / -2 es igual a < -4, int >, la expresin 7 % -2 debe producir < -1, int >. Por otra parte, si la expresin 7 / -2 obtiene el resultado < -3, int >, el operador resto debe obtener el resultado < 1, int >.
Todos los operadores binarios aplicados a enteros tienen la capacidad de obtener un
valor que sea mayor del que la computadora en uso pueda manejar. Esta situacin se denomina desbordamiento o sobreflujo. Si una operacin aritmtica entera provoca un desbordamiento, el valor producido por la operacin es indefinido y el funcio namiento del programa es impredecible.
Antes hemos visto que C++ tiene seis clases de enteros, para nuestro ejemplo, solo
trataremos con tres clases de enteros: short, int y long, as como la clase char. Hasta el
momento se ha asumido que los operandos son todos de clase int, Cmo se realizan las
operaciones aritmticas sobre los otras clases de enteros? Por ejemplo, es la suma de dos
valores de clase long diferente a la suma de dos valores de clase int? Qu ocurre si un va-
FUNDAMENTOS LECCIN 3
3-41
lor es de clase int y el otro de clase long? Con cuatro tipos, hay 10 posibilidades diferentes
de suma.
Para reducir el nmero de casos que se debe manejar, C++ define un conjunto de
conversiones que se aplican a los operandos antes de realizar cualquier operacin. Estas
conversione s se denominan conversiones de tipo o conversiones unarias usuales. Las conversiones unarias usuales especifican que los valores de clase char y short deben convertirse a clase int antes de realizar cualquier operacin sobre ellos. Si los operandos son de la
misma clase, no se realiza ninguna conversin, y el resultado ser de la misma clase que los
operandos. Si los operandos son de clases diferentes: clase int y clase long, entonces el
operando de clase int se convierte a long, se realiza una operacin de clase long y el resultado ser de clase long.
Todo esto puede parecer un poco complicado, pero, realmente, no es difcil. Solamente recuerde que el resultado es siempre de clase int, a no ser que uno de los operandos
sea de clase long; en este caso, el resultado es de clase long. Esta regla se resume en la tabla 3.8.
Tabla 3.8. Tipos de resultado para las operaciones binarias enteras
Ti po de operando izquierdo
short
int
long
char
int
int
int
long
short
int
int
int
long
int
int
int
int
long
long
long
long
long
long
OPERADOR
Suma
Resta
Multiplicacin
Divisin
FUNDAMENTOS LECCIN 3
EJEMPLO
2.0 +.3 3;
5.1 + 10.0
13.6 4.2;
4.0 7.0;
3.0 * 4.4;
7.5 * 11.0;
8.6 / 2.0;
5.0 / 4.0;
-11.0 / 4.0;
6.0 / 0.0;
RESULTADO
< 2.33, double >
< 15.1, double >
< 9.4, double >
< -3.0, double >
< 13.2, double >
< 82.5, double >
< 4.3, double >
< 1.25, double >
< -2.75, double >
< indefinido, double >
3-42
Tipo de
oper ando
izquierdo
float
double
long double
float
float
double
long double
double
double
double
long double
long double
long double
long double
long double
C++ tiene varios operadores unarios. El trmino unario significa que el operador se
aplica a su nico operando. Uno de ellos, ya antes mencionado, es el operador unario menos para hacer negativo un valor. La expresin:
-23;
se interpreta como:
0 23;
El operador unario menos se puede aplicar a objetos con nombre que almacenan
valores numricos, por ejemplo:
-i;
-x;
-tiempo;
C++ tambin tiene un operador unario ms, que se incluye por simetra con el operador unario menos. La expresin: +244;
se interpreta como:
0 + 244;
FUNDAMENTOS LECCIN 3
3-43
EXPRESIONES MIXTAS
Las expresiones mixtas involucran valores de clase entero y de punto flotante. Por
ejemplo, en la expresin:
23 13.2;
Tipo de operando
izquierdo
long
float
double
int
int
long
float
double
long
long
long
float
double
float
float
float
float
double
double
double
double
double
double
long
double
long
double
long
double
long
double
long
double
long
double
long
double
long
double
long
double
long
double
long
double
PRECEDENCIA
Al igual que muchos lenguajes de programacin, C++ permite al programador escribir expresiones arbitrariamente complejas utilizando operadores binarios y unarios. Como ejemplo, considere el siguiente segmento de cdigo:
int i = 4;
int j = 5;
i + 2 * j;
Hay varios resultados posibles, dependiendo del orden en el que se realicen las operaciones. Si los operadores se aplican de izquierda a derecha, el resultado es <30, int>. Si
las operaciones se aplican de derecha a izquierda, el resultado es <14, int>. Claramente se
necesita un conjunto de reglas que permitan determinar el orden en el que se aplican los
operadores. Estas reglas se denominan reglas de asociatividad y precedencia del lenguaje.
Se empezar discutiendo la precedencia. A cada operador se le asigna un nivel de
precedencia. La tabla 3.12 contiene el nivel de precedencia de los operadores de aritmtica
FUNDAMENTOS LECCIN 3
3-44
entera que hasta el momento hemos visto. Los operadores con mayor precedencia se aplican antes que los de menor precedencia.
Tabla 3.12. Precedencia y asociatividad de operadores
Operador
+ * / %
+ -
Operacin
Precedencia
Asociatividad
15
Derecha
13
Izquierda
12
Izquierda
Ms y menos unario
(signo)
Multiplicacin, divi sin, mdulo
Suma y resta
se suman los cinco precios en primer lugar y luego se calcula el 6% del total.
Las expresiones con parntesis se pueden anidar. En otras palabras, una expresin
entre parntesis puede contener a su vez otras expresiones entre parntesis. En estos casos,
las expresiones con parntesis ms internas se evalan en primer lugar. Considere la siguiente expresin:
(2 +(3 + 2 ) * 5) / (4 2);
En esta expresin, los operadores tienen el mismo nivel de precedencia. Dependiendo de si la multiplicacin se realiza en primer lugar o en ltimo, el valor de la expresin
ser 7 o 6. En el caso en el que un operando se encuentra situado entre operadores de igual
precedencia, es necesario aplicar una regla que permite conocer que operador se aplicar en
primer lugar. Esta caracterstica se denomina asociatividad del operador. Como se vio en la
tabla 3.12, la multiplicacin y la divisin son asociativas por la izquierda. Por lo tanto, en
el ejemplo anterior, el operando 5 se asocia con el operador de su izquierda y, el valor correcto de la expresin es 7.
FUNDAMENTOS LECCIN 3
3-45
El formato general y la sintaxis para declarar clases enumeradas son como sigue:
La declaracin de la clase enumerada puede incluir la definicin de objetos variable de esa clase:
enum <identificador clase> {<lista de identificadores>} <lista de objetos variables>;
Ejemplo:
enum diasSemana {Dom = 1, Lun, Mar, Mier, Jue, Vie, Sab} diaPago, diaCine, diaAsueto;
Ejemplo:
enum diasSemana {Dom = 1, Lun, Mar, Mier, Jue, Vie, Sab};
diasSemana diaPago;
diasSemana diaCine;
diasSemana diaAsueto;
La idea de definir sus propias clases de datos le parecer extraa al principio, pero
pronto descubrir que le proporciona un medio adecuado de trabajo con problemas del
mundo real. Habr ocasiones en que ninguna de las clases de datos estndar trabajar en
forma conveniente para resolver sus aplicaciones. Por ejemplo, suponga un problema que
requiera el manejo de los das de la semana. Debido a que ninguna de las clases estndar
incluyen stos como valores dentro de su rango predefinido, es posible sugerir que cada
da de la semana se establezca a un valor entero con la declaracin const como:
const int DOM
const int LUN
FUNDAMENTOS LECCIN 3
= 0;
= 1;
3-46
= 2;
= 3;
= 4;
= 5;
= 6;
Despus, usando esta declaracin, podr manejar los das dentro de su programa.
Por ejemplo, suponga que el objeto variable dia se define como un entero, un programa
puede incluir las siguientes operaciones de seudo cdigo:
Si (dia = VIE) entonces
Escribir("Es da de pago! ").
Debido a que ha establecido los das de la semana con valores enteros, la declaracin si anterior simplemente compara el valor dia con el valor entero asignado a VIE que
es 5. Si dia es igual a 5, entonces se genera el mensaje.
C++ le permite una forma ms conveniente para trabajar con objetos de datos no
estndar usando la clase enumerada y sus objetos. Ms que usar asignaciones numricas
como antes, puede declarar la serie de das usando la palabra reservada enum como sigue:
enum diasSemana {Dom, Lun, Mar, Mier, Jue, Vie, Sab};
En este caso, la palabra reservada enum declara la clase diasSemana para que incluya la lista de siete identificadores (Dom, Lun, Mar, Mier, Jue, Vie, Sab) con los valores respectivos por omisin 0, 1, 2, 3, 4, 5, 6. diasSemana es una clase definida por el
usuario porque usted, el usuario, la declara.
Otros ejemplos son:
enum siNo {No, Si, NoSePreocupe, PuedeSer};
enum tipoCPU {i8088, i80286, i80386, i80486, i80586, PentiumI, PentiumII} ;
o bien
enum colores {Negro = 1, Rojo, Azul, Verde = 5, Amarillo = 7, Blanco = 11};
FUNDAMENTOS LECCIN 3
3-47
Una clase enumerada es tambin una clase escalar u ordenada. De hecho, la palabra enumerada significa numerada con orden. Adems, el compilador C++ asigna un
orden a los valores enumerados como el valor #1 < valor #2 < ... < valor #n. Esto significa que en la clase diasSemana: Dom < Lun < Mar < Mier < Jue < Vie < Sab. Como resultado, son perfectamente legtimas las operaciones relacionales que involucran a la clase
enumerada. Por ejemplo, cons idere el siguiente seudo cdigo:
Si(dia > Dom) Y (dia < Sab) entonces
Escribir("Es un da laborable").
En este caso, el valor de dia se compara con Dom y Sab. Usando la declaracin
enumerada anterior para diasSemana, dia debe ser un da de la semana si est entre Dom y
Sab correcto? Cmo funciona? El compilador C++ en realidad asigna valores enteros a
los valores de datos enumerados en el orden que se listan, empezando con el valor 0.
Ejemplo 3.177
Declare lo siguiente como clase enumerada. Defina un objeto apropiado para proseguir
con la declaracin de clase.
a.
b.
c.
Solucin
a.
enum mesesAno {Ene, Feb, Mar, Abr, May, Jun, Jul, Ago, Sep, Oct, Nov, Dic};
mesesAno mes;
b.
enum calificacionExamen {R, D, C, B, A};
calificacionExamen examen;
c.
enum rangosEjercito {Soldado, Cabo, Sargento, Teniente, Capitn, Mayor, Coronel, General};
rangosEjercito rango;
Observe la sintaxis en el cdigo anterior. Primero, el nombre de la clase debe ser una sola
palabra (sencilla o compuesta). No se permite ningn espacio o signo de puntuacin. Tambin, observe que las palabras individuales dentro del nombre de la clase empiezan con una
letra mayscula (a partir de la segunda palabra). Esto no es un requerimiento de C++, pero
se hace para mayor claridad. Despus, observe como los valores se listan dentro de las lla-
FUNDAMENTOS LECCIN 3
3-48
ves y estn separadas por comas. Por ltimo, es necesario un punto y coma al final de la
llave derecha para marcar el final de la declaracin de la clase.
Vea la clase calificacionExamen un poco ms de cerca. Observe que no hay comillas en
torno a los smbolos de caracteres. Un error comn cuando se definen smbolos de caracteres como datos enumerados es encerrar los smbolos de datos en comillas, como debera
por ser caracteres. En una declaracin de clase enumerada, los smbolos de carcter no se
tratan como caracteres, pero s como valores nicos de una clase enumerada.
Tambin, deber observar la clasificacin de cada declaracin. La clase calificacionExamen se ordena de la siguiente manera R < D < C < B < A. Esto representa un ordenamiento natural, cuando se considera la aplicacin de calificacin. Si las calificaciones de examen se declaran con caracteres, el ordenamiento debe ser lo opuesto, debido a los valores
relativos ASCII de los caracteres determinados. Adems, la clase rangosEjercito se ordena
de acuerdo con el orden natural de los rangos, desde el ms bajo (Soldado) hasta el ms alto (General). Por ltimo, observe que se ha definido un objeto apropiado para cada clase.
Ejemplo 3.188
En C++, el valor booleano true se representa con el entero 1 y el valor booleano false se
representa con el entero 0. Declare una clase booleana y defina un objeto variable correspondiente llamado bandera que le permitir usar los valores booleanos de Verdadero y
Falso en un programa. Inicialice bandera a Falso como parte de la definicin del objeto.
Solucin
Si est usando un compilador que cumple con el estndar ANSI C++, no necesita crear su
propia clase booleana, porque est especificado como parte del estndar y por lo tanto, est disponible como una clase estndar en su compilador. Todo lo que necesita es crear un
objeto variable para la clase bool, como la siguiente:
bool bandera = false;
Si est usando un compilador anterior que no cumple con el estndar ANSI C++, deber
crear su propia clase enumerada booleana, como sigue:
enum boolean {Falso, Verdadero};
boolean bandera = Falso;
En este caso, el compilador C++ asigna al valor booleano Falso el entero 0 y al valor booleano Verdadero el entero 1. Como resultado, el programador puede emplear los identificadores de Verdadero y Falso en un programa en lugar de 1 y 0 respectivamente, cuando
trabaja con valores booleanos. Esto hace el programa mucho ms legible. Recuerde este
ejemplo, porque usaremos la idea cuando se trabaje con valores booleanos en nuestros
programas.
SUGERENCIA DE DEPURACION
Es importante considerar que los valores de la clase enumerada no son variables o cadenas. Como
resultado, el uso del valor de dato Sab, por ejemplo, como una variable en un programa causar un error.
Un valor de dato enumerado nunca deber aparecer del lado izquierdo de un operador de asignacin, como:
Sab = Vie + 1;
Otra fuente de error comn es declarar en forma inadvertida los valores de datos enumerados como
cadenas, de la siguiente manera:
FUNDAMENTOS LECCIN 3
3-49
Ejemplos:
typedef unsigned long int ulint;
ulint poblacionMundial;
ulint segundosMes;
typedef unsigned int palabra;
palabra sinSigno;
typedef unsigned char byte;
byte carcter;
La palabra reservada typedef define una nueva clase a partir de otra conocida. Puede usar typedef para crear alias que acorten los nombres de clases de datos existentes o para
definir nombres de clases de datos que le sean ms familiares o que describan mejor la manera en que se usa la clase de datos. Tambin puede usar typedef para definir el nombre de
una clase de arreglo.
La sintaxis general para definir el nombre de una clase de arreglo es:
typedef tipoBase nombreDeTipoArreglo[tamArreglo];
Ejemplos:
typedef double vector[10];
typedef double matriz[10][30];
Por lo tanto, los identificadores vector y matriz son nombres de clase de dato.
En cierta forma puede pensar en typedef como un tipo especial de macro de C++,
similar al enunciado #define del procesador. La diferencia es, que mientras una macro le
indica a C++ que haga una sustitucin directa de un texto por otro, typedef crea una clase
nueva que puede usarse al igual que cualquier otra clase. Examine el siguiente fragmento
de cdigo:
FUNDAMENTOS LECCIN 3
3-50
FUNDAMENTOS LECCIN 3
3-51
nen las mismas caractersticas. Aprovecha las relaciones de herencia, e incluso de herencia mltiple, en las
que se derivan clases nuevas de objetos que heredan caractersticas de clases que ya existen y que, sin embargo, contienen caractersticas propias nicas. Un objeto de la clase convertible tiene las caractersticas de la
clase automvil, pero el techo del convertible sube y baja.
La OOP nos da una forma ms natural e intuitiva de ver el proceso de programacin, por medio de la
simulacin de objetos reales, sus atributos y sus comportamientos. La OOP tambin simula la comunicacin
entre objetos. Al igual que las personas se envan mensajes entre ellas (por ejemplo, el sargento que ordena a
la tropa prestar atencin), los objetos tambin se comunican por medio de mensajes.
La OOP encapsula datos (atributos) y funciones (comportamientos) en paquetes llamados objetos;
los datos y las funciones de un objeto estn ntimamente ligados. Los objetos tienen la propiedad de ocultacin de informacin. Esto significa que, aunque los objetos tal vez sepan cmo comunicarse entre ellos a
travs de interfaces bien definidas, normalmente no se les permite saber la manera en que se implementan
otros objetos; los detalles de implementacin estn ocultos en los objetos mismos. Con seguridad es posible
manejar un automvil sin que sea necesario saber cmo funcionan internamente el motor, la transmisin y el
sistema de escape. Veremos por qu la ocultacin de la informacin es crucial para la buena ingeniera de
software.
En C y otros lenguajes de programacin procedural, la programacin tiende a estar orientada a la
accin, mientras que en la programacin en C++ tiende a estar orientada a objetos. En C, la unidad de programacin es la funcin. En C++, la unidad de programacin es la clase, a partir de la cual los objetos son
instanciados (trmino rebuscado equivalente a crear) en algn momento. Las clases de C++ contienen funciones.
Los programadores de C se concentran en escribir funciones. Se toman grupos de acciones que efectan alguna tarea comn, formando funciones, las cuales se agrupan para formar programas. En C, ciertamente los datos son importantes, pero el punto de vista es que existen principalmente como apoyo de las acciones
efectuadas por las funciones. Los verbos de la especificacin de un sistema ayudan al programador de C a
determinar el conjunto de funciones con el que se implementar el sistema.
Los programadores de C++ se concentran en crear sus propios tipos definidos por el usuario, llamados clases. Cada clase contiene datos, as como el conjunto de funciones que los manipula. Los componentes
de datos de una clase se llaman datos miembro. Los componentes de funcin de una clase se llaman funciones miembro (llamadas por lo general mtodos en otros lenguajes de programacin orientados a objetos). As
como a cada instancia de un tipo integrado (estndar), como int, se le llama variable, a cada instancia de un
tipo (es decir, de una clase) definido por el usuario se le llama objeto. El programador emplea los tipos integrados como bloques de construccin para construir los tipos definidos por el usuario. La atencin en C++ se
enfoca hacia las clases (de donde hacemos objetos), en lugar de sobre las funciones. Los sustantivos de la
especificacin de un sistema son los que ayudan al programador de C++ a determinar el conjunto de clases a
partir del cual se crearn objetos que funcionarn juntos, implementando el sistema. Los planos son paras las
casas lo que las clases para los objetos. Podemos construir muchas casas a partir de un plano y podemos instanciar muchos objetos a partir de una clase.
Veremos que, cuando se empaqueta el software en clases, stas se vuelven componentes que pueden
reutilizarse en otros sistemas de software. En efecto, con la tecnologa de objetos construiremos la mayor
parte del software futuro, combinado partes estandarizadas e intercambiables llamadas clases. Cada clase
nueva que cree tendr el potencial de volverse un activo de software valioso que usted y otros programadores
podrn emplear para acelerar y mejorar la calidad de los siguientes esfuerzos de desarrollo de software. Esta
es una posibilidad muy interesante.
FUNDAMENTOS LECCIN 3
3-52
FUNDAMENTOS LECCIN 3
3-53
q Las clases de objeto de C++ short, int y long almacenan valores enteros. En una PC, un short ocupa 8 bits, un int 16 bits y un long 32 bits.
q La clase de objeto de C++ char almacena un carcter. En la mayora de las computadoras, los caracteres se codifican utilizando el cdigo ASCII.
q Las clases de objetos de C++ float, double y long double almacenan valores reales. En una PC, un
long ocupa 32 bits y un double 64 bits. En la mayora de las PC, un long double tiene el mismo tamao que un double, pero en otras computadoras puede ser mayor. Por ejemplo, en algunas comp utadoras un long double ocupa 128 bits.
q Una constante de tipo cadena de caracteres en C++ es una secuencia de caracteres encerrados entre
dobles comillas. Los caracteres especiales, tales como el carcter de nueva lnea, el tabulador y la
alerta, se pueden incluir en una constante de tipo cadena utilizando un carcter de escape especial.
q Una constante entera en C++ se puede escribir en una de las siguientes tres bases: octal, decimal o
hexadecimal. Una constante entera octal comienza con el dgito 0. As, 040 es una constante octal
que representa el valor decimal 32. Las constantes decimales comienzan con un dgito distinto de
cero y las constantes hexadecimales comienzan con el prefijo ox o OX. La constante 0x40 representa el valor decimal 64.
q C++ proporciona varios modos de escribir constantes en punto flotante. La forma ms simple es utilizar la notacin decimal estndar: 3.14149, 2.53 o 0.3512. Las constantes en punto flotante tambin
se pueden escribir en notacin cientfica. La constante en punto flotante de C++, 2.3 E5, representa
el valor 2.3 10 5 o 230000.
q Todas las variables de un programa C++ primero deben ser declaradas antes de utilizarlas.
q En C++, un nombre de variable es cualquier identificador vlido. Un identificador es una serie de
caracteres que consiste de letras, dgitos y caracteres de guin bajo (_). Dichos identificadores no
pueden iniciar con un dgito. Los identificadores de C++ pueden ser de cualquier longitud; sin embargo, a veces algunos sistemas y/o implementaciones imponen restricciones a la longitud de stos.
q Cada variable almacenada en la memoria de la computadora tiene un nombre, un valor, una clase y
un tamao.
q Un nombre en C++ consta de una secuencia de letras (maysculas y minsculas), dgitos y subrayados. Un nombre vlido no puede comenzar con un dgito.
q Los nombres en C++ son sensibles a las maysculas y a las minsculas. Por ejemplo, los nombres
Temp y temp se refieren a objetos diferentes.
q En un programa es importante elegir nombres descriptivos y con significado. Los nombres descriptivos ayudan a otros programadores a entender lo que hace el programa.
q Un objeto debe definirse antes de ser utilizado.
q La divisin entera siempre trunca el resultado.
q Las conversiones unarias usuales especifican que los operandos de tipo char o short se convierten a
int antes de preceder con las operaciones.
q Para una operacin aritmtica que involucra dos operandos enteros, las conversiones binarias usuales especifican que cuando los operandos son de clases diferentes, el de clase int se convierte a long
y se realiza una operacin de clase long, dando como resultado un valor de clase long.
q Para una operacin aritmtica que involucra dos operandos en punto flotante, las conversiones binarias usuales especifican que cuando los operandos son de clases distintas, el operando de menor precisin se convierte a la clase del operando con mayor precisin. La operacin aritmtica se realiza
utilizando la operacin que produce un resultado de la misma clase que el operando de mayor precisin.
q Una operacin aritmtica mixta involucra operandos enteros y de punto flotante. El operando entero
se convierte a la clase del operando en punto flotante y se realiza una operacin de punto flotante.
q La regla de precedencia de C++ definen el orden en el que los operadores se aplican a los operandos. Para operadores aritmticos, el orden de mayor a menor prioridad es: operadores unarios menos y ms; multiplicacin, divisin y mdulo; y suma y resta.
FUNDAMENTOS LECCIN 3
3-54
q Las clases enumeradas son aquellas que declara cuando construye un programa. Las clases
enumeradas se emplean en sus programas C++ para hacerlos ms entendibles y orientados a
aplicaciones. Estas clases de datos son declaradas usando la palabra reservada enum.
q Debido a que las clases enumeradas son escalares, los valores declarados como parte de una clase
determinada se clasifican en orden ascendente a partir del primer valor en el listado de valores hasta
el ltimo valor en la lista.
q La orientacin a objetos es una forma natural de pensar en el mundo y de escribir programas de
cmputo.
q Los objetos tienen atributos (como tamao, forma, color, peso, apariencia, etc.) y presentan comportamientos.
q Los seres humanos aprenden acerca de los objetos estudiando sus atributos y observando su comportamiento.
q Objetos diferentes pueden tener muchos atributos iguales y presentar comportamientos semejantes.
q La OOP (Programacin Orientada a Objetos) modela los objetos reales mediante equivalentes de
software. Aprovecha las relaciones de clase, donde los objetos de cierta clase tienen las mismas caractersticas. Aprovecha las relaciones de herencia, e incluso las relaciones de herencia mltiple,
donde las clases de nueva creacin se derivan heredando caractersticas de clases ya existentes; sin
embargo, contienen caractersticas nicas.
q La programacin orientada a objetos ofrece una manera intuitiva de ver el proceso de programacin,
modelando objetos reales, sus atributos y sus comportamientos.
q La OOP tambin modela la comunicacin entre los objetos por medio de mensajes.
q La OOP encapsula en objetos informacin (atributos) y funciones (comportamiento).
q Los objetos tienen la propiedad de ocultacin de la informacin. Aunque los objetos pueden saber
cmo comunicarse entre ellos a travs de interfaces bien definidas, normalmente no pueden conocer
la informacin de implementacin de los dems objetos.
q La ocultacin de la informacin es crucial para la buena ingeniera de software.
q En C y otros lenguajes de programacin procedural, la programacin tiende a estar orientada a la accin. La informacin ciertamente es importante en C, pero el punto de vista es que existe principalmente como soporte de las acciones efectuadas por las funciones.
q Los programadores de C++ se concentran en la creacin de sus propios tipos, llamados clases. Cada
clase contiene datos, as como el conjunto de funciones encargadas de manipularlos. Los componentes de datos de una clase se llaman datos miembro. Los componentes de funcin de una clase se
llaman funciones miembro o mtodos.
FUNDAMENTOS LECCIN 3
3-55
PREGUNTAS Y PROBLEMAS
PREGUNTAS
1.
2.
3.
4.
5.
6.
7.
32.0
+256
256
3,240
32000
40000
9. Cul de los siguientes valores de punto flotante no son legales en C++? Explique por qu no son vlidos? Suponga la clase float.
a. 35.7
b. 35.7
c. 0.456
d. 1.25e-9
e. 2.5-e3
f. 0.375e-3
g. 25
12. Tres valores en un problema de comunicacin de datos son 15.3 kHz, 2.2 MHz y 10 ps .
a. Exprese cada uno de los valores de punto flotante en su formato decimal fijo.
b. Exprese cada uno de los valores de punto flotante en su formato exponencial.
c. Exprese cada uno como un valor entero.
13. En un circuito se miden los siguientes valores de corriente y voltaje: 1 mili amperes, 32 mili volts, 100
micro volts y 125 nano amperes.
a. Exprese cada valor de corriente y voltaje en formato decimal fijo.
b. Exprese cada valor de corriente y voltaje en formato exponencial.
FUNDAMENTOS LECCIN 3
3-56
250
250.0
16
3.5e-4
x
$
"2"
"175"
"1.25e-3"
Los siguientes nombres de variables son vlidos: _bajo_barra, m928134, t5, j7, sus_ventas,
su_cuenta_total, a, b, c, z, z2.
Los siguientes nombres de variables son invlidos: 3g, 87, 67h2, h22, 2h.
16. Una localidad de memoria de la computadora que puede contener valores distintos en diferentes momentos de la ejecucin de un programa se llama _________________________.
21. Considerando las declaraciones de la pregunta 20cules de las siguientes declaraciones son vlidas?
Explique por qu una declaracin en particular no es vlida.
a. color = Negro;
b. color = Rojo;
c. color = Azul + Verde;
d. color = "Amarillo";
25. Indique como puede la divisin entera de dos valores de tipo int producir un desbordamiento.
26. Cul de los siguientes identificadores son vlidos en C++?
FUNDAMENTOS LECCIN 3
3-57
a.
GPA
b.
Grado.pnt
c.
gradoMedio
d.
Int
e.
1erNum
f.
num1
g.
rayos-x
h.
R2D2
i.
t2
j.
3Cpo
k.
costo_medio
l.
$costo
m.
Era
n.
int
o.
PDQBach
p.
ReturnV
q.
r.
_perro
s.
no!
t.
_123
u.
Gatos
v.
main
w.
Costo$
PROBLEMAS
1.
2.
Declare una serie de objetos constante que represente los meses de un ao.
3.
4.
a.
b.
5.
FUNDAMENTOS LECCIN 3
3-58
float f2 = 1.0;
double d1 = 3.1;
int i1 = 5;
int i2 = 10;
int i3 = 7;
short s1 = 11;
short s2 = 5;
char c1 = 0 ;
Cul es el resultado de las siguientes expresiones? Exprese el resultado como <valor, tipo>.
6.
7.
a.
f1 + d1
b.
i1 + d1
c.
i1 + i2 * i3
d.
i2 % i3
e.
i3 / i2 + i1 * i3
f.
f1 f2
g.
f1 i3
h.
f1 / i2 + d1
i.
i2 + i3 + 3.0
j.
i2 * f2 + 4
k.
s1 / i3
l.
c1 + f2
m.
s1 + s2
n.
i3 + c1
o.
c1 s2
a + b /c + d
c.
1 / (1 + x 2 )
d.
4 / 3 r2
e.
(a 2 b3 )
f.
a(b / c )
g.
(a + b) (c + d) (e + f)
FUNDAMENTOS LECCIN 3
3-59
toascii( ? )
Qu caracteres utiliza la clase caracteres sin signo?
Una cadena de caracteres se almacena en una estructura llamada ________________.
Cuntos bytes de almacenamiento se necesitan para la cadena "Estados Unidos de Amrica"?
El estndar ANSI C++ especifica una clase booleana llamada ____________________ que
incluye los elementos _____________________ y _______________________.
FUNDAMENTOS LECCIN 3
3-60
FUNDAMENTOS LECCIN 3
3-61
Es necesario que el compilador conozca el valor de una constante antes de utilizarla y que
reserve lugares en memoria para almacenar variables.
b. El compilador debe conocer la clase de datos de las constantes y variables para determinar sus atributos y su desempeo.
3. El compilador asigna un valor numrico de 0 (cero) al primer elemento en una clase de datos
enumerada.
FUNDAMENTOS LECCIN 3
3-62