Автор работы: Пользователь скрыл имя, 26 Апреля 2012 в 21:22, курсовая работа
За время существования профессии программиста сущность его труда изменилась коренным образом. В 50-х годах программы писали в командах ЭВМ (в “машинных кодах”). При этом вся информация переводилась в двоичную систему счисления. Это очень тяжелый и напряженный труд, требующий от человека особой аккуратности. Облегченно вздохнули программисты при появлении в 1956 г. специального языка для решения вычислительных задач. Это был FORTRAN (Formula Translator). С тех пор были разработаны другие, более совершенные языки, или специализированные применительно к какой-то конкретной области: КОБОЛ, АЛГОЛ, ПЛ/1, ЛИСП, СИМУЛА, ПАСКАЛЬ, СИ, АДА, ПРОЛОГ и др.
{$F+}
{формирование “дальних” адресов для
подпрограмм (адрес сегмента и смещения),
эквивалентно директиве FAR}
FUNCTION T1 (I: INTEGER): REAL;
BEGIN
T1:= 1/I/I
END;
FUNCTION T2 (I: INTEGER): REAL;
BEGIN
T2:=1/I/I/I;
END;
{$F-} {формирование “ближних” адресов (только смещения), эквивалентно директиве NEAR}
FUNCTION SUM (A, B: INTEGER; F: FUNC): REAL;
<Описание функции SUM (см. выше)>
{Основная программа:}
BEGIN
READLN (N);
Z1:= SUM(1, N, T1);
Z2:= SUM(1, N, T2);
WRITELN (Z1, Z2)
END.
По умолчанию используется ключ {$F-}.
Если при выполнении программы встретился оператор процедуры или указатель функции, то ЭВМ работает в следующем порядке.
По имени процедуры (функции) находится соответствующее описание в разделе описаний программы.
Производится сопоставление списка ФРП и ФКП. Должны обязательно совпадать их число и типы.
В случае совпадения выполняется тело процедуры (функции) с фактическими параметрами.
После работы тела процедуры (функции) осуществляется возврат в основную последовательность операторов программы:
- к следующему оператору - после работы процедуры;
- в точку вызова – после работы функции.
Часто в задачах бывает необходимо рассматривать не только одиночные (скалярные) объекты (константы, переменные), но некоторую совокупность элементов. Такой совокупностью является массив.
Массив – пронумерованная совокупность объектов одного типа:
( х1, х2, …, хn), где 1, 2, …, n – номера (индексы) элементов.
Например, точка на плоскости характеризуется двумя координатами (х1, х2) : (2.5, 5), в пространстве – тремя (х1, х2, х3): (3.1, 0, -2.3).
В n-мерном пространстве вектор (точка) имеет n координат.
Это примеры одномерных массивов. Они имеют одну степень нумерации (один индекс).
Двумерные
массивы называются матрицами. В
них используется двойная нумерация:
по строкам и столбцам.
Можно рассматривать
и массивы большей размерности.
Пусть каждая плоскость параллелепипеда – матрица. Тогда весь параллелепипед представляет собой трехмерный массив. В памяти ЭВМ все ячейки пронумерованы. Номером ячейки является ее адрес. Поэтому можно считать ячейки памяти одномерным массивом.
В программе массив имеет
VAR M: ARRAY [1..5, 1..10] OF REAL;
Переменная M представляет собой матрицу, для которой m=5, n=10.Границы изменения индексов должны быть заданы целыми числами.
Любой элемент массива используется в программе так же, как переменная, только с указанием индекса (номера), например,
A:= M[3, 7] - 2; M[1, 1]:=0;
Рассмотрим несколько задач, связанных с массивами.
Задача 1. Суммирование элементов массива
Рассмотрим одномерный массив А из n элементов. Для вычисляемой суммы необходимо зарезервировать некоторую переменную и перед началом вычислений занести в нее 0.
Алгоритм вычислений:
S:= 0;
FOR I:= 1 TO N DO
S:= S+A[I];
Методом математической индукции можно доказать, что такой алгоритм действительно вычислит сумму n элементов массива.
Задача 2. Вычисление среднего значения m массива
. Следовательно, нужно накопленную в задаче 1 сумму разделить на N .
Задача 3. Сформировать массив, в котором ai = i2
FOR I:=1 TO N DO
A[I]:=I*I;
С
помощью массивов решаются многие задачи
линейной алгебры.
Задача 4. Найти скалярное произведение двух векторов
(а1, а2, …, аn), (b1, b2, …, bn) (длина их должна быть одинакова).
Скалярным произведением двух векторов называется . Поэтому алгоритм можно записать следующим образом.
S:= 0;
FOR I:=1 TO N DO
S:= S+A[I]*B[I];
Задача 5. Определение суммы векторов
Каждая компонента вектора суммы ci = ai + bi, следовательно,
FOR I:=1 TO N DO
C[I]:=A[I]+B[
Задача 6. Вычисление произведения двух матриц
Пусть даны две матрицы: A:= || aij || m*p, и B:= || bij || p*n.
Их произведение есть матрица
C:=A*B= || Cij || m*n, где -скалярное произведение вектора-строки с номером i на вектор-столбец с номером j. Алгоритм:
FOR I:=1 TO M DO
FOR J:=1 TO N DO
BEGIN
S:=0;
FOR K:=1 TO P DO
S:=S+
C[I,J]:=S
END;
если n<m/2,
если
n > m/2.
Алгоритмы информационного поиска и сортировки настолько тесно связаны друг с другом, что образуют, фактически, отдельный класс алгоритмов. Класс этот особенно интересен тем, что может использоваться при решении очень многих задач. С другой стороны, он имеет свою ярко выраженную специфику, связанную с тем, что внешне тривиальные задачи найти и упорядочить допускают разнообразные решения.
Задача поиска состоит в отыскании в последовательности элемента (или нескольких элементов) с заданными свойствами его значения. Например, найти элемент с наибольшим (наименьшим) значением или найти элемент с заданным значением. Подобные задачи возникают очень часто при составлении алгоритмов разной сложности. Постоянно решаются они машинами в различных информационно-поисковых системах. Конечно, поиск там более сложен, чем в тех задачах, которые мы сейчас рассмотрим, но идея остается той же самой.
Для более детального анализа алгоритмов поиска сформулируем конкретные задачи.
Обозначим исследуемую последовательность x1 , x2 , x3 , …,xN и составим алгоритмы решения каждой из предложенных задач.
Сделаем из мягкой проволоки рамку размером в любое произвольное яблоко. Таким образом, мы задались произвольным размером, который назовем эталоном. Берем следующее яблоко и пытаемся протащить его через рамку. Если оно не проходит, значит оно больше эталона. Такое яблоко нас не интересует, и мы его отбрасываем. Если же окажется, что очередное яблоко меньше эталона, то это уже претендент на наименьшее. Изменим эталон до размера этого яблока, подкрутив проволоку, и продолжим сравнение. Когда мы таким образом пропустим все яблоки через рамку, ее размер и будет размером наименьшего.