You are on page 1of 81

Parte I

Los bsicos
2 2

Hola Mundo!

"La programacin se aprende


Al escribir programas .

-brian Kernighan

Aqu, presentamos el programa ms simple en C ++ que


realmente hace nada. El propsito de escribir este
programa es:

Permitir probar el entorno de programacin


Le dar una primera idea de cmo se puede
conseguir que una computadora pueda hacer las cosas
para usted

Por lo tanto, se presenta el concepto de un programa, la


idea de obtener un programa de forma legible
brindndole instrucciones a la mquina utilizando un
compilador, y finalmente la ejecucin de esas
instrucciones en la mquina.
2.1 Programas
2.2 El primer programa clsico
2.3 Compilacin
2.4 Vinculacin
2.5 entornos de programacin

2.1 Programas

Para conseguir que un ordenador pueda hacer algo, usted (u otra persona) tiene que decirle exactamente
con absoluto detalle - qu hacer. Tal descripcin de "qu hacer" se llama un programa y programacin
es la actividad de escribir y probar tales programas.
En un sentido, todos hemos programado antes. Despus de todo, hemos dado descripciones de
tareas a realizar, tales como "cmo conducir al cine ms cercano," "cmo encontrar el bao de
arriba" y "cmo calentar una comida en el microondas." La diferencia entre estas descripciones y
un programa es en el grado de precisin: los seres humanos tienden a compensar las malas
instrucciones al usar el sentido comn, pero las computadoras no lo hacen. Por ejemplo, "gire a la
derecha en el pasillo, escaleras arriba, va a ser a su izquierda" es probablemente una buena descripcin
de cmo llegar al bao de arriba. Sin embargo, cuando nos fijamos en esas sencillas instrucciones,
usted encontrar la gramtica descuidado y las instrucciones incompletas. Un humano compensa
fcilmente. Por ejem. Supongamos que usted est sentado en la mesa y pide indicaciones para
llegar al bao. No es necesario que se les diga que debe levantarse de su silla para llegar al pasillo,
de alguna manera caminar alrededor (y no a travs o por debajo) de la mesa, no pisar el gato, etc. No
tendr que ser contada que no debe llevar el cuchillo y el tenedor o se acuerde de apagar la luz para
que pueda ver las escaleras. Para abrir la puerta del bao de la habitacin antes de entrar
es, probablemente, tambin algo que no tiene que ser contada.

Por el contrario, las computadoras son mquinas receptoras sin raciocinio. Tienen que tener
todo lo que se describe de manera precisa y en detalle. Consideremos de nuevo "girar a la derecha en
el pasillo, escaleras arriba, va a ser a su izquierda." Dnde est el corredor? Qu es un corredor? Qu
es "girar a la derecha"? Lo escaleras? Cmo hago para subir escaleras? (Un paso a la vez? Dos pasos?
Deslizar hacia arriba la barandilla?)
Qu hay en mi izquierda? Cundo va a estar en mi izquierda? Para ser capaz de describir "cosas"
que descifre precisamente una computadora, necesitamos un lenguaje definido con precisin con una
gramtica especfica (El Ingls est demasiado suelta estructurado para eso) y un vocabulario bien
definido para el tipo de acciones que desea que se realice. un lenguaje de este tipo se llama un
lenguaje de programacin y C ++ es un lenguaje de programacin diseado para una amplia variedad
de tareas de programacin.

Si desea mayor detalle filosfico acerca de las computadoras, programas y programacin (re) leer
el captulo1. Aqu, vamos a echar un vistazo algunos cdigos, comenzando con un programa
muy simple y las herramientas y tcnicas que se necesita para conseguir que se ejecute.

2.2 El programa primer clsico

Aqu esta una versin del primer programa clsico. Se escribe "Hola, mundo!" En la pantalla:

// Este programa muestra el mensaje "Hola, mundo!" En el monitor

# include "std_lib_facilities.h"

int main () //los programas en C ++ comienzan mediante la ejecucin de la funcin


main
{
cout << "Hola, mundo \ n"; // salida "Hola, mundo!"
return 0;
}
Piense en este texto como un conjunto de instrucciones que le damos a la computadora para que se
ejecute, como si nos dara una receta a seguir de un cocinero, o como una lista de instrucciones a
seguir para ensamblar y un nuevo juguete. Vamos a discutir lo que hace cada lnea de este
programa, a partir de la lnea de

cout << "Hola, mundo \ n"; //salida "Hola, mundo!"

Esa es la lnea que realmente produce la salida. Eso imprime los caracteres Hola, Mundo! Seguido
por un salto de lnea; es decir, despus de escribir Hola Mundo!, El cursor se coloca al principio
de la lnea siguiente. El cursor es un carcter poco intermitente que muestra la lnea donde se
puede escribir el siguiente carcter.

En C ++, los literales de cadena estn delimitados por comillas dobles ( "); es decir, Hola, Mundo!
\n" es una cadena de caracteres. Los \n es un "carcter especial" que indica una nueva lnea.
El nombre cout se refiere a una secuencia de salida estndar. Los caracteres "ponen en cout" usando
el operador de salida << aparecer en la pantalla. El nombre cout se pronuncia "si-fuera" y es una
abreviatura de " carcter de poner a corriente. Usted va encontrar abreviaturas ms comunes en la
programacin. Naturalmente, una abreviatura puede ser un poco engorroso la primera vez que se
usa y hay que recordar que, una vez que empiece a usar abreviaturas en repetidas ocasiones, estas
se convierten en un segundo plano, y son esenciales para mantener el texto del programa corto
y manejable.

El final de la lnea

//salida "Hola, mundo!"

Es un comentario. Cualquier cosa escrito despus del contador //(Que es el carcter /, se llama
"Barra", dos veces) en una lnea es un comentario. Los comentarios son ignorados por el
compilador y escritas para el beneficio de los programadores que leen el cdigo.
En este caso, se utiliz el comentario para mencionar lo que el principio de la lnea hizo.

Los comentarios estn escritas para describir lo que el programa est destinado a hace y en
general para proporcionar informacin til para las personas ya que no se pueden expresar
directamente en el cdigo. La persona es ms probable que se beneficie de los comentarios
en el cdigo, cuando vuelvas a ese cdigo la prxima semana, o el prximo ao, y ha olvidado
exactamente por qu escribi el cdigo de la manera que lo hizo. Por lo tanto, tambin documentar
sus programas. En 7.6.4, discutiremos lo que hace unos buenos comentarios.

Un programa est dirigido a dos pblicos. Naturalmente, se escribe cdigo para


ejecutar ordenadores. Sin embargo, pasamos largas horas leyendo y modificando el cdigo.
Por lo tanto, los programadores son otra audiencia para los programas. Por lo tanto, la escri tura
de cdigo es tambin una forma de comunicacin de humano a humano. De hecho, tiene sentido
considerar los lectores humanos de nuestro cdigo como nuestra audiencia principal: si ellos
(nosotros) no encuentran el cdigo razonablemente fcil de entender, el cdigo es poco probable
que se use de manera correcta. As que, por favor, no olvide: el cdigo es para la lectura - hacer
todo lo posible para que sea legible. De todas formas, los comentarios son slo para el beneficio
de los lectores humanos; el equipo no reconoce el texto de los comentarios.
La primera lnea del programa es un comentario tpico; simplemente le dice al lector humano
de lo que se supone que el programa hace:

//Este programa muestra el mensaje "Hola, mundo!" Al monitor

Este tipo de comentarios son tiles debido a que el cdigo en s dice lo que hace el programa, no
lo que significaba que har. Adems, a un ser humano por lo general podemos explicar (ms o
menos) lo que un programa deber hacer de manera mucho ms concisa de lo que podemos
expresarla (en detalle) en el cdigo para un ordenador. A menudo, un comentario de este tipo es
la primera parte del programa que escribimos. Por lo menos, nos recuerda lo que estamos tratando
de hacer.

La siguiente lnea

# include "std_lib_facilities.h"

Es un directorio "#include. "Se instruye a la computadora para poner a disposicin (" incluir
") instalaciones de un archivo llamado std_lib_facilities.h. Escribimos ese archivo para
simplificar el uso de las instalaciones disponibles en todas las implementaciones de C ++ (la
biblioteca de C ++ estndar"). Vamos a explicar su contenido a medida que avanzamos. Es
perfectamente normal el C ++ estndar, pero contiene detalles que preferimos no ahondar con
otra docena de captulos. Para este programa, la importancia de std_lib_facilities.h es que
hacemos en el C ++ estndar instalaciones de secuencia E / S disponibles. A continuacin, slo
tiene que utilizar el flujo de salida estndar, cout, y su operador de salida,<<.Un archivo incluido
el uso de #include por lo general tiene el sufijo h. y se llama un encabezamiento o una archivo
de cabecera. Una cabecera contiene definiciones de trminos, tales como cout, Que utilizamos
en nuestro programa. Cmo sabe si equipo es el que desea iniciar la ejecucin de un programa?
Se busca una funcin llamada main y comienza a ejecutar las instrucciones que encuentra all.
Aqu est la funcin main de nuestro programa "Hola, mundo!":

int main () //los programas en C ++ comienzan mediante la ejecucin de la funcin main


{
cout << "Hola, mundo \ n"; //salida "Hola, mundo!"
return 0;
}

Cada programa C ++ debe tener una funcin llamada main que le indiquen dnde empezar a
ejecutar. Una funcin es bsicamente una secuencia con nombre de instrucciones para que el
ordenador ejecute en el orden en el que estn escritos. Una funcin tiene cuatro partes:

El tipo de retorno, aqu int (Que significa "entero"), que especfica el tipo de variable
que hay. En consecuencia, si la hay, la funcin devolver a quien se le pregunt para que
sea ejecutado. La palabra int es una palabra reservada en C ++ (una palabra clave), asi que
int no puede ser utilizado como el nombre de cualquier otra cosa (ver A.3.1).
El nombre, aqu main.
La lista de parmetros entre parntesis (vase 8.2 y 8.6), aqu (); en este caso, la lista
de parmetros est vaca.

La cuerpo de la funcin encerrado en un conjunto de "llaves" {}, Donde se indica


las acciones (llamados declaraciones) Que la funcin lleva a cabo.

De ello se desprende que el programa bsico en C ++ es simplemente

int main () {}

Eso no es de mucha utilidad porque no hace nada, sin embargo. Los main () ("La !Funcin
principal") de nuestro " programa Hola Mundo " tiene dos declaraciones en su cuerpo:
cout << "Hola, mundo \ n"; //salida "Hola, mundo!"
return 0;

En primer lugar va a escribir Hola Mundo! en la pantalla, y luego se devolver un valor 0 (cero)
a quien lo llam. Ya que main ( ) es llamada por "el sistema," no vamos a utilizar ese valor de
retorno.

Sin embargo, en algunos sistemas (en particular, Unix / Linux) se puede utilizar para comprobar
si el programa tuvo xito. Un cero (0) Devuelto por main( ) indica que el programa termina
con xito.

Una parte de un programa en C ++ que especifica una accin y no es un directorio #include (o


alguna otra directiva de preprocesador; vase 4.4 y A.17) se llama una declaracin.

2.3 Compilacin

C ++ es un lenguaje compilado. Eso significa que para obtener que un programa se ejecute,
primero se debe traducir de forma legible a algo que una mquina pueda "Comprender".

"Entender". La traduccin se realiza mediante un programa llamado compilador. Lo que usted lee
y escribe se llama cdigo fuente o texto del programa, y lo que la computad ora ejecuta se llama
ejecutable, cdigo objeto o cdigo mquina. Normalmente, los archivos de cdigo fuente de C ++
reciben el sufijo .cpp (por ejemplo, hello_world.cpp) o .h (como en std_lib_facilities.h) y los
archivos de cdigo objeto reciben el sufijo .obj (en Windows) o .o (Unix). Por lo tanto, el cdigo
de la palabra simple es ambiguo y puede causar confusin; selo con cuidado slo cuando sea
obvio lo que significa. A menos que se especifique lo contrario, usamos el cdigo para significar
"cdigo fuente" o incluso "el cdigo fuente excepto los comentarios", porque los comentarios
realmente estn all slo para nosotros los seres humanos y no son vistos por el compilador que
genera el cdigo del objeto.

cdigo fuente en C ++ compilador de C ++ Cdigo de objeto

El compilador lee el cdigo fuente y trata de dar sentido a lo que se ha escrito. Se mira para
saber si su programa es gramaticalmente correcto, si cada palabra tiene un significado definido,
y si hay algo que obviamente es errneo que se puede detectar con la salida al intentar
ejecutar el programa. Usted encontrar que los compiladores son bastante exigente con la
sintaxis. No dejando de lado ningn detalle de nuestro programa, tales como un directorio
#include , un punto y coma, o una llave, causar errores.

Del mismo modo, el compilador tiene tolerancia cero para absolutamente todas las faltas de
ortografa. Vamos a ilustrar esto con una serie de ejemplos, cada uno de los c uales tiene un
nico error pequeo. Cada error es un ejemplo de un tipo de error que a menudo cometemos:

//sin #include aqu


int main ()
{
cout << "Hola, mundo! \ n";
return 0;
}

No se incluimos algo para decirle al compilador que era cout, por lo que el compilador se queja.
Para corregir esto, vamos a aadir un archivo de cabecera:

# include "std_facilities.h" int main ()

{
cout << "Hola, mundo! \ n";
return 0;
}
Lamentablemente, el compilador se queja de nuevo: Hemos escrito mal std_lib_facilities.h. El
compilador tambin se opone a esto:

# include "std_lib_facilities.h" int main ()

{
cout << "Hola, mundo \ n;!
return 0;
}

No terminamos la cadena con una ". El compilador tambin se opone a esta:

# include "std_lib_facilities.h"
int main ()
{
cout << "Hola, mundo! \ n";
return 0;
}

La abreviatura int se utiliza en C ++ en lugar de la palabra entero.


Al compilador tampoco le gusta esto:

# include "std_lib_facilities.h" int main ()

{
cout < "Hola, mundo! \ n";
return 0;
}

Nosotros usamos < (El operador menor que) en lugar de <<(El operador de salida).
El compilador tambin se opone a esto:

# include "std_lib_facilities.h" int main ()

{
cout << "Hola, mundo! \ n";
return 0;
}

Se utiliz comillas simples en lugar de comillas dobles para delimitar la cadena. Por ltimo, el
compilador da un error para esto:
# include "std_lib_facilities.h"
int main ()

{
cout << "Hola, mundo \ n"
return 0;
}

Nos olvidamos de poner fin a la instruccin de salida con un punto y coma. Tenga en cuenta que
muchas declaraciones de C ++ estn terminadas por un punto y coma (;). El compilador necesita
los puntos y coma para saber dnde termina una declaracin y comienza el siguiente. No hay
manera realmente corta, totalmente correcta, y no tcnica de resumir donde se necesitan puntos
y comas. Por ahora, slo copia nuestro patrn de uso, que se puede resumir como: "Ponga un
punto y coma despus de cada expresin que no termine con una llave derecha (}).

Por qu pasamos dos pginas de buen espacio y minutos de su valioso tiempo que muestra
ejemplos de errores triviales en un programa trivial? Para hacer el punto que usted - al igual que
todos los programadores - pasar mucho tiempo en busca de errores en el texto fuente del
programa. La mayora de las veces, nos fijamos en el texto con errores en ella. Despus de todo,
si estbamos convencidos de que era algo de cdigo correcto, nos gustara normalmente estar
buscando en algn otro cdigo o tomar el tiempo libre. Fue una gran sorpresa para los primeros
pioneros de la informtica que estaban cometiendo errores y tuvo que dedicar una parte
importante de su tiempo a la bsqueda de ellos. Todava es una sorpresa para la mayora de los
que recin entran a la programacin.

Cuando se programa, a veces tendr situaciones bastante molestas con el compilador.


A veces parece quejarse de detalles sin importancia (por ejemplo, un punto y coma que falta) o
sobre las cosas que usted considera "obviamente, correcto". Sin embargo, el compilador suele ser
correcto: Cuando se da un mensaje de error y se niega a producir el cdigo objeto a partir de su
cdigo fuente, hay algo que no est bien con su programa; es decir, el significado de lo que ha
escrito no est definida con precisin por el C++ estndar.

El compilador no tiene sentido comn (ya que no es humano) y es muy exigente detalles.
Dado que no tiene sentido comn, no le gustara que intentara adivinar que significaba algo
que "pareca estar bien", pero no se ajustan a la definicin de C ++. Si lo hizo y su suposicin
era diferente a la suya, usted podra terminar gastando mucho tiempo tratando de averiguar por
qu el programa no hizo lo que pensaba que haba dicho que hiciera. Cuando todo est dicho y
hecho, el compilador nos salva de una gran cantidad de problemas autos infligidos. Nos salva de
muchos ms problemas de los que causa. As que, por favor, recuerde: el compilador es su amigo;
posiblemente, el compilador es el mejor amigo que se tiene cuando se programa.

2.4 Vinculacin

En general los programas se compone de varias partes separadas, a menudo desarrollado por
diferentes personas. Por ejemplo, el programa "Hola, mundo!" Se compone de la parte que
escribimos ms las partes de la biblioteca de C ++ estndar. Estas piezas separadas (a veces
llamados unidades de traduccin) Debe ser compilado y los archivos de cdigo objeto resultante
debe ser unidos entre s para formar un programa ejecutable. El programa que une dichas partes
se (como era de esperar) llama enlazador:
C ++ cdigo
fuente:
hello_world.cpp

compilador de C
++
El cdigo objeto de la
biblioteca del C ++ estndar:
Cdigo de objeto:
hello_world.obj ostream.obj

enlazador

programa ejecutable:
hello_world.exe

Tenga en cuenta que el cdigo objeto y ejecutables son no portable entre sistemas. Por ejemplo,
cuando se compila para una mquina de Windows, se obtiene el cdigo objeto para Windows que
no se ejecutar en una mquina Linux.
Una biblioteca es simplemente un cdigo -por lo general escrito por otros -que tenemos
acceso utilizando declaraciones encontradas en un archivo #include. Una declaracin es una
instruccin del programa especificando cmo se puede utilizar una pieza de cdigo; vamos a
examinar las declaraciones en detalle ms adelante (por ejemplo, 4.5.2).

Los errores detectados por el compilador se denominan errores de compilacin, los errores
detectados por el enlazador se denominan errores de tiempo de enlace y los errores no encontrados
hasta que se ejecuta el programa se llaman errores en tiempo de ejecucin o errores lgicos. Por
lo general, los errores en tiempo de compilacin son ms fciles de entender y corregir que los
errores de tiempo de enlace y los errores de tiempo de enlace suelen ser ms fciles de encontrar
y corregir que los errores de tiempo de ejecucin y errores lgicos. En el captulo 5 se discuten los
errores y la manera de manejarlos con mayor detalle.

2.5 entornos de programacin

Para programar, utilizamos un lenguaje de programacin. Tambin utilizamos un compilador para


traducir nuestro cdigo fuente en cdigo de objeto y un vinculador para vincular nuestro cdigo
de objeto en un programa ejecutable. Adems, utilizamos algn programa para introducir nuestro
texto de cdigo fuente en la computadora y para editarlo. Estas son slo las primeras y ms
cruciales herramientas que constituyen el conjunto de herramientas de nuestro programador o
"entorno de desarrollo de programas".

Si trabaja desde una ventana de lnea de comandos, como lo hacen muchos programadores
profesionales, tendr que emitir los comandos de compilacin y enlace usted mismo. Si en su lugar
utiliza un IDE ("entorno de desarrollo interactivo" o "entorno de desarrollo integrado"), como
muchos programadores profesionales tambin lo hacen, un simple clic en el botn correcto har
el trabajo. Consulte el Apndice C para obtener una descripcin de cmo compilar y vincular en
su implementacin de C ++.

Los IDE suelen incluir un editor con funciones tiles como codificacin de color para ayudar a
distinguir entre comentarios, palabras clave y otras partes del cdigo fuente del programa, adems
de otras facilidades para ayudarle a depurar su cdigo, compilarlo y ejecutarlo. La depuracin es
la actividad de encontrar errores en un programa y eliminarlos; Usted oir mucho sobre eso a lo
largo del camino.
Al trabajar con este libro, puede utilizar cualquier sistema que proporcione una implementacin
de C ++ actualizada y conforme a las normas. La mayora de lo que decimos ser, con muy
pequeas modificaciones, ser verdad para todas las implementaciones de C ++, y el cdigo se
ejecutar en todas partes. En nuestro trabajo, utilizamos varias implementaciones diferentes.
Desarrollar

Hasta ahora hemos hablado de la programacin, el cdigo y las herramientas (como compiladores).
Ahora usted tiene que conseguir un programa para ejecutar. Este es un punto crucial en este libro
y en aprender a programar. Aqu es donde se empieza a desarrollar habilidades prcticas y
buenos hbitos de programacin. Los ejercicios de este captulo se centra en conseguir
familiarizarse con el entorno de desarrollo de software. Una vez que consiga ejecutar el programa
"Hola, mundo!" , habr pasado el primer hito importante como programador.

El propsito de un ejercicio es establecer o reforzar su programacin prctica habilidades


y darle experiencia con herramientas del entorno de programacin. Por lo general, un taladro es
una secuencia de modificaciones a un solo programa, "creciendo" de algo completamente trivial
a algo que pueda ser una parte til de un programa real. Un conjunto tradicional de ejercicios
est diseada para evaluar su iniciativa, inteligencia, o la inventiva. Por el contrario, un taladro
requiere poca invencin de usted. Por lo general, la secuencia es crucial, y cada paso individual
debe ser fcil (o incluso trivial).

Por favor, no trate de ser inteligente y omita los pasos; en general le har perder tiempo
o incluso confundir.
Usted podra pensar que entiende todo lo que lee y todo lo que su mentor o instructor le dijo, pero
la repeticin y la prctica son necesarios para desarrollar habilidades de programacin.
En este sentido, la programacin es como el atletismo, la msica, la danza, o cualquier arte basado
en habilidades. Imagnese las personas que tratan de competir en cualquiera de esos campos sin
la prctica regular. Ya sabes lo bien que lo haran. La prctica constante - para los profesionales
significa la prctica constante de toda la vida - es la nica manera de desarrollar y mantener
una habilidad prctica de alto nivel.

Por lo tanto, no saltarse los ejercicios, no importa lo tentado que usted est; son ese nciales para
el proceso de aprendizaje. Simplemente comienza con el primer paso y contine, probando cada
paso a medida que avanza para asegurarse de que est haciendo las cosas bien.
No se alarme si no entiende cada detalle de la sintaxis que est utilizando, y no tenga miedo de
pedir ayuda a los instructores o los amigos. Siga adelante, haga todos los ejercicios y muchos
de los ejercicios, y todo se aclarar a su debido tiempo.
As que, aqu est su primer ejercicio:

1. Ir al Apndice C y siga los pasos necesarios para configurar un proyecto. Configurar un


proyecto vaco de consola de C ++ llamado hola_mundo.

2. Escriba hello_world.cpp, Tal y como se especifica a continuacin, gurdelo en su directorio


de practica (carpeta), e incluya en su proyecto hola_mundo.

# include "std_lib_facilities.h"

int main () //los programas en C ++ comienzan mediante la ejecucin de la funcin


{ main

cout << "Hola, mundo \ n"; //salida "Hola, mundo!"


keep_window_open (); //esperar un carcter a introducir
return 0;
}

La llamada a keep_window_open () es necesaria en algunas mquinas Windows para evitar que


cierren la ventana antes de tener la oportunidad de leer la salida. Esta es una peculiaridad /
caracterstica de Windows, no de C ++. Definimos keep_window_open () en std_lib_facilities.h
para simplificar la escritura de programas de texto simples.
Cmo encuentras std_lib_facilities.h? Si ests en un curso, pregntale a tu instructor. Si no,
descargue desde nuestro sitio de soporte www.stroustrup.com/ Programacin. Pero qu pasa si
usted no tiene un instructor y no tiene acceso a la web? En ese caso (slo), reemplace la directiva
# include con

#include <iostream>
#include <string>
#include <vector>
# include <algoritmo>

# include <math>
using namespace std ;
keep_window_open inline void ( ) {char ch; cin >> ch; }

Esto utiliza la biblioteca estndar directamente, te permitir seguir adelante hasta captulo 5, y
se explicar en detalle ms adelante (8.7).
3. Compile y ejecute el programa "Hola, mundo!". Es muy probable que algo no funcione del
todo bien. Rara vez ocurre en un primer intento de usar un nuevo lenguaje de programacin
o un nuevo entorno de programacin.
Encuentre el problema y solucione! Este es un punto en el que pedir ayu da a una persona con
ms experiencia es razonable, pero asegrese de entender lo que se muestran de modo que usted
pueda hacer todo por s mismo antes de seguir adelante.
4. Tras esto, probablemente has encontrado algunos errores y tuvo que corregirlos. Momento de
familiarizarse un poco mejor con las funciones de deteccin de errores e informe de errores su
compilador! Pruebe los seis errores del 2.3 para ver cmo reacciona su entorno de
programacin. Piense en al menos cinco errores ms que haya cometido escribiendo en su
programa (por ejemplo, olvidar keep_window_open (), deje la tecla Caps Lock encendida
mientras escribe una palabra, o escriba una coma en lugar de un punto y coma) y pruebe cada
uno para ver qu pasa cuando intenta compilar y ejecutar esas versiones.

Revisin

La idea bsica de estas preguntas de revisin es para darle la oportunidad de ver si ha


notado y comprendido los puntos clave del captulo. Puede que tenga que remitirse al texto
para responder una pregunta; eso es normal y esperado. Puede que tenga que volver a leer las
secciones enteras; que tambin es normal y esperado. Sin embargo, si tiene que volver a leer
todo el captulo o tiene problemas con cada pregunta de la revisin, usted debe considerar si
su estilo de aprendizaje es eficaz. Ests leyendo demasiado rpido? Debera de detenerse
y hacer algunas de las sugerencias de prueba? Debera de estudiar con un amigo para que
pueda discutir los problemas con las explicaciones en el texto?

1. Cul es el propsito del programa "Hola, mundo!"?


2. Nombre las cuatro partes de una funcin.
3. Nombre una funcin que debe aparecer en cada programa en C ++.
4. En el programa "Hola, mundo!", Cul es el propsito de la lnea return 0;?
5. Cul es el propsito del compilador?
6. Cul es el propsito de la directiva #include?
7. Qu hace una .h sufijo al final de un nombre de archivo significa en C ++?
8. Qu hace el enlazador para su programa?
9. Cul es la diferencia entre un archivo de origen y un archivo de objeto?
10. Qu es una IDE y qu hace para usted?
11. Si usted entiende todo en el texto del libro, por qu es necesario prcticar?

La mayora de las preguntas de revisin tienen una respuesta clara en el captulo en el que
aparecen. Sin embargo, de vez en cuando incluimos preguntas para recordarle la informacin
relevante de otros captulos y a veces incluso relacionados con el mundo fuera de este libro.
Consideramos que justo; hay ms para escribir un buen software y pensar en las implicaciones
de su hacerlo que encaja en un captulo o libro individual.
Condiciones

Estos trminos presentan el vocabulario bsico de la programacin y de C ++. Si usted quiere


entender lo que dice la gente sobre temas de programacin y articular tus propias ideas, debes
saber qu significa cada uno.

// Ejecutable main ( )
<< Funcin cdigo de objeto C ++
encabezamiento salida comentario IDE
programa
Compilador #include cdigo fuente

error en tiempo de compilacin


cout enlazador

Es posible que desee desarrollar gradualmente un glosario escrito con sus propias palabras.
Puede hacerlo repitiendo el ejercicios 5 a continuacin para cada captulo.

Ejercicios

Tenemos una lista de ejercicios por separado; Siempre complete el ejercicio del captulo antes
de intentar un ejercicio. Si lo hace, le ahorrar tiempo.

1. Cambiar el programa de salida de las dos lneas

Hola, programacin! Aqu vamos!


2. Ampliando lo que ha aprendido, escriba un programa que enumera las instrucciones para
que un ordenador encuentre el bao del cuarto de arriba, discutido en 2.1.
Puede usted pensar en ms pasos que una persona podra asumir, pero que un ordenador no
lo hara? Agrgalos a su lista. Este es un buen comienzo en "pensar como una
computadora." Advertencia: Para la mayora de la gente, "ir al bao" es una instruccin
perfectamente adecuada. Para alguien que no tiene experiencia con casas, cuartos o baos
(imagine a una persona de la edad de piedra, de alguna manera transportado a su comedo r) la
lista de instrucciones necesarias podra ser muy larga. Por favor, no use ms de una pgina.
Para el beneficio del lector, puede aadir una breve descripcin del diseo de la casa que
ests imaginando.

3. Escriba una descripcin de cmo llegar desde la puerta de su habitacin, apartamento, casa,
lo que sea, a la puerta de su saln de clases (suponiendo que asiste a alguna escuela; si no es
as, elija otro objetivo). Haga que un amigo intente seguir las instrucciones y anotarlas con
mejoras a medida que avanza. Para mantener a los amigos, puede ser una buena idea "probar
en el campo" esas instrucciones antes de drsela a un amigo.

4. Encuentre un buen libro de cocina. Lea las instrucciones para hornear los molletes de
arndanos (si se encuentra en un pas donde los "molletes de arndanos" son un plato extraa
y extico, utilice un plato ms familiar en su lugar). Tenga en cuenta que con un poco de
ayuda e instruccin, la mayora de las personas en el mundo pueden hornear deliciosos
molletes de arndanos. No se considera avanzado o difcil cocinar bien. Sin embargo, para
el autor, pocos ejercicios de este libro son tan difciles como ste. Es increble lo que se
puede hacer con un poco de prctica.

Vuelva a escribir esas instrucciones para que cada accin individual se encuentren en
su propio prrafo numerado. Tenga cuidado para enumerar todos los ingredientes y
todos los utensilios de cocina que se usan en cada paso. Sea cuidadoso con los detalles
cruciales, tales como la temperatura deseada del horno, el pre calentamiento del horno,
la preparacin de la cacerola, la forma de cocinar, y la necesidad de proteger sus manos
al retirar las muflas del horno.
Considere estas instrucciones desde el punto de vista de un novato en cocina (si
no eres uno, obtener ayuda de un amigo que no sabe cmo cocinar). Complete los pasos
que el autor del libro (casi con toda seguridad un cocinero experimentado) ha omitido
por ser obvia.
Construir un glosario de trminos utilizados. (Qu es una bandeja de Muffin? Qu
hace el pre -calentamiento? Qu quiere decir "horno"?)
A continuacin, hornee unos Muffins y disfrute de sus resultados.

5. Escriba una definicin para cada uno de los trminos de "Condiciones". En primer lugar
trate de ver si puede hacerlo sin mirar el captulo (no es probable), y luego mire a travs del
captulo para encontrar definiciones. Usted puede encontrar interesante la diferencia entre
su primer intento y la versin del libro. Es posible consultar algn glosario en lnea
adecuado, tal como www.stroustrup.com/glossary.html. Al escribir su propia definicin
antes de buscarla, usted refuerza el aprendizaje que logro a travs de su lectura. Si tiene
que volver a leer una seccin para formar una definicin, eso simplemente le ayuda a
comprender. No dude en utilizar sus propias palabras para las definiciones, y haga que las
definiciones sean detallan como crea razonable. A menudo, un ejemplo despus de la
definicin principal ser til. Es posible que desee almacenar las definiciones en un archivo
de forma que pueda aadir los mismos desde las secciones "Trminos" de los captulos
posteriores.

Posdata

Qu es tan importante acerca del programa "Hola, mundo!"? Su objetivo es conseguir


que nos familiaricemos con las herramientas bsicas de programacin. Tenemos la tendencia
de hacer un ejemplo muy simple, como "Hola, mundo!", cada vez que nos acercamos a una nueva
herramienta. De esta manera, separamos nuestro aprendizaje en dos partes: en primer lugar
aprendemos los fundamentos de nuestras herramientas con un programa trivial, y luego
aprendemos sobre los programas ms complicados sin distraernos con nuestras herramientas. El
aprendizaje de las herramientas y el lenguaje simultneamente es mucho ms difcil que el primero
y luego el otro. Este enfoque para simplificar el aprendizaje de una tarea compleja dividindola
en una serie de pasos pequeos (y ms manejables) no se limita a la programacin y las
computadoras. Es comn y til en la mayora de mbitos de la vida, especialmente en aquellas que
implican una habilidad prctica.
3

Objetos, tipos y valores

"La fortuna favorece a la mente preparada."

-Luis Pasteur

Este captulo presenta los conceptos bsicos de


almacenamiento y uso de datos en un programa.
Para ello, en primer lugar nos concentramos en la
lectura de los datos desde el teclado. Despus de
establecer las nociones fundamentales de objetos,
tipos, valores y variables, introducimos varios
operadores y damos muchos ejemplos de uso de
variables de tipos char, int, double y string.
3.1 Entrada 3.6 operadores de asignacin compuestos
3.2 Variables 3.6.1 Un ejemplo: encontrar palabras repetidas
3.3 Entrada y tipo 3.7 Nombres
3.4 Operaciones y operadores 3.8 Tipos y objetos
3.5 Asignacin e inicializacin
3.9 Tipo de seguridad
3.5.1 Un ejemplo: detectar palabras repetidas 3.9.1 conversiones seguras
3.9.2 conversiones inseguras

3.1 entrada

El programa "Hola, mundo!" Simplemente escribe en la pantalla. Se produce una salida. No lee
nada; no recibe el aporte de su usuario, eso es bastante aburrido. Los programas reales tienden a
producir resultados basados en alguna entrada que les damos, en lugar de hacer exactamente
lo mismo cada vez que los ejecutamos.
Para leer algo, necesitamos un lugar para leer; es decir, necesitamos un lugar en la
memoria de la computadora para colocar lo que leemos. Llamamos a ese "lugar" un objeto. Un
objeto es una regin de memoria con un tipo que especifica qu tipo de informacin se puede
colocar en ella. Un objeto llamado se denomina variable. Por ejemplo, las cadenas de caracteres
se ponen en variables de string y los nmeros enteros se ponen en variable int.
Se puede pensar en un objeto como una "caja" en la que se puede poner un valor del tipo del
objeto:

int:
Aos: 42

Esto representara un objeto de tipo int llamado edad que contiene el valor entero 42. Usando una
variable de cadena, podemos leer una cadena de entrada y escribirlo de nuevo como esto:

//leer y escribir un nombre de pila


# include "std_lib_facilities.h"

int main ()
{
cout << "Por favor, introduzca su nombre de pila (seguido de" Entrada "): \ n";

string nombre apellido; //nombre apellido es una variable de tipo cadena

cin >> nombre apellido; //leer los caracteres en nombre apellido


cout << "Hola," << nombre apellido <<"! \ n";
}

El #include y el main() son familiares del Captulo 2. Dado que el # include es necesario para
todos nuestros programas (hasta el captulo 12), lo dejaremos fuera de nuestra presentacin para
evitar distracciones. Del mismo modo, a veces presentaremos un cdigo que slo funcionar si se
coloca
en main() o alguna otra funcin, como este:

cout << "Por favor, introduzca su nombre de pila (seguido de" Entrada "): \ n";
Asumimos que usted puede calcular hacia fuera cmo poner tal cdigo en un programa completo
para probar.
La primera lnea de main () simplemente escribe un mensaje alentando al usuario a ingresar un
nombre. Normalmente, un mensaje de este tipo se llama "aviso" porque solicita al usuario que
realice una accin. Las lneas siguientes definen una variable del tipo cadena llamada first_name,
leen la entrada del teclado en esa variable y escriben un saludo. Veamos las tres lneas a su vez:

string nombre apellido; //nombre apellido es una variable de tipo cadena

Esto deja a un lado un rea de memoria para mantener una cadena de caracteres y le da el nombre
nombre de pila:

String:
Nombre de pila:

Una declaracin que introduce un nuevo nombre en un programa y reserva una memoria para una
variable se denomina definicin.
La siguiente lnea lee caracteres de la entrada (el teclado) en esa variable:

cin >> nombre apellido; //lee los caracteres en nombre apellido

El nombre cin se refiere a la secuencia de entrada estndar (que se pronuncia "see-in" para
"entrada de caracteres") definido en la biblioteca estndar. El segundo operando del operador
>> ("get from") especifica dnde va esa entrada. As, si escribimos algn nombre, digamos
Nicholas, seguido por una nueva lnea, la cadena "Nicholas" se convierte en el valor de nombre
de pila:

string:
nombre de pila :Nicholas

La nueva lnea es necesaria para llamar la atencin de la mquina. Hasta que se introduce una
nueva lnea (Se pulsa la tecla Enter), el ordenador simplemente recoge caracteres. Ese "retraso"
te da la oportunidad de cambiar de opinin, borrar algunos caracteres, y reemplazarlos con otros
antes de oprimir la tecla Enter.

La nueva lnea no ser parte de la cadena almacenada en la memoria.

Despus de haber conseguido la cadena de entrada en nombre de pila, Podemos usarlo:

cout << "Hola," <<nombre de pila <<"!/n";

Esto imprimir Hola, seguido por Nicholas (El valor de nombre de pila) seguido de! y una nueva
de lnea ('\n') en la pantalla:

Hola, Nicholas!

Si nos hubiera gustado repetir y escribir adicionalmente, podramos haber escrito tres
declaraciones de salida separados en su lugar:

cout << "Hola";


cout << nombre apellido;
cout << "\ n";
Sin embargo, somos mecangrafos indiferentes, y lo que es ms importante nos gusta mucho la
repeticin innecesaria (porque la repeticin ofrece la posibilidad de errores), por lo que
combinamos esas tres operaciones de salida en una sola declaracin.
Observe la forma en que usamos comillas alrededor de los caracteres en " Hola," pero no en
nombre de pila. Nosotros usamos comillas cuando queremos una cadena literal. Cuando no
citamos, nos referimos al valor de algo con un nombre. Considerar:

cout << "nombre de pila" << "es" << nombre de pila;

Aqu, "nombre de pila" nos da los diez caracteres nombre de pila y el llano nombre de pila nos
da el valor de la variable nombre de pila, en este caso, Nicholas. As, obtenemos

Nombre de pila es Nicholas

3.2 Variables

Bsicamente, no podemos hacer nada de inters con un ordenador sin almacenar datos en la
memoria, como lo hicimos con la cadena de entrada en el ejemplo anterior. Los "lugares" en
los que almacenamos datos se denominan objetos. Para tener acceso a un objeto necesitamos un
nombre. Un objeto llamado se denomina variable y tiene un tipo especfico (como int o string)
Que determina lo que se puede poner en el objeto (por ejemplo, 123 puede entrar en una int y
"Hola, mundo! \ n" puede entrar en un string) Y que operaciones se pueden aplicar (Por
ejemplo, podemos multiplicar ints usando el operador * y comparar cadenas usando el operador
<=). Los elementos de datos que ponemos en las variables se
denominan valores. Una declaracin que define una variable se (como era de esperar) llama
definicin y una definicin puede (y por lo general debe) dar un valor inicial. Considerar:

string Nombre =
"Annemarie";
int Numero de pasos
= 39;

Puede visualizar estas variables como la siguiente:

int: string:
Numero de pasos : 39 Nombre: Ana Mara

No se puede poner los valores del tipo incorrecto en una variable:

string nombre2 = 39; //error: 39 no es una cadena


int numero de pasos = "Annemarie"; //error: "Annemarie" no es un int

El compilador recuerda el tipo de cada variable y se asegura de que usted lo usa de acuerdo con
su tipo, tal como se especifica en su definicin.

C ++ proporciona un nmero bastante grande de tipos (vase A.8). Sin embargo, se puede
escribir perfectamente buenos programas usando slo cinco de las cuales son:

int number_of_steps = 39; //int para los nmeros enteros


double flying_time = 3,5; //double para los nmeros de punto flotante
Char decimal_point = '.'; //Char para caracteres
individuales string name = "Annemarie"; //cadena para
cadenas de caracteres bool tap_on = true;
//bool para las variables lgicas
La razn del nombre double es histrica: double es la abreviatura de "doble precisin, punto
flotante." Punto flotante es la aproximacin de la computadora al concepto matemtico de un
nmero real.
Tenga en cuenta que cada uno de estos tipos tiene su propio estilo caracterstico de literales:

39 // int: un entero
3.5 // doble: un nmero de coma flotante
'.' // Char: un carcter individual entre comillas simples
"Ana Mara" // string: una secuencia de caracteres delimitada por comillas dobles
True // bool: verdadero o falso

Es decir, una secuencia de dgitos (como es 1234, 2 o 976) denota un nmero entero, un solo
carcter en comillas simples (como es 1 , @ , o x ) denota un carcter, una secuencia
de dgitos con un punto decimal (como, 1.234, 0.12 o .98) Denota un valor de coma flotante, y
una secuencia de caracteres encerrados entre comillas dobles (por ejemplo, "1234", "Hola!" o
"Ana Mara") Denota una cadena. Para una descripcin detallada de los literales vase A.2.

3.3 de l a entrada y el tipo

La operacin de entrada >> ("get from") es sensible al tipo; es decir, se lee de acuerdo con el tipo
de variable que le ley. Por ejemplo:

// Leer el nombre y la edad


int main ( )
{
cout << "Por favor, introduzca su nombre y edad \ n";
string nombre de pila; //variable de cadena
int edad; // variable entera
cin >> nombre de pila; // leer una cadena
cin >> edad; // leer un nmero entero
cout << "Hola," nombre de pila << << "(edad" <<edad<< ") \ n";
}

Por lo tanto, si escribes Carlos 22 el operador >> leer Carlos en nombre de pila, 22 en edad, y
producir este resultado:

Hola, Carlos (22 aos)

Por qu no lee (todos) Carlos 22 dentro nombre de pila? Debido a que, por convencin, la lectura
de cadenas se terminada por lo que se llama espacios en blanco, es decir, espacio, nueva lnea y
caracteres de tabulacin. De lo contrario, los espacios en blanco por defecto es ignorado por >>.
Por ejemplo, se puede aadir tantos espacios como desee antes de un nmero para ser ledo; >>
simplemente pasara por delante de ellos y leer el nmero.

Si escribes 22 Carlos Carlos, vers algo que podra sorprender hasta que pienses en ello. El 22 se
leer en nombre apellido porque, despus de todo, 22 es una secuencia de caracteres. Por otro lado,
Carlos no es un entero, por lo que no se lee. La salida ser 22 seguido por (edad seguida por 0
(pre-2011 ISO C ++ implementaciones estndar podra dar un nmero al azar, como -96739). Por
qu? No dio a la edad un valor inicial y no tuvo xito en Leyendo un valor en l. Por lo tanto,
obtiene cualquier valor que el operador de entrada >> proporciona En el 10.6, miramos maneras
de manejar "errores de formato de entrada." Por ahora, vamos a slo inicializar la eda d para que
obtengamos un valor predecible si La entrada falla:
// Leer el nombre y la edad (2da versin)
int main ()
{
cout << "Por favor, introduzca su nombre y edad \ n";

string nombre de pila = "???"; // variable de cadena


// ( "???" Significa "no s el nombre")
int edad = 0; //variable entera (0 significa "no s la edad")
cin >>nombre de pila >> edad; // leer una cadena seguida de un nmero entero
cout << "Hola," << nombre apellido << "(edad" << edad << ") \ n";
}

Ahora la entrada emitir Carlos 22

Hola, 22 (edad 0)

Tenga en cuenta que podemos leer varios valores en una sola instruccin de entrada, as como
podemos escribir varios valores en una sola sentencia de salida. Tenga en cuenta tambin que <<
es sensible al tipo, as como >> es, por lo que podemos dar salida a la edad de la variable int as
como como el nombre de la variable de cadena y los literales de cadena "Hello" y "(age" y ") \ n"
.
Una cadena leda usando >> es (por defecto) terminada por espacios en blanco; Es decir, lee una
sola palabra. Pero a veces, queremos leer ms de una palabra. Por supuesto, hay muchas maneras
de hacer esto. Por ejemplo, podemos leer un nombre que consta de dos palabras como esta:

int main ()
{
cout << "Por favor, introduzca su nombre y el apellido \ n";
string primera ;
string secunda;
cin >> first >> second; // leer dos cadenas
cout << "Hola," << primera << "" << segunda << '\ n';
}

Simplemente utilizamos >>dos veces, una para cada nombre. Cuando queremos escribir los
nombres en la salida, hay que insertar un espacio entre ellos.

P R U E B A ESTO

Obtener el ejemplo "nombre y la edad" para ejecutar. A continuacin, modifquelo para escribir la
edad en meses: lea la entrada en aos y multiplicar (utilizando el operador *) por 12.
Lea la edad en una double para permitir a los nios puedan estar muy orgulloso de tener cinco
aos y medio de edad en lugar de slo cinco.
3.4 Operaciones y operadores

Adems de especificar qu valores se pueden almacenar en una variable, el tipo de una variable
determina qu operaciones podemos aplicar a la misma y lo que significan. Por ejemplo:

int count;

cin >>c o u n t ; // >> Lee un nmero entero en el recuento

string
nombre;

cin >>Nombre; // >> Lee una cadena en nombre

int c2 = count + 2; // + Aade enteros


string s2 = nombre + "Jr."; // + Anexa caracteres

int c3 = count-2; // -resta nmeros enteros


string s3 = nombre - "Jr."; // error: -no est definido para las cadenas

Por "error" nos referimos a que el compilador rechazar un programa tratando de restar cadenas.
El compilador sabe exactamente qu operaciones se pueden aplicar a cada variable y por lo tanto
pueden evitar muchos errores. Sin embargo, el compilador no sabe qu operaciones tiene sentido
para usted para que valores, por lo que aceptar felizmente las operaciones legales que producen
resultados que pueden parecer absurdo usted. Por ejemplo:

int edad = -100;

Puede ser obvio para usted que no se puede tener una edad negativa (por qu no?), Pero nadie le
dijo al compilador, por lo que va a producir cdigo para esa definicin.

Esta es la tabla de operadores tiles para algunos tipos comunes y tiles:

bool char int double string

asignacin = = = = =
adicin + +
concatenacin +
sustraccin - -
multiplicacin * *
divisin / /
resto (mdulo) %
Valor mnimo por 1 ++ ++
disminuir en 1 - -
Valor mnimo de n +- = n +- = n
bool char int double string

Aadir al final +
decremento por n -= n -= n =
multiplicarse y *= *=
asignar
dividir y asignar /= /=
resto y asignar %
leer desde s dentro x s >> x s >> x = x
s >> s >> x s >> x
escribir x a s s << x s << x s << x s << x s << x
es igual == == == == ==
no es igual != != != != !=
mayor que > > > > >
mayor o igual >= > > > >
menor que < =
< =
< =
< =
<
menor o igual <= <= <= <= <=

Un cuadrado blanco indica que una operacin no est directamente disponible para un tipo (aunque
puede haber formas indirectas de la utilizacin de esa operacin; vase 3.9.1). Vamos a explicar
estas operaciones, y ms, a medida que avanzamos. Los puntos clave aqu son que hay una gran
cantidad de operadores tiles y que su significado tiende a ser la misma para tipos similares.

Vamos a probar un ejemplo relacionado con los nmeros de punto flotante:

// programa sencillo para ejercer los operadores


int main ()
{
cout << "Por favor, introduzca un valor de punto flotante:";
double n;
cin >> n;
cout << "n ==" << n
<< "\ nn + 1 ==" << n + 1
<< "\ n tres tiempos n ==" << 3 * n
<< "\ n dos veces n ==" << n + n
<< "\ nn cuadrado == " << n * n
<< "\ n mitad de n == "<< n / 2
<<" \ n raz cuadrada de n == "<< sqrt (n)
<< '\ n'; // nombre para nueva lnea ( fin de lnea") de la produccin
}

Obviamente, las operaciones aritmticas habituales tienen su significado y notacin usuales como
las conocemos desde la escuela primaria. Naturalmente, no todo lo que se quiere para hacer a un
nmero de coma flotante, como la toma de su raz cuadrada, est disponible como un operador.

Muchas operaciones se representan como funciones con nombre. En este caso, utilizamos sqrt ()
de la librera estndar para obtener la raz cuadrada de n: sqrt (n). La notacin es familiar en las
matemticas. Vamos a utilizar las funciones a lo largo del camino y las discutiremos en detalle en
4.5 y 8.5.
PRUEBA ESTO
T

Haga que este pequeo programa se ejecute. A continuacin, modifquelo para leer un int en lugar
de un double. Tenga en cuenta que sqrt ( ) no est definido para un int as asignar n a un double y
tomar sqrt () de eso. Adems, "ejercer" algunas otras operaciones. Tenga en cuenta que para ints /
es divisin entera y % es restante (mdulo), de modo que 5/2 es 2 (y no 2.5 o 3) y 5% 2 es 1. Las
definiciones de entero *, / y % garantizan que para Dos entradas positivas a y b tenemos a / b * b
+ a% b == a

Las cadenas tienen un menor nmero de operadores, pero como veremos en el captulo 23, tienen
un montn de operaciones con nombre. Sin embargo, los operadores que tienen pueden ser
utilizados convencionalmente. Por ejemplo:

// Leer primero y segundo nombre


int main ()
{

cout << "Por favor, introduzca su nombre y el apellido \ n";


string primero;
string segundo;
cin >>primero >> segundo; // leer dos cadenas
string nombre = primer + ' ' + segundo; // concatenar cadenas
cout << "Hola," << nombre << '\ n';
}

Para strings + significa concatenacin; Es decir, cuando s1 y s2 son cadenas, s1 + s2 es una cadena
donde los caracteres de s1 son seguidos por los caracteres de s2. Por ejemplo, si s1 tiene el valor
"Hola" y s2 el valor "Mundo", entonces s1 + s2 tendr el valor "Hola Mundo". La comparacin de
cadenas es particularmente til:

// Leer y comparar nombres


int main ()
{
cout << "Por favor, introduzca dos nombres \ n";
string primero;
string segundo;
cin >> primero >>segundo; // leer dos cadenas
if (primero ==segundo)
cout << "que es el mismo nombre dos veces \ n";
if (primero <segundo)
cout << primero << "es alfabticamente antes" << segundo << '\ n';
if (primero > segundo)
cout << primero << "es alfabticamente despus de" << segunda << '\ n';

Aqu se utiliz una instruccin if, que se explicar en detalle en el 4.4.1.1, para seleccionar
acciones basadas en condiciones.

3.5 Asignacin y la inicializacin

En muchos sentidos, el operador ms interesante es la asignacin, representado como =. Da una


variable de un nuevo valor. Por ejemplo:
int a = 3; //una comienza con el valor 3

a: 3

a = 4; // una obtiene el valor 4 ( se convierte en 4")

a: 4

int b = a; // b comienza con una copia del valor de una (es decir, 4)

a: 4

b: 4

b = a + 5; // b obtiene el valor a + 5 (es decir, 9)

a: 4

b: 9

a = a + 7; // A obtiene el valor a + 7 (es decir, 11)

a: 11

b: 9

Esa ltima asignacin merece una atencin. En primer lugar, demuestra claramente que = no significa igual
a claramente, a no es igual a + 7. Significa asignacin, es decir, colocar un nuevo valor en una variable. Lo
que se hace para a = a + 7 es el siguiente:

1. En primer lugar, obtenga el valor de a, que es el entero 4


2. A continuacin, aadir 7 a 4, dando el nmero entero 11.
3. Por ltimo, ponga ese 11 en a

La variable vaca. Por otro lado, una asignacin (en principio) debe borrar el valor anterior de la
variable antes de poner el nuevo valor. Usted puede pensar en la variable como una especie de caja
pequea y el valor como una cosa concreta, como una moneda, que usted pone en ella. Antes de la
inicializacin, la caja est vaca, pero despus de la inicializacin siempre tiene una moneda de modo
que para poner una nueva moneda en, usted (es decir, el operador de asignacin) primero tiene que
quitar el antiguo ("destruir el valor antiguo"). Las cosas no son tan literales en la memoria de la
computadora, pero no es una mala manera de pensar en lo que est pasando.

3.5.1 Un ejemplo: detectar palabras repetidas


La asignacin es necesaria cuando queremos poner un nuevo valor en un objeto. Cuando piensas en
ello, es obvio que la asignacin es ms til cuando haces cosas muchas veces. Necesitamos una
asignacin cuando queremos hacer algo de nuevo con un valor diferente. Echemos un vistazo a un
pequeo programa que detecta palabras repetidas adyacentes en una secuencia de palabras. Este
cdigo es parte de la mayora de los correctores de gramtica:

int main ( )
{
string anterior = ""; // palabra anterior; inicializado a "ni una palabra"
string actual; // palabra actual
while (cin >> actual) { // leer una secuencia de palabras
if (actual == anterior) // comprobar si la palabra es el mismo que la ltima
cout << "palabra repetida:" << actual << '\ n';
anterior = actual;

}
}
Este programa no es el ms til ya que no dice dnde ocurri la palabra repetida en el texto, pero
lo har por ahora. Examinaremos este programa lnea por lnea a partir de

string actual; // palabra actual

Esta es la variable de cadena en la que inmediatamente leemos la palabra actual (es decir, ms
recientemente leda) usando

while (cin >> actual)

Esta construccin, llamada declaracin while, es interesante por derecho propio, y lo examinaremos ms
adelante en 4.4.2.1. El while dice que la instruccin despus (cin >> actual) se repetir siempre que la
operacin de entrada cin >> actual tenga xito, y cin >> actual tendr xito siempre que haya caracteres
para leer en la entrada estndar. Recuerde que para una cadena, >> lee palabras separadas por
espacios en blanco.
Finaliza este bucle dando al programa un carcter de fin de entrada (normalmente denominado como
fin de archivo). En una mquina Windows, que es Ctrl + Z (Control y Z presionados juntos), seguido
de un Enter (retorno). En una mquina Unix o Linux que es Ctrl + D (Control y D presionados
juntos).

Por lo tanto, lo que hacemos es leer una palabra en actual y luego compararla con la palabra anterior
(almacenada en la anterior). Si son iguales, lo decimos as:

if (actual == anterior) // comprobar si la palabra es el mismo que la ltima


cout << "palabra repetida:" << actual << '\ n';

Entonces tenemos que estar listos para hacer esto de nuevo para la siguiente palabra. Lo hacemos
copiando la palabra actual en anterior:

anterior = actual;

Este maneja todos los casos siempre que podamos empezar. Qu debe hacer este cdigo para la primera
palabra en la que no tenemos una palabra previa para comparar? Este problema se trata con la definicin
de anterior:

string anterior = ""; // palabra anterior; inicializado a "ni una palabra"

El "" contiene slo un solo carcter (el carcter de espacio, el que obtenemos pulsando la barra de espacio
en nuestro teclado). El operador de entrada >> omite espacios en blanco,
As que no podramos leer eso de entrada. Por lo tanto, la primera vez mientras que la declaracin, la
prueba
if (actual == anterior)

Falla (como queremos).


Una forma de entender el flujo del programa es "jugar al ordenador", es decir, seguir la lnea del programa
para la lnea, haciendo lo que especifica. Simplemente dibuje las cajas en un pedazo de papel y escriba sus
valores en ellas. Cambie los valores almacenados segn lo especificado por el programa.

PRUEBA ESTO
T

Ejecute este programa usted mismo usando un trozo de papel. Utilice la entrada El gato gato salt. Incluso
los programadores experimentados utilizan esta tcnica para visualizar las acciones de pequeas secciones de
cdigo que de alguna manera no parecen completamente obvias.
PRUEBA ESTO

Obtenga el "programa de deteccin de palabras repetidas" para ejecutarlo. Prueba con la oracin
Ella se ri l l l porque lo que hizo no pareca muy bueno muy bueno. Cuntas palabras
repetidas haba? Por qu? Cul es la definicin de palabra utilizada aqu? Cul es la definicin
de palabra repetida? (Por ejemplo, Ella Ella es una repeticin?)

3.6 operadores de asignacin compuestos

Incrementar una variable (es decir, aadir 1 a ella) es tan comn en los programas que C ++
proporciona una sintaxis especial para ella. Por ejemplo:

++ counter
Medio
counter = counter + 1

Hay muchas otras formas comunes de cambiar el valor de una variable en funcin de su valor actual.
Por ejemplo, podramos aadir 7 a ella, restar 9, o multiplicarla por 2. Tales operaciones tambin son
apoyadas directamente por C ++. Por ejemplo:

a + = 7; //significa a = a + 7
b - = 9; //significa b = b-9
c * = 2; //significa c = c * 2

En general, para cualquier operarador binario oper, a = b significa a = a oper b (A.5).


Para empezar, esa regla nos da operadores + =, - =, * =, / = y% =. Esto proporciona una notacin
agradablemente compacta que refleja directamente nuestras ideas. Por ejemplo, en muchos los
dominios de aplicacin * = y / = se denominan "escala".

3.6.1 Un ejemplo: encontrar palabras repetidas


Consideremos el ejemplo de la deteccin de palabras adyacentes repetidas anteriormente. Podramos
mejorarlo dando una idea de dnde estaba la palabra repetida en la secuencia. Una simple variacin de esa idea
simplemente cuenta las palabras y las salidas de la cuenta para la palabra repetida:

int main ()

int numero de plabras = 0;


string anterior = ; // ni una palabra
string actual;
while (cin >> actual) {

++ nmero de palabras; // aumentar el recuento de palabras


if (actual == anterior)
cout << "de palabras numricas" << nmero de plabras
<< "Repetida:" << actual << '\ n';
Actual = anterior;

}
}
Comenzamos nuestro contador de palabras en 0. Cada vez que vemos una palabra, incrementamos
ese contador:

++ nmero de palabras;

De esta manera, la primera palabra se convierte en nmero 1, el siguiente nmero 2, y as


sucesivamente. Nos podramos haber logrado el mismo diciendo

Numero de plabras + = 1;

O inclusive

Numero de palabras = numero de plabras + 1;

pero ++ nmero de palabras es ms corto y expresa la idea de incrementar directamente.


Tenga en cuenta la similitud de este programa es el de 3.5.1. Obviamente, slo tom el programa
desde 3.5.1 y modificado un poco para servir a nuestro nuevo propsito. Esa es una tcnica muy
comn: cuando tenemos que resolver un problema, buscamos un problema similar y usar nuestra
solucin para que con una modificacin adecuada. No empezar de cero a menos que realmente tenga
que hacerlo. Utilizando una versin anterior de un programa como base para la modificacin menudo
ahorra mucho tiempo, y que se benefician de la mayor parte del esfuerzo que en el programa original.

3.7 Nombres

Nombramos nuestras variables para que se los recuerda y se refieren a los mismos desde otras partes de un
programa. Qu puede ser un nombre en C ++? En un programa en C ++, un nombre comienza con una
letra y contiene slo letras, dgitos y guiones bajos. Por ejemplo:

x
Nmero de elementos
Transformada de Fourier

z2 Polgono

Los siguientes no son nombres:

2x // un nombre debe comenzar con


una letra tiempo $ a $ mercado // $ No es una carta,
nmero o un guin
Menu de inicio // el espacio no es una carta, nmero o un
guin

Cuando decimos "no nombres," queremos decir que un compilador de C ++ no los aceptar como
nombres.
Si se lee el cdigo del sistema o cdigo generado por mquina, es posible que vea los nombres a partir
de guiones, tales como _foo. Nunca escriba los mismos; tales nombres estn reservadas a las entidades
de aplicacin y del sistema. Al evitar comprender que conduce partituras, nunca se encontrarn sus
nombres que chocan con algn nombre que ha generado la implementacin.
Los nombres son maysculas y minsculas; es decir, letras maysculas y minsculas son distintas, por
lo que x y X son diferentes nombres. Este pequeo programa tiene por lo menos cuatro errores:

# include "std_lib_facilities.h"

int main ()
{
Strings = "Adis, mundo cruel!";
cout << S << '\ n';

}
Por lo general no es una buena idea para definir los nombres que se diferencian slo en el caso de una
carcter, como uno y uno ; que no va a confundir a un compilador, pero puede fcilmente confundir a
un programador.

PRUEBA ESTO
T

Compilar el "Adis! Mundo cruel" programa y examina los mensajes de errores. El compilador encontr todos
los errores? Qu le sugiere para dichos problemas? El compilador se confunde y diagnostica ms de cuatro
errores? Retire los errores uno por uno, empezando por el primer lxico, y ver cmo los mensajes de error
cambian (y mejoran).

Hay muchas reservas del lenguaje C++ (alrededor de 85) nombres como "palabras clave". Se
mencionan en los A.3.1. No se puede utilizar para nombrar los variables, tipos, funciones, etc. Por
ejemplo:

int if = 7; // de error: si es una palabra clave

Se pueden utilizar nombres de las instalaciones de la biblioteca estndar, tales como string, pero no
debera. La reutilizacin de un nombre tan comn causar problemas si alguna vez que desee utilizar
la biblioteca estndar:

int string = 7; //esto dar lugar a problemas

Cuando se elige nombres para sus variables, funciones, tipos, etc., es decir, elegir nombres que
ayudarn a la gente a entender el programa. Incluso tendr problemas para comprender lo que se supone
que el programa debe hacer si usted ha nombrado con las variables con "fcil de escribir" como
nombres x1, x2, s3, y p7. Abreviaturas y acrnimos que pueden confundir a la gente, por lo que h a y
q u e usarlos con moderacin. Estas siglas son evidentes para nosotros cuando escribimos, pero
seguro que tendr problemas con al menos uno:

mtbfT
LAmy
wNBV

Es de eperarse que dentro de unos meses, tambin tendremos problemas con al menos uno.
Los nombres cortos, tales como x , y i , son significativos cuando se usa convencionalmente; es
decir, x debe ser una variable local o un parmetro (ver 4.5 y 8.4) y debera estar en un ndice de
bucle (vase 4.4.2.3).
No utilice nombres excesivamente largos; que son difciles de tipo, marca lneas tanto tiempo que
no caben en una pantalla, y son difciles de leer rpidamente. Estos estn probablemente bien:

partial_sum
element_count
stable_partition

Estos son probablemente demasiado largos:

the_number_of_elements
remaining_free_slots_in_symbol_table

Nuestro "estilo de la casa" es el uso de guiones para separar las palabras en un identificador, tal
como element_count, en lugar de alternativas, como elementCount y element-ocunt. Nunca
usamos nombres con letras maysculas, como ALL_CAPITAL_LETTERS,
porque eso convencionalmente reservados para macros (27.8 y A.17.2), que nos
evitamos. Nosotros usamos una letra mayscula inicial para este tipo definimos, como raz
cuadrada y Grfico.
El lenguaje C ++ y la biblioteca estndar no utilizan el estilo de letra mayscula inicial, por lo que
es int en lugar de Int y string en lugar de String. Por lo tanto, nuestra convencin ayuda para
minimizar la confusin entre nuestros tipos y las estndar.
Evitar nombres que son fciles de escribir mal, leer mal, o confundir. Por ejemplo:

Nombre nombres nombre


foo f00 s
Fl
f1 fI fi

Los caracteres 0(cero), o (en minsculas O), O (maysculas o), 1 (uno), I (maysculas i, y l (en
minsculas L) Son particularmente propensos a causar problemas.

3.8 Tipos y objetos

La nocin de tipo es fundamental para C ++ y otros lenguajes de programacin. Vamos a echar un


vistazo ms de cerca y un poco ms tcnico en tipos, especficamente a los tipos de los objetos en
los que almacenamos nuestros datos durante el clculo. Se va a ahorrar tiempo en el largo plazo, y
que le puede ahorrar algo de confusin.

UN tipo define un conjunto de posibles valores y un conjunto de acciones (por un objeto).


Un objeto es parte de la memoria que contiene un valor de un tipo dado.
UN valor es un conjunto de bits en la memoria interpretados de acuerdo a un tipo.
UN variable Es un objeto con nombre.
UN declaracin Es una declaracin que da un nombre a un objeto.
UN definicin Es una declaracin que deja a un lado la memoria de un objeto.
De manera informal, pensamos en un objeto como un cuadro en el que podemos poner valores de un
tipo dado. Un cuadro int puede contener nmeros enteros, tales como 7, 42, y - 399. Una caja string
puede contener los valores de caracteres de cadenas, como " interoperabilidad " , " smbolos:! @
# $% ^ & * ", y " El viejo MacDonald tena una granja. Grficamente, podemos pensar en ello
como esto:

int a = 7; a: 7

int b = 9; b: 9

Char c = 'a'; c: a

double x = 1.2; x: 1.2

string s1 = "Hola, mundo!"; S1: 13 Hola Mundo!

string s2 = "1.2"; S2: 3 1.2

La representacin de un string es un poco ms complicada que la de un int ya que un string sigue


la pista del nmero de caracteres que contiene. Tenga en cuenta que una double almacena un
nmero mientras que una string caracteres almacena. Por ejemplo, x almacena las nmero 1.2,
mientras que s2 almacena los tres caracteres ' 1 , ' . ', y ' 2. Las cotizaciones de caracteres y
literales de cadena no se almacenan.
Cada int es del mismo tamao; es decir, el compilador de anulacin de la misma fijo cantidad de
memoria para cada int . En un equipo de escritorio tpico, esa cantidad es 4 bytes (32 bits). Del
mismo modo, bools, chars, y doubles se fijan tamao. As, por lo general encontrar que una
computadora de escritorio utiliza un byte (8 bits) para un bool o un char y 8 bytes para
un double. Tenga en cuenta que los diferentes tipos de objetos ocupan diferentes cantidades de
espacio.

En particular, un char ocupa menos espacio que un int , y el string se diferencia del double , int ,
y char es que las diferentes cadenas pueden ocupar diferentes cantidades de espacio.
El significado de los bits en la memoria depende totalmente del tipo utilizado para acceder a
l. Pinsalo de esta manera: la memoria del ordenador no sabe nada de nuestros tipos; es
simplemente la memoria. Los bits de memoria consiguen significado slo cuando decidimos cmo
la memoria ha de interpretar. Esto es similar a lo que hacemos todos los das cuando usamos
nmeros. Qu quiere decir 12,5? No sabemos. Podra ser $ 12,5 o 12,5 cm o 12.5galones. Slo
cuando colocamos la unidad hace la notacin entonces 12.5 significa nada.
Por ejemplo, los mismos bits de memoria que representan el valor 120 cuando considerado como
un int sera ' x ' cuando consideramos como un char. Si mirado como un string , no tendra sentido
en absoluto y se convertira en un error de tiempo de ejecucin si trata de usarlo. Podemos ilustrar
esto grficamente como este, por medio de 1 y 0 para indicar el valor de los bits en la memoria:

00000000 00000000 00000000 01111000

Esta es la configuracin de los bits de un rea de memoria (una palabra) que podran ser ledos
como un int ( 120 ) o como un char ( ' x ' , mirando a los 8 bits de la derecha solamente). Un bit es
una unidad de la memoria del ordenador que puede contener el valor 0 1. Para el significado
de nmeros binario, ver A.2.1.1.

3.9 Tipo de seguridad

Cada objeto da un tipo cuando se define. Un programa - o una parte de un programa - es de tipo seguro
cuando los objetos slo se utilizan de acuerdo con las reglas para su tipo. Por desgracia, hay maneras de
hacer las operaciones que no son de tipo seguro. Por ejemplo, usando una variable antes de que se haya
inicializado no se considera de tipo seguro:

int main ()
{
double X; // nos "olvidamos" para inicializar:
// el valor de x es indefinido
double y = x; //el valor de y es indefinido
double z = 2,0 + x; // el significado de + y el valor de z es indefinido
}

Una implementacin siquiera se le permite dar un error de hardware cuando no ha inicializado


X se utiliza. Siempre inicializar las variables! Hay unos pocos - muy pocos excepciones a esta regla,
como una variable que utilizamos inmediatamente como el blanco de una entrada de operacin, pero
siempre se puede inicializar es un buen hbito que va a ahorrar muchos dolores de cabeza.
Tipo de seguridad completa es el ideal y por lo tanto la regla general para el lenguaje. Por desgracia,
un compilador de C ++ no puede garantizar la seguridad de tipos completa, pero podemos evitar
violaciones de seguridad tipo a travs de una combinacin de buenas prcticas de codificacin y
tiempo de ejecucin de los controles. Lo ideal es no volver a utilizar las caractersticas del lenguaje
que el compilador no puede llegar a ser seguro: la seguridad de tipo esttico. Por desgracia, eso es
demasiado restrictivo para los usos ms interesantes de la programacin. El repliegue obvio, que el
compilador genera implcitamente cdigo que comprueba violaciones de seguridad de tipo y las
capturas de todos ellos, est ms all de C ++. Cuando decidimos hacer cosas que son (tipo) insegura,
tenemos que hacer algunas comprobaciones nosotros mismos. Vamos a sealar esos casos a medida
que a ellos.

El ideal de la seguridad de tipos es muy importante a la hora de escribir cdigo. Es por eso que
pasamos tiempo en explicar al principio del libro. Tenga en cuenta los peligros y evtalos.
3.9.1 conversiones seguras

En 3.4, vimos que no podamos aadir directamente Char s o comparar un double a una int. Sin
embargo, C ++ proporciona una manera indirecta de hacer ambas cosas. Cuando es necesario,
un char es convertido a un int y un int se convierte en una double . Por ejemplo:

Char c = 'x';
int i1 = c;
int i2 = "x";

Aqu, tanto i1 y i2 obtienen el valor 120 , que es el valor entero del carcter 'x' en el ms popular juego
de caracteres de 8 bits, ASCII. Esta es una manera simple y segura de conseguir la representacin
numrica de un carcter. A esto le llamamos char -a- int conversin segura porque no se pierde
informacin; es decir, que podemos copiar el resultado int vuelta en un char y obtener el valor
original:

Char c2 = i1;
cout << ''<< i1 <<'' << c2 << '\n';

Esto imprimir

x 120 x

En este sentido - un valor siempre se convierte en un valor igual o (para dobles) a la mejor
aproximacin de un valor igual - estas conversiones son seguros:

Bool a char
Bool a int
Bool a double
Char a int
Char a double
Int a double

La conversin ms til es int a double porque nos permite mezclar int s y doubles en las expresiones:

double d1 = 2,3;
dobles d2 = d1 + 2; //2 se convierte en 2,0 antes de aadirs
if (d1 <0) // 0 se convierte en 0,0 antes de la
comparacin
cout << "d1 es negativo";

Para una int muy grande, Podemos (en algunos equipos) sufren una prdida de precisin cuando la
conversin es a double. Este es un problema raro.

3.9.2 conversiones inseguras


Las conversiones seguras suelen ser de gran ayuda para el programador y simplificar la escritura de
cdigo. Por desgracia, C ++ tambin permite conversiones (implcitas) inseguras. Por insegura,
queremos decir que un valor puede ser implcita se convirti en un valor de otro tipo que no sea igual
al valor original. Por ejemplo:

int main ()
{
int a = 20000;
Char c = a; //tratar de exprimir un gran int en un pequeo char
int b = c;
if (! a = b) // ! = Significa "no es igual"
cout << "vaya !:" << a <<"= !" << b << '\ n';
else
cout << " Wow! tenemos grandes caracteres \ n";

Tales conversiones son tambin llamadas conversiones "estrechamiento", porque ponen un valor en un
objeto que puede ser demasiado pequea ( estrecho") para mantenerlo. Desafortunadamente, pocos
compiladores advierten sobre la insegura inicializacin del char con un int. El problema es que un int
es tpicamente mucho ms grande que un char, por lo que puede (y en este caso s) mantener un valor
int que no puede ser representado como un char. Prubelo para ver qu valor b obtiene en su mquina
(32 es un resultado comn); Mejor an, experimento:

int main ()
{
double d = 0;
while (cin >> d) { // repetir las siguientes afirmaciones
// Siempre y cuando introducimos los nmeros
int i = d; // tratar de apretar un double dentro de un int

Char c = i; // tratar de apretar un int en un char


int i2 = c; // obtener el valor entero del carcter
cout << "d ==" << d // el original de double
<< "I ==" i << // se convierte a int
<< "I2 ==" << i2 // int valor del char
<< "Char (" << << c ") \ n"; // char
}
}

La sentencia while que utilizamos para permitir que se prueben muchos valores se explicar en
4.4.2.1.

PRUEBA ESTO
Ejecute este programa con una variedad de entradas. Intente valores pequeos (por ejemplo, 2 y 3); Intente
valores grandes (mayores de 127, mayores de 1000); Intentar valores negativos; Prueba 56; Prueba 89;
Intente 128; Intentar valores no enteros (por ejemplo, 56,9 y 56,2). Adems de mostrar cmo se realizan
conversiones de doble a int y conversiones de int a char en su mquina, este programa le muestra qu
carcter (si lo hay) su mquina imprimir para un valor entero dado.

Usted encontrar que muchos de los valores de entrada producen resultados "no razonables".
Bsicamente, estamos tratando de poner un galn en un bote de medio litro (alrededor de 4 litros en un
vaso de 500 ml).

Todas las conversiones

Double
a int
Doubl a
char
Doubl a
bool
Int a char

int a bool

char a bool

Son aceptados por el compilador aunque no sean seguros. Son inseguras en el sentido de que
el valor almacenado puede diferir del valor asignado. Por qu esto puede ser un problema?
Porque a menudo no sospechamos que se est produciendo una conversin insegura.
Considerar:

doble x = 2,7; // las porciones de cdigo


int y = x; // y se convierte en 2

Para el momento en que definimos y podramos haber olvidado que x era un doble, o podemos
haber olvidado temporalmente que una conversin de doble-a-int trunca (siempre redondea
hacia abajo, hacia cero) en lugar de usar el redondeo 4/5 convencional. Lo que sucede es
perfectamente predecible, pero no hay nada en el int y = x; Para recordarnos que la
informacin (el .7) es desechada.

Las conversiones de int a char no tienen problemas con el truncamiento - ni int ni char pueden
representar una fraccin de un entero. Sin embargo, un carcter puede contener slo valores enteros
muy pequeos. En un PC, un carcter es 1 byte mientras que un int es 4 bytes:

char:

int:

Por lo tanto, no podemos poner un gran nmero, como 1000, en un char sin prdida de informacin:
el valor se "estrecha".
Por ejemplo:

int a = 1000;
Char b = a; // b convierte -24 (en algunas mquinas)

No todos los valores int tienen equivalentes de caracteres y el rango exacto de valores de
caracteres depende
Sobre la implementacin particular. En un PC, el rango de valores de char es [-128: 127], pero
slo [0: 127] se puede utilizar de forma porttil porque no todos los equipos son PC y diferentes
ordenadores tienen diferentes rangos para sus valores de caracteres, como [0 : 255].
Por qu la gente acepta el problema de reducir las conversiones? La mayor razn es la historia:
C ++ hered el estrechamiento de las conversiones de su lenguaje ancestral, C, por lo que desde el
primer da de C ++, exista mucho cdigo que dependa de reducir las conversiones. Adems, muchas
de estas conversiones no causan problemas porque los valores involucrados estn en el rango y
muchos programadores se oponen a los compiladores "dicindoles qu hacer". En particular, los
problemas con conversiones inseguras son a menudo manejables en programas pequeos y por
experiencia programadores Sin embargo, pueden ser una fuente de errores en programas ms grandes
y una causa importante de problemas para los programadores principiantes. Sin embargo, los
compiladores pueden advertir acerca de reducir las conversiones, y muchos lo hacen.
C ++ 11 introdujo una notacin de inicializacin que prohibe el estrechamiento de las
conversiones. Por ejemplo, podramos (y deberamos) reescribir los molestos ejemplos anteriores
usando una notacin de lista {}, en lugar de la = notacin:

doubl x {2,7}; // DE ACUERDO


int y {x}; // Error: double -> int podra reducir

int a {1000}; // DE ACUERDO


Char b {a}; // Error: int -> char podra reducir

Cuando el inicializador es un literal entero, el compilador puede comprobar el real valor y aceptar los
valores que no impliquen el estrechamiento:

Char b1 {1000}; // Error: el estrechamiento (asumiendo caracteres de 8 bits)


char b2 {48}; // DE ACUERDO

Entonces, qu debe hacer si piensa que una conversin podra conducir a un mal valor? Utilice {}
inicializadores para evitar accidentes y, cuando quiera una conversin, compruebe el valor antes de
asignar como lo hicimos en el primer ejemplo de esta seccin. Ver 5.6.4 y 7.5 para una manera
simplificada de hacer tal chequeo. La notacin basada en {} -list se conoce como inicializacin
universal y uniforme y veremos mucho ms de eso ms adelante.

practica

Despus de cada paso de este ejercicio, ejecute su programa para asegurarse de que realmente est
haciendo lo que usted espera. Mantenga una lista de los errores que comete para que pueda intentar
evitarlos en el futuro.
1. Este ejercicio es para escribir un programa que produce una simple carta de formulario basada en
la entrada del usuario. Comience escribiendo el cdigo de 3.1 solicitando a un usuario que escriba
su nombre de pila y escriba "Hello, first_name" donde first_name es el nombre introducido por el
usuario. A continuacin, modifique su cdigo de la siguiente manera: cambie el mensaje a
"Introduzca el nombre de la persona a la que desea escribir" y cambie la salida a "Dear first_name".
No olvides la coma.
2. Aadir una o dos lneas introductorias, como "Cmo ests? Estoy bien. Te extrao. Asegrate
de sangrar la primera lnea. Aadir unas lneas ms de su eleccin, es su carta.

3. Ahora pida al usuario el nombre de otro amigo y gurdelo en friend_name. Aade una lnea
a tu carta: "Has visto a friend_name ltimamente?"

4. Declare una variable char llamada friend_sex e inicialice su valor a 0.


Pida al usuario que ingrese un m si el amigo es un hombre y un f si el amigo es una mujer.
Asigne el valor introducido a la variable friend_sex. A continuacin, utilice dos instrucciones
if para escribir lo siguiente:
Si el amigo es varn, escriba "Si ves friend_name por favor, pdele que me llame".
Si el amigo es mujer, escriba "Si ves friend_name por favor, pdele que me llame".

5. Solicite al usuario que introduzca la edad del destinatario y que lo asigne a una edad la variable
int. Si su edad es 0 o menos o 110 o ms, llame a simple_error ("Ests bromeando!") Usando
simple_error ( ) de std_lib_facilities.h.

6. Adelo a su carta:

Si su amigo es menor de 12 aos, escriba "El ao que viene tendr la edad + 1".
Si su amigo tiene 17 aos, escriba "El ao que viene podr votar".
Si su amigo tiene ms de 70 aos, escriba "Espero que est disfrutando de la jubilacin".
Revise su programa para asegurarse de que responde apropiadamente a cada tipo de valor.

7. Adase "Suyo sinceramente", seguido de dos lneas en blanco para una firma, seguido de su
nombre.

Revisin

1. Qu se entiende por el trmino rpido?


2. Qu operador utiliza para leer en una variable?
3. Si desea que el usuario introduzca un valor entero en su programa para una variable llamada
nmero, Cules son dos lneas de cdigo se podra escribir a pedir al usuario que hacerlo y para
introducir el valor en su programa?
4. Qu es l a llamada \n y qu propsito tiene?
5. Qu entrada termina en una cadena?
6. Qu entrada termina en un entero?
7. Cmo se escribe

cout << "Hola";


cout << first_name;
cout << "\ n";
como una sola lnea de cdigo?

8. Qu es un objeto?
9. Qu es un literal?
10. Qu tipos de literales hay?
11. Qu es una variable?
12. Cules son los tamaos tpicos para un char, un int, y un double?
13. Qu medidas utilizamos para el tamao de pequeas entidades en memoria, como
Como ints y strings?
14. Cul es la diferencia entre = y ==?
15. Qu es una definicin?
16. Qu es una inicializacin y en qu se diferencia de una cesin?
17. Cul es la concatenacin de cadenas y cmo hacer que funcione en C ++?
18. Cul de las siguientes son nombres legales en C ++? Si un nombre no es legal, por qu no?

This_little_pig This_1_is fine


2_For_1_special
lastest thing the_ $ 12_method
_this_ is_ ok MiniMineMine
number correct?

19. Dar cinco ejemplos de nombres legales que no se debe usar, ya que es probable que causen
confusin.
20. Cules son algunas buenas reglas para la eleccin de nombres?
21. Cul es la seguridad de tipos y por qu es importante?
22. Por qu la conversin de double a int puede ser algo malo?
23. Definir una regla para ayudar a decidir si una conversin de un tipo a otro es segura o insegura.

condiciones

asignacin definicin operacin


cin incremento operador
concatenacin inicializacin tipo
conversin nombre la seguridad de
declaracin estrechamiento tipos
valor
decremento objeto variable

Ejercicios

1. Si an no lo ha hecho, realice los ejercicios Prueba de este captulo.


2. Escribe un programa en C ++ que convierte de millas a kilmetros. Su programa debe tener un
indicador razonable para que el usuario ingrese un nmero de millas. Indicacin: Hay 1.609
kilmetros a la milla.
3. Escriba un programa que no haga nada, pero declara un nmero de variables con nombres legale s
e ilegales (como int double = 0;), para que pueda ver cmo reacciona el compilador.
4. Escriba un programa que pida al usuario que introduzca dos valores enteros. Almacene estos
valores en variables int val1 y val2. Escriba su programa para determinar la menor, mayor, suma,
diferencia, producto y proporcin de estos valores e informe al usuario.
5. Modificar el programa anterior para pedir al usuario que introduzca los valores de punto flotante
y almacenarlos en variables double. Compara las salidas de los dos programas para algunas
entradas de su eleccin. Son los resultados la misma? Debera ellos son? Cul es la diferencia?

6. Escribir un programa que pide al usuario que introduzca los tres valores enteros, y a continuacin,
da salida a los valores en secuencia numrica separados por comas. As que, si el usuario introduce
los valores 10 4 6, la salida debe ser 4, 6, 10. Si dos valores son los mismos, que slo debe pedirse
conjuntamente. Por lo tanto, la entrada de 4 5 4 debe dar 4, 4, 5.

7. Del ejercicio 6, pero con tres valores de cadena. Por lo tanto, si el usuario entra en el Valores
Steinbeck, Hemingway, Fitzgerald, la salida debe ser Fitzgerald, Hemingway, Steinbeck.

8. Escribir un programa para probar un valor entero para determinar si es par o inpar. Como siempre,
asegrese de que su salida sea clara y completa. Es decir, no slo de salida de s o no. El resultado
debe estar solo, al igual que el valor de 4 es un nmero par. Sugerencia: Vea el resto (mdulo)
operador en el 3.4.

9. Escribir un programa que convierte los nmeros deletreados como "cero" y "Dos" en dgitos, tal
como 0 y 2. Cuando el usuario introduce un nmero, el programa debe imprimir el dgito
correspondiente. Hgalo para los valores 0, 1, 2, 3 y 4 y escribir no es un nmero que s si el
usuario ingresa algo que no corresponda, como estpida computadora!.
10. Escribir un programa que toma una operacin seguida de dos operandos y muestra el resultado.
Por ejemplo:

+ 100 3,14
*45

Leer la operacin en una cadena llamada operacin y el uso de una sentencia-si de averiguar qu
operacin es el que el usuario desea, por ejemplo, si (== operacin " + " ) . Leer los operandos en
variables de tipo double .

Implementar este llamado para las operaciones +, -, *, /, ms, menos, mul y div con sus significados
obvios.

11. Escribir un programa que pide al usuario que introduzca un nmero de valores de monedas
(monedas de 1 centavo), de cinco (monedas de 5 centavos), diez (monedas de 10 centavos), cuarta
parte de (monedas de 25 centavos), medio de dlares (monedas de 50 centavos), y monedas de un
dlar (100 monedas de cntimos de euro). Preguntar al usuario por separado para el nmero de cada
tamao de moneda, por ejemplo, "Cuntas monedas tiene usted" Entonces su programa debe
imprimir algo como esto:

Tiene 23 centavos.

Usted tiene 17 monedas de cinco centavos.

Usted tiene 14 monedas de diez centavos.


Usted tiene 7 trimestres.

Tienes 3 dlares y medio.

El valor de todas sus monedas es de 573 centavos.

Hacer algunas mejoras: Si slo uno de una moneda se informa, que la salida gramaticalmente correcta
es, por ejemplo, 14 monedas de diez centavos y 1 centavo (no 1 monedas de diez centavos ).

Adems, el informe de la suma en dlares y centavos, es decir, $ 5,73 en lugar de 573 centavos.

Posdata

Por favor, no hay que subestimar la importancia de la nocin de seguridad de tipos. Tipos estn en el
centro de la mayora de las nociones de programas correctos, y algunas de las tcnicas ms eficaces
para la construccin de programas se basan en el diseo y uso de tipos - como se ver en los captulos
6 y 9, las partes II, III, y IV.
4

Clculo

"Si no tiene
que producir resultados correctos, Puedo hacerlo
arbitrariamente rpido ".

-Gerald M. Weinberg

Este captulo presenta los fundamentos de la computacin. En


particular, se discute cmo calcular un valor a partir de un
conjunto de operandos (expresin), cmo elegir entre acciones
alternativas (seleccin) y cmo repetir un clculo para una serie
de valores (iteracin). Tambin se muestra cmo un determinado
sub-computacin puede ser nombrado y especificado por
separado (una funcin). Nuestra principal preocupacin es
expresar clculos de maneras que conduzcan a programas
correctos y bien organizados. Para ayudarle a realizar clculos
ms realistas, introducimos el tipo de vector para mantener
secuencias de valores.
4.1 Clculo
4.5 Funciones
4.2 Objetivos y
herramientas 4.5.1 Por qu molestarse con las funciones?
4.3 Expresiones 4.5.2 Las declaraciones de funciones

4.3.1 Las expresiones 4.6 vector


constantes
4.6.1 Recorrido de un vector
4.3.2
4.6.2 Crecimiento de un vector
Operadores
4.6.3 Un ejemplo numrico
4.3.3 Conversiones
4.6.4 Un ejemplo de texto
4.4 declaraciones
4.7 Caractersticas del lenguaje
4.4.1
Seleccin
4.4.2 La
iteracin
4.1 Clculo

Desde un punto de vista, todo lo que un programa hace es calcular; es decir, se toma algunas entradas
y produce una salida. Despus de todo, llamamos el hardware en el que se corre el programa en un
ordenador. Este punto de vista es precisa y razonable, siempre y cuando tomamos una visin amplia
de lo que constituye la entrada y salida:

Cdigo (A menudo
desordenado a
menudo un montn de
cdigo)
Entrada Salida

Datos

La entrada puede provenir de un teclado, de un mouse, de una pantalla tctil, de los archivos, de
otros dispositivos de entrada, de otros programas, de otras partes de un programa. "Otros dispositivos
de entrada" es una categora que contiene fuentes ms realmente interesantes de entrada: teclados
musicales, aparatos de vdeo, conexiones de red, sensores de temperatura, sensores de imagen de
cmaras digitales, etc. La variedad es esencialmente infinito.

Para hacer frente a la entrada, un programa por lo general contiene algunos datos, a veces se hace
referencia como sus estructuras de datos o su estado. Por ejemplo, un programa de calendario puede
contener listas de vacaciones en varios pases y una lista de sus citas. Algunos de esos datos es parte del
programa desde el principio; otros datos se construye a medida que el programa lee la entrada y recoge
informacin til de ella. Por ejemplo, el calendario programa probablemente construir su lista de citas de la
entrada que le des. Para el calendario, las entradas principales son las peticiones de acceso a los meses y
los das que usted pide (probablemente utilizando clics del ratn) y las citas que usted da para hacer un
seguimiento de (probablemente escribiendo informacin sobre el teclado). La salida es la pantalla de
calendarios y citas, adems de los botones y solicitudes de entrada que el programa de calendario
escribe en la pantalla.

De entrada proviene de una gran variedad de fuentes. Del mismo modo, la salida puede ir a una amplia variedad
de destinos. La salida puede ser la de una pantalla, a los archivos, a las conexiones de red, a otros dispositivos
de salida, a otros programas, y a otras partes de un programa. Los ex ejemplos de dispositivos de salida incluyen
interfaces de red, sintetizadores de msica, motores elctricos, generadores de luz, calentadores, etc.

Desde el punto de vista de la programacin, las categoras ms importantes e interesantes son "a / desde otro
programa" y "a / desde otras partes de un programa". La mayor parte del resto de este libro podra ser visto
como discutiendo esa ltima categora: Expresamos un programa como un conjunto de partes que cooperan y
cmo pueden compartir e intercambiar datos? Estas son las preguntas clave en la programacin. Podemos
ilustrarlo grficamente:

Cdigo Cdigo Cdigo


Entrada I/O I/O Salida
Datos Datos Datos
La abreviatura I / O significa "entrada / salida". En este caso, la salida de una parte de cdigo es la entrada para
la siguiente parte. Qu tipo de "partes de un programa de" compartir datos almacenados en la memoria
principal, en dispositivos de almacenamiento persistentes (como los discos), o transmitida a travs de
conexiones de red. Por "partes de un programa" nos referimos a entidades como una funcin de la produccin
de un resultado de un conjunto de argumentos de entrada (por ejemplo, una raz cuadrada de un nmero de coma
flotante), una funcin de realizar una accin sobre un objeto fsico (por ejemplo, una la funcin dibujar una
lnea en una pantalla), o una funcin de la modificacin de alguna mesa dentro del programa (por ejemplo, una
funcin de aadir un nombre a una tabla de clientes).

Cuando decimos "input" y "output" generalmente queremos decir informacin entrando y saliendo
de una computadora, pero como usted ve, tambin podemos usar los trminos para informacin dada
o producida por una parte de un programa. Las entradas a una parte de un programa a menudo se
llaman argumentos y las salidas de una parte de un programa se llaman a menudo resultados.

Por computacin simplemente queremos decir el acto de producir algunas salidas basadas en algunas
entradas, tales como producir el resultado (salida) 49 del argumento (entrada) 7 usando el cuadrado
de clculo (funcin) (vase 4.5). Como curiosidad posiblemente til, notamos que hasta la dcada
de 1950 se defini una computadora como una persona que haca clculos, como un contador, un
navegador o un fsico. Hoy en da, simplemente delegamos la mayora de los clculos a computadoras
(mquinas) de varias formas, de las cuales la calculadora de bolsillo est entre las ms simples.

4.2 Objetivos y herramientas

Nuestro trabajo como programadores es expresar computaciones


Correctamente
Simplemente
Eficientemente

Tenga en cuenta el orden de esos ideales: no importa lo rpido que un programa es si da los resultados
incorrectos. Del mismo modo, un programa correcto y eficiente puede ser tan complicado que debe
ser desechado o completamente reescrito para producir una nueva versin (versin). Recuerde, los
programas tiles siempre sern modificadas a las nuevas necesidades acomodar, nuevo hardware,
etc. Por lo tanto, un programa - y cualquier parte de un programa - debe ser lo ms simple posible
para llevar a cabo su tarea. Por ejemplo, suponga que ha escrito el programa perfecto para la
enseanza de la aritmtica bsica a los nios en su escuela local, y que su estructura interna es un
desastre. Qu idioma se utiliza para comunicarse con los nios? Ingls? Ingls y espaol? Qu
pasa si me gustara usarlo en Finlandia? En Kuwait? Cmo se puede cambiar el idioma (naturales)
que se utiliza para la comunicacin con un nio? Si la estructura interna del programa es un desastre,
la lgica sencilla (pero en la prctica muy difcil, casi siempre) la operacin de cambiar el lenguaje
natural utilizado para comunicarse con los usuarios se convierte en insalvable.

Las preocupaciones acerca de la correccin, la sencillez y la eficiencia se convierten en nuestra en


el momento en que comenzamos a escribir cdigo para otros y aceptamos la responsabilidad de
hacerlo bien; Es decir, debemos aceptar esa responsabilidad cuando decidimos convertirnos en
profesionales. En trminos prcticos, esto significa que no podemos simplemente conjurar el cdigo
hasta que parece funcionar; Debemos preocuparnos por la estructura del cdigo. Paradjicamente,
las preocupaciones por la estructura y la "calidad del cdigo" son a menudo las formas ms rpidas
de conseguir que algo funcione. Cuando la programacin se hace bien, tales preocupaciones
minimizan la necesidad de la parte ms frustrante de la programacin: depuracin; Es decir, una
buena estructura del programa durante el desarrollo puede minimizar el nmero de errores
cometidos y el tiempo necesario para buscar esos errores y eliminarlos.
Nuestra principal herramienta para organizar un programa - y para organizar nuestros pensamientos
a medida que programa - es romper un gran clculo en muchos pequeos. Esta tcnica viene en dos
variaciones:

Abstraccin: Ocultar detalles que no necesitamos usar una instalacin ("detalles de


implementacin") detrs de una interfaz conveniente y general. Por ejemplo, en lugar de considerar
los detalles de cmo ordenar una gua telefnica (libros gruesos han sido escritos sobre cmo
ordenar), slo llamamos al algoritmo de ordenacin de la biblioteca estndar de C ++. Todo lo que
necesitamos saber para ordenar es cmo invocar (llamar) ese algoritmo, para que podamos escribir
sort (b) donde b se refiere a la gua telefnica; Sort () es una variante (21.9) del algoritmo de
clasificacin de biblioteca estndar (21.8, B.5.4) definido en std_lib_facilities.h. Otro
ejemplo es la forma en que usamos la memoria de la computadora. El uso directo de la memoria
puede ser muy complicado, por lo que se accede a travs de variables escr itas y nombradas
(3.2), vectores de bibliotecas estndar (4.6, captulos 17 -19), mapas (captulo 21), etc.

"Dividir y conquistar": Aqu tomamos un gran problema y lo dividimos en varios pequeos.


Por ejemplo, si necesitamos construir un diccionario, podemos separar ese trabajo en tres: leer
los datos, ordenar los datos y dar salida a los datos.

Cada uno de los problemas resultantes es significativamente ms pequeo que el original.

Por qu ayudar a esto? Despus de todo, un programa construido a partir de piezas es probable que
sea un poco ms grande que un programa en el que todo se combina de manera ptima entre s. La
razn es que no somos muy buenos para tratar con grandes problemas. La forma en que realmente tratar
con aquellos - en la programacin y en otras partes - es descomponerlas en problemas ms pequeos,
y seguimos rompiendo los en partes an ms pequeas hasta que consigamos algo bastante simple
de entender y resolver. En cuanto a la programacin, usted encontrar que un programa 1000 de
lnea tiene mucho ms de diez veces el nmero de errores como un programa de 100 lneas, por lo
que tratar de componer el programa 1000 de salida de lnea de piezas con menos de 100 lneas. Para
grandes programas, decir 10.000.000 lneas, la aplicacin de la abstraccin y la divide y vencers no
es slo una opcin, es requerimiento un elemento esencial. Simplemente no podemos escribir y
mantener grandes programas monolticos. Una forma de ver el resto de este libro es como una larga
serie de ejemplos de problemas que necesitan ser dividido en partes ms pequeas, junto con las
herramientas y tcnicas necesarias para hacerlo.

Cuando consideramos dividir un programa, siempre debemos considerar qu herramientas tenemos


disponibles para expresar las partes y sus comunicaciones. Una buena biblioteca, que proporciona
instalaciones tiles para expresar ideas, puede afectar de manera crucial la forma en que distribuimos la
funcionalidad en diferentes partes de un programa. No podemos simplemente sentarnos y "imaginar" la mejor
manera de dividir un programa; Debemos considerar qu bibliotecas tenemos disponibles para expresar las
partes y su comunicacin. Es temprano todava, pero no demasiado pronto para sealar que si puede utilizar
una biblioteca existente, como la biblioteca estndar de C ++, puede ahorrarse mucho trabajo, no slo en la
programacin, sino tambin en pruebas y documentacin. Los iostreams nos salvan de tener que tratar
directamente con los puertos de entrada / salida del hardware. Este es un primer ejemplo de particin de un
programa utilizando abstraccin. Cada nuevo captulo ofrecer ms ejemplos.

Tenga en cuenta el nfasis en la estructura y la organizacin: usted no consigue un buen cdigo con slo
escribir un montn de declaraciones. Por qu lo mencionamos ahora? En esta etapa usted (o al menos muchos
lectores) tienen poca idea de qu es el cdigo, y pasarn meses antes de que est listo para escribir cdigo
sobre el cual otras personas podran depender para su vida o su sustento. Lo mencionamos para ayudarle a
obtener el nfasis de a la derecha de aprendizaje.

Es muy tentador para lanzarse hacia el futuro, centrndose en las partes de pro-programacin que -
al igual que lo que se describe en el resto de este captulo - son concretas y de utilidad inmediata y
hacer caso omiso de los "ms blandos" partes ms conceptuales del arte de software desarrollo. Sin
embargo, los buenos programadores y diseadores de sistemas saben (a menudo despus de haber
aprendido de la manera difcil) que las preocupaciones acerca de la estructura se encuentran en el
corazn de un buen software y que haciendo caso omiso de la estructura conduce a los caros. Sin
estructura, que est (metafricamente hablando) la construccin con ladrillos de barro. Se puede
hacer, pero nunca va a llegar a la quinta planta (ladrillos de barro carecen de la resistencia estructural
para eso). Si usted tiene la ambicin de construir algo razonablemente permanente, que prestar
atencin a las cuestiones de estructura y organizacin del cdigo en el camino, en lugar de tener que
volver y aprender ellos despus de los fracasos.
4.3 Expresiones

El elemento bsico ms bsico de los programas es una expresin. Una expresin calcula un
valor de varios operandos. La expresin ms simple es simplemente un valor literal, tal como
10, 'a', 3.14, o "Norah".

Los nombres de variables tambin son expresiones. Una variable representa el objeto del cual
es el nombre. Considerar:

// Calcular rea:
int longitud = 20; // un literal entero (utilizado para inicializar una variable)
int anchura = 40;
int area= longitud*anchura // una multiplicacin

Aqu los literales 20 y 40 se utilizan para inicializar las variables de longitud y ancho.
Luego, se multiplican la longitud y el ancho; Es decir, multiplicamos los valores encontrados en
longitud y anchura. Aqu, longitud es simplemente una abreviatura para "el valor encontrado en el
objeto llamado longitud". "Considere tambin

longitud = 99; // asignar a la longitud 99

Aqu, como el operando de la izquierda de la asignacin, longitud significa "el objeto llamado
longitud", de modo que la expresin de asignacin se lea "Ponga 99 en el objeto denominado por
longitud". Distinguimos entre longitud usada en el lado izquierdo De una asignacin o una
inicializacin ("el lvalue de longitud" o "el objeto denominado por longitud") y la longitud
utilizada en el lado derecho de una asignacin o inicializacin ("el valor de longitud", "el valor
del objeto Llamado por longitud ", o simplemente" el valor de la longitud "). En este contexto,
nos resulta til visualizar una variable como una caja etiquetada con su nombre:
int :
longitud: 99

Es decir, longitud es el nombre de un objeto de tipo int que contiene el valor 99. A
veces (como un lvalue) longitud se refiere a la caja (objeto) ya veces (como un
rvalue) se refiere al valor en ese cuadro.
Podemos hacer expresiones ms complicadas combinando expresiones usando
operadores, como + y *, de la misma manera que estamos acostumbrados. Cuando
sea necesario, podemos usar parntesis para agrupar expresiones:

int permetro = (largo + ancho) * 2; // aadir luego multiplicar

Sin parntesis, habramos tenido que decir

int permetro = longitud * ancho * 2 + 2;

Lo que es torpe, y que incluso podra haber cometido este error:

int permetro = largo + ancho * 2; // aadir anchura * 2 a la longitud

Este ltimo error es lgico y no puede ser encontrado por el compilador. Todo lo que ve el
compilador es una variable llamada permetro inicializada por una expresin vlida. Si el
resultado de esa expresin es un disparate, ese es tu problema. Conoces la definicin
matemtica de un permetro, pero el compilador no.
Las reglas matemticas usuales de la precedencia del operador se aplican, as que longitud + ancho
* 2 significa longitud + (ancho * 2). Similarmente a * b + c / d significa (a * b) + (c / d) y no a
* (b + c) / d. Vea A.5 para una tabla de precedencia.

La primera regla para el uso de parntesis es simplemente "En caso de duda, entre parntes is", pero
por favor, aprende lo suficiente sobre las expresiones para que no dudes de un * b + c / d. El uso
excesivo de los parntesis, como en (a * b) + (c / d), disminuye la legibilidad.

Por qu debera preocuparse por la legibilidad? Porque usted y posiblemente otros leen su cdigo,
y el cdigo equivoco disminuye la lectura y la comprensin. Cdigo feo no es slo difcil de leer,
tambin es mucho ms difcil de obtener correcta. El cdigo feo suele ocultar errores lgicos. Es
ms lento de leer y hace ms difcil convencer a usted mismo - ya otros - de que el cdigo feo es
correcto. No escriba expresiones absurdamente complicadas como

a * b + c / d * (e-f / g) / h + 7 // demasiado complicado

y siempre trate de elegir nombres significativos.

4.3.1 Las expresiones constantes

Los programas usan tpicamente muchas constantes. Por ejemplo, un programa de geometra podra utilizar pi y
un programa de conversin de centmetro a centmetro utilizar un factor de conversin tal como 2.54.
Obviamente, queremos usar nombres significativos para esas constantes (como hicimos para pi, no dijimos
3.14159). Del mismo modo, no queremos cambiar constantes de forma accidental. En consecuencia, C ++
ofrece la nocin de una simblica con-constante, es decir, un objeto llamado a la que no se puede dar
un nuevo valor despus de que se haya inicializado. Por ejemplo:

constexpr doble pi = 3.14159;

Pi = 7; // Error: la asignacin a constante


double c = 2 * pi * r; //OK: acabamos de leer pi; no tratamos de cambiarlo

Tales constantes son tiles para mantener el cdigo legible. Usted podra haber reconocido 3.14159
como una aproximacin a pi si lo vio en algn cdigo, pero habra reconocido 299792458? Adems,
si alguien le pidi que cambiara algn cdigo para usar pi con la precisin de 12 dgitos para su clculo,
podra buscar 3.14 en su cdigo, pero si alguien sin cuidado lo hubiera usado 22/7, probablemente no
lo encontrara. Sera mucho mejor simplemente cambiar la definicin de pi para usar el valor ms
apropiado:

constexpr doble pi = 3,14159265359;

En consecuencia, preferimos no utilizar literales (excepto los muy obvios, como 0 y 1) en la mayora de
los lugares de nuestro cdigo. En su lugar, usamos constantes con nombres descriptivos. Los literales
no evidentes en las definiciones de cdigo (fuera de constantes simblicas) se denominan
despectivamente a las constantes como mgicos.
En algunos lugares, como las etiquetas de casos (4.4.1.3), C ++ requiere una expresin constante, es
decir, una expresin con un valor entero compuesto exclusivamente de constantes. Por ejemplo:

constexpr int max = 17; // Un literal es una expresin constante


int val = 19;

max + 2 // una expresin constante (una const int adems de un literal)


val + 2 // no es una expresin constante: se utiliza una variable
Y por cierto, 299792458 es una de las constantes fundamentales del universo: La velocidad de la luz
en el vaco medido en metros por segundo. Si no lo hizo en constantemente reconocer que, por qu se
puede esperar que no debe confundirse y frenado por otros literales incorporadas en el cdigo? Evitar las
constantes mgicas!

Una constante simblica constexpr debe tener un valor que se conoce en tiempo de compilacin. Por ejemplo:

constexpr int max = 100;

uso void (int n)


{

constexpr int c1 = max + 7; //OK: c1 es 107


constexpr int c2 = n + 7; //Error: no sabemos el valor de c2
// ...
}

Para hacer frente a los casos en que el valor de una "variable" que se inicializa con un valor que no
se conoce en tiempo de compilacin, pero nunca cambia despus de la inicializacin, C ++ ofrece
una segunda forma de constante (una const):

constexpr int max = 100;

void use (int n)


{
constexpr int c1 = max + 7; //OK: c1 es 107
const int c2 = n + 7; //OK, pero no trate de cambiar el valor de c2
// ...
c2 = 7; //Error: c2 es una constante
}

Tal "const variables "son muy comunes por dos razones:

C ++ 98 no tiene constexpr, por lo que la gente utiliza const.


"Variables" que no son expresiones constantes (su valor no se conoce en tiempo de compilacin),
pero no modifican los valores despus de la inicializacin estn en ellos mismos ampliamente til.

4.3.2 Operadores
Slo utilizamos los operadores ms simples. Sin embargo, pronto se necesitar ms que usted quiere
expresar operaciones ms complejas. La mayora de los operadores son convencionales, por lo que
slo tendremos que explican ms adelante segn sea necesario y se pueden consultar los datos,
siempre y cuando encuentre una necesidad. Aqu est una lista de los operadores ms comunes:

Nombre Comentario

F(a) llamada a la funcin pasar a a f como un argumento


++ lval preincremento incrementar y utilizar el valor
- -lval decremento previo incrementado
decremento y utilizar el valor
!un no reducido
resultado es bool
-un menos unario
a*b multiplicar
a /b dividir

(Contina
)
Nombre Comentario

a% b mdulo (resto) slo para tipos de enteros


a+ b aadir
a-b sustraer
out<<b escribir b a out dnde out es un ostream
in>>b leer desde in dentro b dnde in es un istream
<b menos que resultado es bool
a <= b menor o igual resultado es bool
a> b mas grande que resultado es bool
a> = b mayor que o igual resultado es bool
a == b igual No debe confundirse con =
A! = b no es igual resultado es bool
a && b lgico y resultado es bool
a || lgico o resultado es bool
segundo
lval = a asignacin No debe confundirse con ==
lval * = a asignacin compuesta lval = lval*a; Tambin por /, %, +, -

Nosotros usamos lval (Abreviatura de "valor que puede aparecer en el lado izquierdo de una
siganacion") donde el operador modifica un operando. Puede encontrar una lista completa en A.5.

Para ejemplos del uso de los operadores lgicos && (and), || (o y ! (no),
Ver 5.5.1, 7.7, 7.8.2 y 10.4.

Tenga en cuenta que a <b <c significa (a <b) <c y que a <b evala a un valor booleano: true o false.
As que a <b <c ser equivalente a true <c o false <c. En particular, a <b <c no significa "es b entre a
y c?" Como muchos han asumido ingenuamente (y no injustificadamente). As, a <b <c es
bsicamente una expresin intil. No escriba tales expresiones con dos operaciones de comparacin,
y sea muy sospechoso si encuentra esa expresin en el cdigo de otra persona - es ms probable que
sea un error.

Un incremento puede expresarse en al menos tres maneras:

++ = a
a+ = 1
a = a+ 1

Qu notacin debemos usar? Por qu? Preferimos la primera versin, ++ a, porque expresa ms
directamente la idea de incrementar. Dice lo que queremos hacer (incrementar a) en lugar de cmo
hacerlo (agregue 1 a a y luego escriba el resultado en a). En general, una manera de decir algo en un
programa es mejor que otra si expresa ms directamente una idea. El resultado es ms conciso y ms
fcil de entender para un lector. Si escribimos a = a + 1, un lector podra fcilmente preguntarse si
realmente signific incrementar en 1. Tal vez simplemente escribimos mal a = b + 1, a = a + 2, o
incluso a = a-1; Con ++ a hay pocas oportunidades para tales dudas.

Tenga en cuenta que este es un argumento lgico sobre la legibilidad y correccin, no es un argumento
acerca de la eficiencia. Contrariamente a la creencia popular, los compiladores modernos tienden a
generar exactamente el mismo cdigo de a = a + 1 como para ++a cuando a es uno de los tipos
incorporados. Similar, nosotros preferimos a * = escala antes de a = a*escala
4.3.3 Conversiones
Podemos "mezclar" diferentes tipos de expresiones. Por ejemplo, 2,5 / 2 es un doble dividido por un int. Qu
significa esto? Hacemos divisin entera o divisin de punto flotante Divisin entera arroja el resto; Por
ejemplo, 5/2 es 2. La divisin del punto flotante es diferente en que no hay resto a tirar; Por ejemplo, 5,0 / 2,0
es 2,5. De ello se desprende que la respuesta ms obvia a la pregunta "es la divisin entera de 2.5 / 2 o la
divisin de coma flotante?" Es "punto flotante, por supuesto; De lo contrario perderamos informacin.
Preferiramos la respuesta 1.25 en lugar de 1, y 1.25 es lo que obtenemos. La regla (para los tipos que hemos
presentado hasta ahora) es que si un operador tiene un operando de tipo doble, usamos aritmtica de punto
flotante dando un resultado doble; De lo contrario, usamos aritmtica entera produciendo un resultado int. Por
ejemplo:

5/2 es 2(no 2.5)


2.5 / 2 medio 2,5 / doble (2) , es decir, 1.25
'A' + 1 medio int {'a'} + 1

El tipo de las notaciones (valor) y el tipo {valor} significan "convertir el valor al tipo como si
estuviera inicializando una variable del tipo con el valor". En otras palabras, si es necesario, el
compilador convierte ("promueve") los operandos int a dobles o char operandos a ints. La notacin
de tipo {value} evita el estrechamiento (3.9.2), pero la notacin de tipo (valor) no. Una vez que el
resultado ha sido calculado, el compilador puede tener que convertirlo (de nuevo) para utilizarlo
como un inicializador o la mano derecha de una asignacin. Por ejemplo:

double d = 2,5;

int i = 2;

double d2 = d / i; //d2 == 1.25int i2 =


d / i; // i2 == 1
int i3 {d / i}; // Error: doble -> conversin int puede estrecharse (3.9.2)

d2 = d / i; // d2 == 1.25
i2 = d / i; // i2 == 1

Ten en cuenta que es fcil olvidarse de la divisin entera en una expresin que tambin contiene
operandos de coma flotante. Considere la frmula habitual para la conversin de-grados Celsius a
grados Fahrenheit: f = 9/5 * c + 32. Podramos escribir

double dc;
cin >> dc;
doble df = 9/5 * dc +32; // tener cuidado!

Por desgracia, pero muy lgicamente, esto no representa una conversin exacta escala de
temperatura: el valor de 9/5 es 1 en lugar de la 1.8 que podra haber esperado. Para obtener el cdigo
matemticamente correcto, 9 o 5 (o ambos) tendr que ser cambiado en un double. Por ejemplo:

double dc;
cin >> dc;
double df = 9,0 / 5 * dc + 32; // mejor
4.4 declaraciones

Una expresin calcula un valor de un conjunto de operandos utilizando operadores como las
mencionadas en el 4.3. Qu hacemos cuando queremos producir varios valores? Cuando queremos
hacer algo que muchas veces? Cuando queremos elegir entre varias alternativas? Cuando queremos
obtener la entrada o salida de producir? En C ++, como en muchos idiomas, utiliza las construcciones
del lenguaje llamados declaraciones para expresar esas cosas.

Hasta ahora hemos visto dos tipos de enunciados: declaraciones de expresin y declaraciones. Una
expresin es simplemente una expresin seguida de un punto y coma. Por ejemplo:

a = b;
++b;

Esas son dos declaraciones de expresin. Tenga en cuenta que la asignacin = es un operador de
manera que a = b es una expresin y necesitamos el punto y coma final para hacer a = b; una
declaracin. Por qu necesitamos esos puntos y comas? La razn es en gran medida tcnica.
Considerar:

a = b ++ b; //error de sintaxis: falta punto y coma

Sin el punto y coma, el compilador no sabe si queremos decir a = b ++; segundo; O a = b;


++ b ;. Este tipo de problema no se limita a los lenguajes de la computadora; Considere la
exclamacin "hombre comiendo tigre!" Quin est comiendo a quin? La puntuacin
existe para eliminar tales problemas, por ejemplo, "tigre devorador de hombres!"

Cuando los estados siguen unos a otros, el ordenador las ejecuta en el orden en el que se escriben.
Por ejemplo:

int a = 7;
cout << a << '\ n';

Aqu la declaracin, con su inicializacin, se ejecuta antes de la expresin de salida declaracin.

En general, queremos una declaracin para tener algn efecto. Declaraciones sin efecto suelen ser
intiles. Por ejemplo:

1 + 2; //hacer una adicin, pero no utilice la


suma
a * b; //hacer una multiplicacin, pero no
utilice el producto

Tales declaraciones sin efectos suelen ser errores lgicos, y los compiladores advierten a menudo en
contra de ellos. Por lo tanto, las declaraciones de expresin son tpicamente asignaciones, I / O de
declaraciones o llamadas a funciones.

Mencionaremos un tipo ms de la declaracin: la "declaracin vaca." Considere el cdigo:

si (x == 5);
{y = 3; }

Esto parece un error, y es casi seguro que lo es. Los ; En la primera lnea no se supone que est all.
Pero, por desgracia, esto es una construccin legal en C + +. Se llama una declaracin vaca, una
declaracin que no hace nada. Una declaracin vaca antes de un punto y coma es rara vez til. En este
caso, tiene la desafortunada consecuencia de permitir que el que es casi seguro un error sea aceptable
para el compilador, por lo que no le alertar del error y tendr mucha ms dificultad para encontrarlo.
Qu suceder si se ejecuta este cdigo? El compilador probar x para ver si tiene el valor 5. Si esta
condicin es verdadera, se ejecutar la siguiente sentencia (la sentencia vaca), sin efecto. A
continuacin, el programa contina a la siguiente lnea, asignando el valor 3 a y (que es lo que quera
que sucediera si x es igual a 5). Si, por otro lado, x no tiene el valor 5, el compilador no ejecutar la
sentencia vaca (an sin efecto) y continuar como antes para asignar el valor 3 a y (lo cual no es lo que
quera que sucediera A menos que x sea igual a 5). En otras palabras, la afirmacin if no importa; Y va
a obtener el valor 3 independientemente. Este es un error comn para los programadores principiantes,
y puede ser difcil de detectar, as que ten cuidado con l.

La siguiente seccin se dedica a las declaraciones utilizadas para alterar el orden de la evaluacin para
permitirnos expresar clculos ms interesantes que los que obtenemos con slo ejecutar declaraciones
en el orden en que fueron escritas.

4.4.1 Seleccin
En los programas, como en la vida, a menudo tenemos que seleccionar entre alternativas. En
C ++, esto se hace utilizando una instruccin if o una instruccin switch.

4.4.1.1 declaraciones-if

La forma ms simple de seleccin es una sentencia if, que selecciona entre dos alternativas.
Por ejemplo:

int main ()
{
int a = 0;
int b = 0;
cout << "Introduzca dos enteros \ n";

cin >> a >> b;

si (a <b) // condicin
// 1 alternativa (tomada si la condicin es verdadera):
cout << "max (" << un << "," << b << ") es" << b << "\ n";

ms
// 2 alternativa (tomada si la condicin es falsa):
cout << "max (" << a << "," << b<< ") es" << a << "\ n";
}

Una declaracin-if elige entre dos alternativas. Si la condicin es verdadera, se ejecuta la primera
instruccin; de lo contrario, la segunda afirmacin es. Esta nocin es simple. La mayora de las
caractersticas bsicas del lenguaje de programacin son. De hecho, la mayora de los servicios
bsicos en lenguaje de programacin son slo nueva notacin para las cosas que ha aprendido en
la escuela primaria - o incluso antes. Por ejemplo, que estaba probablemente contaste en el jardn
de infancia que cruzar la calle en un semforo, haba que esperar a que el semforo se ponga en
verde: "Si el semforo est en verde, va" y "Si el semforo est en rojo, espere. "En C ++ que se
convierte en algo as como

si (traffic_light == verde) ir ( );

si (traffic_light == rojo) esperar ();


Por lo tanto, la nocin bsica es simple, pero tambin es fcil de usar if-declaraciones de una manera
demasiado simple de mente. Considere lo que est mal con este programa (aparte de dejar fuera el
#include como de costumbre):

// convertir de pulgadas a centmetros o pulgadas a centmetros


// un sufijo "i" o "c" indica la unidad de la entrada

int main ()
{
constexpr double cm_per_inch = 2,54; // nmero de centmetros en
// una pulgada

double longitud = 1; // longitud en pulgadas o


//centmetros

char unidad = 0;
cout << "Por favor, introduzca una longitud seguida por una unidad (c o i): \ n";
cin >> longitud >> unidad;

if (unidad == 'i')
cout << longitud << "in ==" << cm_per_inch * longitud << "cm \ n";
else
cout << longitud << "cm ==" << longitud / cm_per_inch << "in\ n";

En realidad, este programa funciona aproximadamente como se anuncia: introduzca 1i y se obtiene 1in ==
2,54cm; Entrar 2.54c y obtendr 2.54cm == 1in. Solo intntalo; Es una buena prctica.
El inconveniente es que no probamos la mala entrada. El programa asume que el usuario introduce la entrada
adecuada. La unidad de condicin == 'i' distingue entre el caso en que la unidad es 'i' y todos los dems casos.
Nunca busca un 'c'.

Qu pasa si el usuario ingres 15f (para pies) "slo para ver qu pasa"? La condicin (unidad == 'i') fallara
y el programa ejecutara la parte else (la segunda alternativa), convirtindose de centmetros a pulgadas.
Presumiblemente que no era lo que queramos cuando entramos 'f'.
Siempre debemos probar nuestros programas con entradas "malas", porque alguien eventualmente -
intencionalmente o accidentalmente - entrar mala entrada. Un programa debe comportarse con sensatez
incluso si sus usuarios no lo hacen.

Esta es una versin mejorada:

// convertir de pulgadas a centmetros o pulgadas a centmetros


// un sufijo "i" o "c" indica la unidad de la entrada
// cualquier otro sufijo es un error

int main ()
{
constexpr double cm_per_inch = 2,54; // nmero de centmetros
en
// una pulgada

double longitud = 1; // longitud en pulgadas o


//centmetros
char unidad = ' '; // un espacio no es una unidad
cout << "Por favor, introduzca una longitud seguida por una unidad (c o i): \ n"
; cin >> longitud >> unidad;

si (unidad == 'i')
cout << longitud << "in ==" << cm_per_inch * longitud << "cm \ n";
else if (unidad == 'c')
cout << longitud << " cm == "<< longitud / cm_per_inch <<"in \ n ";
else
cout <<" lo siento, no s una unidad llamada " << unidad <<" "\ n";

Primero probamos la unidad == 'i' y luego la unidad == 'c' y si no es (tampoco) decimos: "Lo siento".
Puede parecer que usamos una sentencia else if, "Pero no hay tal cosa en C ++. En su lugar, hemos
combinado dos sentencias if. La forma general de una sentencia if es

if ( expresin ) declaracin else declaracin

Es decir, un if, seguido de una expresin entre parntesis, seguida de una sentencia seguida de
otra, seguida de una sentencia. Lo que hicimos fue usar una instruccin if como la parte else de
una sentencia if:

if ( expresin ) declaracin else if ( expresin ) declaracin else declaracin

Para nuestro programa que da a esta estructura:

if (unidad == 'i')
... // 1 alternativa
else if (unidad == 'c')
... // 2 alternativa
else
... // 3 alternativa

De esta manera, podemos escribir arbitrariamente complejas pruebas y asociar una declaracin con cada
alternativa. Sin embargo, se recuerda que uno de los ideales de cdigo es simplicidad, en lugar de
complejidad. Usted no demostrar su habilidad al escribir el programa ms complejo. Ms bien, demostrar su
competencia por la escritura cdigo ms simple que hace el trabajo.

PRUEBA ESTO

Utilice el ejemplo anterior como modelo para un programa que convierte yen ('y'), coronas ('k') y
libras ('p') en dlares. Si te gusta el realismo, puedes encontrar las tasas de conversin en la web.
4.4.1.2 La sentencia-swich
En realidad, la comparacin de unidad a 'i' y para 'c' es un ejemplo de los ms comunes de
seleccin: una seleccin basada en la comparacin de un valor contra varias constantes. Dicha
seleccin es tan comn que C ++ proporciona una declaracin especial para l: sentencia-swich.
Podemos reescribir nuestro ejemplo como

int main ()
{
constexpr doble cm_per_inch = 2,54; // nmero de centmetros en
// una pulgada
double longitud = 1; // longitud en pulgadas o
// centmetros
char unidad = 'a';
cout << "Por favor, introduzca una longitud seguida por una unidad (c o i): \ n";
cin >> longitud >> unidad;
swich (unidad) {
case 'i':
cout << longitud << "in ==" << cm_per_inch * longitud << "cm \ n";
break;
case 'c':
cout<< longitud << "cm ==" << longitud / cm_per_inch << in"\ n";
brak;
default:
cout <<" lo siento, no s una unidad llamada " << unidad <<" "\ n";
break;

}
}

La sintaxis de la sentencia switch es arcaica pero an ms clara que las sentencias if anidadas,
especialmente cuando comparamos muchas constantes. El valor presentado entre parntesis
despus del swich se compara con un conjunto de constantes. Cada constante es presentado como
parte de una etiqueta de caso. Si el valor es igual a la constante en una etiqueta de caso, se elige
la sentencia para ese caso. Cada caso se termina por una pausa. Si el valor no coincide con ninguna
de las etiquetas de caso, se elige la sentencia identificada por la etiqueta predeterminada. No tiene
que proporcionar un valor predeterminado, pero es una buena idea hacerlo a menos que est
absolutamente seguro de que ha enumerado todas las alternativas. Si usted no sabe ya, la
programacin le ensear que es duro ser absolutamente seguro (y derecho) sobre cualquier cosa.

4.4.1.3 cambiar los aspectos tcnicos

Estos son algunos detalles tcnicos sobre la sentencia-switch:


1. El valor en el que cambiamos debe ser de tipo entero, char o enumeracin (9.5). En particular,
no puede activar una cadena.
2. Los valores en las etiquetas de caso deben ser expresiones constantes (4.3.1). En particular, no
puede utilizar una variable en una etiqueta de caso.
3. No puede utilizar el mismo valor para dos etiquetas de caso.
4. Puede utilizar varias etiquetas de caso para un solo caso.
5. No olvide terminar cada caso con un descanso. Desafortunadamente, el compilador
probablemente no te avisar si te olvidas.

Por ejemplo:

int main () // puede cambiar slo en nmeros enteros, etc.


{
cout << "Le gusta el pescado \ n?";
strin s;
cin >> s;
switch (s) { // Error: el valor debe ser de nmero entero, char, o tipo de
enumeracin
caso no":
//. . .
break;
caso "s":
// . . .
break;

}
}

Para seleccionar basndonos en una cadena debemos usar una instruccin if o un mapa (Captulo
21).
Una instruccin switch genera cdigo optimizado para comparar con un conjunto de constantes.
Para conjuntos ms grandes de constantes, esto tpicamente produce un cdigo ms eficiente que
una coleccin de declaraciones if. Sin embargo, esto significa que l os valores de la etiqueta de
caso deben ser constantes y distintos. Por ejemplo:

int main () // las etiquetas de caso deben ser constantes


{
// definir alternativas:
int y = 'y'; //esto va a causar problemas
constexpr char n = n ';
constexpr Char m= '? ';
cout << "No te gusta el pescado? \ n";
char a;
cin >> a;
switch (a) {
case n:
//. . .
break;
case y: \\ error: variable en la etiqueta case
// . . .
break;
case m:
// . . .
break;
case 'n': // Error: etiqueta de la caja duplicado (el valor de n es 'n')
// . . .break;

default:
// . . .
break;

}
}

A menudo, desea la misma accin para un conjunto de valores en un switch. Sera tedioso repetir
la accin para que pueda etiquetar una sola accin mediante un conjunto de etiquetas de caso.
Por ejemplo:

int main () // puede etiquetar un comunicado con varias etiquetas de caso


{
cout << "Por favor, introduzca un
dgito \n"; char a;
cin >> a;

switch (a) {
case '0': case '2': case '4': case '6': case '8':
cout << "es an \ n";
break;
case '1': case '3 ': case' 5 ': case'7 ': case' 9 ':
cout << "es impar \ n";
break;
defoult:
cout << "no es un dgito \ n";
break;

}
}

El error ms comn con las sentencias switch es olvidar terminar un caso con un break. Por ejemplo:

int main () // ejemplo de cdigo malo (un descanso falta)


{
constexpr doble cm_per_inch = 2,54; // nmero de centmetros en
// una pulgada
double longitud = 1; // longitud en pulgadas o
//centmetros

char unidad = 'a';

cout << "Por favor, introduzca una longitud seguida por una unidad (c o i): \
n";

cin >> longitud >> unidad;


switch (unidad) {

case 'i':
cout << longitud << "in ==" << cm_per_inch * longitud << "cm \ n";
caso 'c':
cout << longitud << "cm ==" << longitud / cm_per_inch << "in \ n";

}
}

Por desgracia, el compilador aceptar esto, y cuando haya terminado el caso 'i' usted solo "caer" en
el caso 'c', de modo que si introduce 2i el programa saldr

2in== 5.08cm
2cm== 0.787402in

Usted ha sido advertido!

PRUEBA ESTO

Vuelva a escribir su programa de conversin de moneda de la anterior Prueba esto utilizar una
sentencia - switch. Aadir conversiones de yuanes y coronas. Qu versin del programa es ms fcil
escribir, entender y modificar? Por qu?

4.4.2 La iteracin
Rara vez hacemos algo slo una vez. Por lo tanto, los lenguajes de programacin ofrecen formas
convenientes de hacer algo varias veces. Se llama repeticin o - especialmente cuando se hace algo a
una serie de elementos de una estructura de datos - iteracin.

4.4.2.1 sentencia-while

Como ejemplo de iteracin, considerar el primer programa para ejecutarse en un ordenador con
programa almacenado (el EDSAC). Fue escrita y dirigida por David Wheeler en el laboratorio de
informtica en la Universidad de Cambridge, Inglaterra, el 6 de mayo de 1949, para calcular e
imprimir una simple lista de plazas como esta:

0 0
1 1
2 4
3 9
4 16

...
98 9604
99 9801

Cada lnea es un nmero seguido de un carcter "tab" ('\ t'), seguido del cuadrado del nmero. Una
versin de C ++ se ve as:
// calcular e imprimir una tabla de cuadrados 0-99
int main ()
{
int i = 0; //empezar desde 0
while (i <100) {
cout << i << '\ t' <<square (i) << '\ n';
++ i; //se incrementa i (es decir, I se convierte en i + 1)
}
}

El cuadrado de notacin (i) significa simplemente el cuadrado de i. Ms adelante explicaremos cmo


llega a significar eso (4.5).

No, este primer programa moderno no fue realmente escrito en C ++, pero la lgica fue como se
muestra a continuacin:

Comenzamos con 0.
Vemos si hemos alcanzado los 100, y si es as estamos terminados.
De lo contrario, imprimimos el nmero y su cuadrado, separados por una pestaa ('\ t'),
aumentamos el nmero e intentamos de nuevo.

Es evidente que, para ello, se requiere

Una manera de repetir alguna instruccin (a bucle)


Una variable para mantener un registro de cuntas veces hemos pasado por el bucle (una
variable de bucle o una variable de control), aqu el int llamado i
Un inicializador para la variable de bucle, aqu 0
Un criterio de terminacin, aqu que queremos pasar por el bucle 100 veces
Algo que hacer cada vez alrededor del bucle (el cuerpo del bucle)

La construccin del lenguaje que usamos se denomina sentencia-while. Siguiendo su palabra clave
distintiva, mientras que, tiene una condicin "en la parte superior" seguido de su cuerpo:

while (i <100) // la condicin de bucle probar la variable de bucle i


{
cout << i << '\ t' << square (i) << '\ n';
++ i; // incrementar la variable de bucle i
}

El cuerpo de bucle es un bloque (delimitado por llaves) que escribe una fila de la tabla e incrementa la variable
de bucle, i. Comenzamos cada paso a travs del bucle probando si i <100. Si es as, todava no hemos terminado
y podemos ejecutar el cuerpo del bucle. Si hemos llegado al final, es decir, si i es 100, dejamos la sentencia while
y ejecutamos lo que viene a continuacin. En este programa el final del programa es el siguiente, as que dejamos
el programa.

La variable de bucle para una sentencia while debe definirse e inicializarse fuera (antes) de la sentencia while.
Si no lo definimos, el compilador nos dar un error. Si lo definimos, pero no lo inicializamos, la mayora de
los compiladores nos advierten, diciendo algo como "variable local no establecida", pero estaran dispuestos a
permitirnos ejecutar el programa si insistimos. No insista! Los compiladores casi ciertamente tienen razn
cuando advierten acerca de las variables no inicializadas. Las variables no inicializadas son una fuente comn
de errores. En este caso, escribimos.

int i = 0; // empezar desde 0


as que todo est bien.

Bsicamente, escribir un bucle es simple. Hacer las cosas bien para los problemas del mundo real
puede ser complicado, sin embargo. En particular, puede ser difcil de expresar la condicin correcta
y para inicializar todas las variables para que el bucle se inicia correctamente.

PREUBA ESTO

El carcter 'b' es char ('a' + 1), 'c' es char ('a' + 2), etc. Utilice un bucle para escribir una tabla de
caracteres con sus correspondientes valores enteros:

a 97
b 98

...
z 122

4.4.2.2 Bloques

Tenga en cuenta cmo agrupamos las dos declaraciones que el tiempo tena que ejecutar:

while (i <100) {
cout << i << '\ t' << square (i) << '\n';

++ i; // se incrementa i (es decir, I se convierte en i + 1)


}

Una secuencia de enunciados delimitados por llaves {y} se denomina bloque o declaracin
compuesta. Un bloque es una clase de declaracin. El bloque vaco {} es a veces til para
expresar que no hay nada que hacer. Por ejemplo:

si (a <= b) { // hacer nada


}
else { // swap de a y b
int t = a;
a = b;
b = t;

4.4.2.3 sentencia-for

Iterar sobre una secuencia de nmeros es tan comn que C ++, como la mayora de los otros lenguajes de
programacin, tiene una sintaxis especial para ello. Un sentencia-for es como un sentencia-while excepto
que la gestin de la variable de control se concentra en la parte superior, donde es fcil de ver y entender.
Podramos haber escrito el "primer programa" de esta manera:
// calcular e imprimir una tabla de cuadrados 0-99
int main ()
{
for (int i = 0; i <100; ++ i)
cout << i << '\ t' << square (i) << '\n';

Esto significa "Ejecutar el cuerpo con i empezando en 0 incrementando i despus de cada ejecucin
del cuerpo hasta llegar a 100." Una sentencia for siempre es equivalente a alguna sentencia while.
En este caso

for (int i = 0; i <100; ++ i)


cout << i << '\ t' << square (i) << '\ n';

medio

{
int i = 0; // el inicializador para la declaracin
while (i <100) { // la condicin para-declaracin
cout << i << '\ t' << cuadrado (i) << '\ n'; //el cuerpo para la declaracin
++ i; // el incremento para la declaracin
}
}

Algunos novicios prefieren las declaraciones mientras-y algunos novicios prefieren para declaraciones.
Sin embargo, el uso de una sentencia for produce un cdigo ms fcil de entender y ms mantenible cada
vez que un bucle puede definirse como una instruccin for con un simple inicializador, una condicin y
una operacin de incremento. Utilice una sentencia while slo cuando ese no es el caso.

Nunca modifique la variable loop dentro del cuerpo de una sentencia for. Eso podra violan la suposicin
razonable de cada lector acerca de lo que est haciendo un bucle. Considerar:

int main ()
{
for (int i = 0; i <100; ++ i) { // para i en el [0: gama 100)
cout << i << '\ t' << square (i) << '\ n';
++ i; //Que est pasando aqui? Huele a un error!
}
}

Cualquier persona mirando este bucle razonablemente asumira que el cuerpo sera ejecutado
100 veces. Sin embargo, no lo es. El ++ i en el cuerpo asegura que i se incrementa dos veces
cada vez alrededor del bucle para que obtengamos una salida slo para los 50 valores pares
de i. Si vemos tal cdigo, asumiremos que es un error, probablemente causado por una
conversin descuidada de una sentencia while. Si desea incrementar en 2, diga:
// calcular e imprimir una tabla de los cuadrados de los nmeros pares en el [0: gama 100)
int main ( )
{
for (int i = 0; i <100; i + = 2)
cout << i << '\ t' << square (i) << '\ n';

Tenga en cuenta que la versin ms limpia, ms explcito es ms corto que el desordenado. Eso es
tpico.

PRUEBA ESTO

Reescribir el ejemplo valor de carcter de la anterior Prueba esto utilizar una declaracin-for. Luego
modifique su programa para escribir tambin a cabo una mesa de los valores enteros de letras
maysculas y cifras.

Tambin hay un "rango-por-lazo" ms simple para atravesar colecciones de datos, tales como
vectores; Vase 4.6.

4.5 Funciones

En el programa anterior, qu era cuadrado (i)? Es una llamada de una funcin. En particular, es
una llamada de la funcin llamada cuadrada con el argumento i. Una funcin es una secuencia
con nombre de sentencias. Una funcin puede devolver un resultado (tambin llamado valor de
retorno). La biblioteca estndar proporciona muchas funciones tiles, como la funcin raz
cuadrada sqrt () que usamos en 3.4. Sin embargo, escribimos muchas funciones nosotros
mismos. Aqu hay una definicin plausible de cuadrado:

int square (int x) // devolver el cuadrado de x


{
return x * x;
}
La primera lnea de esta definicin nos dice que esto es una funcin (que es lo que significan los parntesis),
que se llama cuadrado, que toma un argumento int (aqu, llamado x), y que devuelve un int (el tipo de El
resultado siempre viene primero en una declaracin de funcin); Es decir, podemos usarlo as:

int main ()
{
cout << cuadrado (2) << '\ n'; // 4 de la impresin
cout << cuadrada (10) << '\ n'; // imprimir 100
}

No tiene que utilizar el resultado de una llamada a la funcin, pero s tiene que dar una funcin con
exactitud los argumentos que requiere. Considerar:

cuadrado (2); // probablemente un error: valor de retorno no utilizada


int v1 = cuadrado (); // de error: argumento que
falta int v2 = cuadrado; // de error: parntesis
que faltan int v3 = cuadrado (1,2); // Error:
demasiados argumentos
int v4 = cuadrado ( "dos"); // Error: tipo incorrecto de argumentos - int esperado

Muchos compiladores advierten contra los resultados no utilizados, y todos dan errores como se indica.
Usted podra pensar que un equipo debe ser lo suficientemente inteligente como para averiguar que por
la cadena "dos" que realmente significaba el entero 2. Sin embargo, un compilador de C + +
deliberadamente no es tan inteligente. Es tarea del compilador hacer exactamente lo que usted le dice
que haga despus de verificar que su cdigo est bien formado de acuerdo con la definicin de C ++.

Si el compilador adivin lo que quera decir, ocasionalmente se equivocara, y usted o los usuarios de
su programa estaran muy molestos. Lo encontrar bastante difcil de predecir lo que har su cdigo sin
tener que el compilador "le ayudar" por qu las conjeturas.

el cuerpo de la funcin es el bloque (4.4.2.2) que en realidad hace el trabajo.

{
return x * x; // devolver el cuadrado de x
}

por square, El trabajo es trivial: producimos la plaza del argumento y el retorno que a medida que nuestro
resultado. Diciendo que en C ++ es ms fcil que decir que en Ingls. Eso es tpico para las ideas simples.
Despus de todo, un lenguaje de programacin est diseada para exponer ideas tan simples sencilla y
precisa.

La sintaxis de una definicin de la funcin se puede describir as:

Identificador de tipo (parmetro de la lista) la funcin del cuerpo

Es decir, un tipo (el tipo de retorno), seguido de un identificador (el nombre de la funcin), seguido de
una lista de parmetros entre parntesis, seguido por el cuerpo de la funcin (los estados a ejecutar). La
lista de argumentos requeridos por la funcin se llama una lista de parmetros y sus elementos se llaman
parmetros (o argumentos formales). La lista de parmetros puede estar vaca, y si no queremos para
devolver un resultado que damos void (Que significa "nada") como el tipo de retorno. Por ejemplo:

write_sorry void () // tomar ningn argumento; devolver ningn valor


{
cout << "Lo sentimos \ n";
}

Los aspectos del lenguaje tcnico de las funciones sern examinados ms de cerca en el captulo 8.

4.5.1 Por qu molestarse con las funciones?

Definimos una funcin cuando queremos un cmputo separado con un nombre, ya que hacerlo

Hace que el cmputo lgicamente separar


Hace que el texto del programa ms claro (nombrando el clculo)
Hace posible el uso de la funcin en ms de un lugar en nuestro programa

Facilita las pruebas


Veremos muchos ejemplos de cada una de esas razones a medida que avanzamos, y ocasionalmente
mencionaremos una razn. Tenga en cuenta que los programas del mundo real utilizan miles de
funciones, algunas incluso cientos de miles de funciones. Obviamente, nunca seramos capaces de
escribir o entender tales programas si sus partes (por ejemplo, los clculos) no estuvieran claramente
separadas y nombradas. Adems, pronto descubrir que muchas funciones son tiles repetidamente
y pronto se cansara de repetir cdigo equivalente. Por ejemplo, podras estar feliz escribiendo x * x
y 7 * 7 y (x + 7) * (x + 7), etc. en lugar de cuadrado (x) y cuadrado (7) y cuadrado (x + 7), etc. Sin
embargo, eso es slo porque cuadrado es un clculo muy simple. Considere la raz cuadrada (llamada
sqrt en C ++): prefiere escribir sqrt (x) y sqrt (7) y sqrt (x + 7), etc. en lugar de repetir el cdigo
(algo complicado y muchas lneas) para calcular la raz cuadrada. Incluso mejor: usted no tiene que
siquiera mirar el clculo de la raz cuadrada porque saber que sqrt (x) da la raz cuadrada de x es
suficiente.

En el 8.5 abordaremos muchos aspectos tcnicos de las funciones, pero por ahora,
Dar otro ejemplo.

Si hubiramos querido hacer el bucle en main () realmente simple, podramos haber escrito

void print_square (int v)


{
cout << v << '\ t' << v * v << '\ n';
}

int main ()
{
for (int i = 0; i <100; ++ i) print_square (i);
}

Por qu no usamos la versin usando print_square ()? Esa versin no es significativamente ms


simple que la versin usando square (), y tenga en cuenta que

print_square () es una funcin bastante especializada que no podramos esperar usar ms


tarde, mientras que square () es un candidato obvio para otros usos

square () apenas requiere documentacin, mientras que print_square () obviamente


necesita explicacin

La razn subyacente para ambos es que print_square () realiza dos acciones lgicamente separadas:

Se imprime.
Se calcula un cuadrado.

Los programas suelen ser ms fciles de escribir y comprender si cada funcin realiza una
sola accin lgica. Bsicamente, la versin square () es el mejor diseo.

Por ltimo, por qu utilizamos square (i) en lugar de simplemente i * i en la primera


versin del problema? Bueno, uno de los propsitos de las funciones es simplificar el
cdigo separando los clculos complicados como funciones nombradas, y para la versin
de 1949 del programa no haba hardware que implement directamente "multiplicar". En
consecuencia, en la versin de 1949 del programa, i * i en realidad era un clculo bastante
complicado, similar al que haras a mano usando un pedazo de papel. Adems, el escritor
de esa versin original, David Wheeler, fue el inventor de la funcin (entonces llamada
subrutina) en la informtica moderna, por lo que pareca apropiado usarla aqu.
PRUEBA ESTO

Implementar square () sin utilizar el operador de multiplicacin; Es decir, hacer x * x por adicin repetida
(iniciar un resultado variable en 0 y aadir x a x veces). A continuacin, ejecute una versin de "el primer
programa" utilizando ese square ().

4.5.2 Las declaraciones de funciones


Se dio cuenta de que toda la informacin necesaria para llamar a una funcin estaba en la primera
lnea de su definicin? Por ejemplo:

int square (int x)

Teniendo en cuenta que, sabemos lo suficiente como para decir

int x = square (44);


Realmente no necesitamos mirar el cuerpo de la funcin. En programas reales, en la mayora de los
casos no queremos ver un cuerpo funcional. Por qu queremos ver el cuerpo de la funcin sqrt () de la
biblioteca estndar? Sabemos que calcula la raz cuadrada de su argumento. Por qu querramos ver el
cuerpo de nuestra funcin square ()? Por supuesto que slo podra ser curioso. Pero casi todo el tiempo,
slo estamos interesados en saber cmo llamar a una funcin - ver la definicin sera slo distraer.
Afortunadamente, C ++ proporciona una forma de proporcionar esa informacin separada de la
definicin completa de la funcin. Se llama una declaracin de funcin:

int cuadrado (int); // declaracin de la plaza


doble sqrt (double); //declaracin de sqrt

Tenga en cuenta los puntos y comas de terminacin. Un punto y coma se utiliza en una declaracin
de la funcin en lugar del cuerpo usado en la definicin de la funcin correspondiente:

int square (int x) // definicin de cuadrado


{
return x * x;
}

Por lo tanto, si slo desea utilizar una funcin, simplemente escribe - o ms comnmente # include-
su declaracin. La definicin de la funcin puede estar en otra parte. Discutiremos dnde podra estar
ese "otro lugar" en 8.3 y 8.7. Esta distincin entre declaraciones y definiciones se vuelve esencial
en programas ms grandes donde usamos declaraciones para mantener la mayor parte del cdigo
fuera de la vista para permitirnos concentrarnos en una sola parte de un programa a la vez (4.2).

4.6 vector

Para hacer casi cualquier cosa de inters en un programa, necesitamos un conjunto de datos para
trabajar. Por ejemplo, puede ser que necesite una lista de nmeros de telfono, una lista de
miembros de un equipo de ftbol, una lista de cursos, una lista de libros ledos en el ltimo ao, un
catlogo de canciones para descargar, un conjunto de opciones de pago para un coche, una lista de
los pronsticos meteorolgicos para la prxima semana, una lista de precios para una cmara en
diferentes tiendas web, etc. Las posibilidades son literalmente infinitas y por lo tanto ubicuas en los
programas. Vamos a ver una variedad de formas de almacenar colecciones de datos (una variedad
de contenedores de datos, vea los Captulos 20 y 21). Aqu comenzaremos con una de las maneras
ms simples, y posiblemente ms tiles, de almacenar datos: un vector.
Un vector es simplemente una secuencia de elementos a los que puede acceder mediante un ndice.
Por ejemplo, aqu hay un vector llamado v:

size()
v: 6
v [0] v [1] v [2] v [3] v [4] v [5]
elementos v's: 5 7 9 4 6 8

Es decir, el primer elemento tiene ndice 0, el segundo ndice 1 y as sucesivamente. Nos referimos
a un elemento mediante el subndice del nombre del vector con el ndice del elemento, as que aqu
el valor de v [0] es 5, el valor de v [1] es 7, y as sucesivamente. Los ndices para un vector
comienzan siempre con 0 y aumentan en 1. Esto debera parecer familiar: el vector de biblioteca
estndar es simplemente la versin de la biblioteca estndar de C ++ de una idea antigua y bien
conocida. He dibujado el vector para enfatizar que "conoce su tamao"; Es decir, un vector no slo
almacena sus elementos, sino que tambin almacena su tamao.
Podramos hacer un vector como este:

vector <int> v = {5, 7, 9, 4, 6, 8}; // vectorial de 6 enteros

Vemos que para hacer un vector necesitamos especificar el tipo de los elementos y el conjunto inicial
de elementos. El tipo de elemento viene despus de vector en corchetes angulares (< >), aqu <int>.
Aqu hay otro ejemplo:

vector <string> filsofo

= { "Kant", "Platn", "Hume", "Kierkegaard"}; //vector de 4 cuerdas

Naturalmente, un vector slo aceptar elementos de su tipo de elemento declarado:

filsofo [2] = 99; // error: intentar asignar un int en una cadena


v [2] = "Hume"; // error: tratar de asignar una cadena a un int

Tambin podemos definir un vector de un tamao dado sin especificar los valores de los elementos. En ese
caso, usamos la notacin (n) donde n es el nmero de elementos, y los elementos reciben un valor
predeterminado segn el tipo de elemento. Por ejemplo:

vector <int> vi (6); // vectorial de 6 enteros inicializa a 0


vector <string> vs (4); // vector de 4 cuerdas inicializado a ""

La cadena sin caracteres "" se llama cadena vaca.


Tenga en cuenta que no puede simplemente referirse a un elemento inexistente de un vector:

vi [20000] = 44; // en tiempo de ejecucin de error

Vamos a discutir los errores de tiempo de ejecucin y los subndices en el siguiente captulo.
4.6.1 Recorrido de un vector

Un vector "conoce" su tamao, por lo que podemos imprimir los elementos de un vector como este:

vector <int> v = {5, 7, 9, 4, 6, 8};


for (int i = 0; i <v.size (); ++ i)
cout << v [i] << '\ n';

La llamada v.size () da el nmero de elementos del vector llamado v. En general, v.size () nos
da la capacidad de acceder a elementos de un vector sin referirse accidentalmente a un elemento
fuera del rango del vector. El rango de un vector v es [0: v. size()). Esa es la notacin matemtica
para una secuencia semiabierta de elementos. El primer elemento de v es v [0] y el ltimo v
[v.size () - 1]. Si v.size () == 0, v no tiene elementos, es decir, v es un vector vaco. Esta nocin
de secuencias semiabiertas se utiliza en C ++ y la biblioteca estndar C ++ (17.3, 20.3).

El lenguaje aprovecha la nocin de una secuencia semiabierta para proporcionar un bucle simple
sobre todos los elementos de una secuencia, como los elementos de un vector. Por ejemplo:

vector <int> v = {5, 7, 9, 4, 6, 8};


for (int x : v) //para cada x en v
cout<< x << '\ n';

Esto se llama rango-por-lazo porque el rango de la palabra se usa a menudo para significar el = igual
que "secuencia de elementos". Leemos para (int x: v) como "para cada int x en v" y el significado
de El bucle es exactamente como el bucle equivalente sobre los subndices [0: v. tamao()).
Utilizamos el rango para el lazo para los lazos simples sobre todos los elementos de una secuencia
que mira un elemento a la vez. Los bucles ms complicados, como mirar cada tercer elemento de un
vector, mirar slo la segunda mitad de un vector, o comparar elementos de dos vectores, usualmente
se hacen mejor utilizando la declaracin tradicional ms complicada y ms general (4.4 .2.3).

4.6.2 Crecimiento de una vector

A menudo, empezamos un vector vaco y crecemos a su tamao deseado mientras leemos o calculamos
los datos que queremos en l. La operacin clave aqu es push_back (), que aade un nuevo elemento a
un vector. El nuevo elemento se convierte en el ltimo elemento del vector. Por ejemplo:

vector <double> v; // comenzar el vaco; es decir, v no tiene elementos

v: 0

v.push_back (2.7); //aadir un elemento con el valor 2,7 en el extremo ( la parte de atrs") de v
// v ahora tiene un elemento y v [0] ==
2.7

V: 1 2.7

v.push_back (5.6); // aadir un elemento con el valor 5.6 al final del v


// v ahora cuenta con dos elementos y v [1] == 5.6

v: 2 2.7 5.6

v.push_back (7,9); //aadir un elemento con el valor 7.9 al final del v


// v ahora tiene tres elementos y v [2] == 7.9

v: 3 2.7 5.6 7.9


Anote la sintaxis de una llamada de push_back (). Se llama una llamada de funcin de miembro;
Push_ back () es una funcin miembro de vector y debe ser llamado usando esta notacin de puntos:

Miembro de la funcin de llamar a:


nombre del objeto.miembro-nombre-funcin ( argumento de la lista )

El tamao de un vector se puede obtener mediante una llamada a otra de las funciones miembro
del vector: size (). Inicialmente v.size () fue 0, y despus de la tercera llamada de push_back (),
v.size () se ha convertido en 3.

Si usted ha programado antes, notar que un vector es similar a una matriz en C y otros lenguajes.
Sin embargo, no es necesario especificar el tamao (longitud) de un vector con antelacin, y puede
agregar tantos elementos como desee. A medida que avancemos, veremos que el vector estndar
de C ++ tiene otras propiedades tiles.

4.6.3 Un ejemplo numrico


Veamos un ejemplo ms realista. A menudo, tenemos una serie de valores que queremos leer en nuestro
programa para que podamos hacer algo con ellos. El "algo" podra estar produciendo un grfico de los
valores, el clculo de la media y la mediana, encontrando el elemento ms grande, ordenndolos,
combinndolos con otros datos, la bsqueda de valores "interesantes", comparndolos con otros
datos, etc.

No hay lmite en el rango de los clculos que podramos realizar en los datos, pero primero necesitar
conseguir en la memoria de nuestro ordenador. Esta es la tcnica bsica para conseguir un
desconocido - cantidad de datos en una computadora - posiblemente grande. Como ejemplo concreto,
se opt por leer en nmeros de coma flotante que representan temperaturas:

// leer algunas temperaturas en un vector


int main ()
{
vector <double> temps; // temperaturas
para (double temp; cin >> temp;) // leer en temp
temps.push_back (temp); // poner la temperatura en el vector
// . . . hacer algo . . .
}

Entonces, qu pasa aqu? Primero declaramos un vector para sostener los datos:

vector <double> temps; // temperaturas

Aqu es donde se menciona el tipo de entrada que esperamos. Leemos y almacenamos dobles. A
continuacin viene el bucle de lectura real:

for (doble temp; cin >> temp;) // leer en temp


temps.push_back (temp); // poner la temperatura en el vector

Definimos una variable temp de tipo double para leer. El cin >> temp lee un double, y ese double
es empujado en el vector (colocado en la parte posterior). Hemos visto esas operaciones individuales
antes. Lo que es nuevo aqu es que usamos la operacin de entrada, cin >> temp, como condicin
para una sentencia for. Bsicamente, cin >> temp es true si un valor se ley correctamente y false de
otra manera, de modo que asignacion-for lea todas las dobles que le damos y se detiene cuando le
damos cualquier otra cosa. Por ejemplo, si escribi

3.4 5.6 7.8 1.2 9.0 |


Entonces temps obtendra los cinco elementos 1.2, 3.4, 5.6, 7.8, 9.0 (en ese orden, por ejemplo, temps [0] ==
1.2). Utilizamos el carcter '|' Para terminar la entrada - cualquier cosa que no es un double se puede utilizar. En
10.6 discutimos cmo terminar la entrada y cmo tratar los errores en la entrada.

Para limitar el alcance de nuestra variable de entrada, temp, al bucle, se utiliz una instruccin for, en lugar
de una sentencia while:

Doubl temp;
while (cin >> temp) // leer
temps.push_back (temp); // poner en el vector
// Temp ... podra ser utilizado aqu ...

Como de costumbre, un bucle for muestra lo que est sucediendo "de frente" para que el cdigo
sea ms fcil de entender y los errores accidentales sean ms difciles de hacer.
Una vez que obtenemos datos en un vector podemos manipularlo fcilmente. Como ejemplo,
calculemos las temperaturas media y mediana:

// calcular la temperatura media y la mediana


int main ()
{
vector <double> temps; // temperaturas
for(doble temp; cin >> temp;) // leer en temp
temps.push_back (temp); // poner la temperatura en el vector

// calcular la temperatura media:


double suma = 0;
for (doubl x: temps) suma + = x;
cout << "Temperatura media:" <<suma / temps.size ( ) << '\ n';

// calcular la temperatura mediana:


sort (temps); //temperaturas ordenar
cout << "Temperatura promedio:" << temps [temps.size ( ) / 2] << '\ n';
}

Calculamos el promedio (la media) simplemente aadiendo todos los elementos a la suma, y luego
dividiendo la suma por el nmero de elementos (es decir, temps.size ()):

// calcular la temperatura media:


double suma = 0;
for ( double x : temps) suma + = x;
cout << "Temperatura media:" << suma / temps.size () << '\ n';

Nota cmo el + = operador viene muy bien.

Para calcular una mediana (un valor elegido de manera que la mitad de los valores sean ms bajos y la otra
mitad sean ms altos) debemos ordenar los elementos. Para ello, utilizamos una variante del algoritmo de
clasificacin de biblioteca estndar, sort ( ):

// calcular la temperatura mediana:


sort (temps); // temperaturas ordenar
cout << "Temperatura promedio:" << temps [temps.size () / 2] << '\ n';
Explicaremos los algoritmos de bibliotecas estndar mucho ms tarde (Captulo 20). Una vez
que las temperaturas se ordenan, es fcil encontrar la mediana: slo elegimos el elemento
medio, el que tiene el ndice temps.size () / 2. Si sientes ganas de ser quisquilloso (y si lo
haces, comienzas a pensar como un programador), podras observar que el valor encontrado
no puede ser una mediana segn la definicin que ofrecemos anteriormente. El ejercicio 2 al
final de este captulo est diseado para resolver ese pequeo problema.

4.6.4 Un ejemplo de texto


No presentamos el ejemplo de temperatura porque estbamos particularmente interesados en
las temperaturas. Muchas personas - como meteorlogos, agrnomos y oceangrafos - estn
muy interesadas en los datos de temperatura y los valores basados en l, como m edios y
medianas. Sin embargo, no lo somos. Desde el punto de vista de un programador, lo interesante
de este ejemplo es su generalidad: el vector y las operaciones simples en l pueden utilizarse
en una amplia gama de aplicaciones. Es justo decir que lo que usted est interesado en, si usted
necesita analizar datos, usted utilizar el vector (o una estructura de datos similar, vea el
captulo 21). Como ejemplo, construyamos un diccionario sencillo:

// Diccionario simple: lista de palabras ordenadas


int main ()
{
vector <string> palabras;
for (string temp; cin >> temp;) // leer palabras separadas por espacios en blanco
words.push_back (temp); // poner en el vector
cout << "Nmero de palabras:" << words.size () << '\ n';

sort (palabras); // ordena las palabras

for (int i = 0; i <words.size (); ++ i)


if (0 == || palabras [i-1]! = palabras [i]) // esta una palabra nueva?
cout<< palabras [i] << "\ n";
}

Si damos de comer a unas palabras para este programa, escribir a cabo con el fin sin repetir una palabra.
Por ejemplo, dada

un hombre de un plan de un canal de Panam

se escribir

un
canal
hombre
panam plan

Cmo detener la lectura de entrada de cadena? En otras palabras, cmo podemos terminar el bucle
de entrada?

for (string temp; cin >> temp;) // leer


words.push_back (temp); // poner en el vector
Cuando leemos los nmeros (en 4.6.2), que acabamos de dar un poco de carcter de entrada que
no era un nmero. No podemos hacer eso aqu porque todos los personajes (ordinaria) se puede leer
en un string. Afortunadamente, hay personajes que son "no ordinario." A medida que los hombres-
cionado en 3.5.1, Ctrl + Z termina una secuencia de entrada en Windows y Ctrl + D hace que bajo
Unix.

La mayor parte de este programa es muy similar a lo que hicimos para la temperatura. De hecho,
escribimos el "programa de diccionario" cortando y pegando desde el "programa de temperatura." La
nica cosa que es nuevo es la prueba

If (i == 0 || palabras [i-1]! = Palabras [i]) // es una palabra nueva?

Si elimin esa prueba la salida sera

un un
un
canal
hombre
panam
plan

No nos gust la repeticin, as que la eliminamos usando esa prueba. Qu hace la prueba? Busca ver
si la palabra anterior que imprimimos es diferente de la que estamos a punto de imprimir (palabras
[i-1]! = Palabras [i]) y si es as, imprimimos esa palabra; De lo contrario, no lo hacemos. Obviamente,
no podemos hablar de una palabra previa cuando estamos para imprimir la primera palabra (i == 0),
por lo que la primera prueba para que y combinar las dos pruebas con el || (O) operador:

if (i == 0 || palabras [i-1]! = Palabras [i]) // es una palabra nueva?

Tenga en cuenta que podemos comparar cadenas. Usamos! = (No es igual) aqu; == (iguales),
<(menor que), <= (menor o igual),> (mayor que), y> = (mayor o igual) tambin funcionan para
cadenas. Los operadores <,>, etc. usan el orden lexicogrfico habitual, por lo que "mono" viene
antes de "manzana" y "Chimpance".

P R U E B A ESTO

Escribir un programa que "bleeps" las palabras que no te gusta; Es decir, se lee en palabras usando
cin e imprima de nuevo en cout. Si una palabra es una de las pocas que ha definido, escribe BLEEP
en lugar de esa palabra. Comience con una "palabra que no le gusta", como

Cadena no me gust = "Brcoli";

Cuando eso funcione, agregue algunos ms.

4.7 Caractersticas del lenguaje

La temperatura y los programas de diccionario utilizaron la mayora de las caractersticas fundamentales


del lenguaje que presentamos en este captulo: iteracin (la instruccin for y asiganacion), la seleccin
(declaracin-if), la aritmtica simple (los operadores ++ y + =) Comparaciones y operadores lgicos (los
operadores ==,! =, Y ||), variables y funciones (por ejemplo, main (), sort () y size ()). Adems, hemos
utilizado las instalaciones de biblioteca estndar, tales como vector (un contenedor de elementos), cout
(un flujo de salida) y sort () (un algoritmo).

Si cuentas, vers que en realidad hemos logrado mucho con muy pocas funciones. Ese es el ideal! Cada
caracterstica del lenguaje de programacin existe para expresar una idea fundamental, y podemos
combinarlas en un enorme (realmente, infinito) nmero de maneras de escribir programas tiles. Esta es
una nocin clave: una computadora no es una tcnica con una funcin fija. En cambio es una mquina
que podemos programar para hacer cualquier clculo que
Puede pensar, y dado que podemos adjuntar ordenadores a tcnica que interactan con el mundo fuera de
la computadora, en principio podemos conseguir que haga cualquier cosa.

Perforar

Ir a travs de este paso a paso de perforacin. No trate de acelerar saltndose pasos. Pruebe cada
etapa mediante la introduccin de al menos tres pares de valores - ms valores seran mejores.

1. Escribir un programa que consiste en un while-loop que (cada vez alrededor del
loop) se lee en dos ints y luego los imprime. Salga del programa cuando
terminando es ingresado.
2. Cambie el programa para escribir el valor ms pequeo es: seguido por el menor
de los nmeros y el valor mayor es: seguido por el mayor valor.
3. Aumentar el programa para que escriba la lnea de los nmeros son iguales (Slo)
si son iguales.
4. Cambie el programa para que utilice dobles en lugar de ints.
5. Cambie el programa para que escriba los nmeros son casi iguales despus de
escribir cul es el ms grande y el ms pequeo si los dos nmeros difieren en
menos de 1,0 / 100.
6. Ahora cambia el cuerpo del bucle para que lea slo un doble cada uno tiempo.
Defina dos variables para realizar un seguimiento de cul es la ms pequea y
que es el mayor valor que ha visto hasta ahora. Cada vez a travs del bucle escribe
el valor ingresado. Si es el ms pequeo hasta ahora, escriba el ms pequeo
hasta ahora despus del nmero. Si es el ms grande hasta ahora, escriba el ms
grande hasta ahora despus del nmero.
7. Agregue una unidad a cada doble entrado; Es decir, introducir valores como 10
cm, 2.5in, 5ft o 3.33m. Acepte las cuatro unidades: cm, m, in, ft. Suponga la
conversin factores 1m == 100 cm, 1in == 2.54cm, 1ft == 12in. Leer la unidad
indicador en una cadena. Usted puede considerar 12 m (con un espacio entre el
nmero y la unidad) equivalente a 12m (sin espacio).
8. Rechazar valores sin unidades o con representaciones "ilegales" de unidades,
tales como y, yarda, metro, kilmetro y galones.
9. Lleve un registro de la suma de los valores introducidos (as como de la ms
pequea mayor) y el nmero de valores introducidos. Cuando termina el bucle,
imprima el ms pequeo, el ms grande, el nmero de valores y la suma de
valores. Nota que para mantener la suma, usted tiene que decidir sobre una unidad
para utilizar para esa suma; Utilizar metros
10. Mantenga todos los valores introducidos (convertidos en metros) en un vector.
Al final, escriba estos valores.
11. Antes de escribir los valores del vector, ordnelos (que los harn salir en orden
creciente)

Revisin

1. Qu es un clculo?
2. Qu se entiende por entradas y salidas a un clculo? Dar ejemplos.
3. Cules son los tres requisitos que un programador debe tener en cuenta a la hora de expresar los
clculos?
4. Qu hace una expresin?
5. Cul es la diferencia entre una declaracin y una expresin, tal como se describe en este
captulo?
6. Qu es un valor-i? Enumerar los operadores que requieren un valor izquierdo. Por qu estos
operadores, y no los otros, requieren un valor-i?
7. Qu es una expresin constante?
8. Qu es un literal?
9. Qu es una constante simblica y por qu las usamos?
10. Qu es una constante mgica? Dar ejemplos.
11. Cules son algunos operadores que podemos utilizar para los nmeros enteros y los valores de
punto flotante?
12. Qu operadores pueden utilizar en nmeros enteros, pero no en los nmeros de punto flotante?
13. Cules son algunos de los operadores que se pueden utilizar para string?
14. Cundo un programador preferira una asignacin-switch a una asignacin- if?
15. Cules son algunos problemas comunes con las declaraciones de switch?
16. Cul es la funcin de cada parte de la lnea de cabecera en un bucle for y en qu secuencia se
ejecutan?
17. Cundo se debe usar el bucle for y cundo se debe usar el bucle while?
18. Cmo se imprime el valor numrico de un carcter?
19. Describa lo que significa la lnea char foo (int x) en una definicin de funcin.
20. Cundo debe definir una funcin separada para parte de un programa? Haga una lista de las
razones.
21. Qu puedes hacer con un int que no puedas hacer con un string?
22. Qu puedes hacer con una cadena que no puedes hacer con un int?
23. Cul es el ndice del tercer elemento de un vector?
24. Cmo se escribe un bucle for que imprime cada elemento de un vector?
25. Qu significa vector <char> alfabeto (26); hacer?
26. Describa lo que push_back () hace a un vector.
27. Qu hacen las funciones miembro del vector begin (), end (), and size () do?
28. Qu hace que el vector sea tan popular / til?
29. Cmo se ordenan los elementos de un vector?

condiciones
abstraccin Rango-de push_back ()
begin() declaracin repeticin
calculo funcin valor seleccin
sentencia condicional asiganacion-if size ()
declaracion incremento sort ()
definicion entrada declaracin-switch
divide y venceras iteracin vector
lazo declaracio-while
else
end() Valor
exprecion Funcin de miembro
declaracin-for Salida

Ceremonias

1. Si an no lo ha hecho, realice los ejercicios Prueba de este captulo.

2. Si definimos la mediana de una secuencia como "un nmero de modo que exactamente como
muchos elementos vienen antes de ella en la secuencia que viene despus de ella", fije el programa
en 4.6.3 para que siempre imprima una mediana. Sugerencia: Una mediana no necesita ser un
elemento de la secuencia.

3. Leer una secuencia de valores dobles en un vector. Piense en cada valor como la distancia entre
dos ciudades a lo largo de una ruta determinada. Calcule e imprima la distancia total (la suma de
todas las distancias). Encuentre e imprima la distancia ms pequea y ms grande en tre dos
ciudades vecinas. Encuentre e imprima la distancia media entre dos ciudades vecinas.
4. Escribe un programa para jugar un juego de adivinanzas de nmeros. El usuario piensa en un
nmero entre 1 y 100 y su programa hace preguntas para averiguar cul es el nmero (por ejemplo,
"Es el nmero que est pensando en menos de 50?"). Su programa debe ser capaz de identificar
el nmero despus de hacer no ms de siete preguntas. Sugerencia: Utilice los operadores <y <=
y la construccin if-else.

5. Escriba un programa que funcione como una calculadora muy simple. Su calculadora debe ser
capaz de manejar las cuatro operaciones matemticas bsicas - sumar, restar, multiplicar y dividir
- en dos valores de entrada. Su programa debe pedirle al usuario que introduzca tres argumentos:
dos valores dobles y un carcter para representar una operacin. Si los argumentos de entrada son
35.6, 24.1 y '+', la salida del programa debe ser La suma de 35.6 y 24.1 es 59.7. En el captulo 6
vemos una calculadora simple mucho ms sofisticada.

6. Hacer un vector que contiene los valores de diez cuerdas "cero", "uno",. . . "nueve". Use eso en
un programa que convierte un dgito en su valor de deletreo correspondiente; Por ejemplo, la
entrada 7 da la salida siete. Tener lo mismo utilizando el mismo bucle de entrada, convertir los nmeros
deletreados en su forma de dgito; Por ejemplo, la entrada 7 da la salida 7.

7. Modifique la "mini calculadora" del ejercicio 5 para aceptar (slo) nmeros de un solo dgito escritos como
dgitos o explicados.

8. Hay una vieja historia que el emperador quera agradecer al inventor del juego de ajedrez y le pidi al
inventor que nombrara su recompensa. El inventor pidi un grano de arroz para el primer cuadrado, 2 para
el segundo, 4 para el tercero, y as sucesivamente, duplicando para cada uno de los 64 cuadrados. Eso puede
sonar modesto, pero no haba mucho arroz en el imperio! Escriba un programa para calcular cuntos
cuadrados se requieren para dar al inventor al menos 1000 granos de arroz, al menos 1.000.000 de granos
y al menos 1.000.000.000 de granos. Usted necesitar un bucle, por supuesto, y probablemente un int para
mantener un registro de cul es el cuadrado en el que est, un int para mantener el nmero de granos en el
cuadrado actual, y un int para mantener un registro de los granos en todas las casillas anteriores . Le
sugerimos que escriba el valor de todas sus variables para cada iteracin del bucle para que pueda ver lo
que est pasando.

9. Trate de calcular el nmero de granos de arroz que el inventor solicit en el ejercicio 8 anterior. Usted
encontrar que el nmero es tan grande que no cabr en un int o un doble. Observe lo que sucede cuando
el nmero es demasiado grande para representar exactamente como un int y como un doble. Cul es el
mayor nmero de cuadrados para los cuales puedes calcular el nmero exacto de granos (usando un int)?
Cul es el mayor nmero de cuadrados para los cuales puedes calcular el nmero aproximado de granos
(usando un doble)?

10. Escriba un programa que juegue el juego "Rock, Paper, Scissors". Si no est familiarizado con el juego,
haga alguna investigacin (por ejemplo, en la web usando Google). La investigacin es una tarea comn
para los programadores. Utilice un switch-statement para resolver este ejercicio. Adems, la mquina debe
dar respuestas aleatorias (es decir, seleccionar la siguiente roca, papel o tijeras al azar). Real aleatoriedad
es demasiado difcil de proporcionar en este momento, por lo que slo tiene que construir un vector con
una secuencia de valores para ser utilizado como "el siguiente valor." Si usted construye el vector en el
programa, siempre jugar el mismo juego, Debe permitir que el usuario introduzca algunos valores. Pruebe
las variaciones para que sea menos fcil para el usuario adivinar qu mover la mquina har a continuacin.

11. Cree un programa para encontrar todos los nmeros primos entre 1 y 100. Una forma de hacerlo es escribir
una funcin que verifique si un nmero es primo (es decir, ver si el nmero puede dividirse por un nmero
primo menor que S mismo) usando un vector de primos en orden (de modo que si el vector se llama
primos, primos [0] == 2, primos [1] == 3, primos [2] == 5, etc.). Luego escribe un bucle que va de 1 a 100,
comprueba cada nmero para ver si es un primo, y almacena cada primo encontrado en un vector. Escribe
otro bucle que enumera los primos que encontraste. Puede comprobar su resultado comparando su vector
de nmeros primos con nmeros primos. Considere 2 la primera prima.

12. Modifique el programa descrito en el ejercicio anterior para tomar un valor de entrada mx. Y luego
encuentre todos los nmeros primos de 1 a mx.

13. Crear un programa para encontrar todos los nmeros primos entre 1 y 100. Hay un mtodo clsico para
hacer esto, llamado el "Tamiz de Eratstenes." Si no conoce ese mtodo, obtener en la web y buscarlo.
Escriba su programa usando este mtodo.
14. Modifique el programa descrito en el ejercicio anterior para tomar un valor mximo de entrada y luego
encuentre todos los nmeros primos de 1 a mx.

15. Escribe un programa que toma un valor de entrada n y luego encuentra los primeros n primos.

16. En el ejercicio, escribi un programa que, dado una serie de nmeros, encontr el mximo y el mnimo
de esa serie. El nmero que aparece ms veces en una secuencia se denomina modo. Cree un programa
que encuentre el modo de un conjunto de enteros positivos.

17. Escriba un programa que encuentre el min, max, y el modo de una secuencia de cadenas.

18. Escribe un programa para resolver ecuaciones cuadrticas. Una ecuacin cuadrtica es de la forma

Ax2 + bx + c = 0
Si usted no conoce la frmula cuadrtica para resolver tal expresin, 2 haga alguna investigacin. Recuerde,
la investigacin de cmo resolver un problema es a menudo necesario antes de que un programador puede
ensear a la computadora cmo resolverlo. Utilice dobles para las entradas de usuario para a, b, y c. Puesto
que hay dos soluciones a una ecuacin cuadrtica, la salida x1 y x2.

19. Escriba un programa en el que introduzca por primera vez un conjunto de pares de nombre y valor, como
Joe 17 y Barbara 22. Para cada par, aada el nombre a un vector llamado nombres y el nmero a un vector
llamado scores (en correspondencia Posiciones, de modo que si los nombres [7] == "Joe" luego las
puntuaciones [7] == 17). Termine la entrada con No Name 0. Compruebe que cada nombre es nico y
termina con un mensaje de error si se introduce un nombre dos veces. Escriba todos los pares (nombre,
puntuacin), uno por lnea.

20. Modifique el programa desde el ejercicio 19 para que al ingresar un nombre, el programa emita el
resultado correspondiente o el nombre no encontrado.

21. Modifique el programa desde el ejercicio 19 para que al ingresar un nmero entero, el programa emita
todos los nombres con esa puntuacin o puntuacin no encontrada.

Posdata

Desde un punto de vista filosfico, ahora se puede hacer todo lo que se puede hacer uso de un ordenador - el
resto es detalles! Entre otras cosas, esto demuestra el valor de "detalles" y la importancia de las habilidades
prcticas, porque claramente usted apenas ha comenzado como programador.

Pero somos serios. Las herramientas presentadas en este captulo te permiten expresar cada clculo: tienes
tantas variables (incluyendo vectores y cadenas) como quieras, tienes aritmtica y comparaciones, y tienes
seleccin e iteracin. Cada clculo se puede expresar usando esas primitivas. Tiene entradas y salidas de
texto y nmeros, y cada entrada o salida puede expresarse como texto (incluso grficos). Incluso puede
organizar sus clculos como conjuntos de funciones con nombre. Lo que queda por hacer es "slo"
aprender a escribir buenos programas, es decir, escribir programas que sean correctos, mantenibles y
razonablemente eficientes. Es importante que usted debe tratar de aprender a hacerlo con una cantidad
razonable de esfuerzo.

You might also like