Exercícios de algoritmos com respostas

As 60 questões saem das aulas do Curso de Lógica de Programação Intermediário, uma de cada aula e na ordem do curso, com o pseudocódigo em português usado nas aulas. Resolva cada uma antes de abrir a resposta: a explicação mostra o raciocínio e aponta a aula em que o tema é ensinado.

Como usar: leia a pergunta, escolha a sua alternativa e só depois abra "Ver a resposta". Quando errar, a explicação diz por que e o link leva à aula que ensina o assunto. As mesmas questões aparecem nas aulas como teste rápido, e o Curso de Lógica de Programação Intermediário é gratuito do começo ao fim.

Módulo 1: Bem-vindo ao próximo degrau

Questão 1 · aula De onde você parou: os três pilares que você já domina

Um colega diz que só vai começar a programar quando decorar todos os comandos de uma linguagem. Qual é o furo desse plano?

  1. Nenhum: decorar comandos é o único jeito de aprender a programar.
  2. O comando decorado sem o raciocínio por trás vira receita frágil; a lógica (os três pilares) é a base que faz os comandos terem sentido e vale para qualquer linguagem.
  3. As linguagens não têm comandos para decorar, então o plano é impossível.
  4. Decorar comandos deixa o computador mais lento na hora de rodar o programa.
Ver a resposta

Resposta: B. O comando decorado sem o raciocínio por trás vira receita frágil; a lógica (os três pilares) é a base que faz os comandos terem sentido e vale para qualquer linguagem.

Comando na ponta da língua sem lógica por trás desmonta no primeiro imprevisto. Os três pilares são a mesma coisa em toda linguagem, então quem domina a lógica aprende a sintaxe de qualquer linguagem depois, rápido. É por isso que este curso investe na base antes da ferramenta.

Estudar a aula: De onde você parou: os três pilares que você já domina

Questão 2 · aula O que muda agora: de valores soltos a dados organizados

Qual frase resume melhor o salto do nível básico para o intermediário na lógica de programação?

  1. Trocar o pseudocódigo por uma linguagem de programação de verdade.
  2. Deixar de usar os três pilares e aprender estruturas totalmente novas de fluxo.
  3. Sair de poucos valores soltos para organizar e manipular muitos dados de uma vez, com a estrutura certa para cada caso.
  4. Aprender a fazer o computador rodar o programa mais rápido mudando o hardware.
Ver a resposta

Resposta: C. Sair de poucos valores soltos para organizar e manipular muitos dados de uma vez, com a estrutura certa para cada caso.

O intermediário mantém os mesmos três pilares e o mesmo pseudocódigo; o salto é de escala e de organização. Em vez de uma nota, a turma inteira; em vez de um preço, o extrato do mês. Para dar conta desse volume com elegância, você aprende a escolher a estrutura de dados certa.

Estudar a aula: O que muda agora: de valores soltos a dados organizados

Questão 3 · aula Pensar como quem resolve problemas: o método dos quatro passos

Por que ENTENDER é considerado o passo mais importante do método, apesar de não escrever uma linha de código?

  1. Porque é o passo mais rápido e assim sobra tempo para os outros.
  2. Porque resolver o problema errado desperdiça todo o esforço de planejar, executar e revisar; entender direito é o que garante que o resto vale a pena.
  3. Porque só depois de entender o computador libera a execução do programa.
  4. Porque entender substitui a necessidade de testar o programa no fim.
Ver a resposta

Resposta: B. Porque resolver o problema errado desperdiça todo o esforço de planejar, executar e revisar; entender direito é o que garante que o resto vale a pena.

Um plano impecável para o problema errado ainda é um trabalho jogado fora. Entender define o alvo; se o alvo está errado, acertá-lo em cheio não adianta. Por isso vale gastar tempo lendo o enunciado, listando entradas e saídas e caçando os casos que não foram ditos, como a lista vazia.

Estudar a aula: Pensar como quem resolve problemas: o método dos quatro passos

Questão 4 · aula Como este curso funciona: jogos, desenhos, laboratório e certificado

Por que tentar responder um checkpoint de cabeça, mesmo correndo o risco de errar, ajuda mais a aprender do que reler o texto?

  1. Porque reler é proibido durante o curso.
  2. Porque o esforço de recuperar a resposta da memória (recuperação ativa) fixa o conteúdo muito mais do que o reconhecimento passivo de reler.
  3. Porque errar aumenta a sua nota no exame final.
  4. Porque o computador só libera a próxima aula depois de um erro.
Ver a resposta

Resposta: B. Porque o esforço de recuperar a resposta da memória (recuperação ativa) fixa o conteúdo muito mais do que o reconhecimento passivo de reler.

Reler dá uma sensação enganosa de domínio: você reconhece o texto e acha que sabe. Tentar responder de cabeça obriga o cérebro a buscar a informação, e é esse esforço que a grava. Por isso o curso enche as aulas de perguntas, e por isso errar nelas é parte do plano.

Estudar a aula: Como este curso funciona: jogos, desenhos, laboratório e certificado

Módulo 2: Decisões que se ramificam

Questão 5 · aula Senão-se: a escada de decisões

Numa escada senão-se que classifica notas em A, B, C e D, por que a condição da faixa A (nota alta) deve vir ANTES da faixa C (nota baixa)?

  1. Por costume: tanto faz a ordem, o programa testa todas de qualquer jeito.
  2. Porque a escada para na primeira condição verdadeira; se uma faixa frouxa vier antes, ela vence e deixa as faixas mais altas inalcançáveis.
  3. Porque o conceito A vale mais pontos que o C.
  4. Porque o computador só aceita ordem alfabética nas condições.
Ver a resposta

Resposta: B. Porque a escada para na primeira condição verdadeira; se uma faixa frouxa vier antes, ela vence e deixa as faixas mais altas inalcançáveis.

A escada é testada de cima para baixo e encerra na primeira verdadeira. Se a faixa mais baixa (frouxa) vier primeiro, notas altas caem nela e nunca chegam à faixa A. A ordem certa vai da faixa mais restritiva à mais ampla, e o senão final pega o resto.

Estudar a aula: Senão-se: a escada de decisões

Questão 6 · aula Decisões dentro de decisões

Você precisa decidir: se o cliente é VIP, e SÓ nesse caso, verificar se ele tem cupom para dar desconto extra. Qual estrutura representa melhor essa lógica?

  1. Uma escada senão-se testando faixas de valor gasto.
  2. Uma decisão aninhada: dentro do bloco cliente é VIP, um segundo SE para o cupom.
  3. Dois SE totalmente separados, sem relação entre eles.
  4. Um único SE com a condição cliente é VIP.
Ver a resposta

Resposta: B. Uma decisão aninhada: dentro do bloco cliente é VIP, um segundo SE para o cupom.

A verificação do cupom só faz sentido depois de confirmar que o cliente é VIP: são condições dependentes, em sequência. Isso é aninhamento, o SE do cupom dentro do bloco verdadeiro do SE do VIP. Escada trataria faixas do mesmo valor, que não é o caso aqui.

Estudar a aula: Decisões dentro de decisões

Questão 7 · aula Escolha-caso: quando há muitos valores fixos

Você precisa decidir a mensagem conforme o dia da semana, representado pelo número de 1 a 7. Por que o escolha-caso é mais adequado que a escada senão-se aqui?

  1. Porque o escolha-caso é sempre mais rápido que qualquer escada.
  2. Porque a decisão compara uma variável com valores fixos e exatos (1, 2, 3...), que é justamente o cenário do escolha-caso; não há faixas envolvidas.
  3. Porque a escada não aceita números, só textos.
  4. Porque o dia da semana não pode ser decidido com SE.
Ver a resposta

Resposta: B. Porque a decisão compara uma variável com valores fixos e exatos (1, 2, 3...), que é justamente o cenário do escolha-caso; não há faixas envolvidas.

Traduzir o número do dia para o nome é comparar uma variável com valores fixos e conhecidos, 1 a 7, um por caso. Esse é o território do escolha-caso, que fica mais limpo que sete degraus de escada comparando igualdade. Faixas (maior que, entre) é que pediriam a escada.

Estudar a aula: Escolha-caso: quando há muitos valores fixos

Questão 8 · aula Cláusula de guarda e tabela de decisão

Uma regra depende de três condições que podem ser verdadeiras ou falsas de forma independente. Quantas linhas terá a tabela de decisão que cobre todas as combinações?

  1. 3 linhas, uma por condição.
  2. 6 linhas.
  3. 8 linhas, porque cada condição dobra o número de combinações (2 x 2 x 2).
  4. 9 linhas.
Ver a resposta

Resposta: C. 8 linhas, porque cada condição dobra o número de combinações (2 x 2 x 2).

Cada condição de sim ou não dobra o número de combinações: uma condição dá 2 casos, duas dão 4, três dão 8 (2 elevado a 3). Montar a tabela com as 8 linhas garante que nenhuma combinação, nem a mais rara, seja esquecida na hora de programar.

Estudar a aula: Cláusula de guarda e tabela de decisão

Módulo 3: Laços sob controle

Questão 9 · aula Interromper o laço: quando achou, pode sair

Um programa verifica se um CPF está numa lista de bloqueados de 50 mil itens. Por que usar interromper (break) ao encontrar melhora o programa?

  1. Porque sem o break o programa daria erro de compilação.
  2. Porque, ao encontrar o CPF, não há motivo para continuar varrendo o resto da lista; o break evita milhares de comparações inúteis.
  3. Porque o break deixa a lista ordenada automaticamente.
  4. Porque o break impede que o CPF apareça duas vezes na lista.
Ver a resposta

Resposta: B. Porque, ao encontrar o CPF, não há motivo para continuar varrendo o resto da lista; o break evita milhares de comparações inúteis.

Assim que o CPF é encontrado, a resposta (está bloqueado) já está decidida. Continuar o laço só gastaria comparações à toa. O break encerra na hora, e em listas grandes essa economia é enorme, principalmente quando o item aparece cedo.

Estudar a aula: Interromper o laço: quando achou, pode sair

Questão 10 · aula Pular uma volta: o comando continuar

Um laço deveria somar apenas as idades maiores que zero de uma lista, mas o programador usou interromper no lugar de continuar ao achar um valor inválido. O que acontece?

  1. Nada muda: interromper e continuar fazem a mesma coisa.
  2. O laço para no primeiro valor inválido e não processa o resto da lista, somando menos idades do que deveria.
  3. O programa dá erro e não roda.
  4. As idades inválidas são somadas mesmo assim.
Ver a resposta

Resposta: B. O laço para no primeiro valor inválido e não processa o resto da lista, somando menos idades do que deveria.

Interromper SAI do laço, então ao topar com o primeiro valor inválido o laço encerra e ignora todos os itens seguintes, válidos ou não. O certo era continuar, que pula só aquele item e segue somando os demais. Trocar um pelo outro é um bug clássico e silencioso.

Estudar a aula: Pular uma volta: o comando continuar

Questão 11 · aula O laço da sentinela: repetir até o sinal combinado

Um programa lê preços até o usuário digitar -1 (sentinela) e soma tudo. Por que a leitura do próximo preço fica no FIM do laço, e não só no começo do programa?

  1. Por costume, poderia ficar em qualquer lugar sem diferença.
  2. Para que, a cada volta, um novo valor seja lido e testado pela condição antes da próxima soma; sem essa leitura, o laço somaria o mesmo preço para sempre.
  3. Para deixar o programa mais rápido.
  4. Porque a sentinela precisa ser somada antes de encerrar.
Ver a resposta

Resposta: B. Para que, a cada volta, um novo valor seja lido e testado pela condição antes da próxima soma; sem essa leitura, o laço somaria o mesmo preço para sempre.

O laço precisa de um valor novo a cada volta. A leitura no começo do programa alimenta o primeiro teste; a leitura no fim de cada volta traz o próximo valor para o teste seguinte. Sem essa segunda leitura, a variável nunca muda, a condição nunca vira falsa e o laço fica infinito somando o mesmo valor.

Estudar a aula: O laço da sentinela: repetir até o sinal combinado

Questão 12 · aula Laços dentro de laços

Um laço externo dá 50 voltas e, dentro dele, um laço interno dá 20 voltas. Quantas vezes o corpo do laço interno executa no total?

  1. 70 vezes (50 + 20).
  2. 50 vezes.
  3. 1.000 vezes (50 x 20).
  4. 20 vezes.
Ver a resposta

Resposta: C. 1.000 vezes (50 x 20).

O laço interno completa suas 20 voltas a cada uma das 50 voltas do externo, então o corpo executa 50 x 20 = 1.000 vezes. Em laços aninhados o total é o produto das voltas, não a soma; é por isso que o custo cresce tão rápido com dados grandes.

Estudar a aula: Laços dentro de laços

Módulo 4: Matrizes: tabelas, grades e tabuleiros

Questão 13 · aula A matriz: uma lista de listas

Por que uma matriz é descrita como uma lista de listas?

  1. Porque ela guarda apenas listas de nomes, nunca números.
  2. Porque cada linha da matriz é, por si só, uma lista de valores, e a matriz é a lista que guarda essas linhas empilhadas.
  3. Porque uma matriz só pode ter uma única linha.
  4. Porque listas e matrizes são a mesma estrutura com nomes diferentes.
Ver a resposta

Resposta: B. Porque cada linha da matriz é, por si só, uma lista de valores, e a matriz é a lista que guarda essas linhas empilhadas.

A matriz representa uma tabela empilhando linhas: cada linha é uma lista pequena, e a matriz é a lista dessas linhas. Por isso o acesso usa dois índices: o primeiro escolhe a linha (qual lista interna), o segundo escolhe a coluna (qual posição dentro dela).

Estudar a aula: A matriz: uma lista de listas

Questão 14 · aula Percorrer a matriz com laços aninhados

Numa varredura de matriz com dois laços aninhados, o que o laço EXTERNO controla e o que o INTERNO controla?

  1. O externo controla as colunas e o interno as linhas.
  2. O externo controla as linhas (qual fileira) e o interno as colunas (qual posição na fileira).
  3. Os dois controlam a mesma coisa, é indiferente.
  4. O externo controla os valores e o interno controla os índices.
Ver a resposta

Resposta: B. O externo controla as linhas (qual fileira) e o interno as colunas (qual posição na fileira).

Na convenção padrão, o laço externo caminha pelas linhas: a cada volta dele, uma linha é fixada. O laço interno então percorre todas as colunas daquela linha. Por isso o externo tem o limite do número de linhas e o interno o número de colunas.

Estudar a aula: Percorrer a matriz com laços aninhados

Questão 15 · aula Matrizes no mundo real: planilhas, tabuleiros e imagens

Por que uma imagem digital pode ser tratada como uma matriz?

  1. Porque toda imagem é feita de texto escondido.
  2. Porque a imagem é uma grade de pixels, e cada pixel (uma cor) ocupa uma célula localizada por linha e coluna.
  3. Porque imagens só podem ter formato quadrado.
  4. Porque a matriz é a única forma de guardar números negativos.
Ver a resposta

Resposta: B. Porque a imagem é uma grade de pixels, e cada pixel (uma cor) ocupa uma célula localizada por linha e coluna.

A tela é uma grade de pontos, os pixels, e a imagem guarda a cor de cada ponto numa célula da matriz. Uma foto de mil por mil pixels é uma matriz de um milhão de células. Filtros e efeitos são laços aninhados percorrendo e alterando essas células.

Estudar a aula: Matrizes no mundo real: planilhas, tabuleiros e imagens

Questão 16 · aula Operações em matrizes: linha, coluna e diagonal

Por que a diagonal principal de uma matriz quadrada pode ser percorrida com um único laço, e não com dois?

  1. Porque a diagonal tem menos células, então o computador otimiza sozinho.
  2. Porque na diagonal principal a linha é sempre igual à coluna, então um único índice serve para as duas coordenadas ao mesmo tempo (matriz[i][i]).
  3. Porque a diagonal não faz parte da matriz.
  4. Porque a diagonal só existe em matrizes com uma linha.
Ver a resposta

Resposta: B. Porque na diagonal principal a linha é sempre igual à coluna, então um único índice serve para as duas coordenadas ao mesmo tempo (matriz[i][i]).

As células da diagonal principal são [0][0], [1][1], [2][2]..., onde linha e coluna coincidem. Como o mesmo número descreve as duas coordenadas, um laço com um índice i acessa matriz[i][i] e percorre a diagonal inteira, sem precisar de um segundo laço.

Estudar a aula: Operações em matrizes: linha, coluna e diagonal

Módulo 5: Texto de verdade: a string como sequência

Questão 17 · aula O texto é uma sequência de caracteres

Na string BRASIL, qual é a última posição válida para indexar um caractere?

  1. A posição 6, porque a palavra tem 6 letras.
  2. A posição 5, porque a contagem começa em 0 e a última posição é o comprimento menos um (6 - 1).
  3. A posição 1, porque só a primeira letra pode ser indexada.
  4. Qualquer posição, porque strings não têm limite.
Ver a resposta

Resposta: B. A posição 5, porque a contagem começa em 0 e a última posição é o comprimento menos um (6 - 1).

BRASIL tem comprimento 6, mas como a contagem começa em 0, as posições vão de 0 a 5. A última é sempre o comprimento menos um. Tentar acessar a posição 6 iria além do fim do texto e causaria erro.

Estudar a aula: O texto é uma sequência de caracteres

Questão 18 · aula Percorrer o texto: contar letras, vogais e espaços

Um programa percorre o texto Ana Maria e conta a letra a minúscula. Quantas ele encontra, e por quê?

  1. 4, porque conta todos os A e a sem distinção.
  2. 3, porque só os a minúsculos contam: um em Ana e dois em Maria (o A de Ana e o M de Maria são ignorados).
  3. 0, porque o texto tem espaço.
  4. 9, porque conta todos os caracteres.
Ver a resposta

Resposta: B. 3, porque só os a minúsculos contam: um em Ana e dois em Maria (o A de Ana e o M de Maria são ignorados).

Para o computador, a minúsculo é diferente de A maiúsculo. Em Ana Maria os a minúsculos são: o último caractere de Ana (um) e o segundo e o último de Maria (dois), três no total. O A maiúsculo de Ana e o M de Maria não entram nessa contagem específica. Somando o A maiúsculo, o texto tem quatro letras a no total, mas só três são minúsculas.

Estudar a aula: Percorrer o texto: contar letras, vogais e espaços

Questão 19 · aula Buscar dentro do texto e validar formatos

Para verificar se um e-mail contém arroba, por que usar o comando interromper ao encontrar o primeiro @?

  1. Porque sem interromper o programa daria erro.
  2. Porque, assim que a arroba é encontrada, a resposta (contém sim) já está decidida, e continuar percorrendo o resto seria desperdício.
  3. Porque o interromper apaga a arroba do texto.
  4. Porque o e-mail só pode ter uma arroba.
Ver a resposta

Resposta: B. Porque, assim que a arroba é encontrada, a resposta (contém sim) já está decidida, e continuar percorrendo o resto seria desperdício.

A pergunta é apenas se existe pelo menos uma arroba. No instante em que a primeira aparece, a resposta é sim e não há motivo para olhar o resto do texto. O interromper encerra a busca ali, aplicando a ideia de sair cedo do módulo 3.

Estudar a aula: Buscar dentro do texto e validar formatos

Questão 20 · aula Transformar e montar texto

Por que padronizar a caixa (deixar tudo em maiúsculas ou minúsculas) antes de comparar dois textos é uma boa prática?

  1. Porque textos em maiúsculas ocupam menos memória.
  2. Porque, para o computador, letras maiúsculas e minúsculas são diferentes; padronizar faz Maria e maria serem tratados como iguais na comparação.
  3. Porque comparar textos só funciona em maiúsculas.
  4. Porque a caixa muda o significado das palavras.
Ver a resposta

Resposta: B. Porque, para o computador, letras maiúsculas e minúsculas são diferentes; padronizar faz Maria e maria serem tratados como iguais na comparação.

O computador trata A e a como caracteres distintos, então Maria e maria seriam considerados diferentes numa comparação crua. Converter os dois para a mesma caixa antes de comparar elimina essa diferença e faz a igualdade funcionar como uma pessoa espera.

Estudar a aula: Transformar e montar texto

Módulo 6: Dicionários: buscar pela etiqueta

Questão 21 · aula Buscar pela etiqueta, não pela posição

Qual a diferença central entre buscar um dado numa lista e num dicionário?

  1. Não há diferença: os dois guardam dados iguais.
  2. Na lista, você busca pela posição (ou varre tudo); no dicionário, você busca pela chave (etiqueta), que leva direto ao valor.
  3. O dicionário só guarda números, e a lista só textos.
  4. A lista é sempre mais rápida que o dicionário.
Ver a resposta

Resposta: B. Na lista, você busca pela posição (ou varre tudo); no dicionário, você busca pela chave (etiqueta), que leva direto ao valor.

A lista organiza por posição: você acessa por índice ou percorre atrás do item. O dicionário organiza por etiqueta: você informa a chave e recebe o valor diretamente, sem se importar com ordem nem posição. Por isso dados identificados por um nome ou código combinam com dicionário.

Estudar a aula: Buscar pela etiqueta, não pela posição

Questão 22 · aula Criar, ler, atualizar e remover pares

Por que checar se a chave existe antes de acessá-la num dicionário é uma boa prática?

  1. Porque deixa o dicionário mais rápido.
  2. Porque buscar ou remover uma chave inexistente pode dar erro ou devolver um vazio confuso; a checagem trata esse caso antes, evitando o problema.
  3. Porque o dicionário só aceita chaves que já existem.
  4. Porque a checagem cria a chave automaticamente.
Ver a resposta

Resposta: B. Porque buscar ou remover uma chave inexistente pode dar erro ou devolver um vazio confuso; a checagem trata esse caso antes, evitando o problema.

Acessar uma chave ausente é uma fonte comum de erro. Perguntar se a chave existe antes, como uma cláusula de guarda, permite tratar o caso do ausente com uma mensagem amigável em vez de quebrar o programa. É barato e evita muitos bugs.

Estudar a aula: Criar, ler, atualizar e remover pares

Questão 23 · aula Dicionário ou lista: quando cada um vence

Você precisa consultar o preço de produtos milhares de vezes por segundo, sempre pelo código do produto. Por que um dicionário vence uma lista aqui?

  1. Porque o dicionário guarda menos dados que a lista.
  2. Porque a busca pela chave no dicionário é quase instantânea e não fica mais lenta com o tamanho, enquanto na lista seria preciso varrer os itens a cada consulta.
  3. Porque a lista não consegue guardar preços.
  4. Porque o dicionário mantém os produtos em ordem alfabética.
Ver a resposta

Resposta: B. Porque a busca pela chave no dicionário é quase instantânea e não fica mais lenta com o tamanho, enquanto na lista seria preciso varrer os itens a cada consulta.

Com milhares de consultas por código, a busca precisa ser rápida. O dicionário pula direto ao valor da chave, com custo quase constante mesmo com muitos produtos. Numa lista, cada consulta varreria os itens até achar o código, o que fica lento à medida que o catálogo cresce.

Estudar a aula: Dicionário ou lista: quando cada um vence

Questão 24 · aula O padrão da contagem de frequência

Na contagem de frequência, por que é preciso tratar de forma especial a PRIMEIRA vez que um item aparece?

  1. Porque o primeiro item sempre conta em dobro.
  2. Porque a chave daquele item ainda não existe no dicionário, então não há valor para somar; é preciso criar a chave com a contagem inicial (por exemplo, 1).
  3. Porque o dicionário só aceita itens novos no começo.
  4. Porque a primeira ocorrência não deve ser contada.
Ver a resposta

Resposta: B. Porque a chave daquele item ainda não existe no dicionário, então não há valor para somar; é preciso criar a chave com a contagem inicial (por exemplo, 1).

Somar um exige que a chave já tenha um valor. Na estreia de um item, a chave ainda não está no dicionário, então somar daria erro ou partiria do vazio. Por isso o padrão cria a chave com a contagem inicial na primeira vez e só soma nas aparições seguintes.

Estudar a aula: O padrão da contagem de frequência

Módulo 7: Conjuntos: tem ou não tem, sem repetir

Questão 25 · aula O conjunto: só importa se tem, e sem repetir

Qual afirmação descreve corretamente um conjunto?

  1. Guarda itens em ordem e permite repetição, como uma lista.
  2. Guarda itens únicos, sem ordem definida; adicionar um repetido não muda nada.
  3. Guarda pares de chave e valor, acessados pela chave.
  4. Guarda apenas números, nunca textos.
Ver a resposta

Resposta: B. Guarda itens únicos, sem ordem definida; adicionar um repetido não muda nada.

O conjunto guarda itens únicos e não tem ordem: você não acessa por posição, pergunta se um item pertence. A unicidade é automática, então adicionar um valor que já está no conjunto é ignorado. Pares chave-valor são do dicionário; ordem e repetição são da lista.

Estudar a aula: O conjunto: só importa se tem, e sem repetir

Questão 26 · aula Pertence ou não pertence: a pergunta do conjunto

Um sistema precisa checar milhões de vezes se um e-mail está numa lista de bloqueados. Por que um conjunto vence uma lista aqui?

  1. Porque o conjunto guarda os e-mails em ordem alfabética.
  2. Porque o teste de pertencimento no conjunto é quase instantâneo e quase não desacelera com o tamanho, enquanto na lista seria preciso varrer os itens a cada checagem.
  3. Porque a lista não consegue guardar e-mails.
  4. Porque o conjunto ocupa menos memória sempre.
Ver a resposta

Resposta: B. Porque o teste de pertencimento no conjunto é quase instantâneo e quase não desacelera com o tamanho, enquanto na lista seria preciso varrer os itens a cada checagem.

Com milhões de checagens, a velocidade do teste de presença é decisiva. O conjunto verifica o pertencimento direto, sem percorrer, com custo quase constante. Numa lista, cada checagem varreria os itens até achar (ou até o fim), o que fica lento à medida que a lista de bloqueados cresce.

Estudar a aula: Pertence ou não pertence: a pergunta do conjunto

Questão 27 · aula União, interseção e diferença

Você tem o conjunto de ingredientes que a receita pede e o conjunto do que já tem em casa. Qual operação diz o que falta comprar?

  1. A união dos dois conjuntos.
  2. A interseção dos dois conjuntos.
  3. A diferença entre o que a receita pede e o que você já tem em casa.
  4. O tamanho do conjunto da receita.
Ver a resposta

Resposta: C. A diferença entre o que a receita pede e o que você já tem em casa.

O que falta comprar é o que está na receita mas não está na sua casa: a diferença entre o conjunto dos ingredientes pedidos e o conjunto dos que você já tem. A ordem importa: seria diferente calcular o que você tem e a receita não pede.

Estudar a aula: União, interseção e diferença

Questão 28 · aula Deduplicar: o truque de tirar repetidos

Você converte uma lista de e-mails em ordem de cadastro para um conjunto, para remover duplicados. Qual é o efeito colateral a considerar?

  1. Os e-mails viram números.
  2. A ordem de cadastro se perde, porque o conjunto não guarda ordem; se a ordem importa, é preciso deduplicar de outro jeito.
  3. Os e-mails duplicados são mantidos.
  4. O conjunto fica maior que a lista original.
Ver a resposta

Resposta: B. A ordem de cadastro se perde, porque o conjunto não guarda ordem; se a ordem importa, é preciso deduplicar de outro jeito.

O conjunto remove os repetidos, mas não tem ordem, então a sequência de cadastro se perde na conversão. Se preservar a ordem importa, a solução é percorrer a lista com um conjunto de vistos e montar uma lista nova na ordem de primeira aparição.

Estudar a aula: Deduplicar: o truque de tirar repetidos

Módulo 8: Funções que valem ouro

Questão 29 · aula Parâmetros e argumentos: a função que recebe

Qual a diferença entre um parâmetro e um argumento?

  1. São a mesma coisa com nomes diferentes.
  2. O parâmetro é o nome na definição da função (o espaço reservado); o argumento é o valor concreto que você passa ao chamá-la.
  3. O parâmetro é sempre um número e o argumento sempre um texto.
  4. O argumento fica dentro da função e o parâmetro fora.
Ver a resposta

Resposta: B. O parâmetro é o nome na definição da função (o espaço reservado); o argumento é o valor concreto que você passa ao chamá-la.

O parâmetro é o nome que a função usa na definição para o dado que espera (preço, taxa). O argumento é o valor real que você entrega na chamada (100, 10). Um é o campo do formulário; o outro é o que você escreve nele.

Estudar a aula: Parâmetros e argumentos: a função que recebe

Questão 30 · aula Retornar não é imprimir: o valor que volta

Uma função calcula o total de uma compra. Por que é melhor ela RETORNAR o total em vez de apenas IMPRIMI-lo?

  1. Porque imprimir é mais lento que retornar.
  2. Porque o valor retornado pode ser usado no resto do programa (somar frete, aplicar cupom, guardar no histórico), enquanto o impresso só aparece e some.
  3. Porque imprimir é proibido dentro de funções.
  4. Porque retornar mostra o total na tela automaticamente.
Ver a resposta

Resposta: B. Porque o valor retornado pode ser usado no resto do programa (somar frete, aplicar cupom, guardar no histórico), enquanto o impresso só aparece e some.

Uma função que retorna o total entrega um valor vivo ao programa: dá para somar o frete, aplicar um cupom, comparar com um limite, guardar no histórico. Se ela só imprime, o total aparece e desaparece, sem poder ser reaproveitado. Por isso funções que calculam devem retornar.

Estudar a aula: Retornar não é imprimir: o valor que volta

Questão 31 · aula Escopo: o quintal privado de cada função

Por que duas funções diferentes podem ter, cada uma, uma variável chamada total sem que uma atrapalhe a outra?

  1. Porque o computador renomeia as variáveis automaticamente.
  2. Porque cada variável total é local à sua função (escopo local): elas vivem em quintais separados e não se enxergam.
  3. Porque só a primeira função realmente cria a variável.
  4. Porque variáveis com o mesmo nome sempre compartilham o valor.
Ver a resposta

Resposta: B. Porque cada variável total é local à sua função (escopo local): elas vivem em quintais separados e não se enxergam.

Variáveis criadas dentro de uma função têm escopo local: existem só ali. Dois total em funções diferentes são variáveis distintas, cada uma no seu escopo, que nascem e somem com a execução da sua função. Por isso não colidem, e você pode reusar nomes livremente.

Estudar a aula: Escopo: o quintal privado de cada função

Questão 32 · aula Funções puras e efeitos colaterais

Por que uma função pura é mais fácil de testar do que uma com efeito colateral?

  1. Porque funções puras são sempre mais curtas.
  2. Porque o resultado da função pura depende só dos argumentos: você a chama com valores conhecidos e confere a saída, sem se preocupar com estados externos.
  3. Porque funções puras não podem ter erros.
  4. Porque funções puras não usam parâmetros.
Ver a resposta

Resposta: B. Porque o resultado da função pura depende só dos argumentos: você a chama com valores conhecidos e confere a saída, sem se preocupar com estados externos.

A função pura dá sempre a mesma saída para a mesma entrada e não mexe em nada de fora. Testá-la é chamar com valores conhecidos e verificar o retorno. A função com efeito depende de estados externos (variáveis globais, arquivos, a tela), que precisam ser preparados e conferidos, tornando o teste mais trabalhoso.

Estudar a aula: Funções puras e efeitos colaterais

Módulo 9: Dividir para conquistar e a recursão

Questão 33 · aula Dividir para conquistar: quebrar o problema grande

Por que decompor um problema grande em funções menores facilita a programação?

  1. Porque funções menores fazem o computador rodar mais rápido.
  2. Porque cada subproblema pequeno é fácil de resolver, testar e consertar isoladamente, e o programa principal fica legível como um resumo das partes.
  3. Porque o computador só aceita funções curtas.
  4. Porque decompor elimina a necessidade de testar.
Ver a resposta

Resposta: B. Porque cada subproblema pequeno é fácil de resolver, testar e consertar isoladamente, e o programa principal fica legível como um resumo das partes.

Dividir transforma um problema assustador em vários fáceis. Cada função com um trabalho claro pode ser resolvida, testada e consertada sozinha, e o programa principal vira uma sequência legível de chamadas. O ganho é de organização e clareza para o ser humano, não de velocidade da máquina.

Estudar a aula: Dividir para conquistar: quebrar o problema grande

Questão 34 · aula A ideia da recursão: a função que chama a si mesma

O que impede uma função recursiva de chamar a si mesma para sempre, num círculo sem fim?

  1. Nada: recursão sempre roda para sempre.
  2. O fato de cada chamada trabalhar com um caso MENOR que o anterior, encolhendo em direção a um caso simples que não chama mais.
  3. Um limite de tempo automático do computador.
  4. A função chamar outra função diferente.
Ver a resposta

Resposta: B. O fato de cada chamada trabalhar com um caso MENOR que o anterior, encolhendo em direção a um caso simples que não chama mais.

A recursão termina porque cada chamada resolve um caso menor que o anterior, aproximando-se de um caso tão simples que a resposta é direta e não há nova chamada. Sem esse encolhimento rumo a um fim, a função chamaria a si mesma indefinidamente, o que é o problema da recursão infinita, tema da próxima aula.

Estudar a aula: A ideia da recursão: a função que chama a si mesma

Questão 35 · aula Caso base e caso recursivo: onde a recursão para

Qual é o papel do caso base numa função recursiva?

  1. É a parte que chama a função de novo para um caso maior.
  2. É o caso mais simples, com resposta direta, que NÃO chama a função de novo e faz a recursão parar.
  3. É um comentário que documenta a função.
  4. É a variável que conta quantas chamadas houve.
Ver a resposta

Resposta: B. É o caso mais simples, com resposta direta, que NÃO chama a função de novo e faz a recursão parar.

O caso base é o freio da recursão: o caso tão simples que a resposta é imediata, sem nova chamada. Ele é o chão da escada. Sem um caso base alcançável, a função chama a si mesma para sempre (recursão infinita). O caso recursivo é que chama de novo, sempre para um caso menor.

Estudar a aula: Caso base e caso recursivo: onde a recursão para

Questão 36 · aula A pilha de chamadas: como o computador não se perde

Um programa recursivo estoura com um erro de pilha (stack overflow). Qual é a causa mais provável?

  1. O computador ficou sem espaço em disco.
  2. A recursão é infinita: sem um caso base alcançável, as chamadas empilham sem parar e enchem a pilha até o limite.
  3. A função tem parâmetros demais.
  4. O programa está lento por causa de laços aninhados.
Ver a resposta

Resposta: B. A recursão é infinita: sem um caso base alcançável, as chamadas empilham sem parar e enchem a pilha até o limite.

O estouro de pilha acontece quando as chamadas empilham sem nunca desempilhar, o que é o retrato da recursão infinita: caso base ausente ou inalcançável. Cada chamada que não termina ocupa um lugar na pilha, que tem tamanho limitado. Ao encher, o programa estoura com esse erro característico.

Estudar a aula: A pilha de chamadas: como o computador não se perde

Módulo 10: Busca: achar rápido

Questão 37 · aula Busca linear: procurar do começo ao fim

Qual é a principal vantagem da busca linear sobre métodos de busca mais rápidos?

  1. Ela sempre encontra o item na primeira tentativa.
  2. Ela funciona em qualquer lista, ordenada ou não, sem exigir preparo prévio dos dados.
  3. Ela nunca examina o item errado.
  4. Ela deixa a lista ordenada como efeito colateral.
Ver a resposta

Resposta: B. Ela funciona em qualquer lista, ordenada ou não, sem exigir preparo prévio dos dados.

A busca linear não exige que os dados estejam em ordem: ela simplesmente confere item por item. Métodos mais rápidos, como a busca binária, exigem dados ordenados. Por isso a busca linear é a escolha quando os dados estão bagunçados ou quando ordená-los não compensaria.

Estudar a aula: Busca linear: procurar do começo ao fim

Questão 38 · aula O poder dos dados ordenados

Por que dados ordenados permitem uma busca muito mais rápida que dados embaralhados?

  1. Porque dados ordenados ocupam menos memória.
  2. Porque, ao comparar o alvo com o item do meio, a ordem revela de que lado o alvo está, permitindo descartar a outra metade de uma vez.
  3. Porque o computador lê dados ordenados mais rápido.
  4. Porque dados ordenados nunca têm repetidos.
Ver a resposta

Resposta: B. Porque, ao comparar o alvo com o item do meio, a ordem revela de que lado o alvo está, permitindo descartar a outra metade de uma vez.

A ordem carrega a informação de onde o alvo não pode estar. Comparar com o item do meio de uma lista ordenada diz se o alvo está antes ou depois, eliminando metade dos candidatos com uma só comparação. Numa lista embaralhada, o meio não informa nada, e é preciso conferir tudo.

Estudar a aula: O poder dos dados ordenados

Questão 39 · aula Busca binária: cortar pela metade

Qual é a condição indispensável para a busca binária funcionar corretamente?

  1. A lista precisa ter um número par de itens.
  2. Os dados precisam estar ordenados, para que a comparação com o item do meio indique de que lado o alvo está.
  3. A lista não pode ter itens repetidos.
  4. O item procurado precisa estar na primeira metade.
Ver a resposta

Resposta: B. Os dados precisam estar ordenados, para que a comparação com o item do meio indique de que lado o alvo está.

A busca binária depende da ordem: é ela que faz a comparação com o meio revelar em qual metade o alvo pode estar. Numa lista embaralhada, essa comparação não informa nada, e a busca binária daria respostas erradas. Ordem é o requisito inegociável.

Estudar a aula: Busca binária: cortar pela metade

Questão 40 · aula Linear ou binária: o abismo de esforço

Numa lista ordenada, você DOBRA o número de itens. Como muda o esforço no pior caso de cada busca?

  1. As duas dobram o esforço.
  2. A busca linear dobra o esforço; a binária adiciona apenas um passo.
  3. As duas adicionam um passo só.
  4. A busca binária dobra; a linear adiciona um passo.
Ver a resposta

Resposta: B. A busca linear dobra o esforço; a binária adiciona apenas um passo.

A busca linear examina até todos os itens, então dobrar a lista dobra o número máximo de comparações. A binária corta pela metade a cada passo, então dobrar a lista significa só um corte a mais: um único passo extra. É esse contraste que faz a binária brilhar em dados grandes.

Estudar a aula: Linear ou binária: o abismo de esforço

Módulo 11: Ordenação: colocar em ordem

Questão 41 · aula Por que ordenar vale tanto a pena

Qual é a razão número um para ordenar uma lista que será consultada muitas vezes?

  1. Ordenar deixa a lista menor e economiza memória.
  2. A ordem habilita a busca binária, que acha itens em pouquíssimos passos, e o custo de ordenar uma vez se paga nas muitas buscas seguintes.
  3. Ordenar remove os itens repetidos automaticamente.
  4. A lista ordenada roda mais rápido no computador por si só.
Ver a resposta

Resposta: B. A ordem habilita a busca binária, que acha itens em pouquíssimos passos, e o custo de ordenar uma vez se paga nas muitas buscas seguintes.

A ordem destrava a busca binária, que é relâmpago em listas grandes. Para uma lista muito consultada, ordenar uma vez e usar busca binária em todas as consultas economiza um enorme esforço, tornando o custo inicial de ordenar um ótimo investimento. Ordenar não encolhe os dados nem remove repetidos por si.

Estudar a aula: Por que ordenar vale tanto a pena

Questão 42 · aula Ordenação da bolha: trocar vizinhos

Por que trocar os valores de duas variáveis exige uma terceira variável auxiliar?

  1. Para deixar o código mais bonito.
  2. Porque, sem o auxiliar, ao copiar o primeiro valor para o lugar do segundo, o valor original do segundo é sobrescrito e se perde antes de ser copiado de volta.
  3. Porque o computador não permite comparar dois valores.
  4. Porque a troca só funciona com números pares.
Ver a resposta

Resposta: B. Porque, sem o auxiliar, ao copiar o primeiro valor para o lugar do segundo, o valor original do segundo é sobrescrito e se perde antes de ser copiado de volta.

Se você cópia A direto para B, o valor original de B é apagado antes de ir para A, e as duas caixas acabam iguais. O auxiliar guarda um dos valores antes de sobrescrever, como um terceiro copo vazio para trocar o conteúdo de dois copos cheios sem derramar.

Estudar a aula: Ordenação da bolha: trocar vizinhos

Questão 43 · aula Seleção e inserção: dois outros jeitos de ordenar

A ordenação por inserção tem uma vantagem especial. Qual é?

  1. Ela é a mais rápida de todas para qualquer lista, sempre.
  2. Ela é rapidíssima quando a lista já está quase ordenada, porque quase não há itens a empurrar de lugar.
  3. Ela nunca precisa comparar itens.
  4. Ela ordena sem usar nenhum laço.
Ver a resposta

Resposta: B. Ela é rapidíssima quando a lista já está quase ordenada, porque quase não há itens a empurrar de lugar.

A inserção encaixa cada item entre os já ordenados. Se os itens já chegam perto do lugar certo (lista quase ordenada), quase não há empurrões, e o trabalho é mínimo. Bolha e seleção não têm esse atalho: fazem o mesmo esforço esteja a lista bagunçada ou quase pronta.

Estudar a aula: Seleção e inserção: dois outros jeitos de ordenar

Questão 44 · aula Estabilidade e o custo de ordenar

Por que a estabilidade de uma ordenação importa ao ordenar por vários critérios?

  1. Porque ordenações estáveis são sempre mais rápidas.
  2. Porque, ao ordenar por um segundo critério, uma ordenação estável mantém a ordem que os itens de mesmo valor já tinham do critério anterior, sem bagunçá-la.
  3. Porque só ordenações estáveis conseguem ordenar textos.
  4. Porque a estabilidade remove itens repetidos.
Ver a resposta

Resposta: B. Porque, ao ordenar por um segundo critério, uma ordenação estável mantém a ordem que os itens de mesmo valor já tinham do critério anterior, sem bagunçá-la.

Para ordenar por cliente e, dentro do cliente, por data, você ordena por data e depois por cliente com um método estável. A estabilidade preserva a ordem por data entre os pedidos do mesmo cliente, em vez de embaralhá-la. Sem estabilidade, a segunda ordenação estragaria o resultado da primeira.

Estudar a aula: Estabilidade e o custo de ordenar

Módulo 12: Quanto custa: eficiência e a noção de Big-O

Questão 45 · aula Contar passos, não segundos

Por que se mede a eficiência de um algoritmo contando passos, e não cronometrando o tempo?

  1. Porque contar passos é mais divertido.
  2. Porque o tempo depende da máquina (potente ou fraca, ocupada ou livre), enquanto a contagem de passos é uma propriedade do algoritmo, igual em qualquer computador.
  3. Porque cronômetros são imprecisos demais.
  4. Porque algoritmos não gastam tempo real.
Ver a resposta

Resposta: B. Porque o tempo depende da máquina (potente ou fraca, ocupada ou livre), enquanto a contagem de passos é uma propriedade do algoritmo, igual em qualquer computador.

O tempo de relógio varia com o computador, a carga da máquina e a linguagem, então comparar por tempo pode medir a máquina, não o algoritmo. A contagem de passos independe de onde o código roda: mil comparações são mil comparações em qualquer máquina. Por isso é a medida justa de eficiência.

Estudar a aula: Contar passos, não segundos

Questão 46 · aula Como o custo cresce com o tamanho

Um algoritmo tem custo quadrático. Se você DOBRA o tamanho dos dados, o que acontece com o custo?

  1. Dobra também.
  2. Quadruplica (fica quatro vezes maior), porque o custo cresce com o quadrado do tamanho.
  3. Adiciona só um passo.
  4. Fica igual, pois é constante.
Ver a resposta

Resposta: B. Quadruplica (fica quatro vezes maior), porque o custo cresce com o quadrado do tamanho.

No crescimento quadrático, o custo é proporcional ao quadrado do tamanho. Dobrar o tamanho eleva o custo ao quadrado do dobro, ou seja, quatro vezes. É o comportamento dos laços aninhados e da ordenação da bolha, e é por isso que eles ficam inviáveis com dados grandes.

Estudar a aula: Como o custo cresce com o tamanho

Questão 47 · aula A notação Big-O: o vocabulário do custo

Um programador diz que a busca num dicionário pela chave é O(1). O que isso significa?

  1. Que a busca demora exatamente 1 segundo.
  2. Que o custo da busca é constante: não muda com o tamanho do dicionário, seja ele pequeno ou gigante.
  3. Que o dicionário só pode ter 1 item.
  4. Que a busca falha 1 vez a cada tentativa.
Ver a resposta

Resposta: B. Que o custo da busca é constante: não muda com o tamanho do dicionário, seja ele pequeno ou gigante.

O(1) é o nome do custo constante: a operação faz um trabalho fixo, independente do tamanho dos dados. Buscar por chave num dicionário custa praticamente o mesmo com dez ou dez milhões de itens. O 1 não é um tempo em segundos, é a forma constante de crescimento.

Estudar a aula: A notação Big-O: o vocabulário do custo

Questão 48 · aula Escolher e otimizar com bom senso

Seu programa está lento processando milhões de registros. Onde procurar o maior ganho de desempenho?

  1. Apertando cada linha de código para economizar operações soltas.
  2. Na escolha do algoritmo e da estrutura de dados: por exemplo, trocar uma busca linear repetida por consultas de dicionário, ou um algoritmo quadrático por um mais eficiente.
  3. Comprando um computador mais caro e ignorando o código.
  4. Removendo os comentários do código.
Ver a resposta

Resposta: B. Na escolha do algoritmo e da estrutura de dados: por exemplo, trocar uma busca linear repetida por consultas de dicionário, ou um algoritmo quadrático por um mais eficiente.

Os grandes ganhos vêm de mudar a forma de crescimento, subindo na hierarquia do Big-O: trocar O(n) repetido por O(1), ou O(n ao quadrado) por O(n log n). Microajustes dentro da mesma forma rendem pouco, e uma máquina melhor não conserta um algoritmo de forma ruim com dados grandes.

Estudar a aula: Escolher e otimizar com bom senso

Módulo 13: Quando dá errado: erros e robustez

Questão 49 · aula Os três tipos de erro

Por que o erro de lógica é considerado o mais perigoso dos três tipos?

  1. Porque ele impede o programa de rodar.
  2. Porque o programa roda normalmente e entrega uma resposta errada sem gerar nenhuma mensagem, então o problema pode passar despercebido por muito tempo.
  3. Porque ele sempre trava o computador inteiro.
  4. Porque só acontece em programas muito grandes.
Ver a resposta

Resposta: B. Porque o programa roda normalmente e entrega uma resposta errada sem gerar nenhuma mensagem, então o problema pode passar despercebido por muito tempo.

O erro de lógica não dá sinal: o código roda liso e entrega um resultado que parece certo, mas está errado. Sem mensagem de erro, ninguém percebe de imediato, e o prejuízo só aparece quando alguém nota que a conta nunca fechou. Por isso ele exige teste de mesa e testes automatizados para ser caçado.

Estudar a aula: Os três tipos de erro

Questão 50 · aula Exceções: tentar e capturar

Qual é o principal benefício de usar tentar/capturar ao redor de um trecho arriscado?

  1. Deixar o programa rodar mais rápido.
  2. Se uma exceção acontecer no trecho, o programa desvia para o tratamento (capturar) em vez de quebrar, permitindo mostrar uma mensagem ou tentar uma alternativa.
  3. Impedir que o usuário digite qualquer coisa.
  4. Corrigir automaticamente o erro no código.
Ver a resposta

Resposta: B. Se uma exceção acontecer no trecho, o programa desvia para o tratamento (capturar) em vez de quebrar, permitindo mostrar uma mensagem ou tentar uma alternativa.

O tentar/capturar intercepta a exceção: em vez de o erro derrubar o programa, o fluxo pula para o bloco capturar, onde você trata o problema com elegância (uma mensagem amigável, um valor padrão, uma nova tentativa). Ele não acelera o código nem corrige o erro sozinho; ele dá a você o controle na hora da falha.

Estudar a aula: Exceções: tentar e capturar

Questão 51 · aula Validar a entrada: a muralha de defesa

Por que a regra de ouro da robustez é nunca confiar nos dados que vêm de fora do programa?

  1. Porque dados de fora são sempre maliciosos.
  2. Porque o que o usuário digita, ou o que chega de arquivos e da rede, pode vir vazio, fora de faixa, com formato errado ou malicioso, e usá-lo sem conferir é a maior fonte de erros e brechas.
  3. Porque dados de fora são mais lentos de processar.
  4. Porque o programa não consegue ler dados externos.
Ver a resposta

Resposta: B. Porque o que o usuário digita, ou o que chega de arquivos e da rede, pode vir vazio, fora de faixa, com formato errado ou malicioso, e usá-lo sem conferir é a maior fonte de erros e brechas.

Dados externos não estão sob o seu controle: o usuário erra, deixa em branco, digita absurdos, ou tenta abusar de propósito. Usá-los sem validar é a raiz da maioria dos erros de execução e das brechas de segurança. Por isso a validação na porta, tratando todo dado externo como não confiável até passar pelas regras.

Estudar a aula: Validar a entrada: a muralha de defesa

Questão 52 · aula Casos de borda e programação defensiva

O que é a programação defensiva?

  1. Escrever a menor quantidade de código possível.
  2. A postura de antecipar o que pode dar errado (casos de borda, entradas ruins, o inesperado) e proteger o código contra isso, em vez de supor que tudo virá perfeito.
  3. Nunca deixar o programa mostrar mensagens de erro.
  4. Usar apenas funções puras no programa inteiro.
Ver a resposta

Resposta: B. A postura de antecipar o que pode dar errado (casos de borda, entradas ruins, o inesperado) e proteger o código contra isso, em vez de supor que tudo virá perfeito.

Programar defensivamente é assumir que o inesperado vai acontecer e se preparar: checar a lista vazia antes de dividir, validar dados de fora, amparar trechos arriscados. Reúne guardas, validação e tratamento de exceções. Não é escrever menos nem esconder erros; é encarar a realidade de que as coisas dão errado e decidir de antemão o que fazer.

Estudar a aula: Casos de borda e programação defensiva

Módulo 14: Código que se lê

Questão 53 · aula Nomes que explicam sozinhos

Por que nomear bem variáveis e funções é considerado a maior alavanca de legibilidade?

  1. Porque nomes longos deixam o programa mais rápido.
  2. Porque o nome aparece em toda linha que usa a variável ou função, então um nome que se explica poupa quem lê de investigar, milhares de vezes ao longo da vida do código.
  3. Porque o computador exige nomes descritivos.
  4. Porque nomes bons ocupam menos memória.
Ver a resposta

Resposta: B. Porque o nome aparece em toda linha que usa a variável ou função, então um nome que se explica poupa quem lê de investigar, milhares de vezes ao longo da vida do código.

O nome é o texto mais lido do código, aparecendo em cada uso. Um nome descritivo conta a história sozinho e poupa quem lê de caçar a definição, repetidas vezes, por várias pessoas, incluindo o autor no futuro. Esse ganho, multiplicado por todas as leituras, é enorme, e o custo é só um instante de reflexão ao escrever.

Estudar a aula: Nomes que explicam sozinhos

Questão 54 · aula Funções pequenas e o princípio de não se repetir

Qual é o principal benefício de aplicar o princípio DRY (não repetir a mesma lógica)?

  1. O código fica mais curto e ocupa menos espaço em disco.
  2. Quando a regra precisa mudar, você corrige num lugar só e todos os usos mudam juntos, em vez de caçar e ajustar várias cópias (e arriscar esquecer uma).
  3. O programa roda mais rápido.
  4. Elimina a necessidade de testar o código.
Ver a resposta

Resposta: B. Quando a regra precisa mudar, você corrige num lugar só e todos os usos mudam juntos, em vez de caçar e ajustar várias cópias (e arriscar esquecer uma).

O ganho do DRY é de manutenção: com a regra centralizada numa função, uma correção acontece num único ponto e vale para todos os usos. Código duplicado obriga a corrigir cada cópia, e uma esquecida vira bug silencioso. O benefício não é economizar espaço nem velocidade; é ter uma única fonte de verdade para cada regra.

Estudar a aula: Funções pequenas e o princípio de não se repetir

Questão 55 · aula Comentários que ajudam, e os que atrapalham

Por que um comentário desatualizado é considerado pior do que nenhum comentário?

  1. Porque comentários deixam o programa mais lento.
  2. Porque ele descreve algo que o código não faz mais e, como parece uma explicação oficial, induz quem lê a acreditar numa informação falsa.
  3. Porque o computador executa os comentários.
  4. Porque comentários ocupam muito espaço em disco.
Ver a resposta

Resposta: B. Porque ele descreve algo que o código não faz mais e, como parece uma explicação oficial, induz quem lê a acreditar numa informação falsa.

Comentários não são executados, então nada os obriga a acompanhar as mudanças do código. Um comentário esquecido descreve uma lógica antiga e mente sobre o que o programa faz agora. Quem lê confia nele e é induzido ao erro. Sem comentário, você lê a lógica; com o errado, acredita numa mentira. Por isso, comente com parcimônia e mantenha os comentários atualizados.

Estudar a aula: Comentários que ajudam, e os que atrapalham

Questão 56 · aula Refatorar: melhorar o código sem quebrar

O que caracteriza a refatoração?

  1. Reescrever o programa do zero numa linguagem nova.
  2. Melhorar a estrutura interna de um código que já funciona (nomes, organização, duplicação) sem mudar o que ele faz por fora, idealmente apoiado em testes.
  3. Adicionar novos recursos ao programa.
  4. Deixar o programa mais rápido a qualquer custo.
Ver a resposta

Resposta: B. Melhorar a estrutura interna de um código que já funciona (nomes, organização, duplicação) sem mudar o que ele faz por fora, idealmente apoiado em testes.

Refatorar é melhorar a qualidade interna do código mantendo idêntico o comportamento observável, como arrumar um quarto sem mudar de casa. Não é reescrever do zero, adicionar recursos nem focar velocidade; é organizar o que já existe. Os testes são a rede que garante que o comportamento não mudou durante a faxina.

Estudar a aula: Refatorar: melhorar o código sem quebrar

Módulo 15: Projeto final: o Gerenciador de Tarefas

Questão 57 · aula Planejar o gerenciador: entender e decompor

Por que montar o esqueleto do programa (as funções e o laço principal) antes de escrever os detalhes é uma boa prática?

  1. Porque o computador exige o esqueleto primeiro.
  2. Porque você enxerga o todo e corrige problemas de projeto ainda no barato (no papel), ganha um mapa de onde cada coisa está, e pode preencher e testar uma função de cada vez.
  3. Porque o esqueleto deixa o programa mais rápido.
  4. Porque assim não precisa mais testar o código.
Ver a resposta

Resposta: B. Porque você enxerga o todo e corrige problemas de projeto ainda no barato (no papel), ganha um mapa de onde cada coisa está, e pode preencher e testar uma função de cada vez.

O esqueleto é a planta da casa: mostra as partes e como se encaixam antes de investir no detalhe. Corrigir o projeto no papel é barato; corrigir código emaranhado é caro. Além disso, o esqueleto dá um mapa (onde procurar bugs) e permite trabalhar por partes, terminando e testando uma função de cada vez.

Estudar a aula: Planejar o gerenciador: entender e decompor

Questão 58 · aula Guardar as tarefas: a estrutura de dados

Por que cada tarefa do gerenciador é modelada como um dicionário, e a coleção como uma lista?

  1. Por acaso: qualquer estrutura serviria igual.
  2. Porque a tarefa tem vários campos nomeados (descrição, estado), o que pede um dicionário; e a coleção tem ordem e cresce, o que pede uma lista. Juntas, formam uma lista de dicionários.
  3. Porque dicionários e listas são as únicas estruturas que existem.
  4. Porque a lista deixa a busca instantânea.
Ver a resposta

Resposta: B. Porque a tarefa tem vários campos nomeados (descrição, estado), o que pede um dicionário; e a coleção tem ordem e cresce, o que pede uma lista. Juntas, formam uma lista de dicionários.

Cada tarefa reúne informações nomeadas que descrevem uma coisa (um registro), o papel natural do dicionário. A coleção de tarefas tem ordem e muda de tamanho, o território da lista. A combinação, lista de dicionários, é o formato clássico para dados do mundo real, e torna adicionar, listar e alterar tarefas simples e expansível.

Estudar a aula: Guardar as tarefas: a estrutura de dados

Questão 59 · aula Buscar, filtrar e concluir com validação

Na função que busca uma tarefa pela descrição, por que padronizar a caixa (deixar tudo em minúsculas) antes de comparar?

  1. Para deixar a busca mais rápida.
  2. Porque maiúsculas e minúsculas são diferentes para o computador; padronizar faz a busca por pao encontrar também Pão e PÃO, como o usuário espera.
  3. Porque o dicionário exige textos em minúsculas.
  4. Porque a lista só aceita letras minúsculas.
Ver a resposta

Resposta: B. Porque maiúsculas e minúsculas são diferentes para o computador; padronizar faz a busca por pao encontrar também Pão e PÃO, como o usuário espera.

Para o computador, P e p são caracteres diferentes, então uma busca por pao não acharia Pão sem cuidado. Converter tanto o termo procurado quanto a descrição para minúsculas antes de comparar faz a busca ignorar a diferença de caixa e encontrar o que o usuário quer, exatamente a técnica do módulo de strings aplicada aqui.

Estudar a aula: Buscar, filtrar e concluir com validação

Questão 60 · aula Juntando tudo é o próximo passo

Por que traduzir o Gerenciador de Tarefas de pseudocódigo para uma linguagem real (como Python) tende a ser direto?

  1. Porque o pseudocódigo já é código Python.
  2. Porque a parte difícil, a lógica (estruturas, funções, decisões, validação), já está pronta; muda só a sintaxe, e o SE vira if, o ENQUANTO vira while, e assim por diante.
  3. Porque o computador traduz o pseudocódigo automaticamente.
  4. Porque linguagens reais não usam lógica.
Ver a resposta

Resposta: B. Porque a parte difícil, a lógica (estruturas, funções, decisões, validação), já está pronta; muda só a sintaxe, e o SE vira if, o ENQUANTO vira while, e assim por diante.

O trabalho pesado de um programa é a lógica: decidir as estruturas, decompor em funções, tratar os casos. Isso o pseudocódigo do gerenciador já resolveu. Traduzir para uma linguagem é vestir essa lógica com a sintaxe dela: o SE vira if, o ENQUANTO vira while, a lista continua lista. Por isso quem domina a lógica aprende a linguagem rápido, e o Python, próximo do pseudocódigo, torna a transição ainda mais suave.

Estudar a aula: Juntando tudo é o próximo passo

Terminou a lista?

Quem acertou quase tudo já pode encarar o exame final do curso, com 20 questões sorteadas e aprovação a partir de 70%. Quem errou bastante ganha mais voltando às aulas dos módulos em que tropeçou: cada questão acima leva direto à aula certa.

Ir para o Curso de Lógica de Programação Intermediário