7 Respostas e comentários para problemas selecionados
A sequência de entrada especificada contém os valores e um sentinela. O processamento requer uma repetição que use enquanto ou repita.
O uso do para, considerando que requeira a especificação do intervalo, não é possível, já que não há possibilidade de antever o número de repetições.
A quantidade de valores na sequência de entrada é fixo. Uma repetição com para é a alternativa mais apropriada.
A opção por enquanto ou repita sempre é possível, porém o uso do para torna a repetição mais clara na solução elaborada.
Como a quantidade de repetições não pode ser antevista, descarta-se a repetição com para.
Do ponto de vista do funcionário que faz a pesagem, seu trabalho segue até que a fila de animais termine. Para o que faz a anotação, seu trabalho se encerra ao receber o “acabou”, caracterizando um sentinela.
De ambos os pontos de vista, repetições indeterminadas com enquanto ou repita são as que atendem ao problema.
Neste caso, a pesquisa de opinião já ocorreu e os dados estão disponíveis. Não é trabalho do algoritmo lidar como foi a coleta das respostas.
O problema não indica a disponibilidade da quantidade de respostas que precisam ser processadas, de forma que a sequência deve ser avaliada item a item, até que se encerre.
Não há também um valor sentinela explicitado.
Neste caso, a repetição com enquanto ou repita se mostra como adequada ao processamento:
O número de repetições neste problema é definido. Sabendo-se o mês, que é dado de entrada, é possível determinar o número de dias para a repetição. Mesmo para o mês de fevereiro, que pode variar entre 28 ou 29 dias, sabe-se qual a quantidade, visto que o ano também é um valor conhecido e, a partir dele, determinar se se trata ou não de um ano bissexto.
Como soluções para este problema são apresentados dois algoritmos.
O primeiro algoritmo considera o fato de que as possíveis alturas dos participantes da equipe são, necessariamente, maiores que zero. Desta forma, inicia a verificação iniciando uma variável \(h_\Id{máx}\) com zero. Inevitavelmente, ao verificar a primeira altura da sequência, ela será maior que esse valor inicial e \(h_\Id{máx}\) será atualizado.
O algoritmo seguinte usa a mesma estrutura geral. Porém, ao invés de “forçar” a primeira troca, obtém a primeira altura e a atribui a \(h_\Id{máx}\). A partir daí, verifica as demais alturas, substituindo o valor máximo apenas se necessário.
São propostas duas soluções para o problema.
A especificação deixa em aberto quais valores existem na sequência, os quais podem ser tão pequenos ou tão grandes quanto possível. Desta forma, a versão seguinte opta por iniciar a variável \(\Id{valor\_mínimo}\) com \(+\infty\), forçando a primeira substituição logo no primeiro valor da sequência.
Nesta solução, sempre que o valor máximo é atualizado, também é o número da CNH. O primeiro motorista da lista sempre será considerado, iniciando o processo.
A solução apresentada não funciona porque as verificações de “menor que 6,0” e “igual a 0” não são mutuamente exclusivas. Uma nota igual a zero tem que contar nas duas categorias. Ainda assim, o código somente faz a comparação de notas nulas caso a verificação de “menor que 6,0” tenha falhado, pois é usado um senão se na estruturação.
Como as duas condições devem ser verificadas separadamente, uma solução é o uso de uma estrutura se independente para cada uma, o que leva à soução que segue.
Desta forma uma nota igual a zero provocaria o incremento dos dois contadores.
Pense a respeito: sua solução, para que seja entendida por outra pessoa, requer comentários específicos? Seria bom incluí-los ou não?
Neste exercício é importante notar que, não havendo nenhuma pessoa em uma das classes, a média não existe, não podendo nem ser calculada.
Em algoritmos computacionais é comum o uso do operador \(\bmod\) para indicar o o resto da divisão. Dessa forma, \({a \bmod b}\) (\(a\) e \(b\) inteiros) é o resto da divisão inteira \(a/b\). Como exemplos, \({10 \bmod 3 = 1}\), \({20 \bmod 3 = 2}\) e \({3291 \bmod 3 = 0}\).
Quando \(a \bmod b = 0\), \(b\) é um divisor de \(a\).
Além da notação \(a \bmod b\) para o resto da divisão, são também comuns as representações \(\mbox{mod}(a, b)\) e \(a\,\%\,b\).
Em algoritmos, também pode ser escrito “se \(b\) é divisor de \(a\) então” se o nível de abstração exigido for mais alto.
Naturalmente, a opção seguinte seria muito mais eficiente, porém não atenderia o enunciado do problema.
É interessante notar que no algoritmo, o valor \(n = 0\) faz com que o laço para não seja repetido nenhuma vez, resultando em \(\Id{fatorial}\) igual a um. O mesmo ocorre para \(n = 1\).
Nesta soma, quanto maior o número de termos somados, mais o valor de \(s\) se aproxima de \(e^x\). \[e^x = x^0 + \frac{x^1}{1!} + \frac{x^2}{2!} + \frac{x^3}{3!} + \ldots\]