Понятие языка программирования — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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

Понятие языка программирования

2017-05-18 682
Понятие языка программирования 0.00 из 5.00 0 оценок
Заказать работу

Понятие языка программирования

Язык программирования - это искусственный, формализованный язык для описания алгоритма решения задачи на компьютере. Этот язык, в отличие от естественного, не допускает никаких произвольных толкований.
Компьютерная программа - это точная и подробная инструкция с порядком действий на каком-либо языке программирования, переведенная в машинные коды (это упорядоченная последовательность команд (инструкций) компьютера для решения задачи). Компьютер может выполнять только инструкции программы.
Существует три разновидности языков программирования:
1) машинные языки - это языки, элементами которых являются команды компьютера. В этих языках управление и структура данных непосредственно отображают архитектуру конкретного компьютера.
2) языки программирования низкого уровня. С помощью языка программирования низкого уровня программа взаимодействует непосредственно с аппаратурой ЭВМ, поэтому наиболее эффективно ее использует. Но подготовка таких программ сопряжена с большими трудностями. Примером такого языка является ассемблер (assembler).
3) языки программирования высокого уровня - это языки, которые отображают естественные для человека понятия, не связанные с конкретной структурой какой-нибудь системы. Но такие языки удалены от аппаратных средств и менее эффективны. Таких языков - большинство.

Трансляторы

Программы, подготовленные на языках программирования высокого уровня, нуждаются в трансляции (в переводе). Транслятор - это программа, преобразующая компьютерную программу на одном языке в программу на другом языке. Обычно трансляторы переводят программу с языка программирования высокого уровня (исходный код) на язык машинных кодов (объектный код) и, далее, для построения загрузочного модуля используется редактор связей.
Трансляторы существуют двух видов - интерпретаторы, которые выполняют пооператорную обработку и выполнение программы (часто в Basic'е) и компиляторы - транслируют всю программу целиком и готовят модуль для выполнения (используются в большинстве языков программирования).
Транслятор-интерпретатор воспринимает исходную программу на исходном языке и выполняет её. Интерпретатор преобразует небольшой фрагмент исходной программы в машинные команды и, лишь дождавшись, когда компьютер их выполнит, переходит к обработке следующего фрагмента. Если читаемая интерпретатором строчка кода не содержит ошибок и может быть выполнена, то интерпретатор выполняет её вне зависимости от наличия ошибок в других строках программы. Если строка содержит ошибку и не может быть выполнена, то интерпретатор пропускает её, переходя к следующей строке программы, или прерывает выполнение программы.

Трансляция любой программы, записанной на языке программирования высокого уровня, идёт в несколько этапов:
1) загрузка в оперативную память компьютера транслятора и исходного текста программы, записанного на языке программирования высокого уровня;
2) лексический анализ - процесс преобразования группы литер исходного языка в символы, понятные транслятору; на этом этапе лексический анализатор (сканер) генерирует для каждой смысловой группы литер символ, называемый лексемой, который передается дальнейшим этапам транслятора;
3) синтаксический анализ - размещение символов преобразованного текста в иерархическом порядке, отражающем логику программы;
4) семантический анализ (или контроль типов данных) - проверка согласованности символов друг с другом, что позволяет выявить ошибки в программе; на этом этапе происходит проверка типов в выражениях;
5) генерация кода - создание команд на двоичном машинном языке, которые: а) для интерпретатора - посылаются микропроцессору, где они немедленно выполняются, б) для компилятора: сохраняются в памяти компьютера (обычно, в виде объектного модуля);
6) этот этап характерен только для транслятора-компилятора: оптимизация кода - улучшение результатов трансляции, повышение эффективности полученной программы (создание загрузочного модуля программы).
На каждом этапе информация, полученная от предыдущего этапа, обрабатывается и передается дальше. Если какое-либо правило языка оказывается нарушенным, запускается подпрограмма обработки ошибок, которая сообщает программисту о найденной ошибке.

Среды программирования

Интегрированная среда программирования - это набор ряда системных программ, обеспечивающих все действия, необходимые для прохождения программы на данном языке программирования через ЭВМ.
Среда программирования обычно состоит из следующих компонентов:

 

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

· компилятор входного языка (для создания объектного кода);

· редактор связей (линковщик - для создания исполняемого модуля);

· встроенный символьный отладчик (debugger - для отладки программы, т.е. для поиска и исправления ошибок программы в исполняемом модуле);

· средства оптимизации кода программы (компоновщик - для уменьшения размеров исполняемого файла программы и оптимизации её работы);

· набор библиотек (функций, процедур, объектов) и модулей (с исходными текстами);

· справочные системы различного вида (Help);

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

9.1.5. Этапы создания компьютерной программы
на языке программирования высокого уровня

После того, как программистом построена математическая модель решения задачи, составлен алгоритм работы программы, выбрана платформа (операционная система) работы будущей программы, начинается компьютерный этап реализации задачи. Программист выбирает язык программирования и среду программирования на этом языке.
Создание новой компьютерной программы на языке программирования высокого проходит в несколько этапов:
1) набор текста кода программы на выбранном языке программирования в текстовом редакторе среды программирования. При этом создаётся текстовый файл с кодом программы, называемый исходный код. Так, например, при создании программ на языке программирования Pascal в среде программирования Turbo Pascal создаётся текстовый файл с расширением *.PAS;
2) обработка исходного кода программы транслятором среды программирования для получения объектного кода. Так как большинство сред программирования имеют встроенный транслятор-компилятор, то этот этап часто называется "компиляцией" программы. При компиляции создаётся на диске компьютера или в его оперативной памяти объектный файл с откомпилированным кодом программы, называемый объектный код. Такой файл может иметь расширение *.OBJ;
3) обработка объектного кода специальной системной программой, называемой редактор связей (или "линковщик"). Часто при этом осуществляется и оптимизация кода программы компоновщиком. Поэтому этот заключительный этап часто называют компоновкой программы. После компоновки из объектного модуля создаётся исполняемый модуль - готовый файл программы, имеющий расширение *.EXE (или реже - *.COM). Иногда исполняемый модуль создаётся только в памяти компьютера и не записывается в виде файла на диск. Тогда запуск новой программы возможен лишь в среде программирования.

Основные понятия языка программирования Pascal

Алфавит языка Pascal включает латинские буквы, цифры, специальные символы (вводимые с клавиатуры) и зарезервированные слова.
Идентификаторы (или имена) в Pascal'e используются для констант, переменных, типов, объектов, процедур, функций, модулей, программ и др. Они имеют длину не более, чем 63 символа. Имена файлов с программами в среде Turbo Pascal имею длину не более 8 символов и строятся по правилам имен файлов и каталогов в MS DOS. Идентификаторы в Pascal'e всегда начинаются с буквы или "_" (символ "низкое подчеркивание"), не могут содержать спецсимволов. Прописные и строчные буквы в именах равнозначны, например: имена a и A - представляют собой один и тот же идентификатор. Примерами имен в Pascal'e могут быть: ALPHA, _Slot, k9, Masha_Petya, Dat_01_11_02.
Константами называются параметры программы, значения которых не меняются в процессе её выполнения. Они могут быть различных типов и задаваться в явном виде: 45, -4.31, ’A’, FALSE, ’TeXt’ или с помощью имени: N=45, Pi=3.14, Stroka=’TeXt’. Видно, что значения символьных и строковых констант заключаются в 'апострофы'.
Переменными называются параметры программы, значения которых могут изменяться в процессе ее выполнения. Все используемые в программе переменные должны быть описаны (названы) с указанием их типа.
Операнд - константа, переменная, функция, выражение и другой объект языка программирования, над которым производятся операции.
Под типом данных понимают множество значений, которые может принимать та или иная переменная, и те операции, которые можно к ним применять. Данные – это общее понятие для всего того, чем оперирует ЭВМ. В языке Pascal имеется большое количество типов данных (простые, структурированные, процедурные, указатели, объекты и т.д.), но основными являются простые стандартные типы данных.

9.3.2. Стандартные простые типы данных

Целые типы

Название типа Диапазон значений Пример описания
Byte 0...255 var b1, F: byte; Байтовый тип
Integer -32768...32767 var c, d: integer; Целый
Shortint -128...127 var e1, o1: shortint; Короткий целый
Longint -2147483648...+2147483648 var e2, f0: longint; Длинный целый
Word 0...65535 var g, w: word; Тип "слово"

 

Вещественные типы

Название типа Диапазон значений Пример описания
Real 11...12 E-39...+38 var a, x: real; Действительный
Double 15...16 E-324...+308 var k, t: double; Двойной точности
Extended 19..20 E-4951..+4932 var m: extended; Расширенный
Single 7...8 E-45...+38 var n, s: single; Одинарный
Comp 19...20 E-64...+64 var j3: comp; Уплотненный

 

Логический тип

Название типа Диапазон значений Пример описания
Boolean True и False ("Истина" и "Ложь") var was, r: boolean; Булев, логический

 

Символьный тип

Название типа Диапазон значений Пример описания
Char Любой символ кода ASCII, взятый в апострофы 'Z' var bukva: char; Символьный

 

Строковый тип

Название типа Диапазон значений Пример описания
String Любой набор символов кода ASCII, обрамленный апострофами 'Text' var txt: string; Строковый

 

Пример кода программы на языке Pascal, в которой используются переменные различных типов, описанные в таблицах выше:
BEGIN
b1:=25; c:=-9 mod 5; f:=-1+4; w:=65*2;
e2:=2 147 483 647; a:=1.012345678901E-39+5;
k:=-0.16*324; m:=9.9/31; s:=-8.3E-45; j3:=2.3-2;
r:=(2>5); was:= not (r and True); bukva:=’A’;
txt:=’sTRoka 123!@#$%^&*(<”/.)ЭюЯ’;
END.

Логические функции

Функция Описание Тип аргумента Тип функции
ODD(X) возвращает True, если X нечетное и False, если X - четное или 0 ODD(5)=True; ODD(8)=False цел. логич.
EOLN(X) возвращает True, если достигнут конец строки, иначе - False файл. логич.
EOF(X) возвращает True, если достигнут конец файла, иначе - False файл. логич.

Операции в выражениях

X div Y - целочисленное деление (здесь X,Y – целые). Например 7 div 2 будет 3,
X mod Y – остаток от целочисленного деления (здесь X,Y – целые). Например 7 mod 2 будет 1.
and – логическое "и". Например, True and True=True; True and False=False;

AND True False
True True False
False False False

not – логическое "нет". Например, not True = False; not False = True;
xor и or – альтернативное и неальтернативное "или". XOR ещё называют "исключающее ИЛИ".

OR True False
True True True
False True False
 
XOR True False
True False True
False True False

Знаки сравнения

При выполнении логических операций, при постановке и проверке условий в программах на языке Pascal могут использоваться следующие знаки сравнения (отношения):

Операция сравнения Её вид в языке Pascal Пример использования
Больше > 3 > 2;
Меньше < 3 < 5;
Равно = a = 5;
Больше или равно >= 5 >= 4
Меньше или равно <= 3 <= 5
Не равно <> 'A' <> 'B'

Оператор сравнения - оператор, реализующий операции: меньше, больше, равно и др.

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

С помощью Оператора присваивания переменная получает своё значение. Формат оператора присваивания следующий:
<имя переменной>:= <значение выражения или константа>.
Обозначается оператор присваивания := ("двоеточие равно"). Например: a:=a+1;
b:=1;
Flag:=-7>14;
Buk:='G';

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

Пустой оператор

Пустой оператор не выполняет никакого действия. Обычно пустым оператором считается точка с запятой или двоеточие, которые стоят в "неположенном" месте. Например, фрагмент программы:
...
BEGIN;
IF a>b THEN;
...

Известно, что точка с запятой после BEGIN не ставится. В приведённом фрагменте она стоит, что не является ошибкой программы. В данном случае это пустой оператор. В операторе постановки и проверки условия IF... THEN... после служебного слова THEN обычно следует один или несколько операторов. Но в данном примере стоит точка с запятой, которая символизирует пустой оператор.

Массивы в языке Pascal

Часто в циклах приходится обрабатывать элементы массивов.
Массив - последовательность однотипных элементов, число которых фиксировано и которым присвоено одно имя. Положение элемента в массиве однозначно определяется его индексами. Выделяют одномерные массивы (вектора) и двумерные массивы (матрицы). Размерность массива может быть три и более.
В языке Pascal массив является аналогом типа данных. Для задания массива используется служебное слово Array, а в разделе описания переменных указывается имя массива и его тип. Например, фрагмент программы:
var M: Array [1..9] of Real;
S: array [0..3, 1..9] of String;
i, j: Integer;
Begin
For j:=1 to 9 do
Begin
For i:=0 to 3 do ReadLn(S[i,j]);
Readln(M[j]);
end;
...
В данном фрагменте программы описывается одномерный массив действительных чисел M, включающий 9 элементов с номерами от 1 до 9. А также - двумерный строковый массив S, элементы которого имеют два индекса, первый из которых меняется от 0 до 3, а второй - от 1 до 9. В программе используется вложенный цикл для задания элементов двумерного массива S.

Графика среды Turbo Pascal

Создание двумерных графических объектов в среде Turbo Pascal возможно при вызове специального графического режима. При этом текстовая информация, которая до подключения графики находилась на "экране пользователя", удаляется графической канвой. Максимальные размеры канвы (холста) для рисования в среде Turbo Pascal составляют 640×480 точек экрана (по горизонтальной оси - 640 точек, по вертикальной оси - 480 точек). Причём, начало координат располагается в верхнем левом углу экрана, а вертикальная ось направлена вниз (см. рисунок).

Все графические изображения строятся в этом прямоугольнике, а координаты точек на холсте - натуральные числа: 0 <= x <= 640, 0 <= y <= 480. По умолчанию цвет графического экрана чёрный, но его можно менять. Также следует заметить, что основным режимом работы среды Turbo Pascal является текстовый режим. Поэтому для поддержания графического режима и возможности просмотра графических объектов в программе необходимо принять соответствующие меры. Например, в конце программы перед закрытием графического режима вставить процедуру READLN; без аргумента, которая будет ожидать от пользователя нажатие клавиши [Enter] для смены режима.
Для работы с графикой в среде Turbo Pascal необходимо наличие графической библиотеки (файла EGAVGA.BGI) и графического модуля (файл GRAPH.TPU). Правила обращения к этим файлам и примеры использования графических команд рассмотрены ниже в тексте конкретной программы.

program grafik;
uses graph;- подключаем графический модуль (файл graph.tpu)
var gd, gm, a, b, n, с: integer; – объявляем целые переменные
x1, y1, x2, y2: integer; – объявляем целые переменные
x,y,h: real; – объявляем действительные переменные
begin
gd:=detect; - определяем вид графического адаптера (SVGA 640x480, 16 цветов)
InitGraph (gd,gm, ' C:\TP7\BIN '); - инициализация графики (файл egavga.bgi)
SetGraphMode (n); - установить режим работы графического адаптера.
{n=0, 640x400 - изображение искажено
n=1, 640x350 - изображение сжато
n=2, 640x480 – нормальное изображение }
c:=15;
SetBkColor (c); - устанавливаем цвет фона экрана
c:=1;
SetColor (c); - устанавливаем цвет линий и точек при рисовании

с цвет   с цвет
  темно-синий     синий яркий
  тёмно-зеленый     светло-зелёный
  серо-голубой     небесно-голубой
  коричневый     красный (алый)
  фиолетовый     сиреневый
  оранжевый     желтый
  светло-серый     белый
  темно-серый     цвет фона / черный

PutPixel (x1,y1,c); – рисуем точку с координатами x1,y1 цветом с;
SetLineStyle
(a, 0, b); – устанавливаем стиль а и толщину b линии.
{Здесь a может быть 0, 1, 2, 3, b может быть 1 или 3}

a=0 a=1 a=2 a=3

Line (x1, y1, x2, y2); – рисуем линию от точки x1, y1 до точки x2, y2
MoveTo (x1, y1); - устанавливаем курсор в точку x1, y1 на графическом экране
LineTo (x1, y1); - рисуем линию от текущего положения курсора до точки x1, y1
Rectangle (x1,y2,x2,y2); - рисуем прямоугольник с диагональю x1,y1-x2,y2
Circle (x1,y1,a); - рисуем окружность с центром в точке x1,y1 и радиусом a
Ellipse (x1, y1, a1, a2, Rx, Ry); - рисуем дугу эллипса с центром в точке x1,y1, от центрального угла a1 до угла a2 в градусах (от 0 до 2p), с полуосями Rx, Ry
OutText (‘string’); – в текущем положении курсора выводим текст “string”
OutTextXY (x1,y1,‘text’); - в точке x1,y1 графического экрана выводим текст “text”
SetFillStyle (a, c); - устанавливаем стиль a (от 1 до 12) и цвет с (от 0 до 15) заливки объектов

а=1 a=7
a=2 a=8
a=3 a=9
a=4 a=10
a=5 a=11
a=6 a=12


Box (x1,y2,x2,y2); - рисуем залитый прямоугольник с диагональю x1,y1-x2,y2
FillEllipse (x1, y1, Rx, Ry);- рисуем залитый эллипс с центром в точке x1,y1 и полуосями Rx, Ry
FloodFill (x1, y1, c); - заливаем замкнутую фигуру, начиная с точки (x1, y1), цвет границ которой c
ClearDevice; - очистим графический экран (залить все цветом фона)
ReadLn; - ждем нажатия клавиши Enter (задержка картинки на экране)
CloseGraph; - отключаем графику (перейти в текстовый режим)
end. - конец программы

Пример готовой программы с комментариями

Program grafika_Tp;
uses graph; {подключаем графический модуль. Как правило, им заведут файл graph.tpu в Turbo Pascal'e и Borland Pascal'e}
var gd,gm: integer; {Две эти графические переменные целого типа понадобятся в дальнейшем для инициализации графики}
x1,y1,x2,y2: integer; {целые координаты на графическом экране}
x,y: real; {действительные переменные в какой либо программе, которые, например, затем нужно проиллюстрировать графически}
S: string;
BEGIN {начало программы}
gd:=detect; {автоопределение типа графического адаптера, т.е. EGA (старый тип) или VGA (он же SVGA или Vesa - новый тип)}
INITGRAPH(gd,gm,'BGI');
setgraphmode(2);
Setbkcolor(15); {Процедура устанавливает цвет фона. Её аргумент - номер цвета. В данном случае 15=белый.}
Setcolor(8);
Line(10,20,600,100);
MoveTo(200,300);
LineTo(300,200);
SetLineStyle(2,0,3);
LineTo(100,100);
x1:=320; y1:=240; {Координаты центра экрана}
putpixel(x1,y1,12); {Процедура рисует точку с координатами x1, y1 цвета 12=красный}
putpixel(x1+2,y1,1); {А рядом рисуем точку синего цвета 1=синий. Эти точки очень маленькие, но их можно рассмотреть}
SetLineStyle(0,0,1);Setcolor(2);
Ellipse(x1,y1,10,90,100,200);
Ellipse(x1,y1,0,360,150,150);
x1:=150;y1:=10;x2:=310;y2:=220;
Rectangle(x1, y1, x2, y2);
Str(x1/9,S);
S:='x1/9='+S;
OutTextXY(100,400,S);
SetLineStyle(0,0,3);Setcolor(12);
x:=-3*Pi; {Начало отрезка}
MoveTo(Round(x*30+300),Round(480-sin(x)*30-100));
while x<=3*Pi do begin {Пока не достигнут конец отрезка - выполняй}
y:=sin(x);
x1:=Round(x*30+300); y1:=Round(480-y*30-100);
LineTo(x1,y1);
x:=x+0.1;
end;
readln;
closegraph;
end.

Результат выполнения программы:

 

Понятие языка программирования

Язык программирования - это искусственный, формализованный язык для описания алгоритма решения задачи на компьютере. Этот язык, в отличие от естественного, не допускает никаких произвольных толкований.
Компьютерная программа - это точная и подробная инструкция с порядком действий на каком-либо языке программирования, переведенная в машинные коды (это упорядоченная последовательность команд (инструкций) компьютера для решения задачи). Компьютер может выполнять только инструкции программы.
Существует три разновидности языков программирования:
1) машинные языки - это языки, элементами которых являются команды компьютера. В этих языках управление и структура данных непосредственно отображают архитектуру конкретного компьютера.
2) языки программирования низкого уровня. С помощью языка программирования низкого уровня программа взаимодействует непосредственно с аппаратурой ЭВМ, поэтому наиболее эффективно ее использует. Но подготовка таких программ сопряжена с большими трудностями. Примером такого языка является ассемблер (assembler).
3) языки программирования высокого уровня - это языки, которые отображают естественные для человека понятия, не связанные с конкретной структурой какой-нибудь системы. Но такие языки удалены от аппаратных средств и менее эффективны. Таких языков - большинство.

Трансляторы

Программы, подготовленные на языках программирования высокого уровня, нуждаются в трансляции (в переводе). Транслятор - это программа, преобразующая компьютерную программу на одном языке в программу на другом языке. Обычно трансляторы переводят программу с языка программирования высокого уровня (исходный код) на язык машинных кодов (объектный код) и, далее, для построения загрузочного модуля используется редактор связей.
Трансляторы существуют двух видов - интерпретаторы, которые выполняют пооператорную обработку и выполнение программы (часто в Basic'е) и компиляторы - транслируют всю программу целиком и готовят модуль для выполнения (используются в большинстве языков программирования).
Транслятор-интерпретатор воспринимает исходную программу на исходном языке и выполняет её. Интерпретатор преобразует небольшой фрагмент исходной программы в машинные команды и, лишь дождавшись, когда компьютер их выполнит, переходит к обработке следующего фрагмента. Если читаемая интерпретатором строчка кода не содержит ошибок и может быть выполнена, то интерпретатор выполняет её вне зависимости от наличия ошибок в других строках программы. Если строка содержит ошибку и не может быть выполнена, то интерпретатор пропускает её, переходя к следующей строке программы, или прерывает выполнение программы.

Трансляция любой программы, записанной на языке программирования высокого уровня, идёт в несколько этапов:
1) загрузка в оперативную память компьютера транслятора и исходного текста программы, записанного на языке программирования высокого уровня;
2) лексический анализ - процесс преобразования группы литер исходного языка в символы, понятные транслятору; на этом этапе лексический анализатор (сканер) генерирует для каждой смысловой группы литер символ, называемый лексемой, который передается дальнейшим этапам транслятора;
3) синтаксический анализ - размещение символов преобразованного текста в иерархическом порядке, отражающем логику программы;
4) семантический анализ (или контроль типов данных) - проверка согласованности символов друг с другом, что позволяет выявить ошибки в программе; на этом этапе происходит проверка типов в выражениях;
5) генерация кода - создание команд на двоичном машинном языке, которые: а) для интерпретатора - посылаются микропроцессору, где они немедленно выполняются, б) для компилятора: сохраняются в памяти компьютера (обычно, в виде объектного модуля);
6) этот этап характерен только для транслятора-компилятора: оптимизация кода - улучшение результатов трансляции, повышение эффективности полученной программы (создание загрузочного модуля программы).
На каждом этапе информация, полученная от предыдущего этапа, обрабатывается и передается дальше. Если какое-либо правило языка оказывается нарушенным, запускается подпрограмма обработки ошибок, которая сообщает программисту о найденной ошибке.


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

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

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.05 с.