Примеры программ в маткаде

Система Mathcad задумывалась как средство проведения технических расчётов для людей, не знакомых с программированием, в связи с этим соответствующая система обладала очень скудным набором инструментов программирования. Однако, стало очевидным, что в ряде случаев без программирования не обойтись, а существовавшие инструменты были очень неудобны для разработки ветвящихся циклических программ.

Возможность расширения программ Mathcad за счёт подключения динамических библиотек, написанных на других языках, таких как С++ не был удобен, т. к. требовал от пользователя глубокий знаний языков программирования. В связи с этим в Mathcad был встроен новый язык программирования, а старые средства программирования объявлены устаревшими и не рекомендуются к использованию [1].

За основу языка программирования, встроенного в систему Mathcad не был взят ни один из существовавших на тот момент популярных языков, т. к. он рассчитывался на специфическую аудиторию и задачи. Реализованный в системе язык вобрал в себя много из общепринятых математических обозначений, а встроенная библиотека содержит множество функций, решающих типичные математические задачи. Целью написания заметки является обзор встроенного в систему Mathcad языка. Приводится описание основ синтаксиса языка и среды программирования, а также примеры программ.

Лекция 1: Знакомство с Mathcad

Интерфейс системы Mathcad. Массивы. Графики

example_range

Для добавления кода необходимо добавить в панель Programming Toolbar. Панель содержит операторы языка. Самой первой кнопкой, которая используется в любой программе является Add Line — она добавляет строку кода на рабочую область. На рисунке приведён пример программы, формирующей два массива и строящей по ним график:

В программе добавлено 2 «строчки кода»:

  • определена переменная i при помощи ранжирования. Ранжирование — это техника, напоминающая использование циклов в традиционных императивных языках программирования, однако более привычная математикам;
  • определяется переменная Xi , при этом i является индексом, фактически, Xi является массивом из 10 элементов, при этом в правой части строки задана формула вычисления i-того элемента.

Для задания индексов элементов используется соответствующая кнопка панели инструментов (сверху в центре). Индексы могут быть как верхними, так и нижними. Важную роль играет взаимное расположение строк. Система Mathcad просматривает строки снизу вверху, поэтому переменная i должна располагаться выше Xi и графика (который тоже их использует).

Для построения графика был выбран пункт меню «График Х-У», отвечающий за построение двумерных графиков (Mathcad позволяет также строить поверхности и различные виды диаграмм). График имеет 2 оси, на каждой из которых можно ввести нижнее и верхние значения и имя массива элементов, значения которого должны отображаться. В примере по горизонтальной оси отложены значения переменной i, а по вертикальной — Xi , при этом изменено нижнее значение вертикальной оси на 5.

Построение эпюр в программе MathCAD

Функции. Ветвление. Локальные переменные

mathcad_example_graphic

На следующем примере показано использование ветвления, циклов и функций в системе Mathcad:

В программе, как и в прошлом примере заводится переменная i, принимающая значения от 0 до 360. Значения переменной i интерпретируются как градусы, однако, станадртные тригонометрические функции системы ожидают поступления на свой вход аргумента в радианах. С целью преобразования градусов в радианы в программе описана функция torad . Функция f(x) вычисляет значение sin(x)*cos(x) . График, приведённый в центре рис. 2 иллюстрирует, что функция может использоваться вместо массива, т. к. массив, фактически является функцией своего индекса.

Функция sum принимает аргумент n и вычисляет сумму sin(x)*sin(x) , где x изменяется в диапазоне от 1 до n. Sum(0) полагается равным нулю. Начальное значение присваивается при помощи операции ← , т. е. Операции локального присваивания. Локальное присваивание ограничивает области видимости переменной до текущей функции или блока. Функция использует блок для соединения трех операций.

В функции используется цикл, также содержащий блок. Блоки в системе используется в тех случаях, когда вычисления не умещаются в одну строку. В примере требуется вычислить значение Xi, а затем прибавить его к сумме, это делается в 2 действия чтобы продемонстрировать использование блоков. Все операции блока выполняются последовательно сверху вниз, однако могут быть прерваны операциями break , return и continue . Операция break осуществляет выход из цикла, операция return — выход из функции и возврат значения, операция continue инициирует выполнение следующей итерации цикла.

Операции типа break имеет смысл использовать только совместно с оператором условия. Использование такого оператора показано в 4 строке функции на рис.2. Элемент массива sum инициируется только в том случае, если его индекс больше 1, т. к. в противном случае при выполнении кода будет осуществляться обращение к элементу массива с отрицательным индексом.

Список дополнительной литературы по Mathcad

  • В. Очков Язык программирования Mathcad. Взгляд со стороны. — [Электронный ресурс]. – режим доступа: http://twt.mpei.ac.ru/ochkov/mc_prog.htm.
  • Программирование в Mathcad. — [Электронный ресурс]. – режим доступа: http://itmu.vsuet.ru/Posobija/MathCAD/gl06/index.htm.

Источник: pro-prof.com

Программирование в MathCAD

MathCAD – это система, ориентированная на пользователя, который не обязан знать абсолютно ничего о программировании. Создатели MathCAD изначально поставили перед собой такую задачу, чтобы дать возможность профессионалам – математикам, физикам и инженерам самостоятельно проводить сложные расчеты, не обращаясь за помощью к программистам. Несмотря на блестящее воплощение этих замыслов, выяснилось, что совсем без программирования MathCAD серьезно теряет в своей силе, в основном, из-за недовольства пользователей, знакомых с техникой создания программ.

В очень ранних версиях MathCAD встроенного языка программирования не было. Чтобы применять привычные операции проверки условий и организовывать циклы, приходилось изобретать причудливую смесь из встроенных функций if и until, а также комбинаций ранжированных переменных. Но надо отметить, что использование ранжированных переменных – мощный аппарат MathCAD, похожий на применение циклов в программировании. В подавляющем большинстве случаев намного удобнее организовать циклы с помощью ранжированных, чем заниматься для этого программированием.

И тем не менее встроенный язык программирования MathCADпозволяет решать самые различные, в том числе и довольно сложные, задачи и является серьезным подспорьем для расчетов. Поэтому последние версии MathCAD имеют не очень мощный, но весьма элегантный собственный язык программирования.

Для вставки программного кода в документы MathCAD имеется специальная панель инструментов. Большинство кнопок этой панели выполнено в виде текстового представления операторов программирования, поэтому их смысл легко понятен. Операторы программирования могут быть введены только с этой панели, но никак не с клавиатуры (можно еще их вводить с помощью сочетаний клавиш, которые приведены в тексте всплывающей подсказки).

Читайте также:
Зачем нужна программа блокнот

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

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

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

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

Внутри программы можно использовать глобальные переменные документа, но изменить их значение внутри программы никак нельзя. Можно создать в программе другие переменные, доступ к которым может осуществляться только из самой программы. Эти переменные называются локальными переменными. Локальные переменные «не видны» извне.

Локальная переменная создается с помощью знака локального присвоения с панели Programming. Для оператора локального присваивания, так же как и для операторов обычного и глобального присваивания, можно изменить внешний вид так, чтобы он выглядел как обычный знак равенства. Для этого достаточно вызвать контекстное меню этого оператора и в нем выбрать команду View Definition As/Equal.

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

Вставить строку программного кода в уже созданную программу можно в любой момент с помощью той же самой кнопки Add Line. Для этого следует поместить на нужное место внутри программы линии ввода.

Если вертикальная линия ввода находится в начале текущей строки, то нажатие кнопки приведет к появлению новой строки перед текущей строкой, если вертикальная линия ввода находится в конце строки, то нажатие кнопки

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

Проверка условий в программах .

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

Для проверки условий в программах MathCAD служит оператор if . В поле ввода справа нужно ввести условие. Для ввода условий служит панель Boolean.

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

Если для условия «истинно» необходимо выполнение нескольких строк программы, надо воспользоваться кнопкой .

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

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

Другим очень важным элементом при создании нелинейных программ являются циклы. Циклы позволяют повторять несколько раз выполнение одного и того же программного блока. Для создания циклов в MathCAD предусмотрено два оператора for и while.

В таких циклах создается некоторая переменная-счетчик, значение которой изменяется после каждого выполнения тела цикла. Выход из цикла происходит при достижении этой переменной заданного значения. Этот оператор вводится с панели Programming клавишей for . В поле ввода после слова for следует указать имя переменной – счетчика.

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

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

Пример: Заполнить вектор числами от xнач до xкон с шагом h. Затем определить сумму элементов этого вектора и найти их среднее арифметическое значение.

Цикл while – цикл, который выполняется до тех пор, пока выполняется определенное условие.

В поле ввода справа от слова while следует ввести условие. Это условие строится по тем же правилам, что и в операторе if. Оно будет проверяться после каждого выполнения тела цикла и в тот момент, когда условие перестанет выполняться, повторение тела цикла прекратится. В поле ввода ниже слова while следует ввести тело цикла (напомним, что для ввода нескольких строк в теле цикла надо воспользоваться кнопкой Add Line).

Читайте также:
Получить власть в государстве с целью реализовать свою программу

Пример 1: Вычислить сумму с точностью е.

Пример2: Найти первый элемент, превышающий определенный порог.

Использование операторов break и continue .

Иногда возникает необходимость повлиять на выполнение цикла некоторым образом, например, прервать его выполнение по какому-либо условию или выполнять некоторые итерации не так, как другие. Для этого и служат операторы break и continue.

Оператор break, если он расположен внутри цикла, означает немедленное прекращение выполнения текущей итерации и выход из цикла. Если есть необходимость прекратить выполнение цикла по какому-либо условию, то следует использовать конструкцию следующего вида break if (условие).

Пример: Выделить из массива все элементы от начала и до первого вхождения в него заданного числа.

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

Пример: Требуется заполнить элементы квадратной матрицы в шахматном порядке.

Оператор return (возврат значения) .

Как мы уже указывали, результат выполнения программного модуля помещается, как правило, в последней его строке. Но можно прервать выполнение программы в любой ее точке (например, с помощью условного оператора) и выдать некоторое значение, применив оператор return. В этом случае при выполнении указанного условия значение, введенное в поле ввода после return, возвращается в качестве результата, и никакой другой код больше не выполняется. Вставляется в программу оператор return с помощью одноименной кнопки панели Programming . Пример:

Система MathCAD предоставляет пользователю некоторый контроль над ошибками, которые могут возникнуть при вычислении выражений или при выполнении программ. Для этой цели служит оператор on error, который можно вставить с помощью одноименной кнопки панели Programming . В поле ввода справа следует ввести выражение или программу, которые необходимо вычислить (известно, что это выражение может содержать ошибку при определенных значениях входных параметров). В поле ввода слева следует ввести выражение, которое будет выполнено вместо правого выражения, если при выполнении последнего возникнет ошибка. Пример: Если аргументу функции присвоено нулевое значение, то в программе возникает ошибка – деление на нуль. Но за счет оператора on error сообщение не выводится, а функции в этой точке присваивается значение, указанное слева от оператора on error – значение машинной бесконечности.

В поле ввода слева может быть введено текстовое выражение, сообщающее об ошибке

Конечно, если программа содержит только простейшие математические операции, то никаких ошибок, кроме деления на нуль или превышения наибольшего допустимого числа в ней возникнуть не может. В таких программах оператор on error используется редко. Но для более сложных программ, которые содержат функции решения дифференциальных уравнений, аппроксимации или другие сложные функции MathCAD, использование on error может избавить от многих трудностей.

Иногда может возникнуть ситуация обратная той, которая была описана выше, т.е. необходимо, чтобы при определенных условиях результатом выражения было сообщение об ошибке, хотя в действительности при этом не возникает ни одной стандартной ошибки MathCAD. Для таких случаев в MathCAD предусмотрена встроенная функция error. В качестве аргумента этой функции нужно в кавычках указать текст сообщения об ошибке, который должен быть выведен. Таким образом, если необходимо, чтобы программа возвращала ошибку при определенном условии, то следует использовать конструкцию вида: error («текст ошибки») if (условие).

Для того, чтобы иметь возможность нормально вводить текст на русском языке в аргумент функции error (а также во все другие функции со строками), следует изменить шрифт, который используется во встроенном стиле Constant. Для того чтобы этот стиль правильно отображал русские буквы, установите курсор на любом числе или строковом выражении в формульном блоке. При этом в поле на панели инструментов Formatting, отображающем текущий стиль, должно быть написано – Constant. Теперь выберите из раскрывающегося списка шрифтов шрифт, поддерживающий кириллицу.

1. Вычислить функцию sin(x) с точностью е.

2. Даны массивы А(5) и В(5). Получить массив С, в который записаны сначала элементы

массива А в порядке возрастания, а затем элементы массива В порядке убывания

3. По введенным значениям коэффициентов А, В, С определить корни квадратного уравнения

4. Дан массив натуральных чисел В(10). Определить, есть ли в нем 4 последовательных числа (например, 1, 2, 3, 4, и т.п.). Напечатать такие группы чисел.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:

Источник: studopedia.ru

Программирование в системе Mathcad

Как известно из истории развития вычислительной техники, программное обеспечение, в том числе, используемое для математических расчетов, также эволюционировало от машинных языков низкого уровня к языкам высокого уровня и, наконец, к пакетам прикладных программ, предоставляющим инженерам и ученым возможность решать задачи не имея специальной «программисткой» подготовки, что, конечно, не избавляет их от необходимости владеть математическим аппаратом и специальными знаниями, а также возможностей используемых ими пакетов программ.

Тем не менее, математические пакеты дают огромные возможности исследователям и инженерам, так как содержат тщательно сбалансированные средства численных и символьных вычислений с графической визуализацией результатов в сочетании с современным интерфейсом пользователя, мощной справочной системой, обширными пакетами расширений (ориентированных на решение определенного класса задач) и средствами для работы в Internet.

К таким пакетам относятся MatLab, Mathematica, Maple и MathCAD.

Возможности этих пакетов огромны и с каждой новой версией их становится все больше, тем не менее, не всегда можно обойтись использованием «готовых» функций, входящих как в сам MathCAD, так и в пакеты расширений. Их использование порождает достаточно простые алгоритмические конструкции, реализуемые непосредственно в документе MathCAD. Однако в ряде случаев возникает необходимость программирования того или иного «нестандартного» вычислительного алгоритма. Здесь необходимы навыки программирования с учетом особенностей конструкций пакета MathCAD.

Этим вопросам и посвящена эта часть дисциплины «Информатика»

Подпрограмма-функция. Описание и вызов.

Программирование в системе MathCad, предполагает использование так называемых подпрограмм-функций (П-Ф), определяемых непосредственно пользователем. П-Ф позволяют реализовывать выполнение последовательности действий с использованием различных сочетаний алгоритмических структур – следования, ветвления и циклов.

Читайте также:
ТВ канал авто программа

Работа с П-Ф начинается с ее описания. Для этого нужно:

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

Примеры имен П-Ф: f (x), A, Z (x,y,v).

2. После имени вводится знак «:=» присваивания.

f (x):=, A:=, Z (x,y,v):=.

3. Открыть палитру Программирование и щелкнуть кнопкой Add line (рис. 1.1). На экране появится вертикальная черта и вертикальный столбец с двумя полями для ввода операторов, образующих тело П-Ф (рис. 1.2);

Рис.1.1. Палитра ПРОГРАММИРОВАНИЕ

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

Рис.1.2. Структура подпрограммы-функции.

4. Перейти в поле 1 (щелкнув на нем мышью или нажав клавишу [Tab]) и начать вводить операторы П-Ф, оставляя самое нижнее поле тела для возвращаемого значения функции – результата работы П-Ф. на рис. 1.2.это поле 2.

Так как тело П-Ф как правило состоит из более чем двух полей, то поля ввода для дополнительных операторов открываются с помощью щелчка на кнопке Add line палитры программирование (см. рис. 4.1.3). При этом поле ввода добавляется внизу выделенного к этому моменту оператора. Для удаления того или иного оператора или поля ввода из тела П-Ф нужно заключить его в выделяющую рамку и нажать клавишу [Delete];

Обратите внимание, что оператор присваивания в теле П-Ф имеет вид стрелки, направленной влево: ← и называется локальным оператором присваивания.

Рис.3.1. Пример программирования линейного алгоритма

Рис. 4.1. Структура условного оператора if «ЕСЛИ – ТО»

Поле 2 заполняется условием, если оно верно (истинно), то выполняется выражение, стоящее в Поле 1.

Вычислить значение функции, заданной следующим образом:

Реализация ЕСЛИ – ТО (if) в MathCad:

Рис. 4.1. Реализация условного оператора if «ЕСЛИ – ТО»

Для получения условной структуры ЕСЛИ – ТО – ИНАЧЕ используется оператор otherwise, вводимый с палитры ПРОГРАММИРОВАНИЕ, в поле которого размещается конструкция ВЫР2, которая выполняется, если проверяемое логическое выражение принимает значение ЛОЖЬ (0) (рис. 4.2). Оператор otherwise непосредственно следует после условного оператора if.

Рис.4.2. Реализация структуры «ЕСЛИ – ТО – ИНАЧЕ»

Для ввода ВЫР2 в поле оператора otherwise необходимо:

· выделить поле, стоящее после оператора if;

· щелкнуть на кнопке otherwise палитры ПРОГРАММИРОВАНИЕ;

· в появившееся поле оператора otherwise ввести необходимую конструкцию ВЫР2.

Вычислить значение функции, заданной следующим образом:

Реализация ЕСЛИ – ТО – ИНАЧЕ в MathCad:

Рис. 4.3. Реализация условного оператора if «ЕСЛИ – ТО- ИНАЧЕ»

Рис. 5.1. Поля оператора цикла for

· в поле ввода 1 ввести имя переменной, являющейся параметром цикла;

· в поле 2 — закон изменения параметра цикла, используя для этого описание дискретной переменной или описание массива;

· в поле 3 — операторы, составляющие тело цикла. Если одной строки недостаточно, то дополнительные поля ввода (дополнительные строки) создаются щелчком на кнопке Add line палитры ПРОГРАММИРОВАНИЕ, и тогда слева от тела цикла появляется вертикальная черта, охватывающая тело цикла.

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

Рис. 5.2. Реализация цикла FOR в MathCad:

На отрезке [-1;3] с шагом 0,3, вычислить значения функции и сформировать из этих значений вектор .

Примем — начальное значение, а — конечное значение аргумента, приращение аргументы происходит по закону , получим реализацию алгоритма for:

Рис. 5.3. Формирование вектора примера 5.2

Следует помнить, что и в тексте программы не являются элементами вектора и знаки 0 и k пишутся через десятичную точку.

Рис. 5.4. Структура оператора итерационного цикла

· в поле 1 ввести условие выполнения цикла;

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

Оператор цикла while выполняется следующим образом: обнаружив оператор while, Mathcad проверяет указанное в операторе условие. Если оно равно 1 (т.е. выполняется), то выполняется тело цикла, и снова проверяется условие. Если условие принимает значение 0, то цикл заканчивается.

Вычислять значение функции с шагом на отрезке [0.001; 3], до тех пор, пока .

Решение. Как видно из рисунка 5.5, функция , действительно меняет знак на отрезке [0.001; 3].

Введем следующие обозначения: а – начальное значение функции, d – приращение аргумента (шаг, с которым вычисляется значение функции ).

Рис. 5.5. График функции

Реализация программы итерационного цикла с использованием оператора while приведена ниже на рис. 5.6:

Рис. 5.5. решение задачи примера 5.3

ПРОГРАММИРОВАНИЕ В СИСТЕМЕ MATHCAD

Введение

Как известно из истории развития вычислительной техники, программное обеспечение, в том числе, используемое для математических расчетов, также эволюционировало от машинных языков низкого уровня к языкам высокого уровня и, наконец, к пакетам прикладных программ, предоставляющим инженерам и ученым возможность решать задачи не имея специальной «программисткой» подготовки, что, конечно, не избавляет их от необходимости владеть математическим аппаратом и специальными знаниями, а также возможностей используемых ими пакетов программ.

Тем не менее, математические пакеты дают огромные возможности исследователям и инженерам, так как содержат тщательно сбалансированные средства численных и символьных вычислений с графической визуализацией результатов в сочетании с современным интерфейсом пользователя, мощной справочной системой, обширными пакетами расширений (ориентированных на решение определенного класса задач) и средствами для работы в Internet.

К таким пакетам относятся MatLab, Mathematica, Maple и MathCAD.

Возможности этих пакетов огромны и с каждой новой версией их становится все больше, тем не менее, не всегда можно обойтись использованием «готовых» функций, входящих как в сам MathCAD, так и в пакеты расширений. Их использование порождает достаточно простые алгоритмические конструкции, реализуемые непосредственно в документе MathCAD. Однако в ряде случаев возникает необходимость программирования того или иного «нестандартного» вычислительного алгоритма. Здесь необходимы навыки программирования с учетом особенностей конструкций пакета MathCAD.

Этим вопросам и посвящена эта часть дисциплины «Информатика»

Источник: infopedia.su

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru