Saltar para o conteúdo
Topos Uranos

Resumo

Esta aula abre a quinta unidade do curso, dedicada às funções. Explica para que serve a unidade: ensinar a decompor um problema em partes com nome, cada uma com uma interface e um contrato, e a resolver certos problemas reduzindo-os a uma instância menor de si mesmos, por recursão; apresenta suas quatro aulas e o fio que as une; recorda o que a unidade dá por sabido, sobretudo os laços e seus invariantes da unidade 4; formula o problema que a unidade resolve, o de um programa que repete o mesmo cálculo copiado e que, por um descuido na cópia, responde errado sem que o compilador diga nada; antecipa o contrato (a pré-condição e a pós-condição) como a forma com que a unidade especificará cada parte; 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 algoritmos da unidade 4 (o rastreamento de um laço, seu invariante e sua variante) e revisá-los se for preciso.
  3. Antecipar, com um exemplo, a ideia de contrato: o que uma parte do programa exige de quem a usa e o que lhe garante em troca.
  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 cinco primeiras perguntas verificam o que a unidade dá por sabido: o rastreamento de um laço, seu invariante, a pré-condição de uma especificação, a cópia de um valor na inicialização e a busca, dentro de um programa da unidade 4, de um cálculo com entradas e saídas próprias. As cinco seguintes tocam, na ordem das aulas, as ideias centrais da unidade: a pilha de chamadas, a passagem de um argumento, a separação entre o cálculo e a apresentação, a definição recursiva do fatorial e a execução de uma função que chama a si mesma. 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 que escreve int n{305}; int c{1}; while (n >= 10) { n = n / 10; ++c; } std::println("{}", c);?

  2. Pergunta 2De unidades anterioresNo laço int total{0}; int k{1}; while (k <= n) { total += k; ++k; }, com n≥0n \geq 0, que relação vale cada vez que se avalia a condição?

  3. Pergunta 3De unidades anterioresA especificação da divisão diz: “dados inteiros a≥0a \geq 0 e b>0b > 0, obter qq e rr com a=b⋅q+ra = b \cdot q + r e 0≤r<b0 \leq r < b”. Qual é sua pré-condição?

  4. Pergunta 4De unidades anterioresDepois de int a{3}; int b{a}; b = 7;, quanto vale a?

  5. Pergunta 5De unidades anterioresO programa da aula 4.4 que escreve os primos menores que 100 tem um laço que percorre os candidatos e, dentro dele, outro que testa seus divisores. Que parte é um cálculo com entradas e saídas próprias, que conviria nomear?

  6. Pergunta 6Um programa começa em main; main chama uma função g, e g chama outra função h. Enquanto h se executa, que chamadas estão em curso?

  7. Pergunta 7Com a função int f(int x) { x = x + 1; return x; }, o que escreve int a{3}; int b{f(a)}; std::println("{} {}", a, b);?

  8. Pergunta 8Um programa lê uma data e deve escrever seu dia da semana. Que decomposição separa o cálculo da apresentação?

  9. Pergunta 9Qual das definições seguintes define n!n! para todo natural nn?

  10. Pergunta 10Com int f(int n) { if (n == 0) { return 0; } return n + f(n - 1); }, o que escreve std::println("{}", f(3));?