Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
21.1. Математическая модель системы (объекта)
← 20.3. Контрольные вопросы и задания |
21.2. Методы математического моделирования → |
Основной этап моделирования создание математической модели исследуемой системы. На базе математической модели анализируются характеристики системы. При компьютерном моделировании с помощью математической модели создается алгоритм программы имитации. Формальное описание объекта исследования необходимо также для взаимопонимания специалистов разных областей, объединенных для решения какой-либо глобальной задачи.
В общем случае математическую модель любой динамической системы можно представить в следующем виде [14,15]:
(t) = F(,,,t), |
(21.1) |
где = (x1,x2,...,xn) совокупность (вектор) входных воздействий на систему;
= (e1,e2,...,ek) совокупность (вектор) случайных воздействий на систему (воз-действий внешней среды);
= (h1,h2,...,hm) совокупность (вектор) внутренних параметров системы;
= (y1,y2,...,y5) совокупность (вектор) выходных характеристик системы;
F закон функционирования системы.
Процесс функционирования системы можно также рассматривать как последовательную смену состояний z1(t),z2(t),...,zk(t):
(t) = G(0,,,,t), |
(21.2) |
где 0 совокупность начальных состояний.
Таким образом, общую математическую модель системы можно представить также следующим образом:
(t) = F((t)). |
(21.3) |
Если модель, описывающая поведение системы, статическая, то в выражениях (21.1.21.3.) параметр t время не вводится.
Основная задача моделирования получение выходных характеристик системы (объекта) как функций от параметров , входных переменных и входных воздействий на систему , т.е. идентификация (построение) математической модели системы (21.1.21.3.).
Для идентификации математической модели применяются различные методы моделирования.
21.2. Методы математического моделирования
← 21.1. Математическая модель системы (объекта) |
21.3. Технология математического... → |
Методы моделирования, решающие задачу идентификации математической модели, можно разделить на четыре основные группы: аналитические, численные, имитационные, вероятностно-статистические [4],[9],[10],[14],[15],[16],[17].
Исторически первыми были разработаны аналитические методы моделирования и сложился аналитический подход к исследованию систем.
Аналитические методы моделирования. Аналитические методы позволяют получить характеристики системы как некоторые функции параметров ее функционирования. Таким образом, аналитическая модель представляет собой систему уравнений, при решении которой получают параметры, необходимые для оценки системы (время ответа, пропускную способность и т.д.).
Пример 1. Модель, описывающая путь S(t), пройденный автомобилем при равноускоренном движении с момента начала движения:
S(t) = ν0t + at2, |
(21.4) |
где ν0, a начальная скорость и ускорение.
Для того чтобы вычислить значение S(t) в заданный момент времени t достаточно подставить конкретные значения ν0 и a в уравнение (21.4) и выполнить аналитический расчет S(t) .
Пример 2. Процесс малых колебаний маятника описывается обыкновенным дифференциальным уравнением:
(21.5) |
где m, l масса и длина подвеса маятника;
g ускорение свободного падения;
φ(t) угол отклонения маятника в момент времени t.
Из этого уравнения свободного колебания маятника можно найти точные значения интересующих характеристик с помощью аналитических методов решения дифференциальных уравнений.
Пример 3. Небольшое предприятие может выпускать продукцию двух типов, прибыль от реализации единицы продукции первого типа составляет 600 у.е., второго типа 500 у.е. Для изготовления единицы продукции первого типа необходимо затратить 10 единиц материала, трудовые ресурсы 5 чел./час.; второго типа 7 ед. материала, трудовые ресурсы 4 чел./ч. Общие ресурсы предприятия на планируемый период: 1000 ед. материала, 800 чел./ч. Определить оптимальный план выпуска продукции, максимизирующий прибыль предприятия.
Данная задача относится к классу оптимизационных (задача целочисленного линейного программирования). Математическая модель задачи имеет следующий вид:
(21.6) |
где x1,x2 количество единиц продукции соответственно первого и второго типов.
Решается эта задача аналитически с помощью симплекс-метода. В результате решения точно определяются оптимальные значения x1,x2 и прибыль предприятия z.
Достоинство аналитических методов: высокая точность вычислений.
Недостатки аналитических методов:
Смена состояний реальной системы (объекта) происходит под воздействием множества как внешних, так и внутренних факторов, подавляющее большинство которых носит стохастический характер. Вследствие этого, а также из-за большой сложности большинства реальных систем применение аналитических методов ограничено.
При аналитическом моделировании компьютер используется в качестве вычислителя по аналитическим зависимостям. Разработаны пакеты прикладных программ, в которых реализованы аналитические методы решения систем алгебраических, дифференциальных, интегральных уравнений; методы решения оптимизационных задач. Например, Mathlab, Maple, MathCard.
Численные методы моделирования. Математическая модель также представляет собой систему линейных, нелинейных уравнений, но решается система уравнений методами вычислительной математики. Все численные методы предполагают итерационное решение задачи. На нулевой итерации задается начальное решение (приближение) и оценивается его точность, на последующих итерациях начальное приближение последовательно уточняется. Итерационный процесс продолжается до тех пор, пока не будет достигнута заданная точность решения, не будет выполнен заданный критерий останова.
Пример 4. Численный метод бисекций (деления отрезка пополам) применяется для решения алгебраических и трансцендентных уравнений следующего вида: f(x)=0, причем f(x) непрерывная функция [9].
Суть метода сводится к следующему: задается начальное приближение корня (x0) на отрезке [a, b]. Точка x0 разбивает отрезок на две равные части: [a, x0] и [x0, b]. Исходный отрезок [a, b] удовлетворяет условию: f(a)f(b)<0. Тогда согласно теореме БольцаноКоши внутри отрезка [a, b] существует точка c, в которой значение функции равно нулю, т.е. f(с) = 0, с ∈ [a, b]. Далее вычисляются значения функции на концах отрезков [a, x0] и [x0, b] и находится отрезок, на концах которого функция принимает значения разных знаков. Именно этот отрезок на следующей итерации делится пополам. Процесс построения последовательности отрезков позволяет найти ноль функции f(x) (корень уравнения f(x) = 0) с любой заданной точностью [6].
Опишем один шаг итераций. Пусть на(n-1)-м шаге найден отрезок [an-1, bn-1]⊂[a, b], такой, что f(an-1)f(bn-1 )<0. Делим его пополам точкой ξ = (an-1 + bn-1)/2 и вычисляем f(ξ). Если f(ξ) = 0, то ξ = (an-1 + bn-1)/2 корень уравнения. Если f(ξ) ≠ 0, то из двух полученных отрезков выбираем тот, на концах которого функция имеет противоположные знаки, так как корень уравнения принадлежит этому отрезку. Таким образом,
an = an-1, bn = ξ, если f(ξ)f(an-1) < 0, an = ξ, bn = bn-1, если f(ξ)f(an-1) > 0. |
(21.7) |
Если требуется найти корень с точностью до ξ, то деление пополам продолжается до тех пор, пока длина отрезка не станет меньше 2ξ. Тогда координата середины отрезка и есть значение корня с требуемой точностью ξ.
Разработаны численные методы для решения нелинейных уравнений (метод бисекций, метод простых итераций, метод Ньютона, метод Чебышева, метод Данко и т.д.), систем нелинейных уравнений (метод простых итераций, метод Ньютона, метод наискорейшего спуска и т.д.), решения задачи поиска минимума нелинейной функции (метод градиентного спуска, метод НелдераМида и т.д.).
Класс задач, которые решаются численными методами, значительно шире. Численные методы не дают точных решений, но позволяют задать любую степень точности решения. Использование численных методов оправдано, когда аналитические методы не существуют, например, математическая модель описывается слишком сложным нелинейным уравнением или системой нелинейных уравнений.
Численные методы, как и аналитические, реализованы в пакетах прикладных программ, например Mathlab, Maple, MathCard.
Имитационные методы моделирования [5]. С развитием вычислительной техники широкое применение получили имитационные методы моделирования для анализа систем, преобладающими в которых являются стохастические воздействия.
Суть имитационного моделирования заключается в имитации процесса функционирования системы во времени, с соблюдением таких же соотношений длительности операций, как и в системе оригинале. При этом имитируются элементарные явления, составляющие процесс; сохраняется их логическая структура, последовательность протекания во времени. Результат имитационного моделирования получение оценок характеристик системы.
Известный американский ученый Роберт Шеннон дает следующее определение [17]: «Имитационное моделирование процесс конструирования модели реальной системы и постановки экспериментов на этой модели с целью либо понять поведение системы, либо оценить (в рамках ограничений, накладываемых некоторым критерием или совокупностью критериев) различные стратегии, обеспечивающие функционирование данной системы».
Все имитационные модели используют принцип черного ящика. Это означает, что они выдают выходной сигнал системы при поступлении в нее некоторого входного сигнала. Поэтому в отличие от аналитических методов для получения результатов необходимо осуществлять «прогон» имитационных моделей, т.е. подачу некоторой последовательности сигналов, объектов или данных на вход модели и фиксацию выходной информации, а не «решать» их. Происходит своего рода «выборка» состояний объекта моделирования (состояния свойства системы в конкретные моменты времени) из пространства (множества) состояний (совокупность всех возможных значений состояний). Насколько репрезентативной окажется эта выборка, настолько результаты моделирования будут соответствовать действительности. Этот вывод показывает важность применения вероятностно-статистических методов оценки результатов имитации.
В процессе имитационного моделирования используется метод статистического моделирования, который первоначально развивался как метод статистических испытаний (Монте-Карло). Это численный метод, состоящий в получении оценок вероятностных характеристик, совпадающих с решением аналитических задач (например, с решением уравнений или вычислением определенного интеграла). Впоследствии этот метод стал применяться для имитации процессов, происходящих в системах, внутри которых есть источник случайности или которые подвержены случайным воздействиям.
Методы имитационного моделирования широко применяются при исследовании систем массового обслуживания.
Под системой массового обслуживания (СМО) понимают динамическую систему, предназначенную для эффективного обслуживания потока заявок (требований на обслуживание) при ограничениях на ресурсы системы. Под это определение подходит значительная часть реальных систем, которые нас окружают: библиотека, аэропорт, больница, университет, вычислительная система, производственная система и т.д.
Пример 5. В качестве примера СМО приведем информационно-поисковую систему. Система включает распределенный банк данных, организованный на базе трех удаленных друг от друга вычислительных центров А, В и С. Все центры связаны между собой каналами передачи информации, работающими в дуплексном режиме независимо друг от друга. В каждый из центров поступают заявки на проведение информационного поиска, где они предварительно обрабатываются, в результате чего формируются запросы для центров А, В и С. В центре, получившем заявку от пользователя, начинается поиск информации по запросу, а на другие центры по соответствующим каналам передаются тексты запросов, после чего там также может начаться поиск информации. Тексты ответов передаются соответствующим каналом в центр, получивший заявку на поиск. Заявка считается выполненной, если получены ответы от всех трех центров.
Необходимо рассчитать характеристики эффективности функционирования информационно-поисковой системы: число заявок, поступивших и обслуженных в каждом центре; вероятность загрузки компьютеров центров; характеристики очереди запросов к компьютерам каждого центра; среднее время обслуживания заявок в каждом центре и т.д.
Характерным для приведенной задачи и для других подобных задач из различных предметных областей являются:
Решение задачи имитационным методом предполагает розыгрыш интервалов между поступлением заявок на информационный поиск в центры А, В и С и интервалов обслуживания заявок, согласно заданному закону; вычисление моментов прихода заявок в систему и окончания обслуживания заявок; вычисление для каждой заявки ее времени ожидания в очереди на обслуживание и простоя системы (в ожидании заявки). Составляются алгоритм и компьютерная программа, которые имитируют работу СМО либо в течение заданного промежутка времени, либо по обслуживанию заданного количества заявок. Результат работы программы: оценка характеристик эффективности функционирования системы (среднее время ожидания заявок в очереди, вероятность простоя и т.д.).
Применение имитационных методов моделирования целесообразно при выполнении определенных условий [17].
Дополнительным преимуществом имитационного моделирования можно считать широкие возможности его применения в сфере образования и профессиональной подготовки. Использование имитационной модели позволяет экспериментатору видеть и «разыгрывать» на модели реальные процессы и ситуации.
Достоинства имитационных методов: применение для решения широкого класса задач, возможность учесть при моделировании любые стохастические воздействия на систему.
Недостатки имитационных методов: низкая точность по сравнению с аналитическими методами; невозможность задать требуемую точность решения, как в численных методах.
На рынке программных продуктов широко представлено программное обеспечение, реализующее имитационные методы моделирования. К нему относятся среды имитационного моделирования GPSS, SimScript, Simula, Arena, Extend, AveSim, AnyLogic и др.; программные комплексы, специализирующиеся на моделировании узкого круга систем одной конкретной предметной области. Например, пакеты имитационного моделирования производственных систем (AutoMod, WITNESS, QUEST, ProModel и др.); пакеты имитационного моделирования для медицинских учреждений (MedModel); пакеты имитационного моделирования сетей связи (COMNET, OPNET Modeler, IT Decision Guru).
Вероятностно-статистические методы моделирования. Применяются для описания зависимостей между выходными характеристиками системы и ее входными переменными (параметрами), в случае если эти зависимости [4]:
Пример 6. Исследуется зависимость между прибылью предприятий отрасли (y) и объемом производства (x1), фондом заработной платы (x2). Имеются исходные данные по 100 предприятиям отрасли за прошедший год. Простейшая модель взаимосвязи показателей описывается статистической линейной моделью (моделью линейной регрессии):
y = ax1 + bx2 + c + ε, |
(21.8) |
где a, b, c параметры модели;
ε случайный остаток.
Параметры модели оценивается на основе использования вероятностно-статистических методов (методов регрессионного анализа). Случайный остаток отражает влияние на y неучтенных факторов и/или ошибок измерений. В результате применения модели можно спрогнозировать среднюю прибыль предприятия отрасли при заданных значениях объема производства и фонда заработной платы (например, на следующий год) с некоторой вероятностью р.
Вероятностно-статистические методы широко используются при обработке результатов, полученных имитационными методами моделирования, в ходе имитационного эксперимента, как отмечалось выше.
Пример 7. Необходимо построить зависимость между средним временем обработки заявки на информационный поиск (y ) и интервалом между поступлениями заявок (x1 ), интервалом обслуживания заявок (x2 ) для примера 5.
Проводится имитационный эксперимент: при различных значениях x1 , x2 имитируется обработка заданного числа заявок и вычисляется среднее значение y при каждом прогоне имитационной модели (при заданных на определенном уровне значениях x1 , x2). В результате получается выборка исходных данных, по которой оцениваются параметры модели вида (21.8.).
Построенную модель далее можно использовать для оценки среднего времени обслуживания информационного запроса при заданных входных переменных с некоторой вероятностью р.
Достоинства и недостатки применения вероятностно-статистических методов такие же, как и у имитационных методов моделирования.
Разработано обширное прикладное статистическое программное обеспечение, в котором реализованы вероятностно-статистические методы, например, пакеты Statistica, SPSS, StatGraphs и многие другие.
21.3. Технология математического моделирования системы (объекта)
← 21.2. Методы математического моделирования |
21.4. Контрольные вопросы и задания → |
В настоящее время математическое моделирование системы реализуется только с использованием современных программно-технических средств, в силу сложности реальных систем и необходимости выполнения большого объема вычислений.
В ряде литературных источников вводится даже понятие компьютерное математическое моделирование системы. Под ним понимается математическое моделирование, в процессе которого используются компьютер и прикладное программное обеспечение для решения задач моделирования.
В целом технология математического моделирования системы во многом зависит от решаемых задач моделирования, особенностей системы, применяемого математического аппарат, но можно обобщенно (упрощенно) выделить и описать этапы, которые включает процесс моделирования любой системы (объекта).
На рис. 21.1. приведен технологический процесс моделирования системы [4,5]. Приведем описание основных этапов.
Рис. 21.1. Укрупнённая схема технологического процесса моделирования объекта (системы)
Этап 1. Формулирование целей и задач моделирования, выявление проблем, описание объекта исследования
На данном этапе на предметно-содержательном уровне формулируются цели и задачи моделирования; определяются проблемы, препятствующие достижению целей и решению поставленных задач исследования; описываются основные условия моделирования, при учете которых будут решаться задачи исследования. Также на этом этапе словесно описывается объект исследования как система, т.е. объект представляется как единое целое с учетом всех важных для моделирования составляющих (элементов) объекта, связей между ними и внешних связей с другими объектами и окружающей средой.
Итоги этапа: четкая постановка целей и задач моделирования на предметно-содержательном уровне; описание проблем и условий моделирования; описание объекта исследования как системы.
Этап 2. Изучение априорной информации об объекте исследования
Этап включает сбор, обработку, анализ и интерпретацию априорных (до опыта) данных и знаний об объекте.
Итоги этапа: совокупность априорных данных и знаний об объекте моделирования; результаты их анализа и интерпретации.
Этап 3. Формализация постановки задачи: формальное описание целей и задач моделирования, формулировка требований
Формально описываются цели и задачи моделирования, выбираются математические методы исследования. Описываются специфические особенности объекта моделирования; устанавливается совокупность допущений, при которых решаются задачи моделирования, и условия применимости получаемых в результате моделирования результатов.
Формулируются требования к экспериментальным данным и знаниям, видам анализа, моделям (методам) и средствам решения задачи (технологиям, алгоритмам, аппаратно-программному обеспечению). Исходя из выдвинутых требований к моделям выбираются показатели качества модели. Под показателем качества модели понимают некоторую характеристику, определяющую соответствие модели ее назначению, т.е. пригодность для решения поставленных задач моделирования, и близость достижения цели. Показатели качества могут быть как количественными, так и порядковыми, качественными (номинальными).
Итоги этапа: формальное описание целей и задач моделирования; требуемые показатели качества.
Этап 4. Стратегическое и тактическое планирование эксперимента с объектом
На данном этапе составляются планы проведения эксперимента, включающие условия проведения эксперимента; способ сбора и форму представления данных эксперимента; перечень факторов, параметров, показателей, значения которых необходимо зарегистрировать в ходе проведения эксперимента, шкалы измерения и т.д. Планирование эксперимента призвано дать в итоге максимальный объем необходимой информации об объекте моделирования при минимальных материальных и временн?ых затратах. Различают стратегическое и тактическое планирование эксперимента. При стратегическом планировании ставится задача построения оптимального (минимум затрат, максимум информации) плана эксперимента в целом. Тактическое планирование эксперимента преследует частные цели оптимальной реализации каждого конкретного эксперимента из множества необходимых, заданных при стратегическом планировании.
Итоги этапа: стратегии и планы эксперимента в широком смысле.
Этап 5. Экспериментирование с объектом
В результате экспериментирования с объектом получают данные и знания об объекте исследования, необходимые для построения моделей и проверки их качества.
Эксперимент может быть натурным (проводится непосредственно с объектом) или машинным (проводится с моделью системы, реализованной в виде компьютерной программы). Машинные эксперименты ставятся, например, с имитационной моделью системы, как описано в примере 7.
Итоги этапа: данные об объекте исследования.
Этап 6. Идентификация объекта
На основе данных, полученных в результате экспериментирования с объектом, описывается структура модели, оцениваются параметры модели и/или реализуется проверка модели.
Итоги этапа: модель объекта.
Этап 7. Оценка адекватности модели, ее свойств, устойчивости, областей применения
Выводы об адекватности модели делают на основе проверки соответствия поведения моделируемого и реального объекта; соответствия модели цели моделирования, среде. Один из вариантов оценки адекватности модели сравнение экспериментальных (реально наблюдаемых) данных о поведении объекта и данных, полученных в результате расчета по модели. На этом этапе осуществляется также анализ свойств моделей; их особенностей; выявляются области применимости модели; устойчивости к изменению входных воздействий на объект (систему).
Итоги этапа: значения показателей качества модели в привязке к условиям и областям применения.
Этап 8. Решение задач моделирования, подведение итогов
Реализуется моделирование; анализируются и интерпретируются полученные результаты по отношению к моделируемому объекту в терминах предметной области. Формулируются окончательные научные и практические выводы, рекомендации по практическому использованию результатов моделирования; составляется документация по модели для ее дальнейшего применения.
Итоги этапа: документально оформленные результаты моделирования, их анализ и интерпретация, научные и прикладные выводы.
На этапах экспериментирования с объектом, идентификации (построения модели), оценки ее адекватности широко используются программно-технические средства моделирования: например, составляются компьютерные программы, моделирующие работу системы; выполняются расчеты для оценки выходных характеристик системы; оцениваются параметры модели системы и т.п.
В ряде литературных источников [8,10,11] процесс моделирования (компьютерного моделирования) представляют упрощенными схемами (рис. 21.2 и 21.3), подчеркивая роль компьютера в решении задач моделирования:
Рис. 21.2. Общая схема процесса компьютерного математического моделирования (вариант 1)
Рис. 21.3. Общая схема процесса компьютерного математического моделирования (вариант 2)
Приведенная на рис. 21.1. схема технологического процесса моделирования системы условная. В каждом конкретном случае некоторые ее этапы могут отсутствовать, могут быть переставлены местами, сама схема может иметь итерационные петли обратной связи и т.д.
21.4. Контрольные вопросы и задания
← 21.3. Технология математического... |
22.1. Понятие информационной модели → |
22.1. Понятие информационной модели
← 21.4. Контрольные вопросы и задания |
22.2. Этапы моделирования → |
Известно, что модель это некоторое упрощенное подобие реального объекта. Другими словами, модель это объект-заменитель, который в определенных условиях может заменить объект-оригинал. Модель воспроизводит интересующие нас свойства и характеристики оригинала. Например, глобус модель планеты Земля, а географическая карта модель местности, которая на карте отображается. При этом, являясь моделями практически одного и того же объекта, глобус и карта различаются по отображаемым свойствам этого объекта карта не учитывает истинную форму Земного шара. Замена одного объекта (процесса или явления) другим, но сохраняющим все существенные свойства исходного объекта (процесса или явления), называется моделированием. Модели бывают материальными и информационными. Примерами материальных моделей являются все тот же глобус, манекен (модель человеческого тела), модели самолетов, кораблей и т.д. Предметом изучения информатики являются информационные модели. В информационной модели отражаются специфическим образом представленные знания человека об объекте моделирования. Информационная модель это описание в той или иной форме объекта моделирования.
Объектом информационного моделирования может быть все, что угодно: отдельные предметы (стол, комната), физические, химические, биологические процессы (течение воды в трубе, фотосинтез в листьях растений), метеорологические явления (гроза, циклон), экономические и социальные процессы (динамика цен акций на бирже, миграция населения). Можно сказать, что информационным моделированием занимается любая наука, поскольку задача науки состоит в получении знаний, а наши знания о действительности носят приближенный, т.е. модельный, характер. С развитием науки эти знания уточняются, углубляются, но все равно остаются приближенными. Старые модели заменяются новыми, более точными, и этот процесс бесконечен.
Информатика занимается общими методами и средствами создания и использования информационных моделей. Понятие информационной модели одно из важнейших понятий информатики, базовое понятие в информационной деятельности. При работе с информацией мы либо имеем дело с готовыми информационными моделями (выступаем в роли их наблюдателя), либо разрабатываем информационные модели. Алгоритм и программа разные виды информационных моделей. Создание базы данных требует прежде всего определения модели данных. Формирование запроса к любой информационно-справочной системе также относится к информационному моделированию. Изучение различных процессов, происходящих в компьютере, невозможно без построения и исследования соответствующей информационной модели.
Важно подчеркнуть деятельностный характер процесса моделирования. Информационное моделирование является не только объектом изучения в информатике, но и важнейшим способом познавательной, учебной и практической деятельности. Его также можно рассматривать как метод научного исследования и как самостоятельный вид деятельности.
Общая черта всех моделей состоит в том, что они копируют исходный объект. Физические модели делаются из другого материала, имеют отличные от исходного объекта размеры. Информационные модели же зачастую содержать необходимую информацию только о тех сторонах объекта или процесса, которые существенны для решаемых с помощью этих моделей задач. Например, расписание движения поездов это информационная модель процесса движения составов по железной дороге. В ней указаны интересующие нас характеристики процесса движения пункты и время отправления и прибытия, время в пути. Такие характеристики обычно называют параметрами модели. Используя этот термин, можно сформулировать следующее определение информационной модели: модель, представляющая объект, процесс или явление набором параметров и связей между ними, называется информационной. Вскрыть связи между параметрами информационной модели это зачастую едва ли не самая сложная часть в построении модели, возникающая после того, как определены ее параметры. Информационная модель, в которой параметры и зависимости между ними выражены в математической форме, называется математической моделью. Информационная модель вовсе не обязана быть математической. Например, объектом рассмотрения выступает группа студентов заданного факультета. При решении задачи нас интересует успеваемость этой группы в весеннюю сессию. В этом случае значимыми параметрами для решения задачи являются имена студентов, наименования предметов, по которым проводились экзамены в эту сессию и полученные студентами оценки по предметам. Связи между параметрами в этом случае могут быть представлены, например, в виде таблицы успеваемости студентов. Такие табличные модели широко используются при построении компьютерных баз данных, содержащих описания предметных областей для решения определенного круга задач. Вообще, информационное моделирование в информатике это чаще всего компьютерное моделирование, применимое к объектам различных предметных областей.
22.2. Этапы моделирования
← 22.1. Понятие информационной модели |
22.3. Типовые информационные модели → |
Построение информационной модели начинается с системного анализа объекта моделирования. Например, предположим, что руководство некой фирмы столкнулось с проблемой снижения эффективности работы фирмы по мере ее роста и решило упорядочить управленческую деятельность. Первое, что необходимо сделать руководству фирмы, провести системный анализ деятельности фирмы, т. е. анализ объекта моделирования в соответствии с системным подходом. Системный аналитик, приглашаемый в фирму, должен изучить ее деятельность, выделить участников процесса управления и их деловые взаимоотношения.
Далее полученное теоретическое описание моделируемой системы преобразуется в компьютерную модель. Для этого либо используется готовое программное обеспечение, либо привлекаются программисты для ее разработки. Для приведенного примера с фирмой компьютерная информационная модель поможет найти оптимальный вариант управления, при котором будет достигнута наивысшая эффективность работы фирмы согласно заложенному в модель критерию.
Информационная модель базируется на данных, т.е. на информации об объекте моделирования. Любой реальный объект обладает бесконечным множеством различных свойств. Для создания его информационной модели требуется выделить лишь те свойства, которые необходимы с точки зрения цели моделирования; четко сформулировать эту цель необходимо до начала моделирования. На рис. 22.1 представлена схема этапов разработки компьютерной информационной модели.
Рис. 22.1. Этапы разработки компьютерной информационной модели
← 22.2. Этапы моделирования |
22.4. Контрольные вопросы и задания → |
Данные, используемые в любой информационной модели, всегда определенным образом упорядочены, структурированы. Другими словами, данные, на которых базируется информационная модель, представляют собой систему со всеми характерными признаками элементным составом, структурой, назначением. Такие структурированные системы данных часто называют структурами данных. Исследуя некоторую реальную систему (объект или процесс моделирования), системный аналитик строит ее теоретическую модель. При этом он, в первую очередь, должен описать структуру данных. К таким типовым структурам данных относятся графы (сети, деревья частные случаи графа), таблицы.
Граф это графическая структура, которая отображает элементный состав системы и структуру связей в этой системе. Например, словесное описание местности «Район состоит из пяти поселков Дедкино, Бабкино, Кошкино, Мышкино, Репкино. Автомобильные дороги проложены между Дедкино и Бабкино, Дедкино и Кошкино, Бабкино и Мышкино, Бабкино и Кошкино, Кошкино и Репкино» может быть представлено в виде графа, изображенного на рис. 22.2.
Рис. 22.2. Неориентированный граф, представляющий структуру описания местности
Составными частями графа являются вершины и ребра. Вершины на рис. 22.2 изображены кружками, изображающими элементы системы, а ребра изображены линиями, показывающими связи (отношения) между элементами. Граф, изображенный на рис. 22.2, относится к виду графов, называемому сетью. Для такого вида графов характерна возможность различных путей перемещения по ребрам между некоторыми парами вершин. В сетях возможны также замкнутые пути, называемые циклами. Граф, изображенный на рис. 22.2, неориентированный, в нем каждое ребро обозначает дорожную связь между двумя пунктами. Но дорожная связь действует одинаково в обе стороны: если по дороге можно проехать от Б к М, то по ней же можно проехать от М к Б. Такую связь еще называют симметричной.
Рассмотрим другой пример графа (рис. 22.3), который отображает следующее описание предметной области: «У человека существует четыре группы крови. При переливании крови от одного человека к другому не все группы совместимы. Варианты, которые возможны при переливании крови, указаны с помощью графа на рис. 22.3. Группы крови представлены вершинами графа с соответствующими номерами, а стрелки указывают на возможность переливания одной группы крови человеку с другой группой крови». Связи между вершинами данного графа несимметричны и поэтому изображаются направленными линиями со стрелками. Такие линии принято называть дугами (в отличие от ребер неориентированных графов). Граф с такими свойствами называется ориентированным. Ребра, исходящие и входящие в одну и ту же вершину, называются петлями.
Рис. 22.3. Ориентированный граф, отображающий описание предметной области «Переливание крови»
При построении информационных моделей многих систем приходится иметь дело с иерархической структурой. В этих структурах установлены отношения подчиненности. На рис. 22.4 изображен граф, отражающий управления средней школой. Такой ориентированный или неориентированный граф называется деревом. Основными свойствами дерева, отличающими его от других видов графов, является то, что между любыми двумя его вершинами существует единственный путь, и, кроме того, из каждой вершины может выходить несколько ребер, но в каждую вершину входит только одно ребро. Есть вершина, в которую не входит ни одно ребро (корень дерева), и вершины, из которых не выходит ни одного ребра (листья).
Рис. 22.4. Дерево, изображающее структуру управления средней школой
Широко известным в информатике примером применения дерева для отображения предметной области является изображение системы хранения файлов и каталогов на магнитных дисках.
Представление информации в табличной форме широко распространено. Чаще всего мы пользуемся прямоугольными таблицами. Простейшая таблица состоит из строк и граф (столбцов). В верхней строке таблицы обычно располагаются заголовки столбцов. Пересечение строки и столбца образует ячейку. Как пример дается прямоугольная таблица (табл. 22.1), содержащая сведения о погоде. Это таблица типа «объект-свойство»: каждая строка ее относится к определенному объекту, графы (столбцы) отражают свойства объектов.
Таблица 22.1. Описание предметной области «Погода»
Дата |
Осадки |
Температура, градусы С |
Давление, мм.рт.ст. |
Влажность, % |
15.03.07 |
Снег |
-3,5 |
746 |
67 |
16.03.07 |
Без осадков |
0 |
750 |
62 |
17.03.07 |
Без осадков |
1 |
740 |
100 |
18.03.07 |
Туман |
2,1 |
745 |
96 |
19.03.07 |
Мокрый снег |
4,0 |
760 |
87 |
23.1. Понятие алгоритма
← 22.4. Контрольные вопросы и задания |
23.2. Свойства алгоритма → |
Единого точного определения термина Алгоритм не существует. Разные источники дают его по-разному. Самое простое определение:
алгоритм это описание последовательности действий, приводящих к требуемому результату.
Под такое определение попадают и кулинарный рецепт, и словесно-формульное описание метода решения квадратных уравнений, и программа, написанная на языке программирования. Поэтому будем считать более правильным и точным следующее определение:
алгоритм это формализованное описание конечной последовательности дискретных, однозначно определенных действий, приводящих к требуемому результату.
Согласно этому определению алгоритм состоит из алгоритмических действий, которые должен выполнять исполнитель алгоритма (человек, компьютер или дрессированный заяц), чьи действия должны быть однозначно понятны и выполнимы. Кроме того, они должны быть дискретны, т.е. отделены друг от друга, и относительно независимы. Разнообразие их ограничено; чем оно меньше, тем лучше. Последовательность действий должна приводить к результату за конечное их число. И наконец, все описание нужно представлять на некотором формализованном языке, не допускающем неоднозначную трактовку.
Подавляющее большинство алгоритмов, особенно научно-технических, оперируют с данными. Данные это информация, представленная в форме, пригодной для алгоритмической обработки. Входные данные поставляются в алгоритм извне и обрабатываются им, превращаясь в выходные данные результат работы алгоритма. В интерактивных алгоритмах входные данные вводятся неоднократно, часто в зависимости от промежуточных результатов. К примеру, все игровые программы основаны на интерактивных алгоритмах. В неинтерактивных (линейных, алгоритмах типа «вход-выход») входные данные вводятся однократно и автоматически преобразуются в выходные, образуя в процессе преобразования промежуточные, или внутренние, данные. Понятие данных позволяет увидеть разницу между алгоритмом и компьютерной программой (которая записывается на «алгоритмическом» языке). По определению Н.Вирта [1],
программа = алгоритм + структуры данных.
Иными словами,
компьютерная программа это описание структур данных и алгоритма их обработки, выполненное на формализованном языке, допускающем автоматическое преобразование в язык машинных команд.
Кроме того, алгоритм (в отличие от компьютерной программы) допускает в своем описании различные уровни детализации. Постепенная (пошаговая) детализация основной метод разработки компьютерных алгоритмов.
23.2. Свойства алгоритма
← 23.1. Понятие алгоритма |
23.3. Данные алгоритмов → |
Алгоритм должен обладать рядом важнейших свойств.
23.3. Данные алгоритмов
← 23.2. Свойства алгоритма |
23.4. Элементарные алгоритмические действия → |
Как уже было сказано выше, алгоритм оперирует с данными. Он преобразует входные данные в выходные, образуя в этом процессе промежуточные данные. Данные могут быть простые и сложные (структурированные). Простые данные представляют собой переменные и константы. Константа это величина, имеющая постоянное значение, не изменяющееся в процессе работы алгоритма. Переменная это величина, способная изменять свое значение и обладающая следующими свойствами:
Константы и переменные алгоритмов могут быть числового и символьного типов. Данные числового типа могут хранить числовые значения. Так как целые и вещественные числа представляются в компьютерной обработке принципиально по-разному, для числовых данных необходимо определять подтип целые, вещественные или комплексные. Данные символьного типа могут хранить в себе коды символов, используемых при кодировании нечисловой информации. Отдельно следует выделить логический тип данные этого типа могут иметь два значений Истина (true, логическая единица) и Ложь (false, логический ноль), образующие полное множество.
Сложные (структурированные) типы данных строятся из простых. Это, прежде всего, массивы.
Массив это совокупность переменных одного типа, имеющих один и тот же идентификатор и различающихся между собой одним или несколькими индексами.
В самом простом случае индекс представляет собой порядковый номер элемента массива. Число индексов определяет «мерность» массива. Одномерный числовой массив соответствует математическому понятию вектор, а двумерный числовой понятию матрица. Одномерный символьный массив обычно называется строка, а двумерный символьный текст. Число индексов элементов массивов не ограничивается, хотя в практических задачах обычно не превосходит трех - четырех.
Другим сложным типом данных является структура или запись.
Структура это совокупность переменных разных типов, имеющих различные идентификаторы.
Идентификатор элемента структуры состоит из двух частей, разделенных точкой, идентификатора структуры и идентификатора собственно элемента. Например, murka.tau переменная tau структуры murka.
В качестве элементов массивов или структур могут использоваться другие массивы или структуры.
Существуют и другие сложные типы данных: множества, объекты классов и пр., которые в данном разделе не рассматриваются.
Перед разработкой алгоритма должна быть выполнена разработка структуры входных и выходных данных. Она заключается в определении состава входных и выходных данных, определении их типов и присвоении им идентификаторов. Например, для алгоритма решения квадратного уравнения ax2 + bx + c = 0 входными данными могут являться переменные a, b и с, имеющие вещественный числовой тип и соответствующие одноименным коэффициентам уравнения. С выходными данными здесь несколько сложнее. Так как уравнение может иметь как вещественные, так и комплексные корни, то одним из вариантов решения может быть следующая структура выходных данных:
Переменные x1 и x2 имеют вещественный числовой тип, а переменная key может быть логической или числовой переменной с предварительно установленной кодировкой значений, например:
Для алгоритма решения системы линейных алгебраических уравнений структура входных и выходных данных может быть следующей:
Входные и выходные данные алгоритма иногда удобно изобразить на структуре «черного ящика» (black box). На рис. 23.1 показана структура внешних данных алгоритма вычисления корней квадратного уравнения. На структуре указаны типы переменных: Real вещественный и Int целый.
23.4. Элементарные алгоритмические действия
← 23.3. Данные алгоритмов |
23.5. Способы записи алгоритмов → |
Алгоритм строится из структурных конструкций и элементарных алгоритмических действий, к которым относятся присваивание, ввод и вывод данных, а также обращение к вспомогательному алгоритму.
Присваивание может быть представлено в виде
var := <выражение> или <выражение> → var,
где var условный идентификатор переменной.
Выражение это синтаксически правильная конструкция, состоящая из операндов (переменных и констант), знаков операций между ними, вызовов функций, скобок.
Все переменные, входящие в выражение, должны иметь определенные значения, действия, выполняемые над операндами, должны быть корректны, а функции определены. При этом выражение будет иметь значение определенного типа, которое вычисляется и присваивается переменной var.
Если операнды числовые величины, то над ними можно выполнять известные математические действия: сложение, вычитание, умножение, деление, возведение в степень и извлечение корня. В выражении могут быть использованы известные алгебраические функции: абсолютной величины, синуса, экспоненты, логарифма и т.п.
Над операндами логического типа можно выполнять операции отрицания (инверсии, НЕ, NOT), логического сложения (дизъюнкции, ИЛИ, OR) и логического умножения (конъюнкции, И, AND).
Данные символьного типа обычно используются в качестве аргументов функций, специально предназначенных для работы с ними.
Алгоритмическое действие ввод значения представляет собой еще один способ присвоения значения переменной, при котором это значение вводится с консоли (клавиатуры, файла или другого канала). Условно его можно обозначить как Input(var), где var идентификатор переменной, которой присваивается значение.
Противоположное действие вывод значения заключается в выводе значения переменной var на консоль (монитор, файл, канал) Output(var).
Самым сложным алгоритмическим действием является обращение к вспомогательному алгоритму. Его лучше пояснить на конкретном примере. Пусть при выполнении основного алгоритма возникла необходимость решения квадратного уравнения s*t2 + q*t + r = 0 (корни уравнения вещественные). Предположим, что алгоритм решения квадратного уравнения со структурой входных и выходных данных, представленных на рис. 23.1, уже имеется. Тогда, в нужный момент, его можно вызвать, передав в него входные данные. Алгоритм Root2 исполнится и передаст в вызвавший его основной алгоритм выходные данные. Схема взаимодействия основного и вспомогательного алгоритмов представлена на рис. 23.2. При вызове алгоритма Root2 переменная s основного алгоритма передаст свое значение переменной a вспомогательного. Аналогично произойдет передача значений: q → b и r → c. После завершения работы вспомогательного алгоритма произойдет передача его выходных данных переменным основного алгоритма: x1 → t1 и x2 → t2.
Кроме элементарных алгоритмических действий при построении алгоритмов используются структурные конструкции: следование, бинарное ветвление, множественное ветвление и циклы, которые рассматриваются ниже.
Рис.23.1. Структура входных и выходных данных алгоритма решения квадратного уравнения
Рис. 23.2. Схема передачи данных при вызове вспомогательного алгоритма
23.5. Способы записи алгоритмов
← 23.4. Элементарные алгоритмические действия |
23.6. Контрольные вопросы и задания → |
Алгоритм может иметь различные формы представления. Рассмотрим три наиболее распространенных из них, иллюстрируя примером алгоритма нахождения корней квадратного уравнения.
Первая и самая простая это вербальная, или словесно-формульная, форма. В ней алгоритмические действия описываются словами и, при необходимости, формулами. Для выбранного примера описание алгоритма может иметь следующий вид.
Алгоритм вычисления корней квадратного уравнения ax2 + bx + c = 0. Входными данными являются коэффициенты a, b и c.
.
.
Словесно-формульная форма является естественной для человека, но в сложных случаях не дает четкого представления о последовательности действий и может обладать неоднозначностью их интерпретации. Она обычно используется при разработке алгоритмов как исходная.
Наиболее полной и корректной формой является запись алгоритма на специальном языке. За рубежом он называется PDL (Process Design Language), «псевдокод». Отечественный вариант этого языка был предложен академиком А.П. Ершовым в первых школьных учебниках по информатике [2] и используется у многих других авторов учебников [3,4]. Это паскалеподобный язык, обладающий всей полнотой и корректностью описания алгоритма. Алгоритм решения квадратного уравнения на нем имеет следующий вид:
алг Root2 (вещ a,b,c,x1,x2; цел key)
арг a,b,c
рез x1,x2,key
нач
вещ D,re,im
D:=b2-4ac
re:=
im:=-
если D>=0
то
нач
x1:=re+im
x2:=re-im
key:=0
кон
иначе
нач
x1:=re
x2:=im
key:=1
кон
все
кон
Заголовок алгоритма содержит его имя, а также описание входных (арг) и выходных (рез) данных с указанием их идентификаторов и типов. Далее аналогично описываются промежуточные данные алгоритма. Начало и конец алгоритмических действий обозначены служебными словами нач и кон. Рассматриваемый в качестве примера алгоритм очень простой и содержит только операторы присваивания и одну структурную конструкцию бинарное ветвление. Она оформляется служебными словами: если, то, иначе, все.
Представление алгоритма на псевдокоде допускает разные уровни абстракции и поэтому может быть использовано как при разработке алгоритма путем постепенной детализации, так и для его окончательного представления.
Третьей широко распространенной формой представления алгоритмов является язык блок-схем. По корректности он занимает промежуточное положение между словесно-формульным описанием и представлением на псевдокоде. Достоинством его является визуальная наглядность графического изображения. Каждая структурная конструкция имеет стандартное графическое изображение. Некоторые из них представлены в табл. 23.1. Отдельные действия представляются в виде прямоугольников, последовательность их выполнения показываются стрелками (линиями потока).
Таблица 23.1. Некоторые условно-графические элементы блок-схем
Наименование |
Обозначение и относительные размеры |
Функция |
Процесс |
Выполнение операций или группы операций, в результате которых изменяется значение, форма представления или расположение данных |
|
Решение |
Выбор направления выполнения алгоритма или программы в зависимости от некоторых переменных условий |
|
Модификации |
Выполнение операций, меняющих команды или группу команд, изменяющих программу |
|
Предопределенный процесс |
Использование ранее созданных и отдельно описанных алгоритмов или программ |
|
Ввод-вывод |
Преобразование данных в форму, пригодную для обработки (ввод) или отображения результатов об-работки (вывод) |
|
Линия потока |
Указание последовательности между символами |
|
Пуск-останов |
Начало, конец, прерывание процесса обработки данных или выполнения программы |
|
Комментарий |
Связь между элементом схемы и пояснением |
Алгоритм решения квадратного уравнения представлен блок-схемой на рис. 23.3. Бинарное ветвление в ней показано ромбовидной фигурой. В зависимости от значения записанного в ней логического выражения (условия) выполняется та или иная ветвь вычисления.
Рис. 23.3. Блок схема алгоритма вычисления корней квадратного уравнения
Блок-схемы допускают различные уровни детализации представляемых алгоритмических действий и поэтому очень удобны при разработке алгоритмов. Будучи дополнены комментариями с описаниями данных, они дают достаточно полное представлении об алгоритме.
Существуют и другие формы представления алгоритмов, имеющие более ограниченное использование, но они в данном пособии не рассматриваются. Упомянутые выше формы будут более подробно представлены ниже при описании конкретных алгоритмических структур.
24.1. Линейная алгоритмическая структура
← 23.6. Контрольные вопросы и задания |
24.2. Разветвляющая алгоритмическая структура → |
Линейная алгоритмическая структура отражает последовательность выполнения некоторых действий. Например, при исполнении алгоритма сначала нужно выполнить действие A, затем действие B, а за ним действие C. На псевдокоде это может быть записано следующим образом:
…
Действие A
Действие B
Действие C
…
Блок-схема линейной структуры показана на рис. 24.1. Каждое алгоритмическое действие отражается прямоугольником. Размеры сторон прямоугольников могут быть выбраны произвольно, но должны сохраняться во всей блок-схеме и определяют размеры других ее элементов. Переход от одного действия к другому изображается линиями со стрелками. Если линия направлена сверху вниз или справа налево, то стрелки на них допускается не ставить.
Под действием может скрываться элементарное алгоритмическое действие: присваивание, ввод или вывод данных, обращение к вспомогательному алгоритму, а также любая из описанных ниже структурных конструкций или их комбинация. Линейная структура однозначно определяет последовательность действий. В приведенном примере действие B должно быть выполнено после действия A и перед действием C.
Если действие представляет собой обращение к вспомогательному алгоритму, то на псевдокоде его вызов указывается следующим образом:
…
Root2(s,q,r, t1,t2,key)
…
На блок-схеме обращение к вспомогательному алгоритму показано двойными боковыми линиями прямоугольника (рис. 24.2).
Рис. 24.1. Блок-схема линейной |
Рис. 24.2. Изображение на блок-схеме |
a |
б |
Рис. 24.3. Блок-схема структур «ветвление» (а) и «обход» (б)
В качестве логического выражения может быть использовано выражение отношения (условие), в котором два выражения сравниваются знаками отношения, например, k = 0 или i < n или sin(x + π/2)>=exp(-2y)-1. В более сложных случаях в логических выражениях используются знаки логических операций: инверсии not, дизъюнкции or или конъюнкции and. Например, not(k = 0 and ((i < n) or (sin(x + π/2)>=exp(-2y)-1))). При конструировании сложных логических выражений необходимо использовать правила и законы булевой алгебры.
Множественное ветвление представляет собой структуру, разветвляющуюся на более чем две ветви. С точки зрения теоретического программирования она является избыточной, так как может быть реализована с помощью бинарных ветвлений. Но практически все языки программирования имеют оператор, поддерживающий эту структуру, поэтому рассмотрим ее на примере ветвления на четыре ветви (блок-схема на рис. 24.4). Ветвлением управляет выражение-селектор s, которое может принимать предусмотренные значения a, b и c. Если s = a, то выполняется ветвь A, если s = b, то выполняется ветвь B, и если s = с, то выполняется ветвь С. В структуре также имеется ветвь X, которая будет выполняться, если селектор s примет не предусмотренное для исполнения предыдущих ветвей значение.
На рис. 24.5 показана реализация этой структуры с помощью бинарных ветвлений.
Рис. 24.4. Блок-схема множественного ветвления
Рис. 24.5. Реализация множественного ветвления с помощью бинарных ветвлений
На псевдокоде множественное ветвление записывается следующим образом:
выбор
при s = a: Ветвь A
при s = b: Ветвь B
при s = c: Ветвь C
иначе Ветвь X
все
24.3. Циклические алгоритмические структуры
← 24.2. Разветвляющая алгоритмическая структура |
24.4. Основные операторы циклов и ветвления → |
Циклические алгоритмические структуры реализуют повторяющиеся действия. Действие (или группа действий), которое неоднократно повторяется, образуют тело цикла. Для повторения исполнения тела цикла используются структурные конструкции цикла с постусловием, цикла с предусловием и цикла по переменной.
Цикл с постусловием (послеусловием) представлен в виде блок-схемы на рис. 24.6, а на псевдокоде следующим листингом:
…
повторять
<тело цикла>
до <логическое выражение>
…
Рис. 24.6. Блок-схема цикла с постусловием
На псевдокоде служебные слова повторять и до окаймляют тело цикла. Оно повторно выполняется до получения логическим выражением (условием) значения Истина. При первом прохождении тела цикла оно должно иметь значение Ложь, а при некотором числе повторений тела цикла оно должно измениться на значение Истина. Может быть и обратная схема при истинности логического выражения тело цикла повторяется, а при ложности происходит выход из цикла. В следующем разделе это показывается на примере реализаций в конкретных языках программирования.
На блок-схеме цикл с постусловием реализуется с помощью элемента альтернатива, используемого и в бинарном ветвлении.
Цикл с предусловием представлен в виде блок-схемы на рис. 24.7, а на псевдокоде следующим листингом:
…
пока <логическое выражение>
повторять
<тело цикла>
…
Рис. 24.7. Блок-схема цикла с предусловием
Тело цикла выполнятся, пока логическое выражение имеет значение Истина. Естественно, что при входе в цикл оно должно иметь именно это значение, а при некотором числе повторений изменить свое значение на значение Ложь.
Циклы с постусловием и предусловием взаимозаменяемы. Их различение проявляется только в том, что при вхождении в цикл с «неправильным» значением логического выражения тела цикла с постусловием будет выполнено один раз, а тело цикла с предусловием не будет выполнено ни разу. В конкретной практике разработки алгоритмов иногда удобнее использовать цикл с постусловием, а иногда с предусловием.
Цикл по переменной (цикл-модификация) с точки зрения теоретического программирования является избыточным, так как он может быть реализован с помощью предыдущих циклических конструкций. Но он используется чаще всего, и во всех языках программирования есть соответствующие ему операторы. Блок-схема этого цикла представлена на рис. 24.8. В данном примере управляющая переменная обозначена условным идентификатором var; B, E и S представляют собой выражения того же типа, что и var. Сначала var принимает значение b выражения B (begin): var := b. Тело цикла исполняется, а затем к переменной var прибавляется значение s выражения S (step): var := var + s. Затем значение var сравнивается со значением e выражения E (end): var <= e. При выполнении этого условия тело цикла повторяется, при его нарушении происходит вывод из цикла.
Рис. 24.8. Блок-схема цикла по переменной
На псевдокоде цикл по переменной представляется следующим текстом:
…
для var от B до E шаг S
нц
тело цикла
кц
…
Предоставляем читателю самостоятельно представить реализацию цикла по переменной, основываясь на описаниях предыдущих циклов.
Цикл по переменной следует использовать, когда можно заранее указать число повторений тела цикла. Наиболее широко он используется при работе с массивами.
Если тело цикла содержит несколько действий (операторов), то на псевдокоде, как и при ветвлении, они объединяются служебными словами нач и кон. Иногда возникает необходимость прервать цикл при выполнении некоторого дополнительного условия. В таком случае возникает конструкция с выходом из середины тела цикла, представленная на примере цикла с послеусловием на блок-схеме рис. 24.9. Тело цикла при этом разбивается на две части ТЦ1 и ТЦ2. После выполнения ТЦ1 происходит вычисление логического выражения ЛВ1. Если оно принимает значение Истина, то происходит выход из цикла.
Аналогично можно пропустить часть тела цикла ТЦ2 при его исполнении (рис. 24.10).
Обе этих конструкции в теоретическом программировании считаются избыточными, но во многих языках программирования они поддерживаются соответствующими операторами.
Рис. Рис. 24.9. Блок-схема цикла |
Рис. 24.10. Блок-схема цикла |
24.4. Основные операторы циклов и ветвления
← 24.3. Циклические алгоритмические структуры |
24.5. Контрольные вопросы и задания → |
Примеры операторов, поддерживающих описанные в предыдущих разделах структурные конструкции алгоритмов, приведем на примере языков паскаль и С (С++).
Бинарное ветвление на языке Паскаль реализуется оператором if-then-else. Его конструкция имеет следующий вид:
if <логическое выражение > then <оператор 1> else <оператор 2>
Если ветвь реализуется более чем одним оператором, то они объединяются операторными скобками begin ... end. Перед else разделитель «точка с запятой» не ставится.
В качестве примера приведем запись этого оператора для вычисления корней квадратного уравнения по алгоритму, показанному на рис. 23.3.
...
if D>=0 then
begin
x1:=re+im;
x2:=re-im;
key:=0;
end
else
begin
x1:=re;
x2:=im;
key:=1;
end;
...
Обход на языке паскаль реализуется оператором if-then, представляющим упрощенную форму предыдущего без блока else:
if <логическое выражение > then <оператор>
Например,
...
if x<0 then
begin
x:=-x;
y:=sin(x)+exp(x);
end;
...
На языке С++ аналогичные операторы if-else и if имеют следующую форму:
if (<логическое выражение >) <оператор 1> else <оператор 2>;
if (<логическое выражение >) < оператор >;
Примеры их записи:
...
if (x<0)
{
x=-x;
y=sin(x)+exp(x);
}
...
...
if (D>=0)
{
x1=re+im;
x2=re-im;
key=0;
}
else
{
x1=re;
x2=im;
key=1;
}
...
Множественное ветвление на паскале реализуется оператором case-of:
case <s> of
a:<Ветвь A>;
b:<Ветвь B>;
c:<Ветвь C>;
…
else
<Ветвь X>;
end;
В этом операторе S представляет собой выражение любого порядкового типа (целое, символьное и пр.). Оно вычисляется и затем выбирается ветвь с совпадающей по значению меткой (a, b, c в данной записи). После ее исполнения происходит выход из оператора. В качестве меток используются константы того же типа, что и S. Если это значение не совпало ни с одной из меток, то выполняется ветвь, стоящая после служебного слова else. Если действия в ветви требуют несколько операторов, то их следует объединить операторными скобками begin ... end. В конкретном примере применения этого оператора переменным x, y и z присваивается различный набор значений, зависящий от значения переменной-селектора key, которая имеет символьный тип:
...
case key of
'a': begin x:=1; y:=2; z:=3; end;
'b': begin x:=2; y:=3; z:=4; end;
'c': begin x:=3; y:=4; z:=5; end;
else begin x:=0; y:=0; z:=0; end;
end;
...
На C++ множественное ветвление реализуется оператором switch:
switch (<s>)
{
case a:<Ветвь A>; break;
case b:<Ветвь B>; break;
case c:<Ветвь C>; break;
...
default <Ветвь X>;
}
Выражение-селектор S в этом операторе записывается в круглых скобках. Операторы каждой ветви можно не объединять операторными скобками {...}. Но каждая ветвь обычно заканчивается оператором break. Он не является обязательным, но при его отсутствии после текущей ветви будет выполняться следующая. Это расширяет возможности оператора. Например, если break отсутствует в первой ветви и S = a, то после выполнения ветви A будет выполнена ветвь B. При S = b будет выполнена только ветвь B.
Приведенный выше для паскаля пример на языке С++ выглядит следующим образом:
...
switch (key)
{
case 'a': x=1; y=2; z=3; break;
case 'b': x=2; y=3; z=4; break;
case 'c': x=3; y=4; z=5; break;
default: x=0; y=0; z=0;
}
...
Цикл с послеусловием на языке паскаль реализуется оператором repeat-until:
repeat <тело цикла> until <логическое выражение >;
Тело цикла окаймляется служебными словами repeat и until. Цикл повторяется до тех пор, пока логическое выражение, следующее после until, не примет значение Истина. Даже если в тело цикла входит несколько операторов, то операторные скобки begin ... end использовать не нужно. Пример использования этого оператора для нахождения суммы чисел от 1 до n:
...
Sum:=0;
i:=1;
repeat
Sum:=Sum+i;
i:=i+1;
until i>n;
...
На языке С++ цикл с послеусловием реализуется оператором do-while:
do <оператор тела цикла> while (<логическое выражение >);
В отличие от паскаля, возврат на начало цикла будет происходить, пока логическое выражение имеет значение Истина. Когда логическое выражение примет значение Ложь, оператор тела цикла выполнится последний раз и цикл завершится. Логическое выражение записывается в круглых скобках. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример оператора do-while выглядит следующим образом:
...
Sum=0;
i=1;
do
{
Sum=Sum+i;
i++;
}
while (i<=n);
...
Цикл с предусловием на паскале представлен оператором while:
while <логическое выражение > do <оператор тела цикла>;
Оператор тела цикла исполняется, пока логическое выражение имеет значение Истина. Тело цикла, состоящее из нескольких операторов, требует операторных скобок begin ... end. Пример записи этого цикла для расчета суммы предыдущего примера выглядит следующим образом:
...
Sum:=0;
i:=1;
while i<=n do
begin
Sum:=Sum+i;
i:=i+1;
end;
...
На языке C++ цикл с предусловием представлен аналогичным оператором while:
while (<логическое выражение >) <тело цикла>;
Различие с паскалем только в наличии скобок у логического выражения и в отсутствии служебного слова do. Тело цикла, состоящее из некоторых операторов, объединяется в составной операторными скобками {...}. Пример:
...
Sum=0;
i=1;
while (i<=n)
{
Sum=Sum+i;
i++;
}
...
Цикл по переменной на языке паскаль возможен только по переменной целого типа и с шагом, равным единице. Он реализуется операторами for-to-do (прямой цикл) и for-downto-do (обратный цикл):
for var:=<b> to <e> do <оператор тела цикла>
for var:=<b> downto <e> do <оператор тела цикла>
В этих конструкциях
В прямом цикле должно выполняться условие E > B, а в обратном E < B. Если это не выполняется, тело цикла не будет исполняться ни разу. Если тело цикла реализуется несколькими операторами, то они должны объединяться операторными скобками begin ... end.
Использование этих циклов для расчета суммы приведенных выше примеров выглядит следующим образом:
...
Sum:=0;
for i:=1 to n do
Sum:=Sum+i;
...
...
Sum:=0;
for i:=n downto 1 do
Sum:=Sum+i;
...
Удобно использовать эти циклы для работы с массивами, например, для расчета среднего значения Xmean элементов одномерного массива X:
...
Sum:=0;
for i:=1 to n do
Sum:=Sum+X[i];
Xmean:=Sum/n;
...
Для вывода на дисплей элементов матрицы A, состоящей из m строк и n столбцов, используется двойной цикл по индексу строки i и индексу столбца j:
...
for i:=1 to m do
begin
for j:=1 to n do
write(A[i,j]:6:2, );
writeln;
end;
...
Ограничение, связанное с целым (порядковым) типом управляющей переменной в этих циклах создает небольшие неудобства при осуществлении цикла по вещественной переменной, например, при расчете таблицы значений вещественной функции y(x) вещественного аргумента x в пределах от Xmin до Xmax с шагом Xstp. Но они легко преодолеваются, особенно, если результаты нужно записывать в массивы:
...
n:=round((Xmax-Xmin)/Xstp)+1;
for i:=1 to n do
begin
X[i]:=Xmin+(i-1)*Xstp;
Y[i]:=f(X[i]);
end;
...
В этом фрагменте сначала вычисляется число точек зависимости n. Функция round() превращает вещественный результат деления в целый тип, используя правила округления. В цикле по очевидной формуле рассчитывается и записывается в соответствующий элемент массива X[] текущее значение аргумента. Затем рассчитывается и присваивается соответствующему элементу массива Y[] значение функции f() от этого аргумента.
На языке С++ цикл по переменной реализуется оператором for:
for (var = <ИВ >; <ЛВ>; <МВ> ) <оператор тела цикла>
где
Цикл повторяется, пока ЛВ имеет значение Истина . Тело цикла представляет собой либо простой, либо составной оператор со скобками {...}. Переменная цикла может быть вещественной.
Язык С++, в отличие от паскаля, позволяет внутри тела цикла изменять значение управляющей переменной, но делать это не рекомендуется.
Приведенные выше примеры цикла по переменной на языке С++ выглядят следующим образом.
Расчет суммы:
...
Sum=0;
for (i=1; i<=n; i++)
Sum=Sum+i;
...
Расчет среднего значения элементов массива:
...
Sum=0;
for (i=1; i<=n; i++)
Sum=Sum+X[i];
Xmean=Sum/n;
...
Вывод на дисплей матрицы A:
...
for (i:=1; i<=m; i++)
{
for (j=1; j<=n; j++)
printf(“%6.2f ”,A[i][j]);
printf(“\n”);
}
...
Расчет таблицы вещественной функции:
...
n=round((Xmax-Xmin)/Xstp)+1;
for (i=1; i<=n; i++)
{
X[i]=Xmin+(i-1)*Xstp;
Y[i]=f(X[i]);
}
...
Для округления здесь также используется функция round(), которой в стандартном С++ нет, но она легко может быть разработана. Текст ее не приводим, так как для примера записи цикла это не имеет существенного значения.
25.1. Вычисление конечных и бесконечных сумм и произведений
← 24.5. Контрольные вопросы и задания |
25.2. Решение уравнений итерационными методами → |
Для расчета суммы (где Ck - некоторое слагаемое, зависящее от индекса суммирования k) рационально использовать цикл по переменной индексу суммирования. Блок-схема алгоритма представлена на рис. 25.1, а.
Рис. 25.1. Блок-схема алгоритмов вычисления конечных суммы (а) и произведения (б)
На том же рисунке представлена блок-схема расчета произведения , где Ck сомножитель, зависящий от индекса суммирования k.
Эти алгоритмы очень похожи. Только при вычислении суммы переменной S, накапливающей ее, первоначально присваивается нулевое значение, а переменной P, накапливающей произведение, единичное. В теле цикла производится расчет слагаемого (сомножителя), а затем суммированием (умножением) накапливается сумма (произведение).
Вычисление бесконечных сумм возможно только для сходящихся рядов, например, . С ростом k каждое слагаемое должно уменьшаться и сумма стремиться к определенному значению. Цикл суммирования можно прекратить, когда очередное слагаемое по абсолютной величине станет меньше заданной величины . Так как в этом случае обычно нельзя заранее вычислить число повторений, следует использовать цикл с предусловием или цикл с послеусловием. Их блок-схемы приведены на рис. 25.2.
Рис. 25.2. Блок-схемы алгоритмов вычисления бесконечных сумм
Перед началом циклов выполняются начальные установки: счетчик циклов k индекс суммирования и переменная S, накапливающая сумму, обнуляются. В теле цикла сначала индекс суммирования увеличивается на единицу, а затем вычисляется слагаемое и накапливается сумма. Условием повторения цикла является |Ck| ≥ ε. Перед началом цикла с предусловием переменной Ck слагаемому, значение которого вычисляется в теле цикла, необходимо присвоить такое начальное значение, чтобы условие повторения цикла выполнялось. В цикле с послеусловием этого не требуется.
Аналогично можно представить алгоритмы расчета бесконечных произведений, сходящихся к определенному значению.
25.2. Решение уравнений итерационными методами
← 25.1. Вычисление конечных и бесконечных сумм и... |
25.3. Расчет таблиц функциональных зависимостей → |
Циклы с пред- и послеусловием используются при решении уравнений вида F(x) = 0 итерационными методами. Левая часть уравнения F(x) предполагается такой, что аналитическое решение получить невозможно. Численные итерационные методы позволяют получить решение методом последовательных приближений итераций, на каждой из которых находится новое, уточненное решение. Задав нулевое приближение корня x0, по некоторой итерационной формуле вычисляется приближение x1. По нему, используя ту же итерационную формулу, вычисляется x2, затем x3 и т. д. Итерации останавливаются, когда разница между двумя последними найденными значениями станет по абсолютной величине меньше заданной погрешности ε: | xk xk-1 | < ε. Последнее значение xk принимается за искомое решение.
Метод простых итераций требует преобразования уравнения F(x) = 0 к виду x = f(x). Из этого вида следует итерационная формула:
xk = f(xk-1),
где k = 1, 2, 3, … индекс итерации. Метод простых итераций обеспечивает сходимость вычислений к корню, если на интервале итераций выполняется условие .
Блок-схема метода простых итераций на основе цикла с послеусловием приведена на рис. 25.3. Итерационная формула разбивается на три части, сначала на итерации по входящему в нее значению x вычисляется новое приближение корня xk, затем разность dx = xk x, а далее выполняется переприсвоение x = xk для выполнения новой итерации. Разность dx используется для проверки условия повторения итераций.
Рис. 25.3. Блок-схема алгоритма метода простых итераций
В реальной практике нелинейные уравнения чаще всего решаются методом Ньютона с использованием следующей итерационной формулы:
,
где F'(x) - производная левой части уравнения. Метод обеспечивает быструю сходимость итераций, если на их интервале первая и вторая производные левой части уравнения не изменяют знаки. Соответствующая блок-схема представлена на рис. 25.4. Алгоритм реализован на основе цикла с послеусловием, хотя может быть использован и цикл с предусловием. Тело цикла реализует итерационную формулу и не требует пояснений. Логическое выражение при завершении цикла состоит из двух условий, соединенных по ИЛИ. Цикл повторяется, если приращение неизвестной больше или равно погрешности εx либо левая часть уравнения по абсолютной величине больше или равна погрешности εf. Использование двух погрешностей позволяет кроме нахождения корня с заданной погрешностью добиться и малой невязки левой части уравнения с нулем.
Рис. 25.4. Блок-схема алгоритма метода Ньютона
25.3. Расчет таблиц функциональных зависимостей
← 25.2. Решение уравнений итерационными методами |
25.4. Подсчет числа положительных,... → |
В главе 24 приводились примеры циклов, позволяющих рассчитать таблицу вещественной функции вещественного аргумента y = f(x) в пределах изменения аргумента от xmin до xmax с шагом xstp. На рис. 25.5 25.8 эти алгоритмы приведены полностью. В всех четырех вариантах входными данными алгоритмов являются параметры циклов xmin , xmax и xstp. Выходными данными являются одномерные массивы X (значений аргумента) и Y (значений функции), а также переменная целого типа n число точек рассчитанной зависимости. Счетчиком циклов служит переменная целого типа i.
На блок-схеме рис. 25.5 использован цикл с послеусловием, а на блок-схеме рис. 25.6 цикл с предусловием. До начала цикла выполняются начальное присвоение X = xmin и обнуление счетчика i. В теле цикла сначала счетчик увеличивает свое значение на единицу, а затем выполняется расчет значения функции от текущего значения аргумента X. Далее значения функции и аргумента записываются в соответствующие массивы. В конце тела цикла выполняется модификация текущего значения X .
Рис. 25.5. Расчет зависимости y = f(x) в пределах от xmin до xmax с шагом xstp
(цикл с послеусловием)
Рис. 25.6. Расчет зависимости y = f(x) в пределах от xmin до xmax с шагом xstp
(цикл с предусловием)
Рис. 25.7. Расчет зависимости y = f(x) в пределах от xmin до xmax с шагом xstp
(цикл по целой переменной)
На блок-схеме алгоритма на рис. 25.7 для организации цикла по вещественной переменной используется цикл по целой переменной i . Сначала рассчитывается число повторений цикла n, обеспечивающее движение аргумента от xmin до xmax с шагом xstp . Затем выполняется цикл-модификация по i пределах от 1 до n. В теле цикла рассчитывается текущее значение аргумента x, функции y и выполняется их запись в соответствующие массивы.
На блок-схеме алгоритма на рис. 25.8 используется цикл-модификация по вещественной переменной X . Такой цикл в С++ возможен, а на паскале нет. Переменная i служит счетчиком цикла и индексом элементов массивов, в которые записываются выходные данные.
Рис. 25.8. Расчет зависимости y = f(x) в пределах от xmin до xmax с шагом xstp
(цикл по вещественной переменной)
25.4. Подсчет числа положительных, отрицательных и нулевых элементов массивов
← 25.3. Расчет таблиц функциональных зависимостей |
25.5. Расчет модуля вектора и нормы матрицы → |
Это достаточно простые алгоритмы, основанные на последовательном переборе элементов массива. Перед циклом перебора переменные-счетчики каждого типа значений обнуляются. В теле цикла с помощью бинарных ветвлений увеличивается на единицу значение того счетчика, который соответствует типу элемента.
Блок-схемы алгоритмов приведены на рис. 25.9 (для одномерного массива) и 25.10 (для двумерного массива). Счетчиком положительных элементов является переменная pos, отрицательных neg и нулевых zer. Число элементов в одномерном массиве X равно n, число строк в двумерном массиве-матрице A равно m, а столбцов n.
Рис. 25.9. Алгоритм подсчета числа положительных (pos), отрицательных (neg) и
нулевых (zer) элементов в одномерном массиве
Рис. 25.10. Алгоритм подсчета числа положительных (pos), отрицательных (neg) и
нулевых (zer) элементов в двумерном массиве
25.5. Расчет модуля вектора и нормы матрицы
← 25.4. Подсчет числа положительных,... |
25.6. Расчет среднего и дисперсии элементов в... → |
Модулем вектора (одномерного массива) X, содержащего n компонент, является величина
.
Нормой матрицы A, состоящей из m строк и n столбцов, служит аналогичная величина:
.
Алгоритмы их расчета заключаются в накоплении соответствующих сумм и в последующем извлечении квадратного корня (рис. 25.11). Символом sqrt обозначена операция (функция) извлечения квадратного корня
Рис. 25.11. Расчет модуля n-мерного вектора (а) и нормы матрицы (б)
25.6. Расчет среднего и дисперсии элементов в массивах
← 25.5. Расчет модуля вектора и нормы матрицы |
25.7. Поиск минимальных или максимальных... → |
Среднее значение Xmean одномерного массива (выборки), состоящего из n элементов, и его дисперсия D рассчитываются по известным формулам:
;
.
Корень квадратный из дисперсии называется среднеквадратичным отклонением S.
Блок-схема алгоритма приведена на рис. 25.12. Сначала считается среднее значение, а затем дисперсия. Суммы накапливаются в циклах по переменной i индексу суммирования. Циклы имеют одинаковые параметры, но объединять их, на первый взгляд, нельзя, так как второй цикл использует результат, появляющийся при завершении первого. Но если преобразовать формулу для дисперсии, раскрывая квадрат разности, то можно получить:
Рис. 25.12. Расчет среднего значения и среднеквадратичного отклонения
в выборке (одномерный массив)
.
При этом появляется две суммы сумма элементов массива и сумма их квадратов, которые накапливаются в одном цикле. Блок-схема этого варианта алгоритма приведена на рис. 25.13.
Рис. 25.13. Расчет среднего значения и дисперсии
в выборке (один объединенный цикл)
25.7. Поиск минимальных или максимальных значений в массивах
← 25.6. Расчет среднего и дисперсии элементов в... |
25.8. Алгоритмы упорядочивания элементов в... → |
Поиск минимального значения элементов одномерного массива реализуется алгоритмом, блок-схема которого представлена на рис. 25.14, а. Для поиска используется вспомогательная переменная Xm, которой сначала присваивается значение, заведомо большее всех элементов массива (в данном алгоритме 1038). Затем организуется цикл перебора всех элементов массива. В теле цикла величина каждого элемента сравнивается со значением Xm . Если она оказывается меньше, то ее значение присваивается переменной Xm , а индекс этого элемента присваивается переменной im . После завершения цикла im будет содержать индекс элемента с наименьшей величиной, а переменная Xm его значение. Если в массиве содержится несколько минимальных значений одинаковой величины, то будет найдено первое. Если же условие выполнения действия в структуре «обход» записать как Xi<=Xm , то будет найдено последнее.
Для поиска максимального по величине элемента нужно переменной Xm изначально присвоить минимально возможное значение (например, -1038), а условие в альтернативе изменить на противоположное: Xi > Xm .
Поиск минимального или максимального значений в двумерном массиве отличается только тем, что задается двойной цикл сканирования (рис. 25.14 б).
Можно легко совместить поиск минимального и максимального значений в одном цикле сканирования. Для этого необходимы две переменные Xmin и Xmax для запоминания текущих минимального и максимального значений и переменные imin и imax для запоминания индексов элементов.
Рис. 25.14. Поиск минимального элемента в одномерном (а) и двумерном (б) массивах
25.8. Алгоритмы упорядочивания элементов в массивах
← 25.7. Поиск минимальных или максимальных... |
25.9. Умножение матрицы на вектор и матрицы на... → |
Алгоритмы упорядочивания элементов одномерных массивов по возрастанию или убыванию их величины (сортировки) являются одними из важнейших в программировании. Существует достаточно много различных алгоритмов сортировки; здесь рассматривается только два из них.
Первый алгоритм достаточно прост по сути он строится на основе изложенного в разделе 25.7. Рассмотрим его на примере упорядочивания по возрастанию n элементов одномерного массива X. Он основан на следующих действиях.
Сначала находится минимальный элемент массива. Этот элемент >Xm c индексом im обменивается местами с первым. Затем находится новый минимальный элемент в ряду от второго до последнего. Он обменивается местами со вторым. И так далее. Цикл поиска и обмена местами повторяется до предпоследнего элемента, т.е. n-1 раз. Блок-схема этого алгоритма представлена на рис. 25.15.
Если найденный минимальный элемент совпадает с начальным элементом поиска, то их не нужно обменивать местами. Но для некоторого упрощения в блок-схеме исключена проверка этого случая и сохранен обмен элемента с самим собой. Обмен элементов местами производится через вспомогательную переменную tmp.
Проанализируем работу этого алгоритма на примере массива из четырех элементов:
При первом исполнении основного цикла будет найден минимальный четвертый элемент и обменен местами с первым:
При втором прохождении будет найден минимальный третий элемент и обменен местами со вторым:
И наконец, при последнем прохождении цикла будет найден минимальный четвертый элемент, обменен местами с третьим и все элементы окажутся упорядочены.
Рис. 25.15. Сортировка элементов одномерного массива
(упорядочивание по возрастанию)
Более эффективен другой алгоритм сортировки, называемый пузырьковым. Его блок-схема приведена на рис. 25.16. Он более компактный, чем предыдущий. Проанализируем его работу на таком же примере. Для наглядности изобразим вертикальное расположение ячеек массива при возрастании номера сверху вниз.
Рис. 25.16. Сортировка элементов одномерного массива
(упорядочивание по возрастанию пузырьковым методом)
Исходное состояние элементов массива следующее:
При первом исполнении тела внешнего цикла внутренний цикл будет исполняться трижды. При этом сначала обменяются местами третий и четвертый элементы, затем второй и третий и, наконец, первый и второй. В результате этих обменов элемент массива, равный единице, как пузырек воздуха, всплывает вверх:
При втором исполнении тела внешнего цикла внутренний цикл будет исполняться 2 раза. Сначала обменяются местами третий и четвертый элементы, а затем второй и третий.
При последнем исполнении тела внешнего цикла внутренний цикл исполняется один раз и в нем переставляются местами третий и четвертый элементы;
Сортировка завершена.
Алгоритмы упорядочивания матриц оказываются более сложными. Приведем в качестве примера алгоритм перестановки строк матрицы, в результате которой средние значения элементов по строкам возрастают от первой строки до последней. Он представлен на рис. 25.17.
Рис. 25.17. Сортировка строк матрицы: в результате сортировки средние значения по строкам
возрастают от первой строки к последней
Матрица A имеет m строк и n столбцов. Сначала в цикле по индексу строки i рассчитываются средние значения по строкам; их значения записываются в массив S. Затем сортируются элементы массива S по возрастанию первым из описанных выше методом. При перестановке элементов массива S одновременно переставляются связанные с ними строки матрицы. После окончания сортировки массива S все строки матрицы A оказываются упорядочены нужным образом.
Второй алгоритм, представленный на рис. 25.18, упорядочивает элементы матрицы A из m строк и n столбцов так, чтобы они возрастали как по строкам, так и по столбцам. Для этого используется вспомогательный одномерный массив X. Сначала элементы матрицы A по строкам переписываются в одномерный массив X, затем упорядочиваются там пузырьковым методом и переписываются обратно в той же последовательности по строкам. При переписывании данных из двумерного массива в одномерный и обратно использованы два разных способа установления соответствия индексов двумерного и одномерного массивов. В первом случае индекс одномерного массива формируется как счетчик, который сначала обнуляется, а в теле цикла перезаписи увеличивается на единицу. Во втором случае используется соответствие индексов i (строки) и j (столбца) матрицы и индексу k одномерного массива:
k = j + (i - 1)·n
Оба этих способа эквивалентны. На блок-схеме фрагмент упорядочивания одномерного массива не детализирован, так как он совпадает с приведенным на рис. 25.16.
Для исполнения этой задачи может быть предложен более оптимальный алгоритм, не использующий одномерный массив и представляющий собой двумерный вариант алгоритма на рис. 25.15. Однако приведенный вариант с одномерным массивом полезен тем, что показывает приемы перезаписи элементов из двумерного массива в одномерный и обратно иногда это требуется при разработке алгоритмов.
Рис. 25.18. Сортировка строк матрицы: в результате сортировки
элементы возрастают как по строкам, так и по столбцам
25.9. Умножение матрицы на вектор и матрицы на матрицу
← 25.8. Алгоритмы упорядочивания элементов в... |
25.10. Возведение квадратной матрицы в целую... → |
Алгоритмы умножения матрицы на вектор и матрицы на матрицу реализуют основные операции матричной алгебры. Они достаточно просты, но очень наглядно иллюстрируют применение циклов при работе с массивами.
В результате умножения матрицы A состоящей из m строк и n столбцов на вектор X, содержащий n компонентов, получается вектор Y, состоящий из m компонентов:
Y = A × X.
Каждый компонент результирующего вектора Y находится по формуле
; (i = 1, 2, 3, … , m).
Из этой формулы следует внешний цикл по индексу i. В теле этого цикла происходит накопление суммы. Обычно специальной переменной для суммы не используют, а накапливают ее в i-м компоненте вектора Y. Перед накоплением суммы Yi обнуляется, а затем организуется цикл по индексу суммирования j. Блок-схема этого алгоритма приведена на рис. 25.19, а.
Рис. 25.19. Блок-схемы умножения матрицы на вектор (а) и матрицы на матрицу (б)
В результате умножения матрицы A из m строк и n столбцов на матрицу B из n строк и p столбцов получается матрица C, состоящая из m строк и p столбцов:
C = A × B.
Каждый элемент матрицы-результата рассчитывается по формуле
(i = 1, 2, 3, … , m; j = 1, 2, 3, … , p).
Блок-схема алгоритма перемножения матриц приведена на рис. 25.19, б. Он очень похож на предыдущий, но только элементы результирующей матрицы рассчитываются в двойном цикле по индексу строки i и индексу столбца j. Накопление суммы выполняется в цикле по переменной k.
25.10. Возведение квадратной матрицы в целую степень
← 25.9. Умножение матрицы на вектор и матрицы на... |
25.11. Исключение элементов массивов → |
Операция перемножения матриц дает возможность путем повторного умножения реализовать операцию возведения квадратной матрицы в целую степень. Это в свою очередь позволяет вычислять матричные степенные ряды, через которые выражаются матричные функции матричного аргумента. Рассмотрим алгоритм возведения квадратной матрицы A, содержащей n строк и n столбцов в степень m. Результирующую матрицу будем именовать B:
B = Am = E × A × A ×...× A,
где E единичная матрица. Операция умножения выполняется m раз.
Блок-схема этого алгоритма представлена на двух уровнях детализации (рис. 25.20). На первом уровне (рис. 25.20, а) основные блоки представлены укрупненно. На рис. 25.20, б справа первый и последний блоки детализированы до основных алгоритмических конструкций. Блок умножения матрицы на матрицу не детализирован, так как он рассмотрен в предыдущем разделе и предполагается, что в данном алгоритме он реализован как вызов вспомогательного алгоритма.
Рис. 25.20. Алгоритм возведения матрицы в целую степень:
а первый уровень детализации (основные блоки представлены укркпненно);
б второй уровень детализации (первый и последний блоки детализированы)
В основе алгоритма лежит цикл повторного умножения (по переменной k), который выполняется m раз. До начала цикла в выходной матрице B формируется единичная матрица. В теле основного цикла вызовом вспомогательного алгоритма выполняется умножение матрицы B на возводимую матрицу A, результатом является матрица C. Второй фрагмент тела цикла заключается в передаче данных от матрицы С матрице B. Детализации первого и третьего блока просты и не требуют особых пояснений.
25.11. Исключение элементов массивов
← 25.10. Возведение квадратной матрицы в целую... |
25.12. Расчет определителя квадратной матрицы → |
В некоторых задачах возникает необходимость исключать из одномерных массивов отдельные элементы или группы элементов. Из двумерных массивов могут исключаться заданные строки и столбцы. Например, вычисление минора матрицы заключается в расчете определителя матрицы, полученной из исходной вычеркиванием заданных строки и столбца.
Сначала рассмотрим простой алгоритм исключения из одномерного массива X, содержащего n элементов, элемента с номером r. При таком исключении место элемента Xr должен занять элемент Xr+1, а его место элемент Xr+2 и т.д. Общее число элементов в массиве уменьшится на единицу. Этот алгоритм представлен на рис. 25.21, а.
На рис. 25.21, б представлен алгоритм исключения из двумерного массива матрицы строки ir и столбца jr. Принципиально он не отличается от предыдущего, только на одну позицию сдвигаются не отдельные элементы, а строки и столбцы.
Рис. 25.21. Блок-схемы алгоритмов исключения из одномерного массива заданного элемента с индексом r (а)
и из двумерного массива матрицы строки ir и столбца jr (б)
Более сложно является исключение элементов по какому-либо признаку, например, отрицательных элементов. Их может быть несколько, и они могут быть расположены в массиве любым образом, в том числе и несколько элементов подряд. Самое простое исключение выполняется с использованием вспомогательного массива. В него переписываются элементы, которые необходимо оставить в исходном массиве. После завершения цикла переписывания все элементы вспомогательного массива возвращаются в исходный массив. Блок-схема алгоритма представлена на рис. 25.22.
Более рациональным, но и более сложным выглядит алгоритм без использования вспомогательного массива, над таким алгоритмом предлагается подумать самостоятельно.
Рис. 25.22. Блок-схема алгоритма исключения из одномерного массива
всех отрицательных элементов
25.12. Расчет определителя квадратной матрицы
← 25.11. Исключение элементов массивов |
25.13. Транспонирование матриц → |
Алгоритм расчета основан на приведении матрицы к треугольному виду и последующему нахождению произведения элементов главной диагонали.
Алгоритм приведения матрицы к треугольному виду, не изменяющий значение определителя, заключается в следующем:
.
После приведения матрицы к треугольному виду вычисляется произведение диагональных элементов:
.
Блок-схема алгоритма представлена на рис. 25.23.
Рис. 25.23. Блок-схема алгоритма расчета определителя квадратной матрицы
Для работы алгоритма при возможных нулевых элементах в главной диагонали (в исходной матрице или полученных при пересчете) рекомендуется использовать процедуру выбора главного элемента. Она заключается в перестановке строк матрицы на каждом шаге ее приведения к треугольному виду перед пересчетом. Отыскивается строка, содержащая в k-м столбце наибольший по абсолютной величине элемент, а затем производится перестановка местами k-й строки и строки с этим наибольшим элементом. Только после этого осуществляется деление на akk. Каждая перестановка меняет знак определителя на противоположный. Над этим вариантом алгоритма также рекомендуем подумать самостоятельно.
25.13. Транспонирование матриц
← 25.12. Расчет определителя квадратной матрицы |
25.14. Контрольные вопросы и задания → |
Транспонирование преобразование матрицы A, при котором ее строки меняются местами со столбцами. Это выполняется относительно просто, если транспонированная матрица помещается в другой массив At. Блок-схема этого алгоритма представлена на рис. 25.24, а.
Если транспонировать матрицу нужно в этом же массиве, то алгоритм существенно усложняется. Внешний цикл двойного цикла обмена нужно делать по строкам, если число строк m меньше числа столбцов n, и, наоборот, по столбцам, если число столбцов меньше. Переменная внутреннего цикла изменяется от значения управляющей переменной внешнего цикла. Для обмена элементов необходимо использовать промежуточную переменную tmp. После завершения обмена элементов массива через эту же переменную обмениваются значениями переменные m и n. Блок-схема этого варианта представлена на рис. 25.24, б.
Рис. 25.24. Блок-схемы алгоритмов транспонирования матрицы
с помещением результата в другой массив (а) и без дополнительного массива (б)
26.1. Что такое язык программирования?
← 25.14. Контрольные вопросы и задания |
26.2. Низкоуровневые языки программирования → |
Первые программисты обходились без языков программирования. Самые первые цифровые электронно-вычислительные машины создавались для конкретных, узкоспециализированных задач (например, для решения систем линейных уравнений методом Гаусса), и программу их работы изменить было невозможно в принципе. Естественно, вопрос программирования подобных вычислительных систем даже не возникал, можно было только менять входные данные. Вскоре были созданы вычислительные машины с изменяемой программой, которые программировались посредством соединения гнезд на специальной коммутационной панели, таким образом, задавалась последовательность выполняемых операций.
Затем появились действительно универсальные цифровые ЭВМ, позволяющие менять программы путем загрузки их в оперативную память. Каждый компьютер имеет свой машинный язык, т.е. свою совокупность машинных команд, которая отличается количеством адресов в команде, назначением информации, задаваемой в адресах, набором операций, которые может выполнить машина, и др. Процесс написания программы на машинном языке достаточно трудоемок и утомителен.
Для сокращения времени разработки программ были созданы первые языки программирования.
В настоящее время в мире существует несколько сотен реально используемых языков программирования. Для каждого есть своя область применения. Каждый год их число пополняется новыми языками. Некоторыми языками умеет пользоваться только небольшое число непосредственных разработчиков, другие языки становятся известными миллионам людей. Профессиональные программисты иногда применяют в своей работе более десятка разнообразных языков программирования.
Язык программирования искусственный (формальный) язык, предназначенный для записи алгоритмов. Язык программирования задается своим описанием и реализуется в виде специальной программы транслятора.
Любой алгоритм есть последовательность предписаний, выполнив которые, можно за конечное число шагов перейти от исходных данных к результату. В зависимости от степени детализации предписаний обычно определяется уровень языка программирования чем меньше детализация, тем выше уровень языка.
По этому критерию можно выделить следующие уровни языков программирования:
Со времени создания первых программируемых машин человечество придумало уже более восьми с половиной тысяч языков программирования. Главным признаком, по которому можно квалифицировать языки программирования, является принадлежность к одному из оформившихся к настоящему времени стилей программирования, каждому из которых соответствует своя собственная модель вычислений.
Рис. 26.1. Эволюция языков программирования
26.2. Низкоуровневые языки программирования
← 26.1. Что такое язык программирования? |
26.3. Языки высокого уровня → |
Машинные языки и машинно-ориентированные языки это языки низкого уровня, требующие указания мелких деталей процесса обработки данных. Языки высокого уровня имитируют естественные языки, используя некоторые слова разговорного языка и общепринятые математические символы. Такие языки более удобны для человека.
При программировании на машинном языке программист может держать под своим контролем каждую команду и каждую ячейку памяти и использовать все возможности имеющихся в компьютере операций. Текст программы получается громоздкий, труднообозримый, программу трудно отлаживать, изменять и развивать. Поэтому в случае, когда нужно иметь эффективную программу, в максимальной степени учитывающую специфику конкретного компьютера, вместо машинных языков используют близкие к ним машинно-ориентированные языки (ассемблеры).
Язык ассемблера это машинно-зависимый язык низкого уровня, в котором короткие мнемонические имена соответствуют отдельным машинным командам. Используется для представления в удобочитаемой форме программ, записанных в машинном коде.
Язык ассемблера позволяет программисту пользоваться текстовыми мнемоническими (т. е. легко запоминаемыми человеком) кодами, по своему усмотрению присваивать символические имена регистрам компьютера и памяти, а также задавать удобные для себя способы адресации. Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант, использовать в программе комментарии и др. Программы, написанные на языке ассемблера, требуют уже значительно меньшего объема памяти и времени выполнения. Знание программистом языка ассемблера и машинного кода дает ему понимание архитектуры машины.
Для того чтобы написать программу на языке ассемблера для конкретного компьютера, необходимо знать его архитектуру.
Самыми рутинными операциями при программировании в кодах были:
Для первой проблемы было найдено следующее решение: для каждой машинной команды подбирались краткие мнемоники, отражающие ее суть. Например, для команды пересылки данных MOV, для команды сложения ADD и т.п. Такие мнемоники намного легче запомнить, чем двоичные, восьмеричные или шестнадцатеричные коды команды; кроме того, их не в пример легче читать, а это тоже немаловажно при отладке программы или ее изменении. Вторая и третья проблемы также были решены без особых усилий: вместо использования реальных адресов в тексте программы располагались символические метки, а программа, генерирующая машинный код, вычисляла фактическое расположение ячеек в оперативной памяти и поставляла его в код.
В качестве примера приведем программу на языке ассемблера для IBM PC. Программа вычисляет значение a = b + c для целых a, b и c.
|
.MODEL |
SMALL |
Директива .MODEL задает механизм распределения памяти под данные и команды. |
|
.DATA |
|
Директива .DATA определяет начало участка программы с данными. |
b |
DW |
5 |
Директивы DW задают типы переменных и их значения. |
c |
DW |
3 |
|
a |
DW |
? |
|
|
.CODE |
|
Директива .CODE определяет начало участка программы с командами. |
begin |
MOV |
AX,@DATA |
Команды MOV AX,@DATA и MOV DS,AX записывают адрес сегмента данных в регистр DS (Data Segment) |
|
MOV |
DS,AX |
|
|
MOV |
AX,B |
Для вычисления a используются команды MOV AX, B, ADD AX,C и MOV A,AX. |
|
ADD |
AX,C |
|
|
MOV |
A,AX |
|
|
MOV |
AH,4CH |
|
|
INT |
21H |
|
|
END |
begin |
В директиве END задана метка первой выполняемой инструкции программы - begin. |
Перевод программы с языка ассемблера на машинный язык осуществляется специальной программой, которая называется ассемблером и является по сути простейшим транслятором.
← 26.2. Низкоуровневые языки программирования |
26.4. Контрольные вопросы и задания → |
26.3.1. Процедурные языки программирования
26.3.2. Функциональные языки программирования
26.3.3. Логические языки программирования
26.3.4. Объектно-ориентированные языки программирования
Языки высокого уровня были разработаны для того, чтобы освободить программиста от анализа технических особенностей конкретных компьютеров, их архитектуры.
Язык высокого уровня язык программирования, который обеспечивает описание задачи в наглядном, легко воспринимаемом виде, удобном для программиста.
Алгоритмические языки в значительной мере являются машинно-независимыми. Они облегчают работу программиста и повышают надежность создаваемых программ. Однако программы, написанные на языках высокого уровня, требуют перевода в машинные коды с помощью трансляторов.
Первым общепризнанным языком высокого уровня можно по праву назвать Fortran, первая версия которого появилась в ноябре 1954 года.
Языки программирования высокого уровня:
↑ Наверх
Процедурные (алгоритмические) языки (Fortran, Cobol, Algol, Basic, Pascal, C и др.) предназначены для однозначного описания алгоритмов. Для решения задачи процедурные языки требуют в той или иной форме явно записать процедуру ее решения. Программа на процедурном языке программирования состоит из последовательности операторов (инструкций), задающих те или иные действия.
Фортран (FORTRAN, FORmula TRANslation) язык программирования высокого уровня, разработанный фирмой IBM в 1956 году для описания алгоритмов решения вычислительных задач. Наиболее распространенными версиями этого языка являются Фортран IV, Фортран 77 и Фортран 90. Последние версии Фортрана используются для программирования компьютеров с параллельной архитектурой.
Кобол (COBOL, COmmon Business-Oriented Languauge) язык программирования высокого уровня, разработанный в конце 1959-х гг. ассоциацией КАДАСИЛ для решения коммерческих и экономических задач. Отличается развитыми средствами работы с файлами. Поскольку команды программ, написанных на Коболе, используют обычную английскую лексику и синтаксис, язык считался одним из самых простых. В настоящее время практически не используется.
Алгол (ALGOL, ALGOrithmic Language) - язык программирования высокого уровня, ориентированный на описание алгоритмов вычислительных задач. Был создан в 1958 году специалистами западно-европейских стран для решения научных задач. Версия этого языка Алгол-60 была принята Международной конференцией в Париже и получила широкое распространение. Версия Алгол-68, разработанная группой специалистов Международной федерации по обработке информации в 1968 году, получила статус международного универсального языка программирования, ориентированного на решение не только вычислительных, но и информационных задач. Хотя этот язык не получил широкого распространения, он долгие годы являлся стандартом для описания алгоритмов в научной литературе.
Бейсик (BASIC, Beginner`s All-purpose Symbolic Instruction Code) язык программирования высокого уровня, разработанный в 19631964 годах в Дартмутском колледже Томасом Куртом и Джоном Кемени. Первоначально предназначался для обучения программированию. Отличался простотой благодаря наличию упрощенных конструкций языка Фортран и встроенных математических функций. В большинстве версий Бейсика используется интерпретатор для преобразования конструкций языка в машинный код, что позволяет запускать программы без промежуточной трансляции. В начале 1999 года корпорация Microsoft выпустила версию Visual Basic (VB 6.0), предназначенную для создания многокомпонентных приложений для систем уровня предприятий.
Паскаль (PASCAL, Program Applique a la Selection et la Compilation Automatique de la Litterature) французский язык программирования высокого уровня, разработанный в конце 1960-х годов швейцарским профессором, ставшим Нобелевским лауреатом, Никласом Виртом. Язык предназначался для первоначального обучения программированию в университете. Назван в честь французского математика XVII века Блеза Паскаля. Для IBM PC наиболее популярной являлась система программирования Delphi фирмы Borland.
Си (C) язык программирования высокого уровня, разработанный Денисом Ритчи в начале 1970-х годов на основе языка BCPL. Стал базовым языком операционной системы Unix. До сих пор является одним из наиболее популярных языков программирования.
↑ Наверх
Функциональные языки (LISP, ML, Erlang, Haskell) программа на таком языке представляет собой совокупность описаний функций и выражений, которые необходимо вычислить. Функциональное программирование не использует концепцию памяти как хранилища значений переменных. Операторы присваивания отсутствуют, вследствие чего переменные обозначают не области памяти, а объекты программы, что полностью соответствует понятию переменной в математике. Наличие стройной математической основы обеспечивает возможность использования алгебраических методов создания структуры, преобразования и исследования программ. Это в какой-то мере приближает их к описанию структуры мышления человека.
Лисп (LISP, LISt Processing) язык программирования высокого уровня, разработанный в 1960 году Джоном Маккарти и предназначенный для манипулирования перечнями элементов данных. Использовался в университетских лабораториях США для решения задач, связанных с искусственным интеллектом.
↑ Наверх
Логические языки (Prolog) ориентированы не на разработку алгоритма решения задачи, а на систематическое и формализованное описание задачи с тем, чтобы решение следовало из составленного описания. В логическом программировании нужно только специфицировать факты, на которых алгоритм основывается, а не определять последовательность шагов, которые требуется выполнить. Логические программы отличаются принципиально низким быстродействием, так как вычисления осуществляются методом проб и ошибок (посредством поиска с возвратами).
Пролог (PROLOG, PROgramming in LOGic) язык программирования высокого уровня, предназначенный для разработки систем и программ искусственного интеллекта. Был разработан в 1971 году в университет Марселя. Последняя его версия Prolog 6.0.
↑ Наверх
Объектно-ориентированные (C++, С#, Java и др.) в основе этих языков лежит понятие объекта, сочетающего в себе данные и действия над ними. Описание действительности в форме системы взаимодействующих объектов естественнее, чем в форме взаимодействующих процедур. Прототипом объектно-ориентированного программирования явился язык SIMULA-67. Но оформилось оно в самостоятельный стиль программ с появлением языка SMALLTALK (1972), первоначально предназначенного для реализаций функций машинной графики.
Си++ (С++) язык программирования высокого уровня, созданный Бьярном Страустрапом на базе языка Си. Является его расширенной версией, реализующей принципы объектно-ориентированного программирования.
Java объектно-ориентированный язык программирования высокого уровня, разработанный фирмой Sun Microsystem в 1994 году Он во многом сходен с С++ и нашел широкое распространение для написания программных продуктов в сетевых системах. Язык рассчитан на передачу по Интернет текстов программ, которые на всех компьютерах должны выполняться одинаковым образом.
C# (C Sharp, Си Шарп) объектно-ориентированный язык программирования высокого уровня, разработанный в 2000 году фирмой Microsoft на основе языков C++ и Java.
27.1. Трансляция, компиляция и интерпретация
← 26.4. Контрольные вопросы и задания |
27.2. Контрольные вопросы и задания → |
Язык программирования задается описанием и реализуется в виде специальной программы транслятора. Существует два вида трансляторов компиляторы и интерпретаторы. Соответственно и языки программирования делятся на два класса компилируемые и интерпретируемые.
Текст программы, записанный на каком-либо компилируемом языке, при помощи специальной программы компилятора преобразуется (компилируется) в набор инструкций для данного типа процессора (машинный код) и далее записывается в исполняемый файл, который может быть запущен на выполнение как отдельная программа. То есть компилятор переводит программу с языка высокого уровня на низкоуровневый язык, понятный процессору.
Если же программа написана на интерпретируемом языке, то интерпретатор непосредственно выполняет (интерпретирует) ее текст без предварительного перевода. То есть компилятор переводит программу на машинный язык сразу и целиком, создавая при этом отдельную программу, а интерпретатор переводит на машинный язык прямо во время исполнения программы. Можно сказать, что процессор компьютера это аппаратный интерпретатор машинного кода.
Разделение на компилируемые и интерпретируемые языки является достаточно условным. Так, для любого традиционно компилируемого языка (например, Паскаль) можно написать интерпретатор, как и для интерпретируемого языка можно создать компилятор. Например, язык Лисп, изначально интерпретируемый, может компилироваться без каких бы то ни было ограничений. Создаваемый во время исполнения программы машинный код может так же динамически компилироваться во время исполнения.
Как правило, скомпилированные программы выполняются быстрее и не требуют для выполнения дополнительных средств, так как уже переведены на машинный язык. Вместе с тем при каждом изменении текста программы требуется ее перекомпиляция, что создает трудности для разработчиков. Кроме того, скомпилированная программа может выполняться только на том же типе компьютеров и, как правило, под той же операционной системой, на которые был рассчитан компилятор. Чтобы создать исполняемый файл для машины другого типа требуется новая компиляция.
Интерпретируемые языки обладают некоторыми специфическими дополнительными возможностями, кроме того, программы на них можно запускать сразу же после изменения, что облегчает разработку. Программа на интерпретируемом языке нередко может быть запущена на разных типах машин и операционных систем без дополнительных усилий. Однако интерпретируемые программы выполняются заметно медленнее, чем компилируемые, и они не могут выполняться без дополнительной программы-интерпретатора.
Некоторые языки (например Java и C#) относятся как к компилируемым, так и к интерпретируемым. Текст программы компилируется не в машинный язык, а в машинно-независимый код низкого уровня байт-код. Далее байт-код выполняется с помощью специальной программы виртуальной машины. Для языка Java байт-код исполняется виртуальной машиной Java Virtual Machine, JVM, для C# Common Language Runtime (CLR).
Для выполнения байт-кода обычно используется интерпретация, хотя отдельные его части для ускорения работы программы могут быть оттранслированы в машинный код непосредственно во время выполнения программы. Подобный подход в некотором смысле позволяет использовать плюсы и интерпретаторов, и компиляторов.
28.Введение
← 27.2. Контрольные вопросы и задания |
28.1. Постановка и формализация задачи → |
Для того чтобы реализовать некоторый алгоритм на компьютере, необходимо пройти несколько этапов:
28.1. Постановка и формализация задачи
← 28.Введение |
28.2. Разработка алгоритмов решения задачи → |
Постановка и формализация задачи состоит из нескольких этапов:
На начальном этапе развития информационных технологий каждый из этих этапов выполняли люди с ответствующей специализацией. Математик формализовал задачу, программист разрабатывал программу, результаты работы программы оценивал специалист в той области знаний, для которой разрабатывалась программа. Каждый из этих этапов является составной частью изучения предмета информатики. За рубежом эта область знаний называется компьютерной наукой (computer science or computing science) и рассматривается как один из разделов математики.
28.2. Разработка алгоритмов решения задачи
← 28.1. Постановка и формализация задачи |
28.3. Составление программы на языке... → |
Наиболее эффективно математическую модель можно реализовать на компьютере в виде алгоритмической модели.
Данный этап включает разработку алгоритмов решения задачи и программирование или непосредственную подготовку текста программ.
Разработка алгоритма включает в себя выбор метода проектирования алгоритма, выбор формы записи алгоритма (блок-схемы и др.), выбор тестов и метода тестирования, проектирование самого алгоритма.
Алгоритм это точное предписание, определяющее вычислительный процесс, ведущий от исходных данных к искомому результату.
Существуют следующие способы описания алгоритма: словесный, структурно-стилизованный, язык графических символов, операторный язык.
← 28.2. Разработка алгоритмов решения задачи |
28.4. Отладка программы → |
28.4. Отладка программы
← 28.3. Составление программы на языке... |
28.5. Анализ результатов → |
Под отладкой программы понимается процесс испытания работы программы и исправления обнаруженных при этом ошибок. Обнаружить ошибки, связанные с нарушением правил записи программы на языке программирования (синтаксические и семантические ошибки), помогает используемая система программирования. Пользователь получает сообщение об ошибке, исправляет ее и снова повторяет попытку исполнить программу.
Для отладки программы необходимо:
На каждом этапе необходимо выполнить определенные действия.
Рис. 28.1. Фотография первого «бага»
Проверка на компьютере правильности алгоритма производится с помощью тестов. Тест это конкретный вариант значений исходных данных, для которых известен ожидаемый результат. Прохождение теста необходимое условие правильности программы. На тестах проверяется правильность реализации программой запланированного сценария. Однако правильность выполнения тестового примера все равно не гарантирует отсутствие ошибок.
Таким образом, тестирование и отладка включают в себя синтаксическую отладку, отладку семантики и логической структуры программы, тестовые расчеты и анализ результатов тестирования, совершенствование программы с целью минимизации структуры и времени выполнения.
Рис.28.2. Этапы отладки программы
28.5. Анализ результатов
← 28.4. Отладка программы |
28.6. Сопровождение программ → |
На данном этапе решается вопрос о правильности и полноте результатов выбранной модели, применимости их как в практической деятельности, так и для совершенствования модели. Проверяется адекватность модели по тем свойствам, которые были выбраны в качестве существенных.
28.6. Сопровождение программ
← 28.5. Анализ результатов |
28.7. Интегрированные среды программирования → |
Последний этап это использование уже разработанной программы для получения искомых результатов. Производится анализ результатов решения задачи и в случае необходимости уточнение математической модели (с последующей корректировкой алгоритма и программы). Программы, имеющие большое практическое или научное значение, используются длительное время.
Необходимым элементом этого этапа является сопровождение программ. Сопровождение программ это комплекс организационных мер для успешного функционирования программ и их использования сторонними пользователями. Для успешной организации сопровождения кроме хорошо написанной инструкции необходимо организовать постоянно действующую консультационную службу, которая может ответить на технические вопросы, разобраться с неполадками, исправить и доработать программу в случае нахождения ошибок.
28.7. Интегрированные среды программирования
← 28.6. Сопровождение программ |
28.8. Контрольные вопросы и задания → |
На каждом из этапов реализации алгоритма используется своя программа:
Для удобства все эти программы объединяются в интегрированные среды. Существует очень много подобных программ, но наиболее известны продукты фирм Borland и Microsoft.
29.1. Технология структурного программирования
← 28.8. Контрольные вопросы и задания |
29.2. Структурные методы анализа и... → |
В конце 1960-х годов в США было отмечено явление под названием «software crisis» (кризис ПО). Это выражалось в том, что большие проекты стали выполняться с отставанием от графика или с превышением сметы расходов, разработанный продукт не обладал требуемыми функциональными возможностями, производительность его была низка, качество получаемого программного обеспечения не устраивало потребителей [18].
Кризис программного обеспечения привел к потребности в новом способе создания программ, который снижал бы общие затраты на протяжении всего жизненного цикла программы от замысла до завершения эксплуатации (морального старения). Такая технология появилась в начале 1970-х годов и была названа структурным программированием. В основе структурного программирования лежит сочетание теории программирования и личного опыта высококвалифицированных программистов, а также учет современных требований к программам и промышленного характера их производства.
Главное требование, которому должна удовлетворять программа, работать в полном соответствии со спецификацией и адекватно реагировать на любые действия пользователя. Кроме этого, программа должна быть выпущена точно к заявленному сроку и допускать оперативное внесение необходимых изменений и дополнений. Иными словами, современные критерии качества программы это прежде всего надежность, а также возможность точно планировать производство программы и ее сопровождение. Для достижения этих целей программа должна иметь простую структуру, быть хорошо читаемой и легко модифицируемой [19].
Структурное программирование это технология создания программ, позволяющая путем соблюдения определенных правил уменьшить время разработки и количество ошибок, а также облегчить возможность модификации программы.
Структурный подход охватывает все стадии разработки проекта: постановка задачи (анализ требований), проектирование, собственно программирование (кодирование) и тестирование.
29.2. Структурные методы анализа и проектирования ПО
← 29.1. Технология структурного программирования |
29.3. Модульное программирование → |
Одной из основных проблем, которые приходится решать при создании больших и сложных систем любой природы, в том числе и ПО, является проблема сложности. Ни один разработчик не в состоянии выйти за пределы человеческих возможностей и понять всю систему в целом. Единственный эффективный подход к решению этой проблемы, который выработало человечество за всю свою историю, заключается в построении сложной системы из небольшого количества крупных частей, каждая из которых, в свою очередь, строится из частей меньшего размера, и т.д., до тех пор, пока самые небольшие части можно будет строить из имеющегося материала. Этот подход известен под самыми разными названиями, среди них такие, как «разделяй и властвуй» (divide et imperd), иерархическая декомпозиция и др. По отношению к проектированию сложной программной системы это означает, что ее необходимо разделить (декомпозировать) на небольшие подсистемы, каждую из которых можно разрабатывать независимо от других. Это позволяет при разработке подсистемы любого уровня иметь дело только с ней, а не со всеми остальными частями системы [18].
Структурные методы являются строгой дисциплиной системного анализа и проектирования. Методы структурного анализа и проектирования стремятся преодолеть сложность больших систем путем расчленения их на части («черные ящики») и иерархической организации этих «черных ящиков». Выгода в использовании «черных ящиков» заключается в том, что их пользователю не требуется знать, как они работают, необходимо знать лишь их входы и выходы, а также назначение (т.е. функции, которые они выполняют).
Таким образом, первым шагом упрощения сложной системы является ее разбиение на «черные ящики», при этом такое разбиение должно удовлетворять следующим критериям:
Второй важной идеей, лежащей в основе структурных методов, является идея иерархии. Для понимания сложной системы недостаточно разбить ее на части, необходимо эти части организовать определенным образом, а именно в виде иерархических структур. Все сложные системы Вселенной организованы в иерархии: от галактик до элементарных частиц. Человек при создании сложных систем также подражает природе. Любая организация имеет директора, заместителей по направлениям, иерархию руководителей подразделений, рядовых служащих [18].
Кроме того, структурные методы широко используют визуальное моделирование, служащее для облегчения понимания сложных систем.
Структурным анализом принято называть метод исследования системы, начинающий с ее общего обзора, который затем детализируется, приобретая иерархическую структуру со все большим числом уровней [18].
Для таких методов характерно:
В структурном анализе основным методом разбиения на уровни абстракции является функциональная декомпозиция, заключающаяся в декомпозиции (разбиении) системы на функциональные подсистемы, которые, в свою очередь, делятся на подфункции, т.е. на задачи и так далее до конкретных процедур. При этом система сохраняет целостное представление, в котором все составляющие компоненты взаимоувязаны. При разработке системы «снизу вверх» от отдельных задач ко всей системе целостность теряется, возникают проблемы при описании информационного взаимодействия отдельных компонентов.
Все наиболее распространенные методы структурного подхода базируются на ряде общих принципов. Базовыми принципами являются:
Выделение двух базовых принципов не означает, что остальные принципы являются второстепенными, поскольку игнорирование любого из них может привести к нежелательным последствиям (вплоть до неудачного завершения проекта). Основными из таких принципов являются:
← 29.2. Структурные методы анализа и... |
29.4. Базовые управляющие структуры... → |
29.3.1. HIPO-диаграмма
29.3.2. Метод нисходящего проектирования
29.3.3. Метод расширения ядра
29.3.4. Метод восходящего проектирования
Прикладные программы чаще всего слишком сложны, чтобы быть написанными как единое целое или разработанными одним программистом. Поэтому большие программы на этапе проектирования разбивают на логические (функциональные) модули.
Под модульным программированием (модуляризацией) понимается разделение программы на части по некоторым установленным правилам.
Эти части на этапе кодирования реализуются в виде модулей или подпрограмм в зависимости от их размера и выбранного языка программирования.
Для того чтобы логический модуль можно было закодировать, необходимо предварительно описать его поведение, т.е. специфицировать. Для спецификации функций логических модулей с точки зрения входных и выходных данных и связи между ними используют HIPO-диаграмму (от англ. hierarchy-input-processing-output иерархическое описание вход-обработка-выход) [20].
Программы разбиваются на модули, чтобы:
Правильная декомпозиция это главный способ преодоления сложности разработки больших систем ПО. Понятие «правильная» по отношению к декомпозиции означает следующее:
Связность модуля определяется как мера зависимости его частей.
Чем выше связность модуля, тем лучше результат проектирования. Для обозначения связности используется также понятие силы связности модуля.
Сцепление модулей представляет собой меру относительной независимости модулей, которая определяет их читабельность и сохранность.
Независимые модули могут быть модифицированы без переделки каких-либо других модулей. Слабое сцепление более желательно, так как это означает высокий уровень их независимости. Модули считаются полностью независимыми, если каждый из них не содержит о другом никакой информации. Чем больше информации о других модулях используется в них, тем менее они независимы и тем теснее сцеплены.
Методы проектирования программ, основанные на модульном принципе, делятся на три группы:
На практике обычно применяются различные сочетания этих методов.
Рассмотрим применение функциональной декомпозиции на следующем примере.
Пусть необходимо разработать консольное приложение для представления десятичного действительного числа в систему счисления с основанием р (основание может меняться в диапазоне от 2 до 16).
Проектирование программы начинаем с функциональной декомпозиции задачи и построения на ее основе схемы иерархии логических модулей. Схема иерархии логических модулей это результат отображения разбиения исходной задачи на части на уровне проекта. Каждый логический модуль преобразует некоторые входные данные в определенный результат и может быть снова разделен на части. Схема иерархии логических модулей отображает связь модулей по управлению, т.е. на ней с помощью прямых линий показано, какие модули могут быть вызваны из данного модуля. Результатом разбиения нашей задачи на части может быть схема иерархии (рис. 29.1).
Рис. 29.1. Схема иерархии логических модулей.
↑ Наверх
HIPO-диаграмма предназначена для спецификации (описания) требований к программе или функциональному (логическому) модулю.
Она является результатом анализа процесса обработки данных, выполняемого программой (или модулем), с точки зрения исходных данных и результатов работы программы.
HIPO-диаграмма имеет следующий вид:
В разделе «Вход» перечисляются имена входных данных, их типы, диапазоны возможных значений.
В разделе «Выход» перечисляются имена выходных данных, их типы, диапазоны возможных значений.
В разделе «Обработка» для каждого выхода необходимо указать, с какими входами он связана и как. В этом подразделе содержится описание того, что делает программа, а не того, как она это делает.
Таким образом, HIPO-диаграмма это описание поведения процесса обработки данных в таких существенных признаках, как входные значения, выходные значения и связь между ними.
Рассмотрим построение HIPO-диаграммы для модуля «1. 1. Перевод десятичного целого в р-ичное целое» с рис. 29.1.
1. 1. Модуль Перевод 10-ичного целого в р-ичное целое, представленное строкой Ip |
||
Вход |
Обработка |
Выход |
Ip строка, |
I десятичный эквивалент р-ичной строки Ip строки, содержащей p- ичное представление числа. |
I целое число |
↑ Наверх
Метод нисходящего проектирования подобен методу получения детального изображения из более общего вида с помощью телескопического увеличения. На начальном шаге формируется предложение, описывающее функцию всей программы. Затем определяются ее подфункции. Эта процедура является рекурсивной, т. е., следуя ей, каждая из подфункций может расчленяться до тех пор, пока ее составные части не будут окончательно уточнены. Метод нисходящего проектирования, иногда называемый функциональной декомпозицией, основан на двух стратегиях: пошаговом уточнении, разработанном Эдсгером Дейкстрой, и анализе сообщений, базирующемся на работах Э. Йодана, Константайна Л. и Мейерса Г. Эти стратегии различаются способами определения начальных спецификаций, методами, используемыми при разбиении задачи на части, и правилами записи [20].
↑ Наверх
Метод расширения ядра отличается от способа нисходящего проектирования: в нем больше внимания вначале уделяется выявлению множества вспомогательных функций, а не определению функции всей программы в целом. Эти функции можно получить, применяя методы проектирования структур данных, которые используются при иерархическом модульном проектировании, разработанном М. Джексоном, или определяя области хранения данных с последующим анализом связанных с ними функциональных единиц (как в методе определения спецификаций модуля, разработанном Д. Парнасом) [20].
↑ Наверх
При использовании метода восходящего проектирования в первую очередь определяются вспомогательные функции, которые могут потребоваться для проектируемой программы. Модульная декомпозиция заключается в нахождении ключевых модулей промежуточных уровней, которые затем разрабатываются восходящим и нисходящим способами одновременно. Эти модули не являются вспомогательными в том смысле, что потребность в них возникает в нескольких точках программы. Необходимость в использовании этих модулей может возникать в других программах или системах.
Функции, определяемые как вспомогательные при восходящем проектировании, реализуются с помощью модулей самых нижних уровней [20].
29.4. Базовые управляющие структуры структурного программирования
← 29.3. Модульное программирование |
29.5. Проектирование и тестирование программы → |
В теории программирования доказано, что программу для решения задачи любой сложности можно составить только из трех структур, называемых следованием, ветвлением и циклом. Этот результат установлен К. Бёмом и Дж. Якопини еще в 1966 году путем доказательства того, что любую программу можно преобразовать в эквивалентную, состоящую только из этих структур и их комбинаций.
Следование, ветвление и цикл называют базовыми конструкциями структурного программирования. Следованием называется конструкция, представляющая собой последовательное выполнение двух или более операторов (простых или составных). Ветвление задает выполнение либо одного, либо другого оператора в зависимости от выполнения какого-либо условия. Цикл задает многократное выполнение оператора (рис. 29.2). Особенностью базовых конструкций является то, что любая из них имеет только один вход и один выход, поэтому конструкции могут вкладываться друг в друга произвольным образом, например, цикл может содержать следование из двух ветвлений, каждое из которых включает вложенные циклы (рис. 29.3).
Рис. 29.2. Базовые конструкции структурного программирования
Рис. 29.3. Вложение базовых конструкций
Цель использования базовых конструкций получение программы простой структуры. Такую программу легко читать (а программы чаще приходится читать, чем писать), отлаживать и при необходимости в нее удобно вносить изменения. Структурное программирование называют «программированием без goto». Действительно частое использование операторов передачи управления в произвольные точки программы затрудняет прослеживание логики ее работы. Однако, есть ситуации, в которых использование goto оправдано и приводит, напротив, к упрощению структуры программы.
В большинстве языков высокого уровня существует несколько реализаций базовых конструкций. Они введены для удобства программирования, и в каждом случае надо выбирать наиболее подходящие средства.
29.5. Проектирование и тестирование программы
← 29.4. Базовые управляющие структуры... |
29.6. Подпрограммы, процедуры и функции → |
Структурный подход к программированию, как уже упоминалось, охватывает все стадии разработки проекта: постановка задачи (анализ требований), проектирование, собственно программирование (кодирование) и тестирование. Задачи, которые при этом ставятся, уменьшение числа возможных ошибок за счет применения только допустимых структур, возможно более раннее обнаружение ошибок и упрощение процесса их исправления. Ключевыми идеями структурного подхода являются
Приведенные ниже этапы создания программ рассчитаны на достаточно большие проекты, разрабатываемые коллективом программистов. Для программы небольшого объема каждый этап упрощается, но содержание и последовательность этапов не изменяются.
Постановка задачи (анализ требований). Создание любой программы начинается с этапа постановки задачи анализа требований пользователей. Изначально задача ставится в терминах предметной области, и необходимо перевести ее в термины, более близкие к программированию. Поскольку программист редко досконально разбирается в предметной области, а заказчик в программировании, постановка задачи может стать весьма непростым итерационным процессом. Кроме того, при постановке задачи заказчик зачастую не может четко и полно сформулировать свои требования и критерии.
Постановка задачи завершается созданием технического задания, а затем внешней спецификации программы, включающей в себя:
Таким образом, программа рассматривается как «черный ящик», для которого определена функция и входные и выходные данные.
Проектирование (структурный анализ и проектирование). На этапе проектирования выявляется общая структура программы и взаимодействие модулей, а также разрабатываются структуры данных. На этом этапе применяется технология нисходящего проектирования программы, основная идея которого теоретически проста: разбиение задачи на подзадачи меньшей сложности функциональные (логические) модули, которые можно рассматривать раздельно. Главный критерий разбиения (функциональной декомпозиции) минимизация взаимодействия модулей. При этом используется метод пошаговой детализации. Можно представить себе этот процесс так, что сначала программа пишется на языке некоторой гипотетической машины, которая способна понимать самые обобщенные действия, а затем каждое из них описывается на более низком уровне абстракции, и т. д. Очень важна на этом этапе спецификация интерфейсов, т. е. способов взаимодействия подзадач.
Для каждой подзадачи составляется внешняя спецификация, аналогичная приведенной выше (см. этап Постановка задачи). Для каждой подзадачи (модуля) описывается ее функция, например, с помощью HIPO-диаграммы. Одна задача может реализовываться с помощью нескольких модулей и, наоборот, в одном модуле может решаться несколько задач. На более низкий уровень проектирования переходят только после окончания проектирования верхнего уровня. Для каждого модуля разрабатывается алгоритм обработки данных с помощью базовых конструкций структурного программирования и записывается в обобщенной форме например, словесной, в виде обобщенных блок-схем или другими способами. Ниже приведен пример структурного проекта, описанный с помощью блок-схемы для логического модуля «1. 1. Перевод десятичного целого в р-ичное целое, представленное строкой» (рис. 29.4).
Рис. 29.4. Блок-схема логического модуля «1. 1. Перевод десятичного целого в р-ичное целое, представленное строкой»
Разработка внутренних структур данных. Большинство алгоритмов зависит от того, каким образом организованы данные, поэтому интуитивно ясно, что начинать проектирование программы надо не с алгоритмов, а с разработки структур, необходимых для представления входных, выходных и промежуточных данных. При этом принимаются во внимание многие факторы, например, ограничения на размер данных, необходимая точность, требования к быстродействию программы. Структуры данных могут быть статическими или динамическими.
На этапе проектирования следует учитывать возможность будущих модификаций программы и стремиться проектировать программу таким образом, чтобы вносить изменения было как можно проще.
Процесс проектирования итерационный, поскольку в программах реального размера невозможно продумать все детали с первого раза.
Кодирование (структурное программирование). На этапе кодирования выполняется структурное программирование программы. Процесс программирования также организуется по принципу «сверху вниз»: вначале кодируются модули самого верхнего уровня и составляются тестовые примеры для их отладки, при этом на месте еще не написанных модулей следующего уровня ставятся «заглушки» временные программы. «Заглушки» в простейшем случае просто выдают сообщение о том, что им передано управление, а затем возвращают его в вызывающий модуль. В других случаях «заглушка» может выдавать значения, заданные заранее или вычисленные по упрощенному алгоритму.
Таким образом, сначала создается логический скелет программы, который затем обрастает плотью кода.
Можно применять к процессу программирования восходящую технологию написать и отладить сначала модули нижнего уровня, а затем объединять их в более крупные фрагменты, но этот подход имеет ряд недостатков.
Во-первых, в процессе кодирования верхнего уровня могут быть вскрыты те или иные трудности проектирования более низких уровней программы (просто потому, что при написании программы ее логика продумывается более тщательно, чем при проектировании). Если подобная ошибка обнаруживается в последнюю очередь, требуются дополнительные затраты на переделку уже готовых модулей нижнего уровня.
Во-вторых, для отладки каждого модуля, а затем более крупных фрагментов программы требуется каждый раз составлять свои тестовые примеры, и программист часто вынужден имитировать то окружение, в котором должен работать модуль. Нисходящая же технология программирования обеспечивает естественный порядок создания тестов возможность нисходящей отладки, которая рассмотрена далее.
Этапы проектирования и программирования совмещены во времени: сначала проектируется и кодируется верхний уровень, затем следующий, и т. д. Такая стратегия применяется потому, что в процессе кодирования может возникнуть необходимость внести изменения, отражающиеся на модулях нижнего уровня. Приведенный далее пример структурного кодирования проекта описан с помощью блок-схемы рис. 29.4. Модуль реализован в форме функции Object Pascal.
← 29.5. Проектирование и тестирование программы |
29.7. Контрольные вопросы и задания → |
29.6.1. Основные понятия и терминология
29.6.2. Локальность
29.6.3. Параметры процедуры
↑ Наверх
Часто некоторую последовательность инструкций требуется повторить в нескольких местах программы. Чтобы программисту не приходилось тратить время и усилия на копирование этих инструкций, в большинстве языков программирования предусматриваются средства для организации подпрограмм. Таким образом, программист получает возможность присвоить последовательности инструкций произвольное имя и использовать это имя в качестве сокращенной записи в тех местах, где встречается соответствующая последовательность инструкций. Такую именованную последовательность инструкций будем называть процедурой. Если процедура дает одно результирующее значение и, следовательно, может использоваться в выражениях, то такая процедура называется функцией. Определение сокращенной записи называется описанием процедуры или описанием функции. Использование этого сокращения в программе называется оператором процедуры или вызовом процедуры. Функция, если она встречается в выражении, называется указателем функции, или обращением к функции [21].
Пример. Описание и оператор процедуры
Для последовательности инструкций
t := r; r := q; q := t
можно ввести сокращение, описав процедуру следующим образом:
procedure P;
begin t: = r; r := q; q := t end
И теперь всякий раз, когда в программе встречается эта последовательность инструкций, ее можно заменить оператором процедуры P. Описание процедуры состоит из двух частей: заголовка процедуры и тела процедуры. Заголовок (первая строка) содержит идентификатор процедуры. Тело (вторая строка) состоит из одной или нескольких инструкций, для которых вводится сокращение.
↑ Наверх
Если объект (константа, переменная, процедура, функция или тип) имеет смысл только в пределах некоторой части программы, то этот объект называется локальным. В таком случае этой части программы можно присвоить имя (т. е. оформить ее как процедуру). Локальные объекты процедуры описываются в ее заголовке.
Пример. Описание процедуры с описанием локальной переменной
procedure P;
var t: integer;
begin t := r; r := q; q := t end;
В теле процедуры используются объекты двух сортов: локальные (в примере t) и нелокальные объекты. Последние определены в контексте, являющемся средой для описания процедуры. Если они определены в главной программе, то такие объекты называются глобальными; если же они определены в самом языке (т. е. в контексте, в который «погружается» программа), то они называются стандартными объектами [21]. Областью существования локального объекта является весь текст процедуры. Это означает, что после окончания процесса, описанного процедурой, пространство в памяти, занятое локальными переменными, становится снова свободным и его можно использовать для других переменных. Очевидно, при повторном вызове той же самой процедуры значения ее локальных переменных снова не определены, точно так же как они не были определены при первом вызове процедуры.
При идентификации локальных объектов существенно то, что мы можем выбирать их имена вне зависимости от среды. Главную программу удобно рассматривать как процедуру без имени. Ее средой является операционная система вычислительной машины, где предварительно определены все стандартные объекты. Таким образом, ясно, почему идентификаторы можно выбирать, не считаясь со стандартными именами. Если стандартный объект не используется в программе, то употребление (случайное или преднамеренное) его идентификатора в качестве имени локального объекта не вызовет каких-либо нежелательных эффектов [21].
↑ Наверх
Если некоторая последовательность операций применяется к различным операндам в разных частях программы, то такая последовательность оформляется как процедура, а ее операнды становятся параметрами.
Идентификаторы, введенные в заголовке процедуры для обозначения операндов, называются формальными параметрами.
Они используются только в теле процедуры и локальны по отношению к ней.
Объекты, подставляемые вместо формальных пapaметров при вызове процедуры, называются фактическими параметрами.
Они задаются в каждом операторе процедуры или указателе функции. Тип фактического параметра определяется типом формального параметра, который специфицируется в заголовке процедуры. Помимо спецификации типа параметра необходимо также указать желаемый способ подстановки, поскольку вместо формального параметра можно подставить текущее значение либо имя фактической переменной или выражение. Наиболее часто используют два способа подстановки параметров.
Пример. Описание процедуры с параметрами
var a, b: integer; //глобальные переменные
procedure P(var r,q: integer); //формальные параметры-переменные r,q; они же локальные переменные процедуры
var t: integer; //локальная переменная
begin t := r; r := q; q := t end;
begin
P(a,b); //Вызов процедуры с фактическими параметрами a,b
end
В этом примере приведено описание процедуры P с двумя формальными параметрами-переменными r, q и локальной переменной t. Эта процедура вызывается в разделе операторов, и на места формальных параметров подставляются по ссылке (по адресу) глобальные переменные a, b. При выполнении кода процедуры операции будут выполняться над переменными a, b. Поэтому после еe завершения результат её работы останется в переменных a, b. Они обменяются значениями.
При вызове функции, ей передаются в качестве фактических параметров копии значений глобальных переменных a,b. Результат работы функции при первом вызове будет выведен на монитор, при втором сохранeн в глобальной переменной s.
Ниже приведен пример функции с двумя формальными параметрами-значениями n, p.
Тестирование. На этом этапе выполняется нисходящее тестирование программы. Этап записан последним, но это не значит, что тестирование не должно проводиться на предыдущих этапах. Проектирование и программирование обязательно должны сопровождаться написанием набора тестов проверочных исходных данных и соответствующих им наборов ожидаемых результатов.
Необходимо различать процессы тестирования и отладки программы.
Тестирование это процесс выполнения программ с целью обнаружения логических ошибок [23].
Логической ошибкой считается любое не соответствие работы программы заданной на нее спецификации.
Хорошим считается тест, который имеет высокую вероятность обнаружения еще не выявленной ошибки. Удачным считается тест, который обнаруживает еще не выявленную ошибку. Ниже приведен пример тестового набора данных для тестирования функции, реализующей логический модуль «1. 1. Перевод десятичного целого в р-ичноецелое».
Будем тестировать функцию методом тестирования путей. Среди возможных путей выполнения функции можно выделить два пути выполнения, которые представлены на Е-схеме выполнения функции (рис. 29.5), полученной из блок-схемы.
Рис. 29.5. Е-схема выполнения функции, реализующей логический модуль
«1. 1. Перевод десятичного целого в р-ичное целое, представленное строкой»
По первому пути цикл не выполняется ни разу. Второй путь включает в себя множество путей, на которых цикл выполняется один и более раз.
Необходимо подобрать исходные данные для выполнения программы по каждому из возможных путей.
Таблица 29.1. Набор тестов для тестирования разработанной функции
Номер теста |
Исходные данные |
Ожидаемый результат |
Путь прохождения |
1 |
n = 0, р = 2 |
0 |
Цикл не выполняется |
2 |
n = 1, р = 2 |
1 |
Цикл не выполняется |
3 |
n = 8, р = 2 |
1000 |
Цикл выполняется три раза |
4 |
n = 0, р = 16 |
0 |
Цикл не выполняется |
5 |
n = 10, р =16 |
A |
Цикл не выполняется |
6 |
n = 15, р =16 |
F |
Цикл выполняется три раза |
7 |
n = 256, р = 16 |
100 |
Цикл выполняется два раза |
Отладка программы это процесс, осуществляемый после удачного выполнения теста. Процесс отладки начинается при обнаружении ошибки (например, при удачном завершении теста) и проводится в два этапа:
Отладка процесс исправления ошибок в программе, при этом цель исправить все ошибки не ставится. Исправляют ошибки, обнаруженные при тестировании. При планировании следует учитывать, что процесс обнаружения ошибок подчиняется закону насыщения, т. е. большинство ошибок обнаруживается на ранних стадиях тестирования, и чем меньше в программе осталось ошибок, тем дольше искать каждую из них.
Для исчерпывающего тестирования программы необходимо проверить каждую из ветвей алгоритма. Кроме данных, обеспечивающих выполнение операторов в требуемой последовательности, тесты должны содержать проверку граничных условий (например, переход по условию х > 10 должен проверяться для значений, больших, меньших и равных 10). Отдельно проверяется реакция программы на ошибочные исходные данные.
Идея нисходящего тестирования предполагает, что к тестированию программы приступают еще до того, как завершено ее проектирование. Это позволяет раньше опробовать основные межмодульные интерфейсы, а также убедиться в том, что программа в основном удовлетворяет требованиям пользователя. Только после того как логическое ядро испытано настолько, что появляется уверенность в правильности реализации основных интерфейсов, приступают к кодированию и тестированию следующего уровня программы.
29.7. Контрольные вопросы и задания
← 29.6. Подпрограммы, процедуры и функции |
30.1. Методология объектно-ориентированного... → |
30.1. Методология объектно-ориентированного программирования
← 29.7. Контрольные вопросы и задания |
30.2. Объектно-ориентированные методы анализа... → |
Методология объектно-ориентированного программирования пришла на смену структурному программированию, когда стало очевидно, что традиционные методы структурного программирования не способны справиться ни с растущей сложностью программ и их разработкой, ни с повышением их надежности. Во второй половине 1980-х годов возникла настоятельная потребность в новой методологии программирования, которая бы позволила решить весь этот комплекс проблем. Такой методологией стало объектно-ориентированное программирование.
Объектно-ориентированное программирование (ООП, Object-Oriented Programming) совокупность принципов, технологий, а также инструментальных средств для создания программных систем на основе архитектуры взаимодействия объектов [27].
В отличие от структурного подхода, основанного на функциональной декомпозиции программ, в объектно-ориентированном подходе в качестве отдельных структурных единиц программы рассматриваются не процедуры и функции, а классы и объекты с соответствующими свойствами и методами. Как следствие, программа перестала быть последовательностью предопределенных на этапе кодирования действий, а преобразовалась в событийно управляемую. Последнее обстоятельство доминирует и при разработке широкого круга современных приложений. В этом случае каждая программа представляет собой бесконечный цикл ожидания заранее определенных событий. Инициаторами событий могут быть другие программы или пользователи, а при наступлении отдельного события программа выходит из состояния ожидания и реагирует на него вполне адекватным образом [27].
Объектно-ориентированная методология включает в себя:
Объектно-ориентированный анализ направлен на создание моделей, более близких к реальности, с использованием объектно-ориентированного подхода; это методология при которой требования формируются на основе понятий классов и объектов, составляющих словарь предметной области.
Предметная область часть реального мира, которая имеет существенное значение или непосредственное отношение к процессу функционирования программы.
Объектно-ориентированное проектирование это методология проектирования, соединяющая в себе процесс объектной декомпозиции и приёмы представления как логической и физической, так статической и динамической моделей проектируемой системы.
Объектно-ориентированное программирование это методология программирования, которая основана на представлении программы в виде совокупности объектов, каждый из которых является реализацией определённого класса, а классы образуют иерархию на принципах наследуемости [25].
30.2. Объектно-ориентированные методы анализа и проектирования ПО
← 30.1. Методология объектно-ориентированного... |
30.3. Основные принципы построения объектной... → |
В основе объектно-ориентированного подхода (ООП) лежит объектная декомпозиция, при этом статическая структура системы описывается в терминах объектов и связей между ними, а поведение системы описывается в терминах обмена сообщениями между объектами. Каждый объект системы обладает своим собственным поведением, моделирующим поведение объекта реального мира.
Проблемы, стимулировавшие развитие ООП:
Объектная модель это наиболее естественный способ представления реального мира. В разделе «Теория классификации» Британской энциклопедии сказано следующее:
«В постижении реального мира люди пользуются тремя методами, организующими их мышление:
Первыми объектно-ориентированными языками программирования стали: Simula (1967), Smalltalk (1970-е годы) [18].
30.3. Основные принципы построения объектной модели
← 30.2. Объектно-ориентированные методы анализа... |
30.4. Основные элементы объектной модели → |
Концептуальной основой объектно-ориентированного подхода служит объектная модель. Основными принципами ее построения являются:
Абстрагирование это выделение наиболее важных, существенных характеристик некоего объекта, которые отличают его от всех других видов объектов и таким образом четко определяют его концептуальные границы с точки зрения дальнейшего рассмотрения и анализа, и игнорирование менее важных или незначительных деталей.
Абстрагирование помогает управлять сложностью системы, концентрируясь на существенных свойствах объекта. Абстрагирование концентрирует внимание на внешних особенностях объекта и позволяет отделить самые существенные особенности его поведения от деталей их реализации. Выбор правильного набора абстракций для заданной предметной области представляет собой главную задачу объектно-ориентированного проектирования. Абстракция зависит от предметной области и точки зрения то, что важно в одном контексте, может быть не важно в другом. Объекты и классы основные абстракции предметной области.
Инкапсуляция физическая локализация свойств и поведения в рамках единственной абстракции (рассматриваемой как «черный ящик»), скрывающая их реализацию за общедоступным интерфейсом.
Инкапсуляция это процесс отделения друг от друга различных элементов объекта, определяющих его устройство и поведение. Инкапсуляция служит для того, чтобы изолировать интерфейс объекта, отражающий его внешнее поведение, от внутренней реализации объекта. Объектный подход предполагает, что собственные ресурсы, которыми могут манипулировать только операции самого объекта, скрыты от внешней среды.
Абстрагирование и инкапсуляция являются взаимодополняющими: абстрагирование фокусирует внимание на внешних особенностях объекта, а инкапсуляция (или иначе ограничение доступа) не позволяет объектам-пользователям различать внутреннее устройство объекта.
Инкапсуляция подобна понятию сокрытия информации (information hiding). Это возможность скрывать многочисленные детали объекта от внешнего мира. Внешний мир объекта это все, что находится вне его, включая остальную часть системы. Сокрытие информации предоставляет то же преимущество, что и инкапсуляция, гибкость.
Модульность это свойство системы, связанное с возможностью ее декомпозиции на ряд внутренне сильно сцепленных, но слабо связанных между собой подсистем (модулей).
Модульность снижает сложность системы, позволяя выполнять независимую разработку отдельных модулей. Инкапсуляция и модульность создают барьеры между абстракциями.
Иерархия это ранжированная или упорядоченная система абстракций, расположение их по уровням.
Основными видами иерархических структур применительно к сложным системам являются структура классов (иерархия по номенклатуре) и структура объектов (иерархия по составу). Примерами иерархии классов служит простое и множественное наследование (один класс использует структурную или функциональную часть соответственно одного или нескольких других классов), а иерархии объектов агрегация.
Классы можно организовать в виде иерархической структуры, которая по внешнему виду напоминает схему классификации в понятийной логике. Иерархия понятий строится следующим образом. В качестве наиболее общего понятия или категории берется понятие, имеющее наибольший объем и, соответственно, наименьшее содержание. Это самый высокий уровень абстракции для данной иерархии. Затем данное общее понятие конкретизируется, т. е. уменьшается его объем и увеличивается содержание. Появляется менее общее понятие, которое на схеме иерархии будет расположено на один уровень ниже исходного. Этот процесс конкретизации понятий может быть продолжен до тех пор, пока на самом нижнем уровне не будет получено понятие, дальнейшая конкретизация которого в данном контексте либо невозможна, либо нецелесообразна [18].
30.4. Основные элементы объектной модели
← 30.3. Основные принципы построения объектной... |
30.5. Пример разработки консольного приложения... → |
К основным понятиям объектно-ориентированного подхода (элементам объектной модели) [18] относятся:
Объект определяется как осязаемая сущность (tangible entity) предмет или явление (процесс), имеющая четко определяемое поведение.
Объект может представлять собой абстракцию некоторой сущности предметной области (объект реального мира) или программной системы (архитектурный объект). Любой объект обладает состоянием (state), поведением (behavior) и индивидуальностью (identity).
Состояние объекта одно из возможных условий, в которых он может существовать, оно изменяется со временем.
Состояние объекта характеризуется перечнем всех возможных (статических) свойств данного объекта и текущими значениями (динамическими) каждого из этих свойств. Состояние объекта определяется значениями его свойств (атрибутов) и связями с другими объектами.
Поведение определяет действия объекта и его реакцию на запросы от других объектов.
Поведение характеризует воздействие объекта на другие объекты, изменяющее их состояние. Иначе говоря, поведение объекта полностью определяется его действиями. Поведение представляется с помощью набора сообщений, воспринимаемых объектом (операций, которые может выполнять объект).
Каждый объект обладает уникальной индивидуальностью.
Индивидуальность это свойства объекта, отличающие его от всех других объектов.
Структура и поведение схожих объектов определяют общий для них класс. Термины «экземпляр класса» и «объект» эквивалентны.
Графическое представление объекта как экземпляра класса в языке моделирования UML [28] показано на рис. 30.1.
Рис. 30.1. Графическое представление объекта как экземпляра класса
Класс это множество объектов, связанных общностью свойств, поведения, связей и семантики.
Класс инкапсулирует (объединяет) в себе данные (атрибуты) и поведение (операции). Класс является абстрактным определением объекта и служит в качестве шаблона для создания объектов. Графическое представление класса в языке UML показано на рис. 30.2. Класс изображается в виде прямоугольника, разделенного на три части. В первой содержится имя класса, во второй его атрибуты, в третьей операции класса, отражающие его поведение (действия, выполняемые классом). Ниже приведён пример класса TFrac (простая дробь) на языке Object Pascal. С помощью этого класса реализованы простые дроби. Объектом этого класса является простая дробь.
TFrac = class//Простая дробь
public
constructor Create(n: integer = 0;d: integer = 1);//конструктор
function Add(b: TFrac): TFrac;//Сложение простых дробей
function Sub(b: TFrac): TFrac;//Вычитание простых дробей
function Mul(b: TFrac): TFrac;//Умножение простых дробей
function Dvd(b: TFrac): TFrac;//Деление простых дробей
function ToStrint(): string;//Преобразование дроби в строку
private
FNum: integer;//Числитель
FDen: integer;//Знаменатель
end;
Любой объект является экземпляром (instance) класса. Определение классов и объектов одна из самых сложных задач объектно-ориентированного проектирования.
Атрибут поименованное свойство класса, определяющее диапазон допустимых значений, которые могут принимать экземпляры данного свойства.
Атрибут это элемент информации, связанный с классом. Например, у класса Company (Компания) могут быть атрибуты Name (Название), Address (Адрес) и NumberOfEmployees (Число служащих).
Рис. 30.2. Графическое представление класса
Так как атрибуты содержатся внутри класса, они скрыты от других классов. В связи с этим может понадобиться указать, какие классы имеют право читать и изменять атрибуты. Это свойство называется видимостью атрибута (attribute visibility).
У атрибута можно определить три возможных значения видимости. Рассмотрим каждое из них в контексте примера (рис. 30.2). Пусть имеются класс Employee с атрибутом Address и класс Company:
Public (общий, открытый). Это значение видимости предполагает, что атрибут будет виден всеми остальными классами. Любой класс может просмотреть или изменить значение атрибута. В таком случае класс Company может изменить значение атрибута Address класса Employee. В соответствии с нотацией UML общему атрибуту предшествует знак «+».
Private (закрытый, секретный). Атрибут, обладающий этим значением видимости, не виден никаким другим классом. Класс Employee будет знать значение атрибута Address и сможет изменять его, но класс Company не сможет его ни увидеть, ни редактировать. Если это понадобится, он должен попросить класс Employee просмотреть или изменить значение этого атрибута, что обычно делается с помощью общих операций. Закрытый атрибут обозначается знаком «-» в соответствии с нотацией UML.
Protected (защищенный). Атрибут, обладающий таким значением видимости, доступен только самому классу и его потомкам в иерархии наследования.
Допустим, имеется два различных типа сотрудников с почасовой оплатой и на окладе. Таким образом, потомками класса Employee будут два класса HourlyEmp и SalariedEmp. Защищенный атрибут Address можно просмотреть или изменить из классов Employee, HourlyEmp и SalariedEmp, но не из класса Company. Нотация UML для защищенного атрибута это знак «#».
В общем случае атрибуты рекомендуется делать закрытыми или защищенными. При этом удается избежать ситуации, когда значение атрибута изменяется всеми классами системы. Вместо этого логика изменения атрибута будет заключена в том же классе, что и сам этот атрибут.
Определенное воздействие одного объекта на другой с целью вызвать соответствующую реакцию называется операцией. Операция это реализация услуги, которую можно запросить у любого объекта данного класса.
Операции отражают поведение объекта. Операция-запрос не изменяет состояния объекта. Операция-команда может изменить состояние объекта. Результат операции зависит от текущего состояния объекта.
Как правило, в объектных и объектно-ориентированных языках программирования операции, выполняемые над данным объектом, называются методами и являются составной частью определения класса.
Операции реализуют связанное с классом поведение (иначе говоря, реализуют обязанности класса responsibilities). В широком смысле обязанности класса делятся на две категории.
Знание (определяется атрибутами класса):
Действие (определяется операциями класса):
Операция включает три части имя, параметры и тип возвращаемого значения. Параметры это аргументы, получаемые операцией «на входе». Тип возвращаемого значения относится к результату действия операции.
В языке UML операции имеют следующую нотацию:
Имя Операции (аргумент1: тип данных аргумента1, аргумент2: тип данных аргумента2,...): тип возвращаемого значения
Существуют четыре различных типа операций.
Понятие полиморфизма может быть интерпретировано как способность класса принадлежать более чем одному типу.
Полиморфизм это способность скрывать множество различных реализаций под единственным общим интерфейсом.
Интерфейс совокупность операций, определяющих набор услуг класса или компонента. Интерфейс не определяет внутреннюю структуру, все его операции имеют открытую видимость.
Полиморфизм тесно связан с наследованием. Наследование означает построение новых классов на основе существующих с возможностью добавления или переопределения свойств (атрибутов) и поведения (операций).
Объектно-ориентированная система изначально строится с учетом ее эволюции. Наследование и полиморфизм обеспечивают возможность определения новой функциональности классов с помощью создания производных классов потомков базовых классов. Потомки наследуют характеристики родительских классов без изменения их первоначального описания и добавляют при необходимости собственные структуры данных и методы. Определение производных классов, при котором задаются только различия или уточнения, в огромной степени экономит время и усилия при производстве и использовании спецификаций и программного кода.
Компонент относительно независимая и замещаемая часть системы, выполняющая четко определенную функцию в контексте заданной архитектуры.
Компонент представляет собой физическую реализацию проектной абстракции и может быть:
Компонент обеспечивает физическую реализацию набора интерфейсов.
Между элементами объектной модели существуют различные виды связей. К основным типам связей относятся связи ассоциации, зависимости и обобщения.
Ассоциация (association) это семантическая связь между классами.
Ее изображают на диаграмме классов в виде обыкновенной линии (рис. 30.3). Ассоциация отражает структурные связи между объектами различных классов.
Рис. 30.3. Ассоциация
Агрегация (aggregation) представляет собой форму ассоциации более сильный тип связи между целым (составным) объектом и его частями (компонентными объектами).
Язык UML обеспечивает ограниченную поддержку агрегации. Сильная форма агрегации является в UML композицией. В композиции составной объект может физически содержать компонентные объекты. Компонентный объект может принадлежать только одному составному объекту.
Слабая форма агрегации в UML называется просто агрегацией. При этом составной объект физически не содержит компонентный объект. Один компонентный объект может обладать несколькими связями ассоциации или агрегации.
Агрегация изображается линией между классами с ромбом на стороне целого объекта (рис. 30.4). Сплошной ромб представляет композицию (рис. 30.5).
Рис. 30.4. Агрегация
Рис. 30.5. Композиция
Мощность (multiplicity) показывает, как много объектов участвует в связи.
Мощность это число объектов одного класса, связанных с одним объектом другого класса. Понятие мощности связи в объектной модели аналогично понятиям мощности и класса принадлежности связи в модели «сущность-связь» (с точностью до расположения показателя мощности на диаграмме). Для каждой связи можно обозначить два показателя мощности по одному на каждом конце связи.
В языке UML приняты следующие нотации для обозначения мощности.
Значение мощности |
|
Мощность |
Значение |
* |
Много |
0 |
Нуль |
1 |
Один |
0..* |
Нуль или больше |
1..* |
Один или больше |
0..1 |
Нуль или один |
1..1 |
Ровно один |
Например, при разработке системы регистрации курсов в университете можно определить классы Course (учебный курс) и Student (студент). Между ними установлена связь, означающая посещение курсов студентами. Если один студент может посещать от нуля до четырех курсов, а на одном курсе могут заниматься от 10 до 20 студентов, то на диаграмме классов это можно изобразить следующим образом (рис. 30.6).
Рис. 30.6. Мощность связи
Зависимость (dependency) связь между двумя элементами модели, при которой изменения в спецификации одного элемента могут повлечь за собой изменения в другом элементе.
Зависимость слабая форма связи между клиентом и сервером (клиент зависит от сервера и не имеет знаний о сервере). Зависимость изображается штриховой линией, направленной от клиента к серверу (рис. 30.7).
Рис. 30.7. Зависимость
Зависимость между двумя элементами имеет место в том случае, если изменения в определении одного элемента могут повлечь за собой изменения в другом. Причины для зависимостей могут быть самыми разными: один класс посылает сообщение другому; один класс включает часть данных другого класса; один класс использует другой в качестве параметра операции. Если класс меняет свой интерфейс, то любое сообщение, которое он посылает, может утратить свою силу.
Обобщение (generalization) связь «тип-подтип» реализует механизм наследования (inheritance). Большинство объектно-ориентированных языков непосредственно поддерживает концепцию наследования. Она позволяет одному классу наследовать все атрибуты, операции и связи другого.
В языке UML связи наследования называют обобщениями и изображают в виде стрелок от класса-потомка к классу-предку (рис. 30.8).
Рис. 30.8. Обобщение
Общие атрибуты, операции и/или связи отображаются на верхнем уровне иерархии.
Помимо наследуемых, каждый подкласс имеет свои собственные уникальные атрибуты, операции и связи.
← 30.4. Основные элементы объектной модели |
30.6. Контрольные вопросы и задания → |
30.5.1. Диаграмма прецендентов UML
30.5.2. Диаграмма последовательности UML для прецедента
30.5.3. Диаграмма классов UML для прецендента «перевести р-ичную строку в число»
30.5.4. Текст приложения на языке Object Pascal
Рассмотрим пример проектирования и реализации программы, предназначенной для преобразования р-ичного числа (р в интервале от 2 до 16), представленного строкой в числовом формате, в технологии ООП.
Проект программы опишем с помощью диаграммы прецедентов, диаграммы последовательностей и диаграммы классов. Реализуем проект в форме консольного приложения на языке Object Pascal в среде программирования Delphi.
↑ Наверх
Программа реализует единственный прецедент: полученную от пользователя р-ичную строку преобразует в числовой формат.
Рис. 30.9. Диаграмма прецедентов UML
Сценарий прецедента (рис. 30.9): пользователь вводит с клавиатуры основание системы счисления и действительное число, представленное в этой системе счисления. Программа проверяет введенные значения. Если они верны (основание находится в диапазоне от 2 ло 16, во введенном числе нет недопустимых символов), то программа осуществляет преобразование введенного числа в десятичную систему счисления и отображает результат на экране монитора, в противном случае программы выдает сообщение об ошибке и завершает свою работу.
↑ Наверх
Для реализации прецедента мы создаем два объекта: один объект класса TInOut осуществляет ввод исходной строки, проверку строки на соответствие заданному формату и вывод результата; второй объект класса TConvertPToDec осуществляет преобразование введенной строки в числовой формат. Обмен сообщениями между объектами представлен на диаграмме последовательности (рис. 30.10).
Рис. 30.10. Диаграмма последовательности UML для прецедента
↑ Наверх
Между классом TinOut и классом TConvertPtoDec существует отношение зависимости, которое на диаграмме (рис. 30.11) изображено в виде штриховой стрелки. Это отношение возникает в силу того, что объекты класса TinOut вызывают операции объектов класса TConvertPtoDec для преобразования введенного числа в десятичную систему счисления.
Рис. 30.11. Диаграмма классов UML для прецедента «перевести р-ичную строку в число»
↑ Наверх
Приложение состоит из головной программы POOP и модуля UOOP. В головной программе описан класс TInOut, который отвечает за ввод исходных данных и вывод результата. В модуле UOOP описан класс TConvertPtoDec, который отвечает за преобразования числа, представленного в системе счисления с основанием р, в десятичную систему.
Класс TInOut инкапсулирует в себе поля p, Np, mistake для хранения данных и методы, предназначенные для обработки полей. Методы в классе представлены заголовками трех процедур по именам: OutPutResult, CheckInputFormat, Input и заголовком специального метода конструктора по имени Create. Интерфейс класса это те поля и методы, к которым могут обращаться объекты этого класса, представлен разделом с уровнем доступа public. Реализация класса это те поля и методы, которые недоступны объектам этого класса, она представлена разделом с уровнем доступа private. В случае класса TInOut все методы составляют интерфейс класса, а поля его реализацию.
Класс TConvertPtoDec не содержит полей, в его состав входят лишь методы. Раздел интерфейса класса представлен одним методом Convert. Три другие метода помещены в раздел реализации класса. Объекты этого класса могут вызывать только метод Convert, который обеспечивает преобразование числа в десятичную систему счисления. Остальные методы являются вспомогательными и вызываются внутри метода Convert. Объекты класса доступа к ним не имеют.
//Текст головной программы.
//-----------------------------------------------------
program POOP;
//-----------------------------------------------------
//Перевод р - ичного числа представленного строкой в
//число. р от 2 до 16.
//Технология ООП
{$APPTYPE CONSOLE}
//-----------------------------------------------------
uses
SysUtils,
UOOP in 'UOOP.pas';
//-----------------------------------------------------
type
//-----------------------------------------------------
TInOut = Class
//-------------------------------------------------
public
//-------------------------------------------------
procedure OutPutResult(r: TConvertPtoDec);
//Вывод десятичное представление р - ичного числа
//-------------------------------------------------
procedure CheckInputFormat();
//Контроль формата ввода
//-------------------------------------------------
procedure Input();
//Ввод р-ичного числа
//-------------------------------------------------
constructor Create(p: integer = 16);
//-------------------------------------------------
private
//-------------------------------------------------
p: integer;//Основание системы счисления
//-------------------------------------------------
Np:String;//исходное р-ичное число
//-------------------------------------------------
mistake: integer;//Номер ошибочной позиции в р-ичном числе
//-------------------------------------------------
end;
//-----------------------------------------------------
const
FirstS =['0'..'9','A'..'F','a'..'f','-','+'];
Another = FirstS + [','];
//-----------------------------------------------------
constructor TInOut.Create(p: integer = 16);
begin
self.p:= p;
mistake:= 0;
end;
//-----------------------------------------------------
procedure TInOut.Input;
//Ввод р-ичного числа
begin
write('p = ');
Readln(p);
write('Str',p,' = ');
readln(Np);
end;
//-----------------------------------------------------
procedure TInOut.CheckInputFormat;
//Контроль формата ввода
var
i: integer;
begin
for i:= 1 to Length(Np) do begin
if (i = 1) and not (Np[1] in FirstS) then begin mistake:= 1; exit; end;
if (i <> 1) and not (Np[i] in Another) then begin mistake:= i; exit; end;
end;
end;
//-----------------------------------------------------
procedure TInOut.OutPutResult;
//Вывод десятичное представление р - ичного числа
begin
if mistake = 0
then begin //Формирование и вывод строки результата
writeln('number = ',r.Convert(Np,p) :8:4);
end
else //вывод сообщения об ошибке
writeln('input mistake position ', mistake);
end;
//-----------------------------------------------------
var
c: TInOut;
f: TConvertPtoDec;
//-----------------------------------------------------
begin
c:= TInOut.Create(16);//Создание объекта класса TInOut.
f:= TConvertPtoDec.Create; //Создание объекта класса
//TConvertPtoDec.
c.Input();//Ввод исходных данных
c.CheckInputFormat;//Контроль формата исходных данных
c.OutPutResult(f);//Преобразование и вывод результата
readln;
end.
Текст модуля.
//-----------------------------------------------------
unit UOOP;
//-----------------------------------------------------
interface
//-----------------------------------------------------
type
//-----------------------------------------------------
TConvertPtoDec = class//отвечает за преобразование числа
//-------------------------------------------------
public
//-------------------------------------------------
function Convert(Np: String;p: integer):real;
//Формирование результата
private
//-------------------------------------------------
function PCharToInt(d: Char):integer;
//переводит символ, изображающий цифру в её
//числовое представление в системах счисления с
//основаниями от 2 до 16
//-------------------------------------------------
function PStrToInt(r: String; b:integer):integer;
//перевод целого - строка r в её числовое
//представление в с. сч. с основанием b
//-------------------------------------------------
function PStrToFrac(f: String; b:integer): Real;
//перевод дроби - строка f в её числовое
//представление в с. сч. с основанием b
end;
//-----------------------------------------------------
implementation
//-----------------------------------------------------
function TConvertPtoDec.PCharToInt(d: Char):integer;
//переводит символ, изображающий цифру, в её числовое
//представление в системах счисления с основаниями от 2 //до 16
begin
result:= 0;
case d of
'0'..'9': Result:= Ord(d)- Ord('0');
'A'..'F': Result:= Ord(d)- Ord('A') + 10;
'a'..'f': Result:= Ord(d)- Ord('a') + 10;
end;
end;
//-----------------------------------------------------
function TConvertPtoDec.PStrToInt(r: String; b:integer):integer;
//перевод целое строка s в её числовое
//представление в с. сч. с основанием b
var n: integer; w: integer;
begin
result:= 0;
n:= Length(r);
w:= 1;
while n <> 0 do begin
Result:= Result + PCharToInt(r[n])*w;
w:= w*b;
Delete(r,n,1);
n:= Length(r);
end;
end;
//-----------------------------------------------------
function TConvertPtoDec.PStrToFrac(f: String; b:integer): Real;
//перевод дробь строка f в её числовое
//представление в с. сч. с основанием b
var n: integer; w : Real;
begin
result:= 0;
n:= Length(f);
w:= 1/b;
while n <> 0 do begin
Result:= Result + PCharToInt(f[1])*w;
w:= w/b;
Delete(f,1,1);
n:= Length(f);
end;
end;
//-----------------------------------------------------
function TConvertPtoDec.Convert(Np: String;p: integer):real;
//Формирование результата p-основание системы счисления
var
Ip: String;//целая часть исходного р-ичного числа
Fp: String;//дробная часть исходного р-ичного числа
signe: integer;//Знак числа
z: integer;//позиция разделителя в р-ичном числе
begin
Ip:='';//целая часть исходного р-ичного числа
Fp:='';//дробная часть исходного р-ичного числа
signe:= 1;//Знак числа
if Np[1]='-'
then begin signe:= -1; delete(Np,1,1) end
else signe:= 1;
z:= Pos(',',Np);
if z <> 0
then begin
Ip:= Copy(Np,1,z - 1);
Fp:= Copy(Np,z + 1,Length(Np) - z);
result:= PStrToInt(Ip, p) + PStrToFrac(Fp, p)
end
else begin Ip:= Np; result:= PStrToInt(Ip, p); end;
if signe < 0
then result:= result*signe;
end;
end.
//-----------------------------------------------------
30.6. Контрольные вопросы и задания
← 30.5. Пример разработки консольного приложения... |
31.Введение → |
← 30.6. Контрольные вопросы и задания |
31.1. История развития БД → |
31.1. История развития БД
← 31.Введение |
31.2. Классификация БД → |
История развития баз данных представляет собой историю развития систем управления данными во внешней памяти ЭВМ. На первых электронно-вычислительных машинах существовало два вида внешних устройств магнитные ленты и магнитные барабаны. Магнитные ленты обладали достаточно большой емкостью, но основным их недостатком было то, что для чтения информации, находящейся в середине или в конце ленты необходимо было прочитать весь предыдущий участок. Магнитные барабаны давали возможность произвольного доступа к памяти, но объем хранимой на них информации был ограничен. В то время говорить о какой-либо системе управления данными во внешней памяти не приходилось. Каждая прикладная программа, которой требовалось хранить данные во внешней памяти, сама определяла расположение данных на магнитной ленте или барабане. Функции информационного обмена между оперативной и внешней памятью, именование и структуризацию данных также выполняла прикладная программа.
История баз данных начинается с появлением магнитных дисков и насчитывает более 30 лет. В 1968 году была введена в эксплуатацию первая промышленная СУБД система IMS фирмы IBM; в 1975 году появился первый стандарт СУБД, разработанный ассоциацией по языкам систем обработки данных CODASYL (Conference of Data System Language). Этот стандарт определил ряд фундаментальных понятий в теории систем БД, которые до сих пор являются основополагающими для сетевой модели данных. В 1981 году Эдгар Франк Кодд создал реляционную модель данных и применил к ней операции реляционной алгебры. В истории баз данных можно выделить несколько этапов.
Важным шагом в развитии информационных систем явилось создание централизованных систем управления файлами (СУФ) систем, позволяющих создавать, редактировать, копировать, перемещать файлы. В настоящее время такие системы входят в состав любой операционной системы. Система управления файлами выполняет следующие функции:
При этом СУФ не знает конкретной структуры файла, организация работы с записями файла ложится на ту прикладную программу, которая работает с файлом. Кроме того, в СУФ реализован децентрализованный доступ к файлам все действия, которые конкретный пользователь имеет право производить с конкретным файлом, закодированы и хранятся совместно с файлом. В СУФ также было невозможно одновременно работать с одним файлом нескольким пользователям.
Первые базы данных на больших ЭВМ (типа IBM 360/370, ЕС ЭВМ, разных моделях Hewlett Packard) появились в 1970-х годах. БД хранились во внешней памяти центральной ЭВМ. Пользователями БД были задачи, в основном запускаемые в пакетном режиме. Интерактивный режим доступа обеспечивался с помощью консольных терминалов, которые не обладали собственными вычислительными ресурсами (процессором, оперативной и внешней памятью) и служили только устройствами ввода-вывода для центральной ЭВМ. Программы доступа к БД писались на обычных языках программирования и запускались, как обычные числовые программы. СУБД этого периода работали с централизованной базой данных в режиме распределенного доступа, при этом функции управления распределением ресурсов выполнялись операционной системой. Кроме того, в СУБД была поддержка языков манипулирования данными, администрирование данных. Именно в это время проводятся серьезные работы по обоснованию и формализации реляционной модели данных.
С появлением персональных компьютеров изменились условия использования вычислительной техники в организациях и фирмах. Так как техника стала доступна, компьютеры превратились в удобный инструмент для ведения документации и учетных функций фирм. В это время появляются так называемые настольные СУБД, позволяющие, с одной стороны, хранить в упорядоченном виде большие объемы информации и, с другой стороны, имеющие удобный интерфейс для заполнения данных и генерации различных отчетов.
Основные отличительные черты этого этапа развития БД следующие:
В отличие от настольных СУБД распределенные СУБД ориентированы на обработку данных, хранящихся в разных местах, но логически связанных друг с другом. Они позволяют организовать параллельную обработку информации и поддержку целостности данных. Этот этап развития баз данных имеет свои особенности:
← 31.1. История развития БД |
31.3. Контрольные вопросы и задания → |
31.2.1. Основные функции СУБД
Существует хорошо известное, но трудно реализуемое на практике понятие базы данных как большого по объему хранилища данных, в которое фирма помещает все обрабатываемые ею данные и из которого различные пользователи могут эти данные получить. Такая БД очень сложна и фактически нереальна. Мы будем понимать под БД совокупность взаимосвязанных, хранящихся вместе данных при наличии минимальной избыточности, которая будет допускать их использование оптимальным образом для одного или нескольких приложений; данные запоминаются так, чтобы они были независимы от программ, использующих эти данные; для добавления новых или модификации существующих данных, а также для поиска в БД применяется общий управляемый способ.
Данные структурируются таким образом, чтобы была обеспечена возможность дальнейшего наращивания приложений. Рассмотрим основные типы БД. Как уже говорилось, БД является ядром ИС. Тип базы данных определяется типом архитектуры ИС, в которой функционирует БД. Любую ИС образуют три основных элемента: комплекс аппаратных средств (серверы, рабочие станции, коммуникационное оборудование); сетевая операционная система, обслуживающая совместное использование рабочими станциями ресурсов сети; комплексы прикладных программ («приложения»), которые, собственно, и обеспечивают решение задач пользователя. Основным программным средством работы с БД является система управления базами данных (СУБД).
↑ Наверх
СУБД представляет собой программное обеспечение, которое управляет доступом к БД. Это происходит следующим образом:
Рассмотрим основные функции СУБД подробнее.
Подводя итог вышесказанному, можно сделать вывод, что в целом назначение СУБД предоставление пользовательского интерфейса с БД.
Такие ИС очень часто работают неустойчиво, так как программы на рабочих станциях работают независимо друг от друга, и каждая из них, обращаясь к серверу за информацией, обычно захватывают весь информационный файл, даже если ей нужно всего несколько записей. Кроме того, каждая программа устанавливает собственные правила захвата и блокировки информационных ресурсов (с целью не допустить одновременного изменения одних и тех же данных разными пользователями).
Выходом из данной тупиковой ситуации явилось создание другой модели обработки данных в сети технологии «клиентсервер». Основная идея этой модели разделить ключевые функции по обработке информации между программой-приложением (клиентом) и программой управления базой данных (сервером). Ранг последнего резко повышается. Он становится сервером баз данных, на него возлогается большая часть обязанностей по оптимизации обслуживания, поддержке целостности и безопасности данных, контролю за доступом к данным и т.д. Приложению лишь остается правильно сформулировать запрос и оформить выданный сервером результат. Для СУБД архитектура «клиентсервер» выглядит так, как показано на рис. 31.1.
Рис. 31.1. Архитектура «клиентсервер»
Любую СУБД можно рассматривать как систему с очень простой структурой, состоящей из двух частей сервера (или машины БД) и набора клиентов.
Сервер это собственно СУБД. Он поддерживает все основные функции СУБД, которые обсуждались выше, а именно определение, обработку данных, защиту и целостность данных и т.д. В частности, он предоставляет полную поддержку на внешнем, концептуальном и внутреннем уровнях. Поэтому «сервер» это просто другое имя СУБД.
Клиенты это различные приложения, которые выполняются над СУБД: приложения, написанные пользователями, и встроенные приложения, предоставляемые поставщиками СУБД или некоторыми сторонними поставщиками программного обеспечения. Конечно, с точки зрения пользователей, нет разницы между встроенными приложениями и приложениями, написанными пользователями.
Существует несколько способов взаимодействия ИС и БД, обеспечивающие наиболее эффективное использование БД. Коротко рассмотрим каждый из этих вариантов.
БД размещена на компьютере-сервере, выполняющем функции клиент-сервера. При этом сервер БД обеспечивает выполнение основного объема обработки данных. Формируемые клиентом запросы поступают к серверу БД в виде инструкций языка SQL. Сервер БД выполняет поиск и извлечение нужных данных, которые затем передаются на компьютер пользователя. Достоинства: меньший объем передаваемых данных, быстрая обработка больших объемов информации за счет оптимизации процедур обработки информации. Недостатки: необходимость наличия отдельной программы-сервера, обеспечивающей исполнение запросов пользователя. В настоящее время наиболее эффективной является архитектура «клиент-сервер».
Так как система в целом может быть четко разделена на две части (серверы и клиенты), появляется возможность работы этих двух частей на разных машинах. Иначе говоря, существует возможность распределенной обработки данных. Распределенная обработка предполагает, что отдельные машины можно соединить какой-нибудь коммуникационной сетью таким образом, что определенная задача, обрабатывающая данные, может быть распределена на несколько машин в сети.
32.1. Основные понятия БД
← 31.3. Контрольные вопросы и задания |
32.2. Основные понятия реляционной модели БД → |
Понятие об информации как о знании, сложилось уже давно. Человек создал естественные ИС, позволяющие снабжать информацией процессы производства, планирования, принятия решений. Мы будем понимать под информацией любые сведения о каком-либо событии, сущности, процессе. Наряду с понятием информации часто употребляют понятие «lанные».
Понятие «данные» в концепции баз данных это набор конкретных значений, параметров, характеризующих объект, условие, ситуацию или любые другие факторы в числовой, текстовой, графической, звуковой форме.
Например, «Петров Николай 1989 СТ-91». Сказать, что эти данные представляют собой информацию, нельзя, так как непонятно, что, например, означает в этих данных «1989». Но если придать этим данным определенную форму и вписать их в некоторую структуру (табл. 32.1), то все станет ясно.
Таблица 32.1. Табличный пример структуры данных
Ф.И.О. студента |
Год рождения |
Группа |
Петров Николай |
1989 |
СТ-91 |
Вывод. Данные не обладают определенной структурой, данные становятся информацией тогда, когда пользователь задает им определенную структуру, т.е. осознает их смысловое содержание. Поэтому центральным понятием в концепции баз данных является понятие модели данных. Модель данных схема (порядок, совокупность принципов, система) организации данных в единое целое для создания, накопления, обработки и управления. Это некоторая абстракция, которая, будучи приложена к конкретным данным, позволяет пользователям и разработчикам трактовать их уже как информацию, т.е. сведения, содержащие не только данные, но и их взаимосвязи. Следовательно, данные, вписанные в определенную модель, можно назвать информацией. Модель данных (МД) совокупность структур данных и операций по их обработке. В теории баз данных рассматриваются модели данных трех уровней: уровень представлений пользователя (внешний), концептуальные модели, физические (внутренние) модели.
Совокупность данных, представленных предметной областью и предназначенных для совместного применения, называется базой данных. С позиций моделирования источник информации называют предметной областью, а используемую знаковую систему (способ абстрагирования предметной области) моделью данных. Описание предметной области в терминах выбранной модели данных называют концептуальной схемой предметной области. Модели данных бывают разных видов. При проектировании БД традиционно используются концептуальные модели трех видов: иерархическая, сетевая и реляционная. В современных СУБД наиболее часто используется реляционная модель. Рассмотрим ее основные понятия.
32.2. Основные понятия реляционной модели БД
← 32.1. Основные понятия БД |
32.3. Предпроектное обследование предметной... → |
Для понимания того, как выглядит концептуальная модель в случае использования реляционной модели данных, рассмотрим основных понятия реляционной модели данных.
Любую структуру данных можно преобразовать в двумерную таблицу. Такое представление данных наиболее удобно и для пользователя, и для ЭВМ подавляющее число современных ИС работает именно с такими таблицами. БД, состоящие из двумерных таблиц, называются реляционными (от англ. relation отношение).
Основная идея реляционного подхода состоит в том, чтобы представить произвольную структуру данных в виде простой двумерной таблицы. Теория реляционных БД это сложная математическая дисциплина. Основная терминология БД зависит от уровня описания, конкретного класса системы и категории пользователей. В табл. 32.2 приведены основные термины, характерные для всех вышеперечисленных уровней.
Таблица 32.2. Уровни терминов теории БД
Теория БД |
Реляционные БД |
Термины конкретной СУБД (например, ACCESS) |
Отношение |
Таблица |
Таблица |
Кортеж |
Строка |
Строка |
Атрибут |
Столбец |
Поле |
Совместно с термином «атрибут» часто употребляется термин «домен».
Домен определяется заданием некоторого базового типа данных, к которому относятся элементы домена, и произвольного логического выражения, применяемого к типу данных. Другими словами, домен допустимое потенциальное множество значений данного типа, т.е. множество допустимых значений данного атрибута.
Кортеж это множество пар {имя атрибута, значение}, которое содержит одно вхождение данного имени атрибута, принадлежащего схеме отношения. Значение является допустимым значением домена данного атрибута (или типа данных, если понятие домена не поддерживается). Иначе, кортеж набор именованных значений заданного типа (строка в отношении).
Строку таблицы также часто называют записью. Далее будем использовать следующие понятия реляционных БД.
Так как отношения являются множествами кортежей, то в них не должны встречаться одинаковые кортежи, и порядок кортежей в отношении несущественен. Обычное представление отношения таблица, заголовком которой является схема отношения, а строками кортежи отношения-экземпляра; в этом случае имена атрибутов именуют столбцы этой таблицы. Поэтому иногда говорят «столбец таблицы», имея в виду «атрибут отношения».
Схема отношения это совокупность наименований атрибутов, представленная в виде заголовка таблицы.
Тип данных. Это понятие в реляционной модели данных полностью адекватно понятию типа данных в языках программирования. Обычно в современных реляционных БД допускается хранение символьных, числовых данных, битовых строк, специализированных числовых данных («денежные»), а также специальных временных данных, которые являются и числовыми (дата, время, временной интервал).
Рис. 32.1. Пример схемы отношения
Итак, обобщим.
Каждая запись в таблице должна иметь первичный ключ идентификатор, значение которого однозначно определяет эту и только эту запись.
Ключ может состоять из одного или нескольких полей. Первичный ключ должен обладать двумя свойствами:
Каждое значение первичного ключа в пределах таблицы должно быть уникальным (в противном случае нельзя отличить одну запись от другой). Например, если объявить в таблице с данными о студентах ключом фамилию студента, может оказаться, что таблица содержит данные об однофамильцах. В этом случае фамилия не будет однозначно идентифицировать запись, поэтому нужно добавить в определение ключа еще и имя и отчество (ключ получится сцепленным). Таким образом, указание первичного ключа это и есть единственный способ отличить один экземпляр объекта от другого.
Процесс проектирования БД включает несколько этапов. На рис. 32.2 представлена общая схема проектирования БД.
Рис. 32.2. Этапы проектирования БД
Концептуальная схема представляет собой абстрагированное описание предметной области (модель предметной области), заданное в терминах выбранной модели данных. При этом каждая запись модели находится в третьей нормальной форме.
Под физической БД подразумевается схема распределения данных по физическим носителям информации.
32.3. Предпроектное обследование предметной области. Связи таблиц
← 32.2. Основные понятия реляционной модели БД |
32.4. Нормализация отношений → |
Исходными данными для построения реляционной модели БД является описание предметной области. Основные конструктивные элементы такого описания сущность, атрибут, связь.
Сущность это обобщенное понятие для обозначения множества однородных объектов предметной области, информацию о которых необходимо собирать и хранить в ИС. Примером сущности, информацию о котором мы структурировали в табл. 32.1, является «студент». Сущность определяется своим уникальным именем и перечнем атрибутов, характеризующих свойства сущности.
Атрибут это поименованная характеристика сущности, которая принимает значения из некоторого множества допустимых значений. Атрибуты моделируют свойства сущности. Чтобы задать атрибут в модели, необходимо присвоить ему наименование, определить множество его допустимых значений и указать, для чего он используется. Имя атрибута называют его смысловым описанием. В этом смысле совокупность имен атрибутов описывает свойства сущности. Для сущности «студент» атрибутами являются «фамилия», «имя», «год рождения», «группа». Можно сказать, что между атрибутами сущности существует отношение. Вообще, отношение это понятие математическое и оно имеет строгое математическое определение. Суть же понятия «отношение» состоит в следующем: для каждого конкретного экземпляра объекта (сущности) есть набор только ему присущих экземпляров значимых для нашего описания атрибутов. Так, в примере, приведенном в табл. 32.1, мы имеем отношение между объектом «студент» и его атрибутами «год рождения» и «группа». Говоря обычным языком, можно сформулировать это отношение следующим образом: «Каждый студент имеет свой год рождения и учится в группе с определенным номером».
Связь это обобщенное понятие, предназначенное для обозначения выделенного в предметной области отношения между двумя и более сущностями. Сущности и связи между ними каждая категория пользователей будущей ИС определяет в соответствии со своей концепцией предметной области и необходимостью работы с именно этой информацией.
Предметная область определена, если известны существующие в ней объекты, их свойства и связи между ними.
При описании той или иной предметной области желательно, чтобы соблюдались следующие требования:
То есть проектирование БД начинается с предварительной структуризации предметной области: выделения объектов (сущностей), свойств этих объектов и видов отношений между объектами.
Информацию о предметной области представляют с помощью графических диаграмм. Для них можно использовать определенные обозначения.
Пример описания предметной области
Рассмотрим предметную область «Учебный процесс». В данной предметной области нас интересует ограниченный объем информации это определенные сведения о студентах, преподавателях, читаемых предметах и таком отношении между студентами, преподавателями и предметами как «экзамен».
В связи с этим выделим следующие сущности:
СТУДЕНТ
ПРЕПОДАВАТЕЛЬ
ПРЕДМЕТ
Для этих сущностей важны следующие признаки (атрибуты):
СТУДЕНТ(ФИО, Дата рождения, Адрес, Дата поступления, Номер зачетной книжки, Номер группы)
ПРЕПОДАВАТЕЛЬ(ФИО, Адрес, Должность, Кафедра, Ученое звание, Телефон рабочий, Телефон сотовый)
ПРЕДМЕТ(Название, Кафедра, Лекции, Практические занятия, Лабораторные работы, Курсовые работы, Отчетность, Семестр)
Между сущностями СТУДЕНТ, ПРЕПОДАВАТЕЛЬ и ПРЕДМЕТ существует связь, которую мы назовем ЭКЗАМЕН. Связь, как и сущность, может иметь атрибуты. Связь ЭКЗАМЕН характеризуется, например, атрибутами (Дата проведения, Оценка).
Набор конкретных значений атрибутов, характеризующих объект, называется экземпляром объекта.
Под структурной связью (рис. 32.3) между объектами понимается связь множества экземпляров одного объекта, называемого главным (А), с некоторым множеством, возможно пустым, экземпляров вспомогательного объекта, называемого детальным (В).
Рис. 32.3. Изображение структурной связи
Экземпляр структурной связи некоторое подмножество структурной связи, в которой один экземпляр главного объекта связан со множеством, возможно пустым, экземпляров детального объекта.
Пример 1. Экземпляр структурной связи (рис. 32.4).
Рис. 32.4. Экземпляр структурной связи
Структурные связи могут быть четырех типов:
Пример 2. На предприятии несколько цехов выпускают изделия конкретных наименований для каждого цеха. Каждый цех имеет номер и начальника с конкретной фамилией. Изделия изготавливаются из различных материалов. Изделия и материал характеризуются наименованием и шифром. Необходимо выделить связи и указать типы этих связей, а также построить примеры экземпляров структурных связей (рис. 32.5).
Имеются следующие объекты (в скобках перечислены их атрибуты):
ЦЕХ (номер)
МАТЕРИАЛ (наименование и шифр материала)
ИЗДЕЛИЕ (наименование и шифр изделия)
НАЧАЛЬНИК (ФИО)
Структурная связь для отношения «Изделие-материал»:
Рис. 32.5. Структурная связь «изделие-материал» (а) и экземпляр главной группы (б)
В процессе проектирования БД данные предметной области обычно представляются на различных уровнях абстракции: логическом, концептуальном, физическом. Процесс перехода от одного уровня абстракции в представлении данных собственно и есть проектирование БД.
32.4. Нормализация отношений
← 32.3. Предпроектное обследование предметной... |
32.5. Общие сведения о MS Access → |
Нормализация БД как процесс основывается на понятии зависимости между атрибутами отношений. Под функциональной зависимостью между атрибутами будем понимать такую зависимость, когда каждому атрибуту А соответствует одно и только одно значение атрибута В. Например, каждой фамилии студента соответствует один и только один шифр студента. Частичной функциональной зависимостью будем называть зависимость неключевого атрибута от части первичного ключа. Например, имеется запись вида:
ЗАКАЗЫ
Дата заказа |
Номер заказа |
Наименование поставщика |
Адрес поставки |
Наименование товара |
Количество |
Цена |
Сумма |
В этом случае атрибут «Адрес поставщика» будет зависеть только от части первичного ключа Наименование поставщика. Следовательно, в записи имеется частичная функциональная зависимость значения поля «Адрес поставщика» от первичного ключа отношения.
Под полной функциональной зависимостью будем понимать зависимость неключевого атрибута от всего первичного ключа. Так, в рассмотренном выше примере значение поля Количество будет зависеть от значений полей Номер заказа, Наименование поставщика, Наименование товара, т.е. от всего первичного ключа.
Под транзитивной зависимостью будем понимать следующую зависимость: если атрибут В зависит от атрибута А, а атрибут С зависит от атрибута В, то С транзитивно зависит от А.
Под многозначной зависимостью будем понимать зависимость многих значений поля В от одного значения поля А. Или, говоря другими словами, поле В многозначно зависит от поля А, если каждому значению поля А соответствует множество значений поля В.
Будем говорить, что отношение находится в первой нормальной форме (1НФ), если все его атрибуты являются простыми (имеют единственное значение) и не содержат повторяющихся полей. То есть каждое значение любого поля таблицы БД должно быть неделимо на более мелкие поля (атомарно).
Рассмотрим отношение, представленное в табл. П.1 (см. приложение). Оно не находится в 1НФ, так как поле Адрес поставщика может быть разделено на поля «Город», «Улица», «Дом», следовательно, оно не атомарно. Для приведения этой таблицы к 1НФ надо разбить поле Адрес на несколько полей. Результат представлен в табл. П.2 (см. приложение).
Говорят, что отношение находится во второй нормальной форме (2НФ) , если оно находится в 1НФ и каждый его неключевой атрибут функционально полно зависит от составного первичного ключа. Отношение, представленное в табл. П.2 (см. приложение) не находится в 2НФ, для приведения ее к 2НФ необходима декомпозиция (разбиение) этой таблицы на табл. П3П9 (см. приложение).
Говорят, что таблица находится в третьей нормальной форме (3НФ), если она находится в 2 НФ и в ней отсутствуют транзитивные зависимости. В приложении табл. П.9 не удовлетворяет требованиям 3 НФ, так как в ней имеется транзитивная зависимость между атрибутами Код товара, Товар и Единица измерения. Для приведения ее к 3НФ надо провести декомпозицию, результаты которых представлены в табл. П.11 и П.12 (см. приложение).
Табл. П.8 удовлетворяет требованиям 3 НФ, поэтому просто переписывается в П10 (см. приложение).
32.5. Общие сведения о MS Access
← 32.4. Нормализация отношений |
32.6. Приложение → |
MS Access это система управления реляционными БД, предназначенная для работы на автономном ПК или в локальной вычислительной сети под управлением MS Windows. Это набор инструментальных средств для создания и эксплуатации ИС. Средствами Access можно проводить несколько операций.
Рассмотрим базовую схему работы с СУБД MS Access.
Запуск и завершение работы СУБД MS Access проводится любым из стандартных способов, предусмотренных в среде Windows. Объектом обработки MS Access является файл БД, имеющий произвольное имя и расширение .DBF. В этот файл входят основные объекты MS Access: таблицы, запросы, формы, отчеты, макросы и модули. Определим эти объекты.
Таблицы список данных одной категории. Информация, как уже было сказано, записывается в поля, которые упорядочены в виде строк и столбцов. Таблица исходный объект Access, все остальные объекты производные.
Запросы отображение информации из одной или нескольких таблиц, отобранной на основании некоторых критериев. Запись критерия может быть сохранена для последующего использования. Результат запроса можно представить в виде таблицы и использовать в качестве основы для других таблиц, форм или запросов.
Формы специальное представление таблицы или нескольких таблиц, предназначенное для ввода данных. Форма не является самостоятельным объектом Access, она просто помогает вводить, просматривать и модифицировать информацию в таблице или запросе.
Отчеты предназначены для вывода подготовленных или отформатированных данных, которые отобраны из запросов или таблиц. Запросы и отчеты выполняют самостоятельные функции: выбирают, группируют, представляют и печатают информацию.
Макросы автоматизируют часто выполняемые действия (это специальным образом оформленный набор макрокоманд: ОткрытьФорму или ПечататьОтчет, другими словами, программа выполнения какого-либо действия).
Модули программы, написанные на языке программирования MS Access. Каждый объект Access имеет имя. С каждым объектом мы работаем в отдельном окне. После загрузки MS Access ожидает одного из следующих распоряжений:
Создание БД. После выбора команды Файл → оздать на экране появляется стандартное окно, в котором надо указать имя создаваемого файла БД. Создав файл, Access открывает пустое окно БД, в котором в дальнейшем будут проводиться все операции по созданию и манипулированию объектами БД.
Открытие БД. После выбора команды Файл → Открыть на экране появится окно, в котором необходимо указать имя и адрес существующего файла БД. Access многооконное приложение, однако в любой момент может быть открыта только одна БД. В окне БД находится перечень существующих объектов БД: таблиц, запросов и т.д. С окном любого объекта можно работать либо в оперативном режиме (например, вводить или просматривать данные в таблице), либо в режиме конструктора (например, менять макет объекта изменить макет таблицы).
Кроме вышеперечисленных в файл БД входит еще один документ, имеющий собственное окно, схема данных. В этом окне мы создаем, просматриваем, изменяем и разрываем связи между таблицами. Эти связи помогают контролировать данные, создавать запросы и отчеты.
← 32.5. Общие сведения о MS Access |
32.7. Контрольные вопросы и задания → |
Таблица П1.
Поступление товара
Дата поступления |
Номер накладной |
Поставщик |
Адрес поставщика |
Товар |
Единица измерения |
Количество |
Цена |
Сумма |
05.05.2008 |
14 |
ООО «Орион» |
г. Ставрополь, ул. Ленина, 24, корп.1 |
Кирпич |
шт. |
30000 |
6,5 |
195000 |
05.05.2008 |
14 |
ООО «Орион» |
г. Ставрополь, ул. Ленина, 24, корп.1 |
Шифер |
шт. |
6500 |
25 |
162500 |
05.05.2008 |
14 |
ООО «Строительные материалы» |
г. Волгоград, ул. Победы, 47 |
Цемент |
т |
60 |
650 |
39000 |
05.05.2008 |
15 |
ООО «Строительные материалы» |
г. Волгоград, ул. Победы, 47 |
Кафель |
шт. |
60000 |
5 |
300000 |
05.05.2008 |
15 |
ООО «Строительные материалы» |
г. Волгоград, ул. Победы, 47 |
Цемент |
т |
120 |
550 |
66000 |
20.05.2008 |
16 |
ООО «Стройторг» |
г. Прохладный, ул. Космическая, 13 |
Доска обрезная |
мЗ |
35 |
2000 |
70000 |
20.05.2008 |
16 |
ООО «Стройторг» |
г. Прохладный, ул. Космическая, 13 |
Арматура Д30 |
т |
40 |
9700 |
388000 |
Таблица П2.
Дата поступления |
Номер накладной |
Поставщик |
Город |
Улица |
Дом |
Корпус |
Товар |
Единица измерения |
Количество |
Цена |
05.05.2008 |
14 |
ООО «Орион» |
г. Ставрополь |
ул. Ленина |
24 |
1 |
Кирпич |
шт. |
30000 |
6,5 |
05.05.2008 |
14 |
ООО «Орион» |
г. Ставрополь |
ул. Ленина |
24 |
1 |
Шифер |
шт. |
6500 |
25 |
05.05.2008 |
14 |
ООО «Строительные материалы» |
г. Волгоград |
ул. Победы |
47 |
|
Цемент |
т |
60 |
650 |
05.05.2008 |
15 |
ООО «Строительные материалы» |
г. Волгоград |
ул. Победы |
47 |
|
Кафель |
шт. |
60000 |
5 |
05.05.2008 |
15 |
ООО «Строительные материалы» |
г. Волгоград |
ул. Победы |
47 |
|
Цемент |
т |
120 |
550 |
20.05.2008 |
16 |
ООО «Стройторг» |
г. Прохладный |
ул. Космическая |
13 |
|
Доска обрезная |
мЗ |
35 |
2000 |
20.05.2008 |
16 |
ООО «Стройторг» |
г. Прохладный |
ул. Космическая |
13 |
|
Арматура Д30 |
т |
40 |
9700 |
Таблица П3.
Поставщик
Поставщик |
Город |
Улица |
Дом |
Корпус |
ООО «Орион» |
г. Ставрополь |
ул. Ленина |
24 |
1 |
ООО «Строительные материалы» |
г. Волгоград |
ул. Победы |
47 |
|
ООО «Стройторг» |
г. Прохладный |
ул. Космическая |
13 |
|
Таблица П4.
Поступление товара
Дата поступления |
Номер накладной |
Товар |
Единица измерения |
Количество |
Цена |
Сумма |
05.05.2008 |
14 |
Кирпич |
шт. |
30000 |
6,5 |
195000 |
05.05.2008 |
14 |
Шифер |
шт. |
6500 |
25 |
162500 |
05.05.2008 |
14 |
Цемент |
т |
60 |
650 |
39000 |
05.05.2008 |
15 |
Кафель |
шт. |
60000 |
5 |
300000 |
05.05.2008 |
15 |
Цемент |
т |
120 |
550 |
66000 |
20.05.2008 |
16 |
Доска обрезная |
мЗ |
35 |
2000 |
70000 |
20.05.2008 |
16 |
Арматура Д30 |
т |
40 |
9700 |
388000 |
Таблица П5.
Накладные
Номер накладной |
Дата поступления |
Поставщик |
14 |
05.05.2008 |
ООО «Орион» |
14 |
05.05.2008 |
ООО «Орион» |
14 |
05.05.2008 |
ООО «Строительные материалы» |
15 |
05.05.2008 |
ООО «Строительные материалы» |
15 |
05.05.2008 |
ООО «Строительные материалы» |
16 |
20.05.2008 |
ООО «Стройторг» |
16 |
20.05.2008 |
ООО «Стройторг» |
Таблица П6.
Состав накладной
Номер накладной |
Товар |
Единица измерения |
Количество |
Цена |
Сумма |
14 |
Кирпич |
шт. |
30000 |
6,5 |
195000 |
14 |
Шифер |
шт. |
6500 |
25 |
162500 |
14 |
Цемент |
т |
60 |
650 |
39000 |
15 |
Кафель |
шт. |
60000 |
5 |
300000 |
15 |
Цемент |
т |
120 |
550 |
66000 |
16 |
Доска обрезная |
мЗ |
35 |
2000 |
70000 |
16 |
Арматура Д30 |
т |
40 |
9700 |
388000 |
Атрибут «Единица измерения» зависит только от части ключа «Товар»
Таблица П7.
Товары
Товар |
Единица измерения |
Кирпич |
шт. |
Шифер |
шт. |
Цемент |
т |
Кафель |
шт. |
Доска обрезная |
мЗ |
Арматура Д30 |
т |
Таблица П8.
Состав накладной (приведена к «НФ»)
Номер накладной |
Товар |
Количество |
Цена |
Сумма |
14 |
Кирпич |
30000 |
6,5 |
195000 |
14 |
Шифер |
6500 |
25 |
162500 |
14 |
Цемент |
60 |
650 |
39000 |
15 |
Кафель |
60000 |
5 |
300000 |
15 |
Цемент |
120 |
550 |
66000 |
16 |
Доска обрезная |
35 |
2000 |
70000 |
16 |
Арматура Д30 |
40 |
9700 |
388000 |
Таблица П9.
Введение суррогатного ключа в табл. П7 (для ускорения поиска)
Код товара |
Товар |
Единица измерения |
1 |
Кирпич |
Шт |
2 |
Шифер |
Шт |
3 |
Цемент |
Тн |
4 |
Кафель |
Шт |
5 |
Доска обрезная |
мЗ |
6 |
Арматура Д30 |
Тн |
Можно во всех остальных таблицах заменить ключ «Товар» на «Код товара»
Таблица «Поступление товара» разбита на четыре таблицы:
Таблица П10.
Состав накладной
Номер накладной |
Товар |
Количество |
Цена |
Сумма |
14 |
Кирпич |
30000 |
6,5 |
195000 |
14 |
Шифер |
6500 |
25 |
162500 |
14 |
Цемент |
60 |
650 |
39000 |
15 |
Кафель |
60000 |
5 |
300000 |
15 |
Цемент |
120 |
550 |
66000 |
16 |
Доска обрезная |
35 |
2000 |
70000 |
16 |
Арматура Д30 |
40 |
9700 |
388000 |
Таблица П11.
Товары
Код товара |
Единица измерения |
1 |
шт. |
2 |
шт. |
3 |
т |
4 |
шт. |
5 |
мЗ |
6 |
т |
Таблица П12.
Номенклатура товаров
Код товара |
Товар |
1 |
Кирпич |
2 |
Шифер |
3 |
Цемент |
4 |
Кафель |
5 |
Доска обрезная |
6 |
Арматура Д30 |
33.1. Создание объектов в MS ACCESS
← 32.7. Контрольные вопросы и задания |
33.2. Связь между таблицами и целостность данных → |
Любой объект в MS ACCESS можно создавать либо вручную, либо с помощью специальной программы Мастера. Таблицы и запросы удобнее создавать вручную, формы и отчеты с помощью Мастера. Рассмотрим последовательность шагов при включении в БД новой таблицы.
Рис. 33.1. Создание таблицы в режиме конструктора
Рис. 33.2. Таблица «Товары»
Рис. 33.3. Таблица «Стоимость товаров»
33.2. Связь между таблицами и целостность данных
← 33.1. Создание объектов в MS ACCESS |
33.3. Создание запросов в MS ACCESS → |
Между одноименными полями двух таблиц MS ACCESS можно установить связь. Чтобы установить связь, нужно щелкнуть по пункту меню «Сервис-Схема данных», в появившемся окне выбрать связываемые таблицы и вручную, нажав и не отпуская левую кнопку мыши, протянуть связь от одного поля к другому.
Если между двумя таблицами установлена связь, данные из обеих таблиц можно объединять. Иногда этого достаточно, однако при создании реальных БД приходится заботиться о дополнительных средствах контроля связанных данных, вводимых в разные таблицы.
Механизм, который обеспечивает согласованность данных между двумя связанными таблицами, называется поддержка целостности данных. Чтобы обеспечить целостность данных, при установлении связи между двумя таблицами нужно активизировать переключатель, находящийся в окне «Связи» (это окно появляется после того, как вручную протягивается связь от одной таблицы к другой). В окне «Связи» нужно установить флажок «Обеспечение целостности данных», после этого становятся доступными флажки «Каскадное обновление». Их тоже желательно активизировать (рис. 33.4). Каскадное обновление предполагает в случае корректировки записи (поля записи) в одной из связанных таблиц автоматическую корректировку записи с таким же значением связанного поля в другой таблице. Под корректировкой записи здесь понимается обновление или удаление записи.
Целостность данных означает:
Рис. 33.4. Окно «Установление связей между таблицами»
← 33.2. Связь между таблицами и целостность данных |
33.4. Формы → |
33.3.1. Запросы на выборку
33.3.2. Запросы с параметрами
33.3.3. Запросы с вычислениями
33.3.4. Итоговые запросы
33.3.5. Перекрестные запросы
Запросы служат для отбора записей или отдельных значений полей записей из одной или нескольких таблиц на основе условий, заданных пользователем. В ACCESS можно создавать и применять пять различных типов запросов.
Рассмотрим запросы типа 13.
↑ Наверх
Запросы на выборку создаются в режиме конструктора или с помощью Мастера создания диаграмм. Это запросы с указанием полей, по которым необходимо получить информацию и условия в соответствии с ними производится отбор информации по полям. В конечном счете результатом запроса-выборки является производная таблица, которая формируется на основе фактических данных системы. При создании макета запроса в общем случае необходимо выполнить четыре базовые операции:
При создании запроса на выборку необходимо в окне БД выбрать вкладку «Запросы» и щелкнуть по команде «Конструктор» После появления окна «Создание запроса» в нем нужно добавить те таблицы, которые будут участвовать в разрабатываемом запросе, и затем выбрать те поля, которые войдут в формируемую таблицу. Необходимые условия отбора задаются в строке «Условия отбора» по наименованию того поля, на которое условие накладывается (рис. 33.5).
Рис. 33.5. Окно «Конструктор запросов». Запрос «Показать наименования товаров, цена которых больше 15 р.»
↑ Наверх
Запрос с параметром представляет собой запрос на выборку. При активизации запроса на экране отображается диалоговое окно, содержащее предложение пользователю ввести параметры поиска (рис. 33.7). Заголовок диалогового окна задается в поле «Условие» в режиме конструктора в квадратных скобках [] (рис. 33.6).
Рис. 33.6. Окно конструктора запроса с параметром «По наименованию товара, вводимого с клавиатуры, дать информацию об его артикуле»
Рис. 33.7. Диалоговое окно для ввода параметра для выполнения запроса, изображенного на рис. 33.6
↑ Наверх
Являются частным случаем запросов на выборку. В этих запросах создаются дополнительные поля, отсутствующие в исходных БД, содержащие результаты вычислений, выполненных на основе содержимого других полей БД (рис. 33.8). В таких случаях в пустой графе в заголовке поля в режиме конструктора задается выражение вида:
<Наименование нового поля>:[Наименование поля1]операция[Наименование поля2]
Рис. 33.8. Окно конструктора запроса с вычислением «Расчет налога на добавленную стоимость для товаров»
Результат выполнения запроса показан на рис. 33.9.
Рис. 33.9. Результат исполнения запроса с вычислением, изображенного на рисунке 33.8
↑ Наверх
Это также частный случай запроса на выборку. Итоговый запрос предназначен для выполнения итоговых вычислений по данным, хранящимся в экземплярах записей (нахождения сумм, максимальных, минимальных, средних значений экземпляров полей и т.д.). Для реализации итогового запроса необходимо, находясь в режиме конструктора, выполнить команду «Групповые операции» , а затем в появившейся строке конструктора «Группировка» выбрать необходимое условие нахождения итога (рис. 33.10).
Рис. 33.10. Окно конструктора итогового запроса «Расчет суммы стоимостей всех товаров»
Результат выполнения запроса показан на рис. 33.11.
Рис. 33.11. Результат исполнения группового запроса, изображенного на рисунке 33.10
↑ Наверх
Перекрестные запросы служат для обобщения информации из двух и более столбцов таблицы или запросы. Для инициирования создания перекрестного запроса используется команда «Запрос-перекрестный запрос». Если необходимо создать перекрестный запрос, обобщающий информацию из нескольких таблиц, нужно сначала создать с помощью мастера запросов простой запрос на выборку из нескольких таблиц, включив в него все необходимые поля, а затем использовать его в качестве основы для создания перекрестного запроса.
33.4. Формы
← 33.3. Создание запросов в MS ACCESS |
33.5. Отчеты → |
Обычно при создании таблицы она представляется на экране в том виде, в котором мы привыкли видеть двумерные таблицы на бумаге. Но такой способ представления таблицы имеет ряд недостатков:
Чтобы упростить просмотр, ввод и модификацию данных в конкретной таблице, можно создать для нее одну или несколько форм. Форма это документ, в окне которого отображается, как правило, одна запись таблицы, причем пользователь имеет возможность по своему усмотрению разместить поля на форме. В зависимости от природы поля можно сохранить для него обычное представление (оставить его таким, как оно представлено в таблице), исключить поле, описать его группой радиокнопок, флажком, полем ввода со списком и т.д.
Как и любой объект MS ACCESS, можно создавать форму вручную или пользоваться услугами мастера. Форма создается обычно для конкретной таблицы или конкретного запроса. Для создания формы с помощью мастера необходимо открыть вкладку «Формы» в окне БД и щелкнуть по команде «Создать форму с помощью мастера». Далее необходимо ответить на все вопросы мастера.
Пример формы, созданной с помощью мастера, показан на рис. 33.12.
Рис. 33.12. Пример ленточной автоформы, созданной с помощью мастера для таблицы «Товары» (рис. 33.2)
33.5. Отчеты
← 33.4. Формы |
33.6. Контрольные вопросы и задания → |
Отчет это особая форма представления данных, предназначенная для вывода на печать. Как правило, для формирования отчета создают запрос, в котором собирают данные из разных таблиц, с включением вычисляемых полей, с группировкой, условиями отбора (любая из этих операций необязательна). Далее, по общим правилам MS ACCESS, на базе такого запроса проектируют отчет, который позволяет:
Отчет можно создать с помощью мастера, открыв предварительно вкладку «Отчеты» в окне БД.
Пример отчета, созданного с помощью мастера, показан на рис. 33.13.
Рис. 33.13. Пример отчета, созданного с помощью мастера, для таблицы «Стоимость товаров» (рис. 33.3)
34.Введение
← 33.6. Контрольные вопросы и задания |
34.1. Различные подходы к построению систем ИИ → |
Термин «интеллект» (intelligence) происходит от лат. intellectus что означает ум, рассудок, разум; мыслительные способности человека. Соответственно искусственный интеллект (artificial intelligence) ИИ (AI) обычно толкуется как свойство автоматических систем брать на себя отдельные функции интеллекта человека, например, выбирать и принимать оптимальные решения на основе ранее полученного опыта и рационального анализа внешних воздействий.
Будем называть интеллектом способность мозга решать задачи (интеллектуальные) путем приобретения, запоминания и целенаправленного преобразования знаний в процессе обучения на опыте и адаптации к разнообразным обстоятельствам.
В этом определении под термином «знания» подразумевается не только та информация, которая поступает в мозг через органы чувств. Такого типа знания чрезвычайно важны, но недостаточны для интеллектуальной деятельности. Дело в том, что объекты окружающей нас среды обладают свойством не только воздействовать на органы чувств, но и находиться друг с другом в определенных отношениях. Ясно, что для осуществления в окружающей среде интеллектуальной деятельности (или хотя бы просто существовать), необходимо иметь в системе знаний модель этого мира. В этой информационной модели окружающей среды реальные объекты, их свойства и отношения между ними не только отображаются и запоминаются, но и, как это отмечено в данном определении интеллекта, могут мысленно «целенаправленно преобразовываться». При этом существенно то, что формирование модели внешней среды происходит «в процессе обучения на опыте и адаптации к разнообразным обстоятельствам».
Мы употребили термин интеллектуальная задача. Для того чтобы пояснить, чем отличается интеллектуальная задача от просто задачи, необходимо вспомнить термин «алгоритм» один из краеугольных терминов кибернетики.
Под алгоритмом понимают точное предписание о выполнении в определенном порядке системы операций для решения любой задачи из некоторого данного класса (множества) задач. Задачи, связанные с отысканием алгоритма решения класса задач определенного типа, будем называть интеллектуальными.
Что же касается задач, алгоритмы решения которых уже установлены, то, как отмечает известный специалист в области ИИ Марвин Минский, «излишне приписывать им такое мистическое свойства, как “интеллектуальность”». В самом деле, после того как такой алгоритм уже найден, процесс решения соответствующих задач становится таким, что его могут в точности выполнить человек, вычислительная машина (должным образом запрограммированная) или робот, не имеющие ни малейшего представления о сущность самой задачи. Требуется только, чтобы лицо, решающее задачу, было способно выполнять те элементарные операции, из которых складывается процесс, и, кроме того, чтобы оно педантично и аккуратно руководствовалось предложенным алгоритмом.
Поэтому представляется совершенно естественным исключить из класса интеллектуальных такие задачи, для которых существуют стандартные методы решения. Примерами подобных задач могут служить чисто вычислительные задачи: решение системы линейных алгебраических уравнений, численное интегрирование дифференциальных уравнений и т. д. В противоположность этому для широкого класса интеллектуальных задач, таких, как распознавание образов, игра в шахматы, доказательство теорем и т. п., напротив формальное разбиение процесса поиска решения на отдельные элементарные шаги часто оказывается весьма затруднительным, даже если само их решение несложно.
Деятельность мозга (обладающего интеллектом), направленная на решение интеллектуальных задач, мы будем называть мышлением, или интеллектуальной деятельностью. Интеллект и мышление органически связаны с решением таких задач, как доказательство теорем, логический анализ, распознавание ситуаций, планирование поведения, игры и управление в условиях неопределенности. Характерными чертами интеллекта, проявляющимися в процессе решения задач, являются способность к обучению, обобщению, накоплению опыта (знаний и навыков) и адаптации к изменяющимся условиям в процессе решения задач. Благодаря этим качествам интеллекта мозг может решать разнообразные задачи, а также легко перестраиваться с решения одной задачи на другую. Таким образом, мозг, наделенный интеллектом, является универсальным средством решения широкого круга задач (в том числе неформализованных) для которых нет стандартных, заранее известных методов решения.
34.1. Различные подходы к построению систем ИИ
← 34.Введение |
34.2. Экспертные системы → |
Существуют различные подходы к построению систем ИИ. Это разделение не является историческим, когда одно мнение постепенно сменяется другим, по-разному подходят к проблеме. Кроме того, поскольку по-настоящему полных систем ИИ в настоящее время нет, то нельзя сказать, что какой-то подход является правильным, а какой-то ошибочным.
Для начала кратко рассмотрим логический подход. Основой для него служит булева алгебра. Каждый программист знаком с нею и с логическими операторами с тех пор, когда он осваивал оператор IF. Свое дальнейшее развитие булева алгебра получила в виде исчисления предикатов, в котором она расширена за счет введения предметных символов, отношений между ними, кванторов существования и всеобщности. Практически каждая система ИИ, построенная на логическом принципе, представляет собой машину доказательства теорем. При этом исходные данные хранятся в базе данных в виде аксиом, правила логического вывода как отношения между ними. Кроме того, каждая такая машина имеет блок генерации цели, и система вывода пытается доказать данную цель как теорему. Если цель доказана, то трассировка примененных правил позволяет получить цепочку действий, необходимых для реализации поставленной цели. Мощность такой системы определяется возможностями генератора целей и машиной доказательства теорем.
Добиться большей выразительности логическому подходу позволяет такое сравнительно новое направление, как нечеткая логика. Основным ее отличием является то, что правдивость высказывания может принимать в ней кроме «да/нет» (1/0) еще и промежуточные значения «не знаю» (0.5), «пациент скорее жив, чем мертв» (0.75), «пациент скорее мертв, чем жив» (0.25). Данный подход больше похож на мышление человека, поскольку он на вопросы редко отвечает только «да» или «нет». Хотя правда на экзамене будут приниматься только ответы из разряда классической булевой алгебры.
Для большинства логических методов характерна большая трудоемкость, поскольку во время поиска доказательства возможен полный перебор вариантов. Поэтому данный подход требует эффективной реализации вычислительного процесса, и хорошая работа обычно гарантируется при сравнительно небольшом размере базы данных.
Под структурным подходом мы подразумеваем здесь попытки построения ИИ путем моделирования структуры человеческого мозга. Одной из первых таких попыток был перцептрон Розенблатта. Основной моделируемой структурной единицей в перцептронах (как и в большинстве других вариантов моделирования мозга) является нейрон.
Позднее возникли и другие модели, которые в простонародье обычно известны под термином нейронные сети (НС). Эти модели различаются по строению отдельных нейронов, по топологии связей между ними и по алгоритмам обучения. Среди наиболее известных сейчас вариантов НС можно назвать НС с обратным распространением ошибки, сети Хопфилда, стохастические нейронные сети.
НС наиболее успешно применяются в задачах распознавания образов, в том числе сильно зашумленных, однако имеются примеры успешного применения их и для построения собственно систем ИИ.
Для моделей, построенных по мотивам человеческого мозга, характерна не слишком большая выразительность, легкое распараллеливание алгоритмов и связанная с этим высокая производительность параллельно реализованных НС. Также для таких сетей характерно одно свойство, которое очень сближает их с человеческим мозгом, нейронные сети работают даже при условии неполной информации об окружающей среде, т. е. как и человек, они на вопросы могут отвечать не только «да» и «нет» но и «не знаю точно, но скорее да».
Довольно большое распространение получил и эволюционный подход. При построении систем ИИ по данному подходу основное внимание уделяется построению начальной модели и правилам, по которым она может изменяться (эволюционирвать). Причем модель может быть составлена по самым различным методам, это может быть и НС, и набор логических правил, и любая другая модель. После этого мы включаем компьютер, и он, проверив модели, отбирает самые лучшие из них, на основании которых по самым различным правилам генерируются новые модели, из которых опять выбираются самые лучшие, и т. д.
В принципе можно сказать, что эволюционных моделей как таковых не существует, есть только эволюционные алгоритмы обучения, но модели, полученные при эволюционном подходе имеют некоторые характерные особенности, что позволяет выделить их в отдельный класс.
Такими особенностями являются перенесение основной работы разработчика с построения модели на алгоритм ее модификации и то, что полученные модели практически не сопутствуют извлечению новых знаний о среде, окружающей систему ИИ, т. е. она становится как бы вещью в себе.
Еще один широко используемый подход к построению систем ИИ имитационный. Данный подход является классическим для кибернетики с одним из ее базовых понятий «черным ящиком» (ЧЯ). ЧЯ устройство, программный модуль или набор данных, информация о внутренней структуре и содержании которых отсутствуют полностью, но известны спецификации входных и выходных данных. Объект, поведение которого имитируется, как раз и представляет собой такой «черный ящик». Нам не важно, что у него и у модели внутри и как он функционирует, главное, чтобы наша модель в аналогичных ситуациях вела себя точно так же.
Основным недостатком имитационного подхода является низкая информационная способность большинства моделей, построенных с его помощью.
Заканчивая беглое ознакомление с различными методами и подходами к построению систем ИИ, хотелось бы отметить, что на практике очень четкой границы между ними нет. Очень часто встречаются смешанные системы, где часть работы выполняется по одному типу, а часть по другому.
Распознание образов раздел кибернетики, развивающий теоретические основы и методы классификации и идентификации предметов, явлений, процессов, сигналов, ситуаций и тому подобных объектов, которые характеризуются конечным набором некоторых свойств и признаков. Такие задачи решаются довольно часто, например, при переходе или проезде улицы по сигналам светофора. Распознавание цвета загоревшейся лампы светофора и знание правил дорожного движения позволяют принять правильное решение о том, можно или нельзя переходить улицу в данный момент.
В процессе биологической эволюции многие животные с помощью зрительного и слухового аппарата решили задачи распознавания образов достаточно хорошо. Создание искусственных систем распознавания образов остается сложной теоретической и технической проблемой. Необходимость в таком распознавании возникает в самых разных областях от военного дела и систем безопасности до оцифровки всевозможных аналоговых сигналов.
Примеры задач распознавания образов
Методы распознавания образов
Для оптического распознавания образов можно применить метод перебора вида объекта под различными углами, масштабами, смещениями и т. д. Для букв нужно перебирать шрифт, свойства шрифта и т. д.
Другой метод найти контур объекта и исследовать его свойства (связность, наличие углов и т. д.).
Еще один метод использовать искусственные нейронные сети. Этот метод требует либо большого количества примеров задачи распознавания (с правильными ответами), либо специальной структуры нейронной сети, учитывающей специфику данной задачи.
Автоматическое доказательство теорем доказательство теорем, реализуемое программно. В основе лежит аппарат математической логики. Используются идеи теории искусственного интеллекта. Процесс доказательства основывается на логике высказываний и логике предикатов. В настоящее время автоматическое доказательство теорем в промышленности применяется в основном при разработке и верификации интегральных схем. После того как была обнаружена ошибка деления в процессорах Пентиум, сложные модули операций с плавающей запятой современных микропроцессоров разрабатываются с особой тщательностью. В новых процессорах AMD, Intel и других фирм автоматическое доказательство теорем используется для проверки того, что деление и другие операции выполняются корректно.
Игровой искусственный интеллект (англ. Game artificial intelligence) набор программных методик, которые используются в компьютерных играх для создания иллюзии интеллекта в поведении персонажей, управляемых компьютером. Игровой ИИ, помимо методов традиционного искусственного интеллекта, включает также алгоритмы теории управления, робототехники, компьютерной графики и информатики в целом. Реализация ИИ сильно влияет на ход компьютерной игры, системные требования и бюджет игры, и разработчики балансируют между этими требованиями, стараясь сделать интересный и нетребовательный к ресурсам ИИ малой ценой. Поэтому подход к игровому ИИ серьезно отличается от подхода к традиционному ИИ широко применяются разного рода упрощения, обманы и эмуляции. Например, с одной стороны, в шутерах от первого лица безошибочное движение и мгновенное прицеливание, присущее ботам, не оставляет ни единого шанса человеку, так что эти способности искусственно снижаются. С другой боты должны делать засады, действовать командой и т. д., для этого применяются «костыли» в виде контрольных точек, расставленных на уровне.
← 34.1. Различные подходы к построению систем ИИ |
34.3. Контрольные вопросы и задания → |
Эффективность программы ИИ при решении задачи во многом зависит от знаний, которыми она обладает, а не только от формализации и схем вывода, которые она использует. В конце 70-х годов специалисты в области ИИ приняли принципиально новую концепцию программ ИИ: чтобы программу сделать интеллектуальной, ее нужно снабдить множеством высококачественных специальных знаний о некоторой предметной области. Понимание этого привело к развитию специализированных программных систем, каждая из которых является экспертом в некоторой узкой предметной области экспертных систем (ЭС). Технологию построения ЭС часто называют инженерией знаний. Как правило, этот процесс требует специализированной формы взаимодействия создателя ЭС, которого называют инженером знаний, и одного или нескольких экспертов в некоторой предметной области. Инженер знаний «извлекает» из экспертов процедуры, стратегии, эмпирические правила, которые они используют при решении задач, и встраивает эти знания в ЭС. В результате появляется программа для ЭВМ, которая решает задачи во многом так же, как эксперты-люди.
Рассмотрим основные характеристики ЭС подробно. Сердцевину ЭС составляет база знаний (БЗ), которая накапливается в процессе ее построения. Знания выражены в явном виде и организованы так, чтобы упростить принятие решений. Важность этой особенности ЭС невозможно переоценить. Тот факт, что знания основа ЭС являются явными и доступными, отличает ЭС от большинства традиционных программ.
Наиболее важной характеристикой ЭС является то, что она применяет для решения проблем высококачественный опыт. Этот опыт представляет собой уровень мышления наиболее квалифицированных экспертов в данной области, что ведет к решениям творческим, точным и эффективным. Кроме того, знания, заложенные в ЭС, могут наращиваться постепенно в соответствии с нуждами бизнеса или заказчика.
Другая важная черта ЭС наличие у них прогностических возможностей. ЭС может функционировать в качестве теоретического инструмента обработки информации или модели решения задачи в заданной предметной области, давая ожидаемые ответы в конкретной ситуации и показывая, как изменятся эти ответы в новых ситуациях. ЭС может подробно объяснить, каким образом новая ситуация привела к изменениям.
Кроме того, важным свойством ЭС является то, что их можно использовать для обучения и тренировки работников. ЭС, как правило, разрабатываются с расчетом на подробный процесс обучения, так как они уже содержат необходимые знания и способны объяснить процесс своего рассуждения. Обычно разрабатывается интерфейс между обучаемым и ЭС: ЭС не только ищет ответ на поставленный вопрос, но и при необходимости может дать подробную пошаговую справку о том, как она искала решение.
Как было отмечено выше, основой ЭС является совокупность знаний, структурированных в целях упрощения процесса принятия решений ЭС. Для специалистов в области ИИ термин «знания» означает информацию, которая необходима программе, чтобы она вела себя «интеллектуально». Эта информация принимает обычно форму фактов или правил. Под фактом понимается утверждение, всегда являющееся истинным. Например:
Под правилом понимается утверждение, принимающее истинное или ложное значение в зависимости от некоторых условий. Например:
Факты и правила, заложенные в ЭС, не всегда либо истинны, либо ложны. Иногда существует некоторая степень неуверенности в достоверности факта или точности правила. Если это сомнение выражено явно в численной форме, то оно носит название коэффициента уверенности.
Многие правила в ЭС являются эвристиками, т.е. эмпирическими правилами, которые эффективно ограничивают поиск решения. ЭС использует эвристики потому, что задачи, которые она решает (например, поиск новых месторождений в геологии или согласование исков в юриспруденции), как правило, трудны и не до конца понятны. Эти задачи не имеют строгого математического или алгоритмического решения. Алгоритмический метод гарантирует корректное или оптимальное решение задачи, в то время, как эвристический метод дает приемлемое решение в большинстве случаев. Использование эвристических правил делает поиск решения намного более легким и более практичным.
В ЭС знания организованы таким образом, чтобы можно было знания о предметной области отделить от других типов знаний системы, таких, как решать задачи или взаимодействовать с пользователем (например, редактировать или печатать текст в соответствии с командами пользователя). Выделенные знания о предметной области называются базой знаний (БЗ), тогда как общие знания о нахождении решений задач называются механизмом вывода. Программа, которая работает со знаниями, организованными подобным образом, называется системой, основанной на знаниях. Все ЭС являются системами, основанными на знаниях (но не наоборот например, программу ИИ для игры в «крестики-нолики» нельзя считать ЭС, даже, если в ней знания о предметной области отделены от остальной программы).
База знаний ЭС содержит факты (данные) и правила (или другие представления знаний), использующие эти факты как основу для принятия решений. Механизм вывода содержит интерпретатор, определяющий, каким образом применять правила для вывода новых знаний, и диспетчер, устанавливающий порядок применения этих правил. Структура ЭС показана на рис. 34.1.
Рис. 34.1. Структура ЭС
Концепция механизма вывода зависит от специфики предметной области и от того, как знания структурированы и организованы в ЭС. Многие языки высокого уровня, предназначенные для построения ЭС, имеют свой механизм вывода. Например, механизм вывода, заложенный в языке PROLOG носит название «поиск в глубину с возвратом». Этот механизм уже реализован в самом программном обеспечении среды языка PROLOG: это означает, что разработчик ЭС, реализуемой на PROLOGе, не должен писать специальные программы поиска решения. Ему достаточно правильно сформулировать правила вывода на PROLOGе, а затем корректно задать цели для поиска решения. PROLOG сам, используя БЗ о предметной области, найдет решение и продемонстрирует его пользователю.
Рассмотрим, каким образом знания структурированы в ЭС, т. е. способы представления знаний. В современных ЭС чаще всего используют три способа представления знаний: правила (наиболее популярный), семантические сети и фреймы.
Представление знаний, основанное на правилах, построено на использовании выражений вида ЕСЛИ(условие) ТО (действие). Например:
«ЕСЛИ пациент был по профессии изолировщиком,
ТО пациент работал с асбестом».
«ЕСЛИ пациент работал с асбестом И пациент находился при этом в закрытом помещении,
ТО пациент получил большую дозу асбестовой пыли».
Когда текущая ситуация (факты) в задаче удовлетворяет части правила ЕСЛИ или согласуется с нею, то выполняется действие, определяемое частью ТО. Это действие может оказаться воздействием на окружающую среду (например, вызовет распечатку текста), может повлиять на управление программой (например, вызвать проверку и запуск некоторого набора правил) или может сводиться к указанию системе о получении определенного заключения (например, необходимо добавить новый факт или гипотезу в БЗ).
Сопоставление частей ЕСЛИ правил с фактами может породить так называемую цепочку выводов. На рис. 34.2 изображена цепочка выводов, образованная последовательным применением правил из вышеприведенного примера. Эта цепочка показывает, как система использует правила для вывода о том, насколько серьезную дозу канцерогенного вещества получил пациент при работе с асбестом.
Рис. 34.2. Цепочка выводов для получения заключения о накопленной пациентом дозе асбестовой пыли
Правила обеспечивают естественный способ описания процессов, управляемых сложной и быстро изменяющейся внешней средой. Через правила можно определить, как программа должна реагировать на изменение данных; при этом не нужно заранее знать алгоритм управления обработкой данных. Кроме того, использование правил упрощает объяснение того, что и как сделала программа, т.е. каким образом она пришла к конкретному заключению.
В ЭС, основанных на правилах, предметные знания представляются набором правил, которые проверяются на группе фактов или знаний о текущей ситуации. Когда часть правила ЕСЛИ удовлетворяет фактам действие, указанное в части ТО, выполняется. Когда это происходит, говорят, что правило выполнено. Интерпретатор правил сопоставляет части правила ЕСЛИ с фактами и выполняет правило, часть ЕСЛИ которого согласуется с фактами.
Действия правила могут состоять в модификации набора фактов в БЗ, например, в добавлении нового факта. Новые факты, добавленные к БЗ, сами могут быть использованы для сопоставления с частями правил ЕСЛИ. Действие, предпринимаемое при выполнении правила, может непосредственно взаимодействовать с внешней средой. В примере о накоплении пациентом асбестовой пыли к фактам можно отнести следующие утверждения:
Набор известных фактов в ЭС называется базой данных.
Процесс сопоставления с фактами частей ЕСЛИ правил может порождать то, что называется цепочкой выводов. Цепочка выводов, полученная в результате выполнения правил из приведенного примера о накоплении асбестовой пыли, как раз и представлена на рис. 34.2. Эта цепочка выводов показывает, как система, используя правила, выводит заключение о полученной дозе пыли. Если предъявить пользователю цепочки выводов, то он сможет понять, как система достигает своих заключений. Этот механизм реализован во всех ЭС.
В ИИ, в частности в теории построения ЭС, фреймы и семантические сети, как правило, рассматриваются как методы представления знаний, основанные на фреймах. Представление знаний, основанное на фреймах, использует сеть узлов, связанных отношениями и организованных иерархически. Фрейм это сеть узлов и отношений, организованных иерархически, где верхние узлы представляют общие понятия, а нижние узлы более частные случаи этих понятий. Каждый узел представляет собой блок, относящийся к определенному понятию, в состав этого блока входят набор атрибутов, относящихся к этому понятию, и значения атрибутов, связанных с этим понятием. Узлы, которые занимают более низкое положение в иерархии, автоматически наследуют свойства узлов, занимающих более высокое положение. Атрибуты называются слотами. Каждый слот может быть связан с процедурами (произвольными машинными программами), которые выполняются, когда информация в слотах (значения атрибутов) меняются. С каждым слотом может быть связано любое число процедур. В табл. 34.1 перечислены три типа процедур, чаще всего связываемых со слотами:
Таблица 34.1 Типы процедур, связываемых со слотами
№ п/п |
Название процедуры |
Условия исполнения процедуры |
1 |
«ЕСЛИ добавлено» |
Выполняется, когда новая информация помещается в слот |
2 |
«ЕСЛИ удалено» |
Выполняется, когда информация удаляется из слота |
3 |
«ЕСЛИ нужно» |
Выполняется, когда запрашивается информация из слота, а он пустой |
Эти процедуры могут следить за приписыванием информации к данному узлу и проверять, что при изменении значения производятся соответствующие действия. Как ясно из структуры фреймов, системы, основанные на фреймах, хороши в тех предметных областях, где ожидания относительно формы и содержания данных играют важную роль, например, интерпретация визуальной информации или понимание речи.
Проиллюстрируем, как работает система, основанная на фреймах. На рис. 34.3 представлена иерархия отчета со всеми слотами, значениями и процедурами.
Рис. 34.3. Представление отчета с помощью фреймов
35.Введение
← 34.3. Контрольные вопросы и задания |
35.1. Локальные и глобальные сети → |
Для понимания того, как работает компьютерная сеть, важно иметь представление об основных компонентах сети. Далее словом «сеть» мы будем обозначать именно компьютерную сеть.
Сеть представляет собой несколько компьютеров (таких как персональные компьютеры и серверы) и сетевых устройств (таких как коммутаторы, маршрутизаторы), соединенных и взаимодействующих друг с другом.
Компьютер, входящий в сеть, называется хост (от англ. host).
Размер сети зависит от ее расположения это может быть большое предприятие, небольшой офис, дом или мобильная сеть.
Сеть может представлять собой ряд географически удаленных друг от друга офисов или подразделений.
Приведем несколько определений по теме.
Группы сотрудников, работающих над одним проектом в рамках локальной сети, называются рабочими группами.
Совокупность приемов разделения и ограничения прав участников компьютерной сети называется политикой сети.
Управление сетевыми политиками (их может быть несколько в одной сети) называется администрированием сети.
Лицо, управляющее организацией работы участников локальной компьютерной сети, называется системным администратором.
← 35.Введение |
35.2. Серверы и рабочие станции → |
35.1.1. История развития компьютерных сетей
35.1.2. Назначение компьютерных сетей
↑ Наверх
Первым шагом на пути создания локальных вычислительных сетей стали многотерминальные системы, работающие в режиме разделения времени.
Необходимо было решить задачу доступа к компьютеру с терминалов, удаленных от него на многие сотни, а то и тысячи километров. Терминалы соединялись с компьютерами через телефонные сети с помощью модемов. Такие сети позволяли многочисленным пользователям получать удаленный доступ к разделяемым ресурсам нескольких мощных компьютеров класса супер-ЭВМ. Затем появились системы, в которых наряду с удаленными соединениями типа терминалкомпьютер были реализованы и удаленные связи типа компьютеркомпьютер. Компьютеры получили возможность обмениваться данными в автоматическом режиме, что, собственно, и является базовым механизмом любой вычислительной сети. В первых сетях были реализованы службы обмена файлами, синхронизации баз данных, электронная почта и др. Таким образом, хронологически первыми появились глобальные вычислительные сети.
WAN (Wide Area Network) глобальные сети имеют, как правило, увеличенные географические размеры. Они могут объединять как отдельные компьютеры, так и отдельные локальные сети, в том числе и использующие различные протоколы/
В начале 1970-х годов произошел технологический прорыв в области производства компьютерных компонентов появились большие интегральные схемы. Их сравнительно невысокая стоимость и высокие функциональные возможности привели к созданию мини-ЭВМ. Даже небольшие подразделения предприятий получили возможность покупать для себя компьютеры, появилась концепция распределения компьютерных ресурсов по всему предприятию. Вначале они работали автономно. Но с течением времени предприятия и организации стали соединять свои мини-компьютеры вместе и разрабатывать программное обеспечение, необходимое для их взаимодействия. В результате появились первые локальные вычислительные сети.
LAN (Local Area Network) локальные сети, отличаются компактностью. Они могут объединять компьютеры одного помещения, этажа, здания.
В середине 1980-х годов утвердились стандартные технологии объединения компьютеров в сеть. Мощным стимулом для их развития послужили первые персональные компьютеры. Для создания сети достаточно было приобрести сетевые адаптеры соответствующего стандарта (например, Ethernet), стандартный кабель, присоединить адаптеры к кабелю стандартными разъемами и установить на компьютер одну из популярных сетевых операционных систем.
Уже первые компьютерные сети обеспечивали скорость передачи данных до 10 Мбит/с.
Сетевая технология это согласованный набор стандартных протоколов и реализующих их программно-аппаратных средств (например, сетевых адаптеров, драйверов, кабелей и разъемов), достаточный для построения вычислительной сети.
Разрыв между понятиями локальных и глобальных сетей постоянно сокращается во многом из-за появления высокоскоростных территориальных каналов связи, не уступающих по качеству кабельным системам локальных сетей. В глобальных сетях появляются службы доступа к ресурсам, такие же удобные и прозрачные, как и службы локальных сетей (пример тому сеть Internet).
В настоящем времени мы наблюдаем слияние технологий не только локальных и глобальных сетей, но и технологий любых информационных сетей: вычислительных, телефонных, телевизионных. Передача мультимедийной информации создает большой объем трафика в сети.
Трафик величина потока информации (объем последней измеряется в битах или байтах и единицах, им кратных), прошедшего за определенный промежуток времени через выделенный канал связи, шлюз или другую систему.
↑ Наверх
Основное назначение вычислительных сетей определяется двумя функциями:
← 35.1. Локальные и глобальные сети |
35.3. Ресурсы сети → |
← 35.2. Серверы и рабочие станции |
35.4. Контрольные вопросы и задания → |
35.3.1. Сетевые ресурсы
35.3.2. Основные сетевые приложения
35.3.3. Влияние сетевых приложений на работу сети
35.3.4. Характеристики сети
↑ Наверх
Сети предоставляют доступ к сетевым ресурсам. В качестве сетевых ресурсов можно перечислить следующие:
Использование сетевых ресурсов предполагает установление политики доступа к ресурсам: должен соблюдаться баланс между удобством доступа к необходимой информации и безопасности.
↑ Наверх
Определим основные сетевые приложения:
↑ Наверх
Приложения могут влиять на работу сети, в свою очередь состояние сети может влиять на работу приложений. При этом исторически главным образом обращают внимание на такой параметр, как bandwidth (BW) полоса пропускания:
Первая группа приложений приложения для передачи файлов (FT file transfer). Эти приложения работают в так называемом пакетном режиме (batch).Первоначально процесс перекачки файла запускает пользователь, затем такие приложения работают до завершения процесса уже без участия пользователя. Для таких приложений время до завершения процесса важно, но не критично.
Вторая группа приложений обмен данными с базой данных или обмен сообщениями между пользователями. Здесь скорость обмена данными уже более важна.
Третья группа приложений обмен данными в режиме реального времени. Это такие приложения как Интернет-телефония (VoIP), видеоконференции. Для этих приложений параметр пропускной способности становится критическим. Недопустимы задержки по времени. Таким приложениям должен быть обеспечен максимальный приоритет. Но широта пропускания сети не бесконечна, поэтому одновременная работа таких приложений в сети может привести к тому, что сеть станет работать настолько медленно, что работа приложений станет практически невозможной.
↑ Наверх
К основным характеристикам сети относятся:
36.1. Основы построения сетей
← 35.4. Контрольные вопросы и задания |
36.2. Сетевые устройства → |
Навигация по разделу:
36.1.1. Механизм взаимодействия компьютеров в сети
36.1.2. Физическая передача данных по линии связи
36.1.3. Топология сетей
36.1.1. Механизм взаимодействия компьютеров в сети
↑ Наверх
Механизм взаимодействия компьютеров в сети многое позаимствовал у схемы взаимодействия компьютера с периферийными устройствами. Для обмена данными между компьютером и периферийными устройствами в компьютере предусмотрен внешний интерфейс, т. е. набор проводов, соединяющих компьютер и периферийные устройства, а также набор правил обмена информацией по эти проводам (протокол).
Интерфейс реализуется со стороны компьютера совокупностью аппаратных и программных средств: контроллером периферийного устройства и специальной программой, управляющей этим контроллером, которую часто называют драйвером. Со стороны периферийного устройства интерфейс чаще всего реализуется аппаратным устройством управления. Контроллеры принимают команды и данные от процессора в свой внутренний буфер (порт), затем выполняют необходимые преобразования этих данных и команд в соответствии с форматами, понятными периферийному устройству, и выдают их через внешний порт в интерфейс.
В самом простом случае взаимодействие двух компьютеров может быть реализовано с помощью тех же самых средств, которые используются для взаимодействия компьютера с периферией, например, через последовательный COM интерфейс.
В локальных сетях функции передачи данных в линию связи выполняются сетевыми адаптерами и их драйверами. А функции программ, обеспечивающих доступ к удаленным ресурсам, выполняет операционная система.
36.1.2. Физическая передача данных по линии связи
↑ Наверх
Главные отличия внешних линий связи от линий связи внутри компьютера:
Для повышения надежности передачи данных между компьютерами используется стандартный прием подсчет контрольной суммы до начала передачи данных и после.
Задачи надежного обмена данными в локальных сетях решают сетевые адаптеры или модемы. Эти устройства кодируют и декодируют каждый информационный бит, синхронизируют передачу электромагнитных сигналов по линиям связи, проверяют правильность передачи по контрольной сумме и выполняют некоторые другие операции.
Сетевые адаптеры предназначены для непосредственного подсоединения компьютеров к сети.
Модемы, как правило, рассчитаны на работу с телефонной линией связи.
В зависимости от среды передачи данных каналы связи разделяются на следующие:
36.1.3. Топология сетей
↑ Наверх
Сетевая топология (от греч. τοπος место) описание конфигурации сети, схема расположения и соединения сетевых устройств.
Под топологией вычислительной сети понимается конфигурация графа, вершинам которого соответствуют компьютеры сети, а ребрам физические связи между ними. Компьютеры, подключенные к сети, часто называют станциями, или узлами, сети.
Можно рассматривать физическую и логическую топологию компьютерной сети.
Физическую топологию образуют все сетевые устройства, соединенные проводами. Под логической топологией понимается путь прохождения сигнала от одной точки сети к другой.
Физическая и логическая топологии могут совпадать. Например, в топологии типа шина данные передаются по всей длине кабеля.
Физическая и логическая топологии могут и не совпадать. Например, при физической топологии типа звезда, когда точки сети присоединены с помощью устройства, находящегося в центре, логическая топология может представлять собой кольцо когда данные передаются последовательно от одного компьютера другому.
Простейшее устройство для соединения между собой двух локальных сетей, использующих одинаковые протоколы, называется мостом.
Мост может быть аппаратным (специализированный компьютер) или программным.
Существует множество способов соединения сетевых устройств, из них можно выделить базовые. Остальные способы это комбинации базовых, в общем случае такие топологии называются смешанными, или гибридными.
Основные (базовые) топологии приведены на рис. 36.1.
Рис. 36.1. Основные топологии: а линия; б каждый с каждым; в звезда; г кольцо; д шина; е дерево
Шина (bus)
Топология типа шина (рис. 36.2), представляет собой общий кабель (называемый шина или магистраль), к которому подсоединены все рабочие станции. На концах кабеля находятся терминаторы, для предотвращения отражения сигнала. Такой тип топологии использовался при коаксиальном кабеле.
Рис. 36.2. Основные топологии. Шина
Кольцо (ring)
Кольцо (рис. 36.3) базовая топология компьютерной сети, в которой рабочие станции подключены последовательно друг к другу, образуя замкнутую сеть.
Рис. 36.3. Основные топологии. Кольцо
Звезда (топология компьютерной сети)
Звезда (рис. 36.4) базовая топология компьютерной сети, в которой все компьютеры сети присоединены к центральному узлу (обычно сетевой концентратор), образуя физический сегмент сети. Подобный сегмент сети может функционировать как отдельно, так и в составе сложной сетевой топологии (как правило «дерево»).
Рис. 36.4. Основные топологии. Звезда.
Эта топология основная в наше время, поэтому рассмотрим ее более подробно.
Рабочая станция, которой нужно послать данные, отсылает их на коммутатор (switch, свич), коммутатор определяет адресат и отдает ему информацию. Коммутатор, в отличие от концентратора (hub), подает пакет лишь на определенный порт получателю. Одновременно может быть передано несколько пакетов. Сколькоименно зависит от коммутатора.
Преимущества:
Недостатки:
36.2. Сетевые устройства
← 36.1. Основы построения сетей |
36.3. Сетевые протоколы → |
Навигация по разделу:
36.2.1. Пассивное сетевое оборудование
36.2.2. Активное сетевое оборудование
Можно выделить четыре основных составляющих сети:
Для связи между собой нескольких локальных сетей, работающих по разным протоколам, служат специальные средства, называемые шлюзами.
Шлюзы могут быть как аппаратными, так и программными: или специальный компьютер, или специальная компьютерная программа.
Все сетевое оборудование можно разделить на пассивное и активное.
36.2.1. Пассивное сетевое оборудование
↑ Наверх
Пассивным сетевым оборудованием называют сетевое оборудование, не имеющее внутренней программной начинки. К нему относятся различные кабели, разъемы, розетки и т. д.
Наиболее простым и распространенным способом создания локальной сети является использование витой пары (рис. 36.5). Английская аббревиатура: UTP (unshielded twisted pair) неэкранированная витая пара.
Состоит из четырех витых пар проводов, каждый обозначен своим цветом.
Рис. 36.5. Витая пара
Провода вставляются в коннектор RJ-45 (рис. 36.6) с соблюдением определенного порядка цветов и специальным образом обжимаются с помощью специального обжимного инструмента (рис. 36.7).
Рис. 36.6. RJ-45
Рис. 36.7. Обжимной инструмент
Преимуществами такого соединения являются:
Максимальная длина кабеля может изменяться, но, как правило, не превосходит 100 м. Сплошной участок кабеля представляет собой сегмент сети. Он может иметь только определенную длину, после чего предаваемый сигнал затухает. Если требуется соединить узлы сети, находящиеся на большем расстоянии, то необходимо использовать концентратор (hub, хаб), который обеспечивает связь сегментов, позволяет увеличить расстояние, повторяет или усиливает сигнал. В настоящее время стандартом стало использование коммутаторов (switch) вместо хабов. Коммутаторы работают на больших скоростях, обеспечивают быстрое внутреннее переключение, позволяют избежать коллизии.
36.2.2. Активное сетевое оборудование
↑ Наверх
Коммутатор (switch)
Рассмотрение активного оборудования начнем с коммутатора (свича), так как в настоящее время он самое доступное из активных сетевых устройств.
Сетевой коммутатор, или свич (жарг. от англ. switch переключатель), устройство, предназначенное для соединения нескольких узлов компьютерной сети в пределах одного сегмента. В отличие от концентратора, который распространяет трафик от одного подключенного устройства ко всем остальным, коммутатор передает данные непосредственно получателю. Это повышает производительность и безопасность сети, избавляя остальные сегменты сети от необходимости обрабатывать данные, которые им не предназначались.
Коммутатор может только объединять узлы одной локальной сети по их MAC-адресам.
MAC-адрес (от англ. Media Access Control управление доступом к носителю) это уникальный идентификатор, сопоставляемый с различными типами оборудования для компьютерных сетей.
Пример MAC-адреса приведен на рис. 36.8.
Рис. 36.8. Пример MAC-адреса.
Коммутатор хранит в памяти таблицу, в которой указывается соответствие MAC-адреса узла порту коммутатора. При включении коммутатора эта таблица пуста, и он работает в режиме обучения. В этом режиме поступающие на какой-либо порт данные передаются на все остальные порты коммутатора. При этом коммутатор анализирует поступающие сигналы и, определив MAC-адреc хоста-отправителя, заносит его в таблицу. Впоследствии, если на один из портов коммутатора поступит сигнал (кадр, frame), предназначенный для хоста, MAC-адрес которого уже есть в таблице, то этот сигнал будет передан только через порт, указанный в таблице. Если MAC-адрес хоста-получателя еще не известен, то сигнал будет продублирован на все интерфейсы. Со временем коммутатор строит полную таблицу для всех своих портов и в результате трафик локализуется.
Три способа коммутации
Каждый из них это комбинация таких параметров, как время ожидания и надежность передачи.
Коммутаторы подразделяются на управляемые и неуправляемые (наиболее простые). Управление коммутатором может осуществляться посредством протокола веб-интерфейса. Многие управляемые коммутаторы могут выполнять дополнительные функции. Сложные коммутаторы можно объединять в одно логическое устройство стек.
Маршрутизатор (router)
Маршрутизатор, или роутер (router), сетевое устройство, принимающее решения о пересылке пакетов между различными сегментами сети на основании информации о топологии сети и определенных правил.
Работает на более высоком уровне, нежели коммутатор и сетевой мост. Обычно маршрутизатор использует адрес получателя, указанный в пакетах данных, и определяет по таблице маршрутизации путь, по которому следует передать данные. Если в таблице маршрутизации для адреса нет описанного маршрута, пакет отбрасывается.
Существуют и другие способы определения маршрута пересылки пакетов, когда, например, используется адрес отправителя, используемые протоколы верхних уровней и другая информация, содержащаяся в заголовках пакетов сетевого уровня. Нередко маршрутизаторы могут осуществлять трансляцию адресов отправителя и получателя, фильтрацию транзитного потока данных на основе определенных правил с целью ограничения доступа, шифрование/дешифрование передаваемых данных и т.д.
Таблица маршрутизации содержит информацию, на основе которой маршрутизатор принимает решение о дальнейшей пересылке пакетов. Таблица состоит из некоторого числа записей маршрутов, в каждой из которых содержится адрес сети получателя, адрес следующего узла, которому следует передавать пакеты и некоторый вес записи метрика. Метрики записей в таблице играют роль в вычислении кратчайших маршрутов к различным получателям. В зависимости от модели маршрутизатора и используемых протоколов маршрутизации, в таблице может содержаться некоторая дополнительная служебная информация. Например:
192.168.64.0/16 [110/49] via 192.168.1.2, 00:34:34, FastEthernet0/0.1,
где 192.168.64.0/16 сеть назначения;
110/ административное расстояние;
/49 метрика маршрута;
192.168.1.2 адрес следующего маршрутизатора, которому следует передавать пакеты для сети 192.168.64.0/16;
00:34:34 время, в течение которого был известен этот маршрут;
FastEthernet0/0.1 интерфейс маршрутизатора, через который можно достичь «соседа» 192.168.1.2.
Таблица маршрутизации может составляться двумя способами:
статическая маршрутизация записи в таблице вводятся и изменяются вручную. Такой способ требует вмешательства администратора каждый раз, когда происходят изменения в топологии сети. С другой стороны, он является наиболее стабильным и требующим минимума аппаратных ресурсов маршрутизатора для обслуживания таблицы;
динамическая маршрутизация записи в таблице обновляются автоматически при помощи одного или нескольких протоколов маршрутизации.
Кроме того, маршрутизатор строит таблицу оптимальных путей к сетям назначения на основе различных критериев количества промежуточных узлов, пропускной способности каналов, задержки передачи данных и т. п. Такой способ построения таблицы позволяет автоматически держать таблицу маршрутизации в актуальном состоянии и вычислять оптимальные маршруты на основе текущей топологии сети. Однако динамическая маршрутизация оказывает дополнительную нагрузку на устройства, а из-за высокой нестабильности сети могут возникать ситуации, когда маршрутизаторы не успевают синхронизировать свои таблицы, что приводит к противоречивым сведениям о топологии сети в различных ее частях и потере передаваемых данных.
36.3. Сетевые протоколы
← 36.2. Сетевые устройства |
36.4. Беспроводные сети → |
Навигация по разделу:
36.3.1. Модель OSI (взаимодействие открытых систем)
36.3.2. Семейство TCP/IP
36.3.3. Ethernet
36.3.1. Модель OSI (взаимодействие открытых систем)
↑ Наверх
Сетевая модель OSI (базовая эталонная модель взаимодействия открытых систем англ. Open Systems Interconnection basic reference model) абстрактная модель для сетевых коммуникаций и разработки сетевых протоколов. Представляет уровневый подход к сети. Каждый уровень обслуживает свою часть процесса взаимодействия. Благодаря такой структуре совместная работа сетевого оборудования и программного обеспечения становится гораздо проще и прозрачнее.
В 1982 году Международная организация по стандартизации (ISO) начала новый проект в области сетевых технологий, названный взаимодействием открытых систем, Open Systems Interconnection, или OSI.
До OSI сетевые технологии основывались на корпоративных. OSI стала новой попыткой создания сетевых стандартов для обеспечения совместимости решений разных поставщиков. В то время многие большие сети были вынуждены поддерживать несколько протоколов взаимодействия и включали большое количество устройств, не имеющих возможности общаться с другими устройствами из-за отсутствия общих протоколов.
Модель OSI состоит из семи уровней, расположенных вертикально друг над другом (рис. 36.9).
Каждый уровень может взаимодействовать только со своими соседями и выполнять отведенные только ему функции.
Рис. 36.9. Модель OSI
Для обеспечения необходимой совместимости на каждом из семи возможных уровней архитектуры компьютерной сети действуют специальные стандарты, называемые протоколами.
Они определяют характер аппаратного взаимодействия компонентов сети (аппаратные протоколы) и характер взаимодействия программ и данных (программные протоколы).
Функции поддержки протоколов исполняют аппаратные устройства (интерфейсы) и программные средства (программы поддержки протоколов).
Программы, выполняющие поддержку протоколов, также называют протоколами.
Таблица 36.1. Протоколы модели OSI
Уровень OSI |
Протоколы |
Прикладной |
HTTP, Telnet, DNS, DHCP, SMTP, SNMP, FTP, NNTP, LDAP, IMAP, POP3 |
Представления |
SNMP, Telnet |
Сеансовый |
Named Pipes, NetBIOS, Printer Access Protocol |
Транспортный |
TCP, UDP, SOCKS, NetBEUI |
Сетевой |
IP, IPv6, NetBEUI, IPSec |
Канальный |
Ethernet, PPP, ARP |
Физический |
xDSL, Ethernet (10BASE-T, 10BASE2, 10BASE5), Fast Ethernet (100BASE-T, 100BASE-TX, 100BASE-T4, 100BASE-FX), Gigabit Ethernet (1000BASE-T, 1000BASE-TX) |
Прикладной уровень (Application layer)
Верхний (7-й) уровень модели, обеспечивает взаимодействие сети и пользователя. Уровень разрешает приложениям пользователя иметь доступ к сетевым службам, таким как обработчик запросов к базам данных, доступ к файлам, пересылке электронной почты.
Также отвечает за передачу служебной информации, предоставляет приложениям информацию об ошибках и формирует запросы к уровню представления.
Уровень представления (Presentation layer)
Этот уровень (6-й) отвечает за преобразование протоколов и кодирование/ декодирование данных.
Запросы приложений, полученные с уровня приложений, он преобразует в формат для передачи по сети, а полученные из сети данные преобразует в формат, понятный приложениям.
На этом уровне может осуществляться сжатие/распаковка или кодирование/ декодирование данных, а также перенаправление запросов другому сетевому ресурсу, если они не могут быть обработаны локально.
Сеансовый уровень (Session layer)
5-й уровень модели отвечает за поддержание сеанса связи, позволяя приложениям взаимодействовать длительное время.
Уровень управляет созданием/завершением сеанса, обменом информацией, синхронизацией задач, определением права на передачу данных и поддержанием сеанса в периоды неактивности приложений.
Синхронизация передачи обеспечивается помещением в поток данных контрольных точек, начиная с которых возобновляется процесс при нарушении взаимодействия.
Транспортный уровень (Transport layer)
4-й уровень модели предназначен для доставки данных без ошибок, потерь и дублирования в той последовательности, как они были переданы. При этом неважно, какие данные передаются, откуда и куда, т. е. он предоставляет сам механизм передачи. Блоки данных он разделяет на фрагменты, размер которых зависит от протокола, короткие объединяет в один, а длинные разбивает. Протоколы этого уровня предназначены для взаимодействия типа точка-точка. Пример: TCP, UDP.
Мультиплексирование (multiplexing) данных означает, что транспортный уровень способен одновременно обрабатывать несколько потоков данных (потоки могут поступать и от различных приложений) между двумя системами. Механизм управления потоком данных это механизм, позволяющий регулировать количество данных, передаваемых от одной системы к другой. Протоколы транспортного уровня часто имеют функцию контроля доставки данных, заставляя принимающую данные систему отправлять подтверждения передающей стороне о приеме данных.
Сетевой уровень (Network layer)
3-й уровень сетевой модели OSI предназначен для определения пути передачи данных. Отвечает за трансляцию логических адресов и имен в физические, определение кратчайших маршрутов, коммутацию и маршрутизацию, отслеживание неполадок и заторов в сети.
На этом уровне работает такое сетевое устройство, как маршрутизатор. Протоколы сетевого уровня маршрутизируют данные от источника к получателю и могут быть разделены на два класса: протоколы с установкой соединения и протоколы без установки соединения.
Описать работу протоколов с установкой соединения можно на примере работы обычного телефона. Протоколы этого класса начинают передачу данных с вызова или установки маршрута следования пакетов от источника к получателю. После чего начинают последовательную передачу данных и затем по окончании передачи разрывают связь.
Протоколы без установки соединения не гарантируют поступление информации получателю в том порядке, в котором она была отправлена. За установку данных в соответствующем порядке при использовании сетевых протоколов без установки соединения отвечают транспортные протоколы.
Канальный уровень (Data Link layer)
Этот уровень (2-й) предназначен для обеспечения взаимодействия сетей на физическом уровне и контроля за ошибками, которые могут возникнуть.
Полученные с физического уровня данные он упаковывает во фреймы (кадры), проверяет на целостность, если нужно, исправляет ошибки (посылает повторный запрос поврежденного кадра) и отправляет на сетевой уровень.
Канальный уровень может взаимодействовать с одним или несколькими физическими уровнями, контролируя и управляя этим взаимодействием. Спецификация IEEE 802 разделяет этот уровень на два подуровня: MAC (Media Access Control) регулирует доступ к разделяемой физической среде, LLC (Logical Link Control) обеспечивает обслуживание сетевого уровня. На этом уровне работают коммутаторы, мосты.
В программировании этот уровень представляет драйвер сетевой платы, в операционных системах имеется программный интерфейс взаимодействия канального и сетевого уровней, это не новый уровень, а просто реализация модели для конкретной операционной системы.
Физический уровень (Physical layer)
Самый нижний уровень модели (1-й) предназначен непосредственно для передачи потока данных. Осуществляет передачу электрических или оптических сигналов в кабель или в радиоэфир и соответственно их прием и преобразование в биты данных в соответствии с методами кодирования цифровых сигналов.
Другими словами, осуществляет интерфейс между сетевым носителем и сетевым устройством. На этом уровне работают концентраторы (хабы), повторители (ретрансляторы) сигнала и медиаконверторы. Функции физического уровня реализуются на всех устройствах, подключенных к сети.
Со стороны компьютера функции физического уровня выполняются сетевым адаптером или последовательным портом. К физическому уровню относятся физические, электрические и механические интерфейсы между двумя системами.
Свойства среды сети передачи данных также определяются на физическом уровне:
Эталонная модель OSI была большим шагом при создании концепций современных сетей. Она популяризовала идею общей модели протоколов, расположенных на различных уровнях и определяющих взаимодействие сетевых устройств и программного обеспечения.
Тем не менее реальный стек протоколов OSI, разработанный как часть проекта, был воспринят многими как слишком сложный и фактически нереализуемый. Он предполагал упразднение всех существующих протоколов и их замену новыми на всех уровнях стека. Это сильно затруднило реализацию стека и послужило причиной для отказа от него многих поставщиков и пользователей, сделавших значительные инвестиции в другие сетевые технологии.
В настоящее время основным используемым семейством протоколов является TCP/IP.
Таблица 36.2. Вид передаваемой информации в модели OSI
Передача |
Уровень |
Данные |
Прикладной (доступ к сетевым службам) |
Данные |
Представления (представление и кодирование данных) |
Данные |
Сеансовый (управление сеансом связи) |
Блоки |
Транспортный (безопасное и надежное соединение точка-точка) |
Пакеты |
Сетевой (определение пути и IP логическая адресация) |
Кадры |
Канальный (MAC физическая адресация) |
Биты |
Физический (кабель, сигналы, бинарная передача) |
36.3.2. Семейство TCP/IP
↑ Наверх
Семейство TCP/IP имеет два транспортных протокола: TCP, полностью соответствующий OSI, обеспечивающий проверку получения данных, и UDP, отвечающий транспортному уровню только наличием порта, обеспечивающий обмен датаграммами между приложениями, не гарантирующий получения данных.
Сравним TCP/IP и OSI.
Таблица 36.3. Соотношение уровней TCP/IP и OSI
Уровни TCP/IP |
|
Уровни OSI |
Приложений |
Приложений |
|
Презентаций (представлений) |
||
Сессий (сеансовый) |
||
Транспортный |
Транспортный |
|
Интернет |
Сетевой |
|
Канальный |
Канальный |
|
Физический |
Физический |
36.3.3. Ethernet
↑ Наверх
Протокол Ethernet был установлен в 1970 году тремя фирмами: DEC, Intel, Xerox и назывался DIX Ethernet. В середине 1980-x стандарт получил название Ethernet 800.3 и 800.2.
Эти стандарты устанавливают стандарты для физического и канального уровней модели OSI.
Перед посылкой данных устройство Ethernet прослушивает сеть: не происходит ли в этот момент передача данных, если происходит, то устройство ждет. Если сеть свободна, передаюся данные. Если несколько устройств посылают данные одновременно, происходит коллизия.
Передача данных в сети Ethernet происходит фреймами (кадрами), которые состоят из полей.
Существует три главных типа взаимодействий в сети (рис. 36.10):
Каждый уровень может взаимодействовать только со своими соседями и выполнять отведенные только ему функции.
Рис. 36.10. Типы взаимодействия
Для того чтобы послать данные по назначению (по IP-адресу), компьютер сети Ethernet должен знать физический (MAC) адрес получателя. Служба ARP обеспечивает такую привязку. Для этого требуется надежное соединение, поэтому привязка происходит во время TCP-ессии. Если компьютеры находятся в различных сетях, требуется указать шлюз по умолчанию (Default Gateway, DGW).
ARP (англ. Address Resolution Protocol протокол разрешения адресов) сетевой протокол канального уровня, предназначенный для преобразования IP-адресов (адресов сетевого уровня) в MAC-адреса (адреса канального уровня) в сетях TCP/IP.
Основные команды, которые могут понадобиться при проверке конфигурации сети:
Справку по команде можно получить с помощью параметра /h.
36.4. Беспроводные сети
← 36.3. Сетевые протоколы |
36.5. Контрольные вопросы и задания → |
В качестве физических носителей для беспроводных сетей (WLAN wireless LAN) используют радиоволны. Это приводит к проблемам, которые не встречаются в проводных сетях:
Точки доступа WLAN похожи на коммутаторы сетей Ethernet.
Создание беспроводных сетей регулируется законодательствами тех стран, в которых эти сети разворачиваются.
Сравним стандарты беспроводных сетей (табл. 36.4).
Таблица 36.4. Стандарты беспроводных сетей
Стандарты беспроводных IEEE 802.11 |
||||
|
802.11b |
802.11a |
802.11g |
802.11n |
Несущая частота |
2.4 ГГц |
5 ГГц |
2.4ГГц |
2,4 или 5 ГГц |
Максимальная скорость передачи данных [Мбит/с] |
11 |
54 |
37.1. Глобальная сеть Интернет
← 36.5. Контрольные вопросы и задания |
37.2. IP-адрес и доменный адрес → |
Навигация по разделу:
37.1.1. Краткая история Интернета
37.1.2. Основы функционирования Интернета
37.1.3. Сервисы (службы) Интернета
37.1.1 Краткая история Интернета
↑ Наверх
Ранние эксперименты по передаче и приему информации с помощью компьютеров начались еще в 1950-х годах и имели лабораторный характер. В США решение о создании первой глобальной сети национального масштаба было принято в 1958 году. Оно стало реакцией на запуск в СССР первого искусственного спутника Земли.
Основным недостатком централизованной сети была недостаточная устойчивость, связанная с тем, что при выходе из строя какого-либо из узлов полностью выходил из строя и весь сектор, находившийся за ним, а при выходе из строя центра управления выходила из строя вся сеть. Во времена ядерного противостояния сверхдержав этот недостаток был критичным.
Основным направлениеми исследований стал поиск новых протоколов обслуживания сети и новых принципов сетевой архитектуры. Полигоном для испытаний новых принципов стали крупнейшие университетские и научные центры США, между которыми были проложены линии компьютерной связи. Первая вневедомственная национальная компьютерная сеть получила название ARPANET. Ее внедрение состоялось в 1969 году.
1983 году произошли революционные изменения в программном обеспечении компьютерной связи. Проблема устойчивости глобальной сети была решена внедрением протокола TCP/IP, лежащего в основе всемирной сети по нынешний день.
Во второй половине 1980-х годов произошло деление всемирной сети на домены по принципу принадлежности. Домен gov финансировался правительством, домен sci существовал на средства научных кругов, домен edu на средства системы образования, а домен com (коммерческий) не финансировался никем, т. е. его узлы должны были развиваться за счет собственных ресурсов. Национальные сети других государств стали рассматриваться как отдельные домены, например, uk домен Великобритании, su домен Советского Союза,ru домен России.
Таким образом, во второй половине 1980-х годов сложилась и заработала система доменных имен (DNS Domain Name System).
37.1.2. Основы функционирования Интернета
↑ Наверх
Основой функционирования Интернета является протокол TCP/IP. В техническом понимании TCP/IP это не один сетевой протокол, а два протокола, лежащих на разных уровнях (так называемый стек протоколов).
Протокол IP адресный. Он принадлежит сетевому уровню и определяет, куда происходит передача.
Протокол ТСР протокол транспортного уровня. Он управляет передачей информации. Согласно протоколу TCP, отправляемые данные «нарезаются» на небольшие пакеты, после чего каждый пакет маркируется таким образом, чтобы в нем были данные, необходимые для правильной сборки документа на компьютере получателя.
37.1.3. Сервисы (службы) Интернета
↑ Наверх
В простейшем понимании служба это пара программ, взаимодействующих согласно определенным правилам, называемым протоколами. Одна из программ этой пары называется сервером, а другая клиентом.
Соответственно, когда говорят о работе служб Интернета, речь идет о взаимодействии серверного оборудования и программного обеспечения с клиентским оборудованием и программным обеспечением.
Разные службы имеют разные протоколы. Они называются прикладными протоколами. Их соблюдение обеспечивается и поддерживается работой специальных программ. Таким образом, чтобы воспользоваться какой-то из служб Интернета, необходимо установить на компьютере программу, способную работать по протоколу данной службы. Такие программы называют клиентскими, или просто клиентами.
Терминальный режим
Исторически одной из самых ранних является служба удаленного управления компьютером Telnet. Подключившись к удаленному компьютеру по протоколу этой службы, можно управлять его работой. Такое управление еще называют консольным, или терминальным.
Протоколы Telnet применяют, например, для дистанционного управления активным сетевым оборудованием. Простейший клиент Telnet входит в состав любой операционной системы.
Электронная почта (E-Mail)
Электронная почта (англ. email, e-mail, от англ. electronic mail) технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых «письма» или «электронные письма») по распределенной (в том числе глобальной) компьютерной сети. Основным отличием от прочих систем передачи сообщений (например, служб мгновенных сообщений) является возможность отложенной доставки почтовыми серверами.
Обеспечением этой службы в Интернете занимаются специальные почтовые серверы.
Почтовые серверы получают сообщения от клиентов и пересылают их по цепочке к почтовым серверам адресатов, где эти сообщения накапливаются. При установлении соединения между адресатом и его почтовым сервером происходит автоматическая передача поступивших сообщений на компьютер адресата.
Почтовая служба основана на двух прикладных протоколах: SMTP и РОРЗ.
SMTP (англ. Simple mail transfer protocol) протокол передачи почты. В общепринятой реализации он использует службу DNS для определения правил пересылки почты.
POP3 (англ. Post Office Protocol Version 3 протокол почтового отделения, версия 3) используется почтовым клиентом для получения сообщений электронной почты с сервера.
По протоколу SMTP корреспонденция отправляется с компьютера на сервер, а по протоколу POP3 принимаются поступившие сообщения. Существует большое разнообразие клиентских почтовых программ, в том числе для мобильных устройств.
Служба передачи файлов (FTP)
FTP (англ. File Transfer Protocol протокол передачи файлов) протокол, предназначенный для передачи файлов в компьютерных сетях. FTP позволяет подключаться к серверам FTP, просматривать содержимое каталогов и загружать файлы с сервера или на сервер.
Прием и передача файлов составляют значительный процент от прочих Интернет-услуг. С появлением быстрых линий Интернета во многих домах большое распространение получил доступ к различного рода хранилищам файлов.
Служба FTP имеет свои серверы в мировой сети, на которых хранятся архивы данных. Со стороны клиента для работы с серверами FTP может быть установлено специальное программное обеспечение, хотя в большинстве случаев браузеры WWW обладают встроенными возможностями для работы и по протоколу FTP. Протокол FTP работает одновременно с двумя TCP-соединениями между сервером и клиентом.
Группы новостей. Форумы
Большое распространение получили так называемые форумы.
Веб-форум класс веб-приложений для организации общения посетителей веб-сайта. Термин соответствует смыслу исходного понятия «форум». Форум предлагает набор разделов для обсуждения. Работа форума заключается в создании пользователями тем в разделах и последующим обсуждением внутри этих тем.
До появления термина «форум» пользовались термином группа новостей, или конференция. Их удобно использовать для обсуждения какой-то темы. Если форум или группа новостей становятся достаточно популярными, то большой объем сообщений значительно затрудняет их целенаправленный мониторинг, поэтому в некоторых группах производится «отсев» информации, не относящейся к теме конференции, модерация. Такие конференции называют модерируемыми. В качестве модератора может выступать не только человек, но и программа, фильтрующая сообщения по определенным ключевым словам. В последнем случае говорят об автоматической модерации.
NNTP (англ. Network News Transfer Protocol) сетевой протокол, используемый для обмена сообщениями в группах новостей.
Служба World Wide Web (WWW)
Безусловно, это самая популярная служба современного Интернета. Ее нередко отождествляют с Интернетом, хотя на самом деле это лишь одна из его многочисленных служб.
World Wide Web это единое информационное пространство, состоящее из сотен миллионов взаимосвязанных электронных документов, хранящихся на веб-cepверах. Отдельные документы, составляющие пространство Web, называют веб-страницами. Количество существующих веб-страниц уже измеряется миллиардами, причем энергичный рост объема World Wide Web продолжается.
Группы тематически объединенных веб-страниц называют веб-узлами (альтернативный термин веб-сайт, или просто сайт). Один физический веб-сервер может содержать достаточно много веб-узлов.
Тем самым совокупность огромного числа гипертекстовых электронных документов, хранящихся на серверах WWW, образует своеобразное гиперпространство документов, между которыми возможно перемещение.
Служба имен доменов (DNS)
Адрес любого компьютера или любой локальной сети в Интернете может быть выражен 4 байтами, например так: 195.28.132.97, в то же время каждый компьютер имеет уникальное доменное имя, например такое: www.nstu.ru. Это просто две разные формы записи адреса одного и того же сетевого компьютера.
Однако автоматическая работа серверов сети организована с использованием числового адреса. Благодаря этому промежуточные серверы могут осуществлять передачу запросов и ответов в нужном направлении, не зная, где конкретно находятся отправитель и получатель. Поэтому необходим перевод доменных имен в IP-адреса. Этим и занимаются серверы службы имен доменов DNS.
DNS (англ. Domain Name System система доменных имен) распределенная система (распределенная база данных), способная по запросу, содержащему доменное имя хоста (компьютера или другого сетевого устройства), сообщить IP-адрес или (в зависимости от запроса) другую информацию. DNS работает в сетях TCP/IP. Как частный случай DNS может хранить и обрабатывать и обратные запросы, определения имени хоста по его IP-адресу: IP-адрес по определенному правилу преобразуется в доменное имя, и посылается запрос на информацию типа PTR.
Обмен сообщениями, чат (chat)
Чат (англ. chat разговор) средство общения пользователей по сети в режиме реального времени, а также программное обеспечение, позволяющее организовывать такое общение.
HTTP- или веб-чаты. Такой чат выглядит как обычная веб-страница, где можно прочесть последние несколько десятков фраз, написанных участниками чата и модераторами.
Служба предназначена для прямого общения нескольких человек в режиме реального времени. Иногда эту службу называют чат-конференциями или просто чатом. Каждый пользователь может создать собственный канал и пригласить в него участников «беседы» или присоединиться к одному из открытых в данный момент каналов.
Существует несколько популярных служб мгновенного обмена сообщениями. Обмен происходит через специальные серверы, работающие только со своими программами-клиентами. Эти серверы могут находиться географически достаточно далеко. Часто может оказаться, что два человека в одном помещении обмениваются сообщениями через сервер, который находится на другом континенте.
IRC (англ. Internet Relay Chat ретранслируемый интернет-чат) сервисная система, при помощи которой можно общаться через сеть Интернет с другими людьми в режиме реального времени. Она была создана в 1988 году финским студентом Ярко Ойкариненом (Jarkko Oikarinen).
Социальные сети
Социальная сеть направлена на построение сообществ в Интернете из людей со схожими интересами и/или деятельностью. Связь осуществляется посредством сервиса внутренней почты или мгновенного обмена сообщениями.
Блоги
Блог (англ. blog от web log сетевой журнал или дневник событий) это веб-сайт, основное содержимое которого регулярно добавляемые записи, изображения или мультимедиа.
Для блогов характерны недлинные записи временной значимости, отсортированные в обратном хронологическом порядке (последняя запись сверху). Отличия блога от традиционного дневника обусловливаются средой: блоги обычно публичны и предполагают сторонних читателей, которые могут вступить в публичную полемику с автором (в отзывах к блог-записи или своих блогах).
Блог это личный сайт пользователя, доступный общественному просмотру и состоящий из регулярно обновляемых записей, изображений и мультимедиа. Предполагает полемику читателя с автором.
Блоггерами (блогерами) называют людей, ведущих блог. Совокупность всех блогов Сети принято называть блогосферой. По авторскому составу блоги могут быть личными, групповыми (корпоративными, клубными…) или общественными (открытыми). По содержанию тематическими или общими.
Для блогов характерна возможность публикации отзывов (так называемых комментариев, комментов) посетителями. Она делает блоги средой сетевого общения, имеющей ряд преимуществ перед электронной почтой, группами новостей, веб-форумами и чатами
37.2. IP-адрес и доменный адрес
← 37.1. Глобальная сеть Интернет |
37.3. Протокол HTTP → |
Навигация по разделу:
37.2.1. IPv4. Классы IP адресов
37.2.2. Переход на IPv6
Каждый компьютер, подключенный к Интернету, должен иметь IP-адрес. Этот адрес может быть постоянным или динамически временным.
IP (англ. Internet Protocol межсетевой протокол) маршрутизируемый сетевой протокол, основа стека протоколов TCP/IP.
Суть протокола IP состоит в том, что у каждого участника Всемирной сети должен быть свой уникальный адрес (IP-адрес). Без этого нельзя говорить о точной доставке TCP -пакетов на нужное рабочее место. Структура IP-адреса зависит от версии протокола IPv4 или IPv6, о чем мы поговорим ниже. IP-адрес содержит информацию, по которой каждый компьютер, через который проходит какой-либо TCP-пакет, может определить, кому надо переслать пакет. В результате TCP-пакет достигает адресата.
Решением вопроса выбора пути занимаются маршрутизаторы. Роль маршрутизатора в Сети может выполнять как специализированный компьютер, так и специальная программа, работающая на узловом сервере сети.
37.2.1. IPv4. Классы IP-адресов
↑ Наверх
В современной сети Интернет используется IP четвертой версии, также известный как IPv4. В протоколе IP этой версии каждому узлу сети ставится в соответствие IP-адрес длиной 4 октета (иногда говорят «байта», подразумевая распространенный восьмибитовый минимальный адресуемый фрагмент памяти ЭВМ). При этом компьютеры в подсетях объединяются общими начальными битами адреса. Количество этих бит, общее для данной подсети, называется маской подсети.
Максимальное количество адресов для IPv4 отражено в табл. 37.1.
Таблица 37.1. Количество адресов IPv4
Класс IP-адреса |
Десятичное представление первого октета |
Двоичное представление первого октета |
Количество адресов |
A |
1-126 |
00000001-01111110 |
16 777 214 |
B |
128-191 |
10000000-10111111 |
65 534 |
C |
192-223 |
11000000-11011111 |
254 |
Достаточно скоро адресов стало не хватать. Поэтому выделили так называемые публичные («белые», «внешние») и локальные («серые», «внутренние») адреса.
Публичные (внешние) адреса указаны в табл. 37.2.
Таблица 37.2. Публичные адреса IPv4
Интервал IP адресов |
От 1.0.0.0 до 9.255.255.255 |
От 128.0.0.0 до 172.15.255.255 |
От 192.0.0.0 до 192.167.255.255 |
Локальные адреса указаны в табл. 37.3.
Таблица 37.3. Локальные адреса IPv4
Интервал локальных IP адресов |
От 10.0.0.0 до 10.255.255.255 |
От 172.16.0.0 до 172.31.255.255 |
От 192.168.0.0 до 192.168.255.255 |
За пределами локальной сети виден только компьютер с публичным адресом. Компьютер с локальным адресом устанавливает связь с внешним миром через сервер, на котором работает служба NAT.
NAT (Network Address Translation преобразование сетевых адресов) механизм в сетях TCP/IP, позволяющий преобразовывать IP-адреса транзитных пакетов. Преобразование адресов методом NAT может производиться почти любым маршрутизирующим устройством маршрутизатором, сервером доступа, межсетевым экраном. Суть механизма состоит в замене адреса источника (source) при прохождении пакета в одну сторону и обратной замене адреса назначения (destination) в ответном пакете. Наряду с адресами source/destination могут также заменяться номера портов source/destination.
NAT позволяет сэкономить IP-адреса, транслируя несколько внутренних IP-адресов в один внешний публичный IP-адрес, предотвратить или ограничить обращение снаружи ко внутренним хостам, оставляя возможность обращения изнутри наружу.
37.2.2. Переход на IPv6
↑ Наверх
Однако количества адресов IPv4 стало не хватать даже с учетом возможности использования локальных адресов и технологии NAT:
В настоящее время происходит переход на адреса IPv6.
Формат IPv6- адреса
x:x:x:x:x:x:x:x, где x 16-ичное число
Правила написания адреса IPv6:
Примеры.
Сравнение IPv4 и IPv6 отображает табл. 37.4.
Таблица 37.4. Сравнение IPv4 и IPv6
IPv4 |
IPv6 |
|
Длина адреса |
4 октета |
16 октетов |
Пример адреса |
192.168.201.113 |
A524:72D3:2C80:DD02:0029:EC7A:002B:EA73 |
Максимальное количество |
4 294 467 295 IP адресов |
3,4 x 1038 IP адресов |
Как видно из табл. 37.4, IPv6 использует другую систему адресации в сравнении с IPv4. Переход на IPv6 позволяет резко увеличить адресное пространство.
IPv6 обладает также следующими преимуществами:
Типы IPv6 адресов.
Каждый интерфейс (каждое устройство) имеет уникальный адрес, который может служить адресом одновременно нескольких типов (например, глобальным, зарезервированным, локальным).
Можно устраивать обмен информацией один-ко-многим (one-to-many), что обеспечивает более эффективное использование сети.
К нескольким устройствам можно обращаться по одному адресу (any cast), такие устройства должны предоставлять одинаковый сервис. После получения запроса маршрутизатор решает, какое из ближайших устройств выбрать.
Перевод сетей на новую систему адресации.
Некоторое время придется использовать двойную систему адресации для одного устройства. Уже сейчас такая двойная система используется маршрутизаторами. Поэтому нет необходимости установки определенного дня перехода на новую систему адресации
37.3. Протокол HTTP
← 37.2. IP-адрес и доменный адрес |
37.4. Адрес URL → |
От обычных текстовых документов веб-страницы отличаются тем, что они оформлены без привязки к конкретному носителю. Электронные веб-документы предназначены для просмотра на экране компьютера, причем заранее не известно, на каком. Не известны ни размеры экрана, ни параметры цветового и графического разрешения, не известна даже операционная система, с которой работает компьютер клиента. Поэтому веб-документы не могут иметь «жесткого» форматирования. Оформление выполняется непосредственно во время их воспроизведения на компьютере клиента и происходит оно в соответствии с настройками программы, выполняющей просмотр.
Программы для просмотра веб-страниц называют браузерами.
Информационный WWW-сервер использует гипертекстовую технологию. Для записи документов в гипертексте используется специальный, но очень простой язык HTML (Hypertext Markup Language язык разметки гипертекста), который позволяет управлять шрифтами, отступами, вставлять гиперссылки, цветные иллюстрации, поддерживает вывод звука и анимации (средства мультимедиа). Для этого он использует специальные команды-теги. В стандарт языка также входит поддержка математических формул.
веб-документ представляет собой обычный текстовый документ, размеченный тегами. Большинство тегов используются парами: открывающий тег и закрывающий. Закрывающий тег начинается с символа «/»:
<CENTER>Текст</CENTER>
Сложные теги имеют кроме ключевого слова дополнительные атрибуты и параметры, детализирующие способ их применения. При отображении документа на экране с помощью браузера теги не показываются, и мы видим только текст, составляющий документ.
Внешне гипертекст отличается от обычного текста тем, что часть слов или целые строки в нем, будучи выделены особым шрифтом или цветом, оказываются чувствительными к появлению на них указателя манипулятора «мышь». Щелчок мыши приводит к инициированию какого-либо события, чаще всего к загрузке в программу просмотра нового документа, привязанного так называемой гипертекстовой ссылкой к выделенной строке текста. В результате у пользователя появляется возможность самому выбирать порядок просмотра тех или иных страниц, двигаясь по перемежающимся между собой нитям паутинкам ссылок. В сценарий просмотра могут входить ресурсы всего мира, доступ к которым происходит по протоколу работы с гипертекстом HTTP (Hyper Text Transfer Protocol).
Благодаря удобному интерфейсу браузеров работа в Web не представляет особых трудностей.
Современные стандарты языка разметки.
XML
XML (англ. eXtensible Markup Language расширяемый язык разметки) рекомендованный Консорциумом Всемирной паутины язык разметки, фактически представляющий собой свод общих синтаксических правил. XML текстовый формат, предназначенный для хранения структурированных данных для обмена информацией между программами, а также для создания на его основе более специализированных языков разметки (например, XHTML).
Целью создания XML было обеспечение совместимости при передаче структурированных данных между разными системами обработки информации, особенно при передаче таких данных через Интернет. Словари, основанные на XML (например, RDF, RSS, MathML, XHTML, SVG), сами по себе формально описаны, что позволяет программно изменять и проверять документы на основе этих словарей, не зная их семантики, т. е. не зная смыслового значения элементов. Важная особенность XML применение так называемых пространств имен (англ. namespace).
XHTML
XHTML (англ. Extensible Hypertext Markup Language расширяемый язык разметки гипертекста) язык разметки веб-страниц, по возможностям сопоставимый с HTML, созданный на базе XML.
Различия между XHTML и HTML
37.4. Адрес URL
← 37.3. Протокол HTTP |
37.5. Контрольные вопросы и задания → |
Гипертекстовая связь между сотнями миллионов документов, хранящихся на физических серверах Интернета, является основой существования логического пространства World Wide Web. Однако такая связь не могла бы существовать, если бы каждый документ в этом пространстве не обладал своим уникальным адресом. Каждый файл одного локального компьютера обладает уникальным полным именем, в которое входит собственное имя файла (включая расширение имени) и путь доступа к файлу, начиная от имени устройства, на котором он хранится. Теперь мы можем расширить представление об уникальном имени файла и развить его до Всемирной сети. Адрес любого файла во всемирном масштабе определяется унифицированным указателем ресурса URL.
Унифицированный (единый) указатель ресурсов (англ. URL Uniform Resource Locator) единообразный локатор (определитель местонахождения) ресурса. URL это стандартизированный способ записи адреса ресурса в сети Интернет.
URL был изобретен Тимом Бернерсом-Ли в 1990 году в стенах Европейского совета по ядерным исследованиям в Женеве, Швейцария. URL стал фундаментальной инновацией в Интернете. Изначально URL предназначался для обозначения мест расположения ресурсов (чаще всего файлов) во Всемирной паутине. Сейчас URL позиционируется как часть более общей системы идентификации ресурсов URI, сам термин URL постепенно уступает место более широкому термину URI.
URI (англ. Uniform Resource Identifier) единообразный идентификатор ресурса. URI это короткая последовательность символов, идентифицирующая абстрактный или физический ресурс. Ранее назывался Universal Resource Identifier универсальный идентификатор ресурса.
Адрес URL состоит из трех частей.
При записи URL-адреса важно точно соблюдать регистр символов. Именно в форме URL и связывают адрес ресурса с гипертекстовыми ссылками на веб-страницах. При щелчке на гиперссылке браузер посылает запрос для поиска и доставки ресурса, указанного в ссылке. Если по каким-то причинам он не найден, выдается сообщение о том, что ресурс недоступен (возможно, что сервер временно отключен или изменился адрес ресурса).
38.1. Браузеры
← 37.5. Контрольные вопросы и задания |
38.2. Почтовые программы → |
Понятие браузера
Просмотр содержимого сайтов производится с помощью специальных программ браузеров от англ. browser (to browse просматривать).
Браузер, веб-обозреватель программное обеспечение для просмотра веб-сайтов, т. е. для запроса веб-страниц (преимущественно из cети Интернет), их обработки, вывода и перехода от одной страницы к другой.
Браузер обрабатывает код HTML страниц и представляет информацию в виде, пригодном для чтения. При этом учитываются кодировка, шрифт, графика и другие особенности отображаемой страницы. Современные браузеры позволяют динамически формировать страницы на основе встроенных запросов к базам данных, поэтому все чаще браузеры используются как графические интерфейсы для работы с базами данных. Более того, браузеры становятся основой графического интерфейса операционных систем, предназначенных для работы с Интернет-приложениями, таких как ОС Chrome (Google).
В настоящее время браузер представляет собой комплексное приложение для обработки и вывода разных составляющих веб-страницы и для предоставления интерфейса между веб-сайтом и его посетителем. Практически все популярные браузеры распространяются бесплатно или «в комплекте» с другими приложениями либо операционными системами:
История развития браузеров
Первым распространенным браузером с графическим интерфейсом был NCSA Mosaic. Исходный код этого браузера был открытым, и некоторые другие браузеры (Netscape Navigator и Internet Explorer) взяли его за основу.
Netscape выпустила Netscape Navigator под разные операционные системы и добилась заметного успеха, в том числе и коммерческого. Это побудило компанию Microsoft выпустить свой браузер Internet Explorer.
В отличие от Netscape, Microsoft сразу выпускала локализованные версии IE. В 1995 году Microsoft выпустила операционную систему Windows 95, в ней не было встроенного браузера, но через некоторое время в обновление системы (Windows 95 OSR2) браузер (Internet Explorer 3.0) был встроен.
Исходный код браузера Netscape был выпущен под свободной лицензией MPL (Mozilla Public License). Название «Mozilla» изначально присутствовало в браузере от Netscape и означало сокращение слов Mosaic+killer. Однако этот код было решено не использовать, и вместо него для Netscape 6 с нуля был написан новый движок (Gecko), изначально ориентировавшийся на полную поддержку стандартов, на основе которого позже были созданы входящие в комплект Mozilla Suite браузер, почтовый и irc-клиент и редактор веб-страниц.
Впоследствии в Mozilla Foundation было принято решение поставлять и развивать браузер отдельно от общего пакета. Так родился проект Mozilla Firefox.
В 1996 году появился браузер Opera. Долгое время он позиционировался как самый быстрый браузер. Он считался самым легким и в старте, и в загрузке из Интернета, и в отображении страниц, и, в зависимости от доминирующего в тот момент на рынке браузера, был совместим с ним (или старался быть таковым). Первоначально Opera распространялась как условно-бесплатное ПО (shareware), но с 2005 года Opera также стала распространяться бесплатно.
Война браузеров была бы исключительно коммерческим делом корпораций, если бы основным приемом в борьбе не стало добавление специфических, нестандартных возможностей к браузерам. Наибольшие различия возникали в поддержке JavaScript языка сценариев, придающего интерактивность документам. В результате многие сайты «оптимизировались» под одни браузеры и плохо работали в других браузерах.
В 2008 году компания Google выпустила свой браузер с открытым исходным кодом Chrome. Браузер Chrome содержит некоторые новшества (изоляция сбоев, режим «инкогнито» и т. д.).
В начале 2009 года Microsoft объявила, что разрабатывает новый браузер, который будет называться Gazelle. Новый браузер будет применять принципы разделения ресурсов, характерные для многопользовательских операционных систем, что, согласно Microsoft, повысит его безопасность.
Часть браузеров поддерживают кроме онлайн-режима, когда браузер пытается получить страницы с веб-сервера, оффлайн-режим, при котором можно просматривать сохраненные копии ранее посещенных страниц.
Существуют браузеры, которые специально спроектированы на преимущественную работу в оффлайн-режиме создании локальных копий веб-страниц и сайтов. Их называют оффлайн-браузерами.
Веб-технологии
Использование фреймов
Фрейм (frame) это отдельный, законченный HTML-документ, который вместе с другими HTML-документами может быть отображен в окне web-браузера.
Фреймы по своей сути очень похожи на ячейки таблицы, однако более универсальны. Фреймы разбивают веб-страницу на отдельные мини-кадры, расположенные на одном экране, которые являются независимыми друг от друга. Каждое окно может иметь собственный адрес. При нажатии на любую из ссылок, расположенных в одном фрейме, можно рассматривать страницы, показанные в другом окне.
В настоящее время использовать фреймы не рекомендуется.
Протокол безопасного соединения
SSL (англ. Secure Sockets Layer уровень защищенных сокетов) криптографический протокол, который обеспечивает установление безопасного соединения между клиентом и сервером. SSL изначально разработан компанией Netscape Communications.
Протокол обеспечивает конфиденциальность обмена данными между клиентом и сервером, использующими TCP/IP, причем для шифрования используется симметричный алгоритм с открытым ключом. При шифровании с открытым ключом применяются два ключа, причем любой из них может использоваться для шифрования сообщения. Тем самым, если мы прибегаем к одному ключу для шифрования, то соответственно для расшифровки нужно использовать другой ключ. В такой ситуации можем получать защищенные сообщения, публикуя открытый ключ и храня в тайне секретный ключ.
Использование технологии CSS
CSS (англ. Cascading Style Sheets каскадные таблицы стилей) технология описания внешнего вида документа, написанного языком разметки. Преимущественно используется как средство оформления веб-страниц в формате HTML и XHTML.
CSS используется создателями веб-страниц для задания цветов, шрифтов, расположения и других аспектов представления документа. Основная цель разработки CSS разделение содержимого (написанного на HTML или другом языке разметки) и представления документа (написанного на CSS). Это разделение может увеличить доступность документа, предоставить большую гибкость и возможность управления его представлением, а также уменьшить сложность и повторяемость в структурном содержимом. Кроме того, CSS позволяет представлять один и тот же документ в различных стилях или методах вывода.
Использование JavaScript
JavaScript объектно-ориентированный скриптовый язык программирования.
JavaScript обычно используется как встраиваемый язык для программного доступа к объектам приложений. Наиболее широкое применение находит в браузерах как язык сценариев для придания интерактивности веб-страницам.
Форматы синдикации
RSS
RSS (2.x) (англ. really simple syndication очень простое приобретение информации) семейство XML-форматов, предназначенных для описания лент новостей, анонсов статей, изменений в блогах и т. п. Информация из различных источников, представленная в формате RSS, может быть собрана, обработана и представлена пользователю в удобном для него виде специальными программами-агрегаторами.
Обычно с помощью RSS 2.0 даются краткое описание новой информации, появившейся на сайте, и ссылка на ее полную версию. Интернет-ресурс в формате RSS называется RSS-каналом, RSS-лентой или RSS-фидом.
Многие современные браузеры, почтовые клиенты и Интернет-пейджеры умеют работать с RSS-лентами, среди них Safari, Mozilla Firefox, Opera, Opera mini, Windows Internet Explorer (начиная с 7-й версии). Кроме того, существуют специализированные приложения (RSS-агрегаторы), собирающие и обрабатывающие информацию RSS-каналов. Также очень популярны веб-агрегаторы, представляющие собой сайты по сбору и отображению RSS-каналов, такие как Яндекс.Лента, Google Reader, Новотека и Bloglines.
Atom
Atom общее название двух связанных веб-технологий: формата для описания ресурсов на веб-сайтах и протокола для их публикации. Протокол публикации Atom (также AtomPub, от англ. Atom Publishing Protocol) основан на HTTP и позволяет создавать, изменять и удалять ресурсы, собранные в коллекции на веб-сайте (примером коллекции может служить блог). Содержимое коллекций описывается в формате Atom, а для управления им используются стандартные методы HTTP.
Формат синдикации Atom основан на XML и позволяет описывать наборы веб-ресурсов например, новостные ленты, анонсы статей в блоге и т. п. Он решает те же задачи, что и RSS, но возник позже и учел многие его недостатки. Формат сейчас активно поддерживается компанией Google во многих ее проектах.
В табл. 38.138.3 отражены сравнительные данные и технические характеристики основных веб-браузеров.
Таблица 38.1. Поддержка операционных систем
|
Windows |
Mac OS X |
Linux |
Google Chrome |
Да |
Нет |
Нет |
Internet Explorer |
Да |
Прекращена |
Нет |
Mozilla Firefox |
Да |
Да |
Да |
Opera |
Да |
Да |
Да |
Safari |
Да |
Да |
Нет |
Таблица 38.2. Функциональность
|
Вкладки |
Менеджер закачек |
Панель поиска |
Проверка орфографии |
Блокировка баннеров |
Блокировка всплывающих окон |
Фильтр фишинга |
Google Chrome |
Да |
Да |
Да |
Да |
Нет |
Да |
Да |
Internet Explorer |
Да (с 7-й версии) |
Да |
Да |
Частично |
Да |
Да |
Да |
Mozilla Firefox |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Opera |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Safari |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Таблица 38.3. Поддержка веб-технологий и протоколов
Веб-стандарты и технологии |
Интернет протоколы |
||||||||||
CSS2 |
Фреймы |
Java |
Java-Script |
XHTML |
RSS |
Atom |
|
FTP |
NNTP |
SSL |
|
Google Chrome |
Да |
Да |
Плагин |
Да |
Да |
Да |
Нет |
Нет |
Да |
Нет |
Да |
Internet Explorer |
Частично |
Да |
Да |
Да |
Нет |
Да |
Да |
Нет |
Да |
Нет |
Да |
Mozilla Firefox |
Частично |
Да |
Да |
Да |
Да |
Да |
Да |
Плагин |
Плагин |
Плагин |
Да |
Opera |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Да |
Safari |
Частично |
Да |
Да |
Да |
Да |
Да |
Да |
Нет |
Частично |
Нет |
Да |
38.2. Почтовые программы
← 38.1. Браузеры |
38.3. Контрольные вопросы и задания → |
Электронная почта
Типичный интерфейс клиента электронной почты, с возможностью выбора папок с сообщениями (слева), сообщений (справа вверху) и просмотра текста сообщений (справа внизу).
Электронная почта (англ. email, e-mail, от англ. electronic mail) технология и предоставляемые ею услуги по пересылке и получению электронных сообщений (называемых письми или электронными письми) по распределенной (в том числе глобальной) компьютерной сети. Основное отличие от прочих систем передачи сообщений (например, служб мгновенных сообщений) возможность отложенной доставки и развитая система взаимодействия независимых почтовых серверов.
Почтовая программа (клиент электронной почты, почтовый клиент) программное обеспечение, устанавливаемое на компьютере пользователя и предназначенное для получения, написания, отправки и хранения сообщений электронной почты одного или нескольких пользователей (в случае, например, нескольких учетных записей на одном компьютере) или нескольких учетных записей одного пользователя.
История
Появление электронной почты можно отнести к 1965 году, когда сотрудники Массачусетского технологического института (MIT) Ноэль Моррис и Том Ван Влек написали программу MAIL.
Общее развитие электронной почты шло через развитие локального взаимодействия пользователей на многопользовательских системах. Пользователи могли, используя программу mail (или её эквивалент), пересылать друг другу сообщения в пределах одного компьютера. Следующий шаг был в возможности переслать сообщение пользователю на другой машине для этого использовалось указание имени машины и имени пользователя на машине.
В настоящий момент существует несколько моделей коммерческого применения почтовых систем.
После появления распределенной глобальной системы имен (DNS) для указания адреса стали использоваться доменные имена user@example.com пользователь user в домене example.com. Доменное имя соответствует имени почтового сервера. Пользователи забирают свою почту по различным сетевым протоколам (среди распространенных на настоящий момент POP3, IMAP, MAPI).
DNS работает в сетях TCP/IP. Как частный случай DNS может хранить и обрабатывать и обратные запросы, определения имени хоста по его IP-адресу IP-адрес по таблице соответствия преобразуется в доменное имя, и посылается запрос на информацию типа PTR.
Для отправки писем используется протокол SMTP.
Протоколы доступа к почтовым серверам
SMTP
Общепринятым в мире протоколом обмена электронной почтой является SMTP.
SMTP (англ. Simple mail transfer protocol протокол передачи почты), в общепринятой реализации использует DNS для определения правил пересылки почты (хотя в частных системах, вроде Microsoft Exchange, SMTP может действовать согласно информации из других источников).
В различных доменах настроены свои, независимые друг от друга, почтовые системы. У каждого почтового домена может быть несколько пользователей. (Однако фактически может быть так, что одна организация или персона владеет многими доменами, которые обслуживаются (физически) одной почтовой системой). Почта передается между узлами с использованием программ пересылки почты MTA (англ. Mail Transfer Agent). Поведение систем при связи друг с другом строго стандартизировано, для этого используется протокол SMTP (и соблюдение этого стандарта, наравне с всеобщей поддержкой DNS всеми участниками, является основой для возможности связи «всех со всеми» без предварительных договоренностей). Взаимодействие почтовой системы и пользователей, в общем случае, никак не регламентируется и может быть произвольным, хотя существуют как открытые, так и закрытые (завязанные на ПО конкретных производителей) протоколы взаимодействия пользователей и почтовой системы.
Программа, работающая в почтовой системе и обслуживающая пользователей, называется MDA (англ. Mail Delivery Agent агент доставки почты). В некоторых почтовых системах MDA и MTA объединены в одну программу, в других системах они разнесены в виде разных программ или вообще выполняются на различных серверах. Программа, с помощью которой пользователь осуществляет доступ, называется MUA (англ. Mail User Agent), хотя, в случае, например, веб-интерфейса, может и отсутствовать.
Внутри заданной почтовой системы (обычно находящейся в рамках одной организации) может быть множество почтовых серверов, выполняющих как пересылку почты внутри организации, так и другие связанные с электронной почтой задачи: фильтрацию спама, проверку вложений антивирусом, обеспечение автоответа, архивацию входящей/исходящей почты, обеспечение доступа пользователям различными методами (от POP3 до ActiveSync). Взаимодействие серверов в рамках одной почтовой системы может быть подчинено общим правилам (использование DNS и правил маршрутизации почты с помощью протокола SMTP) или следовать собственным правилам компании (используемого программного обеспечения).
POP3
После попадания почты на конечный сервер он осуществляет временное или постоянное хранение принятой почты. Существует две различные модели работы с почтой: концепции почтового ящика и хранилища почты.
В концепции почтового ящика почта на сервере хранится временно, в ограниченном объеме (аналогично почтовому ящику для бумажной почты), а пользователь периодически обращается к ящику и «забирает» письма (т. е. почтовый клиент скачивает копию письма к себе и удаляет оригинал из почтового ящика). На основании этой концепции действует протокол POP3.
POP3 (англ. Post Office Protocol Version 3 протокол почтового отделения, версия 3) используется почтовым клиентом для получения сообщений электронной почты с сервера. Обычно используется в паре с протоколом SMTP.
IMAP
Концепция постоянного хранения подразумевает, что вся корреспонденция, связанная с почтовым ящиком (включая копии отправленных писем) хранится на сервере, а пользователь обращается к хранилищу (иногда его по традиции также называют почтовым ящиком) для просмотра корреспонденции (как новой, так и архива) и написания новых писем (включая ответы на другие письма). На этом принципе действуют протокол IMAP и большинство веб-интерфейсов бесплатных почтовых служб. Подобное хранение почтовой переписки требует значительно больших мощностей от почтовых серверов, в результате во многих случаях происходит разделение между почтовыми серверами, пересылающими почту, и серверами хранения писем.
IMAP (англ. Internet Message Access Protocol Протокол доступа к электронной почте Интернета) протокол прикладного уровня для доступа к электронной почте.
IMAP предоставляет пользователю богатые возможности для работы с почтовыми ящиками, находящимися на центральном сервере. Почтовая программа, использующая этот протокол, получает доступ к хранилищу корреспонденции на сервере так, как будто эта корреспонденция расположена на компьютере получателя. Электронными письмами можно манипулировать с компьютера пользователя (клиента) без постоянной пересылки с сервера и обратно файлов с полным содержанием писем.
В определенных условиях сервер хранения писем может быть настроен на поведение, подобное клиенту: такой сервер обращается к почтовому серверу по протоколу POP3 и забирает почту себе. Подобные решения используются обычно в малых организациях, где нет инфраструктуры для развертывания полноценных почтовых серверов; в этом случае используется локальный сервер для хранения почты и почтовый сервер провайдера, предоставляющий услугу получения почты по POP3.
Основной недостаток подобного решения задержка в доставке (так как забирающее почту ПО обращается на сервер с некоторой задержкой).
MAPI
MAPI (англ. Messaging Application Programming Interface) интерфейс программы, работающей с электронной почтой в Microsoft Windows.
MAPI позволяет получать, читать, создавать, отправлять почтовые сообщения, присоединять к ним файлы (или получать доступ к присоединенным файлам) и т. д. Примерами приложений, использующих MAPI являются Microsoft Outlook.
Релеи
DNS позволяет указать в качестве принимающего сервера любой узел Интернета, не обязательно являющийся частью доменной зоны домена получателя. Это может использоваться для настройки пересылки почты через третьи серверы. Сторонний сервер принимает почту для домена пользователя и пересылает его на почтовые серверы пользователя как только появляется возможность. Такие серверы называется открытыми релеями.
Для своих пользователей серверы почтовой системы являются релеями (пользователи отправляют почту не на серверы почтовой системы адресата, а на «свой» почтовый сервер, который передает письма далее). Во многих сетях провайдеров Интернета возможность отправлять письма по протоколу SMTP за пределы сети закрыта (из-за использования этой возможности троянами, вирусами). В этом случае провайдер предоставляет свой SMTP-сервер, через который и направляется вся почта за пределы сети. Открытым релеем при этом считается такой релей, который не проверяет, является ли пользователь «своим» (проверка может осуществляться как на основании сетевого адреса компьютера пользователя, так и на основании идентификации пользователя паролем/сертификатом).
Маршрутизация почты
Почтовый сервер при обработке письма действует по следующему алгоритму: для домена-получателя ищутся все MX-записи. Они сортируются в порядке убывания приоритета. Если адрес почтового сервера совпадает с одним из узлов, указанных в MX-записях, то все записи с приоритетом, меньшим приоритета узла в MX-записи (а также MX-запись самого узла), отбрасываются, а доставка осуществляется на первый отвечающий узел (узлы пробуются в порядке убывания приоритета).
Если сеть имеет различные DNS-серверы (например, внешние в Интернете, и локальные в собственных пределах), то возможна ситуация, когда «внутренние» DNS-серверы в качестве наиболее приоритетного получателя указывают на недоступный в Интернете сервер, куда и перенаправляется почта с релея, указанного как узел-получатель для Интернета. Подобное разделение позволяет осуществлять маршрутизацию почты по общим правилам между серверами, не имеющими выхода в Интернет.
Структура письма
Электронное письмо состоит из нескольких частей.
Заголовок SMTP
Заголовок SMTP содержит в себе следующую информацию:
Заголовок письма
Заголовок письма описывается стандартами RFC.
Запрос комментариев (англ. Request for Comments, RFC) документ из серии пронумерованных информационных документов Интернета, содержащих технические спецификации и стандарты, широко применяемые во Всемирной сети.
В настоящее время первичной публикацией документов RFC занимается IETF под эгидой открытой организации Общество Интернета (англ. Internet Society, ISOC). Правами на RFC обладает именно Общество Интернета.
Заголовок отделяется от тела письма пустой строкой. Заголовок используется для журналирования прохождения письма и служебных пометок (иногда строки журналирования и пометки называются кладжами).
Кладжи или клуджи (англ. kludge) управляющие строки, содержащие техническую информацию о сообщениях в сетях, основанных на технологии FTN. Аналогичную роль выполняет RFC-заголовок в сообщениях электронной почты.
Часто о кладжах говорят в широком смысле, имея в виду все строки с технической информацией.
Заголовки, обычно, добавляются снизу вверх (т. е. каждый раз, когда к сообщению нужно добавить заголовок, он дописывается первой строкой, перед всеми предыдущими).
Помимо служебной информации, заголовки письма также хранят и показываемую пользователю информацию, это обычно отправитель письма, получатель, тема и дата отправки.
Часто используемые поля
Return-Path обратный адрес. Может отличаться от MAIL FROM. (т. е. обратный адрес может быть указан отличным от адреса отправителя).
Received строчка журналирования прохождения письма. Каждый почтовый сервер (MTA) помечает процесс обработки этим сообщением. Если сообщение проходит через несколько почтовых серверов (обычная ситуация), то новые сообщения дописываются над предыдущими (и журнал перемещения читается в обратном порядке, от ближайшего узла к самому дальнему).
MIME-Version версия MIME, с которым это сообщение создано. Поскольку сообщение создаётся раньше всех остальных событий с письмом, то этот заголовок обычно самый первый (т. е. последний в списке).
From: имя и адрес отправителя (именно в этом заголовке появляется текстовое поле с именем отправителя). Может не совпадать с return-path и даже не совпадать с заголовком SMTP MAIL FROM:.
Sender: отправитель письма. Добавлено для возможности указать, что письмо от чьего-то имени (from) отправлено другой персоной (например, секретаршей от имени начальника).
To: имя и адрес получателя. Может содержаться несколько раз (если письмо адресовано нескольким получателям). Может не совпадать с полем SMTP RCPT TO.
cc: (от англ. carbon copy). Содержит имена и адреса вторичных получаетелей письма, к которым направляется копия.
bcc: (от англ. blind carbon copy). Содержит имена и адреса получателей письма, чьи адреса не следует показывать другим получателям. Это поле, обычно, обрабатывается почтовым сервером. Каждый из получателей не будет видеть в этом поле других получателей из поля bcc.
Reply-To: имя и адрес, куда следует адресовать ответы на это письмо.
Message-ID: уникальный идентификатор сообщения. Состоит из адреса узла-отправителя и номера (уникального в пределах узла). Алгоритм генерации уникального номера зависит от сервера/клиента. Выглядит примерно так: AAB77AA2175ADD4BACECE2A49988705C0C93BB7B4A@example.com.
In-Reply-To: указывает на Message-ID, для которого это письмо является ответом (с помощью этого почтовые клиенты могут легко выстраивать цепочку переписки каждый новый ответ содержит Message-ID для предыдущего сообщения).
Subject: тема письма.
Date: дата написания письма.
Content-Type: тип содержимого письма. С помощью этого поля указывается тип (HTML, RTF, Plain text) содержимого письма и кодировка, в которой создано письмо.
Тело письма
Тело письма отделяется от заголовка пустой строкой, а заканчивается (согласно стандартам SMTP) строчкой, состоящей из единственной точки (и символа перевода строки).
В не-smtp стандартах формат письма зависит от стандарта системы (например, MAPI), но перед «выходом» письма за пределы MAPI-совместимой системы (например, перед пересылкой через Интернет) обычно приводится к SMTP-совместимому виду (иначе маршрутизация письма была бы невозможной, так как стандартом передачи почты в Интернете является SMTP).
Одним из существенных ограничений стандартов на почтовую пересылку является применение 7-битной кодировки (ASCII). Для английского текста это не представляет особой проблемы, однако большинство неанглоязычных языков использует 8-битные и более кодировки, передача которых без искажений не гарантируется. Для целей совместимости, все не 7-битные кодировки приводятся в 7-битный вид (используя различные методы кодирования текста).
Цепочки писем
Благодаря наличию в письме уникального идентификатора, а также тому, что подавляющее большинство почтовых клиентов при ответе на письмо копирует его идентификатор в поле «In-Reply-To» («в ответ на»), появляется возможность достоверной группировки писем по цепочке (англ. thread). В разных почтовых клиентах это реализовано по-разному.
Почтовые рассылки
Почтовая система позволяет организовать сложные системы, основанные на пересылке почты от одного ко многим абонентам.
Нежелательные почтовые рассылки называются спамом и существенно осложняют функционирование почтовых систем.
Для управления почтовыми рассылками используются менеджеры почтовых рассылок. Помимо ведения списка адресов и выполнения отсылки заданного сообщения они обеспечивают фильтрацию писем, возможности премодерации писем перед помещением в рассылку, ведение архивов, управление подпиской/отпиской, рассылку дайджестов (краткого содержимого) вместо всего объема рассылки.
Спам
Электронная почта по мере роста популярности начала использоваться для рассылки незапрошенных рекламных сообщений, аналогично тому, как раскидываются рекламные брошюры в обычные почтовые ящики. Однако, в отличие от существенной стоимости бумажной рассылки, отправка значительного количества (миллионов и миллиардов) сообщений практически ничего не стоит отправителю. Это привело к непропорциональному росту количества и размера рекламных рассылок. По мере ужесточения запрета на размещение рекламы, сообщения разделились на легитимные рассылки (на которые обычно подписывается пользователь и от которых он может отказаться в любой момент) и нелегитимные (собственно и называемые спамом). Для рассылки спама в настоящий момент активно используются все возможные технические ухищрения (открытые релеи, ботнеты, поддельные сообщения о невозможности доставки, прокси-серверы, бесплатные серверы электронной почты, допускающие автоматизацию отправки почты).
По утверждению лаборатории Касперского, в мае 2009 года объем спама составил 7090 % от общей почтовой переписки (т. е. превысил объем полезной почтовой нагрузки в 210 раз). Для борьбы со спамом были разработаны различные механизмы (черные списки отправителей, серые списки, требующие повторного обращения почтового сервера для отправки, контекстные фильтры). Одним из последствий внедрения средств борьбы со спамом стала вероятность «ошибочно положительного» решения относительно спама, т. е. часть писем, не являющихся спамом, стала помечаться как спам. В случае агрессивной антиспам-политики (уничтожение писем, кажущихся спамом, в автоматическом режиме без уведомления отправителя/получателя) это приводит к труднообнаруживаемым проблемам с прохождением почты.
Шифрование почты
Для шифрования почты в настоящий момент широко применяются два стандарта: S/MIME (использующий инфраструктуру открытых ключей) и Open PGP (использующий сертификаты со схемой доверия).
Стандарты S/MIME и Open PGP позволяют обеспечить три вида защиты:
Дополнительно, S/MIME третьей версии позволяет использовать защищенное квитирование (при котором квитанция о получении письма может быть сгенерирована успешно только в том случае, если письмо дошло до получателя в неизменном виде).
Оба стандарта используют симметричные криптоалгоритмы для шифрования тела письма, а симметричный ключ шифруют с использованием откытого ключа получателя. Если письмо адресуется группе лиц, то симметричный ключ шифруется по очереди каждым из открытых ключей получателей (и иногда, для удобства, открытым ключом отправителя, чтобы он имел возможность прочитать отправленное им письмо).
MxA-классификация
В терминологии электронной почты выделяется несколько компонентов.
Рис. 38.1. Взаимоотношения MTA, MDA и MUA при передаче электронной почты
В случае использования веб-интерфейса MDA и MUA могут совпадать. В случае использования выделенных серверов для хранения почты пользователей всё взаимодействие пользователя с сервером может происходить по протоколам, не укладывающимся в эту схему.
Почтовые серверы обычно выполняют роль MTA и MDA. Некоторые почтовые серверы (программы) выполняют роль как MTA, так и MDA, некоторые подразумевают разделение на два независимых сервера: сервер-MTA и сервер-MDA (при этом если для доступа к ящику используются различные протоколы, например, POP3 и IMAP, то MDA в свою очередь может быть реализован либо как единое приложение, либо как набор приложений, каждое из которых отвечает за отдельный протокол).
Большие почтовые программы, так называемые программы «всё в одной», такие как Mozilla Thunderbird, The Bat! и Microsoft Outlook, сегодня комбинируют работу MSA, MDA и MRA в одном приложении.
В отличие от почтового сервера, клиент электронной почты обычно отправляет сообщение не прямо на соответствующий сервер получателя, а на один и тот же почтовый сервер, который выступает как релей. Обычно это почтовый сервер провайдера или компании. Отправка почты чаще всего осуществляется по протоколу SMTP.
Клиент электронной почты принимает почту с одного или нескольких почтовых серверов, часто это тот же самый сервер, который служит для отправки. Прием почты обычно осуществляется по протоколам POP или IMAP.
Также в функции клиента электронной почты может входить: сортировка, хранение сообщений, поиск по архиву сообщений, ведение адресной книги, фильтрация принимаемых сообщений по разным критериям, конвертация форматов, шифрование, организация интерфейсов с офисными программами и другие функции.
.1. Понятие компьютерного преступления и защиты информации
← 38.3. Контрольные вопросы и задания |
39.2. Состав компьютерных преступлений → |
Компьютерные преступления настолько разнообразны, что до сих пор не существует единого понятия компьютерной преступности. Первоначально использовалось понятие «преступление с использованием компьютера», поскольку было признано, что дать определение компьютерного преступления чрезвычайно сложно. Но не всякое незаконное использование компьютерной системы содержит признаки состава компьютерного преступления в уголовно-правовом смысле. В дальнейшем термин«преступление с использованием компьютера» заменили на«преступление, связанное с использованием информационных технологий».
В узком смысле компьютерное преступление это преступление, которое невозможно совершить без использования компьютера или другого автоматического устройства. В широком использование компьютера или автоматического устройства как объекта или инструмента совершения преступления.
В связи с неопределенностью понятия компьютерного преступления отсутствует и сложившееся определение компьютерной преступности как криминологического понятия. А выработка такого понятия, определение его объема необходимы для разработки единых мер предупреждения этого вида преступности.
Несмотря на ряд особенностей, информация рассматривается законом как объект права собственности.
Под собственником информации (информационных ресурсов, систем, технологий и средств их обеспечения) понимается субъект, в полной мере реализующий полномочия владения, пользования и распоряжения информацией.
Пользователем информации признается субъект, обращающийся к информационной системе за получением необходимой ему информации и пользующийся ею.
Действия лиц, не являющихся собственником информационных ресурсов, систем, технологий и средств их обеспечения, а также не являющихся законными пользователями информации, признаются нарушением и, следовательно, влекут за собой юридическую ответственность.
Охраняемая законом компьютерная информация это информация ограниченного доступа, которая не только имеет специальный правовой статус, установленный соответствующими законами, но и по своему характеру предназначена для ограниченного круга лиц (пользователей), имеющих право на ознакомление и работу с ней.
Под информацией с ограниченным доступом понимаются сведения, доступ к которым ограничен в соответствии с законом с целью защиты прав и законных интересов субъектов права на тайну.
Информация с точки зрения информационной безопасности обладает следующими категориями:
Законодательство РФ устанавливает ряд обязательных признаков и условий защиты права на информацию с ограниченным доступом. Условием правовой защиты информации с ограниченным доступом, должна быть ее защита. При этом Федеральным законом «Об информации, информатизации и защите информации» (1995 г.) указывается следующие цели защиты информации:
39.2. Состав компьютерных преступлений
← 39.1. Понятие компьютерного преступления и... |
39.3. Объекты нападений компьютерных... → |
В России сам термин «компьютерная преступность» появился довольно давно, одновременно с внедрением в различные сферы деятельности компьютерной техники. Однако законодательное закрепление преступлений в сфере компьютерной информации произошло лишь с введением в действие в 1997 году Уголовного кодекса Российской Федерации, где появилась отдельная глава, предусматривающая ответственность за неправомерный доступ к компьютерной информации, создание и распространение вредоносных программ, нарушение правил эксплуатации ЭВМ или их сети (ст. 272274 УК РФ). Рассмотрим подробнее все три статьи УК РФ.
Статья 272. Неправомерный доступ к компьютерной информации
наказывается штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев, либо исправительными работами на срок от шести месяцев до одного года, либо лишением свободы на срок до двух лет.
наказывается штрафом в размере от пятисот до восьмисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от пяти до восьми месяцев, либо исправительными работами на срок от одного года до двух лет, либо арестом на срок от трех до шести месяцев, либо лишением свободы на срок до пяти лет.
Данная статья защищает право владельца на неприкосновенность информации в системе. Владельцем информационной вычислительной системы может быть любое лицо, правомерно пользующееся услугами по обработке информации как собственник вычислительной системы (ЭВМ, сети ЭВМ) или как лицо, приобретшее право использования компьютера.
Преступное деяние, ответственность за которое предусмотрено ст. 272, должно состоять в неправомерном доступе к охраняемой законом компьютерной информации, который всегда носит характер совершения определенных действий и может выражаться в проникновении в компьютерную систему путем использования специальных технических или программных средств, позволяющих преодолеть установленные системы защиты; незаконного применения действующих паролей или маскировка под видом законного пользователя для проникновения в компьютер, хищения носителей информации, при условии, что были приняты меры их охраны, если это деяние повлекло уничтожение или блокирование информации.
Неправомерным признается доступ к защищенной компьютерной информации лица, не обладающего правами на получение и работу с данной информацией, либо компьютерной системой.
Наиболее известным преступлением подобного рода является содеянное российским программистом Владимиром Левиным. В группе с рядом других граждан Российской Федерации и зарубежных стран он осуществил несколько десятков несанкционированных переводов денег со счетов крупных иностранных банков и корпораций клиентов крупнейшего в мире City Bank of America. В результате этой группой было осуществлено не менее 40 переводов денежных средств на общую сумму 10 млн 700 тыс. 952 доллара США со счетов клиентов названного банка на счета лиц, входящих в состав преступной группы, проживающих в шести странах: США, Великобритании, Израиле, Швейцарии, ФРГ и России.
Статья 273. Создание, использование и распространение вредоносных программ для ЭВМ
наказываются лишением свободы на срок до трех лет со штрафом в размере от двухсот до пятисот минимальных размеров оплаты труда или в размере заработной платы или иного дохода осужденного за период от двух до пяти месяцев.
наказываются лишением свободы на срок от трех до семи лет.
Статья предусматривает уголовную ответственность за создание программ для ЭВМ или их модификацию, заведомо приводящее к несанкционированному уничтожению, блокированию и модификации либо копированию информации, нарушению работы информационных систем, а равно использование таких программ или машинных носителей с такими программами.
Статья защищает права владельца компьютерной системы на неприкосновенность находящейся в ней информации.
Под созданием вредоносных программам в смысле ст. 273 УК РФ понимаются программы, специально разработанные для нарушения нормального функционирования компьютерных программ. Под нормальным функционированием понимается выполнение операций, для которых эти программы предназначены, определенные в документации на программу. Наиболее распространенными видами вредоносных программ являются широко известные компьютерные вирусы и логические бомбы.
Под использованием программы понимается выпуск в свет, воспроизведение, распространение и иные действия по их введению в оборот. Использование может осуществляться путем записи в память ЭВМ, на материальный носитель, распространения по сетям либо путем иной передачи другим лицам.
Уголовная ответственность по этой статье возникает уже в результате создания программы, независимо от того, использовалась эта программа или нет.
В качестве примера приведем действия вируса известного как «CIH» (другое название «Чернобыль»). Впервые он был обнаружен «в живом виде» на Тайване в июне 1998 года автор вируса заразил компьютеры в местном университете, где он (автор вируса) в то время проходил обучение. Через некоторое время зараженные файлы были разосланы в местные Интернет-конференции и вирус выбрался за пределы Тайваня: за последующую неделю вирусные эпидемии были зарегистрированы в Австрии, Австралии, Израиле и Великобритании. Затем вирус был обнаружен и в нескольких других странах, включая Россию.
Примерно через месяц зараженные файлы были обнаружены на нескольких американских веб-серверах, распространяющих игровые программы. Этот факт, видимо, и послужил причиной последовавшей глобальной вирусной эпидемии. 26 апреля 1999 года (примерно через год после появления вируса) сработала «логическая бомба», заложенная в его код. По различным оценкам, в этот день по всему миру пострадало около полумиллиона компьютеров у них оказались уничтожены данные на жестком диске, а на некоторых плюс к тому испорчено содержимое микросхем BIOS на материнских платах. Данный инцидент стал настоящей компьютерной катастрофой вирусные эпидемии и их последствия никогда до того не были столь масштабными и не приносили таких убытков.
Статья 274. Нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети
наказывается лишением права занимать определенные должности или заниматься определенной деятельностью на срок до пяти лет, либо обязательными работами на срок от ста восьмидесяти до двухсот сорока часов, либо ограничением свободы на срок до двух лет.
наказывается лишением свободы на срок до четырех лет.
Статья 274 УК устанавливает ответственность за нарушение правил эксплуатации ЭВМ, системы ЭВМ или их сети лицом, имеющим доступ к ним, повлекшее уничтожение, блокирование или модификацию охраняемой законом информации, если это деяние причинило существенный вред.
Статья защищает интерес владельца вычислительной системы относительно ее правильной эксплуатации.
Предусмотренные составы компьютерных преступлений не охватывают полностью всех видов совершения компьютерных посягательств. Хотя, возможно, в этом случае будут «оказывать помощь» статьи 146 УК РФ (нарушение авторских и смежных прав) и 147 УК РФ (нарушение изобретательских и патентных прав), дающие возможность уголовного преследования за незаконное использование программного обеспечения.
Целью защиты информации является гарантирование законных прав различных категорий пользователей на обеспечение возможности разграничения доступа к информации.
39.3. Объекты нападений компьютерных преступлений
← 39.2. Состав компьютерных преступлений |
39.4. Приемы компьютерных преступлений → |
Различные организации могут подвергаться компьютерным атакам по разным причинам и с разными последствиями.
Информация о новых вооружениях, планы военных и разведслужб все это интересует секретные службы многих государств. Наиболее известным случаем такого рода преступлений является попытка воровства информации с компьютеров ЦРУ немецким программистом Матиасом Шпеером.
Особая форма недобросовестной конкуренции, позволяющая получать доступ к секретам фирм-конкурентов с целью экономии средств и времени на разработку технологий, склонения фирмы-конкурента к сотрудничеству или преднамеренного блокирования работы.
Используемые в банковской сфере электронные платежи являются целью профессиональных преступников для получения прибыли.
Нанести ущерб противной стороне можно путем создания сбоев в системах различных служб, таких как водоснабжения или энергоснабжения. Или подавлять работу информационных служб. Элементы таких атак можно было наблюдать в военном конфликте России и Грузии в августе 2008 году.
Бывшие сотрудники фирмы (например, считающих себя незаконно уволенными), имеющие доступ к компьютерным системам своих бывших работодателей, могут уничтожить данные или похитить ценную информацию.
К этой группе относится определенный сорт людей, которым нравится разрушать чужую собственность. Как правило, эти люди не ставят целью похищение материальных ценностей, но, тем не менее, ущерб от их действий может быть велик.
Обычно это молодежь, осваивающая новые технологии и пытающаяся самореализоваться. Как правило, взломы систем такой категорией людей не приводят к серьезным последствиям и даже может способствовать улучшению безопасности компьютерных систем при доведении способов взлома до владельцев системы. Известны случаи, когда фирма принимала на работу человека способного взломать систему, принадлежащую ей. Так некто Эшли Таунс, написавший вирус для iPhone, получил приглашение на работу в фирму Apple.
Рядовые пользователи также подвергаются риску компьютерных атак. Это и попытка получить доступ к личным данным (фотографии, электронная почта) с последующим использованием таких данных, например, для шантажа. Или же похищение реквизитов банковских карт и различных платежных систем с последующей кражей денег с электронных счетов.
Также компьютеры могут быть атакованы с целью перехвата управления. В последующем такой компьютер может быть использован для рассылки спама или организации атаки на другие системы.
39.4. Приемы компьютерных преступлений
← 39.3. Объекты нападений компьютерных... |
39.6. Контрольные вопросы и задания → |
Рассмотрим некоторые приемы, применяемые в компьютерных преступлениях.
Способ, не требующий специфических знаний в области информационных технологий; заключается в том, что путем хищения, разбоя, вымогательства изымаются системные блоки или отдельные носители информации, содержащие важную информацию. Как правило, такие действия квалифицируются как «некомпьютерные» преступления.
Используя средства аудио-, видео- и электромагнитного наблюдения злоумышленники могут получать доступ к важной информации либо к учетным записям пользователей, для последующего несанкционированного доступа. Объектами таких атак становятся линии связи и телекоммуникационное оборудование.
Используется для вывода из строя системы, например, с помощью одновременных множественных запросов к оборудованию. Используется либо для создания условий, при которых «вражеский» ресурс перестанет быть доступен, либо для создания аварийной ситуации, позволяющей перейти к несанкционированному доступу.
В этом случае злоумышленники, используя различные способы (вирусы, перебор паролей, ошибки в программном обеспечении, ошибки в настройках сетевых служб и т.п.), получают доступ к информации, не предназначенной для публичного использования.
40.1. Общие сведения
← 39.6. Контрольные вопросы и задания |
40.2. Шифрование заменой (подстановка) → |
Шифрование это способ преобразования открытой информации в закрытую. Обратный процесс называется дешифровкой. Применяется как эффективное средство для хранения важной информации в ненадежных источниках или передачи ее по незащищенным каналам связи.
Наука, занимающаяся изучением методов шифрования информации, называется криптография. История криптографии насчитывает не одну тысячу лет. В качестве известнейших примеров можно привести «код Цезаря».
Шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки. При шифровании каждый символ заменяется другим, отстоящим от него в алфавите на фиксированное число позиций. Понятно, что такой способ шифрации не дает большой надежности, особенно с учетом возможностей современных компьютеров.
Другим, более сложным, с использованием технических средств, примером шифрования может служить известная по популярным фильмам Энигма портативная шифровальная машина, применявшаяся в первой половине XX века. Данное устройство было взято на вооружение службами нацисткой Германии и позволяло создавать до 10114 комбинаций шифрования. Однако имеющиеся недостатки шифрования позволили аналитикам взламывать существенное количество зашифрованных сообщений.
Важнейшим показателем надежности криптографического закрытия информации является его стойкость (криптостойкость) способность криптографического алгоритма противостоять возможным атакам на него. Стойким считается алгоритм, который для успешной атаки требует от противника недостижимых вычислительных ресурсов, недостижимого объема перехваченных открытых и зашифрованных сообщений или же такового времени раскрытия, что по его истечению защищенная информация будет не актуальна.
Трудоемкость метода шифрования определяется числом элементарных операция, необходимых для шифрования одного символа исходного текста.
Современная криптография включает в себя две задачи. Первая обеспечение конфиденциальности информации (путем шифрования). Вторая обеспечение аутентичности информации (путем использования электронных цифровых подписей).
Рассмотрим некоторые методы шифрования информации.
40.2. Шифрование заменой (подстановка)
← 40.1. Общие сведения |
40.3. Шифрование методом перестановки → |
Шифрование заменой заключается в том, что символы шифруемого текста заменяются символами того же (моноалфавитная подстановка) или другого (полиалфавитная подстановка) алфавита в соответствии с некоторой заранее обусловленной схемой замены.
Примером такого метода служит упомянутый выше «код Цезаря». Такой шифр является очень простым и имеет низкую стойкость. Зашифрованный текст можно вскрыть методом грубой силы (перебор всех возможных комбинаций шифрования) или используя частотный словарь (определение символов по частоте их использования в тексте).
Полиалфавитная подстановка несколько повышает стойкость шифра. Для замены символов используется несколько алфавитов. Первый символ заменяется некоторым символом одного алфавита, второй соответствующим символом второго алфавита и т. д.
40.3. Шифрование методом перестановки
← 40.2. Шифрование заменой (подстановка) |
40.4. Системы с открытым ключом → |
Шифрование перестановкой заключается в том, что символы шифруемого текста переставляются по определенному правилу в пределах некоторого блока этого текста. При достаточной длине блока, в пределах которого осуществляется перестановка, и сложном неповторяющемся порядке перестановки можно достигнуть приемлемой для простых практических приложений стойкости шифра.
Суть метода заключается в следующем. Выбирается размер блока шифрования в n столбцов и m строк и ключевая последовательность, которая формируется из натурального ряда чисел 1,2,...,n случайной перестановкой.
Шифрование проводится в следующем порядке:
Расшифрование выполняется в следующем порядке:
Для повышения стойкости алгоритма используют, например, объемные перестановки
40.4. Системы с открытым ключом
← 40.3. Шифрование методом перестановки |
40.5. Хэш-функции → |
При шифровании особенно важна безопасная передача ключа, используемого для расшифровки текста. Системы с открытым ключом используют для работы два ключа. Открытый ключ нужен для шифрования и он публикуется для всех пользователей системы. Второй ключ предназначен для дешифрования, он секретный, и его нельзя получить, зная открытый ключ.
Схема работы выглядит таким образом:
← 40.4. Системы с открытым ключом |
40.6. Электронная цифровая подпись → |
40.6. Электронная цифровая подпись
← 40.5. Хэш-функции |
40.7. Контрольные вопросы и задания → |
Электронная цифровая подпись реквизит электронного документа, предназначенный для защиты данного электронного документа от подделки и позволяющий идентифицировать владельца сертификата ключа подписи, а также установить отсутствие искажения информации в электронном документе и обеспечить неотказуемость подписавшегося.
В алгоритмах электронной подписи используются секретный и открытый ключи. Причем секретный должен браться абсолютно случайно, например с датчика случайных чисел. Открытый же вычисляется из секретного таким образом, чтобы получить второй из первого было невозможно. В общем случае алгоритм работы следующий:
получив письмо, снабженное электронной подписью, адресат с помощью открытого ключа проверяет ее подлинность. Результат проверки один из ответов: «верна неверна». Электронная подпись подтверждает достоверность сообщения. Если в него в процессе пересылки были внесены какие-либо изменения, пусть даже совсем незначительные, то подмена обнаружится.