Pular para o conteúdo
Matérias

Ciência da Computação do A-Level

Dicas

A-Level Computer Science (9618) é duas metades que parecem matérias diferentes. A metade de teoria vai desde representação de informação e comunicação através de hardware, processadores, software de sistema, segurança, bancos de dados e ética. A metade prática é algoritmos, estruturas de dados, programação e desenvolvimento de software, e o A2 adiciona recursão e programação orientada a objetos.

Os papers de teoria são marcados muito mais literalmente do que os estudantes esperam. Há um vocabulário correto — nomes de registradores, modos de endereçamento, formas normais, a diferença exata entre validação e verificação — e uma paráfrase geralmente pontua nada. Aprenda as definições na redação do syllabus.

Os papers de programação recompensam escrever código à mão até que compile na sua cabeça.

  • 1

    Representação de informações

    Assistir aula
    1.1

    Sistemas numéricos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão das magnitudes binárias e da diferença entre prefixos binários e prefixos decimais Compreender a diferença entre e usar: • kibi e kilo • mebi e mega • gibi e giga • tebi e tera
    Demonstrar compreensão de diferentes sistemas numéricos Usar as bases numéricas binário, decimal e hexadecimal e a representação Decimal Codificado por BCD (BCD), complemento de um e complemento de dois para números binários
    Converter um valor inteiro de uma base numérica/representação para outra
    Realizar adição e subtração binária Usando inteiros binários positivos e negativos
    Demonstrar compreensão de como pode ocorrer o transbordamento
    Descrever aplicações práticas onde são usados Decimal Codificado por BCD (BCD) e Hexadecimal
    Demonstrar compreensão e ser capaz de representar dados de caracteres na sua forma binária interna, dependendo do conjunto de caracteres usado Os alunos devem estar familiarizados com ASCII (American Standard Code for Information Interchange), ASCII estendido e Unicode. Não se espera que memorizem códigos de caracteres específicos

    Fonte: Programa Cambridge International

    Contagem em binário: 0 a 15

    Os três sistemas numéricos 数制 que deve dominar:

    • decimal 十进制 (base 10) — usa dígitos 0–9. Os lugares valoriais são potências de dez.
    • binário 二进制 (base 2) — usa 0 e 1. Os lugares valoriais são potências de dois. Cada byte 字节 tem 8 bits 位.
    • hexadecimal 十六进制 (base 16) — usa 0–9 seguidos de A–F para 10–15. Cada dígito hexadecimal representa exatamente 4 bits.
    Contas num abaco tradicional
    Um abaco representa números por lugar valorial — a mesma ideia subjacente ao decimal, binário e hexadecimal

    Conversões

    Decimal → binário: continue a dividir por 2 e registe os restos, lendo de baixo para cima. Ou subtraia o maior lugar valorial 位值 (potência de 2) que couber.

    Exemplo: $558_{10}$: $558 = 512 + 32 + 8 + 4 + 2 = 2^{9} + 2^{5} + 2^{3} + 2^{2} + 2^{1}$. Em 12 bits: 0010 0010 1110.

    Binário → hexadecimal: agrupe os bits em nibbles 半字节 (4 bits) da direita para a esquerda e converta cada um. 0010 0010 1110 → 2 2 E → 22E.

    Hexadecimal → binário: substitua cada dígito hexadecimal por seu padrão de 4 bits. Hexadecimal → decimal: multiplique cada dígito por seu valor posicional. 22E $= 2 \times 256 + 2 \times 16 + 14 = 558$.

    Exemplo resolvido. Converta o decimal 200 para binário de 8 bits, depois para hexadecimal.

    $200 = 128 + 64 + 8$, então o binário é 11001000. Em nibbles, 1100 1000 $= 12$ e $8$, ou seja, $\text{C}$ e $8$, então o hexadecimal é C8.

    Um gráfico de lugares valoriais binários para 200: as colunas 128, 64, 32, 16, 8, 4, 2, 1 contêm os bits 1,1,0,0,1,0,0,0; os dois meios bytes de 4 bits 1100 e 1000 tornam-se os dígitos hex C e 8, logo 200 = 11001000 = C8
    Ler 200 pelos seus lugares valoriais, depois agrupar os bits em meios bytes para obter hex C8

    Quantos bits?

    As questões de exame fixam a largura do registrador 寄存器宽度 (8, 12 ou 16 bits). Preencha com zeros à esquerda até essa largura: $558$ em 12 bits é 0010 0010 1110, nunca 10 0010 1110.

    Para encontrar o número mínimo de bits necessários para armazenar um valor, pergunte quais lugares valoriais precisa:

    • um inteiro sem sinal de $0$ a $2^{n} - 1$ precisa de $n$ bits: $200$ precisa de 8 bits (o topo é $255$), $1000$ precisa de 10 bits (o topo é $1023$), $16$ precisa de 5 bits (4 bits param em $15$).
    • um inteiro com sinal em complemento para dois de $-2^{n-1}$ a $2^{n-1} - 1$ precisa de $n$ bits: $-200$ precisa de 9 bits, pois 8 bits param em $-128$.
    • um dígito hexadecimal precisa de 4 bits, um dígito BCD precisa de 4 bits, e um carácter ASCII precisa de 7 bits (8 para ASCII expandido).

    Prefijos binários vs decimais

    Dois famílias de prefijos parecem semelhantes mas diferem — decimal (potências de 10) e binário (potências de 2):

    Decimal (SI) Binário (memória)
    quilo $= 10^{3}$ kibi (Ki) $= 2^{10} = 1024$
    mega $= 10^{6}$ mebi (Mi) $= 2^{20}$
    giga $= 10^{9}$ gibi (Gi) $= 2^{30}$
    tera $= 10^{12}$ tebi (Ti) $= 2^{40}$

    Assim, um tebibyte (TiB) é ligeiramente maior que um terabyte (TB). Um disco "1 TB" armazena $10^{12}$ bytes, mas um sistema operacional que relata em TiB mostra um número menor.

    Explorar

    Binário, decimal e hexadecimal

    Digite um número e veja-o em binário, decimal e hexadecimal ao mesmo tempo — e como os valores posicionais se somam.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    number system/ˈnʌmbə ˈsɪstəm/ 数制 shù zhì
    binary/ˈbaɪnəri/ 二进制 èr jìn zhì
    denary/ˈdiːnəri/ 十进制 shí jìn zhì
    place value/pleɪs ˈvæljuː/ 位值 wèi zhí
    byte/baɪt/ 字节 zì jié
    bit/bɪt/ 位 wèi
    hexadecimal/ˌheksəˈdesɪml/ 十六进制 shí liù jìn zhì
    nibble/ˈnɪbl/ 半字节 bàn zì jié
    register width/ˈredʒɪstə wɪtθ/ 寄存器宽度 jì cún qì kuān dù
    1.1

    Aritmética binária

    Adição binária

    Adicione coluna por coluna da direita, carregando como na decimal:

    Bit A Bit B Carry in Sum bit Carry out
    0 0 0 0 0
    0 0 1 1 0
    0 1 0 1 0
    0 1 1 0 1
    1 1 0 0 1
    1 1 1 1 1

    Overflow 溢出 ocorre quando o resultado precisa de mais bits do que o register 寄存器 pode armazenar — o carry-out da coluna mais à esquerda é o bit de overflow.

    Exemplo resolvido. Some os inteiros sem sinal de 8 bits $10110101$ e $01101100$, e comente sobre o resultado.

    $10110101 + 01101100 = 1\,00100001$. A resposta precisa de 9 bits, então não cabe em um registro de 8 bits: ocorreu overflow. Uma resposta completa nomeia o erro e diz por quê, usando a largura de palavra dada pela questão: "Overflow: o resultado verdadeiro ($289$) é maior que o maior valor que um registro de 8 bits pode armazenar ($255$), então o carry out do bit mais significativo é perdido e o resultado armazenado ($00100001 = 33$) está errado."

    Subtração binária

    O método usual é a adição de two's complement 补码: para fazer $A - B$, forme o two's complement de $B$ (inverte todos os bits e soma 1), depois some, e descarte qualquer carry-out final.

    Para subtrair $00011110$ de $01100100$ (sem sinal 8 bits):

    • two's complement de $00011110$: inverta → $11100001$, some 1 → $11100010$.
    • some com $01100100$: resultado $1\,01000110$ (9 bits) — descarte o 1 inicial → $01000110 = 70_{10}$. Verifique: $100 - 30 = 70$. ✓

    Inteiros sinalizados em two's complement

    Em um número two's complement de $n$ bits:

    • o most significant bit 最高有效位 (MSB) é o sign bit 符号位: 0 = positivo, 1 = negativo.
    • para ler um número negativo: inverta todos os bits, some 1, depois negue.

    Então $11100010$ é negativo; inverta → $00011101$, some 1 → $00011110 = 30$, logo é $-30$. Este é um signed integer 有符号整数 (ao contrário de um sem sinal 无 signed one). O intervalo para $n$ bits é $-2^{n-1}$ a $+2^{n-1} - 1$; para 8 bits, $-128$ ($10000000$) a $+127$ ($01111111$).

    Os mesmos bits significam números diferentes dependendo da leitura acordada. Como inteiro sem sinal, cada bit é um valor posicional, então 8 bits variam de $0$ a $255$; como inteiro sinalizado two's complement, o bit superior é o sinal, então os mesmos 8 bits variam de $-128$ a $+127$. O padrão $11111111$ é $255$ lido de uma forma e $-1$ lido da outra — nada nos próprios bits diz qual é.

    Uma tabela de quatro padrões de 8 bits lidos duas vezes: 00000000 é 0 de ambos os modos, 01111111 é 127 unsigned e +127 signed, 10000000 é 128 unsigned mas -128 signed, e 11111111 é 255 unsigned mas -1 signed O mesmo byte lido como unsigned e signed: apenas a interpretação acordada os distingue Uma linha numérica two's complement de 8 bits de -128 (10000000) a +127 (01111111); números com sign bit 1 são negativos e aqueles com sign bit 0 são positivos, com -1 = 11111111 logo abaixo de 0 = 00000000 Two's complement de 8 bits: o sign bit divide o intervalo em negativo ($-128$ a $-1$) e positivo ($0$ a $127$)

    Exemplo resolvido. Qual o valor decimal representado pelo número two's complement de 8 bits $10110100$?

    O MSB é 1, então é negativo. Inverta → $01001011$, adicione 1 → $01001100 = 76$, então o valor é $-76$. Verifique com valores posicionais: $-128 + 32 + 16 + 4 = -76$.

    Exemplo resolvido. Escreva $-108$ como um inteiro two's complement de 12 bits.

    Comece com $+108$ em 12 bits: $108 = 64 + 32 + 8 + 4$, então 0000 0110 1100. Inverta todos os bits: 1111 1001 0011. Some 1: 1111 1001 0100. Verifique com valores posicionais, onde o bit superior vale $-2^{11} = -2048$: $-2048 + 1024 + 512 + 256 + 128 + 16 + 4 = -108$. ✓

    Para 12 bits, o intervalo é $-2048$ (1000 0000 0000) a $+2047$ (0111 1111 1111). Questões que pedem os menores e maiores valores querem esses dois padrões, então aprenda a regra: o número mais negativo é um 1 seguido de zeros; o mais positivo é um 0 seguido de uns.

    Um arithmetic shift 算术移位 move todos os bits para a esquerda ou direita, mas mantém o sinal: um shift right em um lugar divide o valor ao meio e copia o sign bit no espaço vazio à esquerda, então um número negativo permanece negativo (1111 1001 0100 deslocado right três lugares é 1111 1111 0010, que é $-14$: $-108 / 8 = -13.5$, e um shift right arredonda para baixo). Um shift left dobra o valor. Shifts pertencem ao conjunto de instruções assembly no tópico 4, mas esta pergunta é feita com o trabalho numérico aqui.

    Overflow em aritmética sinalizada ocorre quando o resultado verdadeiro cai fora deste intervalo — identificado quando o sign bit inverte incorretamente (dois positivos dando negativo, ou dois negativos dando positivo).

    One's complement

    Antes do two's complement, um esquema antigo chamado one's complement 反码 representava um número negativo simplesmente invertendo todos os bits do positivo — não há etapa de "somar 1".

    • $+30 = 00011110$, então em one's complement $-30 = 11100001$ (apenas o inverso).
    • Desvantagem: possui dois zeros — $00000000$ ($+0$) e $11111111$ ($-0$) — o que desperdiça um padrão de bits e torna a aritmática complicada.

    Two's complement (inverta e some 1) elimina o zero negativo: ele tem um único zero e permite que adição e subtração usem o mesmo circuito. É por isso que computadores modernos armazenam inteiros sinalizados em two's complement, não em one's complement.

    Explorar

    Binário & inteiros sinalizados

    byte = Σ valores de posição

    Veja como um padrão de 8 bits mapeia para um número (e como transbordaria além de 255).

    Explorar

    Bits sinalizados em complemento de dois

    O bit mais à esquerda carrega um valor de posição negativo. Alterne qualquer bit — ou clique em Negate (inverta todos os bits, depois adicione 1) — e veja o valor sinalizado mudar.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    register/ˈredʒɪstə/ 寄存器 jì cún qì
    unsigned/ʌnˈsaɪnd/ 无符号 wú fú hào
    overflow/ˌəʊvəˈfləʊ/ 溢出 yì chū
    most significant bit/məʊst sɪɡˈnɪfɪkənt bɪt/ 最高有效位 zuì gāo yǒu xiào wèi
    two's complement/tuːz ˈkɒmplɪmənt/ 补码 bǔ mǎ
    signed integer/saɪnd ˈɪntɪdʒə/ 有符号整数 yǒu fú hào zhěng shù
    sign bit/saɪn bɪt/ 符号位 fú hào wèi
    arithmetic shift/ˌærɪθˈmetɪk ʃɪft/ 算术移位 suàn shù yí wèi
    one's complement/wʌnz ˈkɒmplɪmənt/ 反码 fǎn mǎ
    1.1

    Decimal Coded Binary (BCD)

    Em BCD 二进码十进数, cada dígito decimal é escrito como seu próprio padrão de 4 bits. O número $93$ é 1001 0011 em BCD — não binário 93 ($01011101$). Cada nibble usa apenas 0–9; padrões $1010$–$1111$ são inválidos.

    Leitura BCD: 0010 0111 0101 → 2, 7, 5 → 275.

    Uso: calculadoras, relógios digitais e dispositivos que exibem dígitos decimais — cada dígito aciona um 7-segment display 七段显示器. O código de moeda frequentemente usa BCD para evitar erros de arredondamento ao converter frações como 0.1 em binário.

    Uma resposta "justify" deve ligar o uso a uma propriedade do BCD: cada dígito decimal tem seus próprios 4 bits, então um dígito pode ser enviado diretamente para seu display, ou somado dígito por dígito, sem conversão do número todo; e uma fração decimal como $0.10$ é armazenada exatamente, algo que uma fração binária não consegue fazer.

    Componente de display LED de sete segmentos de um único dígito, mostrando suas sete barras separadas
    Um display de sete segmentos mostra um dígito decimal, frequentemente acionado por BCD
    Vocabulário Treinar
    Inglês Chinês Pinyin
    BCD/ˌbiː siː ˈdiː/ 二进码十进数 èr jìn mǎ shí jìn shù
    7-segment display/ˈsevən ˈseɡmənt dɪˈspleɪ/ 七段显示器 qī duàn xiǎn shì qì
    1.1

    Hexadecimal — usos práticos

    Hex é uma forma compacta de escrever binário (1 dígito hex = 4 bits):

    Um byte se divide em dois nibbles; cada nibble é um dígito hexadecimal
    Um byte são dois nibbles; cada nibble é um dígito hex
    • memory addresses 内存地址 em programação de baixo nível — 0x7FFE.
    • colour values em HTML/CSS — #FF8800.
    • MAC addresses — AC:DE:48:00:11:22.

    Hex não altera os dados armazenados — apenas facilita o binário para humanos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    memory address/ˈmeməri əˈdres/ 内存地址 nèi cún dì zhǐ
    1.1

    Códigos de caracteres

    Computadores armazenam texto como números; cada caractere tem um code point 码点 numérico definido por um character set 字符集.

    ASCII

    • ASCII usa 7 bits — 128 code points. Letras latinas básicas, dígitos, pontuação e códigos de controle.
    • Extended ASCII usa 8 bits — 256 code points; os primeiros 128 correspondem ao ASCII, os últimos 128 variam por região.
    Tabela pequena de ASCII: o caractere A é código 65 = 01000001, a é 97 = 01100001, o dígito 0 é 48 = 00110000, e espaço é 32 = 00100000
    Cada caractere é armazenado como um número — alguns code points ASCII em decimal e binário

    Unicode

    • Unicode é um conjunto universal de caracteres cobrindo quase todos os scripts, além de símbolos e emojis.
    • encodings 编码 comuns: UTF-8 (1–4 bytes, compatível com ASCII), UTF-16 (2 ou 4 bytes), UTF-32 (fixo 4 bytes).

    Por que Unicode supera ASCII

    • representa muitos mais caracteres (todos os scripts, emojis); ASCII cobre apenas inglês básico.
    • arquivos são portáteis sem confusão de páginas de código, e permitem texto multilíngue em um único documento.
    • trade-off: arquivos Unicode costumam ser maiores para texto apenas em inglês.

    Quando uma questão pede diferenças, dê-as em pares com números: ASCII usa 7 bits (ASCII estendido 8), logo 128 (256) caracteres; Unicode usa até 32 bits (UTF-8 usa 1 a 4 bytes), logo mais de um milhão de code points. ASCII cobre apenas inglês básico; Unicode cobre todos os scripts, e seus primeiros 128 code points são os do ASCII. Em UTF-8, uma letra inglesa ainda ocupa 1 byte, então um nome de arquivo de 40 letras em inglês tem 40 bytes tanto no ASCII quanto no UTF-8, enquanto um caractere chinês ocupa 3 bytes.

    Explorar

    Um caractere é armazenado como um número

    Cada caractere tem um código numérico — 'A' é 65. Inverta os bits para ver esse código em binário e hexadecimal, exatamente como o computador o armazena.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    code point/kəʊd pɔɪnt/ 码点 mǎ diǎn
    character set/ˈkærɪktə set/ 字符集 zì fú jí
    encoding/enˈkəʊdɪŋ/ 编码 biān mǎ
    1.2

    Imagens bitmap

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de como os dados de uma imagem bitmap são codificados Usar e compreender os termos: pixel, cabeçalho do arquivo, resolução da imagem, resolução da tela, profundidade de cor / profundidade de bits
    Realizar cálculos para estimar o tamanho do arquivo para uma imagem bitmap
    Demonstrar compreensão dos efeitos de alterar elementos de uma imagem bitmap na qualidade da imagem e no tamanho do arquivo Usar os termos: resolução da imagem, profundidade de cor / profundidade de bits
    Demonstrar compreensão de como os dados de um gráfico vetorial são codificados Usar os termos: objeto de desenho, propriedade, lista de desenho
    Justificar o uso de uma imagem bitmap ou um gráfico vetorial para uma tarefa dada
    Demonstrar compreensão de como o som é representado e codificado Usar os termos: amostragem, taxa de amostragem, resolução de amostragem, dados analógicos e dados digitais
    Demonstrar compreensão do impacto de alterar a taxa de amostragem e a resolução Incluindo o impacto no tamanho do arquivo e na precisão

    Fonte: Programa Cambridge International

    Uma imagem bitmap 位图 (também chamada de bitmapped image) armazena a cor de cada pixel 像素 em uma grade. No início do arquivo, um file header 文件头 registra os metadados da imagem — sua largura, altura e profundidade de cor — para que o software saiba como ler os dados de pixel que seguem.

    • image resolution 图像 resolução: o tamanho próprio do bitmap, largura × altura em pixels (ex. 1920 × 1080).
    • screen resolution 屏幕分辨率: a largura × altura que o display pode mostrar. Se a resolução de uma imagem for maior que a tela, ela é escalonada para caber; uma imagem de baixa resolução fica pixelizada quando esticada em uma tela de alta resolução.
    • profundidade de cor profundidade de cor (profundidade de bits profundidade de bits): bits por pixel. 1 bit → preto e branco; 8 bits → 256 cores; 24 bits → 16.7 milhão ("cor verdadeira").
    O mesmo disco armazenado em três grades de pixels, A a C, ficando mais pixelizado conforme os pixels crescem e diminuem
    A mesma imagem armazenada em três resoluções, de alta (A) a baixa (C): menos pixels maiores significam menos detalhes

    Tamanho do arquivo

    $$\text{size in bits} = \text{width} \times \text{height} \times \text{bit depth}.$$

    Divida por 8 para bytes, por 1024 para KiB, etc. Exemplo: uma imagem $3000 \times 2000$ a 24 bpp é $3000 \times 2000 \times 24 = 1.44 \times 10^{8}$ bits $\approx 17.2\ \text{MiB}$.

    Uma grade de pixels 6 por 4 com sua largura e altura rotuladas; pixels = 6 vezes 4 = 24, e a 8 bits por pixel o tamanho = 24 vezes 8 = 192 bits
    A mesma fórmula em números pequenos: conte os pixels, depois multiplique pela profundidade de cor

    Informe as unidades que usou. O gabarito aceita $1\ \text{MB} = 10^{6}$ bytes (prefixo SI) ou $1\ \text{MiB} = 1024 \times 1024$ bytes (prefixo binário), desde que seu cálculo mostre qual; a mesma imagem é $18.0\ \text{MB}$ ou $17.2\ \text{MiB}$. Adicione o tamanho do cabeçalho do arquivo se a questão o fornecer.

    Um vídeo é uma sequência de imagens bitmap, cada uma sendo um quadro 帧. Antes da compressão, seu tamanho é o tamanho de um quadro $\times$ a taxa de quadros 帧率 (quadros por segundo) $\times$ a duração em segundos: 30 quadros por segundo de $1920 \times 1080$ pixels a 24 bits são $30 \times 1920 \times 1080 \times 24 \approx 1.5 \times 10^{9}$ bits, aproximadamente $187\ \text{MB}$, para cada segundo. É por isso que vídeos sempre são comprimidos.

    Alterando configurações

    • resolução mais baixa → arquivo menor, menos detalhes (aparece pixelizado quando ampliado).
    • profundidade de cor mais baixa → arquivo menor, mas tons suaves mostram faixas.
    • maior de qualquer um → arquivo maior, melhor qualidade.
    Vocabulário Treinar
    Inglês Chinês Pinyin
    bitmap/ˈbɪtmæp/ 位图 wèi tú
    pixel/ˈpɪksl/ 像素 xiàng sù
    file header/faɪl ˈhedə/ 文件头 wén jiàn tóu
    colour depth/ˈkʌlə depθ/ 颜色深度 yán sè shēn dù
    image resolution/ˈɪmɪdʒ ˌrezəˈluːʃn/ 图像分辨率 tú xiàng fēn biàn lǜ
    screen resolution/skriːn ˌrezəˈluːʃn/ 屏幕分辨率 píng mù fēn biàn lǜ
    bit depth/bɪt depθ/ 位深度 wèi shēn dù
    frame/freɪm/ 帧 zhēn
    1.2

    Gráficos vetoriais

    Um gráfico vetorial 矢量图形 armazena as instruções para desenhar a imagem como uma lista de desenho 绘图列表 — uma lista ordenada de objetos de desenho 绘图对象 (primitivas geométricas 图元: linhas, curvas, polígonos, círculos). Cada objeto de desenho possui propriedades 属性 como cor, preenchimento, largura da linha e posição (coordenadas). Para exibi-lo, o programa renderiza 渲染 a lista de desenhos na resolução necessária.

    Um desenho simples de casa feito a partir de um corpo retangular, telhado triangular, janela circular, porta retangular e uma linha, cada um rotulado com seu tipo de forma e atributos
    Uma imagem vetorial é construída a partir de formas geométricas rotuladas, cada uma com atributos

    Bitmap vs Vetor

    Tarefa Melhor escolha Por quê
    Fotografia Bitmap Detalhes complexos ao nível do pixel não podem ser descritos como formas.
    Logotipo, ícone, sinal Vetor Bordas nítidas; escala para qualquer tamanho sem desfoque.
    Desenho técnico Vetor Geometria precisa e escalabilidade.
    Pintura, textura Bitmap Detalhe tonal suave por área.

    Vantagem vetorial: ele escala sem perder qualidade — um logotipo vetorial permanece nítido em qualquer tamanho, enquanto um bitmap fica desfocado quando ampliado. Desvantagem vetorial: não pode descrever detalhes arbitrários de pixels (fotografias).

    Uma resposta "justificativa" vincula a escolha à tarefa. "O logotipo deve aparecer num cartão de visita e num outdoor, então deve ser um gráfico vetorial: é armazenado como objetos de desenho e é renderizado nitidamente em qualquer tamanho, enquanto um bitmap mostraria seus pixels quando ampliado." Para uma fotografia, o argumento funciona ao contrário: não há formas para descrever, então a cor de cada pixel deve ser armazenada.

    Lado a lado, ambos ampliados: uma diagonal bitmap é uma escada irregular de pixels, enquanto uma diagonal vetorial permanece uma linha reta suave
    Ampliado, os pixels de um bitmap tornam-se irregulares; um vetorial permanece suave em qualquer tamanho
    Explorar

    Laboratório de conceitos de computação

    Classifique exemplos concretos pelo conceito de computação que eles demonstram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    vector graphic/ˈvektə ˈɡræfɪk/ 矢量图形 shǐ liàng tú xíng
    drawing list/ˈdrɔːɪŋ lɪst/ 绘图列表 huì tú liè biǎo
    drawing objects/ˈdrɔːɪŋ ˈɒbdʒekts/ 绘图对象 huì tú duì xiàng
    primitive/ˈprɪmɪtɪv/ 图元 tú yuán
    properties/ˈprɒpətiz/ 属性 shǔ xìng
    render/ˈrendə/ 渲染 xuàn rǎn
    analogue data/ˈænəlɒɡ ˈdeɪtə/ 模拟数据 mó nǐ shù jù
    digital data/ˈdɪdʒɪtl ˈdeɪtə/ 数字数据 shù zì shù jù
    1.2

    Som

    Uma onda contínua de dados analógicos 模拟数据 (o som) é convertida em dados digitais 数字数据 por amostragem 采样:

    • taxa de amostragem 采样率 — amostras por segundo (Hz). Qualidade CD é $44.1\ \text{kHz}$.
    • resolução de amostragem 采样分辨率 (profundidade de bits) — bits por amostra de amplitude 振幅. Qualidade CD é 16 bits.
    Uma onda sonora analógica suave com barras verticais de amostra em intervalos regulares de tempo, cada barra lendo a amplitude da onda
    Amostragem de uma onda sonora: sua amplitude é lida em cada intervalo de tempo

    Tamanho do arquivo

    $$\text{size in bits} = \text{sampling rate} \times \text{resolution} \times \text{duration} \times \text{channels}.$$

    Um clipe estéreo CD de 10 segundos: $44100 \times 16 \times 10 \times 2 = 14\,112\,000$ bits $\approx 1.68\ \text{MiB}$.

    Alterando configurações

    • taxa de amostragem mais alta → capta agudos mais altos, arquivo maior.
    • resolução de amostragem mais alta → passos de amplitude mais finos, menos ruído de quantização 量化, arquivo maior.
    • menor de qualquer um → arquivo menor, perda clara de qualidade.

    (A taxa de amostragem deve ser pelo menos duas vezes a frequência mais alta que você deseja manter.)

    Uma onda sonora cruzada por linhas de amostra espaçadas uniformemente, um ponto por amostra, anotado como taxa de amostragem = amostras por segundo e Nyquist pelo menos duas vezes a frequência mais alta
    Taxa de amostragem é amostras por segundo; a regra de Nyquist é por que deve ser pelo menos duas vezes a frequência mais alta mantida
    Explorar

    Amostragem de som

    y = a sin(bt + c)

    A amostragem mede uma onda sonora em intervalos regulares — quanto maior a taxa, mais fielmente ela é copiada.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    digit/ˈdɪdʒɪt/ 数位 shù wèi
    sampling/ˈsæmplɪŋ/ 采样 cǎi yàng
    sampling rate/ˈsæmplɪŋ reɪt/ 采样率 cǎi yàng lǜ
    sampling resolution/ˈsæmplɪŋ ˌrezəˈluːʃn/ 采样分辨率 cǎi yàng fēn biàn lǜ
    amplitude/ˈæmplɪtjuːd/ 振幅 zhèn fú
    sample resolution/ˈsæmpl ˌrezəˈluːʃn/ 采样分辨率 cǎi yàng fēn biàn lǜ
    quantisation/ˌkwɒntaɪˈzeɪʃn/ 量化 liàng huà
    bandwidth/ˈbændwɪdθ/ 带宽 dài kuān
    lossless/ˈlɒsləs/ 无损 wú sǔn
    lossy/ˈlɒsi/ 有损 yǒu sǔn
    run-length encoding/rʌn leŋθ enˈkəʊdɪŋ/ 行程编码 xíng chéng biān mǎ
    dictionary methods/ˈdɪkʃənəri ˈmeθədz/ 字典编码 zì diǎn biān mǎ
    1.3

    Compressão

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da necessidade e exemplos de uso de compactação
    Demonstrar compreensão de compactação com perda e sem perda e justificar o uso de um método numa situação dada
    Demonstrar compreensão de como um arquivo de texto, imagem bitmap, gráfico vetorial e arquivo de som podem ser compactados Incluindo o uso de codificação run-length (RLE)

    Fonte: Programa Cambridge International

    Compressão 压缩 reduz o tamanho do arquivo, economizando armazenamento e largura de banda 带宽 de transmissão. Dois tipos:

    • sem perdas 无损 — os dados originais são recuperados exatamente (texto, programas, ZIP/PNG).
    • com perdas 有损 — alguns detalhes são descartados para arquivos muito menores (JPEG, MP3, vídeo).

    Quando usar qual

    • sem perdas para documentos, código-fonte, imagens médicas — qualquer coisa que precise de dados exatos.
    • com perdas para streaming de mídia. Streaming de vídeo em tempo real usa compressão com perdas porque deve enviar grandes quantidades de dados em tempo real sobre largura de banda limitada; sem perdas não reduziria o suficiente. Vídeo HD bruto é gigabytes por minuto, então sem compressão a imagem ficaria travando constantemente.

    Uma resposta "justificativa" nomeia o método, depois a razão baseada na situação: "Sem perdas, porque a planilha deve ser restaurada exatamente; um único valor alterado tornaria as contas erradas." Ou: "Com perdas, porque as fotografias são visualizadas numa tela de celular onde os detalhes perdidos não são visíveis, e os arquivos menores sobem mais rápido e usam menos armazenamento."

    Métodos sem perdas

    • codificação por comprimento de corrida 行程编码 (RLE): armazene "os próximos $n$ valores são $x$" em vez de repetir $x$. Ótimo para áreas planas; inútil para dados ruidosos.
    • métodos de dicionário 字典编码 (ZIP, PNG): substitui sequências de bytes repetidas por uma referência curta. Bom para texto e código.
    • codificação Huffman 霍夫曼编码: dá códigos curtos para símbolos comuns e longos para raros, aproximando o comprimento médio do código da entropia 熵 dos dados.

    Como cada tipo de arquivo é comprimido:

    • arquivo de texto: métodos de dicionário e codificação Huffman transformam palavras repetidas e caracteres comuns em códigos curtos. Texto deve permanecer sem perdas, pois um caractere alterado muda o significado.
    • imagem bitmap: RLE para corridas de pixels idênticos (ícones, diagramas, digitalizações preto-e-branco); JPEG com perdas para fotografias, ou profundidade/resolução de cor mais baixa.
    • gráfico vetorial: a lista de desenho já é pequena; remova objetos de desenho desnecessários, armazene coordenadas com menos casas decimais, ou aplique um método sem perdas como ZIP ao arquivo.
    • arquivo de som: MP3 ou AAC com perdas remove o que o ouvido não consegue ouvir; taxa ou resolução de amostragem mais baixa também é com perdas; formatos sem perdas mantêm cada amostra e reduzem o arquivo muito menos.
    Uma fileira de 16 pixels com 6 células brancas, 4 pretas e 6 brancas; as três corridas são delimitadas e rotuladas 6W, 4B, 6W, assim 16 pixels são armazenados como as 3 corridas 6W 4B 6W
    Codificação por comprimento de corrida em uma única fileira: 16 pixels tornam-se 3 corridas
    Uma grade preto-e-branco 8 por 8 mostrando a letra F, com o padrão binário de cada fileira e seu código de comprimento de corrida mais curto listados ao lado
    Codificação por comprimento de corrida da letra F em uma grade preto-e-branco $8\times8$
    Codificação de dicionário demonstrada: a fonte ABC ABC ABC XYZ, um dicionário no qual 1 representa ABC e 2 representa XYZ, e o stream codificado 1 1 1 2
    Codificação de dicionário: cada sequência repetida é armazenada uma vez, e cada ocorrência torna-se um índice curto
    Codificação Huffman demonstrada na palavra BANANA: contagens das letras A 3, N 2 e B 1, a árvore de códigos construída a partir delas, e os códigos resultantes A = 0, B = 10, N = 11
    Codificação Huffman: o símbolo mais comum recebe o código mais curto, então BANANA precisa de 10 bits em vez de 12

    Métodos com perdas

    • imagens (JPEG): descarta detalhes finos e diferenças de cor que o olho mal percebe.
    • som (MP3, AAC): descarta agudos que ouvimos menos bem, e sons quietos escondidos por sons mais altos.
    • vídeo combina compressão espacial 空间 (dentro de cada quadro, como JPEG) com compressão temporal 时间 (a maioria dos quadros armazena apenas as diferenças em relação ao quadro anterior).
    Uma árvore classificando compressão em sem perdas (RLE, dicionário/ZIP/PNG, Huffman) e com perdas (imagens JPEG, som MP3/AAC, vídeo) com exemplos sob cada ramo
    Métodos de compressão: sem perdas versus com perdas, com exemplos comuns
    Explorar

    Codificação por comprimento de corrida

    Veja uma sequência de símbolos repetidos sendo comprimida em uma contagem — compressão sem perda simples.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    compression/kəmˈpreʃn/ 压缩 yā suō
    frame rate/freɪm reɪt/ 帧率 zhēn lǜ
    Huffman coding/ˈhʌfmən ˈkəʊdɪŋ/ 霍夫曼编码 huò fū màn biān mǎ
    entropy/ˈentrəpi/ 熵 shāng
    spatial/ˈspeɪʃl/ 空间 kōng jiān
    temporal/ˈtempərəl/ 时间 shí jiān
    Assistir aula
    1.3

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    bit um único dígito binário, 0 ou 1
    byte um grupo de 8 bits
    prefixo binário um multiplicador que é uma potência de 2 (kibi = 1024) em vez de uma potência de 10 (kilo = 1000)
    complemento de dois uma maneira de representar inteiros sinalizados em que o bit mais significativo tem valor posicional negativo
    estouro o resultado de um cálculo é grande demais para ser representado no número de bits disponíveis
    Decimal Codificado Binariamente cada dígito decimal é armazenado como seu próprio padrão binário de 4 bits
    conjunto de caracteres o conjunto de caracteres que um computador pode representar, cada um com seu próprio código binário
    pixel o menor elemento de uma imagem bitmap, armazenando um valor de cor
    resolução de imagem o número de pixels em uma imagem, dado como largura por altura
    resolução de tela o número de pixels que um display pode mostrar, dado como largura por altura
    profundidade de cor o número de bits usados para armazenar a cor de um pixel
    taxa de amostragem o número de amostras do som tiradas por segundo
    resolução de amostragem o número de bits usados para armazenar a amplitude de uma amostra
    compressão sem perdas compressão da qual os dados originais podem ser recuperados exatamente
    compressão com perdas compressão que remove permanentemente alguns dados, de modo que os originais não podem ser recuperados
    codificação por comprimento de corrida substituir uma corrida de valores repetidos por um valor e uma contagem
    1.3

    Dicas de prova

    • Mostre cálculos para conversões de base: decimal → binário por posições, binário → hexadecimal em nibbles (grupos de 4 bits).
    • Para complemento de dois o MSB é negativo; para inverter, inverte e soma 1; atenção para transbordamento quando o bit de sinal muda incorretamente.
    • Distinga bitmap (pixels; tamanho do arquivo $=$ largura $\times$ altura $\times$ profundidade de cor) de vetor (comandos de desenho; escala sem perdas).
    • O tamanho do arquivo de som depende de taxa de amostragem $\times$ profundidade de bits $\times$ tempo — mais de cada um significa melhor qualidade, mas um arquivo maior.
    • Compare compressão sem perdas vs. com perdas e dê um uso para cada uma.

    Erros comuns

    • Explicar um overflow com "a resposta foi maior que 255" ou "ele tem 9 bits". Indique o tamanho de palavra dado na questão, depois diga que o resultado não pode ser representado nele.
    • Criar um número negativo definindo o bit superior como 1 e deixando o resto (sinal e magnitude). Complemento a dois significa inverter todos os bits do valor positivo, depois adicionar 1.
    • Esquecer de preencher com zeros à esquerda um número convertido para a largura do registro solicitada pela questão.
    • Misturar bits e bytes em um cálculo de tamanho de arquivo. Trabalhe em bits, divida por 8 apenas uma vez, e especifique se usou 1000 ou 1024.
    • Responder "descreva" em linguagem cotidiana ("a imagem fica pior"). Use os termos da ementa: menos cores, banding, menor resolução de imagem, pixels maiores.
  • 2

    Comunicação

    Assistir aula
    2.1

    Redes: propósito e benefícios

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da finalidade e benefícios dos dispositivos de rede
    Demonstrar compreensão das características de uma LAN (rede local) e uma WAN (rede de longa distância)
    Explicar os modelos client-server e peer-to-peer de computadores em rede Papéis dos diferentes computadores dentro dos modelos de rede e sub-rede. Benefícios e desvantagens de cada modelo. Justificar o uso de um modelo para uma situação dada
    Demonstrar compreensão de thin-client e thick-client e as diferenças entre eles
    Demonstrar compreensão das topologias bus, estrela, mesh e híbridas Compreender como os pacotes são transmitidos entre dois hosts para uma topologia dada. Justificar o uso de uma topologia para uma situação dada
    Demonstrar compreensão de computação em nuvem Incluindo o uso de nuvens públicas e privadas. Benefícios e desvantagens da computação em nuvem
    Demonstrar compreensão das diferenças e implicações do uso de redes sem fio e com fios Descrever as características de cabos de cobre, cabos de fibra óptica, ondas de rádio (incluindo WiFi), micro-ondas, satélites
    Descrever o hardware utilizado para suportar uma LAN Incluindo switch, servidor, Placa de Interface de Rede (NIC), Placa de Interface de Rede Sem Fio (WNIC), Pontos de Acesso Sem Fio (WAP), cabos, bridge, repetidor
    Descrever o papel e a função de um router em uma rede
    Demonstrar compreensão de Ethernet e como colisões são detectadas e evitadas Incluindo Carrier Sense Multiple Access/Collision Detection (CSMA/CD)
    Demonstrar compreensão de bit streaming Métodos de bit streaming, ou seja, tempo real e sob demanda. Importância das taxas de bits na velocidade da banda larga no bit streaming
    Demonstrar compreensão das diferenças entre a World Wide Web (WWW) e a internet
    Descrever o hardware utilizado para suportar a internet Incluindo modems, PSTN (Rede Telefônica Comutada Pública), linhas dedicadas, rede de telefonia celular
    Explicar o uso de endereços IP na transmissão de dados pela internet Incluindo: • formato de um endereço IP incluindo IPv4 e IPv6 • uso de subnetting em uma rede • como um endereço IP é associado a um dispositivo em uma rede • diferença entre um endereço IP público e um endereço IP privado e as implicações para a segurança • diferença entre um endereço IP estático e um endereço IP dinâmico
    Explicar como um Uniform Resource Locator (URL) é usado para localizar um recurso na World Wide Web (WWW) e o papel do Domain Name Service (DNS)

    Fonte: Programa Cambridge International

    Uma rede 网络 é um conjunto de dispositivos computacionais conectados para que possam se comunicar e compartilhar recursos. Benefícios:

    • compartilhamento de recursos (impressoras, servidores de arquivos, internet) — mais barato do que equipar cada computador.
    • compartilhamento de dados — muitos usuários acessam os mesmos arquivos.
    • gerenciamento centralizado — instalar software, gerenciar usuários e fazer backup uma única vez no servidor.
    • comunicação — e-mail, chamadas de vídeo, mensagens.
    • acesso remoto — trabalhar de qualquer lugar.
    Explorar

    Laboratório de roteamento de rede

    Siga os dados de um dispositivo através do hardware de rede e protocolos.

    2.1

    LAN vs WAN

    Uma rede de área local 局域网 (LAN) cobre uma área pequena — uma casa, escritório ou escola, geralmente pertencente à organização, com altas taxas de transferência de dados e baixa latência 延迟.

    Uma rede de área ampla 广域网 (WAN) cobre uma grande área — uma cidade, país ou o mundo (a internet é a maior WAN). Usa infraestrutura de empresas de telecomunicações — frequentemente a Public Switched Telephone Network 公共交换电话网 (PSTN), linhas alugadas ou fibra óptica — com taxas de transferência de dados menores e latência mais alta. Uma WAN conecta várias LANs entre si.

    Para "dê duas características de uma LAN": ela cobre uma área geográfica pequena (um único local ou prédio); o hardware é propriedade da organização, não alugado de uma empresa de telecom; ela se conecta através de seus próprios switches, cabos e pontos de acesso. Para "duas maneiras pelas quais uma WAN é diferente": ela cobre uma grande área geográfica; usa infraestrutura de terceiros (alugada ou pública); as taxas de transferência de dados são menores e a latência maior; geralmente conecta várias LANs. Uma escola em um único local é uma LAN; uma empresa com escritórios em duas cidades precisa de uma WAN, com uma linha alugada ou a internet entre os locais. Justifique a escolha com base na área coberta e de quem são os enlaces.

    Vários sites de LAN espalhados por uma grande área, cada um conectado através de uma nuvem WAN de provedor central, com uma linha alugada direta entre dois sites distantes
    Uma rede de área ampla conecta muitos sistemas por uma grande área
    Vocabulário Treinar
    Inglês Chinês Pinyin
    network/ˈnetwɜːk/ 网络 wǎng luò
    Public Switched Telephone Network/ˈpʌblɪk swɪtʃt ˈtelɪfəʊn ˈnetwɜːk/ 公共交换电话网 gōng gòng jiāo huàn diàn huà wǎng
    2.1

    Cliente-servidor e par-a-par

    Cliente-servidor

    • máquinas poderosas atuam como servidores 服务器, fornecendo serviços (arquivos, páginas web, e-mail).
    • outras máquinas são clientes 客户端 que solicitam serviços.
    • Centralizado e fácil de gerenciar, mas o servidor é um ponto único de falha, a menos que haja backup.
    Um desktop, laptop e tablet cliente enviam solicitações através da internet para um servidor central, que envia respostas de volta
    Em uma rede cliente-servidor, clientes solicitam serviços de um servidor central

    Par-a-par (P2P)

    • todas as máquinas são pares iguais; cada uma pode ser tanto cliente quanto servidor (peer-to-peer 对等网络).
    • os recursos estão distribuídos entre os pares — sem servidor central. Robusta contra uma falha, mas mais difícil de manter segura e consistente.

    Escolhendo um modelo. Cliente-servidor adequa-se a uma escola ou empresa: os arquivos são armazenados e feitos backup centralmente, um usuário faz login com uma única conta de qualquer máquina, software e segurança são gerenciados uma única vez, e o servidor pode ser uma máquina poderosa. As desvantagens são o custo do servidor e de um técnico, e que o servidor é um ponto único de falha. Par-a-par adequa-se a poucos amigos compartilhando arquivos ou a um jogo: nenhum servidor para comprar, fácil de configurar, e cada usuário mantém controle de sua própria máquina. As desvantagens que o esquema lista: os arquivos estão espalhados por muitas máquinas, então são difíceis de fazer backup e um arquivo está indisponível quando a máquina do seu proprietário está desligada; cada máquina deve ser protegida separadamente; e um par que serve aos outros diminui a velocidade. Um jogo online jogado através de um navegador web com outros usuários é o modelo cliente-servidor: o navegador é o cliente, e o jogo e seu mundo virtual compartilhado rodam no servidor da empresa, que mantém a visão de cada jogador consistente.

    Seis computadores pares em um anel, cada um conectado diretamente a todos os outros pares, sem servidor central; todo par é tanto cliente quanto servidor
    Em uma rede par-a-par, cada nó é tanto cliente quanto servidor
    Vocabulário Treinar
    Inglês Chinês Pinyin
    server/ˈsɜːvə/ 服务器 fú wù qì
    client/ˈklaɪənt/ 客户端 kè hù duān
    peer-to-peer/pɪə tə pɪə/ 对等网络 duì děng wǎng luò
    bus/bʌs/ 总线 zǒng xiàn
    bandwidth/ˈbændwɪdθ/ 带宽 dài kuān
    2.1

    Clientes finos e pesados

    Um cliente fino 瘦 cliente faz pouco processamento local e depende de um servidor poderoso (terminais web, áreas de trabalho remotas). Um cliente pesado 胖 cliente possui forte processamento local e armazenamento e roda aplicativos completos sozinho (um PC desktop normal).

    Recurso Cliente fino Cliente pesado
    Processamento local mínimo substancial
    Armazenamento local mínimo substancial
    Dependência da rede alta menor
    Carga no servidor alta menor

    Os papéis: em um modelo de cliente fino, o servidor faz o processamento e armazena os dados, e o cliente apenas envia entrada e mostra a saída. Um terminal barato é suficiente, e tudo é feito backup e atualizado no servidor, mas nada funciona se a rede ou o servidor falhar. Em um modelo de cliente pesado, o cliente roda o software e armazena arquivos sozinho, então pode funcionar sem conexão de rede e sobrecarrega menos o servidor, às custas de clientes mais poderosos (e caros) que devem ser atualizados e protegidos individualmente. Uma sala de informática escolar pode usar clientes finos (baratos, gerenciados centralmente); um editor de vídeo precisa de um cliente pesado.

    2.1

    Topologias de rede

    A topologia 拓扑 é como os nós e enlaces estão organizados.

    • total 总线 — todos os dispositivos em um único cabo compartilhado. Barata; toda a LAN falha se a total falhar; o desempenho cai conforme mais dispositivos compartilham a largura de banda 带宽.
    • estrela 星形 — cada dispositivo se conecta a um switch central. A falha de um dispositivo não afeta os outros; a falha do switch derruba todos. Mais comum hoje.
    • malha 网状 — cada dispositivo se conecta diretamente aos outros, com vários caminhos. Muito tolerante a falhas 容错 (o tráfego é redirecionado), mas exige muito cabo.
    • híbrida — uma mistura (uma estrela em cada escritório, enlaces em malha entre escritórios).
    Seis computadores cada um conectado por um cabo de descida a um único cabo backbone compartilhado, com um bloco terminador em cada extremidade
    Topologia total: todos os dispositivos compartilham um cabo com um terminador em cada extremidade
    Cinco computadores cada um conectado por seu próprio cabo dedicado a um hub ou switch central
    Topologia estrela: cada dispositivo se conecta a um hub ou switch central
    Seis computadores em um anel com um cabo direto entre cada par de dispositivos
    Topologia malha: cada dispositivo se conecta diretamente aos outros
    Três clusters de estrelas, cada um uma chave com seus próprios computadores, todos conectados por um único backbone de barramento compartilhado com um terminador em cada extremidade
    Topologia híbrida: aglomerados de estrelas unidos por uma total central

    Como os pacotes viajam em cada topologia

    Total: o dispositivo remetente coloca o pacote no cabo compartilhado; todos os dispositivos o veem, e apenas aquele cujo endereço corresponde o aceita. Apenas um dispositivo pode transmitir por vez, então colisões ocorrem (CSMA/CD, abaixo). Estrela: o remetente passa o pacote para o switch central, que lê o endereço de destino e o encaminha apenas pelo cabo até esse dispositivo; dois outros dispositivos podem conversar ao mesmo tempo. Malha: o pacote é passado de nó a nó ao longo de um dos vários rotas possíveis até chegar ao destino; se um enlace falhar, outra rota é usada.

    Para justificar uma topologia: uma estrela para uma sala de aula ou escritório (um cabo falhado afeta apenas um dispositivo; um dispositivo é fácil de adicionar; com um switch não há colisões); uma malha onde a confiabilidade importa mais (um hospital, o backbone da internet); uma total apenas onde o custo importa e poucos dispositivos a compartilham. "Desenhe a topologia estrela" significa: o switch no meio, uma linha do switch para cada computador, e o servidor (e o roteador, se houver) em suas próprias linhas para o switch.

    Explorar

    Compare as topologias de rede

    Explore as quatro topologias. Cada uma troca custo, velocidade e resistência a falhas — observe o que interrompe toda a rede em cada uma.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    topology/təˈpɒlədʒi/ 拓扑 tuò pū
    star/stɑː/ 星形 xīng xíng
    mesh/meʃ/ 网状 wǎng zhuàng
    fault-tolerant/fɒlt ˈtɒlərənt/ 容错 róng cuò
    2.1

    Computação em nuvem

    Computação em nuvem 云计算 entrega serviços de computação (servidores, armazenamento, software) através da internet, hospedados por uma terceira parte. Benefícios: escalabilidade 可扩展性 (pague pelo que precisar), menor custo, acesso de qualquer lugar e data centers confiáveis e redundantes. Desvantagens: requer internet, seus dados são mantidos por uma terceira parte e possível bloqueio de fornecedor.

    Para a definição de uma marca: computação em nuvem é serviços de computação sob demanda (armazenamento, processamento, software) fornecidos através da internet por uma terceira parte. Uma nuvem pública 公有云 é propriedade de um provedor e compartilhada por muitos clientes pela internet; uma nuvem privada 私有云 é dedicada a uma única organização, em seu próprio hardware ou hospedada exclusivamente para ela. Benefícios que o esquema aceita: os arquivos são acessíveis de qualquer dispositivo com conexão à internet; o armazenamento escala para cima e para baixo conforme necessário; o provedor cuida do hardware, backups e atualizações de segurança; não há servidor local para comprar ou manter. Desvantagens: sem acesso sem conexão à internet; os dados estão no hardware de uma terceira parte, então segurança e privacidade dependem do provedor; custo de assinatura recorrente; o provedor pode falhar ou ser atacado; arquivos grandes podem demorar para transferir. Uma resposta "por que a empresa usa uma nuvem pública" diz que eles não precisam de seu próprio hardware, pagam apenas pelo que usam, e seus usuários podem acessá-lo de qualquer lugar.

    2.1

    Com fio vs sem fio

    • com fio (Ethernet 以太网 sobre par trançado 双绞线 ou fibra óptica 光纤): maior velocidade, menor latência, menos erros, mais seguro.
    • sem fio (Wi-Fi, Bluetooth, celular): sem cabos, dispositivos podem se mover, mas mais lento, propenso a interferência e escuta clandestina.

    Para a mesma geração, o com fio vence em velocidade e confiabilidade; o sem fio vence em conveniência.

    Meios de transmissão

    Meio Características
    cabo de cobre (par trançado, coaxial) barato e fácil de instalar; transmite um sinal elétrico; afetado por interferência eletromagnética; o sinal enfraquece com a distância, exigindo repetidores; largura de banda inferior à da fibra óptica
    cabo de fibra óptica pulsos de luz em núcleo de vidro; largura de banda muito alta; longas distâncias sem repetidores; imune a interferências; difícil de interceptar, sendo seguro; caro e requer instalação especializada
    ondas de rádio (incluindo WiFi) sem cabos, permitindo que dispositivos se movam; alcance de dezenas de metros, enfraquecido por paredes; frequência compartilhada, causando interferência e velocidade reduzida; pode ser interceptado, exigindo criptografia
    micro-ondas ondas de rádio de alta frequência para enlaces ponto a ponto; requer linha de visão; afetadas pela chuva e edifícios; alta largura de banda
    satélites alcançam áreas remotas e todo o globo; alto atraso (latência), pois o sinal viaja até a órbita e volta; afetados pelo tempo; caros

    O exame pede a comparação em ambas as direções. O cabeado supera o sem fio em velocidade, confiabilidade (sem interferência), segurança (um cabo precisa ser fisicamente acessado) e consistência; o sem fio supera o cabeado em mobilidade, custo de instalação e adição de dispositivos sem fiação. Permitir ambos permite que alunos se movam com laptops e telefones enquanto os desktops fixos mantêm a conexão mais rápida e segura, e um dispositivo sem porta de rede ainda pode se conectar. Satélite em vez de cobre alcança lugares onde nenhum cabo chega, mas com mais atraso, interferência climática e maior custo.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    ethernet/ˈiːθənet/ 以太网 yǐ tài wǎng
    twisted-pair/ˈtwɪstɪd peə/ 双绞线 shuāng jiǎo xiàn
    fibre-optic/ˈfaɪbə ˈɒptɪk/ 光纤 guāng xiān
    2.1

    Hardware LAN

    • placa de interface de rede 网络接口卡 (NIC) — permite que um dispositivo envie e receba dados na rede; possui um endereço MAC único MAC地址 (um endereço de hardware de 48 bits). Um dispositivo sem fio usa uma placa de interface de rede sem fio 无线网络接口卡 (WNIC).
    • interruptor 交换机 — encaminha apenas quadros Ethernet para a porta correspondente ao endereço MAC de destino.
    • hub 集线器 — dispositivo mais simples que copia o tráfego para todas as portas (hoje obsoleto).
    • ponto de acesso sem fio 无线接入点 (WAP) — permite que clientes sem fio se conectem a uma LAN cabeada.
    • fiação — par trançado para curtas distâncias; fibra óptica para distâncias maiores e velocidades mais altas.
    • servidor — computador que fornece um serviço aos outros dispositivos: arquivos, impressão, páginas web, armazenamento de e-mail.
    • bridge 网桥 — une dois segmentos LAN em uma única rede, passando o tráfego entre eles.
    • repeater 中继器 — recebe um sinal enfraquecido e o retransmite em força total, estendendo o alcance do cabo.

    As funções de uma WNIC, para uma questão de quatro marcas descreva: converte os dados em sinais de rádio e vice-versa; transporta o endereço MAC único do dispositivo; conecta o dispositivo a um ponto de acesso sem fio e segue o protocolo sem fio (qual canal e frequência usar); e decodifica os sinais entrantes para o dispositivo. Dois dispositivos que podem conectar fisicamente trinta computadores com NICs: um switch ou um hub.

    Um switch gigabit Ethernet de 5 portas sobre fundo branco, com cinco portas RJ-45 numeradas na frente e uma luz de alimentação
    Um switch de rede: o cabo de cada dispositivo é conectado a uma de suas portas
    Um cabo patch Ethernet preto sobre fundo branco, com plugue RJ-45 em cada extremidade mostrando contatos metálicos dourados e clipe de travamento
    Um plugue RJ-45 em um cabo Ethernet par trançado
    Um quadro endereçado ao computador C chega a um switch, que o encaminha apenas pela porta do C, deixando os cabos de A, B e D inativos
    Um switch envia cada quadro apenas para a porta de seu destino
    Vocabulário Treinar
    Inglês Chinês Pinyin
    switch/swɪtʃ/ 交换机 jiāo huàn jī
    hub/hʌb/ 集线器 jí xiàn qì
    packet/ˈpækɪt/ 数据包 shù jù bāo
    repeater/rɪˈpiːtə/ 中继器 zhōng jì qì
    network interface card/ˈnetwɜːk ˈɪntəfeɪs kɑːd/ 网络接口卡 wǎng luò jiē kǒu kǎ
    MAC address/mæk əˈdres/ MAC地址 MAC dì zhǐ
    wireless network interface card/ˈwaɪələs ˈnetwɜːk ˈɪntəfeɪs kɑːd/ 无线网络接口卡 wú xiàn wǎng luò jiē kǒu kǎ
    wireless access point/ˈwaɪələs ˈækses pɔɪnt/ 无线接入点 wú xiàn jiē rù diǎn
    bridge/brɪdʒ/ 网桥 wǎng qiáo
    2.1

    Routers

    Um router 路由器 conecta redes diferentes e encaminha dados entre elas — geralmente na fronteira de uma LAN e da internet. Ele faz:

    • encaminhamento — lê o endereço IP de destino IP地址 de cada pacote 数据包 e o envia pela porta correta, usando uma tabela de roteamento 路由表.
    • tradução de endereços de rede 网络地址转换 (NAT) — permite que muitos endereços privados de LAN compartilhem um único IP público.
    • DHCP 动态主机配置协议 — atribui endereços IP privados a dispositivos LAN.
    • firewall 防火墙 — bloqueia tráfego indesejado entrante.

    Na comutação de pacotes 分组交换, uma mensagem é dividida em pacotes enviados independentemente. Cada router lê o endereço IP de destino de um pacote, consulta o próximo salto em sua tabela de roteamento e o encaminha, então os pacotes de uma mesma mensagem podem tomar rotas diferentes e são reagrupados na ordem correta no destino. Um router recebe pacotes, os encaminha entre redes e distribui endereços IP; ele não descobre o IP associado a uma URL (isso é feito pelo DNS) e não armazena páginas web. Um router doméstico também contém o modem e o ponto de acesso sem fio, então um único aparelho conecta a LAN à internet.

    Uma LAN de três computadores e um servidor conectados a um switch, que se conecta através de um router tanto à internet quanto a outra LAN ou WAN
    Um router conecta uma LAN à internet ou a outra rede
    Vocabulário Treinar
    Inglês Chinês Pinyin
    router/ˈruːtə/ 路由器 lù yóu qì
    cloud computing/klaʊd kəmˈpjuːtɪŋ/ 云计算 yún jì suàn
    scalability/ˌskeɪləˈbɪlɪti/ 可扩展性 kě kuò zhǎn xìng
    public cloud/ˈpʌblɪk klaʊd/ 公有云 gōng yǒu yún
    private cloud/ˈpraɪvət klaʊd/ 私有云 sī yǒu yún
    DHCP/ˌdiː eɪtʃ siː ˈpiː/ 动态主机配置协议 dòng tài zhǔ jī pèi zhì xié yì
    firewall/ˈfaɪəwɔːl/ 防火墙 fáng huǒ qiáng
    packet switching/ˈpækɪt ˈswɪtʃɪŋ/ 分组交换 fēn zǔ jiāo huàn
    2.1

    Ethernet e CSMA/CD

    Ethernet é o padrão (protocolo) para LANs cabeadas: dispositivos são unidos por cabo par trançado ou fibra, os dados são enviados em quadros que contêm endereços MAC de origem e destino, e um meio compartilhado usa CSMA/CD para lidar com colisões. Em meios compartilhados, uma colisão 冲突 pode ocorrer quando dois dispositivos transmitem simultaneamente. O protocolo é CSMA/CD 载波侦听多路访问/冲突检测 (Carrier Sense Multiple Access with Collision Detection):

    1. detecção de portadora — escutar antes de enviar; esperar se o cabo estiver ocupado.
    2. acesso múltiplo — muitos dispositivos compartilham o meio.
    3. detecção de colisão — continuar escutando enquanto envia; um choque é uma colisão.
    4. em caso de colisão, ambos param, enviam um sinal de "jam" breve, depois esperam um tempo de backoff aleatório antes de tentar novamente.

    As três tarefas, nas palavras do esquema: o dispositivo escuta (detecta a portadora) antes de transmitir; verifica continuamente por colisões durante a transmissão; em caso de colisão, para, envia um sinal jam, espera um tempo aleatório e retransmite.

    A Ethernet comutada moderna usa enlaces ponto a ponto full-duplex 全双工, portanto colisões já não ocorrem.

    Um fluxograma do processo CSMA/CD: montar quadro, verificar se a linha está ociosa, enviar, detectar colisões, enviar sinal jam, fazer backoff e tentar novamente até um limite máximo
    O processo CSMA/CD para lidar com colisões em meios compartilhados
    Vocabulário Treinar
    Inglês Chinês Pinyin
    collision/kəˈlɪʒn/ 冲突 chōng tū
    CSMA/CD/ˌsiː es em ˈeɪ ˌsiː ˈdiː/ 载波侦听多路访问/冲突检测 zài bō zhēn tīng duō lù fǎng wèn / chōng tū jiǎn cè
    full-duplex/fʊl ˈdjuːpleks/ 全双工 quán shuāng gōng
    2.1

    Bit streaming

    Bit streaming 流式传输 envia multimídia como um fluxo contínuo que o receptor reproduz à medida que chega, em vez de baixar o arquivo inteiro primeiro.

    • em tempo real (ao vivo): capturado e transmitido conforme acontece (esporte ao vivo, videochamadas). Não é possível rebobinar; baixa latência é vital.
    • sob demanda: pré-gravado em um servidor (YouTube, Netflix). É possível pausar e rebobinar; o servidor pode bufferizar 缓冲 adiante.

    O streaming em tempo real funciona como um curto pipeline:

    1. capturar e amostrar a fonte (câmera ou microfone).
    2. codificar, usando compressão 压缩 para reduzir os dados.
    3. enviar pela rede em pacotes.
    4. o receptor bufferiza um pouco, depois reproduz ao vivo — descartando qualquer pacote que chegue atrasado, pois um stream ao vivo não pode esperar por ele.

    Compressão com perda 有损 compression é usada aqui: imagens em movimento ocultam pequenas perdas, e o stream deve ser pequeno o suficiente para caber na largura de banda.

    Por que um vídeo é comprimido antes do streaming em tempo real: o stream sem compressão precisaria de mais largura de banda do que a conexão oferece, fazendo com que os frames chegassem atrasados e a reprodução travasse. A compressão reduz o número de bits, mantendo a taxa de bits 比特率 abaixo da velocidade da banda larga, o atraso pequeno e menos armazenamento e custo em ambas as extremidades. A taxa de bits deve ser menor que a velocidade da conexão: uma taxa mais alta dá melhor qualidade, mas exige conexão mais rápida; se os dados chegarem mais devagar do que são reproduzidos, o buffer esvazia e o vídeo congela. O streaming sob demanda pode bufferizar mais do arquivo adiante, lidando bem com conexões lentas; o streaming em tempo real não consegue.

    Dados fluem do servidor de origem para um buffer que enche entre uma marca baixa e uma alta, e o player de mídia lê do buffer
    Dados fluem do servidor para um buffer antes do player de mídia ler
    Vocabulário Treinar
    Inglês Chinês Pinyin
    bit streaming/bɪt ˈstriːmɪŋ/ 流式传输 liú shì chuán shū
    buffer/ˈbʌfə/ 缓冲 huǎn chōng
    compression/kəmˈpreʃn/ 压缩 yā suō
    lossy/ˈlɒsi/ 有损 yǒu sǔn
    bit rate/bɪt reɪt/ 比特率 bǐ tè lǜ
    2.1

    A internet e a World Wide Web

    A internet 互联网 é uma rede de redes global usando um conjunto comum de protocolos 协议 (TCP/IP). A World Wide Web 万维网 (WWW) é um serviço que roda sobre ela: documentos hiperlinkados identificados por URLs, visualizados em navegadores via HTTP/HTTPS. E-mail e transferência de arquivos são outros serviços da internet que não fazem parte da WWW.

    Webmail usa ambos: a WWW, porque a caixa de entrada é uma página web acessada por uma URL em um navegador via HTTP; e a internet, porque o próprio e-mail viaja pela rede de redes (e-mail é um serviço separado da internet em relação à web).

    A World Wide Web é um serviço rodando sobre a Internet
    A Web é um serviço rodando sobre a Internet

    Hardware que suporta a internet

    • modem 调制解调器 — converte o sinal digital do computador em sinal analógico para uma linha telefônica, e vice-versa na outra extremidade (modulação e demodulação).
    • PSTN — a rede telefônica pública de centrais e linhas; uma conexão dial-up ou DSL transporta dados da internet por ela.
    • linha dedicada 专线 — uma linha alugada entre uma organização e seu ISP: sempre ativa, com largura de banda fixa que não é compartilhada, sendo mais rápida e confiável, mas cara.
    • rede de celular 蜂窝网络 — o telefone envia dados por rádio para a torre celular mais próxima (estação base); as torres estão ligadas à rede da operadora, que roteia os dados para a internet; à medida que o telefone se move, ocorre handover de uma célula para a próxima.
    Três faixas, uma por forma de acessar a internet: um computador doméstico através de um modem e a rede telefônica comutada pública; uma LAN de escritório por uma linha dedicada alugada; um smartphone por rádio para uma torre celular e através da rede de celulares; todos terminam no ISP
    Três formas de acessar a internet: modem e PSTN, linha dedicada e rede de celulares
    Vocabulário Treinar
    Inglês Chinês Pinyin
    internet/ˈɪntənet/ 互联网 hù lián wǎng
    local area network/ˈləʊkl ˈeərɪə ˈnetwɜːk/ 局域网 jú yù wǎng
    latency/ˈleɪtənsi/ 延迟 yán chí
    wide area network/waɪd ˈeərɪə ˈnetwɜːk/ 广域网 guǎng yù wǎng
    protocol/ˈprəʊtəkɒl/ 协议 xié yì
    IP address/ˌaɪ ˈpiː əˈdres/ IP地址 IP dì zhǐ
    routing table/ˈraʊtɪŋ ˈteɪbl/ 路由表 lù yóu biǎo
    network address translation/ˈnetwɜːk əˈdres trænˈsleɪʃn/ 网络地址转换 wǎng luò dì zhǐ zhuǎn huàn
    modem/ˈməʊdem/ 调制解调器 tiáo zhì jiě tiáo qì
    World Wide Web/wɜːld waɪd web/ 万维网 wàn wéi wǎng
    dedicated line/ˈdedɪkeɪtɪd laɪn/ 专线 zhuān xiàn
    2.1

    Endereços IP

    Um endereço IP identifica unicamente um dispositivo.

    • IPv4 — 32 bits, quatro números decimais de 0 a 255 (192.168.1.10); cerca de $4.3 \times 10^{9}$ endereços (agora esgotados).
    • IPv6 — 128 bits, oito grupos de quatro dígitos hexadecimais; cerca de $3.4 \times 10^{38}$ endereços.

    O IPv4 é escrito como quatro grupos de números decimais separados por pontos; cada grupo é um número de 8 bits, variando de 0 a 255. O IPv6 é escrito como oito grupos de quatro dígitos hexadecimais separados por dois-pontos, 2001:0db8:0000:0000:0000:ff00:0042:8329, e uma sequência de grupos nulos pode ser abreviada para ::. Portanto, 192.168.3.2 não é IPv6: tem quatro grupos, não oito, separados por pontos em vez de dois-pontos, e seus grupos são decimais, não hexadecimais. 256.0.0.A não é um endereço válido de nenhum dos tipos: um grupo IPv4 não pode exceder 255 nem conter letras, e o IPv6 precisaria de dois-pontos e oito grupos.

    Sub-redes

    Uma rede pode ser dividida em sub-redes 子网. O endereço IP divide-se em uma parte de rede e uma parte de host, definidas por uma máscara de sub-rede 子网掩码 (ex. 255.255.255.0 = os primeiros 24 bits são da rede). A subdivisão melhora a gestão, reduz o tráfego de broadcast e aumenta a segurança.

    As duas partes de um endereço numa sub-rede: o ID de rede (os primeiros bits, os mesmos para todos os dispositivos naquela sub-rede, dados pelos uns na máscara) e o ID de host (os bits restantes, únicos para cada dispositivo). Benefícios da subdivisão, para "descrever dois benefícios": menos tráfego em cada parte, pois as transmissões permanecem dentro da sua sub-rede; melhor segurança, porque o tráfego de um departamento é mantido fora dos outros; gestão mais fácil e diagnóstico de falhas; uso mais eficiente dos endereços. Dois dispositivos com a máscara 255.255.255.0 estão em sub-redes diferentes quando seus três primeiros grupos diferem.

    Seis sub-redes departamentais, cada uma com seu próprio ID de rede /24, todas conectadas através de um roteador central que também alcança a internet
    Dividir uma rede em sub-redes, um ID de rede por departamento

    Endereços públicos vs privados

    • endereços privados são usados dentro de uma LAN e não são roteáveis na internet (ex. 192.168.0.0/16).
    • um endereço IP público é globalmente único e roteável, atribuído por um ISP 互联网服务提供商.

    Dispositivos atrás do NAT com endereços privados não são diretamente acessíveis pela internet, oferecendo alguma proteção.

    As descrições que as tabelas pedem: um endereço público é visível na internet e único nela, alocado pelo ISP; um endereço privado é visível apenas dentro da LAN, é reutilizado por muitas LANs e precisa de NAT para alcançar a internet. Um endereço estático nunca muda (definido manualmente ou reservado, como um servidor precisa); um endereço dinâmico é alocado pelo DHCP toda vez que o dispositivo se conecta e pode mudar.

    Estático vs dinâmico

    • um endereço IP estático é fixo; usado para servidores que devem ser encontrados em um endereço conhecido.
    • um endereço IP dinâmico é atribuído pelo DHCP e pode mudar; mais fácil para dispositivos clientes e usa eficientemente um pool de endereços limitado.

    Exemplo resolvido. Um host tem endereço IP 192.168.10.130 com máscara de sub-rede 255.255.255.192. Em qual rede ele está, e 192.168.10.200 está na mesma? O último octeto da máscara, 192, é 11000000 em binário, então os primeiros 26 bits são a parte da rede e os últimos 6 bits endereçam o host. Isso faz com que as sub-redes avançam em blocos de $256 - 192 = 64$: .0, .64, .128, .192. O endereço 130 cai no bloco que começa em .128, então o host está na rede 192.168.10.128/26, cujos hosts utilizáveis vão de .129 a .190 (.191 é o endereço de broadcast). 200 cai no bloco seguinte (.192), então está em uma sub-rede diferente e o tráfego entre os dois deve passar por um roteador. Obtenha o tamanho do bloco primeiro a partir da máscara ($256$ menos o octeto da máscara) — adivinhar pelos três primeiros octetos é o que causa erros nestes exercícios.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    ISP/ˌaɪ es ˈpiː/ 互联网服务提供商 hù lián wǎng fú wù tí gōng shāng
    cell phone network/sel fəʊn ˈnetwɜːk/ 蜂窝网络 fēng wō wǎng luò
    subnets/ˈsʌbnets/ 子网 zi wǎng
    subnet mask/ˈsʌbnet mæsk/ 子网掩码 zi wǎng yǎn mǎ
    2.1

    URL e DNS

    Uma URL 统一资源定位符 (Uniform Resource Locator) localiza um recurso na WWW:

    https://www.example.com/about/contact.html
    protocol     domain name        path
    
    • protocolo: http, https, etc.
    • nome de domínio 域名: um endereço de servidor legível.
    • caminho: o recurso naquele servidor.

    O Sistema de Nomes de Domínio 域名系统 (DNS, também chamado de Serviço de Nomes de Domínio) é um conjunto distribuído de servidores que converte nomes de domínio em endereços IP. Quando você digita uma URL, o navegador pede ao resolveror DNS o IP, que consulta servidores DNS (raiz → nível superior → autoritativo) até encontrá-lo; o navegador então se conecta a esse IP e solicita o caminho. O DNS poupa os humanos de memorizar endereços IP e permite que um site mude de servidor sem mudar seu nome.

    Para "explique como o navegador usa a URL": o navegador divide a URL em protocolo, nome de domínio e caminho; envia o nome de domínio a um servidor DNS, que retorna o endereço IP correspondente (um cache no computador ou no ISP pode responder primeiro); abre uma conexão com esse endereço IP usando o protocolo (HTTPS na porta 443); envia uma solicitação para o caminho; e o servidor web retorna a página, que o navegador renderiza. Se a consulta DNS falhar, o navegador relata que o servidor não pôde ser encontrado.

    Numerado de um a cinco: o computador pede ao resolveror DNS o IP, o resolveror consulta outro servidor DNS, o IP é retornado ao resolveror e depois ao computador, e o navegador se conecta ao servidor do site *Como o DNS encontra o IP de um site antes que o navegador se conecte

    Explorar

    Como o DNS localiza um site

    Passo a passo de uma consulta DNS. A rede roteia por IP, não por nome — então, antes de qualquer coisa carregar, o DNS deve converter o nome de domínio em um endereço IP.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    URL/ˌjuː ɑː ˈel/ 统一资源定位符 tǒng yī zī yuán dìng wèi fú
    domain name/dəˈmeɪn neɪm/ 域名 yù míng
    Domain Name System/dəˈmeɪn neɪm ˈsɪstəm/ 域名系统 yù míng xì tǒng
    2.1

    Definições aceitas pelo examinador

    Uma questão de definição é marcada contra texto fixo. Aprenda estes exatamente.

    Termo Definição
    LAN uma rede cobrindo uma pequena área geográfica, geralmente um local, cujo hardware é propriedade da organização
    WAN uma rede cobrindo uma grande área geográfica, conectando LANs através de enlaces de terceiros (alugados ou públicos)
    cliente-servidor um modelo em que computadores clientes solicitam serviços de um servidor central mais poderoso que os fornece
    par-a-par um modelo em que cada computador é igual e pode atuar tanto como cliente quanto como servidor, sem servidor central
    " thin client
    " thick client
    topologia mesh uma topologia em que cada dispositivo está conectado diretamente a muitos outros, proporcionando mais de uma rota entre dois dispositivos
    computação em nuvem serviços de computação sob demanda (armazenamento, processamento, software) fornecidos pela internet por um terceiro
    Ethernet o protocolo padrão para LANs cabeadas, enviando dados em quadros e usando CSMA/CD em um meio compartilhado
    interruptor um dispositivo que encaminha cada quadro apenas para a porta do seu endereço MAC de destino, dentro de uma LAN
    roteador um dispositivo que conecta redes e encaminha pacotes entre elas pelo seu endereço IP de destino
    streaming de bits enviar um fluxo contínuo de bits para que o receptor reproduza a mídia conforme chega, sem baixar todo o arquivo primeiro
    internet a rede global de redes que usa os protocolos TCP/IP
    World Wide Web a coleção de páginas web hiperligadas, identificadas por URLs e acessadas sobre a internet através de um navegador
    URL o endereço que localiza um recurso na web: protocolo, nome de domínio e caminho
    DNS o serviço que traduz um nome de domínio no endereço IP do servidor que detém o recurso
    Vocabulário Treinar
    Inglês Chinês Pinyin
    thick client/θɪk ˈklaɪənt/ 胖客户端 pàng kè hù duān
    thin client/θɪn ˈklaɪənt/ 瘦客户端 shòu kè hù duān
    2.1

    Dicas de prova

    • Distinguir LAN vs WAN e cliente-servidor vs par-a-par por quem armazena e controla os recursos.
    • Correspondar cada topologia (barra, estrela, malha) a suas vantagens e desvantagens (custo, confiabilidade, colisões).
    • Conhecer a função de cada dispositivo: um interruptor direciona dentro de uma LAN pelo endereço MAC, um roteador roteia entre redes pelo IP.
    • Explicar streaming de bits e por que o buffer é necessário (os dados chegam a uma taxa diferente da reprodução).
    • Distinguir IPv4 vs IPv6 e endereços públicos vs privados; DNS transforma uma URL em um endereço IP.

    Erros comuns

    • Dizer que um switch funciona por endereço IP. Um switch encaminha por endereço MAC dentro da LAN; o roteador encaminha por endereço IP entre redes.
    • Tratar a internet e a World Wide Web como a mesma coisa. A web é um serviço que roda sobre a internet; email e transferência de arquivos são outros.
    • Dar "mais rápido" como a única comparação entre cabeadas e sem fio. Diga mais rápido e mais confiável e mais seguro, e dê o lado sem fio (mobilidade, sem fiação) quando a pergunta pedir uma comparação.
    • Escrever que um roteador encontra o endereço IP para uma URL. O DNS faz isso; o roteador encaminha pacotes para ele.
    • Descrever o IPv6 com pontos e grupos decimais. Oito grupos de quatro dígitos hexadecimais, separados por dois-pontos.
    • Desenhar uma topologia estrela como um anel ou corrente. Cada dispositivo tem sua própria linha para o switch no meio.
  • 3

    Hardware

    Assistir aula
    3.1

    Computadores e seus componentes

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da necessidade de entrada, saída, memória primária e armazenamento secundário (incluindo removível)
    Demonstrar compreensão de sistemas embutidos Incluindo: benefícios e desvantagens dos sistemas embutidos
    Descrever as principais operações de dispositivos de hardware Incluindo: Impressora a laser, impressora 3D, microfone, alto-falantes, disco rígido magnético, memória de estado sólido (flash), leitor/gravador de disco óptico, tela sensível ao toque, óculos de realidade virtual
    Demonstrar compreensão do uso de buffers
    Explicar as diferenças entre Memória de Acesso Aleatório (RAM) e Memória Somente Leitura (ROM) Incluindo seu uso em uma variedade de dispositivos e sistemas
    Explicar as diferenças entre Memória RAM Estática (SRAM) e Memória RAM Dinâmica (DRAM) Incluindo o uso de SRAM e DRAM em uma variedade de dispositivos e sistemas e os motivos para usar um em vez do outro dependendo do dispositivo e de seu uso
    Explicar a diferença entre ROM Programmável (PROM), ROM Programmável Apagável (EPROM) e ROM Programmável Apagavel Electricamente (EEPROM)
    Demonstrar compreensão de sistemas de monitoramento e controle Incluindo: • diferença entre monitoramento e controle • uso de sensores (incluindo temperatura, pressão, infravermelho, som) e atuadores • importância do feedback

    Fonte: Programa Cambridge International

    Um computador de uso geral tem quatro blocos construtivos:

    • dispositivos de entrada 输入设备 — inserem dados (teclado, mouse, microfone, scanner, sensores).
    • dispositivos de saída 输出设备 — apresentam resultados (monitor, alto-falantes, impressora, atuadores).
    • memória principal 主存储器 — memória rápida que o processador 处理器 (CPU) acessa diretamente (RAM e ROM). Mantém o programa em execução e seus dados.
    • armazenamento secundário 辅助存储器 — mais lento, maior, mantém programas e dados quando não estão em uso (disco rígido, SSD, disco óptico, pen drive).

    O programa exige saber por que cada um é necessário. Dispositivos de entrada são necessários porque o computador só pode trabalhar com dados e instruções que foram inseridos. Dispositivos de saída são necessários para apresentar os resultados em uma forma utilizável pelas pessoas. A memória principal é necessária porque o processador só pode executar instruções e usar dados que estão armazenados na memória que ele pode endereçar diretamente, e deve acessá-los rapidamente. O armazenamento secundário é necessário porque a memória principal é volátil e pequena: programas e dados devem sobreviver à desligamento da energia, em um armazenamento maior e mais barato, e o armazenamento removível permite mover dados entre computadores ou mantê-los como backup.

    Um teclado de computador QWERTY sem fio branco de tamanho completo sobre fundo branco
    Um teclado: um dispositivo de entrada comum para digitar texto e comandos
    Um mouse de computador sem fio moderno sobre fundo branco, com dois botões e uma roda de rolagem
    Um mouse: um dispositivo de ponteiro de entrada
    Um scanner de leito plano sobre fundo branco, com uma foto saindo pela frente após a digitalização
    Um scanner de leito plano: um dispositivo de entrada que transforma uma página de papel em uma imagem digital
    Um monitor de computador de ecrã plano prateado num suporte redondo, com o ecrã escuro
    Um monitor: um dispositivo de saída comum que exibe a imagem do ecrã
    Explorar

    Toque nos blocos de um sistema de computador

    Explore os quatro blocos mais a CPU. Os dados fluem entrada → processamento → saída, enquanto a memória primária segura o programa em execução e o armazenamento secundário o mantém para depois.

    Explorar

    Laboratório de roteamento de rede

    Siga os dados de um dispositivo através do hardware de rede e protocolos.

    3.1

    Sistemas embarcados

    Um sistema embarcado 嵌入式系统 é um computador construído dentro de outro dispositivo para realizar uma tarefa fixa (máquina de lavar, micro-ondas, unidade de motor do carro, termostato).

    • vantagens: optimizado para uma única tarefa, por isso é pequeno, consome pouca energia e é barato de fabricar em grande escala; fiável, porque executa um programa fixo com poucas oportunidades de erro; inicia rapidamente e não requer configuração pelo utilizador; fácil de usar através de uma interface simples.
    • desvantagens: limitado à sua única tarefa, por isso não pode ser atualizado para fazer mais coisas; difícil de atualizar (o seu firmware 固件 pode precisar de ferramentas especiais ou não pode ser alterado); difícil de diagnosticar e, geralmente, todo o dispositivo deve ser substituído quando falha; se estiver ligado a uma rede, pode ser uma fraqueza de segurança, porque o seu software raramente é corrigido.

    Uma questão "descreva as desvantagens" pretende que cada desvantagem seja apresentada como um ponto completo: qual é a limitação e o que significa para o utilizador, por exemplo "o firmware não pode ser atualizado, por isso um defeito de segurança descoberto mais tarde não pode ser corrigido".

    Vocabulário Treinar
    Inglês Chinês Pinyin
    firmware/ˈfɜːmweə/ 固件 gù jiàn
    3.1

    Dispositivos de hardware principais

    Impressora a laser

    Uma impressora a laser 激光打印机 digitaliza a imagem da página num tambor fotosensível carregado. O toner 墨粉 adere às áreas carregadas, transfere-se para o papel e é fundido por um fixador. Rápida, nítida, alta capacidade.

    Uma impressora a laser preta de mesa sobre fundo branco, com uma página impressa a sair pela parte superior
    Uma impressora a laser: impressão rápida e nítida utilizando um tambor carregado e toner

    Como funciona, nos passos listados no guia de correção:

    1. Os dados da página são enviados para o buffer da impressora.
    2. O tambor recebe uma carga eletrostática uniforme.
    3. Um laser, refletido por um espelho rotativo, digitaliza a imagem da página no tambor, removendo a carga onde atinge, de modo que a carga restante no tambor corresponde à imagem.
    4. O toner, um pó carregado, é atraído apenas para as partes carregadas do tambor.
    5. O papel recebe a carga oposta e rola contra o tambor, transferindo o toner para ele.
    6. O fixador 定影器, um par de rolos aquecidos, funde o toner no papel. O tambor é então descarregado e limpo para a próxima página.

    Impressora 3D

    Uma impressora 3D 3D打印机 constrói um objeto camada por camada: FDM derrete filamento plástico através de uma bocal; estereolitografia cura resina líquida com um laser UV. Usada para protótipos e peças médicas personalizadas.

    Uma impressora 3D FDM preta de mesa com invólucro e painel frontal de vidro, com uma peça sendo impressa no interior, sobre fundo branco
    Uma impressora 3D FDM constrói um objeto camada por camada fundindo filamento plástico

    Como funciona:

    1. Um modelo do objeto é desenhado em software CAD (ou escaneado).
    2. Software de fatiamento divide o modelo em camadas horizontais finas e produz as instruções para cada uma.
    3. A impressora constrói o objeto camada a camada: uma impressora FDM derrete filamento plástico 塑料丝 e deposita-o através de um bocal móvel; uma impressora de resina cura resina líquida com um laser ou luz UV; uma impressora de pó funde pó com um laser.
    4. Cada camada une-se à camada inferior, e a plataforma (ou bocal) move-se na espessura de uma camada.
    5. Quando a última camada está pronta, qualquer material de suporte é removido. As utilizações incluem protótipos, peças médicas personalizadas como próteses, e peças sobressalentes impressas sob demanda.

    Microfone e altifalantes

    Um microfone 麦克风 converte som num sinal elétrico (um diafragma vibra, alterando a carga do capacitor 电容器 ou a posição da bobina); o sinal é digitalizado por um conversor analógico-digital 模数转换器 (ADC). Um altifalante faz o inverso — um sinal variável aciona uma bobina num campo magnético, movendo um cone para produzir som.

    Um microfone de mesa USB preto apoiado na sua base, sobre fundo branco
    Um microfone converte som num sinal elétrico
    Corte transversal de um microfone: ondas sonoras atingem um diafragma ligado a uma bobina ao redor de um íman permanente, gerando uma corrente de saída
    Dentro de um microfone: o som vibra o diafragma e a bobina para produzir uma corrente
    Corte transversal de um alto-falante: corrente numa bobina ao redor de um núcleo de ferro próximo de um íman permanente move um cone de papel para producing ondas sonoras
    No interior de um alto-falante: uma corrente variável na bobina move o cone para produzir som

    Como funciona um microfone: ondas sonoras fazem um diafragma 膜片 vibrar; num microfone dinâmico, uma bobina ligada ao diafragma move-se num campo magnético, induzindo uma corrente variável nele, e num microfone condensador o diafragma é uma placa de um capacitor cuja capacitância muda conforme se move; o sinal analógico variável é depois amostrado por um ADC e armazenado como dados digitais. Um altifalante percorre a cadeia ao contrário: um conversor digital-analógico 数模转换器 (DAC) produz uma corrente variável, a corrente na bobina cria um campo magnético variável que empurra contra o íman permanente, a bobina e o cone movem-se para dentro e para fora, e o movimento do cone gera ondas de pressão no ar.

    Disco rígido magnético (HDD)

    Um disco rígido 硬盘 armazena dados em pratos girantes revestidos com material magnético. Cada prato tem trilhas 磁道 divididas em setores 扇区. Uma cabeça de leitura/escrita 读写头 flutua logo acima e magnetiza pequenas regiões (escrita) ou as deteta (leitura). Barato por gigabyte, mas mais lento que SSDs e possui peças móveis.

    Uma unidade de disco rígido 3.5 polegadas aberta: um prato circular brilhante com o braço atuador e a cabeça de leitura/escrita repousando sobre ele
    Um disco rígido aberto: o braço atuador transporta a cabeça de leitura/escrita sobre um prato
    Um prato de disco rígido desenhado como círculos de trilha concêntricos, uma trilha destacada, dividido em setores
    Trilhas e setores num prato de disco rígido

    Como funciona: os pratos giram a alta velocidade (milhares de rotações por minuto); cada superfície é dividida em trilhas concêntricas e cada trilha em setores; cabeças de leitura/escrita em braços atuadores 磁头臂 movem-se pelos pratos até à trilha correta; para escrever, a cabeça magnetiza uma pequena região com uma das duas polaridades, representando 0 ou 1; para ler, detecta a polaridade à medida que a região passa por baixo dela. Os atrasos, esperando o braço alcançar a trilha e o setor girar, são por isso que um disco rígido é mais lento que um SSD.

    Memória de estado sólido (flash)

    Uma unidade de estado sólido 固态硬盘 armazena dados como carga em transistores 晶体管, sem peças móveis. Acesso aleatório mais rápido que HDDs, mais resistente, menor consumo de energia, mas mais caro por gigabyte; cada célula desgasta após muitas escritas.

    A placa de circuito aberta de uma unidade de estado sólido sobre fundo branco: um grande chip de memória flash preto à esquerda, um chip controlador menor, muitos componentes minúsculos e um conector SATA plano ao longo da borda inferior — sem pratos ou peças móveis
    No interior de um SSD: os dados são armazenados em chips de memória flash, sem peças móveis (compare com o disco rígido acima)

    Como funciona: cada célula é um transistor de porta flutuante 浮栅晶体管; uma carga aprisionada na porta flutuante representa um bit e permanece lá quando a alimentação é desligada; um chip controlador mapeia cada endereço para uma célula e distribui as escritas pelas células, porque uma célula suporta apenas um número limitado de escritas.

    Disco rígido magnético Unidade de estado sólido
    Peças móveis pratos e cabeças nenhum
    Velocidade mais lento: atrasos de busca e rotação acesso aleatório muito mais rápido
    Custo por gigabyte menor maior
    Robustez danificado por golpes; ruidoso; mais energia resistente a choques; silencioso; menos energia
    Vida útil muitas reescritas; desgaste mecânico ciclos de escrita limitados por célula

    Uma questão "por que um servidor usa discos rígidos em vez de SSDs" pretende a coluna da esquerda: mais barato por gigabyte para capacidades muito grandes, longa vida sob reescrita constante e recuperação de dados mais fácil.

    Disco ótico

    Um laser deteta reflexões de pequenas crateras num disco ótico 光盘 (CD, DVD, Blu-ray). A unidade é uma leitora/gravadora de discos óticos: a gravação utiliza um laser mais forte para alterar a refletividade da superfície.

    Uma unidade de disco ótico externa sobre fundo branco, com a bandeja aberta e um disco colorido iridescente inserido
    Uma unidade de disco ótico: um laser lê pequenas crateras num disco CD, DVD ou Blu-ray

    Como funciona: o disco transporta uma longa trilha espiral de crateras 凹坑 e terras planas 平台 (as áreas planas entre elas); o disco gira e um laser é focado na trilha; a luz refletida de uma terra plana difere da luz refletida na borda de uma cratera, e um sensor de luz lê cada mudança como um 1 e nenhuma mudança como um 0. A gravação utiliza um laser mais forte para alterar a refletividade de uma camada de corante ou liga. Um Blu-ray utiliza um laser azul com comprimento de onda mais curto, por isso suas crateras são menores e mais próximas, o que explica por que armazena mais dados que um DVD.

    Ecrã tátil

    Um ecrã tátil 触摸屏 deteta contacto. Resistivo 电阻式: duas camadas condutoras pressionadas juntas; funciona com tudo mas é menos preciso. Capacitivo 电容式: um dedo perturba um campo de carga; preciso, multi-toque, usado em telemóveis.

    Pessoas usando uma tela sensível ao toque de tablet e um laptop
    Um ecrã tátil deteta onde um dedo toca o vidro

    Como funciona: um ecrã resistivo tem duas camadas condutoras finas separadas por espaçadores; premir empurra a camada superior contra a inferior, fechando um circuito nesse ponto, e o controlador lê a tensão para encontrar as coordenadas. Um ecrã capacitivo tem uma camada de vidro revestida com um condutor transparente que retém uma carga; um dedo ao tocá-la desvia uma pequena corrente, a corrente é medida em cada canto, e o controlador calcula a posição do toque a partir das diferenças. Ecrãs capacitivos respondem a toques leves e a vários dedos ao mesmo tempo, mas não a um dedo enluvarado ou a uma caneta estilete comum.

    Óculos de realidade virtual

    Um headset de realidade virtual 虚拟现实 (VR) tem dois ecrãs pequenos (um para cada olho) e sensores de movimento (acelerómetro 加速度计, giroscópio 陀螺仪) que registam o movimento da cabeça para que a cena mude à medida que você olha à volta.

    Um headset de realidade virtual branco com sua correia de cabeça e câmeras frontais, sobre fundo branco
    Óculos de realidade virtual: duas pequenas telas e sensores de movimento rastreiam a cabeça

    Como funciona: cada olho vê sua própria tela através de uma lente, e as duas imagens diferem ligeiramente, então o cérebro percebe profundidade; sensores (acelerômetro, giroscópio, às vezes câmeras) informam onde a cabeça está e para qual direção ela aponta; o computador re-renderiza a cena a partir daquele ponto de vista várias vezes por segundo, assim girar a cabeça gira a visão; fones de ouvido fornecem som que corresponde à direção. Usados para jogos, treinamento como simuladores de voo ou cirurgia, e para visualizar projetos antes de serem construídos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    input devices/ˈɪnpʊt dɪˈvaɪsɪz/ 输入设备 shū rù shè bèi
    microphone/ˈmaɪkrəfəʊn/ 麦克风 mài kè fēng
    optical disc/ˈɒptɪkl dɪsk/ 光盘 guāng pán
    volatile/ˈvɒlətaɪl/ 易失性 yì shī xìng
    embedded system/emˈbedɪd ˈsɪstəm/ 嵌入式系统 qiàn rù shì xì tǒng
    laser printer/ˈleɪzə ˈprɪntə/ 激光打印机 jī guāng dǎ yìn jī
    drum/drʌm/ 感光鼓 gǎn guāng gǔ
    toner/ˈtəʊnə/ 墨粉 mò fěn
    fuser/ˈfjuːsə/ 定影器 dìng yǐng qì
    3D printer/ˌθriː ˈdiː ˈprɪntə/ 3D打印机 3D dǎ yìn jī
    filament/ˈfɪləmənt/ 塑料丝 sù liào sī
    diaphragm/ˈdaɪəfræm/ 膜片 mó piàn
    capacitor/kəˈpæsɪtə/ 电容器 diàn róng qì
    analogue-to-digital converter/ˈænəlɒɡ tə ˈdɪdʒɪtl kənˈvɜːtə/ 模数转换器 mó shù zhuǎn huàn qì
    digital-to-analogue converter/ˈdɪdʒɪtl tʊ ˈænəlɒɡ kənˈvɜːtə/ 数模转换器 shù mó zhuǎn huàn qì
    tracks/træks/ 磁道 cí dào
    sectors/ˈsektəz/ 扇区 shàn qū
    read/write head/riːd raɪt hed/ 读写头 dú xiě tóu
    actuator arms/ˈæktʃuːeɪtə ɑːmz/ 磁头臂 cí tóu bì
    solid-state drive/ˈsɒlɪd steɪt draɪv/ 固态硬盘 gù tài yìng pán
    transistors/trænˈzɪstəz/ 晶体管 jīng tǐ guǎn
    floating-gate transistor/ˈfləʊtɪŋ ɡeɪt trænˈzɪstə/ 浮栅晶体管 fú zhà jīng tǐ guǎn
    pits/pɪts/ 凹坑 āo kēng
    lands/lændz/ 平台 píng tái
    touchscreen/ˈtʌtʃskriːn/ 触摸屏 chù mō píng
    resistive/rɪˈzɪstɪv/ 电阻式 diàn zǔ shì
    capacitive/kəˈpæsɪtɪv/ 电容式 diàn róng shì
    virtual reality/ˈvɜːtʃuːəl rɪˈælɪti/ 虚拟现实 xū nǐ xiàn shí
    accelerometer/əkˌseləˈrɒmɪtə/ 加速度计 jiā sù dù jì
    gyroscope/ˈdʒaɪrəskəʊp/ 陀螺仪 tuó luó yí
    interrupt/ˈɪntərʌpt/ 中断 zhōng duàn
    non-volatile/nɒn ˈvɒlətaɪl/ 非易失性 fēi yì shī xìng
    3.1

    Buffers

    Um buffer 缓冲 é memória que armazena dados temporariamente enquanto se movem entre dispositivos de velocidades diferentes. Exemplo: a CPU escreve um documento no buffer da impressora rapidamente, depois fica livre para fazer outro trabalho enquanto a impressora imprime do buffer em seu próprio ritmo. Buffers impedem que o dispositivo rápido aguarde o lento (também usado em streaming, teclado e acesso ao disco).

    "Explique por que uma impressora 3D precisa de um buffer": o computador envia os dados de impressão muito mais rápido do que a impressora pode construir as camadas, então os dados são mantidos no buffer até que a impressora esteja pronta para recebê-los, e o processador é liberado para fazer outros trabalhos. Quando o buffer fica baixo, a impressora envia uma interrupção 中断 para pedir mais dados (tópico 4). Um fluxo de vídeo funciona da mesma forma: o buffer enche adiantado em relação à reprodução, para que uma pequena queda na velocidade da rede não pare a imagem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    buffer/ˈbʌfə/ 缓冲 huǎn chōng
    3.1

    RAM e ROM

    • RAM 随机存取存储器 (Random Access Memory) — volátil 易失性 (perde dados sem energia). Armazena o SO, programas em execução e seus dados; lida e escrita constantemente.
    • ROM 只读存储器 (Read-Only Memory) — não volátil 非易失性 (mantém dados sem energia). Geralmente gravada apenas uma vez; armazena firmware necessário na inicialização (o BIOS / boot loader).
    RAM é volátil e leitura/escrita; ROM é não volátil e apenas leitura
    RAM é volátil e leitura/escrita; ROM é não volátil e apenas leitura

    A ROM inicia o sistema; a RAM então armazena o trabalho ativo.

    RAM ROM
    Volátil? sim: conteúdo perdido quando desliga não: conteúdo mantido sem energia
    Leitura/escrita? lida e escrita constantemente apenas leitura no uso normal
    Armazena o sistema operacional, programas em execução e seus dados o firmware e programa de inicialização que ligam o computador
    Tamanho grande, e geralmente pode ser aumentado pequeno e fixo
    Uso típico memória principal de um computador ou celular código de inicialização de um PC; o programa inteiro de um sistema embarcado como uma máquina de lavar

    Mais RAM permite que um computador mantenha mais programas e dados ao mesmo tempo, trocando menos entre memória e disco e funcionando mais rápido; essa é a resposta para "explique por que o computador com mais RAM tem melhor desempenho".

    Módulo de RAM (DIMM): um módulo de placa de circuito com espalhador de calor preto sobre os chips de memória e conector com borda dourada que se conecta a um slot na placa-mãe
    Um módulo de RAM (DIMM) se conecta à placa-mãe como a memória principal rápida do computador

    A mesma divisão de memória importa em um dispositivo vestível: seu programa fixo deve permanecer disponível após desligar, enquanto suas leituras vivas mudam durante o uso.

    Monitor de frequência cardíaca usado no pulso de um corredor
    Monitor de frequência cardíaca de pulso
    Explorar

    Laboratório de Dispositivos e Armazenamento

    Classifique exemplos de computação pelo que eles fazem em um sistema.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    RAM/ræm/ 随机存取存储器 suí jī cún qǔ cún chǔ qì
    ROM/rɒm/ 只读存储器 zhī dú cún chǔ qì
    secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ 辅助存储器 fǔ zhù cún chǔ qì
    hard disk/hɑːd dɪsk/ 硬盘 yìng pán
    3.1

    SRAM vs DRAM

    • SRAM 静态RAM (Static RAM) armazena cada bit em um flip-flop 触发器 de vários transistores. Rápido, mas caro e pouco denso. Usado para cache 高速缓存 da CPU.
    • DRAM 动态RAM (Dynamic RAM) armazena cada bit como carga em um capacitor minúsculo. Mais barato e denso, mas mais lento, e deve ser refreshed 刷新 (reescrito) milhares de vezes por segundo. Usado para memória principal.

    Use SRAM para memória pequena e rápida (cache); DRAM para memória principal grande.

    SRAM DRAM
    Cada bit armazenado em um flip-flop de vários transistores um capacitor e um transistor
    Precisa de refresh? não sim, milhares de vezes por segundo
    Velocidade mais rápida mais lenta
    Densidade e custo menos bits por chip, mais caro mais bits por chip, mais barato
    Energia usa menos energia em repouso usa mais, devido ao refresh
    Usado para cache do processador memória principal, incluindo em sistemas embarcados

    "Explique por que o sistema embarcado usa DRAM": ele precisa de uma grande quantidade de memória a baixo custo em espaço reduzido, e seu requisito de velocidade é modesto, então o DRAM mais barato e denso é a escolha certa; a SRAM é mantida para o cache pequeno onde a velocidade importa mais.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    SRAM/ˈesræm/ 静态 jìng tài
    DRAM/ˈdiːræm/ 动态 dòng tài
    flip-flop/flɪp flɒp/ 触发器 chù fā qì
    cache/kæʃ/ 高速缓存 gāo sù huǎn cún
    refreshed/rɪˈfreʃt/ 刷新 shuā xīn
    3.1

    PROM, EPROM e EEPROM

    Variações de ROM que você pode programar após a fabricação:

    • PROM (Programmable ROM) — escrito uma única vez (fusíveis queimados por um programador); não pode ser alterado.
    • EPROM (Erasable Programmable ROM) — apagado por luz UV forte através de uma janela, depois reescrito (todo o chip de uma vez).
    • EEPROM (Electrically Erasable Programmable ROM) — apagado e reescrito eletricamente, byte por byte, no circuito. A memória Flash é um derivado otimizado para apagar blocos.
    Chip EPROM preto com janela de quartzo circular expondo seu die de silício
    Um chip EPROM com janela para apagamento ultravioleta
    PROM EPROM EEPROM
    Escrito uma vez, pelo usuário com um programador muitas vezes muitas vezes
    Apagado por não pode ser apagado luz ultravioleta através de uma janela de quartzo um sinal elétrico
    Apaga nada todo o chip de uma vez um byte ou bloco por vez
    Deve ser removido do circuito para reprogramar? não aplicável sim não

    "Dê duas diferenças entre EPROM e EEPROM" pede duas linhas desta tabela, declaradas para ambos os tipos.

    3.1

    Sistemas de monitoramento e controle

    Ambos leem sensores; a diferença é o que fazem a seguir.

    • monitoramento 监控 — coleta e relata dados, mas não toma ação (uma estação meteorológica registrando leituras).
    • sistema de controle 控制系统 — usa dados dos sensores para decidir e agir através de atuadores, geralmente em um loop de feedback (um termostato ligando/desligando uma caldeira).

    A resposta de três pontos "descreva as diferenças": um sistema de monitoramento apenas mede, registra ou exibe as leituras, e no máximo levanta um alerta; um sistema de controle compara cada leitura com um valor predefinido 预设值 e, se estiver fora da faixa, envia sinais para atuadores que alteram o processo físico; a mudança é então medida novamente, então um sistema de controle contém feedback e um sistema de monitoramento não. Se um dado sistema é um ou outro é decidido por esse teste: um sistema de ponte que mede a altura de um veículo e acende um sinal de aviso é monitoramento, porque nada que ele faz altera o veículo; um sistema que abaixa uma barreira é controle.

    Exemplo resolvido. Descreva como um sistema automático abre uma porta quando uma pessoa está dentro de 2 metros e a fecha quando ninguém está presente.

    Um sensor infravermelho ou ultrassônico mede a distância até qualquer objeto à frente da porta; a leitura analógica é convertida em digital por um ADC e enviada ao processador; o processador compara a distância com os 2 metros predefinidos; se for menor, o processador envia um sinal para o atuador (um motor) para abrir a porta; o sensor continua medindo, e quando nenhuma leitura abaixo de 2 metros é recebida, o processador sinaliza ao motor para fechar a porta. A medição repetida após cada ação é o feedback que impede que a porta abra e feche nos momentos errados.

    Diagrama de fluxo: sensores enviam sinais através de um ADC para o processador, que ou relata um aviso para monitoramento ou envia sinais para atuadores em um loop de feedback para controle
    Monitoramento relata dados; um sistema de controle age através de um loop de feedback

    Sensores e atuadores

    Um sensor 传感器 converte uma grandeza física em um sinal: temperatura (uma termistor 热敏电阻 ou termopar), pressão (strain gauge), infravermelho, som. Sinais analógicos precisam primeiro de um ADC. Um atuador 执行器 faz o inverso — converte um sinal em uma ação (motor, válvula, aquecedor, buzina).

    Pequenas termistores de contas com duas patilhas de fio cada, sobre fundo branco
    Uma termistor: um sensor de temperatura cuja resistência muda com o calor
    Pequeno motor passo-a-passo metálico com eixo central e fios coloridos, sobre fundo escuro de estúdio
    Um pequeno motor elétrico: um atuador que converte um sinal em movimento

    Feedback

    Em um sistema de controle, o atuador altera o ambiente, que os sensores então re-medem — um loop de feedback 反馈. Sem feedback, o sistema não pode se corrigir nem saber quando parar (um termostato sem feedback de temperatura aqueceria para sempre).

    Explorar

    O loop de controle de feedback

    Gire ao redor do loop que um termostato ou piloto automático repete. Um sistema de controle não apenas lê o mundo — ele age, depois re-mede, corrigindo-se repetidamente.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    sensor/ˈsensə/ 传感器 chuán gǎn qì
    output devices/ˈaʊtpʊt dɪˈvaɪsɪz/ 输出设备 shū chū shè bèi
    actuator/ˈæktʃuːeɪtə/ 执行器 zhí xíng qì
    primary memory/ˈpraɪməri ˈmeməri/ 主存储器 zhǔ cún chǔ qì
    processor/ˈprəʊsesə/ 处理器 chǔ lǐ qì
    monitoring/ˈmɒnɪtərɪŋ/ 监控 jiān kòng
    control system/kənˈtrəʊl ˈsɪstəm/ 控制系统 kòng zhì xì tǒng
    feedback/ˈfiːdbæk/ 反馈 fǎn kuì
    preset value/ˈpriːset ˈvæljuː/ 预设值 yù shè zhí
    thermistor/ˈθɜːmɪstə/ 热敏电阻 rè mǐn diàn zǔ
    3.2

    Portas lógicas

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Usar os seguintes símbolos de porta lógica: [NOT, AND, OR, NAND, NOR, XOR]
    Compreender e definir as funções de: portas NOT, AND, OR, NAND, NOR e XOR (EOR) Todas as portas exceto a NOT terão apenas duas entradas.
    Construir a tabela-verdade para cada uma das portas lógicas acima
    Construir um circuito lógico A partir de: • um enunciado de problema • uma expressão lógica • uma tabela-verdade
    Construir uma tabela-verdade A partir de: • um enunciado de problema • um circuito lógico • uma expressão lógica
    Construir uma expressão lógica A partir de: • um enunciado de problema • um circuito lógico • uma tabela-verdade

    Fonte: Programa Cambridge International

    O meio somador: XOR + AND soma dois bits

    Uma porta lógica 逻辑门 é um pequeno circuito que realiza uma operação Booleana 布尔. Entradas e saídas são 0 (falso, baixo) ou 1 (verdadeiro, alto). Conheça o símbolo, função e tabela-verdade 真值表 para cada porta.

    Os símbolos de circuito para portas NOT, AND, OR, NAND, NOR e XOR em uma grade dois por três
    Os símbolos das seis portas lógicas

    NOT (inversor)

    A NÃO A
    0 1
    1 0

    AND — saída 1 apenas se todos os inputs forem 1

    A B A E B
    0 0 0
    0 1 0
    1 0 0
    1 1 1

    OR — saída 1 se pelo menos um input for 1

    A B A OU B
    0 0 0
    0 1 1
    1 0 1
    1 1 1

    NAND (NÃO E) — saída 0 apenas quando todos os inputs forem 1

    A B A NÃO E B
    0 0 1
    0 1 1
    1 0 1
    1 1 0

    NOR (NÃO O) — saída 1 apenas quando todos os inputs forem 0

    A B A NÃO O B
    0 0 1
    0 1 0
    1 0 0
    1 1 0

    XOR (OU Exclusivo, também chamado EOR) — saída 1 se os inputs forem diferentes

    A B A XOR B
    0 0 0
    0 1 1
    1 0 1
    1 1 0
    Explorar

    Portas lógicas

    Alterne as entradas e escolha uma porta. Cada porta tem sua própria regra — os blocos de construção de todo circuito digital.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    logic gate/ˈlɒdʒɪk ɡeɪt/ 逻辑门 luó jí mén
    Boolean/ˈbuːlɪən/ 布尔 bù ěr
    truth table/truːθ ˈteɪbl/ 真值表 zhēn zhí biǎo
    3.2

    Circuitos lógicos

    Um circuito lógico 逻辑电路 é uma rede de portas que executa uma expressão Booleana. Você deve ser capaz de transitar entre um enunciado de problema, uma expressão lógica, uma tabela-verdade e um diagrama de circuito.

    A prova escreve expressões em palavras, X = (A AND NOT B) OR (B AND C), e aceita a forma algébrica $X = A\overline{B} + BC$ onde um ponto (ou nada) é AND, um sinal de mais é OR, e uma barra é NOT. Use a que a questão utilizar.

    De expressão para circuito

    Desenhe uma porta por operador e ligue-os. Para $X = (A \text{ AND } B) \text{ OR } (\text{NOT } C)$: uma porta NOT em $C$, uma porta AND em $A$ e $B$, depois uma porta OR nos dois resultados.

    Um circuito lógico: uma porta AND nas entradas A e B, uma porta NOT na entrada C, ambas alimentando uma porta OR que dá a saída X
    Portas conectadas para executar uma expressão Booleana

    De circuito para expressão

    Trabalhe da esquerda para a direita a partir das entradas, rotulando a saída de cada porta, até chegar à saída final.

    Exemplo resolvido. Escreva a expressão do circuito abaixo e complete sua tabela-verdade.

    Um circuito lógico com entradas A, B e C. B passa por uma porta NOT; A e NOT B alimentam uma porta AND cuja saída é rotulada como P; B e C alimentam uma segunda porta AND cuja saída é rotulada como Q; P e Q alimentam uma porta OR cuja saída é X
    Rotule todas as saídas intermediárias: aqui P é A AND NOT B e Q é B AND C, então X é P OR Q

    Rotule as saídas das portas: $P = A \text{ AND NOT } B$, $Q = B \text{ AND } C$, então $X = P \text{ OR } Q = (A \text{ AND NOT } B) \text{ OR } (B \text{ AND } C)$. Em seguida, adicione uma coluna para cada saída intermediária na tabela-verdade, para que cada linha possa ser verificada porta por porta:

    A B C NOT B P Q X
    0 0 0 1 0 0 0
    0 0 1 1 0 0 0
    0 1 0 0 0 0 0
    0 1 1 0 0 1 1
    1 0 0 1 1 0 1
    1 0 1 1 1 0 1
    1 1 0 0 0 0 0
    1 1 1 0 0 1 1

    Desenhar um circuito a partir de uma expressão é o mesmo caminho ao contrário: comece pelos parênteses mais internos, desenhe uma porta por operador, desenhe uma porta NOT no fio de qualquer entrada que apareça com NOT, mantenha as entradas à esquerda e a única saída à direita, e rotule a saída com sua letra. Cada linha deve terminar em uma entrada de porta ou na saída; uma linha que não vai a lugar nenhum perde a pontuação.

    De circuito para tabela-verdade

    Para $n$ entradas, há $2^{n}$ linhas. Liste todas as combinações de entradas; para cada uma, calcule as portas internas e depois a saída.

    De tabela-verdade para expressão (soma de produtos)

    Para cada linha que tem saída 1, escreva um AND das entradas (com NOT em qualquer entrada que seja 0 naquela linha); OR essas expressões juntas. Exemplo: uma tabela que é 1 apenas nas linhas $(A=0,B=1)$ e $(A=1,B=0)$ resulta em $\overline{A}B + A\overline{B}$, que é $A \text{ XOR } B$.

    De um enunciado de problema

    Transforme o inglês em uma expressão Booleana primeiro: "A and B" → A AND B; "A or B or both" → A OR B; "exactly one of A and B" → A XOR B; "neither A nor B" → A NOR B; "not both" → A NAND B.

    Exemplo resolvido. O alarme de uma máquina $X$ soa quando a barreira está aberta ($A=1$) e o motor está em funcionamento ($B=1$) ou a temperatura está alta ($C=1$). Escreva a expressão Booleana e indique as linhas onde $X=1$. Transforme o inglês em lógica uma cláusula por vez: "either B or C" é $B + C$, e "A e that" é $X = A\cdot(B + C)$. Para as linhas, $X=1$ precisa de $A=1$ e pelo menos um de $B$, $C$ igual a 1 — então $(A,B,C) = (1,0,1)$, $(1,1,0)$ e $(1,1,1)$, três linhas de oito. Note que $A=0$ nunca pode acionar o alarme, independentemente do que $B$ e $C$ façam. Parentetize o OR antes de fazer o AND dele: $X = A\cdot B + C$ é um circuito totalmente diferente, um que acionaria o alarme em temperatura alta mesmo com a barreira fechada.

    Explorar

    Somador parcial

    Conecte XOR e AND aos mesmos dois inputs: XOR gera o bit de soma, AND gera o carry. Clique em A e B.

    Explorar

    Circuitos lógicos

    portas combinam para formar circuitos

    Cada porta tem uma regra fixa; conectá-las constrói todos os circuitos — comece com uma porta.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    logic circuit/ˈlɒdʒɪk ˈsɜːkɪt/ 逻辑电路 luó jí diàn lù
    3.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    sistema embarcado um sistema computacional com uma função dedicada integrada a um dispositivo maior
    buffer uma área de memória que armazena temporariamente dados enquanto são transferidos entre dispositivos que operam em velocidades diferentes
    RAM memória volátil que pode ser lida e escrita, mantendo os programas e dados em uso
    ROM memória não volátil cujos conteúdos não podem ser alterados no uso normal, contendo as instruções de inicialização
    SRAM RAM estática que armazena cada bit em um flip-flop e não precisa de refresh
    DRAM RAM dinâmica que armazena cada bit como uma carga em um capacitor e deve ser atualizada continuamente
    sistema de monitoramento um sistema que usa sensores para medir e relatar sobre um processo físico sem alterá-lo
    sistema de controle um sistema que usa leituras de sensores para decidir e executar ações, através de atuadores, que alteram um processo físico
    sensor um dispositivo que mede uma grandeza física e a converte em um sinal para o computador
    atuador um dispositivo que converte um sinal do computador em uma ação física
    feedback a saída de um sistema de controle sendo medida e retroalimentada como entrada para que o sistema possa se corrigir
    porta lógica um circuito eletrônico que realiza uma operação Booleana sobre uma ou mais entradas binárias para gerar uma saída binária
    tabela-verdade uma tabela que lista todas as combinações de entradas de um circuito lógico com a saída correspondente para cada uma
    3.2

    Dicas de prova

    • Diferencie RAM (volátil, leitura/escrita) de ROM (não volátil, mantém o bootstrap); SRAM (cache, mais rápida) de DRAM (memória principal, precisa de refresh).
    • Para um circuito lógico, construa a expressão Booleana porta por porta, depois uma tabela-verdade cobrindo todas as combinações de entradas.
    • Aprenda o símbolo, a expressão e a tabela-verdade de cada porta (AND, OR, NOT, NAND, NOR, XOR).
    • Explique um buffer (um armazenamento temporário que liga duas velocidades diferentes) e o papel de uma interrupção.

    Erros comuns

    • Nomear o dispositivo em vez de descrever sua operação. "Ele usa um laser" não dá pontos; os passos (carregar o tambor, o laser remove a carga, o toner é atraído, transferido, fundido) ganham os pontos.
    • Dizer que um sistema de monitoramento "controla" algo. Se nada altera o processo físico, é monitoramento; adicione o atuador e o feedback e vira controle.
    • Escrever que a RAM "armazena arquivos permanentemente" ou que a ROM "armazena os dados do usuário". A RAM é memória de trabalho volátil; a ROM contém as instruções fixas de inicialização.
    • Uma tabela-verdade com menos de $2^{n}$ linhas, ou linhas em ordem aleatória. Conte em binário de 000 a 111 para não perder nenhuma combinação.
    • Desenhar duas linhas saindo de uma única saída de uma porta por segurança, ou deixar um fio que termina em lugar nenhum. Desenhe exatamente as conexões que a expressão requer.
  • 4

    Fundamentos do Processador

    Assistir aula
    4.1

    Arquitetura Von Neumann

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão do modelo básico Von Neumann para um sistema computacional e do conceito de programa armazenado
    Demonstrar compreensão do propósito e papel dos registros, incluindo a diferença entre registros de uso geral e registros de uso especial Registros de uso especial incluem: • Contador de Programa (PC) • Registrador de Dados de Memória (MDR) • Registrador de Endereço de Memória (MAR) • O Acumulador (ACC) • Registrador Indexado (IX) • Registrador de Instrução Atual (CIR) • Registrador de Status
    Demonstrar compreensão do propósito e papéis da Unidade Aritmética e Lógica (ALU), Unidade de Controle (CU) e relógio do sistema, Armazenamento de Acesso Imediato (IAS)
    Demonstrar compreensão de como os dados são transferidos entre vários componentes do sistema computacional usando o ** barramento de endereços**, barramento de dados e barramento de controle
    Demonstrar compreensão de como fatores contribuem para o desempenho do sistema computacional Incluindo: • tipo de processador e número de cores • a largura do barramento • velocidade do clock • memória cache
    Compreender como diferentes portas fornecem conexão para dispositivos periféricos Incluindo conexão para: • Universal Serial Bus (USB) • High Definition Multimedia Interface (HDMI) • Video Graphics Array (VGA)
    Descrever as etapas do ciclo Fetch-Execute (F-E) Descrever e usar notação de 'register transfer' para descrever o ciclo F-E
    Demonstrar compreensão do propósito de interrupções Incluindo: • possíveis causas de interrupções • aplicações de interrupções • uso de uma Rotina de Serviço de Interrupção (ISR) • quando as interrupções são detectadas durante o ciclo fetch-execute • como as interrupções são tratadas

    Fonte: Programa Cambridge International

    O ciclo fetch-decode-execute

    A Arquitetura Von Neumann 冯·诺依曼体系结构 fundamenta quase todos os computadores de propósito geral:

    • uma única memória — a Immediate Access Store 立即存取存储器 (IAS) — armazena tanto instruções do programa quanto dados (o conceito de stored program 存储程序).
    • um processador 处理器 (CPU) busca instruções da memória e as executa uma de cada vez.
    • as instruções rodam em ordem a menos que uma branch altere o fluxo.

    A ideia de stored-program é o que torna um computador flexível: mude o programa e você muda o que ele faz, sem reconfigurar cabos.

    Explorar

    Toque nas partes de um computador Von Neumann

    Explore cada bloco. A CPU (unidade de controle, ALU, registradores) fala com uma única memória principal pelos barramentos — e esse único espaço de memória compartilhado para instruções E dados é a ideia de Von Neumann.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Immediate Access Store/ɪˈmiːdɪət ˈækses stɔː/ 立即存取存储器 lì jí cún qǔ cún chǔ qì
    stored program/stɔːd ˈprəʊɡræm/ 存储程序 cún chǔ chéng xù
    processor/ˈprəʊsesə/ 处理器 chǔ lǐ qì
    arithmetic and logic unit/ˌærɪθˈmetɪk ənd ˈlɒdʒɪk ˈjuːnɪt/ 算术逻辑单元 suàn shù luó jí dān yuán
    RAM/ræm/ 随机存取存储器 suí jī cún qǔ cún chǔ qì
    4.1

    Principais partes da CPU

    Todas essas partes estão dentro de um único chip pequeno. O diagrama mais adiante nesta seção mostra como elas se conectam; a foto abaixo mostra o real.

    A parte inferior de um chip de CPU Intel sobre um fundo branco, um quadrado plano coberto por uma grade de centenas de pequenos pads de contato dourados que pressionam contra o soquete da placa-mãe
    Uma CPU moderna: todo o processador é um único chip pequeno (aqui visto de baixo, mostrando os contatos)
    Um soquete de CPU quadrado em uma placa-mãe, com uma grade de pinos minúsculos e uma alavanca de retenção metálica, cercado por trilhas de circuito
    O soquete correspondente de CPU na placa-mãe: os contatos do chip pressionam sobre esses pinos

    Unidade Aritmética Lógica (ALU)

    A ALU 算术逻辑单元 realiza operações aritméticas (soma, subtração, ...) e lógicas (AND, OR, comparações). Ela pega operandos dos registros 寄存器 e coloca resultados de volta em um registro.

    Unidade de Controle (CU)

    A unidade de controle 控制单元 decodifica cada instrução e envia os sinais de controle para executá-la — abrindo caminhos de dados, dizendo à ALU o que fazer e controlando leituras e gravações na memória.

    Relógio do sistema

    O relógio envia uma corrente constante de pulsos que mantêm a CPU sincronizada. Cada instrução leva um número fixo de ciclos, e a clock speed 时钟频率 (ex. 3.8 GHz) é um fator no desempenho.

    "Explique como a CU e o relógio do sistema trabalham juntos": o relógio emite pulsos em uma frequência fixa; a unidade de controle usa cada pulso para avançar o ciclo fetch-execute em um passo, enviando seus sinais de controle sincronizados com os pulsos, assim toda parte do processador muda de estado junto. Um clock mais rápido significa mais passos por segundo, até o ponto em que os circuitos não conseguem se estabilizar entre os pulsos.

    Registros

    Registros são armazenamentos pequenos e muito rápidos dentro da CPU. Os registros de propósito especial 专用寄存器 têm cada um uma tarefa fixa no ciclo:

    • Program Counter 程序计数器 (PC) — o endereço da próxima instrução.
    • Memory Address Register 内存地址寄存器 (MAR) — o endereço sendo lido ou escrito.
    • Registro de Dados de Memória 内存数据寄存器 (MDR) — os dados que vão ou vêm da memória.
    • Current Instruction Register 当前指令寄存器 (CIR) — a instrução sendo decodificada.
    • Accumulator 累加器 (ACC) — o valor sobre o qual a ALU está trabalhando.
    • Status Register 状态寄存器 — armazena flags 标志 (carry, zero, negativo, overflow) usados por branches. Cada flag é um bit, definido ou limpo pela ALU após uma operação: a flag zero após uma comparação que correspondeu, a flag carry quando uma soma transbordou o registro, a flag negativa quando um resultado é negativo. Um jump condicional lê as flags para decidir se deve pular, e uma flag overflow pode disparar uma interrupção.
    • Index Register 变址寄存器 — um offset adicionado a um endereço em endereçamento indexado; incrementá-lo percorre um array um elemento por vez.

    A questão "complete a tabela descrevendo o papel de cada registro" quer uma frase precisa por registro nestes termos: o PC armazena o endereço da próxima instrução a ser buscada; o MAR armazena o endereço do local sendo lido ou escrito; o MDR armazena os dados ou instrução acabados de serem lidos desse local, ou prestes a serem gravados; o CIR armazena a instrução atualmente sendo decodificada e executada; o ACC armazena o resultado da última operação aritmética ou lógica.

    Os registros de propósito geral 通用寄存器 são usados pelo programador para valores temporários durante um cálculo. Movimentos de dados entre registros e memória são escritos em notação de register transfer 寄存器传送 — ex. MAR ← [PC] ("copie o conteúdo do PC para o MAR").

    Diagrama de blocos da CPU Von Neumann mostrando PC, MAR, MDR, CIR, ACC, registrador de status, unidade de controle, ALU e relógio do sistema, ligados à memória principal e entrada/saída pelos barramentos de endereço, dados e controle
    A CPU Von Neumann: registros, unidade de controle e ALU ligados por buses
    Vocabulário Treinar
    Inglês Chinês Pinyin
    Von Neumann architecture/vɒn ˈnɔɪmən ˈɑːkɪtektʃə/ 冯·诺依曼体系结构 féng · nuò yī màn tǐ xì jié gòu
    ALU/ˌeɪ el ˈjuː/ 算术逻辑单元 suàn shù luó jí dān yuán
    register/ˈredʒɪstə/ 寄存器 jì cún qì
    control unit/kənˈtrəʊl ˈjuːnɪt/ 控制单元 kòng zhì dān yuán
    clock speed/klɒk spiːd/ 时钟频率 shí zhōng pín lǜ
    Program Counter/ˈprəʊɡræm ˈkaʊntə/ 程序计数器 chéng xù jì shù qì
    Memory Address Register/ˈmeməri əˈdres ˈredʒɪstə/ 内存地址寄存器 nèi cún dì zhǐ jì cún qì
    Memory Data Register/ˈmeməri ˈdeɪtə ˈredʒɪstə/ 内存数据寄存器 nèi cún shù jù jì cún qì
    Current Instruction Register/ˈkʌrənt ɪnˈstrʌkʃn ˈredʒɪstə/ 当前指令寄存器 dāng qián zhǐ lìng jì cún qì
    accumulator/əˈkjuːmjʊleɪtə/ 累加器 lěi jiā qì
    Status Register/ˈsteɪtəs ˈredʒɪstə/ 状态寄存器 zhuàng tài jì cún qì
    flags/flæɡz/ 标志 biāo zhì
    Index Register/ˈɪndeks ˈredʒɪstə/ 变址寄存器 biàn zhǐ jì cún qì
    indexed addressing/ˈɪndekst əˈdresɪŋ/ 变址寻址 biàn zhǐ xún zhǐ
    general-purpose registers/ˈdʒenərəl ˈpɜːpəs ˈredʒɪstəz/ 通用寄存器 tōng yòng jì cún qì
    register transfer/ˈredʒɪstə ˈtrænsfɜː/ 寄存器传送 jì cún qì chuán sòng
    buses/ˈbʌsɪz/ 总线 zǒng xiàn
    4.1

    Barramentos

    Três buses internos 总线 (conjuntos de fios paralelos) conectam as partes:

    • address bus 地址总线 — transporta o endereço de memória. Unidirecional (CPU → memória).
    • data bus 数据总线 — transporta os dados. Bidirecional.
    • control bus 控制总线 — transporta sinais de controle (leitura, gravação, interrupção). Bidirecional.

    Um barramento de endereços de $n$ bits pode acessar $2^{n}$ locais de memória. A largura do barramento de dados determina quantos bits são transferidos por acesso (frequentemente o tamanho da palavra).

    CPU, memória e entrada/saída acessando cada um o barramento de endereços (unidirecional), o barramento de dados e o barramento de controle dentro do barramento do sistema
    Os três barramentos do sistema conectando a CPU, a memória e a entrada/saída
    Uma placa-mãe vista de cima: o soquete da CPU, os slots de memória e os slots de expansão unidos por trilhas impressas densas
    Uma placa-mãe: a CPU, a memória e a E/S estão todas em um único conjunto de barramentos — as trilhas impressas que correm entre elas
    Vocabulário Treinar
    Inglês Chinês Pinyin
    control bus/kənˈtrəʊl bʌs/ 控制总线 kòng zhì zǒng xiàn
    address bus/əˈdres bʌs/ 地址总线 dì zhǐ zǒng xiàn
    data bus/ˈdeɪtə bʌs/ 数据总线 shù jù zǒng xiàn
    4.1

    O que afeta o desempenho

    • clock speed — mais ciclos por segundo.
    • number of cores 核心 — uma CPU multi-core executa vários threads simultaneamente.
    • word size 字长 — uma CPU de 64 bits processa blocos de 64 bits por ciclo e pode acessar muito mais memória do que uma de 32 bits.
    • amount of RAM 随机存取存储器 — mais RAM armazena mais do conjunto ativo; pouca RAM força o SO a fazer pagememória 页 para o disco.
    • cache memory 高速缓存 size — mais cache reduz o tempo médio de acesso à memória.
    • secondary storage 辅助存储器 type — um SSD carrega programas muito mais rápido que um HDD.
    • bus width and speed — barramentos mais largos/rapidos movem dados mais rapidamente.

    Combine as especificações com a carga de trabalho: uma quad-core supera uma dual-core em trabalhos paralelos, mas maior velocidade por core vence em trabalho single-threaded.

    Cada fator é uma resposta de duas marcas com uma razão associada:

    • More cores: cada core pode buscar e executar sua própria instrução ao mesmo tempo, então vários programas, ou os threads de um programa, executam em paralelo. Mas um programa deve ser escrito para usar mais de um core, então duplicar os cores não duplica a velocidade.
    • Higher clock speed: mais ciclos de busca-execução por segundo, então mais instruções por segundo; o limite é o calor gerado.
    • Wider bus: um barramento de dados mais largo move mais bits em cada transferência, então menos transferências são necessárias para os mesmos dados; um barramento de endereços mais largo pode acessar mais locais de memória.
    • Cache memory: uma memória pequena e rápida dentro ou ao lado do processador que mantém as instruções e os dados usados mais recentemente ou com mais frequência. Lê-los do cache é muito mais rápido que da RAM, então o processador passa menos tempo esperando.

    "Explique por que o novo computador tem melhor desempenho" responde-se comparando as duas especificações linha por linha: maior clock speed executa mais instruções por segundo, mais cores executam mais tarefas ao mesmo tempo, mais cache significa menos acessos lentos à RAM, e mais RAM significa menos transferências para o disco.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    word size/wɜːd saɪz/ 字长 zì cháng
    number of cores/ˈnʌmbə ɒv kɔːz/ 核心 hé xīn
    cores/kɔːz/ 核心 hé xīn
    amount of RAM/əˈmaʊnt ɒv ræm/ 随机存取存储器 suí jī cún qǔ cún chǔ qì
    page/peɪdʒ/ 页 yè
    cache memory/kæʃ ˈmeməri/ 高速缓存 gāo sù huǎn cún
    cache/kæʃ/ 高速缓存 gāo sù huǎn cún
    secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ 辅助存储器 fǔ zhù cún chǔ qì
    4.1

    Portas

    Uma port 端口 é um conector físico para conectar um peripheral 外围设备:

    • USB (Universal Serial Bus) — uso geral (teclados, drives, telefones).
    • HDMI (High Definition Multimedia Interface) — vídeo digital e áudio para uma tela.
    • VGA (Video Graphics Array) — saída de vídeo analógica antiga para um monitor.
    • Ethernet (RJ-45) — LAN cablada. Jacks de áudio — fones de ouvido/microfone.

    Portas diferentes usam sinais diferentes, então um cabo HDMI não se encaixa em uma porta USB. O USB-C é incomum por transportar vídeo, dados e energia.

    "Explique como o computador se conecta ao monitor através do HDMI": a porta HDMI envia o vídeo e o áudio como um único sinal digital por um único cabo, então nenhuma conversão para analógico é necessária e a imagem não é degradada; o cabo suporta resoluções de alta definição e a própria porta do monitor decodifica o sinal. Um dispositivo USB é plug-and-play: quando conectado, o computador o detecta, identifica-o, carrega ou instala o driver necessário, e pode fornecer energia, tudo sem reinicialização.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    port/pɔːt/ 端口 duān kǒu
    peripheral/pəˈrɪfərəl/ 外围设备 wài wéi shè bèi
    4.1

    Ciclo Fetch-Execute

    A CPU repete o fetch-execute cycle 取指-执行周期, uma execução por instrução de máquina.

    Fetch

    1. o endereço do PC é copiado para o MAR.
    2. o PC é incrementado para apontar para a próxima instrução.
    3. um sinal de read vai pelo barramento de controle.
    4. a memória coloca a instrução no barramento de dados.
    5. ela é copiada para o MDR, depois para o CIR.

    O exame pede esses passos em register transfer notation 寄存器传送记法, onde [X] significa o conteúdo do registro X e [[MAR]] significa o conteúdo do local de memória cujo endereço está no MAR:

    MAR ← [PC]          the address of the next instruction goes to the MAR
    PC  ← [PC] + 1      the PC now points to the following instruction
    MDR ← [[MAR]]       the instruction at that address is read into the MDR
    CIR ← [MDR]         the instruction is copied into the CIR for decoding
    

    A ordem importa: o PC é incrementado imediatamente após seu endereço ser copiado, para que um jump executado posteriormente ainda possa sobrescrevê-lo. Durante a execução, a mesma notação descreve cada instrução; para LDD 200, por exemplo, MAR ← 200, MDR ← [[MAR]], ACC ← [MDR].

    As transferências de registro na ordem de busca: 1 o endereço do PC vai para o MAR; 2 o MAR envia o endereço para a memória; 3 a instrução retorna para o MDR; 4 o MDR copia para o CIR; enquanto isso o PC é incrementado *As transferências de registro em uma busca: PC → MAR → memory → MDR → CIR, com o PC incrementado

    Decode

    A CU decodifica a instrução no CIR — qual operação e quais operandos ou endereços.

    Execute

    A CU a executa: aritmética/lógica vai para a ALU (resultado para o ACC); load/store move dados entre memória e um registro; um branch altera o PC. Então o ciclo se repete.

    Fluxograma do ciclo fetch-execute desde START: a etapa de busca (PC para MAR, increment PC, sinal read, memory para data bus para MDR para CIR), a etapa de decode, a etapa de execute, então uma verificação de interrupções que volta para START *O ciclo fetch-execute, com verificação de interrupções a cada vez

    Explorar

    O ciclo fetch-execute

    Toque ao redor do loop que a CPU repete bilhões de vezes por segundo. Observe como o fetch usa os registradores PC/MAR/MDR/CIR, depois decode e execute agem sobre o que foi buscado.

    Explorar

    O ciclo busca-executa

    Passe por como a CPU executa uma instrução — busque da memória, decodifique, então execute, repetidamente.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    fetch-execute cycle/fetʃ ˈeksɪkjuːt ˈsaɪkl/ 取指-执行周期 qǔ zhǐ - zhí xíng zhōu qī
    special purpose registers/ˈspeʃl ˈpɜːpəs ˈredʒɪstəz/ 专用寄存器 zhuān yòng jì cún qì
    register transfer notation/ˈredʒɪstə ˈtrænsfɜː nəʊˈteɪʃn/ 寄存器传送记法 jì cún qì chuán sòng jì fǎ
    4.1

    Interrupts

    Um interrupt 中断 é um sinal que pauses o ciclo normal para que a CPU possa lidar com um evento urgente (uma tecla pressionada, um pacote chegando, uma falha de hardware, divisão por zero, o timer do SO).

    Lidando com um:

    1. termine a instrução atual.
    2. save the state (PC e registros).
    3. carregue o endereço da interrupt service routine 中断服务程序 (ISR) no PC e execute-a.
    4. a ISR lida com o evento.
    5. restore o estado salvo e continue.

    Interrupts permitem que o sistema responda prontamente sem a CPU verificar constantemente dispositivos, e são como o SO faz multitarefa.

    "Explique como uma interrupção de um dispositivo de entrada é detectada e manuseada no ciclo F-E" é uma resposta de quatro marcas com estes pontos: o dispositivo envia um sinal de interrupção que define a flag de interrupção no interrupt register 中断寄存器; o processador verifica esse registro no end of every fetch-execute cycle, após a execução da instrução atual terminar; se uma flag estiver definida e a interrupção tiver prioridade maior que a tarefa atual, o conteúdo do PC e dos outros registros é salvo no pilha 栈; o endereço da rotina de serviço de interrupção é carregado no PC e a rotina é executada; quando termina, os valores salvos são restaurados do stack e o programa interrompido continua de onde parou.

    Causas dignas de menção: uma interrupção de hardware de um dispositivo (uma tecla pressionada, um buffer de impressora vazio, um pacote de rede chegando), uma interrupção de software de uma falha (divisão por zero, uma instrução ilegal, overflow aritmético), uma interrupção de timer do sistema operacional marcando o fim de uma fatia de tempo, e um aviso de falha de energia.

    Fluxograma de manuseio de interrupção: o programa em execução é interrompido, a CPU termina a instrução atual, salva seu estado (PC e registros) no stack, executa a rotina de serviço de interrupção, restaura o estado e retoma *Como uma interrupção se encaixa no ciclo fetch-execute

    Vocabulário Treinar
    Inglês Chinês Pinyin
    interrupt/ˈɪntərʌpt/ 中断 zhōng duàn
    interrupt service routine/ˈɪntərʌpt ˈsɜːvɪs ruːˈtiːn/ 中断服务程序 zhōng duàn fú wù chéng xù
    interrupt register/ˈɪntərʌpt ˈredʒɪstə/ 中断寄存器 zhōng duàn jì cún qì
    stack/stæk/ 栈 zhàn
    4.2

    Assembly language and machine code

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da relação entre linguagem assembly e código máquina
    Descrever as diferentes etapas do processo de ensamblagem para um ensamblador de duas passagens Aplicar o processo de ensamblador de duas passagens a um programa simples dado em linguagem assembly
    Rastrear um programa simples dado em linguagem assembly
    Demonstrar compreensão de que um conjunto de instruções são agrupadas Incluindo os seguintes grupos: • Movimentação de dados • Entrada e saída de dados • Operações aritméticas • Instruções incondicionais e condicionais • Instruções de comparação
    Demonstrar compreensão e ser capaz de usar diferentes modos de endereçamento Incluindo imediato, direto, indireto, indexado, relativo

    Fonte: Programa Cambridge International

    A CPU realmente executa machine code 机器码 — padrões de bits, específicos para uma arquitetura. Assembly language 汇编语言 é uma forma legível, com uma instrução por instrução de máquina, escrita usando mnemonics 助记符 como LDD, ADD, JMP. Um assembler 汇编器 traduz para machine code.

    Um ensambledor traduz mnemônicos assembleiros em padrões de bits de código de máquina *Um assembler transforma mnemonics em padrões de bits de machine code

    Two-pass assembler

    Um assembler de duas passadas lê a fonte duas vezes:

    • pass 1 constrói uma symbol table 符号表: sempre que um label 标签 (como LOOP:) aparece, registre seu endereço; nenhum código ainda.
    • pass 2 gera código: traduza cada instrução, e quando uma se refere a um label (como JMP LOOP), procure seu endereço na symbol table.

    Duas passadas lidam com forward references 前向引用 (um jump para um label definido depois).

    Worked example. Aplique o processo de duas passadas a este programa, cuja primeira instrução está no endereço 100.

            LDD  COUNT
    LOOP:   DEC  ACC
            CMP  #0
            JPN  LOOP
            END
    COUNT:  5
    

    Pass 1 lê cada linha, conta o endereço que ocupará e registra todos os labels na symbol table: LOOP = 101 (a linha DEC) e COUNT = 105 (a linha de dados). Nenhum código é produzido. Pass 2 lê o programa novamente e traduz cada linha em machine code, substituindo cada mnemonic por seu opcode 操作码 e cada endereço simbólico pelo número da symbol table: LDD COUNT torna-se o opcode para LDD com operand 操作数 105, e JPN LOOP torna-se o opcode para JPN com operand 101. O jump back para LOOP poderia ter sido resolvido em uma passada, mas um jump forward para um label ainda não visto não poderia, que é por que o assembler faz duas.

    Example instruction set

    Cambridge usa um pequeno conjunto genérico, impresso na tabela de referência do exame, com um registro de propósito geral, o acumulador (ACC), e um registro índice (IX). Um operand escrito #n é um número decimal, Bn um binário e &n um hexadecimal; <address> é um número de localização ou um label.

    Grupo Instrução O que faz
    Movimento de dados LDM #n carrega o número n no ACC (imediato)
    LDD <address> carrega o conteúdo do endereço no ACC (direto)
    LDI <address> o endereço contém outro endereço; carrega o conteúdo deste último no ACC (indireto)
    LDX <address> adicione IX ao endereço e carregue o conteúdo do resultado em ACC (indexado)
    LDR #n carregue o número n em IX
    MOV <register> copie ACC para o registro nomeado (IX)
    STO <address> armazene o conteúdo de ACC no endereço
    Entrada e saída IN leia uma tecla pressionada e coloque seu código ASCII em ACC
    OUT exiba o caractere cujo código ASCII está em ACC
    Aritmética ADD <address> / ADD #n adicione o conteúdo do endereço, ou o número, a ACC
    SUB <address> / SUB #n subtraia de ACC
    INC <register> / DEC <register> adicione 1 ou subtraia 1 de ACC ou IX
    Comparação CMP <address> / CMP #n compare ACC com o conteúdo do endereço, ou com n, e defina a flag
    CMI <address> compare ACC com o conteúdo do endereço retido no endereço (indireto)
    Salto JMP <address> salte para o endereço incondicionalmente
    JPE <address> / JPN <address> salte se a última comparação foi igual / não igual
    Manipulação de bits AND, OR, XOR com #n, Bn, &n ou <address> operação bit a bit em ACC
    LSL #n / LSR #n desloque ACC logicamente n posições para a esquerda ou direita
    END termine o programa

    A questão "as instruções da linguagem assembly são agrupadas" pede os nomes dos grupos e uma instrução de cada: movimento de dados, entrada e saída, aritmética, saltos incondicionais e condicionais, comparação e manipulação de bits.

    Explorar

    Como funciona um ensamblificador de duas passadas

    Passe passo a passo. O ensamblificador lê seu código duas vezes: a passada 1 apenas encontra onde cada label está, para que a passada 2 possa preencher os endereços — é assim que um jump para uma label definida depois ainda funciona.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    operand/ˈɒpərænd/ 操作数 cāo zuò shù
    assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ 汇编语言 huì biān yǔ yán
    machine code/məˈʃiːn kəʊd/ 机器码 jī qì mǎ
    mnemonics/nɪˈmɒnɪks/ 助记符 zhù jì fú
    assembler/əˈsemblə/ 汇编器 huì biān qì
    symbol table/ˈsɪmbl ˈteɪbl/ 符号表 fú hào biǎo
    label/ˈleɪbl/ 标签 biāo qiān
    forward references/ˈfɔːwəd ˈrefrənsɪz/ 前向引用 qián xiàng yǐn yòng
    opcode/ˈɒpkəʊd/ 操作码 cāo zuò mǎ
    4.2

    Modos de endereçamento

    O modo de endereçamento 寻址方式 (the modes of addressing) diz como a CPU encontra o operando:

    • endereçamento imediato 立即寻址 — o operando é o valor na instrução. LDM #10 carrega 10.
    • endereçamento direto 直接寻址 — a instrução contém um endereço; o operando é o valor lá. LDD 200.
    • endereçamento indireto 间接寻址 — a instrução contém um endereço que contém outro endereço, que é o dado. LDI 200.
    • endereçamento indexado 变址寻址 — endereço efetivo é address + index register; usado para arrays. LDX 100 com IR = 5 lê endereço 105.

    (Endereçamento relativo 相对寻址 dá o endereço como um offset do PC — usado para saltos.)

    Quatro modos de endereçando alcançando seu operando. Imediato: LDM #10 dá 10 diretamente. Direto: LDD 200 lê local de memória 200 (=42). Indireto: LDI 200 lê local 200 (=250) depois local 250 (=99). Indexado: LDX 100 com registro índice 5 lê local 105 (=7)
    Como cada modo de endereçamento alcança seu operando — imediato, direto, indireto e indexado

    Exemplo resolvido. Memória contém: local 200 = 250, local 250 = 99, local 105 = 7. O registro índice contém 5. O que está no acumulador após cada um de LDM #200, LDD 200, LDI 200 e LDX 100? Siga até onde cada modo precisa olhar. LDM #200 é imediato - o operando é o número escrito na instrução, então o acumulador contém 200. LDD 200 é direto - vá ao local 200 e pegue o que está lá: 250. LDI 200 é indireto - local 200 contém 250, que é outro endereço, então vá para local 250: 99. LDX 100 é indexado - some o registro índice ao endereço, $100 + 5 = 105$, e leia local 105: 7. Conte as etapas para mantê-los distintos: imediato 0, direto 1, indireto 2, indexado 1 (uma vez que o índice foi adicionado).

    Vocabulário Treinar
    Inglês Chinês Pinyin
    addressing mode/əˈdresɪŋ məʊd/ 寻址方式 xún zhǐ fāng shì
    immediate addressing/ɪˈmiːdɪət əˈdresɪŋ/ 立即寻址 lì jí xún zhǐ
    direct addressing/daɪˈrekt əˈdresɪŋ/ 直接寻址 zhí jiē xún zhǐ
    indirect addressing/ɪndaɪˈrekt əˈdresɪŋ/ 间接寻址 jiàn jiē xún zhǐ
    relative addressing/ˈrelətɪv əˈdresɪŋ/ 相对寻址 xiāng duì xún zhǐ
    logical shift/ˈlɒdʒɪkl ʃɪft/ 逻辑移位 luó jí yí wèi
    cyclic shift/ˈsaɪklɪk ʃɪft/ 循环移位 xún huán yí wèi
    4.2

    Rastreamento de um programa assembly

    Para rastrear ele: faça uma tabela com colunas para PC, ACC, registro índice, cada variável e quaisquer flags. Passe pelas instruções, atualizando a tabela após cada uma; siga os ramos quando mudarem o PC; pare em END. Um padrão comum é um loop sobre um array usando endereçamento indexado.

    Exemplo resolvido. Rastreie este programa. Endereço 200 contém 5 e endereço 201 contém 0.

    100   LDD  200
    101   CMP  #0
    102   JPE  108
    103   OUT
    104   DEC  ACC
    105   STO  200
    106   LDD  201
    107   JMP  100
    108   END
    

    Escreva uma linha para cada instrução executada, preenchendo apenas as colunas que mudam:

    Instrução ACC 200 201 Saída
    início 5 0
    LDD 200 5
    CMP #0
    JPE 108 não taken
    OUT caractere com código 5
    DEC ACC 4
    STO 200 4
    LDD 201 0
    JMP 100
    LDD 200 4

    e assim por diante, até LDD 200 carregar 0, a comparação definir a flag igual, JPE 108 ser taken e o programa terminar. Três coisas que o examinador verifica: um CMP não muda nenhum registro, apenas uma flag; um salto não taken ainda conta como executado; e OUT sai um caractere, então vai na coluna de saída, não na coluna ACC. "Diga o efeito de mudar LDD 10 para LDM #10": o ACC conteria o número 10 em vez do conteúdo do endereço 10.

    4.3

    Deslocamentos binários

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão e realizar deslocamentos binários Lógico, aritmético e cíclico Deslocamento para a esquerda, deslocamento para a direita
    Demonstrar compreensão de como a manipulação de bits pode ser usada para monitorar/controlar um dispositivo Realizar operações de manipulação de bits Testar e definir um bit (usando máscara de bits)
    Etiqueta de Instrução | Opcode | Operando Explicação
    AND #n / Bn / &n Operação AND bitwise do conteúdo do ACC com o operando
    AND
    Operação AND bitwise do conteúdo do ACC com o conteúdo de
    XOR #n / Bn / &n Operação XOR bitwise do conteúdo do ACC com o operando
    XOR
    Operação XOR bitwise do conteúdo do ACC com o conteúdo de
    OR #n / Bn / &n Operação OR bitwise do conteúdo do ACC com o operando
    OR
    Operação OR bitwise do conteúdo do ACC com o conteúdo de
    LSL #n Bits no ACC são deslocados logicamente n posições para a esquerda. Zeros são introduzidos na extremidade direita
    LSR #n Bits no ACC são deslocados logicamente n posições para a direita. Zeros são introduzidos na extremidade esquerda
    Rótulo de uma instrução
    Fornece um endereço simbólico
    Todas as questões assumirão que há apenas um registrador de uso geral disponível (Acumulador) ACC denota Acumulador IX denota Registrador Indexado
    pode ser um endereço absoluto ou simbólico # denota um número decimal, ex. #123 B denota um número binário, ex. B01001010 & denota um número hexadecimal, ex. &4A

    Fonte: Programa Cambridge International

    Um deslocamento lógico 逻辑移位 move todos os bits para a esquerda ou direita por algumas posições, preenchendo novas posições com 0.

    • deslocamento à esquerda por 1 (LSL #1) — bits movem-se para a esquerda, um 0 entra pela direita; para um número sem sinal isso é × 2.
    • deslocamento à direita por 1 (LSR #1) — bits movem-se para a direita, um 0 entra pela esquerda; para um número sem sinal isso é integer ÷ 2.

    Deslocar por $n$ posições multiplica ou divide por $2^{n}$. Exemplo: 00001011 (11) LSL #1 → 00010110 (22).

    Bits deslocados fora da extremidade são perdidos, então a multiplicação só está correta enquanto eles eram zeros. LSL #2 no inteiro two's complement 11001010 dá 00101000: os dois 1s que caíram da esquerda foram embora, o bit de sinal mudou, e o resultado já não é mais quatro vezes o original.

    Um deslocamento aritmético à direita mantém o bit de sinal para que um número negativo com sinal continue negativo. Um deslocamento cíclico 循环移位 (rotate) devolve o bit que cai numa extremidade de volta na outra, então nenhum bit é perdido.

    "Mostre o resultado de um deslocamento aritmético à direita de 3 posições em 10011110": copie o bit de sinal em cada lugar vazio, 11110011. O mesmo deslocamento em 01011100 dá 00001011. Um deslocamento cíclico à esquerda de 1 em 10000110 dá 00001101: o 1 inicial reaparece à direita.

    Três deslocamentos de 8 bits: LSL #1 transforma 00001011 em 00010110 (vezes 2, um 0 entra pela direita); LSR #1 transforma em 00000101 (divisão inteira por 2, um 0 entra pela esquerda); ASR #1 transforma 10110100 em 11011010, copiando o bit de sinal
    Deslocamento lógico à esquerda ($\times 2$), lógico à direita ($\div 2$) e aritmético à direita (mantém o bit de sinal)

    A diferença entre os dois deslocamentos à direita é um único bit. Pegue 11110000, que é 240 lido como sem sinal e $-16$ lido como com sinal. LSR #1 traz um 0 e dá 01111000 $= 120$, que é a metade correta de 240. ASR #1 copia o bit de sinal e dá 11111000 $= -8$, que é a metade correta de $-16$. Nenhum está errado — cada um reduz pelo metade sob uma leitura.

    O byte 11110000 deslocado à direita duas vezes: LSR traz um 0 pela esquerda dando 01111000 que é 120, enquanto ASR copia o bit de sinal dando 11111000 que é menos 8; os dois resultados diferem apenas no bit que entrou
    Deslocamento lógico e aritmético à direita no mesmo byte: apenas o bit que entra pela esquerda difere

    Manipulação de bits para monitoramento/controle

    Dispositivos embutidos muitas vezes usam um bit 位 de um registro por sinal (ex. bit $n$ = LED $n$). Usando uma máscara 掩码 — máscara de bits — você pode:

    • definir bit $n$: R = R OR uma máscara com bit $n$ definido.
    • limpar bit $n$: R = R AND uma máscara com bit $n$ limpo e o resto definido.
    • alternar bit $n$: R = R XOR uma máscara com bit $n$ definido.
    • testar bit $n$: R AND a máscara, depois verifique se o resultado é diferente de zero.
    Máscara de bits no byte 01001000: defina bit 2 com OR 00000100 para obter 01001100; limpe bit 6 com AND 10111111 para obter 00001000; alterne bit 3 com XOR 00001000 para obter 01000000
    Defina um bit com OR, limpe-o com AND, alterne-o com XOR — cada um usando uma máscara

    Manipulação de bits é rápida, usa pouca memória e permite que um byte contenha até 8 estados liga/desliga.

    No conjunto de instruções do exame estes são AND, OR e XOR com uma máscara escrita como operando decimal, binário ou hexadecimal. Com o ACC contendo 10101100:

    Instrução Máscara Resultado em ACC Efeito
    AND B00001111 00001111 00001100 mantém apenas os quatro bits inferiores (limpa os outros)
    OR #1 00000001 10101101 define o bit menos significativo, deixando o resto inalterado
    XOR &FF 11111111 01010011 inverte todos os bits
    AND B00001000 então CMP #0 00001000 00001000 testa bit 3: a comparação não é igual, então o bit 3 estava definido
    LSL #2 10110000 desloca à esquerda duas posições, perdendo os dois bits superiores
    LSR #3 00010101 desloca à direita três posições, zeros entrando pela esquerda

    "Escreva a instrução que define o bit menos significativo em 1 e deixa os outros inalterados": OR #1, ou OR B00000001. Para limpar um bit use AND com uma máscara que tenha um 0 nesse lugar e 1s nos outros; para testar um bit, AND com uma máscara que tenha um 1 apenas nesse lugar, depois compare o resultado com zero. Em um dispositivo de monitoramento, um bit de um registro por sensor permite que um único AND verifique se um sensor específico está ligado, e um OR ativa o bit de controle de um atuador sem perturbar os outros.

    Explorar

    Desloque e mascare os bits de um byte

    Escolha um operador e veja cada bit resultante. Um deslocamento à esquerda (<<) moves every bit up one place (×2); a right shift (>>) move-os para baixo (÷2); AND com uma máscara limpa os bits que você não quer.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    bit/bɪt/ 位 wèi
    mask/mæsk/ 掩码 yǎn mǎ
    4.3

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    conceito de programa armazenado as instruções do programa e os dados estão ambos armazenados na memória principal, e as instruções são buscadas e executadas uma de cada vez
    registro um local de armazenamento pequeno e muito rápido dentro do processador com um propósito específico
    Contador de Programa o registro que contém o endereço da próxima instrução a ser buscada
    Registro de Endereço de Memória o registro que contém o endereço do local de memória sendo lido ou gravado
    Registro de Dados de Memória o registro que contém o dado ou instrução acabou de ser lido de, ou prestes a ser gravado em, memória
    Registro de Instrução Atual o registro que contém a instrução atualmente sendo decodificada e executada
    Acumulador o registro de uso geral que contém o resultado da última operação aritmética ou lógica
    memória cache memória pequena e rápida próxima ao processador que contém instruções e dados frequentemente usados
    interrupção um sinal de um dispositivo ou programa que faz o processador pausar a tarefa atual e executar uma rotina de serviço de interrupção
    linguagem assembly uma linguagem de baixo nível em que cada instrução mnemônica corresponde a uma instrução de código de máquina
    endereçamento imediato o operando é o valor escrito na instrução
    endereçamento direto o operando é o conteúdo do endereço escrito na instrução
    endereçamento indireto o endereço na instrução contém o endereço do operando
    endereçamento indexado o endereço do operando é o endereço na instrução mais o conteúdo do registro índice
    endereçamento relativo o endereço do operando é dado como um offset em relação ao endereço da instrução atual
    deslocamento lógico cada bit se move para o número de posições especificado e zeros preenchem os lugares vazios
    4.3

    Dicas de prova

    • Aprenda o ciclo busca-execução em termos de transferência entre registros (PC, MAR, MDR, CIR, ACC) e o que incrementa o PC.
    • Nomeie a função de cada registro; o ** barramento de endereços é unidirecional**, o barramento de dados é bidirecional.
    • Diferencie os modos de endereçamento (imediato, direto, indireto, indexado) — uma questão frequente.
    • Explique como a velocidade do clock, número de núcleos, tamanho do cache e comprimento da palavra afetam o desempenho.
    • Para um deslocamento binário, declare se é lógico ou aritmético; um deslocamento à esquerda multiplica por 2, um deslocamento à direita divide por 2.

    Erros comuns

    • Dizer que o PC armazena a instrução atual, ou que o MDR armazena um endereço. O PC armazena o endereço da próxima instrução; o MDR armazena dados ou uma instrução, nunca um endereço.
    • Deixar fora o incremento do PC da busca, ou colocá-lo após a execução. Ele ocorre assim que o endereço é copiado para o MAR.
    • Ler LDD 10 como "carregar 10". LDD 10 carrega o conteúdo do endereço 10; LDM #10 carrega o número 10.
    • Colocar um valor na coluna ACC para CMP ou OUT. Uma comparação define apenas uma flag; uma saída vai para a coluna de saída.
    • Dizer que uma interrupção é tratada "imediatamente". O processador termina a instrução atual e verifica interrupções no final do ciclo.
    • Usar um deslocamento lógico à direita em um número negativo em complemento de dois. Apenas um deslocamento aritmético mantém o bit de sinal.
  • 5

    Software de Sistema

    Assistir aula
    5.1

    Sistemas Operacionais

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Explicar por que um sistema computacional requer um Sistema Operacional (SO)
    Explique as principais tarefas de gestão realizadas pelo Sistema Operacional Incluindo gestão de memória, gestão de ficheiros, gestão de segurança, gestão de hardware (entrada/saída/periféricos), gestão de processos
    Demonstre compreensão da necessidade de software de utilidade típico fornecido com um Sistema Operacional Incluindo formatador de disco, verificador de vírus, software de desfragmentação, análise de conteúdos de disco / software de reparação de disco, compressão de ficheiros, software de cópia de segurança
    Demonstre compreensão de bibliotecas de programas Incluindo: • o software em desenvolvimento é frequentemente construído utilizando código existente de bibliotecas de programas • os benefícios para o desenvolvedor do software construído utilizando ficheiros de biblioteca, incluindo ficheiros Dynamic Link Library (DLL)

    Fonte: Programa Cambridge International

    Por que um computador precisa de um SO

    Hardware sozinho pode apenas buscar e executar instruções — não sabe nada sobre arquivos, programas, redes ou usuários. O sistema operacional 操作系统 (OS) é a camada de software que:

    • gerencia o hardware (processador 处理器, memória, E/S, armazenamento) para os programas em execução.
    • fornece serviços (sistema de arquivos, rede, contas de usuário) através de uma interface clara, para que programas não precisem falar diretamente com o hardware.
    • fornece uma interface para o usuário (linha de comando, GUI, toque).
    • permite que vários programas compartilhem o hardware com segurança — cada um obtém tempo justo de CPU e é mantido fora da memória dos outros.

    Sem um SO, cada programa precisaria de seus próprios drivers, e apenas um programa poderia rodar com segurança por vez.

    "Descreva o propósito de um SO — lista de cinco pontos." O OS (1) fornece uma interface entre o usuário e o hardware; (2) oculta a complexidade do hardware do usuário e dos programas de aplicação; (3) gerencia os recursos de hardware — tempo de processador, memória, armazenamento e dispositivos de entrada/saída — e os compartilha entre programas; (4) carrega software de aplicação na memória e o executa, dando a todo programa a mesma plataforma para rodar; (5) permite que vários programas rodam ao mesmo tempo (multitarefa 多任务处理) enquanto os mantém, bem como os dados dos usuários, seguros. Dê cinco pontos diferentes; "ele roda o computador" ou "ele gerencia recursos" isoladamente não vale nada.

    Um sistema operacional desktop na tela
    Um sistema operacional desktop gerencia a tela, arquivos e programas para o usuário
    Um smartphone segurado em uma mão, mostrando a tela inicial do Android com seus ícones de aplicativos
    Um telefone precisa de um tão quanto: este é um sistema operacional mobile, Android

    Tarefas principais de gerenciamento

    O programa de estudos nomeia cinco. Cada ponto abaixo é uma coisa que o SO realmente faz, o que uma questão "descreva" quer.

    • gestão de memória 内存管理 — aloca memória para cada programa quando ele é carregado, mantém a memória de cada programa separada (proteção de memória 内存保护) para que um não sobrescreva outro, libera a memória quando um programa termina, e troca páginas entre RAM 随机存取存储器 e armazenamento secundário 辅助存储器 (o disco) (memória virtual 虚拟内存 / paginação 分页) para que mais programas possam estar abertos do que a memória física permite.
    • gestão de processos 进程管理 — um programa em execução é um processo 进程. O SO cria e encerra processos, decide qual processo obterá a CPU a seguir (escalonamento 调度) e por quanto tempo (uma fatia de tempo 时间片), alterna entre eles, resolve conflitos quando dois querem o mesmo recurso, e pode matar um que parar de responder.
    • gestão de hardware (entrada/saída e periféricos) — conversa com cada dispositivo através de seu driver de dispositivo 设备驱动, enfileira e bufferiza dados indo para dispositivos lentos como uma impressora, responde a interrupções 中断 de dispositivos, e compartilha um dispositivo entre vários programas.
    • gestão de arquivos — cria, nomeia, copia, move e exclui arquivos e pastas, mantém a estrutura de diretório 目录 e um registro de onde cada arquivo está armazenado no disco, aloca espaço de disco para arquivos, e impõe direitos de acesso 访问权限 (leitura / gravação / execução) para cada usuário.
    • gestão de segurança — contas de usuário e senhas (autenticação 身份验证), direitos de acesso, criptografia de dados armazenados, firewall, atualizações de segurança automáticas, e um log de quem fez o quê.
    Diagrama de hub com o sistema operacional no centro ligado por raios à gestão de memória, processo, arquivo, dispositivo e segurança e à interface do usuário
    As principais tarefas que o sistema operacional gerencia
    Um mapa de memória com o sistema operacional e três aplicativos cada em seu próprio bloco, separados por endereços de fronteira; um acesso dentro de um bloco é permitido mas um acesso que ultrapassa uma fronteira é bloqueado
    A proteção de memória mantém cada aplicativo em seu próprio bloco de memória

    Como a gestão de memória e de processos suporta multitarefa (um favorito de quatro pontos). A gestão de memória carrega vários programas na memória ao mesmo tempo, cada um em sua própria área protegida, e acompanha quais endereços pertencem a quais; a gestão de processos compartilha o processador entre eles — cada processo roda por uma fatia de tempo, o SO salva seu estado e alterna para o próximo, e a alternância é tão rápida que todos os programas parecem rodar juntos. Interrupções permitem que o SO retome o processador de um processo sempre que um dispositivo precisar de atenção.

    Interrupções. Uma interrupção de hardware 硬件中断 vem de um dispositivo: uma tecla pressionada, um clique do mouse, uma impressora sem papel, um disco terminando uma transferência, uma falha de energia. Uma interrupção de software 软件中断 vem de um programa: divisão por zero, uma instrução inválida, uma tentativa de usar memória que não pertence, ou uma solicitação de serviço do SO. O manipulador de interrupções 中断处理程序 do SO salva o estado do processo em execução, lida com a interrupção e depois restaura o processo (o tópico 4 cobre o detalhe busca–execução).

    Software utilitário

    Programas utilitários 实用程序 são software de sistema que mantêm, reparam ou otimizam o computador em vez de fazer a tarefa do usuário; o examinador aceita "realiza uma tarefa específica de manutenção que melhora o desempenho ou a segurança". A maioria dos SOs embute estes:

    Programas utilitários comuns: antivírus, backup, compressão de arquivos e desfragmentação de disco
    Programas utilitários: antivírus, backup, compressão e desfragmentação
    • formatador de disco — prepara um disco novo (ou apaga um antigo) para uso: configura seu sistema de arquivos e partições, apagando quaisquer dados existentes.
    • verificador de vírus (antivírus 杀毒软件) — varre arquivos e memória, compara código contra um banco de dados de assinaturas 签名 de vírus conhecidos e vigia comportamentos suspeitos, então isola ou exclui o que encontrar; roda em um cronograma e em cada download, e precisa ser atualizado conforme novos vírus aparecem.
    • software de desfragmentação (desfragmentador de disco 碎片整理) — um disco rígido armazena um arquivo em quaisquer blocos livres que encontre, então após muitas salvamentos e exclusões um arquivo fica espalhado (fragmentado 碎片化) pelos pratos e a cabeça de leitura/escrita deve pular entre as peças. O desfragmentador move as peças de cada arquivo lado a lado e junta o espaço livre em uma única região, para que arquivos carreguem mais rápido e novos arquivos não fiquem fragmentados. Não necessário em um SSD, que não tem cabeça móvel.
    • análise de conteúdo do disco / software de reparo de disco — mostra o que está usando o espaço do disco (arquivos grandes, duplicados ou temporários) para que possam ser removidos; encontra e repara setores defeituosos, clusters perdidos e erros de sistema de arquivos.
    • compressão de arquivos (compressão 压缩) — encolhe arquivos para que ocupem menos armazenamento e transfiram mais rápido; arquivagem agrupa muitos arquivos em um.
    • software de backup (backup 备份) — copia arquivos para outro meio (disco externo, rede, nuvem) em um cronograma para que os dados possam ser restaurados após perda, corrupção ou ataque de ransomware; uma cópia completa é seguida por backups incrementais 增量备份 de apenas o que mudou.
    • um firewall 防火墙 (filtra tráfego de rede por regras) e ferramentas de criptografia, para segurança; um monitor do sistema e atualizações automáticas.

    Embutir estes com o SO economiza ao usuário a instalação de cada um.

    Qual utilitário faz o quê. Desempenho: desfragmentação (acesso a arquivos mais rápido), reparo de disco (um disco com erros é lento ou falha), análise de conteúdo do disco (espaço livre ao excluir lixo), compressão (mais cabe no disco). Segurança: verificador de vírus, firewall, criptografia e backup (a única recuperação de ransomware). Uma questão "trace uma linha" associa cada utilitário a exatamente um propósito — aprenda os pares acima e use os nomes do programa de estudos.

    Exemplo resolvido. Explique como a desfragmentação pode melhorar o desempenho de um computador (3 pontos).

    Com o tempo um arquivo é armazenado em blocos espalhados pelo disco rígido, então lê-lo precisa de muitos movimentos da cabeça de leitura/escrita. O desfragmentador rearranja os blocos para que cada arquivo seja armazenado contigüemente e o espaço livre esteja junto. Arquivos são então lidos com menos movimentos de cabeça, então carregam mais rápido, e novos arquivos podem ser escritos em um espaço contínuo.

    Explorar

    Onde o sistema operacional se situa

    Toque em cada camada. O SO é a camada do meio — ele fica entre seus aplicativos e o hardware, compartilhando a máquina seguramente para que programas nunca toquem o hardware diretamente.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    operating system/ˈɒpəreɪtɪŋ ˈsɪstəm/ 操作系统 cāo zuò xì tǒng
    processor/ˈprəʊsesə/ 处理器 chǔ lǐ qì
    multitasking/ˈmʌltitæskɪŋ/ 多任务处理 duō rèn wù chǔ lǐ
    memory management/ˈmeməri ˈmænɪdʒmənt/ 内存管理 nèi cún guǎn lǐ
    memory protection/ˈmeməri prəˈtekʃn/ 内存保护 nèi cún bǎo hù
    RAM/ræm/ 随机存取存储器 suí jī cún qǔ cún chǔ qì
    secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ 辅助存储器 fǔ zhù cún chǔ qì
    virtual memory/ˈvɜːtʃuːəl ˈmeməri/ 虚拟内存 xū nǐ nèi cún
    paging/ˈpeɪdʒɪŋ/ 分页 fēn yè
    process management/ˈprəʊses ˈmænɪdʒmənt/ 进程管理 jìn chéng guǎn lǐ
    process/ˈprəʊses/ 进程 jìn chéng
    scheduling/ˈʃedjuːlɪŋ/ 调度 diào dù
    time slice/taɪm slaɪs/ 时间片 shí jiān piàn
    device driver/dɪˈvaɪs ˈdraɪvə/ 设备驱动 shè bèi qū dòng
    interrupts/ˈɪntərʌpts/ 中断 zhōng duàn
    directory/daɪˈrektəri/ 目录 mù lù
    access rights/ˈækses raɪts/ 访问权限 fǎng wèn quán xiàn
    authentication/ɔːˌθentɪˈkeɪʃn/ 身份验证 shēn fèn yàn zhèng
    firewall/ˈfaɪəwɔːl/ 防火墙 fáng huǒ qiáng
    hardware interrupt/ˈhɑːdweə ˈɪntərʌpt/ 硬件中断 yìng jiàn zhōng duàn
    software interrupt/ˈsɒftweə ˈɪntərʌpt/ 软件中断 ruǎn jiàn zhōng duàn
    interrupt handler/ˈɪntərʌpt ˈhændlə/ 中断处理程序 zhōng duàn chǔ lǐ chéng xù
    utility program/juːˈtɪlɪti ˈprəʊɡræm/ 实用程序 shí yòng chéng xù
    antivirus/ˌæntɪˈvaɪrəs/ 杀毒软件 shā dú ruǎn jiàn
    backup/ˈbækʌp/ 备份 bèi fèn
    compression/kəmˈpreʃn/ 压缩 yā suō
    disk defragmenter/dɪsk ˌdiːˈfræɡmentə/ 碎片整理 suì piàn zhěng lǐ
    signatures/ˈsɪɡnɪtʃəz/ 签名 qiān míng
    fragmented/fræɡˈmentɪd/ 碎片化 suì piàn huà
    incremental backups/ˌɪŋkrɪˈmentl ˈbækʌps/ 增量备份 zēng liàng bèi fèn
    program library/ˈprəʊɡræm ˈlaɪbrəri/ 程序库 chéng xù kù
    subroutines/ˈsʌbruːtiːnz/ 子程序 zi chéng xù
    library routines/ˈlaɪbrəri ruːˈtiːnz/ 库例程 kù lì chéng
    static library/ˈstætɪk ˈlaɪbrəri/ 静态库 jìng tài kù
    executable/ɪɡˈzekjʊtəbl/ 可执行文件 kě zhí xíng wén jiàn
    dynamic library/daɪˈnæmɪk ˈlaɪbrəri/ 动态库 dòng tài kù
    translator/trænˈsleɪtə/ 翻译器 fān yì qì
    machine code/məˈʃiːn kəʊd/ 机器码 jī qì mǎ
    5.1

    Bibliotecas de Programas

    Uma biblioteca de programas 程序库 é código pré-escrito (subrotinas 子程序, classes, módulos) que programas reutilizam em vez de escrevê-lo eles mesmos — ex.: uma biblioteca matemática, uma biblioteca de rede, uma biblioteca de gráficos.

    Um novo programa em desenvolvimento reutilizando rotinas prontas de uma biblioteca de matemática, uma biblioteca de gráficos e uma biblioteca de rede
    Um novo programa reutilizando rotinas prontas de bibliotecas

    Benefícios: economiza tempo (código pronto), confiável (bem testado, amplamente utilizado) e padronizado (comportamento consistente).

    A lista de benefícios para o examinador, do ponto de vista do desenvolvedor. As rotinas da biblioteca 库例程 já estão escritas e testadas, portanto o desenvolvimento é mais rápido e barato; são confiáveis e, por serem usadas por muitos programas, largely error-free; o desenvolvedor não precisa de especialização naquela área (gráficos, compressão, criptografia, busca de caminho); o programa é mais fácil de manter porque o código comum fica em um único lugar; e toda uma equipe pode usar as mesmas rotinas, garantindo resultados consistentes. Desvantagens: uma rotina pode não fazer exatamente o que você precisa e você não pode alterá-la; seu programa depende da biblioteca estar disponível, correta e segura — um bug ou uma falha de segurança na biblioteca é um bug no seu programa; e você precisa aprender como chamá-la.

    • uma biblioteca estática 静态库 é copiada para o executável no tempo de compilação (funciona isoladamente, mas maior e precisa ser recompilada para atualização).
    • uma biblioteca dinâmica 动态库 (DLL, Biblioteca de Ligação Dinâmica; .so) é carregada em tempo de execução (executáveis menores, compartilhada por muitos programas, atualizada uma vez para todos).
    Uma biblioteca estática é copiada para o executável no tempo de compilação, criando um programa autônomo maior; um arquivo de biblioteca dinâmica (.dll ou .so) permanece separado, é carregado no tempo de execução e é compartilhado por vários programas
    Estática: a biblioteca é copiada para o executável. Dinâmica: um arquivo de biblioteca compartilhada é carregado no tempo de execução

    Arquivos de Dynamic Link Library (DLL). Uma DLL é uma biblioteca que é carregada na memória apenas quando um programa a chama, no tempo de execução, e permanece como um arquivo separado em vez de ser copiada para o executável. Benefícios: o executável é menor; vários programas em execução compartilham uma cópia da DLL na memória; uma DLL pode ser atualizada (correção de bug, novo dispositivo) sem recompilar os programas que a utilizam; e a memória é usada apenas enquanto a rotina estiver necessária. Desvantagens: o programa não funcionará se a DLL estiver ausente, movida ou for a versão errada; uma DLL atualizada pode quebrar um programa que dependia do comportamento antigo; e uma DLL falsa colocada no seu lugar roda com os direitos do programa.

    Exemplo resolvido. Uma equipe escreve o software para um robô de restaurante e usa uma biblioteca de programas que inclui uma rotina para encontrar o caminho mais curto entre mesas. Explique dois benefícios e uma desvantagem para a equipe.

    Benefícios: a rotina já está escrita e testada, então a equipe economiza tempo e pode confiar no resultado; a equipe não precisa entender algoritmos de busca de caminho e pode gastar o tempo nas funcionalidades próprias do robô. Desvantagem: a rotina pode não lidar exatamente com as necessidades do restaurante (mover cadeiras, corredores de sentido único) e a equipe não pode alterá-la, então podem ter que contornar suas limitações.

    Explorar

    Laboratório de conceitos de computação

    Classifique exemplos concretos pelo conceito de computação que eles demonstram.

    5.2

    Tradutores de linguagem

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão da necessidade de: • software ensamblador para a tradução de um programa em linguagem assemble • um compilador para a tradução de um programa em linguagem de alto nível • um intérprete para a tradução e execução de um programa em linguagem de alto nível
    Explique os benefícios e desvantagens do uso de um compilador ou intérprete e justifique o uso de cada um
    Demonstre consciência de que programas em linguagem de alto nível podem ser parcialmente compilados e parcialmente interpretados, como Java (modo console)
    Descreva características encontradas num Ambiente de Desenvolvimento Integrado (IDE) típico Incluindo: • para codificação, incluindo prompts sensíveis ao contexto • para deteção inicial de erros, incluindo verificações de sintaxe dinâmicas • para apresentação, incluindo formatação automática, expansão e contração de blocos de código • para depuração, incluindo passo a passo, pontos de interrupção, i.e., variáveis, expressões, janela de relatório

    Fonte: Programa Cambridge International

    Você escreve código-fonte; o computador executa código de máquina 机器码. Um tradutor 翻译器 converte entre eles.

    Montador

    Um montador 汇编器 traduz linguagem de montagem 汇编语言 em código de máquina: cada instrução mnemônica (LDD, ADD, JMP) torna-se exatamente uma instrução de código de máquina, e endereços simbólicos e rótulos são substituídos por endereços reais. É necessário porque o processador executa apenas código de máquina, e a linguagem de montagem é usada onde o programador precisa de controle direto do hardware (sistemas embarcados, drivers de dispositivos).

    Compilador

    Um compilador 编译器 traduz um programa de alto nível em código de máquina uma vez, antes de ser executado.

    • ele relata todos os erros no tempo de compilação; uma vez limpo, produz um executável 可执行文件 independente que roda sem o compilador instalado e pode ser executado muitas vezes.
    • geralmente mais rápido no tempo de execução (nenhuma tradução durante a execução), mas atrelado a uma CPU/SO — recompilar para cada plataforma.

    A descrição de duas marcas: um compilador traduz o programa inteiro de alto nível em código de máquina (código objeto 目标代码) antes de ser executado, produz um arquivo executável e relata todos os erros de sintaxe juntos como uma lista no final da tradução. Ele não executa o programa.

    Interpretador

    Um interpretador 解释器 traduz e executa um programa de alto nível linha por linha, não produzindo nenhum executável.

    • ele relata um erro quando chega nessa linha, depois para; você pode corrigi-lo e continuar — bom para desenvolvimento.
    • o interpretador deve estar instalado para executar o programa; geralmente mais lento (cada execução re-traduz), mas fácil de portar entre plataformas.

    A descrição de duas marcas: um interpretador traduz uma declaração do programa de alto nível por vez e a executa imediatamente antes de passar para a próxima; nenhum arquivo executável é produzido; ele para no primeiro erro encontrado e o relata. Tanto o código-fonte quanto o interpretador devem estar presentes sempre que o programa for executado.

    Um compilador traduz o código-fonte uma vez em um executável que então roda muitas vezes sem tradutor presente; um interpretador traduz e executa o código-fonte linha por linha, em cada execução
    Um compilador traduz uma vez em um programa independente; um interpretador traduz linha por linha, em cada execução

    Escolhendo entre eles

    Use um compilador quando: Use um interpretador quando:
    velocidade no tempo de execução importa você quer ciclos rápidos de edição–execução
    distribuir para usuários sem ferramentas de desenvolvimento escrever scripts multiplataforma
    o programa roda muitas vezes o programa é pequeno ou rodado uma única vez
    ensinar iniciantes

    Benefícios e desvantagens, conforme a lista do gabarito.

    compilador interpretador
    velocidade de execução rápida — já é código de máquina lenta — traduzida em cada execução
    o que o usuário precisa apenas o executável; sem tradutor, e o código-fonte permanece privado o código-fonte e o interpretador
    encontrar erros todos os erros listados de uma vez, após a tradução do programa inteiro cada erro relatado na linha onde ocorre, à medida que você desenvolve
    alterar o código recompilar o programa inteiro após cada alteração editar e executar novamente imediatamente
    portabilidade código de máquina roda em apenas uma plataforma; recompilar para cada a mesma fonte roda em qualquer lugar que exista um interpretador

    Exemplo resolvido. Um desenvolvedor usa um interpretador enquanto escreve um programa e um compilador quando termina. Explique como cada um é usado (4 marcas).

    Durante o desenvolvimento, o interpretador executa o programa parcialmente escrito imediatamente, sem esperar por uma tradução completa; ao encontrar um erro, ele relata a linha, então o desenvolvedor corrige e executa novamente imediatamente — um ciclo rápido de edição–execução que facilita o debugging. Quando o programa está terminado, o compilador traduz todo o programa em um executável que roda mais rápido, não precisa de tradutor no computador do usuário e não revela o código-fonte, podendo ser vendido ao público.

    Híbrido: Java

    Java é compilado em bytecode 字节码 (uma forma intermediária independente de plataforma), que uma máquina virtual 虚拟机 (a JVM) então interpreta — ou usa compilação just-in-time 即时编译 para transformar partes quentes em código nativo. Assim, erros são capturados cedo, o bytecode roda em qualquer lugar com uma JVM (

    A frase do syllabus é "parcialmente compilado e parcialmente interpretado": a etapa do compilador captura erros de sintaxe e produz bytecode compacto e portátil 可移植的; a etapa de interpretação permite que esse único arquivo de bytecode seja executado em qualquer máquina que tenha uma máquina virtual, ao custo de alguma velocidade. Java em modo console (um programa de texto executado pela linha de comando) é o exemplo do syllabus.

    O código-fonte Java é compilado uma vez em bytecode independente de plataforma (.class), que uma JVM no Windows, macOS ou Linux então interpreta ou compila JIT em código nativo
    Java compila para bytecode portátil que qualquer JVM executa — escreva uma vez, execute em qualquer lugar

    Exemplo resolvido. O código-fonte Java é compilado em bytecode, que uma JVM então interpreta. Por que usar ambos, em vez de compilar diretamente para código de máquina? Um compilador produz código de máquina para um processador e sistema operacional, então um programa compilado em uma máquina não funcionará em outra. O compilador do Java, em vez disso, visa uma máquina virtual, então o bytecode que ele produz é idêntico em todos os lugares; cada plataforma então fornece sua própria JVM para interpretar esse bytecode em suas próprias instruções nativas. Um único arquivo compilado, portanto, funciona em qualquer lugar onde exista uma JVM - "escreva uma vez, execute em qualquer lugar". O preço é a velocidade: interpretar bytecode é mais lento do que executar código nativo, razão pela qual uma JVM real também usa compilação JIT para transformar bytecode frequentemente executado em código nativo enquanto o programa roda. Nomeie ambos os lados - os pontos são pela portabilidade comprada ao custo da velocidade.

    Explorar

    O caminho do compilador: código-fonte para programa em execução

    Passe por como um compilador funciona — traduzindo todo o programa uma vez, antes de executar. Contraste com um interpretador, que traduz e executa uma linha de cada vez.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    compiler/kəmˈpaɪlə/ 编译器 biān yì qì
    object code/ˈɒbdʒekt kəʊd/ 目标代码 mù biāo dài mǎ
    interpreter/ɪnˈtɜːprɪtə/ 解释器 jiě shì qì
    bytecode/ˈbaɪtkəʊd/ 字节码 zì jié mǎ
    virtual machine/ˈvɜːtʃuːəl məˈʃiːn/ 虚拟机 xū nǐ jī
    just-in-time compilation/dʒʌst ɪn taɪm ˌkɒmpɪˈleɪʃn/ 即时编译 jí shí biān yì
    portable/ˈpɔːtəbl/ 可移植的 kě yí zhí de
    5.2

    Ambiente de Desenvolvimento Integrado (IDE)

    Um ambiente de desenvolvimento integrado 集成开发环境 (IDE) reúne as ferramentas para escrever, testar e depurar código em um único aplicativo:

    Um IDE reúne o editor de código, um botão Executar e um depurador em um único programa
    Um IDE agrupa o editor, um botão Executar e um depurador

    O syllabus agrupa as funcionalidades em quatro tipos. Aprenda qual funcionalidade pertence a qual, porque as perguntas pedem para classificá-las e descrever uma de cada grupo.

    • Para codificação: prompts sensíveis ao contexto 上下文相关提示 — conforme você digita, o IDE exibe os identificadores, palavras-chave ou parâmetros que se encaixam naquele ponto do código; auto-complete 自动补letina completa o nome para você; indentação automática e correspondência de colchetes mantêm o layout correto enquanto você digita.
    • Para detecção inicial de erros: verificações de sintaxe dinâmicas 动态语法检查 — o editor verifica a sintaxe enquanto você digita e sublinha ou destaca um erro imediatamente, antes que o programa seja traduzido; após a tradução, mensagens de erro com números de linha.
    • Para apresentação: prettyprint 代码美化 — palavras-chave, identificadores, strings e comentários mostrados em cores ou fontes diferentes (destaque de sintaxe 语法高亮) com indentação consistente, para que a estrutura seja visível à primeira vista; expandir e recolher blocos de código — ocultar o corpo de um loop, um IF ou uma subrotina para ver o contorno.
    • Para depuração: breakpoints 断点 — o programa pausa ao atingir uma linha marcada; single stepping 单步执行 — a partir da pausa, execute uma linha por vez; uma janela que mostra os valores atuais de variáveis e expressões à medida que mudam; e uma report window 报告窗口 que lista erros, avisos e saída.

    Outras funcionalidades: integração com tradutor (compilar ou executar com um atalho, erros mostrados em linha), um debugger 调试器 que aciona as funcionalidades de depuração acima, integração com version control 版本 controle (git), gerenciamento de projetos, sistema de ajuda, ferramentas de refactoring 重构 (renomeação segura) e integração com unit test 单元测试.

    Uma janela de IDE anotada com tags numeradas: palavras-chave coloridas (prettyprint), bloco de código contraído, prompt pop-up sugerindo um nome, sublinhado ondulado do verificador dinâmico de sintaxe, ponto de breakpoint na margem, seta na linha atual durante single stepping, painel de variáveis e report window
    As funcionalidades da IDE apresentam os nomes do syllabus, nos locais onde você os veria na tela

    Uma IDE acelera o desenvolvimento ao colocar escrever → executar → depurar → corrigir atrás de uma única interface. IDEs comuns: Visual Studio, PyCharm, Eclipse, VS Code.

    Um fluxo de trabalho de debugger: defina um breakpoint, execute o programa e, quando ele atingir o breakpoint, pause para inspecionar as variáveis, depois faça single stepping linha por linha ou continue
    Um debugger: defina um breakpoint, execute, então pause para inspecionar variáveis e faça single stepping pelo código

    Exemplo resolvido. Uma função Calculate() retorna um valor inesperado quando o programa é executado. Descreva como as funcionalidades de depuração de uma IDE típica ajudam a encontrar a causa (4 pontos).

    Defina um breakpoint na primeira linha de Calculate(), para que o programa pause lá em vez de continuar executando. Em seguida, faça single-step pela função uma linha por vez. Após cada passo, leia os valores das variáveis e de qualquer expressão que você tenha pedido à IDE para watch, e compare-os com os valores esperados; a primeira linha após a qual um valor está errado é onde está o erro lógico. A report window mostra qualquer mensagem de erro de tempo de execução e a saída produzida até então.

    Exemplo resolvido. Coloque cada funcionalidade no seu grupo do syllabus: prettyprint, context-sensitive prompt, dynamic syntax check, breakpoint, expand/collapse code blocks, report window.

    Coding: context-sensitive prompt. Detecção inicial de erros: dynamic syntax check. Apresentação: prettyprint, expand/collapse code blocks. Depuração: breakpoint, report window.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    debugger/ˈdiːbʌɡə/ 调试器 tiáo shì qì
    context-sensitive prompts/ˈkɒntekst ˈsensɪtɪv prɒmpts/ 上下文相关提示 shàng xià wén xiāng guān tí shì
    auto-complete/ˈɔːtəʊ kəmˈpliːt/ 自动补全 zì dòng bǔ quán
    dynamic syntax checks/daɪˈnæmɪk ˈsɪntæks tʃeks/ 动态语法检查 dòng tài yǔ fǎ jiǎn chá
    prettyprint/ˈpretɪprɪnt/ 代码美化 dài mǎ měi huà
    syntax highlighting/ˈsɪntæks ˈhaɪlaɪtɪŋ/ 语法高亮 yǔ fǎ gāo liàng
    breakpoints/ˈbreɪkpɔɪnts/ 断点 duàn diǎn
    single stepping/ˈsɪŋɡl ˈstepɪŋ/ 单步执行 dān bù zhí xíng
    report window/rɪˈpɔːt ˈwɪndəʊ/ 报告窗口 bào gào chuāng kǒu
    version control/ˈvɜːʃn kənˈtrəʊl/ 版本控制 bǎn běn kòng zhì
    refactoring/rɪˈfæktərɪŋ/ 重构 chóng gòu
    unit test/ˈjuːnɪt test/ 单元测试 dān yuán cè shì
    5.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    sistema operacional software que gerencia o hardware e recursos do computador e fornece uma interface entre o usuário, os programas de aplicativo e o hardware
    software utilitário software de sistema que executa uma tarefa específica para manter, otimizar ou proteger o computador, como um verificador de vírus ou desfragmentador
    biblioteca de programas conjunto de rotinas pré-escritas e testadas (subrotinas, classes, módulos) que um programa pode usar em vez de escrever as próprias
    Dynamic Link Library (DLL) uma biblioteca de programas cujas rotinas são carregadas na memória apenas quando o programa as chama, em tempo de execução, e são compartilhadas entre programas
    assembler tradutor que converte um programa de linguagem de montagem em código de máquina, uma instrução por instrução
    compiler tradutor que converte todo um programa de linguagem de alto nível em código de máquina antes de ser executado, produzindo um arquivo executável
    interpreter tradutor que traduz e executa um programa de linguagem de alto nível uma declaração por vez
    integrated development environment aplicativo único que fornece as ferramentas para escrever, traduzir, executar e depurar um programa
    context-sensitive prompt pop-up que sugere identificadores, palavras-chave ou parâmetros que se encaixam no ponto atual do código
    dynamic syntax check verifica a sintaxe do código à medida que é digitado e sinaliza um erro antes que o programa seja traduzido
    prettyprint exibe o código com palavras-chave, identificadores e comentários em cores ou fontes diferentes e com indentação consistente
    breakpoint linha marcada na qual o programa em execução pausa para que as variáveis possam ser inspecionadas
    single stepping executa um programa pausado uma declaração por vez sob o controle do programador
    Vocabulário Treinar
    Inglês Chinês Pinyin
    assembler/əˈsemblə/ 汇编器 huì biān qì
    assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ 汇编语言 huì biān yǔ yán
    integrated development environment/ˈɪntɪɡreɪtɪd dɪˈveləpmənt enˈvaɪrənmənt/ 集成开发环境 jí chéng kāi fā huán jìng
    5.2

    Dicas de prova

    • Liste as tarefas do SO pelos seus nomes do syllabus (gestão de memória, processo, hardware, arquivos e segurança) e diga o que cada uma faz — "gerencia recursos" sozinho é muito vago.
    • Comparar compiler vs interpreter vs assembler: o que cada um traduz, quando o traduz e como os erros são relatados.
    • Explique o que uma IDE oferece usando os grupos do syllabus: coding, detecção inicial de erros, apresentação, depuração.
    • Uma resposta de "benefício para o desenvolvedor" nomeia a economia do desenvolvedor: tempo, custo, competência, confiabilidade ou manutenção. Um "drawback" nomeia uma dependência: disponibilidade, versão, adequação, segurança.
    • Para "descrever a operação de" um tradutor, dê três coisas: o que é traduzido (programa inteiro ou uma declaração), quando (antes de executar ou enquanto executa) e como os erros são relatados (todos de uma vez ou no primeiro erro).

    Erros comuns

    • Escrever "o OS controla o computador" ou "gerencia recursos" sem exemplo de tarefa. Cada ponto é uma tarefa nomeada com o que ela faz.
    • Dizer que um interpreter "compila linha por linha". Um interpreter traduz e executa cada declaração; ele nunca produz um executável.
    • Dizer que um compiler executa o programa. Ele apenas traduz; o executável roda depois, sem o compiler.
    • Colocar uma DLL "dentro" do executável. Isso é uma biblioteca estática; uma DLL permanece um arquivo separado carregado em tempo de execução.
    • Dizer que a desfragmentação "exclui" ou "comprime" arquivos, ou que é necessária em SSDs. Ela apenas move blocos para que cada arquivo seja armazenado contiguamente.
    • Classificar prettyprint ou contrair blocos sob "depuração". Eles são funcionalidades de apresentação; depuração refere-se a breakpoints, single stepping, watching variables e report window.
  • 6

    Segurança, privacidade e integridade dos dados

    Assistir aula
    6.1

    Segurança, privacidade e integridade — três ideias diferentes

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Explique a diferença entre os termos segurança, privacidade e integridade dos dados
    Demonstre apreciação pela necessidade tanto da segurança dos dados quanto da segurança do sistema informático
    Descreva medidas de segurança projetadas para proteger sistemas informáticos, desde PCs autónomos até redes de computadores Incluindo contas de utilizador, palavras-passe, técnicas de autenticação como assinaturas digitais e biometria, firewall, software antivírus, anti-spyware, criptografia
    Demonstre compreensão das ameaças à segurança computacional e dos dados impostas por redes e internet Incluindo malware (vírus, spyware), hackers, phishing, pharming
    Descreva métodos que podem ser utilizados para restringir os riscos impostos por ameaças
    Descreva métodos de segurança projetados para proteger a integridade dos dados Incluindo criptografia, direitos de acesso

    Fonte: Programa Cambridge International

    Parecem semelhantes, mas significam coisas diferentes:

    • security 安全 — proteger dados contra acesso, alteração ou destruição unauthorised 未授权.
    • privacy 隐私 — o direito de um indivíduo de controlar quem vê seus dados pessoais, com consentimento e propósito claro.
    • integrity 完整性 — os dados serem precisos e completos — não corrompidos ou alterados acidentalmente.

    Um arquivo pode ser seguro (apenas as pessoas certas podem abri-lo) mas carecer de integridade (um erro de digitação o corrompeu); ou preciso, mas não privado (qualquer pessoa pode lê-lo). As três são necessárias.

    Diferenças que o scheme quer, uma frase cada: security é manter os dados seguros contra perda e acesso não autorizado; privacy é manter os dados confidenciais, para que apenas aqueles com permissão possam vê-los; integrity é os dados estarem corretos, consistentes e completos. Então "a diferença entre security e privacy": security trata de proteger os dados contra acesso, alteração ou perda por pessoas que não devem; privacy trata do direito do indivíduo de decidir quem pode ver seus dados pessoais. "A diferença entre security e integrity": security protege os dados contra acesso não autorizado; integrity trata dos dados estarem precisos e atualizados, o que validação e verificação protegem.

    Explorar

    Laboratório de risco e responsabilidade

    Classifique exemplos pela regra, risco ou proteção envolvidos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    security/sɪˈkjʊərɪti/ 安全 ān quán
    privacy/ˈprɪvəsi/ 隐私 yǐn sī
    integrity/ɪnˈteɡrɪti/ 完整性 wán zhěng xìng
    unauthorised/ʌnˈɔːθəraɪzd/ 未授权 wèi shòu quán
    6.1

    Por que a segurança importa

    Duas coisas a proteger: os próprios dados (mantê-los confidenciais, intactos e disponíveis) e o sistema de computador (um sistema comprometido pode atacar outros, roubar credenciais ou ser mantido refém).

    "Por que a escola precisa manter ambos seguros?" Dados: são pessoais e confidenciais, portanto não devem ser lidos, alterados ou excluídos por uma pessoa não autorizada, e sua perda pararia o funcionamento da escola. Sistema: um invasor que acessa o sistema de computador pode instalar malware, usá-lo para atacar outros sistemas, danificar hardware ou software, ou bloqueá-lo com ransomware; um sistema seguro é a primeira linha de defesa para os dados nele contidos.

    6.1

    Ameaças de redes e internet

    Ameaças se dividem em três grupos.

    Um atacante man-in-the-middle senta-se entre Alice e Bob, lendo ou alterando mensagens
    Um atacante man-in-the-middle senta-se entre as duas partes
    1. Malware 恶意软件 (malicious software) — programas nocivos:
    • virus 病毒 — código autocolante que se anexa a outros programas e se espalha quando eles são executados.
    • worm 蠕虫 — código autocolante que se espalha por redes 网络 sem ação do usuário.
    • Trojan horse 木马 — parece útil, mas esconde código malicioso.
    • spyware 间谍软件 — coleta secretamente informações (digitações, senhas).
    • ransomware 勒索软件 — criptografa seus arquivos e exige pagamento.
    • adware 广告软件 — impõe anúncios indesejados.

    2. Enganando pessoas (ataques sociais):

    • phishing 网络钓鱼 — e-mails/sites falsos que enganam usuários para darem credenciais.
    • pharming 域名欺骗 redireciona um usuário para um site falso mesmo quando digitam o endereço correto.
    • social engineering 社会工程 — enganar pessoas para revelarem informações.

    Descrições do scheme para as quatro ameaças nomeadas: um virus é software malicioso que se replica (autocopia), anexa-se a outros arquivos e apaga ou corrompe dados; spyware é software malicioso que grava as teclas pressionadas e ações do usuário e as envia a terceiros, para obter senhas e dados pessoais; um e-mail de phishing finge vir de uma organização legítima e contém um link para um site falso onde o usuário é solicitado a fornecer detalhes pessoais ou bancários; pharming é código malicioso instalado no computador do usuário ou em um servidor web que redireciona o usuário para um site falso mesmo que tenham digitado o endereço correto. Semelhanças entre spyware e um vírus: ambos são malware, ambos são instalados sem conhecimento do usuário, ambos podem enviar dados a terceiros ou danificar o sistema; a diferença é que um vírus se replica enquanto spyware registra e transmite informações. Phishing e pharming levam o usuário a um site falso que coleta seus dados; phishing precisa que o usuário clique em um link em um e-mail, pharming funciona através de código no computador ou no servidor DNS e não precisa de e-mail.

    3. Ataques à rede:

    • hacking 黑客入侵 por hackers 黑客 — acesso não autorizado, muitas vezes via senhas fracas ou falhas de software.
    • denial of service 拒绝服务 (DoS/DDoS) — inunda um servidor para que usuários reais não consigam acessá-lo.
    • eavesdropping 窃听 — captura de dados em trânsito (risco em Wi-Fi aberto).
    • man-in-the-middle 中间人攻击 — um atacante relaya secretamente ou altera mensagens entre duas partes.

    Exemplo resolvido. Identifique e descreva duas ameaças aos dados em uma rede escolar, e forneça um método de prevenção diferente para cada uma.

    Ameaça 1, malware: um vírus copiado para um computador a partir de um anexo de e-mail ou download se replica e corrompe ou exclui arquivos; prevenção: software antivírus que escaneia arquivos e é mantido atualizado. Ameaça 2, hacking: uma pessoa não autorizada ganha acesso à rede, por exemplo adivinhando uma senha fraca, e lê ou altera os dados; prevenção: um firewall que bloqueia conexões não autorizadas, ou senhas fortes com autenticação de dois fatores. Um terceiro par, phishing: um e-mail leva o usuário a um site falso que coleta seu login; prevenção: treinar usuários para verificar o remetente e a URL, e filtrar e-mails. A medida deve corresponder à ameaça: criptografia não impede um vírus, e software antivírus não impede phishing.

    Malware agrupado por comportamento: tipos de propagação autônoma são o vírus (se liga a programas) e worm (se espalha por redes); tipos ocultos ou disfarçados são o Trojan (parece útil), spyware, ransomware e adware
    Malware por comportamento: propagação autônoma (vírus, worm) versus oculto/disfarçado (Trojan, spyware, ransomware, adware)
    Vocabulário Treinar
    Inglês Chinês Pinyin
    malware/ˈmælweə/ 恶意软件 è yì ruǎn jiàn
    ransomware/ˈrænsəmweə/ 勒索软件 lè suǒ ruǎn jiàn
    networks/ˈnetwɜːks/ 网络 wǎng luò
    man-in-the-middle/mæn ɪnðə ˈmɪdl/ 中间人攻击 zhōng jiān rén gōng jī
    virus/ˈvaɪrəs/ 病毒 bìng dú
    worm/wɜːm/ 蠕虫 rú chóng
    Trojan horse/ˈtrəʊdʒn hɔːs/ 木马 mù mǎ
    spyware/ˈspaɪweə/ 间谍软件 jiàn dié ruǎn jiàn
    adware/ˈædweə/ 广告软件 guǎng gào ruǎn jiàn
    phishing/ˈfɪʃɪŋ/ 网络钓鱼 wǎng luò diào yú
    pharming/ˈfɑːmɪŋ/ 域名欺骗 yù míng qī piàn
    social engineering/ˈsəʊʃl ˌendʒɪˈnɪərɪŋ/ 社会工程 shè huì gōng chéng
    hacking/ˈhækɪŋ/ 黑客入侵 hēi kè rù qīn
    hackers/ˈhækəz/ 黑客 hēi kè
    denial of service/dɪˈnaɪəl ɒv ˈsɜːvɪs/ 拒绝服务 jù jué fú wù
    eavesdropping/ˈiːvzdrɒpɪŋ/ 窃听 qiè tīng
    6.1

    Medidas de segurança

    Medidas protegem tanto a segurança dos dados (contra perda, roubo ou corrupção) quanto a segurança do sistema computacional (seu hardware, software e rede).

    PC standalone

    • uma senha forte; antivírus mantido atualizado; atualizações de software rápidas; backup 备份 em mídia separada; criptografia 加密 de disco completo; tela bloqueada.

    PC em rede

    Tudo acima, mais um firewall 防火墙, permissões por usuário (direitos de admin apenas para admins), gestão centralizada de contas de usuário 用户账户, e logs de auditoria 审计日志 (quem fez login, o que tocou).

    Como as medidas funcionam, na formulação que o programa avalia:

    • firewall: examina toda transmissão de entrada e saída e a compara com critérios definidos (lista branca ou lista negra de endereços, portas e protocolos); bloqueia qualquer uma que não atenda aos critérios; pode impedir acesso a certos sites e alertar sobre tentativas de acesso não autorizado.
    • criptografia: os dados são embaralhados (codificados) com uma chave em texto cifrado, para que uma cópia interceptada não possa ser compreendida sem a chave; o receptor usa uma chave para descriptografá-la. Protege dados em trânsito e em armazenamento, mas não impede que os dados sejam interceptados ou excluídos.
    • senhas e contas de usuário: apenas um usuário que conhece a senha pode fazer login; uma senha forte (longa, caracteres mistos, alterada regularmente) não pode ser adivinhada; contas travam após falhas repetidas; cada conta possui seus próprios direitos de acesso.
    • software antivírus e anti-spyware: escaneia arquivos e programas contra um banco de dados de assinaturas conhecidas de malware, verifica comportamentos, isola ou exclui o que encontrar, e deve ser atualizado para reconhecer novos malwares.
    • direitos de acesso: cada usuário (ou grupo) recebe permissões para cada arquivo ou tabela, como leitura exclusiva ou leitura e escrita, para que um usuário não veja ou altere dados que não são seus; um banco de dados também pode apresentar a cada usuário uma view contendo apenas os campos necessários.
    • biometria: o dispositivo captura uma imagem do rosto, impressão digital ou íris, converte em dados digitais, compara com os dados armazenados daquele usuário e permite acesso apenas em caso de correspondência; não pode ser esquecido, emprestado ou adivinhado como uma senha.
    • backups: uma cópia dos dados em mídia separada, mantida fora do local, para que dados perdidos ou corrompidos possam ser restaurados.

    Para restringir os riscos de malware, em três pontos: instalar software anti-malware e mantê-lo atualizado; usar um firewall; não abrir anexos ou baixar arquivos de fontes desconhecidas; manter o sistema operacional e aplicativos corrigidos; e treinar usuários.

    Diagrama de caixa com o computador do usuário no lado confiável, depois o firewall, depois a internet no lado não confiável, conectados por setas duplas
    Um firewall fica entre o computador do usuário e a internet

    Através da internet

    • VPN 虚拟专用网 — criptografa tráfego entre o usuário e o gateway corporativo.
    • HTTPS / TLS — criptografa tráfego web.
    • assinaturas digitais 数字签名 — provam quem enviou uma mensagem e que ela não foi alterada em trânsito.
    • detecção de intrusão — monitora tráfego por padrões de ataque conhecidos.

    Como uma assinatura digital autentica um documento (cinco pontos): o remetente passa a mensagem por uma função hash para produzir um resumo; o remetente criptografa o resumo com sua chave privada, e esse resumo criptografado é a assinatura digital; a mensagem e a assinatura são enviadas juntas; o receptor descriptografa a assinatura com a chave pública do remetente para recuperar o resumo; o receptor faz hash da mensagem recebida e compara os dois resumos; se coincidirem, a mensagem veio do remetente (apenas eles detêm a chave privada) e não foi alterada na transmissão. Uma assinatura prova quem enviou a mensagem e que está intacta; não esconde o conteúdo, que é o que a criptografia da mensagem serve para fazer.

    Duas faixas: o remetente faz hash da mensagem em um resumo e criptografa o resumo com sua chave privada para criar a assinatura, e envia mensagem e assinatura; o receptor descriptografa a assinatura com a chave pública do remetente para obter resumo A, faz hash da mensagem recebida para obter resumo B, e os compara
    Uma assinatura digital: um hash da mensagem, criptografado com a chave privada do remetente, verificado pelo receptor contra um hash fresco
    Vocabulário Treinar
    Inglês Chinês Pinyin
    firewall/ˈfaɪəwɔːl/ 防火墙 fáng huǒ qiáng
    two-factor authentication/tuː ˈfæktə ɔːˌθentɪˈkeɪʃn/ 双因素认证 shuāng yīn sù rèn zhèng
    authentication/ɔːˌθentɪˈkeɪʃn/ 身份验证 shēn fèn yàn zhèng
    backup/ˈbækʌp/ 备份 bèi fèn
    user accounts/ˈjuːzə əˈkaʊnts/ 用户账户 yòng hù zhàng hù
    audit logs/ˈɔːdɪt lɒɡz/ 审计日志 shěn jì rì zhì
    ciphertext/ˈsaɪfətekst/ 密文 mì wén
    access rights/ˈækses raɪts/ 访问权限 fǎng wèn quán xiàn
    VPN/ˌviː piː ˈen/ 虚拟专用网 xū nǐ zhuān yòng wǎng
    digital signatures/ˈdɪdʒɪtl ˈsɪɡnɪtʃəz/ 数字签名 shù zì qiān míng
    private key/ˈpraɪvət kiː/ 私钥 sī yào
    public key/ˈpʌblɪk kiː/ 公钥 gōng yào
    authorisation/ˌɔːθəraɪˈzeɪʃn/ 授权 shòu quán
    least-privilege/liːst ˈprɪvɪlɪdʒ/ 最小权限 zuì xiǎo quán xiàn
    plaintext/ˈpleɪntekst/ 明文 míng wén
    Symmetric encryption/sɪˈmetrɪk enˈkrɪpʃn/ 对称加密 duì chèn jiā mì
    asymmetric encryption/ˌeɪsɪˈmetrɪk enˈkrɪpʃn/ 非对称加密 fēi duì chèn jiā mì
    access control/ˈækses kənˈtrəʊl/ 访问控制 fǎng wèn kòng zhì
    6.1

    Correspondendo medidas a ameaças

    • interceptação em trânsito → criptografar os dados (HTTPS, VPN). Texto cifrado interceptado é inútil sem a chave.
    • acesso não autorizado → forte autenticação 身份验证 (senhas longas; autenticação de dois fatores 双因素认证 com código de telefone ou chave); autorização 授权 de usuário; bloqueio após falhas de login.
    • malware → software antivírus e anti-spyware 反间谍软件 com escaneamento em tempo real; correções; evitar downloads não confiáveis.
    • phishing → treinamento de usuários; filtragem de e-mails; verificar a URL antes de inserir credenciais.
    • ameaças internas → princípio de menor privilégio 最小权限 (dar a cada usuário apenas o necessário); auditoria.
    • DDoS → limitação de taxa e filtragem de tráfego.

    Para dados confidenciais cruzando a internet, o método do programa é criptografia: os dados são codificados com uma chave em texto cifrado, para que uma pessoa não autorizada que os intercepte não possa lê-los, e apenas o destinatário pretendido, que tem a chave, possa decodirá-los. Para um arquivo de programa enviado por e-mail para teste, a mesma resposta se aplica (criptografar o arquivo, ou enviá-lo por conexão criptografada), junto com uma senha no próprio arquivo.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    anti-spyware/ˈænti ˈspaɪweə/ 反间谍软件 fǎn jiàn dié ruǎn jiàn
    biometrics/ˌbaɪəʊˈmetrɪks/ 生物识别 shēng wù shí bié
    6.1

    Protegendo os próprios dados

    • criptografia — transformar texto claro 明文 em texto cifrado 密文 com uma chave. Criptografia simétrica 对称加密 (AES) usa uma chave compartilhada; criptografia assimétrica 非对称加密 (RSA) usa uma chave pública 公钥 e uma chave privada 私钥. Protege dados em repouso e em trânsito.
    • controle de acesso 访问控制 — permissões de arquivo (leitura/escrita/execução) e direitos de acesso 访问权限, implementados pelo SO.
    • autenticação — técnicas de autenticação verificam o usuário: algo que você sabe (senha), tem (token, telefone), ou é (biometria 生物识别 — impressão digital, rosto, íris); mais forte combinado.
    • backups — manter cópias (algumas fora do local) para que perda ou corrupção seja recuperável.
    • segurança física — salas de servidores trancadas, cadeados de cabos.

    Direitos de acesso em um banco de dados, descritos para três pontos: cada usuário recebe uma conta com nome de usuário e senha; o administrador do banco de dados atribui a cada conta permissões para cada tabela, como leitura exclusiva, leitura e escrita, ou sem acesso; usuários veem apenas tabelas e campos aos quais têm permissão, então um cliente não pode abrir a tabela de funcionários e um funcionário pode ler mas não alterar preços. O DBMS impõe isso com seus direitos de acesso e com visualizações, e pode criptografar os dados armazenados também.

    Criptografia simétrica usa uma única chave compartilhada para criptografar e descriptografar a mensagem; criptografia assimétrica criptografa com a chave pública do receptor e descriptografa com sua chave privada
    Simétrica usa uma chave compartilhada; assimétrica usa uma chave pública para criptografar e uma privada para descriptografar
    Um token de segurança cinza RSA SecurID com tela LCD mostrando um código de seis dígitos
    Um token de segurança mostra um código mutável para autenticação de dois fatores ('algo que você tem')
    Um pequeno leitor de impressões digitais USB com almofada de sensor óptico
    Um leitor de impressões digitais verifica 'algo que você é' — uma característica da pessoa, não uma senha
    Explorar

    Cripte com um cifrador César

    Mude o deslocamento — essa é a chave. Cada letra desliza esse número de lugares no alfabeto para formar o texto cifrado, e a mesma chave o desliva de volta. Essa chave compartilhada é criptografia simétrica em miniatura.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    encryption/enˈkrɪpʃn/ 加密 jiā mì
    6.2

    Integridade dos dados

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Descreva como a validação de dados e a verificação de dados ajudam a proteger a integridade dos dados
    Descreva e utilize métodos de validação de dados Incluindo verificação de intervalo, verificação de formato, verificação de comprimento, verificação de presença, verificação de existência, verificação de limite, dígito verificador
    Descreva e utilize métodos de verificação de dados durante a introdução e transferência de dados Durante a introdução de dados incluindo verificação visual, entrada dupla Durante a transferência de dados incluindo verificação de paridade (byte e bloco), soma de verificação

    Fonte: Programa Cambridge International

    Dados têm integridade quando são precisos e completos. Duas técnicas: validação de dados (pegar dados ruins antes de armazenar) e verificação de dados (confirmar que os dados foram inseridos ou transferidos corretamente).

    Validação — os dados fazem sentido?

    Validação 验证 verifica dados contra regras sensatas, automaticamente:

    • range check — dentro de limites (um mês é 1–12).
    • limit check — do lado correto de um limite único (ex.: idade ≥ 18).
    • existence check — o item referenciado existe (ex.: um código de produto está na tabela).
    • length check — número correto de caracteres.
    • type / character check — tipo certo de dado (um campo de telefone permite apenas dígitos).
    • format check — corresponde a um padrão (um e-mail deve conter @).
    • presence check — campos obrigatórios não estão vazios.
    • check digit 校验位 — um dígito extra calculado a partir dos outros (ISBN, números de cartão) que detecta erros de transcrição.

    Exemplo resolvido. Em um esquema simples de dígito de controle, o dígito de controle é o resto quando a soma dos dígitos é dividida por $10$, anexado ao número. O número $4162$ tem soma de dígitos $13$, então é armazenado como $41623$. Um usuário digita $14623$: os dois primeiros dígitos são trocados, mas a soma ainda é $13$, então o dígito de controle ainda corresponde e o erro não é capturado. Um usuário que digita $41523$ é capturado, porque $4 + 1 + 5 + 2 = 12$ dá dígito de controle $2$. Um esquema que captura dígitos trocados pondera cada posição diferentemente, como faz o ISBN-13 (pesos $1, 3, 1, 3, \ldots$, então o dígito que torna o total um múltiplo de $10$). Um dígito de controle é validação: testa o número contra uma regra no momento em que é inserido.

    • verificação por consulta e verificação de consistência (ex.: data de entrega ≥ data do pedido).

    A validação captura dados com formatação incorreta, mas não dados que estão corretamente formatados, porém factualmente errados ("Bob" para "Bib").

    Exemplo resolvido. Identifique qual verificação de validação cada trecho de pseudocódigo realiza.

    Pseudocódigo Verificação
    IF x < 0 OR x > 10 THEN OUTPUT "Invalid" verificação de intervalo: o valor deve estar entre dois limites
    IF x = "" THEN OUTPUT "Invalid" verificação de presença: o campo não pode estar vazio
    IF NOT(x = "Red" OR x = "Yellow" OR x = "Blue") THEN OUTPUT "Invalid" verificação por consulta (existência): o valor deve pertencer a uma lista
    IF LENGTH(x) <> 6 THEN OUTPUT "Invalid" verificação de comprimento: número correto de caracteres
    IF MID(x, 1, 1) < "A" OR MID(x, 1, 1) > "Z" THEN OUTPUT "Invalid" verificação de formato: um caractere específico deve ser uma letra

    Para validar um número de placa de carro que deve ter uma letra, três dígitos e duas letras: uma verificação de formato testa cada posição contra seu padrão, e uma verificação de comprimento confirma seis caracteres. Para validar uma data de nascimento: uma verificação de formato (DD/MM/YYYY), uma verificação de intervalo (o mês é de $1$ a $12$, o ano não está no futuro) e uma verificação de presença (não está em branco). Uma nota entre $0$ e o máximo do teste precisa de verificação de tipo (inteiro) e verificação de intervalo, com o limite superior lido no próprio registro do teste: é assim que a validação protege a integridade, recusando dados que não poderiam estar corretos.

    Verificação — os dados foram inseridos ou transferidos corretamente?

    Verificação 核对 verifica se os dados não foram alterados ao serem movidos de um lugar para outro.

    Durante a entrada: dupla entrada (digite duas vezes e compare, como para uma nova senha) ou verificação visual.

    Nas palavras do esquema, entrada dupla é inserir os dados duas vezes, pela mesma pessoa ou por duas pessoas, e fazer o computador comparar as duas versões e relatar qualquer diferença; uma verificação visual é a pessoa comparar o que está na tela com o documento original e corrigir qualquer diferença antes de salvar. Ambos protegem a integridade garantindo que os dados armazenados correspondam à fonte. Mesmo após validação e verificação, os dados ainda podem estar errados: podem parecer sensatos e corresponder à fonte, mas a própria fonte estava errada, ou o usuário digitou um valor diferente, mas válido, daquele pretendido.

    Durante a transferência (bits podem inverter):

    • verificação de paridade 奇偶校验 — um bit extra faz com que o número de 1s seja par (paridade par) ou ímpar. O receptor reconta. Detecta erros de único bit.
    • soma de verificação 校验和 — o remetente envia um valor resumido dos dados; o receptor o recalcula e compara.
    • verificação de redundância cíclica 循环冗余校验 (CRC) — uma soma de verificação mais forte usando divisão polinomial, detectando muitos tipos de erro adicionais.

    Uma verificação de bloco de paridade 奇偶块校验 vai além e localiza o erro. Organize os bytes em uma grade: atribua um bit de paridade de linha a cada byte, depois calcule um byte de paridade extra cujos bits sejam a paridade de coluna dos bytes acima. Um único bit invertido agora falha em uma linha e uma coluna — sua interseção aponta exatamente qual bit mudou, podendo até ser corrigido.

    Exemplo resolvido. Quatro bytes são enviados com paridade par, seguidos por um byte de paridade. Encontre o bit que foi corrompido.

    Uma grade de quatro bytes recebidos e um byte de paridade sob paridade par, com o bit de paridade na primeira coluna; a linha do terceiro byte tem cinco 1s e a quarta coluna tem três 1s, ambos ímpares, e o bit em sua interseção é marcado como aquele que foi invertido
    Uma verificação de bloco de paridade: a linha que falha e a coluna que falham cruzam no bit invertido

    Conte os 1s em cada linha e em cada coluna. Cada linha e coluna deve ter um número par; o byte 3 tem cinco e a coluna 4 tem três. O bit onde essa linha e essa coluna se cruzam é aquele que mudou, portanto é redefinido de 1 para 0. Uma verificação de paridade sozinha detecta um erro em um byte, mas não pode dizer qual bit; dois erros no mesmo byte se cancelam e passam despercebidos. Uma soma de verificação, explicada para três marks: o remetente passa o bloco de dados por um algoritmo que produz um valor de soma de verificação; os dados e a soma de verificação são enviados juntos; o receptor executa o mesmo algoritmo nos dados recebidos; se as duas somas de verificação coincidirem, os dados são aceitos, e se não, são rejeitados e reenviados.

    Os mesmos sete bits de dados mostrados duas vezes: um bit de paridade 0 resulta em quatro 1s para paridade par, um bit de paridade 1 resulta em cinco 1s para paridade ímpar
    O bit de paridade é definido para tornar o número de 1s par ou ímpar
    O remetente calcula uma soma de verificação e a envia com o bloco de dados; o receptor recalcula a soma de verificação e compara, além de um exemplo resolvido do cálculo de soma-mod-256 por byte
    Calculando uma soma de verificação para um bloco de dados

    A verificação só prova que o que chegou corresponde ao que foi enviado — não que os dados estejam corretos, nem contra manipulação deliberada. A validação pergunta "isso faz sentido?"; a verificação pergunta "isso foi copiado corretamente?" — use ambas.

    As perguntas da tabela classificam os métodos pelo momento de uso: durante a entrada de dados, entrada dupla e verificação visual; durante a transferência de dados, verificação de paridade (byte ou bloco) e soma de verificação. Transferir arquivos de vídeo de uma câmera para um servidor usa uma soma de verificação: a câmera a calcula, o servidor a recalcula, uma discrepância significa retransmissão.

    Lado a lado: a validação pergunta "esse dado faz sentido?" e verifica regras como intervalo, tipo e formato antes de armazenar (capturando dados sem sentido); a verificação pergunta "ele foi copiado corretamente?" e usa entrada dupla, paridade e somas de verificação (capturando erros de cópia)
    A validação verifica se os dados fazem sentido; a verificação verifica se foram copiados sem alterações

    Exemplo resolvido. Um usuário digita sua data de nascimento como 31/02/2009, e digita seu endereço de e-mail duas vezes. Qual verificação captura qual erro, e qual é a diferença? A validação pergunta "esse dado é sensato?" - o computador o testa contra uma regra, e uma verificação de formato ou intervalo rejeita 31/02/2009 porque fevereiro nunca tem 31 dias. A verificação pergunta "esse dado foi inserido corretamente?" - digitar o e-mail duas vezes é entrada dupla, e comparar as duas cópias captura um erro de digitação. O limite é o que torna esta uma questão favorita: a validação nunca pode dizer que os dados estão corretos, apenas que são possíveis - 01/02/2009 passa todas as regras de validação mesmo que o usuário tenha nascido realmente em outro dia. Diga o que cada verificação pode e não pode capturar.

    Explorar

    Laboratório de conceitos de computação

    Classifique exemplos concretos pelo conceito de computação que eles demonstram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    validation/ˌvælɪˈdeɪʃn/ 验证 yàn zhèng
    verification/ˌverɪfɪˈkeɪʃn/ 核对 hé duì
    check digit/tʃek ˈdɪdʒɪt/ 校验位 jiào yàn wèi
    parity check/ˈpærɪti tʃek/ 奇偶校验 jī ǒu jiào yàn
    checksum/ˈtʃeksəm/ 校验和 jiào yàn hé
    cyclic redundancy check/ˈsaɪklɪk rɪˈdʌndənsi tʃek/ 循环冗余校验 xún huán rǒng yú jiào yàn
    parity block check/ˈpærɪti blɒk tʃek/ 奇偶块校验 jī ǒu kuài jiào yàn
    Assistir aula
    6.2

    Definições aceitas pelo examinador

    Uma questão de definição é marcada contra texto fixo. Aprenda estes exatamente.

    Termo Definição
    segurança de dados manter os dados seguros contra perda e acesso, alteração ou exclusão não autorizados
    privacidade de dados manter os dados confidenciais, de modo que sejam vistos apenas por quem tem direito a vê-los
    integridade de dados os dados estarem precisos, consistentes e completos
    malware software malicioso instalado sem o conhecimento do usuário para danificar um sistema ou roubar dados
    vírus malware que se replica, se anexa a outros arquivos e corrompe ou exclui dados
    spyware malware que registra as teclas pressionadas ou ações do usuário e as envia a terceiros
    phishing um e-mail fingindo ser de uma organização legítima que leva o usuário a um site falso para coletar dados pessoais
    pharming código malicioso que redireciona o usuário a um site falso mesmo quando o endereço correto é inserido
    firewall hardware ou software que examina todo o tráfego entrando ou saindo de um sistema contra critérios definidos e bloqueia o que não os atender
    criptografia embaralhar dados com uma chave em texto cifrado, de modo que não possa ser compreendido sem a chave para descriptografá-lo
    assinatura digital um hash de uma mensagem criptografado com a chave privada do remetente, usado para provar quem o enviou e que não foi alterado
    validação de dados verificação automática de que os dados inseridos são razoáveis e seguem regras definidas
    verificação de dados verificação de que os dados foram inseridos ou transferidos corretamente, comparando-os com a fonte ou com um valor recalculado
    dígito verificador dígito extra calculado a partir dos outros dígitos de um número e anexado a ele, de modo que um erro no número possa ser detectado
    verificação de paridade bit extra adicionado a um byte para que o número de 1s seja par (ou ímpar), o qual o receptor reconta
    soma de verificação valor calculado a partir de um bloco de dados por um algoritmo e enviado com ele, recalculado pelo receptor e comparado
    6.2

    Dicas de prova

    • Mantenha as três ideias separadas: segurança (manter os dados seguros), privacidade (quem pode vê-los), integridade (mantê-los corretos).
    • Combine cada ameaça (malware, hacking, phishing, interceptação) com uma medida (firewall, criptografia, autenticação, direitos de acesso).
    • A criptografia protege confidencialidade, não integridade — use uma soma de verificação, paridade ou dígito verificador para integridade.
    • Distinga um vírus, worm e Cavalo de Troia e como cada um se espalha.

    Erros comuns

    • Dar a mesma medida para duas ameaças, ou uma medida que não se adequa à ameaça. Cada ameaça na tabela precisa de uma prevenção diferente que realmente a impeça.
    • Nomear uma medida sem explicar como ela funciona. "Firewall" pontua quando seguido por "compara o tráfego com critérios definidos e bloqueia o que falha".
    • Chamar validação de uma verificação de que os dados estão corretos. A validação verifica se os dados são razoáveis; a verificação verifica se correspondem à fonte. Nenhuma delas prova que são verdadeiros.
    • Dizer que uma assinatura digital criptografa a mensagem. Ela criptografa um hash da mensagem com a chave privada; o receptor a descriptografa com a chave pública e compara os hashes.
    • Descrever um dígito verificador como verificação, ou uma verificação de paridade como validação. O dígito verificador é uma regra de validação na entrada; paridade e somas de verificação verificam uma transferência.
    • Escrever que um vírus "envia dados para terceiros" e spyware "replica". O que replica é o vírus; o que grava é o spyware.
  • 7

    Ética e Propriedade

    Assistir aula
    7.1

    Ética para profissionais de computação

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão da necessidade e propósito da ética como profissional de computação Compreenda a importância de se associar a um corpo ético profissional incluindo BCS (British Computer Society), IEEE (Institute of Electrical and Electronic Engineers)
    Demonstre compreensão da necessidade de agir eticamente e do impacto de agir ética ou eticamente para uma situação dada
    Demonstre compreensão da necessidade de legislação sobre direitos autorais
    Demonstre compreensão dos diferentes tipos de licenciamento de software e justifique o uso de uma licença para uma situação dada Licenças devem incluir Free Software Foundation, Open Source Initiative, shareware e software comercial
    Demonstre compreensão de Inteligência Artificial (AI) Compreenda o impacto da IA incluindo questões sociais, económicas e ambientais
    Compreenda as aplicações da IA

    Fonte: Programa Cambridge International

    Um profissional de TI é alguém cujo trabalho — software, sistemas, redes, dados — afeta outras pessoas. Como o trabalho é técnico, outros muitas vezes não conseguem julgar se foi bem ou honestamente feito. Portanto, a profissão segue ética compartilhada 伦理 (princípios para boa conduta).

    Por que a ética importa

    • confiança — usuários e empregadores confiam nos profissionais para atuarem em seu interesse. Sem essa confiança, o software perde credibilidade.
    • impacto — software opera dispositivos médicos, bancos, veículos. Trabalho descuidado ou desonesto pode prejudicar pessoas.

    Organizações profissionais (BCS, ACM, IEEE) publicam códigos de ética para membros.

    Uma parede de monitores de CCTV em uma sala de controle
    CCTV levanta preocupações de privacidade — um dos problemas éticos que um profissional de TI deve ponderar
    Uma pilha de equipamentos eletrônicos descartados
    Lixo eletrônico (e-waste) é um custo ambiental crescente da computação
    Um diagrama de hub com bem-estar público no centro, ligado a preocupações de saúde e segurança, interesse público, benefícios para o público e preocupações do público
    O desenvolvimento de software afeta o bem-estar público de várias maneiras

    Princípios típicos

    • interesse público em primeiro lugar — proteger a segurança e o bem-estar daqueles afetados.
    • honestidade e competência — ser honesto sobre suas habilidades; não reclamar expertise que não possui.
    • confidencialidade 保密性 — proteger informações privadas de clientes e empregadores.
    • evitar conflitos de interesses 利益冲突 — não aceitar trabalho onde seu interesse conflita com o do cliente.
    • manter suas habilidades atualizadas; respeitar propriedade intelectual 知识产权 e privacidade 隐私; tratar colegas com justiça.

    Entrando em uma organização profissional

    O programa cita duas: a BCS (British Computer Society) e a IEEE (Institute of Electrical and Electronics Engineers). Ambas publicam um código de conduta 行为准则 que os membros concordam em seguir. Os benefícios de entrar, nas palavras do programa: um conjunto de diretrizes éticas para seguir, para que as decisões não fiquem à critério pessoal; treinamento, conferências e publicações que mantêm o membro atualizado; aconselhamento e suporte, incluindo ajuda jurídica, quando um problema surge; e status profissional reconhecido, para que empregadores e clientes confiem no trabalho do membro. As consequências de não entrar: sem orientação para decisões éticas, o programador pode agir de forma antiética sem perceber; menos credibilidade com empregadores e clientes, tornando mais difícil ganhar trabalhos; sem apoio em disputas; e ficar desatualizado com desenvolvimentos e leis. O propósito de um código de conduta (duas marcas): criar um ambiente de trabalho seguro, respeitoso e profissional, e garantir que cada funcionário entenda o que é esperado e as consequências de suas ações.

    Exemplo resolvido. Explique por que um programador precisa agir eticamente com colegas e com o público.

    Colegas: tratá-los com justiça e sem discriminação; respeitar seu trabalho, ideias e informações confidenciais; ser honesto sobre erros e dar crédito onde for devido; apoiar seu desenvolvimento em vez de sabotá-lo. O público: proteger seus dados pessoais e privacidade; produzir software seguro, confiável e devidamente testado, pois falhas podem causar danos; ser honesto sobre o que o software pode fazer; assumir apenas trabalho dentro de sua competência; obedecer à lei e considerar os efeitos mais amplos na sociedade e no meio ambiente. Cada lado ganha pontos por uma razão e sua consequência, não apenas pela palavra "justiça".

    Agir eticamente vs antieticamente

    Agir eticamente protege usuários, fortalece a reputação, reduz riscos jurídicos e constrói confiança. Agir antieticamente (pular testes, esconder bugs, usar dados indevidamente) pode prejudicar usuários reais, levar a demissão ou ação judicial, danificar a reputação e erodir a confiança na tecnologia em geral.

    Quando você enfrenta uma decisão limítrofe: identifique cujos interesses estão envolvidos, verifique o código de ética e a lei, avalie as consequências, pergunte a um sênior de confiança e escolha a opção que proteja os usuários acima da conveniência de curto prazo.

    Exemplo resolvido. A nova ferramenta de contratação de IA da sua equipe classifica currículos dez vezes mais rápido, mas você nota que rejeita mais candidatos mais velhos. Lançá-la agrada ao seu gerente, mas trata um grupo injustamente. A escolha ética é segurá-la até que o viés seja corrigido — o interesse público e a equidade vêm antes da conveniência de curto prazo.

    A ética também se aplica aos usuários. Um estudante que conecta um computador pessoal à rede da escola deve respeitar a privacidade e os dados de outras pessoas, não usar redes sociais de forma inadequada ou bullizar outros, não baixar ou compartilhar material protegido por direitos autorais, não introduzir malware ou tentar acessar sistemas aos quais não tem permissão, e usar a rede para o fim para o qual foi fornecida. Uma resposta de "dê três considerações éticas" lista três dessas.

    Explorar

    Laboratório de risco e responsabilidade

    Classifique exemplos pela regra, risco ou proteção envolvidos.

    7.1

    Direitos Autorais

    Direito autoral 版权 é o direito legal do criador de uma obra original de controlar como ela é copiada, distribuída, modificada e executada. Aplica-se automaticamente (sem registro) a código-fonte, software, documentos, imagens, áudio e vídeo.

    Sem direito autoral, qualquer um poderia copiar software livremente, o desenvolvedor não seria pago e o plágio seria legal. Com direito autoral, desenvolvedores podem lucrar com seu trabalho (incentivando mais software), usuários sabem quem o criou, e a reutilização ocorre nos termos do desenvolvedor através de licenças. O direito autoral dura muito tempo (geralmente 70 anos após a morte do criador). Ideias gerais e algoritmos não são cobertos por direito autoral, mas podem ser cobertos por uma patente 专利.

    Por que um programador deveria registrar o copyright de um programa, nas palavras do programa: ser identificado como proprietário e autor (reconhecimento formal de propriedade); para que haja consequências legais se alguém copiar ou roubá-lo; para restringir competidores de vender o mesmo trabalho; e para poder ganhar dinheiro licenciando-o. O direito autoral aplica-se ao programa conforme escrito; um programa diferente que faz o mesmo trabalho não o infringe.

    Direitos autorais são automáticos sem registro e duram cerca de 70 anos após a morte do criador, abrangendo código, imagens e documentos; uma patente deve ser apresentada e dura cerca de 20 anos, abrangendo invenções e algoritmos
    Direito autoral é automático e de longa duração; uma patente deve ser solicitada e dura cerca de 20 anos
    Explorar

    Laboratório de risco e responsabilidade

    Classifique exemplos pela regra, risco ou proteção envolvidos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    copyright/ˈkɒpɪraɪt/ 版权 bǎn quán
    patent/ˈpeɪtənt/ 专利 zhuān lì
    software licence/ˈsɒftweə ˈlaɪsəns/ 软件许可证 ruǎn jiàn xǔ kě zhèng
    7.1

    Licenças de Software

    Uma licença de software 软件许可证 é um contrato que concede permissão para usar software nos termos do proprietário; escolher e aplicar uma é chamado de licenciamento de software.

    Comercial (proprietary)

    • software comercial é vendido: você compra uma licença; o software é usado apenas dentro de seus termos.
    • o código-fonte não é fornecido (um produto proprietary 专有); você não pode modificá-lo ou redistribuí-lo.
    • exemplos: Microsoft Office, Adobe Photoshop, a maioria dos jogos.

    Usado quando o desenvolvedor quer receita por usuário e manter controle do código.

    Open-source

    • o código-fonte é público; usuários podem ler, modificar e redistribuí-lo (open-source 开源).
    • licenças permissivas (MIT, BSD) permitem quase qualquer uso; licenças copyleft 著佐权 (GPL) exigem que versões modificadas sejam lançadas sob a mesma licença ("share-alike").
    • a Free Software Foundation (FSF) e a Open Source Initiative (OSI) promovem e aprovam licenças open-source.

    O programa cita ambos, e eles são marcados como respostas distintas. Software Livre (termo da FSF) significa livre como em liberdade, não preço: o usuário pode executar o programa para qualquer finalidade, estudar e alterá-lo (portanto o código-fonte deve estar disponível), redistribuir cópias e distribuir versões modificadas; uma taxa ainda pode ser cobrada por uma cópia. Open Source (definição da OSI) exige que o código-fonte esteja disponível, que o programa possa ser modificado e redistribuído, e que a licença não discrimine qualquer pessoa ou campo de uso. "Identifique dois tipos de licença que permitam que outras pessoas editem e redistribuam o programa" é respondido com estes dois.

    • exemplos: Linux, Python, Apache.

    Usado quando o desenvolvedor quer que o software seja amplamente usado e melhorado pela comunidade.

    Freeware e shareware

    • freeware 免费软件 — gratuito, sem código-fonte, pode ser redistribuído mas não modificado (Acrobat Reader, WhatsApp).
    • shareware 共享软件 — gratuito por um período de teste, depois você paga para continuar usando; sem código-fonte.

    As descrições do programa: shareware é distribuído gratuitamente para teste (tempo limitado ou recursos limitados) e o usuário paga para continuar usando a versão completa; software comercial é vendido por uma taxa, o código-fonte não é fornecido, a licença protege a propriedade intelectual do desenvolvedor, e a taxa geralmente compra suporte e atualizações. Benefícios do shareware para o programador: usuários podem testar o programa antes de comprar, então são mais propensos a comprar; espalha-se amplamente com quase nenhum custo de publicidade; e aqueles que o mantêm pagam. Benefícios de uma licença comercial: o desenvolvedor ganha uma taxa por cada cópia; o código e seus direitos permanecem protegidos; e a renda financia suporte, atualizações e desenvolvimento adicional.

    Tipo Custo Código-Fonte Redistribuir Modificar
    Comercial Pago Não Não Não
    Código aberto Gratuito Sim Sim Frequentemente, com condições
    Freeware Gratuito Não Sim Não
    Shareware Teste grátis, depois pago Não Às vezes Não
    Uma árvore de decisão para escolher uma licença: se você quer vendê-la ou manter o controle, escolha comercial; caso contrário, se compartilhar o código-fonte, escolha open-source; caso contrário, se for gratuito para sempre, escolha freeware, senão shareware (uma avaliação gratuita e depois paga)
    Escolher uma licença baseado no objetivo do desenvolvedor

    Para justificar uma escolha de licença, conecte-a ao objetivo do desenvolvedor (receita, alcance, comunidade), às necessidades do usuário (custo, personalização) e ao caso de uso.

    Exemplo resolvido. Um programador escreveu um jogo para vender ao público. Identifique a licença mais adequada e justifique-a.

    Uma licença comercial: o jogo é vendido por uma taxa, então o programador ganha dinheiro de cada cópia; o código-fonte não é liberado, então ninguém pode copiar o jogo ou alterá-lo e vendê-lo como próprio; a licença protege a propriedade intelectual; e compradores recebem atualizações e suporte. Open source não se encaixaria, porque o código-fonte estaria disponível, então o jogo poderia ser copiado, alterado e redistribuído sem pagamento.

    Exemplo resolvido. Um programa ajuda os consumidores lendo rótulos de produtos em voz alta. Explique por que uma licença de código aberto pode não ser adequada.

    O código-fonte estaria acessível, portanto poderia ser alterado; uma versão alterada poderia exibir informações incorretas sobre o produto, fazendo com que os compradores comprem o item errado; e o programador perderia controle sobre a qualidade e segurança do que é distribuído sob o nome do programa. No sentido oposto, programas são lançados como código aberto para que outros desenvolvedores possam melhorá-los e estendê-los, para que sejam adotados amplamente sem custo, e para que usuários possam adaptá-los às suas próprias necessidades.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    proprietary/prəˈpraɪətəri/ 专有 zhuān yǒu
    open-source/ˈəʊpən sɔːs/ 开源 kāi yuán
    copyleft/ˈkɒpɪleft/ 著佐权 zhù zuǒ quán
    freeware/ˈfriːweə/ 免费软件 miǎn fèi ruǎn jiàn
    shareware/ˈʃeəweə/ 共享软件 gòng xiǎng ruǎn jiàn
    artificial intelligence/ˌɑːtɪˈfɪʃl ɪnˈtelɪdʒəns/ 人工智能 rén gōng zhì néng
    machine learning/məˈʃiːn ˈlɜːnɪŋ/ 机器学习 jī qì xué xí
    7.1

    Inteligência Artificial (AI)

    Inteligência artificial 人工智能 constrói sistemas que realizam tarefas antes consideradas que exigiam inteligência humana — reconhecimento de fala e imagens, tradução, jogos, direção.

    A maioria da IA moderna usa aprendizado de máquina 机器学习 — algoritmos que melhoram em uma tarefa aprendendo padrões em grandes quantidades de dados, em vez de serem programados passo a passo. Deep learning 深度学习, usando redes neurais 神经网络 com muitas camadas, é a abordagem líder hoje.

    Exemplos cotidianos

    Tarefas de IA dividem-se em dois tipos — compreender entrada, e produzir saída ou decisões.

    Compreender entrada:

    • reconhecimento de fala 语音识别 — palavras faladas para texto (assistentes de voz).
    • reconhecimento de imagem 图像识别 — encontrar objetos, rostos ou texto em imagens.

    Produzindo saída ou decisões:

    • tradução automática 机器翻译 — tradução automática entre idiomas.
    • sistemas de recomendação 推荐系统 — sugerir produtos, vídeos ou música.
    • veículos autônomos 自动驾驶汽车 e robôs.

    Um cenário comum de prova: um programa lê um rótulo com uma câmera, traduz e o lê em voz alta — usando reconhecimento óptico de caracteres 光学字符识别 para encontrar as palavras, tradução automática para convertê-las e síntese de voz 文本转语音 para o áudio.

    Lendo um rótulo estrangeiro em voz alta: a imagem da câmera vai para OCR para encontrar as palavras, depois para tradução automática, depois para síntese de voz para o áudio
    Cenário comum: OCR → tradução automática → síntese de voz lê um rótulo estrangeiro em voz alta

    Uma resposta de quatro pontos "explique como a IA é usada" segue o pipeline passo a passo: reconhecimento de imagem (OCR) analisa os pixels da fotografia para localizar os caracteres; os padrões de pixels são convertidos em caracteres e palavras individuais; a tradução automática converte as palavras no idioma do usuário; e a síntese de voz produz a saída falada. Cada etapa vale um ponto.

    Benefícios

    • acessibilidade — IA de fala/imagens ajuda usuários com deficiências; tradução ajuda falantes não nativos.
    • produtividade — automatizar tarefas repetitivas libera pessoas para trabalho criativo.
    • suporte à decisão — IA identifica padrões em grandes conjuntos de dados (diagnóstico médico, detecção de fraudes).
    • sempre disponível e personalizada para cada usuário.

    Impactos: sociais, econômicos, ambientais

    O programa de estudos pede o impacto da IA sob três tópicos, e uma questão nomeia um deles. Dê o impacto e sua consequência.

    • Social: benefícios — um programa de leitura de rótulos ajuda pessoas com deficiência visual, pessoas que não conseguem ler o idioma e pessoas com dificuldades de leitura; reconhecimento facial em aeroportos acelera verificações de identidade e pode impedir a entrada de pessoas procuradas. Danos — o reconhecimento facial pode identificar erroneamente pessoas e rastrear todos sem consentimento, perdendo a privacidade; alunos que usam IA para fazer lições de casa podem não desenvolver raciocínio e habilidades de resolução de problemas, podem depender dela em vez de aprender e podem perder a colaboração e a comunicação face a face que o trabalho conjunto proporciona.
    • Econômico: um módulo de diagnóstico de falhas de IA em uma oficina de reparo diagnostica falhas mais rápido e com mais precisão, então mais veículos são reparados por dia e os custos caem; mas menos mecânicos qualificados podem ser necessários, então empregos são perdidos, e o módulo deve ser comprado e mantido. De forma geral, a IA aumenta a produtividade e cria novos empregos em alguns campos enquanto remove empregos rotineiros em outros.
    • Ambiental: treinar e executar modelos grandes consome muita eletricidade e água para resfriamento em data centers, e o hardware se torna lixo eletrônico; por outro lado, a IA é usada para reduzir o consumo de energia em edifícios, otimizar o transporte e monitorar o meio ambiente.
    • Ética (a pergunta da sala de aula): uma IA que corrige trabalhos ou vigia alunos deve ser justa com cada aluno, não pode vazar seus dados, deve ser explicável quando toma uma decisão sobre eles e não deve substituir o julgamento de um professor onde isso importa.

    Preocupações

    • viés 偏见 — padrões injustos nos dados de treinamento tornam-se decisões injustas de IA (contratação, empréstimos).
    • substituição de empregos — a IA pode substituir alguns papéis.
    • privacidade — o treinamento frequentemente usa grandes quantidades de dados pessoais.
    • transparência — modelos grandes são "caixas pretas", difíceis de explicar.
    • responsabilidade — quando a IA está errada, quem é responsável: desenvolvedor, usuário ou operador?
    • mau uso — deepfakes, desinformação, vigilância.
    Dados de treinamento tendenciosos levam o modelo a aprender o viés, que então produz decisões injustas, como em contratação ou empréstimos
    Como o viés entra na IA: dados tendenciosos → modelo tendencioso → decisões injustas

    Profissionais devem entender os limites da IA que constroem, informar os usuários e reduzir danos.

    Explorar

    Laboratório de conceitos de computação

    Classifique exemplos concretos pelo conceito de computação que eles demonstram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    ethics/ˈeθɪks/ 伦理 lún lǐ
    privacy/ˈprɪvəsi/ 隐私 yǐn sī
    confidentiality/ˌkɒnfɪˌdenʃiˈæləti/ 保密性 bǎo mì xìng
    conflicts of interest/ˈkɒnflɪkts ɒv ˈɪntrest/ 利益冲突 lì yì chōng tū
    intellectual property/ˌɪntəˈlektʃuːəl ˈprɒpəti/ 知识产权 zhī shí chǎn quán
    code of conduct/kəʊd ɒv ˈkɒndʌkt/ 行为准则 xíng wéi zhǔn zé
    bias/ˈbaɪəs/ 偏见 piān jiàn
    Deep learning/diːp ˈlɜːnɪŋ/ 深度学习 shēn dù xué xí
    neural networks/ˈnjuːrəl ˈnetwɜːks/ 神经网络 shén jīng wǎng luò
    speech recognition/spiːtʃ ˌrekəɡˈnɪʃn/ 语音识别 yǔ yīn shí bié
    image recognition/ˈɪmɪdʒ ˌrekəɡˈnɪʃn/ 图像识别 tú xiàng shí bié
    machine translation/məˈʃiːn trænˈsleɪʃn/ 机器翻译 jī qì fān yì
    recommendation systems/ˌrekəmenˈdeɪʃn ˈsɪstəmz/ 推荐系统 tuī jiàn xì tǒng
    autonomous vehicles/ɔːˈtɒnəməs ˈvɪəklz/ 自动驾驶汽车 zì dòng jià shǐ qì chē
    optical character recognition/ˈɒptɪkl ˈkærɪktə ˌrekəɡˈnɪʃn/ 光学字符识别 guāng xué zì fú shí bié
    text-to-speech/tekst tə spiːtʃ/ 文本转语音 wén běn zhuǎn yǔ yīn
    7.1

    Definições aceitas pelo examinador

    Uma questão de definição é marcada contra texto fixo. Aprenda estes exatamente.

    Termo Definição
    ética os princípios morais que regem como uma pessoa se comporta, em uma profissão os padrões estabelecidos em seu código de conduta
    código de conduta as regras que uma organização ou corpo profissional estabelece para como seus membros devem se comportar
    direitos autorais o direito legal do criador de uma obra original de controlar como ela é copiada, distribuída e modificada
    licença de software o acordo legal que especifica como um software pode ser usado, copiado e distribuído
    software comercial software vendido por taxa, sem código-fonte, sob uma licença que protege a propriedade intelectual do desenvolvedor
    software livre (FSF) software cujos usuários são livres de executá-lo, estudar, alterar e redistribuí-lo, portanto seu código-fonte está disponível
    código aberto (OSI) software cujo código-fonte está disponível e que pode ser modificado e redistribuído sob sua licença
    shareware software distribuído gratuitamente para período de teste ou com recursos limitados, após o qual o usuário paga para continuar
    freeware software que é gratuito para uso e cópia, mas cujo código-fonte não é liberado e não pode ser modificado
    inteligência artificial sistemas de computador que realizam tarefas que normalmente exigem inteligência humana, como reconhecimento de imagens e fala
    aprendizado de máquina uma forma de IA em que um sistema melhora em uma tarefa aprendendo padrões em dados em vez de programação explícita
    7.1

    Dicas de prova

    • Responda questões de ética contra um código de conduta profissional (interesse público, competência, honestidade), não opinião pessoal.
    • Distinga direitos autorais (protege a expressão) de uma patente (protege uma invenção).
    • Compare licenças de software: proprietárias, open-source, freeware, shareware e FOSS.

    Erros comuns

    • Dar uma opinião pessoal ("é errado") em vez de uma razão com consequência ("software defeituoso pode prejudicar usuários, então deve ser testado").
    • Tratar software livre e freeware como a mesma coisa. Software livre trata-se da liberdade de estudar e alterar o código; freeware é meramente gratuito.
    • Dizer que código aberto significa gratuito. Significa que o código-fonte está disponível e pode ser modificado e redistribuído; uma taxa ainda pode ser cobrada.
    • Escrever que direitos autorais devem ser registrados. Eles se aplicam automaticamente à obra conforme escrita.
    • Nomear um impacto sem sua consequência. "Perda de empregos" pontua quando é vinculado ao motivo: a IA faz o diagnóstico, então menos mecânicos são necessários.
    • Descrever o que é IA em vez de como é usada. Os pontos são para as etapas: reconhecer, converter, traduzir, falar.
  • 8

    Bancos de Dados

    Assistir aula
    8.1

    Armazenamento baseado em arquivos e seus limites

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão das limitações do uso de uma abordagem baseada em ficheiros para o armazenamento e recuperação de dados
    Descreva as características de uma base de dados relacional que abordam as limitações de uma abordagem baseada em ficheiros
    Demonstre compreensão e utilize a terminologia associada a um modelo de base de dados relacional Incluindo entidade, tabela, registo, campo, tupla, atributo, chave primária, chave candidata, chave secundária, chave estrangeira, relação (um-para-muitos, um-para-um, muitos-para-muitos), integridade referencial, indexação
    Utilize um diagrama entidade-relacionamento (E-R) para documentar um projeto de base de dados
    Demonstre compreensão do processo de normalização Primeira Forma Normal (1NF), Segunda Forma Normal (2NF) e Terceira Forma Normal (3NF)
    Explique porque um conjunto dado de tabelas de base de dados está ou não em 3NF
    Produza um projeto de base de dados normalizado para uma descrição de uma base de dados, um conjunto dado de dados ou um conjunto dado de tabelas

    Fonte: Programa Cambridge International

    Antes dos bancos de dados, os programas armazenavam dados em arquivos planos 平面文件 — geralmente um arquivo por programa. Isso é fine para pequenos dados, mas falha em escala.

    Uma mão procurando em um gabinete de arquivamento de cartões
    O armazenamento baseado em arquivos mantém dados em arquivos separados, como papéis em um arquivo — difícil de pesquisar e fácil de duplicar

    Limitações

    • redundância de dados 数据冗余 — os mesmos dados (o endereço de um cliente) estão em vários arquivos, um por programa, desperdiçando armazenamento e exigindo atualização de todas as cópias.
    • inconsistência de dados 数据不一致 — quando uma cópia é atualizada e outra não, os arquivos divergem e ninguém sabe qual está correta.
    • dependência de dados — cada programa é escrito para o layout exato de seus arquivos; alterar o comprimento de um campo ou adicionar um campo exige reescrever todo programa que lê o arquivo.
    • sem acesso compartilhado — um arquivo é bloqueado enquanto um programa o usa, impedindo que usuários trabalhem nos dados simultaneamente.
    • integridade fraca 完整性 — nenhuma regra central impede valores inválidos ou links para clientes inexistentes; segurança fraca — o acesso é por arquivo, não por campo; e consultas entre arquivos exigem um novo programa cada vez.
    Os programas Folha de Pagamento e Vendas cada um liga ao seu próprio arquivo de dados separado, então o campo Número do Funcionário é armazenado duas vezes
    A abordagem baseada em arquivos: cada programa mantém seus próprios arquivos

    Um banco de dados relacional 关系数据库 corrige isso armazenando dados em tabelas gerenciadas por um único software (DBMS) que todos os programas usam.

    Um SGBD segurando tabelas design, regras de validação, direitos de acesso e os dados, com um único banco de dados compartilhado, usado tanto pelos aplicativos de folha de pagamento quanto de vendas
    A abordagem de banco de dados: um DBMS serve a todos os programas

    Por que um banco de dados relacional é melhor — a resposta de três pontos. Cada item de dado é armazenado uma única vez, em uma tabela, e as tabelas são ligadas por chaves, não havendo redundância nem inconsistência; os dados são independentes dos programas, que solicitam ao SGBD o que precisam e permanecem inalterados quando a estrutura muda; e o SGBD aplica regras de integridade, controla o acesso por usuário e por campo, permite múltiplos usuários simultaneamente e executa qualquer consulta sem a necessidade de escrever um novo programa.

    Exemplo resolvido. Uma oficina armazena seus clientes, dispositivos e serviços de reparo usando uma abordagem baseada em arquivos, com um arquivo por programa. Cite três problemas isso causa e descreva como um banco de dados relacional os eliminaria.

    O nome e o número de telefone do cliente estão armazenados no arquivo de reparos e também no arquivo de faturas (redundância); quando um cliente muda de número, um arquivo é atualizado e o outro não (inconsistência); e quando a loja quer um novo relatório — reparos por técnico — um novo programa precisa ser escrito para ler os arquivos (sem consultas ad hoc). Em um banco de dados relacional, o cliente é armazenado uma única vez em uma tabela CUSTOMER e referenciado pelo CustomerID na tabela REPAIR, então a alteração é feita uma única vez e vista em todos os lugares; o relatório é uma única consulta SQL.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    DBMS/ˌdiː biː em ˈes/ 数据库管理系统 shù jù kù guǎn lǐ xì tǒng
    8.1

    Modelo relacional — termos

    • tabela 表 (relação) — uma grade de linhas e colunas; uma tabela por tipo de entidade 实体 (ex: CUSTOMER).
    • registro 记录 (linha, também chamado de tupla 元组) — uma linha; uma instância da entidade.
    • campo 字段 (coluna, também chamado de atributo 属性) — uma coluna; uma informação sobre cada registro.
    • chave primária 主键 — um campo (ou campos) que identifica unicamente cada registro; nunca nulo ou duplicado.
    • chave estrangeira 外键 — um campo cujo valor corresponde à chave primária de outra tabela, ligando as duas.
    • chave composta 复合键 — uma chave primária formada por dois ou mais campos juntos.
    • chave candidata 候选键 — qualquer campo(s) que poderia ser a chave primária.
    • chave secundária 次键 — um campo não primário que é indexado para busca rápida.
    • indexação 索引 — criar um índice em um campo para que buscas e junções sejam mais rápidas.
    • integridade referencial 参照完整性 — todo valor de chave estrangeira deve corresponder a uma chave primária existente (nenhum registro órfão).

    Uma tabela é escrita em notação resumida com a chave primária sublinhada e chaves estrangeiras anotadas:

    CUSTOMER(CustomerID, Name, Phone)
    ORDER(OrderID, CustomerID, OrderDate)   -- CustomerID is FK → CUSTOMER
    
    Duas tabelas ligadas por uma chave estrangeira: a tabela CUSTOMER tem a chave primária CustomerID; a tabela ORDER tem sua própria chave primária OrderID mais uma chave estrangeira CustomerID cujo valor corresponde a um CustomerID na CUSTOMER
    Uma chave estrangeira liga duas tabelas: ORDER.CustomerID corresponde à chave primária CUSTOMER.CustomerID

    Exemplo resolvido. Explique o significado de entidade, chave primária e integridade referencial em um banco de dados relacional, e complete a tabela de termo ↔ descrição para tupla e atributo.

    Uma entidade é algo sobre o qual dados são armazenados — uma pessoa, objeto ou evento — que se torna uma tabela. Uma chave primária é o atributo (ou combinação de atributos) que identifica unicamente cada registro em uma tabela. Integridade referencial significa que todo valor de chave estrangeira deve corresponder ao valor de uma chave primária na tabela a que se refere, para que um registro não possa apontar para um que não existe. Uma tupla é uma linha de uma tabela (um registro); um atributo é uma coluna (um campo). Aprenda os pares: tabela/relação, registro/tupla, campo/atributo.

    Explorar

    Leia uma tabela relacional com SELECT

    Uma tabela relacional é apenas linhas (registros) e colunas (campos). WHERE mantém as linhas que correspondem a uma condição; SELECT então mantém apenas as colunas que você pediu.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    table/ˈteɪbl/ 表 biǎo
    8.1

    Diagramas de entidade-relacionamento (E-R)

    Um diagrama de entidade-relacionamento 实体关系图 mostra a estrutura: cada entidade é um retângulo, cada relacionamento é uma linha, com a cardinalidade 基数 marcada em cada extremidade:

    • um-para-um (1:1).
    • um-para-muitos 一对多 (1:M) — cada Cliente tem muitos Pedidos; cada Pedido tem um Cliente.
    • muitos-para-muitos (M:N) — Estudantes frequentam muitos Cursos, e Cursos têm muitos Estudantes.
    Um diagrama E-R com uma entidade STUDENT e uma entidade CLASS unidas por uma linha de relacionamento, pé-de-galinha de muitos na extremidade do estudante e uma barra de um na extremidade da classe
    Um diagrama E-R: uma classe tem muitos estudantes
    Símbolos de extremidade de linha 'crow's-foot' para um, muitos, um e apenas um, zero ou um, um ou muitos e zero ou muitos
    Símbolos de pé-de-galinha para a cardinalidade de um relacionamento

    Um relacionamento muitos-para-muitos não pode ser armazenado diretamente. Divida-o em dois relacionamentos um-para-muitos através de uma tabela de ligação 连接表 contendo as duas chaves estrangeiras:

    ENROLMENT(StudentID, CourseID, EnrolmentDate)
    
    Um relacionamento muitos-para-muitos entre STUDENT e COURSE armazenado como dois relacionamentos um-para-muitos através de uma tabela de ligação ENROLMENT contendo StudentID e CourseID
    Uma tabela de ligação resolve um relacionamento muitos-para-muitos em dois relacionamentos um-para-muitos

    Desenhando o diagrama E-R para um conjunto dado de tabelas. Cada tabela torna-se uma entidade. Um relacionamento existe sempre que uma tabela contenha uma chave estrangeira para outra; ele vai da tabela que contém a chave estrangeira (a extremidade muitos) para a tabela cuja chave primária ela é (a extremidade um). Uma tabela com duas chaves estrangeiras e nenhuma outra identidade geralmente é uma tabela de ligação resolvendo um relacionamento muitos-para-muitos. Roteie cada linha com o tipo de relacionamento.

    Um diagrama E-R para um banco de dados de oficina com quatro entidades: CUSTOMER um-para-muitos DEVICE, DEVICE um-para-muitos REPAIR e TECHNICIAN um-para-muitos REPAIR, com notação de pé-de-galinha e chaves primárias e estrangeiras mostradas
    Desenhando o diagrama a partir das tabelas: toda chave estrangeira é um relacionamento um-para-muitos, com o "muitos" na tabela que a contém

    Exemplo resolvido. Uma oficina possui as tabelas CUSTOMER(CustomerID, Name, Phone), DEVICE(DeviceID, CustomerID, Type, Model), TECHNICIAN(TechnicianID, Name) e REPAIR(RepairID, DeviceID, TechnicianID, RepairDate, Cost). Identifique os relacionamentos e seus tipos.

    DEVICE contém CustomerID, então CUSTOMER–DEVICE é um-para-muitos (um cliente, muitos dispositivos). REPAIR contém DeviceID, então DEVICE–REPAIR é um-para-muitos; também contém TechnicianID, então TECHNICIAN–REPAIR é um-para-muitos. Não há linha direta CUSTOMER–REPAIR: o link passa por DEVICE. Três linhas, três pés-de-galinha, todos nas extremidades REPAIR ou DEVICE.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    cardinality/ˌkɑːdɪˈnælɪti/ 基数 jī shù
    one-to-many/wʌn tə ˈmeni/ 一对多 yī duì duō
    link table/lɪŋk ˈteɪbl/ 连接表 lián jiē biǎo
    8.1

    Normalização

    Normalização 规范化 organiza tabelas para reduzir redundância e inconsistência, passando pelas formas normais 范式 em ordem.

    • Primeira forma normal (1NF) — cada campo contém um único valor (atômico 原子), sem grupos repetidos, e possui uma chave primária.
    • Segunda forma normal (2NF) — em 1NF, e cada campo não-chave depende da totalidade da chave primária (importa apenas para uma chave composta).
    • Terceira forma normal (3NF) — em 2NF, e cada campo não-chave depende apenas da chave primária, não de outro campo não-chave (não há dependência transitiva 传递依赖).

    Um design 3NF armazena cada fato uma única vez, assim anomalias de inserção/atualização/exclusão desaparecem. A contrapartida é mais tabelas e mais junções. Almeje 3NF.

    Para produzir um design 3NF: encontre as entidades e seus atributos; escolha uma chave primária para cada; divida campos repetidos/não-atômicos (1NF); divida campos que dependem de parte de uma chave composta (2NF); divida campos que dependem transitivamente da chave (3NF); adicione chaves estrangeiras para os relacionamentos.

    Normalização: uma tabela onde o nome e o telefone do cliente se repetem em cada pedido são divididos em uma tabela ORDER separada e uma tabela CUSTOMER, para que cada fato seja armazenado uma única vez
    A normalização remove a redundância dividindo dados repetidos em sua própria tabela

    Exemplo resolvido. A tabela ORDER(OrderID, CustomerID, CustomerName, ProductID, Quantity) tem a chave primária composta (OrderID, ProductID). Normalize-a para 3NF. Teste cada campo não-chave contra a chave. Quantity depende de ambos OrderID e ProductID, o que está correto. Mas CustomerID depende de OrderID sozinho - apenas parte da chave composta. Isso é uma dependência parcial, então a tabela não está em 2NF. Divida-a em ORDER_LINE(OrderID, ProductID, Quantity) e ORDER(OrderID, CustomerID, CustomerName). Agora teste 3NF: naquela nova tabela ORDER, CustomerName depende de CustomerID, que não é a chave - uma dependência transitiva. Divida novamente: ORDER(OrderID, CustomerID) e CUSTOMER(CustomerID, CustomerName). Nomeie a dependência que viola cada forma (parcial viola 2NF, transitiva viola 3NF); "ela tem dados repetidos" descreve o sintoma e não ganha pontos.

    As três perguntas para fazer a qualquer tabela. Cada célula tem um único valor, sem grupo repetido? Se não, não está em 1NF. Se a chave for composta, todo campo não-chave depende da chave inteira? Se algum campo depender de parte dela, há uma dependência parcial 部分依赖 e a tabela não está em 2NF. Todo campo não-chave depende apenas da chave? Se um campo depender de outro campo não-chave, há uma dependência transitiva e a tabela não está em 3NF. Uma resposta "explique por que a tabela não está em 3NF" nomeia a dependência e os campos envolvidos.

    Normalizando uma tabela de aluguel de carros em três passos: o grupo repetido de carros é removido para 1NF, os detalhes do carro que dependem de CarReg sozinho são movidos para uma tabela CAR para 2NF, e os detalhes do cliente que dependem de CustomerID são movidos para uma tabela CUSTOMER para 3NF
    1NF remove o grupo repetido, 2NF a dependência parcial, 3NF a dependência transitiva

    Exemplo resolvido. Uma loja de aluguel de carros registra cada aluguel como RENTAL(RentalID, RentalDate, CustomerID, CustomerName, CustomerPhone, CarReg, CarModel, DailyRate, Days), onde um aluguel pode incluir vários carros. Explique por que a tabela não está normalizada e produza um design 3NF.

    Não em 1NF: os campos de carro CarReg, CarModel, DailyRate, Days formam um grupo repetido — um aluguel tem vários carros. Mova-os para RENTAL_CAR(RentalID, CarReg, CarModel, DailyRate, Days) com a chave composta (RentalID, CarReg). Não em 2NF: em RENTAL_CAR, CarModel e DailyRate dependem de CarReg sozinho — uma dependência parcial. Mova-os para CAR(CarReg, CarModel, DailyRate), deixando RENTAL_CAR(RentalID, CarReg, Days). Não em 3NF: em RENTAL, CustomerName e CustomerPhone dependem de CustomerID, um campo não-chave — uma dependência transitiva. Mova-os para CUSTOMER(CustomerID, CustomerName, CustomerPhone), deixando RENTAL(RentalID, RentalDate, CustomerID). O design 3NF é quatro tabelas — CUSTOMER, RENTAL, RENTAL_CAR, CAR — com CustomerID, RentalID e CarReg como chaves estrangeiras; sublinhe todas as chaves primárias.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    normalisation/ˌnɔːməlaɪˈzeɪʃn/ 规范化 guī fàn huà
    normal forms/ˈnɔːml fɔːmz/ 范式 fàn shì
    atomic/əˈtɒmɪk/ 原子 yuán zi
    transitive dependency/ˈtrænsɪtɪv dɪˈpendənsi/ 传递依赖 chuán dì yī lài
    partial dependency/ˈpɑːʃl dɪˈpendənsi/ 部分依赖 bù fèn yī lài
    8.2

    Sistema de Gerenciamento de Banco de Dados (DBMS)

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão das funcionalidades fornecidas por um Sistema de Gestão de Bases de Dados (DBMS) que abordam as questões de uma abordagem baseada em ficheiros Incluindo: • gestão de dados, incluindo manutenção de um dicionário de dados • modelação de dados • esquema lógico • integridade de dados • segurança de dados, incluindo procedimentos de cópia de segurança e uso de direitos de acesso para indivíduos/grupos de utilizadores
    Demonstre compreensão de como ferramentas de software encontradas num DBMS são utilizadas na prática Incluindo o uso e propósito de: • interface de desenvolvedor • processador de consultas

    Fonte: Programa Cambridge International

    Um SGBD 数据库管理系统 gerencia o banco de dados centralmente. Funcionalidades que corrigem os limites baseados em arquivos:

    • dicionário de dados 数据字典 — uma descrição de cada tabela, campo, tipo e chave; programas consultam-no em vez de codificar a estrutura fixamente.
    • controle de redundância/consistência — cada fato armazenado uma única vez.
    • controle de acesso concorrente 并发访问 — bloqueios e transações permitem que muitos usuários trabalhem simultaneamente.
    • backup 备份 e recuperação; segurança e permissões por usuário.
    • regras de integridade — chaves, restrições de unicidade e intervalo, aplicadas centralmente.
    • transactions 事务 — um grupo de operações em que todas têm sucesso ou todas falham.
    • visualizações 视图 — tabelas virtuais que mostram a cada usuário "sua" fatia dos dados.
    • data management 数据管理 e data modelling 数据建模 — controlam como os dados são armazenados e definem sua estrutura como um logical schema 逻辑模式 (o projeto lógico, independente do armazenamento físico).
    • data integrity 数据完整性 e data security 数据安全 — impõem correção e controlam o acesso centralmente.
    • um query processor 查询处理器 executa consultas; uma developer interface 开发者接口 fornece ferramentas e APIs para construir aplicativos.

    Suas ferramentas incluem um editor de dicionário de dados, um construtor de consultas, um construtor de formulários, um gerador de relatórios, gerenciamento de usuários e um editor SQL.

    O que o dicionário de dados armazena (uma questão "listar três itens"): os nomes das tabelas; os nomes dos campos em cada tabela; o tipo de dado e o comprimento de cada campo; as chaves primárias e estrangeiras e os relacionamentos entre tabelas; regras de validação; índices; e quem pode acessar cada tabela. É metadado — dados sobre os dados — e o DBMS o usa para verificar cada consulta e cada alteração.

    Como o DBMS mantém os dados seguros (uma questão "descrever dois métodos"): authentication 身份验证 — um nome de usuário e senha, ou biométrico, antes de qualquer acesso; access rights — cada usuário ou grupo tem permissão para ler, escrever ou excluir apenas certas tabelas ou campos, muitas vezes através de uma view; encryption dos dados armazenados e dos dados enviados a eles, para que um arquivo copiado seja ilegível; backups feitos regularmente, para que os dados possam ser restaurados após perda; e um log de transações que registra quem alterou o quê.

    As duas ferramentas de software. A developer interface é o que um programador usa para construir o banco de dados e os aplicativos sobre ele: criar tabelas e definir chaves e validações, escrever consultas e SQL, e projetar formulários e relatórios, sem saber como os dados são armazenados fisicamente. O query processor recebe uma consulta (SQL de um programa ou uma consulta construída na interface), verifica-a contra o dicionário de dados, determina a maneira mais eficiente de executá-la, recupera os dados e retorna os resultados.

    Logical schema. O DBMS mantém o projeto lógico (quais tabelas e campos existem e como se relacionam) separado do physical storage (arquivos, índices, blocos de disco). Os programas trabalham com o schema lógico, para que o armazenamento físico possa ser reorganizado sem alterar um único programa — esta é a independência de dados que a abordagem baseada em arquivos não possuía.

    Um disco rígido com sua tampa removida, mostrando os pratos empilhados espelhados e o braço da cabeça de leitura/escrita repousando sobre eles
    O armazenamento físico que o schema lógico esconde: pratos girantes e cabeça de leitura/escrita de um disco rígido
    Explorar

    Laboratório de serviço de banco de dados

    Assista como um DBMS transforma uma consulta em acesso seguro e compartilhado aos dados.

    Explorar

    Laboratório de serviço de banco de dados

    Assista como um DBMS transforma uma consulta em acesso seguro e compartilhado aos dados.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    integrity/ɪnˈteɡrɪti/ 完整性 wán zhěng xìng
    relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ 关系数据库 guān xì shù jù kù
    transactions/trænˈsækʃnz/ 事务 shì wù
    backup/ˈbækʌp/ 备份 bèi fèn
    views/vjuːz/ 视图 shì tú
    data management/ˈdeɪtə ˈmænɪdʒmənt/ 数据管理 shù jù guǎn lǐ
    data modelling/ˈdeɪtə ˈmɒdəlɪŋ/ 数据建模 shù jù jiàn mó
    logical schema/ˈlɒdʒɪkl ˈskiːmə/ 逻辑模式 luó jí mó shì
    data integrity/ˈdeɪtə ɪnˈteɡrɪti/ 数据完整性 shù jù wán zhěng xìng
    data security/ˈdeɪtə sɪˈkjʊərɪti/ 数据安全 shù jù ān quán
    query processor/ˈkwɪərɪ ˈprəʊsesə/ 查询处理器 chá xún chǔ lǐ qì
    developer interface/dɪˈveləpə ˈɪntəfeɪs/ 开发者接口 kāi fā zhě jiē kǒu
    authentication/ɔːˌθentɪˈkeɪʃn/ 身份验证 shēn fèn yàn zhèng
    8.3

    DDL e DML

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão de que o DBMS realiza toda a criação/modificação da estrutura da base de dados utilizando sua Linguagem de Definição de Dados (DDL)
    Demonstre compreensão de que o DBMS realiza todas as consultas e manutenção de dados utilizando seu DML
    Demonstre compreensão de que o padrão da indústria para ambos DDL e DML é a Structured Query Language (SQL) Compreenda uma declaração SQL dada
    Compreenda declarações SQL dadas (DDL) e seja capaz de escrever simples declarações SQL (DDL) usando um subconjunto de declarações Criar uma base de dados (CREATE DATABASE) Criar uma definição de tabela (CREATE TABLE), incluindo a criação de atributos com tipos de dados adequados: • CHARACTER • VARCHAR(n) • BOOLEAN • INTEGER • REAL • DATE • TIME Alterar uma definição de tabela (ALTER TABLE) Adicionar uma chave primária a uma tabela (PRIMARY KEY (field)) Adicionar uma chave estrangeira a uma tabela (FOREIGN KEY (field) REFERENCES Table (Field))
    Escreva um script SQL para consultar ou modificar dados (DML) armazenados em (no máximo duas) tabelas de base de dados Consultas incluindo SELECT... FROM, WHERE, ORDER BY, GROUP BY, INNER JOIN, SUM, COUNT, AVG
    Manutenção de dados incluindo INSERT INTO, DELETE FROM, UPDATE

    Fonte: Programa Cambridge International

    SQL 结构化查询语言 (Structured Query Language) possui duas partes:

    SQL se divide em DDL (constrói a estrutura) e DML (trabalha com os dados)
    DDL constrói a estrutura do banco de dados; DML trabalha com os dados
    • Data Definition Language 数据定义语言 (DDL) — cria ou altera a estrutura (tabelas, chaves, restrições).
    • Data Manipulation Language 数据操纵语言 (DML) — trabalha com os dados (inserir, atualizar, excluir, query 查询).

    Noções básicas de DDL

    CREATE TABLE CUSTOMER (
      CustomerID INTEGER PRIMARY KEY,
      Name VARCHAR(50) NOT NULL,
      Phone VARCHAR(20)
    );
    

    Adicionar uma chave estrangeira:

    CREATE TABLE ORDER (
      OrderID INTEGER PRIMARY KEY,
      CustomerID INTEGER,
      OrderDate DATE,
      FOREIGN KEY (CustomerID) REFERENCES CUSTOMER(CustomerID)
    );
    

    Modificar e excluir:

    ALTER TABLE CUSTOMER ADD Email VARCHAR(100);
    DROP TABLE CUSTOMER;
    

    Tipos comuns: INTEGER, REAL, VARCHAR(n), CHAR(n) (também CHARACTER(n)), DATE, TIME, BOOLEAN, DECIMAL(p, s).

    Noções básicas de DML

    Consulta com SELECT:

    Uma consulta SELECT retorna apenas as linhas que correspondem à sua condição
    Uma consulta SELECT retorna apenas as linhas que correspondem à sua condição
    SELECT Name, Phone
    FROM CUSTOMER
    WHERE City = 'London'
    ORDER BY Name ASC;
    

    SELECT lista campos, FROM nomeia a tabela, WHERE filtra linhas, ORDER BY ordena.

    Um join 连接 combina duas tabelas usando um relacionamento de chave estrangeira:

    SELECT C.Name, O.OrderDate
    FROM CUSTOMER C INNER JOIN ORDER O
      ON C.CustomerID = O.CustomerID
    WHERE O.OrderDate >= '2024-01-01';
    
    Uma consulta SQL anotada linha por linha: SELECT nomeia os campos e uma coluna COUNT, FROM nomeia a primeira tabela com um alias, INNER JOIN ON conecta a segunda tabela através da chave estrangeira, WHERE mantém linhas correspondentes, GROUP BY faz uma linha por cliente, ORDER BY ordena o resultado
    As partes de uma consulta, na ordem em que devem ser escritas

    Funções agregadas 聚合函数 (COUNT, SUM, AVG, MIN, MAX) são frequentemente usadas com GROUP BY:

    SELECT CustomerID, COUNT(*) AS NumOrders
    FROM ORDER
    GROUP BY CustomerID;
    

    Inserir, atualizar, excluir:

    INSERT INTO CUSTOMER (CustomerID, Name, Phone)
    VALUES (101, 'Ada Lovelace', '020-1234-5678');
    
    UPDATE CUSTOMER SET Phone = '020-9999-0000' WHERE CustomerID = 101;
    
    DELETE FROM CUSTOMER WHERE CustomerID = 101;
    

    Sempre coloque uma cláusula WHERE em UPDATE e DELETE, ou a alteração atingirá todas as linhas.

    Dicas para SQL de exame

    • use exatamente os nomes de tabela e campo da questão.
    • cite strings com aspas simples ('Smith'); não cite números.
    • comparações: =, <, >, <=, >=, <>.
    • LIKE 'A%' corresponde a tudo que começa com A (% = qualquer string, _ = um caractere); IN (1,2,3); BETWEEN 10 AND 20.
    • combine condições com AND / OR / NOT, e termine cada statement com ponto e vírgula.

    O padrão DDL que o exame quer. Cada CREATE TABLE nomeia cada campo com seu tipo, marca a chave primária e declara cada chave estrangeira com a tabela que ela referencia; uma chave composta é declarada em sua própria linha:

    CREATE TABLE RENTAL_CAR (
      RentalID INTEGER,
      CarReg VARCHAR(8),
      Days INTEGER,
      PRIMARY KEY (RentalID, CarReg),
      FOREIGN KEY (RentalID) REFERENCES RENTAL(RentalID),
      FOREIGN KEY (CarReg) REFERENCES CAR(CarReg)
    );
    

    Exemplo resolvido. Usando CUSTOMER(CustomerID, Name, Phone) e DEVICE(DeviceID, CustomerID, Type, Model), escreva scripts SQL para: (a) listar o nome e o número de telefone de todo cliente que possui um dispositivo do tipo 'tablet', em ordem alfabética de nome; (b) contar os dispositivos de cada tipo; (c) registrar que o cliente 17 agora tem o número de telefone '0771 234 5678'; (d) adicionar um novo dispositivo, ID 305, um 'laptop' do modelo 'X1' pertencente ao cliente 17.

    (a)

    SELECT CUSTOMER.Name, CUSTOMER.Phone
    FROM CUSTOMER INNER JOIN DEVICE
      ON CUSTOMER.CustomerID = DEVICE.CustomerID
    WHERE DEVICE.Type = 'tablet'
    ORDER BY CUSTOMER.Name ASC;
    

    (b)

    SELECT Type, COUNT(DeviceID) AS NumberOfDevices
    FROM DEVICE
    GROUP BY Type;
    

    (c) UPDATE CUSTOMER SET Phone = '0771 234 5678' WHERE CustomerID = 17; (d) INSERT INTO DEVICE (DeviceID, CustomerID, Type, Model) VALUES (305, 17, 'laptop', 'X1');

    Pontuação é dada por cláusula — os campos, as tabelas, a condição de join, o WHERE, o ORDER BY — então um script com uma cláusula errada ainda pontua o resto. Escreva Table.Field sempre que duas tabelas estiverem envolvidas.

    Exemplo resolvido. Explique o que este script faz: SELECT T.Name, SUM(R.Cost) AS Total FROM TECHNICIAN T INNER JOIN REPAIR R ON T.TechnicianID = R.TechnicianID GROUP BY T.Name;

    Ele输出每个技术人员姓名及其执行的维修总成本,每行一个技术人员:两个表通过TechnicianID连接,行按姓名分组,每组中的成本相加。当被问及脚本做什么时,描述结果,而不是语法。

    Explorar

    Unir duas tabelas com INNER JOIN

    Um join combina linhas onde a chave estrangeira é igual à chave primária — aqui Orders.CustomerID = Customer.CustomerID — e une cada par correspondente em uma linha mais larga.

    Explorar

    SELECT … WHERE

    Passe por uma consulta: WHERE mantém as linhas que correspondem, então SELECT escolhe as colunas que você pediu.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    flat files/flæt faɪlz/ 平面文件 píng miàn wén jiàn
    data redundancy/ˈdeɪtə rɪˈdʌndənsi/ 数据冗余 shù jù rǒng yú
    data inconsistency/ˈdeɪtə ˌɪnkənˈsɪstənsi/ 数据不一致 shù jù bù yī zhì
    field/fiːld/ 字段 zì duàn
    query/ˈkwɪərɪ/ 查询 chá xún
    SQL/ˌes kjuː ˈel/ 结构化查询语言 jié gòu huà chá xún yǔ yán
    primary key/ˈpraɪməri kiː/ 主键 zhǔ jiàn
    foreign key/ˈfɒrən kiː/ 外键 wài jiàn
    join/dʒɔɪn/ 连接 lián jiē
    Data Definition Language/ˈdeɪtə ˌdefɪˈnɪʃn ˈlæŋɡwɪdʒ/ 数据定义语言 shù jù dìng yì yǔ yán
    Data Manipulation Language/ˈdeɪtə məˌnɪpjʊˈleɪʃn ˈlæŋɡwɪdʒ/ 数据操纵语言 shù jù cāo zòng yǔ yán
    aggregate functions/ˈæɡrɪɡeɪt ˈfʌŋkʃnz/ 聚合函数 jù hé hán shù
    Assistir aula
    8.3

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    entity algo sobre o qual dados são armazenados — uma pessoa, objeto ou evento — que se torna uma tabela em um banco de dados relacional
    attribute um item de dado sobre uma entidade (uma coluna da tabela)
    tuple uma linha de uma tabela: uma instância da entidade
    primary key um atributo, ou combinação de atributos, que identifica unicamente cada registro em uma tabela
    foreign key um atributo em uma tabela cujo valor corresponde a uma chave primária em outra tabela, usado para ligar as duas
    candidate key qualquer atributo (ou combinação) que poderia ser escolhido como chave primária
    secondary key um atributo não-primário que é indexado para que a tabela possa ser pesquisada ou ordenada rapidamente nele
    composite key uma chave primária feita de dois ou mais atributos juntos
    referential integrity todo valor de chave estrangeira deve corresponder a um valor de chave primária existente na tabela a que se refere
    first normal form uma tabela em que todo atributo é atômico, não há grupos repetidos e existe uma chave primária
    second normal form em 1NF, e todo atributo não-chave depende de toda a chave primária (nenhuma dependência parcial)
    third normal form em 2NF, e nenhum atributo não-chave depende de outro atributo não-chave (nenhuma dependência transitiva)
    data dictionary os metadados que um DBMS mantém sobre a estrutura do banco de dados: tabelas, campos, tipos, chaves, relacionamentos, validação
    DDL / DML a linguagem usada para definir ou alterar a estrutura de um banco de dados / a linguagem usada para consultar e manter os dados nele
    Vocabulário Treinar
    Inglês Chinês Pinyin
    entity/ˈentɪti/ 实体 shí tǐ
    record/ˈrekɔːd/ 记录 jì lù
    tuple/ˈtuːpl/ 元组 yuán zǔ
    attribute/ˈætrɪbjuːt/ 属性 shǔ xìng
    composite key/ˈkɒmpəzɪt kiː/ 复合键 fù hé jiàn
    candidate key/ˈkændɪdeɪt kiː/ 候选键 hòu xuǎn jiàn
    secondary key/ˈsekəndəri kiː/ 次键 cì jiàn
    indexing/ˈɪndeksɪŋ/ 索引 suǒ yǐn
    referential integrity/ˌrefəˈrenʃl ɪnˈteɡrɪti/ 参照完整性 cān zhào wán zhěng xìng
    entity-relationship diagram/ˈentɪti rɪˈleɪʃənʃɪp ˈdaɪəɡræm/ 实体关系图 shí tǐ guān xì tú
    data dictionary/ˈdeɪtə ˈdɪkʃənəri/ 数据字典 shù jù zì diǎn
    concurrent access/kənˈkʌrənt ˈækses/ 并发访问 bìng fā fǎng wèn
    8.3

    Dicas de prova

    • Defina os termos exatamente: entity, attribute, primary key, foreign key, e os tipos de relacionamento (1:1, 1:muitos, muitos:muitos).
    • Dê uma razão em cada forma normal: 1NF (sem grupos repetidos), 2NF (sem dependência parcial), 3NF (sem dependência não-chave) — e nomeie os campos envolvidos.
    • Explique o que um DBMS fornece (independência de dados, segurança, integridade, acesso simultâneo, um dicionário de dados, uma interface de desenvolvedor, um processador de consultas).
    • Distinga DDL (definir a estrutura) de DML (consultar e alterar os dados), e escreva cláusulas SQL uma por uma: SELECT, FROM, INNER JOIN … ON, WHERE, GROUP BY, ORDER BY.
    • Para desenhar um diagrama E-R a partir de tabelas, encontre primeiro cada chave estrangeira: toda chave estrangeira representa um relacionamento de um-para-muitos, com o "muitos" na tabela que a contém.

    Erros comuns

    • Desenhar um relacionamento de muitos-para-muitos diretamente. Ele deve ser dividido em dois relacionamentos de um-para-muitos através de uma tabela de ligação contendo ambas as chaves estrangeiras.
    • Explicando "não em 3NF" como "os dados estão repetidos". Nomeie a dependência (parcial ou transitiva) e os campos envolvidos.
    • Aspas duplas em torno de strings no SQL, ou aspas em torno de números. Strings levam 'single quotes'; números não levam nada.
    • Deixar de fora a condição ON depois de INNER JOIN. Sem ela, as duas tabelas não estão ligadas.
    • Colocar um campo comum ao lado de COUNT ou SUM em um SELECT sem um GROUP BY.
    • UPDATE ou DELETE sem um WHERE. Ela altera ou remove todas as linhas da tabela.
  • 9

    Projeto de Algoritmos e Resolução de Problemas

    Assistir aula
    9.1

    Pensamento computacional

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão de abstração Necessidade e benefícios do uso de abstração Descreva o propósito de abstração Produza um modelo abstrato de um sistema incluíndo apenas detalhes essenciais
    Descreva e utilize decomposição Dividir problemas em sub-problemas levando ao conceito de módulo de programa (procedimento / função)

    Fonte: Programa Cambridge International

    Pensamento computacional 计算思维 é o conjunto de ferramentas mentais para analisar um problema e projetar uma solução que um computador possa executar. Duas principais são abstração e decomposição.

    Um quebra-cabeça parcialmente terminado
    Pensamento computacional divide um grande problema em partes menores e mais fáceis — como resolver um quebra-cabeça

    Abstração

    Abstraction 抽象 significa manter as características essenciais de um problema e ignorar detalhes irrelevantes, fornecendo um modelo mais simples.

    Exemplos:

    • um mapa de rede de trens mantém as estações e linhas, mas ignora a geografia.
    • uma class em programação orientada a objetos mantém apenas os atributos e métodos que o sistema precisa.
    • uma função oculta uma parte do trabalho atrás de um nome.

    Um modelo completo de qualquer problema real seria muito grande para raciocinar, então a abstração é essencial.

    O avaliador pede o objetivo da abstração e seus benefícios. Objetivo: produzir um modelo mais simples de um problema que contenha apenas os detalhes necessários para resolvê-lo. Benefícios: o problema fica mais fácil de entender e programar; o programa é menor e mais rápido de escrever e testar; o mesmo modelo pode ser reutilizado para problemas semelhantes. Quando solicitado a produzir um modelo abstrato de um sistema, liste apenas os dados e ações que a tarefa exige. Para uma grade escolar, isso significa as aulas, salas, professores e períodos; não significa a cor das salas ou a idade dos professores.

    A abstração transforma uma geografia real caótica (um trajeto sinuoso com prédios espalhados) em um mapa de metrô limpo — círculos de estações espaçados uniformemente em uma linha reta, mantendo as estações e linhas e descartando a geografia
    A abstração mantém o essencial (estações e linhas) e descarta detalhes irrelevantes (a geografia)

    Decomposição

    Decomposição 分解 significa dividir um grande problema em subproblemas menores, cada um mais fácil de resolver e tratado individualmente.

    1. encontre as partes principais da tarefa.
    2. divida cada uma em subtarefas menores.
    3. continue até que cada uma seja pequena o suficiente para ser projetada diretamente.
    4. resolva as tarefas pequenas e combine-as.

    Para controle de estoque: "gerenciar estoque" → "registrar vendas", "registrar entregas", "produzir relatórios" → ("registrar vendas") "consultar produto", "diminuir contagem de estoque", "salvar a transação". A decomposição torna grandes problemas gerenciáveis, permite que uma equipe divida o trabalho e gera código modular — cada módulo se torna uma procedura 过程 ou função.

    "Explique por que a decomposição é usada" é uma questão de três pontos com formato fixo. Dê três benefícios separados: cada subproblema 子问题 é pequeno o suficiente para ser projetado, codificado e testado independentemente; diferentes programadores podem trabalhar em diferentes módulos 模块 ao mesmo tempo; um módulo já existente (ou uma rotina de biblioteca) pode ser reutilizado, e um erro é mais fácil de encontrar porque está contido em um único módulo. Um diagrama estrutural (tópico 12) é o diagrama de uma decomposição: o programa no topo, seus módulos abaixo, e os dados passados entre eles.

    Uma árvore com "Gerenciar estoque" no topo ramificando nos módulos "Registrar vendas", "Registrar entregas" e "Produzir relatórios", e "Registrar vendas" dividindo nas subtarefas "Consultar produto", "Diminuir contagem de estoque" e "Salvar transação"
    Decompondo um programa em módulos e submódulos
    Explorar

    Resolver um problema à maneira computacional

    Passe pelos quatro pilares na ordem em que você os usaria — decomponha o problema, identifique repetições, reduza aos essenciais, depois escreva os passos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    computational thinking/ˌkɒmpjuːˈteɪʃənl ˈθɪŋkɪŋ/ 计算思维 jì suàn sī wéi
    abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
    decomposition/ˌdiːkɒmpəˈzɪʃn/ 分解 fēn jiě
    sub-problem/sʌb ˈprɒbləm/ 子问题 zi wèn tí
    procedure/prəˈsiːdʒə/ 过程 guò chéng
    modules/ˈmɒdjuːlz/ 模块 mó kuài
    algorithm/ˈælɡərɪθəm/ 算法 suàn fǎ
    sequence/ˈsiːkwəns/ 顺序 shùn xù
    unambiguous/ʌnæmˈbɪɡjuːəs/ 无歧义 wú qí yì
    deterministic/dɪˌtɜːmɪˈnɪstɪk/ 确定性 què dìng xìng
    9.2

    Algoritmos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstre compreensão de que um algoritmo é uma solução para um problema expressa como uma sequência de passos definidos
    Utilize nomes de identificador adequados para a representação de dados usados por um problema e represente-os usando uma tabela de identificadores
    Escreva pseudocódigo que contenha entrada, processamento e saída
    Escreva pseudocódigo usando as três construções básicas de sequência, seleção e iteração (repetição)
    Documente um simples algoritmo usando uma descrição em inglês estruturado, um diagrama de fluxo ou pseudocódigo
    Escreva pseudocódigo a partir de: • uma descrição em inglês estruturado • um diagrama de fluxo
    Desenhe um diagrama de fluxo a partir de: • uma descrição em inglês estruturado • pseudocódigo
    Descreva e utilize o processo de refinamento progressivo para expressar um algoritmo a um nível de detalhe a partir do qual a tarefa pode ser programada
    Use declarações lógicas para definir partes de uma solução algorítmica

    Fonte: Programa Cambridge International

    Ordenação bolha, passo a passo

    Um algoritmo 算法 é uma solução expressa como uma sequência de passos definidos. Cada passo é unívoco 无歧义 (um único significado), determinístico 确定性 (mesma entrada → mesma saída), finito (os passos terminam) e efetivo (cada um pode ser executado). Um algoritmo diz o que fazer, independente da linguagem de programação usada para implementá-lo.

    Explorar

    Seleção: siga os ramos DO / SE NÃO

    Arraste a pontuação e observe qual ramo é executado. A seleção testa cada condição por sua vez e toma a PRIMEIRA que for verdadeira — é assim que funciona O SE ... SENÃO SE ... SENÃO.

    Assistir aula
    9.2

    Tabela de identificadores

    Ao iniciar um algoritmo, liste todas as peças de dados em uma tabela de identificadores 标识符表 — seu identificador 标识符 (o nome da variável 变量), tipo de dado 数据类型 e descrição. A tabela do exame tem exatamente estas três colunas:

    Identificador Tipo de dado Descrição
    Category STRING categoria do produto
    SaleDate DATE quando o item foi vendido
    ItemCost REAL custo do item
    InStock BOOLEAN TRUE se estiver em estoque
    Sales ARRAY[1:30] OF REAL os totais diários de vendas dos últimos 30 dias

    Use nomes descritivos (ItemCost, não x): um identificador começa com uma letra, não contém espaços e é escrito da mesma forma toda vez que aparece. Tipos comuns são INTEGER, REAL, STRING, CHAR, BOOLEAN, DATE, além de arrays. A tabela força você a nomear todas as peças de dados antes de escrever o código, e uma questão "complete a tabela de identificadores" dá um ponto por cada tipo de dado ou descrição correta, então escreva o tipo exatamente como o guia de pseudocódigo faz.

    Uma tabela de identificadores listando cada variável com seu nome, tipo de dado e descrição, por exemplo ItemCost como um REAL para o custo do item
    Uma tabela de identificadores nomeia todas as peças de dados antes de escrever o código
    Vocabulário Treinar
    Inglês Chinês Pinyin
    identifier table/aɪˈdentɪfaɪə ˈteɪbl/ 标识符表 biāo shí fú biǎo
    identifier/aɪˈdentɪfaɪə/ 标识符 biāo shí fú
    9.2

    Pseudocódigo — as três construções básicas

    Pseudocódigo 伪代码 é uma maneira estruturada e independente de linguagem para descrever algoritmos.

    As três construções básicas como mini-flowcharts: sequência executa passo A então B então C; seleção testa uma condição e faz X ou Y; iteração repete um corpo enquanto uma condição é verdadeira, retornando ao início
    Os três blocos construtivos de qualquer algoritmo: sequência, seleção e iteração

    1. Sequência

    Passos são executados um após o outro (sequência 顺序):

    INPUT Name
    INPUT Age
    OUTPUT "Hello", Name
    

    2. Seleção

    Uma escolha de quais passos executar, baseada em uma condição (seleção 选择):

    IF Age >= 18 THEN
        OUTPUT "Adult"
    ELSE
        OUTPUT "Minor"
    ENDIF
    

    Para mais opções, use CASE OF ... ENDCASE.

    3. Iteração

    Repetir um bloco (iteração 迭代, um laço 循环):

    FOR i ← 1 TO 10
        OUTPUT i
    NEXT i
    

    Um loop WHILE testa a condição antes de cada passagem (pode rodar zero vezes); um loop REPEAT...UNTIL testa depois de cada passagem (sempre roda pelo menos uma vez).

    WHILE Total < 100 DO
        INPUT Value
        Total ← Total + Value
    ENDWHILE
    
    REPEAT
        INPUT Mark
    UNTIL Mark >= 0 AND Mark <= 100
    
    Dois flowcharts lado a lado. WHILE testa a condição primeiro, então o corpo pode nunca executar: o losango fica acima do corpo e a ramificação Não sai do loop. REPEAT UNTIL executa o corpo primeiro e testa depois dele, então o corpo sempre executa pelo menos uma vez: o corpo fica acima do losango e a ramificação Não retorna a ele
    Um loop WHILE testa antes do corpo rodar; um loop REPEAT ... UNTIL testa depois, então seu corpo sempre roda pelo menos uma vez

    Escolher o loop vale um ponto: FOR quando você sabe quantas vezes (um loop controlado por contador 计数循环); WHILE quando o loop pode não rodar de todo (um loop pré-condição 前测循环); REPEAT ... UNTIL quando deve rodar pelo menos uma vez, como na validação de entrada (um loop pós-condição 后测循环). Uma resposta "descreva a construção de iteração" nomeia a construção, diz onde a condição é testada e dá a consequência (zero vezes ou pelo menos uma vez).

    Operações comuns

    • atribuição 赋值: x ← 5 (uma seta; = é para comparação).
    • entrada/saída: INPUT variable, OUTPUT expression.
    • comparações =, <>, <, >, <=, >=; lógica AND, OR, NOT.
    • aritmética + - * /, mais DIV (divisão inteira) e MOD (resto).
    • strings: LENGTH, LEFT, RIGHT, MID, e & para concatenação 拼接 (juntar).

    O pseudocódigo que o exame espera

    Toda resposta de pseudocódigo é avaliada contra o guia de pseudocódigo publicado pela Cambridge. Escreva estas formas exatamente:

    Construção Pseudocódigo
    Variável DECLARE Total : INTEGER
    Array DECLARE Marks : ARRAY[1:30] OF REAL
    Constante CONSTANT MaxTries = 3
    Atribuição Total ← Total + Value
    Entrada / Saída INPUT Name
    OUTPUT "Hello ", Name
    Seleção CASE OF Choice
    1 : OUTPUT "Add"
    OTHERWISE OUTPUT "Error"
    ENDCASE
    Loop FOR FOR i ← 1 TO 10 STEP 2 ... NEXT i
    Loop WHILE WHILE Total < 100 DO ... ENDWHILE
    Loop REPEAT REPEAT ... UNTIL Mark >= 0
    Aritmética inteira 17 DIV 5 = 3
    17 MOD 5 = 2
    Strings LENGTH(S), LEFT(S, 3), RIGHT(S, 2)
    MID(S, 2, 4), UCASE(S), LCASE(S)
    Conversões INT(3.7) = 3, NUM_TO_STR(12)
    STR_TO_NUM("4.5"), ASC('A') = 65, CHR(66) = 'B'
    Aleatório RAND(100)
    INT(RAND(100)) + 1

    RAND(100) gera um número real de 0 até (mas não incluindo) 100. INT(RAND(100)) + 1 gera um inteiro de 1 a 100.

    Dois hábitos valem pontos em todas as questões: declare toda variável que usar, com o tipo da sua tabela de identificadores, e inicialize 初始化 todo contador 计数器 e total (Count ← 0, Total ← 0) antes do loop que o altera.

    Entrada → Processamento → Saída

    Todo programa segue este formato:

    INPUT Length
    INPUT Width
    Area ← Length * Width
    OUTPUT "Area = ", Area
    

    Listar entradas e saídas primeiro deixa o algoritmo mais limpo.

    Exemplo resolvido. Escreva pseudocódigo que insere 100 inteiros e outputa quantos deles, e a soma desses, estão entre 10 e 20 inclusos.

    Tabela de identificadores: Count : INTEGER (contador de loop), Value : INTEGER (o inteiro inserido), InRange : INTEGER (quantos estavam no intervalo), Total : INTEGER (soma deles).

    DECLARE Count, Value, InRange, Total : INTEGER
    InRange ← 0
    Total ← 0
    FOR Count ← 1 TO 100
        INPUT Value
        IF Value >= 10 AND Value <= 20 THEN
            InRange ← InRange + 1
            Total ← Total + Value
        ENDIF
    NEXT Count
    OUTPUT InRange, Total
    

    Se a questão pedir para "identificar duas construções e dizer como cada uma é usada", responda no mesmo formato: iteração, o loop FOR, repete a entrada 100 vezes; seleção, a instrução IF, adiciona um valor apenas quando está no intervalo.

    Exemplo resolvido. Um programa escolhe um número secreto inteiro de 1 a 100. O usuário chuta até acertar; após cada chute errado, o programa diz "Muito baixo" ou "Muito alto", e no final ele outputa quantos palpites foram feitos.

    Tabela de identificadores: Secret : INTEGER (o número a ser adivinhado), Guess : INTEGER (a entrada do usuário), Tries : INTEGER (quantos palpites até agora).

    DECLARE Secret, Guess, Tries : INTEGER
    Secret ← INT(RAND(100)) + 1
    Tries ← 0
    REPEAT
        INPUT Guess
        Tries ← Tries + 1
        IF Guess < Secret THEN
            OUTPUT "Too low"
        ELSE
            IF Guess > Secret THEN
                OUTPUT "Too high"
            ENDIF
        ENDIF
    UNTIL Guess = Secret
    OUTPUT "You took ", Tries, " guesses"
    

    Um loop REPEAT ... UNTIL é a escolha certa porque o usuário deve chutar pelo menos uma vez. Os pontos são para: o número aleatório no intervalo correto, um loop que termina em um chute correto, o contador que começa em zero e aumenta dentro do loop, as duas mensagens sob as condições certas, e a saída final.

    Fluxograma do jogo de adivinhação: Início, depois defina Segredo como um inteiro aleatório de 1 a 100 e Tentativas como 0, depois insira um palpite, adicione um às Tentativas, teste se o palpite é igual ao segredo (Sim leva à saída Tentativas e Parada), caso contrário teste se o palpite é menor (Sim sai Muito baixo, Não sai Muito alto), e ambas as saídas retornam ao input
    O mesmo jogo de adivinhação como flowchart: os dois losangos de decisão são as duas instruções IF, e a seta de retorno é o loop REPEAT ... UNTIL

    Exemplo resolvido. Outputar dois números inteiros aleatórios diferentes, cada um entre $-10$ e $10$ inclusos.

    Há 21 valores possíveis, então INT(RAND(21)) gera de 0 a 20 e subtraindo 10 desloca para o intervalo $-10$ a $10$. O segundo número deve ser gerado novamente até diferir do primeiro:

    DECLARE First, Second : INTEGER
    First ← INT(RAND(21)) - 10
    REPEAT
        Second ← INT(RAND(21)) - 10
    UNTIL Second <> First
    OUTPUT First, Second
    
    Todo programa segue a forma entrada, então processamento, então saída, mostrado com o exemplo de área: entrar o comprimento e a largura, processar multiplicando, sair a área
    Todo programa segue o formato Entrada, Processamento, Saída
    Explorar

    IF … ELSE seleção

    Altere o valor e observe qual ramo é executado — como um programa toma decisões.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    variable/ˈveərɪəbl/ 变量 biàn liàng
    data type/ˈdeɪtə taɪp/ 数据类型 shù jù lèi xíng
    pseudocode/ˈsuːdəʊkəʊd/ 伪代码 wěi dài mǎ
    loop/luːp/ 循环 xún huán
    count-controlled loop/kaʊnt kənˈtrəʊld luːp/ 计数循环 jì shù xún huán
    pre-condition loop/priː kənˈdɪʃn luːp/ 前测循环 qián cè xún huán
    post-condition loop/pəʊst kənˈdɪʃn luːp/ 后测循环 hòu cè xún huán
    assignment/əˈsaɪnmənt/ 赋值 fù zhí
    concatenation/kənˌkætəˈneɪʃn/ 拼接 pīn jiē
    initialise/ɪˈnɪʃəlaɪz/ 初始化 chū shǐ huà
    counter/ˈkaʊntə/ 计数器 jì shù qì
    structured English/ˈstrʌktʃəd ˈɪŋɡlɪʃ/ 结构化英语 jié gòu huà yīng yǔ
    stepwise refinement/ˈstepwaɪz rɪˈfaɪnmənt/ 逐步求精 zhú bù qiú jīng
    logic statement/ˈlɒdʒɪk ˈsteɪtmənt/ 逻辑语句 luó jí yǔ jù
    precedence/ˈpresɪdəns/ 优先级 yōu xiān jí
    De Morgan's law/də ˈmɔːɡənz lɔː/ 德摩根定律 dé mó gēn dìng lǜ
    9.2

    Três notações

    O mesmo algoritmo pode ser escrito de três formas.

    • inglês estruturado 结构化英语 — linguagem natural com indentação e palavras-chave fixas; bom para uma descrição de alto nível.
    • flowchart 流程图 — um diagrama com formas padrão:
    Forma Significado
    Retângulo arredondado Início / Parada
    Paralelogramo Entrada / Saída
    Retângulo Processamento
    Losango Decisão
    Seta Fluxo de controle
    • pseudocódigo — a notação de palavras-chave acima; mais próximo do código.

    Você deve ser capaz de converter entre qualquer par: cada IF é um losango de decisão, cada laço é uma seta de retorno, e uma sequência são retângulos empilhados.

    SE ... ENTÃO ... SENÃO ... FIM_SE

    Um fluxograma para calcular a média de números: terminadores redondos Início e Fim, paralelogramas de entrada/saída, retângulos de processamento e um losango de decisão "count < n?" cuja ramificação Sim retorna ao laço para ler o próximo valor
    Um fluxograma para calcular a média de uma lista de números, usando as formas padrão
    Vocabulário Treinar
    Inglês Chinês Pinyin
    flowchart/ˈfləʊtʃɑːt/ 流程图 liú chéng tú
    selection/sɪˈlekʃn/ 选择 xuǎn zé
    iteration/ˌɪtəˈreɪʃn/ 迭代 dié dài
    9.2

    Refinamento passo a passo

    Refinamento passo a passo 逐步求精 começa com um esboço de alto nível e expande cada etapa até que seja pequena o suficiente para ser codificada. Para uma média de $n$ números:

    Nível 1:

    Read in the numbers
    Compute the average
    Output the average
    

    Nível 2:

    INPUT n
    total ← 0
    FOR i ← 1 TO n
        INPUT value
        total ← total + value
    NEXT i
    average ← total / n
    OUTPUT average
    

    C refinamento mantém a estrutura anterior e adiciona detalhes.

    Uma questão de seis pontos sobre "aplicar refinamento passo a passo" fornece um esboço de alto nível e pede que cada etapa seja expandida em instruções concretas que um programador poderia codificar. Mantenha as etapas na mesma ordem, nomeie os dados que cada etapa lê ou produz, e pare quando cada linha for uma única entrada, atribuição, saída, laço ou condição. Por exemplo, "validar a senha" torna-se: digite a senha; verifique se seu comprimento é pelo menos 8; verifique se contém pelo menos um dígito; saia "aceita" se ambas as verificações forem bem-sucedidas, caso contrário saia "rejeitada".

    Refinamento passo a passo: um esboço de Nível 1 (ler os números, calcular a média, sair a média) é expandido em pseudocódigo detalhado de Nível 2 com o loop de entrada e a divisão
    Refinamento passo a passo: expanda cada etapa de alto nível em pseudocódigo detalhado
    Explorar

    Refinamento passo a passo: esboço para código

    Desça pelos níveis. Você começa com a tarefa inteira em uma linha e continua expandindo cada passo em partes menores — até que todos os passos sejam simples o suficiente para serem codificados diretamente.

    9.2

    Declarações lógicas

    Uma declaração lógica 逻辑语句 é uma condição Booleana 布尔 controlada por ramificações, construída a partir de comparações (x > 10), conectivos (AND, OR, NOT) e colchetes. Use-a como condição de IF, WHILE ou REPEAT...UNTIL:

    WHILE attempts < 3 AND NOT loggedIn DO
        INPUT password
        IF password = correctPassword THEN
            loggedIn ← TRUE
        ELSE
            attempts ← attempts + 1
        ENDIF
    ENDWHILE
    

    Precedência 优先级 (maior para menor): NOT, depois AND, depois OR. Use colchetes quando tiver dúvidas. Erros comuns:

    • a = 1 OR 2 está errado — escreva a = 1 OR a = 2.
    • NOT a > 5 significa NOT (a > 5), ou seja, a <= 5.
    • NOT (A AND B) é o mesmo que (NOT A) OR (NOT B) (Lei de De Morgan 德摩根定律) — útil para simplificar condições.

    Transformar uma frase em uma declaração lógica é uma habilidade testada diretamente nos exames. "Um ingresso é gratuito para qualquer pessoa com menos de 5 ou mais de 65 anos" torna-se Age < 5 OR Age > 65. "Uma nota é válida se for um número inteiro de 0 a 100" torna-se Mark >= 0 AND Mark <= 100. "O laço para quando o arquivo termina ou dez registros foram lidos" torna-se UNTIL EOF(File) OR Count = 10. Escreva cada comparação por extenso: Age > 65 e Age < 5, nunca Age > 65 OR < 5.

    Uma árvore de análise para "attempts < 3 AND NOT loggedIn": NOT aplica-se primeiro a loggedIn, então AND une isso com attempts < 3
    Precedência: NOT vincula-se a loggedIn primeiro, então AND combina os dois lados

    Exemplo resolvido. Escreva uma tabela de identificadores e pseudocódigo para ler 10 números e exibir o maior. A tabela de identificadores nomeia cada variável com seu tipo de dado e propósito: Count : INTEGER (contador de laço), Num : REAL (o número acabado de ser lido), Max : REAL (maior até agora).

    Max ← -999999
    FOR Count ← 1 TO 10
        INPUT Num
        IF Num > Max THEN
            Max ← Num
        ENDIF
    NEXT Count
    OUTPUT Max
    

    A decisão de design que carrega os pontos é inicializar Max: ela deve começar abaixo de qualquer entrada possível - ou, ainda mais seguro, ser definida como o primeiro número lido. Inicializá-la como 0 faz o algoritmo retornar incorretamente 0 para uma lista de números negativos, um bug que sua traçagem só expõe se os dados de teste incluírem um negativo.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Boolean/ˈbuːlɪən/ 布尔 bù ěr
    9.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    abstração manter os detalhes essenciais de um problema e omitir os detalhes que não são necessários
    decomposição dividir um problema em subproblemas menores, cada um dos quais pode ser resolvido separadamente
    algoritmo uma solução para um problema expressa como uma sequência de passos definidos
    tabela de identificadores uma tabela listando cada identificador usado em um algoritmo com seu tipo de dado e uma descrição de seu propósito
    pseudocódigo uma forma estruturada e independente de linguagem de escrever os passos de um algoritmo
    fluxograma um diagrama que mostra os passos e decisões de um algoritmo usando símbolos padrão unidos por setas
    sequência instruções executadas uma após a outra na ordem escrita
    seleção escolher quais instruções executar de acordo com uma condição
    iteração repetir um grupo de instruções enquanto, ou até, uma condição ser satisfeita
    refinamento passo a passo dividir cada etapa de um esboço em etapas menores, repetidamente, até que cada etapa possa ser codificada diretamente
    declaração lógica uma condição construída a partir de comparações e dos operadores AND, OR e NOT que avalia como VERDADEIRO ou FALSO
    9.2

    Dicas de prova

    • Defina um algoritmo como uma sequência inequívoca, finita e determinística de passos, independente da linguagem.
    • Use as três construções corretamente — sequência, seleção, iteração — e mantenha uma tabela de identificadores com tipos de dados.
    • Divida um problema por decomposição e abstração, depois refinamento passo a passo.
    • Escreva pseudocódigo que realmente funcionaria: declare variáveis e siga o estilo de pseudocódigo do exame.

    Erros comuns

    • Usar = para atribuir um valor. Atribuição é ←; = é uma comparação.
    • Esquecer ENDIF, ENDWHILE, ENDCASE ou NEXT. Toda construção fecha, e a palavra de fechamento é onde o ponto da construção é verificado.
    • Não inicializar um total ou contador antes do laço, de modo que o algoritmo soma a um valor que nunca existiu.
    • Usar um laço FOR quando o número de repetições é desconhecido. Ler até um valor sentinela ou um palpite correto precisa de WHILE ou REPEAT ... UNTIL.
    • Escrever Age > 65 OR < 5. Cada lado de OR e AND deve ser uma comparação completa.
    • Responder "explique por que a decomposição é usada" com um benefício escrito de três maneiras. Três pontos precisam de três benefícios diferentes.
  • 10

    Tipos e Estruturas de Dados

    Assistir aula
    10.1

    Escolhendo tipos de dados

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Selecionar e usar tipos de dados adequados para uma solução de problema incluindo inteiro, real, char, string, Booleano, data (pseudocódigo usará os seguintes tipos de dados: INTEGER, REAL, CHAR, STRING, BOOLEAN, DATE, ARRAY, FILE)
    Demonstrar compreensão do propósito de uma estrutura de registro para armazenar um conjunto de dados de diferentes tipos de dados sob um único identificador Escrever pseudocódigo para definir uma estrutura de registro
    Escrever pseudocódigo para ler dados de uma estrutura de registro e salvar dados em uma estrutura de registro

    Fonte: Programa Cambridge International

    Toda variável precisa de um tipo de dado 数据类型 — o tipo de valor que ela armazena e as operações permitidas:

    • INTEGER — um número inteiro (42, -7). Para contagens, índices, IDs.
    • REAL — um número com parte fracionária (3.14). Para dinheiro, medições.
    • STRING — caracteres entre aspas ("Hello"). Para texto.
    • CHAR — um único caractere ('A').
    • BOOLEAN — TRUE ou FALSE. Para flags.
    • DATE — uma data do calendário.

    Escolha o tipo preciso menor que se encaixe: INTEGER para contagens inteiras, BOOLEAN para flags (não as strings "yes"/"no").

    As tabelas "dê o tipo de dado apropriado" são decididas por como o valor é usado: a média das notas de uma turma é REAL (tem parte fracionária); um endereço de e-mail é STRING; o número de alunos é INTEGER; se um aluno pagou é BOOLEAN; uma data de nascimento é DATE; um índice de array é sempre INTEGER; uma letra de nota única é CHAR; um número de telefone é um STRING, porque começa com 0 e nunca é usado em aritmética. Um BOOLEAN é usado para uma flag com apenas dois estados: se uma busca encontrou seu alvo, se um membro pagou, se um assento está reservado. Para a tabela de identificadores, o nome da variável também deve ser significativo: NumberOfPeople, não n.

    10.1

    Registros

    Um registro 记录 (uma estrutura de registro 记录结构) armazena vários campos de tipos diferentes sob um único nome — útil quando vários valores descrevem uma coisa.

    TYPE TStockItem
        DECLARE ItemID : INTEGER
        DECLARE Category : STRING
        DECLARE ItemCost : REAL
        DECLARE InStock : BOOLEAN
    ENDTYPE
    

    Isso define o tipo TStockItem; declare variáveis dele:

    DECLARE Item1 : TStockItem
    DECLARE Items : ARRAY[1:100] OF TStockItem
    

    Use notação de ponto para acessar cada campo 字段:

    Item1.Category ← "Fruit"
    OUTPUT Item1.Category, " costs ", Item1.ItemCost
    

    Use um registro quando valores sempre pertencerem juntos (um cliente, um item de estoque); use variáveis separadas para valores não relacionados.

    Exemplo resolvido. Um clube armazena, para cada aluno, um ID de aluno (uma string), um nome, uma data de nascimento e até três números de clube (inteiros). Escreva pseudocódigo para declarar o tipo de registro, um array para armazenar $3000$ alunos, e uma instrução que armazena um nome no primeiro elemento.

    TYPE Student
        DECLARE StudentID : STRING
        DECLARE Name : STRING
        DECLARE DateOfBirth : DATE
        DECLARE Club : ARRAY[1:3] OF INTEGER
    ENDTYPE
    
    DECLARE Membership : ARRAY[1:3000] OF Student
    Membership[1].Name ← "Li Wei"
    

    Os pontos: TYPE com o identificador e ENDTYPE; cada campo declarado com um tipo adequado; o array declarado com seus limites e OF Student; o campo acessado com o índice e um ponto. Uma questão "affe o erro na declaração do registro" geralmente aponta para um ENDTYPE faltante, um campo sem tipo, ou um campo declarado como um STRING que deve conter aritmética. Duas convenções pontuam por si só: um elemento não utilizado é marcado com um valor que não pode ser dados reais (uma string vazia, -1, um ID de 0), e é boa prática usar o mesmo marcador em todos os lugares para que todo módulo possa reconhecer um slot não utilizado; um campo de clube não utilizado é 0. Os benefícios de um array de registros, para "affe três benefícios": todos os dados de uma entidade são mantidos sob um único identificador; os campos podem ter diferentes tipos de dados; um array substitui vários arrays paralelos que precisariam ser mantidos em sincronia; o conjunto inteiro pode ser processado por um único laço ou passado como um único parâmetro; e adicionar um campo altera apenas a definição do tipo. Para um único cliente, a estrutura adequada é um registro (campos de diferentes tipos sob um nome); para todos os clientes, é um array de registros.

    Um registro TStockItem desenhado como uma pilha de quatro campos sob um único nome — ItemID (INTEGER), Category (STRING), ItemCost (REAL), InStock (BOOLEAN) — acessado com notação de ponto como Item1.Category
    Um registro armazena vários campos de tipos diferentes sob um único nome
    Explorar

    Um registro agrupa campos sob um único nome

    Um registro agrupa campos relacionados juntos. Cada campo é um rótulo nomeado que você acessa com notação de ponto — Item1.Categoria — não por índice numérico.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    record/ˈrekɔːd/ 记录 jì lù
    record structure/ˈrekɔːd ˈstrʌktʃə/ 记录结构 jì lù jié gòu
    field/fiːld/ 字段 zì duàn
    10.2

    Matrizes

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Usar os termos técnicos associados a arrays Incluindo índice, limite superior e limite inferior
    Selecionar uma estrutura de dados adequada (array 1D ou array 2D) para usar em uma tarefa dada
    Escrever pseudocódigo para arrays 1D e 2D
    Escrever pseudocódigo para processar dados de array Ordenar usando uma ordenação bubble Pesquisar usando uma busca linear

    Fonte: Programa Cambridge International

    Um array 数组 é uma coleção ordenada de itens do mesmo tipo, sob um único nome, acessado por um índice 索引.

    • elemento 元素 — um item no array.
    • limites 边界 — os índices válidos mais baixos e mais altos.
    • dimensão 维度 — 1-D (uma lista), 2-D (uma tabela), etc.
    • limite inferior 下界 e limite superior 上界 — o primeiro e o último índice válido; o número de elementos é limite superior menos limite inferior mais um, e para um array 2-D o produto das duas contagens.

    Então em ThisArray[n] ← 42 o array tem uma dimensão, o índice é a variável n (um INTEGER), e o elemento nesse índice recebe 42. Antes que um array possa ser declarado, você precisa de seu tipo de dado bem como seus limites. Para declarar $120$ valores que podem incluir um ponto decimal: DECLARE Data : ARRAY[1:120] OF REAL; uma tabela de strings de $150$ linhas, duas colunas: DECLARE Data : ARRAY[1:150, 1:2] OF STRING, que tem $300$ elementos. Os benefícios de um array sobre variáveis separadas, para uma explicação de dois pontos: um identificador em vez de trinta; os elementos podem ser processados por um loop com o índice como contador; o tamanho é fácil de alterar; e todo o conjunto pode ser passado para um módulo como um único parâmetro. Um array também pode substituir uma cadeia de declarações de seleção: DaysInMonth[Month] procura a resposta diretamente em vez de doze cláusulas IF, o que é mais curto, mais rápido de escrever e mais fácil de manter.

    Arrays 1-D

    DECLARE Names : ARRAY[1:5] OF STRING
    Names[3] ← "Cara"
    OUTPUT Names[3]
    

    Processar cada elemento com um laço FOR:

    FOR i ← 1 TO 5
        OUTPUT Names[i]
    NEXT i
    
    Uma fileira de células indexadas nomeadas myList, com índices de 0 a 8 e o limite inferior (primeiro índice) e limite superior (último índice) marcados
    Um array 1-D (uma lista) com índices e limites

    Arrays 2-D (array 2D)

    DECLARE Grid : ARRAY[1:3, 1:4] OF INTEGER
    Grid[2, 3] ← 99
    

    O primeiro índice representa a linha, o segundo a coluna. Use laços aninhados para visitar cada célula. Use 1-D para uma sequência única, 2-D para duas dimensões naturais (uma grade, linhas × colunas).

    Uma grade 3 por 4 com índices de linha e índice de coluna; a célula na linha 2, coluna 3 está destacada
    Um array 2-D (uma tabela) com índices de linha e coluna

    Operações comuns

    Uma busca linear 线性查找 verifica cada elemento até encontrá-lo:

    FOR i ← 1 TO n
        IF A[i] = Target THEN
            OUTPUT "Found at ", i
        ENDIF
    NEXT i
    

    Para encontrar uma soma, contagem, máximo ou mínimo, defina uma variável acumuladora e percorra:

    Max ← A[1]
    FOR i ← 2 TO n
        IF A[i] > Max THEN
            Max ← A[i]
        ENDIF
    NEXT i
    

    Uma ordenação por bolha 冒泡排序 coloca um array em ordem: percorre-o comparando cada par adjacente e trocando qualquer um fora de ordem; repita as passagens até que uma passagem não realize nenhuma troca.

    A Prova 2 pede esses algoritmos tanto em pseudocódigo quanto em passos em palavras, e às vezes em sua forma "eficiente":

    • Maior valor: defina Largest para o primeiro elemento; para cada elemento restante, se for maior que Largest, armazene-o em Largest; após o laço, imprima Largest. Para a posição do maior, mantenha uma segunda variável que armazene o índice sempre que Largest mudar.
    • Busca linear retornando uma posição: defina FoundAt ← -1 antes do laço (um valor que nunca será um índice válido, indicando "não encontrado"); percorra o array; quando o elemento corresponder, armazene o índice e saia do laço; após o laço teste FoundAt.
    • Contar ou imprimir os elementos não em branco: compare cada elemento com o marcador de elemento vazio ("" ou -1) e conte ou imprima apenas aqueles que diferirem.
    • Remover um item: encontre seu índice por busca linear; mova todos os elementos subsequentes uma posição para a frente, fechando o espaço; marque o último elemento como vazio (ou diminua a contagem).
    • Inserir em um array ordenado: encontre o primeiro índice cujo elemento seja maior; mova esse elemento e todos os seguintes uma posição para trás; armazene o novo valor no espaço vazio.
    • Ordenação por bolha eficiente: uma bandeira Swapped para que as passagens parem assim que uma não realizar troca, e um limite superior que diminui em uma unidade a cada passagem porque o maior valor já atingiu o final.
    REPEAT
        Swapped ← FALSE
        FOR Index ← 1 TO Limit - 1
            IF Data[Index] > Data[Index + 1] THEN
                Temp ← Data[Index]
                Data[Index] ← Data[Index + 1]
                Data[Index + 1] ← Temp
                Swapped ← TRUE
            ENDIF
        NEXT Index
        Limit ← Limit - 1
    UNTIL Swapped = FALSE
    

    Os pontos são pelo laço externo que se repete até não haver trocas, pela bandeira definida dentro do IF, pela troca de três linhas com uma variável temporária e pelo limite decrescente. Uma ordenação em "passos" (refinamento passo a passo) é: repetir até ordenar; em cada passagem, comparar pares adjacentes; trocar um par fora de ordem; após cada passagem, o maior valor não ordenado fica no final. Dois arrays 1-D de registros ou de dados paralelos são processados com um laço e um índice; um array 2-D precisa de um laço aninhado, o externo sobre linhas e o interno sobre colunas, e uma busca em uma linha fixa o índice da linha e percorre a coluna.

    Uma passagem de ordenação por bolha sobre 5, 2, 8, 1: compara 5 e 2 e troca para dar 2, 5, 8, 1; compara 5 e 8 (já em ordem); compara 8 e 1 e troca para dar 2, 5, 1, 8, então o maior valor 8 atinge o final
    Uma passagem de ordenação por bolha: pares adjacentes são comparados e trocados, fazendo o maior valor subir ao final
    Explorar

    Uma matriz 2-D

    Escolha uma linha e uma coluna para ler um elemento — como uma grade de dados é armazenada e indexada.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    index/ˈɪndeks/ 索引 suǒ yǐn
    array/əˈreɪ/ 数组 shù zǔ
    element/ˈelɪmənt/ 元素 yuán sù
    bounds/baʊndz/ 边界 biān jiè
    bubble sort/ˈbʌbl sɔːt/ 冒泡排序 mào pào pái xù
    file/faɪl/ 文件 wén jiàn
    secondary storage/ˈsekəndəri ˈstɔːrɪdʒ/ 辅助存储器 fǔ zhù cún chǔ qì
    10.3

    Arquivos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão do motivo pelo qual arquivos são necessários
    Escrever pseudocódigo para manipular arquivos de texto que consistem em uma ou mais linhas

    Fonte: Programa Cambridge International

    Um arquivo 文件 é dados armazenados em armazenamento secundário 辅助存储器, mantidos entre execuções de programa. Variáveis na RAM desaparecem quando o programa termina, então para salvar dados permanentemente (pontuações altas, registros, configurações) o programa escreve em um arquivo. Arquivos também permitem que programas compartilhem dados e reiniciem a partir de um estado salvo.

    Variáveis na RAM são perdidas quando o programa termina, mas um arquivo em disco é mantido entre execuções, então o programa salva e carrega dele
    Variáveis na RAM desaparecem quando o programa termina; um arquivo em disco persiste entre execuções

    Um arquivo de texto 文本文件 contém uma ou mais linhas de caracteres legíveis; programas leem e escrevem arquivos de texto linha por linha. Abra um arquivo antes de usá-lo e arquivo depois:

    OPENFILE "data.txt" FOR READ      // or FOR WRITE, FOR APPEND
    WHILE NOT EOF("data.txt") DO
        READFILE "data.txt", LineString
        OUTPUT LineString
    ENDWHILE
    CLOSEFILE "data.txt"
    

    EOF testa o fim de arquivo 文件结束 antes de ler. Para escrever:

    OPENFILE "log.txt" FOR WRITE
    FOR i ← 1 TO 100
        WRITEFILE "log.txt", "Event " & i
    NEXT i
    CLOSEFILE "log.txt"
    

    Sempre arquivo todos os arquivos — caso contrário, as escritas em buffer podem ser perdidas e outros programas podem ficar bloqueados.

    Por que arquivos (dois pontos): os dados são mantidos após o término do programa, tornando-os disponíveis na próxima execução; podem ser compartilhados com outros programas; e podem conter mais dados do que cabem na memória. A característica de um arquivo de texto que permite ao programa processá-lo é ser uma sequência de linhas, lidas uma após outra do início. Os três modos: READ para ler do início; WRITE para criar um novo arquivo, o que exclui qualquer conteúdo existente, logo não pode ser usado para adicionar a um arquivo; APPEND para adicionar linhas no final de um arquivo existente. Teste EOF antes de cada leitura, e abra o arquivo apenas uma vez, mesmo quando vários módulos o utilizarem.

    Exemplo resolvido. Escreva pseudocódigo para um procedimento LastLines(FileName : STRING) que imprime as últimas três linhas de um arquivo de texto, na ordem.

    PROCEDURE LastLines(BYVAL FileName : STRING)
        DECLARE LineX, LineY, LineZ : STRING
        LineX ← ""
        LineY ← ""
        LineZ ← ""
        OPENFILE FileName FOR READ
        WHILE NOT EOF(FileName) DO
            LineX ← LineY
            LineY ← LineZ
            READFILE FileName, LineZ
        ENDWHILE
        CLOSEFILE FileName
        OUTPUT LineX
        OUTPUT LineY
        OUTPUT LineZ
    ENDPROCEDURE
    

    Cada nova linha empurra as três anteriores, então quando o arquivo termina as três variáveis contêm suas últimas três linhas; um arquivo com menos linhas imprime cadeias vazias. Para imprimir as cinco primeiras linhas, conte as linhas lidas e pare o laço em cinco ou em EOF, o que vier primeiro; um arquivo vazio é detectado por EOF ser TRUE imediatamente após a abertura.

    Campos em uma linha. Um arquivo de texto contém strings, então um registro é escrito como uma linha cujos campos estão ligados por um caractere separador 分隔符, e cada número ou Booleano é convertido com NUM_TO_STR (e lido novamente com STR_TO_NUM, ou comparando com "TRUE"). Escolha um separador que nunca apareça nos dados: vírgula ou | para nomes e números, nunca um espaço quando um nome pode conter um. Se um campo puder conter qualquer caractere, o separador pode ser confundido com os dados; a solução é colocar cada campo em sua própria linha, ou escrever o comprimento do campo antes dele. Um item por linha é simples de ler novamente, mas usa mais linhas e torna o registro menos visível como uma unidade. Ler um arquivo cujas linhas estão em uma ordem conhecida (ascendente por ID) permite que a busca pare assim que um ID maior for lido, em vez de ler até o final. Um arquivo de salvamento criado a cada vez que o jogo é salvo precisa de um nome de arquivo significativo, por exemplo, o nome do jogador e a data e hora, para que qualquer salvamento anterior possa ser restaurado.

    Uma linha de um arquivo de texto, 1023,Ali,12.50,TRUE, dividida no separador de vírgula nos quatro campos de um registro de item de estoque, com a conversão necessária para cada campo: STR_TO_NUM para os campos numéricos, a string como está, e uma comparação com TRUE para o Booleano
    Uma linha de um arquivo de texto é um registro: campos ligados por um separador, convertidos para seus tipos ao serem lidos novamente
    Explorar

    Gerenciamento de arquivo: abrir → usar → fechar

    Passe pelo ciclo de vida que todo arquivo segue. As duas partes fáceis de esquecer são testar EOF ao ler em um laço e sempre fechar no final.

    10.4

    Tipos de Dados Abstratos (ADTs)

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de que um ADT é uma coleção de dados e um conjunto de operações sobre esses dados
    Demonstrar compreensão de que uma pilha, fila e lista ligada são exemplos de ADTs Descrever as características principais de uma pilha, fila e lista ligada e justificar seu uso para uma situação dada
    Usar uma pilha, fila e lista ligada para armazenar dados Os candidatos não serão exigidos a escrever pseudocódigo para essas estruturas, mas devem ser capazes de adicionar, editar e excluir dados dessas estruturas
    Descrever como uma fila, pilha e lista ligada podem ser implementadas usando arrays

    Fonte: Programa Cambridge International

    Lista ligada: inserção através da reconfiguração de ponteiros
    Pilha vs fila: LIFO e FIFO

    Um Tipo de Dado Abstrato 抽象数据类型 (ADT) é uma coleção de dados mais operações sobre eles, definido pelo o que faz, não como é armazenado. O usuário interage apenas pelas operações; a implementação é oculta, permitindo alterações sem afetar o código que usa o ADT. Conheça três: pilha, fila, lista ligada.

    A definição de um ponto: um ADT é uma coleção de dados junto com um conjunto de operações sobre esses dados. Uma pilha, uma fila, uma lista ligada, uma árvore binária e um array são todos ADTs. Para justificar uma escolha: uma fila quando os itens devem ser tratados na ordem de chegada (trabalhos de impressão, pressionamentos de tecla, clientes em uma loja), pois é primeira a entrar, primeira a sair; uma pilha quando o item mais recente deve ser tratado primeiro (desfazer, navegar pelas páginas web, inverter uma ordem, endereços de retorno de chamadas aninhadas), pois é última a entrar, primeira a sair; uma lista ligada quando os itens são inseridos e removidos frequentemente no meio de uma sequência ordenada, pois apenas ponteiros mudam e nada precisa ser transferido. Para comparar uma pilha e uma fila: ambas são estruturas lineares de itens com uma ordem, ambas são implementadas com um array e ponteiros, e ambas precisam verificar se estão cheias antes de adicionar e se estão vazias antes de remover; uma pilha tem um ponteiro e adiciona/remove na mesma extremidade, uma fila tem dois ponteiros e adiciona em uma extremidade e remove na outra.

    Pilha

    Uma pilha 栈 opera em ordem LIFO 后进先出 (Last In, First Out). Operações: empurrão 入栈 (adicionar no topo), pop 出栈 (remover do topo), peek (verificar o topo) e testes de vazio/cheio. Usos: histórico de desfazer, endereços de retorno de chamada de função, análise de expressões, retrocesso.

    Uma pilha armazenada em um array mostrada em três estados; o ponteiro Top sobe após um push e desce após um pop, enquanto a base da pilha permanece fixa
    Push e pop alteram o ponteiro top; o ponteiro base permanece parado

    Exemplo resolvido. Uma pilha de caracteres contém, de baixo para cima, 'P', 'N', 'Z', 'X', 'Y', 'W', com o ponteiro de topo da pilha em 'W' (localização de memória 202 de 200–207). As operações POP, POP, PUSH 'A', PUSH 'B', POP são realizadas. O que está na pilha e onde o ponteiro aponta?

    Os dois pops removem 'W' então 'Y'; os pushes adicionam 'A' então 'B' em seus lugares; o último pop remove 'B'. A pilha agora contém 'P', 'N', 'Z', 'X', 'A' e o ponteiro está em 'A', localização 203. O valor que esteve na pilha por mais tempo é o item inferior, 'P'; no máximo cinco pops adicionais são possíveis antes que a pilha esteja vazia, e um pop em uma pilha vazia é um erro, razão pela qual Pop() testa se está vazio primeiro. Uma função Push() que retorna TRUE com sucesso testa primeiro se o ponteiro está no topo do array (cheio) e retorna FALSE se for esse o caso. Os elementos do array não precisam ser inicializados antes do uso, porque o ponteiro sozinho diz quais elementos estão em uso.

    Uma pilha alta de livros empilhados planos uns sobre os outros
    Uma pilha de livros é uma pilha que você pode ver. Você só pode adicionar ou retirar um livro do topo, então o último que você colocou é o primeiro que você retira — isso é exatamente LIFO

    Fila

    Uma fila 队列 funciona em ordem FIFO 先进先出 (First In, First Out). Operações: enqueue 入队 (adicionar na traseira), dequeue 出队 (remover da frente) e testes para vazio/cheio. Usos: spooling de impressão, agendamento, busca em largura, buffering.

    Uma fila linear armazenada em um array mostrada em três estados; o enqueue avança o ponteiro Traseiro e o dequeue avança o ponteiro Frontal, deixando a célula inicial vazia e desperdiçada
    Enqueue adiciona na traseira; dequeue remove da frente

    Para descrever a adição de um item: verifique se a fila não está cheia; armazene o item na posição indicada pelo ponteiro final da fila; incremente o ponteiro final (e a contagem). Para descrever a remoção: verifique se a fila não está vazia; leia o item no ponteiro frontal; incremente o ponteiro frontal (e decremente a contagem). Enuncie a convenção que você usa: se o ponteiro final marca o próximo espaço livre, ponteiros frontais e finais iguais significam que a fila está vazia; se marca o último item, ponteiros iguais significam um item. Em uma fila linear, o ponteiro frontal só se move para frente, então células atrás dele são desperdiçadas; é isso que a fila circular abaixo corrige. As duas características de uma fila a enunciar: os itens são adicionados na traseira e removidos da frente, então o primeiro item adicionado é o primeiro removido.

    Uma linha muito longa de pessoas esperando uma atrás da outra, estendendo-se ao longo de uma parede até o horizonte
    Uma fila de pessoas é uma fila que você pode ver. Você entra na traseira e é atendido pela frente, então quem esperou mais tempo é atendido primeiro — isso é exatamente FIFO

    Lista encadeada

    Uma lista encadeada 链表 armazena dados como uma sequência de nós 节点. Cada nó contém um valor e um ponteiro 指针 para o próximo nó; um ponteiro de início marca o começo, e o ponteiro do último nó é um sentinela (por exemplo, NULL). Operações: inserir, excluir, pesquisar e percorrer 遍历 (visitar cada nó em ordem). Sua vantagem sobre um array é a inserção/exclusão barata (basta ajustar os ponteiros); sua desvantagem é o acesso aleatório lento (você deve seguir os ponteiros desde o início).

    Quatro nós em fileira, cada um segurando um valor e um campo de ponteiro next; um ponteiro head aponta para o primeiro nó e o ponteiro do último nó é NULL
    Uma lista encadeada: cada nó aponta para o próximo

    Adicionar um nó em ordem (quatro pontos): percorra a lista a partir do início, seguindo os ponteiros, até encontrar o nó antes da posição desejada (o último nó cujo valor seja menor); pegue um nó livre e armazene o novo valor nele; defina o ponteiro do novo nó para o endereço para o qual o nó anterior apontava; defina o ponteiro do nó anterior para o novo nó. Se o novo valor pertencer ao início, o ponteiro de início é alterado em vez disso. Excluir um nó: encontre o nó antes dele e defina o ponteiro desse nó para o endereço para o qual o nó excluído apontava, contornando-o na lista; o nó liberado retorna à lista de nós livres. Comparado com um array 1D, a inserção ou exclusão em uma lista encadeada não requer deslocamento dos outros itens, e a lista pode crescer até que a memória acabe; o custo é o ponteiro extra armazenado com cada item, e alcançar o item $n$ significa seguir $n$ ponteiros, já que não há índice direto.

    Explorar

    Uma lista encadeada: nós unidos por ponteiros

    Cada nó armazena um valor e um ponteiro para o próximo nó. Inserir ou deletar apenas religa ponteiros — nenhum item se move, diferentemente de uma matriz.

    Explorar

    Pilhas e filas

    Empurrar e retirar. Uma pilha (stack) é último a entrar, primeiro a sair; uma fila (queue) é primeiro a entrar, primeiro a sair — dois TADs principais.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    stack/stæk/ 栈 zhàn
    dimension/daɪˈmenʃn/ 维度 wéi dù
    push/pʊʃ/ 入栈 rù zhàn
    separator/ˈsepəreɪtə/ 分隔符 fēn gé fú
    linked list/lɪŋkt lɪst/ 链表 liàn biǎo
    queue/kjuː/ 队列 duì liè
    LIFO/ˈlaɪfəʊ/ 后进先出 hòu jìn xiān chū
    FIFO/ˈfaɪfəʊ/ 先进先出 xiān jìn xiān chū
    pop/pɒp/ 出栈 chū zhàn
    enqueue/enˈkjuː/ 入队 rù duì
    dequeue/diːˈkjuː/ 出队 chū duì
    Assistir aula
    10.4

    Implementando ADTs usando arrays

    Pilha usando um array

    Mantenha os itens em Stack[1:MaxSize] com um inteiro Top (0 quando vazio).

    • Push(x): se Top = MaxSize a pilha estiver cheia (transbordamento 溢出); caso contrário, Top ← Top + 1; Stack[Top] ← x.
    • Pop(): se Top = 0 a pilha estiver vazia (underflow 下溢); caso contrário, retorne Stack[Top] e Top ← Top - 1.

    Fila usando um array circular

    Uma fila simples permite que Front e Rear avancem até o final, desperdiçando o início. A correção é um array circular 循环数组 — quando um ponteiro atinge MaxSize, ele volta para 1:

    • Enqueue(x): verificar se está cheio; caso contrário, Rear ← (Rear MOD MaxSize) + 1; Queue[Rear] ← x.
    • Dequeue(): verificar se está vazio; caso contrário, retorne Queue[Front] e Front ← (Front MOD MaxSize) + 1.

    Rastreie uma contagem separada para distinguir vazio de cheio.

    O algoritmo para o ponteiro de fim, em palavras: se a contagem for igual ao tamanho, informe que a fila está cheia e pare; caso contrário, adicione um ao ponteiro de fim; se agora ele ultrapassar o último índice, defina-o como o primeiro índice; armazene o item lá e adicione um à contagem. As declarações que uma resposta de "descreva a declaração e inicialização" de cinco pontos lista: o array com seu tamanho e tipo de elemento; um ponteiro de frente e um ponteiro de fim, ambos inicializados para o primeiro índice (ou a frente para o primeiro índice e o fim para o próximo espaço livre); e uma contagem de itens, inicializada para $0$.

    Por exemplo, com MaxSize = 6: se Rear = 5, então (5 MOD 6) + 1 = 6, portanto o próximo item vai na célula 6; se Rear = 6, então (6 MOD 6) + 1 = 1, portanto o ponteiro volta para a célula 1.

    Uma fila circular armazenada em um array; as células preenchidas passam pela última célula de volta ao início, com uma seta curva mostrando o ponteiro voltando do último índice para a célula 1
    Uma fila circular devolve os ponteiros ao início do array

    Lista encadeada usando um array

    Use um array de registros, cada um com um índice Next:

    TYPE TNode
        DECLARE Value : INTEGER
        DECLARE Next : INTEGER     // index of the next node, or -1 for end
    ENDTYPE
    
    DECLARE Nodes : ARRAY[1:MaxSize] OF TNode
    DECLARE Head : INTEGER         // index of first node, -1 if empty
    DECLARE FreeListHead : INTEGER // first available free node
    

    Uma lista de nós livres 空闲列表 encadeia as posições não utilizadas, assim como a lista de dados encadeia as utilizadas. Para inserir: pegue uma posição de FreeListHead, defina o valor do novo nó e Next, e atualize o Next do nó anterior (ou Head). Para excluir: desvincule o nó e devolva sua posição à lista de nós livres. Isso dá a flexibilidade de uma estrutura encadeada com a alocação estática de um array.

    Um array Value e um array Next paralelo implementando uma lista encadeada; um ponteiro Head encadeia os nós usados e um ponteiro FreeListHead encadeia as slots livres, cada uma terminando em Next = -1
    Uma lista encadeada armazenada em um array: um array de dados e um array de ponteiros

    Exemplo resolvido. Uma lista encadeada é mantida em um array Data e um array Pointer, com Start apontando para o índice 1. A lista é 1 → 3 → 4 (o índice 1 contém D40, o índice 3 contém D32, o índice 4 contém D11, cujo ponteiro é $\emptyset$); a lista de nós livres começa no índice 2 e continua 2 → 5. Insira D6 entre D32 e D11.

    Pegue o primeiro nó livre, índice 2, e defina FreeStart para seu ponteiro, 5; armazene D6 em Data[2]; defina Pointer[2] para o valor Pointer[3] mantido, que é 4; defina Pointer[3] para 2. A lista lê 1 → 3 → 2 → 4 e a lista de nós livres é 5 → $\emptyset$. A resposta para "como a lista encadeada pode ser implementada" são exatamente estas partes: um array (ou array de registros) para os dados, um array paralelo para os ponteiros contendo índices, um ponteiro de início, um ponteiro de lista de nós livres e um valor nulo como $-1$ para o fim.

    Exemplo resolvido. Uma fila circular é mantida em um array de tamanho 5 (índices 0 a 4) com Front = 3, Rear = 3 e um item armazenado. Dois itens são adicionados, depois dois são removidos. Onde estão os ponteiros e por que usar uma fila circular? Cada movimento usa (pointer + 1) MOD size, então os ponteiros voltam. Adicionando duas vezes move Rear: $3 \rightarrow 4$, depois $4 \rightarrow 0$ (porque $(4+1) \bmod 5 = 0$), então Rear = 0 e três itens são armazenados. Removendo duas vezes move Front da mesma maneira: $3 \rightarrow 4$, depois $4 \rightarrow 0$, deixando Front = 0 e um item. O retorno é o ponto principal: em uma fila de array linear, os ponteiros avançam até o final e o espaço liberado no início é desperdiçado mesmo quando a fila está vazia. Lembre-se de que uma fila remove na Frente e adiciona na Traseira - uma pilha usa um ponteiro para ambos.

    Explorar

    Implementando ADTs com matrizes

    FIFO

    Uma fila é primeira-a-entrar-primeiro-a-sair — enfileirar na parte traseira, desenfileirar pela frente.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    pointer/ˈpɔɪntə/ 指针 zhǐ zhēn
    node/nəʊd/ 节点 jié diǎn
    traverse/trəˈvɜːs/ 遍历 biàn lì
    free list/friː lɪst/ 空闲列表 kòng xián liè biǎo
    overflow/ˌəʊvəˈfləʊ/ 溢出 yì chū
    underflow/ˌʌndəˈfləʊ/ 下溢 xià yì
    circular array/ˈsɜːkjʊlə əˈreɪ/ 循环数组 xún huán shù zǔ
    10.4

    Definições aceitas pelo examinador

    Uma questão de definição é marcada contra texto fixo. Aprenda estes exatamente.

    Termo Definição
    record uma estrutura de dados que mantém um conjunto de itens de dados (campos) de diferentes tipos de dados sob um único identificador
    array uma estrutura de dados que mantém um número fixo de elementos do mesmo tipo de dados sob um único identificador, cada um acessado por um índice
    index o número que identifica um elemento de um array
    upper bound, lower bound o maior e o menor índice válido de um array
    text file um arquivo que armazena dados como linhas de caracteres, que um programa lê e escreve uma linha de cada vez
    abstract data type uma coleção de dados junto com um conjunto de operações sobre esses dados
    pilha uma lista na qual os itens são adicionados e removidos da mesma extremidade, o topo, então o último item adicionado é o primeiro removido (LIFO)
    fila uma lista na qual os itens são adicionados na traseira e removidos da frente, então o primeiro item adicionado é o primeiro removido (FIFO)
    linked list uma lista na qual cada nó contém um item de dados e um ponteiro para o próximo nó, com um ponteiro de início para o primeiro nó
    pointer uma variável que contém o endereço (ou índice) de um nó ou de uma posição em uma estrutura
    busca linear verificar cada elemento sequencialmente a partir do primeiro até que o alvo seja encontrado ou o fim seja atingido
    bubble sort passadas repetidas pelo array comparando pares adjacentes e trocando aqueles fora de ordem, até que uma passada não faça trocas
    Vocabulário Treinar
    Inglês Chinês Pinyin
    data type/ˈdeɪtə taɪp/ 数据类型 shù jù lèi xíng
    lower bound/ˈləʊə baʊnd/ 下界 xià jiè
    upper bound/ˈʌpə baʊnd/ 上界 shàng jiè
    linear search/ˈlɪnɪə sɜːtʃ/ 线性查找 xiàn xìng chá zhǎo
    text file/tekst faɪl/ 文本文件 wén běn wén jiàn
    end of file/end ɒv faɪl/ 文件结束 wén jiàn jié shù
    Abstract Data Type/ˈæbstrækt ˈdeɪtə taɪp/ 抽象数据类型 chōu xiàng shù jù lèi xíng
    10.4

    Dicas de prova

    • Escolha a estrutura de dados certa e justifique-a (um record para campos mistos, um array 2-D para uma grade).
    • Saiba como implementar uma pilha, fila e lista encadeada com um array e ponteiros (topo; frente/traseira; next).
    • Distinga um ADT (seu comportamento) de sua implementação (array mais ponteiros).

    Erros comuns

    • Uma declaração de registro sem ENDTYPE, ou campos sem tipos. Cada campo é uma linha DECLARE com um tipo.
    • Ler além do fim de um arquivo, ou escrever com WRITE quando o arquivo deve manter seu conteúdo. Teste EOF antes de cada leitura; use APPEND para adicionar.
    • Escrever um número em um arquivo de texto sem convertê-lo. Um arquivo mantém strings: NUM_TO_STR para fora, STR_TO_NUM de volta.
    • Esquecer as verificações. Push e enqueue testam se está cheio primeiro; Pop e dequeue testam se está vazio primeiro, e a resposta diz isso.
    • Perder o resto da lista ao inserir um nó. Defina o ponteiro do novo nó para o nó next antigo antes de alterar o ponteiro do nó anterior.
    • Uma busca linear que nunca diz "não encontrado". Inicialize a posição em $-1$ e teste-a após o loop.
  • 11

    Programação

    Assistir aula
    11.1

    Fundamentos de programação

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Implementar e escrever pseudocódigo a partir de um projeto dado apresentado como um fluxograma de programa ou inglês estruturado
    Escrever instruções de pseudocódigo para: • a declaração e inicialização de constantes • a declaração de variáveis • a atribuição de valores a variáveis • expressões envolvendo qualquer um dos operadores aritméticos ou lógicos entrada do teclado e saída no console
    Usar funções embutidas e rotinas de biblioteca Quaisquer funções não fornecidas no guia de pseudocódigo serão fornecidas Funções de manipulação de string sempre serão fornecidas

    Fonte: Programa Cambridge International

    Linhas de código-fonte em uma tela escura
    Programação transforma um projeto em instruções escritas como código
    Um programador trabalhando em um computador
    Um programador escreve o código e o testa conforme avança

    Do projeto ao código

    Você deve ser capaz de transformar um projeto — um fluxograma 流程图 (program flowchart) ou inglês estruturado 结构化英语 — em pseudocódigo 伪代码, e depois em uma linguagem real:

    1. encontre as variáveis 变量 e seus tipos de dados 数据类型.
    2. transforme caixas de entrada/saída em INPUT / OUTPUT.
    3. transforme losangos de decisão em IF...ELSE...ENDIF (ou CASE).
    4. transforme setas de loop em WHILE, REPEAT...UNTIL ou FOR.
    5. transforme caixas de processo em atribuições ou cálculos.
    6. verifique traçando uma pequena entrada.
    Mapeamento de símbolos de fluxograma para pseudocódigo: um paralelogramo de entrada/saída torna-se INPUT ou OUTPUT, um losango de decisão torna-se IF...THEN ou CASE, uma caixa de processo torna-se uma atribuição x = expressão, e uma seta de loop torna-se WHILE, FOR ou REPEAT
    Cada símbolo de fluxograma torna-se uma palavra-chave de pseudocódigo

    Constantes e variáveis

    Uma constante 常量 armazena um valor que nunca muda; uma variável armazena um que pode mudar. Declare-os com um tipo:

    O valor de uma variável pode mudar; uma constante permanece fixa
    O valor de uma variável pode mudar; uma constante permanece fixa
    CONSTANT Pi = 3.14159
    DECLARE Radius : REAL
    DECLARE Area : REAL
    
    Radius ← 5
    Area ← Pi * Radius * Radius
    

    Use constantes para valores fixos que se repetem (Pi, MaxScore); elas tornam o código mais claro e fácil de alterar em um único local.

    Na prova, uma constante é a resposta para "identificar uma maneira mais apropriada de representar" um valor fixo, como uma taxa de imposto ou uma pontuação máxima, que aparece em vários lugares no pseudocódigo. Os benefícios listados pelo critério: o valor é definido uma vez e não pode ser alterado acidentalmente pelo programa; uma alteração é feita em um único local e alcança cada instrução que o utiliza; o identificador dá ao valor um significado (MaxScore em vez de 100), tornando o código mais fácil de ler e verificar; e há menos risco de erro de digitação em um valor longo como 3.14159. Uma questão "diga um valor que poderia ser substituído por uma constante" quer o literal do pseudocódigo (0.2, 40), não um novo nome.

    Toda variável é declarada uma vez, com um identificador 标识符 (seu nome) e um tipo de dados, antes de ser usada. Os seis tipos no guia de pseudocódigo 9618:

    Tipo Armazena Escrito no código como Uso típico
    INTEGER números inteiros 42, -3 um contador, um índice de array, um contador de loop
    REAL números com parte fracionária 3.75 um preço, uma média
    CHAR um único caractere 'A' (aspas simples) uma letra de nota, uma tecla de menu
    STRING uma sequência de caracteres "Hello" (aspas duplas) um nome, um CEP
    BOOLEAN TRUE ou FALSE TRUE uma flag como Found
    DATE uma data calendar 12/05/2026 uma data de nascimento

    Uma questão "dê o tipo de dados apropriado" é respondida a partir de como a variável é usada no pseudocódigo: um valor com ponto decimal é REAL; algo definido como TRUE ou FALSE é BOOLEAN; um valor entre aspas simples é CHAR; um valor usado como índice de array, ou com DIV e MOD, é INTEGER. Escreva o tipo em maiúsculas, grafado como o guia o faz.

    Exemplo resolvido. Diga o tipo de dados apropriado para cada variável.

    Found ← FALSE
    Initial ← 'K'
    Price ← 12.99
    Count ← Count + 1
    Name ← "Li Wei"
    

    Found é BOOLEAN (ele contém FALSE); Initial é CHAR (um caractere entre aspas simples); Price é REAL (um valor decimal); Count é INTEGER (um contador que aumenta em um); Name é STRING (texto entre aspas duplas).

    Atribuição e expressões

    Use ← para atribuição 赋值:

    Total ← Total + 1
    Average ← Sum / Count
    

    Expressões usam operadores 运算符:

    • aritméticos + - * /, mais DIV (divisão inteira) e MOD (resto): 7 DIV 2 = 3; 7 MOD 2 = 1.
    • comparações =, <>, <, >, <=, >=.
    • lógicos AND, OR, NOT.

    Precedência 优先级 (maior para menor): NOT → * / DIV MOD → + - → comparações → AND → OR. Use parênteses quando tiver dúvida.

    Entrada e saída

    OUTPUT "Enter your name:"
    INPUT Name
    OUTPUT "Hello, ", Name
    

    Funções embutidas e rotinas de biblioteca

    Muitas tarefas têm rotinas de biblioteca 库例程 prontas, então você não precisa escrevê-las. A folha inserir 附页 da Prova 2 lista aquelas que você pode usar, com seus nomes exatos, parâmetros e tipos de retorno; qualquer outra função que uma questão precise é dada na própria questão. Os nomes abaixo são os da insert. VAL e STR são nomes IGCSE e aparecem em nenhum documento 9618, então não valem nada. UCASE e LCASE são um caso diferente: eles são 9618, definidos no Guia de Pseudocódigo, mas recebem um único CHAR, e a insert não os lista de todo — para uma string inteira na Prova 2, a rotina é TO_UPPER.

    Uma biblioteca de programas 程序库 contém rotinas que já foram escritas, compiladas e testadas; um programa as chama em vez de escrever as próprias. Os benefícios que o critério aceita, para uma questão "diga três benefícios": as rotinas estão já testadas, portanto são menos propensas a conter erros; economizam tempo de desenvolvimento; podem fazer coisas que o programador não conseguiria escrever (estatística complexa, gráficos); são escritas por especialistas e reutilizadas em muitos programas; e uma rotina com interface fixa pode ser chamada de qualquer lugar no programa.

    Rotina Retorna Exemplo
    LENGTH(s) o número de caracteres em s LENGTH("Hello") = 5
    LEFT(s, n) / RIGHT(s, n) os primeiros / últimos n caracteres RIGHT("Hello", 2) = "lo"
    MID(s, start, n) n caracteres a partir da posição start (as posições contam a partir de 1) MID("Hello", 2, 3) = "ell"
    TO_UPPER(s) / TO_LOWER(s) s em maiúsculas / em minúsculas TO_UPPER("ab1") = "AB1"
    NUM_TO_STR(x) / STR_TO_NUM(s) um número como string / uma string como número STR_TO_NUM("3.5") = 3.5
    IS_NUM(s) TRUE se s for um número válido IS_NUM("12a") = FALSE
    ASC(c) / CHR(n) o código do caractere de c / o caractere com código n ASC('A') = 65, CHR(66) = 'B'
    INT(x) a parte de número inteiro de x INT(7.9) = 7
    RAND(n) um número real aleatório de 0 até, mas sem incluir, n INT(RAND(6)) + 1 é um lançamento de dado
    DAY(d), MONTH(d), YEAR(d) as partes de um ⟨DATE⟩ YEAR(TODAY())
    DAYINDEX(d), SETDATE(d, m, y), TODAY() o dia da semana (1 = Domingo); uma data construída a partir de três inteiros; a data de hoje
    EOF(f) TRUE quando o arquivo f não tem mais linhas para ler WHILE NOT EOF("data.txt")

    Strings são unidas com & (concatenação 连接): "A" & "BC" é "ABC". Use os nomes exatos da inserção, com os parâmetros em sua ordem.

    Datas e números aleatórios aparecem como declarações de uma linha. SETDATE(17, 11, 2007) cria 17 de novembro de 2007; 12 - MONTH(MyDOB) é o número de meses do mês de nascimento até o fim do ano; IF DAYINDEX(MyDOB) = 5 THEN testa por uma quinta-feira, porque domingo é o dia 1. RAND(n) retorna um número real de 0 até, mas sem incluir, n, então um inteiro aleatório de Low a High inclusive é INT(RAND(High - Low + 1)) + Low: INT(RAND(21)) - 10 dá um valor de -10 a 10.

    A string COMPUTER mostrada como oito caixas numeradas de caracteres (posições 1 a 8), com resultados resolvidos: LENGTH(s) = 8, LEFT(s, 3) = COM, MID(s, 4, 3) = PUT, RIGHT(s, 2) = ER, e UCASE/LCASE alterando o caso das letras
    As rotinas comuns de strings atuando em s = "COMPUTER" (posições 1–8)

    Exemplo resolvido. Avalie cada expressão, dado Word ← "Program", Code ← 'Q' e N ← 7.

    Expressão Valor Por quê
    LENGTH(Word) 7 sete caracteres
    MID(Word, 4, 2) "gr" dois caracteres, começando na posição 4
    LEFT(Word, 3) & "!" "Pro!" unido com &
    TO_UPPER(RIGHT(Word, 2)) "AM" a função interna executa primeiro
    ASC(Code) - ASC('A') 16 'Q' é 81 e 'A' é 65
    N DIV 2 + N MOD 2 4 3 + 1
    NUM_TO_STR(N) & "th" "7th" o número torna-se uma string primeiro
    INT(N / 2) 3 3.5 cortado para sua parte inteira

    Trabalhe de dentro para fora, e mantenha as aspas: "7" é uma string e 7 é um número.

    Exemplo resolvido. Cada declaração pode conter um erro em seu uso de uma função ou operador. Descreva o erro, ou escreva SEM ERRO. (Assuma que todas as variáveis têm o tipo correto.)

    Declaração Erro
    Result ← 2 & 4 & une strings; 2 e 4 são inteiros, então + é necessário
    SubString ← MID("pseudocode", 4, 1) SEM ERRO: um caractere da posição 4, "u"
    IF x = 3 OR 4 THEN OR precisa de um Boolean de cada lado: IF x = 3 OR x = 4 THEN
    Result ← Status AND INT(x / 2) AND precisa de dois Booleans; INT(x / 2) é um inteiro
    Message ← "Done" + LENGTH(MyString) + não pode somar uma string a um inteiro: "Done" & NUM_TO_STR(LENGTH(MyString))

    Todo operador funciona em tipos específicos: & em strings, + - * / DIV MOD em números, AND OR NOT em Booleans, e = <> em dois valores do mesmo tipo. Uma tabela "avalie cada expressão, ou escreva ERROR" é marcada da mesma forma: LENGTH(42) e "A" + 1 são ERROR, porque o tipo não corresponde à função ou ao operador.

    Exemplo resolvido. Com Points ← 100, Active ← TRUE e Exempt ← FALSE, avalie cada expressão.

    Expressão Valor Por quê
    (Points > 99) OR Active TRUE ambos os lados são verdadeiros; um bastaria
    (Points MOD 2 = 0) OR Exempt TRUE 100 MOD 2 é 0
    (Points <= 75) AND (Active OR Exempt) FALSE o primeiro lado é falso, e AND precisa de ambos
    (Active OR NOT Active) AND NOT Exempt TRUE Active OR NOT Active é sempre verdadeiro

    A última expressão simplifica: X OR NOT X é TRUE independente de X, então toda a expressão é apenas NOT Exempt. Avalie os parênteses primeiro, depois NOT, depois AND, depois OR.

    Explorar

    Uma variável é uma caixa rotulada

    Cada atribuição armazena um valor em uma caixa nomeada; reatribuir o mesmo nome sobrescreve-o. Passe pelo programa e observe cada caixa assumindo seu valor atual.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    flowchart/ˈfləʊtʃɑːt/ 流程图 liú chéng tú
    structured English/ˈstrʌktʃəd ˈɪŋɡlɪʃ/ 结构化英语 jié gòu huà yīng yǔ
    pseudocode/ˈsuːdəʊkəʊd/ 伪代码 wěi dài mǎ
    variables/ˈveərɪəblz/ 变量 biàn liàng
    data types/ˈdeɪtə taɪps/ 数据类型 shù jù lèi xíng
    assignment/əˈsaɪnmənt/ 赋值 fù zhí
    constant/ˈkɒnstənt/ 常量 cháng liàng
    identifier/aɪˈdentɪfaɪə/ 标识符 biāo shí fú
    array/əˈreɪ/ 数组 shù zǔ
    operators/ˈɒpəreɪtəz/ 运算符 yùn suàn fú
    precedence/ˈpresɪdəns/ 优先级 yōu xiān jí
    function/ˈfʌŋkʃn/ 函数 hán shù
    library routines/ˈlaɪbrəri ruːˈtiːnz/ 库例程 kù lì chéng
    insert/ˈɪnsɜːt/ 附页 fù yè
    parameters/pəˈræmɪtəz/ 参数 cān shù
    program library/ˈprəʊɡræm ˈlaɪbrəri/ 程序库 chéng xù kù
    concatenation/kənˌkætəˈneɪʃn/ 连接 lián jiē
    selection/sɪˈlekʃn/ 选择 xuǎn zé
    nested/ˈnestɪd/ 嵌套 qiàn tào
    logic error/ˈlɒdʒɪk ˈerə/ 逻辑错误 luó jí cuò wù
    trace table/treɪs ˈteɪbl/ 跟踪表 gēn zōng biǎo
    iteration/ˌɪtəˈreɪʃn/ 迭代 dié dài
    count-controlled loop/kaʊnt kənˈtrəʊld luːp/ 计数循环 jì shù xún huán
    pre-condition loop/priː kənˈdɪʃn luːp/ 前测循环 qián cè xún huán
    post-condition loop/pəʊst kənˈdɪʃn luːp/ 后测循环 hòu cè xún huán
    dry run/draɪ rʌn/ 手工跟踪 shǒu gōng gēn zōng
    11.2

    Seleção

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Usar pseudocódigo para escrever: • uma instrução 'IF' incluindo a cláusula 'ELSE' e IFs aninhados • uma estrutura 'CASE' • um laço 'controlado por contador': • um laço 'pós-condição' • um laço 'pré-condição'
    Justificar por que uma estrutura de laço pode ser mais adequada para resolver um problema do que as outras

    Fonte: Programa Cambridge International

    Seleção 选择 escolhe quais etapas executam.

    IF age >= 18 THEN
        OUTPUT "Adult"
    ELSE
        OUTPUT "Minor"
    ENDIF
    
    Um fluxograma: do início, um losango de decisão testa age >= 18; o ramo TRUE输出 Adult e o ramo FALSE输出 Minor, e ambos se reúnem no fim
    Um IF...ELSE testa a condição uma vez, então executa exatamente um ramo

    Para mais de dois casos, você pode usar um aninhado 嵌套 IF, mas aninhamentos profundos são difíceis de ler — um CASE é mais limpo ao testar um valor contra várias opções:

    CASE OF Grade
        "A": OUTPUT "Excellent"
        "B": OUTPUT "Good"
        OTHERWISE: OUTPUT "Try again"
    ENDCASE
    

    Cambridge CASE permite valores únicos, listas de valores (1, 2, 3:) e intervalos (1 TO 5:).

    Um IF aninhado é um IF dentro de uma ramificação de outro IF. Cada IF precisa do seu próprio ENDIF, e o examinador verifica se cada construção está fechada:

    IF Mark >= 50 THEN
        IF Mark >= 80 THEN
            OUTPUT "Distinction"
        ELSE
            OUTPUT "Pass"
        ENDIF
    ELSE
        OUTPUT "Fail"
    ENDIF
    

    Limites são onde se perdem marcas. "Uma nota de 50 ou mais passa" é Mark >= 50, não Mark > 50; a última CASE ramificação, para "qualquer outra coisa", é escrita como OTHERWISE, não uma condição como > 200. Uma comparação errada aqui é um erro lógico 逻辑错误: o programa executa, mas produz a saída incorreta para algumas entradas — e uma tabela de traço com um valor limite como 50 é como você o encontra.

    Um fluxograma de uma sentença CASE OF Grade: o valor é testado contra cada guarda sequencialmente (um valor único, uma lista de valores, depois um intervalo); a primeira ramificação correspondente executa sua sentença, caso contrário a ramificação OTHERWISE é executada, e todas as ramificações se reúnem no ENDCASE
    Uma sentença CASE executa a ramificação que corresponde ao valor

    Exemplo resolvido. Reescreva isto com a mesma funcionalidade, sem usar uma estrutura CASE.

    CASE OF MySwitch
        1: ThisChar ← 'a'
        2: ThisChar ← 'y'
        3: ThisChar ← '7'
        OTHERWISE: ThisChar ← '*'
    ENDCASE
    

    Cada valor torna-se uma ramificação de uma cadeia de IFs, e OTHERWISE torna-se o último ELSE:

    IF MySwitch = 1 THEN
        ThisChar ← 'a'
    ELSE
        IF MySwitch = 2 THEN
            ThisChar ← 'y'
        ELSE
            IF MySwitch = 3 THEN
                ThisChar ← '7'
            ELSE
                ThisChar ← '*'
            ENDIF
        ENDIF
    ENDIF
    

    Duas cláusulas que atribuem o mesmo valor são fundidas em uma única cláusula com uma lista de valores: 1, 2: ThisChar ← 'a'. As guardas são testadas na ordem: com intervalos como 1 TO 50: seguidos por 40 TO 60:, um valor de 45 toma a primeira ramificação que corresponde, então uma atribuição em uma ramificação posterior pode nunca ser executada — e quando as ramificações anteriores já cobrem todos os valores possíveis, a ramificação OTHERWISE também nunca é alcançada.

    No sentido oposto, IFs aninhados que testam vários booleans são mais claros como uma condição por resultado: IF A AND B AND C THEN CALL Sub1(), depois IF A AND B AND NOT C THEN CALL Sub2(), e assim por diante. Unir testes com AND e OR remove o aninhamento, e IF A THEN é aceito no lugar de IF A = TRUE THEN.

    Explorar

    Seleção (SE / SENÃO)

    Altere a entrada e veja qual ramo é executado — a essência da seleção.

    11.2

    Iteração

    Iteração 迭代 repete um bloco. Três laços diferem na quantidade de vezes que o corpo é executado.

    Loop controlado por contagem (FOR)

    Um laço controlado por contagem 计数循环 — use-o quando souber quantas vezes deve repetir:

    FOR i ← 1 TO 10
        OUTPUT i
    NEXT i
    

    Um STEP pode alterar a contagem (ex. FOR i ← 10 TO 1 STEP -1). Ideal para um número fixo de repetições ou processar cada elemento de uma matriz 数组.

    Laço de pré-condição (WHILE)

    Um laço de pré-condição 前测循环 testa a condição antes de cada passagem, podendo executar zero vezes:

    WHILE total < 100 DO
        INPUT n
        total ← total + n
    ENDWHILE
    

    Laço de pós-condição (REPEAT...UNTIL)

    Um laço de pós-condição 后测循环 testa a condição depois de cada passagem, executando sempre pelo menos uma vez:

    REPEAT
        INPUT password
    UNTIL password = correctPassword
    

    Escolher o laço correto

    Três colunas de fluxogramas. FOR: uma caixa de contagem (i = 1 até N) seguida por uma caixa de corpo, retornando em loop, para um número definido de passagens. WHILE: um losango de teste acima de uma caixa de corpo, verificando a condição antes do corpo e permitindo zero execuções. REPEAT: uma caixa de corpo acima de um losango de teste, verificando a condição após o corpo, garantindo pelo menos uma execução
    Os três laços diferem em onde a condição é testada — antes do corpo (WHILE), depois dele (REPEAT) ou um número fixo de vezes (FOR)
    • contagem conhecida de antemão → FOR.
    • pode precisar de zero passagens → WHILE.
    • pelo menos uma passagem obrigatória → REPEAT...UNTIL.

    Justifique sua escolha pela contagem ser conhecida e se o corpo deve executar pelo menos uma vez. Uma questão típica apresenta um cenário ("pedir senha até estar correta, mas sempre pedir pelo menos uma vez") e pergunta qual laço se adapta.

    As duas marcas são para o nome do laço e a razão, nas palavras do gabarito: controlado por contagem, porque o número de iterações é conhecido antes do início; pós-condição, porque o corpo deve ser executado pelo menos uma vez; pré-condição, porque o laço pode não precisar executar. Um laço sobre os quatro elementos de uma matriz escrito como um WHILE com um contador é "não o mais adequado": a contagem, quatro, é conhecida, então um laço FOR se encaixa.

    Exemplo resolvido. Qual laço se adapta a cada tarefa? (a) imprimir a tabela de multiplicar por 12; (b) continuar lendo números até o usuário inserir 0; (c) pedir uma senha até estar correta. Escolha perguntando quantas vezes o corpo executa e quando o teste ocorre. (a) A contagem é conhecida adiante (12), use um laço FOR. (b) A contagem é desconhecida, e a própria primeira entrada pode já ser 0 — o teste deve vir antes do corpo: um laço WHILE, que executa zero ou mais vezes. (c) A contagem é desconhecida, mas você deve sempre pedir pelo menos uma vez antes de haver algo para testar — o teste vem depois do corpo: um REPEAT...UNTIL, que executa uma ou mais vezes. A pergunta decisiva é se o corpo deve executar pelo menos uma vez: WHILE pode executar zero vezes, REPEAT sempre executa uma vez.

    Execução manual com tabela de traço

    Uma tabela de traço 跟踪表 registra o valor de cada variável enquanto você faz execução manual 手工跟踪 (percorre à mão) um algoritmo. É como testar um laço no papel, e uma questão de seis marcas na maioria dos Paper 2s.

    DECLARE Count, Total : INTEGER
    Count ← 1
    Total ← 0
    WHILE Total < 10
        Total ← Total + Count * 2
        Count ← Count + 1
    ENDWHILE
    OUTPUT Count, Total
    
    Count Total Total < 10 OUTPUT
    1 0 VERDADEIRO
    2 2 VERDADEIRO
    3 6 VERDADEIRO
    4 12 FALSO 4, 12

    Regras que ganham marcas: uma coluna por variável, na ordem dada pela questão; escreva um valor apenas quando ele muda; inicie uma nova linha sempre que o laço repetir; avalie a condição com os valores atuais, e pare no momento em que for FALSE; coloque a saída em sua própria coluna, exatamente como apareceria. Rastreie o algoritmo conforme escrito, não aquele que você acha que foi pretendido — se nunca parar, diga isso.

    Exemplo resolvido. Quais construções cada linha usa — seleção, iteração ou chamada de subrotina?

    Pseudocódigo Seleção Iteração Subrotina
    IF Ready = TRUE THEN
    CALL Start()
    

    FIM_SE | FOR I ← 1 TO 20 ... NEXT I | | yes | | | WHILE NOT IsFull() ... ENDWHILE | | yes | yes | | CASE OF Key ... OTHERWISE ... ENDCASE | yes | | |

    IF e CASE são seleção; FOR, WHILE e REPEAT são iteração; um nome seguido por parênteses — Start(), IsFull() — é uma chamada a um procedimento ou função, onde quer que apareça, inclusive dentro de uma condição.

    Explorar

    Rastreie um laço, passagem por passagem

    Uma tabela de rastro registra cada variável após cada passagem do laço. Observe o contador i subir enquanto o total acumulado se constrói — exatamente o que uma questão de rastro de exame pede para preencher.

    Explorar

    Rastreando um loop

    Passe passo a passo pelo loop e observe as variáveis mudarem a cada iteração — exatamente o que uma tabela de traçado registra.

    11.3

    Procedimentos e funções

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Definir e usar uma procedura
    Explicar onde na construção de um algoritmo seria apropriado usar uma procedura
    Usar parâmetros Uma procedura pode ter nenhum, um ou mais parâmetros Um parâmetro pode ser passado por referência ou por valor
    Definir e usar uma função
    Explicar onde na construção de um algoritmo é apropriado usar uma função Uma função é usada em uma expressão, ex.: o valor retornado substitui a chamada
    Usar a terminologia associada a proceduras e funções incluindo cabeçalho da procedura/função, interface da procedure/função, parâmetro, argumento, valor retornado
    Escrever pseudocódigo eficiente

    Fonte: Programa Cambridge International

    Programação estruturada 结构化编程 constrói um programa a partir de pequenas subrotinas 子程序 nomeadas, cada uma com uma única função.

    Procedimento

    Um procedimento 过程 é um bloco nomeado que realiza uma ação; pode receber parâmetros 参数 mas não retorna um valor.

    PROCEDURE Greet(name : STRING)
        OUTPUT "Hello, ", name
    ENDPROCEDURE
    
    CALL Greet("Ada")
    

    Função

    Uma função 函数 é semelhante a um procedimento, mas retorna um valor que se torna parte de uma expressão.

    FUNCTION Square(x : INTEGER) RETURNS INTEGER
        RETURN x * x
    ENDFUNCTION
    
    result ← Square(5) + 1     // result = 26
    

    Use um procedimento quando a subrotina realizar uma ação; use uma função quando calcular um valor para quem a chama.

    O programa de estudos pede onde na construção de um algoritmo cada um é apropriado. Um procedimento é apropriado onde o mesmo grupo de passos é necessário em vários pontos (validar uma entrada, imprimir um menu, trocar dois valores): os passos são escritos uma vez e CALL chamados por nome. Uma função é apropriada onde um único valor deve ser calculado e depois usado em uma expressão — um total, um resultado de TRUE/FALSE, o maior de dois números — porque o valor retornado 返回值 substitui a chamada: IF IsValid(Code) THEN.

    Dois painéis. Procedimento: call Greet(Ada) realiza uma ação e imprime Hello, Ada, retornando nenhum valor. Função: set y = Square(5) calcula 5 vezes 5 = 25, retorna 25, então y contém 25
    Um procedimento realiza uma ação e não retorna nada; uma função retorna um valor que você usa em uma expressão

    Parâmetros

    Um parâmetro é uma variável que uma subrotina declara para receber entrada; os valores que o chamador fornece são argumentos 实参. Duas formas de passá-los:

    • pass by value 传值 — a rotina recebe uma cópia; alterações internas não afetam o chamador. Use para entradas que ela apenas lê.
    • pass by reference 传引用 — a rotina recebe uma referência à variável do chamador; alterações afetam o chamador. Use quando deve atualizar um parâmetro.
    Dois diagramas de caixas de memória. Pass by value: a variável x = 5 do chamador é copiada para uma caixa separada a = 5, alterando a deixa x como 5. Pass by reference: o parâmetro a é uma seta apontando para a própria caixa x do chamador, alterando a também altera x
    Pass by value copia o valor para uma nova caixa; pass by reference permite que a rotina altere a variável do chamador
    PROCEDURE Swap(BYREF a : INTEGER, BYREF b : INTEGER)
        DECLARE temp : INTEGER
        temp ← a
        a ← b
        b ← temp
    ENDPROCEDURE
    

    O pseudocódigo Cambridge escreve o modo no cabeçalho, BYVAL ou BYREF, antes de cada parâmetro. Se nenhum for escrito, assume-se BYVAL, então uma rotina que deve alterar a variável do chamador — Swap, ou um procedimento que atualiza um total acumulado — precisa de BYREF em seu cabeçalho.

    Exemplo resolvido. O que é impresso?

    PROCEDURE Adjust(BYREF X : INTEGER, BYVAL Y : INTEGER)
        X ← X + Y
        Y ← Y * 2
    ENDPROCEDURE
    
    A ← 5
    B ← 3
    CALL Adjust(A, B)
    OUTPUT A, B
    

    X é uma referência a A, então A torna-se 8. Y é uma cópia de B, então dobrar Y deixa B em 3. A saída é 8, 3. Se o cabeçalho tivesse dito BYVAL X, A ainda seria 5.

    Variáveis locais vs globais

    Uma variável local 局部变量 é declarada dentro de uma subrotina e existe apenas enquanto esta roda. Uma variável global 全局变量 é declarada fora e é visível em toda parte. Prefira locais e parâmetros — uso intenso de globais torna o código difícil de seguir e testar. (A região onde um nome é visível é seu escopo 作用域.)

    A diferença de uma linha: uma variável global pode ser acessada de qualquer lugar no programa, uma variável local apenas dentro da subrotina que a declara. Benefícios das variáveis locais aceitos pelo gabarito: o mesmo identificador pode ser usado em outra subrotina sem colisão; o valor não pode ser alterado acidentalmente por outras partes do programa; a memória é liberada quando a subrotina termina; e a subrotina é autônoma, podendo ser testada isoladamente e reutilizada em outro programa.

    Uma variável local é criada cada vez que a subrotina é chamada e destruída ao retornar, não podendo carregar um valor de uma chamada para a próxima. Um procedimento que constrói uma string ao longo de chamadas repetidas, portanto, precisa que essa string seja global (ou passada BYREF). Se MyString for mudado de global para local declarado dentro de MyOutput(), toda chamada começa com um novo MyString vazio, o texto adicionado pelas chamadas anteriores é perdido, e o procedimento "não funciona como esperado".

    Três chamadas do mesmo procedimento em uma linha do tempo; cada chamada cria sua própria caixa local MyString, nova e vazia, que desaparece ao retornar, enquanto uma caixa global MyString acima delas mantém seu valor entre as chamadas
    Uma variável local é uma nova caixa vazia em cada chamada; apenas uma variável global (ou um parâmetro BYREF) mantém um valor entre chamadas
    Uma grande caixa externa rotulada escopo global contém a variável global Total, visível em toda parte, e uma caixa interna menor rotulada PROCEDURE Calc, escopo local, que contém a variável local temp, que existe apenas enquanto Calc roda
    Uma variável global é visível em toda parte; uma variável local existe apenas dentro de sua própria procedimento

    Quando usar uma subrotina

    Use uma subrotina quando:

    • a mesma lógica aparece em mais de um lugar — escreva-a uma vez, chame-a várias vezes.
    • um bloco tem um propósito nomeado claro — o nome documenta o que ele faz.
    • o programa é complexo — divida-o em partes (decomposição 分解).
    • você quer testar um trecho isoladamente.

    Não as faça tão pequenas que o custo da chamada seja maior que o trabalho interno.

    Terminologia

    • definição — o bloco PROCEDURE ... ENDPROCEDURE (ou função).
    • chamada — onde é invocada. argumento — um valor passado. parâmetro — a variável que o recebe.
    • valor de retorno — o que uma função devolve.
    • cabeçalho do procedimento/função — a primeira linha dando o nome e os parâmetros (PROCEDURE Name(params) ou FUNCTION Name(params) RETURNS type).
    • interface/cabecalho do procedimento/função / assinatura 签名 — nome + parâmetros + tipo de retorno: o que um chamador precisa saber para usá-la.

    Exemplo resolvido. Descreva cada termo usado no cabeçalho FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.

    Termo Significado
    FUNCTION uma subrotina que retorna um valor
    Pass2 o identificador usado para chamá-la
    Count o parâmetro: o identificador que recebe o argumento passado
    INTEGER o tipo de dados do parâmetro
    RETURNS BOOLEAN o tipo de dados do valor que a função retorna

    Os dois identificadores em PROCEDURE MyProc(Count : INTEGER, Message : STRING) são parâmetros: eles recebem os valores passados quando o procedimento é chamado, e são usados dentro dele como variáveis locais.

    Para converter um procedimento em uma função: mude PROCEDURE para FUNCTION e adicione RETURNS <type>; substitua o OUTPUT (ou o BYREF parâmetro que carregava o resultado para fora) por uma instrução RETURN; e mude todas as chamadas para que o valor retornado seja usado, Result ← Unpack(Text) em vez de CALL Unpack(Text, Result). Para uma questão "escreva o cabeçalho", escreva a linha inteira: FUNCTION Calculate(Expression : STRING) RETURNS INTEGER. Um parâmetro de array é passado por referência, então um procedimento que escreve em um array altera o array do chamador.

    Quando um programa ganha um novo módulo, a interface é o que é acordado primeiro: o nome, os parâmetros (quantos, em que ordem, de que tipo) e o tipo de retorno, além de quaisquer dados globais que o módulo lê ou escreve. Um módulo que envia um lembrete antes de uma data limite precisa do registro (ou seu índice) como parâmetro e não retorna nada, então é um procedimento; o programa principal o chama uma vez por registro.

    Escrevendo um módulo para Paper 2

    Metade do Paper 2 é "escrever pseudocódigo para o módulo X". O esquema atribui uma marca por recurso, então um módulo incompleto ainda pontua por cada parte correta. As partes que o examinador procura:

    Uma função de pseudocódigo anotada, CountAbove, com um destaque em cada parte que vale uma marca: o cabeçalho com seu parâmetro e tipo de retorno, as declarações locais, o total inicializado antes do loop, o FOR sobre cada elemento, a condição IF com o limite correto, a atualização dentro da IF, as construções fechadas, e o RETURN após o loop
    Cada parte de uma resposta de módulo carrega sua própria marca, então escreva todas elas mesmo quando uma estiver incerta
    1. O cabeçalho, conforme descrito na questão: PROCEDURE Name(Param : TYPE) ou FUNCTION Name(Param : TYPE) RETURNS TYPE, com BYREF onde a rotina deve alterar o argumento.
    2. Declarações locais: DECLARE cada variável local com seu tipo, e inicie contadores e totais (Count ← 0).
    3. O loop que visita todos os elementos: FOR Index ← 1 TO 50 para um array cujo tamanho é dado; WHILE NOT EOF(...) para um arquivo.
    4. A condição, com a comparação e o limite corretos, no item certo: IF Score[Index] > Limit THEN.
    5. A atualização dentro do ramo: a contagem aumentada, o valor armazenado, ou a mensagem exibida.
    6. O fim: RETURN uma vez, após o loop, em uma função; ENDFUNCTION ou ENDPROCEDURE; e todo IF, FOR e WHILE fechado.

    Exemplo resolvido. Um array global Score : ARRAY[1:50] OF INTEGER contém notas de teste. Escreva uma função CountAbove(Limit : INTEGER) que retorne quantas notas são maiores que Limit.

    FUNCTION CountAbove(BYVAL Limit : INTEGER) RETURNS INTEGER
        DECLARE Index, Count : INTEGER
        Count ← 0
        FOR Index ← 1 TO 50
            IF Score[Index] > Limit THEN
                Count ← Count + 1
            ENDIF
        NEXT Index
        RETURN Count
    ENDFUNCTION
    

    Marcas: o cabeçalho com seu parâmetro e RETURNS INTEGER; Count declarado e definido como 0; um loop sobre todos os 50 elementos; a comparação > Limit (não >=); a contagem atualizada dentro da IF; RETURN Count após o loop. O programa principal usa o valor de retorno em uma expressão ou saída: OUTPUT "Above 70: ", CountAbove(70).

    Exemplo resolvido. Escreva uma função IsValid(Code : STRING) que retorne TRUE quando Code for duas letras maiúsculas seguidas de quatro dígitos — o formato 格式 AB1234 — e FALSE caso contrário.

    FUNCTION IsValid(BYVAL Code : STRING) RETURNS BOOLEAN
        DECLARE Index : INTEGER
        DECLARE Ch : STRING
        IF LENGTH(Code) <> 6 THEN
            RETURN FALSE
        ENDIF
        FOR Index ← 1 TO 6
            Ch ← MID(Code, Index, 1)
            IF Index <= 2 THEN
                IF Ch < "A" OR Ch > "Z" THEN
                    RETURN FALSE
                ENDIF
            ELSE
                IF Ch < "0" OR Ch > "9" THEN
                    RETURN FALSE
                ENDIF
            ENDIF
        NEXT Index
        RETURN TRUE
    ENDFUNCTION
    

    A verificação de comprimento vem primeiro, então MID nunca é solicitado para uma posição que não existe. Validação 验证 assim retorna um BOOLEAN para que o chamador possa escrever IF IsValid(Entry) THEN ... ELSE OUTPUT "Invalid code" ENDIF: uma mensagem ao usuário é exibida pelo chamador, não pela função — uma função calcula, um procedimento age.

    Exemplo resolvido. Escreva uma função IsPalindrome(Word : STRING) que retorne TRUE quando Word for lido de trás para frente da mesma forma, como "RACECAR".

    Compare os caracteres das duas extremidades, movendo-se para dentro: a posição Index é pareada com a posição Len - Index + 1, e apenas a primeira metade precisa ser testada.

    A palavra RACECAR em sete caixas numeradas; arcos pareiam a posição 1 com 7, 2 com 6 e 3 com 5, rotulados posição i e posição Len menos i mais 1; o caractere central não tem par
    Um teste de palíndromo pareia a posição i com a posição Len - i + 1 e para no meio
    FUNCTION IsPalindrome(BYVAL Word : STRING) RETURNS BOOLEAN
        DECLARE Len, Index : INTEGER
        Len ← LENGTH(Word)
        FOR Index ← 1 TO Len DIV 2
            IF MID(Word, Index, 1) <> MID(Word, Len - Index + 1, 1) THEN
                RETURN FALSE
            ENDIF
        NEXT Index
        RETURN TRUE
    ENDFUNCTION
    

    As mesmas três ferramentas — um FOR sobre as posições, MID(s, i, 1) para ler um caractere, e & para construir uma nova string — respondem à maioria dos módulos de strings no Paper 2: contar quantas vezes um caractere ocorre (IF MID(s, i, 1) = Ch THEN Count ← Count + 1), substituir todas as instâncias de um caractere (adicionar ou NewChar ou o caractere original a NewString em cada posição), esconder tudo exceto os últimos quatro dígitos de um número de cartão (adicionar '*' para cada posição até Len - 4), ou escrever seu próprio MID() unindo os caracteres de Start a Start + Length - 1. Pedir MID para uma posição após o final da string é um erro de tempo de execução, então verifique LENGTH primeiro.

    Arquivos. Os valores nas variáveis desaparecem quando o programa termina, então um módulo que deve manter dados para a próxima execução os grava em um arquivo: OPENFILE "scores.txt" FOR WRITE, um WRITEFILE "scores.txt", NUM_TO_STR(Score[Index]) por linha dentro do loop, e CLOSEFILE "scores.txt" uma vez, após o loop; ler novamente usa FOR READ, READFILE e WHILE NOT EOF("scores.txt"). O Tópico 10 tem a seção completa de arquivos; aqui as marcas são para abrir no modo correto, a leitura ou escrita dentro do loop, e fechar uma vez depois dele.

    Explorar

    A pilha de chamadas: empilha na chamada, desempilha no retorno

    Chamar uma subrotina empilha um novo quadro no topo; retornar o desempilha e devolve um valor ao chamador. A chamada que está executando é sempre o quadro no topo.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    procedure/prəˈsiːdʒə/ 过程 guò chéng
    structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ 结构化编程 jié gòu huà biān chéng
    subroutines/ˈsʌbruːtiːnz/ 子程序 zi chéng xù
    return value/rɪˈtɜːn ˈvæljuː/ 返回值 fǎn huí zhí
    arguments/ˈɑːɡjuːmənts/ 实参 shí cān
    pass by value/pæs baɪ ˈvæljuː/ 传值 chuán zhí
    pass by reference/pæs baɪ ˈrefrəns/ 传引用 chuán yǐn yòng
    global variable/ˈɡləʊbl ˈveərɪəbl/ 全局变量 quán jú biàn liàng
    local variable/ˈləʊkl ˈveərɪəbl/ 局部变量 jú bù biàn liàng
    scope/skəʊp/ 作用域 zuò yòng yù
    decomposition/ˌdiːkɒmpəˈzɪʃn/ 分解 fēn jiě
    signature/ˈsɪɡnɪtʃə/ 签名 qiān míng
    format/ˈfɔːmæt/ 格式 gé shì
    Validation/ˌvælɪˈdeɪʃn/ 验证 yàn zhèng
    run-time error/rʌn taɪm ˈerə/ 运行时错误 yùn xíng shí cuò wù
    11.3

    Escrevendo pseudocódigo eficiente

    Três recursos que tornam o pseudocódigo mais fácil de entender — a resposta para uma questão "aponte três recursos" — são identificadores significativos (Total, não t), indentação das instruções dentro de cada construção, e comentários (// ...) que explicam o propósito; palavras-chave em maiúsculas, uma instrução por linha e linhas em branco entre seções também são aceitas. Pseudocódigo eficiente vai mais longe:

    • mova invariantes para fora dos loops — se um valor (um invariante 不变量) não muda com o contador do loop, calcule-o uma vez antes do loop.
    • saia de um loop cedo quando a resposta for encontrada (pare uma busca linear 线性查找 assim que o alvo aparecer).
    • evite trabalho redundante — armazene um resultado e reutilize-o em vez de recalcular.
    • escolha a estrutura de dados certa — um array supera muitas variáveis separadas quando os itens pertencem juntos.
    • substitua IFs aninhadas profundas por CASE ao testar um valor contra muitos.
    • comente a intenção, não a mecânica (// validate the postcode, não // loop 6 times).
    • use nomes significativos (numberOfPupils, não n) e inicialize variáveis antes do uso.
    Mova trabalho que nunca muda para fora do loop, para que ele rode uma vez em vez de a cada passagem
    Mova trabalho imutável para fora do loop para que ele rode uma vez
    Vocabulário Treinar
    Inglês Chinês Pinyin
    invariant/ɪnˈveərɪənt/ 不变量 bù biàn liàng
    linear search/ˈlɪnɪə sɜːtʃ/ 线性查找 xiàn xìng chá zhǎo
    syntax error/ˈsɪntæks ˈerə/ 语法错误 yǔ fǎ cuò wù
    11.3

    Testando e erros

    Três tipos de erro, cada um encontrado de uma maneira diferente:

    Erro O que é Exemplo Encontrado por
    erro de sintaxe 语法错误 uma instrução que viola as regras da linguagem um ENDIF faltante; OUTPT "Hi" o tradutor, antes do programa rodar
    erro de tempo de execução 运行时错误 o programa roda, mas uma instrução não pode ser executada divisão por zero; um índice de array de 0 ou 51; uma função chamada com um parâmetro inválido; um loop que nunca termina, fazendo o programa "congelar" durante a execução: o programa para ou trava
    erro lógico o programa roda até o fim, mas a saída está errada > em vez de >=; um total nunca definido como 0 testando com uma tabela de traço e dados de teste escolhidos

    Um IDE 集成开发环境 ajuda a encontrar os últimos dois: um ponto de interrupção 断point para o programa em uma linha escolhida; execução passo a passo 单步执行 então roda uma instrução por vez; e a janela de relatório (ou monitor) mostra o valor de cada variável naquele momento, para que a linha onde um valor fica errado seja vista diretamente. Métodos de teste e dados de teste estão no tópico 12.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    IDE/ˌaɪ diː ˈiː/ 集成开发环境 jí chéng kāi fā huán jìng
    breakpoint/ˈbreɪkpɔɪnt/ 断点 duàn diǎn
    single stepping/ˈsɪŋɡl ˈstepɪŋ/ 单步执行 dān bù zhí xíng
    11.3

    Definições aceitas pelo examinador

    Uma questão de definição é marcada contra texto fixo. Aprenda estes exatamente.

    Termo Definição
    procedure uma subrotina que executa uma tarefa (uma sequência de passos) e não retorna um valor; é chamada com CALL
    função uma subrotina que retorna um único valor ao ponto onde foi chamada, para que possa ser usada em uma expressão
    parameter o identificador em um cabeçalho de subrotina que recebe um valor ou uma referência quando a subrotina é chamada
    argument o valor (ou variável) fornecido na chamada, correspondido a um parâmetro
    passing by value uma cópia do valor do argumento é dada à subrotina, então mudanças internas não afetam a variável original
    passing by reference o endereço da variável é dado à subrotina, então mudanças internas alteram a variável original
    header a primeira linha de uma definição de subrotina: seu nome, seus parâmetros e, para uma função, seu tipo de retorno
    interface o que um programa chamador precisa saber para usar uma subrotina: seu nome, seus parâmetros (número, ordem, tipo) e seu tipo de retorno
    retorno o valor que uma função devolve à expressão que a chamou
    variável local declarada dentro de uma subrotina; existe apenas enquanto a subrotina é executada e pode ser usada apenas dentro dela
    variável global declarada fora de todas as subrotinas; pode ser usada em qualquer lugar do programa
    laço controlado por contagem repete um número fixo de vezes, controlado por um contador (FOR ... NEXT)
    laço pré-condição testa sua condição antes de cada iteração, então o corpo pode nunca executar (WHILE ... ENDWHILE)
    laço pós-condição testa sua condição após cada iteração, então o corpo executa pelo menos uma vez (REPEAT ... UNTIL)
    constante um valor nomeado que não pode mudar enquanto o programa é executado
    subrotina um bloco de código autocontido que realiza uma tarefa e é chamado por nome: um procedimento ou uma função
    rotina de biblioteca uma subrotina que já foi escrita e testada, e está disponível para ser chamada de um programa
    11.3

    Dicas de prova

    • Diferencie um procedimento (sem valor de retorno) de uma função (devolve um valor); entenda passagem por valor vs. por referência.
    • Escolha o laço certo: controlado por contagem (FOR) quando o número de repetições é conhecido, controlado por condição (WHILE/REPEAT) caso contrário.
    • Diferencie variáveis locais vs. globais e escopo; prefira variáveis locais em módulos reutilizáveis.
    • Use os nomes exatos das rotinas e ordem dos parâmetros do material didático. VAL e STR são nomes IGCSE e não pontuam; UCASE e LCASE são rotinas reais 9618 do Guia de Pseudocódigo, mas atuam sobre um caractere, então na Prova 2, toda uma string exige TO_UPPER ou TO_LOWER.
    • Em uma resposta "escreva pseudocódigo", o cabeçalho, as declarações, o laço, a condição, a atualização e o RETURN valem cada um uma marca: escreva todas as seis partes, mesmo se uma for incerta.

    Erros comuns

    • Chamar uma função sem usar o que ela devolve. Atribua o resultado, ou use-o na expressão ou saída: Sorted ← BubbleSort(MyArray, 7).
    • Passar um tamanho um: 6 para um array de sete elementos, ou o último índice onde o tamanho era desejado. Decida se o parâmetro é um tamanho ou um índice, e verifique se o último elemento é visitado.
    • Fechar um arquivo dentro do laço que o lê. Abra uma vez, feche uma vez, depois do laço.
    • Usar a entrada como um nome de arquivo diretamente. Adicione a extensão dada na questão: FileName ← Choice & ".txt".
    • Deixar construtos abertos. Todo IF precisa de seu ENDIF, todo FOR seu NEXT, todo WHILE seu ENDWHILE, e toda função seu RETURN; o esquema tem um ponto para isso.
    • Limites errados: > para "pelo menos" (que é >=), ou um FOR que começa em 0 para um array declarado [1:50].
    • Um contador ou total que nunca é definido como 0 antes do laço.
    • Em uma tabela de traçado, reescrever toda variável em cada linha, ou alterar um valor antes da declaração que o altera ter sido executada.
    • Metade de uma condição: IF x = 3 OR 4 — cada lado de OR e AND deve ser uma comparação completa. E + não junta strings; & faz isso.
    • Declarar como local um valor que deve sobreviver entre chamadas. Um total acumulado ou uma string construída ao longo de várias chamadas é global ou BYREF.
  • 12

    Desenvolvimento de Software

    Assistir aula
    12.1

    Ciclo de vida do desenvolvimento de programas

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão do propósito de um ciclo de desenvolvimento
    Demonstrar compreensão da necessidade de diferentes ciclos de desenvolvimento dependendo do programa sendo desenvolvido Incluindo: waterfall, iterativo, desenvolvimento rápido de aplicação (RAD)
    Descrever os princípios, benefícios e desvantagens de cada tipo de ciclo de vida
    Demonstrar compreensão das etapas de análise, projeto, codificação, testes e manutenção nenhuma ciclo de desenvolvimento de programas

    Fonte: Programa Cambridge International

    Um ciclo de vida de desenvolvimento 开发生命周期 é o conjunto de etapas desde a ideia até o software finalizado e mantido. Ele serve para planejar, gerenciar e controlar um projeto — construir o produto certo, no prazo, com boa qualidade.

    Uma equipe de software colaborando ao redor de uma mesa
    O software é construído por equipes que seguem um ciclo de vida de desenvolvimento para manter a coordenação
    Um fluxograma com terminadores, caixas de processo e losangos de decisão
    Um fluxograma planeja a lógica de um programa durante a etapa de projeto do ciclo

    Por que um ciclo de vida é necessário

    A lista do avaliador para "o propósito de um ciclo de vida de desenvolvimento": ele divide um grande projeto em etapas que podem ser planejadas e gerenciadas; garante que os requisitos sejam encontrados e concordados antes de iniciar o projeto e a codificação; inclui testes e documentação em vez de deixá-los para o final; permite que a equipe acompanhe o progresso contra marcos e gerencie riscos; e oferece ao cliente pontos definidos para revisar o trabalho. Sem um, uma equipe codifica primeiro e descobre tarde demais que construiu a coisa errada.

    Por que existem diferentes tipos

    Nenhum único ciclo de vida se adapta a todo projeto, então existem vários ciclos de vida de desenvolvimento. A escolha depende do tamanho e complexidade, quão claros os requisitos 需求 são no início, quanto de mudança é esperado, o nível de risco, a equipe e o prazo.

    Modelos comuns

    • Cascata 瀑布模型 — uma sequência linear (Análise → Projeto → Codificação → Teste → Manutenção), cada etapa concluída antes da próxima. Claro e bem documentado; bom para requisitos estáveis, mas mau para lidar com mudanças no meio do projeto, e o cliente vê nada funcionando até o final.
    • Modelo iterativo 迭代模型 — passadas repetidas, cada uma produzindo uma versão parcial que é revisada e refinada. Captura problemas mais cedo; bom quando requisitos são descobertos ao longo do tempo, mas mais difícil de estimar.
    • Desenvolvimento Rápido de Aplicativos 快速应用开发 (RAD) — uso intenso de um protótipo 原型 e feedback do usuário. Entrega muito rápida da primeira versão; bom para requisitos mutáveis, mas depende da disponibilidade do usuário e se adequa a sistemas menores.
    • Agile 敏捷 — iterações curtas ("sprints"), colaboração e testes constantes. Flexível e adaptativo, mas precisa de um cliente comprometido e uma equipe qualificada.
    Cinco caixas (Análise, Projeto, Codificação, Teste, Manutenção) cascando para baixo, cada uma levando à próxima
    O modelo em cascata: cada etapa é concluída antes da próxima começar
    Um ciclo Projeto-Construir-Testar-Revisar com um loop repetitivo voltando para Projeto, e barras de versão crescendo mais altas a cada passada até estar completo
    O modelo iterativo: passadas repetidas refinam o programa
    Três partes construídas em paralelo como protótipos que se refinam com feedback do usuário, depois combinadas no sistema final
    Desenvolvimento rápido de aplicativos: equipes trabalham em partes em paralelo

    Princípios, benefícios e desvantagens — conforme listado no esquema de correção.

    Modelo Princípio Benefícios Desvantagens
    cascata as etapas correm em uma ordem fixa, cada uma concluída e aprovada antes da próxima começar; voltar significa reiniciar a sequência simples de gerenciar; cada etapa é totalmente documentada; requisitos são fixados cedo, então custos e datas podem ser estimados inflexível depois que uma etapa é concluída; nenhum software funcionando até tarde; um erro na análise é caro de corrigir depois; o cliente não pode ver o progresso
    iterativo uma versão pequena e funcional é construída primeiro, depois repetidamente melhorada através de versões further até estar completo software funcionando cedo e frequentemente; problemas encontrados em versões iniciais; o feedback do usuário molda cada versão; requisitos podem mudar difícil estimar o tempo e custo totais; testes repetidos exigem esforço; precisa que o cliente esteja disponível; pode desviar se versões não forem planejadas
    RAD protótipos de partes do sistema são construídos rapidamente e refinados com o usuário até serem aceitos, muitas vezes em paralelo por várias equipes entrega muito rápida da primeira versão; o usuário está envolvido durante todo o processo, então o produto atende às necessidades dele; mudanças são fáceis de absorver precisa de desenvolvedores qualificados e usuários comprometidos; documentação é fraca; menos adequado para sistemas grandes ou críticos para segurança

    Exemplo resolvido. Uma empresa deve ser a primeira a lançar um site para um novo console de jogos, e o design mudará à medida que os recursos do console forem anunciados. Nomeie o ciclo de vida mais adequado e justifique.

    RAD. Um protótipo do site pode ser construído e mostrado aos usuários em poucos dias, e refinado à medida que os requisitos mudam; o site é pequeno o suficiente para uma abordagem guiada por protótipos, e a velocidade de entrega é o requisito principal. Cascata fixaria os requisitos antes de qualquer página ser construída e entregaria nada até o final.

    As etapas padrão

    Cada etapa tem um propósito, uma saída e atividades típicas — uma pergunta "descreva a etapa ..." quer duas ou três dessas.

    • análise — descobrir o que o programa deve fazer. Atividades: entrevistas, questionários e observação do sistema atual; um estudo de viabilidade; acordar a especificação de requisitos, contra a qual cada etapa posterior será verificada.
    • projeto — decidir como ele fará. Saídas: o diagrama de estrutura (módulos e parâmetros), fluxogramas ou pseudocódigo para cada módulo, tabelas de identificadores e estruturas de dados, layouts de tela e arquivo, e o plano de teste escrito agora, a partir da especificação, antes de qualquer código existir.
    • codificação (implementação 实现) — escrever o programa em uma linguagem de alto nível, módulo por módulo, seguindo o projeto; cada módulo é testado à medida que é escrito.
    • teste — executar o programa contra o plano de teste (dados normais, anormais, extremos e de fronteira) e corrigir os erros encontrados; testes de integração, alfa, beta e aceitação seguem.
    • manutenção 维护 — após o lançamento, corrigir falhas, adaptar o programa a novos hardware, software ou leis, e melhorá-lo (veja abaixo).

    Exemplo resolvido. Complete o diagrama de cascata Análise → ? → ? → ? → Manutenção e descreva o que acontece na etapa de projeto.

    As etapas faltantes são Projeto, Codificação, Teste. Na etapa de projeto, os requisitos são transformados em um plano para o programa: o problema é decomposto em módulos (um diagrama de estrutura), o algoritmo para cada módulo é escrito como pseudocódigo ou fluxograma, as estruturas de dados e identificadores são escolhidos, as telas e arquivos são dispostos, e o plano de teste é escrito a partir da especificação.

    Explorar

    O ciclo de vida do desenvolvimento de software

    Passe pelas etapas que todo projeto passa. Obter os requisitos corretos na análise é o mais importante — um erro capturado nos testes é muito mais caro de corrigir do que um capturado cedo.

    Explorar

    Laboratório de processo de software

    Classifique exemplos de desenvolvimento pela etapa ou ferramenta a que pertencem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    development life cycle/dɪˈveləpmənt laɪf ˈsaɪkl/ 开发生命周期 kāi fā shēng mìng zhōu qī
    requirements/rɪˈkwaɪəmənts/ 需求 xū qiú
    waterfall/ˈwɔːtəfɔːl/ 瀑布模型 pù bù mó xíng
    iterative model/ˈɪtərətɪv ˈmɒdl/ 迭代模型 dié dài mó xíng
    Rapid Application Development/ˈræpɪd ˌæplɪˈkeɪʃn dɪˈveləpmənt/ 快速应用开发 kuài sù yìng yòng kāi fā
    prototype/ˈprəʊtəʊtaɪp/ 原型 yuán xíng
    Agile/ˈædʒaɪl/ 敏捷 mǐn jié
    12.2

    Ferramentas de projeto de programas

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Usar um gráfico de estrutura para decompor um problema em subtarefas e expressar os parâmetros passados entre os vários módulos/proceduras/funções que fazem parte do projeto do algoritmo Descrever o propósito de um gráfico de estrutura Construir um gráfico de estrutura para um problema dado Derivar pseudocódigo equivalente a partir de um gráfico de estrutura
    Demonstrar compreensão do propósito de diagramas de transição de estado para documentar um algoritmo

    Fonte: Programa Cambridge International

    Diagrama de estrutura

    Um diagrama de estrutura 结构图 mostra a decomposição hierárquica 分解 de um programa em módulos (subrotinas 子程序) e os parâmetros 参数 passados entre eles. Cada módulo é um retângulo; linhas ligam o chamador (acima) ao chamado (abaixo); pequenas setas mostram dados indo para baixo e resultados voltando para cima. O projeto pode então ser convertido em pseudocódigo 伪代码 equivalente.

                    CalculatePay
                /        |         \
           GetEmployee  CalculateBonus  CalculateTax
           Returns:     Takes: sales    Takes: gross
           employeeID   Returns: bonus  Returns: tax
    

    É uma ferramenta de etapa de projeto, e você pode ler as assinaturas dos procedimentos nele.

    Um diagrama de estrutura com Converter temperatura no topo e módulos ENTRADA, Converter para Celsius e SAÍDA abaixo, com parâmetros de temperatura nas ligações
    Um diagrama de estrutura: módulos com os parâmetros passados entre eles

    Os símbolos que o avaliador pede. Uma caixa é um módulo; uma linha liga um chamador (acima) aos módulos que ele chama (abaixo), lida da esquerda para a direita na ordem em que são chamados. Uma pequena seta com um círculo aberto na cauda é um par de dados — um parâmetro passado para baixo dentro de um módulo ou um valor retornado para cima; uma seta com um círculo preenchido é um par de controlo, uma flag (geralmente BOOLEAN) que informa ao chamador o que aconteceu. Um losango numa ramificação significa seleção: apenas um dos módulos abaixo dele é chamado, dependendo de uma condição. Uma seta curva varrendo sobre as ligações significa iteração: os módulos sob ela são chamados repetidamente num ciclo.

    Um diagrama de estrutura mostrando todos os símbolos: caixas de módulo, linhas de chamada, um par de dados com círculo aberto transportando ID do item para baixo, um par de controlo com círculo preenchido retornando uma flag de estoque disponível para cima, um losango selecionando entre Imprimir fatura e Rejeitar pedido, e uma seta curva marcando os módulos repetidos para cada pedido
    Os símbolos do diagrama de estrutura: pares de dados e de controlo, um losango de seleção e uma seta de iteração

    Exemplo resolvido. Quatro módulos são definidos como PROCEDURE Main(), PROCEDURE ReadData(BYREF Count : INTEGER), FUNCTION IsValid(Value : INTEGER) RETURNS BOOLEAN e PROCEDURE Report(Total : INTEGER, Count : INTEGER). Main chama ReadData, depois chama IsValid uma vez para cada valor lido, depois chama Report. Descreva o diagrama de estrutura.

    Main no topo; ReadData, IsValid e Report numa fila abaixo dele, da esquerda para a direita na ordem de chamada. Na ligação ReadData, um par de dados ascendente Count (um parâmetro BYREF retorna). Na ligação IsValid, um par de dados descendente Value e um par de controlo ascendente (o resultado BOOLEAN), com uma seta de iteração curva sobre essa ligação porque é chamada para cada valor. Na ligação Report, dois pares de dados descendentes, Total e Count. Lendo no outro sentido, uma função é qualquer módulo que retorna um valor — seu cabeçalho precisa de RETURNS e do tipo retornado.

    Diagrama de transição de estado

    Um diagrama de transição de estado 状态转换图 mostra os estados 状态 que um sistema pode estar e os eventos que o movem entre eles — bom para máquinas de venda automática, semáforos, interfaces de usuário. Diagramas de transição de estado são usados para documentar o comportamento de um algoritmo ou sistema. Cada estado é um círculo; cada transição é uma seta rotulada com o evento.

       coin inserted               item selected
    [Idle] --------------→ [Awaiting selection] ----------→ [Dispensing]
    

    Torna fácil identificar transições ausentes ("e se uma segunda moeda for inserida enquanto aguarda seleção?").

    Um diagrama de estados: Trancado para Aguardando segundo dígito para Aguardando terceiro dígito para Destrancado, com transições de dígito correto e dígito errado
    Um diagrama de transição de estado para uma fechadura de porta com código 259

    Ler e desenhar um. Cada transição é rotulada entrada | saída (ou condição | ação): o que aconteceu, depois o que o sistema faz ao mudar de estado. Uma questão dá uma tabela de estado atual, entrada, saída, próximo estado e pede o diagrama, ou o inverso — cada linha da tabela corresponde exatamente a uma seta. Verifique se cada estado tem uma seta saindo dele para cada entrada que possa ocorrer, incluindo aquelas que deixam o estado inalterado (uma seta que volta para o mesmo estado).

    Exemplo resolvido. Um controlador de bomba tem estados bomba desligada e bomba ligada. Em bomba desligada, a entrada nível baixo detectado produz a saída ativar bomba e move para bomba ligada; em bomba ligada, nível normal detectado produz desativar bomba e move para bomba desligada. Qualquer outra entrada deixa o estado inalterado. Desenhe a tabela.

    Estado atual Entrada Saída Próximo estado
    bomba desligada nível baixo detectado ativar bomba bomba ligada
    bomba desligada nível normal detectado — bomba desligada
    bomba ligada nível normal detectado desativar bomba bomba desligada
    bomba ligada nível baixo detectado — bomba ligada

    As duas linhas "sem alteração" tornam-se setas de loop no diagrama; omiti-las resulta na perda de pontos por incompletude.

    Explorar

    Laboratório de processo de software

    Classifique exemplos de desenvolvimento pela etapa ou ferramenta a que pertencem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    structure chart/ˈstrʌktʃə tʃɑːt/ 结构图 jié gòu tú
    parameters/pəˈræmɪtəz/ 参数 cān shù
    pseudocode/ˈsuːdəʊkəʊd/ 伪代码 wěi dài mǎ
    test plan/test plæn/ 测试计划 cè shì jì huà
    implementation/ˌɪmplɪmənˈteɪʃn/ 实现 shí xiàn
    boundary data/ˈbaʊndəri ˈdeɪtə/ 边界数据 biān jiè shù jù
    acceptance testing/əkˈseptəns ˈtestɪŋ/ 验收测试 yàn shōu cè shì
    hierarchical decomposition/haɪəˈrɑːkɪkl ˌdiːkɒmpəˈzɪʃn/ 分解 fēn jiě
    decomposition/ˌdiːkɒmpəˈzɪʃn/ 分解 fēn jiě
    subroutines/ˈsʌbruːtiːnz/ 子程序 zi chéng xù
    state-transition diagram/steɪt trænˈsɪʃn ˈdaɪəɡræm/ 状态转换图 zhuàng tài zhuǎn huàn tú
    states/steɪts/ 状态 zhuàng tài
    syntax error/ˈsɪntæks ˈerə/ 语法错误 yǔ fǎ cuò wù
    run-time error/rʌn taɪm ˈerə/ 运行时错误 yùn xíng shí cuò wù
    logic error/ˈlɒdʒɪk ˈerə/ 逻辑错误 luó jí cuò wù
    dry run/draɪ rʌn/ 手工跟踪 shǒu gōng gēn zōng
    trace table/treɪs ˈteɪbl/ 跟踪表 gēn zōng biǎo
    12.3

    Erros

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de maneiras de expor e evitar falhas em programas
    Localizar e identificar os diferentes tipos de erros • erros de sintaxe • erros de lógica • erros de execução
    Corrigir erros identificados
    Demonstrar compreensão dos métodos de teste disponíveis e selecionar dados adequados para um método dado Incluindo execução seca, walkthrough, caixa branca, caixa preta, integração, alpha, beta, aceitação, stub
    Demonstrar compreensão da necessidade de uma estratégia de teste e plano de teste e seus prováveis conteúdos
    Escolher dados de teste adequados para um plano de teste Incluindo normal, anormal e extremo/borda
    Demonstrar compreensão da necessidade de manutenção contínua de um sistema e das diferenças entre cada tipo de manutenção Incluindo perceptiva, adaptativa, corretiva
    Analisar um programa existente e fazer alterações para melhorar a funcionalidade

    Fonte: Programa Cambridge International

    • erro de sintaxe 语法错误 — viola a gramática da linguagem (colchete faltando, palavra-chave grafada incorretamente). Capturado durante a tradução; o programa não executará até ser corrigido.
    • erro de tempo de execução 运行时错误 — ocorre enquanto executa (divisão por zero, arquivo não encontrado, índice de array fora do intervalo). O programa falha ou levanta uma exceção; corrige adicionando verificações.
    • erro lógico 逻辑错误 — o programa executa mas produz resultados errados (usar + para -, um erro de limite de ciclo, condições em ordem incorreta). O mais difícil de encontrar; o único sinal é a saída errada, então use testes cuidadosos e rastreamento.
    Um pipeline de escrever código para traduzir para executar para output: um erro de sintaxe para na tradução, um erro de tempo de execução falha durante a execução, e um erro lógico executa bem mas dá o output errado
    Quando cada erro aparece: sintaxe na tradução, tempo de execução durante a execução, lógico no output

    Expor e evitar falhas. Falhas são expostas por testes contra um plano de testes, por uma execução seca ou tabela de rastreamento, por uma revisão com colegas, e pelo depurador da IDE (pontos de interrupção, passo a passo, observação de variáveis). São evitadas projetando antes de codificar (diagrama de estrutura, pseudocódigo), por código modular com identificadores e comentários significativos, por validação de toda entrada, por lidar com exceções em vez de deixar um erro de tempo de execução travar o programa, e pelas verificações de sintaxe dinâmica da IDE enquanto se digita.

    Exemplo resolvido. Identifique o tipo de erro em cada caso e como ele se manifesta. (a) Result <- STR_TO_NUM(x) / STR_TO_NUM(y) é executado com y = "0". (b) A mesma linha é executada com x = "12a". (c) Um ciclo escrito como FOR i <- 1 TO 9 processa um array de dez elementos. (d) OUTPUT "Total: " Total está faltando uma vírgula.

    (a) Erro de tempo de execução — divisão por zero; o programa falha quando esta linha é executada com esses dados. (b) Erro de tempo de execução — a string não pode ser convertida em número. (c) Erro lógico — o programa executa mas o décimo elemento nunca é processado, então o output está errado. (d) Erro de sintaxe — a instrução viola as regras da linguagem e é relatada pelo tradutor antes do programa rodar.

    Exemplo resolvido. Corrija os erros neste pseudocódigo, que deve output a média de dez notas.

    Total <- 0
    FOR i <- 1 TO 10
        INPUT Mark
        Total <- Total + Mark
    NEXT i
    Average <- Total / 9
    OUTPUT "Average" Average
    

    A divisão deve ser por 10, não 9 (erro lógico); a linha de output precisa de uma vírgula ou de um & entre a string e o valor (erro de sintaxe); e Average nunca foi declarado como REAL (erro de sintaxe ou tempo de execução, dependendo da linguagem). Diga qual linha e qual é a linha corrigida: Average <- Total / 10.

    12.3

    Métodos de teste

    • execução seca 手工跟踪 — rastreie o código no papel, anotando o valor de cada variável numa tabela.
    • revisão 走查 — uma revisão em equipe do código.
    • teste branco 白盒测试 — projetado a partir da estrutura interna do código, cobrindo cada instrução, ramificação e ciclo.
    • teste preto 黑盒测试 — projetado apenas a partir da especificação: forneça entradas, verifique saídas.
    • teste de integração 集成测试 — combine módulos e teste as interfaces entre eles.
    • teste alfa α测试 — pelos desenvolvedores/interno antes do lançamento; teste beta β测试 — por um grupo limitado de usuários reais em seu próprio ambiente.
    • teste de aceitação 验收测试 — pelo cliente, para decidir se o produto serve ao propósito.
    • stub 桩 — um espaço reservado para um módulo que ainda não existe, para que a estrutura possa ser testada de cima para baixo.
    Teste preto funciona a partir da especificação; teste branco testa os caminhos internos do código
    Teste preto testa a especificação; teste branco testa os caminhos do código

    Qual método, quando. Um execução seca e uma revisão não precisam de computador — a execução seca é você, rastreando o algoritmo com uma tabela de rastreamento 跟踪表; a revisão é uma reunião em que o autor explica o código linha por linha e colegas buscam falhas, então também espalha conhecimento do código pela equipe e o verifica contra o projeto. Testes brancos são escritos por quem pode ver o código e visam exercitar cada caminho; testes pretos são escritos a partir da especificação e verificam apenas entradas contra saídas esperadas, então um usuário ou tester separado pode fazê-los. Teste de integração segue teste de módulo: módulos que passam sozinhos ainda podem falhar quando os dados passados entre eles têm tipo errado ou estão na ordem errada. Teste alfa é interno; teste beta entrega uma candidata a versão a uma amostra de usuários reais, que reportam falhas de uso real; teste de aceitação é o cliente verificando o produto final contra os requisitos antes de pagá-lo. Um stub permite que o teste de cima para baixo comece antes que todos os módulos existam.

    Teste stub: o programa principal em teste chama um Módulo A concluído e um stub representando o Módulo B não escrito, que tem o cabeçalho real mas simplesmente retorna um valor fixo
    Um stub substitui um módulo que ainda não foi escrito, para que os módulos acima possam ser testados agora

    Exemplo resolvido. Após o programa passar nos testes internos, foi entregue a um grupo de usuários para testar antes do lançamento. Nome este tipo de teste e diga o que acontece a seguir.

    Teste beta — usuários reais em seu próprio ambiente, reportando falhas que os desenvolvedores não encontraram. As falhas são corrigidas, depois o cliente realiza teste de aceitação contra os requisitos e o programa é lançado; falhas encontradas em uso real são então tratadas por manutenção corretiva.

    Exemplo resolvido. Cite três benefícios de testar um programa por revisão.

    Erros são encontrados por pessoas que não escreveram o código e, portanto, o leem sem pressupostos; a lógica é verificada contra o projeto e a especificação, não apenas contra dados de teste; várias pessoas aprendem como o código funciona, o que ajuda na manutenção futura; e nenhum dado de teste ou computador funcional é necessário, então pode ser feito cedo.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    stub/stʌb/ 桩 zhuāng
    corrective maintenance/kəˈrektɪv ˈmeɪntənəns/ 纠正性维护 jiū zhèng xìng wéi hù
    test strategy/test ˈstrætədʒi/ 测试策略 cè shì cè lüè
    normal data/ˈnɔːml ˈdeɪtə/ 正常数据 zhèng cháng shù jù
    abnormal data/əbˈnɔːml ˈdeɪtə/ 异常数据 yì cháng shù jù
    extreme data/ekˈstriːm ˈdeɪtə/ 极端数据 jí duān shù jù
    perfective maintenance/pəˈfektɪv ˈmeɪntənəns/ 完善性维护 wán shàn xìng wéi hù
    adaptive maintenance/əˈdæptɪv ˈmeɪntənəns/ 适应性维护 shì yìng xìng wéi hù
    12.3

    Estratégia e plano de teste

    Uma estratégia de teste 测试策略 é a abordagem de alto nível — quais tipos de teste, quem os faz, quando, e os critérios para prosseguir. Um plano de teste 测试计划 é a lista detalhada de testes — cada um com dados de entrada, saída esperada, e uma coluna para a saída real.

    O que cada um contém. Uma estratégia de teste estabelece quais métodos de teste serão usados em qual etapa (teste de módulo pelo programador, depois integração, alpha, beta, aceitação), quem é responsável por cada um, quais dados de teste são necessários e os critérios para passar à próxima etapa. Um plano de teste lista os testes individuais: para cada um, o módulo ou recurso em teste, os dados de entrada, a razão pela escolha dos dados (normal, anormal, extremo, limite), o resultado esperado, um espaço para o resultado real e o que fazer se diferirem. O plano é escrito na etapa de projeto, com base nas especificações, para testar o que o programa deveria fazer em vez do que ele acidentalmente faz.

    Escolhendo dados de teste

    Para cada campo ou condição, inclua três tipos:

    • dados normais 正常数据 — valores típicos dentro da faixa válida (para notas 0–100: 50, 75).
    • dados anormais 异常数据 — valores que deveriam ser rejeitados (-10, 200, "abc").
    • dados extremos 极端数据 — os maiores e menores valores ainda aceitos (0 e 100).
    • dados de fronteira 边界数据 — valores nas bordas, onde erros off-by-one se escondem (cada extremo aceito e o valor rejeitado logo fora dele: 0/-1, 100/101).
    Uma reta numérica para um campo de nota de 0 a 100: valores normais 50 e 75 no interior, os extremos 0 e 100 nos limites aceitos e valores anormais -1, 101, -10 e 200 rejeitados fora
    Dados de teste para um campo 0–100: normal no interior, extremos nas fronteiras, anormal fora

    Exemplo resolvido. Um campo aceita uma nota de exame de 0 a 100. Forneça dados de teste de cada tipo com seu resultado esperado. Normal: 50 - aceito, um valor típico dentro do intervalo. Anormal: -10, 200, "abc" - todos rejeitados, estando fora do intervalo ou do tipo de dados errado. Extremo: 0 e 100 - os maiores e menores valores que ainda são aceitos. Fronteira: os pares que cruzam cada borda - -1 rejeitado junto com 0 aceito, e 100 aceito junto com 101 rejeitado. Cada valor deve carregar seu resultado esperado, ou o plano de teste não prova nada. Extremo e fronteira são o par mais frequentemente confundido: um valor extremo fica dentro e é aceito, enquanto um teste de fronteira é sempre um par de cada lado da borda - que é exatamente onde os erros off-by-one se escondem.

    Exemplo resolvido. Um componente passa se seu peso, medido até o gram mais próximo, estiver dentro de 3 g do alvo de 50 g, ou seja, de 47 g a 53 g inclusive. Elabore as linhas do plano de teste para a verificação.

    Dados de teste Tipo Razão Resultado esperado
    50 normal um valor típico bem dentro da faixa aceito
    47, 53 extremo (fronteira) os menores e maiores valores que ainda devem ser aceitos aceito
    46, 54 fronteira os valores logo fora da faixa, onde um erro off-by-one os aceitaria rejeitado
    20, 90 anormal valores muito fora da faixa rejeitado
    "abc", −5 anormal tipo errado, peso negativo rejeitado

    Cada linha deve dizer por que o valor foi escolhido e o que deveria acontecer; uma lista nua de números não ganha pontos.

    12.3

    Manutenção

    A maior parte do custo de vida de um programa está na manutenção. Três tipos:

    Os três tipos de manutenção: perfectiva, adaptativa e corretiva
    Três tipos de manutenção: perfectiva, adaptativa e corretiva
    • manutenção perfectiva 完善性维护 — melhorar desempenho ou recursos mesmo funcionando (uma consulta mais rápida, uma nova opção).
    • manutenção adaptativa 适应性维护 — mantê-lo funcionando em um ambiente em mudança (um novo SO, uma nova API, uma mudança legal).
    • manutenção corretiva 纠正性维护 — corrigir bugs encontrados em uso.

    Um programa pode precisar dos três durante sua vida.

    Por que cada um é necessário — as razões listadas no gabarito. Corretiva: um defeito é reportado por um usuário após o lançamento, ou uma saída incorreta é notada em circunstâncias específicas que os testes não cobriram. Adaptativa: o sistema operacional, hardware ou navegador é atualizado; uma lei ou regra corporativa muda (taxas de imposto, requisitos de proteção de dados); o programa precisa funcionar com um novo sistema externo ou formato de arquivo. Perfectiva: usuários pedem recursos extras ou uma interface melhor; o programa é feito mais rápido ou usa menos memória; o código é limpo para facilitar mudanças futuras.

    Exemplo resolvido. (a) Um programa lançado exibe um valor errado sob certas circunstâncias. (b) O hardware que executa um programa é substituído. (c) Clientes pedem que o programa de fidelidade de uma cafetería envie uma mensagem no aniversário do cliente. Nomeie o tipo de manutenção em cada caso.

    (a) Corretiva — um defeito no programa entregue está sendo corrigido. (b) Adaptativa — o programa é alterado para rodar em seu novo ambiente. (c) Perfectiva — um recurso é adicionado a um programa que já funciona.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    maintenance/ˈmeɪntənəns/ 维护 wéi hù
    12.3

    Alterando um programa existente

    Quando solicitado a adicionar um recurso ou corrigir um bug:

    1. leia o código existente até entender o algoritmo e o fluxo de dados.
    2. encontre onde a alteração vai — qual subrotina, quais linhas.
    3. faça a alteração o menor possível — não reescreva código funcional.
    4. atualize partes relacionadas — todo chamador de uma lista de parâmetros alterada, toda rotina usando uma estrutura de dados alterada.
    5. teste o novo comportamento e o antigo (regression testing 回归测试 — verifique se não quebrou nada).
    6. documente a alteração.

    Comentários claros, nomes significativos, subrotinas decompostas e um diagrama estrutural tornam um programa muito mais fácil de alterar — é por isso que as ferramentas de projeto importam mesmo após o primeiro lançamento.

    Analisando um programa que você não escreveu. Comece pela tabela de identificadores e pelos cabeçalhos dos módulos: eles dizem o que cada módulo recebe e retorna antes de ler uma linha de seu corpo. Depois, faça o rastro do algoritmo com uma tabela de traçado para uma pequena entrada, anotando de onde vem cada valor de saída. Somente então decida onde a melhoria vai — geralmente um novo módulo chamado pelo existente, para perturbar o mínimo possível o código funcional — e escreva a pseudocódigo para a alteração e os dados de teste que a comprovam.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    regression testing/rɪˈɡreʃn ˈtestɪŋ/ 回归测试 huí guī cè shì
    12.3

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    ciclo de vida de desenvolvimento a sequência de etapas, da análise à manutenção, seguidas para produzir e suportar um programa
    modelo cascata um ciclo de vida em que as etapas são executadas em ordem fixa, cada uma concluída antes de começar a próxima
    modelo iterativo um ciclo de vida em que uma versão funcional é produzida e depois refinada repetidamente até ficar completa
    desenvolvimento rápido de aplicações um ciclo de vida que constrói protótipos rapidamente, refinando-os com feedback do usuário até serem aceitos
    diagrama estrutural um diagrama que mostra como um programa é decomposto em módulos, a ordem em que são chamados e os parâmetros passados entre eles
    diagrama de transição de estado um diagrama que mostra os estados em que um sistema pode estar e as entradas que causam sua movimentação entre eles
    erro de sintaxe um erro na forma como uma instrução é escrita, violando as regras da linguagem e impedindo a tradução
    erro lógico um erro no algoritmo, fazendo o programa rodar mas produzir resultado incorreto
    erro de tempo de execução um erro que ocorre enquanto o programa está rodando, como divisão por zero, e o interrompe
    simulação trabalhando através do algoritmo manualmente, registrando os valores das variáveis em uma tabela de rastreamento
    walkthrough uma revisão em que o autor passa pelo código com colegas que buscam erros
    stub um módulo placeholder com cabeçalho correto que retorna um valor fixo, usado para que os módulos que o chamem possam ser testados
    plano de teste uma lista dos testes a serem realizados, cada um com seus dados de teste, a razão para os dados e o resultado esperado
    dados de fronteira valores em cada borda da faixa válida, tanto o último valor aceito quanto o primeiro valor rejeitado
    manutenção corretiva / adaptativa / perfectiva corrigir falhas encontradas em uso / alterar o programa para se adequar a um ambiente mudado / melhorar um programa que já funciona
    Vocabulário Treinar
    Inglês Chinês Pinyin
    walkthrough/ˈwɔːkθruː/ 走查 zǒu chá
    white-box testing/waɪt bɒks ˈtestɪŋ/ 白盒测试 bái hé cè shì
    black-box testing/blæk bɒks ˈtestɪŋ/ 黑盒测试 hēi hé cè shì
    integration testing/ˌɪntɪˈɡreɪʃn ˈtestɪŋ/ 集成测试 jí chéng cè shì
    alpha testing/ˈælfə ˈtestɪŋ/ α测试 α cè shì
    beta testing/ˈbiːtə ˈtestɪŋ/ β测试 β cè shì
    12.3

    Dicas de prova

    • Compare modelos de desenvolvimento (cascata, iterativo, RAD) por princípio, benefício, desvantagem, e saiba as cinco etapas do ciclo de vida de desenvolvimento de programas e o que cada uma produz.
    • Diferencie erros de sintaxe, lógica e tempo de execução pelo momento em que aparecem: na tradução, na saída, durante a execução.
    • Escolha dados de teste de todos os tipos — normal, anormal, extremo e fronteira — e dê a cada valor sua razão e resultado esperado.
    • Diferencie os tipos de manutenção (corretiva, adaptativa, perfectiva) pelo motivo da alteração.
    • Em um diagrama estrutural, nomeie todos os símbolos: caixa, linha de chamada, acoplamento de dados, acoplamento de controle, diamante de seleção, seta de iteração. Ao ler cabeçalhos de módulo em um diagrama, lembre-se que uma função tem RETURNS.

    Erros comuns

    • Descrever uma etapa do ciclo de vida apenas pelo seu nome ("na etapa de projeto o programa é projetado"). Diga o que é produzido: diagrama estrutural, pseudocódigo, plano de teste.
    • Chamar uma saída errada de "erro de tempo de execução". Se o programa roda até o final, é um erro lógico.
    • Dar dados de fronteira apenas como os extremos. A questão pede os valores em ambos os lados da borda.
    • Tratar testes alpha e beta como iguais. Alpha é interno pelos desenvolvedores; beta é por usuários reais externos.
    • Confundir manutenção adaptativa e perfectiva. Adaptativa responde a uma mudança fora do programa; perfectiva melhora um programa que ninguém precisava alterar.
    • Desenhar um diagrama estrutural com os módulos em qualquer ordem. Eles são lidos da esquerda para a direita na ordem em que são chamados, e cada parâmetro precisa de sua seta.
  • 13

    Representação de Dados

    Assistir aula
    13.1

    Tipos de dados definidos pelo usuário

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão do porquê tipos definidos pelo usuário são necessários
    Definir e usar tipos não compostos Incluindo enumerado, ponteiro
    Definir e usar tipos de dados compostos Incluindo conjunto, registro e classe/objeto
    Escolher e projetar um tipo de dado definido pelo usuário adequado para um problema dado

    Fonte: Programa Cambridge International

    Os tipos embutidos (INTEGER, REAL, STRING, CHAR, BOOLEAN) cobrem os casos mais simples. Para problemas mais complexos, você pode definir tipos de dados definidos pelo usuário 用户定义类型, tornando o código mais claro e o compilador mais rigoroso.

    Por que são necessários

    Um tipo embutido STRING permite armazenar nonsense em um campo que deveria conter um de poucos valores legais; um tipo definido pelo usuário pode restringi-lo. Entidades reais geralmente são uma coleção de valores de diferentes tipos. E DECLARE Taxi : Vehicle é mais claro (autodocumentável) do que DECLARE Taxi : STRING.

    "Descreva o propósito de um tipo de dado definido pelo usuário" (duas marks). Um tipo de dado definido pelo programador, construído a partir de tipos existentes (inatos), para que dados específicos do problema possam ser representados quando nenhum tipo inato se encaixa. Ambas as metades pontuam: definido pelo programador e baseado em tipos existentes. O examinador também aceita "para tornar o programa mais legível e manutenível" como ponto de apoio, nunca isoladamente.

    "Explique o que se entende por tipos de dados não-compostos e compostos" (quatro marks). Um tipo não-composto é definido sem referência a outro tipo: ele armazena um único valor, por exemplo um inteiro, um real ou um valor enumerado. Um tipo composto é uma coleção de outros tipos (que podem ser compostos por sua vez): ele armazena vários valores sob um único identificador, por exemplo um registro, um conjunto, um array ou uma classe. Dê um exemplo com cada definição; o exame pede apenas um.

    Tipos não-compostos

    Tipo enumerado

    Um tipo enumerado 枚举类型 tem valores que são uma lista fixa de constantes nomeadas:

    TYPE Vehicle = (M100, M230, T101, T102, T120, T150)
    DECLARE MyTaxi : Vehicle
    MyTaxi ← T102
    

    Os nomes são valores do novo tipo (armazenados internamente como inteiros pequenos); você não pode atribuir nada fora da lista. Usos: dias da semana, cores, códigos de status.

    "Afirme o que se entende por um tipo de dado enumerado." Um tipo definido pelo usuário não-composto definido listando todos os seus valores possíveis (em ordem). Como os valores são ordenados, eles podem ser comparados e percorridos: com TYPE Month = (January, February, ..., December), o teste IF ThisMonth > June é legal, e os valores são armazenados internamente como inteiros. A pseudocódigo tem três partes e o exame marca cada uma: a palavra-chave TYPE, o identificador com =, e a lista entre colchetes separada por vírgulas.

    Exemplo resolvido. Escreva pseudocódigo para definir um tipo enumerado para os dias em que uma escola está aberta (segunda a sexta-feira) e declare uma variável desse tipo definida como quarta-feira.

    TYPE SchoolDay = (Monday, Tuesday, Wednesday, Thursday, Friday)
    DECLARE Today : SchoolDay
    Today ← Wednesday
    

    Uma variável de um tipo enumerado não pode receber um valor fora da lista, que é exatamente o ponto: Today ← Saturday é um erro de tempo de compilação, enquanto um STRING teria aceito "Saturdy".

    Um tipo enumerado Vehicle com os valores nomeados fixos M100, M230, T101, T102, T120 e T150; uma variável desse tipo só pode conter um deles
    Um tipo enumerado é uma lista fixa de valores nomeados

    Tipo ponteiro

    Um ponteiro 指针 armazena o endereço de memória de outra variável (ou NULL para "sem alvo"). Ponteiros constroem estruturas dinâmicas (listas encadeadas, árvores) e passam referências sem copiar.

    TYPE PNode = ^TNode    // pointer to a TNode
    DECLARE p : PNode
    p ← NEW TNode
    p^.Value ← 42          // dereference to reach the fields
    

    Para desreferenciar 解引用 (p^) significa alcançar a variável a qual aponta.

    "Afirme o que se entende por um tipo de dado ponteiro." Um tipo não-composto cujo valor é o endereço de memória de (uma referência a) uma variável de um tipo dado. A pseudocódigo declara o tipo com um acento circunflexo antes do tipo ao qual aponta, e o exame pede exatamente essa linha:

    TYPE SelectParts = ^Parts        // a pointer to a value of type Parts
    DECLARE Chosen : SelectParts
    Chosen ← ^Keyboard               // Chosen now holds the address of Keyboard
    OUTPUT Chosen^                   // dereference: the value stored at that address
    

    Ponteiros são o que uma lista encadeada dinâmica linked list ou uma árvore binária (Tópico 19) é construída: cada nó contém um ponteiro para o próximo. Duas marks são frequentemente perdidas aqui: escrever o tipo de ponteiro como se ele contivesse o valor em si, e esquecer o acento circunflexo ao ler através do ponteiro.

    Um ponteiro p armazena um endereço e aponta para um TNode contendo Value = 42 e um campo Next; p^ desrefencia para acessar os campos do nó, como p^.Value
    Um ponteiro armazena um endereço; p^ o desrefencia para acessar os campos do nó

    Tipos compostos

    Um tipo composto 复合类型 (um dos tipos de dados compostos) agrupa vários valores sob um único nome.

    Um conjunto: uma coleção não ordenada onde cada valor é único
    Um conjunto é uma coleção não ordenada de valores únicos
    Um registro Student com campos Name, Age, Grade e Enrolled, cada um de um tipo diferente
    Um registro agrupa campos de tipos diferentes sob um único nome
    • registro 记录 (Tópico 10) — campos de tipos diferentes em um bloco TYPE ... ENDTYPE.
    • conjunto 集合 — uma coleção não ordenada de valores únicos, com operações add, remove, teste de pertencimento, união, interseção:
    DECLARE Available : SET OF Colour
    Available ← {Red, Blue}
    IF Green IN Available THEN
        ...
    ENDIF
    
    • classe 类 / objeto 对象 — o tipo composto OOP, combinando campos de dados (atributos 属性) com operações sobre eles (métodos 方法). Um objeto é uma instância de uma classe:
    CLASS Taxi
        PRIVATE Capacity : INTEGER
        PUBLIC FUNCTION GetCapacity() RETURNS INTEGER
            RETURN Capacity
        ENDFUNCTION
    ENDCLASS
    

    Escolhendo um tipo

    Use enumerado para um valor de uma lista fixa, ponteiro para indireção, registro para um grupo de campos, conjunto para uma coleção única não ordenada, e classe quando precisar de estado e comportamento juntos.

    "Descreva o tipo de dado definido pelo usuário conjunto" (três marks). Um tipo composto que armazena uma coleção de valores do mesmo tipo, em nenhuma ordem específica e sem duplicatas; valores podem ser adicionados e removidos, e um valor pode ser testado quanto ao pertencimento. Declare o tipo com SET OF, depois defina uma constante de conjunto com seus valores entre colchetes:

    TYPE EvenNumbers = SET OF INTEGER
    DEFINE Evens (2, 4, 6, 8, 10, 12) : EvenNumbers
    TYPE SymbolSet = SET OF CHAR
    DEFINE Operators ('+', '-', '*', '/') : SymbolSet
    

    "Descreva o tipo de dado definido pelo usuário registro" (três marks). Um tipo composto composto por um número fixo de campos (itens), cada um com seu próprio identificador e seu próprio tipo, referenciado sob um único identificador; os campos são acessados com notação de ponto.

    Exemplo resolvido. Escreva pseudocódigo para declarar um tipo de registro ClubMember para o primeiro nome, último nome, código de membro (um inteiro), data de entrada e se as taxas foram pagas de um membro de clube; depois declare uma variável e defina dois de seus campos.

    TYPE ClubMember
        DECLARE FirstName : STRING
        DECLARE LastName : STRING
        DECLARE Code : INTEGER
        DECLARE DateJoined : DATE
        DECLARE FeesPaid : BOOLEAN
    ENDTYPE
    
    DECLARE NewMember : ClubMember
    NewMember.LastName ← "Chen"
    NewMember.FeesPaid ← TRUE
    

    Campo precisa de sua própria linha DECLARE com um tipo apropriado, o bloco termina com ENDTYPE, e um campo 字段 é alcançado como variable.field. Pedido para escolher um tipo para cada campo, corresponda-o aos dados: um código que é sempre comparado é um STRING se puder conter letras, um INTEGER se aritmética ou ordenação for necessária; um sim/não é BOOLEAN; uma data é DATE. Um campo que pode assumir um de alguns valores nomeados (espécie de animal de estimação, cor) é aquele para fazer um tipo enumerado.

    Um array de quatro registros ClubMember desenhado como linhas de campos, com a chamada Members[3].LastName destacando um campo de um elemento, e uma atribuição escrevendo um campo de outro elemento
    Um array de registros: cada elemento é um registro inteiro, um índice escolhe o elemento, e um ponto escolhe o campo

    Registros em arrays e arquivos. Uma tabela de muitos membros é DECLARE Members : ARRAY[1:100] OF ClubMember; então Members[3].LastName é um campo de um elemento, e um loop sobre o índice processa todo o registro. Um registro também é a unidade natural escrita e lida de um arquivo (abaixo), um registro por PUTRECORD ou WRITEFILE.

    Exemplo resolvido. Um tipo composto Pet armazena o nome de cada pet (string), espécie (um de dog, cat, rabbit ou hamster) e peso em quilogramas (real). Defina os tipos e declare uma variável.

    TYPE Species = (Dog, Cat, Rabbit, Hamster)
    TYPE Pet
        DECLARE Name : STRING
        DECLARE Kind : Species
        DECLARE Weight : REAL
    ENDTYPE
    DECLARE MyPet : Pet
    MyPet.Kind ← Rabbit
    

    O tipo enumerado é definido primeiro, porque o registro o usa: ordem importa na pseudocódigo assim como em um compilador.

    Classes na pseudocódigo. Uma classe é o tipo composto que também carrega comportamento. O exame pede a declaração com seus atributos marcados PRIVATE, um construtor 构造函数 nomeado NEW que os define, e PUBLIC métodos para obter ou alterar eles:

    CLASS Appointment
        PRIVATE PatientName : STRING
        PRIVATE Treatment : STRING
        PRIVATE Medication : STRING
        PUBLIC PROCEDURE NEW(Name : STRING, Treat : STRING, Med : STRING)
            PatientName ← Name
            Treatment ← Treat
            Medication ← Med
        ENDPROCEDURE
        PUBLIC FUNCTION GetTreatment() RETURNS STRING
            RETURN Treatment
        ENDFUNCTION
    ENDCLASS
    
    DECLARE Visit : Appointment
    Visit ← NEW Appointment("A. Chen", "filling", "none")
    OUTPUT Visit.GetTreatment()
    

    Atributos são privados para que só possam ser alterados através de métodos (encapsulamento, Tópico 20); o construtor é um procedimento chamado NEW com um parâmetro por atributo; um getter é uma função que retorna o atributo. Cada um desses é uma marca separada.

    Explorar

    Laboratório de conceito de programação

    Conecte exemplos à ideia de programação que eles mostram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    user-defined type/ˈjuːzə dɪˈfaɪnd taɪp/ 用户定义类型 yòng hù dìng yì lèi xíng
    field/fiːld/ 字段 zì duàn
    record/ˈrekɔːd/ 记录 jì lù
    set/set/ 集合 jí hé
    class/klæs/ 类 lèi
    composite type/ˈkɒmpəzɪt taɪp/ 复合类型 fù hé lèi xíng
    enumerated type/ɪˈnjuːməreɪtɪd taɪp/ 枚举类型 méi jǔ lèi xíng
    pointer/ˈpɔɪntə/ 指针 zhǐ zhēn
    linked list/lɪŋkt lɪst/ 链表 liàn biǎo
    dereference/ˌdiːˈrefrəns/ 解引用 jiě yǐn yòng
    object/ˈɒbdʒekt/ 对象 duì xiàng
    attributes/ˈætrɪbjuːts/ 属性 shǔ xìng
    methods/ˈmeθədz/ 方法 fāng fǎ
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    File organisation/faɪl ˌɔːɡənaɪˈzeɪʃn/ 文件组织 wén jiàn zǔ zhī
    13.2

    Organização e acesso a arquivos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão dos métodos de organização de arquivos e selecionar um método adequado de organização e acesso a arquivos para um problema dado Incluindo serial, sequencial (usando um campo chave), aleatório (usando uma chave de registro)
    Demonstrar compreensão dos métodos de acesso a arquivos Incluindo acesso sequencial para arquivos seriais e sequenciais. Acesso direto para arquivos sequenciais e aleatórios
    Demonstrar compreensão de algoritmos de hash Descrever e usar diferentes algoritmos de hash para ler e escrever dados em um arquivo aleatório/sequencial

    Fonte: Programa Cambridge International

    Organização de arquivo 文件组织 é como os dados estão dispostos; acesso a arquivo é como o programa alcança um registro.

    • arquivo serial 串行文件 — registros na ordem adicionada, sem ordenação. Acesso é sequencial apenas; anexar é rápido; buscar é lento. Usado para logs e rastreamentos de auditoria.
    • arquivo sequencial 顺序文件 — registros ordenados por uma chave. Buscar é mais rápido (você pode parar cedo ou fazer busca binária); inserir é lento (registros devem ser movidos). Usado para arquivos mestres atualizados em lote.
    • arquivo aleatório 随机文件 (arquivo de acesso direto) — registros em posições calculadas a partir da chave (muitas vezes por um hash). Acesso direto por chave é muito rápido; ler em ordem de chave é mais difícil. Usado para grandes tabelas de consulta e contas de clientes.
    Uma fileira de caixas de registro da primeira à sexta na ordem em que foram adicionadas, com uma seta de anexo e um marcador Início de arquivo
    Arquivo serial: registros são mantidos na ordem em que foram adicionados
    Uma fileira de caixas de registro de cliente com valores de chave ascendentes, mostrando os registros ordenados por chave
    Arquivo sequencial: registros são ordenados por um campo de chave
    Uma chave de registro passando por uma função hash para calcular um número de slot, com o registro colocado naquele slot do arquivo
    Arquivo aleatório: registros ficam em posições calculadas a partir da chave

    Os dois métodos de acesso são acesso sequencial 顺序存取 (ler do início ao fim) e acesso direto 直接存取 (pular diretamente para uma posição conhecida). Corresponda a estrutura à operação dominante: consultas de chave única favorecem aleatório; relatórios em ordem favorecem sequencial.

    Descrevendo cada organização (a formulação que pontua). Serial: registros são armazenados um após o outro na ordem em que foram adicionados, sem ordenação por chave. Sequencial: registros são armazenados em ordem de um campo de chave (ordenados). Aleatório: cada registro é armazenado em um endereço calculado a partir de sua chave por um algoritmo de hashing, então os registros não estão em nenhuma ordem. Comparando serial e sequencial: ambos armazenam registros um após o outro e ambos são lidos sequencialmente, mas um arquivo sequencial está ordenado por chave, então uma busca pode parar assim que uma chave maior que a alvo é lida, e um novo registro deve ser inserido em sua posição correta (geralmente reescrevendo o arquivo), enquanto um arquivo serial é simplesmente anexado.

    Duas cadeias de etapas: acesso direto hashia a chave para um endereço, busca diretamente nele e lê ou grava o registro; acesso sequencial abre o arquivo, lê registros um de cada vez do início e compara chaves até o registro ser encontrado ou o fim do arquivo ser atingido
    Os dois métodos de acesso como procedimentos: acesso direto calcula onde olhar; acesso sequencial olha tudo em sequência

    Descrevendo cada método de acesso. Acesso sequencial: inicia no início do ficheiro e lê os registos um após o outro (na ordem em que estão armazenados) até encontrar o registo pretendido ou atingir o fim do ficheiro. Aplicado a um ficheiro serial, isto significa ler todos os registos até à correspondência, e ler todo o ficheiro para estabelecer que um registo está ausente; aplicado a um ficheiro sequencial, a pesquisa pode parar cedo, assim que uma chave maior que a alvo é lida. Acesso direto: o endereço do registo é calculado a partir da sua chave (por um algoritmo de hash, ou a partir de um índice), e o programa vai diretamente para aquela posição sem ler os registos anteriores; este é o método de acesso para ficheiros aleatórios, e para um registo referenciado por um endereço único num disco.

    Escolha. Um ficheiro mestre de folha de pagamento ou faturação de serviços públicos processado em lote, registos um após o outro, adequa-se a um ficheiro sequencial; um registo de transações na ordem em que ocorreram adequa-se a um ficheiro serial; um ficheiro de stock ou clientes onde registos individuais são consultados e atualizados por chave durante a execução do programa adequa-se a um ficheiro aleatório com acesso direto.

    Gestão de ficheiros em pseudocódigo. O exame espera as instruções padrão, e o Paper 3 define algoritmos que os utilizam:

    Tarefa Instruções
    abrir um arquivo de texto OPENFILE "Scores.txt" FOR READ (ou FOR WRITE, que cria ou sobrescreve, ou FOR APPEND)
    ler ou escrever uma linha READFILE "Scores.txt", Line e WRITEFILE "Scores.txt", Line
    testar o final WHILE NOT EOF("Scores.txt")
    fechar CLOSEFILE "Scores.txt"
    abrir um ficheiro aleatório OPENFILE "Stock.dat" FOR RANDOM
    mover para uma posição de registo SEEK "Stock.dat", Address
    ler ou escrever um registo completo GETRECORD "Stock.dat", Item e PUTRECORD "Stock.dat", Item

    Exemplo resolvido. Um ficheiro aleatório Stock.dat contém registos do tipo StockItem, armazenados no endereço dado por ItemID MOD 100. Escreva pseudocódigo que armazene um novo item no seu endereço hashed se essa posição estiver vazia, reportando a posição se já estiver em uso.

    DECLARE Item, Existing : StockItem
    DECLARE Address : INTEGER
    INPUT Item.ItemID, Item.Description, Item.Quantity
    Address ← Item.ItemID MOD 100
    OPENFILE "Stock.dat" FOR RANDOM
    SEEK "Stock.dat", Address
    GETRECORD "Stock.dat", Existing
    IF Existing.ItemID = 0 THEN
        // 0 marks an empty position
    ENDIF
        SEEK "Stock.dat", Address
        PUTRECORD "Stock.dat", Item
        OUTPUT "Stored at ", Address
    ELSE
        OUTPUT "Position ", Address, " is in use"
    ENDIF
    CLOSEFILE "Stock.dat"
    

    Dois detalhes que o gabarito verifica: SEEK antes de cada GETRECORD ou PUTRECORD (a leitura move a posição, logo busque novamente antes de escrever), e o ficheiro aberto FOR RANDOM e fechado no final. Para copiar cada registo de um ficheiro aleatório para outro, faça um loop sobre os endereços com SEEK, GETRECORD de um ficheiro e PUTRECORD para o outro, saltando posições vazias.

    Explorar

    Rota de acesso a arquivo

    Siga um arquivo do armazenamento ao programa e de volta com segurança.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    serial file/ˈsɪərɪəl faɪl/ 串行文件 chuàn xíng wén jiàn
    sequential file/siːˈkwenʃl faɪl/ 顺序文件 shùn xù wén jiàn
    random file/ˈrændəm faɪl/ 随机文件 suí jī wén jiàn
    direct access/daɪˈrekt ˈækses/ 直接存取 zhí jiē cún qǔ
    hash function/hæʃ ˈfʌŋkʃn/ 散列函数 sàn liè hán shù
    sequential access/siːˈkwenʃl ˈækses/ 顺序存取 shùn xù cún qǔ
    deterministic/dɪˌtɜːmɪˈnɪstɪk/ 确定性 què dìng xìng
    collision/kəˈlɪʒn/ 冲突 chōng tū
    Assistir aula
    13.2

    Hashing

    Uma função de hash 散列函数 (um algoritmo de hashing) toma a chave de um registo e produz um endereço onde o registo é armazenado. Uma boa é rápida, determinística 确定性, e espalha as chaves uniformemente.

    Algoritmos comuns de hashing para $N$ slots: hash módulo address ← key MOD N; folding (dividir a chave, somar as partes, MOD N); um hash de string (somar os códigos dos caracteres, MOD N).

    Uma colisão 冲突 é quando duas chaves hash para o mesmo endereço. Três formas de resolvê-la:

    Estratégia Como funciona Compromisso
    linear probing 线性探测 usar o próximo slot livre (envolvendo-se) simples, mas as chaves agrupam-se
    chaining 链接法 cada slot aponta para uma lista ligada 链表 de registos sem agrupamento, mas usa mais memória
    rehashing aplicar uma segunda função hash espalha as chaves, mas requer mais trabalho
    Resolução de uma colisão onde as chaves A e B ambos hash para o slot 2. Linear probing coloca B no próximo slot livre (3); chaining mantém o slot 2 apontando para uma lista ligada de A depois B
    Resolução de uma colisão de hash: linear probing usa o próximo slot livre; chaining mantém uma lista ligada por slot

    Para pesquisar: hash a chave, leia esse slot; se as chaves corresponderem você terminou, senão siga a estratégia de resolução até uma correspondência ou um slot vazio. Para inserir: hash a chave, escreva nesse slot ou no próximo livre. Mantenha o load factor 装填因子 (registos ÷ slots) abaixo de cerca de 70% para buscas quase-O(1).

    """Explique o que se entende por um algoritmo de hash no contexto de acesso a ficheiros""" (três marcas). Um cálculo (função) realizado no campo de chave de um registo que produz um valor, que é usado como o endereço (localização) em que o registo é armazenado no ficheiro e do qual é recuperado. O mesmo cálculo na mesma chave sempre dá o mesmo endereço, pelo que o registo pode ser encontrado novamente sem pesquisa.

    """Desenhe dois métodos para superar uma colisão.""" (1) Linear probing (open addressing): armazene o registo na próxima posição livre após o endereço calculado, voltando ao início se necessário; para recuperar, comece no endereço hashed e leia para frente até a chave corresponder. (2) Uma área de overflow 溢出区 ou chaining: armazene o registo em colisão numa área de overflow separada (ou numa lista ligada anexada ao endereço), que é pesquisada sequencialmente após o endereço principal falhar em corresponder. Qualquer um pontua; descreva tanto a recuperação quanto o armazenamento.

    Exemplo resolvido. Um ficheiro aleatório tem 11 posições de registo, numeradas de 0 a 10, e o algoritmo de hash é Address ← Key MOD 11. Registos com chaves 1250, 1381, 1452, 1613 e 1470 são armazenados nessa ordem, usando linear probing. Mostre onde cada registo vai, e descreva como a chave 1470 é recuperada.

    $1250 \bmod 11 = 7$; $1381 \bmod 11 = 6$; $1452 \bmod 11 = 0$; $1613 \bmod 11 = 7$, uma colisão com 1250, logo 1613 ocupa a próxima posição livre, 8; $1470 \bmod 11 = 7$ novamente, e as posições 7 e 8 estão cheias, logo 1470 vai para 9. Para recuperar 1470: calcule $7$, leia a posição 7 (chave 1250, sem correspondência), leia 8 (1613, não), leia 9 (1470, encontrada). Se uma posição vazia for atingida antes de uma correspondência, o registo não está no ficheiro. Colisões são o preço de um ficheiro pequeno: um bom algoritmo de hash espalha as chaves uniformemente, e o ficheiro é mantido bem abaixo do cheio para que as sondagens permaneçam curtas.

    Explorar

    Uma tabela hash

    Observe cada chave ser hasheada para um balde. Um bom hash espalha as chaves para que as buscas permaneçam rápidas.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    linear probing/ˈlɪnɪə ˈprəʊbɪŋ/ 线性探测 xiàn xìng tàn cè
    chaining/ˈtʃeɪnɪŋ/ 链接法 liàn jiē fǎ
    load factor/ləʊd ˈfæktə/ 装填因子 zhuāng tián yīn zi
    overflow area/ˌəʊvəˈfləʊ ˈeərɪə/ 溢出区 yì chū qū
    overflow/ˌəʊvəˈfləʊ/ 溢出 yì chū
    13.3

    Números de ponto flutuante

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Descrever o formato de números reais de ponto flutuante binário Usar a forma de complemento de dois. Compreender os efeitos da alteração da alocação de bits para a mantissa e o exponente em uma representação de ponto flutuante
    Converter números reais de ponto flutuante binário para decimal e vice-versa
    Normalizar números de ponto flutuante Compreender as razões para a normalização
    Demonstrar compreensão das consequências de uma representação binária ser apenas uma aproximação do número real que ela representa (em certos casos) Compreender como underflow e overflow podem ocorrer
    Demonstrar compreensão de que representações binárias podem gerar erros de arredondamento

    Fonte: Programa Cambridge International

    Para armazenar números reais de tamanhos muito diferentes, computadores usam um formato ponto flutuante 浮点 — uma forma binária de notação científica, com dois campos:

    • uma mantissa 尾数 — os dígitos significativos.
    • um exponente 指数 — a potência de 2 para multiplicar.

    Ambos são armazenados como inteiros em complemento de dois 补码. O valor é

    $$\text{number} = \text{mantissa} \times 2^{\text{exponent}}.$$

    Leia a mantissa como uma fração binária — o primeiro bit após o ponto vale $1/2$, o seguinte $1/4$, depois $1/8$, e assim por diante. Assim, 0.1010000 é $1/2 + 1/8 = 0.625$; com exponente 00000010 (= 2) o valor é $0.625 \times 2^{2} = 2.5$.

    Dois bytes de valores posicionais: uma mantissa de 8 bits com um bit de sinal e frações de meio a um sobre 128, e um exponente de complemento de dois de 8 bits de menos 128 a 1
    Os valores posicionais de uma mantissa de 8 bits e um exponente de 8 bits

    Conversão

    • binário → decimal: leia a mantissa (use regras de complemento de dois se negativo) como uma fração, leia o exponente como um inteiro com sinal, então multiplique a mantissa por $2^{\text{exponent}}$.
    • decimal → binário: escreva o número como uma fração binária × uma potência de 2, depois armazene a mantissa e o exponente nos formatos combinados.

    Exemplo resolvido. Um número tem mantissa 10110000 e exponente 00000011. Encontre o seu valor decimal.

    O exponente 00000011 é $+3$. A mantissa começa com um 1, logo é negativa. Lida como 1.0110000 em complemento de dois, o bit de sinal vale $-1$ e os bits de fração somam $\tfrac{1}{4} + \tfrac{1}{8} = 0.375$, logo a mantissa é $-1 + 0.375 = -0.625$. Então

    $$\text{number} = -0.625 \times 2^{3} = -5.0.$$

    Exemplo resolvido. Armazene $+2.5$ neste formato.

    Em binário $2.5 = 10.1$. Escrito como uma fração normalizada, $2.5 = 0.101 \times 2^{2}$. Logo a mantissa é 01010000 (bit de sinal 0, depois .101) e o exponente é 00000010 ($= 2$).

    O formato do exame: complemento de dois, uma mantissa e um exponente

    A prova estabelece um formato como 10 bits para a mantissa e 6 bits para o expoente, ambos em complemento para dois. O ponto binário da mantissa fica após seu primeiro bit (de sinal), então uma mantissa positiva é 0.xxxxxxxxx e uma negativa 1.xxxxxxxxx; o expoente é um inteiro assinado comum. Toda conversão usa os mesmos três movimentos: leia a mantissa como uma fração (regras de complemento para dois se começar com 1), leia o expoente como um inteiro, multiplique por $2^{\text{exponent}}$.

    Exemplo resolvido (binário para decimal). Mantissa 0101100000, exponente 000011.

    Mantissa: $0.101100000_2 = \tfrac{1}{2} + \tfrac{1}{8} + \tfrac{1}{16} = 0.6875$. Exponente: $000011_2 = 3$. Valor: $0.6875 \times 2^{3} = 5.5$.

    Exemplo resolvido (mantissa negativa). Mantissa 1011000000, exponente 000010.

    A mantissa começa com 1, então ela é negativa. Seu valor é $-1 + 0.011000000_2 = -1 + (\tfrac{1}{4} + \tfrac{1}{8}) = -0.625$; expoente $= 2$; valor $-0.625 \times 4 = -2.5$. (Alternativamente, tome o complemento para dois da mantissa, 0101000000 $= 0.625$, e anexe o sinal de menos.) Um expoente negativo como 111110 $= -2$ divide em vez de multiplicar: uma mantissa de $0.5$ com esse expoente é $0.5 \times 2^{-2} = 0.125$.

    Exemplo resolvido (decimal para binário). Armazene $+6.5$ e $-6.5$ no formato de 10 bits e 6 bits, normalizado.

    $6.5 = 110.1_2 = 0.1101_2 \times 2^{3}$, logo a mantissa é 0110100000 e o exponente 000011. Para $-6.5$, tome o complemento de dois da mantissa: 1001100000 (verifique: $-1 + 0.0011_2 = -1 + 0.1875 = -0.8125$, e $-0.8125 \times 8 = -6.5$), exponente 000011 inalterado. O sinal nunca vai para o exponente; um número negativo tem uma mantissa negativa.

    Normalização

    Um número está normalizado 规格化 quando o primeiro bit significativo está imediatamente após o ponto binário (sem zeros à esquerda desperdiçados). Isto maximiza a precisão, porque cada bit da mantissa carrega informação. Para normalizar, desloque a mantissa para a esquerda e diminua o exponente (ou desloque para a direita e aumente-o) até o primeiro bit significativo estar no lugar; o valor permanece inalterado. Para mantissas negativas (complemento de dois), o bit de sinal (1) é seguido imediatamente por um 0.

    Reconhecimento e produção de forma normalizada. Uma mantissa positiva normalizada começa 01; uma negativa começa 10. Assim, 0011000000 não está normalizada (desloque para a esquerda um lugar e subtraia um do exponente: 0110000000, exponente um menor) e 1100000000 também não está (desloque para a esquerda até o padrão ser 10...). Cada deslocação para a esquerda da mantissa deve ser acompanhada por subtrair um do exponente, senão o valor muda.

    """Explique por que números são armazenados em forma normalizada""" (duas marcas). (1) Dá a máxima precisão (precisão) para o número de bits disponíveis, porque nenhum bit é desperdiçado em zeros à esquerda (ou uns à esquerda para um número negativo); (2) cada número tem então uma representação única, permitindo comparar números; e (3) faz o melhor uso do intervalo disponível. Quaisquer dois destes pontuam.

    Normalizando 0.0011010 com exponente 4: desloque a mantissa para a esquerda dois lugares e diminua o exponente em 2, resultando em 0.1101000 com exponente 2 — o mesmo valor, sem zeros à esquerda desperdiçados
    Normalização: desloque a mantissa para a esquerda para remover zeros à esquerda, diminuindo o exponente na mesma quantidade

    Aproximação e erros de arredondamento

    Muitos reais decimais não podem ser armazenados exatamente em binário — ex: $0.1_{10}$ é a fração binária repetitiva $0.000110011\ldots_{2}$, que deve ser truncada. Consequências:

    • erros de arredondamento 舍入误差 acumulam-se ao longo de muitas operações (0.1 + 0.2 não é exatamente 0.3).
    • comparações falham — nunca teste um real para igualdade. Teste se a diferença é menor que uma tolerância pequena, IF Difference < 0.000001, onde a diferença é tomada da forma correta ou através de uma função módulo que a questão definiria. ABS não está no inserto 9618 nem no Guia de Pseudocódigo, portanto não assuma isso: o guia diz que qualquer função que a questão precise será fornecida.
    • subtrair dois valores quase iguais perde precisão.
    • transbordamento 溢出 (um resultado muito grande para a faixa do expoente) e subdesbordamento 下溢 (um resultado muito pequeno, arredondando para zero) ocorrem quando o expoente esgota sua faixa.

    Para necessidades exatas (moeda), use ponto fixo 定点 ou BCD 二进码十进数 em vez de ponto flutuante.

    Três palavras de 16 bits divididas diferentemente entre mantissa e expoente: doze e quatro bits para precisão com uma faixa pequena, oito e oito para equilíbrio, quatro e doze para uma faixa enorme com valores grosseiros
    O mesmo total de bits compartilhado de duas formas: bits de mantissa compram precisão, bits de expoente compram faixa, e um só pode crescer à custa do outro

    "Descreva o efeito de alterar a alocação de bits" (três marcas). Com um número fixo total de bits, aumentar a mantissa e reduzir o expoente dá maior precisão 精度 (mais algarismos significativos, menores erros de arredondamento) mas uma faixa menor 范围 (as maiores e menores magnitudes que podem ser armazenadas diminuem); aumentar o expoente faz o oposto: uma faixa maior às custas da precisão. Nomeie ambos os efeitos e ambas as direções.

    Maior e menor. No formato de 10 bits de mantissa e 6 bits de expoente, o maior número positivo tem mantissa 0111111111 ($= 1 - 2^{-9}$) e expoente 011111 ($= 31$): cerca de $2^{31}$. O menor número normalizado positivo tem mantissa 0100000000 ($= 0.5$) e expoente 100000 ($= -32$): $0.5 \times 2^{-32} = 2^{-33}$. O número mais negativo tem mantissa 1000000000 ($= -1$) e expoente $31$: $-2^{31}$.

    "Explique o que significa transbordamento e subdesbordamento." Transbordamento ocorre quando o resultado de um cálculo é maior que o maior número que pode ser representado, então o expoente precisaria de mais bits do que possui; subdesbordamento ocorre quando um resultado é menor que o menor (não-zero) número que pode ser representado, muito próximo de zero para o expoente expressar, então é armazenado como zero. Ambos vêm da faixa do expoente, não da mantissa.

    Por que uma representação binária é apenas uma aproximação. Uma fração binária só pode representar somas de $\tfrac{1}{2}, \tfrac{1}{4}, \tfrac{1}{8}, \ldots$ exatamente; um valor como $0.1$ ou $\tfrac{1}{3}$ tem uma expansão binária infinita, e a mantissa tem um número fixo de bits, então o valor armazenado é o mais próximo que se encaixa. A diferença é um erro de arredondamento; é pequeno para um número mas acumula-se em cálculos repetidos (adicionar $0.1$ dez vezes pode não dar exatamente $1$), por isso números reais nunca devem ser testados para igualdade exata.

    Explorar

    Construir um número de ponto flutuante

    Inverter os bits da mantissa e do expoente para formar um valor e verificar se está normalizado.

    Explorar

    Normalizando um número de ponto flutuante

    Passos da normalização. Deslocar a mantissa para remover zeros à esquerda desperdiçados — e ajustar o expoente correspondentemente — mantém o valor inalterado, mas utiliza cada bit para precisão.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    floating-point/ˈfləʊtɪŋ pɔɪnt/ 浮点 fú diǎn
    mantissa/mænˈtɪsə/ 尾数 wěi shù
    exponent/ekˈspəʊnənt/ 指数 zhǐ shù
    two's complement/tuːz ˈkɒmplɪmənt/ 补码 bǔ mǎ
    normalised/ˈnɔːməlaɪzd/ 规格化 guī gé huà
    rounding errors/ˈraʊndɪŋ ˈerəz/ 舍入误差 shě rù wù chā
    underflow/ˌʌndəˈfləʊ/ 下溢 xià yì
    fixed-point/fɪkst pɔɪnt/ 定点 dìng diǎn
    BCD/ˌbiː siː ˈdiː/ 二进码十进数 èr jìn mǎ shí jìn shù
    precision/prɪˈsɪʒn/ 精度 jīng dù
    range/reɪndʒ/ 范围 fàn wéi
    Assistir aula
    13.3

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    tipo de dados definido pelo usuário um tipo de dados definido pelo programador, baseado em tipos existentes, para representar dados específicos do problema
    tipo não-composto um tipo definido sem referência a outro tipo; ele armazena um único valor (inteiro, real, enumerado, ponteiro)
    tipo composto um tipo feito de outros tipos; ele armazena vários valores sob um único identificador (registro, conjunto, array, classe)
    tipo enumerado um tipo não-composto definido listando todos os seus valores possíveis, em ordem
    tipo ponteiro um tipo não-composto cujo valor é o endereço de memória de uma variável de um tipo dado
    conjunto um tipo composto contendo uma coleção de valores de um tipo, sem ordem e sem duplicatas
    registro um tipo composto com um número fixo de campos, cada um com seu próprio identificador e tipo, acessado por notação de ponto
    classe um tipo composto combinando atributos (dados) com métodos (procedimentos e funções) que atuam sobre eles; um objeto é uma instância de uma classe
    arquivo serial registros armazenados um após o outro na ordem em que foram adicionados
    arquivo sequencial registros armazenados um após o outro em ordem de um campo chave
    arquivo aleatório registros armazenados em endereços calculados a partir de suas chaves por um algoritmo de hash
    acesso sequencial ler os registros sucessivamente do início do arquivo até encontrar o desejado
    acesso direto calcular o endereço de um registro a partir de sua chave e ir diretamente para aquela posição
    algoritmo de hash um cálculo na chave de um registro que dá o endereço em que o registro é armazenado e encontrado
    colisão duas chaves diferentes produzindo o mesmo endereço
    mantissa a parte de um número de ponto flutuante que contém seus bits significativos, como uma fração em complemento de dois
    expoente o inteiro em complemento de dois que dá a potência de dois pela qual a mantissa é multiplicada
    normalizado um número de ponto flutuante cuja mantissa começa com 01 (positivo) ou 10 (negativo), assim nenhum bit é desperdiçado com zeros ou uns iniciais
    transbordamento um resultado muito grande para ser representado nos bits disponíveis
    subdesbordamento um resultado não-zero muito pequeno para ser representado, então é armazenado como zero
    erro de arredondamento a diferença entre um número real e o valor mais próximo que a representação binária pode manter
    13.3

    Dicas de prova

    • Declarações de pseudocódigo são marcadas linha por linha: TYPE ... = (...) para enumerado, TYPE ... = ^... para ponteiro, TYPE ... = SET OF ... então DEFINE ... (...) : ... para um conjunto, TYPE ... DECLARE ... ENDTYPE para um registro, CLASS ... PRIVATE ... PUBLIC PROCEDURE NEW ... ENDCLASS para uma classe.
    • Associe o tipo aos dados: valores fixos nomeados, enumerado; um grupo de campos diferentes, registro; uma coleção de valores únicos, conjunto; dados mais comportamento, classe; um endereço, ponteiro.
    • Organização de arquivos é como os registros são armazenados; acesso a arquivos é como eles são encontrados. Seriais e sequenciais são lidos sequencialmente; arquivos aleatórios usam acesso direto via hash da chave. Busca sequencial de um arquivo sequencial pode parar cedo; de um arquivo serial não pode.
    • Pseudocódigo de arquivo aleatório: OPENFILE ... FOR RANDOM, SEEK antes de cada GETRECORD ou PUTRECORD, CLOSEFILE no final. Diga como uma colisão é resolvida ao descrever o hashing.
    • Ponto flutuante: mantissa como fração em complemento de dois (ponto após o bit de sinal), expoente como inteiro, multiplique por $2^{\text{exponent}}$; desloque para a esquerda e subtraia um do expoente para normalizar; a mantissa compra precisão, o expoente compra faixa.
    • As três respostas "explique" padrão: por que normalizar (precisão, forma única, faixa), o efeito de realocar bits (precisão contra faixa) e por que $0.1$ não pode ser armazenado exatamente (uma fração binária infinita em uma mantissa finita).

    Erros comuns

    • Escrever DECLARE em vez de TYPE para um novo tipo, ou omitir ENDTYPE; declarar um conjunto sem SET OF, ou um tipo enumerado com aspas em torno de seus valores.
    • Colocar o sinal de um número de ponto flutuante no expoente; o sinal é o primeiro bit da mantissa.
    • Ler uma mantissa negativa como se fosse sinal e magnitude; é complemento de dois, então 1011000000 é $-0.625$, não $-0.375$.
    • Deslocar a mantissa para normalizar sem alterar o expoente, ou alterá-lo da forma errada (deslocar para a esquerda, expoente para baixo).
    • Descrever um arquivo aleatório como "em ordem aleatória"; os registros estão em endereços computados a partir de suas chaves.
    • Dizer que acesso sequencial lê "todo o arquivo" para um arquivo sequencial; ele para quando uma chave maior é encontrada.
    • Explicar hashing sem dizer para que o valor calculado é usado (o endereço para armazenar e recuperar o registro), ou sem uma maneira de lidar com colisões.
    • Definir transbordamento como "muitos dígitos" em vez de um resultado além do maior valor representável, ou culpar a mantissa por isso.
  • 14

    Tecnologias de Comunicação e Internet

    Assistir aula
    14.1

    Por que protocolos são necessários

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da importância de um protocolo para a comunicação entre computadores
    Demonstrar compreensão de como a implementação de um protocolo pode ser vista como uma pilha, onde cada camada possui sua própria funcionalidade
    Demonstrar compreensão do conjunto de protocolos TCP/IP Quatro camadas (Aplicação, Transporte, Internet, Enlace). Propósito e função de cada camada. Aplicação quando uma mensagem é enviada de um host para outro na internet
    Demonstrar compreensão de protocolos (HTTP, FTP, POP3, IMAP, SMTP, BitTorrent) e seus propósitos O protocolo BitTorrent fornece compartilhamento de arquivos ponto a ponto

    Fonte: Programa Cambridge International

    Um protocolo 协议 é um conjunto de regras para como dispositivos comunicam. Ambas as extremidades devem seguir as mesmas regras, ou os sinais de um lado são meaningless para o outro. Protocolos definem o formato dos dados (onde endereços e payload estão), a ordem das mensagens (quem fala primeiro, quandoyar ack), o significado de cada mensagem, o tempo (timeouts, retransmissões) e o que fazer em caso de erro. Sem um protocolo acordado, a comunicação falha — como duas pessoas falando idiomas diferentes sem tradutor.

    "Explique por que protocolos são essenciais para comunicação entre computadores" (três marcas). (1) Um protocolo é um conjunto de regras acordado tanto pelo remetente quanto pelo receptor; (2) sem ele os dois computadores interpretariam os dados de forma diferente (formato, ordem, significado de cada parte), então a mensagem não poderia ser compreendida; (3) permite que computadores de tipos e fabricantes diferentes se comuniquem, porque todos implementam o mesmo padrão. Mencione o que as regras cobrem: o formato dos dados, a ordem das mensagens, detecção e recuperação de erros, e velocidade ou tempo.

    Dois dispositivos seguindo as mesmas regras: formato, ordem, tempo e o que fazer em caso de erro
    Um protocolo são as regras compartilhadas: formato, ordem, tempo e erros
    Vocabulário Treinar
    Inglês Chinês Pinyin
    protocol/ˈprəʊtəkɒl/ 协议 xié yì
    14.1

    Protocolos em camadas

    Redes são complexas, então são divididas em camadas 层, cada uma com um trabalho focado, conversando apenas com a camada acima e abaixo. Benefícios: modularidade 模块化 (substituir uma camada — digamos Ethernet com Wi-Fi — sem tocar nas outras), padronização (vendedores interoperam) e abstração 抽象 (você ignora detalhes tratados em outro lugar). A internet usa o conjunto de protocolos TCP/IP 协议栈 (4 camadas).

    14.1

    Conjunto de protocolos TCP/IP

    Camada Propósito Exemplos
    Aplicação o que o programa do usuário faz HTTP, FTP, SMTP, IMAP
    Transporte entrega fim-a-fim entre processos TCP, UDP
    Internet roteamento de pacotes entre redes IP
    Enlace envio de bits sobre o meio físico Ethernet, Wi-Fi
    Uma pilha de quatro linhas: Aplicação, Transporte, Internet, Link, com envio descendo pela esquerda e recebimento subindo pela direita, e protocolos de exemplo em cada camada
    As quatro camadas do conjunto de protocolos TCP/IP

    A finalidade de cada camada, conforme as palavras do gabarito. Camada de aplicação: fornece os protocolos que as aplicações de usuário usam (HTTP para a web, SMTP para e-mail) e a interface entre a aplicação e a rede; ela produz os dados a serem enviados e os passa à camada de transporte. Camada de transporte: estabelece a conexão de ponta a ponta, divide os dados em pacotes (segmentos) e adiciona números de porta e números de sequência; na recepção, ela reconstitui os pacotes na ordem correta e solicita aqueles que faltam (TCP), ou envia sem essas garantias (UDP). Camada de Internet: adiciona os endereços IP de origem e destino para formar pacotes IP (datagramas) e os roteia através das redes via roteadores; ela não garante a entrega. Camada de enlace: adiciona os endereços MAC e bits de verificação de erro para formar uma quadro e transmite os bits sobre a rede local física (Ethernet ou Wi-Fi) através da placa de interface de rede. "Completar a pilha" significa estas quatro, nesta ordem, de cima para baixo: Aplicação, Transporte, Internet, Enlace.

    Enviando uma mensagem pela pilha TCP/IP: a mensagem do aplicativo é envolvida por um cabeçalho TCP que carrega portas e um número de sequência, depois por um cabeçalho IP que carrega os endereços IP de origem e destino, depois por um cabeçalho de quadro que carrega endereços MAC e um campo de verificação; o receptor retira-os na ordem inversa
    Encapsulamento: cada camada adiciona seu próprio cabeçalho 首部 ao que recebe da camada acima, de modo que os bits no cabo carregam quatro conjuntos de informações; o receptor os remove uma camada de cada vez

    "Descreva como o conjunto TCP/IP é aplicado quando uma mensagem é enviada de um host para outro" (cinco pontos). No remetente, a mensagem passa para baixo pela pilha: (1) a camada de aplicação produz os dados usando um protocolo como HTTP ou SMTP; (2) a camada de transporte divide-a em pacotes e adiciona um cabeçalho com os números de porta e um número de sequência; (3) a camada de internet adiciona um cabeçalho com os endereços IP de origem e destino e escolhe a rota; (4) a camada de enlace adiciona os endereços MAC do próximo dispositivo e envia o quadro sobre o enlace físico. Roteadores ao longo do caminho leem o cabeçalho da camada de internet e encaminham cada pacote. No receptor, o quadro passa para cima pela pilha: cada camada remove e age sobre seu próprio cabeçalho, a camada de transporte reconstitui os pacotes na ordem dos números de sequência e pede aqueles que faltam, e a camada de aplicação apresenta a mensagem. O mesmo protocolo em cada camada em ambas as extremidades é o que faz a troca funcionar.

    Camada de aplicação

    A camada de aplicação 应用层 fornece serviços aos programas do usuário e define os protocolos que eles falam (HTTP para web, SMTP para e-mail). É aqui que um programador mais frequentemente trabalha.

    Camada de transporte

    A camada de transporte 传输层 entrega dados de ponta a ponta entre processos, identificados por números de porta 端口号. Dois protocolos:

    TCP estabelece uma conexão e entrega todos os dados em ordem; UDP envia e esquece
    TCP conecta e entrega em ordem; UDP envia e esquece
    • TCP 传输控制协议 — orientado a conexão 面向连接: estabelece uma conexão, garante que todos os dados cheguem em ordem, retransmite pacotes 数据包 perdidos, controla o fluxo. Confiável, mas com sobrecarga. Usado por HTTP, HTTPS, SMTP, FTP.
    • UDP 用户数据报协议 — sem conexão 无连接: envia e esquece, sem confirmações ou ordenação. Baixa sobrecarga, sem garantias. Usado para streaming, DNS e jogos, onde velocidade supera confiabilidade.

    Camada de Internet

    A camada de internet 网络层 transporta pacotes entre hosts usando IP. Cada pacote tem um endereço IP IP地址 de origem e destino, e roteadores 路由器 o encaminham adiante. Ela não garante a entrega — isso é trabalho do TCP.

    Um roteador doméstico faz esse trabalho para sua casa: ele lê o endereço de destino de cada pacote e o envia em direção à internet, e de volta para o dispositivo correto.

    Um roteador Wi-Fi preto com quatro antenas verticais e uma fileira de luzes de status na parte frontal
    Um roteador Wi-Fi doméstico: ele encaminha pacotes entre seus dispositivos e a internet

    Antes que o roteador alcance a internet mais ampla, um modem 调制解调器 conecta a casa ao provedor de internet através do cabo ou linha telefônica do provedor. Suas luzes indicam que o enlace está ativo e online.

    Um modem de cabo preto alto em pé sobre um fundo liso, com uma coluna de luzes de status descendo pela frente
    Um modem de cabo conecta uma rede doméstica ao provedor de internet

    Camada de enlace

    A camada de enlace 链路层 envia bits sobre um único enlace físico (Ethernet, Wi-Fi). Ela adiciona um cabeçalho de quadro com endereços MAC MAC地址 e gerencia o acesso ao meio (ex.: CSMA/CD 载波侦听多路访问/冲突检测 na Ethernet).

    Um quadro Ethernet dividido em preâmbulo, início do quadro, dados Ethernet e intervalo interpacotes, com a parte de dados expandida em endereços MAC de destino e origem, tipo/comprimento, mensagem de payload e sequência de verificação de quadro, cada um com seu tamanho em bytes
    As partes de um quadro Ethernet típico

    Em uma rede local com fio, um interruptor 交换机 conecta muitos dispositivos. Cada dispositivo se conecta a uma porta com um cabo Ethernet (plugue RJ45), e o switch usa os endereços MAC em cada quadro para enviá-lo apenas à porta correta.

    Um pequeno switch Ethernet Gigabit preto de 8 portas sobre um fundo liso, suas portas RJ45 numeradas em uma fileira na parte frontal, cada uma com uma luz de status
    Um switch de rede conecta muitos dispositivos com fio em uma rede local

    O enlace físico pode ser um fio de cobre, um sinal de rádio (Wi-Fi) ou um cabo de fibra óptica 光纤. Em um cabo de fibra óptica, os bits viajam como flashes de luz através de finas fibras de vidro, o que é rápido e transporta dados por longas distâncias.

    Um feixe de fibras ópticas se espalhando contra um fundo escuro, cada fina fibra de vidro brilhando com um ponto de luz azul-branca na ponta
    Um cabo de fibra óptica: os dados viajam como luz através de finas fibras de vidro

    Um enlace de rádio pode alcançar muito mais longe. Uma antena parabólica 卫星天线 envia e recebe sinais de rádio para e de um satélite, transportando dados para lugares que enlaces com fio não conseguem alcançar facilmente.

    Uma antena parabólica cinza redonda montada na parede de uma casa ao lado de uma janela, com seu braço de alimentação estendendo-se para a frente
    Uma antena parabólica envia e recebe dados por rádio em longa distância
    Explorar

    Toque nas quatro camadas do modelo TCP/IP

    Explore cada camada. Os dados viajam PARA BAIXO pela pilha ao serem enviados (cada camada adiciona seu cabeçalho) e voltam PARA CIMA ao serem recebidos — e qualquer camada pode ser substituída sem afetar as demais.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    layers/ˈleɪəz/ 层 céng
    modularity/ˌmɒdjʊˈlærɪti/ 模块化 mó kuài huà
    abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
    protocol suite/ˈprəʊtəkɒl swiːt/ 协议栈 xié yì zhàn
    application layer/ˌæplɪˈkeɪʃn ˈleɪə/ 应用层 yìng yòng céng
    transport layer/ˈtrænspɔːt ˈleɪə/ 传输层 chuán shū céng
    port numbers/pɔːt ˈnʌmbəz/ 端口号 duān kǒu hào
    TCP/ˌtiː siː ˈpiː/ 传输控制协议 chuán shū kòng zhì xié yì
    connection-oriented/kəˈnekʃn ˈɔːrɪəntɪd/ 面向连接 miàn xiàng lián jiē
    packets/ˈpækɪts/ 数据包 shù jù bāo
    UDP/ˌjuː diː ˈpiː/ 用户数据报协议 yòng hù shù jù bào xié yì
    connectionless/kəˈnekʃənləs/ 无连接 wú lián jiē
    internet layer/ˈɪntənet ˈleɪə/ 网络层 wǎng luò céng
    routers/ˈruːtəz/ 路由器 lù yóu qì
    modem/ˈməʊdem/ 调制解调器 tiáo zhì jiě tiáo qì
    link layer/lɪŋk ˈleɪə/ 链路层 liàn lù céng
    CSMA/CD/ˌsiː es em ˈeɪ ˌsiː ˈdiː/ 载波侦听多路访问/冲突检测 zài bō zhēn tīng duō lù fǎng wèn / chōng tū jiǎn cè
    switch/swɪtʃ/ 交换机 jiāo huàn jī
    fibre-optic cable/ˈfaɪbə ˈɒptɪk ˈkeɪbl/ 光纤 guāng xiān
    satellite dish/ˈsætəlaɪt dɪʃ/ 卫星天线 wèi xīng tiān xiàn
    14.1

    Protocolos comuns da camada de aplicação

    • HTTP 超文本传输协议 — navegadores buscam páginas da web em servidores (sobre TCP, porta 80). HTTPS é HTTP sobre TLS — criptografado, porta 443.
    • FTP 文件传输协议 — transferir arquivos entre cliente e servidor.
    • SMTP 简单邮件传输协议 — enviar e-mail entre cliente e servidor, e entre servidores. A recepção usa POP3 ou IMAP.
    • POP3 — baixa e-mail e geralmente o exclui do servidor. IMAP — deixa o e-mail no servidor e sincroniza entre dispositivos, de modo que a mesma caixa de entrada aparece em todos os lugares.
    • BitTorrent — um protocolo peer-to-peer 对等网络; um arquivo é dividido em pedaços baixados de muitos pares em paralelo, de modo que nenhum servidor único carrega toda a carga.
    Um rastreador no centro com pares ao redor — sementes, lesmas e novos pares — trocando pedaços de arquivo, com uma chave
    BitTorrent: um rastreador ajuda pares a se encontrarem, então eles compartilham pedaços de arquivo diretamente

    A finalidade de cada protocolo, nas palavras que pontuam.

    Protocolo Finalidade (affe este)
    HTTP transfere páginas da web (hipertexto) entre um servidor web e um navegador; HTTPS é a versão criptografada
    FTP transfere arquivos entre um cliente e um servidor (upload para e download de um servidor de arquivos)
    SMTP envia e-mail de um cliente para um servidor de mail, e entre servidores de mail (um protocolo "push")
    POP3 baixa e-mail do servidor para o cliente, geralmente excluindo-o do servidor, de modo que é lido em um único dispositivo
    IMAP permite que o cliente leia e gerencie e-mails que permanecem no servidor, de modo que a mesma caixa de correio é vista em todos os dispositivos
    BitTorrent compartilha arquivos peer-to-peer: pedaços de um arquivo são baixados de e enviados para muitos outros usuários simultaneamente

    Perguntado pelos dois protocolos de e-mail, dê SMTP para envio e POP3 ou IMAP para recebimento; perguntado para descrever IMAP, diga que as mensagens permanecem no servidor e são sincronizadas entre dispositivos, que é a diferença do POP3.

    "Descreva como os arquivos são compartilhados usando o protocolo BitTorrent" (quatro pontos). (1) O arquivo é dividido em pedaços (tipicamente 256 KB cada), e um pequeno arquivo torrent descreve-os (seus hashes) e nomeia um rastreador 追踪器. (2) Um par que deseja o arquivo entra em contato com o rastreador, que mantém uma lista dos pares na bandejagem 群 que compartilham aquele arquivo no momento. (3) O par baixa pedaços diferentes de muitos pares ao mesmo tempo, e assim que possui um pedaço, ele o envia para outros; um par com o arquivo inteiro é uma semente 种子, um que ainda baixa é uma lesma. (4) Quando todos os pedaços estão presentes, eles são reconstituídos e verificados contra os hashes. "Explique o que significa compartilhamento de arquivos peer-to-peer": não há servidor central segurando o arquivo; cada computador é tanto um cliente quanto um servidor, baixando de e enviando para os outros, de modo que a carga e a largura de banda são distribuídas entre a bandejagem e quanto mais pares houver, mais rápido fica.

    Explorar

    Laboratório de roteamento de rede

    Siga os dados de um dispositivo através do hardware de rede e protocolos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    HTTP/ˌeɪtʃ tiː tiː ˈpiː/ 超文本传输协议 chāo wén běn chuán shū xié yì
    FTP/ˌef tiː ˈpiː/ 文件传输协议 wén jiàn chuán shū xié yì
    SMTP/ˌes em tiː ˈpiː/ 简单邮件传输协议 jiǎn dān yóu jiàn chuán shū xié yì
    peer-to-peer/pɪə tə pɪə/ 对等网络 duì děng wǎng luò
    tracker/ˈtrækə/ 追踪器 zhuī zōng qì
    swarm/swɔːm/ 群 qún
    seed/siːd/ 种子 zhǒng zi
    14.2

    Comutação de circuitos vs comutação de pacotes

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão da comutação por circuito Benefícios, desvantagens e onde é aplicável
    Demonstrar compreensão da comutação por pacote Benefícios, desvantagens e onde é aplicável. Demonstrar compreensão da função de um roteador na comutação por pacote. Explicar como a comutação por pacote é usada para passar mensagens através de uma rede, incluindo a internet

    Fonte: Programa Cambridge International

    Comutação de circuitos

    Um caminho dedicado é estabelecido entre as duas extremidades antes que qualquer dado seja enviado (comutação de circuitos 电路交换), reservado para toda a conversa, depois liberado. Ele oferece largura de banda reservada 带宽 e entrega em ordem, mas é ineficiente durante silêncios e lento para estabelecer. Exemplo clássico: a rede telefônica tradicional.

    Uma malha de roteadores entre o dispositivo A e o dispositivo B, com um caminho destacado e reservado de ponta a ponta para toda a chamada
    Comutação de circuitos: um caminho dedicado é reservado de ponta a ponta

    "Descreva a comutação de circuitos como um método de transmissão de dados" (três pontos). (1) Um caminho dedicado (circuito) é estabelecido entre o remetente e o receptor antes de qualquer dado ser enviado; (2) a mensagem inteira é enviada ao longo desse caminho, em ordem, como um fluxo contínuo; (3) o circuito é reservado pela duração da comunicação e liberado depois.

    Vantagens e desvantagens. Vantagens: toda a largura de banda do circuito está disponível e garantida; os dados chegam em ordem, sem reensamblagem e sem atraso uma vez que o circuito esteja pronto; a rota não muda, então o tempo é previsível (bom para voz e vídeo em tempo real). Desvantagens: tempo é gasto configurando o circuito antes de qualquer coisa ser enviada; o circuito é reservado mesmo enquanto nenhum dado flui, assim a largura de banda é desperdiçada e outros usuários não podem compartilhá-la; ambas as extremidades devem estar livres ao mesmo tempo; uma falha em qualquer ponto da rota interrompe toda a chamada, e não há rota alternativa automática. Onde é apropriado: uma chamada telefônica ou um link de vídeo ao vivo, onde um fluxo constante e ininterrupto importa mais do que a eficiência.

    Comutação por pacotes

    Os dados são divididos em pacotes, cada um enviado independentemente (comutação por pacotes 分组交换). Cada pacote carrega o endereço de destino; os roteadores tomam decisões por pacote, então os pacotes podem seguir rotas diferentes e chegar fora de ordem, e o destino os reensambla. É eficiente (um enlace é multiplexado 多路复用 através de muitas conversas), robusto (redireciona ao redor de uma falha), mas tem latência variável 延迟 e possível perda (TCP trata a confiabilidade). Usado pela internet.

    A mesma malha de roteadores com pacotes mostrados como quadrados coloridos numerados seguindo rotas diferentes do computador A para o computador B, depois reensamblando em ordem no B
    Comutação por pacotes: pacotes viajam independentemente e podem seguir rotas diferentes
    As partes de um pacote: um cabeçalho contendo os endereços de origem e destino, o número de sequência, a contagem de pacotes e uma soma de verificação, seguido pela carga útil que carrega a parte dos dados deste pacote
    O que permite que um pacote viaje sozinho: os endereços dizem para onde, o número de sequência diz qual parte da mensagem é, e a soma de verificação mostra se chegou intacto

    "Descreva como a comutação por pacotes é usada para transmitir mensagens através de uma rede (quatro pontos).** (1) A mensagem é dividida em pacotes de tamanho máximo fixo; (2) cada pacote recebe um cabeçalho contendo os endereços de origem e destino, um número de sequência 序号 e uma verificação de erro; (3) cada pacote é enviado independentemente e pode seguir uma rota diferente, escolhida pelos roteadores encontrados; (4) no destino, os pacotes são reensamblos em ordem usando os números de sequência, e qualquer pacote faltante é solicitado novamente. Se a questão excluir verificação e reenvio, omita a última cláusula.

    "Descreva a função de um roteador na comutação por pacotes (três pontos).** Um roteador recebe um pacote, lê o endereço IP de destino em seu cabeçalho, e consulta sua tabela de roteamento 路由表 para decidir o próximo salto melhor em direção àquele destino, levando em consideração o tráfego (congestão) e enlaces falhos; ele então encaminha o pacote para aquele enlace. Pacotes da mesma mensagem podem sair por rotas diferentes; o roteador mantém pacotes em uma fila quando um enlace está ocupado.

    "Descreva duas maneiras pelas quais a comutação por pacotes garante que a mensagem completa seja recebida. (1) Cada pacote carrega um número de sequência, então o receptor pode colocar os pacotes em ordem e pode perceber que um está faltando, e (2) o receptor envia uma confirmação 确认 para pacotes que chegam; um pacote não confirmado dentro de um limite de tempo é retransmitido pelo remetente. Uma soma de verificação 校验和 em cada pacote permite ao receptor detectar um pacote corrompido e descartá-lo, o que aciona o reenvio.

    Vantagens e desvantagens. Vantagens: nenhum circuito para configurar; os enlaces da rede são compartilhados por muitas mensagens, então a largura de banda é usada eficientemente; pacotes podem ser redirecionados ao redor de um enlace falho ou congestionado, então a transmissão é robusta; um pacote perdido ou danificado significa reenviar apenas aquele pacote, não a mensagem inteira. Desvantagens: pacotes podem chegar fora de ordem e precisar ser reensamblos, e alguns podem ser perdidos ou atrasados; os cabeçalhos adicionam sobrecarga; o atraso variável torna-o menos adequado para voz e vídeo em tempo real sem medidas extras; uma rede muito carregada descarta pacotes. Onde é apropriado: e-mail, páginas web, downloads de arquivos e qualquer tráfego "intermitente", e a internet em geral.

    Aspecto Comutação de circuitos Comutação de pacotes
    Caminho dedicado, reservado compartilhado, por-pacote
    Tempo de configuração lento nenhum
    Uso de largura de banda ineficiente eficiente
    Ordem em ordem pode estar fora de ordem
    Robustez uma falha corta o circuito redirecionamento ao redor de falhas
    Adequado fluxos de taxa constante (voz) fluxos intermitentes (web, e-mail)

    Redes modernas usam comutação por pacotes por causa de sua eficiência e resiliência.

    Quatro diferenças, enunciadas como pares. (1) A comutação de circuitos estabelece um caminho dedicado antes de enviar; a comutação por pacotes envia sem configurar um caminho. (2) Na comutação de circuitos, a mensagem inteira segue uma rota; na comutação por pacotes, os pacotes podem seguir rotas diferentes. (3) A comutação de circuitos entrega os dados em ordem sem reensamblagem; a comutação por pacotes precisa de números de sequência para reensamblos. (4) A comutação de circuitos reserva a largura de banda para uma conversa mesmo quando ociosa; a comutação por pacotes compartilha os enlaces entre muitas mensagens. (Também aceitável: um enlace falho quebra um circuito, mas pacotes são redirecionados; comutação de circuitos é adequada para fluxos em tempo real, comutação por pacotes é adequada para dados intermitentes.) Escreva cada diferença como ambas as metades; apenas um lado não rende pontos.

    Descrevendo a comutação por pacotes em poucas frases

    Uma boa resposta de prova: "A mensagem é quebrada em pequenos pacotes. Cada pacote carrega os endereços de destino e origem e um número de sequência. Cada pacote viaja pela rede independentemente, com roteadores escolhendo o próximo salto por pacote. Pacotes podem seguir caminhos diferentes e chegar fora de ordem. O destino usa os números de sequência para reensamblos a mensagem, e pacotes faltantes podem ser solicitados novamente."

    Exemplo resolvido. Uma chamada telefônica e um download de arquivo grande compartilham uma rede. Qual método de comutação se adapta a cada um, e por quê? Uma chamada telefônica precisa de um fluxo constante com baixo atraso, e sofreria muito se peças chegassem tarde ou fora de ordem - então comutação de circuitos se adapta a ela: um caminho dedicado é configurado para toda a chamada e sua capacidade é reservada durante todo o período. Um download de arquivo não se importa com timing ou ordem de chegada, porque o receptor o reensambla, e se beneficia de usar qualquer capacidade que esteja disponível - então comutação por pacotes se adapta a ele: o arquivo é dividido em pacotes que viajam independentemente, cada um carregando endereços de origem e destino e um número de sequência, com roteadores escolhendo um próximo salto por pacote. Nomeie a propriedade do tráfego que decide isso: capacidade reservada e baixo atraso para a chamada, eficiência e resiliência para o download.

    Explorar

    A jornada de um pacote pela internet

    Passo a passo do chaveamento por pacotes. A mensagem é dividida, cada pacote encontra seu próprio caminho, e o destino os recoloca — é por isso que a internet é tão eficiente e difícil de quebrar.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    circuit switching/ˈsɜːkɪt ˈswɪtʃɪŋ/ 电路交换 diàn lù jiāo huàn
    reserved bandwidth/rɪˈzɜːvd ˈbændwɪdθ/ 带宽 dài kuān
    packet switching/ˈpækɪt ˈswɪtʃɪŋ/ 分组交换 fēn zǔ jiāo huàn
    multiplexed/ˌmʌltɪˈplekst/ 多路复用 duō lù fù yòng
    variable latency/ˈveərɪəbl ˈleɪtənsi/ 延迟 yán chí
    sequence number/ˈsiːkwəns ˈnʌmbə/ 序号 xù hào
    routing table/ˈraʊtɪŋ ˈteɪbl/ 路由表 lù yóu biǎo
    acknowledgement/əkˈnɒlɪdʒmənt/ 确认 què rèn
    checksum/ˈtʃeksəm/ 校验和 jiào yàn hé
    IP address/ˌaɪ ˈpiː əˈdres/ IP地址 IP dì zhǐ
    MAC addresses/mæk əˈdresɪz/ MAC地址 MAC dì zhǐ
    bandwidth/ˈbændwɪdθ/ 带宽 dài kuān
    latency/ˈleɪtənsi/ 延迟 yán chí
    header/ˈhedə/ 首部 shǒu bù
    14.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    protocolo um conjunto de regras governando como os dados são transmitidos, acordado por remetente e destinatário para que ambos interpretem da mesma forma
    pilha de protocolos as camadas de protocolos, cada uma com sua própria função, que juntas realizam a comunicação; cada camada comunica-se apenas com as camadas acima e abaixo
    camada de aplicação fornece os protocolos usados por aplicativos para trocar dados (HTTP, SMTP, FTP, IMAP, POP3)
    camada de transporte estabelece comunicação de ponta a ponta, divide dados em pacotes com porta e números de sequência, reensambla-os e solicita faltantes (TCP), ou envia sem garantias (UDP)
    camada de internet adiciona endereços IP para formar pacotes e roteá-los entre redes via roteadores
    camada de enlace adiciona endereços MAC para formar quadros e transmite os bits sobre a rede local física
    roteador um dispositivo que lê o endereço de destino de um pacote e o encaminha pela melhor rota disponível em direção ao destino
    comutação de circuitos um caminho de comunicação dedicado é estabelecido entre as duas extremidades antes que os dados sejam enviados e mantido para toda a transmissão
    comutação por pacotes a mensagem é dividida em pacotes, cada um com um cabeçalho, enviado independentemente por possivelmente rotas diferentes e reensamblos no destino
    pacote uma unidade de dados carregando um cabeçalho (endereços, número de sequência, verificação de erro) e uma carga útil
    peer-to-peer compartilhamento de arquivos sem servidor central, cada computador atuando como cliente e servidor
    14.2

    Dicas de prova

    • Por que protocolos: regras compartilhadas, mesma interpretação, qualquer marca de computador. Por que camadas: cada camada tem um trabalho e pode ser alterada independentemente.
    • As quatro camadas em ordem, de cima para baixo: Aplicação, Transporte, Internet, Enlace. Dê o trabalho de cada camada em uma frase, e a resposta "mensagem de host para host" como um caminhada pela pilha e volta.
    • Propósitos dos protocolos são frases curtas: HTTP páginas web, FTP arquivos, SMTP envio de e-mail, POP3 download de e-mail, IMAP e-mail mantido no servidor, BitTorrent partes peer-to-peer de uma enxame.
    • Comutação de circuitos: caminho dedicado primeiro, mensagem inteira, mantida durante todo o período. Comutação por pacotes: dividido, cabeçalho com endereços e número de sequência, rotas independentes, reensambla. Vantagens e desvantagens vêm em pares de opostos.
    • Um roteador lê o endereço de destino, consulta sua tabela de roteamento, encaminha pela melhor rota; é a pergunta de comutação por pacotes que a prova faz mais frequentemente.
    • "Onde é apropriado": comutação de circuitos para uma ligação ou chamada de vídeo ao vivo; comutação por pacotes para e-mail, web e downloads.

    Erros comuns

    • Definir um protocolo como "uma linguagem" ou "software"; é um conjunto de regras.
    • Colocar as camadas na ordem errada, ou dar as sete camadas OSI em vez das quatro do TCP/IP.
    • Descrever a camada de transporte como "roteamento" ou a camada de internet como "dividir em pacotes"; portas e divisão são transporte, endereços IP e roteamento são internet.
    • Confundir POP3 com IMAP, ou dizer que SMTP recebe e-mail.
    • Descrever comutação por pacotes sem o cabeçalho (endereços e número de sequência) ou sem reensamblagem.
    • Dizer que um roteador "envia o pacote para todos"; ele escolhe um único próximo salto de sua tabela de roteamento.
    • Dar uma vantagem da comutação por pacotes como desvantagem da comutação de circuitos sem enunciar o lado da comutação de circuitos; cada diferença precisa de ambas as metades.
    • Reivindicar que a comutação por pacotes garante entrega por si só; os números de sequência e confirmações da camada de transporte fazem isso.
  • 15

    Hardware e Máquinas Virtuais

    Assistir aula
    15.1

    Processadores RISC vs CISC

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de processadores Reduced Instruction Set Computers (RISC) e Complex Instruction Set Computers (CISC) Diferenças entre RISC e CISC. Compreender o manuseio de interrupções em processadores CISC e RISC
    Demonstrar compreensão da importância/usos do pipelining e registradores em processadores RISC
    Demonstrar compreensão das quatro arquiteturas de computador básicas SISD, SIMD, MISD, MIMD
    Demonstrar compreensão das características de computadores massivamente paralelos
    Demonstrar compreensão do conceito de máquina virtual Dar exemplos do papel das máquinas virtuais. Compreender os benefícios e limitações das máquinas virtuais

    Fonte: Programa Cambridge International

    Dois estilos de design de CPU. A CPU em si se conecta à placa-mãe 主板, a placa principal que liga o processador, a memória e todas as outras partes do computador juntos.

    CISC tem muitas instruções complexas de comprimento variável; RISC tem poucas simples de comprimento fixo
    CISC tem muitas instruções complexas; RISC tem poucas simples
    Uma placa-mãe de computador sobre fundo branco, mostrando o soquete quadrado da CPU no centro, os slots longos de memória, vários slots de expansão e as fileiras de portas I/O ao longo de uma borda
    Uma placa-mãe conecta a CPU, a memória e outras partes entre si

    CISC

    Um CISC 复杂指令集 (Computers de Conjunto de Instruções Complexas) possui muitas, frequentemente complexas instruções (uma pode realizar vários acessos à memória e operações), de comprimento variável, tornando a decodificação intricada. Ele faz mais por instrução no hardware. Exemplos: Intel x86.

    RISC

    Um RISC 精简指令集 (Computers de Conjunto de Instruções Reduzidas) possui um pequeno conjunto de instruções simples, cada uma realizando uma operação básica, todas de comprimento fixo (rápidas para decodificar). Apenas load e store tocam na memória; tudo o resto é de register 寄存器 a register. Os programas são maiores, mas cada instrução é rápida e previsível, o que se adequa ao pipeline. Exemplos: ARM, RISC-V.

    Característica CISC RISC
    Conjunto de instruções muitos poucos
    Comprimento da instrução variável fixo
    Acesso à memória muitas instruções apenas load/store
    Amigável para pipeline mais difícil naturalmente
    Ciclos por instrução varia geralmente 1

    O compromisso é fazer mais por instrução (CISC) vs. fazer cada instrução mais rápido e de forma mais previsível (RISC). Chips modernos da Intel traduzem instruções CISC em micro-ops mais simples semelhantes a RISC internamente.

    "Identifique quatro características de um processador RISC." Quaisquer quatro de: um pequeno conjunto de instruções simples; instruções de comprimento fixo (uma palavra); a maioria das instruções conclui em um ciclo de relógio; muitos registradores de uso geral; apenas instruções load e store acessam a memória (toda aritmética é de registrador a registrador); controle hard-wired (sem microcódigo); projetado para pipeline; o compiler faz mais do trabalho, então os programas contêm mais instruções e exigem mais memória. "Identifique quatro características de um processador CISC." Quaisquer quatro de: um grande conjunto de instruções, muitas delas complexas (uma instrução pode realizar várias operações); instruções de comprimento variável; instruções que levam vários ciclos de relógio; menos registradores; instruções que podem acessar a memória diretamente; controle microprogramado; menos adequado para pipeline; programas mais curtos, permitindo um compiler mais simples e menos memória. "Descreva o que significa RISC e CISC" (dois pontos cada): nomeie a abreviação e dê a ideia definidora (poucas instruções simples monociclo; muitas instruções complexas multiciclo).

    Gerenciamento de interrupções nos dois designs. Em um processador CISC, a instrução atual, por mais complexa que seja, é concluída antes que a interrupção seja atendida; o processador então salva o conteúdo de seus registradores (incluindo o ponteiro de programa) na pilha, salta para a rotina de serviço de interrupção e restaura os registradores depois. Em um processador RISC com um pipeline, várias instruções estão a meio caminho no momento em que a interrupção 中断 chega, então o processador deve ou deixar que toda instrução no pipeline termine, ou descartar (flush) as instruções parcialmente executadas e reiniciá-las após a interrupção; de qualquer forma, o pipeline é esvaziado, os registradores são salvos e a rotina de serviço roda. A formulação do exame: "o pipeline torna o gerenciamento de interrupções mais complexo, porque o conteúdo do pipeline deve ser tratado antes que a interrupção possa ser atendida".

    Vocabulário Treinar
    Inglês Chinês Pinyin
    motherboard/ˈmʌðəbɔːd/ 主板 zhǔ bǎn
    CISC/sɪsk/ 复杂指令集 fù zá zhǐ lìng jí
    RISC/rɪsk/ 精简指令集 jīng jiǎn zhǐ lìng jí
    register/ˈredʒɪstə/ 寄存器 jì cún qì
    interrupt/ˈɪntərʌpt/ 中断 zhōng duàn
    15.1

    Pipeline

    Um pipeline 流水线 processa instruções em estágios sobrepostos, como uma linha de montagem: Fetch → Decode → Execute (na ALU 算术逻辑单元) → Memory access → Write back. Cada estágio trabalha em uma instrução diferente ao mesmo tempo, então assim que o pipeline está cheio, uma instrução é concluída por ciclo. As instruções RISC de comprimento fixo e simples fazem com que cada estágio leve o mesmo tempo. Um pipeline pode travar em uma hazard 冒险 — uma hazard de dados (uma instrução precisa de um resultado ainda não pronto) ou uma hazard de controle (uma branch torna o próximo endereço desconhecido).

    Um gráfico de Gantt dos cinco estágios do pipeline IF, ID, EX, MEM, WB ao longo de dez ciclos de relógio, com seis instruções de A a F deslocalizadas um ciclo atrasado cada, sobrepondo-se diagonalmente
    O pipeline sobrepõe os estágios de seis instruções, de modo que uma termina a cada ciclo

    Chips RISC mantêm dados em muitos registradores porque a memória é lenta e os registradores são rápidos; o compiler aloca valores aos registradores de forma inteligente.

    "Descreva o uso do pipeline em processadores RISC" (três pontos). (1) O ciclo fetch-execute é dividido em estágios (fetch, decode, execute, memory access, write back); (2) várias instruções estão no pipeline ao mesmo tempo, cada uma em um estágio diferente, de modo que enquanto uma está sendo executada, a próxima está sendo decodificada e a seguinte está sendo buscada; (3) uma nova instrução é iniciada, e uma concluída, em todo ciclo de relógio uma vez que o pipeline está cheio, o que aumenta a throughput 吞吐量 (o número de instruções concluídas por segundo), embora cada instrução ainda leve o mesmo tempo isoladamente. Instruções RISC monociclo de comprimento fixo são o que tornam os estágios iguais e o pipeline possível.

    Exemplo resolvido. Um processador usa cinco estágios de pipeline (IF, ID, OF, EX, WB). Quatro instruções entram no pipeline uma após a outra. Em qual ciclo a última instrução conclui, e quantos ciclos levariam as quatro sem pipeline?

    A instrução 1 ocupa IF no ciclo 1, ID em 2, OF em 3, EX em 4 e WB em 5; a instrução 2 começa um ciclo depois e termina no ciclo 6; a instrução 3 no ciclo 7; a instrução 4 no ciclo 8. Em geral, $n$ instruções através de $k$ etapas levam $n + k - 1$ ciclos, aqui $4 + 5 - 1 = 8$. Sem pipeline, cada instrução leva todos os cinco ciclos antes que a próxima comece: $4 \times 5 = 20$ ciclos. A tabela da prova é preenchida escrevendo as etapas de cada instrução diagonalmente, uma coluna à direita da instrução anterior.

    Um processador que opera nesta velocidade gera muito calor, então um heat-sink 散热器 e um ventilador ficam acima dele. As aletas metálicas espalham o calor e o ventilador o afasta, mantendo a CPU suficientemente fria para funcionar.

    Um cooler de torre para CPU com um ventilador preto na frente, uma alta pilha de finas aletas de resfriamento metálicas e tubos de calor de cobre subindo da base plana que toca o processador
    Um heat-sink e ventilador de CPU transportam o calor para longe do processador
    Explorar

    Como o pipeline enche

    Passo a passo pelos ciclos de relógio. Uma vez que o pipeline está cheio, uma nova instrução termina a cada ciclo — mesmo que cada uma ainda leve várias etapas — porque as etapas de instruções diferentes se sobrepõem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    pipeline/ˈpaɪplaɪn/ 流水线 liú shuǐ xiàn
    ALU/ˌeɪ el ˈjuː/ 算术逻辑单元 suàn shù luó jí dān yuán
    hazard/ˈhæzəd/ 冒险 mào xiǎn
    throughput/ˈθruːpʊt/ 吞吐量 tūn tǔ liàng
    heat-sink/hiːt sɪŋk/ 散热器 sàn rè qì
    Flynn's taxonomy/flɪnz tækˈsɒnəmi/ 弗林分类 fú lín fēn lèi
    15.1

    Taxonomia de Flynn

    Taxonomia de Flynn 弗林分类 classifica computadores pelo número de fluxos de instrução e dados:

    • SISD — uma instrução, um fluxo de dados (um único núcleo tradicional).
    • SIMD 单指令多数据 — uma instrução atua em muitos itens de dados ao mesmo tempo (GPUs, extensões vetoriais de CPU). Ótimo para imagens, vídeo, matrizes científicas.
    • MISD — várias operações nos mesmos dados; raro, principalmente teórico.
    • MIMD 多指令多数据 — muitos processadores executam instruções diferentes em dados diferentes (CPUs multi-core, clusters). O mais geral.

    Descrever as quatro arquiteturas (dois pontos cada). SISD: um processador único executa uma instrução de cada vez em um item de dados; sem paralelismo, a máquina tradicional von Neumann. SIMD: uma instrução é aplicada simultaneamente a muitos itens de dados, por muitos elementos de processagem atuando em sincronia; usado para processamento de matrizes e gráficos. MISD: vários processadores aplicam instruções diferentes aos mesmos dados; raramente usado, por exemplo um sistema tolerante a falhas onde vários processadores verificam um único fluxo. MIMD: muitos processadores, cada um executando suas próprias instruções em seus próprios dados, independentemente; o computador multi-core e o cluster.

    Uma unidade de controle única transmitindo um fluxo de instruções para quatro unidades de processamento, cada uma trabalhando em seu próprio item de dados
    SIMD: muitos processadores executam a mesma instrução em dados diferentes

    Uma placa de vídeo 显卡 (com sua GPU) é um exemplo real de hardware SIMD: ela tem milhares de núcleos pequenos que executam a mesma instrução em muitos pixels ou números ao mesmo tempo, é por isso que GPUs são tão rápidas para imagens, vídeo e aprendizado de máquina.

    Uma placa de vídeo sobre fundo branco, mostrando o grande ventilador de resfriamento sobre a GPU e o conector dourado que se encaixa na placa-mãe
    Uma placa de vídeo: sua GPU executa a mesma instrução em muitos itens de dados ao mesmo tempo (SIMD)
    Quatro processadores independentes, cada um alimentado por seu próprio fluxo de instruções separado vinda de cima e seu próprio item de dados vindo de baixo
    MIMD: cada processador executa suas próprias instruções em seus próprios dados
    Vocabulário Treinar
    Inglês Chinês Pinyin
    SIMD/ˈsɪmdiː/ 单指令多数据 dān zhǐ lìng duō shù jù
    MIMD/ˈmɪmdiː/ 多指令多数据 duō zhǐ lìng duō shù jù
    graphics card/ˈɡræfɪks kɑːd/ 显卡 xiǎn kǎ
    massively parallel/ˈmæsɪvli ˈpærəlel/ 大规模并行 dà guī mó bìng xíng
    distributed memory/ˈdɪstrɪbjuːtɪd ˈmeməri/ 分布式内存 fēn bù shì nèi cún
    15.1

    Computadores massivamente paralelos

    Um sistema massivamente paralelo 大规模并行 usa milhares de processadores em uma rede rápida, cada um com sua própria memória (memória distribuída 分布式内存), trocando dados por mensagens. É MIMD, exige software especialmente escrito (MPI, CUDA) e se adequa a simulação climática, treinamento de machine learning 机器学习 em larga escala e astrofísica. Os maiores supercomputers 超级计算机 são massivamente paralelos.

    "Esboce as características de computadores massivamente paralelos" (três pontos). Um número muito grande de processadores (milhares), cada um com sua própria memória, conectados por uma rede (uma interconexão de alta velocidade ou barramento) para que possam passar mensagens uns aos outros; eles trabalham simultaneamente em partes do mesmo problema, de modo que o problema deve ser escrito como um programa que pode ser dividido em partes que executam em paralelo e combinam seus resultados. É um arrangement MIMD.

    Os processadores vivem em racks de server 服务器 altos, muitas vezes enchendo uma sala inteira (um data centre 数据中心), cabeados juntos para trabalharem em um grande problema ao mesmo tempo.

    Uma longa fileira de racks de servidor pretos sobre um piso branco elevado em um data center, cheios de equipamentos e cabos
    Fileiras de servidores em um data center, como aqueles usados para computação massivamente paralela
    Vocabulário Treinar
    Inglês Chinês Pinyin
    machine learning/məˈʃiːn ˈlɜːnɪŋ/ 机器学习 jī qì xué xí
    supercomputers/ˌsuːpəkəmˈpjuːtəz/ 超级计算机 chāo jí jì suàn jī
    server/ˈsɜːvə/ 服务器 fú wù qì
    data centre/ˈdeɪtə ˈsentə/ 数据中心 shù jù zhōng xīn
    virtual machine/ˈvɜːtʃuːəl məˈʃiːn/ 虚拟机 xū nǐ jī
    15.1

    Máquinas virtuais

    Uma máquina virtual 虚拟机 (VM) é uma emulação por software de um computador inteiro — o software interno vê uma CPU, memória e discos que parecem reais, mas são gerenciados por software host.

    • uma VM de sistema executa um OS completo. Um hypervisor 虚拟机监控器 cria e gerencia VMs, cada uma inicializando seu próprio OS convidado. Usos: executar diferentes SOs em uma máquina; consolidação de servidores; sandboxing 沙箱 (software arriscado roda isolado); snapshots.
    • uma VM de processo (linguagem) executa um programa em bytecode 字节码 portátil — a JVM (Java), a CLR (.NET), CPython. Benefícios: portabilidade ("escreva uma vez, execute em qualquer lugar"), verificações de segurança em tempo de execução e just-in-time compilation 即时编译 para velocidade quase nativa. O custo é uma camada extra e precisar ter a VM instalada.
    Uma pilha de máquina virtual: o hardware físico na base, o sistema operacional host acima dele, depois o hipervisor e, acima disso, três máquinas virtuais, cada uma contendo um sistema operacional convidado com seus próprios aplicativos
    Um computador real, vários aparentes: o sistema operacional host e o hipervisor compartilham o hardware, e cada sistema operacional convidado roda como se tivesse sua própria máquina

    "Descreva o que se entende por máquina virtual" (duas marcas). Uma emulação (implementação) de software de um sistema computacional que roda em um computador host e se comporta, para os programas rodando dentro dele, como um computador físico separado com seu próprio processador, memória e armazenamento. O sistema operacional host 宿主操作系统 roda no hardware real, gerencia os recursos reais e (através do hipervisor) cria e controla as máquinas virtuais; cada sistema operacional convidado 客户操作系统 roda dentro de uma máquina virtual, gerencia os aplicativos nele, e não tem consciência de que seu hardware é virtual.

    Benefícios (dê dois). Vários sistemas operacionais diferentes podem rodar em uma mesma máquina ao mesmo tempo; software pode ser testado em muitos sistemas sem comprar o hardware; um novo sistema computacional pode ser emulado e testado antes de ser construído; cada VM está isolada, então uma falha ou malware em uma não afeta a host ou as outras; VMs podem ser copiadas, movidas e fazer backup como arquivos, e um servidor pode ser compartilhado entre muitos usuários, reduzindo o custo de hardware. Limitações (dê duas). Uma VM roda mais devagar que o hardware real porque cada instrução passa pela camada de emulação; consome a memória e potência de processamento da host, então a host deve ser poderosa; alguns recursos ou dispositivos de hardware não são emulados exatamente, então o software testado pode se comportar diferente na máquina real; licenças são necessárias para cada OS convidado, e configurar o sistema exige experiência.

    Explorar

    Laboratório de conceitos de computação

    Classifique exemplos concretos pelo conceito de computação que eles demonstram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    hypervisor/ˌhaɪpəˈvaɪzə/ 虚拟机监控器 xū nǐ jī jiān kòng qì
    sandboxing/ˈsændbɒksɪŋ/ 沙箱 shā xiāng
    bytecode/ˈbaɪtkəʊd/ 字节码 zì jié mǎ
    just-in-time compilation/dʒʌst ɪn taɪm ˌkɒmpɪˈleɪʃn/ 即时编译 jí shí biān yì
    host operating system/həʊst ˈɒpəreɪtɪŋ ˈsɪstəm/ 宿主操作系统 sù zhǔ cāo zuò xì tǒng
    guest operating system/ɡest ˈɒpəreɪtɪŋ ˈsɪstəm/ 客户操作系统 kè hù cāo zuò xì tǒng
    Boolean algebra/ˈbuːlɪən ˈældʒɪbrə/ 布尔代数 bù ěr dài shù
    15.2

    Álgebra booleana

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Produzir tabelas-verdade para circuitos lógicos incluindo meio somadores e somadores completos Pode incluir portas lógicas com mais de duas entradas
    Demonstrar compreensão de um flip-flop (SR, JK) Desenhar um circuito lógico e derivar uma tabela-verdade para um flip-flop. Compreender o papel dos flip-flops como elementos de armazenamento de dados
    Demonstrar compreensão da álgebra booleana Compreender as leis de De Morgan. Realizar álgebra booleana usando as leis de De Morgan. Simplificar um circuito/expressão lógica usando álgebra booleana
    Demonstrar compreensão de mapas de Karnaugh (K-map) Compreender os benefícios do uso de mapas de Karnaugh. Resolver problemas lógicos usando mapas de Karnaugh

    Fonte: Programa Cambridge International

    O meio somador: XOR + AND soma dois bits

    Álgebra booleana 布尔代数 simplifica expressões booleanas 布尔表达式, que também podem ser descritas por tabelas-verdade 真值表. Símbolos: + para OR, · para AND (muitas vezes omitido), barra superior para NOT.

    As leis principais incluem comutativa, associativa e distributiva (como na álgebra comum), além de:

    • identidade $A + 0 = A$, $A \cdot 1 = A$; nula $A + 1 = 1$, $A \cdot 0 = 0$.
    • idempotente $A + A = A$; inversa $A + \overline{A} = 1$, $A \cdot \overline{A} = 0$.
    • Leis de De Morgan 德摩根定律: $(A + B)' = A' \cdot B'$; $(A \cdot B)' = A' + B'$ — negue todo o termo, troque AND/OR, negue cada operando.
    • absorção 吸收律: $A + AB = A$.

    A simplificação reduz o número de termos, então o circuito lógico resultante tem menos portas. Exemplo: $Z = AB + A\overline{B} = A(B + \overline{B}) = A$.

    As leis com seus nomes (cite o nome em cada passo quando for pedido "mostre todo o desenvolvimento").

    Lei Forma OR Forma AND
    identidade $A + 0 = A$ $A \cdot 1 = A$
    nula (anulação) $A + 1 = 1$ $A \cdot 0 = 0$
    idempotente $A + A = A$ $A \cdot A = A$
    complemento (inversa) $A + \overline{A} = 1$ $A \cdot \overline{A} = 0$
    comutativa $A + B = B + A$ $A \cdot B = B \cdot A$
    associativa $A + (B + C) = (A + B) + C$ $A(BC) = (AB)C$
    distributiva $A + BC = (A + B)(A + C)$ $A(B + C) = AB + AC$
    absorção $A + AB = A$ $A(A + B) = A$
    De Morgan $\overline{A + B} = \overline{A} \cdot \overline{B}$ $\overline{A \cdot B} = \overline{A} + \overline{B}$
    dupla negação $\overline{\overline{A}} = A$

    Exemplo resolvido. Simplifique $X = \overline{\overline{(A \cdot B)} \cdot \overline{(A + B)}}$, mostrando todo o desenvolvimento.

    $X = \overline{\overline{(A \cdot B)}} + \overline{\overline{(A + B)}}$ (De Morgan na barra externa) $= A \cdot B + A + B$ (dupla negação) $= A + B$ (absorção, $A + AB = A$, aplicado com $A + B$ absorvendo $AB$).

    Exemplo resolvido. Simplifique $(\overline{A + B}) \cdot (\overline{A} + B)$.

    $= \overline{A} \cdot \overline{B} \cdot (\overline{A} + B)$ (De Morgan) $= \overline{A}\,\overline{B}\,\overline{A} + \overline{A}\,\overline{B}\,B$ (distributiva) $= \overline{A}\,\overline{B} + 0$ (idempotente, complemento) $= \overline{A}\,\overline{B}$.

    Exemplo resolvido. Simplifique $Y = \overline{A}\,\overline{B}\,\overline{C} + \overline{A}\,\overline{B}\,C + A\,\overline{B}\,C$.

    $= \overline{A}\,\overline{B}(\overline{C} + C) + A\,\overline{B}\,C$ (distributiva) $= \overline{A}\,\overline{B} + A\,\overline{B}\,C$ (complemento, identidade) $= \overline{B}(\overline{A} + AC)$ (distributiva) $= \overline{B}(\overline{A} + C)$, usando $\overline{A} + AC = (\overline{A} + A)(\overline{A} + C) = \overline{A} + C$. Aplicar De Morgan a um termo de três entradas funciona da mesma forma: $\overline{A + B + C} = \overline{A} \cdot \overline{B} \cdot \overline{C}$.

    Soma-de-produtos a partir de tabela-verdade. Pegue todas as linhas cuja saída seja 1, escreva o AND de suas entradas (uma variável com barra onde for 0) e OR os termos: uma linha com $A = 1, B = 0, C = 1$ resulta em $A\,\overline{B}\,C$. Esta é a forma soma-de-produtos 积之和 que o exame pede, e é o ponto de partida tanto para simplificação algébrica quanto para mapa de Karnaugh.

    Explorar

    Álgebra booleana

    A·B, A+B, Ā …

    A álgebra booleana são apenas essas portas escritas como expressões — compare as tabelas-verdade.

    Explorar

    Tabelas-verdade booleanas

    Escolha um operador e as entradas para construir sua tabela-verdade — a álgebra por trás dos circuitos lógicos.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Boolean/ˈbuːlɪən/ 布尔 bù ěr
    truth tables/truːθ ˈteɪblz/ 真值表 zhēn zhí biǎo
    De Morgan's laws/də ˈmɔːɡənz lɔːz/ 德摩根定律 dé mó gēn dìng lǜ
    absorption/əbˈsɔːpʃn/ 吸收律 xī shōu lǜ
    sum-of-products/sʌm ɒv ˈprɒdʌkts/ 积之和 jī zhī hé
    Karnaugh map/ˈkɑːnɔː mæp/ 卡诺图 kǎ nuò tú
    half adder/hɑːf ˈædə/ 半加器 bàn jiā qì
    Assistir aula
    15.2

    Mapas de Karnaugh

    Um mapa Karnaugh 卡诺图 (K-map) simplifica uma expressão Booleana agrupando 1s adjacentes de uma tabela verdade. Colunas e linhas usam ordem Gray code 格雷码 (00, 01, 11, 10) para que células adjacentes diferem em uma variável.

    Coloque um 1 em cada célula onde a saída é 1. Encontre grupos retangulares de 1s cujos lados sejam potências de 2 (1, 2, 4, 8), voltando nas bordas se isso criar um grupo maior. Quanto maior o grupo, mais simples o termo: um grupo de 2 elimina uma variável, um grupo de 4 elimina duas, e assim por diante — variáveis que mudam dentro do grupo desaparecem. Some os termos dos grupos para a expressão simplificada. Cubra todos os 1s usando o menor número possível de grupos, mas os maiores possíveis.

    Exemplo resolvido. Um mapa Karnaugh para $A$ e $B$ tem 1s nas células $\overline{A}B$ e $AB$. Simplifique. Os dois 1s são adjacentes - eles compartilham a coluna $B=1$ - então agrupe-os como um retângulo de 2. Dentro desse grupo $B$ permanece 1 durante todo o tempo enquanto $A$ muda de 0 para 1, e qualquer variável que mude dentro de um grupo desaparece. Então o grupo deixa apenas $X = B$. Compare isso com a soma de produtos lida diretamente da tabela, $\overline{A}B + AB$: o mesmo circuito, duas portas a menos. Duas regras fazem a maior parte do trabalho - faça cada grupo o maior possível (um grupo de 2 elimina uma variável, 4 elimina duas, 8 elimina três), e lembre-se de que o mapa volta em suas bordas, então as colunas mais à esquerda e mais à direita são adjacentes. Esse retorno é o agrupamento que a maioria dos candidatos perde.

    Dois mapas de Karnaugh: um mapa de três variáveis para uma expressão de seis termos com um loop vermelho de quatro descendo pelas primeiras duas colunas dando not A e um loop azul de quatro envolvendo as colunas externas dando not B; e um mapa de quatro variáveis cujos quatro uns nos cantos formam um loop envolvente dando not B e not D
    Loops de 1, 2, 4 ou 8 uns; o termo para um loop mantém apenas as variáveis que não mudam dentro dele. As bordas se conectam, então um loop pode envolver-se, e os quatro cantos contam como adjacentes

    Construindo e lendo um mapa K. Rótule as colunas $AB$ e as linhas $C$ (ou $CD$) em ordem Gray-code 00 01 11 10, para que células vizinhas diferem em apenas uma variável. Coloque um 1 em cada célula cujo mintermo aparece na expressão (ou cuja linha da tabela verdade produz 1). Então desenhe os menores, maiores laços que cobrem todos os 1s: cada laço deve ser um retângulo de $1, 2, 4$ ou $8$ células, losos podem se sobrepor, podem voltar através das bordas esquerda-direita e topo-fundo, e os quatro cantos juntos formam um laço. Para cada laço, escreva as variáveis que são constantes dentro dele (barreadas se 0), e some os termos do laço: essa é a soma-de-produtos ótima. Por que usar um? Ele fornece a expressão mais simples sem álgebra, em poucos passos, com menos chance de erro, e o mesmo mapa serve para três ou quatro variáveis.

    Exemplo resolvido. $Z = \overline{A}\,\overline{B}\,\overline{C} + \overline{A}\,\overline{B}\,C + \overline{A}\,B\,\overline{C} + \overline{A}\,B\,C + A\,\overline{B}\,\overline{C} + A\,\overline{B}\,C$.

    No mapa de três variáveis, os 1s preenchem as colunas 00, 01 e 10 em ambas as linhas. O laço de quatro sobre as colunas 00 e 01 tem $A = 0$ em toda parte e $B$, $C$ variando: termo $\overline{A}$. O laço de quatro sobre as colunas 00 e 10 (envolvendo) tem $B = 0$ em toda parte: termo $\overline{B}$. Então $Z = \overline{A} + \overline{B}$, o que a álgebra booleana confirma: $\overline{A}(\overline{B} + B) + \ldots = \overline{A} + \overline{B}$. Dois laços de dois também seriam corretos, mas não ótimos; um laço é tão grande quanto os 1s permitem.

    Exemplo resolvido (quatro variáveis). Um mapa tem 1s apenas nos seus quatro cantos: $\overline{A}\,\overline{B}\,\overline{C}\,\overline{D}$, $A\,\overline{B}\,\overline{C}\,\overline{D}$, $\overline{A}\,\overline{B}\,C\,\overline{D}$ e $A\,\overline{B}\,C\,\overline{D}$. Como as linhas superior e inferior são adjacentes e assim são as colunas externas, os cantos formam um único laço de quatro; $B = 0$ e $D = 0$ em todos eles enquanto $A$ e $C$ variam, então $Z = \overline{B}\,\overline{D}$.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Gray code/ɡreɪ kəʊd/ 格雷码 gé léi mǎ
    15.2

    Somador meio e somador completo

    Um somador meio 半加器 soma dois bits únicos $A$ e $B$, dando uma soma $S$ e um carry 进位 $C$:

    A B S C
    0 0 0 0
    0 1 1 0
    1 0 1 0
    1 1 0 1

    Então $S = A \text{ XOR } B$ e $C = A \text{ AND } B$. Ele ignora qualquer carry-in — daí "meio".

    Um bloco de somador meio com entradas A e B e saídas sum e carry, ao lado de seu circuito onde A e B alimentam uma porta XOR dando a soma e uma porta AND dando o carry
    Um somador meio, como um bloco e como um circuito de uma porta XOR e uma porta AND

    Um somador completo 全加器 soma três bits ($A$, $B$, carry-in), dando uma soma e um carry-out: $S = A \text{ XOR } B \text{ XOR } C_{\text{in}}$. Pode ser construído de dois somadores meios mais uma porta OR. Encadear somadores completos (cada carry-out alimentando o next carry-in) faz um somador multi-bit "ripple-carry".

    Dois somadores meios encadeados com uma porta OR para somar A, B e um carry-in: o primeiro somador meio pega A e B, o segundo adiciona o carry-in, e a porta OR combina os dois carries no carry-out
    Um somador completo é construído de dois somadores meios e uma porta OR

    Tabela-verdade do somador completo. Com entradas $A$, $B$ e o carry-in $C_{\text{in}}$: a soma $S$ é 1 quando um número ímpar de entradas é 1, e o carry-out é 1 quando dois ou mais entradas são 1.

    $A$ $B$ $C_{\text{in}}$ $S$ $C_{\text{out}}$
    0 0 0 0 0
    0 0 1 1 0
    0 1 0 1 0
    0 1 1 0 1
    1 0 0 1 0
    1 0 1 0 1
    1 1 0 0 1
    1 1 1 1 1

    As questões de circuito que o exame propõe. Dado um circuito de uma porta XOR e uma porta AND compartilhando duas entradas, ou dois somadores meios e uma porta OR, "complete a tabela-verdade (mostre seu desenvolvimento)" significa adicionar uma coluna para cada saída de porta intermediária e preencher as linhas em ordem; "affe o nome do circuito" é somador meio ou somador completo; "affe o propósito de cada saída" é a soma dos bits e o carry para a próxima coluna. Soma-de-produtos para o somador meio: $S = \overline{A}B + A\overline{B}$, $C = AB$. Uma cadeia de somadores completos, cada um passando seu carry-out para o next carry-in, soma dois números multi-bit.

    Explorar

    As portas dentro de um somador

    O bit de soma de um half-adder é uma porta XOR e seu carry é uma porta AND — alterne A e B e veja a linha da tabela-verdade acender.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    carry/ˈkæri/ 进位 jìn wèi
    full adder/fʊl ˈædə/ 全加器 quán jiā qì
    15.2

    Flip-flops

    Um flip-flop 触发器 é um circuito bistável 双稳态 — dois estados estáveis (0 e 1) — que lembra seu estado. Armazena um bit e é o elemento básico de registradores e SRAM.

    Flip-flop SR

    Um flip-flop SR SR触发器 tem entradas S (set) e R (reset) e saídas Q e $\overline{Q}$. S=1,R=0 define Q para 1; S=0,R=1 o reseta para 0; S=0,R=0 mantém; S=1,R=1 é inválido. Construído de duas portas NOR acopladas cruzadamente.

    Um flip-flop SR construído de duas portas NOR acopladas cruzadamente, com S alimentando uma porta e R a outra, a saída de cada porta retroalimentada na entrada da outra, e sua tabela-verdade: hold, set, reset e o estado inválido
    O flip-flop SR: duas portas NOR alimentando uma à outra. Com ambas as entradas 0, as saídas mantêm o que eram, que é a memória; S define Q para 1, R o reseta, e S = R = 1 não é permitido

    "Desenhe um circuito lógico para um flip-flop SR e rotule as entradas." Dois portas NOR (ou duas portas NAND), a saída de cada uma conectada de volta a uma entrada da outra; a entrada livre de uma porta é S, da outra R; as saídas são $Q$ e $\overline{Q}$. O feedback é o que vale pontos: sem ele não há memória. "Explique o propósito de um flip-flop." Armazenar um bit de dados; é o elemento básico de memória do qual registros e RAM estática são construídos, e mantém seu valor até ser intencionalmente alterado. A entrada inválida $S = R = 1$ faz com que ambas as saídas fiquem 0, de modo que $\overline{Q}$ já não seja o complemento de $Q$, e o estado após ambas as entradas retornarem a 0 é imprevisível, que é a fraqueza do flip-flop SR.

    Flip-flop JK

    Um flip-flop JK JK触发器 melhora isso ao usar a entrada anteriormente inválida 1,1 como toggle 翻转 (a saída inverte). Isso o torna ideal para construir contadores 计数器 (uma cadeia de flip-flops com toggle). Geralmente é com clock — as entradas atuam apenas na borda do clock, mantendo os flip-flops sincronizados.

    Um símbolo de bloco de flip-flop JK com entradas J, K e relógio e saídas Q e Q-barra, ao lado de sua construção com quatro portas NAND cruzadas com as saídas Q e Q-barra retroalimentadas nas portas de entrada
    Um flip-flop JK: seu símbolo e uma construção a partir de portas NAND

    Flip-flops são os blocos construtivos de registros (n bits = n flip-flops), contadores e células de SRAM 静态RAM.

    Tabela-verdade do flip-flop JK. A entrada clock 时钟 decide quando as entradas J e K são lidas, de modo que a saída muda apenas em um pulso de clock: com $J = K = 0$ a saída é mantida; $J = 1, K = 0$ define $Q$ para 1; $J = 0, K = 1$ zera para 0; $J = K = 1$ inverte (Q torna-se $\overline{Q}$). A última linha é exatamente a entrada proibida do flip-flop SR transformada em útil, pelo qual o JK é preferido: toda combinação de entradas é válida, e a operação com clock o torna o bloco construtivo de contadores e registros de deslocamento.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    flip-flop/flɪp flɒp/ 触发器 chù fā qì
    bistable/baɪˈsteɪbl/ 双稳态 shuāng wěn tài
    toggle/ˈtɒɡl/ 翻转 fān zhuǎn
    counters/ˈkaʊntəz/ 计数器 jì shù qì
    SRAM/ˈesræm/ 静态RAM jìng tài RAM
    clock/klɒk/ 时钟 shí zhōng
    SR flip-flop/ˌes ˈɑː flɪp flɒp/ SR触发器 SR chù fā qì
    JK flip-flop/ˌdʒeɪ ˈkeɪ flɪp flɒp/ JK触发器 JK chù fā qì
    15.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    RISC um processador com um pequeno conjunto de instruções simples, de comprimento fixo, executadas na maioria em um ciclo de clock, usando muitos registros e pipeline
    CISC um processador com um grande conjunto de instruções complexas, de comprimento variável, muitas levando vários ciclos de clock e acessando memória diretamente
    pipeline dividir o ciclo de busca-execução em estágios para que várias instruções sejam processadas simultaneamente, cada uma em um estágio diferente
    SISD / SIMD / MISD / MIMD uma instrução em um item de dados; uma instrução em muitos itens de dados; muitas instruções em um item de dados; muitas instruções em muitos itens de dados
    computador massivamente paralelo milhares de processadores, cada um com sua própria memória, conectados por uma rede e trabalhando simultaneamente em um único problema
    máquina virtual uma emulação de software de um sistema de computador rodando em um computador host e comportando-se como um computador físico separado
    hipervisor o software que cria máquinas virtuais e compartilha o hardware do host entre elas
    tabela-verdade uma tabela listando todas as combinações de entradas de um circuito lógico com a(s) saída(s) resultante(s)
    soma-de-produtos uma expressão booleana escrita como a OR de termos AND, um termo para cada combinação de entrada que resulta em 1
    mapa de Karnaugh uma grade das saídas da tabela-verdade, organizadas em ordem de Gray, em que laços de 1s adjacentes fornecem a expressão simplificada
    somador parcial um circuito que soma dois bits, produzindo uma soma e um acarretar
    somador completo um circuito que soma dois bits e um acarretar de entrada, produzindo uma soma e um acarretar de saída
    flip-flop um circuito bistável que armazena um bit, mantendo sua saída até que suas entradas a alterem
    15.2

    Dicas de prova

    • RISC e CISC são respondidos como listas de características: simples, fixo, um ciclo, muitos registros, carga/armazenamento, pipeline contra complexo, variável, multi-ciclo, menos registros, acesso direto à memória, microcódigo. Quatro de cada.
    • Pipeline: estágios, várias instruções ao mesmo tempo, uma concluída por ciclo, maior taxa de transferência; $n + k - 1$ ciclos para $n$ instruções através de $k$ estágios; interrupções devem esvaziar o pipeline.
    • As quatro categorias de Flynn são "quantas correntes de instrução" por "quantas correntes de dados"; diga o que roda no quê. Massivamente paralelo: muitos processadores, memória própria, rede, mesmo problema.
    • Máquina virtual: emulação de um computador em um host; SO host no hardware, hipervisor compartilhando-o, SO convidado dentro. Dois benefícios e duas limitações, cada um uma frase completa.
    • Álgebra booleana: nomeie cada lei conforme a usa; De Morgan troca o operador e nega cada termo; verifique com uma tabela-verdade se tiver dúvidas.
    • Mapa-K: ordem de Gray, maiores laços de 1/2/4/8, envolvimento permitido, um termo por laço com as variáveis inalteradas. Diga o porquê: expressão mais simples sem álgebra.
    • Somador parcial dá soma e acarretar; somador completo também leva acarretar de entrada; flip-flop SR tem duas portas NOR/NAND cruzadas e armazena um bit; JK com entrada 1,1 inverte.

    Erros comuns

    • Inverter as listas de características RISC e CISC, ou oferecer "mais rápido" como característica; dê as características de projeto, não um veredito.
    • Descrever pipeline como "executar instruções em paralelo em vários núcleos"; são estágios de um processador sobrepostos.
    • Confundir SIMD (uma instrução, muitos dados) com MIMD (muitos de ambos), ou descrever MISD como o caso comum.
    • Definir máquina virtual como "uma cópia de um computador" sem a palavra emulação ou o host e o convidado.
    • Aplicar De Morgan apenas a parte de uma expressão sob uma barra longa, ou remover a barra sem trocar AND por OR.
    • Fazer um laço de um grupo de três, ou um grupo não retangular, em um mapa-K; ordenar as colunas 00, 01, 10, 11 em vez de código Gray.
    • Escrever o acarretar de um somador parcial como XOR e a soma como AND.
    • Desenhar um flip-flop SR como duas portas sem feedback, ou omitir o estado inválido de sua tabela-verdade.
  • 16

    Software de Sistema

    Assistir aula
    16.1

    Como um SO maximiza o uso de recursos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de como um SO pode maximizar o uso de recursos
    Descrever as maneiras pelas quais a interface do usuário esconde a complexidade do hardware do usuário
    Demonstrar compreensão do gerenciamento de processos O conceito de multitarefa e de um processo. Os estados do processo: executando, pronto e bloqueado. A necessidade de agendamento e a função e benefícios de diferentes rotinas de agendamento (incluindo round robin, shortest job first, first come first served, shortest remaining time). Como o kernel do SO atua como manipulador de interrupções e como o manuseio de interrupções é usado para gerenciar o agendamento de baixo nível
    Demonstrar compreensão de memória virtual, segmentação e paginação para gerenciamento de memória Os conceitos de paginação, memória virtual e segmentação. A diferença entre paginação e segmentação. Como as páginas podem ser substituídas. Como o thrashing de disco pode ocorrer

    Fonte: Programa Cambridge International

    Um computador possui muitos recursos (tempo de CPU, memória, disco, E/S) e muitos programas competindo por eles. O SO os compartilha de forma justa e eficiente para que cada um seja bem utilizado e o sistema permaneça responsivo:

    O SO compartilha tempo de CPU, memória, disco e entrada/saída entre programas *O SO compartilha a CPU, memória, disco e E/S entre programas

    • multi-tarefa 多任务 — alternar rapidamente a CPU entre processos para que pareçam executar simultaneamente.
    • gerenciamento de memória — atribuir a cada processo a memória necessária; usar paging 分页 no disco quando a RAM acabar.
    • spooling 假脱机 e buffering — filas de trabalhos de impressão no disco para que a CPU nunca espere pela impressora.
    • cache — manter dados de disco recentemente usados em cache 高速缓存 / RAM.

    Um chip de CPU (unidade central de processamento) *O processador é um recurso chave que o SO compartilha entre tarefas concorrentes

    Módulos de memória (RAM) *O SO também gerencia a memória (RAM), decidindo o que manter nela e o que paging para o disco

    Vocabulário Treinar
    Inglês Chinês Pinyin
    multi-tasking/ˈmʌlti ˈtæskɪŋ/ 多任务 duō rèn wù
    paging/ˈpeɪdʒɪŋ/ 分页 fēn yè
    spooling/ˈspuːlɪŋ/ 假脱机 jiǎ tuō jī
    cache/kæʃ/ 高速缓存 gāo sù huǎn cún
    16.1

    Interface do usuário

    A interface do usuário esconde o hardware atrás de abstrações amigáveis: o usuário vê janelas, menus e pastas, não endereços ou setores. Um clique em um ícone faz o SO encontrar o programa no disco, alocar memória, carregá-lo e iniciá-lo. Uma CLI (linha de comando) é poderosa e scriptável para especialistas; uma GUI (gráfica) é mais fácil de aprender. A maioria dos sistemas oferece ambas.

    "Descreva duas formas pelas quais as complexidades do hardware são ocultadas do usuário." (1) O usuário trabalha com arquivos e pastas por nome, e o SO os traduz em faixas, setores e blocos do disco; (2) o usuário executa um programa com um clique ou comando, e o SO o carrega, aloca memória e o escala sem que o usuário saiba qualquer endereço; (3) drivers de dispositivo permitem que o usuário imprima ou salve sem saber como a impressora ou disco é controlada; (4) uma interface gráfica substitui comandos de nível de máquina por ícones, janelas e menus. O benefício para um estudante, com exemplo: o SO torna o hardware utilizável sem conhecimento técnico, por exemplo salvando um documento em um pendrive arrastando seu ícone.

    "Mostre como um SO maximiza o uso de recursos." Ele escala o processador para que este nunca fique ocioso enquanto um processo está pronto; gerencia a memória, alocando-a para processos, recuperando-a e estendendo-a com memória virtual; gerencia entrada e saída, usando buffers e spooling para que dispositivos rápidos e lentos sobreponham seus trabalhos; e gerencia armazenamento, mantendo controle do espaço livre e arquivos. Cada ponto cita um recurso e o que o SO faz com ele.

    16.1

    Gerenciamento de processos

    Um processo 进程 é um programa em execução — seu código, estado atual, memória e arquivos abertos.

    Escalonamento

    O escaloner 调度器 escolhe qual processo pronto executa a seguir e por quanto tempo:

    • round robin 轮转 — cada processo recebe um time slice 时间片 fixo, depois vai para o final da fila.
    • primeiro a chegar, primeiro a servir; menor trabalho primeiro; menor tempo restante (execute o trabalho com menos trabalho restante); prioridade; filas de feedback multinível.

    O compromisso é responsividade vs taxa de transferência vs justiça.

    "Descreva o que se entende por multi-tarefa e como ela beneficia o gerenciamento de processos." Vários processos são mantidos na memória ao mesmo tempo e o processador alterna entre eles tão rapidamente que parecem executar simultaneamente, cada um recebendo uma parcela de tempo do processador por vez. O benefício: o processador nunca fica ocioso enquanto um processo espera por entrada ou saída, então taxa de transferência é maior e o usuário pode trabalhar em vários programas ao mesmo tempo. "Explique a necessidade de escalonamento." Existem mais processos do que processadores, então uma decisão deve ser tomada sobre qual processo executa a seguir e por quanto tempo; o escalonamento garante que todo processo faça progresso, que o processador esteja plenamente utilizado, que tempos de resposta sejam aceitáveis e que prioridades possam ser respeitadas.

    Duas linhas do tempo das mesmas três tarefas: primeiro-chegado-primeiro-servido executa a tarefa longa primeiro e as tarefas curtas esperam atrás dela, enquanto shortest-job-first executa as tarefas curtas primeiro e reduz o tempo médio de espera de 6.7 para 2.7 unidades *O mesmo trabalho em uma ordem diferente: menor trabalho primeiro coloca as tarefas curtas para fora, de modo que a maioria espera menos, com o risco de uma tarefa longa esperar eternamente

    As rotinas de escalonamento, tal como o exame deseja que sejam descritas.

    Rotina Função Benefício Desvantagem
    primeiro a chegar, primeiro a ser atendido (FCFS) os processos são executados na ordem em que chegam à fila de prontos, cada um até sua conclusão simples; todos os processos são atendidos por vez, nenhum é excluído um processo longo atrasa todos os curtos atrás dele; resposta pobre
    menor tempo de execução primeiro (SJF) o processo pronto com menor tempo estimado de execução roda próximo, até sua conclusão minimiza o tempo médio de espera; muitos trabalhos curtos terminam rapidamente tempos de execução devem ser conhecidos antecipadamente; um trabalho longo pode nunca rodar (exclusão)
    menor tempo restante (SRT) versão preemptiva 抢占式 do SJF: se um novo processo chega com menos tempo restante que o atual, ele assume o controle processos curtos são atendidos ainda mais rápido; bom throughput mais trocas de contexto; um processo longo pode ser interrompido repetidamente e excluir-se
    round robin (RR) cada processo pronto recebe uma fatia de tempo fixa time slice por vez; quando expira, o processo vai para o final da fila justo; todos respondem dentro de um tempo limitado, bom para uso interativo sobrecarga de troca de contexto; uma fatia muito curta desperdiça tempo, uma longa atrasa outros
    prioridade o processo pronto com maior prioridade roda primeiro trabalho importante ou crítico no tempo é feito primeiro processos de baixa prioridade podem excluir-se a menos que as prioridades envelham

    Exemplo resolvido. Três processos chegam juntos com tempos de CPU de 8, 4 e 2 ms. Compare o tempo médio de espera sob FCFS (na ordem de chegada A, B, C) e shortest job first.

    FCFS: A espera 0, B espera 8, C espera 12; média $(0 + 8 + 12)/3 = 6.7\ \text{ms}$. SJF executa C, B, A: C espera 0, B espera 2, A espera 6; média $2.7\ \text{ms}$. O trabalho total é o mesmo, 14 ms de ambos os lados; a ordem decide quem espera. Round robin com fatia de 2 ms daria a A, B e C uma vez cada nos primeiros 6 ms, então C termina em 6 ms, B em 12 ms e A em 14 ms: o mais responsivo, não o mais rápido em média.

    Linha do tempo de Gantt mostrando P1 depois P2, P3, P4 correndo um após o outro do tempo 0 a 39, com legenda dando o tempo de explosão de CPU de cada processo
    Agendamento primeiro a chegar, primeiro a ser atendido de quatro processos
    Agendamento round-robin mostrado como linha do tempo: P1, P2, P3 cada um recebe uma fatia de tempo fixa por vez, depois o ciclo se repete, compartilhando a CPU entre eles
    Round-robin: cada processo recebe uma fatia de tempo fixa por vez, depois o próximo roda (diferente de primeiro a chegar, primeiro a ser atendido)

    Estados do processo

    Um processo é novo, pronto (aguardando a CPU), executando, bloqueado 阻塞 (aguardando E/S ou uma trava), ou terminado. Quando sua fatia de tempo termina, ele vai de executando → pronto; quando solicita E/S, vai de executando → bloqueado; quando a E/S termina, vai de bloqueado → pronto.

    Diagrama de estados: novo para pronto (admissão), pronto para executando (despacho pelo escalonador), executando para pronto (interrupto ou timeout), executando para bloqueado (solicitar E/S), bloqueado de volta para pronto (E/S completa), executando para terminado (saída)
    Um processo se move entre os estados novo, pronto, executando, bloqueado e terminado

    Os três estados e por que um processo se move. Executando: o processo tem o processador. Pronto: poderia rodar mas está esperando pelo processador. Bloqueado: não pode rodar até que algo aconteça. Razões para cada transição, das quais o exame pede uma de cada vez: executando para pronto quando seu fatia de tempo acaba, ou quando um processo de maior prioridade fica pronto e o preempte (um interrupt); executando para bloqueado quando solicita entrada ou saída ou espera por um recurso ou outro processo; bloqueado para pronto quando a E/S pela qual esperava completa (sinalizada por um interrupt); pronto para executando quando o escalona dor o despacha. Um processo bloqueado nunca pode ir diretamente para executando: deve tornar-se pronto primeiro.

    Bloco de controle de processo e troca de contexto

    Para cada processo, o SO mantém um bloco de controle de processo 进程控制块 (PCB) — o contador de programa salvo, registradores, estado e informações de memória.

    Uma troca de contexto salva o estado do processo A (seu PCB) e carrega o do processo B
    Uma troca de contexto salva o estado de um processo e carrega o de outro
    • uma troca de contexto 上下文切换 suspende um processo e inicia outro: salva o estado em um PCB e o restaura de outro. Esse pequeno custo é pago em toda troca.
    • o kernel 内核 (núcleo do SO) atua como manipulador de interrupções 中断处理程序. Quando um dispositivo ou o temporizador gera uma interrupção, tratamento de interrupções 中断处理 salva o processo em execução e executa a rotina certa — isso é o que impulsiona o escalonamento de baixo nível.

    "Descreva como o kernel age como manipulador de interrupções" (duas marcas). Quando uma interrupção é levantada, o kernel salva o estado do processo em execução (seus registradores e contador de programa, em seu bloco de controle de processo), identifica a origem e a prioridade da interrupção, executa a rotina de serviço de interrupção apropriada e, em seguida, restaura o processo interrompido (ou um de maior prioridade) para que a execução continue. É assim que o temporizador encerra uma fatia de tempo e como uma operação de E/S concluída desbloqueia um processo.

    Comunicação entre processos

    Processos são isolados, então o SO fornece comunicação entre processos 进程间通信: tubulações 管道 (a saída de um programa alimenta a entrada de outro), memória compartilhada 共享内存 (uma região que vários processos podem usar) e passagem de mensagens.

    Explorar

    A vida de um processo

    Observe o ciclo pelo qual um processo passa. Ele só executa quando o escalonador o seleciona; necessitar de E/S o envia para bloqueado, e terminar seu slice de tempo o devolve à fila de prontos — rodando e rodando até que termine.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    process/ˈprəʊses/ 进程 jìn chéng
    scheduler/ˈʃedjʊlə/ 调度器 diào dù qì
    round robin/raʊnd ˈrɒbɪn/ 轮转 lún zhuàn
    time slice/taɪm slaɪs/ 时间片 shí jiān piàn
    pre-emptive/priː ˈemptɪv/ 抢占式 qiǎng zhàn shì
    context switch/ˈkɒntekst swɪtʃ/ 上下文切换 shàng xià wén qiè huàn
    kernel/ˈkɜːnl/ 内核 nèi hé
    interrupt handler/ˈɪntərʌpt ˈhændlə/ 中断处理程序 zhōng duàn chǔ lǐ chéng xù
    interrupt handling/ˈɪntərʌpt ˈhændlɪŋ/ 中断处理 zhōng duàn chǔ lǐ
    inter-process communication/ˈɪntə ˈprəʊses kəˌmjuːnɪˈkeɪʃn/ 进程间通信 jìn chéng jiān tōng xìn
    pipes/paɪps/ 管道 guǎn dào
    shared memory/ʃeəd ˈmeməri/ 共享内存 gòng xiǎng nèi cún
    virtual address space/ˈvɜːtʃuːəl əˈdres speɪs/ 虚拟地址空间 xū nǐ dì zhǐ kōng jiān
    pages/ˈpeɪdʒɪz/ 页 yè
    frames/freɪmz/ 页框 yè kuāng
    page fault/peɪdʒ fɒlt/ 缺页 quē yè
    swap file/swɒp faɪl/ 交换文件 jiāo huàn wén jiàn
    16.1

    Memória virtual, segmentação em páginas, segmentação

    Cada processo recebe seu próprio espaço de endereços virtuais 虚拟地址空间 — uma faixa limpa e contígua de endereços que o SO mapeia para memória física. Isso dá a cada processo um espaço simples, protege processos uns dos outros e permite que a memória total exceda a RAM física.

    Na segmentação em páginas, o espaço virtual é dividido em páginas 页 de tamanho fixo e a memória física em quadros 页框 do mesmo tamanho. Uma tabela de páginas mapeia cada página para um quadro. Se uma página acessada não estiver na RAM — uma falta de página 缺页 — o SO a lê do arquivo de swap 交换文件 para um quadro, expulsando outra página se a RAM estiver cheia. Falhas frequentes causam thrashing 抖动 (thrashing de disco), onde o SO passa a maior parte do tempo trocando páginas em vez de fazer trabalho útil.

    Páginas de memória lógica mapeadas através de uma tabela de páginas para quadros de memória física não contíguos
    A segmentação em páginas mapeia cada página de memória lógica para um quadro de memória física

    Na segmentação 分段, a memória é dividida em segmentos lógicos de tamanho variável (código, pilha, heap), cada um com suas próprias permissões. Muitos sistemas usam segmentação em páginas dentro de segmentos.

    Segmentos lógicos de tamanho variável (código, heap, pilha) mapeados através de uma tabela de segmentos de tamanhos e endereços iniciais para memória física
    A segmentação mapeia segmentos de tamanho variável usando uma tabela de mapas de segmento

    "Explique o que significa memória virtual" (três marcas).** Armazenamento secundário (disco) é usado para estender a RAM*, de modo que a memória disponível pareça maior que a memória física; o espaço de endereços de um processo é dividido em páginas, e apenas as páginas atualmente necessárias são mantidas na RAM enquanto o resto aguarda no disco; páginas são trocadas entre RAM e disco conforme necessário, e o SO traduz cada endereço virtual em um físico. Por que um SO precisa dela: os programas em execução podem precisar de mais memória do que a RAM instalada; permite que mais (ou maiores) programas rodam ao mesmo tempo; um programa pode ser maior que a memória física; a memória é usada eficientemente porque apenas as partes ativas dos programas ocupam a RAM.

    Segmentação em páginas contra segmentação: a diferença que o exame quer. Segmentação em páginas divide a memória em blocos de tamanho fixo (páginas e quadros) escolhidos pelo hardware, sem considerar a estrutura do programa, e o mapeamento é invisível ao programador; segmentação divide um programa em unidades lógicas de tamanho variável (um procedimento, uma matriz, a pilha) cujos tamanhos e limites seguem o programa, de modo que um segmento pode ser protegido ou compartilhado como unidade. "Descreva o processo de segmentação": o programa é dividido em segmentos de diferentes tamanhos, cada um receiving a número de segmento; uma tabela de segmentos registra onde cada segmento começa na memória e quanto tempo ele tem; um endereço lógico é um número de segmento mais um offset, e o SO adiciona o offset ao endereço base do segmento para encontrar a localização física.

    "Explique o que significa thrashing de disco" e quando ocorre.** Thrashing de disco** 磁盘抖动 é o estado em que páginas são trocadas para dentro e para fora da RAM tão frequentemente que o processador passa mais tempo movendo páginas do que executando instruções, e o sistema desacelera quase a um ponto morto. Ocorre quando a RAM é muito pequena para as páginas que os processos em execução precisam (seus conjuntos de trabalho): uma página acabada de sair é necessária novamente quase imediatamente, então é buscada de volta, o que empurra outra página que logo será necessária, e assim por diante. Muitos processos ou um programa que acessa a memória imprevisivelmente o provocam; mais RAM ou menos processos o curam.

    Explorar

    O que acontece em um page fault

    Passo a passo de um page fault. Quando o programa acessa uma página que não está na RAM, o SO busca silenciosamente do disco e atualiza a tabela de páginas — para que o programa veja mais memória do que fisicamente existe.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    thrashing/ˈθræʃɪŋ/ 抖动 dǒu dòng
    segmentation/ˌseɡmənˈteɪʃn/ 分段 fēn duàn
    disk thrashing/dɪsk ˈθræʃɪŋ/ 磁盘抖动 cí pán dǒu dòng
    interpreter/ɪnˈtɜːprɪtə/ 解释器 jiě shì qì
    compiler/kəmˈpaɪlə/ 编译器 biān yì qì
    machine code/məˈʃiːn kəʊd/ 机器码 jī qì mǎ
    lexical analysis/ˈleksɪkl əˈnæləsɪs/ 词法分析 cí fǎ fēn xī
    16.2

    Como um interpretador executa um programa

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de como um interpretador pode executar programas sem produzir uma versão traduzida
    Demonstrar compreensão das várias etapas no compilador de um programa Incluindo análise léxica, análise sintática, geração de código e otimização
    Demonstrar compreensão de como a gramática de uma linguagem pode ser expressa usando diagramas de sintaxe ou notação Backus-Naur Form (BNF)
    Demonstrar compreensão de como a Notação Polonesa Reversa (RPN) pode ser usada para realizar a avaliação de expressões

    Fonte: Programa Cambridge International

    Um interpretador 解释器 traduz e executa o código-fonte ao mesmo tempo. Para cada instrução, ele lê a linha, faz análise léxica e sintática, verifica tipos, então executa a ação e avança. Erros são reportados imediatamente e geralmente para; nenhuma versão executável é produzida. A tradução é refeita a cada execução (mais lento), mas oferece feedback rápido de desenvolvimento e é portátil.

    "Explique como um interpretador executa um programa sem produzir uma versão traduzida" (três marcas).** O interpretador pega uma instrução (linha) de cada vez, traduz (analisa) e executa imediatamente, antes de passar para a próxima; nenhuma versão traduzida do programa inteiro é criada ou armazenada, então cada instrução é traduzida todas as vezes que é executada, incluindo cada passagem por um loop; se uma instrução contém um erro, a execução para ali e o erro é reportado. Isso é o que torna um interpretador bom para desenvolver e testar (erros são encontrados à medida que são alcançados, e uma mudança pode ser testada imediatamente) mas mais lento para executar programas terminados.

    16.2

    Etapas de compilação

    Um compilador 编译器 transforma o código-fonte em código máquina 机器码 em fases:

    1. análise léxica 词法分析 — o lexer agrupa caracteres em tokens 词法单元 (palavras-chave, identificadores, operadores, literais), descartando espaços em branco e comentários.
    2. análise sintática (parsing) 语法分析 — verifica se os tokens se encaixam na gramática e constrói uma árvore de sintaxe abstrata 抽象语法树. Um colchete faltante causa um erro de sintaxe 语法错误.
    3. análise semântica 语义分析 — verifica se o programa faz sentido (variáveis declaradas, tipos correspondentes).
    4. geração de código 代码生成 — percorre a árvore e emite código-alvo, escolhe registradores e layouts.
    5. otimização de código — remova trabalho redundante, combine constantes, reordene para o pipeline.

    The output is an executable.

    As fases da compilação: o código-fonte passa por análise lexical (tokens), análise sintática (AST), análise semântica (verificações), geração de código e otimização para produzir um executável
    As fases da compilação, do código-fonte a um executável otimizado

    O propósito de cada etapa, nas palavras que pontuam. Análise léxica: remove espaços em branco e comentários; converte os caracteres do código-fonte em tokens (palavras-chave, identificadores, operadores, constantes), verificando se cada um é válido na linguagem; insere identificadores na tabela de símbolos 符号表. Análise sintática: verifica se a sequência de tokens obedece à gramática (regras de sintaxe) da linguagem; constrói uma árvore de análise (árvore de sintaxe abstrata); reporta erros de sintaxe; verificação de tipos e verificação de declarações de variáveis às vezes são contadas aqui como análise semântica. Geração de código: converte a árvore verificada em código objeto ou código de máquina (possivelmente via código intermediário), alocando memória e registradores. Otimização: faz o código rodar mais rápido ou usar menos memória, removendo instruções redundantes, combinando ou simplificando cálculos e reorganizando loops, sem alterar o que o programa faz. A questão de correspondência associa cada etapa a uma dessas descrições.

    Explorar

    As fases da compilação

    Passo a passo do que um compilador faz com seu código-fonte. Cada fase entrega sua saída para a próxima — caracteres tornam-se tokens, tokens tornam-se uma árvore, a árvore torna-se código máquina otimizado.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    tokens/ˈtəʊkənz/ 词法单元 cí fǎ dān yuán
    syntax analysis (parsing)/ˈsɪntæks əˈnæləsɪs/ 语法分析 yǔ fǎ fēn xī
    abstract syntax tree/ˈæbstrækt ˈsɪntæks triː/ 抽象语法树 chōu xiàng yǔ fǎ shù
    syntax error/ˈsɪntæks ˈerə/ 语法错误 yǔ fǎ cuò wù
    semantic analysis/səˈmæntɪk əˈnæləsɪs/ 语义分析 yǔ yì fēn xī
    code generation/kəʊd ˌdʒenəˈreɪʃn/ 代码生成 dài mǎ shēng chéng
    code optimisation/kəʊd ˌɒptɪmaɪˈzeɪʃn/ 代码优化 dài mǎ yōu huà
    symbol table/ˈsɪmbl ˈteɪbl/ 符号表 fú hào biǎo
    grammar/ˈɡræmə/ 文法 wén fǎ
    16.2

    Grammar: BNF and syntax diagrams

    Uma gramática diz quais sequências de tokens são programas válidos.

    Backus-Naur Form 巴科斯-诺尔范式 (BNF) is textual. A production rule 产生式 has the form:

    <symbol> ::= alternative1 | alternative2 | ...
    

    Cada alternativa é uma sequência de símbolos terminais (texto literal) e símbolos não terminais (outros nomes de regras):

    <digit>      ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
    <identifier> ::= <letter> | <identifier> <letter> | <identifier> <digit>
    

    A terceira regra recursiva expressa "uma letra seguida por qualquer número de letras ou dígitos". Uma instrução IF:

    <if-statement> ::= IF <condition> THEN <statement> ENDIF
                     | IF <condition> THEN <statement> ELSE <statement> ENDIF
    

    Um diagrama de sintaxe 语法图 (diagrama de ferrovia) mostra a mesma coisa graficamente: caixas para não-terminais, caixas arredondadas para terminais, setas para caminhos válidos, loops para repetição. As duas notações são equivalentes. O analisador sintático usa a gramática para decidir se um programa é válido.

    Um diagrama ferroviário para uma atribuição: uma caixa retangular de identificador, uma caixa arredondada de símbolo de atribuição e, em seguida, uma caixa retangular de expressão, conectadas da esquerda para a direita
    A syntax (railroad) diagram for an assignment statement
    Três diagramas sintáticos, para uma letra, um dígito e um identificador que começa com uma letra e continua com qualquer número de letras ou dígitos, ao lado das regras BNF que expressam exatamente a mesma gramática, com exemplos válidos e inválidos
    Um diagrama sintático e uma regra BNF dizem a mesma coisa: uma escolha torna-se alternativas separadas por barras, e um loop torna-se uma regra que se refere a si mesma

    Lendo os diagramas do exame. Cada diagrama define um não-terminal; siga as setas da entrada até a saída, e todo caminho que você puder traçar é uma string válida. Uma escolha de caixas lado a lado é um conjunto de alternativas; um laço de volta significa "repita quantas vezes quiser"; uma caixa para outro não-terminal significa "insira qualquer coisa que a regra permita". "Explique por que a string é inválida" quer a regra que ela viola, em palavras: 9K é inválido como variável porque o primeiro caractere deve ser uma letra, não um dígito; JJ90 é um código de acesso inválido se a regra permitir apenas uma letra antes dos dígitos, ou se J não estiver no conjunto de letras listadas. Sempre verifique a string contra o conjunto de caracteres que o diagrama realmente permite, não contra o que uma linguagem real aceitaria.

    Escrevendo BNF a partir de um diagrama. Cada diagrama torna-se uma regra <name> ::= ...; as alternativas são separadas por |; uma sequência é escrita um símbolo após o outro; e a repetição é escrita com recursão, porque o BNF não tem símbolo de loop: "uma ou mais letras" é <word> ::= <letter> | <letter><word>, e "zero ou mais dígitos após uma letra" é <variable> ::= <letter> | <letter><digits> com <digits> ::= <digit> | <digit><digits>.

    Exemplo resolvido. Complete o BNF para uma matrícula de veículo que deve começar com duas letras (de A B C) seguidas por um, dois ou três dígitos (de 0 1 2).

    <letter>       ::= A | B | C
    <digit>        ::= 0 | 1 | 2
    <digits>       ::= <digit> | <digit><digit> | <digit><digit><digit>
    <registration> ::= <letter><letter><digits>
    

    AB12 é válido; A12 não é (apenas uma letra); AB1234 não é (quatro dígitos); AD1 não é (D não é uma letra listada). Pedem para adicionar uma restrição como "o terceiro caractere também pode ser um símbolo", adicione a alternativa extra à regra para essa posição apenas e defina <symbol> com sua própria regra.

    Exemplo resolvido. Escreva BNF para uma expressão que seja uma variável, seguida por um operador, seguida por outra variável ou um número, onde uma variável é uma única letra minúscula de a b c e um operador é + ou -.

    <variable>   ::= a | b | c
    <operator>   ::= + | -
    <number>     ::= <digit> | <digit><number>
    <expression> ::= <variable><operator><variable> | <variable><operator><number>
    

    A regra recursiva <number> permite qualquer número de dígitos; as duas alternativas de <expression> cobrem ambos os casos nomeados na definição. Mantenha todos os não-terminais entre colchetes angulares e todos os terminais sem eles.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Backus-Naur Form/ˈbækəs nɔː fɔːm/ 巴科斯-诺尔范式 bā kē sī - nuò ěr fàn shì
    production rule/prəˈdʌkʃn ruːl/ 产生式 chǎn shēng shì
    terminal/ˈtɜːmɪnl/ 终结符 zhōng jié fú
    non-terminal/nɒn ˈtɜːmɪnl/ 非终结符 fēi zhōng jié fú
    syntax diagram/ˈsɪntæks ˈdaɪəɡræm/ 语法图 yǔ fǎ tú
    16.2

    Reverse Polish Notation (RPN)

    Na notação infixa 中缀, o operador fica entre seus operandos (3 + 4 * 2), necessitando de parênteses e regras de precedência. Na Notação Polonesa Reversa 逆波兰表示法 (RPN, pós-fixa 后缀), o operador segue seus operandos (3 4 2 * +), não necessitando de parênteses.

    Converting infix to RPN

    Use uma pilha 栈 de operadores. Varre da esquerda para a direita: output de um operando; para um operador, primeiro pop quaisquer operadores empilhados de precedência 优先级 maior ou igual ao output, depois push-o; push (; em ) pop para output até o ( correspondente. No final, pop todos os operadores. Exemplo: (3 + 4) * 2 → 3 4 + 2 *.

    Evaluating RPN

    Use uma pilha de operandos. Varra da esquerda para a direita: empurre cada operando; ao encontrar um operador, pop os dois superiores, aplique-o e empurre o resultado. Avaliando 3 4 2 * +:

    Token Stack
    3 3
    4 3, 4
    2 3, 4, 2
    * 3, 8
    + 11

    Resultado: 11. RPN não precisa de parênteses na avaliação e se adapta a uma máquina de pilha — que é como a JVM e muitos interpretadores de bytecode funcionam.

    "Explique por que a RPN é usada para avaliar expressões" (duas marcas). Na RPN, os operadores aparecem na ordem em que são aplicados, então uma expressão pode ser avaliada em uma única passagem da esquerda para a direita com sem parênteses e sem regras de precedência; portanto, é mais simples e rápida para o compilador ou interpretador processar. "Identifique, com razões, uma estrutura de dados adequada": uma pilha, porque a avaliação precisa dos operandos empurrados mais recentemente primeiro (último a entrar, primeiro a sair): cada operando é empurrado, e cada operador pop dos dois superiores, aplica-se a si mesmo e push do resultado. Mostre o conteúdo da pilha após cada token quando solicitado.

    Convertendo infix para RPN à mão. (1) Complete a expressão com parênteses usando as regras de precedência; (2) mova cada operador para logo após o parêntese fechado de seu próprio par; (3) remova os parênteses. Então $(a - b) * (a + c) / 7$ torna-se $((a - b) * (a + c)) / 7$, então a b - a c + * 7 /. Note que * e / são aplicados da esquerda para a direita, então a divisão é o último operador, não a multiplicação. Mais conversões: $((7 + 3) - (2 * 8)) / 6$ é 7 3 + 2 8 * - 6 /; $(7 - 2 + 8) / (9 - 5)$ é 7 2 - 8 + 9 5 - /; $a * b + b - d + 15$ é a b * b + d - 15 +; $(2 - 6) * (13 + 7) / 5$ é 2 6 - 13 7 + * 5 /.

    Convertendo RPN de volta para infix. Trabalhe através da RPN com uma pilha de expressões: push de cada operando; para cada operador pop de dois, escreva-os de cada lado dele entre parênteses e push do resultado. Então a b / 4 * a b + - é $((a / b) * 4) - (a + b)$; 5 2 + 9 3 - / 3 * é $((5 + 2) / (9 - 3)) * 3$; b a c - + d b + * c / é $((b + (a - c)) * (d + b)) / c$; a b - c + c a - * d / é $(((a - b) + c) * (c - a)) / d$. Mantenha os parênteses: descartá-los pode mudar o significado.

    Worked example. Avaliar a b - c d + * e / when $a = 17$, $b = 5$, $c = 7$, $d = 3$ e $e = 10$, showing the stack.

    token action stack (top on the right)
    a push 17 17
    b push 5 17, 5
    - pop 5 and 17, push $17 - 5$ 12
    c push 7 12, 7
    d push 3 12, 7, 3
    + pop 3 and 7, push $7 + 3$ 12, 10
    * pop 10 and 12, push $12 \times 10$ 120
    e push 10 120, 10
    / pop 10 e 120, push $120 / 10$ 12

    Resultado 12. A ordem dos pops importa para - e /: o valor popped segundo é o operando esquerdo, então a b - é $a - b$, não $b - a$. Mais dois, da mesma forma: d a b + * c a - / com $a = 6, b = 12, c = 15, d = 5$ dá $5 \times (6 + 12) / (15 - 6) = 90 / 9 = 10$; c a - b d + * b c + / com $a = 4, b = 12, c = 24, d = 6$ dá $(24 - 4) \times (12 + 6) / (12 + 24) = 360 / 36 = 10$.

    Exemplo resolvido. Converta $(A + B) \times (C - D)$ para RPN, depois avalie $(3 + 4) \times (5 - 2)$. Varra da esquerda para a direita usando uma pilha 栈 de operadores. Push (; output A; push +; output B; em ) pop de volta até o ( correspondente, dando A B + até agora. Push ×, e o segundo parêntese comporta-se da mesma maneira, dando C D -. No final pop o ×. Resultado: A B + C D - ×. Para avaliar os números, use uma pilha de operandos: push 3, push 4; + pop de ambos e push 7; push 5, push 2; - pop de ambos e push 3; × pop 7 e 3 e push 21. Duas coisas tornam isso confiável: os operandos mantêm sua ordem original através da conversão (apenas os operadores se movem) e cada operador atua nos dois valores imediatamente abaixo dele na pilha.

    Explorar

    Precedência de operadores — o que a RPN elimina

    Na matemática infixa comum, × e ÷ têm precedência maior que + e −, então você deve aplicar as regras na ordem certa. A Notação Polonesa Reversa escreve os operandos primeiro (3 4 2 × + 1 −), fixando a ordem para que nenhuma regra de precedência seja necessária.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    infix/ˈɪnfɪks/ 中缀 zhōng zhuì
    Reverse Polish Notation/rɪˈvɜːs ˈpəʊlɪʃ nəʊˈteɪʃn/ 逆波兰表示法 nì bō lán biǎo shì fǎ
    postfix/ˈpəʊstfɪks/ 后缀 hòu zhuì
    stack/stæk/ 栈 zhàn
    precedence/ˈpresɪdəns/ 优先级 yōu xiān jí
    bytecode/ˈbaɪtkəʊd/ 字节码 zì jié mǎ
    16.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    multi-tarefa vários processos mantidos na memória ao mesmo tempo, com o processador alternando entre eles para que pareçam estar sendo executados simultaneamente
    processo um programa que foi carregado na memória e está sendo executado (ou está pronto para ser)
    executando / pronto / bloqueado possui o processador / aguardando o processador / não pode continuar até que um evento, como a conclusão de E/S, ocorra
    escalonamento decidir qual processo pronto receberá o processador em seguida e por quanto tempo
    escalonamento preemptivo o processo em execução pode ser interrompido e movido para pronto para que outro processo seja executado
    memória virtual usar armazenamento secundário para estender a RAM, mantendo apenas as páginas necessárias atualmente na memória física
    paginação dividir a memória e os programas em páginas de tamanho fixo que são movidas entre o disco e a RAM conforme necessário
    segmentação dividir um programa em segmentos lógicos de tamanho variável, cada um mapeado para a memória por uma tabela de segmentos
    thrashing de disco páginas sendo trocadas entre RAM e disco tão frequentemente que pouco processamento útil é realizado
    interpretador traduz e executa um programa uma instrução por vez, sem produzir uma versão traduzida
    compilador traduz todo um programa de alto nível para código de máquina (objeto) antes de ser executado
    análise lexical converte o código-fonte em tokens, removendo espaços em branco e comentários, e constrói a tabela de símbolos
    análise sintática verifica se os tokens obedecem à gramática da linguagem e constrói uma árvore de análise
    Forma de Backus–Naur uma notação para a gramática de uma linguagem: regras da forma <name> ::= alternatives construídas a partir de terminais e não-terminais
    Notação Polonesa Reversa uma maneira de escrever expressões em que cada operador vem depois dos seus operandos, permitindo avaliação com uma pilha e sem parênteses
    16.2

    Dicas de prova

    • As questões do SO são avaliadas em mecanismos nomeados: escalonamento, gerenciamento de memória, buffering e spooling de E/S, gerenciamento de arquivos; quanto à interface, nomes de arquivo em vez de endereços, cliques em vez de comandos, drivers, GUI.
    • Estados do processo com suas transições e o motivo de cada uma; rotinas de escalonamento como função mais benefício mais desvantagem; o kernel salva o estado, identifica a interrupção, atende-a, restaura.
    • Memória virtual: disco estende RAM, páginas trocadas, tradução de endereço; paging é tamanho fixo e invisível, segmentação é tamanho variável e lógico; thrashing (thrashing) é troca de páginas em vez de trabalho útil.
    • Interpretador: uma instrução por vez, traduzida depois executada, nada armazenado. Estágios do compilador: tokens e tabela de símbolos, gramática e árvore de análise, código, otimização.
    • BNF: uma regra por diagrama, | para escolha, recursão para repetição, terminais nus e não-terminais entre colchetes angulares. Diga qual regra uma string viola.
    • RPN: operadores após os operandos, avalie com uma pilha, mostre cada passo; converta adicionando parênteses completos; ao converter de volta, mantenha os parênteses.

    Erros comuns

    • Descrever multitarefa como "executar vários programas ao mesmo tempo" sem dizer que o processador alterna entre eles.
    • Enviar um processo bloqueado diretamente para executing, ou dar "time slice ended" como razão para executing ir para blocked.
    • Confundir shortest job first (não preempitivo) com shortest remaining time (preempitivo), ou round robin com prioridade.
    • Definir memória virtual como "usar o disco rígido como RAM" sem mencionar que as páginas são trocadas.
    • Dizer que um interpretador "converte o programa para código de máquina e então o executa"; isso é um compilador.
    • Colocar verificação de sintaxe na análise léxica, ou otimização antes da geração de código na questão de correspondência.
    • Escrever repetição BNF como <letter>* ou com reticências; use recursão. Deixar colchetes angulares fora dos não-terminais.
    • Revertendo os operandos de - ou / ao avaliar RPN, ou escrevendo a RPN de $a * b + c$ como a b c + *.
    Vocabulário Treinar
    Inglês Chinês Pinyin
    blocked/blɒkt/ 阻塞 zǔ sè
    process control block/ˈprəʊses kənˈtrəʊl blɒk/ 进程控制块 jìn chéng kòng zhì kuài
  • 17

    Segurança

    Assistir aula
    17.1

    Como funciona a criptografia

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de como a criptografia funciona Incluindo o uso de chave pública, chave privada, texto claro, texto cifrado, criptografia, criptografia de chave simétrica e criptografia de chave assimétrica. Como as chaves podem ser usadas para enviar uma mensagem privada do público para um indivíduo/organização. Como as chaves podem ser usadas para enviar uma mensagem verificada ao público. Como os dados são criptografados e descriptografados, usando criptografia simétrica e assimétrica. Propósito, benefícios e desvantagens da criptografia quântica
    Demonstrar conhecimento sobre Secure Socket Layer (SSL) / Transport Layer Security (TLS) Propósito de SSL/TLS. Uso de SSL/TLS em comunicação cliente-servidor. Situações onde o uso de SSL/TLS seria apropriado
    Demonstrar compreensão de certificação digital Como um certificado digital é adquirido. Como um certificado digital é usado para produzir assinaturas digitais

    Fonte: Programa Cambridge International

    Criptografia 加密 transforma plaintext 明文 (texto claro) legível em ciphertext 密文 (texto cifrado) ilegível usando uma operação matemática que depende de uma chave 密钥. Apenas alguém com a chave certa pode reverter — decryption 解密 — para recuperar o plaintext. Um atacante que intercepta o ciphertext sem a chave vê apenas dados sem sentido, pois tentar todas as chaves possíveis levaria muito tempo. Uma abordagem mais recente, quantum cryptography 量子密码学, usa física quântica para compartilhar uma chave de forma a revelar qualquer espião.

    A máquina de cifra Enigma com seu teclado e rotores
    A máquina Enigma criptografava mensagens na Segunda Guerra Mundial — um dispositivo de cifra mecânico inicial
    Plaintext passa por um algoritmo de criptografia com uma chave de criptografia até ciphertext, pela internet, depois um algoritmo de decifragem com uma chave de decifragem de volta a plaintext
    Criptografia embaralha plaintext com uma chave; decifragem inverte isso

    Criptografia simétrica

    Criptografia simétrica 对称加密 (criptografia de chave simétrica) usa a mesma key 密钥 tanto para criptografia quanto para decifragem, portanto remetente e destinatário devem ambos possuir a chave secreta. É rápida e boa para dados em massa (disco inteiro, fluxo de vídeo). Seu problema é chave distribution 密钥分发: como você compartilha a chave com segurança inicialmente? A criptografia assimétrica resolve isso.

    "Descreva o que se entende por criptografia de chave simétrica" (duas marcas). A mesma chave é usada para criptografar o plaintext e para decifrar o ciphertext, portanto a chave deve ser compartilhada entre remetente e destinatário e mantida secreta para todos os outros. Duas desvantagens. A chave precisa ser trocada antes que a mensagem possa ser enviada, e se for interceptada no trânsito o interceptador pode ler todas as mensagens; uma chave separada é necessária para todo par de correspondentes; e não fornece prova de quem enviou a mensagem, porque ambas as extremidades detêm a mesma chave. "Dê duas razões para usar criptografia de chave": para que os dados fiquem ilegíveis por quem quer que os intercepte (confidencialidade); para que o destinatário tenha certeza de que os dados vieram do remetente declarado e não foram alterados (autenticidade e integridade 完整性). Os dois métodos são criptografia de chave simétrica e assimétrica.

    Criptografia simétrica usa a mesma chave em ambas as extremidades, que devem ser compartilhadas secretamente
    Criptografia simétrica usa a mesma chave secreta em ambas as extremidades

    Criptografia assimétrica (chave pública)

    Criptografia assimétrica 非对称加密 (criptografia de chave assimétrica) dá a cada usuário um par de chaves relacionadas: uma public key 公钥 que publica, e uma private key 私钥 que mantém secreta. Dados criptografados com a chave pública podem ser decifrados apenas com a chave privada correspondente, e vice-versa.

    Tom e Meera têm cada um uma chave pública para compartilhar e uma chave privada mantida secreta; Meera envia a Tom sua chave pública
    Cada usuário tem uma chave pública para compartilhar e uma chave privada para manter secreta

    Para enviar uma mensagem secreta para Alice: obtenha sua chave pública publicada, criptografe com ela e envie. Apenas Alice — detendo a chave privada correspondente — pode decifrar. Nenhuma troca prévia de chave é necessária. O trade-off é que é muito mais lento que a simétrica, portanto não é usado para grandes volumes de dados.

    "Afirme o que se entende por uma chave privada." Uma chave conhecida apenas pelo seu proprietário (nunca transmitida), usada para decifrar dados que foram criptografados com a chave pública correspondente, e para criar assinaturas digitais. "Descreva o processo de criptografia assimétrica" (quatro marcas): (1) o receptor gera um par de chaves, uma chave pública e uma chave privada, matematicamente relacionadas; (2) a public key 公钥 é disponibilizada a qualquer um que queira enviar a ele; (3) o remetente criptografa o plaintext com a public key 公钥 do receptor; (4) o ciphertext só pode ser decifrado com a private key 私钥 do receptor, que nunca sai do receptor, portanto ninguém que intercepte a mensagem pode lê-la.

    Exemplo resolvido. Fred quer enviar um documento confidencial a Sheila. Explique como a criptografia assimétrica é usada.

    Sheila tem um par de chaves; ela envia a Fred sua chave pública (ou ele a obtém de seu certificado). Fred criptografa o documento com a public key 公钥 de Sheila e envia o ciphertext. Apenas a private key 私钥 de Sheila pode decifrá-lo, e apenas Sheila a detém, portanto ninguém mais, incluindo Fred uma vez criptografado, pode ler o documento. As chaves são usadas no sentido do destinatário: sua chave pública para travar, sua chave privada para destravar. Uma organização que detém um par de chaves "para receber transmissões seguras" faz exatamente isso: publica a chave pública, mantém a chave privada e decifra o que chegar.

    Duas diferenças entre criptografia simétrica e assimétrica. Simétrica usa uma chave para ambas as direções; assimétrica usa duas chaves relacionadas, uma para criptografar e outra para decifrar. Em criptografia simétrica a chave deve ser mantida secreta por ambas as partes e trocada com segurança; em criptografia assimétrica a chave pública pode ser publicada e apenas a chave privada é secreta. Criptografia simétrica é muito mais rápida e adequada para grandes quantidades de dados; assimétrica é mais lenta, portanto é usada para chaves e assinaturas em vez de dados em massa.

    Uma chave privada deve permanecer secreta, portanto às vezes é mantida em um pequeno hardware security key 硬件安全密钥. Você o conecta ou toca nele para provar quem você é, e a chave secreta nunca sai do dispositivo.

    Uma chave de segurança de hardware preta sobre fundo branco, com um sensor de toque dourado redondo no meio e um conector USB dourado em uma extremidade *Uma chave de segurança de hardware armazena uma chave secreta para provar quem você é

    Abordagem híbrida (usada por quase todos os sistemas reais)

    Use criptografia assimétrica para trocar uma session key 会话密钥 fresca, depois use essa chave simétrica para os dados:

    1. o cliente cria uma session key aleatória.
    2. ele criptografa a session key com a public key do servidor.
    3. o servidor decifra com sua private key.
    4. ambas as extremidades agora compartilham a session key e usam criptografia simétrica rápida para o resto.

    É assim que funcionam HTTPS e SSH.

    A versão do exame do problema de troca de chaves. "Uma chave simétrica será trocada antes que a mensagem seja enviada. Explique como a chave pode ser trocada com segurança." O remetente criptografa a chave simétrica com a public key 公钥 do destinatário e a envia; o destinatário a decifra com sua private key 私钥; ambos agora detêm a chave simétrica, que nunca foi exposta no trânsito, e a usam para as mensagens. A criptografia assimétrica resolve o problema de distribuição; a criptografia simétrica então faz o trabalho rápido.

    O cliente criptografa uma session key com a public key do servidor e a envia; apenas a private key do servidor pode abri-la; então ambas as extremidades usam criptografia simétrica rápida com a session key compartilhada *A abordagem híbrida: criptografia assimétrica compartilha uma session key uma vez, depois criptografia simétrica rápida protege os dados

    Hashing (relacionado, não criptografia)

    Uma função cryptographic hash 密码散列 pega qualquer entrada e produz um digest 摘要 de tamanho fixo tal que a mesma entrada sempre produz o mesmo digest, é inviável encontrar duas entradas com o mesmo digest, e uma pequena mudança na entrada muda completamente o digest. Hashing é one-way — você não pode recuperar a entrada. É usado para armazenamento de verificações de senha, verificações de integrity 完整性 e assinaturas digitais.

    Um cryptographic hash mapeia a entrada hello para um digest e a entrada hellp, com uma letra alterada, para um digest completamente diferente; hashing não pode ser revertido *Um cryptographic hash produz um digest fixo; uma pequena mudança na entrada o muda completamente, e não pode ser revertido

    Criptografia quântica

    Criptografia quântica usa a física da luz para distribuir chaves: os bits de uma chave são enviados como fótons cujos estados quânticos codificam os valores. "Descreva seu propósito": transmitir uma chave de criptografia com segurança, de modo que qualquer tentativa de interceptação possa ser detectada, pois medir um fóton altera seu estado; um espião (窃听者) portanto deixa rastros, e a chave corrompida é descartada e uma nova é enviada. Benefícios: a interceptação é sempre detectável; a chave não pode ser copiada sem ser alterada; é segura contra avanços futuros no poder de computação (uma chave matemática pode eventualmente ser quebrada, uma quântica não pode ser lida sem perturbá-la). Desvantagens: requer equipamentos especializados e caros; funciona apenas sobre distâncias limitadas em fibra ótica dedicada (ou linha de visão), não através da internet existente; distribui apenas a chave, então a criptografia comum ainda protege a mensagem; e é uma tecnologia nova com poucos fornecedores e pouca experiência.

    Explorar

    Hashing e o efeito avalanche

    Um hash é unidirecional: fácil de calcular, praticamente impossível de reverter. Uma pequena mudança na entrada inverte uma parte grande e imprevisível da saída — o efeito avalanche que torna hashes bons para senhas.

    Explorar

    A cifra de César

    Desloque cada letra para criptografar a mensagem. Uma cifra simples mostra a ideia de uma chave — e por que uma chave pequena é fácil de quebrar.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    encryption/enˈkrɪpʃn/ 加密 jiā mì
    plaintext/ˈpleɪntekst/ 明文 míng wén
    ciphertext/ˈsaɪfətekst/ 密文 mì wén
    decryption/dɪˈkrɪpʃn/ 解密 jiě mì
    quantum cryptography/ˈkwɒntəm krɪpˈtɒɡrəfi/ 量子密码学 liàng zǐ mì mǎ xué
    eavesdropper/ˈiːvzdrɒpə/ 窃听者 qiè tīng zhě
    symmetric encryption/sɪˈmetrɪk enˈkrɪpʃn/ 对称加密 duì chèn jiā mì
    key distribution/kiː ˌdɪstrɪˈbjuːʃn/ 密钥分发 mì yào fēn fā
    asymmetric encryption/ˌeɪsɪˈmetrɪk enˈkrɪpʃn/ 非对称加密 fēi duì chèn jiā mì
    integrity/ɪnˈteɡrɪti/ 完整性 wán zhěng xìng
    public key/ˈpʌblɪk kiː/ 公钥 gōng yào
    private key/ˈpraɪvət kiː/ 私钥 sī yào
    hardware security key/ˈhɑːdweə sɪˈkjʊərɪti kiː/ 硬件安全密钥 yìng jiàn ān quán mì yào
    session key/ˈseʃn kiː/ 会话密钥 huì huà mì yào
    cryptographic hash/ˌkrɪptəˈɡræfɪk hæʃ/ 密码散列 mì mǎ sàn liè
    digest/ˈdaɪdʒest/ 摘要 zhāi yào
    17.1

    SSL / TLS

    TLS Segurança na Camada de Transporte (Transport Layer Security, o sucessor do Secure Socket Layer, SSL) é um protocolo que fornece criptografia e autenticação para dados transmitidos por uma rede. Ele criptografa os dados em trânsito, autentica o servidor com um certificado e fornece integridade (detecção de adulteração).

    Esboço de um handshake TLS:

    1. o cliente se conecta e propõe opções de cifra.
    2. o servidor escolhe uma e envia seu certificado digital (com sua chave pública) — emitir e validar esses certificados é certificação digital.
    3. o cliente verifica o certificado.
    4. as duas extremidades trocam uma chave de sessão fresca usando criptografia assimétrica.
    5. todo o tráfego subsequente usa criptografia simétrica rápida com a chave de sessão.

    O resultado é um túnel criptografado, autenticado e verificado quanto à integridade para protocolos de nível superior (HTTP, SMTP). É adequado sempre que informações sensíveis são enviadas: navegação web HTTPS, banco online e pagamentos, e-mail seguro e VPNs.

    "Descreva o propósito do SSL/TLS" e "cite duas funções." O propósito é fornecer comunicação segura entre um cliente e um servidor através de uma rede. Suas funções: ele criptografa os dados enviados, para que não possam ser lidos se interceptados; autentica (认证) o servidor (e opcionalmente o cliente) por meio de um certificado digital, para que o cliente saiba que está conversando com o site genuíno; e verifica a integridade dos dados, para que alterações durante o trânsito sejam detectadas. Dois exemplos onde é apropriado: banco online e compras online (pagamentos com cartão); também logins, e-mail privado, transferência de arquivos, VoIP e mensagens instantâneas: qualquer transação em que dados privados cruzem a internet.

    Os dois protocolos que compõem o TLS. O protocolo de handshake (握手) configura a sessão: concorda nos algoritmos de criptografia (suite de cifras), autentica o servidor com seu certificado e troca a chave de sessão. O protocolo de record então transporta os dados: criptografa cada mensagem com a chave de sessão, adiciona uma verificação de integridade e a passa para a camada de transporte.

    Um diagrama de sequência entre um cliente e um servidor: o cliente solicita uma conexão segura, o servidor responde com seu certificado digital e chave pública, o cliente verifica o certificado, cria uma chave de sessão e a envia criptografada com a chave pública do servidor, o servidor a descriptografa com sua chave privada, e ambos os lados então comunicam-se com criptografia simétrica
    Como uma sessão segura começa: o certificado prova quem é o servidor, a chave pública do servidor protege a chave de sessão em trânsito, e a chave de sessão protege tudo depois disso

    "Explique como o SSL/TLS é usado quando a comunicação cliente-servidor é iniciada" (seis marcas). (1) O cliente (navegador) envia uma solicitação ao servidor por uma conexão segura, dizendo quais métodos de criptografia suporta. (2) O servidor devolve seu certificado digital, que contém sua chave pública. (3) O cliente verifica se o certificado é válido (emitido por uma Autoridade Certificadora confiável, não expirado, para o domínio correto). (4) O cliente gera uma chave de sessão, criptografa-a com a chave pública do servidor e a envia. (5) O servidor descriptografa a chave de sessão com sua chave privada. (6) Ambos os lados agora possuem a chave de sessão e todos os dados subsequentes são enviados usando criptografia simétrica com ela. Dê os passos nesta ordem; as marcas são para o certificado, a chave pública, a chave de sessão e a mudança para criptografia simétrica.

    Explorar

    O handshake TLS

    Passe por cima do que acontece antes que um cadeado apareça. A criptografia de chave pública lenta é usada apenas para combinar uma chave compartilhada; a página real viaja sob criptografia simétrica rápida.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    TLS/ˌtiː el ˈes/ 传输层安全 chuán shū céng ān quán
    authentication/ɔːˌθentɪˈkeɪʃn/ 身份验证 shēn fèn yàn zhèng
    authenticates/ɔːˈθentɪkeɪts/ 认证 rèn zhèng
    handshake/ˈhændʃeɪk/ 握手 wò shǒu
    17.1

    Certificados digitais

    Um certificado digital (数字证书) vincula uma identidade (um domínio, uma organização) a uma chave pública, e é assinado por uma Autoridade Certificadora (CA) confiável (证书颁发机构). Contém o sujeito (quem ele identifica), a chave pública do sujeito, o emissor (a CA), um período de validade e a assinatura da CA sobre tudo isso.

    Um usuário envia uma solicitação com sua identidade e chave pública a uma Autoridade Certificadora, que verifica a identidade e emite um certificado digital assinado contendo a chave pública, identificação da CA, ID do usuário, assinatura digital e outras informações
    Uma Autoridade Certificadora emite um certificado digital vinculando uma identidade a uma chave pública

    Para verificar um, o cliente (que possui uma lista de CAs raiz confiáveis):

    1. verifica as datas de expiração.
    2. verifica se o nome do sujeito corresponde à URL.
    3. verifica se é assinado por uma CA confiável, usando a chave pública da CA para verificar a assinatura.
    4. segue a cadeia de certificados até uma raiz confiável.

    Se algo falhar, o navegador mostra o aviso "Sua conexão não é privada". Quando verifica limpidamente, o cliente sabe que a identidade foi verificada por uma CA confiável, que a chave pública realmente pertence àquela identidade e que o certificado está atual.

    "Descreva o que significa um certificado digital" (duas marcas). Um documento eletrônico, emitido por uma Autoridade Certificadora, que verifica a identidade de seu proprietário (uma pessoa, organização ou site) e contém a chave pública do proprietário. Itens encontrados em um: o número de série; o nome do proprietário (sujeito) e, para um site, seu domínio; a chave pública do proprietário; o nome da CA emissora; o período de validade (datas); o algoritmo de assinatura usado; e a assinatura digital da CA de todo o certificado.

    "Explique como uma organização adquire um certificado digital" (quatro marcas). (1) A organização gera seu próprio par de chaves, uma chave pública e uma chave privada. (2) Ela envia uma solicitação contendo sua chave pública e seus detalhes de identidade a uma Autoridade Certificadora. (3) A CA verifica a identidade (confirma que o solicitante realmente é a organização ou possui o domínio). (4) A CA cria o certificado contendo a chave pública e a identidade, assina-o com sua própria chave privada e o devolve. (5) A organização instala o certificado em seu servidor para que possa ser enviado aos clientes. A chave privada nunca sai da organização.

    "Explique por que um certificado digital é necessário para validar uma assinatura digital." Para verificar uma assinatura, o receptor precisa da chave pública do remetente e precisa ter certeza de que a chave realmente pertence ao remetente declarado; o certificado fornece a chave pública junto com a identidade, e como o certificado é assinado por uma CA confiável, o receptor pode confiar nesse vínculo. Sem isso, um impostor poderia publicar uma chave pública em nome de alguém e assinar mensagens em seu nome. O mesmo raciocínio responde "o que deve ser incluído com um programa baixado da internet para provar que é genuíno": uma assinatura digital, verificada contra o certificado do publicador.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    digital certificate/ˈdɪdʒɪtl səˈtɪfɪkət/ 数字证书 shù zì zhèng shū
    Certificate Authority/səˈtɪfɪkət əˈθɒrɪti/ 证书颁发机构 zhèng shū bān fā jī gòu
    man-in-the-middle/mæn ɪnðə ˈmɪdl/ 中间人攻击 zhōng jiān rén gōng jī
    17.1

    Assinaturas digitais

    Uma assinatura digital (数字签名) prova quem assinou uma mensagem e que ela não foi alterada. Para assinar:

    1. calcular um hash criptográfico da mensagem.
    2. criptografar o hash com a chave privada do remetente — essa é a assinatura.
    3. enviar a mensagem e a assinatura.

    Para verificar: calcular o hash da mensagem recebida; descriptografar a assinatura com a chave pública do remetente para obter o hash do remetente; comparar. Se coincidirem, a mensagem foi assinada pelo titular da chave privada (autenticação 身份验证) e não foi alterada (integridade). Uma assinatura não oculta a mensagem — para confidencialidade além disso, criptografar e assinar.

    O remetente calcula o hash da mensagem para um resumo e o criptografa com sua chave privada para formar a assinatura; o receptor recalcula o hash da mensagem e descriptografa a assinatura com a chave pública do remetente, então compara os dois resumos *Assinar calcula o hash da mensagem e criptografa o resumo com a chave privada; o receptor verifica com a chave pública

    "Explique o papel de um certificado digital na criação de uma assinatura digital" (três marcas). O certificado do remetente foi emitido por uma CA e contém a chave pública do remetente junto com a identidade do remetente; o remetente produz a assinatura hashando a mensagem e criptografando o hash com sua chave privada, o parceiro da chave no certificado; o receptor usa a chave pública do certificado para descriptografar o hash e, porque o certificado vincula essa chave ao remetente, a assinatura prova quem assinou.

    "Explique como uma assinatura digital é usada para verificar uma mensagem" (quatro marcas). (1) O receptor descriptografa a assinatura com a chave pública do remetente (retirada do certificado do remetente), o que resulta no hash que o remetente calculou. (2) O receptor calcula o hash da mensagem recebida com o mesmo algoritmo de hash. (3) Os dois hashes são comparados. (4) Se eles coincidirem, a mensagem veio do titular da chave privada (autêntica) e não foi alterada desde que foi assinada (integridade); se diferirem, a mensagem é rejeitada. Um banqueiro recebendo dados confidenciais com uma assinatura faz exatamente isso antes de confiá-los; os próprios dados podem ser separadamente criptografados com a chave pública do banqueiro para confidencialidade.

    Juntando tudo

    Uma solicitação segura a https://www.bank.com: o servidor envia seu certificado; o cliente o verifica contra CAs confiáveis; o cliente usa a chave pública do servidor para trocar uma chave de sessão; então os dados fluem criptografados com essa chave. A criptografia impede espiões, o certificado prova a identidade do servidor e as verificações de integridade impedem um atacante intermediário (中间人攻击) alterando os dados.

    Exemplo resolvido. Alice envia a Bob um contrato. Ela quer que Bob tenha certeza de que veio dela e não foi alterado, e ela quer que ninguém mais possa lê-lo. Quais chaves ela usa e em qual direção? São dois trabalhos diferentes que exigem dois pares de chaves diferentes. Para a assinatura (autenticação e integridade): Alice cria o hash do contrato e criptografa esse hash com sua própria chave privada; Bob descriptografa com a chave pública de Alice e compara contra seu próprio hash da mensagem. Apenas Alice detém sua chave privada, então apenas ela poderia ter produzido isso. Para confidencialidade: Alice criptografa o contrato em si com a chave pública de Bob, para que apenas a chave privada de Bob possa abri-la. Uma regra mantém os quatro claros: você assina com sua própria chave privada e criptografa com a chave pública do destinatário. Uma assinatura por si só não esconde a mensagem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    digital signature/ˈdɪdʒɪtl ˈsɪɡnɪtʃə/ 数字签名 shù zì qiān míng
    17.1

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    criptografia converter texto simples em texto cifrado usando um algoritmo e uma chave para que não possa ser compreendido se interceptado
    texto simples / texto cifrado os dados legíveis originais / a forma criptografada e ilegível deles
    criptografia de chave simétrica a mesma chave secreta é usada para criptografar e descriptografar, portanto deve ser compartilhada com segurança por ambas as partes
    criptografia de chave assimétrica um par de chaves relacionadas é usado: a chave pública criptografa e apenas a chave privada correspondente descriptografa
    chave pública uma chave disponibilizada a qualquer pessoa, usada para criptografar mensagens para seu proprietário e verificar as assinaturas do proprietário
    chave privada uma chave conhecida apenas por seu proprietário, usada para descriptografar mensagens criptografadas com a chave pública e assinar
    SSL/TLS protocolos que fornecem comunicação segura (criptografada, autenticada, verificada quanto à integridade) entre um cliente e um servidor
    certificado digital um documento eletrônico emitido por uma Autoridade Certificadora que verifica a identidade do proprietário e contém sua chave pública
    assinatura digital um hash de uma mensagem criptografado com a chave privada do remetente, provando quem o enviou e que ele não foi alterado
    Autoridade Certificadora uma organização confiável que verifica identidades e emite e assina certificados digitais
    criptografia quântica o uso de estados quânticos de fótons para distribuir chaves de modo que qualquer interceptação seja detectada
    17.1

    Dicas de prova

    • Simétrica: uma única chave secreta compartilhada, rápida, troca de chaves é a fraqueza. Assimétrica: chave pública para criptografar, chave privada para descriptografar, lenta, sem problema de troca. Duas diferenças, duas desvantagens, duas razões: o exame pede esses pontos em pares.
    • Confidencialidade usa as chaves do receptor (pública para travar, privada para destravar); uma assinatura usa as chaves do remetente (privada para assinar, pública para verificar). Diga sempre a quem pertence cada chave.
    • A inicialização do TLS tem seis etapas: solicitação, certificado com chave pública, verificação, chave de sessão criptografada com a chave pública, descriptografada com a chave privada, criptografia simétrica a partir daí.
    • Um certificado é identidade mais chave pública, assinado por uma CA; aquisição é par de chaves, solicitação, verificação, assinatura, instalação. É necessário para validar uma assinatura porque prova a quem pertence a chave pública.
    • Uma assinatura é um hash criptografado com a chave privada; verificação é descriptografar, recalcular o hash, comparar. Integridade e autenticidade são as duas coisas que ela prova.
    • Criptografia quântica distribui chaves e detecta espionagem; seus limites são custo, distância e novidade.

    Erros comuns

    • Dizer que uma mensagem está criptografada com a chave pública do remetente; a chave pública do receptor criptografa, a chave privada do receptor descriptografa.
    • Descrever uma assinatura como "criptografando a mensagem com a chave privada" em vez de criptografar seu hash.
    • Afirmar que um certificado contém a chave privada; ele contém a chave pública e a identidade, assinado pela CA.
    • Listar "o servidor envia sua chave privada" no handshake do TLS; apenas a chave pública viaja, dentro do certificado.
    • Dar "SSL/TLS torna a conexão mais rápida" como uma função; suas funções são criptografia, autenticação e integridade.
    • Confundir hash com criptografia: um hash não pode ser revertido e não possui chave; criptografia é reversível com a chave.
    • Responder "por que um certificado é necessário para uma assinatura" com "para criptografá-lo"; é necessário para confiar na chave pública.
  • 18

    Inteligência Artificial (IA)

    Assistir aula
    18.1

    O que é IA

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de como grafos podem ser usados para auxiliar a Inteligência Artificial (IA) Propósito e estrutura de um grafo. Usar o algoritmo A* e o algoritmo de Dijkstra para realizar buscas em um grafo. Os candidatos não serão exigidos a escrever algoritmos para configurar, acessar ou realizar buscas em grafos
    Demonstrar compreensão de como as redes neurais artificiais ajudaram no aprendizado de máquina
    Demonstrar compreensão de Deep Learning, Machine Learning e Reinforcement Learning e as razões para usar esses métodos. Compreender categorias de machine learning, incluindo aprendizado supervisionado, aprendizado não supervisionado
    Demonstrar compreensão de propagação reversa de erros e métodos de regressão no machine learning

    Fonte: Programa Cambridge International

    Inteligência artificial 人工智能 (AI) constrói sistemas que realizam tarefas normalmente necessárias inteligência humana — reconhecer fala e imagens, traduzir, jogar jogos, dirigir, gerar texto. A maioria das IAs modernas usa aprendizado de máquina 机器学习 — algoritmos que aprendem padrões nos dados em vez de serem programados passo a passo. Dentro dele, aprendizado profundo 深度学习, usando redes neurais 神经网络 com muitas camadas, tem sido dominante desde a década de 2010.

    Um robô humanoide 人形机器人 coloca muitas dessas habilidades em um único corpo: usa IA para ver rostos, entender fala e mover seu rosto e braços de forma realista.

    Um robô humanoide cinza com rosto realista olhando para cima, pescoço mecânico, peito e braços expostos, sobre fundo branco
    Um robô humanoide usa IA para ver, ouvir e responder como uma pessoa
    Três caixas arredondadas aninhadas: Inteligência Artificial contém Aprendizado de Máquina, que contém Aprendizado Profundo, cada um com uma nota curta
    Aprendizado profundo é parte do aprendizado de máquina, que é parte da IA
    Explorar

    Laboratório de tipos de aprendizado de IA

    Classifique exemplos de IA pelo tipo de aprendizado ou preocupação envolvida.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    humanoid robot/ˈhjuːmənɔɪd ˈrəʊbɒt/ 人形机器人 rén xíng jī qì rén
    18.1

    Grafos na IA

    Muitos problemas de IA residem em um grafo 图 — nós 节点 (estados, lugares) unidos por arestas 边 (movimentos, relações).

    • busca de caminho: estradas formam um grafo; a rota mais curta é uma busca em grafo (algoritmo de Dijkstra, algoritmo A*).
    • jogos: cada posição do tabuleiro é um nó, cada movimento uma aresta; minimax 极小化极大 com poda alfa-beta busca a árvore de jogo.
    • busca no espaço de estados: um problema de planejamento é mover entre estados aplicando operadores para atingir um objetivo.
    • representação de conhecimento: uma rede semântica 语义网络 tem conceitos como nós e relações como arestas ("cachorro É-UM animal"); um grafo de conhecimento 知识图谱 armazena fatos sobre o mundo para motores de busca e assistentes.
    Um grafo ponderado dos nós A a G; o caminho mais curto de A para G via B e E está destacado em laranja
    Problemas de IA frequentemente residem em grafos; aqui o caminho mais curto está destacado

    Ferramentas padrão para navegar em grafos incluem busca em largura 广度优先搜索 e busca em profundidade 深度优先搜索.

    "Descreva o propósito e a estrutura de um grafo em um sistema de IA. Propósito: representar um problema como um conjunto de estados (ou lugares) e os possíveis movimentos entre eles, para que um algoritmo possa buscá-lo por uma solução, como a rota mais curta ou mais barata, ou o melhor próximo movimento. Estrutura: um conjunto de nós (vértices), cada um representando um estado, localização ou item, unidos por arestas representando as conexões entre eles; cada aresta pode carregar um peso (um custo, distância ou tempo), e as arestas podem ser dirigidas (ida única) ou não dirigidas. "Explique o uso de grafos para auxiliar a IA:" o grafo é o modelo no qual os algoritmos de busca da IA operam: A* e o algoritmo de Dijkstra encontram caminhos ótimos através dele (navegação, roteamento), posições de jogos formam uma árvore buscada pelo melhor movimento, e conhecimento armazenado como grafo permite que um sistema raciocine sobre como os fatos estão relacionados.

    Um grafo ponderado de seis nós de H a G com distâncias nas arestas e uma estimativa de heurística para o objetivo escrita em vermelho em cada nó, usado nos exemplos resolvidos de Dijkstra e A-star O grafo usado abaixo: os números das arestas são distâncias reais; os números vermelhos são a estimativa de heurística 启发式 de cada nó de quão longe o objetivo ainda está, o que apenas o A usa*

    Algoritmo de Dijkstra. Ele encontra a menor distância do início até cada nó. Mantenha uma tabela da melhor distância encontrada até agora para cada nó (início 0, todos os outros infinito). Repita: pegue o nó não visitado com a menor distância, marque-o como visitado e, para cada vizinho, verifique se ir por este nó oferece uma distância menor; se sim, atualize-a e registre de onde veio. Pare quando todos os nós forem visitados (ou o alvo for atingido).

    Exemplo resolvido. Encontre as menores distâncias de H até todos os outros nós no grafo acima.

    etapa visitar H A B C D G
    início 0 ∞ ∞ ∞ ∞ ∞
    1 H (0) 0 4 (H) 3 (H) ∞ ∞ ∞
    2 B (3) 0 4 (H) 3 ∞ 9 (B) ∞
    3 A (4) 0 4 3 9 (A) 8 (A) ∞
    4 D (8) 0 4 3 9 (A) 8 10 (D)
    5 C (9) 0 4 3 9 8 10 (D)
    6 G (10)

    Menores distâncias: A 4, B 3, D 8, C 9, G 10, e o caminho para G é H–A–D–G (leia as etiquetas "veio de" de trás para frente). Na etapa 3, A oferece a D uma distância de $4 + 4 = 8$, melhor que as 9 encontradas através de B, então D é atualizada; na etapa 5, C poderia chegar a G em $9 + 3 = 12$, pior que 10, então nada muda. Mostrar essas comparações é o "trabalho" que a questão pede.

    O algoritmo A*. Dijkstra explora em todas as direções. A* adiciona uma heurística $h$, uma estimativa da distância restante, e sempre expande o nó com a menor $f = g + h$, onde $g$ é a distância percorrida até agora. Com uma heurística sensata (nunca superestimando), ele encontra o mesmo caminho mais curto enquanto examina muito menos nós, que é por que satnavs e jogos o usam. O exame fornece $h$ para cada nó e uma tabela para preencher.

    Exemplo resolvido. Encontre um caminho de H para G com A*, mostrando o trabalho.

    nó expandido $g$ até agora $h$ $f = g + h$ vizinhos adicionados (nó: $g$, $h$, $f$)
    H 0 7 7 A: 4, 5, 9; B: 3, 6, 9
    B (empate com A; qualquer um) 3 6 9 D via B: 9, 2, 11
    A 4 5 9 C: 9, 3, 12; D via A: 8, 2, 10 (melhor que 11, mantenha)
    D 8 2 10 G: 10, 0, 10; C via D: 9 (sem melhoria)
    G 10 0 10 objetivo alcançado

    Caminho H–A–D–G, comprimento 10, o mesmo que Dijkstra, mas C nunca foi expandido. Cada vez que um nó é alcançado por uma segunda rota, mantenha a menor $g$; a busca termina quando o objetivo é o nó com a menor $f$. Declare os valores $g$, $h$ e $f$ em todas as linhas: essas são as notas.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    graph/ɡræf/ 图 tú
    nodes/nəʊdz/ 节点 jié diǎn
    edges/ˈedʒɪz/ 边 biān
    minimax/ˈmɪnɪmæks/ 极小化极大 jí xiǎo huà jí dà
    semantic network/səˈmæntɪk ˈnetwɜːk/ 语义网络 yǔ yì wǎng luò
    knowledge graph/ˈnɒlɪdʒ ɡræf/ 知识图谱 zhī shí tú pǔ
    breadth-first search/bredθ fɜːst sɜːtʃ/ 广度优先搜索 guǎng dù yōu xiān sōu suǒ
    depth-first search/depθ fɜːst sɜːtʃ/ 深度优先搜索 shēn dù yōu xiān sōu suǒ
    weight/weɪt/ 权重 quán zhòng
    heuristic/hjuːˈrɪstɪk/ 启发式 qǐ fā shì
    labels/ˈleɪblz/ 标签 biāo qiān
    18.1

    Redes neurais artificiais (ANNs)

    Uma ANN é inspirada pelos neurônios do cérebro. Um neurônio artificial 人工神经元:

    • recebe vários valores de entrada, multiplica cada um por um peso 权重, e soma-os com um termo de bias 偏置项.
    • aplica uma função de ativação 激活函数 (uma função não linear como ReLU) à soma.
    • sai o resultado, que alimenta neurônios mais adiante.
    Um único neurônio artificial: três entradas multiplicadas por um peso, somadas com um viés, passadas por uma função de ativação, resultando em um valor de saída
    Um único neurônio: cada entrada vezes seu peso, somado com um viés, seguido por uma função de ativação

    Neurônios estão organizados em camadas: uma camada de entrada, uma ou mais camadas ocultas 隐藏层 (onde padrões internos úteis são aprendidos), e uma camada de saída. Com muitas camadas ocultas, trata-se de uma rede neural profunda 深度神经网络, e o treinamento dela é aprendizado profundo.

    Círculos em quatro colunas: uma camada de entrada de três nós, duas camadas ocultas de cinco nós cada e um nó de saída, todos conectados
    Uma rede neural com uma camada de entrada, duas camadas ocultas e uma camada de saída

    ANNs permitem que modelos aprendam padrões complexos diretamente de dados brutos (pixels, áudio, texto) sem recursos projetados manualmente — impulsionando avanços em reconhecimento de imagens 图像识别, reconhecimento de fala 语音识别, tradução automática 机器翻译 e jogos. Funcionam bem com grandes quantidades de dados, entrada ruidosa ou muito complexa, e padrões difíceis de capturar com regras explícitas.

    "Explique o que se entende por rede neural artificial." Um modelo da rede de neurônios do cérebro, composto por camadas de nós conectados: uma camada de entrada, uma ou mais camadas ocultas e uma camada de saída. Cada conexão tem um peso; cada nó soma suas entradas ponderadas e passa o resultado através de uma função de ativação para a próxima camada. "Explique como ANNs possibilitam o aprendizado de máquina" (três pontos): a rede é treinada em muitos exemplos; para cada exemplo, a saída é comparada com o resultado esperado e o erro é usado para ajustar os pesos (propagação reversa) de modo que o erro diminua; após enough exemplos, os pesos codificam os padrões nos dados, e a rede pode então classificar ou prever para novos dados que nunca viu. "Informe o motivo para múltiplas camadas ocultas": cada camada adicional combina os recursos encontrados pela camada anterior em recursos mais complexos e abstratos, permitindo que a rede aprenda relações mais complexas (bordas, depois formas, depois objetos); isso é o que torna uma rede profunda.

    Explorar

    Toque nas partes de uma rede neural

    Explore as camadas. Os dados fluem da esquerda para a direita: a camada de entrada pega os recursos, as camadas ocultas aprendem padrões e a camada de saída dá a resposta — com cada conexão carregando um peso que o treinamento ajusta.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    artificial neuron/ˌɑːtɪˈfɪʃl ˈnjuːrɒn/ 人工神经元 rén gōng shén jīng yuán
    bias term/ˈbaɪəs tɜːm/ 偏置项 piān zhì xiàng
    activation function/ˌæktɪˈveɪʃn ˈfʌŋkʃn/ 激活函数 jī huó hán shù
    hidden layers/ˈhɪdn ˈleɪəz/ 隐藏层 yǐn cáng céng
    deep neural network/diːp ˈnjuːrəl ˈnetwɜːk/ 深度神经网络 shēn dù shén jīng wǎng luò
    image recognition/ˈɪmɪdʒ ˌrekəɡˈnɪʃn/ 图像识别 tú xiàng shí bié
    speech recognition/spiːtʃ ˌrekəɡˈnɪʃn/ 语音识别 yǔ yīn shí bié
    machine translation/məˈʃiːn trænˈsleɪʃn/ 机器翻译 jī qì fān yì
    18.1

    Aprendizado de máquina, aprendizado profundo, aprendizado por reforço

    Aprendizado de máquina

    O termo guarda-chuva — qualquer algoritmo que aprende a partir de dados. Três paradigmas:

    • aprendizado supervisionado 监督学习 — os dados têm rótulos 标签 (imagens marcadas "gato"/"cachorro"); o algoritmo aprende entrada → rótulo. Usado para classificação 分类 (uma categoria) e regressão.
    • aprendizado não supervisionado 无监督学习 — sem rótulos; o algoritmo encontra estrutura, ex.: um agrupamento 聚类 de clientes semelhantes.
    • aprendizado por reforço (abaixo).

    Use ML quando regras explícitas seriam impraticáveis (filtros de spam, recomendações, detecção de fraudes).

    Dois gráficos de dispersão: no aprendizado supervisionado cada ponto de treino está rotulado como gato ou cachorro e o modelo aprende uma fronteira entre eles; no aprendizado não supervisionado os pontos não estão rotulados e o modelo descobre dois agrupamentos sozinho
    Os mesmos dados vistos de duas formas: com rótulos, a tarefa é aprender o que separa as classes; sem rótulos, a tarefa é descobrir que existem grupos

    "Descreva o aprendizado supervisionado e não supervisionado" (palavras marcadas). Aprendizado supervisionado: o algoritmo é treinado com dados de treinamento rotulados 训练数据, cada exemplo pareado com a saída correta (alvo); ele aprende a relação entre entradas e saídas e usa isso para classificar ou prever novas entradas; as respostas são conhecidas durante o treinamento, então o erro pode ser medido. Aprendizado não supervisionado: os dados estão sem rótulos, sem respostas corretas fornecidas; o algoritmo busca padrões, estrutura ou agrupamentos nos dados por si só (agrupar itens similares, encontrar associações); a saída é um conjunto de categorias ou relações que não foram definidas antecipadamente. Como diferem: dados rotulados contra não rotulados; saídas conhecidas contra estrutura descoberta; supervised é usado para prever (classificação, regressão), unsupervised para explorar (agrupamento, detecção de anomalias). Ambos são categorias de machine learning; o terceiro é reinforcement learning.

    Um pipeline: dados de treinamento rotulados treinam um modelo, o modelo treinado classifica novos dados não rotulados e exibe quantos de cada tipo foram encontrados
    Aprendizado supervisionado: um modelo é treinado com dados rotulados, depois reconhece novos dados

    Aprendizado profundo

    Um subconjunto de ML usando redes neurais profundas. Camadas inferiores aprendem padrões simples (bordas, fonemas), camadas superiores combinam-nos em conceitos abstratos. Precisa de muitos dados e muita computação (GPUs); para pequenos conjuntos de dados, métodos de ML mais simples frequentemente funcionam melhor.

    "Explique o que se entende por aprendizado profundo" (três pontos). Machine learning que usa redes neurais artificiais com muitas camadas ocultas (redes profundas); a rede é treinada em quantidades muito grandes de dados, e cada camada extrai características da saída da camada abaixo, de modo que a rede aprende as características necessárias por si só, em vez de serem especificadas pelo programador. Motivos para usá-lo: pode resolver problemas muito complexos para regras escritas à mão ou modelos rasos (reconhecer rostos, entender fala, traduzir texto); melhora conforme há mais dados disponíveis; elimina a necessidade de engenharia de recursos humana; e pode lidar com dados não estruturados como imagens, som e texto. Como é feito mais eficaz: mais (e melhor rotulados) dados de treinamento; mais camadas ou nós, dentro dos limites de overfitting; mais poder de processamento (GPUs) e tempo de treinamento; ajuste da taxa de aprendizagem e outros parâmetros. Exemplos: reconhecimento de fala em assistentes de voz, reconhecimento de imagens em exames médicos e carros autônomos, tradução automática, sistemas de recomendação.

    Aprendizado por reforço

    Em aprendizado por reforço 强化学习, um agente 智能体 age em um ambiente; cada ação muda o estado e retorna uma recompensa 奖励. O agente aprende uma política 策略 (uma estratégia) que maximiza a recompensa total ao longo do tempo, por tentativa e erro sem rótulos prévios. Usado para problemas de decisão sequencial — jogos, controle robótico, direção autônoma.

    "Explique o que se entende por aprendizado por reforço" (três pontos). Um agente aprende interagindo com seu ambiente: ele toma uma ação, o ambiente muda para um novo estado e retorna uma recompensa (ou penalidade), e o agente ajusta seu comportamento para maximizar a recompensa total ao longo do tempo. Não há dados rotulados: o agente aprende por tentativa e erro, descobrindo quais ações são boas pelas recompensas coletadas, e gradualmente forma uma política que diz o que fazer em cada estado. Usado onde a resposta certa não é conhecida antecipadamente, mas o resultado de uma ação pode ser pontuado: jogos (xadrez, Go), controle robótico, sinalização de trânsito, alocação de recursos. Um computador jogando um jogo de tabuleiro contra um usuário aprende dessa forma, ou busca na árvore de jogos com minimax para escolher o movimento cujo pior resultado seja o melhor.

    Um loop entre duas caixas: o agente envia uma ação ao ambiente, que retorna um novo estado e uma recompensa de volta ao agente
    Aprendizado por reforço: o agente age, o ambiente retorna um novo estado e uma recompensa, e o agente aprende com isso

    Um carro autônomo 自动驾驶汽车 é um exemplo real. Sensores Lidar 激光雷达 e câmeras (a unidade giratória no teto) constroem uma imagem viva da estrada, e uma política aprendida decide como virar, acelerar e frear com segurança.

    Um carro autônomo branco Waymo em uma rua de cidade, com uma unidade de sensor Lidar giratória no teto e câmeras extras nos cantos dianteiros
    Um carro autônomo usa câmeras e sensores Lidar para ver a estrada ao seu redor
    Vários braços robóticos industriais laranja soldando a carroceria de um carro enquanto se move ao longo de uma linha de produção industrial
    Braços robóticos industriais em uma linha de produção: aprendizado por reforço pode ensinar um robô a controlar seus movimentos
    Vocabulário Treinar
    Inglês Chinês Pinyin
    artificial intelligence/ˌɑːtɪˈfɪʃl ɪnˈtelɪdʒəns/ 人工智能 rén gōng zhì néng
    machine learning/məˈʃiːn ˈlɜːnɪŋ/ 机器学习 jī qì xué xí
    reinforcement learning/ˌriːɪnˈfɔːsmənt ˈlɜːnɪŋ/ 强化学习 qiáng huà xué xí
    supervised learning/ˈsuːpəvaɪzd ˈlɜːnɪŋ/ 监督学习 jiān dū xué xí
    classification/ˌklæsɪfɪˈkeɪʃn/ 分类 fēn lèi
    self-driving car/self ˈdraɪvɪŋ kɑː/ 自动驾驶汽车 zì dòng jià shǐ qì chē
    agent/ˈeɪdʒənt/ 智能体 zhì néng tǐ
    reward/rɪˈwɔːd/ 奖励 jiǎng lì
    policy/ˈpɒlɪsi/ 策略 cè lüè
    lidar/ˈlaɪdɑː/ 激光雷达 jī guāng léi dá
    18.1

    Treinando uma ANN: backpropagation

    O treinamento ajusta os pesos para que as saídas correspondam aos alvos. O método padrão é backpropagation 反向传播 (propagação reversa de erros) com descida de gradiente 梯度下降. Para cada exemplo de treinamento:

    1. passagem direta — alimente a entrada até a saída.
    2. calcule o erro com uma função de perda 损失函数 (um número único sobre o quão errada é a saída).
    3. passagem reversa — propague o erro para trás, encontrando o gradiente de cada peso (quanto contribuiu para o erro) usando a regra da cadeia.
    4. atualize os pesos com um pequeno passo (definido pela taxa de aprendizagem 学习率) que reduza o erro.

    Repita sobre muitos exemplos e muitas passagens (épocas 训练轮次) até que o erro deixe de diminuir. O nome "back" vem do passo 3: o erro flui da saída de volta em direção à entrada, assim o gradiente de cada peso é encontrado em uma varredura. Após o treinamento, uma nova entrada precisa apenas de uma passagem direta para obter uma previsão.

    "Descreva o método de propagação reversa de erros" (quatro pontos). (1) Uma entrada é enviada para frente através da rede e sua saída é comparada com a saída esperada (alvo); (2) a diferença é o erro; (3) o erro é passado para trás através da rede, camada por camada da saída para a entrada, e a parte do erro atribuída a cada peso é calculada; (4) os pesos são ajustados em proporção à sua contribuição, na direção que reduz o erro; (5) o processo é repetido com muitos exemplos até que o erro seja tão pequeno quanto necessário. O ponto do método é que uma rede com camadas ocultas não tem maneira direta de saber qual peso interno causou um erro de saída; a propagação reversa atribui a culpa.

    Uma curva em forma de U de erro quadrático contra peso, com passos descendo em direção ao erro mínimo
    O treinamento ajusta os pesos para alcançar o erro mínimo
    Vocabulário Treinar
    Inglês Chinês Pinyin
    backpropagation/ˌbækprəpəˈɡeɪʃn/ 反向传播 fǎn xiàng chuán bō
    gradient descent/ˈɡreɪdɪənt dɪˈsent/ 梯度下降 tī dù xià jiàng
    loss function/lɒs ˈfʌŋkʃn/ 损失函数 sǔn shī hán shù
    epochs/ˈiːpɒks/ 训练轮次 xùn liàn lún cì
    18.1

    Regressão

    Alguns tasks preveem um número (preço de uma casa, temperatura de amanhã) — regressão 回归, ao contrário de classificação (uma categoria).

    Regressão linear 线性 regression ajusta uma linha reta (ou hiperplano):

    $$y = m_{1} x_{1} + m_{2} x_{2} + \ldots + m_{n} x_{n} + c.$$

    Escolha os coeficientes para minimizar a soma dos erros quadrados em relação aos dados de treinamento. Use-o quando a relação parecer aproximadamente linear e você quiser um modelo interpretável. Para dados curvos, use métodos de regressão polinomial, árvore de decisão ou rede neural — mesma ideia: defina um modelo, defina uma função de perda e ajuste os parâmetros para minimizá-la. Regressão e classificação são ambas supervisionadas; a escolha depende se a resposta é um número ou uma categoria.

    "Descreva métodos de regressão em aprendizado de máquina" (duas marcas). Métodos estatísticos que encontram a relação entre variáveis de entrada e uma saída contínua, ajustando uma função (uma linha ou curva) aos dados de treinamento com o menor erro total; a função ajustada é então usada para prever a saída para novos inputs. A regressão linear ajusta uma linha reta; outros métodos ajustam curvas. A regressão prediz um valor (um preço, uma temperatura, um tempo); a classificação prediz uma categoria, que é a distinção que o exame pede.

    Um gráfico de dispersão de pontos com uma linha de melhor ajuste reta através deles; linhas tracejadas verticais mostram o erro entre cada ponto e a linha
    A regressão linear ajusta a linha que torna o erro quadrado total (os espaços tracejados) o menor possível
    Explorar

    Ajustando uma linha de regressão

    Arraste os controles. A regressão linear desenha a linha reta que minimiza as distâncias quadráticas aos pontos de dados — então ela prediz um número para qualquer nova entrada.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    regression/rɪˈɡreʃn/ 回归 huí guī
    unsupervised learning/ʌnˈsuːpəvaɪzd ˈlɜːnɪŋ/ 无监督学习 wú jiān dū xué xí
    cluster/ˈklʌstə/ 聚类 jù lèi
    training data/ˈtreɪnɪŋ ˈdeɪtə/ 训练数据 xùn liàn shù jù
    learning rate/ˈlɜːnɪŋ reɪt/ 学习率 xué xí lǜ
    linear regression/ˈlɪnɪə rɪˈɡreʃn/ 线性回归 xiàn xìng huí guī
    optical character recognition/ˈɒptɪkl ˈkærɪktə ˌrekəɡˈnɪʃn/ 光学字符识别 guāng xué zì fú shí bié
    text-to-speech/tekst tə spiːtʃ/ 文本转语音 wén běn zhuǎn yǔ yīn
    18.1

    Como a IA é usada em um cenário real

    Muitos cenários de exames usam o mesmo padrão — um modelo de deep learning treinado em dados rotulados, muitas vezes vários combinados em um pipeline:

    • identificação de clientes em uma loja automatizada: o sistema é treinado com imagens de rostos rotuladas; uma câmera captura um rosto; o reconhecimento de imagem extrai uma representação; ela é comparada com clientes registrados; a correspondência mais próxima identifica a pessoa.
    • leitura de texto em imagens: o reconhecimento de imagem encontra regiões de texto; reconhecimento óptico de caracteres 光学字符识别 extrai os caracteres; tradução por máquina os converte; texto-para-fala 文本转语音 os lê em voz alta.
    • detecção de itens no caixa: IA de detecção de objetos, treinada em imagens de produtos rotuladas, vê quais itens entram na cesta e cobra a conta.

    No momento em que um usuário interage com o sistema, o modelo é rápido — ele faz apenas inferência de passagem direta; a inteligência está nos padrões aprendidos durante o treinamento.

    Respostas modelo para as perguntas de cenário. Uma câmera de estacionamento lê números de placa: a câmera captura uma imagem; uma IA treinada em muitos imagens rotuladas de placas localiza a placa na imagem; reconhecimento de caracteres (um classificador de deep learning, novamente treinado em caracteres rotulados) converte a placa em texto; o texto é armazenado com a hora e comparado quando o carro sai. Um sistema de CCTV detecta e rastreia uma pessoa: software de reconhecimento de imagem treinado em imagens rotuladas de pessoas identifica uma pessoa em cada quadro; o sistema compara quadros sucessivos para seguir seu movimento; movimento incomum pode acionar um alerta. Fala convertida em comandos: reconhecimento de fala treinado em muitas vozes gravadas converte o som em texto; o sistema compara o texto com um conjunto de comandos conhecidos; melhora à medida que é corrigido. Uma câmera que foca em rostos: um modelo de detecção de rosto treinado em rostos rotulados encontra a região do rosto, e a lente é ajustada para trazer essa região para foco. Login de reconhecimento facial de um banco: o app captura o rosto, uma rede profunda extrai seus recursos, e eles são comparados com os recursos armazenados daquele cliente. Em todos os casos, o padrão é: treinado em exemplos rotulados, extrai recursos, corresponde ou classifica nova entrada.

    Exemplo resolvido. Para cada tarefa, diga se precisa de regressão ou classificação, e como seria a camada de saída de uma ANN: (a) prever a temperatura de amanhã; (b) decidir se um e-mail é spam. Pergunte qual tipo de coisa está sendo previsto. (a) Uma temperatura é um número em uma escala contínua, então isso é regressão, e a camada de saída é um único neurônio segurando esse valor. (b) Spam ou não-spam é uma categoria, então isso é classificação, e a saída dá uma probabilidade por classe. Ambas são aprendizagem supervisionada: cada uma precisa de exemplos rotulados para treinar, e o treinamento ajusta os pesos por propagação reversa para reduzir o erro. A pergunta decisiva é simplesmente número-ou-categoria - não quão difícil a tarefa parece.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    deep learning/diːp ˈlɜːnɪŋ/ 深度学习 shēn dù xué xí
    neural networks/ˈnjuːrəl ˈnetwɜːks/ 神经网络 shén jīng wǎng luò
    18.1

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    grafo (em IA) um conjunto de nós representando estados ou locais, ligados por arestas representando conexões, frequentemente ponderadas, que um algoritmo de busca pode explorar
    Algoritmo de Dijkstra encontra a menor distância de um nó inicial para todos os outros nós visitando sempre o nó não visitado com a menor distância até agora
    Algoritmo A* uma busca de caminho mais curto que expande o nó com a menor soma da distância até agora mais uma estimativa heurística da distância ao objetivo
    rede neural artificial um modelo dos neurônios do cérebro: camadas de nós ligados por conexões ponderadas, treinadas ajustando os pesos
    aprendizado de máquina algoritmos que aprendem com dados e melhoram com a experiência em vez de seguir regras fixas
    aprendizado supervisionado aprendizado a partir de dados de treinamento rotulados nos quais a saída correta para cada entrada é conhecida
    aprendizado não supervisionado aprendizado a partir de dados sem rótulos encontrando padrões, agrupamentos ou estrutura neles
    aprendizado por reforço um agente aprende por tentativa e erro, escolhendo ações em um ambiente para maximizar as recompensas que recebe
    deep learning aprendizado de máquina usando redes neurais com muitas camadas ocultas, treinadas em grandes quantidades de dados, cada camada extraindo recursos da camada abaixo
    propagação reversa de erros comparar a saída da rede com o alvo, passar o erro de volta através das camadas e ajustar cada peso para reduzi-lo
    regressão ajustar uma função aos dados de treinamento para prever um valor de saída contínuo a partir de entradas
    18.1

    Dicas de prova

    • Respostas de grafos nomeiam nós, arestas e pesos, e o que representam; depois o algoritmo. Dijkstra: tabela de distâncias, visite o menor, atualize vizinhos. A*: $g$, $h$ e $f = g + h$ em cada linha, expanda o menor $f$.
    • Respostas de ANN nomeiam as camadas, as conexões ponderadas e o treinamento; deep learning adiciona muitas camadas ocultas, grandes quantidades de dados e extração automática de recursos, com uma razão e um exemplo.
    • As três categorias em uma linha cada: dados rotulados e saídas conhecidas; dados sem rótulos e estrutura descoberta; agente, ambiente, ações e recompensas.
    • Propagação reversa: compare com o alvo, erro para trás através das camadas, ajuste os pesos para reduzi-lo, repita. Regressão prediz um valor; classificação prediz uma categoria.
    • Perguntas de cenário querem o pipeline: treinado em exemplos rotulados, extrai recursos, reconhece ou classifica nova entrada; nomeie o tipo de IA (reconhecimento de imagem, reconhecimento de fala, deep learning).

    Erros comuns

    • Descrever um grafo como "um gráfico"; em IA são nós e arestas.
    • Executar Dijkstra escolhendo o vizinho mais próximo do nó atual em vez da menor distância geral não visitada; ou esquecer de atualizar um nó quando uma rota mais curta aparece.
    • Adicionar $h$ em $g$ para o próximo passo em A*; $g$ é apenas a distância real, $h$ é recomputado a partir da tabela.
    • Dizer que deep learning é "aprender muito"; são as muitas camadas ocultas.
    • Confundir aprendizado não supervisionado com aprendizado por reforço; o primeiro encontra estrutura em dados, o segundo aprende com recompensas.
    • Descrever propagação reversa sem a comparação com a saída esperada ou sem dizer que os pesos são ajustados.
    • Chamar uma previsão de preço de "classificação"; um valor contínuo é regressão.
  • 19

    Pensamento computacional e resolução de problemas

    Assistir aula
    19.1

    Algoritmos de busca

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão dos métodos de busca linear e busca binária Escrever um algoritmo para implementar uma busca linear. Escrever um algoritmo para implementar uma busca binária. As condições necessárias para o uso de uma busca binária. Como o desempenho de uma busca binária varia conforme o número de itens de dados
    Demonstrar compreensão dos métodos de inserção sort e bubble sort Escrever um algoritmo para implementar um insertion sort. Escrever um algoritmo para implementar um bubble sort. O desempenho de uma rotina de ordenação pode depender da ordem inicial dos dados e do número de itens de dados
    Demonstrar compreensão e uso de Tipos de Dados Abstratos (ADT) Escrever algoritmos para encontrar um item em cada um dos seguintes: linked list, binary tree. Escrever algoritmos para inserir um item em cada um dos seguintes: pilha, fila, linked list, binary tree. Escrever algoritmos para excluir um item de cada um dos seguintes: pilha, fila, linked list. Demonstrar compreensão de que um grafo é um exemplo de ADT. Descrever as características principais de um grafo e justificar seu uso para uma situação dada. Os candidatos não serão exigidos a escrever código para uma estrutura de grafo
    Demonstrar como é possível implementar ADTs a partir de outro ADT Descrever os seguintes ADTs e demonstrar como podem ser implementados a partir de tipos embutidos adequados ou outros ADTs: pilha, fila, linked list, dictionary, binary tree
    Demonstrar compreensão de que diferentes algoritmos que realizam a mesma tarefa podem ser comparados usando critérios (por exemplo, tempo necessário para completar a tarefa e memória usada) Incluindo o uso da notação Big O para especificar complexidade de tempo e espaço

    Fonte: Programa Cambridge International

    Big O: como os algoritmos escalam
    Insertion sort: deslize cada cartão para o lugar
    Ordenação bolha, passo a passo
    Busca binária: divida pela metade e conquiste

    Uma busca encontra um valor-alvo em uma coleção (geralmente uma array 数组) e retorna sua posição, ou "não encontrado".

    Um diretório telefônico aberto
    Buscar em uma lista ordenada, como um livro telefônico, é muito mais rápido do que verificar cada entrada uma por uma

    Busca linear

    Uma busca linear 线性查找 percorre do início ao fim, comparando cada elemento com o alvo:

    FOR i ← 1 TO n
        IF A[i] = target THEN
            RETURN i
        ENDIF
    NEXT i
    RETURN -1   // not found
    

    Nenhuma preparação é necessária, então funciona em qualquer lista. Pior caso O($n$) (alvo no final ou ausente); melhor caso 1 comparação. Use-a em dados não ordenados ou listas pequenas. (O retorno -1 é um valor sentinela — uma posição impossível que significa "não encontrado"; quem chama testa IF result = -1.)

    A versão do exame. O Paper 3 pede para completar uma busca linear escrita com uma flag e um loop WHILE, e o Paper 4 pede para escrever uma função que retorne o índice ou uma contagem. Ambos parecem assim:

    FUNCTION LinearSearch(Data : ARRAY OF INTEGER, Target : INTEGER) RETURNS INTEGER
        DECLARE Index, Count : INTEGER
        Count ← 0
        FOR Index ← 1 TO 100
            IF Data[Index] = Target THEN
                Count ← Count + 1
            ENDIF
        NEXT Index
        RETURN Count          // how many times Target occurs; 0 means not found
    ENDFUNCTION
    

    Para parar na primeira correspondência, use um loop WHILE Index <= 100 AND NOT Found que define Found ← TRUE e lembra o índice. As marcas são pelo loop sobre todo elemento, a comparação e o que é retornado quando o valor está ausente.

    Uma fileira de células do alfabeto A a Z; células A a V estão sombreadas como verificadas e W está destacada como a correspondência, com um ponteiro abaixo de W
    A busca linear verifica cada letra por ordem — 23 comparações para encontrar W

    Busca binária

    Uma busca binária 二分查找 precisa dos dados ordenados. Olhe para o elemento do meio; se for o alvo, pronto; se o alvo for menor, busque na metade esquerda, senão na direita — dividindo o intervalo pela metade cada vez:

    low ← 1
    high ← n
    WHILE low <= high DO
        mid ← (low + high) DIV 2
        IF A[mid] = target THEN
            RETURN mid
        ENDIF
        IF A[mid] < target THEN
            low ← mid + 1
        ELSE
            high ← mid - 1
        ENDIF
    ENDWHILE
    RETURN -1
    

    Pior caso O($\log_{2} n$) — para um milhão de itens, cerca de 20 comparações. Muito mais rápida que a busca linear em arrays grandes ordenados, mas você deve ordenar primeiro (um custo único O($n \log n$)), vale a pena se buscar muitas vezes.

    "Enuncie a condição necessária para uma busca binária." Os dados devem estar em ordem (ordenados, ascendentes ou descendentes, na chave sendo buscada). "Descreva como realizar uma busca binária" (três marcas): (1) encontre o item meio da lista (ou do intervalo atual) e compare-o com o alvo; (2) se corresponder, a busca termina; se o alvo for menor, repita na metade inferior, se maior, na metade superior; (3) continue dividindo pela metade o intervalo até que o item seja encontrado ou o intervalo esteja vazio, o que significa que não está presente.

    A versão do exame, com os limites e uma flag, é a que você deve reproduzir quando solicitado a completar o algoritmo:

    DECLARE Lower, Upper, Mid : INTEGER
    DECLARE Found : BOOLEAN
    Lower ← 0
    Upper ← 99
    Found ← FALSE
    WHILE Lower <= Upper AND NOT Found
        Mid ← (Lower + Upper) DIV 2
        IF Names[Mid] = Target THEN
            Found ← TRUE
        ELSE
            IF Names[Mid] < Target THEN
                Lower ← Mid + 1
            ELSE
                Upper ← Mid - 1
            ENDIF
        ENDIF
    ENDWHILE
    IF Found THEN
        OUTPUT Mid
    ELSE
        OUTPUT "Not found"
    ENDIF
    

    "Explique como o desempenho varia com o número de itens." Cada comparação reduz à metade o número de itens restantes, então o número máximo de comparações é aproximadamente $\log_{2} n$: dobrar o tamanho da lista adiciona apenas uma comparação a mais. Isso é O($\log n$). "Compare busca linear e busca binária": uma busca linear precisa de até $n$ comparações (O($n$)) e, em média, metade disso, mas funciona em dados não ordenados; uma busca binária precisa no máximo de $\log_{2} n$ (O($\log n$)) e é muito mais rápida para listas grandes, mas os dados devem estar previamente ordenados e deve permitir acesso direto ao item do meio (um array, não uma lista ligada). Para $1000$ itens: $1000$ contra $10$ comparações.

    Três linhas mostrando a busca binária no alfabeto ordenado; o intervalo ativo de baixo para alto se reduz pela metade a cada passo conforme a letra central M, depois T, depois W é comparada com W
    A busca binária reduz o intervalo pela metade a cada etapa (baixo / meio / alto) — apenas 3 comparações para encontrar W

    Um catálogo de cartões de biblioteca: uma parede de pequenos gavetas de madeira, uma delas puxada para fora mostrando os cartões arquivados em ordem *Um catálogo de cartões: registros ordenados são o que tornam a busca binária possível — reduza pela metade, olhe, reduza novamente

    Explorar

    Busca linear vs busca binária

    Procure por um valor. A busca binária reduz a lista pela metade a cada etapa (apenas em dados ordenados); a busca linear verifica um por um.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    binary search/ˈbaɪnəri sɜːtʃ/ 二分查找 èr fēn chá zhǎo
    array/əˈreɪ/ 数组 shù zǔ
    linear search/ˈlɪnɪə sɜːtʃ/ 线性查找 xiàn xìng chá zhǎo
    19.1

    Algoritmos de ordenação

    Bubble sort (Ordenação por bolha)

    Um bubble sort 冒泡排序 percorre repetidamente o array, trocando pares adjacentes que estão fora de ordem, assim o maior "bolha" vai para o final a cada passada:

    FOR pass ← 1 TO n - 1
        swapped ← FALSE
        FOR i ← 1 TO n - pass
            IF A[i] > A[i + 1] THEN
                temp ← A[i]
                A[i] ← A[i + 1]
                A[i + 1] ← temp
                swapped ← TRUE
            ENDIF
        NEXT i
        IF swapped = FALSE THEN      // already sorted
            EXIT FOR
        ENDIF
    NEXT pass
    

    Melhor caso O($n$) (já ordenado, com saída antecipada); médio/pior caso O($n^{2}$). Simples, mas lento para grandes $n$.

    Insertion sort (Ordenação por inserção)

    Um insertion sort 插入排序 constrói um prefixo ordenado da esquerda, inserindo cada novo elemento em seu lugar desviando os maiores para a direita:

    FOR i ← 2 TO n
        key ← A[i]
        j ← i - 1
        WHILE j >= 1 AND A[j] > key DO
            A[j + 1] ← A[j]
            j ← j - 1
        ENDWHILE
        A[j + 1] ← key
    NEXT i
    

    Melhor caso O($n$) (já ordenado); pior caso O($n^{2}$). Bom para arrays pequenos ou quase ordenados. Ordena in place 原地 e é estável 稳定 (mantém a ordem dos elementos iguais).

    Rastreamento de uma ordenação

    Uma tarefa comum é mostrar o array após cada passagem externa. Para [D, T, H, R] com insertion sort: passada 1 (chave T) sem mudança; passada 2 (chave H) → [D, H, T, R]; passada 3 (chave R) → [D, H, R, T].

    Escrever uma ordenação do zero. "Escreva pseudocódigo para ordenar DataArray[1:1000] em ordem crescente" é respondido por um bubble sort completo com flag de saída antecipada, ou um insertion sort, declarado e recuado; ambos obtêm nota máxima se funcionarem para toda entrada:

    DECLARE Pass, Index, Temp : INTEGER
    DECLARE Swapped : BOOLEAN
    Pass ← 1
    REPEAT
        Swapped ← FALSE
        FOR Index ← 1 TO 1000 - Pass
            IF DataArray[Index] > DataArray[Index + 1] THEN
                Temp ← DataArray[Index]
                DataArray[Index] ← DataArray[Index + 1]
                DataArray[Index + 1] ← Temp
                Swapped ← TRUE
            ENDIF
        NEXT Index
        Pass ← Pass + 1
    UNTIL Swapped = FALSE OR Pass = 1000
    

    Para ordem decrescente, altere > para <; para ordenar registros ou um array 2D por um campo, compare esse campo mas troque o registro inteiro (ou todas as colunas). Se perguntado a escrever um insertion sort "que realize a mesma tarefa" que um dado bubble sort, mantenha o mesmo nome de array e direção e reproduza o insertion sort acima invertendo a comparação se a ordem for decrescente.

    "Descreva duas maneiras pelas quais o desempenho de uma ordenação é afetado pelos dados" (duas marcas). (1) O número de itens: uma ordenação $O(n^{2})$ leva quatro vezes mais tempo para o dobro de itens. (2) O quão perto os dados já estão de estar em ordem: um bubble sort com flag, ou um insertion sort, termina em uma única passada sobre dados já ordenados ($O(n)$) e realiza o máximo de trabalho em dados em ordem inversa; o número de trocas depende de quantos pares estão fora de ordem. (Também aceito: o intervalo ou número de valores duplicados, e se os itens são registros grandes que são caros de mover.) Bubble sort e insertion sort são ambos O($n^{2}$) nos casos pior e médio e O($n$) no melhor caso; quicksort e merge sort são O($n \log n$), que é por que são usados para grandes volumes de dados.

    Linhas rastreadas de um insertion sort de D, T, H, R através de três passadas; o prefixo ordenado está sombreado e setas mostram cada elemento maior sendo deslocado para a direita para deixar a chave entrar
    Um insertion sort de [D, T, H, R], deslocando cada chave para seu lugar, passo a passo
    Explorar

    Assista uma ordenação rodar

    Passe passo a passo por uma ordenação e observe as barras se acomodarem na ordem — como um algoritmo de ordenação funciona iteração por iteração.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    insertion sort/ɪnˈsɜːʃn sɔːt/ 插入排序 chā rù pái xù
    bubble sort/ˈbʌbl sɔːt/ 冒泡排序 mào pào pái xù
    in place/ɪn pleɪs/ 原地 yuán dì
    stable/ˈsteɪbl/ 稳定 wěn dìng
    19.1

    ADTs em algoritmos

    Os Abstract Data Types (ADTs) do Tema 10 aparecem dentro de muitos algoritmos: uma pilha 栈 impulsiona a travessia em profundidade e o desfazer; uma fila 队列 impulsiona a travessia em largura e a ordem de impressão; uma linked list 链表 permite que os dados cresçam e encolham.

    ADTs podem ser construídos a partir de outros ADTs, não apenas de arrays: uma queue a partir de duas stacks; uma stack a partir de uma linked list (push = prepend um nó cabeça nó 节点); uma queue a partir de uma linked list com ponteiros de cabeça e cauda pointers 指针; uma binary tree 二叉树 a partir de nós com dois ponteiros de filho; um dictionary 字典 armazena pares chave→valor (muitas vezes em uma hash table). Camadas dessa forma separam responsabilidades — o algoritmo que usa o ADT não precisa saber como ele é construído.

    Os ADTs que o exame pede para você descrever e implementar

    Stack (último a entrar, primeiro a sair): os itens são adicionados (empilhados) e removidos (desempilhados) na mesma extremidade, o topo; um ponteiro TopOfStack guarda o índice do item no topo. Implementado com um array e aquele único ponteiro: push verifica se a stack não está cheia, incrementa o ponteiro e armazena o item; pop verifica se não está vazia, retorna o item no topo e decrementa o ponteiro.

    FUNCTION Push(Item : INTEGER) RETURNS BOOLEAN
        IF TopOfStack = 9 THEN      // full (array 0 to 9)
            RETURN FALSE
        ENDIF
        TopOfStack ← TopOfStack + 1
        StackData[TopOfStack] ← Item
        RETURN TRUE
    ENDFUNCTION
    FUNCTION Pop() RETURNS INTEGER
        IF TopOfStack = -1 THEN      // empty
            RETURN -1
        ENDIF
        TopOfStack ← TopOfStack - 1
        RETURN StackData[TopOfStack + 1]
    ENDFUNCTION
    

    Queue (primeiro a entrar, primeiro a sair): os itens entram na parte traseira (enfilam) e saem pela frente (desfilam); dois ponteiros e uma contagem. Em uma queue linear, o ponteiro da frente corre pelo array até que o espaço no início seja desperdiçado; uma circular queue 循环队列 faz ambas as ponteiros voltarem com MOD, reutilizando cada célula.

    Uma circular queue de seis células de array contendo três itens nas células 3 a 5, com o ponteiro frontal em 3 e o traseiro em 5, e uma seta tracejada mostrando que o próximo item volta para a célula 0 *Uma circular queue: os ponteiros traseiro e frontal avançam com MOD, reutilizando as primeiras células do array assim que seus itens saem

    FUNCTION Enqueue(Item : STRING) RETURNS BOOLEAN
        IF Count = 6 THEN      // full
            RETURN FALSE
        ENDIF
        Rear ← (Rear + 1) MOD 6
        QueueArray[Rear] ← Item
        Count ← Count + 1
        RETURN TRUE
    ENDFUNCTION
    FUNCTION Dequeue() RETURNS STRING
        IF Count = 0 THEN      // empty
            RETURN ""
        ENDIF
        DECLARE Item : STRING
        Item ← QueueArray[Front]
        Front ← (Front + 1) MOD 6
        Count ← Count - 1
        RETURN Item
    ENDFUNCTION
    

    Linked list: uma sequência de nodes, cada um segurando um item de dados e um pointer para o próximo node; um start pointer dá o primeiro node e um ponteiro nulo (0 ou $-1$) encerra a lista. Em uma implementação com array, dois arrays paralelos seguram os dados e os ponteiros, e células não utilizadas são encadeadas em uma free list 空闲列表 para que uma inserção saiba onde colocar o novo node.

    Dois arrays paralelos Data e Pointer implementando uma linked list dos nomes Ann, Ben e Dan: o start pointer é 1, os ponteiros encadeiam 1 para 3 para 2 para 0, e as células não utilizadas 4, 5 e 6 formam a free list *Uma linked list em dois arrays: a ordem da lista está nos ponteiros, não nas posições; inserir um nome significa pegar uma célula da free list e religar dois ponteiros

    FUNCTION FindInList(Target : STRING) RETURNS INTEGER   // index, or 0 if absent
        DECLARE Current : INTEGER
        Current ← Start
        WHILE Current <> 0
            IF Data[Current] = Target THEN
                RETURN Current
            ENDIF
            Current ← Pointer[Current]
        ENDWHILE
        RETURN 0
    ENDFUNCTION
    

    Para inserir em uma lista ordenada: pegue a primeira célula livre (NewNode ← FreeList, FreeList ← Pointer[FreeList]), armazene o item, depois percorra a lista com um ponteiro Previous e Current até Data[Current] > Item ou o fim; defina Pointer[NewNode] ← Current e Pointer[Previous] ← NewNode (ou Start ← NewNode se for o primeiro). Para excluir, religue o node anterior além do excluído e devolva a célula à free list.

    Binary tree: um nó raiz, cada nó segurando dados, um left pointer para um subtree de valores menores e um right pointer para um subtree de valores maiores. Implementado como um array 2D (ou três arrays 1D) Tree[Index, 0..2] para left pointer, dados, right pointer, com um root pointer e um next-free pointer.

    FUNCTION FindInTree(Target : INTEGER) RETURNS INTEGER   // index, or -1
        DECLARE Current : INTEGER
        Current ← Root
        WHILE Current <> -1
            IF Tree[Current, 1] = Target THEN
                RETURN Current
            ENDIF
            IF Target < Tree[Current, 1] THEN
                Current ← Tree[Current, 0]      // go left
            ELSE
                Current ← Tree[Current, 2]      // go right
            ENDIF
        ENDWHILE
        RETURN -1
    ENDFUNCTION
    

    Para inserir: armazene o item no próximo nó livre com ambos os ponteiros $-1$; se a árvore estiver vazia, faça-a a root; caso contrário, percorra descendo da root, indo à esquerda ou à direita por comparação, até que o ponteiro que você seguiria fosse $-1$, e defina aquele ponteiro para o novo nó. Um ADT a partir de outro ADT: uma stack é uma linked list onde push e pop funcionam ambos no início; uma queue é uma linked list com um ponteiro de início e um de fim; uma queue pode ser feita a partir de duas stacks (push em uma, pop na outra, movendo tudo quando a segunda estiver vazia); os nós de uma binary tree são records ou objetos ligados por ponteiros, então é construído a partir de uma estrutura ligada de nós. Diga quais operações do novo ADT mapeiam para quais operações do antigo.

    Uma binary tree com root 27, um subtree esquerdo de 19, 16, 21 e 17, e um subtree direito de 36, 42, 89 e 55, com a root, os ponteiros esquerdo e direito, e um nó folha rotulado *Uma binary tree: cada nó tem até dois nós filhos

    Uma binary search tree com root 4 (subtree esquerda 2 sobre 1 e 3, subtree direita 6 sobre 5 e 7); pre-order visita 4 2 1 3 6 5 7, in-order 1 2 3 4 5 6 7 (ordenado), post-order 1 3 2 5 7 6 4 *Três travessias depth-first de uma binary tree: pre-order, in-order (ordem ordenada) e post-order

    Vocabulário Treinar
    Inglês Chinês Pinyin
    linked list/lɪŋkt lɪst/ 链表 liàn biǎo
    stack/stæk/ 栈 zhàn
    queue/kjuː/ 队列 duì liè
    node/nəʊd/ 节点 jié diǎn
    pointers/ˈpɔɪntəz/ 指针 zhǐ zhēn
    binary tree/ˈbaɪnəri triː/ 二叉树 èr chā shù
    dictionary/ˈdɪkʃənəri/ 字典 zì diǎn
    circular queue/ˈsɜːkjʊlə kjuː/ 循环队列 xún huán duì liè
    free list/friː lɪst/ 空闲列表 kòng xián liè biǎo
    time complexity/taɪm kəmˈpleksɪti/ 时间复杂度 shí jiān fù zá dù
    Big-O notation/bɪɡ əʊ nəʊˈteɪʃn/ 大O表示法 dà O biǎo shì fǎ
    space complexity/speɪs kəmˈpleksɪti/ 空间复杂度 kōng jiān fù zá dù
    19.1

    Comparando algoritmos

    Complexidade temporal

    Complexidade temporal 时间复杂度 é como o tempo de execução cresce com o tamanho de entrada $n$, escrito em notação Big-O 大O表示法 (o termo dominante): O(1) constante, O($\log n$) busca binária, O($n$) busca linear, O($n \log n$) boas ordenações, O($n^{2}$) bubble/insertion sort. Uma ordem menor é melhor em escala, mesmo se outro algoritmo for mais rápido para pequenos $n$.

    Para tornar isso concreto: para ordenar um milhão de itens, uma ordenação $O(n \log n)$ termina em fração de segundo, enquanto uma ordenação $O(n^{2})$ pode levar minutos.

    Exemplo resolvido. Uma lista ordenada contém $1000$ itens. Quantas comparações cada busca precisa no pior caso?

    Uma busca linear verifica itens um de cada vez, então pode precisar de até $1000$ comparações — isso é $O(n)$. Uma busca binária reduz a lista pela metade a cada passo, então precisa no máximo de $\lceil \log_2 1000 \rceil = 10$ comparações — isso é $O(\log n)$. Dobrar a lista para $2000$ itens adiciona apenas uma comparação à busca binária, mas até mais $1000$ à busca linear — que é por que a ordem de crescimento, não a velocidade bruta, decide o vencedor em escala.

    Descrevendo uma ordem. O(1): o tempo é constante, independente do número de itens (push em uma pilha, leitura de um elemento de array). O($\log n$): o tempo cresce com o logaritmo do número de itens, então dobrar os dados adiciona apenas uma etapa extra fixa (busca binária). O($n$): o tempo cresce proporcionalmente ao número de itens (busca linear, uma passagem por uma lista). O($n \log n$): um pouco pior que linear (classificações eficientes). O($n^{2}$): o tempo cresce com o quadrado do número de itens, então dobrar os dados quadruplica o tempo (bubble sort e insertion sort). "Declare a Big O de uma busca binária de Names[0:99]" é respondida $O(\log n)$, e "descreva seu significado" como acima; Big O mede como o tempo ou memória escala, não o tempo real.

    Um gráfico de tempo de execução contra o tamanho de entrada n para as ordens comuns: O(1) e O(log n) permanecem quase planas, O(n) sobe suavemente, O(n log n) mais íngreme, e O(n squared) sobe mais rápido *Como as ordens comuns de crescimento se comparam: uma ordem menor vence em escala

    Um gráfico de linha de tempo de execução contra o número de elementos n: bubble sort e insertion sort sobem acentuadamente como O(n squared), enquanto quick sort permanece baixo como O(n log n)
    Como o tempo de classificação cresce com o número de elementos $n$: $O(n^2)$ classifica afastam-se de uma classificação $O(n\log n)$

    Complexidade de espaço

    Complexidade de espaço 空间复杂度 é a memória extra necessária. Bubble sort e insertion sort usam O(1) extra (in-place); merge sort usa O($n$); recursão usa memória de pilha proporcional à sua profundidade. Frequentemente existe um compromisso entre tempo e memória.

    Outros critérios

    Simplicidade (mais fácil de codificar e manter), estabilidade e adaptabilidade (mais rápido em dados quase ordenados). O algoritmo correto depende dos dados e das restrições.

    Explorar

    Como o tempo de execução cresce com n

    Deslize n para cima e compare as curvas: O(1) e O(log n) permanecem quase planas, O(n) sobe consistentemente, O(n²) explode. É por isso que o Big-O — não um cronômetro — é como comparamos algoritmos em entradas grandes.

    Explorar

    Crescimento Big-O

    Altere o tamanho da entrada n e compare quão rapidamente o trabalho de cada algoritmo cresce — a ideia por trás da complexidade temporal.

    19.2

    Recursão

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Demonstrar compreensão de recursão Características essenciais da recursão. Como a recursão é expressa em uma linguagem de programação. Escrever e rastrear algoritmos recursivos. Quando o uso de recursão é benéfico
    Demonstrar conhecimento do que um compilador precisa fazer para traduzir código de programação recursivo Uso de pilhas e desenrolamento

    Fonte: Programa Cambridge International

    Recursão: a pilha de chamadas sobe e desce

    Algoritmos recursivos usam recursão 递归: a rotina chama-se a si mesma com uma versão menor do mesmo problema, até que um caso base 基本情形 termine a cadeia. Tem duas partes: o caso base (pequeno o suficiente para ser resolvido diretamente — sem ele a recursão nunca para) e o caso recursivo 递归情形 (reduzir a entrada e chamar-se a si mesma).

    Fatorial 阶乘:

    FUNCTION Factorial(n : INTEGER) RETURNS INTEGER
        IF n = 0 OR n = 1 THEN
            RETURN 1
        ELSE
            RETURN n * Factorial(n - 1)
        ENDIF
    ENDFUNCTION
    

    A recursão é natural para problemas autorreferenciais: árvores, divide-and-conquer 分治 (busca binária, merge sort) e dados aninhados. Quando não se adapta bem, um ciclo costuma ser mais limpo.

    "Descreva o que significa recursão (duas marcas)." Uma função ou procedimento definido em termos de si mesmo: ela chama-se a si mesma dentro do seu próprio corpo, com uma versão menor do problema cada vez, até que um caso base seja alcançado. "Enuncie três características essenciais da recursão": (1) um caso base (condição de paragem) que retorna um valor sem uma chamada adicional; (2) um caso geral 一般情形 em que a rotina chama-se a si mesma; (3) cada chamada aproxima o problema do caso base (o parâmetro é reduzido), para que a recursão termine. Alguns esquemas adicionam: os valores são retornados conforme as chamadas desenrolam.

    "Descreva quando o uso de recursão é benéfico e dê um exemplo." Quando o problema é naturalmente definido em termos de versões menores de si mesmo, de modo que a solução recursiva seja mais curta, clara e próxima da definição matemática do que um ciclo seria: um fatorial ou número de Fibonacci, uma busca binária, percorrer uma árvore binária, merge sort ou quicksort, e processar estruturas aninhadas como pastas dentro de pastas. É uma má escolha quando a profundidade é grande (a pilha pode transbordar) ou quando o mesmo sub-problema é calculado muitas vezes (Fibonacci ingênuo).

    Rastreando uma chamada recursiva

    Para Factorial(4): as chamadas descem até Factorial(1)=1, depois desenrolar multiplica de volta para cima: 2*1=2, 3*2=6, 4*6=24. Resultado final 24. Rastreie cada chamada pendente numa pilha.

    Exemplo resolvido. A função abaixo é dada sem explicação. Rastreie Unknown(3, 5) e indique a sua saída e valor de retorno.

    FUNCTION Unknown(BYVAL X, BYVAL Y : INTEGER) RETURNS INTEGER
        IF X < Y THEN
            OUTPUT X + Y
            RETURN Unknown(X + 1, Y - 1) + 1
        ELSE
            RETURN 0
        ENDIF
    ENDFUNCTION
    

    Chamada 1: $X = 3, Y = 5$: $3 < 5$, saída 8, chama Unknown(4, 4). Chamada 2: $4 < 4$ é falso, retorna 0. Desenrolamento: chamada 1 retorna $0 + 1 = 1$. Saída 8, valor de retorno 1. Escreva o rastro como uma tabela com uma linha por chamada (parâmetros, condição, saída, o que retorna) e faça os retornos da chamada mais profunda para cima: este é o desenrolamento que o gabarito procura.

    Exemplo resolvido (Fibonacci). Fib(n) retorna n quando n < 2, caso contrário Fib(n - 1) + Fib(n - 2). Encontre Fib(5).

    Fib(5) = Fib(4) + Fib(3); Fib(4) = Fib(3) + Fib(2); Fib(3) = Fib(2) + Fib(1); Fib(2) = Fib(1) + Fib(0) = 1 + 0 = 1. Assim Fib(3) = 1 + 1 = 2, Fib(4) = 2 + 1 = 3, Fib(5) = 3 + 2 = 5. O caso base é alcançado muitas vezes (Fib(2) é calculado três vezes), razão pela qual esta versão é lenta: faz 15 chamadas para $n = 5$ e dobra aproximadamente as chamadas para cada aumento em $n$.

    Convertendo recursão em iteração. Toda rotina recursiva pode ser reescrita com um ciclo, que usa menos memória e é mais rápida: mantenha um resultado acumulado e瞪ue do caso base para cima. Fatorial como um ciclo:

    FUNCTION Factorial(N : INTEGER) RETURNS INTEGER
        DECLARE Result, Count : INTEGER
        Result ← 1
        FOR Count ← 2 TO N
            Result ← Result * Count
        NEXT Count
        RETURN Result
    ENDFUNCTION
    

    Ao ser solicitado a alterar uma ordenação por inserção recursiva ou busca em uma iterativa, substitua a auto-chamada por um ciclo sobre o índice pelo qual a recursão estava avançando, e transforme o caso base na condição de saída do ciclo.

    A pilha de chamadas para Fatorial(4): cada chamada empurra um frame para baixo até o caso base Fatorial(1)=1, então a pilha desce, retornando 2 = 2 vezes 1, 6 = 3 vezes 2 e 24 = 4 vezes 6
    Recursão usa a pilha de chamadas: chamadas empilham quadros para baixo até ao caso base, depois retornos desenrolam para cima

    Riscos

    • recursão infinita se o caso base for omitido — falha com transbordamento de pilha 栈溢出.
    • alto uso de memória para recursão profunda.
    • lento se repetir trabalho (Fibonacci ingênuo é exponencial — use um ciclo ou memoização 记忆化).
    Explorar

    A recursão desenrola das folhas para cima

    Passo a passo de fib(4) na ordem em que as chamadas realmente terminam: as folhas (casos base) resolvem primeiro, depois cada pai combina seus filhos. Note que fib(2) é calculado duas vezes — esse trabalho repetido é por que a recursão ingênua é lenta.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    recursion/rɪˈkɜːʃn/ 递归 dì guī
    call stack/kɔːl stæk/ 调用栈 diào yòng zhàn
    base case/beɪs keɪs/ 基本情形 jī běn qíng xíng
    recursive case/rɪˈkɜːsɪv keɪs/ 递归情形 dì guī qíng xíng
    factorial/fækˈtɔːrɪəl/ 阶乘 jiē chéng
    divide-and-conquer/dɪˈvaɪd ænd ˈkɒŋkə/ 分治 fēn zhì
    general case/ˈdʒenərəl keɪs/ 一般情形 yì bān qíng xíng
    parameters/pəˈræmɪtəz/ 参数 cān shù
    stack overflow/stæk ˌəʊvəˈfləʊ/ 栈溢出 zhàn yì chū
    memoisation/ˌmeməʊaɪˈzeɪʃn/ 记忆化 jì yì huà
    local variables/ˈləʊkl ˈveərɪəblz/ 局部变量 jú bù biàn liàng
    stack frame/stæk freɪm/ 栈帧 zhàn zhēn
    return address/rɪˈtɜːn əˈdres/ 返回地址 fǎn huí dì zhǐ
    19.2

    O que o compilador faz para código recursivo

    A recursão precisa de cada chamada ter sua própria cópia dos seus parâmetros 参数 e variáveis locais 局部变量. O compilador mantém estes na pilha de chamadas 调用栈. Para cada chamada, empilha um quadro de pilha 栈帧 contendo os parâmetros, as variáveis locais e o endereço de retorno 返回地址 (onde retomar no chamador). Quando a função retorna, o valor de retorno é passado, o quadro é removido e o controle retoma no endereço de retorno.

    Porque cada chamada tem seu próprio quadro, chamadas recursivas não sobrepõem as variáveis umas das outras. A pilha pode crescer muito para recursão profunda, razão pela qual recursão muito profunda pode transbordá-la. Este é o mesmo mecanismo de chamada e retorno usado para chamadas ordinárias (não recursivas) — não há um "mecanismo de recursão" especial.

    "Explique por que uma pilha é adequada para implementar recursão (três marcas)." Cada chamada recursiva deve salvar seu endereço de retorno, seus parâmetros e suas variáveis locais, e as chamadas são concluídas na ordem invertida àquela em que foram feitas (a última chamada feita é a primeira a terminar), o que é exatamente o comportamento último a entrar, primeiro a sair de uma pilha: cada nova chamada empilha um quadro, e cada retorno remove o quadro mais recente, restaurando o estado do chamador e dizendo-lhe onde continuar. Este é o trabalho do compilador quando traduz código recursivo: ele gera o empilhamento de um quadro de pilha em cada chamada e a remoção em cada retorno, e os quadros são desenrolados conforme os resultados voltam.

    19.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    busca linear verificando cada item sucessivamente a partir do início até que o alvo seja encontrado ou o fim seja atingido
    busca binária comparando repetidamente o alvo com o item central de uma lista ordenada e descartando a metade que não pode contê-lo
    bubble sort passando repetidamente pela lista, trocando itens adjacentes que estão na ordem errada, até que uma passagem não realize trocas
    insertion sort pegando cada item sucessivamente e inserindo-o no seu lugar correto entre os itens já ordenados
    tipo de dado abstrato uma coleção de dados e as operações que podem ser realizadas sobre eles, definidas independentemente de como são armazenadas
    pilha uma estrutura último-entra-primeiro-sai com push e pop no topo
    fila uma estrutura primeiro-entra-primeiro-sai com itens adicionados na traseira e removidos da frente
    lista ligada uma sequência de nós, cada um segurando dados e um ponteiro para o próximo nó, com um ponteiro inicial
    árvore binária nós segurando dados e ponteiros para uma subárvore esquerda de valores menores e uma subárvore direita de valores maiores
    notação Big O uma forma de classificar o tempo (ou memória) que um algoritmo precisa dependendo de como cresce com o tamanho da entrada
    recursão uma rotina que chama-se a si mesma com uma versão menor do problema até que um caso base pare as chamadas
    caso base a condição sob a qual uma rotina recursiva retorna sem chamar-se a si mesma
    desenrolamento os retornos de uma cadeia de chamadas recursivas, da chamada mais profunda de volta à primeira, conforme os quadros de pilha são removidos
    19.2

    Dicas de prova

    • Buscas: linear não precisa de ordem e O($n$); binária precisa de um array ordenado, divide ao meio a cada passo e é O($\log n$). Saiba ambos os algoritmos de cor, incluindo os limites e a flag.
    • Ordenações: bubble com flag de troca, insertion com chave que desloca itens maiores para a direita; ambos O($n^{2}$) no pior caso, O($n$) em dados ordenados. O desempenho depende do número de itens e do quão ordenados eles estão.
    • Implementações de TDA são gerenciamento de ponteiros: um ponteiro superior; front, rear e count com MOD; start, ponteiros e uma lista livre; raiz com ponteiros esquerdo e direito. Sempre verifique se está cheio e vazio.
    • Big O trata de escalonamento: constante, logarítmica, linear, quadrada. Diga "dobrar os dados adiciona uma comparação" para uma busca binária.
    • Recursão: caso base, caso geral, progresso em direção ao caso base; benéfico quando o problema é definido em termos de si mesmo; uma pilha guarda os endereços de retorno e variáveis porque as chamadas retornam em ordem inversa. Rastreie com uma tabela e desenrole da chamada mais profunda.

    Erros comuns

    • Usar uma busca binária em dados não ordenados, ou em uma lista ligada; e definir Lower ← Mid em vez de Mid + 1, o que loopa eternamente.
    • Um loop interno de bubble sort que roda até o fim do array a cada passada, ou uma troca sem variável temporária.
    • Um push ou enqueue que não testa para cheio, ou um pop ou dequeue que não testa para vazio.
    • Mover o ponteiro frontal da fila sem MOD em uma fila circular, ou tratar front = rear como significando sempre vazio.
    • Inserir em uma lista ligada deslocando o conteúdo do array; apenas os ponteiros mudam.
    • Uma função recursiva sem caso base, ou cujas chamadas recursivas não tornam o problema menor.
    • Rastrear uma chamada recursiva mas esquecer adicionar o trabalho pendente no caminho de volta para cima.
    • Responder "por que uma pilha" com "porque é rápida"; a razão é a ordem último-entra-primeiro-sai dos retornos.
  • 20

    Programação Avançada

    Assistir aula
    20.1

    Paradigmas de programação

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Compreender o que se entende por um paradigma de programação
    Demonstrar compreensão das características de vários paradigmas de programação:
    • Baixo nível Programação de Baixo Nível: • compreensão e capacidade de escrever código de baixo nível usando vários modos de endereçamento: imediato, direto, indireto, indexado e relativo
    • Imperativo (Procedural) Programação Imperativa (Procedural): • conhecimento pressuposto e compreensão de Programação Estruturada (ver detalhes na seção de conteúdo AS 11.3) • compreensão e capacidade de escrever código de programação imperativa (procedural) que usa variáveis, construções, procedimentos e funções. Ver detalhes no conteúdo AS
    • Orientado a Objetos Programação Orientada a Objetos (POO): • compreensão da terminologia associada à POO (incluindo objetos, propriedades/atributos, métodos, classes, herança, polimorfismo, contenção (agregação), encapsulamento, getters, setters, instâncias) • compreensão de como resolver um problema projetando classes apropriadas • compreensão e capacidade de escrever código que demonstre o uso de POO
    • Declarativo Programação Declarativa: • compreensão e capacidade de resolver um problema escrevendo fatores e regras adequados baseados nas informações fornecidas • compreensão e capacidade de escrever código que possa satisfazer um objetivo usando fatos e regras

    Fonte: Programa Cambridge International

    Um paradigma de programação 编程范式 é um estilo de programação — uma maneira de estruturar programas, com suas próprias ideias e recursos de linguagem. Quatro paradigmas de programação estão neste programa.

    "Descreva o que significa uma linguagem imperativa (procedural) (duas marcas)." Uma linguagem na qual o programa é uma sequência de instruções executadas em ordem e que alteram o estado do programa; o programador diz como a tarefa é feita, usando procedimentos, sequência, seleção e iteração. "Descreva o que significa uma linguagem declarativa": o programa declara fatos e regras (o que é conhecido e o que se quer) e o motor de inferência da linguagem descobre como encontrar a resposta; o programador não dá a sequência de passos.

    Identifique o paradigma a partir de um exemplo de código (uma questão típica do Paper 3): LDD 200, ADD #5, STO 201 são de baixo nível (mnemônicos, registradores, endereços de memória); FOR Count ← 1 TO 10 … NEXT Count com procedimentos e atribuições é imperativo; CLASS Dog … PRIVATE Name : STRING … PUBLIC PROCEDURE NEW(…) é orientado a objetos; type(lion, wild). e dangerous(X) IF type(X, wild) são declarativos (lógica). Na questão de correspondência: baixo nível combina com "mnemônicos que correspondem diretamente às instruções da máquina", imperativo com "uma sequência de instruções que alteram o estado", OOP com "objetos que combinam atributos e métodos" e declarativo com "fatos e regras, sem ordem de execução dada".

    Quatro paradigmas: baixo nível, imperativo, orientado a objetos e declarativo
    Quatro paradigmas: baixo nível, imperativo, orientado a objetos e declarativo

    Programação de baixo nível

    Programação próxima ao hardware em código de máquina 机器码 ou linguagem de montagem 汇编语言, onde cada instrução mapeia para o que a CPU executa. Fornece acesso direto a registradores 寄存器和 endereços de memória 内存地址, usando diferentes modos de endereçamento 寻址方式 (imediato, direto, indireto, indexado e relativo). É muito rápido e compacto, mas específico da arquitetura, tedioso e difícil de manter. Esta é a programação de baixo nível 低级, usada para drivers de dispositivos, firmware e bootloaders.

    Os cinco modos de endereçamento. A ementa pede código de baixo nível que use cada modo de endereçamento (o conjunto de instruções está no Topic 4). O operando de uma instrução de carga pode ser lido de cinco formas, e o exame fornece os conteúdos da memória e pergunta qual o acumulador contém:

    Uma tabela de memória com endereços 105, 106, 107, 27 e 145 e seus conteúdos, ao lado de cinco linhas mostrando o que o acumulador recebe de LDM #105, LDD 105, LDI 105, LDX 105 com IX = 2, e um salto relativo
    O mesmo operando, 105, lido de cinco formas: como um valor, como um endereço, como o endereço de um endereço, como um endereço mais o registrador índice, e como um offset a partir da instrução atual
    • imediato (LDM #105): o operando é o valor; ACC torna-se 105.
    • direto (LDD 105): o operando é o endereço do valor; ACC torna-se o conteúdo de 105, aqui 27.
    • indireto (LDI 105): o operando é o endereço de um endereço; ACC torna-se o conteúdo de 27, aqui 91. Usado para ponteiros e para dados cuja posição é decidida em tempo de execução.
    • indexado (LDX 105): o endereço é o operando mais o registrador índice IX; com IX = 2, ACC torna-se o conteúdo de 107. Usado para percorrer uma matriz incrementando IX.
    • relativo (JMR +65): o destino é um offset a partir do endereço da instrução atual, o que torna o código relocalizável.

    Exemplo resolvido. Memória: 105 contém 27, 106 contém 64, 200 contém 0. Escreva código para somar os conteúdos de 105 e 106, armazenar o resultado em 200 e exibi-lo. LDD 105 (ACC = 27), ADD 106 (ACC = 91), STO 200, OUT. Para dobrar o valor em 105 em vez disso: LDD 105, ADD 105, STO 105. Indique o conteúdo dos registradores após cada linha quando solicitado a rastrear.

    Programação imperativa (procedural)

    Na programação imperativa 命令式编程, o programador escreve uma sequência de comandos que alteram o estado do programa — atribuições, condicionais, laços, chamadas de função. Variáveis 变量 mantêm o estado; as instruções o alteram; o código é organizado em procedimentos e funções (também chamado de programação estruturada). Este é o estilo dos Topics 9 e 11 (Python, C). Forte quando o algoritmo tem passos sequenciais claros.

    Programação orientada a objetos (OOP)

    Na programação orientada a objetos 面向对象编程, programas são construídos a partir de objetos 对象 — unidades que combinam dados (atributos 属性) e operações (métodos 方法). Objetos são instâncias 实例 de classes 类. Os quatro pilares:

    • encapsulamento 封装 — os dados de um objeto estão ocultos atrás de seus métodos; o código externo usa apenas os métodos públicos, não os dados diretamente. Isso protege o objeto e permite que seu interior mude sem quebrar quem o chama. Por exemplo, um BankAccount esconde seus balance; você os altera apenas através de deposit() e withdraw(), que podem impor uma regra como "nunca descer abaixo de zero".
    • herança 继承 — uma subclasse 子类 especializa uma superclasse 父类, herdando seus atributos e métodos e adicionando ou sobrescrevendo 重写 eles. Modela "é-um" ("Um Gerente é um Funcionário").
    • polimorfismo 多态 — objetos diferentes respondem à mesma chamada de método de forma diferente; quem chama não precisa saber o tipo exato. Todo Shape tem Area(), e um Circle e um Rectangle o implementam de suas próprias maneiras.
    • abstração 抽象 — mostrar uma interface simples e ocultar a implementação.

    Outros termos:

    • um construtor 构造函数 é um método especial executado quando um objeto é criado, para configurar seus atributos.
    • getters e setters leem e gravam os atributos de um objeto (suas propriedades) através de métodos.
    • agregação 聚合 e contenção 包含 constroem um objeto a partir de outros objetos (uma relação "tem-um").

    OOP é usado para sistemas grandes, interfaces gráficas, simulações e jogos.

    A mesma forma de chamada.Area() executa códigos diferentes para cada objeto: um Círculo calcula pi r quadrado, um Retângulo calcula largura vezes altura *Polimorfismo: a mesma chamada de método executa o código próprio de cada objeto

    Um diagrama de classes UML para Shape: uma caixa de três partes com o nome da classe, atributos privados (Name, Area, Perimeter, marcados com menos) e métodos públicos (SetShape, calculateArea, calculatePerimeter, marcados com mais) *Um diagrama de classe para Shape: atributos privados e métodos públicos

    Um diagrama de herança UML: a superclasse employee no topo, com as subclasses partTime e fullTime abaixo, cada uma ligada à superclasse por uma seta de generalização de triângulo vazio e adicionando seus próprios atributos e métodos *Herança: partTime e fullTime são subclases de employee

    Um objeto BankAccount com um saldo privado acessado apenas através dos métodos públicos deposit() e withdraw(); o código externo não pode tocar nos dados diretamente *Encapsulamento: os dados de um objeto são privados, acessados apenas através de seus métodos públicos

    OOP conforme o avaliador pontua

    Definições. Classe: uma planta (projeto) que define os atributos e métodos dos objetos desse tipo. Objeto: uma instância de uma classe, criada a partir dela, com seus próprios valores para os atributos ("uma ocorrência de um objeto" é a expressão do exame para instância). Atributo (propriedade): um item de dado pertencente a uma classe. Método: um procedimento ou função pertencente a uma classe que atua sobre seus atributos. Encapsulamento: combinar atributos e métodos em uma classe e restringir o acesso externo aos dados: os atributos são privados e só podem ser lidos ou alterados através de métodos públicos. Herança: uma subclasse adquire os atributos e métodos de sua classe pai (super) e pode adicionar os seus próprios ou sobrescrevê-los. Polimorfismo: métodos com o mesmo nome que se comportam diferentemente em classes diferentes; tipicamente uma subclasse ** redefine** um método de seu pai, e a versão certa roda para cada objeto. Contenção: uma classe tem um objeto de outra classe como atributo (um carro tem um motor). "Identificar o recurso que restringe o acesso externo aos dados" é encapsulamento; "o termo para uma ocorrência de um objeto" é instância.

    "Esboce a estrutura de uma classe" (três marcas): atributos (propriedades) que mantêm os dados do objeto, geralmente declarados como privados; métodos (procedimentos e funções) que atuam sobre esses atributos, geralmente públicos; e um construtor, um método que roda quando um objeto é criado para inicializar os atributos. "Dê três benefícios da OOP": o código é reutilizado através da herança; os dados são protegidos pelo encapsulamento, então só podem ser alterados pelos métodos próprios da classe; um programa grande é dividido em classes que são escritas e testadas independentemente, facilitando a manutenção e expansão; as classes modelam entidades do mundo real, tornando o design mais fácil de entender; o polimorfismo permite que a mesma chamada funcione para objetos diferentes.

    A classe em pseudocódigo, conforme o Paper 3 a define:

    CLASS Car
        PRIVATE Registration : STRING
        PRIVATE Year : INTEGER
        PRIVATE Mileage : INTEGER
        PUBLIC PROCEDURE NEW(NewReg : STRING, NewYear : INTEGER)
            Registration ← NewReg
            Year ← NewYear
            Mileage ← 0
        ENDPROCEDURE
        PUBLIC FUNCTION GetMileage() RETURNS INTEGER
            RETURN Mileage
        ENDFUNCTION
        PUBLIC PROCEDURE AddMileage(Extra : INTEGER)
            Mileage ← Mileage + Extra
        ENDPROCEDURE
    ENDCLASS
    

    Um objeto é criado com MyCar ← NEW Car("AB12 CDE", 2020) e usado com MyCar.AddMileage(150) e OUTPUT MyCar.GetMileage(). Uma subclasse reutiliza o construtor do pai através de SUPER:

    CLASS ElectricCar INHERITS Car
        PRIVATE BatteryCapacity : REAL
        PUBLIC PROCEDURE NEW(NewReg : STRING, NewYear : INTEGER, NewCapacity : REAL)
            SUPER.NEW(NewReg, NewYear)
            BatteryCapacity ← NewCapacity
        ENDPROCEDURE
    ENDCLASS
    

    A mesma classe em Python, conforme o Paper 4 espera: os atributos tornam-se privados com dois underscores, o construtor é __init__, e uma subclasse nomeia seu pai entre parênteses e chama super().__init__(…):

    class Car:
        def __init__(self, reg, year):
            self.__registration = reg
            self.__year = year
            self.__mileage = 0
        def get_mileage(self):
            return self.__mileage
        def add_mileage(self, extra):
            self.__mileage = self.__mileage + extra
    
    class ElectricCar(Car):
        def __init__(self, reg, year, capacity):
            super().__init__(reg, year)
            self.__capacity = capacity
    
    cars = []
    cars.append(Car("AB12 CDE", 2020))
    cars.append(ElectricCar("EV21 XYZ", 2023, 75.0))
    cars[1].add_mileage(150)
    print(cars[1].get_mileage())
    

    Em Java, as mesmas ideias são private/public campos, um construtor com o nome da classe, extends e super(…); em VB.NET Private/Public, Sub New, Inherits e MyBase.New. Um método polimórfico é escrito no pai e sobrescrito no filho com o mesmo nome; uma chamada através de uma variável do tipo pai executa a versão do filho.

    Estruturas de dados como objetos. O Paper 4 constrói uma pilha, lista encadeada ou árvore binária a partir de uma Node classe cujos atributos são os dados e uma ou duas referências para outros nós; uma Tree (ou LinkedList) classe mantém a raiz (ou início) e os métodos.

    Uma árvore binária de objetos Node: o objeto Tree Root aponta para o nó 15, cujas referências Left e Right apontam para os nós 8 e 19, e assim por diante, com None para referências vazias
    Uma árvore binária construída a partir de objetos: cada Node mantém Data além das referências Left e Right, e o Tree mantém o Root; a inserção percorre as referências
    CLASS Node
        PUBLIC Data : INTEGER
        PUBLIC Left : Node          // NULL when there is no child
        PUBLIC Right : Node
        PUBLIC PROCEDURE NEW(NewData : INTEGER)
            Data ← NewData
            Left ← NULL
            Right ← NULL
        ENDPROCEDURE
    ENDCLASS
    
    CLASS Tree
        PRIVATE Root : Node
        PUBLIC PROCEDURE Insert(NewData : INTEGER)
            DECLARE NewNode, Current : Node
            DECLARE Placed : BOOLEAN
            NewNode ← NEW Node(NewData)
            IF Root = NULL THEN
                Root ← NewNode
            ELSE
                Current ← Root
                Placed ← FALSE
                WHILE NOT Placed
                    IF NewData < Current.Data THEN
                        IF Current.Left = NULL THEN
                            Current.Left ← NewNode
                            Placed ← TRUE
                        ELSE
                            Current ← Current.Left
                        ENDIF
                    ELSE
                        IF Current.Right = NULL THEN
                            Current.Right ← NewNode
                            Placed ← TRUE
                        ELSE
                            Current ← Current.Right
                        ENDIF
                    ENDIF
                ENDWHILE
            ENDIF
        ENDPROCEDURE
    ENDCLASS
    

    Um método find percorre o mesmo caminho e retorna TRUE quando Current.Data = Target, FALSE quando atinge NULL; um método produção in-order é recursivo: output da subárvore esquerda, do nó, então da subárvore direita. Para uma lista encadeada o nó tem uma referência, Next, e a classe da lista mantém Start; para uma pilha construída a partir de uma lista, push e pop ambos funcionam em Start.

    Exemplo resolvido. Um jogo tem personagens. Cada um tem um nome, saúde (começando em 100) e uma posição dada por X e Y. Escreva uma classe Character com um construtor e um método Move(DX, DY); então uma subclass Wizard que adiciona Mana (começando em 50) e um método CastSpell() que consome 10 mana e retorna TRUE se houvesse suficiente.

    CLASS Character
        PRIVATE Name : STRING
        PRIVATE Health : INTEGER
        PRIVATE X : INTEGER
        PRIVATE Y : INTEGER
        PUBLIC PROCEDURE NEW(NewName : STRING, StartX : INTEGER, StartY : INTEGER)
            Name ← NewName
            Health ← 100
            X ← StartX
            Y ← StartY
        ENDPROCEDURE
        PUBLIC PROCEDURE Move(DX : INTEGER, DY : INTEGER)
            X ← X + DX
            Y ← Y + DY
        ENDPROCEDURE
    ENDCLASS
    
    CLASS Wizard INHERITS Character
        PRIVATE Mana : INTEGER
        PUBLIC PROCEDURE NEW(NewName : STRING, StartX : INTEGER, StartY : INTEGER)
            SUPER.NEW(NewName, StartX, StartY)
            Mana ← 50
        ENDPROCEDURE
        PUBLIC FUNCTION CastSpell() RETURNS BOOLEAN
            IF Mana >= 10 THEN
                Mana ← Mana - 10
                RETURN TRUE
            ELSE
                RETURN FALSE
            ENDIF
        ENDFUNCTION
    ENDCLASS
    

    As marcas são para atributos privados, um construtor que define todos os atributos, a linha de herança, a chamada ao construtor do pai e um método que usa e altera os dados próprios do objeto. Quando a questão pede um diagrama de classe, desenhe uma caixa em três partes (nome; atributos com - para privado; métodos com + para público) e junte uma subclasse a seu pai com uma seta apontando para o pai.

    Programação declarativa

    Em programação declarativa 声明式编程, você diz o que calcular, não como — a execução decide os passos. Dois tipos:

    • programação funcional 函数式编程 — construída a partir de funções puras 纯函数 (sem efeitos colaterais 副作用; mesma entrada sempre gera mesma saída) compostas entre si. Exemplos: Haskell, Lisp.
    • programação lógica 逻辑编程 — declara fatos e regras; o motor responde a um objetivo (interrogação) por inferência. Exemplo: Prolog.

    Um exemplo familiar de programação declarativa é SQL 结构化查询语言: SELECT * FROM Customer WHERE Country = 'UK' diz o que você quer, não como percorrer os registros.

    Fatos, regras e objetivos são o que as provas testam no paradigma declarativo. Dados esses fatos 事实 (afirmações verdadeiras) e uma regra 规则 (uma conclusão válida quando suas condições forem válidas):

    01 type(leopard, wild).
    02 type(lion, wild).
    03 type(tabby, domestic).
    04 size(leopard, large).
    05 size(lion, large).
    06 size(tabby, small).
    07 dangerous(X) IF type(X, wild) AND size(X, large).
    

    "Escreva o resultado do objetivo type(X, wild)":* X = leopard, X = lion. O motor compara o objetivo com cada fato sequencialmente; toda correspondência é uma solução, e uma letra maiúscula é uma variável preenchida pela correspondência. "Escreva um fato para mostrar que um guepardo é selvagem": type(cheetah, wild). "Explique o que a linha 07 faz": ela define uma regra com a conclusão dangerous(X), que é verdadeira para qualquer X que seja tanto selvagem quanto grande, então dangerous(A) retorna A = leopard, A = lion. "Escreva uma regra: um recurso F pode estar disponível para um estilo de carroceria B se F for um recurso e B for um estilo de carroceria e F não estiver indisponível para B": may_be_available(F, B) IF feature(F) AND body_style(B) AND NOT unavailable(F, B). Copie exatamente os nomes dos predicados e a ordem dos argumentos usados nos fatos da questão; um novo fato termina com ponto final, e as condições de uma regra são unidas por AND.

    Comparando paradigmas

    Paradigma Força Linguagens típicas
    Baixo nível controle máximo, velocidade assembly
    Imperativa direta, intuitiva C, Python
    Orientada a objetos modular, modela entidades Java, C#, Python
    Funcional clara, sem efeitos colaterais Haskell, F#
    Lógica inferência, regras Prolog
    Banco de dados consultas de dados SQL

    Linguagens modernas frequentemente misturam paradigmas — Python suporta todos os de procedural, POO e funcional. A escolha depende do problema.

    Explorar

    Laboratório de conceito de programação

    Conecte exemplos à ideia de programação que eles mostram.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    programming paradigm/ˈprəʊɡræmɪŋ ˈpærədaɪm/ 编程范式 biān chéng fàn shì
    facts/fækts/ 事实 shì shí
    rule/ruːl/ 规则 guī zé
    low-level/ləʊ ˈlevl/ 低级 dī jí
    registers/ˈredʒɪstəz/ 寄存器 jì cún qì
    memory addresses/ˈmeməri əˈdresɪz/ 内存地址 nèi cún dì zhǐ
    objects/ˈɒbdʒekts/ 对象 duì xiàng
    attributes/ˈætrɪbjuːts/ 属性 shǔ xìng
    methods/ˈmeθədz/ 方法 fāng fǎ
    machine code/məˈʃiːn kəʊd/ 机器码 jī qì mǎ
    assembly language/əˈsemblɪ ˈlæŋɡwɪdʒ/ 汇编语言 huì biān yǔ yán
    addressing modes/əˈdresɪŋ məʊdz/ 寻址方式 xún zhǐ fāng shì
    classes/ˈklæsɪz/ 类 lèi
    encapsulation/ɪnˌkæpsjʊˈleɪʃn/ 封装 fēng zhuāng
    inheritance/ɪnˈherɪtəns/ 继承 jì chéng
    subclass/ˈsʌbklæs/ 子类 zi lèi
    superclass/ˈsuːpəklæs/ 父类 fù lèi
    overriding/ˌəʊvəˈraɪdɪŋ/ 重写 chóng xiě
    polymorphism/ˈpɒlɪmɔːfɪzəm/ 多态 duō tài
    abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    aggregation/ˌæɡrɪˈɡeɪʃn/ 聚合 jù hé
    containment/kənˈteɪnmənt/ 包含 bāo hán
    declarative programming/dɪˈklærətɪv ˈprəʊɡræmɪŋ/ 声明式编程 shēng míng shì biān chéng
    functional programming/ˈfʌŋkʃənl ˈprəʊɡræmɪŋ/ 函数式编程 hán shù shì biān chéng
    pure functions/pjʊə ˈfʌŋkʃnz/ 纯函数 chún hán shù
    side effects/saɪd ɪˈfekts/ 副作用 fù zuò yòng
    logic programming/ˈlɒdʒɪk ˈprəʊɡræmɪŋ/ 逻辑编程 luó jí biān chéng
    SQL/ˌes kjuː ˈel/ 结构化查询语言 jié gòu huà chá xún yǔ yán
    20.2

    Processamento de arquivos

    Programa
    Os candidatos devem ser capazes de: Notas e orientações
    Escrever código para realizar operações de processamento de arquivos Abrir (no modo leitura, escrita, anexar) e fechar um arquivo Ler um registro de um arquivo e escrever um registro em um arquivo Realizar operações de processamento de arquivos em arquivos série, sequenciais, aleatórios
    Demonstre compreensão de uma exception e da importância do exception handling Saiba quando é apropriado usar exception handling Escreva código de programa para usar exception handling

    Fonte: Programa Cambridge International

    Isso estende o manuseio de arquivo 文件 do Tema 10, processando arquivos seriais, sequenciais e aleatórios (acesso direto). Operações em pseudocódigo: OPENFILE name FOR READ | WRITE | APPEND (READ abre um arquivo existente, WRITE cria/sobrescreve, APPEND adiciona ao final); READFILE name, line; WRITEFILE name, value; CLOSEFILE name; e EOF(name) que é VERDADEIRO no final.

    Leia um arquivo inteiro:

    OPENFILE "names.txt" FOR READ
    WHILE NOT EOF("names.txt") DO
        READFILE "names.txt", thisName
        OUTPUT thisName
    ENDWHILE
    CLOSEFILE "names.txt"
    

    Pesquise um arquivo (pare ao encontrar):

    found ← FALSE
    OPENFILE "people.txt" FOR READ
    WHILE NOT EOF("people.txt") AND NOT found DO
        READFILE "people.txt", line
        IF line = target THEN
            found ← TRUE
        ENDIF
    ENDWHILE
    CLOSEFILE "people.txt"
    

    Atualizando um arquivo in-place

    A maioria das linguagens não pode editar um arquivo de texto in-place. Em vez disso: abra o original para READ e um arquivo temporário para WRITE; para cada linha, escreva a nova versão se deve mudar, senão a original; feche ambos; depois substitua o original pelo arquivo temporário. O mesmo padrão lida com exclusão de linhas (pule-as) e inserção de linhas.

    Atualizando um arquivo in-place: leia o arquivo original, escreva as linhas alteradas para um arquivo temp, depois substitua o original pelo arquivo temp
    Atualizando um arquivo in-place: leia o original, escreva alterações para um arquivo temp, depois substitua o original

    Registros e arquivos de acesso aleatório

    Modos de abertura. READ: o arquivo deve existir e a leitura começa no início. WRITE: um arquivo novo é criado, e um arquivo existente desse nome é sobrescrito. APPEND: a escrita adiciona ao final de um arquivo existente. Todo arquivo aberto é fechado com CLOSEFILE, e EOF(name) é TRUE quando o último item foi lido.

    Três organizações de arquivos. Em um arquivo serial, os registros estão na ordem em que foram adicionados; em um arquivo sequencial, estão em ordem de chave; ambos são lidos do início. Um arquivo aleatório 随机文件 (arquivo de acesso direto) armazena cada registro em um endereço calculado a partir de sua chave por uma função de hashing 哈希, permitindo encontrar um registro sem ler os outros. Registros são declarados como tipo definido pelo usuário:

    TYPE AccountRecord
        DECLARE AccNo : INTEGER
        DECLARE Name : STRING
        DECLARE Balance : REAL
        DECLARE Active : BOOLEAN
    ENDTYPE
    
    Uma chave 2317 hashada com MOD 1000 para o endereço 317, então SEEK e GETRECORD no arquivo Acc.dat, mostrado como uma fileira de slots de registro de tamanho igual com o slot 317 destacado
    Encontrando um registro em um arquivo aleatório: a chave é hashada para um endereço, o ponteiro do arquivo vai diretamente até aquele slot e o registro é lido; nenhum outro registro é tocado

    As operações de arquivo aleatório em pseudocódigo são OPENFILE "Acc.dat" FOR RANDOM, SEEK "Acc.dat", Address (move o ponteiro do arquivo para esse registro), GETRECORD "Acc.dat", Rec (lê o registro ali) e PUTRECORD "Acc.dat", Rec (escreve o registro ali). Encontrar um cliente por número de conta, conforme definido no Paper 3:

    DECLARE Rec : AccountRecord
    DECLARE Target, Address : INTEGER
    INPUT Target
    Address ← Target MOD 1000              // the hashing function
    OPENFILE "Acc.dat" FOR RANDOM
    SEEK "Acc.dat", Address
    GETRECORD "Acc.dat", Rec
    WHILE Rec.AccNo <> Target AND Rec.AccNo <> 0    // 0 marks an empty slot
        Address ← Address + 1               // a collision: try the next slot
        SEEK "Acc.dat", Address
        GETRECORD "Acc.dat", Rec
    ENDWHILE
    IF Rec.AccNo = Target THEN
        OUTPUT Rec.Name, Rec.Balance
    ELSE
        OUTPUT "No such account"
    ENDIF
    CLOSEFILE "Acc.dat"
    

    Para armazenar um registro, hashie sua chave, SEEK para o endereço e PUTRECORD, avançando sobre qualquer slot já ocupado. Marcas vão para o hash, o SEEK antes do GET ou PUT, a comparação com o alvo, o tratamento de colisão e o fechamento do arquivo.

    Exemplo resolvido. ActiveFile.dat contém AccountRecord registros. Escreva pseudocódigo que copie todos os registros cujo campo Active seja FALSE para o final de ArchiveFile.dat.

    DECLARE Rec : AccountRecord
    OPENFILE "ActiveFile.dat" FOR READ
    OPENFILE "ArchiveFile.dat" FOR APPEND
    WHILE NOT EOF("ActiveFile.dat")
        READFILE "ActiveFile.dat", Rec
        IF Rec.Active = FALSE THEN
            WRITEFILE "ArchiveFile.dat", Rec
        ENDIF
    ENDWHILE
    CLOSEFILE "ActiveFile.dat"
    CLOSEFILE "ArchiveFile.dat"
    

    Arquivos de texto em Python (Paper 4): file = open("HighScore.txt", "r"), depois for line in file: com line.strip() e line.split(",") para separar os campos, int(…) para converter uma pontuação, e file.close(); para escrever, open(name, "w") (ou "a" para anexar) e file.write(str(score) + "\n"). Uma tabela de maiores pontuações é lida em uma lista de registros, a nova pontuação inserida em seu lugar, e toda a lista reescrita. O examinador atribui marcas pela abertura com modo correto, um laço que lê cada linha, a conversão de texto para números e o fechamento.

    Armadilhas

    Esquecer de fechar um arquivo (dados podem ser perdidos); abrir para WRITE quando queria APPEND (sobrescreve tudo); ler além de EOF; caminhos fixos — um caminho como /Users/Admin/data.txt falha em outra máquina, então use uma constante relativa como DataFile = "./data/scores.txt".

    Explorar

    Rota de acesso a arquivo

    Siga um arquivo do armazenamento ao programa e de volta com segurança.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    file/faɪl/ 文件 wén jiàn
    random file/ˈrændəm faɪl/ 随机文件 suí jī wén jiàn
    hashing/ˈhæʃɪŋ/ 哈希 hā xī
    20.2

    Tratamento de exceções

    Uma exceção 异常 é um erro ou condição inesperada durante a execução — divisão por zero, arquivo não encontrado, falha de rede, índice de array 数组 fora do intervalo. Tratamento de exceções 异常处理 permite que um programa detecte isso e responda graciosamente em vez de travar.

    Importa porque programas reais enfrentam erros que não podem ser prevenidos antecipadamente (arquivos movidos, redes caídas, entrada inválida); sem isso, cada operação precisaria de sua própria verificação IF; e separa o fluxo normal do tratamento de erros, mantendo o caminho principal limpo. Por exemplo, um arquivo pode ser deletado por outro usuário entre seu programa verificar que existe e realmente abri-lo — você não pode prevenir isso, apenas lidar com a falha quando ocorrer.

    "Descreva, com um exemplo, o que significa uma exceção (duas marcas). Um evento inesperado ou erro que ocorre durante a execução de um programa (em tempo de execução) e interrompe seu fluxo normal; por exemplo, dividir por zero, abrir um arquivo que não existe, converter entrada não numérica em inteiro, índice de array fora do intervalo ou esgotar memória. "Identifique duas possíveis causas de exceções" é respondido a partir dessa lista, mais "um dispositivo ou rede não está disponível" e "tipo de dado inválido inserido".

    "Enumere as razões para incluir tratamento de exceções (três marcas). Para evitar que o programa trave (termine inesperadamente); para exibir uma mensagem significativa ao usuário em vez de um erro do sistema; para permitir que o programa recupere e continue, por exemplo pedindo a entrada novamente, ou fechar arquivos com segurança antes de terminar; e porque alguns erros não podem ser previstos quando o programa é escrito. "Descreva como evitar o término do programa devido a uma exceção: coloque as instruções que poderiam levantar uma exceção dentro de um bloco TENTAR; escreva um bloco EXCEPT (catch) para essa exceção que a trate, por exemplo exibindo uma mensagem, para que a execução continue após o bloco em vez de parar. "Explique o que significa tratamento de exceções: detectar uma exceção quando ocorre e executar código (o manipulador) que a lidem para que o programa continue.

    Padrão

    TRY
        OPENFILE "data.txt" FOR READ
        READFILE "data.txt", line
        OUTPUT line
        CLOSEFILE "data.txt"
    EXCEPT FileNotFound
        OUTPUT "Sorry, the file does not exist."
    EXCEPT ReadError
        OUTPUT "Sorry, error reading the file."
    ENDTRY
    

    O bloco TRY contém o código que pode falhar; o primeiro bloco EXCEPT correspondente é executado. Linguagens reais também têm um catch-all EXCEPT e um bloco FINALLY que roda independentemente de exceção ter ocorrido — útil para limpeza (fechar arquivos).

    Fluxo de exceção: se o bloco TRY levanta uma exceção, o controle salta para o EXCEPT correspondente; sem exceção, é pulado. De qualquer forma, o bloco FINALLY roda, depois o programa continua
    Fluxo de exceção: uma exceção salta para o EXCEPT correspondente; FINALLY sempre roda antes do programa continuar

    Levantando uma exceção

    Uma subrotina que detecta um erro pode levantar 抛出 uma exceção para que o chamador a trate:

    PROCEDURE Divide(a : INTEGER, b : INTEGER) RETURNS INTEGER
        IF b = 0 THEN
            RAISE DivideByZero
        ENDIF
        RETURN a DIV b
    ENDPROCEDURE
    

    Onde tratar exceções

    Trate-as perto do erro se a resposta for simples (uma mensagem, uma retrial), ou mais acima na pilha de chamada 调用栈 se apenas o código externo souber o que fazer (um loop GUI de nível superior registra o erro e mostra um diálogo amigável). Não engula exceções silenciosamente — pelo menos registre-as, caso contrário a depuração torna-se impossível.

    Exceções comuns: FileNotFound, IOError, DivisionByZero, IndexOutOfRange, InvalidArgument, NullReference, OutOfMemory. Envolver cada operação falhante em um TRY com manipuladores EXCEPT adequados dá a um programa que degrada graciosamente em vez de travar.

    Exemplo resolvido (Paper 4). Escreva uma função que leia números inteiros, um por linha, de um arquivo cujo nome é passado como parâmetro e os retorne em uma lista. Ela não deve travar se o arquivo não existir ou uma linha não for um número inteiro.

    def read_scores(filename):
        scores = []
        try:
            file = open(filename, "r")
            for line in file:
                scores.append(int(line))
            file.close()
        except FileNotFoundError:
            print("The file", filename, "does not exist")
        except ValueError:
            print("A line in the file was not a whole number")
        return scores
    

    O bloco try contém o código que pode falhar (a abertura e a conversão); cada except nomeia uma exceção e faz algo útil; a função ainda retorna uma lista, então o chamador continua. Em Java a mesma estrutura é try { … } catch (FileNotFoundException e) { … } catch (NumberFormatException e) { … }; em VB.NET Try … Catch ex As FileNotFoundException … End Try. Marcas: as instruções arriscadas dentro do try, os nomes corretos de exceção, uma mensagem para cada, e o programa continuando depois; um catch-all except: ganha a marca de crash mas não a de "exceção apropriada".

    Exemplo resolvido. Um arquivo de texto com membros precisa que o número de telefone de um membro seja alterado. Por que o programa não pode simplesmente sobrescrever essa linha, e qual é o padrão? As linhas de um arquivo de texto têm comprimentos diferentes, e o arquivo não possui espaços para absorver a diferença: uma substituição mais longa invadiria o próximo registro, e uma mais curta deixaria parte da linha antiga para trás. Portanto, o padrão consiste em abrir o original para LEITURA e um arquivo temporário para ESCRITA, ler cada linha sequencialmente, escrever a versão nova para a linha que muda e a linha original para todas as outras, fechar ambos e, em seguida, substituir o original pelo arquivo temporário. A mesma estrutura serve para excluir (omitar a linha) e inserir (escrever a linha extra). Observe que todas as linhas são escritas, não apenas a alterada — escrever apenas o novo registro e perder o resto do arquivo é um erro clássico.

    Explorar

    Como o tratamento de exceções flui

    Passe passo a passo sobre o que acontece quando o código falha. A exceção salta fora do fluxo normal para um manipulador, FINALLY limpa de qualquer forma, e o programa continua em vez de travar.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    array/əˈreɪ/ 数组 shù zǔ
    imperative programming/ɪmˈperətɪv ˈprəʊɡræmɪŋ/ 命令式编程 mìng lìng shì biān chéng
    Variables/ˈveərɪəblz/ 变量 biàn liàng
    object-oriented programming/ˈɒbdʒekt ˈɔːrɪəntɪd ˈprəʊɡræmɪŋ/ 面向对象编程 miàn xiàng duì xiàng biān chéng
    instances/ˈɪnstənsɪz/ 实例 shí lì
    exception/ekˈsepʃn/ 异常 yì cháng
    exception handling/ekˈsepʃn ˈhændlɪŋ/ 异常处理 yì cháng chǔ lǐ
    raise/reɪz/ 抛出 pāo chū
    call stack/kɔːl stæk/ 调用栈 diào yòng zhàn
    20.2

    Definições aceitas pelo examinador

    Uma questão de definição é avaliada contra wording fixo. Aprenda estas exatamente, e dê apenas uma resposta.

    Termo Definição
    paradigma de programação um estilo ou modo de programar, com sua própria forma de estruturar um programa
    linguagem imperativa o programa é uma sequência de instruções que alteram o estado do programa; o programador diz como a tarefa é realizada
    linguagem declarativa o programa declara fatos e regras, e o motor de inferência descobre como encontrar a resposta
    classe um modelo que define os atributos e métodos dos objetos desse tipo
    objeto (instância) uma ocorrência de uma classe, com seus próprios valores para os atributos
    atributo um item de dados pertencente a uma classe
    método um procedimento ou função pertencente a uma classe e que atua sobre seus atributos
    encapsulamento manter os atributos e métodos juntos em uma classe e restringir o acesso externo aos dados, de modo que sejam alterados apenas por meio de métodos públicos
    herança uma subclasse adquire os atributos e métodos de sua superclasse e pode adicioná-los ou sobrescrevê-los
    polimorfismo métodos com o mesmo nome que se comportam de maneira diferente para classes distintas
    construtor um método que é executado quando um objeto é criado e inicializa seus atributos
    contenção uma classe possui um objeto de outra classe como um de seus atributos
    fato uma afirmação em um programa declarativo que é verdadeira
    regra uma conclusão que vale quando suas condições são verdadeiras
    arquivo serial, sequencial, aleatório registros na ordem em que foram adicionados; registros em ordem de chave; cada registro em um endereço calculado a partir de sua chave
    exceção um erro ou evento inesperado durante a execução que interrompe o fluxo normal
    tratamento de exceções detectar uma exceção quando ela ocorre e executar código que a trata, para que o programa continue
    20.2

    Dicas de prova

    • Paradigmas: saiba a descrição de uma linha de cada um e esteja pronto para nomear o paradigma a partir de um trecho de código; perguntas de nível baixo exigem os cinco modos de endereçamento e o que o acumulador recebe.
    • Definições de POO aparecem em toda sessão: classe, objeto, atributo, método, encapsulamento, herança, polimorfismo, construtor. Escreva uma classe em pseudocódigo com atributos PRIVADOS, um CONSTRUTOR PÚBLICO e getters; uma subclasse com HERDA e SUPER.CONSTRUTOR.
    • Declarativa: um objetivo com uma variável retorna todos os fatos correspondentes; uma regra é uma conclusão SE condições unidas com E; copie exatamente os nomes dos predicados da questão.
    • Arquivos: os três modos e o que cada um faz com um arquivo existente; READFILE em um loop WHILE NOT EOF; arquivos aleatórios usam hash, SEEK, GETRECORD e PUTRECORD, com colisão de passo-over.
    • Exceções: definição com exemplo, três razões para tratá-las, e TRY com EXCEPT nomeado que permite ao programa continuar.

    Erros comuns

    • Descrever um programa declarativo como "uma sequência de passos que dá a resposta"; ele declara o que é verdadeiro e o que se deseja, não como.
    • Confundir um objeto com uma classe, ou uma instância com um atributo; a pergunta "uma ocorrência de um objeto" quer dizer instância.
    • Declarar os atributos PÚBLICOS, ou acessá-los de fora da classe em vez de por meio de um getter, o que perde as marcas de encapsulamento.
    • O construtor de uma subclasse que define diretamente os atributos do pai em vez de chamar SUPER.CONSTRUTOR.
    • Explicar polimorfismo como "muitos objetos"; é o mesmo nome de método se comportando diferentemente para classes distintas.
    • Abrir um arquivo FOR WRITE para adicionar um registro, o que destrói o conteúdo existente; use APPEND.
    • Ler um arquivo aleatório do início; USE SEEK no endereço hash primeiro.
    • Colocar o manipulador de exceções ao redor de código que não pode falhar, ou capturar tudo sem mensagem, ou descrever tratamento de exceções como "verificar a entrada com IF".

Entrar ou criar conta

IGCSE, A-Level & AP