Está en la página 1de 87

MIGUEL .

TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-1
CONTENIDO DE LA LECCIN 7

OPERACIONES BSICAS

1. Introduccin 3
2. Operadores matemticos bsicos 4
2.1. Ejemplos 6.1, 6.2, 6.3, 6.4, 6.5, 6.6 5
2.2. Incrementando el valor de una variable en uno 5
2.2.1. Ejemplos 6.7, 6.8 9
2.3. Operador de incremento usado como prefijo y como posfijo 10
2.3.1. Ejemplos 6.9, 6.10 11
2.4. Operador de decremento 12
2.4.1. Ejemplo 6.11 12
2.5. Examen breve 13 85
2.6. Operaciones de asignacin 13
2.6.1. Ejemplo 6.12 13
2.7. Examen breve 14 85

3. Solucin de problemas en accin: Control de inventarios 15
3.1. Problema 15
3.2. Definicin del problema 15
3.3. Planeacin de la solucin 15
3.4. Codificacin del programa 18

4. Operaciones booleanas 20
4.1. Operadores relacionales 21
4.1.1. Ejemplos 6.13, 6.14, 6.15 21
4.2. Operadores lgicos 24
4.3. Operadores lgicos al nivel de bits 25
4.3.1. Ejemplos 6.16, 6.17, 6.18, 6.19, 6.20, 6.21 261

5. Rotacin de bits 33
5.1. Ejemplo 6.22 33

6. El operador sizeof() 34
6.1. Ejemplos 6.23, 6.24 34

7. Asignacin de tipo (typecasting) 36
7.1. Ejemplo 6.25 36

8. Solucin de problemas en accin: Lgica booleana 37
8.1. Problema 37
8.2. Definicin del problema 37
8.3. Planeacin de la solucin 38
8.4. Codi ficacin del programa 39

9. Biblioteca de manejo de caracteres 40
9.1. Ejemplos 6.26, 6.27, 6.28 41
9.2. Funciones de conversin de cadenas 44
9.2.1. Ejemplos 6.29, 6.30, 6.31, 6.32, 6.33, 6.34, 6.35 44
9.3. Funciones de bsqueda de la biblioteca de manejo de cadenas 49
9.3.1. Ejemplos 6.36, 6.37, 6.38, 6.39, 6.40, 6.41 49
9.4. Funciones de memoria de la biblioteca de manejo de cadenas 52
9.4.1. Ejemplos 6.42, 6.43, 6.44, 6.45, 6.46 53
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-2

9.5. Otras funciones de la biblioteca de manejo de cadenas 55
9.5.1. Ejemplos 6.47, 6.48 55

10. Funciones matemticas 58
10.1.1. Ejemplo 6.49 58

11. Examen breve 16 65

12. Solucin de problemas en accin: Comunicacin de datos 65
12.1. Problema 652
12.2. Definicin del problema 66
12.3. Planeacin de la solucin 66
12.4. Codificacin del programa 67

13. Solucin de problemas en accin: Coordenadas polares y rectangulares 68
13.1. Problema 68
13.2. Definicin del problema 69
13.3. Planeacin de la solucin 70
13.4. Codificacin del programa 71

14. Jerarqua de los operadores 71
15. Lo que necesita saber 74
16. Preguntas y problemas 77
16.1. Preguntas 77
16.2. Problemas 80
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-3
LECCIN 7
OPERACIONES BSICAS

INTRODUCCIN

En estos momentos est preparado para escribir programas lineales. Por programa
lineal se debe entender que no alteran su flujo, simplemente ejecuta una serie de
enunciados secuenciales, desde el principio hasta el final.

Para que sus programas realicen tareas importantes, deber familiarizarse con
algunas operaciones estndar preconstruidas disponibles en C++. Las ms simples de stas
son las operaciones aritmticas estndar. Por definicin, una operacin aritmtica genera
un resultado numrico. Tales operaciones son el tema de la primera seccin de esta leccin.

La segunda seccin tiene que ver con los operadores de asignacin C++. Estos
tienen la funcin de dar un valor a una variable. Hay operadores de asignacin compuestos
en C++que permiten combinar una operacin aritmtica con la operacin de asignacin.

Adems de las operaciones aritmticas existen operaciones lgicas disponibles en
C++que generan un resultado verdadero (true) o falso (false) Estas operaciones se cubren
en la tercera seccin.

Para simplificar la tarea de programacin, C++emplea algunas funciones estndar.
Estas le permiten implementar con facilidad muchas operaciones comunes, como raz
cuadrada, seno y coseno, etc., sin rutinas de escritura especial. Las funciones estndar se
presentan en la seccin cuatro.

Objetivos de la leccin:

Saber lo que son los operadores y las expresiones aritmticas.
Realizar las operaciones bsicasen C++.
Utilizar los operadores de asignacin aritmtica.
Comprender la jerarqua de los operadores C++.
Utilizar los operadores de incremento y decremento de C++.
Utilizar los operadores para el manejo de bits.
Ser capaz de utilizar las funciones de la biblioteca de manejo de caracteres (ctype.h)
Ser capaz de utilizar las funciones de procesamiento de cadenas de la biblioteca de
manejo de cadenas (string.h)
Ser capaz de utilizar las funciones matemticas de la biblioteca <math.h>.
Apreciar el poder de las bibliotecas de funcin como un medio para lograr la
reutilizacin del software.
Utilizar el operador sizeof.
Utilizar el manejo de tipos(typecasting)

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-4
OPERADORES MATEMTICOS BSICOS

Las operaciones aritmticas en C++incluyen las operaciones comunes de suma,
resta, multiplicacin y divisin, tambin operaciones de incremento/decremento. Las
operaciones bsicas de adicin, resta, multiplicacin y divisin pueden realizarse sobre
cualquier clase de dato numrico. Recuerde que las clases de datos numricos estndar en
C++son los enteros y punto flotante. Adems, en C++es posible realizar operaciones
aritmticas sobre datos de caracteres, ya que los caracteres se representan como enteros
(ASCII) dentro de la computadora.

La tabla 6.1 lista las operaciones aritmticas bsicas y los smbolos que usa C++
para representar estas operaciones. Los operadores de suma (+), resta (-) y multiplicacin
(*) son directos y no necesitan ninguna otra explicacin. Sin embargo, observe que para la
multiplicacin se usa un asterisco (*) en lugar del smbolo ( ) para que la computadora no
confunda el smbolo de multiplicacin con el carcter x. Dichas operaciones pueden ser
entre constantes (tal como 3*5), o entre variables (pago compra)

Tabla 6.1. Operadores aritmticos definidos en C++

Operador Propsito Ejemplo

+ Ms unario x = +y + 3;
- Menos unario x = -y;
+ Suma total = costo + impuesto;
- Resta cambio = pago compra;
* Multiplicacin impuesto = costo * TASA_IMPUESTO;
/ Divisin promedio = total / contador ;
% Mdulo (Residuo) x = 5 % 3;


El operador de divisin necesita una atencin especial. Este operador generar un
resultado de la misma clase de datos de los operandos que se utilizan en la operacin. De
esta manera, si divide dos enteros, obtendr un resultado entero. Si divide uno o ms
valores decimales de punto flotante, obtiene un resultado decimal. Por lo tanto, 10 / 3 =3 y
10.0 / 3 =3.333333. Aqu, la primera es una divisin de enteros y genera un resultado
entero. La ltima es una divisin de punto flotante y genera un resultado de punto flotante.

Por ltimo, el operador mdulo o de residuo, se define slo para operandos
enteros. Obtendr un error de compilacin si trata de aplicarlo a valores de punto flotante.
El operador mdulo (%) simplemente genera el residuo que resulta cuando divide dos
enteros. Por ejemplo, el resultado de 5 % 3 es 2, 8 % 4 es 0.

Veamos un par de ejemplos que ilustran estas operaciones. En el ejemplo 6.1 se
muestran algunas operaciones aritmticas entre enteros y en el 6.2, operaciones aritmticas
de valores de punto flotante.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-5
Ejemplo 6.1.

Qu valor resultar de cada una de las siguientes operaciones?

a. 3 * (-5)
b. 4 * 5 10
c. 10 / 3
d. 9 % 3
e. 21 / (-2)
f. 21 % (-2)
g. 4 * 5 / 2 + 5 % 2

Solucin

a. 3 * (-5) es igual a 15.
b. 4 * 5 10 es igual a 10. Observe que la operacin de multiplicacin se realiza antes de la operacin
de substraccin.
c. 10 / 3 es igual a 3. Debido a que sta es una divisin de enteros.
d. 9 % 3 es igual 0, porque no hay residuo.
e. 21 / (-2) es igual a 10.
f. -21 % (-2) es igual a residuo 1.
g. 4 * 5 / 2 +5 % 2= (4*5) / 2 + 5 % 2 = (20/2) + 5 % 2 = 10 + (5 % 2) = 10 + 1 = 11. Observe que
los operadores de multiplicacin, divisin y mdulo se realizan primero, de izquierda a derecha. La
operacin de adicin se realiza al ltimo.

El ejemplo anterior muestra la prioridad u ordenamiento de los operadores. Cuando se realiza
ms de una operacin en una expresin, debe conocerse el orden en el que se realizar cada una
para determinar el resultado. C++realiza las operaciones en el siguiente orden:

Primero se realizan todos los operadores dentro de parntesis.
Si hay parntesis anidados (parntesis dentro de parntesis) primero se
realizan los operadores ms internos, desde dentro hacia fuera.
Los operadores *, / y % se realizan despus, de izquierda a derecha dentro de
la expresin.
Por ltimo se realizan los operadores + y -, de izquierda a derecha dentro de
la expresin.

Las operaciones aritmticas de valores de punto flotante son bsicamente igual a
aqullas con enteros, con la excepcin de la divisin. Recuerde que el operador / dar como
resultado un valor de punto flotante si cualquiera de sus operandos es de punto flotante.
La operacin mdulo (%) se define slo para enteros y generar un error de compilacin si
intenta aplicarlo a valores de punto flotante.

La multiplicacin y divisin tienen la misma prioridad dentro de una expresin
aritmtica cuando se realizan operaciones de punto flotante. De esta manera los operadores
dentro de parntesis se realizan primero, seguido por la multiplicacin y divisin, y estos a
su vez por la adicin y sustraccin.

Ejemplo 6.2.

Evale cada una de las siguientes expresiones:

a. 4.6 2.0 + 3.2
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-6
b. 4.6 2.0 * 3.2
c. 4.6 2.0 / 2 * 3.2
d. 3.0 * ((4.3 + 2.5) * 2.0) 1.0
e. 21.0 / -2
f. 21.0 % -2
g. 10.0 / 3
h. ((4 * 12) / (4 + 12))
i. 4 * 12 / 4 + 12

Solucin

a. 4.6 2.0 + 3.2 = (4.6 2.0) + 3.2 = 2.6 + 3.2 = 5.8
b. 4.6 2.0 * 3.2 = 4.6 (2.0 * 3.2) = 4.6 6.4 = -1.8
c. 4.6 2.0 / 2 * 3.2 = 4.6 ((2.0 / 2) * 3.2) = 4.6 (1.0 * 3.2) = 4.6 3.2 = 1.4
d. 3.0 * ((4.3 + 2.5) * 2.0) 1.0 = 3.0 * (6.8 * 2.0) 1.0 = 3.0 *13.6 1.0 = -40.8 1.0 = -41.8
e. 21.0 / -2 = 10.5
f. 21.0 % -2 = Error, uso ilegal de punto flotante porque % se define slo para valores enteros.
g. 10.0 / 3 = 3.333333
h. ((4 * 12) / (4 + 12)) = 48 / 16 = 3
i. 4 * 12 / 4 + 12 = 48 / 4 + 12 = 12 + 12 = 24

En caso de dudas se sugiere utilizar parntesis. Veamos ahora algunos programas
sencillos en el que se muestre el uso de las operaciones aritmticas.

Ejemplo 6.3

El siguiente programa: MSTRMAT.CPP, utiliza cout para visualizar el resultado de algunas
operaciones aritmticas bsicas:

























/* El siguiente programa: MSTRMAT.CPP, ilustra el uso de cout para visualizar
el resultado de algunas operaciones aritmticas bsicas.
*/

#include <iostream.h> //Para cout

void main(void)
{
int segundosHora;
float promedio;

//Ejemplos en los que se manejan valores fijos.
cout <<"5 +7 =" <<5 +7 <<endl;
cout <<"12 - 7 =" <<12 7 <<endl;
cout <<"1.2345 * 2 =" <<1.2345 * 2 <<endl;
cout <<"15 / 3 =" <<15 / 3 <<endl <<endl;

//Ejemplos en los que se manejan objetos variables.
segundosHora =60 * 60;
promedio =(5 +10 +15 +20) / 4;

cout <<"El nmero de segundos en una hora es : " <<
segundosHora <<endl;
cout <<"El promedio de 5, 10, 15 y 20 es : " <<promedio <<endl;
cout <<"El nmero de segundos en 48 minutos es: " <<
segundosHora - 12 * 60 <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-7
Ejemplo 6.4

El siguiente programa: OPER1.CPP, tambin ilustra el uso de las operaciones matemticas
bsicas as como de objetos variables. En este programa utilizamos el objeto cin que en la
leccin 7 (Introduccin de datos por teclado) veremos que se utiliza para introducir datos a
la computadora.

/* El siguiente programa: OPER1.CPP, ilustra el uso de operaciones matemticas
sencillas mediante el uso de objetos variables. Utilizaremos tambin el objeto
cin para introducir datos a la computadora.
*/

#include <iostream.h> //Para cout y cin

void main(void)
{
int int1, int2;
long long1, long2, long3, long4, long5;
float x, y, real1, real2, real3, real4;

cout <<endl <<"Digite el primer nmero entero: ";
cin >>int1;
cout <<" Digite el segundo nmero entero: " ;
cin >>int2;
cout <<endl;

//Operaciones aritmticas con nmeros enteros.
long1 =int1 +int2;
long2 =int1 - int2;
long3 =int1 * int2;
long4 =int1 / int2;
long5 =int1 % int2;

cout <<int1 <<" +" <<int2 <<" =" <<long1 <<endl;
cout <<int1 <<" - " <<int2 <<" =" <<long2 <<endl;
cout <<int1 <<" * " <<int2 <<" =" <<long3 <<endl;
cout <<int1 <<" / " <<int2 <<" =" <<long4 <<endl;
cout <<int1 <<" % " <<int2 <<" =" <<long5 <<endl;
cout <<endl <<endl;

cout <<" Digite el primer nmero real : " ;
cin >>x;
cout <<" Digite el segundo nmero real: ";
cin >>y;
cout <<endl;

//Operaciones aritmticas con nmeros reales.
real1 =x +y;
real2 =x - y;
real3 =x * y;
real4 =x / y;

cout <<x <<" +" <<y <<" =" <<real1 <<endl;
cout <<x <<" - " <<y <<" =" <<real2 <<endl;
cout <<x <<" * " <<y <<" =" <<real3 <<endl;
cout <<x <<" / " << y <<" =" <<real4 <<endl;
cout <<endl <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-8
Ejemplo 6.5

El siguiente programa: MATVARS.CPP, realiza operaciones aritmticas utilizando las
variables precio (15.00), tasaImpuesto (6%), importePagado(20.00), impuesto, cambio y
total.



























Ejemplo 6.6

El siguiente programa: MODULO.CPP, ilustra el uso del operador % (mdulo)















/* El siguiente programa: MODULO.CPP, ilustra el uso del operador % (mdulo)*/

#include<iostream.h> //Para cout

void main (void)
{
int residuo;
int resultado;

resultado =10 / 3;
residuo =10 % 3;

cout <<"El cociente de 10/3 es: " <<resultado <<", " <<
"el residuo es : " <<residuo <<endl;
}//Fin de main()
/* El siguiente programa: MATVARS.CPP, ilustra el uso de operaciones aritmticas
utilizando variables.
*/

#include<iostream.h> //Para cout

void main(void)
{
float precio =15.00; // Precio del artculo
float tasaI mpuesto =0.06; // 6% de tasa de impuesto
float importePagado =20.00; // Importe del dinero con que se pag
float impuesto, cambio, total; // Impuesto, cambio y total

impuesto =precio * tasaI mpuesto;
total =precio +impuesto;
cambio =importePagado - total;

cout.setf(ios::fixed);
cout.precision(2);
cout <<"Precio del artculo : $" <<precio <<"\tI mpuesto: $" <<
impuesto <<"\t\tTotal: $" <<total <<endl;
cout <<"Cambio del cliente : $" <<cambio <<endl;
}
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-9
I NCREMENTANDO EL VALOR DE UNA VARI ABLE EN UNO

En programacin es muy comn el incrementar el valor de una variable en 1. Por
ejemplo, suponga que su programa utiliza una variable llamada contador para contar el
nmero de archivos impresos. Cada vez que su programa imprima un archivo, deber
agregarse uno al contenido de la variable contador. Utilizando el operador de asignacin
de C++su programa puede incrementar en uno el valor actual de la variable contador.
Ejemplo:

contador =contador +1;

El incremento se puede aplicar a las variables de clase entero y de punto flotante,
as como a variables de clase carcter. Ya que el incremento del valor de una variable es
una operacin comn en C++, el mismo proporciona un operador de incremento: el doble
signo ms (++) Ejemplo:

contador =contador +1; contador++;

Ejemplo 6.7

El siguiente programa: I NCREMENTO.CPP, usa el operador de asignacin para
incrementar la variable contador en uno. Inicializa la variable contador en 1000 y utiliza el
operador de incremento para incrementar la variable contador en uno.




























/* Nombre del programa: I NCREMENTO.CPP, ilustra el uso del operador de asignacin
para incrementar la variable contador en uno. Tambin muestra el uso del operador
de incremento ++.
*/

#include<iostream.h> //Para cout

void main(void)
{
int contador =1000;

// Muestra el uso del operador de asignacin para incrementar la variable
// contador en uno.
cout <<"Valor inicial del contador: " <<contador <<endl;
contador =contador +1;
cout <<"Valor final del contador : " <<contador <<endl <<endl;

//Muestra el uso del operador de incremento para incrementar la variable
//contador en uno.
contador =1000;
cout <<"Valor inicial del contador: " <<contador <<endl;
contador++;
cout <<"Valor final del contador : " <<contador <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-10
Ejemplo 6.8

El siguiente programa: 0A100.CPP, utiliza el operador incremento para visualizar los
nmeros del 0 al 100:



















Nota: En este programa se utiliza la estructura de control while, el cual permite ejecutar un bloque de
instrucciones mientras la condicin sea verdadera. Para mayor detalle ver la leccin 9.

OPERADOR DE I NCREMENTO USADO COMO PREFI J O Y COMO POSFI J O

Cuando su programa usa el operador de incremento, puede colocar el operador
antes o despus de la variable, como se muestra a continuacin:

++variable; variable++;
Ya que el primer operador aparece antes de la variable, se le llama operador de
incremento prefijo. De igual modo el segundo operador se llama operador de incremento
posfijo. Necesita comprender como C++trata estos dos operadores. Considere el siguiente
enunciado de asignacin:

contadorActual =contador++;
Esta asignacin es equivalente a:

contadorActual =contador;
contador =contador +1;

Ahora consideremos el siguiente enunciado de asignacin que usa el operador de
incremento prefijo:

contadorActual =++contador;
En este caso, el enunciado de asignacin le indica a C++que primero incremente el
valor de la variable contador y luego que se lo asigne a la variable contadorActual. Utilizar
el operador deincremento prefijo es equivalente a:
/* El siguiente programa: 0A100.CPP, utiliza el operador incremento para
imprimir los nmeros del 0 al 100. Se utiliza la estructura de control while
que repite un bloque de instrucciones mientras la condicin sea verdadera.
*/

#include<iostream.h> //Para cout

void main (void)
{
int valor = 0;

while (valor <=100)
{
cout <<valor <<endl;
valor++;
}//Fin de while()
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-11

contador =contador +1;
contadorActual =contador;

Ejemplo 6.9

El siguiente programa: POSPREINC.CPP, ilustra el uso de los operadores de incremento
posfijo y prefijo:

























Ejemplo 6.10

El siguiente programa: OPER2.CPP, ilustra el uso del operador incremento utilizado como
posfijo y prefijo en una operacin aritmtica:


















/* El siguiente programa: POSPREINC.CPP, ilustra el uso de los operadores de
incremento posfijo y prefijo.
*/

#include<iostream.h> //Para cout

void main(void)
{
int contadorPequeno =0;
int contadorGrande =1000;

//Ejemplo de operador de incremento posfijo.
cout <<"El valor de contadorPequeno es : " <<
contadorPequeno <<endl;
cout <<"El valor de contadorPequeno++es : " <<
contadorPequeno++<<endl;
cout <<"contadorPequeno termina con : " <<
contadorPequeno <<endl <<endl;

//Ejemplo de operador de incremento prefijo.
cout <<"El valor de contadorGrande es : " <<
contadorGrande <<endl;
cout <<"El valor de ++contadorGrande es : " <<
++contadorGrande <<endl;
cout <<"contadorGrande termina con : " <<
contadorGrande<<endl;
}//Fin de main()
/* El siguiente programa: OPER2.CPP, ilustra la caracterstica del operador de incremento,
cuando se usa en una expresin. Cuando se utiliza como posfijo el valor de la variable
asociada se altera despus de que se evale la expresin.
Si se usa como prefijo, el valor de la variable asociada se altera antes de que se evale
la expresin.*/

#include<iostream.h> //Para cout

void main(void)
{
int i, k = 5;
// usa posincremento
i =10 * (k++); // k contribuye con 5 a la expresin
cout <<"i =" <<i <<endl <<endl; // despliega 50 = (10 * 5)
k--; //restaura el valor de x a 5
// usa preincremento
i =10 * (++k); // k contribuye con 6 a la expresin
cout <<"i =" <<i <<endl <<endl; // despliega 60 = (10 * 6)
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-12
OPERADOR DE DECREMENTO

De manera semejante, el doble signo menos (--) es el operador de decremento, el
cual decrementa el valor de una variable en uno. Al igual que el operador de incremento,
C++soporta operador de decremento posfijo y prefijo.

Ejemplo 6.11

El siguiente programa, DECCONTA.CPP, ilustra el uso del operador de decremento:






























/* El siguiente programa: DECCONTA.CPP, ilustra el uso del operador de
decremento posfijo y prefijo.
*/

#include<iostream.h> //Para cout

void main(void)
{
int contadorPequeno =0;
int contadorGrande =1000;

//El operador de decremento utilizado como posfijo
cout <<"El valor de contadorPequeno es : " <<
contadorPequeno <<endl;
cout <<"El valor de contadorPequeno-- es : " <<
contadorPequeno-- <<endl;
cout <<"contadorPequeno termina con : " <<
contadorPequeno <<endl <<endl;

//El operador de decremento utilizado como prefijo
cout <<"El valor de contadorGrande es : " <<
contadorGrande <<endl;
cout <<"El valor de --contadorGrande es : " <<
--contadorGrande <<endl;
cout <<"contadorGrande termina con : " <<
contadorGrande <<endl;
}//Fin de main()
EXAMEN BREVE 13

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-13
OPERACI ONES DE ASI GNACI N

Una operacin de asignacin almacena un valor en la memoria. El valor se
almacena en la localidad de memoria a la que se tiene acceso con la variable de lado
izquierdo del operador de asignacin. Como resultado, un operador de asignacin C++
asigna el valor del lado derecho del operador a la variable que aparece del lado izquierdo
del operador. En otras palabras, la variable del lado izquierdo del operador se establece al
valor de lado derecho del operador. Los operadores de asignacin C++se muestran en la
tabla 6.2.

Tabla 6.2. Operadores de asignacin usados en C++

Operacin Smbolo

Asignacin sencilla =
Asignacin de adicin compuesta +=
Asignacin de sustraccin compuesta -=
Asignacin de multiplicacin compuesta *=
Asignacin de divisin compuesta /=
Asignacin de mdulo compuesto (slo enteros) %=

En C++la expresin x =x + 1significa sumar 1 a x, y entonces asignar el valor
resultante a x. Dicho de otro modo, establecer x al valor x + 1. Esta es una operacin
perfectamente legtima. Los operadores de asignacin compuestos mostrados en la tabla
6.2 simplemente combinan el operador de asignacin con un operador aritmtico.
Suponga que definimos x y y como enteros; entonces:

x +=y equivale a x =x +y
x -=y equivale a x =x y
x *=y equivale a x =x * y
x /=y equivale a x =x / y
x %=y equivale a x =x % y

Como puede observar, ambos operadores de incremento y decremento y los
operadores de asignacin compuestos proporcionan una notacin breve para escribir
expresiones aritmticas. Tome en cuenta esta notacin, porque se usar en forma extensiva
en los programas durante el resto de estas lecciones.

Ejemplo 6.12

El siguiente programa: OPER3.CPP, ilustra el uso de los operadores matemticos de
asignacin:
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-14



































Nota: El uso del objeto cin se ver en la siguiente leccin. Se utiliza para leer informacin.






EXAMEN BREVE 14

/* El siguiente programa: OPER3.CPP, ilustra los operadores matemticos de asignacin */

#include<iostream.h> //Para cout

void main(void)
{
int i, j;
double x, y;

cout <<"I ntroduzca el primer nmero entero : " ;
cin >>i;
cout <<"I ntroduzca el segundo nmero entero: ";
cin >>j;

i +=j;
j -=6;
i *=4;
j /=3;
i++;
j--;
cout <<endl;
cout <<"i =" <<i <<endl;
cout <<"j =" <<j <<endl;

cout <<endl <<"I ntroduzca el primer nmero real : ";
cin >>x;
cout <<"I ntroduzca el segundo nmero real: ";
cin >>y;

// En C++las asignaciones abreviadas tambin funcionan con punto flotante
x +=y;
y -=4.0;
x *=4.0;
y /=3.0;
x++;
y--;
cout <<endl;
cout <<"x =" <<x <<endl;
cout <<"y =" <<y <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-15
SOLUCIN DE PROBLEMAS EN ACCIN: Control de inventarios

PROBLEMA

Lo siguiente es un inventario parcial de una lista de artculos en el
departamento de deportes de la tienda ACME, S.A. de C.V.

Artculo Cantidad Unidades vendidas este mes
Sedal 132 carretes 24 carretes
Anzuelos 97 paquetes 45 paquetes
Plomos 123 paquetes 37 paquetes
Redes de pesca 12 piezas 5 piezas

Escriba un programa que imprima un informe mensual mostrando la fecha del reporte, el
nombre del artculo, la cantidad inicial, unidades vendidas por mes, cantidad final y
porcentaje de cantidad vendida.

La solucin del problema empieza con la fase de definicin del problema.

DEFI NI CI N DEL PROBLEMA

Salida: El programa deber generar un informe mensual impreso con la fecha, el
nombre del artculo, cantidad inicial, unidades vendidas este mes, cantidad
final y porcentaje de la cantidad vendida. Ahora es un buen momento para
desarrollar el formato de salida. Suponga que usaremos un formato tabular,
como ste:


FECHA: dd/mm/aa
ARTICULO CANTIDAD INICIAL UNIDADES VENDIDAS CANTIDAD FINAL % VENDIDO
xxxxxxxxxxx xxxxxxxxxx xxxxxxxxxxxx xxxxxxxxx xxx


Entrada: El usuario deber escribir la fecha del informey los datos del inventario
mostrados en la salida.

Procesamiento: Debido a que el artculo, cantidad inicial y unidades vendidas las escribe
el usuario, el programa usar esta informacin para calcular dos cosas: la
cantidad final y el porcentaje vendido. La cantidad final se encuentra con
una sencilla sustraccin de las unidades vendidas a la cantidad inicial:

Cantidad final =Cantidad inicial Unidades vendidas

El porcentaje vendido se encuentra dividiendo las unidades vendidas por la
cantidad inicial y multiplicndola por 100:

% Vendido =(Unidades vendidas / Cantidad inicial) 100%

PLANEACI N DE LA SOLUCI N

Debemos construir una serie de algoritmos a partir de la definicin del problema. Usando el
diseo de programacin estructurado, dividiremos el problema en subproblemas
individuales para solucionar el problema general. Hay cuatro tareas principales que surgen
directamente de la definicin del problema:

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-16
I mprimir el encabezado del informe.
Obtener del usuario los datos del inventario para un artculo determinado.
Calcular la cantidad final y el porcentaje vendido para un artculo determinado.
I mprimir el informe del artculo.
Repetir las ltimas tres tareas tres veces.

Debido a que vamos a imprimir el informe, artculo por artculo, las ltimas tres tareas
debern repetirse para cada artculo en el inventario. El diagrama de la figura 6.1 muestra la
estructura de bloque necesaria para el problema.




















Figura 6.1. Diagrama estructurado para el problema de inventario.

El nivel de algoritmo inicial, inventario(), mostrar el anlisis anterior y llamar a los
mdulos de subprogramas individuales.

ALGORITMO INICIAL

inventario()
I NI CI O
Llamar a la funcin imprimir el ttulo del informe.
Llamar a la funcin para obtener los datos del inventario para un artculo
determinado proporcionado por el usuario.
Llamar a la funcin para calcular la cantidad final y el porcentaje de venta.
Llamar a la funcin para imprimir el informe del artculo.
Repetir las ltimas tres tareas para cada artculo del inventario.
FI N.

Durante el desarrollo del algoritmo, se dar cuenta de que el proceso es el mismo para cada
uno de los artculos de ventas. Como resultado, un solo enunciado repetir se adiciona al
final del algoritmo, en lugar de repetir realmente todos los enunciados del algoritmo tres
veces ms. Esto hace ms eficiente el algoritmo.

El primer nivel de refinamiento necesita que mostremos un algoritmo en detalle para cada
tarea, o funcin, que hayamos identificado. Son como sigue:

inventario()

Imprimir un informe de
inventario para el
departamento de artculos
deportivos
imprimirArt()

Imprimir el informe del
artculo
calcularArt()

Calcular la cantidad final y
el porcentaje vendido
para un artculo
determinado
obtenerDatos()

Obtener los datos para un
artculo determinado
imprimirEncabezado()

Imprimir el ttulo del
informe
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-17
PRI MER NI VEL DE REFI NAMI ENTO
imprimirEncabezado()
I nicio
Escribir(Favor de introducir la fecha: )
Leer (Fecha)
I mprimir la informacin del ttulo.
Fin.

obtenerDatos()
I nicio
Escribir(Favor de introducir el nombre del artculo: )
Leer (Nombre del Artculo)
Escribir(Favor de introducir la cantidad inicial del artculo: )
Leer (Cantidad Inicial).
Escribir(Favor de introducir la cantidad de unidades vendidas: ).
Leer (Unidades Vendidas)
Fin.

calcularArt()
I nicio
Calcular Cantidad Final = Cantidad Inicial Unidades Vendidas.
Calcular % Vendido = (Unidades Vendidas / Cantidad Inicial) 100.
Fin.

imprimirArt()
I nicio
I mprimir( Artculo, Cantidad Inicial, Unidades Vendidas, Cantidad Final,
% Vendid )
Fin.

Ahora el trabajo es codificar este algoritmo en C++. Con su actual conocimiento de C++, la
codificacin de la mayora de los algoritmos no debe representar ningn problema. Pero,
qu hay del enunciado repetir al final de la funcin del algoritmo inventario()? Bien,
observe que este enunciado necesita que regrese y repita muchos de los enunciados
anteriores una y otra vez hasta que todos los artculos sean procesados. Tal operacin de
repeticin se llama una operacin de iteracin o ciclo. Hasta ahora, no se tienen las
herramientas de C++ para realizar tal operacin. As que tendremos que repetir todos los
pasos del procesamiento para cada uno de los artculos de venta en el inventario. En la
leccin 9, aprender a realizar operaciones iterativas en C++, de esta forma se hace el
cdigo mucho ms eficiente.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-18
CODI FI CACI N DEL PROGRAMA














































/* El siguiente programa: INVENTARIO.CPP, realiza las siguientes tareas:

Salida: Impresin del informe mensual, conteniendo la fecha, el nombre del artculo, cantidad inicial,
unidades vendidas este mes, cantidad final y porcentaje de cantidad vendida.

Entrada: El usuario escribe los datos del inventario.

Procesamiento: El programa debe calcular dos cosas: Cantidad Final y Porcentaje Vendido.
*/

#include <iostream.h> // Para cin y cout
#include<iomanip.h> // para setw()
#include<fstream.h> // Para el objeto imprimir
#include <process.h> // Para exit()

// Enunciado de constantes.
const intTAMANO_FECHA =9; // Tamao del arreglo fecha
const int TAMANO_ARTICULO =21; // Tamao del arreglo nombreArtculo

void main(void)
{
char fecha[TAMANO_FECHA] ="\0"; // Fecha del informe
char nombreArticulo[TAMANO_ARTICULO] ="\0"; // Nombre del artculo

floatcantidadInicial =0.0;
floatunidadesVendidas =0.0;

floatcantidadFinal =0.0;
floatporcentajeVendido =0.0;

/*******************************************************************
* Este segmento de codificacin define imprimir como un archivo de *
* salida que apunta al puerto de su impresora PRN, solo para DOS. *
*******************************************************************/

ofstreamimprimir; // Define imprimir como un archivo de flujo de salida
imprimir.open("PRN"); // Abre el archivo imprimir y apunta hacia PRN
if(!imprimir) // Se asegura que la impresora este lista.
{
cout <<"Hay un problema con la impresora" <<endl;
exit(1);
}// Final del if.

// Muestra el mensaje de la descripcin del programa.
cout <<"Estimado usuario de ACME S.A. DE C.V.\n\n"
"Se le pedir escribir cuatro artculos de ventas, uno\n"
"por uno. Con cada artculo solicitado escriba\n"
"el nombre del artculo, la cantidad inicial y la cantidad\n"
"vendida este mes. La computadora imprimir un informe mensual del\n"
"inventario para los artculos vendidos" <<endl <<endl;

// Imprime los ttulos del informe.
cout <<"Por favor escriba la fecha en el formato dd/mm/aa: ";
cin >>fecha;
imprimir <<"\n\nFECHA:" <<fecha <<endl;
imprimir <<"\n\n\n" <<setw(15) <<"ARTICULO" <<setw(21) <<" CANTIDAD INICIAL"
<<setw(22) <<"UNIDADES VENDIDAS" <<setw(19) <<"CANTIDAD FINAL"
<<setw(12) <<"%VENDIDO" <<endl;

imprimir <<setw(15) <<"--------" <<setw(21) <<"-----------------"
<<setw(22) <<"-----------------" <<setw(19) <<"--------------"
<<setw(12) <<"--------" <<endl;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-19















































// El usuario escribe los datos del artculo
cout <<"Por favor escriba el nombre del artculo: " <<endl;
cin >>ws;
cin.getline(nombreArticulo,TAMANO_ARTICULO);
cout <<"Por favor escriba la cantidad inicial del " <<nombreArticulo <<endl;
cin >>cantidadInicial;
cout <<"Por favor escriba el nmero de unidades del " <<nombreArticulo
<<"vendido el " <<fecha <<endl;
cin >>unidadesVendidas;

// Calcula la cantidad final y el porcentaje vendido para el artculo
cantidadFinal =cantidadI nicial - unidadesVendidas;
porcentajeVendido =(unidadesVendidas/ cantidadInicial) * 100;

// Imprime el informe del artculo
imprimir.setf(ios::fixed);
imprimir.precision(2);
imprimir <<setw(15) <<nombreArticulo <<setw(21) <<cantidadInicial
<<setw(22) <<unidadesVendidas<<setw(19) <<cantidadFinal
<<setw(12) <<porcentajeVendido <<endl;

// El usuario escribe los datos del artculo
cout <<"Por favor escriba el nombre del artculo: " <<endl;
cin >>ws;
cin.getline(nombreArticulo,TAMANO_ARTICULO);
cout <<"Por favor escriba la cantidad inicial del " <<nombreArticulo <<endl;
cin >>cantidadInicial;
cout <<"Por favor escriba el nmero de unidades del " <<nombreArticulo
<<"vendido el " <<fecha <<endl;
cin >>unidadesVendidas;

// Calcula la cantidad final y el porcentaje vendido para el artculo
cantidadFinal =cantidadI nicial - unidadesVendidas;
porcentajeVendido =(unidadesVendidas/ cantidadI nicial) * 100;

// Imprime el informe del artculo
imprimir.setf(ios::fixed);
imprimir.precision(2);
imprimir <<setw(15) <<nombreArticulo <<setw(21) <<cantidadInicial
<<setw(22) <<unidadesVendidas<<setw(19) <<cantidadFinal
<<setw(12) <<porcentajeVendido<<endl;

// El usuario escribe los datos del artculo
cout <<"Por favor escriba el nombre del artculo: " <<endl;
cin >>ws;
cin.getline(nombreArticulo,TAMANO_ARTICULO);
cout <<"Por favor escriba la cantidad inicial del " <<nombreArticulo <<endl;
cin >>cantidadInicial;
cout <<"Por favor escriba el nmero de unidades del " <<nombreArticulo
<<"vendido el " <<fecha <<endl;
cin >>unidadesVendidas;

// Calcula la cantidad final y el porcentaje vendido para el artculo
cantidadFinal =cantidadI nicial - unidadesVendidas;
porcentajeVendido =(unidadesVendidas/ cantidadInicial) * 100;

// Imprime el informe del artculo
imprimir.setf(ios::fixed);
imprimir.precision(2);
imprimir <<setw(15) <<nombreArticulo <<setw(21) <<cantidadInicial
<<setw(22) <<unidadesVendidas<<setw(19) <<cantidadFinal
<<setw(12) <<porcentajeVendido <<endl;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-20

































Nota: cin.getline() y cin >>ws se vern en la leccin siguiente. Por lo pronto diremos que cin.getline() se
utiliza para leer cadena de caracteres que tienen espacios en blanco. cin >> ws para eliminar
espacios en blanco del rea bffer.

OPERACIONES BOOLEANAS

Las operaciones booleanas son aquellas que generarn un resultado lgico o
booleano de verdadero o falso. En C++, un falso lgico se iguala a 0, y un verdadero lgico
se iguala a 1. Realmente, cualquier valor diferente de cero se considera verdadero cuando
se aplica a la operacin booleana en C++. Hay dos categoras de operadores booleanos: los
operadores relacionales y los operadores lgicos.

// El usuario escribe los datos del artculo
cout <<"Por favor escriba el nombre del artculo: " <<endl;
cin >>ws;
cin.getline(nombreArticulo,TAMANO_ARTICULO);
cout <<"Por favor escriba la cantidad inicial del " <<nombreArticulo <<endl;
cin >>cantidadInicial;
cout <<"Por favor escriba el nmero de unidades del " <<nombreArticulo
<<"vendido el " <<fecha <<endl;
cin >>unidadesVendidas;

// Calcula la cantidad final y el porcentaje vendido para el artculo
cantidadFinal =cantidadI nicial - unidadesVendidas;
porcentajeVendido =(unidadesVendidas/ cantidadInicial) * 100;

// Imprime el informe del artculo
imprimir.setf(ios::fixed);
imprimir.precision(2);
imprimir <<setw(15) <<nombreArticulo <<setw(21) <<cantidadInicial
<<setw(22) <<unidadesVendidas<<setw(19) <<cantidadFinal
<<setw(12) <<porcentajeVendido <<endl;

// El usuario escribe los datos del artculo
cout <<"Por favor escriba el nombre del artculo: " <<endl;
cin >>ws;
cin.getline(nombreArticulo,TAMANO_ARTICULO);
cout <<"Por favor escriba la cantidad inicial del " <<nombreArticulo <<endl;
cin >>cantidadInicial;
cout <<"Por favor escriba el nmero de unidades del " <<nombreArticulo
<<"vendido el " <<fecha <<endl;
cin >>unidadesVendidas;

// Calcula la cantidad final y el porcentaje vendido para el artculo
cantidadFinal =cantidadI nicial - unidadesVendidas;
porcentajeVendido =(unidadesVendidas/ cantidadInicial) * 100;

// Imprime el informe del artculo
imprimir.setf(ios::fixed);
imprimir.precision(2);
imprimir <<setw(15) <<nombreArticulo <<setw(21) <<cantidadInicial
<<setw(22) <<unidadesVendidas<<setw(19) <<cantidadFinal
<<setw(12) <<porcentajeVendido<<endl;

// Cierra el archivo imprimir.
imprimir.close();
}// Final de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-21
OPERADORES RELACI ONALES

Los operadores relacionales permiten la comparacin de dos cantidades. Los seis
operadores relacionales comunes disponibles en C++se muestran en la tabla 6.3:

Tabla 6.3. Seis operadores relacionales usados en C++
Operador Significado Ejemplo
== Igual a if(c == \0)
!= No igual a, distinto a if(c != \n)
< Menor que if(i < 10)
<= Menor o igual que if(i <= 0)
> Mayor que if(j > 10)
>= Mayor o igual que if (x >= 8.2)
?: Asignacin condicional k = (i < 1) ? 1 : i;

Los operadores relacionales de la tabla anterior se pueden usar para comparar dos
variables o expresiones. En general, slo debe comparar datos de la misma clase. Esto
significa que los enteros deben compararse con enteros, punto flotante con punto flotante y
caracteres con caracteres. La nica excepcin a la regla es que los valores de punto flotante
se pueden comparar con enteros, porque los enteros son reales. En todos los casos, la
operacin genera un resultado booleano de verdadero o falso. Vamos a ver algunos
ejemplos:

Ejemplo 6.13:

Evale las siguientes operaciones relacionales:

a. 5 == 5
b. 0.025 >=0.333
c. 3 !=3
d. 45.2 < -3
e. A <Z
f. Si x = 25, y = -10, pruebe x <=y

Solucin:
a. Verdadero, porque 5 es igual a 5.
b. Falso porque 0.025 no es mayor o igual a 0.333.
c. Falso, porque 3 es igual a 3.
d. Verdadero, porque 45.2 es menor que3.
e. Verdadero, porque C++realmente compara el valor ASCI I de A con el valor ASCI I de Z.
f. Falso, porque el valor asignado a x (25) no es menor o igual al valor asignado a y (-10)

Los operadores relacionales tambin se pueden combinar con operadores
aritmticos, como el siguiente:

5 +3 <4

Ahora la pregunta es: cmo evala la computadora esta expresin? Primero
realiza la operacin de adicin o la operacin relacional? Como debe de sospechar, la
operacin de adicin se realiza primero y despus la operacin relacional. En consecuencia,
el resultado es falso, porque 8 no es menor que 4. Recuerde, cuando los operadores
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-22
relacionales se combinan con operadores aritmticos dentro de una expresin, los
operadores relacionales siempre se realizan al final.

Ejemplo 6.14:

Los operadores aritmticos y relacionales pueden ser parte de un enunciado de salida para
evaluar una expresin. Determine la salida que se genera con el siguiente programa:

#include <iostream.h> // Para cout

void main(void)
{
cout <<(3 +4) <<endl;
cout <<(J >K) <<endl;
cout <<(3*10%3-2>20/6+4) <<endl;
}// Final del main()

Solucin:

La salida generada por el programa anterior es:

7
0
0

La primera lnea de salida es obvia, porque 3 +4 =7. Las lneas de salida restante son
valores lgicos basados en la evaluacin de las operaciones relacionales respectivas.
Recuerde que en C++un falsolgico se representa por un 0 y un verdaderolgico por un 1.

De esta manera, el resultado de J >K es 0 (falso) porque el valor ASCII para J no es
ms grande que el valor ASCII para K. Por ltimo, el resultado de la ltima expresin es 0
(falso) Aqu, el proceso de evaluacin va como sigue:

(((3*10) % 3) 2) >((20 / 6) +4) = ((30 % 3) 2) >(3+4) = 0 2 >7 = -2 >7 = 0 (falso)

Como ver en la leccin 8, el enunciado if-else, examina una condicin y realiza un
conjunto de operaciones si la condicin es verdadera y otro si la condicin es falsa. De
manera semejante, C++ proporciona un operador de asignacin condicional , el cual
examina una condicin y basado en si esta es verdadera o falsa, regresa uno de dos valores.


Operador Significado

(expresin condicional) ? resultadoVerdadero : resultadoFalso Asignacin condicional

Por ejemplo, la siguiente condicin prueba si una calificacin es mayor o igual a
60. Si el valor es mayor o igual a 60, el enunciado asigna la letra P a la variable final. Si
el valor es menor que 60, el enunciado asigna la letra R a la variable final.

final =(calificacion >=60) ? P : R;

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-23
El enunciado cout siguiente muestra como ejemplo la siguiente salida: Su calificacin
fue de 80: pas o bien Su calificacin fue de 40: Reprob

cout <<Su calificacin fue de <<calificacin <<: <<((calificacin >=60) ? Pas : Reprob);

Ejemplo 6.15

A continuacin veremos un programa: OPREL.CPP, que muestra el uso de los operadores
relacionales as como del operador de asignacin condicional:



/* El siguiente programa: OPREL.CPP, ilustra el uso de expresiones lgicas,
y el uso del operador condicional ?: para desplegar los mensajes VERDADERO o FALSO
*/

#include<iostream.h> //Para cout y cin

//Se definen constantes globales para el rango de valores [30...199]
const int NUM_MI N =30;
const intNUM_MAX =199;

void main(void)
{
int i, j, k;
int xorSuma;
bool bandera1, bandera2, enRango,
entI guales, xorBandera;

cout <<"Digite el primer entero : "; cin >>i;
cout <<"Digite el segundo entero: "; cin >>j;
cout <<"Digite el tercer entero : "; cin >>k;

// Prueba que el primer entero esta entre el rango[NUM_MIN..NUM_MAX]
bandera1 =i >=NUM_MI N;
bandera2 =i <=NUM_MAX;
enRango =bandera1 && bandera2;
cout <<endl <<i <<" Se encuentra en el rango "
<<NUM_MI N <<" a " <<NUM_MAX <<": "
<<(enRango ? "VERDADERO" : " FALSO");

// Prueba si dos o ms nmeros tecleados son iguales
entI guales =i ==j || i ==k || j ==k;
cout <<endl <<" Al menos dos nmeros tecleados son iguales: "
<<(entI guales ? "VERDADERO" : "FALSO");

// Pruebas diversas
cout << endl << i << " != " << j << ": "
<<((i !=j) ? " VERDADERO" : "FALSO");
cout <<endl <<" NOT (" <<i <<" <" <<j <<"): "
<<((!(i <j)) ? " VERDADERO" : "FALSO");
cout <<endl <<i <<" <=" <<j <<": "
<<((i <=j) ? "VERDADERO" : "FALSO");
cout <<endl <<k <<" >" <<j <<": "
<<((k >j) ? "VERDADERO" : "FALSO");
cout <<endl <<"(" <<k <<" =" <<i <<") AND ("
<<j <<" !=" <<k <<"): "
<<((k ==i && j !=k) ? " VERDADERO" : "FALSO");

/* NOTA: C++no soporta el operador lgico XOR exclusivo para expresiones booleanas.
Sin embargo, puede simularse si sumamos los resultados numricos de las pru ebas
lgicas, su valor debe de ser 1 o 2 .
*/
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-24

















OPERADORES LGI COS

Las operaciones lgicas tambin generan resultados booleanos. Las tres
operaciones lgicas que se usan en C++se muestran en la tabla 6.4:

Tabla 6.4. Operadores lgicosusados en C++
Operador Significado Ejemplo

! NOT lgico if(!(c > 1 && c < 9))
|| OR lgico if (c == 0 || c == 9)
&& AND lgico if(i > 1 && i < 10)

El estndar ANSI C++le permite usar los nombres de operacin cuando realiza
operaciones lgicas. Como una alternativa (necesaria cuando usa compiladores anteriores),
como se ve en la tabla, el smbolo de admiracin (!) se usa para NOT; los smbolos de
doble barra vertical (||) para OR y el smbolo doble ampersand (&&) para AND.

El operador NOT se usa para negar, o invertir un valor booleano. Debido a que hay
slo dos valores posibles booleanos (verdadero y falso), la negacin de uno da como
resultado el otro. Por ejemplo, suponga que definimos un objeto variable booleano A.
Entonces la variable A puede tomar slo dos valores, verdadero o falso. Si A es verdadero,
entonces NOT A es falso. Al contrario, si A es falso, entonces NOT A es verdadero. Esta
operacin se muestra usando una tabla de verdad. Una tabla de verdad simplemente
muestra el resultado de una operacin lgica sobre un valor booleano. A continuacin la
tabla de verdad para la operacin NOT.

A NOT A (!A)
verdadero falso
falso verdadero

La operacin OR se aplica a valores booleanos. Por ejemplo, suponga que A y B se
definen como variables booleanas. Entonces A y B pueden ser verdadero (no-cero) o falso
(cero) El operador OR dicta que si A o B es verdadero el resultado de la operacin es
xorSuma = (k <= i) + (j >= k);

/* Si xorSuma es 0 o 2 (i.e. no = 1), es FALSE y, por lo tanto,
interpreta 0 o 2 como falso.
*/

xorBandera = xorSuma == 1;
cout << endl << "(" << k << " <= " << i << ") XOR ("
<< j << " >= " << k << "): "
<< ( xorBandera ? "VERDADERO" : "FALSO");
cout << endl << "(" << k << " > " << i << ") AND("
<< j << " <= " << k << "): "
<< ((k > i && j <= k) ? "VERDADERO" : "FALSO");
cout << endl << endl;
} //Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-25
verdadera. Otra forma para decir esto es que cualquier verdadero da como resultado un
verdadero. En trminos de una tabla de verdad.

A B A OR B (A||B)
verdadero verdadero verdadero
verdadero falso verdadero
falso verdadero verdadero
falso falso falso

El operador AND tambin opera sobre valores booleanos. Aqu, si A y B son
variables booleanas, entonces la expresin A AND B es verdadera slo cuando ambos, A y
B, son verdaderos. Otra forma de decir esto es que cualquier falso da como resultado
falso. En trminos de tabla de verdad.

A B A AND B (A && B)
verdadero verdadero verdadero
verdadero falso falso
falso verdadero falso
falso falso falso

Los operadores lgicos booleanos tambin se pueden aplicar a expresiones lgicas.
Por ejemplo, considere lo siguiente:

(-6 <0) AND (12 >=10)
Es esta expresin verdadera o falsa? Bien, -6 < 0 es verdadero y 12 >= 10 es
verdadero. En consecuencia, la expresin es verdadera. Qu hay de sta?

((3 6) ==3) OR (NOT(2 ==4))
Debe evaluar ambos lados de la expresin. Si cualquier lado es verdadero, entonces
el resultado es verdadero. En el lado izquierdo, 3-6 es igual a 3, el cual no es igual a 3.
De esta manera, el lado izquierdo es falso. Del lado derecho, 2 == 4 es falso, pero NOT(2
==4) es verdadero. Esto hace que el resultado de la operacin OR sea verdadero.

Nota: En la leccin 8 veremos ejemplos en los que se utilicen los operadores lgicos.

OPERADORES LGI COS AL NI VEL DE BI TS

C++ proporciona amplias capacidades de manipulacin de bits para los
programadores que necesitan bajar hasta el llamado nivel de bits y bytes. Los sistemas
operativos, el software de equipo de pruebas, el software de conectividad de red y muchos
otros tipos de software requieren que el programador se comunique directamente con el
hardware. En sta y en las siguientes secciones trataremos las capacidades de manipulacin
de bits de C++. Presentaremos cada uno de los muchos operadores al nivel de bits y
trataremos en la leccin 21 (Almacenamiento de datos relacionados en estructuras), la
manera de ahorrar memoria utilizando campos de bits.

Todos los datos se representan internamente en las computadoras como secuencias
de bits. Cada bit puede asumir el valor 0 o el valor 1. En la mayora de los sistemas una
secuencia de 8 bits forma 1 byte, que es la unidad de almacenamiento estndar para una
variable de tipo char. Otros tipos de datos se almacenan en cantidades de bytes ms
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-26
grandes. Los operadores al nivel de bits se utilizan para manipular los bits de operandos
enteros (char, short, int y long, tanto signed como unsigned) Normalmente, los enteros sin
signo se utilizan con los operadores al nivel de bits.

Los operadores al nivel de bits son: AND a nivel de bits (&), OR inclusivo a nivel
de bits ( | )OR exclusivo a nivel de bits ( ^), desplazamiento a la izquierda ( <<),
desplazamiento a la derecha ( >>) y complemento( ~). (Observe que hemos utilizado &,
<<y >>para otros propsitos. Este es un ejemplo clsico de sobrecarga de operadores) Los
operadores AND al nivel de bits, OR inclusivo al nivel de bits y OR exclusivo al nivel de
bits comparten sus dos operandos bit por bit. El operador AND al nivel de bits establece a 1
cada bit del resultado si los bits correspondientes en ambos operandos son 1. El operador
OR inclusivo al nivel de bits establece a 1 cada bit del resultado si el bit correspondiente en
alguno (o ambos) operandos es 1. El operador OR exclusivo al nivel de bits establece a 1
cada bit del resultado si el bit correspondiente en solamente un operando es 1. El operador
de desplazamiento a la izquierda desplaza los bits de su operando izquierdo hacia la
izquierda el nmero de bits especificado por su operando derecho. El operador de
desplazamiento a la derecha desplaza los bits de su operando izquierdo hacia la derecha el
nmero de bits especificado por su operando derecho. El operador de complemento al
nivel de bits establece a 1 todos los bits 0 del operando del resultado, y establece a 0 todos
los bits 1 en el resultado. En la tabla 6.5 se resumen las operaciones al nivel de bits.

Tabla 6.5. Operadores lgicos para el manejo de bits

Operador Significado Ejemplo

~ Operador complemento a unos para el manejo de bits. ~j
& Operador AND para el manejo de bits. i & 128
| Operador OR inclusivo para el manejo de bits. j | 64
^ Operador OR exclusivo para el manejo de bits. j ^ 12
<< Operador desplazamiento a la izquierda para manejo de bits. i << 2
>> Operador desplazamiento a la derecha para el manejo de bits. j >> 3

Operadores de asignacin para el manejo de bits

x &=y x =x & y i &=128
x | = y x = x | y j |= 64
x ^= y x = x ^ y k ^= 15
x << y x = x << y j << = 2
x >>= y x = x >> y k >> = 3

A continuacin se presentan una serie de programas que muestran el uso de estos
operadores lgicos para el manejo de bits.

Ejemplo 6.16

El siguiente programa: BI TOPER, ilustra el uso de los operadores OR, AND, XOR y ~,
para el manejo de bits.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-27





























Ejemplo 16.17

Cuando se utilizan los operadores al nivel de bits es til imprimir los valores en su
representacin binaria para ilustrar los efectos precisos de estos operadores. El siguiente
programa: BI TOPER2.CPP, imprime un entero unsigned en su representacin binaria en
grupos de 8 bits. La funcin visualizarBits() utiliza el operador AND al nivel de bits para
combinar la variable valor con la variable visualizaMascara. Dicho operador
frecuentemente se utiliza con un operando llamado mscara que es un valor entero con
bits especficos establecidos a 1. Las mscaras se utilizan para ocultar algunos bits de un
valor mientras se seleccionan otros. En visualizarBits(), a la variable de mscara
visualizaMascara se le asigna el valor 1 <<15 (1000 0000 0000 0000) El operador de
desplazamiento a la izquierda desplaza el valor 1 desde el bit de menor orden (el del
extremo ms a la derecha) hacia el bit de mayor orden (el del extremo ms a la izquierda)
en visualizaMascaray rellena con bits 0 a partir de la derecha. La instruccin:

cout <<(valor & visualizarMascara ? 1 : 0;

determina si se debe imprimir un 1 o un 0 para el bit actual del extremo izquierdo de la
variable valor. Supongamos que la variable valor contiene 65000 (1111 1101 1110 1000)
Cuando se combinan valor y visualizaMascara utilizando &, todos los bits, a excepcin del
/* El siguiente programa: BI TOPER.CPP, ilustra el uso del operador OR para bits,
del operador AND para bits, del operador XOR para bits y del operador ~para bits.
*/

#include<iostream.h> //Para cout

void main (void)
{
cout <<"\tEjemplo de uso del operador OR para bits" <<endl <<endl;
cout <<"\t0 | 0 es : " <<(0 | 0) <<endl;
cout <<"\t0 | 1 es : " <<(0 | 1) <<endl;
cout <<"\t1 | 0 es : " <<(1 | 0) <<endl;
cout <<"\t1 | 1 es : " <<(1 | 1) <<endl <<endl ;
cout <<"\t1 | 2 es : " <<(1 | 2) <<endl;
cout <<"\t128 | 127 es : " <<(128 | 127) <<endl <<endl ;

cout <<"\tEjemplo de uso del operador AND para bits" <<endl <<endl;
cout <<"\t0 & 0 es : " <<(0 & 0) <<endl;
cout <<"\t0 & 1 es : " <<(0 & 1) <<endl;
cout <<"\t1 & 0 es : " <<(1 & 0) <<endl;
cout <<"\t1 & 1 es : " <<(1 & 1) <<endl <<endl ;
cout <<"\t1 & 2 es : " <<(1 & 2) <<endl;
cout <<"\t15 & 127 es : " <<(15 & 127) <<endl <<endl ;

cout << "\tEjemplo de uso del operador XOR para bits" << endl << endl;
cout <<"\t0 ^0 es : " <<(0 ^0) <<endl;
cout <<"\t0 ^1 es : " <<(0 ^1) <<endl;
cout <<"\t1 ^0 es : " <<(1 ^0) <<endl;
cout <<"\t1 ^1 es : " <<(1 ^1) <<endl <<endl ;
cout <<"\t1 ^2 es : " <<(1 ^2) <<endl;
cout <<"\t15 ^127 es : " <<(15 ^127) <<endl <<endl ;

int valor =0xFF;

cout <<"\tEjemplo de uso del operador ~para bits" <<endl <<endl ;
cout <<"\tEl inverso de " <<hex <<valor <<", es " <<~valor <<endl <<endl;
} //Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-28
bit de nivel ms alto de la variable valor, son enmascarados (ocultados), debido a que
cualquier bit al que se le aplica AND con 0 da como resultado 0. Si el bit del extremo ms
a la izquierda es 1, valor & visualizaMascara evala a 1000 0000 0000 0000 (lo cual se
interpreta como true) y se imprime 1; en caso contrario se impr ime 0.Luego la variable
valor se desplaza hacia la izquierda en un bit mediante la expresin valor <<=1 (esto es
equivalente a la asignacin valor =valor <<1. Estos pasos se repiten para cada bit de la
variable valor.






























Ejemplo 6.18

El siguiente programa: BITOPER3.CPP, muestra el uso del operador AND al nivel de bits,
del operador OR inclusivo al nivel de bits, del operador OR exclusivo al nivel de bits y del
operador de complemento al nivel de bits. El programa utiliza la funcin visualizarBits()
para imprimir los valores de entero unsigned.
/* El siguiente programa: BI TOPER2.CPP, imprime los bits de un entero sin signo. */

#include <iostream.h> //Para cout y cin
#include <iomanip.h> //Para setw()

void visualizarBits(unsigned);

void main(void)
{
unsigned x;

cout <<"I ntroduzca un nmero entero sin signo: ";
cin >>x;
visualizarBits(x);
}//Fin de main()

void visualizarBits(unsigned valor)
{
unsigned c, visualizaMascara =1 <<15;

cout <<setw(7) <<valor <<" =";

for( c =1; c <=16; c++)
{
cout <<( valor & visualizaMascara ? '1' : '0' );
valor <<=1;

if( c % 8 ==0)
cout <<' ';
}//Fin del for

cout <<endl;
}//Fin de visualizarBits()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-29


/* El siguiente programa:BI TOPER3.CPP, utiliza los operadores AND a nivel de bits,
OR inclusivo al nivel de bits, OR exclusivo al nivel de bits y complemento a nivel
de bits.
*/

#include <iostream.h> //Para cout y cin
#include <iomanip.h> //Para setw()

void visualizarBits( unsigned );

void main(void)
{
unsigned numero1, numero2, mascara, conjuntoBits;

numero1 =65535;
mascara =1;

cout <<"El resultado de combinar\n";
visualizarBits( numero1 );
visualizarBits( mascara );
cout <<"utilizando el operador AND (&) a nivel de bits es\n";
visualizarBits( numero1 & mascara );

numero1 =15;
conjuntoBits =241;
cout <<"\nEl resultado de combinar\n";
visualizarBits( numero1 );
visualizarBits ( conjuntoBits );
cout <<"utilizando el operador OR inclusivo (|) a nivel de bits es\n";
visualizarBits ( numero1 | conjuntoBits );

numero1 =139;
numero2 =199;
cout <<"\nEl resultado de combinar\n";
visualizarBits( numero1 );
visualizarBits( numero2 );
cout <<"utilizando el operador OR exclusivo (^) a nivel de bits es\n";
visualizarBits( numero1 ^numero2 );

numero1 =21845;
cout <<"\nEl complemento a uno de \n";
visualizarBits( numero1 );
cout <<"es" <<endl;
visualizarBits( ~numero1 );
}//Fin de main()

void visualizarBits(unsigned valor)
{
unsigned c, visualizaMascara =1 <<15;

cout <<setw(7) <<valor <<" =";

for( c =1; c <=16; c++)
{
cout <<( valor & visualizaMascara ? '1' : '0' );
valor <<=1;

I f( c % 8 ==0)
cout <<' ';
}//Fin del for

cout <<endl;
}//Fin de visualizarBits()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-30
En el programa anterior: BI TOPER3.CPP, a la variable mascara se le asigna el valor 1
(00000000 00000001), y a la variable numero1 se le asigna el valor 65535 (11111111
11111111) Cuando mascara y numero1 se combinan mediante eloperador AND al nivel de
bits (&) en la expresin numero1 & mascara, el resultado es 00000000 00000001. Todos
los bits, a excepcin del bit de nivel ms inferior de la variable numero1, son
enmascarados (ocultados) aplicando AND con la variable mascara.

El operador OR inclusivo al nivel de bits se utiliza para establecer a 1 los bits especficos en
un operando. En el programa a la variable numero1 se le asigna 15 (00000000 00001111), y
a la variable conjuntoBits se le asigna 241 (00000000 11110001) Cuando numero1 y
conjuntoBits se combinan mediante el operador OR al nivel de bits en la expresin
numero1 | conjuntoBits, el resultado es 255 (00000000 11111111)

El operador OR exclusivo a nivel de bits ( ^) establece a 1 cada bit del resultado si
nicamente uno de los bits correspondientes en los dos operandos es 1. En el programa a
las variables numero1 y numero2 se les asignan los valores 139 (00000000 10001011) y
199 (00000000 11000111), respectivamente. Cuando estas variables se combinan mediante
el operador OR exclusivo en la expresin numero1 ^ numero2, el resultado es 00000000
01001100.

El operador de complemento a nivel de bits ( ~) establece a 0 todos los bits 1 de su
operando en el resultado, y establece a 1 todos los bits 0 en el resultado es tambin
conocido como tomar el complemento a uno del valor. En el programa a la variable
numero1 se le asigna el valor 21845 (01010101 01010101) Cuando se evala a la expresin
~numero1, el resultado es (10101010 10101010)

Ejemplo 6.19

El siguiente programa: BI TOPER4.CPP, muestra al operador de desplazamiento a la izquierda
(<<) y al operador de desplazamiento a la derecha (>>) La funcin visualizarBits() se utiliza para
imprimir los valores enteros unsigned.

/* El siguiente programa: BI TOPER4.CPP, muestra el uso de los operadores de desplazamiento
a nivel de bits.
*/

#include<iostream.h> //Para cout y cin
#include <iomanip.h> //Para setw()

void visualizarBits( unsigned );

void main(void)
{
unsigned numero1 =960;

cout <<"El resultado del desplazamiento a la izquierda de\n";
visualizarBits( numero1 );
cout <<"en 8 posiciones utilizando el "
<<"operador de desplazamiento a la izquierda es\n";
visualizarBits( numero1 <<8 );
cout <<"\nEl resultado del desplazamiento a la derecha de\n";
visualizarBits( numero1);
cout <<"en 8 posiciones utilizando el "
<<"operador de desplazamiento a la derecha es\n";
visualizarBits( numero1 >>8 );
}//Fin de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-31
















El operador de desplazamiento a la izquierda ( <<) desplaza a los bits de su operando
izquierdo hacia la izquierda el nmero de bits especificado por su operando derecho. Los
bits que quedan vacantes en el lado derecho se reemplazan con ceros y los unos desplazados
hacia fuera por el lado izquierdo se pierden. En el programa a la variable numero1 se le
asigna el valor 960 (00000011 11000000): El resultado del desplazamiento en 8 bits hacia la
izquierda de dicha variable en la expresin numero1 << 8 es 49152(11000000 00000000)

El operador de desplazamiento a la derecha (>>) desplaza los bits de su operando izquierdo
hacia la derecha el nmero de bits especificado por su operando derecho. Realizar un
desplazamiento derecho sobre un entero unsigned. Causa que los bits vacantes del lado
izquierdo se reemplacen con ceros, y se pierden los unos desplazados hacia fuera del lado
derecho. En el programa el resultado de desplazar hacia la derecha a numero1 en la
expresin numero1 >> 8es 3 (00000000 00000011)

Cuando trabaje con valores al nivel de bits, una de las operaciones que tendr que
efectuar con cierta frecuencia es el desplazamiento de bits: a la izquierda o a la derecha.
C++proporciona dos operadores de desplazamiento de bits: uno que desplaza los bits a la
derecha (>>) y el otro lo desplaza a la izquierda (<<) La expresin siguiente utiliza el
operador de desplazamiento a la izquierda para desplazar el valor de la variable bandera
dos posiciones a la izquierda:

bandera =bandera <<2;

Suponiendo que la variable bandera contiene el valor 2 como se muestra a
continuacin:

0000 0010

Despus de desplazar el valor anterior dos posiciones a la izquierda su valor ser
de 8:

0000 1000

void visualizarBits(unsigned valor)
{
unsigned c, visualizaMascara =1 <<15;

cout <<setw(7) <<valor <<" =";

for( c =1; c <=16; c++)
{
cout <<( valor & visualizaMascara ? '1' : '0' );
valor <<=1;

if( c % 8 ==0)
cout <<' ';
}//Fin del for

cout <<endl;
}//Fin de visualizarBits()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-32
Cuando el desplazamiento se provoca hacia la izquierda, C++coloca ceros en los
bits de las posiciones menos significativos. Cuando el desplazamiento es a la derecha, lo
que C++coloca en la posicin de los bits ms significativos depende de si la variable es sin
signo o con signo. Si la variable es sin signo (unsigned), C++coloca ceros en los bits ms
significativos. Si la variable tiene signo, C++ coloca unos o ceros en los bits ms
significativos dependiendo de si la variable es negativo o positivo respectivamente.

El siguiente programa: DESPLAZA.CPP, ilustra el uso del operador de
desplazamiento:

Ejemplo 6.20

El siguiente programa: DESPLAZA.CPP, ilustra el uso de los operadores de
desplazamiento a la derecha y a la izquierda.
/* El siguiente programa: DESPLAZA.CPP, ilustra el uso de los operadores de
desplazamiento a la derecha y a la izquierda.
*/

#include <iostream.h> //Para cout

void main(void)
{
unsigned uVal =1;
signed int valor =-1;

unsigned uResultado;

uResultado =uVal <<2;
cout <<"(unsigned) " <<uVal <<" desplazado 2 veces a la i zquierda es "
<<uResultado <<endl;

uResultado =uVal >>2;
cout <<"(unsigned) " <<uVal <<" desplazado 2 veces a la derecha es "
<<uResultado <<endl;

uVal =65535;
uResultado =uVal <<2;
cout <<"(unsigned) " <<uVal <<" desplazado 2 veces a la izquierda es "
<<uResultado <<endl;

uResultado =uVal >>2;
cout <<"(unsigned) " <<uVal <<" desplazado 2 veces a la derecha es "
<<uResultado <<endl <<endl;

uResultado =valor <<2;
cout <<"(signed) " <<valor <<" desplazado 2 veces a la i zquierda es "
<<uResultado <<endl;

uResultado =valor >>2;
cout <<"(signed) " <<valor <<" desplazado 2 veces a la derecha es "
<<uResultado <<endl;
}//Fin de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-33
Ejemplo 6.21

El siguiente programa: BI TS.CPP, ilustra el uso de los operadores lgicos para el manejo
de bits:


























ROTACIN DE BITS

Cuando se trabaja al nivel de bits, hay ocasiones en que en vez de simplemente
desplazar los bits a la derecha o a la izquierda, requerir rotar los bits. Cuando rota los bits
a la izquierda, el valor del bit ms significativo se convierte en el bit menos significativo,
los otros bits se desplazan una posicin a la izquierda. Cuando gira los bits a la derecha, el
valor del bit menos significativo se convierte en el ms significativo, los otros bits se
desplazan una posicin a la derecha. Para realizar esta tarea, C++proporciona las funciones
_rotl() y _rotr() las cuales se aplican a valores enteros sin signo. _lrotl() y _lrotr() que se
aplican a valores enteros largo (long int) sin signo.

Ejemplo 6.22

El siguiente programa: GIRAR.CPP, ilustra el uso de las funciones anteriores:
/* El siguiente programa: BI TS.CPP ilustra los operadores para el manejo de bits. */

#include <iostream.h> //Para cout

void main(void)
{
int i, j, k;

// Asigna valores a i y j
i =0xF0;
j =0x1A;

k =j & i;
cout <<j <<" AND " <<i <<" =" <<k <<endl;

k =j | i;
cout <<j <<" OR " <<i <<" =" <<k <<endl;

k =j ^0x1C;
cout <<j <<" XOR " <<0x1C <<" =" <<k <<endl;

k =i <<2;
cout <<i <<" desplazado dos bits a la izquierda es " <<
" =" <<k <<endl;
k =i >>2;
cout <<i <<" desplazado dos bits a la derecha es " <<
" =" <<k <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-34


































EL OPERADOR sizeof()

Cuando escribe programas que manejan operaciones de entrada/salida en archivos
o bien al localizar memoria para asignarla a listas dinmicas, es frecuentemente
conveniente conocer la cantidad de memoria que su programa ha utilizado para una
determinada variable. El operador sizeof() regresa el nmero de bytes que una variable o
clase requiere.

Ejemplo 6.23

El siguiente programa: SIZEOF1.CPP, ilustra el uso del operador sizeof():
/* El siguiente programa: GI RAR.CPP, ilustra el uso de las funciones:
_rotl(), _rotr(), _lrotl(), _lrotr()
*/

#include <iostream.h> //Para cout
#include <stdlib.h> //Para _rotl(), _rotr(), _lrotl(), _lrotr()

void main(void)
{
unsigned valor =1;
unsigned long valor2 =1;

cout <<"Rotacin para valores enteros sin signo." <<endl <<endl;
cout <<valor <<" rotado una vez a la derecha es : " <<_rotr(valor, 1)
<<endl;

valor =5;
cout <<valor <<" rotado dos veces a la derecha es : " <<_rotr(valor, 2)
<<endl;

valor =65534;
cout <<valor <<" rotado dos veces a la izquierda es: " <<_rotl(valor, 2)
<<endl <<endl;

cout <<"Rotacin para valores enteros sin signo long" <<endl <<endl;
cout <<valor2 <<" rotado una vez a la derecha es : " <<_lrotr(valor, 1)
<<endl;

valor2 =5;
cout <<valor2 <<" rotado dos veces a la derecha es : " <<_lrotr(valor2, 2)
<<endl;

valor2 =65534;
cout <<valor2 <<" rotado dos veces a la izquierda es: " <<_lrotl(valor2, 2)
<<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-35

















Ejemplo 6.24

El siguiente programa: SIZEOF2.CPP, ilustra el uso de sizeof() tanto para variables como
para tipos de datos.
/* El siguiente programa: SI ZEOF1.CPP, ilustra el uso de operador sizeof. */

#include <iostream.h> //Para cout

void main (void)
{
cout <<"Las variables de tipo int utilizan " <<sizeof(int)
<<" bytes" <<endl;
cout <<"Las variables de tipo float utilizan " <<sizeof(float)
<<" bytes" <<endl;
cout <<"Las variables de tipo double utilizan " <<sizeof(double)
<<" bytes" <<endl;
cout <<"Las variables de tipo unsigned utilizan " <<sizeof(unsigned)
<<" bytes" <<endl;
cout <<"Las variables de tipo long utilizan " <<sizeof(long)
<<" bytes" <<endl;
}//Fin de main()
/* El siguiente programa: SI ZEOF2.CPP, ilustra el uso de sizeof() tanto para variables
como para tipos de datos.*/

#include <iostream.h> //Para cout

void main(void)
{
short int unCorto;
int unI nt;
long unLong;
char unCar;
float unReal;

cout <<"Tabla 1. Tamao de los datos usando sizeof(variable)" <<endl
<<endl;
cout <<" Tipo de dato Memoria utilizada" <<endl;
cout <<" bytes)" <<endl;
cout <<"------------------ ------------------" <<endl ;
cout <<" short int " <<sizeof(unCorto)<<endl;
cout <<" integer " <<sizeof(unI nt) <<endl;
cout <<" long integer " <<sizeof(unLong) <<endl ;
cout <<" character " <<sizeof(unCar) <<endl;
cout <<" float " <<sizeof(unReal) <<endl;
cout <<endl <<endl <<endl ;

cout <<"Tabla 2. Tamao de los datos usando sizeof(tipoDato)" <<endl
<<endl;
cout <<" Tipo de dato Memoria utilizada" <<endl;
cout <<" bytes)" <<endl;
cout <<" ------------------ ------------------" <<endl ;
cout <<" short int " <<sizeof(short int) <<endl;
cout <<" integer " <<sizeof(int) <<endl ;
cout <<" long integer " <<sizeof(long) <<endl;
cout <<" character " <<sizeof(char) <<endl;
cout <<" float " <<sizeof(float)<<endl ;
cout <<endl <<endl <<endl ;
}Fin de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-36
ASIGNACIN DE TIPO (typecasting)

Una de las labores de un compilador es la conversin automtica del valor de un
tipo de dato a otro tipo de dato compatible. Por ejemplo, el compilador maneja la mayora
de las expresiones que combinan diversos tipos de enteros o tipos de enteros con tipos de
punto flotante. Typecasting (asignacin de tipo) es una caracterstica del lenguaje, que le
permite especificar explcitamente la manera de convertir un valor del tipo de dato original
a un tipo de dato compatible. Por lo tanto, la caracterstica typecasting le da instrucciones al
compilador para que realice la conversin que desea y no la que ste considere necesaria.
C++soporta las siguientes formas typecasting:

Asignacin de tipo (expresin);
y
(asignacin de tipo) expresin;

Ejemplos:

int i =2;
float a, b;
a =float(i);
b =(float)i;

Ejemplo 6.25

El siguiente programa: TYPECAST.CPP, ilustra como maneja los datos el compilador y
como se hace la asignacin de tipo:
/* El siguiente programa: TYPECAST.CPP, ilustra la caracterstica typecasting (asignacin de tipo) */

#include <iostream.h> //Para cout

void main(void)
{
short cortoEnt1, cortoEnt2;
unsigned short unByte;
int unEnt;
long unLong;
char unCar;
float unReal;

// Asigna valores
cortoEnt1 =10;
cortoEnt2 =6;

// Realiza operaciones sin typecasting
unByte =cortoEnt1 +cortoEnt2;
unEnt =cortoEnt1 - cortoEnt2;
unLong =cortoEnt1 * cortoEnt2;
unCar =unLong +5; // La conversin a caracter es automtica
unReal =cortoEnt1 * cortoEnt2 +0.5;

cout <<"cortoEnt1 =" <<cortoEnt1 <<endl
<<"cortoEnt2 =" <<cortoEnt2 <<endl
<<"unByte =" <<unByte <<endl
<<"unEnt =" <<unEnt <<endl
<<"unLong =" <<unLong <<endl
<<"unCar es =" <<unCar <<endl
<<"unReal =" <<unReal <<endl <<endl <<endl;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-37















SOLUCION DE PROBLEMAS EN ACCION: Lgica booleana

PROBLEMA

Un operador lgico booleano comn que no est disponible en C++es la operacin
NAND (NOT AND) Dadas dos variables A y B, la operacin NAND se define como
sigue:

A B A NAND B
verdadero verdadero falso
verdadero falso verdadero
falso verdadero verdadero
falso falso verdadero

Observe que la operacin NAND simplemente es opuesta a la operacin AND. En smbolos, A
NAND B = NOT(A AND B) Escriba un programa C++que muestre el resultado NAND de dos
valores lgicos escritos por el usuario. Empecemos por definir el problema en trminos de salida,
entrada y proces amiento.

DEFI NI CI N DEL PROBLEMA

Salida: El programa deber mostrar el resultado lgico de la operacin NAND
como se define en su tabla de verdad.

Entrada: El usuario escribir valores lgicos para las variables de entrada, A y B.

Procesamiento: Aunque la operacin NAND no est disponible en C++, puede
implementarla con los operadores NOT y AND, de la siguiente manera:

A NAND B =NOT(A AND B)

O, usando la sintaxis alternativa:

A NAND B =!(A && B)
Dado que este es un problema relativamente sencillo, no necesitaremos dividirlo en pequeos
subproblemas. Ms an, desarrollaremos un algoritmo sencillo de la definicin del problema. Ahora,
la definicin del problema pide que indiquemos al usuario que escriba dos valores booleanos para A
// Realiza operaciones con typecasting
unByte = (unsigned short) (cortoEnt1 + cortoEnt2);
unEnt =(int) (cortoEnt1 - cortoEnt2);
unLong =(long) (cortoEnt1 * cortoEnt2);
unCar =(unsigned char) (unLong +5);
unReal =(float) (cortoEnt1 * cortoEnt2 +0.5);

cout <<"cortoEnt1 =" <<cortoEnt1 <<endl
<<"cortoEnt2 =" <<cortoEnt2 <<endl
<<"unByte =" <<unByte <<endl
<<"unEnt =" <<unEnt <<endl
<<"unLong =" <<unLong <<endl
<<"unCar es =" <<unCar <<endl
<<"unReal =" <<unReal <<endl <<endl <<endl;
}//Fin de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-38
y B y que aplique la relacin anterior para generar el result ado booleano. Sin embargo, hay una
dificultad menor. No es posible leer valores booleanos desde el teclado. En cambio, deber leer
informacin de caracteres, probar la informacin de verdadero o falso y despus hacer una
asignacin a las variables A y B. El siguiente algoritmo llevar a cabo el trabajo:

PLANEACI N DE LA SOLUCI N

I NI CI O
Escribir(Breve descripcin de lo que hace el programa)

Escribir(Escribir una V/F para verdadero o falso: )
Leer (Entrada)
Si (Entrada =V) entonces
Asigna verdadero a A.
Si no
Asigna falso a A.

Escribir(Escribir una V/F para verdadero o falso: )
Leer (Entrada)
Si (Entrada =V) entonces
Asigna verdadero a B.
Si no
Asigna falso a B.

Asigna NOT(A AND B) a NAND.
Escriba NAND.
FI N.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-39
CODI FI CACI N DEL PROGRAMA
/* El siguiente programa: NAND.CPP ilustra el uso de los operadores NOT y AND

Salida: El programa debe mostrar el resultado lgico de la operacin NAND.

Entrada: El usuario debe escribir valores booleanos para las variables de entrada
A y B.

Procesamiento: A NAND B =NOT(A AND B) =!(A && B).*/

#include <iostream.h> // Para cin y cout.

void main(void)
{
// Enunciado de clases enumeradas booleanas.
enumboolean {FALSO, VERDADERO};

// Definicin de variables.
char entrada =' '; // Entrada del usuario.
boolean NAND =FALSO; // Resultado de la operacion NAND.
boolean A =FALSO; // Valor booleano.
boolean B =FALSO; // Valor booleano.

// Muestra el mensaje de la descripcin del programa.
cout <<"Este programa generar un resultado NAND (no AND)\n"
"de los dos valores booleanos que escriba." <<endl <<endl ;

// El usuario escribe la primera variable booleana.
cout <<"Escriba un valor booleano (V para VERDADERO o F para FALSO)"
<<endl;
cin >>entrada;

// Verifica la entrada del usuario para VERDADERO O FALSO y hace las
// asignaciones booleanas.
if((entrada == 'V') || ( entrada == 'v'))
A =VERDADERO;
else
A =FALSO;
// El usuario escribe la segunda variable booleana.
cout <<"Escriba un valor booleano (V para VERDADERO o F para FALSO)"
<<endl;
cin >>entrada;

// Verifica la entrada del usuario para VERDADERO O FALSO y hace las
// asignaciones booleanas.
if((entrada =='V') || (entrada =='v'))
B =VERDADERO;
else
B =FALSO;

// Determine el resultado NAND.
NAND =!(A && B);

// Verifica el resultado NAND para verdadero o falso y muestra el resultado
if (NAND ==VERDADERO)
cout <<"\n\nEl resultado de NAND es: VERDADERO" <<endl;
else
cout <<"\n\nEl resultado de NAND es: FALSO" <<endl;
}// Final de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-40
BIBLIOTECA DE MANEJO DE CARACTERES

La mayora de los datos se introducen en la computadora como caracteres,
incluyendo letras, dgitos y diversos smbolos especiales. En esta seccin tratamos las
capacidades de C++para examinar y manipular caracteres individuales. En el resto de la
leccin continuaremos la discusin sobre el manejo de cadenas de caracteres.

La biblioteca de manejo de caracteres incluye varias funciones que realizan pruebas
y manipulaciones tiles de datos de carcter. Cada funcin recibe como argumento un
carcter, representado con un int o EOF. Los caracteres se manipulan frecuentemente como
enteros. Recuerde que EOF tiene normalmente el valor 1, y algunas arquitecturas de
hardware no permiten que se almacn valores negativos en las variables char. Por lo tanto,
las funciones para el manejo de caracteres manipulan a los caracteres como si fueran
enteros. La tabla 6.6 resume las funciones de la biblioteca de manejo de caracteres. Cuando
utilice funciones de la biblioteca de caracteres, asegrese de incluir el archivo de
encabezado <ctype.h>.

Tabla 6.6. Resumen de las funciones de la biblioteca de manejo de caracteres
Prototipo Descripcin
int isdigit( int c ) Devuelve truesi c es dgito, y falsesi no lo es.
int isalpha( int c ) Devuelve truesi c es una letra, y falsesi no lo es.
int isalnum( int c ) Devuelve truesi c es un dgito o una letra, y falsesi
no lo es.
int isxdigit( int c ) Devuelve true si c es un carcter de dgito
hexadeci mal, y falsesi no lo es.
int islower( int c ) Devuelve truesi c es una letra minscula, y falsesi
no lo es.
int isupper( int c ) Devuelve truesi c es una letra mayscula, y falsesi
no lo es.
int tolower( int c ) Si c es una letra mayscula, tolower() devuelve a c
como letra minscula. De lo contrario, devuelve el
argumento sin cambios.
int toupper( int c ) Si c es una letra minscula, toupper() devuelve a c
como letra mayscula. De lo contrario, devuelve el
argumento sin cambios.
int isspace( int c ) Devuelve true si c es un carcter de espacio en
blanco, -nueva lnea (\n), espacio ( ), avance de
forma (\f), tabulacin horizontal (\t) o
tabulacin vertical (\v) y falsesi no lo es.
int iscntrl( int c ) Devuelve truesi c es un carcter de control, y false
si no lo es.
int ispunct( int c ) Devuelve true si c es un carcter imprimible
diferente a espacio, dgito o letra, y falsesi no lo es
int isprint( int c ) Devuelve true si c es un carcter imprimible
incluyendo espacio ( ), y false si no lo es.
int isgraph( int c ) Devuelve true si c es un carcter imprimible
diferente a espacio ( ), y falsesi no lo es.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-41
Ejemplo 6.26

El siguiente programa: PRUEBACAR.CPP, muestra a las funciones isdigit(), isalpha(),
isalnum() e isxdigi()t. La funcin isdigit() determina si su argumento es un dgito (0 9) La
funcin isalpha() determina si su argumento es una letra mayscula (A Z) o minscula (a
z). La funcin isalnum() determina si su argumento es una letra mayscula, minscula o
un dgito. La funcin isxdigit() determina si su argumento es un dgito hexadecimal (A F,
a f, 0 9)



































El programa anterior utiliza el operador condicional (?:) con cada funcin para determinar
si se debe imprimir la cadena es un o no es un para cada carcter que se prueba. Por
ejemplo, la expresin:

isdigit( 8 ) ? 8 es un : 8 no es un
/* El siguiente programa: PRUEBACAR.CPP, muestra el uso de isdigit(), isalpha(), isalnum(),
e isxdigit().
*/

#include <iostream.h> //Para cout y cin
#include <ctype.h> //Para isdigit(), isalpha(), isalnum() e isxdigit()

void main(void)
{
cout <<" De acuerdo a isdigit():\n"
<<( isdigit( '8' ) ? "8 es un" : "8 no es un" )
<<" dgito\n"
<<( isdigit( '#' ) ? " #es un" : " #no es un" )
<<" dgito\n";
cout <<"\nDe acuerdo a isalpha():\n"
<<( isalpha( 'A' ) ? "A es una" : "A no es una" )
<<" letra\n"
<<( isalpha( 'b' ) ? "b es una" : "b no es una" )
<<" letra\n"
<<( isalpha( '&' ) ? " & es una" : "& no es una" )
<<" letra\n"
<<( isalpha( '4' ) ? "4 es una" : "4 no es una" )
<<" letra\n";
cout <<"\nDe acuerdo a isalnum():\n"
<<( isalnum( 'A' ) ? "A es un" : "A no es un" )
<<" dgito o una letra\n"
<<( isalnum( '8' ) ? "8 es un" : "8 no es un" )
<<" dgito o una letra\n"
<<( isalnum( '#' ) ? " #es un" : " #no es un" )
<<" dgito o una letra\n";
cout <<"\nDe acuerdo a isxdigit():\n"
<<( isxdigit( 'F' ) ? "F es un" : "F no es un" )
<<" dgito hexadecimal \n"
<<( isxdigit( 'J ' ) ? "J es un" : " J no es un" )
<<" dgito hexadecimal \n"
<<( isxdigit( '7' ) ? "7 es un" : "7 no es una" )
<<" dgito hexadecimal \n"
<<( isxdigit( 'f' ) ? " f es un" : " f no es un" )
<<" dgito hexadecimal \n";
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-42
indica que si 8 es un dgito, es decir, isdigit() devuelve un valor true (diferente de 0), se
imprime la cadena 8 es un, y si 8 no es un dgito, es decir, isdigit() devuelve 0, se
imprime la cadena 8 no es un.

Ejemplo 6.27

El siguiente programa: PRUEBACAR2.CPP, muestra las funciones islower(), isupper(),
tolower() y toupper() La funcin islower() determina si su argumento es una letra minscula
(a z ) La funcin isupper() determina si su argumento es una letra mayscula (A Z ) La
funcin tolower() convierte una letra mayscula a minscula y devuelve la letra minscula.
Si el argumento no es una letra mayscula, tolower() devuelve el argumento sin cambio. La
funcin toupper() convierte una letra minscula a mayscula y devuelve la letra mayscula.
Si el argumento no es una letra minscula, toupper() devuelve el argumento sin cambio.
/* El siguiente programa: PRUEBACAR2.CPP, muestra el uso de islower(), isupper(),tolower() y
toupper().
*/

#include <iostream.h> //Para cout y cin
#include <ctype.h> //Para islower(), isupper() y toupper()

void main(void)
{
cout <<" De acuerdo a islower():\n"
<<( islower( 'p' ) ? "p es una" : "p no es una" )
<<" letra minscula\n"
<<( islower( 'P' ) ? " P es una" : "P no es una" )
<<" letra minscula\n"
<<( islower( '5' ) ? "5 es una" : "5 no es una" )
<<" letra minscula\n"
<<( islower( '!' ) ? "! es una" : "! no es una" )
<<" letra minscula\n";
cout <<"\nDe acuerdo a isupper():\n"
<<( isupper( 'D' ) ? " D es una" : " D no es una" )
<<" letra mayscula\n"
<<( isupper( 'd' ) ? "d es una" : "d no es una" )
<<" letra mayscula\n"
<<( isupper( '8' ) ? "8 es una" : "8 no es una" )
<<" letra mayscula\n"
<<( isupper( '$' ) ? "$ es una" : "$ no es una" )
<<" letra mayscula\n";
cout <<"\nu convertida a mayscula es "
<<( char ) toupper( 'u' )
<<"\n7 convertido a mayscula es "
<<( char ) toupper( '7' )
<<"\n$ convertido a mayscula es "
<<( char ) toupper( '$' )
<<"\nL convertida a minscula es "
<<( char ) tolower( 'L' ) <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-43
Ejemplo 6.28

El siguiente programa: PRUEBACAR3.CPP, muestra las funciones isspace(), iscntrl(),
ispunct(), isprint() e isgraph() La funcin isspace() determina si su argumento es un
carcter de espacio en blanco, tal como espacio ( ), avance de forma (\f), nueva lnea
(\n), retorno de carro (\r), tabulacin horizontal (\t) o tabulacin vertical (\v) La
funcin iscntrl() determina si su argumento es un carcter de control, tal como tabulacin
horizontal, tabulacin vertical, avance de forma, alerta (\a), retroceso (\b), retorno de
carro, nueva lnea. La funcin ispunct() determina si su argumento es un carcter
imprimible que no sea espacio, dgito o letra, tal como $, #, (, ), [, ], {, }, ;, :, %, etc. La
funcin isprint() determina si su argumento es un carcter que puede desplegarse en
pantalla (incluyendo el carcter espacio) La funcin isgraph() prueba por los mismos
caracteres que isprint(), pero no se incluye el carcter de espacio.
/* El siguiente programa. PRUEBACAR3.CPP, muestra el uso de las funciones isspace()
iscntrl(), ispunct(), isprint() e isgraph().
*/

#include <iostream.h> //Para cout y cin
#include <ctype.h> //Para las funciones isspace() iscntrl(), ispunct(), isprint() e isgraph().

void main(void)
{
cout <<" De acuerdo a isspace(): \nNueva lnea "
<<( isspace( '\n' ) ? "es un" : "no es un" )
<<" caracter de espacio en blanco\nTabulacin horizontal "
<<( isspace( '\t' ) ? "es un" : "no es un" )
<<" caracter de espacio en blanco\n"
<<( isspace( '%' ) ? " % es un" : "% no es un" )
<<" caracter de espacio en blanco\n";
cout <<"\nDe acuerdo a iscntrl(): \nNueva lnea "
<<( iscntrl( '\n' ) ? "es un" : " no es un" )
<<" caracter de control\n"
<<( iscntrl( '$' ) ? "$ es un" : "$ no es un" )
<<" caracter de control\n";
cout <<"\nDe acuerdo a ispunct():\n"
<<( ispunct( ';' ) ? "; es un" : " ; no es un" )
<<" caracter de puntuacin\n"
<<( ispunct( ' Y' ) ? " Y es un" : " Y no es un" )
<<" caracter de puntuacin\n"
<<( ispunct( ' #' ) ? "#es un" : " #no es un" )
<<" caracter de puntuacin\n";
cout <<"\nDe acuerdo a isprint():\n"
<<( isprint( '$' ) ? "$ es un" : "$ no es un" )
<<" caracter de impresin\nAlerta "
<<( isprint( '\a' ) ? "es un" : " no es un" )
<<" caracter de impresin\n";
cout <<"\nDe acuerdo a isgraph():\n"
<<( isgraph( 'Q' ) ? " Q es un" : " Q no es un" )
<< " caracter de impresin diferente al espacio en blanco\nEspacio en blanco"
<<( isgraph( ' ' ) ? " es un" : " no es un" )
<<" caracter de impresin\ndiferente al espacio en blanco" <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-44
FUNCI ONES DE CONVERSI N DE CADENAS

En las siguientes secciones trataremos varias de las funciones ms populares de
manejo de cadenas de caracteres de C++, que incluyen funciones para la conversin de
cadenas a valores numricos, funciones para bsquedas en cadenas y funciones para
manipular, comparar y buscar en bloques de memoria.

Esta seccin presenta las funciones de conversin de cadena de la biblioteca de
utileras generales (stdlib) Estas convierten cadenas de dgitos a valores enteros y de punto
flotante. La tabla 6.7 resume las funciones de conversin de cadenas. Observe el uso de
const para declarar la variable nPtr en los encabezados de funcin (lea de derecha a
izquierda como nPtr es un apuntador a una constante de carcter); const declara que el
valor del argumento no se modificar. Cuando utilice funciones de la biblioteca de utileras
generales, asegrese de incluir el archivo de encabezado <stdlib.h>.

Tabla 6.7. Resumen de las funciones de conversin de cadenas de la biblioteca de utileras
generales.
Prototipo Descripcin
double atof( const char *nPtr ) Convierte la cadena nPtr a double
int atoi( const char *nPtr ) Convierte la cadena nPtr a int.
long atol (const char *nPtr ) Convierte la cadena nPtr a long int.
double strtod( const char *nPtr , char **endPtr) Convierte la cadena nPtr a double
long strtol( const char *nPtr, char ** endPtr, int base ) Convierte la cadena nPtr a long.
unsigned long strtoul( const char *nPtr, char **endPtr,
int base )
Convierte la cadena nPtr a unsigned long.

Ejemplo 6.29

La funcin atof() convierte su argumento una cadena que representa un nmero de punto
flotante a un valor double. Dicha funcin devuelve el valor double. Si el valor a convertir
no puede ser representado por ejemplo, si el primer carcter de la cadena no es un dgito
la funcin atof() devuelve 0. El siguiente programa: ATOF.CPP, ilustra el uso de la funcin
atof()
















/* El siguiente programa: ATOF.CPP, ilustra el uso de la funcin atof() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para atof()

void main(void)
{
double d =atof( "99.0" );

cout <<"La cadena de caracteres \"99.0\" convertida a double es "
<<d <<"\nEl valor convertido dividido entre 2 es "
<<d / 2.0 <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-45
Ejemplo 6.30

La funcin atoi() convierte su argumento una cadena de dgitos que representan un entero
a un valor int. Dicha funcin devuelve el valor int. Si el valor a convertir no puede ser
representado, la funcin devuelve 0. El siguiente programa: ATOI.CPP, ilustra el uso de la
funcin atoi()















Ejemplo 6.31

La funcin atol() convierte su argumento una cadena de dgitos que representan un entero
largo a un valor long. Dicha funcin devuelve el valor long. Si el valor a convertir no
puede ser representado, la funcin atol() devuelve 0. Si int y long se almacenan en 4 bytes,
las funciones atoi() y atol() trabajan en forma idntica. El siguiente programa: ATOL.CPP,
ilustra el uso de la funcin atol()















Ejemplo 6.32

La funcin strtod() convierte a double a una secuencia de caracteres que representan un
valor de punto flotante. Esta funcin recibe dos argumentos una cadena (char *) y un
apuntador a una cadena. La cadena contiene la secuencia de caracteres que se convertir a
double. Al segundo argumento se le asigna la localidad del primer carcter despus de la
parte convertida de la cadena. La instruccin

d =strtod( string, &stringPtr );

/* El siguiente programa: ATOI .CPP, ilustra el uso de la funcin atoi() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para atoi()

void main(void)
{
int i =atoi( "2593" );

cout <<"La cadena de caracteres \"2593\" convertida a int es " <<i
<<"\nEl valor convertido menos 593 es " <<i - 593 <<endl;
}//Fin de main()
/* El siguiente programa: ATOL.CPP, ilustra el uso de la funcin atol() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para atol()

void main(void)
{
long l =atol( "1000000" );

cout <<"La cadena de caracteres \"1000000\" convertida a long es " <<1
<<"\nEl valor convertido dividido entre 2 es " <<l / 2 <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-46
del programa STRTOD.CPP, indica que a d se le asigna el valor double convertido a partir
de string, y a &stringPtr se le asigna la localidad del primer carcter despus del valor
convertido en string.
















Ejemplo 6.33

La funcin strtol() convierte a long una secuencia de caracteres que representan un entero.
La funcin recibe tres argumentos una cadena (char *), un apuntador a una cadena y un
entero. La cadena contiene la secuencia de caracteres a convertirse. Al segundo argumento
se le asigna la localidad del primer carcter despus de la parte convertida de la cadena. El
entero especifica la basedel valor que est siendo convertido. La instruccin:

x =strtol( string, &remainderPtr, 0 );

del programa STRTOL.CPP, indica que a x se le asigna el valor long convertido a partir de
string. Al segundo argumento, &remainderPtr, se le asigna el resto de string despus de la
conversin. El uso de NULL para el segundo argumento causa que se ignore el resto de la
cadena. El tercer argumento, 0, indica que el valor a convertirse puede estar en formato
octal (base 8), decimal (base 10) o hexadecimal (base 16) Las bases se pueden especificar
como 0 o cualquier valor entre 2y 36. Las representaciones numricas de enteros desde
base 11 hasta base 36 utilizan los caracteres de la A a la Z para representar los valores del
10 al 35. Por ejemplo, los hexadecimales pueden consistir de los dgitos 0 9 y los
caracteres A F. Un entero de base 11, puede consistir de los dgitos 0 9 y del carcter A.
Un entero de base 24 puede consistir de los dgitos 0 9 y los caracteres A N. Un entero
de base 36 puede consistir de los dgitos 0 9 y los caracteres A Z

.
* El siguiente programa: STRTOD.CPP, ilustra el uso de la funcin strtod() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para strtod()

void main(void)
{
double d;

char *string ="51.2% se recibi", *stringPtr;
d =strtod( string, &stringPtr);
cout <<"La cadena de caracteres \"" <<string
<<"\" es convertida al valor \ndouble " <<d
<<" y a la cadena \"" <<stringPtr <<"\"" <<endl;
}//Fin de main()
/* El siguiente programa: STRTOL.CPP, ilustra el uso de la funcin strtol() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para strtol()

void main(void)
{
long x;
char *string ="-1234567abc", *remainderPtr;

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-47










Ejemplo 6.34
La funcin strtoul() convierte a unsigned long una secuencia de caracteres que
representan un entero unsigned long. La funcin trabaja en forma idntica a la funcin
strtol() La instruccin:

x =strtoul( string, &remainderPtr, 0 );

del programa STRTOUL.CPP, indica que a x se le asigna el valor unsigned long
convertido a partir de string. Al segundo argumento, &remainderPtr, se le asigna el resto
de string despus de la conversin. El tercer argumento, 0, indica que el valor a convertirse
puede estar en formato octal, decimal o hexadecimal.





















Ejemplo 6.35

El siguiente programa: CONVDATO.CPP, ilustra el uso de algunas funciones y macros
utilizadas en C++para la conversin de datos.

x =strtol( string, &remainderPtr, 0 );
cout <<"La cadena original es \"" <<string
<<"\"\nEl valor convertido es " <<x
<<"\nEl resto de la cadena original es \""
<<remainderPtr
<<"\"\nEl valor convertido ms 567 es "
<<x +567 <<endl;
}//Fin de main()
/* El siguiente programa: STRTOUL.CPP, ilustra el uso de la funcin strtoul() */

#include <iostream.h> //Para cout y cin
#include <stdlib.h> //Para strtol()

void main(void)
{
unsigned long x;
char *string ="1234567abc", *remainderPtr;

x =strtoul( string, &remainderPtr, 0 );
cout <<"La cadena original es \"" <<string
<<"\"\nEl valor convertido es " <<x
<<"\nEl resto de la cadena original es \""
<<remainderPtr
<<"\"\nEl valor convertido menos 567 es "
<<x - 567 <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-48



























/* El siguiente programa: CONVDATO.CPP, ilustra el uso de algunas funciones y macros utilizadas
en C++para la conversin de datos:

atoi(): sintaxis: intatoi(const char * str);
donde:
const char * str es la cadena a convertir.

itoa(): sintaxis: char *itoa(int valor, char *cadena, int base);
donde:
int valor es el valor a convertir.
char *cadena la cadena resultante.
int base base para la conversin (2 a 36).

toascii(): sintaxis: inttoascii(int ch);
donde:
intch es el caracter a convertir.

tolower(): sintaxis: inttolower(intch);
donde:
int ch caracter a convertir.
*/
#include <iostream.h> //Para cout
#include <stdlib.h> //Para las funciones atoi(), itoa)
#include <ctype.h> //Para la macro t oascii() y la funcin tolower()

void main(void)
{
int valor;
char *cadena ="8726";

valor =atoi(cadena);
cout <<"EJ EMPLO QUE MUESTRA EL USO DE LA FUNCI ON atoi()" <<endl <<endl;
cout <<"El valor entero de cadena es: " <<valor <<endl;
cout <<"La valor de la cadena es : " <<cadena <<endl <<endl;

valor =8377;
int base =10;
char caracteres[20];
itoa(valor, caracteres, base);
cout <<"EJ EMPLO QUE MUESTRA EL USO DE LA FUNCI ON itoa()" <<endl <<endl;
cout <<"El valor entero es : " <<valor <<endl;
cout <<"La valor de la cadena es : " <<caracteres <<endl;
cout <<"La base utilizada fue : " <<base <<endl <<endl ;
#
char ch ='A';
int convch;
convch =toascii(ch);
cout <<"EJ EMPLO QUE MUESTRA EL USO DE LA MACRO toascii()" <<endl <<endl ;
cout <<"El caracter " <<'\"' <<ch <<'\"'<<" convertido a formato ascii es: "
<<convch <<endl <<endl ;

ch ='M';
convch =tolower(ch);
cout <<"EJ EMPLO QUE MUESTRA EL USO DE LA FUNCI ON tolower()" <<endl <<
endl;
cout <<"El caracter " <<ch <<" convertido a minscula es " <<char(convch) <<endl
<<endl;
}//Fin de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-49
FUNCI ONES DE BUSQUEDA DE LA BI BLI OTECA DE MANEJ O DE CADENAS

Esta seccin presenta las funciones de la biblioteca de manejo de cadenas que se
utilizan para buscar caracteres y otras cadenas dentro de cadenas. En la tabla 6.8 se
resumen dichas funciones. Observe que las funciones strcspn() y strspn() especifica a size_t
como tipo de devolucin. size_t es un tipo definido por el estndar como el tipo entero del
valor devuelto por el operador sizeof()

Tabla 6.8. Funciones de bsqueda de la biblioteca de manejo de cadenas
Prototipo Descripcin
char *strchr( const char *s, int c ) Localiza la primera ocurrencia del carcter c en la
cadena s. Si encuentra a c, devuelve un apuntador a c
en s. En caso contrario, se devuelve el apuntador
NULL.
size_t strcspn( const char *s1, const char *s2 ) Determina y devuelve la longitud del segmento
inicial de la cadena s1 que consiste de caracteres que
no estn contenidos en la cadena s2.
size_t strspn( const char *s1, const char *s2 ) Determina y devuelve la longitud del segmento
inicial de la cadena s1 que consiste solamente de
caracteres que estn contenidos en la cadena s2.
char *strpbrk( const char *s1, const char *s2 ) Localiza la primera ocurrencia en la cadena s1 de
cualquier carcter que est en la cadena s2. Si
encuentra un carcter de la cadena s2, devuelve un
apuntador al carcter en la cadena s1. En caso
contrario, devuelve un apuntador a NULL.
char *strrch( const char *s, int c ) Localiza la ltima ocurrencia de c en la cadena s. Si
encuentra a c, devuelve un apuntador a cen la cadena
s. En caso contrario, devuelve un apuntador NULL.
char *strstr( const char *s1, const char *s2 ) Localiza la primera ocurrencia en la cadena s1de la
cadena s2. Si encuentra la cadena, devuelve un
apuntador a la cadena en s1. En caso contrario,
devuelve el apuntador NULL.

Ejemplo 6.36

La funcin strchr() busca la primera ocurrencia de un carcter en una cadena. Si encuentra
al carcter, devuelve un apuntador al carcter en la cadena, y en caso contrario devuelve
NULL. El programa STRCHR.CPP, utiliza a strchr() para buscar las primeras ocurrencia
de a y z en la cadena Hola a todos!.


/* El siguiente programa: STRCHR.CPP, ilustra el uso de la funcin strchr() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strchr()

void main(void)
{
char *string ="Hola a todos!";
char caracter1 ='a', caracter2 ='z';

if( strchr( string, caracter1 ) !=NULL )
cout <<'\'' <<caracter1 <<"' se encontro en \""
<<string <<"\".\n";
else

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-50












Ejemplo 6.37

La funcin strcspn() del programa STRCSPN.CPP, determina la longitud de la parte inicial
de la cadena que est en el primer argumento que no contiene ningn carcter de la cadena
que est en el segundo argumento. La funcin devuelve la longitud del segmento.


















Ejemplo 6.38

La funcin strpbrk() busca la primera ocurrencia en su primer argumento de cadena de un
carcter que est en su segundo argumento de cadena. Si encuentra un carcter del segundo
argumento, devuelve un apuntador al carcter en el primer argumento, y en caso contrario
devuelve NULL. El programa STRPBRK.CPP, localiza la primera ocurrencia en string1 de
cualquier carcter que est en string2.













cout <<'\'' <<caracter1 <<"' no se encontr en \" "
<<string <<"\".\n";

if( strchr( string, caracter2 ) !=NULL )
cout <<'\'' <<caracter2 <<"' se encontro en \""
<<string <<"\".\n";
else
cout <<'\'' <<caracter2 <<"' no se encontr en \" "
<<string <<"\".\n";
}//Fin de main()
/* El siguiente programa: STRCSPN.CPP, ilustra el uso de la funcin strcspn() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strcspn()

void main(void)
{
char *string1 ="El valor es 3.14159";
char *string2 ="1234567890";

cout <<"string1 = " <<string1 <<"\nstring2 =" <<string2
<<"\n\nLa longitud del segmento inicial de string1"
<<"\nque no contiene caracteres de string2 es ="
<<strcspn( string1, string2 ) <<endl;
}//Fin de main()
/* El siguiente programa: STRPBRK.CPP, ilustra el uso de la funcin strpbrk() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strpbrk()

void main(void)
{
char *string1 =" Hola a todos!";
char *string2 ="texto";

cout <<" De los caracteres en \"" <<string2 <<"\"\n'"
<<*strpbrk( string1, string2 ) <<'\''
<<" es el primer carcter que aparece en \n\" "
<<string1 <<'\"' <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-51
Ejemplo 6.39

La funcin strrchr() busca la ltima ocurrencia del carcter especificado en una cadena. Si
encuentra el carcter, devuelve un apuntador al carcter en la cadena, y en caso contrario
devuelve 0. El programa STRCHR.CPP, busca la ltima ocurrencia del carcter z en la
cadena Un zoolgico tiene muchos animales incluyendo zorrillos.


















Ejemplo 6.40

La funcin strspn() utilizada en el programa STRSPN.CPP, determina la longitud de la
parte inicial de la cadena que est en su primer argumento, que slo contiene caracteres de
la cadena que est en su segundo argumento. La funcin devuelve la longitud del segmento.




















Ejemplo 6.41

La funcin strstr() busca la primera ocurrencia de su segundo argumento de cadena en su
primer argumento de cadena. Si la segunda cadena se encuentra en la primera cadena, se
/* El siguiente programa: STRRCHR.CPP, ilustra el uso de la funcin strrchr() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strrchr()

void main(void)
{
char *string1 =" Un zoolgico tiene muchos animales incluyendo zorrillos";
int c ='z';

cout <<"El resto de string1 que empieza con la \n"
<<"ltima ocurrencia del caracter '" <<(char) c
<<"' es: \"" <<strrchr( string1, c ) <<'\"' <<endl;
}//Fin de main()
/* El siguiente programa: STRSPN.CPP, ilustra el uso de la funcin strspn() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strspn()

void main(void)
{
char *string1 ="El valor es 3.14159";
char *string2 ="aerolsEv " ;

cout <<"string1 =" <<string1
<<"\nstring2 =" <<string2
<<"\n\nLa longitud del segmento inicial de string1\n"
<<"que contiene slo caracteres de string2 es = "
<<strspn( string1, string2 ) <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-52
devuelve un apuntador hacia la localidad de la cadena en el primer argumento. El programa
STRSTR.CPP, utiliza strstr() para encontrar la cadena def en la cadena abcdefabcdef



















FUNCI ONES DE MEMORI A DE LA BI BLI OTECA DE MANEJ O DE CADENAS

Las funciones de biblioteca de manejo de cadenas que se presentan en esta seccin
facilitan la manipulacin, comparacin y bsqueda de bloques de memoria. Las funciones
tratan los bloques de memoria como si fueran arreglos de caracteres. Estas funciones
pueden manipular cualquier bloque de datos. La tabla 6.9 resume las funciones de memoria
de la biblioteca de manejo de cadenas. En la discusin de las funciones objeto se refiere a
un bloque de datos.
Tabla 6.9. Las funciones de memoria de la biblioteca de manejo de cadenas
Prototipo Descripcin
void *memcpy( void *s1, const void *s2, size_t n) Copia n caracteres desde el objeto al que apunta
s2 hacia el objeto al que apunta s1. Se devuelve el
apuntador al objeto resultante.
void *memmove( void *s1, const void *s2, size_t n) Copia n caracteres del objeto al que apunta s2
hacia el objeto al que apunta s1. La copia se realiza
como si los caracteres se copiaran primero desde el
objeto al que apunta s2 hacia un arreglo temporal, y
luego desde el arreglo temporal hacia el objeto al
que apunta s1. Se devuelve un apuntador al objeto
resultante.
int memcmp( const void *s1, const void *s2, size_t n) Compara los primeros n caracteres de los objetos
a los que apunta s1 y s2. Si s1 es igual, menor o
mayor que s2, la funcin devuelve 0, menor que 0 o
mayor que 0.
void *memchr( const void *s, int c, size_t n ) Localiza la primera ocurrencia de c (convertido a
unsigned char) en los primeros n caracteres del
objeto al que apunta s. Si encuentra a c, devuelve
un apuntador a c en el objeto. En caso contrario
devuelve 0.
void *memset( void *s, int c, size_t n) Copia c (convertido a unsigned char) a los
primeros n caracteres del objeto al que apunta s. Se
devuelve un apuntador al resultado.

/* El siguiente programa: STRSTR.CPP, ilustra el uso de la funcin strstr() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strstr()

void main(void)
{
char *string1 ="abcdefabcdef";
char *string2 ="def";

cout <<"string1 = " <<string1 <<"\nstring2 =" <<string2
<<"\n\nEl resto de string1 que empieza con la \n"
<<"primera ocurrencia de string2 es: "
<<strstr( string1, string2 ) <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-53
Los parmetros de apuntador para estas funciones estn declarados como void*. En
otra leccin veremos que un apuntador hacia cualquier tipo de datos se puede asignar
directamente a un apuntador de tipo void*. Por esta razn, estas funciones pueden recibir
apuntadores hacia cualquier tipo de datos. Puesto que un apuntador void * no puede
desreferenciarse, cada funcin recibe un argumento de tamao que especifica el nmero de
caracteres (bytes) que la funcin procesar. Para efectos de simplicidad, los ejemplos de
esta seccin manipulan arreglos de caracteres (bloques de caracteres)

Ejemplo 6.42

La funcin memcpy() copia un nmero especificado de caracteres desde el objeto al que
apunta su segundo argumento hacia el objeto al que apunta su primer argumento. Dicha
funcin puede recibir un apuntador a cualquier tipo de objeto. Si los dos objetos se
sobreponen en memoria, es decir, si ambos son parte del mismo objeto, el resultado de esta
funcin queda indefinido. El programa MEMCPY.CPP, utiliza memcpy() para copiar la
cadena que est en el arreglo s2 al arreglo s1.













Ejemplo 6.43

La funcin memmove(), al igual que memcpy(), copia un nmero especificado de bytes
desde el objeto al que apunta su segundo argumento hacia el objeto al que apunta su primer
argumento. La copia se realiza como si los bytes se copiaran desde el segundo argumento
hacia un arreglo de caracteres temporal, y luego se copian de dicho arreglo hacia el primer
argumento. Esto permite que caracteres de una parte de una cadena se copien a otra parte de
la misma. El siguiente programa: MEMMOVE.CPP, utiliza memmove() para copiar los
ltimos 11 bytes del arreglo x hacia los 11 primeros bytes de dicho arreglo.












Ejemplo 6.44

/* El siguiente programa: MEMCPY.CPP, ilustra el uso de la funcin memcpy() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para memcpy()

void main(void)
{
char s1[17], s2[] ="Copia esta cadena";

memcpy( s1, s2, 18 );
cout <<" Despus de que s2 se copia a s1 con memcpy,\n"
<<"s1 contiene \"" <<s1 <<'\"' <<endl;
}//Fin de main()
/* El siguiente programa: MEMMOVE.CPP, ilustra el uso de la funcin memmove() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para memmove()

vvoid main(void)
{
char x[] ="Hogar Dulce Hogar";

cout <<"La cadena en el arreglo x antes de memmove es: " <<x;
cout <<"\nLa cadena en el arreglo x despus de memmove() es: "
<<( char * ) memmove( x, &x[6], 11 ) <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-54
La funcin memcmp() del programa MEMCMP.CPP, compara el nmero especificado de
caracteres de su primer argumento con los caracteres correspondientes de su segundo
argumento. La funcin devuelve un valor mayor que 0 si el primer argumento es mayor que
el segundo argumento, devuelve 0 si los argumentos son iguales, y devuelve un valor menor
que 0 si el primer argumento es menor que el segundo argumento.




















Ejemplo 6.45

La funcin memchr() busca la primera ocurrencia de un byte, representado como unsigned
char, en el nmero especificado de bytes de un objeto. Si se encuentra el byte, se devuelve
un apuntador al byte en el objeto, y en caso contrario se devuelve NULL. El programa
MEMCHR.CPP, busca el carcter (byte) d en la cadena Esta es una cadena.
















Ejemplo 6.46

La funcin memset() copia el valor del byte que est en su segundo argumento hacia el
nmero especificado de byte del objeto al que apunta su primer argumento. El programa
MEMSET.CPP, utiliza memset() para copia b hacia los 7 primeros bytes de string1.
/* El siguiente programa: MEMCMP.CPP, ilustra el uso de la funcin memcmp() */

#include <iostream.h> //Para cout y cin
#include <iomanip.h> //Para setw()
#include <string.h> //Para memcmp()

void main(void)
{
char s1[] ="ABCDEFG", s2[] ="ABCDXYZ" ;

cout <<"s1 =" <<s1 <<"\ns2 = " <<s2 <<endl
<<"\nmemcmp( s1, s2, 4 ) =" <<setw( 3 )
<<memcmp( s1, s2, 4 ) <<"\nmemcmp( s1, s2, 7 ) ="
<<setw( 3 ) <<memcmp( s1, s2, 7 )
<<"\nmemcmp( s2, s1, 7 ) =" <<setw( 3 )
<<memcmp( s2, s1, 7 ) <<endl;
}//Fin de main()
/* El siguiente programa: MEMCHR.CPP, ilustra el uso de la funcin memchr() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para memchr()

void main(void)
{
char *s ="Esta es una cadena";

cout <<"El resto de s despus de que el caracter 'd' "
<<"se ha encontrado es \"" <<(char *) memchr( s, ' d', 19 )
<<'\"' <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-55

















OTRAS FUNCI ONES DE LA BI BLI OTECA DE MANEJ O DE CADENAS

La funcin restante de la biblioteca de manejo de cadenas es strerror() La tabla 6.10
resume la funcin strerror()

Tabla 6.10. Otra funcin para el manejo de cadenas de la bibllioteca de manejo de cadenas
Prototipo Descripcin
char *strerror( int numeroError ) Convierte numeroError a una cadena de texto
completa en forma dependiente del sistema. Se
devuelve un apuntador a la cadena.

Ejemplo 6.47

La funcin strerror() toma un nmero de error y crea una cadena de mensaje de error. Se
devuelve un apuntador hacia la cadena. El programa STRERROR.CPP, muestra el uso de
strerror()













FUNCI ONES DE CADE NA

Las funciones de cadena estndar en C++ se usan para manejar cadenas. El
procesamiento de cadenas se utiliza en muchos programas de aplicacin, as que estas
funciones suelen ser muy tiles. Las funciones mostradas en la tabla 6.11proporcionan
algunas de las rutinas de manejo de cadenas ms comunes, en otra leccin se vern ms
funciones de cadena y con mayor detalle.
/* El siguiente programa: MEMSET.CPP, ilustra el uso de la funcin memset() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para memset()

void main(void)
{
char string1[15] ="BBBBBBBBBBBBBB";

cout <<"string1 = " <<string1 <<endl;
cout <<"string1 despus de memset ="
<<(char *) memset( string1, 'b', 7 ) <<endl;
}//Fin de main()
/* El siguiente programa: STRERROR.CPP, ilustra el uso de la funcin strerror() */

#include <iostream.h> //Para cout y cin
#include <string.h> //Para strerror()

void main(void)
{
cout <<strerror( 2 ) <<endl;
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-56
Una funcin de cadena de inters especial es la funcin strcpy() Esta funcin se
debe usar cuando se asignan cadenas a variables de cadenas. Como un ejemplo, considere
la siguiente definicin de variable de cadena:

char nombre[31] =\0;
Ahora suponga que desea asignar un valor de cadena a la variable de cadena
nombre. Los siguientes enunciados no se compilarn:

nombre[] =Brenda; o nombre =Brenda;

La razn por la que estas asignaciones no trabajan es que la variable de cadena
nombrees realmente una direccin de memoria. De esta manera, se intenta asignar un valor
de cadena de carcter a un valor de direccin. Esto se llama error de tipo de datos y no se
compila. Para asignar datos de cadena, deber usar la funcin strcpy() para copiar el valor
de cadena dentro de un rea de almacenamiento de cadena como esta:

strcpy(nombre,Brenda);
Para compilar este enunciado deber incluir en el programa el archivo de
encabezado string.h.
Tabla 6.11. Algunas funciones de cadena disponibles en C++

Nombre de la Archivo de
funcin cabecera Operacin

strcat() string.h Adiciona una cadena a otra.
strcmp() string.h Compara dos cadenas.
strlen() string.h Regresa la longitud de una cadena
strcpy() string.h Copia una cadena.


Ejemplo 6.48:

La funcin de comparacin de cadena, strcmp(), debe usarse cuando se comparan cadenas
ms que operadores relacionales booleanos, porque los operadores relacionales booleanos
no son confiables cuando se comparan cadenas. El siguiente programa: CADENA.CPP,
ilustra el uso de la funcin strcmp()













El programa anterior primero usa la funcin strcmp() para comparar la cadena Janet con la cadena
Janet. La segunda lnea del programa tambin compara Janet con Janet usando el operador
/* El siguiente programa: CADENA.CPP, ilustra como funciona la funcin strcmp() */

#include <iostream.h> // Para cout
#include <string.h> // Para strcmp()

void main(void)
{
cout <<strcmp("J anet", " J anet") <<endl;
cout <<(" J anet" =="J anet") <<endl;
cout <<strcmp("J ANET", " J anet") <<endl;
cout <<strcmp("J anet", " J ANET") <<endl;
}// Final de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-57
relacional ==. Si observa la operacin de strcmp(), encontrar un cero si las dos cadenas
son iguales; un valor negativo si el primer argumento de la cadena es menor que el
segundo argumento de cadena y un valor positivo si la primera cadena es ms grande
que la segunda cadena. Cmo se comparan las dos cadenas? Bien, recuerde que cada
carcter en la cadena se representa como un valor ASCI I . La funcin strcmp() en realidad
resta el valor individual ASCI I de un carcter a la vez de izquierda a derecha hasta que
ocurra la condicin de desigualdad o se acaben los caracteres. Si todos los caracteres en las
dos cadenas son los mismos, el resultado de restar carcter por carcter es cero. Si un
carcter determinado en la primera cadena es ms grande que el correspondiente en la
segunda cadena, el resultado de la resta es positivo, si un carcter determinado en la primera
cadena es ms pequeo que el correspondiente en la segunda cadena, el resultado de la resta
es negativo. Esta es la salida que produce el programa:

0
0
-32
32

Observe que la salida del primer enunciado es 0, lo cual indica en forma correcta que de
acuerdo con la funcin strcmp(), las dos cadenas son iguales. Sin embargo, la salida del
segundo enunciado, que usa el operador relacional booleano ==, es tambin 0. Como ya
sabe, significa falso, indicando errneamente por medio de esto que las dos cadenas no son
iguales. En el tercer enunciado, la funcin strcmp() genera un valor negativo de 32,
correctamente indica que J ANET es menor que J anet, de acuerdo al cdigo ASCI I .
Finalmente, en el ltimo enunciado, la funcin strcmp() genera un valor positivo de 32,
indicacin correcta de que J anet es ms grande que J ANET.

FUNCIONES MATEMTICAS

Las funciones matemticas realizan una operacin matemtica. Como resultado,
estas funciones necesitan un argumento numrico y regresa un resultado numrico; por eso,
algunas veces son llamadas funciones numricas. Algunas funciones matemticas
estndar se muestran en la tabla 6.12. La mayora de estas operaciones le parecern
familiares por sus conocimientos de matemticas. Cuando use cualquiera de estas funciones
en C++, deber asegurarse que el argumento es la clase de datos correcta como la
especificada en la definicin de la funcin. Adems, cualquier variable que se asigne a la
funcin deber definirse con la misma clase de datos que el resultado de la funcin.

Tabla 6.12. Algunas funciones matemticas estndar en C++

Nombre Archivo de
de la funcin cabecera Operacin

abs() math.h Regresa el valor absoluto del argumento (entero)
acos() math.h Regresa el arco coseno del argumento (radianes)
asin() math.h Regresa el arco seno del argumento (radianes)
atan() math.h Regresa el arco tangente del argumento (radianes).
cos() math.h Regresa el coseno del argumento (radianes).
hypot() math.h Regresa la hipotenusa de un tringulo rectngulo.
log() math.h Regresa el logaritmo natural del argumento.
log10() math.h Regresa el logaritmo base 10 del argumento.
pow() math.h Regresa x elevado a la potencia y.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-58
pow10() math.h Regresa 10 elevado a la potencia y.
rand() stdlib.h Genera un nmero aleatorio entre 0 y 2
15
1.
srand() stdlib.h Inicializa el generador de un nmero aleatorio
que debe usarse antes que rand().
sin() math.h Regresa el seno del argumento (radianes).
sqrt() math.h Regresa la raz cuadrada del argumento.
tan() math.h Regresa la tangente del argumento (radianes).
ceil() math.h Redondea al siguiente valor entero mayor.

Nota: Hasta esta leccin no se ha visto el manejo de funciones, el ejemplo a continuacin,
FUNMAT.CPP, sirva de referencia de como se usan las funciones anteriores. Para mayor
informacin consulte el manual o bien las ayudas de su compilador. En la leccin 9 se
ensear formalmente el uso de la estructura de control for.

Ejemplo 6.49

El siguiente programa: FUNMAT.CPP, ilustra el uso de las funciones matemticas.

/* El siguiente programa: FUNMAT.CPP, ilustra el uso de las funciones matematicas:

abs() sintaxis: int abs(int expresin);
labs() sintaxis: long int abs(long int expresin);
fabs() sintaxis: float fabs(float expresin);
abs() sintaxis: complex abs(complex numeroComplejo);

nota: Para el manejo de long double existe la funcin fabsl()

acos() sintaxis: double acos(double expresin);
El valor regresado se encuentra entre: [0,PI .
El ngulo en radianes debe estar entre: [-1.0, 1.0]
asin() sintaxis: double asin(double expresin);
El valor regresado se encuentre entre: [-PI /2, PI /2]
El ngulo en radianes debe estar entre: [-1.0, 1.0]
atan() sintaxis: double atan(double expresin);
El valor regresado se encuentre entre: [-PI /2, PI /2]

nota: Para el manejo de long double existen las funciones:
acosl(), asinl(), atanl(). En este ltimo caso tambin existen las variantes
atan2() y atan2l() los cuales devuelven el arcotangente de y/x.

ceil() sintaxis: double ceil(double valor);

nota: Para el manejo de long double existe la funcin ciell().
sin() sintaxis: double sin(double expresin);
cos() sintaxis: double cos(double expresin);
El valor regresado se encuentre entre: [-1.0, 1.0]
tan() sintaxis: double tan(double expresin);

nota: Para el manejo de long double existen las funciones:
sinl(), cosl() y tanl().
cosh() sintaxis: double cosh(double expresin);
sinh() sintaxis: double sinh(double expresin);
tanh() sintaxis: double tanh(double expresin);
nota: Para el manejo de long double existen las funciones:
sinhl(), coshl() y tanhl().
div() sintaxis: div_t div(int numerador, int denominador);
donde:
struct div_t
{

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-59


































int quot;
int rem;
}div_t;

fmod() sintaxis: double fmod(double x, double y);
modf() sintaxis: double modf(double valor, double *parteEntera);

nota: Para el manejo de long int existe la funcion ldiv()
Para el manejo de long double existen las funcines fmodl(), modfl()

exp() sintaxis: double exp(double x);
ldexp() sintaxis: double ldexp(double valor, int exponente);
significado: x * 2 elevado a un exponente.
pow() sintaxis: double pow(double valor, double exponente);
significado: x elevado a la n.
pow10() sintaxis: double pow10(int exponente);
significado: 10 elevado a la x.
frexp() sintaxis: double frexp(doublevalor, int *exponente);

nota: Para el manejo de long double existen las funciones:
expl(), ldexpl(), powl(), pow10l(), frexp().

log() sintaxis: double log(double valor);
log10() sintaxis: double log10(double valor);

nota: Para el manejo de long double existen las funciones:
logl(), log10l()

max() sintaxis: #define max(x,y) (((x) >(y)) ? (x) : (y))
min() sintaxis: #define min(x,y) (((x) <(y)) ? (x) : (y))

rand() sintaxis: int rand(void);
random() sintaxis: int random(int ceiling);
randomize() sintaxis: void randomize(void);
srand() sintaxis: void srand(unsigned semilla);

sqrt() sintaxis: double sqrt(double valor);

nota: Para el manejo de long double exite la funcin sqrtl()

*/
#include <iostream.h> //Para cout
#include <math.h> //Para las funciones matemticas
#include <errno.h> //Para el manejo de la variable global errno
#include <stdlib.h> //Para la funcin div() y las macros max() y min()
#include <conio.h> //Para clrscr()
#include <complex.h> //Para manejar nmeros complejos

void main(void)
{
cout <<"LOS EJ EMPLOS SIGUIENTES MUESTRAN EL USO DE LAS FUNCIONES:" <<endl;
cout <<"abs(), labs(), fabs()"
<<endl <<endl;

//Utilizaremos la funcin abs()
cout <<"Valor absoluto de un entero utilizando la funcin abs()" <<endl;
cout <<"El valor absoluto de 5 es : " <<abs(5)<<endl;
cout <<"El valor absoluto de 0 es : " <<abs(0)<<endl;
cout <<"El valor absoluto de -5 es: " <<abs(-5)<<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-60
//Utilizaremos la funcin labs()
cout << endl;
cout <<"El valor absoluto de un entero largo utilizando la funcin labs()" <<endl;
cout <<"El valor absoluto de 32769 es : " <<labs(32769)<<endl;
cout <<"El valor absoluto de -32769 es: " <<labs(-32769)<<endl <<endl ;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utiliza remos la funcin fabs()
cout <<endl;
cout <<"El valor absoluto de un flotante utilizando fabs()" <<endl;
for(float valor =-1.0; valor <=1.0; valor +=0.5)
cout <<"El valor absoluto de " <<valor <<" =" <<fabs(valor) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

cout <<endl;
cout <<"El valor absoluto de un complejo utilizando la funcin abs()" <<endl;

complex numeroComplejo(10.0, 5.0);
cout <<"El valor absoluto del numero complejo " <<numeroComplejo
<<" es " <<abs(numeroComplejo) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

clrscr();
cout<<"LOS EJ EMPLOS SIGUIENTES MUESTRAN EL USO DE LAS FUNCIONES:" <<endl;
cout <<"arcocoseno(), arcoseno() y arcotangente()" <<endl <<endl;

//Utilizaremos la funcin acos()
for(double radianes =-0.5; radianes <=0.5; radianes +=0.2)
cout <<"arcocoseno(" <<radianes <<") =" <<acos(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin asin()
cout <<endl;
for(double radianes =-0.5; radianes <=0.5; radianes +=0.2)
cout <<"arcoseno(" <<radianes <<" ) =" <<asin(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin atan()
cout <<endl;
for(double radianes =-0.5; radianes <=0.5; radianes +=0.2)
cout <<"arcotangente(" <<radianes <<" ) =" <<atan(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
clrscr();
cout <<"LOS EJ EMPLOS SI GUI ENTES MUESTRAN EL USO DE LA FUNCI ON ceil()"
<<endl <<endl;

//Utilizaremos la funcin ceil()
cout <<"1.9 redondeado al entero mayor es: " <<ceil(1.9) <<endl;
cout <<"2.1 redondeado al entero mayor es: " <<ceil(2.1) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-61
clrscr();
cout <<"LOS EJ EMPLO SIGUIENTES MUESTRAN EL USO DE LAS FUNCIONES:" <<endl;
cout <<"sin(), cos() y tan()" <<endl <<endl;

//Utilizaremos la funcin sin()
for(double radianes =0.0; radianes <3.1; radianes +=0.5)
cout <<"seno(" <<radianes <<") =" <<sin(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin cos()
cout <<endl;
double pi =3.14159265;
cout.setf(ios::fixed);
cout.precision(6);
cout <<"El coseno(pi/2) =" <<cos(pi/2.0) <<endl;
cout <<"El coseno(pi) =" <<cos(pi) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin tan()
cout <<endl;
cout <<"La tangente(pi) =" <<tan(pi) <<endl;
cout <<"La tangente(pi/4) =" <<tan(pi/4) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
clrscr();
cout <<"LOS EJ EMPLOS SIGUIENTES MUESTRAN EL USO DE LAS FUNCIONES:" <<endl;
cout <<"Coseno hiperblico, seno hiperblico y tangente hiperblico" <<endl <<endl;

//Utilizaremos la funcin cosh()
for(double radianes =-0.5; radianes <=0.5; radianes +=0.2)
cout <<"cosenohiperblico(" <<radianes <<") =" <<cosh(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin sinh()
cout <<endl;
double resultado;
for(double radianes =0.0; radianes <3.1; radianes +=0.5)
if(((resultado =sinh(radianes)) ==HUGE_VAL) &&
(errno ==ERANGE))
cout <<"Error por desbordamiento)" <<endl;
else
cout<<"senohiperblico(" <<radianes<<") =" <<sinh(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin tanh()
cout <<endl;
for(double radianes =-0.5; radianes <=0.5; radianes +=0.2)
cout <<"tangentehiperblico(" <<radianes<<") =" <<tanh(radianes) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-62
clrscr();
cout <<"EL EJ EMPLO SIGUIENTE MUESTRA EL USO DE LAS FUNCIONES:" <<endl;
cout <<"div(), fmod(), modf()" <<endl <<endl;

//Utilizaremos la funcin div()
div_t respuesta;
respuesta =div(11,3);
cout <<"En este ejemplo se muestra el uso de la funcin div()" <<endl;
cout <<"El valor del cociente de 11/3 =" <<respuesta.quot <<endl;
cout <<"El valor del residuo de 11/3 =" <<respuesta.rem <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin fmod()
cout <<endl;
cout <<"En este ejemplo se muestra el uso de la funcin fmod()" <<endl;
cout <<"El residuo de 10.0/3.0 =" <<fmod(10.0, 3.0) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin modf()
cout <<endl;
cout <<"En este ejemplo se muestra el uso de la funcin modf()" <<endl;
double valor1 =1.2345;
double parteEntera;
double parteFraccionaria;
parteFraccionaria =modf(valor1, &parteEntera);
cout <<"El valor fraccionario de 1.2345 es =" <<parteFraccionaria <<endl;
cout <<"El valor entero de 1.2345 es =" <<parteEntera <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
clrscr();
cout <<"LOS EJ EMPLOS SIGUIENTES MUESTRAN EL USO DE LAS FUNCIONES: " <<endl;
cout <<"exp(), x * 2 elevado a exponente, x elevado a n, 10 elevado a x" <<endl;
cout <<"frexp() " <<endl <<endl;

//Utilizaremos la funcin exp()
for(double valor =0.0; valor <=1.0; valor +=0.2)
cout <<"exp(" <<valor <<" ) =" <<exp(valor) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin ldexp()
cout <<endl;
cout <<"3 * 2 elevado a 4 =" <<ldexp(3.0, 4) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin pow()
cout <<endl;
for(int exponente =-2; exponente <=2; exponente++)
cout <<"10 elevado a la " <<exponente<<" =" <<pow(10.0, exponente) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-63
//Utilizaremos la funcin pow10()
cout <<endl;
for(int exponente =-2; exponente <=2; exponente++)
cout <<"10 elevado a la " <<exponente <<" =" <<pow10(exponente) <<endl;
cout <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

// Utilizaremos la funcin frexp()
cout <<endl;
double valor =1.2345;
double mantisa;
int exponente;

mantisa =frexp(valor, &exponente);
cout <<"La cantidad inicial es =" <<mantisa * pow(2.0, 1.0 * exponente) <<endl;
cout <<"El valor de la mantisa es =" <<mantisa <<endl;
cout <<"El valor del exponente es =" <<exponente <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

clrscr();
cout <<"EL EJ EMPLO SIGUIENTE MUESTRA EL USO DE LAS FUNCIONES:" <<endl;
cout <<"log(), log10()" <<endl <<endl;

//Utilizaremos la funcin log()
cout <<"El logaritmo natural de 256.0 =" <<log(256.0) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin log10(x)
cout <<endl;
cout <<"El logaritmo neperiano de 100 =" <<log10(100) <<endl;
cout <<"El logaritmo neperiano de 10000 =" <<log10(10000) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
clrscr();
cout <<"EL SIGUIENTE EJEMPLO MUESTRA EL USO DE LAS MACROS: max(), min()" << endl << endl;

//Utilizaremos la macro max()
cout <<"El valor mximo de 10.0 y 25.0 es : " <<max(10.0, 25.0) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la macro min()
cout <<endl;
cout <<"El valor mnimo de 10.0 y 25.0 es : " <<min(10.0, 25.0) <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

clrscr();
cout <<"EL SI GUI ENTE EJ EMPLO MUESTRA EL USO DE LAS FUNCI ONES: rand() y random();" <<endl;
cout <<"randomize() y srand()" <<endl <<endl;

//Utilizaremos la funcin rand()
cout <<"Valores generados por la funcin rand()" <<endl;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-64
for(int i =0; i <10; i ++)
cout <<rand() <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin random()
cout <<endl;
cout <<"Valores generados por la funcin random()" <<endl;

for(int i =0; i <10; i ++)
cout <<random(100) <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin random() para generar nmero aleatorios entre
// [-5, +5]
cout <<endl;
cout <<"Valores generados por la funcin random() entre [-5,+5]" <<endl;
for(int i =0; i <10; i ++)
cout <<(random(10)-5) <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos la funcin random() para generar nmero aleatorios entre
// [0.0, 1.0]
cout <<endl;
cout <<"Valores generados por la funcin random() entre [0.0,1.0]" <<endl;
cout.precision(1);
for(int i =0; i <10; i ++)
cout <<(random(10)/10.) <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

//Utilizaremos las funciones srand() y randomize()para generar nmero aleatorios
//a partir de una semilla.
cout <<endl;
cout.precision(6);
cout <<"Valores aleatorios a partir de la semilla dada por la funcin srand(100)" <<endl;
srand(100);
for(int i =0; i <5; i++)
cout <<rand() <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
cout <<endl;
cout <<"Mismos valores aleatorios generados por la misma semilla srand(100)" <<endl;
srand(100);
for(int i =0; i <5; i++)
cout <<rand() <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-65





SOLUCION DE PROBLEMAS EN ACCION: Comunicacin de datos

PROBLEMA

En el campo de la comunicacin de datos, los datos binarios de la computadora
digital se convierten en datos de ondas senoidales analgicos para la
transmisin a grandes distancias por medio de la red telefnica. Esta idea se
muestra en la figura 6.2. En sta, un 1 binario se representa con una onda
senoidal de una amplitud ms grande y un 0 binario se representa por otra onda
senoidal de una amplitud ms baja. Esto se llama modulacin de la amplitud.
Los datos binarios se representan usando una onda senoidal, as el estudio de
las comunicaciones de datos a menudo requiere el anlisis de una onda
senoidal. Dicho anlisis tiene el objetivo de encontrar la amplitud en volts, de
una onda senoidal en cualquier punto determinado en el tiempo. Esto se llama
valor instantneo de la onda senoidal y se encuentra usando la ecuacin:

=V
cresta
sen(2 ft)
donde:

es el voltaje instantneo en cualquier punto en el tiempo t en la forma de la onda,
en volts.
V
cresta
es la amplitud de cresta de la onda, en volts.
EXAMEN BREVE 16
cout <<endl;
cout <<"5 valores aleatorios diferentes generados por randomize()." <<endl;
cout <<"La semilla se genera a partir del reloj del sistema." <<endl;
randomize();
for(int i =0; i <5; i++)
cout <<rand() <<' ';
cout <<endl <<endl;
cout <<"Para continuar oprima ENTER: ";
cin.get();

clrscr();
cout <<"EL SIGUIENTE EJ EMPLO MUESTRA EL USO DE LA FUNCION: sqrt()" <<endl;

//Utilizaremos la funcin sqrt()
for(double valor =0.0; valor <5.0; valor +=0.5)
cout <<"La raz cuadrada de " <<valor <<" =" <<sqrt(valor) <<endl;
cout <<endl;

//Observe el mensaje de error: sqrt: DOMAIN error
cout <<"Manejo de errores en el caso de valores no permisibles sqrt(-1.0)" <<endl;
cout <<"La raz cuadrada de -1 =" <<sqrt(-1.0) <<endl <<endl;
cout <<"Para TERMI NAR el programa oprima ENTER: " ;
cin.get();
}//Fin de main()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-66
es la constante 3.14159.
f es la frecuencia de la onda en hertz.
t es el tiempo, en segundos, para .

Escriba un programa para encontrar el valor del voltaje instantneo de una onda senoidal
segn se muestra en la figura 6.2. El usuario tiene que escribir el voltaje de la cresta en
volts, la frecuencia en kilohertz y el tiempo en milisegundos.

DEFI NI CI N DEL PROBLEMA

Salida: El programa deber mostrar el valor de voltaje instantneo, , resultante de
la ecuacin anterior.

Entrada: El usuario deber escribir la siguiente informacin:
La amplitud de la cresta de la onda, V
cresta
, en volts.
La frecuencia de la onda, f, en kilohertz.
El punto en el tiempo, t, en milisegundos para cada voltaje
instantneo que se calcule.
Procesamiento: El programa debe calcular el valor de voltaje instantneo usando la
ecuacin dada.


+V
cresta




= V
cresta
sen(2 ft)



t




-V
cresta



Figura 6.2. Una onda senoidal para el problema de comunicaciones de datos.

PLANEACI N DE LA SOLUCI N

Usando el enfoque estructurado para solucionar este problema, dividiremos el problema en
tres subproblemas que reflejen la definicin del problema. Las tres tareas principales que
siguen directamente de la definicin del problema son:

Obtenga las entradas del usuario para V
cresta
, f, y t.
Calcule el voltaje instantneo.
Muestre el valor de voltaje instantneo, resultante del clculo.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-67
Los algoritmos respectivos son:

ALGORI TMO I NI CI AL

comunicacionDatos()
I NI CI O
Llama a la funcin para obtener los datos V
cresta
, f, y t del usuario.
Llama a la funcin para calcular el voltaje instantneo.
Llama a la funcin para mostrar el valor del voltaje instantneo, .
FI N.

PRI MER NI VEL DE REFI NAMI ENTO

obtenerDato()
I nicio
Escribir(Favor de introducir la amplitud de la cresta V
cresta
, en volts: ).
Leer (V
cresta
).
Escribir(Favor de introducir la frecuencia de la onda senoidal, f, en kilohertz:
).
Leer (f).
Escribir(Favor de introducir el tiempo, t, en milisegundos: ).
Leer (t).
Fin.

calcularVoltaje()
I nicio
Calcular =V
cresta
sen(2 ft).
Fin.

mostrarVoltaje()
I nicio
Escribir(El valor del voltaje instantneo es: , ).
Fin.

CODI FI CACI N DEL PROGRAMA

La implementacin lineal de la serie de algoritmos anteriores es como sigue:

/* El siguiente programa: COMUNI CACI ON.CPP, calcula el valor de voltaje instantneo,
v, resultante de la ecuacin planteada en el problema.

Salida: El programa debe mostrar el valor de voltaje instantneo, v, resultante
de la ecuacin planteada en el problema.

Entrada: El usuario debe escribir lo sigui ente: La amplitud de la cresta de la
onda senoidal, Vcresta, en volts; la frecuencia de la onda, f, en
kilohertz; el punto en el tiempo, t, en milisegundos para el cual se
calcula el voltaje instantneo.

Procesamiento: El programa debe calcular el valor del voltaje instantneo.
*/

#include <iostream.h> // Para cin y cout.
#include <math.h> // Para sin()

// Enunciados constantes
const float PI =3.14159;

void main(void)
{
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-68


SOLUCION DE PROBLEMAS EN ACCION: Coordenadas polares y rectangulares

PROBLEMA

Muchas veces en fsica y problemas de ingeniera, necesitar convertir
coordenadas rectangulares a polares y viceversa. El diagrama de vector en la
figura 6.3 resume el proceso de conversin.

Como puede ver, un vector se puede representar en dos formas:

1. Coordenada polar :

M
Donde:

M es la magnitud o longitud del vector.
es el ngulo que hace el vector con el eje horizontal.
//Definicin de variables
float vCresta =0.0; // Voltaje de la cresta en volts.
float f =0.0; // Frecuencia en kilohertz.
float t =0.0; // Tiempo en milisegundos.
float v =0.0; // Voltaje instantneo en volts.

// Muestra el mensaje de descripcin del programa.
cout <<"Este programa, mostrar el valor del voltaje instantneo\n"
"de una seal de CA. Escriba las siguientes tres cantidades: "
<<endl <<endl;

cout <<"\tVoltaje de la seal de la cresta, vCresta.\n\n"
"\tFrecuencia de la seal, f,\n\n"
"\tEl punto en el tiempo, t, para el cual\n"
"\tse calcula el voltaje. " <<endl <<endl;

// Entradas del usuario
cout <<"Escriba el voltaje de la seal cresta en volts: vCresta =";
cin >>vCresta;
cout <<"Escriba la frecuencia de la seal en kilohertz: f =";
cin >>f;
cout <<"Escriba el tiempo en milisegundos: t =" ;
cin >>t;

// Calculo del valor del voltaje instantneo.
v =vCresta * sin(2 * PI * f * t);

// Muestra el valor de voltaje instantneo.
cout.setf(ios::fixed);
cout.precision(4);
cout <<"\n\nEl voltaje instantneo para " <<t <<" milisegundos es\n"
<<v <<" volts." <<endl;
}// final del main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-69
2. Coordenada rectangular :

x +iy

Donde:

x es el eje real o coordenada horizontal, para la punta del vector.
y es el eje imaginario o coordenada vertical, para la punta del vector.
i = -1, un nmero imaginario.






M o bien x + iy

M
y




x

Polar Rectangular Rectangular Polar

M = x
2
+ y
2
arctan y/x x + iy = M cos + M sen

Figura 6.3. Conversin de coordenadas polares/rectangulares.

Vamos a escribir un programa C++que convierta de coordenadas polares a rectangulares
usando valores proporcionados por el usuario.

DEFI NI CI N DEL PROBLEMA

Salida: La salida ser en forma tabular, mostrando la coordenada polar de entrada
y la correspondiente coordenada rectangular. La coordenada polar se
mostrar en el formato M @ . Los valores de M y se mostrarn como
variables, y el smbolo @se mostrar como un carcter fijo. La coordenada
rectangular se mostrar usando el formato x +iy. Los valores de x y y se
mostrarn como variables usando dos lugares decimales. El smbolo +y el
carcter i se mostrarn como informacin de carcter fijo.

Entrada: El usuario escribe la magnitud del vector y el ngulo que hace con el eje
horizontal, en grados.

Procesamiento: El programa debe calcular x y y como sigue:

x =M cos
y =M sen

Eje imaginario

+

Eje real

+
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-70
PLANEACI N DE LA SOLUCI N

Usando la definicin del problema anterior, una serie apropiada de algoritmos sera la que
sigue:

ALGORI TMO I NI CI AL
coordenadas()
I NI CI O
Llama a la funcin para obtener la entrada de la coordenada polar del usuario.
Llama a la funcin para calcular la coordenada rectangular.
Llama a la funcin para mostrar la coordenada polar introducida y para
calcular la coordenada rectangular.
FI N.

PRI MER NI VEL DE REFI NAMI ENTO

obtenerDato()
I nicio
Escribir(favor de introducir la magnitud del vector, M: ).
Leer (M).
Escribir(Favor de introducir el ngulo del vector en grados: ).
Leer(ngulo).
Fin.

calculoRectangular()
I nicio
Calcular x =M cos(ngulo).
Calcular y =M sen(ngulo).
Fin.

mostrarResultados()
I nicio
Escribir(Ttulos de la tabla).
Escribir(La coordenada polar es : M @ , ngulo).
Escribir(La coordenada rectangular es: , x +iy).
Fin.

* El siguiente programa: RECTANGULAR.CPP, convierte coordenadas polares a
rectangulares.

Salida: La salida ser en forma tabular, mostrando la entrada de coordenada
polar y la coordenada rectangular correspondiente.
La coordenada polar se mostrar en el formato M @ angulo.
Los valores de M y angulo se mostrarn como variable y el smbolo
@ se mostrar como un caracter fijo.
La coordenada rectangular se mostrar usando el formato x + iy.
x y y se mostrarn como variables usando dos lugares decimales. El
smbolo + y el caracter i se mostrarn como informacin de caracter
fijo.

Entrada: El usuario debe escribir la magnitud, M, del vector y su ngulo.

Procesamiento: El programa debe calcular x y y como sigue:
x = M cos(angulo).
y = M sen(angulo).
El angulo se debe convertir a radianes durante los clculos.

*/

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-71
CODI FI CACI N DEL PROGRAMA

JERARQUIA DE LOS OPERADORES

Cuando realice operaciones en C++debe tener cuidado con la jerarqua de los
operadores. Por ejemplo C++realiza primero una multiplicacin y despus una suma.

Consideremos la siguiente expresin:

respuesta =5 +2 * 3;
/#include <iostream.h> // Para cin y cout.
#include <iomanip.h> // Para setw().
#include <math.h> // para sin() y cos().

// Enunciado de constantes.
const float PI =3.14159;

void main(void)
{
// Definicin de variables.
float x =0.0; // Coordenada rectangular x.
float y =0.0; // Coordenada rectangular y.
float m =0.0; // Magnitud polar.
float angulo =0.0; // Angulo polar.

// Muestra el mensaje con la descripcin del programa.
cout <<"Este programa convertir coordenadas de vectores polares\n"
"a coordenadas de vectores rectangulares. " <<endl <<endl;

// Obtencin de la coordenada polar.
cout <<"Escriba la magnitud del vector: m =" ;
cin >>m;
cout <<"Escriba el ngulo del vector en grados: angulo =" ;
cin >>angulo;

// Calcula la coordenada rectangular.
x =m * cos(PI /180 * angulo); // PI/180 * angulo convierte grados a
// radianes.
y =m * sin(PI /180 * angulo);

// Muestra los valores rectangular y polar al usuario.
cout <<"\n\n\n" <<setw(25) <<"COORDENADA POLAR"
<<setw(40) <<"COORDENADA RECTANGULAR" <<endl;

cout <<setw(25) <<"----------------"
<<setw(40) <<" ----------------------" <<endl <<endl;

cout.setf(ios::fixed);
cout.precision(2);
cout <<setw(13) <<m <<" @" <<setw(6) <<angulo <<" grados"
<<setw(19) <<x <<" +i" <<y <<endl;
}// Final de main()

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-72
Dos resultados son posibles:


Para evitar esta confusin, C++asigna una jerarqua a cada operador.

Operador Nombre Ejemplo
:: Alcance nombre_clase::nombre_miembro_clase
:: Global ::nombre_variable

. Selector objeto.nombre_miembro
- > Selector apuntador ->nombre_miembro
[ ] Suscrito apuntador[elemento]
( ) Llamado funcin expresin(parmetros)
( ) Valor type(parmetros)
sizeof Tamao objeto sizeof expresin
sizeof Tamao tipo sizeof(type)

++ Posincremento variable ++
++ Preincremento ++variable
-- Posdecremento variable
-- Predecremento --variable
& Operador direccin &variable
* Operador referencia *apuntador
new Operador ubicacin newtype
delete Operador desubicacin delete apuntador
delete [ ] Desubicacin arreglo delete apuntador
~ Complemento a unos ~expresin
a nivel bits
! Operador NOT lgico !expresin
+ Suma unaria +1
- Resta unaria -1
( ) Operador Typecast (type) expresin

.* Selector miembro objeto.*apuntador
-> Selector miembro objeto -> *apuntador

* Multiplicacin expresin * expresin
/ Divisin expresin / expresin
% Mdulo expresin % expresin
respuesta = 5 + 2 * 3; respuesta = 5 + 2 * 3;
= 7 * 3; = 5 + 6;
= 21; = 11;
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-73

+ Suma expresin + expresin
- Resta expresin expresin

<< Desplazar a la izquierda uResultado = uVal << 2;
a nivel bit
>> Desplazar a la derecha uResultado = uVal >> 2;
a nivel bit

< Menor que bandera = i < j;
<= Menor que o igual a bandera = i <= j;
> Mayor que bandera = k > j;
>= Mayor que o igual a bandera = k >= j;
== Igual bandera = k == j;
!= No igual (distinto) bandera = k != J;

& AND a nivel bit k = j & i;
^ XOR a nivel bit k = j ^ 0x1C;
| OR a nivel bit k = j | i;

&& AND a nivel lgico bandera = bandera 1 && bandera2;
|| OR a nivel lgico bandera = bandera1 || bandera2;

?: Expresin condicional (k = i && j != k) ? Verdadero : Falso;

= Asignacin aritmtica x = y;
+= x += y;
-= x -= y;
*= x *= y;
/= x /= y;
%= x %= y;
>>= Asignacin desplazamiento x >>=2;
<<= x <<= 2;
&= Asignacin a nivel bit x &=y;
|= x | = y;
^= x ^= y;
, Operador coma for(i = 0, j = 1; i > 100; i++, j++)

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-74
LO QUE NECESITA SABER

Antes de continuar con la siguiente leccin, asegrese de haber comprendido los
siguientes conceptos:
q q La mayora de los clculos se efectan en instrucciones de asignacin.
q q Cuando se coloca un nuevo valor en una localidad de memoria, reemplaza el valor previo de
dicha localidad. El valor previo se destruye.
q q Cuando se lee un valor de memoria, el proceso es no destructivo, es decir, se copia el valor,
dejando el original tal cual en la localidad de memoria.
q q C++evala las expresiones aritmticas en una secuencia precisa determinada por las reglas de
procedencia de operadores y de asociatividad.
q q Las operaciones aritmticas en C++incluyen las operaciones simples de adicin, sustraccin,
multiplicacin y divisin que se pueden realizar en cualquier clase de dato numrico.
q q La adicin, sustraccin, la multiplicacin y la divisin son bsicamente igual para las clases de
datos entero y los de punto flotante. Sin embargo cuando se dividan dos enteros, obtendr un
resultado entero.
q q Si necesita un resultado de punto flotante, al menos uno de los operandos debe definirse como
valor de punto flotante.
q q El operador mdulo (%) se define slo para enteros y generar un error de compilador si se usa
con valores de punto flotante.
q q C++proporciona operadores de incremento prefijo y posfijo que agregan 1 al contenido de una
variable. C++proporciona operadores de decremento prefijo y posfijo que restan 1 al contenido
de una variable.
q q Los operadores prefijo de C++le indican que primero incremente o decremente el valor de la
variable y luego que use esa variable. Los operadores posfijo de C++le indican que primero
use el valor de la variable y que luego lo incremente o decremente.
q q Hay operadores de incremento/decremento definidos en C++. El operador de incremento ++,
adiciona un 1 a la variable, y el operador de decremento --, resta 1 de la variable.
q q Puede preincrementar/predecrementar una variable o posincrementar / posdecrementar una
variable.
q q Hay una gran diferencia cuando se usa incremento/decremento como parte de una expresin
que se va a calcular en C++. Una operacin preincremento/predecremento en una variable se
realiza antes de evaluar la expresin, y una operacin posincremento/posdecremento se realiza
en una variable despus de que se evala la expresin.
q q Para asegurar que las expresiones son evaluadas en forma consistente, C++asigna una
jerarqua a cada operador, el cual controla el orden en que ocurrirn las operaciones. Si desea
controlar el orden en que las operaciones se realizarn, utilice parntesis. C++primero evala
las expresiones entre parntesis.
q q El operador de asignacin simple en C++es el operador =. Un valor del lado derecho del
operador = se asigna a la variable del lado izquierdo del operador.
q q Hay operadores de asignacin compuesta, como +=, *= y otros, que combinan una operacin
aritmtica con la operacin de asignacin. Estos operadores se usan como una forma de notacin
corta dentro de un programa C++.
q q Los operadores booleanos son aquellos que generan un resultado lgico de verdadero o falso.
Las dos categoras de operadores booleanos en C++son operadores relacionales y lgicos.
q q Los operadores relacionales permiten comparar dos cantidades. Estos operadores incluyen ==,
!=, >, <, <=, >=.
q q Los operadores lgicos realizan operaciones lgicas sobre valores booleanos para generar un
resultado booleano. Los operadores lgicos estndar disponible en C++ son NOT(!), OR(||) y
AND(&&)
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-75
q q El operador AND al nivel de bits (&) toma dos operandos enteros. Un bit en el resultado se
establece a 1 si los bits correspondientes en cada operando son 1.
q q Las mscaras se utilizan para ocultar algunos bits mientras se conservan otros.
q q El operador OR inclusivo a nivel de bits ( | ) toma dos operandos. Un bit en el resultado se
establece a 1 si el bit correspondiente en cualquiera de los operandos es 1.
q q Cada uno de los operandos al nivel de bits (a excepcin del operador unario de complemento al
nivel de bits) tiene un operador de asignacin correspondiente.
q q El operador OR exclusivo a nivel de bits ( ^ ) toma dos operandos. Un bit en el resultado se
establece a 1 si solamente uno de los bits correspondientes en los dos operandos es 1.
q q El operador de desplazamiento a la izquierda ( << ) desplaza los bits de su operando
izquierdo hacia la izquierda el nmero de bits especificado por su operando derecho. Los bits
vacantes del lado derecho se remplazan con 0.
q q El operador de desplazamiento a la derecha ( >> ) desplaza los bits de su operando izquierdo
hacia la derecha el nmero de bits especificado por su operando derecho. Realizar un
desplazamiento a la derecha de un entero sin signo causa que los bits vacantes de la izquierda se
reemplacen con 0. los bits vacantes en los enteros con signo pueden reemplazarse con ceros o
unos esto depende de la mquina.
q q El operador de complemento a nivel de bits ( ~ ) toma un operando e invierte sus bits, y esto
produce el complemento a uno del operando.
q q Algunos archivos de encabezado C+++ incluyen funciones estndar que se pueden usar para
realizar tareas comunes. Hay funciones matemticas, funciones de conversin y funciones de
cadena, slo por mencionar algunas categoras.
q q La funcin islower() determina si su argumento es una letra minscula ( a z ).
q q La funcin isupper() determina si su argumento es una letra mayscula ( A Z ).
q q La funcin isdigit() determina si su argumento es un dgito ( 0 9 )
q q La funcin isalpha() determina si su argumento es una letra mayscula ( A Z ) o minscula ( a
z ).
q q La funcin isalnum() determina si su argumento es una letra mayscula ( A Z ), minscula ( a
z ) o un dgito ( 0 9 ).
q q La funcin isxdigit() determina si su argumento es un dgito hexadecimal ( A F, a f, 0 9 )-
q q La funcin toupper() convierte una letra minscula a mayscula.
q q La funcin tolower() convierte una letra mayscula a minscula.
q q La funcin isspace() determina si su argumento es alguno de los siguientes caracteres de espacio
en blanco: (espacio), \f, \n, \ r, \t o \v.
q q La funcin isnctrl() determina si su argumento es uno de los siguientes caracteres de control:
\t, \v, \f, \a, \b, \ r, o \n.
q q La funcin ispunct() determina si su argumento es un carcter imprimible que no sea espacio,
dgito o letra.
q q La funcin isprint() determina si su argumento es cualquier carcter imprimible, incluyendo el
carcter de espacio.
q q La funcin isgraph() determina si su argumento es un carcter imprimible que no sea el carcter
de espacio.
q q La funcin atof() convierte su argumento una cadena que comienza con una serie de dgitos
que representan un nmero de punto flotante a un valor double.
q q La funcin atoi() convierte su argumento una cadena que comienza con una serie de dgitos
que representan un entero a un valor int.
q q La funcin atol() convierte su argumento una cadena que comienza con una serie de dgitos
que representan un entero largo a un valor long.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-76
q q La funcin strtod() convierte a double una secuencia de caracteres que representan un valor de
punto flotante. La funcin recibe dos argumentos una cadena (char *) y un apuntador a char *.
La cadena contiene la secuencia de caracteres a convertirse, y al apuntador a char * se le asigna
el resto de la cadena despus de la conversin
q q La funcin strtol() convierte a long una secuencia de caracteres que representan un entero. La
funcin recibe tres: argumento una cadena (char *), un apuntador a char * y un entero. La
cadena contiene la secuencia de caracteres a convertirse, al apuntador a char * se le asigna el
resto de la cadena despus de la conversin y el entero especifica la base del valor que est
siendo convertido.
q q La funcin strtoul() convierte a unsigned long una secuencia de caracteres que representan un
entero. La funcin recibe tres argumentos una cadena (char *), un apuntador a char * y un
entero. La cadena contiene la secuencia de caracteres a convertirse, al apuntador a char * se le
asigna el resto de la cadena despus de la conversin y el entero especifica la base del valor que
est siendo convertido.
q q La funcin strchr() busca la primera ocurrencia de un carcter en una cadena. Si encuentra dicho
carcter devuelve un apuntador al carcter en la cadena, y en caso contrario devuelve NULL.
q q La funcin strspn() determina la longitud de la parte inicial de la cadena que est en su primer
argumento que no contiene ningn carcter de la cadena que est en su segundo argumento. La
funcin devuelve la longit ud del segmento.
q q La funcin strpbrk() busca la primera ocurrencia en su primer argumento de cualquier carcter
que aparece en su segundo argumento. Si encuentra un carcter del segundo argumento devuelve
un apuntador al carcter, y en caso contrario devuelve NULL
q q La funcin strrchr() busca la ltima ocurrencia de un carcter en una cadena. Si encuentra dicho
carcter devuelve un apuntador al carcter en la cadena, y en caso contrario devuelve NULL.
q q La funcin strspn() determina la longitud de la parte inicial de la cadena que est en su primer
argumento, que slo contiene caracteres de la cadena que est en su segundo argumento. La
funcin devuelve la longitud del segmento.
q q La funcin strstr() busca la primera ocurrencia de su segundo argumento de cadena en su primer
argumento de cadena. Si la segunda cadena se encuentra en la primera, se devuelve un apuntador
hacia la localidad de la cadena en el primer argumento.
q q La funcin memcpy() copia el nmero especificado de caracteres desde el objeto al que apunta
su segundo argumento hacia el objeto al que apunta su primer argumento. Dicha funcin puede
recibir un apuntador a cualquier tipo de objeto. memcpy() recibe a dichos apuntadores como
void, y stos se convierten a apuntadores char para utilizarlos en la funcin. La funcin
memcpy() manipula los bytes de los argumentos como caracteres.
q q La funcin memmove() copia un nmero especificado de bytes desde el objeto al que est
apuntado su segundo argumento hacia el objeto al que est apuntado su primer argumento. La
copia se realiza como si los bytes se copiaran desde el segundo argumento hacia un arreglo de
caracteres temporal y luego se copiaran desde el arreglo temporal hacia el primer argumento.
q q La funcin memcmp() compara el nmero especificado de caracteres de sus argumentos primero
y segundo.
q q La funcin memchr() busca la primera ocurrencia de un byte, representado como unsigned char
en el nmero especificado de bytes de un objeto. Si encuentra al byte devuelve un apuntador a
ste, y en caso contrario devuelve un apuntador a NULL.
q q La funcin memset() copia su segundo argumento, al que trata como unsigned char, hacia un
nmero especificado de bytes del objeto al que est apuntando el primer argumento.
q q La funcin strerror() convierte un nmero de error entero a una cadena de texto completa en
forma dependiente del sistema. Se devuelve un apuntador a la cadena.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-77
PREGUNTAS Y PROBLEMAS

PREGUNTAS

1. Qu valor producir cada una de las siguientes operaciones de enteros?
a. 4 2 * 3
b. 35 / 6
c. 35 % 6
d. 25 * 14 % 7 * -25 / -5
e. 5 * 3 + 9 2 * 7
f. (-13 / 2) % 6
2. Evale cada una de las siguientes expresiones:
a. 0.5 + 3.75 / 0.25 *2
b. 2.5 (1.2 + (4.0 3.0) * 2.0) + 1.0
c. 6.0E 4 * 3.0E + 3
d. 6.0E 4 / 3.0E + 3
3. Evale cada una de las siguientes expresiones:
a. 5.0 (6.0 / 3)
b. 200 * 200
c. 5 6 / 3
d. (5 6) / 3
e. 1 + 25 % 5
f. 33000 + 2000
4. Evale cada una de las siguientes expresiones:
a. int i = 0;
int j = 10;
++i + j++;
b. float k = 2.5;
k-- * 2;
c. char caracter = a;
++caracter;
d. int x = 1;
int y = -1;
int z = 25;
++x + ++y - --z;
5. Evale cada una de las siguientes operaciones relacionales:
a. 7 != 7
b. 0.75 <= -0.5
c. m > n
d. 2 * 5 % 3 7 < 16 / 4 + 2
e. Andy == Andy
f. strcmp(Andy, Andy)
6. Determine la salida generada por lo siguiente:
a. cout << ((2 % 5) / (5 % 2)) << endl;
b. cout << (3 * 6 / 3 + 6) << endl;
c. cout << ((3 * 6) / (3 + 6)) << endl;
d. cout << ( NOT (1 OR 0)) << endl;
e. cout << ((2 5 / 2 * 3) <= (8 % 2 6)) << endl;
f. int x = -7;
int y = 3;
cout << ( NOT(3 * x < 4 * y) AND (5 * x >= Y)) << endl;
g. cout << (3.5 AND 0) << endl;
h. cout << (3.5 OR 2.0) << endl;
7. El estndar ANSI C++especifica la operacin lgica excluyente OR, XOR. El estndar proporciona para
el teclado XOR o un smbolo de intercalacin, ^, alternativo, que se usa como sintaxis para esta
operacin. Dadas dos variables booleanas, A y B, la operacin XOR se define como:
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-78
A B A XOR B
verdadero verdadero falso
verdadero falso verdadero
falso verdadero verdadero
falso falso falso

Puede ver en la tabla un patrn que sugiera cmo trabajar XOR? Bien, la operacin XOR siempre
producir un resultado verdadero si hay un nmero impar de variables verdaderas. Ahora para la
pregunta: Cul de las siguientes expresiones lgicas pr oducir la operacin XOR?

a. NOT A OR NOT B
b. (A AND NOT B) OR (NOT A AND B)
c. NOT(A AND NOT B) OR (NOT A AND B)
d. NOT(NOT A AND NOT B)
8. Qu operacin lgica estndar realiza la expresin en la pregunta 7d?
9. Desarrolle una tabla de verdad para la siguiente expresin lgica:
NOT A OR NOT B
10. Cul de las siguientes es equivalente a la operacin lgica en la pregunta 9?
a. !(A && B)
b. !(A || B)
c. !A && !B
d. Ninguna de las anteriores
11. Explique cmo se obtiene la informacin de cmo usar una funcin estndar disponible en su
compilador.
12. Determine el valor que producen las siguientes funciones. Use el manual de referencia de su compilador
con la caracterstica ayuda en lnea, para asegurarse cmo operan las funciones.
a. abs(-5)
b. sin(1.57)
c. log(2.73)
d. log10(100)
e. pow(2,5)
f. cos(0)
g. toascii( )
h. tolower(A)
i. strlen(C++)
13. Explique que sucede cuando ejecuta las siguientes funciones:
a. strcmp(nombre, Brenda);
b. strcmp(nombre1, nombre2);
14. Pruebe o desapruebe por medio de la tabla de verdad que:
NOT A AND NOT B == NOT(A AND B)
15. Indique si las siguientes oraciones son verdaderas o falsa. Si son falsas, explique por qu.
a. El operador de mdulo (%) slo puede utilizarse con operandos enteros.
b. Los operadores aritmticos *, /, %, +y tienen el mismo nivel de precedencia.
c. Un programa C++que imprime tres lneas de salida debe tener tres instrucciones de salida cout.
16. Indique cules de las siguientes oraciones son verdaderas y cules son falsas. Expllique sus respuestas.
a. Los operadores de C++se evalan de izquierda a derecha.
b. Los siguientes son nombres de variables vlidos: _bajo_barra, m928134, t5, j7, susVentas, cuCuentaTotal, a, b,
c, z, z2.
c. La instruccin cout<<a =5;; es un ejemplo tpico de una instruccin de asignacin.
d. Las expresiones aritmticas vlidas de C++sin parntesis se evalan de izquierda a derecha.
e. Los siguientes son nombres de variables invlidos: 3g, 87, 67h2, h22, 2h.
17. Llene los espacios en blanco de las siguientes oraciones:
a. Qu expresiones aritmticas estn al mismo nivel de precedencia que la multiplicacin?
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-79
b. Cuando se anidan parntesis, qu par de parntesis debe evaluarse primero en una expresin aritmtica?
_______________________.
c. Una localidad de memoriade la computadora que puede contener valores distintos en diferentes momentos de
la ejecucin de un programa se llama ________________.
18. Dada la ecuacin algebraica y =ax
3
+7, Cules de las siguientes son instrucciones correctas en C++
para dicha ecuacin, si es que las hay?
a. y =a * x * x* x +7;
b. y =a * x * x*( x +7);
c. y =(a * x) * x*( x +7);
d. y =(a *x) * x* x +7;
e. y =a * (x * x* x) +7;
f. y =a * x * (x* x +7);
19. Indique el orden de evaluacin de los operadores de las siguientes instrucciones C++y muestre el valor
de x tras la ejecucin de cada instruccin.
a. x =7 +3 * 6 / 2 1;
b. x =2 %2 +2 *2 2;
c. x =(3 * 9 * (3 +(9 * 3 / (3) )));
20. Llene los espacios en blanco en cada una de las siguientes oraciones.
a. Los bits en el resultado de una expresin cuando se utiliza el operador ____________ se establecen a 1 si los
bits correspondientes de cada operando son 1. En caso contrario, los bits se establecen a 0.
b. Los bits en el resultado de una expresin cuando se utiliza el operador _____________ se establecen a 1 si al
menos uno de los bits correspondientes en cualquier operando es 1. En caso contrario, los bits se establecen a
0.
c. Los bits en el resultado de una expresin cuando se utiliza al operador ___________ se establecen a 1 si
nicamente uno de los bits correspondientes en cualquier operando es 1. En caso contrario, los bits se
establecen a 0.
d. El operador AND al nivel de bits & se utiliza frecuentemente para ___________ bits, es decir, seleccionar
determinados bits de una cadena de bits mientras otros se establecen a cero.
e. Los operadores ________________ y _______________ se utilizan para dezplazar los bits de un valor hacia la
izquierda o a la derecha, respectivamente.

21. Escriba una sola instruccin para realizar cada una de las siguientes cosas. Suponga que las variables c
(que almacena un carcter), x, y y. son de tipo int, las variables d, ey f son de tipo float, la variable ptr es
tipo char * y los arreglos s1[100] y s2[100] son de tipo char.
a. Convierta el carcter que est almacenado en la variable c a letra mayscula. Asigne el resultado a la variable
c.
b. Determine si el valor de la variable c es un dgito. Utilice el operador condicional, como se muestra en los
programas, para imprimir es un o no es un cuando se desplligue el resultado.
c. Convierta la cadena 1234567 a long e imprima el valor.
d. Determine si el valor de la variable c es un carcter de control. Utilice el operador condicional para imprimir
es un o no es un cuando se despliegue el resultado
e. Asigne a ptr la localidad de l a ltima ocurrencia de c en s1.
f. Convierta la cadena 8.63582 a doublee imprima el valor.
g. Determine si el valor de c es una letra. Utilice el operador condicional para imprimir es una o no es una
cuando se despliegue el resultado.
h. Asigne a ptr la locallidad de la primera ocurrencia de s2 en s1.
i. Determine si el valor de la variable c es un carcter imprimible. Utilice el operador condicional para imprimir
es un o no es un cuando se despliegue el resultado.
j. Asigne a ptr la localidad de la pri mera ocurrencia en s1 de cualquier carcter que est en s2.
k. Asigne a ptr la localidad de la primera ocurrencia de c en s1.
l. Convierta la cadena -21a int e imprima el valor.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-80
PROBLEMAS

1. Escriba un programa que permita al usuario convertir una temperatura en grados Fahrenheit a grados
Centgrados usando la siguiente relacin:
C =5 / 9 (F 32)
2. Escriba un programa que permita al usuario convertir una medida de pulgadas a cent metros.
3. Escriba un programa de verificacin qu demuestre qu pasa cuando usa un argumento ilegal dentro de
una funcin. Por ejemplo, qu pasa cuando usa un argumento de carcter en una funcin
aritmtica?
4. Escriba un programa que permita al usuario encontrar la hipotenusa de un tringulo rectngulo usando
el teorema de Pitgoras. (Sugerencia: use la funcin hypot() en el archivo de cabecera math.h.
5. Escriba un programa para solucionar la siguiente ecuacin para x:
3x 5y +2 =35
Suponga que el usuario escribir los valores para y.
6. Escriba un programa para generar una tabla de verdad para una operacin NOR. Una operacin NOR es
una operacin NOT OR. De esta manera:
A NOR B =NOT(A OR B)
Suponga que el usuario escribir valores lgicos para A y B.
7. Escriba un programa para convertir coordenadas rectangulares a polares. Genere una salida tabular de la
coordenada rectangular en comparacin con la coordenada polar.
8. La energa cintica de un objeto en movimiento se encuentra usando la ecuacin:
K =(1/2)(mv
2
)
Donde:
K es la energa cintica, en kg/seg.
mes la masa en kg.
ves la velocidad en m/seg.
Escriba un programa que acepte entradas de masa y velocidad de un objeto y determine su
energa cintica.
9. A continuacin aparece la lista de inventario y precios del departamento de Salud y Belleza de la tienda
general ACME, S.A. de C.V.
Artculo Precio
Jabn GrandMas Lye 0.49
Bolsa Bahm 1.29
Sopa de pollo 0.29
Linimento 2.35
Polvo para hornear 0.63
ACME, S.A. de C.V. quiere realizar una gran venta y reducir todos los artculos de Salud y Belleza
en 5%. Escriba un programa que imprima una lista de todos los artculos de Salud y Belleza
mostrando el precio regular y el de promocin. Suponga que en la salida debe ir la lista anterior.
10. Revise el programa del problema 9 para permitir que ACME, S.A. de C.V. escriba cualquier porcentaje
de descuenta sobre la venta.
11. Revise el programa del problema 9 para leer los nombres y precios de los artculos desde un archivo en
disco llamado precios. Genere el informe en su pantalla del monitor. (Nota: deber crear un archivo de
texto precios, con su editor, que contenga los nombres y precios de los artculos mencionados en la tabla
del problema 9)
12. ACME, S.A. de C.V. quedaron entusiasmados con los programas que escribi, as que ellos quieren
ampliar sus operaciones de computadora para el departamento de nmina. Escriba un programa de
nmina para ACME, S.A. de C.V. , que calcule el pago neto de Jos (su nico empleado) determinado
por la siguiente informacin:

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-81
Nombre del empleado
Nmero de horas trabajadas a la semana
Salario por hora
I SR (7.15%)
Retencin federal (16%)
Retencin estatal (4.75%)

Genere un informe usando el siguiente formato:

Nombre del empleado: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Salario por hora: $XXX.XX
Nmero de horas trabajadas a la semana: XX.XX
Pago bruto: $XXXX.XX
Deducciones:
ISR: $XXX.XX
Retencin federal: XXX.XX
Retencin estatal: XXX.XX
--------------
Total de deducciones: $XXX.XX

Pago neto: $XXXX.XX

13. El diagrama en la figura 6.4 muestra cmo se usa la triangulacin para encontrar la distancia a un objeto.
Esta es la idea: dos dispositivos de triangulacin se separan a cierta distancia, y ambos dispositivos
obtienen un ajuste sobre un objeto como se muestra en la figura 6.4. Los dos dispositivos de
triangulacin y el objeto forman un tringulo con un lado d, y dos ngulos
1
y
2
como se muestra. El
tercer ngulo se encuentra fcilmente restando los dos ngulos conocidos a 180. La distancia de cada
dispositivo de triangulacin al objeto se encuentra usando la ley de los senos, que establece:
r
1
/ sen
1
=r
2
/ sen
2
=d / sen[180 (
1
+
2
)]
Escriba un programa para encontrar la distancia que hay entre el objeto y cada dispositivo de
triangulacin. Suponga que el usuario escribir la distancia (d) entre los dispositivos y los dos ngulos
(
1
y
2
) que el objeto forma con los dispositivos de triangulacin,



r
2
r
1
180 -(
1
+
2
)



1

2

Dispositivo de Dispositivo de
triangulacin 1 triangulacin 2

r
1
/ sen
1
= r
2
/ sen
2
= d / sen[180 (
1
+
2
)]

Figura 6.4. Un diagrama de triangulacinpara el problema 12.

14. Escriba un programa que desplace a la derecha en 4 bits a una variable entera. El programa deber
imprimir el entero en bits antes y despus de la operacin de desplazamiento Su sistema coloca 0 o 1 en
los bits vacantes?
d
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-82
15. Si su computadora utiliza enteros de 4 bytes, modifique el programa BI TOPER3.CPP, pgina 203, para
que funcione con enteros de 4 bytes.
16. El desplazamiento hacia la izquierda en 1 bit de un entero unsigned es equivalente a multiplicar el valor
por 2. Escriba la funcin power2() que tome dos argumentos enteros numero y pow- y calcule:

numero * 2
pow

Utilice el operador de desplazamiento para calcular el resultado. El programa deber imprimir los
valores como enteros y como bits.
17. Es posible utilizar el operador de desplazamiento a la izquierda para empacar dos valores de carcter en
una variable entera sin signo de 2 bytes. Escriba un programa que reciba dos caracteres desde el teclado y
los pase a una funcin packCharacters() Para empacar dos carcteres en una variable entera unsigned,
asigne el primer carcter a la variable unsigned, desplace la variable unsigned hacia la izquierda en 8
posiciones de bit y combine la variable unsigned con el segundo carcter usando el operador OR
inclusivo al nivel de bits. El programa deber enviar a la salida los caracteres en su formato de bits antes
y despus de que se empaquen en el entero unsigned para probar que los caracteres estn, de hecho,
empacados correctamente en la variable unsigned.
18. Utilizando el operador de desplazamiento a la derecha, el operador AND al nivel de bits y una mscara,
escriba la funcin unpackCharacters() que tome el entero unsigned del probl ema 17 y lo desempaque
en dos caracteres. Para desempacar dos caracteres desde un entero de 2 bytes unsigned, combine el
entero sin signo con la mscara 65280 (11111111 00000000) y desplace hacia la derecha en 8 bits el
resultado. Asigne el valor resultant e a una variable char. Luego combine el entero unsigned con la
mscara 255 (00000000 11111111)- Asigne el resultado a otra variable char. El programa primero deber
imprimir al entero unsigned en bits antes de que sea desempacado, y despus los caracteres en bits para
confirmar que se desempacaron correctamente.
19. Si su sistema utiliza enteros de 4 bytes, vuelva a escribir el problema 17 para empacar 4 caracteres.
20. Si su sistema utiliza enteros de 4 bytes, vuelva a escribir la funcin unpackCharacters() del problema 18
para desempacar 4 caracteres. Cree las mscaras que necesite para desempacar los 4 caracteres
desplazando hacia la izquierda el valor 255 en la variable de mscara en 8 bits, 0, 1, 2 0 3 veces
(dependiendo del byte que se vaya a desempacar)
21. Escriba un programa que invierta el orden de los bits de un valor entero sin signo. El programa deber
recibir el valor del usuario y llamar a la funcin reverseBits() para imprimir los bits en orden inverso.
Imprima el valor en bits antes y despus de invertir los bits, para confirmar que se invirtieron
adecuadamente.
22. Modifique la funcin visualizarBits() del programa BI TOPER3.CPP, de la pgina 203, para que sea
portable entre sistemas que utilicen enteros de 2 y 4 bytes. Sugerencia: utilice el operador sizeof() para
determinar el tamao de un entero en una mquina particular.
23. Escriba un programa que reciba un carcter desde el teclado y pruebe el carcter con cada una de las
funciones de la biblioteca de manejo de caracteres. El programa deber imprimir el valo r devuelto por
cada funcin.
24. El siguiente programa utiliza la funcin mltiple() para determinar si el entero introducido desde el
teclado es un mltiplo de algn entero x. Examine la funcin mltiple() y luego determine el valor de x.







/* El siguiente programa: PROBLEMA24.CPP, determina si un valor es mltiplo de x. */

#include <iostream.h> //Para cout y cin

int multiple( int );

void main(void)
{
int y;

cout <<I ntroduzca un nmero entero entre 1 y 32000: ;
cin >>y;

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-83






















25. Qu hace el siguiente programa?
























26. Escriba un programa que introduzca una lnea de texto con la funcin miembro getline() de istreamen el
arreglo de caracteres s[100] D salida a la lnea en letras maysculas y minsculas.
27. Escriba un programa que introduzca 4 cadenas que representen enteros, convierta dichas cadenas a
enteros, sume los valores e imprima el total de los 4 valores.
28. Escriba un programa que introduzca 4 cadenas que representen valores flota, convierta dichas cadenas a
double, sume los valores e imprima el total de los 4 valores.
29. Escriba un programa que introduzca una lnea de texto y una cadena de bsqueda desde el teclado.
Mediante la funcin strstr(), localice la primera ocurrencia de la cadena de bsqueda en la lnea de texto,
y asigne la localidad a la variable searchPtr de tipo char *. Si encuentra la cadena de bsqueda, imprima
if( mltiple( y ) )
cout <<y << es un mltiplo de x <<endl;
else
cout <<y << no es un mltiplo de x <<endl;
}//Fin de main()

int multiple( int num)
{
int mask =1, mult =1;

for( int i =0; i <10; i++, mask <<=1)
if( ( num & mask ) ! =0 )
{
mult = 0;
break;
}//Fin de if
return mult;
}//Fin de multiple()

#include <iostream.h> //Para cout y cin
int misterio( unsigned );

void main(void)
{
unsigned x;

cout <<I ntroduzca un nmro entero: ;
cin >>x;
cout <<El resultado es <<misterio( x ) <<endl;
}//Fin de main()

int misterio( unsigned bits )
{
unsigned mask =1 <<15, total =0;

for( int i =0; i <16; i++, bits <<=1 )
if( ( bits & mask ) ==mask )
++total;
return total % 2 ==0 ? 1 : 0;
}//Fin de misterio()
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-84
el resto de la lnea de texto comenzando con la cadena de bsqueda. Luego utilice nuevamente strstr()
para localizar la siguiente ocurrencia de dicha cadena en la lnea de texto. Si encuentra una segunda
ocurrencia, imprima el resto de la lnea, comenzando con la segunda ocurrencia. Sugerencia: la segunda
llamada a strstr() debe contener searchPtr + 1 como primer argumento.
30. Escriba un programa basado en el programa del problema 29 que introduzca varias lneas de texto y una
cadena de bsqueda, y utilice la funcin strstr() para determinar el nmero total de ocurrencias de la
cadena en las lneas de texto. Imprima el resultado.
31. Escriba un programa que introduzca varias lneas de texto y un carcter de bsqueda, y utilice la funcin
strchr() para determinar el nmero total de ocurrencias del carcter en la lnea de texto.
32. Escriba un programa basado en el programa del problema 31 que introduzca varias lnea de texto, y use
la funcin strchr() para determinar el nmero total de ocurrencias de cada letra del alfabeto en el texto.
Las letras maysculas y minsculas.
33. Cules se debern contar juntas. Guarde los totales de cada letra en un arreglo e imprima los valores en
formato tabular despus de que se hayan determinado los totales.
34. Basndose en la tabla de cdigos de caracteres ASCI I de la pgina 26 diga si cada una de las siguientes
frases es verdadera o falsa.

a. La letra A viene antes que la letra B.
b. El dgito 9 viene antes del dgito 0.
c. Los smbolos sutilizados comnmente para la suma, resta, multiplicacin y divisin estn antes de que
cualquiera de los dgitos.
d. Los dgitosestn antes que las letras.
e. Si un programa de ordenamiento ordena cadenas en secuencia ascendente, dicho programa colocar el smbolo
de parntesis derecho antes que el smbolo de parntesis izquierdo.
35. Escriba un programa que lea una serie de cadenas e imprima solamente aquellas cadenas que comienzan
con la letra b.
36. Escriba un programa que lea una serie de cadenas e imprima solamente aquellas cadenas que terminen
con las letras DE.
37. Escriba un programa que introduzca un cdigo ASCI I e imprima el carcter correspondiente. Modifique
este programa para que genere todos los cdigos de tres dgitos posibles en el rango de 000 a 255 e
intente imprimir los caracteres correspondientes. Qu pasa cuando se ejecuta este programa?
38. Utilizando como gua la tabla de caracteres ASCII de la pgina 26, escriba sus propias versiones de las
funciones para el manejo de caracteres de la tabla 6.6 pgina 40.
39. Escriba sus propias versiones de las funciones de tabla 6.7 pgina 44 para convertir cadenas a nmeros.
40. Escriba sus propias versiones de las funciones de la tabla 6.8 pgina 49 para buscar cadenas.
41. Escriba sus propias versiones de las funciones de la tabla 6.9 pgina 52 para manipular bloques de
memoria.
42. (Proyecto: un revisor de ortografa) Muchos paquetes de software de procesamiento de texto populares
tienen revisores de ortografa integrados. En este proyecto se le pide que desarrolle su propia utilera de
revisin ortogrfica. Le damos algunas sugerencias para ayudarle a comenzar. Luego deber considerar la
adicin de ms capacidades. Tal vez encuentre til el uso de un diccionario computarizado como fuente
de palabras.

Por qu tecleamos tantas palabras con falta de ortografa? En algunos casos es simplemente porque no
sabemos la ortografa correcta y, por lo tanto, hacemos nuestra mejor suposicin. En algunos casos se
debe a que intercambiamos dos letras (por ejemplo, defualt en vez de default) A veces tecleamos dos
veces una letra accidentalmente (por ejemplo, tamto en vez de tanto)- A veces tecleamos una tecla
cercana en vez de la que pretendamos (por ejemplo, numca en vez de nunca) Y as sucesivamente.

Disee e implemente un programa revisor de ortografa en C++. El programa mantiene un arreglo
wordList de cadenas de caracteres. Usted puede teclear estas cadenas u obtenerlas a partir de un
diccionario computarizado.

El programa le pide al usuario que teclee una palabra. Despus busca esa palabra en el arreglo wordList.
Si la palabra est presente en el arreglo, el programa deber imprimir La palabra est escrita
correctamente.

MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-85
Si la palabra no est presente en el arreglo, el programa deber imprimir La palabra no est escrita
correctamente. A continuacin, el programa deber tratar de localizar otras palabras en wordList que el
usuario tal vez poda haber pretendido teclear. Por ejemplo, se pueden probar todas las posibles
transposiciones simples de letras adyacentes para descubrir que la palabra defaulttiene una concordancia
directa con una palabra que est en wordList. Por supuesto, esto implica que el programa deber revisar
todas las dems transposiciones simples, tales como edfault, dfeault, deafult, defalut y defautl. Cuando
encuentra una nueva palabra que concuerde con alguna de wordList, imprmala en un mensaje como
Quieres decir default?

Implemente otras pruebas, tales como el reemplazo de cada letra doble con una sola letra, y otras que
pueda desarrollar para mejorar el valor de su revisor de ortografa.

EXAMEN BREVE 13

1. Diga el orden en el cual C++realiza las operaciones aritmticas . Asegrese de mencionar
cmo se manejan los parntesis.
2. Escriba un enunciado usando el operador de decremento que es equivalente al enunciado x =
x 1;.
3. Verdadero o falso: el operador de divisin producir un resultado entero cuando cualquiera de
los operandos sea un entero.
4. Verdadero o falso: el operador mdulo se define slo para enteros.
5. Cul es la diferencia entre usar el operador preincremento y el posincremento en una
variable, en especial cuando la variable se usa como parte de una expresin compuesta?
6. Cul es el resultado de 10 / 100?

EXAMEN BREVE 14

1. Escriba un enunciado usando un operador de asignacin de adicin compuesta que sea
equivalente al enunciado x = x + 5.
2. Escriba un enunciado usando un operador de asignacin de divisin compuesta que sea
equivalente al enunciado x = x / y
3.
EXAMEN BREVE 15

1. Los operadores que permiten comparar dos valores se llaman operadores
___________________.
2. En C++, un falso lgico equivale al valor _________________________.
3. Cul es la diferencia entre el operador = y el operador == en C++?
4. Qu valor se genera como resultado de la siguiente operacin? 4 > 5 2
5. Qu valor se genera como resultado de la siguiente operacin? (5!=5) AND (3==3)

EXAMEN BREVE 16

1. Para usar una funcin estndar en su programa debe incluir su ___________________.
2. Explique como obtener una descripcin en lnea de una funcin estndar con el compilador.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-86
3. Qu funcin deber emplear en su programa para asignar datos de cadena a una variable de
cadena?
4. Escriba un enunciado que asigne la cadena C++ a la variable de cadena llamada
compilador.
5. Por qu la funcin strcmp() debe usarse en lugar de los operadores relacionales booleanos
cuando se comparan valores de cadena?

RESPUESTA EXAMEN BREVE 13

1. El orden en que C++realiza las operaciones aritmticas es como sigue: () * / % + -.Cualquier
operacin dentro de parntesis se realizar primero, despus (de izquierda a derecha) la
mult iplicacin, divisin y mdulo y despus (de izquierda a derecha) la suma y la resta.
2. El enunciado x es equivalente a x = x 1;
3. Falso: Se requiere que ambos operandos sean enteros para que el cociente lo sea.
4. Verdadero: El operador mdulo se define slo para enteros.
5. La diferencia entre usar el operador preincremento en comparacin con el operador
posincremento en una variable es que el primero incrementa la variable antes de que se evale
cualquier expresin que incluya la variable, y el segundo incrementa la variable despus de que
se evale cualquier expresin que incluya a la variable. Es importante tener cuidado con la que
se usa, especialmente cuando la variable forma parte de una expresin compuesta, porque se
pueden producir resultados indeseables si se utiliza el operador incremento equivocado.
6. El resultado de 10/100 es 0, porque ambos operandos son enteros y el operador / genera un
resultado entero cuando ambos operandos son enteros.

RESPUESTA EXAMEN BREVE 14

1. El enunciado x += 5; equivale a x = x + 5;
2. El enunciado x /=y; es equivalente a x = x / y;

RESPUESTA EXAMEN BREVE 15

1. Los operadores que permiten comparar dos valores se llaman operadores relacionales.
2. En C++, un falso lgico equivale al valor 0 (cero)
3. La diferencia entre el operador = y el operador == en C++es que el operador = asigna el
enunciado a la derecha de la variable a la misma; y el operador == compara dos cantidades para
determinar si son iguales.
4. true (1) se genera como resultado de la operacin 4 > 5 2, porque 4 es mayor que (5 2) o sea
3.
5. El valor booleano false (0) se genera como resultado de la operacin (5!=5) AND (3==3),
porque (5!=5) es falso, haciendo que el enunciado compuesto AND sea falso.
MIGUEL . TOLEDO MARTNEZ
FUNDAMENTOS LECCIN 6
6-87
RESPUESTA EXAMEN BREVE 16

1. Para usar una funcin estndar en su programa debe incluir su archivo de encabezado.
2. La respuesta a esta pregunta depende del compilador que se utilice. Entrese como se hace en
su compilador.
3. La funcin strcmp() debe emplearse para asignar unos datos de cadena a una variable de cadena
en un programa C++.
4. El enunciado strcmp(compilador, C++); asignar la cadena C++ a una variable de cadena
llamada compilador.
5. La funcin strcmp() se debe usar en lugar de los operadores relacionales booleanos cuando se
comparan valores de cadenas, porque los operadores relacionales booleanos no dan resultados
lgicos correctos cuando se comparan las cadenas.

También podría gustarte