Lista de Exercícios - Semana 5
Questionário
- Questionário individual, de múltipla escolha, com uma resposta correta por questão.
- Cobre a leitura do material e dos vídeos:
for, laços aninhados,break/continueno laço interno, e o critério de escolha entrewhile,do-whileefor.
1. Qual é a saída do trecho abaixo?
for (int i = 1; i <= 3; i++)
cout << i << " ";
a) 1 2 3
b) 0 1 2
c) 1 2 3 4
d) O laço não executa nenhuma vez
2. Qual das opções abaixo é equivalente ao for a seguir, usando while?
for (int i = 0; i < 5; i++)
cout << i << endl;
a)
int i = 0;
i++;
while (i < 5) {
cout << i << endl;
}
b)
int i = 0;
while (i < 5) {
cout << i << endl;
i++;
}
c)
int i = 0;
while (i < 5) {
i++;
cout << i << endl;
}
d)
while (i < 5) {
int i = 0;
cout << i << endl;
i++;
}
3. Qual é a saída do trecho abaixo?
int soma = 0;
int i;
for (i = 1; i <= 5; i++);
soma = soma + i;
cout << soma << endl;
a) 15
b) 5
c) 6
d) Erro de compilação
4. Qual é a saída do trecho abaixo?
for (int a = 1; a <= 2; a++) {
for (int b = 1; b <= 3; b++) {
cout << a << b << " ";
}
}
a) 11 21 12 22 13 23
b) 1 2 3 1 2 3
c) 123123
d) 11 12 13 21 22 23
5. Quantos asteriscos o trecho abaixo mostra ao todo, somando as três repetições do laço externo?
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
}
a) 6
b) 9
c) 3
d) 12
6. No trecho abaixo, o break interrompe:
for (int x = 1; x <= 3; x++) {
for (int y = 1; y <= 3; y++) {
if (y == 2) break;
cout << x << y << " ";
}
}
a) Os dois laços ao mesmo tempo
b) Só o laço de y
c) Só o laço de x
d) Nenhum laço: o break é ignorado dentro de laços aninhados
7. Qual é a saída do trecho abaixo?
for (int i = 1; i <= 4; i++) {
if (i == 2) continue;
cout << i << " ";
}
a) 1 2 3 4
b) 1
c) 1 3 4
d) 3 4
8. Você precisa escrever um programa que peça repetidamente a senha do usuário até ele digitar a senha correta, sabendo que precisa perguntar pelo menos uma vez. Qual laço é mais indicado?
a) for
b) switch
c) while
d) do-while
9. Você precisa somar os valores de compras digitadas por um caixa, um de cada vez, até ele digitar zero para fechar o caixa, sem saber quantas compras vão ocorrer. Qual laço é mais indicado?
a) while
b) for
c) do-while
d) Nenhum dos três laços resolve isso
10. Um colega escreveu o trecho abaixo para somar números digitados até aparecer -1, mas usou um limite arbitrário de 1000 no for. Qual é o problema com essa escolha?
for (int i = 0; i < 1000; i++) {
cin >> numero;
if (numero == -1) break;
soma = soma + numero;
}
a) O código tem um erro de sintaxe e não compila
b) O total de repetições não é conhecido de antemão: esse problema pedia um while, não um for com limite inventado
c) O break não funciona dentro de um for, só dentro de while
d) O valor 1000 deveria ser exatamente igual ao número de valores digitados
Tarefa
- Cada exercício é um programa separado, em um arquivo
.cppcom o nome exato indicado (letras minúsculas, sem espaço). - Formato estilo juiz online: a entrada é só os valores pedidos, sem mensagem de prompt (nada de
cout << "Digite..."antes docin). A saída é só o valor esperado, sem nenhum texto de rótulo junto. - Entrada: os valores são lidos na ordem exata indicada em cada exercício, um
cinpor valor. - Compile e rode cada programa, testando com os valores de exemplo.
Tarefa 1 - Tabuada com for
Arquivo: tarefa1.cpp
Leia um número inteiro N e mostre a tabuada dele, do 1 ao 10, no formato N x i = resultado, uma linha por multiplicador, usando um laço for.
Entrada: um inteiro, N.
Saída (dez linhas):
N x 1 = <resultado>
N x 2 = <resultado>
...
N x 10 = <resultado>
Exemplo: entrada
5
produz saída (as três primeiras linhas)
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
Tarefa 2 - Soma dos pares
Arquivo: tarefa2.cpp
Leia um número inteiro N e mostre a soma de todos os números pares de 1 até N, usando um laço for.
Entrada: um inteiro, N.
Saída (um único valor):
<soma>
Exemplo: entrada
10
produz saída
30
Tarefa 3 - Triângulo de asteriscos
Arquivo: tarefa3.cpp
Leia um número inteiro N e mostre um triângulo de asteriscos com N linhas, usando laços aninhados: a linha i deve ter i asteriscos.
Entrada: um inteiro, N.
Saída (N linhas):
*
**
...
Exemplo: entrada
4
produz saída
*
**
***
****
Tarefa 4 - Corrigindo o programa com erros
Arquivo: tarefa4.cpp
O programa abaixo deveria mostrar os números de 1 a 5, um por linha, mas tem 3 erros e não compila. Corrija todos e entregue a versão funcionando.
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++);
cout << i << endl
return 0;
}
Entrada: nenhuma.
Saída (cinco linhas):
1
2
3
4
5
Tarefa 5 - Maior e menor
Arquivo: tarefa5.cpp
Leia primeiro a quantidade de números, N, e depois leia os N números, um de cada vez. Mostre o maior valor lido, seguido do menor, sem guardar os números em nenhum lugar além das variáveis que controlam o maior e o menor.
Entrada: um inteiro N, seguido de N inteiros.
Saída (duas linhas, maior primeiro):
<maior>
<menor>
Exemplo: entrada
4
5
2
9
1
produz saída
9
1
Desafio (opcional) - Pirâmide numérica
Arquivo: desafio.cpp
Leia um número inteiro N e mostre um triângulo onde a linha i (de 1 a N) contém os números de 1 até i, separados por espaço, usando laços aninhados.
Entrada: um inteiro, N.
Saída (N linhas):
1
1 2
1 2 3
...
Exemplo: entrada
3
produz saída
1
1 2
1 2 3
Gabarito
Resolução de referência para consulta e correção.
Questionário
Resposta correta de cada questão, para conferência.
| Questão | Resposta |
|---|---|
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | a |
| 6 | b |
| 7 | c |
| 8 | d |
| 9 | a |
| 10 | b |
1. i começa em 1 e o laço roda enquanto i <= 3, incrementando a cada volta: mostra 1, 2 e 3.
2. A tradução correta preserva a ordem original do for: primeiro mostra i, depois incrementa, exatamente como no for (inicialização, teste, corpo, atualização, teste de novo).
3. O for tem um ponto e vírgula sobrando logo após o parêntese, então roda com corpo vazio até i valer 6 (quando i <= 5 fica falsa). A linha seguinte, fora do laço, executa uma única vez: soma recebe 0 + 6, ou seja, 6.
4. O laço externo, de a, começa em a = 1: para cada valor de a, o laço interno, de b, roda inteiro, de 1 a 3, antes do laço externo avançar. Resultado: 11 12 13 21 22 23.
5. O laço interno roda i vezes a cada repetição do laço externo: 1 asterisco quando i = 1, 2 quando i = 2, 3 quando i = 3, somando 1 + 2 + 3 = 6.
6. Um break dentro de laços aninhados se aplica sempre ao laço mais interno que o contém: aqui, interrompe só o laço de y, sem afetar o laço de x.
7. O continue pula só a repetição em que i vale 2, sem mostrar nada nessa volta, mas o laço segue normalmente: 1, depois pula o 2, depois 3 e 4.
8. O bloco precisa perguntar a senha pelo menos uma vez antes de checar se está certa: é exatamente o cenário que o do-while resolve, testando a condição só depois de executar o bloco.
9. O número de compras não é conhecido de antemão, e pode ser zero: é o cenário do while, que testa a condição antes de cada repetição, sem exigir nenhuma execução mínima.
10. Quando quem realmente decide o fim do laço é um break lá dentro, e o limite do for é só um número grande escolhido no chute, isso é sinal de que o total de repetições não era conhecido: o problema pedia um while desde o início.
Tarefa
Soluções de referência, com o mesmo raciocínio esperado do aluno.
Tarefa 1: for de 1 a 10, multiplicando N pelo contador a cada repetição e mostrando no formato pedido.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= 10; i++) {
cout << n << " x " << i << " = " << n * i << endl;
}
return 0;
}
Tarefa 2: for de 1 a N, testando if (i % 2 == 0) a cada repetição para somar só os pares.
#include <iostream>
using namespace std;
int main() {
int n, soma = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
if (i % 2 == 0) {
soma = soma + i;
}
}
cout << soma << endl;
return 0;
}
Tarefa 3: laço externo de 1 a N controla a linha; laço interno, de 1 até o valor da linha atual, imprime os asteriscos daquela linha, seguido de um endl.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}
Tarefa 4: os três erros são: o ponto e vírgula sobrando logo após o for, que deixa o corpo do laço vazio; a falta do ponto e vírgula ao final da linha do cout; e o uso de i fora do escopo do for, já que ela foi declarada dentro dele. Corrigido:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++)
cout << i << endl;
return 0;
}
Tarefa 5: inicializar maior e menor com o primeiro valor lido, depois, a cada novo valor, comparar e atualizar maior (se o novo valor for maior) ou menor (se for menor), dentro do mesmo laço que lê os N valores.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int numero, maior, menor;
cin >> numero;
maior = numero;
menor = numero;
for (int i = 1; i < n; i++) {
cin >> numero;
if (numero > maior) {
maior = numero;
}
if (numero < menor) {
menor = numero;
}
}
cout << maior << endl;
cout << menor << endl;
return 0;
}
Desafio: laço externo de 1 a N controla a linha; laço interno, de 1 até o valor da linha atual, imprime os números separados por espaço, seguido de um endl. É a mesma estrutura da Tarefa 3, trocando o asterisco fixo pelo próprio contador do laço interno.
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
cout << j;
if (j < i) {
cout << " ";
}
}
cout << endl;
}
return 0;
}
Lista de Exercícios da Semana 5 - Base: Savitch, C++ Absoluto, seção 2.3. Traga suas dúvidas para o encontro síncrono.