Структура программ различных видов

Содержание

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

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

· функциональную спецификацию модуля (описание семантики функций, выполняемых этим модулем по каждому из его входов).

Функциональная спецификация модуля строится так же, как и функциональная спецификация ПС.

Структуры в C++ | struct C++. Разница между структурой и классом. Изучение С++ для начинающих.#129

В процессе разработки программы ее модульная структура может по-разному формироваться и использоваться для определения порядка программирования и отладки модулей, указанных в этой структуре. Поэтому можно говорить о разных методах разработки структуры программы. Обычно в литературе обсуждаются два метода [6, 7]: метод восходящей разработки и метод нисходящей разработки.

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

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

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

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

СТРУКТУРЫ — ТВОЯ ГЛАВНАЯ ОШИБКА

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

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

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

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

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

Читайте также:
Какой программой открыть мрт

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

Особенностью рассмотренных методов восходящей и нисходящей разработок (которые мы будем называть классическими) является требование, чтобы модульная структура программы была разработана до начала программирования (кодирования) модулей. Это требование находится в полном соответствии с водопадным подходом к разработке ПС, так как разработка модульной структуры программы и ее кодирование производятся на разных этапах разработки ПС: первая завершает этап конструирования ПС, а второе — открывает этап кодирования. Однако эти методы вызывают ряд возражений: представляется сомнительным, чтобы до программирования модулей можно было разработать структуру программы достаточно точно и содержательно. На самом деле это делать не обязательно, если несколько модернизировать водопадный подход. Ниже предлагаются конструктивный и архитектурный подходы к разработке программ [7], в которых модульная структура формируется в процессе программирования (кодирования) модулей.

Рис. 2.1. Первый шаг формирования модульной структуры программы при конструктивном подходе.

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

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

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

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

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

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

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

Рис. 2.2. Второй шаг формирования модульной структуры программы при конструктивном подходе.

Рис. 2.3. Классификация методов разработки структуры программ.

В классическом методе нисходящей разработки рекомендуется сначала все модули разрабатываемой программы запрограммировать, а уж затем начинать нисходящее их тестирование [7], что опять-таки находится в полном соответствии с водопадным подходом. Однако такой порядок разработки не представляется достаточно обоснованным: тестирование и отладка модулей может привести к изменению спецификации подчиненных модулей и даже к изменению самой модульной структуры программы, так что в этом случае программирование некоторых модулей может оказаться бесполезно проделанной работой. Нам представляется более рациональным другой порядок разработки программы, известный в литературе как метод нисходящей реализации, что представляет некоторую модификацию водопадного подхода. В этом методе каждый запрограммированный модуль начинают сразу же тестировать до перехода к программированию другого модуля.

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

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

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

Читайте также:
Перед тобой слова которые встречаются во многих программах на языке паскаль как они переводятся

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

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

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

Подводя итог сказанному, на рис. 2.3 представлена общая классификация рассмотренных методов разработки структуры программы.

Контрольные вопросы

  1. Сформулируйте определение модуля.
  2. Перечислите основные характеристики модуля.
  3. Назовите известные вам методы разработки модульной структуры программы.
  4. Отметьте различия между подходами по разработке модульной структуры программы.
  5. Охарактеризуйте метод вертикального слоения.

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

Структура программного обеспечения (краткий общий обзор)

Любой компьютер состоит из технического обеспечения (hardware) и функционирует, решает задачи с помощью программного обеспечения (software).

Весь комплекс программ, которые можно использовать на ЭВМ конкретной модели называется программным обеспечением (ПО).

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

Рис. 1. Структура программного обеспечения для персонального компьютера

1. Системное ПО – программы обеспечения взаимодействия пользователя и компьютера.

1.1. Базовое системное ПО это программы без которых ПК не может функционировать в принципе. Нарушения в их работе приводят к неработоспособности всей системы.

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

Основными функциями ОС являются:

· выполнение очередного по приоритету задания и отслеживание очередности;

· управление распределением данных в памяти и извлечением их из памяти;

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

· восстановление работоспособности при сбоях;

· управление работой арифметико-логического командного устройства процессора.

Данные, привлекаемые при решении задач, ОС с помощью специальных программ отображает на реальные физические структуры, носители данных.

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

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

ОС бывают различного типа:

· однозадачные, используемые для решения в каждый момент времени только одной задачи;

· многозадачные мультипрограммной обработки, загружающие в ОЗУ последовательность (пакет) независимых задач, а затем решающие эти задачи по очереди, выделяя каждой из них ресурсы компьютера (память, процессор, внешнее устройство) на некоторый промежуток времени, например, на 0,1 с (за такой небольшой промежуток времени компьютер с быстродействием 1 млн операций в секунду и очередностью в 10 программ, в каждой программе произведет около 100000 операций);

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

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

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

1.2. Дополнительное системное ПО это программы без которых можно обойтись, но они делают работу на ПК более комфортной и приятной.

Файловые менеджеры – это интерфейсные системы обеспечения дружественного интерфейса между пользователями и программами. Т.е. это программы для работы с файловой системой ПК.

Пример. Наиболее ранняя интерфейсная система – Norton Commander (Нортон Коммандер, автор – Питер Нортон). Системы, подобные Norton Commander (NC), называются операционными оболочками и их можно отнести к инструментальным средам (инструментарий более удобного, комфортного интерфейса с ОС, с файловой системой, минуя утомительный командный язык ОС). Такая система позволяет визуально и удобно выполнять копирование, создание, удаление, переименование, перемещение, просмотр и поиск файлов и т.д. NC использует управляющие и функциональные клавиши, которым соответствуют определенные операции и отклики системы:

Более развитым отечественным аналогом NC для Windows-систем является, например, оболочка Total Commander.

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

К утилитам можно отнести

· программы оптимизации и контроля качества дискового пространства;

· программы восстановления информации, форматирования, защиты данных;

· коммуникационные программы, организующие обмен информацией между компьютерами;

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

· программы для записи CD-ROM, CD-R и многие другие.

2. Прикладное ПО — программы обеспечения решения конкретных прикладных задач пользователя. Прикладная программа — это любая конкретная программа, способствующая решению какой-либо задачи в пределах данной проблемной области.

Прикладная программа — это любая конкретная программа, способствующая решению какой-либо задачи в пределах данной проблемной области.

Читайте также:
Какие операционные программы бывают

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

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

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

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

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

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

Презентация на тему Структура программы и ее формат

Структура управляющей программыКаждая управляющая программа должна начинаться символом «Начало программы» (%), после которого должен стоять символ «Конец кадра», а затем кадр с соответствующим номером. Для современных систем ЧПУ это требование необязательно.

  • Главная
  • Разное
  • Структура программы и ее формат

Слайды и текст этой презентации

Слайд 1Структура программы и ее формат

Структура программы и ее формат

Слайд 2Структура управляющей программы
Каждая управляющая программа должна начинаться символом «Начало программы»

(%), после которого должен стоять символ «Конец кадра», а затем

кадр с соответствующим номером. Для современных систем ЧПУ это требование необязательно.

Каждый кадр представляет собой последовательность слов (адресов).

Первым словом любого кадра является номер кадра (N).

Каждое слово в кадре управляющей программы должно состоять из:
символа адреса (латинская прописная буква);
математического знака «Плюс» или «Минус» (при необходимости);
последовательности цифр.

Структура управляющей программыКаждая управляющая программа должна начинаться символом «Начало программы» (%), после которого должен стоять символ «Конец

Слайд 3Значения символов адресов

Значения символов адресов

Слайд 4Положение десятичной запятой
Слова в управляющей программе должны быть записаны

одним из двух способов:
без использования десятичного знака (подразумеваемое положение

десятичной запятой);
с использованием десятичного знака (явное положение десятичной запятой).

Положение десятичной запятой Слова в управляющей программе должны быть записаны одним из двух способов: без использования десятичного

Слайд 5Положение десятичной запятой
Подразумеваемое положение десятичной запятой определено в характеристиках

формата конкретного УЧПУ.
При записи слов с использованием десятичного знака могут

быть опущены незначащие нули, стоящие до и (или) после знака.
Например: Х.03 означает размер 0,03 мм по оси X; X 1030. означает размер 1030,0 мм по оси X.
При записи слов с подразумеваемой десятичной запятой с целью сокращения количества информации рекомендуется опускать нули, стоящие перед первой значащей цифрой (ведущие нули).

Положение десятичной запятой Подразумеваемое положение десятичной запятой определено в характеристиках формата конкретного УЧПУ.При записи слов с использованием

Слайд 6Значения управляющих символов и знаков

Значения управляющих символов и знаков

Слайд 7Значения управляющих символов и знаков

Значения управляющих символов и знаков

Слайд 8Правила составления программы
Управляющую программу рекомендуется составлять таким образом, чтобы в

кадре записывалась только та геометрическая, технологическая и вспомогательная информация, которая

меняется по отношению к предыдущему кадру.
Любая группа символов, не подлежащая отработке на станке, должна быть заключена в круглые скобки. Внутри скобок не должны применяться символы «Начало программы» и «Главный кадр».
Например, группа символов, заключенная в скобки, может быть выведена на дисплей и служить в качестве указаний оператору:
N020 T1 M6 (проверить в позиции №1 сверло Ø20 мм)
Управляющая программа должна заканчиваться символом «Конец программы» (М02) или «Конец информации» (М30). Информация, помещенная после символа «Конец информации», не воспринимается УЧПУ.

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

Слайд 9Структура кадров
Информационные слова в кадре рекомендуется записывать в следующей последовательности:

слово (или слова) «Подготовительная функция»;
слова «Размерные перемещения», которые рекомендуется

записывать в последовательности символов X, Y, Z, U, V, W, P, Q, R, А, В, С;
слова «Параметр интерполяции или шаг резьбы» I, J, К;
слово (или слова) «Функция подачи», которое относится только к определенной оси и должно следовать непосредственно за словами «Размерное перемещение» по этой оси. Слово «Функция подачи», относящиеся к двум и более осям, должны следовать за последними словами «Размерное перемещение», к которым они относятся;
слова «Функция главного движения»;
слово (или слова) «Функция инструмента»;
слово (или слова) «Вспомогательная функция».

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

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

Структура кадровИнформационные слова в кадре рекомендуется записывать в следующей последовательности: слово (или слова) «Подготовительная функция»; слова «Размерные

Слайд 10Структура слов. Размерные слова
Для указания линейных перемещений используются слова

X, Y, Z. Если на станке имеется несколько суппортов, то

для указания перемещений второго суппорта по осям используются адреса U, V, W соответственно, для третьего – P, Q, R.
Все линейные перемещения выражены в миллиметрах и их десятичных долях.
Для указания угловых перемещений используются адреса A, B, C. Адрес А задает величину поворота вокруг оси X и т. д.
Все угловые размеры должны быть выражены в радианах (или в градусах). Допускается угловые размеры выражать в десятичных долях оборота.
Если УЧПУ допускает задание размеров в абсолютных значениях, положительных или отрицательных, в зависимости от начала системы координат, то математический знак («Плюс» или «Минус») является составной частью слова «Размерное перемещение» и должен предшествовать первой цифре каждого размера.
Если УЧПУ допускает задание размеров в приращениях, то математический знак («Плюс» или «Минус») должен предшествовать первой цифре каждого размера, указывая направление перемещения.

Структура слов. Размерные слова Для указания линейных перемещений используются слова X, Y, Z. Если на станке имеется

Слайд 11Структура слов. Функция подачи и главного движения
Скорость подачи указывается

словом F, скорость главного движения указывается адресом S и должны

кодироваться числом, количество разрядов которого должно быть указано в формате конкретного УЧПУ.
Выбор типа подачи должен осуществляться одной из следующих подготовительных функций: «Подача в функции обратной времени» (G93); «Подача в минуту» (G94); «Подача на оборот» (G95).
Выбор вида функционирования главного движения (там, где это необходимо) должен осуществляться одной из следующих подготовительных функций: «Постоянная скорость резания» (G96); «Обороты в минуту» (G97).
Существует два основных метода указания величины подачи и скорости: путем указания кода (F22 – подача 0,5 мм/об) и в явном виде (F0,5).

Структура слов. Функция подачи и главного движения Скорость подачи указывается словом F, скорость главного движения указывается адресом

Слайд 12Структура слов. Функция инструмента
Слово «Функция инструмента» (Т) используется для выбора

инструмента.
Допускается использовать эти слова для коррекции (или компенсации) инструмента.

В этом случае, слова «Функция инструмента» будут состоять из двух групп цифр (Т 01 01). Первая группа цифр используется для выбора инструмента, вторая – для коррекции инструмента.
Если для записи коррекции (компенсации) инструмента используется другой адрес, рекомендуется использовать символ D или Н.
Количество цифр, следующих за адресами Т, D и Н должно быть указано в формате конкретного УЧПУ.

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

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