Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа
За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.
Аналогично можно найти и наибольшее яблоко, но тогда рамку нужно увеличивать каждый раз до размеров большего яблока.
Распространим эту идею на поиск минимального элемента в последовательности. Поиск будем проводить путем сравнения всех элементов последовательности с эталонной переменной, которой присвоим значение любого элемента последовательности. (О том, какой элемент лучше выбрать для этой цели, скажем позже).
Пусть эталонная переменная определена. Сравним с нею первый элемент. Если окажется, что он меньше эталона, то изменим эталон, то есть присвоим ему значение первого элемента, а затем перейдем к сравнению эталона со вторым элементом. Подобные сравнения проведем для всех элементов последовательности. По окончании просмотра эталонная переменная будет иметь значение, равное минимальному значению среди элементов последовательности.
Запишем пошаговую разработку алгоритма. Главное его свойство: все действия выполняются одинаково для всех элементов последовательности. Значит, основой его будет следующий цикл.
Начало
Конец.
Анализируем п.1. Нужно задать номер того элемента, с которого начнется сравнение, и определить эталон. Если в качестве эталонной переменной MIN выберем x1, то можно начать цикл с элемента номер 2. Тогда
Условие п.2. означает, что текущий номер элемента I не превысил заданную длину последовательности: I≤N.
Шаг 2.1. – условный оператор. Его особенность – в отсутствии действий после иначе, поэтому можем записать укороченную форму оператора
2.1. IF X[I]<MIN
THEN MIN:=X[I];
Шаг 2.2. – в увеличении индекса I на 1:
2.2. I:=I+1;
Объединяя шаги детализации, получим алгоритм:
Ввод (последовательность Х);
I:=2; MIN:=X[1];
WHILE I<=N DO
BEGIN
IF X[I]<MIN
THEN MIN:=X[I];
I:=I+1;
END;
Вывод (MIN);
Поэтому алгоритм в задаче B имеет такую же структуру, что и в задаче А. Процесс отыскания минимума и его номера можно совместить в одном цикле. Как только в результате сравнения пришли к выводу, что нужно изменить эталон, то есть предположили, что новое значение может быть минимальным, нужно тут же зафиксировать номер этого элемента, следуя тому же предположению. Следовательно, в алгоритме появится новая переменная NOM – номер минимального элемента. При этом на шаге инициализации цикла нужно не забыть присвоить NOM начальное значение 1 на случай, если выбранный в качестве эталона первый элемент и окажется минимальным. Поэтому алгоритм будет иметь вид:
Ввод (последовательность Х);
I:=2; MIN:=X[1]; NOM:=1;
WHILE I<=N DO
BEGIN
IF X[I]<MIN
THEN
BEGIN
MIN:=X[I];
NOM:=I;
END;
I:=I+1;
END;
Вывод (NOM);
Полученный алгоритм легко превратить в алгоритм определения номера максимального элемента, изменив условие на противоположное (в этом случае лучше назвать эталонную переменную MAX).
Структура
алгоритма в обоих случаях
остается неизменной. Отличие будет
отражаться только на сравнении эталонной
переменной с текущим элементом массива.
Поясним на численном примере.
Номер элемента | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Последовательность | 21 | 4 | 22 | 11 | 5 | 23 | 9 | 12 |
По алгоритму В:
MIN:=2; NOM:=1; - начальные значения.
MIN:=1; NOM:=4; - эти значения останутся до конца.
Таким образом, алгоритм В решает задачу отыскания минимального (первого по порядку следования) элемента и его номера. Если мы хотим определить последний по порядку следования элемент и его номер, то в сравнении текущего элемента с эталоном должны изменить условие, а именно: MIN>=X[I].Тогда переприсваивание будет происходить и в случае равенства.
Одна из особенностей задачи состоит в том, что в последовательности может не оказаться элемента со значением P. Эту ситуацию нужно обязательно предусмотреть при конструировании алгоритма.
Если провести аналогию между поиском нужного элемента последовательности и, например, нужной книги на полке, то становится очевидным, что в неупорядоченной последовательности нет иного способа, кроме последовательного просмотра элементов (книг) и сравнения их с поисковым значением (требованием на книгу). В упорядоченной последовательности можно организовать поиск более экономичным (с точки зрения быстродействия) способом. Поэтому разграничим эти две ситуации.
D1. Неупорядоченная последовательность
Просматриваем последовательно все элементы (книги на полке) и сравниваем их с поисковым значением (автора и название книги – с требованием). Когда обнаружится искомый элемент (книга), запомним его номер (место книги на полке).
Основой алгоритма является, таким образом, цикл.
2.1. Сравнить очередной элемент с поисковой переменной
Конец
2.1 На основе сравнения мы должны сделать выбор: продолжать сравнение или закончить цикл. Запишем
если X[I]= то
начало
2.1.1. запомнить номер элемента
2.1.2. закончить цикл
конец
иначе
2.1.3. перейти к следующему сравнению
Поясним п.п. 2.1.1, 2.1.2 и 2.1.3.
2.1.1. K:=I
2.1.2. Так как цикл будет работать только при I ≤ N, достаточно присвоить I значение, большее N, и цикл завершится, например:
2.1.2 I:=N+1;
2.1.3. I:=I+1;
В итоге получаем алгоритм на псевдокоде.
Ввод (последовательность X);
I:=1;
K:=0;
WHILE I<=N DO
BEGIN
IF X[I]=P
THEN
BEGIN
K:=I; I:=N+1;
END;
ELSE I:=I+1;
END;
Вывод (К);
При составлении алгоритма на Паскале следует помнить, что цикл работает неопределенное число раз, поэтому нельзя использовать оператор FOR.
D2. Упорядоченная последовательность
Если последовательность упорядочена, то есть значения элементов возрастают (убывают) с увеличением номера элемента, то к ней можно применить другой алгоритм поиска. Договоримся рассматривать случай с возрастающей последовательностью.
Идея алгоритма: выбираем элемент Хс из середины последовательности и сравниваем с поисковым значением P. Если он не равен Р, то выясним, справа или слева от выбранного элемента находится искомый:
если Xc < P, то справа,
если Xc > P, то слева.
Соответствующий промежуток снова делим пополам и так далее. То есть получим не что иное, как метод дихотомии.
Пусть А – индекс наименьшего, а В – индекс наибольшего элемента последовательности (а затем и выделяемой ее части). Основа алгоритма – цикл, который выполняется неопределенное число раз. В этом цикле производим деление интервала индексов [A,B] пополам, получаем индекс С и сравниваем элемент с номером С с поисковой переменной Р. В зависимости от результата сравнения перевычисляем А или В. Повторяем действия до тех пор, пока А и В не совпадут. Затем делаем проверку X[A]=P и по ее исходу формируем результат.
начало
2.1. вычислить С
2.2. сравнить X[C] с поисковой переменной P
конец
2.1.
Так как А+В может быть
C:=(A+B) DIV 2
2.2. Сравнение производим с помощью условного оператора