Описание и вызов. В Паскале подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.
Процедура имеет такую же структуру, как и программа, но с двумя отличиями:
• заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;
• описание процедуры заканчивается точкой с запятой (а не точкой). Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они там не описаны заново). Они называются глобальными, в отличие от локальных имен, описанных в процедуре и действующих лишь в ней.
Данные для обработки могут передаваться процедуре через глобальные имена или через аргументы процедуры. В процедуре каждый аргумент имеет свое имя -формальный параметр, описываемый в заголовке процедуры по схеме
read(kbd,а); (по нажатию клавиши)
until а=»; (* ‘пробел’ )
procedure STEPEN(a,b:real;var y:real);
Пусть представленные три подпрограммы записаны в файл с именем lab.pas. А теперь составим программу, использующую созданную внешнюю библиотеку.
10 кл ЕМН 2 четверть Урок 1 Пользовательские функции и процедуры
Программа 21
($i lab) (директива подключения библиотеки> var a,b : real;
STEPEN(2,4,a); writeln(‘2 в степени 4 =’,a); b:=MEXP(l);
write(‘машинная exp(1)=’,EXP(1):6:4,’ моя exp(1)=’,b:6:4);
В программе используется стандартная функция — экспонента ЕХР(1) и наша подпрограмма МЕХР(1).
В Турбо-Паскале версии 5.0 и выше применяют стандартные модули CRT, GRAPH и др. В этих модулях содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиатурой, графическими примитивами и т.п. Модули подключаются к программе путем специальной команды, размещаемой сразу после заголовка:
Программист может сам создать модуль. Ниже приведен пример с соответствующими комментариями.
Пример. Создать модуль, дополняющий математические возможности Паскаля арифметическими действиями над комплексными числами.
Будем представлять комплексные числа парами действительных: (а, b). Как известно, действия над ними выполняются по правилам
Создаваемый модуль будет включать четыре процедуры: Sum — сумма,Raz -разность, Proiz — произведение, Chastn — частное.
Этот модуль может быть отдельно откомпилирован. После этого любая программа, написанная на Паскале, может получить доступ к интерфейсным объектам (в данном случае — процедурам) этого модуля с помощью директивы Uses CompChisla.
Обратим внимание, что в интерфейсной части модуля от процедур присутствуют лишь заголовки, а в части «реализация» от заголовков процедур остаются лишь их имена.
Программа 22
procedure Sum(a,b,c,d: real; varx,y: real);
procedure Raz(a,b,c,d: real; varx,y: real);
procedure Proiz (a,b,c,d: real; varx,y: real);
procedure Chstn(a,b,c,d: real; varx,y: real);
beginx:=a+c; y:=b+d end;
beginx:=a-c; y:=b-d end;
begin x:=a*c-b*d; y:=a*d+b*c
procedure Razn;
begin z:= c*c+d*d; x:=(a*c+b*d)/z; y:=(b*c-a*d)/z end;
Процедуры и функции. Основы программирования. Паскаль. Урок №4.
Контрольные вопросы
1. Какова структура процедуры? функции?
2. Какие параметры называют формальными и какие — фактическими?
3. В чем различие между локальными и глобальными переменными?
4. В чем сходство и различие между процедурой и модулем?
РАБОТА С ФАЙЛАМИ
Файл (последовательность) — это одна из наиболее фундаментальных структур данных. Программная организация компьютеров,их связь с внешними устройствами основаны на файловой структуре.
Файлы позволяют решить две проблемы:
1) возможность формирования и сохранения значений для последующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна);
2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п.
В Паскале эти проблемы снимаются с помощью структурированных данных файлового типа.
Файловый тип данных в программе задается следующем образом:
В качестве типа компонентов файла разрешается использовать любой тип данных, кроме файлового. Например:
intfile = file of integer;
refile = file of real;
chfile = file of char;
vector = array[ran] of real;
setfile=file of st;
vecfile = file of vector;
compfile= file ofcompt;
Описание файловой переменной задается обычным способом в разделе описаний. Например:
var f: intfile; или var f: file of integer;
Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль:
Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если, например, файл с именем primer, dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, aустановка «окна» между программой и файлом будет определяться через файловую переменную f оператором
assign (f, ‘primer.dat’)
Если внешним устройством является принтер, то связь осуществляется оператором assign(f, ‘1st:’). Здесь 1st — логическое имя печатающего устройства. Ниже приведены логические имена внешних устройств ввода-вывода:
con — консоль; trm — терминал; kbd — клавиатура; 1st — принтер; aux — буфер сети;
После осуществления связи файловая переменная f отождествляется с соответствующим файлом.
Для работы с файлом его необходимо открыть, а по окончании работы — закрыть Файл открывается для чтения оператором reset(f), для записи — оператором rewrite(f).
Чтение и запись данных осуществляется известными командами read/write, только в начале списка помещается имя файловой переменной:
Закрытие файла осуществляется командой close(f).
условно файл можно представить в виде ленты, у которой есть начало, а конец не фиксируется. Компоненты файла записываются на эту ленту последовательно, друг за другом:
Здесь т.м. — текущий маркер, указывающий на рабочую позицию (окно) файла; м.к. (маркер конца файла) — специальный код, автоматически формируемый вслед за последним элементом файла.
Такого рода файлы называются файлами последовательного доступа. В исходной версии Паскаля файлов прямого доступа, для которых можно непосредственно «достать» любую компоненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например, через функцию seek, см. ниже).
Команда rewrite(f) — открыть файл для записи — устанавливает файл в начальное состояние режима записи; текущий маркер устанавливается на маркер конца файла. Если в файле f до этого была информация, то она уничтожается.
В открытом для чтения командой reset(f) файле текущий маркер устанавливается на нулевое состояние, однако содержимое файла не утрачивается.
Команда закрытия файла close (Q обязательна, поскольку эта команда формирует маркер конца файла, что в большинстве случаев является необходимым нaпpимep, для работы с функцией eof(f), см ниже).
В системе Турбо-Паскаль предусмотрены встроенные функции по работе с файлами:
filesize(f) — текущее количество компонент открытого файла;
filepos(f) -номер текущей позиции маркера;
геnamе (f,имя) — переименование файла, связанного с f;
erase(f) -уничтожение файла;
execute(f) — выполнение СОМ-файла;
chain(f) -выполнение CHN-файла;
seek(f,N) — устанавливает маркер на позицию N;
eof(f) — возвращает TRUE, если найден конец файла;
ealn(f) — возвращает TRUE, если найден конец строки.
На практике широко используются текстовые файлы, которые состоят из литерных (логических) строк. Поэтому в языке Паскаль предусмотрен стандартный файловый тип TEXT (он не является file of char, скорее всего, это — file of string[n]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (eoln — «end of line»).
В качестве печатного символа конца строки используют литеру #. Текстовый файл (text) является строго последовательным, к нему не применимы некоторые встроенные функции, в частности, seek. В отличие от типизированных файлов, с текстовым файлом нельзя одновременно проводить операции чтения (read) и записи (write). Однако, допустимы операторы writein и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел.
Ниже приведены несколько примеров, иллюстрирующих работу с файлами. Пример 1. Вывод данных на печатающее устройство — принтер (1st:).
Программа 23
fal :text;x :real; name :string[25];
assign (fal, ‘ 1st:’); rewrite (fal); x:2.5; name:»‘Слава’;
writeln(fal,’Привет, ‘.name); close(fal) :
end. (Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на печать)
Пример 2. Создание и сохранение в файле «xxx.dat» последовательности целых чисел от 10 до 20.
Программа 24
f: file of integer; i: integer;
for i:=10 to 20 do write(f,i); close (f);
end. (После выполнения программы формируется внешний файл xxx.dat)
Пример 3. Считывание первых пяти компонент из существующего файла «xxx.dat» и вывод на дисплей квадратовэтих значений.
Программа 25
var ff: file of integer; j,i : integer;
for j:=l to 5 do begin read(ff.i); writeln(i*i);
Пример 4. В текстовом файле (text) «slov.txt» содержится русский текст. Определить сколько гласных букв в тексте.
Программа 26
ft : text; n : integer; ch : char; st : set of chart begin
assign (ft,’slov.txt’); reset(ft);
while not eof(ft) do begin
read(ft, ch); if ch in st then n:=n+l;
writeln; write(‘кол-во гласных букв =’,n);
Поскольку длина текста (файла) неизвестна, то в цикле «пока» используется логическая функция eof(f), которая возвращает значение TRUE, если найден конец файла.
Пример 5. Шифрование и дешифрование текста.
Программа шифрования заданного текста (sekret) использует следующее правило шифровки: каждая буква в тексте заменяется на букву, расположенную на n позиций вправо от искомой в русском алфавите. Причем последним символом алфавита является пробел », а далее алфавит продолжается циклически.
Значение смещения n находится во внешнем файле ‘n.key’, который формируется программой key. Зашифрованный текст выводится во внешний файл с именем «шифр.eхe» , а также на дисплей.
Программа дешифровки (retsek) считывает шифрованный текстиз файла «шифр.tхt» и выводит на экран дисплея искомый текст.
Программа 27 (а)
n : integer; f : file of integer;
assign (f,’n.key’); rewrite(f); write(‘Bвeди ключ(смещение): ‘);
Программа 27 (б)
n, i, k, p : integer;
fkl : file of integer;
assign(fkl,’n.key’); reset(fkl); read(fkl,n); close(fkl);
writeln; write(‘введи текст: ‘);
for k:=l to length(slovo) do begin for i:=l to 33 do
if slovo[k]=alfavit[i] then begin p:=i+n;
if p >33 then p:=p mod 33;
assign(fs,’шифр.txt’); rewrite(fs); write(fs,anslovo);close(fs);
Программа 27 (в)
var slovo, anslovo : string[100];
n, i, k, p : integer;
fi : file of integer;
assign(fi,’n.key’); reset(fi); read(fi.n); close(fi);
assign(f,’шифр.txt’); reset(f); read(f,anslovo); close(f)
for k:=l to length(anslovo) do
begin for i:=l to 33 do
if anslovo[k]=alfavit[i] then
writeln; write(‘TeKCT шифровки: ‘,slovo);
Контрольные вопросы и задания
1. Какие проблемы решаются при использовании файлов?
2. Какие операции и функции используются при работе с файлами?
3. Найдите площадь выпуклого четырехугольника со сторонами х, у, z, t и одной
из диагоналей d.
4. Заданы три комплексных числа. Найдите их сумму,
5. Имеется внешний файл записей «lab.zap», содержащий сведения об ученика.’ школы. Файл формируется приведенной ниже программой.
Составьте программу, в которой необходимо сделать следующее:
а) упорядочить файл по признаку «class» в порядке возрастания;
б) упорядочить файл по признаку «god» в порядке убывания;
в) упорядочить файл в алфавитном порядке.
type shcoo 1= record
fiо : string[20], class : 1 .. 11; god : integer; pol: char;
var x:array[1..100] ofshcool; n,i:integer; f:file of school;
write (‘введите кол-во учеников:’); readln(n); assign(f,’lab.zap’); rewnte(f);
for i:=l to n do with x[i] do
begin write(‘введи Ф.И.О.’,1,’-ого ученика:’); readln(fio);
write(‘гoд рождения:-‘); readln(god); write(‘пол(M/Ж):-‘);
6. Задание рассчитано на двух студентов, использующих «электронную почту» на одном компьютере. Первый студент составляет программу, в которой формирует внешний файл «письмо». Второй студент должен «прочитать» файл и сформировать «ответ».
а) последовательность целых чисел до 100 | квадраты этих чисел;
б) простые числа в интервале от 1 до 200 | сумма этих чисел
Дата добавления: 2020-02-05 ; просмотров: 450 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ
Источник: poznayka.org
Модульный принцип программирования. Подпрограммы.
В Паскале подпрограммы называются процедурами и функциями и описываются в разделе с тем же названием.
Процедура имеет такую же структуру, как и программа, но с двумя отличиями:
• заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;
• описание процедуры заканчивается точкой с запятой (а не точкой). Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они там не описаны заново). Они называются глобальными, в отличие от локальных имен, описанных в процедуре и действующих лишь в ней.
Данные для обработки могут передаваться процедуре через глобальные имена или через аргументы процедуры. В процедуре каждый аргумент имеет свое имя – формальный параметр, описываемый в заголовке процедуры по схеме:
procedure () Описание формальных параметров может иметь вид:
В первом случае говорят о параметрах-значениях, во втором – о параметрах-переменных. В простейшем случае заголовок процедуры может содержать только имя процедуры.
Оператор вызова процедуры имеет вид:
Указанные выражения называют фактическими параметрами. Их список должен точно соответствовать списку описаний формальных параметров процедуры. Во время вызова процедуры каждому параметру-значению присваивается значение соответствующего фактического параметра и поэтому их обычно используют для передачи входных данных.
Параметры-переменные следует использовать для представления результатов процедуры.
Функция – это подпрограмма, определяющая единственное скалярное, вещественное или строковое значение. Отличия подпрограммы-функции от процедуры состоят в следующем:
• заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции:
function (список описаний формальных параметров): ;
• раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции;
• обращение к функции – не оператор, а выражение вида:
Функции (и процедуры) могут использовать свое имя в собственном описании, т.е. могут быть рекурсивными.
Подпрограммы (процедуры и функции) используются в программах с целью их структурирования, а также при многократных повторениях некоторых частей программы. Процедуры и функции описываются в программных единицах в разделе описания подпрограмм. Для этих программных единиц они являются внутренними.
Бывают случаи, когда одни и те же подпрограммы могут использоваться в различных программах одного и даже нескольких пользователей. В подобных ситуациях целесообразно создавать внешние подпрограммы, которые можно в необходимый момент подключать в любые программы. Как правило, их объединяют в отдельные пакеты, так называемые библиотеки внешних подпрограмм.
Могут создаваться личные и специализированные библиотеки коллективного пользования и др. С одной из таких библиотек – встроенной библиотекой стандартных подпрограмм – пользователи имеют дело практически всегда. В состав этой библиотеки входят процедуры и функции вычисления значений ряда элементарных функций: синуса, косинуса, экспоненты и т.д., процедуры и функции обработки символьных величин, процедуры ввода-вывода и др. Встроенная библиотека подключается к любой программе автоматически при компиляции. Поэтому откомпилиро-ванный файл с расширением.com (иногда называемый «комовским»), как правило, занимает в 8 – 10 раз больше места в памяти, чем исходный текст.
Внешние подпрограммы создаются обычным образом в виде отдельного файла или файлов. Для их подключения в программе пользователя в разделе описания ставится директива $I имя файла. С этого момента все процедуры и функции внешнего файла становятся внутренними для программы, и на все входящие в него процедуры и функции распространяется правило локальных и глобальных переменных. В этой связи директива подключения внешнего файла должна размещаться после описания всех ею используемых глобальных параметров, процедур и функций.
В стандартных модулях CRT, GRAPH содержатся сервисные процедуры и функции по работе с экраном дисплея, с клавиатурой, графическими примитивами и т.п. Модули подключаются к программе путем специальной команды, размещаемой сразу после заголовка: Uses .
Объектно-ориентированное программирование
Исторически сложилось так, что программирование возникло и развивалось как процедурное, которое предполагает, что основой программы является алгоритм, процедура обработки данных.
Объектно-ориентированное программирование (ООП) — это методика разработки программ, в основе которой лежит понятие объекта. Объект — это некоторая структура, соответствующая объекту реального мира, его поведению. Задача, решаемая с использованием методики ООП, описывается в терминах объектов и операций над ними, а программа при таком подходе представляет собой набор объектов и связей между ними.
Класс
Классический язык Pascal позволяет программисту определять свои собственные сложные типы данных — записи (records). Object Pascal, поддерживая концепцию объектно-ориентированного программирования, дает возможность определять классы. Класс — это сложная структура, включающая, помимо описания данных, описание процедур и функций, которые могут быть выполнены над представителем класса — объектом.
Вот пример объявления простого класса:
fname: string[15]; faddress: string[35];
Данные класса называются полями, процедуры и функции — методами.
В приведенном примере TPerson — это имя класса, fname и faddress – имена полей, show — имя метода.
Объект
Объекты как представители класса объявляются в программе в разделе var, например:
student: TPerson; professor: TPerson;
В Object Pascal объект — это динамическая структура. Переменная-объект содержит не данные, а ссылку на данные объекта. Поэтому программист должен позаботиться о выделении памяти для этих данных.
Выделение памяти осуществляется при помощи специального метода класса — конструктора, которому обычно присваивают имя Create (создать). Для того чтобы подчеркнуть особую роль и поведение конструктора, в описании класса вместо слова procedure используется слово constructor.
Выделение памяти для данных объекта происходит путем присваивания значения результата применения метода-конструктора к типу (классу) объекта. Например, после выполнения инструкции:
выделяется необходимая память для данных объекта «professor».
Помимо выделения памяти, конструктор, как правило, решает задачу присваивания полям объекта начальных значений, т. е. осуществляет инициализацию объекта. Ниже приведен пример реализации конструктора для объекта TPerson:
Реализация конструктора несколько необычна. Во-первых, в теле конструктора нет привычных инструкций New, обеспечивающих выделение динамической памяти (всю необходимую работу по выделению памяти выполняет компилятор). Во-вторых, формально конструктор не возвращает значения, хотя в программе обращение к конструктору осуществляется как к методу-функции.
После объявления и инициализации объект можно использовать, например, установить значение поля объекта. Доступ к полю объекта осуществляется путем указания имени объекта и имени поля, которые отделяются друг от друга точкой. Хотя объект является ссылкой, правило доступа к данным с помощью ссылки, согласно которому после имени переменной, являющейся ссылкой, надо ставить значок ^, на объекты не распространяется.
Если в программе какой-либо объект больше не используется, то память, занимаемую полями данного объекта, можно освободить. Для выполнения этого действия используют метод-деструктор Free. Например, для того, чтобы освободить память, занимаемую полями объекта professor, достаточно записать: professor. free;
Метод
Методы класса (процедуры и функции, объявление которых включено в описание класса) выполняют действия над объектами класса. Для того чтобы метод был выполнен, необходимо указать имя объекта и имя метода, отделив одно имя от другого точкой. Например, инструкция:
вызывает применение метода «show» к объекту «professor». Фактически инструкция применения метода к объекту — это специфический способ записи инструкции вызова процедуры.
Методы класса определяются в программе точно так же, как и обычные процедуры и функции, за исключением того, что имя процедуры или функции, являющейся методом, состоит из двух частей: имени класса, к которому принадлежит метод, и имени метода. Имя класса от имени метода отделяется точкой.
Источник: infopedia.su
РАЗДЕЛ 3. СТРУКТУРНОЕ И МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ
Это независимая именованная часть программы, которую после однократного описания можно многократно вызвать по имени из последующих частей программы для выполнения определенных действий.
Один из видов подпрограммы. ____________________________
1.3 Рекурсия, это:
Ситуация, когда программа вызывает сама себя непосредственно или косвенно (через другие функции) ____________________________
ЗАДАНИЕ 2
Укажите понятия, которые соответствуют перечисленным ниже определениям:
1. Подпрограмма – это отдельная функционально независимая часть программы.
2. Глобальными называются переменные, объявленные в основной программе и доступные как программе, так и всем ее подпрограммам.
3. Локальными называются переменные, объявленные внутри подпрограммы и доступные только ей самой.
ЗАДАНИЕ 3
Перечислите категории формальных параметров подпрограммы:
1) параметры-значения (эти параметры в основной программе подпрограммой не меняются);
2) параметры-переменные (эти параметры подпрограмма может изменить в основной программе);
3) параметры-константы (используются только в версии 7.0);
4) параметры-процедуры и параметры-функции (т. е. процедурного типа).
ЗАДАНИЕ 4
Выполните тест. Из предложенных ответов выберите правильный.
1. В некоторой программе описаны переменные:
Какая из процедур или функций, заголовки которых приведены ниже, может быть вызвана из этой программы с помощью оператора
a) function f(var a:integer; b:integer; var c:real; d:real; var e:char; g:char);
b) function f(var a:integer; b:integer; var c:real; d:real; var e:char; g:char): char;
c) procedure f(var a:integer; b:integer; var c:real; var e:char; g:char): char;
2. Определите какие величины являются результатом работы подпрограммы в следующем заголовке
procedure kvadr(a,b,c:real; var x1,x2:real; var y:string);
Не хватает данных:
3. Определите тип значения функции в следующем заголовке
function nok(x, y: integer): real;
4. Определите, какой заголовок подпрограммы-функции записан правильно
a) funtion nod(x,y:integer):integer;
b) function nod(x,y);
c) function nod(x,y:integer):integer;
d) function nod(x,y:integer);
5. Фактические параметры записываются
b) в заголовке подпрограммы-функции
c) в заголовке подпрограммы-процедуры
d) в команде вызова подпрограммы
6. Какой вид программы применяют, если в результате получается несколько величин
a) подпрограмму-функцию и подпрограмму-процедуру
c) нельзя использовать подпрограмму
d) нет правильного ответа
8. Величины, описанные в подпрограмме называют
9. Фактические параметры записываются
a) в команде вызова подпрограммы
b) в заголовке подпрограммы-процедуры
c) в заголовке подпрограммы-функции
10. Подпрограмма-функция возвращает в основную программу
a) все варианты правильные
c) единственное значение
d) несколько значений
11. Укажите, какие параметры являются параметрами-значениями, а какие параметрами-переменными
а) var c,d : integer;
procedure P(x,y: integer);
б) var c,d : integer;
procedure Q (x: integer; var y: integer);
в) var c,d : integer;
procedure S (var x,y: integer);
Критерии оценки теста
100%-95% – 5(отлично)
94%-75% – 4(хорошо)
74%-60% – 3(удовлетворительно)
Менее 60%– 2(неудовлетворительно)
Тема 3.2 Структуризация в программировании
ЗАДАНИЕ 1
Структурное программирование — методология и технология разработки программных комплексов, основанная на принципах:
1) — программирования «сверху-вниз»;
2) — модульного программирования.
При этом логика алгоритма и программы должны использовать три основные структуры: последовательное выполнение, ветвление и повторение.
ЗАДАНИЕ 2
Ответьте на предложенные вопросы:
1.1 Заглушка в структурном программировании, это:
Это функция, имеющая «пустое» тело, то есть «заглушка» ничего не делает. ____________________________
1.2 Метод восходящего проектирования, это:
Подход, при котором в первую очередь определяются вспомогательные модули, которые потребуются для проектируемой программы. ____________________________
1.3 Нисходящее программирование, это:
Методика разработки программ, при которой разработка начинается сопределения целей решения проблемы, после чего идет последовательная детализация, заканчивающаясядетальной программой. ____________________________
1.4 Модульное программирование, это:
Это организация программы как совокупности небольших независимых блоков, называемых модулями, структура и поведение которых подчиняются определенным правилам. ____________________________
Тема 3.3 Модульное программирование
ЗАДАНИЕ 1
Типовая структура программного продукта включает:
1) головной модуль — управляет запуском программного продукта (существует в единственном числе);
2) управляющий модуль — обеспечивает вызов других модулей на обработку;
3) рабочие модули — выполняют функции обработки;
4) сервисные модули и библиотеки, утилиты — осуществляют обслуживающие функции.
ЗАДАНИЕ 2
Дана структура программного модуля. Дополните диаграмму.
Источник: megaobuchalka.ru