Берілгендердің құрылымды түрлері


Object Pascal тіліндегі түрлердің маңызы өте зор. Түрлер арқылы тілдің негізгі құралы – кластары анықталады.

Көптеген компоненттер жиынынан немесе бiртектi реттелiнген объектiлердiң мәнiнен тұратын күрделi түрлердi құрылымды деп атайды.

Бiрнеше компоненттерден құрылған айнымалы шамаларды құрылымды айнымалы шамалар дейдi. Құрылымдық айнымалы шамалардың түрлерiн анықтау үшiн бөлек элементтердi құрылымға бiрiктiру тәсiлiн және құрылымға кiретiн элементтердiң түрлерiн бiлу қажет.

Құрылымды түрлерге массивтер, жазбалар, жиындар, жолдар, файлдар және варианттар жатады.

4.1 Массивтер

Бiр түрдегi айнымалылар тiзбегiн массив деп атайды.

Массивтiң синтаксисi келесi:

Type <түрдiң атауы> = array [<индекс түрлерiнiң тiзiмi> ] of <кез келген реттiк түр>, немесе айнымалылар бөлiмiнде бiрден

Var <айнымалының атауы>: array [<индекс түрлерiнiң тiзiмi>] of <кез келген реттiк түр> - айнымалыны массив деп анықтауға болады.

Мұнда, <түрдiң атауы> және <айнымалының атауы> - түрдiң немесе айнымалының идентификаторы, Array, of - арнайы сөздер, <индекс түрлерiнiң тiзiмi> - квадратты жақшаға алынған және үтiрмен ажыратылған бiр немесе бiрнеше индекстiк түрлердiң тiзiмi. Индекстер ретiнде Object Pascal-да қолданылатын ұзындығы 2 Гбайттан аспайтын кез келген реттiк түрлердi пайдалануға болады.

Массивтiң жеке элементiне қол жеткiзу үшiн осы массивтiң аты және элемент орнының нөмiрi (немесе индексi) көрсетiлу керек.

Мысалы:

Type

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

            // 10 элементтен құралған символдық массив

Matrix= array[byte] of Single;  

         // ұзындығы 255 бүтін сандардан құралған массив

  Var b : Matrix;

// b  Matrix түріне жатады, сондықтан бүтін сандар массиві

                                C: digit;               //  10 элементті символдық массив

        I: integer;

       a: array[1..10] of real;

                 // 10 элементтен құралған нақты сандар массиві

Begin ….. i:=10;

      C[17]:= ord (b[i-1])/10;

   A[i]:=c[10];

……….

End.

Мысалдағы А – айнымалы он нақты сандардан кұралған массивiн анықтайды. Массивтiң әрбiр элементi оның атауы және квадрат жақшаларына алынған құрылымдағы индексi арқылы анықталады.

Мысалы : А массив 10 айнымалылардан құрылған: a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]. Осы айнымалылардың кез келгенiн программада жай қарапайым айнымалы ретiнде пайдалануға болады, ал индексi болып 1-ден 10-ға дейiнгi кез келген бүтiн сан бола алады.

Мысалы, егер j айнымалы бүтiн (integer түрi) болса, онда қайталану операторында оны цикл параметрi ретiнде пайдалануға болады:

for j:=1 to 10 do a[j]:=0; { индексi 1-ден 10-ға дейiнгi айнымалылар 0 мәнiн қабылдайды.}

Массивтер бiр, екi және одан да көп өлшемдi болады. Массивтер өлшемiне шектеу қойылмайды, тек келесi жайт есте болу керек: массивтiң iшкi көрiнiсiнiң ұзындығы 2 Гбайттан аспайды. Массив элементтерi жадта бiрiнен соң бiрi орналасады, сонымен қатар кiшi адресiнен жоғарғыға өткенде алдымен оң жақтағы индексi жылдам өзгередi.

Екi өлшемдi матрицаны бiр өлшемдi массивтерден құралған массив деп санауға болады.

Var b : array[1..12] of array[1..31] of integer;    немесе, басқаша        

                       Var b: array[1..12][1..31] of integer;     және қысқалау түрi

                      Var b : array[1..12,1..31] of integer;

Осындай массивтiң нөмiрлерi екi бүтiн айнымалылармен анықталады. Мысалы, b матрицаның 7-шi қатарымен 4-шi бағанасының қиылысындағы тұрған элемент b[7,4] деп анықталады.

Мысалы, егер программа келесi түрде келтiрiлсе:

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;

Онда жадтың көршi байттар мәндерi келесi: 1,3,2,4.

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

 Var

    A, B : array{1..2,1..2] of Byte;

 Begin

   A[1,1]:=1;

   A[2,1]:=2;

   A[1,2]:=3;

   A[2,2]:=4;     B:=A; end;

Нәтижесiнде В массивiнiң элементтерi 1,3,2,4 деген мәндердi қабылдайды. Бiрақ төмендегi түрде анықталған массивтерге B:=A; операторын қолдану қате деп саналады:

Var A : array{1..2,1..2] of Byte;

      B : array{1..2,1..2] of Byte;

Массивтердi бiрден салыстыру амалдары анықталмаған, сондықтан массивтердiң қатынасын анықтау әрекеттерi әр элементтi бөлек салыстыру арқылы орындалады, мысалы:

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

           Eq : boolean;

           I: Byte;

          Begin

          ……

          eq:=true;

         for i:=1 to 5 do

             if a[i]<> b[i] then

                eq:=false;

          if eq then

           ………..

          end.

4.1.1 Динамикалық массивтер

Delphi 4 ортасынан бастап динамикалық массивтер деген ұғым енгiзiлген. Осындай түрде анықталған массивтердiн индекстер аралығын анықтаудың қажетi жоқ және массив iшкi жад кеңiстiгiнде орналасады. Мысалы,

Var

A: array of  Integer;

B: array  of  array of  Char;

C: array  of  array  of  array of  Real;

Жоғарыдағы А массивi бiр өлшемдi, В - екi өлшемдi және С - үш өлшемдi деп анықталған. Осындай түрдегi массивтерге жадты бөлу және индекстерiнiң аралығын көрсету программа орындалу барысындағы массивтi орнату әрекеттерi SetLength функциясы арқылы анықталады. Мысалы, SetLength (A,3) операторы орындалғанда А динамикалық массивке жад бөлiнедi, яғни үш бүтiн санға жеткiлiктi орын бөлiнедi.

Динамикалық массивтердiң кез келген өлшемiнiң төменгi шегi нөлге тең деп саналады, сондықтан А массив индекстерiнiң жоғарғы шегi 2 болады.

Динамикалық массивтiң идентификаторы негiзiнде массивтiң элементтерiне бөлiнген аумақтың бiрiншi байтының адресi - сiлтеме болып табылады. Сондықтан массивке бөлiнген жадты босату үшiн массив идентификаторына NIL мәнiн меншiк-тесе жеткiлiктi (немесе Finalize процедурасын қолдануға болады).

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

Жалпы динамикалық массивтiң мөлшерiн өзгертуге кететiн уақытты үнемдеу үшiн динамикалық массивке бiрден максималды ұзындығын анықтаған жөн.

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

Мысалы,

Var

  A: array of array of integer;

           // екі өлшемді динамикалық массив

 Begin

SetLength (A, 3);

     // бірінші өлшемінің ұзындығын анықтаймыз,    яғни бағаналар  санын

SetLength (A[0], 3);               // әр бағананың ұзындығын анықтаймыз

SetLength (A[1], 3);

SetLength (A[2], 3);

………….

End;

Object Pascal тілінде динамикалық массивтердің екінші және одан арғы өлшемдерінің ұзындығы әртүрлі болуы мүмкін. Жоғарыдағы мысалда 3х3 квадратты матрица анықталған. Төмендегі мысалда үшбөлшемді массив құрылады:

SetLength(A[0], 3);

SetLength (A[1], 4);

SetLength (A[2], 5);

4.2 Жолдық шамалар

Object Pascal тілінде жалпы мәтіндерді өңдеуде жолдардың келесі түрлері қолданылады:

  • Қысқа жол – ShortString немесе String[N], мұнда N<255;
  • Ұзын жол – String;
  • Алшақ жол – WideString;
  • Нөл – терминалдық жол &ndash PChar;

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

Жолдармен танысуды ShortString – жолдық түрдегі шамалармен бастаймыз (стандартты Pascal-дағы String[255] түрі). Бұл түр арқылы әр байты бір символдан тұратын жадтың айнымалы аумағын анықтайды. Object Pascal тілінде символдық түріндегі шамалар Char арқылы анықталады және әр символдың жолдағы өз нөмірі болады. Жадқа осындай жолдық шамаға N+1 байт орын бөлінеді және бірінші байтта (нөмірі 0) жолдың ұзындығы көрсетіледі. Бірінші символдың жолдағы нөмірі 1-ден басталады.

Windows ортасында “#0” таңбасымен шектелген символдар тізбегі нөл – терминалдық жолдар деп аталған шамалар кеңінен қолданылады. Мұндай түрдегі анықталған жолдың ұзындығы жадтың қол жетерлік кеңістігімен байланысты болғандықтан, оның шамасы өте үлкен болуы мүмкін.

Delphi ортасының 32 – разрядтық нұсқаларында жоғарыдағы екі түрдің тиімділігін үйлестіретін жаңа String түрі анықталған. Осындай түрдегі анықталған шамаға жадтағы орын динамикалық тәртіпте, яғни қажеттілікке сай бөлінеді және жолдың ұзындығы жадтың қол жетерлік кеңістігімен байланысты болады.

OLE – үрдістеріне негізделген компоненттермен тіркестіру үшін Delphi – 32-де WideString деген стандартты түр анықталған. Түрдің қасиеттері String ұзын жолдың қасиеттері сияқты, бірақ әр таңбаны өрнектеуде бір емес, екі разряд қолданылады.

Var

S: ShortString;

     // S - қысқа жолдық түрінде анықталған, ұзындығы 255

  SsMax: String;                // ұзын жол

  St1:String[250];             // қысқа жол, ұзындығы 250 таңба

  St2: WideString;            //алшақ жол

   St3:PChar;                  //  нөл - терминалдық жолға сілтеме

  St4: array[0..1000] of Char;    //  ұзындығы 1000- ға дейінгі

                           // нөл - терминалдық жол.

Сонымен қатар жолдық шамаларға 19-шы кестеде көрсетілген стандартты процедура және функциялар қолданылады.

19-кесте. Жолдық түрге қолданылатын функциялар мен процедуралар

Функция, процедура Атқаратын жұмысы
Function AnsiLowerCase (const S:String): String; S жолының (латын және орыс алфавитінің) барлық бас әріптерін кіші әріптерге айналдырады.
Function AnsiUpperCase (const S:String): String; S жолының (латын және орыс алфавитінің) барлық кіші әріптерін бас әріптерге айналдырады.
Function Concat (sl, [s2, …, sN ]:String ):String; Жолдарды бір бірімен біріктіреді, яғни sl+s2+…+sN оператордың эквиваленті.
Function Copy (s:String; pos, len:integer):String; S жолдың Pos нөмірінен бастап ұзындығы len ішкі жолды қайтарады.
Procedure Delete(s: String;pos, len:integer ); S жолдың Pos нөмірінен бастап ұзындығы len ішкі жолды жояды.
Procedure Insert(sourse: String;  S, pos: integer); S жолдың Pos нөмірінен бастап sourse ішкі жолды қосады.
Function Length (s:String):integer; S жолдың ұзындығын қайтарады.
Procedure OleStrToStrVar(sourse:PwideChar; var dest:String); Алшақ жолды Object Pascal-дің әдеттегі жолдық шамасына көшіреді.
Function Pos(subst, s:String ):integer; S жолдағы алғашқы subst ішкі жолдың бірінші таңбасының орнын қайтарады. Егер анықталған ішкі жол табылмаса, онда нөл қайтарылады.
Procedure SetLength(s:String; newlen:integer); S жолдық шаманың newlen жаңа ұзындығын анықтайды. Егер newlen жолдың анықталған ұзындығынан асып кетсе, онда процедура орындалмайды.
Function StringOfChar(Ch:Char; count: integer): String; Ch таңбасы count рет қайталанған жаңа жолды құрады.
Function StringTo OleStr( const source:String): PwideChar; Object Pascal-дің әдеттегі жолдық шамасын алшақ жолға көшіреді.
Function StringToWideChar(const sourse:String; dest:PwideChar; destSize: integer):PwideChar; Object Pascal-дің әдеттегі жолдық шамасын Unicode форматына  айналдырады. 
Function UpperCaseconst S: String):String; Жолдық шаманың барлық кіші латын әріптерін бас әріпке айналдырады.
Жолдық шаманы басқа түрге айналдыру
Function StrToCurr(S:String):Currency; Жол түріндегі берілген s мәнін Currency түріндегі бүтін санға айналдырады. Жолдың алдында және соңында бос орын болмауы тиіс.
Function StrToDate(S:String):TDateTime; S жолдық шаманы күнделік түріндегі берілгенге айналдырады. S жолында Windows ортасындағы Data түріне  бекітілген форматтағы екі немесе үш сан көрсетіледі. Ол сандар “.”  таңбасы арқылы ажыратылған, егер үшінші сан анықталмаса, онда ағымдағы жыл деп саналады, мысалы DateToStr(StrToDate(’28.06’)) қайтарылады ’28.06.03’.
Function StrToDateTime(S:String):TDateTime; S жолды күнделік және уақыт түрін-дегі берілгендерге айналдырады. Мысалы, StrToDateTime (’28.06.02 18:23’) қайтарады 28.06.02 18:23 .
Function StrToFloat(S:String):Extended; Жол түріндегі берілгенді нақты санға айналдырады. Жолдың алдында және соңында бос орын болмауы тиіс
Function StrToInt(S:String):Integer; Жол түріндегі берілгенді бүтін санға айналдырады. Жолдың алдында және соңында бос орын болмауы тиіс.
Function StrToIntDef(S:String; Default:Integer):Integer; Жол түріндегі берілгенді бүтін санға айналдырады. Егер жолдық шама бү-тін санның дұрыс көрінісі емес болса, онда Default мәні қайтарылады.
Function StrToIntRange(S:String; Min,Max:Longint):LongInt; Жол түріндегі берілгенді бүтін санға аударады. Егер бүтін сан шегінен (Min, Max) шығып кетсе, онда ERangeError мәні қайтарылады.
Function StrToTime(S:String):TDateTime; Жолдық шаманы уақыт түріндегі берілгенге түрлендіреді. Берілген жолда “.” таңбамен ажыратылған екі немесе үш сан көрсетіледі (сағаты, минуты және де секунды болуы мүмкін). Соңғы саннан кейін бір бос орынмен ажыратылған уақыттың 12- сағаттық форматтын көрсететін   “am” немесе “pm” деген анықтамасы  болуы мүмкін.
Procedure Val (s:String; var x; Code:integer); Берілген s жолды х түріндегі сан мәндеріне түрлендіреді. Егер түрлендіру сәтті өтсе, онда Code мәні нөлге тең болады және х-ке түрлендірудің нәтижесі орналастыры-лады. Егер берілген жолда қате болса, онда Code мәнінде S жолындағы қате келтірілген таңбаның нөмірі көрсетіледі және х мәні өзгермейді. Берілген жолда бос орынның болуына тыйым салынбаған.
Басқа түрлерден жолдық шамаға айналдыру
Function DateTimeToStr(Value:TDateTime):String; Күнделік және уақыт түріндегі Value  параметріндегі берілгенді s жолына түрлендіреді.
Procedure DateTimeToString(var s:String; Format:String;Value:TDateTime); Күнделік және уақыт түріндегі Value параметріндегі берілгенді Format-пен анықталған спецификаторларына сәйкес s жолына түрлендіреді.
Function DateToStr(Value:TDateTime) : String; Күнделік түріндегі Value  параметрін-дегі берілгенді s жолына түрлендіреді.
Function FormatDateTime(Format:String; Value:TDateTime) : String; Күнделік түріндегі Value  параметріндегі берілгенді Format-пен анықталған спецификаторларына сәйкес s жолына түрлендіреді.
Function Float ToStr  (Value:Extended) : String; Value нақты шаманы таңбалар жолына түрлендіреді.
Function Float ToStr F (Value:Extended; Format: TfloatFormat: Precision, Digits:Integer ) : String; Value нақты шаманы Fomat   форматына сәйкес Precision және  Digits шамаларын ескере отырып  таңбалар жолына түрлендіреді.
Function  IntToHex(Value:Integer; Digits:Integer) : String; Value нақты шаманың он алтылық  көрінісін жолға түрлендіреді. Мұнда, Digits – жолдағы таңбалардың минималды саны.
Function  IntToStr(Value:Integer): String; Value бүтін шаманы таңбалар жолына түрлендіреді.
Procedure Str(X[:Width [:Decimals]]; var s:String); Х бүтін немесе нақты шаманы таңбалар жолына түрлендіреді. Мұнда, егер Width (жалпы х -  шамаға бөлінген орындар саны)   және Decimals (бөлшек бөліндісіне   бөлінген орындар саны)  параметрлері көрсетілсе, онда олар  түрлендіру форматын анықтайды.
Function  TimeToStr(Value:ToDateTime) : String Value параметрмен көрсетілген уақытты жолға түрлендіреді.

19-ші кестеде келтірілген бірнеше функция және процедураларды түсіндіріп кетейік.

Concat (S1, S2, ..., Sn) функциясы S1-ден Sn-ге дейінгі жолдарды қосып жаңа жол қайтарады. Осы функцияны орындау үшін `+` амалын пайдалануға болады.

Мысалы:

  S1 :=’студент’;   S2:=’- үздік оқиды ’;

  S3 :=Concat(S1,’ Айдаров ’, S2); немесе S3:=S1+’ Айдаров ’+S2; Нәтижесінде S3 жаңа жол түрі: студент Айдаров – үздік оқиды’.

Copy (S, Орны, Ұзындығы) функциясы S - жолдың <Орны > - нөмірінен бастап ұзындығы <Ұзындығы >-на тең жаңа жолды қайтарады.

          Мысалы: S1:=’Астана’;

S2 := Copy (S1,  4,  3);    { Нәтижесінде  S2:=’ ана’ }

Delete(S, Орны, Сан) функциясы <S> - жолдан <Орны> - нөмірінен бастап саны <Сан> - ға тең таңбаларын алып тастайды;

          Мысалы: St :=’Алматы’;   Delete(St ,5, 2); {  St=’Алма’ }

Insert (‘Қосынды’, Негізгі, Орны) процедурасы <Негізгі > жолға <Орны> нөмірінен бастап <Қосынды> деген ішкі жолды қосады.

Мысалы: S1:=’ компьютерім’;

Insert (’Менім’,S1,1); {нәтижесінде S1:=’Менім компьютерім’ }

Length(S) функциясы S жол ұзындығын қайтарады.

Мысалы: St := ’Студент’;

  L := Length ( St ); { L=7 }

Pos (Ішкі жол, Жол) функциясы  <Ішкі жолдың> <Жолдағы> алғашқы таңбасының орынын көрсетеді.

Мысалы: N1:= Pos (‘ мат’, ’Алматы’); { N1 =3 }

Бақылау сұрақтары:

  1. Жолдық шамаларға қандай түрдегі берілгендер жатады? Жолдардың қандай түрлерін ажыратады?
  2. Жолдық шаманың құрамына кіретін кез келген элементіне қалай қол жеткізуге болады? Элементтер нөмірі қай саннан басталады және онда қандай мәлімет сақталынады?
  3. Жолдарға қандай амалдар және негізгі стандартты процедуралар мен функциялрды қолдануға болада?
  4. Жолдық шамаларға қолданылатын негізгі түрлендіру функцияларын келтіріңіз.