Структурные типы данных.

advertisement
Ñòðóêòóðíûå òèïû äàííûõ
Êàê è â áîëüøèíñòâå èìïåðàòèâíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ, â 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. Íàïèñàòü ñòðóêòóðíûé òèï äàííûõ, ïðåäñòàâëÿþùèé äðîáü (ïîëÿ ÷èñëèòåëü è çíàìåíàòåëü öåëûå ÷èñëà).
Äîëæíû áûòü ôóíêöèÿ, âûäàþùàÿ äðîáü ïî äâóì öåëûì ÷èñëàì, ïðîöåäóðà ñîêðàùåíèÿ äðîáè (äðîáü-ïàðàìåòð ïåðåäàåòñÿ ïî ññûëêå), àðèôìåòè÷åñêèå îïåðàöèè (ôóíêöèè, âûäàþùèå äðîáè) è îïåðàöèè ñðàâíåíèÿ (ôóíêöèè, âûäàþùèå
ëîãè÷åñêèé ðåçóëüòàò).
Download