Академический Документы
Профессиональный Документы
Культура Документы
Los bsicos
2 2
Hola Mundo!
-brian Kernighan
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.
Aqu esta una versin del primer programa clsico. Se escribe "Hola, mundo!" En la pantalla:
# include "std_lib_facilities.h"
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
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.
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!":
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.
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.
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.
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:
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:
{
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:
{
cout << "Hola, mundo \ n;!
return 0;
}
# include "std_lib_facilities.h"
int main ()
{
cout << "Hola, mundo! \ n";
return 0;
}
{
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:
{
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.
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.
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.
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:
# include "std_lib_facilities.h"
#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 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
// Ejecutable main ( )
<< Funcin cdigo de objeto C ++
encabezamiento salida comentario IDE
programa
Compilador #include cdigo fuente
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.
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
-Luis Pasteur
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:
int main ()
{
cout << "Por favor, introduzca su nombre de pila (seguido de" Entrada "): \ 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:
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:
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.
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:
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
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;
int: string:
Numero de pasos : 39 Nombre: Ana Mara
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:
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.
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:
Por lo tanto, si escribes Carlos 22 el operador >> leer Carlos en nombre de pila, 22 en edad, y
producir este resultado:
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";
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;
string
nombre;
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:
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.
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.
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:
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:
Aqu se utiliz una instruccin if, que se explicar en detalle en el 4.4.1.1, para seleccionar
acciones basadas en condiciones.
a: 3
a: 4
int b = a; // b comienza con una copia del valor de una (es decir, 4)
a: 4
b: 4
a: 4
b: 9
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:
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.
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
Esta es la variable de cadena en la que inmediatamente leemos la palabra actual (es decir, ms
recientemente leda) usando
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:
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:
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)
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?)
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
int main ()
}
}
Comenzamos nuestro contador de palabras en 0. Cada vez que vemos una palabra, incrementamos
ese contador:
++ nmero de palabras;
Numero de plabras + = 1;
O inclusive
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
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:
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:
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
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:
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.
int a = 7; a: 7
int b = 9; b: 9
Char c = 'a'; c: a
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:
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.
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
}
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.
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
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).
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:
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:
Cuando el inicializador es un literal entero, el compilador puede comprobar el real valor y aceptar los
valores que no impliquen el estrechamiento:
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?"
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
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?
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
Ejercicios
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.
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
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:
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.
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.
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.
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
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:
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
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:
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:
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:
Una constante simblica constexpr debe tener un valor que se conoce en tiempo de compilacin. Por ejemplo:
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):
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
(Contina
)
Nombre Comentario
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.
++ = 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:
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;
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:
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';
En general, queremos una declaracin para tener algn efecto. Declaraciones sin efecto suelen ser
intiles. Por ejemplo:
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.
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";
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 ( );
int main ()
{
constexpr double cm_per_inch = 2,54; // nmero de centmetros en
// una pulgada
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.
int main ()
{
constexpr double cm_per_inch = 2,54; // nmero de centmetros
en
// una pulgada
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
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 (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.
Por ejemplo:
}
}
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:
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:
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:
cout << "Por favor, introduzca una longitud seguida por una unidad (c o i): \
n";
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
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)
}
}
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.
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:
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.
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';
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:
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
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 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:
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.
{
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.
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:
Los aspectos del lenguaje tcnico de las funciones sern examinados ms de cerca en el captulo 8.
Definimos una funcin cuando queremos un cmputo separado con un nombre, ya que hacerlo
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
int main ()
{
for (int i = 0; i <100; ++ i) print_square (i);
}
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.
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 ().
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:
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:
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:
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:
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:
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:
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).
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:
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: 2 2.7 5.6
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.
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:
Entonces, qu pasa aqu? Primero declaramos un vector para sostener los datos:
Aqu es donde se menciona el tipo de entrada que esperamos. Leemos y almacenamos dobles. A
continuacin viene el bucle de lectura real:
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
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:
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 ()):
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 ( ):
Si damos de comer a unas palabras para este programa, escribir a cabo con el fin sin repetir una palabra.
Por ejemplo, dada
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?
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
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:
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
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
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.