|
Таңдау операторы
Таңдау операторы бірнеше әрекеттің ішінен таңдауға мүмкіндік береді. Таңдау жүргізілетін параметр ретіндегі өрнек үшін кез келген реттелген тип алынады (реттелген типке- integer, char, логикалық типтер жатады).
Таңдау операторының құрылымы төмендегідей:
Case < өрнек> of
< таңдау тізімі> [ else < операторлар>]
end;
Мұндағы case, of, else, end -қызметші сөздер (жағдай, одан, әйтпесе, соңы); < таңдау тізімі> - бір немесе бірнеше төмендегідей құрылым:
< таңдау тұрақтысы>: < оператор>;
< оператор>- Object Pascal тілінің кез келген операторы. Таңдау операторының орындалуы төмендегідей.
Алдымен өрнек есептеледі, одан кейін таңдау тізімінен есептелген өрнектің мәніне тең тұрақты ізделінеді. Табылған тұрақтыға сәйкес оператор орындалып, таңдау командасы өзінің жұмысын аяқтайды. Егер таңдау тізімінен есептелген өрнектің мәніне тең тұрақты табылмаса, онда программаны басқару else операторынан кейін тұрған операторға береді. Кейде else < операторлар> бөлігін жабуға да болады.
Таңдау тізіміндегі операторлардың кез келгеніне бір емес, бірнеше үтірмен жазылған таңдау тұрақтысы сәйкес келуі мүмкін.
Мысалы,
ch:char;
begin
...
case ch of
'n', 'N','н','Н':=LbOutput.Caption:='Жоқ';
'y', 'Y', 'д', 'Д':=LbOutput.Caption:='Иә';
end;
Case <өрнек> of
1-тізім: begin
S1
End;
2-тізім: begin
S2
End;
……………
n-тізім: begin
Sn
End;
End;
№16 тапсырма
Цикл.
Delphi–де циклдермен жұмыс стандартты Турбо Паскальдағы сияқты. While(әзірше), Repeat(дейін), For(үшін) циклдік құрылымдардың жазылу үлгілері:
1.While P do
Begin
S
End;
2.Repeat
S
Until (not P);
3.For k:=k0 to kn do
Begin
S
End;
мұндағы Р – шарт; do - орындау, until – дейін (do, until - кілттік cөздер); S -цикл денесі;k - есептегіш (цикл параметрі); k0,kn - есептегіштің бастапқы, соңғы мәндері.
Мысалы, жалпы мүшесі ak=1/k2 (k=1,2…)тізбектің алғшқы бес мүшесінің қосындысын табу керек (n=5; Sn -?).
Procedure Tform1.FormCreat(Sender: TOject);
Var s,a:real; k,n:integer; s1:string;
Begin
n:=StrToInt(‘’,’Мүшелер саны=’,’’));
s:=0; k:=0;
For k:=1 to n do
Begin
a:=FloatToStrF(s,ffFixed,7,3); ShowMessage(s1);
End;
FloatToStr стандартты функциясы нақты сандар жолдар символына түрлендіреді.
«Дейін» қайталау командасы
Repeat...Until операторы
«Дейін» қайталану командасының жазылу форматы:
Repeat
< цикл денесі>
Until <шарт>;
Мұндағы Repeat, until қызметші сөздер (қайтала [соған дейін],әзір [шарт орындалғанша]); <цикл денесі>- Object Pascal кез келген операторлар тізбегі; <шарт> логикалық өрнек.
<цикл денесі> операторлар кем дегенде бір рет орындалады, егер <шарт> жалған болса, яғни логикалық өрнек мәні False болса, онда Repeat, until операторы жұмысын тоқтатып, басқаруды келесі операторға береді, кері жағдайда шарт орындалудан қалғанша <цикл денесі> қайталана береді.
begin... end операторлық жақшасына ұқсас, сондықтан until сөзінің алдына нүктелі үтір (;) қою міндет емес.
Циклдан дұрыс шығуды ұйымдастыру үшін цикл шарты цикл денесін құрайтын операторлардың ішінде өзгеріп отыруы тиіс. Төмендегі цикл «табиғи» жолмен ешқашан аяқталмайды.
While do
Begin
...
end;
және
repeat
...
until
for, while, repeat циклдық операторларын басқаруды жеңілдету үшін Object Pascal тілінің құрамына параметрсіз екі процедура енгізілген:
Break- циклдан тікелей шығуды жүзеге асырады; процедураның қызметін басқаруды циклдық оператордан кейінгі операторға беру болып табылады.
Continue- циклдың кезекті қайталануын алдын ала аяқтауды қамтамасыз етеді; басқаруды цикл операторының соңына берумен бара-бар.
Бұл процедуралар шартсыз көшіру GoTo операторын пайдалану қажеттілігінен босатады.
Жиындармен (массивтермен) жұмыс
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]
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-суретте көрсетілген.
Жиын (массив) – бір типті нысандар (объектілер) жиыны. Жиындар (массивтер) бір өлшемді (сызықтық), екі өлшемді (матрица) не көп өлшемді болуы мүмкін. Жиындарды сипатту Турбо Пакальдағы сияқты. Мысалы:
var
a:array[1..10] of integer; //бүтін сандар жиыны
b:array[3..8] of real; //нақтысандар жиыны
c:array[0..5] of string; //жолдық типті жиыны
Мартица – екі өлшемді жиын. Матрицаны сипаттаудың сызықтық жиынды сипаттаудан айырмавшылығы шамалы. Мысалы:
var
аa:array[1..10,1..10] of integer; //бүтін сандар матрицасы
bb:array[1..8,1..5] of real; //нақтысандар матрицасы
cc:array[0..5,0..3] of string; //жолдық типті матрицасы
Мысал. 100 метрлік қашықтыққа жүгіру барысында үш топтың әрқайсысынан үш студент іріктеп алынды. Олардың секөндпен өлшенген жүгіру нәижелері 1-кестеге енгізілген. Қайсы топтың студенттері бірінші орынға шықты? Орта есеппен олардың әрқайсысы 100 метрді қанша уақытта өтті?
1-кесте 1-топ 2-топ 3-топ
Жаңа жоба ашып, формада Memo1, StringGrid1, BitBtn1, BitBtn2, Label1 компоненттерін орнату (4-сурет).
TstringGrid -ұяшықтарында кез-келген ұзындықтағы жолдық шамаларды орналастыруға болатын кестелік компонент.
Қасиет | Мағынасы |
Cells[n,n] ColCount RowCount GrigLineWidth Fixedcos FixedRows FixedColor ColWidth[i] RowHeight[j] | n*m өлшемді кесте ұяшықтарының мәндері Кестенің баған саны Кестенің жол саны Кесте сызылатын сызықтың қалыңдығы Ерекше жолдар саны Ерекше бағандар саны Ерекше жолдар мен бағандар түсі i-бағанның ені j-жодың биіктігі |
Компоненттер қасиеттеріне мәндер меншіктеу:
Код терезесінде батырмасын оқиғасын өңдеуіш процедурасын құру.
Компонент | Қасиет | Мән |
BitBtn1 BitBtn2 StringGrid1 Label1 Memo1 | Kind Kind FxedCols FxedRows Caption Strigns | bkOK bkClose 1 1 бос ету бос ету |
Procedure Tform1.BitBtn1click(Sender: TObject);
Const n=3;
Var nomer,k,I,j:longint;
S:array[1..n,1..n] of real; //матрица
P:array[1..n] of real; //қосындылар жиыны
Min:real; nomerT:string;
Begin
{кесте құру}
StringGrid1.Font,Name:=’Times Kaz’;
StringGrid1.ColCount:=n+1;
StringGrid1.RowHeight:=n+2;
StringGrid1.Cells[0,n+1]:= ‘Орт.жылд.’;
For I:=1 to n do
Begin
P[i]:=0; //қосыенды жиынға бастапқы мәндер меншіктеу
StringGrid1.Colwidth[i]:=60;
StringGrid1.Cells[0,i]:=’ ‘+FloatToStr(i);
StringGrid1.RowHeight[i]:=15;
StringGrid1.Cells[I,0]:=’’+FloatToStr(i)+’топ’;
End;
{енгізілген элменттерді мартица ретіндек құу және экранға шығару}
k:=0;
for I:=1 to n do
for j:=1 to n do
begin s[i,j]:=StrToFloat(memo1.Lines[k]);
StringGrid1.Cells[I,j]:=’ ’+Memo1.Lines[k]; k:=k+1;
End;
{топ студентетрінің орташа жылдамдықтарын анықтау}
for I:=1 to n do
begin for j:=1 to n do
p[j]:=p[j]+s[j,i];
end;
for I:=1 to n do
StringGrid1.Cells[I,n+1]:=’ ‘FloatToStrF(p[i]/n,ffGeneral,4,2);
{бірінші орынға қай топ шыққанын анықтау}
min:=p[1];
nomer:=1;
for I:=111 to n do
if p[i]
begin min:=p[i];
nomer:=I;
end;
nomerT:=IntToStr(nomer);
Label1.Font.Size:=10;
Label1.Caption:=’1 – орынға’ +nomerT+ ‘топ шыққан’+#13+#13+’Орташа жылдамдығы:’’+FloatToStrF(min/nffGeneral,4,2);
End;
Жобаны сақтап, іске қосу. Форма көрінеді. Memo1 терезесіне топтар көрсеткіштерін кезекпен енгізіп, ОК батырмасын шерту. Нәтиже алынады(4-сурет).
3 - сурет Жарыс нәтижесі
Ескерту. StrigGrid компонентін пайдаланбай, мәндерді терезесіне енгізіп, нәтижені Label өрістеріне шығару да мүмкін.
№ Қарапайым типтер
Қарапайым типке реттелген, нақты типтер және мерзім-уақыт типтері жатады. Реттелген типтер мүмкін болатын болатын мәндерінің шектелгендігімен ажыратылады. Бұл мәндерді белгілі бір ретпен реттеуге болады, сонымен қатар, мәнін реттік номерін бүтін санмен беруге болады.
Нақты типтердің де, нақты санның ішкі берілу форматы мен анықталатын мәндерінің мөлшері көрсетіледі. Бірақ нақты типтердің мүмкін мәндерінің мөлшерінің көптігі соншалық, оны олардың әрқайсысын бүтін санмен белгілеу мүмкін емес.
Мерзім және уақыт типі мерзім мен уақытты белгілеуге арналған. Дәлірек айтсақ, оны сақтау үщін нақты формат пайдаланылады.
Дата добавления: 2015-09-12; просмотров: 316 | Поможем написать вашу работу | Нарушение авторских прав |