Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1курс_задания_к_лаб_old.doc
Скачиваний:
7
Добавлен:
19.11.2018
Размер:
1.12 Mб
Скачать

Массивы

В качестве номера (индекса) i элемента массива A[i] используется выражение порядкового типа. Наиболее часто индекс – это целая константа или переменная типа Integer, реже – типа Char или Boolean.

Описание для одномерного массива:

Var ИмяМассива : Array[НижняяГраница .. ВерхняяГраница] Of ТипЭлементов;

Например,

Var

a: array[1..100] of Integer; {100 элементов – целые числа}

c: array[-3..4] of Boolean; {8 элементов – логические значения}

d: array [‘a’..’z’] of Integer; {26 элементов (т.к. 26 букв) – целые числа}

Описание для двумерного массива:

Var ИмяМассива : Array[НижняяГраница1 .. ВерхняяГраница1,

НижняяГраница2 .. ВерхняяГраница2] Of ТипЭлементов;

Например,

Var

a: array[1..3,1..4] of Real; {12 элементов – вещественные числа}

Предварительное описание типа массива:

Type

ИмяТипа = array[НижняяГраница .. ВерхняяГраница] Of ТипЭлементов;

Var

ИмяМассива: ИмяТипа;

Например,

Const

maxr = 10; maxc = 10;

Type

Matr = array[1..maxr,1..maxc] of Real;

Var

Matrix: Matr; {Matrix – имя переменной, Matr – ее тип}

Например,

Type

Days = (Sunday,Monday,Tuesday,Wednsday,Thursday,Friday,Saturday);

Hour = 1..24;

Matr = array[Days,Hour] of Real;

Var

Matrix : Matr;

Begin

Matrix[Sunday,12]:=10;

End.

Инициализация массивов начальными значениями:

Const

x:array[1..5] of Integer = (1,3,5,7,9);

y:array[1..2,1..3] of Real = ((1,3.5,7.8),(2.3,4,8.2));

ВЫВОД ЭЛЕМЕНТОВ МАССИВА:

For i:=1 to n do

Begin

For j:=1 to m do Write(a[i,j]:4);

Writeln;

End;

ПОДСЧЕТ КОЛИЧЕСТВА ЭЛЕМЕНТОВ,

УДОВЛЕТВОРЯЮЩИХ КАКОМУ-НИБУДЬ УСЛОВИЮ:

Например, подсчитаем количество четных чисел в целочисленном массиве.

k:=0;

For i:=1 to n do

If a[i] mod 2 = 0 then k:=k+1; {если число четное, т.е. делится на 2,то увеличиваем }

{ счетчик четных чисел k на 1}

ПОИСК МАКСИМАЛЬНОГО ЭЛЕМЕНТА:

Max:=a[1]; {поиск начинаем с первого элемента}

k:=1;

For i:=2 to n do {перебираем элементы, начиная со второго}

If a[i]>max then

begin

Max:=a[i]; {запоминаем значение и номер элемента,}

k:=i; {который больше всех предыдущих}

end; {Переменная max может и не понадобиться, если нужен только номер максимального элемента}

ПЕРЕСТАНОВКИ ЭЛЕМЕНТОВ В МАССИВЕ.

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

Например, переставим местами первый и второй элементы массива a, используя для временного хранения переменную М:

M:=a[1];

a[1]:=a[2];

a[2]:=M;

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

Например, поменяем местами все элементы первой и второй строки:

For j:=1 to m do {Индекс j перебирает элементы нужной строки (первой или второй)}

Begin

M:=a[1,j];

a[1,j]:=a[2,j];

a[2,j]:=M;

End;

СОРТИРОВКА (УПОРЯДОЧЕНИЕ) ЭЛЕМЕНТОВ МАССИВА:

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

Сортировка методом «пузырька».

Const

count=20;

Type

Vect = array[1..count] of integer;

Var

a:vect=(9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);

i,j,M:integer;

begin

{Сортировка методом «пузырька»}

for i:=2 to count do

for j:=count downto i do

if a[j-1]<a[j] then begin {перестановка элементов}

M:=a[j-1];

a[j-1]:=a[j];

a[j]:=M;

end;

For i:=1 to count do

Writeln(a[i]);

end;

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

Линейная сортировка (сортировка отбором).

Const

count=20; {число элементов массива}

Type

Vector = array[1..count] of integer;

Var

a: vector = (9,11,12,3,19,1,5,17,10,18,3,19,17,9,12,20,20,19,2,5);

i,j,M:integer;

Begin

for i:=1 to count-1 do

{Сравниваем поочередно первый элемент неотсортированой}

{части массива со всеми остальными до конца }

for j:=i+1 to count do

if a[i]<a[j] then {меняем местами элементы}

begin

M:=a[i];

a[i]:=a[j];

a[j]:=M;

end;

For i:=1 to count do

Writeln(a[i]);

end;

Идея линейной сортировки по невозрастанию заключается в том, чтобы, последовательно просматривая весь массив, отыскать наибольший элемент и поменять его местами с первым элементом. Затем просматриваются элементы, начиная со второго, снова находится наибольший, который, в свою очередь, меняется местами со вторым и так далее. Этот метод требует меньшего числа перестановок, чем «пузырек», но количество итераций (повторений цикла) у обоих методов одинаково.

УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР:

For i:=1 to n do {цикл по строкам – элементам будущего }

Begin

s:=0;

For j:=1 to m do

s:=s+a[i,j]*x[j];

y[i]:=s; {находим компоненты вектора ()}.

End;

ПЕРЕДАЧА В ПРОЦЕДУРУ МАССИВОВ ПЕРЕМЕННЫХ РАЗМЕРОВ:

Речь идет об использовании массивов как параметров подпрограмм. Чтобы снять ограничения размерности для параметров – одномерных массивов, можно использовать открытые массивы. Открытые массивы – это конструкция описания типа массива без указания типа индексов, например: array of real; array of integer. Такое определение массива возможно только при описании формальных параметров подпрограммы.

Пример использования открытых массивов и нетипизированных параметров на примере процедуры вывода массива переменной длины.

Var

a: array[1..5] of integer;

b: array[0..2] of integer;

i: integer;

procedure print1(a:array of integer; n:integer);

{способ 1 – задаем кол-во элементов в качестве параметров}

var k:integer;

begin

for k:=0 to n-1 do Writeln(a[k]);

end;

procedure print2(a:array of integer);

{Способ 2 – используем функцию high}

{эта функция для обычного массива возвращает верхнюю границу}

{индекса массива, для открытого – максимальное значение индекса}

var k:integer;

begin

for k:=0 to high(a) do Writeln(a[k]);

end;

begin

for i:=1 to 5 do a[i]:=random(10);

for i:=0 to 2 do b[i]:=random(50);

{Программа выводит массивы разных размеров}

print1(a,5);

print1(b,3);

print2(a);

print2(b);

end.

ЗАДАЧИ.

Одномерные массивы:

  1. Подсчитать количество элементов одномерного массива, кратных трем. Размерность массива задается с клавиатуры. Значения элементов генерируются случайно.

  2. Задан одномерный массив, состоящий из одних цифр. Посчитать сумму четных и нечетных значений элементов массива. Число элементов и их значения вводятся с клавиатуры (с проверкой).

  3. ! Заданы натуральное число и последовательность вещественных чисел . Сформировать одномерный массив такой, что ; . Отсортировать массив по возрастанию. Значение задать с клавиатуры, последовательность чисел определить случайным образом.

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

  5. Составить программу для выполнения заданных действий над одномерным массивом – вектором из элементов:

5.1. Выполнить нормировку вектора по максимальному элементу

5.2. Определить количество элементов вектора, значения которых больше среднего арифметического всех его элементов.

5.3. В заданном векторе есть хотя бы один ноль. Вычислить произведение элементов вектора до первого нуля.

5.4. В заданном векторе умножить все элементы, имеющие четные номера, на значение его максимального элемента.

5.5. Переставить местами первый и максимальный элемент, последний и минимальный элемент.

5.6 В заданном векторе найти его оригинальные (неповторяющиеся) элементы и сформировать из них вектор .

5.7.! В заданном векторе поменять местами первый элемент с последним, второй – с предпоследним и т.д.

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

5.9.! В заданном векторе найти его максимальный и минимальный элементы. Выполнить сортировку элементов вектора, стоящих между минимальным и максимальным элементами: по возрастанию, если минимальный элемент стоит в векторе левее максимального; по убыванию, если максимальный элемент стоит левее минимального.

5.10.! Задать 2 одномерных массива и из и элементов соответственно. Сформировать вектор , включив в него элементы, присутствующие в и одновременно. Вектор не должен содержать одинаковых элементов.

5.11.! Задать 2 одномерных упорядоченных массива и из и элементов соответственно. Необходимо «слить» их в один вектор , не нарушив при этом упорядоченности.

  1. Даны m векторов x1=(x11, x21, x31), ..., xm=(x1m, x2m, x3m). Написать программу нахождения суммы этих векторов.

  2. Даны векторы а=(a1, a2, a3) и b=(b1, b2, b3). Написать программу вычисления скалярного и векторного произведений этих векторов.

  3. ! Даны три вектора а=(a1, a2, a3), b=(b1, b2, b3) и c=(c1, c2, c3). Написать программу вычисления смешанного произведения этих векторов.

  4. Даны два вектора а=(a1, a2, a3) и b=(b1, b2, b3). Написать программу, которая находит угол между этими векторами.

  5. ! Даны векторы а=(a1, a2, a3), b=(b1, b2, b3), c=(c1, c2, c3) и d=(d1, d2, d3). Написать программу, вычисляющую скалярное произведение хb)*(cxd).

  6. Даны две точки в n-мерном пространстве X=(х1, х2, ..., хn), Y=(y1, y2,...,yn). Написать программу нахождения расстояния между этими точками и вектора XY.

  7. Дан n-мерный вектор х=(х1, х2, ...,хn). Написать программу, которая может находить вектор y=(xn, xn-1, xn-2, ..., x2, x1) и скалярное произведение x*y.

Двумерные массивы:

  1. Задана вещественная матрица размерности , все элементы которой задаются случайно. В каждой строке выбрать минимальный элемент, затем среди этих чисел выбрать максимальное. Размерность матрицы вводится с клавиатуры.

  2. Вычислить сумму двух одинаковых матриц произвольного размера (с проверкой размеров). Размерность задается с клавиатуры. Значения элементов генерируются случайно.

  3. Вычислить произведение двух матриц произвольного размера (с проверкой размеров). Размерность задается с клавиатуры. Значения элементов генерируются случайно.

  4. На плоскости заданы N точек, координаты которых записаны в двумерном массиве. Составить программу, которая определяет порядок соединения точек непересекающейся незамкнутой ломаной. Размерность массива задается с клавиатуры. Значения элементов генерируются случайно. Сортировка -координаты по возрастанию.

  5. Задан двумерный массив вещественных чисел. Заменить все отрицательные элементы нулями и подсчитать сумму положительных элементов в каждом столбце. Размерность массива ввести с клавиатуры, элементы массива определить случайным образом.

  6. Дан двумерный массив чисел. Составить программу подсчета количества нулей в четных строках и количества единиц в нечетных. Размерность массива задается с клавиатуры. Значения элементов генерируются случайно.

  7. Задан двумерный массив размерности . Сформировать массив , в который записать суммы элементов строк и массив , в который записать суммы элементов столбцов исходного массива . и ввести с клавиатуры, элементы массива определить случайным образом.

  8. Составить программу выполнения заданных действий над двумерным массивом вещественных чисел – матрицей . Предусмотреть любой удобный способ заполнения массива , вывод исходной и, при необходимости, преобразованной матриц:

8.1. Вычислить сумму и число положительных элементов каждого столбца. Вывести результаты в виде 2 строк.

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

8.3. Найти наибольший и наименьший элементы и поменять их местами.

8.4.! Найти наибольший и наименьший элементы и поменять местами строки, содержащие их.

8.5. Найти строку с наибольшей и наименьшей суммой элементов. Вывести найденные строки и суммы.

8.6.! Выполнить циклическую перестановку столбцов, при которой -ый столбец становится на место -го, а последний столбец становится первым.

8.7. Упорядочить по возрастанию элементы каждой строки.

8.8.! Выполнить сортировку нечетных строк по возрастанию, четных – по убыванию.

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

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

  1. Дана матрица А(nxn) и вектор а = (a1, a2, ..., an). Написать программу вычисления вектора b = A*a.

  2. Дана матрица А(nxn). Построить n-мерный вектор по правилу: если в строке матрицы с номером i есть отрицательные элементы, то bi = 0, в противном случае bi = 1.

  3. Дана матрица А(nxn). Написать программу вычисления матрицы Аk, где k>0 - целое число.

  4. Даны два вектора b = (b1, b2, ..., bn), x = (x1,x2, ..., xn) и матрица А(nxn). Написать программу вычисления длины вектора Ах - b.

  5. Даны две матрицы А(nxn) и B(nxn). Написать программу нахождения суммы диагональных элементов А*В.

  6. Даны квадратные матрицы А(nxn), B(nxn), C(nxn). Написать программу вычисления матрицы (А+В)*С.

  7. ! Даны две матрицы А(nxn) и B(nxn), а также два вектора х = (x1, x2,..., xn) и y = (y1, y2, ..., yn). Написать программу нахождения скалярного произведения (Ах)*(Ву).

  8. ! Дана матрица А(nxn) и вектор х = (х1, х2, ...,хn). Написать программу нахождения скалярного произведения (х*Ах).

  9. ! Дана матрица А(nxn). Написать программу вычисления max(Sk), где .

  10. * Даны две матрицы А(nxn) и B(nxn). Написать программу нахождения матрицы, равной (А-В)т.

  11. ! Задана целочисленная матрица . Из этой матрицы выбрать столбец, который обладает наибольшей суммой элементов. Если таких столбцов несколько, то выбрать первый из них. Далее в данном столбце определить наименьший и наибольший по значению элемент.

  12. * Задана двумерная матрица целых чисел. Найти определитель матрицы. Массив заполнить случайным образом, размерность массива вводится с клавиатуры.

  13. ! Определить, является ли заданная целая квадратная матрица 10-го порядка симметричной (относительно главной диагонали).

  14. * Задана двумерная матрица размерности . Необходимо, не используя дополнительный массив, транспонировать данную матрицу. Размерность матрицы вводится с клавиатуры, элементы матрицы определяются случайным образом.

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

  16. ! Дан одномерный массив, элементами которого являются числа 1, 2, 3. Составить программу, которая преобразует массив таким образом, чтобы в начале располагались одни единицы, затем тройки и двойки. Размерность массива задается с клавиатуры. Значения элементов генерируются случайно.

  17. ! Задана матрица размерности и размерности . Определить матрицу размерности , равную произведению матриц и .

  18. ! Создать массив размерности . Элементы массива определяются случайным образом. Записать в этот же массив все отрицательные числа, затем все положительные и нули, сохраняя порядок их следования. Значения и вводятся с клавиатуры.

  19. !. Дана вещественная матрица размером , все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.

  20. * Задана одномерная матрица вещественных чисел. Расположить в порядке возрастания сначала целые числа, затем действительные. Размерность массива вводится с клавиатуры.

  21. * Сформировать из матрицы А матрицу В по следующим правилам:

  • элементы матриц принимают только значения 0 или 1.

  • соседями элемента А[i,j] являются все элементы, расположенные рядом с данным по горизонтали, вертикали и диагонали.

  • если сумма значений соседей элемента А[i,j] меньше двух или больше трех, то значение B[i,j] = 0.

  • если сумма значений соседей элемента А[i,j] равна трем, то значение B[i,j] = 1.

Вывести массив на экран, заменив 0 символом пробела, а 1 — символом звездочки (*).

  1. * Создать динамический массив размерности . Элементы массива определяются случайным образом. Записать в этот же массив все отрицательные числа, затем все положительные и нули, отсортированные по возрастанию. Значения и вводятся с клавиатуры.

  2. * Задан двумерный массив действительных чисел. Упорядочить массив в порядке возрастания элементов указываемой пользователем строки. Массив заполнить случайным образом, размерность массива и номер строки, по которой будет проводиться сортировка, вводится с клавиатуры.

  3. * Задана квадратная матрица целых чисел. Определить, равны ли сумма первой строки и последнего столбца, сумма второй строки и предпоследнего столбца, и так далее. Массив заполнить случайным образом, размерность массива вводится с клавиатуры.

  4. * Задана двумерная матрица целых чисел. При помощи элементарных операций над матрицей привести её к треугольному виду. Массив разместить в памяти динамически и заполнить случайным образом, размерность массива вводится с клавиатуры.

  5. * Проверить, является ли заданная целая квадратная матрица 10-го порядка ортонормированной, т.е. такой, в которой скалярное произведение каждой пары различных строк равно 0, а скалярное произведение каждой строки на себя равно 1.

  6. * По заданным коэффициентам и правым частям решить систему линейных уравнений , считая, что ее определитель отличен от нуля. (Решать методом Гаусса, предусматривающим приведение системы к «треугольному» виду).

  7. В матрице А(nxn) найти максимальный и минимальный элементы. Указать их разность, а также строки и столбцы, на пересечении которых они находятся.

  8. Дана матрица А(nxn). Написать программу нахождения минимального элемента из (max1, ...,maxn), где maxi - максимальный в i - той строке.