Pular para o conteúdo
Matérias

Ciência da Computação A do AP

Dicas

AP Computer Science A é um curso de Java: objetos e classes, tipos primitivos e fluxo de controle, escrita de classes, arrays e ArrayLists, arrays 2D, herança e polimorfismo e recursão. É um primeiro curso de programação ensinado com código orientado a objetos real, não pseudocódigo.

Todas as quatro questões de resposta discursiva são Java manuscritas. Nenhum compilador detectará um ponto e vírgula faltante ou tipo de retorno errado para você, então escreva código no papel durante a revisão — é uma habilidade diferente de digitá-lo.

Arrays e ArrayLists são o tópico mais testado. Ser fluente com travessia, inserção e remoção, e saber qual índice muda ao remover um elemento, rende mais do que qualquer outra hora individual de prática.

As notas cobrem as unidades do CED em Java, com exemplos executáveis que podem ser editados no navegador. Anteriores FRQs e diretrizes de pontuação estão na biblioteca — todas as quatro são questões de escrita de código, portanto as respostas resolvidas são métodos completos, não fragmentos.

  • 1

    Usando Objetos e Métodos

    Assistir aula
    1.1

    Introdução a Algoritmos, Programação e Compiladores

    Programa

    Objetivo de Aprendizagem 1.1.A: Representar padrões e algoritmos encontrados no cotidiano usando linguagem escrita ou diagramas.

    • 1.1.A.1 Algoritmos definem processos passo a passo a seguir ao completar uma tarefa ou resolver um problema. Esses algoritmos podem ser representados usando linguagem escrita ou diagramas.
    • 1.1.A.2 Sequenciamento define uma ordem para quando as etapas de um processo são concluídas. As etapas de um processo são concluídas uma de cada vez.

    Objetivo de Aprendizagem 1.1.B: Explicar o processo de compilação e execução de código.

    • 1.1.B.1 Código pode ser escrito em qualquer editor de texto; no entanto, um ambiente integrado de desenvolvimento (IDE) é frequentemente usado para escrever programas porque fornece ferramentas para um programador escrever, compilar e executar código.
    • 1.1.B.2 Um compilador verifica o código quanto a alguns erros. Erros detectáveis pelo compilador precisam ser corrigidos antes que o programa possa ser executado.

    Objetivo de Aprendizagem 1.1.C: Identificar tipos de erros de programação.

    • 1.1.C.1 Um erro de sintaxe é um erro no programa em que as regras da linguagem de programação não são seguidas. Esses erros são detectados pelo compilador.
    • 1.1.C.2 Um erro de lógica é um erro no algoritmo ou programa que faz com que ele se comporte incorretamente ou inesperadamente. Esses erros são detectados testando o programa com dados específicos para ver se ele produz o resultado esperado.
    • 1.1.C.3 Um erro de tempo de execução é um erro no programa que ocorre durante a execução de um programa. Erros de tempo de execução geralmente causam a terminação anormal do programa.
    • 1.1.C.4 Uma exceção é um tipo de erro de tempo de execução que ocorre como resultado de um erro inesperado que não foi detectado pelo compilador. Ela interrompe o fluxo normal de execução do programa.

    Fonte: College Board AP Course and Exam Description

    Código-fonte em uma estação de trabalho — programas são escritos, compilados e executados como instruções precisas
    Código-fonte em uma estação de trabalho — programas são escritos, compilados e executados como instruções precisas

    Um algoritmo 算法 é um procedimento finito e passo a passo que resolve um problema. Um programa 程序 expressa um algoritmo em uma linguagem que um computador pode executar. Java é compilado 编译: o compilador 编译器 traduz seu código-fonte em bytecode, que a Máquina Virtual Java (JVM) executa. Um erro de sintaxe 语法错误 (quebra a gramática) é capturado pelo compilador; um erro lógico 逻辑错误 (resultado errado) não é – o programa roda, mas se comporta mal.

    Um compilador traduz todo o programa de uma vez; um interpretador o executa linha por linha
    Um compilador traduz todo o programa de uma vez; um interpretador o executa linha por linha
    Vários chips de processador de computador vistos de baixo
    Seu programa Java é compilado em instruções que uma CPU, como estas, realmente executa
    Vocabulário Treinar
    Inglês Chinês Pinyin
    algorithm/ˈælɡərɪθəm/ 算法 suàn fǎ
    program/ˈprəʊɡræm/ 程序 chéng xù
    compiled/kəmˈpaɪld/ 编译 biān yì
    compiler/kəmˈpaɪlə/ 编译器 biān yì qì
    syntax error/ˈsɪntæks ˈerə/ 语法错误 yǔ fǎ cuò wù
    logic error/ˈlɒdʒɪk ˈerə/ 逻辑错误 luó jí cuò wù
    variable/ˈveərɪəbl/ 变量 biàn liàng
    1.2

    Variáveis e Tipos de Dados

    Programa

    Objetivo de Aprendizagem 1.2.A: Identificar a categoria de tipo de dado mais apropriada para uma especificação particular.

    • 1.2.A.1 Um tipo de dado é um conjunto de valores e um conjunto correspondente de operações sobre esses valores. Tipos de dados podem ser categorizados como primitivos ou referência.
    • 1.2.A.2 Os tipos de dados primitivos usados neste curso definem o conjunto de valores e operações correspondentes sobre esses valores para números e valores Booleanos.
    • 1.2.A.3 Um tipo referência é usado para definir objetos que não são tipos primitivos.

    Objetivo de Aprendizagem 1.2.B: Desenvolver código para declarar variáveis para armazenar números e valores Booleanos.

    • 1.2.B.1 Os três tipos de dados primitivos usados neste curso são int, double e boolean. Um valor int é um número inteiro. Um valor double é um número real. Um valor boolean é ou true ou false.
      • Declaração de exclusão: Os outros cinco tipos de dados primitivos (long, short, byte, float e char) estão fora do escopo do curso e exame AP Computer Science A.
    • 1.2.B.2 Uma variável é um local de armazenamento que segura um valor, que pode mudar enquanto o programa está em execução. Toda variável tem um nome e um tipo de dado associado. Uma variável de um tipo primitivo armazena um valor primitivo desse tipo.

    Fonte: College Board AP Course and Exam Description

    Uma variável 变量 é uma caixa nomeada que armazena um valor de um tipo tipo fixo. Os principais tipos primitivos 基本类型 do Java são int (números inteiros), double (decimais) e boolean (true/false). Declare com o tipo primeiro:

    Tipos de dados básicos do Java, cada um armazenando um tipo diferente de valor
    Tipos de dados básicos do Java, cada um armazenando um tipo diferente de valor
    int score = 90;
    double price = 4.99;
    boolean passed = true;
    
    Explorar

    Explorar como uma variável armazena um valor de cada vez

    Uma variável é uma caixa nomeada que armazena um valor de um tipo fixo. Avance pelas linhas e observe cada caixa assumir seu valor; note que reassignar score sobrescreve o número antigo em vez de criar uma nova caixa.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    type/taɪp/ 类型 lèi xíng
    primitive types/ˈprɪmɪtɪv taɪps/ 基本类型 jī běn lèi xíng
    expression/ekˈspreʃn/ 表达式 biǎo dá shì
    modulus/ˈmɒdjʊləs/ 取模 qǔ mó
    escape sequence/eˈskeɪp ˈsiːkwəns/ 转义序列 zhuǎn yì xù liè
    assignment/əˈsaɪnmənt/ 赋值 fù zhí
    1.3

    Expressões e Saída

    Programa

    Objetivo de Aprendizagem 1.3.A: Desenvolver código para gerar saída e determinar o resultado que seria exibido.

    • 1.3.A.1 System.out.print e System.out.println exibem informações na tela do computador. System.out.println move o cursor para uma nova linha após a informação ser exibida, enquanto System.out.print não faz isso.

    Objetivo de Aprendizagem 1.3.B: Desenvolver código para utilizar literais de string e determinar o resultado de usar literais de string.

    • 1.3.B.1 Um literal é a representação de código de um valor fixo.
    • 1.3.B.2 Um literal de string é uma sequência de caracteres entre aspas duplas.
    • 1.3.B.3 Sequências de escape são sequências especiais de caracteres que podem ser incluídas numa string. Começam com um \ e têm um significado especial em Java. As sequências de escape usadas neste curso incluem aspas duplas \", barra invertida \\, e nova linha \n.

    Objetivo de Aprendizagem 1.3.C: Desenvolver código para expressões aritméticas e determinar o resultado dessas expressões.

    • 1.3.C.1 Expressões aritméticas, que consistem em valores numéricos, variáveis e operadores, incluem expressões do tipo int e double.
    • 1.3.C.2 Os operadores aritméticos consistem em adição +, subtração -, multiplicação *, divisão / e resto %. Uma operação aritmética que usa dois valores int avaliará para um valor int. Uma operação aritmética que usa pelo menos um valor double avaliará para um valor double.
      • Declaração de exclusão: Expressões que resultam em valores double especiais (p.ex., infinitos e NaN) estão fora do escopo do curso e exame AP Computer Science A.
    • 1.3.C.3 Ao dividir valores numéricos que são ambos valores int, o resultado é apenas a porção inteira do quociente. Ao dividir valores numéricos que usam pelo menos um valor double, o resultado é o quociente.
    • 1.3.C.4 O operador de resto % é usado para calcular o resto quando um número a é dividido por outro número b.
      • Declaração de exclusão: O uso de valores menores que 0 para a e o uso de valores menores ou iguais a 0 para b está fora do escopo do curso e exame AP Computer Science A.
    • 1.3.C.5 Operadores podem ser usados para construir expressões compostas. Em tempo de compilação, valores numéricos são associados a operadores de acordo com a precedência dos operadores para determinar como eles são agrupados. Parênteses podem ser usados para modificar a precedência dos operadores. Multiplicação, divisão e resto têm precedência sobre adição e subtração. Operadores com a mesma precedência são avaliados da esquerda para a direita.
    • 1.3.C.6 Uma tentativa de dividir um inteiro pelo inteiro zero resultará em um ArithmeticException.
      • Declaração de exclusão: O uso de divisão por zero quando um valor numérico é um double está fora do escopo do curso e exame AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Uma expressão 表达式 combina valores e operadores para computar um resultado: + - * / e % (módulo 取模, o resto). Divisão inteira truncata: 7 / 2 é 3, enquanto 7 % 2 é 1. Precedência de operadores segue a matemática (*,/,% antes de +,-). Imprima com:

    System.out.print("no newline");
    System.out.println("with newline");
    

    Dividir um inteiro pelo inteiro 0 (como 7 / 0) não é permitido e causa um erro de ArithmeticException em tempo de execução. Dentro de uma string, uma barra invertida marca uma sequência de escape 转义序列: \" imprime uma aspa dupla, \\ uma barra invertida simples, e \n inicia uma nova linha – então System.out.println("She said \"hi\""); imprime She said "hi".

    Explorar

    Explorar a ordem das operações passo a passo

    Java aplica *, /, % antes de + e -, trabalhando da esquerda para a direita. Observe cada etapa e veja por que 2 + 3 * 4 é $14$, não $20$ — a multiplicação acontece primeiro.

    1.4

    Instruções de Atribuição e Entrada

    Programa

    Objetivo de Aprendizagem 1.4.A: Desenvolver código para instruções de atribuição com expressões e determinar o valor que é armazenado na variável como resultado dessas instruções.

    • 1.4.A.1 Toda variável deve receber um valor antes de poder ser usada em uma expressão. Esse valor deve ser de um tipo de dado compatível. Uma variável é inicializada na primeira vez em que recebe um valor. Tipos referência podem receber um novo objeto ou null se não houver objeto. O literal null é um valor especial usado para indicar que uma referência não está associada a nenhum objeto.
    • 1.4.A.2 O operador de atribuição = permite que um programa inicialize ou mude o valor armazenado em uma variável. O valor da expressão à direita é armazenado na variável à esquerda.
      • Declaração de exclusão: O uso de operadores de atribuição dentro de expressões (p. ex., a = b = 4; ou a[i += 5]) está fora do escopo do curso e do exame de AP Computer Science A.
    • 1.4.A.3 Durante a execução, uma expressão é avaliada para produzir um único valor. O valor de uma expressão tem um tipo baseado na avaliação da expressão.

    Objetivo de Aprendizagem 1.4.B: Desenvolver código para ler entrada.

    • 1.4.B.1 A entrada pode vir em várias formas, como tátil, áudio, visual ou texto. A classe Scanner é uma forma de obter entrada de texto pelo teclado.
      • Declaração de exclusão: Qualquer forma específica de entrada do usuário está fora do escopo do curso e do exame de AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Uma atribuição 赋值 x = expr; avalia o lado direito e armazena na variável esquerda. Leia entrada usando um Scanner:

    Scanner in = new Scanner(System.in);
    int age = in.nextInt();
    String name = in.next();
    
    1.5

    Cast e Faixa de Variáveis

    Programa

    Objetivo de Aprendizagem 1.5.A: Desenvolver código para fazer cast de valores primitivos para diferentes tipos primitivos em expressões aritméticas e determinar o valor produzido como resultado.

    • 1.5.A.1 Os operadores de cast (int) e (double) podem ser usados para converter de um valor double para um valor int (ou vice-versa).
    • 1.5.A.2 Fazer cast de um valor double para um valor int causa a truncagem dos dígitos à direita da vírgula decimal.
    • 1.5.A.3 Algum código causa que valores int sejam automaticamente convertidos (ampliados) para valores double.
    • 1.5.A.4 Valores do tipo double podem ser arredondados para o inteiro mais próximo por (int)(x + 0.5) para números não negativos ou (int)(x - 0.5) para números negativos.

    Objetivo de Aprendizagem 1.5.B: Descrever condições em que uma expressão inteira avalia para um valor fora do intervalo.

    • 1.5.B.1 A constante Integer.MAX_VALUE armazena o valor do maior possível valor int. A constante Integer.MIN_VALUE armazena o valor do menor possível valor int.
    • 1.5.B.2 Valores inteiros no Java são representados por valores do tipo int, que são armazenados usando uma quantidade finita (4 bytes) de memória. Portanto, um valor int deve estar no intervalo de Integer.MIN_VALUE a Integer.MAX_VALUE inclusive.
    • 1.5.B.3 Se uma expressão avaliasse para um valor int fora do intervalo permitido, ocorre um overflow inteiro. O resultado é um valor int no intervalo permitido, mas não necessariamente o valor esperado.

    Objetivo de Aprendizagem 1.5.C: Descrever condições que limitam a precisão de expressões.

    • 1.5.C.1 Computadores alocam uma quantidade especificada de memória para armazenar dados com base no tipo de dado. Se uma expressão avaliasse para um double que seja mais preciso do que pode ser armazenado na quantidade alocada de memória, ocorre um erro de arredondamento. O resultado será arredondado para o valor representável. Para evitar erros de arredondamento que ocorrem naturalmente, use valores int.
      • Declaração de exclusão: Outros tipos de dados decimais especiais que podem ser usados para evitar erros de arredondamento estão fora do escopo do curso e do exame de AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Faixa de int, overflow e truncagem

    Cada tipo possui um intervalo fixo; um int transborda para além de aproximadamente 2.1 bilhão. Conversão (Casting) converte entre tipos. A conversão ampliadora (de int para double) é automática; a conversão redutora exige uma conversão explícita, que trunca (não arredonda):

    double avg = (double) total / count;   // force real division
    int whole = (int) 3.9;                 // 3, truncated
    

    Habilidade de prova: observe divisões inteiras produzindo resultados truncados quando um decimal era esperado – faça cast de um operando para double primeiro.

    Exemplo resolvido. Rastreie cada expressão:

    • 7 / 2 → 3 (ambos int, então a divisão trunca);
    • 7.0 / 2 → 3.5 (um double força divisão real);
    • 7 % 2 → 1 (o resto);
    • (double) 7 / 2 → 3.5 (o cast se liga mais fortemente que /, portanto é 7.0 / 2);
    • (double) (7 / 2) → 3.0 (os parênteses calculam 7 / 2 = 3 em int primeiro, depois ampliam).

    As duas últimas parecem iguais, mas diferem – a posição do cast decide onde a truncagem ocorre.

    Explorar

    Por que int e double armazenam números diferentemente

    Um int armazena apenas números inteiros em uma faixa fixa; um double armazena uma mantissa e um expoente, trocando precisão por uma faixa enorme. Converter double→int descarta a fração, e um valor além da faixa de um int transborda.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Casting/ˈkæstɪŋ/ 类型转换 lèi xíng zhuǎn huàn
    library/ˈlaɪbrəri/ 库 kù
    abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
    Comments/ˈkɒments/ 注释 zhù shì
    method signature/ˈmeθəd ˈsɪɡnɪtʃə/ 方法签名 fāng fǎ qiān míng
    arguments/ˈɑːɡjuːmənts/ 实参 shí cān
    class (static) method/klæs ˈmeθəd/ 类方法 lèi fāng fǎ
    1.6

    Operadores de Atribuição Compostos

    Programa

    Objetivo de Aprendizagem 1.6.A: Desenvolver código para instruções de atribuição com operadores de atribuição composta e determinar o valor armazenado na variável como resultado.

    • 1.6.A.1 Operadores de atribuição composta +=, -=, *=, /= e %= podem ser usados no lugar do operador de atribuição em expressões numéricas. Um operador de atribuição composta realiza a operação aritmética indicada entre o valor à esquerda e o valor à direita e, em seguida, atribui o resultado à variável à esquerda.
    • 1.6.A.2 O operador pós-incremento ++ e o operador pós-decremento -- são usados para adicionar 1 ou subtrair 1 do valor armazenado de uma variável numérica. O novo valor é atribuído à variável.
      • Declaração de exclusão: O uso de operadores de incremento e decremento na forma prefixa (p. ex., ++x) está fora do escopo do curso e do exame de AP Computer Science A. O uso de operadores de incremento e decremento dentro de outras expressões (p. ex., arr[x++]) está fora do escopo do curso e do exame de AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Abreviações combinam uma operação com atribuição: x += 5 significa x = x + 5; semelhantemente -=, *=, /=, %=. Os operadores de incremento e decremento x++ e x-- somam ou subtraem um.

    1.7

    Interface de Aplicativo de Programa (API) e Bibliotecas

    Programa

    Objetivo de Aprendizagem 1.7.A: Identificar os atributos e comportamentos de uma classe encontrada nas bibliotecas contidas em uma API.

    • 1.7.A.1 Bibliotecas são conjuntos de classes. Uma especificação de interface de programação de aplicativos (API) informa ao programador como usar essas classes. A documentação encontrada em especificações de API e bibliotecas é essencial para entender os atributos e comportamentos de uma classe definida pela API. Uma classe define um tipo de referência específico. Classes nas APIs e bibliotecas são agrupadas em pacotes. Classes existentes e bibliotecas de classes podem ser utilizadas para criar objetos.
    • 1.7.A.2 Atributos referem-se aos dados relacionados à classe e são armazenados em variáveis. Comportamentos referem-se ao que as instâncias da classe podem fazer (ou o que pode ser feito com elas) e são definidos por métodos.

    Fonte: College Board AP Course and Exam Description

    Uma API (Interface de Programação de Aplicativos) é a lista publicada de classes e métodos que você pode usar. Uma biblioteca é uma coleção de classes prontas (como Math, String, Scanner). Você lê a documentação da API para aprender o que um método precisa (seus parâmetros) e retorna, sem ver seu código interno – um exemplo de abstração.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Interface/ˈɪntəfeɪs/ 应用程序接口 yìng yòng chéng xù jiē kǒu
    1.8

    Documentação com Comentários

    Programa

    Objetivo de Aprendizagem 1.8.A: Descrever a funcionalidade e o uso do código através de comentários.

    • 1.8.A.1 Comentários são escritos tanto para o programador original quanto para outros programadores para compreender o código e sua funcionalidade, mas são ignorados pelo compilador e não são executados quando o programa é executado. Três tipos de comentários em Java incluem /* */, que gera um bloco de comentários; //, que gera um comentário em uma linha; e /** */, que são comentários Javadoc e são usados para criar documentação de API.
    • 1.8.A.2 Uma pré-condição é uma condição que deve ser verdadeira imediatamente antes da execução de um método para que ele se comporte conforme o esperado. Não há expectativa de que o método verifique se as pré-condições foram satisfeitas.
    • 1.8.A.3 Uma pós-condição é uma condição que deve sempre ser verdadeira após a execução de um método. Pós-condições descrevem o resultado da execução em termos do que está sendo retornado ou do valor atual dos atributos de um objeto.

    Fonte: College Board AP Course and Exam Description

    Comentários 注释 são ignorados pelo compilador, mas explicam o código aos humanos: // para uma única linha, /* ... */ para um bloco, e /** ... */ para um comentário Javadoc que documenta o propósito, parâmetros e retorno de um método. Pré-condições e pós-condições precisas são escritas aqui.

    1.9

    Assinaturas de Métodos

    Programa

    Objetivo de Aprendizagem 1.9.A: Identificar o método correto a ser chamado com base na documentação e nas assinaturas de método.

    • 1.9.A.1 Um método é um bloco de código nomeado que só é executado quando é chamado. Um bloco de código é qualquer seção de código que está envolvida em chaves. Abstração procedural permite que um programador use um método sabendo o que o método faz, mesmo que não saiba como o método foi escrito.
    • 1.9.A.2 Um parâmetro é uma variável declarada no cabeçalho de um método ou construtor e pode ser usada dentro do corpo do método. Isso permite que valores ou argumentos sejam passados e usados por um método ou construtor. Uma assinatura de método para um método com parâmetros consiste no nome do método e na lista ordenada de tipos de parâmetro. Uma assinatura de método para um método sem parâmetros consiste no nome do método e em uma lista de parâmetros vazia.

    Objetivo de Aprendizagem 1.9.B: Descrever como chamar métodos.

    • 1.9.B.1 Um método void não possui valor de retorno e, portanto, não é chamado como parte de uma expressão.
    • 1.9.B.2 Um método não-void retorna um valor que é do mesmo tipo que o tipo de retorno no cabeçalho. Para usar o valor de retorno ao chamar um método não-void, ele deve ser armazenado em uma variável ou usado como parte de uma expressão.
    • 1.9.B.3 Um argumento é um valor que é passado para um método quando o método é chamado. Os argumentos passados para um método devem ser compatíveis em número e ordem com os tipos identificados na lista de parâmetros da assinatura do método. Ao chamar métodos, argumentos são passados por valor. Passagem por valor inicializa os parâmetros com cópias dos argumentos.
    • 1.9.B.4 Métodos são ditos sobrecarregados (overloaded) quando existem múltiplos métodos com o mesmo nome, mas assinaturas diferentes.
    • 1.9.B.5 Uma chamada de método interrompe a execução sequencial de instruções, fazendo com que o programa execute primeiro as instruções no método antes de continuar. Uma vez que a última instrução no método foi executada ou uma instrução return é executada, o fluxo de controle é retornado ao ponto imediatamente posterior onde o método foi chamado.

    Fonte: College Board AP Course and Exam Description

    Uma assinatura de método 方法签名 é o nome do método mais seus tipos de parâmetro, p. ex. nextInt() ou substring(int, int). Para chamar um método, você deve fornecer argumentos 实参 que correspondam aos parâmetros em número, tipo e ordem. O cabeçalho do método (a declaração completa) também declara o tipo de retorno – o tipo de valor que o método devolve (void se nenhum) – mas o tipo de retorno não faz parte da assinatura, por isso dois métodos não podem diferir apenas pelo tipo de retorno.

    1.10

    Chamando Métodos de Classe

    Programa

    Objetivo de Aprendizagem 1.10.A: Desenvolver código para chamar métodos de classe e determinar o resultado dessas chamadas.

    • 1.10.A.1 Métodos de classe estão associados à classe, não às instâncias da classe. Métodos de classe incluem a palavra-chave static no cabeçalho antes do nome do método.
    • 1.10.A.2 Métodos de classe são tipicamente chamados usando o nome da classe junto com o operador ponto. Quando a chamada do método ocorre na classe definidora, o uso do nome da classe é opcional na chamada.

    Fonte: College Board AP Course and Exam Description

    Um método de classe (estático) 类方法 pertence à própria classe, então você o chama no nome da classe: ClassName.method(args). Nenhum objeto é necessário.

    Explorar

    Seguir uma chamada de método de classe na pilha

    Chamar um método de classe como Math.max empurra um novo quadro para a pilha de chamadas; quando o método retorna um valor, seu quadro é removido e o controle volta para o chamador. Avance para ver a pilha crescer e diminuir.

    1.11

    Classe Math

    Programa

    Objetivo de Aprendizagem 1.11.A: Desenvolver código para escrever expressões que incorporam chamadas a bibliotecas matemáticas embutidas e determinar o valor que é produzido como resultado.

    • 1.11.A.1 A classe Math faz parte do pacote java.lang. As classes no pacote java.lang estão disponíveis por padrão.
    • 1.11.A.2 A classe Math contém apenas métodos de classe. Os seguintes métodos de classe Math—incluindo o que eles fazem e quando são usados—fazem parte do Java Quick Reference:
      • static int abs(int x) retorna o valor absoluto de um valor int.
      • static double abs(double x) retorna o valor absoluto de um valor double.
      • static double pow(double base, double exponent) retorna o valor do primeiro parâmetro elevado à potência do segundo parâmetro.
      • static double sqrt(double x) retorna a raiz quadrada não negativa de um valor double.
      • static double random() retorna um valor double maior ou igual a 0.0 e menor que 1.0.
    • 1.11.A.3 Os valores retornados de Math.random() podem ser manipulados usando operadores aritméticos e de conversão de tipo para produzir um inteiro aleatório int ou ⟨float⟩ double em um intervalo definido com base em critérios especificados. Cada extremidade do intervalo pode ser inclusiva, significando que o valor é incluído, ou exclusiva, significando que o valor não é incluído.

    Fonte: College Board AP Course and Exam Description

    A classe Math fornece métodos matemáticos estáticos: Math.abs(x), Math.pow(base, exp), Math.sqrt(x) e Math.random() (um double dentro de $[0,1)$). Para obter um inteiro aleatório de 0 a n-1: (int)(Math.random() * n).

    1.12

    Objetos: Instâncias de Classes

    Programa

    Objetivo de Aprendizagem 1.12.A: Explicar a relação entre uma classe e um objeto.

    • 1.12.A.1 Um objeto é uma instância específica de uma classe com atributos definidos. Uma classe é a implementação formal, ou modelo, dos atributos e comportamentos de um objeto.
    • 1.12.A.2 Uma hierarquia de classes pode ser desenvolvida colocando atributos e comportamentos comuns de classes relacionadas em uma única classe chamada superclasse. Classes que estendem uma superclasse, chamadas subclasses, podem utilizar os atributos e comportamentos existentes da superclasse sem substituí-los no código. Isso cria uma relação de herança das subclasses para a superclasse.
      • Declaração de exclusão: Desenhar e implementar relações de herança estão fora do escopo do curso e exame AP Computer Science A.
    • 1.12.A.3 Todas as classes em Java são subclasses da classe Object.

    Objetivo de Aprendizagem 1.12.B: Desenvolver código para declarar variáveis para armazenar tipos de referência.

    • 1.12.B.1 Uma variável de um tipo de referência armazena uma referência de objeto, que pode ser pensada como o endereço de memória desse objeto.

    Fonte: College Board AP Course and Exam Description

    = copia a referência, não o objeto

    Uma classe 类 é um projeto; um objeto 对象 é uma instância 实例 concreta construída a partir dela. Uma classe agrupa dados (campos) com comportamento (métodos) – o cerne da programação orientada a objetos 面向对象编程. String, Scanner e ArrayList são todas classes que você instanciará.

    As classes podem ser organizadas em uma hierarquia. Um superclasse 父类 possui atributos e comportamentos compartilhados por várias subclasses 子类 que extend ela – uma relação de herança 继承关系. Toda classe em Java é, por fim, uma subclasse da classe embutida Object, que é por isso que todo objeto já possui um método toString; escrever um método de subclasse com a mesma assinatura de um de superclasse é sobrecarga de método 方法重写. (Projetar sua própria herança foge deste curso, mas espera-se que você reconheça este vocabulário.)

    Diagrama de classes: atributos privados e métodos públicos
    Diagrama de classes: atributos privados e métodos públicos
    Uma classe é um projeto; cada objeto é uma instância construída a partir dele
    Uma classe é um projeto; cada objeto é uma instância construída a partir dele
    Vocabulário Treinar
    Inglês Chinês Pinyin
    class/klæs/ 类 lèi
    object/ˈɒbdʒekt/ 对象 duì xiàng
    instance/ˈɪnstəns/ 实例 shí lì
    object-oriented programming/ˈɒbdʒekt ˈɔːrɪəntɪd ˈprəʊɡræmɪŋ/ 面向对象编程 miàn xiàng duì xiàng biān chéng
    superclass/ˈsuːpəklæs/ 父类 fù lèi
    subclasses/ˈsʌbklæsɪz/ 子类 zi lèi
    inheritance relationship/ɪnˈherɪtəns rɪˈleɪʃənʃɪp/ 继承关系 jì chéng guān xì
    method overriding/ˈmeθəd ˌəʊvəˈraɪdɪŋ/ 方法重写 fāng fǎ zhòng xiě
    Instantiation/ˌɪnstænʃɪˈeɪʃn/ 实例化 shí lì huà
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    reference/ˈrefrəns/ 引用 yǐn yòng
    1.13

    Criação e Armazenamento de Objetos (Instanciação)

    Programa

    Objetivo de Aprendizagem 1.13.A: Identificar, usando sua assinatura, o construtor correto sendo chamado.

    • 1.13.A.1 Uma classe contém construtores que são chamados para criar objetos. Eles têm o mesmo nome da classe.
    • 1.13.A.2 Uma assinatura de construtor consiste no nome do construtor, que é o mesmo que o nome da classe, e na lista ordenada dos tipos de parâmetro. A lista de parâmetros, no cabeçalho de um construtor, lista os tipos dos valores que são passados e seus nomes de variável.
    • 1.13.A.3 Construtores são ditos sobrecarregados quando existem múltiplos construtores com assinaturas diferentes.

    Objetivo de Aprendizagem 1.13.B: Desenvolver código para declarar variáveis dos tipos corretos para armazenar referências de objeto.

    • 1.13.B.1 Uma variável de um tipo referência armazena uma referência de objeto ou, se não houver objeto, null.

    Objetivo de Aprendizagem 1.13.C: Desenvolver código para criar um objeto chamando um construtor.

    • 1.13.C.1 Um objeto geralmente é criado usando a palavra-chave new seguida por uma chamada a um dos construtores da classe.
    • 1.13.C.2 Parâmetros permitem que construtores aceitem valores para estabelecer os valores iniciais dos atributos do objeto.
    • 1.13.C.3 Um argumento de construtor é um valor passado para um construtor quando este é chamado. Os argumentos passados para um construtor devem ser compatíveis em ordem e quantidade com os tipos identificados na lista de parâmetros na assinatura do construtor. Ao chamar construtores, argumentos são passados por valor. Passagem por valor inicializa os parâmetros com cópias dos argumentos.
    • 1.13.C.4 Uma chamada a um construtor interrompe a execução sequencial de instruções, fazendo com que o programa execute primeiro as instruções no construtor antes de continuar. Após a última instrução no construtor ser executada, o fluxo de controle retorna ao ponto imediatamente após onde o construtor foi chamado.

    Fonte: College Board AP Course and Exam Description

    Instanciação 实例化 cria um objeto com a palavra-chave new, que chama um construtor 构造函数:

    Scanner in = new Scanner(System.in);
    String s = new String("hi");   // or just "hi"
    

    A variável armazena uma referência 引用 (o endereço do objeto), não o objeto em si. Duas referências podem apontar para o mesmo objeto; compará-las com == compara endereços, não conteúdos.

    Uma referência também pode não apontar para nada: o valor especial null 空值 significa "não conectado a nenhum objeto". Chamar um método em uma referência nula causa erro em tempo de execução com um NullPointerException. Proteja-se testando com ==/!= e verificando null primeiro, para que && faça avaliação de curto-circuito antes do método rodar: if (s != null && s.length() > 0).

    Uma variável primitiva armazena seu valor diretamente, uma referência armazena uma seta para o objeto
    Uma variável primitiva armazena seu valor diretamente, uma referência armazena uma seta para o objeto
    Vocabulário Treinar
    Inglês Chinês Pinyin
    null/nʌl/ 空值 kōng zhí
    instance method/ˈɪnstəns ˈmeθəd/ 实例方法 shí lì fāng fǎ
    immutable/ɪˈmjuːtəbl/ 不可变 bù kě biàn
    1.14

    Chamando Métodos de Instância

    Programa

    Objetivo de Aprendizagem 1.14.A: Desenvolver código para chamar métodos de instância e determinar o resultado dessas chamadas.

    • 1.14.A.1 Métodos de instância são chamados em objetos da classe. O operador ponto é usado junto com o nome do objeto para chamar métodos de instância.
    • 1.14.A.2 Uma chamada de método em uma referência null resultará em um NullPointerException.

    Fonte: College Board AP Course and Exam Description

    Um método de instância 实例方法 age sobre um objeto específico, então você o chama na referência do objeto: object.method(args). Exemplo: in.nextInt(), word.length().

    1.15

    Manipulação de Strings

    Programa

    Objetivo de Aprendizagem 1.15.A: Desenvolver código para criar objetos de string e determinar o resultado da criação e combinação de strings.

    • 1.15.A.1 Um objeto String representa uma sequência de caracteres e pode ser criado usando uma literal de string ou chamando o construtor da classe String.
    • 1.15.A.2 A classe String faz parte do pacote java.lang. Classes no pacote java.lang estão disponíveis por padrão.
    • 1.15.A.3 Um objeto String é imutável, significando que, uma vez que um objeto String é criado, seus atributos não podem ser alterados. Métodos chamados em um objeto String não alteram o conteúdo do objeto String.
    • 1.15.A.4 Dois objetos String podem ser concatenados ou combinados usando o operador + ou +=, resultando em um novo objeto String. Um valor primitivo pode ser concatenado com um objeto String. Isso causa a conversão implícita do valor primitivo para um objeto String.
    • 1.15.A.5 Um objeto String pode ser concatenado com qualquer objeto, o que chama implicitamente o método toString do objeto (um comportamento garantido pela relação de herança que toda classe tem com a classe Object). O método toString de um objeto retorna um valor de string representando o objeto. Subclasses de Object frequentemente sobrescrevem o método toString com implementação específica da classe. Sobrescrita de método ocorre quando um método público em uma subclasse possui a mesma assinatura de método que um método público na superclasse, mas o comportamento do método é específico da subclasse.
      • Declaração de exclusão: Sobrescrever o método toString de uma classe está fora do escopo do curso e exame AP Computer Science A.

    Objetivo de Aprendizagem 1.15.B: Desenvolver código para chamar métodos em objetos de string e determinar o resultado dessas chamadas.

    • 1.15.B.1 Um objeto String possui valores de índice de 0 até um menos que o comprimento da string. Tentar acessar índices fora dessa faixa resultará em um StringIndexOutOfBoundsException.
    • 1.15.B.2 Os seguintes métodos String—incluindo o que fazem e quando são usados—fazem parte da Referência Rápida Java:
      • int length() retorna o número de caracteres em um objeto String.
      • String substring(int from, int to) retorna a substring começando no índice from e terminando no índice to - 1.
      • String substring(int from) retorna substring(from, length()).
      • int indexOf(String str) retorna o índice da primeira ocorrência de str; retorna -1 se não for encontrado.
      • boolean equals(Object other) retorna true se this corresponder à mesma sequência de caracteres que other; retorna false caso contrário.
      • int compareTo(String other) retorna um valor < 0 if this is less than other; returns zero if this is equal to other; returns a value > 0 se this for maior que other. As strings são ordenadas com base no alfabeto.
      • Declaração de exclusão: Usar o método equals para comparar um objeto String com um objeto de um tipo diferente de String está fora do escopo do curso e exame AP Computer Science A.
    • 1.15.B.3 Uma string idêntica ao único elemento de substring na posição index pode ser criada chamando substring(index, index + 1).

    Fonte: College Board AP Course and Exam Description

    Strings são imutáveis

    Objetos String são imutáveis 不可变 – métodos retornam uma string nova em vez de alterar a original. Principais métodos (todos os índices começam em 0):

    s.length();            // number of characters
    s.substring(2, 5);     // chars at index 2,3,4 (5 excluded)
    s.indexOf("ab");       // first position, or -1
    s.equals(other);       // content comparison (never use == for Strings)
    s.compareTo(other);    // <0, 0, >0 by dictionary order
    

    Habilidade para prova: substring(a, b) inclui o índice a mas exclui b, e comparação de String deve usar .equals, não == – dois dos principais armadilhas de String cobradas em provas.

    Exemplo resolvido. Seja String s = "COMPUTER"; (índices 0–7). Então s.length() é 8; s.substring(0, 4) é "COMP" (índices 0,1,2,3 – índice 4 excluído); s.substring(4) é "UTER" (do índice 4 até o final); s.indexOf("PU") é 3; e s.indexOf("X") é -1 (não encontrado). Contar a extremidade excluída de substring é o erro mais comum isoladamente.

    Pedir um índice fora de 0 até length()-1 (um argumento substring ou charAt inválido, por exemplo, s.substring(0, 20) aqui) causa falha com um erro StringIndexOutOfBoundsException – o primo do erro de índice de array nas Strings.

    Índices de String começam em 0
    Índices de String começam em 0
    Explorar

    Explorar índices e fatias de strings

    Cada caractere tem um índice, e a numeração começa em 0. Arraste o início e o fim para ver como substring(from, to) pega os caracteres de from até — mas não incluindo — to.

    1.15

    Dicas de prova

    • Rastreie código manualmente linha por linha, rastreando o valor de cada variável em uma tabela — a prova recompensa rastreamento cuidadoso em vez de adivinhação.
    • Conheça os tipos primitivos do Java e que a divisão inteira truncará ($7/2$ dá $3$); use um cast ou um double para divisão real.
    • Distinguir erros de tempo de compilação (sintaxe, tipos) de erros de tempo de execução – conhecer os nomeados: ArithmeticException (int ÷ 0), NullPointerException (método em referência nula), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – e erros de lógica (saída incorreta).
    • Siga a precedência de operadores e inicialize toda variável antes de usá-la.
    • Na resposta discursiva, escreva Java completo e compilável – retorne o tipo correto e corresponda exatamente ao cabeçalho do método.
  • 2

    Seleção e Iteração

    Assistir aula
    2.1

    Seleção e Repetição em Algoritmos

    Programa

    Objetivo de Aprendizagem 2.1.A: Representar padrões e algoritmos que envolvem seleção e repetição encontrados no cotidiano usando linguagem escrita ou diagramas.

    • 2.1.A.1 Os blocos de construção de algoritmos incluem sequenciamento, seleção e repetição.
    • 2.1.A.2 Algoritmos podem conter seleção, através da tomada de decisão, e repetição, via laços.
    • 2.1.A.3 Seleção ocorre quando uma escolha sobre como a execução de um algoritmo prosseguirá é baseada em uma decisão verdadeira ou falsa.
    • 2.1.A.4 Repetição é quando um processo se repete até que um resultado desejado seja alcançado.
    • 2.1.A.5 A ordem em que sequenciamento, seleção e repetição são usados contribui para o resultado do algoritmo.

    Fonte: College Board AP Course and Exam Description

    Um fluxograma com um losango de decisão: a seleção escolhe qual caminho o algoritmo seguirá *Um fluxograma com diamante de decisão: seleção escolhe qual caminho o algoritmo toma

    Algoritmos são construídos a partir de três estruturas de controle 控制结构: sequência (passos em ordem), seleção 选择 (escolher um caminho) e iteração 迭代 (repetir passos). Este tópico cobre seleção e iteração – as ferramentas que permitem a um programa tomar decisões e fazer laços.

    As três estruturas de controle: sequência, seleção e iteração *As três estruturas de controle: sequência, seleção e iteração

    Vocabulário Treinar
    Inglês Chinês Pinyin
    control structures/kənˈtrəʊl ˈstrʌktʃəz/ 控制结构 kòng zhì jié gòu
    selection/sɪˈlekʃn/ 选择 xuǎn zé
    iteration/ˌɪtəˈreɪʃn/ 迭代 dié dài
    boolean expression/ˈbuːlɪən ekˈspreʃn/ 布尔表达式 bù ěr biǎo dá shì
    relational operators/rɪˈleɪʃənl ˈɒpəreɪtəz/ 关系运算符 guān xì yùn suàn fú
    if statement/ɪf ˈsteɪtmənt/ 条件语句 tiáo jiàn yǔ jù
    Logical operators/ˈlɒdʒɪkl ˈɒpəreɪtəz/ 逻辑运算符 luó jí yùn suàn fú
    short-circuit evaluation/ʃɔːt ˈsɜːkɪt ɪˌvæljuːˈeɪʃn/ 短路求值 duǎn lù qiú zhí
    De Morgan's laws/də ˈmɔːɡənz lɔːz/ 德摩根定律 dé mó gēn dìng lǜ
    while loop/waɪl luːp/ 循环 xún huán
    infinite loop/ˈɪnfɪnət luːp/ 无限循环 wú xiàn xún huán
    2.2

    Expressões Booleanas

    Programa

    Objetivo de Aprendizagem 2.2.A: Desenvolver código para criar expressões booleanas com operadores relacionais e determinar o resultado dessas expressões.

    • 2.2.A.1 Valores podem ser comparados usando os operadores relacionais == e != para determinar se os valores são iguais. Com tipos primitivos, isso compara os valores primitivos reais. Com tipos de referência, isso compara as referências do objeto.
    • 2.2.A.2 Valores numéricos podem ser comparados usando os operadores relacionais <, >, <= e >= para determinar a relação entre os valores.
    • 2.2.A.3 Uma expressão que envolve operadores relacionais avalia para um valor Booleano.

    Fonte: College Board AP Course and Exam Description

    *Portas lógicas e meio somador

    Uma expressão booleana 布尔表达式 avalia para true ou false, usando operadores relacionais 关系运算符: == (igualdade), != (desigualdade), <, >, <=, >=. Note que == compara valores primitivos mas referências de objeto para objetos, então use .equals para Strings.

    As três famílias de operadores: aritméticos, relacionais e lógicos *As três famílias de operadores: aritméticos, relacionais e lógicos

    Explorar

    Explorar a tabela verdade AND

    Uma expressão Booleana avalia para true ou false. AND é verdadeiro apenas quando ambos os operandos são verdadeiros; alterne as entradas para ver todos os quatro casos.

    2.3

    A instrução if

    Programa

    Objetivo de Aprendizagem 2.3.A: Desenvolver código para representar processos lógicos de ramificação usando instruções de seleção e determinar o resultado desses processos.

    • 2.3.A.1 Instruções de seleção alteram a execução sequencial de instruções.
    • 2.3.A.2 Uma instrução if é um tipo de instrução de seleção que afeta o fluxo de controle executando diferentes segmentos de código com base no valor de uma expressão Booleana.
    • 2.3.A.3 Uma seleção de um caminho (instrução if) é usada quando há um segmento de código a ser executado sob uma certa condição. Neste caso, o corpo é executado apenas quando a expressão Booleana é true.
    • 2.3.A.4 Uma seleção de dois caminhos (instrução if-else) é usada quando há dois segmentos de código: um para ser executado quando a expressão Booleana é true e outro segmento para quando a expressão Booleana é false. Neste caso, o corpo do if é executado quando a expressão Booleana é true, e o corpo do else é executado quando a expressão Booleana é false.

    Fonte: College Board AP Course and Exam Description

    Uma instrução if 条件语句 executa um bloco apenas quando sua condição é verdadeira; um else opcional oferece uma alternativa:

    if (score >= 60) {
        System.out.println("Pass");
    } else {
        System.out.println("Fail");
    }
    

    Semáforos: a seleção escolhe qual ramo é executado, assim como as instruções if escolhem caminhos de código *Semáforos: seleção escolhe qual ramo é executado, assim como instruções if escolhem caminhos de código

    Explorar

    Ver qual ramificação um if escolhe

    Uma instrução se executa seu corpo apenas quando a condição é verdadeira, caso contrário pula para else. Deslize a pontuação pelos limites e observe a nota mudar.

    2.4

    Instruções if Aninhadas

    Programa

    Objetivo de Aprendizagem 2.4.A: Desenvolver código para representar processos lógicos de ramificação aninhados e determinar o resultado desses processos.

    • 2.4.A.1 Instruções if aninhadas consistem em instruções if, if-else ou if-else-if dentro de instruções if, if-else ou if-else-if.
    • 2.4.A.2 A expressão Booleana da instrução if aninhada interna é avaliada apenas se a expressão Booleana da instrução externa if avaliar para true.
    • 2.4.A.3 Uma seleção de múltiplos caminhos (instrução if-else-if) é usada quando há uma série de expressões com diferentes segmentos de código para cada condição. A seleção de múltiplos caminhos é realizada de forma que nenhum mais de um segmento de código seja executado com base na primeira expressão que avalia para true. Se nenhuma expressão avaliar para true e houver uma instrução else final, então o corpo da else é executado.

    Fonte: College Board AP Course and Exam Description

    Colocar um if dentro de outro, ou encadeando com else if, testa vários casos em ordem. Apenas o primeiro ramo correspondente é executado:

    if (g >= 90) grade = 'A';
    else if (g >= 80) grade = 'B';
    else grade = 'C';
    
    2.5

    Expressões Booleanas Compostas

    Programa

    Objetivo de Aprendizagem 2.5.A: Desenvolver código para representar expressões Booleanas compostas e determinar o resultado dessas expressões.

    • 2.5.A.1 Operadores lógicos ! (not), && (and) e || (or) são usados com expressões Booleanas. A expressão !a avalia para true se a for false e avalia para false caso contrário. A expressão a && b avalia para true se tanto a quanto b forem true e avalia para false caso contrário. A expressão a || b avalia para true se a for true, b for true, ou ambos, e avalia para false caso contrário. A ordem de precedência para avaliar operadores lógicos é ! (not), && (and), depois || (or). Uma expressão envolvendo operadores lógicos avalia para um valor Booleano.
    • 2.5.A.2 Avaliação de curto-circuito ocorre quando o resultado de uma operação lógica usando && ou || pode ser determinado avaliando apenas a primeira expressão Booleana. Neste caso, a segunda expressão Booleana não é avaliada.

    Fonte: College Board AP Course and Exam Description

    *Avaliação de curto-circuito

    Operadores lógicos 逻辑运算符 combinam condições: && (e – ambos verdadeiros), || (ou – pelo menos um verdadeiro), ! (não – inverso). Java usa avaliação de curto-circuito 短路求值: && para se a esquerda for falsa, e || para se a esquerda for verdadeira – útil para proteger contra erros, p. ex. if (n != 0 && total / n > 5).

    2.6

    Comparando Expressões Booleanas

    Programa

    Objetivo de Aprendizagem 2.6.A: Comparar expressões Booleanas equivalentes.

    • 2.6.A.1 Duas expressões Booleanas são equivalentes se avaliarem para o mesmo valor em todos os casos. Tabelas-verdade podem ser usadas para provar que expressões Booleanas são equivalentes.
    • 2.6.A.2 A lei de De Morgan pode ser aplicada a expressões Booleanas para criar expressões Booleanas equivalentes. Sob a lei de De Morgan, a expressão Booleana !(a && b) é equivalente a !a || !b e a expressão Booleana !(a || b) é equivalente a !a && !b.

    Objetivo de Aprendizagem 2.6.B: Desenvolver código para comparar referências de objetos usando expressões Booleanas e determinar o resultado dessas expressões.

    • 2.6.B.1 Duas variáveis diferentes podem conter referências para o mesmo objeto. Referências de objeto podem ser comparadas usando == e !=.
    • 2.6.B.2 Uma referência de objeto pode ser comparada com null, usando == ou !=, para determinar se a referência realmente referencia um objeto.
    • 2.6.B.3 Classes frequentemente definem seu próprio método equals, que pode ser usado para especificar os critérios de equivalência para dois objetos da classe. A equivalência de dois objetos é mais frequentemente determinada usando atributos dos dois objetos.
      • Instrução de exclusão: Substituir o método equals está fora do escopo do curso e exame AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Leis de De Morgan 德摩根定律 reescrevem negações: !(a && b) é igual a !a || !b, e !(a || b) é igual a !a && !b. Duas expressões booleanas são equivalentes se derem o mesmo resultado para toda entrada – uma tabela-verdade prova isso. Simplificar condições dessa forma é uma tarefa comum de prova.

    2.7

    Laços while

    Programa

    Objetivo de Aprendizagem 2.7.A: Identificar quando um processo iterativo é necessário para obter um resultado desejado.

    • 2.7.A.1 Iteração é uma forma de repetição. Instruções de iteração mudam o fluxo de controle repetindo um segmento de código zero ou mais vezes enquanto a expressão Booleana que controla o laço avalia para true.
    • 2.7.A.2 Um laço infinito ocorre quando a expressão Booleana em uma instrução iterativa sempre avalia para true.
    • 2.7.A.3 O corpo do laço de uma instrução iterativa não será executado se a expressão Booleana avaliar inicialmente para false.
    • 2.7.A.4 Erros off by one ocorrem quando a instrução de iteração executa o laço uma vez a mais ou uma vez a menos.

    Objetivo de Aprendizagem 2.7.B: Desenvolver código para representar processos iterativos usando laços while e determinar o resultado desses processos.

    • 2.7.B.1 Um laço while é um tipo de instrução iterativa. Em laços while, a expressão Booleana é avaliada antes de cada iteração do corpo do laço, incluindo a primeira. Quando a expressão avalia para true, o corpo do laço é executado. Isso continua até que a expressão Booleana avalie para false, momento em que a iteração termina.

    Fonte: College Board AP Course and Exam Description

    Um laço while 循环 repete enquanto sua condição permanece verdadeira, testando antes de cada passagem. Você deve alterar algo dentro para que o laço eventualmente pare, ou ele se torna um laço infinito 无限循环:

    Os três tipos de loop diferem no local onde a condição é testada *Os três tipos de laço diferem em onde a condição é testada

    int i = 0;
    while (i < 5) {
        System.out.println(i);
        i++;
    }
    
    Explorar

    Rastrear um loop while

    Um loop while repete enquanto sua condição permanecer verdadeira, atualizando suas variáveis a cada passagem. Avance para ver a soma dos quadrados se acumular.

    2.8

    Laços for

    Programa

    Objetivo de Aprendizagem 2.8.A: Desenvolver código para representar processos iterativos usando laços for e determinar o resultado desses processos.

    • 2.8.A.1 Um laço for é um tipo de instrução iterativa. Há três partes no cabeçalho de um laço for: a inicialização, a expressão Booleana e a atualização.
    • 2.8.A.2 Em um laço for, a instrução de inicialização é executada apenas uma vez antes da primeira avaliação da expressão Booleana. A variável sendo inicializada é referida como uma variável de controle de laço. A expressão Booleana é avaliada imediatamente após a variável de controle do laço ser inicializada e depois após cada execução da instrução de incremento até que esteja false. Em cada iteração, a atualização é executada após todo o corpo do laço ser executado e antes que a expressão Booleana seja avaliada novamente.
    • 2.8.A.3 Um laço for pode ser reescrito como um laço while equivalente (e vice-versa).

    Fonte: College Board AP Course and Exam Description

    Um laço for empacota inicialização, condição e atualização em uma linha – melhor quando você conhece a contagem:

    for (int i = 0; i < n; i++) {
        // runs n times, i = 0..n-1
    }
    

    Um for e um while equivalentes fazem o mesmo trabalho; seja capaz de converter entre eles.

    Uma linha de montagem: loops repetem um processo para cada item, como for e while *Uma linha de montagem: laços repetem um processo para cada item, como for e while

    Explorar

    Rastrear um loop for

    Um loop for executa um número fixo de vezes, com seu contador passando por uma faixa. Observe o contador e o total acumulado avançarem uma passagem de cada vez.

    2.9

    Construindo Algoritmos Completos de Seleção e Iteração

    Programa

    Objetivo de Aprendizagem 2.9.A: Desenvolver código para algoritmos padrão e originais (sem estruturas de dados) e determinar o resultado desses algoritmos.

    • 2.9.A.1 Existem algoritmos padrão para:
      • identificar se um número inteiro é ou não divisível por outro número inteiro sem resto
      • identificar os dígitos individuais em um número inteiro
      • determinar a frequência com que um critério específico é atendido
      • determinar um valor mínimo ou máximo
      • computar uma soma ou média

    Fonte: College Board AP Course and Exam Description

    Combine laços e condições para resolver problemas reais – contar, somar, encontrar um máximo ou testar uma propriedade:

    int max = arr[0];
    for (int k = 1; k < arr.length; k++) {
        if (arr[k] > max) max = arr[k];
    }
    

    Dois padrões inteiros que a prova testa diretamente usam % e /. Para ler os dígitos de um inteiro um de cada vez, pegue repetidamente n % 10 (o último dígito) e depois n = n / 10 (remova-o). Para testar divisibilidade, n % d == 0 significa que n é divisível por d sem resto. Combine-os com um contador para encontrar a frequência com que algum critério é atendido.

    Padrões padrão como total acumulado, contador ou flag 标志 (um booleano que registra se algo aconteceu) ocorrem constantemente ao longo do curso.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    flag/flæɡ/ 标志 biāo zhì
    nested loop/ˈnestɪd luːp/ 嵌套循环 qiàn tào xún huán
    Run-time analysis/rʌn taɪm əˈnæləsɪs/ 运行时间分析 yùn xíng shí jiān fēn xī
    2.10

    Algoritmos de String

    Programa

    Objetivo de Aprendizagem 2.10.A: Desenvolver código para algoritmos padrão e originais que envolvem strings e determinar o resultado desses algoritmos.

    • 2.10.A.1 Existem algoritmos padrão de string para:
      • encontrar se um ou mais substrings possuem uma propriedade particular
      • determinar o número de substrings que atendem a critérios específicos
      • criar uma nova string com os caracteres invertidos

    Fonte: College Board AP Course and Exam Description

    Percorra uma string por índice para processar cada caractere:

    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        // count vowels, reverse, check for a substring, ...
    }
    

    Tarefas típicas: contar ocorrências, construir uma cópia invertida ou filtrada, ou testar se uma string contém outra.

    2.11

    Iteração Aninhada

    Programa

    Objetivo de Aprendizagem 2.11.A: Desenvolver código para representar processos iterativos aninhados e determinar o resultado desses processos.

    • 2.11.A.1 Instruções de iteração aninhadas são instruções de iteração que aparecem no corpo de outra instrução de iteração. Quando um laço está aninhado dentro de outro laço, o laço interno deve completar todas as suas iterações antes que o laço externo possa continuar para sua próxima iteração.

    Fonte: College Board AP Course and Exam Description

    Um laço aninhado 嵌套循环 coloca um laço dentro de outro; o laço interno completa totalmente para cada passagem do externo. Se o externo roda $n$ vezes e o interno $m$ vezes, o corpo roda $n\times m$ vezes – a base para processar grades e comparar todos os pares.

    2.12

    Análise Informal de Tempo de Execução

    Programa

    Objetivo de Aprendizagem 2.12.A: Calcular contagens de execução de instruções e comparação informal de tempo de execução de instruções iterativas.

    • 2.12.A.1 Uma contagem de execução de instrução indica o número de vezes que uma instrução é executada pelo programa. As contagens de execução de instruções são frequentemente calculadas informalmente através de rastreamento e análise das instruções iterativas.

    Fonte: College Board AP Course and Exam Description

    *Taxas de crescimento Big-O

    Análise de tempo de execução 运行时间分析 conta quantos passos básicos um algoritmo leva conforme o tamanho da entrada $n$ cresce. Conte as execuções da instrução mais interna: um único laço sobre $n$ itens é linear ($n$ passos); dois laços aninhados sobre $n$ são quadráticos ($n^2$). Essa contagem informal permite comparar a eficiência de dois algoritmos.

    Como o tempo de execução cresce com o número de elementos n
    Como o tempo de execução cresce com o número de elementos n

    Habilidade para prova: em um loop aninhado, saber declarar quantas vezes a instrução interna é executada em termos dos limites dos loops — uma questão de múltipla escolha frequente.

    Exemplo resolvido. Quantas estrelas isso imprime?

    for (int i = 0; i < 4; i++)
        for (int j = 0; j < i; j++)
            System.out.print("*");
    

    O loop interno executa i vezes para cada i externo: 0 + 1 + 2 + 3 = 6 estrelas. Quando o limite interno é a variável externa, o total é a soma triangular $0+1+\dots+(n-1)=\dfrac{n(n-1)}{2}$ – aqui $\dfrac{4\times3}{2}=6$ – e não o total $n^2=16$ de um loop aninhado retangular.

    Explorar

    Comparar como os algoritmos escalam

    Tempo de execução descreve como o número de etapas cresce com o tamanho da entrada $n$. Aumente $n$ e observe uma linear $O(n)$ ultrapassar longe uma quadrática $O(n^2)$.

    2.12

    Dicas de prova

    • Obter as condições de fronteira corretas: use < vs <= deliberadamente, e observe a primeira e a última iteração de todo loop (off-by-one é o bug clássico).
    • Construa condições compostas com &&, ||, ! e lembre-se da avaliação curto-circuito (coloque a verificação de nulo primeiro).
    • Rastreie loops aninhados contando quantas vezes o corpo interno roda no total.
    • Escolha a estrutura certa — if/else if para intervalos, um loop para repetição — e evite um loop infinito atualizando a variável do loop.
    • Aplique as leis de De Morgan ao simplificar ou negar uma condição booleana.
  • 3

    Criação de Classes

    Assistir aula
    3.1

    Abstração e Projeto de Programas

    Programa

    Objetivo de Aprendizagem 3.1.A: Representar o projeto de um programa usando linguagem natural ou criando diagramas que indiquem as classes no programa e as abstrações de dados e procedurais encontradas em cada classe, incluindo todos os atributos e comportamentos.

    • 3.1.A.1 Abstração é o processo de reduzir a complexidade focando na ideia principal. Ao ocultar detalhes irrelevantes para a questão em mãos e agrupar detalhes relacionados e úteis, a abstração reduz a complexidade e permite que um se foque na ideia.
    • 3.1.A.2 Abstração de dados fornece uma separação entre as propriedades abstratas de um tipo de dado e os detalhes concretos de sua representação. A abstração de dados gerencia a complexidade dando um nome aos dados sem referenciar os detalhes específicos da representação. Os dados podem assumir a forma de uma única variável ou uma coleção de dados, como em uma classe ou conjunto de dados.
    • 3.1.A.3 Um atributo é um tipo de abstração de dados definido em uma classe fora de qualquer método ou construtor. Uma variável de instância é um atributo cujo valor é único para cada instância da classe. Uma variável de classe é um atributo compartilhado por todas as instâncias da classe.
    • 3.1.A.4 Abstração procedural fornece um nome para um processo e permite que um método seja usado sabendo apenas o que ele faz, não como ele faz. Através da decomposição de métodos, um programador divide grandes comportamentos da classe em menores comportamentos criando métodos para representar cada pequeno comportamento individual. Uma abstração procedural pode extrair recursos compartilhados para generalizar funcionalidade em vez de duplicar código. Isso permite a reutilização de código, o que ajuda a gerenciar a complexidade.
    • 3.1.A.5 Usar parâmetros permite que procedimentos sejam generalizados, permitindo que os procedimentos sejam reutilizados com uma gama de valores de entrada ou argumentos.
    • 3.1.A.6 Usar abstração procedural em um programa permite que programadores alterem os internos de um método (para torná-lo mais rápido, mais eficiente, usar menos armazenamento, etc.) sem precisar notificar os usuários do método sobre a mudança, desde que a assinatura do método e o que o método faz seja preservado.
    • 3.1.A.7 Antes de implementar uma classe, é útil dedicar tempo para projetar cada classe, incluindo seus atributos e comportamentos. Esse projeto pode ser representado usando linguagem natural ou diagramas.

    Fonte: College Board AP Course and Exam Description

    Um quebra-cabeça em andamento: classes e métodos são peças modulares de um projeto maior de programa
    Um quebra-cabeça em andamento: classes e métodos são peças modulares de um projeto maior de programa

    Abstração 抽象 significa ocultar detalhes atrás de uma interface simples – você usa um String sem saber como armazena caracteres. Um bom design divide um problema em classes, cada uma responsável por uma ideia. Este tópico trata sobre escrever suas próprias classes.

    Decompondo um programa em módulos e submódulos
    Decompondo um programa em módulos e submódulos
    3.2

    O Impacto do Projeto de Programas

    Programa

    Objetivo de Aprendizagem 3.2.A: Explicar as implicações sociais e éticas dos sistemas computacionais.

    • 3.2.A.1 Confiabilidade do sistema refere-se à capacidade do programa de executar suas tarefas conforme esperado sob condições declaradas sem falhas. Programadores devem fazer um esforço para maximizar a confiabilidade do sistema testando o programa com uma variedade de condições.
    • 3.2.A.2 A criação de programas tem impactos na sociedade, na economia e na cultura. Esses impactos podem ser tanto benéficos quanto prejudiciais. Programas criados para atender a uma necessidade ou resolver um problema podem ter efeitos nocivos não intencionais além do seu uso pretendido.
    • 3.2.A.3 Questões legais e preocupações sobre propriedade intelectual surgem ao criar programas. Programadores frequentemente reutilizam código escrito por outros e publicado como open source e gratuito para uso. A incorporação de código que não é publicado como open source exige que o programador obtenha permissão e, muitas vezes, compre o código antes de integrá-lo ao seu programa.

    Fonte: College Board AP Course and Exam Description

    As escolhas de design afetam se o código está correto, legível e reutilizável. Encapsulamento 封装 – manter dados privados e expô-los apenas através de métodos – protege o estado de um objeto de mau uso e permite mudar o interior sem quebrar os usuários da classe. Nomes cuidadosos, métodos de propósito único e testes reduzem bugs.

    O design também carrega responsabilidade além do código. Confiabilidade do sistema 系统可靠性 - um programa realizando suas tarefas conforme esperado, sem falhas - é algo que programadores devem maximizar através de design cuidadoso e testes. Programas têm impactos reais na sociedade, economia e cultura que podem ser benefícios e danos. E criar programas levanta preocupações legais e de propriedade intelectual 知识产权: programadores frequentemente reutilizam código publicado como open source 开源 e gratuito, mas devem respeitar sua licença e dar crédito em vez de copiar o trabalho alheio como próprio.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Abstraction/əbˈstrækʃn/ 抽象 chōu xiàng
    Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ 封装 fēng zhuāng
    System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ 系统可靠性 xì tǒng kě kào xìng
    legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ 知识产权 zhī shí chǎn quán
    open source/ˈəʊpən sɔːs/ 开源 kāi yuán
    instance variables/ˈɪnstəns ˈveərɪəblz/ 实例变量 shí lì biàn liàng
    3.3

    A Anatomia de uma Classe

    Programa

    Objetivo de Aprendizagem 3.3.A: Desenvolver código para designar restrições de acesso e visibilidade para classes, dados, construtores e métodos.

    • 3.3.A.1 Encapsulamento de dados é uma técnica na qual os detalhes de implementação de uma classe são mantidos ocultos de classes externas. As palavras-chave public e private afetam o acesso de classes, dados, construtores e métodos. A palavra-chave private restringe o acesso à classe declaradora, enquanto a palavra-chave public permite o acesso de classes fora da classe declaradora.
    • 3.3.A.2 Neste curso, as classes são sempre designadas public e declaradas com a palavra-chave class.
    • 3.3.A.3 Neste curso, os construtores são sempre designados public.
    • 3.3.A.4 Variáveis de instância pertencem ao objeto, e cada objeto possui sua própria cópia da variável.
    • 3.3.A.5 O acesso aos atributos deve ser mantido interno à classe para alcançar o encapsulamento. Portanto, é uma boa prática de programação designar as variáveis de instância para esses atributos como private, a menos que a especificação da classe indique o contrário.
    • 3.3.A.6 O acesso aos comportamentos pode ser interno ou externo à classe. Métodos designados como public podem ser acessados internamente ou externamente a uma classe, enquanto métodos designados como private só podem ser acessados internamente à classe.

    Fonte: College Board AP Course and Exam Description

    Uma classe tem três partes: variáveis de instância 实例变量 (campos – os dados do objeto), construtores (criam objetos) e métodos (comportamento). Campos geralmente são private; métodos geralmente são public:

    Diagrama de classes: atributos privados e métodos públicos
    Diagrama de classes: atributos privados e métodos públicos
    public class Student {
        private String name;      // instance variable
        private int score;
    
        public Student(String n, int s) {   // constructor
            name = n;
            score = s;
        }
        public int getScore() { return score; }   // accessor
    }
    
    Uma planta baixa: uma classe é um modelo que define como objetos desse tipo são construídos
    Uma planta baixa: uma classe é um modelo que define como objetos desse tipo são construídos
    Explorar

    Ver os campos de um objeto como caixas

    Uma classe agrupa dados relacionados (seus campos) e métodos. Cada objeto recebe seu próprio conjunto de caixas de campo; atribuir a uma altera apenas esse objeto.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    overloading/ˌəʊvəˈləʊdɪŋ/ 重载 zhòng zài
    accessor (getter)/əkˈsesə/ 访问器 fǎng wèn qì
    3.4

    Construtores

    Programa

    Objetivo de Aprendizagem 3.4.A: Desenvolver código para declarar variáveis de instância para os atributos a serem inicializados no corpo dos construtores de uma classe.

    • 3.4.A.1 O estado de um objeto refere-se aos seus atributos e seus valores em um momento dado e é definido por variáveis de instância pertencentes ao objeto. Isso define uma relação has-a (tem-um) entre o objeto e suas variáveis de instância.
    • 3.4.A.2 Um construtor é usado para definir o estado inicial de um objeto, o que deve incluir valores iniciais para todas as variáveis de instância. Quando um construtor é chamado, memória é alocada para o objeto e a referência associada ao objeto é retornada. Parâmetros do construtor, se especificados, fornecem dados para inicializar variáveis de instância.
    • 3.4.A.3 Quando um objeto mutável é um parâmetro de construtor, a variável de instância deve ser inicializada com uma cópia do objeto referenciado. Dessa forma, a variável de instância não mantém uma referência ao objeto original, e os métodos são impedidos de modificar o estado do objeto original.
    • 3.4.A.4 Quando nenhum construtor é escrito, o Java fornece um construtor sem parâmetros, e as variáveis de instância são definidas com valores padrão de acordo com o tipo de dado do atributo. Este construtor é chamado de construtor padrão.
    • 3.4.A.5 O valor padrão para um atributo do tipo int é 0. O valor padrão de um atributo do tipo double é 0.0. O valor padrão de um atributo do tipo boolean é false. O valor padrão de um tipo de referência é null.

    Fonte: College Board AP Course and Exam Description

    Um construtor 构造函数 tem o mesmo nome da classe e nenhum tipo de retorno. Ele roda quando você escreve new, e seu trabalho é inicializar os campos. Uma classe pode ter vários construtores com listas diferentes de parâmetros (sobrecarga 重载); um construtor sem argumentos define valores padrão.

    3.5

    Métodos: Como Escrevê-los

    Programa

    Objetivo de Aprendizagem 3.5.A: Desenvolver código para definir comportamentos de um objeto através de métodos escritos em uma classe usando valores primitivos e determinar o resultado de chamar esses métodos.

    • 3.5.A.1 Um método void não retorna um valor. Seu cabeçalho contém a palavra-chave void antes do nome do método.
    • 3.5.A.2 Um método não void retorna um único valor. Seu cabeçalho inclui o tipo de retorno no lugar da palavra-chave void.
    • 3.5.A.3 Em métodos não void, uma expressão de retorno compatível com o tipo de retorno é avaliada e o valor é retornado. Isso é referido como retorno por valor.
    • 3.5.A.4 A palavra-chave return é usada para retornar o fluxo de controle para o ponto onde o método ou construtor foi chamado. Qualquer código que esteja sequencialmente após uma instrução de retorno nunca será executado. Executar uma instrução de retorno dentro de uma instrução de seleção ou iteração interromperá a instrução e sairá do método ou construtor.
    • 3.5.A.5 Um método acessor permite que objetos de outras classes obtenham uma cópia do valor das variáveis de instância ou variáveis de classe. Um método acessor é um método não-void.
    • 3.5.A.6 Um métutor (modificador) método é um método que altera os valores das variáveis de instância ou variáveis de classe. Um mutator method é frequentemente um método void.
    • 3.5.A.7 Métodos com parâmetros recebem valores através desses parâmetros e usam esses valores para cumprir a tarefa do método.
    • 3.5.A.8 Quando um argumento é um valor primitivo, o parâmetro é inicializado com uma cópia desse valor. Alterações no parâmetro não têm efeito sobre o argumento correspondente.

    Fonte: College Board AP Course and Exam Description

    Um método tem uma assinatura, um tipo de retorno e um corpo. Um acessor (getter) 访问器 retorna informações sem alterar o objeto; um mutator (setter) 修改器 altera um campo. Um método que retorna valor deve ter um return do tipo certo em todo caminho; um void método não retorna nada.

    public void setScore(int s) { score = s; }   // mutator
    public String toString() { return name + ": " + score; }
    
    Explorar

    Seguir uma chamada de método e seu retorno

    Chamar um método empurra um quadro com seus parâmetros; quando ele atinge return, o quadro é removido e o valor volta para o chamador.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    mutator (setter)/mjuːˈteɪtə/ 修改器 xiū gǎi qì
    static (class) variable/ˈstætɪk ˈveərɪəbl/ 类变量 lèi biàn liàng
    3.6

    Passando e Retorando Referências de um Objeto

    Programa

    Objetivo de Aprendizagem 3.6.A: Desenvolver código para definir comportamentos de um objeto através de métodos escritos em uma classe usando referências de objetos e determinar o resultado de chamar esses métodos.

    • 3.6.A.1 Quando um argumento é uma referência de objeto, o parâmetro é inicializado com uma cópia dessa referência; ele não cria uma nova cópia independente do objeto. Se o parâmetro se refere a um objeto mutável, o método ou construtor pode usar essa referência para alterar o estado do objeto. É uma boa prática de programação não modificar objetos mutáveis que são passados como parâmetros, a menos que seja exigido na especificação.
    • 3.6.A.2 Quando a expressão de retorno avalia para uma referência de objeto, a referência é retornada, não uma referência para uma nova cópia do objeto.
    • 3.6.A.3 Métodos não podem acessar os dados privados e métodos de um parâmetro que segura uma referência para um objeto, a menos que o parâmetro seja do mesmo tipo que a classe envolvente do método.

    Fonte: College Board AP Course and Exam Description

    = copia a referência, não o objeto

    Quando você passa um objeto para um método, Java copia a referência, então o método age sobre o mesmo objeto – alterações em seus campos são visíveis para quem chamou. (Primitivos são copiados por valor, então alterações neles não.) Um método também pode retornar uma referência para um objeto. Porque um String é imutável, passar um é seguro; passar um objeto mutável permite que o método o altere.

    Java passa por valor: o método recebe uma cópia; verdadeiro passed by reference, do qual Java carece, permitiria reatribuir a variável do chamador
    Java sempre passa por valor (esquerda): o método recebe uma cópia da referência. Verdadeiro passed by reference (direita) — do qual Java não dispõe — permitiria que o método reatribuísse a própria variável do chamador.

    Habilidade para prova: saiba que mutar campos de um objeto dentro de um método afeta o original, mas reatribuir o parâmetro (param = new...) não afeta o chamador.

    Exemplo resolvido. Suponha que s seja um Student com pontuação 50, e chamamos tweak(s):

    public static void tweak(Student a) {
        a.setScore(100);          // (1) mutates the shared object
        a = new Student("Z", 0);  // (2) repoints the local copy only
        a.setScore(5);            // (3) changes only the new local object
    }
    

    A linha (1) altera o objeto que s aponta, então o chamador agora vê 100. A linha (2) faz a cópia própria do método apontar para um novo objeto – o s do chamador permanece intacto – e a linha (3) afeta apenas esse novo objeto. Após a chamada, s.getScore() é 100: a mutação permaneceu, a reatribuição não.

    3.7

    Variáveis e Métodos de Classe

    Programa

    Objetivo de Aprendizagem 3.7.A: Desenvolver código para definir comportamentos de uma classe através de métodos de classe.

    • 3.7.A.1 Métodos de classe não podem acessar ou alterar os valores de variáveis de instância ou chamar métodos de instância sem receber uma instância da classe via parâmetro.
    • 3.7.A.2 Métodos de classe podem acessar ou alterar os valores de variáveis de classe e podem chamar outros métodos de classe.

    Objetivo de Aprendizagem 3.7.B: Desenvolver código para declarar as variáveis de classe que pertencem à classe.

    • 3.7.B.1 Variáveis de classe pertencem à classe, com todos os objetos de uma classe compartilhando uma única cópia da variável de classe. Variáveis de classe são designadas com a palavra-chave static antes do tipo da variável.
    • 3.7.B.2 Variáveis de classe designadas public são acessadas fora da classe usando o nome da classe e o operador ponto, já que elas estão associadas a uma classe, não a objetos de uma classe.
    • 3.7.B.3 Quando uma variável é declarada final, seu valor não pode ser modificado.

    Fonte: College Board AP Course and Exam Description

    campos estáticos vs instância

    Uma variável estática (de classe) 类变量, marcada static, é compartilhada por todos os objetos da classe – uma única cópia total (ex.: um contador de quantos objetos existem). Um método estático pertence à classe e não pode usar campos de instância diretamente. Acesse-os pelo nome da classe: Student.getCount().

    3.8

    Escopo e Acesso

    Programa

    Objetivo de Aprendizagem 3.8.A: Explicar onde as variáveis podem ser usadas no código.

    • 3.8.A.1 Variáveis locais são variáveis declaradas nos cabeçalhos ou corpos de blocos de código. Variáveis locais só podem ser acessadas no bloco em que foram declaradas. Como construtores e métodos são blocos de código, parâmetros de construtores ou métodos também são considerados variáveis locais. Essas variáveis só podem ser usadas dentro do construtor ou método e não podem ser declaradas como public ou private.
    • 3.8.A.2 Quando há uma variável local ou parâmetro com o mesmo nome de uma variável de instância, o nome da variável referirá-se à variável local em vez da variável de instância dentro do corpo do construtor ou método.

    Fonte: College Board AP Course and Exam Description

    Escopo 作用域 é onde um nome é visível. Uma variável local declarada em um método existe apenas dentro dele; um parâmetro existe apenas em seu método; uma variável de instância é visível por todo o objeto. Modificadores de acesso controlam visibilidade entre classes: private (apenas esta classe) versus public (em qualquer lugar). Variáveis locais sombream campos do mesmo nome – fonte de bugs.

    Uma variável global é visível em toda parte; uma variável local apenas dentro de seu bloco
    Uma variável global é visível em toda parte; uma variável local apenas dentro de seu bloco
    Vocabulário Treinar
    Inglês Chinês Pinyin
    Scope/skəʊp/ 作用域 zuò yòng yù
    3.9

    A Palavra-chave this

    Programa

    Objetivo de Aprendizagem 3.9.A: Desenvolver código para expressões que fazem referência a si mesmas e determinar o resultado dessas expressões.

    • 3.9.A.1 Dentro de um método de instância ou um construtor, a palavra-chave this atua como uma variável especial que segura uma referência ao objeto atual — o objeto cujo método ou construtor está sendo chamado.
    • 3.9.A.2 A palavra-chave this pode ser usada para passar o objeto atual como um argumento em uma chamada de método.
    • 3.9.A.3 Métodos de classe não possuem uma referência this.

    Fonte: College Board AP Course and Exam Description

    this é uma referência para o objeto atual. Use-o para diferenciar um campo de um parâmetro com o mesmo nome, ou para chamar outro método do mesmo objeto:

    public Student(String name, int score) {
        this.name = name;      // this.name is the field; name is the parameter
        this.score = score;
    }
    

    Habilidade para prova: quando um parâmetro de construtor ou setter tem o mesmo nome de um campo, você deve escrever this.field = param – sem this, a atribuição não faz nada útil.

    3.9

    Dicas de prova

    • Projete com métodos e classes: encapsule dados como campos private e exponha comportamento através de métodos públicos.
    • Saiba a diferença entre um objeto e sua classe, e que objetos são passados por valor — o parâmetro recebe uma cópia da referência, então um método pode alterar o estado do objeto, mas reatribuir o parâmetro não afeta o chamador (Java não tem passed-by-reference).
    • Traverser arrays e ArrayLists com segurança — tamanho é length vs .size(), e remover durante um loop desloca índices.
    • Rastrear um método recursivo para determinar seu resultado: encontre o caso base primeiro, depois siga cada chamada recursiva até seu valor de retorno (escrever código recursivo está fora do escopo da prova).
    • Reconhecer vocabulário de herança – superclasse, subclasse, overriding de métodos, e que toda classe é uma subclasse de Object (projetar e implementar herança está fora do escopo da prova).
  • 4

    Coleções de Dados

    Assistir aula
    4.1

    Ética na Coleta de Dados

    Programa

    Objetivo de Aprendizagem 4.1.A: Explicar os riscos à privacidade decorrentes da coleta e armazenamento de dados pessoais em sistemas computacionais.

    • 4.1.A.1 Ao usar um computador, a privacidade pessoal está em risco. Ao desenvolver novos programas, programadores devem tentar salvaguardar a privacidade pessoal do usuário.

    Objetivo de Aprendizagem 4.1.B: Explicar a importância de reconhecer a qualidade dos dados e potenciais problemas ao usar um conjunto de dados.

    • 4.1.B.1 Viés algorítmico descreve erros sistêmicos e repetitivos em um programa que criam resultados injustos para um grupo específico de usuários.
    • 4.1.B.2 Programadores devem estar cientes do método de coleta do conjunto de dados e do potencial de viés ao usar esse método antes de usar os dados para extrapolar novas informações ou tirar conclusões.
    • 4.1.B.3 Alguns conjuntos de dados são incompletos ou contêm dados imprecisos. O uso de tais dados no desenvolvimento ou uso de um programa pode causar o funcionamento incorreto ou ineficiente do programa.

    Objetivo de Aprendizagem 4.1.C: Identificar um conjunto de dados apropriado para usar a fim de resolver um problema ou responder a uma pergunta específica.

    • 4.1.C.1 Os conteúdos de um conjunto de dados podem estar relacionados a uma pergunta ou tópico específico e podem não ser adequados para fornecer respostas corretas ou extrapolar informações para uma pergunta ou tópico diferente.

    Fonte: College Board AP Course and Exam Description

     racks de servidores em um centro de dados – grandes coleções de dados levantam questões éticas sobre coleta e uso
    racks de servidores em um centro de dados – grandes coleções de dados levantam questões éticas sobre coleta e uso

    Programas que coletam dados levantam questões de privacidade 隐私 e consentimento 同意. Colete apenas o necessário, proteja os dados e seja honesto sobre seu uso. Dados podem carregar viés 偏见 se não representarem todos com justiça, levando a resultados injustos – uma responsabilidade que vem com armazenar informações.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    privacy/ˈprɪvəsi/ 隐私 yǐn sī
    consent/kənˈsent/ 同意 tóng yì
    bias/ˈbaɪəs/ 偏见 piān jiàn
    data structure/ˈdeɪtə ˈstrʌktʃə/ 数据结构 shù jù jié gòu
    4.2

    Por Que Precisamos de Estruturas de Dados

    Programa

    Objetivo de Aprendizagem 4.2.A: Representar padrões e algoritmos que envolvem conjuntos de dados encontrados no cotidiano usando linguagem escrita ou diagramas.

    • 4.2.A.1 Um conjunto de dados é uma coleção de peças específicas de informação ou dados.
    • 4.2.A.2 Conjuntos de dados podem ser manipulados e analisados para resolver um problema ou responder a uma pergunta. Ao analisar conjuntos de dados, os valores dentro do conjunto são acessados e utilizados um de cada vez e depois processados de acordo com o resultado desejado.
    • 4.2.A.3 Dados podem ser representados em um diagrama usando um gráfico ou tabela. Este visual pode ser usado para planejar o algoritmo que será usado para manipular os dados.

    Fonte: College Board AP Course and Exam Description

    Um arquivo de arquivos: coleções armazenam muitos valores sob um único nome para que algoritmos possam processá-los
    Um arquivo de arquivos: coleções armazenam muitos valores sob um único nome para que algoritmos possam processá-los

    Uma única variável segura um valor; problemas reais precisam armazenar muitos valores relacionados – uma lista de alunos, pixels, leituras de sensores. Uma estrutura de dados 数据结构 organiza uma coleção para podermos armazenar, encontrar e processar itens eficientemente. O curso AP usa três: o array, o ArrayList e o array 2D.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    ArrayList/əˈreɪ lɪst/ 动态数组 dòng tài shù zǔ
    2D array/ˌtuː ˈdiː əˈreɪ/ 二维数组 èr wéi shù zǔ
    row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ 行主序 xíng zhǔ xù
    4.3

    Criando e Lendo um Array

    Programa

    Objetivo de Aprendizagem 4.3.A: Desenvolver código usado para representar coleções de dados relacionados usando objetos array unidimensional (1D).

    • 4.3.A.1 Um array armazena múltiplos valores do mesmo tipo. Os valores podem ser valores primitivos ou referências de objeto.
    • 4.3.A.2 O comprimento de um array é estabelecido no momento da criação e não pode ser alterado. O comprimento de um array pode ser acessado através do atributo length.
    • 4.3.A.3 Quando um array é criado usando a palavra-chave new, todos os seus elementos são inicializados com os valores padrão para o tipo de dado do elemento. O valor padrão para int é 0, para double é 0.0, para boolean é false, e para um tipo de referência é null.
    • 4.3.A.4 Listas de inicialização podem ser usadas para criar e inicializar arrays.
    • 4.3.A.5 Colchetes [ ] são usados para acessar e modificar um elemento em um array 1D usando um índice.
    • 4.3.A.6 Os valores de índice válidos para um array variam de 0 a um menos que o comprimento do array, inclusive. Usar um valor de índice fora desse intervalo resultará em uma ArrayIndexOutOfBoundsException.

    Fonte: College Board AP Course and Exam Description

    Um array 数组 é uma coleção ordenada de tamanho fixo de valores do mesmo tipo. Os índices variam de 0 a length - 1:

    Um array unidimensional (uma lista) com seus índices e limites
    Um array unidimensional (uma lista) com seus índices e limites
    int[] nums = new int[5];        // five zeros
    int[] vals = {3, 1, 4, 1, 5};   // initialized
    int first = vals[0];            // 3
    int n = vals.length;            // 5 (a field, not a method)
    

    Acessar um índice fora 0..length-1 lança um ArrayIndexOutOfBoundsException.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    array/əˈreɪ/ 数组 shù zǔ
    4.4

    Visitando Cada Elemento de um Array

    Programa

    Objetivo de Aprendizagem 4.4.A: Desenvolver código usado para percorrer os elementos em um array 1D e determinar o resultado desses percursos.

    • 4.4.A.1 Percorrer um array ocorre quando instruções de repetição são usadas para acessar todos ou uma sequência ordenada de elementos em um array.
    • 4.4.A.2 Percorrer um array com um loop indexado for ou loop while requer que os elementos sejam acessados usando seus índices.
    • 4.4.A.3 Um cabeçalho de loop melhorado for inclui uma variável, referida como a variável de loop melhorado for. Para cada iteração do loop melhorado for, a variável de loop melhorado for recebe uma cópia de um elemento sem usar seu índice.
    • 4.4.A.4 Atribuir um novo valor à variável de loop melhorado for não altera o valor armazenado no array.
    • 4.4.A.5 Quando um array armazena referências de objeto, os atributos podem ser modificados chamando métodos na variável de loop melhorado for. Isso não altera as referências de objeto armazenadas no array.
    • 4.4.A.6 Código escrito usando um loop melhorado for para percorrer elementos em um array pode ser reescrito usando um loop indexado for ou um loop while.

    Fonte: College Board AP Course and Exam Description

    Traverse 遍历 um array com um loop for (dá o índice) ou um loop enhanced for / for-each (dá cada valor, leitura-only):

    for (int i = 0; i < a.length; i++) { a[i] *= 2; }   // can modify
    for (int v : a) { System.out.println(v); }          // read each value
    
    Vocabulário Treinar
    Inglês Chinês Pinyin
    Traverse/trəˈvɜːs/ 遍历 biàn lì
    4.5

    Algoritmos Padrão de Array

    Programa

    Objetivo de Aprendizagem 4.5.A: Desenvolver código para algoritmos padrão e originais para um contexto ou especificidade particular que envolva arrays e determinar o resultado desses algoritmos.

    • 4.5.A.1 Existem algoritmos padrão que utilizam percursos de array para:
      • determinar um valor mínimo ou máximo
      • computar uma soma ou média
      • determinar se pelo menos um elemento possui uma propriedade particular
      • determinar se todos os elementos possuem uma propriedade particular
      • determinar o número de elementos que possuem uma propriedade particular
      • acessar todosos pares consecutivos de elementos
      • determinar a presença ou ausência de elementos duplicados
      • deslocar ou rotacionar elementos para a esquerda ou direita
      • inverter a ordem dos elementos

    Fonte: College Board AP Course and Exam Description

    Domine esses padrões: calcular uma soma ou média, encontrar o max/mín, contar itens atendendo a uma condição, verificar uma duplicata, e reverter ou deslocar elementos. Cada um é uma travessia com um resultado acumulado:

    int sum = 0;
    for (int v : a) sum += v;
    double avg = (double) sum / a.length;
    
    4.6

    Lendo Dados de um Arquivo de Texto

    Programa

    Objetivo de Aprendizagem 4.6.A: Desenvolver código para ler dados de um arquivo de texto.

    • 4.6.A.1 Um arquivo é armazenamento para dados que persiste quando o programa não está em execução. Os dados em um arquivo podem ser recuperados durante a execução do programa.
    • 4.6.A.2 Um arquivo pode ser conectado ao programa usando as classes File e Scanner.
    • 4.6.A.3 Um arquivo pode ser aberto criando um objeto File, usando o nome do arquivo como argumento do construtor.
      • File(String str) é o construtor File que aceita um nome de arquivo String para abrir para leitura, onde str é o caminho de acesso para o arquivo.
    • 4.6.A.4 Ao usar a classe File, é necessário indicar o que fazer se o arquivo com o nome fornecido não puder ser aberto. Uma maneira de fazer isso é adicionar throws IOException ao cabeçalho do método que usa o arquivo. Se o nome do arquivo for inválido, o programa será encerrado.
    • 4.6.A.5 As classes File e IOException fazem parte do pacote java.io. Uma instrução import deve ser usada para tornar essas classes disponíveis para uso no programa.
    • 4.6.A.6 Os seguintes métodos e construtor Scanner — incluindo o que eles fazem e quando são usados — fazem parte da Referência Rápida do Java:
      • Scanner(File f) é o construtor Scanner que aceita um File para leitura.
      • int nextInt() retorna o próximo int lido do arquivo ou fonte de entrada se disponível. Se o próximo int não existir ou estiver fora do intervalo, resultará em uma InputMismatchException.
      • double nextDouble() retorna o próximo double lido do arquivo ou fonte de entrada. Se o próximo double não existir, resultará em uma InputMismatchException.
      • boolean nextBoolean() retorna o próximo boolean lido do arquivo ou fonte de entrada. Se o próximo boolean não existir, resultará em uma InputMismatchException.
      • String nextLine() retorna a próxima linha de texto como um String lido do arquivo ou fonte de entrada; pode retornar a string vazia se chamado imediatamente após outro método Scanner que está lendo do arquivo ou fonte de entrada.
      • String next() retorna o próximo String lido do arquivo ou fonte de entrada.
      • boolean hasNext() retorna true se houver um próximo item para ler no arquivo ou fonte de entrada; retorna false caso contrário.
      • void close() fecha este scanner.
      • Declaração de exclusão: Aceitar entrada do teclado está fora do escopo do curso e exame AP Computer Science A.
    • 4.6.A.7 Usar nextLine e outros métodos Scanner juntos na mesma fonte de entrada às vezes requer código para ajustar pelas diferentes maneiras que os métodos lidam com espaços em branco.
      • Declaração de exclusão: Escrever ou analisar código que usa tanto nextLine quanto outros métodos Scanner na mesma fonte de entrada está fora do escopo do curso e exame AP Computer Science A.
    • 4.6.A.8 O seguinte método adicional String — incluindo o que ele faz e quando é usado — faz parte da Referência Rápida do Java:
      • String[] split(String del) retorna um array de String onde cada elemento é um subarray de this String, que foi dividido em torno de correspondências da expressão dada del.
      • Declaração de exclusão: O parâmetro del usa um formato chamado expressão regular. Escrever ou analisar código que usa qualquer uma das propriedades especiais de expressões regulares (p. ex., \\*, \\.) está fora do escopo do curso e exame AP Computer Science A.
    • 4.6.A.9 Um loop melhorado while pode ser usado para detectar se o arquivo ainda contém elementos para ler usando o método hasNext como condição do loop.
    • 4.6.A.10 Um arquivo deve ser fechado quando o programa termina de usá-lo. O método close de Scanner é chamado para fechar o arquivo.

    Fonte: College Board AP Course and Exam Description

    File e IOException vivem em java.io, então um programa que lê um arquivo precisa de import java.io.*;. Abrir um arquivo pode falhar (ele pode não existir), e o Java obriga você a lidar com isso – a maneira mais simples é adicionar throws IOException ao cabeçalho do método. Um Scanner então lê o arquivo linha por linha, usando hasNext... para testar antes de ler:

    import java.io.*;
    ...
    public static void readFile() throws IOException {
        Scanner f = new Scanner(new File("data.txt"));
        while (f.hasNextLine()) {
            String line = f.nextLine();
        }
    }
    

    Lendo tokens tipados com nextInt(), nextDouble(), ou nextBoolean() lança um InputMismatchException se o próximo token for do tipo errado – por exemplo, chamar nextInt() quando a próxima coisa no arquivo é a palavra cat.

    4.7

    Envolvendo um Número em um Objeto

    Programa

    Objetivo de Aprendizagem 4.7.A: Desenvolver código para usar objetos Integer e Double a partir de seus equivalentes primitivos e determinar o resultado do uso desses objetos.

    • 4.7.A.1 As classes Integer e Double fazem parte do pacote java.lang. Um objeto Integer é imutável, o que significa que, uma vez criado um objeto Integer, seus atributos não podem ser alterados. Um objeto Double é imutável, o que significa que, uma vez criado um objeto Double, seus atributos não podem ser alterados.
    • 4.7.A.2 Autoboxing é a conversão automática que o compilador Java faz entre tipos primitivos e suas respectivas classes wrapper de objeto. Isso inclui converter um int para um Integer e um double para um Double. O compilador Java aplica autoboxing quando um valor primitivo é:
      • passado como parâmetro para um método que espera um objeto da classe wrapper correspondente
      • atribuído a uma variável da classe wrapper correspondente
    • 4.7.A.3 Unboxing é a conversão automática que o compilador Java faz da classe wrapper para o tipo primitivo. Isso inclui converter um Integer para um int e um Double para um double. O compilador Java aplica unboxing quando um objeto de classe wrapper é:
      • passado como parâmetro para um método que espera um valor do tipo primitivo correspondente
      • atribuído a uma variável do tipo primitivo correspondente
    • 4.7.A.4 O seguinte método de classe Integer — incluindo o que ele faz e quando é usado — faz parte da Referência Rápida do Java:
      • static int parseInt(String s) retorna o argumento String como um int.
    • 4.7.A.5 O seguinte método de classe Double — incluindo o que ele faz e quando é usado — faz parte da Referência Rápida do Java:
      • static double parseDouble(String s) retorna o argumento String como um double.

    Fonte: College Board AP Course and Exam Description

    Um ArrayList armazena objetos, não primitivos, então um primitivo é envolvido em um objeto: Integer envolve int, Double envolve double. Java faz isso automaticamente com autoboxing 自动装箱 (int para Integer) e unboxing (para trás novamente), então você pode escrever list.add(5) e int x = list.get(0).

    Vocabulário Treinar
    Inglês Chinês Pinyin
    autoboxing/ˌɔːtəʊˈbɒksɪŋ/ 自动装箱 zì dòng zhuāng xiāng
    4.8

    O Kit de Ferramentas ArrayList

    Programa

    Objetivo de Aprendizagem 4.8.A: Desenvolver código para coleções de objetos relacionados usando objetos ArrayList e determinar o resultado de chamar métodos nesses objetos.

    • 4.8.A.1 Um objeto ArrayList é mutável em tamanho e contém referências de objeto.
    • 4.8.A.2 O construtor ArrayList ArrayList() constrói uma lista vazia.
    • 4.8.A.3 O Java permite o tipo genérico ArrayList<E>, onde o parâmetro de tipo E especifica o tipo dos elementos. Quando ArrayList<E> é especificado, os tipos dos parâmetros de referência e tipo de retorno ao usar os métodos ArrayList são do tipo E. ArrayList<E> é preferível a ArrayList. Por exemplo, ArrayList<String> names = new ArrayList<String>(); permite que o compilador encontre erros que seriam encontrados apenas em tempo de execução.
    • 4.8.A.4 A classe ArrayList faz parte do pacote java.util. Uma instrução import deve ser usada para tornar esta classe disponível para uso no programa.
    • 4.8.A.5 Os seguintes métodos ArrayList — incluindo o que eles fazem e quando são usados — fazem parte do Java Quick Reference:
      • int size() retorna o número de elementos na lista.
      • boolean add(E obj) adiciona obj ao final da lista; retorna true.
      • void add(int index, E obj) insere obj na posição index (0 <= index <= size), movendo os elementos nas posições index e superiores para a direita (soma 1 aos seus índices) e soma 1 ao tamanho.
      • E get(int index) retorna o elemento na posição index na lista.
      • E set(int index, E obj) substitui o elemento na posição index por obj; retorna o elemento anteriormente na posição index.
      • E remove(int index) remove o elemento da posição index, movendo os elementos nas posições index + 1 e superiores para a esquerda (subtrai 1 dos seus índices) e subtrai 1 do tamanho; retorna o elemento anteriormente na posição index.
    • 4.8.A.6 Os índices para um ArrayList começam em 0 e terminam no número de elementos - 1.

    Fonte: College Board AP Course and Exam Description

    O que um ArrayList realmente é

    Um ArrayList (array dinâmico) expande e encolhe conforme você adiciona ou remove itens. Declare-o com o tipo de elemento em <>:

    ArrayList<String> names = new ArrayList<String>();
    names.add("Amy");           // append
    names.add(0, "Bob");        // insert at index
    names.get(0);               // read
    names.set(1, "Cara");       // replace
    names.remove(0);            // delete, shifts the rest left
    names.size();               // count (a method, unlike array.length)
    
    4.9

    Visitando Cada Elemento de um ArrayList

    Programa

    Objetivo de Aprendizagem 4.9.A: Desenvolver código usado para percorrer os elementos de um ArrayList e determinar os resultados desses percursos.

    • 4.9.A.1 Percorrer um ArrayList ocorre quando instruções de iteração ou recursivas são usadas para acessar todos ou uma sequência ordenada dos elementos em um ArrayList.
    • 4.9.A.2 Excluir elementos durante um percurso de um ArrayList requer o uso de técnicas especiais para evitar pular elementos.
    • 4.9.A.3 Tentar acessar um valor de índice fora do seu intervalo resultará em uma IndexOutOfBoundsException.
    • 4.9.A.4 Alterar o tamanho de um ArrayList enquanto o percorre usando um loop melhorado for pode resultar em uma ConcurrentModificationException. Portanto, ao usar um loop melhorado for para percorrer um ArrayList, você não deve adicionar ou remover elementos.

    Fonte: College Board AP Course and Exam Description

    Percorra usando um loop por índice ou um loop for-each, assim como os arrays (use size() e get(i)):

    for (int i = 0; i < list.size(); i++) { ... list.get(i) ... }
    for (String s : list) { ... }
    

    Habilidade para prova: ao remover itens em um loop por índice, faça o loop de trás para frente ou não increment i após uma remoção – caso contrário, a remoção desloca os elementos para a esquerda e você pulará um. E nunca adicione ou remova elementos enquanto percorre um ArrayList com um loop for-each: alterar seu tamanho durante o loop gera um ConcurrentModificationException, então use um loop por índice (de trás para frente, como acima) sempre que precisar remover.

    4.10

    Algoritmos Padrão de ArrayList

    Programa

    Objetivo de Aprendizagem 4.10.A: Desenvolver código para algoritmos padrão e originais para um contexto ou especificidade particular que envolvam objetos ArrayList e determinar o resultado desses algoritmos.

    • 4.10.A.1 Existem algoritmos ArrayList padrão que utilizam travessias para:
      • determinar um valor mínimo ou máximo
      • computar uma soma ou média
      • determinar se pelo menos um elemento possui uma propriedade particular
      • determinar se todos os elementos possuem uma propriedade particular
      • determinar o número de elementos que possuem uma propriedade particular
      • acessar todosos pares consecutivos de elementos
      • determinar a presença ou ausência de elementos duplicados
      • deslocar ou rotacionar elementos para a esquerda ou direita
      • inverter a ordem dos elementos
      • inserir elementos
      • excluir elementos
    • 4.10.A.2 Alguns algoritmos requerem múltiplos String, array, ou objetos ArrayList a serem percorridos simultaneamente.

    Fonte: College Board AP Course and Exam Description

    Os mesmos algoritmos dos arrays – máximo/mínimo, contagem, soma – mais inserção e exclusão que os arrays não conseguem fazer facilmente. Uma tarefa comum é remover todos os elementos que correspondem a uma condição, manuseando cuidadosamente o deslocamento do índice.

    4.11

    Matrizes: Arrays Bidimensionais

    Programa

    Objetivo de Aprendizagem 4.11.A: Desenvolver código usado para representar coleções de dados relacionados usando objetos array bidimensional (2D).

    • 4.11.A.1 Um array 2D é armazenado como um array de arrays. Portanto, a forma como arrays 2D são criados e indexados é semelhante a objetos array unidimensionais (1D). O tamanho de um array 2D é estabelecido no momento da criação e não pode ser alterado. Arrays 2D podem armazenar dados primitivos ou dados de referência de objeto.
      • Declaração de exclusão: Objetos array 2D não retangulares estão fora do escopo do curso e exame AP Computer Science A.
    • 4.11.A.2 Quando um array 2D é criado usando a palavra-chave new, todos os seus elementos são inicializados com os valores padrão para o tipo de dado do elemento. O valor padrão para int é 0, para double é 0.0, para boolean é false, e para um tipo de referência é null.
    • 4.11.A.3 A lista de inicialização usada para criar e inicializar um array 2D consiste em listas de inicialização que representam arrays 1D; por exemplo, int[][] arr2D = { {1, 2, 3}, {4, 5, 6} };.
    • 4.11.A.4 Os colchetes [row][col] são usados para acessar e modificar um elemento em um array 2D. Para fins de exame, ao acessar o elemento em arr[first][second], o primeiro índice é usado para linhas, o segundo índice é usado para colunas.
    • 4.11.A.5 Um único array que é uma linha de um array 2D pode ser acessado usando o nome do array 2D e um único par de colchetes contendo o índice da linha.
    • 4.11.A.6 O número de linhas contidas em um array 2D pode ser acessado através do atributo length. Os valores de índice de linha válidos para um array 2D são 0 até um menos que o número de linhas ou o comprimento do array, inclusive. O número de colunas contidas em um array 2D pode ser acessado através do atributo length de uma das linhas. Os valores de índice de coluna válidos para um array 2D são 0 até um menos que o número de colunas ou o comprimento de qualquer linha dada do array, inclusive. Por exemplo, dado um array 2D chamado values, o número de linhas é values.length e o número de colunas é values[0].length. Usar um valor de índice fora desses intervalos resultará em um erro de ArrayIndexOutOfBoundsException.

    Fonte: College Board AP Course and Exam Description

    Um array 2D (matriz bidimensional) é uma grade (linhas e colunas) – um array de arrays:

    Uma matriz bidimensional (uma tabela) com índices de linha e coluna
    Uma matriz bidimensional (uma tabela) com índices de linha e coluna
    int[][] grid = new int[3][4];   // 3 rows, 4 columns
    grid[r][c] = 7;                 // row r, column c
    int rows = grid.length;         // 3
    int cols = grid[0].length;      // 4
    
    Explorar

    Indexar uma matriz 2D por linha e coluna

    Uma matriz 2D é uma grade endereçada por [row][col]. Mova os índices e observe qual célula eles selecionam — linha primeiro, depois coluna, ambas contando a partir de 0.

    4.12

    Percorrendo uma Grade

    Programa

    Objetivo de Aprendizagem 4.12.A: Desenvolver código usado para percorrer os elementos em um array 2D e determinar o resultado desses percursos.

    • 4.12.A.1 Estruturas de iteração aninhadas são usadas para percorrer e acessar todos ou uma sequência ordenada de elementos em um array 2D. Como arrays 2D são armazenados como arrays de arrays, a forma como arrays 2D são percorridos usando loops for e loops enhanced for é semelhante a objetos array 1D. Estruturas de iteração aninhadas podem ser escritas para percorrer o array 2D em ordem row-major (maioria por linha), ordem column-major (maioria por coluna) ou uma ordem definida unicamente. Ordem row-major refere-se a uma ordenação de elementos de array 2D onde a traversa ocorre através de cada linha, enquanto a traversa column-major ocorre para baixo em cada coluna.
    • 4.12.A.2 O loop externo de um loop aninhado enhanced for usado para percorrer um array 2D percorre as linhas. Portanto, a variável do loop enhanced for deve ser o tipo de cada linha, que é um array 1D. O loop interno percorre uma única linha. Portanto, a variável do loop enhanced interno for deve ser do mesmo tipo que os elementos armazenados no array 1D. Atribuir um novo valor à variável do loop enhanced for não altera o valor armazenado no array.

    Fonte: College Board AP Course and Exam Description

    Percorrendo um array 2-D

    Visite cada célula com loops aninhados – o externo sobre linhas, o interno sobre colunas (ordem row-major 行主序):

    for (int r = 0; r < grid.length; r++)
        for (int c = 0; c < grid[0].length; c++)
            System.out.print(grid[r][c]);
    
    4.13

    Algoritmos Padrão de Array 2D

    Programa

    Objetivo de Aprendizagem 4.13.A: Desenvolver código para algoritmos padrão e originais para um contexto ou especificidade particular que envolve arrays 2D e determinar o resultado desses algoritmos.

    • 4.13.A.1 Existem algoritmos padrão que utilizam percursos de array 2D para:
      • determinar um valor mínimo ou máximo de todos os elementos ou para uma linha, coluna ou outra subseção designada
      • computar uma soma ou média de todos os elementos ou para uma linha, coluna ou outra subseção designada
      • determinar se pelo menos um elemento tem uma propriedade particular em todo o array 2D ou para uma linha, coluna ou outra subseção designada
      • determinar se todos os elementos do array 2D ou uma linha, coluna ou outra subseção designada têm uma propriedade particular
      • determinar o número de elementos no array 2D ou em uma linha, coluna ou outra subseção designada que possuem uma propriedade particular
      • acessar todosos pares consecutivos de elementos
      • determinar a presença ou ausência de elementos duplicados no array 2D ou em uma linha, coluna ou outra subseção designada
      • deslocar ou rotacionar elementos em uma linha para a esquerda ou direita ou em uma coluna para cima ou para baixo
      • inverter a ordem dos elementos em uma linha ou coluna

    Fonte: College Board AP Course and Exam Description

    Tarefas típicas de grade: somar uma linha ou coluna, encontrar o máximo na grade, contar células correspondentes ou somar uma diagonal (onde r == c). Cada uma é uma travessia aninhada com um resultado acumulado.

    4.14

    Encontrando um Valor: Busca Linear e Binária

    Programa

    Objetivo de Aprendizagem 4.14.A: Desenvolver código usado para algoritmos de busca linear para buscar informações específicas em uma coleção e determinar os resultados da execução de uma busca.

    • 4.14.A.1 Algoritmos de busca linear são algoritmos padrão que verificam cada elemento na ordem até que o valor desejado seja encontrado ou todos os elementos no array ou ArrayList tenham sido verificados. Algoritmos de busca linear podem iniciar o processo de busca desde qualquer extremidade do array ou ArrayList.
    • 4.14.A.2 Ao aplicar algoritmos de busca linear em arrays 2D, cada linha deve ser acessada e então a busca linear aplicada a cada linha do array 2D.

    Fonte: College Board AP Course and Exam Description

    Busca binária: divida pela metade e conquiste
    • Busca linear 线性搜索 verifica cada elemento sucessivamente – funciona em qualquer lista, levando até $n$ passos.
    • Busca binária 二分搜索 funciona apenas em uma lista ordenada: verifica o meio, depois descarta a metade que não pode conter o alvo, repetindo. Leva cerca de $\log_2 n$ passos – muito mais rápido em grandes quantidades de dados.
    A busca binária reduz pela metade o intervalo em cada passo
    A busca binária reduz pela metade o intervalo em cada passo
    A busca linear verifica cada elemento sucessivamente até encontrar o alvo
    A busca linear verifica cada elemento sucessivamente até encontrar o alvo
    int lo = 0, hi = a.length - 1;
    while (lo <= hi) {
        int mid = (lo + hi) / 2;
        if (a[mid] == target) return mid;
        else if (a[mid] < target) lo = mid + 1;
        else hi = mid - 1;
    }
    

    Habilidade de prova: a busca binária requer dados ordenados; saiba quantas comparações ela faz e como lo, hi, mid são atualizados.

    Exemplo resolvido. Buscar target = 40 no array ordenado {3, 9, 14, 23, 31, 42, 55} (índices 0–6). Inicie lo=0, hi=6:

    • mid = (0+6)/2 = 3, a[3]=23 < 40, então lo = 4;
    • mid = (4+6)/2 = 5, a[5]=42 > 40, então hi = 4;
    • mid = (4+4)/2 = 4, a[4]=31 < 40, então lo = 5;
    • agora lo (5) > hi (4), então o loop termina – 40 não está presente.

    Cada passo reduziu o intervalo pela metade, então mesmo esse erro levou apenas três comparações.

    Explorar

    Comparar busca linear e binária

    Busca linear verifica cada elemento por vez; busca binária divide uma lista ordenada pela metade a cada etapa. Observe a busca binária alcançar o alvo em muitas menos comparações.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Linear search/ˈlɪnɪə sɜːtʃ/ 线性搜索 xiàn xìng sōu suǒ
    Binary search/ˈbaɪnəri sɜːtʃ/ 二分搜索 èr fēn sōu suǒ
    Selection sort/sɪˈlekʃn sɔːt/ 选择排序 xuǎn zé pái xù
    4.15

    Colocando Dados em Ordem: Ordenação por Seleção e Inserção

    Programa

    Objetivo de Aprendizagem 4.15.A: Determinar o resultado da execução de cada etapa de algoritmos de ordenação para ordenar os elementos de uma coleção.

    • 4.15.A.1 Selection sort (ordenação por seleção) e insertion sort (ordenação por inserção) são algoritmos de ordenação iterativos que podem ser usados para ordenar elementos em um array ou ArrayList.
    • 4.15.A.2 Selection sort seleciona repetidamente o menor (ou maior) elemento da porção não ordenada da lista e o troca para sua posição correta (e final) na porção ordenada da lista.
    • 4.15.A.3 Insertion sort insere um elemento da porção não ordenada de uma lista em sua posição correta (mas não necessariamente final) na porção ordenada da lista, deslocando elementos da porção ordenada para fazer espaço para o novo elemento.

    Fonte: College Board AP Course and Exam Description

    Ordenação por Inserção
    Ordenação bolha, passo a passo
    • Ordenação por Seleção 选择排序 encontra repetidamente o menor elemento restante e o troca para a posição correta.
    • Ordenação por Inserção 插入排序 cresce uma parte frontal ordenada, inserindo cada novo elemento onde ele pertence.
    Uma ordenação por inserção, deslocando cada chave para o lugar certo, passada após passada
    Uma ordenação por inserção, deslocando cada chave para o lugar certo, passada após passada

    Ambas são simples e levam cerca de $n^2$ passos em média – adequadas para pequenos arrays. Saiba rastrear o array após cada passada.

    Explorar

    Observar um algoritmo de ordenação classificar uma lista

    Uma ordenação rearranja elementos em ordem. Avance pela seleção/ordenação de inserção para ver a região ordenada crescer um elemento de cada vez.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Insertion sort/ɪnˈsɜːʃn sɔːt/ 插入排序 chā rù pái xù
    4.16

    Métodos que se Chamam Recursivamente: Recursão

    Programa

    Objetivo de Aprendizagem 4.16.A: Determinar o resultado de chamadas de métodos recursivos.

    • 4.16.A.1 Um método recursivo é um método que se chama a si mesmo. Métodos recursivos contêm pelo menos um caso base, que interrompe a recursão, e pelo menos uma chamada recursiva. Recursão é outra forma de repetição.
    • 4.16.A.2 Cada chamada recursiva possui seu próprio conjunto de variáveis locais, incluindo os parâmetros. Os valores dos parâmetros capturam o progresso de um processo recursivo, assim como os valores das variáveis de controle de loop capturam o progresso de um loop.
    • 4.16.A.3 Qualquer solução recursiva pode ser replicada através do uso de uma abordagem iterativa e vice-versa.
      • Declaração de exclusão: Escrever código recursivo está fora do escopo do curso e exame AP Computer Science A.

    Fonte: College Board AP Course and Exam Description

    Recursão e a pilha de chamadas

    Recursão 递归 é um método que se chama com uma entrada menor. Ela precisa de um caso base 基本情况 que pare as chamadas, e de um caso recursivo que avance em direção à base:

    public static int factorial(int n) {
        if (n <= 1) return 1;          // base case
        return n * factorial(n - 1);   // recursive case
    }
    

    Sem um caso base alcançável, a recursão nunca para (um estouro de pilha).

    Recursão e iteração são intercambiáveis. Qualquer solução recursiva pode ser reescrita com um laço (abordagem iterativa), e qualquer loop pode ser reescrito com recursão - eles resolvem os mesmos problemas. A factorial acima tem efeito idêntico a uma versão iterativa:

    public static int factorial(int n) {
        int result = 1;
        for (int i = 2; i <= n; i++) result *= i;   // same answer, no self-call
        return result;
    }
    

    Então a escolha trata-se de clareza, não capacidade: a recursão lê naturalmente para problemas com estrutura autorreferente (árvores, merge sort), enquanto a iteração evita o custo de memória de empilhar um frame de chamada por passo. A prova pode pedir para converter um no outro.

    Explorar

    Desdobrar uma chamada recursiva

    Um método recursivo chama a si mesmo em uma entrada menor até atingir um caso base, então os resultados se dobram de volta. Avance para ver as chamadas empilharem e se desfazerem.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Recursion/rɪˈkɜːʃn/ 递归 dì guī
    base case/beɪs keɪs/ 基本情况 jī běn qíng kuàng
    4.17

    Busca Recursiva e Merge Sort

    Programa

    Objetivo de Aprendizagem 4.17.A: Determinar o resultado da execução de algoritmos recursivos que usam strings ou coleções.

    • 4.17.A.1 A recursão pode ser usada para percorrer objetos String, arrays e objetos ArrayList.

    Objetivo de Aprendizagem 4.17.B: Determinar o resultado de cada iteração de um algoritmo de busca binária usado para buscar informações em uma coleção.

    • 4.17.B.1 Os dados devem estar em ordem ordenada para usar o algoritmo de busca binária. Busca binária começa no meio de um array ordenado ou ArrayList e elimina metade do array ou ArrayList em cada chamada recursiva até que o valor desejado seja encontrado ou todos os elementos tenham sido eliminados.
    • 4.17.B.2 A busca binária é tipicamente mais eficiente que a busca linear.
      • Declaração de exclusão: Algoritmos de busca outros que linear e binária estão fora do escopo do curso e exame AP Computer Science A.
    • 4.17.B.3 O algoritmo de busca binária pode ser escrito tanto iterativamente quanto recursivamente.

    Objetivo de Aprendizagem 4.17.C: Determinar o resultado de cada iteração do algoritmo merge sort quando usado para ordenar uma coleção.

    • 4.17.C.1 Merge sort é um algoritmo de ordenação recursivo que pode ser usado para ordenar elementos em um array ou ArrayList.
      • Declaração de exclusão: Algoritmos de ordenação outros que selection sort, insertion sort e merge sort estão fora do escopo do curso e exame AP Computer Science A.
    • 4.17.C.2 Merge sort divide repetidamente um array em subarrays menores até que cada subarray tenha um único elemento e então mescla recursivamente os subarrays ordenados de volta juntos em ordem ordenada para formar o array final ordenado.

    Fonte: College Board AP Course and Exam Description

    Merge sort: divide, depois mescla

    A recursão impulsiona algoritmos eficientes. A busca binária pode ser escrita recursivamente (busque na metade correta). O merge sort 归并排序 divide o array pela metade, ordena cada metade recursivamente, depois mescla as duas metades ordenadas – levando cerca de $n\log_2 n$ passos, muito mais rápido que a ordenação por seleção ou inserção em grandes quantidades de dados.

    O merge sort divide o array em elementos individuais, depois mescla as metades ordenadas de volta para cima
    O merge sort divide o array em elementos individuais, depois mescla as metades ordenadas de volta para cima

    Exemplo resolvido. Rastreie factorial(4). Cada chamada adia para uma menor: factorial(4) = 4 * factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1). factorial(1) atinge o caso base e retorna 1, então as chamadas desdobram-se para dentro: 2 * 1 = 2, depois 3 * 2 = 6, depois 4 * 6 = 24. Escrever cada chamada acima de seu valor retornado é a maneira confiável de rastrear recursão.

    Habilidade para prova: rastreie um método recursivo escrevendo cada chamada e seu valor retornado, e saiba que a eficiência do merge sort ($n\log n$) supera as $n^2$ ordenações simples.

    Vocabulário Treinar
    Inglês Chinês Pinyin
    Merge sort/mɜːdʒ sɔːt/ 归并排序 guī bìng pái xù
    4.17

    Dicas de prova

    • Avalie ambos os benefícios e danos da coleta de dados — esta unidade é testada através de justificações escritas curtas, não de código.
    • Proteja informações pessoais identificáveis (PII) e explique riscos de privacidade e segurança no contexto.
    • Nomeie danos reais: violações de dados, vigilância e viés algorítmico devido a dados não representativos.
    • Respeite a propriedade intelectual e licenças quando reutilizar código ou dados.
    • Dê uma resposta específica e fundamentada — uma resposta vaga como "pode ser ruim" não ganha pontos.

Entrar ou criar conta

IGCSE, A-Level & AP