Saltar al contenido
Temas

AP Ciencias de la Computación A

Consejos

AP Computer Science A es un curso de Java: objetos y clases, tipos primitivos y control de flujo, escritura de clases, arreglos y ArrayLists, arreglos 2D, herencia y polimorfismo y recursión. Es un primer curso de programación enseñado con código orientado a objetos real, no pseudocódigo.

Las cuatro preguntas de respuesta libre son en Java escrito a mano. Ningún compilador detectará por ti un punto y coma faltante o un tipo de retorno incorrecto, así que escribe código en papel durante la revisión — es una habilidad diferente a escribirla.

Los arreglos y ArrayLists son el tema más evaluado. Ser fluido con el recorrido, inserción y eliminación, y saber qué índice se desplaza cuando eliminas un elemento, rinde más que cualquier otra hora individual de práctica.

Las notas cubren las unidades del CED en Java, con ejemplos ejecutables que puedes editar en el navegador. Los FRQ pasados y las guías de puntuación están en la biblioteca — los cuatro son preguntas de escritura de código, por lo que las respuestas resueltas son métodos completos en lugar de fragmentos.

  • 1

    Uso de objetos y métodos

    Ver lección
    1.1

    Introducción a los Algoritmos, la Programación y los Compiladores

    Syllabus

    Objetivo de aprendizaje 1.1.A: Representar patrones y algoritmos encontrados en la vida cotidiana utilizando lenguaje escrito o diagramas.

    • 1.1.A.1 Los algoritmos definen procesos paso a paso que se deben seguir al completar una tarea o resolver un problema. Estos algoritmos pueden representarse mediante lenguaje escrito o diagramas.
    • 1.1.A.2 El secuenciamiento define el orden en que se completan los pasos de un proceso. Los pasos de un proceso se completan uno a la vez.

    Objetivo de aprendizaje 1.1.B: Explicar el proceso de compilación y ejecución del código.

    • 1.1.B.1 El código puede escribirse en cualquier editor de texto; sin embargo, se suele utilizar un entorno integrado de desarrollo (IDE) para escribir programas, ya que proporciona herramientas que permiten al programador escribir, compilar y ejecutar código.
    • 1.1.B.2 Un compilador revisa el código en busca de ciertos errores. Los errores detectables por el compilador deben corregirse antes de que el programa pueda ejecutarse.

    Objetivo de aprendizaje 1.1.C: Identificar tipos de errores de programación.

    • 1.1.C.1 Un error de sintaxis es un error en el programa donde no se siguen las reglas del lenguaje de programación. Estos errores son detectados por el compilador.
    • 1.1.C.2 Un error lógico es un error en el algoritmo o programa que provoca que este se comporte de manera incorrecta o inesperada. Estos errores se detectan probando el programa con datos específicos para verificar si produce el resultado esperado.
    • 1.1.C.3 Un error de tiempo de ejecución es un error en el programa que ocurre durante la ejecución del mismo. Los errores de tiempo de ejecución suelen provocar que el programa termine de forma anormal.
    • 1.1.C.4 Una excepción es un tipo de error de tiempo de ejecución que ocurre como resultado de un error inesperado que no fue detectado por el compilador. Interrumpe el flujo normal de ejecución del programa.

    Fuente: College Board AP Course and Exam Description

    Código fuente en una estación de trabajo — los programas se escriben, compilan y ejecutan como instrucciones precisas
    Código fuente en una estación de trabajo — los programas se escriben, compilan y ejecutan como instrucciones precisas

    Un algoritmo es un procedimiento finito y paso a paso que resuelve un problema. Un programa expresa un algoritmo en un lenguaje que una computadora puede ejecutar. Java es compilado: el compilador traduce tu código fuente en bytecode, que la Máquina Virtual de Java (JVM) ejecuta. Un error de sintaxis (violando la gramática) es detectado por el compilador; un error lógico (resultado incorrecto) no – el programa se ejecuta pero se comporta mal.

    Un compilador traduce todo el programa de una vez; un intérprete lo ejecuta línea por línea
    Un compilador traduce todo el programa de una vez; un intérprete lo ejecuta línea por línea
    Varios chips de procesador de computadora vistos desde abajo
    Tu programa Java se compila en instrucciones que un CPU como uno de estos ejecuta realmente
    Vocabulario Entrenar
    Inglés Chino 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ù
    1.2

    Variables y Tipos de Datos

    Syllabus

    Objetivo de Aprendizaje 1.2.A: Identificar la categoría de tipo de dato más adecuada para una especificación particular.

    • 1.2.A.1 Un tipo de dato es un conjunto de valores y un conjunto correspondiente de operaciones sobre esos valores. Los tipos de datos pueden clasificarse como primitivos o de referencia.
    • 1.2.A.2 Los tipos de dato primitivos utilizados en este curso definen el conjunto de valores y las operaciones correspondientes sobre esos valores para números y valores booleanos.
    • 1.2.A.3 Un tipo de referencia se utiliza para definir objetos que no son tipos primitivos.

    Objetivo de Aprendizaje 1.2.B: Desarrollar código para declarar variables que almacenen números y valores booleanos.

    • 1.2.B.1 Los tres tipos de dato primitivos utilizados en este curso son int, double y boolean. Un valor int es un número entero. Un valor double es un número real. Un valor boolean es true (verdadero) o false (falso).
      • Afirmación de exclusión: Los otros cinco tipos de dato primitivos (long, short, byte, float y char) están fuera del alcance del curso y del examen de AP Computer Science A.
    • 1.2.B.2 Una variable es una ubicación de almacenamiento que contiene un valor, el cual puede cambiar mientras el programa se está ejecutando. Cada variable tiene un nombre y un tipo de dato asociado. Una variable de un tipo primitivo contiene un valor primitivo de ese tipo.

    Fuente: College Board AP Course and Exam Description

    Una variable es una caja con nombre que almacena un valor de un tipo fijo. Los principales tipos primitivos de Java son int (números enteros), double (decimales) y boolean (true/false). Se declaran poniendo primero el tipo:

    Los tipos de datos básicos de Java, cada uno almacenando un tipo diferente de valor
    Los tipos de datos básicos de Java, cada uno almacenando un tipo diferente de valor
    int score = 90;
    double price = 4.99;
    boolean passed = true;
    
    Explorar

    Explorar cómo una variable almacena un valor a la vez

    Una variable es una caja con nombre que almacena un valor de un tipo fijo. Pase por las líneas y observe cómo cada caja toma su valor; note que reasignar score sobrescribe el número antiguo en lugar de crear una nueva caja.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    variable/ˈveərɪəbl/ 变量 biàn liàng
    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

    Expresiones y Salida

    Syllabus

    Objetivo de aprendizaje 1.3.A: Desarrollar código para generar una salida y determinar el resultado que se mostraría.

    • 1.3.A.1 System.out.print y System.out.println muestran información en la pantalla del ordenador. System.out.println mueve el cursor a una nueva línea después de mostrar la información, mientras que System.out.print no lo hace.

    Objetivo de aprendizaje 1.3.B: Desarrollar código para utilizar literales de cadena y determinar el resultado de usar literales de cadena.

    • 1.3.B.1 Un literal es la representación de código de un valor fijo.
    • 1.3.B.2 Un literal de cadena es una secuencia de caracteres encerrada entre comillas dobles.
    • 1.3.B.3 Las secuencias de escape son secuencias especiales de caracteres que pueden incluirse en una cadena de texto. Comienzan con un \ y tienen un significado especial en Java. Las secuencias de escape utilizadas en este curso incluyen la comilla doble \", la barra invertida \\ y el salto de línea \n.

    Objetivo de aprendizaje 1.3.C: Desarrollar código para expresiones aritméticas y determinar el resultado de estas expresiones.

    • 1.3.C.1 Las expresiones aritméticas, que constan de valores numéricos, variables y operadores, incluyen expresiones de tipo int y double.
    • 1.3.C.2 Los operadores aritméticos consisten en suma +, resta -, multiplicación *, división / y resto %. Una operación aritmética que utilice dos valores int evaluará a un valor int. Una operación aritmética que utilice al menos un valor double evaluará a un valor double.
      • Enunciado de exclusión: Las expresiones que dan como resultado valores doubles especiales (p. ej., infinitos y NaN) están fuera del ámbito del curso y examen de AP Computer Science A.
    • 1.3.C.3 Al dividir valores numéricos que son ambos valores int, el resultado es solo la porción entera del cociente. Al dividir valores numéricos que utilizan al menos un valor double, el resultado es el cociente.
    • 1.3.C.4 El operador de resto % se utiliza para calcular el resto cuando un número a se divide por otro número b.
      • Enunciado de exclusión: El uso de valores menores que 0 para a y el uso de valores menores o iguales a 0 para b está fuera del ámbito del curso y examen de AP Computer Science A.
    • 1.3.C.5 Los operadores pueden utilizarse para construir expresiones compuestas. En tiempo de compilación, los valores numéricos se asocian con los operadores según la precedencia de los operadores para determinar cómo se agrupan. Los paréntesis pueden utilizarse para modificar la precedencia de los operadores. La multiplicación, la división y el resto tienen precedencia sobre la suma y la resta. Los operadores con la misma precedencia se evalúan de izquierda a derecha.
    • 1.3.C.6 Intentar dividir un entero por el entero cero dará como resultado una ArithmeticException.
      • Enunciado de exclusión: El uso de la división por cero cuando uno de los valores numéricos es un double está fuera del ámbito del curso y examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Una expresión combina valores y operadores para calcular un resultado: + - * / y % (módulo o residuo, el resto). La división entera truncará: 7 / 2 es 3, mientras que 7 % 2 es 1. La precedencia de operadores sigue la matemática (*,/,% antes que +,-). Imprime con:

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

    Dividir un entero por el entero 0 (como 7 / 0) no está permitido y causa un error en tiempo de ejecución con una ArithmeticException. Dentro de una cadena de texto, una barra invertida marca una secuencia de escape: \" imprime una comilla doble, \\ una barra invertida simple, y \n inicia una nueva línea – así System.out.println("She said \"hi\""); imprime She said "hi".

    Explorar

    Explorar el orden de las operaciones paso a paso

    Java aplica *, /, % antes que + y -, trabajando de izquierda a derecha. Observe cada paso y vea por qué 2 + 3 * 4 es $14$, no $20$: la multiplicación ocurre primero.

    1.4

    Sentencias de Asignación e Entrada

    Syllabus

    Objetivo de aprendizaje 1.4.A: Desarrollar código para sentencias de asignación con expresiones y determinar el valor que se almacena en la variable como resultado de estas sentencias.

    • 1.4.A.1 Cada variable debe recibir un valor antes de poder usarse en una expresión. Dicho valor debe provenir de un tipo de dato compatible. Una variable se inicializa la primera vez que se le asigna un valor. Los tipos de referencia pueden asignar un nuevo objeto o null si no hay ningún objeto. El literal null es un valor especial utilizado para indicar que una referencia no está asociada con ningún objeto.
    • 1.4.A.2 El operador de asignación = permite a un programa inicializar o cambiar el valor almacenado en una variable. El valor de la expresión del lado derecho se almacena en la variable del lado izquierdo.
      • Afirmación de exclusión: El uso de operadores de asignación dentro de expresiones (por ejemplo, a = b = 4; o a[i += 5]) se encuentra fuera del alcance del curso y examen de AP Computer Science A.
    • 1.4.A.3 Durante la ejecución, una expresión se evalúa para producir un único valor. El valor de una expresión tiene un tipo basado en la evaluación de dicha expresión.

    Objetivo de aprendizaje 1.4.B: Desarrollar código para leer la entrada de datos.

    • 1.4.B.1 La entrada puede provenir de diversas formas, como táctil, auditiva, visual o textual. La clase Scanner es una forma de obtener entrada de texto desde el teclado.
      • Afirmación de exclusión: Cualquier forma específica de entrada por parte del usuario se encuentra fuera del alcance del curso y examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Una asignación x = expr; evalúa el lado derecho y lo almacena en la variable del lado izquierdo. Lee la entrada con un Scanner:

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

    Casting y Rango de Variables

    Syllabus

    Objetivo de Aprendizaje 1.5.A: Desarrollar código para convertir valores primitivos a diferentes tipos primitivos en expresiones aritméticas y determinar el valor que se produce como resultado.

    • 1.5.A.1 Los operadores de conversión (int) y (double) pueden utilizarse para convertir un valor double a un valor int (o viceversa).
    • 1.5.A.2 Convertir un valor double a un valor int provoca que los dígitos a la derecha del punto decimal sean truncados.
    • 1.5.A.3 Algunos códigos provocan que los valores int sean convertidos automáticamente (ampliados) a valores double.
    • 1.5.A.4 Los valores de tipo double pueden redondearse al entero más cercano mediante (int)(x + 0.5) para números no negativos o (int)(x - 0.5) para números negativos.

    Objetivo de Aprendizaje 1.5.B: Describir las condiciones bajo las cuales una expresión entera evalúa a un valor fuera de rango.

    • 1.5.B.1 La constante Integer.MAX_VALUE contiene el valor del mayor valor int posible. La constante Integer.MIN_VALUE contiene el valor del menor valor int posible.
    • 1.5.B.2 Los valores enteros en Java están representados por valores de tipo int, que se almacenan utilizando una cantidad finita (4 bytes) de memoria. Por lo tanto, un valor int debe estar en el rango desde Integer.MIN_VALUE hasta Integer.MAX_VALUE inclusive.
    • 1.5.B.3 Si una expresión evaluaría a un valor int fuera del rango permitido, ocurre un desbordamiento entero (integer overflow). El resultado es un valor int dentro del rango permitido, pero no necesariamente el valor esperado.

    Objetivo de Aprendizaje 1.5.C: Describir las condiciones que limitan la precisión de las expresiones.

    • 1.5.C.1 Las computadoras asignan una cantidad especificada de memoria para almacenar datos según el tipo de dato. Si una expresión evaluaría a un double con mayor precisión de la que puede almacenarse en la cantidad de memoria asignada, ocurre un error de redondeo. El resultado se redondeará al valor representable. Para evitar errores de redondeo que ocurren naturalmente, utilice valores int.
      • Afirmación de exclusión: Otros tipos de datos decimales especiales que pueden usarse para evitar errores de redondeo se encuentran fuera del alcance del curso y examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Rango de int, desbordamiento y truncamiento

    Cada tipo tiene un rango fijo; un int se desborda al superar aproximadamente 2.1 mil millones. El casting convierte entre tipos. El ensanchamiento (int a double) es automático; el estrechamiento necesita un casting explícito, el cual trunca (no redondea):

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

    Habilidad de examen: vigila cuando la división entera produzca un resultado truncado donde se esperaba un decimal – castea un operando a double primero.

    Ejemplo resuelto. Rastrea cada expresión:

    • 7 / 2 → 3 (ambos int, por lo tanto la división trunca);
    • 7.0 / 2 → 3.5 (un double fuerza la división real);
    • 7 % 2 → 1 (el residuo);
    • (double) 7 / 2 → 3.5 (el casteo se une más fuerte que /, por lo que es 7.0 / 2);
    • (double) (7 / 2) → 3.0 (los paréntesis calculan 7 / 2 = 3 en int primero, luego ensanchan).

    Las dos últimas parecen similares pero difieren – la posición del casteo decide si ocurre el truncamiento.

    Explorar

    Por qué int y double almacenan números de manera diferente

    Un int contiene solo números enteros en un rango fijo; un double almacena una mantisa y un exponente, intercambiando exactitud por un rango enorme. Convertir double→int descarta la fracción, y un valor fuera del rango de un int provoca desbordamiento.

    Vocabulario Entrenar
    Inglés Chino 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 Asignación Compuesta

    Syllabus

    Objetivo de Aprendizaje 1.6.A: Desarrollar código para sentencias de asignación con operadores de asignación compuesta y determinar el valor que se almacena en la variable como resultado.

    • 1.6.A.1 Los operadores de asignación compuesta +=, -=, *=, /= y %= pueden utilizarse en lugar del operador de asignación en expresiones numéricas. Un operador de asignación compuesta realiza la operación aritmética indicada entre el valor de la izquierda y el valor de la derecha, y luego asigna el resultado a la variable de la izquierda.
    • 1.6.A.2 El operador de post-incremento ++ y el operador de post-decremento -- se utilizan para sumar 1 o restar 1 al valor almacenado de una variable numérica. El nuevo valor se asigna a la variable.
      • Enunciado de exclusión: El uso de los operadores de incremento y decremento en forma prefija (p. ej., ++x) está fuera del alcance del curso y examen de AP Computer Science A. El uso de los operadores de incremento y decremento dentro de otras expresiones (p. ej., arr[x++]) está fuera del alcance del curso y examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Abreviaturas combinan una operación con la asignación: x += 5 significa x = x + 5; de igual manera -=, *=, /=, %=. Los operadores de incremento y decremento x++ y x-- suman o restan uno.

    1.7

    Interfaz de Programación de Aplicaciones (API) y Bibliotecas

    Syllabus

    Objetivo de Aprendizaje 1.7.A: Identificar los atributos y comportamientos de una clase contenida en las bibliotecas de una API.

    • 1.7.A.1 Las bibliotecas son conjuntos de clases. Una especificación de interfaz de programación de aplicaciones (API) informa al programador sobre cómo utilizar dichas clases. La documentación encontrada en las especificaciones de APIs y bibliotecas es esencial para comprender los atributos y comportamientos de una clase definida por la API. Una clase define un tipo de referencia específico. Las clases en las APIs y bibliotecas se agrupan en paquetes. Se pueden utilizar clases y bibliotecas de clases existentes para crear objetos.
    • 1.7.A.2 Los atributos se refieren a los datos relacionados con la clase y se almacenan en variables. Los comportamientos se refieren a lo que las instancias de la clase pueden hacer (o lo que se puede hacer con ellas) y están definidos por métodos.

    Fuente: College Board AP Course and Exam Description

    Una API (Interfaz de Programación de Aplicaciones) es la lista publicada de clases y métodos que puedes usar. Una biblioteca es una colección de clases predefinidas (como Math, String, Scanner). Lees la documentación de la API para aprender qué necesita un método (sus parámetros) y qué devuelve, sin ver su código interno – un ejemplo de abstracción.

    1.8

    Documentación con Comentarios

    Syllabus

    Objetivo de Aprendizaje 1.8.A: Describir la funcionalidad y el uso del código mediante comentarios.

    • 1.8.A.1 Los comentarios se escriben para que tanto el programador original como otros programadores comprendan el código y su funcionalidad, pero son ignorados por el compilador y no se ejecutan cuando se ejecuta el programa. Tres tipos de comentarios en Java incluyen /* */, que genera un bloque de comentarios; //, que genera un comentario en una sola línea; y /** */, que son comentarios Javadoc y se utilizan para crear documentación de API.
    • 1.8.A.2 Una precondición es una condición que debe ser verdadera justo antes de la ejecución de un método para que este se comporte según lo esperado. No se espera que el método verifique si las precondiciones se cumplen.
    • 1.8.A.3 Una postcondición es una condición que siempre debe ser verdadera después de la ejecución de un método. Las postcondiciones describen el resultado de la ejecución en términos de lo que se está devolviendo o el valor actual de los atributos de un objeto.

    Fuente: College Board AP Course and Exam Description

    Los comentarios son ignorados por el compilador pero explican el código a los humanos: // para una sola línea, /* ... */ para un bloque, y /** ... */ para un comentario Javadoc que documenta el propósito, parámetros y valor de retorno de un método. Aquí se escriben las precondiciones y postcondiciones precisas.

    1.9

    Firmas de Métodos

    Syllabus

    Objetivo de aprendizaje 1.9.A: Identificar el método correcto a llamar basándose en la documentación y las firmas de los métodos.

    • 1.9.A.1 Un método es un bloque de código con nombre que solo se ejecuta cuando se llama. Un bloque de código es cualquier sección de código encerrada entre llaves. La abstracción procedural permite a un programador utilizar un método conociendo lo que hace el método, incluso si no conoce cómo fue escrito.
    • 1.9.A.2 Un parámetro es una variable declarada en la cabecera de un método o constructor y puede utilizarse dentro del cuerpo del método. Esto permite pasar valores o argumentos y usarlos mediante un método o constructor. Una firma de método para un método con parámetros consta del nombre del método y la lista ordenada de tipos de parámetros. Una firma de método para un método sin parámetros consta del nombre del método y una lista de parámetros vacía.

    Objetivo de aprendizaje 1.9.B: Describir cómo llamar a métodos.

    • 1.9.B.1 Un método void no tiene valor de retorno y, por lo tanto, no se llama como parte de una expresión.
    • 1.9.B.2 Un método no void devuelve un valor que es del mismo tipo que el tipo de retorno indicado en la cabecera. Para utilizar el valor devuelto al llamar a un método no void, debe almacenarse en una variable o utilizarse como parte de una expresión.
    • 1.9.B.3 Un argumento es un valor que se pasa a un método cuando se llama al método. Los argumentos pasados a un método deben ser compatibles en número y orden con los tipos identificados en la lista de parámetros de la firma del método. Al llamar a métodos, los argumentos se pasan por valor. El paso por valor inicializa los parámetros con copias de los argumentos.
    • 1.9.B.4 Se dice que los métodos están sobrecargados cuando existen múltiples métodos con el mismo nombre pero diferentes firmas.
    • 1.9.B.5 Una llamada a método interrumpe la ejecución secuencial de las instrucciones, haciendo que el programa ejecute primero las instrucciones del método antes de continuar. Una vez que se ha ejecutado la última instrucción del método o se ha ejecutado una instrucción de retorno, el flujo de control regresa al punto inmediatamente posterior a donde se llamó al método.

    Fuente: College Board AP Course and Exam Description

    Una firma de método es el nombre de un método más sus tipos de parámetros, ej. nextInt() o substring(int, int). Para llamar a un método debes proporcionar argumentos que coincidan con los parámetros en cantidad, tipo y orden. El encabezado del método (la declaración completa) también indica el tipo de retorno – el tipo de valor que el método devuelve (void si ninguno) – pero el tipo de retorno no es parte de la firma, por eso dos métodos no pueden diferir solo por el tipo de retorno.

    1.10

    Llamadas a Métodos de Clase

    Syllabus

    Objetivo de Aprendizaje 1.10.A: Desarrollar código para llamar a métodos de clase y determinar el resultado de dichas llamadas.

    • 1.10.A.1 Los métodos de clase están asociados con la clase, no con las instancias de la clase. Los métodos de clase incluyen la palabra clave static en la cabecera antes del nombre del método.
    • 1.10.A.2 Los métodos de clase generalmente se llaman utilizando el nombre de la clase junto con el operador punto. Cuando la llamada al método ocurre dentro de la clase definidora, el uso del nombre de la clase es opcional en la llamada.

    Fuente: College Board AP Course and Exam Description

    Un método de clase (estático) pertenece a la clase misma, por lo que lo llamas sobre el nombre de la clase: ClassName.method(args). No se necesita un objeto.

    Explorar

    Seguir una llamada a método de clase en la pila

    Llamar a un método de clase como Math.max empuja un nuevo marco a la pila de llamadas; cuando el método devuelve un valor, su marco se elimina y el control vuelve al llamador. Pase paso a paso para ver cómo la pila crece y se encoge.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    class/klæs/ 类 lèi
    1.11

    Clase Math

    Syllabus

    Objetivo de aprendizaje 1.11.A: Desarrollar código para escribir expresiones que incluyan llamadas a bibliotecas matemáticas integradas y determinar el valor que se produce como resultado.

    • 1.11.A.1 La clase Math forma parte del paquete java.lang. Las clases en el paquete java.lang están disponibles por defecto.
    • 1.11.A.2 La clase Math contiene únicamente métodos de clase. Los siguientes métodos de la clase Math —incluyendo lo que hacen y cuándo se utilizan— forman parte de la Referencia rápida de Java:
      • static int abs(int x) devuelve el valor absoluto de un valor int.
      • static double abs(double x) devuelve el valor absoluto de un valor double.
      • static double pow(double base, double exponent) devuelve el valor del primer parámetro elevado a la potencia del segundo parámetro.
      • static double sqrt(double x) devuelve la raíz cuadrada no negativa de un valor double.
      • static double random() devuelve un valor double mayor o igual a 0.0 y menor que 1.0.
    • 1.11.A.3 Los valores devueltos por Math.random() pueden manipularse utilizando operadores aritméticos y de conversión (casting) para producir un int aleatorio o un double aleatorio dentro de un rango definido basado en criterios especificados. Cada extremo del rango puede ser inclusivo, lo que significa que el valor está incluido, o exclusivo, lo que significa que el valor no está incluido.

    Fuente: College Board AP Course and Exam Description

    La clase Math proporciona métodos matemáticos estáticos: Math.abs(x), Math.pow(base, exp), Math.sqrt(x), y Math.random() (un double en $[0,1)$). Para obtener un entero aleatorio de 0 a n-1: (int)(Math.random() * n).

    1.12

    Objetos: Instancias de Clases

    Syllabus

    Objetivo de Aprendizaje 1.12.A: Explicar la relación entre una clase y un objeto.

    • 1.12.A.1 Un objeto es una instancia específica de una clase con atributos definidos. Una clase es la implementación formal, o plano, de los atributos y comportamientos de un objeto.
    • 1.12.A.2 Se puede desarrollar una jerarquía de clases al colocar atributos y comportamientos comunes de clases relacionadas en una sola clase llamada superclase. Las clases que extienden una superclase, llamadas subclases, pueden hacer uso de los atributos y comportamientos existentes de la superclase sin reemplazarlos en el código. Esto crea una relación de herencia desde las subclases hacia la superclase.
      • Afirmación de exclusión: El diseño e implementación de relaciones de herencia se encuentran fuera del alcance del curso y examen de AP Computer Science A.
    • 1.12.A.3 Todas las clases en Java son subclases de la clase Object.

    Objetivo de Aprendizaje 1.12.B: Desarrollar código para declarar variables que almacenen tipos de referencia.

    • 1.12.B.1 Una variable de un tipo de referencia contiene una referencia a un objeto, la cual puede considerarse como la dirección de memoria de dicho objeto.

    Fuente: College Board AP Course and Exam Description

    = copia la referencia, no el objeto

    Una clase es un plano; un objeto es una instancia concreta construida a partir de él. Una clase agrupa datos (campos) con comportamiento (métodos) – el corazón de la programación orientada a objetos. String, Scanner y ArrayList son todas clases que instancias.

    Las clases pueden organizarse en una jerarquía. Un superclase contiene atributos y comportamientos compartidos por varias subclases que la extend – una relación de herencia. Cada clase en Java es finalmente una subclase de la clase interna Object, por eso cada objeto ya tiene un método toString; escribir un método de subclase con la misma firma que uno de superclase es sobrecarga de métodos (method overriding). (Diseñar tu propia herencia está fuera de este curso, pero se espera que reconozcas este vocabulario.)

    Un diagrama de clases: atributos privados y métodos públicos
    Un diagrama de clases: atributos privados y métodos públicos
    Una clase es un plano; cada objeto es una instancia construida a partir de él
    Una clase es un plano; cada objeto es una instancia construida a partir de él
    Vocabulario Entrenar
    Inglés Chino Pinyin
    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à
    reference/ˈrefrəns/ 引用 yǐn yòng
    1.13

    Creación y Almacenamiento de Objetos (Instanciación)

    Syllabus

    Objetivo de aprendizaje 1.13.A: Identificar, mediante su firma, el constructor correcto que se está invocando.

    • 1.13.A.1 Una clase contiene constructores que se invocan para crear objetos. Tienen el mismo nombre que la clase.
    • 1.13.A.2 La firma del constructor consiste en el nombre del constructor, que es igual al nombre de la clase, y en la lista ordenada de tipos de parámetros. La lista de parámetros, en el encabezado de un constructor, enumera los tipos de los valores que se pasan y sus nombres de variable.
    • 1.13.A.3 Se dice que los constructores están sobrecargados cuando existen múltiples constructores con diferentes firmas.

    Objetivo de aprendizaje 1.13.B: Desarrollar código para declarar variables de los tipos correctos para almacenar referencias a objetos.

    • 1.13.B.1 Una variable de tipo referencia almacena una referencia a un objeto o, si no hay objeto, null.

    Objetivo de aprendizaje 1.13.C: Desarrollar código para crear un objeto llamando a un constructor.

    • 1.13.C.1 Un objeto generalmente se crea utilizando la palabra clave new seguida de una llamada a uno de los constructores de la clase.
    • 1.13.C.2 Los parámetros permiten que los constructores acepten valores para establecer los valores iniciales de los atributos del objeto.
    • 1.13.C.3 Un argumento de constructor es un valor que se pasa a un constructor cuando este es invocado. Los argumentos pasados a un constructor deben ser compatibles en orden y cantidad con los tipos identificados en la lista de parámetros de la firma del constructor. Al llamar a constructores, los argumentos se pasan por valor. El paso por valor inicializa los parámetros con copias de los argumentos.
    • 1.13.C.4 Una llamada a un constructor interrumpe la ejecución secuencial de las instrucciones, haciendo que el programa ejecute primero las sentencias del constructor antes de continuar. Una vez ejecutada la última sentencia del constructor, el flujo de control retorna al punto inmediatamente posterior a donde se realizó la llamada al constructor.

    Fuente: College Board AP Course and Exam Description

    La instanciación crea un objeto con la palabra clave new, la cual llama a un constructor:

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

    La variable sostiene una referencia (la dirección del objeto), no el objeto mismo. Dos referencias pueden apuntar al mismo objeto; comparándolas con == se comparan direcciones, no contenidos.

    Una referencia también puede no apuntar a nada: el valor especial null significa "no asociado a ningún objeto". Llamar a un método en una referencia nula causa un error en tiempo de ejecución con un NullPointerException. Protégete contra ello probando con ==/!= y verificando null primero, para que && cortocircuite antes de que se ejecute el método: if (s != null && s.length() > 0).

    Una variable primitiva sostiene su valor directamente, una referencia sostiene una flecha hacia el objeto
    Una variable primitiva sostiene su valor directamente, una referencia sostiene una flecha hacia el objeto
    Vocabulario Entrenar
    Inglés Chino Pinyin
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    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
    Interface/ˈɪntəfeɪs/ 应用程序接口 yìng yòng chéng xù jiē kǒu
    1.14

    Llamadas a Métodos de Instancia

    Syllabus

    Objetivo de aprendizaje 1.14.A: Desarrollar código para llamar a métodos de instancia y determinar el resultado de estas llamadas.

    • 1.14.A.1 Los métodos de instancia se llaman sobre objetos de la clase. Se utiliza el operador punto junto con el nombre del objeto para invocar los métodos de instancia.
    • 1.14.A.2 Una llamada a un método en una referencia null dará como resultado un NullPointerException.

    Fuente: College Board AP Course and Exam Description

    Un método de instancia actúa sobre un objeto específico, por lo que lo llamas sobre la referencia al objeto: object.method(args). Ejemplo: in.nextInt(), word.length().

    1.15

    Manipulación de Cadenas

    Syllabus

    Objetivo de aprendizaje 1.15.A: Desarrollar código para crear objetos de cadena y determinar el resultado de crear y combinar cadenas.

    • 1.15.A.1 Un objeto String representa una secuencia de caracteres y se puede crear utilizando un literal de cadena o llamando al constructor de la clase String.
    • 1.15.A.2 La clase String forma parte del paquete java.lang. Las clases del paquete java.lang están disponibles por defecto.
    • 1.15.A.3 Un objeto String es inmutable, lo que significa que una vez creado un objeto String, sus atributos no pueden ser modificados. Los métodos llamados en un objeto String no cambian el contenido del objeto String.
    • 1.15.A.4 Dos objetos String pueden concatenarse o combinarse utilizando el operador + o +=, resultando en un nuevo objeto String. Un valor primitivo puede concatenarse con un objeto String. Esto provoca la conversión implícita del valor primitivo a un objeto String.
    • 1.15.A.5 Un objeto String puede concatenarse con cualquier objeto, lo que llama implícitamente al método toString del objeto (un comportamiento garantizado por la relación de herencia que toda clase tiene con la clase Object). El método toString de un objeto devuelve un valor de cadena que representa al objeto. Las subclases de Object suelen sobrescribir el método toString con una implementación específica de la clase. La sobrescritura de métodos ocurre cuando un método público en una subclase tiene la misma firma de método que un método público en la superclase, pero el comportamiento del método es específico de la subclase.
      • Declaración de exclusión: Sobrescribir el método toString de una clase está fuera del alcance del curso y el examen de AP Computer Science A.

    Objetivo de aprendizaje 1.15.B: Desarrollar código para llamar a métodos en objetos de cadena y determinar el resultado de llamar a estos métodos.

    • 1.15.B.1 Un objeto String tiene valores de índice desde 0 hasta uno menos que la longitud de la cadena. Intentar acceder a índices fuera de este rango resultará en un StringIndexOutOfBoundsException.
    • 1.15.B.2 Los siguientes métodos String —incluyendo qué hacen y cuándo se utilizan— forman parte del Referencia rápida de Java:
      • int length() devuelve el número de caracteres en un objeto String.
      • String substring(int from, int to) devuelve la subcadena que comienza en el índice from y termina en el índice to - 1.
      • String substring(int from) devuelve substring(from, length()).
      • int indexOf(String str) devuelve el índice de la primera aparición de str; devuelve -1 si no se encuentra.
      • boolean equals(Object other) devuelve true si this corresponde a la misma secuencia de caracteres que other; devuelve false de lo contrario.
      • int compareTo(String other) devuelve un valor < 0 si this es menor que other; devuelve cero si this es igual a other; devuelve un valor > 0 si this es mayor que other. Las cadenas se ordenan según el alfabeto.
      • Declaración de exclusión: Utilizar el método equals para comparar un objeto String con un objeto de un tipo distinto a String está fuera del alcance del curso y el examen de AP Computer Science A.
    • 1.15.B.3 Una cadena idéntica a la subcadena de un solo elemento en la posición index se puede crear llamando a substring(index, index + 1).

    Fuente: College Board AP Course and Exam Description

    Las cadenas de texto son inmutables

    Los objetos String son inmutables – los métodos devuelven una nueva cadena en lugar de cambiar la original. Métodos clave (todos los índices empiezan en 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
    

    Habilidad de examen: substring(a, b) incluye el índice a pero excluye b, y la comparación de Strings debe usar .equals, no == – dos de los errores más comunes en Strings.

    Ejemplo resuelto. Sea String s = "COMPUTER"; (índices 0–7). Entonces s.length() es 8; s.substring(0, 4) es "COMP" (índices 0,1,2,3 – índice 4 excluido); s.substring(4) es "UTER" (desde el índice 4 hasta el final); s.indexOf("PU") es 3; y s.indexOf("X") es -1 (no encontrado). Contar el extremo excluido de substring es el error más común.

    Pedir un índice fuera de 0 a length()-1 (un argumento malo para substring o charAt, ej. s.substring(0, 20) aquí) causa un error con StringIndexOutOfBoundsException – el primo de error de índice de array de la cadena de texto.

    Los índices de cadena de texto empiezan en 0
    Los índices de cadena de texto empiezan en 0
    Explorar

    Explorar índices y segmentación de cadenas

    Cada carácter tiene un índice, y la numeración comienza en 0. Arrastre el inicio y el final para ver cómo substring(from, to) toma los caracteres desde from hasta — pero sin incluir — to.

    1.15

    Consejos para el Examen

    • Rastrea el código a mano línea por línea, rastreando el valor de cada variable en una tabla – el examen recompensa el rastreo cuidadoso sobre adivinar.
    • Conoce los tipos primitivos de Java y que la división entera trunca ($7/2$ da $3$); usa un casteo o un double para división real.
    • Distingue errores de tiempo de compilación (sintaxis, tipos) de errores de tiempo de ejecución – conoce los nombrados: ArithmeticException (int ÷ 0), NullPointerException (método en una referencia nula), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – y errores de lógica (salida incorrecta).
    • Sigue la precedencia de operadores e inicializa cada variable antes de usarla.
    • En la respuesta libre, escribe Java completo y compilable – devuelve el tipo correcto y coincide exactamente con el encabezado del método.
  • 2

    Selección e iteración

    Ver lección
    2.1

    Selección e Iteración en Algoritmos

    Syllabus

    Objetivo de aprendizaje 2.1.A: Representar patrones y algoritmos que involucran selección y repetición presentes en la vida cotidiana utilizando lenguaje escrito o diagramas.

    • 2.1.A.1 Los bloques de construcción de los algoritmos incluyen secuencia, selección y repetición.
    • 2.1.A.2 Los algoritmos pueden contener selección, a través de la toma de decisiones, y repetición, mediante bucles.
    • 2.1.A.3 La selección ocurre cuando una elección sobre cómo procederá la ejecución de un algoritmo se basa en una decisión verdadera o falsa.
    • 2.1.A.4 La repetición es cuando un proceso se repite hasta alcanzar un resultado deseado.
    • 2.1.A.5 El orden en que se utilizan la secuencia, la selección y la repetición contribuye al resultado del algoritmo.

    Fuente: College Board AP Course and Exam Description

    Un diagrama de flujo con un rombo de decisión: la selección elige qué camino sigue el algoritmo
    Un diagrama de flujo con un rombo de decisión: la selección elige qué camino sigue el algoritmo

    Los algoritmos se construyen a partir de tres estructuras de control: secuencia (pasos en orden), selección (elegir una ruta) e iteración (repetir pasos). Este tema cubre la selección y la iteración, las herramientas que permiten a un programa tomar decisiones y repetir bloques de código.

    Las tres estructuras de control: secuencia, selección e iteración
    Las tres estructuras de control: secuencia, selección e iteración
    Vocabulario Entrenar
    Inglés Chino 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
    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.2

    Expresiones Booleanas

    Syllabus

    Objetivo de Aprendizaje 2.2.A: Desarrollar código para crear expresiones booleanas con operadores relacionales y determinar el resultado de estas expresiones.

    • 2.2.A.1 Los valores se pueden comparar utilizando los operadores relacionales == y != para determinar si los valores son iguales. Con tipos primitivos, esto compara los valores primitivos reales. Con tipos de referencia, esto compara las referencias del objeto.
    • 2.2.A.2 Los valores numéricos se pueden comparar utilizando los operadores relacionales <, >, <= y >= para determinar la relación entre los valores.
    • 2.2.A.3 Una expresión que involucra operadores relacionales se evalúa como un valor booleano.

    Fuente: College Board AP Course and Exam Description

    Compuertas lógicas y el sumador medio

    Una expresión booleana 布尔表达式 evalúa a true o false, utilizando operadores relacionales 关系运算符: == (igual), != (diferente), <, >, <=, >=. Tenga en cuenta que == compara valores primitivos pero referencias de objeto para objetos, por lo que debe usar .equals para Strings.

    Las tres familias de operadores: aritméticos, relacionales y lógicos
    Las tres familias de operadores: aritméticos, relacionales y lógicos
    Explorar

    Explorar la tabla de verdad AND

    Una expresión booleana se evalúa como true o false. AND es verdadero solo cuando ambos operandos son verdaderos; alterne las entradas para ver los cuatro casos.

    2.3

    La sentencia if

    Syllabus

    Objetivo de aprendizaje 2.3.A: Desarrollar código para representar procesos lógicos de ramificación mediante sentencias de selección y determinar el resultado de estos procesos.

    • 2.3.A.1 Las sentencias de selección modifican la ejecución secuencial de las instrucciones.
    • 2.3.A.2 Una instrucción if es un tipo de sentencia de selección que afecta el flujo de control ejecutando diferentes segmentos de código según el valor de una expresión booleana.
    • 2.3.A.3 Una selección de un solo camino (instrucción if) se utiliza cuando hay un segmento de código que debe ejecutarse bajo una condición determinada. En este caso, el cuerpo se ejecuta únicamente cuando la expresión booleana es true.
    • 2.3.A.4 Una selección de dos caminos (instrucción if-else) se utiliza cuando hay dos segmentos de código: uno para ser ejecutado cuando la expresión booleana es true y otro segmento para cuando la expresión booleana es false. En este caso, el cuerpo del if se ejecuta cuando la expresión booleana es true, y el cuerpo del else se ejecuta cuando la expresión booleana es false.

    Fuente: College Board AP Course and Exam Description

    Una sentencia if 条件语句 ejecuta un bloque solo cuando su condición es verdadera; un opcional else ofrece una alternativa:

    if (score >= 60) {
        System.out.println("Pass");
    } else {
        System.out.println("Fail");
    }
    
    Semáforos: la selección elige qué rama se ejecuta, al igual que las sentencias if eligen rutas de código
    Semáforos: la selección elige qué rama se ejecuta, al igual que las sentencias if eligen rutas de código
    Explorar

    Ver qué rama elige un if

    Una sentencia if ejecuta su cuerpo solo cuando la condición es verdadera, de lo contrario salta a else. Deslice la puntuación a través de los límites y observe cómo cambia la calificación.

    2.4

    Sentencias if anidadas

    Syllabus

    Objetivo de aprendizaje 2.4.A: Desarrollar código para representar procesos lógicos de ramificación anidada y determinar el resultado de estos procesos.

    • 2.4.A.1 Las instrucciones if anidadas consisten en instrucciones if, if-else o if-else-if dentro de instrucciones if, if-else o if-else-if.
    • 2.4.A.2 La expresión booleana de la instrucción if anidada interna se evalúa solo si la expresión booleana de la instrucción if externa se evalúa como true.
    • 2.4.A.3 Una selección múltiple (if-else-if) se utiliza cuando hay una serie de expresiones con diferentes segmentos de código para cada condición. La selección múltiple se realiza de tal manera que no se ejecuta más de un segmento de código según la primera expresión que se evalúa como true. Si ninguna expresión se evalúa como true y existe una instrucción trailing else, entonces se ejecuta el cuerpo de la instrucción else.

    Fuente: College Board AP Course and Exam Description

    Colocar un if dentro de otro, o encadenar con else if, permite probar varios casos en orden. Solo se ejecuta la rama coincidente primera:

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

    Expresiones Booleanas Compuestas

    Syllabus

    Objetivo de aprendizaje 2.5.A: Desarrollar código para representar expresiones booleanas compuestas y determinar el resultado de estas expresiones.

    • 2.5.A.1 Operadores lógicos ! (negación), && (conjunción) y || (disyunción) se utilizan con expresiones booleanas. La expresión !a se evalúa como true si a es false y se evalúa como false en caso contrario. La expresión a && b se evalúa como true si tanto a como b son true y se evalúa como false en caso contrario. La expresión a || b se evalúa como true si a es true, b es true o ambas lo son, y se evalúa como false en caso contrario. El orden de precedencia para evaluar los operadores lógicos es ! (negación), && (conjunción) y luego || (disyunción). Una expresión que involucra operadores lógicos se evalúa a un valor booleano.
    • 2.5.A.2 La evaluación por cortocircuito ocurre cuando el resultado de una operación lógica utilizando && o || puede determinarse evaluando únicamente la primera expresión booleana. En este caso, la segunda expresión booleana no se evalúa.

    Fuente: College Board AP Course and Exam Description

    Evaluación de cortocircuito

    Los operadores lógicos 逻辑运算符 combinan condiciones: && (y – ambas verdaderas), || (o – al menos una verdadera), ! (no – inverso). Java utiliza evaluación de cortocircuito 短路求值: && se detiene si el lado izquierdo es falso, y || se detiene si el lado izquierdo es verdadero – útil para proteger contra errores, p. ej., if (n != 0 && total / n > 5).

    2.6

    Comparando Expresiones Booleanas

    Syllabus

    Objetivo de Aprendizaje 2.6.A: Comparar expresiones booleanas equivalentes.

    • 2.6.A.1 Dos expresiones booleanas son equivalentes si evalúan al mismo valor en todos los casos. Las tablas de verdad se pueden utilizar para demostrar que las expresiones booleanas son equivalentes.
    • 2.6.A.2 La ley de De Morgan se puede aplicar a las expresiones booleanas para crear expresiones booleanas equivalentes. Según la ley de De Morgan, la expresión booleana !(a && b) es equivalente a !a || !b y la expresión booleana !(a || b) es equivalente a !a && !b.

    Objetivo de Aprendizaje 2.6.B: Desarrollar código para comparar referencias de objetos utilizando expresiones booleanas y determinar el resultado de dichas expresiones.

    • 2.6.B.1 Dos variables diferentes pueden contener referencias al mismo objeto. Las referencias de objeto se pueden comparar utilizando == y !=.
    • 2.6.B.2 Una referencia de objeto se puede comparar con null, utilizando == o !=, para determinar si la referencia realmente apunta a un objeto.
    • 2.6.B.3 Las clases suelen definir su propio método equals, el cual se puede utilizar para especificar los criterios de equivalencia para dos objetos de la clase. La equivalencia de dos objetos se determina más frecuentemente utilizando los atributos de ambos objetos.
      • Afirmación de exclusión: Sobrescribir el método equals está fuera del alcance del curso y del examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Las leyes de De Morgan 德摩根定律 reescriben negaciones: !(a && b) es igual a !a || !b, y !(a || b) es igual a !a && !b. Dos expresiones booleanas son equivalentes si dan el mismo resultado para cada entrada; una tabla de verdad lo demuestra. Simplificar condiciones de esta manera es una tarea común en los exámenes.

    2.7

    Bucle while

    Syllabus

    Objetivo de Aprendizaje 2.7.A: Identificar cuándo se requiere un proceso iterativo para obtener un resultado deseado.

    • 2.7.A.1 La iteración es una forma de repetición. Las sentencias de iteración modifican el flujo de control repitiendo un segmento de código cero o más veces mientras la expresión booleana que controla el bucle sea true.
    • 2.7.A.2 Un bucle infinito ocurre cuando la expresión booleana en una sentencia iterativa siempre evalúa a true.
    • 2.7.A.3 El cuerpo del bucle de una sentencia iterativa no se ejecutará si la expresión booleana evalúa inicialmente a false.
    • 2.7.A.4 Los errores off by one (error de uno) ocurren cuando la sentencia de iteración se ejecuta una vez demasiado o una vez insuficiente.

    Objetivo de Aprendizaje 2.7.B: Desarrollar código que represente procesos iterativos utilizando bucles while y determinar el resultado de estos procesos.

    • 2.7.B.1 Un bucle while es un tipo de sentencia iterativa. En los bucles while, la expresión booleana se evalúa antes de cada iteración del cuerpo del bucle, incluida la primera. Cuando la expresión evalúa a true, se ejecuta el cuerpo del bucle. Esto continúa hasta que la expresión booleana evalúa a false, momento en el cual termina la iteración.

    Fuente: College Board AP Course and Exam Description

    Un bucle while 循环 repite mientras su condición se mantiene verdadera, probándola antes de cada paso. Debe cambiar algo dentro para que el bucle se detenga eventualmente, o se convertirá en un bucle infinito 无限循环:

    Los tres tipos de bucles difieren en dónde se prueba la condición
    Los tres tipos de bucles difieren en dónde se prueba la condición
    int i = 0;
    while (i < 5) {
        System.out.println(i);
        i++;
    }
    
    Explorar

    Rastrear un bucle while

    Un bucle while se repite mientras su condición permanezca verdadera, actualizando sus variables en cada pasada. Pase paso a paso para ver cómo se acumula la suma de cuadrados.

    2.8

    Bucle for

    Syllabus

    Objetivo de aprendizaje 2.8.A: Desarrollar código que represente procesos iterativos utilizando bucles for y determinar el resultado de estos procesos.

    • 2.8.A.1 Un bucle for es un tipo de instrucción iterativa. El encabezado de un bucle for tiene tres partes: la inicialización, la expresión booleana y la actualización.
    • 2.8.A.2 En un bucle for, la instrucción de inicialización solo se ejecuta una vez antes de la primera evaluación de la expresión booleana. La variable que se está inicializando se denomina variable de control del bucle. La expresión booleana se evalúa inmediatamente después de inicializar la variable de control del bucle y luego tras cada ejecución de la instrucción de incremento hasta que sea false. En cada iteración, la actualización se ejecuta después de que se completa todo el cuerpo del bucle y antes de evaluar nuevamente la expresión booleana.
    • 2.8.A.3 Un bucle for puede reescribirse como un bucle while equivalente (y viceversa).

    Fuente: College Board AP Course and Exam Description

    Un bucle for agrupa inicialización, condición y actualización en una sola línea; es ideal cuando se conoce la cantidad:

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

    Un for y un while equivalente realizan el mismo trabajo; debe ser capaz de convertir entre ellos.

    Una línea de ensamblaje: los bucles repiten un proceso para cada elemento, como for y while
    Una línea de ensamblaje: los bucles repiten un proceso para cada elemento, como for y while
    Explorar

    Rastrear un bucle for

    Un bucle for se ejecuta un número fijo de veces, avanzando su contador a través de un rango. Observe cómo el contador y el total acumulado avanzan una pasada a la vez.

    2.9

    Construcción de Algoritmos Completos de Selección e Iteración

    Syllabus

    Objetivo de aprendizaje 2.9.A: Desarrollar código para algoritmos estándar y originales (sin estructuras de datos) y determinar el resultado de dichos algoritmos.

    • 2.9.A.1 Existen algoritmos estándar para:
      • identificar si un entero es o no divisible exactamente por otro entero
      • identificar los dígitos individuales de un entero
      • determinar la frecuencia con la que se cumple un criterio específico
      • determinar un valor mínimo o máximo
      • calcular una suma o un promedio

    Fuente: College Board AP Course and Exam Description

    Combine bucles y condiciones para resolver problemas reales: contar, sumar, encontrar un máximo o probar una propiedad:

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

    Dos patrones de enteros que el examen prueba directamente usan % y /. Para leer los dígitos de un entero uno a la vez, tome repetidamente n % 10 (el último dígito) y luego n = n / 10 (elimínelo). Para probar divisibilidad, n % d == 0 significa que n es divisible exactamente por d. Combínelos con un contador para encontrar la frecuencia con la cual se cumple algún criterio.

    Patrones estándar como un total acumulado, un contador o una bandera 标志 (un booleano que registra si ocurrió algo) aparecen a lo largo del curso.

    2.10

    Algoritmos de Cadenas

    Syllabus

    Objetivo de Aprendizaje 2.10.A: Desarrollar código para algoritmos estándar y originales que involucran cadenas y determinar el resultado de estos algoritmos.

    • 2.10.A.1 Existen algoritmos estándar de cadenas para:
      • encontrar si uno o más subcadenas tienen una propiedad particular
      • determinar la cantidad de subcadenas que cumplen criterios específicos
      • crear una nueva cadena con los caracteres invertidos

    Fuente: College Board AP Course and Exam Description

    Recorra una cadena por índice para procesar cada carácter:

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

    Tareas típicas: contar ocurrencias, construir una copia invertida o filtrada, o probar si una cadena contiene otra.

    2.11

    Iteración Anidada

    Syllabus

    Objetivo de Aprendizaje 2.11.A: Desarrollar código para representar procesos iterativos anidados y determinar el resultado de estos procesos.

    • 2.11.A.1 Las instrucciones de iteración anidadas son instrucciones de iteración que aparecen en el cuerpo de otra instrucción de iteración. Cuando un bucle está anidado dentro de otro bucle, el bucle interno debe completar todas sus iteraciones antes de que el bucle externo pueda continuar con su siguiente iteración.

    Fuente: College Board AP Course and Exam Description

    Un bucle anidado 嵌套循环 coloca un bucle dentro de otro; el bucle interno se completa completamente para cada paso del externo. Si el externo se ejecuta $n$ veces y el interno $m$ veces, el cuerpo se ejecuta $n\times m$ veces; esto es la base para procesar cuadrículas y comparar todos los pares.

    2.12

    Análisis Informal del Tiempo de Ejecución

    Syllabus

    Objetivo de aprendizaje 2.12.A: Calcular el conteo de ejecuciones de sentencias y la comparación informal del tiempo de ejecución de sentencias iterativas.

    • 2.12.A.1 Un conteo de ejecuciones de sentencias indica el número de veces que una sentencia es ejecutada por el programa. Los conteos de ejecuciones de sentencias a menudo se calculan de forma informal mediante trazado y análisis de las sentencias iterativas.

    Fuente: College Board AP Course and Exam Description

    Tasas de crecimiento Big-O

    El análisis del tiempo de ejecución 运行时间分析 cuenta cuántos pasos básicos toma un algoritmo a medida que crece el tamaño de la entrada $n$. Cuente las ejecuciones de la declaración más interna: un solo bucle sobre $n$ elementos es lineal ($n$ pasos); dos bucles anidados sobre $n$ son cuadráticos ($n^2$). Este conteo informal le permite comparar la eficiencia de dos algoritmos.

    Cómo crece el tiempo de ejecución con el número de elementos n
    Cómo crece el tiempo de ejecución con el número de elementos n

    Habilidad de examen: para un bucle anidado, sea capaz de indicar cuántas veces se ejecuta la declaración interna en función de los límites de los bucles; es una pregunta de opción múltiple frecuente.

    Ejemplo resuelto. ¿Cuántas estrellas imprime este código?

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

    El bucle interno se ejecuta i veces para cada i externo: 0 + 1 + 2 + 3 = 6 estrellas. Cuando el límite interno es la variable externa, el total es la suma triangular $0+1+\dots+(n-1)=\dfrac{n(n-1)}{2}$; aquí $\dfrac{4\times3}{2}=6$, no los $n^2=16$ completos de un bucle anidado rectangular.

    Explorar

    Comparar cómo escalan los algoritmos

    Tiempo de ejecución describe cómo crece el número de pasos con el tamaño de entrada $n$. Aumente $n$ y observe cómo una complejidad lineal $O(n)$ supera ampliamente a una cuadrática $O(n^2)$.

    2.12

    Consejos para el examen

    • Establezca correctamente las condiciones de contorno: use < vs <= deliberadamente, y vigile la primera y última iteración de cada bucle (el error clásico es off-by-one).
    • Construya condiciones compuestas con &&, ||, ! y recuerde la evaluación de cortocircuito (coloque la comprobación de nulo primero).
    • Realice trazados de bucles anidados contando cuántas veces se ejecuta el cuerpo interno en total.
    • Elija la estructura adecuada: if/else if para rangos, un bucle para repeticiones; evite un bucle infinito actualizando la variable del bucle.
    • Aplique las leyes de De Morgan cuando simplifique o niegue una condición booleana.
  • 3

    Creación de clases

    Ver lección
    3.1

    Abstracción y diseño de programas

    Syllabus

    Objetivo de aprendizaje 3.1.A: Representar el diseño de un programa utilizando lenguaje natural o creando diagramas que indiquen las clases del programa y las abstracciones de datos y procedimentales presentes en cada clase, incluyendo todos los atributos y comportamientos.

    • 3.1.A.1 La abstracción es el proceso de reducir la complejidad centrándose en la idea principal. Al ocultar detalles irrelevantes para la pregunta actual y agrupar detalles relacionados y útiles, la abstracción reduce la complejidad y permite centrarse en la idea.
    • 3.1.A.2 La abstracción de datos proporciona una separación entre las propiedades abstractas de un tipo de datos y los detalles concretos de su representación. La abstracción de datos gestiona la complejidad al asignar un nombre a los datos sin referenciar los detalles específicos de la representación. Los datos pueden adoptar la forma de una variable única o una colección de datos, como en una clase o un conjunto de datos.
    • 3.1.A.3 Un atributo es un tipo de abstracción de datos definido en una clase fuera de cualquier método o constructor. Una variable de instancia es un atributo cuyo valor es único para cada instancia de la clase. Una variable de clase es un atributo compartido por todas las instancias de la clase.
    • 3.1.A.4 La abstracción procedural proporciona un nombre para un proceso y permite utilizar un método conociendo únicamente lo que hace, no cómo lo hace. A través de la descomposición de métodos, un programador divide los comportamientos más grandes de la clase en comportamientos más pequeños creando métodos para representar cada comportamiento individual pequeño. Una abstracción procedural puede extraer características compartidas para generalizar la funcionalidad en lugar de duplicar código. Esto permite la reutilización de código, lo cual ayuda a gestionar la complejidad.
    • 3.1.A.5 El uso de parámetros permite generalizar los procedimientos, habilitando la reutilización de los procedimientos con una gama de valores de entrada o argumentos.
    • 3.1.A.6 El uso de la abstracción procedural en un programa permite a los programadores cambiar los internals de un método (para hacerlo más rápido, más eficiente, usar menos almacenamiento, etc.) sin necesidad de notificar a los usuarios del método sobre el cambio, siempre que se preserven la firma del método y lo que el método hace.
    • 3.1.A.7 Antes de implementar una clase, es útil dedicarse tiempo a diseñar cada clase, incluidos sus atributos y comportamientos. Este diseño puede representarse mediante lenguaje natural o diagramas.

    Fuente: College Board AP Course and Exam Description

    Un rompecabezas en progreso: las clases y métodos son piezas modulares de un diseño de programa más grande
    Un rompecabezas en progreso: las clases y métodos son piezas modulares de un diseño de programa más grande

    Abstracción 抽象 significa ocultar detalles detrás de una interfaz simple – usas un String sin saber cómo almacena caracteres. Un buen diseño divide un problema en clases, cada una responsable de una idea. Este tema trata sobre escribir tus propias clases.

    Descomponer un programa en módulos y sub-módulos
    Descomponer un programa en módulos y submódulos
    3.2

    El impacto del diseño de programas

    Syllabus

    Objetivo de Aprendizaje 3.2.A: Explicar las implicaciones sociales y éticas de los sistemas informáticos.

    • 3.2.A.1 La fiabilidad del sistema se refiere a la capacidad del programa para realizar sus tareas según lo esperado bajo condiciones especificadas sin fallas. Los programadores deben esforzarse por maximizar la fiabilidad del sistema probando el programa con una variedad de condiciones.
    • 3.2.A.2 La creación de programas tiene impactos en la sociedad, la economía y la cultura. Estos impactos pueden ser tanto beneficiosos como perjudiciales. Los programas diseñados para satisfacer una necesidad o resolver un problema pueden tener efectos nocivos no intencionados más allá de su uso previsto.
    • 3.2.A.3 Surgen problemas legales y preocupaciones sobre la propiedad intelectual al crear programas. Los programadores suelen reutilizar código escrito por otros y publicado como código abierto y gratuito. La incorporación de código que no está publicado como código abierto requiere que el programador obtenga permiso y, a menudo, adquiera el código antes de integrarlo en su programa.

    Fuente: College Board AP Course and Exam Description

    Las decisiones de diseño afectan si el código es correcto, legible y reutilizable. Encapsulamiento 封装 – mantener los datos privados y exponerlo solo a través de métodos – protege el estado de un objeto de mal uso y te permite cambiar el interior sin romper a los usuarios de la clase. Nombres reflexivos, métodos de un solo propósito y pruebas reducen errores.

    El diseño también conlleva responsabilidad más allá del código. Confiabilidad del sistema 系统可靠性 - un programa realizando sus tareas según lo esperado, sin fallos - es algo que los programadores deben maximizar mediante un diseño cuidadoso y pruebas. Los programas tienen impactos reales en la sociedad, la economía y la cultura que pueden ser beneficiosos y dañinos. Y crear programas plantea preocupaciones legales e de propiedad intelectual 知识产权: los programadores a menudo reutilizan código publicado como código abierto 开源 y libre de usar, pero deben respetar su licencia y dar crédito en lugar de copiar el trabajo de otros como propio.

    3.3

    Anatomía de una clase

    Syllabus

    Objetivo de aprendizaje 3.3.A: Desarrollar código para designar restricciones de acceso y visibilidad a clases, datos, constructores y métodos.

    • 3.3.A.1 La encapsulación de datos es una técnica mediante la cual los detalles de implementación de una clase se mantienen ocultos para las clases externas. Las palabras clave public y private afectan el acceso de las clases, los datos, los constructores y los métodos. La palabra clave private restringe el acceso a la clase declarante, mientras que la palabra clave public permite el acceso desde clases fuera de la clase declarante.
    • 3.3.A.2 En este curso, las clases siempre se designan como public y se declaran con la palabra clave class.
    • 3.3.A.3 En este curso, los constructores siempre se designan como public.
    • 3.3.A.4 Las variables de instancia pertenecen al objeto, y cada objeto tiene su propia copia de la variable.
    • 3.3.A.5 El acceso a los atributos debe mantenerse interno en la clase para lograr la encapsulación. Por lo tanto, es una buena práctica de programación designar las variables de instancia para estos atributos como private, a menos que la especificación de la clase indique lo contrario.
    • 3.3.A.6 El acceso a los comportamientos puede ser interno o externo a la clase. Los métodos designados como public pueden ser accedidos interna o externamente a una clase, mientras que los métodos designados como private solo pueden ser accedidos internamente a la clase.

    Fuente: College Board AP Course and Exam Description

    Una clase tiene tres partes: variables de instancia 实例变量 (campos – los datos del objeto), constructores (construyen objetos) y métodos (comportamiento). Los campos suelen ser private; los métodos suelen ser public:

    Un diagrama de clases: atributos privados y métodos públicos
    Un diagrama de clases: atributos privados y 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
    }
    
    Un plano: una clase es una plantilla que define cómo se construyen los objetos de ese tipo
    Un plano: una clase es una plantilla que define cómo se construyen los objetos de ese tipo
    Explorar

    Ver los campos de un objeto como cajas

    Una clase agrupa datos relacionados (sus campos) y métodos. Cada objeto obtiene su propio conjunto de cajas de campo; asignar a una cambia solo ese objeto.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    accessor (getter)/əkˈsesə/ 访问器 fǎng wèn qì
    3.4

    Constructores

    Syllabus

    Objetivo de aprendizaje 3.4.A: Desarrollar código para declarar variables de instancia para los atributos que se inicializarán en el cuerpo de los constructores de una clase.

    • 3.4.A.1 El estado de un objeto se refiere a sus atributos y sus valores en un momento dado, y está definido por las variables de instancia pertenecientes al objeto. Esto define una relación de tiene-un entre el objeto y sus variables de instancia.
    • 3.4.A.2 Un constructor se utiliza para establecer el estado inicial de un objeto, lo cual debe incluir valores iniciales para todas las variables de instancia. Cuando se llama a un constructor, se asigna memoria para el objeto y se devuelve la referencia asociada al objeto. Los parámetros del constructor, si están especificados, proporcionan datos para inicializar las variables de instancia.
    • 3.4.A.3 Cuando un objeto mutable es un parámetro de constructor, la variable de instancia debe inicializarse con una copia del objeto referenciado. De esta manera, la variable de instancia no mantiene una referencia al objeto original y se impide que los métodos modifiquen el estado del objeto original.
    • 3.4.A.4 Cuando no se escribe ningún constructor, Java proporciona un constructor sin parámetros, y las variables de instancia se establecen en valores predeterminados según el tipo de dato del atributo. Este constructor se denomina constructor por defecto.
    • 3.4.A.5 El valor predeterminado para un atributo de tipo int es 0. El valor predeterminado de un atributo de tipo double es 0.0. El valor predeterminado de un atributo de tipo boolean es false. El valor predeterminado de un tipo de referencia es null.

    Fuente: College Board AP Course and Exam Description

    Un constructor 构造函数 tiene el mismo nombre que la clase y ningún tipo de retorno. Se ejecuta cuando escribes new, y su trabajo es inicializar los campos. Una clase puede tener varios constructores con diferentes listas de parámetros (sobrecarga 重载); un constructor sin argumentos establece valores predeterminados.

    Vocabulario Entrenar
    Inglés Chino 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
    constructor/kənˈstrʌktə/ 构造函数 gòu zào hán shù
    overloading/ˌəʊvəˈləʊdɪŋ/ 重载 zhòng zài
    3.5

    Métodos: Cómo escribirlos

    Syllabus

    Objetivo de aprendizaje 3.5.A: Desarrollar código para definir comportamientos de un objeto mediante métodos escritos en una clase utilizando valores primitivos y determinar el resultado de llamar a estos métodos.

    • 3.5.A.1 Un método void no devuelve un valor. Su cabecera contiene la palabra clave void antes del nombre del método.
    • 3.5.A.2 Un método no void devuelve un único valor. Su cabecera incluye el tipo de retorno en lugar de la palabra clave void.
    • 3.5.A.3 En los métodos no void, se evalúa una expresión de retorno compatible con el tipo de retorno, y se devuelve su valor. Esto se denomina retorno por valor.
    • 3.5.A.4 La palabra clave return se utiliza para devolver el flujo de control al punto donde se llamó al método o constructor. Cualquier código que aparezca secuencialmente después de una instrucción de retorno nunca será ejecutado. Ejecutar una instrucción de retorno dentro de una selección o iteración detendrá dicha estructura y saldrá del método o constructor.
    • 3.5.A.5 Un método accesor permite a objetos de otras clases obtener una copia del valor de las variables de instancia o variables de clase. Un método accesor es un método no void.
    • 3.5.A.6 Un método mutador (modificador) es un método que cambia los valores de las variables de instancia o variables de clase. Un método mutador suele ser un método void.
    • 3.5.A.7 Los métodos con parámetros reciben valores a través de esos parámetros y utilizan dichos valores para llevar a cabo la tarea del método.
    • 3.5.A.8 Cuando un argumento es un valor primitivo, el parámetro se inicializa con una copia de ese valor. Los cambios realizados al parámetro no tienen efecto sobre el argumento correspondiente.

    Fuente: College Board AP Course and Exam Description

    Un método tiene una firma, un tipo de retorno y un cuerpo. Un accesor (getter) 访问器 devuelve información sin cambiar el objeto; un mutador (setter) 修改器 cambia un campo. Un método que devuelve un valor debe tener un return del tipo correcto en cada camino; un método void no devuelve nada.

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

    Seguir una llamada a método y su retorno

    Llamar a un método empuja un marco con sus parámetros; cuando alcanza return, el marco se elimina y el valor regresa al llamador.

    Vocabulario Entrenar
    Inglés Chino 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

    Pasar y devolver referencias de un objeto

    Syllabus

    Objetivo de aprendizaje 3.6.A: Desarrollar código para definir comportamientos de un objeto mediante métodos escritos en una clase utilizando referencias de objetos y determinar el resultado de llamar a estos métodos.

    • 3.6.A.1 Cuando un argumento es una referencia de objeto, el parámetro se inicializa con una copia de esa referencia; no se crea una nueva copia independiente del objeto. Si el parámetro hace referencia a un objeto mutable, el método o constructor puede usar esta referencia para alterar el estado del objeto. Es una buena práctica de programación no modificar objetos mutables que se pasan como parámetros a menos que así lo exija la especificación.
    • 3.6.A.2 Cuando la expresión de retorno evalúa a una referencia de objeto, se retorna la referencia, no una referencia a una nueva copia del objeto.
    • 3.6.A.3 Los métodos no pueden acceder a los datos privados ni a los métodos de un parámetro que contiene una referencia a un objeto, a menos que el parámetro sea del mismo tipo que la clase contenedora del método.

    Fuente: College Board AP Course and Exam Description

    = copia la referencia, no el objeto

    Cuando pasas un objeto a un método, Java copia la referencia, por lo que el método actúa sobre el mismo objeto – los cambios en sus campos son visibles para el llamador. (Los primitivos se copian por valor, por lo que los cambios en ellos no lo son.) Un método también puede devolver una referencia a un objeto. Porque un String es inmutable, pasar uno es seguro; pasar un objeto mutable permite que un método lo cambie.

    Java pasa por valor: el método obtiene una copia; el verdadero pase por referencia, que Java carece, le permitiría reasignar la variable del llamador
    Java siempre pasa por valor (izquierda): el método obtiene una copia de la referencia. El verdadero pase por referencia (derecha) — que Java no tiene — le permitiría a un método reasignar la propia variable del llamador.

    Habilidad de examen: sabe que mutar los campos de un objeto dentro de un método afecta al original, pero reasignar el parámetro (param = new...) no afecta al llamador.

    Ejemplo resuelto. Supongamos que s es un Student con puntuación 50, y llamamos a 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
    }
    

    La línea (1) cambia el objeto al que apunta s, por lo que el llamador ahora ve 100. La línea (2) hace que la propia copia del método de la referencia apunte a un nuevo objeto – el s del llamador permanece intacto – y la línea (3) afecta solo a ese nuevo objeto. Después de la llamada, s.getScore() es 100: la mutación persistió, la reasignación no.

    3.7

    Variables de clase y métodos de clase

    Syllabus

    Objetivo de Aprendizaje 3.7.A: Desarrollar código para definir comportamientos de una clase mediante métodos de clase.

    • 3.7.A.1 Los métodos de clase no pueden acceder ni modificar los valores de variables de instancia ni llamar a métodos de instancia sin recibir como parámetro una instancia de la clase.
    • 3.7.A.2 Los métodos de clase pueden acceder o modificar los valores de las variables de clase y pueden llamar a otros métodos de clase.

    Objetivo de Aprendizaje 3.7.B: Desarrollar código para declarar las variables de clase que pertenecen a la clase.

    • 3.7.B.1 Las variables de clase pertenecen a la clase, por lo que todos los objetos de una clase comparten una única copia de la variable de clase. Las variables de clase se designan con la palabra clave static antes del tipo de variable.
    • 3.7.B.2 Las variables de clase designadas como public se acceden fuera de la clase utilizando el nombre de la clase y el operador punto, ya que están asociadas con una clase y no con objetos de la clase.
    • 3.7.B.3 Cuando se declara una variable como final, su valor no puede ser modificado.

    Fuente: College Board AP Course and Exam Description

    estáticos vs campos de instancia

    Una variable estática (de clase) 类变量, marcada static, es compartida por todos los objetos de la clase – una sola copia total (por ejemplo, un contador de cuántos objetos existen). Un método estático pertenece a la clase y no puede usar campos de instancia directamente. Accede a ellos por nombre de clase: Student.getCount().

    3.8

    Alcance y acceso

    Syllabus

    Objetivo de aprendizaje 3.8.A: Explicar dónde pueden utilizarse las variables en el código.

    • 3.8.A.1 Las variables locales son variables declaradas en los encabezados o cuerpos de bloques de código. Las variables locales solo pueden ser accedidas dentro del bloque en el que se declaran. Dado que los constructores y métodos son bloques de código, los parámetros de los constructores o métodos también se consideran variables locales. Estas variables solo pueden utilizarse dentro del constructor o método y no pueden declararse como public o private.
    • 3.8.A.2 Cuando existe una variable local o un parámetro con el mismo nombre que una variable de instancia, el nombre de la variable se referirá a la variable local en lugar de a la variable de instancia dentro del cuerpo del constructor o método.

    Fuente: College Board AP Course and Exam Description

    Alcance 作用域 es donde un nombre es visible. Una variable local declarada en un método existe solo dentro de él; un parámetro existe solo en su método; una variable de instancia es visible en todo el objeto. Los modificadores de acceso controlan la visibilidad entre clases: private (solo esta clase) versus public (en cualquier lugar). Las variables locales ocultan campos del mismo nombre – una fuente de errores.

    Una variable global es visible en todas partes; una variable local solo dentro de su bloque
    Una variable global es visible en todas partes; una variable local solo dentro de su bloque
    Vocabulario Entrenar
    Inglés Chino Pinyin
    Scope/skəʊp/ 作用域 zuò yòng yù
    3.9

    La palabra clave this

    Syllabus

    Objetivo de aprendizaje 3.9.A: Desarrollar código para expresiones que se refieran a sí mismas y determinar el resultado de estas expresiones.

    • 3.9.A.1 Dentro de un método de instancia o un constructor, la palabra clave this actúa como una variable especial que contiene una referencia al objeto actual: el objeto cuyo método o constructor se está invocando.
    • 3.9.A.2 La palabra clave this puede utilizarse para pasar el objeto actual como argumento en una llamada a método.
    • 3.9.A.3 Los métodos de clase no tienen una referencia this.

    Fuente: College Board AP Course and Exam Description

    this es una referencia al objeto actual. Úsalo para distinguir un campo de un parámetro con el mismo nombre, o para llamar a otro método del mismo objeto:

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

    Habilidad de examen: cuando el parámetro de un constructor o setter tiene el mismo nombre que un campo, debes escribir this.field = param – sin this, la asignación no hace nada útil.

    3.9

    Consejos para el examen

    • Diseña con métodos y clases: encapsula datos como campos private y expone comportamiento a través de métodos públicos.
    • Conoce la diferencia entre un objeto y su clase, y que los objetos se pasan por valor — el parámetro obtiene una copia de la referencia, por lo que un método puede cambiar el estado del objeto, pero reasignar el parámetro no afecta al llamador (Java no tiene pase por referencia).
    • Recorre arrays y ArrayLists de forma segura — el tamaño es length vs .size(), y eliminar durante un bucle desplaza índices.
    • Rastrea un método recursivo para determinar su resultado: encuentra primero el caso base, luego sigue cada llamada recursiva hasta su valor de retorno (escribir código recursivo está fuera del alcance del examen).
    • Reconoce el vocabulario de herencia — superclase, subclase, sobrescritura de métodos, y que cada clase es una subclase de Object (diseñar e implementar herencia está fuera del alcance del examen).
  • 4

    Colecciones de datos

    Ver lección
    4.1

    La Ética de la Recopilación de Datos

    Syllabus

    Objetivo de Aprendizaje 4.1.A: Explicar los riesgos para la privacidad derivados de la recopilación y almacenamiento de datos personales en sistemas informáticos.

    • 4.1.A.1 Al utilizar una computadora, la privacidad personal corre riesgo. Al desarrollar nuevos programas, los programadores deben intentar salvaguardar la privacidad personal del usuario.

    Objetivo de Aprendizaje 4.1.B: Explicar la importancia de reconocer la calidad de los datos y los posibles problemas al utilizar un conjunto de datos.

    • 4.1.B.1 El sesgo algorítmico describe errores sistemáticos y repetidos en un programa que generan resultados injustos para un grupo específico de usuarios.
    • 4.1.B.2 Los programadores deben ser conscientes del método de recopilación del conjunto de datos y del potencial de sesgo presente en dicho método antes de utilizar los datos para extraer nueva información o formular conclusiones.
    • 4.1.B.3 Algunos conjuntos de datos son incompletos o contienen datos inexactos. El uso de dichos datos en el desarrollo o la ejecución de un programa puede causar que este funcione incorrectamente o de manera ineficiente.

    Objetivo de Aprendizaje 4.1.C: Identificar un conjunto de datos adecuado para utilizar con el fin de resolver un problema o responder una pregunta específica.

    • 4.1.C.1 El contenido de un conjunto de datos podría estar relacionado con una pregunta o tema específico y no ser apropiado para proporcionar respuestas correctas ni extraer información para una pregunta o tema diferente.

    Fuente: College Board AP Course and Exam Description

    Gabinetes de servidores en un centro de datos — las grandes colecciones de datos plantean preguntas éticas sobre su recopilación y uso
    Gabinetes de servidores en un centro de datos — las grandes colecciones de datos plantean preguntas éticas sobre su recopilación y uso

    Los programas que recopilan datos generan interrogantes sobre la privacidad 隐私 y el consentimiento 同意. Recopile solo lo necesario, proteja la información y sea honesto respecto a su uso. Los datos pueden contener sesgos 偏见 si no representan a todos con equidad, lo que conduce a resultados injustos; una responsabilidad inherente al almacenar información.

    Vocabulario Entrenar
    Inglés Chino 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 qué Necesitamos Estructuras de Datos?

    Syllabus

    Objetivo de aprendizaje 4.2.A: Representar patrones y algoritmos que involucran conjuntos de datos encontrados en la vida cotidiana mediante lenguaje escrito o diagramas.

    • 4.2.A.1 Un conjunto de datos es una colección de piezas específicas de información o datos.
    • 4.2.A.2 Los conjuntos de datos pueden manipularse y analizarse para resolver un problema o responder una pregunta. Al analizar conjuntos de datos, los valores dentro del conjunto se acceden y utilizan uno a la vez, y luego se procesan según el resultado deseado.
    • 4.2.A.3 Los datos pueden representarse en un diagrama utilizando un gráfico o una tabla. Esta visualización puede utilizarse para planificar el algoritmo que se empleará para manipular los datos.

    Fuente: College Board AP Course and Exam Description

    Un archivador: las colecciones almacenan muchos valores bajo un mismo nombre para que los algoritmos puedan procesarlos
    Un archivador: las colecciones almacenan muchos valores bajo un mismo nombre para que los algoritmos puedan procesarlos

    Una variable individual contiene un solo valor; los problemas reales requieren almacenar muchos valores relacionados: una lista de alumnos, píxeles, lecturas de sensores. Una estructura de datos 数据结构 organiza una colección para que podamos almacenar, encontrar y procesar elementos de manera eficiente. El curso AP utiliza tres: el array, el ArrayList y el array 2D.

    4.3

    Creación y Lectura de un Array

    Syllabus

    Objetivo de aprendizaje 4.3.A: Desarrollar código para representar colecciones de datos relacionados utilizando objetos array unidimensionales (1D).

    • 4.3.A.1 Un array almacena múltiples valores del mismo tipo. Los valores pueden ser valores primitivos o referencias a objetos.
    • 4.3.A.2 La longitud de un array se establece en el momento de su creación y no puede modificarse. La longitud de un array puede consultarse mediante el atributo length.
    • 4.3.A.3 Cuando se crea un array utilizando la palabra clave new, todos sus elementos se inicializan con los valores predeterminados correspondientes al tipo de dato del elemento. El valor predeterminado para int es 0, para double es 0.0, para boolean es false, y para un tipo de referencia es null.
    • 4.3.A.4 Se pueden utilizar listas inicializadoras para crear e inicializar arrays.
    • 4.3.A.5 Los corchetes [ ] se utilizan para acceder y modificar un elemento en un array 1D mediante un índice.
    • 4.3.A.6 Los valores de índice válidos para un array van desde 0 hasta una unidad menos que la longitud del array, inclusive. Utilizar un valor de índice fuera de este rango provocará una ArrayIndexOutOfBoundsException.

    Fuente: College Board AP Course and Exam Description

    Un array 数组 es una colección ordenada de tamaño fijo con valores del mismo tipo. Los índices van desde 0 hasta length - 1:

    Un array unidimensional (una lista) con sus índices y límites
    Un array unidimensional (una lista) con sus índices y límites
    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)
    

    Acceder a un índice fuera del rango 0..length-1 lanza una ArrayIndexOutOfBoundsException.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    array/əˈreɪ/ 数组 shù zǔ
    Traverse/trəˈvɜːs/ 遍历 biàn lì
    4.4

    Recorrer Cada Elemento de un Array

    Syllabus

    Objetivo de aprendizaje 4.4.A: Desarrollar código utilizado para recorrer los elementos en un arreglo unidimensional y determinar el resultado de estos recorridos.

    • 4.4.A.1 Recorrer un arreglo ocurre cuando se utilizan sentencias de repetición para acceder a todos o a una secuencia ordenada de elementos en un arreglo.
    • 4.4.A.2 Recorrer un arreglo con un bucle for indexado o un bucle while requiere que los elementos sean accedidos mediante sus índices.
    • 4.4.A.3 El encabezado de un bucle for mejorado incluye una variable, denominada variable del bucle for mejorado. Para cada iteración del bucle for mejorado, la variable del bucle for mejorado recibe una copia de un elemento sin utilizar su índice.
    • 4.4.A.4 Asignar un nuevo valor a la variable del bucle for mejorado no cambia el valor almacenado en el arreglo.
    • 4.4.A.5 Cuando un arreglo almacena referencias a objetos, los atributos pueden modificarse llamando a métodos sobre la variable del bucle for mejorado. Esto no cambia las referencias a objetos almacenadas en el arreglo.
    • 4.4.A.6 El código escrito utilizando un bucle for mejorado para recorrer elementos en un arreglo puede reescribirse utilizando un bucle for indexado o un bucle while.

    Fuente: College Board AP Course and Exam Description

    Recorra 遍历 un array con un bucle for (proporciona el índice) o un bucle enhanced for / for-each (proporciona cada valor, lectura-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
    
    4.5

    Algoritmos Estándar de Arrays

    Syllabus

    Objetivo de Aprendizaje 4.5.A: Desarrollar código para algoritmos estándar y originales para un contexto o especificación particular que involucre arreglos, y determinar el resultado de dichos algoritmos.

    • 4.5.A.1 Existen algoritmos estándar que utilizan recorridos por arreglos para:
      • determinar un valor mínimo o máximo
      • calcular una suma o promedio
      • determinar si al menos un elemento tiene una propiedad particular
      • determinar si todos los elementos tienen una propiedad particular
      • determinar la cantidad de elementos que tienen una propiedad particular
      • acceder a todos los pares consecutivos de elementos
      • determinar la presencia o ausencia de elementos duplicados
      • desplazar o rotar elementos hacia la izquierda o derecha
      • invertir el orden de los elementos

    Fuente: College Board AP Course and Exam Description

    Domine estos patrones: calcular una suma o promedio, encontrar el máximo/mínimo, contar elementos que cumplen una condición, buscar un duplicado, y invertir o desplazar elementos. Cada uno es un recorrido con un resultado acumulado:

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

    Lectura de Datos desde un Archivo de Texto

    Syllabus

    Objetivo de aprendizaje 4.6.A: Desarrollar código para leer datos de un archivo de texto.

    • 4.6.A.1 Un archivo es almacenamiento para datos que persisten cuando el programa no está en ejecución. Los datos en un archivo pueden recuperarse durante la ejecución del programa.
    • 4.6.A.2 Un archivo puede conectarse al programa usando las clases File y Scanner.
    • 4.6.A.3 Un archivo se puede abrir creando un objeto File, utilizando el nombre del archivo como argumento del constructor.
      • File(String str) es el constructor File que acepta un nombre de archivo String para abrirlo con fines de lectura, donde str es la ruta de acceso para el archivo.
    • 4.6.A.4 Al usar la clase File, es necesario indicar qué hacer si el archivo con el nombre proporcionado no puede ser abierto. Una forma de lograr esto es agregar throws IOException al encabezado del método que usa el archivo. Si el nombre de archivo es inválido, el programa terminará.
    • 4.6.A.5 Las clases File e IOException son parte del paquete java.io. Debe usarse una instrucción import para hacer disponibles estas clases para su uso en el programa.
    • 4.6.A.6 Los siguientes métodos y constructores de Scanner —incluyendo lo que hacen y cuándo se usan— forman parte de la Referencia rápida de Java:
      • Scanner(File f) es el constructor Scanner que acepta un File para lectura.
      • int nextInt() devuelve el siguiente int leído desde el archivo o fuente de entrada si está disponible. Si el siguiente int no existe o está fuera de rango, resultará en una InputMismatchException.
      • double nextDouble() devuelve el siguiente double leído desde el archivo o fuente de entrada. Si el siguiente double no existe, resultará en una InputMismatchException.
      • boolean nextBoolean() devuelve el siguiente boolean leído desde el archivo o fuente de entrada. Si el siguiente boolean no existe, resultará en una InputMismatchException.
      • String nextLine() devuelve la siguiente línea de texto como un String leído desde el archivo o fuente de entrada; puede devolver la cadena vacía si se llama inmediatamente después de otro método Scanner que esté leyendo desde el archivo o fuente de entrada.
      • String next() devuelve el siguiente String leído desde el archivo o fuente de entrada.
      • boolean hasNext() devuelve true si hay un próximo elemento para leer en el archivo o fuente de entrada; de lo contrario, devuelve false.
      • void close() cierra este escáner.
      • Afirmación de exclusión: Aceptar entrada desde el teclado está fuera del alcance del curso y examen de AP Computer Science A.
    • 4.6.A.7 Usar nextLine junto con otros métodos Scanner en la misma fuente de entrada a veces requiere código para ajustar por las diferentes formas en que los métodos manejan los espacios en blanco.
      • Afirmación de exclusión: Escribir o analizar código que use tanto nextLine como otros métodos Scanner en la misma fuente de entrada está fuera del alcance del curso y examen de AP Computer Science A.
    • 4.6.A.8 El siguiente método adicional de String —incluyendo lo que hace y cuándo se usa— forma parte de la Referencia rápida de Java:
      • String[] split(String del) devuelve un array de String donde cada elemento es un subcadena de this String, que ha sido dividida alrededor de coincidencias de la expresión dada del.
      • Afirmación de exclusión: El parámetro del usa un formato llamado expresión regular. Escribir o analizar código que use cualquiera de las propiedades especiales de las expresiones regulares (ej., \\*, \\.) está fuera del alcance del curso y examen de AP Computer Science A.
    • 4.6.A.9 Se puede usar un bucle while para detectar si el archivo aún contiene elementos para leer usando el método hasNext como condición del bucle.
    • 4.6.A.10 Un archivo debe cerrarse cuando el programa haya terminado de usarlo. El método close de Scanner se llama para cerrar el archivo.

    Fuente: College Board AP Course and Exam Description

    File e IOException se encuentran en java.io, por lo que un programa que lee un archivo necesita import java.io.*;. Abrir un archivo puede fallar (podría no existir), y Java le obliga a manejarlo; la forma más sencilla es añadir throws IOException al encabezado del método. Un Scanner luego lee el archivo línea por línea, usando hasNext... para verificar antes de leer:

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

    Leer tokens tipificados con nextInt(), nextDouble() o nextBoolean() lanza una InputMismatchException si el siguiente token es del tipo incorrecto; por ejemplo, llamar a nextInt() cuando el siguiente elemento en el archivo es la palabra cat.

    4.7

    Envolver un Número en un Objeto

    Syllabus

    Objetivo de aprendizaje 4.7.A: Desarrollar código para usar objetos Integer y Double a partir de sus contrapartes primitivas y determinar el resultado de utilizar estos objetos.

    • 4.7.A.1 La clase Integer y la clase Double forman parte del paquete java.lang. Un objeto Integer es inmutable, lo que significa que una vez creado un objeto Integer, sus atributos no pueden ser modificados. Un objeto Double es inmutable, lo que significa que una vez creado un objeto Double, sus atributos no pueden ser modificados.
    • 4.7.A.2 El autoboxing es la conversión automática que realiza el compilador de Java entre los tipos primitivos y sus respectivas clases wrapper (envoltura). Esto incluye la conversión de un int a un Integer y de un double a un Double. El compilador de Java aplica autoboxing cuando un valor primitivo:
      • se pasa como parámetro a un método que espera un objeto de la clase wrapper correspondiente
      • se asigna a una variable de la clase wrapper correspondiente
    • 4.7.A.3 El unboxing es la conversión automática que realiza el compilador de Java desde la clase wrapper al tipo primitivo. Esto incluye la conversión de un Integer a un int y de un Double a un double. El compilador de Java aplica unboxing cuando un objeto de la clase wrapper:
      • se pasa como parámetro a un método que espera un valor del tipo primitivo correspondiente
      • se asigna a una variable del tipo primitivo correspondiente
    • 4.7.A.4 El siguiente método de la clase Integer —incluyendo su función y cuándo se utiliza— forma parte de la Referencia rápida de Java:
      • static int parseInt(String s) devuelve el argumento String como un int.
    • 4.7.A.5 El siguiente método de la clase Double —incluyendo su función y cuándo se utiliza— forma parte de la Referencia rápida de Java:
      • static double parseDouble(String s) devuelve el argumento String como un double.

    Fuente: College Board AP Course and Exam Description

    Un ArrayList almacena objetos, no primitivas, por lo que una primitiva se envuelve en un objeto: Integer envuelve int, Double envuelve double. Java hace esto mediante autoboxing 自动装箱 (int a Integer) y unboxing (de vuelta) automáticamente, así puede escribir list.add(5) y int x = list.get(0).

    Vocabulario Entrenar
    Inglés Chino Pinyin
    autoboxing/ˌɔːtəʊˈbɒksɪŋ/ 自动装箱 zì dòng zhuāng xiāng
    4.8

    Herramienta de ArrayList

    Syllabus

    Objetivo de aprendizaje 4.8.A: Desarrollar código para colecciones de objetos relacionados utilizando objetos ArrayList y determinar el resultado de llamar a métodos en estos objetos.

    • 4.8.A.1 Un objeto ArrayList es mutable en tamaño y contiene referencias a objetos.
    • 4.8.A.2 El constructor ArrayList() de ArrayList construye una lista vacía.
    • 4.8.A.3 Java permite el tipo genérico ArrayList<E>, donde el parámetro de tipo E especifica el tipo de los elementos. Cuando se especifica ArrayList<E>, los tipos de los parámetros de referencia y del tipo de retorno al utilizar los métodos de ArrayList son del tipo E. Se prefiere ArrayList<E> sobre ArrayList. Por ejemplo, ArrayList<String> names = new ArrayList<String>(); permite que el compilador encuentre errores que de otro modo se encontrarían en tiempo de ejecución.
    • 4.8.A.4 La clase ArrayList forma parte del paquete java.util. Debe utilizarse una sentencia import para hacer disponible esta clase para su uso en el programa.
    • 4.8.A.5 Los siguientes métodos de ArrayList —incluyendo lo que hacen y cuándo se utilizan— forman parte de la Referencia rápida de Java:
      • int size() devuelve el número de elementos en la lista.
      • boolean add(E obj) añade obj al final de la lista; devuelve true.
      • void add(int index, E obj) inserta obj en la posición index (0 <= index <= size), moviendo los elementos en la posición index y superiores hacia la derecha (añade 1 a sus índices) y aumenta el tamaño en 1.
      • E get(int index) devuelve el elemento en la posición index de la lista.
      • E set(int index, E obj) reemplaza el elemento en la posición index con obj; devuelve el elemento que anteriormente estaba en la posición index.
      • E remove(int index) elimina el elemento de la posición index, moviendo los elementos en la posición index + 1 y superiores hacia la izquierda (resta 1 a sus índices) y disminuye el tamaño en 1; devuelve el elemento que anteriormente estaba en la posición index.
    • 4.8.A.6 Los índices de un ArrayList comienzan en 0 y terminan en el número de elementos - 1.

    Fuente: College Board AP Course and Exam Description

    Qué es realmente un ArrayList

    Un ArrayList 动态数组 crece y decrece según añade o elimina elementos. Declárelo con el tipo de elemento en <>:

    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)
    
    Vocabulario Entrenar
    Inglés Chino 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.9

    Recorrer Cada Elemento de un ArrayList

    Syllabus

    Objetivo de Aprendizaje 4.9.A: Desarrollar código utilizado para recorrer los elementos de un ArrayList y determinar los resultados de estos recorridos.

    • 4.9.A.1 Recorrer un ArrayList ocurre cuando se utilizan sentencias de iteración o recursivas para acceder a todos o a una secuencia ordenada de los elementos en un ArrayList.
    • 4.9.A.2 Eliminar elementos durante el recorrido de un ArrayList requiere el uso de técnicas especiales para evitar saltarse elementos.
    • 4.9.A.3 Intentar acceder a un valor de índice fuera de su rango resultará en una IndexOutOfBoundsException.
    • 4.9.A.4 Cambiar el tamaño de un ArrayList mientras se recorre utilizando un bucle for mejorado puede resultar en una ConcurrentModificationException. Por lo tanto, al usar un bucle for mejorado para recorrer un ArrayList, no debe agregar ni eliminar elementos.

    Fuente: College Board AP Course and Exam Description

    Recorra con un bucle de índice o un bucle for-each, igual que los arrays (usando size() y get(i)):

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

    Habilidad de examen: al eliminar elementos en un bucle de índice, ya sea recorra hacia atrás o no incremente i después de una eliminación; de lo contrario, el desplazamiento de elementos hacia la izquierda hará que salte uno. Y nunca agregue ni elimine elementos mientras recorre un ArrayList con un bucle for-each: cambiar su tamaño a mitad del bucle lanza una ConcurrentModificationException, por lo que use un bucle de índice (hacia atrás, como se indicó arriba) siempre que deba eliminar.

    4.10

    Algoritmos Estándar de ArrayList

    Syllabus

    Objetivo de Aprendizaje 4.10.A: Desarrollar código para algoritmos estándar y originales en un contexto o especificación particular que involucre objetos ArrayList y determinar el resultado de dichos algoritmos.

    • 4.10.A.1 Existen algoritmos estándar de ArrayList que utilizan recorridos para:
      • determinar un valor mínimo o máximo
      • calcular una suma o promedio
      • determinar si al menos un elemento posee una propiedad particular
      • determinar si todos los elementos poseen una propiedad particular
      • determinar la cantidad de elementos que tienen una propiedad particular
      • acceder a todos los pares consecutivos de elementos
      • determinar la presencia o ausencia de elementos duplicados
      • desplazar o rotar elementos hacia la izquierda o derecha
      • invertir el orden de los elementos
      • insertar elementos
      • eliminar elementos
    • 4.10.A.2 Algunos algoritmos requieren que múltiples objetos String, arrays u ArrayList sean recorridos simultáneamente.

    Fuente: College Board AP Course and Exam Description

    Los mismos algoritmos que en los arrays: máximo/mínimo, conteo, suma; además de inserción y eliminación que los arrays no pueden hacer fácilmente. Una tarea común es eliminar todos los elementos que coinciden con una condición, manejando cuidadosamente el desplazamiento de índices.

    4.11

    Cuadrículas: Arrays Bidimensionales

    Syllabus

    Objetivo de aprendizaje 4.11.A: Desarrollar código utilizado para representar colecciones de datos relacionados mediante objetos de matriz bidimensional (2D).

    • 4.11.A.1 Una matriz 2D se almacena como una matriz de matrices. Por lo tanto, la forma en que se crean e indexan las matrices 2D es similar a los objetos de matriz unidimensional (1D). El tamaño de una matriz 2D se establece en el momento de la creación y no puede cambiarse. Las matrices 2D pueden almacenar ya sea datos primitivos o datos de referencia de objetos.
      • Declaración de exclusión: Los objetos de matriz 2D no rectangulares están fuera del alcance del curso y del examen de AP Computer Science A.
    • 4.11.A.2 Cuando se crea una matriz 2D utilizando la palabra clave new, todos sus elementos se inicializan con los valores predeterminados correspondientes al tipo de dato del elemento. El valor predeterminado para int es 0, para double es 0.0, para boolean es false, y para un tipo de referencia es null.
    • 4.11.A.3 La lista de inicializadores utilizada para crear e inicializar una matriz 2D consta de listas de inicializadores que representan matrices 1D; por ejemplo, int[][] arr2D = { {1, 2, 3}, {4, 5, 6} };.
    • 4.11.A.4 Los corchetes [row][col] se utilizan para acceder y modificar un elemento en una matriz 2D. Con fines de examen, al acceder al elemento en arr[first][second], el primer índice se utiliza para las filas y el segundo índice se utiliza para las columnas.
    • 4.11.A.5 Una única matriz que constituye una fila de una matriz 2D puede accederse utilizando el nombre de la matriz 2D y un solo conjunto de corchetes que contiene el índice de la fila.
    • 4.11.A.6 El número de filas contenidas en una matriz 2D puede accederse a través del atributo length. Los valores de índice de fila válidos para una matriz 2D van desde 0 hasta uno menos que el número de filas o la longitud de la matriz, inclusive. El número de columnas contenidas en una matriz 2D puede accederse a través del atributo length de una de las filas. Los valores de índice de columna válidos para una matriz 2D van desde 0 hasta uno menos que el número de columnas o la longitud de cualquier fila dada de la matriz, inclusive. Por ejemplo, dada una matriz 2D llamada values, el número de filas es values.length y el número de columnas es values[0].length. Utilizar un valor de índice fuera de estos rangos resultará en un ArrayIndexOutOfBoundsException.

    Fuente: College Board AP Course and Exam Description

    Un array 2D 二维数组 es una cuadrícula (filas y columnas) – un array de arrays:

    Un array bidimensional (una tabla) con índices de fila y columna
    Un array bidimensional (una tabla) con índices de fila y columna
    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 una matriz 2D por fila y columna

    Una matriz 2D es una cuadrícula direccionada por [row][col]. Mueva los índices y observe qué celda seleccionan: primero la fila, luego la columna, ambas contando desde 0.

    4.12

    Recorrer una Cuadrícula

    Syllabus

    Objetivo de Aprendizaje 4.12.A: Desarrollar código utilizado para recorrer los elementos en un arreglo 2D y determinar el resultado de estos recorridos.

    • 4.12.A.1 Se utilizan sentencias de iteración anidadas para recorrer y acceder a todos o una secuencia ordenada de elementos en un arreglo 2D. Dado que los arreglos 2D se almacenan como arreglos de arreglos, la forma en que se recorren los arreglos 2D utilizando bucles for y bucles for mejorados es similar a la de los objetos de arreglos 1D. Las sentencias de iteración anidadas pueden escribirse para recorrer el arreglo 2D en orden por filas, orden por columnas o un orden definido únicamente. El orden por filas se refiere a un ordenamiento de los elementos del arreglo 2D donde el recorrido ocurre a través de cada fila, mientras que el recorrido en orden por columnas ocurre hacia abajo por cada columna.
    • 4.12.A.2 El bucle exterior de un bucle for mejorado anidado utilizado para recorrer un arreglo 2D recorre las filas. Por lo tanto, la variable del bucle for mejorado debe ser el tipo de cada fila, que es un arreglo 1D. El bucle interior recorre una sola fila. Por lo tanto, la variable del bucle for mejorado interior debe ser del mismo tipo que los elementos almacenados en el arreglo 1D. Asignar un nuevo valor a la variable del bucle for mejorado no cambia el valor almacenado en el arreglo.

    Fuente: College Board AP Course and Exam Description

    Recorriendo un array 2-D

    Visite cada celda con bucles anidados – el exterior sobre filas, el interior sobre columnas (orden fila-mayor 行主序):

    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 Estándar de Arrays 2D

    Syllabus

    Objetivo de Aprendizaje 4.13.A: Desarrollar código para algoritmos estándar y originales en un contexto o especificación particular que involucre arreglos 2D y determinar el resultado de estos algoritmos.

    • 4.13.A.1 Existen algoritmos estándar que utilizan el recorrido de arreglos 2D para:
      • determinar un valor mínimo o máximo de todos los elementos o para una fila, columna u otra subsección designada
      • calcular la suma o promedio de todos los elementos o para una fila, columna u otra subsección designada
      • determinar si al menos un elemento posee una propiedad particular en todo el arreglo 2D o en una fila, columna u otra subsección designada
      • determinar si todos los elementos del arreglo 2D o de una fila, columna u otra subsección designada poseen una propiedad particular
      • determinar el número de elementos del arreglo 2D o en una fila, columna u otra subsección designada que tienen una propiedad particular
      • acceder a todos los pares consecutivos de elementos
      • determinar la presencia o ausencia de elementos duplicados en el arreglo 2D o en una fila, columna u otra subsección designada
      • desplazar o rotar elementos hacia la izquierda o derecha en una fila, o hacia arriba o abajo en una columna
      • invertir el orden de los elementos en una fila o columna

    Fuente: College Board AP Course and Exam Description

    Tareas típicas de cuadrículas: sumar una fila o columna, encontrar el máximo en la cuadrícula, contar celdas coincidentes, o sumar una diagonal (donde r == c). Cada una es una traversia anidada con un resultado acumulado.

    4.14

    Encontrar un Valor: Búsqueda Lineal y Binaria

    Syllabus

    Objetivo de aprendizaje 4.14.A: Desarrollar código utilizado para algoritmos de búsqueda lineal con el fin de buscar información específica en una colección y determinar los resultados de la ejecución de una búsqueda.

    • 4.14.A.1 Los algoritmos de búsqueda lineal son algoritmos estándar que revisan cada elemento en orden hasta que se encuentra el valor deseado o se han revisado todos los elementos del array o ArrayList. Los algoritmos de búsqueda lineal pueden iniciar el proceso de búsqueda desde cualquiera de los extremos del array o ArrayList.
    • 4.14.A.2 Al aplicar algoritmos de búsqueda lineal a arrays bidimensionales (2D), se debe acceder a cada fila y luego aplicar la búsqueda lineal a cada fila del array 2D.

    Fuente: College Board AP Course and Exam Description

    Búsqueda binaria: dividir y vencer
    • Búsqueda lineal 线性搜索 revisa cada elemento sucesivamente; funciona en cualquier lista, tomando hasta $n$ pasos.
    • Búsqueda binaria 二分搜索 funciona solo en una lista ordenada: revise el medio, luego descarte la mitad que no puede contener el objetivo, repitiendo. Toma aproximadamente $\log_2 n$ pasos; mucho más rápido en datos grandes.
    La búsqueda binaria reduce a la mitad el rango en cada paso
    La búsqueda binaria reduce a la mitad el rango en cada paso
    La búsqueda lineal revisa cada elemento sucesivamente hasta encontrar el objetivo
    La búsqueda lineal revisa cada elemento sucesivamente hasta encontrar el objetivo
    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;
    }
    

    Habilidad de examen: la búsqueda binaria requiere datos ordenados; sepa cuántas comparaciones realiza y cómo se actualizan lo, hi, mid.

    Ejemplo resuelto. Busque target = 40 en el 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, entonces lo = 4;
    • mid = (4+6)/2 = 5, a[5]=42 > 40, entonces hi = 4;
    • mid = (4+4)/2 = 4, a[4]=31 < 40, entonces lo = 5;
    • ahora lo (5) > hi (4), así que el bucle termina – 40 no está presente.

    Cada paso redujo a la mitad el rango, por lo que incluso este error tomó solo tres comparaciones.

    Explorar

    Comparar búsqueda lineal y binaria

    La búsqueda lineal verifica cada elemento por turno; la búsqueda binaria divide una lista ordenada a la mitad en cada paso. Observe cómo la búsqueda binaria alcanza el objetivo en muchas menos comparaciones.

    Vocabulario Entrenar
    Inglés Chino 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

    Ordenar Datos: Ordenamiento por Selección e Inserción

    Syllabus

    Objetivo de aprendizaje 4.15.A: Determinar el resultado de ejecutar cada paso de los algoritmos de ordenación para clasificar los elementos de una colección.

    • 4.15.A.1 El ordenamiento por selección y el ordenamiento por inserción son algoritmos de ordenación iterativos que pueden utilizarse para clasificar elementos en un array o ArrayList.
    • 4.15.A.2 El ordenamiento por selección selecciona repetidamente el elemento más pequeño (o más grande) de la parte no ordenada de la lista y lo intercambia en su posición correcta (y definitiva) dentro de la parte ordenada de la lista.
    • 4.15.A.3 El ordenamiento por inserción inserta un elemento de la parte no ordenada de una lista en su posición correcta (pero no necesariamente definitiva) dentro de la parte ordenada de la lista, desplazando los elementos de dicha parte para hacer espacio al nuevo elemento.

    Fuente: College Board AP Course and Exam Description

    Ordenamiento por inserción
    Ordenamiento burbuja, paso a paso
    • Ordenamiento por selección 选择排序 encuentra repetidamente el elemento restante más pequeño y lo intercambia en su lugar.
    • Ordenamiento por inserción 插入排序 crece un frente ordenado, insertando cada nuevo elemento donde corresponde.
    Un ordenamiento por inserción, desplazando cada clave a su lugar paso a paso
    Un ordenamiento por inserción, desplazando cada clave a su lugar paso a paso

    Ambos son simples y tardan aproximadamente $n^2$ pasos en promedio; adecuados para arrays pequeños. Debe poder rastrear el array después de cada pasada.

    Explorar

    Observar cómo un algoritmo de ordenamiento clasifica una lista

    Un ordenamiento reorganiza los elementos en orden. Pase paso a paso por la selección/inserción para ver cómo crece la región ordenada un elemento a la vez.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    Insertion sort/ɪnˈsɜːʃn sɔːt/ 插入排序 chā rù pái xù
    4.16

    Métodos que se Llaman a Sí Mismos: Recursión

    Syllabus

    Objetivo de aprendizaje 4.16.A: Determinar el resultado de llamar a métodos recursivos.

    • 4.16.A.1 Un método recursivo es un método que se llama a sí mismo. Los métodos recursivos contienen al menos un caso base, que detiene la recursión, y al menos una llamada recursiva. La recursión es otra forma de repetición.
    • 4.16.A.2 Cada llamada recursiva tiene su propio conjunto de variables locales, incluyendo los parámetros. Los valores de los parámetros capturan el progreso de un proceso recursivo, al igual que los valores de las variables de control de bucle capturan el progreso de un bucle.
    • 4.16.A.3 Cualquier solución recursiva puede replicarse mediante el uso de un enfoque iterativo y viceversa.
      • Afirmación de exclusión: Escribir código recursivo está fuera del alcance del curso y examen de AP Computer Science A.

    Fuente: College Board AP Course and Exam Description

    Recursión y la pila de llamadas

    Recursión 递归 es un método que se llama a sí mismo con una entrada más pequeña. Requiere un caso base 基本情况 que detenga las llamadas, y un caso recursivo que avance hacia la base:

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

    Sin un caso base alcanzable, la recursión nunca se detiene (desbordamiento de pila).

    La recursión y la iteración son intercambiables. Cualquier solución recursiva puede reescribirse con un bucle (enfoque iterativo), y cualquier bucle puede reescribirse con recursión; resuelven los mismos problemas. El factorial anterior tiene el mismo efecto que una versión 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;
    }
    

    Por tanto, la elección radica en la claridad, no en la capacidad: la recursión se lee naturalmente para problemas con estructura autosimilar (árboles, ordenamiento fusionado), mientras que la iteración evita el costo de memoria de apilar un marco de llamada por paso. El examen podría pedirle convertir uno en el otro.

    Explorar

    Desplegar una llamada recursiva

    Un método recursivo se llama a sí mismo con una entrada más pequeña hasta alcanzar un caso base, luego los resultados se pliegan hacia arriba. Pase paso a paso para ver cómo las llamadas se apilan y se deshacen.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    Recursion/rɪˈkɜːʃn/ 递归 dì guī
    base case/beɪs keɪs/ 基本情况 jī běn qíng kuàng
    4.17

    Búsqueda Recursiva y Ordenamiento Fusionado

    Syllabus

    Objetivo de aprendizaje 4.17.A: Determinar el resultado de la ejecución de algoritmos recursivos que utilizan cadenas o colecciones.

    • 4.17.A.1 La recursión puede utilizarse para recorrer objetos String, arrays y objetos ArrayList.

    Objetivo de aprendizaje 4.17.B: Determinar el resultado de cada iteración de un algoritmo de búsqueda binaria utilizado para buscar información en una colección.

    • 4.17.B.1 Los datos deben estar ordenados para utilizar el algoritmo de búsqueda binaria. La búsqueda binaria comienza en el medio de un array u ArrayList ordenado y elimina la mitad del array u ArrayList en cada llamada recursiva hasta que se encuentra el valor deseado o se han eliminado todos los elementos.
    • 4.17.B.2 La búsqueda binaria es generalmente más eficiente que la búsqueda lineal.
      • Declaración de exclusión: Los algoritmos de búsqueda distintos a la búsqueda lineal y binaria están fuera del alcance del curso y examen de Ciencias de la Computación AP.
    • 4.17.B.3 El algoritmo de búsqueda binaria puede escribirse de manera iterativa o recursiva.

    Objetivo de aprendizaje 4.17.C: Determinar el resultado de cada iteración del algoritmo de ordenamiento por fusión (merge sort) cuando se utiliza para ordenar una colección.

    • 4.17.C.1 El ordenamiento por fusión es un algoritmo de ordenamiento recursivo que puede utilizarse para ordenar elementos en un array u ArrayList.
      • Declaración de exclusión: Los algoritmos de ordenamiento distintos a la selección, inserción y fusión (merge sort) están fuera del alcance del curso y examen de Ciencias de la Computación AP.
    • 4.17.C.2 El ordenamiento por fusión divide repetidamente un array en subarrays más pequeños hasta que cada subarray tiene un solo elemento, y luego fusiona recursivamente los subarrays ordenados de vuelta juntos en orden ascendente para formar el array final ordenado.

    Fuente: College Board AP Course and Exam Description

    Ordenamiento fusionado: dividir, luego fusionar

    La recursión potencia algoritmos eficientes. La búsqueda binaria puede escribirse recursivamente (buscar en la mitad correcta). El ordenamiento fusionado 归并_recort divide el array a la mitad, ordena cada mitad recursivamente, y luego fusiona las dos mitades ordenadas; toma aproximadamente $n\log_2 n$ pasos, mucho más rápido que el ordenamiento por selección o inserción en datos grandes.

    El ordenamiento fusionado divide el array en elementos individuales, luego fusiona las mitades ordenadas hacia arriba
    El ordenamiento fusionado divide el array en elementos individuales, luego fusiona las mitades ordenadas hacia arriba

    Ejemplo resuelto. Rastree factorial(4). Cada llamada delega a una más pequeña: factorial(4) = 4 * factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1). factorial(1) alcanza el caso base y retorna 1, así que las llamadas se descomponen hacia adentro: 2 * 1 = 2, luego 3 * 2 = 6, luego 4 * 6 = 24. Escribir cada llamada sobre su valor de retorno es la forma confiable de rastrear la recursión.

    Habilidad de examen: rastree un método recursivo escribiendo cada llamada y su valor de retorno, y sepa que la eficiencia del ordenamiento fusionado ($n\log n$) supera a los ordenamientos simples de $n^2$.

    Vocabulario Entrenar
    Inglés Chino Pinyin
    Merge sort/mɜːdʒ sɔːt/ 归并排序 guī bìng pái xù
    4.17

    Consejos para el Examen

    • Pense en ambos beneficios y perjuicios de recopilar datos; esta unidad se evalúa mediante justificaciones escritas breves, no código.
    • Proteja la información de identificación personal (PII) y explique riesgos de privacidad y seguridad en contexto.
    • Nomenre perjuicios reales: brechas de datos, vigilancia y sesgo algorítmico derivado de datos no representativos.
    • Respete la propiedad intelectual y las licencias al reutilizar código o datos.
    • Proporcione una respuesta específica y fundamentada; una vaga afirmación de "podría ser malo" no obtiene puntos.

Iniciar sesión o crear cuenta

IGCSE, A-Level & AP