Saltar para o conteúdo
Topos Uranos

Resumo

Esta aula abre a sexta unidade do curso, dedicada aos dados compostos. Explica para que serve a unidade: ensinar a representar coleções de dados (sequências de tamanho fixo e variável, tabelas e registros) e a processá-las com os algoritmos básicos, escritos à mão e tomados da biblioteca, estimando quanto custam; apresenta suas seis aulas e o fio que as une; recorda o que a unidade dá por sabido, sobretudo os laços com invariante e a passagem por referência constante; formula o problema que a unidade resolve, o de um programa que deve guardar dados cuja quantidade não conhece e que, escrito com variáveis soltas, cala em silêncio os que lhe sobram; antecipa o custo como segunda medida de um algoritmo, ao lado de sua correção; e mostra aonde conduz, nas unidades seguintes e no curso Programação em C++ II.

Objetivos de aprendizagem

  1. Descrever a sequência de conteúdos da unidade e explicar o que cada aula traz à seguinte.
  2. Recordar os laços, seus invariantes e a passagem de parâmetros (por valor, por referência e por referência constante), e revisá-los se for necessário.
  3. Antecipar, com um exemplo, o custo de um algoritmo como segunda medida de sua qualidade, ao lado de sua correção.
  4. Reconhecer o que se espera saber fazer ao terminar a unidade, e distingui-lo do que se aprenderá nas unidades seguintes.

Avaliação de entrada

Antes de percorrer a unidade, convém medir o ponto de partida. Esta avaliação é uma autoavaliação: não se pontua, e seu único propósito é orientar o estudo. As quatro primeiras perguntas verificam o que a unidade dá por sabido: o invariante do laço que busca um máximo, o modo de passagem de um parâmetro grande, o número de iterações de dois laços aninhados e a aritmética sem sinal. As seis seguintes tocam, na ordem das aulas, as ideias centrais da unidade: os índices válidos de uma sequência, a criação de um vetor, o número de vezes que um tamanho pode ser dividido pela metade, a busca em dados ordenados, o duplo índice de uma tabela e o perigo de guardar em coleções separadas os dados de uma mesma entidade. Ninguém é obrigado a acertá-las ainda, e em algumas delas “ainda não sei” é uma resposta honesta: cada resposta, certa ou não, explica o ponto e nomeia a aula que o trata. As mesmas habilidades voltam a ser medidas no final, na aula de síntese.

Avaliação de entrada

Antes de começar a unidade, meça seu ponto de partida. É uma autoavaliação breve: não recebe nota e seu resultado fica guardado apenas no seu navegador.

  1. Pergunta 1De unidades anterioresO fragmento int largest{0}; int t{}; while (std::cin >> t) { if (t > largest) { largest = t; } } deve deixar em largest a maior das temperaturas lidas. Com que entrada ele falha?

  2. Pergunta 2De unidades anterioresUma função calcula quantas vogais tem um texto de um milhão de caracteres, guardado em um std::string, e não o modifica. Como convém declarar seu parâmetro?

  3. Pergunta 3De unidades anterioresQuantas vezes se executa ++count em for (int i{0}; i < 6; ++i) { for (int j{0}; j < i; ++j) { ++count; } }?

  4. Pergunta 4De unidades anterioresO que escreve std::println("{}", 0u - 1); em um sistema com unsigned int de 32 bits?

  5. Pergunta 5Em uma sequência de nn elementos numerados como em C++, que índices ii designam um elemento?

  6. Pergunta 6O que contém v depois de std::vector<int> v(3, 7);?

  7. Pergunta 7Quantas iterações dá for (int m{1024}; m > 1; m /= 2) { ... }?

  8. Pergunta 8Uma lista telefônica tem um milhão de nomes em ordem alfabética. Para encontrar um, ela é aberta ao meio, descarta-se a metade onde o nome não pode estar, e repete-se com a outra. Quantas vezes, no máximo, é preciso abri-la?

  9. Pergunta 9Com std::vector<std::vector<int>> t{{1, 2, 3}, {4, 5, 6}};, quanto valem t[1][0] e t.size()?

  10. Pergunta 10Um programa guarda os nomes de uma turma em um vetor e suas notas em outro, de modo que a nota grades[i] é a de names[i]. Se ordenar só o vetor das notas, o que acontece?