You are on page 1of 62

MIGUEL .

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++
6.1. Clase entero
6.1.1. Constantes 6.1.1.1. Constantes enteras 6.1.1.2. Ejemplos 3.1, 3.2

3 3 7 8 10 11
11
13 13 15

6.2. Clase punto flotante


6.2.1. Constantes en punto flotante 6.2.2. Ejemplos 3.3, 3.4, 3.5

16
16 17

6.3. Clase carcter


6.3.1. Ejemplo 3.6

20
20

6.4. Cadena de caracteres


6.4.1. Ejemplo 3.7

22
23

6.5. Constantes de tipo carcter y de cadenas 6.6. Clase booleana

24 26

7. Examen breve 3-2 8. Objetos constante y variable


8.1. Nombres de los objetos de datos
8.1.1. 8.1.2. Palabras reservadas Identificadores

26 26
26
28 29

8.2. Declaracin de objeto constante versus definicin de objeto variable


8.2.1. Formato de declaracin de una constante
8.2.1.1. 8.2.2.1. 8.2.3.1. Ejemplo 3.8 Ejemplo 3.9 Ejemplos 3.10, 3.11, 3.12

29
31
31

8.2.2. Formato de declaracin de objeto constante de cadena 8.2.3. Formato de definicin de un objeto variable 8.2.4. Formato de definicin de un objeto variable cadena sin un valor inicial 8.2.5. Formato de definicin de un objeto variable de cadena con un valor inicial 8.2.5.1.1. Ejemplos 3.13, 3.14 8.2.6. Objetos booleanos
8.2.6.1. Ejemplo 3.15, 3.16

32
33

33
34

37 37 37 38
38

9. Examen breve 3-3 10. Expresiones


10.1. 10.2. 10.3. 10.4. 10.5. 10.6. Expresiones simples Operaciones aritmticas binarias Operaciones aritmticas unarias Expresiones mixtas Precedencia Asociatividad

39 39
40 40 43 44 44 45

11. La clase enumerada y sus objetos


11.1. Formato de declaracin de clases enumeradas 11.2. Ordenamiento de datos enumerados

46
46 48

FUNDAMENTOS LECCIN 3

3-1

MIGUEL . TOLEDO MARTNEZ

11.3. Ejemplos 3.17, 3.18

48

12. Examen breve 3-4 13. Definicin de clases en C++ 14. Pensando en objetos 15. Lo que necesita saber 16. Preguntas y problema
16.1. Preguntas 16.2. Problemas

50 50 51 53 56
56 58

FUNDAMENTOS LECCIN 3

3-2

MIGUEL . TOLEDO MARTNEZ

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: Manejar el concepto de abstraccin de los datos. Adquirir su primer conocimiento de la estructura de C++ y de las diversas clases de datos contenidos en el lenguaje C++. Saber que los datos son cualquier informacin que debe ser procesada por un programa C++. Comprender con qu clase de dato est tratando. Conocer la clasificacin de las clases de datos fundamentales definidas en C++. Saber que las clases de datos, llamadas clase estndar son los enteros, punto flotante, carcter y booleano . Aprender como crear diferentes objetos de datos para usarlos en un programa C++. Los objetos de datos que crear en sus programas son las constantes y las variables.

TIPOS ABSTRACTOS DE DATOS Si consideramos que los datos son cualquier informacin con las que la computadora debe operar o manipular y que ya hemos visto que la abstraccin, cuando se aplica a la solucin de problemas, le permite concentrarse en la solucin del problema, sin preocuparse de los detalles de su implementacin. Lo mismo es cierto con los datos. La abstraccin de los datos le permite trabajar con los datos sin importar cmo son representados y tratados en la memoria de la computadora. Tomemos la operacin de suma como ejemplo. Para la suma de enteros, se deben proporcionar dos argumentos de tipo entero que sern sumados y regresar la suma entera de los dos. Deber cuidar los detalles de cmo la computadora implementa la suma o representa los enteros en memoria? De seguro que

FUNDAMENTOS LECCIN 3

3-3

MIGUEL . TOLEDO MARTNEZ

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.

Con el fin de mostrar cmo el desarrollo de programas informticos se simplifica mediante el u so durante la fase de diseo de presentaciones abstractas de tipos de datos (i.e. representaciones que estn vacas de cualquier consideracin relativa a la implementacin), consideremos cul sera la alternativa. Utilizar representaciones concretas de los tipos de datos ( i.e., representaciones que especifican el almacenamiento fsico de los datos en la memoria de la computadora) durante el proceso de diseo introduce una complicacin innecesaria al forzarnos a considerar todos los aspectos relacionados con el desarrollo de un tipo de datos en una fase tan temprana del proceso de elaboracin del software. Adicionalmente, emplear una representacin concreta durante el diseo puede producir un programa que sea dependiente de un tipo de datos para una aplicacin particular. Si el desarrollo informtico para el tipo de datos es posteriormente modificado para obtener una representacin ms eficiente, entonces el programa elaborado por el usuario puede llegar a ser no vlido ya que se dise cuando se consideraba la implementacin original del tipo de datos. Estos problemas pueden evitarse mediante el uso de tipos abstractos de datos en el proceso de diseo. Un tipo abstracto de datos (TAD) se define como un modelo matemtico de los objetos de datos que constituyen un tipo de datos, as como de las funciones (operaciones) que operan sobre estos objetos. Es importante apreciar que las operaciones que manipulan los objetos estn incluidas en la especificacin de un TAD. Por ejemplo, el TAD conjunto puede ser definido como una coleccin de elementos que son tratados por operaciones como la unin, la interseccin y la diferencia de conjuntos. Tngase en cuenta que la especificacin de un TAD no indica ninguna consideracin de implementacin. El desarrollo de un TAD supone una traduccin de la especificacin del TAD a la sintaxis de un lenguaje de programacin en particular. Esta traduccin se compone de las declaraciones de variables apropiadas, que sean necesarias para definir los datos y, un procedimiento o rutina de acceso que ejecute cada una de las operaciones requeridas por el TAD. En este punto es til distinguir entre los TAD, tipos de datos y estructuras de datos. El trmino tipo de datos se refiere a la implementacin del modelo matemtico especificado por un TAD. Esto es, un tipo de datos es una representacin informtica de un TAD. El trmino estructura de datos se refiere a una coleccin de variables en memoria que estn relacionadas de alguna forma especfica. Las estructuras de datos se utilizan para desarrollar distintos tipos de datos de la forma ms eficiente posible.

FUNDAMENTOS LECCIN 3

3-4

MIGUEL . TOLEDO MARTNEZ

Un lenguaje de programacin habitualmente ofrece cierto nmero de tipos de datos predefinidos. Por ejemplo, el tipo de datos int disponible en el lenguaje de programacin C++ ofrece una implementacin del concepto matemtico de nmero entero. Esto es, el TAD entero define el conjunto de nmeros dado por la unin del conjunto {-1, 2, ... , - } y el conjunto {0, 1, 2, , }. El TAD entero tambin especifica las operaciones que pueden ser realizadas con los nmeros enteros. Estas operaciones incluyen la suma, la resta, la multiplicacin y la divisin enteras, junto con cierto nmero de otras operaciones. La especificacin del TAD entero no incluye ninguna indicacin de cmo el tipo de datos debera ser diseado y construido. Por ejemplo, es imposible representar todos los nmeros enteros en la memoria de una computadora; sin embargo, el rango de nmeros que sern representados debe ser determinado en la construccin del tipo de datos. Adicionalmente, cuando se desarrolle el TAD entero debe seleccionarse un formato para el almacenamiento de los nmeros enteros en la memoria de la computadora. El formato escogido podra ser complemento a uno, complemento a dos, signo-magnitud, decimal codificado en binario o algn otro formato. Estos son slo unos pocos de los aspectos que deben ser considerados al elaborar el TAD entero. Ntese, sin embargo, que estos detalles son ignorados en la especificacin del TAD. Adems, los programadores generalmente no tienen que preocuparse con estas consideraciones cuando usan el tipo de datos en un programa. En repetidas ocasiones, el diseo de un programa informtico requerir tipos de datos que no se encuentran disponibles en el lenguaje de programacin usado para elaborar el programa. En estos casos, debemos ser capaces de construir los tipos de datos necesarios usando los tipos de datos predefinidos. Lo que a menudo supone la construccin de estructuras de datos realmente complicadas. Los tipos de datos construidos de esta manera se denominan tipos de datos definidos por el usuario. El desarrollo de nuevos tipos de datos se puede hacer desde dos puntos de vista: visin lgica y visin de implementacin. La visin lgica de un tipo de datos debera ser usada durante el diseo del programa. Este es simplemente el modelo aportado por la especificacin de un TAD. La visin de implementacin de un tipo de datos considera la manera en la que los datos son representados en la memoria, y cmo las funciones de acceso son construidas. Desde este punto de vista, nos preocupar principalmente de qu manera las distintas estructuras de datos e implementaciones de rutinas de acceso afectan a la eficiencia de las operaciones realizadas por el tipo de datos. Slo debera haber una visin lgica de un tipo de datos; sin embargo, pueden existir distintos enfoques para elaborarlo. Un programa de aplicacin debera manejar un tipo en funcin de su representacin lgica ms que de su almacenamiento fsico. Es decir, la comunicacin entre el programa de aplic acin y la implementacin del tipo de datos debera producirse solamente a travs de la interfaz que aportan las rutinas de acceso especificadas en el TAD. Esto significa que, mientras la interfaz que ofrece el tipo de datos no sea cambiada, la implementacin del tipo de datos podra ser completamente alterada sin afectar al programa de aplicacin que usa el tipo de datos.

FUNDAMENTOS LECCIN 3

3-5

MIGUEL . TOLEDO MARTNEZ

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

Implementacin del TAD

Programa de aplicacin

Acceso directo

Figura 3.1 . Idealmente una muralla se levanta alrededor de la implementacin de un TAD de tal forma que un programa de aplicacin slo es capaz de manipular datos por medio del uso de rutinas de acceso . En este caso, la manipulacin directa de los datos almacenados en la implementacin del TAD no est permitida.

La separacin u ocultamiento de la representacin de un tipo de datos con respecto a las aplicaciones que lo usan se conoce con el nombre de encapsulacin de datos. En la terminologa de la ingeniera de software, la encapsulacin de datos se dice que es una forma de ocultamiento de la informacin. Una ventaja que se obtiene de la encapsulacin de tipos de datos es la facilidad de modificacin. Como se coment previamente, un tipo de datos encapsulado adecuadamente puede ser modificado sin afectar los programas de aplicacin que hacen uso del mismo. Esto podra ser necesario si, por ejemplo, se requiriera una implementacin ms eficiente. Si a un programa de aplicacin se le permitiera acceder directamente al tipo de datos, burlando las rutinas de acceso, entonces las modificaciones de las estructuras de datos usadas para desarrollar el tipo de datos podran invalidar enteramente el programa de aplicacin. Lo que hara al programa de aplicacin extremadamente difcil de mantener porque la forma en que se elabor el tipo de datos debe tenerse en cue nta cada vez que el programa de aplicacin es modificado. Otra ventaja ofrecida por la encapsulacin de los datos se refiere a la reutilizacin. Un tipo de datos debidamente encapsulado puede ser fcilmente reutilizado en otros programas de aplicacin que requieran la funcionalidad aportada por el tipo de datos, sin tener que conocer cmo fue diseado y construido.

FUNDAMENTOS LECCIN 3

3-6

MIGUEL . TOLEDO MARTNEZ

ESPECIFICACIN DE LOS TAD Consideremos ahora las dos partes de la especificacin de un TAD, que son: una descripcin matemtica de una coleccin de objetos, y un conjunto de operaciones definidas en ciertos elementos de esta coleccin de objetos. Un enfoque riguroso de la especificacin de la ltima parte supone suministrar un conjunto de axiomas que describan completamente el comportamiento de las operaciones del TAD. Estos axiomas pueden entonces ser usados para verificar formalmente la correccin del desarrollo de un TAD. Desgraciadamente, determinar un conjunto completo de axiomas es extremadamente difcil para los TAD no triviales. Por esta razn nos preocuparemos nada ms de obtener descripciones informales para las operaciones del TAD. Ms abajo se muestra un ejemplo de la especificacin de un TAD matriz. Esto es, especificaremos un TAD describiendo en primer lugar sus objetos de datos, y despus relacionando las operaciones que pueden ser ejecutadas con esos objetos.
El TAD MATRIZ. El tipo abstracto de datos MATRIZ se usa para representar matrices matemticas, as como las operaciones definidas sobre matrices. Una matriz se define como una disposicin rectangular de elementos organizados en filas y columnas. Una matriz de n filas y m columnas se dice que tiene un nmero de filas n, un nmero de columnas m y una dimensin n m. Una matriz M de dimensin n m puede ser escrita de la siguiente forma:

a11 a12 L a 1m a 21 a 22 L a 2 m 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. ObtenerElemento(i, j, M ). Devuelve el elemento de fila i y columna j de la matriz M . AsignarElemento(i, j, x, M). Asigna el valor x al elemento de fila i y columna j de la matriz M . Asignar(M 1 , M 2 ). Asigna los elementos de la matriz M 1 a los correspondientes de la matriz M 2 . Las matrices M 1 y M 2 deben tener la misma dimensin. 4. Sumar(M 1 , M 2 ). Devuelve la matriz que se obtiene cuando se suma la matriz M 1 a la matriz M 2 . Las matrices M 1 y M 2 deben tener la misma dimensin. 5. Negativa(M). Devuelve la matriz que resulta de cambiar el signo a los elementos de la matriz M . 6. Restar (M 1 , M2 ). Devuelve la matriz que se obtiene cuando se resta la matriz M 1 de la matriz M 2 . Las matrices M 1 y M 2 deben tener la misma dimensin. 7. ProductoPorEscalar(e, M). Devuelve la matriz que se obtiene cuando se multiplica la matriz M por el escalar e. 8. Producto(M 1 , M2 ). Devuelve la matriz que se obtiene cuando se multiplican la matriz M 1 y la matriz M 2. El n mero de columnas de la matriz M 1 debe ser el mismo que el nmero de filas de la matriz M 2 . La matriz resultado tiene el mis mo nmero de filas que M 1 y el mismo nmero de columnas que M 2 . 9. Transponer(M). Devuelve la matriz transpuesta de M . 10. Determinante(M). Devuelve el determinante de la matriz M . 11. Inversa(M). Devuelve la inversa de la matriz M .

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

MIGUEL . TOLEDO MARTNEZ

camente, describiremos el desarrollo de las operaciones de un TAD usando un algoritmo, que consiste en una secuencia finita de instrucciones que especifica de forma precisa cmo las operaciones deben ser realizadas. CLASES DE DATOS El enfoque que hemos visto anteriormente considera los diferentes tipos de datos, como TAD. Desde otro punto de vista, los diferentes tipos de datos no son mas que una coleccin de objetos de datos que constituyen una clase datos. Veamos este enfoque. De la misma manera que los programas C++ son modulares y altamente estructurados, as mismo son los datos con los que opera el programa. Es posible que piense que los datos son datos cmo puede haber diferentes clases de datos? Primero, piense que los datos son cualquier informacin con las que la computadora debe operar o manipular. As, vamos a definir un objeto dato como cua lquier elemento de informacin que sea manipulada u operada por la computadora. Muchas clases diferentes de objetos de datos existen durante la ejecucin de un programa. Algunos de estos objetos de datos sern definidos por el programador, como objetos constante y variable, mientras que otros, como las pilas del sistema, sern definidas por el sistema. Ahora, piense en los tipos de informacin u objetos dato que maneja la computadora. De seguro, una computadora maneja nmeros o datos numricos. Uno de los usos principales de una computadora es la realizacin de clculos sobre datos numricos. Pero qu hay de los datos de tipo carcter? No es cierto que la computadora maneja datos de caracteres cuando imprime su nombre? Esto es, los datos numricos y los datos de carcter contienen dos diferentes clases de datos. Qu los hace diferentes? Bien, los datos numricos consisten en nmeros mientras que los de carcter consisten en smbolos alfanumricos. Adems, las operaciones definidas por estas dos clases de datos son diferentes. En conclusin, una clase describe las caractersticas de los datos o atributos, as como operaciones legales o desempeo de sus objetos.
Una clase de datos describe los atributos de los datos y el desempeo de sus objetos.

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

MIGUEL . TOLEDO MARTNEZ

CLASE ENTERO O TAD Operaciones: Suma() Substraccin() Multiplicacin() Divisin() Operadores para comparar objetos == != < > <= >= Atributos de datos: Todos los nmeros desde - hasta +
Figura 3.2 . La clase entero se puede considerar un tipo abstracto de dato o clase de dato, donde las operaciones aritmticas en los enteros definen el comportamiento de cualquier objeto definido por la clase entero.

Para su sorpresa, hay ms que slo clases de nmeros y caracteres definidos en C++. La figura 3.3 muestra las diferentes clases de datos que pueden ut ilizarse en C++. Primero, observe que hay tres categoras principales de clases: escalar, estructurada y apuntador.
Clases

Escalar

Estructurada

Apuntador

Arreglos

Estructuras

Clases

Estndar

Enumerada

Pilas

Colas

Listas

rboles

Entero

Flotante

Carcter

Booleano

Figura 3.3 . Jerarqua de clase en el lenguaje C++.

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

LA CLASE ESTNDAR DE DATOS EN C++ Recuerde que la clase estndar ya viene implementada dentro del compilador C++. Esta caracterstica integrada simplemente significa que el compilador C++ reconoce cua lquier valor de datos legal contenido en una clase estndar. Hay cuatro clases de datos estndar: entero, punto flotante, carcter y booleana.
CLASE ENTERO

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

Tabla 3.1. Clase entero y rangos correspondientes en un compilador C++ tpico


Tipo de dato short int o short unsigned short int o unsigned short Tamao en bytes 2 Rango -32768 a 32767 Ejemplos 2456

0 a 65535

0xFF, 42324

int

2o4

unsigned int long int o long unsigned long int o unsigned long

2o4 4 4

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

En la seccin anterior se present la clase entero de C++. Ahora se va a examinar cmo escribir constantes de esta clase. De nuevo, en comparacin con otros lenguajes de programacin, en C++ las constantes de cada tipo se pueden escribir en una amplia variedad de formas.
CONSTANTES ENTERAS

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

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 e n 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

Solucin
a. b. c.

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 r esultado de la multiplicacin en el numerador resulta un valor fuera del rango int.

FUNDAMENTOS LECCIN 3

3-15

MIGUEL . TOLEDO MARTNEZ

CLASE PUNTO FLOTANTE

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 decima l, 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 ]

Slo se puede omitir uno de stos

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

MIGUEL . TOLEDO MARTNEZ

Secuencia de cero o ms dgitos

Exponente opcional

Especificador de tipo opcional

digitos.digitos [ exponente ] [ f | F | l | L ]

Se puede omitir la parte entera o la parte fraccionaria, pero no ambas

Donde exponente es :
Comienza con e o E Signo opcional Uno o ms dgitos

( e | E ) [ + | - ] dgitos

La mantisa puede ser un entero o un nmero decimal. El exponente es un entero con signo. Ejemplos vlidos de constantes en punto flotante que utilizan notacin cientfica en C++ son: 7.82E10 , 0.65E-4 , 9.5.e+23, 32.86E12 . Estas constantes representan, respectivamente, los valores:
7.82 1010 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.

2.32e3 = 2.32 103 = 2320.0 1.45e-6 = 1.45 10 -6 = 0.00000145

FUNDAMENTOS LECCIN 3

3-17

MIGUEL . TOLEDO MARTNEZ

c. d.

-45.02e-4 = -45.02 10-4 = -0.004502 -7.333e7 = -7.333 107 = 73330000.0

Ejemplo 3.4
En comunicacin de datos, a menudo se ven cantidades expresadas con los prefijos de la tabla 3.2

Tabla 3.2. Prefijos que se usan en comunicaciones de datos Prefijo


pico nano micro mili kilo mega giga

Smbolo
p n m k M G

Significado
10 -12 10 -9 10 -6 10 -3 10 +3 10 +6 10 +9

Dadas las siguientes cantidades:


225 picosegundos (ps) 1.3 kilo hertz (kHz) 15 mega hertz ( MHz) 2.25 milisegundos( ms) 27.3 microsegundos( s) 375 nano segundos( ns)
a. b.

Exprese cada una de las cantidades listadas en formato exponencial. Exprese cada una de las cantidades listadas en formato decimal fijo.

Solucin
a.

Para expresar en formato exponencial, simplemente convierta el prefijo a su potencia respectiva de 10 con el uso de la tabla 3.2 . Despus, use la notacin exponencial para escribir el valor, de la siguiente manera: 225 ps = 225e-12 segundos 1.3 kHz = 1.3e3 hertz 15 MHz = 15e6 hertz 2.25 ms = 2.25e-3 segundos 27.3 s = 27.3e-6 segundos 375 ns = 375e-9 segundos

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

MIGUEL . TOLEDO MARTNEZ

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 Tamao en bytes 4 Rango 3.4E-38 a 3.4E+38 y -3.4E-38 a -3.4E+38 1.7E-308 a 1.7E+308 y -1.7E-308 a -1.7E+308 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

double long double

8 10

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

Tabla 3.4. Tabla de cdigos de caracteres ASCII


Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 Tamao en bytes 1 1 1 Rango -128 a 127 -128 a 127 0 a 255 Ejemplos A, ! 23 200, 0x1A

FUNDAMENTOS LECCIN 3

3-21

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

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. "Este es un texto grandioso!" "w" "4321"

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 s [2] t [3] e [4] [5] e [6] s [7] [8] u n t e x t o

[0] [1]

[9] [10] [11] [12] [13] [14] [15] [16] [17]

\0

[18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28]

(a)
w \0

(b)
4 3 2 1 \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 c on 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

MIGUEL . TOLEDO MARTNEZ

CONSTANTES DE TIPO CARCTER Y DE CADENAS

Una constante de cadena de caracteres es una secuencia de ninguno, uno o ms caracteres encerrados entre dobles comillas. Esta idea funciona bien para caracteres que tienen una representacin simblica, pero tambin se necesita la posibilidad de especificar caracteres especiales que no tienen una representacin impresa, tales como un pitido o alerta, el retorno de carro o la alimentacin de pgina. Para incluir un carcter especial en una cadena de caracteres, C++ define un mecanismo de escape. La idea es utilizar un carcter especial que se denomina carcter de escape, que se emplea para cambiar el significado del carcter que le sigue. En C++, el carcter de escape es la barra invertida \ (backslash). As, por ejemplo, para escribir una constante de cadena de caracteres que incluya el carcter de nueve lnea, se debe escribir: "Hola a todos!\n". La diagonal invertida indica que el carcter n no se interpreta como la constante n, sino como el carcter de nueva lnea. Suponga que se desea escribir una constante de tipo cadena de caracteres que incluya las dobles comillas. De nuevo, se puede hacer uso del mecanismo de escape, y escribir:
"\"Hola a todos!\""

La tabla 3.5 contiene una lista de la secuencia de escape de C++. Tabla 3.5. Secuencias de escape Nombre del carcter
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

Nombre ASCII
NL HT VT BS FF BEL CR \ " ?

Secuencia de escape en C++


\n \t \v \b \f \a \r \\ \ \" \?

C++ proporciona un mecanismo de escape adicional para especificar caracteres en una constante de cadena en la que se da el valor numrico de un carcter (de la definicin del conjunto de caracteres ASCII). Lo curioso es que el nmero se debe representar en octal o hexadecimal. No se permite la notacin decimal. De esta forma, se puede incluir un carcter utilizando algunas de las formas: \0oo o \xhh, donde oo y hh son, respectivamente, nmeros octales o hexadecimales. Por ejemplo, la constante: "Hola a todos!\012", es exactamente la misma cadena de caracteres que : "Hola a todos!\n", debido a que 128 es el cdigo ASCII del carcter de nueva lnea. Generalmente, es mejor utilizar la secuencia de escape de C++ para los caracteres especiales, ya que si el programa cambia a una computadora con un conjunto de caracteres distinto, el compilador de C++ entender la correcta codificacin para cualquier carcter especial.

FUNDAMENTOS LECCIN 3

3-24

MIGUEL . TOLEDO MARTNEZ

Como antes dijimos, cuando se almacena una constante de cadena de caracteres en memoria, los caracteres individuales se almacenan en posiciones de memoria consecutiva. Despus del ltimo carcter se aade el carcter nulo ( \0 ). Esta convencin de terminar las cadenas de caracteres con el carcter nulo permite una fcil comprobacin del final de las cadenas. Tambin significa que no es necesario almacenar la longitud de la cadena de caracteres como parte de su representacin. Cada carcter ocupa 1 byte. El carcter nulo al final de la cadena no se incluye cuando se cuenta el nmero de caracteres. El nmero de caracteres que contiene una cadena de caracteres se conoce con el nombre de tamao de la cadena de caracteres. La constante sin ningn carcter: "", con frecuencia se denomina cadena nula o cadena vaca. No contiene ningn carcter, es decir, su tamao es 0. Recurdese, sin embargo, que tambin incluye el carcter nulo al final, y por lo tanto, ocupa 1 byte en memoria. En algunas ocasiones se necesita representar un nico carcter. En C++ las constantes de tipo carcter se crean encerrando el carcter deseado entre comillas simples ( ). Por ejemplo: a 1 + ; son constantes vlidas en C++. Se puede emplear el mecanismo de escape descrito para cadenas de caracteres para crear constantes de tipo carcter para cualquier carcter especial que no tenga una representacin impresa. As por ejemplo, para escribir el carcter literal de nueva lnea, se debe escribir: \n . De igual manera, la barra invertida indica que el carcter n no se interpreta como la constante n, sino como un carcter de nueva lnea. Suponga que se desea escribir un carcter que tenga el valor de la comilla simple. De nuevo, se puede utilizar el mecanismo de escape y escribir: \ . La barra invertida indica que la comilla simple de enmedio es el carcter que se est definiendo. Tambin se puede utilizar secuencia de escape numricas para escribir constantes de tipo carcter. Se puede escribir un carcter utilizando una de las dos formas siguientes:
\0oo o \xhh

donde oo y hh son nmeros octales y hexadecimales respectivamente. A continuacin, se muestran constantes legales en C++ utilizando la forma octal: \033 \06 \0177 Estos caracteres denotan en cdigo ASCII los caracteres ESC (escape), ACK (reconocimiento) y DEL (borrar) respectivamente. Es tpico en el estilo de C++ incluir el cero inicial para representar un nmero en base 8. La siguientes son las mismas constantes:
\33 \6 \177

Los caracteres:
\x1b x6 \x7f

FUNDAMENTOS LECCIN 3

3-25

MIGUEL . TOLEDO MARTNEZ

utilizan formato hexadecimal y representan los mismos caracteres. Clase booleana Los datos booleanos constan de dos valores: true (verdadero) y false (falso), es la forma ms simple de datos que puede usar un programa. Juegan un papel importante en la toma de decisiones requeridos por el programa, ya que las decisiones que se requieran en el programa son decisiones booleanas, dependiendo de si una condicin dada es cierta o falsa. El estndar ANSI C++ define un objeto de clase booleano utilizando bool . Esta clase contiene dos elementos, true y false. La clase bool es escalar, porque false se define para ser menor que true. Las palabras bool , true y false son palabras reservadas (ver ms adelante este concepto: palabras reservadas) y por lo tanto, no se pueden usar para otro propsito. bool es la clase de datos ms nueva que utiliza C++. Como resultado, compiladores anteriores no incluyen la clase bool y sus elementos correspondientes de true y false. Cua ndo use un compilador que no cumpla con el estndar, tendr que crear su propia clase booleana utilizando la clase enumerada (que ser estudiada al final de esta leccin) para definirla. EXAMEN BREVE 3-2 OBJETOS CONSTANTE Y VARIABLE Recuerde que un objeto dato contiene datos que manejar su programa. Hay dos categoras diferentes de objetos datos: objeto constante y objeto variable. En matemticas, usted sabe que una constante es un valor que nunca cambia, permanece fijo. Un ejemplo comn es la constante PI ( ). El smbolo griego se usa para representar un valor de punto flotante de aproximadamente 3.14159. Este valor de nunca cambia, ms an, permanece constante sin importar dnde y cmo debe usarse en un clculo. Por otro lado, una variable es algo que puede tomar valores diferentes. En matemticas, los smbolos x y y se usan a menudo para denotar variables. Usando la ecuacin y = 3x + 2, puede sustituir diferentes valores de x para generar diferentes valores de y. Por lo tanto, los valores de x y y en la ecuacin son variables.
NOMBRES DE LOS OBJETOS DE DATOS

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

MIGUEL . TOLEDO MARTNEZ

Memoria principal de trabajo x Nombres simblicos y contador

Figura 3.6 . Cada objeto variable tiene un nombre simblico que localiza su valor en memoria.

Un componente importante de un lenguaje de programacin es la regla que emplea para construir nombres vlidos. A continuacin se presentan algunas reglas para manejar el uso de nombres en cua lquier compilador C++:
El primer carcter debe ser una letra o el smbolo de subrayado ,_ ,. Los caracteres subsecuentes pueden ser letras de la a a la z, de la A a la Z; los dgitos de 0 a 9 , y el smbolo de subrayado,_ ,. No se permite ningn espacio o puntuacin, excepto el smbolo _ . De manera predeterminada, la longitud mxima de un nombre es de 32 caracteres (puede cambiarse en las opciones del compilador). Los nombres en C++ difieren si la letra es mayscula o minscula. De esta manera, el compilador ve a los nombres impuesto e IMPUESTO como dos identificadores diferentes. Los nombres no pueden ser palabras reservadas o claves como int , double, static por nombrar unos cuantos (ver ms adelantes palabras reservadas).

Ejemplos de nombres vlidos en C++ son:


x_digitos x1 puntuacion datos puntuacionMedia temp num_intentos

Ejemplos de cadena de caracteres que no son nombres vlidos en C++ son:


2incorrecto 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

MIGUEL . TOLEDO MARTNEZ

caracteres de un nombre para determinar nombres iguales. Por ejemplo, el compilador Turbo C++ utiliza los primeros 32 caracteres del nombre. Otros compiladores pueden utilizar ms o menos que 32. Es importante estar seguro de que dos nombres largos para objetos diferentes sean distintos al principio del nombre en vez de al final. De otra forma, dos nombres diferentes para el programador pueden ser tratados con el mismo nombre por el compilador. Como muchos lenguajes de programacin, C++ tiene dos clases de nombres: palabras reservadas e identificadores.
PALABRAS RESERVADAS

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
auto bool break case catch char class const const_cast continue default delete do double dynamic_cast

else
enum explicit extern false float for friend goto if inline int long mutable namespace new

operator private protected public register reinterpret_cast return short signed sizeof static static_cast struct switch template this

throw true try typedef typeid typename union unsigned using virtual void volatile wchart_t while

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

MIGUEL . TOLEDO MARTNEZ

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

En segundo lugar, se har uso frecuentemente de abreviaturas para las palabras obvias. Por ejemplo, abreviaturas tales como num por numero, obj por objeto y cnt por contador, acortan la longitud del identificador sin prdida de claridad. Los identificadores que ilustran este estilo de abreviaturas son:
objVentana 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

MIGUEL . TOLEDO MARTNEZ

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 Una lista de uno o ms identificadores vlidos en C++ clase id, id, , id;

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;

Ninguno de estos objetos tiene valor inicial. Tambin se permite que los objetos tomen un valor inicial cuando se definen. La sintaxis de C++ para este tipo de definicin es:
clase id = constante, id = constante, , id = constante;

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 ;

La primera definicin crea un objeto de clase float denominado impuesto con un valor inicial de 0.06; el segundo crea un objeto denominado letra de clase char con valor inicial a .

FUNDAMENTOS LECCIN 3

3-30

MIGUEL . TOLEDO MARTNEZ

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

Observe la sintaxis, la palabra reservada const es seguida por la clase de datos de la constante. El compilador debe saber a qu clase pertenece el objeto constante. La clase constante es seguida por un identificador de objeto constante. El identificador es el nombre de una constante que ser reemplazada por el valor constante en tiempo de compilacin. Para identificar constantes con facilidad dentro de un programa, sugerimos que los identificadores constantes tengan todas las letras en maysculas. De esta forma, es mucho ms claro que ninguna declaracin debe intentar modificar el valor constante. Se usa un signo igual (=) para separar el identificador constante de su valor declarado. Por ltimo, cada declaracin constante debe finalizar con un punto y coma. Ejemplo 3.8
Suponga que desea usar el precio de 50 centavos para una estampilla de correo de primera clase en su programa C++. Adems, su programa debe calcular el impuesto de la venta para un artculo dada una tasa de impuesto de ventas de 7%. Declare en forma apropiada los objetos constante para representar el precio de la estampilla y el impuesto de la venta.

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 = 0.50; = 0.07;

FUNDAMENTOS LECCIN 3

3-31

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

const char <identificador de objeto cadena> [] = "valor de la cadena";

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[ ] = "Miguel Angel Toledo Martnez"; = "Ave. I.P.N. No. 36"; = "(012)345-6789";

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

MIGUEL . TOLEDO MARTNEZ

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. salario, impuesto, retiro;

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

MIGUEL . TOLEDO MARTNEZ

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 = 0.0;

FUNDAMENTOS LECCIN 3

3-35

MIGUEL . TOLEDO MARTNEZ

float corriente = 0.0; float resistencia = 0.0; Con el uso de esta definicin, las palabras voltaje, corriente y resistencia se deben usar dentro del programa cuando se aplique la ley de Ohm. As, la declaracin que se necesita para calcular el voltaje debe aparecer en su programa como sigue: voltaje = corriente * resistencia;

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).

El siguiente ejemplo es un fragmento de un programa que declara las variables y les asigna valores a las mismas:
#include <iostream.h> void main(void) { int edad; float salario; long int distanciaLuna; edad = 32; salario = 25000.75; distanciaLuna = 238857; }//Fin de main()

Si lo desea, al declarar una variable puede asignarle un valor:


int edad = 32; float salario = 25000.75; long int distanciaLuna = 238857;

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

MIGUEL . TOLEDO MARTNEZ

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

En C++, una cadena debe almacenarse en un arreglo de caracteres. De esta manera, para definir un objeto variable de cadena, deber definir un arreglo de caracteres. Hay dos formas para hacerlo: definir un objeto cadena sin un valor inicial o con un valor inicial. A continuacin los formatos:
char <identificador objeto>[ <tamao mximo de la cadena + 1 > ];
FORMATO DE DEFINICIN DE UN OBJETO VARIABLE DE CADENA CON UN VALOR INICIAL

char <identificador objeto>[ ] = "valor cadena";

En el primer caso, el compilador debe conocer el tamao mximo de la cadena, ms 1. Se especificar el tamao para que el compilador sepa cunta memoria reservar para almacenar la cadena. El tamao ser lo suficientemente grande para que el tamao mximo de la cadena pueda contener el carcter terminador nulo. En el segundo caso, no es necesario especificar un tamao para la cadena porque el compilador determinar la cantidad de memoria que reservar para el valor de la cadena inicializada. Es posible especificar un tamao mximo de cadena; sin embargo, deber ser tan grande como la longitud del valor inicial, ms 1. La inicializacin de un objeto cadena para un valor es bsicamente lo mismo que definir un valor constant e de cadena; sin embargo, no se emplea la palabra reservada const . Recuerde, un objeto constante nunca cambia dentro del programa, mientras que un objeto variable de cadena podr cambiar en cua lquier momento durante la ejecucin del programa. Ejemplo 3.13
La definicin de objetos carcter en el ejemplo 3.12, tiene un problema cuando se representan los das de la semana, ya que un objeto carcter representa un solo carcter. Resuelva este problema usando la definicin de un objeto cadena. Defina un objeto cadena apropiado sin un valor inicial y vuelva a escribir la definicin para inicializarlo con el valor "Mircoles".

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

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;

Sin utilizar la palabra reservada int:


unsigned bandera; short valorPequeno; long numeroGrande;

EXPRESIONES EXPRESIONES

EXAMEN BREVE 3-3

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

MIGUEL . TOLEDO MARTNEZ

EXPRESIONES SIMPLES

La forma ms simple de expresin en C++ es una constante sin ninguna operacin aplicada. Por ejemplo:
23; 18.53; a;

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 Suma
Resta Multiplicacin

OPERADOR + * /

Divisin

Residuo o Mdulo

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 >

FUNDAMENTOS LECCIN 3

3-40

MIGUEL . TOLEDO MARTNEZ

Note que la expresin 6 / 4 da como resultado 1 y no 1.5. Cuando se aplica a dos enteros positivos, el operador de divisin en C++ da un resultado entero. Si el divisor no divide exactamente al dividendo, se descarta la parte fraccionaria, y la parte entera es el valor del resultado. El proceso de descartar la parte fraccionario se denomina truncado. Ntese que truncar no es lo mismo que redondear. Qu ocurre si uno de los operandos es negativo y el resultado es inexacto? En este caso, la definicin de C++ ofrece dos posibilidades. Estas dos posibilidades son los enteros ms cercanos al cociente matemtico. El implementador del compilador es libre de elegir el resultado ms conveniente para la computadora que utilice. Por ejemplo, los dos posibles valores para la expresin:
-11 / 2;

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

MIGUEL . TOLEDO MARTNEZ

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 Tipo de operando derecho char
Ti po de operando izquierdo

short
int int int long

int
int int int long

long
long long long long

char short int long

int int int long

Todos los operadores aritmticos, excepto el operador de mdulo (%), se pueden aplicar a operandos en punto flotante (es decir, float , double y long double). Los operadores aritmticos en punto flotante se listan en la tabla 3.9. Por motivos ilustrativos, todos los operandos son de clase double.

Tabla 3.9. Operadores binarios de aritmtica en punto flotante OPERACION Suma


Resta Multiplicacin

OPERADOR +
*

Divisin

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 >

FUNDAMENTOS LECCIN 3

3-42

MIGUEL . TOLEDO MARTNEZ

El operador mdulo no tiene sentido cuando se aplica a operandos en punto flotante. El compilador C++ marcar como ilegal una expresin en la que un valor en punto flotante sea un operando del operador mdulo. El desbordamiento es posible y una divisin entre cero provocar que el programa se detenga. De forma similar a lo que ocurre con las operaciones aritmticas entre enteros, las conversiones binarias usuales se aplican cuando los operandos son de distinta clase. La regla es muy similar a la que se utiliza para valores de clase entero, esto es el operando de menor precisin se convierte al de mayor precisin. La tabla 3.10 resume los posibles resultados para los operadores binarios en punto flotante con operandos de diferente precisin. Tabla 3.10. Tipos de resultados para las operaciones en punto flotante
Tipo de operando derecho

float
Tipo de oper ando izquierdo

double
double double long double

long double
long double long double long double

float double long double

float double long double

OPERACIONES ARITMETICAS UNARIAS

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

MIGUEL . TOLEDO MARTNEZ

EXPRESIONES MIXTAS

Las expresiones mixtas involucran valores de clase entero y de punto flotante. Por ejemplo, en la expresin:
23 13.2;

el operando de la izquie rda es de clase int y el de la derecha de clase double. Se necesitan reglas que indiquen cmo evaluar la expresin para que el resultado tenga sentido. Lo nico que tiene sentido es convertir el operando de la izquierda a clase double y realizar una resta de doble precisin, lo que da como resultado <9.8, double>. En general, en una expresin binaria con un operando en punto flotante se realizar de acuerdo a la aritmtica en punto flotante, y el resultado ser de alguno de los tipos que C++ tiene para representar valores en punto flotante. La tabla 3.11 resume las posibilidades. Tabla 3.11. Tipos de resultados para operaciones aritmticas mixtas Tipo de operando derecha int Tipo de operando izquierdo int long float double long double
int long float double long double

long
long long float double long double

float
float float float double long double

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

MIGUEL . TOLEDO MARTNEZ

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
Ms y menos unario (signo) Multiplicacin, div isin, mdulo Suma y resta

Precedencia
15 13 12

Asociatividad
Derecha Izquierda Izquierda

En la expresin anterior, la multiplicacin tiene mayor precedencia que la suma y por lo tanto, la multiplicacin se realiza en primer lugar; el resultado de esta operacin se suma al valor de i para obtener el valor de 14. C++ permite emplear parntesis en las expresiones. Las expresiones encerradas entre parntesis se evalan en primer lugar. As en la expresin
(precio1 + precio2 + precio3 + precio4 + precio5) * 0.06;

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);

La subexpresin (3 + 2) se encuentra dentro de otra expresin con parntesis y se evala en primer lugar. Ahora pueden evaluarse las expresiones contenidas en los conjuntos de parntesis ms externos. El valor final es 13.
ASOCIATIVIDAD

Considere la siguiente expresin:


3 * 5 / 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

MIGUEL . TOLEDO MARTNEZ

LA CLASE ENUMERADA Y SUS OBJETOS Otra ventaja de utilizar C++ es que permite al programador crear sus propias clases de datos. Hasta este punto, se han usado las clases de datos estndar entero, punto flotante, carcter y booleano. Aunque estas clases predefinidas pueden usarse para casi cua lquier tarea de programacin, a m enudo son insuficientes para describir un problema con claridad. Pronto descubrir que la clase enumerada mejora la legibilidad de su programa hacindolo ms claro y orientado a la aplicacin. Cuanto ms claramente podamos expresar un problema, ms fcil ser entenderlo y solucionarlo. La clase enumerada consiste en una lista de identificadores nicos y valores asociados con estos identificadores que el programador define para una aplicacin en partic ular. La regla que debe de seguir con la clase enumerada es que, aunque los identificadores deben de ser nicos, los valores que se les asignan no requieren ser nicos.
FORMATO DE DECLARACIN DE CLASES ENUMERADAS

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;

La declaracin de la clase enumerada y por separado la definicin de los objetos variable de esa clase:
enum <identificador clase> {<lista de identificadores>}; <identificador clase> <identificador objeto>;

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 = 0; = 1;

FUNDAMENTOS LECCIN 3

3-46

MIGUEL . TOLEDO MARTNEZ

const int MAR const int MIER const int JUE const int VIE const int SAB

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

C++ es muy flexible en la declaracin de una clase enumerada. En primer lugar le permite asignar explcitamente un valor a un identificador enumerado. Veamos un ejemplo:
enum diasSemana {Dom = 1, Lun, Mar, Mier, Jue, Vie, Sab};

Esta declaracin asigna 1 explcitamente al identificador enumerado Dom. Despus el compilador asigna el siguiente entero, 2, al siguiente identificador, Lun, y as sucesivamente. C++ le permite asignar explcitamente un valor a cada miembro de la lista de ident ificadores enumerados o en forma intermitente. Lo que es ms estos valores no requieren ser nicos. Veamos algunos ejemplos:
enum colores {Negro = 1, Rojo = 2, Azul = 3, Verde = 5, Amarillo = 7, Blanco = 11};

o bien
enum colores {Negro = 1, Rojo, Azul, Verde = 5, Amarillo = 7, Blanco = 11};

FUNDAMENTOS LECCIN 3

3-47

MIGUEL . TOLEDO MARTNEZ

enum tipoCPU {i8088 = 0, i80286 = 2, i80386DX = 3, i80386Sx = 3, i80486Dx = 4, i80486SX = 4}; enum seleccin {false, true, SinCuidado = 0};

En este ltimo ejemplo, el compilador asocia al identificador false con 0 en forma predeterminada. Sin embargo, tambin asocia el valor 0 a SinCuidado, debido a la asignacin explcita.
ORDENAMIENTO DE DATOS ENUMERADOS

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. mesesAno , que consiste en los 12 meses del ao. calificacionExamen, que consiste en las cinco letras de calificaciones (R, D, C , B, A). rangosEjercito, que consiste en los ocho rangos que se encuentran en el ejrcito.

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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

enum diasSemana {"Dom", "Lun", "Mar", "Mier", "Jue", "Vie", "Sab"}; Esto siempre causar un error de compilacin. De nuevo, los valores de datos individuales no son cadenas; son realmente identificadores constantes.

EXAMEN BREVE 3-4 DEFINICIN DE CLASES EN C++ C++ proporciona la palabra reservada typedef, para definir como alias nuevas clases basndose en clases de datos existentes. La sintaxis general para el uso de typedef es:
typedef tipoConocido tipoNuevo;

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

MIGUEL . TOLEDO MARTNEZ

unsigned char unCaracter; typedef unsigned char byte; byte unByte;

El fragmento de programa comienza declarando la variable unCaracter de clase unsigned char. La segunda lnea crea una clase nueva llamada byte. Recuerde ahora que esto no es simplemente un sinnimo para unsigned char, sino una clase nueva, como si el compilador incluyera a byte en el repertorio de clases estndar. La tercera lnea declara a la variable unByte de clase byte, como si byte siempre hubiera sido parte de C++. Debe observar particularmente que unCaracter y unByte son dos clases completamente diferentes. Por supuesto que unByte es de clase byte, que se ha definido como de clase unsigned char, y unCaracter tambin es de clase unsigned char, pero las dos variables se consideran todava de clases completamente diferentes. PENSANDO EN OBJETOS
Este es un tema adicional, con el fin de ir introduciendo al lector en los conceptos relacionados con los objetos. Veremos que la orientacin a objetos es una manera natural de pensar en el mundo y de escribir programas de cmputo. La pregunta que surge inmediatamente es por qu no iniciamos desde la primera pgina con la orientacin a objetos ? Por qu estamos dejando la programacin orientada a objetos en C++ hasta la especialidad en computacin? La r espuesta es que los objetos que construiremos se compondrn de piezas de programas estructurados, por lo que primero necesitamos establecer una base con la programacin estructurada. En esta seccin presentamos los conceptos bsicos y la terminologa. En la especialidad en computacin se cubrirn los temas relacionados con las tcnicas del OOD (diseo orientado a objetos). Se analizarn el planteamiento de problemas tpicos que requieren construir un sistema, determinar los objetos que se necesitan para implementarlo, determinar los atributos que necesitarn tener los objetos, determinar los comportamiento que necesitan presentar dichos objetos y especificar la manera en que tendrn que interactuar los objetos entre ellos para cumplir con los requerimientos del sistema. Observe el mundo real que lo rodea. Dondequiera que voltee, ver objetos! Gente, animales, plantas, automviles, aviones, edificios, computadoras y dems. Los seres humanos piensan en trminos de objetos. Tenemos la maravillosa capacidad de la abstraccin, que nos permite ver imgenes en la pantalla como objetos, tales como gente, aviones, rboles y montaas, en lugar de cmo puntos de colores (llamados pxeles). Podemos, si lo deseamos, pensar en trminos de una playa, en lugar de granos de arena; de un bosque, en lugar de rboles; y de una casa, en lugar de ladrillos. Podramos inclinarnos a dividir los objetos en dos categoras: objetos animados y objetos inanimados. Los objetos animados estn vivos en algn sentido. Se mueven y hacen cosa. Los objetos inanimados, como las toallas, no hacen gran cosa. Slo estn ah. Sin embargo, todos estos objetos tienen algo en comn. Cuentan con atributos como tamao, forma, color, peso, etc. Todos presentan comportamientos; por ejemplo, una pelota rueda, rebota, se infla y desinfla; un beb llora, duerme, gatea, camina y parpadea; un automvil acelera, frena, da vuelta; una toalla absorbe agua; etctera. Los seres humanos aprenden sobre los objetos estudiando sus atributos y observando sus comportamientos. Objetos diferentes pueden tener atributos similares y presentar comportamientos similares. Pueden hacerse comparaciones; por ejemplo, entre los bebs y los adultos, y entre los humanos y los chimpancs. Los automviles, camiones, carritos y patinetas tienen mucho en comn. La OOP (Programacin Orientada a Objetos) simula objetos reales con equivalentes de software. Aprovecha las relaciones de clase en las que los objetos de cierta clase (digamos una clase de vehculos) tie-

FUNDAMENTOS LECCIN 3

3-51

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

LO QUE NECESITA SABER Antes de continuar con la siguiente leccin, asegrese de haber comprendido los siguientes conceptos:
q Un objeto dato es cualquier elemento de informacin que se maneja u opera en una computadora. El tipo ms simple de objetos dato son los objetos numricos y caracteres. q Una clase describe los atributos de los datos y el desempeo de sus objetos. q La abstraccin de los datos nos permite trabajar con una clase sin preocuparnos por los detalles de la implementacin interna de la clase; esto da lugar al trmino tipo abstracto de datos o TAD. q El trmino desempeo tiene que ver con cmo un TAD o clase, actuar y reaccionar para una operacin determinada. Como resultado, todas las clases (TAD) exhiben un cierto comportamiento que se determina mediante las operaciones definidas por el TAD. q En C++ todos los datos procesados por el programa deben de ser parte de una clase determinada. q Hay tres categoras de clases principales: escalar, estructurado y apuntador. q Los objetos de datos escalar se ordenan y consisten en datos estndar y enumerados. q Las clases escalares estndar incluyen las clases entero, punto flotante, carcter y booleana. q Las clases entero en C++ incluyen las clases short int o simplemente short, unsigned short int, int , unsigned int , long int o simplemente long y unsigned long int o unsigned long , cada una de las cuales define un rango determinado de enteros que depende del compilador C++ en particular que se est usando. q La clase punto flotante consiste en valores decimales que se representan en formato decimal de punto fijo o exponencial. Los objetos constante y variable de punto flotante se declaran/definen como clases float , double o long double, cada una de las cuales define un rango determinado de valores de punto flotante que dependen del compilador C++ en particular que se usa. q Los datos de carcter incluyen todos los smbolos del teclado de su computadora. Los caracteres son ordenados, porque estn representados internamente usando un cdigo numrico ASCII. q En C++ , hay tres clases de caracteres: char, signed char y unsigned char. La primera se usa para representar la serie de caracteres estndar ASCII. La ltima se emplea para representar la serie de caracteres estndar ASCII as como la serie de caracteres de PC extendida. q Una cadena es una serie de caracteres. C++ implementa cadenas como arreglos de caracteres, donde cada elemento en el arreglo contiene un carcter en la cadena y el lt imo elemento de la cadena es el carcter '\0 ', llamado terminador nulo. q La clase booleana , bool , consta de slo dos elementos de datos: true y false. Los valores booleanos se usan en los programas para tomar decisiones. q Todas las constantes y variables que se utilizan en el programa C++ se declaran o se definen como objetos antes de usarlas en el programa. q Los objetos constante se declaran con la palabra reservada const seguido de su identificador, el signo de asignacin (=) y su valor constante. q Los objetos variable se definen listando las clases variable seguidas por el identificador del objeto variable. En la definicin puede incluirse un valor de inicio opcional. q Al igual que las constantes cadena, las variables cadena deben estar definidas como arreglos de caracteres. q El operador de asignacin = asigna o da un nuevo valor a un objeto. q Cuando se coloca un nuevo valor en una localidad de memoria, reemplaza el valor previo de dicha localidad. El valor previo se destruye. q Cuando se lee un valor de memoria, el proceso es no destructivo, es decir, se copia el valor, dejando el original tal cual en la localidad de memoria.

FUNDAMENTOS LECCIN 3

3-53

MIGUEL . TOLEDO MARTNEZ

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 aritm tica 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

MIGUEL . TOLEDO MARTNEZ

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

MIGUEL . TOLEDO MARTNEZ

PREGUNTAS Y PROBLEMAS
PREGUNTAS

1. 2. 3. 4. 5. 6. 7.

Qu es un tipo abstracto de dato o TAD? Proporcione un ejemplo de un TAD . Cul es el significado del trmino desempeo , cuando se relaciona con los TAD? Por qu la clase C++ es ideal para implementar los TAD? Mencione las cuatro clases estndar definidas en C++. Qu caractersticas tiene una clase escalar sobre una clase no escalar? Cules de los siguientes no son valores enteros legales en C++? Explique, por qu no son vlidos? Suponga la clase int . a. b. c. d. e.
f.

32.0 +256 256 3,240 32000 40000

8. Qu es una condicin de desbordamiento de un entero y cuando generar resultados incorrectos en


C++?

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

10. Convierta los siguientes nmeros decimales a su notacin exponencial.


a. 0.0000123 b. 57892345.45 c. 1.00004536 d. +012.345

11. Convierta los siguientes valores exponenciales a notacin decimal fija.


a. 3.45e-7 b. 2.25e-5 c. 2.22e6 d. 3.45e4

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

MIGUEL . TOLEDO MARTNEZ

14. Cul es la clase de cada uno de lo siguientes?


a. b. c. d. e. f. g. h. i. a.
b.

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.

15. Falso o Verdadero: Explique sus respuestas.

16. Una localidad de memoria de la computadora que puede contener valores distintos en diferentes momentos de la ejecucin de un programa se llama _________________________.

17. Las clases enumeradas se declaran con la palabra reservada ___________________. 18. Dada una declaracin de clase enumerada Cmo se ordenan los valores dentro de la clase? 19. Escriba las declaraciones para las siguientes clases enumeradas. Asegrese de definir un objeto apropiado
junto con cada clase. a. cursosSemestre , consta de los cursos que tomar este semestre. b. cursosPrincipales, consta de los cursos que requiere en su programa principal. c. miFamilia, consta de todos los miembros de su familia inmediata. d. dasSemana y finesSemana , consta de aquellos das respectivos de la semana que se presentan en estos subrangos. e. primavera, verano, otoo e invierno , consta de aquellos meses respectivos que formas estas estaciones.

20. Dada la siguiente definicin.


enum colores{Azul, Verde, Amarillo, Rojo, Naranja}; colores color; Cul de lo siguiente es cierto y cul es falso? a. Azul < Amarillo b. Rojo > Naranja c. (Verde < Amarillo) AND (Amarillo > Azul) d. (Amarillo > Naranja) OR (Amarillo > Azul)

21. Considerando las declaraciones de la pregunta 20 cules 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";

22. Establezca la diferencia entre un objeto carcter y una cadena. 23. Cul es el rango de un entero de 32 bits? 24. Cuntos bytes nulos se encuentran al final de la siguiente cadena de caracteres?
"Qu esta haciendo aqu|0?"

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

MIGUEL . TOLEDO MARTNEZ

a. b. c. d. e. f. g. h. i. j. k. l. m. n. o. p. q. r. s. t. u. v. w.

GPA Grado.pnt gradoMedio Int 1erNum num1 rayos-x R2D2 t2 3Cpo costo_medio $costo Era int PDQBach ReturnV A _perro no! _123 Gatos main Costo$

PROBLEMAS 1. Seleccione nombres apropiados y declare objetos constante para representar lo siguiente: a. Un valor mximo de 100. b. El valor que se requiere para representar el prefijo mili. c. El valor que se requiere para representar el prefijo kilo. d. Su edad. e. Un punto cardinal. f. La fecha de su cumpleaos. g. Su escuela. Declare una serie de objetos constante que represente los meses de un ao. Seleccione nombres apropiados y defina objetos variables para lo siguiente: a. Promedio de calificaciones. b. Calificacin para un curso. c. Comisin por pago con cheque. d. Nombre del estudiante, nombre y nmero del curso. Suponga que los nombres de estudiantes y curso necesitan 25 caracteres y el nmero del curso es un nmero alfanumrico de siete posiciones como ING-103 . Escriba una sola instruccin C++ que logre lo siguiente: a. b. 5. Declare c, estaEsVariable, q76354 y numero como variables de clase int . Declare x , y, z y resultado como variables de clase float.

2. 3.

4.

Considere las siguientes declaraciones float f1 = 23.3;

FUNDAMENTOS LECCIN 3

3-58

MIGUEL . TOLEDO MARTNEZ

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>. a. b. c. d. e. f. g. h. i. j. k. l. m. n. o. 6. f1 + d1 i1 + d1 i1 + i2 * i3 i2 % i3 i3 / i2 + i1 * i3 f1 f2 f1 i3 f1 / i2 + d1 i2 + i3 + 3.0 i2 * f2 + 4 s1 / i3 c1 + f2 s1 + s2 i3 + c1 c1 s2

Escriba en C++ expresiones equivalentes a las siguientes frmulas matemticas: a. b 2 + 4ac b. c. d. e. f. g. a + b /c + d 1 / (1 + x 2 ) 4 / 3 r2 (a 2 b3 ) a(b / c ) (a + b) (c + d) (e + f)

7.

Escriba una sentencia en C++ que implemente la siguiente ecuacin: q = ( (T1 T2 ) / (D K) + T2 La sentencia debera utilizar los siguientes objetos float q; float k = 1.35; float D = 9.2; float T1 = 98.4; float T2 = 101.12

FUNDAMENTOS LECCIN 3

3-59

MIGUEL . TOLEDO MARTNEZ

EXAMEN BREVE 3-1


1. Una ______________ describe los atributos de los datos y el desempeo de sus objetos. 2. Las clases que son predefinidas dentro de un lenguaje de programacin se llaman clases __________________. 3. Una serie de elementos de datos creados por el programador, para construir una aplic acin se llaman clases de datos ___________________________. 4. Las tres principales categoras de clases en el lenguaje de programacin C++ son: ____________, _________________ y ____________________. 5. Qu se entiende por desempeo cuando se aplica a las clases y los TDA? 6. Otro nombre para una estructura es un ____________________. 7. Por qu la clase C++ es ideal para implementar sus propios TDA?

EXAMEN BREVE 3-2


1. Qu rango de valores puede proporcionarse por medio de la clase estndar int? 2. Qu tipo de error ocurre cuando, como resultado de un clculo, un valor excede su rango predefinido? 3. Las dos formas de valores de punto flotante que pueden representarse en un programa C++ son el ____________________ y el _______________________. 4. Qu obtendr cuando se ejecuten las siguientes funciones? toascii( B ) 5. 6. 7. 8. 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 _______________________.

EXAMEN BREVE 3-3


1. Cules son las dos razones para declarar o definir objetos constante y variable en un programa C++? 2. Declare un objeto constante con el nombre PUNTO que insertar un punto. 3. Declare un objeto constante llamado LIBRO que insertar la cadena "Tcnicas estructuradas y orientadas a objetos " dondequiera que aparezca en un programa. 4. Dado un objeto cadena que deber almacenar una cadena de hasta 25 caracteres qu tamao de arreglo deber especificar en la definicin del objeto? 5. Defina un objeto variable de nombre curso que se inicializar con la cadena de caracteres: "Estructura de datos ".

FUNDAMENTOS LECCIN 3

3-60

MIGUEL . TOLEDO MARTNEZ

EXAMEN BREVE 3-4


1. Por qu querra crear una clase enumerada en su programa si se puede usar una clase est ndar ? 2. Declare una clase enumerada de nombre automviles que consista de al menos 10 marcas populares de automviles. 3. Qu valor numrico hace que el compilador asigne al primer valor en una clase enumerada?

RESPUESTAS EXAMEN BREVE 3-1


1. Una clase describe los atributos de los datos y el comportamiento de sus objetos. 2. Las clases de datos predefinidas en un lenguaje de programacin se denominan estndar. 3. Una serie de elementos de datos definidos por el programador, para cumplir con los requerimientos de una aplicacin se conoce con el nombre de clase de datos enumerados . 4. Las tres categoras principales de clases de datos en un lenguaje de programacin estructurado son: escalar , estructurado y apuntador . 5. El desempeo , en relacin con los TDA, describe cmo actuar y reaccionar el TDA para una operacin dada. 6. Otro nombre para una estructura es registro. 7. La clase C++ es ideal para la implementacin de TDA, porque se puede usar para definir los atributos de los datos de los TDA as como el desempeo de los mismos.

RESPUESTAS EXAMEN BREVE 3-2


1. El rango de valores que proporciona la clase estndar int es 32768 a +32767. 2. Un desbordamiento o sobreflujo ocurre cuando, como resultado de un clculo, un valor excede su rango predefinido. 3. Las dos formas de valores de punto flotante que pueden representarse en un programa C++ son el decimal y el exponencial. 4. Los valores siguientes sern regresados cuando se ejecuten estas funciones:
toascii( B ) = 66 toascii( ? ) = 63

5. La serie de caracteres extendidos definidos para una PC de IBM . 6. Una cadena de caracteres se almacena en una estructura llamada arreglo. 7. Se requieren 26 bytes de almacenamiento para guardar la cadena "Estados Unidos de Amrica". 8. El estndar ANSI C++ especifica una clase booleana llamada bool que incluye los e lementos true y false.

FUNDAMENTOS LECCIN 3

3-61

MIGUEL . TOLEDO MARTNEZ

RESPUESTAS EXAMEN BREVE 3-3


1. Las dos razones para declarar constantes y variables en un programa C++ son las siguientes:
a. 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.

2. const char PUNTO = . ; 3. const char LIBRO[] = "Tcnicas estructuradas y orientadas a objetos"; 4. Dado un objeto cadena que deber almacenar una cadena de hasta 25 caracteres debe definir un tamao de arreglo de 26 para almacenar la variable de cadena. 5. char curso[] = " Estructura de datos" ; 6.

RESPUESTAS EXAMEN BREVE 3-4


1. La clase enumerada de datos hace al programa ms legible que las clases de datos estndar. 2. enum automoviles {Ford, BMW, Chevrolet, Chrysler, Volvo, Nissan, Renault, Porsche, Cadillac, Toyota};

3. El compilador asigna un valor numrico de 0 (cero ) al primer elemento en una clase de datos enumerada.

FUNDAMENTOS LECCIN 3

3-62

You might also like