.RU

Сущность алгоритма Е - Методические указания к выполнению контрольных работ по дисциплине "Основы программирования"



Сущность алгоритма Е: даны два целых положительных числа т и п. Требуется найти их наибольший общий делитель, т.е. наибольшее целое положительное число, которое нацело делит оба числа т и п. Алгоритм состоит из трех элементарных типовых действий: Е1, Е2 и Е3 (рис. 1.1).

Действие Е1. Нахождение остатка.

Разделим m на п, и пусть остаток от деления будет равен r, где .

Действие Е2. Сравнение с нулем.

Если r = 0, то выполнение алгоритма прекращается; п – это искомое значение.

Действие Е3. Замещение.

Присвоить m ¬ n, n ¬ r и вернуться к шагу E1. ô


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

Каждому рассматриваемому алгоритму присваивается идентифицирующая буква (в предыдущем примере использовалась буква Е), а шагам алгоритма – эта же буква в сочетании с числом (El, Е2, ЕЗ).

Каждый шаг любого алгоритма, например Е1 в вышеприведенном алгоритме, начинается фразой, которая как можно более кратко выражает содержание данного шага. Обычно эта фраза отражается также в сопровождающей алгоритм блок-схеме, такой как на рис. 1.1, чтобы читатель мог легко представить себе описанный алгоритм.

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

Стрелка «¬», используемая на шаге ЕЗ, обозначает важнейшую операцию замещения, которую иногда называют присвоением или подстановкой: запись m ¬ n указывает, что значение переменной т замещается текущим значением переменной п. В начале работы алгоритма Е, т и п – это заданные первоначальные значения, но по окончании его работы эти переменные будут иметь, вообще говоря, совершенно другие значения.

Стрелка используется для того, чтобы отличать операцию замещения от отношения равенства. Мы не будем говорить: «Установим т = п», а, вероятно, спросим: «Действительно ли т = п?». Знак «=» обозначает условие, которое можно проверить, а знак «¬» – действие, которое можно выполнить. Операция увеличение п на единицу обозначается через п ¬ п+1 и читается так: «п замещается значением п+1» или «п принимает значение п+1». Вообще говоря, запись «переменная ¬ формула» означает, что формула будет вычислена на основании текущих значений всех входящих в нее переменных, а полученный результат будет присвоен переменной, стоящей слева от стрелки (таким образом, вычисленный по формуле результат заменит собой предыдущее значение переменной слева). Лица, не имеющие достаточного опыта программирования, иногда говорят, что «п переходит в п+1» и для обозначения операции увеличения п на единицу используют запись п ® п+1. Такая система обозначений и формулировок противоречит стандартным соглашениям и может привести только к путанице, поэтому ее следует избегать.

Обратите внимание, что на шаге ЕЗ очень важен порядок действий. Действительно, две записи:

1) «присвоить m ¬ n, n ¬ r »

и

2) «присвоить n ¬ r, m ¬ n »

– это совсем не одно и то же.

Из второй записи следует, что предыдущее значение n будет потеряно до того, как его смогут присвоить т. На самом деле эквивалентом второй записи будет «присвоить n ¬ r, т ¬ r ». Когда нескольким переменным присваивается одно и то же значение, в одном выражении можно использовать несколько стрелок. Так, например, операцию « n ¬ r, т ¬ r » можно записать как « n ¬ т ¬r ».

Операцию взаимного обмена значениями двух переменных можно записать так: «Обмен т « n». Ее можно записать и с помощью новой переменной t следующим образом: "Присвоить t ¬ т, т ¬ п, п ¬ t.

Выполнение алгоритма начинается с шага, имеющего наименьший номер (обычно это шаг 1). Затем последовательно выполняются следующие шаги, если нет каких-либо указаний, нарушающих естественный порядок выполнения. На шаге ЕЗ указание «Вернуться к шагу Е1» явным образом определяет порядок вычислений. На шаге Е2 действию предшествует условие «Если r = 0» и если r # 0, то оставшаяся часть предложения не применяется и нет указаний на выполнение в этом случае каких-либо действий. Конечно, мы могли бы добавить дополнительное предложение «Если r # 0, то перейти к шагу ЕЗ», но это совершенно излишне.

Жирная вертикальная черточка «ô», помещенная в конце шага ЕЗ, обозначает окончание алгоритма и продолжение текста.

Итак, мы обсудили практически все соглашения об обозначениях, которые используются в алгоритмах, приведенных в книге. Осталось выяснить только, как обозначать величины с индексами (или «подстрочными» индексами), которые являются элементами упорядоченного массива. Предположим, у нас есть п величин: v1, v2, …, vn . Для обозначения j-го элемента вместо записи vj часто используется запись v[j]. Аналогично массив иногда предпочитают обозначать как а[i, j], вместо того чтобы использовать два подстрочных индекса, как в записи aij. Иногда для обозначения переменных используются имена, состоящие из нескольких букв, обычно прописных. Например, TEMP может быть именем переменной, использующейся для временного хранения вычисленного значения, a PRIME [К] может обозначать k-е простое число, и т.д.

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

Итак, давайте в качестве примера разберем алгоритм Е. Предположим, что m = 119 и n = 544.

Начнем с шага Е1. Деление m на n в этом случае выполняется просто, даже очень просто, так как частное равно нулю, а остаток – это 119. Таким образом, r ¬ 119. Переходим к шагу Е2. Поскольку r # 0, на этом шаге никакие действия не выполняются.

На шаге ЕЗ присваиваем т ¬ 544, п ¬ 119. Очевидно, что если первоначально m < п, то частное на шаге Е1 всегда оказывается равным нулю и в ходе выполнения алгоритма всегда происходит взаимный обмен значений переменных тип, хотя и таким громоздким способом. Поэтому можно добавить дополнительный шаг:


Действие Е0. Гарантировать, что m > п.

Если m < п, то выполнить взаимный обмен т « n.


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

Вернемся к шагу Е1. Находим, что

.

Поэтому r ¬ 68. В результате на шаге Е2 снова не выполняются никакие действия, а на шаге ЕЗ присваиваем т ¬ 119, п ¬ 68.

В следующих циклах сначала получаем r ¬ 51 и т ¬ 68, п ¬ 51, а затем: r ¬ 17 и т ¬ 51, п ¬ 17.

Наконец, в результате деления 51 на 17 получаем: r ¬ 0. Таким образом, на шаге Е2 выполнение алгоритма прекращается. Наибольший общий делитель 119 и 544 равен 17.

Вот что такое алгоритм.


1.2. Особенности алгоритмов. Программы


Современное значение слова «алгоритм» во многом аналогично таким понятиям, как рецепт, процесс, метод, способ, процедура, программа. Но все-таки, слово «algorithm» имеет дополнительный смысловой оттенок. Алгоритм – это не просто набор конечного числа правил, задающих последовательность выполнения операций для решения задачи определенного типа. Помимо этого, он имеет пять важных особенностей.

1. Конечность. Алгоритм всегда должен заканчиваться после выполнения конечного числа шагов. Алгоритм Е удовлетворяет этому условию, потому что после шага Е1 значение r меньше, чем п. Поэтому если r # 0, то в следующем цикле на шаге Е1 значение п уменьшается. Убывающая последовательность положительных целых чисел имеет конечное число членов, поэтому шаг Е1 может выполняться только конечное число раз для любого первоначально заданного значения п. Но нужно иметь в виду, что количество шагов может быть сколь угодно большим; выбор слишком больших значений тип приведет к тому, что шаг Е1 будет выполняться более миллиона раз.

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

2. Определенность. Каждый шаг алгоритма должен быть точно определен. Действия, которые нужно выполнить, должны быть строго и недвусмысленно определены для каждого возможного случая. Чтобы преодолеть это затруднение, для описания алгоритмов были разработаны формально определенные языки программирования, или машинные языки, в которых каждый оператор имеет строго определенное значение.

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

Рассмотрим в качестве примера алгоритм Е. Применительно к шагу Е1 критерий определенности означает, что читатель обязан точно понимать, что значит разделить т на п и что такое остаток. Но в действительности нет никакого общепринятого соглашения по поводу того, что это означает, если m и п не являются целыми положительными числами. Каким будет остаток от деления -8 на -p ? Что понимать под остатком от деления 59/13 на нуль? Поэтому в данном случае критерий определенности означает следующее: мы должны быть уверены, что в каждом случае выполнения шага Е1 значениями т и п всегда будут целые положительные числа. Если сначала по предположению это верно, то после шага Е1 r – это целое неотрицательное число; при условии перехода к шагу ЕЗ оно является также ненулевым. Таким образом, поставленное требование выполнено и т и п – это действительно целые положительные числа.

3. Ввод. Алгоритм имеет некоторое (возможно, равное нулю) число входных данных, т.е. величин, которые задаются до начала его работы или определяются динамически во время его работы. Эти входные данные берутся из определенного набора объектов. Например, в алгоритме Е есть два входных значения, а именно m и п, которые принадлежат множеству целых положительных чисел.

4. Вывод. У алгоритма есть одно или несколько выходных данных, т.е. величин, имеющих вполне определенную связь с входными данными. У алгоритма Е имеется только одно выходное значение, а именно п, получаемое на шаге Е2. Это наибольший общий делитель двух входных значений.

Можно легко доказать, что это число действительно является наибольшим общим делителем. После шага Е1 имеем:

,

где q – некоторое целое число.


Если r = 0, то т кратно п и, очевидно, в этом случае n – наибольший общий делитель для m и п.

Если r # 0, то любой делитель обоих чисел m и п должен быть также делителем для

,

а любой делитель для п и r – также делителем для:

.


Таким образом, множество делителей чисел {т, п} совпадает с множеством делителей чисел {п, r}. Следовательно, пары чисел {т, п} и {п, r} имеют один и тот же наибольший общий делитель. Таким образом, шаг ЕЗ не изменяет ответа исходной задачи.

5. Эффективность. Алгоритм обычно считается эффективным, если все его операторы достаточно просты для того, чтобы их можно было точно выполнить в течение конечного промежутка времени с помощью карандаша и бумаги. В алгоритме Е используются только следующие операции: деление одного целого положительного числа на другое, сравнение с нулем и присвоение одной переменной значения другой. Эти операции являются эффективными, так как целые числа можно представить на бумаге с помощью конечного числа знаков и так как существует по меньшей мере один способ деления одного целого числа на другое – «алгоритм деления». Но те же самые операции были бы неэффективными, если бы они выполнялись над действительными числами, представляющими собой бесконечные десятичные дроби, либо над величинами, выражающими длины физических отрезков прямой, которые нельзя измерить абсолютно точно. Приведем еще один пример неэффективного шага: «Если 4 – это наибольшее целое n, при котором существует решение уравнения wn + xn + yn = zn для целых положительных чисел w, x, y и z, то перейти к шагу Е4». Подобная операция не может считаться эффективной до тех пор, пока кто-либо не разработает алгоритм, позволяющий определить, действительно ли 4 является наибольшим целым числом с требуемым свойством.

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


Инструкции из кулинарных рецептов очень часто бывают неопределенными, например: «Добавьте щепотку соли». «Щепотка» определяется как количество, «меньшее 1/8 чайной ложки», и что такое соль, вероятно, тоже известно всем. Но куда именно нужно добавить соль – сверху? сбоку? Инструкции «Слегка потрясите, пока смесь не станет рассыпчатой» и «Подогрейте коньяк в маленькой кастрюльке» будут вполне понятны опытному повару, но они не годятся для алгоритма. Алгоритм должен быть определен настолько четко, чтобы его указаниям мог следовать даже компьютер. Тем не менее, программист может многому научиться, прочитав хорошую поваренную книгу.

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

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

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

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

В качестве примера давайте исследуем с этой точки зрения алгоритм Евклида. Предположим, нам нужно решить следующую задачу: «Пусть задано значение n, а т может быть любым целым положительным числом. Тогда чему равно среднее число Тп выполнений шага Е1 алгоритма Е?».

Прежде всего необходимо убедиться в том, что задача имеет смысл, поскольку нам предстоит найти среднее при бесконечно большом количестве значений т. Но совершенно очевидно, что после первого выполнения шага Е1 значение будет иметь только остаток от деления т на п. Поэтому все, что мы должны сделать для нахождения значения Тп , – это испытать алгоритм для m = 1, m = 2, ..., m = п, подсчитать суммарное число выполнений шага Е1 и разделить его на п.

А теперь рассмотрим еще один важный вопрос, касающийся поведения Тп как функции от п: можно ли ее аппроксимировать, например, функцией

или ?

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

,

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


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

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

Формально определим метод вычислений как четверку ( Q, I, W, f ), где Q – это множество, содержащее подмножества I и W, а f – функция, переводящая множество Q в себя. Кроме того, f оставляет неподвижными точки множества W, т.е. f (q) равно q для всех элементов q из множества W. Эти четыре элемента Q, I, W и f представляют соответственно состояния вычисления, ввод, вывод и правило вычислений. Каждое входное значение х из множества I определяет вычисляемую последовательность x0, x1, x2, … следующим образом:


x0 = х и xk+1 = f (xk) для k ³ 0. (1.1)

Говорят, что вычисляемая последовательность заканчивается через k шагов, если k – это наименьшее целое число, для которого xk принадлежит W, и что она дает выходное значение xk для заданного х. (Заметим, что если xk принадлежит W, то и xk+1 принадлежит W, так как в этом случае xk+1 = xk). Некоторые вычисляемые последовательности могут никогда не заканчиваться, но алгоритм – это метод вычислений, который заканчивается через конечное число шагов для всех х из I.

Например, алгоритм Е в этих терминах можно формализовать следующим образом. Пусть элементами множества Q будут все величины (n), все упорядоченные пары (m,n) и все упорядоченные четверки (m,n,r,1), (m,n,r,2) и (m,n,p,3), где m, n и р – это целые положительные числа, а r – неотрицательное целое число. Пусть I – это подмножество всех пар (m,n), а W – подмножество всех величин (n). Определим функцию f следующим образом:





(1.2)





Соответствие между данной записью и алгоритмом Е очевидно.


В этой формулировке понятия «алгоритм» не содержится ограничение, касающееся эффективности, о котором упоминалось ранее. Например, Q может быть множеством бесконечных последовательностей, которые нельзя вычислить с помощью карандаша и бумаги, а f может включать операции, которые не всегда возможно выполнить. Если мы хотим ограничить понятие «алгоритм» таким образом, чтобы в нем могли содержаться только элементарные операции, то введем ограничения на элементы Q, I, W и f, например, следующим образом.

Пусть А – это ограниченное множество букв, а L – множество всех строк, определенных на множестве А (т.е. множество всех упорядоченных последовательностей x0, x1, x2, …, где n³0 и xj принадлежит А для 1 £ j £ п. Идея заключается в следующем: закодировать состояния вычисления таким образом, чтобы они были представлены строками из множества L.

Теперь пусть ^ N – целое неотрицательное число, а Q – множество всех пар (s, j), где s принадлежит L, a j – целое число, 0 £ j £ N.

Пусть I – подмножество пар из Q, для которых j=0, а W – подмножество пар из Q, для которых j = N. Если q и s – строки из L, то мы будем говорить, что q входит в s, если s имеет вид aqw, где a и w – некоторые строки.

И в завершение определим функцию f с помощью строк qj, fj и целых чисел aj, bj, 0 £ j £ N, следующим образом:


,

если qj не входит в s

,

если a является самой короткой (1.3)

строкой, для которой s = a qj w

.





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


Упражнение 1.1. В тексте показано, как взаимно заменить значения переменных типе помощью символа замены, а именно – полагая t ¬ m, m ¬ п, п ¬ t. Покажите, как в результате ряда замен можно преобразовать четверку переменных (a,b,c,d) в (b,c,d,a). Другими словами, новое значение переменной а должно стать равным первоначальному значению 6 и т.д. Постарайтесь выполнить преобразование с помощью минимального числа замен.

Упражнение 1.2. Докажите, что в начале выполнения шага El m всегда больше п, за исключением, возможно, только первого случая выполнения этого шага.

Упражнение 1.3. Измените алгоритм Е (из соображений эффективности) таким образом, чтобы исключить из него все тривиальные операции замены типа « m ¬ n ». Запишите этот новый алгоритм в стиле алгоритма Е и назовите его алгоритмом F.

Упражнение 1.4. Чему равен наибольший общий делитель чисел 2 166 и 6 099?

Упражнение 1.5. Чему равно T5 (среднее число случаев выполнения шага Е1 при n = 5)?

Упражнение 1.6. Пусть т известно, а n – любое целое положительное число. Пусть Um – среднее число случаев выполнения шага Е1 из алгоритма Е. Покажите, что Um четко определено. Существует ли какая-либо связь между Um и Tm ?

Упражнение 1.7. Придумайте эффективный формальный алгоритм вычисления наибольшего общего делителя целых положительных чисел т и п, определив соответствующим образом qj, fj, aj, bj (как в формулах (1.3)). Пусть входные данные представлены строкой ambn, т.е. за а, взятым т раз, следует b, взятое n раз. Постарайтесь найти самое простое решение, насколько это возможно.

Указание: воспользуйтесь алгоритмом Е, но вместо деления на шаге El присвойте r ¬ | т - п |, п ¬ min(m, п).


^ 1.3. Математическая индукция


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

Пусть Р(п) – это некоторое утверждение, касающееся целого числа п, например:

«n умножить на (n + 3) – четное число» или «если п ³ 10, то 2n > n3». Предположим, нам нужно доказать, что утверждение Р(п) верно для всех положительных целых чисел п. Существует важный метод доказательства этого факта, который состоит в следующем:

(а) Доказать, что Р(1) верно.

(b) Доказать, что «если Р(1), Р(2), ..., Р(п) справедливы, то Р(п+1) также справедливо»; это доказательство должно иметь силу для любого целого положительного числа п.


^ Пример 1-2. Нечетные числа в сумме дают квадрат.

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




1 = 12,







1 + 3 = 22,







1 + 3 + 5 = 32,

(1.4)




1 + 3 + 5 + 7=42,







1 + 3 + 5 + 7 + 9 = 52.





В общем виде эти равенства можно записать следующим образом:

1 + 3 + ××× + (2n – 1) = n2 . (1.5)


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

(а) «Р(1) верно, так как 1 = 12 »

(b) «Если все утверждения Р(1), ..., Р(п) справедливы, то, в частности, верно и Р(п); следовательно, выполняется соотношение (1.5). Добавляя к обеим частям этого уравнения 2п + 1, получаем:

1 + 3 + ××× + (2п - 1) + (2п + 1) = п 2 + 2 п + 1 = (п + 1)2.


Таким образом, утверждение Р(п + 1) также справедливо».

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


svyazannie-zonoj-roman-kulikov-ezhi-tumanovskij-stranica-4.html
svyazannie-zonoj-roman-kulikov-ezhi-tumanovskij-stranica-9.html
svyazannuyu-s-analizom-soderzhaniya-teksta-po-viboru-uchenika.html
svyazi-i-ih-naznacheniya-uchebno-metodicheskij-kompleks-vladivostok-2009-recenzenti.html
svyazi-s-obshestvennostyu-i-antikrizisnoe-upravlenie.html
svyazi-s-obshestvennostyu-vo-vneshnej-politike-gosudarstva-pr-in-external-policy-of-the-state.html
  • znaniya.bystrickaya.ru/rabochaya-programma-po-vseobshej-istorii-s-drevnejshih-vremen-do-konca.html
  • abstract.bystrickaya.ru/335-gipodinamicheskie-i-sportivnie-stressi-v-m-allahverdov-dr-psihol-nauk-prof-11-111-7-31-2.html
  • znanie.bystrickaya.ru/523-nauchno-issledovatelskaya-rabota-studentov-instituta-otchet-o-rezultatah-samoobsledovaniya-negosudarstvennogo.html
  • letter.bystrickaya.ru/nataliya-borisovna-pravdina.html
  • tests.bystrickaya.ru/medicinskie-gruppi-uchashihsya-dlya-zanyatij-fizicheskimi-uprazhneniyami-ministerstvo-sporta-i-turizma-respubliki-belarus.html
  • knowledge.bystrickaya.ru/o-provedenii-oblastnogo-konkursa-issledovatelskih-rabot-uchashihsya.html
  • exchangerate.bystrickaya.ru/434-sravnenie-8023-8024-i-8025-kurs-kompyuternie-seti-glava-mas-poduroven-dostup-k-srede-peredachi-dannih.html
  • notebook.bystrickaya.ru/istoriya-razvitiya-matematiki-na-primere-paleolita-srednih-vekov-i-nashego-vremeni.html
  • thescience.bystrickaya.ru/ii3-pokazateli-zagryaznennosti-stochnih-vod-uchebnoe-posobie-moskva-2009-v-n-markin-l-d-ratkovich-s-a-sokolova.html
  • nauka.bystrickaya.ru/ustnij-zhurnal-rossijskaya-nauka-prirastat-budet-5-9-kl.html
  • upbringing.bystrickaya.ru/lechenie-i-profilaktika-erektilnoj-disfunkcii-u-terapevticheskogo-bolnogo.html
  • ucheba.bystrickaya.ru/programma-disciplini-arbitrazhnij-process-2.html
  • tetrad.bystrickaya.ru/uchebniku-a-v-pogorelova-i-dr-geometriya-10-11-10-klass-profilnij-uroven.html
  • tests.bystrickaya.ru/lekcij-prochitannih-v-dornahe-s-2-po-18-fevralya-1923-g-per-s-nem-i.html
  • shpargalka.bystrickaya.ru/urok-u-profesjnj-shkol-zdobutki-ta-perspektivi-tema-doklada-ispolzovanie-novih-tehnologij-proizvodstva-na-uroke-dlya-svarshikov.html
  • thesis.bystrickaya.ru/programma-duhovno-nravstvennogo-vospitaniya-uchashihsya-na-2010-2015-godi-istoki-nravstvennosti-i-patriotizma.html
  • shkola.bystrickaya.ru/osnovi-organizacii-mezhdunarodnih-finansovo-kreditnih-otnoshenij.html
  • otsenki.bystrickaya.ru/serdce-stranica-8.html
  • occupation.bystrickaya.ru/obrazovatelnaya-programma-municipalnogo-obsheobrazovatelnogo-uchrezhdeniya-pokrishkinskaya-osnovnaya-obsheobrazovatelnaya-shkola-mo-nesterovskij-rajon.html
  • portfolio.bystrickaya.ru/osnovi-elektroniki.html
  • learn.bystrickaya.ru/f-i-o-hamzin-ilnur-shamilevich-data-rozhdeniya-15-dekabrya-1985-g-adres-respublika-tadzhikistan-g-dushanbe-ul-pahtakor-d-30.html
  • institut.bystrickaya.ru/statistika-slskogo-gospodarstva-chast-2.html
  • tests.bystrickaya.ru/lekciya-8-metodika-prepodavaniya-fonetiki-i-orfoepii-v-nacionalnoj-shkole-prodolzhenie.html
  • holiday.bystrickaya.ru/metodika-resheniya-zadach-po-fizike-v-srednej-shkole-kameneckij-s-e-orehov-v-p.html
  • ekzamen.bystrickaya.ru/shershe-ih-scenarij-k-8-marta-a-nu-ka-devochki-konkursnaya-programma-89-vkafe-arlekin-karnavalnoe-shou-k-8-marta.html
  • crib.bystrickaya.ru/gusi-lebedi.html
  • education.bystrickaya.ru/10dnej-stoimost-tura-1300-dollarov-dati-viezdov.html
  • crib.bystrickaya.ru/instrukciya-uchastnikam-razmesheniya-zakaza-3-13-stranica-7.html
  • prepodavatel.bystrickaya.ru/tema-12-organizaciya-logopedicheskoj-raboti-po-korrekcii-narushenij-pismennoj-rechi-v-usloviyah-logopedicheskogo-punkta.html
  • thescience.bystrickaya.ru/informaciya-o-respublike-kabo-verde.html
  • books.bystrickaya.ru/eksperimentalnoe-issledovanie-parametrov-plazi-emkostnogo-visokochastotnogo-razryada-evchr.html
  • desk.bystrickaya.ru/politicheskie-nauki-politologiya-bibliograficheskij-ukazatel-dekabr-2005-g-dekabr-2006-g.html
  • uchenik.bystrickaya.ru/institut-obshestvenno-sluzhebnoj-sobstvennosti-monografiya-posvyashena-analizu-institutov-razdatochnoj-ekonomiki-sformirovavshihsya.html
  • crib.bystrickaya.ru/istoriya-teatra-v-moskve-bitva-pod-moskvoj-65-godovshina.html
  • notebook.bystrickaya.ru/izuchenie-i-rasshirennoe-primenenie-kazahskogo-yazika-v-organizovannoj-uchebnoj-deyatelnosti.html
  • © bystrickaya.ru
    Мобильный рефератник - для мобильных людей.