Search buenodc

Nesta página
  1. Questionário
  2. Tarefa
  3. Gabarito

Lista de Exercícios - Semana 6

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: declaração e acesso a arrays, percurso com for, busca sequencial, e arrays parcialmente preenchidos.

1. Qual é o índice do último elemento de um array declarado como int valores[8];?

a) 8 b) 7 c) 9 d) 0

2. Qual é a saída do trecho abaixo?

int a[4] = {5, 12, 1};
cout << a[3];

a) 1 b) 0 c) 12 d) Erro de compilação

3. No trecho abaixo, qual é o problema?

int notas[5];
notas[5] = 10;

a) O array foi declarado com um tipo errado. b) A linha 2 usa um índice que não existe nesse array, mas o compilador não acusa isso. c) Falta inicializar o array antes de usá-lo. d) O valor 10 não pode ser guardado num array de inteiros.

4. Qual é a saída do trecho abaixo?

int valores[3] = {4, 8, 15};
int soma = 0;
for (int i = 0; i < 3; i++) {
    soma = soma + valores[i];
}
cout << soma;

a) 4 b) 15 c) 27 d) 3

5. Qual é a saída do trecho abaixo?

int valores[4] = {3, 9, 2, 9};
int contador = 0;
for (int i = 0; i < 4; i++) {
    if (valores[i] == 9) {
        contador++;
    }
}
cout << contador;

a) 1 b) 2 c) 4 d) 9

6. No trecho abaixo, que encontra o maior valor de um array, por que o laço começa em i = 1, e não em i = 0?

int maior = valores[0];
for (int i = 1; i < 5; i++) {
    if (valores[i] > maior) {
        maior = valores[i];
    }
}

a) Porque a posição 0 já foi usada como valor inicial de comparação. b) Porque o índice 0 não existe em nenhum array. c) Porque o for não aceita começar em 0 quando há um if dentro do bloco. d) Porque, começando em 0, o programa não compila.

7. Na busca sequencial abaixo, o que a variável encontrado controla?

bool encontrado = false;
while (!encontrado && i < tamanho) {
    if (valores[i] == alvo) {
        encontrado = true;
    } else {
        i++;
    }
}

a) Quantas vezes o laço já se repetiu. b) Se o valor procurado já foi achado, o que também interrompe o laço. c) O tamanho do array que está sendo percorrido. d) O valor que está sendo procurado.

8. Num array parcialmente preenchido, qual é o papel da variável separada (como quantidade), além do array em si?

a) Guardar o tipo dos valores armazenados no array. b) Substituir a necessidade de declarar o array com um tamanho máximo. c) Controlar quantas posições do array estão realmente sendo usadas. d) Impedir que o array seja alterado depois de preenchido.

9. No trecho abaixo, depois que o array valores foi parcialmente preenchido, por que o laço usa quantidade como limite, e não MAXIMO?

for (int i = 0; i < quantidade; i++) {
    cout << valores[i] << endl;
}

a) Porque MAXIMO nunca pode ser usado dentro de um laço for. b) Porque quantidade é sempre igual a MAXIMO, então tanto faz. c) Porque usar MAXIMO mostraria posições que nunca receberam um valor válido. d) Porque quantidade é o nome correto exigido pela sintaxe de C++.

10. Qual é a saída do trecho abaixo, considerando que o usuário digita 7, 3 e -1, nessa ordem?

const int MAXIMO = 5;
int valores[MAXIMO];
int quantidade = 0;
int numero;

cin >> numero;
while (numero != -1 && quantidade < MAXIMO) {
    valores[quantidade] = numero;
    quantidade++;
    cin >> numero;
}
cout << quantidade;

a) 5 b) 3 c) 2 d) -1

Tarefa

  • Cada exercício é um programa separado, em um arquivo .cpp com 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 do cin). 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 cin por valor.
  • Sem funções: funções só entram na próxima semana. Resolva tudo dentro do main.
  • Compile e rode cada programa, testando com os valores de exemplo.

Tarefa 1 - Soma de um array

Arquivo: tarefa1.cpp

Leia 5 números inteiros, guarde num array, e mostre a soma deles.

Entrada: 5 inteiros.

Saída (um único valor):

<soma>

Exemplo: entrada

2
4
6
8
10

produz saída

30

Tarefa 2 - Maior e menor de um array

Arquivo: tarefa2.cpp

Leia primeiro a quantidade de números, N (no máximo 20), e depois leia os N números, guardando-os num array. Mostre o maior valor lido, seguido do 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

Tarefa 3 - Busca num array

Arquivo: tarefa3.cpp

Leia a quantidade de números, N (no máximo 20), depois leia os N números guardando-os num array, e por fim leia um valor a ser procurado. Mostre a posição (índice, começando em 0) onde esse valor aparece pela primeira vez, ou -1 se ele não estiver no array.

Entrada: um inteiro N, seguido de N inteiros, seguido do valor procurado.

Saída (um único valor):

<posicao>

Exemplo: entrada

4
10
20
30
40
30

produz saída

2

Tarefa 4 - Corrigindo o programa com erros

Arquivo: tarefa4.cpp

O programa abaixo deveria ler 5 números inteiros, guardá-los num array, e mostrar a soma deles, mas tem 3 erros e não compila. Corrija todos e entregue a versão funcionando.

#include <iostream>
using namespace std;

int main() {
    int valores[5]
    int soma = 0;

    for (int i = 0; i <= 5; i++) {
        cin >> valores[i];
        soma = soma + valores[i];
    }

    cout << Soma << endl;
    return 0;
}

Entrada: 5 inteiros.

Saída (um único valor):

<soma>

Exemplo: entrada

1
2
3
4
5

produz saída

15

Tarefa 5 - Média com array parcialmente preenchido

Arquivo: tarefa5.cpp

Leia números inteiros, um de cada vez, até ler o valor -1 (não conte o -1). Guarde os números lidos num array com tamanho máximo 20, controlando quantas posições estão realmente em uso. Ao final, mostre a média dos números lidos.

Entrada: uma sequência de inteiros terminada por -1.

Saída (um único valor):

<media>

Exemplo: entrada

10
20
30
-1

produz saída

20

Desafio (opcional) - Maior valor e sua posição

Arquivo: desafio.cpp

Leia a quantidade de números, N (no máximo 20), depois leia os N números guardando-os num array. Mostre o maior valor, seguido da posição (índice, começando em 0) onde ele aparece pela primeira vez.

Entrada: um inteiro N, seguido de N inteiros.

Saída (duas linhas, maior valor primeiro):

<maior>
<posicao>

Exemplo: entrada

5
3
8
8
2
1

produz saída

8
1

Gabarito

Resolução de referência para consulta e correção.

Questionário

Resposta correta de cada questão, para conferência.

QuestãoResposta
1b
2b
3b
4c
5b
6a
7b
8c
9c
10c

1. Um array de tamanho 8 tem índices válidos de 0 a 7: o índice 7 é o último.

2. O array foi inicializado com só 3 valores (5, 12, 1), então a posição a[3], que sobrou de fora, é preenchida automaticamente com 0.

3. notas tem tamanho 5, então os índices válidos vão de 0 a 4. O índice 5 está fora do intervalo, mas o compilador não detecta esse erro: o programa compila e roda normalmente, alterando um valor de memória fora do array.

4. soma acumula valores[0] + valores[1] + valores[2], ou seja, 4 + 8 + 15 = 27.

5. O valor 9 aparece em valores[1] e valores[3]: contador é incrementado duas vezes.

6. A posição 0 já foi usada para inicializar maior, então o laço só precisa comparar as posições restantes, a partir de 1.

7. encontrado registra se o valor já foi achado. O while testa !encontrado, então, assim que encontrado vira true, essa parte da condição fica falsa e o laço para, mesmo que ainda existam posições não percorridas.

8. O array sozinho não sabe quantas das suas posições foram realmente preenchidas: quantidade guarda esse número, que costuma ser menor que o tamanho máximo declarado.

9. As posições entre quantidade e MAXIMO nunca receberam um valor válido: usar MAXIMO como limite mostraria lixo de memória, não dados de verdade.

10. O laço lê 7, guarda em valores[0], quantidade vira 1; lê 3, guarda em valores[1], quantidade vira 2; lê -1, a condição numero != -1 fica falsa e o laço para. quantidade termina valendo 2.

Tarefa

Soluções de referência, com o mesmo raciocínio esperado do aluno.

Tarefa 1:

#include <iostream>
using namespace std;

int main() {
    int valores[5];
    int soma = 0;

    for (int i = 0; i < 5; i++) {
        cin >> valores[i];
        soma = soma + valores[i];
    }

    cout << soma << endl;
    return 0;
}

Tarefa 2:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int valores[20];
    for (int i = 0; i < n; i++) {
        cin >> valores[i];
    }

    int maior = valores[0];
    int menor = valores[0];
    for (int i = 1; i < n; i++) {
        if (valores[i] > maior) {
            maior = valores[i];
        }
        if (valores[i] < menor) {
            menor = valores[i];
        }
    }

    cout << maior << endl;
    cout << menor << endl;
    return 0;
}

Tarefa 3:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int valores[20];
    for (int i = 0; i < n; i++) {
        cin >> valores[i];
    }

    int alvo;
    cin >> alvo;

    int posicao = -1;
    for (int i = 0; i < n; i++) {
        if (valores[i] == alvo && posicao == -1) {
            posicao = i;
        }
    }

    cout << posicao << endl;
    return 0;
}

Tarefa 4: os três erros são: falta ; depois de int valores[5]; o laço usa i <= 5, mas os índices válidos vão só até 4 (deveria ser i < 5); e Soma, com S maiúsculo, não é a mesma variável que soma, declarada em minúsculo. Corrigido:

#include <iostream>
using namespace std;

int main() {
    int valores[5];
    int soma = 0;

    for (int i = 0; i < 5; i++) {
        cin >> valores[i];
        soma = soma + valores[i];
    }

    cout << soma << endl;
    return 0;
}

Tarefa 5:

#include <iostream>
using namespace std;

int main() {
    const int MAXIMO = 20;
    int valores[MAXIMO];
    int quantidade = 0;
    int numero;

    cin >> numero;
    while (numero != -1 && quantidade < MAXIMO) {
        valores[quantidade] = numero;
        quantidade++;
        cin >> numero;
    }

    double soma = 0;
    for (int i = 0; i < quantidade; i++) {
        soma = soma + valores[i];
    }

    cout << soma / quantidade << endl;
    return 0;
}

Desafio:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int valores[20];
    for (int i = 0; i < n; i++) {
        cin >> valores[i];
    }

    int maior = valores[0];
    int posicao = 0;
    for (int i = 1; i < n; i++) {
        if (valores[i] > maior) {
            maior = valores[i];
            posicao = i;
        }
    }

    cout << maior << endl;
    cout << posicao << endl;
    return 0;
}

Lista de Exercícios da Semana 6 - Base: Savitch, C++ Absoluto, seções 5.1 e 5.3. Traga suas dúvidas para o encontro síncrono.