Vícerozměrné pole - operace s maticemi
V minulé lekci jsme probrali dvojrozměrné pole a ukázali jsme si použití proměnné typu pole jako parametru procedur.
V této lekci si tyto znalosti trochu procvičíme na operacích s maticemi.
1. Součet (rozdíl) matic
Součtem (resp. rozdílem) matic A a B stejného typu MxN je matice C téhož typu, jejímiž prvky jsou součty (rozdíly)
odpovídajících si prvků v maticích A a B. Například:

2. Součin matice a reálného čísla
Součin matice A a reálného čísla k je matice C, jejímiž prvky jsou k násobky prvků matice A. Například:

3. Součin matic
Součin matice A a matice B je matice C, jejímiž prvky jsou součty součinů odpovídajících si prvků
v řádku matice A a sloupci matice B. Matice A tedy musí mít tolik sloupců co matice B řádků (jinak vynásobit nelze).
Ukážeme si to na příkladě:

Příklad: Sestavte program Operace_Matice, který opakovaně podle volby uživatele umožňuje:
1) Načíst libovolnou matici A zadaného typu MxN
2) Načíst libovolnou matici A zadaného typu MxN
3) Sečíst matice A a B
4) Odečíst matice A a B v pořadí A - B
5) Vynásobit matici A zadaným reálným číslem k
6) Vynásobit matice A a B
Všechny úkoly řešte užitím procedur s parametry.
Ukážeme si samozřejmě pouze některé.
Např. načtení matice lze provést procedurou Nacti_Matici, která bude potřebovar jako vstupní
parametry počet řádků a sloupců (načte hlavní program) a výstupním parametrem bude jméno načtené matice:
procedure Nacti_Matici(pocet_rad,pocet_sl:integer; var Ktera_Matice:TMatice];
var ktery_radek,ktery_sloupec : integer;
begin
|
|
|
for ktery_radek:=1 to pocet_rad do
for ktery_sloupec:=1 to pocet_sl do
begin
writeln('Zadejte prvek matice A[',ktery_radek,',',ktery_sloupec,']');
readln(Ktera_Matice[ktery_radek,ktery_sloupec]);
end; |
|
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}
{postupné načítání prvků matice}
|
end;
| | |
|
Obdobně vytvoříte proceduru Tisk_Matice, pouze s tím rozdílem, že všechny tři parametry budou vstupní.
Potom vytvoříte proceduru Nasob_cislem pro vynásobení matice reálným číslem (vstupní parametry počet řádků,sloupců,
název matice,cislo - načte hl.program - a výstupní bude výsledná matice):
procedure Nasob_cislem(pocet_rad,pocet_sl:integer; Ktera_Matice:TMatice;cislo:integer;var Vysledna_Matice:TMatice];
var ktery_rad,ktery_sl : integer;
begin
|
|
|
for ktery_rad:=1 to pocet_rad do
for ktery_sl:=1 to pocet_sl do
Vysledna_Matice[ktery_rad,ktery_sl]:= cislo* Ktera_Matice[ktery_rad,ktery_sl]
| |
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}
{násobení prvků matice číslem}
|
end;
| | |
|
A nyní již můžeme sestavit část programu pro násobení matice reálným číslem.
Program Operace_Matice může vypadat takto:
program
Operace_Matice; |
|
|
const Max = 50;
type TMatice = array[1..Max,1..Max] of integer;
var A,B,C : TMatice;
radky_A,sloupce_A,radky_B,sloupce_B :integer;
radky_C,sloupce_C,cislo,volba :integer;
|
|
{typ dvojrozměrné matice s celočíselnými složkami}
{Deklarace global.proměnných}
|
|
procedure Nacti_Matici(pocet_rad,pocet_sl:integer; var Ktera_Matice:TMatice);
var ktery_radek,ktery_sloupec : integer;
begin
|
|
|
for ktery_radek:=1 to pocet_rad do
for ktery_sloupec:=1 to pocet_sl do
begin
writeln('Zadejte prvek matice A[',ktery_radek,',',ktery_sloupec,']');
readln(Ktera_Matice[ktery_radek,ktery_sloupec]);
end; |
|
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}
{postupné načítání prvků matice}
|
end;
| | |
|
procedure Tisk_Matice(pocet_rad,pocet_sl:integer; Ktera_Matice:TMatice);
var ktery_radek,ktery_sloupec : integer;
begin
|
|
|
for ktery_radek:=1 to pocet_rad do
begin
for ktery_sloupec:=1 to pocet_sl do
write(Ktera_Matice[ktery_radek,ktery_sloupec],' ');
writeln;
end; |
|
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}
{tisk prvků matice}
|
end;
| | |
|
procedure Nasob_cislem(pocet_rad,pocet_sl:integer; Ktera_Matice:TMatice;cislo:integer;var Vysledna_Matice:TMatice);
var ktery_rad,ktery_sl : integer;
begin
|
|
|
for ktery_rad:=1 to pocet_rad do
for ktery_sl:=1 to pocet_sl do
Vysledna_Matice[ktery_rad,ktery_sl]:= cislo* Ktera_Matice[ktery_rad,ktery_sl]
| |
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}
{násobení prvků matice číslem}
|
end;
| | |
|
Begin
| |
{Hlavní program} |
Repeat
writeln('Program Operace_Matice umožňuje:');
writeln('1 ... Načíst matici A');
writeln('2 ... Vynásobit matici A reálným číslem');
writeln('0 ... Ukončit');
writeln('Zadejte svoji volbu:');
readln(volba);
case volba of
1: begin
write('Zadejte počet řádků:');readln(radky_A);
write('Zadejte počet sloupců:');readln(sloupce_A);
Nacti_Matici(radky_A,sloupce_A,A);
end;
2: begin
write('Zadejte reálné číslo:');readln(cislo);
Nasob_cislem(radky_A,sloupce_A,A,cislo,C);
writeln('Původní matice A je:');
Tisk_Matice(radky_A,sloupce_A,A);
writeln('Výsledná matice ',cislo,'.A je:');
Tisk_Matice(radky_A,sloupce_A,C);
end;
0: writeln('Nashledanou');
end;
until volba = 0;
|
|
{opakuj}
{nabídka činností}
{vvýběr činnosti}
{provedení zvolené činnost}
|
End. |
| |
|
A nyní přidáváte další operace podle zadání.
Domácí úkol:
Doplňte program Operace_Matice o volby Výměna řádků - vymění zadané řádky matice A
(procedura Vymena_radku s parametry) a Minimum první,Maximum poslední - v každém řádku vymění první prvek s
nejmenším a poslední prvek s největším prvkem řádku (procedura MiniMax s parametry).
On-line účast na řešení úkolu
Pomocí volby Řešit můžete (po přihlášení) odeslat vaše řešení domácího úkolu (každý úkol smíte řešit jen
jednou). Volbou Hodnocení
si přečtete hodnocení a komentář od vyučujícího. Dotaz nebo připomínku můžete opakovaně zasílat pomocí tlačítka Dotazy,
Komunikace (na levém okraji) zobrazuje příklad možné komunikace s vyučujícím.
|