Technika práce s poli

 

 

Podstata a význam práce s poli

U profesionálních počítačů (386) je již operační paměť větší než 1MB. To umožňuje určité oproštění se ze závislosti na diskové paměti a podstatné zvýšení rychlosti zpracování úloh. (U FoxPro je výhodné v tomto případě použití rozšířené verze.) Technika vedoucí k efektivnějšímu využívání paměti je založena na práci s poli.

Pole (array) je uspořádaná množina prvků - proměnných stejného jména, ale různého typu a různé velikosti, na které se lze odkazovat numerickým indexem, uzavřeným v hranatých nebo kulatých závorkách. Definice se shodná s definicí matic s tím, že matice je homogenní pole - matice má všechny prvky stejného typu. Podobně je shodná s definicí tabulky s tím, že tabulka má v každém sloupci prvky stejného typu a stejné délky. (Už nejsme daleko od definice databázového souboru. Stačí určit vztah mezi jménem tabulky s jménem souboru.)

Jméno pole je slovo vytvořené z libovolného počtu písmen, číslic a znaků podtržení, nezačínající číslicí. Rozhodujících je pouze prvních deset znaků. Zbývající jsou považovány za vysvětlující. Na velikosti písmen nezáleží, ale nejsou povolena písmena s diakritickými značkami. Jméno pole může být ukončeno kulatými nebo hranatými závorkami, uzavírajícími počty prvků nebo konkrétní indexy prvku. Pokud závorky nejsou u jména uvedeny, pak se jedná o celé pole. Z důvodů lepší čitelnosti programů se doporučuje dát přednost, při zápisu prvků pole, hranatým závorkám. (Před použitím libovolného z prvků pole je nutno pole deklarovat.)

 

Deklarování pole

Deklarace pole je v podstatě specifikace pohledu na množinu prvků. Provádí se definováním maximálního počtu prvků v jednotlivých rozměrech pole. Počty prvků se zapisují do hranatých nebo kulatých závorek. Pro deklarování lze použít dvou rovnocenných příkazů (kvůli snazšímu zapamatování).

 

DECLARE <pole1> (<výrazN1> [,<výrazN2>]) [,<pole2> (<výrazN3>

[,<výrazN4>])] ..

nebo

 DIMENSION <pole1> (<výrazN1> [,<výrazN2>]) [,<pole2> (<výrazN3>

[,<výrazN4>]), ...]

 

Příkazy deklarují jedno nebo dvojrozměrné pole paměťových proměnných. Pole je označeno jediným jménem (identifikátorem) a může obsahovat u standardní verze až 3600 prvků, u rozšířené až 65000 prvků. Při deklaraci pole jsou prvky definovány automaticky jako logické, s hodnotou .F., a je proto nutné definovat jejich typ.

 

n = 30

m = 40

.....

DECLARE A[20], B(m,n)                  && rozměry se zadávají výrazem

A = 0                                                  && vynulování celé matice

B[12,7]   = ""                                               && prvek je typu C

B(20,30)  = 123                                 && prvek je typu N

Definování pole nebo prvku pole

Typ a rozsah prvku pole jsou definovány hodnotou, která (v daném okamžiku) je v něm uložená. Proto prvek pole může být typu C,N,F,D,L a jeho typ i velikost se může v průběhu výpočtu měnit. Prvky jednoho pole nemusí být stejného typu. Definování se provádí příkazem:

 

STORE <výraz> TO <pole nebo prvek pole> | <pole nebo prvek pole> = <výraz>

 

Příkaz uloží hodnotu výrazu do všech prvků pole nebo pouze do prvku zadaného indexy.

 

DECLARE A[10,10]              && deklarování matice A

A=0                                        && vynulování matice A[10,10]

? A[9,10]                    && kontrola zda opravdu  došlo k vynulování všech prvků matice

0

A[1,1]="Tabulka"        && jeden  z prvků  pole změnil  typ, stal se znakovým

?A[1,1]                       && kontrola

Tabulka

?A[3,5]                       && zbývající prvky se nezměnily

0

 

 

Automatické vytváření polí

Existují příkazy, které automaticky vytvářejí pole (když neexistuje) nebo modifikují pole (když existuje, ale není stejné struktury). Jsou to příkazy, které ukládají výsledky do pole:

AVERAGE, APPEND FROM ARRAY, CALCULATE, COPY TO ARRAY, SCATTER, SELECT-SQL, SUM, ACOPY(), ADIR(), AFIELDS().

 

 

Vztahy prvků pole, vícerozměrná pole

Umístění prvku v poli je vždy číslováno - indexováno - od jedničky. Ve dvojrozměrném poli jsou prvky indexovány po řádcích. Samozřejmě, že dvou a více rozměrná pole do paměti není vůbec možné zapsat. Všechna pole jsou ve skutečnosti jednorozměrná. Transformační vztah je dán rovnicí

k=(i-1)*n+j,

kde k je index prvku jednorozměrného umístění prvků v poli,

i je index řádku,

n je počet prvků na řádku (počet sloupců) a

j je index sloupce prvku dvojrozměrné představy umístění prvků v poli.

Zápis dvojrozměrného pole je jen zkráceným zápisem uvedeného vztahu. Je-li nutno pracovat s představou více než dvojrozměrných polí, pak nutno programovat výraz umístěný vpravo od rovnítka místo jednoho z indexů.

Pro   matici  A[m,n]   platí  tedy   rovnost:

 

A[i,j]=A[(i-1)*n+j]  && transformace dvojrozměrného pole na jednorozměrné

 

Analogicky představu třírozměrného pole A(m,n,q) lze programovat například

A[(i-1)*n+j,k] pro indexy i,j,k

 

K častému přepočtení vztahů jednorozměrné polohy prvku na dvojrozměrné pole slouží funkce:

 

ASUBSCRIPT(<pole>, <expN1>, <expN2>)

 

která pro zadané pořadí prvku <expN1 > vrací index řádku nebo index sloupce. Pro <expN2> = 1 vrací číslo řádku, pro <expN2> = 2 číslo sloupce.

 

DECLARE A[12,11]

? ASUB (A,10,1)

1

? ASUB (A,10,2)

10

? ASUB (A,15,1)

2

? ASUB (A,15,2)

4

 

Obráceně, k přepočtení vztahů dvojrozměrné polohy prvku na jednorozměrné pole slouží funkce:

 

AELEMENT(<pole>, <expN1> , <expN2>)

 

která vrací číslo, pomocí něhož můžeme se dvojrozměrným polem pracovat jako s jednorozměrným. <expN1> = index řádku, <expN2> = index sloupce,

 

dime a[6,5]

? AELEMENT(a,6,5)

30

? ASUB (A,30,1)

6

? ASUB (A,30,2)

5

 

 

Automatická reindexace

Reindexace existujícího dvojrozměrného pole na jednorozměrné a naopak se provádí opětovným použitím příkazu DECLARE nebo DIMENSION. Stejně tak lze dynamicky zvětšit nebo zmenšit rozměry pole. Přidané prvky mají počáteční hodnotu .F. Zmenšením rozměru se nadbytečné prvky ztrácí. Blíže je reindexace vysvětlena ve cvičení.

 

 

Práce s poli

Práce s poli musí počítat s dynamikou polí. Proto se často vyskytuje v programech zjišťování aktuálních rozměrů pole. Například pro zjištění koncové hodnoty příkazů cyklu. K tomu se používá funkce:

 

ALEN(<pole> [, <expN>])

 

která vrací hodnotu v závislosti na numerickém parametru. pole. Když <expN> = 0 vrací počet prvků pole ( nemusí být uváděn), <expN> = 1, vrací pro jednorozměrné pole počet prvků, pro dvojrozměrné pole počet řádků. <expN> = 2, vrací pro jednorozměrné pole nulu, pro dvojrozměrné pole počet sloupců.

Výpis dvojrozměrné matice

 

for i=1 to alen(matice,1)           && od prvního po poslední řádek

for j=1 to alen(matice,2)          && od prvního po poslední sloupec

?? matice[i,j]                            && zobrazení prvku na stejném řádku

endfor                                     && další sloupec matice

?                                             && nový řádek (znaky CR,LF)

endfor                                     && další řádek matice

 

 

Vyhledávání prvků pole

Vyhledávání prvku, obsahujícího zadanou hodnotu, se provádí funkcí:

 

ASCAN(<pole>, <expr> [, <expN1> [, <expN2>]])

 

vrací pořadí (prvního) vyhovujícího prvku, jinak vrací nulu. Přesnost porovnávání hodnoty <expr> s prvkem pole je ovlivněna nastavením SET EXACT. <expN1> určuje počáteční index (standardně od začátku), <expN2> určuje konečný index (standardně do konce).

 

dime jmena[200,2]

jmena[2,2]="Novák"

? ASCAN(jmena,"Novák")

4

 

 

Třídení pole

           Třídit pole znamená uspořádat vzestupně nebo sestupně hodnoty v prvcích jednorozměrného pole nebo takto uspořádat řádky dvojrozměrného pole. Třídění se provádí funkcí:

 

ASORT(<pole> [, <expN1> [, <expN2> [, <expN3>]]])

 

<pole> = jméno tříděného pole,

<expN1> = index prvního tříděného prvku

<expN2> = počet tříděných prvků

<expN3> = 0 -- vzestupně

vetší než nula -- sestupně

(Všechny tříděné prvky pole musí být stejného typu. V případě dvojrozměrného pole se tříděním mění pořadí řádků (pořadí prvků v řádku se nemění). Pokud funkce proběhla bez závad, vrací číselnou hodnotu 1.

 

Ať je deklarováno jednorozměrné pole │ Ať je deklarováno dvojrozměrné pole 
 DIMENSION a[6]                        DIMENSION a[3,2] 
                                      
 Prvky této matice ať mají hodnoty     Prvky této matice ať mají hodnoty 
 a[1]='F'                              ┌──  ── 
 a[2]='A'                              │ F  A  
 a[3]='R'                              │ R  B  
 a[4]='B'                              │ X  E  
 a[5]='X'                              └─   ── 
 a[6]='E'                             
  
Po příkazu ASORT(a,2) bude uspořádán │Po příkazu ASORT(a,2) bude uspořádán 
 a[1]='F'     &&   Změní se, až od     ┌──  ── 
 a[2]='A'     &&   2. prvku !!!!!!     │ F  A   Uspoř. řádků určil druhý 
 a[3]='B'                              │ R  B   prvek, proto poř. zachov. 
 a[4]='E'                              │ X  E  (Říká se "setřídění podle 
 a[5]='R'                              └──  ──     druhého  sloupce".) 
 a[6]='X'                             

 

Jelikož analogie funkce třídění jednorozměrného a dvojrozměrného pole nemusí být na první pohled zřejmá, doporučuji pro dvojrozměrná pole:

a) pro třídění počínající prvním řádkem <pole> podle sloupce <expN1> použít funkci ve tvaru:

 

ASORT(<pole>,<expS> [, <expN2> [, <expN3>]])

 

kde <expS> je číslo tříděného sloupce. Například třídění všech řádku pole MM podle 12. sloupce se programuje

 

=ASORT(MM,12)

 

b) pro třídění počínající R-tým řádkem <pole> podle sloupce <expS> je možné použít funkci ve tvaru:

 

ASORT(<pole>,AELEMENT(<pole>,<expR>,<expS>)

[, <expN2> [, <expN3>]])

 

Například třídění pole MM podle 11. sloupce, počínaje 5. řádkem se programuje:

 

=ASORT(MM,AELEMENT(MM,5,11))

 

Zbývající parametry mají původní význam.

Častou operací při řešení optimalizačních úloh je vynechání prázdných nebo jinak specifikovaných řádků či sloupců pole. K tomu se používá funkce:

 

ADEL(<pole>, <expN> [, 2])

 

U jednorozměrných polí se zruší prvek <expN>. U dvojrozměrných polí se zruší celý řádek, nebo sloupec <expN>. Rušíme-li celý sloupec, zadáme jeho číslo jako <expN>, 2 . Funkce vrací číselnou hodnotu 1 pokud proběhla bez chyb, jinak -1. Zrušením dojde k posunu dalších prvků, řádků nebo sloupců na uvolněné místo.

 

= ADEL(matice,5,2)

 

Inversní funkcí k ní je funkce vložení prvku (u jednorozměrného pole) či řádku nebo sloupce (u dvojrozměrného pole):

 

AINS(<pole>, <expN> [, 2])

Vložením se nezmění velikost pole. Poslední prvky se ztrácí. Vložené prvky mají hodnotu .F. Vložení se provede před prvek, řádek nebo sloupec zadaný <expN>. Vkládá,li se sloupec, nutno uvést ještě dvojku jako třetí parametr. Funkce vrací číselnou hodnotu 1 pokud proběhla bez chyb, jinak -1.

Ať do pravdivostní matice

aa[3,6]

aa=.t.

je vložen druhý sloupec. Pak po příkazu

= AINS(matice, 2, 2)

matice má tvar

T F T T T T

T F T T T T

T F T T T T

 

 

Kopírovanie prvků pole

Kopírování prvků z jednoho pole do druhého se provádí funkcí:

 

ACOPY(<pole1>, <pole2> [, <expN1> [, <expN2> [, <expN3>]]])

 

Kopíruje <expN2> prvků <pole1> počínaje prvkem <expN1> do <pole2> počínaje prvkem <expN3>. Pole <pole2> nemusí předem existovat. Implicitní začátek kopírování je první prvek pole. Neuvede-li se <expN2> nebo se zadá jako -1, kopíruje se celé <pole1>. Při kopírování dvojrozměrného pole je třeba začátek kopírování zadat pořadovým číslem prvku v poli (doporučeno použít funkce AELEMENT()). Funkce vrací počet zkopírovaných prvků.

 

=ACOPY(matice,pp2,3,5,2)

 

 

Uložení pole na disk

Uchování pole na disk, do samostatného souboru nebo do memo položky, se provádí stejně jako uchování paměťových proměnných příkazem:

 

SAVE TO <soubor> | TO MEMO <memo položka>

[ALL LIKE <maska> | ALL EXCEPT <maska>]

 

Není-li zadána ani jedna z frází ALL, uloží do souboru (implicitní přípona MEM) nebo memo položky všechny proměnné a pole. Fráze ALL LIKE vybere pro uložení jen ty proměnné pole, které vyhovují masce. Fráze ALL EXCEPT naopak pouze ty, které masce nevyhovují. Tento způsob uchování nedovoluje jinou manipulaci s polem než jeho opětovné načtení. Jinak hrozí poškození informací. Uložení pole MATICE do stejnojmenného souboru SAVE TO matice ALL LIKE matice.

Opětovné načtení pole se programuje příkazem

 

RESTORE FROM <soubor> | FROM MEMO <memo položka>

[ADDITIVE]

 

Bez fráze ADDITIVE nejprve zruší všechny aktuální proměnné a pole a poté založí a naplní proměnné a pole podle obsahu souboru nebo memo položky. Při uvedení ADDITIVE se aktuální proměnné a pole neruší, případně se pouze přepíší novým obsahem a přidají se nové. Vyslání RESTORE z programu založí vše jako PRIVATE, z příkazového okna jako PUBLIC.

Načtení pole MATICE ze stejnojmenného souboru

 

RESTORE FROM matice ADDITIVE

 

 

Uložení pole do databázového souboru

Pole lze přidat do aktuálního souboru jako tabulku. To znamená, že každý řádek tabulky vytváří nový záznam souboru. (Jednorozměrné pole vytvoří pouze jeden záznam.)

 

APPEND FROM ARRAY <pole> [FOR <expL>]

[FIELDS <seznam položek>]

 

Pořadí prvků pole musí odpovídat struktuře souboru. V případě nesouladu lze použít klauzule FIELDS.

 

APPEND FROM ARRAY pole

 

Podobnou činnost provádí též příkaz:

 

GATHER FROM <pole>

[FIELDS <field name list>]

[MEMO]|MEMVAR

 

Příkaz kopíruje obsah prvků pole do jednoho záznamu aktuálního databázového souboru. Kopírování končí vyčerpáním buď prvků pole nebo položek záznamu. (Klauzule MEMO umožní do seznamu položek zařadit i memo položky. Není-li uvedena, pak se memo položky ignorují. Použije-li se klauzule MEMVAR, pak proměnné musí mít stejná jména jako databázové položky. Když proměnná neexistuje, pak položka zůstane nezměněna.)

 

GATHER MEMVAR FIELDS prijmeni, jmeno, rocnik

 

 

Načtení pole z databázového souboru

Je-li nutné pokračovat v práci s polem databázovou technikou (například nedostatek místa v paměti, potřeba sdílení údajů), pak se programuje příkaz:

 

COPY TO ARRAY <pole> [FIELDS <seznam položek>]

[<rozsah>] [FOR <expL1>] [WHILE <expL2>]

[NOOPTIMIZE]

 

který přepíše data z databázového záznamu do pole (memo položky se ignorují). Cílové <pole> musí předem existovat. Pro kopírování více záznamů je třeba použít dvojrozměrné pole (jeden záznam se ukládá do jednoho řádku pole).

 

COPY TO ARRAY pom NEXT 10 NOOPTIMIZE

 

Podobnou funkci má i příkaz:

 

SCATTER [FIELDS <seznam položek>] TO <pole>

[MEMO] BLANK | MEMVAR

 

který přepíše vyjmenované položky aktuálního záznamu do pole. Pole (ani proměnné) nemusí být předem vytvořeny. Proměnné v tomto případě dostanou jména podle položek. Je-li použita fráze BLANK, vytvoří se prázdné prvky pole nebo proměnné odpovídajícího typu. Není-li zadaná fráze MEMO, příkaz ignoruje memo položky.

 

SCATTER FIELDS prijmeni,jmeno MEMVAR

 

 

Využití pole pro manipulaci se soubory

Pro kontrolu existence nebo stavu souborů úlohy je vhodné programovat funkci:

 

ADIR(<pole> [, <expC1> [, <expC2>]])

 

která uloží do sloupců pole jméno souboru, jeho velikost, datum založení, čas, atributy (AHRSD). (<pole> nemusí předem existovat, jeho velikost se automaticky upraví na dvojrozměrné pole velikosti počet souborů krát 5.) <expC1> je adresář DOS a maska pro výběr souborů, bez parametru znamená aktuální adresář. <expC2> obsahuje písmena H,S,D,V pro specifikaci výběru souborů skrytých nebo systémových, na výpis informace o podadresářích nebo "volume label".) Funkce vrací počet řádků pole. V takto vytvořeném poli je již kontrola jednoduchá.

zjištění údajů o souborech typu .DBF v aktuálním adresáři je možné programovat:

 

DIMENSION M[1]

?adir(a,'*.DBF')

7

 

* k dispozici je pole M s následujícím obsahem

 

SLOVNIK.DBF         347896            12.02.92 16:26:10 .A...

SFD.DBF                   7793                17.02.92 12:09:24 .A...

FOXUSER.DBF         54644              16.03.92 22:24:22 .A...

SFP.DBF                    7846                23.02.92  9:41:20 .A...

TEMATA.DBF           837                  03.03.92 21:15:08 .A...

KN.DBF                     98                    15.03.92 21:50:07 .A...

LEKARNA.DBF        3496                11.02.92 14:37:13 .A...

 

Zjištění struktury souboru je vhodné programovat pomocí funkce:

 

AFIELDS(<pole>)

 

Funkce uloží do pole jména databázových položek, typ (C,D,L, M,N,F), délku položky a počet desetinných míst pro položky typu N a F. Pole nemusí být předem vytvořeno. Pokud <pole> již existuje, upraví se jeho dimenze dle potřeby. Funkce vrací počet položek databázového souboru.

Příklad programování zápisu struktury aktuálního souboru do pole M.

 

use lekarna

dime a[1]

?afields(a)

7

=zobraz_m(@a)

 

* Výsledek je uložen v poli M ve tvaru

 

NAZEV                      C         30        0

FORMA                     C         6          0

ZAKOUPENO           D         8          0

EXPIRACE                D         8          0

KUSU                        N         8          0

CENA                        N         8          2

SPOTR                       N         8          0

 

Práce s poli pomocí uživatelských procedur a funkcí

Pro velký rozsah nemohou být skutečnými parametry funkcí a procedur hodnoty polí. Pole lze zadávat procedurám a funkcím pouze odkazem (referencí). V podstatě se procedurám a funkcím předává ukazatel na první prvek pole. To současně znamená, že procedura nebo funkce může měnit obsah pole.

Při programování práce s poli lze při volání funkce použít dvě možnosti:

a) Všechny skutečné parametry jsou předávány odkazem. Před předáním se programuje příkaz

 

SET UDFPARM TO REFERENCE

 

a po předání se nastaví standardní režim předávání hodnotou

 

SET UDFPARM TO VALUE

 

b) Jména parametrů předávaných odkazem se předznačí @ (viz cvičení).

 

 

Cvičení

 

Napište funkci nebo proceduru pro zobrazení dvojrozměrného pole (podle zadaného obrazu), bez ohledu na typ a velikost prvku pole. Mezi prvky vložte jednu mezeru.

 

PROCEDURE zobraz                                    && Název funkce

PARAMETERS pole,W,pic                            && Formální parametry

SET COLOR TO GR+                                   && Zobrazení matic bude žluté

?                                                                     && Nový řádek

?                                                                     && Nový řádek

@ ROW(),COL() SAY W COLOR W+           && Zobrazení průvod. textu (druhý parametr)

?                                                                     && Nový řádek

?                                                                     && Nový řádek

FOR i=1 TO ALEN(pole,1)                           && Podle řádků,   všimnete si zadání max.počtu

FOR j=1 TO ALEN(pole,2)               && Podle sloupců, všimnete si zadání max.počtu

?? pole[i,j] PICTURE pic     && Universální zobrazení prvku s obrazem

?? ' '                                       && Přidání mezery nemůže být proved. jediným

&& příkazem

ENDFOR (j)                                      && Další sloupec

?                                                         && Nový řádek

ENDFOR (i)                                                   && Další řádek

 

 

Kontrolní příklad k ověření funkce ZOBRAZ

 

N= "Příklad na předání pole odkazem"       && Název příkladu

=pr201_z(N)                                                  && Volání procedury, která zobrazí

DIMENSION aa[6,8]                                    && název. Deklarování matice {aa}

aa=1

=zobraz(@aa,"Zobrazení číselných hodnot","####")

aa='A'

=zobraz(@aa,"Zobrazení znakových hodnot","xxxx")

 

Zobrazení číselných hodnot předchozího příkladu

 

1    1    1    1    1    1    1    1

1    1    1    1    1    1    1    1

1    1    1    1    1    1    1    1

1    1    1    1    1    1    1    1

1    1    1    1    1    1    1    1

1    1    1    1    1    1    1    1

 

Zobrazení znakových hodnot předchozího příkladu

 

A A A A A A A A

A A A A A A A A

A A A A A A A A

A A A A A A A A

A A A A A A A A

A A A A A A A A

 

 

Vygenerujte matici znaků abecedy a prokažte automatickou změnu rozměru

 

CLEAR

SET TALK OFF

m=6

N=4

DIMENSION A[m,n]

FOR i=1 TO m*N

A[i]=' '+CHR(64+i)+' '

ENDFOR (i)

=zobraz(@aa,"Původní rozměr a[6,2]","xxxx")

DIMENSION A[5,7]

=zobraz(@aa,"Nový rozměr a[5,7]","xxxx")

 

Původní rozměr a[6,4]

 

A   B   C   D

E   F   G   H

I   J   K   L

M   N   O   P

Q   R   S   T

U   V   W   X

 

Nový rozměr a[5,7]

 

A   B   C   D   E   F   G

H   I   J   K   L   M   N

O   P   Q   R   S   T   U

V   W   X  ### ### ### ###

### ### ### ### ### ### ###

 

 

Vytvořte  pole znakových řetězců a prokažte správnost třídící funkce

 

CLEAR

SET TALK OFF

m=6

N=4

DIMENSION A[m,n]

FOR i=1 TO m*N

A[i]=' '+CHR(64+i)+' '

ENDFOR (i)

DO zobraz2

? IIF(ASORT(A,2,10,1) > 0,"Třídění proběhlo v pořádku",;

"Chybné zadání")

WAIT "Po stisku libovolné klávesy bude zobrazeno nové uspořádání"

DO zobraz2

 

PROCE zobraz2

?

FOR i=1 TO m

FOR j=1 TO N

?? A[i,j]

ENDFOR (j)

?

ENDFOR (i) 7

 

 

Zobrazení původní matice

 

A  B  C  D

E  F  G  H

I  J  K  L

M  N  O  P

Q  R  S  T

U  V  W  X

 

Třídění proběhlo v pořádku

 

U  V  W  X

Q  R  S  T

M  N  O  P

I  J  K  L

E  F  G  H

A  B  C  D

 

 

Vytvořte pole znakových řetězců a prokažte správnost třídící funkce dvojrozměrného pole

 

N="Příklad na třídění dvojrozměrného pole"

DO pr201_z WITH N

m=6

N=10

DIMENSION A[m,n]

FOR i=1 TO m*N

A[i]='p.č:'+STR(i,2)

ENDFOR (i)

A[3,2]='p.č:'+STR(86,2)

A[4,2]='p.č:'+STR(64,2)

A[5,2]='p.č:'+STR(97,2)

 

= zobraz(@A,"Původní obsah","xxxxxxxx")

 

B=IIF(ASORT(A,2,m*N,1) > 0,"Třídění sestupně podle druhého sloupce",;

"Chybné zadání")

 

= zobraz(@A,B,"xxxxxxxx")

DO pr201_y

 

 

Původní obsah

 

p.č: 1 p.č: 2 p.č: 3 p.č: 4 p.č: 5 p.č: 6 p.č: 7 p.č: 8 p.č: 9 p.č:10

p.č:11 p.č:12 p.č:13 p.č:14 p.č:15 p.č:16 p.č:17 p.č:18 p.č:19 p.č:20

p.č:21 p.č:86 p.č:23 p.č:24 p.č:25 p.č:26 p.č:27 p.č:28 p.č:29 p.č:30

p.č:31 p.č:64 p.č:33 p.č:34 p.č:35 p.č:36 p.č:37 p.č:38 p.č:39 p.č:40

p.č:41 p.č:97 p.č:43 p.č:44 p.č:45 p.č:46 p.č:47 p.č:48 p.č:49 p.č:50

p.č:51 p.č:52 p.č:53 p.č:54 p.č:55 p.č:56 p.č:57 p.č:58 p.č:59 p.č:60

 

Třídění sestupně podle druhého sloupce

 

p.č:41 p.č:97 p.č:43 p.č:44 p.č:45 p.č:46 p.č:47 p.č:48 p.č:49 p.č:50

p.č:21 p.č:86 p.č:23 p.č:24 p.č:25 p.č:26 p.č:27 p.č:28 p.č:29 p.č:30

p.č:31 p.č:64 p.č:33 p.č:34 p.č:35 p.č:36 p.č:37 p.č:38 p.č:39 p.č:40

p.č:51 p.č:52 p.č:53 p.č:54 p.č:55 p.č:56 p.č:57 p.č:58 p.č:59 p.č:60

p.č:11 p.č:12 p.č:13 p.č:14 p.č:15 p.č:16 p.č:17 p.č:18 p.č:19 p.č:20

p.č: 1 p.č: 2 p.č: 3 p.č: 4 p.č: 5 p.č: 6 p.č: 7 p.č: 8 p.č: 9 p.č:10

 

Sestavte funkci pro násobení matic C=A*B a prověřte správnost algoritmu na triviálním příkladě. Funkce ať vrací 1 po úspěšném provedení, a -1 po zjištění chyby.

 

SET TALK OFF                                             &&  Nezobrazovat mezivýsledky

m=6                                                               &&  Zvolený rozměr

n=8                                                                &&  Zvolený rozměr

p=4                                                                &&  Zvolený rozměr

DIMENSION A[m,n],B[n,p],C[m,p]                       &&  Deklarace matic

A=1                                                               &&  Dosazení 1 do všech prvků matice

B=1                                                                &&  Dosazení 1 do všech prvků matice

=nasob[@A,@B,@C]                                              &&  Ověření funkce pro násobení

=zobraz(@C,"","9999")                              &&  Zobrazení výsledků

 

FUNCTION nasob                                        &&  Násobení matic C=A*B

PARAMETERS x,y,z                                      &&  Formální matice

IF ALEN[x,2]<>ALEN[y,1] OR ;               &&  Kontrola rozměrů matic

ALEN[z,1]< ALEN[x,1] OR ;          &&  Kontrola rozměrů matic

ALEN[z,2]< ALEN[y,2]                   &&  Kontrola rozměrů matic

WAIT " Chybně zadané rozměry matic";     &&  Ohlášení chyby

NOWAIT WINDOW               &&  Nevyžaduje se zmáčnutí klávesy

RETURN –1                                      &&  Funkce vrací zápornou indikaci

ENDIF (alen[x,2]<>alen[y,1] or ;)             && => chyba

FOR i=1 TO ALEN[x,1]                               &&  Přes všechny řádky matice x

FOR j=1 TO ALEN[y,2]                   &&  Přes všechny sloupce matice y

z[i,j]=0                                             &&  Nulování sumačního prvku matice z

FOR K=1 TO ALEN[x,2]     &&  Přes všechny sloupce x a řádky y

z[i,j]=z[i,j]+x[i,k]*y[k,j]   &&  Vyčíslení  hodnoty prvku matice z

ENDFOR (k)                          &&  Konec cyklu

ENDFOR (j)                                      &&  Konec cyklu

ENDFOR (i)                                                   &&  Konec cyklu

RETURN 1                                                     &&  Funkce vrací kladnou indikaci

&&  => v pořádku

Pomocné procedury, použité v příkladech

 

PARAMETERS nazev

PUBLIC s                                                      && Proměnná s předává ho

&& proceduře, na stejné úrovni

s=SYS(2001,"COLOR")                                && Úschova palety barev

SET COLOR TO W+/B

CLEAR                                                          && Výmaz obrazovky

SET TALK OFF                                            && Potlačení zobrazování

@1,4 SAY "  "+nazev+"  "                           && Název úlohy

@0,3 TO 2,LEN(nazev)+4+3  DOUBLE      && Rámeček

SET COLOR TO W/N                         && Barvy pro výběrové po

SET ESCAPE OFF                                        && ESC neukončí program

 

WAIT "Konec - lib. klávesa" WINDOW

SET COLOR TO &s

CLEAR ALL

CLEAR