Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save anonymous/a218881d9a2a4236c209bc169ca092d9 to your computer and use it in GitHub Desktop.
Save anonymous/a218881d9a2a4236c209bc169ca092d9 to your computer and use it in GitHub Desktop.
Математических чисел значений выражений

Математических чисел значений выражений


Математических чисел значений выражений



Числовые выражения
Что такое выражение в математике и значение выражения?
Числовые выражения. Сравнение числовых выражений


























Вопрос, как говорится, интересный Дело в том, что эти понятия - основа всей математики. Вся математика состоит из выражений и их преобразований. Допустим, перед вами злой пример. Очень большой и очень сложный. Допустим, вы сильны в математике и ничего не боитесь! Сможете сразу дать ответ? Вам придётся решать этот пример. Последовательно, шаг за шагом, этот пример упрощать. По определённым правилам, естественно. Насколько успешно вы проведёте эти преобразования, настолько вы и сильны в математике. Если вы не умеете делать правильные преобразования, в математике вы не сможете сделать ни-че-го Для начала выясним, что такое выражение в математике. Что такое числовое выражение и что такое алгебраическое выражение. Выражение в математике - это очень широкое понятие. Практически всё то, с чем мы имеем дело в математике - это набор математических выражений. Любые примеры, формулы, дроби, уравнения и так далее - это всё состоит из математических выражений. И здоровущая дробь, и даже одно число - это всё математические выражения. Уравнение, например, вот такое:. Одно выражение - слева, другое - справа. В общем виде термин " математическое выражение " применяется, чаще всего, чтобы не мычать. Спросят вас, что такое обыкновенная дробь, например? А можно я лучше напишу дробь? Вот в этих целях фраза " математическое выражение " очень хороша. И правильно, и солидно. Но для практического применения надо хорошо разбираться в конкретных видах выражений в математике. Конкретный вид- это другое дело. Это совсем другое дело! У каждого вида математических выражений есть свой набор правил и приёмов, который необходимо использовать при решении. Для работы с дробями - один набор. Для работы с тригонометрическими выражениями - второй. Для работы с логарифмами - третий. Где-то эти правила совпадают, где-то - резко отличаются. Но не пугайтесь этих страшных слов. Логарифмы, тригонометрию и прочие загадочные вещи мы будем осваивать в соответствующих разделах. Здесь мы освоим или - повторим, кому как Числовые выражения и алгебраические выражения. Что такое числовое выражение? Это очень простое понятие. Само название намекает, что это выражение с числами. Да, так оно и есть. Математическое выражение, составленное из чисел, скобок и знаков арифметических действий называется числовым выражением. Обычное число, дробь, любой пример на вычисление без иксов и прочих букв - всё это числовые выражения. Главный признак числового выражения - в нём нет букв. Только числа и математические значки если надо. И что можно делать с числовыми выражениями? Числовые выражения, как правило, можно считать. Для этого приходится, бывает, раскрывать скобки, менять знаки, сокращать, менять местами слагаемые - то есть делать преобразования выражений. Но об этом чуть ниже. Здесь же мы разберёмся с таким забавным случаем, когда с числовым выражением ничего делать не надо. Ну вот совсем ничего! Эта приятная операция - ничего не делать - выполняется, когда выражение не имеет смысла. Так как непонятно, что с этим делать. Разве что, посчитать количество плюсиков Однако, это выражение тоже не имеет смысла! По той простой причине, что во вторых скобочках - если посчитать - получается ноль. А на ноль делить нельзя! Это запретная операция в математике. Стало быть, с этим выражением тоже ничего делать не надо. При любом задании с таким выражением, ответ будет всегда один: Чтобы дать такой ответ, пришлось, конечно, посчитать, что в скобочках будет. А иногда в скобочках такого понаворочено Ну тут уж ничего не поделаешь. Запретных операций в математике не так уж много. В этой теме - всего одна. Дополнительные запреты, возникающие в корнях и логарифмах обсуждаются в соответствующих темах. Итак, представление о том, что такое числовое выражение - получили. Понятие числовое выражение не имеет смысла - осознали. Если в числовом выражении появляются буквы - это выражение становится Оно становится алгебраическим выражением. Ещё такие выражения называют буквенными выражениями. Или выражениями с переменными. Это, практически, одно и то же. Понятие алгебраическое выражение - более широкое, чем числовое. Оно включает в себя и все числовые выражения. Всякая селёдка - рыба, но не всякая рыба - селёдка Почему буквенное - понятно. Ну, раз буквы есть Фраза выражение с переменными тоже не сильно озадачивает. Если понимать, что под буквами скрываются числа. Всякие числа могут скрываться под буквами И 5, и , и всё, что угодно. Поэтому буквы и называются переменными. Или говорят просто " переменная" , без слова "величина". В отличие от пятёрки, которая - величина постоянная. Или просто - постоянная. Термин алгебраическое выражение означает, что для работы с данным выражением нужно использовать законы и правила алгебры. Если арифметика работает с конкретными числами, то алгебра - со всеми числами разом. Простой пример для пояснения. Посчитать, и все дела. Слева 8, и справа 8. А для других чисел такое равенство выполняется? Тоже можно записать и посчитать. Но чисел - бесконечное количество И что, каждый раз считать?! Для всех чисел махом. Для всего бесконечного количества. Потому, что под буквами а и b подразумеваются все числа. И не только числа, но даже и другие математические выражения. Вот так работает алгебра. Про числовое выражение всё понятно. Там на ноль делить нельзя. А с буквами, разве можно узнать, на что делим?! Но есть одно значение а , при котором это выражение точно не имеет смысла! И что это за число? Если переменную а заменить говорят - "подставить" на число 5, в скобочках ноль получится. На который делить нельзя. Но при других-то значениях а смысл имеется? Другие числа подставлять-то можно? Весь набор чисел, которые можно подставлять в заданное выражение, называется областью допустимых значений этого выражения. Как видите, ничего хитрого нет. Смотрим на выражение с переменными, да соображаем: Если спрашивают, при каком значении переменной выражение не имеет смысла , наше запретное значение и будет ответом. Если спрашивают, при каком значении переменной выражение имеет смысл почувствуйте разницу! Зачем нам смысл выражения? Есть он, нет его Дело в том, что это понятие становится очень важным в старших классах. Это основа для таких солидных понятий, как область допустимых значений или область определения функции. Без этого вы вообще не сможете решать серьёзные уравнения или неравенства. Мы познакомились с числовыми и алгебраическими выражениями. Поняли, что означает фраза "выражение не имеет смысла". Теперь надо разобраться, что такое преобразование выражений. Ответ прост, до безобразия. Это любое действие с выражением. Вы эти преобразования делали с первого класса. Вот этот расчёт и будет преобразованием выражения. Можно записать то же самое выражение по-другому:. Тут мы вообще ничего не считали. Просто записали выражение в другом виде. Это тоже будет преобразованием выражения. Можно записать вот так:. Любое действие над выражением, любая запись его в другом виде называется преобразованием выражения. Но есть здесь одно очень важное правило. Настолько важное, что его смело можно назвать главным правилом всей математики. Нарушение этого правила неизбежно приводит к ошибкам. Дело в том, что преобразования "как попало" математику не интересуют вообще. Вся математика построена на преобразованиях, в которых меняется внешний вид, но суть выражения не меняется. Три плюс пять можно записать в каком угодно виде, но это должно быть восемь. Преобразования, не меняющие сути выражения называются тождественными. Именно тождественные преобразования и позволяют нам, шаг за шагом, превращать сложный пример в простое выражение, сохраняя суть примера. Если в цепочке преобразований мы ошибёмся, сделаем НЕ тождественное преобразование, дальше мы будем решать уже другой пример. С другими ответами, которые не имеют отношения к правильным. В алгебраических выражениях тождественные преобразования даются формулами и правилами. Скажем, в алгебре есть формула:. Математика предоставляет нам выбор из этих двух выражений. А уж какое из них писать - от конкретного примера зависит. Одно из из самых главных и нужных преобразований - это основное свойство дроби. Подробнее можно по ссылке посмотреть, а здесь просто напомню правило: Вот вам пример тождественных преобразований по этому свойству:. Как вы, наверняка, догадались, эту цепочку можно продолжать до бесконечности Именно оно позволяет превращать всякие монстры-примеры в белые и пушистые. Формул, задающих тождественные преобразования, - много. Но самых главных - вполне разумное количество. Одно из базовых преобразований - разложение на множители. Оно используется во всей математике - от элементарной до высшей. С него и начнём. Вот здесь можно потренироваться в решении примеров и узнать свой уровень. Тестирование с мгновенной проверкой. Учимся - с интересом! А вот здесь можно познакомиться с функциями и производными. Hовое на сайте В разделе Решение задач на формулу n-го члена. Основа для решения заданий. Способы решения, приёмы упрощения, ловушки в заданиях. Что такое математическая модель? Как решать дробные уравнения? Содержание сайта Раздел 1. Копирование материалов разрешается только при указании работающей ссылки на этот сайт. Иное использование материалов допускается с разрешения автора. Нарушение авторских прав влечёт за собой административную и уголовную ответственность в соответствии с законодательством Российской Федерации.


Каталог статей


До этого момента большинство из рассмотренных объектов имели непосредственное отношение к объектной модели документа. Однако, между объектной моделью документа и языком JavaScript существует четкое размежевание. В языке используются собственные объекты, которые полностью независимы от объектов модели документа. Эти объекты определяются таким образом, что если бы разработчик сценария захотел использовать JavaScript в качестве языка программирования для полноценного решения другой задачи, то в этом языке все же можно для управления текстом, проведения сложных математических вычислений выходящих за пределы элементарных математических операций и задания дать использовать основные из упомянутых выше программных средств. Формальное описание соответствующих объектов можно найти в инструкциях стандарта ЕСМА Не только для новичков в программировании, но даже и для вполне опытных пользователей, которым не приходилось сталкиваться с объектно-ориентированным программированием, бывает крайне сложно привыкнуть к объектам, особенно если последние определяют что-то, имеющее физическую интерпретацию весьма сомнительного характера. Например, не представляет большого труда свыкнуться с мыслью, что кнопка на странице является объектом. У нее есть несколько свойств, которые поддаются логическому восприятию. А вот как быть со строкой или символом? В любой объектно-ориентированной среде, каковой выступает и JavaScript, все, что может изменяться, трактуется как объект, - каждый фрагмент данных, начиная с логических значений и заканчивая датами. Каждый такой объект, вероятнее всего, имеет одно или более свойств, которые призваны помочь в определении его содержимого. Каждый объект также имеет методы, определяющие, какие задачи объект может выполнять и что программист может делать с объектом. Все объекты, которые не относятся к объектной модели документа, будем называть объектами базового языка. На этом уроке основное внимание уделено объектам типа String, Math и Date. В предыдущих главах строковые объекты String уже неоднократно использовались. Строкой считается любой текст, заключенный в кавычки. Кавычки могут быть двойными или одинарными. Это позволяет вставлять одну строку в другую, что приходится часто выполнять при управлении обработчиками событий. В приведенном ниже примере методу alert в качестве параметра нужно задать заключенную в кавычки строку. Но при этом сам вызов метода также осуществляется с использованием кавычек:. В JavaScript нет практических ограничений на количество символов в строке. Тем не менее, в старых версиях браузеров существует максимально допустимое значение длины строки оператора сценария, равное символам. Этот предел иногда превышается, когда сценарий включает в себя длинные строки, которые нужно отобразить на странице. В таких случаях эти строки следует разбивать на более короткие, для чего используются описанные ниже приемы. Есть два способа присваивания значения строчной переменной. Наиболее просто эта задача решается с использованием оператора обычного присваивания:. Этот подход превосходно срабатывает во всех, за редким исключением, случаях. Начиная с Navigator 3 и Internet Explorer 4 строки можно создавать с использованием более формального синтаксиса на основе ключевого слова new и конструктора функции конструктор создает новый объект:. Какой бы способ из описанных выше ни использовался для инициализации строковой переменной, она становится доступной для всех методов объекта String. Соединение двух строк в одну называется объединением или конкатенацией строк. Этот термин уже встречался ранее. Для объединения строк нужно воспользоваться одним из двух предусмотренных для этого случаях применения JavaScript-операторов. Наряду с этим оператором есть еще один, который может использоваться с таким же успехом, а, иногда, еще и с большим. Этот оператор удобно использовать, когда в одной строке нужно объединять несколько длинных строк. Строка может быть настолько большой и громоздкой, что весь процесс придется разбить на несколько этапов. Объединяемыми фрагментами могут выступать строковый текст строка в кавычках или строковые переменные. Не самым эффективным в таком случае способом объединения строк хотя и легко выполняемым в JavaScript является использование оператора сложения для добавления к строке новых фрагментов текста:. Другой оператор, оператор дополнения, предлагает более компактную форму записи. Использование этого оператора эквивалентно добавлению в конец переменной, стоящей слева от оператора, того выражения, что находится справа от оператора. Поэтому команды из вышеприведенного примера упростятся до следующего представления:. Оператор приращения удобно использовать, когда нужно собрать вместе фрагменты текста HTML для отображения его в текущем документе или другом окне. Из всех основных объектов JavaScript, объект String имеет наиболее богатый набор методов. Многие из этих методов используются для извлечения фрагментов строк. Другая группа методов, которая используется значительно реже, задается с помощью стилевых дескрипторов эквивалент дескрипторов, определяющих размер шрифта, стиль и др. Для того чтобы использовать один из методов строкового объекта, строка задается с помощью ссылки, в конце которой указывается название метода. Все методы возвращают значения определенного типа. В большинстве случаев возвращаемое значение- это преобразованная версия исходного строкового объекта, на который ссылается вызываемый метод, - однако исходные строки при этом остаются неизменными. Чтобы сохранить такую измененную версию строки, нужно результат вызова метода присвоить в качестве значения переменной:. В следующем разделе описано несколько полезных методов строковых объектов, которые доступны в браузерах всех типов и версий. Существует два метода, которые преобразуют всю строку в символы верхнего или нижнего регистра то есть все буквы становятся либо строчными, либо прописными соответственно:. Названия этих методов говорят сами за себя to upper case - в верхний регистр и to lower case - в нижний регистр. Указанные методы могут пригодиться в том случае, если нужно сравнить две строки без учета регистра символов например, когда строка в таблице поиска сравнивается с введенной пользователем. Поскольку методы не изменяют содержимое исходных строк, используемых в выражениях, в данном случае можно просто сравнить результаты вызова соответствующих методов:. Для того чтобы определить, содержится ли одна строка внутри другой строки, используется метод string. Даже при работе с данными объектов JavaScript это весьма полезная и часто используемая информация. Например, одно из свойств объекта navigator navigator. Сценарий может проверить значение соответствующего свойства на наличие в нем, скажем, фрагмента Win. Полученные данные позволяют определить, какие операционные системы используются посетителем. Часто внутри очень длинной строки скрывается коротенький текстовый фрагмент особой важности, поэтому каждый сценарий должен уметь определять, содержится ли одна строка в другой - где бы она ни располагалась. Если совпадение не обнаружено, то возвращается значение Для выяснения, содержится ли данная строка в длинном текстовом фрагменте, достаточно просто убедиться, что возвращаемое методом значение отлично от В этом методе указываются две строки: Та строка, что длиннее, в ссылке задается слева от названия метода. Та строка, что покороче, указывается в качестве параметра метода indexOf. Чтобы продемонстрировать, как этот метод применяется на практике, приведен следующий фрагмент кода. В нем выясняется, использует ли пользователь операционную систему Windows. В условии конструкции if использован оператор неравенства! Он определяется, как "не равно". Для того чтобы извлечь в определенной позиции строки отдельный символ, используется метод chartAt. Параметр этого метода- это индекс начальное значение нуль искомого символа. Когда выше было указано извлечь символ, то это не подразумевало удаление. Извлечение скорее напоминает "фотографирование" символа. Исходная строка не изменится при этом никоим образом. Например, рассмотрим сценарий в основном окне, который проверяет переменную stringA другого окна, в котором отображаются планы различных зданий. Когда в окне представляется план здания Building С , значение переменной stringA равно "Building С". Символ, обозначающий здание, всегда представляется в десятой позиции то есть индексом номер 9, если начинать отсчет с нуля , так что сценарию достаточно проверить только один этот символ, чтобы идентифицировать карту, отображенную в текущий момент в окне:. Здесь обязательно обратите внимание на тот факт, что последний символ такой подстроки который соответствует конечному индексу не извлекается. Все остальные символы, начиная с символа, соответствующего начальному индексу, и заканчивая символом, стоящим перед тем, что отвечает конечному индексу, будут извлечены в виде единой подстроки. Строка, из которой извлекается фрагмент, в ссылке на метод располагается слева от названия метода. Два параметра, передаваемых методу, соответствуют начальному и конечному индексу если начинать отсчет с нуля извлекаемой подстроки:. Операции со строками в JavaScript, по сравнению с некоторыми другими языками, выглядят несколько громоздкими. Такие высокоуровневые понятия, как слова, предложения или абзацы здесь просто отсутствуют. Поэтому часто для управления методами строчных объектов затрачиваются незначительные усилия, от чего может сложиться впечатление, что это достаточно просто. Чтобы охладить пыл энтузиастов, я бы посоветовал им применить полученные знания в области вычисления выражений для того чтобы проверить, что же будет, если использовать нетривиального характера структуры, вложенные одна в другую. Например, в следующем фрагменте нужно создать новую строку, идентичную более длинной строке, за исключением первого слова, которое в новой строке должно отсутствовать. Примите во внимание, что первое слово, в принципе, может быть любой длины. Поэтому во втором операторе, чтобы найти первый пробел, используется метод string. К индексу первого пробела в строке прибавляется единица, определяя тем самым начальный индекс для метода string. Для определения второго параметра этого метода используется свойство length строки оно на единицу больше того числа, которое передается в качестве параметра. Создание подобного рода кода является далеко не самым веселым занятием, особенно если эту задачу приходится решать довольно часто. Поэтому не лишено смысла создание собственной библиотеки функций, управляющих строками, которые потом можно использовать каждый раз при написании сценариев, в которых используются строковые данные. В JavaScript представлен широкий набор программных средств для проведения математических вычислений - их количество намного большее, чем требуется большинству не имеющих специальной компьютерной и математической подготовки составителей сценариев. Но любой "уважающий себя" язык программирования должен иметь в своем составе подобные мощные программные средства, чтобы каждый умник-программист мог создавать окна, выдающие на экран всевозможные числовые результаты. Все эти возможности предоставляются объектом Math. Этот объект выгодно отличается от всех остальных объектов JavaScript в том смысле, что для работы с ним не нужно создавать его копии. Вместо этого просто вызываются методы и свойства единственного объекта Math. Объект Math является производным от окна или фрейма, однако на ход выполнения сценария это совершенно не влияет. Программисты называют такого рода фиксированные объекты статичными. Объект Math пишется с большой буквы М обязательно должен указываться в ссылке на свойство или метод. Свойства объекта Math - это постоянные значения константы , вроде числа "Пи" или корня квадратного из двух:. Методы объекта Math покрывают широкий диапазон, вплоть до тригонометрических и других математических функций, управляющих числовыми значениями, которые предопределены в сценарии. Например, следующим образом в сценарии определяется, какое из двух чисел больше:. Более полезный, пожалуй, метод, с помощью которого можно округлить значение до ближайшего целого числа:. Еще один часто используемый метод - это генерирование случайного числа с помощью объекта Math. Если вами создается сценарий карточной игры, то в нем обязательно понадобится генерировать случайные числа от 1 до При бросании кубика задаются случайные числа в диапазоне от 1 до 6. Для того чтобы сгенерировать целое число в диапазоне от нуля до любого другого числа, можно воспользоваться следующей формулой:. Для генерирования случайных чисел в диапазоне между единицей и большим единицы числом используется формула:. Единственное, в чем JavaScript не очень силен, за исключением версий IE5. В числах с плавающей точкой после десятичной точки может отображаться не больше десятка цифр. Добавьте также всевозможные погрешности в операциях с числами с плавающей точкой, которые зависят от используемой операционной системы, особенно для ранних версий браузеров. Для браузеров, созданных ранее IE5. Но я не думаю, что кому-то из вас понадобится точность до десяти знаков после запятой. Работа с датами в JavaScript, выходящая за рамки простых задач, может быть весьма непростым делом. Большинство проблем возникает оттого, что дата и время рассчитываются непосредственно по Гринвичскому времени Greenwich Mean Time - GMT. При этом подразумевается, что время на часах компьютера пользователя выставлено правильно. Такие особенности лучше оставить для более глубокого изучения. Здесь же будут рассмотрены только основные способы управления объектом Date в JavaScript. В браузерах, поддерживающих сценарии, присутствует только один глобальный объект Date если точно, то один объект Date в одном окне , к которому можно обратиться в любое время. Объект Date является еще одним примером статичного объекта. Когда вам нужно получить дату, например, для отображения ее на странице, вызовите конструктор объекта Date для получения экземпляра объекта Date , задающего определенную дату и время. Например, если вызвать конструктор без указания каких бы то ни было параметров, как здесь:. Обратите внимание на разницу между объектом Date и э кземпляром объекта , содержащим текущие дату и время. В переменной today "спрятано" не динамически изменяемое время, а фиксированное значение , которое можно проверить, разбив на составляющие, и использовать в сценарии по своему усмотрению. Более конкретно, значение экземпляра объекта даты - это время, выраженное в миллисекундах, начиная с 1 января года в зоне Гринвичского меридиана - всемирный стандарт для задания абсолютных дат и времен. Вот как в объекте даты удается сразу запомнить и дату, и текущее время. С помощью объекта Date можно определить дату и момент времени как в прошлом, так и будущем, для чего полученная информация задается в качестве параметров функции конструктора объекта Date. Если теперь попробовать просмотреть ряд объектов date, JavaScript преобразует соответствующие значения в строку, содержащую время текущего часового пояса, заданную согласно настройкам папки Панель управления компьютера пользователя. Часы персонального компьютера представляют текущие дату и время в таком виде, как они задаются на экране обычных часов даже несмотря на то, что JavaScript управляет временем в миллисекундах соответственно времени Гринвичского меридиана. Тем не менее, в результате применения некоторых методов к экземпляру объекта даты, из него можно извлечь отдельные компоненты даты. В таблице 1 приведен краткий список соответствующих свойств и их описания. В методах, используемых для задания даты те, что содержат в названии set можно заметить одну интересную особенность. Вместо того чтобы возвращать какое-то новое значение, эти методы, фактически, изменяют значение экземпляра объекта даты, на который сделана ссылка при вызове метода. Работа с датой подразумевает использование значений объектов. Значения эти, как уже отмечалось, указаны в миллисекундах. Это позволяет легко складывать, вычитать и сравнивать даты. В целях демонстрации методов управления датой и временем приведен листинг 1. В нем на загружаемой странице отображаются текущие дата и время. В другом сценарии производится расчет даты и времени на семь дней вперед по сравнению с текущей датой и временем. В теле документа первый сценарий запускается при загрузке страницы, определяя глобальную переменную today , значение которой равно текущей дате и времени. Строковый ее эквивалент отображается на странице. Во втором сценарии упомянутого раздела метод document. Эта функция использует глобальную переменную today и копирует ее значение в миллисекундах в новую переменную todayInMS. Для вычисления даты через семь дней после текущей в следующем операторе к текущей дате в миллисекундах добавляется число миллисекунд в семи днях 60 секунд умножить на 60 минут, умножить на 24 часа, умножить на 7 дней и умножить на миллисекунд. Далее в сценарии задается новый экземпляр объекта с рассчитанным суммарным числом миллисекунд. С этой целью вызывается конструктор объекта Date с данным числом миллисекунд в качестве параметра. Возвращаемым значением является объект даты, который автоматически преобразуется к строковому типу для отображения на странице. Создание с помощью JavaScript нового объекта даты с подсчитанным числом миллисекунд - более надежный вариант, чем простое числовое добавление 7 дней к значению, возвращаемому методом getDate объекта даты. JavaScript автоматически определяет количество дней в данном месяце и другие подобные параметры. Тех, кто будет и дальше использовать в своих сценариях даты, ждет много откровенных неожиданностей в поведении дат и непредвиденных сложностей. Однако, конечный результат стоит затраченных усилий. Будьте очень внимательным при работе со значениями, диапазон возможных изменений которых начинается с нуля. Особенно это касается месяцев. Методы getMonth и setMonth могут возвращать в качестве значения нуль. Так что соответствующее число на единицу меньше, чем номер месяца например, январю соответствует 0, декабрю Заданный год минус Четырехзначное число для года, начиная с и позже dateObj. Четырехзначное число, определяющее год. Поддерживается броузерами начиная с четвертой версии dateObj. Задает год минус


Сайт триколор тв интернет
Альфа банк конвертация валют
Что делать если у кота болит
Перспективный план логического мышления
Как сделать игровой домик своими руками
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment