Державний Комітет Російської Федерації
по Вищому Освіті
Санкт-Петербурзький
Державний Електротехнічний Університет «ЛЕТІ»
Кафедра Радіосистем
до курсової роботи з дисципліни
«Інформатика. Основи Програмування »
Варіант № 9: "Операції над матрицями»
Виконав: студент Чапчаев В.В.
факультет: РТ
уч.группа: № 2142
Перевірив: асистент Анікін А.П.
Санкт - Петербург
2 0 0 3
Умова задачі
Програма працює в текстовому режимі. Користувач вибирає операцію, вводить з клавіатури розмір матриці і значення елементів матриці. Програма виконує задану операцію і виводить на екран її результат. Для реалізації в програмі пропонуються наступні операції: множення двох матриць, транспонування, обчислення визначника, обчислення оберненої матриці, додавання (віднімання) двох матриць.
Метод рішення задачі
Після запуску програми, користувачеві пропонується вибирати пакунки: знаходження визначника, зворотної матриці, транспонованої матриці, додавання чи віднімання двох матриць, множення двох матриць. Це виконується за допомогою введення користувачем цифри, відповідної даної операції. Далі слідує запит про розміри даної матриці (кол-ве рядків і стовпців), після введення яких програма перевіряє, щоб введені значення не були негативними чи не перевищували допустимих розмірів матриці (у програмі - 10х10). У випадку, якщо перелічені умови не виконуються, на екран виводиться повідомлення про помилку, і програма завершує роботу. При виконанні умов, користувачеві пропонується ввести з клавіатури вихідну матрицю «А» (у програмі - MAS1). Введення проводиться порядково, для переходу до наступного рядка, користувачеві необхідно натиснути клавішу «ENTER». Після того, як число рядків стає рівним числу, введеному користувачем, введення матриці припиняється. Введена матриця виводиться на екран для перевірки. Далі слід перевірка «придатності» введеної матриці до операції, обраної користувачем, у разі «непридатності» матриці, на екран виводиться повідомлення про помилку, і програма завершує роботу. У випадку «придатності» матриці, над нею проводиться обрана операція, після чого на екран виводиться повідомлення про результат. Якщо користувачем була вибрана операція, що вимагає другу матрицю «В» (у програмі - MAS2), користувачеві пропонується ввести її розміри, як і при введенні матриці «А», далі програма перевіряє, чи можливе проведення вибраної операції над матрицями з введеними параметрами. Якщо операція неможлива, то на екран виводиться повідомлення про помилку, і програма завершує роботу. Інакше, операція виконується, і її результуюча матриця «С» (у програмі - MAS3) виводиться на екран.
Введення матриць можливий тільки з клавіатури, безпосередньо при виконанні програми. Введення даних «з файлу» не передбачений, тому що цей варіант в умові завдання не обмовляється.
Вихідні дані і форма їх представлення
Змінні | Структура | Тип | Призначення |
MAS1, MAS2, MAS3 | Двовимірний масив | Речовий | Матриці «А», «В», «С» |
i1, i2, i3 | Змінні | Цілочисельний | Лічильник рядків матриць А, В і С відповідно |
j1, j2, j3 | Змінні | Цілочисельний | Лічильник стовпців матриць А, В і С відповідно |
m1, m2, m3 | Змінні | Цілочисельний | Кількість рядків матриць А, В і С відповідно |
n1, n2, n3 | Змінні | Цілочисельний | Кількість стовпців матриць А, В і С відповідно |
operation | Змінні | Цілочисельний | Варіант програми |
det | Змінні | Речовий | Визначник |
k | Змінні | Цілочисельний | Робоча мінлива |
Блок - схема програми
1
Введення operation
2
Введення m1
3
Введення n1
НІ
ТАК
4
5
6
Operation = 1
Operation = 3
7
Case operation
Operation = 2
Operation = 6
Operation = 4, 5
Підрахунок обр.матр.
Висновок det
ТАК
НІ
ТАК
Operation = 5
k: =- 1
Текст Програми:
Program MATRIX; {Найменування програми}
Uses CRT;
VAR i1, i2, i3: integer; {Лічильник рядків}
j1, j2, j3: integer; {Лічильник стовпців}
operation: integer; {Варіант розвитку програми}
det: real; {Визначник} k: integer; {Робоча мінлива}
{Масиви (матриці), що використовуються в програмі}
MAS1, {Матриця А}
MAS2, {Матриця У}
MAS3: array [1 .. 10,1 .. 10] of real; {Матриця С}
BEGIN {Початок програми}
WriteLn ('Що Ви бажаєте робити з матрицями?');
{Вибір користувачем варіанту розвитку програми}
WriteLn ('Якщо Ви бажаєте знайти визначник матриці, натисніть 1');
WriteLn ('Якщо Ви бажаєте знайти зворотну матрицю, натисніть 2');
WriteLn ('Якщо Ви бажаєте транспонувати матрицю, натисніть 3');
WriteLn ('Якщо Ви бажаєте скласти матриці, натисніть 4');
WriteLn ('Якщо Ви бажаєте відняти матриці, натисніть 5');
WriteLn ('Якщо Ви бажаєте перемножити матриці, натисніть 6');
ReadLn (operation); {Занесення обраного варіанту в пам'ять}
WriteLn ('Введіть кількість рядків матриці, не більше 10');
ReadLn (m1);
WriteLn ('Введіть кількість стовпців початкової матриці, не більше 10');
ReadLn (n1);
If ((1> n1) or (n1> 10) or (1> m1) or (m1> 10)) {Умови помилки}
then begin
WriteLn ('ПОМИЛКА !!!');
Halt;
end
else begin
WriteLn ('Введіть початкову матрицю'); {Введення вихідної матриці}
for i1: = 1 to m1 do
for j1: = 1 to n1 do Read (MAS1 [i1, j1]);
end;
for i1: = 1 to m1 do {Висновок вихідної матриці}
begin
for j1: = 1 to n1 do
Write (MAS1 [i1, j1]);
WriteLn;
end;
Case operation of {Оператор вибору «operation»}
1: begin {Визначник}
if (m1 <> n1) then writeLn ('ПОМИЛКА !!!') {Умова помилки}
else
begin {Формула визначника}
det: = (MAS1 [1,1] * MAS1 [2,2] * MAS1 [3,3]
+ MAS1 [2,1] * MAS1 [3,2] * MAS1 [1,3]
+ MAS1 [1,2] * MAS1 [2,3] * MAS1 [3,1])
- (MAS1 [3,1] * MAS1 [2,2] * MAS1 [1,3]
+ MAS1 [3,2] * MAS1 [2,3] * MAS1 [1,1]
+ MAS1 [2,1] * MAS1 [1,2] * MAS1 [3,3]);
WriteLn ('Odivdelitel det =', det); {Висновок визначника}
end;
end;
2: begin {Зворотній матриця}
if (m1 <> n1) then WriteLn ('ПОМИЛКА !!!') {Умова помилки}
else begin
det: = (MAS1 [1,1] * MAS1 [2,2] * MAS1 [3,3] {Визначник}
+ MAS1 [2,1] * MAS1 [3,2] * MAS1 [1,3]
+ MAS1 [1,2] * MAS1 [2,3] * MAS1 [3,1])
- (MAS1 [3,1] * MAS1 [2,2] * MAS1 [1,3]
+ MAS1 [3,2] * MAS1 [2,3] * MAS1 [1,1]
+ MAS1 [2,1] * MAS1 [1,2] * MAS1 [3,3]);
if det = 0 then WriteLn ('ПОМИЛКА !!!') {Умова помилки}
else begin {Союзна матриця}
for i1: = 1 to m1 do
for j1: = 1 to n1 do MAS2 [i1, j1]: = MAS1 [j1, i1];
{Підсумкова формула}
for i1: = 1 to m1 do
for j1: = 1 to n1 do MAS3 [i1, j1]: = (1/det) * MAS2 [i1, j1];
WriteLn;
WriteLn ('Зворотній матриця:');
for i1: = 1 to m1 do begin {Висновок оберненої матриці}
for j1: = 1 to n1 do
Write (MAS3 [i1, j1]);
WriteLn;
end;
end;
end;
end;
3: begin {Транспонування матриці}
for i1: = 1 to m1 do
for j1: = 1 to n1 do MAS2 [i1, j1]: = MAS1 [j1, i1]; {Формула}
WriteLn ('Транспонована матриця:');
for i1: = 1 to m1 do begin {Висновок транспонованої матриці}
for j1: = 1 to n1 do
Write (MAS2 [i1, j1]);
WriteLn;
end;
end;
4,5: begin {Додавання / віднімання матриць}
{Введення другого матриці}
WriteLn ('Введіть кількість рядків другий матриці');
ReadLn (m2);
Writeln ('Введіть кількість стовпців другого матриці');
ReadLn (n2);
If (n2 <> n1) or (m2 <> m1)
then WriteLn ('OSHIBKA !!!') {Умова помилки}
else begin
WriteLn ('Введіть другу матрицю');
for i1: = 1 to m1 do
for j1: = 1 to n1 do
Read (MAS2 [i1, j1]);
end;
for i1: = 1 to m1 do {Висновок другий матриці}
begin
for j1: = 1 to n1 do
Write (MAS2 [i1, j1]);
WriteLn;
end;
if operation = 4 then k: = 1;
if operation = 5 then k: = -1;
for i1: = 1 to m1 do
for j1: = 1 to n1 do
MAS3 [i1, j1]: = MAS1 [i1, j1] + k * MAS2 [i1, j1]; {Підсумкова формула}
writeln ('Сума / різниця:');
for i1: = 1 to m1 do
begin
for j1: = 1 to n1 do Write (MAS3 [i1, j1]);
WriteLn;
end;
end;
6: begin {Множення матриць}
{Введення другого матриці}
WriteLn ('Введіть кількість рядків другий матриці');
ReadLn (m2);
Writeln ('Введіть кількість стовпців другого матриці');
ReadLn (n2);
If ((1> = m2) or (m2> = 10) or (1> = n2) or (n2> = 10) {Умова помилки}
or (n2 <> m1)) then WriteLn ('ПОМИЛКА !!!')
else begin
WriteLn ('Введіть другу матрицю');
for i2: = 1 to m2 do
for j2: = 1 to n2 do Read (MAS2 [i2, j2]);
end;
for i2: = 1 to m2 do begin {Висновок другий матриці}
for j2: = 1 to n2 do
Write (MAS2 [i2, j2]);
WriteLn;
end;
m3: = m1; n3: = n2;
for i3: = 1 to m3 do
for j3: = 1 to n3 do begin
MAS3 [i3, j3]: = 0;
for i2: = 1 to m2 do
{Підсумкова формула}
MAS3 [i3, j3]: = MAS3 [i3, j3] + MAS1 [i3, i2] * MAS2 [i2, j3];
end;
begin {Висновок твори}
writeln;
writeln ('Твір:');
for i3: = 1 to m1 do begin
for j3: = 1 to n2 do Write (MAS3 [i3, j3]);
WriteLn;
end;
end;
end;
End; {End Case}
ReadKey;
END. {Кінець програми}
Приклад роботи програми
1. Операція знаходження визначника:
З появою на екрані меню з вибором операцій, вибираємо 1.
На пропозицію ввести кількість рядків матриці, вибираємо 3.
Кількість шпальт - 3.
Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня
Програма видає відповідь: det = 54.
2. Операція знаходження оберненої матриці:
1) З появою на екрані меню з вибором операцій, вибираємо 2.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня
5) Програма видає відповідь: 1,851 * 100 9,259 * 100 1,481 * 10
7,407 * 100 5,555 * 100 1,851 * 100
9,259 * 100 1,296 * 10 7,407 * 100 .
Операція транспонування матриці:
1) З появою на екрані меню з вибором операцій, вибираємо 3.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня
5) Програма видає відповідь: 1 5 8
4 3 1
5 4 Липня .
Операція додавання матриць:
1) З появою на екрані меню з вибором операцій, вибираємо 3.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня
5) На пропозицію ввести кількість рядків матриці, вибираємо 3.
6) Кількість шпальт - 3.
7) Вводимо матрицю: 2 серпні 1910
6 жовтня 1914
16 2 серпні .
8) Програма видає відповідь: 3 грудня 1915
15 вересня 1921
24 березня 1912 .
Операція віднімання матриць:
1) З появою на екрані меню з вибором операцій, вибираємо 3.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня
5) На пропозицію ввести кількість рядків матриці, вибираємо 3.
6) Кількість шпальт - 3.
7) Вводимо матрицю: 2 серпні 1910
6 жовтня 1914
16 2 серпні .
8) Програма видає відповідь: -1 -4 -5
-5 -3 -7
-8 -1 -4 .
Операція множення матриць:
1) З появою на екрані меню з вибором операцій, вибираємо 3.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня .
5) На пропозицію ввести кількість рядків матриці, вибираємо 3.
6) Кількість шпальт - 3.
7) Вводимо матрицю: 2 серпні 1910
6 жовтня 1914
16 2 серпні .
8) Програма видає відповідь: 122 42 106
152 72 148
90 78 126 .
Перший винятковий випадок:
1) З появою на екрані меню з вибором операцій, вибираємо 1.
2) На пропозицію ввести кількість рядків матриці, вибираємо 0.
3) Кількість шпальт - 3.
Програма видає: «ПОМИЛКА !!!».
Другий винятковий випадок:
1) З появою на екрані меню з вибором операцій, вибираємо 1 (2, 3).
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 2.
4) Вводимо матрицю: 4 січня
5 березня
8 січень .
Програма видає: «ПОМИЛКА !!!».
Третій винятковий випадок:
1) З появою на екрані меню з вибором операцій, вибираємо 4.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня .
5) На пропозицію ввести кількість рядків матриці, вибираємо 2.
6) Кількість шпальт - 2.
Програма видає: «ПОМИЛКА !!!».
Четвертий винятковий випадок:
1) З появою на екрані меню з вибором операцій, вибираємо 6.
2) На пропозицію ввести кількість рядків матриці, вибираємо 3.
3) Кількість шпальт - 3.
4) Вводимо матрицю: 1 4 5
5 7 березня
8 4 січня .
5) На пропозицію ввести кількість рядків матриці, вибираємо 2.
6) Кількість шпальт - 2.
Програма видає: «ПОМИЛКА !!!».
Висновки по роботі
Для перевірки результатів, що видаються програмою, використовувався математичний пакет MathCAD 2001 Professional.
Істотний недолік програми в тому, що при знаходженні оберненої матриці та визначника, програма може працювати тільки з матрицями, розміром не перевищують 3х3. Це пов'язано зі значним ускладненням програми, в разі необхідності виконання перерахованих вище операцій над матрицями більшого розміру.
При написанні програми використовувалася наступна література:
Фаронов В.В. «TurboPascal 7.0, початковий курс. Навчальний посібник ».
Мізрохі С.В. «TurboPascal і об'єктно-орієнтоване програмування».
Голубєв А.Б., Сидоров Ю.М., Чередниченко О.І., Яценко І.В. «Основи програмування мовою Pascal».
Боревич Е.І. «Визначники та матриці».
Гутер Р.С., Резніковська П.Т. «Програмування і обчислювальна математика».
Письмовий Д.Т. «Конспект лекцій з вищої математики», 1 частина.
Володимирський Б.М., жменька А.Б., Ерусалімський Я.М. «Математика. Загальний курс ».