Вот одна задача: вывести всех студентов с оценкой A. Один программист пишет цикл — начать с первой записи, проверить оценку, добавить имя в список, перейти к следующей…
English narration · English + 中文 subtitles burned in · Английское озвучивание · Английский + китайские субтитры (встроенные)
Understanding what is meant by a programming paradigm
Show understanding of the characteristics of a number of programming paradigms:
• Low-level
Low-level Programming: • understanding of and ability to write low-level code that uses various addressing modes: immediate, direct, indirect, indexed and relative
• Imperative (Procedural)
Imperative (Procedural) programming: • Assumed knowledge and understanding of Structural Programming (see details in AS content section 11.3) • understanding of and ability to write imperative (procedural) programming code that uses variables, constructs, procedures and functions. See details in AS content
• Object Oriented
Object-Oriented Programming (OOP): • understanding of the terminology associated with OOP (including objects, properties/attributes, methods, classes, inheritance, polymorphism, containment (aggregation), encapsulation, getters, setters, instances) • understanding of how to solve a problem by designing appropriate classes • understanding of and ability to write code that demonstrates the use of OOP
• Declarative
Declarative programming: • understanding of and ability to solve a problem by writing appropriate facts and rules based on supplied information • understanding of and ability to write code that can satisfy a goal using facts and rules
Русский
Кандидаты должны уметь:
Примечания и рекомендации
Понимать значение понятия парадигма программирования
Показать понимание особенностей ряда парадигм программирования:
• Низкоуровневое программирование
Низкоуровневое программирование: понимание и способность писать низкоуровневый код, использующий различные режимы адресации: непосредственный (immediate), прямой (direct), косвенный (indirect), индексированный (indexed) и относительный (relative).
• Императивное (Процедурное)
Императивное (Процедурное) программирование: • предполагаемые знания и понимание Структурного программирования (см. детали в разделе содержания AS 11.3) • понимание и способность писать императивный (процедурный) программный код, использующий переменные, конструкции, процедуры и функции. См. детали в содержании AS
• Объектно-ориентированное
Объектно-ориентированное программирование (ООП): • понимание терминологии, связанной с ООП (включая объекты, свойства/атрибуты, методы, классы, наследование, полиморфизм, включение (агрегация), инкапсуляцию, геттеры, сеттеры, экземпляры) • понимание того, как решать задачи путем проектирования соответствующих классов • понимание и способность писать код, демонстрирующий использование ООП
• Декларативное
Декларативное программирование: • понимание и способность решать задачи путем написания соответствующих фактов и правил на основе предоставленной информации • понимание и способность писать код, который может достичь цели с использованием фактов и правил
Source: Cambridge International syllabus · Источник: Программа Cambridge International
English
A programming paradigm 编程范式 is a style of programming — a way of structuring programs, with its own ideas and language features. Four programming paradigms are in this syllabus.
"Describe what is meant by an imperative (procedural) language" (two marks).A language in which the program is a sequence of instructions that are executed in order and that change the program's state; the programmer says how the task is done, using procedures, sequence, selection and iteration."Describe what is meant by a declarative language":the program states facts and rules (what is known and what is wanted) and the language's inference engine works out how to find the answer; the programmer does not give the sequence of steps.
Identify the paradigm from a code sample (a regular Paper 3 question): LDD 200, ADD #5, STO 201 is low-level (mnemonics, registers, memory addresses); FOR Count ← 1 TO 10 … NEXT Count with procedures and assignments is imperative; CLASS Dog … PRIVATE Name : STRING … PUBLIC PROCEDURE NEW(…) is object-oriented; type(lion, wild). and dangerous(X) IF type(X, wild) is declarative (logic). In the matching question: low-level pairs with "mnemonics that correspond directly to machine instructions", imperative with "a sequence of statements that change the state", OOP with "objects that combine attributes and methods", declarative with "facts and rules, with no order of execution given".
Low-level programming
Programming close to the hardware in machine code 机器码 or assembly language 汇编语言, where each instruction maps to what the CPU runs. It gives direct access to registers 寄存器 and memory addresses 内存地址, using different addressing modes 寻址方式 (immediate, direct, indirect, indexed and relative). It is very fast and compact, but architecture-specific, tedious, and hard to maintain. This is low-level 低级 programming, used for device drivers, firmware and bootloaders.
The five addressing modes. The syllabus asks for low-level code that uses each addressing mode (the instruction set is in Topic 4). The operand of a load instruction can be read five ways, and the exam gives you the memory contents and asks what the accumulator holds:
immediate (LDM #105): the operand is the value; ACC becomes 105.
direct (LDD 105): the operand is the address of the value; ACC becomes the contents of 105, here 27.
indirect (LDI 105): the operand is the address of an address; ACC becomes the contents of 27, here 91. Used for pointers and for data whose position is decided at run time.
indexed (LDX 105): the address is the operand plus the index register IX; with IX = 2, ACC becomes the contents of 107. Used to step through an array by incrementing IX.
relative (JMR +65): the target is an offset from the address of the current instruction, which makes the code relocatable.
Worked example. Memory: 105 holds 27, 106 holds 64, 200 holds 0. Write code to add the contents of 105 and 106, store the result in 200 and output it. LDD 105 (ACC = 27), ADD 106 (ACC = 91), STO 200, OUT. To double the value in 105 instead: LDD 105, ADD 105, STO 105. State the register contents after each line when asked to trace.
Imperative (procedural) programming
In imperative programming 命令式编程 the programmer writes a sequence of commands that change the program's state — assignments, conditionals, loops, function calls. Variables 变量 hold state; statements change it; code is organised into procedures and functions (also called structured or structural programming). This is the style of Topics 9 and 11 (Python, C). Strong when the algorithm has clear sequential steps.
Object-oriented programming (OOP)
In object-oriented programming 面向对象编程 programs are built from objects 对象 — units combining data (attributes 属性) and operations (methods 方法). Objects are instances 实例 of classes 类. The four pillars:
encapsulation 封装 — an object's data is hidden behind its methods; outside code uses the public methods only, not the data directly. This protects the object and lets its internals change without breaking callers. For example, a BankAccount hides its balance; you change it only through deposit() and withdraw(), which can enforce a rule like "never go below zero".
inheritance 继承 — a subclass 子类 specialises a superclass 父类, inheriting its attributes and methods and adding or overriding 重写 them. Models "is-a" ("a Manager is an Employee").
polymorphism 多态 — different objects respond to the same method call differently; the caller need not know the exact type. Every Shape has Area(), and a Circle and a Rectangle each implement it their own way.
abstraction 抽象 — show a simple interface and hide the implementation.
Other terms:
a constructor 构造函数 is a special method run when an object is created, to set up its attributes.
getters and setters read and write an object's attributes (its properties) through methods.
aggregation 聚合 and containment 包含 build an object from other objects (a "has-a" relationship).
OOP is used for large systems, GUIs, simulations and games.
OOP as the examiner marks it
Definitions.Class: a template (blueprint) that defines the attributes and methods of the objects of that type. Object: an instance of a class, created from it, with its own values for the attributes ("an occurrence of an object" is the exam's phrase for an instance). Attribute (property): a data item belonging to a class. Method: a procedure or function belonging to a class that acts on its attributes. Encapsulation: combining the attributes and methods in one class and restricting external access to the data: the attributes are private and can only be read or changed through public methods. Inheritance: a subclass acquires the attributes and methods of its parent (super) class and can add its own or override them. Polymorphism: methods with the same name that behave differently in different classes; typically a subclass redefines a method of its parent, and the right version runs for each object. Containment: a class has an object of another class as an attribute (a car has an engine). "Identify the feature that restricts external access to the data" is encapsulation; "the term for an occurrence of an object" is instance.
"Outline the structure of a class" (three marks): attributes (properties) that hold the object's data, usually declared private; methods (procedures and functions) that act on those attributes, usually public; and a constructor, a method that runs when an object is created to initialise the attributes. "Give three benefits of OOP": code is reused through inheritance; data is protected by encapsulation, so it can only be changed by the class's own methods; a large program is split into classes that are written and tested independently, so it is easier to maintain and extend; classes model real-world entities, so the design is easier to understand; polymorphism lets the same call work for different objects.
The class in pseudocode, as Paper 3 sets it:
An object is created with MyCar ← NEW Car("AB12 CDE", 2020) and used with MyCar.AddMileage(150) and OUTPUT MyCar.GetMileage(). A subclass reuses the parent's constructor through SUPER:
The same class in Python, as Paper 4 expects it: attributes are made private with a double underscore, the constructor is __init__, and a subclass names its parent in brackets and calls super().__init__(…):
In Java the same ideas are private/public fields, a constructor with the class's name, extends and super(…); in VB.NET Private/Public, Sub New, Inherits and MyBase.New. A polymorphic method is written in the parent and overridden in the child with the same name; a call through a parent-type variable runs the child's version.
Data structures as objects. Paper 4 builds a stack, linked list or binary tree from a Node class whose attributes are the data and one or two references to other nodes; a Tree (or LinkedList) class holds the root (or start) and the methods.
A find method walks the same path and returns TRUE when Current.Data = Target, FALSE when it reaches NULL; an in-order output method is recursive: output the left subtree, the node, then the right subtree. For a linked list the node has one reference, Next, and the list class holds Start; for a stack built from a list, push and pop both work at Start.
Worked example. A game has characters. Each has a name, health (starting at 100) and a position given by X and Y. Write a class Character with a constructor and a method Move(DX, DY); then a subclass Wizard that adds Mana (starting at 50) and a method CastSpell() that takes 10 mana and returns TRUE if there was enough.
The marks are for private attributes, a constructor that sets every attribute, the inheritance line, the call to the parent's constructor, and a method that uses and changes the object's own data. When the question asks for a class diagram, draw a box in three parts (name; attributes with - for private; methods with + for public) and join a subclass to its parent with an arrow pointing at the parent.
Declarative programming
In declarative programming 声明式编程 you say what to compute, not how — the runtime works out the steps. Two kinds:
functional programming 函数式编程 — built from pure functions 纯函数 (no side effects 副作用; same input always gives the same output) composed together. Examples: Haskell, Lisp.
logic programming 逻辑编程 — state facts and rules; the engine answers a goal (query) by inference. Example: Prolog.
A familiar declarative example is SQL 结构化查询语言: SELECT * FROM Customer WHERE Country = 'UK' says what you want, not how to walk the records.
Facts, rules and goals are what the exam tests in the declarative paradigm. Given these facts 事实 (statements that are true) and a rule 规则 (a conclusion that holds when its conditions hold):
"Write the result of the goal type(X, wild)":X = leopard, X = lion. The engine matches the goal against each fact in turn; every match is a solution, and a capital letter is a variable that the match fills in. "Write a fact to show that a cheetah is wild":type(cheetah, wild)."Explain what line 07 does": it defines a rule with the conclusion dangerous(X), which is true for any X that is both wild and large, so dangerous(A) returns A = leopard, A = lion. "Write a rule: a feature F may be available for a body style B if F is a feature and B is a body style and F is not unavailable for B":may_be_available(F, B) IF feature(F) AND body_style(B) AND NOT unavailable(F, B). Copy the exact predicate names and argument order used in the question's facts; a new fact ends with a full stop, and a rule's conditions are joined with AND.
Comparing paradigms
Paradigm
Strength
Typical languages
Low-level
maximum control, speed
assembly
Imperative
direct, intuitive
C, Python
Object-oriented
modular, models entities
Java, C#, Python
Functional
clear, no side effects
Haskell, F#
Logic
inference, rules
Prolog
Database
data queries
SQL
Modern languages often mix paradigms — Python supports all of procedural, OOP and functional. The right one depends on the problem.
Русский
Парадигма программирования — это стиль программирования, способ структурирования программ со своими идеями и языковыми возможностями. В данной программе изучаются четыре парадигмы программирования.
«Опишите, что понимается под императивным (процедурным) языком» (два балла).Язык, в котором программа представляет собой последовательность инструкций, выполняемых по порядку и изменяющих состояние программы; программист указывает, как выполняется задача, используя процедуры, последовательности, выбор и итерации.«Опишите, что понимается под декларативным языком»:программа описывает факты и правила (что известно и чего хотят достичь), а движок вывода языка определяет, как найти ответ; программист не задает последовательность шагов.
Определите парадигму по фрагменту кода (типичный вопрос Бумаги 3): LDD 200, ADD #5, STO 201 — низкоуровневый (мнемонические коды, регистры, адреса памяти); FOR Count ← 1 TO 10 … NEXT Count с процедурами и присваиваниями — императивный; CLASS Dog … PRIVATE Name : STRING … PUBLIC PROCEDURE NEW(…) — объектно-ориентированный; type(lion, wild). и dangerous(X) IF type(X, wild) — декларативный (логика). В вопросе на сопоставление: низкоуровневый соответствует «мнемоническим кодам, напрямую соответствующим машинным инструкциям», императивный — «последовательности операторов, изменяющих состояние», ООП — «объектам, объединяющим атрибуты и методы», декларативный — «фактам и правилам без указания порядка выполнения».
Четыре парадигмы: низкоуровневая, императивная, объектно-ориентированная и декларативная
Низкоуровневое программирование
Программирование, близкое к аппаратному обеспечению, на машинных кодах или ассемблере, где каждая инструкция соответствует действиям процессора. Обеспечивает прямой доступ к регистрам и адресам памяти с использованием различных режимов адресации (непосредственный, прямой, косвенный, индексный и относительный). Это очень быстро и компактно, но специфично для архитектуры, трудоемко и сложно поддерживать. Это низкоуровневое программирование, используемое для драйверов устройств, прошивок и загрузчиков.
Пять режимов адресации. Программа требует написания низкоуровневого кода, использующего каждый режим адресации (набор инструкций находится в Разделе 4). Операнд инструкции загрузки может быть прочитан пятью способами, и на экзамене вам дают содержимое памяти и спрашивают, что содержит аккумулятор:
Тот же операнд, 105, прочитанный пятью способами: как значение, как адрес, как адрес адреса, как адрес плюс индексный регистр и как смещение от текущей инструкции
непосредственный (LDM #105): операнд является значением; ACC становится равным 105.
прямой (LDD 105): операнд является адресом значения; ACC становится равным содержимому 105, здесь 27.
косвенный (LDI 105): операнд является адресом адреса; ACC становится равным содержимому 27, здесь 91. Используется для указателей и данных, положение которых определяется во время выполнения.
индексный (LDX 105): адрес равен операнду плюс индексный регистр IX; при IX = 2, ACC становится равным содержимому 107. Используется для перебора массива путем инкремента IX.
относительный (JMR +65): целевой адрес — это смещение от адреса текущей инструкции, что делает код перемещаемым.
Разобранный пример. Память: 105 содержит 27, 106 содержит 64, 200 содержит 0. Напишите код для сложения содержимого 105 и 106, сохранения результата в 200 и его вывода. LDD 105 (ACC = 27), ADD 106 (ACC = 91), STO 200, OUT. Чтобы удвоить значение в 105 вместо этого: LDD 105, ADD 105, STO 105. Укажите содержимое регистров после каждой строки, если требуется выполнить трассировку.
Императивное (процедурное) программирование
В императивном программировании программист пишет последовательность команд, изменяющих состояние программы — присваивания, условные операторы, циклы, вызовы функций. Переменные хранят состояние; операторы его изменяют; код организуется в процедуры и функции (также называемые структурным или структурным программированием). Это стиль тем 9 и 11 (Python, C). Сильная сторона — когда алгоритм имеет четкие последовательные шаги.
Объектно-ориентированное программирование (ООП)
В объектно-ориентированном программировании программы строятся из объектов — единиц, объединяющих данные (атрибуты) и операции (методы). Объекты являются экземплярамиклассов. Четыре столпа:
инкапсуляция — данные объекта скрыты за его методами; внешний код использует только публичные методы, а не данные напрямую. Это защищает объект и позволяет изменять его внутреннюю структуру без нарушения работы вызывающего кода. Например, BankAccount скрывает свои balance; вы изменяете их только через deposit() и withdraw(), которые могут enforce правило, например, «никогда не уходить ниже нуля».
наследование — подкласс специализирует суперкласс, наследуя его атрибуты и методы и добавляя или переопределяя их. Моделирует отношение «является» («Менеджер является Сотрудником»).
полиморфизм — разные объекты реагируют на один и тот же вызов метода по-разному; вызывающему коду не обязательно знать точный тип. Каждый Shape имеет Area(), а Circle и Rectangle реализуют его по-своему.
абстракция — показать простой интерфейс и скрыть реализацию.
Другие термины:
конструктор — специальный метод, запускаемый при создании объекта для настройки его атрибутов.
геттеры и сеттеры читают и записывают атрибуты объекта (его свойства) через методы.
агрегация и композиция создают объект из других объектов (отношение «имеет»).
ООП используется для крупных систем, графических интерфейсов, симуляций и игр.
Полиморфизм: один и тот же вызов метода запускает собственный код каждого объектаДиаграмма классов для Shape: приватные атрибуты и публичные методыНаследование: partTime и fullTime являются подклассами employeeИнкапсуляция: данные объекта находятся в закрытом доступе, доступны только через его публичные методы
ООП как оценивает экзаменатор
Определения.Класс:шаблон (чертеж), определяющий атрибуты и методы объектов данного типа. Объект:экземпляр класса, созданный на его основе, со своими значениями атрибутов («случай появления объекта» — формулировка экзамена для экземпляра). Атрибут (свойство): элемент данных, принадлежащий классу. Метод: процедура или функция, принадлежащая классу и действующая на его атрибуты. Инкапсуляция: объединение атрибутов и методов в одном классе и ограничение внешнего доступа к данным: атрибуты приватны и могут быть прочитаны или изменены только через публичные методы. Наследование: подкласс наследует атрибуты и методы своего родительского (супер) класса и может добавить свои или переопределить их. Полиморфизм: методы с одинаковым названием, которые ведут себя по-разному в различных классах; обычно подкласс переопределяет метод родительского, и для каждого объекта выполняется соответствующая версия. Композиция: класс содержит объект другого класса в качестве атрибута (машина имеет двигатель). «Определите признак, ограничивающий внешний доступ к данным» — это инкапсуляция; «термин для случая появления объекта» — это экземпляр.
«Опишите структуру класса» (три балла): атрибуты (свойства), хранящие данные объекта, обычно объявляемые приватными; методы (процедуры и функции), действующие на эти атрибуты, обычно публичные; и конструктор, метод, выполняемый при создании объекта для инициализации атрибутов. «Назовите три преимущества ООП»: код повторно используется благодаря наследованию; данные защищены инкапсуляцией, поэтому могут быть изменены только собственными методами класса; большая программа разбивается на классы, которые пишутся и тестируются независимо, что облегчает обслуживание и расширение; классы моделируют реальные сущности, поэтому дизайн проще понять; полиморфизм позволяет одному и тому же вызову работать с разными объектами.
Класс на псевдокоде, как требуется в Paper 3:
CLASS Car
PRIVATE Registration : STRING
PRIVATE Year : INTEGER
PRIVATE Mileage : INTEGER
PUBLIC PROCEDURE NEW(NewReg : STRING, NewYear : INTEGER)
Registration ← NewReg
Year ← NewYear
Mileage ← 0
ENDPROCEDURE
PUBLIC FUNCTION GetMileage() RETURNS INTEGER
RETURN Mileage
ENDFUNCTION
PUBLIC PROCEDURE AddMileage(Extra : INTEGER)
Mileage ← Mileage + Extra
ENDPROCEDURE
ENDCLASS
Объект создается с помощью MyCar ← NEW Car("AB12 CDE", 2020) и используется с MyCar.AddMileage(150) и OUTPUT MyCar.GetMileage(). Подкласс переиспользует конструктор родителя через SUPER:
CLASS ElectricCar INHERITS Car
PRIVATE BatteryCapacity : REAL
PUBLIC PROCEDURE NEW(NewReg : STRING, NewYear : INTEGER, NewCapacity : REAL)
SUPER.NEW(NewReg, NewYear)
BatteryCapacity ← NewCapacity
ENDPROCEDURE
ENDCLASS
Тот же самый класс на Python, как ожидает Paper 4: атрибуты делаются приватными двойным подчеркиванием, конструктор — это __init__, а имя подкласса указывает родителя в скобках и вызывает super().__init__(…):
В Java те же идеи представлены как private/public поля, конструктор с именем класса, extends и super(…); в VB.NET — Private/Public, Sub New, Inherits и MyBase.New. Полиморфный метод пишется в родителе и переопределяется в потомке тем же именем; вызов через переменную типа родителя выполняет версию потомка.
Структуры данных как объекты. Paper 4 строит стек, связный список или бинарное дерево из Node класса, чьи атрибуты — это данные и один или два ссылки на другие узлы; Tree (или LinkedList) класс хранит корень (или начало) и методы.
Бинарное дерево, построенное из объектов: каждый Node хранит Data плюс ссылки Left и Right, а Tree хранит Root; вставка происходит путем спуска по ссылкам
CLASS Node
PUBLIC Data : INTEGER
PUBLIC Left : Node // NULL when there is no child
PUBLIC Right : Node
PUBLIC PROCEDURE NEW(NewData : INTEGER)
Data ← NewData
Left ← NULL
Right ← NULL
ENDPROCEDURE
ENDCLASS
CLASS Tree
PRIVATE Root : Node
PUBLIC PROCEDURE Insert(NewData : INTEGER)
DECLARE NewNode, Current : Node
DECLARE Placed : BOOLEAN
NewNode ← NEW Node(NewData)
IF Root = NULL THEN
Root ← NewNode
ELSE
Current ← Root
Placed ← FALSE
WHILE NOT Placed
IF NewData < Current.Data THEN
IF Current.Left = NULL THEN
Current.Left ← NewNode
Placed ← TRUE
ELSE
Current ← Current.Left
ENDIF
ELSE
IF Current.Right = NULL THEN
Current.Right ← NewNode
Placed ← TRUE
ELSE
Current ← Current.Right
ENDIF
ENDIF
ENDWHILE
ENDIF
ENDPROCEDURE
ENDCLASS
Метод поиска проходит тот же путь и возвращает TRUE, когда Current.Data = Target, FALSE при достижении NULL; рекурсивный метод вывода в порядке in-order: выводит левое поддерево, узел, затем правое поддерево. Для связного списка узел имеет одну ссылку, Next, а класс списка хранит Start; для стека, построенного на основе списка, push и pop работают в Start.
Разобраный пример. В игре есть персонажи. У каждого есть имя, здоровье (начальное значение 100) и позиция, заданная X и Y. Напишите класс Character с конструктором и методом Move(DX, DY); затем подкласс Wizard, добавляющий Mana (начальное значение 50) и метод CastSpell(), который тратит 10 маны и возвращает TRUE, если её было достаточно.
CLASS Character
PRIVATE Name : STRING
PRIVATE Health : INTEGER
PRIVATE X : INTEGER
PRIVATE Y : INTEGER
PUBLIC PROCEDURE NEW(NewName : STRING, StartX : INTEGER, StartY : INTEGER)
Name ← NewName
Health ← 100
X ← StartX
Y ← StartY
ENDPROCEDURE
PUBLIC PROCEDURE Move(DX : INTEGER, DY : INTEGER)
X ← X + DX
Y ← Y + DY
ENDPROCEDURE
ENDCLASS
CLASS Wizard INHERITS Character
PRIVATE Mana : INTEGER
PUBLIC PROCEDURE NEW(NewName : STRING, StartX : INTEGER, StartY : INTEGER)
SUPER.NEW(NewName, StartX, StartY)
Mana ← 50
ENDPROCEDURE
PUBLIC FUNCTION CastSpell() RETURNS BOOLEAN
IF Mana >= 10 THEN
Mana ← Mana - 10
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDFUNCTION
ENDCLASS
Баллы начисляются за приватные атрибуты, конструктор, устанавливающий все атрибуты, строку наследования, вызов конструктора родителя и метод, использующий и изменяющий собственные данные объекта. Когда вопрос требует диаграмму классов, нарисуйте коробку из трех частей (имя; атрибуты с - для приватных; методы с + для публичных) и соедините подкласс с родителем стрелкой, указывающей на родителя.
Декларативное программирование
В декларативном программировании вы указываете, что нужно вычислить, а не как — время выполнения определяет шаги. Два вида:
функциональное программирование — построено из чистых функций (без побочных эффектов; одинаковый вход всегда даёт одинаковый выход), объединённых вместе. Примеры: Haskell, Lisp.
логическое программирование — задаёт факты и правила; движок отвечает на цель (запрос) путём вывода. Пример: Prolog.
Примером декларативного подхода является SQL: SELECT * FROM Customer WHERE Country = 'UK' описывает желаемый результат, а не алгоритм обхода записей.
Факты, правила и цели — это то, что проверяют на экзамене в декларативной парадигме. Даны эти факты (утверждения, являющиеся истинными) и правило (вывод, верный при выполнении его условий):
"Запишите результат цели type(X, wild)": X = leopard, X = lion. Движок сопоставляет цель с каждым фактом по очереди; каждое совпадение является решением, а заглавная буква — это переменная, которую заполняет совпадение. "Запишите факт, показывающий, что гепард дикий":type(cheetah, wild)."Объясните, что делает строка 07": она определяет правило с выводом dangerous(X), которое верно для любого X, который одновременно дикий и крупный, поэтому dangerous(A) возвращает A = leopard, A = lion. "Запишите правило: функция F может быть доступна для стиля кузова B, если F является функцией, B — стилем кузова, и F не недоступен для B":may_be_available(F, B) IF feature(F) AND body_style(B) AND NOT unavailable(F, B). Скопируйте точные имена предикатов и порядок аргументов, использованные в фактах вопроса; новый факт заканчивается точкой, а условия правила соединяются через AND.
Сравнение парадигм
Парадигма
Сильная сторона
Типичные языки
Низкоуровневая
максимальный контроль, скорость
ассемблер
Императивная
прямая, интуитивная
C, Python
Объектно-ориентированная
модульная, моделирует сущности
Java, C#, Python
Функциональная
понятная, без побочных эффектов
Haskell, F#
Логическая
вывод, правила
Prolog
Баз данных
запросы к данным
SQL
Современные языки часто сочетают парадигмы — Python поддерживает все три: процедурную, ООП и функциональную. Правильный выбор зависит от задачи.
Explore · Исследовать
Programming concept lab · Лабораторная работа по программированию
Connect examples to the programming idea they show. · Сопоставьте примеры с показанной ими программной идеей.
Open (in read, write, append mode) and close a file Read a record from a file and write a record to a file Perform file-processing operations on serial, sequential, random files
Show understanding of an exception and the importance of exception handling
Know when it is appropriate to use exception handling Write program code to use exception handling
Русский
Кандидаты должны уметь:
Примечания и рекомендации
Писать код для выполнения операций обработки файлов
Открывать (в режимах чтения, записи, добавления) и закрывать файл Считывать запись из файла и записывать запись в файл Выполнять операции обработки файлов над последовательными, линейными, случайного доступа файлами
Проявлять понимание исключения и важности обработки исключений
Знать, когда уместно использовать обработку исключений Писать программный код для использования обработки исключений
Source: Cambridge International syllabus · Источник: Программа Cambridge International
English
This extends the file 文件 handling from Topic 10, processing serial, sequential and random (direct-access) files. Pseudocode operations: OPENFILE name FOR READ | WRITE | APPEND (READ opens an existing file, WRITE creates/overwrites, APPEND adds to the end); READFILE name, line; WRITEFILE name, value; CLOSEFILE name; and EOF(name) which is TRUE at the end.
Read a whole file:
Search a file (stop when found):
Updating a file in place
Most languages can't edit a text file in place. Instead: open the original for READ and a temporary file for WRITE; for each line, write the new version if it should change, else the original; close both; then replace the original with the temp file. The same pattern handles deleting lines (skip them) and inserting lines.
Records and random-access files
Opening modes.READ: the file must exist and reading starts at the beginning. WRITE: a new file is created, and an existing file of that name is overwritten. APPEND: writing adds to the end of an existing file. Every file that is opened is closed with CLOSEFILE, and EOF(name) is TRUE when the last item has been read.
Three file organisations. In a serial file the records are in the order they were added; in a sequential file they are in key order; both are read from the start. A random file 随机文件 (direct-access file) stores each record at an address calculated from its key by a hashing 哈希 function, so one record is found without reading the others. Records are declared as a user-defined type:
The random-file operations in pseudocode are OPENFILE "Acc.dat" FOR RANDOM, SEEK "Acc.dat", Address (move the file pointer to that record), GETRECORD "Acc.dat", Rec (read the record there) and PUTRECORD "Acc.dat", Rec (write the record there). Finding a customer by account number, as Paper 3 sets it:
To store a record, hash its key, SEEK to the address and PUTRECORD, stepping on past any slot already occupied. Marks go to the hash, the SEEK before the GET or PUT, the comparison with the target, the handling of a collision, and closing the file.
Worked example.ActiveFile.dat holds AccountRecord records. Write pseudocode that copies every record whose Active field is FALSE to the end of ArchiveFile.dat.
Text files in Python (Paper 4): file = open("HighScore.txt", "r"), then for line in file: with line.strip() and line.split(",") to separate the fields, int(…) to convert a score, and file.close(); to write, open(name, "w") (or "a" to append) and file.write(str(score) + "\n"). A high-score table is read into a list of records, the new score inserted at its place, and the whole list written back. The examiner marks the open with the correct mode, a loop that reads every line, the conversion of text to numbers, and the close.
Pitfalls
Forgetting to close a file (data may be lost); opening for WRITE when you meant APPEND (overwrites everything); reading past EOF; hard-coded paths — a path like /Users/Admin/data.txt breaks on another machine, so use a relative constant such as DataFile = "./data/scores.txt".
Русский
Это расширение обработки файлов из Темы 10, включающее последовательные, серийные и случайного доступа (прямой доступ). Операции псевдокода: OPENFILE name FOR READ | WRITE | APPEND (READ открывает существующий файл, WRITE создаёт/перезаписывает, APPEND добавляет в конец); READFILE name, line; WRITEFILE name, value; CLOSEFILE name; и EOF(name), который равен TRUE в конце.
Прочитать весь файл:
OPENFILE "names.txt" FOR READ
WHILE NOT EOF("names.txt") DO
READFILE "names.txt", thisName
OUTPUT thisName
ENDWHILE
CLOSEFILE "names.txt"
Поиск в файле (остановиться при нахождении):
found ← FALSE
OPENFILE "people.txt" FOR READ
WHILE NOT EOF("people.txt") AND NOT found DO
READFILE "people.txt", line
IF line = target THEN
found ← TRUE
ENDIF
ENDWHILE
CLOSEFILE "people.txt"
Обновление файла на месте
Большинство языков не могут редактировать текстовый файл на месте. Вместо этого: откройте оригинал для READ и временный файл для WRITE; для каждой строки запишите новую версию, если она должна измениться, иначе оригинальную; закройте оба; затем замените оригинал временным файлом. Этот же паттерн используется для удаления строк (пропускать их) и вставки строк.
Обновление файла на месте: чтение оригинала, запись изменений во временный файл, затем замена оригинала
Записи и файлы случайного доступа
Режимы открытия.READ: файл должен существовать, чтение начинается с начала. WRITE: создаётся новый файл, а существующий файл с таким именем перезаписывается. APPEND: запись добавляется в конец существующего файла. Каждый открытый файл закрывается с помощью CLOSEFILE, и EOF(name) становится TRUE после прочтения последнего элемента.
Три организации файлов. В серийном файле записи расположены в порядке их добавления; в последовательном файле они упорядочены по ключу; оба читаются от начала. Случайный файл (файл прямого доступа) хранит каждую запись по адресу, вычисленному из её ключа с помощью функции хэширования, поэтому одну запись можно найти без чтения остальных. Записи объявляются как тип, определённый пользователем:
TYPE AccountRecord
DECLARE AccNo : INTEGER
DECLARE Name : STRING
DECLARE Balance : REAL
DECLARE Active : BOOLEAN
ENDTYPE
Нахождение одной записи в случайном файле: ключ хэшируется до адреса, указатель файла переходит непосредственно к этому слоту, и запись читается; ни одна другая запись не затрагивается
Операции со случайным файлом в псевдокоде — это OPENFILE "Acc.dat" FOR RANDOM, SEEK "Acc.dat", Address (переместить указатель файла к этой записи), GETRECORD "Acc.dat", Rec (прочитать запись там) и PUTRECORD "Acc.dat", Rec (записать запись туда). Поиск клиента по номеру счета, как задано в Paper 3:
DECLARE Rec : AccountRecord
DECLARE Target, Address : INTEGER
INPUT Target
Address ← Target MOD 1000 // the hashing function
OPENFILE "Acc.dat" FOR RANDOM
SEEK "Acc.dat", Address
GETRECORD "Acc.dat", Rec
WHILE Rec.AccNo <> Target AND Rec.AccNo <> 0 // 0 marks an empty slot
Address ← Address + 1 // a collision: try the next slot
SEEK "Acc.dat", Address
GETRECORD "Acc.dat", Rec
ENDWHILE
IF Rec.AccNo = Target THEN
OUTPUT Rec.Name, Rec.Balance
ELSE
OUTPUT "No such account"
ENDIF
CLOSEFILE "Acc.dat"
Чтобы сохранить запись, хэшируйте её ключ, SEEK по адресу и PUTRECORD, перешагивая через уже занятые слоты. Баллы ставятся за хэширование, за SEEK перед GET или PUT, за сравнение с целевым значением, за обработку коллизии и за закрытие файла.
Разобранный пример.ActiveFile.dat содержит AccountRecord записей. Напишите псевдокод, который копирует каждую запись, чьё поле Active равно FALSE, в конец ArchiveFile.dat.
DECLARE Rec : AccountRecord
OPENFILE "ActiveFile.dat" FOR READ
OPENFILE "ArchiveFile.dat" FOR APPEND
WHILE NOT EOF("ActiveFile.dat")
READFILE "ActiveFile.dat", Rec
IF Rec.Active = FALSE THEN
WRITEFILE "ArchiveFile.dat", Rec
ENDIF
ENDWHILE
CLOSEFILE "ActiveFile.dat"
CLOSEFILE "ArchiveFile.dat"
Текстовые файлы в Python (Paper 4): file = open("HighScore.txt", "r"), затем for line in file: с line.strip() и line.split(",") для разделения полей, int(…) для преобразования оценки, и file.close(); для записи — open(name, "w") (или "a" для добавления) и file.write(str(score) + "\n"). Таблица рекордов считывается в список записей, новая оценка вставляется на своё место, и весь список записывается обратно. Экзаменатор оценивает открытие с правильным режимом, цикл, читающий каждую строку, преобразование текста в числа и закрытие файла.
Подводные камни
Забывание закрыть файл (данные могут потеряться); открытие для WRITE вместо APPEND (перезапишет всё); чтение за пределами EOF; жёстко закодированные пути — путь вроде /Users/Admin/data.txt не сработает на другом компьютере, поэтому используйте относительную константу, например DataFile = "./data/scores.txt".
Explore · Исследовать
File access route · Маршрут доступа к файлу
Follow a file from storage to program and back safely. · Безопасно следите за файлом от хранилища до программы и обратно.
An exception 异常 is an error or unexpected condition during execution — divide by zero, file not found, network failure, an array 数组 index out of range. Exception handling 异常处理 lets a program detect it and respond gracefully instead of crashing.
It matters because real programs face errors that cannot be prevented up front (files moved, networks down, bad input); without it, every operation needs its own IF check; and it separates the normal flow from the error handling, so the main path reads cleanly. For example, a file may be deleted by another user between your program checking it exists and actually opening it — you cannot prevent that, only handle the failure when it happens.
"Describe, with an example, what is meant by an exception" (two marks).An unexpected event or error that occurs during the execution of a program (at run time) and interrupts its normal flow; for example dividing by zero, opening a file that does not exist, converting non-numeric input to an integer, an array index out of range, or running out of memory."Identify two possible causes of exceptions" is answered from that list, plus "a device or network is not available" and "invalid data type entered".
"State the reasons for including exception handling" (three marks). To stop the program crashing (terminating unexpectedly); to output a meaningful message to the user rather than a system error; to allow the program to recover and continue, for example by asking for the input again, or to close files safely before it ends; and because some errors cannot be predicted when the program is written. "Describe how program termination due to an exception can be avoided": put the statements that might raise the exception inside a TRY block; write an EXCEPT (catch) block for that exception that handles it, for example by outputting a message, so that execution continues after the block instead of stopping. "Explain what is meant by exception handling": detecting an exception when it occurs and running code (the handler) that deals with it so that the program continues.
Pattern
The TRY block holds the code that might fail; the first matching EXCEPT block runs. Real languages also have a catch-all EXCEPT and a FINALLY block that runs whether or not an exception happened — useful for cleanup (closing files).
Raising an exception
A subroutine that detects an error can raise 抛出 an exception so the caller handles it:
Where to handle exceptions
Handle them close to the error if the response is simple (a message, a retry), or higher up the call stack 调用栈 if only the outer code knows what to do (a top-level GUI loop logs the error and shows a friendly dialog). Don't swallow exceptions silently — at least log them, or debugging becomes impossible.
Common exceptions: FileNotFound, IOError, DivisionByZero, IndexOutOfRange, InvalidArgument, NullReference, OutOfMemory. Wrapping each failing operation in a TRY with the right EXCEPT handlers gives a program that degrades gracefully instead of crashing.
Worked example (Paper 4). Write a function that reads whole numbers, one per line, from a file whose name is passed as a parameter and returns them in a list. It must not crash if the file does not exist or a line is not a whole number.
The try block holds the code that can fail (the open and the conversion); each except names one exception and does something useful; the function still returns a list, so the caller continues. In Java the same shape is try { … } catch (FileNotFoundException e) { … } catch (NumberFormatException e) { … }; in VB.NET Try … Catch ex As FileNotFoundException … End Try. Marks: the risky statements inside the try, the correct exception names, a message for each, and the program continuing afterwards; a catch-all except: gets the crash mark but not the "appropriate exception" mark.
Worked example. A text file of members needs one member's phone number changed. Why can the program not simply overwrite that line, and what is the pattern? A text file's lines are different lengths, and the file has no gaps to absorb a difference: a longer replacement would run into the next record, and a shorter one would leave part of the old line behind. So the pattern is to open the original for READ and a temporary file for WRITE, read every line in turn, writing the new version for the line that changes and the original line for all the others, close both, then replace the original with the temporary file. The same shape handles deleting (skip the line) and inserting (write the extra line). Note that every line gets written, not only the changed one - writing just the new record and losing the rest of the file is the classic slip.
Русский
Исключение — это ошибка или неожиданный сбой во время выполнения программы: деление на ноль, файл не найден, сетевая ошибка, выход индекса массива за допустимые пределы. Обработка исключений позволяет программе обнаружить ошибку и отреагировать на неё корректно, вместо того чтобы завершиться аварийно.
Это важно, потому что реальные программы сталкиваются с ошибками, которые невозможно предотвратить заранее (перемещённые файлы, недоступная сеть, неверный ввод); без обработки исключения каждая операция потребовала бы собственной проверки IF; кроме того, обработка исключений разделяет нормальный поток выполнения и логику обработки ошибок, благодаря чему основной код остаётся чистым и понятным. Например, другой пользователь может удалить файл между моментом, когда ваша программа проверяла его существование, и моментом открытия — вы не можете этого предотвратить, но можете обработать сбой, когда он произойдёт.
"Опишите, что понимается под исключением, приведя пример" (два балла).Неожиданное событие или ошибка, возникающая во время выполнения программы (во время работы) и нарушающая её нормальный поток; например, деление на ноль, попытка открыть несуществующий файл, преобразование текстового ввода в целое число, выход индекса массива за допустимые пределы или исчерпание оперативной памяти. Ответ на вопрос «Назовите две возможные причины возникновения исключений» берётся из этого списка, а также включает «устройство или сеть недоступны» и «введён недопустимый тип данных».
"Назовите причины использования обработки исключений" (три балла). Чтобы предотвратить аварийное завершение (неожиданный краш) программы; чтобы вывести пользователю понятное сообщение вместо системной ошибки; чтобы позволить программе восстановиться и продолжить работу, например, запросив ввод снова, или безопасно закрыть файлы перед завершением; а также потому, что некоторые ошибки нельзя предсказать на этапе написания программы. "Опишите, как избежать аварийного завершения программы из-за исключения": поместите операторы, способные вызвать исключение, внутрь блока TRY; напишите блок EXCEPT (перехватывающий) для данного исключения, который обрабатывает его, например, выводя сообщение, чтобы выполнение продолжилось после блока, а не прервалось. "Объясните, что понимается под обработкой исключений": обнаружение исключения в момент его возникновения и выполнение кода (обработчика), который справляется с ним, чтобы программа могла продолжать работу.
Шаблон
TRY
OPENFILE "data.txt" FOR READ
READFILE "data.txt", line
OUTPUT line
CLOSEFILE "data.txt"
EXCEPT FileNotFound
OUTPUT "Sorry, the file does not exist."
EXCEPT ReadError
OUTPUT "Sorry, error reading the file."
ENDTRY
Блок TRY содержит код, который может вызвать ошибку; выполняется первый подходящий блок EXCEPT. В реальных языках также есть универсальный блок EXCEPT и блок FINALLY, который выполняется независимо от того, произошло ли исключение — это полезно для очистки ресурсов (закрытия файлов).
*Поток обработки исключений: исключение приводит к переходу к соответствующему блоку EXCEPT; блок FINALLY всегда выполняется перед продолжением работы программы
Вызов исключения
Подпрограмма, обнаружившая ошибку, может вызвать исключение, чтобы вызывающий код обработал его:
PROCEDURE Divide(a : INTEGER, b : INTEGER) RETURNS INTEGER
IF b = 0 THEN
RAISE DivideByZero
ENDIF
RETURN a DIV b
ENDPROCEDURE
Где обрабатывать исключения
Обрабатывайте их вблизи места возникновения ошибки, если реакция простая (сообщение, повторная попытка), или выше по стеку вызовов, если только внешний код знает, что нужно делать (например, верхний уровень графического интерфейса логирует ошибку и показывает дружелюбное диалоговое окно). Не заглушайте исключения молча — хотя бы логируйте их, иначе отладка станет невозможной.
Распространённые исключения: FileNotFound, IOError, DivisionByZero, IndexOutOfRange, InvalidArgument, NullReference, OutOfMemory. Обёртывание каждой потенциально ошибочной операции в TRY с правильными EXCEPT обработчиками обеспечивает корректную деградацию программы вместо аварийного завершения.
Разбор примера (Экзаменационный лист 4). Напишите функцию, которая читает целые числа, по одному на строке, из файла, имя которого передаётся в качестве параметра, и возвращает их в виде списка. Функция не должна завершаться аварийно, если файл отсутствует или строка не является целым числом.
def read_scores(filename):
scores = []
try:
file = open(filename, "r")
for line in file:
scores.append(int(line))
file.close()
except FileNotFoundError:
print("The file", filename, "does not exist")
except ValueError:
print("A line in the file was not a whole number")
return scores
Блок try содержит код, который может дать сбой (открытие файла и преобразование); каждый блок except называет одно исключение и выполняет полезные действия; функция всё равно возвращает список, поэтому вызывающий код продолжает работу. В Java аналогичная структура выглядит как try { … } catch (FileNotFoundException e) { … } catch (NumberFormatException e) { … }; в VB.NET — как Try … Catch ex As FileNotFoundException … End Try. Баллы начисляются за: опасные операторы внутри try, правильные названия исключений, сообщения для каждого случая и продолжение работы программы afterwards; универсальный перехватчик except: получает балл за предотвращение краша, но не за указание «соответствующего исключения».
Разбор примера. В текстовом файле со списком членов необходимо изменить телефон одного из них. Почему нельзя просто перезаписать эту строку и каков правильный шаблон? Строки в текстовом файле имеют различную длину, и в файле нет пустых мест, чтобы компенсировать разницу: более длинная замена затронет следующую запись, а более короткая оставит часть старой строки. Поэтому шаблон таков: открываем оригинальный файл для чтения и временный файл для записи, последовательно читаем все строки, записывая новую версию для изменяемой строки и оригинальную для всех остальных, закрываем оба файла, затем заменяем оригинал временным файлом. Тот же шаблон используется для удаления (пропуск строки) и добавления (запись дополнительной строки). Важно отметить, что каждая строка должна быть записана, а не только изменённая — запись только нового значения с потерей остальной части файла является классической ошибкой.
Explore · Исследовать
How exception handling flows · Как протекает обработка исключений
Step through what happens when code fails. The exception jumps out of the normal flow to a handler, FINALLY cleans up either way, and the program carries on instead of crashing. · Разберите по шагам, что происходит при ошибке в коде. Исключение跳出 нормального потока к обработчику, FINALLY выполняет очистку в любом случае, и программа продолжает работу вместо того, чтобы аварийно завершиться.
Definitions the examiner accepts · Определения, принимаемые экзаменатором
English
A definition question is marked against fixed wording. Learn these exactly, and give one answer only.
Term
Definition
programming paradigm
a style or way of programming, with its own way of structuring a program
imperative language
the program is a sequence of statements that change the program's state; the programmer says how the task is done
declarative language
the program states facts and rules and the inference engine works out how to find the answer
class
a template defining the attributes and methods of the objects of that type
object (instance)
an occurrence of a class, with its own values for the attributes
attribute
a data item that belongs to a class
method
a procedure or function that belongs to a class and acts on its attributes
encapsulation
keeping the attributes and methods together in a class and restricting external access to the data, so that it is changed only through public methods
inheritance
a subclass acquires the attributes and methods of its parent class and can add or override them
polymorphism
methods with the same name that behave differently for different classes
constructor
a method that runs when an object is created and initialises its attributes
containment
a class has an object of another class as one of its attributes
fact
a statement in a declarative program that is true
rule
a conclusion that holds when its conditions are true
serial, sequential, random file
records in the order added; records in key order; each record at an address calculated from its key
exception
an unexpected error or event during execution that interrupts the normal flow
exception handling
detecting an exception when it occurs and running code that deals with it so that the program continues
Русский
Вопросы на определение оцениваются по фиксированной формулировке. Выучите их точно и дайте только один ответ.
Термин
Определение
парадигма программирования
стиль или подход к программированию, имеющий свой собственный способ структурирования программы
императивный язык
программа представляет собой последовательность инструкций, изменяющих состояние программы; программист явно указывает, как выполняется задача
декларативный язык
программа описывает факты и правила, а движок вывода определяет, как найти ответ
класс
шаблон, определяющий атрибуты и методы объектов данного типа
объект (экземпляр)
конкретный случай реализации класса, обладающий собственными значениями атрибутов
атрибут
элемент данных, принадлежащий классу
метод
процедура или функция, принадлежащая классу и действующая с его атрибутами
инкапсуляция
объединение атрибутов и методов в одном классе и ограничение внешнего доступа к данным, чтобы они изменялись только через публичные методы
наследование
подкласс получает атрибуты и методы своего родительского класса и может добавлять или переопределять их
полиморфизм
методы с одинаковым названием, которые ведут себя по-разному для разных классов
конструктор
метод, который выполняется при создании объекта и инициализирует его атрибуты
композиция
класс имеет объект другого класса в качестве одного из своих атрибутов
факт
утверждение в декларативной программе, которое является истинным
правило
вывод, который верен при выполнении его условий
последовательный, упорядоченный, случайный файл
записи в порядке добавления; записи в порядке ключей; каждая запись по адресу, вычисленному на основе её ключа
исключение
неожиданная ошибка или событие во время выполнения, прерывающее нормальный поток
обработка исключений
обнаружение исключения при его возникновении и выполнение кода, обрабатывающего его, чтобы программа продолжала работу
20.2
Exam tips · Советы для экзамена
English
Paradigms: know the one-line description of each and be ready to name the paradigm from a code sample; low-level questions want the five addressing modes and what the accumulator receives.
OOP definitions come up every session: class, object, attribute, method, encapsulation, inheritance, polymorphism, constructor. Write a class in pseudocode with PRIVATE attributes, a PUBLIC NEW and getters; a subclass with INHERITS and SUPER.NEW.
Declarative: a goal with a variable returns every matching fact; a rule is a conclusion IF conditions joined with AND; copy the question's predicate names exactly.
Files: the three modes and what each does to an existing file; READFILE in a WHILE NOT EOF loop; random files use a hash, SEEK, GETRECORD and PUTRECORD, with a step-on for collisions.
Exceptions: definition with an example, three reasons for handling them, and TRY with a named EXCEPT that lets the program continue.
Common mistakes
Describing a declarative program as "a sequence of steps that gives the answer"; it states what is true and what is wanted, not how.
Confusing an object with a class, or an instance with an attribute; the question "an occurrence of an object" wants instance.
Declaring the attributes PUBLIC, or reaching them from outside the class instead of through a getter, which loses the encapsulation marks.
A subclass constructor that sets the parent's attributes directly instead of calling SUPER.NEW.
Explaining polymorphism as "many objects"; it is the same method name behaving differently for different classes.
Opening a file FOR WRITE to add a record, which destroys the existing contents; use APPEND.
Reading a random file from the start; SEEK to the hashed address first.
Putting the exception handler around code that cannot fail, or catching everything with no message, or describing exception handling as "checking the input with IF".
Русский
Парадигмы: знать однострочное описание каждой и уметь назвать парадигму по образцу кода; вопросы низкого уровня требуют знания пяти режимов адресации и того, что получает аккумулятор.
Определения ООП встречаются на каждой сессии: класс, объект, атрибут, метод, инкапсуляция, наследование, полиморфизм, конструктор. Написать класс на псевдокоде с PRIVATE-атрибутами, PUBLIC NEW и геттерами; подкласс с INHERITS и SUPER.NEW.
Декларативные программы: цель с переменной возвращает все совпадающие факты; правило — это вывод, ЕСЛИ условия соединены логическим И; точное копирование имён предикатов из вопроса.
Файлы: три режима и то, что каждый делает с существующим файлом; READFILE в цикле WHILE NOT EOF; случайные файлы используют хеш-функцию, SEEK, GETRECORD и PUTRECORD, с перекрытием записей при коллизиях.
Исключения: определение с примером, три причины их обработки, и конструкция TRY с именованным EXCEPT, позволяющая программе продолжить работу.
Распространенные ошибки
Описание декларативной программы как «последовательности шагов, дающей ответ»; она утверждает, что истинно и чего хотят, а не как это сделать.
Путаница между объектом и классом, или экземпляром и атрибутом; вопрос «экземпляр объекта» требует ответа instance.
Объявление атрибутов PUBLIC или обращение к ним извне класса вместо использования геттера, что нарушает маркировку инкапсуляции.
Конструктор подкласса, который устанавливает атрибуты родителя напрямую вместо вызова SUPER.NEW.
Объяснение полиморфизма как «множества объектов»; это одно и то же имя метода, ведущего себя по-разному для разных классов.
Открытие файла FOR WRITE для добавления записи, что уничтожает существующее содержимое; используйте APPEND.
Чтение случайного файла с начала; сначала выполните SEEK по хешированному адресу.
Размещение обработчика исключений вокруг кода, который не может дать сбой, или перехват всего без сообщения, или описание обработки исключений как «проверки ввода с помощью IF».
Interactive lessons on this topic · Интерактивные уроки по этой теме
Work through it step by step, with instant-check exercises. · Пройдите его шаг за шагом с упражнениями мгновенной проверки.
Pick one and the site follows you — notes, papers, videos and practice all open on it. · Выберите один, и сайт будет вести вас — конспекты, работы, видео и практика откроются там.
Type to search notes, lessons, code, vocabulary and past-paper questions across every subject. · Введите запрос для поиска заметок, уроков, кода, словаря и вопросов с реальных экзаменов по всем предметам.