тест |
Данные, их типы, структуры и обработка
Наиболее часто используемая структура данных – массив.
Одномерный массив (вектор, ряд, линейная таблица) – это совокупность значений некоторого простого типа (целого, вещественного, символьного, текстового или логического типа), перенумерованных в каком-то порядке и имеющих общее имя. Для выделения конкретного элемента массива необходимо указать его порядковый номер в этом ряду.
Пример. Последовательность чисел 89, –65, 9, 0, –1.7 может образовывать одномерный вещественный массив размерности 5, например, с именем x вида: x[1] = 89, x[2] = –65, x[3] = 9, x[4] = 0, x[5] = –1.7.
Значение порядкового номера элемента массива называется индексом элемента.
Пример. Можно ссылаться на элемент х[4], элемент х[i], элемент x[4+j] массива х. При текущих значениях переменных i = 2 и j = 1 эти индексы определяют, соответственно, 4-й, 2-й и 5-й элементы массива.
Для обозначения (нового типа объектов) массивов в алгоритмических языках обычно вводится специальное служебное слово.
Пример. В ШАЯ – это слово "таб", после которого приводится имя массива и в квадратных скобках его размерность, например, для одномерного массива – в виде [m:n], где m – номер первого элемента массива (часто 1), n – номер последнего элемента (шаг перебора элементов равен 1). На Паскале имеется соответствующее слово array. Вышеуказанная последовательность из пяти чисел описывается на ШАЯ в виде: вещ таб x[1:7], а на Паскале (в рамках рассматриваемого нами его ядра) необходимо указывать предельную величину размерности:
x: array [1..100] of real;.
Двумерный массив ( матрица, прямоугольная таблица) – совокупность одномерных векторов, рассматриваемых либо "горизонтально" (векторов-строк), либо "вертикально" (векторов-столбцов) и имеющих одинаковую размерность, одинаковый тип и общее имя.
Матрицы, как и векторы, должны быть в алгоритме описаны служебным словом (например, таб или array ), но в отличие от вектора, матрица имеет описание двух индексов, разделяемых запятыми: первый определяет начальное и конечное значение номеров строк, а второй – столбцов.
Пример. Если матрица x описана в виде
x: array [1..5, 1..3] of real; ,
то определяется таблица из 5 строк (от 1-й до 5-й строки) и 3 столбцов (от 1-го до 3-го столбца) вида:
(столбец 1) | (столбец 2) | (столбец 3) | |
---|---|---|---|
x11 | x12 | х13 | (строка 1) |
x21 | x22 | х23 | (строка 2) |
х31 | х32 | х33 | (строка 3) |
х41 | x42 | х43 | (строка 4) |
х51 | x52 | х53 | (строка 5) |
Для актуализации элемента двумерного массива нужны два его индекса – номер строки и номер столбца, на пересечении которых стоит этот элемент.
Пример. Элемент х[3,2] – элемент на пересечении 3-й строки и 2-го столбца массива х.
Рассмотрим ряд задач, решаемых с помощью массивов.
Пример. Составим алгоритм (программу) нахождения суммы и произведения всех элементов одномерного массива. Метод решения: начиная с нулевого значения суммы, добавляем поочередно новый элемент ряда и находим значение искомой суммы; начиная с начального, единичного произведения, находим искомое произведение, умножая текущее значение произведения на очередной элемент ряда. Алгоритм (программа) имеет вид
Program SPM1; Uses Crt; Var x: array [1..100] of real; n, i: integer; s, р: real; Begin ClrScr; WriteLn('Введите размерность массива :'); { приглашение к вводу входного параметра } ReadLn(n); { ввод входного параметра } WriteLn('Введите элементы массива:'); { приглашение к вводу массива } for i:=1 to n do { цикл ввода элементов массива } begin write('x[',i,']='); { приглашение к вводу текущего элемента массива} readln(x[i]) { ввод текущего элемента массива } end; s:=0; { начальное значение суммы – нуль } p:=1; { начальное значение произведение – единица [u1]} for i:=1 to n do { цикл вычисления суммы и произведения } begin s:=s+x[i]; { добавление к сумме очередного слагаемого } p:=p*x[i] { домножение произведения на очередной множитель } end; WriteLn('Полученная сумма равна ', s: 3:3); { вывод полученной суммы } WriteLn('Полученное произведение равно ', p: 3:3); { вывод полученного произведения } End.
Пример. Составим алгоритм вычисления суммы бесконечного ряда чисел а[1], а[2], а[3], ... с точностью е, при условии, что точность всегда достигается для номера члена ряда не более 1000000 (это "неестественное" ограничение нужно для того, чтобы в Паскале было проще объявить размерность массива а ). Метод решения: сравниваем две суммы – одна сумма была получена на предыдущем шаге суммирования, а вторая – добавлением к ней очередного слагаемого (то есть их разность и равна очередному добавленному элементу ряда ); процесс суммирования продолжается до тех пор, пока разность по модулю не станет меньше точности суммирования. Алгоритм (программа) имеет вид
Program SumND; Uses Crt; Var a: array [1..1000000] of real; i: integer; e, p, s: real; begin ClrScr; WriteLn('Введите точность :'); { приглашение к вводу входного параметра } ReadLn(e); { ввод входного параметра } i:=1; { начальный номер члена ряда } WriteLn(‘введите первые два элемента :’); { приглашение к вводу входных параметров } ReadLn(a[1], a[2]); { ввод входных параметров } р:=а[1]; { запоминаем начальную сумму – сумму одного элемента } s:=р+a[2]; { запоминаем начальную следующую сумму – сумму двух элементов } while (abs(s–p)>e) do { цикл суммирования, пока слагаемые влияют на сумму } begin i:=i+1; { переход к следующему элементу } p:=s; { "старую" сумму заменяем "новой", полученной добавлением еще одного } s:=s+а[i]; { вычисляем "новую" сумму } WriteLn(‘введите a[‘, i, ‘]=’); { приглашение к вводу очередного элемента ряда } ReadLn(a[i]); { ввод очередного элемента ряда } end; WriteLn('Полученная сумма равна ', s: 3:3); { вывод результата } End.