.RU

11. ПОКОЛЕНИЯ ЭВМ - Информатика и вычислительная техника калининград 2001


^ 11. ПОКОЛЕНИЯ ЭВМ

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

Таблица 11.1

Параметры сравнения

Поколения ЭВМ

Первое

Второе

Третье

Четвертое

Период времени

1946 - 1959

1960 - 1969

1970 - 1979

С 1980 г.

Элементная база (для УУ, АЛУ)

Электронные (или электрические) лампы

Полупроводники (транзисторы)

Интегральные схемы

Большие интегральные схемы (БИС)

Основной тип ЭВМ

Большие

Большие

Малые (мини)

Микро

Основные устройства ввода

Пульт, перфокарточный и перфоленточный ввод

Добавился алфавитно-цифровой дисплей, клавиатура

Алфавитно-цифровой дисплей, клавиатура

Цветной графический дисплей, сканер, клавиатура

Основные устройства вывода

Алфавитно-цифровое печатающее устройства (АЦПУ), перфоленточный вывод

Алфавитно-цифровое печатающее устройства (АЦПУ), перфоленточный вывод

Графопостроитель, принтер

Графопостроитель, принтер

Внешняя память

Магнитные ленты, барабаны, перфоленты и перфокарты

Добавился магнитный диск

Перфоленты, магнитный диск

Магнитные и оптические диски

Ключевые решения в ПО

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

Пакетные операционные системы, оптимизирующие трансляторы

Интерактивные ОС, структурированные языки программирования

Дружественность ПО, сетевые ОС

Продолжение табл. 11.1

Режим работы ЭВМ

Однопрограммный

Пакетный

Разделения времени

Персональная работа и сетевая обработка данных

Цель использования ЭВМ

Научно-технические расчеты

Технические и экономические расчеты

Управления и экономические расчеты

Телекоммуникации, информационное обслуживание и управление


ЭВМ первого поколения обладали небольшим быстродействием в несколько десятков тыс. оп./сек. В качестве внутренней памяти применялись ферритовые сердечники.

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

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

Языков программирования как таковых еще не было, и для кодирования своих алгоритмов программисты использовали машинные команды или ассемблеры. Это усложняло и затягивало процесс программирования. К концу 50-х годов средства программирования претерпевают принципиальные изменения: осуществляется переход к автоматизации программирования с помощью универсальных языков и библиотек стандартных программ. Использование универсальных языков повлекло возникновение трансляторов.

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

Начало современной эры использования ЭВМ в нашей стране относят к 1950 году, когда в институте электротехники АН УССР под руководством С.А. Лебедева была создана первая отечественная ЭВМ под названием МЭСМ – Малая Электронная Счетная Машина. В течение первого этапа развития средств вычислительной техники в нашей стране создан ряд ЭВМ: БЭСМ, Стрела, Урал, М-2.

^ Второе поколение ЭВМ – это переход к транзисторной элементной базе, появление первых мини-ЭВМ.

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

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

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

Совершенствуется технология выполнения программ на ЭВМ: создаются специальные программные средства - системное ПО.

Цель создания системного ПО – ускорение и упрощение перехода процессором от одной задачи к другой. Появились первые системы пакетной обработки, которые просто автоматизировали запуск одной программ за другой и тем самым увеличивали коэффициент загрузки процессора. Системы пакетной обработки явились прообразом современных операционных систем, они стали первыми системными программами, предназначенными для управления вычислительным процессом. В ходе реализации систем пакетной обработки был разработан формализованный язык управления заданиями, с помощью которого программист сообщал системе и оператору, какую работу он хочет выполнить на вычислительной машине. Совокупность нескольких заданий, как правило, в виде колоды перфокарт, получила название пакета заданий. Этот элемент жив до сих пор: так называемые пакетные (или командные) файлы MS DOS есть не что иное, как пакеты заданий (расширение в их имени bat является сокращением от английского слова batch, что означает пакет).

К отечественным ЭВМ второго поколения относятся Проминь, Минск, Раздан, Мир.

В 70-х годах возникают и развиваются ЭВМ третьего поколения. В нашей стране это ЕС ЭВМ, АСВТ, СМ ЭВМ. Данный этап - переход к интегральной элементной базе и создание многомашинных систем, поскольку значительного увеличения быстродействия на базе одной ЭВМ достичь уже не удавалось. Поэтому ЭВМ этого поколения создавались на основе принципа унификации, что позволило комплексировать произвольные вычислительные комплексы в различных сферах деятельности.

Расширение функциональных возможностей ЭВМ увеличило сферу их применения, что вызвало рост объема обрабатываемой информации и поставило задачу хранения данных в специальных базах данных и их ведения. Так появились первые системы управления базами данных – СУБД.

Изменились формы использования ЭВМ: введение удаленных терминалов (дисплеев) позволило широко и эффективно внедрить режим разделения времени и за счет этого приблизить ЭВМ к пользователю и расширить круг решаемых задач.

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

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

Наиболее значительным стало появление персональных ЭВМ, что позволило приблизить ЭВМ к своему конечному пользователю. Компьютеры стали широко использоваться неспециалистами, что потребовало разработки "дружественного" программного обеспечения. Возникают ОС, поддерживающие графический интерфейс, интеллектуальные ППП, операционные оболочки. В связи с возросшим спросом на ПО совершенствуются технологии его разработки – появляются развитые системы программирования, инструментальные среды пользователя.

В середине 80-х стали бурно развиваться сети персональных компьютеров, работающие под управлением сетевых или распределенных ОС. В сетевых ОС хорошо развиты средства защиты информации от несанкционированного доступа. Распределенные ОС обладают схожими с сетевыми системами функциями работы с файлами и другими ресурсами удаленных компьютеров, но там слабее выражены средства защиты.
^ 12. ТЕХНОЛОГИЯ ПРОЕКТИРОВАНИЯ ПРОГРАММ

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

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







Заказчик Математик или Программист

системотехник




Рис. 12.1. Традиционная технология подготовки задачи к решению на ЭВМ


Здесь связи означают:

1 – заказчик на естественном (например, русском) языке объясняет математику или системотехнику, какую прикладную задачу он хочет решить. Эта задача из некоторой предметной области, например, задача бухгалтерского учета или зачисления абитуриентов в ВУЗ;

2 – математик (или системотехник) формализует задачу, представляя ее в виде математической модели или составляя строгое формальное описание процедуры ее решения, входных и выходных данных. Этот этап называется формализацией задачи;

3 - программист на основании математической модели или другого формального описания поставленной задачи разрабатывает программу. Он выполняет также отладку программы, используя для этого ЭВМ. Этот этап называется программированием задачи;

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

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

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

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

Итак, процесс зачисления происходит описанным ниже образом:

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

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

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

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

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

Результат решения – список студентов первого курса в виде списка фамилий, имен, отчеств.

Формализация выполнена. Ее результат – описание решения в виде последовательности шагов, входные и выходные данные.

Пример 12.2. Пусть на первый курс по некоторой специальности зачислено N студентов. По результатам каждой сессии в течение первых четырех семестров часть студентов отчисляется за неуспеваемость в указанных среднестатистических количествах:

семестр, x 1 2 3 4

число отчисленных, y 20 5 2 1.

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

Эта задача относится к классу задач экстраполяции функций: определить значение функции y в точке x (x  x0, xn), если известны (n+1) значений функции y в точках x0, x1 x2, …, xn.

Решим задачу двумя способами.

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


Рис. 12.2. Диаграмма для задачи 12.2


Как видно из рис. 12.2, сформированная функциональная зависимость имеет вид:

y(x) = 20,777 x-2,1513,

где y – число отчисленных студентов;

x – номер семестра.

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

st = N – y (10),

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

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

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

В
соответствии с принятыми выше обозначениями имеем:

где yi – число отчисленных студентов в i-м семестре;

p
i(10) – коэффициент Лагранжа, который рассчитывается по формуле:

и имеет значения из множества {p1(10), p2(10), p3(10), p4(10)}.

Задача решена.
^ 12.2. Программирование задачи
Технология программирования задач различается для операторных и функциональных языков программирования. Ограничимся рассмотрением вопроса для операторных языков. Тогда этот этап разбивается на два последовательных шага – разработку алгоритма и отладку программы.
^ 12.2.1. Разработка алгоритма
Алгоритм – это точное предписание, определяющее вычислительный процесс, ведущий от исходных данных к искомому результату.

Алгоритм обладает следующими свойствами (они следуют из определения):

  1. определенность (детерминированность) – каждая команда (или предписание) понятна исполнителю (человеку или компьютеру) и исключает неоднозначность исполнения;

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

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

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

Различают следующие простейшие виды алгоритмов:

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

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

  3. циклический, когда предписания алгоритма выполняются многократно. В зависимости от характера повторений различают циклические алгоритмы с заданным и незаданным числом повторений (в этом случае такие алгоритмы называют итерационными).
^ 12.2.1.1. Способы описания алгоритма
Существуют следующие способы описания алгоритма: словесный, структурно-стилизованный, язык графических символов, операторный язык.

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

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

А::=В,

где А – определяемое продукцией понятие,

В – понятие или группа понятий, которые служат для раскрытия структуры понятия А;

знак «::=» имеет смысл «есть по определению».

Пример 12.3. Определим структуру понятия «оператор ввода» для Турбо-Паскаля. В соответствии с правилами этого языка, оператор ввода содержит название оператора (read) и операнд, показывающий, значения каких переменных вводятся; заканчивается оператор точкой с запятой. Таким образом, в состав оператора ввода входят две строковые постоянные величины – “read” и “;” и одна строковая переменная величина – операнд, который может включать произвольный по числу и составу набор имен переменных.

Для различения строковых постоянных и переменных условимся переменные заключать в угловые скобки, например, , а постоянные – в кавычки, например, “read”. Тогда, очевидно, и само понятие «оператор ввода» является переменной величиной.

Запишем определения переменных с помощью упомянутой нотации:

::= “read” “;” . (12.1)

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

::= “(“ “)” , (12.2)

::= [“,” ] . (12.3)

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

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

^ Язык графических символов предполагает соотнесение каждому типу действий геометрической фигуры, представленной в виде блочного символа. Действия (блоки) соединяются линиями потока. Совокупность таких связанных блоков называется блок-схемой. Составление блок-схем регламентируется ГОСТ 19.003-80 и ГОСТ 19.002-80. Основными блоками, используемыми в блок-схемах, являются следующие:


Блок Название Характеристика

процесс Для обозначения одного или нескольких действий,

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

размещения данных.

решение Выбор направления выполнения алгоритма

в зависимости от некоторых переменных условий.

Должен содержать вопрос, решение, условие или сравнение. Выходящие линии потока помечаются ДА и НЕТ или другим способом для учета всех возможных ответов.




модификация Для организации циклических конструкций. Внутри записывается параметр цикла и закон его изменения. В блок-схеме этот блок помещается всегда в начале цикла. Имеет фиксированные входы и выходы.




предопределенный Предполагает использование ранее созданных и

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

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


пуск-останов Определяет начало и конец алгоритма. Содержит, соответственно, буквы Н или К.


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

соединитель потока, соединяющими блоки на одной странице.

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

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

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

Внутри пишется номер страницы и номер блока, откуда или куда передается управление.




комментарий Сопровождает блок, если в нем не поместились

нужные данные.



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




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

Блоки: процесс, решение, модификация, предопределенный процесс, ввод-вывод, останов имеют единый вход (т.е. входящую линию потока), который располагается вверху блока.

Например, для блока «процесс»:







Блоки: процесс, предопределенный процесс, ввод-вывод, пуск имеют единый выход (т.е. выходящую линию потока), который располагается внизу блока. Например, для блока «процесс»:







Блок «решение» имеет как минимум два выхода, которые подписываются словами ДА и НЕТ, например,


ДА

НЕТ




Блок «модификация» имеет выходы и входы (кроме входа в блок) со следующими значениями:



  1. связь 1 – возврат к началу цикла. Имеет место, когда параметр цикла не превысил своего максимального значения;

  2. связь 2 – вход в тело цикла;

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

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







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




Выход из этого блока допускается только снизу, например:







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

  1. должны быть параллельны внешним краям рамки листа;

  2. допускается пересечение линий потока или изгиб под углом 90, например:





  1. для обозначения слияния место слияния обозначается точкой, например:








  1. направление линий потока сверху вниз и слева направо считается основным. В противном случае, направление указывается стрелкой;

  2. расстояние между параллельными линиями потока не менее 3 мм, между остальными символами схемы не менее 5 мм.

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

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

  1. первые языки программирования – это машинные коды – аналог машинных команд. Структура команды включает код операции (как правило, числовой) и список операндов. Программирование требовало от программиста распределение переменных и команд по доступным адресам памяти, для чего необходимо было знать требуемые объемы команд и переменных. Для вычислений также использовался специальный регистр процессора - сумматор. В качестве операндов выступали не переменные, а их адреса. Например, пусть память компьютера, которой располагает программист, содержит адреса от 1 до 100, по каждому из которых доступен байт памяти. Нужно запрограммировать вычисление переменной z по формуле: z = a + b, причем a = 8, b = 10. Пусть имеется набор двухадресных машинных команд, включающий, в частности, команды:

код объем действие

операции

124 3 б сложить операнды, результат – в сумматоре,

125 2 б поместить содержимое сумматора по адресу,

126 3 б поместить константу по адресу.

Программист распределяет переменные (с учетом размера их значений) по адресам:

переменная требуемый объем памяти адрес

a 1 б 1

b 1 б 2

z 1 б 3


Тогда вся программа будет выглядеть следующим образом:

адрес содержимое комментарий

памяти памяти

1 - для переменной a.

2 - для переменной b.

3 - для переменной z.

4 126 8,1 константа 8 помещается по адресу 1, т.е. вычисляется a = 8. После этого действия содержимое памяти по адресу 1 становится равным 8.

7 126 10,2 константа 10 помещается по адресу 2, т.е. вычисляется b = 10. после этого действия содержимое памяти по адресу 2 становится равным 10.

10 124 1,2 содержимое адресов 1 и 2 складывается, т.е. вычисляется a+b. Результат – в сумматоре.

13 125 311 содержимое сумматора размещается по адресу 3, т.е. выполняется присваивание z=a+b. После этого действия содержимое памяти по адресу 3 становится равным 18.


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

  1. автокоды явились развитием машинных кодов, когда числовые коды операций заменились мнемоническими обозначениями, по которым можно восстановить смысл операции, а в адресной части можно было использовать имена переменных, а не их адреса. Например, числовые коды операций 124 и 125 из предыдущего примера заменились мнемоническими кодами, соответственно, ADD (сложить, англ.) и MOVE (поместить, англ.). Тогда предыдущая задача для двухадресного кода запишется так:

команда комментарии

MOVE 8,a константа 8 помещается в переменную а.

MOVE 10,b константа 10 помещается в переменную b.

ADD b,a содержимое переменных a и b складывается.

MOVE z результат помещается в переменную z.

Автокоды современных ЭВМ образуют группу языков, которые называются ассемблерами. И автокоды, и машинные коды являются машинно-зависимыми языками программирования: состав и структура команд полностью соответствует составу и структуре команд ЭВМ.

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

var integer a,b,z;

a:=8; b:=10;

z:=a+b; .

Запись средствами Бэйсика еще проще, так как он не требует предварительного описания переменных и констант:

a=8

b=10

z=a+b .

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

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

  1. при написании программы надо учитывать общие особенности процесса вычислений на ЭВМ, например, бессмысленно сравнивать два вещественных выражения А и В в силу погрешности вычислений (это обсуждалось ранее при описании процесса перевода чисел из одной системы счисления в другую, а также при выполнении сложения с плавающей точкой). В этом случае сравнение «А = В» заменяется проверкой |А - В| << , где 0;

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

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

  4. рекомендуется снабжать текст программы комментариями в количестве 1 комментарий на 2 – 3 строки текста (в среднем);

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

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

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

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

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

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

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




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














  1. конструкция принятия двоичного решения. Применяется для представления разветвляющихся алгоритмов. Описывается языком графических символов следующим образом:



Пример 12.3. Разработать блок-схему для задачи из примера 12.1, используя принципы нисходящего проектирования, модульности и структурного программирования.

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

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

  2. ввод и анализ оценок по каждому экзамену по каждому абитуриенту. В результате анализа возможно исключение абитуриента из списка. Число абитуриентов известно после решения первой подзадачи. Количество экзаменов известно заранее;

  3. упорядочение списка абитуриентов в зависимости от оценок. Здесь возможно использовать не сами оценки, а средний балл по аттестату и средний балл за вступительные экзамены;

  4. определение нужного подмножества абитуриентов для зачисления. Число студентов набора известно заранее.

В соответствии с выделенными подзадачами определим четыре модуля, взаимосвязь которых представлена на рис. 12.2
































Рис. 12.2. Укрупненная блок-схема для примера 12.1


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

  1. от блока ^ Ввод и размещение в блок Ввод и анализ передаются следующие данные: список абитуриентов (фамилии и инициалы), средний балл по аттестату, количество абитуриентов;

  2. от блока Ввод и анализ блоку Упорядочение передаются: список абитуриентов, средний балл по аттестату и средний балл за вступительные экзамены;

  3. от блока Упорядочение блоку Определение передается список абитуриентов и число тех, кто сдал вступительные экзамены.

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

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

Рассмотрим подробнее эти блок-схемы.

1. Модуль Ввод и размещение. В блоке 1 переменной CHISLO присваивается начальное нулевое значение – выполняется ее подготовка к накоплению числа абитуриентов,






1

2

3







Здесь вводятся FIO, ATTECTAT_OCENKI




ДА Для определения конца ввода вместо фамилии вводится условный знак



4

5

6
НЕТ

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

среднего арифметического всех оценок

в аттестате


В список помещаются FIO,

SR_ATTECTAT




Накопление числа абитуриентов







Рис. 12.3. Блок-схема модуля Ввод и размещение






1

2

3

4

5

6

7

8

9

Здесь вводится переменная EXAMINE






10





11








Здесь вводится

BCTUPIT_

OCENKI(i)




НЕТ




ДА














Рис. 12.4. Блок-схема для модуля Ввод и анализ







1

2

3

4

5

6
















Здесь выполня-

ется анализ НЕТ

SR_BCTUPIT(j-1)

< SR_BCTUPIT(j)

ДА Здесь выполняется

анализ ДА

SR_BCTUPIT(j-1)

= SR_BCTUPIT(j)

НЕТ




Здесь выполняется

анализ SR_ATTECTAT(j-1) НЕТ

< SR_ATTECTAT(j)





7
ДА




Рис.12.5. Блок-схема для модуля Упорядочение






1

2

3

4

5






НЕТ


ДА


Рис. 12.6. Блок-схема модуля Определение

которое осуществляется в цикле в блоке 6. В блоке 2 вводятся исходные данные по одному абитуриенту – его фамилия, имя, отчество, список оценок по аттестату. Данные заносятся в соответствующие переменные (см. комментарий к блоку). Для прерывания цикла задаются специальным знаком, ввод которого свидетельствует об окончании ввода списка абитуриентов. Этот анализ выполняется в блоке 3. Если достигнут конец списка абитуриентов (выход ДА), алгоритм прекращает свою работу. Если конец цикла не достигнут (выход НЕТ), рассчитывается среднее арифметическое значение оценок в аттестате (блок 4). Затем фамилия, имя, отчество и средний балл по аттестату запоминаются на диске (блок 5).

2. Модуль ^ Ввод и анализ. В блоке 1 вводится число вступительных экзаменов. В блоке 2 формируется начальное (равное нулю) значение числа отчисленных абитуриентов: эта переменная нужна для определения реального числа абитуриентов, сдавших экзамены и допущенных к зачислению. В блоке 3 организуется циклический процесс, позволяющий по каждому вступительному экзамену выполнить ввод соответствующих оценок по каждому абитуриенту. Обращение ко всем абитуриентам организуется с помощью блока 4. Если введенная оценка равна 2, абитуриент исключается из списка, размещенного на диске (блок 7). В противном случае оценка добавляется к списку оценок абитуриента (блок 9). Внутри цикла формируется также число отчисленных абитуриентов (блок 8). Таким образом, данный алгоритм является примером вложенной циклической структуры, когда один циклический процесс вложен в другой. По окончании цикла определяется число оставшихся абитуриентов (блок 10) и рассчитывается средний балл за вступительные экзамены по каждому абитуриенту (блок 11). Результат последнего расчета помещается в список абитуриентов на диск.

3. Модуль Упорядочение. В этом модуле реализован один из методов упорядочения списка по убыванию значений элементов (в нашем случае по убыванию средних баллов по вступительным экзаменам и по аттестату). Идея метода состоит в том, что последовательно, начиная с первого элемента списка, сравниваются два рядом стоящих элемента. Если последующий элемент больше предыдущего, они меняются местами. Таким образом, если в списке n элементов, указанное сравнение выполняется (n-1) раз по количеству различных пар. Чтобы учесть соотношение не только рядом стоящих, но и разнесенных по списку элементов, описанный анализ пар элементов выполняется (n-1) раз. Иначе говоря, этот метод представляется вложенным циклическим алгоритмом (блоки 1 и 2). В блоке 3 сравниваются два рядом стоящих элемента в списке своими средними оценками за вступительные экзамены: если последующий элемент (абитуриент) имеет средний балл больше, чем предыдущий элемент, выполняется блок 4 и элементы меняются местами; иначе выполняется блок 5. В этом случае определяется, равны ли средние баллы за вступительные экзамены у рядом стоящих элементов в списке. Если это так (выход ДА из блока 5), в расчет берутся средние баллы за аттестат (блок 6): преимущества имеет тот абитуриент, у которого больше средний балл по аттестату при равных оценках на вступительных экзаменах. Если же окажется, что средний балл за вступительные экзамены у последующего элемента списка меньше, чем у предыдущего (выход НЕТ у блока 5), элементы местами не меняются – они и так упорядочены по убыванию среднего балла за вступительные экзамены. В блоке 6 анализируются средние баллы за аттестат. Этот анализ выполняется только тогда, когда средние оценки по вступительным экзаменам одинаковые у рядом стоящих в списке абитуриентов. Если средний балл по аттестату у последующего элемента больше, чем у предыдущего (выход ДА блока 6), элементы меняются в списке местами (блок 7). Иначе (выход НЕТ у блока 6) никаких преобразований в списке не происходит.

4. Модуль Определение. В блоке 1 вводится значение набора студентов. В блоке 2 определяется, превышает ли требуемый набор количество абитуриентов, допущенных к зачислению. Если вступительные экзамены успешно сдало меньшее количество абитуриентов, чем требуется (выход ДА из блока 2), то значение набора уменьшается до этой величины (блок 3). Иначе (выход НЕТ из блока 2) управление передается блоку 4, в котором организуется циклический алгоритм просмотра списка абитуриентов и вывод данных по каждому абитуриенту (блок 5). На этом работа алгоритма заканчивается: сформирован список абитуриентов, которые могут быть зачислены по результатам вступительных экзаменов.

Анализ блок-схем показывает:

  1. при проектировании алгоритма использован принцип нисходящего проектирования, в соответствии с которым исходная задача декомпозирована на подзадачи (см. рис. 12.2);

  2. выделенные подзадачи реализованы как отдельные модули (см. рис. 12.3 – 12.6), т.е. применен принцип модульности;

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

  4. каждый блок из блок-схем рис. 12.3 – 12.6 может быть закодирован одним оператором такого операторного языка, как, например, Турбо-Паскаль. Это означает, что блок-схемы разработаны с учетом требуемой степени детализации, а сама кодировка блок-схем может быть выполнена читателем самостоятельно.

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

В процессе отладки программы выделяются этапы:

  1. трансляция исходного текста программы;

  2. компоновка программы;

  3. выполнение программы с целью определения логических ошибок;

  4. тестирование программы.

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

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

  1. лексический анализ исходной программы. Выявляются отельные составляющие текста программы, которые называются лексемами, и определяется их тип. К числу лексем относятся названия операторов, например, read или write; имена (переменных или констант), например, NABOR или CHISLO, различные разделители, такие как круглые скобки, знаки препинания и т.д. Одновременно типами указанных лексем являются названия операторов, имена переменных, разделители и т.д. Если программистом допущена ошибка и оператор ввода указан, например, rread, он будет распознан компилятором как имя. На этом этапе выявляется использование недопустимых языком программирования символов, например, символа @. В результате лексического анализа исходная программа кодируется: каждая лексема заменяется кодом ее типа, что сокращает объем текста программы. Кроме того, из текста программы удаляются пробелы. Так, например, если анализу подвергался фрагмент программы на Турбо-Паскале:

read (NABOR,CHISLO); , (12.4)

то в результате анализа он закодируется как

1 2 3 4 3 2 4 , (12.5)

где 1 – код названия оператора;

2 – код скобки;

3 – код имени;

4 – код знака препинания.

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

rread (NABOR,CHISLO); , (12.6)

то в закодированном виде он будет выглядеть как

3 2 3 4 3 2 4 . (12.7)

  1. синтаксический анализ. Определяется синтаксическая правильность закодированной в результате лексического анализа цепочки лексем. Например, определяется парность скобок, наличие в нужном месте требуемого знака препинания, соответствие исходного текста структурным правилам того или иного языка программирования, средствами которого была составлена программа. Для решения задачи в исходной (закодированной) цепочке выделяются подструктуры, соответствующие некоторым фрагментам оператора. Например, для оператора ввода в Турбо-Паскале можно определить структуру, представленную на рис. 12.7 и соответствующую правилам (12.1) – (12.3).

<оператор ввода>


“read” “;”


“(“ “)”


[“,” ]


Рис. 12.7. Структура оператора ввода Турбо-Паскаля

В то же время структура оператора ввода из (12.5) определяется схемой:


<оператор ввода>


1 4


2 2


3 4


3

Рис. 12.8. Структура оператора ввода из (12.4)


Поскольку структуры из рис. 12.7 и 12.8 идентичны, оператор (12.5), а, следовательно, и (12.4) при синтаксическом анализе определяется как правильный.

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






3 4




2 2


3 4


3

Рис. 12.9. Структура оператора из (12.6)


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

var NABOR, CHISLO: integer;

read (NABOR, CHISLO); (12.8)

или

var CHISLO: integer;

^ CHISLO:=CHISLO + 1; (12.9)

будут расцениваться как семантически корректные;

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

$1 DD ? ; операторы DD описывают переменные: каждый из них

$2 DD ?; отводит под переменную 2 байта памяти;

$3 DD ?; переменные $1 - $3 вводятся генератором кода как

CHISLO DD ?; вспомогательные переменные;

MOVE 1, $1; в операторах MOVE константы или содержимое

^ MOVE CHISLO, $2; переменных слева от запятой помещаются в переменные и

MOVE $1, AX; регистры процессора (АХ и СХ), указанные справа;

MOVE $2, CX;

ADD AX, CX; выполняется сложение содержимого регистров АХ и СХ,

; результат остается в регистре АХ

MOVE AX, $3; выполняются перемещения значений, находящихся в

^ MOVE $3, CHISLO; регистре и переменной, в соответствующие переменные


Полученный код избыточен: в самом деле, выполняется бессмысленная пересылка константы 1 и значения переменной ^ CHISLO сначала в дополнительные переменные $1 и $2, а затем уже в регистры АХ и СХ, которые и используются при сложении. Аналогичные бессмысленные действия выполняются и с результатом сложения. Однако уменьшение размеров кода осуществляется на следующем этапе;

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

^ CHISLO DD ?

MOVE 1, AX

MOVE CHISLO, CX (12.10)

ADD AX, CX

MOVE AX, CHISLO

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

  1. генерация объектного кода. Программа, полученная в результате шага 4 и оптимизированная в шаге 5, преобразуется в машинный код (так называемый объектный модуль), в котором использованы относительные, а не абсолютные адреса основной памяти. Как правило, для получения объектного модуля применяется условная память с начальным адресом 1. Каждый оператор программы преобразуется в машинную команду и размещается, начиная с начального адреса, в той последовательности, в которой он следует в программе. При этом учитывается размер каждого оператора. Пусть командам программы (12.10) соответствуют машинные команды:

код объем действие

операции

124 1 б сложить содержимое регистров АХ и СХ, результат – в регистре АХ,

125 3 б поместить содержимое регистра АХ по адресу,

126 2 б поместить константу в регистр АХ,

127 3 б поместить содержимое адреса в регистр СХ,

Оператор DD выделяет объем памяти в 2 байта для описываемой переменной. Тогда схема размещения объектного кода имеет вид, представленный в табл. 12.1.


Таблица 12.1

Адрес

(байт)

Команда


Комментарий

Внутреннее представление

Объем

(байт)

1

-

2

Память для переменной CHISLO – результат действия команды DD

3

126 1

2

В регистр АХ помещается 1

5

127 1

3

Содержимое адреса 1 помещается в регистр СХ

8

124

1

Соответствует действию ^ CHISLO + 1

9

125 1

3

Содержимое регистра АХ помещается по адресу 1, т.е. выполняется действие CHISLO = CHISLO+1


Этот код еще не готов к выполнению: для этого требуется его «ориентация» на те адреса основной памяти, где он будет выполняться.

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

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

Например, пусть для выполнения программы из табл. 12.1. отводится область основной памяти, начиная с абсолютного адреса 40. Тогда, с учетом сегментированной схемы адресации (см. 9.1.1) указанные в табл. 12.1 адреса ( с учетом абсолютного адреса 40) преобразуются в свои сегментированные эквиваленты:

исходные адреса сегментированные адреса

из табл. 12.1

1 0002:0008

3 0002:000А

5 0002:000С

8 0002:000F

9 0003:0000

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

Таблица 12.2

Адрес размещения команды


Содержимое адреса

Абсолютный (десятичная система счисления)

Сегментированный (шестнадцатеричная система счисления)

40

0002:0008

-

42

0002:000А

126 1

44

0002:000C

127 0008

47

0002:000F

124

48

0003:0000

125 0008

232-kreditnaya-istoriya-emitenta-350000-rossiya-g-krasnodar-ul-krasnaya-33-informaciya-soderzhashayasya-v-nastoyashem.html
232-kreditnaya-istoriya-emitenta-606522-rossiya-nizhegorodskaya-oblast-g-zavolzhe-sovetskaya-1a-informaciya.html
232-kreditnaya-istoriya-emitenta-625013-rossiya-tyumenskaya-oblast-g-tyumen-50-let-oktyabrya-118-informaciya.html
232-kreditnaya-istoriya-emitenta-660021-rossiya-krasnoyarskij-kraj-g-krasnoyarsk-bograda-144a-informaciya-soderzhashayasya.html
232-kreditnaya-istoriya-emitenta-ezhekvartalnij-otchet-obshestvo-s-ogranichennoj-otvetstvennostyu-brazers-i-kompaniya.html
232-kreditnaya-istoriya-emitenta-ezhekvartalnij-otchet-otkritoe-akcionernoe-obshestvo-neftegazovaya-kompaniya-slavneft.html
  • bukva.bystrickaya.ru/rabochaya-programma-uchebnoj-disciplini-3-list-vkladka-s-osnovnoj-literaturoj-stranica-5.html
  • predmet.bystrickaya.ru/sabati-tairibi-zh-ajmauitovti.html
  • books.bystrickaya.ru/bilet-5-obshestvoznanie-otveti-na-ekzamenacionnie-bileti-dlya-8-klassa.html
  • kolledzh.bystrickaya.ru/44-problema-ocenki-effektivnosti-profkonsultacionnoj-pomoshi-pryazhnikov-n-s-p77-metodi-aktivizacii-professionalnogo.html
  • composition.bystrickaya.ru/perechen-dokumentov-yavivshihsya-osnovaniem-dlya-oformleniyaodobreniya-tipa-shassi.html
  • credit.bystrickaya.ru/polozhenie-o-kraevom-konkurse-instrumentalnih-koncertov-obshie-polozheniya.html
  • uchebnik.bystrickaya.ru/vopros-2-neschastnie-sluchai-na-rabochem-meste-uchebno-metodicheskij-kompleks-po-discipline-upravlenie-personalom.html
  • tests.bystrickaya.ru/krestedi-cresteds-reshenie-tehnicheskih-voprosov-mini-lekciya-shou-pokaz-svinok-nachalo-blagotvoritelnoj-loterei.html
  • report.bystrickaya.ru/i-i-chironova-anglo-russkij-tolkovij-yuridicheskij-slovar-stranica-10.html
  • report.bystrickaya.ru/istoricheskie-i-ekonomicheskie-predposilki-protekzionizma-v-strahovanii.html
  • prepodavatel.bystrickaya.ru/tekstovoe-dokumentirovanie-zakonodatelnaya-i-normativnaya-reglamentaciya-dokumentirovaniya-v-dorevolyucionnoj.html
  • paragraf.bystrickaya.ru/znaniya-o-fizicheskoj-kulture-obrazovatelnie-programmi-municipalnogo-obsheobrazovatelnogo-uchrezhdeniya-srednyaya.html
  • teacher.bystrickaya.ru/glava-15-prorok-bez-slavi-zdorovij-obraz-zhizni-isbn-5-88782-005-5.html
  • zadachi.bystrickaya.ru/set-na-osnove-nejrochipa-chast-5.html
  • assessments.bystrickaya.ru/d-monastir-muzhskoj-obshezhitelnij-monastir-svyatih-muchenikov-blagovernih-knyazej-borisa-i-gleba-eparhialnij-skit-6-tolochin-zhenskij-obshezhitelnij-monastir-pokrova-presvyatoj-bogorodici-10-stranica-18.html
  • essay.bystrickaya.ru/chast-i-o-principah-socioniki-uroki-socioniki-ili-samoe-glavnoe-chemu-nas-ne-nauchili-v-shkole.html
  • knigi.bystrickaya.ru/s-b-podushka-periodichnost-razmnozheniya-osetrovih-literaturnij-obzor.html
  • znaniya.bystrickaya.ru/razdel-pervij12-filosofiya.html
  • desk.bystrickaya.ru/paraolimpijskie-igri-profil-16032009-novosti-8.html
  • ekzamen.bystrickaya.ru/spisok-sokrashenij-spravochnik-po-fondam-novosibirskogo-gorodskogo-arhiva.html
  • tests.bystrickaya.ru/lekciya-4-konspekt-lekcij-po-discipline-buhgalterskij-uchet-v-zarubezhnih-stranah-tematika-lekcij-po-discipline.html
  • laboratornaya.bystrickaya.ru/rabochaya-uchebnaya-programma-disciplini-mirovaya-ekonomika-specialnostej-060500-buhgalterskij-uchet-i-audit.html
  • vospitanie.bystrickaya.ru/zadanie-3-poluchenie-matematicheskoj-modeli-obekta-upravleniya-v-vide-peredatochnih-funkcij-4-vibor-pi-algoritma-upravleniya-9-raschet-parametrov-sau-na-evm-chastotnim-metodom-9-11.html
  • ucheba.bystrickaya.ru/programma-orsk-2008-ministerstvo-obrazovaniya-i-nauki-rossijskoj-federacii.html
  • portfolio.bystrickaya.ru/pamyatka-dlya-roditelej-otpravlyayushih-detej-v-dol-rosson.html
  • doklad.bystrickaya.ru/vi-proekt-municipalnogo-kontrakta.html
  • predmet.bystrickaya.ru/ris25-tehnologicheskaya-shema-rafinirovaniya-chernovogo-svinca-pirometallurgicheskim-metodom.html
  • shpora.bystrickaya.ru/zhan-zhak-russo-velikij-prosvetitel.html
  • portfolio.bystrickaya.ru/osnovnie-voprosi.html
  • letter.bystrickaya.ru/obshie-polozheniya-stranica-4.html
  • zanyatie.bystrickaya.ru/mnozhestvennost-prestuplenij-4.html
  • znaniya.bystrickaya.ru/ra-konov-itarnij-nauchnij-fond-trudi-vserossijskogo-filosofskogo-seminara-molodih-uchenih-im-p-v-kopnina-sessiya.html
  • uchenik.bystrickaya.ru/great-britain-constitution-politics-law.html
  • zanyatie.bystrickaya.ru/noosfernoe-budushee-chast-6.html
  • kanikulyi.bystrickaya.ru/zher-uchaskesn-nisanali-masatin-zgertuge-sheshm-beru-memlekettk-krsetletn-izmet-reglament.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.