Pular para o conteúdo

Projeto de algoritmos e resolução de problemas

Ciência da Computação IGCSE · Tópico 7

Ver Slides Treinar
Videoaula para este tópico Abrir a página do vídeo
9:17

O Ciclo de Vida do Desenvolvimento de Programas

Cada aplicativo no seu celular foi escrito por alguém assim. Mas eles não começaram digitando código. Antes da primeira linha, o problema foi estudado, a solução…

Narração em inglês · legendas em inglês e 中文 que você pode alternar

Programa
Os candidatos devem ser capazes de: Notas e orientações
1 Entenda o ciclo de vida do desenvolvimento de programas, limitado a: análise, projeto, codificação e testes • Incluindo identificar cada etapa e realizar essas tarefas para cada etapa: – análise: abstração, decomposição do problema, identificação do problema e requisitos – projeto: decomposição, diagramas de estrutura, fluxogramas, pseudocódigo – codificação: escrita de código de programa e testes iterativos – testes: teste de código de programa com o uso de dados de teste
2 (a) Entenda que todo sistema computacional é composto por sub-sistemas, que são compostos por outros sub-sistemas (b) Entenda como um problema pode ser decomposto em suas partes componentes • Incluindo: – entradas – processos – saídas – armazenamento
(c) Use diferentes métodos para projetar e construir uma solução para um problema • Incluindo: – diagramas de estrutura – fluxogramas – pseudocódigo
3 Explique a finalidade de um algoritmo dado • Incluindo: – stating the purpose of an algorithm – describing the processes involved in an algorithm
4 Entenda métodos padrão de solução • Limitado a: – busca linear – ordenação bolha – totalização – contagem – encontrar valores máximo, mínimo e médio
5 (a) Entenda a necessidade de verificações de validação serem feitas nos dados de entrada e os diferentes tipos de verificação de validação • Incluindo: – verificação de intervalo – verificação de comprimento – verificação de tipo – verificação de presença – verificação de formato – dígito verificador
(b) Compreender a necessidade de checks de verificação nos dados de entrada e os diferentes tipos de checks de verificação • Incluindo: – check visual – check de entrada dupla
6 Sugerir e aplicar dados de teste adequados • Limitado a: – normal – anormal – extremo – limite • Dados extremos são o maior/menor valor aceitável • Dados de limite são o maior/menor valor aceitável e o correspondente menor/maior valor rejeitado
7 Preencher uma tabela de traçagem para documentar um dry-run de um algoritmo • Incluindo, em cada etapa do algoritmo: – variáveis – saídas – prompts ao usuário
8 Identificar erros em algoritmos fornecidos e sugerir formas de corrigi-los
9 Escrever e alterar algoritmos para problemas ou cenários dados, usando: pseudocódigo, código de programa e fluxogramas • Precisão é necessária ao escrever algoritmos, ex: x > y é aceitável, mas x is greater than y não é aceitável • Veja seção 4 para símbolos de fluxograma • Veja seção 4 para pseudocódigo

Fonte: Programa Cambridge International

7.1

Ciclo de vida do desenvolvimento de programas

O ciclo de vida do desenvolvimento de programas é o conjunto de etapas usadas para criar um programa. Existem quatro etapas.

Um programador digitando código em um computador
O software é escrito por programadores, que seguem o ciclo de desenvolvimento
Etapa O que você faz
análise estudar o problema e definir o que é necessário
projeto planejar como o programa funcionará
codificação escrever o código do programa e testá-lo conforme avança
testes executar o programa final com dados de teste para encontrar erros
Quatro etapas em sequência — análise, projeto, codificação, testes — com uma seta voltando dos testes para o projeto
As quatro etapas do desenvolvimento de programas; testes retroalimentam para corrigir e refinar o projeto
Um fluxograma de programa com caixas de processo losangos de decisão
Um fluxograma de programa detalha os passos e decisões de um programa durante a etapa de projeto

Análise

Na análise você entende o problema. Duas habilidades-chave ajudam:

  • abstração — manter apenas os detalhes importantes e ignorar o resto;
  • decomposição — dividir um problema grande em partes menores e mais fáceis.

Projeto

No projeto, você planeja a solução, frequentemente usando decomposição. Pode mostrar as partes como sub-sistemas em um diagrama estrutural (um gráfico que divide um sistema em caixas menores).

Exemplo resolvido. Um estacionamento tem uma máquina de pagamento. O motorista digita a placa do carro, a máquina calcula quanto tempo o carro ficou estacionado e o valor a pagar, o motorista paga em dinheiro ou cartão, e um recibo é impresso. Desenhe um diagrama de estrutura.

Um diagrama de estrutura: Máquina de pagamento no topo, dividida em Entrada, Calcular valor, Receber pagamento e Saída; Entrada divide-se em placa e horário de chegada, Receber pagamento divide-se em dinheiro e cartão
Um diagrama de estrutura para a máquina de pagamento do estacionamento: cada caixa é um subsistema, e cada nível inferior divide a caixa do nível superior em partes menores

O sistema inteiro fica na caixa superior. Cada caixa no nível seguinte representa uma tarefa realizada pelo sistema, e uma caixa pode ser dividida novamente (o pagamento divide-se em dinheiro e cartão). Leia cada nível da esquerda para a direita, na ordem em que as tarefas acontecem. Um diagrama de estrutura mostra as partes, não a ordem das decisões ou dos laços: para isso, usa-se um fluxograma ou pseudocódigo.

Codificação e testes

Na codificação, você escreve o código do programa. Usa testes iterativos — testa pequenas partes repetidamente à medida que as constrói. Nos testes, executa o programa inteiro com dados de teste para verificar se funciona.

Vocabulário Treinar
English Português
program development life cycle/ˈprəʊɡræm dɪˈveləpmənt laɪf ˈsaɪkl/ ciclo de vida do desenvolvimento de programas
analysis/əˈnæləsɪs/ análise
design/dɪˈzaɪn/ design
coding/ˈkəʊdɪŋ/ codificação
testing/ˈtestɪŋ/ testes
abstraction/əbˈstrækʃn/ abstração
decomposition/ˌdiːkɒmpəˈzɪʃn/ decomposição
sub-systems/sʌb ˈsɪstəmz/ sub-sistemas
structure diagram/ˈstrʌktʃə ˈdaɪəɡræm/ diagrama de estrutura
iterative testing/ˈɪtərətɪv ˈtestɪŋ/ teste iterativo
flowchart/ˈfləʊtʃɑːt/ fluxograma
7.2

Ferramentas de projeto

Você pode planejar uma solução de três maneiras principais.

  • um diagrama estrutural — mostra as partes de um sistema e como elas se encaixam;
  • fluxograma — um diagrama usando caixas e setas para mostrar as etapas em ordem;
  • pseudocódigo — passos escritos em inglês simples semelhante a código (não uma linguagem real).
Um fluxograma para somar os números de 1 a n, com símbolos de início/fim, entrada/saída, processo e decisão, além de uma legenda nomeando cada forma
Um fluxograma para o algoritmo de soma, usando os símbolos padrão (início/fim, entrada/saída, processo, decisão)
7.3

Algoritmos

Ordenação bolha, passo a passo

Um algoritmo é um conjunto de etapas, na ordem correta, que resolve um problema. Todo algoritmo pode ser dividido em três partes:

  • entrada — os dados que entram;
  • processamento — o trabalho realizado sobre os dados;
  • saída — o resultado que sai.

Isso se chama decomposição em entradas, processos e saídas. Por exemplo, para “calcular a média de três notas”: as entradas são as três notas; o processamento consiste em somá-las e dividir por 3; a saída é a média.

Três caixas — ENTRADA (as 3 notas), PROCESSO (somá-las, dividir por 3), SAÍDA (a média) — unidas por setas
Todo algoritmo se decompõe em entrada, processamento e saída — aqui, encontrando a média de três notas
Vocabulário Treinar
English Português
bubble sort/ˈbʌbl sɔːt/ ordenação por bolha
7.4

Validação e verificação

Quando os dados são inseridos, você os verifica para reduzir erros.

Validação verifica se os dados são razoáveis e seguem as regras. Não pode verificar se os dados são verdadeiros, apenas se são permitidos.

Verificação de validação O que ela verifica
verificação de intervalo o valor está entre um mínimo e um máximo permitidos
verificação de comprimento o número de caracteres é permitido (ex.: senha ≥ 8)
verificação de tipo os dados são do tipo correto (ex.: número, não letras)
verificação de presença algo foi realmente inserido (não deixado em branco)
verificação de formato os dados estão no padrão correto (ex.: data como dd/mm/aaaa)
dígito verificador um dígito calculado adicional ajuda a detectar erros ao inserir um número

Verificação confirma que os dados foram copiados ou inseridos corretamente (sem erros de digitação). Dois métodos:

  • verificação visual — uma pessoa compara os dados digitados com o original;
  • entrada dupla — os dados são inseridos duas vezes e as duas cópias são comparadas.
Dois painéis: a validação verifica se os dados são permitidos, usando verificações de intervalo, comprimento, tipo, presença, formato e dígito verificador, de modo que uma idade de 250 é rejeitada; a verificação confere se os dados foram copiados corretamente, por conferência visual ou entrada dupla, de modo que 34 digitado no lugar de 43 é detectado
A validação impede a entrada de dados não permitidos; a verificação detecta dados permitidos que foram digitados incorretamente

Como escrever uma rotina de validação

Uma prova frequentemente pede que você escreva o código de uma verificação. Use um laço que solicite a entrada novamente até que ela seja aceitável e apresente uma mensagem ao usuário quando não for.

Exemplo resolvido. Escreva um pseudocódigo para receber uma nota de prova, que deve ser um número inteiro de 0 a 100 (uma verificação de intervalo), e continuar solicitando a entrada até que uma nota válida seja inserida.

DECLARE Mark : INTEGER
REPEAT
    OUTPUT "Enter a mark from 0 to 100"
    INPUT Mark
    IF Mark < 0 OR Mark > 100
      THEN
        OUTPUT "Invalid: the mark must be from 0 to 100"
    ENDIF
UNTIL Mark >= 0 AND Mark <= 100

A condição UNTIL é o intervalo aceito, e a condição IF é o seu oposto. Observe OR em IF: uma nota não pode ser menor que 0 e maior que 100 ao mesmo tempo, então AND nessa posição nunca seria verdadeiro.

Outras verificações seguem o mesmo padrão, com uma condição diferente:

Verificação Condição para um valor válido
verificação de comprimento (senha com pelo menos 8 caracteres) LENGTH(Password) >= 8
verificação de presença (um nome deve ser inserido) Name <> ""
verificação de intervalo (idade de 16 a 65) Age >= 16 AND Age <= 65

Uma verificação de tipo geralmente é feita pela própria linguagem, por exemplo, quando uma entrada é armazenada em uma variável do tipo INTEGER.

Vocabulário Treinar
English Português
pseudocode/ˈsuːdəʊkəʊd/ pseudocódigo
algorithm/ˈælɡərɪθəm/ algoritmo
input/ˈɪnpʊt/ entrada
processing/ˈprəʊsesɪŋ/ processamento
output/ˈaʊtpʊt/ saída
7.5

Tabelas de traçagem

Uma tabela de traçagem registra o valor de cada variável à medida que um algoritmo é executado, passo a passo. Ela ajuda você a:

A trace table with columns count, total, output
Uma tabela de rastreamento registra o valor de cada variável enquanto o programa executa
  • verificar se um algoritmo funciona corretamente;
  • descobrir o que um algoritmo faz seguindo-o com dados fornecidos.

Exemplo: faça a traça deste algoritmo com a entrada 5.

INPUT N
Total ← 0
FOR I ← 1 TO N
    Total ← Total + I
NEXT I
OUTPUT Total
i total OUTPUT
1 1
2 3
3 6
4 10
5 15 15

A traça mostra que o algoritmo soma de 1 até n. Com entrada 5, a saída é 15.

Worked example. Faça a traça deste algoritmo e dê a saída.

X ← 20
Count ← 0
WHILE X > 1
    X ← DIV(X, 2)
    Count ← Count + 1
ENDWHILE
OUTPUT Count

DIV retorna apenas a parte inteira de uma divisão. Faça uma linha por passagem: x torna-se 10 (count 1), depois 5 (count 2), depois 2 (count 3), depois 1 (count 4). Agora x > 1 é falso, então o loop para e a saída é 4. Dois hábitos protegem essas marcas: teste a condição antes de cada passagem em vez de depois, e escreva uma nova linha para cada passagem — tentar guardar os valores na cabeça é o que causa erros nas traces.

Como encontrar e corrigir erros

Uma questão comum apresenta um algoritmo com erros e pede que você os encontre e corrija. Leia-o linha por linha e pergunte: toda variável recebe um valor inicial? Cada laço tem a duração correta? Cada comparação está no sentido correto? A saída está no lugar certo?

Exemplo resolvido. Este algoritmo deve receber 10 números e apresentar o maior. Encontre os três erros e corrija-os.

Largest ← 1000
FOR Count ← 1 TO 9
    INPUT Number
    IF Number < Largest
      THEN
        Largest ← Number
    ENDIF
    OUTPUT Largest
NEXT Count
  • Linha 1: Largest ← 1000 começa com um valor alto demais, então nenhum número o substituiria. Correção: Largest ← -1000 (ou receba o primeiro número e use-o como valor inicial).
  • Linha 2: o laço é executado apenas 9 vezes. Correção: FOR Count ← 1 TO 10.
  • Linha 4: < encontra o menor valor. Correção: IF Number > Largest.

Também há um problema com OUTPUT: dentro do laço, ele imprime o maior valor até aquele momento após cada entrada. Movê-lo para depois de NEXT Count faz com que apenas a resposta final seja impressa. Para cada erro, indique a linha, diga o que está errado e escreva a linha corrigida por completo.

Explorar

Uma tabela de traçado

Passe pela iteração e preencha a tabela de traçado, uma linha por passagem.

Vocabulário Treinar
English Português
trace table/treɪs ˈteɪbl/ tabela de traçagem
7.6

Dados de teste

Test data são dados usados para testar um programa. Existem quatro tipos que você deve saber.

Type Meaning Example (age 0–120 allowed)
normal dados sensatos que devem ser aceitos 25
anormal dados incorretos que devem ser rejeitados -4 ou “gato”
extremo os valores maior e menor ainda permitidos 0 e 120
limiar os valores em ambos os lados de um limite (um permitido, outro não) 120 e 121

Exemplo resolvido. Um programa aceita o número de pessoas que reservam uma mesa, de 1 a 12. Forneça dados de teste de cada tipo, com o resultado esperado.

Tipo Dados de teste Resultado esperado
normal 5 aceito
anormal 20 (ou “seis”) rejeitado, com uma mensagem de erro
extremo 1 e 12 aceitos
limite 12 e 13 (ou 0 e 1) 12 aceito, 13 rejeitado

Sempre forneça o resultado esperado com os dados: um teste só é útil se você souber o que deve acontecer. Um dado extremo é o próprio valor do limite; dados de limite formam um par, com um valor de cada lado do limite.

Reta numérica para reservas de 1 a 12 pessoas: normal 5, extremos 1 e 12, pares de limite 0 e 1 e 12 e 13, anormal 20
Dados de teste em uma reta: valores extremos estão nos limites, pares de limite ficam dos dois lados deles
Vocabulário Treinar
English Português
test data/test ˈdeɪtə/ dados de teste
normal/ˈnɔːml/ dado normal
abnormal/əbˈnɔːml/ dado anormal
extreme/ekˈstriːm/ dado extremo
boundary/ˈbaʊndəri/ dado limite
7.7

Métodos padrão de solução

Você deve conhecer esses algoritmos comuns.

Busca linear

Uma busca linear compara cada item com o alvo, começando pelo início. Pare quando o valor for encontrado ou a lista terminar. A lista não precisa estar ordenada. O exemplo abaixo usa posições 1 a 4.

DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, SearchValue : INTEGER
DECLARE Found : BOOLEAN
List[1] ← 8
List[2] ← 3
List[3] ← 5
List[4] ← 1
INPUT SearchValue
Found ← FALSE
I ← 1
WHILE I <= 4 AND NOT Found
    IF List[I] = SearchValue
      THEN
        Found ← TRUE
    ENDIF
    I ← I + 1
ENDWHILE
OUTPUT Found

Exemplo resolvido. Buscar 5 compara 8, 3 e depois 5: três comparações, com Found tornando-se TRUE. O quarto item não é verificado. Buscar 9 compara todos os quatro valores; Found permanece FALSE. Pare antes de tentar ler a posição 5, que está fora deste array.

Uma lista de oito números sendo escaneada da esquerda para a direita, buscando por 5; os primeiros quatro não correspondem e o quinto é encontrado
Outro exemplo: busca linear verifica cada item sequencialmente do início até encontrar o valor

Bubble sort (Ordenação por bolha)

Uma ordenação de bolha coloca uma lista em ordem. Compare valores vizinhos e troque-os se o valor da esquerda for maior. Uma única passagem geralmente não é suficiente. Esta versão completa repete passagens até que uma inteira não realize nenhuma troca.

DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, Temp : INTEGER
DECLARE Swapped : BOOLEAN
List[1] ← 8
List[2] ← 3
List[3] ← 5
List[4] ← 1
REPEAT
    Swapped ← FALSE
    FOR I ← 1 TO 3
        IF List[I] > List[I + 1]
          THEN
            Temp ← List[I]
            List[I] ← List[I + 1]
            List[I + 1] ← Temp
            Swapped ← TRUE
        ENDIF
    NEXT I
UNTIL NOT Swapped
OUTPUT List[1], ", ", List[2], ", ", List[3], ", ", List[4]

Passagens exemplificadas. Comece com 8, 3, 5, 1. Na primeira passagem, a lista torna-se 3, 8, 5, 1, depois 3, 5, 8, 1, então 3, 5, 1, 8. Isso posiciona o maior valor no final, mas deixa o restante desordenado. A segunda passagem termina em 3, 1, 5, 8; a terceira em 1, 3, 5, 8. A quarta não realiza trocas e confirma que esta versão pode parar. Reinitialize Swapped para FALSE no início de cada passagem; defina-o como TRUE em qualquer troca.

Uma lista onde o primeiro par 5 e 2 está desordenado, mostrado sendo trocado para 2 e 5, com anotação para repetir para cada par
Uma comparação em outro exemplo: ordenação de bolha troca vizinhos desordenados, depois continua pela passagem

Totalling and counting

Somatório adiciona cada valor necessário a um total acumulado: Total ← Total + Value. Contagem adiciona 1 para cada item necessário: Count ← Count + 1. Inicialize ambos como zero antes de processar os valores.

Exemplo resolvido. Quatro tentativas de entrada são −20, 4, 50 e 6. Aceite um valor apenas se for maior que −20 e menor que 50. Este exemplo processa quatro tentativas, não quatro valores aceitos.

DECLARE I, Count : INTEGER
DECLARE Value, Total : REAL
Total ← 0
Count ← 0
FOR I ← 1 TO 4
    INPUT Value
    IF Value > -20 AND Value < 50
      THEN
        Total ← Total + Value
        Count ← Count + 1
    ENDIF
NEXT I
IF Count > 0
  THEN
    OUTPUT Total, ", ", Count, ", ", Total / Count
  ELSE
    OUTPUT "No accepted values"
ENDIF
Valor tentado Total após tentativa Contador após tentativa
−20 0 0
4 4 1
50 4 1
6 10 2

Os limites estritos rejeitam −20 e 50. Ambas as atualizações pertencem ao teste de aceitação, portanto tentativas rejeitadas não alteram nem o total nem o contador. A média dos valores aceitos é:

$$\text{Average}=\frac{\text{Total}}{\text{Count}}=\frac{10}{2}=5$$

Não divida por quatro: apenas dois valores foram adicionados. Se nenhum valor for aceito, o contador será zero e uma média não pode ser calculada; exiba uma mensagem em vez de dividir por zero.

Transferir para um número fixo de valores aceitos. Se a tarefa solicitar 50 valores aceitos, em vez de quatro tentativas, substitua o loop fixo FOR por WHILE Count < 50 e feche-o com ENDWHILE. Mantenha a mesma entrada e teste de aceitação dentro dele. Entradas rejeitadas mantêm Count inalterado, solicitando outra entrada. Ao completar, Count será 50, embora o número de tentativas possa ser maior. Exiba o total e calcule a média como Total / Count.

Maximum, minimum and average

O máximo é o maior valor e o mínimo é o menor. A média é o total dividido pelo número de valores. Para uma lista não vazia, inicialize ambos a partir do primeiro item. Para cada item restante, substitua o máximo se o novo valor for maior, e substitua o mínimo se for menor.

Exemplo resolvido. A lista é −8, −3, −12, −5. Iniciar o máximo em zero falharia: nenhum item da lista é maior que zero, então o algoritmo exibiria um número que não está na lista. Iniciar de −8 funciona sem assumir que os dados são positivos.

Valor considerado agora Máximo até agora Mínimo até agora
−8 (inicialização) −8 −8
−3 −3 −8
−12 −3 −12
−5 −3 −12
DECLARE List : ARRAY[1:4] OF INTEGER
DECLARE I, Maximum, Minimum, Total : INTEGER
List[1] ← -8
List[2] ← -3
List[3] ← -12
List[4] ← -5
Maximum ← List[1]
Minimum ← List[1]
Total ← List[1]
FOR I ← 2 TO 4
    IF List[I] > Maximum
      THEN
        Maximum ← List[I]
    ENDIF
    IF List[I] < Minimum
      THEN
        Minimum ← List[I]
    ENDIF
    Total ← Total + List[I]
NEXT I
OUTPUT Maximum, ", ", Minimum, ", ", Total / 4

O máximo é −3 e o mínimo é −12. A média usa todos os quatro valores:

$$\text{Total}=\sum \text{Value}=(-8)+(-3)+(-12)+(-5)=-28$$
$$\text{Average}=\frac{\text{Total}}{\text{Count}}=\frac{-28}{4}=-7$$

A média fica entre o mínimo e o máximo; esta é uma verificação útil, não prova de que o cálculo está correto. Inicializar a partir do primeiro item exige uma lista não vazia. Trate uma lista vazia separadamente antes de tentar ler esse item.

Vocabulário Treinar
English Português
linear search/ˈlɪnɪə sɜːtʃ/ busca linear
totalling/ˈtəʊtəlɪŋ/ soma acumulada
counting/ˈkaʊntɪŋ/ contagem
maximum/ˈmæksɪməm/ valor máximo
minimum/ˈmɪnɪməm/ valor mínimo
average/ˈævrɪdʒ/ média
7.8

Dicas de prova

  • As quatro etapas do ciclo de vida: análise → projeto → codificação → teste. Abstração mantém apenas o essencial; decomposição divide um problema em partes.
  • Validation verifica se os dados são sensatos (verificações de faixa, comprimento, tipo, presença, formato); verification verifica se foram copiados corretamente (uma verificação visual ou entrada dupla).
  • Aprenda os quatro tipos de dados de teste: normal (aceito), anormal (rejeitado), extremo (o maior/menor ainda permitido), limite (ambos os lados de um limite).
  • Uma tabela de traçagem (valor de cada variável em cada etapa) mostra o que um algoritmo faz.
  • Para escrever uma rotina de validação, coloque a entrada em um laço REPEAT … UNTIL cuja condição UNTIL corresponda aos dados válidos.
  • Ao corrigir um erro, cite a linha e escreva toda a linha corrigida.
  • Conheça os algoritmos padrão: linear search (verifique cada item em sequência) e bubble sort (troque pares adjacentes até que nenhuma troca seja necessária).
Vocabulário Treinar
English Português
validation/ˌvælɪˈdeɪʃn/ validação
range check/reɪndʒ tʃek/ verificação de intervalo
length check/leŋθ tʃek/ verificação de comprimento
type check/taɪp tʃek/ verificação de tipo
presence check/ˈprezəns tʃek/ verificação de existência
format check/ˈfɔːmæt tʃek/ verificação de formato
check digit/tʃek ˈdɪdʒɪt/ dígito verificador
verification/ˌverɪfɪˈkeɪʃn/ verificação
visual check/ˈvɪʒuːəl tʃek/ verificação visual
double entry/ˈdʌbl ˈentri/ entrada dupla

Aulas interativas sobre este tópico

Passe por ele passo a passo, com exercícios de verificação instantânea.

Provas Anteriores

Mais tópicos em Ciência da Computação IGCSE

Entrar ou criar conta

IGCSE, A-Level & AP