Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Масссивтер






Object Pascal тілінде массивтер басқ а программалау тілдеріндегі элементтер типіне ұ қ сас келеді. Массивтердің айырымдық ерекшеліктері олардың компоненттерінің бә рі бір типті мә ліметтер болады (қ ұ рылымдық болуы мү мкін). Бұ л компоненттерді ө те оң ай реттеуге жә не олардың реттік номерін кө рсету арқ ылы кез келгенімен жұ мыс істеуге болады, мысалы:

Type

Digit=array[0..9] of char;

Matrix=array[byte] of single;

Var

M: matrix:

D: digit:

I: integer:

Begin

End.

Массивтер типі тө мендегідей сипатталады:

< тип аты> =array[< индекстік типтер тізбегі> ] of< тип аты>;

Мұ ндағ ы < тип аты> - индентификатор атауы;

Array, of- қ ызметші сө здер;

< индекстік типтер тізбегі> - ү тір арқ ылы ажыратылғ ан бір немесе бірнеше индекстік типтер тізбегі.

Object Pascal тілінде индекстік тип ретінде ө лшемі 2 Гбайттан артпайтын кез келген реттелген типті пайдаланцуғ а болады.

Айнымалыны массив ретінде анық тауғ а болады, массив типін алдын- ала сипаттамай- ақ, айнымалы ретінде тікелей сипатталынады. Мысалы,

Var

a, b: array[1..10] of real:

Ә детте, индекстік тип ретінде аралық тип пайдаланылады, мұ нда индекстін шекарасының ө згерісі беріледі. Массивті сипаттауда of сө зінен кейінорналасқ ан типтің ө зі Object Pascal-дың кез келген типі болуы мү мкін, тіпті басқ а массив болуы мү мкін.

Мысалы,

Type

Mat=array[0..5] of array[-2..2] of array[char] of byte;

Мұ ндай жазуды ық шамды етіп сипаттауғ а болады:

Type

Mat=array[0..5, -2..2, char] of byte;

Дербес компьютердің жадында массив элементтері кіші адрестен ү лкен адреске кө шкенде массивтің оң жақ индкесті жылдам ө згеретіндей болып бірінен соң бірі орналасады.мысалы, егер

Var

a: array[1..2, 1..2] of Byte;

Begin

a[1, 1]: =1;

a[2, 1]: =2;

a[1, 2]: =3;

a[2, 2]: =4;

end.

Болса, онда жадында 1, 3, 2, 4 мә ндерімен байттар бірінен соң бірі орналасады.

Object Pascal тілінде бір массивтің барлық элементтерін басқ а массивке меншіктеу операторы арқ ылы беруге болады. Мысалы,

Var

a, b: array[1..5] of single;

begin

a: =b;

End.

Меншіктеу командасы орындалғ аннан кейн А массивінің элементтері В массивінің элементтерімен бірдей болады.

Массивтер ү шін қ атынас операциялары анық таламағ ан.

Мысалы, тө мендегі жазу қ ате:

If a=b then…

Екі массив элементтері бойынша салыстырылады. Мысалы:

Var

a, b: array[1..5] of single;

p: Boolean;

i: byte;

begin

P: =true;

For i= 1 to 5 do

Ifa[i]< > b[i] then p: =False;

If p then

End.

Динамикалық массивтер. Delphi- дің 4- нұ сқ асынан бастап динамикалық массивтер енгізілген. Программада мұ ндай массивтердібейнелегенде индекстің шекараларын кө рсетудің қ ажеті жоқ:

Var

A: array of integer;

B: array of array of char;

C: array of array of array of real;

Бұ л мысалдағ ы динамикалық А массивінің бір, В массивінің екі, С массивтің ү ш ө лшемі бар. Жалдыны бө лу мен динамикалық массивтердің ә рбір ө лшемі бойынша индекстердің шекарасын кө рсету программаның орындалуы барысында SetLegth фнукциясының кө мегімен массивті тағ айындау жолымен жү зеге асырылады. Мұ ндай оператордың орындалуы барысынада:

SetLegth(А, 3);

Бір ө лшемді А динамикалық массиві тағ айындалады, яғ ни ү ш бү тін санды орналастыруғ а жететін жадыдан орын бө лінеді. Динамикалық массивтің кез келген ө лшемі бойынша индекстің тө менгі шекарасы 0 (нолге) тең, сондық тан А массивтің индексінің жоғ арғ ы шекарасы 2- ге тең болады.

Динамикалық массивтің идентификаторы жадының алғ ашқ ы байтының адресінен тұ ратын кө рсеткішке сілтеме жасап, бө лінген орынғ а массивті орналастырады. Сондық тан осы жадыны босату ү шін индентификаторғ а Nil мә нін меншіктеу жеткілікті (басқ а тә сілмен Finanaize процедурасмын пайдалануағ а болып табылады).

Var

A, B: array of integer;

Begin // жадыны ү лестіреміз:

SetLegth(А, 10);

SetLegth(B, 20); //Массивтреді пайдаланамыз:

A: =Nil;

Finanalize(B);

End;

Орнатылғ ан динамикалық массивтің ұ зындығ ын ө згертуге алдымен жаң а массивті орналастыруғ а қ ажетті жады даярланады, одан кейін екі массивтің элементтері жаң а орынғ а тасымалданады да, бұ рынғ ы массивке бө лінген жады босатылады. Ү лкен динамикалық массивтің шекараларын ө згертуге байланысты қ осымша уақ ытты қ ысқ арту ү шін бірден ұ зындығ ын ү лкен массив қ ұ ру қ ажет.

Кө п ө лшемді массивтерде алдымен оның алғ ашқ ы ө лшемінің ұ зындығ ын тағ айындалады, одан кейін екінші, ү шінші т.с.с.

Мысалы,

Var

A: array Of array of integer; // екі ө лшемді динамикалық массив;

Begin // бірінші ө лшемнің ұ зындығ ын тағ айындаймыз (бағ андар ө лшемі);

SetLegth(А, 3);

// ә рбір бағ анның ұ зындығ ын береміз;

SetLegth(А[0], 3);

SetLegth(А[10], 3);

SetLegth(А[2], 3);

End;

Динамикалық массивтің ә деттегі массивтен айырмашылығ ы оның екінші, ү шіші ө лшемінде ұ зындық тары ә ртү рлі болуы мү мкін. Алдынғ ы мысалда ө лшемі 3х3 квадрат массив анық талғ ан. Ү шбұ рыш массив қ ұ рып кө рейік:

SetLegth(А, 3);

// ә рбір бағ анның ұ зындығ ын береміз;

SetLegth(А[0], 3);

SetLegth(А[10], 4);

SetLegth(А[2], 5);

Кө пө лшемді динамикалық массивтерде N-1 ө лшемінің ә рбір элементі динамикалық массив болуы мү мкін, сондай- ақ, ол тағ айындауды талап етеді. Мысалы 3х3х3 ө лшемді нақ ты куб массивті тағ айындау қ ажет:

Var

A: array Of array of integer;

I, j: integer;

Begin

SetLegth(А, 3);

For i: =0 to 2 do

Begin

SetLegth(А[i], 3);

For i: =0 to 2 do

SetLegth(А[I, j], 3);

End;

End;

Енді Delphi ортасында массив элементтерімен жұ мыс істеуге қ ажетті компоненттерді қ арастырайық.

Delphi ортасында экранғ а массив элементтерін енгізу жә не шығ аруды компоненттер палитрасын Additional бетінде орналасқ ан Stringrid компонентінің кө мегімен ұ йымдастырылағ ан ың ғ айлы. Бұ л компонент ақ паратты кесте тү рінде бейнгелеу ү шін пайдаланылады. Кесте белгілкенген жә не жұ мыс аймағ ынан тұ рады. Белгіленген аймақ жұ мыс аймағ ының жол жә не бағ ан атауларын шығ ару жә не тышқ анның кө мегімен олардың ө лшемін басқ ару қ ызметін атқ арады. Белгіленген аймақ басқ а тү спен ерекшеленген жә не оғ ан клавиатурадан ақ апарат енгізуге болмайды. Белгіленген аймақ тын жолдары мен бағ андар саны FixedRows жә не FixedCols қ асиетінде кө рсетіледі. Ал, жұ мыс аймағ ы RowCount- жол жә не ColCount бағ ан ақ параттарынан тұ рады, оны программалық жолмен де, тышқ анның немесе клавиатураның да кө мегімен ө згертуге болады. Программадағ ы ақ паратпен қ атынас Cells[Acol, AROW: integer]: String қ асиетінің кө мегімен жү зеге асырылады. Мұ ндағ ы Acol- кестенің бағ ан нө мері, ал AROW- жол нө мері, ал нө мірлеу нө лден басталады. Сонымен қ атар, қ осымша батырмаларсыз кестенің ө лшемін басақ ару ү шін компоненттер палитрасының Samplesбетінде орналасқ ан SpinEdit редактор ө рісін пайдалануғ а болады. Енді осы компоненттердің қ ызметін пайдаланатын мысал қ арастырайық.

ТАПСЫРМА:

A={aij}(Xj=apj, j=1, 2,..m) матрицасының P жолына тең болатын Х={Х1X2, ….Xm} векторының, A={Yi=aiq, i=1, 2,.., n} матрицасының q бағ анына тен болатын Y={Y1, Y2, …Yn} векторын есептейтің жә не A={aij} матрицасының ең ү лкен жә не ең кіші элементтерінің экранғ а шығ аратын программа қ ұ райық (n 6, m 8)

ТАПСЫРМАНЫ ОРЫНДАУҒ А Ә ДІСТЕМЕЛІК НҰ СҚ АУЛАР:

Алдымен формағ а Additional бетінен: Stringrid1, Stringrid2 жә не Stringrid3 компоненттерін, ал Samples бетінен SpinEdit1, SpinEdit2 жә не есептеу процесін орындау ү шін Button1 компоненттерінің орналастырамыз. Бұ л мыслада барлық StringGrid компоненттері ү шін белгіленген аймақ пайдаланылмайды. Объектілер Инспекторы FixedRows жә не FixedCols қ асиеттерінің мә ніне 0 мә нін меншіктейміз. Есеп шартына сә йкес StringGrid компоненттері ү шін n жол мен m бағ анның ең жоғ арғ ы шектік мә ндерін тағ айындаймы:

StringGrid1 RowCount=6; ColCount=8
StringGrid2 RowCount=8; ColCount=1
StringGrid3 RowCount=6; ColCount=1

 

StringGrid1 компонентіне ескертусізклавиатурадан мә н енгізбес ү шін осы компонент ү шін объектлер инспекторы терезесіндегі Options қ асиетіндегі + белгісін тышқ анмен жылдам екі рет басқ анда ашылғ ан GoEditing командасына True мә нін тағ айындаймыз. Ал, SpinEdit1, SpinEdit2 компоненттері ү шін тө мендегідей қ асеиттерге мә н береміз:

SpinEdit1 MaxValue=1 MinValue=6
SpinEdit2 MaxValue=1 MinValue=6

 

Енді SpinEdit1 жә не SpinEdit2 компоненттері ү шін осы оқ иғ аларды ө ндеу процедураларын қ қ ұ райық. Ол ү ін курсорды SpinEdit1 жә не SpinEdit2 компоненттерінекелтіріп тышқ анның батырмасын жылдам екі басамыз. Нә тижесінде программалар коды терезесінде:

Procedure SpinEdit1Cgange(Sender: TObject);

Procedure SpinEdit2Cgange(Sender: TObject);

Оқ иғ а ө ндеуші процедураларын аламыз.

Программа мә тіні тө мендегідей:

 

unit Unit1;

 

interface

 

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Spin, Grids;

 

type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

StringGrid2: TStringGrid;

StringGrid3: TStringGrid;

SpinEdit1: TSpinEdit;

SpinEdit2: TSpinEdit;

SpinEdit3: TSpinEdit;

SpinEdit4: TSpinEdit;

Button1: TButton;

Button2: TButton;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Label6: TLabel;

Label7: TLabel;

Label8: TLabel;

Label9: TLabel;

Label10: TLabel;

Label11: TLabel;

Label12: TLabel;

Procedure SpinEdit1Change(Sender: TObject);

Procedure SpinEdit2Change(Sender: TObject);

Procedure FormCreate(Sender: TObject);

Procedure Button1Click(Sender: TObject);

Procedure Button2Click (Sender: TObject);

Private {Private declarations}

Public {Private declarations}

End;

Var

Form1: TForm;

implementation

 

{$R *.dfm}

Var

A: array[1..6, 1..8] of extended;

X: array[1..8] of extended;

Y: array[1..6] of extended;

m, n, p, q: integer; max, min: extended;

 

Procedure TForm1.FormCreate(Sender: TObject);

Begin

SpinEdit1.Text: ='4';

SpinEdit2.Text: ='6';

SpinEdit3.Text: ='2';

SpinEdit4.Text: ='3';

StringGrid1.RowCount: =4;

StringGrid1.ColCount: =6;

StringGrid2.RowCount: =6;

StringGrid3.RowCount: =4;

End;

 

Procedure TForm1.SpinEdit1Change(Sender: TObject);

Begin

n: =StrToint(SpinEdit1.Text);

StringGrid1.RowCount: =n;

StringGrid3.RowCount: =n;

End;

 

Procedure TForm1.SpinEdit2Change(Sender: TObject);

Begin

n: =StrToint(SpinEdit2.Text);

StringGrid1.ColCount: =m;

StringGrid2.RowCount: =m;

End;

 

 

Procedure TForm1.Button1Click(Sender: TObject);

var i, j: integer;

begin

n: =StrToint(SpinEdit1.Text);

StringGrid1.RowCount: =n;

StringGrid3.RowCount: =n;

m: =StrToint(SpinEdit2.Text);

StringGrid1.ColCount: =m;

StringGrid2.RowCount: =m;

p: =StrToint(SpinEdit3.Text);

q: =StrToint(SpinEdit4.Text);

for i: =1 to n do

for j: =1 to m do

A[i, j]: =StrToFloat(StringGrid1.Cells[j-1, i-1]);

Max: =A[1, 1]; //Ең ү лкен жә не ең кіші элементті табу

for i: =1 to n do

for j: =1 to m do

if A[i, j]> max then max: =A[i, j]

else if A[i, j]< min then min: =A[i, j];

label9.Caption: =floattostr(max);

label2.Caption: =floattostr(min);

for j: =1 to m do // X[j] массивін шығ ару

begin

X[j]: =A[p, j];

StringGrid2.Cells[0, j-1]: =FloatToStrF(X[j], ffFixed, 3, 1);

end;

for i: =1 to n do // Y[i] массивін шығ ару

begin

Y[i]: =A[i, q];

StringGrid3.Cells[0, i-1]: =FloatToStrF(X[j], ffFixed, 3, 1);

end;

end;

Procedure TForm1.Button2Click(Sender: TObject);

begin

Close;

end;

end.

Программаның орындалу нә тижесі 5.1-суретте кө рсетілген.

 

5.1-сурет. Массивтерді шығ ару терезесі.

 

Ұ сынылатын ә дебиеттер: [1-9]

Бекіту сұ рақ тары:

1. Масссив дегеніміз не жә не оның жазылуы форматы қ андай?

2. Динамикалық массив дегеніміз не жә н олар қ алай бейнеленеді?

3. Setlength функциясының қ ызметі қ андай?

4. Р жә не n натурал санадары мен а1..., аn бү тін сандары берілген. а1..., аn тізбегінің Р санына еселі болатын мү шелерінің кө бейтіндісін табындар?

5. P, q жә не а1..., аn бү тін санадары берілген (P> q> =0). а1..., аn тізбегінде модулі Р-ғ а бө лгенде q қ алдық беретін мү шелерін нолмен алмастырындар.

6. а1..., аn тізбегіндегі

а) 5- ке еселіж

б) тақ жә не теріс

в) 5- ке бө лінетін жә не 7- ге бө лінбейтін;

г) |aj|< i2 шартын қ анағ аттанадыратын мү шелерінің қ осындысын жә не санын табатын программа қ ұ рыныз.

7. A(m, n) матрицасының ә р жол элементтерінің ең ү лкен экранғ а шығ аратын программа қ ұ рыныз.

8. A(m, n) матрицасының диагональдарындағ ы ең кіші элементті экранғ а шығ аратын программа қ ұ рыныз.

9. A(m, n) матрицасының диагоналндағ ы жә не одан жоғ ары жатқ ан элементтерін нольмен алмастырындар.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.