Òåìà 6 : Öåëûå è âåùåñòâåííûå òèïû. Ïðîöåäóðû è ôóíêöèè
Çäåñü âû ïîçíàêîìèòåñü ñ öåëûìè è âåùåñòâåííûìè òèïàìè äàííûõ. Íàïèøèòå
ïðîãðàììó ñ èñïîëüçîâàíèåì ýòèõ òèïîâ. Çàòåì ìû ðàçáåðåì, ÷òî òàêîå ôóíêöèè è
ïðîöåäóðû, âíåäðèì èõ â íàïèñàííóþ ðàíåå ïðîãðàììó. Ïîçíàêîìèìñÿ ñ ïîíÿòèåì
"Ñîáûòèå".
Ïðîãðàììèñòàì ñïëîøü è ðÿäîì ïðèõîäèòñÿ
èñïîëüçîâàòü äàííûå öåëîãî òèïà. Öåëîå ÷èñëî – ýòî ÷èñëî, íå
èìåþùåå çàïÿòîé. ×èñëî ìîæåò áûòü áåççíàêîâûì (ïîëîæèòåëüíûì), è ñî çíàêîì
ìèíóñ (îòðèöàòåëüíûì). Ïðèìåðû:
1
-12
1234567
 ïðîøëîé ëåêöèè ìû óïîìÿíóëè ëèøü òèï Integer, êàê îñíîâíîé òèï öåëûõ
÷èñåë. Äåéñòâèòåëüíî, ýòîò òèï ïðèõîäèòñÿ èñïîëüçîâàòü ÷àùå âñåãî, îäíàêî
ñóùåñòâóþò è äðóãèå òèïû öåëûõ ÷èñåë.  òàáëèöå 6.1 ïðåäñòàâëåíû öåëûå
òèïû:
Òèï |
Äèàïàçîí âîçìîæíûõ çíà÷åíèé |
Ðàçìåð ïàìÿòè ïîä ïåðåìåííóþ |
Ïðèìå÷àíèå |
Integer |
-2147483648 .. 2147483647 |
4 áàéòà |
Çíàêîâîå |
Cardinal |
0 .. 4294967295 |
4 áàéòà |
Áåç çíàêà |
Shortint |
-128 .. 127 |
1 áàéò |
Çíàêîâîå |
Smallint |
-32768 .. 32767 |
2 áàéòà |
Çíàêîâîå |
Longint |
-2147483648 .. 2147483647 |
4 áàéòà |
Çíàêîâîå |
Int64 |
-263 .. 263 - 1 |
8 áàéò |
Çíàêîâîå |
Byte |
0 .. 255 |
1 áàéò |
Áåç çíàêà |
Word |
0 .. 65535 |
2 áàéòà |
Áåç çíàêà |
Longword |
0 .. 4294967295 |
4 áàéòà |
Áåç çíàêà |
Äàâàéòå ðàçáåðåìñÿ, êàê ðàáîòàåò ëþáàÿ
ïðîãðàììà. Êîãäà ìû çàãðóæàåì ïðîãðàììó, îíà ñ÷èòûâàåòñÿ â îïåðàòèâíóþ ïàìÿòü
êîìïüþòåðà. Òóäà æå ñ÷èòûâàþòñÿ è äàííûå, ñ êîòîðûìè ïðîãðàììà ðàáîòàåò. Òîëüêî
ïîñëå ýòîãî ïðîãðàììà íà÷èíàåò âûïîëíÿòüñÿ. Åñëè ñîâðåìåííûå æåñòêèå äèñêè
èìåþò äîñòàòî÷íî áîëüøîé ðàçìåð, ýòîãî íåëüçÿ ñêàçàòü îá îïåðàòèâíîé ïàìÿòè.
Ïîýòîìó åå ñëåäóåò ýêîíîìèòü âåçäå, ãäå òîëüêî ìîæíî.
×àùå âñåãî âàì ïðèäåòñÿ ðàáîòàòü ñ
ïåðåìåííûìè òèïà Integer, ýòî ñàìûé ðàñïðîñòðàíåííûé òèï öåëûõ ÷èñåë, îí ãîäèòñÿ ïî÷òè äëÿ âñåõ
ðàñ÷åòîâ. Îäíàêî áûâàþò ìîìåíòû, êîãäà íå íóæíî òàêîãî áîëüøîãî äèàïàçîíà
çíà÷åíèé. Íàïðèìåð, âû áóäåòå èñïîëüçîâàòü ïåðåìåííóþ äëÿ ñ÷åò÷èêà êàêîãî-òî
öèêëà, è çíàåòå, ÷òî îí áóäåò äëèòüñÿ, ê ïðèìåðó, îò 1 äî 100.  òàêîì ñëó÷àå,
óêàçàâ â êà÷åñòâå ñ÷åò÷èêà òèï Integer, ìû çðÿ óêðàäåì ó îïåðàòèâíîé ïàìÿòè 3
áàéòà! 3 áàéòà – ýòî íåìíîãî, íî âåäü â áîëüøîé ïðîãðàììå ïåðåìåííûõ áóäåò
î÷åíü ìíîãî, è åñëè âñå îíè áóäóò òðàòèòü ïàìÿòü ïîïóñòó, òî òàêàÿ ïðîãðàììà
áóäåò, ìÿãêî ãîâîðÿ, íåïðîôåññèîíàëüíîé. Ïðèó÷àéòåñü ñðàçó òðàòèòü ñòîëüêî áàéò
îïåðàòèâíîé ïàìÿòè, ñêîëüêî íóæíî. Íå çðÿ âåäü ïðèäóìàëè ñòîëüêî òèïîâ! Åñëè Âû
çíàåòå, ÷òî â ïåðåìåííîé áóäóò ÷èñëà îò íóëÿ è âûøå, òî íåò íèêàêîé
íåîáõîäèìîñòè áðàòü çíàêîâûé òèï, âåäü îòðèöàòåëüíûì Âàøå ÷èñëî âñå ðàâíî íå
áóäåò!
Êàê ìû óæå ãîâîðèëè ðàíüøå, âåùåñòâåííûå
÷èñëà – ýòî ÷èñëà ñ çàïÿòîé, ïîñëå êîòîðîé èäóò äåñÿòè÷íûå çíà÷åíèÿ.
Åùå ãîâîðÿò, ÷òî îíè èìåþò ïëàâàþùóþ òî÷êó (çàïîìíèòå ýòî îïðåäåëåíèå, îíî
áóäåò ÷àñòî âñòðå÷àòüñÿ). Íåêîòîðûå íà÷èíàþùèå ïðîãðàììèñòû ñ÷èòàþò, ÷òî ëó÷øå
òàêîé òèï ïåðåìåííûõ èñïîëüçîâàòü âñåãäà, äàæå ïðè îáðàáîòêå öåëûõ ÷èñåë. Ýòî
áîëüøîå çàáëóæäåíèå! Îïåðàöèè íàä ÷èñëàìè ñ ïëàâàþùåé òî÷êîé îòíèìàþò ó
ïðîöåññîðà ãîðàçäî áîëüøå âðåìåíè, è òðåáóþò áîëüøå ïàìÿòè. Êîìïüþòåð
âîñïðèíèìàåò âåùåñòâåííîå ÷èñëî, êàê äâà öåëûõ, è äåëàåò äâîéíóþ ðàáîòó ïðè
îáðàáîòêå ÷èñåë äî çàïÿòîé, è ïîñëå íåå. Îäíàêî èíîé ðàç áûâàåò íåîáõîäèìî
èñïîëüçîâàòü èìåííî òàêîé òèï äàííûõ. Ê ïðèìåðó, åñëè íóæíî ïîäåëèòü îäíî öåëîå
íà äðóãîå. Õîðîøî, åñëè ýòî áóäåò "4/2", ðåçóëüòàò òîæå áóäåò öåëûì –
2. À åñëè "4/3"? Òîãäà ðåçóëüòàòîì áóäåò 1,3333… è óæ òóò áåç
âåùåñòâåííîãî ÷èñëà íå îáîéòèñü! À âåäü ìû çàðàíåå íå çíàåì, êàêèå ÷èñëà áóäåò
äåëèòü ïîëüçîâàòåëü, ïîýòîìó ëó÷øå ñðàçó èìåòü â âèäó, ÷òî ðåçóëüòàò ìîæåò áûòü
íå öåëûì ÷èñëîì.
Êàê è öåëûå, âåùåñòâåííûå ÷èñëà èìåþò
íåñêîëüêî òèïîâ. Â òàáëèöå 3.2 îíè ïðåäñòàâëåíû:
Òèï |
Äèàïàçîí âîçìîæíûõ çíà÷åíèé |
Çíà÷àùèõ öèôð ìàêñèìàëüíî |
Ðàçìåð â áàéòàõ |
Real48 |
2.9 * 10-39 .. 1.7 * 1038 |
11-12 |
6 |
Real |
5.0 * 10-324 .. 1.7 * 10308 |
15-16 |
8 |
Single |
1.5 * 10-45 .. 3.4 * 1038 |
7-8 |
4 |
Double |
5.0 * 10-324 .. 1.7 * 10308 |
15-16 |
8 |
Extended |
3.6 * 10-4951 .. 1.1 * 104932 |
19-20 |
10 |
Comp |
-263+1 .. 263-1 |
19-20 |
8 |
Currency |
-922337203685477.5808 .. 922337203685477.5807 |
19-20 |
8 |
Òðåòèé ñòîëáåö òàáëèöû óêàçûâàåò
êîëè÷åñòâî ìàêñèìàëüíî çíà÷àùèõ öèôð. Öèôðû, êîòîðûå âûõîäÿò çà ýòîò ïðåäåë,
áóäóò èãíîðèðîâàòüñÿ. Òóò âàæíî ïîìíèòü, ÷òî âåùåñòâåííûå ÷èñëà íå ðàâíû öåëûì.
Òî åñòü, ÷èñëî 3,0 íå áóäåò ðàâíî 3! ×òîáû ñðàâíèòü îáà ýòè ÷èñëà, ïðèäåòñÿ
îêðóãëèòü âåùåñòâåííîå ÷èñëî.
Èçó÷èì öåëûå è âåùåñòâåííûå òèïû íà
ïðàêòèêå. Äëÿ ýòîãî ñîçäàäèì ïðîñòóþ ïðîãðàììó, êîòîðàÿ äåëèò îäíî öåëîå ÷èñëî
íà äðóãîå. Ðåçóëüòàò áóäåò âûâîäèòüñÿ, êàê âåùåñòâåííîå ÷èñëî.
Îòêðîéòå Delphi, ñîçäàéòå íîâûé ïðîåêò. Íà
ôîðìó íóæíî ïîìåñòèòü òðè êîìïîíåíòà Label, òðè êîìïîíåíòà Edit è îäíó êíîïêó, ÷òîáû
ïîëó÷èëàñü òàêàÿ êàðòèíà:
Ðèñ. 6.1. Âíåøíèé âèä ôîðìû
Ñîâåò: ÷òîáû âûïîëíèòü îäèíàêîâóþ îïåðàöèþ íàä íåñêîëüêèìè êîìïîíåíòàìè
ñðàçó, èõ ìîæíî âûäåëèòü îäèí çà äðóãèì, óäåðæèâàÿ êëàâèøó <Shift>.
Íàïðèìåð, åñëè òàêèì îáðàçîì âûäåëèòü âñå òðè êîìïîíåíòà Edit, òî çàòåì ìîæíî
ðàçîì î÷èñòèòü èõ ñâîéñòâî Text.
Ñîõðàíèòå ïðîåêò ïîä èìåíåì MyCalc. Çàòåì
äâàæäû ùåëêíèòå ïî êíîïêå, ÷òîáû ñîçäàòü îáðàáîò÷èê íàæàòèÿ íà êíîïêó.
Ïåðåä begin ïðîöåäóðû ñëåäóåò ñîçäàòü ðàçäåë var, è îáúÿâèòü òàì òðè
ïåðåìåííûõ:
var
Perem1, Perem2
: Integer;
Perem3 :
Double;
Çàòåì âåðíåìñÿ â òåëî ïðîöåäóðû (ìåæäó
êîìàíäàìè begin è end), è ïðèñâîèì öåëûì ïåðåìåííûì ââåäåííûå ïîëüçîâàòåëåì çíà÷åíèÿ. Çäåñü
íóæíî ïîíÿòü îäíó âàæíóþ âåùü. Ïîëüçîâàòåëü áóäåò ââîäèòü çíà÷åíèÿ â êîìïîíåíòû
Edit, è òàì îíè áóäóò õðàíèòüñÿ â ñâîéñòâå Text â âèäå ñòðîêîâîãî òèïà äàííûõ. Ñòðîêó
íåëüçÿ áóäåò ïðèñâîèòü ïåðåìåííîé êàêîãî-ëèáî äðóãîãî òèïà äàííûõ, ïðèñâîåíèå
Perem1 := Edit1.Text;
//îøèáî÷íîå ïðèñâîåíèå
//– íåñîâìåñòèìîñòü òèïîâ
äàííûõ
áóäåò îøèáî÷íûì. Ðàçíèöà äîâîëüíî
ñóùåñòâåííàÿ: äàæå åñëè ïîëüçîâàòåëü ââîäèò, êàçàëîñü áû, öåëîå ÷èñëî,
íàïðèìåð,
123
òî êîìïüþòåð âèäèò ñòðîêó ñèìâîëîâ, à
âîâñå íå ÷èñëî:
'123'
Âûõîä – ïðåîáðàçîâàòü îäèí òèï äàííûõ â
äðóãîé, â íàøåì ñëó÷àå, ñòðîêó â öåëûé òèï. Ïðåîáðàçîâàíèåì òèïîâ ïðèõîäèòñÿ
çàíèìàòüñÿ ñïëîøü è ðÿäîì, ïî ìåðå èçó÷åíèÿ ìàòåðèàëà ìû áóäåì çíàêîìèòüñÿ ñ
ðàçëè÷íûìè ñïîñîáàìè ïðåîáðàçîâàíèÿ. Ïðåîáðàçîâàòü ñòðîêó â öåëûé òèï ìîæíî ñ
ïîìîùüþ ôóíêöèè
StrToInt('String');
 êà÷åñòâå ïàðàìåòðà (â ñêîáêàõ)
óêàçûâàåòñÿ ñòðîêà. Ôóíêöèÿ ïðåîáðàçóåò åå â öåëîå ÷èñëî è âåðíåò åãî êàê
ðåçóëüòàò. Ïðèìåðû èñïîëüçîâàíèÿ ôóíêöèè (ýòè ïðèìåðû íå íóæíî ââîäèòü â
ðåäàêòîð êîäà):
var
s: String;
i: Integer;
begin
s := '1234';
i := StrToInt(s); //ïàðàìåòð – ñòðîêîâàÿ
ïåðåìåííàÿ
i := StrToInt(‘123456’); //ïàðàìåòð – ñòðîêà
i := StrToInt(Edit1.Text); //ïàðàìåòð –
ñâîéñòâî Text
//êîìïîíåíòà
Edit, èìåþùåå ñòðîêîâûé òèï
end;
Êàê âèäíî èç ïðèìåðà, èìååòñÿ ìàññà âîçìîæíîñòåé
ïåðåäàòü â ôóíêöèþ ñòðîêó.  ïåðâîì ñëó÷àå ïðåîáðàçîâàíèÿ ìû ïåðåäàåì ñòðîêîâóþ
ïåðåìåííóþ s, â êîòîðîé õðàíèòñÿ ñòðîêà '1234'. Ôóíêöèÿ ïðåîáðàçóåò ýòó ñòðîêó â öåëîå
÷èñëî, è â ðåçóëüòàòå â ïåðåìåííóþ i ïîïàäåò óæå ÷èñëî 1234.
Âî âòîðîì ñëó÷àå ìû ïåðåäàåì
íåïîñðåäñòâåííî ñòðîêó '123456', à â ïåðåìåííóþ i ïîïàäàåò ïðåîáðàçîâàííîå èç ýòîé ñòðîêè
÷èñëî.  òðåòüåì ñëó÷àå ìû â êà÷åñòâå ïàðàìåòðà ïåðåäàåì òîò òåêñò, êîòîðûé
ïîëüçîâàòåëü ââåë â ïîëå ââîäà Edit1. Çäåñü ñëåäóåò ñäåëàòü îãîâîðêó. Ôóíêöèÿ ñðàáîòàåò
ïðàâèëüíî, åñëè ïîëüçîâàòåëü ââåë òóäà äåéñòâèòåëüíî öåëîå ÷èñëî.  ïðîòèâíîì
ñëó÷àå âîçíèêíåò îøèáêà. Ïîëüçîâàòåëü – ëè÷íîñòü íåïðåäñêàçóåìàÿ, ïîýòîìó
ïðîãðàììèñò â òàêèõ ñëó÷àÿõ ïåðåä ïðåîáðàçîâàíèåì òèïîâ âñåãäà äåëàåò ïðîâåðêó
– à äåéñòâèòåëüíî ëè â ïîëå ââîäà èìåþòñÿ òîëüêî öèôðû îò 0 äî 9? Íåò ëè òàì
ñëó÷àéíî áóêâû èëè çàïÿòîé? Òàêóþ ïðîâåðêó ìû íàó÷èìñÿ äåëàòü ïîçäíåå. Ïîêà ÷òî
ïðèäåòñÿ ñàìèì ñëåäèòü, ÷òîáû â ýòèõ ïîëÿõ ââîäà áûëè òîëüêî öåëûå ÷èñëà.
Âåðíåìñÿ ê ïðîãðàììå. Ñðàçó ïîñëå begin ïðèñâàèâàåì öåëûì
ïåðåìåííûì çíà÷åíèÿ, êîòîðûå ââåë ïîëüçîâàòåëü:
Perem1 :=
StrToInt(Edit1.Text);
Perem2 :=
StrToInt(Edit2.Text);
 òðåòüþ, âåùåñòâåííóþ ïåðåìåííóþ, ìû
äîëæíû çàïèñàòü ðåçóëüòàò äåëåíèÿ ïåðâîãî ÷èñëà íà âòîðîå. Òóò ìîæåò êðûòüñÿ
åùå îäèí "ïîäâîäíûé êàìåíü" - ÷òî, åñëè âî âòîðîå ïîëå ïîëüçîâàòåëü
ââåë ÷èñëî 0? Åùå ñî øêîëû âñå ìû çíàåì, ÷òî íà íîëü äåëèòü íåëüçÿ. Åñëè æå ìû
ïîïðîáóåì ýòî ñäåëàòü, òî êîìïüþòåð, â ëó÷øåì ñëó÷àå, çàâèñíåò. Çäåñü îïÿòü
ïðèäåòñÿ äåëàòü ïðîâåðêó íà ïðàâèëüíîñòü ââåäåííûõ äàííûõ, ñòàâèòü, êàê
ãîâîðÿò, "çàùèòó îò äóðàêîâ". Ïîäðîáíåå î òàêèõ ïðîâåðêàõ ìû
ïîãîâîðèì íà ñëåäóþùèõ ëåêöèÿõ, êîãäà èçó÷èì óñëîâíûå êîíñòðóêöèè. À ïîêà
ïðîñòî íàáåðèòå ýòîò êîä:
{çàùèòà îò äóðàêîâ:}
If Perem2 = 0 then begin //åñëè ýòî íîëü, òî:
ShowMessage('Íà íîëü äåëèòü íåëüçÿ!'); //âûâîäèò ñîîáùåíèå
Edit3.Text := '0'; //êàê ðåçóëüòàò çàïèñûâàåì
íîëü
end
else
begin //èíà÷å:
Perem3 :=
Perem1 / Perem2; //äåëèì
Edit3.Text :=
FloatToStr(Perem3); //ïðåîáðàçóåì
âåùåñòâåííîå â
//ñòðîêó
è çàïèñûâàåì ðåçóëüòàò
end;
Çäåñü ñëåäóåò îáðàòèòü âíèìàíèå íà
ïðåäïîñëåäíþþ ñòðîêó. Ôóíêöèÿ FloatToStr() â êà÷åñòâå ïàðàìåòðà ïðèíèìàåò
âåùåñòâåííîå ÷èñëî, è âîçâðàùàåò ýòî æå ÷èñëî â âèäå ñòðîêè. Íàïðèìåð, â
ðåçóëüòàòå ïðåîáðàçîâàíèÿ
s :=
FloatToStr(123.45);
ïåðåìåííîé s áóäåò ïðèñâîåíà ñòðîêà '123.45', êîòîðóþ
çàòåì óæå ìîæíî áóäåò âûâåñòè ïîëüçîâàòåëþ â êà÷åñòâå ðåçóëüòàòà.  íàøåì
ïðèìåðå ìû ðåçóëüòàò äåëåíèÿ äâóõ öåëûõ ÷èñåë ïðåîáðàçóåì â ñòðîêó è âûâîäèì
åãî â ïîëå Edit3. Ñïðàâåäëèâîñòè ðàäè ñëåäóåò çàìåòèòü, ÷òî â êà÷åñòâå ïàðàìåòðà ìîæíî
ïåðåäàâàòü íå òîëüêî çíà÷åíèå, íî è âûðàæåíèå. Íàïðèìåð, åñëè óêàçàòü
Edit3.Text := FloatToStr(Perem1 / Perem2);
òî íàäîáíîñòü â èñïîëüçîâàíèè âåùåñòâåííîé
ïåðåìåííîé Perem3 îòïàäàåò. Ïîïðîáóéòå, êàê ðàáîòàþò îáà âàðèàíòà.
Ýòî î÷åíü âàæíàÿ òåìà, îáðàòèòå íà íåå
îñîáîå âíèìàíèå!
Ðàíüøå ÿçûêè ïðîãðàììèðîâàíèÿ áûëè
ïîñòðî÷íûìè. Åäèíñòâåííûì âàðèàíòîì âîçâðàòà ê íóæíîé ñòðîêå áûë îïåðàòîð GO. Î÷åíü ìíîãî îøèáîê
áûëî ñäåëàíî ýòèì îïåðàòîðîì! Ñîâðåìåííûå ÿçûêè ïðîãðàììèðîâàíèÿ òàêæå èìåþò
ýòîò îïåðàòîð, íî ïðèìåíÿòü åãî ñ÷èòàåòñÿ äóðíûì òîíîì.
Èíîãäà áûâàåò íåîáõîäèìî âûïîëíÿòü ÷àñòü
êîäà íåîäíîêðàòíî. Ýòîò ñàìûé êîä âûíîñÿò â îòäåëüíóþ ïîäïðîãðàììó – ïðîöåäóðó.
Ïðîöåäóðà – ïîäïðîãðàììà,
êîòîðàÿ âûïîëíÿåò êàêèå-òî äåéñòâèÿ, è êîòîðóþ ìîæíî âûçâàòü èç äðóãîãî ìåñòà
ïðîãðàììû. Ïîñëå âûïîëíåíèÿ ïðîöåäóðû âûïîëíåíèå ïðîãðàììû ïðîäîëæàåòñÿ ñ òîãî
ìåñòà, îòêóäà îíà áûëà âûçâàíà.
Ïðîöåäóðà æèâåò ñàìîñòîÿòåëüíîé æèçíüþ, è
â ëþáîé ìîìåíò åå ìîæíî âûçâàòü, ÷òîáû âûïîëíèòü êàêèå-òî äåéñòâèÿ. ×òîáû
ïðîöåäóðó ìîæíî áûëî âûçâàòü èç ïðîãðàììû, åå íåîáõîäèìî îáúÿâèòü âûøå
òîãî ìåñòà, ãäå ìû áóäåì åå âûçûâàòü. Ñèíòàêñèñ ïðîöåäóðû òàêîé:
procedure
NameProc(Param : Òèï);
var
//îáúÿâëåíèå ïåðåìåííûõ(íåîáÿçàòåëüíî)
begin
//òåëî ïðîöåäóðû
end;
Âûçâàòü òàêóþ ïðîöåäóðó ìîæíî, ïðîñòî
óêàçàâ åå èìÿ. Ïðîâåðèì ýòî íà ïðàêòèêå. Âåðíåìñÿ ê íàøåìó ïðîåêòó, è âûøå
ïðîöåäóðû îáðàáîòêè êíîïêè ñîçäàäèì òàêóþ ïðîöåäóðó:
procedure Soobshenie;
begin
ShowMessage('Îøèáêà! Íà íîëü äåëèòü íåëüçÿ!');
end;
 äàííîé ïðîöåäóðå ìû íå èñïîëüçóåì
ïåðåìåííûõ, ïîýòîìó ðàçäåë var îòñóòñòâóåò. Âñå, ÷òî äåëàåò íàøà ïðîöåäóðà –
âûâîäèò ñîîáùåíèå î òîì, ÷òî íà íîëü äåëèòü íåëüçÿ. Îáðàòèòå âíèìàíèå, ÷òî åñëè
íåò âõîäÿùèõ ïàðàìåòðîâ, òî ñêîáêè óêàçûâàòü íåîáÿçàòåëüíî. Òåïåðü ñíîâà
ïåðåéäåì â ïðîöåäóðó îáðàáîòêè íàæàòèÿ êíîïêè, è âìåñòî âûâîäà ñîîáùåíèÿ, ÷òî
íà íîëü äåëèòü íåëüçÿ, ïðîèçâåäåì âûçîâ ïðîöåäóðû:
Soobshenie;
Òåïåðü ñîõðàíèòå ïðîåêò, ñêîìïèëèðóéòå åãî
è ïîñìîòðèòå, ÷òî ïîëó÷èëîñü. Íå çàáóäüòå, ÷òî ââîäèòü â Edit1 è Edit2 ìîæíî òîëüêî öèôðû îò 0
äî 9.
Òåïåðü î ïàðàìåòðàõ. Ïàðàìåòðû
– ýòî âõîäíûå äàííûå. Òî åñòü, ìû ìîæåì âûçâàòü ïðîöåäóðó è çàäàòü åé
íóæíûå äàííûå. Ïàðàìåòðû ïðîöåäóðû çàïèñûâàþòñÿ â êðóãëûõ ñêîáêàõ ñ óêàçàíèåì
òèïà. Åñëè ïàðàìåòðîâ íåò, ñêîáêè ìîæíî íå ñòàâèòü. Ïðèìåð ïðîöåäóðû ñ ïàðàìåòðàìè:
procedure Primer(a,b : Integer);
begin
a := a * b;
end;
Îáðàòèòå âíèìàíèå, ÷òî îáÿçàòåëüíî íóæíî
óêàçûâàòü òèï ïàðàìåòðîâ. Òåïåðü ìû ìîæåì âûçâàòü ýòó ïðîöåäóðó, óêàçàâ åé,
êàêèå öèôðû íóæíî ïåðåìíîæèòü. Ïðèìåðû âûçîâà ïðîöåäóðû:
Primer(10, 20);
//ïåðåäàåì öåëûå ÷èñëà
Primer(a, 100);
//ïåðåäàåì ïåðåìåííóþ a ñ öåëûì ÷èñëîì, è öåëîå ÷èñëî
Primer(c, d);
//ïåðåäàåì äâå ïåðåìåííûõ ñ öåëûì ÷èñëîì
Ñðàçó ñëåäóåò ñêàçàòü îá îáëàñòè âèäèìîñòè
ïåðåìåííûõ. Áûâàþò ïåðåìåííûå ãëîáàëüíûå è ëîêàëüíûå. Ãëîáàëüíûå
ïåðåìåííûå âèäíû âî âñåé ïðîãðàììå, èõ ìû áóäåì èñïîëüçîâàòü ïîçæå. À ëîêàëüíûå
ïåðåìåííûå ñîçäàþòñÿ âíóòðè ïðîöåäóðû, â ðàçäåëå var, è âèäíû òîëüêî â ýòîé ïðîöåäóðå.
Ëîêàëüíûå ïåðåìåííûå ñîçäàþòñÿ â ïàìÿòè â òî âðåìÿ, êîãäà ïðîöåäóðà íà÷èíàåò
ðàáîòó, è óíè÷òîæàþòñÿ, êîãäà ïðîöåäóðà çàêîí÷èëà ðàáîòó. Òàêèì îáðàçîì, ìû
ìîæåì ñäåëàòü äâå èëè áîëåå ïðîöåäóð, è óêàçàòü â íèõ ïåðåìåííûå ñ îäèíàêîâûì
èìåíåì. Ýòî áóäóò ðàçíûå ïåðåìåííûå, è îíè íå áóäóò ìåøàòü äðóã äðóãó.
Ôóíêöèè – ýòî òàêèå æå ïîäïðîãðàììû, êàê è ïðîöåäóðû.
Îòëè÷èå ôóíêöèé îò ïðîöåäóð â òîì, ÷òî îíè íå ïðîñòî âûïîëíÿþò
êàêèå-òî äåéñòâèÿ è ðàñ÷åòû, íî è ìîãóò âîçâðàùàòü ðåçóëüòàò îïðåäåëåííîãî
òèïà. Ïîñêîëüêó îíè âîçâðàùàþò ðåçóëüòàò, íåîáõîäèìî óêàçàòü òèï ýòîãî
ðåçóëüòàòà. Ñèíòàêñèñ ôóíêöèè òàêîé:
function
NameFunc(Param : Òèï) : Òèï_âîçâðàùàåìîãî_çíà÷åíèÿ;
var
//îáúÿâëåíèå ïåðåìåííûõ (íåîáÿçàòåëüíî)
begin
//òåëî ôóíêöèè
Result := ðåçóëüòàò âû÷èñëåíèé;
end;
Çäåñü ñëåäóåò îáðàòèòü âíèìàíèå íà äâà
ìîìåíòà: ïîñëå èìåíè ôóíêöèè è ïàðàìåòðîâ â êðóãëûõ ñêîáêàõ, ïîñëå äâîåòî÷èÿ,
óêàçûâàåòñÿ òèï âîçâðàùàåìîãî çíà÷åíèÿ. Êðîìå òîãî, â êàæäîé ôóíêöèè ïî
óìîë÷àíèþ èìååòñÿ ïåðåìåííàÿ Result, êîòîðàÿ èìååò òîò æå òèï, ÷òî è òèï
âîçâðàùàåìîãî çíà÷åíèÿ. Ýòó ïåðåìåííóþ ñïåöèàëüíî îáúÿâëÿòü íå íóæíî, îíà óæå
ãîòîâà ê ðàáîòå.  îòëè÷èå îò äðóãèõ ÿçûêîâ, â Delphi ýòîé ïåðåìåííîé ìîæíî
ïðèñâàèâàòü çíà÷åíèå íåîäíîêðàòíî. Ðåçóëüòàòîì áóäåò ïîñëåäíåå ïðèñâîåííîå
çíà÷åíèå.
Åñòü åùå îäèí ñïîñîá âåðíóòü èç ôóíêöèè
ðåçóëüòàò âû÷èñëåíèé: èñïîëüçîâàòü ïåðåìåííóþ ñ òàêèì æå èìåíåì, êàê è èìÿ
ôóíêöèè. Ýòó ïåðåìåííóþ òîæå îáúÿâëÿòü íå íóæíî. Â íàøåì ïðèìåðå, ñòðîêà
Result := ðåçóëüòàò âû÷èñëåíèé;
áóäåò ïîëíîñòüþ èäåíòè÷íîé ñòðîêå
NameFunc := ðåçóëüòàò âû÷èñëåíèé;
Êàêîé èç ñïîñîáîâ èñïîëüçîâàòü – ðåøàéòå
ñàìè, îáà ñïîñîáà ïðàâèëüíû. Ñíîâà âåðíåìñÿ ê íàøåé ïðîãðàììå, è äëÿ
çàêðåïëåíèÿ çíàíèé äîáàâèì â íåå ôóíêöèþ. Ôóíêöèÿ òàêæå äîëæíà áûòü îïèñàíà
âûøå òîãî ìåñòà, ãäå ìû áóäåì åå âûçûâàòü. Ìîæåòå ñîçäàòü åå ìåæäó íàøåé
ïðîöåäóðîé è ïðîöåäóðîé íàæàòèÿ íà êíîïêó.
function Delenie(a,b : Integer) : Real;
begin
Result := a /
b;
end;
Òåïåðü çàìåíèì òó ñòðîêó, ãäå â òðåòüþ
ïåðåìåííóþ çàïèñûâàåòñÿ ðåçóëüòàò äåëåíèÿ ïåðâûõ äâóõ, íà âûçîâ ôóíêöèè è
ïåðåäà÷ó åé ýòèõ äâóõ ÷èñåë:
Perem3 :=
Delenie(Perem1, Perem2);
Êîíå÷íî, ïðèìåðû ýòè ïðèìèòèâíû. Ðåàëüíî ôóíêöèè
è ïðîöåäóðû âûïîëíÿþò ãîðàçäî áîëåå âàæíûå âåùè, ÷åì äåëåíèå îäíîãî
÷èñëà íà äðóãîå. Ñî âðåìåíåì íàøè ïðîãðàììû áóäóò ñîäåðæàòü ìíîæåñòâî òàêèõ ôóíêöèé
è ïðîöåäóð.
 Delphi ñîáûòèå îçíà÷àåò, ÷òî êàêîé òî
êîìïîíåíò, êîòîðîìó ìû íàçíà÷èëè ñîáûòèå, èçìåíèëñÿ. Ñîáûòèå – ýòî
ïðîöåäóðà, êîòîðîé ïåðåäàåòñÿ óïðàâëåíèå â ñëó÷àå, åñëè ïðîèçîøëè
çàïðîãðàììèðîâàííûå èçìåíåíèÿ. Ñîáûòèÿ ìîãóò áûòü ñàìûìè ðàçíûìè –
èçìåíåíèå òåêñòà â ïîëå Edit, íàæàòèå êíîïêè ìûøè èëè êëàâèøè, èëè ïðîñòî ìûøü îêàçàëàñü íàä
êîìïîíåíòîì.
Äàâàéòå óëó÷øèì íàø ïðèìåð, ââåäåì â íåãî
ñîáûòèå. Âûäåëèòå êîìïîíåíò Edit1. Ñåé÷àñ ìû çàäàäèì åìó ñîáûòèå OnChange, êîòîðîå ïðîèñõîäèò
âñÿêèé ðàç ïðè èçìåíåíèè òåêñòà â ýòîì êîìïîíåíòå. Äàâàéòå ïðåäñòàâèì ñåáå
ïîëüçîâàòåëÿ, ðàáîòàþùåãî ñ íàøåé ïðîãðàììîé. Åìó áóäåò ïðèÿòíî, åñëè îí íà÷íåò
ìåíÿòü òåêñò â ïåðâîì ïîëå, à îñòàëüíûå ïîëÿ àâòîìàòè÷åñêè î÷èñòÿòñÿ, ÷òîáû
áûòü ãîòîâûìè äëÿ íîâûõ ðàñ÷åòîâ!
Âûäåëèì êîìïîíåíò Edit1.
Ïåðåéäåì â èíñïåêòîðå îáúåêòîâ íà âêëàäêó Events (ñîáûòèÿ).
Äâàæäû ùåëêíåì ïî ñîáûòèþ OnChange (Èçìåíåíèå).
Ñîçäàñòñÿ ïðîöåäóðà îáðàáîòêè ñîáûòèÿ, è
ìû ïîïàäåì â ðåäàêòîð êîäà. Òàì ìû âïèøåì äâå ñòðîêè:
Edit2.Clear;
Edit3.Clear;
Òåïåðü âñòàâèì åùå îäíó "çàùèòó îò
äóðàêîâ". Âåäü òðåòüå ïîëå íóæíî òîëüêî äëÿ ðåçóëüòàòà? À âäðóã
ïîëüçîâàòåëü íà÷íåò òàì ââîäèòü äàííûå? Ñòðàøíîãî íè÷åãî íå ïðîèçîéäåò, â
ðàñ÷åòàõ ýòî ïîëå íå ó÷àñòâóåò, íî âñå ðàâíî íåïðèÿòíî, êîãäà òâîþ ïðîãðàììó
èñïîëüçóþò íåïðàâèëüíî.
Âûäåëèòå êîìïîíåíò Edit3.
Íà âêëàäêå Properties (ñâîéñòâà) íàéäèòå ñâîéñòâî ReadOnly (òîëüêî äëÿ ÷òåíèÿ), è
âìåñòî False (ëîæü), ïîñòàâüòå True (èñòèíà). Âñå, òåïåðü ïîëüçîâàòåëü íå ñìîæåò ââîäèòü äàííûå â ýòî ïîëå,
òîëüêî ïðîãðàììà ñìîæåò âûâîäèòü â íåãî ðåçóëüòàò.
Ñîõðàíèòå ïðîåêò, âûïîëíèòå Run è óáåäèòåñü â ýòîì.