You are on page 1of 28

CAPITULO 2

EL

LENGUAJE

C++ .

ELEMENTOS

,

BASICOS

CONTENIDO

2.1. Estructura general de un programa en C++. 2.2. Creaci6n de un programa.

2.3. EI proceso de ejecuci6n de un programa en C++. 2.4',i Depuraci6n de un programa en C++.

2.5. Pruebas.

2.6. Los elementos de un programa en C++. 2.7. Tipos de datos en C++.

2.8. EI tipo de dato bool.

Introducci6n

Una vez que se Ie ha ensefiado a crear sus propios programas, vamos a analizar los fundamentos dellenguaje de programaci6n C++. Este capitulo comienza con lID repaso de los conceptos te6ricos y practices relativos ala estructura de un programa enunciados en el capitulo anterior, dada su gran importancia en el desarrollo de aplicaciones, inc1uyendo adem as los siguientes temas:

• creaci6n de un programa;

,. elementos basicos que componen un programa;

o tipos de datos en C++ y c6mo se declaran;

o concepto de constantes y su dec1araci6n;

o concepto y dec1araci6n de variables;

.;,' 0 tiempo de vida 0 duraci6n de variables; o operaciones basicas de entrada/salida.

Conceptos clave ~: Funci6n main () .

0\ Preprocesador.

o Comentarios.

o C6digo objeto.

o Directiva #include.

o Archivo de cabecera.

o C6digo fuente.

o C6digo ejecutable.

o char.

o Constantes.

o Flujos.

• c ou t..

". "Ln t..

o float/double. ~ Variables.

• cin.

o Identificador.

2.9. Constantes. 2.10. Variables.

2.11. Duraci6n de una variable. 2.12. Entradas y salidas. RESUMEN.

EJERCICIOS.

PROBLEMAS.

2.1. ESTRUCTURA GENERAL DE UN PROGRAMA EN C++

Un programa en C++ se compone de una 0 mas funciones. Una de las funciones debe ser obligatoriamente main. Una funci6n en C++ es un grupo de instrucciones que realizan una 0 mas acciones. Asimismo, un programa contendra una serie de directivas #include que permitiran inc1uir en el mismo archivos de cabecera que a su vez constaran de funciones y datos predefinidos en ellos.

De un modo mas explicito, un programa C++ puede incluir:

o directivas de preprocesador;

o dec1araciones globales;

o la funci6n main () ;

o funciones definidas par el usuario;

• comentarios del programa (utilizados en su totalidad).

La estructura tipica completa de un programa C++ se muestra en la Figura 2.1. Un ejemplo de un programa sencillo en C++.

//Listado DEMO_UNO.CPP. Programa de saludo

1: #inc1ude <iostream.h>

2: // El programa imprime "Bienvenido a 1a programacion C++" 3: int main()

4 :

- -.- -, ------:Jl.

38 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

#include <iostream.h>

~ archivo de cabecera ios tream. h

int main ()

cabecera de funcidn

nombre de la funcidn

sentencias .

#include Directivas del preprocesador

#define Macros del procesador

Declaraciones globales

• funciones

• variables

• prototipos de funciones

Funcidn principal main

.

main () (

declaraciones locales

sentencias

Definiciones de otras funciones

funcl ( ... )

func2 ( ... )

FIGURA 2.1. Estructura tfpica de un programa C++.

5: cout « "Bienvenido a la programaci6n C++\n";

6: return 0;

7 :

l

La directiva #include de la primera linea es necesaria para que el programa tenga salida. Se refiere a un archivo extemo denominado iostream. h en el que se proporciona la informacion relativa al objeto cou t. Observese que los angulos < y > no son parte del nombre del archivo; se utilizan para indicar que el archivo es un archivo de la biblioteca estandar c++.

La segunda linea es un eomentario, identificado por dobles barras inclinadas (II). Los comentarios se incluyen en programas que proporcionan explicaciones a los lectores de los mismos. Son ignorados por el compilador.

La tercera linea contiene la cabecera de la funcion main () , obligatoria en cada prcgrama C++. Indica el comienzo del programa y requiere los parentesis () a continua cion de main ( ) .

La cuarta y septima linea contienen solo las llaves ( y ) que encierran el cuerpo de la funcion main () y son necesarias en todos los programas C++.

La quinta linea contiene la sentencia

cout « "Bienvenido a la programaci6n C++\n";

que indica al sistema que envia el mensaje "Bienvenido a la programaci6n en C++\n" al objeto cou t . Este objeto es elflujo estandar de salida que nonnalmente represent a la pantalla de presentacion de la computadora (el nombre cou t es una abreviatura de «console output» -salida a consolas-). La salida sera

Bienvenido a la programaci6n c++

El simbolo . \n' es el sirnbolo de nueva linea. Poniendo este simbolo al final de la cadena entre comillas, indica al sistema que comience una nueva linea despues de imprimir los caracteres precedentes, terminando, por consiguiente, la linea actual.

La sexta linea contiene la sentencia return O. Esta sentencia tennina la ejecucion del programa y devuelve el control al sistema operativo de la computadora. El numero 0 se uti liz a para sefialar que el programa ha terminado correctamente (con hito).

La sentencia de salida de la quinta linea incluye diversos simbolos tipicos de C++. El simbolo « se denomina operador de salida u operador de insercion. Inserta el mensaje en el flujo de salida. El simbolo \n incluido al final del mensaje significa caracter de nueva linea. Siempre que aparece en un mensaje de salida, se term ina la linea actual de salida y comienza una nueva linea.

Observese el punto y coma (;) al final de la quinta y sexta linea. C++ requiere que cada sentencia tennine con un punto y coma. No es necesario que este al [mal de una linea. Se pueden poner varias sentencias en la misma linea y se puede hacer que una sentencia se extienda sobre varias lineas,

2.1.1.
EI prepI'
editor de
lador ani
usuales :
Tod;
o «altno.
compila
Las
ralmente
instrucc
le, Aunr
archives
sion de ;
Exi:
como s
zaran ot
estructu
La.
que Vie]
donde s
de cabe
Los
codigo j
del prep
La:
cesador
#inclu
r
, . nombre
reside (
archivo
I
. i
! • . h e:
2 Las que el proostream.h

Observese tilizan para -+

iarras inclioporcionan rei compi-

obligatoria equiere los

.e encierran programas

programa- 7r de salida omputadora ilida a con-

e simbolo al e una nueva to, por con-

icia term ina :rativo de la na ha termi-

mbolos tipi»perador de 1 incluido al ~ aparece en .mienza una

1 linea. c++ es necesario en la misma as lineas.

2.1.1. Directivas del preprocesador

El preprocesador en un programa C 0 c++ se puede considerar como un editor de texto inteligente que consta de directivas (instmcciones al compilador antes de que se compile el programa principal). Las dos directivas mas usuales son #include y #define.

Todas las directivas del preprocesador comienzan con el signo de libro o «almohadilla» (#), que indica al compilador que lea las directivas antes de compilar la parte (funcionjprincipal del programa.

Las directivas son instrucciones al compilador. Las directivas son generalmente sentencias (observese que su linea no termina en punto y coma), sino instrucciones que se dan al compilador antes de que el programa se compile. Aunque las directivas pueden definir macros, nombres de constantes, archivos fuente adicionales, etc., su uso mas frecuente en C++ es la inclusion de archivos de cabecera.

Existen archivos de cabecera estandar que se utilizan ampliamente, tales como stdio.h, stdlib.h, math.h, string.H e iostream.h, y se utilizaran otros archivos de cabecera definidos por el usuario tanto con disefio

estructurado como con disefio orientado a objetos. .

La directiva #include indica al compilador que lea el archivo fuente que viene a continuacion de ella y su contenido 10 inserte en la posicion donde se encuentra dicha directiva. Estos archivos se denominan archivos de cabecera 0 archivos de inclusion.

Los archivos de cabecera (archivos con extension . h 0 . hpp contienen codigo fuente C/C++) I se situan en U11 programa C/C++ mediante la directiva del preprocesador #include con una instruccion que tiene el siguiente formato:

La mayoria de los programadores C++ situan las directivas del preprocesador al principio del programa, aunque esta posicion no es obligatoria.

#include <norr:brearch. h>2

o bien

'include "nombrearch.hN

nombrearch debe ser un archivo de texto ASCII (su archivo fuente) que reside en su disco. En realidad, la directiva del preprocesador mezcla un archivo de disco en su programa fuente.

'I·.h es tipico de C y .hpp es tipico de C++.

, Las comilias indican el camino y los parentesis <> indican el directorio especificado.

EL LENGUAJE C++. ELEMENTOS BAslCOS 39

Ademas de los archivos de codigo fuente disefiados por el usuario, #incl ude se utiliza para incluir archivos de sistemas especiales (tarnbien denominados archivos de cabecera) que residen en su compilador C++. Cuando se instala el compilador, estos archivos de cabecera se almacenaran autornaticamente en su disco en el directorio de inclusion (include) del sistema. Sus nombres de archivo siempre tienen la extension. h.

El archivo de cabecera mas frecuente es iostream. h. Este archivo proporciona al compilador C++ la informacion necesaria sobre las funciones de biblioteca cin y cout, asi como otras rutinas de biblioteca que realizan operaciones de entrada y salida.

Como casi todos los programas que escriba imprimiran informacion en pantalla y leeran datos de teclado, necesitaran incluir cin y cout en los mismos. Para ello sera preciso que cada programa contenga la linea siguiente:

'include<iostream.h>

De igual modo es muy frecuente el uso de funciones de cadena, especialmente strcpy o, por esta razon, se requiere el uso del archivo de cabecera denominado string. h. Por consiguiente, sera muy usual que deba incluir en sus programas las lineas

'include <iostream.h> 'include <string.h>

Si desea conservar compatibilidad con funciones de entrada/salida (E/S) de C, sera preciso considerar la inclusion del archivo de cabecera STOIO. H Y en consecuencia la linea:

'include <stdio.h>

EI orden de sus archivos de inclusion no importa con tal de que se incluyan antes de que se utilicen las funciones correspondientes. La mayoria de los programas C++ incluyen todos los archivos de cabecera necesarios antes de la primera funcion del archivo.

La directiva #i ncl ude puede adoptar uno de los siguientes formatos:

'include <nombre del archivo> 'include "nombre del archivo"

Dos ejemplos tipicos son:

(a) #include <iostream.h> (b) #include "pruebas.h"

El formato (a) (el nombre del archivo entre angulos) significa que los archivos se encuentran en el directorio por defecto include. EI formato (b)

r· .-~--

40 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

significa que el archivo esta en el directorio actual. Los dos metodos no son excluyentes y pueden existir en el rnismo programa archivos de cabecera estandar utilizando angulos y otros archivos de cabecera utilizando comil\as. Si desea utilizar un archivo de cabecera que se cre6 y no esta en el directorio por defecto, se encierra el archivo de cabecera y el camino entre comillas, tal como

#include "D:\MIPROG\CABEZA.H"

#define. La directiva #define indica al preprocesador que defina un item de datos u operaci6n para el programa C++. Por ejemplo, la directiva

#define TAM LINEA 65

sustituira el valor 65 cada vez que el identificador TAM_LINEA aparezca en el programa.

2.1.2. Declaraciones globales

Las declaraciones globales indican al compilador que las funciones definidas por el usuario 0 variables asi declaradas son comunes a todas las funciones de su programa. Las declaraciones glob ales se situan antes de la funci6n main ().

Si se declara global una variable Grado _ clase del tipo

int Grado_clase;

cualquier funci6n de su programa, incluyendo main ( ) , puede acceder a la variable Grado clase.

La zona de declaraciones globales de un programa puede incluir declaraciones de variables ademas de declaraciones de funci6n.

Las declaraciones de funci6n se denominan prototipos.

int media (int a, int b);

El siguiente programa es una estructura modelo que incluye declaraciones globales.

II Programa demo.cpp #include <iostream.h>

II Definir macros #define MICONSTl 0.50

#define MICONS2 0.75

IIDeclaraciones globales int Calificaciones ;

main () (

I I ...

2.1.3. Funci6n main ()

Cada programa C++ tiene una funcion main () que es un punto inicial de entrada al programa. Su estructura es:

main () {

~---- bloque de sentencias

Las sentencias incluidas entre las Haves ( ... ) se denominan bloque. Un programa puede tener s6lo una funci6n main () . Si se intenta hacer dos funciones main () se produce un error.

Ademas de la funci6n main () , un programa C++ consta de una colecci6n de funciones.

En un programa corto, el programa completo puede incluirse totalmente en la funci6n main (). Un programa largo, sin embargo, tiene demasiados c6digos para incluirlo en esta funci6n. La funcion main () en un programa largo consta practicamente de llamadas a las funciones definidas por el usuario. EI programa siguiente se compone de tres funciones: obtenerdatos () , alfabetizar () y verpalabras () , que se invocan sucesivamente.

int main () (

obtenerdatos() ;

alfabetizar();

verpalabras() ;

return 0;

Las variables y constantes globales se deben declarar y definir antes de main () , mientras que las variables y constantes locales se declaran y defi-

nen en f de ser u Las o cualqi

2.1.4.

Un pro] construj aplicaci crean gt pantalla declarar C++.

Las paramet cuta, ell na a la f

Tod puede a: que dicl Enl grama:

void f

Un< ci6n qut compila funci6n

void c

La(

sen ret-

nombre

-~-- ------

) inicial de

bloque. Un :er dos fun-

una colec-

e totalmeniemasiados ) programa idas por el ::ltenerda:sivamente.

oil' antes de iran y defi-

1

nenen el cuerpo 0 bloque de la funci6n principal, en cualquier punta antes de ser utilizada.

Las sentencias situadas en el interior del cuerpo de la funci6n main () , o cualquier otra funci6n, deben terminar en punto y coma.

2.1.4. Funciones definidas por el usuario

Un programa Cf+ es una colecci6n de funciones. Todos los programas se construyen a partir de una 0 mas funciones que se integran para crear una aplicaci6n. Todas las funciones contienen una 0 mas sentencias C++ y se crean generalmente para realizar una unica tarea, tales como imprimir la pantalla, escribir un archivo 0 cambiar el color de la pantalla. Se pueden declarar y ejecutar un numero de funciones casi ilimitado en un programa C++.

Las funciones definidas por elusuario se invocan por su nombre y los parametres opcionales que puedan tener. Despues de que la funci6n se eje-

• cuta, el c6digo asociado con la funci6n se ejecuta y, a continuaci6n, se retorna a la funci6n llamadora.

Todas las funciones tienen nombre y una lista de valores que reciben. Se puede asignar cualquier nombre a su funcion, pero nonnalmente se procura que dicho nombre describa el prop6sito de la funci6n.

En C++, las funciones requieren una declaracion 0 pro to tipo en el programa:

void func demo();

Una declaracion de funcion indica al compilador el nombre de la funci6n que se esta invocando en el programa. Si la funci6n no se define, el compilador inform a de un error. La palabra reservada void significa que la funci6n no devuelve un valor.

void contararriba(int valor);

La definici6n de una funci6n es la estructura de la misma

tipo_retorno nombre_funci6n (lista_de_parametros) principio de fa funcion

sentencias return;

cuerpo de la funcion retorno de la funcion fin. de La funcion

tipo_retorno

Es el tipo de valor, 0 void, devuelto par la funcion Nombre de la funcion

nombre funci6n

EL LENGUAJE c++. ELEMENTOSBAslCOS

4, -Ct ~'h:" ;rr.i"""r:~

I

4,1

lista _ de_parametros Lista de parametres, o void, pasados a la funcionsSe, conoce tam bien como argumentos de la funcion Q;, '.:_ ,j argumentos formales.

C++ proporciona tambien funciones predefinidas que se denominan funciones de biblioteca. Las funciones de biblioteca son funciones listas para ejecutar que vienen con el lenguaje C++. Requieren la inclusion del archivo de cabecera estandar, tal como STDIO. H, MATH. H, etc. Existen centen ares de funciones definidas en divers os archivos de cabecera.

II ejemplo funciones definidas por el usuario

#include <iostream.h>

int visualizar(); int main ()

visualizar() ; return 0;

void visualizar()

cout « "Hola mundo guay\nH;

Los programas C++ constan de un conjunto de funciones que normalmente estan controladas por la funci6n main () .

main () (

I I ...

obtenerdatos() (

I I ...

alfabetizar() (

I I ...

)

/ / ...

2.1.5. Comentarios

Un comentario es cualquier informaci6n que se afiade a su archivo fuente para proporcionar infonnaci6n de cualquier tipo. El compilador ignora los

I

'I ,I

42

PROGRAMACION EN C++. AlGORITMOS, ESTRUCTURAS Y OBJETOS

comentarios, no realiza ninguna tare a concreta. EI uso de comentarios es totalmente opcional, aunque dicho uso es muy recomendable.

Generalmente, se considera buena practica de programacion comentar su archivo fuente tanto como sea posible, al objeto de que usted mismo y otros programadores puedan leer facilmente el programa con el paso del tiempo. Es buena practica de programacion comentar su programa en la parte superior de cada archivo fuente. La informacion que se suele incluir es el nombre del archivo, el nombre del programador, una breve descripcion, la fecha en que se creo la version y la informacion de la revision.

En C++ los comentarios de un program a se pueden introducir de dos

formas:

• estilo C estandar;

• estilo C++.

Si solo se esta utilizando el compilador de C++ se recomienda el uso del estilo C++, reservando eJ estilo C para aquellos casos en que se necesita ejecutar su programa bajo otro compilador de C.

Estilo C estender

Los comentarios en C estandar comienzan con la secuencia 1* Y terminan con la secuencia * I. Todo el texto situado entre las dos secuencias es un comentario ignorado por el compilador.

1* PRUEBA1.CPP -- Primer programa c++ *1

Si se necesitan varias line as de programa se puede hacer 10 siguiente:

1*

Programa:

Programador:

Descripcion:

Fecha creacion:

Revision: *1

PRUEBA1.CPP

Pepe Mortimer Primer programa c++ 17 junio 1994 Ninguna

Tambien se pueden situar comentarios de la forma siguiente:

cout « "Programa DemoN;I* sentencia de salida *1

Estilo C++

Los comentarios estilo C++ son nuevos. Se define una linea de comentario comenzando con una doble barra inclinada (II); todo 10 que viene despues de la dobJe barra inclinada es un comentario y el compilador 10 ignora.

II PRUEBA1.CPP

EI

-- Primer programa c++

Si se necesitan varias lineas de comentarios, se puede hacer 10 siguiente:

II nor II ill

II IIPrograma:

IIProgramador:

IIDescripcion:

IIFecha creacion:

IIRevision:

II

# incl 1

PRUEBA1.CPP

Pepe Mortimer Primer programa c++ 17 junio 1994 Ninguna

int rn.

#in( r e t.i

No se pueden anidar comentarios, 10 que implica que no es posible escribir un comentario dentro de otro. Si se anidan comentarios, el compilador produce errores, ya que no puede discemir entre los comentarios.

EI comentario puede comenzar en cualquier parte de la linea, incluso despues de una sentencia de programa. Por ejemplo,

equiva

II nOI /Iilu;

II PRUEBA1.CPP -- Primer programa c++

#inc1ude <iostream.h> Ilarchivo de cabecera

#inc1J

int rn,

main () (

Ilfuncion principal

cou co u cou cou: ret·

cout « "Ho1a mundo guayN; return 0;

Ilvisualiza en pantalla Ilfin de 1a funcion y Iidevolucion de 0

EJEMPL02.1

Suponganios que se ha de imprimir su Hombre y direccion muchas veces en su programa C++. El sistema normal es teclear las lineas de texto cuantas veces sea necesario; sin embargo, el metoda mas rapido y eficiente seria escribir el codigo fuente correspondiente una vez y a continuacion grabar un archivo midirec. cpp. de modo que para incluir el codigo solo necesitara incluir en su programa la linea

#include <midirec.cpp>

Es decir, teclee las siguientes line as y grabelas en un archivo denominado MIDIREC. CPP

II archivo midirec.cpp

cout « "Luis Joyanes Aguilar\nN; cout « "Avda de Andalucia, 4B\n"; cout « "Carche1ejo. JAEN\n";

cout « "Andalucia. ESPA~A\n";

10 siguiente:

) es posible s, el compimtarios. nea, incluso

~cera

s n t a Ll.a Lon y

has veces en exto cuantas iciente seria -cion grabar solo necesi-

ivo denomi-

EI programa siguiente:

II nombre del archivo demoincl.cpp II ilustra el uso de # include

#include <iostream.h>

int main () {

#include "midirec.cpp" return 0;

equivale a

II nombre del archivo demoincl.cpp Ililustra el uso de #include

#include <iostream.h>

int main ()

cout « "Luis Joyanes Aguilar\n"; cout « "Avda de Andalucia. 48\n"; cout « "Carchelejo. JAEN\n";

cout « "Andalucia. ESPANA\n"; return 0;

EJEMPLO 2.2

El siguiente programa copia un mensaje en un array de caracteres y 10 imprime en fa pantalla ya que cout y strcpy () (una funcion de cadena) se utilizan, se necesitan sus archivos de cabecera especificos.

II nombre del archivo demoinc2.cpp II utiliza dos archivos de cabecera #include <iostream.h>

#include <string.h>

int main () {

char mensaje[20];

strcpy (mensaje. "hola mundo\n");

II Las dos lineas anteriores tambien se pueden sustituir por II char mensaje[20] = "hola mundo\n";

l

......

EL LENGUAJE C++. ELEMENTOS BAsICOS43

cout « mensaje; return 0;

2.2. CREACION DE UN PROGRAMA

Una vez creado un programa en Cf+ como el anterior, se debe ejecutar. "Como realizar esta tarea? Los pas os a dar dependeran del compilador C++ que utilice. Sin embargo, seran simi lares a los mostrados en la Figura 2.2. En general, los pasos serian:

• Utilizar un editor de texto para escribir el programa y grabarlo en un archivo. Este archivo constituye el codigojizenre de un programa.

• Compilar el codigo fuente. Se traduce el codigo fuente en un codigo objeto (extension. obj) (Ienguaje maquina entendible por la computadora). Un archivo objeto contiene instrucciones enlenguaje maquina que se pueden ejecutar por una computadora. Los archivos de estandar C++ y los de cabecera definidos por el usuario son incluidos (#include) en su codigo fuente por el preprocesador. Los archivos de cabecera contienen informacion necesaria para la compilacion, como es el caso de iostream.h que contiene informacion de cout y de «.

• Enlazar eI ccdigo objeto con las bibliotecas correspondientes. Una biblioteca C++ contiene codigo objeto de una coleccion de rutinas 0 funciones que realizan tareas, como visualizar inforrnaciones en la pantalla 0 ca1cular laraiz cuadrada de un numero. EI enlace del codigo objeto del program a con el objeto de las funciones utilizadas y' cualquier otro codigo empleado en el enlace, prcducira un codigo ejecutable. Un program a C++ consta de un numero diferente de archivos objeto y archivos biblioteca.

Para crear un programa se utilizan las siguientes etapas:

I. Definir su programa.

2. Definir directivas del preprocesador.

3. Definicion de declaraciones globales.

4. Crear main () .

5. Crear el cuerpo del programa.

6. Crear sus propias funciones definidas por el usuario.

7. Compilar, enlazar, ejecutar y comprobar su programa.

8. Utilizar comentarios.

I'

44

PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

bien ocurra alguna anomalia, se perdera el texto de su programa. Sin embargo, si el texto del programa se almacena en un disquete, en un disco duro, 0 bien en Lll1 CD-ROM, el program a se guardara de modo pennanente, incluso despues de apagar la computadora y siempre que esta se vuelva a arrancar.

La Figura 2.3 muestra el me to do de edicion de un programa y la creacion del programa en un disco, en un archivo que se denomina archivo de texto. Con la ayuda de un editor de texto se puede editar el texto facilmente, es decir, cambiar, mover, cortar, pegar, borrar texto. Se puede ver, normalmente, una parte del texto en la pantalla y se puede marcar partes del texto a editar con ayuda de un raton 0 el teclado. El modo de funcionamiento de un editor de texto y las ordenes de edicion asociadas varian de un sistema a otro.

sentencia objeto cc program, errores, I ayuda de duzcan e

El cc te, norm, hola ant

FIGURA:

El at no es sui los archi tream. r mada y t

Non program puede ha dor (link iostrea nen un n mente he todo el c ~,~tl!l! el J clic.en e'

S'.Ii': Se f queeste

'us~arip,( hace.

I "'Elpl

vez; esd

FIGURA 2.2. Etapas de creaci6n de un programa.

2.3. EL PROCESO DE EJECUCION DE UN PROGRAMA EN C++

Un programa de computadora escrito en un lenguaje de prcgramacion (por ejemplo, C++) tiene forma de un texto ordinario. Se escribe el programa en una hoja de papel y a este programa se Ie denominaprograma texto 0 c6digo fuente. Considerese el ejemplo sencillo y clasico de Bjarne Stroustrup

#include <iostream.h> int main ()

(

cout « "Hola mundo, C++!H « endl; return 0;

La primera operacion en el proceso de ejecucion de un programa es introducir las sentencias (instrucciones) del programa en un editor de texto. El editor almacena el texto y debe proporcionarle un nombre tal como hola. cpp. Si la ventana del editor le muestra un nombre tal como noname. cpp, es conveniente cambiar dicho nombre (por ejemplo, por hola. cpp}, A continuacion se debe guardar el texto en disco para su conservacion y uso posterior, ya que en caso contrario el editor solo almacena el texto en memoria central (RAM) y cuando se apague la computadora, 0

Archivo fuente

Raton

Editor de texto

FIGURA 2.3. Proceso de edici6n de un archivo fuente.

Una vez editado un programa, se le proporciona lll1 nombre. Se suele dar una extension al nombre (normalmente . cpp, aunque en algunos sistemas puede tener otros sufijos tales como c 0 bien cc) .

La siguiente etapa es la de compilacion. En ella se traduce el codigo fuente escrito en lenguaje C++ a codigo maquina (entendible por la computadora). El programa que realiza esta traduccion se llama compilador. Cada compilador se construye para un determinado lenguaje de programacion (por ejemplo, C++); un compilador puede ser un programa independiente (como suele ser el caso de sistemas operativos como VMS, UNIX, etc.) 0 bien fonnar parte de un programa entomo integrado de desarrollo (EID). Los programas EID (EDE, en ingles) contienen todos los recursos que se necesitan para desarrollar y ejecutar un programa, por ejemplo, editores de texto, compiladores, enlazadores, navegadores y depuradores.

Cada lenguaje de prcgramacion tiene unas reglas especiales para la construccion de programacion que se denomina sintaxis. El compilador lee el programa del archivo de texto creado anterionnente y comprueba que el programa sigue las reglas de sintaxis dellenguaje de programacion. Cuando se compila su programa, el compilador traduce el cadi go fuente C++ (las

1. Sin embardisco duro, 0 rente, incluso fa a arran car. na y la cream archivo de cto facilmenede ver, norar partes del de funcionavarian de un

xrchivo fuente

bre. Se suele Igunos siste-

.ce el c6digo or la compu-ilador. Cad a rogramaci6n idependiente /NIX, etc.) 0 .rollo (EID). ursos que se J, editores de

iales para la mpilador lee irueba que el aci6n. Cuan.nte C++ (las

sentencias del programa) en un c6digo maquina icodigo objeto). EI c6digo objeto consta de instrucciones maquina e informacion de c6mo cargar el program a en memoria antes de su ejecuci6n. Si el compilador encuentra errores, los presentara en la pantalla. Una vez corregidos los errores con ayuda del editor se vuelve a compilar sucesivamente hasta que no se produzcan errores.

El c6digo objeto asi obtenido se almacena en un archivo independiente, normalmente con extensi6n .obj 0 bien .0 . Por ejemplo, el programa hola anterior se puede almacenar con el nombre hola. obj.

FIGURA 2.4. Proceso de compilaci6n de un programa.

El archivo objeto contiene s610 la traducci6n del c6digo fuente. Esto no es suficiente para ejecutar realmente el programa. Es necesario incluir los archivos de biblioteca (por ejemplo, en el programa hola. cpp, iostream. h). Una biblioteca es una colecci6n de c6digo que ha sido programada y traducida y !ista para uti!izar en su programa.

Norrnalmente un programa consta de diferentes unidades 0 partes de programa que se han compilado independientemente. Por consiguiente, puede haber varios archivos objetos. Un programa especiaillamado enlazador (linker) toma el archivo objeto y las partes necesarias de la biblioteca iostrean y construye un archivo ejecutable. Los archivos ejecutables tienen un nombre con la extensi6n . exe (en el ejemplo, hola. exe) 0 simplemente hola, segun sea su computadora. Este archivo ejecutable contiene todo el c6digo maquinas necesario para ejecutar el programa. Se puede ejecutar el programa escribiendo hola en el indicador de 6rdenes 0 haciendo clic en el icono del archivo.

Se puede poner ese archivo en un disquete 0 en un CD-ROM, de modo que este disponible despues de salir del entomo del compilador a cualquier usuario que no tenga U11 compilador C++ 0 que puede no conocer 10 que hace.

El proceso de ejecuci6n de U11 programa no suele funcionar la primera vez; es decir, casi siempre hay errores de sintaxis 0 errores en tiempo de eje-

..

EL LENGUAJE c++. ELEMENTOS BAslCOS 45

FIGURA 2.5. Proceso de conversi6n de c6digo fuente a c6digo ejecutable.

cuci6n. El proceso de detectar y corregir errores se den om ina depuracion 0 puesta a punto de un programa.

La Figura 2.6 muestra el proceso completo de puesta a punto de un programa.

Se comienza escribiendo el archivo fuente con el compilador. Se compila el archivo fuente y se cornprueban mensajes de errores. Se retoma al editor y se fijan los errores de sintaxis. Cuando el compilador tiene exito, el enlazador construye el archivo ejecutable. Se ejecuta el archivo ejecutable. Si se encuentra un error, se puede activar el depurador para ejecutar sentencia a sentencia. Una vez que se encuentra la causa del error, se vuelve al editor y se corrige. El proceso de compilar, enlazar y ejecutar el programa se repetira hasta que no se produzcan errores.

2.4. DEPURACION DE UN PROGRAMA EN C++

Como se ha comentado anteriorrnente, rara vez los programas funcionan bien la primera vez que se ejecutan. Los errores que se producen en los programas han de ser detectados, aislados (fijados) y corregidos, El proceso de encontrar errores se denomina depuracion del programa. La correccion del error es probablemente la etapa mas facil, siendo la detecci6n y aislamiento del error las tareas mas dificiles.

46

PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

sf

sf

FIGURA 2.6. Proceso completo de depuracion de un programa.

Existen diferentes situaciones en las cuaJes se sueJen introducir errores en un programa. Dos de las mas frecuentes son:

1. Violacion (no cumplimiento) de las regJas gramaticales dellenguaje de alto nivel en el que se escribe el programa.

2. Los errores en eJ diseiio deJ algoritmo en el que esta basado el programa.

Cuando el compilador detecta un error, visualiza un mensaje de error indicando que se ha cometido un error y posible causa del error. Desgraciadamente los mensajes de error son dificiles de interpretar y a veces se llegan a conclusiones erroneas. Tambien varian de un compilador a otro compilador. A medida que se gana en experiencia, el proceso de puesta a punto de un programa se mejora considerablemente. Nuestro objetivo en cad a capitulo es describir los errores que ocurren mas frecuentemente y sugerir posibles causas de error, junto con regJas de estilo de escritura de programas.

Desde eJ punto de vista conceptual existen tres tipos de errores: sintaxis, logicos y de regresion.

2.4.1. Errores de sintaxis

Los errores de sin taxis son aquellos que se producen cuando el programa viola la sintaxis, es decir, las reglas de gramatica dellenguaje. Errores de sintaxis tipicos son: escritura incorrecta de palabras reservadas, ornision de signos de puntuacion (comillas, punto y coma ... ). Los errores de sintaxis son los mas faciles de fijar, ya que ellos son detectados y aislados por el compilador.

Estos errores se suelen detectar pOl' el compilador durante el proceso de compilacion. A medida que se produce el proceso de traduccion del codigo fuente (por ejemplo, programa escrito en C++) a lenguaje maquina de la computadora, el compilador veri fica si el programa que se esta traduciendo cumple las reglas de sintaxis del lenguaje. Si el programa viola alguna de estas reglas, el compilador genera un mensaje de error (0 diagn6stico) que explica el problema (aparente). Algunos errores tipicos (ya citados anteriormente):

• Puntos y coma despues de la cabecera main () .

• Omision de puntos y coma al final de una sentencia.

• Olvido de la doble barra inclinada antes de un comentario.

• Olvido de las dobles comillas al cerrar una cadena.

Si una sentencia tiene un error de sintaxis no se traducira completamente y el programa no se ejecutara. Asi por ejemplo, si una linea de programa es

double radio

se producira un error ya que falta el punto y coma (;) despues de la letra ultima, "0". Posterionnente se explicara el proceso de correccion por parte del programador.

2.4.2. Errores logicos

Un segundo tipo de error importante es el error Iogico, ya que tal error representa errores del programador en el diseiio del algoritmo y posterior programa. Los errores logicos son mas dificiles de encontrar y aislar, ya que no suelen ser detectados por el compilador,

Suponga, por ejemplo, que una linea de un programa contiene la sentencia

double peso

densidad * 5.25 * PI * pow (longitud, 5) / 4.0

pero res dad W1 je de er por tant cutara l formuls

Un: co (si e aJ prog prograr do espe ayudar:

Lo: de un a prcduc son rna tratiem de un r

total

es una ningun

Se lidad, I venir e antes ( logico: riencia

2.4.3

Los er se inte compr error ( son co «till er

2.4.4

Los. cfases I

es: sintaxis,

el programa rores de sinision de sigtaxis son los compilador. I proceso de 1 del codigo rquina de la traduciendo a alguna de iosticos que los anterior-

).

i completa.nea de pro-

la letra ultilor parte del

ue tal error y posterior islar, ya que

iene la sen-

5) I 4.0

pero resulta que el tercer asterisco (operador de multiplicacion) es en realidad un signo + (operador suma). El compilador no produce ningun mensaje de error de sintaxis, ya que no se ha violado ninguna regIa de sintaxis y por tanto el compilador no detecta error y el programa se compilara y ejecutara bien, aunque producira resultados de valores incorrectos, ya que la formula utilizada para calcular el peso contiene un error Iogico.

Una vez que se ha determinado que un programa contiene un error logico (si es que se encuentra en la primera ejecucion y no pasa desapercibida al programador), encontrar el error es una de las tare as mas dificiles de la programacion. EI depurador (debugger), un programa de software disefiado especificamente para la deteccion, verificacion y correccion de errores, ayudara en las tareas de depuracion,

Los errores logicos ocurren cuando un programa es la implementacion de un algoritmo defectuoso. Dado que los errores logicos normalmente no producen errores en tiempo de ejecucion y no visualizan mensajes de error, son mas dificiles de detectar porque el programa parece ejecutarse sin contratiempos. EI unico signo de un error logico puede ser la salida incorrecta de un programa. La sentencia

total_grados_centigrados

!

fahrenheit a centigrados * temperatura_cen;

es una sentencia perfectamente legal en C++, pero la ecuacion no responde a ningun calculo valido para obtener el total de grados centigrados en una sala.

Se pueden detectar errores logicos comprobando el programa en su totalidad, comprobando su salida con los resultados previstos. Se pueden prevenir errores logicos con un estudio minucioso y detail ado del algoritrno antes de que el prograrna se ejecute, pero resultant facil cometer errores logicos y es el conocimiento de C++, de las tecnicas algoritmicas y la experiencia 10 que permitira la deteccion de los errores logicos.

2.4.3. Errores de reqresion

Los errores de regresion son aquellos que se crean accidentalmente cuando se intenta corregir un error logico, Siempre que se corrige un error se debe

.. comprobar totalmente la exactitud (correccion) para asegurarse que se fija el error que se esta tratando y no produce otro error. Los errores de regresion son comunes, pero son faciles de leer y corregir. Una ley no escrita es que: «un error se ha producido, probablemente, por el ultimo codigo modificado».

2.4.4. Mensajes de error

: .Los compiladores emiten mensajes de error 0 deadvertencia durante las fases de compilacion, de enlace 0 de ejecucion de un programa.

EL LENGUAJE c++. ELEMENTOS BAslCOS 47

Los mensajes de error producidos durante la cornpilacion se suelen Producir, normalmente, por errores de sintaxis y suele variar segun los compiladores; pero, en general, se agrupan en tres bloques:

• Errores fatales. Son raros. Algunos de ellos indican un error intemo del compilador. Cuando ocurre un error fatal, la compilacion se detiene inmediatamente, se debe tomar la accion apropiada y a continuacion se vuelve a iniciar la compilacion,

• Errores de sin taxis. Son los errores tipicos de sintaxis, errores de linea de ordenes y errores de acceso a memoria 0 disco. EI compilador terminara la fase actual de compilacion y se detiene.

• Advertencias (warning). No impiden la compilacion. Indican condiciones que son sospechosas, pero son legitimas como parte del lenguaje.

2.4.5. Errores en tiempo de ejecucion

Existen dos tipos de errores en tiempo de ejecucion: aquellos que son detectados por el sistema en tiempo de ejecucion de C++ y aquellos que penniten la terminacion del programa pero producen resultados incorrectos.

Un error en tiempo de ejecucion puede ocurrir como resultado el program a que obliga a la computadora a realizar una operacion ilegal tal como dividir un numero por cero 0 mauipular datos no validos 0 no definidos. Cuando ocurre este tipo de error, la computadora detendra la ejecucion de su pro gram a y emitira (visualizara) un mensaje de diagnostico tal como:

Divide error, line number ***

Si se intenta manipular datos novalidos 0 indefinidos, su salida puede contener resultados extrafios. Por ejemplo, se puede producir un desbordamiento aritmetico cuando un programa intenta almacenar un numero que es mayor que el tarnafio maximo que puede manipular su computadora.

EI program a depurar. cpp se compila con exito; pero no contiene ninguna sentencia que asigne un valor a la variable x que pueda sumarse a y para producir una variable z, por tanto, al ejecutarse la sentencia de asignacion

z = x + y;

se produce un error en tiempo de ejecucion

1: 2 : 3 : 4 : 5 :

II archivo depurar

II prueba de errores en tiempo de ejecuci6n

*include <iostream.h>

48 PROGRAMACION EN C++. AlGORITMOS, ESTRUCTURAS Y OBJETOS

6: void main ()

7: {

8: II Datos locales

9: float x, y, z;

10:

11: y = 10.0

12: z = x + y; II error de ejecuci6n

13: cout « uEl valor de z es = n « z « endl;

14:

El programa anterior, sin embargo, podria tenninar su ejecucion, aunque produciria resultados incorrectos. Dado que no se asigna ningun valor a x, contendra un valor impredecible y el resultado de la suma sera tambien impredecible. Muchos compiladores inicializan las variables automaticamente a cera, haciendo en este caso mas dificil de detectar la omision, sobre todo cuando el programa se transfiere a otro compilador que no asigna ningun valor definido.

Otra fuente de errores en tiempo de ejecucion se sue le producir por en-ores en la entrada de datos producidos por la lectura del dato incorrecto en una variable u objeto de entrada.

2.5. PRUEBAS

Los errores de ejecucion ocurren despues de que el programa se ha compilado con exito y aun se esta ejecutando. Existen ciertos errores que la computadora solo puede detectar cuando se ejecuta el programa. La mayo ria de los sistemas informaticos detectaran ciertos errores en tiempo de ejecucion y presentaran un mensaje de error apropiado. Muchos errores en tiempo de ejecucion tienen que ver con los calculos numericos, Por ejemplo, si la computadora intenta dividir un numero por cero, se produce un error en tiempo de ejecucion.

Es preciso tener presente que el compilador puede no emitir ningun mensaje de error durante la ejecucion, y eso no garantiza que el programa sea correcto. Recuerde que el compilador solo le indica si se escribio bien sintacticamente un programa en C++. No indica si el programa hace 10 que realmente desea que haga. Los errores logicos pueden aparecer -y de hecho apareceran-> por un mal disefio del algoritmo y posterior programa.

Para determinar si un programa contiene un error logico, se debe ejecutar utilizando datos de muestra y comprobar la salida verificando su exactitud. Esta prueba (testing) se debe hacer varias veces utilizando diferentes entradas, preparadas -en el caso ideal- por personas diferentes at programador, que puedan indicar suposiciones no evidentes en la elecciou de los datos de prueba. Si cualquier combinacion de entradas produce salida incorrecta, entonces el programa contiene un error logico.

Una vez que se ha determinado que un programa contiene un error logico, la localizacion del error es una de las partes mas dificiles de la progra-

macion, La ejecucion se debe realizar paso a paso (seguir la traza).hasta el punto en que se observe que un valor calculado difiere del valor esperado. Para simplificar este seguimiento 0 traza, la mayoria de los compiladores de C++ proporcionan un depurador integrado I incorporado con el editor, y todos ellos en un mismo paquete de software, que permiten al programador ejecutar realmente un programa, linea a linea, observando los efectos de la ejecucion de cada linea en los valores de los objetos del programa. Una vez que se ha localizado el error, se utilizara el editor de texto para corregir dicho error.

Es preciso hacer constar que casi nunca sera posible comprobar un programa para todos los posibles conjuntos de datos de prueba. Existen casos en desarrollos profesionales en los que, aparentemente, los programas han estado siendo utilizados sin problemas durante alios, hasta que se utilize una combinacion especifica de entradas y esta produjo una salida incorrecta debida a un error logico. El conjunto de datos especificos que produjo el error nunca se habia introducido.

A medida que los programas crecen en tamafio y complejidad, el problema de las pruebas se convierte en un problema de dificultad cada vez mas creciente. No importa cuantas pruebas se hagan: «las pruebas nunca se terminan, solo se detienen, y no existen garantias de que se han encontrado y corregido todos los errores de un programa». Dijkstra ya predijo a principios de los setenta una maxima que siempre se ha de tener presente en la construccion de un programa: «Las pruebas solo muestran la presencia de errores, no su ausencia. No se puede probar que un programa es correcto (exacto) solo se puede mostrar que es incorrecto»,

2.6. LOS ELEMENTOS DE UN PROGRAMA EN C++

Un programa C++ consta de uno 0 mas archivos. Un archivo es traducido en diferentes fases. La primera fase es el preprocesado, que realiza la inclusion de archivos y la sustitucion de macros. El preprocesador se controla por directivas introducidas por lineas que contienen # como primer caracter, El resultado del preprocesado es una secuencia de tokens.

2.6.1. Tokens (elementos lexicos de los programas)

Existen cinco clases de tokens: identificadores, palabras reservadas, literales, operadores y otros separadores.

1 Este es el caso de Borland C++, Builder C++ de Boriandllnprise, Visual C++ de Microsoft 0 los cornpiladores bajo UNIX y Linux. Suelen tener un menu Debug 0 bien una opci6n Debug en el menu Run.

I Ie
i 2.6.2.
I
! Un identific.
f U. El prin
t mayllsculas
nombre_cL
I elemento_,
j
t a
I En C+-+
el compilad
C++ es
como distill
lice siempn
puede servi
1. ESCl
2. Con
3. Fun 2.6.3.

Una palabi caracteristi Una palabi objeto 0 fu

"

I I ., . void vo i..

II

t·,

:za) hasta el ir esperado. riladores de el ec1i tor, y rogramador fectos de la ra, Una vez Ira corregir

.bar un pro.isten casos gramas han utilize una

incorrecta produjo el

lad, el pro.da vez mas mea se tericontrado y 1 principios en la consiia de erroecto (exac-

c++

aducido en a inclusi6n mtrola por .aracter, El

nas)

das, litera-

H- de Micron tina opcion

2.6.2. Identificadores

Un identificador es una secuencia de caracteres, letras, digitos y subrayados (~. El primer caracter debe ser una letra (no un subrayado). Las letras mayusculas y minusculas son diferentes a efectos del identificador.

nombre clase elemento_mayor a

Dia Mes Ano

Indice Cantidad Total Habitacion120

Fecha Compra Casa

i

En C++ el identificador puede ser de cualquier longitud; sin embargo, el cornpilador ignora cualquier caracter fuera de los 32 primeros.

C++ es sensible a las mayusculas, por consiguiente, C++ reconoce como distintos los identificadores ALFA y alfa (le recomenc1amos que utilice siernpre el mismo estilo al escribir sus identificadores). Un consejo que puede servir de posible regIa puec1e ser:

1. Escribir identificadores de variables en letras minusculas,

2. Constantes en mayusculas,

3. Funciones con tipo de letra mixto: mayuscula/minuscula I

if, switch 0 e.Ls e.

2.6.3. Palabras reservadas

Una palabra reservada (keyword 0 reserved word), tal como void es una caracteristica del lenguaje C++ asociada con algLI11 significado especial. Una palabra reservac1a no se puede utilizar como nombre de identificador, objeto 0 funcion.

I I ...

void void ()

II error

II

EL LENGUAJE C++. ELEMENTOS sAsICOs49

int char; I I ...

II error

Los siguientes identificadores estan reservados para utilizarlos como palabras reservadas, y no se deben emplear para otros prop6sitos.

asm double mutable struct
auto else namespace switch
bool enum new template
break explicit operator this
case extern private throw
catch float protected try
char for public typedef
class friend register union
const go to return unsigned
continue if short virtual
default inline signed void
delete int sizeof volatile
do long static wchar t
while
2.6.4. Comentarios Ya se ha comentac1o antes que los comentarios puec1en tener dos fonnatos en C++:

I I .

1* *1

Un comentario que comienza con I I termina al final de la linea en que se encuentre el simbolo. Los .comentarios encerrados entre 1* Y * I puec1en extenc1erse a 10 largo de varias !ineas:

1* Titulo: Demo uno por Mr. Mackoy *1

II Version 2.0

1* Cabecera del programa text_uno Autor: J.R. Mortimer *1

II Cabecera del programa test_uno

2.6.5. Signos de puntuaci6n y separadores

Todas las sentencias deben tenninar con un punto y coma. Otros signos de puntuacion son:

50 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

! % A & *

- + < > ?

} - / "

\

Los separadores son espacios en blanco, tabulaciones, ret01110s de carro y avances de linea.

2.6.6. Archivos de cabecera

Un archivo de cabecera es un archivo especial que contiene las declaraciones de objetos y funciones de la biblioteca. Para utilizar objetos y funciones almacenadas en una biblioteca, un program a debe utilizar la directiva UncI ude para insertar el archivo de cabecera correspondiente. Por ejemplo, si un programa utiliza la funci6n pow que se almacena en la biblioteca matematica math.h, debe contener la directiva

#include <math.h>

para hacer que el contenido de la biblioteca matematica este disponible a un programa.

La mayoria de los programas contienen lineas como esta al principio, que se inc1uyen en el momento de compilaci6n.

#include <iostream.h>

#include "iostream.h"

2.6.7. EI nuevo estandar C++ (ANSI C++)

El nuevo ANSI C++ ha cambiado el convenio (notaci6n) de los archivos de cabecera. Es posible utilizar s610 los nombres de las bibliotecas sin el sufijo . h; es decir, se puede usar iostream, cmath, cassert y cstdlib en lugar de iostream. h, math. h, assert. h y stdlib. h, respectivamente. En ANSI C++ se puede utilizar indistintamente.

#include <iostream.h>

° bien

#include <iostream>

Sin embargo, no se puede utilizar

#include <string>

ya que no es 10 mismo que

#include <string.h>

La raz6n es que la cabecera <string> define el estilo C++ para cadenas y la cabecera <s tr ing . h> define cadenas estilo C que son totalmente diferentes.

2.7. TIPOS DE DATOS EN C++

C++ no soporta un gran numero de tipos de datos predefinidos, pero tiene la capacidad para crear sus propios tipos de datos. Todos los tipos de datos simples 0 basicos de C++ son, esencialmente, numeros, Los tres tipos de datos basicos son:

• enteros;

• numeros de coma flotante (reales),

• caracteres.

La Tabla 2..1 recoge los principales tipos de datos basicos, sus tamafios en bytes y el ran go de val ores que puede almacenar.

TABLA 2.1. Tipos de datos simples de c++

Tipo EjempJo Tamaiio Rango
en bytes Minimo .. Maximo
char 'C' 0 .. 255
short -15 2 -128 .. 127
int 1024 2 -32768 .. 32767
unsigned int 42325 2 O .. 65535
long 262144 4 -2147483648 .. 2147483637
float '\ 10.5 4 3.4* (10''') .. 3.4* (1038)
double 0.00045 8 1.7* (10'308) .. 1.7* (10308)
long double 1e-8 8 igual que do'uble Los tipos de datos fundamentales en C++ son:

• enteros (numeros completos y sus negativos): de tipo into

• variantes de enteros: tipos short, long y unsigned.

• reales: numeros decimales: tipos float, double 0 long double.

• caracteres: letras, digitos, simbolos y signos de puntuaci6n.

char, int, float y double son palabras reservadas, a mas especificamente, especificadores de tipos. Cada tipo de data tiene su propia /ista de atributos que definen las caracteristicas del tipo y pueden variar de una maquina a otra. Los tipos char, int y double tienen variaciones a modificadores de tipos de datos, tales como short, long, signed y unsigned, para permitir un uso mas eficiente de los tipos de datos.

Un tipo caracter adicional aiiadido en ANSI C++ es wchar _ t.:

wchar t

constante caracter ancha (wide)

Existe

enum bool

2.7.1.

Probablen enteros so Los tipos memona. rango de,

TABLA 2.2

Tipo C++

iunt

unsigned short int

Declara
La forma
mero el til
dar un val
la declarai
<tipo de
Se pu
<tipo_de
Asi, p
t int valc
int vale
\ Los IT
(Tabla 2.2
\ En ap
decimal 0 .ero tiene la )s de datos ·es tipos de

ius tamafios

I.

ximo
5
7
767
535
47483637
4*(1038)
7* (10308)
uble
.,
I"
t.
double.
ion.
.eclficamen-
'ista de atri-
: una maqui-
odificadores
sd, para per-
t: Existen dos tipos adicionales en C++ que se trataran mas adelante:

enum bool

con stante de enumeraci6n constante falso-verdadero

2.7.1.

Enteros (int)

Probablemente el tipo de dato mas familiar es el entero, 0 tipo into Los enteros son adecuados para aplicaciones que trabajen con datos numericos. Los tipos enteros se almacenan internamente en 2 bytes (0 16 bits) de memoria. La Tabla 2.2 resume los tres tipos enteros basicos, junto con el rango de val ores y el tamaiio en bytes usual, dependiendo de cada maquina,

TABLA 2.2. Tipos de datos enteros

Tipo C++

Rango de valores

Uso recomendado

iunt -32.768

+32.767 Aritmetica de enteros, bucles for, conteo, 65.535 Conteo, bucIes for, indices.

+32.767 Aritmetica de enteros, bucles for, conteo.

unsigned int 0

short int

-32.768 I

Declaraci6n de variables

La forma mas simple de una declaraci6n de variable en C++ es poner primero el tipo de dato y a continuaci6n el nombre de la variable. Si se desea dar un valor inicial a la variable, este se pone a continuacion. El formato de la declaraci6n es:

<tipo de data> <nombre de variable> = <valor inicial>

Se pueden tambien declarar multiples variables en la misma linea:

<tipo_de_dato> <nom_var1>, <nom var2> ... <nom-varn>

Asi, por ejemplo,

int valor;

int va Lo r l , valor2;

int valor = 99;

int num_parte = 1141, num_items = 45;

Los tres modificadores (unsigned, short, int) que funcionan con int (Tabla 2.2) varian el rango de los enteros.

En aplicaciones generales, las constantes enteras se pueden escribir en decimal 0 base 10; por ej emplo, 100, 200 0 450. Para escribir una constan-

ELLENGUAJE C++. ELEMENTOS BAslCOS

l •

I

I ,

te sin signo, se afiade la letra U (0 bien u). Por ejemplo, para escribir 40.000; escri ba 4 00 0 0 u . '

Si se utiliza C++ para desarrollar software para sistemas operativos 0 para hardware de computadora, C++ permite escribir constantes enteros en octal (base 8) 0 hexadecimal (base 16). Una constante octal es cualquier numero que comienza con un 0 y contiene digitos en el rango de 1 a 7. Por ejemplo, 0377 es un numero octal. Una constante hexadecimal comienza con Ox y va seguida de los digitos 0 a 9 0 las letras A a F (0 bien a a f). Por ejemplo, OxFF16 es una constante hexadecimal.

La Tabla 2.3 muestra ejemplos de constantes enteras representadas en sus notaciones (bases) decimal, hexadecimal yoctal.

Cuando el rango de los tipos enteros basicos no es suficientemente grande para SLIS necesidades, se consideran tipos enteros largos. La Tabla 2.4 muestra los dos tipos de datos enteros largos. Ambos tipos requieren 4 bytes de memoria (32 bits) de almacenamiento.

Un ejemplo de uso de enteros largos es:

long medida milimetros;

unsigned long distancia_media;

TABLA 2.3. Constantes enteras en tres bases diferentes

Base 10 Base 16 Base 8
Decimal Hexadecimal (Hex) Octal
Ox08 010
10 OxOA 012
16 Ox10 020
65536 OxlOOOO 0200000
24 Ox18 030
17 Oxll 021 Si se desea forzar al compilador para tratar sus constantes como long, afiada la letra L (0 bien 1) a su constante. Por ejemplo,

long numeros_grandes = 40000L;

TABLA 2.4. Tipos de datos enteros largos

Tipo C++

Rango de valores

long

unsigned long

-2147483648 .. 2147483647 o .. +4294967295

52 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

2.7.2. Tipos de coma flotante (float/double)

Los tipos de datos de coma (punta) flotante representan numeros reales que contienen una coma (un punto) decimal, tal como 3.14159, 0 numeros muy grandes, tales como 1.85*1015.

La declaraci6n de las variables de coma flotante es igual que la de variables enteras. Asi, un ejemplo es

float valor;

float valorl, valor2;

Iideclara una variable real Iideclara varios valores de coma Ilflotante

Ilasigna el valor 99.99 a la Ilvariable valor

float valor = 99.99;

c++ soporta tres fonnatos de coma flotante (Tabla 2.5). El tipo floa t requiere 4 bytes de memoria, double requiere 8 bytes y long double requiere 10 bytes.

char dato car;

char letra = 'A'; char respuesta = 'S';

Intemamente, los caracteres se almacenan como numeros, La letra A, por ejemplo, se almacena intemamente como el numero 65, la letra B es 66, la letra c es 67, etc. El tipo char representa val ores en el rango -128 a + 127 y se asocian con el c6digo ASCII.

Dado que el tipo char almacena val ores en el rango de -128 a +127, C++ proporciona el tipo unsignedchar para representar valores de 0 a 255.

Puesto que los caracteres se almacenan intemamente como numeros, se pueden realizar operaciones aritmeticas con datos tipo char. Por ejemplo, se puede convertir una letra minuscula a en una letra mayuscula A, restando 32 del codigo ASCII (vease Apendice D: codigo ASCII). Asi, para realizar la conversi6n, restar 32 del tipo de dato char, como sigue:

char car uno = 'a';

car uno = car uno - 32;

- -

2.S. EI

Los comp tipo de dr (false). La este tipo, ( 10 C que s na la cap; val ores ve

Ejemp/o

bool bis bisiesto bool enc

Dadas

Tipo c++

Precision

TABLA 2.5. Tipos de datos en coma flotante (Borland C++) encontra

indicado encontra

Rango de valores

float double

3.4 X 10"

7 digitos 15 digitos 19 digitos

3.4 X 10-38

1.7 X 10-]08

1.7 x 10308

long double

3.4 x 10-4932 •••

1.1 X 104932

Ejemp/os

float f; f = 5.65

cout « ~f:" « f « endl; double h;

h = 0.0

cout « ~h:" « h « endl;

II definici6n de f II asignaci6n

II visualizaci6n de f:5.65 II definici6n de h

II asignaci6n

II visualiza h: 0.0

2.7.3. Caracteres (char)

Un cardcter es cualquier elemento de un conjunto de caracteres predefinidos 0 alfabeto. La mayoria de las computadoras utilizan el conjunto de caracteres ASCII (vease Apendice D).

C++ procesa datos caracter (tales como texto) utilizando el tipo de data char. En uni6n con la estructura array, que se vera posterionnente, se puede utilizar para almacenar cadenas de caracteres (grupos de caracteres). Se puede definir una variable caracter escribiendo

Esto convierte a (c6digo ASCII 97) a A (c6digo ASCII 65). De modo similar, afiadiendo 32 convierte el caracter de letra mayuscula a minuscula:

car uno = car uno + 32;

Como los tipos char son subconjuntos de los tipos enteros, se puede asignar un tipo char a un entero. Por ejemplo,

int suma = 0; char valor;

cin » valor;

II operador de entrada; apartado II 2.8.2

II operador ...

Ejemp/o

II bool. II muest

#include void mai

bool b
bool b
bool b
int il
int i2
int i3 int i4 bool b bool 1:;J II err" true = false cout <.

suma suma + valor; cout « suma;

Existen caracteres que tienen un prop6sito especial y no se pueden describir utilizando el metodo normal. C++ proporciona secuencias de escape. Por ejemplo, elliteral caracter de un ap6strofe se puede escribir como

. \"

y el caracter nueva linea

La Tabla 2.6 enumera las diferentes secuencias de escape de C++.

s. La letra A, letra B es 66, -128 a+127

-128 a +127, ~sdeOa255. , numeros, se Por ejemplo, a A, restando para realizar

5). De modo a minuscula:

·os, se puede

»a r t ado

: pueden desas de escape. ,ir como

de C++.

2.8. EL TIPO DE DATO BOOL

Los compiladores de C++ que siguen la norma ANSI incorporan un nuevo tipo de dato bool cuyos valores son los valores verdadero (true) y falso (false). Las expresiones 16gicas devuelven en estos compiladores valores de este tipo, en lugar de valores tradicionales de tipo int que es el sistema esti- 10 C que siguen los compiladores antiguos de C++. El tipo bool proporciona la capacidad de dec1arar variables 16gicas, que pueden almacenar los val ores verdadero y falso.

EjempJo

bool bisiesto; bisiesto = true;

bool encontrado, bandera;

Dadas estas dec1araciones, las siguientes asignaciones son todas validas:

encontrado = true; II encontrado toma el valor II verdadero

indicador = false; II indicador toma el valor falso

encontrado = indicador; II encontrado toma el valor de II indicador

EjempJo

II bool.cpp

II muestra uso de bool

#include <iostream.h> void main ()

(

boo 1 bI;
boo 1 b2 = false;
bool b3 = true;
int ii true;
int i2 false;
int i3 b3; int i4 10; bool b4 = i4; bool bS = -i4;

II error, no se puede asignar a literales true-false true = 2;

false = -1;

cout « "bI:" « bi « endl;

EL LENGUAJE C++. ELEMENTOS BAslCOS 53

2.8.1. Simulaci6n del tipo bool

S1 su compilador C++ no inc1uye el tipo bool, debera utilizar el tipo de dato int para representar el tipo de dato bool. C++ utiliza el valor entero 0 para representar falso y cualquier valor entero distinto de cero (normalmente 1) para representar verdadero. De esta forma, se pueden utilizar enteros para escribir expresiones 16gicas de igual forma que se utiliza el tipo bool. Una expresi6n 16gica que se evalua a «0» se considera falsa; una expresi6n logica que se evalua a «distinto de cero» se considera verdadera.

Antes de que se introdujera el tipo bool en C++, el sistema usual de dec1arar datos logicos era definir un tipo enumerado Boolean con dos valores false y true de la forma siguiente:

enurn Boolean {FALSE, TRUE );

Esta declaraci6n hace a Boolean lm tipo definido por el usuario con literales (valores constantes) TRUE Y FALSE.

EJERCICIO 2.1

Si desea simular el tipo bool pero al estilo de tipo incorporado propio, se podria conseguir construyendo un archivo . h (boolean) con constantes con nombre TRUE y FALSE, tal como

II archivo: boolean.h #ifndef BOOLEAN H #define BOOLEAN H typedef int Boolean; const int TRUE = 1; const int FALSE = 0; #endif II BOOLEAN_H

\

1

Entonces, basta con incluir el archivo "boolean. h " y utilizar Boolean como si fuera un tipo de dato incorporado con los literales TRUE y FALSE como literales 16gicos 0 booleanos.

Si desea utilizar las letras minusculas para defmir bool, true y false con compiladores antiguos, se puede utilizar esta versi6n del archivo de cabecera boolean. h.

r

54 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

II archivo: boolean.h #ifndef BOOLEAN H #define BOOLEAN H typedef int bool; const int true = 1; const int'fa1se = 0; #endif II BOLEAN H

2.8.2. Escritura de valores bool

La mayoria de las expresiones logicas aparecen en estructuras de control que sirven para determinar la secuencia en que se ejecutan las sentencias C't+. Raramente se tiene la necesidad de leer valores bool como dato de entrada 0 de visualizar valores bool como resultados de programa. Si es necesario, se puede visualizar el valor de la variable boo1 utilizando el operador de salida «. Asi, si bandera es false, la sentencia

cout « REI valor de bandera es " « Bandera;

visualizara

E1 valor de bandera es 0

Si se necesita leer un dato de una variable tipo boo l , se puede representar el dato como un entero: usar 0 para falso y 1 para verdadero.

2.9. CONSTANTES

En C++ existen cuatro tipos de constantes:

• constantes literales,

• constantes definidas,

• constantes enumeradas,

• constantes declaradas.

Las constantes literales son las mas usuales; toman valores tales como 45.32564,2220 bien "Tri t r o d u z c a sus datos" que se escriben directamente en el texto del programa. Las constantes definidas son identificadores que se asocian con valores literales constantes y que toman determinados nombres. Las constantes declaradas son como variables: sus valores se almacenan en memoria, pero no se pueden modificar. Las constantes enumeradas permiten asociar un identificador, tal como Color, con una secuencia de otros nombres, tales como Azul, Verde, Raja y Amarillo.

2.9.1. Constantes literales

Las constantes literales 0 constantes, en general, se clasifican tambien en cuatro grupos, cada uno de los cuales puede ser de cualquiera de los tipos:

• constantes enteras,

• constantes caracteres,

• constantes de coma flotante,

• constantes de cadena.

Constantes enteras

La escritura de constantes enteras requiere seguir unas determinadas reglas. Recuerde:

• No utilizar nunca comas ni otros signos de puntuaci6n en numeros enteros 0 completos.

123456 en lugar de 123.456

• Para forzar un valor al tipo long, tenninar con una letra L mayusculao Por ejemplo,

1024 es un tipo entero 1024L es un tipo largo (long)

• Para forzar un valor al tipo unsigned, tenninarlo con una letra mayuscula u. Por ejemplo, 4352U.

Formato decimal 123

Formato octal 0777 (estan precedidas de la cifra 0)

Formato hexadecimal OXFF3A (estan precedidas de ROX" 0 bien,

ROX")

Se pueden combinar sufijos L (1), que significa 1 ong (largo), 0 bien, U (u), que significa unsigned (sin signo).

3456UL

Constantes reales

Una constante flotante representa un numero real; siempre tienen signo y representan aproximaciones en lugar de valores exactos.

82. 347 .63 83. 47e-4 1.25E7 61.e+4

Se pueden escribir constantes de coma flotante de diversas fonnas. Si un numero es entero se puede escribir con 0 sin punto decimal:

\ .

15

o bien

15.0

Si el ' esta despi

3.141519

Para ( decimal d Por ejemj

4.5E+5

La no tivo.

2.5E4 5.435E-~

Exist:

float double long dot.

Consta.

Una cons entre com

'A'

Aden ta caracte como por Apendice

Asi, . (Hexadec decimal d

char sic

tambien en iera de los

terminadas

en numeros

L rnayuscu-

19)

n una letra

.a 0)

)x" 0 bien,

go), 0 bien,

nen signo y

; formas. Si

[

15



o bien

15.0

Si el valor de coma flotante tiene una parte decimal, se puede escribir esta despues del punto decimal, como

3.141519

-3.151519

Para escribir numeros en notacion exponencial, se debe seguir la parte decimal del numero con la letra E (0 bien e) y a continuaci6n el exponente. Por ejemplo,

4.5E+5

-3.2E-5

7.12E6

La notaci6n cientifica se representa con un exponente positivo 0 negativo.

equivale a equivale a

25000 0.005435

2.5E4 5.435E-3

Existen tres tipos de constantes:

float double

long double

4 bytes 8 bytes 1.0 bytes

Constantes cerecter

Una constante caracter (char) es un caracter del c6digo ASCII encerrado entre comillas simples.

'A'

'b'

r c'

Adernas de los caracteres ASCII estandar, una constante caracter soporta caracteres especiales que no se pueden representar utilizando su teclado, como por ejemplo los c6digos ASCII altos y las secuencias de escape. (El Apendice D recoge un listado de todos los caracteres ASCII.)

Asi, por ejemplo, el caracter sigma (L) -c6digo ASCII 228, Hex (Hexadecimal E4- se representa mediante el prefijo \x y el mrmero hexadecimal del c6digo ASCII. Por ejemplo,

char sigma = '\xE4';

EL LENGUAJE C++. ELEMENTOS BAslCOS

I I

I·l~.

I.

i Ij 1 !

! '

Este metodo se uti liz a para almacenar 0 imprimir cualquier caractYr,,~~ la tabla ASCII por su numero hexadecimal. En el ejemplo anterior, la variable sigma no contiene cuatro caracteres sino unicamente el simbolo si~~.

Un caracter que se lee utilizando una barra oblicua (\) se llama secue~~ cia 0 codigo de escape. La Tabla 2.6 muestra diferentes secuencias de escape y su significado.

TABLA 2.6. Caracteres secuenciales (c6digos) de escape
Codigo de Escape Signiticado COdigos ASCII
Dec Hex
, \n' nueva linea 13 10 OD OA
'\r' retorno de carro 13 OD
'\ t ' Tabulaci6n 9 09
'\v' tabulaci6n vertical 11 OB
'\a' alerta (pitido son oro) 7 07
'\b' retroceso de espacio 8 08
'\f' avance de pagina 12 OC
'\ \' barra inclinada inversa 92 5C
'\' ' camilla simple 39 27
'\ \\ I doble comilla 34 22
\ \?' signa de interrogaci6n 34 22
'\000' numero octal Todos Todos
'\xhh' numero hexadecimal Todos Todos II Programa: Pruebas c6digos de escape

#include <iostream.h>

main () {

char alarma = '\a';

Iialarma

char bs = '\b';

Ilretroceso de espacio

cout « alarma;

cout « bs;

return 0;

56 PROGRAMACI6N EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

Aritmetice con caracteres C++

Dada la correspondencia entre un caracter y su c6digo ASCII, es posible realizar operaciones aritmeticas sobre datos de caracteres. Observe el siguiente segmento de c6digo:

char c;

c = 'T' + 5;

II suma 5 al caracter ASCII

Realmente 10 que sucede es almacenar y en c. EI valor ASCII de la letra T es 84, y al surnarle 5 produce 89, que es el c6digo de la letra Y. Ala inversa, se pueden alrnacenar constantes de caracter en variables enteras. Asi,

int j = 'p'

No pone una letra p en j, sino que asigna el valor 80 (c6digo ASCII de p) a la variable j.

Constantes cadena

Una constante cadena (tambien llamada literal cadena 0 simplemente cadena) es una secuencia de caracteres encerrados entre dobles comillas. Algunos ejemplos de constantes de cadena son:

"123"

"12 de octubre 1492" "esto es una cadena"

Se puede escribir una cadena en varias lineas, tenninando cada linea con "\"

"esto es una cadena\ que tiene des lineas"

Se puede concatenar cadenas, escribiendo

"ABC" "OEF" "GHI"

"JKL"

que equivale a

"ABCDEFGHIJKL"

En memoria, las cadenas se representan por una serie de caracteres ASCII mas un 0 0 nulo. El caracter nulomarca el final de la cadena y se inser-

ta automaticamente por el compilador C++ al [mal de las constantes de cadenas. Para representar val ores nulos, C++ define el simbolo NULL como una constante en diversos archivos de cabecera (nonnalrnente stdef . h, s tdio. h, stdlib. h y string. h). Para utilizar NULL en un pragrama, incluya uno 0 mas de estos archivos en lugar de definir NULL con una linea tal como

#define NULL 0

Recuerde que una constante de caracteres se encierra entre comi!las simples, y las constantes de cadena encierran caracteres entre dobles cornillas, Por ejemplo,

'z' "Z"

El primer 'Z' es una constante caracter simple con una longitud de 1, Y el segundo" Z" es una constante de cadena de caracteres tarnbien con la longitud 1. La diferencia es que la constante de cadena inc\uye un cera nulo al final de la cadena, ya que C++ necesita conocer d6nde termina la cadena. POl' consiguiente, no puede mezclar constantes caracteres y cadenas de caracteres en su programa.

2.9.2. Constantes definidas (simb6licas)

Las constantes pueden recibir nombres simb6licos mediante la directiva #define.

#define NUEVALINEA #define PI 3.141592 #define VALOR 54

'\n'

/Ivalor de Pi

C++ sustituye los val ores \n, 3.141592 Y 54 cuando se encuentra las constantes simb6licas NUEVALINEA, PI Y VALOR. Las lineas anteriores no son sentencias y, por ello, no tenninan en punto y coma.

cout « "El valor es " « VALOR « NUEVALINEA;

2.9.3. Constantes enumeradas

Las constantes enumeradas permiten crear listas de elementos afines. Un ejemplo tipico es una constante enumerada de lista de colores, que se puede declarar como:

enum Colores {Rojo, Naranja, Amarillo, Verde, Azul, Violeta) ;

com! es 1, decl:

com. una'

Colc

e nur

que

Boo

sect

enu

2.9

El c de c es:

con

cor cor cor

val. inte me!

.tes de cadeL como una h, stdio. h, cluya uno 0 como

tre comillas lobles comi-

gitud de I, Y 11 conla loncero nulo al

ia la cadena. cadenas de

la directiva

encuentra las mteriores no

)S afines. Un que se puede

11,

I I

1

!

Cuando se procesa esta sentencia, el compilador asigna un valor que comienza en ° a cada elemento enumerado; asi, ROJO equivale a 0, NARANJA es I, etc. El compilador enumera los identificadores por usted. Despues de declarar un tipo de dato enumerado, se pueden crear variables de ese tipo, como con cualquier otro tipo de datos. Asi, por ejemplo, se puede definir una variable de tipo Colores.

Colores Colorfavorito = Verde;

Otro ejemplo puede ser:

enum Boolean { False, True };

que asignara al elemento Fal se el valor ° y a True el valor l.

Para crear una variable de tipo 16gico declarar:

Boolean Interruptor = True;

Es po sible asignar val ores distintos de los que les corresponde en su secuencia natural

enum LucesTrafico {Verde, Amarillo

10, Roj o} ;

2.9.4. Constantes declaradas const y volatile

EI cualificador const pennite dar nombres simb6licos a constantes a modo de otros lenguajes, como Pascal. EI formate general para crear una constante es:

const tipo nombre

valor;

Si se omite tipo, C++ utiliza int (entero por defecto)

const int Meses=12; II Meses es constante simb61ica valor 12

const char CARACTER='@'; const int OCTAL=0233;

canst char CADENA []="Cursa de C++ff;

C++ soporta el calificador de tipo variable const. Especifica que el valor de una variable no se puede modificar durante el programa. Cualquier intento de modificar el valor de la variable definida con const producira un mensaje de error.

",

EL LENGUAJE c++. ELEMENTOS sAslCOS 51

const int semana = 7;

const char CADENA []= "Programaci6n en C++ff;

La palabra reservada volatile actua como const, pero su valor puede ser modificado no s610 por el propio program a, sino tambien por el hardware 0 por el software del sistema. Las variables volatiles, sin embargo, no se pueden guardar en registros, como es el caso de las variables nonnales.

58 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

2.10. VARIABLES

En C++ una variable es una posici6n con nombre en memoria donde se almacena un valor de un cierto tipo de dato y puede ser modificado. Las variables pueden almacenar todo tipo de datos: cadenas, numeros y estructuras, Una constante, por el contrario, es una variable cuyo valor no puede ser modificado.

Una variable tipicamente tiene un nombre (un identificador) que describe su prop6sito. Toda variable utilizada en un programa debe ser declarada previamente. La definicion en C++ puede situarse en cualquier parte del programa (en C ANSI debe declararse, sin embargo, al principio del bloque, antes de toda sentencia ejecutable). Una definicion reserva un espacio de almacenamiento en memoria. El procedimiento para definir (crear) una variable es escribir el tipo de dato, el identificador 0 nombre de la variable y, en ocasiones, el valor inicial que tornara. Por ejemplo,

char Respuesta;

significa que se reserva espacio en memoria para Respuesta, en este caso, un caracter ocupa un byte.

EI nornbre de una variable ha de ser un identificador valido, Es frecuente, en la actualidad, utilizar subrayados en los nombres, bien al principio 0 en su interior, con objeto de obtener mayor legibi1idad y una correspondencia mayor con el elemento del mundo real que representa.

salario

dias de semana

edad alumno

fax

2.10.1. Declaraci6n

Una declaracion de una variable es una sentencia que proporciona informacion de la variable al compilador C++. Su sintaxis es:

I tipo variable I

tipo es el nombre de un tipo de dato conocido pOl' C++

variable es un identificador (nombre) valido en C++.

Ejemp/os

long dNumero;

double HorasAcumuladas; float HorasPorSemana;

. float NotaMedia; short DiaSemana;

Es preciso declarar las variables antes de utilizarlas. Se puede declarar una variable en dos lugares dentro de un programa:

• al principio de un archivo 0 bloque de codigo;

• en el punta de utilizacion.

AI principio de un archivo 0 bloque de c6digo

Este es el medio tradicional de C para declarar una variable. La variable se de clara al principio del archivo en c6digo fuente 0 bien al principia de una funci6n.

#include <iostream.h> Ilvariable al principio del archivo

int MiNumero;

main () {

co.ut « "<.Cuill es su riume r o favorito?"; cin,>S MiNumero;

return 0;

#include <iostream.h> Ilvariable al principio de funci6n

main () (

int i; int j;

En el punto de utilizecion

C++ proporciona una mayor flexibilidad que C en la declaraci6n de variables, ya que es posible dec1arar lila variable en el punto donde se vaya a utilizar. Esta propiedad se utiliza mucho en el diseiio de bucles (Capitulo 6). En C el sistema de declarar una variable para controlar el bucle for es:

int j;

for (j = 0; j < 10; j++) (

II ...

Sin embargo, en C++ es posible declarar la variable en el momenta de su utilizaci6n.

for(int (

II .,.

EnC I llla, mient cias ejecui

Ejemp/o

II Dista

#include

void mai

const cout < cout < in t Lt luna ¥ cout < cout <

EJEMPI

Este ejem parte de 1

#includE I I D'i f e i main ()

{

int x x = 7: yl = : int y:

" Gout retur:

2.10.2.

En algun do valor declaraci

.uede declarar

~a variable se ncipio de una

=1 archivo

funcion

.ion de variase vaya a utiapitulo 6). En or es:

momento de

for lint j (

0; j < 10; j++)

I I ...

En C las declaraciones se han de situar siempre al principio del prograrna, mientras que en C++ las declaraciones se pueden rnezclar con sentencias ejecutables. Su ambito es el bloque en el que estan declaradas.

EjempJo

il Distancia a la luna en kilometros I

,include <iostream.h>

k

void main()

(

const int Luna = 238857;lldistancia en millas

~:. cout « "Distancia a la Luna H « luna;

".1 cout « " m i Ll a s vn"r

~'int luna_kilo;

luna kilo = luna*I.6091Iuna milIa = 1.609 kilometros .·cout « "En kilometros es H « luna kilo;

cout « " km. \nH;

, ;I'EJEMPLO 2.3

Este ejemp/o muestra como una variable puede ser declarada en cualquier 'parte de un program a C++.

#include <iostream.h>

'II Diferentes declaraciones main()

,{

int x, yl;!1 declarar a las variables x e yl x = 75;

yl = 89;

int y2 = ~O;II declarar a variable y2 inicializ~ndola a 50 ~_ Gout « x « ", H « yl« , «y2« endl;

,return 0;

2.10.2. Inicializaci6n de variables

En algunos program as anteriores, se ha proporcionado un valor denorninado valor inicial, a una variable cuando se declara. El formato general de una deelaraci6n de inicializaci6n es:

EL LENGUAJE c++. ELEMENTOS sAslcoS 59

tipo nombre_variable = expresi6n

expresi6n es cualquier expresi6n valida cuyo valor es del mismo tipo que tipo.

Nota: esta sentencia deelara y proporciona un valor inicial a una variable.

Las variables se pueden inicializar a la vez que se declaran, 0 bien, inicializarse despues de la declaraci6n. El primer metodo es probablemente el mejor en la mayoria de los casos, ya que se comb ina la definici6n de la variable con la asignaci6n de su valor inicia!.

char respuesta = '3'; int contador = 1; float peso = 156.45; int anio = 1992;

Estas acciones crean variables respuesta, contador, peso y anio, que almacenan en memoria los valores respectivos situados a su derecha.

El segundo metodo consiste en utilizar sentencias de asignaci6n diferentes despues de definir la variable, como en el siguiente caso:

char barra; barra = 'I';

2.10.3. Declaracion 0 definicion

La diferencia entre declaracion y definicion es suti!. Una declaraci6n introduce un nombre de un objeto 0 de una variable y asocia un tipo con la variable/objeto. Una definici6n es una declaraci6n que asigna simultaneamente memoria al objeto/variable.

double x;

II declara el nombre de la variable x de tipo II double

Ih declara c var de tipo char

II definido pero no inicializado II definido e inicializado a cera.

char c_var; int i;

int i = 0;

2.11. DURACION DE UNA VARIABLE

Dependiendo dellugar donde se definan las variables de C++, estas se pueden utilizar en la totalidad del programa dentro de una funci6n 0 pueden existir s610 temporalmente dentro de un bloque de una funci6n. La zona de un programa en la que una variable esta activa se denomina, normalmente, ambito 0 alcance «<scope»).

f

I

60 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

El ambito (alcance) de una variable se extiende hasta los limites de la definici6n de su bloque. Los tipos basicos de variables en C++ son:

• variables locales; variables globales; variables dinamicas;

• variables de campos de objetos.

2.11.1. Variables locales

Las variables locales son aquellas definidas en el interior de una funci6n y son visibles s610 en esa funcion especifica. Las reglas por las que se rigen las variables locales son:

1. En el interior de una funci6n, una variable local no puede ser modificada por ninguna sentencia extema a la funci6n.

2. Los nombres de las variables locales no han de ser unicos. Dos, tres o mas funciones -por ejemplo- pueden definir variables de nombre Interruptor. Cada variable es distinta y pertenece a la funci6n en que esta declarada,

3. Las variables locales de las funciones no existen en memoria hasta que se ejecuta la funci6n. Esta propiedad pennite ahorrar memoria, ya que pennite que varias funciones compartan la misma memoria para sus variables locales (pero no a la vez).

Por la raz6n dada en el punto 3, las variables locales se llaman tambien automaticas 0 auto, ya que dichas variables se crean autornaticarnente en la entrada a la funci6n y se liberan tambien automaticamente cuando se termina la ejecuci6n de la funci6n.

#include <iostream.h>

main () (

int a, b, c, suma; int numero;

Ilvariables locales Ilvariable local

cout « "CuAntos n6meros a sumar"; cin » n6mero;

suma = a + b + c;

2.11.2. Variables globales

Las variables globales son variables que se declaran fuera de la funci6n y por defecto (omisi6n) son visibles a cualquier funci6n incluyendo main () .

#include <iostream.h>

int a, b, c;

Iideclaraci6n de variables globales

main ()
{
int A;
A 124
Q 1;
I {
t· int B
t
I B 1
A 4
I Q 2
I (
int
C
B
A
Q 2.12. E
La bibliote:
convenient
da y salida
incluye en
camente. E
teclado. El
pantalla de
2.12.1.
Eloperado
za en la par
cout «
visualiza
Esto es L
Es pos
,. cout « ~
I main () {

int valor;

II ...

Iideclaraci6n de variable local

La memoria asignada a una variable global permanece a traves de la ejecuci6n del programa, tomando espacio valido segun se utilice. Por esta raz6n, se debe evitar utilizar muchas variables globales dentro de un programa. Otro problema que surge con variables globales es que una funcion puede asignar un valor especifico a una variable global. Posterionnente, en otra funci6n, y por olvido, se pueden hacer cambios en la misma variable. Estos cambios dificultaran la localizaci6n de errores.

2.11.3. Variables dinarnicas y de objetos

Las variables dinamicas 0 punteros tienen caracteristicas que en algunos casos son simi lares tanto a variables locales como a globales. Al igual que una variable local, una variable dinamica se crea y Iibera durante la ejecuci6n del programa. La diferencia entre una variable local y una variable dinamica es que 1a variable dinamica se crea tras su petici6n (en vez de automaticamente, como las variables locales), es decir, a su voluntad, y se lib era cuando ya no se necesita. Al igual que una variable global, se pueden crear variables dinamicas que son accesibles desde multiples funciones. Las variables dinarnicas se examinan en detalle en el Capitulo 9 (Punteros).

Los objetos son tipos agregados de dato que pueden contener multiples funciones y variables juntas en el mismo tipo de dato. En el Capitulo 13 se introducen los objetos, tipo de dato clave en C++ y sobre todo en prcgramaci6n orientada a objetos.

Q es una variable global por estar definida fuera de todos los bloques y es accesible desde todas las sentencias. Sin embargo, las definiciones dentro de main, como A, son locales a main. Por consiguiente, s610 las sentencias interiores a main pueden utilizar A.

# include <iostream.h> int Q;'

Alcance 0 ambito global Q,variable global

s

ves de la ejeice. Por esta '0 de un pro: una funci6n 'iormente, en :ma variable.

e en algunos Al igual que mte la ejecuuna variable n (en vez de oluntad, y se ai, se pueden inciones. Las "unterosy.

ner multiples apitulo 13 se 10 en progra-

los bloques y iiciones denIo las senten-

main ()
{
int A;
A 124;
Q 1;
{
int B;
B 124;
A 457;
Q 2;
{
int C; -------- Local a main

A, variable local

-------- Primer subnivel en main B, variable local

-------- Subnivel mas interno de main C, variable local

C 124;
B 457;
A 788;
Q 3; I I

I

1 I

,

2.12. ENTRADAS Y SALIDAS

La biblioteca C++ proporciona facilidades para entrada y salida que son mas convenientes que las funciones de biblioteca clasica de C. En C++ la entrada y salida se lee y escribe enflujos (streams). Cuando iostream.h se incluye en un program a, diferentes flujos estandar son definidos automaticamente. El flujo cin se utiliza para entrada, que nonnalmente se lee de teclado. El flujo cout se utiliza para salida y, nonnalmente, se envia a la pantalla del usuario.

2.12.1. Salida [cou t)

El operador de insercion, «, insecta datos en el flujo cout que los visual iza en Ia pantalla de su equipo. Asi, por ejemplo,

cout « "Esto es una cadenaU;

visualiza

Esto es una cadena

Es posible utilizar una serie de operadores « en cascada. Asi,

cout « 500 « 600 « 700;

EL LENGUAJE C++. ELEMENTOS BAslCOS 61 ~

visualiza

•• 1 ;

500 600 700

De igual modo,

cout « 500 « " U « 600 «

« 700;

visualiza

500, 600, 700

Suponiendo que

i = 5

n = 40.791512

j = 12

la sentencia

cout « i « j « c « n;

visualizara en pantalla

512A40.791512

C++ utiliza secuencias de escape para visualizar caracteres que no estan representados por simbolos tradicionales, tales como \a, \b, etc. Las secuencias de escape clasicas se muestran en la Tabla 2.7.

TABLA 2.7. Caracteres secuencias de escape

Secuencia de escape

Significado

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

Alanna

Retroceso de espacio Avance de pagina

Retorno de carro y avance de linea Retorno de carro

Tabulacion

Tabulaci6n vertical

Barra inclinada

Signo de interrogaci6n DobIes comillas Numero octal

Numero hexadecimal Cero, nulo (ASCII 0)

\?

\" \000 \xhh \0

r

62 PROGRAMACI6N EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

Las secuencias de escape proporcionan flexibilidad en las aplicaciones mediante efectos especiales.

cout « "\n Error - Pulsar una tecla para continuar \n";

cout « "\n"

Iisalta a una nueva linea

cout « "Yo estoy preocupado\n no por 'el funcionamiento \n sino por la claridad .\n";

la ultima sentencia visualiza

Yo estoy preocupado'

no por el funcionamiento

sino por la claridad.

debido a que la secuencia de escape '\ n ' significa nueva linea 0 saIto de linea. Otros ejemplos pueden ser:

cout « "\n Tabla de n6meros \n";

Iluso de \n para nueva Illinea

cout « "nNuml\t Num2\t Num3\n";

Iluso de \t para Iitabulaciones

cout « '\a';

Iluso de \a para alarma Iisonora

en los que se utilizan los caracteres de secuencias de escape de nueva linea (\n), tabulacion (\ t) Y alarma (\a).

EJEMPLO 2.4

Ellistado SECESC. cee utiliza secuencias de escape, tales como emitir sonidos (pitidos) en el terminal dos veces y a continuacion presentar dos retrocesos de espacios en blanco.

II Programa:SECESC.CPP II Autor J.R. Mortimer

II Prop6sito: Mostrar funcionamiento de secuencias de II escape

#include <iostream.h>

main () (

char sonidos='\a'; Iisecuencia de escape alarma en Iisonidos

char bs='\b'; Iialmacena secuencia escape retroceso lien bs

cout « sonidos;

Ilenvia secuencia de escape al Iiterminal

--,-

cout « sonidos;

Ilemite el sonido dos veces

cout « "Z~";

Ilimprime dos caracteres

cout « bs;

Ilenvia secuencia de escape al Iiterminal

cout « bs;

Ilmueve el cursor al primer caracter I I' z:

return 0;

Ilretorno de 0

2.12.2.

Entrada (cin)

El archivo de cabecera iostream. h de la biblioteca C++ proporciona un flujo de entrada estandar cin y un operador de extraccion, », para extraer val ores del flujo y almacenarlos en variables. Si no se redirige explicitamente cin, la entrada pro cede del teclado.

int n; cin » n;

double x; cin » x;

El medio mas sencillo para introducir respuestas por teclado es utilizar el flujo de entrada y el operador de extracci6n en union de un f1ujo de salida y el operador de inserci6n. Un ejemplo tipico es el siguiente:

cout « "Introduzca vI y v2:";
cin » vI » v2 Illectura valores vI y v2
cout « "vl= " « vI « " ,b= " « b « '\n'i
cout « "Precio de venta al pub Li co " ;
cin » Precio venta; EJEMPLC

iCuat es fa letras LJ?

Este capitulo teriores capin aprendera el I: bir programas

La estn La may princip: maci6n de para Cada pi de los r-

• En C+entrada

• Para vi: insercic

• Los n01 co, segi

en

retroceso

3.1

caracter

-porciona un para extraer ge explicita-

teclado es uni6n de un tipico es el

1 !

I

\

I

I

I

i

EJEMPLO 205

~ CuM es la salida del siguiente programa, si se introducen par teclado las letras LJ?

ELLENGUAJE C++o ELEMENTOS BAsICOs63

main () {

char prirnero, ultimo;

cout « Ulntroduzca su primera y 61tima inicial:"; cin » primero » ultimo;

cout « UHola," « primero « " " « ultimo « "0 '\n";

}

RESUMEN

Este capitulo Ie ha introducido a los componentes basicos de un programa C++. En posteriores capitulos se analizaran en profundidad cada uno de los componentes. Asi:m.ismo, aprendera el modo de utilizar las caracteristicas mejoradas en C++ que Ie penni ten escribir programas orientados a objetos. En este capitulo ha aprendido 10 siguiente:

La estructura general de un program a C++.

La mayoria de los programas C++ tienen una 0 mas directivas #include al principio del programa fuente. Estas directivas #include proporcionan informacion adicional para crear su programa; este, normal mente, utiliza #include para acceder a funciones definidas en archivos de biblioteca.

• Cada programa debe incluir una funcion Ilamada main (), aunque la mayoria de los programas tendran muchas funciones ademas de main () .

En C++ se utiliza el flujo cin y el operador de extraccion » para obtener entrada del teclado.

Para visualizar salida a la pantalla, se utiliza el flujo cout y el operador de insercion «.

Los nornbres de los identificadores deben comenzar con un caracter alfabetico, seguido por un numero de caracteres alfabeticos 0 numericos, 0 bien, el

caracter subrayado U. El cornpilador normalmente ignora los caracteres posterior al 32.

• Los tipos de datos basicos de C++ son: enteros (int), entero largo (long), caracter (char), coma flotante (float, double y long double). Cada uno de los tipos enteros tiene un calificador unsigned para almacenar valores positivos. EI tipo double tiene un tipo long double que incrementa el nurnero de posiciones decimales significativos.

Los tipos de datos caracter utilizan I byte de memoria; el tipo entero utiliza 2 bytes; el tipo entero largo utiliza 4 bytes y los tipos de coma flotante 4, 8 0 10

bytes de almacenamiento. .

• Se utilizan conversiones forzosas de tipo 0 moldes/ahormados de tipos (cast) para convertir un tipo a otro. EI compilador realiza automaticamente muchas conversiones de tipos. Por ejemplo, si se asigna un entero a una variable float, el compilador convierte automaticamente el valor entero a un tipo float.

Se puede seleccionar explicitamente una conversion de tipos precediendo la variable 0 expresion con (tipo), en donde tipo es un tipo de dato valido.

EJERCICIOS

r~r-~~=-=--=-=-=-=-=-==============-========---- .. ---- -- - - ---

64 PROGRAMACION EN C++. ALGORITMOS, ESTRUCTURAS Y OBJETOS

,-.-

CAPiTU

OPE

CONTENIDO

3.1. Opera: 3.2. Opera: 3.3. Opera: 3:·4. Operar 3.5. Operar 3.6. Opera: 3.7. Opera! 3.8. Opera!

Los program de numerosa dad. Este cal siones para que ~e analiz

• aritme

• de mal

• condie

• espec~

Aden1~s·!

seguira el co tipos de open

Concepto

~

• Operador, j

Asignaci6t

• Conversio]

• Prioridad/j

• Evaluacior

• Conversio

"

You might also like