Cómo comenzar

Aprender de los ejemplos

Una de las mejores maneras de aprender a programar en un idioma nuevo es mirar muchísimos programas de ejemplo. Lo mejor que puedes hacer es copiar y pegar cada programa a continuación en un archivo de texto y compilarlo. Luego, prueba los experimentos. Si extiendes estos programas de ejemplo, te familiarizarás con los diferentes aspectos de C++ y tendrás más confianza a la hora de escribir programas desde cero.

Ejemplo 1: Haz que tu compilador funcione

Si aún no lo hiciste, copia y pega el siguiente programa clásico en un archivo de texto y compílalo. Las instrucciones para la compilación están disponibles aquí.

Es probable que hayas trabajado los detalles de este programa en el instructivo, por lo que no proporcionaremos una descripción paso a paso aquí. Sin embargo, debes tener en cuenta algunos aspectos con respecto a la legibilidad. Esto se refiere a los comentarios y el formato que ayudan a que los programas sean fáciles de leer, comprender y mantener.

  • Cada programa que escribimos comienza con un comentario de encabezado, que proporciona el nombre del autor, su información de contacto, una breve descripción y el uso (si corresponde). Cada función comienza con un comentario sobre la operación y el uso.
  • Agregamos comentarios explicativos con oraciones completas, siempre que el código no se documente a sí mismo, por ejemplo, si el procesamiento es complicado, no evidente, interesante o importante.
  • Usa siempre nombres descriptivos: las variables son palabras en minúscula separadas por _, como en my_variable. Los nombres de las funciones usan letras mayúsculas para marcar palabras, como en MyExcitingFunction(). Las constantes comienzan con una "k" y usan letras mayúsculas para marcar palabras, como en kDaysInWeek.
  • La sangría está en múltiplos de dos. El primer nivel consiste en dos espacios. Si se necesita más sangría, se usan cuatro espacios, seis espacios, etcétera.
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

Estos son algunos experimentos que puedes probar:

  • Lo más importante es asegurarte de que puedes compilar y ejecutar este programa.
  • Modifica el programa anterior para imprimir "Hello World!". 4 veces en una línea de 6 líneas, y cada una se imprime en un campo de 17 espacios. Para hacerlo, usa bucles for. Haz clic aquí para obtener información sobre cómo formatear resultados con cout. Haz clic aquí para ver la solución.
  • Con el programa que acabas de completar, descubre cómo imprimir "Hello World!" alineado a la izquierda en los campos de 17 espacios (el valor predeterminado suele estar alineado a la derecha). Haz clic aquí para ver la solución.

Ejemplo 2: Obtén información

Es fácil obtener entradas del teclado en C++ usando cin. A continuación, se muestra un ejemplo:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

Un experimento:

  • Cuando se produce un error de entrada, la transmisión "se interrumpe", cin muestra falso y el programa se detiene. Es muy importante protegerse contra tales errores, como lo hicimos en el programa anterior. Pero ¿qué sucede si queremos recuperarnos del error en lugar de detener el programa? Sigue estos dos pasos para recuperarse de un error:
    1. Borra el error con cin.clear().
    2. Quita los caracteres incorrectos de la transmisión. Una forma de hacerlo es con cin.ignore().

Usa estos dos pasos para escribir un programa que se recupere de entradas incorrectas. Usa Google para buscar cómo funcionan estos métodos. Puedes encontrar nuestra solución aquí.

Ejemplo 3: ¿Cuál es el resultado de este programa?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

Ejemplo 4: Descomponer facilita todo...

Es hora de comenzar a escribir juegos de computadora. La primera será un poco simple, pero es un comienzo. Nuestra tarea es escribir un programa que implemente un juego de adivinanzas. Nuestro programa genera un número aleatorio entre 0 y 100. El jugador debe adivinar el número secreto. El programa brinda sugerencias como "muy alto" o "muy bajo" hasta que el jugador adivina el número secreto.

Trabajaremos en este juego en tres pasos. 

  1. Averigua cómo generar un número al azar dentro de un rango de valores determinado.
  2. Crea una función principal que procese una propuesta del jugador y proporcione sugerencias.
  3. Agrega lo necesario para permitir múltiples intentos hasta que el jugador adivine el número.

Este proceso de desarrollo se denomina descomposición, lo que significa dividir una tarea en subtareas, cada una de las cuales es fácil.

Comenzando por el paso 1, haz una búsqueda en Google para ver cómo generar un número aleatorio con C++. Busca "rand C++". Aquí encontrarás nuestra solución. 

Para el paso 2, necesitamos recibir una entrada de número entero del jugador (con la comprobación de errores adecuada en cin) y verificarla con el número secreto. Intenta escribir esta parte del juego antes de consultar nuestra solución.

Por último, debemos agregar un bucle que siga recopilando las suposiciones del jugador hasta que finalmente adivine el número secreto. Después de completar esta parte del programa, puedes consultar nuestra solución.

La descomposición es una de las habilidades más importantes que debe aprender un programador. Poder dividir una tarea en partes manejables y, luego, completar una a la vez es fundamental, sin importar cuán grande o pequeño sea el proyecto. Estas son algunas otras oportunidades para practicar la descomposición.

  • Muchas tareas cotidianas ofrecen oportunidades para desarrollar habilidades de descomposición. Puede que te sorprenda descubrir que la mente simplemente funciona de esta manera.

    Por ejemplo, si tengo que limpiar una cocina muy desordenada (quizás algunas niñas acaban de cocinar un pastel), divido las tareas para elaborar un plan y para asegurarme de no tener que volver a hacer el trabajo más adelante. No quiero lavar el piso primero si hay todo tipo de cosas en las encimeras para limpiar, probablemente tenga que volver a hacerlo más tarde. Por lo tanto, tal vez primero guarde todos los ingredientes, lleve todos los platos al fregadero, limpie los mostradores, lave los platos y, por último, limpie el piso. Existen otras formas de realizar esta tarea, pero si la planteo primero, me ayuda a definir un plan que no requerirá volver a trabajar.

    Usa las tareas cotidianas como ejemplo para desarrollar tus habilidades de descomposición. ¡Quién sabe! Incluso podría hacerte más eficiente en casa.

  • El máximo común divisor de dos números enteros es el mayor número que los divide de manera uniforme. Por ejemplo, gcd(12, 18) = 6, gcd(−4, 14) = 2. La forma más eficiente de calcular gcd es con el algoritmo euclidiano. Escribe un programa con una función para calcular gcd para dos números enteros. Primero, intenta ejecutar la función sin recursividad. Esto te ayudará a comprender cómo funciona el algoritmo.

    Define de forma explícita tus subtareas; por ejemplo, busca el código del algoritmo euclidiano, crea una función no recursiva para el algoritmo, etc. Aquí está nuestra solución.

Ejemplo 5: Rompecabezas matemáticos

Uno de los poderes de la computación es poder realizar una búsqueda de fuerza bruta para encontrar una solución a un problema. El ensayo y error funciona bien para algunos problemas. De hecho, las computadoras pueden ser especialmente buenas en esos problemas. Considera lo siguiente:

Los caballos cuestan USD 10, los cerdos cuestan USD 3 y los conejos cuestan USD 0.50. Un granjero compra 100 animales por USD 100. ¿Cuántos de cada animal compró? 

Existe una solución muy simple para este problema. Intenta encontrarla antes de ver nuestros.

Aquí tienes otro que puedes probar:
¿De cuántas formas puedes organizar 6 libros diferentes, de izquierda a derecha, en una estantería?

Esta vez, solo te daremos la solución y te dejaremos que escribas el programa: 720.

Ejemplo 6: Cadenas para que consideres

¿Cuál es el resultado del siguiente programa?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

Haz clic aquí para obtener ayuda.

Ejemplo 7: Próximos pasos en la descomposición. Tu primer día en el trabajo

Acabas de obtener un puesto como vendedor en la empresa ExerShoe, que se especializa en calzado para ejercicio de alta gama con un costo de alrededor de USD 225 por par. Tu jefe te dio tres opciones de remuneración, que debes elegir antes de comenzar el primer día:

  1. Salario fijo de USD 600 por semana;
  2. Un salario de USD 7.00 por hora más una comisión del 10% sobre las ventas;
  3. Sin salario, pero un 20% de comisiones y USD 20 por cada par de zapatos vendidos

Como eres un programador experto en C++, descubres que puedes escribir un programa que te ayude a decidir cuál es la mejor opción de compensación.

Un enfoque común al realizar la descomposición de un programa más grande es crear una función principal que se lea como un esquema para resolver el problema. Luego, escribimos las funciones para realizar cada tarea.

Este es un primer pase para el programa principal:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

Antes de ver nuestra solución, procura implementar cada una de estas funciones.

Ejemplo 8: ¿Qué está disponible y dónde?

¿Cuál es el resultado del siguiente programa?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

Una vez que descubras la respuesta, consulta nuestra versión con comentarios del código aquí.

Ejemplo 9: Procesamiento de archivos

El procesamiento de archivos en C++ se realiza mediante fstream. Para guardar en un archivo, declaramos un ofstream y lo abrimos con el modo “out”. Verifica esto en el siguiente ejemplo.

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • Intenta averiguar cómo abrir el archivo que acabas de crear y mostrar los datos.Esta es nuestra solución.
  • Ahora veamos si puedes modificar este programa para permitir que el usuario ingrese muchos registros de datos mediante un bucle. También queremos volver a leer todos los datos, un registro a la vez.Esta es nuestra solución.

Ahora estás listo para probar algunos ejercicios y proyectos por tu cuenta.

Cómo es ser un ingeniero de software en Google

Descubre cómo es trabajar en Google en este sitio web.

Ejercicios y proyectos

Los siguientes ejercicios te darán más práctica con C++ básico. No proporcionamos soluciones para estos ejercicios y proyectos porque nos gustaría que trabajaras con otros estudiantes en este curso.

  1. El críquet de campo común emite pitidos en proporción directa a la temperatura actual. Si sumamos 40 a la cantidad de veces que un críquet canta en un minuto, la temperatura se obtiene al dividir ese valor por 4. Escribe un programa que tome como entrada la cantidad de cantos en un minuto y, luego, imprima la temperatura actual. Por ejemplo,
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
    .
  2. Escribe un programa que calcule tu calificación final para un curso de programación que estés tomando. Este es el esquema de calificación:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    El programa debe pedirle al usuario las cuatro puntuaciones de la tarea: las calificaciones intermedias, finales y de la sección. Luego, se calcula y se imprime la puntuación final. Para hacer los cálculos, debes promediar las cuatro puntuaciones de la asignación y, luego, multiplicarlas por 0.4 (40%). Luego, multiplica la puntuación intermedia por 0.15, la final por 0.35 y la calificación de la participación por 0.1. Luego, sumas todos los resultados de estas multiplicaciones.

    Usa funciones en este programa siempre que sea posible. Puedes crear una función para obtener la entrada pasando como parámetro la string que se mostrará en un mensaje explicativo. Aquí hay un ejemplo de ejecución:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. A medida que los cronómetros electrónicos se vuelvan más baratos y precisos, sin duda se nos inundará la medición del tiempo. Escribe un programa que tome como entrada un período expresado en segundos y muestre la cantidad de horas, minutos y segundos que representa. Por ejemplo,
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
    .
  4. A continuación, realiza la descomposición antes de escribir el programa. Usa funciones siempre que sea posible para crear programas bien estructurados.

  5. Supongamos que queremos imprimir un banner para lo siguiente:

    "LA brisa congelada hace que TRES ÁBULOS SE CONHIERAN"

    Queremos que las letras sean bastante grandes, ya que se trata de un banner:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    
    etc.

    Dado que es un buen descomponedor de problemas, probablemente hayas notado que, en lugar de poner todos los datos en la función principal, sería mucho más eficiente ponerlos en funciones. Así que podríamos tener una función "printE" y una función "printZ" y así sucesivamente.

    Escribe un programa con funciones que cree un banner de una palabra o frase con muchas letras repetidas. Algunas posibilidades:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. Este es un problema de "número mágico": pídele a un usuario que ingrese un número de tres dígitos cuyo primer dígito sea mayor que el último. Tu programa revertirá el número y restará la reversión del número original. Por último, invierte el número resultante y agrégalo al formato no invertido. Muestra el resultado final. El número original que ingresa el usuario debe ser de tipo entero (no tres caracteres). Piensa en cómo escribir una función que tome un número entero como entrada y muestre la inversa de ese número. Ejemplo:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. La ley exige que los fabricantes de productos alimenticios establezcan fechas de vencimiento en sus productos, pero hay una brecha en la ley: no requiere que la fecha de vencimiento tenga ninguna forma particular. Por lo tanto, puede escribirse en suajili y aun así ser legal.

    Nadine, la prima tercera de Ralph Nader, se autodenomina espía de calidad de la comida. Se enteró de que muchos fabricantes de productos alimenticios comenzaron a codificar las fechas de vencimiento de los productos para evitar que los clientes sepan qué tan antiguos son los artículos.

    Sin embargo, la codificación permite que las tiendas de alimentos determinen las fechas de vencimiento si, por algún motivo, quieren hacerlo.

    Un método de codificación popular:

    • codificar los meses de enero a diciembre como “A” a “L”
    • codificar cada dígito de la fecha como 'Q' a 'Z'
    • codificar el año de la A a la Z, es decir, del 1 al 26, que luego se agrega a 1995.

    Nadia encontró una barra de pan particularmente cuestionable con la fecha ARZM. Escribe un programa para determinar la fecha.

  8. Esta es una analogía de los números de un famoso truco de cartas. Pídele al usuario que ingrese un número de tres dígitos. Piensa en el número como si fuera ABC (donde A, B, C son los tres dígitos del número). Ahora, encuentra el resto de los números formados por ABC, BCA y CAB cuando se dividen por 11. Los llamaremos X, Y, Z. Sumarlas como X+Y, Y+Z, Z+X. Si alguna de las sumas es impar, auméntala o auméntala en 11 (cualquier operación que dé como resultado un número positivo menor que 20; ten en cuenta que si la suma es 9, solo informa esto y detén el proceso). Por último, divide cada una de las sumas por la mitad. Los dígitos resultantes son A, B y C. Escribe un programa que implemente este algoritmo.

Aplicación: Visualización de música con animación

Los ingenieros de software crean una amplia variedad de aplicaciones, a menudo interesantes e innovadoras. En cada módulo de este curso, presentamos una aplicación diferente que los ingenieros diseñaron y, luego, implementaron para ayudarte a comprender todas las áreas en las que trabajan los ingenieros.

Aquí hay una aplicación interesante que se creó para visualizar música.