Òåìà 9. Ìàññèâû è êîíñòàíòû

Çäåñü âû ïîçíàêîìèòåñü ñ ìàññèâàìè è êîíñòàíòàìè, à òàêæå íàó÷èòåñü ïîëüçîâàòüñÿ ðåïîçèòîðèåì Delphi, â êîòîðîì õðàíÿòñÿ øàáëîíû è ìàñòåðà äëÿ ìíîãèõ ôîðì ðàçëè÷íîãî âèäà è íàçíà÷åíèÿ. Ïðèìåíåíèå íîâîãî ìàòåðèàëà íà ïðàêòèêå.

Ìàññèâû

Íåìíîãî ñëîæíàÿ, íî, áåçóñëîâíî, íåîáõîäèìåéøàÿ òåìà â ïðîãðàììèðîâàíèè. Ìàññèâ – ýòî ôîðìàëüíîå îáúåäèíåíèå íåñêîëüêèõ îäíîòèïíûõ ïåðåìåííûõ â îäíó. Òî åñòü, ìàññèâ ðàññìàòðèâàåòñÿ êàê îäíà ïåðåìåííàÿ, îí èìååò îäíî èìÿ, íî íà ñàìîì äåëå òàì èìååòñÿ íåñêîëüêî ïåðåìåííûõ îäíîãî òèïà. Ìàññèâû, êàê è ïåðåìåííûå, îáúÿâëÿþòñÿ â ðàçäåëå ïåðåìåííûõ var, è èìåþò òàêîé ñèíòàêñèñ:

Èìÿ_ïåðåìåííîé : array [äèàïàçîí çíà÷åíèé] of Òèï_ïåðåìåííûõ_â_ìàññèâå;

Ïðèìåð:

var

   a : Integer;  //ïåðåìåííàÿ öåëîãî òèïà

   b : array [1..10] of Integer;  //ìàññèâ öåëîãî òèïà

begin

Îáðàòèòå âíèìàíèå, ÷òî äèàïàçîí çíà÷åíèé â ìàññèâå óêàçûâàåòñÿ ïðîèçâîëüíî, ìåæäó ïåðâîé è ïîñëåäíåé öèôðîé íåò ïðîáåëîâ, íî îáÿçàòåëüíû äâå òî÷êè. Ïðèìåð äèàïàçîíà ìîæåò áûòü è òàêèì: [5..7], êàêèå öèôðû íàçíà÷àòü – ðåøàòü Âàì. Îáû÷íî â ïðàêòèêå ïðèõîäèòñÿ íà÷èíàòü äèàïàçîí ñ 1 èëè ñ 0, â çàâèñèìîñòè îò ñèòóàöèè.

Îáðàùåíèå ê îòäåëüíîìó ðàçäåëó ìàññèâà òàêîå:

a := 5;

b[1] := a;

b[2] := b[1]+2;

Òî åñòü, ñðàçó ïîñëå èìåíè ìàññèâà ñòàâÿòñÿ êâàäðàòíûå ñêîáêè, âíóòðè êîòîðûõ óêàçûâàþò èíäåêñ – íîìåð ýëåìåíòà â ìàññèâå. Ïîäîáíûé ìàññèâ ìîæíî âîñïðèíèìàòü êàê òàáëèöó ñ îäíîé ñòðîêîé è íåñêîëüêèìè ÿ÷åéêàìè:

Ïðåäñòàâëåíèå ìàññèâà â âèäå òàáëèöû



Ðèñ. 9.1.  Ïðåäñòàâëåíèå ìàññèâà â âèäå òàáëèöû

Ïîñêîëüêó â ïðèâåäåííîì ïðèìåðå îáúÿâëåí ìàññèâ öåëûõ ÷èñåë òèïà Integer, êàæäîé ÿ÷åéêå (ýëåìåíòó) ìàññèâà áóäåò âûäåëåíî ïî 4 áàéòà ïàìÿòè, êàæäûé òàêîé ýëåìåíò ñîîòâåòñòâóåò îáû÷íîé ïåðåìåííîé òàêîãî æå òèïà. Ïîäîáíûå ìàññèâû íàçûâàþòñÿ îäíîìåðíûìè. Ñ ìíîãîìåðíûìè è äèíàìè÷åñêèìè ìàññèâàìè ìû ïîçíàêîìèìñÿ ïîçæå.

Êàê óæå óïîìèíàëîñü, ìàññèâû ìîãóò áûòü ëþáîãî òèïà:

var

   a : array [0..3] of String;

   b : array [1..5] of Real;

   c : array [10..20] of Boolean;

Îáðàáîòêà ìàññèâà

Ìàññèâû óäîáíî èñïîëüçîâàòü òàì, ãäå ïðèõîäèòñÿ îáðàáàòûâàòü áîëüøîå êîëè÷åñòâî îäíîòèïíûõ äàííûõ. Âîçüìåì ãèïîòåòè÷åñêèé ïðèìåð: íóæíî ïåðåâåñòè äàííûå îò 1 äî 100 àìåðèêàíñêèõ ìèëü â ïðèâû÷íûå íàì êèëîìåòðû. Ïîñêîëüêó ìû òî÷íî çíàåì, ÷òî ó íàñ áóäåò 100 ýëåìåíòîâ, ìîæíî âîñïîëüçîâàòüñÿ ìàññèâîì, à äëÿ åãî îáðàáîòêè óäîáíåé âñåãî èñïîëüçîâàòü öèêë for:

var

   i : Byte;  //ñ÷åò÷èê äëÿ for

   a : Array [1..100] of Real;  //ìàññèâ äëÿ ïîëó÷åííûõ äàííûõ

begin

   for i := 1 to 100 do

      a[i] := i * 1,609;

×òî ìû èìååì â äàííîì ïðèìåðå? Ïðè ïåðâîì ïðîõîäå öèêëà for ñ÷åò÷èê i èìååò çíà÷åíèå 1, ñëåäîâàòåëüíî, â ñòðîêå

      a[i] := i * 1,609;

ìû îáðàùàåìñÿ ê ïåðâîìó (a[1]) ýëåìåíòó ìàññèâà, è ïðèñâàèâàåì åìó çíà÷åíèå i, óìíîæåííîå íà 1,609 êèëîìåòðîâ. Ñëåäîâàòåëüíî, â ýëåìåíò ìàññèâà a[1], êîòîðûé ñîîòâåòñòâóåò îäíîé ìèëå, ïîïàäàåò çíà÷åíèå 1,609 êèëîìåòðîâ. Ïðè âòîðîì ïðîõîäå öèêëà i óæå ðàâåí 2, çíà÷èò, â ýëåìåíò a[2] óéäåò çíà÷åíèå 2 * 1,609, òî åñòü 3,218. È òàê äàëåå, äî êîíöà ìàññèâà.  äàëüíåéøåì, îáðàòèâøèñü ê íóæíîìó ýëåìåíòó ìàññèâà, ìû ñìîæåì óçíàòü, ñêîëüêèì êèëîìåòðàì áóäåò ðàâíî äàííîå êîëè÷åñòâî ìèëü:

ShowMessage('23 ìèëè = ' + FloatToStr(a[23]) + ' êèëîìåòðà');

Èç ïðèâåäåííîãî âûøå ïðèìåðà âû ìîæåòå ïî÷åðïíóòü ïîëåçíûé ïðèåì ïðîãðàììèðîâàíèÿ: â êà÷åñòâå èíäåêñà ìàññèâà ìîæíî óêàçûâàòü íå òîëüêî öåëîå ÷èñëî, íî è ñ÷åò÷èê öèêëà, èëè çíà÷åíèå ëþáîé ïåðåìåííîé öåëîãî òèïà. Îäíàêî ïðè ïðîãðàììèðîâàíèè öèêëà ñëåäóåò ñîáëþäàòü îñòîðîæíîñòü: åñëè óêàçàòü èíäåêñ, êîòîðûé íå âõîäèò â äèàïàçîí çíà÷åíèé ìàññèâà, ïðîèçîéäåò îøèáêà. Òàê, åñëè áû ìû ïîïûòàëèñü âûïîëíèòü êîä

   for i := 0 to 100 do

      a[i] := i * 1,609;

òî ïîëó÷èëè áû îøèáêó, òàê êàê óæå ïðè ïåðâîì ïðîõîäå ìû îáðàòèëèñü áû ê ýëåìåíòó a[0], êîòîðîãî íå ñóùåñòâóåò.

Êîíñòàíòû

Êîíñòàíòû – ýòî òàêèå æå, êàê ïåðåìåííûå, ÿ÷åéêè îïåðàòèâíîé ïàìÿòè, çíà÷åíèå êîòîðûõ íåëüçÿ èçìåíèòü. Òî åñòü, âû îäíàæäû óêàçàëè çíà÷åíèå êîíñòàíòû, è â äàëüíåéøåì îáðàùàåòåñü ê íåé, êàê ê îáû÷íîé ïåðåìåííîé, íî ïðèñâîèòü åé äðóãîå çíà÷åíèå óæå íå ñìîæåòå. Êîíñòàíòû óäîáíî èñïîëüçîâàòü, êîãäà âû áóäåòå íåîäíîêðàòíî îáðàùàòüñÿ ê îäíîìó è òîìó æå çíà÷åíèþ. Òèï êîíñòàíòû óêàçûâàòü íå íóæíî, êîìïèëÿòîð ñàì ïîäáèðàåò äëÿ íåå ïîäõîäÿùèé òèï. Êîíñòàíòû îïèñûâàþòñÿ â ðàçäåëå const, êîòîðûé âñåãäà äîëæåí îïèñûâàòüñÿ ïåðåä ðàçäåëîì var:

procedure MyProc;

const

   pi = 3.14;

   MessageError = 'Òåêñò ñîîáùåíèÿ îá îøèáêå';

var

   a : Integer;

   b : String;

begin

   ...

end;

Êîíñòàíòû, îñîáåííî ãëîáàëüíûå, óäîáíî èñïîëüçîâàòü òàì, ãäå âû ðàáîòàåòå ñ êàêèì-òî îïðåäåëåííûì çíà÷åíèåì. Åñëè â äàëüíåéøåì ýòî çíà÷åíèå ïîìåíÿåòñÿ, íåò íåîáõîäèìîñòè ñêðóïóëåçíî ìåíÿòü êîä âî âñåé ïðîãðàììå, äîñòàòî÷íî èçìåíèòü çíà÷åíèå êîíñòàíòû. Ê ïðèìåðó, âû ïðîèçâîäèòå ðàñ÷åò îêëàäà, îñíîâûâàÿñü íà ñóììå, ñîîòâåòñòâóþùåé ìèíèìàëüíîé çàðàáîòíîé ïëàòå.  òàêîì ñëó÷àå íå ãðåõ îáúÿâèòü êîíñòàíòó MinZarPlat è ïðèñâîèòü åé òåêóùåå çíà÷åíèå ìèíèìàëüíîé çàðïëàòû.

 ïðîöåññå ðàñ÷åòà âàì ïðèõîäèòñÿ óìíîæàòü ýòî çíà÷åíèå íà êîëè÷åñòâî ìèíèìàëüíûõ çàðïëàò. Äîïóñòèì, íåêòî Ñèäîðîâ èìååò îêëàä, ðàâíûé 5-òè ìèíèìàëüíûì çàðïëàòàì.  ìîìåíò ðàñ÷åòà âû óìíîæàåòå 5 íå íà ñóììó ìèíèìàëüíîé çàðïëàòû, à íà êîíñòàíòó MinZarPlat, êîòîðàÿ è ñîäåðæèò íóæíîå çíà÷åíèå. À åñëè ÷åðåç ìåñÿö èëè ãîä ñóììà ìèíèìàëüíîé çàðïëàòû èçìåíèòñÿ, òî âàì îñòàíåòñÿ òîëüêî çàìåíèòü çíà÷åíèå âàøåé êîíñòàíòû íà íîâîå, íå ìåíÿÿ ïðè ýòîì îñòàëüíîãî êîäà. Óäîáíî, íå ïðàâäà ëè?

Ïðîéäåííûé ìàòåðèàë íà ïðàêòèêå

Ñîçäàäèì íåìíîãî ãëóïûé, íî èñïîëüçóþùèé âñå íîâûå âîçìîæíîñòè ïðîåêò. Ñîçäàéòå íîâûé ïðîåêò, ïåðåèìåíóéòå ôîðìó â fMain, à â ñâîéñòâå Caption óêàæèòå "Ñëó÷àéíûå ÷èñëà". Ñîõðàíèòå ïðîåêò â íîâóþ ïàïêó. Ïðîåêò íàçîâèòå RandomNum.

Óñòàíîâèòå íà ôîðìó Memo, óäàëèòå èç íåãî âåñü òåêñò. Íèæå – êíîïêó ñ íàçâàíèåì "Ãåíåðèðîâàòü".

Îêîí÷àòåëüíûé âèä ôîðìû



Ðèñ. 9.2.  Îêîí÷àòåëüíûé âèä ôîðìû

 îáðàáîò÷èêå íàæàòèé íà êíîïêó âïèøåì òàêîé òåêñò:

procedure TfMain.Button1Click(Sender: TObject);

const

    MaxValue = 1000;  //çàïèñûâàåì ìàêñèìàëüíûé ðàçìåð ñëó÷àéíûõ ÷èñåë

var

    a : array [1..100] of Integer; //ìàññèâ öåëûõ ÷èñåë èç 100 ýëåìåíòîâ

    i : integer;  //ñ÷åò÷èê äëÿ for

    s : String; 

begin

    //âíà÷àëå î÷èñòèì Memo:

    Memo1.Clear;

    //Çàïîëíÿåì ñëó÷àéíûìè ÷èñëàìè îò 0 äî MaxValue ìàññèâ a:

    for i := 1 to 100 do

       a[i] := Random(MaxValue);

    //äàííûå èç ìàññèâà äîáàâëÿåì ñíà÷àëà â ñòðîêîâóþ ïåðåìåííóþ, çàòåì â Memo:

    s := '';

    for i := 1 to 100 do

       s := s + IntToStr(a[i]) + ',   ';

    Memo1.Lines.Add(s);

 

end;

 ðåçóëüòàòå âûïîëíåíèÿ ýòîãî êîäà ìû ïîëó÷èì ñòðîêó s, â êîòîðîé ÷åðåç çàïÿòóþ áóäóò ïåðå÷èñëåíû 100 ñëó÷àéíûõ ÷èñåë îò 0 äî 1000.

Îïåðàòîð öèêëà repeat...until

Ìû óæå çíàåì óñëîâíûé öèêë while, èçó÷èì åùå îäèí. Ñèíòàêñèñ öèêëà íåñëîæíûé:

repeat <òåëî öèêëà> until <óñëîâèå>;

Åñëè öèêë while èìåë ïðåäóñëîâèå, òî öèêë repeat èìååò ïîñòóñëîâèå, êîòîðîå âûïîëíÿåòñÿ ïîñëå òåëà öèêëà. Åñòü åùå îòëè÷èå – öèêë while âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà óñëîâèå èñòèííî, à öèêë repeat áóäåò âûïîëíÿòüñÿ, ïîêà óñëîâèå ëîæíî.  öèêëå while, åñëè óñëîâèå èçíà÷àëüíî ëîæíî, òåëî öèêëà íèêîãäà íå áóäåò âûïîëíÿòüñÿ. Repeat âûïîëíèò òåëî öèêëà ïî êðàéíåé ìåðå, îäèí ðàç. Çàòåì îïåðàòîð ïðîâåðÿåò óñëîâèå, è åñëè îíî ëîæíî, âûïîëíÿåò òåëî öèêëà åùå ðàç, è òàê äî òåõ ïîð, ïîêà <óñëîâèå> íå âåðíåò èñòèíó. Åùå îäíî çàìå÷àíèå: çàðåçåðâèðîâàííûå ñëîâà repeat..until ðàáîòàþò êàê ñêîáêè begin...end, ïîýòîìó â òåëå öèêëà ìîæåò áûòü ñêîëüêî óãîäíî èíñòðóêöèé, êîòîðûå óæå íå íóæíî çàêëþ÷àòü â begin..end. Ïðèìåð:

i := 3;

repeat

   i := i + 1;

   ShowMessage('i = ' + IntToStr(i));

until i > 10;

Ôîðìà About ñðåäñòâàìè Delphi

Ôîðìó About âîâñå íå îáÿçàòåëüíî ðàçðàáàòûâàòü ñàìîñòîÿòåëüíî, Delphi óæå ïðåäîñòàâëÿåò íàì òàêóþ ôîðìó. Íóæíî áóäåò ëèøü èçìåíèòü òåêñò, è ïðè íåîáõîäèìîñòè, êàðòèíêó.

 ïðåäûäóùåì ïðîåêòå, ãäå ìû âûâîäèëè ñëó÷àéíûå ÷èñëà, ñîçäàéòå ãëàâíîå ìåíþ.  ýòîì ìåíþ ñîçäàéòå ïóíêòû "Ôàéë – Âûõîä" è "Ñïðàâêà – Î ïðîãðàììå".

Âûáåðèòå êîìàíäó "File – New – Other". Îòêðîåòñÿ îêíî ðåïîçèòàðèÿ, ñâîåîáðàçíîé êîëëåêöèè øàáëîíîâ è ìàñòåðîâ äëÿ ñîçäàíèÿ íóæíîãî îêíà. Ýòî îêíî èìååò ìíîæåñòâî âêëàäîê, â êîòîðûõ îêíà è øàáëîíû ðàçáèòû ïî òåìàòèêàì. Ïåðåéäåì íà âêëàäêó Forms è âûáåðåì øàáëîí "About box". Ñðàçó æå ïåðåèìåíóåì ôîðìó â fName, à ñâîéñòâó Caption íîâîé ôîðìû ïðèñâîèì òåêñò "Î ïðîãðàììå". Ôîðìà èìååò âïîëíå çàêîí÷åííûé äèçàéí, îñòàëîñü òîëüêî âïèñàòü íóæíûé òåêñò â êîìïîíåíòû Label è ïðè íåîáõîäèìîñòè, ñìåíèòü êàðòèíêó.

 ïåðâîé label íàïèøåì: "Product Name: RandomNums". Âî âòîðîé: "Version: 1.0". Èìåéòå â âèäó, ÷òî â ìèðîâîì ñîîáùåñòâå ïðèíÿòî äàâàòü íîìåðà âåðñèé ïðîãðàìì îò 1.0 è âûøå. Åñëè â ñëåäóþùåé âåðñèè ïðîèçîøëè íåçíà÷èòåëüíûå èçìåíåíèÿ, íàçîâèòå âåðñèþ 1.1, ïîòîì 1.2 è òàê äàëåå. Èíîãäà äàæå óêàçûâàþò òðè öèôðû: 1.0.1, 1.0.2 è âûøå, ðåøàòü âàì. Åñëè èçìåíåíèÿ çíà÷èòåëüíûå, ïðàêòè÷åñêè ó âàñ ïîëó÷èëàñü äðóãàÿ ïðîãðàììà, òîãäà íàçûâàéòå âåðñèþ 2.0.

 òðåòüåé Label íàïèøèòå "Copyright: ñâîå ÔÈÎ". Ýòîò ðàçäåë óêàçûâàåò, êòî èìååò àâòîðñêîå ïðàâî íà ïðîäóêò.  ÷åòâåðòîé Label íàõîäèòñÿ ðàçäåë Comments. Çäåñü íóæíî î÷åíü êîðîòêî è ïî ñóùåñòâó íàïèñàòü, ÷òî äåëàåò âàøà ïðîãðàììà, äëÿ ÷åãî îíà ïðåäíàçíà÷åíà. Âû ìîæåòå ïåðåâåñòè âñå íà ðóññêèé ÿçûê. Âìåñòî "Product Name" íàïèøèòå "Ïðîãðàììà". "Version" çàìåíèòå íà "Âåðñèÿ". "Comments" çàìåíèòå íà "Êîììåíòàðèè". À âîò ñëîâî "Copyright" ïåðåâîäèòü íå íóæíî, èìåííî òàêèì îáðàçîì ïðèíÿòî óêàçûâàòü àâòîðñêîå ïðàâî â ìèðîâîì ñîîáùåñòâå.

Åñëè âû ñäåëàëè ôîðìó äî êîíöà, ñîõðàíèòå åå è ïðîïèøèòå â ðàçäåë uses ãëàâíîé ôîðìû. Äàëåå â ìåíþ ãëàâíîé ôîðìû ùåëêíèòå äâàæäû ïî ïîäðàçäåëó "Î ïðîãðàììå" è ñîçäàéòå òàì îáðàáîò÷èê âûçîâà íîâîé ôîðìû.