Ñòðóêòóðíûå òèïû äàííûõ Êàê è â áîëüøèíñòâå èìïåðàòèâíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ, â Pascal èìåþòñÿ ñòðóêòóðíûå òèïû äàííûõ; îáû÷íî, äëÿ îáîçíà÷åíèÿ ýòîãî ïîíÿòèÿ â ÿçûêå Pascal èñïîëüçóåòñÿ òåðìèí èç òåîðèè áàç äàííûõ çàïèñè. Çàïèñè ïîõîæè íà ìàññèâû òåì, ÷òî ïîçâîëÿþò îáúåäèíÿòü ïîä îäíèì èìåíåì ïåðåìåííîé íåñêîëüêî ïåðåìåííûõ. Íà ýòîì, îäíàêî, ñõîäñòâî ñ ìàññèâàìè è çàêàí÷èâàåòñÿ.  îòëè÷èå îò ìàññèâîâ, îáúåäèíÿåìûå â îäíó çàïèñü ïåðåìåííûå ìîãóò èìåòü ðàçíûå òèïû, è äîñòóï ê íèì, â îòëè÷èå îò ìàññèâîâ, ïðîèñõîäèò ñ èñïîëüçîâàíèåì ñïåöèàëüíûõ èäåíòèôèêàòîðîâ, à íå íîìåðîâ. Ñèíòàêñèñ îïèñàíèÿ çàïèñè âûãëÿäèò ñëåäóþùèì îáðàçîì: record îïèñàíèå ïîëåé end Ïîä ïîëÿìè çàïèñè (òîæå òåðìèí èç òåîðèè áàç äàííûõ) ïîíèìàþòñÿ òå ïåðåìåííûå, êîòîðûå îáúåäèíÿþòñÿ â çàïèñü. Îïèñàíèå ïîëåé âûãëÿäèò òàê æå, êàê è îïèñàíèå îáû÷íûõ ïåðåìåííûõ â ðàçäåëå var ïðîãðàììû, ïðîöåäóðû èëè ôóíêöèè. Íàïðèìåð, êàê èçâåñòíî èç ìàòåìàòèêè, êîìïëåêñíîå ÷èñëî ìîæíî ïîíèìàòü êàê ïàðó âåùåñòâåííûõ. Êîíå÷íî, ìîæíî çàâîäèòü ïî äâå âåùåñòâåííûå ïåðåìåííûå äëÿ êàæäîãî êîìïëåêñíîãî ÷èñëà, èñïîëüçóåìîãî â ïðîãðàììå, íî ãîðàçäî óäîáíåå îïèñàòü ñòðóêòóðíûé òèï äàííûõ ¾êîìïëåêñíîå ÷èñëî¿: type Complex = record re, im: real end; Êàæäàÿ ïåðåìåííàÿ òîëüêî ÷òî îïèñàííîãî òèïà ñîñòîèò èç äâóõ âåùåñòâåííûõ ïåðåìåííûõ ñ èìåíàìè re è im. Åñëè ìû çàâåäåì òåïåðü ïåðåìåííóþ z òèïà Complex, íàïèñàâ var z: Complex; ìû íà ñàìîì äåëå ïîëó÷èì äâå âåùåñòâåííûå ïåðåìåííûå ñ èìåíàìè z.re è z.im. Ðàáîòàòü ñ ýòèìè ïåðåìåííûìè ìîæíî âïîëíå òàêæå, êàê è ñ îáû÷íûìè âåùåñòâåííûìè ïåðåìåííûìè, ò. å. ìû ìîæåì ïðèñâàèâàòü èì âåùåñòâåííûå ÷èñëà, ñ÷èòûâàòü èõ çíà÷åíèÿ ïðè ïîìîùè îïåðàòîðîâ ââîäà, èëè èñïîëüçîâàòü èõ çíà÷åíèÿ â âûðàæåíèÿõ èëè îïåðàòîðàõ âûâîäà. Òåïåðü óìåñòåí âîïðîñ: ãäå æå óäîáñòâî? Íà ïåðâûé âçãëÿä, ñèòóàöèÿ òîëüêî óõóäøèëàñü: ìû íàïèñàëè íåñêîëüêî ëèøíèõ ñòðîê êîäà è â ðåçóëüòàòå ïîëó÷èëè òå æå ïåðåìåííûå, íî ñ äëèííûìè, ñîñòàâíûìè èìåíàìè. Îòâåò íà ýòîò âîïðîñ ñîñòîèò â ñëåäóþùåì: óäîáñòâî òàêîãî ïîäõîäà íà÷èíàåòñÿ, êîãäà ìû íà÷íåì ïåðåäàâàòü íàøè ïåðåìåííûå â ôóíêöèè â êà÷åñòâå ïàðàìåòðîâ. Äåëî â òîì, ÷òî ïåðåìåííûå òèïà ¾çàïèñè¿ ìîæíî ïåðåäàâàòü â ôóíêöèè è ïðîöåäóðû, ðàâíî êàê è âîçâðàùàòü èõ èç ôóíêöèé, ðîâíî òàêæå, êàê è îáû÷íûå, íå ñòðóêòóðíûå (èëè, êàê åùå ãîâîðÿò, ñêàëÿðíûå) ïåðåìåííûå, ñêàæåì, öåëîãî èëè âåùåñòâåííîãî òèïà.  èòîãå, ïîëó÷åííûé êîä ðåçêî óïðîùàåòñÿ. Äëÿ ñðàâíåíèÿ ìîæíî ïðèâåñòè äâà âàðèàíòà îðãàíèçàöèè ñóììû òðåõ êîìïëåêñíûõ ÷èñåë: { --- áåç çàïèñåé --- } procedure add1(r1, i1, r2, i2 :real; var r, i:real); begin r := r1 + r2; i := i1 + i2 end; ... { íóæíî ñëîæèòü òðè êîìïëåêñíûõ ÷èñëà: a + b i, c + d i è e + f i; ðåçóëüòàò çàïèñûâàåòñÿ â g + h i ïîíàäîáÿòñÿ äâå âñïîìîãàòåëüíûå âåùåñòâåííûå ïåðåìåííûå x è y } add1(a, b, c, d, x, y); add1(x, y, e, f, g, h); { --- ñ çàïèñÿìè --- } function add2(z1, z2: Complex):Complex; var res:Complex; begin res.re := z1.re + z2.re; res.im := z1.im + z2.im; end; { íóæíî ñëîæèòü òðè êîìïëåêñíûõ ÷èñëà: z1, z2 è z3; ðåçóëüòàò çàïèñûâàåòñÿ â z4 âñïîìîãàòåëüíûå ïåðåìåííûå íå ïîíàäîáÿòñÿ } z4 := add2( add2(z1,z2), z3 ); Âòîðîé âàðèàíò íåçíà÷èòåëüíî òðóäíåå â ðåàëèçàöèè, íî çàòî ìíîãî ïðîùå â èñïîëüçîâàíèè. Êîíå÷íî, ìîæíî áûëî áû âîçðàçèòü, ÷òî òðóäíîñòè â ïåðâîì âàðèàíòå íàäóìàííûå, äëÿ ðåøåíèÿ çàäà÷è äîñòàòî÷íî íàïèñàòü g := a+c+e; h := b+d+f; âîîáùå áåç âñÿêèõ ôóíêöèé èëè ïðîöåäóð, îäíàêî òðóäíîñòè òàêîãî ïîäõîäà ðåçêî âîçðàñòàþò ïðè óñëîæíåíèè òîé îïåðàöèè, êîòîðóþ íóæíî âû÷èñëÿòü (íàïðèìåð, âî ÷òî ïðåâðàòèòñÿ ýòîò ïîäõîä, åñëè íóæíî âû÷èñëèòü íå ñóììó, à, ñêàæåì, ïðîèçâåäåíèå òðåõ êîìïëåêñíûõ ÷èñåë? À ÷åòûðåõ?). Âîîáùå, íàëè÷èå âîçìîæíîñòè îáúÿâëÿòü ñòðóêòóðíûå òèïû äàííûõ ïîçâîëÿåò ðàçðàáàòûâàòü ïðîãðàììû íå â òåðìèíàõ óñòðîéñòâà êîìïüþòåðà (ÿ÷åéêè ïàìÿòè, ìàøèííûå êîìàíäû), è äàæå íå â òåðìèíàõ ÿçûêà ïðîãðàììèðîâàíèÿ (öåëûå, âåùåñòâåííûå ïåðåìåííûå), à â òåðìèíàõ çàäà÷è (â íàøåì ïðèìåðå êîìïëåêñíûå ÷èñëà). Òàêîé ïîäõîä íàçûâàåòñÿ àáñòðàêöèåé äàííûõ, è îí ðåçêî óïðîùàåò ïðîöåññ ïðîãðàììèðîâàíèÿ, îñîáåííî ïðèêëàäíûõ çàäà÷. Íàïðèìåð, åñëè íàì íóæíî íàïèñàòü ïðîãðàììó äëÿ ó÷åòà àâòîìîáèëåé â àâòîìàãàçèíå, ìû ìîæåì îïðåäåëèòü íàáîð ñâîéñòâ àâòîìîáèëÿ, èíòåðåñóþùèõ ïîòåíöèàëüíûõ êëèåíòîâ, è èñõîäÿ èç ýòîãî íàáîðà ñâîéñòâ îïðåäåëèòü ñòðóêòóðíûé òèï äàííûõ, îïèñûâàþùèé àâòîìîáèëü: type Car = record vendor, model, color:string; id, price:integer; volume, power:real end; Äàëåå ìû ìîæåì óæå ïðîãðàììèðîâàòü â òåðìèíàõ ¾àâòîìîáèëåé¿, íàïðèìåð, îïèñàòü ìàññèâ èç ïåðåìåííûõ òèïà òîëüêî ÷òî ñîçäàííîé ñòðóêòóðû: type Stock = array of Car; Åñëè ìû òåïåðü îïèøåì ïåðåìåííóþ òèïà Stock, íàïðèìåð òàê: var st:Stock; òî âûðàæåíèå âèäà st[3] áóäåò èìåòü òèï Car (ýòî âûðàæåíèå ìîæíî èñïîëüçîâàòü âåçäå, ãäå íóæåí òèï Car, íàïðèìåð, â ïðèñâàèâàíèÿõ èëè âûçîâàõ ôóíêöèé èëè ïðîöåäóð). Äîáðàòüñÿ äî êîíêðåòíûõ ïîëåé ýòîé çàïèñè ìîæíî, êàê îáû÷íî, âûðàæåíèåì âèäà st[3].model. Òàêæå, ìû ìîæåì äàæå îïèñàòü ñòðóêòóðíûé òèï ¾àâòîìàãàçèí¿, èìåþùèé ïîëÿ òèïà ¾ìàññèâ àâòîìîáèëåé¿, êîëè÷åñòâî àâòîìîáèëåé â íàëè÷èè, è ò. ä., ïîñêîëüêó òèïû ïîëåé çàïèñè ìîãóò áûòü ëþáûìè, â òîì ÷èñëå äðóãèõ çàïèñåé èëè äàæå ìàññèâîâ çàïèñåé. Èñïîëüçîâàíèå îäíèõ ñòðóêòóðíûõ òèïîâ äàííûõ â êà÷åñòâå ïîëåé äðóãèõ íàçûâàåòñÿ êîìïîçèöèåé. Îäíàêî, â ÿçûêå Pascal íå äîïóñêàåòñÿ èñïîëüçîâàíèå â êà÷åñòâå òèïà ïîëÿ çàïèñè òèïà ñàìîé çàïèñè, èëè öèêëè÷åñêèõ çàâèñèìîñòåé òàêîãî ñîðòà ìåæäó òèïàìè. Íàïðèìåð, ñëåäóþùèå îáúÿâëåíèÿ òèïîâ â Pascal íåçàêîííû: type Cyclic1 = record n:integer; x:Cyclic1 end; Cyclic2 = record n:integer; x:Cyclic3 end; Cyclic3 = record n:integer; x:Cyclic2 end; Êðîìå òîãî, åñëè â íåêîòîðîì ôðàãìåíòå ïðîãðàììû ìû ÷àñòî èñïîëüçóåì ïîëÿ êàêîé-ëèáî ñòðóêòóðíîé ïåðåìåííîé, ìû ìîæåì âîñïîëüçîâàòüñÿ îïåðàòîðîì with ... do ..., ïîçâîëÿþùèì íå ïèñàòü èìÿ ñòðóêòóðíîé ïåðåìåííîé ïðè ññûëêå íà åå ïîëÿ. Íàïðèìåð, åñëè ó íàñ èìååòñÿ ïåðåìåííàÿ z òèïà Complex è ìû õîòèì ñ÷èòàòü åå ïîëÿ ñ êëàâèàòóðû, ìû âïîëíå ìîæåì íàïèñàòü ñëåäóþùåå: with z do readln(re, im);  òàêîì ôðàãìåíòå ïðîñòî re îáîçíà÷àåò z.re è ïðîñòî im îáîçíà÷àåò z.im (â êà÷åñòâå ïåðåìåííîé-âëàäåëüöà ïîëåé ïîäðàçóìåâàåòñÿ òà ñòðóêòóðíàÿ ïåðåìåííàÿ, êîòîðàÿ óêàçàíà ìåæäó with è do). Çàäà÷è. 1. Íàïèñàòü çàïèñü Drug, îïèñûâàþùóþ ëåêàðñòâî â àïòåêå.  íåì äîëæíû áûòü ñëåäóþùèå ïîëÿ: íàçâàíèå, äåéñòâóþùåå âåùåñòâî (ñòðîêè), äîçà, ôîðìà âûïóñêà (òàáëåòêè/àìïóëû/ìàçü), êîëè÷åñòâî â óïàêîâêå, öåíà óïàêîâêè, âñïîìîãàòåëüíîå ïîëå ëîãè÷åñêîãî òèïà (ïîíàäîáèòñÿ äëÿ äàëüíåéøåãî; îíî áóäåò îçíà÷àòü, èñïîëüçóåòñÿ ëè äàííàÿ çàïèñü èëè ïóñòóåò). 2. Íàïèñàòü ïðîöåäóðó, ïðèíèìàþùóþ îäèí ïàðàìåòð òèïà Drug ïî ññûëêå, çàïîëíÿþùóþ åãî ïîëÿ çíà÷åíèÿìè, ââåäåííûìè ñ êëàâèàòóðû. 3. Íàïèñàòü ôóíêöèþ, ïðîâåðÿþùóþ äåéñòâóþùåå âåùåñòâî (åå ïàðàìåòðû çàïèñü òèïà Drug è ñòðîêà, è îíà ñðàâíèâàåò ýòó ñòðîêó ñ äåéñòâóþùèì âåùåñòâîì ëåêàðñòâà; åñëè îíè ñîâïàäàþò, âîçâðàùàåòñÿ true, èíà÷å false). 4. Íàïèñàòü ôóíêöèþ, îïðåäåëÿþùóþ ñòîèìîñòü åäèíèöû äåéñòâóþùåãî âåùåñòâà (åå ïàðàìåòð çàïèñü òèïà Drug, âîçâðàùàåò âåùåñòâåííîå ÷èñëî). 5. Íàïèñàòü çàïèñü Store, îïèñûâàþùóþ ñêëàä ëåêàðñòâ. Îíà äîëæíà ñîäåðæàòü ïîëÿ òèïà äèíàìè÷åñêèé ìàññèâ çàïèñåé òèïà Drug è öåëîå ÷èñëî êîëè÷åñòâî ñîáðàííûõ äåíåã. 6. Íàïèñàòü ïðîöåäóðó, èíèöèàëèçèðóþùóþ ïåðåìåííóþ òèïà Store. Îíà äîëæíà èìåòü äâà ïàðàìåòðà çàïèñü òèïà Store ïî ññûëêå è öåëîå ÷èñëî.  íåé íóæíî óñòàíîâèòü ðàçìåð äèíàìè÷åñêîãî ìàññèâà ðàâíûì öåëîìó ïàðàìåòðó, ó êàæäîãî ýëåìåíòà ýòîãî ìàññèâà óñòàíîâèòü ëîãè÷åñêîå ïîëå â false (èçíà÷àëüíî íà ñëàäå íåò ëåêàðñòâ), à òàêæå óñòàíîâèòü êîëè÷åñòâî ñîáðàííûõ äåíåã â íîëü. 7. Íàïèñàòü ïðîöåäóðó, ïðèíèìàþùóþ ëåêàðñòâî íà ñêëàä. Îíà äîëæíà èìåòü äâà ïàðàìåòðà çàïèñü òèïà Store ïî ññûëêå è òèïà Drug è èñêàòü â äèíàìè÷åñêîì ìàññèâå ïåðâîãî ïàðàìåòðà ïåðâóþ ñâîáîäíóþ ÿ÷åéêó, ò. å. òàêóþ, ó êîòîðîé âñïîìîãàòåëüíîå ëîãè÷åñêîå ïîëå èìååò çíà÷åíèå false, è çàïèñûâàòü â íåå çíà÷åíèå ñâîåãî ïàðàìåòðà òèïà Drug, ïîñëå ÷åãî ïðèñâàèâàòü ëîãè÷åñêîìó ïîëþ ýòîé ÿ÷åéêè çíà÷åíèå true. 8. Íàïèñàòü ïðîöåäóðó print ñ ïàðàìåòðàìè çàïèñþ òèïà Store è ñòðîêîé, ïå÷àòàþùóþ íàçâàíèÿ âñåõ ëåêàðñòâ íà ñêëàäå ñ óêàçàííûì äåéñòâóþùèì âåùåñòâîì. 9. Íàïèñàòü ïðîöåäóðó search ñ ïàðàìåòðàìè çàïèñþ òèïà Store è ñòðîêîé, ïå÷àòàþùóþ íàçâàíèå ëåêàðñòâà ñ ñàìîé áîëüøîé äîçîé óêàçàííîãî äåéñòâóþùåãî âåùåñòâà. 10. Íàïèñàòü ïðîöåäóðó expensive ñ ïàðàìåòðàìè çàïèñþ òèïà Store è âåùåñòâåííûì ÷èñëîì, ïå÷àòàþùóþ âñå äåéñòâóþùèå âåùåñòâà ñ öåíîé çà åäèíèöó áîëüøåé, ÷åì çíà÷åíèå âåùåñòâåííîãî ïàðàìåòðà. 11. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé êîìïëåêñíîå ÷èñëî. Äîëæíû áûòü ôóíêöèÿ, âûäàþùàÿ êîìïëåêñíîå ÷èñëî (çàïèñü òèïà Complex) ïî âåùåñòâåííîé è ìíèìîé ÷àñòè, àðèôìåòè÷åñêèå îïåðàöèè, îïåðàöèÿ êîìïëåêñíîãî ñîïðÿæåíèÿ, ïðîöåäóðà, ïå÷àòàþùàÿ êîìïëåêñíîå ÷èñëî (â ñòàíäàðòíîì âèäå, ò. å. âåùåñòâåííàÿ ÷àñòü + ìíèìàÿ ÷àñòü i). 12. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé äðîáü (ïîëÿ ÷èñëèòåëü è çíàìåíàòåëü öåëûå ÷èñëà). Äîëæíû áûòü ôóíêöèÿ, âûäàþùàÿ äðîáü ïî äâóì öåëûì ÷èñëàì, ïðîöåäóðà ñîêðàùåíèÿ äðîáè (äðîáü-ïàðàìåòð ïåðåäàåòñÿ ïî ññûëêå), àðèôìåòè÷åñêèå îïåðàöèè (ôóíêöèè, âûäàþùèå äðîáè) è îïåðàöèè ñðàâíåíèÿ (ôóíêöèè, âûäàþùèå ëîãè÷åñêèé ðåçóëüòàò).