МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра математического обеспечения и применения ЭВМ
Курсовая работа
по дисциплине «Информационные модели и системы»
Тема: «Массивы и операции над ними»
Студент гр. 8802 |
|
Попов А.П. |
Преподаватель |
|
Сидоров Ю.Н. |
Санкт-Петербург
2019
СОДЕРЖАНИЕ
Содержательная постановка задачи...........................................................................3
Формальная постановка задачи..................................................................................3
Алгоритмизация...........................................................................................................4
Типы структур данных................................................................................................5
Текст программы.........................................................................................................5
Пример исполнения программы................................................................................8
Содержательная постановка задачи
Требуется написать программу, которая
а) формирует матрицу C(m*m), полученную путем перемножения матрицы B(m*n) на матрицу A(n*m)
б) находит в матрице C сумму элементов строк и столбцов, на пересечении которых лежат отрицательные элементы
Формальная постановка задачи.
Дано: Натуральные числа m,n ∈ N, обозначающие размерность матрицы. Матрица B(m*n), матрица A(n*m). Элементы матриц A и B - целые числа
Найти:
а) Матрицу C = B * A, где C – квадратная матрица порядка m; элемент c(i,k) матрицы C равен
б) Для матрицы C построить матрицу D, имеющую (p*4) строк и 1 столбец, где p – количество отрицательных элементов матрицы C.
Элементы матрицы D:
d(1,1+t*4) – отрицательный элемент в матрице C
d(1,2+t*4) – номер строки, на которой расположен отрицательный элемент
d(1,3+t*4) – номер столбца, на котором расположен отрицательный элемент
d(1,4+t*4) – сумма элементов строки и столбца, на которых находится отрицательный элемент.
t – принимает значения от 1 до p.
Если p = 0, то такой матрицы не существует.
Алгоритмизация
Сообщения, выводимые на экран, сокращены.
Типы и структуры данных
m - количество строк массива B и столбцов массива A
n - количество столбцов массива A и столбцов массива B, а также количество строк и столбцов массива C.
B – исходный динамический массив целого типа из m*n элементов, заполняется случайными числами с масштабированием
A – исходный динамический массив целого типа из n*m элементов, заполняется случайными числами с масштабированием
С - итоговый динамический массив целого типа из n*n элементов. Заполняется по правилу перемножения матриц C = A * B.
i, k, j – переменные короткого беззнакового целого типа, счетчики.
p – переменная укороченного беззнакового целого типа, счетчик числа найденных отрицательных элементов в матрице C.
cell - переменная целого типа. В ней суммируется значение элемента матрицы C
sum - переменная целого типа. В ней суммируется сумма элементов строк и столбцов, на пересечении которых находятся отрицательные элементы
Текст программы.
program course;
const Size=10; //Size - размер массивов
var
A: array [1..Size,1..Size] of integer; //Массив A
B: array [1..Size,1..Size] of integer; //Массив B
C: array [1..Size,1..Size] of integer; //Массив C
D: array [1..Size*Size*4] of integer; // Массив D
sum, cell : integer; //sum - сумма элементов строк и столбцов, на пересечении которых находятся отрицательные элементы. cell - итоговое значение ячейки массива C, которое вычисляется по правилу умножения матриц
i, k , j ,m , n : byte; //i, k - счетчики для строк и столбцов массивов. m, n - количество строк и столбцов в массиве B, а также количество столбцов и строк в массиве A. j - счетчик для перемножения матриц и суммирования элементов.
p : word; //p - счетчик числа отрицательных элементов в матрице C
begin
randomize;
//Ввод размеров для массивов A и B
m:=1;
while ((m<1) or (n<1)) do
begin
write ('Введите размер массивов A(n*m) и B(m*n) Введите n->'); readln(n);
write ('Введите m -> '); readln (m);
if ((m<1) or (n<1) or (m>10) or (n>10)) then writeln ('Не допустимый размер массивов, введите заново');
end;
//Заполнение массива A и вывод его значений на экран
writeln ('Массив A:');
for i:=1 to n do
begin
for k:=1 to m do
begin
A[i][k]:=10-random(20);
write (A[i][k],#9);
end;
writeln(' ');
end;
//Заполнение массива B и вывод его значений на экран
writeln('');
writeln('Массив B:');
for i:=1 to m do
begin
for k:=1 to n do
begin
B[i][k]:=10-random(20);
write (B[i][k],#9);
end;
writeln(' ');
end;
//Вычисление значений массива C, часть задачи a)
cell:=0;
for i:=1 to n do
begin
for k:=1 to n do
begin
for j:=1 to m do cell := cell + (A[i][j]*B[j][k]);
C[i][k] := cell;
cell:=0;
end;
end;
//Вывод массива C на экран
writeln('');
writeln('Массив C:');
for i:=1 to n do
begin
for k:=1 to n do write (C[i][k],#9);
writeln(' ');
end;
//Поиск отрицательных элементов и подсчет суммы элементов строк и столбцов, на пересечении которых находятся отрицательные элементы. Часть задачи б)
p:=0; sum:=0;
for i:=1 to n do
begin
for k:=1 to n do
begin
if (C[i][k]<0) then
begin
for j:=1 to n do sum := sum + C[i][j] + C[j][k];
D[1+p*4] := C[i][k];
D[2+p*4] := i;
D[3+p*4] := k;
D[4+p*4] := sum - C[i][k];
p := p + 1;
sum:=0;
end;
end;
end;
//Вывод информации о найденных элементах
if (p=0) then writeln ('Отрицательных элементов не найдено') else
begin
writeln ('Найдено ',p, ' элементов.');
for i:=0 to p-1 do writeln ('Элемент матрицы C = ',D[1+i*4], '[',D[2+i*4],'][',D[3+i*4],']. Сумма строк и столбцов на пересечении которых находится элемент = ', D[4+i*4]);
end;
end.