Umíte pascalsky - 15.lekce ...

Umíte pascalsky?
15.lekce
Vytisknout  

Vícerozměrné pole

Složky pole mohou být rovněž typu pole, tím dostáváme typ pole polí nebo-li vícerozměrné pole.

Příklad: Matici matice lze zobrazit jako pole A o třech složkách (řádcích), které jsou opět pole o čtyřech prvcích. Lze ji tedy chápat jako dvojrozměrné pole.

Typ dvojrozměrné pole lze deklarovat takto:
type <jméno> = array [ typ_index1 ] of array [ typ_index2 ] of <typ složek>

zkráceně:
type <jméno> = array [ typ_index1 , typ_index2 ] of <typ složek>

Chceme-li v programu pracovat s maticí typu RxS (R řádků a S sloupců) , zavedeme typ TMatice jako dvojrozměrné pole celých čísel:
type TMatice = array [ 1..R , 1..S ] of integer;

Proměnné typu dvojrozměrné pole deklarujeme obvyklým způsobem:
var <jméno> : <název typu>;

tedy proměnnou A,B typu TMatice deklarujeme takto:
var A,B : TMatice;

Přístup ke složkám vícerozměrného pole se provádí pomocí indexů (indexované proměnné).

matice
proměnná
                   A ... celá matice (dvojrozměrné pole)
                   A[i] ... i-tý řádek matice A - jednorozměrné pole typu array[1..s] of integer;
                   A[i,j] ... prvek matice A v i-tém řádku a j-tém sloupci

Zápisům A[i] , A[i,j] říkáme indexovaná proměnná.

Hodnoty proměnných (typu dvojrozměrné pole) se definují a mění stejně jako jednorozměrného pole buď postupně, po složkách:
Např.: A[1,1] := 2 ; A[1,2] := 5 ; atd

nebo najednou pro celou proměnnou (resp.část):
Např.:
1. Vynulování matice A
- vynulujeme první řádek for ktery:=1 to s do A[1,ktery]:=0;
- přiřadíme ostatním řádkům for ktery:=2 to r do A[ktery] := A[1];

2. Výměna dvou řádků matice
potřebujeme pomocnou proměnnou stejného typu jako řádek matice - nejdřív zavedeme typ řádků a potom pomocí něho typ celé matice type TRadek = array[1..s] of integer;
TMatice = array[1..R] of TRadek; var A,B : TMatice;
Pom : TRadek; ... pouze pro řádky !!!
Potom výměnu i-tého a j-tého řádku matice můžeme zapsat takto:
Pom := A[i]; A[i] := A[j] ; A[j] := Pom;

3. Přiřazení matice matici
A := B ;
(pokud je již matice B definována).

Příklad: Sestavte program Zmena_Matice, který načte matici zadaného typu RxS a potom najde největší a nejmenší prvek mezi prvky matice a tyto prvky vymění.

Myšlenka (hrubý algoritmus):
<zadání typu matice a načtení prvků> ... Nacti_Matici
   ... opakujeme načítání řádků matice - první (vnější) cyklus
   ...... v řádku načítáme prvky po sloupcích - druhý (vnitřní) cyklus
   ! dvojrozměrné pole (matici) projdeme pomocí dvou cyklů !
<nalezení maxima a minima matice> ... Najdi
   ... opět pomocí dvojice cyklů, pamatovat i jejich posice
<výměna maxima a minima matice> ... Vymena
<tisk obou původní a změněné matice> ... Tisk

Program Zmena_Matice může vypadat takto:

program Zmena_Matice;
  const Max = 50;
  type TMatice = array[1..Max,1..Max] of integer;
  var A,B : TMatice;
         maximum,minimum,radek_max,sloupec_max:integer;
         radek_min,sloupec_min,radky,sloupce :integer;
{Max - maximální počet řádků a sloupců}
{typ dvojrozměrné matice s celočíselnými složkami}
{Deklarace global.proměnných}
 
 procedure Nacti_Matici;
  var ktery_radek,ktery_sloupec : integer;
  begin
    writeln('Zadejte počet řádků matice (menší než ',Max,'):');readln(radky);
    writeln('Zadejte počet sloupců matice (menší než ',Max,'):');readln(sloupce);


{načtení počtu řádků a sloupců matice}
    for ktery_radek:=1 to radky do
      for ktery_sloupec:=1 to sloupce do
        begin
           writeln('Zadejte prvek matice A[',ktery_radek,',',ktery_sloupec,']');
           readln(A[ktery_radek,ktery_sloupec]);
        end;
{opakování po řádcích}
{opakování v jednom řádku po sloupcích}

{postupné načítání prvků matice}
    B:=A;
  end;
{v proměnné B původní matice}

 procedure Najdi;
  var ktery_radek,ktery_sloupec : integer;
  begin
    maximum:=A[1,1];radek_max:=1;sloupec_max:=1;
    minimum:=A[1,1];radek_min:=1;sloupec_min:=1;
    for ktery_radek:=1 to radky do
      for ktery_sloupec:=1 to sloupce do
        begin
{nalezení maximálního čísla}

{nasazení počátečního maxima,minima a jejich posic}
          if A[ktery_radek,ktery_sloupec]>maximum then
            begin
                maximum:=A[ktery_radek,ktery_sloupec];
                radek_max:=ktery_radek;
                sloupec_max:=ktery_sloupec;
            end;
          if A[ktery_radek,ktery_sloupec]< minimum then
            begin
                minimum:=A[ktery_radek,ktery_sloupec];
                radek_min:=ktery_radek;
                sloupec_min:=ktery_sloupec;
            end;
{porovnává a větší ukládá do maxima}
{ukládá řádek a sloupec pro výměnu}




{porovnává a větší ukládá do minima}
{ukládá řáadek a sloupec pro výměnu}

      end;
  end;

 procedure Vymena;
  begin
{výměna maxima a minima}

    A[radek_max,sloupec_max] := minimum;
    A[radek_min,sloupec_min] := maximum;
{na posici maxima dá minimum}
{na posici minima dá maximaum}
  end;

 procedure Tisk;
  var ktery_radek,ktery_sloupec : integer;
  begin
    writeln('Výsledná matice je: ');
{tisk výsledné matice}


    for ktery_radek:=1 to radky do
      begin
        for ktery_sloupec:=1 to sloupce do
           write(A[ktery_radek,ktery_sloupec],' ');
        writeln;
      end;

{postupný tisk složek matice}

{po vytiščtění řádku přejít na další řádek}
  end;

Begin

{Hlavní program}
  Nacti_Matici;
  Najdi;   
  Vymena;
  Tisk;   
{Načte matici}
{Najde maximum a minimum}
{Vymění maximum a minimum}
{Vytiskne matici}
End.


Proměnné typu pole lze požít jako parametry v procedurách i funkcích. Ukážeme si to na následujícím příkladě.

Příklad2:
Přepište proceduru Tisk jako proceduru s parametrem, aby umožnila vytištění jak původní matice B tak i změněné A.


 procedure Tisk (Ktera_matice:TMatice);
  var ktery_radek,ktery_sloupec : integer;
  begin
{tisk určené matice}


    for ktery_radek:=1 to radky do
      begin
        for ktery_sloupec:=1 to sloupce do
           write(Ktera_matice[ktery_radek,ktery_sloupec],' ');
        writeln;
      end;

{postupný tisk složek matice}

{po vytiščtění řádku přejít na další řádek}
  end;

Hlavní program se potom změní takto:

Begin

{Hlavní program}
  Nacti_Matici;
  Najdi;   
  Vymena;
  writeln('Původní matice je: ');
  Tisk(B);   
  writeln('Výsledná matice je: ');
  Tisk(A);   
{Načte matici}
{Najde maximum a minimum}
{Vymění maximum a minimum}

{Vytiskne původní matici}

{Vytiskne výslednou matici}
End.



Domácí úkol:

    Sestavte program Transpo_Matice, který načte matici zadaného typu RxS a vytiskne matici transponovanou - řádky vyměněné za sloupce a naopak.

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.