Lista 01 · Primeiros passos em C++¶
Exercícios da Semana 1 — Primeiros passos em C++. O foco aqui é std::string (no lugar de char[]), auto, const e a diferença entre trabalhar com std::cin/std::cout e o printf/scanf que você já conhece de C.
Como resolver
Copie o bloco de código de cada exercício, cole no seu compilador online, preencha a parte marcada como ESCREVA SUA SOLUCAO AQUI e rode. A saída mostra quais testes passaram.
ex01¶
Escreva a função saudacao, que recebe um nome (std::string) e devolve a saudação no formato "Ola, <nome>!".
Em C, você faria isso com sprintf e um buffer char[] de tamanho fixo, torcendo para o nome não estourar o buffer. Em C++, std::string cresce sozinha e + concatena.
// ex01 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <string>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX01_H
#define EX01_H
// Retorna uma saudacao no formato "Ola, <nome>!".
// Ex: saudacao("Maria") -> "Ola, Maria!"
std::string saudacao(const std::string& nome);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
std::string saudacao(const std::string& nome) {
// TODO: monte e retorne a string "Ola, " + nome + "!"
return "";
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(saudacao("Maria") == std::string("Ola, Maria!"));
assert(saudacao("Joao") == std::string("Ola, Joao!"));
assert(saudacao("") == std::string("Ola, !"));
assert(saudacao("Ana Paula") == std::string("Ola, Ana Paula!"));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex02¶
Escreva media, que recebe três notas (double) e devolve a média aritmética.
Use auto para a variável que guarda o resultado antes de retornar — deixe o compilador inferir o tipo:
// ex02 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <cmath>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX02_H
#define EX02_H
// Retorna a media aritmetica de tres notas.
double media(double a, double b, double c);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
double media(double a, double b, double c) {
// TODO: use "auto" para a variavel de resultado e retorne a media.
return 0.0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(std::abs((media(10.0, 10.0, 10.0)) - (10.0)) <= (0.0001));
assert(std::abs((media(0.0, 0.0, 0.0)) - (0.0)) <= (0.0001));
assert(std::abs((media(10.0, 7.0, 4.0)) - (7.0)) <= (0.0001));
assert(std::abs((media(5.0, 6.0, 7.0)) - (6.0)) <= (0.0001));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex03¶
Escreva inverte, que recebe um texto (std::string) e devolve o texto invertido, sem usar nenhuma função pronta de inversão (nada de std::reverse ainda — isso vem na Unidade 2). Percorra o texto caractere por caractere.
// ex03 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <string>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX03_H
#define EX03_H
// Retorna o texto invertido caractere por caractere.
std::string inverte(const std::string& texto);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
std::string inverte(const std::string& texto) {
// TODO: monte uma nova string percorrendo "texto" de tras para frente.
return "";
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(inverte("abc") == std::string("cba"));
assert(inverte("ana") == std::string("ana"));
assert(inverte("") == std::string(""));
assert(inverte("a") == std::string("a"));
assert(inverte("cpp") == std::string("ppc"));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex04¶
Escreva conta_vogais, que recebe um texto e devolve quantas vogais (a, e, i, o, u, maiúsculas ou minúsculas) ele tem.
// ex04 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <string>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX04_H
#define EX04_H
// Conta quantas vogais (a,e,i,o,u, maiusculas ou minusculas) o texto tem.
int conta_vogais(const std::string& texto);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
int conta_vogais(const std::string& texto) {
// TODO: percorra "texto" e conte as vogais (ignore maiusculas/minusculas).
return 0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(conta_vogais("banana") == 3);
assert(conta_vogais("Programacao") == 5);
assert(conta_vogais("xyz") == 0);
assert(conta_vogais("") == 0);
assert(conta_vogais("AEIOU") == 5);
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex05¶
Escreva maior_de_tres, que recebe três inteiros e devolve o maior deles.
// ex05 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX05_H
#define EX05_H
// Retorna o maior entre tres inteiros.
int maior_de_tres(int a, int b, int c);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
int maior_de_tres(int a, int b, int c) {
// TODO: retorne o maior dos tres valores.
return 0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(maior_de_tres(3, 9, 5) == 9);
assert(maior_de_tres(-1, -5, -2) == -1);
assert(maior_de_tres(4, 4, 4) == 4);
assert(maior_de_tres(0, 0, 1) == 1);
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex06¶
Escreva eh_palindromo, que recebe um texto e devolve true se ele é igual ao seu inverso, e false caso contrário. Não considere espaços ou acentos — os casos de teste usam apenas palavras simples.
eh_palindromo("arara") // -> true
eh_palindromo("ovo") // -> true
eh_palindromo("banana") // -> false
Dica: você já escreveu uma função que inverte string no exercício 3 — pense em como reaproveitar essa lógica aqui.
// ex06 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <string>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX06_H
#define EX06_H
// Retorna true se o texto for igual ao seu inverso.
bool eh_palindromo(const std::string& texto);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
bool eh_palindromo(const std::string& texto) {
// TODO: compare o texto com o seu inverso (letra por letra ou construindo
// uma string invertida, como no exercicio 3).
return false;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(eh_palindromo("arara"));
assert(eh_palindromo("ovo"));
assert(!(eh_palindromo("banana")));
assert(eh_palindromo(""));
assert(eh_palindromo("a"));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex07¶
Escreva soma_quadrados, que recebe dois inteiros e devolve a soma dos quadrados deles.
// ex07 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX07_H
#define EX07_H
// Retorna a soma dos quadrados de a e b.
int soma_quadrados(int a, int b);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
int soma_quadrados(int a, int b) {
// TODO: retorne a*a + b*b.
return 0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(soma_quadrados(3, 4) == 25);
assert(soma_quadrados(0, 5) == 25);
assert(soma_quadrados(-2, 2) == 8);
assert(soma_quadrados(0, 0) == 0);
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex08¶
Escreva media_geometrica, que recebe dois double e devolve a média geométrica deles: multiplique os dois números e tire a raiz quadrada do resultado (std::sqrt, de <cmath>).
media_geometrica(4.0, 9.0) // -> 6.0
media_geometrica(2.0, 8.0) // -> 4.0
media_geometrica(5.0, 5.0) // -> 5.0
// ex08 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <cmath>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX08_H
#define EX08_H
// Retorna a media geometrica de a e b: a raiz quadrada de (a * b).
double media_geometrica(double a, double b);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
double media_geometrica(double a, double b) {
// TODO: multiplique a por b e devolva a raiz quadrada (std::sqrt) do produto.
return 0.0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(std::abs((media_geometrica(4.0, 9.0)) - (6.0)) <= (0.0001));
assert(std::abs((media_geometrica(2.0, 8.0)) - (4.0)) <= (0.0001));
assert(std::abs((media_geometrica(5.0, 5.0)) - (5.0)) <= (0.0001));
assert(std::abs((media_geometrica(1.0, 0.0)) - (0.0)) <= (0.0001));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex09¶
Escreva remove_caractere, que recebe um texto e um caractere, e devolve um novo texto igual ao original mas sem nenhuma ocorrência daquele caractere. A comparação distingue maiúscula de minúscula ('a' é diferente de 'A').
remove_caractere("banana", 'a') // -> "bnn"
remove_caractere("Casa Amarela", 'a') // -> "Cs Amrel"
remove_caractere("abc", 'z') // -> "abc"
// ex09 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
#include <string>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX09_H
#define EX09_H
// Retorna texto sem nenhuma ocorrencia do caractere alvo
// (a comparacao distingue maiuscula de minuscula).
std::string remove_caractere(const std::string& texto, char alvo);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
std::string remove_caractere(const std::string& texto, char alvo) {
// TODO: percorra texto e monte uma nova string so com os caracteres
// diferentes de alvo (use += para ir concatenando).
return "";
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(remove_caractere("banana", 'a') == std::string("bnn"));
assert(remove_caractere("Casa Amarela", 'a') == std::string("Cs Amrel"));
assert(remove_caractere("abc", 'z') == std::string("abc"));
assert(remove_caractere("", 'a') == std::string(""));
assert(remove_caractere("aaa", 'a') == std::string(""));
std::cout << "Todos os testes passaram!\n";
return 0;
}
ex10¶
Escreva soma_digitos, que recebe um inteiro não negativo e devolve a soma dos seus algarismos.
Este é um exercício de lógica pura, sem nada de C++ novo: a ideia é ir tirando o último algarismo com % 10 e descartando-o com / 10, até não sobrar nada.
// ex10 — versao de arquivo unico (gerada automaticamente,
// nao edite este arquivo direto: edite os fontes em exercicios/ e rode
// tools/gerar_single.py --todos de novo).
//
// Cole este arquivo inteiro no seu compilador online e rode.
#include <cassert>
#include <iostream>
// ============================================================
// Declaracoes do exercicio
// ============================================================
#ifndef EX10_H
#define EX10_H
// Retorna a soma dos algarismos de n (n >= 0).
int soma_digitos(int n);
#endif
// ============================================================
// ESCREVA SUA SOLUCAO AQUI
// ============================================================
int soma_digitos(int n) {
// TODO: enquanto n for maior que zero, some o ultimo algarismo
// (n % 10) e descarte-o (n = n / 10).
return 0;
}
// ============================================================
// NAO ALTERE — testes
// ============================================================
int main() {
assert(soma_digitos(253) == 10);
assert(soma_digitos(7) == 7);
assert(soma_digitos(1000) == 1);
assert(soma_digitos(0) == 0);
assert(soma_digitos(999) == 27);
std::cout << "Todos os testes passaram!\n";
return 0;
}