Como começar

Aprenda com o exemplo

Uma das melhores maneiras de aprender a programar em um novo idioma é observar muitos programas de exemplo. O melhor a fazer é copiar e colar cada programa abaixo em um arquivo de texto e compilá-lo. Depois, faça os experimentos. Ao estender esses programas de exemplo, você conhecerá diferentes aspectos do C++ e se sentirá mais confiante na hora de criar programas do zero.

Exemplo 1: fazer seu compilador funcionar

Caso ainda não tenha feito isso, copie e cole o programa clássico a seguir em um arquivo de texto e compile-o. As instruções sobre a compilação estão disponíveis aqui.

É provável que você tenha lido os detalhes deste programa durante o tutorial. Por isso, não forneceremos uma descrição linha por linha aqui. No entanto, há alguns detalhes a serem observados com relação à legibilidade. Refere-se a comentários e formatação que ajudam a tornar os programas fáceis de ler, entender e manter.

  • Todo programa que escrevemos começa com um comentário no cabeçalho, fornecendo o nome do autor, as informações de contato, uma breve descrição e o uso (se relevante). Cada função começa com um comentário sobre a operação e o uso.
  • Adicionamos comentários explicativos usando frases completas sempre que o código não se documenta, por exemplo, se o processamento for complicado, não óbvio, interessante ou importante.
  • Sempre use nomes descritivos: variáveis são palavras em letras minúsculas separadas por _, como em my_variable. Os nomes de função usam letras maiúsculas para marcar palavras, como em MyExcitingFunction(). Constantes começam com um "k" e usam letras maiúsculas para marcar palavras, como em kDaysInWeek.
  • O recuo é feito em múltiplos de dois. O primeiro nível tem dois espaços. Se mais recuo for necessário, usaremos quatro espaços, seis espaços etc.
// 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;
}

Confira alguns experimentos para testar:

  • O mais importante é garantir que você possa compilar e executar esse programa.
  • Modifique o programa acima para gerar a mensagem "Hello World!" quatro vezes em uma linha para seis linhas, cada uma impressa em um campo de 17 espaços. Use for-loops para fazer isso. Clique aqui para saber como formatar a saída com cout. Clique aqui para ver a solução.
  • Usando o programa que você acabou de concluir, descubra como imprimir a mensagem "Hello World!" alinhada à esquerda nos campos de 17 espaços (o padrão geralmente é alinhado à direita). Clique aqui para ver a solução.

Exemplo 2: receber uma entrada

É fácil receber entradas do teclado em C++ usando cin. Confira um exemplo:

// 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;
}

Um experimento:

  • Quando um erro de entrada é cometido, o stream "falha", o cin retorna "false" e o programa é interrompido. É muito importante se proteger contra esses erros, como fizemos no programa acima. Mas e se quisermos nos recuperar do erro, em vez de interromper o programa? Há duas etapas para a recuperação de um erro:
    1. Limpe o erro com cin.clear().
    2. Remova os caracteres incorretos do stream. Uma maneira de fazer isso é usando cin.ignore().

Escreva um programa que se recupera de entradas incorretas usando estas duas etapas. Use o Google para pesquisar como esses métodos funcionam. Nossa solução está aqui.

Exemplo 3: o que esse programa gera?

#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;
} 

Exemplo 4: decompor tudo fica mais fácil...

Hora de começarmos a criar jogos de computador! Este primeiro será um pouco simples, mas é um começo. Nossa tarefa é criar um programa que implemente um jogo de adivinhação. Nosso programa gera um número aleatório entre 0 e 100. O jogador precisa adivinhar o número secreto. O programa fornece dicas como "está muito alto" ou "está muito baixo" até que o jogador finalmente adivinhar o número secreto.

Vamos trabalhar neste jogo em três etapas. 

  1. Descobrir como gerar um número aleatório dentro de um determinado intervalo de valores.
  2. Crie uma função principal que processe um palpite do jogador e forneça dicas.
  3. Adicione o que for necessário para permitir vários palpites até que o jogador adivinhe o número.

Esse processo de desenvolvimento é chamado de decomposição, o que significa dividir uma tarefa em subtarefas. Cada uma é fácil de fazer.

A partir da etapa 1, faça uma pesquisa no Google para ver como gerar um número aleatório usando C++. Tente pesquisar "rand C++". Veja aqui nossa solução. 

Para a etapa 2, precisamos receber uma entrada de número inteiro do player (com verificação de erros adequada no cin) e compará-la com o número secreto. Tente criar essa parte do jogo por conta própria antes de conferir nossa solução.

Por fim, precisamos adicionar um loop que continua coletando palpites do jogador até que ele finalmente identifique o número secreto. Depois de concluir esta parte do programa, verifique nossa solução.

A decomposição é uma das habilidades mais importantes que um programador precisa aprender. Ser capaz de dividir uma tarefa em partes gerenciáveis e concluí-la uma de cada vez é fundamental, não importa o tamanho ou o pequeno do projeto. Aqui estão algumas outras oportunidades para você praticar a decomposição.

  • Muitas tarefas diárias oferecem oportunidades para desenvolver habilidades em decomposição. Você pode se surpreender ao descobrir que sua mente simplesmente funciona assim!

    Por exemplo, se eu tenho que limpar uma cozinha muito bagunçada (talvez algumas meninas tenham feito um bolo), eu separo as tarefas para criar um plano e garantir que não precise refazer o trabalho mais tarde. Não quero lavar o chão primeiro se tiver todo tipo de coisa para limpar na bancada. Provavelmente terei que reparar o chão de novo mais tarde. Então, talvez eu tenha colocado todos os ingredientes primeiro, leve todos os pratos para a pia, limpe os balcões, lave os louças e, por fim, limpe o chão. Há outras maneiras de realizar essa tarefa, mas pensar nisso primeiro me ajuda a definir um plano que não vai exigir novo trabalho.

    Use tarefas do dia a dia como exemplos para desenvolver suas habilidades de decomposição. Quem sabe, pode até mesmo tornar você mais eficiente em casa!

  • O maior divisor comum de dois números inteiros é o maior número que divide os dois uniformemente. Por exemplo, gcd(12, 18) = 6, gcd(-4, 14) = 2. A maneira mais eficiente de calcular o gcd é com o algoritmo euclidiano. Escreva um programa com uma função para calcular o gcd para dois números inteiros. Tente executar a função sem recursão primeiro. Isso ajuda a entender como o algoritmo funciona.

    Defina explicitamente suas subtarefas. Por exemplo, encontrar o código do algoritmo euclidiano, criar uma função não recursiva para o algoritmo etc. Aqui está nossa solução.

Exemplo 5: quebra-cabeças de matemática

Um dos poderes da computação é ser capaz de fazer uma busca de força bruta por uma solução para um problema. Tentativa e erro funcionam bem para alguns problemas. Na verdade, os computadores são especialmente bons para esses problemas. Considere o seguinte:

Cavalos custam US$ 10, os porcos custam US$ 3 e os coelhos custam apenas USD 0, 50. Um fazendeiro compra 100 animais por US $100. Quantos de cada animal ele comprou? 

Existe uma solução incrivelmente simples para esse problema. Tente encontrá-lo antes de conferir nossos.

Confira mais um exemplo:
Quantas maneiras de organizar seis livros diferentes, da esquerda para a direita, em uma estante?

Desta vez, vamos oferecer apenas a solução e deixar você criar o programa: 720.

Exemplo 6: strings para sua consideração

O que o programa a seguir gera?

#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;
}

Clique aqui para receber ajuda.

Exemplo 7: próximas etapas com decomposição: seu primeiro dia no trabalho

Você acabou de conseguir um cargo de vendedor na empresa ExerShoe, especializada em tênis de alta qualidade para exercícios e que custa cerca de US $225 por par. Sua chefe oferece três opções de remuneração, que você precisa escolher antes de começar o primeiro dia:

  1. Salário contínuo de USD 600 por semana;
  2. Um salário de US $7,00 por hora, mais uma comissão de 10% sobre as vendas;
  3. Não tem salário, mas 20% de comissões e US $20 para cada par de sapatos vendido

Você, sendo um programador especialista em C++, sabe que consegue criar um programa para ajudar a decidir a melhor escolha de remuneração.

Uma abordagem comum ao fazer a decomposição de um programa maior é criar uma função principal que seja um esboço para resolver o problema. Em seguida, escrevemos as funções para fazer cada tarefa.

Aqui está um primeiro passo para o programa principal:

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

Veja se é possível implementar cada uma dessas funções antes de conferir nossa solução.

Exemplo 8: o que está disponível onde?

Qual é a saída do programa a seguir?

// 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;
}

Depois de descobrir a resposta, confira nossa versão comentada do código aqui.

Exemplo 9: processamento de arquivos

O processamento de arquivos em C++ é realizado com o fstream. Para salvar em um arquivo, declaramos um ofstream e o abremos usando o modo "out". Confira isso no exemplo a seguir.

// 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;
} 
  • Tente descobrir como abrir o arquivo recém-criado e exibir os dados.Confira nossa solução.
  • Agora veja se é possível modificar o programa para permitir que o usuário insira muitos registros de dados usando um loop. Também queremos ler todos os dados, um registro de cada vez.Confira nossa solução.

Agora você está pronto para testar alguns exercícios e projetos por conta própria.

Como é ser um engenheiro de software no Google

Leia sobre como é trabalhar no Google neste site.

Exercícios e projetos

Os exercícios a seguir darão mais prática no C++ básico. Não oferecemos soluções para esses exercícios e projetos porque queremos que você trabalhe com outros alunos neste curso.

  1. O críquete de campo comum emite um som em proporção direta à temperatura atual. Some 40 ao número de vezes que um críquete toca em um minuto, depois dividir esse valor por 4 nos dá a temperatura. Escreva um programa que receba como entrada o número de sinais sonoros em um minuto e imprima a temperatura atual. Por exemplo,
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. Escreva um programa que calculará sua nota final para um curso de programação que você está fazendo. Este é o esquema de avaliação:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    Seu programa precisa pedir ao usuário as quatro pontuações das tarefas, a de médio, final e a seção. Em seguida, a pontuação final é calculada e impressa. Para fazer os cálculos, faça a média das quatro pontuações de atribuição e, em seguida, multiplique por 0,4 (40%). Depois, multiplique a pontuação do meio do semestre por 0,15, a final por 0,35 e a nota de participação por 0,1. Depois, você soma todos os resultados dessas multiplicações.

    Use funções sempre que puder neste programa. É possível criar uma função para receber a entrada transmitindo como parâmetro a string a ser exibida em uma caixa explicativa. Aqui está um exemplo de execução:

    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. À medida que os cronômetros eletrônicos se tornarem mais baratos e precisos, sem dúvida seremos induzidos por medições de tempo incrivelmente precisas. Escreva um programa que toma como entrada um período de tempo dado em segundos e gera o número de horas, minutos e segundos que ele representa. Por exemplo,
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
    .
  4. A seguir, faça a decomposição antes de programar seu programa. Use funções sempre que possível para criar programas bem estruturados.

  5. Suponha que quiséssemos gerar um banner para o seguinte:

    "O BREZY BREEZE FAZ TRÊS TRÊS TRABALHOS congelando"

    Queremos que as letras sejam bem grandes, já que este é um banner:

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

    Por ser um bom decompositor de problemas, você provavelmente percebeu que, em vez de colocar todos os couts na função principal, seria muito mais eficiente colocá-los em funções. Então, poderíamos ter uma função "printE" e uma "printZ" e assim por diante.

    Escreva um programa com funções que criam um banner de uma palavra ou frase com muitas letras repetidas. Algumas possibilidades:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. Aqui está um problema de "número mágico": peça ao usuário para inserir um número de três dígitos cujo primeiro dígito é maior que o último. Seu programa vai reverter o número e subtrair a reversão do número original. Por fim, inverta o número resultante e adicione-o à forma não invertida. Gere o resultado final. O número original inserido pelo usuário precisa ser do tipo inteiro (não pode ter três caracteres). Pense em como escrever uma função que use um número inteiro como entrada e retorne o inverso desse número. Exemplo:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. A lei exige que os fabricantes de produtos alimentícios coloquem datas de validade nos produtos, mas há uma brecha na lei: ela não exige que a data de validade esteja em uma forma específica. Então, ele pode ser escrito em suaíli e ainda ser legal.

    Nadine, prima de terceiro de Ralph Nader, é uma espiã autonomeada da qualidade da comida. Ela descobriu que muitos fabricantes de produtos alimentícios começaram a codificar as datas de validade dos produtos para evitar que os clientes saibam a idade dos itens.

    Mas a codificação permite que os mercearias descubram as datas de validade se por algum motivo quiserem.

    Um método de codificação conhecido:

    • codificar os meses de janeiro a dezembro como "A" a "L"
    • codifique cada dígito da data como "Q" a "Z"
    • codifique o ano como de "A" a "Z", o que significa de 1 a 26, que é então adicionado a 1995.

    Nanda encontrou um pão bastante questionável com esta data: ARZM. Escreva um programa para determinar a data.

  8. Essa é uma analogia numérica com um famoso truque de cartas. Peça ao usuário para inserir um número de três dígitos. Pense no número como ABC (em que A, B, C são os três dígitos do número). Agora, encontre os restos dos números formados por ABC, BCA e CAB quando divididos por 11. Vamos chamar esses restos de X, Y, Z. Adicione-os como X+Y, Y+Z, Z+X. Se alguma das somas for ímpar, aumente ou diminua em 11 (a operação que resulta em um número positivo menor que 20). Se a soma for 9, informe isso e interrompa o processo. Por fim, divida cada uma das somas ao meio. Os dígitos resultantes são A, B, C. Crie um programa que implemente esse algoritmo.

Aplicativo: como visualizar música com animação

Engenheiros de software criam uma ampla variedade de aplicativos muitas vezes interessantes e inovadores. Em cada módulo deste curso, apresentamos um aplicativo diferente projetado e implementado pelos engenheiros para ajudar você a entender todas as diferentes áreas em que os engenheiros trabalham.

Este é um app interessante criado para visualizar músicas.