Skip to content · ⁨Bỏ qua nội dung⁩
Subjects · ⁨Môn học⁩

AP Computer Science A · ⁨AP Khoa học máy tính A⁩

Tips · ⁨Mẹo⁩

AP Computer Science A is a Java course: objects and classes, primitive types and control flow, writing classes, arrays and ArrayLists, 2D arrays, inheritance and polymorphism, and recursion. It is a first programming course taught with real object-oriented code, not pseudocode.

All four free-response questions are hand-written Java. No compiler will catch a missing semicolon or a wrong return type for you, so write code on paper during revision — it is a different skill from typing it.

Arrays and ArrayLists are the most-tested topic. Being fluent with traversal, insertion and removal, and knowing which index shifts when you remove an element, pays back more than any other single hour of practice.

Notes cover the CED units in Java, with runnable examples you can edit in the browser. Past FRQs and scoring guidelines are in the library — all four are code-writing questions, so the worked answers are complete methods rather than fragments.

  • 1

    Using Objects and Methods · ⁨Sử dụng Đối tượng và Phương pháp⁩

    Watch lesson · ⁨Xem bài học⁩
    1.1

    Introduction to Algorithms, Programming, and Compilers · ⁨Giới thiệu về Thuật toán, Lập trình và Trình biên dịch⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.1.A: Represent patterns and algorithms found in everyday life using written language or diagrams.

    • 1.1.A.1 Algorithms define step-by-step processes to follow when completing a task or solving a problem. These algorithms can be represented using written language or diagrams.
    • 1.1.A.2 Sequencing defines an order for when steps in a process are completed. Steps in a process are completed one at a time.

    Learning Objective 1.1.B: Explain the code compilation and execution process.

    • 1.1.B.1 Code can be written in any text editor; however, an integrated development environment (IDE) is often used to write programs because it provides tools for a programmer to write, compile, and run code.
    • 1.1.B.2 A compiler checks code for some errors. Errors detectable by the compiler need to be fixed before the program can be run.

    Learning Objective 1.1.C: Identify types of programming errors.

    • 1.1.C.1 A syntax error is a mistake in the program where the rules of the programming language are not followed. These errors are detected by the compiler.
    • 1.1.C.2 A logic error is a mistake in the algorithm or program that causes it to behave incorrectly or unexpectedly. These errors are detected by testing the program with specific data to see if it produces the expected outcome.
    • 1.1.C.3 A run-time error is a mistake in the program that occurs during the execution of a program. Run-time errors typically cause the program to terminate abnormally.
    • 1.1.C.4 An exception is a type of run-time error that occurs as a result of an unexpected error that was not detected by the compiler. It interrupts the normal flow of the program's execution.
    Tiếng Việt

    Mục tiêu học tập 1.1.A: Biểu diễn các mẫu và thuật toán tìm thấy trong đời sống hàng ngày bằng ngôn ngữ viết hoặc sơ đồ.

    • 1.1.A.1 Thuật toán định nghĩa các bước thực hiện tuần tự cần tuân theo khi hoàn thành một nhiệm vụ hoặc giải quyết một vấn đề. Các thuật toán này có thể được biểu diễn bằng ngôn ngữ viết hoặc sơ đồ.
    • 1.1.A.2 Sắp xếp thứ tự định nghĩa trật tự mà các bước trong một quy trình được hoàn thành. Các bước trong một quy trình được hoàn thành từng bước một.

    Mục tiêu học tập 1.1.B: Giải thích quy trình biên dịch và thực thi mã.

    • 1.1.B.1 Mã có thể được viết trong bất kỳ trình soạn thảo văn bản nào; tuy nhiên, một môi trường phát triển tích hợp (IDE) thường được sử dụng để viết chương trình vì nó cung cấp các công cụ giúp lập trình viên viết, biên dịch và chạy mã.
    • 1.1.B.2 Một trình biên dịch kiểm tra mã để tìm các lỗi. Các lỗi do trình biên dịch phát hiện cần được sửa chữa trước khi chương trình có thể được chạy.

    Mục tiêu học tập 1.1.C: Xác định các loại lỗi lập trình.

    • 1.1.C.1 Lỗi cú pháp là một sai sót trong chương trình nơi các quy tắc của ngôn ngữ lập trình không được tuân thủ. Những lỗi này được phát hiện bởi trình biên dịch.
    • 1.1.C.2 Lỗi logic là một sai sót trong thuật toán hoặc chương trình khiến nó hoạt động không đúng hoặc không mong đợi. Những lỗi này được phát hiện bằng cách thử nghiệm chương trình với dữ liệu cụ thể để xem liệu nó có tạo ra kết quả mong đợi hay không.
    • 1.1.C.3 Lỗi thời gian chạy là một sai sót trong chương trình xảy ra trong quá trình thực thi chương trình. Lỗi thời gian chạy thường khiến chương trình kết thúc bất thường.
    • 1.1.C.4 Ngoại lệ là một loại lỗi thời gian chạy xảy ra do một lỗi không mong đợi chưa được trình biên dịch phát hiện. Nó làm gián đoạn luồng thực thi bình thường của chương trình.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An algorithm 算法 is a finite, step-by-step procedure that solves a problem. A program 程序 expresses an algorithm in a language a computer can run. Java is compiled 编译: the compiler 编译器 translates your source code into bytecode, which the Java Virtual Machine (JVM) runs. A syntax error 语法错误 (breaking the grammar) is caught by the compiler; a logic error 逻辑错误 (wrong result) is not – the program runs but misbehaves.

    Tiếng Việt
    Mã nguồn trên máy trạm — chương trình được viết, biên dịch và thực thi dưới dạng các lệnh chính xác
    Mã nguồn trên máy trạm — chương trình được viết, biên dịch và chạy dưới dạng các lệnh chính xác

    Một thuật toán là một quy trình từng bước hữu hạn để giải quyết vấn đề. Một chương trình biểu diễn thuật toán bằng ngôn ngữ mà máy tính có thể thực thi. Java là biên dịch: trình biên dịch chuyển mã nguồn của bạn thành bytecode, mà Java Virtual Machine (JVM) sẽ chạy. Một lỗi cú pháp (vi phạm ngữ pháp) sẽ bị trình biên dịch bắt; một lỗi logic (kết quả sai) thì không – chương trình vẫn chạy nhưng xử lý sai lệch.

    Trình biên dịch dịch toàn bộ chương trình cùng lúc; trình thông dịch thực thi từng dòng một
    Trình biên dịch dịch toàn bộ chương trình cùng lúc; trình giải thích chạy nó từng dòng một
    Nhiều chip vi xử lý máy tính nhìn từ bên dưới
    Chương trình Java của bạn được biên dịch thành các lệnh mà CPU như một trong những chiếc này thực sự chạy
    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    algorithm/ˈælɡərɪθəm/ thuật toán
    program/ˈprəʊɡræm/ chương trình
    compiled/kəmˈpaɪld/ tổng hợp lại
    compiler/kəmˈpaɪlə/ compiler
    syntax error/ˈsɪntæks ˈerə/ lỗi cú pháp
    logic error/ˈlɒdʒɪk ˈerə/ lỗi logic
    variable/ˈveərɪəbl/ biến
    1.2

    Variables and Data Types · ⁨Biến và Kiểu Dữ Liệu⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.2.A: Identify the most appropriate data type category for a particular specification.

    • 1.2.A.1 A data type is a set of values and a corresponding set of operations on those values. Data types can be categorized as either primitive or reference.
    • 1.2.A.2 The primitive data types used in this course define the set of values and corresponding operations on those values for numbers and Boolean values.
    • 1.2.A.3 A reference type is used to define objects that are not primitive types.

    Learning Objective 1.2.B: Develop code to declare variables to store numbers and Boolean values.

    • 1.2.B.1 The three primitive data types used in this course are int, double, and boolean. An int value is an integer. A double value is a real number. A boolean value is either true or false.
      • Exclusion statement: The other five primitive data types (long, short, byte, float, and char) are outside the scope of the AP Computer Science A course and exam.
    • 1.2.B.2 A variable is a storage location that holds a value, which can change while the program is running. Every variable has a name and an associated data type. A variable of a primitive type holds a primitive value from that type.
    Tiếng Việt

    Mục tiêu học tập 1.2.A: Xác định danh mục kiểu dữ liệu phù hợp nhất cho một yêu cầu cụ thể.

    • 1.2.A.1 Một kiểu dữ liệu là một tập hợp các giá trị và một tập hợp các phép toán tương ứng trên các giá trị đó. Kiểu dữ liệu có thể được phân loại là nguyên thủy (primitive) hoặc tham chiếu (reference).
    • 1.2.A.2 Các kiểu dữ liệu nguyên thủy được sử dụng trong khóa học này xác định tập hợp các giá trị và các phép toán tương ứng trên các giá trị đó dành cho số và giá trị Boolean.
    • 1.2.A.3 Một kiểu tham chiếu được sử dụng để định nghĩa các đối tượng không phải là kiểu nguyên thủy.

    Mục tiêu học tập 1.2.B: Phát triển mã để khai báo các biến nhằm lưu trữ số và giá trị Boolean.

    • 1.2.B.1 Ba kiểu dữ liệu nguyên thủy được sử dụng trong khóa học này là int, double, và boolean. Một giá trị int là một số nguyên. Một giá trị double là một số thực. Một giá trị boolean là true hoặc false.
      • Câu loại trừ: Năm kiểu dữ liệu nguyên thủy còn lại (long, short, byte, float, và char) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 1.2.B.2 Một biến là một vị trí lưu trữ chứa một giá trị, giá trị đó có thể thay đổi trong khi chương trình đang chạy. Mỗi biến có một tên và một kiểu dữ liệu liên kết. Một biến của kiểu nguyên thủy chứa một giá trị nguyên thủy từ kiểu đó.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A variable 变量 is a named box that stores a value of a fixed type 类型. Java's main primitive types 基本类型 are int (whole numbers), double (decimals), and boolean (true/false). Declare with the type first:

    Tiếng Việt

    Một biến là một hộp có tên lưu trữ một giá trị có kiểu cố định. Các kiểu dữ liệu nguyên thủy chính của Java là int (số nguyên), double (số thập phân), và boolean (true/false). Khai báo với kiểu dữ liệu trước:

    Các kiểu dữ liệu cơ bản của Java, mỗi kiểu lưu trữ một loại giá trị khác nhau
    Các kiểu dữ liệu cơ bản của Java, mỗi kiểu lưu trữ một loại giá trị khác nhau
    int score = 90;
    double price = 4.99;
    boolean passed = true;
    
    Explore · ⁨Khám phá⁩

    Explore how a variable holds one value at a time · ⁨Khám phá cách biến lưu một giá trị tại một thời điểm⁩

    A variable is a named box that stores one value of a fixed type. Step through the lines and watch each box take its value; notice that reassigning score overwrites the old number rather than making a new box. · ⁨Biến là một hộp có tên lưu trữ một giá trị của kiểu cố định. Bước từng dòng và theo dõi mỗi hộp nhận giá trị của nó; hãy chú ý rằng gán lại score ghi đè số cũ thay vì tạo ra một hộp mới.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    type/taɪp/ chữ
    primitive types/ˈprɪmɪtɪv taɪps/ kiểu dữ liệu nguyên thủy
    expression/ekˈspreʃn/ biểu hiện
    modulus/ˈmɒdjʊləs/ mô-đun
    escape sequence/eˈskeɪp ˈsiːkwəns/ trình tự thoát
    assignment/əˈsaɪnmənt/ gán (assignment)
    Casting/ˈkæstɪŋ/ Epé (chuyển đổi kiểu)
    library/ˈlaɪbrəri/ thư viện (library)
    abstraction/əbˈstrækʃn/ trừu tượng hóa
    Comments/ˈkɒments/ Bình luận
    method signature/ˈmeθəd ˈsɪɡnɪtʃə/ ký hiệu phương thức
    arguments/ˈɑːɡjuːmənts/ tham số
    class (static) method/klæs ˈmeθəd/ phương thức lớp (tĩnh)
    1.3

    Expressions and Output · ⁨Biểu thức và Đầu ra⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.3.A: Develop code to generate output and determine the result that would be displayed.

    • 1.3.A.1 System.out.print and System.out.println display information on the computer display. System.out.println moves the cursor to a new line after the information has been displayed, while System.out.print does not.

    Learning Objective 1.3.B: Develop code to utilize string literals and determine the result of using string literals.

    • 1.3.B.1 A literal is the code representation of a fixed value.
    • 1.3.B.2 A string literal is a sequence of characters enclosed in double quotes.
    • 1.3.B.3 Escape sequences are special sequences of characters that can be included in a string. They start with a \ and have a special meaning in Java. Escape sequences used in this course include double quote \", backslash \\, and newline \n.

    Learning Objective 1.3.C: Develop code for arithmetic expressions and determine the result of these expressions.

    • 1.3.C.1 Arithmetic expressions, which consist of numeric values, variables, and operators, include expressions of type int and double.
    • 1.3.C.2 The arithmetic operators consist of addition +, subtraction -, multiplication *, division /, and remainder %. An arithmetic operation that uses two int values will evaluate to an int value. An arithmetic operation that uses at least one double value will evaluate to a double value.
      • Exclusion statement: Expressions that result in special double values (e.g., infinities and NaN) are outside the scope of the AP Computer Science A course and exam.
    • 1.3.C.3 When dividing numeric values that are both int values, the result is only the integer portion of the quotient. When dividing numeric values that use at least one double value, the result is the quotient.
    • 1.3.C.4 The remainder operator % is used to compute the remainder when one number a is divided by another number b.
      • Exclusion statement: The use of values less than 0 for a and the use of values less than or equal to 0 for b is outside the scope of the AP Computer Science A course and exam.
    • 1.3.C.5 Operators can be used to construct compound expressions. At compile time, numeric values are associated with operators according to operator precedence to determine how they are grouped. Parentheses can be used to modify operator precedence. Multiplication, division, and remainder have precedence over addition and subtraction. Operators with the same precedence are evaluated from left to right.
    • 1.3.C.6 An attempt to divide an integer by the integer zero will result in an ArithmeticException.
      • Exclusion statement: The use of dividing by zero when one numeric value is a double is outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 1.3.A: Phát triển mã để tạo đầu ra và xác định kết quả sẽ được hiển thị.

    • 1.3.A.1 System.out.print và System.out.println hiển thị thông tin trên màn hình máy tính. System.out.println di chuyển con trỏ sang dòng mới sau khi thông tin đã được hiển thị, trong khi System.out.print thì không.

    Mục tiêu học tập 1.3.B: Phát triển mã để sử dụng các hằng chuỗi (string literals) và xác định kết quả của việc sử dụng các hằng chuỗi.

    • 1.3.B.1 Một hằng (literal) là biểu diễn mã của một giá trị cố định.
    • 1.3.B.2 Một hằng chuỗi (string literal) là một dãy ký tự được bao quanh bởi dấu ngoặc kép đôi.
    • 1.3.B.3 Chuỗi thoát (escape sequences) là các dãy ký tự đặc biệt có thể được bao gồm trong một chuỗi. Chúng bắt đầu bằng một \ và có ý nghĩa đặc biệt trong Java. Các chuỗi thoát được sử dụng trong khóa học này bao gồm dấu ngoặc kép đôi \", dấu gạch chéo ngược \\, và xuống dòng \n.

    Mục tiêu học tập 1.3.C: Phát triển mã cho các biểu thức số học và xác định kết quả của các biểu thức này.

    • 1.3.C.1 Biểu thức số học, bao gồm các giá trị số, biến và toán tử, bao gồm các biểu thức có kiểu int và double.
    • 1.3.C.2 Các toán tử số học bao gồm cộng +, trừ -, nhân *, chia /, và dư %. Một phép toán số học sử dụng hai giá trị int sẽ đánh giá thành một giá trị int. Một phép toán số học sử dụng ít nhất một giá trị double sẽ đánh giá thành một giá trị double.
      • Câu loại trừ: Các biểu thức kết quả là các giá trị double đặc biệt (ví dụ: vô cực và NaN) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 1.3.C.3 Khi chia các giá trị số mà cả hai đều là int, kết quả chỉ là phần nguyên của thương. Khi chia các giá trị số mà có ít nhất một double, kết quả là thương.
    • 1.3.C.4 Toán tử dư % được sử dụng để tính phần dư khi một số a chia cho một số khác b.
      • Câu loại trừ: Việc sử dụng các giá trị nhỏ hơn 0 cho a và việc sử dụng các giá trị nhỏ hơn hoặc bằng 0 cho b nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 1.3.C.5 Các toán tử có thể được dùng để xây dựng biểu thức phức hợp. Tại thời điểm biên dịch, các giá trị số được gắn với các toán tử theo độ ưu tiên của toán tử để xác định cách nhóm chúng. Dấu ngoặc có thể được dùng để thay đổi độ ưu tiên của toán tử. Phép nhân, phép chia và phép dư có độ ưu tiên cao hơn phép cộng và phép trừ. Các toán tử có cùng độ ưu tiên được đánh giá từ trái sang phải.
    • 1.3.C.6 Một nỗ lực chia số nguyên cho số nguyên không sẽ dẫn đến một ArithmeticException.
      • Câu loại trừ: Việc sử dụng phép chia cho không khi một giá trị số là double nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An expression 表达式 combines values and operators to compute a result: + - * / and % (modulus 取模, the remainder). Integer division truncates: 7 / 2 is 3, while 7 % 2 is 1. Operator precedence follows math (*,/,% before +,-). Print with:

    Dividing an integer by the integer 0 (like 7 / 0) is not allowed and crashes at run time with an ArithmeticException. Inside a string, a backslash marks an escape sequence 转义序列: \" prints a double quote, \\ a single backslash, and \n starts a new line – so System.out.println("She said \"hi\""); prints She said "hi".

    Tiếng Việt

    Một biểu thức kết hợp các giá trị và toán tử để tính toán kết quả: + - * / và % (phép chia lấy dư, phần dư). Phép chia số nguyên cắt bỏ phần thập phân: 7 / 2 là 3, trong khi 7 % 2 là 1. Độ ưu tiên toán tử tuân theo toán học (*,/,% trước +,-). In ra màn hình bằng cách:

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

    Chia một số nguyên cho số nguyên 0 (như 7 / 0) là không được phép và gây lỗi thời gian chạy với ngoại lệ ArithmeticException. Bên trong chuỗi ký tự, dấu gạch chéo ngược đánh dấu một dãy thoát: \" in dấu ngoặc kép đôi, \\ in dấu gạch chéo ngược đơn, và \n bắt đầu dòng mới – do đó System.out.println("She said \"hi\""); sẽ in ra She said "hi".

    Explore · ⁨Khám phá⁩

    Explore the order of operations step by step · ⁨Khám phá thứ tự các phép toán từng bước⁩

    Java applies *, /, % before + and -, working left to right. Watch each step and see why 2 + 3 * 4 is $14$, not $20$ — the multiplication happens first. · ⁨Java áp dụng *, /, % trước khi + và -, làm việc từ trái sang phải. Theo dõi từng bước và xem tại sao 2 + 3 * 4 là $14$, không phải $20$ — phép nhân diễn ra trước.⁩

    1.4

    Assignment Statements and Input · ⁨Câu gán và Nhập liệu⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.4.A: Develop code for assignment statements with expressions and determine the value that is stored in the variable as a result of these statements.

    • 1.4.A.1 Every variable must be assigned a value before it can be used in an expression. That value must be from a compatible data type. A variable is initialized the first time it is assigned a value. Reference types can be assigned a new object or null if there is no object. The literal null is a special value used to indicate that a reference is not associated with any object.
    • 1.4.A.2 The assignment operator = allows a program to initialize or change the value stored in a variable. The value of the expression on the right is stored in the variable on the left.
      • Exclusion statement: The use of assignment operators inside expressions (e.g., a = b = 4; or a[i += 5]) is outside the scope of the AP Computer Science A course and exam.
    • 1.4.A.3 During execution, an expression is evaluated to produce a single value. The value of an expression has a type based on the evaluation of the expression.

    Learning Objective 1.4.B: Develop code to read input.

    • 1.4.B.1 Input can come in a variety of forms, such as tactile, audio, visual, or text. The Scanner class is one way to obtain text input from the keyboard.
      • Exclusion statement: Any specific form of input from the user is outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 1.4.A: Viết mã cho câu lệnh gán với biểu thức và xác định giá trị được lưu trong biến như một kết quả của các câu lệnh này.

    • 1.4.A.1 Mọi biến phải được gán một giá trị trước khi có thể được sử dụng trong biểu thức. Giá trị đó phải thuộc về một kiểu dữ liệu tương thích. Biến được khởi tạo lần đầu tiên khi nó được gán một giá trị. Các kiểu tham chiếu có thể được gán một đối tượng mới hoặc null nếu không có đối tượng nào. Literal null là một giá trị đặc biệt được dùng để chỉ ra rằng một tham chiếu không liên kết với bất kỳ đối tượng nào.
    • 1.4.A.2 Toán tử gán = cho phép chương trình khởi tạo hoặc thay đổi giá trị được lưu trong một biến. Giá trị của biểu thức ở vế phải được lưu vào biến ở vế trái.
      • Câu loại trừ: Việc sử dụng các toán tử gán bên trong biểu thức (ví dụ: a = b = 4; hoặc a[i += 5]) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 1.4.A.3 Trong quá trình thực thi, một biểu thức được đánh giá để tạo ra một giá trị duy nhất. Giá trị của một biểu thức có kiểu dựa trên việc đánh giá biểu thức đó.

    Mục tiêu học tập 1.4.B: Viết mã để đọc dữ liệu đầu vào.

    • 1.4.B.1 Dữ liệu đầu vào có thể đến dưới nhiều dạng khác nhau, chẳng hạn như xúc giác, âm thanh, hình ảnh hoặc văn bản. Class Scanner là một cách để nhận dữ liệu văn bản từ bàn phím.
      • Câu loại trừ: Bất kỳ dạng cụ thể nào của dữ liệu đầu vào từ người dùng đều nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An assignment 赋值 x = expr; evaluates the right side and stores it in the left variable. Read input with a Scanner:

    Tiếng Việt

    Một câu gán x = expr; tính giá trị bên phải và lưu vào biến bên trái. Đọc dữ liệu đầu vào bằng cách sử dụng một Scanner:

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

    Casting and Range of Variables · ⁨Ép kiểu và Phạm vi của Biến⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.5.A: Develop code to cast primitive values to different primitive types in arithmetic expressions and determine the value that is produced as a result.

    • 1.5.A.1 The casting operators (int) and (double) can be used to convert from a double value to an int value (or vice versa).
    • 1.5.A.2 Casting a double value to an int value causes the digits to the right of the decimal point to be truncated.
    • 1.5.A.3 Some code causes int values to be automatically cast (widened) to double values.
    • 1.5.A.4 Values of type double can be rounded to the nearest integer by (int)(x + 0.5) for non-negative numbers or (int)(x - 0.5) for negative numbers.

    Learning Objective 1.5.B: Describe conditions when an integer expression evaluates to a value out of range.

    • 1.5.B.1 The constant Integer.MAX_VALUE holds the value of the largest possible int value. The constant Integer.MIN_VALUE holds the value of the smallest possible int value.
    • 1.5.B.2 Integer values in Java are represented by values of type int, which are stored using a finite amount (4 bytes) of memory. Therefore, an int value must be in the range from Integer.MIN_VALUE to Integer.MAX_VALUE inclusive.
    • 1.5.B.3 If an expression would evaluate to an int value outside of the allowed range, an integer overflow occurs. The result is an int value in the allowed range but not necessarily the value expected.

    Learning Objective 1.5.C: Describe conditions that limit accuracy of expressions.

    • 1.5.C.1 Computers allot a specified amount of memory to store data based on the data type. If an expression would evaluate to a double that is more precise than can be stored in the allotted amount of memory, a round-off error occurs. The result will be rounded to the representable value. To avoid rounding errors that naturally occur, use int values.
      • Exclusion statement: Other special decimal data types that can be used to avoid rounding errors are outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 1.5.A: Viết mã để ép các giá trị nguyên thủy sang các kiểu nguyên thủy khác trong các biểu thức số học và xác định giá trị được tạo ra như một kết quả.

    • 1.5.A.1 Các toán tử ép kiểu (int) và (double) có thể được dùng để chuyển đổi từ một giá trị double sang một giá trị int (hoặc ngược lại).
    • 1.5.A.2 Ép một giá trị double sang một giá trị int sẽ làm cắt bỏ các chữ số bên phải dấu thập phân.
    • 1.5.A.3 Một số đoạn mã gây ra việc các giá trị int được tự động ép (mở rộng) sang các giá trị double.
    • 1.5.A.4 Các giá trị có kiểu double có thể được làm tròn đến số nguyên gần nhất bởi (int)(x + 0.5) đối với các số không âm hoặc (int)(x - 0.5) đối với các số âm.

    Mục tiêu học tập 1.5.B: Mô tả các điều kiện khi một biểu thức số nguyên đánh giá ra một giá trị nằm ngoài phạm vi.

    • 1.5.B.1 Hằng số Integer.MAX_VALUE giữ giá trị lớn nhất có thể của một giá trị int. Hằng số Integer.MIN_VALUE giữ giá trị nhỏ nhất có thể của một giá trị int.
    • 1.5.B.2 Các giá trị số nguyên trong Java được biểu diễn bằng các giá trị có kiểu int, được lưu trữ bằng một lượng bộ nhớ hữu hạn (4 byte). Do đó, một giá trị int phải nằm trong phạm vi từ Integer.MIN_VALUE đến Integer.MAX_VALUE bao gồm cả hai đầu mút.
    • 1.5.B.3 Nếu một biểu thức sẽ đánh giá ra một giá trị int nằm ngoài phạm vi cho phép, sẽ xảy ra tràn số nguyên. Kết quả là một giá trị int nằm trong phạm vi cho phép nhưng không nhất thiết là giá trị mong đợi.

    Mục tiêu học tập 1.5.C: Mô tả các điều kiện giới hạn độ chính xác của biểu thức.

    • 1.5.C.1 Máy tính cấp phát một lượng bộ nhớ quy định để lưu trữ dữ liệu dựa trên kiểu dữ liệu. Nếu một biểu thức sẽ đánh giá ra một double có độ chính xác cao hơn mức có thể lưu trữ trong lượng bộ nhớ đã cấp, sẽ xảy ra lỗi làm tròn. Kết quả sẽ được làm tròn đến giá trị có thể biểu diễn. Để tránh các lỗi làm tròn tự nhiên xảy ra, hãy sử dụng các giá trị int.
      • Câu loại trừ: Các kiểu dữ liệu thập phân đặc biệt khác có thể được sử dụng để tránh lỗi làm tròn nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    int range, overflow and truncation

    Each type has a fixed range; an int overflows past about 2.1 billion. Casting 类型转换 converts between types. Widening (int to double) is automatic; narrowing needs an explicit cast, which truncates (does not round):

    Exam skill: watch for integer division producing a truncated result when a decimal was expected – cast one operand to double first.

    Worked example. Trace each expression:

    • 7 / 2 → 3 (both int, so division truncates);
    • 7.0 / 2 → 3.5 (one double forces real division);
    • 7 % 2 → 1 (the remainder);
    • (double) 7 / 2 → 3.5 (the cast binds tighter than /, so it is 7.0 / 2);
    • (double) (7 / 2) → 3.0 (the parentheses compute 7 / 2 = 3 in int first, then widen).

    The last two look alike but differ – the position of the cast decides whether the truncation happens.

    Tiếng Việt
    Phạm vi int, tràn số và cắt bỏ

    Mỗi kiểu có một phạm vi cố định; một số int sẽ bị tràn khi vượt quá khoảng 2.1 tỷ. Ép kiểu chuyển đổi giữa các kiểu. Mở rộng (từ int sang double) diễn ra tự động; thu hẹp cần ép kiểu rõ ràng, điều này sẽ cắt cụt (không làm tròn):

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

    Kỹ năng làm bài thi: hãy chú ý đến phép chia số nguyên tạo ra kết quả bị cắt bỏ khi mong đợi số thập phân – hãy ép một toán hạng sang double trước.

    Ví dụ minh họa. Theo dõi từng biểu thức:

    • 7 / 2 → 3 (cả hai đều là int, nên phép chia bị cắt bỏ);
    • 7.0 / 2 → 3.5 (một operand là double buộc phép chia thực);
    • 7 % 2 → 1 (giá trị phần dư);
    • (double) 7 / 2 → 3.5 (phép ép kiểu có độ ưu tiên cao hơn phép toán /, nên kết quả là 7.0 / 2);
    • (double) (7 / 2) → 3.0 (dấu ngoặc tính 7 / 2 = 3 trước trong kiểu int, sau đó mới mở rộng).

    Hai câu cuối trông giống nhau nhưng khác biệt – vị trí của phép ép kiểu quyết định việc cắt bỏ phần thập phân xảy ra ở đâu.

    Explore · ⁨Khám phá⁩

    Why int and double store numbers differently · ⁨Tại sao int và double lưu trữ số khác nhau⁩

    An int holds only whole numbers in a fixed range; a double stores a mantissa and an exponent, trading exactness for a huge range. Casting double→int throws away the fraction, and a value past an int's range overflows. · ⁨Một int chỉ chứa số nguyên trong khoảng xác định; một double lưu trữ phần thập phân và số mũ, đổi lấy độ chính xác bằng một khoảng giá trị lớn. Ép kiểu double→int sẽ loại bỏ phần thập phân, và một giá trị vượt quá giới hạn của một int sẽ gây tràn.⁩

    1.6

    Compound Assignment Operators · ⁨Các Toán tử gán kết hợp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.6.A: Develop code for assignment statements with compound assignment operators and determine the value that is stored in the variable as a result.

    • 1.6.A.1 Compound assignment operators +=, -=, *=, /=, and %= can be used in place of the assignment operator in numeric expressions. A compound assignment operator performs the indicated arithmetic operation between the value on the left and the value on the right and then assigns the result to the variable on the left.
    • 1.6.A.2 The post-increment operator ++ and post-decrement operator -- are used to add 1 or subtract 1 from the stored value of a numeric variable. The new value is assigned to the variable.
      • Exclusion statement: The use of increment and decrement operators in prefix form (e.g., ++x) is outside the scope of the AP Computer Science A course and exam. The use of increment and decrement operators inside other expressions (e.g., arr[x++]) is outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 1.6.A: Viết mã cho câu lệnh gán với các toán tử gán phức hợp và xác định giá trị được lưu trong biến như một kết quả.

    • 1.6.A.1 Các toán tử gán phức hợp +=, -=, *=, /= và %= có thể được dùng thay thế cho toán tử gán trong các biểu thức số. Một toán tử gán phức hợp thực hiện phép toán số học được chỉ định giữa giá trị ở vế trái và giá trị ở vế phải, sau đó gán kết quả vào biến ở vế trái.
    • 1.6.A.2 Toán tử tăng hậu ++ và toán tử giảm hậu -- được dùng để thêm 1 hoặc trừ 1 khỏi giá trị được lưu trong một biến số. Giá trị mới được gán cho biến.
      • Câu loại trừ: Việc sử dụng toán tử tăng và giảm theo dạng tiền tố (ví dụ: ++x) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A. Việc sử dụng toán tử tăng và giảm bên trong các biểu thức khác (ví dụ: arr[x++]) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Shorthands combine an operation with assignment: x += 5 means x = x + 5; likewise -=, *=, /=, %=. The increment and decrement operators x++ and x-- add or subtract one.

    Tiếng Việt

    Các ký hiệu viết tắt kết hợp một phép toán với phép gán: x += 5 có nghĩa là x = x + 5; tương tự như vậy -=, *=, /=, %=. Các toán tử tăng và giảm x++ và x-- cộng hoặc trừ đi một.

    1.7

    Application Program Interface (API) and Libraries · ⁨Giao diện lập trình ứng dụng (API) và Thư viện⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.7.A: Identify the attributes and behaviors of a class found in the libraries contained in an API.

    • 1.7.A.1 Libraries are collections of classes. An application programming interface (API) specification informs the programmer how to use those classes. Documentation found in API specifications and libraries is essential to understanding the attributes and behaviors of a class defined by the API. A class defines a specific reference type. Classes in the APIs and libraries are grouped into packages. Existing classes and class libraries can be utilized to create objects.
    • 1.7.A.2 Attributes refer to the data related to the class and are stored in variables. Behaviors refer to what instances of the class can do (or what can be done with them) and are defined by methods.
    Tiếng Việt

    Mục tiêu học tập 1.7.A: Xác định các thuộc tính và hành vi của một lớp được tìm thấy trong các thư viện contained trong một API.

    • 1.7.A.1 Thư viện là tập hợp các lớp. Một tài liệu về giao diện lập trình ứng dụng (API) cung cấp thông tin cho lập trình viên cách sử dụng các lớp đó. Tài liệu có sẵn trong các tài liệu về API và thư viện là thiết yếu để hiểu được các thuộc tính và hành vi của một lớp do API xác định. Một lớp xác định một kiểu tham chiếu cụ thể. Các lớp trong API và thư viện được nhóm thành các gói (packages). Các lớp và thư viện lớp hiện có có thể được sử dụng để tạo ra các đối tượng.
    • 1.7.A.2 Thuộc tính đề cập đến dữ liệu liên quan đến lớp và được lưu trữ trong các biến. Hành vi đề cập đến những gì các thực thể của lớp có thể làm (hoặc những gì có thể được làm với chúng) và được xác định bởi các phương thức.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An API (Application Programming Interface) 应用程序接口 is the published list of classes and methods you may use. A library 库 is a collection of ready-made classes (like Math, String, Scanner). You read the API documentation to learn what a method needs (its parameters) and returns, without seeing its inner code – an example of abstraction 抽象.

    Tiếng Việt

    API (Giao diện lập trình ứng dụng) là danh sách công bố các lớp và phương thức bạn có thể sử dụng. Một thư viện là tập hợp các lớp có sẵn (như Math, String, Scanner). Bạn đọc tài liệu API để biết phương thức cần gì (các tham số) và trả về điều gì, mà không cần xem mã nguồn bên trong – đây là một ví dụ về sự trừu tượng.

    1.8

    Documentation with Comments · ⁨Tài liệu hóa bằng Comment⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.8.A: Describe the functionality and use of code through comments.

    • 1.8.A.1 Comments are written for both the original programmer and other programmers to understand the code and its functionality, but are ignored by the compiler and are not executed when the program is run. Three types of comments in Java include /* */, which generates a block of comments; //, which generates a comment on one line; and /** */, which are Javadoc comments and are used to create API documentation.
    • 1.8.A.2 A precondition is a condition that must be true just prior to the execution of a method in order for it to behave as expected. There is no expectation that the method will check to ensure preconditions are satisfied.
    • 1.8.A.3 A postcondition is a condition that must always be true after the execution of a method. Postconditions describe the outcome of the execution in terms of what is being returned or the current value of the attributes of an object.
    Tiếng Việt

    Mục tiêu học tập 1.8.A: Mô tả chức năng và cách sử dụng mã nguồn thông qua các bình luận.

    • 1.8.A.1 Bình luận được viết cho cả lập trình viên gốc và các lập trình viên khác để hiểu mã nguồn và chức năng của nó, nhưng bị bỏ qua bởi trình biên dịch và không được thực thi khi chương trình chạy. Ba loại bình luận trong Java bao gồm /* */, tạo ra một khối bình luận; //, tạo ra một bình luận trên một dòng; và /** */, là bình luận Javadoc và được sử dụng để tạo tài liệu API.
    • 1.8.A.2 Tiền điều kiện là một điều kiện phải đúng ngay trước khi thực thi một phương thức để nó hoạt động như mong đợi. Không có yêu cầu nào rằng phương thức sẽ kiểm tra để đảm bảo tiền điều kiện được thỏa mãn.
    • 1.8.A.3 Hậu điều kiện là một điều kiện luôn phải đúng sau khi thực thi một phương thức. Hậu điều kiện mô tả kết quả của việc thực thi dựa trên giá trị được trả về hoặc giá trị hiện tại của các thuộc tính của một đối tượng.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Comments 注释 are ignored by the compiler but explain code to humans: // for a single line, /* ... */ for a block, and /** ... */ for a Javadoc comment that documents a method's purpose, parameters, and return value. Precise preconditions and postconditions are written here.

    Tiếng Việt

    Comment bị trình biên dịch bỏ qua nhưng giải thích mã cho con người: // cho một dòng, /* ... */ cho một khối, và /** ... */ cho comment Javadoc tài liệu hóa mục đích, tham số và giá trị trả về của một phương thức. Các tiền đề và hậu đề chính xác được viết ở đây.

    1.9

    Method Signatures · ⁨Chữ ký phương thức⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.9.A: Identify the correct method to call based on documentation and method signatures.

    • 1.9.A.1 A method is a named block of code that only runs when it is called. A block of code is any section of code that is enclosed in braces. Procedural abstraction allows a programmer to use a method by knowing what the method does even if they do not know how the method was written.
    • 1.9.A.2 A parameter is a variable declared in the header of a method or constructor and can be used inside the body of the method. This allows values or arguments to be passed and used by a method or constructor. A method signature for a method with parameters consists of the method name and the ordered list of parameter types. A method signature for a method without parameters consists of the method name and an empty parameter list.

    Learning Objective 1.9.B: Describe how to call methods.

    • 1.9.B.1 A void method does not have a return value and is therefore not called as part of an expression.
    • 1.9.B.2 A non-void method returns a value that is the same type as the return type in the header. To use the return value when calling a non-void method, it must be stored in a variable or used as part of an expression.
    • 1.9.B.3 An argument is a value that is passed into a method when the method is called. The arguments passed to a method must be compatible in number and order with the types identified in the parameter list of the method signature. When calling methods, arguments are passed using call by value. Call by value initializes the parameters with copies of the arguments.
    • 1.9.B.4 Methods are said to be overloaded when there are multiple methods with the same name but different signatures.
    • 1.9.B.5 A method call interrupts the sequential execution of statements, causing the program to first execute the statements in the method before continuing. Once the last statement in the method has been executed or a return statement is executed, the flow of control is returned to the point immediately following where the method was called.
    Tiếng Việt

    Mục tiêu học tập 1.9.A: Xác định phương thức đúng cần gọi dựa trên tài liệu và chữ ký phương thức.

    • 1.9.A.1 Một phương thức là một khối mã có tên chỉ chạy khi nó được gọi. Một khối mã là bất kỳ phần mã nào được bao quanh bởi dấu ngoặc nhọn. Trừu tượng hóa thủ tục cho phép lập trình viên sử dụng một phương thức bằng cách biết phương thức đó làm gì, ngay cả khi họ không biết phương thức đó được viết như thế nào.
    • 1.9.A.2 Một tham số là một biến được khai báo trong phần đầu của một phương thức hoặc constructor và có thể được sử dụng bên trong thân phương thức. Điều này cho phép các giá trị hoặc đối số được truyền vào và sử dụng bởi một phương thức hoặc constructor. Một chữ ký phương thức cho một phương thức có tham số bao gồm tên phương thức và danh sách có thứ tự các loại tham số. Một chữ ký phương thức cho một phương thức không có tham số bao gồm tên phương thức và một danh sách tham số rỗng.

    Mục tiêu học tập 1.9.B: Mô tả cách gọi các phương thức.

    • 1.9.B.1 Một phương thức void không có giá trị trả về và do đó không được gọi như một phần của một biểu thức.
    • 1.9.B.2 Một phương thức không void trả về một giá trị có cùng loại với loại trả về trong phần đầu. Để sử dụng giá trị trả về khi gọi một phương thức không void, nó phải được lưu trữ trong một biến hoặc được sử dụng như một phần của một biểu thức.
    • 1.9.B.3 Một đối số là một giá trị được truyền vào một phương thức khi phương thức đó được gọi. Các đối số được truyền vào một phương thức phải tương thích về số lượng và thứ tự với các loại đã xác định trong danh sách tham số của chữ ký phương thức. Khi gọi các phương thức, các đối số được truyền bằng cách truyền theo giá trị. Truyền theo giá trị khởi tạo các tham số bằng các bản sao của các đối số.
    • 1.9.B.4 Các phương thức được nói là quá tải khi có nhiều phương thức với cùng tên nhưng khác nhau về chữ ký.
    • 1.9.B.5 Một lời gọi phương thức sẽ tạm dừng việc thực thi tuần tự của các câu lệnh, khiến chương trình thực thi trước các câu lệnh trong phương thức trước khi tiếp tục. Sau khi câu lệnh cuối cùng trong phương thức được thực thi hoặc một câu lệnh return được thực thi, luồng điều khiển sẽ trở lại điểm ngay sau nơi phương thức được gọi.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A method signature 方法签名 is a method's name plus its parameter types, e.g. nextInt() or substring(int, int). To call a method you must supply arguments 实参 that match the parameters in number, type, and order. The method header (the full declaration) also states the return type – the type of value the method gives back (void if none) – but the return type is not part of the signature, which is why two methods cannot differ by return type alone.

    Tiếng Việt

    Chữ ký phương thức là tên phương thức cộng với các loại tham số của nó, ví dụ: nextInt() hoặc substring(int, int). Để gọi một phương thức, bạn phải cung cấp đối số khớp về số lượng, loại và thứ tự với các tham số. Tiêu đề phương thức (câu khai báo đầy đủ) cũng chỉ định loại trả về – loại giá trị mà phương thức trả lại (void nếu không có) – nhưng loại trả về không là một phần của chữ ký, đó là lý do hai phương thức không thể chỉ khác nhau bởi loại trả về.

    1.10

    Calling Class Methods · ⁨Gọi Phương thức Lớp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.10.A: Develop code to call class methods and determine the result of those calls.

    • 1.10.A.1 Class methods are associated with the class, not instances of the class. Class methods include the keyword static in the header before the method name.
    • 1.10.A.2 Class methods are typically called using the class name along with the dot operator. When the method call occurs in the defining class, the use of the class name is optional in the call.
    Tiếng Việt

    Mục tiêu Học tập 1.10.A: Viết mã để gọi các phương thức lớp và xác định kết quả của các lời gọi đó.

    • 1.10.A.1 Phương thức lớp được gắn với lớp, không phải với các đối tượng (instance) của lớp. Các phương thức lớp bao gồm từ khóa static trong phần đầu (header) trước tên phương thức.
    • 1.10.A.2 Phương thức lớp thường được gọi bằng cách sử dụng tên lớp cùng với toán tử dấu chấm. Khi lời gọi phương thức xảy ra bên trong lớp định nghĩa, việc sử dụng tên lớp là tùy chọn trong lời gọi.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A class (static) method 类方法 belongs to the class itself, so you call it on the class name: ClassName.method(args). No object is needed.

    Tiếng Việt

    Một phương thức lớp (tĩnh) thuộc về bản thân lớp, vì vậy bạn gọi nó trên tên lớp: ClassName.method(args). Không cần đối tượng nào.

    Explore · ⁨Khám phá⁩

    Follow a class-method call on the stack · ⁨Theo dõi gọi phương thức lớp trên ngăn xếp⁩

    Calling a class method like Math.max pushes a new frame onto the call stack; when the method returns a value, its frame pops and control goes back to the caller. Step through to watch the stack grow and shrink. · ⁨Gọi một phương thức lớp như Math.max sẽ đẩy một khung mới vào ngăn xếp gọi; khi phương thức trả về một giá trị, khung của nó bị loại bỏ và quyền điều khiển quay trở lại người gọi. Bước qua để quan sát ngăn xếp mở rộng và thu hẹp.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    class/klæs/ lớp
    1.11

    Math Class · ⁨Lớp Math⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.11.A: Develop code to write expressions that incorporate calls to built-in mathematical libraries and determine the value that is produced as a result.

    • 1.11.A.1 The Math class is part of the java.lang package. Classes in the java.lang package are available by default.
    • 1.11.A.2 The Math class contains only class methods. The following Math class methods—including what they do and when they are used—are part of the Java Quick Reference:
      • static int abs(int x) returns the absolute value of an int value.
      • static double abs(double x) returns the absolute value of a double value.
      • static double pow(double base, double exponent) returns the value of the first parameter raised to the power of the second parameter.
      • static double sqrt(double x) returns the nonnegative square root of a double value.
      • static double random() returns a double value greater than or equal to 0.0 and less than 1.0.
    • 1.11.A.3 The values returned from Math.random() can be manipulated using arithmetic and casting operators to produce a random int or double in a defined range based on specified criteria. Each endpoint of the range can be inclusive, meaning the value is included, or exclusive, meaning the value is not included.
    Tiếng Việt

    Mục tiêu Học tập 1.11.A: Viết mã để tạo biểu thức chứa các lời gọi đến thư viện toán học có sẵn và xác định giá trị được tạo ra như một kết quả.

    • 1.11.A.1 Lớp Math là một phần của gói java.lang. Các lớp trong gói java.lang có sẵn theo mặc định.
    • 1.11.A.2 Lớp Math chỉ chứa các phương thức lớp. Các phương thức lớp Math sau đây—bao gồm chức năng của chúng và thời điểm sử dụng—là một phần của Tài liệu tham khảo nhanh Java:
      • static int abs(int x) trả về giá trị tuyệt đối của một giá trị int.
      • static double abs(double x) trả về giá trị tuyệt đối của một giá trị double.
      • static double pow(double base, double exponent) trả về giá trị của tham số đầu tiên được nâng lên lũy thừa của tham số thứ hai.
      • static double sqrt(double x) trả về căn bậc hai không âm của một giá trị double.
      • static double random() trả về một giá trị double lớn hơn hoặc bằng 0.0 và nhỏ hơn 1.0.
    • 1.11.A.3 Các giá trị trả về từ Math.random() có thể được xử lý bằng các toán tử số học và chuyển đổi kiểu (casting) để tạo ra một số ngẫu nhiên int hoặc double trong một phạm vi xác định dựa trên các tiêu chí đã chỉ định. Mỗi đầu mút của phạm vi có thể là đóng (inclusive), nghĩa là giá trị được bao gồm, hoặc mở (exclusive), nghĩa là giá trị không được bao gồm.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    The Math class provides static math methods: Math.abs(x), Math.pow(base, exp), Math.sqrt(x), and Math.random() (a double in $[0,1)$). To get a random integer from 0 to n-1: (int)(Math.random() * n).

    Tiếng Việt

    Lớp Math cung cấp các phương thức toán học tĩnh: Math.abs(x), Math.pow(base, exp), Math.sqrt(x), và Math.random() (một double trong $[0,1)$). Để lấy một số nguyên ngẫu nhiên từ 0 đến n-1: (int)(Math.random() * n).

    1.12

    Objects: Instances of Classes · ⁨Đối tượng: Các实例 của Lớp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.12.A: Explain the relationship between a class and an object.

    • 1.12.A.1 An object is a specific instance of a class with defined attributes. A class is the formal implementation, or blueprint, of the attributes and behaviors of an object.
    • 1.12.A.2 A class hierarchy can be developed by putting common attributes and behaviors of related classes into a single class called a superclass. Classes that extend a superclass, called subclasses, can draw upon the existing attributes and behaviors of the superclass without replacing these in the code. This creates an inheritance relationship from the subclasses to the superclass.
      • Exclusion statement: Designing and implementing inheritance relationships are outside the scope of the AP Computer Science A course and exam.
    • 1.12.A.3 All classes in Java are subclasses of the Object class.

    Learning Objective 1.12.B: Develop code to declare variables to store reference types.

    • 1.12.B.1 A variable of a reference type holds an object reference, which can be thought of as the memory address of that object.
    Tiếng Việt

    Mục tiêu Học tập 1.12.A: Giải thích mối quan hệ giữa một lớp và một đối tượng.

    • 1.12.A.1 Một đối tượng là một instance cụ thể của một lớp với các thuộc tính được xác định. Một lớp là sự triển khai chính thức, hay bản thiết kế, của các thuộc tính và hành vi của một đối tượng.
    • 1.12.A.2 Một phân cấp lớp có thể được xây dựng bằng cách đưa các thuộc tính và hành vi chung của các lớp liên quan vào một lớp duy nhất gọi là lớp cha (superclass). Các lớp mở rộng lớp cha, gọi là lớp con (subclasses), có thể tận dụng các thuộc tính và hành vi hiện có của lớp cha mà không cần thay thế những thứ này trong mã. Điều này tạo ra một quan hệ thừa kế từ các lớp con đến lớp cha.
      • Câu loại trừ: Thiết kế và triển khai các quan hệ thừa kế nằm ngoài phạm vi của môn học và kỳ thi AP Computer Science A.
    • 1.12.A.3 Tất cả các lớp trong Java đều là lớp con của lớp Object.

    Mục tiêu Học tập 1.12.B: Viết mã để khai báo biến để lưu trữ các loại tham chiếu (reference types).

    • 1.12.B.1 Một biến của loại tham chiếu giữ một tham chiếu đối tượng, điều này có thể được hiểu là địa chỉ bộ nhớ của đối tượng đó.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    = copies the reference, not the object

    A class 类 is a blueprint; an object 对象 is a concrete instance 实例 built from it. A class bundles data (fields) with behavior (methods) – the heart of object-oriented programming 面向对象编程. String, Scanner, and ArrayList are all classes you instantiate.

    Classes can be organised into a hierarchy. A superclass 父类 holds attributes and behaviors shared by several subclasses 子类 that extend it – an inheritance relationship 继承关系. Every class in Java is ultimately a subclass of the built-in Object class, which is why every object already has a toString method; writing a subclass method with the same signature as a superclass one is method overriding 方法重写. (Designing your own inheritance is beyond this course, but you are expected to recognise this vocabulary.)

    Tiếng Việt
    = sao chép tham chiếu, không phải đối tượng

    Một lớp là bản thiết kế; một đối tượng là một instance cụ thể được xây dựng từ nó. Một lớp đóng gói dữ liệu (các trường) với hành vi (các phương thức) – trái tim của lập trình hướng đối tượng. String, Scanner, và ArrayList đều là các lớp bạn có thể tạo instance.

    Các lớp có thể được tổ chức theo cấu trúc phân cấp. Một lớp cha chứa các thuộc tính và hành vi chung mà nhiều lớp con extend nó – đây là mối quan hệ thừa kế. Mọi lớp trong Java đều cuối cùng là lớp con của lớp tích hợp sẵn Object, do đó mọi đối tượng đều đã có phương thức toString; việc viết một phương thức lớp con có cùng chữ ký với phương thức lớp cha gọi là ghi đè phương thức. (Việc thiết kế thừa kế riêng cho bạn nằm ngoài phạm vi khóa học này, nhưng bạn cần nhận diện được các thuật ngữ này.)

    Sơ đồ lớp: thuộc tính riêng tư và phương thức công khai
    Sơ đồ lớp: thuộc tính riêng tư và phương thức công khai
    Một lớp là bản thiết kế; mỗi đối tượng là một instance được xây dựng từ nó
    Một lớp là bản thiết kế; mỗi đối tượng là một instance được xây dựng từ nó
    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    object/ˈɒbdʒekt/ vật
    instance/ˈɪnstəns/ thực thể
    object-oriented programming/ˈɒbdʒekt ˈɔːrɪəntɪd ˈprəʊɡræmɪŋ/ lập trình hướng đối tượng
    superclass/ˈsuːpəklæs/ siêu lớp
    subclasses/ˈsʌbklæsɪz/ lớp con
    inheritance relationship/ɪnˈherɪtəns rɪˈleɪʃənʃɪp/ mối quan hệ thừa kế
    method overriding/ˈmeθəd ˌəʊvəˈraɪdɪŋ/ ghi đè phương thức
    Instantiation/ˌɪnstænʃɪˈeɪʃn/ Khởi tạo đối tượng
    reference/ˈrefrəns/ tham chiếu
    1.13

    Object Creation and Storage (Instantiation) · ⁨Tạo và Lưu trữ Đối tượng (Tạo Instance)⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.13.A: Identify, using its signature, the correct constructor being called.

    • 1.13.A.1 A class contains constructors that are called to create objects. They have the same name as the class.
    • 1.13.A.2 A constructor signature consists of the constructor's name, which is the same as the class name, and the ordered list of parameter types. The parameter list, in the header of a constructor, lists the types of the values that are passed and their variable names.
    • 1.13.A.3 Constructors are said to be overloaded when there are multiple constructors with different signatures.

    Learning Objective 1.13.B: Develop code to declare variables of the correct types to hold object references.

    • 1.13.B.1 A variable of a reference type holds an object reference or, if there is no object, null.

    Learning Objective 1.13.C: Develop code to create an object by calling a constructor.

    • 1.13.C.1 An object is typically created using the keyword new followed by a call to one of the class's constructors.
    • 1.13.C.2 Parameters allow constructors to accept values to establish the initial values of the attributes of the object.
    • 1.13.C.3 A constructor argument is a value that is passed into a constructor when the constructor is called. The arguments passed to a constructor must be compatible in order and number with the types identified in the parameter list in the constructor signature. When calling constructors, arguments are passed using call by value. Call by value initializes the parameters with copies of the arguments.
    • 1.13.C.4 A constructor call interrupts the sequential execution of statements, causing the program to first execute the statements in the constructor before continuing. Once the last statement in the constructor has been executed, the flow of control is returned to the point immediately following where the constructor was called.
    Tiếng Việt

    Mục tiêu Học tập 1.13.A: Xác định, dựa trên chữ ký (signature), constructor đang được gọi đúng.

    • 1.13.A.1 Một lớp chứa các constructor được gọi để tạo ra các đối tượng. Chúng có cùng tên với lớp.
    • 1.13.A.2 Chữ ký constructor bao gồm tên của constructor (cùng tên với tên lớp) và danh sách có thứ tự các loại tham số. Danh sách tham số, trong phần đầu của constructor, liệt kê các loại của các giá trị được truyền và tên biến của chúng.
    • 1.13.A.3 Các constructor được cho là bị quá tải (overloaded) khi có nhiều constructor với các chữ ký khác nhau.

    Mục tiêu Học tập 1.13.B: Viết mã để khai báo biến có đúng loại để lưu trữ các tham chiếu đối tượng.

    • 1.13.B.1 Một biến của loại tham chiếu giữ một tham chiếu đối tượng, hoặc nếu không có đối tượng nào, thì là null.

    Mục tiêu Học tập 1.13.C: Viết mã để tạo một đối tượng bằng cách gọi một constructor.

    • 1.13.C.1 Một đối tượng thường được tạo bằng cách sử dụng từ khóa new theo sau bởi một lời gọi đến một trong các constructor của lớp.
    • 1.13.C.2 Các tham số cho phép constructor chấp nhận các giá trị để thiết lập các giá trị ban đầu của các thuộc tính của đối tượng.
    • 1.13.C.3 Một tham số constructor là một giá trị được truyền vào một constructor khi constructor được gọi. Các tham số truyền vào một constructor phải tương thích về thứ tự và số lượng với các loại được xác định trong danh sách tham số của chữ ký constructor. Khi gọi constructors, các tham số được truyền theo cơ chế truyền theo giá trị (call by value). Truyền theo giá trị khởi tạo các tham số bằng các bản sao của các tham số.
    • 1.13.C.4 Một lời gọi constructor làm gián đoạn việc thực thi tuần tự của các câu lệnh, khiến chương trình thực thi các câu lệnh trong constructor trước, sau đó mới tiếp tục. Sau khi câu lệnh cuối cùng trong constructor được thực thi, luồng điều khiển sẽ trở lại điểm ngay sau nơi constructor được gọi.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Instantiation 实例化 creates an object with the new keyword, which calls a constructor 构造函数:

    The variable holds a reference 引用 (the object's address), not the object itself. Two references can point to the same object; comparing them with == compares addresses, not contents.

    A reference can also point to nothing: the special value null 空值 means "not attached to any object". Calling a method on a null reference crashes at run time with a NullPointerException. Guard against it by testing with ==/!= and checking null first, so && short-circuits before the method runs: if (s != null && s.length() > 0).

    Tiếng Việt

    Tạo instance tạo ra một đối tượng bằng từ khóa new, điều này sẽ gọi một constructor:

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

    Biến lưu giữ một tham chiếu (địa chỉ của đối tượng), không phải bản thân đối tượng. Hai tham chiếu có thể trỏ đến cùng một đối tượng; so sánh chúng bằng == sẽ so sánh địa chỉ, không phải nội dung.

    Tham chiếu cũng có thể trỏ vào không gì cả: giá trị đặc biệt null có nghĩa là "không liên kết với bất kỳ đối tượng nào". Gọi phương thức trên tham chiếu null sẽ gây lỗi thời gian chạy với một NullPointerException. Hãy phòng tránh bằng cách kiểm tra với ==/!= và kiểm tra null trước, để phép AND logic && ngắn mạch trước khi phương thức được thực thi: if (s != null && s.length() > 0).

    Biến nguyên thủy lưu giá trị trực tiếp, tham chiếu lưu mũi tên trỏ đến đối tượng
    Biến nguyên thủy lưu giá trị trực tiếp, tham chiếu lưu mũi tên trỏ đến đối tượng
    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    constructor/kənˈstrʌktə/ constructor
    null/nʌl/ null
    instance method/ˈɪnstəns ˈmeθəd/ phương thức thực thể
    immutable/ɪˈmjuːtəbl/ không thể thay đổi
    Interface/ˈɪntəfeɪs/ Giao diện
    1.14

    Calling Instance Methods · ⁨Gọi Phương thức Instance⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.14.A: Develop code to call instance methods and determine the result of these calls.

    • 1.14.A.1 Instance methods are called on objects of the class. The dot operator is used along with the object name to call instance methods.
    • 1.14.A.2 A method call on a null reference will result in a NullPointerException.
    Tiếng Việt

    Mục tiêu Học tập 1.14.A: Viết mã để gọi các phương thức instance và xác định kết quả của các lời gọi này.

    • 1.14.A.1 Phương thức instance được gọi trên các đối tượng của lớp. Toán tử dấu chấm được sử dụng cùng với tên đối tượng để gọi các phương thức instance.
    • 1.14.A.2 Một lời gọi phương thức trên một tham chiếu null sẽ dẫn đến một NullPointerException.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An instance method 实例方法 acts on a specific object, so you call it on the object reference: object.method(args). Example: in.nextInt(), word.length().

    Tiếng Việt

    Một phương thức instance tác động lên một đối tượng cụ thể, vì vậy bạn gọi nó trên tham chiếu đối tượng: object.method(args). Ví dụ: in.nextInt(), word.length().

    1.15

    String Manipulation · ⁨Thao tác chuỗi⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 1.15.A: Develop code to create string objects and determine the result of creating and combining strings.

    • 1.15.A.1 A String object represents a sequence of characters and can be created by using a string literal or by calling the String class constructor.
    • 1.15.A.2 The String class is part of the java.lang package. Classes in the java.lang package are available by default.
    • 1.15.A.3 A String object is immutable, meaning once a String object is created, its attributes cannot be changed. Methods called on a String object do not change the content of the String object.
    • 1.15.A.4 Two String objects can be concatenated together or combined using the + or += operator, resulting in a new String object. A primitive value can be concatenated with a String object. This causes the implicit conversion of the primitive value to a String object.
    • 1.15.A.5 A String object can be concatenated with any object, which implicitly calls the object's toString method (a behavior that is guaranteed to exist by the inheritance relationship every class has with the Object class). An object's toString method returns a string value representing the object. Subclasses of Object often override the toString method with class-specific implementation. Method overriding occurs when a public method in a subclass has the same method signature as a public method in the superclass, but the behavior of the method is specific to the subclass.
      • Exclusion statement: Overriding the toString method of a class is outside the scope of the AP Computer Science A course and exam.

    Learning Objective 1.15.B: Develop code to call methods on string objects and determine the result of calling these methods.

    • 1.15.B.1 A String object has index values from 0 to one less than the length of the string. Attempting to access indices outside this range will result in a StringIndexOutOfBoundsException.
    • 1.15.B.2 The following String methods—including what they do and when they are used—are part of the Java Quick Reference:
      • int length() returns the number of characters in a String object.
      • String substring(int from, int to) returns the substring beginning at index from and ending at index to - 1.
      • String substring(int from) returns substring(from, length()).
      • int indexOf(String str) returns the index of the first occurrence of str; returns -1 if not found.
      • boolean equals(Object other) returns true if this corresponds to the same sequence of characters as other; returns false otherwise.
      • int compareTo(String other) returns a value < 0 if this is less than other; returns zero if this is equal to other; returns a value > 0 if this is greater than other. Strings are ordered based upon the alphabet.
      • Exclusion statement: Using the equals method to compare one String object with an object of a type other than String is outside the scope of the AP Computer Science A course and exam.
    • 1.15.B.3 A string identical to the single element substring at position index can be created by calling substring(index, index + 1).
    Tiếng Việt

    Mục tiêu Học tập 1.15.A: Viết mã để tạo các đối tượng chuỗi và xác định kết quả của việc tạo và kết hợp các chuỗi.

    • 1.15.A.1 Một đối tượng String đại diện cho một chuỗi các ký tự và có thể được tạo bằng cách sử dụng một hằng chuỗi (string literal) hoặc bằng cách gọi constructor của lớp String.
    • 1.15.A.2 Class String là một phần của gói java.lang. Các class trong gói java.lang được khả dụng mặc định.
    • 1.15.A.3 Một đối tượng String là không biến đổi (immutable), nghĩa là sau khi một đối tượng String được tạo ra, các thuộc tính của nó không thể thay đổi. Các phương thức được gọi trên một đối tượng String sẽ không làm thay đổi nội dung của đối tượng String.
    • 1.15.A.4 Hai đối tượng String có thể được nối lại với nhau hoặc kết hợp bằng toán tử + hoặc +=, tạo ra một đối tượng String mới. Một giá trị nguyên thủy có thể được nối với một đối tượng String. Điều này gây ra sự chuyển đổi ngầm của giá trị nguyên thủy thành một đối tượng String.
    • 1.15.A.5 Một đối tượng String có thể được nối với bất kỳ đối tượng nào, điều này ngầm gọi phương thức toString của đối tượng đó (một hành vi được đảm bảo tồn tại bởi mối quan hệ thừa kế mà mọi class đều có với class Object). Phương thức toString của một đối tượng trả về một giá trị chuỗi đại diện cho đối tượng đó. Các class con của Object thường ghi đè (override) phương thức toString bằng cách triển khai cụ thể theo class. Ghi đè phương thức xảy ra khi một phương thức công khai trong class con có cùng chữ ký phương thức với một phương thức công khai trong class cha, nhưng hành vi của phương thức lại đặc thù cho class con.
      • Câu loại trừ: Việc ghi đè phương thức toString của một class nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Mục tiêu học tập 1.15.B: Phát triển mã để gọi các phương thức trên các đối tượng chuỗi và xác định kết quả của việc gọi các phương thức này.

    • 1.15.B.1 Một đối tượng String có các chỉ số từ 0 đến nhỏ hơn độ dài của chuỗi. Việc cố gắng truy cập các chỉ số nằm ngoài phạm vi này sẽ dẫn đến một StringIndexOutOfBoundsException.
    • 1.15.B.2 Các phương thức String sau đây—bao gồm chức năng của chúng và thời điểm sử dụng—là một phần của Trang tham khảo nhanh Java:
      • int length() trả về số lượng ký tự trong một đối tượng String.
      • String substring(int from, int to) trả về chuỗi con bắt đầu từ chỉ số from và kết thúc tại chỉ số to - 1.
      • String substring(int from) trả về substring(from, length()).
      • int indexOf(String str) trả về chỉ số của lần xuất hiện đầu tiên của str; trả về -1 nếu không tìm thấy.
      • boolean equals(Object other) trả về true nếu this tương ứng với cùng một dãy ký tự như other; trả về false ngược lại.
      • int compareTo(String other) trả về một giá trị < 0 if this is less than other; returns zero if this is equal to other; returns a value > 0 nếu this lớn hơn other. Các chuỗi được sắp xếp dựa trên bảng chữ cái.
      • Câu loại trừ: Sử dụng phương thức equals để so sánh một đối tượng String với một đối tượng có kiểu khác với String nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 1.15.B.3 Một chuỗi giống hệt với chuỗi con đơn lẻ tại vị trí index có thể được tạo ra bằng cách gọi substring(index, index + 1).

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Strings are immutable

    String objects are immutable 不可变 – methods return a new string rather than changing the original. Key methods (all indices start at 0):

    Exam skill: substring(a, b) includes index a but excludes b, and String comparison must use .equals, not == – two of the most-tested String pitfalls.

    Worked example. Let String s = "COMPUTER"; (indices 0–7). Then s.length() is 8; s.substring(0, 4) is "COMP" (indices 0,1,2,3 – index 4 excluded); s.substring(4) is "UTER" (from index 4 to the end); s.indexOf("PU") is 3; and s.indexOf("X") is -1 (not found). Counting the excluded endpoint of substring is the single most common slip.

    Asking for an index outside 0 to length()-1 (a bad substring or charAt argument, e.g. s.substring(0, 20) here) crashes with a StringIndexOutOfBoundsException – the String cousin of the array-index error.

    Tiếng Việt
    Chuỗi là bất biến

    Đối tượng String là bất biến – các phương thức trả về một chuỗi mới thay vì thay đổi chuỗi gốc. Các phương thức quan trọng (tất cả chỉ số bắt đầu từ 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
    

    Kỹ năng thi: substring(a, b) bao gồm chỉ số a nhưng loại trừ b, và so sánh String phải dùng .equals, không phải == – hai trong những bẫy String thường gặp nhất.

    Ví dụ minh họa. Cho String s = "COMPUTER"; (chỉ số từ 0–7). Khi đó s.length() trả về 8; s.substring(0, 4) trả về "COMP" (chỉ số từ 0,1,2,3 – chỉ số 4 bị loại trừ); s.substring(4) trả về "UTER" (từ chỉ số 4 đến hết mảng); s.indexOf("PU") trả về 3; và s.indexOf("X") trả về -1 (không tìm thấy). Việc đếm điểm đầu cuối bị loại trừ trong substring là sai lầm phổ biến nhất.

    Yêu cầu một chỉ số nằm ngoài 0 đến length()-1 (một tham số substring hoặc charAt không hợp lệ, ví dụ: s.substring(0, 20) ở đây) sẽ gây lỗi với một StringIndexOutOfBoundsException – họ hàng của lỗi chỉ số mảng trong String.

    Chỉ số chuỗi bắt đầu từ 0
    Chỉ số chuỗi bắt đầu từ 0
    Explore · ⁨Khám phá⁩

    Explore string indices and slicing · ⁨Khám phá chỉ mục xâu và cắt xâu⁩

    Every character has an index, and the numbering starts at 0. Drag the start and end to see how substring(from, to) takes the characters from from up to — but not including — to. · ⁨Mỗi ký tự đều có một chỉ mục, và đánh số bắt đầu từ 0. Kéo điểm bắt đầu và kết thúc để xem substring(from, to) lấy các ký tự từ from lên đến — nhưng không bao gồm — to.⁩

    1.15

    Exam tips · ⁨Mẹo làm bài thi⁩

    English
    • Trace code by hand line by line, tracking each variable's value in a table — the exam rewards careful tracing over guessing.
    • Know Java's primitive types and that integer division truncates ($7/2$ gives $3$); use a cast or a double for real division.
    • Distinguish compile-time errors (syntax, types) from run-time errors – know the named ones: ArithmeticException (int ÷ 0), NullPointerException (method on a null reference), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – and logic errors (wrong output).
    • Follow operator precedence and initialise every variable before you use it.
    • On the free-response, write complete, compilable Java — return the right type and match the method header exactly.
    Tiếng Việt
    • Theo dõi mã bằng tay từng dòng, theo dõi giá trị của từng biến trong bảng — bài thi đánh giá cao sự theo dõi cẩn thận hơn là đoán mò.
    • Biết các loại nguyên thủy của Java và rằng phép chia số nguyên bị cắt ($7/2$ cho $3$); hãy dùng phép ép kiểu hoặc double cho phép chia thực.
    • Phân biệt các lỗi compile-time (cú pháp, kiểu dữ liệu) với các lỗi run-time – biết các tên gọi cụ thể: ArithmeticException (int ÷ 0), NullPointerException (phương thức trên tham chiếu null), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – và các lỗi logic (kết quả sai).
    • Tuân theo độ ưu tiên của toán tử và khởi tạo mọi biến trước khi sử dụng.
    • Trong phần tự luận, viết Java hoàn chỉnh, có thể biên dịch được – trả về đúng kiểu và khớp chính xác với header phương thức.
  • 2

    Selection and Iteration · ⁨Lựa chọn và Lặp lại⁩

    Watch lesson · ⁨Xem bài học⁩
    2.1

    Selection and Repetition in Algorithms · ⁨Chọn lọc và Lặp lại trong Thuật toán⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.1.A: Represent patterns and algorithms that involve selection and repetition found in everyday life using written language or diagrams.

    • 2.1.A.1 The building blocks of algorithms include sequencing, selection, and repetition.
    • 2.1.A.2 Algorithms can contain selection, through decision making, and repetition, via looping.
    • 2.1.A.3 Selection occurs when a choice of how the execution of an algorithm will proceed is based on a true or false decision.
    • 2.1.A.4 Repetition is when a process repeats itself until a desired outcome is reached.
    • 2.1.A.5 The order in which sequencing, selection, and repetition are used contributes to the outcome of the algorithm.
    Tiếng Việt

    Mục tiêu học tập 2.1.A: Biểu diễn các mẫu và thuật toán liên quan đến chọn lọc và lặp lại tìm thấy trong cuộc sống hàng ngày bằng ngôn ngữ viết hoặc sơ đồ.

    • 2.1.A.1 Các khối xây dựng cơ bản của thuật toán bao gồm sắp xếp tuần tự, chọn lọc và lặp lại.
    • 2.1.A.2 Thuật toán có thể chứa chọn lọc, thông qua ra quyết định, và lặp lại, thông qua vòng lặp.
    • 2.1.A.3 Chọn lọc xảy ra khi việc lựa chọn cách thuật toán sẽ tiến hành thực thi dựa trên một quyết định đúng hoặc sai.
    • 2.1.A.4 Lặp lại là khi một quy trình lặp lại cho đến khi đạt được kết quả mong muốn.
    • 2.1.A.5 Thứ tự mà sắp xếp tuần tự, chọn lọc và lặp lại được sử dụng góp phần vào kết quả của thuật toán.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Algorithms are built from three control structures 控制结构: sequence (steps in order), selection 选择 (choosing a path), and iteration 迭代 (repeating steps). This topic covers selection and iteration – the tools that let a program make decisions and loop.

    Tiếng Việt
    Sơ đồ luồng với hình thoi quyết định: chọn lọc xác định đường đi của thuật toán
    Sơ đồ luồng với hình thoi quyết định: chọn lọc xác định đường đi của thuật toán

    Thuật toán được xây dựng từ ba cấu trúc điều khiển: sequence (thứ tự từng bước), selection (chọn đường đi), và iteration (lặp lại các bước). Chủ đề này bao gồm selection và iteration – những công cụ giúp chương trình đưa ra quyết định và lặp lại.

    Ba cấu trúc điều khiển: sequence, selection, và iteration
    Ba cấu trúc điều khiển: sequence, selection, và iteration
    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    control structures/kənˈtrəʊl ˈstrʌktʃəz/ cấu trúc điều khiển
    selection/sɪˈlekʃn/ chọn lọc
    iteration/ˌɪtəˈreɪʃn/ lặp lại
    boolean expression/ˈbuːlɪən ekˈspreʃn/ biểu thức boolean
    relational operators/rɪˈleɪʃənl ˈɒpəreɪtəz/ toán tử quan hệ
    if statement/ɪf ˈsteɪtmənt/ câu lệnh if
    Logical operators/ˈlɒdʒɪkl ˈɒpəreɪtəz/ Toán tử logic
    short-circuit evaluation/ʃɔːt ˈsɜːkɪt ɪˌvæljuːˈeɪʃn/ đánh giá ngắn mạch
    De Morgan's laws/də ˈmɔːɡənz lɔːz/ định luật De Morgan
    while loop/waɪl luːp/ vòng lặp while
    infinite loop/ˈɪnfɪnət luːp/ vòng lặp vô hạn
    2.2

    Boolean Expressions · ⁨Biểu thức Boolean⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.2.A: Develop code to create Boolean expressions with relational operators and determine the result of these expressions.

    • 2.2.A.1 Values can be compared using the relational operators == and != to determine whether the values are the same. With primitive types, this compares the actual primitive values. With reference types, this compares the object references.
    • 2.2.A.2 Numeric values can be compared using the relational operators <, >, <=, and >= to determine the relationship between the values.
    • 2.2.A.3 An expression involving relational operators evaluates to a Boolean value.
    Tiếng Việt

    Mục tiêu học tập 2.2.A: Phát triển mã để tạo các biểu thức Boolean với các toán tử quan hệ và xác định kết quả của các biểu thức này.

    • 2.2.A.1 Các giá trị có thể được so sánh bằng cách sử dụng các toán tử quan hệ == và != để xác định xem các giá trị có giống nhau hay không. Với các kiểu nguyên thủy, điều này sẽ so sánh trực tiếp các giá trị nguyên thủy. Với các kiểu tham chiếu, điều này sẽ so sánh các tham chiếu đối tượng.
    • 2.2.A.2 Các giá trị số có thể được so sánh bằng cách sử dụng các toán tử quan hệ <, >, <=, và >= để xác định mối quan hệ giữa các giá trị.
    • 2.2.A.3 Một biểu thức liên quan đến các toán tử quan hệ sẽ trả về một giá trị Boolean.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Logic gates & the half-adder

    A boolean expression 布尔表达式 evaluates to true or false, using relational operators 关系运算符: == (equal), != (not equal), <, >, <=, >=. Note == compares primitive values but object references for objects, so use .equals for Strings.

    Tiếng Việt
    Cổng logic & bộ cộng một bit

    Một biểu thức boolean trả về true hoặc false, sử dụng các toán tử so sánh: == (bằng nhau), != (không bằng nhau), <, >, <=, >=. Lưu ý rằng == so sánh giá trị nguyên sinh nhưng tham chiếu đối tượng cho các đối tượng, vì vậy hãy dùng .equals cho Strings.

    Ba nhóm toán tử: số học, so sánh, và logic
    Ba nhóm toán tử: số học, so sánh, và logic
    Explore · ⁨Khám phá⁩

    Explore the AND truth table · ⁨Khám tra bảng chân lý AND⁩

    A Boolean expression evaluates to true or false. AND is true only when both operands are true; toggle the inputs to see all four cases. · ⁨Một biểu thức Boolean trả về true hoặc false. AND chỉ đúng khi cả hai toán hạng đều đúng; bật/tắt các đầu vào để xem tất cả bốn trường hợp.⁩

    2.3

    The if Statement · ⁨Câu lệnh if⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.3.A: Develop code to represent branching logical processes by using selection statements and determine the result of these processes.

    • 2.3.A.1 Selection statements change the sequential execution of statements.
    • 2.3.A.2 An if statement is a type of selection statement that affects the flow of control by executing different segments of code based on the value of a Boolean expression.
    • 2.3.A.3 A one-way selection (if statement) is used when there is a segment of code to execute under a certain condition. In this case, the body is executed only when the Boolean expression is true.
    • 2.3.A.4 A two-way selection (if-else statement) is used when there are two segments of code—one to be executed when the Boolean expression is true and another segment for when the Boolean expression is false. In this case, the body of the if is executed when the Boolean expression is true, and the body of the else is executed when the Boolean expression is false.
    Tiếng Việt

    Mục tiêu học tập 2.3.A: Phát triển mã để biểu diễn các quy trình nhánh logic bằng cách sử dụng các câu lệnh chọn và xác định kết quả của các quy trình này.

    • 2.3.A.1 Các câu lệnh chọn thay đổi thứ tự thực thi tuần tự của các câu lệnh.
    • 2.3.A.2 Một câu lệnh if là một loại câu lệnh chọn ảnh hưởng đến luồng điều khiển bằng cách thực thi các đoạn mã khác nhau dựa trên giá trị của một biểu thức Boolean.
    • 2.3.A.3 Một lựa chọn một chiều (câu lệnh if) được sử dụng khi có một đoạn mã cần thực thi dưới một điều kiện nhất định. Trong trường hợp này, thân câu lệnh chỉ được thực thi khi biểu thức Boolean là true.
    • 2.3.A.4 Một lựa chọn hai chiều (câu lệnh if-else) được sử dụng khi có hai đoạn mã—một để thực thi khi biểu thức Boolean là true và một đoạn khác cho khi biểu thức Boolean là false. Trong trường hợp này, thân của if được thực thi khi biểu thức Boolean là true, và thân của else được thực thi khi biểu thức Boolean là false.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An if statement 条件语句 runs a block only when its condition is true; an optional else gives an alternative:

    Tiếng Việt

    Một câu lệnh if chỉ thực thi khối mã khi điều kiện của nó là true; một tùy chọn else cung cấp một cách thay thế:

    if (score >= 60) {
        System.out.println("Pass");
    } else {
        System.out.println("Fail");
    }
    
    Đèn giao thông: chọn lọc xác định nhánh nào chạy, tương tự như câu lệnh if chọn đường dẫn mã
    Đèn giao thông: chọn lọc xác định nhánh nào chạy, tương tự như câu lệnh if chọn đường dẫn mã
    Explore · ⁨Khám phá⁩

    See which branch an if chooses · ⁨Xem nhánh nào if chọn⁩

    An if statement runs its body only when the condition is true, otherwise it skips to else. Slide the score across the boundaries and watch the grade change. · ⁨Câu lệnh if chỉ chạy thân code khi điều kiện đúng, ngược lại nó bỏ qua và nhảy đến else. Trượt điểm số qua các ranh giới và xem grade thay đổi.⁩

    2.4

    Nested if Statements · ⁨Câu lệnh if lồng nhau⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.4.A: Develop code to represent nested branching logical processes and determine the result of these processes.

    • 2.4.A.1 Nested if statements consist of if, if-else, or if-else-if statements within if, if-else, or if-else-if statements.
    • 2.4.A.2 The Boolean expression of the inner nested if statement is evaluated only if the Boolean expression of the outer if statement evaluates to true.
    • 2.4.A.3 A multiway selection (if-else-if) is used when there are a series of expressions with different segments of code for each condition. Multiway selection is performed such that no more than one segment of code is executed based on the first expression that evaluates to true. If no expression evaluates to true and there is a trailing else statement, then the body of the else is executed.
    Tiếng Việt

    Mục tiêu học tập 2.4.A: Phát triển mã để biểu diễn các quy trình nhánh logic lồng nhau và xác định kết quả của các quy trình này.

    • 2.4.A.1 Các câu lệnh if lồng nhau bao gồm các câu lệnh if, if-else, hoặc if-else-if nằm bên trong các câu lệnh if, if-else, hoặc if-else-if.
    • 2.4.A.2 Biểu thức Boolean của câu lệnh if lồng bên trong chỉ được đánh giá nếu biểu thức Boolean của câu lệnh if bên ngoài đánh giá ra true.
    • 2.4.A.3 Một lựa chọn nhiều chiều (if-else-if) được sử dụng khi có một chuỗi các biểu thức với các đoạn mã khác nhau cho mỗi điều kiện. Việc lựa chọn nhiều chiều được thực hiện sao cho không có quá một đoạn mã nào được thực thi dựa trên biểu thức đầu tiên đánh giá ra true. Nếu không có biểu thức nào đánh giá ra true và có một câu lệnh else ở cuối, thì thân của else sẽ được thực thi.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Placing an if inside another, or chaining with else if, tests several cases in order. Only the first matching branch runs:

    Tiếng Việt

    Đặt một if bên trong một cái khác, hoặc nối tiếp với else if, để kiểm tra nhiều trường hợp theo thứ tự. Chỉ nhánh đầu tiên khớp sẽ được thực thi:

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

    Compound Boolean Expressions · ⁨Biểu thức Boolean phức hợp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.5.A: Develop code to represent compound Boolean expressions and determine the result of these expressions.

    • 2.5.A.1 Logical operators ! (not), && (and), and || (or) are used with Boolean expressions. The expression !a evaluates to true if a is false and evaluates to false otherwise. The expression a && b evaluates to true if both a and b are true and evaluates to false otherwise. The expression a || b evaluates to true if a is true, b is true, or both, and evaluates to false otherwise. The order of precedence for evaluating logical operators is ! (not), && (and), then || (or). An expression involving logical operators evaluates to a Boolean value.
    • 2.5.A.2 Short-circuit evaluation occurs when the result of a logical operation using && or || can be determined by evaluating only the first Boolean expression. In this case, the second Boolean expression is not evaluated.
    Tiếng Việt

    Mục tiêu học tập 2.5.A: Phát triển mã để biểu diễn các biểu thức compound Boolean và xác định kết quả của các biểu thức này.

    • 2.5.A.1 Toán tử logic ! (không), && (và), và || (hoặc) được sử dụng với các biểu thức Boolean. Biểu thức !a trả về true nếu a là false và trả về false trong trường hợp ngược lại. Biểu thức a && b trả về true nếu cả a và b đều là true và trả về false trong trường hợp ngược lại. Biểu thức a || b trả về true nếu a là true, b là true, hoặc cả hai, và trả về false trong trường hợp ngược lại. Thứ tự ưu tiên để đánh giá các toán tử logic là ! (không), sau đó là && (và), rồi || (hoặc). Một biểu thức chứa các toán tử logic sẽ trả về một giá trị Boolean.
    • 2.5.A.2 Đánh giá ngắn mạch xảy ra khi kết quả của một phép toán logic sử dụng && hoặc || có thể được xác định chỉ bằng cách đánh giá biểu thức Boolean đầu tiên. Trong trường hợp này, biểu thức Boolean thứ hai không được đánh giá.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Short-circuit evaluation

    Logical operators 逻辑运算符 combine conditions: && (and – both true), || (or – at least one true), ! (not – reverse). Java uses short-circuit evaluation 短路求值: && stops if the left side is false, and || stops if the left side is true – useful to guard against errors, e.g. if (n != 0 && total / n > 5).

    Tiếng Việt
    Đánh giá ngắn mạch

    Toán tử logic kết hợp các điều kiện: && (and – cả hai đều true), || (or – ít nhất một true), ! (not – đảo ngược). Java sử dụng đánh giá ngắn mạch: && dừng lại nếu vế trái là false, và || dừng lại nếu vế trái là true – hữu ích để bảo vệ chống lại lỗi, ví dụ: if (n != 0 && total / n > 5).

    2.6

    Comparing Boolean Expressions · ⁨So sánh Biểu thức Boolean⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.6.A: Compare equivalent Boolean expressions.

    • 2.6.A.1 Two Boolean expressions are equivalent if they evaluate to the same value in all cases. Truth tables can be used to prove Boolean expressions are equivalent.
    • 2.6.A.2 De Morgan's law can be applied to Boolean expressions to create equivalent Boolean expressions. Under De Morgan's law, the Boolean expression !(a && b) is equivalent to !a || !b and the Boolean expression !(a || b) is equivalent to !a && !b.

    Learning Objective 2.6.B: Develop code to compare object references using Boolean expressions and determine the result of these expressions.

    • 2.6.B.1 Two different variables can hold references to the same object. Object references can be compared using == and !=.
    • 2.6.B.2 An object reference can be compared with null, using == or !=, to determine if the reference actually references an object.
    • 2.6.B.3 Classes often define their own equals method, which can be used to specify the criteria for equivalency for two objects of the class. The equivalency of two objects is most often determined using attributes from the two objects.
      • Exclusion statement: Overriding the equals method is outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 2.6.A: So sánh các biểu thức Boolean tương đương.

    • 2.6.A.1 Hai biểu thức Boolean được gọi là tương đương nếu chúng trả về cùng một giá trị trong mọi trường hợp. Bảng chân lý có thể được sử dụng để chứng minh các biểu thức Boolean tương đương.
    • 2.6.A.2 Định luật De Morgan có thể được áp dụng cho các biểu thức Boolean để tạo ra các biểu thức Boolean tương đương. Theo định luật De Morgan, biểu thức Boolean !(a && b) tương đương với !a || !b và biểu thức Boolean !(a || b) tương đương với !a && !b.

    Mục tiêu học tập 2.6.B: Phát triển mã để so sánh các tham chiếu đối tượng bằng cách sử dụng các biểu thức Boolean và xác định kết quả của các biểu thức này.

    • 2.6.B.1 Hai biến khác nhau có thể chứa các tham chiếu trỏ đến cùng một đối tượng. Các tham chiếu đối tượng có thể được so sánh bằng cách sử dụng == và !=.
    • 2.6.B.2 Một tham chiếu đối tượng có thể được so sánh với null, sử dụng == hoặc !=, để xác định xem tham chiếu đó thực sự có trỏ đến một đối tượng hay không.
    • 2.6.B.3 Các lớp thường định nghĩa phương pháp equals riêng của chúng, có thể được sử dụng để chỉ định các tiêu chí cho sự tương đương giữa hai đối tượng của lớp đó. Sự tương đương của hai đối tượng thường được xác định nhất bằng cách sử dụng các thuộc tính từ cả hai đối tượng.
      • Câu loại trừ: Ghi đè phương thức equals nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    De Morgan's laws 德摩根定律 rewrite negations: !(a && b) equals !a || !b, and !(a || b) equals !a && !b. Two boolean expressions are equivalent if they give the same result for every input – a truth table proves it. Simplifying conditions this way is a common exam task.

    Tiếng Việt

    Định luật De Morgan viết lại các phép phủ định: !(a && b) bằng !a || !b, và !(a || b) bằng !a && !b. Hai biểu thức boolean được coi là tương đương nếu chúng trả về cùng một kết quả với mọi đầu vào – một bảng chân lý chứng minh điều đó. Rút gọn điều kiện theo cách này là một bài tập thi phổ biến.

    2.7

    while Loops · ⁨Vòng lặp while⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.7.A: Identify when an iterative process is required to achieve a desired result.

    • 2.7.A.1 Iteration is a form of repetition. Iteration statements change the flow of control by repeating a segment of code zero or more times as long as the Boolean expression controlling the loop evaluates to true.
    • 2.7.A.2 An infinite loop occurs when the Boolean expression in an iterative statement always evaluates to true.
    • 2.7.A.3 The loop body of an iterative statement will not execute if the Boolean expression initially evaluates to false.
    • 2.7.A.4 Off by one errors occur when the iteration statement loops one time too many or one time too few.

    Learning Objective 2.7.B: Develop code to represent iterative processes using while loops and determine the result of these processes.

    • 2.7.B.1 A while loop is a type of iterative statement. In while loops, the Boolean expression is evaluated before each iteration of the loop body, including the first. When the expression evaluates to true, the loop body is executed. This continues until the Boolean expression evaluates to false, whereupon the iteration terminates.
    Tiếng Việt

    Mục tiêu học tập 2.7.A: Xác định khi nào cần sử dụng quy trình lặp để đạt được kết quả mong muốn.

    • 2.7.A.1 Lặp là một dạng lặp lại. Các câu lệnh lặp thay đổi luồng điều khiển bằng cách lặp lại một đoạn mã từ không đến nhiều lần, miễn là biểu thức Boolean kiểm soát vòng lặp đánh giá thành true.
    • 2.7.A.2 Một vòng lặp vô hạn xảy ra khi biểu thức Boolean trong câu lệnh lặp luôn đánh giá thành true.
    • 2.7.A.3 Thân của vòng lặp sẽ không thực thi nếu biểu thức Boolean ban đầu đánh giá thành false.
    • 2.7.A.4 Lỗi sai lệch một (off by one) xảy ra khi câu lệnh lặp chạy quá một lần hoặc thiếu một lần so với dự định.

    Mục tiêu học tập 2.7.B: Viết mã để biểu diễn các quy trình lặp sử dụng vòng lặp while và xác định kết quả của các quy trình này.

    • 2.7.B.1 Vòng lặp while là một loại câu lệnh lặp. Trong các vòng lặp while, biểu thức Boolean được đánh giá trước mỗi lần lặp thân của vòng lặp, bao gồm cả lần đầu tiên. Khi biểu thức đánh giá thành true, thân vòng lặp sẽ được thực thi. Quá trình này tiếp tục cho đến khi biểu thức Boolean đánh giá thành false, lúc đó quá trình lặp sẽ kết thúc.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A while loop 循环 repeats while its condition stays true, testing before each pass. You must change something inside so the loop eventually stops, or it becomes an infinite loop 无限循环:

    Tiếng Việt

    Một vòng lặp while lặp lại trong khi điều kiện của nó vẫn true, kiểm tra trước mỗi lần lặp. Bạn phải thay đổi điều gì đó bên trong để vòng lặp cuối cùng dừng lại, hoặc nó sẽ trở thành vòng lặp vô hạn:

    Ba loại vòng lặp khác nhau ở vị trí kiểm tra điều kiện
    Ba loại vòng lặp khác nhau ở vị trí kiểm tra điều kiện
    int i = 0;
    while (i < 5) {
        System.out.println(i);
        i++;
    }
    
    Explore · ⁨Khám phá⁩

    Trace a while loop · ⁨Vẽ đường truy vết vòng lặp while⁩

    A while loop repeats as long as its condition stays true, updating its variables each pass. Step through to see the sum of squares build up. · ⁨Vòng lặp while lặp lại chừng nào điều kiện của nó vẫn đúng, cập nhật các biến của nó mỗi lần lặp. Bước qua để xem tổng bình phương được xây dựng dần.⁩

    2.8

    for Loops · ⁨Vòng lặp for⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.8.A: Develop code to represent iterative processes using for loops and determine the result of these processes.

    • 2.8.A.1 A for loop is a type of iterative statement. There are three parts in a for loop header: the initialization, the Boolean expression, and the update.
    • 2.8.A.2 In a for loop, the initialization statement is only executed once before the first Boolean expression evaluation. The variable being initialized is referred to as a loop control variable. The Boolean expression is evaluated immediately after the loop control variable is initialized and then following each execution of the increment statement until it is false. In each iteration, the update is executed after the entire loop body is executed and before the Boolean expression is evaluated again.
    • 2.8.A.3 A for loop can be rewritten into an equivalent while loop (and vice versa).
    Tiếng Việt

    Mục tiêu học tập 2.8.A: Viết mã để biểu diễn các quy trình lặp sử dụng vòng lặp for và xác định kết quả của các quy trình này.

    • 2.8.A.1 Vòng lặp for là một loại câu lệnh lặp. Một dòng khởi tạo loop for có ba phần: phần khởi tạo, biểu thức Boolean và phần cập nhật.
    • 2.8.A.2 Trong vòng lặp for, câu lệnh khởi tạo chỉ được thực thi một lần trước khi đánh giá biểu thức Boolean lần đầu. Biến đang được khởi tạo được gọi là biến điều khiển vòng lặp. Biểu thức Boolean được đánh giá ngay sau khi biến điều khiển vòng lặp được khởi tạo, và sau đó tiếp tục được đánh giá sau mỗi lần thực thi câu lệnh tăng/giảm cho đến khi nó trở thành false. Ở mỗi lần lặp, phần cập nhật được thực thi sau khi toàn bộ thân vòng lặp đã hoàn tất và trước khi biểu thức Boolean được đánh giá lại.
    • 2.8.A.3 Một vòng lặp for có thể được viết lại thành một vòng lặp while tương đương (và ngược lại).

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A for loop packs initialization, condition, and update into one line – best when you know the count:

    A for and an equivalent while do the same work; be able to convert between them.

    Tiếng Việt

    Một vòng lặp for gộp việc khởi tạo, điều kiện và cập nhật vào một dòng – tốt nhất khi bạn biết trước số lượng:

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

    Một for và một while tương đương làm cùng một việc; hãy có khả năng chuyển đổi giữa chúng.

    Dây chuyền sản xuất: vòng lặp lặp lại quy trình cho từng mục, giống như for và while
    Dây chuyền lắp ráp: vòng lặp lặp lại quy trình cho mỗi mặt hàng, giống như for và while
    Explore · ⁨Khám phá⁩

    Trace a for loop · ⁨Vẽ đường truy vết vòng lặp for⁩

    A for loop runs a fixed number of times, its counter stepping through a range. Watch the counter and running total advance one pass at a time. · ⁨Vòng lặp for chạy một số lần cố định, bộ đếm của nó bước qua một phạm vi. Quan sát bộ đếm và tổng đang tăng dần từng lần lặp một.⁩

    2.9

    Building Complete Selection and Iteration Algorithms · ⁨Xây dựng Thuật toán Chọn lọc và Lặp lại Hoàn chỉnh⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.9.A: Develop code for standard and original algorithms (without data structures) and determine the result of these algorithms.

    • 2.9.A.1 There are standard algorithms to:
      • identify if an integer is or is not evenly divisible by another integer
      • identify the individual digits in an integer
      • determine the frequency with which a specific criterion is met
      • determine a minimum or maximum value
      • compute a sum or average
    Tiếng Việt

    Mục tiêu học tập 2.9.A: Viết mã cho các thuật toán tiêu chuẩn và tự thiết kế (không sử dụng cấu trúc dữ liệu) và xác định kết quả của các thuật toán này.

    • 2.9.A.1 Có các thuật toán tiêu chuẩn để:
      • xác định xem một số nguyên có chia hết hay không cho một số nguyên khác
      • xác định từng chữ số riêng lẻ của một số nguyên
      • xác định tần suất mà một tiêu chí cụ thể được thỏa mãn
      • xác định giá trị tối thiểu hoặc tối đa
      • tính tổng hoặc trung bình cộng

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Combine loops and conditions to solve real problems – count, sum, find a maximum, or test a property:

    Two integer patterns the exam tests directly use % and /. To read the digits of an integer one at a time, repeatedly take n % 10 (the last digit) and then n = n / 10 (drop it). To test divisibility, n % d == 0 means n is evenly divisible by d. Combine them with a counter to find the frequency with which some criterion is met.

    Standard patterns like a running total, a counter, or a flag 标志 (a boolean that records whether something happened) recur throughout the course.

    Tiếng Việt

    Kết hợp vòng lặp và điều kiện để giải quyết các vấn đề thực tế – đếm, tổng, tìm giá trị lớn nhất, hoặc kiểm tra một thuộc tính:

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

    Hai mẫu số nguyên mà đề thi kiểm tra trực tiếp sử dụng % và /. Để đọc các chữ số của một số nguyên từng cái một, liên tục lấy n % 10 (chữ số cuối cùng) và sau đó n = n / 10 (loại bỏ nó). Để kiểm tra chia hết, n % d == 0 có nghĩa là n chia hết cho d. Kết hợp chúng với một bộ đếm để tìm tần suất mà một tiêu chí nào đó được đáp ứng.

    Các mẫu chuẩn như tổng tích lũy, bộ đếm, hoặc flag (một boolean ghi nhận liệu sự kiện nào đó đã xảy ra hay không) xuất hiện xuyên suốt toàn bộ khóa học.

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    flag/flæɡ/ cờ
    nested loop/ˈnestɪd luːp/ vòng lặp lồng nhau
    Run-time analysis/rʌn taɪm əˈnæləsɪs/ Phân tích thời gian chạy
    2.10

    String Algorithms · ⁨Thuật toán Chuỗi⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.10.A: Develop code for standard and original algorithms that involve strings and determine the result of these algorithms.

    • 2.10.A.1 There are standard string algorithms to:
      • find if one or more substrings have a particular property
      • determine the number of substrings that meet specific criteria
      • create a new string with the characters reversed
    Tiếng Việt

    Mục tiêu học tập 2.10.A: Phát triển mã cho các thuật toán chuẩn và thuật toán sáng tạo liên quan đến xâu chuỗi và xác định kết quả của các thuật toán này.

    • 2.10.A.1 Có các thuật toán xâu chuỗi chuẩn để:
      • tìm xem một hoặc nhiều xâu con có thuộc tính đặc biệt hay không
      • xác định số lượng xâu con đáp ứng các tiêu chí cụ thể
      • tạo ra một xâu mới với các ký tự bị đảo ngược

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Loop through a string by index to process each character:

    Typical tasks: count occurrences, build a reversed or filtered copy, or test whether one string contains another.

    Tiếng Việt

    Lặp qua chuỗi theo chỉ số để xử lý từng ký tự:

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

    Các nhiệm vụ điển hình: đếm số lần xuất hiện, xây dựng bản sao đảo ngược hoặc được lọc, hoặc kiểm tra xem một chuỗi có chứa chuỗi khác hay không.

    2.11

    Nested Iteration · ⁨Lặp lại lồng nhau⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.11.A: Develop code to represent nested iterative processes and determine the result of these processes.

    • 2.11.A.1 Nested iteration statements are iteration statements that appear in the body of another iteration statement. When a loop is nested inside another loop, the inner loop must complete all its iterations before the outer loop can continue to its next iteration.
    Tiếng Việt

    Mục tiêu học tập 2.11.A: Phát triển mã để biểu diễn các quy trình lặp lồng nhau và xác định kết quả của các quy trình này.

    • 2.11.A.1 Câu lệnh lặp lồng nhau là các câu lệnh lặp xuất hiện trong thân của một câu lệnh lặp khác. Khi một vòng lặp được lồng bên trong một vòng lặp khác, vòng lặp bên trong phải hoàn thành tất cả các lần lặp trước khi vòng lặp bên ngoài có thể tiếp tục với lần lặp tiếp theo.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A nested loop 嵌套循环 puts one loop inside another; the inner loop completes fully for each pass of the outer. If the outer runs $n$ times and the inner $m$ times, the body runs $n\times m$ times – the basis for processing grids and comparing all pairs.

    Tiếng Việt

    Một vòng lặp lồng nhau đặt một vòng lặp bên trong một vòng lặp khác; vòng lặp trong hoàn thành đầy đủ cho mỗi lần lặp của vòng lặp ngoài. Nếu vòng lặp ngoài chạy $n$ lần và vòng lặp trong $m$ lần, thân code sẽ chạy $n\times m$ lần – đây là cơ sở để xử lý lưới và so sánh tất cả các cặp.

    2.12

    Informal Run-Time Analysis · ⁨Phân tích Thời gian Thực không Chính thức⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 2.12.A: Calculate statement execution counts and informal run-time comparison of iterative statements.

    • 2.12.A.1 A statement execution count indicates the number of times a statement is executed by the program. Statement execution counts are often calculated informally through tracing and analysis of the iterative statements.
    Tiếng Việt

    Mục tiêu học tập 2.12.A: Tính số lần thực thi câu lệnh và so sánh thời gian chạy không chính thức của các câu lệnh lặp.

    • 2.12.A.1 Số lần thực thi câu lệnh chỉ số lần mà một câu lệnh được thực thi bởi chương trình. Số lần thực thi câu lệnh thường được tính toán không chính thức thông qua việc theo dõi và phân tích các câu lệnh lặp.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Big-O growth rates

    Run-time analysis 运行时间分析 counts how many basic steps an algorithm takes as the input size $n$ grows. Count the executions of the innermost statement: a single loop over $n$ items is linear ($n$ steps); two nested loops over $n$ are quadratic ($n^2$). This informal counting lets you compare two algorithms' efficiency.

    Exam skill: for a nested loop, be able to state how many times the inner statement runs in terms of the loop bounds – a frequent multiple-choice question.

    Worked example. How many stars does this print?

    The inner loop runs i times for each outer i: 0 + 1 + 2 + 3 = 6 stars. When the inner bound is the outer variable, the total is the triangular sum $0+1+\dots+(n-1)=\dfrac{n(n-1)}{2}$ – here $\dfrac{4\times3}{2}=6$ – not the full $n^2=16$ of a rectangular nested loop.

    Tiếng Việt
    Tốc độ tăng trưởng Big-O

    Phân tích thời gian thực đếm số bước cơ bản mà một thuật toán thực hiện khi kích thước đầu vào $n$ tăng lên. Đếm số lần thực thi câu lệnh nằm sâu nhất: một vòng lặp đơn trên $n$ mục là tuyến tính ($n$ bước); hai vòng lặp lồng nhau trên $n$ là bậc hai ($n^2$). Việc đếm không chính thức này cho phép bạn so sánh hiệu suất của hai thuật toán.

    Thời gian chạy tăng trưởng như thế nào theo số lượng phần tử n
    Thời gian chạy tăng trưởng như thế nào theo số lượng phần tử n

    Kỹ năng làm bài thi: đối với vòng lặp lồng nhau, hãy có khả năng nêu rõ số lần câu lệnh bên trong chạy dựa trên giới hạn của vòng lặp – đây là dạng câu hỏi trắc nghiệm thường gặp.

    Ví dụ giải chi tiết. Số sao được in ra là bao nhiêu?

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

    Vòng lặp trong chạy i lần cho mỗi vòng i ngoài: 0 + 1 + 2 + 3 = 6 ngôi sao. Khi cận trong là biến ngoài, tổng là tổng tam giác $0+1+\dots+(n-1)=\dfrac{n(n-1)}{2}$ – ở đây $\dfrac{4\times3}{2}=6$ – chứ không phải tổng đầy đủ $n^2=16$ của một vòng lặp lồng nhau hình chữ nhật.

    Explore · ⁨Khám phá⁩

    Compare how algorithms scale · ⁨So sánh cách thuật toán mở rộng⁩

    Run-time describes how the number of steps grows with the input size $n$. Increase $n$ and watch a linear $O(n)$ pull far ahead of a quadratic $O(n^2)$. · ⁨Thời gian chạy mô tả sự gia tăng số bước theo kích thước đầu vào $n$. Tăng $n$ và quan sát một hàm tuyến tính $O(n)$ vượt xa một hàm bậc hai $O(n^2)$.⁩

    2.12

    Exam tips · ⁨Mẹo làm bài thi⁩

    English
    • Get boundary conditions right: use < vs <= deliberately, and watch the first and last iteration of every loop (off-by-one is the classic bug).
    • Build compound conditions with &&, ||, ! and remember short-circuit evaluation (put the null check first).
    • Trace nested loops by counting how many times the inner body runs in total.
    • Choose the right structure — if/else if for ranges, a loop for repetition — and avoid an infinite loop by updating the loop variable.
    • Apply De Morgan's laws when you simplify or negate a boolean condition.
    Tiếng Việt
    • Đảm bảo điều kiện biên chính xác: sử dụng < so với <= một cách có chủ đích, và theo dõi lần lặp đầu tiên và cuối cùng của mọi vòng lặp (lỗi lệch một đơn vị là lỗi kinh điển).
    • Xây dựng điều kiện phức hợp với &&, ||, ! và nhớ đánh giá ngắn mạch (đặt kiểm tra null lên trước).
    • Theo dõi các vòng lặp lồng nhau bằng cách đếm xem thân trong đã chạy bao nhiêu lần tổng cộng.
    • Chọn cấu trúc phù hợp — if/else if cho phạm vi, vòng lặp cho sự lặp lại — và tránh vòng lặp vô hạn bằng cách cập nhật biến vòng lặp.
    • Áp dụng luật De Morgan khi rút gọn hoặc phủ định một điều kiện boolean.
  • 3

    Class Creation · ⁨Tạo lớp⁩

    Watch lesson · ⁨Xem bài học⁩
    3.1

    Abstraction and Program Design · ⁨Trừu tượng hóa và Thiết kế Chương trình⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.1.A: Represent the design of a program by using natural language or creating diagrams that indicate the classes in the program and the data and procedural abstractions found in each class by including all attributes and behaviors.

    • 3.1.A.1 Abstraction is the process of reducing complexity by focusing on the main idea. By hiding details irrelevant to the question at hand and bringing together related and useful details, abstraction reduces complexity and allows one to focus on the idea.
    • 3.1.A.2 Data abstraction provides a separation between the abstract properties of a data type and the concrete details of its representation. Data abstraction manages complexity by giving data a name without referencing the specific details of the representation. Data can take the form of a single variable or a collection of data, such as in a class or a set of data.
    • 3.1.A.3 An attribute is a type of data abstraction that is defined in a class outside any method or constructor. An instance variable is an attribute whose value is unique to each instance of the class. A class variable is an attribute shared by all instances of the class.
    • 3.1.A.4 Procedural abstraction provides a name for a process and allows a method to be used only knowing what it does, not how it does it. Through method decomposition, a programmer breaks down larger behaviors of the class into smaller behaviors by creating methods to represent each individual smaller behavior. A procedural abstraction may extract shared features to generalize functionality instead of duplicating code. This allows for code reuse, which helps manage complexity.
    • 3.1.A.5 Using parameters allows procedures to be generalized, enabling the procedures to be reused with a range of input values or arguments.
    • 3.1.A.6 Using procedural abstraction in a program allows programmers to change the internals of a method (to make it faster, more efficient, use less storage, etc.) without needing to notify method users of the change as long as the method signature and what the method does is preserved.
    • 3.1.A.7 Prior to implementing a class, it is helpful to take time to design each class including its attributes and behaviors. This design can be represented using natural language or diagrams.
    Tiếng Việt

    Mục tiêu học tập 3.1.A: Biểu diễn thiết kế của một chương trình bằng ngôn ngữ tự nhiên hoặc tạo sơ đồ chỉ ra các lớp trong chương trình cũng như các trừu tượng về dữ liệu và thủ tục tìm thấy trong mỗi lớp bằng cách bao gồm tất cả các thuộc tính và hành vi.

    • 3.1.A.1 Trừu tượng hóa là quá trình giảm độ phức tạp bằng cách tập trung vào ý tưởng chính. Bằng cách ẩn đi các chi tiết không liên quan đến vấn đề đang xét và gom nhóm các chi tiết liên quan, hữu ích, trừu tượng hóa giúp giảm độ phức tạp và cho phép người ta tập trung vào ý tưởng.
    • 3.1.A.2 Trừu tượng hóa dữ liệu cung cấp sự phân tách giữa các thuộc tính trừu tượng của một kiểu dữ liệu và các chi tiết cụ thể của việc biểu diễn nó. Trừu tượng hóa dữ liệu quản lý độ phức tạp bằng cách gán tên cho dữ liệu mà không cần đề cập đến các chi tiết cụ thể của việc biểu diễn. Dữ liệu có thể dưới dạng một biến đơn lẻ hoặc một tập hợp dữ liệu, chẳng hạn như trong một lớp hoặc một tập dữ liệu.
    • 3.1.A.3 Một thuộc tính là một loại trừu tượng hóa dữ liệu được định nghĩa trong một lớp bên ngoài bất kỳ phương thức hoặc constructor nào. Một biến thực thể (instance variable) là một thuộc tính có giá trị duy nhất đối với mỗi thực thể của lớp. Một biến lớp (class variable) là một thuộc tính được chia sẻ bởi tất cả các thực thể của lớp.
    • 3.1.A.4 Trừu tượng hóa thủ tục cung cấp một tên cho một quy trình và cho phép một phương thức được sử dụng chỉ khi biết nó làm gì, chứ không cần biết nó làm như thế nào. Thông qua phân rã phương thức, một lập trình viên chia nhỏ các hành vi lớn hơn của lớp thành các hành vi nhỏ hơn bằng cách tạo ra các phương thức để đại diện cho mỗi hành vi nhỏ riêng lẻ. Một trừu tượng hóa thủ tục có thể trích xuất các đặc điểm chung để mở rộng chức năng thay vì sao chép mã. Điều này cho phép tái sử dụng mã, giúp quản lý độ phức tạp.
    • 3.1.A.5 Sử dụng tham số cho phép các thủ tục được mở rộng, giúp các thủ tục có thể được tái sử dụng với một loạt các giá trị đầu vào hoặc đối số.
    • 3.1.A.6 Sử dụng trừu tượng hóa thủ tục trong một chương trình cho phép các lập trình viên thay đổi nội bộ của một phương thức (để làm cho nó nhanh hơn, hiệu quả hơn, sử dụng ít bộ nhớ hơn, v.v.) mà không cần thông báo cho người sử dụng phương thức về sự thay đổi, miễn là ký hiệu phương thức và những gì phương thức làm vẫn được giữ nguyên.
    • 3.1.A.7 Trước khi triển khai một lớp, việc dành thời gian để thiết kế từng lớp bao gồm các thuộc tính và hành vi của nó là rất hữu ích. Thiết kế này có thể được biểu diễn bằng ngôn ngữ tự nhiên hoặc sơ đồ.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Abstraction 抽象 means hiding detail behind a simple interface – you use a String without knowing how it stores characters. Good design breaks a problem into classes, each responsible for one idea. This topic is about writing your own classes.

    Tiếng Việt
    Một ghép hình đang được hoàn thiện: các lớp và phương thức là những mảnh mô-đun của thiết kế chương trình lớn hơn
    Một ghép hình đang được hoàn thiện: các lớp và phương thức là những mảnh mô-đun của thiết kế chương trình lớn hơn

    Trừ抽象 hóa có nghĩa là ẩn đi chi tiết phía sau một giao diện đơn giản – bạn sử dụng một String mà không cần biết nó lưu trữ ký tự như thế nào. Thiết kế tốt chia nhỏ vấn đề thành các lớp, mỗi lớp chịu trách nhiệm cho một ý tưởng. Chủ đề này tập trung vào việc viết các lớp của riêng bạn.

    Phân rã một chương trình thành các mô-đun và mô-đun con
    Phân rã một chương trình thành các module và sub-modules
    3.2

    The Impact of Program Design · ⁨Tác động của Thiết kế Chương trình⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.2.A: Explain the social and ethical implications of computing systems.

    • 3.2.A.1 System reliability refers to the program being able to perform its tasks as expected under stated conditions without failure. Programmers should make an effort to maximize system reliability by testing the program with a variety of conditions.
    • 3.2.A.2 The creation of programs has impacts on society, the economy, and culture. These impacts can be both beneficial and harmful. Programs meant to fill a need or solve a problem can have unintended harmful effects beyond their intended use.
    • 3.2.A.3 Legal issues and intellectual property concerns arise when creating programs. Programmers often reuse code written by others and published as open source and free to use. Incorporation of code that is not published as open source requires the programmer to obtain permission and often purchase the code before integrating it into their program.
    Tiếng Việt

    Mục tiêu học tập 3.2.A: Giải thích các hệ quả xã hội và đạo đức của các hệ thống máy tính.

    • 3.2.A.1 Độ tin cậy của hệ thống đề cập đến khả năng của chương trình thực hiện các tác vụ như mong đợi trong các điều kiện đã nêu mà không gặp sự cố. Các lập trình viên nên nỗ lực tối đa hóa độ tin cậy của hệ thống bằng cách thử nghiệm chương trình với nhiều điều kiện khác nhau.
    • 3.2.A.2 Việc tạo ra các chương trình có tác động đến xã hội, nền kinh tế và văn hóa. Những tác động này có thể vừa mang tính tích cực vừa tiêu cực. Các chương trình nhằm đáp ứng nhu cầu hoặc giải quyết vấn đề có thể gây ra những hậu quả không mong muốn beyond mục đích ban đầu của chúng.
    • 3.2.A.3 Các vấn đề pháp lý và quan tâm về sở hữu trí tuệ phát sinh khi tạo ra các chương trình. Các lập trình viên thường tái sử dụng mã nguồn do người khác viết và công bố dưới dạng mã nguồn mở và miễn phí sử dụng. Việc tích hợp mã nguồn không được công bố là mã nguồn mở yêu cầu lập trình viên phải xin phép và thường mua mã nguồn trước khi đưa nó vào chương trình của mình.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Design choices affect whether code is correct, readable, and reusable. Encapsulation 封装 – keeping data private and exposing it only through methods – protects an object's state from misuse and lets you change the inside without breaking users of the class. Thoughtful naming, single-purpose methods, and testing reduce bugs.

    Design also carries responsibility beyond the code. System reliability 系统可靠性 - a program performing its tasks as expected, without failure - is something programmers should maximise through careful design and testing. Programs have real impacts on society, the economy, and culture that can be both beneficial and harmful. And creating programs raises legal and intellectual-property 知识产权 concerns: programmers often reuse code published as open source 开源 and free to use, but must respect its licence and give credit rather than copy others' work as their own.

    Tiếng Việt

    Các lựa chọn thiết kế ảnh hưởng đến tính đúng đắn, khả năng đọc hiểu và tính tái sử dụng của mã nguồn. Đóng gói (Encapsulation) – giữ dữ liệu riêng tư và chỉ expose chúng thông qua các phương thức – bảo vệ trạng thái của đối tượng khỏi bị lạm dụng và cho phép bạn thay đổi bên trong mà không làm hỏng người dùng lớp. Đặt tên cẩn thận, các phương thức đơn mục đích và kiểm thử giúp giảm thiểu lỗi.

    Thiết kế cũng mang lại trách nhiệm vượt ra ngoài mã nguồn. Độ tin cậy của hệ thống - một chương trình thực hiện các tác vụ như mong đợi, không có sự cố - là thứ các lập trình viên nên tối đa hóa thông qua thiết kế và kiểm thử cẩn thận. Các chương trình có tác động thực tế đến xã hội, kinh tế và văn hóa mà có thể vừa có lợi vừa gây hại. Và việc tạo ra các chương trình đặt ra những lo ngại về pháp lý và sở hữu trí tuệ: các lập trình viên thường tái sử dụng mã nguồn được công bố dưới dạng nguồn mở và miễn phí sử dụng, nhưng phải tôn trọng giấy phép và ghi nhận nguồn gốc thay vì sao chép công việc của người khác thành của mình.

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    Abstraction/əbˈstrækʃn/ Trừ抽象 hóa
    Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ Đóng gói
    System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ Độ tin cậy của hệ thống
    legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ luật pháp và sở hữu trí tuệ
    open source/ˈəʊpən sɔːs/ mã nguồn mở
    3.3

    The Anatomy of a Class · ⁨Giải phẫu của một Lớp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.3.A: Develop code to designate access and visibility constraints to classes, data, constructors, and methods.

    • 3.3.A.1 Data encapsulation is a technique in which the implementation details of a class are kept hidden from external classes. The keywords public and private affect the access of classes, data, constructors, and methods. The keyword private restricts access to the declaring class, while the keyword public allows access from classes outside the declaring class.
    • 3.3.A.2 In this course, classes are always designated public and are declared with the keyword class.
    • 3.3.A.3 In this course, constructors are always designated public.
    • 3.3.A.4 Instance variables belong to the object, and each object has its own copy of the variable.
    • 3.3.A.5 Access to attributes should be kept internal to the class in order to accomplish encapsulation. Therefore, it is good programming practice to designate the instance variables for these attributes as private unless the class specification states otherwise.
    • 3.3.A.6 Access to behaviors can be internal or external to the class. Methods designated as public can be accessed internally or externally to a class, whereas methods designated as private can only be accessed internally to the class.
    Tiếng Việt

    Mục tiêu học tập 3.3.A: Phát triển mã để chỉ định các ràng buộc truy cập và khả năng hiển thị cho các lớp, dữ liệu, khởi tạo (constructor) và phương thức.

    • 3.3.A.1 Đóng gói dữ liệu là kỹ thuật trong đó các chi tiết triển khai của một lớp được giữ bí mật khỏi các lớp bên ngoài. Các từ khóa public và private ảnh hưởng đến quyền truy cập của các lớp, dữ liệu, khởi tạo và phương thức. Từ khóa private giới hạn quyền truy cập vào lớp khai báo, trong khi từ khóa public cho phép truy cập từ các lớp bên ngoài lớp khai báo.
    • 3.3.A.2 Trong khóa học này, các lớp luôn được chỉ định public và được khai báo với từ khóa class.
    • 3.3.A.3 Trong khóa học này, các khởi tạo (constructors) luôn được chỉ định public.
    • 3.3.A.4 Biến instance thuộc về đối tượng, và mỗi đối tượng đều có bản sao riêng của biến đó.
    • 3.3.A.5 Quyền truy cập vào các thuộc tính nên được giữ bên trong lớp để đạt được sự đóng gói. Do đó, thực hành lập trình tốt là chỉ định các biến instance cho các thuộc tính này là private trừ khi tài liệu mô tả lớp quy định khác.
    • 3.3.A.6 Quyền truy cập vào các hành vi có thể là nội bộ hoặc ngoại bộ đối với lớp. Các phương thức được chỉ định là public có thể được truy cập cả nội bộ lẫn ngoại bộ so với một lớp, trong khi các phương thức được chỉ định là private chỉ có thể được truy cập nội bộ so với lớp.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A class has three parts: instance variables 实例变量 (fields – the object's data), constructors (build objects), and methods (behavior). Fields are usually private; methods are usually public:

    Tiếng Việt

    Một lớp có ba phần: biến实例 (instance variables) (trường – dữ liệu của đối tượng), hàm khởi tạo (constructors) (tạo đối tượng), và phương thức (methods) (hành vi). Trường thường là private; phương thức thường là public:

    Sơ đồ lớp: thuộc tính riêng tư và phương thức công khai
    Sơ đồ lớp: thuộc tính riêng tư và phương thức công khai
    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
    }
    
    Một bản thiết kế kỹ thuật: một lớp là mẫu để xác định cách các đối tượng của loại đó được xây dựng
    Một bản thiết kế kỹ thuật: một lớp là mẫu để xác định cách các đối tượng của loại đó được xây dựng
    Explore · ⁨Khám phá⁩

    See an object's fields as boxes · ⁨Xem các trường của đối tượng như những chiếc hộp⁩

    A class groups related data (its fields) and methods. Each object gets its own set of field boxes; assigning to one changes that object only. · ⁨Một lớp nhóm dữ liệu liên quan (các trường) và phương thức. Mỗi đối tượng có riêng một tập hợp các hộp trường; gán cho một cái sẽ chỉ thay đổi đối tượng đó.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    instance variables/ˈɪnstəns ˈveərɪəblz/ biến thuộc tính
    constructor/kənˈstrʌktə/ constructor
    overloading/ˌəʊvəˈləʊdɪŋ/ tải lại
    accessor (getter)/əkˈsesə/ accessor (getter)
    3.4

    Constructors · ⁨Hàm Khởi Tạo⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.4.A: Develop code to declare instance variables for the attributes to be initialized in the body of the constructors of a class.

    • 3.4.A.1 An object's state refers to its attributes and their values at a given time and is defined by instance variables belonging to the object. This defines a has-a relationship between the object and its instance variables.
    • 3.4.A.2 A constructor is used to set the initial state of an object, which should include initial values for all instance variables. When a constructor is called, memory is allocated for the object and the associated object reference is returned. Constructor parameters, if specified, provide data to initialize instance variables.
    • 3.4.A.3 When a mutable object is a constructor parameter, the instance variable should be initialized with a copy of the referenced object. In this way, the instance variable does not hold a reference to the original object, and methods are prevented from modifying the state of the original object.
    • 3.4.A.4 When no constructor is written, Java provides a no-parameter constructor, and the instance variables are set to default values according to the data type of the attribute. This constructor is called the default constructor.
    • 3.4.A.5 The default value for an attribute of type int is 0. The default value of an attribute of type double is 0.0. The default value of an attribute of type boolean is false. The default value of a reference type is null.
    Tiếng Việt

    Mục tiêu học tập 3.4.A: Phát triển mã để khai báo các biến instance cho các thuộc tính sẽ được khởi tạo trong thân của các khởi tạo (constructors) của một lớp.

    • 3.4.A.1 Trạng thái của một đối tượng đề cập đến các thuộc tính và giá trị của chúng tại một thời điểm nhất định và được xác định bởi các biến instance thuộc về đối tượng. Điều này tạo ra mối quan hệ có-là giữa đối tượng và các biến instance của nó.
    • 3.4.A.2 Một khởi tạo (constructor) được sử dụng để thiết lập trạng thái ban đầu của một đối tượng, điều này nên bao gồm các giá trị ban đầu cho tất cả các biến instance. Khi một khởi tạo (constructor) được gọi, bộ nhớ được phân bổ cho đối tượng và tham chiếu đến đối tượng tương ứng được trả về. Các tham số khởi tạo (constructor), nếu được chỉ định, cung cấp dữ liệu để khởi tạo các biến instance.
    • 3.4.A.3 Khi một đối tượng có thể thay đổi (mutable) là một tham số khởi tạo (constructor), biến instance nên được khởi tạo bằng một bản sao của đối tượng được tham chiếu. Bằng cách này, biến instance không giữ tham chiếu đến đối tượng gốc, và các phương thức bị ngăn chặn việc thay đổi trạng thái của đối tượng gốc.
    • 3.4.A.4 Khi không có khởi tạo (constructor) nào được viết, Java cung cấp một khởi tạo (constructor) không tham số, và các biến instance được đặt thành các giá trị mặc định theo kiểu dữ liệu của thuộc tính. Khởi tạo (constructor) này được gọi là khởi tạo (constructor) mặc định.
    • 3.4.A.5 Giá trị mặc định cho một thuộc tính có kiểu int là 0. Giá trị mặc định của một thuộc tính có kiểu double là 0.0. Giá trị mặc định của một thuộc tính có kiểu boolean là false. Giá trị mặc định của một kiểu tham chiếu là null.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A constructor 构造函数 has the same name as the class and no return type. It runs when you write new, and its job is to initialize the fields. A class can have several constructors with different parameter lists (overloading 重载); a no-argument constructor sets defaults.

    Tiếng Việt

    Một hàm khởi tạo có cùng tên với lớp và không có kiểu trả về. Nó chạy khi bạn viết new, và nhiệm vụ của nó là khởi tạo các trường. Một lớp có thể có nhiều hàm khởi tạo với danh sách tham số khác nhau (quá tải overload); một hàm khởi tạo không tham số sẽ đặt các giá trị mặc định.

    3.5

    Methods: How to Write Them · ⁨Phương thức: Cách Viết⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.5.A: Develop code to define behaviors of an object through methods written in a class using primitive values and determine the result of calling these methods.

    • 3.5.A.1 A void method does not return a value. Its header contains the keyword void before the method name.
    • 3.5.A.2 A non-void method returns a single value. Its header includes the return type in place of the keyword void.
    • 3.5.A.3 In non-void methods, a return expression compatible with the return type is evaluated, and the value is returned. This is referred to as return by value.
    • 3.5.A.4 The return keyword is used to return the flow of control to the point where the method or constructor was called. Any code that is sequentially after a return statement will never be executed. Executing a return statement inside a selection or iteration statement will halt the statement and exit the method or constructor.
    • 3.5.A.5 An accessor method allows objects of other classes to obtain a copy of the value of instance variables or class variables. An accessor method is a non-void method.
    • 3.5.A.6 A mutator (modifier) method is a method that changes the values of the instance variables or class variables. A mutator method is often a void method.
    • 3.5.A.7 Methods with parameters receive values through those parameters and use those values in accomplishing the method's task.
    • 3.5.A.8 When an argument is a primitive value, the parameter is initialized with a copy of that value. Changes to the parameter have no effect on the corresponding argument.
    Tiếng Việt

    Mục tiêu học tập 3.5.A: Phát triển mã để xác định hành vi của một đối tượng thông qua các phương thức được viết trong một lớp sử dụng các giá trị nguyên thủy và xác định kết quả của việc gọi các phương thức này.

    • 3.5.A.1 Một phương thức void không trả về giá trị. Header của nó chứa từ khóa void trước tên phương thức.
    • 3.5.A.2 Một phương thức không void trả về một giá trị duy nhất. Header của nó bao gồm kiểu trả về ở vị trí của từ khóa void.
    • 3.5.A.3 Trong các phương thức không void, một biểu thức trả về tương thích với kiểu trả về được đánh giá, và giá trị đó được trả về. Điều này được gọi là trả về theo giá trị.
    • 3.5.A.4 Từ khóa return được sử dụng để trả dòng điều khiển về điểm nơi phương thức hoặc khởi tạo (constructor) được gọi. Bất kỳ mã nào nằm tuần tự sau câu lệnh return sẽ không bao giờ được thực thi. Thực thi một câu lệnh return bên trong câu lệnh lựa chọn hoặc lặp sẽ dừng câu lệnh đó và thoát khỏi phương thức hoặc khởi tạo (constructor).
    • 3.5.A.5 Một phương thức truy cập (accessor method) cho phép các đối tượng của các lớp khác lấy một bản sao của giá trị các biến instance hoặc biến lớp. Một phương thức truy cập là một phương thức không void.
    • 3.5.A.6 Một phương thức thay đổi (mutator method) là một phương thức thay đổi giá trị của các biến instance hoặc biến lớp. Một phương thức thay đổi thường là một phương thức void.
    • 3.5.A.7 Các phương thức có tham số nhận giá trị thông qua các tham số đó và sử dụng các giá trị đó để hoàn thành nhiệm vụ của phương thức.
    • 3.5.A.8 Khi một đối số (argument) là một giá trị nguyên thủy, tham số được khởi tạo bằng một bản sao của giá trị đó. Sự thay đổi đối với tham số không có hiệu lực lên đối số tương ứng.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A method has a signature, a return type, and a body. An accessor (getter) 访问器 returns information without changing the object; a mutator (setter) 修改器 changes a field. A method returning a value must have a return of the right type on every path; a void method returns nothing.

    Tiếng Việt

    Một phương thức có signature, kiểu trả về và thân. Một accessor (getter) trả về thông tin mà không thay đổi đối tượng; một mutator (setter) thay đổi một trường. Một phương thức trả về giá trị phải có một return đúng kiểu trên mọi đường dẫn; một void method trả về không gì cả.

    public void setScore(int s) { score = s; }   // mutator
    public String toString() { return name + ": " + score; }
    
    Explore · ⁨Khám phá⁩

    Follow a method call and its return · ⁨Theo dõi gọi phương thức và giá trị trả về⁩

    Calling a method pushes a frame with its parameters; when it hits return, the frame pops and the value goes back to the caller. · ⁨Gọi một phương thức đẩy một khung với các tham số của nó; khi nó gặp return, khung bị loại bỏ và giá trị quay lại người gọi.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    mutator (setter)/mjuːˈteɪtə/ mutator (setter)
    static (class) variable/ˈstætɪk ˈveərɪəbl/ biến tĩnh (lớp)
    3.6

    Passing and Returning References of an Object · ⁨Truyền và Trả về Tham chiếu của một Đối tượng⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.6.A: Develop code to define behaviors of an object through methods written in a class using object references and determine the result of calling these methods.

    • 3.6.A.1 When an argument is an object reference, the parameter is initialized with a copy of that reference; it does not create a new independent copy of the object. If the parameter refers to a mutable object, the method or constructor can use this reference to alter the state of the object. It is good programming practice to not modify mutable objects that are passed as parameters unless required in the specification.
    • 3.6.A.2 When the return expression evaluates to an object reference, the reference is returned, not a reference to a new copy of the object.
    • 3.6.A.3 Methods cannot access the private data and methods of a parameter that holds a reference to an object unless the parameter is the same type as the method's enclosing class.
    Tiếng Việt

    Mục tiêu học tập 3.6.A: Phát triển mã để xác định hành vi của một đối tượng thông qua các phương thức được viết trong một lớp sử dụng các tham chiếu đối tượng và xác định kết quả của việc gọi các phương thức này.

    • 3.6.A.1 Khi một đối số là tham chiếu đến đối tượng, tham số được khởi tạo bằng một bản sao của tham chiếu đó; nó không tạo ra một bản sao độc lập mới của đối tượng. Nếu tham số trỏ đến một đối tượng có thể thay đổi, phương thức hoặc hàm khởi tạo có thể sử dụng tham chiếu này để thay đổi trạng thái của đối tượng. Đây là thực hành lập trình tốt nên không sửa đổi các đối tượng có thể thay đổi được truyền vào làm tham số trừ khi yêu cầu trong tài liệu mô tả.
    • 3.6.A.2 Khi biểu thức trả về đánh giá ra một tham chiếu đến đối tượng, thì tham chiếu đó sẽ được trả về, chứ không phải là tham chiếu đến một bản sao mới của đối tượng.
    • 3.6.A.3 Các phương thức không thể truy cập dữ liệu riêng tư và các phương thức riêng tư của một tham số chứa tham chiếu đến đối tượng, trừ khi tham số đó có cùng kiểu với lớp bao bọc phương thức.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    = copies the reference, not the object

    When you pass an object to a method, Java copies the reference, so the method acts on the same object – changes to its fields are visible to the caller. (Primitives are copied by value, so changes to them are not.) A method can also return a reference to an object. Because a String is immutable, passing one is safe; passing a mutable object lets a method change it.

    Exam skill: know that mutating an object's fields inside a method affects the original, but reassigning the parameter (param = new...) does not affect the caller.

    Worked example. Suppose s is a Student with score 50, and we call tweak(s):

    Line (1) changes the object s points to, so the caller now sees 100. Line (2) makes the method's own copy of the reference point at a fresh object – the caller's s is untouched – and line (3) affects only that new object. After the call, s.getScore() is 100: the mutation stuck, the reassignment did not.

    Tiếng Việt
    = sao chép tham chiếu, không phải đối tượng

    Khi bạn truyền một đối tượng vào phương thức, Java sao chép tham chiếu, nên phương thức tác động lên cùng một đối tượng – những thay đổi đối với các trường của nó sẽ hiển thị cho người gọi. (Kiểu nguyên sinh được sao chép theo giá trị, nên những thay đổi đối với chúng thì không.) Một phương thức cũng có thể trả về một tham chiếu đến một đối tượng. Vì một String là bất biến, nên việc truyền nó là an toàn; việc truyền một đối tượng có thể thay đổi được cho phép phương thức thay đổi nó.

    Java truyền theo giá trị: phương thức nhận được một bản sao; truyền theo tham chiếu thực sự, mà Java thiếu, sẽ cho phép nó gán lại biến của người gọi
    Java luôn truyền theo giá trị (bên trái): phương thức nhận được một bản sao của tham chiếu. Truyền theo tham chiếu thực sự (bên phải) — mà Java không có — sẽ cho phép một phương thức gán lại biến của chính người gọi.

    Kỹ năng thi: hãy biết rằng việc thay đổi các trường của đối tượng bên trong một phương thức sẽ ảnh hưởng đến đối tượng gốc, nhưng gán lại tham số (param = new...) không ảnh hưởng đến người gọi.

    Ví dụ minh họa. Giả sử s là một Student với điểm số 50, và chúng ta gọi 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
    }
    

    Dòng (1) thay đổi đối tượng mà s trỏ tới, nên người gọi giờ thấy 100. Dòng (2) khiến bản sao riêng của phương thức trỏ tới một đối tượng mới – s của người gọi không bị chạm vào – và dòng (3) chỉ ảnh hưởng đến đối tượng mới đó. Sau khi gọi, s.getScore() là 100: sự thay đổi đã gắn kết, sự gán lại thì không.

    3.7

    Class Variables and Class Methods · ⁨Biến Lớp và Phương thức Lớp⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.7.A: Develop code to define behaviors of a class through class methods.

    • 3.7.A.1 Class methods cannot access or change the values of instance variables or call instance methods without being passed an instance of the class via a parameter.
    • 3.7.A.2 Class methods can access or change the values of class variables and can call other class methods.

    Learning Objective 3.7.B: Develop code to declare the class variables that belong to the class.

    • 3.7.B.1 Class variables belong to the class, with all objects of a class sharing a single copy of the class variable. Class variables are designated with the static keyword before the variable type.
    • 3.7.B.2 Class variables that are designated public are accessed outside of the class by using the class name and the dot operator, since they are associated with a class, not objects of a class.
    • 3.7.B.3 When a variable is declared final, its value cannot be modified.
    Tiếng Việt

    Mục tiêu học tập 3.7.A: Viết mã để xác định hành vi của một lớp thông qua các phương thức lớp.

    • 3.7.A.1 Các phương thức lớp không thể truy cập hoặc thay đổi giá trị của biến instance (biến thuộc tính) hoặc gọi các phương thức instance nếu không được truyền vào một đối tượng instance của lớp thông qua một tham số.
    • 3.7.A.2 Các phương thức lớp có thể truy cập hoặc thay đổi giá trị của biến lớp và có thể gọi các phương thức lớp khác.

    Mục tiêu học tập 3.7.B: Viết mã để khai báo các biến lớp thuộc về lớp.

    • 3.7.B.1 Biến lớp thuộc về lớp, với tất cả các đối tượng của lớp chia sẻ một bản sao duy nhất của biến lớp. Biến lớp được chỉ định bằng từ khóa static trước kiểu biến.
    • 3.7.B.2 Biến lớp được chỉ định public được truy cập bên ngoài lớp bằng cách sử dụng tên lớp và toán tử chấm, vì chúng liên quan đến một lớp, không phải các đối tượng của lớp.
    • 3.7.B.3 Khi một biến được khai báo final, giá trị của nó không thể bị thay đổi.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    static vs instance fields

    A static (class) variable 类变量, marked static, is shared by all objects of the class – one copy total (e.g. a counter of how many objects exist). A static method belongs to the class and cannot use instance fields directly. Access them by class name: Student.getCount().

    Tiếng Việt
    trường tĩnh so với trường instance

    Một biến tĩnh (lớp), được đánh dấu static, được chia sẻ bởi tất cả các đối tượng của lớp – chỉ có một bản sao duy nhất (ví dụ: bộ đếm số lượng đối tượng tồn tại). Một phương thức tĩnh thuộc về lớp và không thể sử dụng trực tiếp các trường instance. Truy cập chúng bằng tên lớp: Student.getCount().

    3.8

    Scope and Access · ⁨Phạm vi và Quyền truy cập⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.8.A: Explain where variables can be used in the code.

    • 3.8.A.1 Local variables are variables declared in the headers or bodies of blocks of code. Local variables can only be accessed in the block in which they are declared. Since constructors and methods are blocks of code, parameters to constructors or methods are also considered local variables. These variables may only be used within the constructor or method and cannot be declared to be public or private.
    • 3.8.A.2 When there is a local variable or parameter with the same name as an instance variable, the variable name will refer to the local variable instead of the instance variable within the body of the constructor or method.
    Tiếng Việt

    Mục tiêu học tập 3.8.A: Giải thích nơi các biến có thể được sử dụng trong mã nguồn.

    • 3.8.A.1 Biến cục bộ là các biến được khai báo trong phần đầu hoặc thân của các khối mã. Biến cục bộ chỉ có thể được truy cập trong khối mà nó được khai báo. Vì hàm khởi tạo và phương thức là các khối mã, các tham số của hàm khởi tạo hoặc phương thức cũng được coi là biến cục bộ. Những biến này chỉ có thể được sử dụng bên trong hàm khởi tạo hoặc phương thức và không thể được khai báo là public hay private.
    • 3.8.A.2 Khi có một biến cục bộ hoặc tham số có cùng tên với một biến instance, tên biến sẽ trỏ đến biến cục bộ thay vì biến instance bên trong thân của hàm khởi tạo hoặc phương thức.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Scope 作用域 is where a name is visible. A local variable declared in a method exists only inside it; a parameter exists only in its method; an instance variable is visible throughout the object. Access modifiers control visibility across classes: private (this class only) versus public (anywhere). Local variables shadow fields of the same name – a source of bugs.

    Tiếng Việt

    Phạm vi (Scope) là nơi một tên có thể nhìn thấy. Một biến cục bộ được khai báo trong một phương thức chỉ tồn tại bên trong nó; một tham số chỉ tồn tại trong phương thức của nó; một biến instance có thể nhìn thấy khắp nơi trong đối tượng. Các bộ điều chỉnh quyền truy cập kiểm soát khả năng nhìn thấy xuyên suốt các lớp: private (chỉ lớp này) so với public (bất cứ đâu). Biến cục bộ che khuất (shadow) các trường có cùng tên – đây là nguồn gốc của lỗi.

    Biến toàn cục có thể nhìn thấy ở mọi nơi; biến cục bộ chỉ bên trong khối của nó
    Biến toàn cục có thể nhìn thấy ở mọi nơi; biến cục bộ chỉ bên trong khối của nó
    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    Scope/skəʊp/ Phạm vi
    3.9

    The this Keyword · ⁨Từ khóa this⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 3.9.A: Develop code for expressions that are self-referencing and determine the result of these expressions.

    • 3.9.A.1 Within an instance method or a constructor, the keyword this acts as a special variable that holds a reference to the current object—the object whose method or constructor is being called.
    • 3.9.A.2 The keyword this can be used to pass the current object as an argument in a method call.
    • 3.9.A.3 Class methods do not have a this reference.
    Tiếng Việt

    Mục tiêu học tập 3.9.A: Viết mã cho các biểu thức tự tham chiếu và xác định kết quả của các biểu thức này.

    • 3.9.A.1 Bên trong một phương thức instance hoặc hàm khởi tạo, từ khóa this hoạt động như một biến đặc biệt chứa tham chiếu đến đối tượng hiện tại—đó là đối tượng mà phương thức hoặc hàm khởi tạo đang được gọi.
    • 3.9.A.2 Từ khóa this có thể được dùng để truyền đối tượng hiện tại dưới dạng đối số trong một lời gọi phương thức.
    • 3.9.A.3 Các phương thức lớp không có tham chiếu this.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    this is a reference to the current object. Use it to tell a field apart from a parameter with the same name, or to call another method of the same object:

    Exam skill: when a constructor or setter's parameter has the same name as a field, you must write this.field = param – without this, the assignment does nothing useful.

    Tiếng Việt

    this là tham chiếu đến đối tượng hiện tại. Sử dụng nó để phân biệt một trường dữ liệu với tham số có cùng tên, hoặc để gọi một phương thức khác của cùng đối tượng:

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

    Kỹ năng làm bài thi: khi tham số của constructor hoặc setter có cùng tên với một trường dữ liệu, bạn bắt buộc phải viết this.field = param – nếu không có this, phép gán sẽ không thực hiện được tác dụng gì.

    3.9

    Exam tips · ⁨Mẹo làm bài thi⁩

    English
    • Design with methods and classes: encapsulate data as private fields and expose behaviour through public methods.
    • Know the difference between an object and its class, and that objects are passed by value — the parameter gets a copy of the reference, so a method can change the object's state, but reassigning the parameter does not affect the caller (Java has no pass-by-reference).
    • Traverse arrays and ArrayLists safely — size is length vs .size(), and removing during a loop shifts indices.
    • Trace a recursive method to determine its result: find the base case first, then follow each recursive call to its return value (writing recursive code is outside the exam's scope).
    • Recognise inheritance vocabulary — superclass, subclass, method overriding, and that every class is a subclass of Object (designing and implementing inheritance is outside the exam's scope).
    Tiếng Việt
    • Thiết kế với các phương thức và lớp: đóng gói dữ liệu thành các trường private và cung cấp hành vi thông qua các phương thức công khai.
    • Phân biệt giữa đối tượng và lớp của nó, và hiểu rằng đối tượng được truyền theo giá trị – tham số nhận được một bản sao của tham chiếu, vì vậy một phương thức có thể thay đổi trạng thái của đối tượng, nhưng việc gán lại cho tham số sẽ không ảnh hưởng đến hàm gọi (Java không có truyền theo tham chiếu).
    • Duyệt qua mảng và ArrayList an toàn — kích thước là length so với .size(), và việc xóa phần tử trong vòng lặp sẽ làm dịch chuyển chỉ mục.
    • Theo dõi một phương thức đệ quy để xác định kết quả của nó: tìm trường hợp cơ sở trước, sau đó đi theo từng lời gọi đệ quy đến giá trị trả về (viết mã đệ quy nằm ngoài phạm vi đề thi).
    • Nhận biết từ vựng về kế thừa — lớp cha, lớp con, ghi đè phương thức, và mọi lớp đều là lớp con của Object (thiết kế và triển khai kế thừa nằm ngoài phạm vi đề thi).
  • 4

    Data Collections · ⁨Bộ thu thập dữ liệu⁩

    Watch lesson · ⁨Xem bài học⁩
    4.1

    The Ethics of Collecting Data · ⁨Đạo đức thu thập dữ liệu⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.1.A: Explain the risks to privacy from collecting and storing personal data on computer systems.

    • 4.1.A.1 When using a computer, personal privacy is at risk. When developing new programs, programmers should attempt to safeguard the personal privacy of the user.

    Learning Objective 4.1.B: Explain the importance of recognizing data quality and potential issues when using a data set.

    • 4.1.B.1 Algorithmic bias describes systemic and repeated errors in a program that create unfair outcomes for a specific group of users.
    • 4.1.B.2 Programmers should be aware of the data set collection method and the potential for bias when using this method before using the data to extrapolate new information or drawing conclusions.
    • 4.1.B.3 Some data sets are incomplete or contain inaccurate data. Using such data in the development or use of a program can cause the program to work incorrectly or inefficiently.

    Learning Objective 4.1.C: Identify an appropriate data set to use in order to solve a problem or answer a specific question.

    • 4.1.C.1 Contents of a data set might be related to a specific question or topic and might not be appropriate to give correct answers or extrapolate information for a different question or topic.
    Tiếng Việt

    Mục tiêu học tập 4.1.A: Giải thích những rủi ro đối với quyền riêng tư do thu thập và lưu trữ dữ liệu cá nhân trên hệ thống máy tính.

    • 4.1.A.1 Khi sử dụng máy tính, quyền riêng tư cá nhân có nguy cơ bị xâm phạm. Khi phát triển các chương trình mới, các lập trình viên nên cố gắng bảo vệ quyền riêng tư của người dùng.

    Mục tiêu học tập 4.1.B: Giải thích tầm quan trọng của việc nhận biết chất lượng dữ liệu và các vấn đề tiềm ẩn khi sử dụng một tập dữ liệu.

    • 4.1.B.1 Thiên kiến thuật toán mô tả các lỗi hệ thống và lặp lại trong một chương trình tạo ra kết quả không công bằng cho một nhóm người dùng cụ thể.
    • 4.1.B.2 Các lập trình viên cần nhận thức về phương pháp thu thập tập dữ liệu và khả năng xuất hiện thiên kiến khi sử dụng phương pháp này trước khi sử dụng dữ liệu để suy diễn thông tin mới hoặc rút ra kết luận.
    • 4.1.B.3 Một số tập dữ liệu bị thiếu sót hoặc chứa dữ liệu không chính xác. Việc sử dụng dữ liệu như vậy trong quá trình phát triển hoặc vận hành một chương trình có thể khiến chương trình hoạt động sai hoặc kém hiệu quả.

    Mục tiêu học tập 4.1.C: Xác định một tập dữ liệu phù hợp để sử dụng nhằm giải quyết một vấn đề hoặc trả lời một câu hỏi cụ thể.

    • 4.1.C.1 Nội dung của một tập dữ liệu có thể liên quan đến một câu hỏi hoặc chủ đề cụ thể và có thể không phù hợp để đưa ra câu trả lời đúng đắn hoặc suy diễn thông tin cho một câu hỏi hoặc chủ đề khác.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Programs that gather data raise questions of privacy 隐私 and consent 同意. Collect only what is needed, protect it, and be honest about its use. Data can carry bias 偏见 if it does not represent everyone fairly, leading to unfair results – a responsibility that comes with storing information.

    Tiếng Việt
    Các机柜 máy chủ trong trung tâm dữ liệu — lượng dữ liệu lớn dấy lên những câu hỏi đạo đức về việc thu thập và sử dụng
    Các机柜 máy chủ trong trung tâm dữ liệu — lượng dữ liệu lớn dấy lên những câu hỏi đạo đức về việc thu thập và sử dụng

    Các chương trình thu thập dữ liệu dấy lên các vấn đề về quyền riêng tư và sự đồng ý. Chỉ thu thập những gì cần thiết, bảo vệ chúng, và trung thực về cách sử dụng. Dữ liệu có thể chứa thiên kiến nếu nó không đại diện công bằng cho tất cả mọi người, dẫn đến kết quả bất công – đây là trách nhiệm đi kèm với việc lưu trữ thông tin.

    4.2

    Why We Need Data Structures · ⁨Tại sao chúng ta cần cấu trúc dữ liệu⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.2.A: Represent patterns and algorithms that involve data sets found in everyday life using written language or diagrams.

    • 4.2.A.1 A data set is a collection of specific pieces of information or data.
    • 4.2.A.2 Data sets can be manipulated and analyzed to solve a problem or answer a question. When analyzing data sets, values within the set are accessed and utilized one at a time and then processed according to the desired outcome.
    • 4.2.A.3 Data can be represented in a diagram by using a chart or table. This visual can be used to plan the algorithm that will be used to manipulate the data.
    Tiếng Việt

    Mục tiêu học tập 4.2.A: Biểu diễn các mẫu và thuật toán liên quan đến tập dữ liệu trong cuộc sống hàng ngày bằng ngôn ngữ viết hoặc sơ đồ.

    • 4.2.A.1 Một tập dữ liệu là một bộ sưu tập các mảnh thông tin cụ thể hoặc dữ liệu.
    • 4.2.A.2 Tập dữ liệu có thể được thao tác và phân tích để giải quyết vấn đề hoặc trả lời câu hỏi. Khi phân tích tập dữ liệu, các giá trị bên trong tập hợp được truy cập và sử dụng từng cái một, sau đó được xử lý theo kết quả mong muốn.
    • 4.2.A.3 Dữ liệu có thể được biểu diễn dưới dạng sơ đồ bằng cách sử dụng biểu đồ hoặc bảng. Hình ảnh trực quan này có thể được sử dụng để lập kế hoạch thuật toán sẽ được sử dụng để thao tác dữ liệu.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A single variable holds one value; real problems need to store many related values – a class roster, pixels, sensor readings. A data structure 数据结构 organizes a collection so we can store, find, and process items efficiently. The AP course uses three: the array, the ArrayList, and the 2D array.

    Tiếng Việt
    Tủ hồ sơ: các cấu trúc dữ liệu lưu trữ nhiều giá trị dưới một tên duy nhất để thuật toán có thể xử lý chúng
    Mục hồ sơ: các bộ sưu tập lưu trữ nhiều giá trị dưới một tên duy nhất để thuật toán có thể xử lý chúng

    Một biến đơn lẻ chỉ lưu một giá trị; các vấn đề thực tế cần lưu trữ nhiều giá trị liên quan — danh sách học sinh, điểm ảnh, số đo cảm biến. Một cấu trúc dữ liệu tổ chức một bộ sưu tập để chúng ta có thể lưu trữ, tìm kiếm và xử lý các mục một cách hiệu quả. Khóa AP sử dụng ba loại: mảng, ArrayList, và mảng 2D.

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    privacy/ˈprɪvəsi/ quyền riêng tư
    consent/kənˈsent/ sự đồng thuận
    bias/ˈbaɪəs/ sự thiên lệch
    data structure/ˈdeɪtə ˈstrʌktʃə/ cấu trúc dữ liệu
    array/əˈreɪ/ mảng (array)
    Traverse/trəˈvɜːs/ Duyệt qua
    ArrayList/əˈreɪ lɪst/ ArrayList
    2D array/ˌtuː ˈdiː əˈreɪ/ mảng 2D
    row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ thứ tự theo hàng
    4.3

    Making and Reading an Array · ⁨Tạo và Đọc Mảng⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.3.A: Develop code used to represent collections of related data using one-dimensional (1D) array objects.

    • 4.3.A.1 An array stores multiple values of the same type. The values can be either primitive values or object references.
    • 4.3.A.2 The length of an array is established at the time of creation and cannot be changed. The length of an array can be accessed through the length attribute.
    • 4.3.A.3 When an array is created using the keyword new, all of its elements are initialized to the default values for the element data type. The default value for int is 0, for double is 0.0, for boolean is false, and for a reference type is null.
    • 4.3.A.4 Initializer lists can be used to create and initialize arrays.
    • 4.3.A.5 Square brackets [ ] are used to access and modify an element in a 1D array using an index.
    • 4.3.A.6 The valid index values for an array are 0 through one less than the length of the array, inclusive. Using an index value outside of this range will result in an ArrayIndexOutOfBoundsException.
    Tiếng Việt

    Mục tiêu học tập 4.3.A: Phát triển mã dùng để biểu diễn các tập hợp dữ liệu liên quan bằng cách sử dụng các đối tượng mảng một chiều (1D).

    • 4.3.A.1 Một mảng lưu trữ nhiều giá trị cùng một kiểu. Các giá trị này có thể là giá trị nguyên thủy hoặc tham chiếu đối tượng.
    • 4.3.A.2 Chiều dài của mảng được xác định tại thời điểm tạo và không thể thay đổi. Chiều dài của mảng có thể được truy cập thông qua thuộc tính length.
    • 4.3.A.3 Khi mảng được tạo bằng từ khóa new, tất cả các phần tử của nó được khởi tạo với giá trị mặc định cho kiểu dữ liệu phần tử. Giá trị mặc định cho int là 0, cho double là 0.0, cho boolean là false, và cho kiểu tham chiếu là null.
    • 4.3.A.4 Danh sách khởi tạo có thể được sử dụng để tạo và khởi tạo mảng.
    • 4.3.A.5 Dấu ngoặc vuông [ ] được sử dụng để truy cập và sửa đổi một phần tử trong mảng 1D bằng chỉ số.
    • 4.3.A.6 Các giá trị chỉ số hợp lệ cho mảng là từ 0 đến nhỏ hơn chiều dài của mảng một đơn vị, bao gồm cả hai đầu mút. Sử dụng giá trị chỉ số nằm ngoài khoảng này sẽ dẫn đến một lỗi ArrayIndexOutOfBoundsException.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An array 数组 is a fixed-size, ordered collection of same-type values. Indices run from 0 to length - 1:

    Accessing an index outside 0..length-1 throws an ArrayIndexOutOfBoundsException.

    Tiếng Việt

    Một mảng là một bộ sưu tập có kích thước cố định, thứ tự và chứa các giá trị cùng kiểu. Các chỉ mục chạy từ 0 đến length - 1:

    Mảng một chiều (một danh sách) kèm theo chỉ số và giới hạn của nó
    Một mảng một chiều (danh sách) với các chỉ mục và giới hạn của nó
    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)
    

    Truy cập vào chỉ mục nằm ngoài 0..length-1 sẽ gây ra lỗi ArrayIndexOutOfBoundsException.

    4.4

    Visiting Every Element of an Array · ⁨Truy cập Every Element of an Array⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.4.A: Develop code used to traverse the elements in a 1D array and determine the result of these traversals.

    • 4.4.A.1 Traversing an array is when repetition statements are used to access all or an ordered sequence of elements in an array.
    • 4.4.A.2 Traversing an array with an indexed for loop or while loop requires elements to be accessed using their indices.
    • 4.4.A.3 An enhanced for loop header includes a variable, referred to as the enhanced for loop variable. For each iteration of the enhanced for loop, the enhanced for loop variable is assigned a copy of an element without using its index.
    • 4.4.A.4 Assigning a new value to the enhanced for loop variable does not change the value stored in the array.
    • 4.4.A.5 When an array stores object references, the attributes can be modified by calling methods on the enhanced for loop variable. This does not change the object references stored in the array.
    • 4.4.A.6 Code written using an enhanced for loop to traverse elements in an array can be rewritten using an indexed for loop or a while loop.
    Tiếng Việt

    Mục tiêu học tập 4.4.A: Phát triển mã dùng để duyệt qua các phần tử trong mảng 1D và xác định kết quả của các lần duyệt này.

    • 4.4.A.1 Duyệt qua mảng là khi các câu lệnh lặp lại được sử dụng để truy cập toàn bộ hoặc một dãy thứ tự các phần tử trong mảng.
    • 4.4.A.2 Duyệt qua mảng với vòng lặp for có chỉ số hoặc vòng lặp while yêu cầu các phần tử phải được truy cập bằng chỉ số của chúng.
    • 4.4.A.3 Tiêu đề vòng lặp for nâng cao bao gồm một biến, được gọi là biến vòng lặp for nâng cao. Với mỗi lần lặp của vòng lặp for nâng cao, biến vòng lặp for nâng cao được gán một bản sao của một phần tử mà không cần sử dụng chỉ số của nó.
    • 4.4.A.4 Gán một giá trị mới cho biến vòng lặp for nâng cao không làm thay đổi giá trị được lưu trữ trong mảng.
    • 4.4.A.5 Khi mảng lưu trữ các tham chiếu đối tượng, các thuộc tính có thể được sửa đổi bằng cách gọi các phương pháp trên biến vòng lặp for nâng cao. Điều này không làm thay đổi các tham chiếu đối tượng được lưu trữ trong mảng.
    • 4.4.A.6 Mã được viết bằng vòng lặp for nâng cao để duyệt qua các phần tử trong mảng có thể được viết lại bằng vòng lặp for có chỉ số hoặc vòng lặp while.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Traverse 遍历 an array with a for loop (gives the index) or an enhanced for / for-each loop (gives each value, read-only):

    Tiếng Việt

    Duyệt qua mảng bằng vòng lặp for (cung cấp chỉ mục) hoặc vòng lặp enhanced for / for-each (cung cấp từng giá trị, chỉ đọc):

    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

    Standard Array Algorithms · ⁨Thuật toán Mảng Tiêu chuẩn⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.5.A: Develop code for standard and original algorithms for a particular context or specification that involves arrays and determine the result of these algorithms.

    • 4.5.A.1 There are standard algorithms that utilize array traversals to:
      • determine a minimum or maximum value
      • compute a sum or average
      • determine if at least one element has a particular property
      • determine if all elements have a particular property
      • determine the number of elements having a particular property
      • access all consecutive pairs of elements
      • determine the presence or absence of duplicate elements
      • shift or rotate elements left or right
      • reverse the order of the elements
    Tiếng Việt

    Mục tiêu Học tập 4.5.A: Phát triển mã cho các thuật toán chuẩn và thuật toán tự thiết kế trong một ngữ cảnh hoặc yêu cầu cụ thể liên quan đến mảng và xác định kết quả của các thuật toán này.

    • 4.5.A.1 Có các thuật toán chuẩn sử dụng việc duyệt qua mảng để:
      • xác định giá trị tối thiểu hoặc tối đa
      • tính tổng hoặc trung bình cộng
      • xác định xem có ít nhất một phần tử nào có thuộc tính đặc biệt hay không
      • xác định xem tất cả các phần tử có thuộc tính đặc biệt hay không
      • xác định số lượng phần tử có thuộc tính đặc biệt
      • truy cập tất cả các cặp phần tử liên tiếp
      • xác định sự tồn tại hoặc không tồn tại của các phần tử trùng lặp
      • dịch chuyển hoặc xoay các phần tử sang trái hoặc phải
      • đảo ngược thứ tự của các phần tử

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Master these patterns: compute a sum or average, find the max/min, count items meeting a condition, check for a duplicate, and reverse or shift elements. Each is a traversal with a running result:

    Tiếng Việt

    Nắm vững các mẫu này: tính tổng hoặc trung bình, tìm giá trị lớn nhất/nhỏ nhất, đếm các mục thỏa mãn điều kiện, kiểm tra sự tồn tại của lặp lại, và đảo ngược hoặc dịch chuyển các phần tử. Mỗi cái là một lần duyệt với kết quả tích lũy:

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

    Reading Data from a Text File · ⁨Đọc Dữ liệu từ Tập tin Văn bản⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.6.A: Develop code to read data from a text file.

    • 4.6.A.1 A file is storage for data that persists when the program is not running. The data in a file can be retrieved during program execution.
    • 4.6.A.2 A file can be connected to the program using the File and Scanner classes.
    • 4.6.A.3 A file can be opened by creating a File object, using the name of the file as the argument of the constructor.
      • File(String str) is the File constructor that accepts a String file name to open for reading, where str is the pathname for the file.
    • 4.6.A.4 When using the File class, it is required to indicate what to do if the file with the provided name cannot be opened. One way to accomplish this is to add throws IOException to the header of the method that uses the file. If the file name is invalid, the program will terminate.
    • 4.6.A.5 The File and IOException classes are part of the java.io package. An import statement must be used to make these classes available for use in the program.
    • 4.6.A.6 The following Scanner methods and constructor—including what they do and when they are used—are part of the Java Quick Reference:
      • Scanner(File f) is the Scanner constructor that accepts a File for reading.
      • int nextInt() returns the next int read from the file or input source if available. If the next int does not exist or is out of range, it will result in an InputMismatchException.
      • double nextDouble() returns the next double read from the file or input source. If the next double does not exist, it will result in an InputMismatchException.
      • boolean nextBoolean() returns the next boolean read from the file or input source. If the next boolean does not exist, it will result in an InputMismatchException.
      • String nextLine() returns the next line of text as a String read from the file or input source; can return the empty string if called immediately after another Scanner method that is reading from the file or input source.
      • String next() returns the next String read from the file or input source.
      • boolean hasNext() returns true if there is a next item to read in the file or input source; returns false otherwise.
      • void close() closes this scanner.
      • Exclusion statement: Accepting input from the keyboard is outside the scope of the AP Computer Science A course and exam.
    • 4.6.A.7 Using nextLine and the other Scanner methods together on the same input source sometimes requires code to adjust for the methods' different ways of handling whitespace.
      • Exclusion statement: Writing or analyzing code that uses both nextLine and other Scanner methods on the same input source is outside the scope of the AP Computer Science A course and exam.
    • 4.6.A.8 The following additional String method—including what it does and when it is used—is part of the Java Quick Reference:
      • String[] split(String del) returns a String array where each element is a substring of this String, which has been split around matches of the given expression del.
      • Exclusion statement: The parameter del uses a format called a regular expression. Writing or analyzing code that uses any of the special properties of regular expressions (e.g., \\*, \\.) is outside the scope of the AP Computer Science A course and exam.
    • 4.6.A.9 A while loop can be used to detect if the file still contains elements to read by using the hasNext method as the condition of the loop.
    • 4.6.A.10 A file should be closed when the program is finished using it. The close method from Scanner is called to close the file.
    Tiếng Việt

    Mục tiêu Học tập 4.6.A: Phát triển mã để đọc dữ liệu từ một tập tin văn bản.

    • 4.6.A.1 Một tập tin là nơi lưu trữ dữ liệu tồn tại ngay cả khi chương trình không chạy. Dữ liệu trong tập tin có thể được truy xuất trong quá trình thực thi chương trình.
    • 4.6.A.2 Một tập tin có thể được kết nối với chương trình bằng cách sử dụng File và Scanner class.
    • 4.6.A.3 Một tập tin có thể được mở bằng cách tạo một đối tượng File, sử dụng tên tập tin làm tham số của constructor.
      • File(String str) là File constructor chấp nhận một String tên file để mở để đọc, trong đó str là đường dẫn đến file.
    • 4.6.A.4 Khi sử dụng File class, bắt buộc phải chỉ ra hành động nếu tập tin có tên được cung cấp không thể mở. Một cách để thực hiện điều này là thêm throws IOException vào phần đầu của method sử dụng tập tin. Nếu tên file không hợp lệ, chương trình sẽ bị dừng lại.
    • 4.6.A.5 File và IOException class là một phần của java.io package. Một statement import phải được sử dụng để làm cho các class này khả dụng trong chương trình.
    • 4.6.A.6 Các Scanner methods sau đây và constructor—bao gồm cả chức năng của chúng và thời điểm sử dụng—là một phần của Java Quick Reference:
      • Scanner(File f) là Scanner constructor chấp nhận một File để đọc.
      • int nextInt() trả về int tiếp theo được đọc từ file hoặc nguồn đầu vào nếu có sẵn. Nếu int tiếp theo không tồn tại hoặc nằm ngoài phạm vi, nó sẽ gây ra một InputMismatchException.
      • double nextDouble() trả về double tiếp theo được đọc từ file hoặc nguồn đầu vào. Nếu double tiếp theo không tồn tại, nó sẽ gây ra một InputMismatchException.
      • boolean nextBoolean() trả về boolean tiếp theo được đọc từ file hoặc nguồn đầu vào. Nếu boolean tiếp theo không tồn tại, nó sẽ gây ra một InputMismatchException.
      • String nextLine() trả về dòng văn bản tiếp theo dưới dạng một String được đọc từ file hoặc nguồn đầu vào; có thể trả về chuỗi rỗng nếu được gọi ngay sau một Scanner method khác đang đọc từ file hoặc nguồn đầu vào.
      • String next() trả về String tiếp theo được đọc từ file hoặc nguồn đầu vào.
      • boolean hasNext() trả về true nếu còn một item để đọc trong file hoặc nguồn đầu vào; trả về false ngược lại.
      • void close() đóng Scanner này.
      • Câu loại trừ: Nhận đầu vào từ bàn phím nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 4.6.A.7 Việc sử dụng nextLine cùng với các Scanner methods khác trên cùng một nguồn đầu vào đôi khi đòi hỏi mã để điều chỉnh cho các cách xử lý khoảng trắng khác nhau của các methods.
      • Câu loại trừ: Viết hoặc phân tích mã sử dụng cả nextLine và các Scanner methods khác trên cùng một nguồn đầu vào nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 4.6.A.8 String method bổ sung sau đây—including cả chức năng và thời điểm sử dụng—là một phần của Java Quick Reference:
      • String[] split(String del) trả về một String array mà mỗi phần tử là một substring của this String, đã được tách ra dựa trên các matches của biểu thức del đã cho.
      • Câu loại trừ: Tham số del sử dụng một định dạng gọi là regular expression. Viết hoặc phân tích mã sử dụng bất kỳ tính chất đặc biệt nào của regular expressions (ví dụ: \\*, \\.) nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 4.6.A.9 Một vòng lặp while có thể được sử dụng để phát hiện xem file vẫn còn chứa các phần tử để đọc hay không bằng cách sử dụng hasNext method như là điều kiện của vòng lặp.
    • 4.6.A.10 Một tập tin nên được đóng khi chương trình đã sử dụng xong. Method close từ Scanner được gọi để đóng tập tin.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    File and IOException live in java.io, so a program that reads a file needs import java.io.*;. Opening a file can fail (it might not exist), and Java forces you to handle that – the simplest way is to add throws IOException to the method header. A Scanner then reads the file line by line, using hasNext... to test before reading:

    Reading typed tokens with nextInt(), nextDouble(), or nextBoolean() throws an InputMismatchException if the next token is the wrong type – for example calling nextInt() when the next thing in the file is the word cat.

    Tiếng Việt

    File và IOException nằm trong java.io, vì vậy một chương trình đọc tập tin cần import java.io.*;. Mở một tập tin có thể thất bại (có thể không tồn tại), và Java bắt buộc bạn phải xử lý điều đó — cách đơn giản nhất là thêm throws IOException vào tiêu đề phương thức. Sau đó, một Scanner sẽ đọc tập tin dòng theo dòng, sử dụng hasNext... để kiểm tra trước khi đọc:

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

    Đọc các token đã định dạng với nextInt(), nextDouble(), hoặc nextBoolean() sẽ gây ra lỗi InputMismatchException nếu token tiếp theo sai kiểu — ví dụ như gọi nextInt() khi thứ tiếp theo trong tập tin là từ cat.

    4.7

    Wrapping a Number in an Object · ⁨Bao bọc một Số trong Đối tượng⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.7.A: Develop code to use Integer and Double objects from their primitive counterparts and determine the result of using these objects.

    • 4.7.A.1 The Integer class and Double class are part of the java.lang package. An Integer object is immutable, meaning once an Integer object is created, its attributes cannot be changed. A Double object is immutable, meaning once a Double object is created, its attributes cannot be changed.
    • 4.7.A.2 Autoboxing is the automatic conversion that the Java compiler makes between primitive types and their corresponding object wrapper classes. This includes converting an int to an Integer and a double to a Double. The Java compiler applies autoboxing when a primitive value is:
      • passed as a parameter to a method that expects an object of the corresponding wrapper class
      • assigned to a variable of the corresponding wrapper class
    • 4.7.A.3 Unboxing is the automatic conversion that the Java compiler makes from the wrapper class to the primitive type. This includes converting an Integer to an int and a Double to a double. The Java compiler applies unboxing when a wrapper class object is:
      • passed as a parameter to a method that expects a value of the corresponding primitive type
      • assigned to a variable of the corresponding primitive type
    • 4.7.A.4 The following class Integer method—including what it does and when it is used—is part of the Java Quick Reference:
      • static int parseInt(String s) returns the String argument as an int.
    • 4.7.A.5 The following class Double method—including what it does and when it is used—is part of the Java Quick Reference:
      • static double parseDouble(String s) returns the String argument as a double.
    Tiếng Việt

    Mục tiêu Học tập 4.7.A: Phát triển mã để sử dụng Integer và Double objects từ các đối tác primitive của chúng và xác định kết quả của việc sử dụng các objects này.

    • 4.7.A.1 Class Integer và class Double là một phần của java.lang package. Một đối tượng Integer là immutable, nghĩa là một khi đối tượng Integer được tạo ra, các thuộc tính của nó không thể thay đổi. Một đối tượng Double là immutable, nghĩa là một khi đối tượng Double được tạo ra, các thuộc tính của nó không thể thay đổi.
    • 4.7.A.2 Autoboxing là phép chuyển đổi tự động mà bộ biên dịch Java thực hiện giữa các kiểu primitive và các class wrapper object tương ứng của chúng. Điều này bao gồm việc chuyển đổi một int thành một Integer và một double thành một Double. Bộ biên dịch Java áp dụng autoboxing khi một giá trị primitive được:
      • truyền làm tham số cho một method chờ đợi một object của class wrapper tương ứng
      • gán cho một biến của class wrapper tương ứng
    • 4.7.A.3 Unboxing là phép chuyển đổi tự động mà bộ biên dịch Java thực hiện từ class wrapper sang kiểu primitive. Điều này bao gồm việc chuyển đổi một Integer thành một int và một Double thành một double. Bộ biên dịch Java áp dụng unboxing khi một object của class wrapper được:
      • truyền làm tham số cho một method chờ đợi một giá trị của kiểu primitive tương ứng
      • gán cho một biến của kiểu primitive tương ứng
    • 4.7.A.4 Class Integer method sau đây—including cả chức năng và thời điểm sử dụng—là một phần của Java Quick Reference:
      • static int parseInt(String s) trả về tham số String dưới dạng một int.
    • 4.7.A.5 Class Double method sau đây—including cả chức năng và thời điểm sử dụng—là một phần của Java Quick Reference:
      • static double parseDouble(String s) trả về tham số String dưới dạng một double.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    An ArrayList stores objects, not primitives, so a primitive is wrapped in an object: Integer wraps int, Double wraps double. Java does this with autoboxing 自动装箱 (int to Integer) and unboxing (back again) automatically, so you can write list.add(5) and int x = list.get(0).

    Tiếng Việt

    Một ArrayList lưu trữ đối tượng, không phải nguyên thủy, vì vậy một nguyên thủy được bao bọc trong một đối tượng: Integer bao bọc int, Double bao bọc double. Java thực hiện điều này tự động bằng autoboxing (int sang Integer) và unboxing (ngược lại), vì vậy bạn có thể viết list.add(5) và int x = list.get(0).

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    autoboxing/ˌɔːtəʊˈbɒksɪŋ/ autoboxing
    4.8

    The ArrayList Toolbox · ⁨Bộ dụng cụ ArrayList⁩

    Syllabus · ⁨Chương trình⁩
    Learning ObjectiveEssential Knowledge

    4.8.A
    Develop code for collections of related objects using ArrayList objects and determine the result of calling methods on these objects.

    • 4.8.A.1 An ArrayList object is mutable in size and contains object references.
    • 4.8.A.2 The ArrayList constructor ArrayList() constructs an empty list.
    • 4.8.A.3 Java allows the generic type ArrayList<E>, where the type parameter E specifies the type of the elements. When ArrayList<E> is specified, the types of the reference parameters and return type when using the ArrayList methods are type E. ArrayList<E> is preferred over ArrayList. For example, ArrayList<String> names = new ArrayList<String>(); allows the compiler to find errors that would otherwise be found at run-time.
    • 4.8.A.4 The ArrayList class is part of the java.util package. An import statement must be used to make this class available for use in the program.
    • 4.8.A.5 The following ArrayList methods—including what they do and when they are used—are part of the Java Quick Reference:
      • int size() returns the number of elements in the list.
      • boolean add(E obj) appends obj to end of list; returns true.
      • void add(int index, E obj) inserts obj at position index (0 <= index <= size), moving elements at position index and higher to the right (adds 1 to their indices) and adds 1 to size.
      • E get(int index) returns the element at position index in the list.
      • E set(int index, E obj) replaces the element at position index with obj; returns the element formerly at position index.
      • E remove(int index) removes element from position index, moving elements at position index + 1 and higher to the left (subtracts 1 from their indices) and subtracts 1 from size; returns the element formerly at position index.
    • 4.8.A.6 The indices for an ArrayList start at 0 and end at the number of elements - 1.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    What an ArrayList really is

    An ArrayList 动态数组 grows and shrinks as you add or remove items. Declare it with the element type in <>:

    Tiếng Việt
    ArrayList thực sự là gì

    Một ArrayList tăng và giảm kích thước khi bạn thêm hoặc xóa các mục. Khai báo nó với kiểu phần tử trong <>:

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

    Visiting Every Element of an ArrayList · ⁨Truy cập Every Element of an ArrayList⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.9.A: Develop code used to traverse the elements of an ArrayList and determine the results of these traversals.

    • 4.9.A.1 Traversing an ArrayList is when iteration or recursive statements are used to access all or an ordered sequence of the elements in an ArrayList.
    • 4.9.A.2 Deleting elements during a traversal of an ArrayList requires the use of special techniques to avoid skipping elements.
    • 4.9.A.3 Attempting to access an index value outside of its range will result in an IndexOutOfBoundsException.
    • 4.9.A.4 Changing the size of an ArrayList while traversing it using an enhanced for loop can result in a ConcurrentModificationException. Therefore, when using an enhanced for loop to traverse an ArrayList, you should not add or remove elements.
    Tiếng Việt

    Mục tiêu học tập 4.9.A: Viết mã để duyệt qua các phần tử của một ArrayList và xác định kết quả của các lần duyệt này.

    • 4.9.A.1 Duyệt qua một ArrayList là khi sử dụng các câu lệnh lặp hoặc đệ quy để truy cập tất cả hoặc một chuỗi có thứ tự các phần tử trong một ArrayList.
    • 4.9.A.2 Xóa các phần tử trong quá trình duyệt qua một ArrayList đòi hỏi việc sử dụng các kỹ thuật đặc biệt để tránh bỏ sót các phần tử.
    • 4.9.A.3 Cố gắng truy cập giá trị chỉ số nằm ngoài phạm vi hợp lệ sẽ dẫn đến một IndexOutOfBoundsException.
    • 4.9.A.4 Thay đổi kích thước của một ArrayList trong lúc đang duyệt nó bằng vòng lặp for nâng cao có thể gây ra một ConcurrentModificationException. Do đó, khi sử dụng vòng lặp for nâng cao để duyệt qua một ArrayList, bạn không nên thêm hay xóa các phần tử.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Traverse with an index loop or a for-each loop, just like arrays (use size() and get(i)):

    Exam skill: when removing items in an index loop, either loop backwards or do not increment i after a removal – otherwise removing shifts elements left and you skip one. And never add or remove elements while traversing an ArrayList with a for-each loop: changing its size mid-loop throws a ConcurrentModificationException, so use an index loop (backwards, as above) whenever you must remove.

    Tiếng Việt

    Duyệt qua bằng vòng lặp chỉ mục hoặc vòng lặp for-each, giống như mảng (sử dụng size() và get(i)):

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

    Kỹ năng làm bài thi: khi xóa các mục trong vòng lặp chỉ mục, hãy duyệt ngược hoặc không tăng i sau khi xóa — nếu không, việc xóa sẽ dịch chuyển các phần tử sang trái và bạn sẽ bỏ sót một phần tử. Và tuyệt đối không thêm hoặc xóa các phần tử trong khi duyệt một ArrayList bằng vòng lặp for-each: thay đổi kích thước của nó giữa chừng vòng lặp sẽ gây ra lỗi ConcurrentModificationException, vì vậy hãy sử dụng vòng lặp chỉ mục (ngược, như trên) mỗi khi bạn phải xóa.

    4.10

    Standard ArrayList Algorithms · ⁨Thuật toán ArrayList Tiêu chuẩn⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.10.A: Develop code for standard and original algorithms for a particular context or specification that involve ArrayList objects and determine the result of these algorithms.

    • 4.10.A.1 There are standard ArrayList algorithms that utilize traversals to:
      • determine a minimum or maximum value
      • compute a sum or average
      • determine if at least one element has a particular property
      • determine if all elements have a particular property
      • determine the number of elements having a particular property
      • access all consecutive pairs of elements
      • determine the presence or absence of duplicate elements
      • shift or rotate elements left or right
      • reverse the order of the elements
      • insert elements
      • delete elements
    • 4.10.A.2 Some algorithms require multiple String, array, or ArrayList objects to be traversed simultaneously.
    Tiếng Việt

    Mục tiêu học tập 4.10.A: Viết mã cho các thuật toán tiêu chuẩn và nguyên bản cho một ngữ cảnh hoặc tài liệu mô tả cụ thể liên quan đến các đối tượng ArrayList và xác định kết quả của các thuật toán này.

    • 4.10.A.1 Có các thuật toán ArrayList tiêu chuẩn sử dụng phép duyệt để:
      • xác định giá trị tối thiểu hoặc tối đa
      • tính tổng hoặc trung bình cộng
      • xác định xem có ít nhất một phần tử nào có thuộc tính đặc biệt hay không
      • xác định xem tất cả các phần tử có thuộc tính đặc biệt hay không
      • xác định số lượng phần tử có thuộc tính đặc biệt
      • truy cập tất cả các cặp phần tử liên tiếp
      • xác định sự tồn tại hoặc không tồn tại của các phần tử trùng lặp
      • dịch chuyển hoặc xoay các phần tử sang trái hoặc phải
      • đảo ngược thứ tự của các phần tử
      • chèn phần tử
      • xóa phần tử
    • 4.10.A.2 Một số thuật toán yêu cầu nhiều đối tượng String, mảng, hoặc ArrayList được duyệt đồng thời.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    The same algorithms as arrays – max/min, count, sum – plus insertion and deletion that arrays cannot do easily. A common task is to remove all elements matching a condition, handling the index-shift carefully.

    Tiếng Việt

    Cùng các thuật toán như mảng — giá trị lớn nhất/nhỏ nhất, đếm, tổng — cộng thêm chèn và xóa mà mảng không thể thực hiện dễ dàng. Một nhiệm vụ phổ biến là xóa tất cả các phần tử khớp với một điều kiện, xử lý sự dịch chuyển chỉ mục cẩn thận.

    4.11

    Grids: Two-Dimensional Arrays · ⁨Lưới: Mảng Hai Chiều⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.11.A: Develop code used to represent collections of related data using two-dimensional (2D) array objects.

    • 4.11.A.1 A 2D array is stored as an array of arrays. Therefore, the way 2D arrays are created and indexed is similar to 1D array objects. The size of a 2D array is established at the time of creation and cannot be changed. 2D arrays can store either primitive data or object reference data.
      • Exclusion statement: Nonrectangular 2D array objects are outside the scope of the AP Computer Science A course and exam.
    • 4.11.A.2 When a 2D array is created using the keyword new, all of its elements are initialized to the default values for the element data type. The default value for int is 0, for double is 0.0, for boolean is false, and for a reference type is null.
    • 4.11.A.3 The initializer list used to create and initialize a 2D array consists of initializer lists that represent 1D arrays; for example, int[][] arr2D = { {1, 2, 3}, {4, 5, 6} };.
    • 4.11.A.4 The square brackets [row][col] are used to access and modify an element in a 2D array. For the purposes of the exam, when accessing the element at arr[first][second], the first index is used for rows, the second index is used for columns.
    • 4.11.A.5 A single array that is a row of a 2D array can be accessed using the 2D array name and a single set of square brackets containing the row index.
    • 4.11.A.6 The number of rows contained in a 2D array can be accessed through the length attribute. The valid row index values for a 2D array are 0 through one less than the number of rows or the length of the array, inclusive. The number of columns contained in a 2D array can be accessed through the length attribute of one of the rows. The valid column index values for a 2D array are 0 through one less than the number of columns or the length of any given row of the array, inclusive. For example, given a 2D array named values, the number of rows is values.length and the number of columns is values[0].length. Using an index value outside of these ranges will result in an ArrayIndexOutOfBoundsException.
    Tiếng Việt

    Mục tiêu học tập 4.11.A: Viết mã dùng để biểu diễn các bộ dữ liệu liên quan bằng cách sử dụng các đối tượng mảng hai chiều (2D).

    • 4.11.A.1 Mảng 2D được lưu trữ dưới dạng mảng của các mảng. Do đó, cách tạo và truy cập mảng 2D tương tự như các đối tượng mảng 1D. Kích thước của mảng 2D được xác định tại thời điểm tạo và không thể thay đổi. Mảng 2D có thể lưu trữ dữ liệu nguyên thủy hoặc dữ liệu tham chiếu đến đối tượng.
      • Câu loại trừ: Các đối tượng mảng 2D không hình chữ nhật nằm ngoài phạm vi của khóa học và kỳ thi AP Computer Science A.
    • 4.11.A.2 Khi tạo mảng 2D bằng từ khóa new, tất cả các phần tử của nó sẽ được khởi tạo với giá trị mặc định cho kiểu dữ liệu phần tử. Giá trị mặc định cho int là 0, cho double là 0.0, cho boolean là false, và cho kiểu tham chiếu là null.
    • 4.11.A.3 Danh sách khởi tạo dùng để tạo và khởi tạo mảng 2D bao gồm các danh sách khởi tạo đại diện cho mảng 1D; ví dụ, int[][] arr2D = { {1, 2, 3}, {4, 5, 6} };.
    • 4.11.A.4 Các dấu ngoặc vuông [row][col] được sử dụng để truy cập và thay đổi một phần tử trong mảng nhiều chiều 2D. Đối với mục đích của kỳ thi, khi truy cập phần tử tại vị trí arr[first][second], chỉ số đầu tiên dùng cho hàng, chỉ số thứ hai dùng cho cột.
    • 4.11.A.5 Một mảng đơn lẻ là một hàng của mảng 2D có thể được truy cập bằng tên mảng 2D và một cặp dấu ngoặc vuông chứa chỉ số hàng.
    • 4.11.A.6 Số lượng hàng chứa trong mảng 2D có thể truy cập thông qua thuộc tính length. Các giá trị chỉ số hàng hợp lệ cho mảng 2D là từ 0 đến ít hơn một so với số lượng hàng hoặc độ dài của mảng, bao gồm cả hai đầu mút. Số lượng cột chứa trong mảng 2D có thể truy cập thông qua thuộc tính length của một trong các hàng. Các giá trị chỉ số cột hợp lệ cho mảng 2D là từ 0 đến ít hơn một so với số lượng cột hoặc độ dài của bất kỳ hàng nào đã cho của mảng, bao gồm cả hai đầu mút. Ví dụ, với mảng 2D có tên là values, số lượng hàng là values.length và số lượng cột là values[0].length. Sử dụng giá trị chỉ số nằm ngoài các khoảng này sẽ dẫn đến lỗi ArrayIndexOutOfBoundsException.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    A 2D array 二维数组 is a grid (rows and columns) – an array of arrays:

    Tiếng Việt

    Một mảng 2D là một lưới (hàng và cột) — một mảng của các mảng:

    Mảng hai chiều (bảng) với chỉ số dòng và cột
    Một mảng hai chiều (bảng) với các chỉ mục hàng và cột
    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
    
    Explore · ⁨Khám phá⁩

    Index a 2D array by row and column · ⁨Truy xuất mảng 2D theo hàng và cột⁩

    A 2D array is a grid addressed by [row][col]. Move the indices and watch which cell they select — row first, then column, both counting from 0. · ⁨Một mảng 2D là lưới được truy xuất bằng [row][col]. Di chuyển các chỉ mục và xem chúng chọn ô nào — hàng trước, sau đó cột, cả hai đều đếm từ 0.⁩

    4.12

    Walking Through a Grid · ⁨Duyệt qua Lưới⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.12.A: Develop code used to traverse the elements in a 2D array and determine the result of these traversals.

    • 4.12.A.1 Nested iteration statements are used to traverse and access all or an ordered sequence of elements in a 2D array. Since 2D arrays are stored as arrays of arrays, the way 2D arrays are traversed using for loops and enhanced for loops is similar to 1D array objects. Nested iteration statements can be written to traverse the 2D array in row-major order, column-major order, or a uniquely defined order. Row-major order refers to an ordering of 2D array elements where traversal occurs across each row, whereas column-major order traversal occurs down each column.
    • 4.12.A.2 The outer loop of a nested enhanced for loop used to traverse a 2D array traverses the rows. Therefore, the enhanced for loop variable must be the type of each row, which is a 1D array. The inner loop traverses a single row. Therefore, the inner enhanced for loop variable must be the same type as the elements stored in the 1D array. Assigning a new value to the enhanced for loop variable does not change the value stored in the array.
    Tiếng Việt

    Mục tiêu học tập 4.12.A: Phát triển mã để duyệt qua các phần tử trong mảng 2D và xác định kết quả của việc duyệt này.

    • 4.12.A.1 Các câu lệnh lặp lồng nhau được sử dụng để duyệt và truy cập tất cả hoặc một chuỗi có thứ tự các phần tử trong mảng 2D. Vì mảng 2D được lưu trữ dưới dạng mảng của các mảng, cách duyệt mảng 2D sử dụng vòng lặp for và vòng lặp for nâng cao tương tự như các đối tượng mảng 1D. Các câu lệnh lặp lồng nhau có thể được viết để duyệt mảng 2D theo thứ tự chính hàng (row-major order), thứ tự chính cột (column-major order), hoặc một thứ tự được xác định độc lập. Thứ tự chính hàng đề cập đến thứ tự các phần tử mảng 2D nơi việc duyệt diễn ra dọc theo mỗi hàng, trong khi thứ tự chính cột duyệt xuống từng cột.
    • 4.12.A.2 Vòng lặp ngoài của vòng lặp lồng nhau for nâng cao dùng để duyệt mảng 2D sẽ duyệt qua các hàng. Do đó, biến của vòng lặp for nâng cao phải là kiểu của mỗi hàng, tức là mảng 1D. Vòng lặp bên trong duyệt một hàng duy nhất. Do đó, biến của vòng lặp for nâng cao bên trong phải cùng kiểu với các phần tử được lưu trữ trong mảng 1D. Gán một giá trị mới cho biến của vòng lặp for nâng cao không làm thay đổi giá trị được lưu trữ trong mảng.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Traversing a 2-D array

    Visit every cell with nested loops – the outer over rows, the inner over columns (row-major order 行主序):

    Tiếng Việt
    Duyệt qua mảng 2-D

    Truy cập every cell bằng vòng lặp lồng nhau — vòng ngoài duyệt hàng, vòng trong duyệt cột (thứ tự major hàng):

    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

    Standard 2D Array Algorithms · ⁨Thuật toán Mảng 2D Tiêu chuẩn⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.13.A: Develop code for standard and original algorithms for a particular context or specification that involves 2D arrays and determine the result of these algorithms.

    • 4.13.A.1 There are standard algorithms that utilize 2D array traversals to:
      • determine a minimum or maximum value of all the elements or for a designated row, column, or other subsection
      • compute a sum or average of all the elements or for a designated row, column, or other subsection
      • determine if at least one element has a particular property in the entire 2D array or for a designated row, column, or other subsection
      • determine if all elements of the 2D array or a designated row, column, or other subsection have a particular property
      • determine the number of elements in the 2D array or in a designated row, column, or other subsection having a particular property
      • access all consecutive pairs of elements
      • determine the presence or absence of duplicate elements in the 2D array or in a designated row, column, or other subsection
      • shift or rotate elements in a row left or right or in a column up or down
      • reverse the order of the elements in a row or column
    Tiếng Việt

    Mục tiêu học tập 4.13.A: Phát triển mã cho các thuật toán tiêu chuẩn và thuật toán gốc cho một ngữ cảnh hoặc yêu cầu cụ thể liên quan đến mảng 2D và xác định kết quả của các thuật toán này.

    • 4.13.A.1 Có các thuật toán tiêu chuẩn sử dụng việc duyệt mảng 2D để:
      • xác định giá trị nhỏ nhất hoặc lớn nhất của tất cả các phần tử hoặc cho một hàng, cột hoặc phân đoạn khác được chỉ định
      • tính tổng hoặc trung bình của tất cả các phần tử hoặc cho một hàng, cột hoặc phân đoạn khác được chỉ định
      • xác định xem có ít nhất một phần tử có đặc tính nhất định trong toàn bộ mảng 2D hoặc cho một hàng, cột hoặc phân đoạn khác được chỉ định hay không
      • xác định xem tất cả các phần tử của mảng 2D hoặc một hàng, cột hoặc phân đoạn khác được chỉ định có đặc tính nhất định hay không
      • xác định số lượng phần tử trong mảng 2D hoặc trong một hàng, cột hoặc phân đoạn khác được chỉ định có đặc tính nhất định
      • truy cập tất cả các cặp phần tử liên tiếp
      • xác định sự hiện diện hoặc vắng mặt của các phần tử trùng lặp trong mảng 2D hoặc trong một hàng, cột hoặc phân đoạn khác được chỉ định
      • dịch chuyển hoặc xoay các phần tử trong một hàng sang trái hoặc phải, hoặc trong một cột lên hoặc xuống
      • đảo ngược thứ tự các phần tử trong một hàng hoặc cột

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English

    Typical grid tasks: sum a row or column, find the max in the grid, count matching cells, or sum a diagonal (where r == c). Each is a nested traversal with a running result.

    Tiếng Việt

    Các nhiệm vụ lưới điển hình: tính tổng một hàng hoặc cột, tìm giá trị lớn nhất trong lưới, đếm các ô khớp, hoặc tính tổng đường chéo (nơi r == c). Mỗi cái là một lần duyệt lồng nhau với kết quả tích lũy.

    4.14

    Finding a Value: Linear and Binary Search · ⁨Tìm Giá trị: Tìm kiếm Tuyến tính và Tìm kiếm Nhị phân⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.14.A: Develop code used for linear search algorithms to search for specific information in a collection and determine the results of executing a search.

    • 4.14.A.1 Linear search algorithms are standard algorithms that check each element in order until the desired value is found or all elements in the array or ArrayList have been checked. Linear search algorithms can begin the search process from either end of the array or ArrayList.
    • 4.14.A.2 When applying linear search algorithms to 2D arrays, each row must be accessed then linear search applied to each row of the 2D array.
    Tiếng Việt

    Mục tiêu học tập 4.14.A: Phát triển mã sử dụng cho thuật toán tìm kiếm tuyến tính để tìm kiếm thông tin cụ thể trong một tập hợp và xác định kết quả của việc thực thi tìm kiếm.

    • 4.14.A.1 Thuật toán tìm kiếm tuyến tính là các thuật toán tiêu chuẩn kiểm tra từng phần tử theo thứ tự cho đến khi tìm thấy giá trị mong muốn hoặc tất cả các phần tử trong mảng hoặc ArrayList đã được kiểm tra. Thuật toán tìm kiếm tuyến tính có thể bắt đầu quá trình tìm kiếm từ một trong hai đầu của mảng hoặc ArrayList.
    • 4.14.A.2 Khi áp dụng thuật toán tìm kiếm tuyến tính vào mảng 2D, mỗi hàng phải được truy cập trước sau đó áp dụng tìm kiếm tuyến tính cho từng hàng của mảng 2D.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Binary search: halve and conquer
    • Linear search 线性搜索 checks each element in turn – works on any list, taking up to $n$ steps.
    • Binary search 二分搜索 works only on a sorted list: check the middle, then discard the half that cannot contain the target, repeating. It takes about $\log_2 n$ steps – far faster on large data.

    Exam skill: binary search requires sorted data; know how many comparisons it makes and how lo, hi, mid update.

    Worked example. Search for target = 40 in the sorted array {3, 9, 14, 23, 31, 42, 55} (indices 0–6). Start lo=0, hi=6:

    • mid = (0+6)/2 = 3, a[3]=23 < 40, so lo = 4;
    • mid = (4+6)/2 = 5, a[5]=42 > 40, so hi = 4;
    • mid = (4+4)/2 = 4, a[4]=31 < 40, so lo = 5;
    • now lo (5) > hi (4), so the loop ends – 40 is not present.

    Each step halved the range, so even this miss took only three comparisons.

    Tiếng Việt
    Tìm kiếm nhị phân: chia đôi và chinh phục
    • Tìm kiếm tuyến tính kiểm tra từng phần tử lần lượt – hoạt động trên mọi danh sách, tốn tối đa $n$ bước.
    • Tìm kiếm nhị phân chỉ hoạt động trên danh sách đã được sắp xếp: kiểm tra phần tử giữa, sau đó loại bỏ nửa không chứa mục tiêu, lặp lại. Tốn khoảng $\log_2 n$ bước – nhanh hơn nhiều với dữ liệu lớn.
    Tìm kiếm nhị phân thu hẹp phạm vi một nửa ở mỗi bước
    Tìm kiếm nhị phân thu hẹp phạm vi một nửa ở mỗi bước
    Tìm kiếm tuyến tính kiểm tra từng phần tử lần lượt cho đến khi tìm thấy mục tiêu
    Tìm kiếm tuyến tính kiểm tra từng phần tử lần lượt cho đến khi tìm thấy mục tiêu
    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;
    }
    

    Kỹ năng làm bài thi: tìm kiếm nhị phân yêu cầu dữ liệu đã sắp xếp; hãy biết số phép so sánh và cách lo, hi, mid cập nhật.

    Ví dụ minh họa. Tìm target = 40 trong mảng đã sắp xếp {3, 9, 14, 23, 31, 42, 55} (chỉ số 0–6). Bắt đầu lo=0, hi=6:

    • mid = (0+6)/2 = 3, a[3]=23 < 40, nên lo = 4;
    • mid = (4+6)/2 = 5, a[5]=42 > 40, nên hi = 4;
    • mid = (4+4)/2 = 4, a[4]=31 < 40, nên lo = 5;
    • giờ lo (5) > hi (4), nên vòng lặp kết thúc – 40 không tồn tại.

    Mỗi bước đều thu hẹp phạm vi một nửa, nên ngay cả lần thất bại này cũng chỉ tốn ba phép so sánh.

    Explore · ⁨Khám phá⁩

    Compare linear and binary search · ⁨So sánh tìm kiếm tuyến tính và nhị phân⁩

    Linear search checks every element in turn; binary search halves a sorted list each step. Watch binary search reach the target in far fewer comparisons. · ⁨Tìm kiếm tuyến tính kiểm tra từng phần tử theo thứ tự; tìm kiếm nhị phân chia đôi một danh sách đã sắp xếp ở mỗi bước. Quan sát tìm kiếm nhị phân đạt đích trong ít so sánh hơn nhiều.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    Linear search/ˈlɪnɪə sɜːtʃ/ Tìm kiếm tuyến tính
    Binary search/ˈbaɪnəri sɜːtʃ/ Tìm kiếm nhị phân
    4.15

    Putting Data in Order: Selection and Insertion Sort · ⁨Sắp Xếp Dữ Liệu: Selection Sort và Insertion Sort⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.15.A: Determine the result of executing each step of sorting algorithms to sort the elements of a collection.

    • 4.15.A.1 Selection sort and insertion sort are iterative sorting algorithms that can be used to sort elements in an array or ArrayList.
    • 4.15.A.2 Selection sort repeatedly selects the smallest (or largest) element from the unsorted portion of the list and swaps it into its correct (and final) position in the sorted portion of the list.
    • 4.15.A.3 Insertion sort inserts an element from the unsorted portion of a list into its correct (but not necessarily final) position in the sorted portion of the list by shifting elements of the sorted portion to make room for the new element.
    Tiếng Việt

    Mục tiêu học tập 4.15.A: Xác định kết quả của việc thực thi từng bước của các thuật toán sắp xếp để sắp xếp các phần tử của một tập hợp.

    • 4.15.A.1 Sắp xếp chọn (selection sort) và sắp xếp chèn (insertion sort) là các thuật toán sắp xếp lặp lại có thể được sử dụng để sắp xếp các phần tử trong mảng hoặc ArrayList.
    • 4.15.A.2 Sắp xếp chọn liên tục chọn phần tử nhỏ nhất (hoặc lớn nhất) từ phần chưa sắp xếp của danh sách và hoán đổi nó vào đúng (và cuối cùng) vị trí trong phần đã sắp xếp của danh sách.
    • 4.15.A.3 Sắp xếp chèn (Insertion sort) chèn một phần tử từ phần chưa sắp xếp của danh sách vào vị trí đúng (nhưng không nhất thiết là vị trí cuối cùng) trong phần đã sắp xếp của danh sách bằng cách dịch chuyển các phần tử của phần đã sắp xếp để tạo chỗ cho phần tử mới.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Insertion sort
    Bubble sort, pass by pass
    • Selection sort 选择排序 repeatedly finds the smallest remaining element and swaps it into place.
    • Insertion sort 插入排序 grows a sorted front, inserting each new element where it belongs.

    Both are simple and take about $n^2$ steps on average – fine for small arrays. Be able to trace the array after each pass.

    Tiếng Việt
    Insertion sort
    Thuật toán sắp xếp nổi bọt, qua từng lượt
    • Selection sort liên tục tìm phần tử nhỏ nhất còn lại và hoán đổi nó vào đúng vị trí.
    • Insertion sort xây dựng phần đầu đã sắp xếp, chèn mỗi phần tử mới vào nơi phù hợp.
    Sắp xếp chèn, dịch chuyển mỗi khóa vào đúng vị trí qua từng lượt
    Một thuật toán insertion sort, dịch chuyển từng khóa vào đúng vị trí qua từng lượt

    Cả hai đều đơn giản và tốn khoảng $n^2$ bước trung bình – tốt cho mảng nhỏ. Bạn cần có thể theo dõi trạng thái mảng sau mỗi lượt.

    Explore · ⁨Khám phá⁩

    Watch a sorting algorithm order a list · ⁨Quan sát thuật toán sắp xếp sắp xếp một danh sách⁩

    A sort rearranges elements into order. Step through selection/insertion sort to see the sorted region grow one element at a time. · ⁨Một sắp xếp sắp xếp lại các phần tử theo thứ tự. Bước qua selection/insertion sort để thấy vùng đã sắp xếp mở rộng thêm một phần tử mỗi lần.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    Selection sort/sɪˈlekʃn sɔːt/ Sắp xếp theo lựa chọn
    Insertion sort/ɪnˈsɜːʃn sɔːt/ Sắp xếp chèn
    4.16

    Methods That Call Themselves: Recursion · ⁨Phương Thức Gọi Chính Nó: Đệ Quy⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.16.A: Determine the result of calling recursive methods.

    • 4.16.A.1 A recursive method is a method that calls itself. Recursive methods contain at least one base case, which halts the recursion, and at least one recursive call. Recursion is another form of repetition.
    • 4.16.A.2 Each recursive call has its own set of local variables, including the parameters. Parameter values capture the progress of a recursive process, much like loop control variable values capture the progress of a loop.
    • 4.16.A.3 Any recursive solution can be replicated through the use of an iterative approach and vice versa.
      • Exclusion statement: Writing recursive code is outside the scope of the AP Computer Science A course and exam.
    Tiếng Việt

    Mục tiêu học tập 4.16.A: Xác định kết quả của việc gọi các phương pháp đệ quy.

    • 4.16.A.1 Một phương pháp đệ quy là phương pháp gọi chính nó. Các phương pháp đệ quy chứa ít nhất một trường hợp cơ sở, giúp dừng quá trình đệ quy, và ít nhất một lời gọi đệ quy. Đệ quy là một hình thức lặp lại khác.
    • 4.16.A.2 Mỗi lần gọi đệ quy có bộ biến cục bộ riêng, bao gồm cả tham số. Giá trị tham số ghi nhận tiến trình của quá trình đệ quy, tương tự như giá trị biến điều khiển vòng lặp ghi nhận tiến trình của vòng lặp.
    • 4.16.A.3 Bất kỳ giải pháp nào sử dụng đệ quy cũng có thể được tái tạo thông qua phương pháp lặp, và ngược lại.
      • Khẳng định loại trừ: Việc viết mã đệ quy nằm ngoài phạm vi của khóa học và bài thi AP Computer Science A.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Recursion & the call stack

    Recursion 递归 is a method that calls itself on a smaller input. It needs a base case 基本情况 that stops the calls, and a recursive case that moves toward the base:

    Without a reachable base case, recursion never stops (a stack overflow).

    Recursion and iteration are interchangeable. Any recursive solution can be rewritten with a loop (an iterative approach), and any loop can be rewritten with recursion - they solve the same problems. The factorial above is identical in effect to an iterative version:

    So the choice is about clarity, not capability: recursion reads naturally for problems with a self-similar structure (trees, merge sort), while iteration avoids the memory cost of stacking a call frame per step. The exam may ask you to convert one into the other.

    Tiếng Việt
    Đệ quy và ngăn gọi hàm

    Đệ quy là phương thức gọi chính nó với đầu vào nhỏ hơn. Nó cần một trường hợp cơ sở để dừng các cuộc gọi, và một trường hợp đệ quy tiến gần về trường hợp cơ sở:

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

    Không có trường hợp cơ sở đạt được, đệ quy sẽ không bao giờ dừng (lỗi tràn ngăn gọi hàm).

    Đệ quy và lặp có thể thay thế cho nhau. Mọi giải pháp đệ quy đều có thể viết lại bằng vòng lặp (phương pháp lặp), và mọi vòng lặp đều có thể viết lại bằng đệ quy - chúng giải quyết cùng một vấn đề. Code factorial ở trên tương đương về hiệu quả với phiên bản lặp:

    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;
    }
    

    Vì vậy, sự lựa chọn nằm ở sự rõ ràng, không phải khả năng: đệ quy đọc tự nhiên đối với các vấn đề có cấu trúc tự tương đồng (cây, merge sort), trong khi lặp tránh chi phí bộ nhớ của việc lưu khung gọi hàm cho mỗi bước. Đề thi có thể yêu cầu bạn chuyển đổi từ dạng này sang dạng kia.

    Explore · ⁨Khám phá⁩

    Unfold a recursive call · ⁨Phân rã một cuộc gọi đệ quy⁩

    A recursive method calls itself on a smaller input until it hits a base case, then the results fold back up. Step through to watch the calls stack and unwind. · ⁨Một phương thức đệ quy gọi chính nó trên đầu vào nhỏ hơn cho đến khi chạm trạng thái cơ sở, sau đó các kết quả được gộp lại. Bước qua để quan sát các cuộc gọi xếp chồng và giải tán.⁩

    Vocabulary · ⁨Từ vựng⁩ Train · ⁨Luyện tập⁩
    English Tiếng Việt
    Recursion/rɪˈkɜːʃn/ Recursion
    base case/beɪs keɪs/ trường hợp cơ sở
    Merge sort/mɜːdʒ sɔːt/ Sắp xếp gộp
    4.17

    Recursive Search and Merge Sort · ⁨Tìm Kiếm và Sắp Xếp Lặp Trong Đệ Quy⁩

    Syllabus · ⁨Chương trình⁩
    English

    Learning Objective 4.17.A: Determine the result of executing recursive algorithms that use strings or collections.

    • 4.17.A.1 Recursion can be used to traverse String objects, arrays, and ArrayList objects.

    Learning Objective 4.17.B: Determine the result of each iteration of a binary search algorithm used to search for information in a collection.

    • 4.17.B.1 Data must be in sorted order to use the binary search algorithm. Binary search starts at the middle of a sorted array or ArrayList and eliminates half of the array or ArrayList in each recursive call until the desired value is found or all elements have been eliminated.
    • 4.17.B.2 Binary search is typically more efficient than linear search.
      • Exclusion statement: Search algorithms other than linear and binary search are outside the scope of the AP Computer Science A course and exam.
    • 4.17.B.3 The binary search algorithm can be written either iteratively or recursively.

    Learning Objective 4.17.C: Determine the result of each iteration of the merge sort algorithm when used to sort a collection.

    • 4.17.C.1 Merge sort is a recursive sorting algorithm that can be used to sort elements in an array or ArrayList.
      • Exclusion statement: Sorting algorithms other than selection, insertion, and merge sort are outside the scope of the AP Computer Science A course and exam.
    • 4.17.C.2 Merge sort repeatedly divides an array into smaller subarrays until each subarray is one element and then recursively merges the sorted subarrays back together in sorted order to form the final sorted array.
    Tiếng Việt

    Mục tiêu học tập 4.17.A: Xác định kết quả của việc thực thi các thuật toán đệ quy sử dụng chuỗi hoặc tập hợp dữ liệu.

    • 4.17.A.1 Đệ quy có thể được sử dụng để duyệt qua String đối tượng, mảng và ArrayList đối tượng.

    Mục tiêu học tập 4.17.B: Xác định kết quả của mỗi lần lặp của thuật toán tìm kiếm nhị phân được sử dụng để tìm thông tin trong một tập hợp dữ liệu.

    • 4.17.B.1 Dữ liệu phải được sắp xếp theo thứ tự để sử dụng thuật toán tìm kiếm nhị phân. Tìm kiếm nhị phân bắt đầu ở giữa mảng hoặc ArrayList đã sắp xếp và loại bỏ một nửa mảng hoặc ArrayList trong mỗi lần gọi đệ quy cho đến khi giá trị mong muốn được tìm thấy hoặc tất cả các phần tử đã bị loại bỏ.
    • 4.17.B.2 Tìm kiếm nhị phân thường hiệu quả hơn tìm kiếm tuyến tính.
      • Khẳng định loại trừ: Các thuật toán tìm kiếm khác ngoài tìm kiếm tuyến tính và nhị phân nằm ngoài phạm vi của khóa học và bài thi AP Computer Science A.
    • 4.17.B.3 Thuật toán tìm kiếm nhị phân có thể được viết theo dạng lặp hoặc đệ quy.

    Mục tiêu học tập 4.17.C: Xác định kết quả của mỗi lần lặp của thuật toán sắp xếp gộp (merge sort) khi được sử dụng để sắp xếp một tập hợp dữ liệu.

    • 4.17.C.1 Sắp xếp gộp (Merge sort) là thuật toán sắp xếp đệ quy có thể được sử dụng để sắp xếp các phần tử trong mảng hoặc ArrayList.
      • Khẳng định loại trừ: Các thuật toán sắp xếp khác ngoài sắp xếp chọn, sắp xếp chèn và sắp xếp gộp nằm ngoài phạm vi của khóa học và bài thi AP Computer Science A.
    • 4.17.C.2 Sắp xếp gộp liên tục chia mảng thành các mảng con nhỏ hơn cho đến khi mỗi mảng con chỉ còn một phần tử, sau đó đệ quy gộp các mảng con đã sắp xếp trở lại với nhau theo thứ tự để tạo thành mảng đã sắp xếp cuối cùng.

    Source: College Board AP Course and Exam Description · ⁨Nguồn: Mô tả Khóa học và Bài thi College Board AP⁩

    English
    Merge sort: split, then merge

    Recursion powers efficient algorithms. Binary search can be written recursively (search the correct half). Merge sort 归并排序 splits the array in half, sorts each half recursively, then merges the two sorted halves – taking about $n\log_2 n$ steps, much faster than selection or insertion sort on large data.

    Worked example. Trace factorial(4). Each call defers to a smaller one: factorial(4) = 4 * factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1). factorial(1) hits the base case and returns 1, so the calls unwind inward: 2 * 1 = 2, then 3 * 2 = 6, then 4 * 6 = 24. Writing each call above its returned value is the reliable way to trace recursion.

    Exam skill: trace a recursive method by writing out each call and its return value, and know that merge sort's efficiency ($n\log n$) beats the $n^2$ simple sorts.

    Tiếng Việt
    Sắp xếp hợp nhất: chia, sau đó gộp

    Đệ quy cung cấp sức mạnh cho các thuật toán hiệu quả. Tìm kiếm nhị phân có thể viết dưới dạng đệ quy (tìm kiếm trong nửa đúng). Merge sort chia đôi mảng, sắp xếp mỗi nửa đệ quy, sau đó gộp hai nửa đã sắp xếp lại với nhau – tốn khoảng $n\log_2 n$ bước, nhanh hơn nhiều so với selection sort hoặc insertion sort trên dữ liệu lớn.

    Sắp xếp gộp chia mảng thành các phần tử đơn lẻ, sau đó gộp các nửa đã sắp xếp lại lên trên
    Merge sort chia mảng thành từng phần tử đơn lẻ, sau đó gộp các nửa đã sắp xếp trở lên

    Ví dụ minh họa. Theo dõi factorial(4). Mỗi lần gọi sẽ chuyển sang một lần gọi nhỏ hơn: factorial(4) = 4 * factorial(3) = 4 * 3 * factorial(2) = 4 * 3 * 2 * factorial(1). factorial(1) chạm đến trạng thái cơ sở và trả về 1, do đó các lần gọi được giải nén từ ngoài vào trong: 2 * 1 = 2, sau đó là 3 * 2 = 6, rồi 4 * 6 = 24. Việc viết mỗi lần gọi ngay trên giá trị mà nó trả về là cách theo dõi đệ quy đáng tin cậy nhất.

    Kỹ năng làm bài thi: theo dõi một phương thức đệ quy bằng cách viết ra từng cuộc gọi và giá trị trả về, và biết rằng độ hiệu quả của merge sort ($n\log n$) vượt trội hơn so với các thuật toán sắp xếp đơn giản ($n^2$).

    4.17

    Exam tips · ⁨Mẹo làm bài thi⁩

    English
    • Weigh both benefits and harms of collecting data — this unit is tested through short written justification, not code.
    • Protect personally identifiable information (PII) and explain privacy and security risks in context.
    • Name real harms: data breaches, surveillance, and algorithmic bias from unrepresentative data.
    • Respect intellectual property and licensing when you reuse code or data.
    • Give a specific, reasoned answer — a vague "it could be bad" earns no marks.
    Tiếng Việt
    • Cân nhắc cả lợi ích và tác hại của việc thu thập dữ liệu — đơn vị này được kiểm tra qua đoạn văn giải thích ngắn, không phải code.
    • Bảo vệ thông tin cá nhân nhận diện được (PII) và giải thích các rủi ro về quyền riêng tư và bảo mật trong ngữ cảnh cụ thể.
    • Nêu các tác hại thực tế: rò rỉ dữ liệu, giám sát, và thiên kiến thuật toán do dữ liệu không đại diện.
    • Tôn trọng quyền sở hữu trí tuệ và giấy phép khi tái sử dụng code hoặc dữ liệu.
    • Đưa ra câu trả lời cụ thể, có lý lẽ — một câu trả lời mơ hồ như "nó có thể gây hại" sẽ không được điểm.

Log in or create account · ⁨Đăng nhập hoặc tạo tài khoản⁩

IGCSE, A-Level & AP