Resumo
Esta aula abre a quarta unidade do curso, dedicada ao controle de fluxo. Explica para que serve a unidade: ensinar a governar a ordem em que se executam as instruções de um programa, com decisões e com laços, e a raciocinar sobre sua correção, isto é, a garantir que cada caso seja atendido, que cada laço faça o que deve e que termine; apresenta suas quatro aulas e o fio que as une; recorda o que a unidade dá por sabido, sobretudo as condições compostas da unidade 3; formula o problema que a unidade resolve, o de um programa que calcula o máximo divisor comum com um número fixo de passos e que, conforme os dados, responde errado ou para numa divisão por zero; antecipa o invariante como a ferramenta com que a unidade justificará seus laços; e mostra aonde conduz, nas unidades seguintes e no curso Programação em C++ II.
Objetivos de aprendizagem
- Descrever a sequência de conteúdos da unidade e explicar o que cada aula traz à seguinte.
- Recordar as condições compostas da unidade 3 (os conectivos, o curto-circuito e a negação pelas leis de De Morgan) e revisá-las se for preciso.
- Antecipar, com um exemplo, o invariante como ferramenta de raciocínio: uma relação entre as variáveis que uma repetição conserva e que, ao terminar, dá o resultado.
- 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: a negação de uma condição composta, o curto-circuito, o rastreamento de uma repetição da aula 1.1 e o limite de um int. As sete seguintes tocam, na ordem das aulas, as ideias centrais da unidade, e várias delas partem da matemática escolar: o máximo divisor comum, a notação de somatório, a terminação de um procedimento. 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.
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.
Pergunta 1De unidades anterioresQual é a negação da condição
1 <= n && n <= 10?Nega cada parte, mas conserva a conjunção: esquece De Morgan. Além disso, nenhum número é ao mesmo tempo menor que 1 e maior que 10, de modo que essa condição é sempre falsa.Troca bem o conectivo, mas nega mal as relações: exclui demais as bordas 1 e 10, que cumprem a condição original.Nega só a primeira parte.Por De Morgan, a negação de uma conjunção é a disjunção das negações, e a negação de1 <= nén < 1, nãon <= 1. A unidade precisa dela em cada decisão encadeada, porque o ramoelseatende exatamente a negação das condições anteriores, e em cada laço, porque ao sair vale a negação de sua condição.Revisar: Relações e lógica
Pergunta 2De unidades anterioresCom
int d{0};eint n{5};, o que ocorre ao avaliard != 0 && n / d > 2?Ignora o curto-circuito: a divisão nunca é calculada.Não há maneira de uma conjunção com um operando falso ser verdadeira.A expressão é correta; o compilador não conhece o valor deddurante a execução.O primeiro operando é falso, e o curto-circuito não avalia o segundo: a guarda à esquerda protege a divisão. A unidade converte essa guarda em decisões explícitas e em condições de laço que protegem seu corpo.Revisar: Relações e lógica
Pergunta 3De unidades anterioresA divisão por subtrações sucessivas da aula 1.1 começa com e , e repete “enquanto , subtrair de e somar 1 a ”. Com e , quantas vezes se executa o corpo da repetição?
Conta as avaliações da condição, que são uma a mais que as iterações.Detém a repetição com : lê como .Confunde o número de iterações com o valor inicial de .O rastreamento dá : o corpo se executa quatro vezes, e a condição se avalia cinco, porque a última avaliação é a que falha. A aula 4.2 escreve essa repetição em C++ e converte o rastreamento numa tabela.Revisar: Do problema ao algoritmo
Pergunta 4De unidades anterioresCom um
intde 32 bits, o que o padrão garante sobre o valor de46341 * 46341?Ignora o intervalo do tipo: esse número não cabe numint.Acredita que o estouro para no limite; o padrão não promete nada.O tipo do resultado é decidido pelos operandos, que sãoint, não pelo valor do resultado.O máximo é . A unidade encontra esse produto num lugar onde não se procura por ele: a condiçãod * d <= nde um laço que testa divisores, que estoura justamente quando está perto do máximo.Revisar: Os inteiros e sua representação
Pergunta 5Um programa contém a cadeia de decisões
if (score >= 50), que escreve “Aprovado”;else if (score >= 90), que escreve “Excelente”; eelse, que escreve “Reprovado”. O que ele escreve comscoreigual a 95?Acredita que vence a condição mais exigente; vence a primeira que se cumpre.Acredita que se executam todos os ramos verdadeiros; numa cadeia se executa um só.É uma resposta honesta: a aula 4.1 o explica, e a avaliação de saída voltará às bordas de uma cadeia.Numa cadeia se executa o primeiro ramo cuja condição é verdadeira, e . O ramo “Excelente” nunca se executa: seu caso real é e , que é vazio. A aula 4.1 ensina a ler o caso real de cada ramo e a ordenar as condições.Revisar: Decisões
Pergunta 6Qual das expressões seguintes denota a soma ?
Soma vezes o número , isto é, : confunde o termo com o limite superior.Soma : desloca os limites e perde o último termo, o erro de um a mais dos laços.O limite superior não pode ser o próprio índice: a expressão não tem significado.O índice percorre os inteiros de 1 a , e cada termo é o próprio . Um laçoforque acumula é a tradução direta dessa notação: a variável de controle é o índice, seus limites são os do somatório, e o corpo soma o termo.Revisar: Laços
Pergunta 7Com
int total{0};, o que escrevestd::println("{}", total);depois defor (int i{0}; i < 5; ++i) { total += i; }?Acredita queichega a 5: lê<como<=.Confunde o acumulador com o contador: cinco é o número de iterações, não a soma.É uma resposta honesta: a aula 4.2 ensina a forma dofore como contar suas iterações.A variávelitoma os valores 0, 1, 2, 3 e 4, e ; comiigual a 5 a condição falha e o corpo não se executa. É o somatório da pergunta anterior com os limites 0 e 4.Revisar: Laços
Pergunta 8Na divisão por subtrações sucessivas (, ; enquanto , passa a e a ), que relação entre as variáveis vale cada vez que se avalia a condição?
Vale só ao sair: enquanto se repete, a condição garante o contrário.Vale só ao terminar; antes, é menor que o quociente.É uma resposta honesta: a aula 4.3 ensina a encontrar e a verificar essa relação, e a avaliação de saída voltará a perguntá-lo.Vale no começo, porque ; e, se vale antes de uma iteração, vale depois, porque . Ao sair, soma-se a negação da condição, , e ambas dão o resultado. Uma relação assim se chama invariante, e a aula 4.3 a converte no método para projetar laços e justificá-los.Revisar: Projetar laços corretos
Pergunta 9Um procedimento parte de um inteiro qualquer (positivo, nulo ou negativo) e repete “enquanto , subtrair 2 de ”. Termina para todo ?
Isso ocorre com a condição ; com , a repetição para assim que vale 0 ou .Com negativo a condição é falsa desde o começo, e o corpo não se executa.A conclusão é correta, mas a razão não: ser inteiro não basta; é preciso que a quantidade seja natural enquanto se repete e que decresça.A quantidade é um natural enquanto se repete (a condição o garante) e decresce estritamente: é uma variante, a ferramenta da aula 1.1 que a aula 4.3 usa em cada laço. Com “enquanto ” a resposta mudaria: um ímpar salta o zero.Revisar: Projetar laços corretos
Pergunta 10Qual é o máximo divisor comum de 84 e 36?
É um divisor comum, mas não o maior.É um divisor comum, mas não o maior: falta o fator 3, que também compartilham.É o mínimo múltiplo comum, não o máximo divisor comum.Os divisores comuns são 1, 2, 3, 4, 6 e 12. O algoritmo de Euclides o obtém sem procurar divisores: e , de modo que . A aula 4.4 o escreve como laço e demonstra por que funciona.Revisar: Algoritmos numéricos
Pergunta 11Para decidir se 101 é primo testando divisores, até que divisor basta chegar?
Usa a metade: é correto, mas cinco vezes mais longo que o necessário.Testa todos os candidatos: é correto, mas não aproveita que os divisores vêm em pares.É uma resposta honesta: a aula 4.4 o demonstra.Se 101 tivesse um divisor com , também o seria, e um dos dois seria no máximo . Basta testar de 2 a 10: nenhum divide 101, que é primo. A aula 4.4 demonstra a regra e a escreve sem raízes nem produtos que estourem.Revisar: Algoritmos numéricos
Carregando o conteúdo…