Ãëàâà 7. Îïåðàòîðû

             Îïåðàòîðû îïèñûâàþò  òå  àëãîðèòìè÷åñêèå  äåéñòâèÿ,  êîòîðûå

        äîëæíû âûïîëíÿòüñÿ.  Îïåðàòîðàì ìîãóò ïðåäøåñòâîâàòü ìåòêè, êîòî-

        ðûå ìîæíî èñïîëüçîâàòü äëÿ ññûëîê â îïåðàòîðàõ ïåðåõîäà goto.

 

         îïåðàòîð ÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>

                    ³  ÚÄÄÄÄÄ¿   ÚÄÄÄ¿ ^ ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  ^

                    ÀÄ>³ìåòêàÃÄÄ>³ : ÃÄÙ ÃÄÄ>³ïðîñòîé îïåðàòîðÃÄÄ´

                       ÀÄÄÄÄÄÙ   ÀÄÄÄÙ   ³   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  ³

                                         ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  ³

                                         ÀÄÄ>³  ñòðóêòóðíûé   ÃÄÄÙ

                                             ³   îïåðàòîð     ³

                                             ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

             Ìåòêà - ýòî ïîñëåäîâàòåëüíîñòü öèôð â äèàïàçîíå îò 0 äî 9999

        èëè èäåíòèôèêàòîð.

 

             Ñóùåñòâóåò äâà îñíîâíûõ âèäà îïåðàòîðîâ: ïðîñòûå îïåðàòîðû è

        ñòðóêòóðíûå îïåðàòîðû.

Ïðîñòûå îïåðàòîðû

             Ïðîñòûì îïåðàòîðîì ÿâëÿåòñÿ òàêîé îïåðàòîð,  êîòîðûé íå  ñî-

        äåðæèò â ñåáå äðóãèõ îïåðàòîðîâ.

 

                                   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

         ïðîñòîé îïåðàòîð ÄÄÄÄÂÄÄÄ>³îïåðàòîð ïðèñâàèâàíèÿÃÄÄÄÄÄÄÄ>

                              ³    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ^

                              ³    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                              ÃÄÄÄ>³ îïåðàòîð ïðîöåäóðû  ÃÄÄÄ´

                              ³    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ³

                              ³    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                              ÀÄÄÄ>³ îïåðàòîð ïåðåõîäà   ÃÄÄÄÙ

                                   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Îïåðàòîð ïðèñâàèâàíèÿ

             Îïåðàòîð ïðèñâàèâàíèÿ çàìåíÿåò òåêóùåå  çíà÷åíèå  ïåðåìåííîé

        íîâûì çíà÷åíèåì,  êîòîðîå îïðåäåëÿåòñÿ âûðàæåíèåì, èëè îïðåäåëÿåò

        âûðàæåíèå, çíà÷åíèå êîòîðîãî äîëæíî âîçâðàùàòüñÿ ôóíêöèåé.

 

                           ÚÄÄÄÄÄÄÄÄÄÄÄ¿       ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄÄ¿

         îïåðàòîð ÄÄÄÄÄÂÄÄ>³ññûëêà íà  ÃÄÄÄÄÄÄ>³:=ÃÄÄ>³âûðàæåíèåÃÄÄ>

         ïðèñâàèâàíèÿ  ³   ³ïåðåìåííóþ ³   ^   ÀÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÙ

                       ³   ÀÄÄÄÄÄÄÄÄÄÄÄÙ   ³

                       ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³

                       ÀÄÄ>³èäåíòèôèêàòîðÃÄÙ

                           ³   ôóíêöèè   ³

                           ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

             Âûðàæåíèå äîëæíî áûòü ñîâìåñòèìî ïî ïðèñâàèâàíèþ ñ òèïîì ïå-

        ðåìåííîé  èëè  òèïîì çíà÷åíèÿ,  âîçâðàùàåìîãî ôóíêöèåé â êà÷åñòâå

        ðåçóëüòàòà (ñì. ðàçäåë "Ñîâìåñòèìîñòü òèïîâ" â Ãëàâå 4).

 

             Ïðèâåäåì íåêîòîðûå ïðèìåðû îïåðàòîðîâ ïðèñâàèâàíèÿ:

 

             X := Y + Z

             Done := (I >= 1) and (I < 100);

             Huel := [blue, Succ(C)];

             I := Sqr(J) - I * K;

 

                          Ïðèñâàèâàíèÿ îáúåêòíîãî òèïà

 

             Ïðàâèëà ñîâìåñòèìîñòè ïî ïðèñâàèâàíèþ îáúåêòíûõ òèïîâ ïîçâî-

        ëÿþò ïðèñâàèâàòü  ýêçåìïëÿðó  îáúåêòà ýêçåìïëÿð ëþáîãî èç åãî äî-

        ÷åðíèõ òèïîâ.  Òàêîå  ïðèñâàèâàíèå  ïðåäñòàâëÿåò  ñîáîé  ïðîåêöèþ

        ïîòîìêà íà  ïðîñòðàíñòâî  åãî ïðåäêà.  Â ïðèìåðå èñõîäíîãî êîäà â

        Ãëàâå 4 ñ ó÷åòîì ýêçåìïëÿðà F òèïà TField  è  ýêçåìïëÿðà  Z  òèïà

        TZipField ïðèñâàèâàíèå  F := Z êîïèðóåò òîëüêî ïîëÿ X,  Y,  Len è

        Name.

 

             Ïðèñâàèâàíèå ýêçåìïëÿðó îáúåêòíîãî  òèïà  íå  èíèöèàëèçèðóåò

        ýêçåìïëÿð. Íàïðèìåð, â ïðåäûäóùåì ïðèìåðå ïðèñâàèâàíèå F := Z îç-

        íà÷àåò, ÷òî âûçîâ êîíñòðóêòîðà äëÿ F ìîæíî îïóñòèòü.

Îïåðàòîðû ïðîöåäóðû

             Îïåðàòîð ïðîöåäóðû îïðåäåëÿåò àêòèâèçàöèþ ïðîöåäóðû, îáîçíà-

        ÷åííóþ  ñ ïîìîùüþ èäåíòèôèêàòîðà ïðîöåäóðû.  Åñëè ñîîòâåòñòâóþùåå

        îïèñàíèå ïðîöåäóðû ñîäåðæèò ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ, òî îïå-

        ðàòîð  ïðîöåäóðû äîëæåí ñîäåðæàòü â ñåáå ñîîòâåòñòâóþùèé åìó ñïè-

        ñîê ôàêòè÷åñêèõ ïàðàìåòðîâ (ïàðàìåòðû,  ñïèñîê êîòîðûõ ïðèâîäèòñÿ

        â  îïðåäåëåíèè,  ÿâëÿþòñÿ ôîðìàëüíûìè ïàðàìåòðàìè,  à â îïåðàòîðå

        âûçîâà ïðîöåäóðû îíè ÿâëÿþòñÿ ôàêòè÷åñêèìè ïàðàìåòðàìè).  Ïðè âû-

        çîâå  ïðîèñõîäèò ïåðåäà÷à ôàêòè÷åñêèõ ïàðàìåòðîâ ôîðìàëüíûì ïàðà-

        ìåòðàì.

 

                        ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

         îïåðàòîð  ÄÄÂÄ>³èäåíòèôèêàòîðÃÄÂÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ>

         ïðîöåäóðû   ³  ³  ïðîöåäóðû  ³ ³³  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ^

                     ³  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³ÀÄ>³ñïèñîê ôàêòè÷åñêèõÃÄÙ

                     ³  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³   ³  ïàðàìåòðîâ      ³

                     ÃÄ>³ äåñèãíàòîð  ÃÄ´   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

                     ³  ³  ìåòîäà     ³ ³

                     ³  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³

                     ³  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³

                     ÃÄ>³  óòî÷íåííûé ÃÄ´

                     ³  ³  äåñèãíàòîð ³ ³

                     ³  ³  ìåòîäà     ³ ³

                     ³  ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ³

                     ³  ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³

                     ÀÄ>³  ññûëêà íà  ÃÄÙ

                        ³ ïåðåìåííóþ  ³

                        ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

             Ïðèâåäåì íåêîòîðûå ïðèìåðû îïåðàòîðîâ ïðîöåäóð:

 

             PrintHeaing;

             Transpose(A,N,M);

             Fin(Name,Address);

Îïåðàòîðû ïåðåõîäà

             Îïåðàòîð ïåðåõîäà goto âûçûâàåò ïåðåäà÷ó óïðàâëåíèÿ îïåðàòî-

        ðó, êîòîðîìó ïðåäøåñòâóåò ìåòêà, óêàçàííàÿ â äàííîì îïåðàòîðå ïå-

        ðåõîäà.  Ñèíòàêñè÷åñêàÿ ñõåìà îïåðàòîðà ïåðåõîäà èìååò  ñëåäóþùèé

        âèä:

 

                                       ÚÄÄÄÄ¿    ÚÄÄÄÄÄ¿

                 îïåðàòîð ïåðåõîäà ÄÄÄ>³gotoÃÄÄÄ>³ìåòêàÃÄÄÄ>

                                       ÀÄÄÄÄÙ    ÀÄÄÄÄÄÙ

 

             Ïðè èñïîëüçîâàíèè îïåðàòîðà ïåðåõîäà äîëæíû ñîáëþäàòüñÿ ñëå-

        äóþùèå ïðàâèëà:

 

             1.  Ìåòêà,  êîòîðàÿ óêàçûâàåòñÿ â îïåðàòîðå ïåðåõîäà, äîëæíà

                 íàõîäèòüñÿ â òîì æå áëîêå èëè ìîäóëå, ÷òî è ñàì îïåðàòîð

                 ïåðåõîäà.  Äðóãèìè ñëîâàìè,  íå äîïóñêàþòñÿ ïåðåõîäû  èç

                 ïðîöåäóðû èëè ôóíêöèè èëè âíóòðü íåå.

 

             2.  Ïåðåõîä èçâíå âíóòðü ñòðóêòóðíîãî îïåðàòîðà (òî åñòü ïå-

                 ðåõîä  íà áîëåå ãëóáîêèé óðîâåíü âëîæåííîñòè) ìîæåò âûç-

                 âàòü íåïðåäñêàçóåìûå ýôôåêòû,  õîòÿ êîìïèëÿòîð íå âûäàåò

                 ñîîáùåíèÿ îá îøèáêå. Íàïðèìåð, âû íå äîëæíû ïåðåõîäèòü â

                 òåëî öèêëà for.

 

                   Ïðèìå÷àíèå: Õîðîøàÿ ïðàêòèêà ïðîãðàììèðîâàíèÿ  òðåáóåò

              ìèíèìàëüíîãî èñïîëüçîâàíèÿ ïåðåõîäîâ.

Ñòðóêòóðíûå îïåðàòîðû

             Ñòðóêòóðíûå îïåðàòîðû ñòðîÿòñÿ èç äðóãèõ îïåðàòîðîâ, ïîðÿäîê

        âûïîëíåíèÿ êîòîðûõ äîëæåí áûòü ïîñëåäîâàòåëüíûì (ñîñòàâíûå îïåðà-

        òîðû  è îïåðàòîðû íàä çàïèñÿìè),  îïðåäåëÿåìûì óñëîâíîé ïåðåäà÷åé

        óïðàâëåíèÿ (óñëîâíûå îïåðàòîðû) èëè ïîâòîðÿþùèìñÿ (îïåðàòîðû öèê-

        ëà).

 

                                    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

              ñòðóêòóðíûé ÄÄÄÄÂÄÄÄÄ>³  ñîñòàâíîé îïåðàòîð   ÃÄÄÄÄÄÄÄ>

              îïåðàòîð        ³     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ^

                              ³     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                              ÃÄÄÄÄ>³   óñëîâíûé îïåðàòîð   ÃÄÄÄ´

                              ³     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ³

                              ³     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                              ÃÄÄÄÄ>³    îïåðàòîð öèêëà     ÃÄÄÄ´

                              ³     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ³

                              ³     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                              ÀÄÄÄÄ>³ îïåðàòîð íàä çàïèñÿìè ÃÄÄÄÙ

                                    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Ñîñòàâíûå îïåðàòîðû

             Ñîñòàâíûå îïåðàòîðû  çàäàþò  ïîðÿäîê  âûïîëíåíèÿ îïåðàòîðîâ,

        ÿâëÿþùèõñÿ èõ ýëåìåíòàìè. Îíè äîëæíû âûïîëíÿòüñÿ â òîì ïîðÿäêå, â

        êîòîðîì  îíè  çàïèñàíû.  Ñîñòàâíûå îïåðàòîðû îáðàáàòûâàþòñÿ,  êàê

        îäèí îïåðàòîð,  ÷òî èìååò ðåøàþùåå çíà÷åíèå  òàì,  ãäå  ñèíòàêñèñ

        Ïàñêàëÿ äîïóñêàåò èñïîëüçîâàíèå òîëüêî îäíîãî îïåðàòîðà. Îïåðàòî-

        ðû çàêëþ÷àþòñÿ â îãðàíè÷èòåëè begin è end,  è îòäåëÿþòñÿ äðóã  îò

        äðóãà òî÷êîé ñ çàïÿòîé.

 

                             ÚÄÄÄÄÄ¿       ÚÄÄÄÄÄÄÄÄ¿        ÚÄÄÄ¿

             ñîñòàâíîé  ÄÄÄÄ>³beginÃÄÄÄÄÄÄ>³îïåðàòîðÃÄÄÄÄÂÄÄ>³endÃÄÄ>

             îïåðàòîð        ÀÄÄÄÄÄÙ   ^   ÀÄÄÄÄÄÄÄÄÙ    ³   ÀÄÄÄÙ

                                       ³     ÚÄÄÄ¿       ³

                                       ÀÄÄÄÄÄ´ ; ³<ÄÄÄÄÄÄÙ

                                             ÀÄÄÄÙ

 

             Ïðèâåäåì ïðèìåð ñîñòàâíîãî îïåðàòîðà:

 

             begin

               Z := X;

               X := Y;

               Y := Z;

             end;

Óñëîâíûå îïåðàòîðû

             Óñëîâíûå îïåðàòîðû  ïîçâîëÿþò âûáðàòü äëÿ âûïîëíåíèÿ îäèí èç

        ñîñòàâíûõ îïåðàòîðîâ (èëè íå âûáðàòü íè îäíîãî).

 

                                       ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

              óñëîâíûé îïåðàòîð  ÄÄÂÄÄ>³ îïåðàòîð if   ÃÄÄÄÄÄÄÄ>

                                   ³   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ   ^

                                   ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿   ³

                                   ÀÄÄ>³ îïåðàòîð case ÃÄÄÄÙ

                                       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Îïåðàòîð óñëîâèÿ (if)

             Ñèíòàêñèñ îïåðàòîðà if ìîæíî ïðåäñòàâèòü  ñëåäóþùèì îáðàçîì:

 

                       ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄÄ¿   ÚÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿

         îïåðàòîð if Ä>³ifÃÄÄ>³âûðàæåíèåÃÄÄ>³thenÃÄÄ>³îïåðàòîðÃÄÄÂÄÄ¿

                       ÀÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÙ   ÀÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÙ  ³  ³

                                        ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  ³

                                        ³   ÚÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿     v

                                        ÀÄÄ>³elseÃÄÄ>³îïåðàòîðÃÄÄÄÄÄÄÄÄÄ>

                                            ÀÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÙ

 

              âûðàæåíèè äîëæåí ïîëó÷àòüñÿ ðåçóëüòàò, èìåþùèé ñòàíäàðòíûé

        áóëåâñêèé òèï.  Åñëè ðåçóëüòàòîì âûðàæåíèÿ ÿâëÿåòñÿ èñòèííîå çíà-

        ÷åíèå (True), òî âûïîëíÿåòñÿ îïåðàòîð, ñëåäóþùèé çà êëþ÷åâûì ñëî-

        âîì then.

 

             Åñëè ðåçóëüòàòîì  âûðàæåíèÿ  ÿâëÿåòñÿ  çíà÷åíèå False è ïðè-

        ñóòñòâóåò êëþ÷åâîå ñëîâî else,  òî âûïîëíÿòñÿ îïåðàòîð, ñëåäóþùèé

        çà êëþ÷åâûì ñëîâîì else. Åñëè êëþ÷åâîå ñëîâî else îòñóòñòâóåò, òî

        íèêàêîé îïåðàòîð íå âûïîëíÿåòñÿ.

 

             Ñèíòàêñè÷åñêàÿ íåîäíîçíà÷íîñòü, âîçíèêàþùàÿ â êîíñòðóêöèè:

 

             if e1 then e2 else e3

 

        ðàçðåøàåòñÿ ïóòåì ñëåäóþùåé èíòåðïðåòàöèè ýòîé êîíñòðóêöèè:

 

             if e1 then

             begin

               if e2 then

                  s1

               else

                  s2

             end

 

                   Ïðèìå÷àíèå:   ïðåäøåñòâóþùåì îïåðàòîðå else äâîåòî÷èå

              íå óêàçûâàåòñÿ.

 

              îáùåì ñëó÷àå êëþ÷åâîå ñëîâî else ñâÿçûâàåòñÿ  ñ  áëèæàéøèì

        êëþ÷åâûì  ñëîâîì  if,  êîòîðîå  åùå  íå ñâÿçàíî ñ êëþ÷åâûì ñëîâîì

        else.

 

             Ïðèâåäåì äâà ïðèìåðà îïåðàòîðà if:

 

              if X < 1.5 then

                Z := X+Y

              else

                Z := 1.5;

 

               if P1 <> nil then

                 P1 := P1^.father;

Îïåðàòîð âàðèàíòà (case)

             Îïåðàòîð âàðèàíòà  (caså) ñîñòîèò èç âûðàæåíèÿ (ïåðåêëþ÷àòå-

        ëÿ) è ñïèñêà îïåðàòîðîâ, êàæäîìó èç êîòîðûõ ïðåäøåñòâóåò îäíà èëè

        áîëåå êîíñòàíò (îíè íàçûâàþòñÿ êîíñòàíòàìè âûáîðà)  èëè  êëþ÷åâîå

        ñëîâî else.  Ïåðåêëþ÷àòåëü (ñåëåêòîð) äîëæåí èìåòü ïîðÿäêîâûé òèï

        (ðàçìåðîì â áàéò èëè ñëîâî). Òàêèì îáðàçîì, ñòðîêîâûé òèï è äëèí-

        íûé  öåëûé  òèï ÿâëÿþòñÿ íåäîïóñòèìûìè òèïàìè ïåðåêëþ÷àòåëÿ.  Âñå

        êîíñòàíòû âûáîðà äîëæíû áûòü óíèêàëüíûìè è èìåòü ïîðÿäêîâûé  òèï,

        ñîâìåñòèìûé ñ òèïîì ïåðåêëþ÷àòåëÿ.

 

                         ÚÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄ¿   ÚÄÄ¿      ÚÄÄÄÄ¿

         îïåðàòîð case Ä>³caseÃÄÄ>³âûðàæåíèåÃÄÄ>³ofÃÄÄÄÄÄ>³caseÃÄÄÂÄÄ¿

                         ÀÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÙ   ÀÄÄÙ  ^   ÀÄÄÄÄÙ  ³  ³

                                                      ³   ÚÄÄÄÄ¿  ³  ³

                                                      ÀÄÄÄ´ ;  ³<ÄÙ  ³

                                                          ÀÄÄÄÄÙ     ³

                             ÚÄÄÄÄÄÄÄÄÄÄÙ

                             ³                                  ÚÄÄÄ¿

                             ÀÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄ>³endÃÄÄ>

                               ³   ÚÄÄÄÄÄÄÄÄÄÄ¿  ^  ³  ÚÄÄÄ¿  ^ ÀÄÄÄÙ

                               ÀÄÄ>³âåòâü elseÃÄÄÙ  ÀÄ>³ ; ÃÄÄÙ

                                   ÀÄÄÄÄÄÄÄÄÄÄÙ        ÀÄÄÄÙ

 

                             ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

                 ÚÄÄÄÄÄÄÄÄÄ¿ ³  ÚÄÄ¿  ÚÄÄÄÄÄÄÄÄÄ¿ v   ÚÄÄÄ¿  ÚÄÄÄÄÄÄÄÄ¿

         case ÄÄ>³êîíñòàíòàÃÄÁÄ>³..ÃÄ>³êîíñòàíòàÃÄÄÂÄ>³ : ÃÄ>³îïåðàòîðÃÄ>

              ^  ÀÄÄÄÄÄÄÄÄÄÙ    ÀÄÄÙ  ÀÄÄÄÄÄÄÄÄÄÙ  ³  ÀÄÄÄÙ  ÀÄÄÄÄÄÄÄÄÙ

              ³                 ÚÄÄÄ¿              ³

              ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ , ³<ÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

                                ÀÄÄÄÙ

 

                         ÚÄÄÄÄ¿    ÚÄÄÄÄÄÄÄÄ¿

         âåòâü else ÄÄÄÄ>³elseÃÄÄÄ>³îïåðàòîðÃÄÄÄ>

                         ÀÄÄÄÄÙ    ÀÄÄÄÄÄÄÄÄÙ

 

             Îïåðàòîð âàðèàíòà case ïðèâîäèò ê âûïîëíåíèþ îïåðàòîðà,  êî-

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

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

        ÷àòåëÿ.  Åñëè òàêîé êîíñòàíòû âûáîðà èëè òàêîãî äèàïàçîíà  âûáîðà

        íå ñóùåñòâóåò è ïðèñóòñòâóåò âåòâü else,  òî âûïîëíÿòñÿ îïåðàòîð,

        ñëåäóþùèé çà êëþ÷åâûì ñëîâîì else.  Åñëè æå âåòâü else îòñóòñòâó-

        åò, òî íèêàêîé îïåðàòîð íå âûïîëíÿåòñÿ.

             Ïðèâåäåì íåêîòîðûå ïðèìåðû îïåðàòîðà âàðèàíòà:

 

             case Operator of

               plus:   X := X+Y;

               minus:  X := X-Y;

               times:  X := X*Y;

             end;

 

             case I of

                  0, 2, 4, 6, 8: Writeln('×åòíàÿ öèôðà');

                  1, 3, 5, 7, 9: Writeln('Íå÷åòíàÿ öèôðà');

                  10..100: Writeln('Ìåæäó 10 è 100');

             end;

Îïåðàòîð öèêëà

             Îïåðàòîð öèêëà çàäàåò ïîâòîðíîå âûïîëíåíèå îïðåäåëåííûõ îïå-

        ðàòîðîâ.

 

                                        ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

                 îïåðàòîð öèêëà  ÄÄÄÂÄÄ>³ îïåðàòîð repeat ÃÄÄÄÄÄÄ>

                                    ³   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  ^

                                    ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  ³

                                    ÃÄÄ>³ îïåðàòîð while  ÃÄÄ´

                                    ³   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  ³

                                    ³   ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿  ³

                                    ÀÄÄ>³ îïåðàòîð  for   ÃÄÄÙ

                                        ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

             Åñëè ÷èñëî ïîâòîðåíèé çàðàíåå èçâåñòíî,  òî ïîäõîäÿùåé êîíñ-

        òðóêöèé ÿâëÿåòñÿ îïåðàòîð for.  ïðîòèâíîì ñëó÷àå ñëåäóåò èñïîëü-

        çîâàòü îïåðàòîðû while èëè repeat.

 

             Äëÿ óïðàâëåíèÿ  ïîâòîðåíèåì  îïåðàòîðîâ  ìîæíî  èñïîëüçîâàòü

        ñòàíäàðòíûå ïðîöåäóðû Break è Continue.  Break çàâåðøàåò îïåðàòîð

        öèêëà, à Continue ïðîäîëæàåò ñî ñëåäóþùåé èòåðàöèè ýòîãî îïåðàòî-

        ðà. Ïîäðîáíîñòè âû ìîæåòå íàéòè â Ãëàâå 1 "Ñïðàâî÷íîãî  ðóêîâîäñ-

        òâà ïðîãðàììèñòà".

Îïåðàòîð öèêëà ñ ïîñòóñëîâèåì (repeat)

              îïåðàòîðå  öèêëà  ñ  ïîñòóñëîâèåì  (íà÷èíàþùèìñÿ  ñî ñëîâà

        repeat) âûðàæåíèå, êîòîðîå óïðàâëÿåò ïîâòîðíûì âûïîëíåíèåì ïîñëå-

        äîâàòåëüíîñòè îïåðàòîðîâ ñîäåðæèòñÿ âíóòðè îïåðàòîðà repeat.

 

                    ÚÄÄÄÄÄÄ¿     ÚÄÄÄÄÄÄÄÄ¿     ÚÄÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄ¿

         îïåðàòîð Ä>³repeatÃÄÄÄÄ>³îïåðàòîðÃÄÄÂÄ>³untilÃÄÄ>³âûðàæåíèåÃÄÄ>

         repeat     ÀÄÄÄÄÄÄÙ  ^  ÀÄÄÄÄÄÄÄÄÙ  ³  ÀÄÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÙ

                              ³    ÚÄÄÄ¿     ³

                              ÀÄÄÄÄ´ ; ³<ÄÄÄÄÙ

                                   ÀÄÄÄÙ

 

             Ðåçóëüòàò âûðàæåíèÿ äîëæåí áûòü áóëåâñêîãî òèïà.  Îïåðàòîðû,

        çàêëþ÷åííûå  ìåæäó êëþ÷åâûìè ñëîâàìè repeat è until,  âûïîëíÿþòñÿ

        ïîñëåäîâàòåëüíî äî òåõ ïîð,  ïîêà ðåçóëüòàò âûðàæåíèÿ  íå  ïðèìåò

        çíà÷åíèå True.  Ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ âûïîëíèòñÿ ïî êðàé-

        íåé ìåðå îäèí ðàç,  ïîñêîëüêó âû÷èñëåíèå  âûðàæåíèÿ  ïðîèçâîäèòñÿ

        ïîñëå êàæäîãî âûïîëíåíèÿ ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ.

             Ïðèâåäåì ïðèìåðû îïåðàòîðà öèêëà ñ ïîñòóñëîâèåì:

 

             repeat

               K := I mod J;

               I := J;

               J := K;

             until J = 0;

 

             repeat

               Write('Ââåäèòå çíà÷åíèå (0..9):');

               Readln(I);

             until (I >= 0) and (I <= 9);

Îïåðàòîðû öèêëà ñ ïðåäóñëîâèåì (while)

             Îïåðàòîð öèêëà ñ ïðåäóñëîâèåì (íà÷èíàþùèéñÿ ñ êëþ÷åâîãî ñëî-

        âà while) ñîäåðæèò â ñåáå âûðàæåíèå,  êîòîðîå óïðàâëÿåò ïîâòîðíûì

        âûïîëíåíèåì  îïåðàòîðà (êîòîðûé ìîæåò áûòü ñîñòàâíûì îïåðàòîðîì).

 

                      ÚÄÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄ¿   ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿

         îïåðàòîð ÄÄÄ>³whileÃÄÄ>³âûðàæåíèåÃÄÄ>³doÃÄÄ>³îïåðàòîðÃÄÄ>

         while        ÀÄÄÄÄÄÙ   ÀÄÄÄÄÄÄÄÄÄÙ   ÀÄÄÙ   ÀÄÄÄÄÄÄÄÄÙ

 

             Âûðàæåíèå, ñ ïîìîùüþ êîòîðîãî îñóùåñòâëÿåòñÿ óïðàâëåíèå ïîâ-

        òîðåíèåì îïåðàòîðà,  äîëæíî èìåòü áóëåâñêèé òèï.  Âû÷èñëåíèå  åãî

        ïðîèçâîäèòñÿ  äî  òîãî,  êàê  âíóòðåííèé îïåðàòîð áóäåò âûïîëíåí.

        Âíóòðåííèé îïåðàòîð âûïîëíÿòñÿ ïîâòîðíî äî òåõ ïîð,  ïîêà âûðàæå-

        íèå ïðèíèìàåò çíà÷åíèå Òruå.  Åñëè âûðàæåíèå ñ ñàìîãî íà÷àëà ïðè-

        íèìàåò çíà÷åíèå False, òî îïåðàòîð, ñîäåðæàùèéñÿ âíóòðè îïåðàòîðà

        öèêëà ñ ïðåäóñëîâèåì, íå âûïîëíÿåòñÿ.

 

             Ïðèìåðàìè îïåðàòîðîâ öèêëà ñ ïðåäóñëîâèåì ìîãóò ñëóæèòü ñëå-

        äóþùèå îïåðàòîðû:

 

             while Data[I] <> X do I := I + 1;

 

             While I > 0 do

             begin

               if Odd(I) then Z := Z * X;

               I := I div 2;

               X := Sqr(X);

             end;

 

             while not Eof(InFile) do

             begin

               Readln(InFile,Line);

               Process(Line);

             end;

Îïåðàòîðû öèêëà ñ ïàðàìåòðîì (for)

             Îïåðàòîðû öèêëà ñ ïàðàìåòðîì (êîòîðûå  íà÷èíàþòñÿ  ñî  ñëîâà

        for)  âûçûâàåò  ïîâòîðÿþùååñÿ âûïîëíåíèå îïåðàòîðà (êîòîðûé ìîæåò

        áûòü ñîñòàâíûì îïåðàòîðîì) ïîêà óïðàâëÿþùåé ïåðåìåííîé ïðèñâàèâà-

        åòñÿ âîçðàñòàþùàÿ ïîñëåäîâàòåëüíîñòü çíà÷åíèé.

 

                      ÚÄÄÄ¿   ÚÄÄÄÄÄÄÄÄÄÄÄ¿   ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿

         îïåðàòîð ÄÄÄ>³forÃÄÄ>³óïðàâëÿþùàÿÃÄÄ>³:=ÃÄÄ>³èñõîäíîåÃÄÄÄ¿

         for          ÀÄÄÄÙ   ³ïåðåìåííàÿ ³   ÀÄÄÙ   ³çíà÷åíèå³   ³

                              ÀÄÄÄÄÄÄÄÄÄÄÄÙ          ÀÄÄÄÄÄÄÄÄÙ   ³

                 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

                 ³      ÚÄÄ¿

                 ³   ÚÄ>³toÃÄÄÄÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿   ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿

                 ÀÄÄÄ´  ÀÄÄÙ     ÃÄÄ>³êîíå÷íîåÃÄÄ>³doÃÄÄ>³îïåðàòîðÃÄÄÄ>

                     ³  ÚÄÄÄÄÄÄ¿ ³   ³çíà÷åíèå³   ÀÄÄÙ   ÀÄÄÄÄÄÄÄÄÙ

                     ÀÄ>³downtoÃÄÙ   ÀÄÄÄÄÄÄÄÄÙ

                        ÀÄÄÄÄÄÄÙ

 

                                    ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

         óïðàâëÿþùàÿ ïåðåìåííàÿ ÄÄÄ>³èäåíòèôèêàòîð ïåðåìåííîéÃÄÄÄ>

                                    ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

                                 ÚÄÄÄÄÄÄÄÄÄ¿

         èñõîäíîå çíà÷åíèå  ÄÄÄÄ>³âûðàæåíèåÃÄÄÄ>

                                 ÀÄÄÄÄÄÄÄÄÄÙ

 

                                 ÚÄÄÄÄÄÄÄÄÄ¿

         êîíå÷íîå çíà÷åíèå  ÄÄÄÄ>³âûðàæåíèåÃÄÄÄ>

                                 ÀÄÄÄÄÄÄÄÄÄÙ

 

              êà÷åñòâå   óïðàâëÿþùåé  ïåðåìåííîé  äîëæåí  èñïîëüçîâàòüñÿ

        èäåíòèôèêàòîð ïåðåìåíîé (áåç êàêîãî-ëèáî  êâàëèôèêàòîðà), êîòîðûé

        îáîçíà÷àåò ïåðåìåííóþ,  îáúÿâëåííóþ ëîêàëüíîé â áëîêå,  â êîòîðîì

        ñîäåðæèòñÿ îïåðàòîð for.  Óïðàâëÿþùàÿ ïåðåìåííàÿ äîëæíà èìåòü ïå-

        ðå÷èñëèìûé  òèï.  Íà÷àëüíîå è êîíå÷íîå çíà÷åíèÿ äîëæíû èìåòü òèï,

        ñîâìåñòèìûé ïî ïðèñâàèâàíèþ ñ ïåðå÷èñëèìûì òèïîì.

 

                   Ïðèìå÷àíèå: Î ëîêàëüíîñòè è îáëàñòè äåéñòâèÿ ðàññêàçû-

              âàåòñÿ â Ãëàâå 8.

 

             Êîãäà íà÷èíàåò âûïîëíÿòüñÿ îïåðàòîð for,  íà÷àëüíîå è êîíå÷-

        íîå çíà÷åíèÿ îïðåäåëÿþòñÿ îäèí ðàç, è ýòè çíà÷åíèÿ ñîõðàíÿþòñÿ íà

        ïðîòÿæåíèè âñåãî âûïîëíåíèÿ îïåðàòîðà for.

 

             Îïåðàòîð, êîòîðûé ñîäåðæèòñÿ â òåëå îïåðàòîðà for,  âûïîëíÿ-

        åòñÿ  îäèí ðàç äëÿ êàæäîãî çíà÷åíèÿ â äèàïàçîíå ìåæäó íà÷àëüíûì è

        êîíå÷íûì çíà÷åíèåì. Óïðàâëÿþùàÿ ïåðåìåííàÿ âñåãäà èíèöèàëèçèðóåò-

        ñÿ íà÷àëüíûì çíà÷åíèåì. Êîãäà ðàáîòàåò îïåðàòîð for, çíà÷åíèå óï-

        ðàâëÿþùåé ïåðåìåííîé (ñ÷åò÷èêà öèêëîâ) óâåëè÷èâàåòñÿ  ïðè  êàæäîì

        ïîâòîðåíèè íà åäèíèöó. Åñëè íà÷àëüíîå çíà÷åíèå ïðåâûøàåò êîíå÷íîå

        çíà÷åíèå, òî ñîäåðæàùèéñÿ â òåëå îïåðàòîðà for îïåðàòîð íå âûïîë-

        íÿòñÿ.  Êîãäà  â  îïåðàòîðå  öèêëà  èñïîëüçóåòñÿ  êëþ÷åâîå  ñëîâî

        downto,  çíà÷åíèå óïðàâëÿþùåé ïåðåìåííîé óìåíüøàåòñÿ  ïðè  êàæäîì

        ïîâòîðåíèè íà åäèíèöó.  Åñëè íà÷àëüíîå çíà÷åíèå â òàêîì îïåðàòîðå

        ìåíüøå,  ÷åì êîíå÷íîå çíà÷åíèå,  òî ñîäåðæàùèéñÿ â òåëå îïåðàòîðà

        öèêëà îïåðàòîð íå âûïîëíÿòñÿ.

 

             Åñëè îïåðàòîð,  ñîäåðæàùèéñÿ â òåëå îïåðàòîðà for,  èçìåíÿåò

        çíà÷åíèå óïðàâëÿþùåé ïåðåìåííîé,  òî ýòî ÿâëÿåòñÿ îøèáêîé.  Ïîñëå

        âûïîëíåíèÿ  îïåðàòîðà  for çíà÷åíèå óïðàâëÿþùåé ïåðåìåííîé ñòàíî-

        âèòñÿ íåîïðåäåëåííûì, åñëè òîëüêî âûïîëíåíèå îïåðàòîðà for íå áû-

        ëî ïðåðâàíî ñ ïîìîùüþ îïåðàòîðà ïåðåõîäà.

 

             Åñëè ïðèíÿòü âî âíèìàíèå ýòè îãðàíè÷åíèÿ, òî îïåðàòîð

 

             for V := Expr1 to Expr2 do Body;

 

        ýêâèâàëåíòåí îïåðàòîðó:

 

             begin

               Temp1 := Expr1;

               Temp2 := Expr2;

             if Temp1 <= Temp2 then

             begin

               V := Temp1;

               Body;

                while V <> Temp2 do

                begin

                  V := Succ(V);

                  Body;

                end;

              end;

             end;

 

        è îïåðàòîð öèêëà:

 

             for V := Expr1 downto Exp2 do Body;

 

        ýêâèâàëåíòåí îïåðàòîðàì:

 

             begin

               Temp1 := Expr1;

               Temp2 := Expr2;

               if Temp1 >= Temp2 then

              begin

                 V := Temp1;

                 Body;

                 while V <> Temp2 o

                 begin

                   V := Pred(V);

                   Body;

                 end;

               end;

              end;

        ãäå Temp1 è Temp2 - âñïîìîãàòåëüíûå ïåðåìåííûå,  òèï êîòîðûõ ñîâ-

        ïàäàåò ñ îñíîâíûì òèïîì ïåðåìåííîé V è êîòîðûå íå  âñòðå÷àþòñÿ  â

        äðóãîì ìåñòå ïðîãðàììû.

 

             Ïðèâåäåì ïðèìåðû îïåðàòîðà öèêëà ñ ïàðàìåòðîì:

 

             for I := 2 to 63 do

               if Data[I] > Max then Max := Data[I]

 

             for I := 1 to 10 do

               for J := 1 to 10 do

               begin

                 X := 0;

                 for K := 1 to 10 do

                   X := X + Mat1[I,K]*Mat2[K,J];

                 Mat[I,J] := X;

               end;

 

              for C := red to blue do Check(C);

Îïåðàòîð with

                                 

             Â îïåðàöèÿõ íàä çàïèñÿìè îïåðàòîð with  óäîáíî  èñïîëüçîâàòü

        äëÿ  êðàòêîãî îáðàùåíèÿ ê ïîëÿì çàïèñè.  Â îïåðàòîðå with ê ïîëÿì

        îäíîé èëè áîëåå êîíêðåòíûõ ïåðåìåííûõ òèïà çàïèñü ìîæíî îáðàùàòü-

        ñÿ,  èñïîëüçóÿ  òîëüêî èäåíòèôèêàòîðû ïîëåé.  Îïåðaòîð with èìååò

        ñëåäóþùèé ñèíòàêñèñ:

 

                     ÚÄÄÄÄ¿      ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿     ÚÄÄ¿   ÚÄÄÄÄÄÄÄÄ¿

         îïåðàòîð ÄÄ>³withÃÄÄÄÄÄ>³   ññûëêà íà   ÃÄÄÂÄ>³doÃÄÄ>³îïåðàòîðÃ>

         with        ÀÄÄÄÄÙ  ^   ³ïåðåìåííóþ òèïà³  ³  ÀÄÄÙ   ÀÄÄÄÄÄÄÄÄÙ

                             ³   ³    çàïèñü     ³  ³

                             ³   ³  èëè îáúåêò   ³  ³

                             ³   ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ  ³

                             ³        ÚÄÄÄ¿         ³

                             ÀÄÄÄÄÄÄÄÄ´ , ³<ÄÄÄÄÄÄÄÄÙ

                                      ÀÄÄÄÙ

 

         ññûëêà íà ïåðåìåííóþ        ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿

         òèïà çàïèñü èëè îáúåêò  ÄÄÄ>³ññûëêà íà ïåðåìåííóþÃÄÄ>

                                     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

 

             Âîçüìåì ñëåäóþùåå îïèñàíèå:

 

             type

               TDate = record

                    Day   : Integer:

                    Month : Integer;

                    Year  : Integer:

               end;

 

             var OrderDate: TDate;

 

             Ñ ó÷åòîì äàííîãî îïèñàíèÿ ïðèâåäåì ïðèìåð îïåðàòîðà with:

 

             with OrderDate do

               if Month = 12 then

               begin

                 Month := 1;

                 Year := Year + 1

               end else

                 Month := Month + 1;

 

             Ýòî ýêâèâàëåíòíî ñëåäóþùåìó:

 

             if OrderDate.Month = 12 then

             begin

               OrderDate.Month := 1;

               OrderDate.Year := TDate.Year + 1

             end

             else

               Date.month := TDate.Month + 1;

 

         B.Pascal 7 & Objects/LR     - 132 -

 

 

              îïåðàòîðå with ñíà÷àëà ïðîèçâîäèòñÿ ïðîâåðêà êàæäîé ññûëêè

        íà ïåðåìåííóþ,  à èìåííî:  ìîæíî ëè åå èíòåðïðåòèðîâàòü, êàê ïîëå

        çàïèñè. Åñëè ýòî òàê, òî îíà âñåãäà èíòåðïðåòèðóåòñÿ èìåííî òàêèì

        îáðàçîì, äàæå åñëè èìååòñÿ äîñòóï ê ïåðåìåííîé ñ òåì æå èìåíåì.

 

             Äîïóñòèì îïèñàíû ñëåäóþùèå ïåðåìåííûå:

 

            type

              TPoint = record

                        x,y: Integer;

                      end;

              var

                x: Point;

                y: Integer;

 

              ýòîì ñëó÷àå è ê x,  è ê y ìîæíî îáðàùàòüñÿ, êàê ê ïåðåìåí-

        íîé èëè êàê ê ïîëþ çàïèñè. Â îïåðàòîðå:

 

            with x do

            begin

              x := 10;

              y := 25;

            end;

 

        x ìåæäó  êëþ÷åâûìè  ñëîâàìè with è dî îòíîñèòñÿ ê ïåðåìåííîé òèïà

        óêàçàòåëü,  à â ñîñòàâíîì îïåðàòîðå x è y ññûëàþòñÿ íà x.x è y.y.

 

             Îïåðàòîð:

 

             with V1,V2,...Vn do s;

 

        ýêâèâàëåíòåí îïåðàòîðàì:

 

             with V1 do

               with V2 do

                ...

                  with Vn do

                   S;

 

              îáîèõ ñëó÷àÿõ,  åñëè Vn ÿâëÿåòñÿ ïîëåì è v1,  è v2, òî îíà

        èíòåðïðåòèðóåòñÿ êàê v2.Vn, à íå êàê v1.Vn.

 

             Åñëè âûáîðêà ïåðåìåííîé òèïà çàïèñü ñâÿçàíà ñ èíäåêñèðîâàíè-

        åì ìàññèâà èëè ðàçûìåíîâàíèåì óêàçàòåëÿ, òî ýòè äåéñòâèÿ ïðîèçâî-

        äÿòñÿ äî òîãî, êàê áóäåò âûïîëíÿòüñÿ ñîñòàâíîé îïåðàòîð.