«Программалау іі» ПӘнінің ОҚУ-Әдістемелік кешені



жүктеу 10,41 Mb.
бет14/29
Дата07.12.2017
өлшемі10,41 Mb.
#3507
1   ...   10   11   12   13   14   15   16   17   ...   29

Зертханалық жұмыс №6

Тақырыбы: Мәліметтер типі
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Object Pascal тілінде кез келген мәліметтер өзінің типімен сипатталады. Мәліметтер типі объект қабылдай алатын мүмкін мәндер жиынтығын анықтайды. Сонымен қатар, мәліметтер типі дербес комьютердің жадындағы мәліметтердің ішкі берілуі форматын да анықтайды. Object Pascal тілі мәліметтердің тармақталған құрылымымен сипатталады.

Енді барлық типтерге қысқаша сипаттама берейік.

Қарапайым типтер

Қарапайым типке реттелген, нақты типтер және мерзім-уақыт типтері жатады. Реттелген типтер мүмкін болатын болатын мәндерінің шектелгендігімен ажыратылады. Бұл мәндерді белгілі бір ретпен реттеуге болады, сонымен қатар, мәнін реттік номерін бүтін санмен беруге болады.

Нақты типтердің де, нақты санның ішкі берілу форматы мен анықталатын мәндерінің мөлшері көрсетіледі. Бірақ нақты типтердің мүмкін мәндерінің мөлшерінің көптігі соншалық, оны олардың әрқайсысын бүтін санмен белгілеу мүмкін емес.

Мерзім және уақыт типі мерзім мен уақытты белгілеуге арналған. Дәлірек айтсақ, оны сақтау үщін нақты формат пайдаланылады.



Реттелген типтер.

Реттелген типке: бүтін, логикалық, символдық, саналатын және аралық тип жактады. Аталған типтердің әрқайсысы х өрнегінің мәнінің реттік номерін беретін ORD(x) функциясын қолдануға болады.

Бүтін типтер үшін ORD(x) функциясы х тің мәнінің өзін береді. ORD (x) функциясын логикалық, символдық және саналатын типтерге қолданып: логикалық тип үшін 0 мен 1 аралығындағы бүтін оң санды, символдық тип үшін 0 мен 255 аралығындағы сандарды, ал саналатын типтер үшін: 0 мен 65535 аралығындағы садарды береді. Аралық тип негізгі реттік типтің барлық қасиеттерін сақтайды, сондықтан оған ORD(x) функциясын қолдану сол типтің қасиетіне тәуелді болады.

Сондай-ақ, реттелген типтерге төмендегідей функцияларды қолдануға болады:

PRED(X)П функциясы реттелген типтің алдынғы мәнін береді, яғни ORD(x-1) –дің реттік номеріне сәйкес мән немесе ORD(Pred(x))= ORD(x)-1;

SUCC(X) функциясы ORD(X)+1-дің реттік номеріне сәйкес келетін реттелген типтің келесі мәнін берді, яғни ORD(Succ(x))= ORD(x)+1.

Мысалы, егер прораммада төмендегшідей айнымалылар анықталған болса,

Var C:Char;

Begin

C:=’5’;


End;

Онда PRED(C) функциясы ‘4’ символын, ал SUCC(C) п функциясы ‘6’ символын береді.

Егер кез келген реттелген типті сандық осьтің қандай да бір кесіндісінен орын алатын солдан оңға қарай өсетін реттелген мәндер жиыны ретінде қарастыратын болсақ, онда PRED(X) функциясы осы кесіндінің сол жақ ұшына дейін, ал SUCC(X) функциясы оң жақ ұшына дейін анықталмаған.

Бүтін типтер. Бүтін типтердің мүмкін болатын мәндерінің аралығы олардың жадыдан алатын бір, екі, төрт немесе сегіз байт орнына тәуелді болады. Бүтін типтердің мүмкін болатын мәндерінің аралығын кесте түрінде былай сипаттауға болады:


Атауы

Ұзындығы (байт)

Мәндер аралығы

Byte

1

0..255

ShortInt

1

-128..+128

SmallInt

2

-32768..+32767

Word

2

0..65535

Integer

4

-2147483648..+2147483647

LongInt

4

-2147483648..+2147483647

Long-Word

4

0..4294967295

Int64

8

-9*1018..9*1018

Cardinal

4

0..2147483647

B, s, w, I, l-әріптерімен сәйкес Byte, ShortInt, Word, Integer, LongInt

типтері белгіленеді; ал vb, vs, vw, vi, vl әріптерімен осы типтердің айнымалы екені көрсетіледі. Квадрат жақшада міндетті емес параметр көрсетіледі.

Бүтін типтерге қолданылатын стандартты процедуралар мен функциялардың типтері төмендегі кестеде келтірілген.



жазылуы

Нәтиже типі

әрекет

Abs(x)

x

х-тің модулін береді

Chr(x)

Char

Кодына сәйкес символды береді

Dec(vx[,i])

-

Vx-тің мәнін i –ге азайтады, ал i болмаса 1-ге азайтады

Inc (vx[,i])

-

Vx-тің мәнінi–ге арттырады, ал i болмаса 1-ге арттырады

Hi(w)

byte

Аргументтің үлкен байтын береді

HI(l)




Есеп бойынша үшінші байтты береді

Lo(i)




Аргументтің кіші байтын береді

Lo(w)




Бұл да сондай

Odd(l)

boolean

Егер тақ сан болса, True мәнін береді

Random(w)




0..( п-1) аралығындағы псевдокездейсоқ санды береді

Sqr(x)




Аргументтің квадратын береді

Swap(i)

integer

Сөздегі байттардың орнын алмастырады

Swap(w)

word

Бұл да сондай


Логикалық типтер. Логикалық типтерге: Boolean, ByteBool, Bool, WordBool және LongBool жатады. Стандартты Паскальда тек Boolean типі анықталған, ал қалған логикалық типтер Windows жүйесімен үйлесетін Object Pascal тілінде енгізілген: Boolean және ByteBool типтерінің әрқайсысы бір байт, Bool және WordBool-2 байт, LongBool-4 байт орын алады. Логикалық типтің мәні ретінде алдын-ала хабарланған False (жалған) немесе True (ақиқат) мәндерінің бірі алынады. Логикалық типтер үшін төмендегі ереже орындалады:

Ord (False)=0;

Ord(True)<>0;

Succ(False)= True;

Pred(True)=False;

Логикалық тип реттелген типке жататын болғандықтан қайталану операторында есептеу үшін пайдалануға болады, мысалы,

Var

L:Boolean;



Begin

For L:=False to True do ..

Delphi 32 жүйесінде Boolean типі үшін алынатын мән Ord(True)=+1, ал Bool WordBool және т.б. типтер үшін Ord(True)= Ord(True)+1, екенін естен шығармау керек. Сондықтан программа құру барысында бұл типтерді пайдаланғанда мұқият болу керек. Мысалы, Delphi –дің 6-нұсқасында төмендегі For қайталануындағы орындалатын оператор ShowMessage(

‘-----‘) бірде бір рет орындалмайды:

Var

L:Bool;


K:integer;

Begin


For L:=False to True do…

ShowMessage(‘____’)

End;

Егер L циклінің параметрінің типін Boolean типіне алмастырса, қайталану орындалып, хабарлама экранда екі рет пайда болады.



Символдық тип. Символдық титің мәні ретінде дербес компьютердегі барлық символдардың жиынтығы алынады. Әрбір символға 0..255 аралығындағы аралығындағы кез келген бүтін сан сәйкес келеді.Бұл сан символдың ішкі берілу коды деп аталады, оны Ord функциясы береді.

Коды 0..31 аралығындағы символдар қызметші кодқа жатады. Егер бұл кодтар программаның символдық мәтінінде кездесетін болса, онда олар бос орын болып есептеледі.

Char типіне қатынас операциялары, сондай-ақ, орнатылған функциялар қолданылады:

Chr(B) типті функция; Byte типті өрнекті символға түрлендіріледі;

Upcase(CH)-char типті функция; егер СН латынның кіші әріпі болса, онда бас әріпті береді, кері жағдайда СН символының өзін береді.

Саналатын тип. Саналатын тип өзі қабылдайтын мәндердің саналуымен беріледі. Әрбір мән қандай да бір идентфикаторлармен аталып, тізімде дөңгелек жақшаның ішінде орналасады, мысалы,

Type

Tuster=(ak, kyzul, jasul)


Саналатын тип программаның көрнектілігін арттырады. Егер пргораммада жыл ішіндегі айларға байланысты мәліметтер пайдаланылса, ондай программа үзіндісін былай келтіруге болады.

type Type Month=(jan,feb,mar,apr,may,jun,jul,aug,sep,okt,nov,dec);

Var

Month: TypeMonth;



begin

if month= “тамаша демалыс!”;



end.


Саналатын типтердің мәндері мен олардың реттік нөмірлерінің арасындағы реттілік нөмірі-0, екіншісі-1 және т.с.с.

Саналатын типтердің ең жоғарғы мәні-65536, сондықтан саналатын тип Word бүтін типінің ішкі жиыны тәрізді және мәндері 0,1 және т.б. болатын бүтін тұрақтылар тобы ретінде қарастырылуы мүмкін. Саналатын типке бүтін санды меншіктеуге болмайды.

Кез келген саналатын типтің айнымалысын алдын-ала сипаттамай-ақ хабарлауға болады, мысалы:

Var


Col (black, white, green);

Аралық тип. Аралық тип өзінің базалық типінің ішкі жиыны болып табылады. Базалық тип ретінде аралық типтен басқа кез келген реттелген тип алынады.

Аралық тип барлық типтің өзінің ішкі мәндерінің шекаралары арқылы беріледі:

<ең кіші мән >... <ең үлкен мән >

Мұндағы, <ең кіші мән > - аралық типтің ең кіші мәні;



<ең үлкен мән > - оның ең үлкен мәні.

Мысалы,


Type

digit =’0’..’9’;

dig2 = 48..59;

Аралық типті Type бөлімінде сипаттау міндетті емес, айнымалыларды хабарлауда тікелей көрсетуге болады.Мысалы:

Var

date: 1..31



month: 1..12

ichr: ’A’..’Z’;

Аралық типтерді анықтауда төмендегідей ережелерді ескерген дұрыс:


  • “..” екі символ бір символ ретінде қарастырылады, сондықтан олардың арасына бос орын қалдыруға болмайды;

  • Аралықтың сол жақ шегінен аспауы тиіс.

Аралық типке барлық типтің қасиеті тән, бірақ аздаған шектеулері бар.

Мысалы, егер айнымалы анықталған болса,

type

days= (mo, tu, we, th, fr, sa, su);



weekend;

begin


w: = sa;


end.


онда Ord(w) функциясы 5 мәнін береді, ал Pred(w) функциясы қате жөнінде хабарлайды.

Object Pascal –дың стандартты кітапханасында аралық типтердің жұмысын сүйемелдейтін екі функция бар:

Hight (x) – х айнымалысы жататын аралық типтің ең үлкен мәнін береді;

Low (x)-аралық типтің ең кіші мәнін береді.


Нақты типтер


Мәндері бүтін типтермен салыстырылатын реттелген типтерден нақты типтердің ерекшелігі нақты санның ішкі форматына тәуелді қандай да бір дәлдікпен еркін алынған санды анықтайды.

Ұзындығы байт

Атауы

Мәнді цифрлар мөлшері

Мәндер аралығы

8

Real

15...16

5,0*10324- …1,7*10308

4

Single

7...8

1,5*10-45 …3,4*1038

8

Double

15...16

5,0*10-324 … 1,7*10308

10

Extended

19...20

3,4*10-4951 …1,1*104932

8

Comp

19...20

-263…+263-1

8

Currency

19...20

922 337 203 685 477,5807

Кестеде көрсетілгендей, Object Pascal тілінде нақты сандар 4-тен 10 аралығындағы аралас байтқа дейін орын алады.

Арифметикалық сопроцессор барлық уақытта сандарды Extended форматында өңдейді; ал қалған үш нақты тип қажетті мөлшерге дейін нәтижені қарапайым қысқартылған күйінде беру болып табылады және олар жадыны үнемдеу үшін қолданылады.

Мысалы, «машиналық эпсилонды» мынадай программа көмегімен есептеуге болады:

typeRealType=Real;

Var Epsilon, Eps 1: RealType;

Epsilon:=Epsilon/2;

Eps1:=1+ Epsilon;

Until Eps=1;

LBOutput.Caption:=FloatToStr(2* Epsilon)

End.

Object Pascal тілінде Comp және Currency типтері ерекше орын алады, бөлшек бөлігінің ұзындығы шектеулі нақты сан ретінде қарастырылады: Comp типінің бөлшек бөлігінің ұзыдығы 0 (ноль) разряд, яғни болмайды, ал Currency типінің бөлшек бөлігінің ұзындығы 4 ондық разряд. Бұл аталған екі типке 19...20 мәнді ондық цифрды сақтайтын үлкен бүтін санды анықтайды. Бұл типтерді бухгалтерлік есептеуде қолданған өте ыңғайлы.



Нақты мәліметтермен жұмыс істеу үшін орнатылған математикалық функцияларды пайдалануға болады: abs(x), arctan(x), cos(x), frac(x) –санның бөлшек бөлігі; int(x)–санның бүтін бөлігі; ln(x) –натурал логорифм, Random-0..1 аралығындағы псевдокездейсоқ сан; Randomize - псевдокездейсоқ сандар генераторын орнату; sqr(x)-x – тің квадраты; sqrt(x) – тің квадрат түбірі.

Псевдо кездейсоқ сандар генераторы – базалық деп аталатын қандай да бір бүтін санды алып, оның разрядын белгілі бір анықталған алгоритм бойынша өзгертіп, нәтиже ретінде жаңа санды береді. Сонымен бірге, функцияға оралғанда жаңа сан базалық болады және т.с.с. (Сөйтіп процедура алгоритмі жұмыс барысында өзгермейтін сандар деп аталады). System жүйелік модулінде кез келген программада автоматты түрде кіруі мүмкін болатын базалық сан RandSeek айнымалысында сақталады және оның барлық уақытта бастапқы мәні 0-ге тең. Бұл Random функциясына әр түрлі программамен оралғанда бірдей кездейсоқ сандар тізбегінің шығатынын көрсетеді. Мысалы, төмендегі оқу программасынның BbRunClick терезесіне 300 кездейсоқ сан шығарылады, олар 20 саннан жолға топтастырылып, егер сан үш цифрдан кем болса, нольмен толықтырылады. Егер программаны қайтадан орындайтын болсаңыз, дәл сондай сандар тізбегін аласыз.

Procedure TfmExample.bbRunClick(Sender:TObject);

Var k:integer; s, ss:string;

Begin

S:=’’;


For k:=1 to 300 do

Begin


Ss:=intToStr(Random(1000));

While Length(ss)<3 do

Ss:=’0’+ss;

S:=s+ss+’’;

If k mod 20=0 then

Begin


mmOutput.Lines.Add(9);

s:=’’


end

end


end.
Randomize процедурасының көмегімен RandSeek айымалысына сандардың басқа тізбегін шығаратын жүйелік уақыттың сандық мәні орналасады.

Күн және уақыт типі


Күн, уақыт типі TdataTime стандартты идентификаторымен анықталады, ол уақытты және күнді бір мезгілде сақтауға арналған. Жадыдағы ішкі орналасуы бойынша 8 байт орын алады, Currency типіне ұқсас, шектеулі бөлшек бөлігі бар нақты сан: санның бүтін бөлігінде күн, бөлшек бөлігінде уақыт сақталады.

Күнмен және уақытпен жұмыс істеу төмендегідей қосалқы программалар пайдаланылады:



  1. Function Date:TDateTime; –ағымдағы күнді береді;

  2. Function DateToStr (D:TDateTime):String;-күнді символдар жолына түрлендіреді;

  3. Function DateTimeToStr (D:TDateTime)- күн мен уақытты символдар жолына түрлендіреді;

  4. Function FormatDateTime(Format:String; Value:TDateTime):String;П – күн мен уақыт Format параметрінің спецификаторына сәйкес Value параметрін символдар жолына түрлендіреді;

  5. Function Now:TDateTime; – ағымдағы күн мен уақытты береді;

  6. Function Time:TDateTime – ағымдағы уақытты береді;

  7. Function TimeToStr – уақытты жолға айналдырады.

Төмендегі BbRunClick өңдеуші оқу программасының көмегімен енгізу жолына кез келген нақты санды енгізіп, оны TDateTime типінің мәні ретінде көруге болады:

Procedure TfmExample.bbRunClick(Sender:TObject);

Var k:double;

Begin


Try

K:=StrToFloat(edinput.text);

Except

ShowMessage; (“Нақты санның жазылуында қате бар”);



Edinput.SelectAll;

Exit


End;//Нәтижені күн-уақыт ретінде көрсетеміз LBOutput.Caption:=FormatDateTime(‘dd.mm.yyyy.hh:mm:ss,k’);

//енгізу жолын Edinput-қа айналдыру

Edinput.SetFocus;

End;


ТАПСЫРМА:
ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:
ҰСЫНЫЛАТЫН ӘДЕБИЕТТЕР: [1-9]
БЕКІТУ СҰРАҚТАРЫ:


  1. Object Pascal тіліндегі мәліметтер типіне жалпы сипаттама беріңдер.

  2. Қарапайым типке қандай типтер жатады?

  3. Реттелген типке қандай типтер жатады?

  4. ORD(X) жәнеPRED(X) функцияларының қызметі қандай және оларды қандай типтерге қолдануға болады?

  5. SUCC(X) функциясының қызметі қандай?

  6. Бүтін тптердің қандай түрлері бар және олар қалай белгіленеді?

  7. Бүті типтерге қандай стандартты процедуралар мен функциялар қолданылады?

  8. Object Pascal тілінде логикалық тптердің ұандай түрлері қолданылады.

  9. Символдық типтер қалай белгіленеді және олардың мәндері қалай анықталады?

  10. Саналатын типтер қалай белгіленеді олардың ең жоғарғы мәні қаншаға тең?

  11. Аралық тип деп қандай типті айтамыз және олар қалай бейнеленеді?

  12. Аралық типтердің қызметін сүйемелдейтін функцияларды атаңдар және олардың қызметтері қандай?

  13. Реттелген типтерден нақты типтердің айырмашылығы қандай?

  14. Нақты типтермен жұмыс істеуге арналған математикалық функцияларды атаңдар және олардың қызметі қандай?

  15. Күн және уақыт типі қалай анықталады?

  16. Күн және уақытпен жұмыс істеуге арналған қандай қосалқы программалар бар?

  17. Object Pascal тілінде қанша құрылымдық тип бар?



Зертханалық жұмыс №7

Тақырыбы: Құрылымдық типтер
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Кез келген құрылымдық типтер осы элементтер типін құрайтын жиынмен сипатталады. Object Pascal тілінде оларды 4- ке бөлуге болады: массивтер, жиындар және файлдар.

Object Pascal тілінде типтер бірінің ішіне бірі еркін орналаса алады, олардың кез келгенінің ұзындығының қосындысы 2 Гбайттан аспауы тиіс.

Масссивтер

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} матрицасының ең үлкен және ең кіші элементтерінің экранға шығаратын программа құрайық (n6, m8)
ТАПСЫРМАНЫ ОРЫНДАУҒА ӘДІСТЕМЕЛІК НҰСҚАУЛАР:

Алдымен формаға 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-суретте көрсетілген.


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|2 шартын қанағаттанадыратын мүшелерінің қосындысын және санын табатын программа құрыныз.



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

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

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

Зертханалық жұмыс №8

Тақырыбы: Жазулар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Жазулар- бұл өріс деп аталатын шектеулі компоненттер мөлшерінің тұратын мәліметтер құрылымы. Массивтердің айырмашылығы жазудың компоненттері әртүрлі типті болуы мүмкін. Жазудың қандай да бір компонентіне сілтеме жасау үшін өріске атау беріледі.

Жазуларды сипаттаудың форматты төмендегідей:



<тип аты>=record

<өрістер тізімі>

End;


Мұндағы <тип аты>- жазудың атауы;

Record, end; қызметші сөздер (жазу соңы дегенді білдіреді);



<өрістер тізімі>- өрістер тізімі, ол нүктелі үтір арқылы ажыратылып жазылған жазулар бөлімдерінің тізбегі.

Жазудың әрбір бөлімі бір немесе бірнеше өріс атауларынан тұрады, олар бір- бірінен үтір арқылы ажыратылып жахзылады. Индентификатордан кейін қос нүкте қойылып, өрістер типі сипатталады. Мысалы:

Type

BirthDay=record



Day, Month: Byte;

Year:Word;

End;

A, B: BirthDay



Бұл мысалда BirthDay типі, өрістері Day, Month, Year болып келген жазу; А және В айнымалылары BirthDay типті жазудан тұрады.

Массивтердегідей, жазу типті айнымалының мәнін типі дәл сондай бсақа айнымалыға меншіктеугеболады, мысалы:

а:=b


егер құрама атау пайдаланатын болса, жазудың әр компонентіне кіруге мүмкіндік алуға болады. Яғни айнымалының атын көрсетіп, одан кейін нүкте қойылып, өріс аты жазылады:

a.day:=27;

b.year:=1963;

қабаттасқан өрістер үшін нақтыллауды жалғастыра беруге болады:

Type

BirthDay=record



Day, Month: Byte;

Year:Word;

End;

Var


C:record

Name:string;

Bd: BirthDay;

End;


Begin

If c.Bd.Year=1963 then…



End;

Жазудың өрісіне кіруді жеңілдету үшін Width жалғастыру операторы пайдаланылады.

Width<айнымалы> do <оператор>;

Мұндағы Width, do- қызметші сөздер; <айнымалы>-жазу тпті айнымалы, мұнда бірінің ішіне бірі орнласқан өрістер тізімі жазылады; <оператор>- Object Pascal тілінің кез келген операторы.

c.Bd.Month:=9;

Бұл төмендегі жазумен бара-бар:

Width c.Bd.do Month:=9;

Width c do Width Bd.do Month:=9; немесе

Width c.Bd.do Month:=9;

Object Pascal тілінде бірнеше вариатты өрісі бар жазуларды пайдалануға болады, мысалы:

Type

Forma\record



Name:String;

Case byte of

0:(BirdthPlace:String[40]);

1:(Country: String[20]);

EntryPort: String[20]);

EntryDate: 1..31;

EntryDate: 1..31)

End;


Бұл мысалда Forma типі бір шектеулі Name өрісімен және «case … of» қызметші сөзі арқылы өзгермелі бөлігі берілетін жазуды анықтайды. Өзгермелі бөлігі бірнеше варианттан тұрады. Әрбір вариант таңдау тұрақтысы бойынша анықталады; таңдай тұрақтысынан кейін қос нүкте қойылып, өрістер тізімі жазылады. Кез келген жазуда өзгермелі бөлігі тек біреу ғана болады.

Өзгермелі бөлігінің бір ерекшелігі барлық берілген варианттар бір-біріне қабаттасып орналасады, яғни олардың әрқайсысынан бөлінген бір жадыда ғана орналасады. Бұл типтерді түрлендірудің қосымша мүмкіндіктерін алады, мысалы:

Var

Mem4:record



0:(By:array[0..3] of byte);

1:(Wo:array[0..1] of word);

2:(lo:longInt);

End;


Бұл мысалда Mem4 жазуныңүш вариантты бар, олардың әрқайсысы жадыдан 4 байттың біреуін ғана алады. Біз программадағы жазудың қай өрісіне оралатынымызға байланысты сол бөлік массив ретінде қарастырылады. 4 байт – by өрісі, Word тәрізді екі бүтін типтен құрылған массив (Wo -өріс); longInt тәрізді бір бүтін типті сан (Lo - өрісі). Бұл мысалда алдымен ең ұзын бүтін мәнді меншіктеп, одан кейін нәтижені байт немесе сөз бойынша талдауға болады:

Var


x:word;

Xb:byte;


Xl:LongInt;

Begin


Width m do

Begin

lo:=Trunc(2*Pi*x);



if wo[1]=0 then

if by[1]=0 then

xb:=x[0]

else


x:=wo[0]

else


x1:=lo

end;


End.


Өзгермелі бөлікті ашатын case…of сөзі сыртқы түрі таңдау операторына ұқсағанымен, бұл жерде тек өзгермелі бөліктің басын көрсететін қызметші сөзді ғана атқарып тұр. Сондықтан өзгермелі бөліктің соңына case…of қызметші сөзінің жұбы ретінде end сөзін жазбауға болады. (Өзгеомелі бөлігі барлық уақыттта жазудың соңында болғандықтан end сөзі жазылады, бұл record сөзінің жұбы)

Хабарланған жазудағы өрістердің атауы бірегей болуы тиіс. Егер жазу жазу өрістерінен тұратын болса, олар бірінің ішіне бірі орналасқан болса, онда олардың атаулары қабаттасудың әртүрлі деңгейлерінде қайталануы мүмкін.


ТАПСЫРМА:

Топтағы 9 оқушының оқу үлгерімін орта баланың кему реті бойынша сұрыптап шығаратын программа құрайық. әрбір жазу оқушының атынан және үш пәннен алған бағасынан тұратын болсын.


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

Алдымен интерфейсті құрамыз. Жазулармен жұмыс істегенде экранға ақпаратты енгізу мен шығаруды StringGrid компоненті арқылы ұйымдастырған ыңғайлы. Ол үшін формаға StringGrid және Button компонентін орналастырамыз. Бағандар мен жолдарға сәйкес жолдарды енгізу үшін StringGrid компонентінің белгіленген аймағы пайдаланылады. Сондықтан объектілер инспекторы терезесіндегі FixedCols және FixadRows қасиеттеріне 1 мәнін тағайындаймыз. Есептің шартына сәйкес баған және жолдар санын көрсететін қасиеттерге: ColCount=6 және RowCount=10 мәндерін тағайындаймыз. StringGrid компонентіндегі жолдарды толық көру үшін вертикаль орағыш жолағын орнатуға болады, ScrollBars қасиетіне ssVertical мәнін тағайындаймыз. StringGrid компонентіне клавиатурадан ақпарат енгізіп, жөндеу мүмкіндігіне алу үшін +Options қасиетіндегі goEditing жолына true мәнін беру қажет. Осы мәндер толық тағайындалып болғаннан кейін программа коды терезесіне FormCreate эәне Button1Click оқиға өндеуші процедураларын құрамыз.

unit Unit1;
interface
uses

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

Dialogs, StdCtrls, Grids;
type

TForm1 = class(TForm)

StringGrid1: TStringGrid;

Button1: TButton;

procedure FormCreate(Sender:TObject);

procedure Button1Click(Sender:TObject);

private

{ Private declarations }



public

{ Public declarations }

end;
var

Form1: TForm1;


implementation
{$R *.dfm}

type


zap=record

fio:string[20];

mat,phiz,chem:integer;

srball:real;

end;

var mzap:array[1..9] of zap;



procedure TForm1.FormCreate(Sender:TObject);

var i:integer;

begin with StringGrid1 do

begin


Cells[0,0]:='i';

Cells[1,0]:='fio';

Cells[2,0]:='matem';

Cells[3,0]:='phyzics';

Cells[4,0]:='Chemstry';

Cells[5,0]:='srball';

for i:=1 to 9 do

Cells[0,i]:=intToStr(i);

Cells[1,1]:='Kanat';Cells[2,1]:='5';Cells[3,1]:='5'; Cells[4,1]:='5';

Cells[1,2]:='Sanat';Cells[2,2]:='4';Cells[3,2]:='4'; Cells[4,2]:='4';

Cells[1,3]:='Janat';Cells[2,3]:='3';Cells[3,3]:='4'; Cells[4,3]:='4';

Cells[1,4]:='Marat';Cells[2,4]:='4';Cells[3,4]:='3'; Cells[4,4]:='3';

Cells[1,5]:='Sara';Cells[2,5]:='5';Cells[3,5]:='5'; Cells[4,5]:='4';

Cells[1,6]:='Clara';Cells[2,6]:='4';Cells[3,6]:='4'; Cells[4,6]:='5';

Cells[1,7]:='Janna';Cells[2,7]:='2';Cells[3,7]:='3'; Cells[4,7]:='3';

Cells[1,8]:='Dana';Cells[2,8]:='5';Cells[3,8]:='4'; Cells[4,8]:='3';

Cells[1,9]:='Erlan';Cells[2,9]:='5';Cells[3,9]:='5'; Cells[4,9]:='3';

for i:=1 to 9 do

with mzap[i] do

begin


fio:=Cells[1,i];

mat:=StrToInt(Cells[2,i]);

phiz:=StrToInt(Cells[3,i]);

chem:=StrToInt(Cells[4,i]);

srball:=( mat+phiz+chem)/3;

Cells[5,i]:=FloatToStrF(srball,ffFixed,5,2);

end;end;end;

procedure Button1Click(Sender:TObject);

var i,j:integer; vper:zap;

begin


for i:=1 to 9 do

with StringGrid1,mzap[i] do

begin

fio:=Cells[1,i];



mat:=StrToInt(Cells[2,i]);

phiz:=StrToInt(Cells[3,i]);

chem:=StrToInt(Cells[4,i]);

srball:=( mat+phiz+chem)/3;

Cells[5,i]:=FloatToStr(srball,ffFixed,5,2);

end;


for i:=2 to 9 do

for j:=9 downto i do

if mzap[j-1].srball

begin


vper:=mzap[j-1];

mzap[j-1]:= mzap[j];

mzap[j]:=vper;

end;


for i:=1 to 9 do

with stringGrid1,mzap[i] do

begin

fio:=Cells[1,i];



mat:=StrToInt(Cells[2,i]);

phiz:=StrToInt(Cells[3,i]);

chem:=StrToInt(Cells[4,i]);

srball:=( mat+phiz+chem)/3;

Cells[5,i]:=FloatToStr(srball,ffFixed,5,2);

end; end;



end.

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



5.2-сурет. Сұрыпталған жазуларды шығару терезесі.
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:

  1. Object Pascal тіліндегі жазулар дегеніміз не және олар қалай сиппаталады.

  2. Width_do операторының қызметі қандай?

  3. Жазықтықта n нүкте берілген. Координаталар басына жақын орналасқан нүктені табыңыз.

  4. Нүкте мен түзуді, екі түзудің және екі жазықтықтың арасындағы қашықтықты табыңыз.

  5. дене бір қалыпты үдемелі қозғалады. Дененің Т уақыттан кейінгі жылдамдығы мен үдеуін табыңыз.

  6. 4A+7B-3A+8A-2K+1P-5R-2B көпмүшелігі берілген. А үшін ұқсас мүшелерді тауып, қосынды коэффицентті есептеңдер.

  7. Группада 30 оқушы бар. Студенттердің берілген аты-жөні және 6 сабақтан тапсырған емтихан бағасы бойынша әрбір оқушының орта балын, аты-жөнін және ең жақсы оқушының орта балын есептеп экранға шығаратын программа құрыңдар.

  8. Ағымдағы күннен Х күн өткеннен кейін болатын күнді есептейтін программа құрыңдар.

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

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

  11. «Студент» деп аталатын жазу типті мәлімет берілген. Төмендегі ақпаратты өндейтін программа құрыңдар.

    1. Қалада және жатаханада қанша студент тұрады;

    2. Бірінші семестрдегі қанша студенттің балы 12-ден жоғары;

    3. Екінші семестрдегі қанша студенттің балы 13-тен төмен;

    4. Оқу жылы бойынша орташа оқу үлгерімін есептеу;

    5. Үлгермейтін студенттердің тізімін шығару;

    6. Тізімді балдың кемуі бойынша реттеу;

  12. Тізімді алфавиттік ретпен реттеу.



Зертханалық жұмыс №9
Тақырыбы: Жиындар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Жиындар- бір-бірімен логикалық байланысқан бір типті объектілер жиыны. Объектілердің арасындағы байланыстардың сипатын программист көрсетеді, оны Object Pascal тілі ешқандай да бақыламайды. Жиынға кіретін элементтер саны 0 мен 256 аралығында өзгеруі мүмкін. Бірде бір элементі болмайтын жиын бос жиын деп аталады. Элементтер санының тұрақты болмайтындығы арқылы жиындарды массивтер ен жазулардан ажыратамыз.

Екі жиын эквивалентті деп есептеледі, сонда тек сонда ғана олардың элементтері тең болса, жиын элементтерінің орналасу ретіне ешқандай мән бермейді.

Енді жиындардың берілуі мен аяқталуына мысалдар келтірейік:

Type

digitChar= set of ‘0’..’9’;

digit=set of 0..9

var

begin

s1,s2,s3:DigitChar;

s4,s5,s6:digit;

begin

s1:=[‘1’,’2’,’3’];

s2:=[‘3’,’2’,’1’];

s3:=[‘2’,’3’];

s4:=[0..3,6];

s5:=[4,5];

s6:=[3..9];



End.

Бұл мысалдағы s1 мен s2 жиындары эквивалентті, ал s3 жиыны s2 жинының ішіне кіреді.

Жин типтерінің жазылу форматы төмендегідей:

<тип аты> = set of <базалық тип>;

Мұндағы <тип аты>- жиын типінің идентификаторы, set, of- қызметші сөздер, <базалық тип>- жиын элементтерінің базалық типі ретінде word, integer, LongInt, Intb типтерінен басқа кез келген реттелген тиа алынады.

Жиын элементтерін беруде жиын конструкторы пайдаланылады: бр-бірінен үтір арқылы ажыратынлған жиын элементтерінің тізімі, тізім квадарт жақшаның ішіне орналасады.

Жиындарға төмендегідей операцияларды қолдануға болады:



  1. жиындардың қиылысуы- (*); екі жиынның қиылысу нәтижесінде алынған жиынға екі жиынның ортақ элементтері де кіреді. Мысалы, s4*s6- ның нәтижесі [3] болады; s4*s5 –тың нәтижес бос жиын болды.

  2. Жиындардың бірігуі (+). Екі жиынның бірігуі бір мезгілде екі жиынға да кіретін ортақ элементтерден тұратын үшінші жиын болып табылады.

  3. Жиындардың айыымы. Екі жиынның айырымы екінші жиын элементтері кірмейтін, бірінші жиын элементтерінен тұратын үшінші жиын болып табылады.


Жиындарға қолданылатын амалдар

Жиындық типтердің берілгендері үшін қалыптастыру, біркітіру, айырымдық және in амалдары анықталған. Сондай-ақ, “<”, “>”, “<=”, “>=”, “=” және “<>” қатынас белгілері пайдаланылады.

“=” қатынас белгісі. Егер А және В жиындары бірдей элементтерден тұратын болса, онда бұл жиындар тең болып есептеледі. Салыстырылатын жиындардағы элементтердің орналасу ретінің теңдік шартына әсері болмайды.
А жиынының мәні В жиынының мәні Өрнек Нәтиже

[1,2,3,4] [1,2,3,4] A=B True

[‘a’,’b’,’c’] [‘c’,’a’] A=B False

[‘a’..’z’] [‘z’..’a’] A=B True


Тең емес қатынас белгісі (<>). А және В жиындарының кем дегенде бір элементі өзгеше болатын болса, онда олар тең емес болып есептеледі.
А жиынының мәні В жиынының мәні Өрнек Нәтиже

[1,2,3] [3,1,2,4] A<>B True

[‘a’..’z’] [‘b’..’z’] A<>B True

[‘c’..’t’] [‘t’..’c’] A<>B False


Үлкен немесе тең қатынас белгісі (>=) Егер В жиынының барлық элементтері А жиынының құрамына кіретін болса, А>=И қатынасының нәтижесі ақиқат болады, ал кері жағдайда жалған болады.
А жиынының мәні В жиынының мәні Өрнек Нәтиже

[1,2,3,4] [3,2,4] A>=B True

[‘a’..’z’] [‘b’..’t’] A>=B True

[‘c’..’x’,’t’] [‘t’,’c’] A>=B True


Кіші немесе тең (<=) қатынас белгісі. Алдыңғы операцияда пайдаланылғандай, егер А жиынының барлық элементтері В жинының құрамына кіретін болса, онда А<=В өрнегінің нәтижесі ақиқат болады, кірі жағдайда жалған болады.
А жиынының мәні В жиынының мәні Өрнек Нәтиже

[1,2,3] [2,,3,4] A<=B True

[‘d’..’h’] [‘b’..’t’] A<=B True

[‘c’,’x’,’t’] [‘t’,’c’] A<=B True


In операциясы. Бұл операция қандай да бір мәннің көрсетілген жиында жататындығын тексеру үшін пайдаланылады. Әдетте шартты операторда пайдаланылады.
А жиынының мәні Өрнек Нәтиже

2 If A in [2,3,4,] then.. True

‘v’ if A in [‘a’..’n’] then False

x1 if A in [x0,x1,x2,x3] True


In операциясы бірқатар басқа да амалдары аламастыра отырып, күрделі шартты тексерулерді тиімді, көрнекі сипаттауға мүмкіндік береді. Мысалы,

If (a=1) or (a=3) or (a=4) or (a=5) then ... өрнегін өте қысқа, әрі көрнекі түрде сипаттауға болады:


If A in [1..6] then

Бұл операцияларға қосымша төмендегідей екі процедураны пайдалануға болады:

INCLUDE- жиынға жаңа элемент қосады. Процедураның шақырылуы төмендегідей:

INCLUDE (S,I)

Мұндағы S-TSETBASE базалық тип элементтерінен тұратын жиын; І- жиынға қосуға қажетті TSETBASE элементінің типі.

EXCLUDE-жиынан элементті шығарады. Процедураның шақырылуы төмендегідей:

EXCLUDE (S,I)

Шақыру параметерлері INCLUDE процедурасыдағыдай.


Тапсырма:
Тапсырманы орындауға әдістемелік нұсқаулар:
Ұсынылатын әдебиеттер: [1-9]
Бекіту сұрақтары:

  1. Жиын дегеніміз не?

  2. Жиынға кіретін элементтер санының өзгеру аралығы қандай?

  3. Жиындарға қандай операциялар қолданылажы және қандай қатынас белгілері пайдаланылады?

  4. Латын әріптерінен тұратын мәтін және тыныс белгілері берілген. Әрбір әріптің кіру мөлшері мен кіру процентін есептейтін программа құрыңыз?

  5. 1..60 аралығындағы сандардан құрылған Х[1..n] және Y[1..m] екі тізбегі берілген. Осы екі тізбектің барлық ортақ элементтерін табыңдар.

  6. 100..150 аралығындағы сандардан құрылған Х[1..n] және Y[1..m] тізбектері берілген. Х тізбегіне кіретін, ал У тізбегіне кірмейтін барлық элементтерін табыңдар.

  7. 1..30 аралағына 40 сан брілген. Осы сандардың ішіндегі Фиббоначчи санының қанша екеніні және бірінші мәнді цифры 1 немесе 2 болатын қанша цифр бар екенін анықтаңдар.

  8. Символдардан құралған S жолындағы кездесетін “*”, “+”, “-” арифметикалық амал белгілерінің мөлшерін анықтаңдар.

  9. 100...250 аралығындағы сандардан құралған Х[1..n], Y[1..m] және Z[1..k] тізбектері берілген. Алғашқы екі тізбекте кездесетін ал, үшінші тізбекте кездеспейтін барлық элементтерді табыңдар.

  10. 100..180 аралығындағы сандардан құралған Х[1..n], Y[1..m] және Z[1..k] тізбектері берілген. Осы тізбектерде тек бір реттен ғана кездесетн барлық элементтерді табыңдар.

  11. Нақты сандардан құырлған А [1..n, 1..n] матрицасының жолдары мен бағандарының нөмірлері сәйкес типі 1..n болатын S1 және S2 бос емес жиынында жататын элементтерінің қосындысын табыңдар.

  12. Цифрлар мен латын әріптерінен құрылған мәтін берілген. Осы мәтіндегі дауысты немесе дауыссыз дыбыстардың қайсысы көп екенін анықтаңдар.

  13. 100..250 аралығынан алынған Х[1..n] тізбегі берілген. Тізбектегі қайталанбай тек бір реттен кездесетін әрбір санды басып шығыңдар.

  14. 1..250 аралығынан алынған n2+m2 түрінде берілген барлық бүтін сандарды өсу ретімен басып шығарыңдар.

  15. [1..200] аралығындағы барлық жай сандарды өсу ретімен басып шығаратын программа құрыңдар.



Зертханалық жұмыс №10

Тақырыбы: Жолдар
Мақсаты Delphi ортасының жұмысына жалпы сипаттама
Қолданылатын материалдар мен құрал- жабдықтар:

Компьютер, Delphi программалау ортасы
Теориялық түсініктеме:

Object Pascal тілінде мәтіндерді өңдеу үшін төмендегідей типтері пайдаланылады:



  • ShortString шағын жол немесе String [N], мұндағы N<=225

  • String ұзын жол;

  • WideString кең жол;

  • Pchar нөлдік терминалдық жол.

Бұл типтердің бәріне ортақ әрбір жол символдардан құралған бір өлшемді массив ретінде сипатталуында, ал жұмыс істейтін программада символдар мөлшері өзгеріп отырады: String[N] үшін жолдың ұзындығы 0- ден N-ге дейін, ал String және Pchar үшін 0-ден 2 Гбайтқа дейін өзгереді.

Ең үлкен ұзындықты шағын хабарлау ShortString стандартты типі арқылы жүзеге асадды. Windows-де нөлдік терминалдық жол жиі пайдаланылады, ол #0 символымен шектелген символдар тізбегін береді. Мұндай жолдардың ең үлкен ұзындығы жадының үлкендігіме шектеледі. OLE технологиясына негізделетін компоненттермен үйлесімділік үшін Delphi 32- де WideString стандарты типімен хабарланатын кең жолдар енгізілген. Олар өздерінің қасиеттері бойынша String жолымен бірдей, бірақ әрбір символды беру үшін 2 байт пайдаланылады.

STS ұзын жолын хабарлағандағы жадының жұмыс механизмі төмендегідей болады: компилятор жады ұяшығының нөмірін орналастыруға жеткілікті болатын айнымалы үшін 4 бай орын бөледі. Бөлінген орынға символдық жол орналасады. Мұны STS айнымылысы жолға сілтеме жасады дейді. Мұндай өңдеушінің бірінші операторы орындалғанда программа «символдар жолы» символдар тізбегінің ұзындығын анықтап, операциялық жүйеден 15+5=20 байт орын бөлуді талап етеді. STS айнымалысына бірінші бөлінген байттың нөмірін орналастырады.

Procedure TfmExample.bbRunClick (Sender:tObject);

Var

STS,STSS: String;



begin

STS:= ‘Символдар жолы’;

STS:=’Бұл’+STS;

STS[7]:+’’; //Жолдағы символдар 1-ден бастап нөмірленеді.

LBOutput.Caption:=STS;// «Бұл символдар жолы» деген жол шығады.

End;


Сондай-ақ, осы бөліктен бастап символдар тізбегін орналастырады да, терминалдық нольмен және 4 байттық есептегішке сілтемемен аяқтайды. Программаны жүргізу кезеңіндегі мұндай орналастыру динамикалық деп аталды, сонымен бірге компилиция кезеңіндегі орналастыру статикалық деп аталады. Жадымен жұмыс істеу кезінде сілтеме есептегіш маңызды роль атқарады:

STSS:=STS;

Оператор орындалғанда STSS айнымалысының мәнін орналастыруға жадыдан орын бөлінбейді, STSS айнымалысы STS айнымалысының мәні меншіктейді, оған байланысты жадының сілтеме есептегіші 1-ге артады. Сөйтіп, екі көрсеткіш те жадының бір бөлігіне сілтеме жасайды, оның сілтеме есептегішінің мәні 2-ге тең болады.

STS:=’бұл’+STS;

операторы орындалғанда сілтеме есептегіші 1-ге кемиді, жадыдан жаңа ұяшық бөлінеді, ұзындығы 20+6=26 байт. Жадының бұл ұяшығының көрсеткіші STS айнымаласына барып орналасады да, жадының өзіне «Бұл символдар жолы» деген символдар тізбегі, сілтеме есептегішінің бірілгінен тұратын терминалдық ноль орналасады. Сөйтіп, STSS және STS айнымалылары жадының әртүрлі бөліктеріне сілтеме жасайды. String жолын орналастыруға бөлінген жадының бөлігі-егер сілтеме есептегіші 0-ге тең болса босатылады.

Char типті айнымалыны хабарлағанда да жадымен орындалатын жұмыс осыған ұқсас жүзеге асырылады.

32 разядты Windows-дің нұсқалары символдардың үш түрін пайдаланады: бір байтты ANSI символы, екі байтты символ және Unicode символы. Unicode симвлы жадыдан 65536 мүмкін болатын мәндерден құралатын бір сөздік орын алады. Екі байттық символдар мен Unicode символдары WideString типті жолдардан құралған-WideChar стандартты типімен хабарланады. OLE технологиясын пайдалантын Windows –дің барлық программалары Unicode символдарына сәйкес кодталуы тиіс.
String және ShortString типтері

Ішкі орналасуындағы айырмашылыққа қарамастан қысқа ShortString және ұзын String жолдарының қасиеттері программист үшін бірдей. Жолдың ағымдағы ұзындығын Lengt функциясының көмегімен алуға болады. Мысалы, келесі оператор барлық соңғы бос орындарды алып тастайды:

While (Length (STS)<>0) and (STS [Length(STS)]=’’) do

SetLength (STS, Length (STS)-1);

Бұл мысалды стандартты SetLength процедурасы жолдың жаңа ұзындығын тағайындайды. Жолдарға жалғастыру операциясын қолдануға болады. Мысалы,

STS:=’a’+’b’; //STS “ab”

STS:=STS+’c’; //STS “abc”

Егер жалғанған жолдың ұзындығы жолдың көрсетілген N ұзындығынан артып кететін болса, онда артық символдар қалады. Мысалы, келесі программа “1” символын береді.


Procedure TfmExample.bbRunClick(Sender:Tobject);

Var


SSS:String [1];

Begin


SSS:=’123’;

LBOutput.Caption:=SSS;

End;

Қатынас операциялары: =,<>, >, <, >=, <=, символдардың ішкі кодталуын ескере отырып, символмен тексерілетін екі жол үшін орындалады. Мысалы, төмендегі қатынастар True мәнін береді:



‘A’>’1’

‘Object’ < ‘Object Pascal’

Жолдар мен символдара қолданылатын қалған операциялар арнайы стандартты процедуралар мен функциялар арқылы жүзеге асырылады.

5.3.2. Нөлдік терминалдық жолдар
Нөлдік терминадық жолдар Windows-дің API (Application program interface) функцияларыншақыруда жиі пайдаланылады. Өйткені Delphi ортасының компоненеттері Windows-дің API функцияларына байланысты барлық мәселелерді шешеді, программистің нөлдік терминалдық жолдарды пайдаланатын кездері сирек болады. Дегенмен мұндай жолдарды өңдеудің ерекшеліктеріне қысқаша тоқталып өтейік.

String базалық типі жадыда термианльдық нөлді сақтайды, сондықтан Object Pascal бір жолдық өрнекте екі типтің аралас пайдалануына мүмкіндік береді. Сондай-ақ String және Pchar түрлендіру автофункцияарының көмегімен типтерді өзара келтіруді жүзеге асырады. Мысалы,

Procedure TfmExample.FormActivate(Sender:TObject);

Var


PCS:Pchar;

SSS:=’123456’;

Begin

PCS:=’X=’;



SSS:=’X=’;

LBOutput.Caption:=SSS+PCS;

End;

Бұдан LBOutput жолына Х= 12346 жазылуы шығады.



Енді тағы бір мысал қарастырайық. АРІ функциясының құрамына экранда тақырыбы, мәтіндік хабарламасы мен батырмалар жиынтығы бар диалог терезесін құруға мүмкіндік беретін MessageBox функциясы кіреді.

Алдыңғы мысалдың соңына

MessageBox (0,SSS+PCS,’терезе тақырыбы’,mb_ok);

операторын қоссақ, компилятор қате деп көрсетеді, яғни функцияны шақыратын екінші параметр Pchar типті өрнек болуы тиіс. Сонымен бірге, SSS+PCS өрнегі тәрізді компилятор оны жалпы String типіне келтіреді. Оператордың дұрыс жазылуы төмендегідей:

MessageBox (0,Pchar (SSS+PCS),’терезе тақырыбы’,mb_ok);

Мәтіндік тұрақтылар кез келген жолдық типпен үйлеседі, сондықтан үшінші шақыру парметрін компилятор қатесіз өңдейді.

Delphi ортасында Pchar және String төемнгі шекарасы нөлден басталатын символдар массиві болып есептеледі. Pchar және String типтерінен айырмашылығы мұндай массив компиляция кезеңінде статикалық толтыру арнайы StrCopy процедурасының көмегімен жүзеге асырылады:
Procedure TfmExample.bbRunClick(Sender:Tobject);

Var


АСS:array [0..6] of char;

Begin


StrCopy (ACS, ‘123456’);

SSS:=’123’;

LBOutput.Caption:=ACS;

End;


Pchar типімен жұмыс істеу үшін String типіндегідей операциялар: «+» жалғастыру және салыстыру =,<>, >, <, >=, <=, операциялары пайдаланылады. Сондай-ақ, нөлдік терминалдық жолдаомен жұмыс істеуге арналған қосалқы программалар бар.

ТАПСЫРМА:

Жолдағы символдардың санын есептейтін қосымша құрайық. Жолды енгізіп болғаннан кейін ENTER клавишасын басу қажет. Ал, программа жұмысын аяқтау үшін Close батырмасын басу керек.


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

Алдымен формаға орналастыратын компоненттерге сипаттама берйік. Жолдармен жұмыс істегенде енгізу мен шығаруды ListBox және ComboBox компоненттерінің көмегімен ұйымдастырған ыңғайлы. ListBox компоненті элементтері клавиатураның немесе тышқанның көмегімен таңдалатын тізім болып табылады. Элементтер тізімі Items қасиетімен, Add, Delete және Insert әдістерімен жолдарды қосу, өшіру және қою орындалады. Еркшеленген элементтің нөмірін анықтау үшін ItemIndex қасиеті пайдаланылады.

Ал, ComboBox компоненті ListBox тізімі мен Edit редакторының комбинациясын береді, сондықтан осы компоненттердің барлық қасиеттері біріктірілген деуге болады. Жөндеу терезесімен жұмыс істеу үшін Edit компонентіндегідей Text қасиеті пайдаланылады, ал ListBox компонентінде тізімнен таңдау үшін Items қасиеті пайдаланылады. Style қасиетімен анықталатын компоненттің түрі бар. CsSimple түрінде тізім барлық уақытта ашық болады, ал қалған жағдайларда редактордың оң жағындағы ашу батырмасын басқаннан кейін ашылады. ListBox және ComboBox компоненттері Standard бетінде орналасқан.

Ал, BitBtn компоненті Additional бетінде орналасқан және стандартты Button батырмасының бірнеше түрін беретіні 4-тарауда айтыған болатын. Бұл жағдайда BkClose батырмасы негізгі терезені жауып, программа жұмысын аяқтайды.

Енді оқиғаны өңдеуші процедуралар құруды қарастырайық. Қосымшаны шақырғаннан кейін интерфейс панелі экранда пайда болған кезде ComboBox компонентінің өрісіне курсорды келтіретін форманы екпінді жасағанда пайда болатын OnActivate оқиғасын пайдалануға болады. Бұл оқиға- өңдеушіні құру үшін Объектілер Инспекторы терезесінен Form1 компонентін таңдап, Events бетінен OnActivate оқиғасын тауып, оның оң жақ бөлігін тышқанмен жылдам екі рет белгілейміз. Курсор оқиға өңдеуші

Procedure FormActivate (Sender:TObject);

процедурасының мәтінінде орналасады. Процедура денесіне ComboBox компонентіндегі таңдалатын тізімге енгізілу үшін орындалатын оқиға өңдеуші процедураны қарастырайық. Ол үшін Объектілер Инспекторы терезесінен ComboBox компонетін таңдап, Events бетінен OnKeyPress оқиғасын тауып, оның оң жақ бөлігін тышқанмен жылдам екі рет белгілейміз. Нәтижесінде курсор оқиға өңдеуші.

Procedure ComboBox1 KeyPress (Sender:TObject; var Key:Char);

процедурасының мәтінінде тұрады. Дәл осылайша, тышқанның батырмасын басқанда тізімен таңдаулы жүзеге асыратын ComboBox1компоненті үшін OnClick оқиға өңдеуші

Procedure ComboBox1 Click (Sender:TObject);

процедураны алу орындалады.

Таңдалған жолдағы символдар санын есептейтін негізгі алгоритмді жүзеге асыратын программа мәтіні төмендегідей:


unit HMUnit1;

interface

uses

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

Dialogs, StdCtrls, Buttons;

Type

TForm1 = class(TForm)

ComboBox1: TComboBox;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

BitBtn1: TBitBtn;

procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);

procedure ComboBox1Click(Sender: TObject);

procedure FormActivate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormActivate(Sender: TObject);

begin

ComboBox1.SetFocus;

end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);

begin

if key=#13 then

begin

ComboBox1.Items.Add(ComboBox1.Text);

ComboBox1.Text:='';

end;

end;

procedure TForm1.ComboBox1Click(Sender: TObject);

var st:string; nst,n,i,ind:integer;

begin

n:=0;

ind:=0;

nst:=ComboBox1.ItemIndex;

st:=ComboBox1.Items[nst];

for i:=1 to Length(st) do

case ind of

0:if st[i]<>''then

begin

{ind:=1;}

n:=n+1;

end else n:=n-1;

1:if st[i]=''then ind:=0;

end;

Label3.Caption:=IntToStr(n);

end;

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

жүктеу 10,41 Mb.

Достарыңызбен бөлісу:
1   ...   10   11   12   13   14   15   16   17   ...   29




©g.engime.org 2024
әкімшілігінің қараңыз

    Басты бет
рсетілетін қызмет
халықаралық қаржы
Астана халықаралық
қызмет регламенті
бекіту туралы
туралы ережені
орталығы туралы
субсидиялау мемлекеттік
кеңес туралы
ніндегі кеңес
орталығын басқару
қаржы орталығын
қаржы орталығы
құрамын бекіту
неркәсіптік кешен
міндетті құпия
болуына ерікті
тексерілу мемлекеттік
медициналық тексерілу
құпия медициналық
ерікті анонимді
Бастауыш тәлім
қатысуға жолдамалар
қызметшілері арасындағы
академиялық демалыс
алушыларға академиялық
білім алушыларға
ұйымдарында білім
туралы хабарландыру
конкурс туралы
мемлекеттік қызметшілері
мемлекеттік әкімшілік
органдардың мемлекеттік
мемлекеттік органдардың
барлық мемлекеттік
арналған барлық
орналасуға арналған
лауазымына орналасуға
әкімшілік лауазымына
инфекцияның болуына
жәрдемдесудің белсенді
шараларына қатысуға
саласындағы дайындаушы
ленген қосылған
шегінде бюджетке
салығы шегінде
есептелген қосылған
ұйымдарға есептелген
дайындаушы ұйымдарға
кешен саласындағы
сомасын субсидиялау