Вычисление суммы. Вычисление элементов последовательности презентация

Содержание

Программа { Автор: Иванов И. И. } { Группа: ФФ-101 } { Тема: Простейшие программы } program Ex1; var X,Y,X1,Res : real; L

Слайд 1Задание
а)

б)



в) j=1,2,3,4,5;

г) Составить логическое выражение, принимающее значение истина, если точка с координатами (x,y) попадает в треугольник с координатами вершин {[0;0];[0;1];[2;1]}. Вычислить значения выражения для следующих координат точек:
{[0,5;0,7], [1;0], [-0,5;0,5], [1;1,5]}.
Тесты:
а) ожидаемый результат 1,346;
б) ожидаемый результат для x=1,2 равен 20,783;
в) ожидаемый результат A0=1, A1=1, A2=1, A3=5, A4=47, A5=747, A6=19363;
г) ожидаемый результат TRUE для x=0,5, y=0,7, а для точек с координатами {[1;0],[-0,5;0,5], [1;1,5]} ожидаемый результат FALSE.





Слайд 2Программа
{ Автор: Иванов И. И. }
{ Группа: ФФ-101 }
{ Тема:

Простейшие программы }
program Ex1;
var
X,Y,X1,Res : real;
L : boolean;
A0,A1,A2,A3,A4,A5,A6 : integer;
begin
res:=(0.2+sqrt(0.5))/(sin(0.3)+cos(0.3))-
exp(1/3)+exp(1/3*ln(8.2));
writeln('Результат "а" =',res:10:3);
write('Ввод x=');
readln(X1);
res:=(2*sqr(X1)+3)*sin(X1)+exp(X1*X1*X1+1);
writeln(‘ Результат "б" =',res:10:3);

A0:=1;
A1:=1;
A2:=A1;
A3:=4*A2+A1;
A4:=9*A3+2*A2;
A5:=16*A4+3*A3;
A6:=25*A5+4*A4;
writeln(' A0=',A0,' A1=',A1,
' A2=',A2,' A3=',A3,' A4=',A4,
' A5=',A5, ' A6=', A6);
write('Ввести X и Y');
readln(X,Y);
L:=(X>=0) and (Y<=1) and (Y>=0.5*X);
writeln(' L=',L)
end.


Слайд 3program Ex2;
var
x:real;
y:real;
begin
writeln('Ввод x');
readln(x);

if x>=0 then
y:=sqr(x)
else
y:=-x;
writeln('F =',y:10:2)
end.

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

y:=x2


y:=-x


Слайд 4Пример 3.
Составить программу, вычисляющую значение следующей функции:

program Ex3;
var
x,y

: real;
p : real;
begin
writeln('Ввод X,Y');
readln(x,y);
if x>=0 then
if y>=0 then
p:=x * y
else
p:=x + y
else
if y>=0 then
p:=x - y
else
p:=1;
writeln('P =',p:10:2);
end.


p:=1

p:=x-y


p:=x+y

p:=x*y



Слайд 5Пример 4.
Составить программу, печатающую значения 30, 20, 10 если точка

с координатами (x,y) находится на расстоянии меньше 1, 2, 3 от начала координат соответственно и 0 в остальных случаях.

program Ex4;
var
X,Y: real;
N : integer;
begin
writeln('Ввод X,Y');
readln(X,Y);
case trunc(sqrt(sqr(X)+sqr(Y))) of
0: N:=30;
1: N:=20;
2: N:=10;
else
N:=0
end;
writeln('N =',N);
end.


Слайд 6Вычисление суммы
Вычислить сумму элементов множества {ai|i=1..N}. Для вычисления суммы n

элементов следует прибавить элемент an к сумме n-1-го элемента.


program Ex6;
var
S,a: real;
N,Z: integer;
begin
S:=0;
Z:=-1;
for N:=1 to 10 do begin
a:=Z*sqr(N)/(1+N)
S:=S + a;
Z:=- Z
end;
writeln(' S1= ',S:10:3);
end.

Пример 6.
Составить программу вычисления суммы:



элемент суммы

для вычисления (– 1) используем соотношение


Слайд 7Вычисление бесконечной суммы
Пример 7.
Вычислить сумму
Суммирование прекращается при





Выведем рекуррентную формулу

для ai.

Имеем:

Проверка:




Program Ex7;
var
x,s,a,E: real;
i: integer;
begin
write(' Ввод X= ');
readln (x, E);
s:=0;
a:=-x;
i:=1;
while abs(a)>E do begin
s:=s + a;
i:=i+1;
a:= - a*x/i
end;
writeln(' S2= ',s:10:3);
end.

обозначим


Слайд 8Вычисление элементов последовательности
Пример 8.
Вычислить наименьший номер элемента последовательности, заданной рекуррентной формулой:



для которого выполняется условие:

Program Ex8;
var
A0,A1,A2: real;
N: integer;
begin
A1:=1;
A2:=2;
N:=1;
repeat
N:=N+1;
A0:=A1;
A1:=A2;
A2:=A1+A0;
until A2>100;
writeln(' Nmin= ',N);
end.

Таблица трассировки


Слайд 9Определение максимального (минимального) элемента множества

program Ex9;
var
i, Imax: integer;

a, Amax: real;
begin
Amax:=exp(-0.1);
Imax:=1;
for i:=2 to 30 do begin
a:=sqr(i)*exp(-i/10);
if a>Amax then begin
Amax:=a;
Imax:=i
end
end;
writeln('Amax= ',Amax:10:2,‘
Imax= ',Imax:3);
end.

Пример 9.
Определить номер максимального элемента множества {ai | i=1..30},


где

Рекуррентные соотношения:

В качестве начального значения переменной, предназначенной для хранения текущего значения максимального (минимального) элемента, следует использовать один из элементов множества.


Слайд 10Пример 11.
Составить программу, выполняющую поиск целочисленных решений уравнения

в интервале значений каждой

переменной от 1 до 10.

program Ex10;
var
x,y,z: integer;
begin
for x:=1 to 9 do
for y:=x+1 to 10 do
for z:=1 to 10 do
if x*x+y*y=z*z then
writeln('x= ',x:3,' y= ',y:3,' z= ',z:3);
end.

При организации цикла учитывалось, что переменные x и y входят в уравнение симметрично, поэтому рассматривались только решения, в которых x


Слайд 11Пример использования вспомогательных процедур для управления циклами
program Ex11;
var
i: integer;
begin

for i:=1 to 10 do begin
if i=5 then
continue;
if i=7 then
break;
writeln(i)
end;
writeln(i)
end.

Слайд 12Пример 12.
Числовая последовательность определена рекуррентной формулой:
Составить подпрограмму, вычисляющую значение элемента последовательности

для произвольного заданного номера этого элемента.

Слайд 13Программа для примера 12
program Ex12;
function A (n: integer): real;
var
A1,A2,A3:

real;
i: integer;
begin
A2:=1.2;
A3:=2.3;
case n of
1: A:=A2;
2: A:=A3
else begin
for i:=2 to n-1 do begin
A1:=A2;
A2:=A3;
A3:=(2*i+1)/A2-A1/i
end;
A:=A3
end
end
end;

var
An: real;
N: integer;
begin
write ('N= ');
readln (N);
An:=A(N);
writeln('An=',An)
end.


Слайд 14Пример 13.
Составить процедуру, определяющую максимальное, минимальное и среднее арифметическое значения элементов

множества G={gi |i = 0..22}, где

Слайд 15Программа для примера 13
program Ex13;
procedure SetG(var Gmin,Gmax,Gavg:real);
var
Gi:real;
i:integer;
begin
Gmin:=0;

{g0 =0}
Gmax:=0;
Gavg:=0;
for i:=1 to 22 do begin
Gi:=0.18*i*i*i-4.9*i*i+20*i;
Gavg:=Gavg+Gi;
if Gi>Gmax then
Gmax:=Gi
else
if Gi Gmin:=Gi
end;
Gavg:=Gavg/23
end;

var
Gmin,Gmax,Gavg:real;
begin
SetG(Gmin,Gmax,Gavg);
writeln(' Min=',Gmin:6:2,
' Max=',Gmax:6:2,
' Avg=',Gavg:6:2)
end .


Слайд 16Пример 14. Вложенные подпрограммы
program Ex14;
procedure Outer;

procedure Inner;
begin
writeln('Inner');
end;
begin
writeln('Outer');
Inner;
end;
begin
Outer
end.



Внутренняя процедура


Внешняя процедура


Слайд 17Пример 15. Использование подпрограмм в качестве параметров.
Составить программу, которая вычисляет

и распечатывает в виде таблицы значения заданных функций:

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

Для заданных значений x, y и z.


Слайд 18Программа для примера 15
program Ex15;
type
TFunc=function (x:real):real;
function F1(x:real):real; far;
begin

if x=0 then
F1:=1
else
F1:=sin(x)/x
end;
function F2(y:real):real; far;
begin
F2:=sqr(y)+2*y*sqrt(y)
end;
function F3(z:real):real; far;
begin
F3:=(z+2)*(z+1)*z
end;

procedure Table(F:TFunc);
var
i:integer;
r,x:real;
begin
writeln('----------------');
writeln('I I I');
writeln('I X I F(x) I');
writeln('I I I');
writeln('----------------');
for i:=0 to 10 do begin
x:=0.1*i;
r:=F(x);
writeln('I ',x:3:1,' I ',r:6:3,' I')
end;
writeln
end;


Слайд 19Продолжение программы для примера 15
var
x,y,z: real;
R: real;
begin

writeln(' Ввод x,y,z');
readln(x,y,z);
Table(F1);
Table(F2);
Table(F3);
R:=F1(x)+F2(y)*F3(F2(z));
writeln(' Результат ',R:8:4);
end.

Слайд 20Пример 16. Вычисление n!, используя соотношения n!=(n-1)!*n, 0!=1.
Program Ex16;
function

Nf(N: integer): integer;
begin
if N>0 then
Nf:=Nf(N-1)*N
else
Nf:=1;
end;
var
NN,N: integer;
begin
readln(N);
NN:=Nf(N);
writeln(NN);
end.

Слайд 21Пример 17.
Составить программу, определяющую номер максимального элемента в заданном множестве действительных

чисел.

Program Ex17;
type
TNumArray=array [1..100] of real;
var
NumSet:TNumArray;
MaxReal: real;
NumOfMax,i,N : integer;
begin
write('N= ');
readln(N);
for i:=1 to N do
readln(NumSet[i]);
MaxReal:=NumSet[1];
NumOfMax:=1;
for i:=2 to N do
if NumSet[i]>MaxReal then begin
MaxReal:=NumSet[i];
NumOfMax:=i;
end;
writeln(NumOfMax:3,MaxReal:10:3)
end.

В программе предполагается, что массив NumSet может содержать до ста элементов. Реальное число элементов множества вводится с клавиатуры и присваивается переменной N.
Значение максимального элемента сохраняется в переменной MaxReal, а соответствующий номер - в переменной NumOfMax.


Слайд 22
Пример 18.
Составить программу, вычисляющую произведение двух квадратных матриц С=A×B, где N

– порядок матрицы, а элементы cij определяются по формуле:

Для хранения матриц в памяти используются двумерные массивы.
В программе предполагается, что число элементов матрицы не превышает 100. Текущий размер матрицы сохраняется в качестве значения переменной N. Исходные матрицы размещаются в массивах A и B, а их произведение в массиве С.
Ввод значений элементов исходных матриц выполняется по строкам.


Слайд 23Program Ex18;
type
TMatrix=array [1..10,1..10] of integer;
procedure Input (N: integer; var

X:TMatrix);
var
i,j: integer;
begin
for i:=1 to N do begin
for j:=1 to N do
read(X[i,j]);
readln;
end;
end;

var
A,B,C: TMatrix;
i,j,k: integer;
N: integer;

begin
write(' N= ');
readln(N);
Input(N,A);
Input(N,B);
for i:=1 to N do
for j:=1 to N do begin
C[i,j]:=0;
for k:=1 to N do
C[i,j]:=C[i,j]+A[i,k]*B[k,j];
end;
for i:=1 to N do begin
for j:=1 to N do
write(C[i,j]:3);
writeln;
end;
end.


Слайд 24program Ex19;
type
TArN=array [1..5] of integer;

procedure LSearch(A:TArN; N: integer; x:

integer; var Num: integer);
begin
Num:=1;
while (Num<=N) and (x<>A[Num]) do
Num:=Num+1;
if Num>N then
writeln(' Элемент отсутствует')
end;


Пример 19.Линейный поиск


Слайд 25Пример 19. Двоичный поиск
procedure DSearch(A:TArN; N: integer; x: integer;var Num: integer);
var

L,R,M : integer;
begin
L:=1;
R:=N;
while L M:=(L+R) div 2;
if x>A[M] then
L:=M+1
else
R:=M
end;
if A[R]<>X then
writeln(' Элемент отсутствует')
end;

Слайд 26Пример 19. Главная программа
const
ArN:TArN=(1,9,5,4,6);
N=5;
var
Num,x:integer;
begin

readln(x);
LSearch(ArN,N,x,Num);
writeln(Num);
DSearch(ArN,N,x,Num);
writeln(Num);
end.

Слайд 27Программа рассчитана на худший случай, когда минимальный элемент находится в конце

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

program Ex20;
type
ArN = array [1..10] of integer;
const
A : ArN =(20,15,6,17,4,1,-5,3,9,0);
var
C, i, j : integer;
begin
for i:=1 to 9 do
for j:=1 to 10-i do
if A[j]>A[j+1] then begin
C:=A[j];
A[j]:=A[j+1];
A[j+1]:=C
end;
for i:=1 to 10 do
write(' ',A[i]);
writeln;
end.

Пример 20. Пузырьковая сортировка.


Слайд 28Пример 21. Быстрая сортировка
program Ex21;
type
TNumAr = array[1..10] of integer;
procedure QuickSort

(var A: TNumAr;
N:integer);
procedure Sort(l,r: integer);
var
i, j ,x, y : integer;
begin
i:=l; j:=r;
x:=a[(l+r) div 2];
repeat
while a[i] while x if i<=j then begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
i:=i+1; j:=j-1;
end;
until i>j;
if l if i end;

begin {quicksort};
sort(1,N);
end;

const
a:TNumAr=(20,15,6,17,4,1,-5,3,9,0);
var
i: integer;
begin
quicksort(A,10);
for i:=1 to 10 do write(A[i]:4);
writeln;
end .


Слайд 29Пример 22.
Подсчитать количество символов "А" в строке, которая вводится с клавиатуры

и присваивается в качестве значения переменной s.

program Ex22;
var
s : string;
i,k: integer;
begin
readln(s);
k:=0;
for i:=1 to Length(s) do
if s[i]='A' then
k:=k+1;
writeln(k)
end.


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

и закрывающих круглых скобок, т. е. верно ли, что:
а) открывающая скобка всегда предшествует соответствующей закрывающей;
б) первый и последний символы текста – пара соответствующих друг другу скобок.

Слайд 31Пример 23. Программа
program Ex23;
var
s: string;
i,k,Len: integer;

l: boolean;
begin
writeln('Ввод строки');
readln(s);
Len:=Length(s);
k:=0;
i:=1;

if ( s[1]='(' ) and ( s [Len]=') ' ) then begin
while (i=0) do begin
i:=i+1;
if s [ i ]='(' then
k:=k+1
else
if s [ i ]=')' then
k:=k-1;
end;
L:=i=Len;
end
else
L:=false;
writeln('Баланс скобок ',L);
end.


Слайд 32Пример 24.
Задано множество попарно различных точек на плоскости. Найти пару точек,

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

Слайд 33Program Ex24;
const
N=5;
type
TPoint=record
X,Y:real

end;
TPointsSet=array [1..5] of TPoint;
const
PointsSet:TPointsSet=((X:0;Y:0),(X:0;Y:2),
(X:1;Y:1), (X:4;Y:2), (X:2;Y:4));
function Dist(X1,Y1,X2,Y2:real):real;
begin
Dist:=sqrt(sqr(X1-X2)+sqr(Y1-Y2));
end;

Пример 24. Программа (начало)


Слайд 34Пример 24. Программа (продолжение)
procedure MinDist(var P:TPointsSet; var IMin, JMin: integer; var SMin: real);
var
I,J:integer;

D:real;
begin
SMin:=Dist(P[1].X,P[1].Y,P[2].X,P[2].Y);
IMin:=1;
JMin:=2;
for I:=1 to N-1 do
for J:=I+1 to N do begin
D:=Dist(P[I].X,P[I].Y,P[J].X,P[J].Y);
if D SMin:=D;
IMin:=I;
JMin:=J;
end
end
end;

Слайд 35var
IMin,JMin: integer;
SMin: real;
begin
MinDist(PointsSet,IMin, JMin,SMin);

writeln(IMin:3,' ',JMin:3, ' ',SMin:7:2);
end.

Пример 24. Программа (окончание)


Слайд 36Пример 25
Заданы таблицы СОТРУДНИКИ и ОТДЕЛЫ. Составить программу, определяющую распечатывающую таблицу,

которая содержит список сотрудников, работающих в заданном отделе.

Таблицы СОТРУДНИКИ и ОТДЕЛЫ содержат сведения о сотрудниках некоторой организации и отделах, в которых они работают. Таблицы связаны с помощью поля НОМЕР_ОТД.
НОМЕР_СОТР - уникальный номер сотрудника (целое без знака).
ФАМИЛИЯ - фамилия сотрудника (строка из 15 символов).
ЗАРПЛАТА - зарплата сотрудника (вещественное).
НОМЕР _ОТД - уникальный номер отдела (целое без знака).
НАЗВАНИЕ- название отдела (строка из 12 символов).

СОТРУДНИКИ

ОТДЕЛЫ


Слайд 37Program Ex25;
const
NE=5; ND=3;
type
TStr15=string[15];
TStr12=string[12];

TEmp=record
ENum :integer;
EName:TStr15;
ESal :real;
DNum :integer;
end;
TDept=record
DNum :integer;
DName:TStr12;
end;
TEmpTable=array [1..NE] of TEmp;
TDeptTable=array [1..ND] of TDept;

Пример 25. Программа (начало)


Слайд 38Пример 25. Программа (продолжение)
const
Emp:TEmpTable=
((ENum:21; EName:'Иванов';

ESal:10300.0; DNum:102),
(ENum:12; EName:'Орлов'; ESal:6300.0; DNum:300),
(ENum:35; EName:'Сидоров'; ESal:12340.5; DNum:200),
(ENum:14; EName:'Лебедев'; ESal:6780.9; DNum:300),
(ENum:51; EName:'Гусев'; ESal:10110.1; DNum:300));
Dept:TDeptTable=((DNum:102;DName:'Бухгалтерия'),
(DNum:300;DName:'Канцелярия' ),
(DNum:200;DName:'Плановый' ));

Слайд 39Пример 25. Программа (продолжение)
procedure FindDeptNum(DeptName:TStr12;var D:TDeptTable;
var DNum: integer);
var

{Поиск номера отдела по его имени}
i: integer;
begin
i:=1;
while (i<=ND) and (D[i].DName<>DeptName) do i:=i+1;
if i>ND then begin
writeln(' Отдела ',DeptName,' не существует.'); halt
end
else
DNum:=D[i].DNum;
end;

Слайд 40Пример 25. Программа (продолжение)
procedure MakeList(var Emp:TEmpTable; var EmpList:TEmpTable;
DNum:integer; var

K:integer);
var {Формирование списка сотрудников по номеру отдела}
i: integer;
begin
K:=0;
for i:=1 to NE do
if Emp[i].DNum=DNum then begin
K:=K+1;
EmpList[K]:=Emp[i]
end
end;

Слайд 41Пример 25. Программа (продолжение)
procedure PrintDept(var Dept:TDeptTable; ND:integer);
var

{Печать таблицы ОТДЕЛЫ}
i: integer;
begin
writeln;
writeln('*************************************');
writeln('* НОМЕР_ОТД * НАЗВАНИЕ *');
writeln('*************************************');
for i:=1 to ND do
with Dept[i] do begin
writeln('* ',DNum:5,' * ',DName:12,' *');
end
end;

Слайд 42Пример 25. Программа (продолжение)
procedure PrintEmp(var EmpList:TEmpTable;N:integer);
var

{Печать таблицы СОТРУДНИКИ}
i: integer;
begin
writeln;
writeln('*****************************************************************');
writeln('*НОМЕР_СОТР*ФАМИЛИЯ*ЗАРПЛАТА*НОМЕР_ОТД*');
writeln('*****************************************************************');
for i:=1 to N do
with EmpList[i] do begin
writeln('* ',ENum:5,' * ',EName:15,' * ',ESal:8:2,' *',DNum:5,' *');
end
end;

Слайд 43var
EmpList:TEmpTable;
DeptName:TStr12;
DNum,LNum:integer;
begin
write('Название отдела- ');

readln(DeptName);
PrintEmp(Emp,NE);
PrintDept(Dept,ND);
FindDeptNum(DeptName,Dept,DNum);
MakeList(Emp,EmpList,DNum,LNum);
writeln(' Отдел ',DeptName);
if LNum>0 then
PrintEmp(EmpList,LNum)
else
writeln(' Нет сотрудников.');
end.

Пример 25. Программа (окончание)


Слайд 44Пример 26
Вычислить сумму 1,4,7 и 9 элементов массива.

program Ex26;
type
TAr=array

[1..10] of integer
var
A:TAr;
i,s:integer;
begin
for i:=1 to 10 do
readln(A[i]);
s:=0;
for i:=1 to 10 do
if i in [1,4,7,9] then
s:=s+A[i];
writeln(s);
end.

Слайд 45Пример 27
Составить две программы. Первая (a) создает файл записей, компоненты которых

содержат значение имени и возраста. Вторая (b) считывает записи из файла и вычисляет средний возраст, значение которого записывается в текстовый файл .

program Ex27a;
type
TMRec= record
Name: string[15];
Age: integer;
end;
TFMRec= file of TMRec;
var
f:TFMRec;
r:TMRec;
i: integer;
begin
assign (f,'filerec.dat');
rewrite (f);
for i:=1 to 5 do begin
readln (r.Name,r.Age);
write (f,r)
end;
close(f);
end.


Слайд 46program Ex27b;
type
TMRec= record
Name: string[15];
Age: integer;
end;

TFMRec= file of TMRec;
var
g: text;
f: TFMRec;
r: TMRec;
s: real;
num: integer;
begin
assign (f,'filerec.dat');
assign (g,'num.dat');
reset (f);
rewrite (g);

s:=0;
num:=0;
while not eof(f) do begin
read(f,r);
s:=s+r.Age;
num:=num+1;
end;
if num<>0 then begin
s:=s/num;
write (g, ‘Средний возраст=',s:6:2)
end
else
writeln (‘Файл пуст');
close (f);
close (g);
end.


Слайд 47Пример 28
В модуле размещаются процедуры и функции, вычисляющие произведение и сумму

элементов целочисленного одномерного массива. Максимальное число элементов массива равно 100.
Программа и модуль записываются в различные файлы. Имя файла, в котором находится модуль, должно совпадать с идентификатором модуля. Например, модуль Unit1 должен находиться в файле Unit1.pas.

program Ex28;
uses Unit1;
var
A:TArray;
i,N,ASum,P: integer;
begin
Readln(N);
for i:=1 to N do
Readln(A[i]);
Sum(A,N,ASum);
P:=Mult(A,N);
Writeln(ASum,' ',P)
end.

Главная программа


Слайд 48Модуль
unit Unit1;
interface
type
TArray= array [1..100] of integer;


procedure Sum(A:TArray;N: integer; var ASum: integer);
function Mult(A:TArray;N: integer):integer;
implementation
procedure Sum(A:TArray; N: integer; var ASum: integer);
var i: integer;
begin
ASum:=0;
for i:=1 to N do ASum:=ASum+A[i]
end;
function Mult(A:TArray;N:integer): integer;
var i,P: integer;
begin
P:=1;
for i:=1 to N do P:=P*A[i];
Mult:=P
end;
end.

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

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

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

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

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


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

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