Перейти к содержанию
Предметы

AP Информатика A

Советы

AP Computer Science A — курс на Java: объекты и классы, базовые типы и управление потоком, написание классов, массивы и ArrayLists, 2D массивы, наследование и полиморфизм и рекурсия. Это первый курс программирования, изучаемый на реальном объектно-ориентированном коде, а не псевдокоде.

Все четыре вопроса с развернутым ответом решаются письменной Java. Компилятор не поймёт отсутствие точки с запятой или неверный тип возврата, поэтому пишите код на бумаге во время повторения — это навык отличный от набора текста.

Массивы и ArrayLists — самая тестируемая тема. Свободное владение обходом, вставкой и удалением, а также знание того, какой индекс сдвигается при удалении элемента, окупается больше, чем любой другой час практики.

Материалы охватывают разделы CED на Java с работающими примерами, которые можно редактировать в браузере. Прошлые FRQ и критерии оценки в библиотеке — все четыре являются задачами на написание кода, поэтому разобраны полные методы, а не фрагменты.

  • 1

    Использование объектов и методов

    Смотреть урок
    1.1

    Введение в алгоритмы, программирование и компиляторы

    Программа

    Цель обучения 1.1.A: Представлять закономерности и алгоритмы, встречающиеся в повседневной жизни, с помощью письменного текста или диаграмм.

    • 1.1.A.1 Алгоритмы определяют пошаговые процессы, которые необходимо выполнить для выполнения задачи или решения проблемы. Эти алгоритмы могут быть представлены с помощью письменного текста или диаграмм.
    • 1.1.A.2 Последовательность определяет порядок выполнения шагов в процессе. Шаги в процессе выполняются по одному за другим.

    Цель обучения 1.1.B: Объяснять процесс компиляции и выполнения кода.

    • 1.1.B.1 Код может быть написан в любом текстовом редакторе; однако часто используется средство разработки (IDE), потому что оно предоставляет инструменты для программиста, чтобы писать, компилировать и запускать код.
    • 1.1.B.2 Компилятор проверяет код на наличие некоторых ошибок. Ошибки, обнаруживаемые компилятором, должны быть исправлены до того, как программу можно будет запустить.

    Цель обучения 1.1.C: Определять типы ошибок программирования.

    • 1.1.C.1 Синтаксическая ошибка — это ошибка в программе, в которой не соблюдены правила языка программирования. Эти ошибки обнаруживаются компилятором.
    • 1.1.C.2 Логическая ошибка — это ошибка в алгоритме или программе, которая вызывает неправильное или неожиданный результат. Эти ошибки обнаруживаются тестированием программы с использованием конкретных данных для проверки, дает ли она ожидаемый результат.
    • 1.1.C.3 Ошибка времени выполнения — это ошибка в программе, которая возникает во время выполнения программы. Ошибки времени выполнения обычно приводят к abnormalному завершению работы программы.
    • 1.1.C.4 Исключение — это тип ошибки времени выполнения, который возникает в результате неожиданной ошибки, не обнаруженной компилятором. Оно нарушает нормальный поток выполнения программы.

    Источник: Описание курса и экзамена College Board AP

    Исходный код на рабочей станции — программы пишутся, компилируются и выполняются как точные инструкции
    Исходный код на рабочей станции — программы пишутся, компилируются и выполняются как точные инструкции

    Алгоритм — это конечная пошаговая процедура решения задачи. Программа выражает алгоритм на языке, который может выполнить компьютер. Java является компилируемым: компилятор переводит ваш исходный код в байт-код, который выполняет виртуальная машина Java (JVM). Синтаксическая ошибка (нарушение грамматики) ловится компилятором; логическая ошибка (неправильный результат) нет — программа выполняется, но ведет себя неверно.

    Компилятор переводит всю программу целиком; интерпретатор выполняет её построчно
    Компилятор переводит всю программу целиком; интерпретатор выполняет её строчку за строчкой
    Несколько чипов процессора компьютера, вид снизу
    Ваша программа на Java компилируется в инструкции, которые выполняет центральный процессор, подобный одному из этих
    English Русский
    compiler/kəmˈpaɪlə/ компилятор
    syntax error/ˈsɪntæks ˈerə/ синтаксическая ошибка
    logic error/ˈlɒdʒɪk ˈerə/ логическая ошибка
    variable/ˈveərɪəbl/ переменной
    1.2

    Переменные и типы данных

    Программа

    Цель обучения 1.2.A: Определить наиболее подходящий тип данных для конкретного задания.

    • 1.2.A.1 Тип данных — это набор значений и соответствующий им набор операций над этими значениями. Типы данных можно классифицировать как примитивные или ссылочные.
    • 1.2.A.2 Примитивные типы данных, используемые в данном курсе, определяют набор значений и соответствующие операции над ними для чисел и логических значений.
    • 1.2.A.3 Ссылочный тип используется для определения объектов, которые не являются примитивными типами.

    Цель обучения 1.2.B: Написать код для объявления переменных хранения чисел и логических значений.

    • 1.2.B.1 Три примитивных типа данных, используемых в этом курсе: int, double и boolean. Значение int является целым числом. Значение double является вещественным числом. Значение boolean может быть либо true, либо false.
      • Исключение из программы: Остальные пять примитивных типов данных (long, short, byte, float и char) выходят за рамки курса и экзамена AP Computer Science A.
    • 1.2.B.2 Переменная — это место хранения, содержащее значение, которое может изменяться во время выполнения программы. У каждой переменной есть имя и связанный с ней тип данных. Переменная примитивного типа хранит примитивное значение этого типа.

    Источник: Описание курса и экзамена College Board AP

    Переменная — это именованная ячейка, хранящая значение фиксированного типа. Основные примитивные типы Java — это int (целые числа), double (дробные числа) и boolean (true/false). Объявляются типом сначала:

    Базовые типы данных Java, каждый из которых хранит определенный тип значения
    Базовые типы данных Java, каждый хранит типовых значений
    int score = 90;
    double price = 4.99;
    boolean passed = true;
    
    Исследовать

    Исследуйте, как переменная хранит одно значение за раз

    Переменная — это именованная ячейка, хранящая одно значение фиксированного типа. Пройдитесь по строкам кода и следите, как каждая ячейка получает свое значение; обратите внимание, что повторное присваивание score перезаписывает старое число, а не создает новую ячейку.

    English Русский
    type/taɪp/ текст (типографика)
    primitive types/ˈprɪmɪtɪv taɪps/ простые типы данных
    expression/ekˈspreʃn/ выражение
    modulus/ˈmɒdjʊləs/ модуль
    escape sequence/eˈskeɪp ˈsiːkwəns/ последовательность выхода
    assignment/əˈsaɪnmənt/ присваиванием
    1.3

    Выражения и вывод

    Программа

    Цель обучения 1.3.A: Написать код для вывода информации и определить результат, который будет отображен.

    • 1.3.A.1 System.out.print и System.out.println выводят информацию на экран компьютера. System.out.println перемещает курсор на новую строку после вывода информации, тогда как System.out.print этого не делает.

    Цель обучения 1.3.B: Написать код для использования строковых литералов и определить результат их применения.

    • 1.3.B.1 Литерал — это кодовая запись фиксированного значения.
    • 1.3.B.2 Строковый литерал — это последовательность символов, заключенная в двойные кавычки.
    • 1.3.B.3 Последовательности экранирования — это специальные последовательности символов, которые могут быть включены в строку. Они начинаются со знака обратного слеша (\) и имеют специальное значение в Java. Последовательности экранирования, используемые в этом курсе: двойная кавычка \", обратный слеш \\ и символ новой строки \n.

    Цель обучения 1.3.C: Написать код для арифметических выражений и определить результат этих выражений.

    • 1.3.C.1 Арифметические выражения, состоящие из числовых значений, переменных и операторов, включают выражения типов int и double.
    • 1.3.C.2 Арифметические операторы включают сложение +, вычитание -, умножение *, деление / и остаток от деления %. Арифметическая операция, использующая два значения int, даст результат в виде значения int. Арифметическая операция, использующая хотя бы одно значение double, даст результат в виде значения double.
      • Исключение: Выражения, дающие специальные значения double (например, бесконечности и NaN), выходят за рамки курса и экзамена AP Computer Science A.
    • 1.3.C.3 При делении числовых значений, оба из которых являются int-значениями, результатом является только целая часть частного. При делении числовых значений, в которых используется хотя бы одно double-значение, результатом является частное.
    • 1.3.C.4 Оператор остатка от деления % используется для вычисления остатка, когда одно число a делится на другое число b.
      • Замечание об исключении: Использование значений меньше 0 для a и использование значений меньше или равных 0 для b выходит за рамки курса и экзамена AP Computer Science A.
    • 1.3.C.5 Операторы могут использоваться для создания составных выражений. На этапе компиляции числовые значения связываются с операторами согласно приоритету операторов для определения способа их группировки. Скобки могут использоваться для изменения приоритета операторов. Умножение, деление и остаток от деления имеют более высокий приоритет, чем сложение и вычитание. Операторы с одинаковым приоритетом вычисляются слева направо.
    • 1.3.C.6 Попытка разделить целое число на целую ноль приведет к возникновению ошибки ArithmeticException.
      • Замечание об исключении: Использование деления на ноль, когда одно числовое значение является double-значением, выходит за рамки курса и экзамена AP Computer Science A.

    Источник: Описание курса и экзамена College Board AP

    Выражение сочетает значения и операторы для вычисления результата: + - * / и % (остаток от деления, остаток). Целочисленное деление отбрасывает дробную часть: 7 / 2 равно 3, тогда как 7 % 2 равно 1. Приоритет операторов следует математике (*,/,% перед +,-). Печать с помощью:

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

    Деление целого числа на целое число 0 (например, на 7 / 0) запрещено и вызывает ошибку во время выполнения программы с возникновением исключения ArithmeticException. Внутри строки обратный слэш обозначает специальную последовательность: конструкция \" выводит двойную кавычку, \\ — одинарный обратный слэш, а \n начинает новую строку — поэтому вызов System.out.println("She said \"hi\""); выведет результат She said "hi".

    Исследовать

    Исследуйте порядок выполнения операций шаг за шагом

    Java применяет *, /, % до + и -, работая слева направо. Наблюдайте за каждым шагом и поймите, почему 2 + 3 * 4 равно $14$, а не $20$ — умножение выполняется первым.

    1.4

    Операторы присваивания и ввод

    Программа

    Цель обучения 1.4.A: Писать код для операторов присваивания с выражениями и определять значение, которое сохраняется в переменной в результате этих операций.

    • 1.4.A.1 Каждой переменной должно быть присвоено значение до того, как она будет использована в выражении. Это значение должно принадлежать совместимому типу данных. Переменная инициализируется при первом присвоении ей значения. Типам ссылочных данных может быть присвоено новое значение объекта или null, если объект отсутствует. Буквальное значение null является специальным значением, используемым для указания на то, что ссылка не связана ни с каким объектом.
    • 1.4.A.2 Оператор присваивания = позволяет программе инициализировать или изменить значение, хранящееся в переменной. Значение выражения справа сохраняется в переменной слева.
      • Замечание об исключении: Использование операторов присваивания внутри выражений (например, a = b = 4; или a[i += 5]) выходит за рамки курса и экзамена AP Computer Science A.
    • 1.4.A.3 Во время выполнения выражение вычисляется для получения одного значения. Тип значения выражения определяется на основе его вычисления.

    Цель обучения 1.4.B: Писать код для чтения входных данных.

    • 1.4.B.1 Входные данные могут поступать в различных формах, таких как тактильные, аудиальные, визуальные или текстовые. Класс Scanner — это один из способов получения текстового ввода с клавиатуры.
      • Замечание об исключении: Любая конкретная форма ввода от пользователя выходит за рамки курса и экзамена AP Computer Science A.

    Источник: Описание курса и экзамена College Board AP

    Присваивание x = expr; вычисляет правую сторону и сохраняет её в левую переменную. Считывайте ввод с помощью Scanner:

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

    Приведение типов и диапазон переменных

    Программа

    Цель обучения 1.5.A: Писать код для приведения примитивных значений к различным примитивным типам в арифметических выражениях и определять получаемое в результате значение.

    • 1.5.A.1 Операторы приведения (int) и (double) могут использоваться для преобразования значения типа double в значение типа int (или наоборот).
    • 1.5.A.2 Приведение значения типа double к типу int приводит к отбрасыванию цифр после десятичной точки.
    • 1.5.A.3 Некоторые фрагменты кода вызывают автоматическое приведение (расширение) значений типа int к значениям типа double.
    • 1.5.A.4 Значения типа double можно округлить до ближайшего целого числа с помощью (int)(x + 0.5) для неотрицательных чисел или (int)(x - 0.5) для отрицательных чисел.

    Цель обучения 1.5.B: Описывать условия, при которых целочисленное выражение вычисляется в значение вне допустимого диапазона.

    • 1.5.B.1 Константа Integer.MAX_VALUE содержит значение максимально возможного значения типа int. Константа Integer.MIN_VALUE содержит значение минимально возможного значения типа int.
    • 1.5.B.2 Целочисленные значения в Java представлены значениями типа int, которые хранятся с использованием конечного объема памяти (4 байта). Следовательно, значение типа int должно находиться в диапазоне от Integer.MIN_VALUE до Integer.MAX_VALUE включительно.
    • 1.5.B.3 Если результат вычисления выражения должен был бы стать значением типа int, выходящим за пределы допустимого диапазона, происходит переполнение целого числа. Результатом станет значение типа int, находящееся в допустимом диапазоне, но не обязательно ожидаемое значение.

    Цель обучения 1.5.C: Описывать условия, ограничивающие точность выражений.

    • 1.5.C.1 Компьютеры выделяют определенное количество памяти для хранения данных в зависимости от типа данных. Если результат вычисления выражения должен был бы стать значением типа double, которое имеет большую точность, чем может быть сохранено в выделенном объеме памяти, возникает ошибка округления. Результат будет округлен до представимого значения. Чтобы избежать естественных ошибок округления, используйте значения типа int.
      • Замечание об исключении: Другие специальные типы данных для десятичных дробей, которые можно использовать для предотвращения ошибок округления, выходят за рамки курса и экзамена AP Computer Science A.

    Источник: Описание курса и экзамена College Board AP

    Диапазон int, переполнение и усечение

    У каждого типа есть фиксированный диапазон; при int происходит переполнение свыше примерно 2,1 миллиарда. Приведение типов (casting) преобразует между типами. Расширение (от int к double) происходит автоматически; сужение требует явного приведения, которое усекает (не округляет):

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

    Навык для экзамена: следите за целочисленным делением, дающим усеченный результат вместо ожидаемого дробного — приведите один из операндов к double заранее.

    Разобранный пример. Проследите каждое выражение:

    • 7 / 2 → 3 (оба int, поэтому деление усекает);
    • 7.0 / 2 → 3.5 (наличие одного double вынуждает вещественное деление);
    • 7 % 2 → 1 (остаток от деления);
    • (double) 7 / 2 → 3.5 (приведение типа связывается строже, чем /, поэтому результат является 7.0 / 2);
    • (double) (7 / 2) → 3.0 (скобки вычисляют 7 / 2 = 3 в int сначала, затем расширяют тип).

    Последние два выглядят похоже, но различаются — положение приведения типа определяет, где происходит отбрасывание дробной части.

    Исследовать

    Почему int и double хранят числа по-разному

    Значение int хранит только целые числа в фиксированном диапазоне; double хранит мантиссу и экспоненту, жертвуя точностью ради огромного диапазона. Приведение типа double→int отбрасывает дробную часть, а значение, выходящее за пределы диапазона int, вызывает переполнение.

    English Русский
    Casting/ˈkæstɪŋ/ Приведение типов
    library/ˈlaɪbrəri/ библиотекой
    abstraction/əbˈstrækʃn/ абстракцией
    Comments/ˈkɒments/ Комментарии
    method signature/ˈmeθəd ˈsɪɡnɪtʃə/ подпись метода
    arguments/ˈɑːɡjuːmənts/ аргументы
    class (static) method/klæs ˈmeθəd/ классический (статический) метод
    1.6

    Операторы составного присваивания

    Программа

    Цель обучения 1.6.A: Писать код для операторов присваивания со составными операторами присваивания и определять значение, которое сохраняется в переменной в результате.

    • 1.6.A.1 Компоунд-присваивание операторы (+=, -=, *=, /= и %=) могут использоваться вместо оператора присваивания в числовых выражениях. Компоунд-оператор выполняет указанную арифметическую операцию между значением слева и значением справа, а затем присваивает результат переменной слева.
    • 1.6.A.2 Оператор постинкремента ++ и оператор постдеcrementa -- используются для прибавления 1 или вычитания 1 из сохраняемого значения числовой переменной. Новое значение присваивается переменной.
      • Исключение из программы: Использование операторов инкремента и декремента в префиксной форме (например, ++x) выходит за рамки курса и экзамена AP Computer Science A. Использование операторов инкремента и декремента внутри других выражений (например, arr[x++]) выходит за рамки курса и экзамена AP Computer Science A.

    Источник: Описание курса и экзамена College Board AP

    Сокращенные записи объединяют операцию с присваиванием: x += 5 означает x = x + 5; аналогично для -=, *=, /=, %=. Операторы инкремента и декремента x++ и x-- прибавляют или отнимают единицу.

    1.7

    Программный интерфейс приложения (API) и библиотеки

    Программа

    Цель обучения 1.7.A: Определять атрибуты и поведение класса, содержащегося в библиотеках API.

    • 1.7.A.1 Библиотеки — это наборы классов. Спецификация прикладного программного интерфейса (API) информирует разработчика о том, как использовать эти классы. Документация, содержащаяся в спецификациях API и библиотеках, необходима для понимания атрибутов и поведения класса, определенного API. Класс определяет конкретный ссылочный тип. Классы в API и библиотеках сгруппированы по пакетам. Существующие классы и библиотеки классов могут использоваться для создания объектов.
    • 1.7.A.2 Атрибуты относятся к данным, связанным с классом, и хранятся в переменных. Поведение относится к тому, что экземпляры класса могут делать (или что можно сделать с ними), и определяется методами.

    Источник: Описание курса и экзамена College Board AP

    API (Application Programming Interface) — это опубликованный список классов и методов, которые вы можете использовать. Библиотека — это набор готовых классов (например, Math, String, Scanner). Вы изучаете документацию API, чтобы узнать, что требует метод (его параметры) и что возвращает, не видя его внутреннего кода — это пример абстрагирования.

    English Русский
    algorithm/ˈælɡərɪθəm/ алгоритм
    program/ˈprəʊɡræm/ программа
    compiled/kəmˈpaɪld/ скомпилированный
    Interface/ˈɪntəfeɪs/ Интерфейс
    1.8

    Документация с комментариями

    Программа

    Цель обучения 1.8.A: Описывать функциональность и использование кода с помощью комментариев.

    • 1.8.A.1 Комментарии пишутся как для первоначального разработчика, так и для других программистов, чтобы они могли понять код и его функциональность, но компилятор игнорирует их, и они не выполняются при запуске программы. В Java существует три типа комментариев: /* */, который создает блок комментариев; //, который создает комментарий в одну строку; и /** */, которые являются Javadoc-комментариями и используются для создания документации API.
    • 1.8.A.2 Предусловие — это условие, которое должно быть истинным непосредственно перед выполнением метода, чтобы он вел себя ожидаемым образом. Не предполагается, что метод будет проверять выполнение предусловий.
    • 1.8.A.3 Постусловие — это условие, которое всегда должно быть истинным после выполнения метода. Постусловия описывают результат выполнения в терминах возвращаемого значения или текущего значения атрибутов объекта.

    Источник: Описание курса и экзамена College Board AP

    Комментарии игнорируются компилятором, но объясняют код людям: // для одной строки, /* ... */ для блока, а /** ... */ для Javadoc-комментария, который документирует назначение метода, его параметры и возвращаемое значение. Здесь также записывают точные предусловия и постусловия.

    1.9

    Подписи методов

    Программа

    Цель обучения 1.9.A: Определять правильный метод для вызова на основе документации и подписей методов.

    • 1.9.A.1 Метод — это именованный блок кода, который выполняется только тогда, когда он вызывается. Блок кода — это любой участок кода, заключенный в фигурные скобки. Процедурная абстракция позволяет программисту использовать метод, зная, что он делает, даже если он не знает, как именно он написан.
    • 1.9.A.2 Параметр — это переменная, объявленная в заголовке метода или конструктора, и может использоваться внутри тела метода. Это позволяет передавать значения или аргументы и использовать их методом или конструктором. Подпись метода для метода с параметрами состоит из имени метода и упорядоченного списка типов параметров. Подпись метода для метода без параметров состоит из имени метода и пустого списка параметров.

    Цель обучения 1.9.B: Описывать, как вызывать методы.

    • 1.9.B.1 Void-метод не имеет возвращаемого значения и поэтому не используется как часть выражения.
    • 1.9.B.2 Non-void-метод возвращает значение того же типа, что и тип возвращаемого значения в заголовке. Чтобы использовать возвращаемое значение при вызове non-void-метода, оно должно быть сохранено в переменной или использовано как часть выражения.
    • 1.9.B.3 Аргумент — это значение, которое передается в метод при его вызове. Аргументы, передаваемые методу, должны быть совместимы по количеству и порядку с типами, указанными в списке параметров подписи метода. При вызове методов аргументы передаются по значению. Передача по значению инициализирует параметры копиями аргументов.
    • 1.9.B.4 Методы называются перегруженными, когда существует несколько методов с одним именем, но разными подписями.
    • 1.9.B.5 Вызов метода прерывает последовательное выполнение инструкций, заставляя программу сначала выполнить инструкции в методе, а затем продолжить. После выполнения последней инструкции в методе или выполнения инструкции return управление возвращается в точку сразу после места вызова метода.

    Источник: Описание курса и экзамена College Board AP

    Подпись метода — это имя метода вместе с типами его параметров, например nextInt() или substring(int, int). Чтобы вызвать метод, необходимо передать аргументы, соответствующие параметрам по количеству, типу и порядку. Заголовок метода (полное объявление) также указывает тип возвращаемого значения — тип данных, который метод возвращает (void, если ничего не возвращается), но тип возвращаемого значения не входит в подпись, поэтому два метода не могут отличаться только типом возвращаемого значения.

    1.10

    Вызов статических методов класса

    Программа

    Цель обучения 1.10.A: Написать код для вызова методов класса и определить результат этих вызовов.

    • 1.10.A.1 Методы класса связаны с самим классом, а не с его экземплярами. Методы класса включают ключевое слово static в заголовке перед именем метода.
    • 1.10.A.2 Методы класса обычно вызываются с использованием имени класса вместе с точечным оператором. Когда вызов метода происходит внутри определяющего класса, использование имени класса в вызове является необязательным.

    Источник: Описание курса и экзамена College Board AP

    Статический метод класса принадлежит самому классу, поэтому вы вызываете его по имени класса: ClassName.method(args). Объект при этом не требуется.

    Исследовать

    Отслеживайте вызов метода класса в стеке

    Вызов метода класса, например Math.max, помещает новый фрейм в стек вызовов; когда метод возвращает значение, его фрейм удаляется из стека, и управление возвращается вызывающей функции. Пройдитесь по шагам, чтобы увидеть, как стек растет и уменьшается.

    English Русский
    class/klæs/ класс
    1.11

    Класс Math

    Программа

    Цель обучения 1.11.A: Написать код для создания выражений, включающих вызовы встроенных математических библиотек, и определить значение, которое получается в результате.

    • 1.11.A.1 Класс Math является частью пакета java.lang. Классы из пакета java.lang доступны по умолчанию.
    • 1.11.A.2 Класс Math содержит только методы класса. Следующие методы класса Math — включая их назначение и области применения — входят в справочник по Java:
      • static int abs(int x) возвращает абсолютное значение значения int.
      • static double abs(double x) возвращает абсолютное значение значения double.
      • static double pow(double base, double exponent) возвращает значение первого параметра, возведенного в степень второго параметра.
      • static double sqrt(double x) возвращает неотрицательный квадратный корень из значения double.
      • static double random() возвращает значение double, большее или равное 0.0 и меньшее 1.0.
    • 1.11.A.3 Значения, возвращаемые из Math.random(), можно преобразовывать с помощью арифметических и операторов приведения типов, чтобы получить случайное целое число int или вещественное число double в заданном диапазоне на основе указанных критериев. Каждый конец диапазона может быть включительным, то есть значение включено, или исключающим, то есть значение не включено.

    Источник: Описание курса и экзамена College Board AP

    Класс Math предоставляет статические математические методы: Math.abs(x), Math.pow(base, exp), Math.sqrt(x) и Math.random() (возвращающий double из $[0,1)$). Чтобы получить случайное целое число от 0 до n-1: (int)(Math.random() * n).

    1.12

    Объекты: экземпляры классов

    Программа

    Цель обучения 1.12.A: Объяснить связь между классом и объектом.

    • 1.12.A.1 Объект — это конкретный экземпляр класса с определенными атрибутами. Класс — это формальная реализация, или чертеж, атрибутов и поведения объекта.
    • 1.12.A.2 Иерархию классов можно построить, поместив общие атрибуты и поведение родственных классов в один класс, называемый надклассом. Классы, которые расширяют надкласс (называемые подклассами), могут использовать существующие атрибуты и поведение надкласса без их замены в коде. Это создает отношение наследования от подклассов к надклассу.
      • Исключение: Проектирование и реализация отношений наследования находятся вне рамок курса и экзамена AP Computer Science A.
    • 1.12.A.3 Все классы в Java являются подклассами класса Object.

    Цель обучения 1.12.B: Написать код для объявления переменных для хранения ссылочных типов.

    • 1.12.B.1 Переменная ссылочного типа хранит ссылку на объект, которую можно рассматривать как адрес памяти этого объекта.

    Источник: Описание курса и экзамена College Board AP

    = копирует ссылку, а не объект

    Класс — это чертеж, а объект — конкретный экземпляр, созданный на его основе. Класс объединяет данные (поля) с поведением (методами) — это основа объектно-ориентированного программирования. String, Scanner и ArrayList — это все классы, которые вы создаете (инстанцируете).

    Классы можно организовывать в иерархию. Суперкласс содержит атрибуты и поведение, общие для нескольких подклассов, которые extend его — это отношение наследования. Каждый класс в Java в конечном итоге является подклассом встроенного класса Object, поэтому у каждого объекта уже есть метод toString; определение метода в подклассе с той же подписью, что и в суперклассе, называется переопределением метода. (Проектирование собственной иерархии выходит за рамки этого курса, но вы должны уметь распознавать эту терминологию.)

    Диаграмма классов: приватные атрибуты и публичные методы
    Диаграмма классов: приватные атрибуты и публичные методы
    Класс — это чертеж; каждый объект — один экземпляр, построенный на его основе
    Класс — это чертеж; каждый объект — один экземпляр, построенный на его основе
    English Русский
    object/ˈɒbdʒekt/ самого тела
    instance/ˈɪnstəns/ экземпляр
    object-oriented programming/ˈɒbdʒekt ˈɔːrɪəntɪd ˈprəʊɡræmɪŋ/ объектно-ориентированное программирование
    superclass/ˈsuːpəklæs/ суперкласс
    subclasses/ˈsʌbklæsɪz/ подклассы
    inheritance relationship/ɪnˈherɪtəns rɪˈleɪʃənʃɪp/ наследование
    method overriding/ˈmeθəd ˌəʊvəˈraɪdɪŋ/ переопределение метода
    Instantiation/ˌɪnstænʃɪˈeɪʃn/ инстанцирование
    constructor/kənˈstrʌktə/ конструктор
    reference/ˈrefrəns/ отсчёта
    1.13

    Создание объектов и их хранение (инстанцирование)

    Программа

    Цель обучения 1.13.A: Определить по сигнатуре правильный вызываемый конструктор.

    • 1.13.A.1 Класс содержит конструкторы, которые вызываются для создания объектов. Они имеют то же имя, что и класс.
    • 1.13.A.2 Сигнатура конструктора состоит из имени конструктора (которое совпадает с именем класса) и упорядоченного списка типов параметров. Список параметров в заголовке конструктора перечисляет типы передаваемых значений и имена их переменных.
    • 1.13.A.3 Говорят, что конструкторы перегружены, когда существует несколько конструкторов с различными сигнатурами.

    Цель обучения 1.13.B: Написать код для объявления переменных правильных типов для хранения ссылок на объекты.

    • 1.13.B.1 Переменная ссылочного типа хранит ссылку на объект или, если объекта нет, значение null.

    Цель обучения 1.13.C: Написать код для создания объекта путем вызова конструктора.

    • 1.13.C.1 Объект обычно создается с использованием ключевого слова new, за которым следует вызов одного из конструкторов класса.
    • 1.13.C.2 Параметры позволяют конструкторам принимать значения для установки начальных значений атрибутов объекта.
    • 1.13.C.3 Аргумент конструктора — это значение, передаваемое в конструктор при его вызове. Аргументы, передаваемые в конструктор, должны быть совместимы по порядку и количеству с типами, указанными в списке параметров сигнатуры конструктора. При вызове конструкторов аргументы передаются по значению. Передача по значению инициализирует параметры копиями аргументов.
    • 1.13.C.4 Вызов конструктора прерывает последовательное выполнение инструкций, заставляя программу сначала выполнить инструкции в конструкторе, а затем продолжить. После выполнения последней инструкции в конструкторе управление возвращается в точку, непосредственно следующую за местом вызова конструктора.

    Источник: Описание курса и экзамена College Board AP

    Инстанцирование создает объект с помощью ключевых слов new, которое вызывает конструктор:

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

    Переменная хранит ссылку (адрес объекта), а не сам объект. Две ссылки могут указывать на один и тот же объект; сравнение их с помощью == сравнивает адреса, а не содержимое.

    Ссылка также может не указывать ни на какой объект: специальное значение null означает «не привязано ни к какому объекту». Вызов метода на ссылке null вызывает ошибку во время выполнения программы с возникновением исключения NullPointerException. Избегайте этого, проверяя ссылку с помощью оператора /==/!= и проверяя null первым, чтобы оператор && выполнил короткое замыкание до вызова метода: условие if (s != null && s.length() > 0).

    Примитивная переменная хранит свое значение напрямую, ссылка хранит стрелку к объекту
    Примитивная переменная хранит свое значение напрямую, ссылка хранит стрелку к объекту
    English Русский
    null/nʌl/ null
    instance method/ˈɪnstəns ˈmeθəd/ метод экземпляра
    immutable/ɪˈmjuːtəbl/ неизменяемыми
    1.14

    Вызов экземплярных методов

    Программа

    Цель обучения 1.14.A: Написать код для вызова методов экземпляра и определить результат этих вызовов.

    • 1.14.A.1 Методы экземпляра вызываются на объектах данного класса. Для вызова методов экземпляра используется точечный оператор вместе с именем объекта.
    • 1.14.A.2 Вызов метода на ссылке null приведет к возникновению ошибки NullPointerException.

    Источник: Описание курса и экзамена College Board AP

    Экземплярный метод действует на конкретный объект, поэтому вы вызываете его по ссылке на объект: object.method(args). Пример: in.nextInt(), word.length().

    1.15

    Манипуляция со строками

    Программа
    Learning ObjectiveEssential Knowledge

    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.

    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).

    Источник: Описание курса и экзамена College Board AP

    Строки неизменяемы

    Объекты String являются неизменяемыми — методы возвращают новую строку, а не изменяют исходную. Ключевые методы (все индексы начинаются с 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
    

    Навык экзамена: substring(a, b) включает индекс a, но исключает b, а сравнение строк должно выполняться через .equals, а не через == — это две наиболее часто встречающиеся ловушки при работе со строками на экзамене.

    Разобранная задача. Пусть String s = "COMPUTER"; (индексы 0–7). Тогда s.length() равно 8; s.substring(0, 4) равно "COMP" (индексы 0,1,2,3 – индекс 4 исключен); s.substring(4) равно "UTER" (от индекса 4 до конца); s.indexOf("PU") равно 3; а s.indexOf("X") равно -1 (не найдено). Забытый конец диапазона в substring — самая частая ошибка.

    Запрос индекса вне диапазона от 0 до length()-1 (плохой аргумент для substring или charAt, например, s.substring(0, 20) здесь) приводит к сбою с ошибкой StringIndexOutOfBoundsException — это «родственник» ошибки индекса массива для строк.

    Индексы строк начинаются с 0
    Индексы строк начинаются с 0
    Исследовать

    Исследуйте индексы строк и срезы

    Каждый символ имеет индекс, нумерация которого начинается с 0. Перетащите начало и конец, чтобы увидеть, как substring(from, to) выбирает символы от индекса from до (не включая) to.

    1.15

    Советы для экзамена

    • Отслеживайте код вручную построчно, фиксируя значение каждой переменной в таблице — на экзамене ценится внимательное отслеживание, а не догадки.
    • Знать примитивные типы Java и то, что целочисленное деление отбрасывает дробную часть ($7/2$ дает $3$); используйте приведение типа или double для реального деления.
    • Различайте ошибки компиляции (синтаксис, типы) и ошибки выполнения – знайте их названия: ArithmeticException (int ÷ 0), NullPointerException (метод на нулевой ссылке), StringIndexOutOfBoundsException / ArrayIndexOutOfBoundsException – и логические ошибки (неправильный вывод).
    • Соблюдайте приоритет операторов и инициализируйте каждую переменную перед её использованием.
    • В свободных ответах пишите полный, компилируемый код Java – возвращайте правильный тип и точно соответствуйте заголовку метода.
  • 2

    Выбор и итерация

    Смотреть урок
    2.1

    Выбор и повторение в алгоритмах

    Программа

    Цель обучения 2.1.A: Представлять паттерны и алгоритмы, включающие выбор и повторение, встречающиеся в повседневной жизни, с помощью письменного текста или диаграмм.

    • 2.1.A.1 Базовыми элементами алгоритмов являются последовательность, выбор и повторение.
    • 2.1.A.2 Алгоритмы могут содержать выбор через принятие решений и повторение через циклы.
    • 2.1.A.3 Выбор происходит, когда выбор направления выполнения алгоритма основан на истинном или ложном решении.
    • 2.1.A.4 Повторение — это процесс, который повторяется до достижения желаемого результата.
    • 2.1.A.5 Порядок, в котором используются последовательность, выбор и повторение, влияет на результат алгоритма.

    Источник: Описание курса и экзамена College Board AP

    Схема потока с ромбом решения: выбор определяет, какой путь алгоритм выполнит
    Блок-схема с ромбом решения: выбор определяет путь, который проходит алгоритм

    Алгоритмы строятся из трёх операторов управления: последовательность (шаги по порядку), выбор (выбор пути) и итерация (повторение шагов). Эта тема охватывает выбор и итерацию – инструменты, позволяющие программе принимать решения и выполнять циклы.

    Три оператора управления: последовательность, выбор и итерация
    Три оператора управления: последовательность, выбор и итерация
    English Русский
    control structures/kənˈtrəʊl ˈstrʌktʃəz/ структуры управления
    selection/sɪˈlekʃn/ выбор
    iteration/ˌɪtəˈreɪʃn/ итерации
    boolean expression/ˈbuːlɪən ekˈspreʃn/ булево выражение
    relational operators/rɪˈleɪʃənl ˈɒpəreɪtəz/ относительные операторы
    if statement/ɪf ˈsteɪtmənt/ оператор if
    Logical operators/ˈlɒdʒɪkl ˈɒpəreɪtəz/ Логические операторы
    short-circuit evaluation/ʃɔːt ˈsɜːkɪt ɪˌvæljuːˈeɪʃn/ короткое замыкание (short-circuit evaluation)
    De Morgan's laws/də ˈmɔːɡənz lɔːz/ законы де Моргана
    while loop/waɪl luːp/ цикл while
    infinite loop/ˈɪnfɪnət luːp/ бесконечный цикл
    flag/flæɡ/ флаг
    nested loop/ˈnestɪd luːp/ вложенный цикл
    Run-time analysis/rʌn taɪm əˈnæləsɪs/ Анализ во время выполнения
    2.2

    Булевы выражения

    Программа

    Цель обучения 2.2.A: Разработать код для создания булевских выражений с реляционными операторами и определить результат этих выражений.

    • 2.2.A.1 Значения можно сравнивать с помощью реляционных операторов == и !=, чтобы определить, одинаковы ли значения. Для примитивных типов это сравнивает фактические примитивные значения. Для ссылочных типов это сравнивает ссылки на объекты.
    • 2.2.A.2 Числовые значения можно сравнивать с помощью реляционных операторов <, >, <= и >=, чтобы определить соотношение между значениями.
    • 2.2.A.3 Выражение, содержащее реляционные операторы, вычисляется как булево значение.

    Источник: Описание курса и экзамена College Board AP

    Логические вентили и полусумматор

    Булево выражение вычисляется как true или false, используя относительные операторы: == (равно), != (не равно), <, >, <=, >=. Заметьте, что == сравнивает примитивные значения, но ссылки на объекты для объектов, поэтому используйте .equals для Strings.

    Три семейства операторов: арифметические, реляционные и логические
    Три группы операторов: арифметические, относительные и логические
    Исследовать

    Исследуйте таблицу истинности AND

    Логическое выражение вычисляется как true или false. Операция AND истинна только тогда, когда оба операнда истинны; переключите входные значения, чтобы увидеть все четыре варианта.

    2.3

    Оператор if

    Программа

    Цель обучения 2.3.A: Разработать код для представления ветвящихся логических процессов с использованием операторов выбора и определить результат этих процессов.

    • 2.3.A.1 Операторы выбора изменяют последовательное выполнение операторов.
    • 2.3.A.2 Оператор if является типом оператора выбора, который влияет на поток управления, выполняя различные сегменты кода в зависимости от значения булевого выражения.
    • 2.3.A.3 Однонаправленный выбор (оператор if) используется, когда существует сегмент кода для выполнения при определенном условии. В этом случае тело выполняется только тогда, когда булево выражение равно true.
    • 2.3.A.4 Двухнаправленный выбор (оператор if-else) используется, когда есть два сегмента кода: один для выполнения, когда булево выражение равно true, и другой сегмент для выполнения, когда булево выражение равно false. В этом случае тело оператора if выполняется, когда булево выражение равно true, а тело оператора else выполняется, когда булево выражение равно false.

    Источник: Описание курса и экзамена College Board AP

    Оператор if выполняет блок только тогда, когда его условие истинно; опциональный else предоставляет альтернативу:

    if (score >= 60) {
        System.out.println("Pass");
    } else {
        System.out.println("Fail");
    }
    
    Светофоры: выбор определяет, какой веткой будет выполнен код, аналогично тому, как условные операторы if выбирают пути выполнения кода
    Светофор: выбор определяет, какой ветвь выполнить, так же как операторы if выбирают пути кода
    Исследовать

    Узнайте, какой ветви выбирает оператор if

    Оператор if выполняет свой блок только при истинном условии, иначе он пропускает его к else. Передвигайте оценку по границам и наблюдайте, как меняется оценка.

    2.4

    Вложенные операторы if

    Программа

    Цель обучения 2.4.A: Разработать код для представления вложенных ветвящихся логических процессов и определить результат этих процессов.

    • 2.4.A.1 Вложенные операторы if состоят из операторов if, if-else или if-else-if внутри операторов if, if-else или if-else-if.
    • 2.4.A.2 Булево выражение внутреннего вложенного оператора if вычисляется только в том случае, если булево выражение внешнего оператора if оценивается как true.
    • 2.4.A.3 Множественный выбор (оператор if-else-if) используется, когда имеется серия выражений с различными сегментами кода для каждого условия. Множественный выбор выполняется таким образом, что выполняется не более одного сегмента кода на основе первого выражения, которое оценивается как true. Если ни одно выражение не оценивается как true, и присутствует оператор else в конце, то выполняется тело оператора else.

    Источник: Описание курса и экзамена College Board AP

    Размещение оператора if внутри другого или цепочка с помощью else if проверяют несколько случаев по порядку. Выполняется только первая подходящая ветвь:

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

    Составные булевы выражения

    Программа

    Цель обучения 2.5.A: Разработать код для представления составных булевских выражений и определить результат этих выражений.

    • 2.5.A.1 Логические операторы ! (не), && (и) и || (или) используются с булевскими выражениями. Выражение !a вычисляется как true, если a равно false, и вычисляется как false в противном случае. Выражение a && b вычисляется как true, если оба выражения a и b равны true, и вычисляется как false в противном случае. Выражение a || b вычисляется как true, если a равно true, b равно true или оба, и вычисляется как false в противном случае. Порядок приоритета вычисления логических операторов: ! (не), затем && (и), затем || (или). Выражение, содержащее логические операторы, вычисляется как булево значение.
    • 2.5.A.2 Короткое замыкание (short-circuit evaluation) происходит, когда результат логической операции с использованием && или || может быть определен путем вычисления только первого булевого выражения. В этом случае второе булево выражение не вычисляется.

    Источник: Описание курса и экзамена College Board AP

    Короткое замыкание при вычислении

    Логические операторы объединяют условия: && (and – оба истинны), || (or – хотя бы один истинен), ! (not – инверсия). Java использует короткое замыкание при вычислении: && останавливается, если левая часть ложна, а || останавливается, если левая часть истинна – это полезно для защиты от ошибок, например, if (n != 0 && total / n > 5).

    2.6

    Сравнение булевых выражений

    Программа

    Цель обучения 2.6.A: Сравнивать эквивалентные булевские выражения.

    • 2.6.A.1 Два булевских выражения являются эквивалентными, если они вычисляются как одно и то же значение во всех случаях. Таблицы истинности могут использоваться для доказательства эквивалентности булевских выражений.
    • 2.6.A.2 Закон де Моргана может быть применен к булевским выражениям для создания эквивалентных булевских выражений. Согласно закону де Моргана, булево выражение !(a && b) эквивалентно !a || !b, а булево выражение !(a || b) эквивалентно !a && !b.

    Цель обучения 2.6.B: Разработать код для сравнения ссылочных переменных объектов с использованием булевских выражений и определить результат этих выражений.

    • 2.6.B.1 Две разные переменные могут хранить ссылки на один и тот же объект. Ссылочные переменные объектов можно сравнивать с помощью == и !=.
    • 2.6.B.2 Ссылочную переменную объекта можно сравнить с null, используя == или !=, чтобы определить, действительно ли ссылка указывает на объект.
    • 2.6.B.3 Классы часто определяют свой собственный метод equals, который можно использовать для определения критериев эквивалентности для двух объектов данного класса. Эквивалентность двух объектов чаще всего определяется на основе атрибутов этих двух объектов.
      • Исключение: Переопределение метода equals не входит в рамки курса и экзамена по информатике AP.

    Источник: Описание курса и экзамена College Board AP

    Законы де Моргана преобразуют отрицания: !(a && b) равно !a || !b, а !(a || b) равно !a && !b. Два булевых выражения считаются эквивалентными, если они дают одинаковый результат для любого набора входных данных — это подтверждается таблицей истинности. Упрощение условий таким образом является типичным заданием на экзамене.

    2.7

    Циклы while

    Программа

    Цель обучения 2.7.A: Определять, когда для достижения желаемого результата требуется итеративный процесс.

    • 2.7.A.1 Итерация — это форма повторения. Операторы итерации изменяют поток управления, повторяя фрагмент кода ноль или более раз, пока логическое выражение, управляющее циклом, оценивается как true.
    • 2.7.A.2 Бесконечный цикл возникает, когда логическое выражение в операторе итерации всегда оценивается как true.
    • 2.7.A.3 Тело цикла оператора итерации не выполнится, если логическое выражение изначально оценивается как false.
    • 2.7.A.4 Ошибки off by one (на единицу больше/меньше) возникают, когда оператор итерации выполняется на один раз слишком много или на один раз слишком мало.

    Цель обучения 2.7.B: Разработать код для представления итеративных процессов с использованием циклов while и определить результат этих процессов.

    • 2.7.B.1 Цикл while является видом итеративного оператора. В циклах while логическое выражение вычисляется перед каждой итерацией тела цикла, включая первую. Когда выражение принимает значение true, выполняется тело цикла. Это продолжается до тех пор, пока логическое выражение не примет значение false, после чего итерация завершается.

    Источник: Описание курса и экзамена College Board AP

    Цикл while повторяется пока его условие остаётся истинным, проверяя его перед каждой итерацией. Вы должны изменить что-то внутри, чтобы цикл в конце прекратился, иначе он станет бесконечным циклом:

    Три типа циклов различаются местом проверки условия
    Три типа циклов различаются тем, где проверяется условие
    int i = 0;
    while (i < 5) {
        System.out.println(i);
        i++;
    }
    
    Исследовать

    Отследите цикл while

    Цикл while повторяется, пока его условие остается истинным, обновляя свои переменные на каждом проходе. Пройдитесь по шагам, чтобы увидеть, как накапливается сумма квадратов.

    2.8

    Циклы for

    Программа
    Learning ObjectiveEssential Knowledge

    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).

    Источник: Описание курса и экзамена College Board AP

    Цикл for упаковывает инициализацию, условие и обновление в одну строку – лучше всего подходит, когда вы знаете количество:

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

    Структура for и эквивалентная структура while выполняют ту же работу; нужно уметь конвертировать между ними.

    Конвейер: циклы повторяют процесс для каждого элемента, подобно конструкциям for и while
    Конвейер: циклы повторяют процесс для каждого элемента, как in for и while
    Исследовать

    Отследите цикл for

    Цикл for выполняется фиксированное количество раз, его счетчик проходит по диапазону. Наблюдайте, как счетчик и накопленная сумма увеличиваются на один проход за раз.

    2.9

    Создание полных алгоритмов выбора и итерации

    Программа

    Цель обучения 2.9.A: Разработать код для стандартных и оригинальных алгоритмов (без структур данных) и определить результат этих алгоритмов.

    • 2.9.A.1 Существуют стандартные алгоритмы для:
      • определения, кратно ли целое число другому целому числу или нет
      • определения отдельных цифр в целом числе
      • определения частоты выполнения определенного критерия
      • определения минимального или максимального значения
      • вычисления суммы или среднего значения

    Источник: Описание курса и экзамена College Board AP

    Объедините циклы и условия для решения реальных задач – подсчет, суммирование, поиск максимума или проверка свойства:

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

    Два целочисленных паттерна, которые непосредственно проверяются на экзамене, используют % и /. Чтобы читать цифры целого числа по одной, необходимо последовательно брать n % 10 (последнюю цифру), а затем выполнять n = n / 10 (убрать её). Для проверки делимости n % d == 0 означает, что n делится на d без остатка. Объедините их со счетчиком, чтобы найти частоту, с которой выполняется определенное условие.

    Стандартные паттерны, такие как накопительная сумма, счетчик или флаг (булево значение, фиксирующее, произошло ли что-то), встречаются на протяжении всего курса.

    2.10

    Алгоритмы со строками

    Программа

    Цель обучения 2.10.A: Разрабатывать код для стандартных и оригинальных алгоритмов, связанных со строками, и определять результат этих алгоритмов.

    • 2.10.A.1 Существуют стандартные строчные алгоритмы для:
      • поиска наличия у одной или нескольких подстрок определенного свойства
      • определения количества подстрок, соответствующих определенным критериям
      • создания новой строки с обратным порядком символов

    Источник: Описание курса и экзамена College Board AP

    Проход по строке по индексам для обработки каждого символа:

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

    Типичные задачи: подсчет вхождений, создание перевернутой или отфильтрованной копии, или проверка содержит ли одна строку другую.

    2.11

    Вложенная итерация

    Программа

    Цель обучения 2.11.A: Разработать код для представления вложенных итеративных процессов и определить результат этих процессов.

    • 2.11.A.1 Вложенные операторы итерации — это операторы итерации, которые находятся внутри тела другого оператора итерации. Когда цикл вложен внутрь другого цикла, внутренний цикл должен завершить все свои итерации, прежде чем внешний цикл сможет перейти к своей следующей итерации.

    Источник: Описание курса и экзамена College Board AP

    Вложенный цикл помещает один цикл внутрь другого; внутренний цикл полностью завершается для каждой итерации внешнего. Если внешний выполняется $n$ раз, а внутренний $m$ раз, тело выполняется $n\times m$ раз – основа для обработки сеток и сравнения всех пар.

    2.12

    Неформальный анализ времени выполнения

    Программа

    Цель обучения 2.12.A: Вычислять количество выполнений операторов и проводить неформальное сравнение по времени выполнения итеративных операторов.

    • 2.12.A.1 Количество выполнений оператора указывает на число раз, когда программа выполняет данный оператор. Количество выполнений операторов часто вычисляется неформально путем трассировки и анализа итеративных операторов.

    Источник: Описание курса и экзамена College Board AP

    Темпы роста Big-O

    Анализ времени выполнения считает, сколько базовых шагов выполняет алгоритм по мере роста размера входных данных $n$. Подсчитайте выполнение самого внутреннего утверждения: одиночный цикл по $n$ элементам является линейным ($n$ шагов); два вложенных цикла по $n$ являются квадратичными ($n^2$). Этот неформальный подсчет позволяет сравнить эффективность двух алгоритмов.

    Как время выполнения растет вместе с количеством элементов n
    Как время выполнения растет с количеством элементов n

    Навык для экзамена: для вложенного цикла нужно уметь stating, сколько раз выполняется внутреннее утверждение в зависимости от границ циклов – частый вопрос с множественным выбором.

    Разобранный пример. Сколько звезд будет напечатано?

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

    Внутренний цикл выполняется i раз для каждого внешнего i: 0 + 1 + 2 + 3 = 6 звёздочек. Когда внутренняя граница зависит от внешней переменной, общее количество равно треугольной сумме $0+1+\dots+(n-1)=\dfrac{n(n-1)}{2}$ – здесь $\dfrac{4\times3}{2}=6$ – а не полной $n^2=16$ прямоугольного вложенного цикла.

    Исследовать

    Сравните масштабирование алгоритмов

    Временна́я сложность описывает, как растет количество шагов с размером входных данных $n$. Увеличьте $n$ и наблюдайте, как линейная $O(n)$ значительно опережает квадратичную $O(n^2)$.

    2.12

    Советы для экзамена

    • Правильно задавайте граничные условия: сознательно используйте < или <= и следите за первой и последней итерацией каждого цикла (ошибка на единицу — классическая ошибка).
    • Составляйте сложные условия с помощью &&, || и ! и помните о коротком замыкании (коротком вычислении) логических выражений (первым ставьте проверку на null).
    • Отслеживайте вложенные циклы, подсчитывая, сколько раз всего выполняется тело внутреннего цикла.
    • Выбирайте правильную структуру — if/else if для диапазонов, цикл для повторений — и избегайте бесконечного цикла, обновляя переменную цикла.
    • Применяйте законы де Моргана при упрощении или отрицании булевого условия.
  • 3

    Создание классов

    Смотреть урок
    3.1

    Абстракция и проектирование программ

    Программа

    Цель обучения 3.1.A: Представлять проект программы с помощью естественного языка или диаграмм, указывающих классы в программе и данные и процедурные абстракции, найденные в каждом классе, включая все атрибуты и поведения.

    • 3.1.A.1 Абстракция — это процесс снижения сложности путем сосредоточения на основной идее. Скрывая детали, не относящиеся к текущему вопросу, и объединяя связанные и полезные детали, абстракция снижает сложность и позволяет сосредоточиться на идее.
    • 3.1.A.2 Абстракция данных обеспечивает разделение между абстрактными свойствами типа данных и конкретными деталями его представления. Абстракция данных управляет сложностью, предоставляя данным имя без ссылки на конкретные детали представления. Данные могут принимать форму одной переменной или набора данных, например, в классе или наборе данных.
    • 3.1.A.3 Атрибут — это вид абстракции данных, который определяется в классе вне любого метода или конструктора. Переменная экземпляра — это атрибут, значение которого уникально для каждого экземпляра класса. Переменная класса — это атрибут, общий для всех экземпляров класса.
    • 3.1.A.4 Процедурная абстракция предоставляет имя процессу и позволяет использовать метод, зная только то, что он делает, а не как он это делает. Посредством декомпозиции методов программист разбивает крупные поведения класса на более мелкие, создавая методы для представления каждого отдельного мелкого поведения. Процедурная абстракция может извлекать общие черты для обобщения функциональности вместо дублирования кода. Это позволяет использовать код повторно, что помогает управлять сложностью.
    • 3.1.A.5 Использование параметров позволяет обобщать процедуры, позволяя использовать их с различными входными значениями или аргументами.
    • 3.1.A.6 Использование процедурной абстракции в программе позволяет программистам изменять внутреннюю часть метода (например, ускорить его, повысить эффективность, уменьшить потребление памяти и т. д.) без необходимости уведомлять пользователей метода об изменениях, при условии сохранения подписи метода и того, что он делает.
    • 3.1.A.7 Перед реализацией класса полезно уделить время проектированию каждого класса, включая его атрибуты и поведение. Этот проект может быть представлен с помощью естественного языка или диаграмм.

    Источник: Описание курса и экзамена College Board AP

    Сборка пазла в процессе: классы и методы — это модульные части более крупного проекта программы
    Сборка пазла в процессе: классы и методы — это модульные части более крупного проекта программы

    Абстракция означает сокрытие деталей за простым интерфейсом — вы используете String, не зная, как он хранит символы. Хороший дизайн разбивает задачу на классы, каждый из которых отвечает за одну концепцию. Эта тема посвящена написанию ваших собственных классов.

    Декомпозиция программы на модули и подмодули
    Декомпозиция программы на модули и подмодули
    3.2

    Влияние проектирования программ

    Программа

    Цель обучения 3.2.A: Объяснять социальные и этические последствия вычислительных систем.

    • 3.2.A.1 Надежность системы означает способность программы выполнять свои задачи ожидаемым образом в stated условиях без сбоев. Программисты должны предпринимать усилия по максимизации надежности системы, тестируя программу с использованием различных условий.
    • 3.2.A.2 Создание программ оказывает влияние на общество, экономику и культуру. Это влияние может быть как положительным, так и отрицательным. Программы, предназначенные для удовлетворения потребностей или решения проблем, могут иметь нежелательные вредные последствия за пределами их прямого назначения.
    • 3.2.A.3 При создании программ возникают правовые вопросы и проблемы, связанные с интеллектуальной собственностью. Программисты часто переиспользуют код, написанный другими и опубликованный в виде открытого исходного кода (open source), доступный бесплатно. Использование кода, который не является открытым исходным кодом, требует получения разрешения у автора и часто покупки лицензии перед интеграцией этого кода в свою программу.

    Источник: Описание курса и экзамена College Board AP

    Выборы в дизайне влияют на то, является ли код правильным, читаемым и повторно используемым. Инкапсуляция — сохранение данных в приватном доступе и предоставление к ним доступа только через методы — защищает состояние объекта от неправильного использования и позволяет изменять внутреннюю часть, не нарушая работу пользователей класса. Продуманное именование, методы с одной целью и тестирование снижают количество ошибок.

    Дизайн также несет ответственность, выходящую за рамки кода. Надежность системы — способность программы выполнять свои задачи так, как ожидалось, без сбоев, — это то, что программисты должны максимизировать благодаря тщательному дизайну и тестированию. Программы оказывают реальное влияние на общество, экономику и культуру, которое может быть как положительным, так и отрицательным. Создание программ поднимает юридические вопросы и вопросы интеллектуальной собственности: программисты часто используют код, опубликованный как открытый исходный код и свободный для использования, но должны соблюдать его лицензию и указывать авторство, а не копировать чужие работы как свои собственные.

    3.3

    Анатомия класса

    Программа

    Цель обучения 3.3.A: Написать код для определения ограничений доступа и видимости классов, данных, конструкторов и методов.

    • 3.3.A.1 Инкапсуляция данных — это техника, при которой детали реализации класса скрыты от внешних классов. Ключевые слова public и private влияют на уровень доступа к классам, данным, конструкторам и методам. Ключевое слово private ограничивает доступ только объявляющим классом, в то время как ключевое слово public позволяет доступ со стороны классов, находящихся вне объявляющего класса.
    • 3.3.A.2 В данном курсе классы всегда обозначаются как public и объявляются с использованием ключевого слова class.
    • 3.3.A.3 В данном курсе конструкторы всегда обозначаются как public.
    • 3.3.A.4 Экземплярные переменные принадлежат объекту, и каждый объект имеет свою собственную копию такой переменной.
    • 3.3.A.5 Доступ к атрибутам должен быть ограничен внутренним пространством класса для обеспечения инкапсуляции. Поэтому хорошей практикой программирования является обозначение экземплярных переменных для этих атрибутов как private, если иное не указано в спецификации класса.
    • 3.3.A.6 Доступ к поведению (методам) может быть как внутренним, так и внешним относительно класса. Методы, обозначенные как public, могут вызываться как изнутри, так и снаружи класса, тогда как методы, обозначенные как private, доступны только внутри класса.

    Источник: Описание курса и экзамена College Board AP

    Класс состоит из трех частей: экземплярных переменных (полей — данных объекта), конструкторов (создания объектов) и методов (поведения). Поля обычно объявляются private; методы обычно объявляются public:

    Диаграмма классов: приватные атрибуты и публичные методы
    Диаграмма классов: приватные атрибуты и публичные методы
    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
    }
    
    Чертеж: класс — это шаблон, определяющий, как создаются объекты этого типа
    Чертеж: класс — это шаблон, определяющий, как создаются объекты этого типа
    Исследовать

    Представьте поля объекта как контейнеры

    Класс объединяет связанные данные (его поля) и методы. Каждый объект получает собственный набор контейнеров для полей; изменение одного влияет только на этот объект.

    English Русский
    Abstraction/əbˈstrækʃn/ Абстрагирование
    Encapsulation/ɪnˌkæpsjʊˈleɪʃn/ Инкапсуляция
    System reliability/ˈsɪstəm rɪˌlaɪəˈbɪlɪti/ Надежность системы
    legal and intellectual-property/ˈliːɡl ænd ˌɪntəˈlektʃuːəl ˈprɒpəti/ правовые вопросы и интеллектуальная собственность
    open source/ˈəʊpən sɔːs/ open source
    instance variables/ˈɪnstəns ˈveərɪəblz/ переменные экземпляра
    constructor/kənˈstrʌktə/ конструктор
    overloading/ˌəʊvəˈləʊdɪŋ/ перегрузкой
    accessor (getter)/əkˈsesə/ геттер (accessor)
    3.4

    Конструкторы

    Программа

    Цель обучения 3.4.A: Написать код для объявления экземплярных переменных для атрибутов, которые должны быть инициализированы в теле конструкторов класса.

    • 3.4.A.1 Состояние объекта относится к его атрибутам и их значениям в определенный момент времени и определяется экземплярными переменными, принадлежащими этому объекту. Это определяет отношение «имеет» (has-a) между объектом и его экземплярными переменными.
    • 3.4.A.2 Конструктор используется для установки начального состояния объекта, которое должно включать начальные значения для всех экземплярных переменных. При вызове конструктора выделяется память под объект, и возвращается ссылка на этот объект. Параметры конструктора, если они указаны, передают данные для инициализации экземплярных переменных.
    • 3.4.A.3 Когда изменяемый объект является параметром конструктора, экземплярная переменная должна быть инициализирована копией этого объекта. Таким образом, экземплярная переменная не будет содержать ссылку на оригинальный объект, что предотвращает возможность изменения состояния оригинального объекта через методы.
    • 3.4.A.4 Если конструктор не написан явно, Java предоставляет конструктор без параметров, а экземплярные переменные устанавливаются в значения по умолчанию в соответствии с типом данных атрибута. Этот конструктор называется конструктором по умолчанию.
    • 3.4.A.5 Значение по умолчанию для атрибута типа int равно 0. Значение по умолчанию для атрибута типа double равно 0.0. Значение по умолчанию для атрибута типа boolean равно false. Значение по умолчанию для ссылочного типа равно null.

    Источник: Описание курса и экзамена College Board AP

    Конструктор имеет то же имя, что и класс, и не имеет возвращаемого типа. Он вызывается при записи new, и его задача — инициализировать поля. Класс может иметь несколько конструкторов с разными списками параметров (перегрузка); конструктор без параметров устанавливает значения по умолчанию.

    3.5

    Методы: Как их писать

    Программа

    Цель обучения 3.5.A: Написать код для определения поведения объекта через методы, написанные в классе, используя примитивные значения, и определить результат вызова этих методов.

    • 3.5.A.1 Метод void не возвращает значение. В его заголовке перед именем метода содержится ключевое слово void.
    • 3.5.A.2 Непустой метод (возвращающий значение) возвращает одно значение. В его заголовке вместо ключевого слова void указывается тип возвращаемого значения.
    • 3.5.A.3 В непустых методах вычисляется выражение возврата, совместимое с типом возвращаемого значения, и оно возвращается. Это называется возвратом по значению.
    • 3.5.A.4 Ключевое слово return используется для возврата потока управления в точку, где был вызван метод или конструктор. Любой код, следующий последовательно после оператора return, никогда не будет выполнен. Выполнение оператора return внутри условия выбора или цикла остановит выполнение данного блока и завершит работу метода или конструктора.
    • 3.5.A.5 Метод-аксессуар (accessor method) позволяет объектам других классов получать копию значения экземплярных переменных или переменных класса. Метод-аксессуар является непустым методом.
    • 3.5.A.6 Мутатор (mutator method) — это метод, который изменяет значения экземплярных переменных или переменных класса. Мутатор часто является методом без возвращаемого значения (void-методом).
    • 3.5.A.7 Методы с параметрами получают значения через эти параметры и используют их для выполнения задачи метода.
    • 3.5.A.8 Когда аргумент является примитивным значением, параметр инициализируется копией этого значения. Изменения, внесенные в параметр, не оказывают влияния на соответствующий аргумент.

    Источник: Описание курса и экзамена College Board AP

    Метод имеет сигнатуру, тип возвращаемого значения и тело. Аксессор (getter) возвращает информацию, не изменяя объект; мутатор (setter) изменяет поле. Метод, возвращающий значение, должен иметь оператор return правильного типа на каждом пути; метод void ничего не возвращает.

    public void setScore(int s) { score = s; }   // mutator
    public String toString() { return name + ": " + score; }
    
    Исследовать

    Отследите вызов метода и его возвращение

    Вызов метода помещает фрейм с его параметрами; когда он достигает return, фрейм удаляется, и значение возвращается вызывающей функции.

    English Русский
    mutator (setter)/mjuːˈteɪtə/ сеттер (mutator)
    static (class) variable/ˈstætɪk ˈveərɪəbl/ статическая (классовая) переменная
    3.6

    Передача и возврат ссылок на объект

    Программа

    Цель обучения 3.6.A: Написать код для определения поведения объекта через методы, написанные в классе, используя ссылки на объекты, и определить результат вызова этих методов.

    • 3.6.A.1 Когда аргументом является ссылка на объект, параметр инициализируется копией этой ссылки; при этом не создается новая независимая копия самого объекта. Если параметр ссылается на изменяемый объект, метод или конструктор может использовать эту ссылку для изменения состояния объекта. Хорошей практикой программирования считается не изменять изменяемые объекты, передаваемые в качестве параметров, если это не требуется в спецификации.
    • 3.6.A.2 Когда возвращаемое выражение вычисляется как ссылка на объект, возвращается сама ссылка, а не ссылка на новую копию этого объекта.
    • 3.6.A.3 Методы не могут получить доступ к приватным данным и методам параметра, хранящего ссылку на объект, если только этот параметр не имеет того же типа, что и класс-обладатель данного метода.

    Источник: Описание курса и экзамена College Board AP

    = копирует ссылку, а не объект

    Когда вы передаете объект методу, Java копирует ссылку, поэтому метод действует с тем же объектом — изменения его полей видны вызывающей стороне. (Примитивы копируются по значению, поэтому изменения в них не видны.) Метод также может возвращать ссылку на объект. Поскольку String неизменяем (immutable), передача его безопасна; передача изменяемого объекта позволяет методу изменить его.

    Java передает по значению: метод получает копию; истинная передача по ссылке, которой нет в Java, позволила бы ему переназначить переменную вызывающей стороны
    Java всегда передает по значению (слева): метод получает копию ссылки. Истинная передача по ссылке (справа) — которой нет в Java — позволила бы методу переназначить собственную переменную вызывающей стороны.

    Экзаменационный навык: знайте, что изменение полей объекта внутри метода влияет на оригинал, но переназначение параметра (param = new...) не влияет на вызывающую сторону.

    Разобраный пример. Предположим, что s — это Student со счетом 50, и мы вызываем 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
    }
    

    Строка (1) изменяет объект, на который указывает s, поэтому вызывающий код теперь видит 100. Строка (2) создает собственную копию ссылки метода, направленную на новый объект — при этом s вызывающего кода остается нетронутым, а строка (3) влияет только на этот новый объект. После завершения вызова s.getScore() остается 100: мутация сохранилась, а переназначение не изменило исходную ссылку.

    3.7

    Переменные и методы класса

    Программа

    Цель обучения 3.7.A: Написать код для определения поведения класса с помощью классовых методов.

    • 3.7.A.1 Классовые методы не могут получить доступ к значениям экземплярных переменных или вызывать экземплярные методы без передачи экземпляра класса через параметр.
    • 3.7.A.2 Классовые методы могут получать доступ к значениям классовых переменных, изменять их, а также вызывать другие классовые методы.

    Цель обучения 3.7.B: Написать код для объявления классовых переменных, принадлежащих классу.

    • 3.7.B.1 Классовые переменные принадлежат классу, и все объекты одного класса разделяют единственную копию такой переменной. Классовые переменные обозначаются ключевым словом static перед типом переменной.
    • 3.7.B.2 Классовые переменные, обозначенные public, вне классаAccessed with the class name and the dot operator, since they are associated with a class, not objects of a class.
    • 3.7.B.3 Когда переменная объявлена со словом final, её значение не может быть изменено.

    Источник: Описание курса и экзамена College Board AP

    статические против экземплярных полей

    Статическая (классовая) переменная, помеченная static, является общей для всех объектов класса — существует одна копия всего (например, счетчик количества существующих объектов). Статический метод принадлежит классу и не может напрямую использовать экземплярные поля. Обращайтесь к ним по имени класса: Student.getCount().

    3.8

    Область видимости и модификаторы доступа

    Программа

    Цель обучения 3.8.A: Объяснить, где переменные могут использоваться в коде.

    • 3.8.A.1 Локальные переменные — это переменные, объявленные в заголовках или телах блоков кода. Локальные переменные доступны только в том блоке, в котором они объявлены. Поскольку конструкторы и методы являются блоками кода, параметры конструкторов или методов также считаются локальными переменными. Эти переменные могут использоваться только внутри конструктора или метода и не могут быть объявлены как public или private.
    • 3.8.A.2 Когда существует локальная переменная или параметр с тем же именем, что и экземплярная переменная, имя переменной будет ссылаться на локальную переменную, а не на экземплярную переменную внутри тела конструктора или метода.

    Источник: Описание курса и экзамена College Board AP

    Область видимости — это место, где имя noticeably. Локальная переменная, объявленная внутри метода, существует только внутри него; параметр существует только в своем методе; экземплярная переменная доступна на протяжении всего существования объекта. Модификаторы доступа регулируют видимость между классами: private (только этот класс) против public (везде). Локальные переменные затеняют поля того же имени — это источник ошибок.

    Глобальная переменная видна везде; локальная переменная только внутри своего блока
    Глобальная переменная видна везде; локальная переменная только внутри своего блока
    English Русский
    Scope/skəʊp/ Область видимости
    3.9

    Ключевое слово this

    Программа

    Цель обучения 3.9.A: Написать код для самоссылающихся выражений и определить результат этих выражений.

    • 3.9.A.1 Внутри экземплярного метода или конструктора ключевое слово this действует как специальная переменная, хранящая ссылку на текущий объект — объект, чей метод или конструктор вызывается.
    • 3.9.A.2 Ключевое слово this может использоваться для передачи текущего объекта в качестве аргумента при вызове метода.
    • 3.9.A.3 У классовых методов нет ссылки на this.

    Источник: Описание курса и экзамена College Board AP

    this — это ссылка на текущий объект. Используйте его, чтобы отличить поле от параметра с тем же именем или вызвать другой метод того же объекта:

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

    Экзаменационный навык: когда у конструктора или сеттера параметр имеет то же имя, что и поле, вы обязаны писать this.field = param — без this присваивание не будет иметь никакого практического смысла.

    3.9

    Советы для экзамена

    • Проектирование с использованием методов и классов: инкапсулируйте данные как поля private и открывайте доступ к поведению через публичные методы.
    • Знать разницу между объектом и его классом, а также то, что объекты передаются по значению — параметр получает копию ссылки, поэтому метод может изменить состояние объекта, но переназначение параметра не влияет на вызывающий код (в Java нет передачи по ссылке).
    • Безопасно обходите массивы и ArrayListы — размер равен length против .size(), а удаление во время цикла смещает индексы.
    • Трассировать рекурсивный метод для определения его результата: сначала найдите базовый случай, затем проследите каждое рекурсивное вызов до получения возвращаемого значения (написание рекурсивного кода выходит за рамки экзамена).
    • Распознавать терминологию наследования — суперкласс, подкласс, переопределение метода, а также тот факт, что каждый класс является подклассом Object (проектирование и реализация наследования выходят за рамки экзамена).
  • 4

    Data Collections (Наборы данных)

    Смотреть урок
    4.1

    The Ethics of Collecting Data

    Программа

    Цель обучения 4.1.A: Объяснить риски для конфиденциальности при сборе и хранении персональных данных на компьютерных системах.

    • 4.1.A.1 При использовании компьютера возникает угроза конфиденциальности. При разработке новых программ разработчики должны стремиться защитить личную конфиденциальность пользователя.

    Цель обучения 4.1.B: Объяснить важность оценки качества данных и потенциальных проблем при работе с набором данных.

    • 4.1.B.1 Алгоритмическая предвзятость описывает систематические и повторяющиеся ошибки в программе, которые приводят к несправедливым результатам для определенной группы пользователей.
    • 4.1.B.2 Разработчики должны знать метод сбора набора данных и потенциал предвзятости при его использовании до применения данных для извлечения новой информации или формулирования выводов.
    • 4.1.B.3 Некоторые наборы данных неполны или содержат неточные данные. Использование таких данных при разработке или эксплуатации программы может привести к неправильной или неэффективной работе программы.

    Цель обучения 4.1.C: Определить подходящий набор данных для решения задачи или ответа на конкретный вопрос.

    • 4.1.C.1 Содержимое набора данных может быть связано с конкретным вопросом или темой и может не подходить для получения правильных ответов или извлечения информации по другому вопросу или теме.

    Источник: Описание курса и экзамена College Board AP

    Server racks in a data centre — large collections of data raise ethical questions about collection and use
    Server racks in a data centre — large collections of data raise ethical questions about collection and use

    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.

    English Русский
    privacy/ˈprɪvəsi/ конфиденциальности
    consent/kənˈsent/ согласие
    bias/ˈbaɪəs/ предвзятость
    4.2

    Why We Need Data Structures

    Программа

    Цель обучения 4.2.A: Представлять паттерны и алгоритмы, связанные с наборами данных, встречающимися в повседневной жизни, с помощью письменного текста или диаграмм.

    • 4.2.A.1 Набор данных — это совокупность конкретных сведений или данных.
    • 4.2.A.2 Наборы данных можно обрабатывать и анализировать для решения проблемы или ответа на вопрос. При анализе наборов данных значения внутри множества извлекаются и используются по одному, а затем обрабатываются согласно желаемому результату.
    • 4.2.A.3 Данные можно представить в виде диаграммы с использованием графика или таблицы. Эта визуализация может использоваться для планирования алгоритма, который будет применяться для обработки данных.

    Источник: Описание курса и экзамена College Board AP

    A filing cabinet: collections store many values under one name so algorithms can process them
    A filing cabinet: collections store many values under one name so algorithms can process them

    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.

    English Русский
    data structure/ˈdeɪtə ˈstrʌktʃə/ структура данных
    4.3

    Making and Reading an Array

    Программа

    Цель обучения 4.3.A: Разрабатывать код для представления коллекций связанных данных с использованием объектов одномерных (1D) массивов.

    • 4.3.A.1 Массив хранит несколько значений одного типа. Значения могут быть примитивными типами или ссылками на объекты.
    • 4.3.A.2 Длина массива устанавливается во время создания и не может быть изменена. Длину массива можно получить через атрибут length.
    • 4.3.A.3 Когда массив создается с ключевым словом new, все его элементы инициализируются значениями по умолчанию для типа данных элемента. Значение по умолчанию для int равно 0, для double — 0.0, для boolean — false, а для ссылочного типа — null.
    • 4.3.A.4 Для создания и инициализации массивов могут использоваться списки инициализатора.
    • 4.3.A.5 Квадратные скобки [ ] используются для доступа и изменения элемента в 1D массиве с помощью индекса.
    • 4.3.A.6 Допустимые значения индексов для массива находятся в диапазоне от 0 до длины массива минус один включительно. Использование значения индекса вне этого диапазона приведет к возникновению ошибки ArrayIndexOutOfBoundsException.

    Источник: Описание курса и экзамена College Board AP

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

    A one-dimensional array (a list) with its indices and bounds
    A one-dimensional array (a list) with its indices and bounds
    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)
    

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

    English Русский
    array/əˈreɪ/ массив (array)
    4.4

    Visiting Every Element of an Array

    Программа
    Learning ObjectiveEssential Knowledge

    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.

    Источник: Описание курса и экзамена College Board AP

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

    for (int i = 0; i < a.length; i++) { a[i] *= 2; }   // can modify
    for (int v : a) { System.out.println(v); }          // read each value
    
    English Русский
    Traverse/trəˈvɜːs/ Обход
    4.5

    Standard Array Algorithms

    Программа

    Цель обучения 4.5.A: Разработать код для стандартных и оригинальных алгоритмов в конкретном контексте или спецификации, включающем массивы, и определить результат работы этих алгоритмов.

    • 4.5.A.1 Существуют стандартные алгоритмы, использующие обход массивов для:
      • определения минимального или максимального значения
      • вычисления суммы или среднего значения
      • определения наличия хотя бы одного элемента с определенным свойством
      • определения наличия свойства у всех элементов
      • подсчета количества элементов с определенным свойством
      • доступа ко всем последовательным парам элементов
      • определения наличия или отсутствия дубликатов элементов
      • перемещения или поворота элементов влево или вправо
      • реверсирования порядка элементов

    Источник: Описание курса и экзамена College Board AP

    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:

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

    Reading Data from a Text File

    Программа

    Цель обучения 4.6.A: Разработать код для чтения данных из текстового файла.

    • 4.6.A.1 Файл — это хранилище данных, которое сохраняется после завершения работы программы. Данные в файле могут быть получены во время выполнения программы.
    • 4.6.A.2 Файл может быть подключен к программе с помощью классов File и Scanner.
    • 4.6.A.3 Файл можно открыть, создав объект File, передав имя файла в качестве аргумента конструктору.
      • File(String str) — это конструктор File, который принимает имя файла String для открытия в режиме чтения, где str — путь к файлу.
    • 4.6.A.4 При использовании класса File необходимо указать, что делать, если файл с указанным именем не может быть открыт. Один из способов — добавить throws IOException в заголовок метода, использующего файл. Если имя файла недействительно, программа завершится.
    • 4.6.A.5 Классы File и IOException являются частью пакета java.io. Для использования этих классов в программе необходимо использовать оператор import import.
    • 4.6.A.6 Следующие методы и конструкторы класса Scanner — включая их назначение и моменты применения — входят в Справочник по Java (Java Quick Reference):
      • Scanner(File f) — это конструктор Scanner, который принимает File для чтения.
      • int nextInt() возвращает следующее значение int, прочитанное из файла или источника ввода, если оно доступно. Если следующее значение int отсутствует или выходит за допустимый диапазон, возникает ошибка InputMismatchException.
      • double nextDouble() возвращает следующее значение double, прочитанное из файла или источника ввода. Если следующее значение double не существует, это приведет к исключению InputMismatchException.
      • boolean nextBoolean() возвращает следующее значение boolean, прочитанное из файла или источника ввода. Если следующее значение boolean не существует, это приведет к исключению InputMismatchException.
      • String nextLine() возвращает следующую строку текста как строковое значение String, прочитанное из файла или источника ввода; может вернуть пустую строку, если вызывается непосредственно после другого метода Scanner, который читает из файла или источника ввода.
      • String next() возвращает следующее значение String, прочитанное из файла или источника ввода.
      • Метод boolean hasNext() возвращает true, если есть следующий элемент для чтения в файле или источнике ввода; в противном случае возвращает false.
      • void close() закрывает этот сканер.
      • Исключение: Получение ввода с клавиатуры не входит в курс и экзамен AP Computer Science A.
    • 4.6.A.7 Использование nextLine и других методов Scanner совместно на одном источнике ввода иногда требует написания кода для корректной обработки различных способов этих методов работы с пробельными символами.
      • Исключение: Написание или анализ кода, использующего одновременно nextLine и другие методы Scanner на одном и том же источнике ввода, не входит в курс и экзамен AP Computer Science A.
    • 4.6.A.8 Следующий дополнительный метод класса String — включая его назначение и моменты применения — входит в Справочник по Java (Java Quick Reference):
      • String[] split(String del) возвращает массив String, где каждый элемент является подстрокой this String, которая была разделена вокруг совпадений заданного выражения del.
      • Исключение: Параметр del использует формат, называемый регулярным выражением. Написание или анализ кода, использующего любые специальные свойства регулярных выражений (например, \\*, \\.), не входит в курс и экзамен AP Computer Science A.
    • 4.6.A.9 Цикл for-each со while может использоваться для определения того, содержит ли файл еще элементы для чтения, путем использования метода hasNext в качестве условия цикла.
    • 4.6.A.10 Файл следует закрыть, когда программа перестала им пользоваться. Для закрытия файла вызывается метод close от объекта Scanner.

    Источник: Описание курса и экзамена College Board AP

    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:

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

    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.

    4.7

    Wrapping a Number in an Object

    Программа

    Цель обучения 4.7.A: Разработать код для использования объектов Integer и Double вместо примитивных аналогов и определить результат применения этих объектов.

    • 4.7.A.1 Класс Integer и класс Double являются частью пакета java.lang. Объект Integer является неизменяемым (immutable), то есть после создания объекта Integer его атрибуты нельзя изменить. Объект Double является неизменяемым, то есть после создания объекта Double его атрибуты нельзя изменить.
    • 4.7.A.2 Аутоупаковка (Autoboxing) — это автоматическое преобразование, которое компилятор Java выполняет между примитивными типами и соответствующими им классами-обертками объектов. Это включает преобразование int в Integer и double в Double. Компилятор Java применяет аутоупаковку, когда примитивное значение:
      • передается в качестве параметра методу, ожидающему объект соответствующего оберточного класса
      • присваивается переменной соответствующего оберточного класса
    • 4.7.A.3 Автоматическое распаковывание (unboxing) — это автоматическое преобразование, которое компилятор Java выполняет из класса-обёртки в примитивный тип. Это включает преобразование Integer в int и Double в double. Компилятор Java применяет автоматическое распаковывание, когда объект класса-обёртки:
      • передается в качестве параметра методу, ожидающему значение соответствующего примитивного типа
      • присваивается переменной соответствующего примитивного типа
    • 4.7.A.4 Следующий метод класса Integer — включая его назначение и моменты применения — входит в Справочник по Java (Java Quick Reference):
      • static int parseInt(String s) возвращает аргумент типа String как значение типа int.
    • 4.7.A.5 Следующий метод класса Double — включая его назначение и моменты применения — входит в Справочник по Java (Java Quick Reference):
      • static double parseDouble(String s) возвращает аргумент типа String как строковое значение double.

    Источник: Описание курса и экзамена College Board AP

    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).

    English Русский
    autoboxing/ˌɔːtəʊˈbɒksɪŋ/ автоупаковкой
    4.8

    The ArrayList Toolbox

    Программа

    Цель обучения 4.8.A: Разработать код для коллекций связанных объектов с использованием объектов ArrayList и определить результат вызова методов на этих объектах.

    • 4.8.A.1 Объект ArrayList изменяем по размеру и содержит ссылки на объекты.
    • 4.8.A.2 Конструктор ArrayList ArrayList() создает пустой список.
    • 4.8.A.3 Java позволяет использовать обобщенный тип ArrayList<E>, где параметр типа E указывает тип элементов. Когда ArrayList<E> указан, типы параметров-ссылок и возвращаемого типа при использовании методов ArrayList являются типом E. ArrayList<E> предпочтительнее, чем ArrayList. Например, ArrayList<String> names = new ArrayList<String>(); позволяет компилятору находить ошибки, которые в противном случае были бы обнаружены во время выполнения программы.
    • 4.8.A.4 Класс ArrayList является частью пакета java.util. Для использования этого класса в программе необходимо использовать оператор/инструкцию import.
    • 4.8.A.5 Следующие методы ArrayList — включая их назначение и моменты использования — входят в Справочник по Java:
      • int size() возвращает количество элементов в списке.
      • boolean add(E obj) добавляет obj в конец списка; возвращает true.
      • void add(int index, E obj) вставляет obj на позицию index (0 <= index <= size), сдвигая элементы на позициях index и выше вправо (добавляя 1 к их индексам) и увеличивая размер на 1.
      • E get(int index) возвращает элемент в позиции index в списке.
      • E set(int index, E obj) заменяет элемент на позиции index на obj; возвращает элемент, который ранее находился на позиции index.
      • E remove(int index) удаляет элемент из позиции index, перемещая элементы в позициях index + 1 и выше влево (уменьшая их индексы на 1) и уменьшая размер на 1; возвращает элемент, который ранее находился в позиции index.
    • 4.8.A.6 Индексы для объекта ArrayList начинаются с 0 и заканчиваются количеством элементов - 1.

    Источник: Описание курса и экзамена College Board AP

    What an ArrayList really is

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

    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)
    
    English Русский
    ArrayList/əˈreɪ lɪst/ ArrayList
    4.9

    Visiting Every Element of an ArrayList

    Программа

    Цель обучения 4.9.A: Написать код для обхода элементов объекта ArrayList и определить результаты этих обходов.

    • 4.9.A.1 Обход объекта ArrayList — это использование циклов или рекурсивных инструкций для доступа ко всем элементам или упорядоченной последовательности элементов в объекте ArrayList.
    • 4.9.A.2 Удаление элементов во время обхода объекта ArrayList требует использования специальных техник во избежание пропуска элементов.
    • 4.9.A.3 Попытка обращения к значению индекса вне допустимого диапазона приведет к возникновению ошибки IndexOutOfBoundsException.
    • 4.9.A.4 Изменение размера объекта ArrayList во время его обхода с использованием улучшенного цикла for может привести к ошибке ConcurrentModificationException. Поэтому, используя улучшенный цикл for для обхода объекта ArrayList, не следует добавлять или удалять элементы.

    Источник: Описание курса и экзамена College Board AP

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

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

    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.

    4.10

    Standard ArrayList Algorithms

    Программа

    Цель обучения 4.10.A: Разрабатывать код для стандартных и оригинальных алгоритмов для конкретного контекста или спецификации, включающих объекты ArrayList, и определять результат этих алгоритмов.

    • 4.10.A.1 Существуют стандартные алгоритмы для ArrayList, использующие обход для:
      • определения минимального или максимального значения
      • вычисления суммы или среднего значения
      • определения наличия хотя бы одного элемента с определенным свойством
      • определения наличия свойства у всех элементов
      • подсчета количества элементов с определенным свойством
      • доступа ко всем последовательным парам элементов
      • определения наличия или отсутствия дубликатов элементов
      • перемещения или поворота элементов влево или вправо
      • реверсирования порядка элементов
      • вставки элементов
      • удаления элементов
    • 4.10.A.2 Некоторые алгоритмы требуют одновременного обхода нескольких объектов String, массивов или объектов ArrayList.

    Источник: Описание курса и экзамена College Board AP

    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.

    4.11

    Grids: Two-Dimensional Arrays

    Программа
    Learning ObjectiveEssential Knowledge

    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.

    Источник: Описание курса и экзамена College Board AP

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

    A two-dimensional array (a table) with row and column indices
    A two-dimensional array (a table) with row and column indices
    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
    
    Исследовать

    Индексирование массива 2D по строке и столбцу

    2D массив — это сетка, индексируемая [row][col]. Перемещайте индексы и следите, какую ячейку они выбирают — сначала строку, затем столбец, обе счет ведутся с 0.

    English Русский
    2D array/ˌtuː ˈdiː əˈreɪ/ 2-мерный массив
    4.12

    Walking Through a Grid

    Программа
    Learning ObjectiveEssential Knowledge

    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.

    Источник: Описание курса и экзамена College Board AP

    Traversing a 2-D array

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

    for (int r = 0; r < grid.length; r++)
        for (int c = 0; c < grid[0].length; c++)
            System.out.print(grid[r][c]);
    
    English Русский
    row-major order/rəʊ ˈmeɪdʒə ˈɔːdə/ порядок по строкам
    4.13

    Standard 2D Array Algorithms

    Программа
    Learning ObjectiveEssential Knowledge

    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

    Источник: Описание курса и экзамена College Board AP

    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.

    4.14

    Finding a Value: Linear and Binary Search

    Программа
    Learning ObjectiveEssential Knowledge

    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.

    Источник: Описание курса и экзамена College Board AP

    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.
    Binary search halves the range at each step
    Binary search halves the range at each step
    Linear search checks every element in turn until the target is found
    Linear search checks every element in turn until the target is found
    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;
    }
    

    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.

    Исследовать

    Сравните линейный и бинарный поиск

    Линейный поиск проверяет каждый элемент по очереди; бинарный поиск делит отсортированный список пополам на каждом шаге. Наблюдайте, как бинарный поиск находит цель гораздо быстрее.

    English Русский
    Linear search/ˈlɪnɪə sɜːtʃ/ Линейный поиск
    Binary search/ˈbaɪnəri sɜːtʃ/ Бинарный поиск
    4.15

    Putting Data in Order: Selection and Insertion Sort

    Программа

    Цель обучения 4.15.A: Определить результат выполнения каждого шага алгоритмов сортировки для сортировки элементов коллекции.

    • 4.15.A.1 Сортировка выбором (selection sort) и сортировка вставками (insertion sort) — это итеративные алгоритмы сортировки, которые могут использоваться для сортировки элементов в массиве или списке ArrayList.
    • 4.15.A.2 Сортировка выбором многократно выбирает наименьший (или наибольший) элемент из неотсортированной части списка и меняет его местами с элементом, стоящим на правильной (и окончательной) позиции в отсортированной части списка.
    • 4.15.A.3 Сортировка вставками помещает элемент из неотсортированной части списка на его правильное (но не обязательно конечное) место в отсортированной части списка, сдвигая элементы отсортированной части, чтобы освободить место для нового элемента.

    Источник: Описание курса и экзамена College Board AP

    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.
    An insertion sort, shifting each key into place pass by pass
    An insertion sort, shifting each key into place pass by pass

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

    Исследовать

    Наблюдайте, как алгоритм сортировки упорядочивает список

    Сортировка переставляет элементы в порядке. Пройдитесь по выборочной/вставочной сортировке, чтобы увидеть, как отсортированная область растет на один элемент за раз.

    English Русский
    Selection sort/sɪˈlekʃn sɔːt/ Сортировка выбором
    Insertion sort/ɪnˈsɜːʃn sɔːt/ Сортировка вставками
    4.16

    Methods That Call Themselves: Recursion

    Программа

    Цель обучения 4.16.A: Определять результат вызова рекурсивных методов.

    • 4.16.A.1 Рекурсивный метод — это метод, который вызывает сам себя. Рекурсивные методы содержат как минимум одно базовое условие, останавливающее рекурсию, и как минимум один рекурсивный вызов. Рекурсия является еще одной формой повторения.
    • 4.16.A.2 Каждый рекурсивный вызов имеет свой собственный набор локальных переменных, включая параметры. Значения параметров фиксируют прогресс рекурсивного процесса, подобно тому, как значения управляющей переменной цикла фиксируют прогресс цикла.
    • 4.16.A.3 Любое рекурсивное решение может быть реализовано с помощью итеративного подхода, и наоборот.
      • Исключение: Написание рекурсивного кода не входит в курс и экзамен по информатике AP Computer Science A.

    Источник: Описание курса и экзамена College Board AP

    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:

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

    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:

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

    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.

    Исследовать

    Разверните рекурсивный вызов

    Рекурсивный метод вызывает сам себя на меньшем входе до достижения базового случая, затем результаты сворачиваются обратно. Пройдитесь по шагам, чтобы увидеть, как вызовы накапливаются и разворачиваются.

    English Русский
    Recursion/rɪˈkɜːʃn/ Рекурсия
    base case/beɪs keɪs/ базовым случаем
    4.17

    Recursive Search and Merge Sort

    Программа

    Цель обучения 4.17.A: Определять результат выполнения рекурсивных алгоритмов, использующих строки или коллекции.

    • 4.17.A.1 Рекурсию можно использовать для обхода String объектов, массивов и ArrayList объектов.

    Цель обучения 4.17.B: Определять результат каждой итерации алгоритма бинарного поиска, используемого для поиска информации в коллекции.

    • 4.17.B.1 Данные должны быть отсортированы для использования алгоритма бинарного поиска. Бинарный поиск начинается с середины отсортированного массива или ArrayList и отбрасывает половину массива или ArrayList при каждом рекурсивном вызове, пока не будет найдено нужное значение или все элементы не будут исключены.
    • 4.17.B.2 Бинарный поиск обычно эффективнее линейного поиска.
      • Исключение: Алгоритмы поиска, отличные от линейного и бинарного, не входят в курс и экзамен по информатике AP Computer Science A.
    • 4.17.B.3 Алгоритм бинарного поиска может быть написан как итеративно, так и рекурсивно.

    Цель обучения 4.17.C: Определять результат каждой итерации алгоритма сортировки слиянием при использовании для сортировки коллекции.

    • 4.17.C.1 Сортировка слиянием — это рекурсивный алгоритм сортировки, который можно использовать для упорядочивания элементов в массиве или ArrayList.
      • Исключение: Алгоритмы сортировки, отличные от сортировки выбором, сортировки вставками и сортировки слиянием, не входят в курс и экзамен по информатике AP Computer Science A.
    • 4.17.C.2 Сортировка слиянием постоянно делит массив на меньшие подмассивы до тех пор, пока каждый подмассив не станет состоять из одного элемента, а затем рекурсивно объединяет отсортированные подмассивы обратно в отсортированном порядке, образуя итоговый отсортированный массив.

    Источник: Описание курса и экзамена College Board AP

    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.

    Merge sort splits the array to single elements, then merges sorted halves back up
    Merge sort splits the array to single elements, then merges sorted halves back up

    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.

    English Русский
    Merge sort/mɜːdʒ sɔːt/ Сортировка слиянием
    4.17

    Exam tips

    • 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.

Войти или создать аккаунт

IGCSE, A-Level & AP