Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Например:
Program primer_error;
Type
vector=array [1..80] of word;
var
n: integer;
a: vector;
begin
n:=45; a[n*2]:=25;
end.
Хотя данная программа полностью соответствует синтаксису языка, и транслятор «пропустит» ее, на стадии выполнения произойдет ошибка выхода за пределы массива. При n=45 выражение n*2=90, компьютер сделает попытку обратиться к элементу массива a[90], но такого элемента нет, поскольку описан массив размерностью 80.
Будем считать, что хорошая программа должна выдавать предупреждающее сообщение в случае попытки обращения к несуществующим элементам массива. Не лишним будет проверять возможный выход как за правую, так и за левую границы массива, ведь не исключено, что в результате вычисления значения выражения получится число, находящееся левее границы массива.
Из всего этого следует сделать вывод: программисту надо быть очень аккуратным при работе с индексами массива.
Основные действия с массивами
Как известно, определение типа данных означает ограничение области допустимых значений, внутреннее представление в ЭВМ, а также набор допустимых операций над данными этого типа. Мы определили тип данных массив. Какие же операции определены над этим типом данных? Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например,
Var
a, b: array [1..10] of real;
то можно переменной a присвоить значение переменной b (a:= b). При этом каждому элементу массива a будет присвоено соответствующее значение из массива b. Все остальные действия над массивами производятся поэлементно (это важно!).
Ввод массива
Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т. е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания.
Например (рассмотрим фрагмент программы),
Var
A: array [1..10] of integer;
I : byte; {переменная I вводится как индекс массива}
Begin
For i:=1 to 10 do
Readln (a[i]); {ввод i-го элемента производится с клавиатуры}
Рассмотрим теперь случай, когда массив заполняется автоматически случайными числами, для этого будем использовать функцию random(N).
Var
A: array [1..10] of integer;
I: byte; {переменная I вводится как индекс массива}
Begin
For i:=1 to 10 do
A[i]:= random(10); {i-му элементу массива присваивается
«случайное» целое число в диапазоне от 0 до 10}
Вывод массива
Вывод массива осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего.
Например,
Var
A: array [1..10] of integer;
I: byte; {переменная I вводится как индекс массива}
Begin
.............
For i:=1 to 10 do
Wtite (a[i],’ ‘); {вывод массива осуществляется в строку, после
каждого элемента печатается пробел}
Вывод можно осуществить и в столбик с указанием соответствующего индекса. Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т. е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана.
Например,
Var
A: array [1..10] of integer;
I: byte; {переменная I вводится как индекс массива}
Begin
...................
For i:=1 to 10 do
Writeln (‘a[‘, i,’]=’, a[i]); {вывод элементов массива в столбик}
На экране мы увидим, к примеру, следующие значения:
a[1]=2
a[2]=4
a[3]=1 и т. д.
Пример решения задачи с использованием массивов
Задача: даны два n-мерных вектора. Найти сумму этих векторов.
Решение задачи:
1. Входными данными в этой задаче будут являться два одномерных массива. Размер этих массивов может быть произвольным, но определенным. Т. е. мы можем описать заведомо большой массив, а в программе определить, сколько элементов реально будет использоваться. Элементы этих массивов могут быть целочисленными. Тогда описание будет выглядеть следующим образом:
var a, b: array [1..100] of integer;
2. Выходными данными будут элементы результирующего массива, назовем его c. Тип результирующего массива также должен быть целочисленным.
3. Кроме трех массивов нам потребуется переменная – параметр цикла и индекс массива, назовем ее i, а также переменная n для определения количества элементов в каждом массиве.
4. Ход решения задачи:
- определим количество элементов (размерность) массивов, введем значение n;
- введем массив a;
- введем массив b;
- в цикле, перебирая значения индекса i от 1 до n, вычислим последовательно значения элементов массива c по формуле: c[i]=a[i]+b[i];
- выведем на экран полученный массив.
Текст программы:
Program summa;
Var a, b, c: array [1..100] of integer; I, n: byte;
Begin
Write(‘введите размерность массивов:’);
Readln(n);
For i:=1 to n do
Readln (a[i]); {ввод массива a}
For i:=1 to n do
Readln (b[i]); {ввод массива b}
For i:=1 to n do
C[i]:=a[i]+b[i]; {вычисление суммы массивов}
For i:=1 to n do
write (c[i],’ ‘); {вывод массива с}
end.
Вопросы для повторения
1. В чем отличие простых и структурированных типов данных? К каким типам данных относится массив?
2. Что называется массивом?
3. Как в Паскале описываются переменные типа массив?
4. Может ли массив содержать один элемент? А ни одного?
5. Можно ли во время выполнения программы изменить размер массива (количество элементов, определенное во время описания)?
6. Верно ли, что тип элементов массива может быть любым?
7. Могут ли в одном массиве храниться элементы:
1, 2.3, ‘а’, -5.23, 0, ‘слово’, -2 ?
8. Может ли типом индекса быть тип integer или real?
9. Какие из приведенных описаний являются неправильными и почему?
· var a: array [1..20] of integer;
· type myarray=array [1..20];
var b: myarray;
· var sd: array [1..n] of integer;
· var dd: array[1] of integer;
10. Сколько элементов в каждом из следующих массивов:
· var mb: array [2..20] of integer;
· type myarray1= array [0..8] of integer;
myarray2= array [-5..5] of integer;
var aa: myarray1;
bb: myarray2;
11. Используя описание массивов из предыдущего пункта, определить, какие из приведенных обращений к элементам массивов неправильные и почему?
· mb[3];
· myarray1[2];
· aa[6];
· bb[6];
· aa[0];
· bb[0];
· bb[-3];
· aa[-3]
Лабораторная работа №5
Тема: Одномерные массивы
Задание 1
Задание: составить программу решения задачи.
Указание к выполнению: выполнить основные этапы решения задачи самостоятельно, ввод и вывод массива желательно оформить в виде процедур.
Вариант 1. Дан массив натуральных чисел. Найти сумму элементов, кратных данному числу K.
Вариант 2. В целочисленной последовательности есть нулевые элементы. Создать массив из номеров этих элементов.
Вариант 3. Дан массив действительных чисел, размерность которого N. Посчитать, сколько в нем отрицательных, положительных и нулевых элементов.
Вариант 4. Дана последовательность действительных чисел a1, a2, ..an. Выяснить, будет ли она возрастающей.
Вариант 5. Дана последовательность натуральных чисел a1, a2, ..an. Составить массив из четных чисел этой последовательности. Если таких чисел нет, то вывести сообщение об этом.
Вариант 6. Задана последовательность из N вещественных чисел. Определить, сколько среди них чисел меньших К, равных К и больших К.
Вариант 7. Дана последовательность чисел, среди которых имеется один нуль. Вывести на печать все числа до нуля включительно.
Вариант 8. Даны целые числа a1, a2, ..an. Указать те из них, для которых ai ³ i.
Вариант 9. При поступлении в вуз абитуриенты, получившие двойку на первом экзамене, ко второму не допускаются. В массиве A[n] записаны оценки, полученные на первом экзамене. Посчитать, сколько человек не допущено ко второму экзамену.
Вариант 10. Задана последовательность N вещественных чисел. Вычислить сколько раз меняется знак в данной последовательности.
Вариант 11. Задана последовательность N вещественных чисел. Вычислить
(среднее геометрическое).
Вариант 12. Задана последовательность N целых чисел. Вычислить сумму элементов, порядковые номера которых совпадают со значением этого элемента.
Вариант 13. Определить количество элементов последовательности натуральных чисел, кратных числу M, заключенных в промежутке от L до N.
Вариант 14. Определить, сколько процентов от всего количества элементов последовательности целых чисел составляют нечетные элементы.
Вариант 15. Даны натуральные числа a1, a2, ..an. Указать те из них, у которых остаток от деления на M равен L (0£ L£ M-1).
Задание 2
Задание: составить программу решения задачи.
Указание к выполнению: выполнить все этапы решения задачи самостоятельно, использовать процедуры ввода и вывода массивов, выделить в задаче вспомогательные алгоритмы и оформить их в виде подпрограмм.
Рекомендации к решению задач
Удаление элемента из массива. Удалить из массива максимальный элемент, если все элементы различные.
Решение: Приведем общие рассуждения.
Для того чтобы решить данную задачу, необходимо:
· найти номер максимального элемента k;
· сдвинуть все элементы, начиная с k-го, на один элемент влево;
· последнему элементу присвоить значение 0.
Рассмотрим на конкретном примере. Пусть дан одномерный массив из целых чисел, состоящий из 10 элементов:
6, 3, 4, 7, 11, 2, 13, 8, 1, 5.
Номер максимального элемента равен 7 (k=7), то есть, начиная с 7-го элемента, будем сдвигать элементы на один влево: 7-му элементу присвоим значение 8-го, 8-му присвоим значение 9-го, а
9-му присвоим значение 10-го, на этом сдвиг заканчивается. Таким образом, сдвиг начинается с k-го элемента и идет до (n-1)-го (где n – это количество элементов в массиве). После этого последнему элементу присвоим значение 0, тогда массив будет следующим:
6, 3, 4, 7, 11, 2, 8, 1, 5, 0.
Замечание: при удалении элемента из массива размерность массива не меняется, чтобы последний элемент не выводился, необходимо выводить уже не n элементов, а на 1 меньше.
Удаление нескольких элементов из массива. Удалить из массива все элементы, значение которых равно максимальному.
Решение:
Когда необходимо удалять несколько элементов, то лучше всего это делать с конца массива, так как иначе нужно будет снова возвращаться к элементу с номером, который только что удаляли (это случается тогда, когда подряд стоят два максимальных элемента, если первый удалим, то на его место встанет снова максимальный элемент).
Для решения этой задачи нам не нужен номер максимального элемента, а нужно знать значение. После того, как значение максимального элемента определено, просмотрим массив с конца и, если элемент имеет максимальное значение, то удалим его, при этом значение счетчика k будем увеличивать на 1.
После выполнения программы k будет равно количеству удаленных элементов, поэтому на экран будем выводить n-k элементов, где n – это количество элементов в исходном массиве.
Рассмотрим удаление нескольких максимальных элементов из массива целых чисел для n=10.
Пусть массив содержит следующие элементы:
6, 3, 4, 7, 11, 2, 13, 8, 13, 5.
Значение максимального элемента равно max=13. Будем просматривать массив с конца, изменяя индекс массива i от n до 1. На каждом шаге будем проверять условие: если i-й элемент равен max, то сдвинем все элементы, начиная с i до (n-1)-го на одну позицию влево, последнему элементу присвоим значение 0 и увеличим счетчик на 1 (k:=k+1).
После выполнения программы, мы получим массив вида:
6, 3, 4, 7, 11, 2, 8, 5, 0, 0.
Значение счетчика будет равно k=2. Остается вывести на экран n-k элементов (в нашем случае 8-2): 6, 3, 4, 7, 11, 2, 8, 5.
Вставка элемента в массив. Вставлять элемент можно до или после данного элемента, номер которого можно задать с клавиатуры или искать при определенных условиях.
1) Рассмотрим вставку элемента в массив после элемента с заданным номером, номер этого элемента введем с клавиатуры.
Решение:
Пусть k – это номер элемента, после которого мы должны вставить элемент x (k и x будем вводить с клавиатуры). Тогда вставка осуществляется следующим образом:
· первые k элементов массива остаются без изменений;
· все элементы, начиная с (k+1)-го, необходимо сдвинуть на одну позицию вправо;
· на место (k+1)-го элемента записываем значение x, т. е. после k-го элемента массива;
· при выводе массива необходимо учесть, что печатать придется уже не n (где n – количество элементов в исходном массиве), а n+1 элемент. Этот факт необходимо учесть еще при описании массива, чтобы не выйти за границы размерности.
2) Рассмотрим теперь вставку элемента в массив перед элементом с заданным номером.
Решение:
Эта вставка немногим отличается от предыдущей: в первой сдвигали все элементы, стоящие после k-го, то есть с (k+1)-го, а на его место ставили новый элемент. В этой – сдвигаем все элементы с k-го, а затем на его место ставим новый элемент.
Вставка нескольких элементов. Предположим, что надо вставлять не один элемент в массив, а по одному элементу после всех элементов с заданным свойством.
Пусть нужно вставить число после всех элементов массива кратных 3.
Решение: Приведем лишь общие рекомендации.
Первое, на что необходимо обратить внимание – это описание массива: на сколько элементов может увеличиваться массив? В нашем примере может оказаться, что все элементы исходного массива кратны 3, т. е. удовлетворяют заданному свойству. Значит, после каждого элемента нужно вставить число, т. е. количество элементов может увеличиться вдвое.
Второе. Если мы будем просматривать массив с начала и вставлять новый элемент после элемента с заданным свойством, то номер последнего элемента будет меняться, кроме того, будет просматриваться и новый (вставленный) элемент и его необходимо будет пропускать, поэтому решение будет не очень эффективным.
Лучше всего просматривать массив, начиная с конца, тогда вставляемый элемент мешать не будет. Кроме того, номер последнего элемента можно будет знать (если знать, сколько элементов вставлено на данный момент), при этом просмотр будет последовательным от N-го до
1-го.
Вариант 1. Дан целочисленный массив с количеством элементов n. Сжать массив, выбросив из него каждый второй элемент.
Вариант 2. Вставить по одному элементу перед всеми отрицательными элементами массива.
Вариант 3. Вставить два элемента: первый – после максимального элемента, второй – перед ним.
Вариант 4. Удалить из массива все отрицательные элементы.
Вариант 5. Преобразовать исходный массив, поменяв порядок элементов на обратный, не используя вспомогательный массив.
Вариант 6. Удалить все элементы массива, кратные 3 или 5.
Вариант 7. Вставить элемент перед последним отрицательным элементом массива.
Вариант 8. Дана упорядоченная последовательность. Вставить заданное число так, чтобы последовательность осталась упорядоченной.
Вариант 9. Преобразовать исходный массив, поменяв местами все пары соседних элементов.
Вариант 10. Преобразовать исходный массив, поменяв местами первый элемент с максимальным, а последний – с минимальным.
Вариант 11. Дан одномерный массив. Переставить в обратном порядке элементы массива, расположенные между максимальным и минимальным элементами.
Вариант 12. Дан одномерный массив. Удалить элемент, стоящий перед максимальным, а после максимального элемента вставить заданное число.
Вариант 13. Задан массив, содержащий несколько нулевых элементов. Сжать его, выбросив эти элементы.
Вариант 14. Массив заполнен нулями и единицами. Преобразовать этот массив так, чтобы вначале стояли нули, а затем единицы.
Вариант 15. Дан массив, состоящий из четного числа элементов. Поменять местами первую и вторую его половины, сохраняя порядок следования элементов в каждой половине.
Задание 3
Задание: отсортировать массив указанным способом.
Указание к выполнению: выполнить все этапы решения задачи самостоятельно, использовать процедуры ввода и вывода массивов, выделить в задаче вспомогательные алгоритмы и оформить их в виде подпрограмм.
Виды сортировок
Сортировка выбором. Дана последовательность чисел a1, a2, ..an. Требуется переставить элементы так, чтобы они были расположены по убыванию. Для этого в массиве, начиная с k-го, выбирается наибольший элемент и меняется местами с k-м. Эта процедура выполняется для
k= 1, 2, 3... n-1. При k=1 из всех элементов массива выбирается наибольший и меняется местами с k-м, т. е. с 1-м, таким образом, он занимает свое место. При k=2 из оставшихся (всех, кроме первого) выбирается максимальный элемент и меняется местами с k-м, т. е. со 2-м. Процедура эта повторяется, пока k не станет равно n-1. Тогда на последнем шаге из двух последних элементов выбирается максимальный, меняется местами с k-м, т. е. с (n-1)-м. После этого массив является отсортированным.
Сортировка методом «пузырька». Дана последовательность чисел a1, a2, ..an. Требуется переставить элементы так, чтобы они были расположены по возрастанию. Для этого из k элементов массива сравнивают каждую пару соседних элементов ai и ai+1. Если ai>ai+1, то их меняют местами. При первом прохождении массива самый большой элемент, как «пузырек», займет последнее место. Эта процедура выполняется для всех
k=n, n-1, n-2, ...2.
Шейкер-сортировка. Эта сортировка является усовершенствованной сортировкой методом «пузырька» (внимательно прочитайте предыдущее описание). Просмотр массива осуществляется последовательно в двух направлениях. Сначала массив проходят в «прямом» направлении, сравнивают каждую пару соседних элементов и, если ai>ai+1, то их меняют местами. При этом элемент с самым большим значением перемещается вверх и занимает последнее место. Затем массив просматривается в обратном направлении, начиная уже с (n-1)-го элемента. Сравнивают каждую пару соседних элементов и, если ai<ai-1, то их меняют местами. При этом элемент с самым маленьким значением перемещается вниз и занимает первое место. Затем этот процесс повторяется, начиная со второго элемента и т. д.
Сортировка вставками. Дана последовательность чисел a1, a2, ..an. Требуется переставить элементы так, чтобы массив стал упорядоченным. Пусть k элементов массива уже являются упорядоченными. Берется следующее число ak+1 и вставляется в последовательность так, чтобы оказались упорядоченными уже k+1 элемент. Выполняем эту процедуру для k=1, 2, 3, ..., n-1. Иными словами, при k=1 считаем, что первый элемент стоит на своем месте. Берем (k+1)-й, т. е. 2-й элемент, и переставляем его так, чтобы по порядку стояли уже первые два элемента. При k=2 считаем, что два элемента стоят на своем месте. Берем (k+1)-й, т. е. 3-й элемент, и переставляем его так, чтобы первые три элемента были упорядочены. Повторяем эту процедуру, пока k не станет равно n-1. Тогда берем (k+1)-й, т. е. последний элемент, и переставляем его так, чтобы он занял свое место среди предыдущих уже упорядоченных элементов. После этого массив отсортирован.
Сортировка Шелла. Дана последовательность чисел a1, a2, ..an. Требуется переставить элементы так, чтобы они были расположены по неубыванию. Делается это следующим образом: сравниваются два соседних элемента ai и ai+1. Если ai£ai+1, то продвигаются на один элемент вперед, а если ai>ai+1, то их меняют местами и сдвигаются на один элемент назад.
Сортировка подсчетом. Дана последовательность чисел a1, a2, ..an. Требуется переставить элементы так, чтобы они были расположены по возрастанию. Выходной массив заполняется фиксированными значениями, заведомо отличными от элементов исходного массива, например, равными –1. Затем для каждого элемента исходного массива определяется его место в выходном массиве путем подсчета количества элементов строго меньших данного. Естественно, что все равные элементы попадают на одну позицию в выходном массиве, за которой будет следовать ряд значений –1. После того, как позиции всех элементов исходного массива определены, и они размещены в выходном массиве, все оставшиеся в выходном массиве элементы равные –1 заполняются копией предыдущего значения.
Вариант 1. Упорядочить массив по неубыванию Шейкер-сортировкой.
Вариант 2. Упорядочить массив по возрастанию методом выбора.
Вариант 3. Упорядочить массив по убыванию методом вставки.
Вариант 4. Упорядочить массив по невозрастанию методом «пузырька».
Вариант 5. Упорядочить массив по убыванию методом выбора.
Вариант 6. Упорядочить массив по возрастанию методом подсчета.
Вариант 7. Упорядочить массив по возрастанию методом Шелла.
Вариант 8. Упорядочить массив по неубыванию методом вставки.
Вариант 9. Упорядочить массив по неубыванию методом подсчета.
Вариант 10. Упорядочить массив по неубыванию методом «пузырька».
Вариант 11. Упорядочить массив по невозрастанию методом выбора.
Вариант 12. Упорядочить массив по возрастанию методом вставки.
Вариант 13. Упорядочить массив по убыванию Шейкер-сортировкой.
Вариант 14. Упорядочить массив по невозрастанию методом Шелла.
Вариант 15. Упорядочить массив по невозрастанию методом подсчета.
Двумерные массивы – матрицы
Двумерный массив в Паскале трактуется как одномерный массив, тип элементов которого также является массивом (массив массивов). Положение элементов в двумерных массивах описывается двумя индексами. Их можно представить в виде прямоугольной таблицы или матрицы.
Рассмотрим матрицу размерностью 3*3, то есть в ней будет три строки, а в каждой строке по три элемента:

Каждый элемент имеет свой номер, как у одномерных массивов, но сейчас номер уже состоит из двух чисел – номера строки, в которой находится элемент, и номера столбца. Таким образом, номер элемента определяется пересечением строки и столбца. Например, a21 – это элемент, стоящий во второй строке и в первом столбце.
Описание двумерного массива. Существует несколько способов объявления двумерного массива.
Мы уже умеем описывать одномерные массивы, элементы которых могут иметь любой тип, а, следовательно, и сами элементы могут быть массивами. Рассмотрим следующее описание типов и переменных:
Type
Vector= array [1..5] of <тип_элементов>;
Matrix= array [1..10] of vector;
Var m: matrix;
Мы объявили матрицу m, состоящую из 10 строк, в каждой из которых 5 столбцов. При этом к каждой i-й строке можно обращаться m[i], а каждому j-му элементу внутри i-й строки – m[i, j].
Определение типов для двумерных массивов можно задавать и в одной строке:
Type
Matrix= array [1..5] of array [1..10] of <тип элементов>;
или еще проще:
type
matrix= array [1..5, 1..10] of <тип элементов>;
Обращение к элементам двумерного массива имеет вид: M[i, j]. Это означает, что мы хотим получить элемент, расположенный в i-й строке и
j-м столбце. Тут главное не перепутать строки со столбцами, а то мы можем снова получить обращение к несуществующему элементу. Например, обращение к элементу M[10, 5] имеет правильную форму записи, но может вызвать ошибку в работе программы.
Основные действия с матрицами
Все, что было сказано об основных действиях с одномерными массивами, справедливо и для матриц. Единственное действие, которое можно осуществить над однотипными матрицами целиком – это присваивание. Т. е., если в программе у нас описаны две матрицы одного типа, например,
type
matrix= array [1..5, 1..10] of integer;
var
a, b: matrix;
то в ходе выполнения программы можно присвоить матрице a значение матрицы b (a:=b). Все остальные действия выполняются поэлементно, при этом над элементами можно выполнять все допустимые операции, которые определены для типа данных элементов массива. Это означает, что если массив состоит из целых чисел, то над его элементами можно выполнять операции, определенные для целых чисел, если же массив состоит из символов, то к ним применимы операции, определенные для работы с символами.
Ввод матрицы. Для последовательного ввода элементов одномерного массива мы использовали цикл for, в котором изменяли значение индекса с 1-го до последнего. Но положение элемента в двумерном массиве определяется двумя индексами: номером строки и номером столбца. Это значит, что нам нужно будет последовательно изменять номер строки с 1-й до последней и в каждой строке перебирать элементы столбцов с 1-го до последнего. Значит, нам потребуется два цикла for, причем один из них будет вложен в другой.
Рассмотрим пример ввода матрицы с клавиатуры:
type
matrix= array [1..5, 1..10] of integer;
var
a, : matrix;
i, j: integer; {индексы массива}
begin
for i:=1 to 5 do {цикл для перебора всех строк}
for j:=1 to 10 do {перебор всех элементов строки по столбцам}
readln(a[i, j]); {ввод с клавиатуры элемента, стоящего в i-й строке
и j-м столбце}
Матрицу можно заполнить случайным образом, т. е. использовать функцию random(N), а также присвоить каждому элементу матрицы значение некоторого выражения. Способ заполнения матрицы выбирается в зависимости от поставленной задачи, но в любом случае должен быть определен каждый элемент в каждой строке и каждом столбце.
Вывод матрицы на экран. Вывод элементов матрицы также осуществляется последовательно, необходимо напечатать элементы каждой строки и каждого столбца. При этом хотелось бы, чтобы элементы, стоящие в одной строке, печатались рядом, т. е. в строку, а элементы столбца располагались один под другим. Для этого необходимо выполнить следующую последовательность действий (рассмотрим фрагмент программы для массива, описанного в предыдущем примере):
for i:=1 to 5 do {цикл для перебора всех строк}
begin
for j:=1 to 10 do {перебор всех элементов строки по столбцам}
write (a[i, j]:4); {печать элементов, стоящих в i-й строке матрицы в
одной экранной строке, при этом для вывода
каждого элемента отводится 4 позиции}
writeln; {прежде, чем сменить номер строки в матрице, нужно
перевести курсор на начало новой экранной строки}
end;
Замечание (это важно!): очень часто в программах студентов встречается ошибка, когда ввод с клавиатуры или вывод на экран массива пытаются осуществить следующим образом: readln(a), writeln(a), где а – это переменная типа массив. При этом их удивляет сообщение компилятора, что переменную этого типа невозможно считать или напечатать. Может быть, вы поймете, почему этого сделать нельзя, если представите N кружек, стоящих в ряд, а у вас в руках, например, чайник с водой. Можете вы по команде «налей воду» наполнить сразу все кружки? Как бы вы ни старались, но в каждую кружку придется наливать отдельно. Заполнение и вывод на экран элементов массива также должно осуществляться последовательно и поэлементно, т. к. в памяти ЭВМ элементы массива располагаются в последовательных ячейках.
Представление массива в памяти
Элементы абстрактного массива в памяти машины физически располагаются последовательно, согласно описанию. При этом каждый элемент занимает в памяти количество байт, соответствующее его размеру. Например, если массив состоит из элементов типа integer, то каждый элемент будет занимать по два байта. А весь массив займет S´2 байта, где S – количество элементов в массиве.
А сколько места займет массив, состоящий из массивов, т. е. матрица? Очевидно: Si´Sj, где Si - количество строк, а Sj – количество элементов в каждой строке. Например, для массива типа
Matrix= array [1..3, 1..2] of integer;
потребуется 12 байт памяти.
Как будут располагаться в памяти элементы этого массива? Рассмотрим схему размещения массива M типа matrix в памяти.
Элемент | M11 | Элемент | M12 | Элемент | M21 | Элемент | M22 | Элемент | M31 | Элемент | M32 |
![]()
Под каждый элемент M[i, j] типа integer выделяется две ячейки памяти. Размещение в памяти осуществляется «снизу вверх». Элементы размещаются в порядке изменения индекса, что соответствует схеме вложенных циклов: сначала размещается первая строка, затем вторая, третья... Внутри строки по порядку идут элементы: первый, второй и т. д.
Как мы знаем, доступ к любой переменной возможен, только если известен адрес ячейки памяти, в которой хранится переменная. Конкретная память выделяется для переменной при загрузке программы, то есть устанавливается взаимное соответствие между переменной и адресом ячейки. Но если мы объявили переменную как массив, то программа «знает» адрес начала массива, то есть первого его элемента. Как же происходит доступ ко всем другим элементам массива? При реальном доступе к ячейке памяти, в которой хранится элемент двумерного массива, система вычисляет ее адрес по формуле:
Addr+SizeElem*Cols*(I-1)+SizeElem*(J-1),
где Addr – фактический начальный адрес, по которому массив располагается в памяти; I, J – индексы элемента в двумерном массиве; SizeElem – размер элемента массива (например, два байта для элементов типа integer); Cols – количество элементов в строке.
Выражение SizeElem*Cols*(I-1)+SizeElem*(J-1) называют смещением относительно начала массива.
Сколько памяти выделяется для массива?
Рассмотрим не столько вопрос о том, сколько памяти выделяется под массив (это мы разобрали в предыдущем разделе), а о том, каков максимально допустимый размер массива, учитывая ограниченный объем памяти.
Для работы программы память выделяется сегментами по 64 Кбайт каждый, причем как минимум один из них определяется как сегмент данных. Вот в этом-то сегменте и располагаются те данные, которые будет обрабатывать программа. Ни одна переменная программы не может располагаться более чем в одном сегменте. Поэтому, даже если в сегменте находится только одна переменная, описанная как массив, то она не сможет получить более чем 65536 байт. Но почти наверняка, кроме массива в сегменте данных будут описаны еще некоторые переменные, поэтому реальный объем памяти, который может быть выделен под массив, находится по формуле: 65536-S, где S – объем памяти, уже выделенный под другие переменные.
Зачем нам это знать? Для того чтобы не удивляться, если при компиляции транслятор выдаст сообщение об ошибке объявления слишком длинного массива, когда в программе встретит описание (правильное с точки зрения синтаксиса):
Type myArray= array [1..50000] of integer;
Вы уже знаете, что, учитывая двухбайтовое представление целых чисел, реально можно объявить массив с количеством элементов равным 65536/2 –1=32767. И то лишь в том случае, если других переменных не будет. Двумерные массивы должны иметь еще меньшие границы индексов.
Примеры решения задач
Задача: Найти произведение ненулевых элементов матрицы.
Решение:
1. Для решения данной задачи нам потребуются переменные: матрица, состоящая, например, из целочисленных элементов; P – произведение элементов, отличных от 0; I, J – индексы массива; N, M – количество строк и столбцов в матрице.
2. Входными данными являются N, M – их значения введем с клавиатуры; матрица – ввод матрицы оформим в виде процедуры, заполнение матрицы осуществим случайным образом, т. е. с помощью функции random().
3. Выходными данными будет являться значение переменной P (произведение).
4. Чтобы проверить правильность выполнения программы, необходимо вывести матрицу на экран, для этого оформим процедуру вывода матрицы.
5. Ход решения задачи:
обсудим сначала выполнение основной программы, реализацию процедур обговорим чуть позже:
· введем значения N и M;
· Введем матрицу, для этого обращаемся к процедуре vvod(a), где а – матрица;
· Напечатаем полученную матрицу, для этого обращаемся к процедуре print(a);
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


