3) Словесный алгоритм решения задачи.
4) Текст программы.
5) Результаты тестов.
6. Пример выполнения работы и оформления отчета
Лабораторная работа №3
«Работа с массивами»
1. Постановка задачи:
1) Сформировать с помощью датчика случайных чисел одномерный массив размерности М, которая задается пользователем.
2) Полученный массив напечатать.
3) Выполнить обработку и преобразование массива в соответствии со своим вариантом.
4) Напечатать преобразованный массив.
Вариант №26.
1) Вычислить количество четных чисел в массиве.
2) Удалить из массива все четные элементы. Оставшиеся элементы сдвинуть в начало массива, конец массива заполнить нулями.
2. Анализ задания:
1 задача относится к первому классу задач, т. к. для каждого элемент массива требуется проверить условие четности элемента.
2 задача относится к 3 классу , т. к. для ее решения будет использоваться вспомогательный массив, массивы будут обрабатываться с помощью различных схем перебора, т. е. обработка асинхронная.
3. Алгоритм решения 1 задачи:
Организуем перебор массива от начала к концу по одному элементу, для каждого элемента проверим условие четности a[I] mod 2 =0. Ели условие выполнится, то счетчик четных чисел увеличим на 1.
Алгоритм решения 2 задачи:
Организуем перебор массива от начала к концу по одному элементу, для каждого элемента проверим условие нечетности a[I] mod 2 <>0. Ели условие выполнится, то запишем этот элемент во вспомогательный массив B. Затем оставшиеся элементы массива B заполним нулями.
4. Программа
Var a:array[1..100]of integer;
I,J,K,M:integer;
Begin
Writeln (‘Введите количество элементов массива’);
Read(M);
Writeln(‘Сформирован массив целых чисел’);
For I:= 1 to M do begin
a[I]:=random(100)-50;
Write(a[I],’ ‘);
End;
Writeln;
K:=0;
For I:=1 to M do
If a[I]mod 2=0 then K:=K+1;
If k>0 then
Writeln(‘в массиве ‘ , K, ‘ четных элементов’)
Else begin
Writeln (‘Четных элементов нет’);
exit;{выход из программы}
Writeln(‘Удаление четных элементов из массива’);
J:=0;
For I:=1 to M do
If a[I]mod 2<>0 then begin
J:=J+1;
b[J]:=a[I];
end;
K:=J;
For I:=K to M do b[J]:=0;
For I:=1 to M do write(b[I],’ ‘);
Writeln;
End.
5. Тесты:
N | Исходный массив | Результат |
5 | 34 –56 45 2 7 | К=3 45 7 0 0 0 |
5 | 34 2 62 8 18 | К=5 0 0 0 0 0 |
5 | 33 5 47 –15 -9 | Четных чисел нет |
1) Использование структур данных при решении задач;
2) Использование подпрограмм при решении задач.
Подпрограммы представляют собой относительно самостоятельные фрагменты программ, оформленные особым образом и имеющие имя. С их помощью программист может оформить часто используемый фрагмент в виде удобном для многократного исполнения. Подпрограммы позволяют разбить любую программу на несколько независимых частей. Такое разбиение необходимо по двум причинам:
1) Это средство экономии памяти, т. к . каждая подпрограмма существует в программе в единственном экземпляре, а обращаться к ней можно многократно из различных точек программы.
2) Использование методики нисходящего проектирования программ, когда алгоритм представляется в виде относительно крупных подпрограмм, реализующих более менее самостоятельные части алгоритма. Подпрограммы в свою очередь могут разбиваться на более мелкие подпрограммы нижнего уровня и т. д. – до тех пор пока реализуемые подпрограммами алгоритмы не станут настолько простыми, что их можно будет легко запрограммировать.
Работа с подпрограммой состоит из двух этапов:
1) описание подпрограммы;
2) вызов ее в основной программе для исполнения.
Описание подпрограммы:
<заголовок>
<описание данных>
begin
<тело подпрограммы>
end;
Заголовок процедуры имеет вид:
Procedure <имя>[(<список_формальных_параметров>)];
Заголовок функции имеет вид:
Function <имя>[(<список_формальных_параметров>)]:<тип>;
<имя> - имя подпрограммы;
<список_формальных_параметров> - список передаваемых или возвращаемых подпрограммой данных;
<тип> - тип возвращаемого функцией результата.
Список формальных параметров может отсутствовать.
При вызове подпрограммы формальные параметры заменяются фактическими. Фактические и формальные параметры должны соответствовать друг другу по количеству, типу и порядку следования.
Параметры подразделяются на параметры-значения, параметры-переменные и параметры-константы. Если параметр определен как параметр-переменная (перед ним ставится слово Var), то при вызове подпрограммы передается адрес соответствующей переменной, следовательно, изменение такого параметра приводит к изменению значения по указанному адресу, и фактический параметр тоже меняется. Если параметр определен как параметр-значение, то перед вызовом подпрограммы это значение вычисляется, полученный результат копируется во временную память и передается в подпрограмму. Любые возможные изменения этого параметра не воспринимаются вызывающей программой, следовательно, фактический параметр не меняется. При использовании параметров констант (перед ним ставится слово Const) в подпрограмму будет передаваться адрес области памяти, в которой располагается переменная или вычисляемое значение, но компилятор блокирует присваивание нового значения параметру-константе в теле программы.
2.3. Передача результата из подпрограммы в вызывающую программу
Результатом функции является одно единственное значение. Для передачи этого значение в вызывающую программу имени функции обязательно должен быть присвоен результат.
Пример.
Function Tan(x:Real);
Begin
Tan:=sin(x)/cos(x);
End;
. . . . .
begin{main}
. . . . .
a:=tan(0.1234);
b:=tan(y);
c:=tan(a/b);
. . . . . .
End.
Процедура может возвращать несколько значений. Для этого в процедуре используются параметры-переменные.
Пример:
Procedure Tan(x:Real; var y:Real);
Begin
Y:=sin(x)/cos(x);
End;
. . . . . .
begin{main}
. . . . .
Tan(0.1234,a);
Tan(y, b);
Tan(a/b, c);
. . . .
End.
2.4. Локальные и глобальные переменные
Переменные, описанные в подпрограмме, называются локальными. Они доступны только в той подпрограмме, в которой они описаны. Переменные, описанные до описания этой подпрограммы, называются глобальными.
Пример.
Program P;
Var A, B :Integer;{глобальные}
Procedure P1;
Var B, C :Real;{локальные}
Begin
. . . . . .
End;{P1}
. . . . .
End.{P}
Одноименные локальные и глобальные переменные – это разные переменные. Любое обращение к таким переменным в теле подпрограммы трактуется как обращение к локальным переменным, т. е. одноименные глобальные переменные будут недоступны.
2.5. Параметры-массивы и параметры-строки
Типом любого параметра в списке формальных параметров может только стандартный или заранее определенный тип. Поэтому при передаче массива следует сначала описать его тип. Пример:
Type mas=array[1..100]of integer;
Procedure P(a:mas);
. . . . . . .
Так как строка является своеобразным массивом, передача строк в подпрограммы осуществляется аналогично.
Используя процедуры или функции, сформировать двумерный массив (матрицу), распечатать его, решить указанную в варианте задачу и вывести результаты в удобном для пользователя виде.
1. В двумерном массиве записаны слова, представляющие собой последовательность цифр, завершающихся 0. Необходимо распечатать слова через запятую, заключив печатную строку в скобки. Длина печатной строки 60 символов. Извлечение слова оформить в виде подпрограммы.
Например:
исходные данные - 123023402303450
234450234567010
234455677670450
результат - (123,234,23,345)(23445,234567,1)(23445567767,45)
2. Написать подпрограмму для обмена строк двумерного массива с ее помощью отсортировать массив по элементам третьего столбца.
3. Написать подпрограмму для суммирования матриц. С ее помощью сложить исходную матрицу и транспонированную (т. е. полученную поворотом исходной на 90 °).
4. Написать подпрограмму для удаления строки из двумерного массива. Оставшиеся строки должны быть расположены плотно, недостающие элементы заменяются 0. С помощью разработанных подпрограмм исключить из массива строки с номерами от А до В.
5. Определить является ли матрица ортонормированной, т. е. такой, что скалярное произведение каждой пары различных строк равно 0, а скалярное произведение строки самой на себя равно 1.
6. Элемент матрицы является седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот: наибольшим в своей строке и наименьшим в своем столбце).Для заданной матрицы определить все седловые точки.
7. Написать подпрограмму обмена столбца и строки двухмерного массива. С ее помощью поменять местами те строки и столбцы, первые элементы которых совпадают.
8. Написать подпрограмму транспонирования квадратной матрицы (т.е. поворота исходной матрицы на 90 °). С ее помощью определить является ли заданная матрица симметрической. (Матрица называется симметрической, если транспонированная матрица равна исходной).
9. Написать подпрограмму для вычисления суммы элементов квадратной матрицы, которые расположены ниже главной диагонали. С ее помощью найти максимальное значение такой суммы в n матрицах.
10. Написать подпрограмму, проверяющую есть ли отрицательные элементы в указанной строке двумерного массива. Удалить из массива все строки с отрицательными элементами, удаленная строка заполняется 0 и переносится в конец массива.