Примечание. При вводе кода программы в редакторе Visual Basic нумерация строк отсутствует.




6.5. Сохранение проекта

1. Из меню File выбрать команду Save Project As или щелкнуть по соответствующей пиктограмме.

В поле "Имя файла" диалогового окна Save File As ввести имя формы и щелкнуть кнопкой "Сохранить".

2. После сохранения всех форм проекта отображается диалоговое окно Save Project As, в котором задается имя проекта.

6.6. Выполнение проекта

Чтобы выполнить проект, необходимо выбрать один из трех способов:

– из меню Run вызвать команду Start;

– нажать клавишу F5;

– щелкнуть по пиктограмме (8) на панели инструментов.

       
   
 
 

В рассматриваемом примере на экране отобразится форма, и в первом текстовом поле автоматически установится текстовый курсор. Пользователь должен ввести соответствующее значение переменной, переместить курсор во второе поле ввода и ввести следующее значение. Щелкнуть по кнопке "Счет". В окне результата отобразится результат вычисления (рис. 12).

 

При необходимости повторить выполнение программы из меню Run запускается команда Restart. Команда Break прерывает выполнение программы, а команда End ( g ) завершает его и возвращает управление редактору кода.

6.7. Отладка программы

Осуществляется с помощью команд меню Debug. Для пошагового выполнения программы используют команды Step Into (F8) и Step Over (Shift + F8). Step Into исполняет вызываемую процедуру по шагам, а Step Over исполняет процедуру так, как будто она выполняется одним оператором.

Команда Toggle BreakPoint отождествляет текущий оператор как контрольную точку, т.е. точку на которой останавливается выполнение программы до команды Continue. По умолчанию Visial Basic выделяет контрольные точки темно-красным цветом.

Команда Clear All BreakPoint выключает все установленные контрольные точки.

Команда Set Next Statement позволяет еще раз выполнить команду (cтроку, оператор) после внесения в нее изменений.

Команда Show Next Statement позволяет найти следующую строку, которую собирается выполнить Visual Basic.

 

7. основы языка программирования Visual Basic

7.1. Основные понятия

 

Ключевое слово – это слово или символ, распознаваемый как элемент системы программирования Visual Basic, например:

if, then, else, for, next, dim т.д.

Литерал – это простое выражение, определяющее данные неко-торого типа, например:

150 – число

"ппппп" –строковая константа

#07/16/2000# – дата

Константа – это именованная область памяти, сохраняющая постоянное значение в процессе выполнения программы.

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

7.2. Типы данных

В Visual Basic различают следующие типы данных.

Integer (2 байта) – целое число из диапазона от -32768 до 32767

Long (4 байта) – целое число из диапазона от -2147483648 до 2147483647

Single (4 байта) – вещественное число из диапазона: для отрицательных – от -3,4е38 до -1,4е-45, для положительных – от 1,4е-45 до 3,4е38

Double (8 байтов) – вещественное число с удвоенной длиной из диапазона: для отрицательных – от -1,797е308 до -4,94е-324, для положи-тельных – от 4,94е-324 до 1,797е308

Currency (8 байтов) – денежные величины с диапазоном от минус 9223372036855477,5808 до 922337203685477,5807

String (10 байтов + длина переменной) – текстовые или строковые значения. Строки переменной длины могут содержать до миллиарда символов, а строки фиксированной длины – до 65400 символов

Byte (1 байт) – целое число от 0 до 255

Booleаn (2 байта) – логическое значение True (1) или False (0)

Date (8 байтов) – даты с 1 января 100 года по 31 декабря 9999 года

Variant – данные любого типа.

Данные типа Long, Byte, Integer не могут иметь дробных значений, а переменные типа Byte – отрицательных. Попытка присвоить переменной значение, которое не входит в диапазон ее типа, вызывает ошибку при выполнении программы.

Тип данных Currency представляется как масштабируемое целое с фиксированной десятичной точкой с 15 разрядами в целой части и 4 разрядами в дробной. Поскольку при денежных расчетах не требуется большой точности, можно использовать этот тип данных, а не десятичные числа, при этом увеличивается скорость расчетов.

Данные типа Boolean хранят логические значения. При этом значение 0 интерпретируется как False, а любое другое – как True.

Тип данных Variant фактически применяется по умолчанию. При использовании этого типа данные могут принимать любое значение (целое, байтовое, строковое или логическое). Универсальный тип может показаться очень удобным, но практически его используют только в том случае, когда нет другого выбора. Он работает медленно, так как Visual Basic вынужден тратить время на интерпретацию данных. К тому же под данные этого типа отводится память, достаточная для хранения строки.

 

7.3. Объявление данных

 

Все данные, используемые в программе, рекомендуется объявить.

 

7.3.1. Объявление констант

 

В Visual Basic константы объявляются следующим образом:

 

Const имя константы [As тип]=значение

Объявленная константа может быть использована в любом выра-жении, где допускается значение того же типа. Попытка изменения зна-чения константы вызывает ошибку. Пример объявления константы:

Const Pi Аs Double = 3.14159

 

Примечания.

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

2. При присваивании константе литерала типа Date необходимо использовать символ #, например:

#1 Jul 1994# или #7/1/94#

 

7.3.2. Объявление переменных

 

Переменные объявляются следующим образом:

Dim имя переменной As <тип>

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

Dim X As Byte (переменная X типа Byte)

Dim X, Y As Sing le(переменная Х типа Variant, а Y – Single)

Dim X As Integer, Y As Double (переменная Х типа Integer, а Y – Double)

Dim stroka As String (переменная stroka типа String)

 

Примечания.

1. При присваивании переменным имени следует придерживаться следующих правил:

– использовать только буквы латинского алфавита, регистр букв не имеет значения;

– длина имени не должна превышать 256 символов;

– можно использовать любую комбинацию букв, цифр, символов, кроме точек, пробелов и символов %, &,!, #, @, $;

– имена должны быть уникальны в той области, в которой они определены.

2. Если необходимо сократить затраты памяти или ограничить строку какой-либо длиной, то используется строка фиксированной длины. Например, строка длиной 10 символов должна быть объявлена следующим образом:

Dim stroka As String*10

 

Строго говоря, Visual Basic не требует объявлять большинство переменных перед их применением. Переменные называются неявно объявленные, если они сразу используются в программе, а не объявляются сначала с помощью инструкции Dim. При этом неявно объявленным переменным присваивается тип Variant, значение 0 в контексте математических операций и значение "пустая строка" в контексте строковых операций.

Visual Basic позволяет установить требование на явное объявление переменных в модуле. Для этого в разделе описания модуля надо задать инструкцию Option Explicit. Чтобы Visual Basic автоматически добавлял инструкцию Option Explicit в каждый вновь создаваемый проект, требуется:

– на стандартной панели инструментов Visual Basic открыть меню Tools, выбрать команду Options ираскрыть вкладку Editor;

– установить флажок Require Variable Declaration;

– нажать кнопку ОК.

Начало программы будет иметь вид:

Option Explicit

Текст программы

В этом случае, если переменная не будет объявлена, Visual Basic генерирует ошибку при компиляции, идентифицируя неправильную пере-менную: Variable not defined.

 

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

 

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

имя переменной=выражение

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

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

 

Операции Знак Использование Приоритет
Возведение в степень ^ a ^ b  
Отрицание –b  
Умножение * a * b  
Деление / a / b  
Целочисленное деление \ a \ b  
Остаток от деления на целое Mod a Mod b  
Сложение + a + b  
Вычитание a – b  

7.5. Встроенные функции Visual Basic

 

В Visual Basic имеется большой набор встроенных функций, использование которых существенно облегчает процесс программирования. Обращение к встроенной функции записывается следующим образом:

Имя функции(аргумент)

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

В библиотеке Visual Basic хранятся следующие встроенные функции.

 

7.5.1. Арифметические функции

Результат Обозначение Функция
Абсолютное значение | x | Abs(x)
Целая часть числа (без округления) [x] Int (x)
Квадратный корень Sqr (x)
Натуральный логарифм ln x Log (x)
Экспонента е х Exp (x)
Знак числа (-1 – для отрицательных, 0 – для 0, 1 – для положительных)   sign x   Sgn (x)

Примечание.Логарифм по заданному основанию можно получить путем деления натурального логарифма числа на натуральный логарифм заданного основания.

 

Lg10 х = Log(х)/ Log(10)

7.5.2. Тригонометрические функции

 

Результат Обозначение Функция
Синус угла sin x Sin (x)
Косинус угла cos x Cos (x)
Тангенс угла tg x Tan (x)
Арктангенс угла arctg x Atn (x)

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

Значение угла в радианах=Значение угла в градусах*pi/180

Значение угла в градусах = Значение угла в радианах *180/pi

В стандартном Visual Basic для определения константы p в секции General необходимо поместить код:

Constant Pi As Double = 3.14159

Рассмотрим примеры записи математических выражений на языке Visual Basic;

1.

Gamma = Log(a/b)/Log(10)*Sqr(Sin(x)+Cos(x^2)) /Abs(a^b)*1E-5

2.

B = Exp(a+b)*Atn(a)^2^(1/3)*(1+gam/2)/(3*Tan(l/2))*1.5E6

3. R = 0,00000015×j

R =15e–8*fi

7.5.3. Функции работы со строками

 

Конкатенация (соединение)предназначена для соединения двух строк путем подстановки второй строки к концу первой. В Visual Basic можно использовать две операции для конкатенации строк: + и &. Поскольку + является также и арифметической операцией, то предпочтение отдается операции &.

Примечание. Перед знаком & всегда ставится пробел, иначевыдается сообщение об ошибке: Expected: end of statement.

 

Функции Left, Right, Mid возвращают заданное число символов строковой переменной соответственно с левого, правого краев и из середины строки.

Left (строка, длина)

Right (строка, длина)

Mid (строка, начало [,длина])

Например, пусть Phone = "3941540 ", тогда

Code = Left(Phone,3) [Результат Code = 394]

Code = Mid(Phone,4,3) [Результат Code = 154]

 

Функция Len (строка) возвращает число символов в строковой пере-менной.

Number = Len(Phone) [Результат Number = 7]

Функция InStr (строка, подстрока)определяет позицию вхождения подстроки в строку. Возвращает нулевое значение, если заданный символ или подстрока не найдены, иначе – положение символа или позицию начала подстроки.

Number = InStr(Phone,"41") [Результат Number = 3]

Функция Val (значение) – преобразует строку в число.

Функция Str (значение) – преобразует число в строку.

Функция Rtrim (строка) – возвращает копию строки без пробелов в конце.

Функция Ltrim (строка) – возвращает копию строки без пробелов в начале.

Функция Trim (строка) – возвращает копию строки без пробелов в начале и конце.

 

Например:

Phone = " Функция "

Code = Trim(Phone) [Результат Code ="Функция"]

 

8. Организация ввода данных

Ввод данных можно осуществить с помощью функции InputBox() или текстового поля.

 

8.1. Функция InputBox()

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

Сокращенный синтаксис функции выглядит так:

a= InputBox(сообщение [,заголовок] [,умолчание] [,x pos, y pos]),

где а – имя переменной, которой требуется присвоить введенное значение;

сообщение – это текст, отображаемый в диалоговом окне (текст должен быть заключен в двойные кавычки и не превышать 1024 символов);

заголовок – это текст, который размещается в заголовке окна;

умолчание – значение величины, которая будет по умолчанию находиться в текстовом поле диалогового окна;

x pos, y pos – координаты верхнего левого угла окна; если их не указывать, окно располагается в центре экрана.

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

Рассмотрим фрагмент кода ввода значения площади S.

Dim S As Double

S = InputBox("Введите значение площади")


 

В текстовое поле введено значение 67. Когда пользователь нажимает кнопку ОК, содержимое поля присваивается переменной S. Если пользователь нажал кнопку CANCEL, возвращается строка нулевой длины.

Если видоизменить вызов функции следующим образом:

S = InputBox("Введите значение площади", "Задание № 1"),


то получим окно вида:

8.2. Ввод данных с помощью текстового поля

Для организации ввода значения S с помощью текстового поля необходимо выполнить следующие действия:

– на форме разместить текстовое поле для ввода значения площади (элемент управления "Текстовое поле", по умолчанию свойство Name этого элемента имеет значение Text1);

– в программе записать оператор

s=Val(Text1.Text) или S=Text1

9. Организация вывода данных

 

Вывод данных можно выполнить различными способами, например:

– c помощью оператора MsgBox;

– с помощью функции MsgBox();

– с помощью оператора Print;

– с помощью текстового поля.

 

9.1. Оператор MsgBox

 

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

Синтаксис оператора вывода сообщений в стандартное диалоговое окно следующий:

 

MsgBox сообщение,[атрибут],[заголовок],

где сообщение – это текст, отображаемый в диалоговом окне (текст должен быть заключен в двойные кавычки и не превышать 1024 симво-лов);

заголовок – это текст, который размещается в заголовке окна;

атрибут – значения этого параметра определяют, какие кнопки должны отобразиться в окне.

 

  Константа Значение параметра атрибут   Описание
VbOKOnly   Отображается только кнопка ОК
VbOKCancel   Отображается кнопка ОК и Cancel
VbYesNoCancel   Отображается кнопка Yes, No, Cancel
VbYesNo   Отображается кнопка Yes, No
VbQuestion   Отображается вопросительный знак
VbDefaultButton1   По умолчанию активна первая кнопка
VbDefaultButton2   По умолчанию активна вторая кнопка

 

Для достижения желаемого результата значения констант можно складывать. Например, если в окне сообщения должны присутствовать кнопки Да и Нет, и при этом кнопка Нет назначена по умолчанию, надо воспользоваться любым из приведенных ниже параметров:

def=VbYesNo+VbDefaultButton2

def=4+ 256

Затем значение переменной def используется при вызове функции или в операторе Msgbox.

В своей простейшей форме оператор MsgBox выводит стандартное окно сообщений, которое закрывается, когда пользователь щелкает по кнопке ОК.

MsgBox "s= " & s MsgBox "s= " & s,, "Ответ"

       
 
   
 


Примечание. Вместо необязательных параметров (указанных в квадратных скобках) ставится запятая при наличии следующих за ними параметров.

 

9.2. Функция MsgBox()

Функция MsgBox() выводит данные в стандартное диалоговое окно,

которое может иметь текст сообщения, заголовок и набор кнопок.

Синтаксис функции вывода сообщений в стандартное диалоговое окно:

имя переменной=MsgBox(сообщение,атрибут,заголовок)

Отличие от оператора MsgBox состоит в том, что функция возвра-щает значение, позволяющее определить, какую кнопку нажал пользо-ватель.

 

Константа Значение параметра атрибут Кнопка
VbOk   Ok
VbCancel   Cancel
VbYes   Yes
VbNo   No

 

Например, многие приложения запрашивают подтверждение перед началом печати. Код рассмотренного в первой части методических указаний примера может выглядеть так:

 
 


Option Explicit

Private Sub Command1_Click()

Dim def As Double

Dim b As Single, s As Single, h As Single

def=4+256

b=InputBox("Введите значение b =")

s=InputBox("Введите значение s =","Cтруктура СЛЕДОВАНИЕ")

h=(–b+Sqr(b*b+8*s))/2

If MsgBox("Ответ печатать?",def,"Задание № 1")=vbYes Then

MsgBox "Значение площади равно " & s

End If

End Sub

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

Format(параметр,"прототип")

 

При построении прототипа можно использовать символы:

– 0 – резервирует позицию цифрового разряда, отображает цифру, если у числа, представленного параметром, есть цифра в этой позиции;

– # – аналогичен первому параметру, но не отображаются незначащие нули;

–. (точка) – разделитель целой и дробной частей числа.

Например, использование функции Format(1.2^2, "##.###") дает результат 1.44, а использование функции Format(1.2^2, "00.000") дает результат 01.440.

9.3. Метод PRINT

Метод Print позволяет результаты вычислений выводить на форму.

Если в методе Print выводимые значения разделяются точкой сзапятой, то они печатаются один за другим через пробел, а если запятой, то каждое новое значение печатается в начале следующей зоны печати (в Visual Basic зоны начинаются через каждые 14 символов). Изменить ширину зоны позволяет функция Tab (число).

Функция Spc (число)позволяет вывести на форму заданное число пробелов.

Вывод данных на форму начинается с левого верхнего угла формы. Для изменения позиции точки вывода используются свойства CurrentX и CurrentY, аналогичные свойствам Top и Left, при помощи которых задается расстояние от верхнего левого края формы. Свойство формы ScaleMode, о котором упоминалось в первой части методических указаний, позволяет выбрать нужные единицы измерения (см, мм, пиксель). Примеры использования метода Print.

 

CurrentX = 1000 ’Отступ на 1000 пикселей от верхнего левого края формы вправо

CurrentY = 1000 ’Отступ на 1000 пикселей от верхнего левого края формы вниз

Print x, f ’Вывод в строку с табуляцией

Print x; f ’Вывод в строку через количество пикселей,

заданных по умолчанию

Print x ’Вывод в столбец

Print Tab(5); format(x,"0.00"); Tab(15); f

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

 

9.4. Вывод данных с помощью текстового поля

 

Например, для организации вывода значения переменной h с помощью текстового поля необходимо выполнить следующие действия:

– на форме разместить текстовое поле для вывода в него значения h (элемент управления "Текстовое поле"; пусть свойство Name этого элемента будет Text3);

– в программе записать оператор: Text3.Тext=Str(h) или Text3=h,

где Str () – функция, преобразующая числовое значение в строковое.

Тогда при выполнении программы в текстовое поле, имеющее имя Text3, выведется значение переменной h.

 

10. Структурное программирование

 

Любой сколь угодно сложный алгоритм можно построить на основании трех структур: Следование, развилка, Цикл.

 

10.1. Структура Следование

 

Это основная структура, в которой выполняемые операции следуют одна за другой, образуя простую последовательность. Пример програм-мной реализации рассмотрен в п.6.

 

10.2. Структура Развилка

 

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

 

10.2.1. Классическая структура Развилка

 

Алгоритм этой структуры выглядит так:

 
 

Структура Развилка реализуется с помощью условного оператора, имеющего вид:

If условие Then

[оператор]

[Else

[оператор]]

End If

 

Условие – это логическое выражение, использующее операции сравнения, с помощью которых устанавливаются отношения между величинами, например:

C < A + D, A > B, D <> К

Операции сравнения

 

Название Символ Использование Приоритет
Меньше чем < a<b  
Меньше или равно <= a<=b  
Больше чем > a>b  
Больше или равно >= a>=b  
Равно = a=b  
Не равно <> a<>b  

С помощью логических операторов можно составить более сложное логическое выражение.

Логические операторы

 

Название Обозначение Использование Приоритет
НЕ Not Not a  
И And a And b  
ИЛИ Or a Or b  
Исключающее ИЛИ Xor a Xor b  
Эквивалентность Eqv a Eqv b  
Включение Imp a Imp b  

 

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

Оператор Аnd проверяет истинность обоих выражений одновре-менно.

Оператор Or проверяет истинность выражений. Если хотя бы одно из выражений будет истинным, то результат – истина. Если оба выражения ложны, то и результат ложен.

Оператор Xor дает истинный результат в том случае, если истинно одно из выражений.

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

Оператор Imp проверяет, включает ли первое выражение второе.

 

Примеры записи логических выражений:

A >= 0 Or A <= 10

F+5 <> 10 And C= 6

 

Рассмотрим запись оператора, реализующего структуру Развилка, представленную ниже.

 
 

 

 


нет

 

 

Условный оператор может быть неполным, т.е. у него могут отсутствовать операторы, выполняемые по условию да или нет, например:

 

 

 
 
нет

 

 


 

нет

 


10.2.2. Модифицированная структура Развилка

 

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

 

 

 


Для реализации модифицированной структуры Развилка может использоваться только условный оператор If, записанный следующим образом:

 

If условие Then

[операторы]

[Else

[операторы]]

End If

 

Пример.

Пусть математическая модель задачи определяется так:

 

y1 = tg(x2); ввести значение y2, если x Ј 0

y1 = cos(x) + sin2(x); y2 = 0, если х > 0

Очевидно, что входными данными служит значение x, а выходными – y1 и y2 .

Схема алгоритма:

 

 

Этому алгоритму соответствует следующая программа на языке программирования Visual Basic

 

Dim x As Single,y1 As Single, y2 As Single

x = Inputbox("Введите значение х", "Модифицированная структура РАЗВИЛКА")

If x<=0 Then

y1=Tan(x^2)

y2=Text1.text

Else

y1=Cos(x)+Sin(x)^2

y2=0

End If

Print "y1 =" & Format(y1,"0.00") & " y2 =" & Format(y2,"0.00")

10.2.3. Вложенная структура Развилка

 

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

 

Вложенная структура Развилка также может быть модифицирован-ной. При программировании вложенной структуры Развилка можно использовать несколько условных операторов If. Однако вложенные операторы If … Then … Else можно создать c помощью конструкции ElseIf (без пробела), которая имеет следующий синтаксис:

If Условие1 Then

[операторы]

ElseIf Условие2 Then

[операторы]

[Else

[операторы]]

End If

При задании такой последовательности Visual Basic проверяет Условие1. Если оно истинно, выполняются операторы этой ветви, затем происходит переход к оператору End If. Если условие ложно, то выполняются операторы, определяемые значением Условия2, записанные после ключевого слова ElseIf.

Примечание. При составлении алгоритма с несколькими условиями рекомендуется проверять условия в порядке от наиболее вероятных к менее вероятным, при этом обеспечивается наибольшая эффективность выполнения программы.

Пример.

Пусть математическая модель задачи записана в виде:

Cхема алгоритма этой задачи будет иметь вид:

 
 

 


 

 

Программа может выглядеть так:

Dim x As Single, y As Single

x=InputBox("x=")

If x>0 Then

y = Sin(x)

Else

If x = 0 Then

y = 10

Else

y = Cos(x)

End if

End If

Print "y=" & Format(y,"0.000")

или так:

 

Dim x As Single, y As Single

x = InputBox("x=")

If x>0 Then

y=Sin(x)

ElseIf x = 0 Then

y = 10

Else

y = Сos(x)

End If

Print "y=" & y

 

При использовании условного оператора If необходимо обратить внимание на следующие особенности: в многострочной структуре операторы, выполняемые в случае истинности условия, нельзя записывать в одной строке с ключевым словом Then. В противном случае Visual Basic не распознает многострочный синтаксис конструкции.

 

10.2.4. Функция IIF

 

Функция IIF имеет следующий синтаксис:

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-21 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: