Dvodimenzionalni nizi. Oblikovanje matrik in izhod njenih elementov

Dvodimenzionalni niz v Pascalu se obravnava kot enodimenzionalni niz, katerega tip elementa je tudi matrika (matrika matrik). Položaj elementov v dvodimenzionalnih Pascalovih nizih je opisan z dvema indeksoma. Lahko jih predstavimo kot pravokotno tabelo ali matriko.

Razmislite o dvodimenzionalnem nizu Pascal z dimenzijami 3 * 3, to pomeni, da bo imel tri vrstice, vsaka vrstica pa ima tri elemente:

Vsak element ima svojo številko, kot v enodimenzionalnih nizih, zdaj pa je številka že sestavljena iz dveh številk - številke vrstice, v kateri se element nahaja, in številke stolpca. Tako je številka elementa določena s presečiščem vrstice in stolpca. Na primer, 21 je postavka v drugi vrstici in prvem stolpcu.

Opis dvodimenzionalnega niza Pascal.

Obstaja več načinov za deklariranje dvodimenzionalne matrike Pascal.

Že vemo, kako opisati enodimenzionalne nize, katerih elementi so lahko poljubne vrste, zato so elementi sami lahko matrike. Razmislite o naslednjem opisu vrst in spremenljivk:

Primer opisovanja dvodimenzionalnega niza Pascal

Vrsta
Vektor = niz<тип_элементов>;
Matrika = niz vektorjev;
Var m: matrika;

Razglasili smo dvodimenzionalno polje Pascal m, sestavljeno iz 10 vrstic, vsaka s 5 stolpci. V tem primeru je mogoče dostopati do vsake i -te vrstice m [i] in do vsakega j -tega elementa znotraj i -te vrstice -m [i, j].

Opredelitev tipov za dvodimenzionalne matrike Pascal je mogoče podati v eni vrstici:

Vrsta
Matrika = matrika matrike< тип элементов >;
ali še bolj preprosto:
tip
matrika = matrika<тип элементов>;

Sklicevanje na elemente dvodimenzionalne matrike je videti tako: M [i, j]. To pomeni, da želimo dobiti element, ki se nahaja v i-ti vrstici in j-tem stolpcu. Glavna stvar pri tem je, da ne zamenjamo vrstic s stolpci, sicer lahko spet dobimo klic neobstoječega elementa. Na primer, klic elementa M ima pravilen zapis, vendar lahko povzroči napako v programu.

Osnovne operacije z dvodimenzionalnimi nizi Pascal

Vse, kar je bilo povedano o osnovnih operacijah z enodimenzionalnimi nizi, velja tudi za matrike. Edino dejanje, ki ga je mogoče izvesti na matrikah iste vrste kot celoto, je dodelitev. To pomeni, da če naš program opisuje dve matriki iste vrste, npr.

tip
matrika = niz celih števil;
var
a, b: matrika;

potem lahko med izvajanjem programa dodelite matriko a matrična vrednost b(a: = b). Vsa druga dejanja se izvajajo element za elementom, na elementih pa lahko izvajate vse dovoljene operacije, ki so definirane za podatkovni tip elementov matrike. To pomeni, da če je matrika sestavljena iz celih števil, se lahko operacije, definirane za cela števila, izvajajo na njegovih elementih, če pa je niz sestavljen iz znakov, potem zanje veljajo operacije, definirane za delo z znaki.

Vnos dvodimenzionalne matrike Pascal.

Za zaporedni vnos elementov enodimenzionalnega niza smo uporabili zanko for, v kateri smo vrednost indeksa spremenili od 1. do zadnje. Toda položaj elementa v dvodimenzionalnem Pascalovem nizu je določen z dvema indeksoma: številko vrstice in številko stolpca. To pomeni, da bomo morali zaporedno spreminjati številko vrstice od 1. do zadnje in v vsaki vrstici ponavljati elemente stolpcev od 1. do zadnjega. To pomeni, da potrebujemo dve zanki for in ena od njiju bo ugnezdena v drugo.

Razmislite o primeru vnosa dvodimenzionalne matrike Pascal s tipkovnice:

Primer programa za vnos dvodimenzionalne matrike Pascal s tipkovnice

tip
matrika = niz celih števil;
var
a ,: matrika;
i, j: celo število; (indeksi niza)
začeti
for i: = 1 do 5 do (zanka za ponovitev po vseh vrsticah)
readln (a [i, j]); (vnos elementa s tipkovnico v i-ti vrstici in j-em stolpcu)

Dvodimenzionalno polje Pascal lahko napolnimo naključno, t.j. uporabite naključno (N) funkcijo in vsakemu elementu matrike dodelite tudi vrednost nekega izraza. Način zapolnjevanja dvodimenzionalne matrike Pascal je izbran glede na nalogo, v vsakem primeru pa je treba definirati vsak element v vsaki vrstici in vsakem stolpcu.

Prikaže dvodimenzionalno matriko Pascal na zaslonu.

Izpis elementov dvodimenzionalne matrike Pascal se izvaja tudi zaporedno; potrebno je natisniti elemente vsake vrstice in vsakega stolpca. Hkrati bi želel, da bi bili elementi v isti vrstici natisnjeni drug ob drugem, t.j. v vrstico, elementi stolpca pa so bili nameščeni drug pod drugim. Če želite to narediti, morate izvesti naslednje zaporedje dejanj (razmislite o fragmentu programa za matriko, opisano v prejšnjem primeru):

Primer programa za izpis dvodimenzionalne matrike Pascal

for i: = 1 do 5 do (zanka za ponovitev po vseh vrsticah)
začeti
za j: = 1 do 10 do (pregled vseh elementov vrstice za stolpcem)
write (a [i, j]: 4); (tiskanje elementov v i-ti vrstici matrike v eni vrstici zaslona, ​​medtem ko so za izhod vsakega elementa dodeljene 4 pozicije)
napisatiln; (preden spremenite številko vrstice v matriki, morate premakniti kazalec na začetek nove vrstice zaslona)
konec;

Opomba ( je pomembno!): zelo pogosto v študentskih programih pride do napake, ko poskušate vnesti tipkovnico ali izhod matrike, kot sledi: readln (a), writeln (a), kjer a Je spremenljivka tipa matrika. Vendar jih preseneti sporočilo prevajalnika, da spremenljivke te vrste ni mogoče brati ali natisniti. Morda boste razumeli, zakaj tega ni mogoče storiti, če si predstavljate N vrčkov, ki stojijo v vrsti, v rokah pa imate na primer kotliček z vodo. Ali lahko z ukazom "nalijte vodo" napolnite vse vrčke naenkrat? Ne glede na to, kako močno se boste trudili, boste morali naliti v vsako skodelico posebej. Polnjenje in prikazovanje elementov matrike je treba izvajati tudi zaporedno in element za elementom, saj v pomnilniku računalnika se elementi matrike nahajajo v zaporednih celicah.

Predstavlja dvodimenzionalno polje Pascal v pomnilniku

Elementi abstraktnega niza v pomnilniku stroja so v skladu z opisom fizično locirani zaporedno. Poleg tega vsak element zaseda v pomnilniku število bajtov, ki ustreza njegovi velikosti. Na primer, če je matrika sestavljena iz elementov tipa celo število, bo vsak element vzel dva bajta. Celotna matrika bo vzela S ^ 2 bajta, kjer je S število elementov v matriki.

In koliko prostora bo zavzela matrika, sestavljena iz nizov, t.j. matrica? Očitno: S i ^ S j, kjer je S i število vrstic, S j pa število elementov v vsaki vrstici. Na primer za matriko, kot je

Matrika = niz celih števil;

potreboval bo 12 bajtov spomina.

Kako se bodo elementi tega niza nahajali v pomnilniku? Razmislite o postavitvi matrike M tipa matrike v pomnilniku.

Za vsak element M tipa celo število sta dodeljeni dve pomnilniški celici. Postavitev v pomnilnik se izvaja "od spodaj navzgor". Elementi so postavljeni v vrstnem redu spremembe indeksa, ki ustreza shemi ugnezdenih zank: najprej je postavljena prva vrstica, nato druga, tretja ... Znotraj vrstice se elementi premikajo po vrstnem redu: prvi, drugi, itd.

Kot vemo, je dostop do katere koli spremenljivke možen le, če je znan naslov pomnilniške celice, v kateri je spremenljivka shranjena. Ko se program naloži, se spremenljivki dodeli določen pomnilnik, to pomeni, da se vzpostavi medsebojno ujemanje med spremenljivko in naslovom celice. Če pa smo spremenljivko razglasili za matriko, potem program "pozna" naslov začetka matrike, torej njenega prvega elementa. Kako dostopate do vseh drugih elementov matrike? Z dejanskim dostopom do pomnilniške celice, ki shranjuje element dvodimenzionalne matrike, sistem izračuna njen naslov s formulo:

Addr + SizeElem * Cols * (I -1) + SizeElem * (J -1),

kjer je Addr dejanski začetni naslov, na katerem se matrika nahaja v pomnilniku; I, J - indeksi elementov v dvodimenzionalnem nizu; SizeElem - velikost elementa matrike (na primer dva bajta za celoštevilčne elemente); Cols - število elementov v vrstici.

Izraz SizeElem * Cols * (I -1) + SizeElem * (J -1) se imenuje odmik od začetka matrike.

Koliko pomnilnika je dodeljenega matriki?

Razmislimo ne toliko o vprašanju, koliko pomnilnika je dodeljeno matriki (o tem smo razpravljali v prejšnjem razdelku), temveč o tem, kakšna je največja dovoljena velikost matrike glede na omejeno količino pomnilnika.

Za delovanje programa je pomnilnik dodeljen v segmentih po 64 KB in vsaj eden od njih je definiran kot podatkovni segment... V tem segmentu se nahajajo podatki, ki jih bo program obdelal. Nobena programska spremenljivka se ne sme nahajati v več kot enem segmentu. Zato, tudi če je v segmentu samo ena spremenljivka, opisana kot matrika, ne more prejeti več kot 65536 bajtov. Skoraj zagotovo bodo poleg matrike v podatkovnem segmentu opisane še nekatere spremenljivke, zato je resnična količina pomnilnika, ki jo je mogoče dodeliti matriki, po formuli: 65536-S, kjer je S količina pomnilnik, ki je že dodeljen za druge spremenljivke.

Zakaj moramo to vedeti? Da ne bi bili presenečeni, če med prevajanjem prevajalec generira sporočilo o napaki o deklaraciji matrike, ki je predolga, ko naleti na opis v programu (pravilen v smislu sintakse):

Vnesite myArray = matrika celega števila;

Že veste, da lahko glede na dvobajtno predstavitev celih števil dejansko deklarirate matriko s številom elementov, enakim 65536/2 -1 = 32767. In potem le, če ni drugih spremenljivk. 2D nizi bi morali imeti še manjše meje indeksov.

Primeri reševanja problemov z dvodimenzionalnimi nizi Pascal

Naloga: Poišči zmnožek ničelnih elementov matrike.

rešitev:

  • Za rešitev tega problema potrebujemo spremenljivke: matriko, ki jo sestavljajo na primer celi elementi; P je zmnožek elementov, ki niso 0; I, J - indeksi niza; N, M - število vrstic in stolpcev v matriki.
  • Vhodni podatki so N, M - vnesite njihove vrednosti s tipkovnice; matrika - vnos matrike bomo uredili v obliki procedure, matriko bomo zapolnili na naključni način, t.j. z uporabo funkcije random ().
  • Izhod bo vrednost spremenljivke P (izdelek).
  • Za preverjanje pravilnosti izvajanja programa je potrebno matriko prikazati na zaslonu, za to bomo oblikovali postopek za prikaz matrike.
  • Napredek pri reševanju problema:

najprej bomo razpravljali o izvajanju glavnega programa, o izvajanju postopkov bomo razpravljali nekoliko kasneje:

  • vnesite vrednosti N in M;
  • Uvedemo dvodimenzionalno Pascalovo matriko, za to pa se obrnemo na postopek vvod (a), kjer je a matrika;
  • Natisnemo dobljeno matriko, za to se sklicujemo na postopek tiskanja (a);
  • Dodelimo začetno vrednost spremenljivki P = 1;
  • Zaporedoma bomo iterirali vse vrstice I od 1. do N-te, v vsaki vrstici bomo ponovili vse stolpce J od 1. do Mth, za vsak element matrike bomo preverili pogoj: če je a ij ? 0, potem se produkt P pomnoži z elementom a ij (P = P * a ij);
  • Prikažemo vrednost produkta neničelnih matričnih elementov - P;

Zdaj pa se pogovorimo o postopkih.

Komentiraj (je pomembno!) Parameter postopka je lahko katera koli spremenljivka vnaprej določenega tipa, kar pomeni, da je za posredovanje matrike kot parametra postopku treba njeno vrsto opisati vnaprej. Na primer:

Vrsta
Matrika = niz celih števil;
temeljni premaz za postopek (a: matrika);
..............................

Vrnimo se zdaj k našim postopkom.

Postopek za vnos matrike se imenuje vvod, parameter postopka je matrika, zato ga je treba posredovati glavnemu programu, zato je treba parameter posredovati po referenci. Nato bo glava našega postopka videti takole:

Postopek vvod (var m: matrika);

Za implementacijo ugnezdenih zank v proceduri potrebujemo lokalne spremenljivke števca, na primer k in h. Algoritem polnjenja matrik je bil že obravnavan, zato ga ne bomo ponavljali.

Postopek za prikaz matrike na zaslonu se imenuje print, parameter postopka je matrika, vendar je v tem primeru vhodni parameter, zato se posreduje po vrednosti. Naslov tega postopka bo videti tako:

Tisk postopka (m: matrika);

In spet, za implementacijo ugnezdenih zank znotraj postopka potrebujemo števce, naj se imenujejo enako - k in h. Algoritem za prikaz matrike na zaslonu je bil opisan zgoraj, uporabili bomo ta opis.

Primer programa za dvodimenzionalno polje Pascal

Program proizvedenie;
Vrsta
Matrika = niz celih števil;
Var
A: matrika;
N, m, i, j: bajt;
P: celo število;
Postopek vvod (var m: matrika);
Var k, h: bajt;
Začeti
Za i: = 1 do n do (spremenljivka n za postopek je globalna, kar pomeni "znano")
Za j: = 1 do m do (spremenljivka m za postopek je globalna, kar pomeni "znano")
M: = naključno (10);
Konec;
Tisk postopka (m: matrika);
Var k, h: bajt;
Začeti
Za i: = 1 do n do
začeti
Za j: = 1 do m do
Pišite (M: 4);
Writeln;
konec;
Konec;
Začetek (začetek glavnega programa)
Writeln ("Vnesite dimenzijo matrike:");
Readln (N, M);
Vvod (a);
Tisk (a);
P: = 1;
Za i: = 1 do N do
Za j: = 1 do M do
Če<>0, potem p: = p * a;
Napišite (p);
Konec.

Dvodimenzionalni niz podatkovna struktura, ki shranjuje pravokotno matriko obrazca:

A 11 a 12 a 13 a 14 a 15 ... a 1 m a 21 a 22 a 23 a 24 a 25 ... a 2 m a 31 a 32 a 33 a 34 a 35 ... a 3m a 41 a 42 a 43 a 44 a 45 ... a 4m a 51 a 52 a 53 a 54 a 55 ... a 5m... ... ... ... ... ... ... a n1 a n2 a n3 a n4 a n5... a nm

  • V matriki je vsak element določen s številko vrstice in številko stolpca, na presečišču katerega se nahaja
  • V Pascalu se dvodimenzionalni niz obravnava kot matrika, katere elementi so linearni nizi (matrika matrik). Naslednja dva opisa dvodimenzionalnih nizov sta enaka var mass: matrika matrike real; var mass: niz realnih;
  • Imenuje se matrika, v kateri je število vrstic enako številu stolpcev kvadratna matrika.
  • Za sklicevanje na element matrike morate uporabiti dva indeksa, ki označujeta številko vrstice in številko stolpca. Na primer MyArr1... V tem primeru je element matrike (MyArr1) v četrti vrstici in petem stolpcu.
  • Vse, kar je bilo povedano o osnovnih operacijah z enodimenzionalnimi nizi, velja tudi za matrike. Pri ponavljanju matrike v zanki spremenljivke celega tipa delujejo kot indeksi. Tradicionalno je identifikator " jaz "In stolpec je" j “.
  • Matrična obdelava je v tem, da se najprej obravnavajo elementi prve vrstice (stolpca) enega za drugim, nato drugega in tako naprej do zadnjega.
  • Če je številka vrstice elementa enaka številki stolpca ( i = j), to pomeni, da element leži na glavna diagonala matrice.
  • Če element leži na stranski diagonali, so indeksi povezani s številom elementov ( n) z naslednjo enakostjo: i + j = n + 1

Opis dvodimenzionalne matrike

Obstaja več načinov za deklariranje (opis) dvodimenzionalnega niza v Pascalu.

Predhodni opis vrste matrike

matrika tipa = matrika celega števila; (matrika celih števil) var mass: matrix;

Definiranje spremenljivke kot matrike, ne da bi najprej opisali vrsto matrike

var masa: niz celih števil;

Inicializacija dvodimenzionalnega niza

Pri inicializaciji dvodimenzionalnih nizov je vsaka vrstica zaprta v dodatni par oklepajev:

Masa const: niz = ((2,3,1,0), (1,9,1,3), (3,5,7,0));

Vnos / izhod vrednosti elementov dvodimenzionalne matrike

Zelo pogosto se vrednosti elementov matrike vnesejo s tipkovnice. Ta način določanja informacij je preveč naporen pri delu z velikimi nizi. Za odpravljanje napak širokega razreda algoritmov je treba tak vnos informacij nadomestiti z naključno generiranjem elementov matrike. Če želite to narediti, uporabite postopek naključno in funkcijo naključen... Pri delu z dvodimenzionalnimi nizi se uporabljajo ugnezdene zanke (običajno zanka s parametrom za).

Polnjenje matrike z naključnimi številkami

const n = 5; m = 10; var i, j: celo število; matrika: matrika celih števil; začnite naključno razvrščati; za i: = 1 do n do (dostop do vrstic matrike) za j: = 1 do m do (dostop do stolpcev po elementih) matrika: = naključno (100); (v trenutni element vnesemo naključno število iz intervala: 4); writeln (prehod na novo vrstico ob izstopu iz notranje zanke) konec;

Primeri reševanja problemov

Primer 1

Formulacija problema. Podani pozitivni celi števili M in N. Oblikujte celoštevilsko matriko M × N, v kateri imajo vsi elementi J-tega stolpca vrednost 5 · J (J = 1,…, N).

Konst m = 7; n = 10; var i, j: bajt; matrika: matrika celih števil; začni za i: = 1 do m do za j: = 1 do n do matrika: = 5 * j; ... (Izhodni niz)

Primer 2

Formulacija problema. Dobili boste pozitivna cela števila M, N in niz M številk. Oblikujte matriko M × N, pri čemer vsak stolpec vsebuje vsa števila iz prvotnega niza (v istem vrstnem redu).

Const m = 5; n = 7; vektor: niz celih števil = (3, 5, 2, 7, 4); var i, j: bajt; matrika: matrika celih števil; začni za j: = 1 do n do (vzemi j-ti stolpec) za i: = 1 do m do (glej elemente j-tega stolpca po vrsticah) matrika: = vektor [i]; (izvedba) ... (Izpis nastalega dvodimenzionalnega niza)

Domača naloga

  1. Podani pozitivni celi števili M in N. Sestavite celoštevilsko matriko velikosti M × N, v kateri imajo vsi elementi I-te vrstice vrednost 10 · I (I = 1, ..., M).
  2. Dobite pozitivna cela števila M, N in niz N številk. Oblikujte matriko M × N, pri čemer vsaka vrstica vsebuje vsa števila iz prvotnega niza (v istem vrstnem redu).
  3. Poleg tega. Dobite pozitivna cela števila M, N, število D in niz M številk. Oblikujte matriko M × N, v kateri prvi stolpec sovpada z izvirnim nizom številk, elementi vsakega naslednjega stolpca pa so enaki vsoti ustreznega elementa prejšnjega stolpca in števila D (posledično vsaka vrstica matrike bo vseboval elemente aritmetične progresije).
  4. Poleg tega. Podana je matrika M × N. Natisnite njene elemente, ki se nahajajo v vrsticah s sodimi številkami (2, 4,…). Izhodni elementi vrstica za vrstico, ne uporabljajte pogojnega operatorja.

Zadnja lekcija Pascal je bila napisana že 7. marca, nato smo jo analizirali. Danes bomo izvedeli, kaj je dvodimenzionalni niz v pascalu, kako je opisano in kaj je. Več podrobnosti spodaj.

Torej, kaj pravzaprav je dvodimenzionalni niz? Za lažje zaznavanje si predstavljajmo enodimenzionalno matriko kot črto, v kateri vsi elementi gredo vodoravno drug za drugim, dvodimenzionalno pa kot kvadrat, v katerem se elementi nahajajo vodoravno in navpično. Dvodimenzionalni niz je sestavljen iz vrstic in stolpcev, imenovanih tudi matrika ali matrična matrika.

Kako so opisani dvodimenzionalni nizi? Obstaja več načinov za pisanje dvodimenzionalnih nizov, upošteval bom 2 od njih.

1 način za opis matrike: matrika vrste spremenljivk v matriki (celo število / realno / bajt);

2 način za opis matrike: matrika matrike vrste spremenljivk v matriki;

Najprej so opisane vrstice (1..m), nato pa stolpci (1..n).

Pri drugi metodi je opisano kot dva enodimenzionalna niza, ki skupaj tvorita eno dvodimenzionalno.

Dvodimenzionalno matriko lahko opišete v razdelku Vrsta, za nadaljnjo sklicevanje nanjo večkrat, ali v razdelku opisa spremenljivke Var, želim vas opozoriti na dejstvo, da lahko namesto m in n nadomestite številke, ali pa lahko uporabite konstante.

Primer definiranja dvodimenzionalne matrike v razdelku deklaracije spremenljivke:

Konst
m = 100;
n = 100;
var
a: niz celih števil;

V tem primeru smo podali dvodimenzionalno matriko a velikosti 100 krat 100, torej smo dobili kvadratno matriko.

Primer definiranja matričnega niza z razdelkom Vrsta:

Konst
m = 100;
n = 100;
Vrsta
Matrika = niz celega števila;
var
a: matrika;
b: Matrika;

V drugem primeru smo navedli dve enaki matrični matriki z dimenzijami 100 krat 100, medtem ko nam pri opisu matrike b ni bilo treba ponovno opisovati njenih velikosti in podatkovnega tipa.

Kako dostopam do spremenljive celice dvodimenzionalne matrike?

Za sklicevanje na dvodimenzionalno matriko morate najprej določiti številko vrstice in nato številko stolpca, kot sledi:

x je katera koli spremenljivka, a je ime matrike, i je številka vrstice, j je številka stolpca.

Poleg tega sta i in j lahko spremenljivki in celi števili.

Primer zapisovanja podatkov v niz:

Za i: = 1 do n do // nastavite številko vrstice v zanki
Za j: = 1 do m do // dodelite številko stolpca v zanki
a: = naključno (100); // dodelitev naključne vrednosti celici s številko vrstice i in številko stolpca j

Matriko smo napolnili z naključnimi števili od 1 do 100.

Primer programa, ki uporablja dvodimenzionalno matriko, v kateri matriko napolnimo z naključnimi števili in jo prikažemo na zaslonu:

Var // opis spremenljivk in matrike
Matrika: niz celih števil;
i, j: celo število;

Začetek // začetek glavnega programa
writeln ("Dvodimenzionalni niz:"); // Dialog z uporabnikom

Za i: = 1 do 10 do // polnjenje matrike
za j: = 1 do 10 do
Matrica: = naključno (100);

Za i: = 1 do 10 začnite // Iznesite matriko
za j: = 1 do 10 do
pisati (matrika, "");
napiši
writeln ("stran"); // Če želite, lahko izbrišete
konec; // Konec programa

// readln // Uporablja se v Turbo Pascalu



Povezani članki: