Презентация, доклад по информатике Turbo Pascal. Основы. Операторы. Циклы

Содержание

Процедуры ввода и вывода Решение самой простой задачи на ЭВМ не обходится без операций ввода и вывода информации. Ввод данных – это передача информации от внешнего носителя в оперативную память для обработки. Вывод – обратный процесс, когда

Слайд 1TURBO PASCAL
Основы, операторы, циклы
Романенко Т.Н., учитель информатики
МАОУ СОШ № 53

г. Томска
TURBO PASCALОсновы, операторы, циклыРоманенко Т.Н., учитель информатики МАОУ СОШ № 53 г. Томска

Слайд 2Процедуры ввода и вывода
Решение самой простой задачи на ЭВМ не обходится

без операций ввода и вывода информации. Ввод данных – это передача информации от внешнего носителя в оперативную память для обработки. Вывод – обратный процесс, когда данные передаются после обработки из оперативной памяти компьютера на внешний носитель. Внешним носителем может служить терминал ввода-вывода (монитор), принтер, гибкий (дискета) или жесткий (винчестер) магнитный диск и другие устройства.
В языке Паскаль стандартным средством общения человека и ЭВМ являются предопределенные файлы


Процедуры ввода и вывода	Решение самой простой задачи на ЭВМ не обходится без операций ввода и вывода информации.

Слайд 3Input и Output, которые по умолчанию являются параметрами программы. Программа получает

входные данные из файла Input и помещает результат обработки в файл Output. Стандартно файлу Input назначена клавиатура, а файлу Output – экран терминала.
Для выполнения ввода-вывода служат четыре процедуры: Read, Readln, Write, Writeln. В данном разделе будет рассмотрено их применение для ввода данных с клавиатуры и вывода на экран.

Ввод
Вывод


Input и Output, которые по умолчанию являются параметрами программы. Программа получает входные данные из файла Input и

Слайд 4Процедуры чтения
Процедура чтения Read обеспечивает ввод числовых данных, строк, символов и

т.д. для последующей их обработки программой. Формат:
Read (X1, X2, …, Xn);
или
Read (F, X1,X2, … ,Xn);
где X1, X2, … ,Xn – переменные допустимых типов данных; F – переменная, связанная с файлом, откуда будет выполнено чтение. В нашем случае рассмотрим только первый вариант.
Значения X1, X2, … ,Xn набираются минимум через один пробел на клавиатуре и высвечиваются на экране. После набора данных для одной процедуры Read нажимается клавиша ввода Enter.


Процедуры чтения	Процедура чтения Read обеспечивает ввод числовых данных, строк, символов и т.д. для последующей их обработки программой.

Слайд 5 Если в программе имеется несколько процедур Read, данные из них вводятся

потоком, т.е. после считывания значения переменных для одной процедуры Read набирают в той же строке, что и для предыдущей, до окончания строки, затем происходит переход на следующую строку.
П Р И М Е Р.
var
A, B, Sum1 : integer;
C, D, Sum2 : real;
. . . .
begin
read (A, B); Sum1:=A+B;
read (C, D); Sum2:=C+D;
. . . .
end.


Если в программе имеется несколько процедур Read, данные из них вводятся потоком, т.е. после считывания значения переменных

Слайд 6Набираем на клавиатуре: 12 15 0.5 0.9 и нажимаем Enter. Но

можно и после набора каждой пары нажимать Enter, т.е. 12 15 Enter, 0.5 0.9 Enter.
Процедура чтения Readln аналогична процедуре Read, единственное отличие заключается в том, что после считывания последней в списке значения для одной процедуры Readln данные для следующей процедуры Readln будут считываться с начала новой строки. Если в предыдущем примере заменить Read на Readln:
. . .
read (A, B); Sum1:=A+B;
read (C, D); Sum2:=C+D;
. . .
то после набора значений A и B курсор автоматически перейдет на новую строку, где будут набираться данные для Cи D:
12 15 Enter 0.5 0.9 Enter


Набираем на клавиатуре: 12 15 0.5 0.9 и нажимаем Enter. Но можно и после набора каждой пары

Слайд 7Процедура записи
Процедура записи Write производит вывод числовых данных, символов, строк и

булевских значений. Формат:

Write (Y1, Y2, … ,Yn);
или
Write (F, Y1, Y2, … ,Yn);
где Y1, Y2, … ,Yn – выражения типа integer, byte, char, boolean и т.д.; F – имя файла, куда производится вывод. Для вывода на принтер F равно Lst. Чтобы устройство Lst стало доступным, необходимо подключить модуль Printer с помощью зарезервированного слова uses.


Процедура записи	Процедура записи Write производит вывод числовых данных, символов, строк и булевских значений. Формат:	Write (Y1, Y2, …

Слайд 8П Р И М Е Р.
uses Printer;
var
. . .
begin

Write(234); {Выражение предоставлено значением}
Write(A+B-2); {Выводится результат выражения}
Write(Lst, ' Результат вычислений = ' A+B);
end.
Процедура записи Writeln отличается от процедуры записи Write тем, что в процедуре Writeln после вывода курсор автоматически переходит не новую строку, когда при Write курсор остается на этой же строке.


П Р И М Е Р.	uses Printer;	var	  . . .	begin	 Write(234);	{Выражение предоставлено значением}	 Write(A+B-2); {Выводится результат

Слайд 9Форматы вывода
В процедурах вывода Write и Writeln имеется возможность записи выражения,

определяющего ширину поля вывода.
1. Пусть дано целое число. Осуществим его вывод с позиции расположения курсора. Write (a).
Число Выражение Результат
a:=123 Write (a) 123
a:=555 Write (a,a,a) 555555555
2. Теперь выведем целое число a в крайние правые позиции поля ширины p. Write (a:p).
Число Выражение Результат
a:=134 Write (a:5) ___134
a:=1 Write (a:10) ___________1


Форматы вывода		В процедурах вывода Write и Writeln имеется возможность записи выражения, определяющего ширину поля вывода.1.	Пусть дано целое

Слайд 103. Выведем вещественное число в формате с плавающей точкой (на такое число

отводится 18 символов, один из которых отводится под знак числа). Write (R);
Число Выражение Результат
R:=755.432 Write (R) __7.1543200000E+02
R:=-1.919E+01 Write (R) _–1.9190000000E+01
4. Выведем вещественное число R в формате с плавающей точкой в крайние правые позиции поля шириной p символов, причем после десятичной точки выведем q цифр (0 Write (R:p:q);
Число Выражение Результат
R:=511.04 Write (R:8:4) 511.0400
R:=-46.78 Write (R:7:2) _–46.78
Подобные операции вывода с крайней правой позиции поля шириной несколько символов можно проводить и с другими видами переменных.


3.	Выведем вещественное число в формате с плавающей точкой (на такое число отводится 18 символов, один из которых

Слайд 11Операторы
Оператором называется предложение языка программирования, задающее полное описание некоторого действия, которое

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

Простые операторы
Структурные операторы


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

Слайд 12Простые операторы
Операторы, не содержащие никаких других опера торов, называются

простыми.
К ним относятся:
операторы присваивания
операторы безусловного перехода
операторы вызова процедуры
пустой оператор


Простые операторы  Операторы, не содержащие никаких других опера торов, называются простыми.   К ним относятся:

Слайд 13Оператор присваивания
Оператор присваивания (:=) предписывает выполнить выражение, заданное в его правой

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

переменная

:=

выражение

идентификатор функции


Оператор присваивания	Оператор присваивания (:=) предписывает выполнить выражение, заданное в его правой части, и присвоить результат переменной, идентификатор

Слайд 14 Оператор присваивания выполняется следующим образом: сначала вычисляется выражение в правой части

присваивания, а затем его значение присваивается пере- менной, указанной в левой части оператора. Например, для оператора R:=A*B; сначала выполняется умножение двух чисел A и B, а затем результат присваивается переменной R. В предыдущих примерах мы уже использовали этот опе-ратор, например:
A:= 8;
B:= 16;
S:= A * B;
D:= A / B;


Оператор присваивания выполняется следующим образом: сначала вычисляется выражение в правой части присваивания, а затем его значение присваивается

Слайд 15Оператор безусловного перехода
Оператор безусловного перехода (go to) означает “перейти к” и

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

go to

метка


Оператор безусловного перехода	Оператор безусловного перехода (go to) означает “перейти к” и применяется в случаях, когда после выполнения

Слайд 16 Метка объявляется в разделе описания меток и может содержать как цифровые,

так и буквенные символы.
П Р И М Е Р.
go to 999 ;
go to Home;
При использовании оператора go to необходимо помнить, что областью действия метки является только тот блок, в котором она описана. Передача управления в другой блок запрещена.
Использование безусловных передач управления в программе считается теоретически избыточным и подвер- гается серьезной критике, т.к.способствует созданию мало- понятных и трудно модифицируемых программ, которые вызывают большие сложности при отладке и сопровожде- нии. Поэтому рекомендуется минимальное использование оператора go to с соблюдением следующих правил:


Метка объявляется в разделе описания меток и может содержать как цифровые, так и буквенные символы.П Р И

Слайд 17следует стремиться применять операторы перехода (если кажется невозможным обойтись без них)

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


следует стремиться применять операторы перехода (если кажется невозможным обойтись без них) для передачи управления только вниз (вперед)

Слайд 18Оператор вызова процедуры
Оператор вызова процедуры служит для активизации предварительно определенной пользователем,

или стандартной, процедуры.
Например:
Clrscr; {Вызов стандартной процедуры
очистки экрана}
BeginWork(a, b); {Вызов пользовательской процедуры}


Оператор вызова процедуры	Оператор вызова процедуры служит для активизации предварительно определенной пользователем, или стандартной, процедуры. Например:Clrscr;

Слайд 19Пустой оператор
Пустой оператор не содержит никаких символов и не выполняет никаких

действий. Обычно пустой оператор используется для организации перехода к концу локально-го или глобального блока в случаях, если необходимо пропустить несколько операторов, не выходя из блока. Для этого перед зарезервированным словом end ставится метка и двоеточие, например:


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

Слайд 20 label Metka;
. . .
begin
. . .
go to Metka;

. . .
Metka;
end;

begin

end.

Metka :

go to Metka;

. . .

. . .



label Metka;	 . . .	begin	 . . .	 go to Metka;	 . . .	 Metka;	end;beginend.Metka :go to

Слайд 21Структурные операторы
Структурные операторы представляют собой конструкции, построенные из

других операторов по строго определенным правилам. Все структурные операторы можно разделить на три группы:
составные операторы
условные операторы
операторы повтора


Структурные операторы   Структурные операторы представляют собой конструкции, построенные из других операторов по строго определенным правилам.

Слайд 22Составной оператор
Составной оператор представляет собой группу из произвольного числа операторов, отделенных

друг от друга точкой с запятой, и ограниченную операторными скобками begin и end.
Синтаксическая диаграмма составного оператора:

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


Составной оператор	Составной оператор представляет собой группу из произвольного числа операторов, отделенных друг от друга точкой с запятой,

Слайд 23Условные операторы
Условный оператор предназначен для выбора к исполнению

одного из возможных действий (операторов) в зависимости от некоторого условия (при этом одно из действий может быть пустым, т.е. отсутствовать). В качестве условий выбора используется значение логического выражения. В Турбо Паскале имеются два условных оператора:
if
case


Условные операторы   Условный оператор предназначен для выбора к исполнению одного из возможных действий (операторов) в

Слайд 24Оператор условия if
Оператор условия if является одним из самых популярных средств,

изменяющих естественный порядок выполнения операторов программы. Диаграмма оператора условия if выглядит так:

Как видно из диаграммы, он может принимать одну из
следующих форм:


Оператор условия if	Оператор условия if является одним из самых популярных средств, изменяющих естественный порядок выполнения операторов программы.

Слайд 25if then

else <оператор 2>;

if <условие> then <оператор>;

если <условие> то <оператор 1>
иначе <оператор 2>;

если <условие> то <оператор>;

Оператор условий if выполняется следующим образом. Сначала вычисляется выражение, записанное в условии. В результате его вычисления получается значение логического типа. В первом случае, если значение выражения есть истина, выполняется <оператор 1>, указанный после слова then (то). Если результат вычисления выражения в условии есть ложь, выполняется <оператор 2>. Во втором – если результат выражения есть истина, выполняется <оператор>, если ложь –оператор, следующий сразу за оператором if. Операторы if могут быть вложенными.
Пример фрагмента программы с оператором условия if:


if then           else ;if then ;если то

Слайд 26Read (N) ;
if N0 then
begin
F:=1 / N

;
Writeln(' Значение функции 1 / N = ', F:0:2) ;
end;
else
Writeln(' Деление на ноль невозможно! ') ;
В данном примере с клавиатуры вводится действительное число. Затем проверяется условие N<>0, (знак «<>» обозначает не равно). Если оно выполняется, производится вычисление числа, обратного данному и вывод полученного числа на экран с округлением до двух знаков после запятой. Если условие не выполняется, то выводится соответствующее сообщение.


Read (N) ;if N0 then begin   F:=1 / N ;   Writeln(' Значение функции

Слайд 27 Примечание:
При использовании вложенных условных операторов может возникнуть синтаксическая неоднозначность, иллюстрируемая следующей

схемой:
if <условие 1> then if< условие 2> then <оператор 1>
else <оператор 2>
Возникающая двусмысленность, к какому опера- тору if принадлежит часть else <оператор 2>, разрешается тем, что служебное слово else всегда ассоциируется (связывается) с ближайшим по тексту служебным словом if, которое еще не связано со служебным словом else.
В связи с этим следует проявлять аккуратность при записи вложенных операторов условия.


Примечание:	При использовании вложенных условных операторов может возникнуть синтаксическая неоднозначность, иллюстрируемая следующей схемой:if then if< условие 2> then

Слайд 28Оператор выбора case
Если один оператор if может обеспечить выбор из двух

альтернатив, то оператор выбора case позволяет сделать выбор из произвольного числа имеющихся вариантов. Он состоит из выражения, называемого селектором (selection – выбор альтернативы), и списка параметров, каждому из которых предшествует список констант выбора (список может выглядеть из одной константы). Синтаксическая диаграмма оператора case выглядит следующим образом:


Оператор выбора case	Если один оператор if может обеспечить выбор из двух альтернатив, то оператор выбора case позволяет

Слайд 29 Следуя данной диаграмме, получим следующий формат записи:
case of
:

1;>
<список 2>: <оператор 2;>
. . .
<список N>: <оператор N;>
else <оператор >
end;
Оператор case работает следующим образом. Сначала вычисляется значение выражения-селектора, затем обеспечи- вается реализация того оператора, константа выбора которого равна текущему значению селектора. Если ни одна константа не равна текущему значению селектора, выполняется опера- тор, стоящий за словом else. Если слово else отсутствует, ак-тивизируется оператор, находящийся за словом end, т.е. пер-вый оператор за границей case.


Следуя данной диаграмме, получим следующий формат записи:case of	: 	: 	. . .	: 	else end;	Оператор case работает следующим

Слайд 30Приведем типичные формы записи оператора case.
Селектор интервального типа:
case I of
1

.. 10: Writeln(' число ', I : 4, ' в диапазоне 1 – 10 ');
11 .. 20: Writeln(' число ', I : 4, ' в диапазоне 11 – 20 ' );
21 .. 30: Writeln(' число ', I : 4, ' в диапазоне 21 – 30 ')
else Writeln(' число ', I : 4, ' вне предела контроля ')
end;
Селектор целочисленного типа:
case I of
1 : Z := I + 10;
2 : Z := I + 100;
3 : Z := I + 1000
end;


Приведем типичные формы записи оператора case.	Селектор интервального типа:case I of 1 .. 10: Writeln(' число ', I

Слайд 31 Селектор перечисляемого пользовательского типа:
var
Season:(winter, spring, summer, autumn);
begin
case Season of
winter: writeln('зима');
spring:

writeln('весна');
summer: writeln('лето');
autumn: writeln('осень');
end;
end.


Селектор перечисляемого пользовательского типа:	varSeason:(winter, spring, summer, autumn); begin	case Season of	winter: writeln('зима');	spring: writeln('весна');	summer: writeln('лето');	autumn: writeln('осень'); 	end;  end.

Слайд 32Операторы повтора
Если в программе возникает необходимость неоднократно выполнить некоторые операторы, то

используются операторы повтора (циклы). В языке Паскаль различают три вида операторов цикла:
Они используются для организации циклов различных типов. Выражение, управляющее повторением, должно иметь логический тип.
Если число повторений оператора (составного опера- тора) заранее неизвестно, а задано лишь условие его повторения (или окончания), используют операторы while, repeat. Оператор for используется, если число повторений заранее известно.

while

repeat

for


Операторы повтора	Если в программе возникает необходимость неоднократно выполнить некоторые операторы, то используются операторы повтора (циклы). В языке

Слайд 33Оператор while
Оператор while (пока) часто называют оператором цикла с предусловием за

то, что проверка условия выполнения тела цикла производится в самом начале оператора.
Синтаксическая диаграмма для данного оператора выглядит следующим образом:

Формат записи:
while <условие продолжения повторений> do
<тело цикла>
Условие – логическое выражение, тело цикла – простой или составной оператор. Перед каждым выполнением тела цикла вычисляется значение выражения условия


Оператор while	Оператор while (пока) часто называют оператором цикла с предусловием за то, что проверка условия выполнения тела

Слайд 34Если результат истинен, то тело цикла выполняется и снова вычисляется выражение

условия. Если результат ложен, происходят выход из цикла и переход к первому после while оператору.
Приведем программу, демонстрирующую работу цикла while. Вычисление факториала введенного числа.

var n, i : integer; fn : longint;
begin
writeln ('Введите натуральное число ...') ;
read (n) ;
fn := 1 ;
while i < n do
begin
i := i + 1;
fn := fn * i ;
end;
writeln ('... его факториал равен', fn : 10);
end.


Если результат истинен, то тело цикла выполняется и снова вычисляется выражение условия. Если результат ложен, происходят выход

Слайд 35Оператор повтора repeat
Оператор повтора repeat аналогичен оператору while, но отличается от

него, во-первых, тем, что условие проверяется после очередного выполнения операторов тела цикла, а во-вторых, тем, что критерием прекращения цикла является равенство выражения истине. За это цикл repeat часто называют циклом с постусловием, или циклом “ ДО”, так как он прекращается выполняться, как только значение выражения условия, записанного, после слова until становится истина.
Оператор условия repeat состоит из заголовка repeat, тела цикла и условия окончания until.
Синтаксическая диаграмма для данного оператора выглядит следующим образом:


Оператор повтора repeat	Оператор повтора repeat аналогичен оператору while, но отличается от него, во-первых, тем, что условие проверяется

Слайд 36 Формат записи:
repeat

. . .

until

окончания цикла> ;
Операторы, заключенные между словами repeat и until, являются телом цикла. Вначале выполняется тело цикла, за- тем проверяется условие выхода из цикла. Именно по этому цикл, организованный с помощью оператора repeat, в любом случае выполнится хотя бы один раз. Если результат логичес- кого выражения ложен, то тело цикла повторяется еще раз; если результат истина, происходит выход из цикла.

repeat

оператор

выражение

until

;


Формат записи:	repeat	  	  . . .	  	until ;	Операторы, заключенные между словами repeat и until,

Слайд 37 При программировании операторов тела циклов следует обеспечить влияние по крайней мере

одного из операторов тела цикла на значение условия, иначе цикл будет выполнятся беско- нечно.
Примером действия оператора repeat служит следующая программа, суммирующая числа, вводимые с клавиатуры, если пользователь ввел 0, то выводится сумма.
var x,sum : integer ;
begin
sum:=0;
repeat
write ('Значение Х=') ;
readln (x) ;
if x < > 0 then sum := sum + x ;
until x = 0;
writeln('Сумма введенных чисел = ', sum);
end.


При программировании операторов тела циклов следует обеспечить влияние по крайней мере одного из операторов тела цикла на

Слайд 38Оператор повтора for
В случаях, когда число повторений может быть зара- нее

известно, для организации циклической обработки ин- формации применяется оператор повтора for. Часто этот оператор называют оператором цикла с параметром, так как число повторений задается переменной, называемой пара- метром цикла, или управляющей переменной.
Оператор повтора for состоит из заголовка и тела цикла.
Синтаксическая диаграмма для данного оператора выглядит следующим образом:


Оператор повтора for	В случаях, когда число повторений может быть зара- нее известно, для организации циклической обработки ин-

Слайд 39 Как видно из диаграммы он может быть представлен в двух формах:
for

<параметр цикла> := to do <оператор> ;
for <параметр цикла> := to downto <оператор> ;
где S1 и S2 – выражения, определяющие соответственно на- чальное и конечное значение параметра цикла;
for …do – заголовок цикла;
<оператор> – тело цикла.
Тело цикла может бать простым или составным опера- тором. Оператор for обеспечивает выполнение тела цикла до тех пор, пока не будут перебраны все значения параметра цик- ла от начального до конечного.
Заголовок оператора повтора for определяет:
диапазон изменения значений управляющей переменной (па- раметра цикла) и одновременно число повторений оператора, содержащегося в теле цикла;


Как видно из диаграммы он может быть представлен в двух формах:for := to do ;for := to

Слайд 40 направление изменения значения параметра цикла (возрастание –to или убывание –

downto).
П Р И М Е Р:
for I := 1 to 10 do Read (M[I]) ; {Чтение элементов массива}
for I := 10 downto 1 do Write (M[I]) ;{Вывод элементов
массива}
При первом обращении к оператору for вначале вычисляют- ся выражения S1 и осуществляется присваивание <параметр цикла> := S1.
После этого циклически повторяются следующие действия:
1. Проверяется условие <параметр цикла>: <= S2.
2. Если условие выполнено, то оператор for продолжает работу (выполняется оператор в теле цикла), если условие <параметр цикла>: <= S2 не выполнено, то оператор for завершает работу, и управление в программе передается на оператор, следующий за циклом.
3. Значение управляющей переменной изменяется на +1 (to) или –1 (downto) и далее с пункта 1. Обратите внимание, что шаг изменения управляющей переменной – единица.


направление изменения значения параметра цикла (возрастание –to или убывание – downto).	П Р И М Е Р:for

Слайд 41 На использование управляющей переменной (пара- метра цикла) в цикле for накладываются

следующие ограни- чения.
1. В качестве параметра должна использоваться простая переменная, описанная в текущем блоке.
2. Управляющая переменная должна иметь дискретный тип.
3. Начальное и конечное значение диапазона должны иметь тип, совместимый с типом управляющей переменной. При этом допустим любой скалярный тип, кроме вещественного.
4. В теле цикла запрещается явное изменение значения уп- равляющей переменной (например, оператором присваива- ния).
5. После завершения оператора значение управляющей пе- ременной становится неопределенным, если только выпол-нение оператора не было прервано оператором перехода.
Приведем пример действия оператора for на примере перевода температуры из «Цельсия» (C) в «Фаренгейт» (F). По формуле F = C*1.8 + 32, на отрезке от15ºC до 30ºC c шагом 1ºC.


На использование управляющей переменной (пара- метра цикла) в цикле for накладываются следующие ограни- чения.1. В качестве параметра

Слайд 42var I : integer;
F : real ;
begin
writeln (' Т

Е М П Е Р Т У Р А ') ;
for I := 15 to 30 do
begin
F := I*1.8 + 32 ;
writeln ('По Цельсию = ',I,' по Фаренгейту = ',F:5:1) ;
end;
end.
Допускается вкладывание одного цикла в другой с соб- людением всех правил.


var I : integer; F : real ; beginwriteln (' Т Е М П Е Р Т

Что такое shareslide.ru?

Это сайт презентаций, где можно хранить и обмениваться своими презентациями, докладами, проектами, шаблонами в формате PowerPoint с другими пользователями. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами.


Для правообладателей

Яндекс.Метрика

Обратная связь

Email: Нажмите что бы посмотреть