Òåìà 6 : Öåëûå è âåùåñòâåííûå òèïû. Ïðîöåäóðû è ôóíêöèè

Çäåñü âû ïîçíàêîìèòåñü ñ öåëûìè è âåùåñòâåííûìè òèïàìè äàííûõ. Íàïèøèòå ïðîãðàììó ñ èñïîëüçîâàíèåì ýòèõ òèïîâ. Çàòåì ìû ðàçáåðåì, ÷òî òàêîå ôóíêöèè è ïðîöåäóðû, âíåäðèì èõ â íàïèñàííóþ ðàíåå ïðîãðàììó. Ïîçíàêîìèìñÿ ñ ïîíÿòèåì "Ñîáûòèå".

Öåëûå ÷èñëà

Ïðîãðàììèñòàì ñïëîøü è ðÿäîì ïðèõîäèòñÿ èñïîëüçîâàòü äàííûå öåëîãî òèïà. Öåëîå ÷èñëîýòî ÷èñëî, íå èìåþùåå çàïÿòîé. ×èñëî ìîæåò áûòü áåççíàêîâûì (ïîëîæèòåëüíûì), è ñî çíàêîì ìèíóñ (îòðèöàòåëüíûì). Ïðèìåðû:

1

-12

1234567

 ïðîøëîé ëåêöèè ìû óïîìÿíóëè ëèøü òèï Integer, êàê îñíîâíîé òèï öåëûõ ÷èñåë. Äåéñòâèòåëüíî, ýòîò òèï ïðèõîäèòñÿ èñïîëüçîâàòü ÷àùå âñåãî, îäíàêî ñóùåñòâóþò è äðóãèå òèïû öåëûõ ÷èñåë.  òàáëèöå 6.1 ïðåäñòàâëåíû öåëûå òèïû:

Òàáëèöà 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 îíè ïðåäñòàâëåíû:

Òàáëèöà 6.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 è óáåäèòåñü â ýòîì.