double arrow

Лекция 11. Рабочее время и время отдыха

Задание

Разработать программу для решения следующей задачи:

имеется три действительных числа, представляющих собой длины трех

отрезков.

Определить, можно ли построить из них треугольник и будет ли он

прямоугольным.

Составим СПЕЦИФИКАЦИЮ программы:

1. Название задачи

Треугольник.

Название программы - Tr.

Система программирования - Турбо Паскаль.

Компьютер - IBM PC AT/486 и выше.

2. Описание задачи

Даны три действительных положительных числа a, b и c. Определить:

1. Можно ли построить треугольник из отрезков, длина которых соответственно равна a, b и c

2. Является ли этот треугольник прямоугольным?

3. Математическая модель задачи.

Известно, что условием существования треугольника является выполнение всех неравенств:

b + c > a

c + a > b (1)

a + b > c.

Если все неравенства (1) выполняются, то треугольник будет прямоугольным при выполнении хотя бы одного из равенств

a * a = b * b + c * c

b * b = c * c + a * a (2)

c * c = a * a + b * b.

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

|a * a - (b * b + c * c)|/(a * a) < e

|b * b - (c * c + a * a)|/(b * b) < e (3)

|c * c - (a * a + b * b)|/(c * c) < e

Здесь e - малая величина, определяющая относительную погрешность вычислений. Гипотенузе прямоугольного треугольника будет соответствовать переменная, стоящая первой в левой части того неравенства, которое выполняется (переменная a, b или c).

4. Управление режимами работы

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

5. Входные данные

Положительные числа a, b, с и относительная погрешность e. Они должны иметь вещественный тип.

6. Выходные данные

а) На дисплей должна выдаваться справочная информация о назначении программы

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

- "Это не треугольник"

- "Это прямоугольный треугольник с гипотенузой (далее указывается численное значение гипотенузы"

- "Это не прямоугольный треугольник"

7. Ошибки

При вводе чисел a, b, c и относительной погрешности e надо предусмотреть контроль:

- соответствия их типу real

- знака вводимых чисел a, b и c

- диапазона изменения значения относительной погрешности e

(0 < e < 1).

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

Проектируем алгоритм.

НИСХОДЯЩАЯ РАЗРАБОТКА

Подумаем, какие должны быть основные уровни:

- ввод ошибки (Epsilon)

- ввод чисел (Input)

- определение типа треугольника

- вывод результатов (Result)

Структурная диаграмма программного комплекса, соответствующая сокращенному варианту программы, приведена на рис.

рис.

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

Теперь подумаем о последовательности выполнения.

(2) Последовательность обработки входных данных этими программными модулями представлена в виде схемы потоков данных

рис.

Описание алгоритма в виде блок-схем.

Блок-схема управляющего программного модуля показана на следующем

Рисунке (3)

рис

Блок-схема управляющего программного модуля соответствует сложному алгоритму, в который входят унифицированные структуры СЛЕДОВАНИЕ, ВЕТВЛЕНИЕ ПОЛНОЕ и ЦИКЛ ДО.

Блок-схемы программных модулей первого уровня показаны на следующих рисунках.

(4) Программный модуль Epsilon соответствует линейному алгоритму и

состоит из унифицированных структур СЛЕДОВАНИЕ

рис

Программный модуль Input соответствует разветвляющемуся алгоритму.

В него входят унифицированные структуры СЛЕДОВАНИЕ и ВЕТВЛЕНИЕ НЕПОЛНОЕ.

рис

Программный модуль Process соответствует разветвляющемуся алгоритму.

В него входят унифицированные структуры СЛЕДОВАНИЕ и ВЕТВЛЕНИЕ НЕПОЛНОЕ

рис.

Программный модуль Result соответсвует разветвляющемуся алгоритму.

Он состоит из унифицированных структур СЛЕДОВАНИЕ и ВЕТВЛЕНИЕ ПОЛНОЕ.

рис.

Теперь можно программировать. Структурное кодирование.

программа

PROGRAM Tr;

USES Crt;

VAR

a, b, c: REAL; {значения отрезков}

Flag: REAL; {вспом. переменная}

Hyp: REAL; {гипотенуза}

e: REAL; {погрешность}

{------------------------

Ввод относительной ошибки

-------------------------}

PROCEDURE Epsilon;

BEGIN

CLRSCR;

WRITE('Введите погрешность...');

READLN (e);

END;

{-------------------------

Ввод отрезков и их проверка

--------------------------}

PROCEDURE Input;

BEGIN

WRITELN;

WRITELN('Введите значения сторон');

WRITELN;

WRITE ('a = ');

READLN (a);

WRITE ('b = ');

READLN (b);

WRITE ('c = ');

READLN (c);

Flag:=1; {это треугольник}

IF NOT ((b+c)>a) then Flag:=0;{это не треугольник}

IF NOT ((c+a)>b) then Flag:=0;{это не треугольник}

IF NOT ((b+a)>c) then Flag:=0;{это не треугольник}

END;

{-----------------------------

Процедура проверки является ли

треугольник прямоугольным

------------------------------}

PROCEDURE Process;

BEGIN

Hyp:=0; {Если Hyp=0, то это не

прямоугольный треугольник.

Иначе - прямоугольный}

IF (ABS(a * a - (b * b + c * c))) / (a * a) < e

THEN Hyp:=a;

IF (ABS(b * b - (a * a + c * c))) / (b * b) < e

THEN Hyp:=b;

IF (ABS(c * c - (b * b + a * a))) / (c * c) < e

THEN Hyp:=c;

END;

{---------------------

Вывод сообщений

----------------------}

PROCEDURE Result;

BEGIN

WRITELN;

IF Hyp <> 0

THEN WRITE('Это прямоугольный треугольник с '+

'гипотенузой ', Hyp:5:2)

ELSE WRITE ('Это не прямоугольный треугольник');

END;

{-----------------------

Управляющая программа

------------------------}

BEGIN

Epsilon;

Input;

IF Flag = 1 THEN

BEGIN

Process;

Result;

END

ELSE WRITE('Это не треугольник');

GOTOXY(1, 20);

WRITE('Для завершения - пробел');

REPEAT UNTIL KeyPressed;}

END.

16.1.3. Стратегия программирования "снизу-вверх"

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

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

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

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

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

Стратегия "изнутри - наружу".

Заключается в разработке сначала наиболее сложных блоков, затем более простых.

Основные требования - время и память.

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

Примеры: 1) в трансляторах значительную долю общего объема составляют однородные модули, реализующие отдельные конструкции входного языка.

2) в текстовых редакторах - процедуры, выполняемые при нажатии функциональных клавиш

3) при моделировании некоторой установки или явления - модули, учитывающие различные физические эффекта.

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

стр. 185 Горбунов

Объектно-ориентированное проектирование

Объектно-ориентированный подход состоит из объектно-ориентированного анализа (OOA), объектно-ориентированного проектирования (OOP)и объектно-ориентированного программирования(OOP).

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

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

Основные принципы ООП:

- наследование

- полиморфизм

- инкапсуляция

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

Полиморфизм заключается в возможности вызова для данного объекта при необходимости одноименных методов классов-предков.

(См. ниже в описании синтаксиса оператор указания диапазона).

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

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

CASE - технологии

Под CASE- технологией понимается совокупность средств автоматизации

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

анализа предметной области, программирования и эксплуатации ИС.

Инструментальные средства CASE- технологий применяются на всех

этапах жизненного цикла системы (от анализа и проектирования до

внедрения и сопроволдения), значительно упрощая решение возникающих

задач.

CАSE- технология позволяет отделить проектирование информацион-

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

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

отвлекаясь на детали. Это позволяет не допустить ошибок уже на

стадии проектирования и получить более совершенные программные

продукты. Эта технология изменяет все стадии разработки ИС, более

всего отражаясь на этапах анализа и проектирования.

Нередко применение CASE- технологии выходит за рамки проектирования

и разработки ИС. Технология дает возможность оптимизировать модели

организационных и управленческих структур компаний и позволяет

им лучше решать такие задачи, как планирование, финансирование,

обучение. Таким образом, CASE- технология позволяет произвести ради-

кальное преобразование деятельности компании, направленное на оптима-

льную реализацию того или иного проекта или повышение общей эффектив-

ности бизнеса.

Коллективная работа над проектом предполагает обмен информацией,

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

рование, взаимодействие и управление. Фундаментом реализации подоб-

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

обычно называют репозитарием. По существу, репозитарий - это

информационный архив, где хранятся сведения о процессах, данных

и связях объектов в разрабатываемом приложении.

В различных CASE-технологиях репозитарий реализуется по-разному и

может содержать описания и модели данных, а также правила их обра-

ьотки. Репозитарий является важнейшим компонентом набора инструмен-

тальных средств CASE и служит источником информации, необходимой

для автоматизации построения проектируемых систем и генераций при-

ложений. Кроме того, CASE-продукты на базе репозитария позволяют

разработчикам использовать в работе над проектом и другие инстру-

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

В настоящее время CASE-технологии - одна из наиболее динамично

развивающихся отраслей информатики, объединяющая сотни компаний.

Из имеющихся на рынке CASE-технологий можно выделить:Application

Development Workbench (ADW) фирмы Knowledge Ware, BPwin и ERwin,

CDEZ Tods (Oracle), Clear Case (Alria Software), Composer (Texas

Instrument), Discover Development Information System (Software

Emancipation Technology).

Современные CASE-технологии успешно применяются для создания

автоматизированных ИС различного класса:банки, финансовые корпо-

рации, крупные фирмы. Они обычно имеют достаточно высокую стои-

мость и требуют длительного обучения и кардинальной реорганизации

всего процесса создания АИС. Тем не менее экономический эффект

применения CASE-технологий весьма значителен, и большинство сов-

ременных серьезных программных проектов осуществляется именно с

их помощью.

СПОСОБЫ ЗАПИСИ АЛГОРИТМОВ

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

способы его описания. Они различаются наглядностью, компактностью,

степенью формализации, ориентацией на машинную реализацию и исполь-

зование другими пользователями.

В практике программирования наибольшее применение получили

следующие формы записи алгоритмов:

- словесная и формульно - словесная;

- блок - схемы, структурограммы и Р-схемы;

- псевдокоды и решающие таблицы;

- язык операторных схем;

- языки программирования.

Все формы кроме последней являются вспомогательными.

Любая из форм представления алгоритмов должна содержать следую-

щие элементы:

- начало и конец вычислительной схемы;

- объекты(данные), над которыми выполняются действия, и резуль-

таты выполнения алгоритма;

- этапы(шаги) преобразования данных с формализованной записью

их содержания;

- указания о последовательности выполнения этапов и отдельных

шагов алгоритмического процесса.

СЛОВЕСНАЯ ФОРМА используется для алгоритмов, ориентированных на

исполнителя - человека. Здесь содержание последовательных этапов вы-

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

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

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

с первого.

ФОРМУЛЬНО-СЛОВЕСНЫЙ способ использует помимо словесного описания

еще математические символы и выражения.

Предполагается, что отдельные шаги выполняются в последовательности

их записи, если нет указаний обхода определенных шагов.

Пример классического алгоритма Евклида для нахождения наибольшего

ОД двух положительных (не равных нулю) чисел А и В.

ПРИМЕР. ШАГ 1. Начало вычислительного процесса.

ШАГ 2. Ввод значений А и В.

ШАГ 3. Если А = В, то перейти к ш. 5, иначе к ш. 4.

ШАГ 4. Если А > В, то А = А-В, иначе В=В-А. Перейти к ш.3.

ШАГ 5. Вывод результата: "НОД значений А, В "равно" А.

ШАГ 6. Конец вычислительного процесса.

Недостатком словесного способа записи алгоритма является отсутст-

вие более или менее строгой формализации и наглядности вычислитель-

ного процесса.

ПРЕИМУЩЕСТВО - можно описывать алгоритм с произвольной степенью

детализации.

Формульно-словесный также обеспечивает любую степень детализации,

но он более компактен и нагляден.

БЛОК - СХЕМЫ и СТРУКТУРОГРАММЫ

Блок-схемы представляют алгоритм в наглядной графической форме.

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

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

Блок - схемы вы отчасти знаете, мы на них останавливаться

не будем. Только запишем ГОСТ 19.707-90 На экзамене будет вопрос.

Рис

Ссылка на методичку 1936. Стр. 17 - 24 изучить самостоятельно.

Р - схемы описываются в ГОСТе 19.005-85

Структурограммы

Для изображения алгоритмов используются как и в блок-схемах

специальные блоки. Каждый блок имеет форму прямоугольника и может

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

Блоки дополняются элементами словесной записи с помощью предложений

на естественном языке или с использованием математических обозна-

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

хода goto

1. Блок обработки(вычислений). Каждый символ структурограммы

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

прямоугольник внутри любого символа представляет собой также блок

обработки.

2. Блок следования. Этот символ объединяет ряд следующих друг за

другом процессов обработки.

3. Блок решения. Применяется для обозначения структуры типа раз-

ветвления. Условие располагается в верхнем треугольнике, варианты

решения - по сторонам треугольника, а процессы обработки обозна-

чаются прямоугольниками слева и справа.

Если в блоке решения отсутствует одна из ветвей, то применяется

сокращенный блок решения.

4. Блок варианта. Этот символ представляет расширение блока решения.

Те варианты выхода из этого блока, которые можно сформулировать точно,

размещаются слева. Остальные объединяются в один, называемый выходом

по несоблюдению условий и расположенный справа. Если нужно перечислить

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

совсем опустить.

5.Блок цикла с предусловием. Этот символ обозначает циклическую

конструкцию с проверкой условия в начале цикла. Условие окончания

цикла размещается в верхней полосе, сливающейся с левой полосой,

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

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

закон изменения параметра цикла.

6. Блок цикла с постусловием. Этот символ аналогичен блоку цикла с

предусловием, но условие располагается внизу.

Сравнить блок-схему и структурограмму алгоритма Евклида

Р- схемы описываются ГОСТом 19.005-85.

ПСЕВДОКОД это частично формализованная запись для наглядного

представления схем алгоритмлв и программ, разрабатываемых в соот-

ветствии с общими принципами структурного программированияю. стр. 18

методички 1936.

Он ориентирован на человека и занимает промежуточное место между

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

синтаксические правила для записи команд. Вместе с тем имеются некоторые

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

Рис.

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

логического типа, в которых требуется проверка многочисленных логи-

ческих условий.

ОПЕРАТОРНАЯ СХЕМА - это аналитическая форма представления алгоритма

с помощью операторов, описывающих содержание некоторых автономных

этапов или детальных шагов вычислительного процесса.

Предполагается, что каждый такой этап реализуется посредством

арифмитического оператора А, выполняющего вычисления, и логического

оператора Р(условие), проверяющего соблюдение определенных условий.

Дополняют еще специальными операторами V - ввод, W - вывод, С - конец

и т.д. В П О

Такая схема является логической схемой программы.

Минимальные правила формализации:

- каждый оператор имеет порядковый номер в виде индекса;

- операторы выполняются в естественном порядке - слева напрво;

- если нет передачи управления оператору справа, то между

ними указывается;

- при выполнении логического оператора очередным становится

оператор, записанный справа от него, иначе подлежащий выполнению

оператор указывается стрелкой.

Рис.

где V1 - ввод значений А и В. Р3 - проверка условия; А5 и А6 - вычисление

значений А-В и В-А. W - вывод результатов.

Программа на Паскале.

БАЗОВЫЕ (СТАНДАРТНЫЕ) ТИПЫ ДАННЫХ

Данные различаются между собой

1) способом кодирования;

2) набором допустимых компьютерных операций над ними.

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

метические операции, а с символами это лишено смысла.

При программировании основой для классификации данных служит

набор допустимых операций над данными, а не способ их представ-

ления в памяти.

Все данные, для которых допустим определенный набор компь-

ютерных операций, объединим в один класс и дадим этому классу имя

(название). Такой поименованный класс назовем базовым типом дан-

ных.

Для описания базового типа нужно

1) составить функциональное описание базового типа.Охарактери-

зовать каждую допустимую операцию, т.е. сформулировать правило опре-

деления значения результатат для всех возможных значений участвующих

в ней данных.

2) каждый базовый тип имеет определенную физическую реализа-

цию в компьютере, т.е. способы кодирования и доступы к значениям

данных.

Перечень всех возможных значений данных и характеристики

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

описание базового типа.

Кроме того каждый базовый тип имеет определенную физическую

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

чениям данных.

Обычно пользователь имеет возможность оперировать с несколькими

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

моделью компьютера, сколько применяемыми средствами программиро-

вания.

Какие же типы данных обычно бывают базовыми? Базовыми данными

являются как правило, переменные, перечисление, интенрвал. А базо-

выми типами: целый,вещественный, булевый, символьный.

Абстрактные типы данных (структуры)

На практике исходные данные, промежуточные и окончательные ре-

зультаты удобнее представлять не в виде базовых типов данных, а с

помощью более сложных структурных единиц.

Под абстрактным типом данных (структурой) понимается поименованная

совокупность данных, которые имеют один и тот же набор допустимых

операций.

Перечень и характеристики всех операций представляют собой функ-

циональное описание структуры.

Описание отдельных составляющих элементов исходной структуры,

представляющих более простые структуры и даже базовые типы, а также

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

простыми элементами называется логическим описанием исходной структу-

ры.

Последний уровень описания структуры данных - физическое представ-

ление, которое дает способы хранения структур в памяти, доступа к ним,

а также выполнения операций.

К абстрактным структурам данных относятся массивы, строки, запись,

файл, структура, смесь(объединение). стр.62

Массивы представляют собой переменные с индексами и служат для

описания структур, состоящих из множества элементов, упорядоченных

в соответствии со значениями индексов. Причем массивы в зависимости

от числа индексов различают одномерные (один индекс), двумерные и т.д.

Массив можно представить как папку с пронумероваванными докумен-

тами (информацией), каждый из которых может быть прочитан или заменен

на другой.

С функциональной точки зрения простейший массив Т - это совокупность

N элементов одинаковой структуры, каждому из которых поставлен в соот-

ветствие порядковый номер 1, 2,...., N, называемый индексом. Для мас-

сива Т определены следующие операции:

- создание массива Т, имеющего N элементов, значения которых иногда

бывают еще не определены;

- чтение элемента с заданным индексом i = 1, 2,..., N,

результатом котрых является элемент Т(i), имеющий этот индекс, а также

исходный массив Т;

- замена элемента массива с данным индесом i на данный элемент G, в

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

наличием элемента G на i-м месте (T(i)=G).

Логическое описание массива представлено на рис. 1, а физическое

представление - на рис.2.

Рис. 3.13 и 3.14 стр.67 в Ларионове.

Строка - это последовательность символов. Операции со строками вы-

ражаются через операции с символамит: операция присоединения двух

строк, сравнения, вырезания слева, справа и из строки подстроки и т.д.

Динамические структуры данных

К динамическим структурам данных относятся стек, дек, очередь,

список.

Испытания. Контрольные примеры. Сквозной контроль.

(из файла treugol.doc)

Пример 2. Требуется написать программу, которая по времени начала отсчета и числу прошедших секунд выдаст время остановки секундомера согласно 24-часовому исчислению времени. Например, если секундомер был пущен в 1 час дня (13 часов) и число прошедших секунд равно 3662, то результат будет 14 часов 1 мин. и 2 сек.

Вначале надо понять задачу.

Задача понятна!!! Приступаем.

Разбиваем задачу на крупные шаги:

1. Прочитать время пуска секундомера и число прошедших секунд.

2. Вычислить время остановки секундомера.

3. Изобразить это время на экране.

Теперь надо эти три шага рассмотреть вместе и убедиться, что

они выполняют требуемую обработку. Затем надо рассмотреть каждый шаг по

очереди и по мере необходимости детализировать его.

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

на экране приглашения и ввода времени пуска и числа прошедших секунд.

Значит этот шаг детализировать не нужно.

А вот, чтобы перевести 2-й шаг на язык программирования нужны дополнительные рассуждения. Этот шаг можно рассматривать отдельно и дополнить деталями его выполнения.

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

пуска. Если при сложении число минут превысит 59, то надо уменьшить его на 60 и увеличить число прошедших часов на единицу. Наконец, число прошедших часов надо добавить ко времени пуска и скорректировать результат в том случае, если произойдет переход на следующие сутки.

Деление нацело можно проделать с помощью операции DIV, а отыскание остатка - с помощью операции MOD. Обсудив способ реализации указанный на шаге 2 обработки можно написать следующий план этого шага:

1) Вычислить число прошедших минут и секунд. Добавить число прошедших секунд ко времени пуска, корректируя в случае необходимости число прошедших минут и счетчик минут времени остановки секундомера.

2) Вычислить число прошедших часов и минут. Добавить число прошедших минут ко времени пуска, корректируя в случае необходимости число прошедших часов и счетчик минут времени остановки секундомера.

(Отметить в программе)

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

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

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

sekunda;

(* Эта программа читает время пуска секундомера и число прошедших

секунд и изображает на экране время остановки секундомера *)

var

Максимальный диапазон секундомера от 0 до 32767

p_t:0..maxint; прошедшее время в секундах

sek,s,min,m:0..118; (59*2)

has,h:0..48;

begin

writeln('Введите время пуска секундомера');

write('Часы = ');

readln(has);

write('Минуты = ');

readln(min);

write('Секунды = ');

program readln(sek);

writeln('Введите прошедшее время в секундах');

readln(p_t);

s:=p_t mod 60; число прошедших минут

m:=p_t div 60;

sek:=sek+s;

m:=m+sek div 60; сложение минут с новым значением

sek:=sek mod 60; получение оставшихся секунд

p_t:=m;

m:=p_t mod 60;

h:=p_t div 60;

min:=min+m;

has:=has+min div 60;

min:=min mod 60;

has:=(has+h) mod 24;

writeln('Время остановки = ','часы',has:3,' мин',min:3,' сек',sek:3)

end.

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

Пример решения задачи не вычислительного характера Карасев В.

ТЕХНОЛОГИЯ ПРОГРАМИРОВАНИЯ.. 1

I. ЧТО ПЛАНИРУЕТСЯ. 1

II. ЛИТЕРАТУРА.. 1

1. СТРУКТУРА И СОСТАВ ПО ИС.. 14

2. КРИТЕРИИ КАЧЕСТВА ПРОГРАММ... 26

3. ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ ВВОДА-ВЫВОДА ИНФОРМАЦИИ ПРИ РАБОТЕ С ФАЙЛАМИ ДАННЫХ 37

4.1 Файлы и записи. 37

4.2. Обработка файлов данных в Паскале. 39

Однако для типизированных файлов и файлов без типа с по- 39

VAR.. 39

VAR.. 39

TYPE.. 39

VAR.. 40

VAR.. 40

VAR.. 40

Text_Inf: TEXT; 40

VAR.. 40

Например. 40

VAR.. 40

VAR.. 41

- для обновления. 41

Для записи информации в файл из программы служит процедура. 41

5.Чтение. 42

Процедура Read читает последовательность символов из файла. 42

VAR.. Ошибка! Закладка не определена.

При окончании работы всей программы происходит автоматичес- 43

Для явного завершения действий с файлом используется проце- 43

При этом ликвидируются внутренние буферы, образованные при. 43

VAR.. 44

IORESULT. 45

Данная функция возвращает целое число, соответствующее коду. 45

Коды ошибок, возвращаемые функцией IOresult, приведены в. 45

Удаление. 46

Добавление. 46

Изменение. 46

Просмотр. 46

Выход. 46

(3) Отображение введенных значений для подтвержения записи в файл или считанных из файла для просмотра. 46

Алгоритм.. 46

Какие еще возможны алгоритмы?. 47

- ввод нового значения числа жителей; 47

- читаем последовательно очередную запись в цикле пока не конец. 47

3) вывод данных. 57

Процедуры.. 57

Структуры данных. 57

Основной файл. 57

PROGRAM T_2F; 58

USES CRT; 58

TYPE.. 58

END; 58

VAR.. 58

Fname – ВХОДНОЙ ПАРАМЕТР – ИМЯ ОСНОВНОГО ФАЙЛА.. 58

END; 59

END; 59

ПРОЦЕДУРА ВВОДА ФАЙЛА СПРАВОЧНИКА.. 59

Fname – ВХОДНОЙАРАМЕТР ИМЯ ФАЙЛА.. 59

BEGIN.. 59

BEGIN.. 59

END; 59

END; 59

ПРОЦЕДУРА ВЫВОДА РЕЗУЛЬТИРУЮЩЕЙ ТАБЛИЦЫ... 59

BEGIN.. 60

END; 60

END; 60

BEGIN.. 60

CLRSCR; 60

READLN; 61

END. 61

4. МЕСТО И РОЛЬ ТЕХНОЛОГИИ ПРОГРАММИРОВАНИЯ.. Ошибка! Закладка не определена.

В ПРОГРАММИРОВАНИИ.. Ошибка! Закладка не определена.

5. Жизненный цикл и этапы разработки ПО.. 61

Рисунок. 61

Рисунок. 62

Процессы.. 62

Стадии. 63

Анализ Проектирование Реализация ТестированиеВнедрениеэксплуатация. 63

Трудозатраты при классической разработке ПО, %... 69

6. Процессы классической технологии программирования. 69

6.1. ВОЗНИКНОВЕНИЕ И ИССЛЕДОВАНИЕ ИДЕИ.. 70

6.3 Постановка задачи(УСТАНОВЛЕНИЕ и анализ ТРЕБОВАНИЙ) И ПРОЕКТИРОВАНИЕ.. 71

B = B – A.. 87

Конец если. 87

Пример с вычислением площади крышки стола. 88

6.4. ПРОГРАММИРОВАНИЕ (РЕАЛИЗАЦИЯ, КОДИРОВАНИЕ) 88

Порядок разработки программного модуля. 88

Самостоятельно. 89

Классификация языков программирования. 89

На выбор языка программирования влияют следующие основные факторы.. 89

Самостоятельно. 91

Провила оформления программ на Паскале, на Delphi 91

6.5. Тестирование и отладка. 92

6.6. УПРАВЛЕНИЕ и разработка документации. 92

6.7. Испытания, ввод в эксплуатацию.. 92

6.8.ЭКСПЛУАТАЦИЯ и СОПРОВОЖДЕНИЕ. 93

6)программирование заново. 94

Пример решения вычислительной задачи. 95

Тогда 0.2*x1 + 0.3*x2 - это количество произведенных из этих заготовок продукта 1. Также. 96

Сложим 1-е и 2-е неравенства получим неравенство. 97

7. ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ СОРТИРОВКИ ИНФОРМАЦИИ.. 98

7.1. Постановка задачи сортировки. 98

F(XLi) < F(XLj), если K(XLi)=K(XLj) при i < j. 99

7.2. Классификация алгоритмов сортировки. 99

В настоящее время известно несколько десятков различных. 99

1) Все методы сортировки в зависимости от структуры информации. 99

2) В сравнительных методах элементы сортируются по относительной. 99

4) В зависимости от используемого метода сортировки упорядоченная. 99

5) Кроме того, исходная последовательность может быть задана вся. 100

Процесс сортировки записей состоит из просмотров и сравнений. 100

7.3. Сортировка обменом.. 100

7.3.1. Метод стандартного обмена. 100

Этот метод основан на попарном сравнении ключей соседних. 100

Так как на каждом из просмотров очередные наибольшие элементы.. 101

Алгоритм А. 101

I=2; 4 1 5 2 3. 101

I=3; 4 1 2 5 3. 101

J=2, I=1; 1 4 2 3 5. 101

I=2; 1 2 4 3 5. 101

I=3; 1 2 3 4 5. 101

J=3, I=1; 1 2 3 4 5. 101

I=2; 1 2 3 4 5. 101

I=3; 1 2 3 4 5. 101

J=4, I=1; 1 2 3 4 5. 101

I=2; 1 2 3 4 5. 101

I=3; 1 2 3 4 5. 101

Пример сортировки файла в программе о городах. 101

Второй просмотр идентичен первому лишь с той разницей, что он. 101

Алгоритм Б. 102

I=2; 4 1 5 2 3. 102

I=3; 4 1 2 5 3. 102

J=2, I=1; 1 4 2 3 5. 102

I=2; 1 2 4 3 5. 102

I=3; 1 2 3 4 5. 102

J=3, I=1; 1 2 3 4 5. 102

I=2; 1 2 3 4 5. 102

J=4, I=1; 1 2 3 4 5. 102

Пример программы с городами и файлами. 102

Алгоритм В. 102

Структурограмма алгоритма сортировки методом стандартного. 102

I=2; 4 1 5 2 3. 103

I=3; 4 1 2 5 3. 103

FLAG=1. 103

J=2, FLAG=0; I=1; 1 4 2 3 5. 103

I=2; 1 2 4 3 5. 103

I=3; 1 2 3 4 5. 103

FLAG=1. 103

J=3, FLAG=0; I=1; 1 2 3 4 5. 103

I=2; 1 2 3 4 5. 103

FLAG=0. 103

Т.е. сократили число просмотров. 103

Процедура реализации. 103

J:=1; 103

K [I]:= K [I + 1]; 103

Качественные: 103

7.3.2. Метод Шелла. 104

Пример. Исходная последовательность. 105

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 105

K(1) K(5) K(9) 105

K(3) K(7) 105

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 105

Затем шаг J сокращается вдвое и становится равным 2. Образуются. 105

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 105

Затем снова J сокращается вдвое и становится равным 1. При. 105

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 105

7.3.3. Челночная сортировка. 106

I=1; 106

I=2; 106

I=1; 106

I=3; 106

I=2; 106

I=1; 107

1. Число сравнений постоянно. 107

N*(N-1) /2. 107

2. Число обменов: 107

3. Дополнительный объем памяти требуется для запоминания одной записи при реализации операции обмена. 107

FLAG=0; 107

FLAG=1; I=0; 107

FLAG=0; 108

FLAG=1; I=1; 108

FLAG=1; I=0; 108

FLAG=0; 108

FLAG=1; I=2; 108

FLAG=1; I=1; 108

FLAG=0; 108

FLAG=0; 108

FLAG=1; I=3; 108

FLAG=1; I=2; 108

FLAG=0; 108

7.3.4. Шейкер-сортировка. 108

Особенность шейкер-сортировки заключается в том, что в отличие. 108

На 1-м просмотре производится сравнение ключей соседних запи- 108

При программировании: одна процедура - просто шаг разный. 109

I=1; 4 5 1 2 3. 109

I=2; 4 1 5 2 3. 109

M=4, FLAG=1; 110

L=4, FLAG=0; 110

I=4; 4 1 2 3 5. 110

I=3; 4 1 2 3 5. 110

M=2, FLAG=1; 110

R=2, FLAG=0; 110

I=2; 1 2 4 3 5. 110

I=3; 1 2 3 4 5. 110

L=3, FLAG=0; 110

I=3; 1 2 3 4 5; 110

R=3. 110

7.4. Сортировка выбором.. 110

7.4.1 простой линейный выбор (монеты, структурограмма, пример) 110

I=3; 111

I=4; 111

I=5; 111

J=2, I=3; 111

I=4; 111

I=5; 111

J=3, I=4; 111

I=5; 111

7.4.2 Линейный выбор с обменом.. 111

I=5; 112

J=2, L=2, 112

I=4; L=4, 112

J=3, L=3, 112

J=4, L=4, 113

7.5. Сортировка вставками. 114

При сортировке вставками записи просматриваются по одной и. 114

Известны следующие методы сортировки вставками: простая. 114

Все записи условно разделяются на две части - упорядоченную.. 114

7.5.1 Простая вставка. 114

Алгоритм сортировки простыми вставками производится в цикле. 114

Структурограмма алгоритма сортировки методом вставки представлена. 114

I=0. 114

I=1. 115

I=0. 115

I=2. 115

I=1. 115

I=3. 115

I=2. 115

7.5. 2. Метод Шелла (сортировка с убывающим шагом) 116

Структурограмма метода Шелла с сортировкой вставкой отдельных. 116

При Н = 1 – обычная вставка. 116

Пример. Исходная последовательность. 116

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 116

K(1) K(5) K(9), K(2) K(6), K(3) K(7) и K(4) K(8) 116

После упорядочения элементов внутри каждой последовательности. 116

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 116

Затем шаг H сокращается вдвое и становится равным 2. Образуются. 116

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 117

Затем снова H сокращается вдвое и становится равным 1. При. 117

К(1) К(2) К(3) К(4) К(5) К(6) К(7) К(8) K(9) 117

7.6. Сортировка слиянием.. 117

Сортировка слиянием является процессом объединения двух или. 117

В результате образуются примерно N/2 частей размером в два эле- 118

Ниже показано, как выполняется этот процесс на последова- 118

Исходный файл: [25] [57] [48] [37] [12] [92] [86] [33] 118

7.7. Сортировка таблицы адресов (индексная сортировка) 118

Объем данных, помещенных в каждую из записей файла, может. 118

Пример программы работы с файлом данных. 119

Пусть каждая запись файла данных содержит два поля: табельный номер. 119

Type. 119

Var 120

Var 120

Var 120

Var 121

{ Сортируем X }. 121

If X[wJ+1].Tn < X[wJ].Tn Then Begin. 121

{ Теперь записываем получившийся массив в Index.Dat }. 122

Begin. 122

Begin. 123

Index.dat 125

Внешняя сортировка. 125

НБ3. 125

Этот набор данных разбивается на два НБ1 и НБ2, например нечетные. 125

После 1-го цикла. 125

2L.. 125

После 2-го цикла. 125

НБ1. 126

7.8. Алфавитная сортировка. 126

- символы используемого алфавита имеют упорядоченные коды ASCI. 126

FLAG:0..1; 126

J:=1; 127

X[I]:=X[I+1]; 127

X[I+1]:=T; 127

FLAG:=1; 127

J:=J+1. 127

J:=1; 128

X[I]:=X[I+1]; 129

X[I+1]:=T; 129

FLAG:=1; 129

N.. 129

Примеры.. 130

8. МОДЕЛИ ЖИЗНЕННОГО ЦИКЛА ПО.. 130

Подходы на основе формальных преобразований: 131

Технологические подходы быстрой разработки: 131

8.1.КЛАССИЧЕСКИЕ КАСКАДНЫЕ ТЕХНОЛОГИЧЕСКИЕ МОДЕЛИ.. 131

8.1.1 Каскадная модель. 132

Процессы.. 132

.................................................................................................................................. Стадии. 132

8.1.2 Каскадно-вовратная модель. 134

Процессы.. 135

Стадии. 135

8.1.3 Каскадно-итерационная модель. 136

Процессы.. 136

Стадии. 137

8.1.4 Каскадная модель с подпроцессами. 138

Процессы.. 138

Стадии.. 139

Здесь требуется дополнительная фаза тестирования подсистем до. 140

8.1.5 Спиральная модель. 140

Процессы.. 140

Стадии. 141

10. ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ ПОИСКА ИНФОРМАЦИИ.. 143

10.1 Постановка задачи. 143

При реализации алгоритма поиска существуют две возможности его. 144

1) внешние и внутренние, статические и динамические, где статический. 144

Мы будем изучать внутренние, статические методы поиска, основанные. 144

10.2 Последовательный поиск. 144

10.3. Методы поиска в упорядоченных наборах данных. 146

Известны следующие методы поиска: бинарный, однородный бинар- 146

10.2.1 Бинарный поиск. 147

**] - означает верхнюю границу интервала поиска, соответствующую.. 148

10.2.2 Метод золотого сечения. 148

Для уменьшения временных затрат при реализации вычисления золото- 148

Алгоритм поиска методом золотого сечения аналогичен алгоритму би- 148

I=|_(P-Q)/1,619031 _|+Q. 149

10.2.3. Интерполяционный поиск. 149

Лине́йная интерполя́ция — интерполяция алгебраическим двучленом P1(x) = ax + b функции f, заданной в двух точках x0 и x1 отрезка [a, b]. 149

Отличие интерполяционного поиска от предыдущих методов. 149

Алгоритм интерполяционного поиска также аналогичен алгоритму би- 149

I = |_ (P-Q)(A-KQ)/(KP-KQ) _| + Q. 149

Пример. Осуществить интерполяционный поиск аргумента 51 в массиве. 149

Q,P,I,FLAG,A,KP,KQ:integer; 150

FLAG:=0; 150

P:=N; 150

Q:=1; 150

FLAG:=1; 150

Writeln('Объект не найден'); 150

FLAG:=1; 150

Writeln('Объект успешно найден ' + I) 150

Q:=I+1. 150

P:=I-1; 150

Всего положительных элементов N, date[0]=0. 150

10.2.4 Однородный бинарный поиск. 150

При однородном бинарном поиске аргумент поиска А сравнивается с. 150

I=I+-; H=.......... 151

Структурограмма алгоритма однородного бинарного поиска приведена. 151

Примечания.. 151

10.2.5 Фибоначчиев поиск (самостоятельно) 151

При реализации этого метода для нахождения интервала поиска. 151

Структурограмма алгоритма поиска приведена на рис. 152

Пример 1. 152

А = 8, N = 6. 152

Пример 2. 153

А = 12, N = 6. 153

I=6; P=1; m = 1; 153

Пример 3. 153

А = 11, N = 6. 153

10.2.6 Блочный поиск. 153

Пример. 154

Характеристики методов поиска (количество сравнений). 154

Пример общей программы организации телефонного справочника с. 154

11. ДОКУМЕНТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, ЕСПД.. 155

11.1. Виды программной документации. 155

11.2. ТРЕБОВАНИЯ К СОДЕРЖАНИЮ И ОФОРМЛЕНИЮ И ПРОГРАММНЫХ ДОКУМЕНТОВ.. 159

4)порядок проведения и. 161

Приводятся описания применяемых методов испытаний с указанием.. 161

В приложении к документу об испытаниях программы могут быть. 161

11. ТЕСТИРОВАНИЕ ПРОГРАММНЫХ ПРОДУКТОВ.. 163

2) Из-за хакера могли погибнуть астронавты.. 164

11.1 Ручной контроль программного обеспечения. 164

11.2 Структурное тестирование. 164

2) Для тестирования программы с помощью критерия покрытия условий можно использовать следующий набор тестов: 164

11.3 Функциональное тестирование. 164

11.4. Тестирования модулей и комплексное тестирование. 164

11.5. Оценочное тестирование. 164

11.6 Автоматизированное тестирование (АТ). 164

Segue SilTest 164

Ration Robot 164

13. ОТЛАДКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.. 164

13. ОПТИМИЗАЦИЯ ПРИКЛАДНОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ.. 164

13.1. Постановка задачи. 164

13.2. Оптимизация циклов. 164

DO 1 I = M, N, L.. 164

Тело цикла. 164

Правило 1. 164

A[I]:=0; 164

A[1]:=0; A[2]:=0; 164

Правило 2. 164

Правило 3. 164

1 CONTINUE.. 164

Как видно из приведенных выше примеров, путем развертки или. 164

Правило 4. 164

S = (L - 1) 164

В данном случае удается сэкономить N-1 вычитание. 164

13.3 Оптимизация вычислительных операций. 164

Правило 5. 164

Правило 6. 164

Правило 7. 164

Экономии времени на операциях присваивания можно. 164

Правило 8. 164

Правило 9. 164

Правило 10. 164

Правило 11. 164

Правило 12. 164

Например. 164

Таким образон можно выделить следующие процедуры oптимизации. 164

Правило 13. 164

13.4 Особенности оптимизации программ на языке Turbo Pascal 164

Правило 14. 164

Правило 15. 164

Правило 16. 164

Т.Е. 164

IF(J<>0) AND ((2/J)>X) THEN.... 164

WHILE (I<=LENGTH(S)) AND (S[I]<>'') DO... 164

Правило 17. 164

Правило 18. 164

Правило 19. 164

Правило 20. 164

Еще пример. 164

Правило 21. 164

Type. 164

Правило 22. 164

If ((ch>='0')and(ch<='9')) or 164

'A'..'Z', 164

Правило 23. 164

Правило 24. 164

Правило 25. 164

14. АРХИТЕКТУРА ПРОГРАММНОГО СРЕДСТВА.. 164

14.2. Основные классы архитектур программных средств. 164

Рис. 6.2. Конвейер параллельно действующих программ. 164

14.3. Архитектурные функции. 164

14.4. Контроль архитектуры программных средств. 164

15. РАЗРАБОТКА СТРУКТУРЫ ПРОГРАММЫ И.. 164

МОДУЛЬНОЕ ПРОГРАММИРОВАНИЕ.. 164

15.1. Цель модульного программирования. 164

15.2. Основные характеристики программного модуля. 164

15.3. Понятие модуля в Паскале (Delphi) 164

15.4. Методы разработки структуры программы. 164

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

15.5. Контроль структуры программы.. 164

16. ТЕХНОЛОГИИ И СТРАТЕГИИ ПРОГРАММИРОВАНИЯ.. 164

16.1. ТЕХНОЛОГИЯ СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ (метод пошаговой детализации) 164

16.1.1 Цели и принципы структурного программирования. 164

Пример абстракции и уточнения.. 164

16.1.2. СТРАТЕГИЯ НИСХОДЯЩЕГО СТРУКТУРНОГО ПРОГРАММИРОВАНИЯ (сверху-вниз) 164

Проектируем алгоритм. 164

НИСХОДЯЩАЯ РАЗРАБОТКА.. 164

VAR.. 164

Ввод относительной ошибки. 164

BEGIN.. 164

CLRSCR; 164

END; 164

Ввод отрезков и их проверка. 164

BEGIN.. 164

WRITELN; 164

WRITELN; 164

END; 164

Процедура проверки является ли. 164

BEGIN.. 164

Hyp:=0; {Если Hyp=0, то это не. 164

END; 164

Вывод сообщений. 164

BEGIN.. 164

WRITELN; 164

IF Hyp <> 0. 164

END; 164

Управляющая программа. 164

BEGIN.. 164

END.. 164

GOTOXY(1, 20); 164

END. 164

16.1.3. Стратегия программирования "снизу-вверх". 164

Объектно-ориентированное проектирование. 164

CASE - технологии. 164

Под CASE- технологией понимается совокупность средств автоматизации. 164

СПОСОБЫ ЗАПИСИ АЛГОРИТМОВ.. 164

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

Пример классического алгоритма Евклида для нахождения наибольшего. 164

БЛОК - СХЕМЫ и СТРУКТУРОГРАММЫ... 164

Структурограммы.. 164

Для изображения алгоритмов используются как и в блок-схемах. 164

Р- схемы описываются ГОСТом 19.005-85. 164

ПСЕВДОКОД это частично формализованная запись для наглядного. 164

БАЗОВЫЕ (СТАНДАРТНЫЕ) ТИПЫ ДАННЫХ.. 164

Данные различаются между собой. 164

Абстрактные типы данных (структуры) 164

Рис. 3.13 и 3.14 стр.67 в Ларионове. 164

Динамические структуры данных. 164

Тема: Рабочее время.


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



Сейчас читают про: