Umíte pascalsky - 16.lekce ...

Umíte pascalsky?
16.lekce
Vytisknout  

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:
matice

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:
matice

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ě:
matice

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

Řešit úkol Prohlídka hodnocení úkolu Dotazy,připomínky

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.