contenido de la lecciÓn 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos...

62
MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-1 CONTENIDO DE LA LECCIÓN 3 ABSTRACCIÓN DE DATOS, CLASES Y OBJETOS DE DATOS 1. Introducción 3 2. Tipos abstractos de datos 3 3. Especificación de los TAD 7 4. Clases de datos 8 5. Examen breve 3-1 10 6. La clase estándar de datos en C++ 11 6.1. Clase entero 11 6.1.1. Constantes 13 6.1.1.1. Constantes enteras 13 6.1.1.2. Ejemplos 3.1, 3.2 15 6.2. Clase punto flotante 16 6.2.1. Constantes en punto flotante 16 6.2.2. Ejemplos 3.3, 3.4, 3.5 17 6.3. Clase carácter 20 6.3.1. Ejemplo 3.6 20 6.4. Cadena de caracteres 22 6.4.1. Ejemplo 3.7 23 6.5. Constantes de tipo carácter y de cadenas 24 6.6. Clase booleana 26 7. Examen breve 3-2 26 8. Objetos constante y variable 26 8.1. Nombres de los objetos de datos 26 8.1.1. Palabras reservadas 28 8.1.2. Identificadores 29 8.2. Declaración de objeto constante versus definición de objeto variable 29 8.2.1. Formato de declaración de una constante 31 8.2.1.1. Ejemplo 3.8 31 8.2.2. Formato de declaración de objeto constante de cadena 32 8.2.2.1. Ejemplo 3.9 33 8.2.3. Formato de definición de un objeto variable 33 8.2.3.1. Ejemplos 3.10, 3.11, 3.12 34 8.2.4. Formato de definición de un objeto variable cadena sin un valor inicial 37 8.2.5. Formato de definición de un objeto variable de cadena con un valor inicial 37 8.2.5.1.1. Ejemplos 3.13, 3.14 37 8.2.6. Objetos booleanos 38 8.2.6.1. Ejemplo 3.15, 3.16 38 9. Examen breve 3-3 39 10. Expresiones 39 10.1. Expresiones simples 40 10.2. Operaciones aritméticas binarias 40 10.3. Operaciones aritméticas unarias 43 10.4. Expresiones mixtas 44 10.5. Precedencia 44 10.6. Asociatividad 45 11. La clase enumerada y sus objetos 46 11.1. Formato de declaración de clases enumeradas 46 11.2. Ordenamiento de datos enumerados 48

Upload: others

Post on 20-Oct-2019

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-1

CONTENIDO DE LA LECCIÓN 3

ABSTRACCIÓN DE DATOS, CLASES Y OBJETOS DE DATOS 1. Introducción 3 2. Tipos abstractos de datos 3 3. Especificación de los TAD 7 4. Clases de datos 8 5. Examen breve 3-1 10 6. La clase estándar de datos en C++ 11

6.1. Clase entero 11 6.1.1. Constantes 13

6.1.1.1. Constantes enteras 13 6.1.1.2. Ejemplos 3.1, 3.2 15

6.2. Clase punto flotante 16 6.2.1. Constantes en punto flotante 16 6.2.2. Ejemplos 3.3, 3.4, 3.5 17

6.3. Clase carácter 20 6.3.1. Ejemplo 3.6 20

6.4. Cadena de caracteres 22 6.4.1. Ejemplo 3.7 23

6.5. Constantes de tipo carácter y de cadenas 24 6.6. Clase booleana 26

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

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

8.2. Declaración de objeto constante versus definición de objeto variable 29 8.2.1. Formato de declaración de una constante 31

8.2.1.1. Ejemplo 3.8 31 8.2.2. Formato de declaración de objeto constante de cadena 32

8.2.2.1. Ejemplo 3.9 33 8.2.3. Formato de definición de un objeto variable 33

8.2.3.1. Ejemplos 3.10, 3.11, 3.12 34 8.2.4. Formato de definición de un objeto variable cadena sin un valor inicial 37 8.2.5. Formato de definición de un objeto variable de cadena con un valor inicial 37

8.2.5.1.1. Ejemplos 3.13, 3.14 37 8.2.6. Objetos booleanos 38

8.2.6.1. Ejemplo 3.15, 3.16 38 9. Examen breve 3-3 39 10. Expresiones 39

10.1. Expresiones simples 40 10.2. Operaciones aritméticas binarias 40 10.3. Operaciones aritméticas unarias 43 10.4. Expresiones mixtas 44 10.5. Precedencia 44 10.6. Asociatividad 45

11. La clase enumerada y sus objetos 46 11.1. Formato de declaración de clases enumeradas 46 11.2. Ordenamiento de datos enumerados 48

Page 2: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-2

11.3. Ejemplos 3.17, 3.18 48 12. Examen breve 3-4 50 13. Definición de clases en C++ 50 14. Pensando en objetos 51 15. Lo que necesita saber 53 16. Preguntas y problema 56

16.1. Preguntas 56 16.2. Problemas 58

Page 3: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-3

LECCIÓN 3

ABSTRACCIÓN DE DATOS, CLASES Y OBJETOS DE DATOS

INTRODUCCIÓN Conforme se avanza en el proceso de diseño de sistemas computacionales, los dis-tintos tipos de datos necesarios, así como las operaciones que deben ser ejecutadas con es-tos datos se hacen notar. En este punto puede ser utilizado un tipo especial de abstracción conocido como abstracción de datos. Esto involucra una descripción abstracta o lógica, tanto de los datos requeridos por el sistema informático, como de las operaciones que pue-den ser ejecutadas con esos datos. El uso de la abstracción de datos durante el desarrollo de software permite al diseñador concentrarse en cómo son usados los datos en el sistema para resolver el problema que le ocupa, sin tener que preocuparse de cómo son los datos repre-sentados y tratados en la memoria de la computadora.

En esta lección se introducen las clases de datos (tipos de datos) fundamentales que ofrece C++. De hecho, una de las características que con frecuencia distingue a un lenguaje de programación 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 lección: • Manejar el concepto de abstracción 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 información que debe ser procesada por un progra-

ma C++. • Comprender con qué clase de dato está tratando. • Conocer la clasificación de las clases de datos fundamentales definidas en C++. • Saber que las clases de datos, llamadas clase estándar son los enteros, punto flotante,

carácter 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 información con las que la computa-dora debe operar o manipular y que ya hemos visto que la abstracción, cuando se aplica a la solución de problemas, le permite concentrarse en la solución del problema, sin preocu-parse de los detalles de su implementación. Lo mismo es cierto con los datos. La abstrac-ción de los datos le permite trabajar con los datos sin importar cómo son representados y tratados en la memoria de la computadora. Tomemos la operación de suma como ejem-plo. Para la suma de enteros, se deben proporcionar dos argumentos de tipo entero que serán sumados y regresará la suma entera de los dos. ¿Deberá cuidar los detalles de cómo la computadora implementa la suma o representa los enteros en memoria? ¡De seguro que

Page 4: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-4

no! Lo que tiene que hacer es proporcionar la información para que la operación de suma realice su trabajo y revisar la información que regresa. En otras palabras, todo lo que tiene que saber es lo que debe suministrar a la operación y cómo le responderá. A la manera en que los tipos abstractos de datos (TAD) actuarán y reaccionarán para una operación de-terminada se conoce con el nombre de desempeño.

Con el fin de mostrar cómo el desarrollo de programas informáticos se simplifica

mediante el uso durante la fase de diseño de presentaciones abstractas de tipos de datos (i.e. representaciones que están vacías de cualquier consideración relativa a la implemen-tación), consideremos cuál sería la alternativa. Utilizar representaciones concretas de los tipos de datos (i.e., representaciones que especifican el almacenamiento físico de los datos en la memoria de la computadora) durante el proceso de diseño introduce una complica-ción 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 elaboración del software.

Adicionalmente, emplear una representación concreta durante el diseño puede pro-ducir un programa que sea dependiente de un tipo de datos para una aplicación particular. Si el desarrollo informático para el tipo de datos es posteriormente modificado para obtener una representación más eficiente, entonces el programa elaborado por el usuario puede lle-gar a ser no válido – ya que se diseñó cuando se consideraba la implementación original del tipo de datos. Estos problemas pueden evitarse mediante el uso de tipos abstractos de datos en el proceso de diseño. Un tipo abstracto de datos (TAD) se define como un modelo matemático 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 están incluidas en la especificación de un TAD. Por ejemplo, el TAD conjunto puede ser definido como una colección de elementos que son tratados por operaciones como la unión, la intersección y la diferencia de conjuntos. Téngase en cuenta que la especificación de un TAD no indica ninguna considera-ción de implementación. El desarrollo de un TAD supone una traducción de la especifica-ción del TAD a la sintaxis de un lenguaje de programación en particular. Esta traducción 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 re-queridas por el TAD. En este punto es útil distinguir entre los TAD, tipos de datos y estructuras de datos. El término tipo de datos se refiere a la implementación del modelo matemático especifica-do por un TAD. Esto es, un tipo de datos es una representación informática de un TAD. El término estructura de datos se refiere a una colección de variables en memoria que están relacionadas de alguna forma específica. Las estructuras de datos se utilizan para desa-rrollar distintos tipos de datos de la forma más eficiente posible.

El término desempeño cuando se asocia con un TAD, tiene que ver con la forma en que el TAD actuará o reaccionará para una operación determinada.

Page 5: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-5

Un lenguaje de programación habitualmente ofrece cierto número de tipos de datos predefinidos. Por ejemplo, el tipo de datos int disponible en el lenguaje de programación C++ ofrece una implementación del concepto matemático de número entero. Esto es, el TAD entero define el conjunto de números dado por la unión del conjunto {-1, –2, ... , - ∞∞} y el conjunto {0, 1, 2, … , ∞∞}. El TAD entero también especifica las operaciones que pue-den ser realizadas con los números enteros. Estas operaciones incluyen la suma, la resta, la multiplicación y la división enteras, junto con cierto número de otras operaciones. La es-pecificación del TAD entero no incluye ninguna indicación de cómo el tipo de datos debe-ría ser diseñado y construido. Por ejemplo, es imposible representar todos los números en-teros en la memoria de una computadora; sin embargo, el rango de números que serán re-presentados debe ser determinado en la construcción del tipo de datos. Adicionalmente, cuando se desarrolle el TAD entero debe seleccionarse un formato para el almacenamiento de los números enteros en la memoria de la computadora. El for-mato escogido podría ser complemento a uno, complemento a dos, signo-magnitud, deci-mal codificado en binario o algún otro formato. Estos son sólo unos pocos de los aspectos que deben ser considerados al elaborar el TAD entero. Nótese, sin embargo, que estos deta-lles son ignorados en la especificación del TAD. Además, los programadores generalmente no tienen que preocuparse con estas consideraciones cuando usan el tipo de datos en un programa. En repetidas ocasiones, el diseño de un programa informático requerirá tipos de datos que no se encuentran disponibles en el lenguaje de programación 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 construcción de estruc-turas 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: visión lógica y visión de implementación. La visión lógica de un tipo de datos debería ser usada durante el diseño del progra-ma. Este es simplemente el modelo aportado por la especificación de un TAD. La visión de implementación de un tipo de datos considera la manera en la que los datos son representa-dos en la memoria, y cómo las funciones de acceso son construidas. Desde este punto de vista, nos preocupará principalmente de qué manera las distintas estructuras de datos e im-plementaciones de rutinas de acceso afectan a la eficiencia de las operaciones realizadas por el tipo de datos. Sólo debería haber una visión lógica de un tipo de datos; sin embargo, pueden existir distintos enfoques para elaborarlo. Un programa de aplicación debería manejar un tipo en función de su representación lógica más que de su almacenamiento físico. Es decir, la comunicación entre el programa de aplicación y la implementación del tipo de datos debería producirse solamente a través 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 implementación del tipo de datos podría ser completamente alterada sin afectar al programa de aplicación que usa el tipo de datos.

Page 6: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-6

Conviene pensar en esto como en una muralla que separa el programa de aplicación de la implementación del tipo de datos. La única comunicación posible hacia el tipo de da-tos es a través de los parámetros de las rutinas de acceso. El único resultado de vuelta hacia el programa de aplicación es a través de la información que devuelven las rutinas de acce-so. Sin usar las rutinas de acceso adecuadas, es imposible penetrar la muralla que rodea la implementación de un tipo de datos. Esta situación se ilustra en la figura 3.1.

Figura 3.1 . Idealmente una muralla se levanta alrededor de la implementación de un TAD

de tal forma que un programa de aplicación sólo es capaz de manipular datos por medio del uso de rutinas de acceso . En este caso, la manipulación directa de los datos almacenados en la implementación del TAD no está permitida.

La separación u ocultamiento de la representación de un tipo de datos con respecto a las aplicaciones que lo usan se conoce con el nombre de encapsulación de datos. En la terminología de la ingeniería de software, la encapsulación de datos se dice que es una for-ma de ocultamiento de la información. Una ventaja que se obtiene de la encapsulación de tipos de datos es la facilidad de modificación. Como se comentó previamente, un tipo de datos encapsulado adecuadamente puede ser modificado sin afectar los programas de apli-cación que hacen uso del mismo. Esto podría ser necesario si, por ejemplo, se requiriera una implementación más eficiente. Si a un programa de aplicación 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 podrían invalidar entera-mente el programa de aplicación. Lo que haría al programa de aplicación extremadamente difícil de mantener porque la forma en que se elaboró el tipo de datos debe tenerse en cuen-ta cada vez que el programa de aplicación es modificado. Otra ventaja ofrecida por la encapsulación de los datos se refiere a la reutilización. Un tipo de datos debidamente encapsulado puede ser fácilmente reutilizado en otros pro-gramas de aplicación que requieran la funcionalidad aportada por el tipo de datos, sin tener que conocer cómo fue diseñado y construido.

Implementación del TAD

Programa de aplicación

Rutina de acceso

MURALLA

Acceso directo

Programa de aplicación

Page 7: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-7

ESPECIFICACIÓN DE LOS TAD Consideremos ahora las dos partes de la especificación de un TAD, que son: una descripción matemática de una colección de objetos, y un conjunto de operaciones defini-das en ciertos elementos de esta colección de objetos. Un enfoque riguroso de la especifi-cación de la última parte supone suministrar un conjunto de axiomas que describan comple-tamente el comportamiento de las operaciones del TAD. Estos axiomas pueden entonces ser usados para verificar formalmente la corrección del desarrollo de un TAD. Desgraciada-mente, determinar un conjunto completo de axiomas es extremadamente difícil para los TAD no triviales. Por esta razón nos preocuparemos nada más de obtener descripciones informales para las operaciones del TAD. Más abajo se muestra un ejemplo de la especificación de un TAD matriz. Esto es, especificaremos un TAD describiendo en primer lugar sus objetos de datos, y después rela-cionando las operaciones que pueden ser ejecutadas con esos objetos. El TAD MATRIZ. El tipo abstracto de datos MATRIZ se usa para representar matrices matemáticas, así como las operaciones definidas sobre matrices. Una matriz se define como una disposición rectangular de elementos organizados en filas y columnas. Una matriz de n filas y m columnas se dice que tiene un número de filas n, un número de columnas m y una dimensión n ×× m. Una matriz M de dimensión n ×× m puede ser escrita de la siguiente forma:

nmnn

m

m

aaa

aaa

aaa

L

MLMM

L

L

21

22221

11211

Donde aij representa el elemento de la fila i y la columna j. Existen numerosas operaciones definidas so-

bre las matrices. Algunas de éstas son: 1. ObtenerElemento(i, j, M). Devuelve el elemento de fila i y columna j de la matriz M. 2. AsignarElemento(i, j, x, M). Asigna el valor x al elemento de fila i y columna j de la matriz M. 3. Asignar(M1, M2). Asigna los elementos de la matriz M1 a los correspondientes de la matriz M2. Las ma-

trices M1 y M2 deben tener la misma dimensión. 4. Sumar(M1, M2). Devuelve la matriz que se obtiene cuando se suma la matriz M1 a la matriz M2. Las

matrices M1 y M2 deben tener la misma dimensión. 5. Negativa(M). Devuelve la matriz que resulta de cambiar el signo a los elementos de la matriz M. 6. Restar (M1, M2). Devuelve la matriz que se obtiene cuando se resta la matriz M1 de la matriz M2. Las

matrices M1 y M2 deben tener la misma dimensión. 7. ProductoPorEscalar(e, M). Devuelve la matriz que se obtiene cuando se multiplica la matriz M por el

escalar e. 8. Producto(M1, M2). Devuelve la matriz que se obtiene cuando se multiplican la matriz M1 y la matriz M2.

El número de columnas de la matriz M1 debe ser el mismo que el número de filas de la matriz M2. La matriz resultado tiene el mis mo número de filas que M1 y el mismo número de columnas que M2.

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 informático de este TAD debe aportar algún medio para representar

elementos matriciales y para diseñar y construir las operaciones descritas más arriba. Típi-

Page 8: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-8

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 cómo 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 colección de objetos de datos que constituyen una clase datos. Veamos este enfoque.

De la misma manera que los programas C++ son modulares y altamente estructu-

rados, así mismo son los datos con los que opera el programa. Es posible que piense que los datos son datos ¿cómo puede haber diferentes clases de datos? Primero, piense que los datos son cualquier información con las que la computadora debe operar o manipular. Así, vamos a definir un objeto dato como cualquier elemento de información que sea ma-nipulada u operada por la computadora. Muchas clases diferentes de objetos de datos exis-ten durante la ejecución de un programa. Algunos de estos objetos de datos serán definidos por el programador, como objetos constante y variable, mientras que otros, como las pilas del sistema, serán definidas por el sistema.

Ahora, piense en los tipos de información u objetos dato que maneja la computado-

ra. De seguro, una computadora maneja números o datos numéricos. Uno de los usos prin-cipales de una computadora es la realización de cálculos sobre datos numéricos. Pero ¿qué hay de los datos de tipo carácter? ¿No es cierto que la computadora maneja datos de ca-racteres cuando imprime su nombre? Esto es, los datos numéricos y los datos de carácter contienen dos diferentes clases de datos. ¿Qué los hace diferentes? Bien, los datos numéri-cos consisten en números mientras que los de carácter consisten en símbolos alfanuméri-cos. Además, las operaciones definidas por estas dos clases de datos son diferentes. En conclusión, una clase describe las características de los datos o atributos, así como opera-ciones legales o desempeño de sus objetos.

Tomemos nuevamente, como ejemplo, la clase de datos de los enteros. Estos in-

cluyen todos los valores de datos de números enteros entre menos infinito a más infinito. Más aún, hay una serie de operaciones específicamente definidas para los enteros. Estas operaciones incluyen la suma, resta, multiplicación y división, entre otras, como las que se muestran en la figura 3.2. La serie de números enteros desde menos infinito a más infi-nito, junto con sus operaciones relacionadas, forman una clase. Cualquier objeto creado por esta clase entero, como una variable entera, puede ser sólo un valor de número entero y sólo se utiliza en una operación específicamente definida para los enteros. De hecho, decimos que la clase entero forma un tipo abstracto de datos o TAD.

Una clase de datos describe los atributos de los datos y el desempeño de sus objetos.

Un tipo abstracto de datos (TAD) es una clase que describe los atributos de los datos y desempeño de sus objetos.

Page 9: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-9

Figura 3.2 . La clase entero se puede considerar un tipo abstracto de dato o clase de dato,

donde las operaciones aritméticas en los enteros definen el comportamiento de cualquier objeto definido por la clase entero.

Para su sorpresa, hay más que sólo clases de números 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 categorías principales de clases: escalar, estructurada y apuntador.

Figura 3.3 . Jerarquía de clase en el lenguaje C++. La clase escalar es aquella cuyos objetos de datos están 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 numéricos como los enteros y los

CLASE ENTERO O TAD

Operaciones: Suma() Substracción() Multiplicación() División()

Operadores para comparar objetos == != < > <= >=

Atributos de datos:

Todos los números desde - ∞∞ hasta + ∞∞

Clases

Escalar Estructurada Apuntador

Estructuras Arreglos Clases

Flotante Entero Carácter

Enumerada Estándar Listas Colas Árboles

Booleano

Pilas

Page 10: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-10

reales o de punto flotante, son claramente escalares porque todos lo números tienen esta propiedad de ordenamiento. Pronto verá que los caracteres son también ordenados, por lo tanto, se consideran una clase escalar.

Observe en el diagrama que la clase escalar puede ser estándar o enumerada. La

clase estándar es aquella predefinida en el lenguaje C++. Estas consisten en números en-teros y de punto flotante, datos de carácter y booleano. La clase enumerada es aquella que el usuario de C++ define para solucionar un problema de aplicación dado. En otras palabras, una clase enumerada describe valores de datos que serán creados dentro del pro-grama C++ para un propósito específico. Por ejemplo, es posible que quiera definir la serie de todos los días de la semana (Dom, Lun, Mar, Miér, Jue , Vie, Sáb) como una clase enumerada de datos. En este caso, los valores de los datos son los días individuales y se ordenan de Dom a Sáb. Como resultado, estos valores se pueden manejar dentro de su programa en forma similar a la clase estándar. Al principio, la idea de crear su propia serie de valores de datos le puede parecer extraña. La visibilidad de la codificación será mucho más clara. Al final de esta lección verá con más detalle este concepto.

La categoría de clase estructurada consiste en clases llamadas arreglos, estructu-

ras y clases (arrays, structs y class). Estas son clases de datos complejos, pues se hacen a partir de otras clases de datos más simples. Los arreglos no son más que una colección de datos del mismo tipo, con un nombre común. Por otra parte, su nombre, dirección y núme-ro telefónico (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 más simples como bloques de construcción.

La categoría clase (class) proporciona la base para la programación orientada a ob-

jetos (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 aplicación para controlar un cajero automático. El cajero automático se requiere para manejar diferentes objetos de datos con operaciones específicas definidas por aquellos objetos, como depósi-tos y retiros. ¿No parece una aplicación ideal para una clase, porque una clase es una co-lección de objetos de datos junto con una serie de operaciones definidas para aquellos ob-jetos? Obviamente, no hay una clase de cajero automático estándar construida dentro del lenguaje C++. Sin embargo, la construcción clase de C++ le permite construir su propia clase, digamos cajeroAutomático, la cual definirá todos los atributos de los datos y des-empeño asociado con una máquina cajeroAutomático.

Como una estructura, una clase se compone de clases de datos más simples. Ade-

más, una clase incluye funciones que operan sobre los datos de la clase. Estas funciones definen el desempeño de la clase. De esta manera, la clase C++ es ideal para la implemen-tación de TAD, porque se puede usar para definir los atributos de los datos de los TAD así como el desempeño de los mismos.

Por último, la clase apuntador (pointer) se usa para formar los TAD llamados pi-

las, 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

Page 11: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-11

LA CLASE ESTÁNDAR DE DATOS EN C++

Recuerde que la clase estándar ya viene implementada dentro del compilador C++. Esta característica integrada simplemente significa que el compilador C++ reconoce cua l-quier valor de datos legal contenido en una clase estándar. Hay cuatro clases de datos es-tándar: entero, punto flotante, carácter y booleana. CLASE ENTERO

Como ya sabe, los enteros son todos los números completos (sin parte decimal). Pueden ser positivos, negativos o cero. Su rango es de menos infinito (- ∞∞) a más infinito (+ ∞∞). Sin embargo, hay límites prácticos en el mundo real de las computadoras. En C++, los valores enteros más grandes y más pequeños posibles dependen del hardware y del compi-lador que se use.

El lenguaje C++ define seis clases de enteros que definen seis rangos diferentes. És-tos son short int (enteros cortos o pequeños), unsigned short int (enteros cortos sin signo), int (enteros), unsigned int (enteros sin signo), long int (enteros largos o grandes) y unsig-ned long int (enteros grandes sin signo).

La definición de C++ no especifica el tamaño de un int, depende del hardware y del

compilador que se utilice. Los informáticos dicen que el tamaño de un int es dependiente de la implementación o que el implementador del compilador es libre de elegir el tamaño de un int. Normalmente se elige como int el tipo de datos entero más eficiente del hardware utilizado. Para la mayoría de las PC este tamaño 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 estacio-nes de trabajo UNIX, un int ocupa normalmente 32 bits (4 bytes). Las computadoras más recientes soportan enteros de 64 bits (8 bytes). Para estas computadoras el diseñador podría escoger 64 bits para representar un int.

La especificación de C++ tampoco indica el tamaño en bits de los tipos de datos

short y long. Sin embargo, especifica que un short no será más grande que un int y que un int no será más 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 nor-malmente 32 o 64 bits.

Deberá sorprenderle por qué hay diferentes clases de enteros. ¿Por qué no sólo defi-

nir una clase que proporcione suficiente rango para la mayoría de las aplicaciones? Por ejemplo, ¿por qué no usar la clase long int todo el tiempo?, ya que proporciona el rango de valores más grande. La razón por la que C++ soporta 6 tipos de datos enteros es que hoy en día muchos artefactos se controlan mediante una computadora: horno de microonda, au-tomóviles, videos y equipos estéreo, etc. Los sistemas en los cuales la computadora juega un papel central en el funcionamiento del sistema se denominan sistemas empotrados (em-bedded systems). En la mayoría de ellos, la memoria que se utiliza para almacenar el pro-grama que controla el sistema es un recurso valioso que no debe malgastarse.

Page 12: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-12

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 fabricación del horno se encuentra en el número de chips de memo-ria que se necesitan para almacenar el programa que controla el funcionamiento del horno. Al tenerse clases enteros de varios tamaños, C++ permite al programador optimizar el uso de la memoria en el programa. Escogiendo el tipo de objeto de tamaño adecuado, el pro-gramador puede reducir las necesidades de memoria del programa. Si el diseño 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 represen-

tar 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; además, 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 aplicación de-terminada. Para la mayoría de las aplicaciones, int es suficiente, proporciona una ejecución y utilización 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 aritméti-cas normales, como suma, resta, multiplicación, división y una nueva, la operación de módulo. C++ también tiene operadores para comparar dos objetos enteros. Las seis ope-raciones de comprobación 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++ típico.

NOTA: Dependiendo de su aplicación, en algunas ocasiones requerirá trabajar con valores en base octal

o en base hexadecimal. En tal caso, requiere una notación para indicarle al compilador que desea traba-jar con valores que no son decimales. Si precede a un valor numérico 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 hexa-decimal en la tabla 3.1). NOTAS DEL COMPILADOR

Sepa que el estándar ANSI C++ reconoce que los rangos de las clases de datos estándar 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.

Page 13: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-13

Tabla 3.1. Clase entero y rangos correspondientes en un compilador C++ típico Tipo de dato Tamaño en bytes Rango Ejemplos

short int o short 2 -32768 a 32767 2456 unsigned short int

o unsigned short

2

0 a 65535

0xFF, 42324

int

2 o 4

Depende de la plataforma: -32768 a 32767 para 16 bits, -2147483648 a 2147483647 para 32 bits.

4175

unsigned int

2 o 4

Depende de la plataforma: 0 a 65535 para 16 bits, 0 a 4294967295 para 32 bits

0xFFFF,

65535 long int o long

4 -2147483648L a 2147483647L 0xFFFFL, -123456L

unsigned long int o

unsigned long

4

0L a 4294967295L

123456L

CONSTANTES En la sección anterior se presentó la clase entero de C++. Ahora se va a examinar cómo escribir constantes de esta clase. De nuevo, en comparación con otros lenguajes de programación, en C++ las constantes de cada tipo se pueden escribir en una amplia varie-dad de formas. CONSTANTES ENTERAS La forma más fácil para escribir una constante entera en C++ es escribir simple-mente el número. Por ejemplo : 38, 89, 625, 378. Son cuatro constantes enteras válidas 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 tamaño 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 añadir una l o L al final del número. Así, las constantes: 29L, 47L, 294L, 568L son de clase long. No es aconsejable utilizar una l minúscula, ya que se puede confundir fácilmente con el dígito 1. No hay modo de especi-ficar constantes enteras de clase short. Si la constante entera no tiene sufijo, entonces el compilador escoge la clase basándose en el tamaño del valor. Si el valor se puede almace-nar 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 podría 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 núme-

Page 14: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-14

ro en base 8. Las siguientes constantes: 048, 087L, 047, 020, son números en base 8 que repre-sentan 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 válidas en C++. Para utilizar base 16, se debe emplear el prefijo 0x o 0X. En una constante hexade-cimal, los caracteres entre a y f o A y F representan los dígitos 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 más dígitos octales; el primero debe ser cero L o l opcional

digitosOctales [ L | l ] Comienza con 0x o 0X secuencia de uno o más especificador de dígitos hexadecimales tipo opcional

( 0x | 0X ) digitosHexadecimales [ L | l ]

En el ejemplo anterior, la sintaxis de C++ se describe empleando diagramas sintác-ticos anotados. Por ejemplo, el diagrama sintáctico que describe las constantes decimales es:

Secuencia de uno o más dígitos Especificador de tipo el primero debe ser distinto de cero opcional l o L

dígitos [ L | l ]

Se utiliza la barra vertical ( | ) para especificar una de varias alternativas. Los cor-chetes 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 sintáctico, los símbolos en itálica se conocen como símbolos no terminales. Esto es, representan un conjunto de posi-bilidades. En el diagrama anterior, el símbolo dígitos representa los dígitos 0, 1, …, 9. Los comentarios empleados en la notación indican que el primer dígito no puede ser un cero.

Quizá sea interesante comentar que no se ha hecho ninguna mención de los números

negativos. La razón 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 interpretación formal es que el operador unario menos se aplica a la constante. El signo menos no forma parte de la constante. El signo mas también se puede aplicar a una constante entera y no cambia el valor de la constante. C++ incluye el signo más por simetría con el operador unario menos.

Veamos algunos ejemplos:

Page 15: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-15

Ejemplo 3.1

¿Cuál 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

Solución

Los valores en a, b, c y d son todos valores int legales en C++, porque todos ellos tienen números 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 numéricos en C++. Por último, el valor 32768 no es un valor int legal en C++, porque está fuera del rango predefinido int.

SUGERENCIA DE DEPURACIÓN

Esté consciente especialmente de los límites de rango de los enteros impuesto por C++ cuando reali-ce cálculos de enteros dentro de sus programas C++. Por ejemplo, multiplicando dos enteros puede fácilmen-te producir un resultado entero más allá de este rango, dando un resultado incorrecto. Esto se conoce como estado de desbordamiento o sobreflujo (overflow). Dependiendo de dónde ocurra la condición de desbord a-miento, se puede o no generar un mensaje de error durante la compilación o ejecución del programa. Incluso si ningún mensaje de error de desbordamiento es generado, la operación siempre producirá un resultado incorrecto. Ejemplo 3.2

¿Cuál de las siguientes operaciones int generará una condición de desbordamiento en C++? (Use la tabla 3.1 para determinar el rango legal de int, suponga que el símbolo * significa multiplicación y el símbolo / significa división).

a. 31 * 1000 b. 33 * 1000 c. (100 * 1000) / 5

Solución

a. 31 * 1000 = 31000 está dentro del rango predefinido int. No existe condición de desbordamiento.

b. 33 * 1000 = 33000 está fuera del rango predefinido int. La condición de desbor-damiento dará un resultado entero incorrecto.

c. (100 * 1000) / 5 = 100000 / 5 = 20000. Aunque el resultado final está dentro del rango predefinido int, ocurrirá una condición de desbordamiento generando un resultado incorrecto. ¿Por qué? Porque el resultado de la multiplicación en el numerador resulta un valor fuera del rango int.

Page 16: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-16

CLASE PUNTO FLOTANTE Los valores de datos de punto flotante incluyen todos los números enteros así co-

mo cualquier valor entre todos los números enteros que deben representarse usando el pun-to decimal. Ejemplos:

-5.56

2.7182 -5.0

Todos los valores anteriores se escribieron usando la notación punto decimal fijo . La nota-ción 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++ también ofrece una variedad de formas de escribir constantes en punto flotan-te. La sintaxis para construir una constante en punto flotante es:

Secuencia de uno o Secuencia de uno o Especificador de más dígitos más dígitos tipo opcional

dígitos.dígitos [ f | F | l | L ]

Sólo se puede omitir uno de éstos Por ejemplo: 3.74, 2.7182, 48.00, .56, 0.27, son todas constantes en punto flotante válidas 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++ también ofrece la posibilidad de expresar constantes en punto flotante em-pleando notación científica. Recuerde que en notación científica, un número se expresa como potencia de 10. El número 7.23 ×103 es un número en notación científica. Este núme-ro se lee como 7 punto 23 por 10 elevado al 3. El número anterior es igual a 7230.0. La forma general de un número en notación científica es: mantisa × 10 n. La sintaxis de C++ para representar números en notación científica es:

Page 17: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-17

Secuencia de cero o Exponente Especificador de más dígitos opcional 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 más dígitos

( e | E ) [ + | - ] dígitos

La mantisa puede ser un entero o un número decimal. El exponente es un entero con signo. Ejemplos válidos de constantes en punto flotante que utilizan notación científica 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 notación científica estándar. El tipo de una constante en punto flotante se puede especi-ficar utilizando los sufijos mencionados anteriormente. En el ejemplo anterior, puesto que no hay ningún sufijo, todos los números son de clase double. Las constantes:

1.23E10F 0.23E-4f 45.e+23L 26.68E12L

tienen los mismos valores que los números expresados en notación científica, pero los dos primeros son de clase float y los dos segundos son de clase long double. De forma análoga a lo que se describió sobre las constantes enteras, las constantes en punto flotante no tienen signo. Una constante se puede hacer negativa aplicándola el signo menos. Veamos algunos ejemplos:

Ejemplo 3.3

Convierta los siguientes valores exponenciales a valores decimales fijos.

a. 2.32e3 b. 1.45e-6 c. -45.02e-4 d. -7.333e7

Solución

a. 2.32e3 = 2.32 ×× 103 = 2320.0

b. 1.45e-6 = 1.45 ×× 10-6 = 0.00000145

Page 18: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-18

c. -45.02e-4 = -45.02 ×× 10-4 = -0.004502 d. -7.333e7 = -7.333 ×× 107 = 73330000.0

Ejemplo 3.4

En comunicación 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 Símbolo Significado pico p 10-12 nano n 10-9 micro µµ 10-6 mili m 10-3 kilo k 10+3

mega M 10 +6 giga G 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. Exprese cada una de las cantidades listadas en formato exponencial. b. Exprese cada una de las cantidades listadas en formato decimal fijo.

Solución

a. Para expresar en formato exponencial, simplemente convierta el prefijo a su potencia respectiva de 10 con el uso de la tabla 3.2. Después, use la notación 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

Page 19: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-19

Ejemplo 3.5

C++ incluye algunas funciones estándar que pueden ser accesadas para realizar funciones específicas. Una función estándar es una operación predefinida que el compilador C++ re-conoce y evalúa para dar un resultado.

Una de dichas funciones es la función sqrt() La función sqrt() se utiliza para buscar la raíz cuadrada de un número de punto flotante. Por ejemplo, la ejecución de sqrt(2) regresará el valor de 1.414. Por otra parte, una operación no incluida como una función estándar es la función square (al cuadrado). Deberá escribir su propia función para realizar la operación al cuadrado. Dada la función estándar sqrt(), determine el resultado de las operaciones si-guientes:

a. sqrt(4.9) b. sqrt(-75) c. sqrt(49e-30)

Solución

a. sqrt(4.9) = 2.21 b. sqrt(-75) es imaginaria y genera un error en tiempo de ejecución. c. sqrt(49e-30) = 7e-15

Se preguntará si hay algún límite práctico 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 típico C++.

Tabla 3.3. Clase punto flotante y rangos correspondientes en un compilador C++ Tipo de dato Tamaño en bytes Rango Ejemplos

float

4

3.4E-38 a 3.4E+38 y -3.4E-38 a -3.4E+38

2.35 -52.354 1.3e+10

double

8

1.7E-308 a 1.7E+308 y -1.7E-308 a -1.7E+308

12.354 -2.5e+100 -78.32544

long double 10 3.4E-4932 a 1.1E+4932 y -1.1E-4932 a 3.4E+4932 8.5e-3000

A mayor rango de valor, mayor será la precisión que se obtendrá cuando se utilicen

valores de punto flotante. Sin embargo, como puede ver en la tabla 3.3, cuesta más espacio de memoria obtener una gran precisión cuando usa clases de punto flotante. La aplicación sugerirá la precisión requerida y por lo tanto, la clase de punto flotante que deberá utilizar. Para la mayoría de las aplicaciones, la clase float proporciona la precisión necesaria. Sin embargo, muchos programadores prefieren usar la clase double para asegurar una precisión adecuada.

C++ proporciona las operaciones aritméticas usuales sobre tipos de datos en punto

flotante, así como operaciones de comparación.

Page 20: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-20

CLASE CARÁCTER

Todos los símbolos del teclado de su computadora son caracteres: los alfabéticos minúsculas y mayúsculas, los de puntuación, los números, las teclas de control, y los correspondientes a símbolos especiales. La mayoría 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 carácter tiene un código de representación

numérico único. Para que la CPU trabaje con datos de carácter, los caracteres individuales deben ser convertidos a código numérico. Cuando presiona un carácter sobre el teclado, la CPU observa la representación numérica de ese carácter, no el carácter mismo. La tabla 3.4 proporciona equivalentes decimales de los caracteres ASCII.

Ejemplo 3.6

C++ incluye una función estándar llamada toascii( ). Esta función se usa para generar o regresar, la representación numérica para cualquier carácter. Determine el resultado de las siguientes operaciones usando la tabla 3.4 . a. toascii(�A�) b. toascii(�Z�) c. toascii(�a�) d. toascii(�z�) e. toascii(�#�)

Solución

Con el uso de la tabla 3.4, obtendrá lo siguiente: a. toascii(�A�) = 65 b. toascii(�Z�) = 90 c. toascii(�a�) = 97 d. toascii(�z�) = 122 e. toascii(�#�) = 35

El ejemplo anterior señala algunas características de la clase carácter. Primero, cada ca-rácter tiene una representación numérica única dentro de la computadora. Debido a que para cada uno hay una representación numérica única, los caracteres están ordenados. Es-ta es la razón del porque se clasifican como escalares. Por ejemplo, �A� < �Z�, porque la re-presentación numérica para �A� (65) es menor que la representación numérica para �Z� (90). De igual manera, �#� < �a�< �z�, ya que 35 < 97 < 122. Observe que cuando se especifi-ca un carácter, se encierra en comillas simples como éstas: �a�. Esto lo requiere el compila-dor C++.

Page 21: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-21

Tabla 3.4. Tabla de códigos de caracteres ASCII

Dec Char Dec Char Dec Char Dec Char

0 ^@ NUL 32 SPC 64 @ 96 ` 1 ^A SOH 33 ! 65 A 97 a 2 ^B STX 34 ” 66 B 98 b

3 ^C ETX 35 # 67 C 99 c 4 ^D EOT 36 $ 68 D 100 d

5 ^E ENQ 37 % 69 E 101 e

6 ^F ACK 38 & 70 F 102 f 7 ^G BEL 39 ’ 71 G 103 g

8 ^H BS 40 ( 72 H 104 h 9 ^I HT 41 ) 73 I 105 i 10 ^J LF 42 * 74 J 106 j 11 ^K VT 43 + 75 K 107 k 12 ^L FF 44 , 76 L 108 l 13 ^M CR 45 - 77 M 109 m 14 ^N SO 46 . 78 N 110 n

15 ^O SI 47 / 79 O 111 o

16 ^P DLE 48 0 80 P 112 p 17 ^Q DC1 49 1 81 Q 113 q

18 ^R DC2 50 2 82 R 114 r 19 ^S DC3 51 3 83 S 115 s

20 ^T DC4 52 4 84 T 116 t 21 ^U NAK 53 5 85 U 117 u 22 ^V SYN 54 6 86 V 118 v

23 ^W ETB 55 7 87 W 119 w 24 ^X CAN 56 8 88 X 120 x

25 ^Y EM 57 9 89 Y 121 y

26 ^Z SUB 58 : 90 Z 122 z 27 ^[ ESC 59 ; 91 [ 123 {

28 ^\ FS 60 < 92 \ 124 | 29 ^] GS 61 = 93 ] 125 }

30 ^^ RS 62 > 94 ^ 126 ~

31 ^-- US 63 ? 95 -- 127 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 carácter y rangos en C++

Tipo de dato Tamaño en bytes Rango Ejemplos Char 1 -128 a 127 �A�, �!� signed char 1 -128 a 127 23 unsigned char 1 0 a 255 200, 0x1A

Page 22: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-22

La clase char permite todos los caracteres ASCII mostrados en la tabla 3.4. La cla-se unsigned char también permite todos los caracteres ASCII mostrados en la tabla 3.4 pero, además, 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 documentación de su PC). La aplicación sugerirá qué tipo de carácter usar. La clase char es suficiente para la mayoría de las aplicaciones en estas lecciones.

Los caracteres se almacenan en la computadora como valores enteros, de manera

que podrá realizar operaciones aritméticas sobre los datos de clase carácter. Por ejemplo, podrá adicionar 1 al carácter �A� y obtener el carácter �B�. Éste es un ejemplo de la flexibi-lidad del lenguaje C++; sin embargo, con esta flexibilidad existe mayor responsabilidad. Otros lenguajes, como Pascal, no le permiten realizar operaciones aritméticas de caracte-res.

PRECAUCIÓN

C++ le permitirá realizar operaciones aritméticas con datos de caracteres. Sin embargo, tenga cui-dado porque algunas veces los resultados pueden ser difíciles de predecir. ¿Qué se obtendrá cuando adicione un carácter �A� al carácter �B� o cuando multiplique estos dos caracteres? CADENA DE CARACTERES

Una cadena (string) es simplemente una colección de caracteres. Ejemplos de ca-denas son su nombre, dirección y número de teléfono, así como la oración que está leyen-do ahora. Cuando opera con cadenas, debe recordar que todavía está operando con carac-teres individuales.

La figura 3.4 muestra cómo C++ almacena las cadenas en la memoria. Como pue-

de ver, cada carácter individual se coloca en una celda de memoria de 1 byte. La colección de celdas que tienen la cadena se llama arreglo (array). Estudiaremos los arreglos con más detalle en otra lección. Por ahora sólo es importante que comprenda cómo se usan para almacenar datos cadena.

Las celdas individuales en el arreglo se identifican por un número que indica su po-

sición, empezando por la [0]. La última posición en el arreglo cadena siempre contiene el carácter �\0� para terminar la cadena. Este carácter �\0� se conoce con el nombre de carácter de terminación nulo o simplemente carácter nulo. El carácter nulo le dice a C++ dónde finaliza la cadena en la memoria.

Como se observa en la figura 3.4, el carácter �C� se localiza en la posición [0] del

arreglo y el carácter nulo se localiza en la posición [3] del arreglo. Observe que el arre-glo requiere cuatro celdas para almacenar una cadena de tres caracteres debido al requeri-miento del carácter nulo.

Figura 3.4 . C++ almacena cadenas de caracteres en arreglos que finalizan con un carácter

nulo.

C + + \0

[0] [1] [2] [3]

Page 23: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-23

Las cadenas C++ siempre se encierran en dobles comillas, como éstas: "C++". Recuerde que los caracteres individuales se encierran en comillas sencillas. Así �a�, deno-ta un carácter individual, mientras "a" significa una cadena de un carácter.

Ejemplo 3.7

De acuerdo con las siguientes cadenas, determine cuántos bytes se requieren para guardar cada cadena y muestre cómo aparecerán en la memoria.

a. "¡Este es un texto grandioso!" b. "w" c. "4321"

Solución

a. Esta cadena necesita 29 bytes de almacenamiento. El arreglo de la cadena correspon-diente se muestra en la figura 3.5a.

b. Esta cadena necesita 2 bytes de almacenamiento. El arreglo de la cadena correspon-diente se muestra en la figura 3.5b.

c. Esta cadena necesita 5 bytes de almacenamiento. El arreglo de la cadena correspon-diente se muestra en la figura 3.5c.

[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]

(a)

(b)

(c) Figura 3.5 . Soluciones para el ejemplo 3.7 .

SUGERENCIAS DE PROGRAMACIÓN

Las dobles comillas que encierran un número, como "4321", indican una cadena de caracteres y no datos numéricos. De hecho, la cadena "4321" requiere 5 bytes de almacenamiento, mientras que int 4321 requiere únicamente 2 bytes. Además, las operaciones aritméticas no pueden realizarse con la cadena "4321". Por estas razones, los datos numéricos deben representarse usando una clase numérica y no la clase carácter.

t e e s u n t e x t o

a n d o s g r o i

\0 w

4 3 2 1 \0

!

\0

¡ s E

Page 24: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-24

CONSTANTES DE TIPO CARÁCTER Y DE CADENAS Una constante de cadena de caracteres es una secuencia de ninguno, uno o más caracteres encerrados entre dobles comillas.

Esta idea funciona bien para caracteres que tienen una representación simbólica, pero también se necesita la posibilidad de especificar caracteres especiales que no tienen una representación impresa, tales como un pitido o alerta, el retorno de carro o la alimen-tación de página. Para incluir un carácter especial en una cadena de caracteres, C++ define un mecanismo de escape. La idea es utilizar un carácter especial que se denomina carácter de escape, que se emplea para cambiar el significado del carácter que le sigue. En C++, el carácter de escape es la barra invertida �\� (backslash). Así, por ejemplo, para escribir una constante de cadena de caracteres que incluya el carácter de nueve línea, se debe escribir: "¡Hola a todos!\n". La diagonal invertida indica que el carácter n no se interpreta como la constante n, sino como el carácter de nueva línea. Suponga que se desea escribir una constante de tipo cadena de caracteres que inclu-ya 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 carácter Nombre ASCII Secuencia de escape en C++ Nueva línea NL \n

Tabulador horizontal HT \t Tabulador vertical VT \v

Retroceso (backspace) BS \b Alimentación de página FF \f

Alerta o pitido BEL \a Retorno de carro CR \r

Barra invertida (backslash) \ \\ Comilla simple � \� Comillas dobles " \"

Signo de interrogación ? \?

C++ proporciona un mecanismo de escape adicional para especificar caracteres en una constante de cadena en la que se da el valor numérico de un carácter (de la definición del conjunto de caracteres ASCII). Lo curioso es que el número se debe representar en oc-tal o hexadecimal. No se permite la notación decimal. De esta forma, se puede incluir un carácter utilizando algunas de las formas: \0oo o \xhh, donde oo y hh son, respectivamente, números octales o hexadecimales. Por ejemplo, la constante: "¡Hola a todos!\012", es exac-tamente la misma cadena de caracteres que : "¡Hola a todos!\n", debido a que 128 es el código ASCII del carácter de nueva línea. 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 codificación para cualquier carácter especial.

Page 25: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-25

Como antes dijimos, cuando se almacena una constante de cadena de caracteres en memoria, los caracteres individuales se almacenan en posiciones de memoria consecutiva. Después del último carácter se añade el carácter nulo (�\0� ). Esta convención de terminar las cadenas de caracteres con el carácter nulo permite una fácil comprobación del final de las cadenas. También significa que no es necesario almacenar la longitud de la cadena de caracteres como parte de su representación. Cada carácter ocupa 1 byte. El carácter nulo al final de la cadena no se incluye cuando se cuenta el número de caracteres. El número de caracteres que contiene una cadena de caracteres se conoce con el nombre de tamaño de la cadena de caracteres. La constante sin ningún carácter: "", con frecuencia se denomina cadena nula o cadena vacía. No contiene ningún carácter, es decir, su tamaño es 0. Recuérdese, sin em-bargo, que también incluye el carácter nulo al final, y por lo tanto, ocupa 1 byte en memo-ria. En algunas ocasiones se necesita representar un único carácter. En C++ las constan-tes de tipo carácter se crean encerrando el carácter deseado entre comillas simples ( � ). Por ejemplo: �a� �1� �+� �;� son constantes válidas en C++. Se puede emplear el mecanismo de escape descrito para cadenas de caracteres para crear constantes de tipo carácter para cualquier carácter especial que no tenga una repre-sentación impresa. Así por ejemplo, para escribir el carácter literal de nueva línea, se debe escribir: �\n�. De igual manera, la barra invertida indica que el carácter n no se interpreta como la constante n, sino como un carácter de nueva línea. Suponga que se desea escribir un carácter que tenga el valor de la comilla simple. De nuevo, se puede utilizar el mecanis-mo de escape y escribir: �\��. La barra invertida indica que la comilla simple de enmedio es el carácter que se está definiendo. También se puede utilizar secuencia de escape numéricas para escribir constantes de tipo carácter. Se puede escribir un carácter utilizando una de las dos formas siguientes:

�\0oo� o �\xhh�

donde oo y hh son números octales y hexadecimales respectivamente. A continuación, se muestran constantes legales en C++ utilizando la forma octal: �\033� �\06� �\0177�

Estos caracteres denotan en código ASCII los caracteres ESC (escape), ACK (reco-nocimiento) y DEL (borrar) respectivamente. Es típico en el estilo de C++ incluir el cero inicial para representar un número en base 8. La siguientes son las mismas constantes:

�\33� �\6� �\177�

Los caracteres:

�\x1b� �x6� �\x7f�

Page 26: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-26

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 más 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 condición dada es cierta o falsa.

El estándar ANSI C++ define un objeto de clase booleano utilizando bool. Esta cla-

se 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 más ade-lante este concepto: palabras reservadas) y por lo tanto, no se pueden usar para otro propó-sito. bool es la clase de datos más nueva que utiliza C++. Como resultado, compiladores anteriores no incluyen la clase bool y sus elementos correspondientes de true y false. Cuan-do use un compilador que no cumpla con el estándar, tendrá que crear su propia clase booleana utilizando la clase enumerada (que será estudiada al final de esta lección) para definirla.

OBJETOS CONSTANTE Y VARIABLE

Recuerde que un objeto dato contiene datos que manejará su programa. Hay dos ca-tegorías diferentes de objetos datos: objeto constante y objeto variable. En matemáticas, usted sabe que una constante es un valor que nunca cambia, permanece fijo. Un ejemplo común es la constante PI (ππ ). El símbolo griego ππ se usa para representar un valor de pun-to flotante de aproximadamente 3.14159. Este valor de ππ nunca cambia, más aún, perma-nece constante sin importar dónde y cómo debe usarse en un cálculo.

Por otro lado, una variable es algo que puede tomar valores diferentes. En matemá-

ticas, los símbolos x y y se usan a menudo para denotar variables. Usando la ecuación 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 ecuación son variables.

NOMBRES DE LOS OBJETOS DE DATOS

Los valores de los objetos variable se almacenan en la memoria principal de traba-

jo para después ser usados dentro de un programa. Cada objeto variable tiene un nombre simbólico que localiza su valor en memoria. Esta idea se muestra en la figura 3.6. El con-tenido de la memoria localizado por los símbolos x, y, y contador puede cambiar durante la ejecución del programa. Como consecuencia, estos símbolos se conocen como objetos variables.

EXAMEN BREVE 3-2

Page 27: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-27

Memoria principal de trabajo x Nombres simbólicos y contador

Figura 3.6 . Cada objeto variable tiene un nombre simbólico que localiza su valor en me-moria.

Un componente importante de un lenguaje de programación es la regla que emplea para construir nombres válidos. A continuación se presentan algunas reglas para manejar el uso de nombres en cua lquier compilador C++:

• El primer carácter debe ser una letra o el símbolo de subrayado,_,. • Los caracteres subsecuentes pueden ser letras de la a a la z, de la A a la Z; los dígitos

de 0 a 9, y el símbolo de subrayado,_,. • No se permite ningún espacio o puntuación, excepto el símbolo _. • De manera predeterminada, la longitud máxima de un nombre es de 32 caracteres

(puede cambiarse en las opciones del compilador). • Los nombres en C++ difieren si la letra es mayúscula o minúscula. De esta manera, el

compilador ve a los nombres impuesto e IMPUESTO como dos identificadores dife-rentes.

• Los nombres no pueden ser palabras reservadas o claves como int, double, static por nombrar unos cuantos (ver más adelantes palabras reservadas).

Ejemplos de nombres válidos en C++ son:

x_digitos x1 puntuacion datos puntuacionMedia temp num_intentos Ejemplos de cadena de caracteres que no son nombres válidos en C++ son:

2incorrecto caliente? $al A#

Los nombres son sensibles a las mayúsculas y minúsculas; esto es, para que dos nombres sean iguales, deben deletrearse de la misma forma, incluyendo si las letras son mayúsculas o minúsculas. Por ejemplo los nombres: numDeIntentos y numdeIntentos son diferentes debido a que el primero emplea una d mayúscula y el segundo una minúscula. Una cuestión interesante es la longitud que puede tener un nombre. La definición de C++ no impone ningún límite a la longitud de un nombre. Sin embargo, algunas im-plementaciones de C++ son deficientes en esta área y sólo pueden utilizar los primeros n

Page 28: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-28

caracteres de un nombre para determinar nombres iguales. Por ejemplo, el compilador Turbo C++ utiliza los primeros 32 caracteres del nombre. Otros compiladores pueden uti-lizar más 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 programación, C++ tiene dos clases de nombres: pala-bras reservadas e identificadores. PALABRAS RESERVADAS Algunas palabras son reservadas como parte del lenguaje y no pueden ser utiliza-das por el programador para nombrar objetos. Estos nombres especiales se denominan pa-labras reservadas. La tabla 3.6 lista las palabras reservada de C++. Las palabras reservadas tienen un significado especial para el compilador y no pue-den ser cambiadas por el programador. Ya se han tratado algunas de estas palabras reser-vadas: 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 pala-bras reservadas.

Tabla 3.6. Palabras reservadas en C++

asm else operator throw auto enum private true

bool explicit protected try

break extern public typedef case false register typeid

catch float reinterpret_cast typename char for return union

class friend short unsigned

const goto signed using const_cast if sizeof virtual

continue inline static void default int static_cast volatile

delete long struct wchart_t

do mutable switch while double namespace template

dynamic_cast new this

Recuerde que los nombres son sensibles a las mayúsculas y minúsculas y, por defi-nición, las palabras reservadas constan únicamente de letras minúsculas. Así, las cadenas de caracteres: Continue, Do, Char, no son palabras reservadas.

Page 29: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-29

IDENTIFICADORES Un identificador es un nombre definido y con significado, dado por el programa-dor. La regla para construir un identificador válido es que debe ser un nombre válido en C++ y no puede ser una palabra reservada. Ejemplos de identificadores válidos en C++ son:

impuesto n precio flujo primer_valor tmp

Una buena práctica de programación consiste en elegir identificadores que conno-ten el propósito del objeto que se esta nombrando. Por ejemplo, suponga que está escri-biendo un programa que calcula y almacena el número de estudiantes de una clase. Se po-dría elegir el identificador e para nombrar el objeto que almacenará el número de estudian-tes de la clase, pero este identificador no es muy descriptivo. En el otro extremo, se podría elegir numero_de_estudiante_de_la_clase, pero este identificador podría ser tedioso de escribir. Normalmente, hay un término medio. El identificador: numEstudiantes, es mu-cho más corto y bastante claro. En estas lecciones, se adoptarán 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 más palabras con el propósito de que sea claro, se seguirá la convención de escribir en mayúscula la primera letra a partir de la segunda pala-bra. Así, por ejemplo, se podrían 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 pérdida 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 intro-ducirán nuevas convenciones de nombrado.

Uso de subrayados

Aunque C++ permite el uso del carácter de subrayado al comienzo de los nom-bres, su uso debería 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 deberían evitarse, ya que son re-servados por algunos compiladores de C para nombrar las rutinas del sistema operati-vo. Algunas implementaciones de C++ utilizan bibliotecas de C.

DECLARACIÓN DE OBJETO CONSTANTE VERSUS DEFINICIÓN 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 razón 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

Page 30: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-30

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 programación. En realidad, una declaración especifica el nombre y los atributos de un valor, pero no reserva almacenaje. Por otro lado, una defini-ción es una declaración que también reserva almacenaje. Ésta es la razón por la que de-claramos objetos constante y definimos objetos variable en C++.

Una definición introduce el nombre del objeto en el programa y especifica la clase

del objeto. Una forma común de una definición en C++ es: Una clase conocida Una lista de uno o más identificadores

válidos 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 definición:

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 definición son: int x; int cntPalabras, radio, altura; float tiempoDeVuelo, kilometraje, velocidad; Ninguno de estos objetos tiene valor inicial. También se permite que los objetos tomen un valor inicial cuando se definen. La sintaxis de C++ para este tipo de definición es:

clase id = constante, id = constante, … , id = constante; La definición: int suma = 0; es equivalente a la primera definición, pero inicia liza suma a cero. Otros ejemplos de este tipo de definición son: float impuesto = 0.06; char letra = �a�; La primera definición 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�.

Page 31: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-31

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 definición que se han presentado se pueden emplear juntas. La siguiente definición 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 continuación haremos un estudio más a detalle de lo antes expuesto:

FORMATO DE DECLARACIÓN 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 compilación. Para identificar constantes con facilidad dentro de un programa, sugerimos que los identi-ficadores constantes tengan todas las letras en mayúsculas. De esta forma, es mucho más claro que ninguna declaración debe intentar modificar el valor constante. Se usa un signo igual (=) para separar el identificador constante de su valor declarado. Por último, cada declaración 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++. Además, su programa debe calcular el impuesto de la venta pa-ra un artículo 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.

Solución

Para usar el formato dado con anterioridad, el precio de la estampilla y su impuesto po-drían declararse como sigue:

const float ESTAMPILLA = 0.50; const float TASA_IMPUESTO = 0.07;

Page 32: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-32

Con estas declaraciones, puede simplemente usar las palabras ESTAMPILLA y TA-SA_IMPUESTO cuando realice los cálculos dentro del programa. Por ejemplo, para cal-cular el impuesto de un artículo que cuesta $100 puede escribir la expresión:

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 expresión? ¿Es un objeto constante o va-riable? Es un objeto variable, porque su valor cambiará dependiendo del precio de venta del artículo. ¿Qué clase de datos debe ser impuestoVentas? En otras palabras, ¿qué clase de datos se generan como resultado de la operación: entero, punto flotante o carácter? 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 mayúsculas para que puedan identificarse fácilmente como constantes dentro de su programa. De igual manera, se sugiere que codifique los identifica-dores variables en minúsculas. Si el identificador de una variable esta formado por palabras compuestas, se sugiere que todas las letras estén en minúsculas a excepción de la primera letra de cada palabra, a partir de la segunda, las cuales deben de estar en mayúsculas.

Observe en el ejemplo 3.8 que el identificador constante TASA_IMPUESTO cons-

ta de dos palabras, TASA e IMPUESTO. El compilador C++ no le permite separar identifi-cadores de varias palabras usando espacios, por eso, se ha elegido separar las dos palabras con el símbolo guión bajo o subrayado ( _ ). También observe que el identificador de obje-to variable impuestoVentas consta de dos palabras (las dos palabras van juntas y en minús-culas, con la primera letra de la segunda palabra en mayúscula). Estas dos técnicas se utili-zarán a lo largo de estas lecciones cuando se usen identificadores de varias palabras.

Probablemente se preguntará por qué debemos declarar constantes usando identifi-cadores. ¿Por qué no sólo se inserta el valor constante dentro de la expresión 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 están sujetas a cambio en el futuro, es más fácil declararlas al principio del pro-grama. Si posteriormente se necesitan modificar, sólo 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 DECLARACIÓN 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:

Page 33: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-33

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 vacíos 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 termi-nar la declaración. Veamos un ejemplo para ilustrar la idea.

Ejemplo 3.9

Defina tres constantes que puedan usarse para representar su nombre, dirección y número telefónico.

Solución

Con el uso de la palabra reservada const, las declaraciones apropiadas pueden ser:

const char NOMBRE[ ] = "Miguel Angel Toledo Martínez"; const char DIRECCION[ ] = "Ave. I.P.N. No. 36"; const char NUMERO_TELEFONO[ ] = "(012)345-6789";

Cuando se compila una cadena constante, se crea un arreglo con un byte por cada carácter en el arreglo, más un byte final para el carácter nulo. Por lo tanto, la constante NOMBRE en el ejemplo 3.9 ocupará 29 bytes de código de programa por cada lugar en que aparezca en el programa. Cuente los caracteres y añada uno para el terminador nulo para saber si está de acuerdo. Recuerde que los espacios y los signos de puntuación se deben contar co-mo caracteres. Probablemente se preguntará cómo y dónde se usan las constantes de cadena. Un uso co-mún es representar información que debe imprimirse a menudo, tal como una información de encabezado. Por ejemplo, cada vez que necesita imprimir su nombre en un reporte, debe simplemente insertar una instrucción dentro del programa para imprimir el identificador constante NOMBRE.

FORMATO DE DEFINICIÓN 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 inicialización opcional. Éste es el formato:

<clase> <identificador de objeto variable>; <clase> <identificador de objeto variable> = <valor de inicialización 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, des-

pués el identificador de objeto variable o nombre. Es posible terminar la definición con un punto y coma o puede adicionar un símbolo opcional de igual, =, seguido por un valor, y después el punto y coma para terminar la definición.

Page 34: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-34

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

NOTA DE PROGRAMACIÓN

Es una práctica 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 numéricas se inicializan con el valor 0 o 1 y variables de carácter se inicializan con el carácter espacio. Las cadenas (arreglos de caracteres) deben inicializarse con terminadores nulos.

Ejemplo 3.10

Hay una relación simple en electrónica, 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 símbolos,

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 usarán en el programa para reali-zar los cálculos.

Solución

Los identificadores objeto variable son V, C y R. Ahora, la pregunta es: ¿a qué clase perte-necen estos objetos variable? Se sabe que V, C y R se usarán para representar datos numé-ricos, así la decisión 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 números enteros para estas varia-bles dentro de su programa; sin embargo, esto crea un problema porque los valores de vol-taje, corriente y resistencia a menudo son valores decimales. Así que vamos a definirlos como objetos de punto flotante:

Page 35: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-35

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 cambiarán durante la ejecución del programa.

Ejemplo 3.11

Deberá escribir un programa para calcular el impuesto de un artículo vendido con una ta-sa de impuesto de ventas de 7 %. Declare los objetos constante apropiados y defina los ob-jetos variable necesarios.

Solución

Primero, debe decidir qué identificadores usará. Siempre use identificadores con palabras que mejor describan la relación constante o variable. Emplearemos la palabra impuesto-Ventas para identificar el cálculo resultante, la palabra precio para identificar el costo del artículo y la palabra TASA_IMPUESTO para identificar la tasa de impuesto de ventas. Así que, con el uso de estos identificadores, los cálculos de impuestos de ventas deberán ser:

impuestoVentas = precio * TASA_IMPUESTO;

Ahora, la pregunta es: ¿qué objetos son constantes y cuáles son variables? Obviamente los objetos precio e impuestoVentas son variables, porque cambiarán dependiendo del costo del artículo. Sin embargo, TASA_IMPUESTO es un objeto constante, sin importar el costo del artículo. Así que, definiremos a precio e impuestoVentas como objetos variable y TA-SA_IMPUESTO como un objeto constante:

const float TASA_IMPUESTO = 0.07; float impuestoVentas = 0.0; float precio = 0.0;

Observe que ambos objetos variable se definen de punto flotante, porque ambos serán valo-res decimales. Suponga que definió la tasa de impuesto como un objeto variable más que como un objeto constante y que lo inicializó con el valor 0.07, así:

float tasaImpuesto = 0.07;

No hay problema con esta definición. El compilador reservará almacenamiento para el ob-jeto 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 podría modificarlo si se declarara como objeto constante.

SUGERENCIA DE ESTILO

La mayoría de los compiladores C++ permiten identificadores o nombres, que tengan cualquier lon-gitud, siempre y cuando los primeros 32 caracteres sean significativos. Por lo tanto, sus programas serán mucho más legibles y se documentarán por ellos mismos si usa palabras, más que letras y símbolos, para representar objetos variable. Por ejemplo, la definición de los objetos variable en el ejemplo 3.10 sería mu-cho más legible para un usuario no técnico si se hubieran definido voltaje, corriente y resistencia de este modo: float voltaje = 0.0;

Page 36: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-36

float corriente = 0.0; float resistencia = 0.0;

Con el uso de esta definición, las palabras voltaje, corriente y resistencia se deben usar dentro del programa cuando se aplique la ley de Ohm. Así, la declaración que se necesita para calcular el voltaje debe aparecer en su programa como sigue:

voltaje = corriente * resistencia; Observe el uso del símbolo, =, en esta ecuación. Es la forma para asignar cantida-

des en C++, por esta razón se le conoce con el nombre de operador de asignación, ejem-plos:

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 repre-sentar los días de la semana. Suponga que los días de la semana se representan por la pri-mera letra de cada día.

Solución

Vamos a seleccionar un identificador variable significativo, como diasSemana . Ahora, de-bido a que los días de la semana se representarán con la primera letra de cada día, el obje-

Page 37: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-37

to debe ser de clase carácter. Cuando se definen objetos carácter, se utiliza la palabra re-servada char en la definición del objeto, como sigue:

char diasSemana;

¿Hay algún problema en la definición del ejemplo 3.12? No hay errores de sintaxis y es perfectamente legal en lo que respecta a C++. ¿Pero hay algún problema asociado con el uso de este objeto? Un objeto carácter está limitado para representar un carácter sencillo en un momento determinado. Esto es porque cada día de la semana se debe representar por una sola letra. Sin embargo, el uso de la primera letra de cada día crea un problema. ¿Una �M� representa Martes o Miércoles? La solución a este dilema se encuentra en los objetos variable cadena.

FORMATO DE DEFINICIÓN 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 continuación los formatos:

char <identificador objeto>[ <tamaño máximo de la cadena + 1 > ];

FORMATO DE DEFINICIÓN DE UN OBJETO VARIABLE DE CADENA CON UN VALOR INICIAL

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

En el primer caso, el compilador debe conocer el tamaño máximo de la cadena,

más 1. Se especificará el tamaño para que el compilador sepa cuánta memoria reservar para almacenar la cadena. El tamaño será lo suficientemente grande para que el tamaño máximo de la cadena pueda contener el carácter terminador nulo.

En el segundo caso, no es necesario especificar un tamaño para la cadena porque el

compilador determinará la cantidad de memoria que reservará para el valor de la cadena inicializada. Es posible especificar un tamaño máximo de cadena; sin embargo, deberá ser tan grande como la longitud del valor inicial, más 1. La inicialización de un objeto cadena para un valor es básicamente lo mismo que definir un valor constante de cadena; sin em-bargo, no se emplea la palabra reservada const. Recuerde, un objeto constante nunca cam-bia dentro del programa, mientras que un objeto variable de cadena podrá cambiar en cua l-quier momento durante la ejecución del programa. Ejemplo 3.13

La definición de objetos carácter en el ejemplo 3.12, tiene un problema cuando se represen-tan los días de la semana, ya que un objeto carácter representa un solo carácter. Resuelva este problema usando la definición de un objeto cadena. Defina un objeto cadena apropia-do sin un valor inicial y vuelva a escribir la definición para inicializarlo con el valor "Miércoles".

Solución

Para representar cualquier número de caracteres consecutivos es posible usar un objeto cadena. Definamos diasSemana como un objeto cadena de la siguiente manera:

Page 38: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-38

char diasSemana[10]; Con esta definición, del objeto diasSemana se puede representar el día completo de la se-mana (Lunes, Martes, Miércoles, etc.) ¿Por qué seleccionar 10 como la longitud máxima de la cadena? Porque la palabra más larga del día de la semana es Miércoles, la cual consta de 9 caracteres. Sin embargo, se deberá dejar espacio para el carácter terminador nulo, haciendo el tamaño de la cadena de 10. Es posible inicializar el objeto cadena para Miércoles con la siguiente definición:

char diasSemana[ ] = "Miércoles";

Con esta definición, la cadena "Miércoles" se almacena en memoria y se localiza por me-dio del identificador diasSemana . El compilador automáticamente inserta el carácter nulo después del último carácter, �s�.

Ejemplo 3.14

Suponga que deberá escribir un programa en C++ para pedir al usuario del programa que ingrese su nombre, dirección y número telefónico. Seleccione los identificadores de cadena apropiados y defina tres objetos cadena para representar esta información.

Solución

Vamos a llamar a los objetos nombre, direccion y numeroTelefonico respectivamente. Ahora, deberá decidir la longitud máxima de cada objeto cadena. No olvide incluir los es-pacios, símbolos especiales y el carácter 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, más que subestimar la longitud. Al utilizar los identifica-dores de los objetos y las longitudes de las cadenas anteriores, la definición apropiada es:

char nombre[31] = " \0"; char direccion[31] = "\0"; char numeroTelefonico[14] = "\0";

Observe que cada objeto cadena se inicializa con una cadena de terminador nulo. Los va-lores cadena deben cambiarse dentro del programa y posteriormente mostrarse en el moni-tor.

OBJETOS BOOLEANOS

Como ya se mencionó, las variables booleanas se usan a menudo dentro de un pro-

grama para propósitos de toma de decisiones. Un compilador que cuenta con el ANSI C++ estándar contiene la clase booleana estándar, llamada bool, la cual contiene los elementos true y false. Los objetos booleanos se definen de igual manera que cualquier otro objeto. A continuación se muestra un ejemplo con esta idea.

Ejemplo 3.15

Defina un objeto booleano llamado bandera para utilizarlo en una operación de toma de decisiones. inicialice el objeto con un valor booleano false.

Page 39: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-39

Solución

Las variables booleanas suelen ser útiles en la toma de decisiones. Una variable booleana, conocida como bandera, se puede definir para este propósito como sigue:

bool bandera = false;

Con esta definición, la variable bandera se puede usar en un programa tomando uno de los valores: true o false conforme lo necesite la lógica del programa. Si su compilador no cuenta con el estándar ANSI C++, deberá definir objetos booleanos usando la clase enume-rada. La clase enumerada y sus objetos son tema de la sección 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

Recuerde que un objeto es un conjunto de atributos o valores y las operaciones que se pueden realizar sobre ellos. Una expresión es un mecanismo de C++ que permite aplicar operaciones a los objetos. Conceptualmente, una expresión es un medio por el cual se cal-culan nuevos objetos a partir de otros. Los objetos o valores sobre los que se opera se de-nominan operandos. El proceso de aplicar una operación a unos operandos se conoce como evaluación de la expresión. La evaluación de una expresión produce un resultado que tiene un tipo, así como un valor.

EXAMEN BREVE 3-3

Page 40: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-40

EXPRESIONES SIMPLES La forma más simple de expresión en C++ es una constante sin ninguna operación aplicada. Por ejemplo: 23; 18.53; �a�; El punto y coma después de cada expresión es el delimitador que emplea C++ para separar o terminar una expresión. Una expresión también puede ser un objeto sin ninguna operación aplicada. El re-sultado 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 aritméticas sobre datos ente-ros y de punto flotante. El término binario indica que el operador se aplica a dos operan-dos. Debido a que las reglas de C++ para realizar operaciones binarias son algo complica-das, se van a considerar primero las operaciones binarias que se aplican a valores enteros. Posteriormente, se considerarán expresiones que involucran operadores binarios aplicados a valores en punto flotante. Finalmente veremos cómo maneja C++ las expresiones que invo-lucran valores de clase entero y en punto flotante. Los operadores aritméticos 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 deberían hacer.

Tabla 3.7. Operadores binarios de aritmética entera

OPERACION OPERADOR EJEMPLO RESULTADO

Suma + 2 + 3; 5 + 10

< 5, int > < 15, int >

Resta - 13 – 4; 4 – 7;

< 9, int > < -3, int >

Multiplicación * 3 * 4; 5 * 11;

< 12, int > < 55, int >

División /

8 / 2; 6 / 4;

11 / 4; 4 / 5; 6 / 0;

< 4, int > < 1, int > < 2, int > < 0, int >

< indefinido, int >

Residuo o Módulo % 10 % 3; 23 % 4; 5 % 0;

< 1, int > < 3, int >

< indefinido, int >

Page 41: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-41

Note que la expresión 6 / 4 da como resultado 1 y no 1.5. Cuando se aplica a dos enteros positivos, el operador de división 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. Nótese 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 definición de C++ ofrece dos posibilidades. Estas dos posibilidades son los enteros más cercanos al cociente matemático. El implementador del compilador es libre de elegir el resultado más conveniente para la computadora que utilice. Por ejemplo, los dos posibles valores para la expresión:

-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 atención. Si el divisor es cero, el resul-tado de la división es indefinido. De hecho, en la mayoría de las computadoras, dividir en-tre cero provoca que el programa se pare con un mensaje de error. Muy relacionado con la división se encuentra el operador %, que obtiene como re-sultado el residuo de la división. Este operador también se conoce como operador módulo. Debido a que el operador módulo normalmente se implementa utilizando la instrucción de división que ofrece la computadora, comparte muchas características con el operador de división. En primer lugar, si el operador de la derecha es cero, el resultado de la operación 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 cómo realiza la división la computadora en uso. Siempre se da el caso de que la expresión:

( 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 expre-sión 7 % -2 debe producir < -1, int >. Por otra parte, si la expresión 7 / -2 obtiene el resul-tado < -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 situación se deno-mina desbordamiento o sobreflujo. Si una operación aritmética entera provoca un desbor-damiento, el valor producido por la operación es indefinido y el funcionamiento del pro-grama 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, ¿Cómo se realizan las operaciones aritméticas 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-

Page 42: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-42

lor es de clase int y el otro de clase long? Con cuatro tipos, hay 10 posibilidades diferentes de suma. Para reducir el número de casos que se debe manejar, C++ define un conjunto de conversiones que se aplican a los operandos antes de realizar cualquier operación. Estas conversiones se denominan conversiones de tipo o conversiones unarias usuales. Las con-versiones unarias usuales especifican que los valores de clase char y short deben convertir-se a clase int antes de realizar cualquier operación sobre ellos. Si los operandos son de la misma clase, no se realiza ninguna conversión, 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 operación de clase long y el resul-tado será de clase long. Todo esto puede parecer un poco complicado, pero, realmente, no es difícil. Sola-mente 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 ta-bla 3.8.

Tabla 3.8. Tipos de resultado para las operaciones binarias enteras

Tipo de operando derecho

char short int long

char int int int long

short int int int long

int int int int long

Tipo

de o

pera

n-do

izqu

ierd

o

long long long long long

Todos los operadores aritméticos, excepto el operador de módulo (%), se pueden aplicar a operandos en punto flotante (es decir, float, double y long double). Los operado-res aritméticos 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 aritmética en punto flotante

OPERACION OPERADOR EJEMPLO RESULTADO

Suma + 2.0 +.3 3; 5.1 + 10.0

< 2.33, double > < 15.1, double >

Resta - 13.6 – 4.2; 4.0 – 7.0;

< 9.4, double > < -3.0, double >

Multiplicación * 3.0 * 4.4; 7.5 * 11.0;

< 13.2, double > < 82.5, double >

División /

8.6 / 2.0; 5.0 / 4.0;

-11.0 / 4.0; 6.0 / 0.0;

< 4.3, double > < 1.25, double > < -2.75, double >

< indefinido, double >

Page 43: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-43

El operador módulo no tiene sentido cuando se aplica a operandos en punto flotante. El compilador C++ marcará como ilegal una expresión en la que un valor en punto flotante sea un operando del operador módulo. El desbordamiento es posible y una división entre cero provocará que el programa se detenga. De forma similar a lo que ocurre con las operaciones aritméticas entre enteros, las conversiones binarias usuales se aplican cuando los operandos son de distinta clase. La re-gla es muy similar a la que se utiliza para valores de clase entero, esto es el operando de menor precisión se convierte al de mayor precisión. La tabla 3.10 resume los posibles re-sultados para los operadores binarios en punto flotante con operandos de diferente preci-sión.

Tabla 3.10. Tipos de resultados para las operaciones en punto flotante Tipo de operando derecho

float double long double float float double long double

double double double long double

Tip

o de

op

eran

do

izqu

ierd

o

long double long double long double long double

OPERACIONES ARITMETICAS UNARIAS

C++ tiene varios operadores unarios. El término unario significa que el operador se aplica a su único operando. Uno de ellos, ya antes mencionado, es el operador unario me-nos para hacer negativo un valor. La expresión:

-23; se interpreta como: 0 – 23; El operador unario menos se puede aplicar a objetos con nombre que almacenan valores numéricos, por ejemplo: -i; -x; -tiempo; C++ también tiene un operador unario más, que se incluye por simetría con el ope-rador unario menos. La expresión: +244; se interpreta como: 0 + 244;

Page 44: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-44

EXPRESIONES MIXTAS

Las expresiones mixtas involucran valores de clase entero y de punto flotante. Por ejemplo, en la expresión: 23 – 13.2; el operando de la izquierda es de clase int y el de la derecha de clase double. Se necesitan reglas que indiquen cómo evaluar la expresión 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 precisión, lo que da como resultado <9.8, double>. En general, en una expresión binaria con un operando en punto flotante se realizará de acuerdo a la aritmética 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 aritméticas mixtas

Tipo de operando derecha

int long float double long double

int 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

Tipo

de

oper

ando

iz

quie

rdo

long double

long double

long double

long double

long double

long double

PRECEDENCIA Al igual que muchos lenguajes de programación, C++ permite al programador es-cribir expresiones arbitrariamente complejas utilizando operadores binarios y unarios. Co-mo ejemplo, considere el siguiente segmento de código: int i = 4; int j = 5; i + 2 * j; Hay varios resultados posibles, dependiendo del orden en el que se realicen las ope-raciones. 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 aritmética

Page 45: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-45

entera que hasta el momento hemos visto. Los operadores con mayor precedencia se apli-can antes que los de menor precedencia.

Tabla 3.12. Precedencia y asociatividad de operadores

Operador Operación Precedencia Asociatividad + - Más y menos unario

(signo) 15 Derecha

* / % Multiplicación, divi -sión, módulo 13 Izquierda

+ - Suma y resta 12 Izquierda En la expresión anterior, la multiplicación tiene mayor precedencia que la suma y por lo tanto, la multiplicación se realiza en primer lugar; el resultado de esta operación se suma al valor de i para obtener el valor de 14.

C++ permite emplear paréntesis en las expresiones. Las expresiones encerradas en-tre paréntesis se evalúan en primer lugar. Así en la expresión

(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 paréntesis se pueden anidar. En otras palabras, una expresión entre paréntesis puede contener a su vez otras expresiones entre paréntesis. En estos casos, las expresiones con paréntesis más internas se evalúan en primer lugar. Considere la si-guiente expresión:

(2 +(3 + 2 ) * 5) / (4 – 2);

La subexpresión (3 + 2) se encuentra dentro de otra expresión con paréntesis y se evalúa en primer lugar. Ahora pueden evaluarse las expresiones contenidas en los conjuntos de paréntesis más externos. El valor final es 13. ASOCIATIVIDAD

Considere la siguiente expresión:

3 * 5 / 2;

En esta expresión, los operadores tienen el mismo nivel de precedencia. Dependien-do de si la multiplicación se realiza en primer lugar o en último, el valor de la expresión 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 característica se denomina asociatividad del operador. Como se vio en la tabla 3.12, la multiplicación y la división 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 co-rrecto de la expresión es 7.

Page 46: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-46

LA CLASE ENUMERADA Y SUS OBJETOS

Otra ventaja de utilizar C++ es que permite al programador crear sus propias cla-ses de datos. Hasta este punto, se han usado las clases de datos estándar entero, punto flo-tante, carácter y booleano. Aunque estas clases predefinidas pueden usarse para casi cua l-quier tarea de programación, a menudo son insuficientes para describir un problema con claridad. Pronto descubrirá que la clase enumerada mejora la legibilidad de su programa haciéndolo más claro y orientado a la aplicación. Cuanto más claramente podamos expre-sar un problema, más fácil será entenderlo y solucionarlo.

La clase enumerada consiste en una lista de identificadores únicos y valores aso-

ciados con estos identificadores que el programador define para una aplicación en particu-lar. 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 DECLARACIÓN DE CLASES ENUMERADAS

El formato general y la sintaxis para declarar clases enumeradas son como sigue:

Ø La declaración de la clase enumerada puede incluir la definición de objetos va-riable 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 declaración de la clase enumerada y por separado la definición 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á extraña 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 estándar trabajará en forma conveniente para resolver sus aplicaciones. Por ejemplo, suponga un problema que requiera el manejo de los días de la semana. Debido a que ninguna de las clases estándar incluyen éstos como valores dentro de su rango predefinido, es posible sugerir que cada día de la semana se establezca a un valor entero con la declaración const como:

const int DOM = 0; const int LUN = 1;

Page 47: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-47

const int MAR = 2; const int MIER = 3; const int JUE = 4; const int VIE = 5; const int SAB = 6;

Después, usando esta declaración, podrá manejar los días 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 código:

Si (dia = VIE) entonces

Escribir("¡Es día de pago! ").

Debido a que ha establecido los días de la semana con valores enteros, la declara-ción 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 más conveniente para trabajar con objetos de datos no

estándar usando la clase enumerada y sus objetos. Más que usar asignaciones numéricas como antes, puede declarar la serie de días 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 in-

cluya la lista de siete identificadores (Dom, Lun, Mar, Mier, Jue, Vie, Sab) con los valo-res respectivos por omisión 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 declaración de una clase enumerada. En primer lugar le permite asignar explícitamente un valor a un identificador enumerado. Veamos un ejem-plo:

enum diasSemana {Dom = 1, Lun, Mar, Mier, Jue, Vie, Sab};

Esta declaración asigna 1 explícitamente al identificador enumerado Dom. Después el compilador asigna el siguiente entero, 2, al siguiente identificador, Lun, y así sucesiva-mente. C++ le permite asignar explícitamente un valor a cada miembro de la lista de ident i-ficadores enumerados o en forma intermitente. Lo que es más 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};

Page 48: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-48

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

En este último ejemplo, el compilador asocia al identificador false con 0 en forma predeterminada. Sin embargo, también asocia el valor 0 a SinCuidado, debido a la asigna-ción explícita.

ORDENAMIENTO DE DATOS ENUMERADOS

Una clase enumerada es también una clase escalar u ordenada. De hecho, la pala-bra enumerada significa numerada con orden. Además, el compilador C++ asigna un orden a los valores enumerados como el valor #1 < valor #2 < ... < valor #n. Esto signifi-ca que en la clase diasSemana: Dom < Lun < Mar < Mier < Jue < Vie < Sab. Como re-sultado, son perfectamente legítimas las operaciones relacionales que involucran a la clase enumerada. Por ejemplo, cons idere el siguiente seudo código:

Si(dia > Dom) Y (dia < Sab) entonces

Escribir("Es un día laborable").

En este caso, el valor de dia se compara con Dom y Sab. Usando la declaración enumerada anterior para diasSemana, dia debe ser un día de la semana si está entre Dom y Sab ¿correcto? ¿Cómo 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 declaración de clase. a. mesesAno , que consiste en los 12 meses del año. b. calificacionExamen, que consiste en las cinco letras de calificaciones (R, D, C , B, A). c. rangosEjercito, que consiste en los ocho rangos que se encuentran en el ejército.

Solución

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, Capitán, Mayor, Coronel, General};

rangosEjercito rango;

Observe la sintaxis en el código anterior. Primero, el nombre de la clase debe ser una sola palabra (sencilla o compuesta). No se permite ningún espacio o signo de puntuación. Tam-bién, observe que las palabras individuales dentro del nombre de la clase empiezan con una letra mayúscula (a partir de la segunda palabra). Esto no es un requerimiento de C++, pero se hace para mayor claridad. Después, observe como los valores se listan dentro de las lla-

Page 49: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-49

ves y están separadas por comas. Por último, es necesario un punto y coma al final de la llave derecha para marcar el final de la declaración de la clase. Vea la clase calificacionExamen un poco más de cerca. Observe que no hay comillas en torno a los símbolos de caracteres. Un error común cuando se definen símbolos de caracte-res como datos enumerados es encerrar los símbolos de datos en comillas, como debería por ser caracteres. En una declaración de clase enumerada, los símbolos de carácter no se tratan como caracteres, pero sí como valores únicos de una clase enumerada. También, deberá observar la clasificación de cada declaración. La clase calificacionExa-men se ordena de la siguiente manera R < D < C < B < A. Esto representa un ordenamien-to natural, cuando se considera la aplicación de calificación. Si las calificaciones de exa-men se declaran con caracteres, el ordenamiento debe ser lo opuesto, debido a los valores relativos ASCII de los caracteres determinados. Además, la clase rangosEjercito se ordena de acuerdo con el orden natural de los rangos, desde el más bajo (Soldado) hasta el más al-to (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 corres-pondiente llamado bandera que le permitirá usar los valores booleanos de Verdadero y Falso en un programa. Inicialice bandera a Falso como parte de la definición del objeto.

Solución Si está usando un compilador que cumple con el estándar ANSI C++, no necesita crear su propia clase booleana, porque está especificado como parte del estándar y por lo tanto, es-tá disponible como una clase estándar 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 estándar 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 boo-leano Verdadero el entero 1. Como resultado, el programador puede emplear los identifi-cadores de Verdadero y Falso en un programa en lugar de 1 y 0 respectivamente, cuando trabaja con valores booleanos. Esto hace el programa mucho más 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 asignación, como:

Sab = Vie + 1;

Otra fuente de error común es declarar en forma inadvertida los valores de datos enumerados como

cadenas, de la siguiente manera:

Page 50: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-50

enum diasSemana {"Dom", "Lun", "Mar", "Mier", "Jue", "Vie", "Sab"};

Esto siempre causará un error de compilación. De nuevo, los valores de datos individuales no son cadenas; son realmente identificadores constantes. DEFINICIÓN DE CLASES EN C++ C++ proporciona la palabra reservada typedef, para definir como alias nuevas clases basándose 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 carácter;

La palabra reservada typedef define una nueva clase a partir de otra conocida. Pue-de 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 más familiares o que describan mejor la ma-nera en que se usa la clase de datos. También 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 sustitución 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 código:

EXAMEN BREVE 3-4

Page 51: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-51

unsigned char unCaracter; typedef unsigned char byte; byte unByte; El fragmento de programa comienza declarando la variable unCaracter de clase unsigned char. La segunda línea crea una clase nueva llamada byte. Recuerde ahora que esto no es simplemente un sinónimo para unsigned char, sino una clase nueva, como si el compilador incluyera a byte en el repertorio de clases estándar. La tercera línea declara a la variable unByte de clase byte, como si byte siempre hubiera sido parte de C++. Debe ob-servar 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 también es de clase unsigned char, pero las dos variables se consideran to-davía 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 orientación a objetos es una manera natural de pensar en el mundo y de escribir programas de cómputo.

La pregunta que surge inmediatamente es ¿por qué no iniciamos desde la primera página con la

orientación a objetos? ¿Por qué estamos dejando la programación orientada a objetos en C++ hasta la espe-cialidad en computación? La respuesta es que los objetos que construiremos se compondrán de piezas de programas estructurados, por lo que primero necesitamos establecer una base con la programación estructura-da.

En esta sección presentamos los conceptos básicos y la terminología. En la especialidad en computa-

ción se cubrirán los temas relacionados con las técnicas del OOD (diseño orientado a objetos). Se analizarán el planteamiento de problemas típicos que requieren construir un sistema, determinar los objetos que se nece-sitan para implementarlo, determinar los atributos que necesitarán tener los objetos, determinar los compor-tamiento que necesitan presentar dichos objetos y especificar la manera en que tendrán 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, plan-

tas, automóviles, aviones, edificios, computadoras y demás. Los seres humanos piensan en términos de obje-tos. Tenemos la maravillosa capacidad de la abstracción, que nos permite ver imágenes en la pantalla como objetos, tales como gente, aviones, árboles y montañas, en lugar de cómo puntos de colores (llamados píxe-les). Podemos, si lo deseamos, pensar en términos de una playa, en lugar de granos de arena; de un bosque, en lugar de árboles; y de una casa, en lugar de ladrillos.

Podríamos inclinarnos a dividir los objetos en dos categorías: objetos animados y objetos inanima-

dos. Los objetos animados están vivos en algún sentido. Se mueven y hacen cosa. Los objetos inanimados, como las toallas, no hacen gran cosa. Sólo están ahí. Sin embargo, todos estos objetos tienen algo en común. Cuentan con atributos como tamaño, 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 automóvil acelera, frena, da vuelta; una toalla absorbe agua; etcétera.

Los seres humanos aprenden sobre los objetos estudiando sus atributos y observando sus comporta-

mientos. Objetos diferentes pueden tener atributos similares y presentar comportamientos similares. Pueden hacerse comparaciones; por ejemplo, entre los bebés y los adultos, y entre los humanos y los chimpancés. Los automóviles, camiones, carritos y patinetas tienen mucho en común.

La OOP (Programación 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 vehículos) tie-

Page 52: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-52

nen las mismas características. Aprovecha las relaciones de herencia, e incluso de herencia múltiple, en las que se derivan clases nuevas de objetos que heredan características de clases que ya existen y que, sin embar-go, contienen características propias únicas. Un objeto de la clase convertible tiene las características de la clase automóvil, pero el techo del convertible sube y baja.

La OOP nos da una forma más natural e intuitiva de ver el proceso de programación, por medio de la

simulación de objetos reales, sus atributos y sus comportamientos. La OOP también simula la comunicación entre objetos. Al igual que las personas se envían mensajes entre ellas (por ejemplo, el sargento que ordena a la tropa prestar atención), los objetos también 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 están íntimamente ligados. Los objetos tienen la propiedad de oculta-ción de información. Esto significa que, aunque los objetos tal vez sepan cómo comunicarse entre ellos a través de interfaces bien definidas, normalmente no se les permite saber la manera en que se implementan otros objetos; los detalles de implementación están ocultos en los objetos mismos. Con seguridad es posible manejar un automóvil sin que sea necesario saber cómo funcionan internamente el motor, la transmisión y el sistema de escape. Veremos por qué la ocultación de la información es crucial para la buena ingeniería de software.

En C y otros lenguajes de programación procedural, la programación tiende a estar orientada a la

acción, mientras que en la programación en C++ tiende a estar orientada a objetos. En C, la unidad de pro-gramación es la función. En C++ , la unidad de programación es la clase, a partir de la cual los objetos son instanciados (término rebuscado equivalente a crear) en algún momento. Las clases de C++ contienen fun-ciones.

Los programadores de C se concentran en escribir funciones. Se toman grupos de acciones que efec-

túan alguna tarea común, formando funciones, las cuales se agrupan para formar programas. En C, ciertamen-te 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 especificación 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, llama-

dos 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 función de una clase se llaman funcio-nes miembro (llamadas por lo general métodos en otros lenguajes de programación orientados a objetos). Así como a cada instancia de un tipo integrado (estándar), 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 inte-grados como bloques de construcción para construir los tipos definidos por el usuario. La atención en C++ se enfoca hacia las clases (de donde hacemos objetos), en lugar de sobre las funciones. Los sustantivos de la especificación de un sistema son los que ayudan al programador de C++ a determinar el conjunto de clases a partir del cual se crearán objetos que funcionarán 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 ins-tanciar 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 tecnología 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 podrán emplear para acelerar y mejorar la calidad de los siguientes esfuerzos de desarrollo de software. Esta es una posibilidad muy interesante.

Page 53: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-53

LO QUE NECESITA SABER Antes de continuar con la siguiente lección, asegúrese de haber comprendido los siguientes conceptos: qq Un objeto dato es cualquier elemento de información que se maneja u opera en una computadora. El

tipo más simple de objetos dato son los objetos numéricos y caracteres.

qq Una clase describe los atributos de los datos y el desempeño de sus objetos.

qq La abstracción de los datos nos permite trabajar con una clase sin preocuparnos por los detalles de la implementación interna de la clase; esto da lugar al término tipo abstracto de datos o TAD.

qq El término desempeño tiene que ver con cómo un TAD o clase, actuará y reaccionará para una ope-ración determinada. Como resultado, todas las clases (TAD) exhiben un cierto comportamiento que se determina mediante las operaciones definidas por el TAD.

qq En C++ todos los datos procesados por el programa deben de ser parte de una clase determinada.

qq Hay tres categorías de clases principales: escalar, estructurado y apuntador.

qq Los objetos de datos escalar se ordenan y consisten en datos estándar y enumerados.

qq Las clases escalares estándar incluyen las clases entero, punto flotante, carácter y booleana.

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

qq La clase punto flotante consiste en valores decimales que se representan en formato decimal de pun-to 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.

qq Los datos de carácter incluyen todos los símbolos del teclado de su computadora. Los caracteres son ordenados, porque están representados internamente usando un código numérico ASCII.

qq En C++ , hay tres clases de caracteres: char, signed char y unsigned char. La primera se usa para representar la serie de caracteres estándar ASCII. La última se emplea para representar la serie de caracteres estándar ASCII así como la serie de caracteres de PC extendida.

qq Una cadena es una serie de caracteres. C++ implementa cadenas como arreglos de caracteres, donde cada elemento en el arreglo contiene un carácter en la cadena y el últ imo elemento de la cadena es el carácter '\0', llamado terminador nulo.

qq La clase booleana, bool, consta de sólo dos elementos de datos: true y false. Los valores booleanos se usan en los programas para tomar decisiones.

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

qq Los objetos constante se declaran con la palabra reservada const seguido de su identificador, el signo de asignación (=) y su valor constante.

qq Los objetos variable se definen listando las clases variable seguidas por el identificador del objeto variable. En la definición puede incluirse un valor de inicio opcional.

qq Al igual que las constantes cadena, las variables cadena deben estar definidas como arreglos de ca-racteres.

qq El operador de asignación = asigna o da un nuevo valor a un objeto.

qq Cuando se coloca un nuevo valor en una localidad de memoria, reemplaza el valor previo de dicha localidad. El valor previo se destruye.

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

Page 54: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-54

qq Las clases de objeto de C++ short, int y long almacenan valores enteros. En una PC, un short ocu-pa 8 bits, un int 16 bits y un long 32 bits.

qq La clase de objeto de C++ char almacena un carácter. En la mayoría de las computadoras, los carac-teres se codifican utilizando el código ASCII.

qq 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 mayoría de las PC, un long double tiene el mismo ta-maño que un double, pero en otras computadoras puede ser mayor. Por ejemplo, en algunas comp u-tadoras un long double ocupa 128 bits.

qq Una constante de tipo cadena de caracteres en C++ es una secuencia de caracteres encerrados entre dobles comillas. Los caracteres especiales, tales como el carácter de nueva línea, el tabulador y la alerta, se pueden incluir en una constante de tipo cadena utilizando un carácter de escape especial.

qq 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 dígito 0. Así, 040 es una constante octal que representa el valor decimal 32. Las constantes decimales comienzan con un dígito distinto de cero y las constantes hexadecimales comienzan con el prefijo ox o OX. La constante 0x40 represen-ta el valor decimal 64.

qq C++ proporciona varios modos de escribir constantes en punto flotante. La forma más simple es uti-lizar la notación decimal estándar: 3.14149, 2.53 o 0.3512. Las constantes en punto flotante también se pueden escribir en notación científica. La constante en punto flotante de C++, 2.3 E5, representa el valor 2.3 × 105 o 230000.

qq Todas las variables de un programa C++ primero deben ser declaradas antes de utilizarlas.

qq En C++, un nombre de variable es cualquier identificador válido. Un identificador es una serie de caracteres que consiste de letras, dígitos y caracteres de guión bajo (_). Dichos identificadores no pueden iniciar con un dígito. Los identificadores de C++ pueden ser de cualquier longitud; sin em-bargo, a veces algunos sistemas y/o implementaciones imponen restricciones a la longitud de éstos.

qq Cada variable almacenada en la memoria de la computadora tiene un nombre, un valor, una clase y un tamaño.

qq Un nombre en C++ consta de una secuencia de letras (mayúsculas y minúsculas), dígitos y subraya-dos. Un nombre válido no puede comenzar con un dígito.

qq Los nombres en C++ son sensibles a las mayúsculas y a las minúsculas. Por ejemplo, los nombres Temp y temp se refieren a objetos diferentes.

qq En un programa es importante elegir nombres descriptivos y con significado. Los nombres descrip-tivos ayudan a otros programadores a entender lo que hace el programa.

qq Un objeto debe definirse antes de ser utilizado.

qq La división entera siempre trunca el resultado.

qq Las conversiones unarias usuales especifican que los operandos de tipo char o short se convierten a int antes de preceder con las operaciones.

qq Para una operación aritmética que involucra dos operandos enteros, las conversiones binarias usua-les especifican que cuando los operandos son de clases diferentes, el de clase int se convierte a long y se realiza una operación de clase long , dando como resultado un valor de clase long .

qq Para una operación aritmética que involucra dos operandos en punto flotante, las conversiones bina-rias usuales especifican que cuando los operandos son de clases distintas, el operando de menor pre-cisión se convierte a la clase del operando con mayor precisión. La operación aritmética se realiza utilizando la operación que produce un resultado de la misma clase que el operando de mayor preci-sión.

qq Una operación aritmética 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 operación de punto flotante.

qq La regla de precedencia de C++ definen el orden en el que los operadores se aplican a los operan-dos. Para operadores aritméticos, el orden de mayor a menor prioridad es: operadores unarios me-nos y más; multiplicación, división y módulo; y suma y resta.

Page 55: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-55

qq Las clases enumeradas son aquellas que declara cuando construye un programa. Las clases enumeradas se emplean en sus programas C++ para hacerlos más entendibles y orientados a aplicaciones. Estas clases de datos son declaradas usando la palabra reservada enum.

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

qq La orientación a objetos es una forma natural de pensar en el mundo y de escribir programas de cómputo.

qq Los objetos tienen atributos (como tamaño, forma, color, peso, apariencia, etc.) y presentan com-portamientos.

qq Los seres humanos aprenden acerca de los objetos estudiando sus atributos y observando su com-portamiento.

qq Objetos diferentes pueden tener muchos atributos iguales y presentar comportamientos semejantes.

qq La OOP (Programación 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 ca-racterísticas. Aprovecha las relaciones de herencia, e incluso las relaciones de herencia múltiple, donde las clases de nueva creación se derivan heredando características de clases ya existentes; sin embargo, contienen características únicas.

qq La programación orientada a objetos ofrece una manera intuitiva de ver el proceso de programación, modelando objetos reales, sus atributos y sus comportamientos.

qq La OOP también modela la comunicación entre los objetos por medio de mensajes.

qq La OOP encapsula en objetos información (atributos) y funciones (comportamiento).

qq Los objetos tienen la propiedad de ocultación de la información. Aunque los objetos pueden saber cómo comunicarse entre ellos a través de interfaces bien definidas, normalmente no pueden conocer la información de implementación de los demás objetos.

qq La ocultación de la información es crucial para la buena ingeniería de software.

qq En C y otros lenguajes de programación procedural, la programación tiende a estar orientada a la ac-ción. La información ciertamente es importante en C, pero el punto de vista es que existe principal-mente como soporte de las acciones efectuadas por las funciones.

qq Los programadores de C++ se concentran en la creación de sus propios tipos, llamados clases. Cada clase contiene datos, así como el conjunto de funciones encargadas de manipularlos. Los componen-tes de datos de una clase se llaman datos miembro. Los componentes de función de una clase se llaman funciones miembro o métodos.

Page 56: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-56

PREGUNTAS Y PROBLEMAS PREGUNTAS

1. ¿Qué es un tipo abstracto de dato o TAD?

2. Proporcione un ejemplo de un TAD.

3. ¿Cuál es el significado del término desempeño , cuando se relaciona con los TAD?

4. ¿Por qué la clase C++ es ideal para implementar los TAD?

5. Mencione las cuatro clases estándar definidas en C++.

6. ¿Qué características tiene una clase escalar sobre una clase no escalar?

7. ¿Cuáles de los siguientes no son valores enteros legales en C++? Explique, ¿por qué no son válidos? Suponga la clase int. a. –32.0 b. +256 c. 256 d. 3,240 e. 32000 f. 40000

8. ¿Qué es una condición de desbordamiento de un entero y cuando generará resultados incorrectos en C++?

9. ¿Cuál de los siguientes valores de punto flotante no son legales en C++? Explique ¿por qué no son váli-dos? 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 números decimales a su notación exponencial. a. –0.0000123 b. 57892345.45 c. 1.00004536 d. +012.345

11. Convierta los siguientes valores exponenciales a notación decimal fija.

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

12. Tres valores en un problema de comunicación 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.

Page 57: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-57

14. ¿Cuál es la clase de cada uno de lo siguientes?

a. 250 b. –250.0 c. –16 d. –3.5e-4 e. �x� f. �$� g. "2" h. "175" i. "1.25e-3"

15. Falso o Verdadero: Explique sus respuestas.

a. Los siguientes nombres de variables son válidos: _bajo_barra , m928134, t5, j7, sus_ventas, su_cuenta_total , a, b, c, z, z2.

b. Los siguientes nombres de variables son inválidos: 3g, 87, 67h2 , h22, 2h.

16. Una localidad de memoria de la computadora que puede contener valores distintos en diferentes momen-tos de la ejecución de un programa se llama _________________________.

17. Las clases enumeradas se declaran con la palabra reservada ___________________.

18. Dada una declaración de clase enumerada ¿Cómo se ordenan los valores dentro de la clase?

19. Escriba las declaraciones para las siguientes clases enumeradas. Asegúrese 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. díasSemana y finesSemana , consta de aquellos días respectivos de la semana que se presentan en

estos subrangos. e. primavera, verano, otoño e invierno , consta de aquellos meses respectivos que formas estas esta-

ciones.

20. Dada la siguiente definición.

enum colores{Azul, Verde, Amarillo, Rojo, Naranja}; colores color; ¿Cuál de lo siguiente es cierto y cuál 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¿cuáles de las siguientes declaraciones son válidas? Explique por qué una declaración en particular no es válida.

a. color = Negro; b. color = Rojo; c. color = Azul + Verde; d. color = "Amarillo";

22. Establezca la diferencia entre un objeto carácter y una cadena.

23. ¿Cuál es el rango de un entero de 32 bits?

24. ¿Cuántos bytes nulos se encuentran al final de la siguiente cadena de caracteres?

"¿Qué esta haciendo aquí|0?"

25. Indique como puede la división entera de dos valores de tipo int producir un desbordamiento.

26. ¿Cuál de los siguientes identificadores son válidos en C++?

Page 58: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-58

a. GPA

b. Grado.pnt

c. gradoMedio

d. Int

e. 1erNum

f. num1

g. rayos-x

h. R2D2

i. t2

j. 3Cpo

k. costo_medio

l. $costo

m. Era

n. int

o. PDQBach

p. ReturnV

q. A

r. _perro

s. no!

t. _123

u. Gato’s

v. main

w. Costo$

PROBLEMAS 1. Seleccione nombres apropiados y declare objetos constante para representar lo siguiente:

a. Un valor máximo 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 cumpleaños. g. Su escuela.

2. Declare una serie de objetos constante que represente los meses de un año.

3. Seleccione nombres apropiados y defina objetos variables para lo siguiente:

a. Promedio de calificaciones. b. Calificación para un curso. c. Comisión por pago con cheque. d. Nombre del estudiante, nombre y número del curso. Suponga que los nombres de estudiantes y cur-

so necesitan 25 caracteres y el número del curso es un número alfanumérico de siete posiciones co-mo ING-103.

4. Escriba una sola instrucción C++ que logre lo siguiente:

a. Declare c, estaEsVariable, q76354 y numero como variables de clase int. b. Declare x, y, z y resultado como variables de clase float.

5. Considere las siguientes declaraciones

float f1 = 23.3;

Page 59: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-59

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

¿Cuál es el resultado de las siguientes expresiones? Exprese el resultado como <valor, tipo>.

a. f1 + d1

b. i1 + d1

c. i1 + i2 * i3

d. i2 % i3

e. i3 / i2 + i1 * i3

f. f1 – f2

g. f1 – i3

h. f1 / i2 + d1

i. i2 + i3 + 3.0

j. i2 * f2 + 4

k. s1 / i3

l. c1 + f2

m. s1 + s2

n. i3 + c1

o. c1 –s2

6. Escriba en C++ expresiones equivalentes a las siguientes fórmulas matemáticas:

a. b2 + 4ac b. a + b /c + d c. 1 / (1 + x2) d. 4 / 3 ð r2 e. –(a2 – b3) f. a(b / c ) g. (a + b) (c + d) (e + f)

7. Escriba una sentencia en C++ que implemente la siguiente ecuación:

q = ( (T1 × T2) / (D – K) + T2

La sentencia debería utilizar los siguientes objetos

float q;

float k = 1.35;

float D = 9.2;

float T1 = 98.4;

float T2 = 101.12

Page 60: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-60

EXAMEN BREVE 3-1 1. Una ______________ describe los atributos de los datos y el desempeño de sus objetos. 2. Las clases que son predefinidas dentro de un lenguaje de programación se llaman clases

__________________. 3. Una serie de elementos de datos creados por el programador, para construir una aplicación se

llaman clases de datos ___________________________. 4. Las tres principales categorías de clases en el lenguaje de programación C++ son:

____________, _________________ y ____________________. 5. ¿Qué se entiende por desempeño 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 estándar int?

2. ¿Qué tipo de error ocurre cuando, como resultado de un cálculo, un valor excede su rango pre-definido?

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

toascii(�?�) 5. ¿Qué caracteres utiliza la clase caracteres sin signo?

6. Una cadena de caracteres se almacena en una estructura llamada ________________.

7. ¿Cuántos bytes de almacenamiento se necesitan para la cadena "Estados Unidos de Améri-ca"?

8. El estándar ANSI C++ especifica una clase booleana llamada ____________________ que incluye los elementos _____________________ y _______________________.

EXAMEN BREVE 3-3

1. ¿Cuáles son las dos razones para declarar o definir objetos constante y variable en un pro-grama 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 "Técnicas 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é tamaño de arreglo deberá especificar en la definición del objeto?

5. Defina un objeto variable de nombre curso que se inicializará con la cadena de caracteres: "Estructura de datos".

Page 61: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-61

EXAMEN BREVE 3-4

1. ¿Por qué querría crear una clase enumerada en su programa si se puede usar una clase están-dar?

2. Declare una clase enumerada de nombre automóviles que consista de al menos 10 marcas po-pulares de automóviles.

3. ¿Qué valor numérico 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 programación se denominan estándar. 3. Una serie de elementos de datos definidos por el programador, para cumplir con los requeri-

mientos de una aplicación se conoce con el nombre de clase de datos enumerados. 4. Las tres categorías principales de clases de datos en un lenguaje de programación estructurado

son: escalar, estructurado y apuntador. 5. El desempeño , en relación con los TDA, describe cómo actuará y reaccionará el TDA para una

operación dada. 6. Otro nombre para una estructura es registro.

7. La clase C++ es ideal para la implementación de TDA, porque se puede usar para definir los atributos de los datos de los TDA así como el desempeño de los mismos.

RESPUESTAS EXAMEN BREVE 3-2

1. El rango de valores que proporciona la clase estándar int es –32768 a +32767.

2. Un desbordamiento o sobreflujo ocurre cuando, como resultado de un cálculo, 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 serán 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 Améri-ca".

8. El estándar ANSI C++ especifica una clase booleana llamada bool que incluye los elementos true y false.

Page 62: CONTENIDO DE LA LECCIÓN 3 - azul2.bnct.ipn.mxazul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 3.pdf · MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 3 3-LECCIÓN 3

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 3 3-62

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

nar sus atributos y su desempeño.

2. const char PUNTO = �.�;

3. const char LIBRO[] = "Técnicas estructuradas y orientadas a objetos";

4. Dado un objeto cadena que deberá almacenar una cadena de hasta 25 caracteres debe definir un tamaño 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 más legible que las clases de datos estándar.

2. enum automoviles {Ford, BMW, Chevrolet, Chrysler, Volvo, Nissan, Renault, Porsche, Cadillac, Toy-ota};

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