Òåìà 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.
Ìû óæå çíàåì óñëîâíûé öèêë 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 óæå ïðåäîñòàâëÿåò íàì òàêóþ ôîðìó. Íóæíî áóäåò ëèøü
èçìåíèòü òåêñò, è ïðè íåîáõîäèìîñòè, êàðòèíêó.
 ïðåäûäóùåì ïðîåêòå, ãäå ìû âûâîäèëè
ñëó÷àéíûå ÷èñëà, ñîçäàéòå ãëàâíîå ìåíþ.  ýòîì ìåíþ ñîçäàéòå ïóíêòû "Ôàéë
– Âûõîä" è "Ñïðàâêà – Î ïðîãðàììå".
Âûáåðèòå êîìàíäó "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 ãëàâíîé ôîðìû. Äàëåå â ìåíþ ãëàâíîé ôîðìû ùåëêíèòå äâàæäû ïî ïîäðàçäåëó
"Î ïðîãðàììå" è ñîçäàéòå òàì îáðàáîò÷èê âûçîâà íîâîé ôîðìû.