ßçûê Ñè - ðóêîâîäñòâî äëÿ íà÷èíàþùèõ.
1. Âñòóïëåíèå.
ÈÑÒÎÐÈß ÑÈ ÄÎÑÒÎÈÍÑÒÂÀ ÑÈ.
ßÇÛÊÈ ÊÎÌÏÈËßÖÈÈ.
Äîáðî ïîæàëîâàòü â ìèð ÿçûêà Ñè.  äàííîé ãëàâå ìû ïîïðîáóåì ïîäãîòîâèòü âàñ ê èçó÷åíèþ ýòîãî ìîùíîãî ÿçûêà, çàâîåâûâàþùåãî âñå áîëüøóþ ïîïóëÿðíîñòü. ×òî âàì äëÿ ýòîãî íóæíî? Âî-ïåðâûõ, èíòåðåñ ê Ñè, êîòîðûé, ïî-âèäèìîìó, ó âàñ óæå åñòü. Íî, ÷òîáû óñèëèòü åãî, ìû êðàòêî îáðèñóåì íåêîòîðûå ïðèâëåêàòåëüíûå ñòîðîíû äàííîãî ÿçûêà. Âî-âòîðûõ, âû íóæäàåòåñü â ó÷åáíèêå ïî ÿçûêó Ñè — è ó÷åáíèêîì ïîñëóæèò âàì ýòà êíèãà. Êðîìå òîãî, âàì íóæåí äîñòóï ê êàêîé-íèáóäü âû÷èñëèòåëüíîé ñèñòåìå, â êîòîðîé èìååòñÿ êîìïèëÿòîð ñ ÿçûêà Ñè. Ýòî âû äîëæíû îáåñïå÷èòü ñåáå ñàìè. Íàêîíåö, âàì íåîáõîäèìî íàó÷èòüñÿ âûïîëíÿòü Ñè-ïðîãðàììó íà âàøåé âû÷èñëèòåëüíîé ñèñòåìå, è ìû â êîíöå ãëàâû äàäèì âàì íåñêîëüêî ñîâåòîâ ïî ýòîìó ïîâîäó.
ÏÐÎÈÑÕÎÆÄÅÍÈÅ ßÇÛÊÀ ÑÈ.
Ñîòðóäíèê ôèðìû Bell Labs Äåííèñ Ðèò÷è ñîçäàë ÿçûê Ñè â 1972 ã. âî âðåìÿ ñîâìåñòíîé ðàáîòû ñ Êåíîì Òîìïñîíîì íàä îïåðàöèîííîé ñèñòåìîé UNIX. Ðèò÷è íå âûäóìàë Ñè ïðîñòî èç ãîëîâû — ïðîîáðàçîì ïîñëóæèë ÿçûê Áè, ðàçðàáîòàííûé Òîìïñîíîì, êîòîðûé â ñâîþ î÷åðåäü…, íî ýòî óæå äðóãàÿ èñòîðèÿ. Âàæíûì ìîìåíòîì äëÿ íàñ ÿâëÿåòñÿ òî, ÷òî ÿçûê Ñè áûë ðàçðàáîòàí êàê èíñòðóìåíò äëÿ ïðîãðàììèñòîâ-ïðàêòèêîâ.  ñîîòâåòñòâèè ñ ýòèì ãëàâíîé öåëüþ åãî àâòîðà áûëî ñîçäàíèå óäîáíîãî è ïîëåçíîãî ÿçûêà.
Ìû äóìàåì, ÷òî êðèòåðèé ïîëåçíîñòè ïðèíèìàëñÿ âî âíèìàíèå ÏÐÈ ðàçðàáîòêå áîëüøèíñòâà ÿçûêîâ ïðîãðàììèðîâàíèÿ, íî, êðîìå òîãî, ÷àñòî ó÷èòûâàëèñü è äðóãèå ïîòðåáíîñòè. Îäíîé èç ãëàâíûõ Öåëåé ïðè ñîçäàíèè ÿçûêà Ïàñêàëü, íàïðèìåð, áûëî ïîñòðîåíèå ÏÐÎ×ÍÛÕ îñíîâ îáó÷åíèÿ ïðèíöèïàì ïðîãðàììèðîâàíèÿ. ßçûê Áåéñèê ñîçäàâàëñÿ òàê, ÷òîáû åãî ñèíòàêñèñ áûë áëèçîê ê ñèíòàêñèñó àíãëèéñêîãî ÿçûêà; ïîýòîìó èì ëåãêî ìîãëè ïîëüçîâàòüñÿ ñòóäåíòû, íå çíàêîìûå ñ ÝÂÌ. Âñå ýòè öåëè òîæå âàæíû, íî îíè íå âñåãäà ñîâìåñòèìû ñ ïðàãìàòè÷åñêèìè, êàæäîäíåâíûìè òðåáîâàíèÿìè. Ïðåäïîñûëêè, ïîñëóæèâøèå îñíîâîé ñîçäàíèÿ ÿçûêà Ñè êàê ñðåäñòâà ïðîãðàììèðîâàíèÿ, ïîçâîëèëè ðàçðàáîòàòü, êðîìå òîãî, ÿçûê, îáëåã÷àþùèé òðóä ïðîãðàììèñòà.
ÄÎÑÒÎÈÍÑÒÂÀ ßÇÛÊÀ ÑÈ.
ßçûê Ñè áûñòðî ñòàíîâèòñÿ îäíèì èç íàèáîëåå âàæíûõ è ïîïóëÿðíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ. Åãî èñïîëüçîâàíèå âñå áîëåå ðàñøèðÿåòñÿ, ïîñêîëüêó ÷àñòî ïðîãðàììèñòû ïðåäïî÷èòàþò ÿçûê Ñè âñåì äðóãèì ÿçûêàì ïîñëå ïåðâîãî çíàêîìñòâà ñ íèì. Êîãäà âû èçó÷èòå ÿçûê Ñè äîñòàòî÷íî õîðîøî, âû ñìîæåòå îöåíèòü ìíîãèå èç åãî äîñòîèíñòâ. Ñåé÷àñ ìû óïîìÿíåì ëèøü íåêîòîðûå èç íèõ.

Ñè — ñîâðåìåííûé ÿçûê. Îí âêëþ÷àåò â ñåáÿ òå óïðàâëÿþùèå êîíñòðóêöèè, êîòîðûå ðåêîìåíäóþòñÿ òåîðåòè÷åñêèì è ïðàêòè÷åñêèì ïðîãðàììèðîâàíèåì. Åãî ñòðóêòóðà ïîáóæäàåò ïðîãðàììèñòà èñïîëüçîâàòü â ñâîåé ðàáîòå íèñõîäÿùåå ïðîåêòèðîâàíèå, ñòðóêòóðíîå ïðîãðàììèðîâàíèå è ïîøàãîâóþ ðàçðàáîòêó ìîäóëåé. Ðåçóëüòàòîì òàêîãî ïîäõîäà ÿâëÿåòñÿ íàäåæíàÿ è ÷èòàåìàÿ ïðîãðàììà.
Ñè — ýôôåêòèâíûé ÿçûê. Åãî ñòðóêòóðà ïîçâîëÿåò íàèëó÷øèì îáðàçîì èñïîëüçîâàòü âîçìîæíîñòè ñîâðåìåííûõ ÝÂÌ. Íà ÿçûêå Ñè ïðîãðàììû îáû÷íî îòëè÷àþòñÿ êîìïàêòíîñòüþ è áûñòðîòîé èñïîëíåíèÿ.
Ñè — ïåðåíîñèìûé, èëè ìîáèëüíûé, ÿçûê. Ýòî îçíà÷àåò, ÷òî ïðîãðàììà, íàïèñàííàÿ íà Ñè äëÿ îäíîé âû÷èñëèòåëüíîé ñèñòåìû, ìîæåò áûòü ïåðåíåñåíà ñ íåáîëüøèìè èçìåíåíèÿìè (èëè âîîáùå áåç íèõ) íà äðóãóþ. Åñëè ìîäèôèêàöèè âñå-òàêè íåîáõîäèìû, òî ÷àñòî îíè ìîãóò áûòü ñäåëàíû ïóòåì ïðîñòîãî èçìåíåíèÿ íåñêîëüêèõ ýëåìåíòîâ â "ãîëîâíîì" ôàéëå, êîòîðûé ñîïóòñòâóåò ãëàâíîé ïðîãðàììå. Êîíå÷íî, ñòðóêòóðà áîëüøèíñòâà ÿçûêîâ ïðîãðàììèðîâàíèÿ ïîäðàçóìåâàåò ïåðåíîñèìîñòü, íî òîò, êòî ïåðåíîñèë ïðîãðàììó, íàïèñàííóþ íà Áåéñèêå, ñ ïåðñîíàëüíîé ÝÂÌ IBM PC íà ìàøèíó Apple (îíè âî ìíîãîì, ïîõîæè) èëè ïûòàëñÿ âûïîëíèòü ïðîãðàììó, íàïèñàííóþ íà Ôîðòðàíå äëÿ ìàøèíû òèïà IBM, â ñèñòåìå UNIX, çíàåò î ìíîãèõ âîçíèêàþùèõ ïðè ýòîì ìó÷èòåëüíûõ.

ÐÈÑ. 1.1. Äîñòîèíñòâà ÿçûêà Ñè.
Ïðîáëåìàõ. ßçûê Ñè ïðåäîñòàâëÿåò èñêëþ÷èòåëüíûå âîçìîæíîñòè äëÿ ïåðåíîñà ïðîãðàìì. Êîìïèëÿòîðû ñ äàííîãî ÿçûêà ðåàëèçîâàíû ïî÷òè íà 40 òèïàõ âû÷èñëèòåëüíûõ ñèñòåì, íà÷èíàÿ îò- 8-ðàçðÿäíûõ ìèêðîïðîöåññîðîâ è êîí÷àÿ CRAY-1 îäíèì èç ñàìûõ ìîùíûõ â íàñòîÿùåå âðåìÿ ñóïåðêîìïüþòåðîâ.
Ñè — ìîùíûé è ãèáêèé ÿçûê (äâà èçëþáëåííûõ ñëîâà â ëèòåðàòóðå ïî âû÷èñëèòåëüíîé òåõíèêå). Íàïðèìåð, áîëüøàÿ ÷àñòü ìîùíîé è ãèáêîé (!) îïåðàöèîííîé ñèñòåìû (ÎÑ) UNIX íàïèñàíà íà ÿçûêå Ñè. Ðå÷ü èäåò î êîìïèëÿòîðàõ è èíòåðïðåòàòîðàõ äðóãèõ ÿçûêîâ, òàêèõ, êàê Ôîðòðàí, ÀÏË, Ïàñêàëü, Ëèñï, Ëîãî è Áåéñèê. Ïîýòîìó, êîãäà âû èñïîëüçóåòå êîìïèëÿòîð ñ Ôîðòðàíà â ñèñòåìå UNIX, ðåçóëüòèðóþùàÿ îáúåêòíàÿ ïðîãðàììà â êîíå÷íîì ñ÷åòå ïîëó÷àåòñÿ ñ ïîìîùüþ íåêîòîðîé ïðîãðàììû, íàïèñàííîé íà ÿçûêå Ñè. Êðîìå òîãî, ïðîãðàììû, íàïèñàííûå íà Ñè, èñïîëüçóþòñÿ äëÿ ðåøåíèÿ ôèçè÷åñêèõ è òåõíè÷åñêèõ ïðîáëåì è äàæå äëÿ ïðîèçâîäñòâà ìóëüòèïëèêàöèîííûõ ôèëüìîâ.
Ñè îáëàäàåò ðÿäîì çàìå÷àòåëüíûõ êîíñòðóêöèé óïðàâëåíèÿ, îáû÷íî àññîöèèðóåìûõ ñ àññåìáëåðîì. Åñëè âû îñòàíîâèòå ñâîé âûáîð íà Ñè, òî ñìîæåòå ðåàëèçîâûâàòü ñâîè ïðîãðàììû ñ ìàêñèìàëüíîé ýôôåêòèâíîñòüþ.
Ñè — óäîáíûé ÿçûê. Îí äîñòàòî÷íî ñòðóêòóðèðîâàí, ÷òîáû ïîääåðæèâàòü õîðîøèé ñòèëü ïðîãðàììèðîâàíèÿ, è âìåñòå ñ òåì íå ñâÿçûâàòü âàñ ñìèðèòåëüíîé ðóáàøêîé îãðàíè÷åíèé.
Êðîìå óæå óïîìÿíóòûõ äîñòîèíñòâ ÿçûê Ñè èìååò è íåêîòîðûå äðóãèå. Ó íåãî, áåçóñëîâíî, åñòü è ðÿä íåäîñòàòêîâ, íî âìåñòî òîãî ÷òîáû äàëåå óãëóáëÿòüñÿ â ýòî, äàâàéòå îáñóäèì åùå îäèí âîïðîñ.
ÁÓÄÓÙÅÅ ßÇÛÊÀ ÑÈ.
ßçûê Ñè óæå çàíèìàåò äîìèíèðóþùåå ïîëîæåíèå â ìèðå ìèíè-êîìïüþòåðîâ, ðàáîòàþùèõ ïîä óïðàâëåíèåì ÎÑ UNIX. Ñåé÷àñ îí ðàñïðîñòðàíÿåòñÿ íà îáëàñòü ïåðñîíàëüíûõ ÝÂÌ. Ìíîãèå ôèðìû, ïðîèçâîäÿùèå ïðîãðàììíîå îáåñïå÷åíèå, âñå ÷àùå îáðàùàþòñÿ ê Ñè, êàê ê óäîáíîìó ÿçûêó äëÿ ðåàëèçàöèè ñâîèõ ïðîåêòîâ: ïðîãðàìì îáðàáîòêè òåêñòîâ, ñîñòàâëåíèÿ êðóïíîôîðìàòíûõ òàáëèö, êîìïèëÿòîðîâ è ò. ä., ïîñêîëüêó èçâåñòíî, ÷òî Ñè ïîçâîëÿåò ïîëó÷èòü êîìïàêòíûå è ýôôåêòèâíûå ïðîãðàììû. ×òî åùå âàæíåå, ýòè ïðîãðàììû ìîãóò áûòü ëåãêî ìîäèôèöèðîâàíû è àäàïòèðîâàíû ê íîâûì ìîäåëÿì ÝÂÌ.
Äðóãîé ïðè÷èíîé, ñïîñîáñòâóþùåé ïðîíèêíîâåíèþ Ñè â ïðîãðàììíîå îáåñïå÷åíèå ïåðñîíàëüíûõ ÝÂÌ, ÿâëÿåòñÿ æåëàíèå ïîëüçîâàòåëåé, ðàáîòàþùèõ â ñèñòåìå UNIX, îòëàæèâàòü ñâîè ïðîãðàììû äîìà. Ïîñêîëüêó óæå ñîçäàíû âàðèàíòû êîìïèëÿòîðà ñ ÿçûêà Ñè äëÿ íåêîòîðûõ ìîäåëåé ïåðñîíàëüíûõ ÝÂÌ, ïîëüçîâàòåëè èìåþò âîçìîæíîñòü ýòî äåëàòü.
Ïî íàøåìó ìíåíèþ, òî, ÷òî ïîäõîäèò äëÿ ôèðì è ïðîãðàììèñòîâ ñ áîëüøèì îïûòîì ðàáîòû íà Ñè, õîðîøî è äëÿ îñòàëüíûõ ïîëüçîâàòåëåé. Âñå áîëüøå è áîëüøå ïðîãðàììèñòîâ îñòàíàâëèâàþò ñâîé âûáîð íà ÿçûêå Ñè, ÷òîáû âîñïîëüçîâàòüñÿ åãî ïðåèìóùåñòâàìè. Ïîýòîìó âàì ñîâñåì íå îáÿçàòåëüíî áûòü. ïðîôåññèîíàëüíûì ïðîãðàììèñòîì, ÷òîáû ñëåäîâàòü èõ ïðèìåðó.
Êîðî÷å ãîâîðÿ, Ñè ñóæäåíî ñòàòü îäíèì èç íàèáîëåå âàæíûõ ÿçûêîâ ïðîãðàììèðîâàíèÿ â 80-90-å ãîäû. Îí óæå ïðèìåíÿåòñÿ íà ìèíè-êîìïüþòåðàõ è ïåðñîíàëüíûõ ÝÂÌ. Îí èñïîëüçóåòñÿ ôèðìàìè, ïðîèçâîäÿùèìè ïðîãðàììíîå îáåñïå÷åíèå, ñòóäåíòàìè, îáó÷àþùèìèñÿ ïðîãðàììèðîâàíèþ, è ðàçëè÷íûìè ýíòóçèàñòàìè. È åñëè âû õîòèòå ðàáîòàòü â ñôåðå ïðîãðàììîòåõíèêè, òî îäèí èç ïåðâûõ âîïðîñîâ, íà êîòîðûé âû äîëæíû áóäåòå îòâå÷àòü "äà", — "Óìååòå ëè âû ïðîãðàììèðîâàòü íà Ñè?".
ÈÑÏÎËÜÇÎÂÀÍÈÅ ßÇÛÊÀ ÑÈ.
Ñè — ÿçûê "êîìïèëèðóåìîãî" òèïà. Íå îãîð÷àéòåñü, åñëè ýòî çâó÷èò äëÿ âàñ ïîêà êàê íåïîíÿòíûé íàáîð ñëîâ; âû ïîéìåòå, ÷òî ýòî çíà÷èò, êîãäà ìû îïèøåì ýòàïû ïðîöåññà ñîçäàíèÿ ðàáîòàþùåé Ñè-ïðîãðàììû.
Åñëè âû ïðèâûêëè èñïîëüçîâàòü êàêîé-íèáóäü ÿçûê ïðîãðàììèðîâàíèÿ êîìïèëèðóåìîãî òèïà, íàïðèìåð Ïàñêàëü èëè Ôîðòðàí, âàì áóäóò ïîíÿòíû îñíîâíûå ýòàïû "ñáîðêè" ïðîãðàìì, íàïèñàííûõ íà Ñè. Íî åñëè âàø îïûò îñíîâàí íà ðàáîòå ñ òàêèìè ÿçûêàìè.

ÐÈÑ. 1.2. Îáëàñòè ïðèìåíåíèÿ ÿçûêà Ñè.
Èíòåðïðåòèðóåìîãî òèïà, êàê Áåéñèê è Ëîãî, èëè ó âàñ ñîâñåì íåò ñîîòâåòñòâóþùåé ïîäãîòîâêè, òî ïðîöåññ ñáîðêè ìîæåò ïîêàçàòüñÿ âàì ïîíà÷àëó íåîáû÷íûì. Ê ñ÷àñòüþ, ìû ìîæåì îáúÿñíèòü âàì âñå äåòàëè ýòîãî ïðîöåññà, è âû óâèäèòå, ÷òî íà ñàìîì äåëå îí äîñòàòî÷íî ïîíÿòåí è ïðîñò.
×òîáû äàòü âàì ïåðâîå ïðåäñòàâëåíèå î ïðîöåññå ñîçäàíèÿ ïðîãðàììû, íèæå ïðèâîäèòñÿ óïðîùåííàÿ ñõåìà òîãî, ÷òî íåîáõîäèìî ñäåëàòü — íà÷èíàÿ îò íàïèñàíèÿ ïðîãðàììû è êîí÷àÿ åå âûïîëíåíèåì.
1. Èñïîëüçóéòå "ðåäàêòîð òåêñòîâ" äëÿ ñîçäàíèÿ ïðîãðàììû íà ÿçûêå Ñè.
2. Ïîïûòàéòåñü îñóùåñòâèòü òðàíñëÿöèþ âàøåé ïðîãðàììû ñ ïîìîùüþ óäîáíîãî äëÿ âàñ êîìïèëÿòîðà. Îí ïðîâåäåò ïðîâåðêó ïðàâèëüíîñòè âàøåé ïðîãðàììû è, åñëè îáíàðóæèò îøèáêè, âûäàñò ñîîáùåíèå îá ýòîì.  ïðîòèâíîì ñëó÷àå êîìïèëÿòîð âûïîëíèò ïåðåâîä ïðîãðàììû â íåêîòîðûé âíóòðåííèé ÿçûê ÝÂÌ è ïîìåñòèò ðåçóëüòàò â íîâûé ôàéë.
3. Íàáðàâ èìÿ ýòîãî íîâîãî ôàéëà íà êëàâèàòóðå äèñïëåÿ, âû ìîæåòå çàïóñòèòü âàøó ïðîãðàììó.
 íåêîòîðûõ âû÷èñëèòåëüíûõ ñèñòåìàõ âòîðîé ýòàï ìîæåò áûòü ðàçáèòûì íà äâà èëè òðè øàãà, íî åãî ñóòü îò ýòîãî íå èçìåíèòñÿ. Äàâàéòå ðàññìîòðèì òåïåðü êàæäûé ýòàï áîëåå ïîäðîáíî.
Èñïîëüçîâàíèå òåêñòîâîãî ðåäàêòîðà äëÿ ïîäãîòîâêè ïðîãðàììû.
 îòëè÷èå îò ÿçûêà Áåéñèê ó Ñè íåò ñîáñòâåííîãî òåêñòîâîãî ðåäàêòîðà.  êà÷åñòâå íåãî âû ìîæåòå èñïîëüçîâàòü ëþáîé èç ðåäàêòîðîâ îáùåãî òèïà, èìåþùèõñÿ â âàøåé âû÷èñëèòåëüíîé ñèñòåìå.  îïåðàöèîííîé ñèñòåìå UNIX, íàïðèìåð, ýòî ÷àùå âñåãî ðåäàêòîðû ed, ex, edit, emacs èëè vi. Íà ïåðñîíàëüíîì êîìïüþòåðå ýòî ìîæåò áûòü ed, edlin, Wordstar, Volkswriter èëè ëþáîé äðóãîé èç øèðîêîãî íàáîðà ðåäàêòîðîâ. Ïðè ðàáîòå ñ íåêîòîðûìè èç íèõ âàì íåîáõîäèìî áóäåò îïðåäåëèòü êîíêðåòíóþ âåðñèþ ðåäàêòîðà (ïóòåì çàäàíèÿ ñîîòâåòñòâóþùèõ ïàðàìåòðîâ). Íàïðèìåð, ïðè èñïîëüçîâàíèè ðåäàêòîðà Wordstar íåîáõîäèìî ââåñòè ïàðàìåòð N, óêàçûâàþùèé íà îòñóòñòâèå äîêóìåíòèðîâàíèÿ.
Ïðè ðàáîòå ñ ðåäàêòîðîì îò âàñ ïîòðåáóåòñÿ, âî-ïåðâûõ, íå îøèáàòüñÿ, íàáèðàÿ òåêñò ïðîãðàììû íà ïóëüòå äèñïëåÿ, è, âî-âòîðûõ, âûáèðàòü èìÿ äëÿ ôàéëà, â êîòîðûé áóäåò ïîìåùåíà äàííàÿ ïðîãðàììà. Ïðàâèëà âûáîðà èìåíè âûãëÿäÿò äîâîëüíî ïðîñòî: îíî äîëæíî áûòü äîïóñòèìûì èìåíåì â âàøåé âû÷èñëèòåëüíîé ñèñòåìå è äîëæíî îêàí÷èâàòüñÿ ñèìâîëîì ñ. Íèæå ïðèâåäåíû äâà ïðàâèëüíî ïîñòðîåííûõ èìåíè: sort.c add.c.
Ïåðâàÿ ÷àñòü èìåíè ôàéëà äîëæíà íàïîìèíàòü âàì, ÷òî ïðîãðàììà äåëàåò. Âòîðàÿ ÷àñòü (ñèìâîë .c) óêàçûâàåò íà òî, ÷òî äàííûé ôàéë ñîäåðæèò òåêñò ïðîãðàììû, íàïèñàííîé íà ÿçûêå Ñè.  ïðîãðàììèðîâàíèè ïðèíÿòî íàçûâàòü ÷àñòü èìåíè, ñëåäóþùóþ çà òî÷êîé, "ðàñøèðåíèåì". Ðàñøèðåíèÿ èñïîëüçóþòñÿ äëÿ òîãî, ÷òîáû èíôîðìèðîâàòü âàñ è âû÷èñëèòåëüíóþ ñèñòåìó î òèïå ôàéëà.

ÐÈÑ. 1.3. Ñõåìà ðàáîòû èíòåðïðåòàòîðà è êîìïèëÿòîðà.
Ðàññìîòðèì ïðîñòîé ïðèìåð. Ïðåäïîëîæèì, ÷òî ïðè ïîìîùè ðåäàêòîðà ìû ïîäãîòîâèëè ïðîãðàììó, êîòîðàÿ ïðèâåäåíà íèæå, è ïîìåñòèëè åå â ôàéë ñ èìåíåì inform.ñ.
#include main() { printf (" Ñèìâîë .ñ èñïîëüçóåòñÿ êàê îêîí÷àíèå èìåíè ôàéëà ñ ÑÈ-ïðîãðàììîé. \n");}.
Âûøå ïðèâåäåííûé òåêñò, êîòîðûé ìû íàáðàëè íà êëàâèàòóðå äèñïëåÿ, îáû÷íî íàçûâàåòñÿ èñõîäíûì êîäîì (òåêñòîì); îí ñîäåðæèòñÿ â èñõîäíîì ôàéëå. Âàæíûì ìîìåíòîì, êîòîðûé íåîáõîäèìî ñðàçó îòìåòèòü, ÿâëÿåòñÿ òî, ÷òî íàø èñõîäíûé ôàéë — ýòî íà÷àëüíûé ïóíêò ïðîöåññà ïðîãðàììèðîâàíèÿ, à íå åãî êîíåö.
Èñõîäíûå ôàéëû è âûïîëíÿåìûå ôàéëû.
Íàøà çàìå÷àòåëüíàÿ ïðîãðàììà, íåñìîòðÿ íà ñâîþ ëàêîíè÷íîñòü è ïðîñòîòó, äëÿ êîìïüþòåðà ÿâëÿåòñÿ ñîâåðøåííî áåññìûñëåííûì íàáîðîì ñèìâîëîâ, òàê êàê îí "íå ïîíèìàåò" äèðåêòèâ òèïà #include èëè printf. Îí ïîíèìàåò òîëüêî ñïåöèàëüíûé ÿçûê, íàçûâàåìûé ìàøèííûì êîäîì, — íàáîð ïîñëåäîâàòåëüíîñòåé äâîè÷íûõ öèôð, íàïðèìåð, 10010101 è 01101001. Åñëè ìû õîòèì, ÷òîáû êîìïüþòåð âûïîëíèë ïðîãðàììó, ìû äîëæíû îñóùåñòâèòü ïåðåâîä (òðàíñëÿöèþ) íàøåãî êîäà (èñõîäíîãî) â åå êîä (ìàøèííûé).  ðåçóëüòàòå ýòèõ äåéñòâèé áóäåò ïîëó÷åí âûïîëíÿåìûé ôàéë, ò. å. ôàéë, ñîäåðæàùèé âåñü íåîáõîäèìûé ìàøèííûé êîä, òðåáóþùèéñÿ êîìïüþòåðó äëÿ âûïîëíåíèÿ çàäàíèÿ.
Åñëè âûøåïðèâåäåííûå ðàññóæäåíèÿ âûãëÿäÿò ñêó÷íûìè è íåïîíÿòíûìè, íå îãîð÷àéòåñü. Äåëî â òîì, ÷òî ïðîöåññ ïåðåâîäà óäàëîñü ïåðåëîæèòü íà ñàì êîìïüþòåð! "Óìíûå" ïðîãðàììû, íàçûâàåìûå êîìïèëÿòîðàìè, âûïîëíÿþò âåñü îáúåì ðàáîòû, ñâÿçàííûé ñ ýòèì ïåðåâîäîì. Äåòàëè ïðîöåññà çàâèñÿò îò îñîáåííîñòåé êîíêðåòíîé ñèñòåìû. Íèæå êðàòêî îïèñàíî íåñêîëüêî ñïîñîáîâ ïåðåâîäà.
Êîìïèëÿöèÿ Ñè-ïðîãðàììû â ÎÑ UNIX.
Êîìïèëÿòîð ñ ÿçûêà Ñè â ÎÑ UNIX íàçûâàåòñÿ cc. ×òîáû îñóùåñòâèòü êîìïèëÿöèþ íàøåé ïðîãðàììû, íà êëàâèàòóðå äèñïëåÿ íåîáõîäèìî íàáðàòü òîëüêî ñòðîêó:
Cc inform.c.
×åðåç íåñêîëüêî ñåêóíä èíòåðïðåòàòîð êîìàíä ÎÑ UNIX âûäàñò íà ýêðàí äèñïëåÿ ñèìâîë "ïðèãëàøåíèå", èíôîðìèðóÿ íàñ, ÷òî çàäàíèå âûïîëíåíî. (Âîîáùå ãîâîðÿ, ìû ìîæåì ïîëó÷èòü ïðåäóïðåæäåíèÿ è ñîîáùåíèÿ îá îøèáêàõ â òîì ñëó÷àå, åñëè ïðîãðàììà áûëà íàïèñàíà ñ îøèáêàìè, íî äàâàéòå ïðåäïîëîæèì, ÷òî âñå áûëî ñäåëàíî ïðàâèëüíî.) Åñëè ìû èñïîëüçóåì äèðåêòèâó Is, îñóùåñòâëÿþùóþ âûâîä íà ýêðàí ñïèñêà èìåí ôàéëîâ, ìû îáíàðóæèì íîâûé ôàéë ñ èìåíåì a.out — ôàéë ñ âûïîëíÿåìîé ïðîãðàììîé, ñîäåðæàùèé ðåçóëüòàò òðàíñëÿöèè (èëè "êîìïèëÿöèè") íàøåé èñõîäíîé ïðîãðàììû. ×òîáû âûïîëíèòü åå, ìû äîëæíû òîëüêî íàáðàòü íà êëàâèàòóðå ñèìâîëû a.out è íà ýêðàíå äèñïëåÿ ïîÿâèòñÿ ôðàçà:
Ñèìâîë .c èñïîëüçóåòñÿ êàê îêîí÷àíèå èìåíè ôàéëà ñ Ñè-ïðîãðàììîé.

ÐÈÑ. 1.4. Ñîçäàíèå Ñè-ïðîãðàììû â ñðåäå ÎÑ UNIX.
Ïðîãðàììà-êîìïèëÿòîð, íàçûâàåìàÿ ññ, îáúåäèíÿåò íåñêîëüêî ïîñëåäîâàòåëüíûõ øàãîâ çàäàíèÿ â îäèí. Ýòî ñòàíåò áîëåå î÷åâèäíûì, êîãäà ìû ðàññìîòðèì âûïîëíåíèå àíàëîãè÷íîãî ïðîöåññà êîìïèëÿöèè íà ïåðñîíàëüíîì êîìïüþòåðå.
Êîìïèëÿöèÿ Ñè-ïðîãðàììû íà IBM PC. (êîìïèëÿòîðû Microsoft Ñ è Lattice Ñ).
Îïèñàííîå íèæå ðàçáèåíèå ïðîöåññà êîìïèëÿöèè ïðîãðàììû íà ïîñëåäîâàòåëüíûå øàãè çàâèñèò êàê îò îïåðàöèîííîé ñèñòåìû, òàê è îò ñàìîãî êîìïèëÿòîðà. Êîíêðåòíûé ïðèìåð, êîòîðûé ìû çäåñü ðàññìàòðèâàåì, — ýòî ôóíêöèîíèðîâàíèå êîìïèëÿòîðà Microsoft Ñ ïîä óïðàâëåíèåì îïåðàöèîííîé ñèñòåìû PC DOS I.I (Êîìïèëÿòîð Lattice Ñ, ëåæàùèé â îñíîâå âåðñèè, ðåàëèçîâàííîé ôèðìîé Microsoft, çàïóñêàåòñÿ ïî àíàëîãè÷íûì ïðàâèëàì, òîëüêî âìåñòî êîìàíä mñ1 è mc2 íåîáõîäèìî èñïîëüçîâàòü êîìàíäû lñ1 lñ2.
Òàê æå êàê è ïðåæäå, ìû ñ÷èòàåì, ÷òî èñõîäíàÿ ïðîãðàììà ñîäåðæèòñÿ â ôàéëå inform.ñ. Íàøà ïåðâàÿ êîìàíäà âûãëÿäèò ñëåäóþùèì îáðàçîì:
Mcl inform.
(Êîìïèëÿòîð èíòåðïðåòèðóåò ñòðîêó ñèìâîëîâ inform êàê inform.ñ.) Åñëè îøèáîê íåò, òî â ðåçóëüòàòå áóäåò ïîëó÷åí ïðîìåæóòî÷íûé ôàéë ñ èìåíåì inform.q. Çàòåì ìû íàáèðàåì íà êëàâèàòóðå ñëåäóþùóþ êîìàíäó:
Mc2 inform.
 ðåçóëüòàòå âûïîëíåíèÿ êîòîðîé áóäåò ñîçäàí ôàéë ñ èìåíåì inform.obj, ñîäåðæàùèé òàê íàçûâàåìûé "îáúåêòíûé êîä" (êîä íà ÿçûêå ìàøèíû), ñîîòâåòñòâóþùèé íàøåé èñõîäíîé ïðîãðàììå. (Îáúÿñíåíèÿ ïðèâåäåíû íèæå.) Ïîñëå ýòîãî ââîäèòñÿ êîìàíäà.
Link ñ inform.
Ïî çàâåðøåíèè êîòîðîé ñîçäàåòñÿ ôàéë inform.åõå. Íàøà öåëü äîñòèãíóòà — ïîëó÷åí ôàéë, ñîäåðæàùèé âûïîëíÿåìóþ ïðîãðàììó. Åñëè ìû çàòåì ââåäåì êîìàíäó.
Inform. åõå.
Èëè ïðîñòî.
Inform.
Òî íàøà ïðîãðàììà íà÷íåò âûïîëíÿòüñÿ.

ÐÈÑ. 1.5. Ñîçäàíèå Ñè-ïðîãðàììû ïðè ïîìîùè êîìïèëÿòîðîâ Microsoft Ñ è Lattice Ñ.
Íà ñàìîì äåëå âû ìîæåòå íå çíàòü, ÷òî ïðîèñõîäèò, êîãäà âû ïîëüçóåòåñü âûøåîïèñàííîé ïðîöåäóðîé, íî, åñëè âàì èíòåðåñíî, ìû êðàòêî îïèøåì âûïîëíÿåìûå ïðè ýòîì äåéñòâèÿ.
×òî çäåñü íîâîãî? Âî-ïåðâûõ, íîâûì ÿâëÿåòñÿ òî, ÷òî ââîäèòñÿ ôàéëå èìåíåì inform.obj. Ïîñêîëüêó â íåì ñîäåðæèòñÿ ìàøèííûé êîä, íåïîíÿòíî, ïî÷åìó ìû íå îñòàíîâèëèñü â ýòîì ìåñòå? Îòâåòîì ìîæåò ñëóæèòü òî, ÷òî ïîëíàÿ ïðîãðàììà âêëþ÷àåò â ñåáÿ ÷àñòè, êîòîðûå ìû íå ïèñàëè. Íàïðèìåð, ìû èñïîëüçîâàëè êîìàíäó printf, ÿâëÿþùóþñÿ ïðîãðàììîé, ïîìåùåííîé â Ñè-áèáëèîòåêó. Âîîáùå ãîâîðÿ, ìîæåò âîçíèêàòü íåîáõîäèìîñòü èñïîëüçîâàòü â ïðîãðàììå ñòàíäàðòíûå ïðîöåäóðû, ïîìåùåííûå â ðàçëè÷íûå áèáëèîòåêè. Ýòà ïîòðåáíîñòü ïðèâîäèò ê èñïîëüçîâàíèþ âòîðîãî íîâîãî ïîíÿòèÿ — êîìàíäû link.
Ïðîãðàììà link ÿâëÿåòñÿ ÷àñòüþ îïåðàöèîííîé ñèñòåìû IBM POS. Îíà ñâÿçûâàåò íàø îáúåêòíûé êîä (íàõîäÿùèéñÿ â ôàéëå inform.obj) ñ íåêîòîðûìè ñòàíäàðòíûìè ïðîöåäóðàìè, ñîäåðæàùèìèñÿ â ôàéëå c.obj, è, êðîìå òîãî, îñóùåñòâëÿåò ïîèñê òðåáóåìûõ îáúåêòíûõ ìîäóëåé â òîé áèáëèîòåêå, êîòîðóþ ìû óêàçûâàåì (ïðîãðàììà link çàïðàøèâàåò òðåáóåìîå èìÿ âî âðåìÿ âûïîëíåíèÿ); â äàííîì ñëó÷àå ýòî áóäåò áèáëèîòåêà ñ èìåíåì lc.lib. Çàòåì óêàçàííàÿ ïðîãðàììà îáúåäèíÿåò âñå íàéäåííûå ìîäóëè â îäíó ïîëíóþ ïðîãðàììó.
Ïðîãðàììà ññ, ðàáîòàþùàÿ ïîä óïðàâëåíèåì ÎÑ UNIX, âî âðåìÿ âûïîëíåíèÿ ïðîõîäèò àíàëîãè÷íóþ ïîñëåäîâàòåëüíîñòü øàãîâ; îòëè÷èå ñîñòîèò òîëüêî â òîì, ÷òî îíà "ñêðûâàåò" ýòîò ôàêò îò íàñ, óíè÷òîæàÿ ôàéë ñ îáúåêòíûì ìîäóëåì ïîñëå åãî èñïîëüçîâàíèÿ äëÿ ïîëó÷åíèÿ ïîëíîé ïðîãðàììû. (Íî â ñëó÷àå íåîáõîäèìîñòè â îòâåò íà ñîîòâåòñòâóþùèé çàïðîñ êîìïèëÿòîð âûäàñò íàì îáúåêòíûé ôàéë ïîä èìåíåì inform.î.).
Àëüòåðíàòèâíûé ñïîñîá òðàíñëÿöèè.
 íåêîòîðûõ êîìïèëÿòîðàõ ñ ÿçûêà Ñè, ðàáîòàþùèõ íà ïåðñîíàëüíûõ ÝÂÌ, ðåàëèçîâàíû äðóãèå ñïîñîáû òðàíñëÿöèè. Ìåòîä, êîòîðûé òîëüêî ÷òî îáñóæäàëñÿ, ìîæíî îõàðàêòåðèçîâàòü òåì, ÷òî â ðåçóëüòàòå ìû ïîëó÷àåì ôàéë, ñîäåðæàùèé îáúåêòíûé êîä (èìÿ ôàéëà îêàí÷èâàåòñÿ ñèìâîëàìè. obj), à çàòåì èñïîëüçóåì ñèñòåìíûé êîìïîíîâùèê äëÿ ïîëó÷åíèÿ ôàéëà ñ âûïîëíÿåìîé ïðîãðàììîé (åãî èìÿ îêàí÷èâàåòñÿ ñèìâîëàìè åõå). Àëüòåðíàòèâíûé ìåòîä ñîñòîèò â òîì, ÷òî â ðåçóëüòàòå òðàíñëÿöèè ìû âíà÷àëå èìååì ôàéë, ñîäåðæàùèé "àññåìáëåðíûé êîä" (èìÿ ôàéëà îêàí÷èâàåòñÿ ñèìâîëàìè. asm), à çàòåì èñïîëüçóåì ñèñòåìíóþ ïðîãðàììó, íàçûâàåìóþ àññåìáëåðîì, äëÿ ïîëó÷åíèÿ ôàéëà ñ âûïîëíÿåìîé ïðîãðàììîé.
Óòîìëåííûé ÷èòàòåëü ìîæåò âîñêëèêíóòü: "Êàê, íåóæåëè åùå îäèí êîä?" Ïîýòîìó ñðàçó æå ïîÿñíèì: àññåìáëåðíûé êîä òåñíî ñâÿçàí ñ ìàøèííûì êîäîì. Ôàêòè÷åñêè ýòî òîò æå ñàìûé êîä, òîëüêî ïðåäñòàâëåííûé â ñèìâîëüíîì âèäå. Íàïðèìåð, JMP ìîæåò ñîîòâåòñòâîâàòü êîäó 11101001, ÿâëÿþùåìóñÿ ÷àñòüþ ìàøèííîé êîìàíäû, â ðåçóëüòàòå âûïîëíåíèÿ êîòîðîé îñóùåñòâëÿåòñÿ "ïåðåñêîê" (ïåðåõîä) ê äðóãîé ÿ÷åéêå. (Âû, âåðîÿòíî, ïðåäñòàâëÿåòå ñåáå êîìïüþòåð, ñíóþùèé ïî ï÷åëèíûì ñîòàì, à ìû èìååì â âèäó äðóãèå ÿ÷åéêè ïàìÿòè.) Ïðîãðàììèñòû íå áåç îñíîâàíèÿ ñ÷èòàþò, ÷òî àññåìáëåðíûé êîä áîëåå ëåãîê äëÿ âîñïðèÿòèÿ, ÷åì ÷èñòî ìàøèííûé êîä, à çàäà÷à ïåðåâîäà ñ îäíîãî ÿçûêà íà äðóãîé âïîëíå ìîæåò áûòü âîçëîæåíà íà ñïåöèàëüíóþ ïðîãðàììó, íàçûâàåìóþ àññåìáëåðîì.
Ïî÷åìó êîìïèëÿöèÿ?
×èòàòåëè, ïîëüçîâàâøèåñÿ ÿçûêîì Áåéñèê, ìîãóò óäèâèòüñÿ, çà÷åì ñòîëüêî øàãîâ äëÿ òîãî, ÷òîáû âûïîëíèòü ïðîãðàììó. Êàæåòñÿ, ÷òî òàêîé ñïîñîá êîìïèëÿöèè òðåáóåò áîëüøå âðåìåíè (è â íåêîòîðûõ ñëó÷àÿõ ýòî ìîæåò áûòü äåéñòâèòåëüíî òàê). Íî, ïîñêîëüêó â ðåçóëüòàòå êîìïèëÿöèè ïðîãðàììà âûïîëíÿåòñÿ ãîðàçäî áûñòðåå ÷åì îáû÷íàÿ ïðîãðàììà, íàïèñàííàÿ íà Áåéñèêå, âàì ïðîñòî ïðèõîäèòñÿ èñïûòûâàòü íåêîòîðûå íåóäîáñòâà ïðè ïîëó÷åíèè ãîðàçäî ýôôåêòèâíåå ðàáîòàþùåãî êîíå÷íîãî ïðîäóêòà.
ÍÅÊÎÒÎÐÛÅ ÑÎÃËÀØÅÍÈß.
Òåïåðü ìû óæå ïî÷òè ãîòîâû íà÷àòü ïîñëåäîâàòåëüíîå îïèñàíèå ÿçûêà Ñè. Íàì îñòàëîñü òîëüêî óïîìÿíóòü î íåêîòîðûõ ñîãëàøåíèÿõ, êîòîðûõ ìû áóäåì ïðèäåðæèâàòüñÿ.
Âèä øðèôòà.
Äëÿ ïðåäñòàâëåíèÿ òåêñòà ïðîãðàìì, äàííûõ ââîäà-âûâîäà, èìåí ôàéëîâ, ïðîãðàìì è ïåðåìåííûõ ìû ïðèìåíÿåì ñïåöèàëüíûé øðèôò, ïîõîæèé íà òîò, êîòîðûé âû ìîæåòå âèäåòü íà ýêðàíå äèñïëåÿ èëè íà áóìàãå ïðè âûâîäå íà ïå÷àòü. Ìû óæå èñïîëüçîâàëè åãî íåñêîëüêî ðàç, íî åñëè âû íå îáðàòèëè íà ýòî âíèìàíèÿ, òî çàïîìíèòå, ÷òî îí âûãëÿäèò ñëåäóþùèì îáðàçîì:
Printf (" Çäðàâñòâóéòå! \n ");
Öâåò.
Ñîîáùåíèÿ êîìïüþòåðà âî âðåìÿ äèàëîãà ñ ïîëüçîâàòåëåì äàþòñÿ ãîëóáûì öâåòîì; êðîìå òîãî, âàæíûå ñëîâà, îòðàæàþùèå îñíîâíûå èäåè èëè ïîíÿòèÿ, èñïîëüçóåìûå â äàííîé ãëàâå, ìû ïîìåùàåì ïåðåä òåêñòîì ãëàâû è ïå÷àòàåì òàêæå ãîëóáûì öâåòîì.
Óñòðîéñòâî ââîäà-âûâîäà.
Âîîáùå ãîâîðÿ, ñóùåñòâóåò ìíîãî ñïîñîáîâ âåäåíèÿ äèàëîãà ÷åëîâåêà ñ ÝÂÌ, íî ìû áóäåì ïðåäïîëàãàòü, ÷òî âû ââîäèòå êîìàíäû ïðè ïîìîùè êëàâèàòóðû è ÷èòàåòå îòâåò íà ýêðàíå äèñïëåÿ.
Ôóíêöèîíàëüíûå êëàâèøè.
Îáû÷íî âû ïîñûëàåòå êîìàíäó ÝÂÌ, íàæèìàÿ íà êëàâèøó ñ íàäïèñüþ enter (ââîä), ñ/r (âîçâðàò êàðåòêè) èëè return (âîçâðàò). Íàçâàíèÿ êëàâèø èíîãäà îáîçíà÷àþòñÿ ïðîïèñíûìè áóêâàìè. Ïóñòü êëàâèøà [enter] — [ââîä]. Çäåñü êâàäðàòíûå ñêîáêè îçíà÷àþò, ÷òî âû äîëæíû íàæàòü íà åäèíñòâåííóþ êëàâèøó, à íå íàáèðàòü âñå ñëîâî ïî áóêâàì.
Êðîìå òîãî, ìû áóäåì óïîìèíàòü óïðàâëÿþùèå ñèìâîëû, íàçû âàÿ èõ [CTRL/d]. Ýòî îáîçíà÷åíèå óêàçûâàåò íà òî, ÷òî íåîáõîäèìî íàæàòü êëàâèøó [d], äåðæà îäíîâðåìåííî íàæàòîé êëàâèøó control.
Íàøà âû÷èñëèòåëüíàÿ ñèñòåìà.
Íåêîòîðûå äåòàëè ðåàëèçàöèè ÿçûêà Ñè, íàïðèìåð îáúåì ïàìÿòè, òðåáóåìûé äëÿ òîãî, ÷òîáû ïîìåñòèòü òóäà ÷èñëî, çàâèñÿò îò êîíêðåòíîé ñèñòåìû. Êîãäà ìû ðàññìàòðèâàåì êàêèå-íèáóäü ïðè. ìåðû è óïîòðåáëÿåì ñëîâà "íàøà ñèñòåìà", ìû èìååì â âèäó ïåðñîíàëüíûé êîìïüþòåð IBM PC, ðàáîòàþùèé ïîä óïðàâëåíèåì îïåðàöèîííîé ñèñòåìû DOS I.I, è êîìïèëÿòîð ñ ÿçûêà Ñè Lattice Ñ.
 òåõ ñëó÷àÿõ, êîãäà ìû ãîâîðèì î ïðîãðàììàõ, ðàáîòàþùèõ â ñðåäå ÎÑ UNIX, ìû èìååì â âèäó âåðñèþ BSD 4.1 ýòîé îïåðàöèîííîé ñèñòåìû, ñîçäàííóþ â Êàëèôîðíèéñêîì óíèâåðñèòåòå (Áåðêëè) è ôóíêöèîíèðóþùóþ íà ÝÂÌ VAX 11/750.
ÑÎÂÅÒ.
Âû äîëæíû èçó÷àòü ïðîãðàììèðîâàíèå àêòèâíî, à íå ïðîñòî ïàññèâíî ÷èòàòü äàííóþ êíèãó. Ñ ýòîé öåëüþ ìû âêëþ÷èëè â íåå ìíîãî ïðèìåðîâ. Âû äîëæíû ïîïûòàòüñÿ ðåøèòü, õîòÿ áû íåêîòîðûå èç íèõ íà âàøåé âû÷èñëèòåëüíîé ñèñòåìå, ÷òîáû ïîëó÷èòü ëó÷ øåå ïðåäñòàâëåíèå î òîì, êàê îíè ðàáîòàþò. Íå áîéòåñü ìîäèôèöèðîâàòü ýòè ïðîãðàììû, ÷òîáû óâèäåòü, ê ÷åìó ýòî ïðèâåäåò. Ïûòàéòåñü îòâå÷àòü íà âîïðîñû è âûïîëíÿòü óïðàæíåíèÿ, ïîìåùåííûå â êîíöå êàæäîé ãëàâû. Åñëè âû áóäåòå àêòèâíû, âû èçó÷è òåÿçûê Ñè áûñòðî è óçíàåòå åãî äîñòàòî÷íî ãëóáîêî.
Òåïåðü ìû ñ âàìè ãîòîâû ïðèñòóïèòü ê èçó÷åíèþ ãë. 2.
2. Ââåäåíèå â ÿçûê Ñè.
ÑÒÐÓÊÒÓÐÀ ÏÐÎÑÒÎÉ ÏÐÎÃÐÀÌÌÛ, ÎÏÈÑÀÍÈÅ ÏÅÐÅÌÅÍÍÛÕ, ÈÑÏÎËÜÇÎÂÀÍÈÅ ÊÎÌÌÅÍÒÀÐÈÅÂ, ×ÈÒÀÅÌÎÑÒÜ ÏÐÎÃÐÀÌÌ, ÎÏÅÐÀÖÈÈ.
ÏÐÈÌÅÐ ÏÐÎÑÒÎÉ ÏÐÎÃÐÀÌÌÛ ÍÀ ßÇÛÊÅ ÑÈ.
Äàâàéòå ðàññìîòðèì ïðîñòóþ ïðîãðàììó íà ÿçûêå Ñè. Ñëåäóåò ñðàçó ñêàçàòü, ÷òî òàêîé ïðèìåð íóæåí íàì ëèøü äëÿ âûÿâëåíèÿ íåêîòîðûõ îñíîâíûõ ÷åðò ëþáîé ïðîãðàììû, íàïèñàííîé íà ÿçûêå Ñè. Äàëåå ìû äàäèì ïîÿñíåíèÿ ê êàæäîé ñòðîêå, íî, ïåðåä òåì êàê âû ñ íèìè ïîçíàêîìèòåñü, ïðîñòî âçãëÿíèòå íà ïðîãðàììó è ïîïðîáóéòå ïîíÿòü, åñëè ñìîæåòå, ÷òî îíà áóäåò äåëàòü.
#include <stdio.h>
Main() /*ïðîñòàÿ ïðîãðàììà*/
{
Int num;
Num = l;
Printf ("ß ïðîñòàÿ");
Printf ("âû÷èñëèòåëüíàÿ ìàøèíà.\n");
Printf ("Ìîå ëþáèìîå ÷èñëî %d, ïîòîìó ÷òî îíî ñàìîå ïåðâîå.\n", num);
}
Åñëè âû ñ÷èòàåòå, ÷òî ïðîãðàììà äîëæíà âûâåñòè íå÷òî íà ýêðàí äèñïëåÿ, òî âû ñîâåðøåííî ïðàâû! Íåñêîëüêî òðóäíåå ïîíÿòü, ÷òî æå ïîÿâèòñÿ íà ýêðàíå íà ñàìîì äåëå, ïîýòîìó äàâàéòå âûïîëíèì ïðîãðàììó íà ÝÂÌ è ïîñìîòðèì ê ÷åìó ýòî ïðèâåäåò.
Ïåðâûé øàã çàêëþ÷àåòñÿ â èñïîëüçîâàíèè èìåþùåãîñÿ ó âàñ òåêñòîâîãî ðåäàêòîðà äëÿ ñîçäàíèÿ ôàéëà, ñîäåðæàùåãî òåêñò ïðîãðàììû. Ýòîìó ôàéëó íåîáõîäèìî áóäåò ïðèñâîèòü êàêîå-òî èìÿ; åñëè âàì íå ïðèõîäèò â ãîëîâó íè÷åãî îðèãèíàëüíîãî, òî íàçîâèòå åãî main.ñ. Âûïîëíèòå êîìïèëÿöèþ âàøåé ïðîãðàììû. (Äëÿ ýòîãî âû äîëæíû òåðïåëèâî îçíàêîìèòüñÿ ñ ðóêîâîäñòâîì ïî êîìïèëÿòîðó, èìåþùåìóñÿ â ñîñòàâå âàøåé âû÷èñëèòåëüíîé ñèñòåìû.) Òåïåðü çàïóñòèì ïðîãðàììó. Åñëè âñå ïîéäåò õîðîøî, òî ðåçóëüòàò äîëæåí âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Ìû âûïîëíèì äâà ïðîñìîòðà òåêñòà ïðîãðàììû: âî âðåìÿ ïåðâîãî îáúÿñíèì ñìûñë êàæäîé ñòðîêè, à âî âðåìÿ âòîðîãî — ðàññìîòðèì äîïîëíèòåëüíûå âîïðîñû è äåòàëè.
Ïåðâûé ïðîñìîòð: êðàòêèé îáçîð.
#include — âêëþ÷åíèå äðóãîãî ôàéëà.
Ýòà ñòðîêà óêàçûâàåò êîìïèëÿòîðó, ÷òî íóæíî âêëþ÷èòü èíôîðìàöèþ, ñîäåðæàùóþñÿ â ôàéëå stdio.h.
Main() — èìÿ ôóíêöèè.

ÐÈÑ. 2.1. Ñòðóêòóðà ïðîãðàììû, íàïèñàííîé íà ÿçûêå Ñè.
Ëþáàÿ ïðîãðàììà, íàïèñàííàÿ íà ÿçûêå Ñè, ñîñòîèò èç îäíîé èëè áîëåå "ôóíêöèé", ÿâëÿþùèõñÿ îñíîâíûìè ìîäóëÿìè, èç êîòîðûõ îíà ñîáèðàåòñÿ.
Íàøà ïðîãðàììà ñîñòîèò èç îäíîé ôóíêöèè main, è êðóãëûå ñêîáêè óêàçûâàþò èìåííî íà òî, ÷òî main() — èìÿ ôóíêöèè.
/*ïðîñòàÿ ïðîãðàììà*/ — êîììåíòàðèé.
Âû ìîæåòå èñïîëüçîâàòü ïàðû ñèìâîëîâ /* è */ â êà÷åñòâå îòáûâàþùåé è çàêðûâàþùåé ñêîáîê äëÿ êîììåíòàðèÿ. Êîììåíòàðèè — ýòî ïðèìå÷àíèÿ, ïîìîãàþùèå ïîíÿòü ñìûñë ïðîãðàììû. Îíè ïðåäíàçíà÷åíû äëÿ ÷èòàòåëÿ è èãíîðèðóþòñÿ êîìïèëÿòîðîì.
{ — íà÷àëî òåëà ôóíêöèè.
Îòêðûâàþùàÿ ôèãóðíàÿ ñêîáêà îòìå÷àåò íà÷àëî ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ, îáðàçóþùèõ òåëî (èëè îïðåäåëåíèå) ôóíêöèè. Êîíåö îïðåäåëåíèÿ îòìå÷àåòñÿ çàêðûâàþùåé ôèãóðíîé ñêîáêîé }.
Int num; — îïåðàòîð îïèñàíèÿ.
Ñ ïîìîùüþ òàêîãî îïåðàòîðà ìû îáúÿâëÿåì, ÷òî áóäåì èñïîëüçîâàòü â ïðîãðàììå ïåðåìåííóþ num, êîòîðàÿ ïðèíèìàåò öåëûå (int) çíà÷åíèÿ.
Num =1; — îïåðàòîð ïðèñâàèâàíèÿ.
Ýòîò îïåðàòîð ñëóæèò äëÿ ïðèñâàèâàíèÿ ïåðåìåííîé num çíà÷åíèÿ 1.
Printf (" ß ïðîñòàÿ"); — îïåðàòîð âûâîäà íà ïå÷àòü.
Ñ åãî ïîìîùüþ âûâîäèòñÿ íà ïå÷àòü ôðàçà, çàêëþ÷åííàÿ â êàâû÷êè: ß ïðîñòàÿ.
Printf(" âû÷èñëèòåëüíàÿ ìàøèíà.\n"); — åùå îäèí îïåðàòîð âûâîäà íà ïå÷àòü.
Ýòîò îïåðàòîð äîáàâëÿåò ñëîâà âû÷èñëèòåëüíàÿ ìàøèíà. â êîíåö ïîñëåäíåé ïå÷àòàåìîé ôðàçû. Êîìáèíàöèÿ ñèìâîëîâ \n óêàçûâàåò êîìïèëÿòîðó íà íà÷àëî íîâîé ñòðîêè.
Printf ("Ìîå ëþáèìîå ÷èñëî %d, ïîòîìó ÷òî îíî ñàìîå ïåðâîå. \n", num);
Ýòîò îïåðàòîð âûâîäèò íà ïå÷àòü çíà÷åíèå ïåðåìåííîé num (ðàâíîå 1), ñîäåðæàùååñÿ âî ôðàçå â êàâû÷êàõ. Ñèìâîëû %d óêàçûâàþò êîìïèëÿòîðó, ãäå è â êàêîé ôîðìå ïå÷àòàòü çíà÷åíèå ýòîé ïåðåìåííîé num.
} — êîíåö. Êàê óæå óïîìèíàëîñü, ïðîãðàììà çàâåðøàåòñÿ çàêðûâàþùåé ôèãóðíîé ñêîáêîé.
Âòîðîé ïðîñìîòð: äåòàëè.
#include < stdio.h>:
Ôàéë ñ èìåíåì stdio.h ÿâëÿåòñÿ ÷àñòüþ ïàêåòà, èìåþùåãîñÿ â ëþáîì êîìïèëÿòîðå ÿçûêà Ñè è ñîäåðæàùåãî èíôîðìàöèþ î ââîäå-âûâîäå (íàïðèìåð, ñðåäñòâà âçàèìîäåéñòâèÿ ïðîãðàììû ñ âàøèì òåðìèíàëîì).  êà÷åñòâå èìåíè ôàéëà èñïîëüçóåòñÿ àááðåâèàòóðà àíãëèéñêèõ ñëîâ:
Standard inðut/îutðut header — ñòàíäàðòíûé çàãîëîâîê ââîäà-âûâîäà.
(Ïðîãðàììèñòû íàçûâàþò íàáîð äàííûõ, ñîäåðæàùèéñÿ â íà÷àëå ôàéëà, çàãîëîâêîì.) íåêîòîðûõ ñëó÷àÿõ âêëþ÷åíèå ýòîé ñòðîêè â íà÷àëî ïðîãðàììû îáÿçàòåëüíî, à â íåêîòîðûõ — íåò. Ìû íå ìîæåì äàòü îäíîçíà÷íóþ ðåêîìåíäàöèþ, ïîñêîëüêó îòâåò çàâèñèò êàê îò ïðîãðàììû, òàê è îò èñïîëüçóåìîé âàìè âû÷èñëèòåëüíîé ñèñòåìû. Ïðè ðàáîòå íà íàøåé ñèñòåìå ââîäèòü óêàçàííóþ ñòðîêó â ýòó ïðîãðàììó ñîâñåì íå îáÿçàòåëüíî, íî íà ñèñòåìå, èìåþùåéñÿ ó âàñ, îíà ìîæåò áûòü íåîáõîäèìîé.  ëþáîì ñëó÷àå åå èñïîëüçîâàíèå íå ïðèíåñåò íèêàêîãî âðåäà.  äàëüíåéøåì ìû áóäåì óêàçûâàòü ýòó ñòðîêó òîëüêî òîãäà, êîãäà äåéñòâèòåëüíî íåîáõîäèìî.
Âîçìîæíî, âàñ óäèâëÿåò, ïî÷åìó îäíî èç îñíîâíûõ ñðåäñòâ ÿçûêà — ïðîöåäóðû ââîäà-âûâîäà — íå âêëþ÷àåòñÿ êîìïèëÿòîðîì â ïðîãðàììó àâòîìàòè÷åñêè. Äåëî â òîì, ÷òî ýòîò ïàêåò èñïîëüçóåòñÿ äàëåêî íå âñåãäà, à âåäü îäíà èç öåëåé ñîçäàíèÿ ÿçûêà Ñè — ïîëó÷åíèå êîìïàêòíîãî îáúåêòíîãî êîäà. Ìåæäó ïðî÷èì, óïîìÿíóòàÿ ñòðîêà íå ÿâëÿåòñÿ äàæå îïåðàòîðîì ÿçûêà Ñè. Ñèìâîë # óêàçûâàåò, ÷òî îíà äîëæíà áûòü îáðàáîòàíà "ïðåïðîöåññîðîì" ÿçûêà Ñè. Êàê âû óæå ìîãëè ïðåäïîëîæèòü èç íàçâàíèÿ, ïðåïðîöåññîð îñóùåñòâëÿåò íåêîòîðóþ ïðåäâàðèòåëüíóþ îáðàáîòêó òåêñòà ïðîãðàììû ïåðåä íà÷àëîì êîìïèëÿöèè.  äàëüíåéøåì ìû ðàññìîòðèì íåñêîëüêî ïðèìåðîâ èñïîëüçîâàíèÿ êîìàíä ïðåïðîöåññîðà.
Main().
Âûáîð èìåíè main â êà÷åñòâå íàçâàíèÿ íàøåé ïðîãðàììû äîâîëüíî î÷åâèäåí; áîëåå òîãî, íàçâàòü åå êàê-òî ïî-äðóãîìó è íåëüçÿ. Äåëî â òîì, ÷òî ïðîãðàììà, íàïèñàííàÿ íà ÿçûêå Ñè, âñåãäà íà÷èíàåò âûïîëíÿòüñÿ ñ ôóíêöèè, íàçûâàåìîé main(), ïîýòîìó ìû èìååì âîçìîæíîñòü âûáèðàòü èìåíà äëÿ âñåõ èñïîëüçóåìûõ íàìè Ôóíêöèé êðîìå òîé, ñ êîòîðîé íà÷èíàåòñÿ âûïîëíåíèå ïðîãðàììû. Çà÷åì çäåñü ñêîáêè? Êàê óæå óïîìèíàëîñü, îíè óêàçûâàþò íà òî, ÷òî main() — èìÿ ôóíêöèè. Äîïîëíèòåëüíûå âîïðîñû, îòíîñÿùèåñÿ ê ôóíêöèÿì, áóäóò îáñóæäàòüñÿ íèæå. Çäåñü ìû òîëüêî ïîâòîðèì, ÷òî ôóíêöèè — ýòî îñíîâíûå ìîäóëè ïðîãðàììû, íàïèñàííîé èà ÿçûêå Ñè.
 êðóãëûõ ñêîáêàõ â îáùåì ñëó÷àå ñîäåðæèòñÿ èíôîðìàöèÿ, ïåðåäàâàåìàÿ ýòîé ôóíêöèè.  íàøåì ïðîñòîì ïðèìåðå ïåðåäà÷à èíôîðìàöèè îòñóòñòâóåò è, ñëåäîâàòåëüíî, â ñêîáêàõ íè÷åãî íå ñîäåðæèòñÿ. Çàêàí÷èâàÿ îáñóæäåíèå äàííîãî âîïðîñà, äàäèì âàì îäù ñîâåò: ïðè íàïèñàíèè ïðîãðàììû ñòàðàéòåñü íå ïðîïóñêàòü ñêîáîê.
Ôàéë, ñîäåðæàùèé ïðîãðàììó, ìîæåò èìåòü ëþáîå èìÿ, ïðàâäà, ñ òåì îãðàíè÷åíèåì, ÷òî îíî äîëæíî óäîâëåòâîðÿòü ñèñòåìíûì ñîãëàøåíèÿì è îêàí÷èâàòüñÿ ñèìâîëîì .ñ. Íàïðèìåð, âìåñòî main.ñ ìû ìîãëè áû âûáðàòü èìåíà mighty.ñ èëè silly.ñ.
/*ïðîñòàÿ ïðîãðàììà*/:
Èñïîëüçîâàíèå êîììåíòàðèåâ îáëåã÷àåò ïðîöåññ ïîíèìàíèÿ âà øåé ïðîãðàììû ëþáûì ïðîãðàììèñòîì (âêëþ÷àÿ âàñ ñàìèõ) Áîëüøèì óäîáñòâîì ïðè íàïèñàíèè êîììåíòàðèåâ ÿâëÿåòñÿ âîç ìîæíîñòü ðàñïîëàãàòü èõ íà òîé æå ñòðîêå, ÷òî è îïåðàöèè, êîòî ðûå îíè îáúÿñíÿþò. Äëèííûé êîììåíòàðèé ìîæåò ïîìåùàòüñÿ íà îòäåëüíîé ñòðîêå èëè äàæå çàíèìàòü íåñêîëüêî ñòðîê. Âñå, ÷òî íà õîäèòñÿ ìåæäó ñèìâîëîì, óêàçûâàþùèì íà íà÷àëî êîììåíòàðèÿ /*, è ñèìâîëîì, óêàçûâàþùèì íà åãî êîíåö */, èãíîðèðóåòñÿ êîìïèëÿòîðîì, ïîñêîëüêó îí íå â ñîñòîÿíèè èíòåðïðåòèðîâàâ ÿçûê, îòëè÷àþùèéñÿ îò Ñè.
{ è }:
Ôèãóðíûå ñêîáêè { } (è òîëüêî îíè) îòìå÷àþò íà÷àëî è êîíåö òåëà ôóíêöèè. Äëÿ ýòîé öåëè íå èñïîëüçóþòñÿ íè êðóãëûå (), íè êâàäðàòíûå [] ñêîáêè. Ôèãóðíûå ñêîáêè ïðèìåíÿþòñÿ òàêæå äëÿ òîãî, ÷òîáû îáúåäèíèòü íåñêîëüêî îïåðàòîðîâ ïðîãðàììû â ñåãìåíò èëè "áëîê". Åñëè âû çíàêîìû ñ òàêèìè ÿçûêàìè, êàê Ïàñêàëü èëè Àëãîë, âû ëåãêî ñîîáðàçèòå, ÷òî òàêèå ñêîáêè àíàëîãè÷íû îïåðàòîðàì begin è end â ýòèõ ÿçûêàõ.
Int num;:
"Îïåðàòîð îïèñàíèÿ ïåðåìåííîé" — îäíî èç âàæíåéøèõ ñðåäñòâ ÿçûêà Ñè. Êàê óæå óïîìèíàëîñü âûøå, â íàøåì ïðîñòîì ïðèìåð ââîäÿòñÿ äâà ïîíÿòèÿ. Ïåðâîå — èñïîëüçîâàíèå â òåëå ôóíêöèè "ïåðåìåííîé", èìåþùåé èìÿ num; âòîðîå — ñ ïîìîùüþ ñëîâà int îáúÿâëÿåòñÿ, ÷òî ïåðåìåííàÿ num ïðèíèìàåò öåëûå çíà÷åíèÿ. Òî÷êà ñ çàïÿòîé â êîíöå ñòðîêè óêàçûâàåò íà òî, ÷òî â íåé ñîäåðæèòñÿ îïåðàòîð ÿçûêà Ñè, ïðè÷åì ýòîò ñèìâîë ÿâëÿåòñÿ çäåñü ÷àñòüþ îïåðàòîðà, à íå ðàçäåëèòåëåì îïåðàòîðîâ, êàê â Ïàñêàëå.
Ñëîâî int ñëóæèò "êëþ÷åâûì ñëîâîì", îïðåäåëÿþùèì îäèí èç îñíîâíûõ òèïîâ äàííûõ ÿçûêà Ñè. Êëþ÷åâûìè ñëîâàìè íàçûâàþòñÿ ñïåöèàëüíûå çàðåçåðâèðîâàííûå ñëîâà, èñïîëüçóåìûå äëÿ ïî ñòðîåíèÿ ôðàç ÿçûêà; ñïèñîê êëþ÷åâûõ ñëîâ âû ìîæåòå íàéòè â ïðèëîæåíèè â êîíöå êíèãè.
 ÿçûêå Ñè âñå ïåðåìåííûå äîëæíû áûòü îáúÿâëåíû. Ýòî îçíà÷àåò, ÷òî, âî-ïåðâûõ, â íà÷àëå ïðîãðàììû âû äîëæíû ïðèâåñòè ñïèñîê âñåõ èñïîëüçóåìûõ ïåðåìåííûõ, à âî-âòîðûõ, íåîáõîäèìî óêàçàòü "òèï" êàæäîé èç íèõ. Âîîáùå îáúÿâëåíèå ïåðåìåííûõ ñ÷èòàåòñÿ "õîðîøèì ñòèëåì" ïðîãðàììèðîâàíèÿ.
Çäåñü âû ìîæåòå çàäàòü òðè âîïðîñà. Ïåðâûé: êàêèì îáðàçîì íàäî âûáèðàòü èìåíà? Âòîðîé: ÷òî òàêîå òèïû äàííûõ? Òðåòèé: çà÷åì âîîáùå òðåáóåòñÿ îáúÿâëÿòü ïåðåìåííûå? Îòâåòû íà ïåðâûé è òðåòèé âîïðîñû ïðèâåäåíû íèæå è îòìå÷åíû âåðòèêàëüíîé ëèíåéêîé ãîëóáîãî öâåòà.
Âòîðîé âîïðîñ ìû îáñóäèì â ãë. 3, à çäåñü ñäåëàåì êðàòêîå çàìå÷àíèå. ßçûê Ñè èìååò äåëî ñ íåêîòîðûìè êëàññàìè (èëè "òèïàìè") äàííûõ: öåëûìè ÷èñëàìè, ñèìâîëàìè è ÷èñëàìè ñ ïëàâàþùåé òî÷êîé. Îáúÿâëåíèå ïåðåìåííîé, èìåþùåé öåëûé èëè ñèìâîëüíûé òèï ïîçâîëÿåò êîìïèëÿòîðó ðàçìåùàòü äàííûå â ïàìÿòè, îñóùåñòâëÿòü èõ âûáîðêó è èíòåðïðåòèðîâàòü íóæíûì îáðàçîì.
Âûáîð èìåíè.
Ìû ïðåäïîëàãàåì, ÷òî âû èñïîëüçóåòå îñìûñëåííûå îáîçíà÷åíèÿ ïåðåìåííûõ. Èìÿ ïåðåìåííîé ìîæåò ñîäåðæàòü îò îäíîãî äî âîñüìè ñèìâîëîâ. (Ôàêòè÷åñêè âû ìîæåòå èñïîëüçîâàòü è áîëüøåå èõ ÷èñëî, íî êîìïèëÿòîð ïðîïóñòèò æå ñèìâîëû, íà÷èíàÿ ñ äåâÿòîãî. Ïîýòîìó èìåíà shakespeare è shakespencil ñ÷èòàëèñü áû îäèíàêîâûìè, ïîñêîëüêó ïåðâûå âîñåìü áóêâ ó íèõ ñîâïàäàþò.) Äëÿ îáðàçîâàíèÿ èìåíè ïåðåìåííîé ðàçðåøàåòñÿ èñïîëüçîâàòü ñòðî÷íûå è ïðîïèñíûå áóêâû, öèôðû è ñèìâîë ïîä÷åðêèâàíèÿ, ñ÷èòàþùèéñÿ áóêâîé. Ïåðâûì ñèìâîëîì äîëæíà áûòü îáÿçàòåëüíî áóêâà.
| Ïðàâèëüíûå èìåíà | Íåïðàâèëüíûå èìåíà |
|---|---|
| wiggly | $Z^** cat1 |
| 1cat Hot_Tub | Hot-Tub _kcaB |
| don' t |
 áèáëèîòå÷íûõ ïðîöåäóðàõ ÷àñòî èñïîëüçóþòñÿ èìåíà, íà÷èíàþùèåñÿ ñ ñèìâîëà ïîä÷åðêèâàíèÿ: Ýòî äåëàåòñÿ â ïðåäïîëîæåíèè, ÷òî ïîëüçîâàòåëè âðÿä ëè âûáåðóò èìåíà, íà÷èíàþùèåñÿ ñ ýòîãî ñèìâîëà, ïîýòîìó ìàëîâåðîÿòíî, ÷òî îäíî èç íèõ áóäåò ñëó÷àéíî âûáðàíî äëÿ îáîçíà÷åíèÿ äðóãîãî ïîíÿòèÿ. Ñòàðàéòåñü èâ èñïîëüçîâàòü èìåí, íà÷èíàþùèõñÿ ñ ñèìâîëà ïîä÷åðêèâàíèÿ, è âàì óäàñòñÿ èçáåæàòü âçàèìîïåðåñå÷åíèé ñ ìíîæåñòâîì áèáëèîòå÷íûõ èìåí.
×åòûðå äîâîäà â ïîëüçó îáúÿâëåíèÿ ïåðåìåííûõ.
1. Ñâåäåíèå âñåõ îïåðàòîðîâ îáúÿâëåíèÿ ïåðåìåííûõ â íà÷àëî ïðîãðàììû îáëåã÷àåò ïîíèìàíèå åå ñìûñëà. Ýòî îñîáåííî ñïðàâåäëèâî, åñëè âû äàåòå ïåðåìåííûì îñìûñëåííûå èìåíà (íàïðèìåð, taxrate [íàëîãîâûé òàðèô] âìåñòî r) è, êðîìå òîãî, âêëþ÷àåòå â ïðîãðàììó êîììåíòàðèè äëÿ îáúÿñíåíèÿ òîãî, ÷òî îáîçíà÷àþò ïåðåìåííûå. Äîêóìåíòèðîâàíèå ïðîãðàììû ïîäîáíûì îáðàçîì ÿâëÿåòñÿ îäíèì èç îñíîâíûõ ïðèçíàêîâ õîðîøåãî ñòèëÿ ïðîãðàììèðîâàíèÿ.
2. Ðàçìûøëåíèå î òîì, ÷òî ïîìåñòèòü â ñåêöèþ îáúÿâëåíèÿ ïåðåìåííûõ, ïîáóæäàåò ñïëàíèðîâàòü ïðîãðàììó ïåðåä òåì, êàê ïîãðóçèòüñÿ â åå íàïèñàíèå. Ýòî ýêâèâàëåíòíî ïîëó÷åíèþ îòâåòîâ íà âîïðîñû: êàêàÿ èíôîðìàöèÿ íåîáõîäèìà ïðîãðàììå ïðè çàïóñêå? Êàêóþ âûõîäíóþ èíôîðìàöèþ õîòåëîñü áû ïîëó÷èòü?
3. Îáúÿâëåíèå ïåðåìåííûõ ïîçâîëÿåò èçáåæàòü îäíîé èç íàèáîëåå êîâàðíûõ è òðóäíîîáíàðóæèâàåìûõ îøèáîê — íåïðàâèëüíî íàïèñàííûõ èìåí. Íàïðèìåð, ïðåäïîëîæèì, ÷òî ïðîãðàììèðóÿ íà íåêîòîðîì ÿçûêå, âû èñïîëüçîâàëè îïåðàòîð.
B0ZO = 32.4,
À äàëüøå â ïðîãðàììå âû îøèáî÷íî íàïèñàëè.
ANS = 19.7* BOZO — 2.0.
Ñëó÷àéíî çàìåíèâ öèôðó 0 áóêâîé Î. Âñëåäñòâèå ýòîãî â ïðîãðàììå ïîÿâèòñÿ íîâàÿ ïåðåìåííàÿ ñ èìåíåì BOZO, è áóäåò èñïîëüçîâàíî êàêîå-òî åå çíà÷åíèå (âîçìîæíî íóëü èëè êàêîé-òî "ìóñîð").  ðåçóëüòàòå ïåðåìåííàÿ ANS ïîëó÷èò íåïðàâèëüíîå çíà÷åíèå, è âû, âîçìîæíî, ïîòðàòèòå ìíîãî âðåìåíè, ïûòàÿñü íàéòè ïðè÷èíó. Ýòî íå ìîæåò ïðîèçîéòè ïðè ïðîãðàììèðîâàíèè íà ÿçûêå Ñè (åñëè òîëüêî âû íå îáúÿâèëè äâå ïåðåìåííûå ñî ñòîëü ïîõîæèìè èìåíàìè), ïîñêîëüêó êîìïèëÿòîð ñðàçó âûäàñò ñîîáùåíèå îá îøèáêå, êàê òîëüêî âñòðåòèò â ïðîãðàììå íåîáúÿâëåííóþ ïåðåìåííóþ ñ èìåíåì BOZO.
4. Ëþáàÿ ïðîãðàììà, íàïèñàííàÿ íà ÿçûêå Ñè, íå áóäåò âûïîëíÿòüñÿ, åñëè íå îïèñàòü âñå èñïîëüçóåìûå ïåðåìåííûå. Ìû ïîëàãàåì, ÷òî ïîñëåäíèé äîâîä îêàæåòñÿ ðåøàþùèì â òîì ñëó÷àå, åñëè ïåðâûå òðè âàñ íå óáåäèëè.

Num = 1;:
"Îïåðàòîð ïðèñâàèâàíèÿ" ÿâëÿåòñÿ îäíèì èç îñíîâíûõ ñðåäñòâ ÿçûêà. Ïðèâåäåííóþ âûøå ñòðîêó ïðîãðàììû ìîæíî èíòåðïðåòèðîâàòü.

ÐÈÑ. 2.2. Îïåðàòîð ïðèñâàèâàíèÿ — îäèí èç îñíîâíûõ îïåðàòîðîâ.
Òàê: "ïðèñâîèòü ïåðåìåííîé num çíà÷åíèå 1". Äåëî â òîì, ÷òî, ñîãëàñíî îïåðàòîðó â ÷åòâåðòîé ñòðîêå ïðîãðàììû, ïåðåìåííîé num áûëà âûäåëåíà ÿ÷åéêà ïàìÿòè, è òîëüêî òåïåðü â ðåçóëüòàòå âûïîëíåíèÿ îïåðàòîðà ïðèñâàèâàíèÿ ïåðåìåííàÿ ïîëó÷àåò ñâîå çíà÷åíèå. Ïðè æåëàíèè ìû ìîãëè áû ïðèñâîèòü åé äðóãîå çíà÷åíèå — âîò ïî÷åìó èìÿ num îáîçíà÷àåò ïåðåìåííóþ. Îòìåòèì, ÷òî ýòîò îïåðàòîð òîæå çàêàí÷èâàåòñÿ òî÷êîé ñ çàïÿòîé.
Printf (" ß ïðîñòàÿ");
Printf ("âû÷èñëèòåëüíàÿ ìàøèíà. \n");
Printf ("Ìîå ëþáèìîå ÷èñëî %d, ïîòîìó ÷òî îíî ñàìîå ïåðâîå.\n", num);
Âî âñåõ ýòèõ ñòðîêàõ èñïîëüçóåòñÿ ñòàíäàðòíàÿ ôóíêöèÿ ÿçûêà Ñè, íàçûâàåìàÿ printf(); ñêîáêè óêàçûâàþò íà òî, ÷òî ìû, êîíå÷íî æå, èìååì äåëî ñ ôóíêöèåé. Ñòðîêà ñèìâîëîâ, çàêëþ÷åííàÿ â ñêîáêè, ÿâëÿåòñÿ èíôîðìàöèåé, ïåðåäàâàåìîé ôóíêöèè printf() èç íàøåé ãëàâíîé ôóíêöèè [main()].
Òàêàÿ èíôîðìàöèÿ íàçûâàåòñÿ "àðãóìåíòîì"; â ïåðâîì ñëó÷àå àðãóìåíòîì ÿâëÿåòñÿ ñòðîêà "ß ïðîñòàÿ". Âîçíèêàåò âîïðîñ: ÷òî ôóíêöèÿ printf() äåëàåò ñ ýòèì àðãóìåíòîì? Îòâåò äîâîëüíî î÷åâèäåí: îíà ïðîñìàòðèâàåò âñå ñèìâîëû, ñîäåðæàùèåñÿ ìåæäó êàâû÷êàìè, è âûâîäèò èõ íà ýêðàí òåðìèíàëà.

ÐÈÑ. 2.3. Âèä ôóíêöèè printf () è åå àðãóìåíòà.
Äàííàÿ ñòðîêà äàåò íàì ïðèìåð òîãî, êàê ìû "âûçûâàåì" ôóíêöèþ èëè "îáðàùàåìñÿ" ê íåé, ïðîãðàììèðóÿ íà ÿçûêå Ñè. Äëÿ ýòîãî òðåáóåòñÿ òîëüêî óêàçàòü èìÿ ôóíêöèè è çàêëþ÷èòü òðåáóåìûé àðãóìåíò (èëè àðãóìåíòû) â ñêîáêè. Êîãäà ïðè âûïîëíåíèè âàøà ïðîãðàììà "äîñòèãíåò" ýòîé ñòðîêè, óïðàâëåíèå áóäåò ïåðåäàíî óêàçàííîé ôóíêöèè [â äàííîì ñëó÷àå printf()]. Êîãäà âûïîëíåíèå ôóíêöèè áóäåò çàâåðøåíî, óïðàâëåíèå âåðíåòñÿ îáðàòíî â èñõîäíóþ ("âûçûâàþùóþ") ïðîãðàììó.
×òî ìîæíî ñêàçàòü ïî ïîâîäó ñëåäóþùåé ñòðîêè ïðîãðàììû?  íåé èìåþòñÿ ñèìâîëû \n, êîòîðûå íå ïîÿâèëèñü íà ýêðàíå.  ÷åì äåëî? Ýòè ñèìâîëû ñëóæàò äèðåêòèâîé íà÷àòü íîâóþ ñòðîêó íà óñòðîéñòâå âûâîäà. Êîìáèíàöèÿ \n íà ñàìîì äåëå ïðåäñòàâëÿåò ñîáîé îäèí ñèìâîë, íàçûâàåìûé "íîâàÿ ñòðîêà". Åãî ñìûñë êðàòêî ôîðìóëèðóåòñÿ òàê: íà÷àòü âûâîä íîâîé ñòðîêè ñ ñàìîé ëåâîé êîëîíêè. Äðóãèìè ñëîâàìè, ñ ïîìîùüþ ýòîãî ñèìâîëà îñóùåñòâëÿþòñÿ òå æå ôóíêöèè, ÷òî è ñ ïîìîùüþ êëàâèøè [ââîä], èìåþùåéñÿ íà îáû÷íîì òåðìèíàëå. Íî âû ìîæåòå ñêàçàòü, ÷òî êîìáèíàöèÿ \n âûãëÿäèò, êàê äâà ñèìâîëà, à íå êàê îäèí. Âû, êîíå÷íî æå, ïðàâû, íî ïðîñòî ïî ñìûñëó îíè ïðåäñòàâëÿþò ñîáîé îäèí ñèìâîë, äëÿ êîòîðîãî íå ñóùåñòâóåò ñîîòâåòñòâóþùåé êëàâèøè íà êëàâèàòóðå. Âîçíèêàåò âîïðîñ: ïî÷åìó äëÿ ýòîé öåëè íåëüçÿ èñïîëüçîâàòü êëàâèøó [ââîä]?  îòâåò ñêàæåì, ÷òî ýòî ìîæåò áûòü èíòåðïðåòèðîâàíî êàê íåêîòîðàÿ äèðåêòèâà âàøåìó òåêñòîâîìó ðåäàêòîðó, à íå êàê êîìàíäà, êîòîðàÿ äîëæíà áûòü ïîìåùåíà â ïàìÿòü ÝÂÌ. Äðóãèìè ñëîâàìè, êîãäà âû íàæèìàåòå êëàâèøó [ââîä], ðåäàêòîð ïðåêðàùàåò çàïîëíåíèå òåêóùåé ñòðîêè, ñ êîòîðîé âû â äàííûé ìîìåíò ðàáîòàåòå, è íà÷èíàåò íîâóþ ñòðîêó, îñòàâëÿÿ ñòàðóþ íåîêîí÷åííîé.
Ñèìâîë "íîâàÿ ñòðîêà" ñëóæèò îäíèì èç ïðèìåðîâ òîãî, ÷òî íàçûâàåòñÿ "óïðàâëÿþùåé ïîñëåäîâàòåëüíîñòüþ". Ýòà ïîñëåäîâàòåëüíîñòü èñïîëüçóåòñÿ äëÿ ïðåäñòàâëåíèÿ ñèìâîëîâ, êîòîðûå òðóäíî èëè âîîáùå íåâîçìîæíî ââîäèòü ñ îáû÷íîé êëàâèàòóðû. Äðóãèìè ïðèìåðàìè ñëóæàò \t äëÿ òàáóëÿöèè è \b äëÿ âîçâðàòà íà îäíó ïîçèöèþ.  ëþáîì ñëó÷àå óïðàâëÿþùàÿ ïîñëåäîâàòåëüíîñòü íà÷èíàåòñÿ ñî çíàêà \. Ìû âåðíåìñÿ ê îáñóæäåíèþ ýòîãî âîïðîñà â ãë. 3.
Òåïåðü, ìû äóìàåì, ñòàëî ïîíÿòíî, ïî÷åìó òðè îïåðàòîðà ïå÷àòè âûâåëè íà ýêðàí òîëüêî äâå ñòðîêè: àðãóìåíò ïåðâîãî îïåðàòîðà íå ñîäåðæàë ñèìâîëà "íîâàÿ ñòðîêà".
Âèä âòîðîé ñòðîêè, ïîÿâèâøåéñÿ íà ýêðàíå, ìîæåò âûçâàòü íåäîóìåííûé âîïðîñ: ïî÷åìó îòñóòñòâóþò ñèìâîëû %d, èìåþùèåñÿ â îïåðàòîðå âûâîäà? Íàïîìíèì, ÷òî íàïå÷àòàííàÿ ñòðîêà èìåëà ñëåäóþùèé âèä:
Ìîå ëþáèìîå ÷èñëî1, ïîòîìó ÷òî îíî ñàìîå ïåðâîå.
Âû, íàâåðíîå, óæå äîãàäàëèñü — ïðè ïå÷àòè âìåñòî ñèìâîëîâ %d áûëî ïîäñòàâëåíî ÷èñëî 1, ÿâëÿþùååñÿ çíà÷åíèåì ïåðåìåííîé num. Ïî-âèäèìîìó, êîìáèíàöèÿ ñèìâîëîâ %d ñëóæèò ñâîåãî ðîäà óêàçàòåëåì ìåñòà â ñòðîêå, êóäà íåîáõîäèìî âñòàâèòü çíà÷åíèå ïåðåìåííîé num ïðè ïå÷àòè. Íà ÿçûêå Áåéñèê àíàëîãè÷íûé îïåðàòîð ïå÷àòè âûãëÿäåë áû ñëåäóþùèì îáðàçîì:
PRINT "Ìîå ëþáèìîå ÷èñëî"; num; "ïîòîìó ÷òî îíî ñàìîå ïåðâîå".
ÑÒÐÓÊÒÓÐÀ ÏÐÎÑÒÎÉ ÏÐÎÃÐÀÌÌÛ.
Òåïåðü, ïîñëå òîãî êàê ìû ïðèâåëè êîíêðåòíûé ïðèìåð, âû ãîòîâû ê òîìó, ÷òîáû ïîçíàêîìèòüñÿ ñ íåñêîëüêèìè îáùèìè ïðàâèëàìè, êàñàþùèìèñÿ ïðîãðàìì, íàïèñàííûõ íà ÿçûêå Ñè. Ïðîãðàììà ñîñòîèò èç îäíîé èëè áîëåå ôóíêöèé, ïðè÷åì êàêàÿ-òî èç íèõ îáÿçàòåëüíî äîëæíà íàçûâàòüñÿ main(). Îïèñàíèå ôóíêöèè ñîñòîèò èç çàãîëîâêà è òåëà. Çàãîëîâîê â ñâîþ î÷åðåäü ñîñòîèò èç äèðåêòèâ ïðåïðîöåññîðà òèïà #include è ò. ä. è èìåíè ôóíêöèè.

ÐÈÑ. 2.4. Ñòðóêòóðà ôóíêöèè â ÿçûêå Ñè: çàãîëîâîê è òåëî.
ÍÅÑÊÎËÜÊÎ ÑÎÂÅÒÎÂ, ÊÀÊ ÑÄÅËÀÒÜ ÏÐÎÃÐÀÌÌÓ ×ÈÒÀÅÌÎÉ.
Ñîçäàíèå ÷èòàåìîé ïðîãðàììû ñëóæèò ïðèçíàêîì õîðîøåãî ñòèëÿ ïðîãðàììèðîâàíèÿ. Ýòî ïðèâîäèò ê îáëåã÷åíèþ ïîíèìàíèÿ ñìûñëà ïðîãðàììû, ïîèñêà îøèáîê è â ñëó÷àå íåîáõîäèìîñòè åå ìîäèôèêàöèè. Äåéñòâèÿ, ñâÿçàííûå ñ óëó÷øåíèåì ÷èòàåìîñòè ïðîãðàììû, êðîìå òîãî, ïîìîãóò áîëåå ÷åòêî ïîíÿòü, ÷òî ïðîãðàììà äåëàåò. Íà ïðîòÿæåíèè âñåãî èçëîæåíèÿ ìû áóäåì ïûòàòüñÿ óêàçûâàòü ïîëåçíûå ïðèåìû, ñïîñîáñòâóþùèå äîñòèæåíèþ ýòîé öåëè.
Ìû óæå óïîìèíàëè î äâóõ òàêèõ ñïîñîáàõ: âûáîð îñìûñëåííûõ îáîçíà÷åíèé äëÿ ïåðåìåííûõ è èñïîëüçîâàíèå êîììåíòàðèåâ. Çàìåòèì, ÷òî ýòè äâà ìåòîäà äîïîëíÿþò äðóã äðóãà. Åñëè âû äàëè ïåðåìåííîé èìÿ width (øèðèíà), òî íåîáõîäèìîñòü â êîììåíòàðèè, ñîîáùàþùåì î òîì, ÷òî äàííàÿ ïåðåìåííàÿ îïðåäåëÿåò øèðèíó, îòïàäàåò.
Åùå îäèí ïðèåì ñîñòîèò â èñïîëüçîâàíèè ïóñòûõ ñòðîê äëÿ òîãî, ÷òîáû îòäåëèòü îäíó ÷àñòü ôóíêöèè, ñîîòâåòñòâóþùóþ íåêîòîðîìó ñåìàíòè÷åñêîìó ïîíÿòèþ, îò äðóãîé. Íàïðèìåð, â íàøåé ïðîñòîé ïðîãðàììå îäíà ïóñòàÿ ñòðîêà îòäåëÿåò îïèñàòåëüíóþ ÷àñòü îò âûïîëíÿåìîé (ïðèñâàèâàíèå çíà÷åíèÿ è âûâîä íà ïå÷àòü). Ñèíòàêñè÷åñêèå ïðàâèëà ÿçûêà Ñè íå òðåáóþò íàëè÷èÿ ïóñòîé ñòðîêè â äàííîì ìåñòå, íî ïîñêîëüêó ýòî ñòàëî óæå òðàäèöèåé, òî è ìû äåëàåì òàêæå.
×åòâåðòûé ïðèíöèï, êîòîðîìó ìû ñëåäóåì, çàêëþ÷àåòñÿ â òîì, ÷òîáû ïîìåùàòü êàæäûé îïåðàòîð íà îòäåëüíîé ñòðîêå. Îïÿòü æå ýòî òîëüêî ñîãëàøåíèå, êîòîðîå íèêàê íå ðåãëàìåíòèðóåòñÿ ïðàâèëàìè ÿçûêà, òàê êàê Ñè èìååò "ñâîáîäíûé ôîðìàò". Âû ìîæåòå ïîìåñòèòü íåñêîëüêî îïåðàòîðîâ íà îäíîé ñòðîêå èëè ðàñïðîñòðàíèòü îäèí îïåðàòîð íà íåñêîëüêî ñòðîê. Íèæåñëåäóþùèé ïðèìåð ÿâëÿåòñÿ àáñîëþòíî ïðàâèëüíîé ïðîãðàììîé:
Main().
{
Int four; four = 4;
Printf(" %d \n", four);
}
Ñîâåðøåííî î÷åâèäíî, ÷òî ñèìâîë "òî÷êà ñ çàïÿòîé" óêàçûâàåò êîìïèëÿòîðó, ãäå êîí÷àåòñÿ îäèí îïåðàòîð è íà÷èíàåòñÿ ñëåäóþùèé, íî ëîãèêà ïðîãðàììû îêàæåòñÿ ïðîùå, åñëè âû ïîñëåäóåòå ñîãëàøåíèÿì, ïðèâåäåííûì âûøå. Ïîñêîëüêó â íàøåì ïðèìåðå çàïóòàííîé ëîãèêè íåò, âèä ïðîãðàììû â äàííîì ñëó÷àå íå âëèÿåò íà ïîíèìàíèå åå ñìûñëà, íî, ïî íàøåìó ìíåíèþ, ëó÷øå ïðèâèâàòü õîðîøèå ïðèâû÷êè ñ ñàìîãî íà÷àëà.

ÐÈÑ. 2.5. Ñïîñîáû óëó÷øåíèÿ ÷èòàåìîñòè ïðîãðàììû.
ÑËÅÄÓÞÙÈÉ ØÀÃ.
Íàøà ïåðâàÿ ïðîãðàììà áûëà äîâîëüíî ïðîñòîé, è ñëåäóþùèé ïðèìåð áóäåò íåíàìíîãî ñëîæíåå. Îí âûãëÿäèò òàê:
Main()/* Ïåðåâîäèò 2 ìîðñêèå ñàæåíè â ôóòû*/
{
Int feet, fathoms;
Fathoms = 2;
Feet = 6 *fathoms;
Printf (" Â %d ìîðñêèõ ñàæåíÿõ ñîäåðæèòñÿ %d ôóòîâ!", feet, fathoms);
}
×òî çäåñü íîâîãî?
Âî-ïåðâûõ, ìû îïèñàëè äâå ïåðåìåííûå âìåñòî îäíîé. Äëÿ ýòîãî ïîòðåáîâàëîñü òîëüêî ðàçäåëèòü â îïåðàòîðå îïèñàíèÿ èìåíà äâóõ ïåðåìåííûõ çàïÿòîé.
Âî-âòîðûõ, ìû âûïîëíèëè âû÷èñëåíèÿ — èñïîëüçîâàëè ãðîìàäíóþ âû÷èñëèòåëüíóþ ìîùíîñòü íàøåãî êîìïüþòåðà äëÿ óìíîæåíèÿ 2 íà 6.  Ñè, òàê æå êàê è âî ìíîãèõ äðóãèõ ÿçûêàõ, ñèìâîë * îáîçíà÷àåò óìíîæåíèå. Ïîýòîìó ñìûñë îïåðàòîðà.
Feet = 6 *fathoms;
Çàêëþ÷àåòñÿ â ñëåäóþùåì: âçÿòü âåëè÷èíó ïåðåìåííîé fathoms, óìíîæèòü åå íà 6 è ïðèñâîèòü ðåçóëüòàò ïåðåìåííîé feet. (Ñóäÿ ïî ýòîé ïàðàôðàçå, îáû÷íûé àíãëèéñêèé ÿçûê ìåíåå ëàêîíè÷åí, ÷åì ïðîñòîé ÿçûê Ñè; ýòî îäíà èç ïðè÷èí, ëåæàùèõ â îñíîâå ðàçðàáîòêè ÿçûêîâ ïðîãðàììèðîâàíèÿ.).
È íàêîíåö, ìû èñïîëüçîâàëè ôóíêöèþ printf() áîëåå ñëîæíûì îáðàçîì. Åñëè âû âûïîëíèòå ýòó ïðîãðàììó íà êîìïüþòåðå, òî ðåçóëüòàò äîëæåí âûãëÿäåòü òàê:
Ìîæíî çàìåòèòü, ÷òî áûëî ïðîèçâåäåíî äâå ïîäñòàíîâêè: ïåðâîå âõîæäåíèå ñèìâîëîâ %d â ñòðîêó, çàêëþ÷åííóþ â êàâû÷êè, áûëî çàìåíåíî çíà÷åíèåì ïåðâîé ïåðåìåííîé (fathoms) èç ñïèñêà, ñëåäóþùåãî çà óêàçàííîé ñòðîêîé, à âòîðîå — çíà÷åíèåì âòîðîé ïåðåìåííîé (feet) èç ýòîãî æå ñïèñêà. Îáðàòèòå âíèìàíèå, ÷òî ñïèñîê ïå÷àòàåìûõ ïåðåìåííûõ ðàñïîëîæåí â êîíöå îïåðàòîðà.
Îáëàñòü ïðèìåíåíèÿ äàííîé ïðîãðàììû íåñêîëüêî îãðàíè÷åííà, íî îíà ìîæåò ïîñëóæèòü ïðîîáðàçîì ïðîãðàììû ïåðåâîäà ìîðñêèõ ñàæåíåé â ôóòû. Âñå, ÷òî íàì ïîòðåáóåòñÿ — ñïåöèàëüíûé ñïîñîá ïðèñâàèâàíèÿ ïðîèçâîëüíûõ çíà÷åíèé ïåðåìåííîé feet; î òîì, êàê ýòî äåëàåòñÿ, âû óçíàåòå íåñêîëüêî ïîçæå.
ÄÎÏÎËÍÈÒÅËÜÍÛÉ ÏÐÈÌÅÐ.
Main()/* butler*/
{
Printf("ß âûçûâàþ ôóíêöèþ butler.\n");
Butler();
Printf ("Äà. Ïðèíåñèòå ìíå ÷àøêó ÷àÿ è ãèáêèå äèñêè.\n");
}
Butler().
{
Printf("Âû âûçûâàëè, ñýð?\n");
}
Ðåçóëüòàòû ðàáîòû ïðîãðàììû âûãëÿäÿò ñëåäóþùèì îáðàçîì:
ß âûçûâàþ ôóíêöèþ butler. Âû âûçûâàëè, ñýð? Äà. Ïðèíåñèòå ìíå ÷àøêó ÷àÿ è ãèáêèå äèñêè.
Ôóíêöèÿ butler() îïðåäåëÿåòñÿ òî÷íî òàê æå, êàê è ôóíêöèÿ main(); åå òåëî çàêëþ÷åíî â ôèãóðíûå ñêîáêè. Âûçîâ ôóíêöèè îñóùåñòâëÿåòñÿ ïóòåì ïðîñòîãî óêàçàíèÿ åå èìåíè, âêëþ÷àÿ êðóãëûå ñêîáêè. Ìû âåðíåìñÿ ê ýòîìó âàæíîìó âîïðîñó òîëüêî â ãë. 9, à çäåñü õîòåëè ïðîäåìîíñòðèðîâàòü òó ëåãêîñòü, ñ êîòîðîé âû ìîæåòå âêëþ÷àòü â ïðîãðàììó ñâîè ñîáñòâåííûå ôóíêöèè.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Íèæå ïðèâåäåíà êðàòêàÿ ñâîäêà ñòðîãèõ ïðàâèë (íî íå ÷ðåçìåðíî æåñòêèõ), êîòîðûå, ìû íàäååìñÿ, âû óñâîèëè. Ìû âêëþ÷èëè ñþäà æå êðàòêèå ïðèìåðû.
Êàê íàçâàòü ôàéë, ñîäåðæàùèé âàøó ïðîãðàììó: eye.ñ, èëè black.ñ, èëè infan.c è ò. ï.
Êàêîå èìÿ ìîæíî èñïîëüçîâàòü â êà÷åñòâå íàçâàíèÿ ïðîãðàììû, ñîñòîÿùåé èç îäíîé ôóíêöèè: main().
Ñòðóêòóðà ïðîñòîé ïðîãðàììû: çàãîëîâîê, òåëî, ôèãóðíûå ñêîáêè, îïåðàòîðû. Êàê îïèñàòü öåëóþ ïåðåìåííóþ: int varname;
Êàê ïðèñâîèòü çíà÷åíèå ïåðåìåííîé: varname = 1024;
Êàê íàïå÷àòàòü ôðàçó printf ("Õîòèòå êóïèòü óòêó?");
Êàê íàïå÷àòàòü çíà÷åíèå ïåðåìåííîé: printf ("%d", varname);
Ñèìâîë íîâàÿ ñòðîêà: \n.
Êàê âêëþ÷àòü êîììåíòàðèè â ïðîãðàììó: /*àíàëèç äâèæåíèÿ íàëè÷íûõ äåíåã*/
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Íèæå ïðèâåäåíî íåñêîëüêî âîïðîñîâ, êîòîðûå ïîìîãóò âàì ïðîâåðèòü è ðàñøèðèòü ñâîå ïîíèìàíèå ìàòåðèàëà äàííîé ãëàâû.
Âîïðîñû.
1. Èêàáîä Áîóäè Ìàðôóò (ÈÁÌ) ïîäãîòîâèë ïðîãðàììó, ïðèâåäåííóþ íèæå, è ïðèíåñ åå âàì äëÿ ïðîâåðêè. Ïîæàëóéñòà, ïîìîãèòå åìó íàéòè â íåé îøèáêè.
Include studio, h main{} /*ýòà ïðîãðàììà ïå÷àòàåò ÷èñëî íåäåëü â ãîäó/*
(
Int s.
S: = 56;
Print (Â ãîäó s íåäåëü.);
2. ×òî áóäåò íàïå÷àòàíî â êàæäîì èç ïðèìåðîâ, ïðèâåäåííûõ íèæå, â ïðåäïîëîæåíèè, ÷òî îíè ÿâëÿþòñÿ ÷àñòÿìè íåêîòîðûõ ïîëíûõ ïðîãðàìì?
A. printf(" Á-ý-ý Á-ý-ý, ×åðíàÿ Îâöà.");
À. printf("Ó òåáÿ åñòü øåðñòü?\n");
Á. ðrintf("Óáèðàéñÿ!\n Ìåøîê ñàëà!");
Â. printf("×òî?\n Íåò/n Êëàðíåò?\n");
Ã. int num;
Num = 2;
Printf(" %d + %d = %d", num, num, num + num);
Îòâåòû.
1.
Ñòðîêà 1:
Äàííàÿ ñòðîêà äîëæíà íà÷èíàòüñÿ ñ ñèìâîëà # ïðàâèëüíîå íàïèñàíèå èìåíè ôàéëà — stdio.h; èìÿ ôàéëà äîëæíî áûòü çàêëþ÷åíî â óãëîâûå ñêîáêè.
Ñòðîêà 2:
Âìåñòî ôèãóðíûõ ñêîáîê {} íåîáõîäèìî èñïîëüçîâàòü êðóãëûå ();
Êîììåíòàðèé äîëæåí îêàí÷èâàòüñÿ ñèìâîëàìè */, à íå /*
Ñòðîêà 3:
Âìåñòî êðóãëîé ñêîáêè ( äîëæíà ñòîÿòü ôèãóðíàÿ {.
Ñòðîêà 4:
Îïåðàòîð äîëæåí îêàí÷èâàòüñÿ ñèìâîëîì "òî÷êà ñ çàïÿòîé".
Ñòðîêà 5:
Ýòó ñòðîêó (ïóñòóþ) ì-ð ÈÁÌ íàïèñàë Ñîâåðøåííî ïðàâèëüíî!
Ñòðîêà 6:
 îïåðàòîðå ïðèñâàèâàíèÿ íåîáõîäèìî èñïîëüçîâàòü ñèìâîë =, à íå :=. (Ê ñîæàëåíèþ, ì-ð ÈÁÌ èìååò ïðåäñòàâëåíèå î ÿçûêå Ïàñêàëü.).
 ãîäó 52 íåäåëè, à íå 56.
Ñòðîêà 7:
Îïåðàòîð äîëæåí âûãëÿäåòü òàê printf ("Â ãîäó %d íåäåëü. \n", s);
Ñòðîêà 8:
Îòñóòñòâóåò, íî îíà îáÿçàòåëüíî äîëæíà áûòü è ñîäåðæàòü çàêðûâàþùóþ ôèãóðíóþ ñêîáêó — }.
2. à. Á-ý-ý Á-ý-ý. ×åðíàÿ Îâöà. Ó òåáÿ åñòü øåðñòü?
(Çàìåòèì, ÷òî ïðîáåë ïîñëå òî÷êè îòñóòñòâóåò. Äëÿ òîãî ÷òîáû ïîìåñòèòü â ýòî ìåñòî ïðîáåë, íåîáõîäèìî áûëî âìåñòî "Ó òåáÿ" ïèñàòü " Ó òåáÿ")
Á. Óáèðàéñÿ!
Ìåøîê ñàëà!
(Îòìåòèì, ÷òî êóðñîð òåïåðü íàõîäèòñÿ â êîíöå âòîðîé ñòðî÷êè.).
Â. ×òî?
Íåò /n Êëàðíåò?
Çàìåòèì, ÷òî ñèìâîë (/) ïðîèçâîäèò íå òîò æå ýôôåêò, êàê ñèìâîë (\).
Ã. 2 + 2 = 4.
(Îòìåòèì, ÷òî êàæäîå âõîæäåíèå êîìáèíàöèè ñèìâîëîâ %d â ñòðîêó çàìåíÿåòñÿ çíà÷åíèåì ñîîòâåòñòâóþùåé ïåðåìåííîé èç ñïèñêà. Çàìåòèì òàêæå, ÷òî ñèìâîë + îçíà÷àåò ñëîæåíèå è ÷òî òàêèì îáðàçîì âû÷èñëåíèÿ ìîãóò áûòü ïðîâåäåíû "âíóòðè" îïåðàòîðà printf().)
ÓÏÐÀÆÍÅÍÈß.
×òîáû èçó÷èòü ÿçûê Ñè, îäíîãî òîëüêî ÷òåíèÿ íåäîñòàòî÷íî. Âû äîëæíû ïîïðîáîâàòü ñàìè íàïèñàòü îäíó èëè äâå ïðîñòûå ïðîãðàììû è ïîñìîòðåòü, ïðîéäåò ëè âñå òàê æå ãëàäêî, êàê ýòî ìîæåò ïîêàçàòüñÿ â ðåçóëüòàòå ÷òåíèÿ äàííîé ãëàâû. Ìû õîòèì ïðåäëîæèòü âàì íåñêîëüêî èäåé, íî, åñëè æåëàåòå, âû ìîæåòå âîñïîëüçîâàòüñÿ ñâîèìè ñîáñòâåííûìè ñîîáðàæåíèÿìè íà ýòîò ñ÷åò.
1. Íàïèøèòå ïðîãðàììó, ïå÷àòàþùóþ âàøå èìÿ.
2. Íàïèøèòå ïðîãðàììó, ïå÷àòàþùóþ âàøè èìÿ è àäðåñ, èñïîëüçóÿ òðè èëè áîëåå ñòðîê.
3. Íàïèøèòå ïðîãðàììó, êîòîðàÿ óêàæåò âàø âîçðàñò, äàííûé â ãîäàõ, â äíÿõ. Íå óñëîæíÿéòå åå, ó÷èòûâàÿ âèñîêîñíûå è íåâèñîêîñíûå ãîäû.
3. Äàííûå, ÿçûê Ñè è âû.
Int, short, long, unsigned, char, float, double sizeof.
Ïðîãðàììû èìåþò äåëî ñ äàííûìè. Ìû ââîäèì â êîìïüþòåð ÷èñëà, áóêâû è ñëîâà è îæèäàåì, ÷òî îí áóäåò ïðîâîäèòü íàä íèìè êàêèå-òî îïåðàöèè.  ýòîé è ñëåäóþùåé ãëàâàõ ìû ñîñðåäîòî÷èì íàøå âíèìàíèå íà äàííûõ ðàçëè÷íûõ òèïîâ è èõ ñâîéñòâàõ.  ñîîòâåòñòâèè ñ ýòèì ìû áóäåì ïîñëåäîâàòåëüíî îñòàíàâëèâàòüñÿ íà êàæäîì èç òèïîâ è ñìîòðåòü, êàê èõ ìîæíî èñïîëüçîâàòü. Íî, ïî ñêîëüêó çàíèìàòüñÿ îäíèì òîëüêî îáñóæäåíèåì ïðåäñòàâëÿåòñÿ íàì íå î÷åíü âåñåëûì äåëîì, ìû ðàññìîòðèì òàêæå íåáîëüøèå ïðî ãðàììû îáðàáîòêè äàííûõ.
Ýòà ãëàâà â îñíîâíîì ïîñâÿùåíà îáñóæäåíèþ äâóõ âàæíåéøèõ êëàññîâ òèïîâ äàííûõ öåëûì ÷èñëàì è ÷èñëàì ñ ïëàâàþùåé òî÷êîé. ßçûê Ñè ïðåäîñòàâëÿåò ïðîãðàììèñòó âîçìîæíîñòü èñïîëüçîâàòü íåñêîëüêî ðàçíîâèäíîñòåé ýòèõ òèïîâ. Ìû çàéìåìñÿ èçó÷åíèåì ñëåäóþùèõ âîïðîñîâ: ÷òî òàêîå òèïû äàííûõ, êàê èõ îïèñàòü, êàê è êîãäà èõ èñïîëüçîâàòü. Êðîìå òîãî, ìû îáñóäèì ðàçëè÷èÿ ìåæäó êîíñòàíòàìè è ïåðåìåííûìè.
Òåïåðü, òàê æå êàê ïðåæäå, ïðèøëî âðåìÿ ðàññìîòðåòü êàêóþ-íèáóäü ïðîñòóþ ïðîãðàììó. Âîçìîæíî, âû îáíàðóæèòå â íåé êàêèå-òî íåïîíÿòíûå ìåñòà. Ìû ïîñòàðàåìñÿ ðàçúÿñíèòü èõ âàì ïðè ïîñëåäóþùåì îáñóæäåíèè â äàííîé ãëàâå. Îáùèé ñìûñë ïðî ãðàììû äîëæåí áûòü äîñòàòî÷íî ïîíÿòåí, ïîýòîìó ïîïðîáóéòå îñóùåñòâèòü êîìïèëÿöèþ è âûïîëíèòü ýòó ïðîãðàììó[1] . Äëÿ ýêîíîìèè âðåìåíè ìîæåòå îïóñòèòü êîììåíòàðèè ïðè ââîäå ïðîãðàììû â ìàøèíó. (Çàìå÷àíèå: ìû âêëþ÷èëè èìÿ ïðîãðàììû â åå ñîñòàâ êàê êîììåíòàðèé, â äàëüíåéøåì, ïðèâîäÿ ïðîãðàììû, áóäåì ïðèäåðæèâàòüñÿ ýòîãî ïðàâèëà ).
/*Âàø çîëîòîé ýêâèâàëåíò*/
/*îïðåäåëåíèå ñòîèìîñòè êîëè÷åñòâà çîëîòà, ðàâíîãî âàøåìó âåñó*/
Main( ).
{
float weight, value, /* 2 ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé */
char beep; /* ñèìâîëüíàÿ ïåðåìåííàÿ */
beep = ' /007' ; /* ïðèñâàèâàíèå ñïåöèàëüíîãî ñèìâîëà ïåðåìåííîé beep */
printf(" Ñòîèòå ëè âû ñâîåãî âåñà â çîëîòîì ýêâèâàëåíòå? \n");
printf(" Óêàæèòå, ïîæàëóéñòà, ñâîé âåñ â ôóíòàõ è óçíàåòå \n");
scanf("%f ", &weight;); /* ïîëó÷åíèå äàííûõ */
value= 400.0 *weight*14,5833; /* ïðåäïîëàãàåìàÿ öåíà çîëîòà -
400 äîëë çà òðîéñêóþ óíöèþ */
/* êîýôôèöèåíò 14,5833 ñëóæèò äëÿ ïåðåâîäà â òðîéñêèå óíöèè */
printf(" %c Ñòîèìîñòü âàøåãî âåñà â çîëîòîì ýêâèâàëåíòå.
$%2,2 f%c.\n", beep, value, beep);
printf("Âû íåñîìíåííî ñòîèòå ñòîëüêî' Åñëè öåíà çîëîòà óïàäåò,");
printf(" åøüòå áîëüøå, \n ÷òîáû ñîõðàíèòü ñâîþ ñòîèìîñòü \n");
}
Ïðè ââîäå ýòîé ïðîãðàììû â êîìïüþòåð âû ìîæåòå çàõîòåòü çàìåíèòü ÷èñëî 400.00 âåëè÷èíîé òåêóùåé öåíû çîëîòà. Ìû íàäååìñÿ, îäíàêî, ÷òî âû íå áóäåòå ïóñêàòüñÿ íà îáìàí, çàìåíÿÿ ÷èñëî 14,5 833, ðàâíîå ÷èñëó óíöèé â ôóíòå (Ðå÷ü èäåò îá óíöèÿõ â òðîéñêîé ñèñòåìå ìåð, ïðèìåíÿåìîé ïðè âçâåøèâàíèè áëàãîðîäíûõ ìåòàëëîâ, è ôóíòàõ â îáû÷íîé ñèñòåìå ìåð, èñïîëüçóåìîé ïðè âçâåøèâàíèè âñåãî îñòàëüíîãî). Çàìåòèì, ÷òî ñëîâà "óêàæèòå ñâîé âåñ" îçíà÷àþò, ÷òî íåîáõîäèìî íàáðàòü íà êëàâèàòóðå ÷èñëî, âûðàæàþùåå âåñ, è íàæàòü êëàâèøó "ââîä" èëè "âîçâðàò" (Íå íàäî òîëüêî âñòàâàòü íà êëàâèàòóðó!) Íàæàâ ýòó êëàâèøó, âû òåì ñàìûì ñîîáùàåòå êîìïüþòåðó, ÷òî âû óæå çàêîí÷èëè ââîä.
Äàííàÿ ïðîãðàììà èìååò òàêæå íåêîòîðóþ íåçàìåòíóþ íà ïåðâûé âçãëÿä îñîáåííîñòü. ×òîáû îáíàðóæèòü åå è ïîíÿòü, â ÷åì äåëî, âû äîëæíû ñàìè çàïóñòèòü ýòó ïðîãðàììó; èìÿ îäíîé èç ïåðåìåííûõ ñëóæèò äîâîëüíî íåäâóñìûñëåííûì íàìåêîì.
×òî íîâîãî ñîäåðæèòñÿ â ýòîé ïðîãðàììå?
1. Ïî-âèäèìîìó, âû óæå çàìåòèëè, ÷òî ìû ââåëè îïèñàíèå äâóõ íîâûõ òèïîâ ïåðåìåííûõ. Äî ýòîãî ìû èñïîëüçîâàëè òîëüêî öåëûå ïåðåìåííûå, à òåïåðü äîáàâèëè ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé è ñèìâîëüíûå ïåðåìåííûå, òàê ÷òî òåïåðü ìû ìîæåì îáðàáàòûâàòü äàííûå áîëåå îáùåãî âèäà.
2. Ìû èñïîëüçîâàëè â ïðîãðàììå íåñêîëüêî íîâûõ ñïîñîáîâ çàäàíèÿ êîíñòàíò. Òåïåðü ìû óìååì ââîäèòü â ïðîãðàììó ÷èñëà ñ äåñÿòè÷íîé òî÷êîé è çíàêîìû ñ äîâîëüíî ñïåöèôè÷åñêèì ñïîñîáîì ïðåäñòàâëåíèÿ çíà÷åíèÿ ñèìâîëüíîé ïåðåìåííîé beep.
3. Äëÿ âûâîäà íà ïå÷àòü ýòèõ ïåðåìåííûõ íîâîãî òèïà â îïåðàòîðå printf( ) ìû èñïîëüçîâàëè ñïåöèôèêàöèè %f è %ñ, ñîîòâåòñòâóþùèå ïåðåìåííîé ñ ïëàâàþùåé òî÷êîé è ñèìâîëüíîé ïåðåìåííîé. Ìîäèôèêàòîðû â ñïåöèôèêàöèè %f ïðèìåíÿþòñÿ äëÿ óëó÷øåíèÿ âèäà ðåçóëüòàòà íà ýêðàíå äèñïëåÿ.
4. Âîçìîæíî, ñàìîé ñóùåñòâåííîé íîâîé îñîáåííîñòüþ ÿâëÿåòñÿ òî, ÷òî ýòà ïðîãðàììà "äèàëîãîâàÿ". Êîìïüþòåð çàïðàøèâàåò ó âàñ èíôîðìàöèþ, à çàòåì èñïîëüçóåò ÷èñëî, êîòîðîå âû ââåëè. Ðàáîòàòü ñ äèàëîãîâîé ïðîãðàììîé ãîðàçäî èíòåðåñíåå, ÷åì ñ ïðîãðàììàìè íåäèàëîãîâîãî òèïà, êîòîðûå ìû èñïîëüçîâàëè äî ýòîãî. Áîëåå âàæíûì ÿâëÿåòñÿ åùå è òî, ÷òî òàêîé ïîäõîä ïîçâîëÿåò íàì ñîçäàâàòü áîëåå ãèáêèå ïðîãðàììû. Íàïðèìåð, íàøó ïðîãðàììó ìîæíî èñïîëüçîâàòü ïðè çàäàíèè ëþáîãî âåñà (êîíå÷íî, â ðàçóìíûõ ïðåäåëàõ), à íå òîëüêî âåñà â 175 ôóíòîâ. Íàì íå íóæíî ïåðåïèñûâàòü ïðîãðàììó âñÿêèé ðàç, êîãäà ìû çàõîòèì îáðàáîòàòü âåñ åùå îäíîãî ÷åëîâåêà. Ôóíêöèè scanf( ) è printf( ) äåëàþò ýòî âïîëíå âîçìîæíûì. Ôóíêöèÿ scanf( ) ÷èòàåò äàííûå, íàáèðàåìûå íà ïóëüòå äèñïëåÿ, è ââîäèò èõ â ïðîãðàììó.  ãë. 2 ìû óæå âèäåëè, ÷òî ôóíêöèÿ printf( ) ÷èòàåò äàííûå èç ïðîãðàììû è âûâîäèò èõ íà ýêðàí. Âìåñòå ýòè äâå ôóíêöèè ïîçâîëÿþò óñòàíîâèòü äâóñòîðîííþþ ñâÿçü ñ âàøåé ïðîãðàììîé, ÷òî äåëàåò îáùåíèå ñ êîìïüþòåðîì ãîðàçäî áîëåå ïðèÿòíûì.
 äàííîé ãëàâå ìû ðàññìîòðèì äâà ïåðâûõ ïóíêòà - ïåðåìåííûå è êîíñòàíòû ðàçëè÷íûõ òèïîâ äàííûõ. Îñòàâøèåñÿ äâà ïóíêòà ìû îáñóäèì â ñëåäóþùåé ãëàâå, íî ôóíêöèè scanf( ) è printf( ) áóäåì èñïîëüçîâàòü ïî-ïðåæíåìó.
ÄÀÍÍÛÅ: ÏÅÐÅÌÅÍÍÛÅ È ÊÎÍÑÒÀÍÒÛ.
Êîìïüþòåð, âûïîëíÿÿ ïðîãðàììó, ìîæåò çàíèìàòüñÿ ðàçíîîáðàçíîé äåÿòåëüíîñòüþ. Îí ìîæåò ñêëàäûâàòü ÷èñëà, ñîðòèðîâàòü èìåíà, çàíèìàòüñÿ ðàñïîçíàâàíèåì ðå÷è è èçîáðàæåíèÿ íà ýêðàíå âèäåîäèñïëåÿ, âû÷èñëÿòü îðáèòû êîìåò, ïîäãîòàâëèâàòü ñïèñîê ïî÷òîâûõ àäðåñîâ àáîíåíòîâ, ÷åðòèòü ôèãóðû, äåëàòü ëîãè÷åñêèå âûâîäû èëè ÷òî-íèáóäü åùå, ÷òî òîëüêî âû ìîæåòå ñåáå ïðåäñòàâèòü. ×òîáû çàíèìàòüñÿ âñåì ýòèì, ïðîãðàììàì íåîáõîäèìî ðàáîòàòü ñ "äàííûìè" - ÷èñëàìè è ñèìâîëàìè, ò. å. îáúåêòàìè, êîòîðûå íåñóò â ñåáå èíôîðìàöèþ, ïðåäíàçíà÷åííóþ äëÿ èñïîëüçîâàíèÿ. Íåêîòîðûå äàííûå óñòàíàâëèâàþòñÿ ðàâíûìè îïðåäåëåííûì çíà÷åíèÿì åùå äî òîãî, êàê ïðîãðàììà íà÷íåò âûïîëíÿòüñÿ, à ïîñëå åå çàïóñêà ñîõðàíÿþò òàêèå çíà÷åíèÿ íåèçìåííûìè íà âñåì ïðîòÿæåíèè ðàáîòû ïðîãðàììû. Ýòî "êîíñòàíòû". Äðóãèå äàííûå ìîãóò èçìåíÿòüñÿ, èëè æå èì ìîãóò áûòü ïðèñâîåíû çíà÷åíèÿ âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû; îíè íàçûâàþòñÿ "ïåðåìåííûìè". (Ìû óæå èñïîëüçîâàëè äàííûé òåðìèí â ïðåäûäóùåé ãëàâå, íî ôîðìàëüíî âû çíàêîìèòåñü ñ íèì òîëüêî çäåñü.)  íàøåé ïðîñòîé ïðîãðàììå weight - ýòî ïåðåìåííàÿ; ÷èñëî 16.0 - êîíñòàíòà. ×òî ìîæíî ñêàçàòü ïî ïîâîäó ÷èñëà 400.00? Ñîâåðøåííî î÷åâèäíî, ÷òî â äåéñòâèòåëüíîñòè öåíà çîëîòà íå îñòàåòñÿ íåèçìåííîé, íî â íàøåé ïðîãðàììå ìû ñ÷èòàåì åå êîíñòàíòîé.
Ðàçëè÷èå ìåæäó ïåðåìåííîé è êîíñòàíòîé äîâîëüíî î÷åâèäíî: âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû çíà÷åíèå ïåðåìåííîé ìîæåò áûòü èçìåíåíî (íàïðèìåð, ñ ïîìîùüþ ïðèñâàèâàíèÿ), à çíà÷åíèå êîíñòàíòû - íåò. Óêàçàííîå ðàçëè÷èå ïðèâîäèò ê òîìó, ÷òî îáðàáîòêà ïåðåìåííûõ êîìïüþòåðîì îêàçûâàåòñÿ íåìíîãî ñëîæíåå è òðåáóåò áîëüøå âðåìåíè, ÷åì îáðàáîòêà êîíñòàíò, íî, íåñìîòðÿ íà ýòî, îí âïîëíå ñïðàâëÿåòñÿ ñ òàêîé äåÿòåëüíîñòüþ.
ÄÀÍÍÛÅ: ÒÈÏÛ ÄÀÍÍÛÕ
Ïîìèìî ðàçëè÷èÿ ìåæäó ïåðåìåííûìè è êîíñòàíòàìè ñóùåñòâóåò åùå ðàçëè÷èå ìåæäó òèïàìè äàííûõ. Íåêîòîðûå äàííûå â ïðîãðàììå ÿâëÿþòñÿ ÷èñëàìè, íåêîòîðûå - áóêâàìè, èëè, áîëåå îáîáùåííî, ñèìâîëàìè. Êîìïüþòåð äîëæåí èìåòü âîçìîæíîñòü èäåíòèôèöèðîâàòü è îáðàáàòûâàòü òðåáóåìûì îáðàçîì äàííûå ëþáîãî èç ýòèõ òèïîâ.  ÿçûêå Ñè ïðåäóñìîòðåíî èñïîëüçîâàíèå íåñêîëüêèõ îñíîâíûõ òèïîâ äàííûõ. Åñëè âåëè÷èíà åñòü êîíñòàíòà, òî. êîìïèëÿòîð îáû÷íî ìîæåò ðàñïîçíàòü åå òèï òîëüêî ïî òîìó âèäó, â êàêîì îíà ïðèñóòñòâóåò â ïðîãðàììå. Îäíàêî â ñëó÷àå ïåðåìåííîé íåîáõîäèìî, ÷òîáû åå òèï áûë îáúÿâëåí â îïåðàòîðå îïèñàíèÿ.
Äîïîëíèòåëüíûå äåòàëè, îòíîñÿùèåñÿ ê òèïàì äàííûõ, ìû áóäåì ñîîáùàòü âàì ïî ìåðå èçëîæåíèÿ. Ðàññìîòðèì îñíîâíûå òèïû äàííûõ, èìåþùèåñÿ â ÿçûêå Ñè.  ñòàíäàðòå ÿçûêà Ñè èñïîëüçóåòñÿ ñåìü êëþ÷åâûõ ñëîâ, óêàçûâàþùèõ íà ðàçëè÷íûå òèïû äàííûõ. Ïðèâåäåì ñïèñîê ýòèõ êëþ÷åâûõ ñëîâ:
Int long short unsigned char float double.
Ïåðâûå ÷åòûðå êëþ÷åâûõ ñëîâà èñïîëüçóþòñÿ äëÿ ïðåäñòàâëåíèÿ öåëûõ, ò. å. öåëûõ ÷èñåë áåç äåñÿòè÷íîé äðîáíîé ÷àñòè. Îíè ìîãóò ïîÿâëÿòüñÿ â ïðîãðàììå ïî îòäåëüíîñòè èëè â íåêîòîðûõ ñî÷åòàíèÿõ, êàê, íàïðèìåð, unsigned short. Ñëåäóþùåå ñëîâî char ïðåäíàçíà÷åíî äëÿ óêàçàíèÿ íà áóêâû è íåêîòîðûå äðóãèå ñèìâîëû, òàêèå, êàê #, $, % è &. Ïîñëåäíèå äâà êëþ÷åâûõ ñëîâà èñïîëüçóþòñÿ äëÿ ïðåäñòàâëåíèÿ ÷èñåë ñ äåñÿòè÷íîé òî÷êîé. Òèïû, îáîçíà÷àåìûå ýòèìè êëþ÷åâûìè ñëîâàìè, ìîæíî ðàçäåëèòü íà äâà êëàññà ïî ïðèíöèïó ðàçìåùåíèÿ â ïàìÿòè ìàøèíû. Ïåðâûå ïÿòü êëþ÷åâûõ ñëîâ îïðåäåëÿþò "öåëûå" òèïû äàííûõ, â òî âðåìÿ êàê ïîñëåäíèå äâà - òèïû äàííûõ ñ "ïëàâàþùåé òî÷êîé".

ÐÈÑ. 3.1. Ðàáîòà ôóíêöèé scanf( ) è printf( ).
 ýòîì ìåñòå ó íåêîòîðûõ ÷èòàòåëåé ìîãóò ïîÿâèòüñÿ íåäîóìåí-íûå âîïðîñû: "Öåëûå òèïû äàííûõ? Òèïû äàííûõ ñ ïëàâàþùåé òåíåâîé?" Íå ïóãàéòåñü. Åñëè ýòè òåðìèíû êàæóòñÿ âàñ íåïðèâû÷íûìè èëè íåïîíÿòíûìè, ìû äàäèì êðàòêîå îáúÿñíåíèå èõ ñìûñëà. Òå, êòî íå çíàêîì ñ òåðìèíàìè "áèòû", "áàéòû" è "ñëîâà", ìîãóò, ïåðåä òåì êàê äâèíóòüñÿ äàëüøå, ïðî÷åñòü ïðèâîäèìîå íèæå îáúÿñíåíèå, îòìå÷åííîå âåðòèêàëüíîé ãîëóáîé ëèíèåé. Ìîæíî ñïðîñèòü: à íóæíî ëè çíàòü âñå ýòè äåòàëè? Íà ñàìîì äåëå íåîáÿçàòåëüíî. Ïîæàëóé, íå áîëüøå, ÷åì âû äîëæíû çíàòü î ïðèíöèïàõ ðàáîòû äâèãàòåëÿ âíóòðåííåãî ñãîðàíèÿ äëÿ òîãî, ÷òîáû óïðàâëÿòü ìàøèíîé. Íî íåêîòîðîå ïðåäñòàâëåíèå î òîì, ÷òî ïðîèñõîäèò â êîìïüþòåðå èëè äâèãàòåëå, ìîæåò èíîãäà âûðó÷èòü âàñ. Êðîìå òîãî, ýòî ìîæåò ïîìî÷ü âàøåìó ïðåâðàùåíèþ â ïðåêðàñíîãî "ñîáåñåäíèêà".
Òåðìèíû "áèò", "áàéò" è "ñëîâî" îáû÷íî èñïîëüçóþòñÿ äëÿ îïèñàíèÿ êàê ýëåìåíòîâ äàííûõ, êîòîðûå îáðàáàòûâàåò êîìïüþòåð, òàê è ýëåìåíòîâ ïàìÿòè. Çäåñü ìû çàéìåìñÿ ðàññìîòðåíèåì âòîðîãî ñìûñëà ýòèõ òåðìèíîâ.
Íàèìåíüøàÿ åäèíèöà ïàìÿòè íàçûâàåòñÿ áèò. Îíà ìîæåò ïðèíèìàòü îäíî èç ÄÂÓÕ çíà÷åíèé: 0 èëè 1. (Èíà÷å ãîâîðÿ, áèò ìîæåò íàõîäèòñÿ â ñîñòîÿíèÿõ "âêëþ÷åí" èëè "âûêëþ÷åí"; ýòà ôðàçà ñîâåðøåííî àíàëîãè÷íà ïåðâîìó âûñêà çûâàíèþ.)  îäèí áèò íåëüçÿ ïîìåñòèòü äîñòàòî÷íîå êîëè÷åñòâî èíôîðìàöèè íî â ìàøèíå ñîäåðæèòñÿ áîëüøîå ÷èñëî áèòîâ; äåëî â òîì, ÷òî áèò - îñíîâíîé "ñòðîèòåëüíûé áëîê", èç êîòîðûõ ñîçäàåòñÿ ïàìÿòü êîìïüþòåðà.
Áàéò - áîëåå óäîáíûé ýëåìåíò ïàìÿòè.  áîëüøèíñòâå ìàøèí áàéò ñîñòîèò èç 8 áèò. Ïîñêîëüêó êàæäûé áèò ìîæíî óñòàíîâèòü ëèáî â ñîñòîÿíèå 0, ëèáî â ñîñòîÿíèå 1, âñåãî â áàéòîâîì ôîðìàòå ìîæíî ïðåäñòàâèòü 256 (äâà â âîñüìîé ñòåïåíè) ðàçëè÷íûõ êîìáèíàöèé èç íóëåé è åäèíèö. Òàêèå êîìáèíàöèè ìîæíî èñïîëüçîâàòü, íàïðèìåð, äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë â äèàïàçîíå îò 0 äî 255 èëè äëÿ êîäèðîâàíèÿ íàáîðà ñèìâîëîâ. Ýòî ìîæíî ïîëó÷èòü ïðè ïîìîùè "äâîè÷íîãî êîäà", â êîòîðîì äëÿ ïðåäñòàâëåíèÿ ÷èñåë èñïîëüçóþòñÿ òîëüêî íóëè è åäèíèöû. Îáñóæäåíèå ñòðóêòóðû äâîè÷íîãî êîäà ìû ïîìåñòèëè â ïðèëîæåíèå (âû âïîëíå ìîæåòå åãî íå ÷èòàòü, åñëè íå çàõîòèòå).
Ïðè ñîâðåìåííîì ïîäõîäå ê ïðîåêòèðîâàíèþ êîìïüþòåðîâ ñëîâî ÿâëÿåòñÿ ñàìûì åñòåñòâåííûì ýëåìåíòîì ïàìÿòè.  8-ðàçðÿäíûõ ìèêðîêîìïüþòåðàõ, òàêèõ, êàê ÝÂÌ ôèðìû Sinklair èäè ïåðâûå ìîäåëè ìàøèí ôèðìû Apple, ñëîâî çàíèìàåò êàê ðàç 1 áàéò. Ìíîãèå áîëåå íîâûå ïåðñîíàëüíûå âû÷èñëèòåëüíûå ñèñòåìû, òàêèå, êàê IBM PC è Lisa ôèðìû Apple, ÿâëÿþòñÿ 16-ðàçðÿäíûìè. Ýòî îçíà÷àåò, ÷òî ðàçìåð ñëîâà ó íèõ 16 áèò, ò. å. 2 áàéòà. Áîëüøèå êîìïüþòåðû ìîãóò èìåòü 32-, 64-ðàçðÿäíûå ñëîâà èëè äàæå áîëåå äëèííûå. Ñîâåðøåííî î÷åâèäíî, ÷òî ÷åì äëèííåå ñëîâî, òåì áîëüøå èíôîðìàöèè ìîæíî òóäà ïîìåñòèòü. Îáû÷íî â êîìïüþòåðàõ ïðåäóñìîòðåíà âîçìîæíîñòü îáúåäèíÿòü âìåñòå äâà èëè áîëåå ñëîâ äëÿ òîãî, ÷òîáû ïîìåùàòü â ïàìÿòü ýëåìåíòû äàííûõ áîëüøåé äëèíû, íî ýòîò ïðîöåññ ñèëüíî çàìåäëÿåò ðàáîòó êîìïüþòåðà.
 íàøèõ ïðèìåðàõ ìû ïðåäïîëàãàåì, ÷òî äëèíà ñëîâà ðàâíà 16 áèò, åñëè ìû íå îãîâîðèëè ïðîòèâíîãî.
Äëÿ ÷åëîâåêà ðàçëè÷èå ìåæäó öåëûì ÷èñëîì è ÷èñëîì ñ ïëàâàþùåé òî÷êîé âûðàæàåòñÿ â ñïîñîáå çàïèñè. Äëÿ êîìïüþòåðà ðàçëè÷èå âûðàæàåòñÿ â ñïîñîáå çàíåñåíèÿ ýòèõ ÷èñåë â ïàìÿòü. Äàâàéòå ðàññìîòðèì ïî î÷åðåäè êàæäûé èç äâóõ êëàññîâ ÷èñåë.
Öåëûå ÷èñëà
Ó öåëîãî ÷èñëà íèêîãäà íå áûâàåò äðîáíîé ÷àñòè è, ñîãëàñíî ïðàâèëàì ÿçûêà Ñè, äåñÿòè÷íàÿ òî÷êà â åãî çàïèñè âñåãäà îòñóòñòâóåò.  êà÷åñòâå ïðèìåðà ìîæíî ïðèâåñòè ÷èñëà 2, -23 è 2456. ×èñëà âèäà 3.14 è 2/3 íå ÿâëÿþòñÿ öåëûìè. Ïðåäñòàâèâ öåëîå ÷èñëî â äâîè÷íîì âèäå, åãî íåòðóäíî ðàçìåñòèòü â ïàìÿòè ìàøèíû.
ÐÈÑ. 3.2. Äâîè÷íîå ïðåäñòàâëåíèå ÷èñëà 7 â ïàìÿòè ìàøèíû.
Íàïðèìåð, ÷èñëî 7 â äâîè÷íîì âèäå âûãëÿäèò êàê 111. Ïîýòîìó, ÷òîáû ïîìåñòèòü ýòî ÷èñëî â 1-áàéò ñëîâî, íåîáõîäèìî ïåðâûå 5 áèò óñòàíîâèòü â 0, à ïîñëåäíèå 3 áèò - â 1 (ðèñ. 3.2).
×èñëà ñ ïëàâàþùåé òî÷êîé
×èñëà ñ ïëàâàþùåé òî÷êîé áîëåå èëè ìåíåå ñîîòâåòñòâóþò òîìó, ÷òî ìàòåìàòèêè íàçûâàþò "âåùåñòâåííûìè ÷èñëàìè". Îíè âêëþ÷àþò â ñåáÿ ÷èñëà, ðàñïîëîæåííûå ìåæäó öåëûìè. Âîò íåêîòîðûå èç íèõ: 2.75, 3.16Å7, 7.00 è 2å-8. Î÷åâèäíî, ÷òî ëþáîå ÷èñëî ñ ïëàâàþùåé òî÷êîé ìîæíî çàïèñàòü íåñêîëüêèìè ñïîñîáàìè. Áîëåå ïîëíîå îáñóæäåíèå "Å-íîòàöèè" áóäåò ïðîâåäåíî äàëüøå, à ìû òîëüêî êðàòêî ïîÿñíèì, ÷òî çàïèñü âèäà "3.16Å7" îçíà÷àåò ÷èñëî, ïîëó÷åííîå â ðåçóëüòàòå óìíîæåíèÿ 3.16 íà 1,0 â ñåäüìîé ñòåïåíè, ò. å. íà 1 ñ ñåìüþ íóëÿìè. ×èñëî 7 íàçûâàåòñÿ "ïîðÿäêîì" (ïîêàçàòåëåì ñòåïåíè ïðè îñíîâàíèè 10).
Íàèáîëåå ñóùåñòâåííûì ìîìåíòîì çäåñü ÿâëÿåòñÿ òî, ÷òî ñïîñîá êîäèðîâàíèÿ, èñïîëüçóåìûé äëÿ ïîìåùåíèÿ â ïàìÿòü ÷èñëà ñ ïëàâàþùåé òî÷êîé, ïîëíîñòüþ îòëè÷àåòñÿ îò àíàëîãè÷íîé ñõåìû äëÿ ðàçìåùåíèÿ öåëîãî ÷èñëà. Ôîðìèðîâàíèå ïðåäñòàâëåíèÿ ÷èñëà ñ ïëàâàþùåé òî÷êîé ñîñòîèò â åãî ðàçáèåíèè íà äðîáíóþ ÷àñòü è ïîðÿäîê; çàòåì îáå ÷àñòè ðàçäåëüíî ïîìåùàþòñÿ â ïàìÿòü. Ïîýòîìó ÷èñëî 7.00 èç âûøåïðèâåäåííîãî ñïèñêà íåëüçÿ ïîìåñòèòü â ïàìÿòü òåì æå ñïîñîáîì, ÷òî è öåëîå ÷èñëî 7, õîòÿ îáà èìåþò îäíî è òî æå çíà÷åíèå.  äåñÿòè÷íîé çàïèñè (òî÷íî òàê æå êàê è â äâîè÷íîé) ÷èñëî "7.0" ìîæíî áûëî áû çàïèñàòü â âèäå "0.7Å1"; òîãäà "0.7" áóäåò äðîáíîé ÷àñòüþ, à "1" - ïîðÿäêîì. Äëÿ ðàçìåùåíèÿ ÷èñåë â ïàìÿòè ìàøèíû áóäóò, êîíå÷íî, èñïîëüçîâàòüñÿ äâîè÷íûå ÷èñëà è ñòåïåíè äâîéêè âìåñòî ñòåïåíåé äåñÿòè. Äîïîëíèòåëüíóþ èíôîðìàöèþ, îòíîñÿùóþñÿ ê ýòîìó âîïðîñó, âû ñìîæåòå íàéòè â ïðèëîæåíèè Æ. Çäåñü æå ìû îñòàíîâèìñÿ ëèøü íà ðàçëè÷èÿõ, ñâÿçàííûõ ñ ïðàêòè÷åñêèì èñïîëüçîâàíèåì ÷èñåë ýòèõ äâóõ òèïîâ.
1. Öåëûå ÷èñëà íå èìåþò äðîáíîé ÷àñòè, â òî âðåìÿ êàê ÷èñëà ñ ïëàâàþùåé òî÷êîé ìîãóò ïðåäñòàâëÿòü êàê öåëûå, òàê è äðîáíûå ÷èñëà.
2. ×èñëà ñ ïëàâàþùåé òî÷êîé äàþò âîçìîæíîñòü ïðåäñòàâëÿòü âåëè÷èíû èç áîëåå øèðîêîãî äèàïàçîíà, ÷åì öåëûå (ñì. òàáë. 3.1).
3. Ïðè íåêîòîðûõ àðèôìåòè÷åñêèõ îïåðàöèÿõ, íàïðèìåð ïðè âû÷èòàíèè îäíîãî áîëüøîãî ÷èñëà èç äðóãîãî, èñïîëüçîâàíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé ïðèâîäèò ê áîëüøåé ïîòåðå òî÷íîñòè.
4. Îïåðàöèè íàä ÷èñëàìè ñ ïëàâàþùåé òî÷êîé âûïîëíÿþòñÿ, êàê ïðàâèëî, ìåäëåííåå, ÷åì îïåðàöèè íàä öåëûìè ÷èñëàìè. Îäíàêî ñåé÷àñ óæå ïîÿâèëèñü ìèêðîïðîöåññîðû, ñïåöèàëüíî îðèåíòèðîâàííûå íà îáðàáîòêó ÷èñåë ñ ïëàâàþùåé òî÷êîé, è â íèõ ýòè îïåðàöèè âûïîëíÿþòñÿ äîâîëüíî áûñòðî.
ÐÈÑ. 3.3. Äåñÿòè÷íîå ïðåäñòàâëåíèå ÷èñëà p â ôîðìàòå ñ ïëàâàþùåé òî÷êîé.
Âîçüìèòå íåêîòîðîå ÷èñëî. Äîáàâüòå ê íåìó 1, à çàòåì âû÷òèòå èç ïîëó÷åííîé ñóììû èñõîäíîå ÷èñëî. ×òî ó âàñ ïîëó÷èòñÿ? Ó íàñ ïîëó÷èëàñü 1. Íî âû÷èñëåíèÿ, ïðîèçâîäèìûå íàä ÷èñëàìè ñ ïëàâàþùåé òî÷êîé, ìîãóò äàòü è ñîâåðøåííî íåîæèäàííûé ðåçóëüòàò:
/*îøèáêà âû÷èñëåíèé*/
Main( ).
{
float a, b;
b = 2.0å20 + 1.0;
à = b - 2.0å20;
printf(" %f \n", a);
}
Ðåçóëüòàò ðàâåí.
0000000.
Ïðè÷èíà ïîÿâëåíèÿ òàêîãî ñòðàííîãî ðåçóëüòàòà ñîñòîèò â îòñóòñòâèè äîñòà òî÷íîãî ÷èñëà ðàçðÿäîâ äëÿ âûïîëíåíèÿ îïåðàöèé ñ òðåáóåìîé òî÷íîñòüþ. ×èñëî 2.0å20 çàïèñûâàåòñÿ êàê äâîéêà ñ ïîñëåäóþùèìè äâàäöàòüþ íóëÿìè, è, äî áàâëÿÿ ê íåìó 1, ìû ïûòàåìñÿ èçìåíèòü 21-þ öèôðó ×òîáû âûïîëíèòü ýòó îïå ðàöèþ êîððåêòíî, ïðîãðàììà äîëæíà èìåòü âîçìîæíîñòü ïîìåñòèòü â ïàìÿòü ÷èñëî, ñîñòîÿùåå èç 21 öèôðû. Íî ÷èñëî òèïà float (ò å. ñ ïëàâàþùåé òî÷êîé) ïóòåì èçìåíåíèÿ ïîðÿäêà ìîæíî óâåëè÷èòü èëè óìåíüøèòü ëèøü íà 6 èëè 7 öèôð. Ïîïûòêà âû÷èñëåíèÿ îêàçàëàñü íåóäà÷íîé. Ñ äðóãîé ñòîðîíû, åñëè áû ìû èñïîëüçîâàëè, ñêàæåì, ÷èñëî 2.0å4 âìåñòî 2.0å20, ìû ñìîãëè áû ïîëó÷èòü ïðàâèëüíûé îòâåò, ïîñêîëüêó â ýòîì ñëó÷àå ìû ïûòàëèñü áû èçìåíèòü 5-þ öèôðó, è òî÷íîñòü ïðåäñòàâëåíèÿ ÷èñåë òèïà float îêàçàëàñü áû âïîëíå äîñòàòî÷íîé äëÿ ýòîãî.
ÒÈÏÛ ÄÀÍÍÛÕ Â ßÇÛÊÅ ÑÈ.
Äàâàéòå òåïåðü ðàññìîòðèì íåêîòîðûå ñïåöèôè÷åñêèå îñîáåííîñòè îñíîâíûõ òèïîâ äàííûõ, èñïîëüçóåìûõ â ÿçûêå Ñè. Äëÿ êàæäîãî òèïà ìû ïîêàæåì, êàê îïèñàòü ïåðåìåííóþ, êàê ïðåäñòàâèòü êîíñòàíòó è êàê ëó÷øå âñåãî èñïîëüçîâàòü äàííûå ýòîãî òèïà.  íåêîòîðûõ êîìïèëÿòîðàõ ñ ÿçûêà Ñè íå ðåàëèçîâàíà îáðàáîòêà âñåõ òèïîâ äàííûõ; ïîýòîìó âàì íåîáõîäèìî ñâåðèòüñÿ ñ ðóêîâîäñòâîì ïî ÿçûêó Ñè, èìåþùèìñÿ â êîìïëåêòå âàøåé ìàøèíû, ÷òîáû ïîñìîòðåòü, êàêèå èç òèïîâ äîñòóïíû äëÿ èñïîëüçîâàíèÿ.
Òèïû int, short è long.
 ÿçûêå Ñè èìååòñÿ íåñêîëüêî öåëûõ òèïîâ, ïîýòîìó ó âàñ åñòü âîçìîæíîñòü âíîñèòü èçìåíåíèÿ â ñâîþ ïðîãðàììó, ÷òîáû îíà óäîâëåòâîðÿëà òðåáîâàíèÿì êîíêðåòíîé ìàøèíû èëè îïðåäåëåííîãî çàäàíèÿ. Åñëè âû íå õîòèòå çàáîòèòüñÿ î òàêèõ äåòàëÿõ, òî, âîîáùå ãîâîðÿ, âû ìîæåòå ïðîñòî îñòàíîâèòüñÿ íà òèïå int è íå äóìàòü áîëüøå î äðóãèõ âîçìîæíîñòÿõ.
Âñå äàííûå òèïîâ int, short è long ÿâëÿþòñÿ "÷èñëàìè ñî çíàêîì", ò. å. äîïóñòèìûìè çíà÷åíèÿìè ïåðåìåííûõ ýòèõ òèïîâ ìîãóò áûòü òîëüêî öåëûå ÷èñëà - ïîëîæèòåëüíûå, îòðèöàòåëüíûå è íóëü. Îäèí áèò èñïîëüçóåòñÿ äëÿ óêàçàíèÿ çíàêà ÷èñëà, ïîýòîìó ìàêñèìàëüíîå ÷èñëî ñî çíàêîì, êîòîðîå ìîæíî ïðåäñòàâèòü â ñëîâå, ìåíüøå, ÷åì ìàêñèìàëüíîå ÷èñëî áåç çíàêà. Íàïðèìåð, â ôîðìàòå 16-áèòíîãî ñëîâà ìîæíî ïðåäñòàâèòü ëþáûå öåëûå ÷èñëà áåç çíàêà, èç äèàïàçîíà îò 0 äî 65535. Òî÷íî òàê æå 16-áèòíîå ñëîâî ìîæíî èñïîëüçîâàòü äëÿ ïðåäñòàâëåíèÿ öåëûõ ÷èñåë ñî çíàêîì èç äèàïàçîíà îò -32768 äî +32767.
Çàìåòèì, ÷òî äëèíû äèàïàçîíîâ â îáîèõ ñëó÷àÿõ îäèíàêîâûå.
ßçûê Ñè ïðåäîñòàâëÿåò ïîëüçîâàòåëÿì âîçìîæíîñòü âûáîðà ðàçìåðà ýëåìåíòà ïàìÿòè (îäíîãî èç òðåõ) äëÿ ïðåäñòàâëåíèÿ öå ëûõ ÷èñåë. Òèïó int îáû÷íî ñîîòâåòñòâóåò ñòàíäàðòíàÿ äëèíà ñëîâà, ïðèíÿòàÿ íà èñïîëüçóåìîé ìàøèíå. Ïðè ýòîì ãàðàíòèðóåòñÿ, ÷òî ðàçìåð ýëåìåíòîâ ïàìÿòè, îòâîäèìûõ ïîä äàííûå òèïà short è long, áóäåò ñîîòâåòñòâåííî íå áîëüøå è íå ìåíüøå äëèíû ýëåìåíòà ïàìÿòè, âûäåëÿåìîãî òèïó int.  íåêîòîðûõ âû÷èñëèòåëüíûõ ñèñòåìàõ îäèí èëè îáà ýòèõ òèïà ðåàëèçîâàíû òî÷íî òàê æå, êàê int. Âñå çàâèñèò îò òîãî, êàêîå ïðåäñòàâëåíèå ëó÷øå ñîîòâåòñòâóåò àðõèòåêòóðå êîíêðåòíîé ÝÂÌ.  òàáë. 3.1 äëÿ êàæäîãî êîìïüþòåðà èç íåêîòîðîãî ìíîæåñòâà ïðèâåäåíî ÷èñëî áèòîâ, èñïîëüçóåìîå äëÿ ïðåäñòàâëåíèÿ äàííûõ ðàçëè÷íûõ òèïîâ, à òàêæå äèàïàçîíû îòîáðàæàåìûõ ÷èñåë.
Îïèñàíèå äàííûõ öåëîãî òèïà.
Ïðè îïèñàíèè äàííûõ íåîáõîäèìî ââåñòè òîëüêî òèï, çà êîòîðûì äîëæåí ñëåäîâàòü ñïèñîê èìåí ïåðåìåííûõ. Íèæå ïðèâåäåíû íåêîòîðûå âîçìîæíûå ïðèìåðû îïèñàíèé:
Int erns;
Short stops;
Long johns;
Int hogs, cows, goats;
 êà÷åñòâå ðàçäåëèòåëÿ ìåæäó èìåíàìè ïåðåìåííûõ íåîáõîäèìî èñïîëüçîâàòü çàïÿòóþ; âåñü ñïèñîê äîëæåí îêàí÷èâàòüñÿ ñèìâîëîì "òî÷êà ñ çàïÿòîé". Âû ìîæåòå ñîáðàòü â îäèí îïåðàòîð îïèñàíèÿ ïåðåìåííûõ ñ îäíèì è òåì æå òèïîì èëè, íàîáîðîò, ðàçáèòü îäíî îïèñàíèå íà íåñêîëüêî îïåðàòîðîâ. Íàïðèìåð, îïèñàíèå.
Int erns, hogs, cows, goats;
Áóäåò äàâàòü òîò æå ñàìûé ýôôåêò, ÷òî è äâà îòäåëüíûõ îïèñàíèÿ òèïà int â ïðåäøåñòâóþùåì ïðèìåðå. Ïðè æåëàíèè âû äàæå ìîãëè áû èñïîëüçîâàòü ÷åòûðå ðàçëè÷íûõ îïèñàíèÿ äàííûõ òèïà int - ïî îäíîìó äëÿ êàæäîé ïåðåìåííîé. Èíîãäà âàì ìîãóò âñòðåòèòüñÿ ñî÷åòàíèÿ êëþ÷åâûõ ñëîâ, êàê, íàïðèìåð, long int èëè short int. Ýòè êîìáèíàöèè ÿâëÿþòñÿ ïðîñòî áîëåå äëèííîé çàïèñüþ êëþ÷åâûõ ñëîâ long è short.
Öåëûå êîíñòàíòû.
Ñîãëàñíî ïðàâèëàì ÿçûêà Ñè, ÷èñëî áåç äåñÿòè÷íîé òî÷êè è áåç ïîêàçàòåëÿ ñòåïåíè ðàññìàòðèâàåòñÿ êàê öåëîå. Ïîýòîìó 22 è -273 - öåëûå êîíñòàíòû. Íî ÷èñëî 22.0 íåöåëîå, ïîòîìó ÷òî â åãî çàïèñè èìååòñÿ äåñÿòè÷íàÿ òî÷êà, è ÷èñëî 22Å3 òîæå íåöåëîå, ïîñêîëüêó â çàïèñè èñïîëüçîâàí ïîðÿäîê. Êðîìå òîãî, óêàçûâàÿ öåëîå ÷èñëî, íåëüçÿ èñïîëüçîâàòü çàïÿòûå. Íóæíî çàïèñàòü 23456 âìåñòî 23,456.
Åñëè âû õîòèòå ââåñòè íåêîòîðóþ êîíñòàíòó òèïà long, òî ìîæåòå ýòî ñäåëàòü, óêàçàâ ïðèçíàê L èëè l â êîíöå ÷èñëà. Èñïîëüçîâàíèå ïðîïèñíîé áóêâû L áîëåå ïðåäïî÷òèòåëüíî, ïîñêîëüêó åå òðóäíåå ñïóòàòü ñ öèôðîé 1. Ïðèìåðîì òàêîé êîíñòàíòû ñëóæèò ÷èñëî 212L. Î÷åâèäíî, ÷òî ñàìî ïî ñåáå ÷èñëî 212 íå î÷åíü áîëüøîå, íî äîáàâëåíèå ïðèçíàêà L ãàðàíòèðóåò, ÷òî â ïàìÿòè äëÿ íåãî áóäåò îòâåäåíî íåîáõîäèìîå ÷èñëî áàéòîâ. Ýòî ìîæåò îêàçàòüñÿ âàæíûì äëÿ äîñòèæåíèÿ ñîâìåñòèìîñòè, åñëè äàííîå ÷èñëî äîëæíî èñïîëüçîâàòüñÿ âìåñòå ñ äðóãèìè ïåðåìåííûìè è êîíñòàíòàìè òèïà long.
Âïîëíå âîçìîæíî, ÷òî âàì óæå íè÷åãî áîëüøå íå íóæíî çíàòü ïðî òî, êàê çàïèñûâàþò êîíñòàíòû, íî â ÿçûêå Ñè èìåþòñÿ åùå è äâà äðóãèõ ñïîñîáà.
Ïåðâûé: åñëè öåëîå íà÷èíàåòñÿ ñ öèôðû 0, îíî èíòåðïðåòèðóåòñÿ êàê "âîñüìåðè÷íîå" ÷èñëî. Âîñüìåðè÷íûå ÷èñëà - ýòî ÷èñëà, ïðåäñòàâëÿåìûå "ïî îñíîâàíèþ âîñåìü" (ò. å. èõ çàïèñü ñîñòîèò èç êîìáèíàöèé ñòåïåíåé ÷èñëà âîñåìü). Íàïðèìåð, 020 - ýòî óäâîåííàÿ ïåðâàÿ ñòåïåíü îñíîâàíèÿ âîñåìü, ò. å. âîñüìåðè÷íûé ýêâèâàëåíò ÷èñëà 16. Ïðè îòñóòñòâèè â ïåðâîé ïîçèöèè íóëÿ ýòî ïðîñòî îáûêíîâåííîå (äåñÿòè÷íîå) ÷èñëî 20.
Âòîðîé: öåëîå, íà÷èíàþùååñÿ ñ ñèìâîëîì 0õ èëè 0Õ èíòåðïðåòèðóåòñÿ êàê øåñòíàäöàòåðè÷íîå ÷èñëî, ò. å. ÷èñëî, çàïèñûâàåìîå ïî îñíîâàíèþ 16. Ïîýòîìó çàïèñü 0õ20 ïðåäñòàâëÿåò ñîáîé óäâîåííóþ ïåðâóþ ñòåïåíü ÷èñëà 16, èëè 32.
Âîñüìåðè÷íûå è øåñòíàäöàòåðè÷íûå ÷èñëà ÷ðåçâû÷àéíî ïîïóëÿðíû ñðåäè ïðîãðàììèñòîâ. Ïîñêîëüêó 8 è 16 ÿâëÿþòñÿ ñòåïåíÿìè ÷èñëà 2, à 10 - íåò, èñïîëüçîâàíèå ýòèõ ñèñòåì ñ÷èñëåíèÿ ïðè ðàáîòå íà ìàøèíå ÿâëÿåòñÿ âïîëíå åñòåñòâåííûì. Íàïðèìåð, ÷èñëî 65536, êîòîðîå ÷àñòî âîçíèêàåò ïðè ïðîãðàììèðîâàíèè íà 16-ðàçðÿäíûõ êîìïüþòåðàõ, â øåñòíàäöàòåðè÷íîé çàïèñè èìååò âèä 10000. Åñëè âû çàõîòèòå áîëüøå óçíàòü î âîñüìåðè÷íûõ è øåñòíàäöàòåðè÷íûõ ÷èñëàõ, âû ñìîæåòå íàéòè äîïîëíèòåëüíûé ìàòåðèàë â ïðèëîæåíèè Æ.
Èíèöèàëèçàöèÿ ïåðåìåííûõ öåëîãî òèïà.
Êîíñòàíòû ÷àñòî ïðèìåíÿþòñÿ ïðè "èíèöèàëèçàöèè" ïåðåìåííûõ. Ýòî îçíà÷àåò ïðèñâàèâàíèå ïåðåìåííîé íåêîòîðîãî çíà÷åíèÿ ïåðåä íà÷àëîì îáðàáîòêè. Íèæå ïðèâîäÿòñÿ ïðèìåðû èñïîëüçîâàíèÿ èíèöèàëèçàöèè:
Erns = 1024;
Stops = -3;
Johns = 12345678;
Åñëè çàõîòèòå, âû ìîæåòå èíèöèàëèçèðîâàòü ïåðåìåííóþ â îïåðàòîðå îïèñàíèÿ. Íàïðèìåð:
Int hogs = 23;
Int cows = 32, goats = 14;
Short dogs, cats = 92;
Çàìåòèì, ÷òî â ïîñëåäíåé ñòðîêå áûëà èíèöèàëèçèðîâàíà òîëüêî ïåðåìåííàÿ cats. Ïðè íåâíèìàòåëüíîì ÷òåíèè ìîæåò ñîçäàòüñÿ âïå÷àòëåíèå, ÷òî ïåðåìåííàÿ dogs òîæå èíèöèàëèçèðîâàíà çíà÷åíèåì 92, ïîýòîìó ëó÷øå èçáåãàòü ñìåøèâàíèÿ èíèöèàëèçèðóåìûõ è íåèíèöèàëèçèðóåìûõ ïåðåìåííûõ â îäíîì îïåðàòîðå îïèñàíèÿ.
Ðåêîìåíäàöèè.
Êàêèå ïåðåìåííûå öåëîãî òèïà ñî çíàêîì ëó÷øå âñåãî èñïîëüçî âàòü? Îäíîé èç öåëåé ââåäåíèÿ â ÿçûê òðåõ êëàññîâ öåëûõ ÷èñåë, èìåþùèõ ðàçëè÷íûå ðàçìåðû, áûëî ïðåäîñòàâèòü âîçìîæíîñòü ñîãëàñîâàíèÿ òèïà ïåðåìåííîé ñ òðåáîâàíèÿìè çàäà÷è. Íàïðèìåð, åñëè ïåðåìåííàÿ òèïà int çàíèìàåò îäíî ñëîâî, à ïåðåìåííàÿ òèïà long - äâà, òî òèï long ïîçâîëÿåò îáðàáàòûâàòü áîëüøèå ÷èñëà. Åñëè â âàøåé çàäà÷å òàêèå áîëüøèå ÷èñëà íå èñïîëüçóþòñÿ, òî íåçà÷åì è ââîäèòü â ïðîãðàììó ïåðåìåííóþ òèïà long, òàê êàê, åñëè âìåñòî ÷èñëà, çàíèìàþùåãî îäíî ñëîâî ïàìÿòè, èñïîëüçóåòñÿ ÷èñëî, çàíèìàþùåå äâà ñëîâà, ðàáîòà ìàøèíû çàìåäëÿåòñÿ. Âîîáùå ãîâîðÿ, íåîáõîäèìîñòü ââåäåíèÿ äàííûõ òèïà long öåëèêîì çàâèñèò îò âàøåé âû÷èñëèòåëüíîé ñèñòåìû, ïîñêîëüêó ïîä äàííûå òèïà int íà îäíîé ìàøèíå ìîæåò îòâîäèòüñÿ áîëüøå ïàìÿòè, ÷åì ïîä äàííûå òèïà long íà äðóãîé.  êîíöå ìû åùå ðàç õîòèì íàïîìíèòü âàì, ÷òî îáû÷íî âïîëíå äîñòàòî÷íî èñïîëüçîâàòü ïåðåìåííóþ òèïà int.
×òî ïðîèñõîäèò, êîãäà â ïðîöåññå îáðàáîòêè äàííûõ ïîÿâëÿåòñÿ çíà÷åíèå, ëåæàùåå âíå òîãî äèàïàçîíà ÷èñåë, êîòîðîìó ñîîòâåòñòâóåò äàííûé öåëûé òèï? Äàâàéòå ïðèñâîèì íåêîòîðîé ïåðåìåííîé öåëîãî òèïà íàèáîëüøåå âîçìîæíîå çíà÷åíèå, âûïîëíèì îïåðàöèþ ñëîæåíèÿ è ïîñìîòðèì, ÷òî ïðîèçîéäåò.
/* ïåðåïîëíåíèå */
Main( ).
{
int i = 32767,
printf( %d %d %d\n , i, i+l, i+2),
}
Íèæå ïðèâåäåí ðåçóëüòàò ðàáîòû ýòîé ïðîãðàììû, âûïîëíåííîé íà íàøåé âû÷èñëèòåëüíîé ñèñòåìå.
3.
Öåëàÿ ïåðåìåííàÿ i âåäåò ñåáÿ çäåñü êàê îäîìåòð2) â ìàøèíå. Êîãäà åãî ïîêàçàíèÿ äîñòèãàþò ìàêñèìóìà, äàííàÿ âåëè÷èíà "ñáðàñûâàåòñÿ", è âñå íà÷èíàåòñÿ ñíà÷àëà. Îñíîâíîå îòëè÷èå ñîñòîèò â òîì, ÷òî ïîêàçàíèÿ îäîìåòðà ðàñòóò, íà÷èíàÿ ñ íóëÿ, à çíà÷åíèÿ íàøåé ïåðåìåííîé òèïà int - ñ âåëè÷èíû - 32768.
Çàìåòèì, ÷òî ïðè ýòîì âàì íå ñîîáùàþò, ÷òî ïåðåìåííàÿ i ïðåâûñèëà ìàêñèìàëüíîå çíà÷åíèå Äëÿ ðåãèñòðàöèè ïîäîáíûõ ñîáûòèé âû äîëæíû èñïîëüçîâàòü ñâîè ïðîãðàììíûå ñðåäñòâà.
Îïèñàííûé ïîäõîä íå âûòåêàåò íåïîñðåäñòâåííî èç ïðàâèë ÿçûêà Ñè, à ÿâëÿåòñÿ äîâîëüíî ðàñïðîñòðàíåííûì ñïîñîáîì ðåàëèçàöèè.
Òèï äàííûõ unsigned.
Îáû÷íî äàííûé òèï ñëóæèò ìîäèôèêàòîðîì îäíîãî èç òðåõ ðàíåå îïèñàííûõ òèïîâ. Ïîýòîìó ìû ìîæåì èñïîëüçîâàòü êîìáèíàöèÿ êëþ÷åâûõ ñëîâ unsigned int èëè unsigned long êàê îáîçíà÷åíèÿ òèïîâ. Äëÿ óêàçàíèÿ òèïà unsigned int äîñòàòî÷íî ïðèâåñòè òîëüêî êëþ÷åâîå ñëîâî unsigned. Íåêîòîðûå âû÷èñëèòåëüíûå ñèñòåìû íèêàê íå îáåñïå÷èâàþò àïïàðàòíóþ ðåàëèçàöèþ òèïà unsigned long; êðîìå òîãî, ñóùåñòâóþò ìîäåëè ìèêðîïðîöåññîðîâ â êîòîðûõ unsigned - ñïåöèàëüíûé òèï ôèêñèðîâàííîãî ðàçìåðà.
Öåëûå áåççíàêîâûå êîíñòàíòû çàïèñûâàþòñÿ òî÷íî òàê æå, êàê è îáû÷íûå öåëûå êîíñòàíòû, ñ òåì ëèøü èñêëþ÷åíèåì, ÷òî èñïîëüçîâàíèå çíàêà - çàïðåùåíî.
Öåëûå ïåðåìåííûå áåç çíàêà îïèñûâàþòñÿ è èíèöèàëèçèðóþòñÿ ñîâåðøåííî àíàëîãè÷íî òîìó, êàê ýòî äåëàåòñÿ â ñëó÷àå îáû÷íûõ öåëûõ ïåðåìåííûõ. Íèæå ïðèâåäåíî íåñêîëüêî ïðèìåðîâ:
Unsigned int students;
Unsigned players;
Unsigned short ribs = 6;
Ïðèìåíåíèå äàííîãî òèïà ïðè ââåäåíèè â ïðîãðàììó íåêîòîðîé ïåðåìåííîé ãàðàíòèðóåò, ÷òî îíà íèêîãäà íå ñòàíåò îòðèöàòåëüíîé. Êðîìå òîãî, åñëè âû èìååòå äåëî òîëüêî ñ ïîëîæèòåëüíûìè ÷èñëàìè, âû ñìîæåòå âîñïîëüçîâàòüñÿ òåì, ÷òî äàííûå óêàçàííîãî òèïà ìîãóò ïðèíèìàòü áîëüøèå çíà÷åíèÿ, ÷åì äàííûå ýêâèâàëåíòíîãî òèïà ñî çíàêîì. Îáû÷íî ýòî ïðèìåíÿåòñÿ ïðè àäðåñàöèè ïàìÿòè è îðãàíèçàöèè ñ÷åò÷èêîâ.
Òèï äàííûõ char.
Ýòîò òèï îïðåäåëÿåò öåëûå ÷èñëà áåç çíàêà â äèàïàçîíå îò 0 äî 255. Îáû÷íî òàêîå öåëîå ðàçìåùàåòñÿ â îäíîì áàéòå ïàìÿòè.  ìàøèíå èñïîëüçóåòñÿ íåêîòîðûé êîä äëÿ ïåðåâîäà ÷èñåë â ñèìâîëû è îáðàòíî.  áîëüøèíñòâå êîìïüþòåðîâ ýòî êîä ASCII, îïèñàííûé â ïðèëîæåíèè â êîíöå êíèãè. Âî ìíîãèõ êîìïüþòåðàõ ôèðìû IBM (íî íå IBM PC) ïðèìåíÿåòñÿ äðóãîé êîä, íàçûâàåìûé EBCDIC. Íà ïðîòÿæåíèè âñåé êíèãè ìû áóäåì èñïîëüçîâàòü êîä ASCII è, ïðîâåäÿ ðàçëè÷íûå ïðèìåðû, áóäåì ññûëàòüñÿ íà íåãî.
Îïèñàíèå ñèìâîëüíûõ ïåðåìåííûõ.
Äëÿ îïèñàíèÿ ñèìâîëüíîé ïåðåìåííîé ïðèìåíÿåòñÿ êëþ÷åâîå ñëîâî char. Ïðàâèëà, êàñàþùèåñÿ îïèñàíèÿ áîëåå ÷åì îäíîé ïåðåìåííîé è èíèöèàëèçàöèè ïåðåìåííûõ, îñòàþòñÿ òåìè æå, ÷òî è äëÿ äðóãèõ îñíîâíûõ òèïîâ. Ïîýòîìó ñòðîêè, ïðèâåäåííûå íèæå, ÿâëÿþòñÿ äîïóñòèìûìè îïåðàòîðàìè.
Char response;
Char intable, latan;
Char isma = ' S ';
Ñèìâîëüíûå êîíñòàíòû.
 ÿçûêå Ñè ñèìâîëû çàêëþ÷àþòñÿ â àïîñòðîôû. Ïîýòîìó, êîãäà ìû ïðèñâàèâàåì êàêîå-òî çíà÷åíèå ïåðåìåííîé broiled òèïà char, ìû äîëæíû ïèñàòü.
Broiled = ' Ò '; /* ÏÐÀÂÈËÜÍÎ */,
À íå.
Broiled = Ò; /* ÍÅÏÐÀÂÈËÜÍÎ */
Åñëè àïîñòðîôû îïóùåíû, êîìïèëÿòîð "ñ÷èòàåò", ÷òî ìû èñïîëüçóåì ïåðåìåííóþ ñ èìåíåì Ò, êîòîðóþ çàáûëè îïèñàòü.
 ñòàíäàðòå ÿçûêà Ñè ïðèíÿòî ïðàâèëî, ñîãëàñíî êîòîðîìó çíà÷åíèÿìè ïåðåìåííîé èëè êîíñòàíòû òèïà char ìîãóò áûòü òîëüêî îäèíî÷íûå ñèìâîëû.  ñîîòâåòñòâèè ñ ýòèì ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ, óêàçàííàÿ íèæå, ÿâëÿåòñÿ íåäîïóñòèìîé, ïîñêîëüêó òàì äåëàåòñÿ ïîïûòêà ïðèñâîèòü ïåðåìåííîé bovine çíà÷åíèå, ñîñòîÿùåå èç äâóõ ñèìâîëîâ:
Ehar bovine;
Bovine = ' ox '; /*ÍÅÏÐÀÂÈËÜÍÎ */
Åñëè âû ïîñìîòðèòå íà òàáëèöó êîäà ASCII, òî óâèäèòå, ÷òî íåêîòîðûå èç "ñèìâîëîâ" â íåé íå âûâîäÿòñÿ íà ïå÷àòü. Íàïðèìåð, ïðè èñïîëüçîâàíèè â ïðîãðàììå ñèìâîëà íîìåð 7 òåðìèíàë êîìïüþòåðà èçäàåò çâóêîâîé ñèãíàë. Íî êàê èñïîëüçîâàòü ñèìâîë, êîòîðûé íåâîçìîæíî íàáðàòü íà êëàâèàòóðå?  ÿçûêå Ñè äëÿ ýòîãî èìåþòñÿ äâà ñïîñîáà.
 ïåðâîì ñïîñîáå èñïîëüçóåòñÿ ñàì êîä ASCII. Âû äîëæíû òîëüêî óêàçàòü íîìåð ñèìâîëà âìåñòå ñ ïðåäøåñòâóþùèì çíàêîì "îáðàòíàÿ êîñàÿ ÷åðòà". Ìû óæå äåëàëè ýòî â íàøåé ïðîãðàììå "çîëîòîé ýêâèâàëåíò". Âîò ýòà ñòðîêà.
Beep = ' \007 ';
Çäåñü èìåþòñÿ äâà âàæíûõ ìîìåíòà, êîòîðûå âû äîëæíû îò÷åòëèâî ïðåäñòàâëÿòü ñåáå. Ïåðâûé - ýòî òî, ÷òî ïîñëåäîâàòåëüíîñòü çíàêîâ çàêëþ÷àåòñÿ â àïîñòðîôû òî÷íî òàê æå, êàê ýòî äåëàåòñÿ ñ îáû÷íûì ñèìâîëîì. Âòîðîå - òî, ÷òî íîìåð ñèìâîëà äîëæåí áûòü çàïèñàí â âîñüìåðè÷íîì âèäå. Ïðè çàïèñè ïîñëåäîâàòåëüíîñòè çíàêîâ ìû ìîæåì ñëó÷àéíî ïðîïóñòèòü íóëè â ïåðâûõ ïîçèöèÿõ; â ýòîì ñëó÷àå äëÿ ïðåäñòàâëåíèÿ êîäà "ñèãíàë" ìû ìîãëè áû èñïîëüçîâàòü '\07' èëè äàæå '\7'. Íî íè â êîåì ñëó÷àå íå îïóñêàéòå â çàïèñè ïîñëåäíèå íóëè! Ïîñëåäîâàòåëüíîñòü ñèìâîëîâ '\020' ìîæíî çàïèñàòü â âèäå '\20', íî íå '\02'.
Ïðè èñïîëüçîâàíèè êîäà ASCII íåîáõîäèìî îòìåòèòü ðàçëè÷èå ìåæäó ÷èñëàìè è ñèìâîëàìè, îáîçíà÷àþùèìè ÷èñëà. Íàïðèìåð, ñèìâîëó "4" ñîîòâåòñòâóåò êîä ASCII, ðàâíûé 52. Ýòî ñèìâîë "4" à íå ÷èñëî 4.
ÐÈÑ. 3. 4. Ôîðìû çàïèñè êîíñòàíò öåëûõ òèïîâ.
Âî âòîðîì ñïîñîáå ïðåäñòàâëåíèÿ "íåóäîáíûõ" çíàêîâ èñïîëüçóþòñÿ ñïåöèàëüíûå ïîñëåäîâàòåëüíîñòè ñèìâîëîâ. Îíè íàçûâàþòñÿ óïðàâëÿþùèìè ïîñëåäîâàòåëüíîñòÿìè è âûãëÿäÿò ñëåäóþùèì îáðàçîì:
\n íîâàÿ ñòðîêà.
\t òàáóëÿöèÿ.
\b øàã íàçàä.
\r âîçâðàò êàðåòêè.
\f ïîäà÷à áëàíêà.
\\ îáðàòíàÿ êîñàÿ ÷åðòà (\).
\' àïîñòðîô (').
\" êàâû÷êè (").
Ïðè ïðèñâàèâàíèè ñèìâîëüíîé ïåðåìåííîé ýòè ïîñëåäîâàòåëüíî ñòè òîæå äîëæíû áûòü çàêëþ÷åíû â àïîñòðîôû. Íàïðèìåð, ìû ìîãëè áû íàïèñàòü îïåðàòîð.
Nerf = ' \n ';
à çàòåì âûâåñòè íà ïå÷àòü ïåðåìåííóþ nerf; ýòî ïðèâåäåò ê ïðîäâèæåíèþ íà îäíó ñòðîêó âïåðåä íà ïå÷àòàþùåì óñòðîéñòâå èëè íà ýêðàíå äèñïëåÿ.
Ïåðâûå ïÿòü óïðàâëÿþùèõ ïîñëåäîâàòåëüíîñòåé ÿâëÿþòñÿ îáùåïðèíÿòûìè ñèìâîëàìè, ïðåäíàçíà÷åííûìè äëÿ óïðàâëåíèÿ ðàáîòîé ïå÷àòàþùåãî óñòðîéñòâà:
Ñèìâîë "íîâàÿ ñòðîêà" âûçûâàåò ïåðåõîä ê íîâîé ñòðîêå;
Ñèìâîë "òàáóëÿöèÿ" ñäâèãàåò êóðñîð èëè ïå÷àòàþùóþ ãîëîâêó íà íåêîòîðîå ôèêñèðîâàííîå ÷èñëî ïîçèöèé 5 èëè 8;
Ñèìâîë "øàã íàçàä" ïðîèçâîäèò ñäâèã íàçàä íà îäíó ïîçèöèþ;
Ñèìâîë "âîçâðàò êàðåòêè" îñóùåñòâëÿåò âîçâðàò ê íà÷àëó ñòðîêè;
Ñèìâîë "ïîäà÷à áëàíêà" âûçûâàåò ïðîòÿæêó áóìàãè íà îäíó ñòðàíèöó.
 ïîñëåäíèõ òðåõ óïðàâëÿþùèõ ïîñëåäîâàòåëüíîñòÿõ ñèìâîëû \, ', " ìîæíî ñ÷èòàòü ñèìâîëüíûìè êîíñòàíòàìè [ïîñêîëüêó îíè ñëóæàò äëÿ îïðåäåëåíèÿ ñèìâîëüíûõ êîíñòàíò è íåïîñðåäñòâåííî èñïîëüçóþòñÿ â îïåðàòîðå printf( ), ïðèìåíåíèå èõ ñàìèõ â êà÷åñòâå ñèìâîëîâ ìîãëî áû ïðèâåñòè ê îøèáêå]. Åñëè âû õîòèòå âûâåñòè íà ïå÷àòü ñòðîêó.
Çàïîìíèòå, " ñèìâîë \ íàçûâàåòñÿ îáðàòíàÿ êîñàÿ ÷åðòà".
Îïåðàòîð áóäåò âûãëÿäåòü òàê:
Printf(" Çàïîìíèòå, \" ñèìâîë \\ íàçûâàåòñÿ îáðàòíàÿ êîñàÿ ÷åðòà. \" \n");
Çäåñü ó âàñ ìîãóò âîçíèêíóòü äâà âîïðîñà. Âî-ïåðâûõ, ïî÷åìó ìû íå çàêëþ÷èëè óïðàâëÿþùèå ïîñëåäîâàòåëüíîñòè â àïîñòðîôû? Âî-âòîðûõ, â êàêèõ ñëó÷àÿõ íåîáõîäèìî èñïîëüçîâàòü êîä ASCII è êîãäà óïðàâëÿþùèå ïîñëåäîâàòåëüíîñòè, êîòîðûå ìû òîëüêî ÷òî îáñóæäàëè? (Ìû íàäååìñÿ, ÷òî ó âàñ âîçíèêëè êàê ðàç ýòè âîïðîñû, ÏÎÒÎÌÓ ÷òî ìû ñîáèðàåìñÿ îòâå÷àòü èìåííî íà íèõ.).
1. Êîãäà ñèìâîë ÿâëÿåòñÿ ÷àñòüþ ñòðîêè ñèìâîëîâ, çàêëþ÷åííîé â êàâû÷êè, îí âõîäèò òóäà áåç àïîñòðîôîâ íåçàâèñèìî îò òîãî, ÿâëÿåòñÿ ëè îí óïðàâëÿþùèì èëè íåò. Çàìåòèì, ÷òî âñå îñòàëüíûå ñèìâîëû â íàøåì ïðèìåðå (3,à, ï, î, ì, í, è ò. ä.) òîæå ïðèñóòñòâóþò â ýòîé ñòðîêå áåç êàâû÷åê. Ñòðîêà ñèìâîëîâ, çàêëþ÷åííàÿ â êàâû÷êè, íàçûâàåòñÿ ñèìâîëüíîé ñòðîêîé èëè öåïî÷êîé. Ìû îáñóäèì ýòîò âîïðîñ â ñëåäóþùåé ãëàâå.
2. Åñëè ó âàñ åñòü âîçìîæíîñòü âûáîðà îäíîé èç äâóõ ôîðì çàïèñè íåêîòîðîé ñïåöèàëüíîé óïðàâëÿþùåé ïîñëåäîâàòåëüíîñòè, ñêàæåì '\f', èëè ýêâèâàëåíòíîãî êîäà èç òàáëèöû êîäîâ ASCII - '\016', òî ðåêîìåíäóåì èñïîëüçîâàòü '\f'. Âî-ïåðâûõ, ýòî áîëåå íàãëÿäíî. Âî-âòîðûõ, ëó÷øå ñîãëàñóåòñÿ ñ òðåáîâàíèåì ïåðåíîñèìîñòè ïðîãðàìì, ïîñêîëüêó äàæå â òîì ñëó÷àå, êîãäà â ñèñòåìå íå èñïîëüçóåòñÿ êîä ASCII, îáîçíà÷åíèå '\f' áóäåò ïðîäîëæàòü "ðàáîòàòü".
Ïðîãðàììà.
Íèæå ïðèâîäèòñÿ êîðîòêàÿ ïðîãðàììà, ïîçâîëÿþùàÿ óçíàâàòü íîìåð êîäà ñèìâîëà äàæå â òîì ñëó÷àå, åñëè íà âàøåé ìàøèíå íå èñïîëüçóåòñÿ êîä ASCII.
Main( ) /* îïðåäåëÿåò íîìåð êîäà ñèìâîëà */
{
char ch;
printf(" Ââåäèòå, ïîæàëóéñòà, ñèìâîë .\n");
scanf(" %c", &ch); /* ââîä ïîëüçîâàòåëåì ñèìâîëà */
printf("Êîä ñèìâîëà %ñ ðàâåí %d.\n", ch, ch);
}
Ïðè ðàáîòå ñ ýòîé ïðîãðàììîé íå çàáûâàéòå íàæèìàòü êëàâèøó [ââîä] èëè [âîçâðàò] ïîñëå ââîäà ñèìâîëà. Çàòåì ôóíêöèÿ scanf( ) ïðî÷òåò ââåäåííûé ñèìâîë; çíàê àìïåðñàíä (&) óêàçûâàåò, ÷òî ñèìâîë äîëæåí áûòü ïðèñâîåí ïåðåìåííîé ch. Ôóíêöèÿ printf( ) âûâîäèò íà ïå÷àòü âåëè÷èíó ch äâàæäû: ïåðâûé ðàç êàê ñèìâîë (â ñîîòâåòñòâèè ñî ñïåöèôèêàöèåé %c), à çàòåì êàê äåñÿòè÷íîå öåëîå ÷èñëî (â ñîîòâåòñòâèè ñî ñïåöèôèêàöèåé %d).
Òèïû äàííûõ float è double.
 áîëüøèíñòâå ïðîåêòîâ ðàçðàáîòêè ïðîãðàììíîãî îáåñïå÷åíèÿ îêàçûâàåòñÿ âïîëíå äîñòàòî÷íûì èñïîëüçîâàòü äàííûå öåëûõ òèïîâ. Îäíàêî â ïðîãðàììàõ âû÷èñëèòåëüíîãî õàðàêòåðà ÷àñòî ïðèìåíÿþòñÿ ÷èñëà ñ ïëàâàþùåé òî÷êîé.  ÿçûêå Ñè òàêèå äàííûå îïèñûâàþòñÿ òèïîì float; îíè ñîîòâåòñòâóþò òèïó real â Ôîðòðàíå è Ïàñêàëå. Óêàçàííûé ïîäõîä, êàê âû ìîãëè çàìåòèòü ïðè âíèìàòåëüíîì ÷òåíèè, ïîçâîëÿåò ïðåäñòàâëÿòü ÷èñëà èç ãîðàçäî áîëåå øèðîêîãî äèàïàçîíà, âêëþ÷àÿ è äåñÿòè÷íûå äðîáè. ×èñëà ñ ïëàâàþùåé òî÷êîé ñîâåðøåííî àíàëîãè÷íû ÷èñëàì â îáû÷íîé àëãåáðàè÷åñêîé çàïèñè, èñïîëüçóåìîé ïðè ðàáîòå ñ î÷åíü áîëüøèìè èëè ìàëûìè ÷èñëàìè. Äàâàéòå ðàññìîòðèì åå ïîäðîáíåå.
Àëãåáðàè÷åñêàÿ çàïèñü ÷èñëà ïðåäñòàâëÿåò ñîáîé ïðîèçâåäåíèå íåêîòîðîãî äåñÿòè÷íîãî ÷èñëà íà ñòåïåíü, îñíîâàíèå êîòîðîé ðàâíî äåñÿòè. Íèæå ïðèâåäåíî íåñêîëüêî ïðèìåðîâ.
| ×èñëî | Àëãåáðàè÷åñêàÿ çàïèñü äëÿ ââîäà çàïèñü â ìàøèíó |
|---|---|
| 1 000000000 | = 1.0 ´ 109 = 1.0e9 |
| 123000 | = 1.23 ´ 105 = 1.23å5 |
| 322.56 | = 3.2256 ´ 102 = 3.2256å2 |
| 0.000056 | = 5.6 ´ 10-5 = 5.6å-5 |
 ïåðâîì ñòîëáöå ÷èñëà èçîáðàæåíû â îáû÷íîé çàïèñè, âî âòîðîì ïðèâåäåíà ñîîòâåòñòâóþùàÿ àëãåáðàè÷åñêàÿ çàïèñü, à â òðåòüåì ñòîëáöå ÷èñëà ïîêàçàíû â òîì âèäå, â êîòîðîì îíè îáû÷íî ïðåäñòàâëÿþòñÿ ïðè ââîäå â ìàøèíó è ïðè âûâîäå èç íåå - ñ ñèìâîëîì å, çà êîòîðûì ñëåäóåò ïîêàçàòåëü ñòåïåíè ïî îñíîâàíèþ äåñÿòü (ïîðÿäîê).
Îáû÷íî äëÿ ðàçìåùåíèÿ â ïàìÿòè ÷èñëà ñ ïëàâàþùåé òî÷êîé îòâîäèòñÿ 32 áèòà - 8 áèò äëÿ ïðåäñòàâëåíèÿ ïîðÿäêà è çíàêà è 24 áèòà - äëÿ ìàíòèññû (ò. å. êîýôôèöèåíòà ïðè ñòåïåíè äåñÿòè). Âàæíûì ôàêòîì, êîòîðûé âàì íåîáõîäèìî çíàòü, ÿâëÿåòñÿ òî, ÷òî òàêîé ñïîñîá äàåò âîçìîæíîñòü ïðåäñòàâëÿòü ÷èñëà ñ òî÷íîñòüþ äî 6-7 äåñÿòè÷íûõ öèôð â äèàïàçîíå ±(10-37 - 1038). Ýòî ìîæåò îêàçàòüñÿ óäîáíûì, åñëè âàì ïîíàäîáèòñÿ îáðàáàòûâàòü ÷èñëà òîãî æå ïîðÿäêà, ÷òî ìàññà Ñîëíöà (2.0å30 êã) èëè çàðÿä ïðîòîíà (1.6å-19 Êë). (Ìíîãèì íðàâèòñÿ èñïîëüçîâàòü ïîäîáíûå ÷èñëà.).
Âî ìíîãèõ ÝÂÌ ïðåäóñìàòðèâàåòñÿ îáðàáîòêà äàííûõ òèïà double (âû÷èñëåíèé ñ äâîéíîé òî÷íîñòüþ), êîãäà äëÿ ïðåäñòàâëåíèÿ ÷èñåë èñïîëüçóåòñÿ óäâîåííîå ÷èñëî áèòîâ, ÷àùå âñåãî 64.  íåêîòîðûõ ìàøèíàõ âñå 32 äîáàâî÷íûõ áèòà èñïîëüçóþòñÿ äëÿ õðàíåíèÿ ìàíòèññû. Ýòî óâåëè÷èâàåò ÷èñëî çíà÷àùèõ öèôð è óìåíüøàåò îøèáêó îêðóãëåíèÿ.  äðóãèõ ìàøèíàõ íåêîòîðîå ÷èñëî áèòîâ èç äîïîëíèòåëüíîãî íàáîðà èñïîëüçóåòñÿ äëÿ õðàíåíèÿ áîëüøåãî ïîðÿäêà: ýòî ðàñøèðÿåò äèàïàçîí ïðåäñòàâëåíèÿ ÷èñåë.
Äðóãîé ñïîñîá îïðåäåëåíèÿ äàííûõ òèïà double çàêëþ÷àåòñÿ â èñïîëüçîâàíèè êëþ÷åâûõ ñëîâ long float.
Îïèñàíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé.
Ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé îïèñûâàþòñÿ è èíèöèàëèçèðóþòñÿ òî÷íî òàêèì æå îáðàçîì, ÷òî è ïåðåìåííûå öåëîãî òèïà. Íèæå ïðèâåäåíî íåñêîëüêî ïðèìåðîâ:
Float noah, jonah;
Double trouble;
Float planck = 6.63e- 34;
Êîíñòàíòû ñ ïëàâàþùåé òî÷êîé
Ïðàâèëà ÿçûêà Ñè äîïóñêàþò íåñêîëüêî ñïîñîáîâ çàïèñè êîíñòàíò ñ ïëàâàþùåé òî÷êîé. Íàèáîëåå îáùàÿ ôîðìà çàïèñè êîíñòàíòû - ýòî ïîñëåäîâàòåëüíîñòü äåñÿòè÷íûõ öèôð ñî çíàêîì, âêëþ÷àþùàÿ â ñåáÿ äåñÿòè÷íóþ òî÷êó, çàòåì ñèìâîë å èëè Å è ïîêàçàòåëü ñòåïåíè ïî îñíîâàíèþ 10 ñî çíàêîì. Âîò äâà ïðèìåðà:
-1.56Å+12 2.87å-3.
Çíàê + ìîæíî íå ïèñàòü. Ðàçðåøàåòñÿ òàêæå îïóñêàòü ëèáî äåñÿòè÷íóþ òî÷êó, ëèáî ýêñïîíåíöèàëüíóþ ÷àñòü, íî íå îäíîâðåìåííî. Êðîìå òîãî, ìîæíî íå ïèñàòü äðîáíóþ èëè öåëóþ ÷àñòü, íî íå îáå ñðàçó. Íèæå ïðèâåäåíî åùå íåñêîëüêî ïðàâèëüíî çàïèñàííûõ êîíñòàíò ñ ïëàâàþùåé òî÷êîé:
3.14159.
.2.
4å16.
.8Å-5.
100.
Èñïîëüçîâàòü ïðîáåëû ïðè çàïèñè êîíñòàíò çàïðåùàåòñÿ.
1.56Å+ 12 - ÍÅÏÐÀÂÈËÜÍÎ.
 ïðîöåññå îáðàáîòêè êîíñòàíòû ñ ïëàâàþùåé òî÷êîé ðàññìàòðèâàþòñÿ â ôîðìàòå ñ óäâîåííîé òî÷íîñòüþ. Ïðåäïîëîæèì, íàïðèìåð, ÷òî ïåðåìåííàÿ some òèïà float ïîëó÷àåò ñâîå çíà÷åíèå â ðåçóëüòàòå âûïîëíåíèÿ îïåðàòîðà.
Some = 4.0*2.0;
 ýòîì ñëó÷àå êîíñòàíòû 4.0 è 2.0 ðàçìåùàþòñÿ â ïàìÿòè êàê äàííûå òèïà double, ò. å. äëÿ êàæäîé èç íèõ (îáû÷íî) îòâîäèòñÿ 64 áèò. Èõ ïðîèçâåäåíèå (ðàâíîå 8) âû÷èñëÿåòñÿ ñ ïîìîùüþ îïåðàöèè óìíîæåíèÿ, âûïîëíÿåìîé ñ äâîéíîé òî÷íîñòüþ, è òîëüêî ïîñëå ýòîãî ïðîèçâîäèòñÿ óñå÷åíèå ðåçóëüòàòà äî íîðìàëüíîãî ðàçìåðà, ñîîòâåòñòâóþùåãî òèïó float. Âñå ýòî îáåñïå÷èâàåò ìàêñèìàëüíóþ òî÷íîñòü âàøèõ âû÷èñëåíèé.
Ïåðåïîëíåíèå è ïîòåðÿ çíà÷èìîñòè ïðè îáðàáîòêå ÷èñåë ñ ïëàâàþùåé òî÷êîé.
×òî ïðîèçîéäåò, åñëè çíà÷åíèå ïåðåìåííîé òèïà float âûéäåò çà óñòàíîâëåííûå ãðàíèöû? Íàïðèìåð, ïðåäïîëîæèì, ÷òî âû óìíîæàåòå 10å38 íà 100 (ïåðåïîëíåíèå) èëè äåëèòå 10å - 37 íà 1000 (ïîòåðÿ çíà÷èìîñòè). Ðåçóëüòàò öåëèêîì çàâèñèò îò ðåàêöèè âàøåé âû÷èñëèòåëüíîé ñèñòåìû.  íàøåé ñèñòåìå ïðè âîçíèêíîâåíèè ñîñòîÿíèÿ "ïåðåïîëíåíèå" ðåçóëüòàò îïåðàöèè çàìåíÿåòñÿ ìàêñèìàëüíî äîïóñòèìûì ÷èñëîì, à ïðè ïîòåðå çíà÷èìîñòè - íóëåì.  äðóãèõ ñèñòåìàõ â ïîäîáíîé ñèòóàöèè ìîãóò âûäàâàòüñÿ ïðåäóïðåæäàþùèå ñîîáùåíèÿ, âûïîëèåíèå çàäà÷è ìîæíî ïðèîñòàíîâèòü, èëè âàì áóäåò ïðåäîñòàâëåíà âîçìîæíîñòü ïðåäïðèíÿòü ÷òî-íèáóäü ñàìîìó. Åñëè ýòîò âîïðîñ îêàæåòñÿ äëÿ âàñ ñóøåñòâåííûì, âàì íåîáõîäèìî áóäåò ñâåðèòüñÿ ñ ïðàâèëàìè, äåéñòâóþùèìè äëÿ âàøåé ÝÂÌ.  ñëó÷àå åñëè âû íå ñìîæåòå íàéòè íèêàêîé èíôîðìàöèè, íå áîéòåñü ïðîáîâàòü äðóãèå âîçìîæíîñòè.
Ðåçþìå: îñíîâíûå òèïû äàííûõ.
Êëþ÷åâûå ñëîâà
Äàííûå îñíîâíûõ òèïîâ ââîäÿòñÿ â ïðîãðàììó ïðè ïîìîùè ñëåäóþùèõ ñåìè êëþ÷åâûõ ñëîâ: int, long, short, unsigned, char, float, double.
Öåëûå ÷èñëà ñî çíàêîì.
Äàííûå ýòèõ òèïîâ ìîãóò ïðèíèìàòü ïîëîæèòåëüíûå è îòðèöàòåëüíûå çíà÷åíèÿ.
int: îñíîâíîé öåëûé òèï, èñïîëüçóåìûé â âû÷èñëèòåëüíîé ñèñòåìå;
long èëè long int: ìîæåò ñîäåðæàòü öåëîå çíà÷åíèå, íå ìåíüøåå ìàêñèìàëüíîé âåëè÷èíû, äîïóñêàåìîé òèïîì int, èëè äàæå áîëüøåå;
short èëè short int: ìàêñèìàëüíîå öåëîå ÷èñëî òèïà short íå áîëüøå, ÷åì ìàêñèìàëüíîå öåëîå ÷èñëî òèïà int, à ìîæåò áûòü, è ìåíüøå. Îáû÷íî ÷èñëà òèïà long áûâàþò áîëüøå ÷èñåë òèïà short, à òèï int ðåàëèçóåòñÿ êàê îäèí èç äâóõ óêàçàííûõ òèïîâ. Íàïðèìåð, êîìïèëÿòîð Lattice Ñ íà IBM PC ïîä äàííûå òèïîâ short è int îòâîäèò 16 áèò, à ïîä äàííûå òèïà long - 32 áèòà. Âñå çàâèñèò îò êîíêðåòíîé ñèñòåìû.
Öåëûå ÷èñëà áåç çíàêà.
Äàííûå ýòèõ òèïîâ ïðèíèìàþò òîëüêî ïîëîæèòåëüíûå çíà÷åíèÿ èëè íóëü. Ýòî ðàñøèðÿåò äèàïàçîí âîçìîæíûõ ïîëîæèòåëüíûõ çíà÷åíèé. Ïðè óêàçàíèè òèïà èñïîëüçóéòå êëþ÷åâîå ñëîâî unsigned: unsigned int, unsigned long, unsigned short. Ïðîñòî unsigned ñîîòâåòñòâóåò íàïèñàíèþ unsigned int.
Ñèìâîëû.
Ýòè çíàêè ñîîòâåòñòâóþò òèïîãðàôñêèì ñèìâîëàì, òàêèì, êàê À, &, + è ò. ï. Îáû÷íî ïîä êàæäûé ñèìâîë îòâîäèòñÿ 1 áàéò ïàìÿòè.
Char: êëþ÷åâîå ñëîâî, èñïîëüçóåìîå äëÿ óêàçàíèÿ äàííûõ ýòîãî òèïà.
Äàííûå ýòèõ òèïîâ ìîãóò ïðèíèìàòü ïîëîæèòåëüíûå è îòðèöàòåëüíûå çíà÷åíèÿ.
float: îñíîâíîé òèï äàííûõ ñ ïëàâàþùåé òî÷êîé â ñèñòåìå;
1. Âûáðàòü òðåáóåìûé òèï äàííûõ.
2. Âûáðàòü èìÿ äëÿ ïåðåìåííîé.
3. Äëÿ îïåðàòîðà îïèñàíèÿ èñïîëüçîâàòü íèæåñëåäóþùèé ôîðìàò:
ñïåöèôèêàöèÿ-òèïà èìÿ-ïåðåìåííîé;
Ñïåöèôèêàöèÿ-òèïà ôîðìèðóåòñÿ èç îäíîãî èëè áîëåå êëþ÷åâûõ ñëîâ.
Âîò íåñêîëüêî ïðèìåðîâ:
int erest;
unsigned short cash;
4. Âû ìîæåòå îïèñàòü â îäíîì îïåðàòîðå íåñêîëüêî ïåðåìåííûõ îäíîãî òèïà, ðàçäåëÿÿ èõ èìåíà çàïÿòûìè:
char ch, unit, ans;
5. Â îïåðàòîðå îïèñàíèÿ âû èìååòå âîçìîæíîñòü èíèöèàëèçèðîâàòü ïåðåìåííóþ:
float mass = 6.0E24;
Äðóãèå òèïû.
Ýòîò ðàçäåë çàâåðøàåò ðàññìîòðåíèå îñíîâíûõ òèïîâ äàííûõ. Íåêîòîðûì ÷èòàòåëÿì èõ ÷èñëî ìîæåò ïîêàçàòüñÿ ñëèøêîì áîëüøèì. Îñòàëüíûå ìîãóò ïîëàãàòü, ÷òî îïèñàííûõ òèïîâ íåäîñòàòî÷íî; íàïðèìåð, èì çàõî÷åòñÿ èìåòü áóëåâ òèï èëè ñòðîêîâûé òèï äàííûõ.  ÿçûêå Ñè îíè îòñóòñòâóþò, íî, íåñìîòðÿ íà ýòî, îí âïîëíå ïîäõîäèò äëÿ íàïèñàíèÿ ïðîãðàìì, ñâÿçàííûõ ñ îáðàáîòêîé ëîãè÷åñêèõ äàííûõ èëè ñòðîê. Ñàìûå ïðîñòûå âîçìîæíîñòè ðàáîòû ñî ñòðîêàìè ìû ðàññìîòðèì â ñëåäóþùåé ãëàâå.
 ÿçûêå Ñè èìåþòñÿ è äðóãèå òèïû äàííûõ, ïîñòðîåííûå ñ èñïîëüçîâàíèåì îñíîâíûõ òèïîâ. Îíè âêëþ÷àþò â ñåáÿ ìàññèâû, óêàçàòåëè, ñòðóêòóðû è îáúåäèíåíèÿ. Õîòÿ ýòè òèïû ÿâëÿþòñÿ ïðåä ìåòîì ðàññìîòðåíèÿ ïîñëåäóþùèõ ãëàâ, ìû, íå ïîäîçðåâàÿ îá ýòîì, óæå ïðèìåíèëè óêàçàòåëè â ïðèìåðàõ, ïðèâåäåííûõ â äàííîé ãëàâå. [Óêàçàòåëè èñïîëüçóþòñÿ ôóíêöèåé scanf( ); ïðèçíàêîì ýòîãî â äàííîì ñëó÷àå ñëóæèò ïðåôèêñ &.]

Ïðèâåäåì òàáëèöó ðàçìåðîâ äàííûõ äëÿ íåêîòîðûõ ðàñïðîñòðàíåííûõ âû÷èñëèòåëüíûõ ñèñòåì.
Òàáëèöà 3.1. Ïðåäñòàâëåíèå òèïîâ äàííûõ â íåêîòîðûõ èçâåñòíûõ âû÷èñëèòåëüíûõ ñèñòåìàõ.
| Ðàçìåð ñëîâà | DEC PDP-11 16 áèò | DEC VAX 32 áèòà | Interdata 8/3 32 áèòà | IBM PC (Lattice C) 16 áèò |
|---|---|---|---|---|
| char | 8 | 8 | 8 | 8 |
| int | 16 | 32 | 32 | 16 |
| short | 16 | 16 | 16 | 16 |
| long | 32 | 32 | 32 | 32 |
| float | 32 | 32 | 32 | 32 |
| double | 64 | 64 | 64 | 64 |
| Äèàïàçîí ïîðÿäêà | ±38 | ±38 | ±76 | -307 + 308 (double) |
Êàê îáñòîèò äåëî íà âàøåé ìàøèíå? Ïîïðîáóéòå âûïîëíèòü íèæåñëåäóþùóþ ïðîãðàììó:
Main( ).
{
printf(" Äàííûå òèïà int çàíèìàþò %d áàéòà. \n", sizeof (int));
printf(" Äàííûå òèïà char çàíèìàþò %d áàéò.\n", sizeof (char));
printf(" Äàííûå òèïà long çàíèìàþò %d áàéòà.\n", sizeof (long));
printf(" Äàííûå òèïà double çàíèìàþò %d áàéò.\n", sizeof (double));
}
 ÿçûêå Ñè èìååòñÿ âñòðîåííàÿ îïåðàöèÿ sizeof, êîòîðàÿ ïîçâîëÿåò îïðåäåëèòü ðàçìåð îáúåêòîâ â áàéòàõ.
Ìû îïðåäåëèëè ðàçìåðû äàííûõ òîëüêî ÷åòûðåõ òèïîâ, íî âû ëåãêî ìîæåòå ìîäèôèöèðîâàòü ýòó ïðîãðàììó è íàéòè ðàçìåð îáúåêòà ëþáîãî äðóãîãî èíòåðåñóþùåãî âàñ òèïà.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÒÈÏÎÂ ÄÀÍÍÛÕ.
Âî âðåìÿ ðàçðàáîòêè ïðîãðàììû âàì íåîáõîäèìî ñîñòàâèòü ñïèñîê òðåáóåìûõ ïåðåìåííûõ è óêàçàòü ïðè ýòîì, êàêîãî îíè äîëæíû áûòü òèïà. Ñêîðåå âñåãî âû áóäåòå èñïîëüçîâàòü òèï int èëè, âîçìîæíî, float äëÿ îïðåäåëåíèÿ ÷èñåë è òèï char äëÿ ñèìâîëîâ. Îïèñûâàéòå ýòè äàííûå â ñàìîì íà÷àëå òåëà ôóíêöèè, â êîòîðîé îíè èñïîëüçóþòñÿ. Èìåíà ïåðåìåííûõ âûáèðàéòå òàêèì îáðàçîì, ÷òîáû îíè óêàçûâàëè íà èõ ñìûñë. Ïðè èíèöèàëèçàöèè ïåðåìåííîé ñëåäèòå çà òåì, ÷òîáû òèï êîíñòàíòû ñîîòâåòñòâîâàë òèïó ïåðåìåííîé.
Int apples = 3; /* ÏÐÀÂÈËÜÍÎ */
Int oranges = 3.0; /* ÍÅÏÐÀÂÈËÜÍÎ */
ßçûê Ñè "ðàññìàòðèâàåò" òàêèå íåñîîòâåòñòâèÿ ìåíåå æåñòêî, ÷åì, ñêàæåì, Ïàñêàëü, íî â ëþáîì ñëó÷àå ëó÷øå ó÷èòüñÿ èçáåãàòü äóðíûõ ïðèâû÷åê.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
 äàííîé ãëàâå ìû ðàññìîòðåëè äîâîëüíî áîëüøîé ìàòåðèàë. Ñóììèðóÿ åãî, ìû îáðàòèì îñíîâíîå âíèìàíèå íà ïðàêòè÷åñêóþ ñòîðîíó òåõ âîïðîñîâ, êîòîðûå çäåñü îáñóäèëè. Òàê æå êàê è â ïðåäûäóùåé ãëàâå, ìû äàäèì êðàòêèå ïðèìåðû. Íèæå ïðèâîäèòñÿ ñâîäêà òåõ ôàêòîâ, êîòîðûå âû äîëæíû áûëè óçíàòü èç ýòîé ãëàâû.
×òî òàêîå îñíîâíûå òèïû äàííûõ ÿçûêà Ñè: int, short, long, unsigned, char, float, double.
Êàê îïèñàòü ïåðåìåííóþ ëþáîãî òèïà: int beancount, float root-beer; è ò. ä.
Êàê çàâèñàòü êîíñòàíòó òèïà int: 256, 023, OXF5 è ò. ä.
Êàê çàïèñàòü êîíñòàíòó òèïà char: 'r', 'U', '\007', '?' è ò. ä.
Êàê çàïèñàòü êîíñòàíòó òèïà float: 14,92, 1.67å-27 è ò. ä.
×òî òàêîå ñëîâà áàéòû è áèòû.
 êàêèõ ñëó÷àÿõ èñïîëüçóþòñÿ ðàçëè÷íûå òèïû äàííûõ.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Ðàññìîòðåíèå ïðèâîäèìûõ íèæå âîïðîñîâ äîëæíî ïîìî÷ü âàì ãëóáæå ÓÑÂÎÈÒÜ ìàòåðèàë äàííîé ãëàâû.
Âîïðîñû.
1. Êàêèìè òèïàìè âû áóäåòå ïîëüçîâàòüñÿ ïðè îáðàáîòêå äàííûõ ñëåäóþùåãî âèäà.
à. Íàñåëåíèå Ðèî Ôðèòî.
á. Ñðåäíèé âåñ êàðòèíû Ðåìáðàíäòà.
â. Íàèáîëåå ÷àñòî âñòðå÷àþùàÿñÿ áóêâà â òåêñòå äàííîé ãëàâû.
ã. Ñêîëüêî ðàç óêàçàííàÿ áóêâà âñòðå÷àåòñÿ â òåêñòå.
2. Îïðåäåëèòå òèï è ñìûñë (åñëè îí åñòü) êàæäîé èç ñëåäóþùèõ êîíñòàíò.
à. '\b'.
á. 1066.
â. 99 44.
ã. OXAA.
ä. 20å30.
3. Âèðäæèëà Àíí Êñåíîïîä (ÂÀÊÑ) íàïèñàëà ïðîãðàììó ñ ìíîæåñòâîì îøèáîê Ïîìîãèòå åé îáíàðóæèòü èõ:
#include < stdio h>
Main.
(
float g, h,
float tax, rate,
g = e21, tax = rate*g,
)
Îòâåòû.
1. a. int, âîçìîæíî short, íàñåëåíèå âûðàæàåòñÿ öåëûì ÷èñëîì.
á. float, ìàëîâåðîÿòíî, ÷òî ñðåäíåå îêàæåòñÿ öåëûì ÷èñëîì.
â. char.
ã. int, âîçìîæíî unsigned.
2. a. char, ñèìâîë "øàã íàçàä".
á. int, èñòîðè÷åñêàÿ äàòà.
â. float, ñòåïåíü ÷èñòîòû ïîñëå ìûòüÿ.
ã. Øåñòíàäöàòåðè÷íîå ÷èñëî òèïà int, äåñÿòè÷íîå çíà÷åíèå 170.
ä. float, ìàññà Ñîëíöà â êã.
3. Ñòðîêà 1: ïðàâèëüíàÿ.
Ñòðîêà 2: äîëæíà ñîäåðæàòü ïàðó êðóãëûõ ñêîáîê âñëåä çà èìåíåì main, ò. å. main( ).
Ñòðîêà 3: íóæíî èñïîëüçîâàòü {, à íå (
Ñòðîêà 4: g è h äîëæíû ðàçäåëÿòüñÿ çàïÿòîé, à íå òî÷êîé ñ çàïÿòîé.
Ñòðîêà 5: ïðàâèëüíàÿ.
Ñòðîêà 6: (ïóñòàÿ) ïðàâèëüíàÿ.
Ñòðîêà 7: ïåðåä å äîëæíà ñòîÿòü ïî êðàéíåé ìåðå îäíà öèôðà: íàïðèìåð, 1å21 èëè 1 0å21.
Ñòðîêà 8: ïðàâèëüíàÿ.
Ñòðîêà 9: íóæíî èñïîëüçîâàòü }, à íå )
Íåäîñòàþùèå ñòðîêè:
ïåðâàÿ - ïåðåìåííîé rate íèãäå íå ïðèñâàèâàåòñÿ çíà÷åèèå.
âòîðàÿ - ïåðåìåííàÿ h íèãäå íå èñïîëüçóåòñÿ.
4. Ñèìâîëüíûå ñòðîêè äèðåêòèâà #define, ôóíêöèè printf( ) è scanf( )
 ýòîé ãëàâå ìû ïðîäîëæèì íàøó "èãðó" ñ äàííûìè ïîêîïàåìñÿ â âîïðîñàõ, âûõîäÿùèõ çà ïðåäåëû òåõ, êîòîðûå áûëè ñâÿçàíû ñ òèïàìè äàííûõ, è ðàññìîòðèì ñèìâîëüíóþ ñòðîêó Ñíà÷àëà îïè øåì âàæíîå ñðåäñòâî ÿçûêà - ïðåïðîöåññîð Ñè - è óçíàåì, êàê çàäàâàòü è èñïîëüçîâàòü ñèìâîëè÷åñêèå êîíñòàíòû. Çàòåì âíîâü îá ñóäèì ñïîñîáû ââîäà è âûâîäà äàííûõ, ïðè ýòîì áîëåå ïîëíî èñ ñëåäóåì âîçìîæíîñòè ôóíêöèé printf( ) è scanf( ). Íó, à òåïåðü âû âåðîÿòíî, îæèäàåòå ïðèìåðà ïðîãðàììû, êîòîðûé äîëæåí áûòü ïîìåùåí â íà÷àëå ãëàâû; ìû íå áóäåì âàñ ðàçî÷àðîâûâàòü è ïðèâåäåì åãî:
/* íåïðèíóæäåííûé ðàçãîâîð */
# define DENSITY 62 4 /* ïëîòíîñòü òåëà ÷åëîâåêà â ôóíòàõ íà êóáè÷åñêèé ôóò */
Main( ) /* ëþáîïûòñòâóþùàÿ ïðîãðàììà*/
{
float weight, volume;
int size, letters;
char name [40]; /* èëè ïîïðîáóéòå "static char name [40], */
printf(" Ïðèâåò! Êàê âàñ çîâóò?\n" );
scanf(" %s" , name);
printf("%s, Êàêîâ âàø âåñ â ôóíòàõ?\n", name);
scani("%f", &weight);
size = sizeof name;
letters = strlen (name);
volume = weight/DENSITY;
printf(" Ïðåêðàñíî, %s, âàø îáúåì %2 2f êóáè÷åñêèõ ôóòà.\n", name, volume);
printf(" Êðîìå òîãî, âàøå èìÿ ñîñòîèò èç %d áóêâ,\n", letters);
printf(" è äëÿ åãî ðàçìåùåíèÿ â ïàìÿòè ó íàñ åñòü %d áàéò.\n", size);
}
Ðåçóëüòàò ðàáîòû ïðîãðàììû "íåïðèíóæäåííûé ðàçãîâîð" ìîæåò, íàïðèìåð, âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Ïðèâåò ! Êàê âàñ çîâóò?
Àíæåëèêà.
Àíæåëèêà Êàêîâ âàø âåñ â ôóíòàõ?
102,5.
Ïðåêðàñíî, ÀÍÆÅËÈÊÀ âàø îáúåì 1,64 êóáè÷åñêèõ ôóòà.
Êðîìå òîãî, âàøå èìÿ ñîñòîèò èç 8 áóêâ.
È äëÿ åãî ðàçìåùåíèÿ â ïàìÿòè ó íàñ åñòü 40 áàéò.
Ïåðå÷èñëèì îñíîâíûå íîâûå ÷åðòû ýòîé ïðîãðàììû:
1. Ìû èñïîëüçîâàëè "ìàññèâ" äëÿ õðàíåíèÿ "ñèìâîëüíîé ñòðîêè" - â äàííîì ñëó÷àå äëÿ íåêîòîðîãî èìåíè.
2. Ïðè ââîäå è âûâîäå ñòðîêè áûëà èñïîëüçîâàíà "ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ" %s.
3. Äëÿ îïðåäåëåíèÿ ñèìâîëè÷åñêîé êîíñòàíòû DENSITY áûë èñïîëüçîâàí ïðåïðîöåññîð ÿçûêà Ñè.
4. Äëÿ íàõîæäåíèÿ äëèíû ñòðîêè áûëà èñïîëüçîâàíà ôóíêöèÿ strlen( ).
ÑÈÌÂÎËÜÍÛÅ ÑÒÐÎÊÈ - ÂÂÅÄÅÍÈÅ
"Ñèìâîëüíàÿ ñòðîêà" - ýòî ïîñëåäîâàòåëüíîñòü, ñîñòîÿùàÿ èç îäíîãî èëè áîëåå ñèìâîëîâ  êà÷åñòâå ïðèìåðà ðàññìîòðèì ñëåäóþùóþ ñòðîêó:
"Ñòðîêè èçëèâàëèñü ïðÿìî èç ñåðäöà!".
Êàâû÷êè íå ÿâëÿþòñÿ ÷àñòüþ ñòðîêè. Îíè ââîäÿòñÿ òîëüêî äëÿ òîãî, ÷òîáû îòìåòèòü åå íà÷àëî è êîíåö, ò.å. èãðàþò òó æå ðîëü, ÷òî è àïîñòðîôû â ñëó÷àå îäèíî÷íîãî ñèìâîëà.
 ÿçûêå Ñè íåò ñïåöèàëüíîãî òèïà, êîòîðûé ìîæíî áûëî áû èñïîëüçîâàòü äëÿ îïèñàíèÿ ñòðîê Âìåñòî ýòîãî ñòðîêè ïðåäñòàâëÿ þòñÿ â âèäå "ìàññèâà" ýëåìåíòîâ òèïà char. Ýòî îçíà÷àåò, ÷òî ñèìâîëû â ñòðîêå ìîæíî ïðåäñòàâèòü ñåáå ðàñïîëîæåííûìè â ñî ñåäíèõ ÿ÷åéêàõ ïàìÿòè - ïî îäíîìó ñèìâîëó â ÿ÷åéêå (ðèñ. 41).
ÐÈÑ. 4. 1. Ñòðîêà êàê ìàññèâ ÿ÷ååê.
Íåîáõîäèìî îòìåòèòü, ÷òî íà ðèñóíêå ïîñëåäíèì ýëåìåíòîì ìàññèâà ÿâëÿåòñÿ ñèìâîë \0. Ýòî "íóëü-ñèìâîë", è â ÿçûêå Ñè îí èñïîëüçóåòñÿ äëÿ òîãî, ÷òîáû îòìå÷àòü êîíåö ñòðîêè Íóëü-ñèìâîë - íå öèôðà 0; îí íå âûâîäèòñÿ íà ïå÷àòü è â òàáëèöå êîäà ASCII èìååò íîìåð 0. Íàëè÷èå íóëü-ñèìâîëà îçíà÷àåò, ÷òî êîëè÷åñòâî ÿ÷ååê ìàññèâà äîëæíî áûòü ïî êðàéíåé ìåðå íà îäíó áîëüøå, ÷åì ÷èñëî ñèìâîëîâ, êîòîðûå íåîáõîäèìî ðàçìåùàòü â ïàìÿòè.
Íó, à òåïåðü ñïðîñèì, ÷òî òàêîå ìàññèâ? Ìàññèâ ìîæíî ïðåä ñòàâèòü ñåáå êàê ñîâîêóïíîñòü íåñêîëüêèõ ÿ÷ååê ïàìÿòè, îáúåäèíåí íûõ â îäíó ñòðîêó Åñëè âû ïðåäïî÷èòàåòå áîëåå ôîðìàëüíûå è ñòðîãèå îïðåäåëåíèÿ, òî ìàññèâ - ýòî óïîðÿäî÷åííàÿ ïîñëåäîâà òåëüíîñòü ýëåìåíòîâ äàííûõ îäíîãî òèïà  íàøåì ïðèìåðå ìû ñîçäàëè ìàññèâ èç 40 ÿ÷ååê ïàìÿòè, â êàæäóþ èç êîòîðûõ ìîæíî ïî ìåñòèòü îäèí ýëåìåíò òèïà char. Ìû îñóùåñòâèëè ýòî ñ ïîìîùüþ îïåðàòîðà îïèñàíèÿ.
Char name [40];
Êâàäðàòíûå ñêîáêè óêàçûâàþò, ÷òî ïåðåìåííàÿ name - ìàññèâ, 40 - ÷èñëî åãî ýëåìåíòîâ, a char çàäàåò òèï êàæäîãî ýëåìåíòà. ( êîììåíòàðèÿõ ê ïðîãðàììå áûëî îòìå÷åíî, ÷òî ïðè æåëàíèè âû ìîæåòå âîñïîëüçîâàòüñÿ áîëåå ñëîæíûì îïåðàòîðîì îïèñàíèÿ):
Static char name [40],
Ââèäó íåêîòîðîé ñïåöèôèêè, ñâÿçàííîé ñ ðåàëèçàöèåé ôóíêöèè scanf( ) â íàøåé ñèñòåìå, ìû âûíóæäåíû èñïîëüçîâàòü ýòó âòîðóþ.

ÐÈÑ.4.2. Îïèñàíèå èìåíè ìàññèâà òèïà char.
ôîðìó, íî âåñüìà âåðîÿòíî, ÷òî âû ñìîæåòå âûáðàòü ëþáóþ èç íèõ. Åñëè îáíàðóæèòñÿ, ÷òî ïðè ðàáîòå ñ ïåðâîé ôîðìîé îïåðàòîðà îïèñàíèÿ ó âàñ âîçíèêíóò òðóäíîñòè ïðè ðåøåíèè íàøèõ ïðèìåðîâ, ïîïðîáóéòå âîñïîëüçîâàòüñÿ âòîðîé. Â äåéñòâèòåëüíîñòè âòîðàÿ ôîðìà äîëæíà ðàáîòàòü â ëþáîé ñèñòåìå, íî ìû íå õîòèì ïðèìåíèòü òèï static äî òåõ ïîð, ïîêà íå ðàññìîòðèì â ãë. 10 ïîíÿòèå êëàññîâ ïàìÿòè).
Íà ïåðâûé âçãëÿä âñå ýòî âûãëÿäèò äîâîëüíî ñëîæíûì: âû äîëæíû ñîçäàòü ìàññèâ, ðàñïîëîæèòü ñèìâîëû â âèäå ñòðîêè è íå çàáûòü äîáàâèòü â êîíöå \0. Ê ñ÷àñòüþ, î áîëüøèíñòâå äåòàëåé êîìïèëÿòîð ìîæåò "ïîçàáîòèòüñÿ" ñàì.
Ïîïðîáóéòå âûïîëíèòü ïðèâåäåííóþ íèæå ïðîãðàììó, ÷òîáû ïîñìîòðåòü, êàê ïðîñòî âñå ïðîèñõîäèò íà ïðàêòèêå:
/* ïîõâàëà 1*/
#define PRAISE " Âîò ýòà äà, êàêîå âåëèêîëåïíîå èìÿ".
Main( ).
{
Char name [50];
Printf(" Êàê âàñ çîâóò? \n" );
Scanf(" %s", name);
Printf(" Ïðèâåò, %s %s\n" , name, PRAISE);
}
Ñèìâîë %s ñëóæèò óêàçàíèåì ôóíêöèè printf( ) íàïå÷àòàòü ñòðîêó. Ðåçóëüòàò âûïîëíåíèÿ ïðîãðàììû ïîõâàëà 1 ìîæåò âûãëÿäåòü, íàïðèìåð, òàê:
Êàê âàñ çîâóò ?
Ýëìî Áëàíê Ïðèâåò, Ýëìî, Âîò ýòà äà, êàêîå âåëèêîëåïíîå èìÿ !
Êàê âèäèòå, íàì íå ïðèøëîñü ñàìèì ïîìåùàòü íóëü ñèìâîë â êîíåö ìàññèâà. Ýòà çàäà÷à áûëà âûïîëíåíà çà íàñ ôóíêöèåé scanf( ) ïðè ÷òåíèè ââîäèìîé ñòðîêè. PRAISE - "ñèìâîëè÷åñêàÿ ñòðîêîâàÿ êîíñòàíòà". Íèæå ìû ðàññìîòðèì äèðåêòèâó #define áîëåå ïîäðîáíî, à ïîêà âû äîëæíû çíàòü, ÷òî êàâû÷êè, â êîòîðûå çàêëþ÷åíà ôðàçà, ñëåäóþùàÿ çà ñòðîêîâîé êîíñòàíòîé PRAISE, èäåíòèôèöèðóþò ýòó ôðàçó êàê ñòðîêó, è ïîýòîìó â åå êîíåö áóäåò ïîìåùåí íóëü-ñèìâîë.
Çàìåòèì (è ýòî î÷åíü âàæíî), ÷òî ôóíêöèÿ scanf( ) ïðè ââîäå ñòðîêè "Ýëìî Áëàíê" ÷èòàåò òîëüêî èìÿ Ýëìî. Äåëî â òîì, ÷òî, âñòðåòèâ êàêîé-íèáóäü ðàçäåëèòåëü (ïðîáåë, ñèìâîë òàáóëÿöèè èëè ïåðåâîäà ñòðîêè), ôóíêöèÿ scanf( ) ïðåêðàùàåò ââîä ñèìâîëîâ, ò. å. â äàííîì ñëó÷àå îíà ïðåêðàùàåò îïðîñ ïåðåìåííîé name â òîò ìîìåíò, êîãäà äîõîäèò äî ïðîáåëà ìåæäó "Ýëìî" è "Áëàíê". Âîîáùå ãîâîðÿ, ôóíêöèÿ scanf( ) ââîäèò òîëüêî îäèíî÷íûå ñëîâà, à íå öåëóþ ôðàçó â êà÷åñòâå ñòðîêè. Äëÿ ÷òåíèÿ âõîäíîé èíôîðìàöèè â ÿçûêå Ñè èìåþòñÿ äðóãèå ôóíêöèè, íàïðèìåð ôóíêöèÿ gets( ), ïðåäíàçíà÷åííàÿ äëÿ îáðàáîòêè ñòðîê îáùåãî âèäà. Áîëåå ïîëíî ðàáîòó ñî ñòðîêàìè ìû ðàññìîòðèì â ïîñëåäóþùèõ ãëàâàõ.
Íåîáõîäèìî çàìåòèòü òàêæå, ÷òî ñòðîêà "õ" íå òî æå ñàìîå, ÷òî ñèìâîë 'x'. Ïåðâîå ðàçëè÷èå: 'õ' - îáúåêò îäíîãî èç îñíîâíûõ òèïîâ (Char), â òî âðåìÿ êàê "õ" - îáúåêò ïðîèçâîäíîãî òèïà (ìàññèâà ýëåìåíòîâ òèïà char). Âòîðîå ðàçëè÷èå: "õ" íà ñàìîì äå ëå ñîñòîèò èç äâóõ ñèìâîëîâ - ñèìâîëà 'x' è íóëü-ñèìâîëà.
ÐÈÑ.4.3. Ñèìâîë 'õ' è ñòðîêà "õ".
Äëèíà ñòðîêè - ôóíêöèÿ strlen( )
 ïðåäûäóùåé ãëàâå ìû ïðàêòè÷åñêè áåç îáúÿñíåíèé èñïîëüçîâàëè îïåðàöèþ sizeof, êîòîðàÿ äàåò íàì ðàçìåð îáúåêòîâ â áàéòàõ Ôóíêöèÿ strlen( ) ïîçâîëÿåò îïðåäåëÿòü äëèíó ñòðîêè ÷èñëîì ñèìâîëîâ. Ïîñêîëüêó äëÿ ðàçìåùåíèÿ îäíîãî ñèìâîëà â ïàìÿòè îòâîäèòñÿ 1 áàéò, ìîæíî áûëî áû ïðåäïîëîæèòü, ÷òî â ðåçóëüòàòå ïðèìåíåíèÿ ëþáîé èç ýòèõ äâóõ îïåðàöèé ê îäíîé ñòðîêå áóäåò ïîëó÷åí îäèíàêîâûé ðåçóëüòàò. Îêàçûâàåòñÿ, ýòî íå òàê. Äàâàéòå íåìíîãî èçìåíèì íàøó ïðåäûäóùóþ ïðîãðàììó (äîáàâèì ê íåé íåñêîëüêî ñòðîê), è òîãäà ìû ïîéìåì, â ÷åì äåëî.
/*ïîõâàëà 2*/
#define PRAISE " Âîò ýòî äà, êàêîå âåëèêîëåïíîå èìÿ!".
Main( ).
{
Char name [50];
Printf(" Êàê âàñ çîâóò?\n");
Scanf(" %s", name);
Printf(" Ïðèâåò, %s. %s\n" , name, PRAISE);
Printf(" Âàøå èìÿ ñîñòîèò èç %d áóêâ è çàíèìàåò %d ÿ÷ååê ïàìÿòè. \n",
Strlen (name), sizeof name);
Printf(" Õâàëåáíàÿ ôðàçà ñîñòîèò èç %d áóêâ", strlen (PRAISE));
Printf(" è çàíèìàåò %d ÿ÷ååê ïàìÿòè. \n", sizeof PRAISE);
}
Çàìåòèì, ÷òî ñëó÷àéíî ìû âîñïîëüçîâàëèñü äâóìÿ ìåòîäàìè äëÿ îáðàáîòêè äëèííûõ îïåðàòîðîâ printf().  ïåðâîì ñëó÷àå ìû, çàïèñàâ îäèí îïåðàòîð ïå÷àòè â äâóõ ñòðîêàõ ïðîãðàììû. Ìû ñäåëàëè ýòî, ïîñêîëüêó ðàçðåøàåòñÿ ðàçáèâàòü ñòðîêó ìåæäó àðãóìåíòàìè, íî íå ïîñåðåäèíå ñòðîêè.  äðóãîì ñëó÷àå èñïîëüçîâàëèñü äâà îïåðàòîðà printf() äëÿ ïå÷àòè îäíîé ñòðîêè; ìû óêàçàëè ñèìâîë "íîâàÿ ñòðîêà" (\n) òîëüêî âî âòîðîì èç íèõ. Ïðåäñòàâëåííûé íèæå ðåçóëüòàò ðàáîòû äàííîé ïðîãðàììû ïîìîæåò ïîíÿòü ïîäîáíóþ ñèòóàöèþ:
Êàê âàñ çîâóò ?
Ïåðêè.
Ïðèâåò, Ïåðêè. Âîò ýòî äà, êàêîå âåëèêîëåïíîå èìÿ!
Âàøå èìÿ ñîñòîèò èç 5 áóêâ è çàíèìàåò 50 ÿ÷ååê ïàìÿòè.
Õâàëåáíàÿ ôðàçà ñîñòîèò èç 35 áóêâ è çàíèìàåò 36 ÿ÷ååê ïàìÿòè.
Äàâàéòå ïîñìîòðèì, â ÷åì äåëî. Ìàññèâ name çàíèìàåò 50 ÿ÷ååê ïàìÿòè, è èìåííî îá ýòîì ñîîáùàåò îïåðàöèÿ sizeof. Íî äëÿ õðàíåíèÿ èìåíè Ïåðêè òðåáóþòñÿ òîëüêî ïåðâûå ïÿòü ÿ÷ååê, è êàê ðàç îá ýòîì íàñ èíôîðìèðóåò ôóíêöèÿ strlen( ).  øåñòîé ÿ÷åéêå ìàññèâà name ñîäåðæèòñÿ íóëü-ñèìâîë, è åãî ïîÿâëåíèå ñëóæèò ñèãíàëîì äëÿ ôóíêöèè strlen( ) ïðåêðàòèòü ïîäñ÷åò ñèìâîëîâ.

ÐÈÑ.4.4. Ðàñïîçíàâàíèå ôóíêöèåé strlen( ) êîíöà ñòðîêè.
Ïðè ïåðåõîäå ê îáðàáîòêå êîíñòàíòû PRAISE îáíàðóæèâàåòñÿ, ÷òî ôóíêöèÿ strlen( ) îïÿòü äàåò íàì òî÷íîå ÷èñëî ñèìâîëîâ (âêëþ÷àÿ ïðîáåëû è çíàêè ïóíêòóàöèè) â ñòðîêå. Ðåçóëüòàò îïåðàöèè sizeof îêàçûâàåòñÿ íà åäèíèöó áîëüøèì, ïîñêîëüêó ïðè ýòîì ó÷èòûâàåòñÿ è "íåâèäèìûé" íóëü-ñèìâîë, ïîìåùåííûé â êîíåö ñòðîêè. Ìû íå óêàçûâàåì êîìïèëÿòîðó, êàêîé îáúåì ïàìÿòè îí äîëæåí îòâåñòè äëÿ ðàçìåùåíèÿ âñåé ôðàçû, îí ñàì ïîäñ÷èòûâàåò ÷èñëî ñèìâîëîâ ìåæäó êàâû÷êàìè.
Åùå îäíî çàìå÷àíèå â ïðåäûäóùåé ãëàâå áûëà èñïîëüçîâàíà îïåðàöèÿ sizeof ñî ñêîáêàìè, à â ýòîé - áåç íèõ. Ðåøåíèå, èñïîëüçîâàòü ëè ñêîáêè èëè íåò, çàâèñèò îò òîãî, ÷òî âû õîòèòå çíàòü îáúåì ïàìÿòè, îòâîäèìûé ïîä ýëåìåíòû êîíêðåòíîãî òèïà, èëè îáúåì ïàìÿòè, çàíèìàåìûé îïðåäåëåííûì îáúåêòîì  ïåðâîì ñëó÷àå âû ïèñàëè áû sizeof(char) èëè sizeof(float), à âî âòîðîì - sizeof name èëè sizeof 6.28.
ÊÎÍÑÒÀÍÒÛ È ÏÐÅÏÐÎÖÅÑÑÎÐ ßÇÛÊÀ Ñè.
Èíîãäà âîçíèêàåò íåîáõîäèìîñòü èñïîëüçîâàòü â ïðîãðàììàõ êîíñòàíòû. Íàïðèìåð, îïåðàòîð, ïîçâîëÿþùèé îïðåäåëÿòü äëèíó îêðóæíîñòè, ìîæíî áûëî áû çàïèñàòü â ñëåäóþùåì âèäå:
Circ = 3.14 * diameter;
Ïðèâåäåííàÿ çäåñü êîíñòàíòà 3. 14 - èçâåñòíîå ÷èñëî Ïè. ×òîáû ââåñòè òó èëè èíóþ êîíñòàíòó â ïðîãðàììó, íóæíî óêàçàòü åå ôàêòè÷åñêîå çíà÷åíèå, êàê áûëî ñäåëàíî âûøå. Îäíàêî ñóùåñòâóþò âåñêèå ïðè÷èíû èñïîëüçîâàòü âìåñòî ýòîãî "ñèìâîëè÷åñêèå êîíñòàíòû", íàïðèìåð, ìû ìîãëè áû ïðèìåíÿòü îïåðàòîð.
Circ = pi * diameter;
à ïîçæå êîìïèëÿòîð ïîäñòàâèë áû â íåãî ôàêòè÷åñêîå çíà÷åíèå êîíñòàíòû.
 ÷åì äîñòîèíñòâà òàêîãî ìåòîäà?
Âî-ïåðâûõ, èìÿ ãîâîðèò íàì áîëüøå, ÷åì ÷èñëî. Ñðàâíèì äâà îïåðàòîðà.
Owed = 0 015 * housevl, owed = taxrate * housevl;
Åñëè ìû èçó÷àåì áîëüøóþ ïðîãðàììó, òî âòîðîé âàðèàíò áóäåò íàì áîëåå ïîíÿòåí.
Âî-âòîðûõ, ïðåäïîëîæèì, ÷òî íåêîòîðàÿ êîíñòàíòà èñïîëüçîâàëàñü â íåñêîëüêèõ ìåñòàõ ïðîãðàììû è âïîñëåäñòâèè âîçíèêëà íåîáõîäèìîñòü èçìåíèòü åå çíà÷åíèå - âåäü â êîíöå êîíöîâ è íàëîãîâûå òàðèôû (taxrate) ìåíÿþòñÿ, è, ê ïðèìåðó, íåêîå çàêîíîäàòåëüíîå ñîáðàíèå ïðèíÿëî îäíàæäû çàêîí âïðåäü ñ÷èòàòü ÷èñëî p ðàâíûì 31/7. (Âåñüìà âåðîÿòíî, ÷òî îêðóæíîñòè ïðèøëîñü ïðè ýòîì ñêðûâàòüñÿ îò ïðàâîñóäèÿ).  òàêîì ñëó÷àå òðåáóåòñÿ òîëüêî èçìåíèòü îïðåäåëåíèå ñèìâîëè÷åñêîé êîíñòàíòû, à íå îòûñêèâàòü êàæäûé ñëó÷àé åå ïîÿâëåíèÿ â ïðîãðàììå.
Òåïåðü îñòàëîñü âûÿñíèòü, êàê ìîæíî ñîçäàòü òàêóþ ñèìâîëè÷åñêóþ êîíñòàíòó? Ïåðâûé ñïîñîá çàêëþ÷àåòñÿ â òîì, ÷òîáû îïèñàòü íåêîòîðóþ ïåðåìåííóþ è ïîëîæèòü åå ðàâíîé òðåáóåìîé êîíñòàíòå. Ìû ìîãëè áû ñäåëàòü ýòî ñëåäóþùèì îáðàçîì.
Float taxrate, taxrate = 0 015;
Òàêîé ñïîñîá ïîäõîäèò äëÿ íåáîëüøîé ïðîãðàììû, â äðóãèõ æå ñëó÷àÿõ îí íåñêîëüêî íåýêîíîìè÷åí, ïîñêîëüêó êàæäûé ðàç ïðè èñïîëüçîâàíèè ïåðåìåííîé taxrate êîìïüþòåð äîëæåí áóäåò îáðàùàòüñÿ ê òîé ÿ÷åéêå ïàìÿòè, êîòîðàÿ îòâåäåíà äàííîé ïåðåìåííîé. Ýòî ñëóæèò ïðèìåðîì ïîäñòàíîâêè "âî âðåìÿ âûïîëíåíèÿ", òàê êàê îíà ïðîèçâîäèòñÿ èìåííî ïðè âûïîëíåíèè ïðîãðàììû. Ê ñ÷àñòúþ, â ÿçûêå Ñè èìååòñÿ è äðóãîé, ëó÷øèé ñïîñîá.
Ýòîò ñïîñîá ðåàëèçóåòñÿ ñ ïîìîùüþ ïðåïðîöåññîðà ÿçûêà Ñè.  ãë. 2 ìû óæå âèäåëè, êàê ïðåïðîöåññîð èñïîëüçóåò äèðåêòèâó #include äëÿ âêëþ÷åíèÿ èíôîðìàöèè èç äðóãîãî ôàéëà â ïðîãðàììó. Êðîìå òîãî, ïðåïðîöåññîð äàåò íàì âîçìîæíîñòü çàäàâàòü êîíñòàíòû. Äëÿ ýòîãî â íà÷àëî ôàéëà, ñîäåðæàùåãî âàøó ïðîãðàììó, íåîáõîäèìî äîáàâèòü òîëüêî îäíó ñòðîêó, àíàëîãè÷íóþ ñëåäóþùåé:
#define TAXRATE 0.015.
Ïðè êîìïèëÿöèè ïðîãðàììû êàæäûé ðàç, êîãäà ïîÿâèòñÿ ïåðåìåííàÿ TAXRATE, îíà áóäåò çàìåíÿòüñÿ âåëè÷èíîé 0.015. Ýòî íàçûâàåòñÿ ïîäñòàíîâêîé "âî âðåìÿ êîìïèëÿöèè". Ê òîìó ìîìåíòó, êîãäà âû íà÷íåòå âûïîëíåíèå ñâîåé ïðîãðàììû, âñå ïîäñòàíîâêè áóäóò óæå ñäåëàíû.
Íåñêîëüêî çàìå÷àíèé ïî ïîâîäó ôîðìàòà.
Ñíà÷àëà èäåò êëþ÷åâîå ñëîâî #define. Îíî äîëæíî íà÷èíàòüñÿ ñ ñàìîé ëåâîé ïîçèöèè. Ïîòîì ñëåäóåò ñèìâîëè÷åñêîå èìÿ êîíñòàíòû, à çàòåì åå âåëè÷èíà. Ñèìâîë "òî÷êà ñ çàïÿòîé" íå èñïîëüçóåòñÿ, ïîñêîëüêó ýòî íå îïåðàòîð ÿçûêà Ñè. Ïî÷åìó èìÿ TAXRATE ïèøåòñÿ ïðîïèñíûìè áóêâà ìè?  ïðîöåññå èñïîëüçîâàíèÿ ÿçûêà Ñè âûðàáîòàëàñü òðàäèöèÿ ïèñàòü êîíñòàíòû ïðîïèñíûìè áóêâàìè. Åñëè ïðè ïðîñìîòðå ïðîãðàììû âàì âñòðåòèòñÿ èìÿ, íàïèñàííîå ïðîïèñíûìè áóêâàìè, âû ñðàçó ïîéìåòå, ÷òî èìååòå äåëî ñ êîíñòàíòîé, à íå ñ ïåðåìåííîé. Ýòî åùå îäèí ñïîñîá óëó÷øèòü ÷èòàåìîñòü ïðîãðàììû. Âàøà ïðîãðàììà áóäåò ðàáîòàòü äàæå è òîãäà, êîãäà âû áóäåòå ïèñàòü êîíñòàíòû ñòðî÷íûìè áóêâàìè, íî ïðè ýòîì âû äîëæíû ÷óâñòâîâàòü ñâîþ âèíó, ïîñêîëüêó íàðóøàåòå òðàäèöèþ.
Ïðèâåäåì ïðîñòîé ïðèìåð:
/* ïèööà */
#define PI 3,14159.
Main( ) /* èçó÷åíèå âàøåé ïèööû */
{
Float area, circum, radius;
Printf("×åìó ðàâåí ðàäèóñ âàøåé ïèööû? \n");
Scanf("%f", &radius);
Area = PI * radius * radius;
Printf(" Îñíîâíûå ïàðàìåòðû âàøåé ïèööû ñëåäóþùèå \n");
Printf(" äëèíà îêðóæíîñòè = %1.2f, ïëîùàäü =%1.2f \n circum, area);
}

ÐÈÑ.4.5. Îáðàáîòêà òåêñòà ïðîãðàììû ïðåïðîöåññîðîì.
Èñïîëüçîâàíèå ñïåöèôèêàöèè %1.2f â îïåðàòîðå printf( ) ïðèâåäåò ê òîìó, ÷òî ïðè ïå÷àòè ðåçóëüòàòû áóäóò îêðóãëåíû äî äâóõ äåñÿòè÷íûõ öèôð. Ìû ïîíèìàåì, êîíå÷íî, ÷òî íàïèñàííàÿ âûøå ïðîãðàììà ìîæåò è íå îòðàæàòü âàøè ñîáñòâåííûå âêóñû, êàñàþùèåñÿ ïèööû, íî âî ìíîæåñòâå ïðîãðàìì, ïîñâÿùåííûõ ýòîìó âîïðîñó, îíà çàéìåò ñâîå ñêðîìíîå ìåñòî. Âîò îäèí èç ïðèìåðîâ åå âûïîëíåíèÿ:
×åìó ðàâåí ðàäèóñ âàøåé ïèööû? 6.0.
Îñíîâíûå ïàðàìåòðû âàøåé ïèööû ñëåäóþùèå: äëèíà îêðóæíîñòè = 37.70,
Ïëîùàäü îêðóæíîñòè = 113.40.
Äèðåêòèâó #define ìîæíî òàêæå èñïîëüçîâàòü äëÿ îïðåäåëåíèÿ ñèìâîëüíûõ è ñòðîêîâûõ êîíñòàíò. Íåîáõîäèìî èñïîëüçîâàòü çíàê "àïîñòðîô" â ïåðâîì ñëó÷àå è êàâû÷êè - âî âòîðîì. Ïðèìåðû, ïðèâåäåííûå íèæå, âïîëíå ïðàâîìåðíû.
#define ÂÅÅÐ '\007'.
#define ESS 'S'.
#deline NULL '\0'.
#define OOPS "Íó âîò, âû è ñäåëàëè ýòî!".
À òåïåðü ìû õîòèì îáðàäîâàòü ëåíòÿåâ. Ïðåäïîëîæèì, âû ðàçðàáàòûâàåòå öåëûé ïàêåò ïðîãðàìì, èñïîëüçóþùèõ îäèí è òîò æå íàáîð êîíñòàíò. Âû ìîæåòå ïðîèçâåñòè ñëåäóþùèå äåéñòâèÿ:
1. Ñîáåðèòå âñå âàøè äèðåêòèâû #define â îäèí ôàéë è íàçîâèòå åãî, íàïðèìåð, const.h.
2.  íà÷àëî êàæäîãî ôàéëà, ñîäåðæàùåãî ïðîãðàììó, âêëþ÷èòå äèðåêòèâó #include "const.h."
Òîãäà, åñëè âû áóäåòå âûïîëíÿòü ïðîãðàììó, ïðåïðîöåññîð ïðî÷òåò ôàéë ñ èìåíåì const.h è èñïîëüçóåò âñå äèðåêòèâû #define âàøåé ïðîãðàììû. Ïîëó÷èëîñü òàê, ÷òî ñèìâîë .h â êîíöå èìåíè ôàéëà íàïîìíèò âàì, ÷òî ýòîò ôàéë ÿâëÿåòñÿ "çàãîëîâêîì", ò.å. â íåì ñîäåðæèòñÿ âñÿ èíôîðìàöèÿ, êîòîðàÿ äîëæíà ïîïàñòü â íà÷àëî âàøåé ïðîãðàììû. Ñàìîìó ïðåïðîöåññîðó áåçðàçëè÷íî, èñïîëüçóåòå ëè âû ñèìâîë .h â èìåíè ôàéëà èëè íåò.
ßçûê Ñè - èñêóñíûé ôîêóñíèê: ñîçäàíèå ïñåâäîèìåí.
Âîçìîæíîñòè äèðåêòèâû #define íå èñ÷åðïûâàþòñÿ òîëüêî ñèìâîëè÷åñêèì ïðåäñòàâëåíèåì êîíñòàíò. Ðàññìîòðèì, íàïðèìåð, ñëåäóþùóþ ïðîãðàììó:
#include "alias. h".
Program begin.
Whole yours, mine then.
Spitout(" Ââåäèòå, ïîæàëóéñòà, öåëîå ÷èñëî.\n" ).
Then takem(" %d", & yours).
Then mine = yours times TWO then.
Spitout(" %d â äâà ðàçà áîëüøå âàøåãî ÷èñëà! \n" , mine) then end.
Ñòðàííî, òåêñò ÷òî-òî ñìóòíî íàïîìèíàåò, ÿçûê íåìíîãî ïîõîæ íà Ïàñêàëü, íî ïðîãðàììà íå ïîõîæà íà Ñè-ïðîãðàììó. Ñåêðåò ëåæèò, êîíå÷íî, â ôàéëå ñ èìåíåì alias.h. Äàâàéòå ïîñìîòðèì, ÷òî â íåì ñîäåðæèòñÿ?
Alias. h #define program main( ).
#define degin { #define enf } #define then;
#define takein scanf.
#define spilout printf.
#define TWO 2.
#define times *
#define whole int.
Ýòîò ïðèìåð èëëþñòðèðóåò, êàê ðàáîòàåò ïðåïðîöåññîð. Îí ïðîñìàòðèâàåò âàøó ïðîãðàììó è ïðîâîäèò ïîèñê ýëåìåíòîâ, îïðåäåëÿåìûõ äèðåêòèâàìè #define. Îáíàðóæèâ òàêèå ýëåìåíòû, îí ïîëíîñòüþ çàìåíÿåò èõ.  íàøåì ïðèìåðå âî âðåìÿ êîìïèëÿöèè âñå ñëîâà then çàìåíÿþòñÿ ñèìâîëàìè "òî÷êà ñ çàïÿòîé", end - } è ò.ä. Ðåçóëüòèðóþùàÿ ïðîãðàììà áóäåò ïîëíîñòüþ èäåíòè÷íà òîé, êîòîðóþ ìû ìîãëè áû ïîëó÷èòü, åñëè áû ñ ñàìîãî íà÷àëà ïèñàëè åå â îáû÷íûõ òåðìèíàõ ÿçûêà Ñè.
Ýòó ìîùíóþ âîçìîæíîñòü ÿçûêà ìîæíî èñïîëüçîâàòü äëÿ çàäàíèÿ ìàêðîêîìàíä, ÿâëÿþùèõñÿ îäíèì èç âñïîìîãàòåëüíûõ ñðåäñòâ ïðîãðàììèðîâàíèÿ. Ìû âåðíåìñÿ ê îáñóæäåíèþ ýòîé òåìû â ãë. 11.
Òåïåðü íåîáõîäèìî óïîìÿíóòü î íåêîòîðûõ îãðàíè÷åíèÿõ. Íàïðèìåð, ÷àñòè ïðîãðàììû, çàêëþ÷åííûå â êàâû÷êè, çàêðûòû äëÿ ïîäñòàíîâîê. Îïåðàòîðû, ïðèâîäèìûå íèæå, ñëóæàò èëëþñòðàöèåé òàêîãî ïîëîæåíèÿ:
#define MN "ìèíèìèôèäèàíèçì".
Printf(" Îí ãëóáîêî âåðèë â MN.\n");
Ðàñïå÷àòêà áóäåò âûãëÿäåòü òàê:
Îí ãëóáîêî âåðèë â MN.
Îäíàêî ïîñëå âûïîëíåíèÿ îïåðàòîðà.
Printf(" Îí ãëóáîêî âåðèë â %s.\n" , MN);
Ìû ïîëó÷èì ñëåäóþùèé ðåçóëüòàò:
Îí ãëóáîêî âåðèë â ìèíèìèôèäèàíèçì.
 ïîñëåäíåì ñëó÷àå êîíñòàíòà ñ èìåíåì MN íàõîäèëàñü âíå êàâû÷åê è ïîýòîìó áûëà çàìåíåíà ñîîòâåòñòâóþùèì çíà÷åíèåì.
ÈÇÓ×ÅÍÈÅ È ÈÑÏÎËÜÇÎÂÀÍÈÅ ÔÓÍÊÖÈÉ printf( ) È scanf( ).
Ôóíêöèè printf( ) è scanf( ) äàþò íàì âîçìîæíîñòü âçàèìîäåéñòâîâàòü ñ ïðîãðàììîé. Ìû íàçûâàåì èõ ôóíêöèÿìè ââîäà-âûâîäà. Ýòî íå åäèíñòâåííûå ôóíêöèè, êîòîðûìè ìû ìîæåì âîñïîëüçîâàòüñÿ äëÿ ââîäà è âûâîäà äàííûõ ñ ïîìîùüþ ïðîãðàìì íà ÿçûêå Ñè, íî îíè íàèáîëåå óíèâåðñàëüíû. Óêàçàííûå ôóíêöèè íå âõîäÿò â îïèñàíèå ÿçûêà Ñè. È äåéñòâèòåëüíî, ïðè ðàáîòå ñ ÿçû êîì Ñè ðåàëèçàöèÿ ôóíêöèé ââîäà-âûâîäà âîçëàãàåòñÿ íà ñîçäàòåëåé êîìïèëÿòîðà; ýòî äàåò âîçìîæíîñòü áîëåå ýôôåêòèâíî îðãàíèçîâàòü ââîä âûâîä íà êîíêðåòíûõ ìàøèíàõ. Îäíàêî â èíòåðåñàõ îáåñïå÷åíèÿ ñîâìåñòèìîñòè ðàçëè÷íûå ñèñòåìû èìåþò äåëî ñ íåêîòîðûìè âàðèàíòàìè ôóíêöèé scanf( ) è printf( ). Âñå, î ÷åì ìû çäåñü ãîâîðèì, äîëæíî áûòü â îñíîâíîì ñïðàâåäëèâî äëÿ áîëüøèíñòâà ñèñòåì, íî íå óäèâëÿéòåñü, åñëè îáíàðóæèòå íåêîòîðûå îòëè÷èÿ â èìåþùåéñÿ ó âàñ âåðñèè.
Îáû÷íî ôóíêöèè printf() è scanf() "ðàáîòàþò" âî ìíîãîì îäèíàêîâî - êàæäàÿ èñïîëüçóåò "óïðàâëÿþùóþ ñòðîêó" è ñïèñîê "àðãóìåíòîâ". Ñíà÷àëà ìû ðàññìîòðèì ðàáîòó ôóíêöèè printf(), çàòåì scanf( ).
Èíñòðóêöèè, ïåðåäàâàåìûå ôóíêöèè printf( ), êîãäà ìû "ïðîñèì" åå íàïå÷àòàòü íåêîòîðóþ ïåðåìåííóþ, çàâèñÿò îò òîãî, êàêîãî òèïà ýòà ïåðåìåííàÿ. Íàïðèìåð, ïðè âûâîäå íà ïå÷àòü öåëîãî ÷èñëà ïðèìåíÿåòñÿ ôîðìàò %d, à ïðè âûâîäå ñèìâîëà - %ñ. Íèæå ïåðå÷èñëåíû âñå ôîðìàòû, óêàçûâàåìûå ïðè îáðàùåíèÿõ ê ôóíêöèè printf(), à çàòåì ïîêàçàíî, êàê îíè èñïîëüçóþòñÿ. Êàæäîìó ôîðìà òó ñîîòâåòñòâóåò òèï âûâîäèìîé (ñ èõ ïîìîùüþ) èíôîðìàöèè, ïðè÷åì ïåðâûå ïÿòü ïîêðûâàþò áîëüøèíñòâî âîçíèêàþùèõ ïîòðåáíîñòåé, à îñòàëüíûå ÷åòûðå ïðèìåíÿþòñÿ äîñòàòî÷íî ðåäêî.
| Ôîðìàò | Òèï âûâîäèìîé èíôîðìàöèè |
|---|---|
| %d | Äåñÿòè÷íîå öåëîå ÷èñëî |
| %ñ | Îäèí ñèìâîë |
| %s | Ñòðîêà ñèìâîëîâ |
| %å | ×èñëî ñ ïëàâàþùåé òî÷êîé, ýêñïîíåíöèàëüíàÿ çàïèñü |
| %f | ×èñëî ñ ïëàâàþùåé òî÷êîé, äåñÿòè÷íàÿ çàïèñü |
| %g | Èñïîëüçóåòñÿ âìåñòî çàïèñåé |
| %f | èëè %å, åñëè îí êîðî÷å |
| %u | Äåñÿòè÷íîå öåëîå ÷èñëî áåç çíàêà |
| %î | Âîñüìåðè÷íîå öåëîå ÷èñëî áåç çíàêà |
| %x | Øåñòíàäöàòåðè÷íîå öåëîå ÷èñëî áåç çíàêà |
Ïîñìîòðèì òåïåðü, êàê ýòè ôîðìàòû ïðèìåíÿþòñÿ.
Èñïîëüçîâàíèå ôóíêöèè printf( ).
Ïðèâåäåì ïðîãðàììó, èëëþñòðèðóþùóþ îáñóæäàåìûå âîïðîñû:
/* ïå÷àòü ÷åïóõè*/
#define PI 3.14159.
Main( ).
{
number = 5;
float ouzo =13,5;
int cost = 31000;
printf("%d æåíùèí âûïèëè %f ñòàêàíîâ ëèêåðà. \n",
number, ouzo);
printf(" Çíà÷åíèå ÷èñëà pi ðàâíî %f \n", PI);
printf(" Ïðîùàé! Òâîå èñêóññòâî ñëèøêîì äîðîãî äëÿ ìåíÿ \n");
printf(" %c%d\n", '$', cost);
}
Ðåçóëüòàò âûãëÿäèò òàê:
5 æåíùèí âûïèëè 13,50000 ñòàêàíîâ ëèêåðà.
Çíà÷åíèå ÷èñëà pi ðàâíî 3,14159.
Ïðîùàé! Òâîå èñêóññòâî ñëèøêîì äîðîãî äëÿ ìåíÿ.
$31000.
Ôîðìàò, óêàçûâàåìûé ïðè îáðàùåíèè ê ôóíêöèè printf( ), âûãëÿäèò ñëåäóþùèì îáðàçîì:
Ðrintf(Óïðàâëÿþùàÿ ñòðîêà, àðãóìåíò1, àðãóìåíò2, ...,);
Àðãóìåíò1, Àðãóìåíò2 è ò. ä. - ýòî ïå÷àòàåìûå ïàðàìåòðû êîòîðûå ìîãóò áûòü ïåðåìåííûìè, êîíñòàíòàìè èëè äàæå âûðàæåíèÿìè, âû÷èñëÿåìûìè âíà÷àëå, ïåðåä âûâîäîì íà ïå÷àòü.
Óïðàâëÿþùàÿ ñòðîêà - ñòðîêà ñèìâîëîâ, ïîêàçûâàþùàÿ, êàê äîëæíû áûòü íàïå÷àòàíû ïàðàìåòðû. Íàïðèìåð, â îïåðàòîðå:
Printf(" %d æåíùèí âûïèëè %f ñòàêàíîâ ëèêåðà. \n" , number, ouzo);
Óïðàâëÿþùåé ñòðîêîé ñëóæèò ôðàçà â êàâû÷êàõ (ó÷èòûâàÿ ïðåäûäóùèå çàìå÷àíèÿ, ýòî - ñòðîêà ñèìâîëîâ), a number è ouzo - àðãóìåíòû èëè â äàííîì ñëó÷àå çíà÷åíèÿ äâóõ ïåðåìåííûõ.

ÐÈÑ. 4.6. Àðãóìåíòû ôóíêöèè printf( ).
Ïðèâåäåì åùå ïðèìåð:
Printf(" Çíà÷åíèå ÷èñëà pi ðàâíî %f.\n", PI);
Íà ýòîò ðàç ñïèñîê àðãóìåíòîâ ñîäåðæèò òîëüêî îäèí ýëåìåíò - ñèìâîëè÷åñêóþ êîíñòàíòó PI.
Ìû âèäèì, ÷òî â óïðàâëÿþùåé ñòðîêå ñîäåðæèòñÿ èíôîðìàöèÿ äâóõ ðàçëè÷íûõ âèäîâ:
1. Ñèìâîëû, ïå÷àòàåìûå òåêñòóàëüíî.
2. Èäåíòèôèêàòîðû äàííûõ, íàçûâàåìûå òàêæå "ñïåöèôèêàöèÿìè ïðåîáðàçîâàíèÿ".
ÐÈÑ. 4.7. Ñòðóêòóðà óïðàâëÿþùåé ñòðîêè.
Êàæäîìó àðãóìåíòó èç ñïèñêà, ñëåäóþùåãî çà óïðàâëÿþùåé ñòðîêîé, äîëæíà ñîîòâåòñòâîâàòü îäíà ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ. Ãîðå âàì, åñëè âû çàáóäåòå ýòî îñíîâíîå òðåáîâàíèå. Íèêîãäà íå ïèøèòå, íàïðèìåð, òàê:
Printf("Êîëè÷åñòâî ñëèçíÿêîâ %d, ÷åðâÿêîâ %d.\n", scorel);
3äåñü îòñóòñòâóåò àðãóìåíò äëÿ âòîðîé ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ %d. Ñïîñîá ïðîÿâëåíèÿ ýòîé îøèáêè öåëèêîì çàâèñèò îò âàøåé âû÷èñëèòåëüíîé ñèñòåìû, íî â ëó÷øåì ñëó÷àå âû ïîëó÷èòå áåññìûñëèöó.
Åñëè âàì íóæíî íàïå÷àòàòü êàêóþ-íèáóäü ôðàçó, òî íåò íåîáõîäèìîñòè èñïîëüçîâàòü ñïåöèôèêàöèþ ïðåîáðàçîâàíèÿ; åñëè æå òðåáóåòñÿ òîëüêî âûâåñòè äàííûå íà ïå÷àòü, òî ìîæíî îáîéòèñü è áåç èñïîëüçîâàíèÿ êîììåíòàðèÿ. Ïîýòîìó êàæäûé èç îïåðàòîðîâ, ïðèâåäåííûõ íèæå, âïîëíå ïðèåìëåì.
Printf("Ïðîùàé! Òâîå èñêóññòâî ñëèøêîì äîðîãî äëÿ ìåíÿ.\n");
Printf(" %c%d\n" , '$', cost);
Çàìåòèì, ÷òî âî âòîðîì ïðèìåðå ïåðâûé àðãóìåíò èç ïå÷àòàåìîãî ñïèñêà ÿâëÿåòñÿ ñèìâîëüíîé êîíñòàíòîé, à íå ïåðåìåííîé.
Ïîñêîëüêó ñèìâîë % èñïîëüçóåòñÿ â ôóíêöèè printf( ) äëÿ èäåíòèôèöèðîâàíèÿ ñïåöèôèêàöèé ïðåîáðàçîâàíèÿ, âîçíèêàåò íåáîëüøàÿ ïðîáëåìà â òîì ñëó÷àå, åñëè âàì íóæíî íàïå÷àòàòü ñàì ñèìâîë %, Åñëè ïðîñòî íàïèñàòü îäèí çíàê %, òî êîìïèëÿòîð ïðèìåò åãî çà îøèáî÷íóþ ñïåöèôèêàöèþ ïðåîáðàçîâàíèÿ. Âûõîäîì èç ñîçäàâøåéñÿ ñèòóàöèè ñëóæèò äîâîëüíî ïðîñòîå ðåøåíèå - ïèñàòü äâà ñèìâîëà % ïîäðÿä:
Ðñ = 2*6;
Printf("Òîëüêî %d%% ñòðÿïíè Ñàëëè áûëî ñúåäîáíî.\n", ðñ);
Ðåçóëüòàò ðàáîòû ïðîãðàììû áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Òîëüêî 12% ñòðÿïíè Ñàëëè áûëî ñúåäîáíî.
Ìîäèôèêàòîðû ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ, èñïîëüçóåìûå â ôóíêöèè printf( ).
Ìû ìîæåì íåñêîëüêî ðàñøèðèòü îñíîâíîå îïðåäåëåíèå ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ, ïîìåñòèâ ìîäèôèêàòîðû ìåæäó çíàêîì % è ñèìâîëîì, îïðåäåëÿþùèì òèï ïðåîáðàçîâàíèÿ.  ïðèâîäèìîé íèæå òàáëèöå äàí ñïèñîê òåõ ñèìâîëîâ, êîòîðûå âû èìååòå ïðàâî òóäà ïîìåñòèòü. Ïðè èñïîëüçîâàíèè îäíîâðåìåííî íåñêîëüêèõ ìîäèôèêàòîðîâ îíè äîëæíû áûòü óêàçàíû â òîì ïîðÿäêå, â êîòîðîì ïåðå ÷èñëåíû â òàáëèöå. Çàìåòèì, ÷òî ïðè ýòîì äîïóñêàþòñÿ íå âñå êîìáèíàöèè.
| Ìîäèôèêàòîð | Çíà÷åíèå |
|---|---|
| - | Àðãóìåíò áóäåò ïå÷àòàòüñÿ ñ ëåâîé ïîçèöèè ïîëÿ çàäàííîé øèðèíû (êàê îáúÿñíåíî íèæå). Îáû÷íî ïå÷àòü àðãóìåíòà îêàí÷èâàåòñÿ â ñàìîé ïðàâîé ïîçèöèè ïîëÿ. Ïðèìåð: %-10d |
| ñòðîêà öèôð | Çàäàåò ìèíèìàëüíóþ øèðèíó ïîëÿ. Áîëüøåå ïîëå áóäåò èñïîëüçîâàòüñÿ, åñëè ïå÷àòàåìîå ÷èñëî èëè ñòðîêà íå ïîìåùàþòñÿ â èñõîäíîì ïîëå. Ïðèìåð: %4d |
| ñòðîêà öèôð | Îïðåäåëÿåò òî÷íîñòü: äëÿ òèïîâ äàííûõ ñ ïëàâàþùåé òî÷êîé - ÷èñëî ïå÷àòàåìûõ öèôð ñïðàâà îò äåñÿòè÷íîé òî÷êè; äëÿ ñèìâîëüíûõ ñòðîê - ìàêñèìàëüíîå ÷èñëî ïå÷àòàåìûõ ñèìâîëîâ Ïðèìåð: %4.2f (äâå äåñÿòè÷íûå öèôðû äëÿ ïîëÿ øèðèíîé â ÷åòûðå ñèìâîëà) |
| | | Ñîîòâåòñòâóþùèé ýëåìåíò äàííûõ èìååò òèï long, à íå int. Ïðèìåð: %|d |
Ïðèìåðû.
Ïîñìîòðèì, êàê ýòè ìîäèôèêàòîðû ðàáîòàþò. Íà÷íåì ñ òîãî, ÷òî ïðîäåìîíñòðèðóåì âëèÿíèå ìîäèôèêàòîðà øèðèíû ïîëÿ íà ïå÷àòü öåëîãî ÷èñëà. Ðàññìîòðèì ñëåäóþùóþ ïðîãðàììó:
Main( ).
{
printf("/%d/\n", 336);
printf("/%2d/\n", 336);
printf("/%10d/\n", 336);
printf("/%-10d/\n", 366);
}
Ýòà ïðîãðàììà ïå÷àòàåò îäíî è òî æå çíà÷åíèå ÷åòûðå ðàçà, íî èñïîëüçóþòñÿ ïðè ýòîì ÷åòûðå ðàçëè÷íûå ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ. Ìû ââîäèì òàêæå ñèìâîëû /, ÷òîáû âû ìîãëè âèäåòü, ãäå íà÷èíàåòñÿ è êîí÷àåòñÿ êàæäîå ïîëå. Ðåçóëüòàò âûïîëíåíèÿ ïðîãðàììû âûãëÿäèò ñëåäóþùèì îáðàçîì:
/336/ /336/
/ 336 /336 /
Ïåðâàÿ ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ %d íå ñîäåðæèò ìîäèôèêàòîðîâ. Ìû âèäèì, ÷òî ïîëå ïå÷àòè çäåñü èìååò øèðèíó, ðàâíóþ êîëè÷åñòâó öèôð äàííîãî öåëîãî ÷èñëà. Ýòî òàê íàçûâàåìûé âûáîð "ïî óìîë÷àíèþ", ò. å. ðåçóëüòàò äåéñòâèÿ êîìïèëÿòîðà â ñëó÷àå, åñëè âû íå äàëè åìó íèêàêèõ äîïîëíèòåëüíûõ èíñòðóêöèé. Âòîðàÿ ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ - %2d. Îíà óêàçûâàåò, ÷òî øèðèíà ïîëÿ äîëæíà ðàâíÿòüñÿ 2, íî, ïîñêîëüêó ÷èñëî ñîñòîèò èç òðåõ öèôð, äîëå àâòîìàòè÷åñêè ðàñøèðÿåòñÿ äî íåîáõîäèìîãî ðàçìåðà. Ñëåäóþùàÿ ñïåöèôèêàöèÿ %10d ïîêàçûâàåò, ÷òî øèðèíà ïîëÿ ðàâíà 10. È äåéñòâèòåëüíî, ìåæäó ñèìâîëàìè / èìååòñÿ ñåìü ïðîáåëîâ è òðè öèôðû, ïðè÷åì ÷èñëî ñäâèíóòî ê ïðàâîìó êðàþ ïîëÿ. Ïîñëåäíÿÿ ñïåöèôèêàöèÿ %-10d òàêæå óêàçûâàåò øèðèíó ïîëÿ, ðàâíóþ 10, à çíàê - ïðèâîäèò ê ñäâèãó âñåãî ÷èñëà ê ëåâîìó êðàþ, êàê ïîêàçàíî â ïðèâåäåííîì âûøå ïðèìåðå. Êîãäà âû ïðèâûêíåòå ê ýòîé ñèñòåìå îáîçíà÷åíèé, îíà ïîêàæåòñÿ âàì ïðîñòîé è âû ñóìååòå ïî âàøåìó óñìîòðåíèþ ìåíÿòü âèä âûõîäíîé èíôîðìàöèè.
Ðàññìîòðèì òåïåðü íåêîòîðûå ôîðìàòû, ñîîòâåòñòâóþùèå äàííûì ñ ïëàâàþùåé òî÷êîé. Äîïóñòèì, ó íàñ èìååòñÿ ñëåäóþùàÿ ïðîãðàììà:
Main( ).
{
printf(" /%f/\n" , 1234.56);
printf(" /%e/\n" , 1234.56);
printf(" /%4.2f/\n" , 1234.56);
printf(" /%3.1f/\n", 1234.56);
printf(" /%10.3f/\n" , 1234.56);
printf(" /%10.3e/\n" , 1234.56);
}
Íà ýòîò ðàç ðåçóëüòàò ðàáîòû ïðîãðàììû áóäåò âûãëÿäåòü òàê.
/1234.560059/
/1.234560E+03/
/1234.56/
/1234.6/
/ 1234.560/
/ 1.234E+03/
Ìû ñíîâà íà÷èíàåì ñ âàðèàíòà, âûáðàííîãî ïî óìîë÷àíèþ, ò. å. ñî ñïåöèôèêàöèè %f.  ýòîì ñëó÷àå èìååòñÿ äâå âåëè÷èíû, çíà÷åíå êîòîðûõ èñïîëüçóþòñÿ ïî óìîë÷àíèþ: øèðèíà ïîëÿ è ÷èñëî öèôð ñïðàâà îò äåñÿòè÷íîé òî÷êè. Âòîðàÿ âåëè÷èíà çàäàåò øåñòü öèôð, øèðèíà ïîëÿ áåðåòñÿ òàêîé, ÷òîáû â íåì ìîãëî ïîìåñòèòüñÿ ÷èñëî. Çàìåòèì, ÷òî ïå÷àòàåìîå ÷èñëî íåñêîëüêî îòëè÷àåòñÿ îò èñõîäíîãî. Ýòî ïðîèñõîäèò ïîòîìó, ÷òî íà ïå÷àòü âûâîäèòñÿ 10 öèôð, â òî âðåìÿ êàê ÷èñëà ñ ïëàâàþùåé òî÷êîé â íàøåé ñèñòåìå èçîáðàæàþòñÿ ïðèáëèçèòåëüíî ñ òî÷íîñòüþ äî 6 èëè 7 öèôð.
Ðàññìîòðèì âàðèàíò ïî óìîë÷àíèþ äëÿ ñïåöèôèêàöèè %å. Êàê ìû âèäèì, ïðè åå èñïîëüçîâàíèè ïå÷àòàåòñÿ îäíà öèôðà ñëåâà îò äåñÿòè÷íîé òî÷êè è øåñòü ñïðàâà.  ðåçóëüòàòå ïîëó÷àåòñÿ ñëèøêîì ìíîãî öèôð! ×òîáû èçáåæàòü ýòîãî, íåîáõîäèìî çàäàòü ÷èñëî öèôð ñïðàâà îò äåñÿòè÷íîé òî÷êè, è ïîñëåäíèå ÷åòûðå îïåðà òîðà ïðîãðàììû ðåàëèçóþò êàê ðàç óêàçàííóþ âîçìîæíîñòü. Îáðàòèòå âíèìàíèå íà òî, êàê ÷åòâåðòûé è øåñòîé îïåðàòîðû ïðîèçâîäÿò îêðóãëåíèå âûâîäèìûõ äàííûõ.
Òåïåðü èññëåäóåì íåêîòîðûå âàðèàíòû ñòðîê. Ðàññìîòðèì ïðèìåð:
#define BLURB "Âûäàþùååñÿ èñïîëíåíèå".
Main( ).
{
Printf(" /%2s/\n" , BLURB);
Printf(" /'%25.s/\n" , BLURB);
Printf(" /'%25.5s/\n" , BLURB);
Printf(" /% - 25.5s/\n" , BLURB);
}
Âîò ðåçóëüòàò ðàáîòû ïðîãðàììû:
/Âûäàþùååñÿ èñïîëíåíèå!/
/ Âûäàþùååñÿ èñïîëíåíèå!/
/ Âûäàþ/ /Âûäàþ /
Îáðàòèòå âíèìàíèå íà òî, êàê ïîëå ðàñøèðÿåòñÿ äëÿ òîãî, ÷òîáû ïîìåñòèëèñü âñå óêàçàííûå ñèìâîëû. Çàìåòèì òàêæå, êàê ñïåöèôèêàöèÿ òî÷íîñòè îãðàíè÷èâàåò ÷èñëî ñèìâîëîâ, âûâîäèìûõ íà ÏÅ×ÀÒÜ. Ñèìâîëû .5 â ñïåöèôèêàöèè ôîðìàòà óêàçûâàþò ôóíêöèè printf( ) íà íåîáõîäèìîñòü íàïå÷àòàòü òîëüêî ïÿòü ñèìâîëîâ.
Òåïåðü âû îçíàêîìèëèñü ñ íåêîòîðûì êîëè÷åñòâîì ïðèìåðîâ. À çíàåòå ëè âû, êàê ïîäãîòîâèòü îïåðàòîð ïå÷àòè, ÷òîáû íàïå÷àòàâ íå÷òî âðîäå ñëåäóþùåé ôðàçû:
Ñåìüÿ NAME, âîçìîæíî, ëèøü íà XXX.XX äîëëàðîâ áîãà÷å!
Çäåñü NAME è ÕÕÕ.ÕÕ ïðåäñòàâëÿþò çíà÷åíèÿ ñîîòâåòñòâóþùèõ ïåðåìåííûõ â ïðîãðàììå, ñêàæåì name[40] è cash. Âîò îäíî èç ðåøåíèé:
Printf(" Ñåìüÿ %s, âîçìîæíî, ëèøü íà %.2f äîëëàðîâ.
Áîãà÷å! \n", name, cash);
Äî ñèõ ïîð ìû áåç òåíè ñîìíåíèÿ ïðèìåíÿëè ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ äëÿ ïåðåìåííûõ ðàçíûõ òèïîâ, íàïðèìåð, %f äëÿ òèïà float è ò. ä. Íî, êàê ìû óæå âèäåëè â íàøåé ïðîãðàììå ïîèñêà êîäà ASCII, äëÿ íåêîòîðîãî ñèìâîëà ôóíêöèþ printf() ìîæíî èñïîëüçîâàòü òàêæå äëÿ ïðåîáðàçîâàíèÿ äàííûõ èç îäíîãî òèïà â äðóãîé. Ìû íå íàìåðåíû, îäíàêî, òåðÿòü ÷óâñòâî ðåàëüíîñòè è ïî ïðåæíåìó áóäåì ðàáîòàòü ñ öåëûìè òèïàìè.
Èñïîëüçîâàíèå ôóíêöèè printf( ) äëÿ ïðåîáðàçîâàíèÿ äàííûõ.
Çäåñü ìû ñíîâà çàéìåìñÿ âûâîäîì íà ïå÷àòü öåëûõ ÷èñåë. Ïîñêîëüêó ìû óæå îñâåäîìëåíû î ïîëÿõ, òî íå áóäåì çàáîòèòüñÿ îá èñïîëüçîâàíèè ñèìâîëà /, ÷òîáû îòìå÷àòü èõ íà÷àëî è êîíåö.
Main( ).
{
Printf(" %d\n", 336);
Printf(" %o\n", 336);
Printf(" %x\n", 336);
Printf(" %d\n", -336);
Printf(" %u\n", -336);
}
 íàøåé ñèñòåìå ðåçóëüòàò áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì.
336.
520.
150.
-336.
-65200.
Êàê âû, ïî-âèäèìîìó, è îæèäàëè, ïðè èñïîëüçîâàíèè ñïåöèôèêàöèè %d áóäåò ïîëó÷åíî ÷èñëî 336 òî÷íî òàê æå, êàê â ïðèìåðå, îáñóæäàâøåìñÿ ÷óòü âûøå. Íî äàâàéòå ïîñìîòðèì, ÷òî ïðîèçîéäåò, êîãäà âû "ïîïðîñèòå" ïðîãðàììó íàïå÷àòàòü ýòî äåñÿòè÷íîå öåëîå ÷èñëî â âîñüìåðè÷íîì êîäå. Îíà íàïå÷àòàåò ÷èñëî 520, ÿâëÿþùååñÿ âîñüìåðè÷íûì ýêâèâàëåíòîì 336 (5õ64+2õ8+0õ 1= 336). Àíàëîãè÷íî ïðè ïå÷àòè ýòîãî ÷èñëà â øåñòíàäöàòåðè÷íîì êîäå ìû ïîëó÷èì 150.
Òàêèì îáðàçîì, ìû ìîæåì èñïîëüçîâàòü ñïåöèôèêàöèè, ïðèìåíÿåìûå äëÿ ôóíêöèè printf( ) ñ öåëüþ ïðåîáðàçîâàíèÿ äåñÿòè÷íûõ ÷èñåë â âîñüìåðè÷íûå èëè øåñòíàäöàòåðè÷íûå è íàîáîðîò. Èëè æå åñëè âû çàõîòèòå íàïå÷àòàòü äàííûå â æåëàåìîì äëÿ âàñ âèäå, òî íåîáõîäèìî óêàçàòü ñïåöèôèêàöèþ %d äëÿ ïîëó÷åíèÿ äåñÿòè÷íûõ ÷èñåë, %î - äëÿ âîñüìåðè÷íûõ, à %õ- äëÿ øåñòíàäöàòåðè÷íûõ. Ïðè ýòîì íå èìååò íè ìàëåéøåãî çíà÷åíèÿ, â êàêîé ôîðìå ÷èñëî ïåðâîíà÷àëüíî ïîÿâèëîñü â ïðîãðàììå.
Ñäåëàåì åùå íåñêîëüêî çàìå÷àíèé îòíîñèòåëüíî âûâîäà íà ïå÷àòü. Ïå÷àòü ÷èñëà -336 ïðè èñïîëüçîâàíèè ñïåöèôèêàöèè %d íå âûçûâàåò íèêàêîãî çàòðóäíåíèÿ. Ïðè ïðèìåíåíèè æå ñïåöèôèêàöèè %u (unsigned - áåççíàêîâàÿ) ïîëó÷àåì ÷èñëî 65200, à íå 336, êàê ìîæíî áûëî áû îæèäàòü. Ïðè÷èíà ïîëó÷åíèÿ òàêîãî ðåçóëüòàòà ëåæèò â ñïîñîáå ïðåäñòàâëåíèÿ îòðèöàòåëüíûõ ÷èñåë â íàøåé ñèñòåìå. Çäåñü èñïîëüçóåòñÿ òàê íàçûâàåìûé "äîïîëíèòåëüíûé êîä". ×èñëà îò 0 äî 32767 îòîáðàæàþòñÿ îáû÷íûì îáðàçîì, à îò 32768 äî 65535 ïðåäñòàâëÿþò îòðèöàòåëüíûå ÷èñëà, ïðè÷åì 65535 êîäèðóåò ÷èñëî -1, 65534 - ÷èñëî -2 è ò. ä. Ïîýòîìó ÷èñëó -336 ñîîòâåòñòâóåò 65536, -336 = 65200. Ýòîò ìåòîä ïðèìåíÿåòñÿ íå âî âñåõ ñèñòåìàõ. Òåì íå ìåíåå îòñþäà ñëåäóåò âûâîä: íå îæèäàéòå, ÷òî ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ %u ïðèâîäèò ïðîñòî ê îòáðàñûâàíèþ çíàêà ÷èñëà.
Ñåé÷àñ ìû ïåðåõîäèì ê îáñóæäåíèþ èíòåðåñíîãî ïðèìåðà, êîòîðîãî ìû óæå êàñàëèñü ðàíåå, à èìåííî ê èñïîëüçîâàíèþ ôóíêöèè printf() äëÿ íàõîæäåíèÿ êîäà ASCII íåêîòîðîãî ñèìâîëà. Íàïðèìåð îïåðàòîð.
Printf(" %c%d\n" , ' À', ' À');
Âûäàñò ñëåäóþùèé ðåçóëüòàò:
A 65.
À - ýòî áóêâà, à 65 - äåñÿòè÷íûé êîä ASCII ñèìâîëà À. Ìû ìîãëè áû èñïîëüçîâàòü ñïåöèôèêàöèþ %î, åñëè áû õîòåëè ïîëó÷èòü âîñüìåðè÷íûé êîä ASCII ñèìâîëà À.
Âñå âûøåñêàçàííîå äàåò õîðîøèé ñïîñîá íàõîæäåíèÿ êîäîâ ASCII äëÿ ðàçëè÷íûõ ñèìâîëîâ è íàîáîðîò. Âïîëíå âîçìîæíî, êîíå÷íî, ÷òî âû ïðåäïî÷òåòå åìó ïîèñê êîäîâ â ïðèëîæåíèè Æ. ×òî ïðîèçîéäåò, åñëè âû ïîïðîáóåòå ïðåîáðàçîâàòü ÷èñëî, áîëüøå 255, â ñèìâîë? Ñëåäóþùàÿ ñòðîêà è ðåçóëüòàò åå âûïîëíåíèÿ äàäóò îòâåò íà ýòîò âîïðîñ:
Printf(" %d %c\n" , 336, 336);
336 P.
Äåñÿòè÷íûé êîä ASCII ñèìâîëà Ð ðàâåí 80, à 336 - ýòî 256 + 80. Äàííîå ÷èñëî, î÷åâèäíî, èíòåðïðåòèðóåòñÿ ïî ìîäóëþ 256. (Ýòî ìàòåìàòè÷åñêèé òåðìèí, îáîçíà÷àþùèé îñòàòîê îò äåëåíèÿ ÷èñëà íà 256.) Äðóãèìè ñëîâàìè, âñÿêèé ðàç ïðè ïîëó÷åíèè ÷èñ ëà, êðàòíîãî 256, îòñ÷åò íà÷èíàåòñÿ ñíà÷àëà, è 256 ðàññìàòðèâàåòñÿ êàê 0, 257 - êàê 1, 511 - êàê 255, 512 - êàê 0, 513 - êàê 1 è ò. ä.
È, íàêîíåö, ïîïûòàåìñÿ íàïå÷àòàòü ÷èñëî (65616), ïðåâûøàþùåå ìàêñèìàëüíîå çíà÷åíèå, êîòîðîå ìîãóò ïðèíèìàòü äàííûå òèïà int â íàøåé ñèñòåìå (32767):
Printf(" %1d %d\n" , 65616, 65616);
Ðåçóëüòàò áóäåò âûãëÿäåòü òàê:
65616 80.
Ìû ñíîâà âèäèì, ÷òî äåéñòâèÿ âûïîëíÿþòñÿ ïî "ìîäóëþ" Íà ýòîò ðàç ñ÷åò âåäåòñÿ ãðóïïàìè ïî 65536. ×èñëà ìåæäó 32767 è 65536 áóäóò âûâîäèòüñÿ íà ïå÷àòü êàê îòðèöàòåëüíûå èç-çà ñïîñîáà èõ ïðåäñòàâëåíèÿ â ïàìÿòè ìàøèíû. Ñèñòåìû ñ ðàçíûìè ðàçìåðà ìè ÿ÷ååê ïàìÿòè, îòâîäèìûõ ïîä äàííûå öåëîãî òèïà, âåäóò ñåáÿ â îáùåì îäèíàêîâî, íî ïðè ýòîì äàþò ðàçíûå ÷èñëîâûå çíà÷åíèÿ.
Ìû íå èñ÷åðïàëè âñåõ âîçìîæíûõ êîìáèíàöèé äàííûõ è ñïåöèôèêàöèé ïðåîáðàçîâàíèÿ, ïîýòîìó âû ìîæåòå ïûòàòüñÿ ýêñïåðèìåíòèðîâàòü ñàìè. Íî áóäåò ëó÷øå, êîíå÷íî, åñëè âû ñìîæåòå çà ðàíåå ïðåäñêàçàòü ðåçóëüòàò, êîòîðûé áóäåò ïîëó÷åí ïðè ïå÷àòè äàííûõ, êîãäà èñïîëüçóåòñÿ êàêàÿ-íèáóäü ñïåöèôèêàöèÿ ïðåîáðàçîâàíèÿ, âûáðàííàÿ âàìè.
Ïðèìåíåíèå ôóíêöèè scanf( )
Ïîñêîëüêó â äàëüíåéøåì ìû áóäåì ïîëüçîâàòüñÿ ôóíêöèÿ scanf( ) ëèøü ýïèçîäè÷åñêè, ìû ðàññìîòðèì çäåñü òîëüêî îñíîâíûå îñîáåííîñòè åå ïðèìåíåíèÿ.
Òàê æå êàê äëÿ ôóíêöèè printf( ), äëÿ ôóíêöèè scanf( ) óêàçûâàþòñÿ óïðàâëÿþùàÿ ñòðîêà è ñëåäóþùèé çà íåé ñïèñîê àðãóìåíòîâ. Îñíîâíîå ðàçëè÷èå äâóõ ýòèõ ôóíêöèé çàêëþ÷àåòñÿ â îñîáåííîñòè äàííîãî ñïèñêà. Ôóíêöèÿ printf( ) èñïîëüçóåò èìåíà ïåðåìåííûõ êîíñòàíòû è âûðàæåíèÿ, â òî âðåìÿ êàê ôóíêöèÿ scanf( ) - òîëüêî óêàçàòåëè íà ïåðåìåííûå. Ê ñ÷àñòüþ, ïðè ïðèìåíåíèè ýòîé ôóíêöèè ìû íè÷åãî íå äîëæíû çíàòü î òàêèõ óêàçàòåëÿõ. Íåîáõîäèìî ïîìíèòü òîëüêî äâà ïðàâèëà:
1. Åñëè âàì íóæíî ââåñòè íåêîòîðîå çíà÷åíèå è ïðèñâîèòü åãî ïåðåìåííîé îäíîãî èç îñíîâíûõ òèïîâ, òî ïåðåä èìåíåì nåðåìåííîé òðåáóåòñÿ ïèñàòü ñèìâîë &.
2. Åñëè âû õîòèòå ââåñòè çíà÷åíèå ñòðîêîâîé ïåðåìåííîé, èñïîëüçîâàòü ñèìâîë & íå íóæíî.
Ïðèâåäåì ïðàâèëüíóþ ïðîãðàììó:
Main( ).
{
Int age;
Float assets;
Char pet [30];
Printf(" Óêàæèòå âàø âîçðàñò, ñîñòîÿíèå è ëþáèìîå æèâîòíîå.\n" );
Scanf(" %d %f" , &age, &assets);
Scanf(" %s" , pet); /* & îòñóòñòâóåò ïðè óêàçàíèè ìàññèâà.
Ñèìâîëîâ */ printf("%d $%.0f %s\n", age, assets, pet);
}
Âîò ïðèìåð äèàëîãà:
Óêàæèòå ÂÀØ ÂÎÇÐÀÑÒ, ñîñòîÿíèå è ëþáèìîå æèâîòíîå.
82.
8345245.19 íîñîðîã.
82 $8345245 íîñîðîã.
Ôóíêöèÿ scanf( ) èñïîëüçóåò íåêîòîðûå ñïåöèàëüíûå çíàêè (ïðî áåëû, ñèìâîëû òàáóëÿöèè è "íîâàÿ ñòðîêà") äëÿ ðàçáèåíèÿ âõîäíîãî ïîòîêà ñèìâîëîâ íà îòäåëüíûå ïîëÿ. Îíà ñîãëàñóåò ïîñëåäîâàòåëüíîñòü ñïåöèôèêàöèé ïðåîáðàçîâàíèÿ ñ ïîñëåäîâàòåëüíîñòüþ ïîëåé, îïóñêàÿ óïîìÿíóòûå ñïåöèàëüíûå çíàêè ìåæäó íèìè. Îáðàòèòå âíèìàíèå, ÷òî íàøà âõîäíàÿ èíôîðìàöèÿ ðàñïîëàãàåòñÿ íà äâóõ ñòðîêàõ. Òî÷íî òàê æå ìû ìîãëè áû èñïîëüçîâàòü îäíó èëè ïÿòü ñòðîê ïðè óñëîâèè, ÷òî ââîäèìûå âåëè÷èíû ðàçäåëÿþòñÿ ïî êðàéíåé ìåðå îäíèì çíàêîì òèïà "íîâîé ñòðîêè", ïðîáåëà èëè ñèìâîëà òàáóëÿöèè. Åäèíñòâåííûì èñêëþ÷åíèåì èç ýòîãî ÿâëÿåòñÿ ñïåöèôèêàöèÿ %ñ, îáåñïå÷èâàþùàÿ ÷òåíèå êàæäîãî ñëåäóþùåãî ñèìâîëà äàæå â òîì ñëó÷àå, åñëè ýòî "ïóñòîé ñèìâîë".
Ôóíêöèÿ scanf( ) èñïîëüçóåò ïðàêòè÷åñêè òîò æå íàáîð ñèìâîëîâ ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ, ÷òî è ôóíêöèÿ printf( ). Îñíîâíûå îòëè÷èÿ â ñëó÷àå ôóíêöèè scanf( ) ñëåäóþùèå:
1. Îòñóòñòâóåò ñïåöèôèêàöèÿ %g.
2. Ñïåöèôèêàöèè %f è %å ýêâèâàëåíòíû. Îáå ñïåöèôèêàöèè äî ïóñêàþò íàëè÷èå (èëè îòñóòñòâèå) çíàêà, ñòðîêè öèôð ñ äåñÿòè÷íîé òî÷êîé èëè áåç íåå è ïîëÿ ïîêàçàòåëÿ ñòåïåíè.
3. Äëÿ ÷òåíèÿ öåëûõ ÷èñåë òèïà short ïðèìåíÿåòñÿ ñïåöèôèêàöèÿ %h.
Ôóíêöèÿ scanf( ) íå ÿâëÿåòñÿ îäíîé èç íàèáîëåå ÷àñòî èñïîëüçóåìûõ ôóíêöèé ÿçûêà Ñè. Ìû îáñóæäàåì åå çäåñü ãëàâíûì îáðàçîì èç-çà åå óíèâåðñàëüíîñòè (îíà ïîçâîëÿåò ÷èòàòü äàííûå âñåõ èìåþùèõñÿ òèïîâ); îäíàêî â Ñè èìååòñÿ åùå íåñêîëüêî äðóãèõ ôóíêöèé, îñóùåñòâëÿþùèõ ââîä, íàïðèìåð getchar( ) è gets( ), êîòîðûå áîëåå óäîáíû äëÿ âûïîëíåíèÿ êîíêðåòíûõ çàäà÷ - ÷òåíèÿ îäèíî÷íûõ ñèìâîëîâ èëè ñòðîê, ñîäåðæàùèõ ïðîáåëû. Ìû ðàññìîòðèì íåêîòîðûå èç ýòèõ ôóíêöèé â ãë. 6, 13 è 15.
ÑÎÂÅÒÛ ÏÎ ÏÐÈÌÅÍÅÍÈÞ.
Çàäàíèå ôèêñèðîâàííîé øèðèíû ïîëåé îêàçûâàåòñÿ ïîëåçíûì ïðè ïå÷àòè äàííûõ ñòîëáöàìè. Ïîñêîëüêó øèðèíîé ïîëÿ ïî óìîë÷àíèþ ÿâëÿåòñÿ "øèðèíà" ÷èñëà, ïðè ïîâòîðíîì èñïîëüçîâàíèè îïåðàòîðà.
Printf(" %d %d %d\n" , val1, val2, val3);
Áóäóò ïîëó÷åíû íåðîâíûå ñòîëáöû ÷èñåë, åñëè ýòè ÷èñëà ñîñòîÿò èç ðàçíîãî êîëè÷åñòâà öèôð. Íàïðèìåð, ðåçóëüòàò ìîã áû âûãëÿäåòü ñëåäóþùèì îáðàçîì:
12 234 1222.
4 5 23.
22334 2322 10001.
(Çäåñü ïðåäïîëàãàåòñÿ, ÷òî ìåæäó îáðàùåíèÿìè ê îïåðàòîðó ïå÷àòè çíà÷åíèÿ ïåðåìåííûõ èçìåíÿëèñü.).
Ýòè æå äàííûå ìîæíî ïðåäñòàâèòü â óëó÷øåííîì âèäå, åñëè çà äàòü äîñòàòî÷íî áîëüøóþ ôèêñèðîâàííóþ øèðèíó ïîëÿ. Ïðè èñïîëüçîâàíèè îïåðàòîðà.
Printf( %9d %9d %9d\n" , val1, val2, val3);
Ðåçóëüòàò áóäåò âûãëÿäåòü òàê:
12 234 1222.
4 5 23.
22334 2322 10001.
Íàëè÷èå ïðîáåëîâ ìåæäó ñïåöèôèêàöèÿìè ïðåîáðàçîâàíèÿ ãàðàíòèðóåò, ÷òî äàæå â òîì ñëó÷àå, åñëè âñå ïîëå áóäåò çàïîëíåíî, ñèìâîëû, ñîîòâåòñòâóþùèå äàííîìó ÷èñëó, íå ïåðåéäóò â ñëåäóþùåå ïîëå.
Ýòî âûçâàíî òåì îáñòîÿòåëüñòâîì, ÷òî îáû÷íûå ñèìâîëû, èìåþùèåñÿ â óïðàâëÿþùåé ñòðîêå, âêëþ÷àÿ ïðîáåëû, âñåãäà ïå÷àòàþòñÿ.
Ñ äðóãîé ñòîðîíû, åñëè ïå÷àòàåìîå ÷èñëî âêëþ÷åíî â íåêîòîðóþ ôðàçó, òî ÷àñòî ïðè åãî âûâîäå îêàçûâàåòñÿ óäîáíûì çàäàòü ïîëÿ ðàâíîé èëè ìåíüøå òðåáóåìîé. Ýòî äàåò âîçìîæíîñòü âêëþ÷èòü ÷èñëî â ôðàçó áåç äîáàâëåíèÿ ëèøíèõ ïðîáåëîâ. Íàïðèìåð, ðåçóëüòàòîì ðàáîòû îïåðàòîðà:
Printf(" Ñêîðîõîä Áåïïî ïðîáåæàë %.2f ìèëè çà 3 ÷.\n", distance);
Ìîãëà áû áûòü ñëåäóþùàÿ ôðàçà:
Ñêîðîõîä Áåïïî ïðîáåæàë 10.22 ìèëè çà 3 ÷.
Èçìåíÿÿ ñïåöèôèêàöèþ ïðåîáðàçîâàíèÿ íà %10.2f, ïîëó÷èì.
Ñêîðîõîä Áåïïî ïðîáåæàë 10.22 ìèëè çà 3 ÷.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
×òî òàêîå ñòðîêà ñèìâîëîâ: íåñêîëüêî ñèìâîëîâ, ðàñïîëîæåííûõ â ðÿä.
Êàê çàïèñûâàòü ñòðîêó ñèìâîëîâ: " íåñêîëüêî ñèìâîëîâ, ðàñïîëîæåííûõ â ðÿä".
Êàê ñòðîêà õðàíèòñÿ â ïàìÿòè: " íåñêîëüêî ñèìâîëîâ, ðàñïîëîæåííûõ â ðÿä\0".
Ãäå ðàçìåñòèòü ñòðîêó: char phrase[25] èëè static char phrase[25].
Êàê îïðåäåëèòü äëèíó ñòðîêè: èñïîëüçîâàòü ôóíêöèþ strlen(ñòðîêà).
Êàê ðàñïå÷àòàòü ñòðîêó: printf(" %s", phrase).
Êàê ïðî÷èòàòü ñòðîêó, ñîñòîÿùóþ èç îäíîãî ñëîâà: scanf(" %s " ,&name).
Êàê çàäàòü ÷èñëîâóþ êîíñòàíòó: #define TWO 2.
Êàê çàäàòü ñèìâîëüíóþ êîíñòàíòó: #define WOW '!'.
Êàê çàäàòü ñòðîêîâóþ êîíñòàíòó: #define WARN "He äåëàé ýòîãî!".
Ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ ïðè ââîäå-âûâîäå: %d %f %e %g %c %s %u % o %õ.
Êàê óëó÷øèòü âèä âõîäíîé èíôîðìàöèè: %-10d %3.2f.
Êàê âûïîëíÿòü ïðåîáðàçîâàíèÿ: printf(" %d %î %c\h", WOW, WOW, WOW);
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Ðàññìîòðåíèå ïðèâîäèìûõ íèæå âîïðîñîâ äîëæíî ïîìî÷ü âàì ãëóáæå ÓÑÂÎÈÒÜ ìàòåðèàë äàííîé ãëàâû.
Âîïðîñû.
1. Âûïîëíèòå ñíîâà ïðîãðàììó, ïðèâåäåííóþ â íà÷àëå äàííîé ãëàâû, íî íà ýòîò ðàç â îòâåò íà âîïðîñ î âàøåì èìåíè ââåäèòå èìÿ è ôàìèëèþ. ×òî ïðîèçîéäåò? Ïî÷åìó?
2. ×òî âûâåäåò íà ïå÷àòü êàæäûé èç íèæåïðèâåäåííûõ ïðîãðàììíûõ ôðàãìåíòîâ â ïðåäïîëîæåíèè, ÷òî îíè ÿâëÿþòñÿ ÷àñòüþ íåêîòîðîé ïîëíîé ïðîãðàììû?
a. printf( "Îí ïðîäàë êàðòèíó çà $%2 2f \n", 2 345å2),
á. printf("%c%c%c\n", 'Í', 105, '\41'),
â. #define Q "Åãî Ãàìëåò áûë ñìåøíûì, íî íå âóëüãàðíûì ".
printf("%s\n èìååò %d ñèìâîëîâ \n", Q, strlen(Q)),
ã. printf("%2 2å òî æå ñàìîå, ÷òî è %2 2f?\n", 1201 0, 1201 0),
3. Êàêèå èçìåíåíèÿ íåîáõîäèìî âíåñòè â ïðîãðàììó ï. 2â, ÷òîáû ñòðîêà Q áûëà âû âåäåíà íà ïå÷àòü çàêëþ÷åííîé â àïîñòðîôû?
4. Î÷åðåäíàÿ çàäà÷à ïî îáíàðóæåíèþ îøèáîê â ïðîãðàììå.
Define  à-ÿé ÿé.
Define X 10.
Main( ).
{ I.
Int age, char name,
Printf(" Óêàæèòå, ïîæàëóéñòà, ñâîå èìÿ ");
Scanf(" % s", name);
Printf(" Ïðåêðàñíî, %ñ, ñêîëüêî âàì ëåò?\n", name);
Scanf(" %f , age), xp = age + X;
Printf(" %s Âàì äîëæíî áûòü ïî êðàéíåé ìåðå %d \n", Â, xp),
}
Îòâåòû.
1. "Âçðûâîîïàñíàÿ" ïðîãðàììà Ïåðâûé îïåðàòîð scanf( ) ÷èòàåò âàøå èìÿ, îñòàâëÿÿ ôàìèëèþ íåïðî÷èòàííîé; ïðè ýòîì îíà âñå òàêè ïîïàäàåò âî âõîäíîé "áóôåð" (Ýòîò áóôåð âûïîëíÿåò ôóíêöèè îáëàñòè ïàìÿòè, èñïîëüçóåìîé äëÿ âðåìåííîãî õðàíåíèÿ ïîñòóïàþùèõ äàííûõ). Ñëåäóþùèé îïåðàòîð scanf( ) äîëæåí ââåñòè â ïðîãðàììó âåëè÷èíó âàøåãî âåñà, îí íà÷èíàåò ââîäèòü ñèìâîëû êàê ðàç ñ òîãî ìåñòà, ãäå çàâåðøèëñÿ ïðåäûäóùèé ââîä, è ïîýòîìó ÷èòàåò âàøó ôàìèëèþ, ïðèíèìàÿ åå çà âåñ.  ðåçóëüòàòå â ïðîãðàììó ïîïàäàåò "ìóñîð" Ñ äðóãîé ñòîðîíû, åñëè âû â îòâåò íà âîïðîñ îá èìåíè ââåäåòå ñòðîêó òèïà "Ñàøà 144", òî âåëè÷èíà 144 áóäåò ðàññìàòðèâàòüñÿ êàê âàø âåñ, íåñìîòðÿ íà òî, ÷òî âû ââåëè åå äî òîãî, êàê ïðîãðàììà çàïðîñèëà âåëè÷èíó âåñà.
2. à. Îí ïðîäàë êàðòèíó çà 234 50 äîëë.
á. Hi! Ïðèìå÷àíèå: ïåðâûé ñèìâîë - ýòî ñèìâîëè÷åñêàÿ êîíñòàíòà, âòîðîé - äåñÿòè÷íîå öåëîå ÷èñëî, ïðåîáðàçîâàííîå â ñèìâîë, à òðåòèé - ïðåäñòàâëåí ñèìâîëè÷åñêîé êîíñòàíòû â êîäå ASCII.
â. Åãî Ãàìëåò áûë ñìåøíûì, íî íå âóëüãàðíûì èìååò 41 ñèìâîë.
ã. 1.20Å+03 òî æå ñàìîå, ÷òî è 1201,00?
3. Âñïîìíèòå, ÷òî â ãë 3 ãîâîðèëîñü ïî ïîâîäó óïðàâëÿþùèõ ïîñëåäîâàòåëüíîñòåé, è ïîïðîáóéòå çàïèñàòü îïåðàòîð â òàêîì âèäå printf(" \" %s \" \n èìååò %d ñèìâîëîâ \n", Q, strlen(Q)).
4. Ñòðîêà 1: ñèìâîë # îïóùåí; âìåñòî à-ÿé-ÿé äîëæíî ñòîÿòü "à-ÿé-ÿé".
Ñòðîêà 2: ñèìâîë # îïóùåí.
Ñòðîêà 6: ïåðåìåííàÿ name äîëæíà áûòü ìàññèâîì, íàïðèìåð char name[25].
Ñòðîêà 8: â óïðàâëÿþùåé ñòðîêå äîëæåí ñòîÿòü ñèìâîë \n.
Ñòðîêà 10: âìåñòî %ñ äîëæíî áûòü %s.
Ñòðîêà 11 ïîñêîëüêó ïåðåìåííàÿ àgå öåëîãî òèïà, íåîáõîäèìî èñïîëüçîâàòü %d, à íå %f, êðîìå òîãî, âìåñòî àgå äîëæíî ñòîÿòü &àgå.
Ñòðîêà 12: èìÿ xp íèãäå íå áûëî îïèñàíî.
Ñòðîêà 13: ïðàâèëüíàÿ, íî ïðè âûâîäå íà ïå÷àòü ðåçóëüòàò áóäåò èñïîð÷åí èç-çà îøèáêè, äîïóùåííîé ïðè îïðåäåëåíèè Â.
Êðîìå òîãî, ïðîãðàììà ñëóæèò ïðèìåðîì ïëîõîãî ñòèëÿ ïðîãðàììèðîâàíèÿ.
5. Îïåðàöèè, âûðàæåíèÿ è îïåðàòîðû.
ÎÏÅÐÀÖÈÈ È ÎÏÐÀÒÎÐÛ. ÂÛÏÎËÍÅÍÈÅ ÀÐÈÔÌÅÒÈ×ÅÑÊÈÕ ÎÏÅÐÀÖÈÉ. ÈÑÏÎËÜÇÎÂÀÍÈÅ ÎÏÅÐÀÒÎÐÀ while. ÂÛÐÀÆÅÍÈß. ÏÐÎÑÒÛÅ ÑÎÑÒÀÂÍÛÅ ÎÏÅÐÀÒÎÐÛ. ÏÐÅÎÁÐÀÇÎÂÀÍÈß ÒÈÏÎÂ. ÊËÞ×ÅÂÛÅ ÑËÎÂÀ. While. ÎÏÅÐÀÖÈÈ. + - * / % ++ -- (òèï).
ÂÂÅÄÅÍÈÅ.
 ãë. 3 è 4 ìû ãîâîðèëè î òèïàõ äàííûõ, èñïîëüçóåìûõ â ÿçûêå Ñè. Çäåñü æå ìû ðàññìîòðèì ñïîñîáû îáðàáîòêè äàííûõ - äëÿ ýòîãî ÿçûê Ñè èìååò øèðîêèé íàáîð âîçìîæíîñòåé. Íà÷íåì ñ îñíîâíûõ àðèôìåòè÷åñêèõ îïåðàöèé ñëîæåíèÿ, âû÷èòàíèÿ, óìíîæåíèÿ è äåëåíèÿ. ×òîáû ñäåëàòü íàøè ïðîãðàììû áîëåå èíòåðåñíûìè è ïîó÷èòåëüíûìè, ìû âïåðâûå â ýòîé ãëàâå êîñíåìñÿ öèêëîâ. À ïîêà, ÷òîáû ââåñòè âàñ â êóðñ äåëà, ïðèâåäåì ïðîñòóþ ïðîãðàììó, âûïîëíÿþùóþ íåñëîæíûå àðèôìåòè÷åñêèå äåéñòâèÿ:
/* ðàçìåðîáóâè1 */
#define OFFSET 7 64.
#define SCALE 0 325.
Main( ).
{
/* ïåðåñ÷åò ðàçìåðà îáóâè â ðàçìåð íîãè â äþéìàõ */
float shoe, foot;
Shoe =90;
Foot = SCALE*shoe + OFFSET;
Printf(" Ðàçìåð îáóâè (ìóæñêîé) ðàçìåð íîãè\n");
Printf(" %10 lf %13 2f äþéì\n" , shoe, foot);
}
Çäîðîâî, â íàøåé ïðîãðàììå âûïîëíÿåòñÿ óìíîæåíèå è ñëîæåíèå, ò.å. áåðåòñÿ âàø ðàçìåð îáóâè (åñëè âû íîñèòå ðàçìåð 9), à âàì ñîîáùàåòñÿ äëèíà ñòîïû â äþéìàõ. Âû ñêàæåòå, ÷òî ìîãëè áû ðåøèòü äàííóþ çàäà÷ó â óìå çà ìåíüøåå âðåìÿ, ÷åì ïîòðåáîâàëîñü äëÿ ââîäà ñàìîé ïðîãðàììû â ìàøèíó. Ýòî, êîíå÷íî, ïðàâèëüíî. Ñîçäàíèå ïðîãðàììû, ñïîñîáíîé îïåðèðîâàòü òîëüêî îäíèì ðàçìåðîì îáóâè, âûãëÿäèò êàê íåíóæíàÿ òðàòà âðåìåíè è óñèëèé. Ìû ìîãëè áû ïðèäàòü ïðîãðàììå áîëüøóþ ýôôåêòèâíîñòü, ñäåëàâ åå äèàëîãîâîé, íî è ýòî îêàæåòñÿ íåïðîèçâîäèòåëüíûì èñïîëüçîâàíèåì âîçìîæíîñòåé ìàøèíû.
Íàì íóæíî ëèøü êàêèì òî îáðàçîì çàñòàâèòü êîìïüþòåð âûïîëíèòü ïîâòîðÿþùèåñÿ âû÷èñëåíèÿ. Âîîáùå ãîâîðÿ, èìåííî ýòà ïîÿâëÿåòñÿ îäíîé èç ãëàâíûõ ïðè÷èí èñïîëüçîâàíèÿ ìàøèí. Äëÿ âûïîëíåíèÿ àðèôìåòè÷åñêèõ âû÷èñëåíèé. ßçûê Ñè ïðåäëàãàåò íåñêîëüêî ñïîñîáîâ ðåàëèçàöèè ïîâòîðÿþùèõñÿ âû÷èñëåíèé, ñåé÷àñ îáñóäèì îäèí èç íèõ. Äàííûé ñïîñîá, íàçûâàåìûé "while", äàåò âîçìîæíîñòü èñïîëüçîâàòü îïåðàòîðû ÿçûêà áîëåå èíòåðåñíûì îáðàçîì. Íèæå ïðèâîäèòñÿ ìîäèôèêàöèÿ íàøåé ïðîãðàììû, çàíèìàþùåéñÿ ïåðåñ÷åòîì ðàçìåðîâ îáóâè.
/* ðàçìåð îáóâè2 */
#define OFFSET 7 64.
#define SCALE 0 325.
Main().
{
/* ïåðåñ÷åò ðàçìåðà îáóâè â ðàçìåð íîãè â äþéìàõ */
float shoe, foot;
Printf("Ðàçìåð îáóâè (ìóæñêîé) ðàçìåð íîãè\n");
Shoe = 3.0;
While(shoe < 18.5).
{
foot = SCALE *shoe + OFFSET;
printf(" %10 lf %13 2f %l6 2f äþéìà\n" , shoe, foot);
shoe = shoe + 1.0;
}
Printf("Åñëè ýòà îáóâü ãîäèòñÿ âàì, íîñèòå åå \n");
}
Âîò ðåçóëüòàò ðàáîòû ïðîãðàììû, ðàçìåð îáóâè2, ïðèâåäåííûé â ñîêðàùåííîì âèäå:
Ðàçìåð îáóâè (ìóæñêîé) Ðàçìåð íîãè.
3.01 8.61 äþéìà.
4.0 8.94 äþéìà.
... ...
... ...
17.0 13.16 äþéìà.
18.0 13.46 äþéìà.
Åñëè ýòà îáóâü ãîäèòüñÿ âàì, íîñèòå åå.
(Çíà÷åíèÿ êîíñòàíò äëÿ äàííîé ïðîãðàììû ïåðåñ÷åòà áûëè ïîëó÷åíû âî âðåìÿ íàøåãî âèçèòà èíêîãíèòî â îáóâíîé ìàãàçèí.  åäèíñòâåííîì îáíàðóæåííîì òàì êëàññèôèêàòîðå ðàçìåðîâ ïðèâîäèëèñü äàííûå òîëüêî îòíîñèòåëüíî ìóæñêîé îáóâè. Ëèöà, èíòåðåñóþùèåñÿ ðàçìåðàìè æåíñêîé îáóâè, äîëæíû ïîñåòèòü îáóâíîé ìàãàçèí ñàìè).
Öèêë while ðàáîòàåò ñëåäóþùèì îáðàçîì. Êîãäà ïðîãðàììà â ïðîöåññå âûïîëíåíèÿ âïåðâûå äîñòèãàåò îïåðàòîðà while, îñóøåñòâëÿåòñÿ ïðîâåðêà èñòèííîñòè óñëîâèÿ, çàêëþ÷åííîãî â êðóãëûå ñêîáêè.  ýòîì ñëó÷àå ñîîòâåòñòâóþùåå âûðàæåíèå èìååò âèä:
Shoe < 18.5.
Ãäå ñèìâîë < îçíà÷àåò "ìåíüøå". Âíà÷àëå ïåðåìåííàÿ shoe áûëà èíèöèàëèçèðîâàíà çíà÷åíèåì 3.0, êîòîðîå, êàê âèäíî, ìåíüøå 18.5. Ïîýòîìó äàííîå óñëîâèå èñòèííî, è îñóùåñòâëÿåòñÿ ïåðåõîä ê ñëåäóþùåìó îïåðàòîðó, êîòîðûé ïåðåâîäèò ðàçìåð îáóâè â äþéìû. Ïîñëå ýòîãî ðåçóëüòàòû âûâîäÿòñÿ íà ïå÷àòü. Ñëåäóþùèé îïåðàòîð:
Shoe = shoe + 1.0;
Óâåëè÷èâàåò çíà÷åíèå ïåðåìåííîé shoe íà 1.0, äåëàÿ åãî ðàâíûì 4.0.  ýòîì ìåñòå ïðîãðàììû ïðîèñõîäèò âîçâðàò ê íà÷àëó ôðàãìåíòà while, ãäå âûøåóïîìÿíóòîå óñëîâèå ïðîâåðÿåòñÿ âíîâü. Ïî ÷åìó èìåííî çäåñü? Ýòî ïðîèñõîäèò ïîòîìó, ÷òî ñëåäóþùåé ñòðîêîé ïðîãðàììû ÿâëÿåòñÿ çàêðûâàþùàÿ ôèãóðíàÿ ñêîáêà } - òåëî öèêëà while çàêëþ÷åíî â ôèãóðíûå ñêîáêè. Îïåðàòîðû, ðàñïîëî æåííûå ìåæäó íèìè, ÿâëÿþòñÿ òîé ÷àñòüþ ïðîãðàììû, êîòîðàÿ ìîæåò âûïîëíÿòüñÿ ïîâòîðíî. Òåïåðü äàâàéòå âåðíåìñÿ ê íàøåé ïðîãðàììå: 4 ìåíüøå 18.5 ? Áåçóñëîâíî Ïîýòîìó âåñü íàáîð îïåðàòîðîâ, çàêëþ÷åííûé â ôèãóðíûå ñêîáêè è ñëåäóþùèé çà êëþ÷åâûì ñëîâîì while, âûïîëíèòñÿ îïÿòü. (Ñïåöèàëèñòû ïî âû÷èñëèòåëüíîé òåõíèêå â ýòîì ñëó÷àå ãîâîðÿò, ÷òî ïðîãðàììà âûïîëíÿåò ýòè îïåðàòîðû "â öèêëå"). Ýòî ïðîäîëæàåòñÿ, ïîêà çíà÷åíèå ïåðåìåííîé shoe íå äîñòèãíåò âåëè÷èíû 19.0. Êîãäà óñëîâèå.
Shoe < 18.5.
Ñòàíåò ëîæíûì, ïîñêîëüêó 19.0 íå ìåíüøå 18.5. Ïðè ýòîì ïðîèçîéäåò ïåðåäà÷à óïðàâëåíèÿ îïåðàòîðó, ñëåäóþùåìó ñðàçó çà òåëîì öèêëà while.  íàøåì ñëó÷àå èì ÿâëÿåòñÿ çàâåðøàþùèé îïåðàòîð printf().
Âû ìîæåòå ëåãêî ìîäèôèöèðîâàòü ýòó ïðîãðàììó, ÷òîáû îíà îñóùåñòâëÿëà äðóãèå ïðåîáðàçîâàíèÿ. Íàïðèìåð, çàìåíèòå çíà÷åíèå êîíñòàíòû SCALE íà 1.8, à êîíñòàíòû OFFSET - íà 32.0, è âû èçó÷èòå ïðîãðàììó, êîòîðàÿ ïåðåâîäèò òåìïåðàòóðó ïî Öåëüñèþ â òåìïåðàòóðó ïî Ôàðåíãåéòó. Åñëè çàìåíèòü çíà÷åíèå SCALE íà 0.6214, a OFFSET íà 0, òî ïðîãðàììà áóäåò ïåðåâîäèòü ìèëè â êèëîìåòðû. Ïðîèçâîäÿ ýòè èçìåíåíèÿ, âû, ïîâèäèìîìó, âî èçáåæàíèå ïóòàíèöû äîëæíû áóäåòå ïîìåíÿòü òàêæå è ïå÷àòàåìûå ñîîáùåíèÿ.
Öèêë while ñëóæèò óäîáíûì è ãèáêèì ñðåäñòâîì óïðàâëåíèÿ âûïîëíåíèÿ ïðîãðàììû. Âåðíåìñÿ òåïåðü ê îáñóæäåíèþ íàáîðà îñíîâíûõ îïåðàöèé, êîòîðûå ìû ìîæåì èñïîëüçîâàòü â ïðîãðàììàõ.
ÎÑÍÎÂÍÛÅ ÎÏÅÐÀÖÈÈ.
"Îïåðàöèè" â ÿçûêå Ñè ïðèìåíÿþòñÿ äëÿ ïðåäñòàâëåíèÿ àðèôìåòè÷åñêèõ äåéñòâèé. Íàïðèìåð, âûïîëíåíèå îïåðàöèè + ïðèâîäèò ê ñëîæåíèþ äâóõ âåëè÷èí, ñòîÿùèõ ñëåâà è ñïðàâà îò ýòîãî çíàêà. Åñëè ñëîâî "îïåðàöèÿ" êàæåòñÿ âàì ñòðàííûì, ïîäóìàéòå òîãäà, êàê íàçâàòü ýòè ïîíÿòèÿ. Íàì ñëîâî "îïåðàöèÿ" ïðåäñòàâëÿåòñÿ ëó÷øèì òåðìèíîì, ÷åì, ñêàæåì, "àðèôìåòè÷åñêèå òðàíçàêòîðû" ìû ðàññìîòðèì îïåðàöèè =, +, -, * è /. ( ÿçûêå Ñè íåò îïåðàöèè âîçâåäåíèÿ â ñòåïåíü.  îäíîé èç ñëåäóþùèõ ãëàâ áóäåò ïðåäñòàâëåíà ïðîãðàììà, ðåàëèçóþùàÿ äàííóþ ôóíêöèþ).
Îïåðàöèÿ ïðèñâàèâàíèÿ: =
 ÿçûêå Ñè çíàê ðàâåíñòâà íå îçíà÷àåò "ðàâíî". Îí îçíà÷àåò îïåðàöèþ ïðèñâàèâàíèÿ íåêîòîðîãî çíà÷åíèÿ. Ñ ïîìîùüþ îïåðàòîðà.
Bmw = 2002,
Ïåðåìåííîé ñ èìåíåì bmw ïðèñâàèâàåòñÿ çíà÷åíèå 2002, ò.å. ýëåìåíò ñëåâà îò çíàêà = - ýòî èìÿ ïåðåìåííîé, à ýëåìåíò ñïðàâà - åå çíà÷åíèå. Ìû íàçûâàåì ñèìâîë = "îïåðàöèåé ïðèñâàèâàíèÿ". Åùå ðàç õîòèì îáðàòèòü âàøå âíèìàíèå íà òî, ÷òî ñìûñë óêàçàííîé ñòðîêè íå âûðàæàåòñÿ ñëîâàìè "bmw ðàâíî 2002". Âìåñòî ýòîãî íóæíî ãîâîðèòü òàê "ïðèñâîèòü ïåðåìåííîé bmw çíà÷åíèå 2002".  ýòîé îïåðàöèè äåéñòâèå âûïîëíÿåòñÿ ñïðàâà íàëåâî.
Âîçìîæíî, ðàçëè÷èå ìåæäó èìåíåì ïåðåìåííîé è åå çíà÷åíèåì ïîêàæåòñÿ âàì íåçíà÷èòåëüíûì.  òàêîì ñëó÷àå äàâàéòå ðàññìîòðèì ñëåäóþùèé ñðàâíèòåëüíî ÷àñòî èñïîëüçóåìûé ïðè ïðîãðàììèðîâàíèè îïåðàòîð.
I =i + 1;
Ñ ìàòåìàòè÷åñêîé òî÷êè çðåíèÿ ýòî áåññìûñëèöà. Åñëè âû ïðèáàâëÿåòå åäèíèöó ê êîíå÷íîìó ÷èñëó, ðåçóëüòàò íå ìîæåò áûòü ðàâåí èñõîäíîìó ÷èñëó. Íî êàê îïåðàòîð ïðèñâàèâàíèÿ äàííàÿ ñòðîêà èìååò âïîëíå îïðåäåëåííûé ñìûñë, êîòîðûé ìîæíî âûðàçèòü, íàïðèìåð, òàêîé äëèííîé ôðàçîé "Âçÿòü çíà÷åíèå ïåðåìåííîé ñ èìåíåì i, ê íåìó ïðèáàâèòü 1, à çàòåì ïðèñâîèòü íîâîå çíà÷åíèå ïåðåìåííîé ñ èìåíåì i".
I = i + 1,
ÐÈÑ. 5.1.
Îïåðàòîð âèäà.
2002 = bmw,
Íà ÿçûêå Ñè íå èìååò ñìûñëà, ïîñêîëüêó 2002 - ÷èñëî. Âû íå ìîæåòå ïðèñâîèòü êîíñòàíòå êàêîå-òî çíà÷åíèå; åå çíà÷åíèåì ÿâëÿåòñÿ îíà ñàìà. Ïîýòîìó, ñèäÿ çà êëàâèàòóðîé, ïîìíèòå, ÷òî ýëåìåíò, ñòîÿùèé ñëåâà îò çíàêà =, âñåãäà äîëæåí áûòü èìåíåì ïåðåìåííîé.
Òåì èç âàñ, êòî ïðåäïî÷èòàåò çíàòü ïðàâèëüíûå íàçâàíèÿ ïîíÿòèé, ñêàæåì, ÷òî âìåñòî èñïîëüçîâàííîãî ðàíåå òåðìèíà "ýëåìåíò" îáû÷íî óïîòðåáëÿþò ñëîâî "îïåðàíä". Îïåðàíäû - ýòî òî, íàä ÷åì âûïîëíÿþòñÿ îïåðàöèè. Íàïðèìåð, âû ìîæåòå îïèñàòü ïðîöåññ "ïîåäàíèÿ" ãàìáóðãåðà êàê ïðèìåíåíèå îïåðàöèè "ïîåäàíèå" ê îïåðàíäó "ãàìáóðãåð".
Îïåðàöèÿ ïðèñâàèâàíèÿ â ÿçûêå Ñè ïðåäñòàâëÿåòñÿ íåñêîëüêî áîëåå èíòåðåñíîé, ÷åì â áîëüøèíñòâå äðóãèõ ÿçûêîâ. Ïîïðîáóéòå âûïîëíèòü ïðèâåäåííóþ íèæå êîðîòêóþ ïðîãðàììó.
/* òàáëèöà ðåçóëüòàòîâ òóðíèðà ïî ãîëüôó */
Main( ) {
Int Jane, tarzan, cheeta, cheeta = tarzan = jane = 68;
Printf("cheeta tarzan jane\n");
Printf("Ñ÷åòïåðâîéïàðòèè%4d %8d %8d \n", cheeta, tarzan, jane);
}
 òî âðåìÿ êàê ìíîãèå ÿçûêè çàïðåùàþò ïðèìåíÿòü òàêîå òðîèíîå ïðèñâàèâàíèå, ïðèñóòñòâóþùåå â äàííîé ïðîãðàììå, äëÿ Ñè ýòî îáû÷íàÿ ïðàêòèêà. Ïðèñâàèâàíèÿ âûïîëíÿþòñÿ ñïðàâà íàëåâî ñíà÷àëà ïåðåìåííàÿ jane ïîëó÷àåò çíà÷åíèå 68, çàòåì ïåðåìåííàÿ tarzan è íàêîíåö ïåðåìåííàÿ cheeta. Ðåçóëüòàò âûãëÿäèò òàê:
Cheeta tarzan jane.
Ñ÷åò ïåðâîé ïàðòèè 68 68 68.
 ÿçûêå Ñè èìååòñÿ íåñêîëüêî äðóãèõ îïåðàöèè ïðèñâàèâàíèÿ, êîòîðûå îòëè÷àþòñÿ îò îïåðàöèè, îïèñàííîé â äàííîì ðàçäåëå, è ìû îáåùàåì ðàññêàçàòü î íèõ â ñëåäóþùåé ãëàâå.
Îïåðàöèÿ ñëîæåíèÿ: +
Âûïîëíåíèå îïåðàöèè + ïðèâîäèò ê ñëîæåíèþ äâóõ âåëè÷èí, ñòîÿùèõ ñëåâà è ñïðàâà îò ýòîãî çíàêà. Íàïðèìåð, â ðåçóëüòàòå ðàáîòû îïåðàòîðà.
Printf(" %d", 4 + 20);
Íà ïå÷àòü áóäåò âûâåäåíî ÷èñëî 24, à íå âûðàæåíèå 4 + 20.
Îïåðàíäû ìîãóò áûòü êàê ïåðåìåííûìè, òàê è êîíñòàíòàìè. Ïîýòîìó ïðè âûïîëíåíèè îïåðàòîðà.
Income = salary + bribes;
Êîìïüþòåð âîçüìåò çíà÷åíèÿ äâóõ ïåðåìåííûõ, ñòîÿùèõ â ïðàâîé ÷àñòè, ñëîæèò èõ è ïðèñâîèò çàòåì ïîëó÷åííóþ ñóììó ïåðåìåííîé income.
Îïåðàöèÿ + íàçûâàåòñÿ "áèíàðíîé", èëè "äèàäè÷åñêîé". Ýòè íàçâàíèÿ îòðàæàþò òîò ôàêò, ÷òî îíà èìååò äåëî ñ äâóìÿ îïåðàíäàìè.
Îïåðàöèÿ âû÷èòàíèÿ: -
Âûïîëíåíèå îïåðàöèè âû÷èòàíèÿ ïðèâîäèò ê âû÷èòàíèþ ÷èñëà, ðàñïîëîæåíîãî ñïðàâà îò çíàêà -, èç ÷èñëà, ñòîÿùåãî ñëåâà îò ýòîãî çíàêà. Îïåðàòîð.
Takehome = 224.00 - 24.00;
Ïðèñâàèâàåò ïåðåìåííîé takehome çíà÷åíèå 200.
Îïåðàöèÿ èçìåíåíèÿ çíàêà: -
Çíàê ìèíóñ èñïîëüçóåòñÿ òàêæå äëÿ óêàçàíèÿ èëè èçìåíåíèÿ àëãåáðàè÷åñêîãî çíàêà íåêîòîðîé âåëè÷èíû. Íàïðèìåð, â ðåçóëüòàòå âûïîëíåíèÿ ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ.
Rocky = -12;
Smokey = -rocky;
Ïåðåìåííîé smokey áóäåò ïðèñâîåíî çíà÷åíèå 12.
Êîãäà çíàê ìèíóñ èñïîëüçóåòñÿ ïîäîáíûì îáðàçîì, äàííàÿ înåðàöèÿ íàçûâàåòñÿ "óíàðíîé". Òàêîå íàçâàíèå óêàçûâàåò íà òî, ÷òî îíà èìååò äåëî òîëüêî ñ îäíèì îïåðàíäîì.
ÐÈÑ. 5.2. Óíàðíûå è áèíàðíûå îïåðàöèè.
Îïåðàöèÿ óìíîæåíèÿ: *
Îïåðàöèÿ óìíîæåíèÿ îáîçíà÷àåòñÿ çíàêîì *. Ïðè âûïîëíåíèè îïåðàòîðà.
Cm = 2.54 * in;
Çíà÷åíèå ïåðåìåííîé in óìíîæàåòñÿ íà 2.54, è ðåçóëüòàò ïðèñâàèâàåòñÿ ïåðåìåííîé cm.
Âû õîòèòå èìåòü òàáëèöó êâàäðàòîâ íàòóðàëüíûõ ÷èñåë?  ÿçûêå Ñè íåò ôóíêöèè, îñóùåñòâëÿþùåé âîçâåäåíèå â êâàäðàò; âìåñòî ýòîãî ìû ìîæåì èñïîëüçîâàòü óìíîæåíèå.
/* êâàäðàòû ÷èñåë */
Main( ) /* ïîëó÷åíèå òàáëèöû êâàäðàòîâ */
{
int num = 1;
while(num < 21) {
printf("%10d %10d", n, n*n);
n = n + 1;
}
Ýòà ïðîãðàììà âûâîäèò íà ïå÷àòü ïåðâûå 20 öåëûõ ÷èñåë è èõ êâàäðàòû, â ÷åì âû ñàìè ëåãêî ìîæåòå óáåäèòüñÿ. Òåïåðü äàâàéòå ðàññìîòðèì áîëåå èíòåðåñíûé ïðèìåð. Âû, íàâåðíîå, ñëûøàëè èñòîðèþ î òîì, êàê îäèí ìîãóùåñòâåííûé ïðàâèòåëü îáåùàë íàãðàäèòü ó÷åíîãî, îêàçàâøåãî åìó áîëüøóþ óñëóãó. Ó÷åíûé, êîãäà åãî ñïðîñèëè, ÷òî áû îí õîòåë ïîëó÷èòü â íàãðàäó, óêàçàë íà øàõìàòíóþ äîñêó è ïðîìîëâèë: "Ïîëîæèòå îäíî ïøåíè÷íîå çåðíî íà ïåðâóþ êëåòêó, äâà - íà âòîðóþ, ÷åòûðå íà òðåòüþ, âîñåìü íà ñëåäóþùóþ è ò. ä.". Ïðàâèòåëü, êîòîðîìó ÿâíî íåäîñòàâàëî ìàòåìàòè÷åñêîé ýðóäèöèè, áûë ïîðàæåí, óñëûøàâ òàêóþ ñêðîìíóþ ïðîñüáó,- âåäü îí óæå ïðèãîòîâèë áîãàòûå äàðû. Ïðîãðàììà, ïðèâåäåííàÿ íèæå, ïîêàçûâàåò, â êàêîå ñìåøíîå ïîëîæåíèå ïîïàë ïðàâèòåëü.  íåé âû÷èñëÿåòñÿ êîëè÷åñòâî çåðåí, êîòîðîå íàäî ïîëîæèòü íà êàæäóþ êëåòêó, à òàêæå ïðîìåæóòî÷íûå ðåçóëüòàòû (ñóììû çåðåí ïî ÷èñëó êëåòîê). Ïîñêîëüêó âû, âîçìîæíî, íå çíàêîìû ñ óðîæàÿìè ïøåíèöû, ìû, êðîìå òîãî, ñðàâíèâàåì ïðîìåæóòî÷íûå ñóììû çåðåí ñ ïðèáëèçèòåëüíûìè öèôðàìè ãîäîâîãî óðîæàÿ ïøåíèöû â ÑØÀ.
/* ïøåíèöà */
#define SQUARES 64 /* ÷èñëî êëåòîê íà øàõìàòíîé äîñêå */
#define CROP 7E14 /* óðîæàé ïøåíèöû â ÑØÀ, âûðàæåííûé â ÷èñëå çåðåí */
Main( ) {
Double current, total, int count = 1;
Printf(" êëåòêà ÷èñëî çåðåí ñóììà çåðåí äîëÿ\n");
Printf("îò óðîæàÿ â ÑØÀ\n"),
Total = current = 1.0; /* íà÷èíàåì ñ îäíîãî çåðíà */
Printf("%4d %15.2å%13.2å%12.2e\n", count, current, total, total/CROP);
While (count < SQUARES){
Count = count + 1;
Current =2.0 * current; /* ó äâîåíèå ÷èñëà çåðåí íà ñëåäóþùåé êëåòêå*/
Total = total + current; /* êîððåêöèÿñóììû*/
Printf(" %4d %15.2å%13.2å%12 2e\n" , count, current, total, total/CROP); }.
}
Âíà÷àëå ðåçóëüòàòû ðàáîòû ïðîãðàììû âûãëÿäÿò äîâîëüíî áåçîáèäíî.
Íà ïåðâûõ 10 êëåòêàõ îêàçàëîñü ÷óòü áîëåå òûñÿ÷è çåðåí ïøåíèöû. Íî äàâàéòå ïîñìîòðèì, ñêîëüêî çåðåí íà ïÿòèäåñÿòè êëåòêàõ.
Äîáû÷à ó÷åíîãî ïðåâûñèëà âåñü ãîäîâîé óðîæàé ïøåíèöû â ÑØÀ. Åñëè âû çàõîòèòå óçíàòü, ÷òî îêàæåòñÿ íà 64 êëåòêàõ, âûïîëíèòå ïðîãðàììó ñàìè.
Ýòîò ïðèìåð èëëþñòðèðóåò ôåíîìåí ýêñïîíåíöèàëüíîãî ðîñòà âîçðàñòàíèå íàñåëåíèÿ çåìíîãî øàðà è èñïîëüçîâàíèå íàìè ýíåðãåòè÷åñêèõ ðåñóðñîâ ïîä÷èíÿþòñÿ òîìó æå çàêîíó.
Îïåðàöèÿ äåëåíèÿ: /
 ÿçûêå Ñè ñèìâîë / óêàçûâàåò íà îïåðàöèþ äåëåíèÿ. Âåëè÷èíà, ñòîÿùàÿ ñëåâà îò ýòîãî çíàêà, äåëèòñÿ íà âåëè÷èíó, ðàñïîëîæåííóþ ñïðàâà îò íåãî. Íàïðèìåð, â ðåçóëüòàòå âûïîëíåíèÿ îïåðàòîðà:
Four = 12.0/3.0;
Ïåðåìåííîé four áóäåò ïðèñâîåíî çíà÷åíèå 4.0. Çàìåòèì, ÷òî íàä äàííûìè öåëîãî òèïà îïåðàöèÿ äåëåíèÿ ïðîèçâîäèòñÿ íå òàê, êàê íàä äàííûìè ñ ïëàâàþùåé òî÷êîé â ïåðâîì ñëó÷àå ðåçóëüòàò áóäåò öåëûì ÷èñëîì, à âî âòîðîì - ÷èñëîì ñ ïëàâàþùåé òî÷êîé. Ó öåëîãî ÷èñëà íåò äðîáíîé ÷àñòè, ÷òî äåëàåò äåëåíèå 5 íà 3 çàòðóäíèòåëüíûì, ïîñêîëüêó ðåçóëüòàò íå ÿâëÿåòñÿ öåëûì.  ÿçûêå Ñè ïðèíÿòî ïðàâèëî, ñîãëàñíî êîòîðîìó äðîáíàÿ ÷àñòü ó ðåçóëüòàòà äåëåíèÿ öåëûõ ÷èñåë îòáðàñûâàåòñÿ. Ýòî äåéñòâèå íàçûâàåòñÿ "óñå÷åíèåì".
Ïîïðîáóéòå âûïîëíèòü ïðèâåäåííóþ íèæå ïðîãðàììó, ÷òîáû ïîñìîòðåòü, êàê îñóùåñòâëÿåòñÿ óñå÷åíèå ðåçóëüòàòà è ÷åì äåëåíèå ÷èñåë îòëè÷àåòñÿ îò äåëåíèÿ ÷èñåë ñ ïëàâàþùåé òî÷êîé.
/*Ïðèìåðû äåëåíèÿ */
Main().
{
printf(" äåëåíèå öåëûõ: 5/4 ýòî %d \n" , 5/4);
Printf(" äåëåíèå öåëûõ 6/3 ýòî %d \ï" , 6/3);
Printf(" äåëåíèå öåëûõ 7/4 ýòî %d \ï" , 7/4);
Printf(" äåëåíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé 7 /4 ýòî %2.2f \n", 7 /4 );
Printf(" ñìåøàííîå äåëåíèå 7 /4 ýòî %2.2f \n" , 7 /4);
}
Ìû âêëþ÷èëè â íàøó ïðîãðàììó òàêæå ñëó÷àé "ñìåøàííûõ" òèïîâ, îñóùåñòâëÿÿ äåëåíèå âåùåñòâåííîãî ÷èñëà íà öåëîå. ßçûê Ñè ìåíåå ñòðîãî "ïîäõîäèò" ê ïîäîáíûì âîïðîñàì, ÷åì íåêîòîðûå äðóãèå ÿçûêè, è ïîçâîëÿåò âûïîëíÿòü òàêèå îïåðàöèè, íî, âîîáùå ãîâîðÿ, ñìåùåíèÿ òèïîâ ñëåäóåò èçáåãàòü. Âîò ðåçóëüòàòû âûïîëíåíèÿ óêàçàííîé ïðîãðàììû. Îáðàòèòå âíèìàíèå íà òî, ÷òî ðåçóëüòàò äåëåíèÿ öåëûõ ÷èñåë îêðóãëÿåòñÿ íå äî áëèæàéøåãî öåëîãî, à âñåãäà äî ìåíüøåãî öåëîãî ÷èñëà. Êîãäà ìû ñìåøèâàåì öåëûå ÷èñëà è ÷èñëà ñ ïëàâàþùåé òî÷êîé, ðåçóëüòàò áóäåò òàêèì æå, êàê åñëè áû îáà îïåðàíäà áûëè ÷èñëàìè ñ ïëàâàþùåé òî÷êîé, ïîñêîëüêó â ýòîì ñëó÷àå ïåðåä äåëåíèåì öåëîå ïðåîáðàçóåòñÿ â ÷èñëî ñ ïëàâàþùåé òî÷êîé.
Óêàçàííûå ñâîéñòâà îïåðàöèè äåëåíèÿ öåëûõ ÷èñåë îêàçûâàþòñÿ äîâîëüíî óäîáíûìè ïðè ðåøåíèè íåêîòîðûõ çàäà÷. Î÷åíü ñêîðî ìû ïðèâåäåì ñîîòâåòñòâóþùèé ïðèìåð. Íàì îñòàëîñü ðàññìîòðåòü åùå îäèí âàæíûé âîïðîñ, ÷òî ïðîèñõîäèò â òåõ ñëó÷àÿõ, êîãäà â îäíîì îïåðàòîðå èñïîëüçóåòñÿ íåñêîëüêî îïåðàöèé? Ýòî è ïîñëóæèëî íàì òåìîé îáñóæäåíèÿ, ïðèâåäåííîãî íèæå.
Ïîðÿäîê âûïîëíåíèÿ îïåðàöèé.
Ðàññìîòðèì ñëåäóþùóþ ñòðîêó:
Butter = 25.0 + 60.0 * n / SCALE;
 ýòîì îïåðàòîðå èìåþòñÿ îïåðàöèè ñëîæåíèÿ, óìíîæåíèÿ è äåëåíèÿ. Êàêàÿ îïåðàöèÿ áóäåò âûïîëíåíà ïåðâîé? Áóäåò ëè 25.0 ñêëàäûâàòüñÿ ñ 60.0, çàòåì ðåçóëüòàò 85.0 óìíîæàòüñÿ íà n, à ïðîèçâåäåíèå äåëèòüñÿ íà çíà÷åíèå êîíñòàíòû SCALE? Èëè 60.0 óìíîæàåòñÿ íà n, ðåçóëüòàò ñêëàäûâàåòñÿ ñ 25.0, à ñóììà çàòåì äåëèòñÿ íà âåëè÷èíó SCALE? Èëè æå ñóùåñòâóåò êàêîé-òî äðóãîé ïîðÿäîê âûïîëíåíèÿ îïåðàöèé? Ïóñòü ïåðåìåííàÿ n ðàâíà 6.0, à êîíñòàíòà SCALE - 2.0. Åñëè âû âûïîëíèòå äàííûå îïåðàöèè, èñïîëüçóÿ ýòè çíà÷åíèÿ, âû íàéäåòå, ÷òî ïðè ïåðâîì ñïîñîáå âû÷èñëåíèÿ ðåçóëüòàò ðàâåí 255, à ïðè âòîðîì - 192.5. Ïðè âûïîëíåíèè äàííîé Ñè ïðîãðàììû íà ìàøèíå ðåàëèçóåòñÿ, ïî-âèäèìîìó, êàêîé-òî äðóãîé ïîðÿäîê âû÷èñëåíèé, ïîñêîëüêó íà äåëå ïåðåìåííàÿ butter ïîëó÷èò çíà÷åíèå 205.0.
Ñîâåðøåííî î÷åâèäíî, ÷òî èçìåíåíèå ïîðÿäêà âûïîëíåíèÿ äåéñòâèé ìîæåò ïðèâîäèòü ê ðàçëè÷íûì ðåçóëüòàòàì, ïîýòîìó ÿçûê Ñè íóæäàåòñÿ â íàáîðå íåïðîòèâîðå÷èâûõ ïðàâèë, óêàçûâàþùèõ, êàêîå äåéñòâèå îñóùåñòâëÿòü ïåðâûì. ßçûê Ñè äåëàåò ýòî, çàäàâàÿ ïðèîðèòåò òîé èëè èíîé îïåðàöèè. Êàæäîé îïåðàöèè íàçíà÷àåòñÿ óðîâåíü ñòàðøèíñòâà. Óìíîæåíèå è äåëåíèå èìåþò áîëåå âûñîêèé óðîâåíü, ÷åì ñëîæåíèå è âû÷èòàíèå, ïîýòîìó îíè âûïîëíÿþòñÿ ïåðâûìè. Åñëè æå äâå îïåðàöèè èìåþò îäèí è òîò æå óðîâåíü ñòàðøèíñòâà, îíè âûïîëíÿþòñÿ â òîì ïîðÿäêå, â êîòîðîì ïðèñóòñòâóþò â îïåðàòîðå. Äëÿ áîëüøèíñòâà îïåðàöèé îáû÷íûé ïîðÿäîê - ñëåâà íàïðàâî. (Îïåðàöèÿ = ÿâëÿåòñÿ èñêëþ÷åíèåì èç ýòîãî ïðàâèëà.) Ïîýòîìó â îïåðàòîðå.
Butter = 25.0 + 60.0 * n / SCALE;
Ïîðÿäîê îïåðàöèé ñëåäóþùèé:
60.0 * n - ïåðâîå óìíîæåíèå (èëè, âîçìîæíî, äåëåíèå) (åñëè n = 6, òî 60.0 * n = 360.0).
360.0/SCALE - âòîðîå óìíîæåíèå (èëè, âîçìîæíî, äåëåíèå) è íàêîíåö (ïîñêîëüêó SCALE = 2.0):
25.0 + 180.0 - ïåðâîå ñëîæåíèå (èëè, âîçìîæíî, âû÷èòàíèå) äàåò 205.0.
Ìíîãèå ïðîãðàììèñòû ïðåäïî÷èòàþò ïðåäñòàâëÿòü ïîðÿäîê âû÷èñëåíèé ñ ïîìîùüþ äèàãðàììû ñïåöèàëüíîãî âèäà, íàçûâàåìîé "ïðàâîì âûðàæåíèÿ". Íèæå ïðèâîäèòñÿ ïðèìåð òàêîé äèàãðàììû. Äèàãðàììà ïîêàçûâàåò, êàê èñõîäíîå âûðàæåíèå ñâîäèòñÿ ê îäíîìó çíà÷åíèþ.
Åñëè âû çàõîòèòå, ñêàæåì, ÷òîáû ñëîæåíèå âûïîëíÿëîñü ïåðåä äåëåíèåì, òîãäà âû äîëæíû äåëàòü òî æå, ÷òî è ìû â ïðèâåäåííîé íèæå ñòðîêå:
Hour = (25.0 + 60.0 * n) / SCALE;
 ïåðâóþ î÷åðåäü âûïîëíÿåòñÿ âñå, ÷òî çàêëþ÷åíî â ñêîáêè; âíóòðè äåéñòâóþò îáû÷íûå ïðàâèëà.  äàííîì ïðèìåðå ñíà÷àëà âû óìíîæåíèå, à çàòåì ñëîæåíèå. Ñ ïîìîùüþ ýòèõ äåéñòâèé âû÷èñëÿåòñÿ âûðàæåíèå â ñêîáêàõ, è òîëüêî ïîòîì ðåçóëüòàò äåëèòñÿ íà çíà÷åíèå êîíñòàíòû SCALE.
Ðèñ. 5.3. Äåðåâüÿ âûðàæåíèé, ïîñòðîåííûå íà îñíîâå îïåðàöèè è îïåðàíäîâ, è ïîðÿäîê âû÷èñëåíèè.
Ìû ìîæåì ñîñòàâèòü òàáëèöó ïðàâèë, êàñàþùèõñÿ óæå èñïîëüçîâàííûõ íàìè îïåðàöèè. (Â ïðèëîæåíèè Â â êîíöå êíèãè ïðèâåäåíà òàáëèöà, ãäå ñîäåðæàòñÿ ïðàâèëà, îòíîñÿùèåñÿ êî âñåì îïåðàöèÿì ÿçûêà Ñè.).
Òàáëèöà 5.1. Îïåðàöèè â ïîðÿäêå óìåíüøåíèÿ óðîâíÿ ñòàðøèíñòâà.
| ÎÏÅÐÀÖÈÈ | ÏÎÐßÄÎÊ ÂÛ×ÈÑËÅÍÈß |
|---|---|
| ( ) | ñëåâà íàïðàâî |
| -(óíàðíûé) | ñëåâà íàïðàâî |
| * / | ñëåâà íàïðàâî |
| + -(âû÷èòàíèå) | ñëåâà íàïðàâî |
| = | ñëåâà íàïðàâî |
Çàìåòèì, ÷òî äâà ðàçëè÷íûõ ïî ñìûñëó óïîòðåáëåíèÿ çíàêà ìèíóñ èìåþò ðàçíûå ïðèîðèòåòû (óðîâíè ñòàðøèíñòâà). Ñòîëáåö "ïîðÿäîê âû÷èñëåíèÿ" óêàçûâàåò, êàê îïåðàöèÿ ñâÿçàíà ñî ñâîèìè îïåðàíäàìè. Íàïðèìåð, óíàðíûé çíàê ìèíóñ ñâÿçàí ñ âåëè÷èíîé, ñòîÿùåé ñïðàâà îò íåãî, à ïðè äåëåíèè ëåâûé îïåðàíä äåëèòñÿ íà ïðàâûé.
Ïîïûòàåìñÿ ïðèìåíèòü ýòè ïðàâèëà íà áîëåå ñëîæíîì ïðèìåðå.
/* ïðèìåíåíèå ïðàâèë ñòàðøèíñòâà */
Main( ).
{
int top, score;
Top = score = -(2 + 5)*6 + (4 + 3*(2 + 3));
Printi("top = %d \n", top);
}
Êàêîå çíà÷åíèå áóäåò âûâåäåíî íà ïå÷àòü â ðåçóëüòàòå ðàáîòû äàííîé ïðîãðàììû? Âíà÷àëå âû÷èñëèòå åãî ñàìè, à çàòåì âûïîëíèòå ïðîãðàììó èëè ïðî÷èòàéòå íèæåñëåäóþùåå îáúÿñíåíèå, ÷òîáû ïðîâåðèòü ñâîé îòâåò. (Íàäååìñÿ, ÷òî âû ïîëó÷èòå ïðàâèëüíûé ðåçóëüòàò.).
Èòàê, âûðàæåíèÿ, ñòîÿùèå â ñêîáêàõ, èìåþò íàèâûñøèé ïðèîðèòåò. Äâèãàÿñü ñëåâà íàïðàâî, âñòðå÷àåì ïåðâîå âûðàæåíèå ñêîáêàõ (2+5). Âû÷èñëÿÿ åãî, ïîëó÷àåì:
Top = score = -7*6 + (4 + 3*(2 + 3)).
Ñëåäóùåå âûðàæåíèå â ñêîáêàõ - ýòî (4 + 3*(2 + 3)). Îòáðàñûâàåì ñêîáêè, ïîëó÷àåì 4 + 3*(2 + 3). Âîò êàê! Åùå îäíè ñêîáêè! Òîãäà ïåðâûì øàãîì ÿâëÿåòñÿ íàõîæäåíèå ñóììû 2+3. Âûðàæåíèå ïðèìåò âèä:
Top = score = -7*6 + (4 + 3*5).
Ìû äîëæíû åùå çàâåðøèòü âû÷èñëåíèå âûðàæåíèÿ â ñêîáêàõ. Ïî-ñêîëüêó óìíîæåíèå * èìååò ïðèîðèòåò áîëåå âûñîêèé, ÷åì ñëîæåíèå, âûðàæåíèå òåïåðü âûãëÿäèò òàê.
Top = score = -7*6 + (4 + 15).
Èìååì.
Top = score = -7*6 + 19.
×òî æå äàëüøå? Åñëè âû ïðåäïîëàãàåòå, ÷òî íóæíî íàéòè ïðîèçâåäåíèå 7*6, òî âû îøèáàåòåñü. Çàìåòèì, ÷òî óíàðíûé ìèíóñ (èçìåíåíèå çíàêà) èìååò áîëåå âûñîêèé ïðèîðèòåò, ÷åì óìíîæåíèå *. Ïîýòîìó ñíà÷àëà ÷èñëî 7 çàìåíÿåòñÿ íà -7, à çàòåì -7 óìíîæàåòñÿ íà 6. Ñòðîêà ïðèìåò âèä:
Top = score = -42 + 19.
Ïîñëå ýòîãî â ðåçóëüòàòå ñëîæåíèÿ ïîëó÷èì.
Tîð = score = -23.
Çàòåì ïåðåìåííîé score ïðèñâàèâàåòñÿ çíà÷åíèå -23, è, íàêîíåö, ïåðåìåííàÿ top ïîëó÷àåò òî æå çíà÷åíèå -23. Íàïîìíèì, ÷òî îïåðàöèÿ = âûïîëíÿåòñÿ ñïðàâà íàëåâî.
ÍÅÊÎÒÎÐÛÅ ÄÎÏÎËÍÈÒÅËÜÍÛÅ ÎÏÅÐÀÖÈÈ.
 ÿçûêå Ñè èìååòñÿ îêîëî 40 îïåðàöèé, íî íåêîòîðûå èç íèõ èñïîëüçóþòñÿ ãîðàçäî ÷àùå, ÷åì äðóãèå. Òå îïåðàöèè, êîòîðûå ìû òîëüêî ÷òî ðàññìîòðåëè, ÿâëÿþòñÿ íàèáîëåå îáùåóïîòðåáèòåëüíûìè. Êðîìå òîãî, íàì õîòåëîñü áû ïðèâåñòè åùå òðè ïîëåçíûå îïåðàöèè.
Îïåðàöèÿ äåëåíèÿ ïî ìîäóëþ: %
Îïåðàöèÿ äåëåíèÿ ïî ìîäóëþ èñïîëüçóåòñÿ â öåëî÷èñëåííîé àðèôìåòèêå. Åå ðåçóëüòàòîì ÿâëÿåòñÿ îñòàòîê îò äåëåíèÿ öåëîãî ÷èñëà, ñòîÿùåãî ñëåâà îò çíàêà îïåðàöèè, íà ÷èñëî, ðàñïîëîæåííîå ñïðàâà îò íåãî. Íàïðèìåð, 13 % 5 (÷èòàåòñÿ êàê "13 ïî ìîäóëþ 5") èìååò çíà÷åíèå 3, ïîñêîëüêó ñïðàâåäëèâî ðàâåíñòâî 13 = 2*5 + 3.
Íå ïûòàéòåñü ïðîèçâîäèòü äàííóþ îïåðàöèþ íàä ÷èñëàìè ñ ïëàâàþùåé òî÷êîé îíà ïðîñòî íå áóäåò âûïîëíÿòüñÿ.
Íà ïåðâûé âçãëÿä ýòà îïåðàöèÿ ìîæåò ïîêàçàòüñÿ íåêîòîðûì ýêçîòè÷åñêèì ñðåäñòâîì, èñïîëüçóåìûì ëèøü ìàòåìàòèêàìè, íî íà ñàìîì äåëå îíà ïðèìåíÿåòñÿ íà ïðàêòèêå è äîâîëüíî óäîáíà ïðè ïðîãðàììèðîâàíèè ðÿäà çàäà÷. Îäíî øèðîêî ðàñïðîñòðàíåííîå ïðèìåíåíèå - ñîäåéñòâèå ïîëüçîâàòåëþ â óïðàâëåíèè õîäîì ïðîãðàììû. Ïðåäïîëîæèì, íàïðèìåð, ÷òî âû ïèøèòå ïðîãðàììó îáðàáîòêè ñ÷åòîâ, êîòîðàÿ äîëæíà ïðåäóñìàòðèâàòü äîïîëíèòåëüíóþ ïëàòó ðàç â òðè ìåñÿöà. Äëÿ ýòîãî íóæíî òîëüêî âû÷èñëèòü îñòà òîê îò äåëåíèÿ íîìåðà ìåñÿöà íà 3 (ò.å. month % 3), ïðîâåðèòü, ðàâåí ëè ðåçóëüòàò 0, è, åñëè ðàâåí, äîáàâèòü ê ñ÷åòó âåëè÷èíó äîïîëíèòåëüíîé ïëàòû. Ïîñëå òîãî êàê âû ïîçíàêîìèëèñü ñ "îïåðàòîðîì if", âû ñìîæåòå ëó÷øå ïðåäñòàâèòü ñåáå, êàê âñå ýòî ðàáîòàåò.
Ïðèâåäåì ïðèìåð ïðîãðàììû, èñïîëüçóþùåé îïåðàöèþ %
/* ñåêóíäû â ìèíóòû */
/* ïåðåâîäèò ñåêóíäû â ìèíóòû è ñåêóíäû */
#define SM 60 /* ÷èñëî ñåêóíä â ìèíóòå */
Main( ).
{
Int sec, mm, left;
Printf(" Ïåðåâîä ñåêóíä â ìèíóòû è ñåêóíäû ! \n");
Printf(" Óêàæèòå ÷èñëî ñåêóíä, êîòîðîå âû õîòåëè áû ïåðåâåñòè â ìèíóòû \n" );
Scanf(" %d", &sec); /* ââîä ÷èñëà ñåêóíä */
Mm = sec % SM; /* ÷èñëî ìèíóò */
Left = sec % SM; /* îñòàâøååñÿ ÷èñëî ñåêóíä */
Printf(" %d ñåêóíäû ýòî %d ìèíóòû, %d ñåêóíäû \n", sec, mm, left);
}
Âîò ðåçóëüòàò åå ðàáîòû.
Ïåðåâîä ñåêóíä â ìèíóòû è ñåêóíäû!
Óêàæèòå ÷èñëî ñåêóíä, êîòîðîå âû õîòåëè áû ïåðåâåñòè â ìèíóòû.
234.
234 ñåêóíäû ýòî 3 ìèíóòû 54 ñåêóíäû.
Íåäîñòàòêîì ýòîé äèàëîãîâîé ïðîãðàììû ÿâëÿåòñÿ òî, ÷òî îíà îáðàáàòûâàåò òîëüêî îäíó âõîäíóþ âåëè÷èíó. Ñóìååòå ëè âû ñàìè èçìåíèòü ïðîãðàììó òàê, ÷òîáû îíà ïðåäëàãàëà âàì ââîäèòü íîâûå çíà÷åíèÿ? Ìû âåðíåìñÿ ê ýòîé çàäà÷å â ðàçäåëå âîïðîñîâ â êîíöå ãëàâû, íî, åñëè âû íàéäåòå ñâîå ñîáñòâåííîå ðåøåíèå, ìû áóäåì î÷åíü ðàäû.
Îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ: ++ è --
Îïåðàöèÿ óâåëè÷åíèÿ îñóùåñòâëÿåò ñëåäóþùåå ïðîñòîå äåéñòâèå: îíà óâåëè÷èâàåò çíà÷åíèå ñâîåãî îïåðàíäà íà åäèíèöó. Ñóùåñòâóþò äâå âîçìîæíîñòè èñïîëüçîâàíèÿ äàííîé îïåðàöèè, ïåðâàÿ:
êîãäà ñèìâîëû ++ íàõîäÿòñÿ ñëåâà îò ïåðåìåííîé (îïåðàíäà), - "ïðåôèêñíàÿ" ôîðìà,
È âòîðàÿ:
êîãäà ñèìâîëû ++ ñòîÿò ñïðàâà îò ïåðåìåííîé, - "ïîñòôèêñíàÿ" ôîðìà.
Ýòè äâå ôîðìû óêàçàííîé îïåðàöèè ðàçëè÷àþòñÿ ìåæäó ñîáîé òîëüêî òåì, â êàêîé ìîìåíò îñóùåñòâëÿåòñÿ óâåëè÷åíèå îïåðàíäà. Ñíà÷àëà ìû îáñóäèì ñõîäñòâî óêàçàííûõ äâóõ ôîðì, à çàòåì âåðíåìñÿ ê ðàçëè÷èÿì. Êîðîòêèé ïðèìåð, ïðèâåäåííûé íèæå, ïîêàçûâàåò, êàê âûïîëíÿåòñÿ äàííàÿ îïåðàöèÿ.
/*âûïîëíåíèå ñëîæåíèÿ */
Main( ) /*óâåëè÷åíèå ïðåôèêñíàÿ è ïîñòôèêñíàÿ ôîðìû */
{
Int ultra = 0, super = 0;
while (super < 6).
{
super++;
++ultra;
printf(" super = %d, ultra = %d\n", super, ultra);
}
}
Ðåçóëüòàòû ðàáîòû ïðîãðàììû "âûïîëíåíèå ñëîæåíèÿ" âûãëÿäÿò ñëåäóþùèì îáðàçîì.
Super = 1, ultra = 1.
Super = 2, ultra = 2.
Super = 3, ultra = 3.
Super = 4, ultra = 4.
Super = 5, ultra = 5.
Âîò ýòî äà! Ìû äîñ÷èòàëè äî 5! Äâàæäû! Îäíîâðåìåííî! (Åñëè âû çàõîòèòå ñ÷èòàòü äàëüøå, âàì íåîáõîäèìî áóäåò òîëüêî èçìåíèòü ïàðàìåòð, îïðåäåëÿþùèé âåðõíèé ïðåäåë ñ÷åòà â îïåðàòîðå while).

Ïðèçíàåìñÿ, ÷òî ìû ìîãëè áû ïîëó÷èòü òîò æå ðåçóëüòàò, çàìåíèâ äâà îïåðàòîðà óâåëè÷åíèÿ ñëåäóþùèìè îïåðàòîðàìè ïðèñâàèâàíèÿ.
Super = super + 1, ultra = ultra + 1,
Äàííûå îïåðàòîðû âûãëÿäÿò äîñòàòî÷íî ïðîñòûìè.  ñâÿçè ñ ýòèì âîçíèêàåò âîïðîñ, çà÷åì íóæåí åùå îäèí äîïîëíèòåëüíûé îïåðàòîð, íå ãîâîðÿ óæå î äâóõ, äà åùå â ñîêðàùåííîé ôîðìå?
Âî-ïåðâûõ, êîìïàêòíàÿ ôîðìà äåëàåò âàøè ïðîãðàììû áîëåå èçÿùíûìè è ëåãêèìè äëÿ ïîíèìàíèÿ. Ýòè îïåðàöèè ïðèäàþò èì áëåñê, ÷òî ïðèÿòíî ñàìî ïî ñåáå.
Íàïðèìåð, ìû ìîæåì ïåðåïèñàòü ÷àñòü ïðîãðàììû "ðàçìåð îáóâè2" ñëåäóþùèì îáðàçîì.
Size = 3.0;
While(size < 18.5) {foot = SCALE*size + OFFSET;printf("%10.1f %20.2f äþéìîâ\n", size, foot);++size;}.
Ïðè ýòîì ñïîñîáå ìû åùå íå âîñïîëüçîâàëèñü âñåìè ïðåèìóùåñòâàìè îïåðàöèè óâåëè÷åíèÿ. Ìû ìîæåì ñîêðàòèòü äàííûé ôðàãìåíò òàê.
Size = 2.0;while(++size < 18.5) {
Foot = SCALE *size + OFFSET;
Printf( %10.1f %20.2f äþéìà\n" , size, foot);
}
Çäåñü ìû îáúåäèíèëè â îäíîì âûðàæåíèè îïåðàöèþ óâåëè÷åíèÿ ïåðåìåííîé íà 1 è ïðîâåðêó èñòèííîñòè óñëîâèÿ â îïåðàöèè while. Ïîäîáíîãî òèïà êîíñòðóêöèÿ íàñòîëüêî ÷àñòî âñòðå÷àåòñÿ â ÿçûêå Ñè, ÷òî çàñëóæèâàåò áîëåå ïîäðîáíîãî ðàññìîòðåíèÿ. Âî-ïåðâûõ, êàê îíà ðàáîòàåò. Î÷åíü ïðîñòî çíà÷åíèå ïåðåìåííîé size óâåëè÷èâàåòñÿ íà åäèíèöó, à çàòåì ñðàâíèâàåòñÿ ñ 18.5. Åñëè îíî ìåíüøå, òî âûïîëíÿþòñÿ îïåðàòîðû, çàêëþ÷åííûå â ôèãóðíûå ñêîáêè. Ïîñëå ýòîãî ïåðåìåííàÿ size óâåëè÷èâàåòñÿ íà åäèíèöó îäèí ðàç è ò. ä. Äàííûé öèêë ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà çíà÷åíèå ïåðåìåííîé size íå ñòàíåò ñëèøêîì áîëüøèì. Ìû èçìåíèëè çíà÷åíèå ïåðåìåííîé size ñ 3.0 íà 2.0, ÷òîáû ñêîìïåíñèðîâàòü óâåëè÷åíèå ïåðåìåííîé size ïåðåä åå ïåðâîíà÷àëüíûì èñïîëüçîâàíèåì äëÿ âû÷èñëåíèÿ ïåðåìåííîé foot.
ÐÈÑ. 5.4. Âûïîëíåíèå îäíîãî øàãà öèêëà.
Âî-ïåðâûõ, ÷åì íàñ ïðèâëåêàåò ýòîò ñïîñîá? Ñâîåé êîìïàêòíîñòüþ. Êðîìå òîãî (÷òî åùå áîëåå âàæíî), ñ åãî ïîìîùüþ ìîæíî îáúåäèíèòü â îäíîì âûðàæåíèè äâà ïðîöåññà, óïðàâëÿþùèå öèêëîì. Ïåðâûé ïðîöåññ - ýòî ïðîâåðêà, ìîæíî ïðîäîëæàòü èëè íåò?  äàííîì ñëó÷àå ïðîâåðÿåòñÿ, ìåíüøå ëè ðàçìåð îáóâè 18.5. Âòîðîé ïðîöåññ çàêëþ÷àåòñÿ â èçìåíåíèè ïåðåìåííîé, çíà÷åíèå êîòîðîé ïðîâåðÿåòñÿ, - â äàííîì ñëó÷àå ðàçìåð îáóâè óâåëè÷èâàåòñÿ íà 1. Ïðåäïîëîæèì, ìû çàáûëè èçìåíèòü åå çíà÷åíèå. Òîãäà ïåðåìåííàÿ size âñåãäà áóäåò ìåíüøå 18.5, è âûïîëíåíèå öèêëà íèêîãäà íå çàêîí÷èòñÿ. Ïðè âûïîëíåíèè ïðîãðàììû êîìïüþòåð, "ïîéìàííûé â áåñêîíå÷íûé öèêë", áóäåò âûâîäèòü íà ïå÷àòü îäíó çà äðóãîé èäåíòè÷íûå ñòðîêè.  êîíöå êîíöîâ âû ìîæåòå ïîòåðÿòü èíòåðåñ, îæèäàÿ ðåçóëüòàòîâ, è äîëæíû áóäåòå êàêèì-òî îáðàçîì ïðåêðàòèòü âûïîëíåíèå ïðîãðàììû. Íàëè÷èå ïðîâåðêè è èçìåíåíèÿ ïàðàìåòðà öèêëà â îäíîì âûðàæåíèè ïîìîãàåò ïðîãðàììèñòàì íå çàáûâàòü ââîäèòü â ïðîãðàììó êîððåêöèþ ïàðàìåòðà öèêëà.
Äîïîëíèòåëüíîå ïðåèìóùåñòâî èñïîëüçîâàíèÿ îïåðàöèè óâåëè÷åíèÿ çàêëþ÷àåòñÿ â òîì, ÷òî îáû÷íî â ðåçóëüòàòå êîìïèëÿöèè ïîëó÷àåòñÿ íåñêîëüêî áîëåå ýôôåêòèâíûé îáúåêòíûé êîä, ïîñêîëüêó îíà èäåíòè÷íà ñîîòâåòñòâóþùåé ìàøèííîé êîìàíäå.
È, íàêîíåö, ýòè îïåðàöèè èìåþò åùå îäíó îñîáåííîñòü, êîòîðóþ ìîæíî èñïîëüçîâàòü â ðÿäå çàòðóäíèòåëüíûõ ñèòóàöèé. ×òîáû óçíàòü, ÷òî ýòî çà îñîáåííîñòü, ïîïðîáóéòå âûïîëíèòü ñëåäóþùóþ ïðîãðàììó:
Main( ).
{
Int a = 1, b = 1;
Int aplus, plusb;
Aplus = a++; /* ïîñòôèêñíàÿôîðìà*/
Plusb = ++b; /* ïðåôèêñíàÿôîðìà*/
Printf(" a aplus b plusb \n");
Printf("%5d %5d %5d %5d\n", a, aplus, b, plusb);
}
Åñëè âû âñå ñäåëàëè ïðàâèëüíî, òî, íàñêîëüêî ìû ïîìíèì, â êà÷åñòâå ðåçóëüòàòà âû äîëæíû ïîëó÷èòü ñëåäóþùèå ñòðîêè.
À aplus b plusb.
2 1 2 2.
Êàê è ïðåäïîëàãàëîñü, çíà÷åíèÿ îáåèõ ïåðåìåííûõ, à è b, óâåëè÷èëèñü íà 1. Îäíàêî ïåðåìåííîé aplus çíà÷åíèå à áûëî ïðèñâîåíî ïåðåä èçìåíåíèåì à, â òî âðåìÿ êàê ïåðåìåííîé plusb çíà÷åíèå b áûëî ïðèñâîåíî ïîñëå èçìåíåíèÿ b.  ýòîì è çàêëþ÷àåòñÿ ðàçíèöà ìåæäó ïðåôèêñíîé è ïîñòôèêñíîé ôîðìàìè.
Aplus = à++ - ïîñòôèêñ: ïåðåìåííàÿ à èçìåíÿåòñÿ ïîñëå òîãî êàê åå çíà÷åíèå èñïîëüçóåòñÿ.
Plusb = ++b - ïðåôèêñ: ïåðåìåííàÿ b èçìåíÿåòñÿ ïåðåä òåì êàê åå çíà÷åíèå èñïîëüçóåòñÿ.
ÐÈÑ. 5.5. Ïðåôèêñíàÿ è ïîñòôèêñíàÿ ôîðìû.
 òåõ ñëó÷àÿõ, êîãäà îäíà èç ýòèõ îïåðàöèé óâåëè÷åíèÿ èñïîëüçóåòñÿ ñàìà ïî ñåáå, êàê, íàïðèìåð, â îïåðàòîðå ego++, íå èìååò çíà÷åíèÿ, êàêîé ôîðìîé âû ïîëüçóåòåñü. Âûáîð ïðèîáðåòàåò ñìûñë, êîãäà îïåðàöèÿ, è åå îïåðàíä ÿâëÿþòñÿ ÷àñòüþ íåêîòîðîãî "âûñøåãî" âûðàæåíèÿ, êàê, íàïðèìåð, â îïåðàòîðàõ ïðèñâàèâàíèÿ, êîòîðûå ìû òîëüêî ÷òî ðàññìàòðèâàëè.  ïîäîáíîé ñèòóàöèè íåîáõîäèìî èìåòü ïðåäñòàâëåíèå î ðåçóëüòàòå, êîòîðûé âàì õîòåëîñü áû ïîëó÷èòü. Íàïîìíèì, íàïðèìåð, ñëåäóþùèé îïåðàòîð:
While(++size < 18.5).
Ïðè åãî èñïîëüçîâàíèè ìû ïîëó÷èëè òàáëèöó ïåðåâîäà âïëîòü äî ðàçìåðà 18. Íî, åñëè áû ìû âìåñòî ýòîãî çàïèñàëè îïåðàöèþ óâåëè÷åíèÿ â âèäå size++, â òàáëèöó ïîïàë áû è ðàçìåð 19, ïîñêîëüêó çíà÷åíèå ïåðåìåííîé size óâåëè÷èâàëîñü áû ïîñëå ñðàâíåíèÿ, à íå äî ýòîãî.
Êîíå÷íî, âû ìîãëè áû èñïîëüçîâàòü ìåíåå êðàñèâûé ñïîñîá - îïåðàòîð ïðèñâàèâàíèÿ.
Size = size +1;
Òîãäà íèêòî íå ïîâåðèò âàì, ÷òî âû óìååòå ïî-íàñòîÿùåìó ïðîãðàììèðîâàòü íà ÿçûêå Ñè.
Äóìàåì, ÷òî ïðè ÷òåíèè êíèãè âû óæå îáðàòèëè âíèìàíèå íà ïðèâåäåííûå ïðèìåðû èñïîëüçîâàíèÿ îïåðàöèé óâåëè÷åíèÿ. Êàê âû äóìàåòå, ìîãëè ëè ìû âñåãäà ïîëüçîâàòüñÿ ëþáîé èç íèõ èëè âíåøíèå óñëîâèÿ äèêòîâàëè íàì êîíêðåòíûé âûáîð? Ãîâîðÿ î ïðèìåðàõ, íàì íåîáõîäèìî ïðèâåñòè åùå îäèí.
Ñïÿò ëè êîãäà-íèáóäü êîìïüþòåðû? Êîíå÷íî, ñïÿò, íî îíè îáû÷íî íå ðàññêàçûâàþò íàì îá ýòîì. Ïðîãðàììà, ïðèâåäåííàÿ íèæå ïîêàçûâàåò, ÷òî ïðîèñõîäèò â äåéñòâèòåëüíîñòè.
/* îâöû */
#define MAX 40.
Main( ).
{
int count = 0,
Printf(" ß ñ÷èòàþ îâåö, ÷òîáû óñíóòü \n");
While(++ count < MAX).
Printf(" %d ìèëëèîíîâ îâåö, à ÿ åùå íå óñíóë \n", count);
Printf(" %d ìèëëèîíîâ îâåö, à ÿ õð-ð-ð ð \n" , count);
}
Ïîïðîáóéòå âûïîëíèòü åå è ïîñìîòðèòå, ðàáîòàåò ëè îíà òàê, êàê äîëæíà ïî âàøåìó ìíåíèþ. Êîíå÷íî, çíà÷åíèå êîíñòàíòû ÌÀÕ äëÿ âàøåãî êîìïüþòåðà ìîæíî âçÿòü äðóãèì. (Êñòàòè, ÷òî ïðîèçîéäåò ïðè çàìåíå ïðåôèêñíîé ôîðìû îïåðàöèè óâåëè÷åíèÿ ïîñòôèêñíîé ôîðìîé?).
Îïåðàöèÿ óìåíüøåíèÿ: --
Êàæäîé îïåðàöèè óâåëè÷åíèÿ ñîîòâåòñòâóåò íåêîòîðàÿ îïåðàöèÿ óìåíüøåíèÿ, ïðè ýòîì âìåñòî ñèìâîëîâ ++ ìû èñïîëüçóåì --
-- count, /* ïðåôèêñíàÿ ôîðìà îïåðàöèè óìåíüøåíèÿ */
Count --, /* ïîñòôèêñíàÿ ôîðìà îïåðàöèè óìåíüøåíèÿ */
Íèæå ïðèâîäèòñÿ ïðèìåð, èëëþñòðèðóþùèé, êàê ìàøèíû ìîãóò áûòü çàêîí÷åííûìè ëèðèêàìè.
/* áóòûëêè*/
#define MAX 100.
Main( ).
{
Int count = MAX + 1;
While(-- count > 0).
{
printf(" %d áóòûëîê ïèâà íà ïîëêå, %d áóòûëîê ïèâà!\n", count, count);
printf(" Ñíèìè îäíó è ïóñòè åå ïî êðóãó, \n");
printf("%d áóòûëîê ïèâà! \n \n", count-1); }}.
Íà÷àëüíûå ðåçóëüòàòû âûãëÿäÿò òàê:
100 áóòûëîê ïèâà íà ïîëêå, 100 áóòûëîê ïèâà!
Ñíèìè îäíó è ïóñòè åå ïî êðóãó,
99 áóòûëîê ïèâà!
99 áóòûëîê ïèâà íà ïîëêå, 99 áóòûëîê ïèâà!
Ñíèìè îäíó è ïóñòè åå ïî êðóãó,98 áóòûëîê ïèâà!
Ïîñòåïåííî êîëè÷åñòâî áóòûëîê ñõîäèò íà íåò, è ïðîãðàììà çàâåðøèò ñâîþ ðàáîòó ñëåäóþùèì îáðàçîì.
1 áóòûëîê ïèâà íà ïîëêå, 1 áóòûëîê ïèâà!
Ñíèìè îäíó è ïóñòè åå ïî êðóãó,
0 áóòûëîê ïèâà!
Ïî-âèäèìîìó, ó íàøåãî çàêîí÷åííîãî ëèðèêà èìåþòñÿ òðóäíîñòè ñî ñêëîíåíèåì ñóùåñòâèòåëüíûõ ñ êîëè÷åñòâåííûìè ÷èñëèòåëüíûìè, íî ýòî ìîæíî óñòðàíèòü, èñïîëüçóÿ óñëîâíûå îïåðàòîðû, ïîêàçûâàåìûå â ãë. 7. Íåîáõîäèìî çàìåòèòü, ÷òî ñìûñë îïåðàöèè > ñëîâàìè âûðàæàåòñÿ êàê "áîëüøå". Òàê æå êàê è îïåðàöèÿ <, îíà ÿâëÿåòñÿ "îïåðàöèåé îòíîøåíèÿ". Ïîäðîáíåå îïåðàöèè îòíîøåíèÿ ìû ðàññìîòðèì âíèçó.
Ñòàðøèíñòâî îïåðàöèé.
 ñîîòâåòñòâèè ñ ïðèíÿòûì â ÿçûêå Ñè ïîðÿäêîì âû÷èñëåíèé îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ èìåþò î÷åíü âûñîêèé óðîâåíü ñòàðøèíñòâà; òîëüêî êðóãëûå ñêîáêè îáëàäàþò áîëåå âûñîêèì ïðèîðèòåòîì. Ïîýòîìó âûðàæåíèå x*y++ îçíà÷àåò (x)*(y++), à íå (x*y)++, ÷òî î÷åíü óäîáíî, ïîñêîëüêó ïîñëåäíåå âûðàæåíèå ñìûñëà íå èìååò. (Îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ ïðèìåíÿþòñÿ ê ïåðåìåííîé, â òî âðåìÿ êàê ïðîèçâåäåíèå õ*ó ñàìî ïî ñåáå íå ÿâëÿåòñÿ ïåðåìåííîé â îòëè÷èå îò ñîìíîæèòåëåé).
Íå ïóòàéòå òîëüêî ñòàðøèíñòâî ýòèõ îïåðàöèé ñ ïîðÿäêîì âû÷èñëåíèé. Ïðåäïîëîæèì, ó íàñ åñòü ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ:
Y = 2;
N = 3;
Nextnum = (ó + n ++ )*6;
Êàêîå çíà÷åíèå ïðèìåò ïåðåìåííàÿ nextnum? Ïîäñòàâëÿÿ â âûðàæåíèå ñîîòâåòñòâóþùèå çíà÷åíèÿ, ïîëó÷àåì.
Nextnum = (2 + 3)*6= 5*6 = 30.
Òîëüêî ïîñëå òîãî êàê âûðàæåíèå âû÷èñëåíî, çíà÷åíèå ïåðåìåííîé n óâåëè÷èâàåòñÿ äî 4. Ñòàðøèíñòâî îïåðàöèé ãîâîðèò, ÷òî îïåðàöèÿ ++ èìååò îòíîøåíèå òîëüêî ê n; êðîìå òîãî, îíî óêàçûâàåò, êîãäà çíà÷åíèå ïåðåìåííîé n èñïîëüçóåòñÿ ïðè âû÷èñëåíèè âûðàæåíèÿ, íî ìîìåíò èçìåíåíèÿ çíà÷åíèÿ n îïðåäåëÿåòñÿ ñåìàíòèêîé äàííîé îïåðàöèè.
Íå áóäüòå ñëèøêîì óìíûìè.
Âû ìîæåòå ïîïàñòü â ãëóïîå ïîëîæåíèå, åñëè ïîïûòàåòåñü èñïîëüçîâàòü îïåðàöèþ óâåëè÷åíèÿ â íåïîäõîäÿùèõ ñëó÷àÿõ. Íàïðèìåð, âû ìîãëè áû çàõîòåòü óëó÷øèòü íàøó ïðîãðàììó âûâîäà íà ïå÷àòü öåëûõ ÷èñåë è èõ êâàäðàòîâ, çàìåíèâ èìåþùèéñÿ òàì öèêë while ñëåäóþùåé êîíñòðóêöèåé :
While (num < 21).
{
Printf("%10d %10d\n", num*num++);
}
Ýòà ìîäèôèêàöèÿ âûãëÿäèò ðàçóìíîé. Ìû ïå÷àòàåì ÷èñëî num, óìíîæàåì åãî ñàìî íà ñåáÿ, ÷òîáû ïîëó÷èòü åãî êâàäðàò, à çàòåì óâåëè÷èâàåì çíà÷åíèå num íà åäèíèöó. Íà íåêîòîðûõ ìàøèíàõ ýòà ïðîãðàììà äàæå ìîæåò ðàáîòàòü. Íî íå íà âñåõ. Ïðîáëåìà ñîñòîèò â òîì, ÷òî ïðè âûïîëíåíèè ôóíêöèè printf(), êîãäà îïðåäåëÿþòñÿ ïå÷àòàåìûå çíà÷åíèÿ, âû÷èñëåíèå ïîñëåäíåãî àðãóìåíòà ìîæåò âûïîëíèòüñÿ ñíà÷àëà, è ïðèðàùåíèå ïåðåìåííîé n ïðîèçîéäåò äî òîãî, êàê áóäåò îïðåäåëåí ïåðâûé àðãóìåíò. Ïîýòîìó, âìåñòî, ñêàæåì, òàêîé ñòðîêè.
5.
Áóäåò íàïå÷àòàíî.
6.
Ïðàâèëà ÿçûêà Ñè ïðåäîñòàâëÿþò êîìïèëÿòîðó âîçìîæíîñòü âûáðàòü, êàêîé àðãóìåíò ôóíêöèè âû÷èñëÿòü ïåðâûì, ýòî ïîâûøàåò ýôôåêòèâíîñòü ðàáîòû êîìïèëÿòîðà, íî ìîæåò ïðèâîäèòü è ê íåêîòîðûì ïðîáëåìàì, åñëè îïåðàöèÿ óâåëè÷åíèÿ âûïîëíÿåòñÿ íàä îäíèì èç àðãóìåíòîâ ôóíêöèè.
Äðóãèì âîçìîæíûì èñòî÷íèêîì íåïðèÿòíîñòåé ñëóæèò îïåðàòîð âèäà.
Ans = num/2 + 5*(1 + num++);
Îïÿòü ïðîáëåìà çàêëþ÷àåòñÿ â òîì, ÷òî êîìïèëÿòîð ìîæåò âûïîëíÿòü äåéñòâèÿ íå â òîì ïîðÿäêå, êîòîðûé âû îæèäàëè. Âû ìîæåòå ñ÷èòàòü, íàïðèìåð, ÷òî ñíà÷àëà îí îïðåäåëèò çíà÷åíèå num/2, à çàòåì ïåðåéäåò ê äðóãîé ÷àñòè âûðàæåíèÿ. Íî êîìïèëÿòîð ìîæåò âû÷èñëèòü ñíà÷àëà ïîñëåäíèé ÷ëåí, óâåëè÷èòü ïåðåìåííîþ num, à çàòåì èñïîëüçîâàòü íîâîå çíà÷åíèå ïðè íàõîæäåíèè num/2. Íèêàêîé ãàðàíòèè â ýòîì ñëó÷àå íå ñóùåñòâóåò.
Èçáåæàòü ýòè òðóäíîñòè äîñòàòî÷íî ïðîñòî:
1. Íå ïðèìåíÿéòå îïåðàöèè óâåëè÷åíèÿ èëè óìåíüøåíèÿ ê ïåðåìåííîé ïðèñóòñòâóþùåé â áîëåå ÷åì îäíîì àðãóìåíòå ôóíêöèè.
2. Íå ïðèìåíÿéòå îïåðàöèè óâåëè÷åíèÿ èëè óìåíüøåíèÿ ê ïåðåìåííîé, êîòîðàÿ âõîäèò â âûðàæåíèå áîëåå îäíîãî ðàçà.
ÂÛÐÀÆÅÍÈß È ÎÏÅÐÀÒÎÐÛ.
Ìû èñïîëüçîâàëè òåðìèíû "âûðàæåíèå" è "îïåðàòîð" íà ïðîòÿæåíèè âñåõ ïåðâûõ ãëàâ; òåïåðü íàñòàëî âðåìÿ èçó÷èòü èõ áîëåå ïîäðîáíî. Îïåðàòîðû ñëóæàò îñíîâíûìè ýëåìåíòàìè, èç êîòîðûõ ñòðîèòñÿ ïðîãðàììà íà ÿçûêå Ñè; áîëüøèíñòâî æå îïåðàòîðîâ ñîñîñòîèò èç âûðàæåíèé. Èñõîäÿ èç ýòîãî, âíà÷àëå ðàçóìíî ðàññìîòðåòü âûðàæåíèÿ, ÷òî ìû è ñäåëàåì.
Âûðàæåíèÿ.
Âûðàæåíèå ïðåäñòàâëÿåò ñîáîé îáúåäèíåíèå îïåðàöèé è îïåðàíäîâ. (Íàïîìíèì, ÷òî îïåðàíäîì íàçûâàåòñÿ òî, íàä ÷åì âûïîëíÿåòñÿ îïåðàöèÿ.) Ïðîñòåéøåå âûðàæåíèå ñîñòîèò èç îäíîãî îïåðàíäà, îòòàëêèâàÿñü îò íåãî, âû ìîæåòå ñòðîèòü áîëåå ñëîæíûå êîíñòðóêöèè. Ïðèâåäåì íåñêîëüêî âûðàæåíèé.
4.
-64+21.
A*(b + c/d)/20.
Q = 5*2.
Õ = ++q % 3 q > 3.
Íåòðóäíî çàìåòèòü, ÷òî îïåðàíäû ìîãóò áûòü êîíñòàíòàìè, ïåðåìåííûìè èëè èõ ñî÷åòàíèÿìè. Íåêîòîðûå âûðàæåíèÿ ñîñòîÿò èç ìåíüøèõ âûðàæåíèé, êîòîðûå ìû ìîæåì íàçâàòü ïîäâûðàæåíèÿìè. Íàïðèìåð, ñ/d - ýòî ïîäâûðàæåíèå â íàøåì ÷åòâåðòîì ïðèìåðå.
Âàæíûì ñâîéñòâîì ÿçûêà Ñè ÿâëÿåòñÿ òî, ÷òî êàæäîå âûðàæåíèå â Ñè èìååò çíà÷åíèå. ×òîáû îïðåäåëèòü ýòî çíà÷åíèå, ìû âûïîëíÿåì îïåðàöèè â ïîðÿäêå, îïðåäåëÿåìîì óðîâíÿìè ñòàðøèíñòâà. Çíà÷åíèÿ ïåðâûõ íåñêîëüêèõ âûðàæåíèé î÷åâèäíû, íî ÷òî ìîæíî ñêàçàòü îòíîñèòåëüíî âûðàæåíèé ñî çíàêîì = ? Îíè ïðîñòî èìåþò òå æå çíà÷åíèÿ, ÷òî è ïåðåìåííàÿ, ñòîÿùàÿ ñëåâà îò çíàêà =. Ýòà ïåðåìåííàÿ ïîëó÷àåò åãî â ðåçóëüòàòå âû÷èñëåíèÿ âûðàæåíèÿ, ñòîÿùåãî ñïðàâà îò çíàêà. À âûðàæåíèå q > 0? Ïîäîáíîå âûðàæåíèå, ñâÿçàííîå ñ îïåðàöèåé îòíîøåíèÿ, èìååò çíà÷åíèå 1, åñëè îíî èñòèííî, è 0, åñëè îíî ëîæíî. Ïðèâåäåì íåñêîëüêî âûðàæåíèè è èõ çíà÷åíèÿ.
Âûðàæåíèå Çíà÷åíèå.
-4+6 2.
Ñ = 3 + 8 11.
5 > 3 1.
6 + (ñ = 3 + 8) 17.
Ïîñëåäíèé ïðèìåð âûãëÿäèò äîâîëüíî ñòðàííî. Íî îí ïîëíîñòüþ ñîîòâåòñòâóåò ïðàâèëàì ÿçûêà Ñè, ïîñêîëüêó äàííîå âûðàæåíèå ïðåäñòàâëÿåò ñîáîé ñóììó äâóõ ïîäâûðàæåíèè, êàæäîå èç êîòîðûõ èìååò çíà÷åíèå.
Îïåðàòîðû.
Îïåðàòîðû ñëóæàò îñíîâíûìè ñòðîèòåëüíûìè áëîêàìè ïðîãðàììû. Ïðîãðàììà ñîñòîèò èç ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ ñ äîáàâëåíèåì íåáîëüøîãî êîëè÷åñòâà çíàêîâ ïóíêòóàöèè. Îïåðàòîð ÿâëÿåòñÿ çàêîí÷åííîé èíñòðóêöèåé äëÿ êîìïüþòåðà.  ÿçûêå Ñè óêàçàíèåì íà íàëè÷èå îïåðàòîðà ñëóæèò ñèìâîë "òî÷êà ñ çàïÿòîé", ñòîÿùèé â êîíöå íåãî. Ïîýòîìó.
Legs = 4.
Ýòî âñåãî ëèøü âûðàæåíèå (êîòîðîå ìîæåò áûòü ÷àñòüþ áîëüøåãî âûðàæåíèÿ), íî.
Legs = 4;
ßâëÿåòñÿ îïåðàòîðîì. ×òî äåëàåò èíñòðóêöèþ çàêîí÷åííîé? Îíà äîëæíà âûïîëíÿòü íåêîòîðîå äåéñòâèå ïîëíîñòüþ. Âûðàæåíèå.
2 + 2.
Íå ÿâëÿåòñÿ çàêîí÷åííîé èíñòðóêöèåé, à ñëóæèò óêàçàíèåì êîìïüþòåðó ñëîæèòü 2 è 2, íî íå ãîâîðèò, ÷òî äåëàòü ñ ðåçóëüòàòîì.
Kids = 2 + 2;
Ñëóæèò óêàçàíèåì êîìïèëÿòîðó (à çàòåì êîìïüþòåðó) ïîìåñòèòü ðåçóëüòàò (4) â ÿ÷åéêó ïàìÿòè, ïîìå÷åííóþ èìåíåì kids. Ïîñëå çàïèñè â ïàìÿòü ÷èñëà 4 êîìïüþòåð ìîæåò ïðèñòóïèòü ê âûïîëíåíèþ ñëåäóþùèõ äåéñòâèé.
Äî ñèõ ïîð ìû ïîçíàêîìèëèñü ñ ÷åòûðüìÿ òèïàìè îïåðàòîðîâ. Äàëåå ïðèâîäèòñÿ êðàòêèé ïðèìåð, â êîòîðîì èñïîëüçóþòñÿ âñå ÷åòûðå òèïà.
/ * ñóììà */
Main( ) /* íàõîæäåíèå ñóììû ïåðâûõ 20 öåëûõ ÷èñåë */
{
Int count, sum; /* îïåðàòîð îïèñàíèÿ */
Count = 0; /* îïåðàòîð ïðèñâàèâàíèÿ */
sum = 0; /* òî æå ñàìîå */
while(count++ < 20) /* while */
sum = sum + count; /* îïåðàòîð*/
Printf (" sum = %d\n" , sum); /* âûçîâôóíêöèè*/
}
Äàâàéòå îáñóäèì ýòîò ïðèìåð. Ê äàííîìó ìîìåíòó îïåðàòîð îïèñàíèÿ äîëæåí áûòü âàì óæå äîâîëüíî õîðîøî çíàêîì. Òåì íå ìåíåå ìû íàïîìíèì, ÷òî ñ åãî ïîìîùüþ îïðåäåëÿþòñÿ èìåíà è òèïû ïåðåìåííûõ è èì îòâîäÿòñÿ ÿ÷åéêè ïàìÿòè.
Îïåðàòîð ïðèñâàèâàíèÿ - ýòî îñíîâíàÿ ðàáî÷àÿ ñèëà áîëüøèíñòâà ïðîãðàìì ñ åãî ïîìîùüþ ïåðåìåííîé ïðèñâàèâàåòñÿ íåêîòîðîå çíà÷åíèå. Îí ñîñòîèò èç èìåíè ïåðåìåííîé, çà êîòîðûì ñëåäóåò çíàê îïåðàöèè ïðèñâàèâàíèÿ (=), à çàòåì âûðàæåíèå, îêàí÷èâàþùååñÿ ñèìâîëîì "òî÷êà ñ çàïÿòîé". Îòìåòèì, ÷òî îïåðàòîð while âêëþ÷àåò â ñåáÿ îïåðàòîð ïðèñâàèâàíèÿ. Îïåðàòîð âûçîâà ôóíêöèè ïðèâîäèò ê âûïîëíåíèþ ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ, îáðàçóþùèõ òåëî ôóíêöèè.  íàøåì ïðèìåðå ôóíêöèÿ printf( ) âûçûâàåòñÿ äëÿ òîãî, ÷òîáû âûâåñòè íà ïå÷àòü ðåçóëüòàòû ðàáîòû ïðîãðàììû.
Îïåðàòîð while ñîñòîèò èç òðåõ ðàçëè÷íûõ ÷àñòåé: ýòî êëþ÷åâîå ñëîâî while, çàòåì ïðîâåðÿåìîå óñëîâèå, çàêëþ÷åííîå â êðóãëûå ñêîáêè, è, íàêîíåö, îïåðàòîð, êîòîðûé âûïîëíÿåòñÿ â òîì ñëó÷àå åñëè óñëîâèå èñòèííî. Òåëî öèêëà ñîñòîèò èç îäíîãî îïåðàòîðà. Îí ìîæåò áûòü ïðîñòûì, êàê â äàííîì ïðèìåðå (ïðè÷åì â ýòîì ñëó÷àå íå òðåáóåòñÿ çàêëþ÷àòü åãî â ôèãóðíûå ñêîáêè), èëè ñîñòàâíûì êàê â íåêîòîðûõ ïðåäûäóùèõ ïðèìåðàõ (òîãäà ôèãóðíûå ñêîáêè àáñîëþòíî íåîáõîäèìû). Âû ñìîæåòå ïðî÷åñòü î ñîñòàâíûõ îïåðàòîðàõ ÷óòü ïîçæå.
ÐÈÑ. 5.6. Ñòðóêòóðà ïðîñòîãî öèêëà while.
Îïåðàòîð while ïðèíàäëåæèò ê êëàññó îïåðàòîðîâ, èíîãäà íàçûâàåìûõ "ñòðóêòóðèðîâàííûìè îïåðàòîðàìè", ïîñêîëüêó îíè îáëàäàþò ñòðóêòóðîé áîëåå ñëîæíîé, ÷åì ñòðóêòóðà ïðîñòîãî îïåðàòîðà ïðèñâàèâàíèÿ.  ñëåäóþùèõ ãëàâàõ ìû ïîçíàêîìèìñÿ ñ äðóãèìè òèïàìè ñòðóêòóðèðîâàííûõ îïåðàòîðîâ.
Ñîñòàâíûå îïåðàòîðû (áëîêè).
"Ñîñòàâíîé îïåðàòîð" ïðåäñòàâëÿåò ñîáîé äâà èëè áîëåå îïåðàòîðîâ, îáúåäèíåííûõ ñ ïîìîùüþ ôèãóðíûõ ñêîáîê; îí íàçûâàåòñÿ òàêæå "áëîêîì".  íàøåé ïðîãðàììå ðàçìåð îáóâè 2 ìû èñïîëüçîâàëè òàêîé îïåðàòîð, ÷òîáû èìåòü âîçìîæíîñòü âêëþ÷èòü â îïåðàòîð while íåñêîëüêî ïðîñòûõ îïåðàòîðîâ. Ñðàâíèòå ìåæäó ñîáîé ôðàãìåíòû ïðîãðàììû:
/* ôðàãìåíò1 */
Index = 0;
While (index ++ < 10) sam = 10 * index + 2;
Printf(" sam = %d\n", sam);
/* ôðàãìåíò2*/
Index = 0;
While(index ++ < 10) {
Sam = 10*index + 2;
Printf(" sam = %d\n", sam);
}
 ôðàãìåíòå 1 â öèêë while âêëþ÷åí òîëüêî îïåðàòîð ïðèñâàèâàíèÿ. (Ïðè îòñóòñòâèè ôèãóðíûõ ñêîáîê îáëàñòü äåéñòâèÿ îïåðàòîðà while ðàñïðîñòðàíÿåòñÿ îò êëþ÷åâîãî ñëîâà while äî ñëåäóþùåãî ñèìâîëà "òî÷êà ñ çàïÿòîé".) Ïå÷àòü äàííûõ áóäåò ïðîèçâåäåíà òîëüêî îäèí ðàç - ïîñëå çàâåðøåíèÿ öèêëà.
 ôðàãìåíòå 2 íàëè÷èå ôèãóðíûõ ñêîáîê ãàðàíòèðóåò, ÷òî îáà îïåðàòîðà ÿâëÿþòñÿ ÷àñòüþ öèêëà while, è ïå÷àòü ðåçóëüòàòîâ áóäåò èçâîäèòüñÿ íà êàæäîì øàãå ðàáîòû öèêëà. Âåñü ñîñòàâíîé îïåðàòîð ðàññìàòðèâàåòñÿ êàê îäèí îïåðàòîð, ÿâëÿþùèéñÿ ñîñòàâíîé ÷àñòüþ îïåðàòîðà while.

ÐÈÑ. 5.7. Öèêë while ñ ñîñòàâíûì îïåðàòîðîì.
Äàâàéòå îïÿòü ïîñìîòðèì íà ôðàãìåíòû, ñîäåðæàùèå öèêë while, è îáðàòèì âíèìàíèå íà òî, êàê ìû èñïîëüçîâàëè îòñòóïû îò ïîëÿ â ñòðîêàõ äëÿ âûäåëåíèÿ òåëà öèêëîâ while. Äëÿ êîìïèëÿòîðà îòñòóïû â ñòðîêå íå èìåþò íèêàêîãî çíà÷åíèÿ; ðåøåíèÿ âîïðîñà î òîì, êàê èíòåðïðåòèðîâàòü íàøè èíñòðóêöèè, îí èñïîëüçóåò ôèãóðíûå ñêîáêè è ñâîå "çíàíèå" ïðàâèë ôîðìèðîâàíèÿ ñòðóêòóðû öèêëà while. Îòñòóïû â ñòðîêàõ ïðåäíàçíà÷åíû äëÿ íàñ, ÷òîáû ñ ïåðâîãî âçãëÿäà ìîæíî áûëî ïîíÿòü, êàê óñòðîåíà ïðîãðàììà. Ðàíåå ìû ïîêàçàëè âàì îäèí ïîïóëÿðíûé ñïîñîá ðàññòàíîâêè ôèãóðíûõ ñêîáîê, ñëóæàùèé äëÿ óêàçàíèÿ áëîêà èëè ñîñòàâíîãî îïåðàòîðà. Äðóãîé, òîæå äîâîëüíî ðàñïðîñòðàíåííûé ñïîñîá âûãëÿäèò ñëåäóþùèì îáðàçîì.
While(index++ < 10) {
sam = 10 * index + 2;
Printf(" sam = %d\n", sam);
}
Ýòîò ñïîñîá àêöåíòèðóåò âíèìàíèå íà òîì, ÷òî äàííûå îïåðàòîðû îáðàçóþò áëîê, â òî âðåìÿ êàê ñïîñîá, îáñóæäàâøèéñÿ âûøå, óêàçûâàåò íà ïðèíàäëåæíîñòü áëîêà îïåðàòîðó while. Çàìåòèì ñíîâà, ÷òî ïîñêîëüêó äåëî êàñàåòñÿ êîìïèëÿòîðà, îáå ôîðìû ÿâëÿþòñÿ àáñîëþòíî èäåíòè÷íûìè. Ïîäâîäÿ èòîãè, ñêàæåì, ïðèìåíÿéòå îòñòóïû îò ïîëÿ â ñòðîêàõ, ÷òîáû ñäåëàòü ñòðóêòóðó ïðîãðàììû íàãëÿäíîé.
Ðåçþìå: âûðàæåíèÿ è îïåðàòîðû.
Âûðàæåíèå ñîñòîèò èç îïåðàöèé è îïåðàíäîâ. Ïðèìåðàìè ïðîñòåéøèõ âûðàæåíèé ÿâëÿþòñÿ êîíñòàíòû èëè ïåðåìåííûå (îïåðàöèÿ îòñóòñòâóåò), òàêèå, êàê 22 èëè beebop. Áîëåå ñëîæíûå âûðàæåíèÿ - ýòî 55 + 22 è vap = 2*(vip + (mgx = 4 )).
Îïåðàòîð ñëóæèò êàìàíäîé êîìïüþòåðó. Îïåðàòîðû áûâàþò ïðîñòûìè è ñîñòàâíûìè. Ïðîñòûå îïåðàòîðû îêàí÷èâàþòñÿ ñèìâîëîì "òî÷êà ñ çàïÿòîé". Ïðèìåðû:
1. Îïåðàòîðû îïèñàíèÿ int toes;
2. Îïåðàòîðû ïðèñâàèâàíèÿ toes = 12;
3. Îïåðàòîðû âûçîâà ôóíêöèè printf(" %d\n", toes);
4. Óïðàâëÿþùèå îïåðàòîðû while (toes < 20) toes = toes + 2;
5. Ïóñòîé îïåðàòîð ;
Ñîñòàâíûå îïåðàòîðû, èëè áëîêè, ñîñòîÿò èç îäíîãî èëè áîëåå îïåðàòîðîâ (êîòîðûå â ñâîþ î÷åðåäü ñàìè ìîãóò áûòü ñîñòàâíûìè), çàêëþ÷åííûõ â ôèãóðíûå ñêîáêè. Îïåðàòîð while, ïðèâåäåííûé íèæå, ñîäåðæèò, íàïðèìåð, ñîñòàâíîé îïåðàòîð:
While(years < 100) {
Wisdom = wisdom + 1;
Printf(" %d %d\n" , years, wisdom);
}
ÏÐÅÎÁÐÀÇÎÂÀÍÈÅ ÒÈÏÎÂ
 îïåðàòîðàõ è âûðàæåíèÿõ, âîîáùå ãîâîðÿ, äîëæíû èñïîëüçîâàòüñÿ ïåðåìåííûå è êîíñòàíòû òîëüêî îäíîãî òèïà. Åñëè âñå æå âû ñìåøàåòå òèïû â îäíîì âûðàæåíèè, òî êîìïèëÿòîð ñ ÿçûêà Ñè íå ñ÷èòàåò ïðîãðàììó íåïðàâèëüíîé, êàê ýòî ïðîèçîøëî áû ïðè ïðîãðàììèðîâàíèè íà Ïàñêàëå. Âìåñòî ýòîãî êîìïèëÿòîð èñïîëüçóåò íàáîð ïðàâèë äëÿ àâòîìàòè÷åñêîãî ïðåîáðàçîâàíèÿ òèïîâ. Ýòî î÷åíü óäîáíî, íî ìîæåò îêàçàòüñÿ è îïàñíûì, îñîáåííî åñëè âû äîïóñòèëè ñìåøåíèå òèïîâ íå÷àÿííî. (Íàïðèìåð, ïðîãðàììà lint, ðàáîòàþùàÿ â îïåðàöèîííîé ñèñòåìå UNIX, ïðîâåðÿåò íåñîîòâåòñòâèå òèïîâ.) Íàì ïðåäñòàâëÿåòñÿ ðàçóìíûì ïðèâåñòè íåñêîëüêî îñíîâíûõ ïðàâèë, êàñàþùèõñÿ ïðåîáðàçîâàíèÿ òèïîâ:
1. Åñëè îïåðàöèÿ âûïîëíÿåòñÿ íàä äàííûìè äâóõ ðàçëè÷íûõ òèïîâ, îáå âåëè÷èíû ïðèâîäÿòñÿ ê "âûñøåìó" èç äâóõ òèïîâ. Ýòîò ïðîöåññ íàçûâàåòñÿ "ïîâûøåíèåì" òèïà.
2. Ïîñëåäîâàòåëüíîñòü èìåí òèïîâ, óïîðÿäî÷åííûõ îò "âûñøåãî" ê "íèçøåìó", âûãëÿäèò òàê: double, float, long, int, short è char. Ïðèìåíåíèå êëþ÷åâîãî ñëîâà unsigned ïîâûøàåò ðàíã ñîîòâåòñòâóþùåãî òèïà äàííûõ ñî çíàêîì.
3.  îïåðàòîðå ïðèñâàèâàíèÿ êîíå÷íûé ðåçóëüòàò âû÷èñëåíèÿ âûðàæåíèÿ â ïðàâîé ÷àñòè ïðèâîäèòñÿ ê òèïó ïåðåìåííîé, êîòîðîé äîëæíî áûòü ïðèñâîåíî ýòî çíà÷åíèå. Äàííûé ïðîöåññ ìîæåò ïðèâåñòè ê "ïîâûøåíèþ" òèïà, êàê îïèñàíî âûøå, èëè ê "ïîíèæåíèþ, ïðè êîòîðîì âåëè÷èíà ïðèâîäèòñÿ ê òèïó äàííûõ, èìåþùåìó áîëåå íèçêèé ïðèîðèòåò.
Ïîâûøåíèå" òèïà îáû÷íî ïðîèñõîäèò ãëàäêî, â òî âðåìÿ êàê ïîíèæåíèå" ìîæåò ïðèâåñòè ê çàòðóäíåíèÿì. Ïðè÷èíà ýòîãî ïðîñòà: âñå ÷èñëî öåëèêîì ìîæåò íå ïîìåñòèòüñÿ â ýëåìåíòå äàííûõ íèçøåãî òèïà. Ïåðåìåííàÿ òèïà char ìîæåò èìåòü öåëîå çíà÷åíèå 101, íî íå 22334. Ïðèìåð, ïðèâåäåííûé íèæå, èëëþñòðèðóåò ïðèìåíåíèå ýòèõ ïðàâèë.
/* Ïðåîáðàçîâàíèÿ*/
Main().
{
Char ch;
Int i;
Float fl;
Fl = i = ch = 'À'; /* ñòðîêà8 */
Printf(" ch = %c, i = %d, fl = %2.2f\n", ch, i, fl);
Ch = ch + 1; /* ñòðîêà10 */
I = fl + 2*ch; /* ñòðîêà11 */
Fl = 2.0*ch + 1; /* ñòðîêà12*/
Printf(" ch = %c, i = %d, fl = %2.2f\n", ch, i, fl);ch = 2.0e30; /* ñòðîêà 14 */
Printf(" Òåïåðü ch = %ñ \n" , ch);
}
Âûïîëíèâ ïðîãðàììó "ïðåîáðàçîâàíèÿ", ïîëó÷èì ñëåäóþùèå ðåçóëüòàòû:
Ch =A, i = 65, fl = 65.00.
Ch =B, i = 197, fl = 329.00.
Òåïåðü ch =
Âîò ÷òî ïðîèñõîäèò â ïðîãðàììå.
Ñòðîêè 8 è 9: Âåëè÷èíà ' À' ïðèñâàèâàåòñÿ ñèìâîëüíîé ïåðåìåííîé ch. Ïåðåìåííàÿ i ïîëó÷àåò öåëîå çíà÷åíèå, ÿâëÿþùååñÿ ïðåîáðàçîâàíèåì ñèìâîëà ' À' â öåëîå ÷èñëî, ò. å ' 65'. È íàêîíåö, ïåðåìåí íàÿ fl ïîëó÷àåò çíà÷åíèå 65.00, ÿâëÿþùååñÿ ïðåîáðàçîâàíèåì ÷èñëà 65 â ÷èñëî ñ ïëàâàþùåé òî÷êîé.
Ñòðîêè 10 è 13: Çíà÷åíèå ñèìâîëüíîé ïåðåìåííîé 'À' ïðåîáðàçóåòñÿ â öåëîå ÷èñëî 65, ê êîòîðîìó çàòåì äîáàâëÿåòñÿ 1. Ïîñëå ýòîãî ïîëó÷èâøååñÿ â ðåçóëüòàòå ÷èñëî 66 ïðåîáðàçóåòñÿ â êîä ñèìâîëà  è ïîìåùàåòñÿ â ïåðåìåííóþ ch.
Ñòðîêè 11 è 13. Ïðè óìíîæåíèè íà 2 çíà÷åíèå ïåðåìåííîé ch ïðåîáðàçóåòñÿ â öåëîå ÷èñëî (66). Ïðè ñëîæåíèè ñ âåëè÷èíîé ïåðåìåííîé fl ïîëó÷èâøååñÿ â ðåçóëüòàòå ÷èñëî (132) ïðåîáðàçóåòñÿ â ÷èñëî ñ ïëàâàþùåé òî÷êîé. Ðåçóëüòàò (197.00) ïðåîáðàçóåòñÿ â ÷èñëî öåëîãî òèïà è ïðèñâàèâàåòñÿ ïåðåìåííîé i.
Ñòðîêè 12 è 13. Ïåðåä óìíîæåíèåì íà 2.0 çíà÷åíèå ïåðåìåííîé ch(' Â') ïðåîáðàçóåòñÿ â ÷èñëî ñ ïëàâàþùåé òî÷êîé. Ïåðåä âûïîëíåíèåì ñëîæåíèÿ âåëè÷èíà ïåðåìåííîé i(197) ïðåîáðàçóåòñÿ â ÷èñëî ñ ïëàâàþùåé òî÷êîé, à ðåçóëüòàò îïåðàöèè (329.00) ïðèñâàèâàåòñÿ ïåðåìåííîé fl.
Ñòðîêè 14 è 15: Çäåñü ïðîèçâîäèòñÿ ïîïûòêà îñóùåñòâèòü ïðåîáðàçîâàíèå òèïîâ â ïîðÿäêå óáûâàíèÿ ñòàðøèíñòâà - ïåðåìåííàÿ ch ïîëàãàåòñÿ ðàâíîé ñðàâíèòåëüíî áîëüøîìó ÷èñëó. Ðåçóëüòàòû îêàçûâàþòñÿ íåóòåøèòåëüíûìè. Íåçàâèñèìî îò ïåðåïîëíåíèÿ è óñå÷åíèÿ, êîòîðûå èìåþò ìåñòî, â èòîãå íà íàøåé ñèñòåìå ìû ïîëó÷èëè êîä, ñîîòâåòñòâóþùèé êàêîìó-òî íåïå÷àòàåìîìó çíàêó.
Íà ñàìîì äåëå ñóùåñòâóåò åùå îäèí âèä ïðåîáðàçîâàíèÿ òèïîâ. Äëÿ, ñîõðàíåíèÿ òî÷íîñòè âû÷èñëåíèé ïðè àðèôìåòè÷åñêèõ îïåðàöèÿõ âñå âåëè÷èíû òèïà float ïðåîáðàçóþòñÿ â äàííûå òèïà double. Ýòî ñóùåñòâåííî óìåíüøàåò îøèáêó îêðóãëåíèÿ. Êîíå÷íûé ðåçóëüòàò, åñòåñòâåííî, ïðåîáðàçóåòñÿ îáðàòíî â ÷èñëî òèïà float, åñëè ýòî äèêòóåòñÿ ñîîòâåòñòâóþùèì îïåðàòîðîì îïèñàíèÿ. Âàì íåò íåîáõîäèìîñòè çàáîòèòüñÿ î âûïîëíåíèè ïîäîáíûõ ïðåîáðàçîâàíèé, íî äîëæíî áûòü ïðèÿòíî ñîçíàâàòü, ÷òî êîìïèëÿòîð ñòîèò íà ñòðàæå âàøèõ èíòåðåñîâ.
Îïåðàöèÿ ïðèâåäåíèÿ.
Ñàìîå ëó÷øåå - ýòî âîîáùå èçáåãàòü ïðåîáðàçîâàíèÿ òèïîâ îñîáåííî â ïîðÿäêå óáûâàíèÿ ðàíãà. Íî èíîãäà îêàçûâàåòñÿ óäîáíûì ïðèìåíÿòü òàêèå ïðåîáðàçîâàíèÿ ïðè óñëîâèè, ÷òî âû ÿñíî ïðåäñòàâëÿåòå ñåáå ñìûñë âûïîëíÿåìûõ äåéñòâèé. Ïðåîáðàçîâàíèÿ òèïîâ, êîòîðûå ìû îáñóæäàëè äî ñèõ ïîð, âûïîëíÿëèñü àâòîìàòè÷åñêè. Êðîìå òîãî, ñóùåñòâóåò âîçìîæíîñòü òî÷íî óêàçûâàòü òèï äàííûõ, ê êîòîðîìó íåîáõîäèìî ïðèâåñòè íåêîòîðóþ âåëè÷èíó.
Ýòîò ñïîñîá íàçûâàåòñÿ "ïðèâåäåíèåì" òèïîâ è èñïîëüçóåòñÿ ñëåäóþùèì îáðàçîì: ïåðåä äàííîé âåëè÷èíîé â êðóãëûõ ñêîáêàõ çàïèñûâàåòñÿ èìÿ òðåáóåìîãî òèïà. Ñêîáêè è èìÿ òèïà âìåñòå îáðàçóþò îïåðàöèþ ïðèâåäåíèÿ".  îáùåì âèäå îíà çàïèñûâàåòñÿ òàê.
(òèï).
Ãäå ôàêòè÷åñêîå èìÿ òðåáóåìîãî òèïà ïîäñòàâëÿåòñÿ âìåñòî ñëîâà "òèï".
Ðàññìîòðèì äâå íèæåñëåäóþùèå ñòðîêè, ãäå mice - ýòî ïåðåìåííàÿ òèïà int. Âòîðàÿ ñòðîêà ñîäåðæèò äâå îïåðàöèè ïðèâåäåíèÿ.
Mice = 1.6 + 1.7;mice = (int)1.6 + (int)l.7;
 ïåðâîì ïðèìåðå èñïîëüçóåòñÿ àòîìàòè÷åñêîå ïðåîáðàçîâàíèå òèïîâ. Ñíà÷àëà ÷èñëà 1.6 è 1.7 ñêëàäûâàþòñÿ - ðåçóëüòàò ðàâåí 3.3. Çàòåì ïóòåì îòáðàñûâàíèÿ äðîáíîé ÷àñòè ïîëó÷åííîå ÷èñëî ïðåîáðàçóåòñÿ â 3 äëÿ ñîãëàñîâàíèÿ ñ òèïîì int ïåðåìåííîé mice. Âî âòîðîì ïðèìåðå 1.6 è 1.7 ïðåîáðàçóþòñÿ â öåëûå ÷èñëà 1, òàê ÷òî ïåðåìåííîé mice ïðèñâàèâàåòñÿ çíà÷åíèå, ðàâíîå 1+1, èëè 2.
Âîîáùå ãîâîðÿ, âû íå äîëæíû ñìåøèâàòü òèïû; âîò ïî÷åìó â íåêîòîðûõ ÿçûêàõ ýòî çàïðåùåíî. Íî áûâàþò ñèòóàöèè, êîãäà ýòî îêàçûâàåòñÿ ïîëåçíûì. Ôèëîñîôèÿ ÿçûêà Ñè çàêëþ÷àåòñÿ â òîì, ÷òîáû íå óñòàíàâëèâàòü áàðüåðîâ íà âàøåì ïóòè, íî ïðè ýòîì âîçëîæèòü íà âàñ âñþ îòâåòñòâåííîñòü çà çëîóïîòðåáëåíèå ïðåäîñòàâëåííîé ñâîáîäîé.
Ðåçþìå: îïåðàöèè â ÿçûêå Ñè.
Íèæå ïåðå÷èñëåíû îïåðàöèè, êîòîðûå ìû óæå îáñóäèëè.
= Ïðèñâàèâàåò âåëè÷èíó ñïðàâà îò çíàêà ïåðåìåííîé ñëåâà îò íåãî.
+ Ïðèáàâëÿåò âåëè÷èíó ñïðàâà îò çíàêà ê âåëè÷èíå ñëåâà îò íåãî.
- Âû÷èòàåò âåëè÷èíó ñïðàâà îò çíàêà èç âåëè÷èíû ñëåâà îò íåãî.
- Óíàðíàÿ îïåðàöèÿ, èçìåíÿåò çíàê âåëè÷èíû ñïðàâà îò çíàêà.
* Óìíîæàåò âåëè÷èíó ñïðàâà îò çíàêà íà âåëè÷èíó ñëåâà îò íåãî.
/ Äåëèò âåëè÷èíó ñëåâà îò çíàêà íà âåëè÷èíó ñïðàâà îò íåãî.
Ðåçóëüòàò óñåêàåòñÿ, åñëè îáà îïåðàíäà öåëûå ÷èñëà.
% Äàåò îñòàòîê ïðè äåëåíèè âåëè÷èíû ñëåâà îò çíàêà íà âåëè÷èíó.
ñïðàâà îò íåãî (òîëüêî äëÿ öåëûõ ÷èñåë).
++ Ïðèáàâëÿåò 1 ê çíà÷åíèþ ïåðåìåííîé ñëåâà îò çíàêà (ïðåôèêñíàÿ ôîðìà).
èëè ê çíà÷åíèþ ïåðåìåííîé ñïðàâà îò çíàêà (ïîñòôèêñíàÿ ôîðìà).
-- Àíàëîãè÷íàÿ îïåðàöèè ++, íî âû÷èòàåò 1.
Sizeof Äàåò ðàçìåð îïåðàíäà, ñòîÿùåãî ñïðàâà, â áàéòàõ.
Îïåðàíä ìîæåò áûòü ñïåöèôèêàöèåé òèïà, çàêëþ÷åííîãî â êðóãëûå ñêîáêè,
êàê, íàïðèìåð, sizeof (float), èëè èìåíåì êîíêðåòíîé ïåðåìåííîé,
ìàññèâà è ò. ï., íàïðèìåð sizeof foo.
(òèï) Îïåðàöèÿ ïðèâåäåíèÿ: ïðèâîäèò âåëè÷èíó, ñòîÿùóþ ñïðàâà, ê òèïó,
îïðåäåëÿåìîìó êëþ÷åâûì ñëîâîì (èëè ñëîâàìè) â ñêîáêàõ. Íàïðèìåð,
(float)9 ïðåîáðàçóåò öåëîå ÷èñëî 9 â ÷èñëî ñ.
ïëàâàþùåé òî÷êîé 9.0.
ÏÐÈÌÅÐ ÏÐÎÃÐÀÌÌÛ.
Íà ðèñ. 5.8 ïðèâåäåíà ïðîãðàììà, êîòîðàÿ ìîæåò îêàçàòüñÿ ïîëåçíîé òåì, êòî çàíèìàåòñÿ áåãîì, è êîòîðàÿ èëëþñòðèðóåò íåêîòîðûå ïîëîæåíèÿ äàííîé ãëàâû. Îíà âûãëÿäèò äîâîëüíî äëèííîé, íî âñå âû÷èñëåíèÿ â íåé âûïîëíÿþòñÿ øåñòüþ îïåðàòîðàìè, ïîìåùåííûìè â êîíöå. Áîëüøåé ÷àñòüþ ïðîãðàììà çàíèìàåòñÿ îðãàíèçàöèåé äèàëîãà ìåæäó ìàøèíîé è ïîëüçîâàòåëåì. Ìû ââåëè â ïðîãðàììó äîñòàòî÷íî áîëüøîå ÷èñëî êîììåíòàðèåâ, ÷òîáû ñäåëàòü åå ïî÷òè ñàìîäîêóìåíòèðóåìîé. Ïðîñìîòðèòå åå, à çàòåì ìû îáúÿñíèì íåêîòîðûå åå ìîìåíòû.
/* áåã */
# define SM 60 /* ÷èñëî ñåêóíä â ìèíóòå */
# define SH 3600 /* ÷èñëî ñåêóíä â ÷àñå */
# define ÌÊ 0.62137 /* ÷èñëî ìèëü â êèëîìåòðå */
Main().
{
Float distk, distm; /* äèñòàíöèÿ â êì è ìèëÿõ */
Float rate; /* ñðåäíÿÿ ñêîðîñòü â ìèëÿõ â ÷àñ */
Int min, sec; /* âðåìÿ áåãà â ìèíóòàõ è ñåêóíäàõ */
Int time; /* âðåìÿ áåãà â ñåêóíäàõ */
Float mtime; /* âðåìÿ ïðîáåãà îäíîé ìèëè â ñåêóíäàõ */
Int mmin, msec; /* âðåìÿ ïðîáåãà îäíîé ìèëè â ìèíóòàõ è ñåêóíäàõ */
Printf(" Ýòà ïðîãðàììà ïåðåñ÷èòûâàåò âàøå âðåìÿ ïðîáåãà äèñòàíöèè, âûðàæåííîé â êì, \n");
Printf(" âî âðåìÿ, òðåáóåìîå äëÿ ïðîáåãà îäíîé ìèëè, è âàøó ñðåäíþþ \n");
Printf(" ñêîðîñòü â ìèëÿõ â ÷àñ,\n");
Printf(" Óêàæèòå, ïîæàëóéñòà, äèñòàíöèþ â êèëîìåòðàõ.\n");
Scanf(" %f ", &distk);
Printf(" Ââåäèòå çàòåì âðåìÿ â ìèíóòàõ è ñåêóíäàõ. \n ");
Printf(" Íà÷íèòå ñ ââîäà ìèíóò. \n");
Scanf(" %d", &min);
Printf(" Òåïåðü ââîäèòå ñåêóíäû. \n");
Scanf(" %d", &sec);time = SM * mm + sec; /* ïåðåâîäèò âðåìÿ â ñåêóíäû */
Distm = MK * distk; /* ïåðåâîäèò êèëîìåòðû â ìèëè */
Rate = distm / time*SH; /* ÷èñëî ìèëü â ñåê * ÷èñëî.
ñåê â ÷àñ = ÷èñëî ìèëü â ÷àñ */
Mtime = (float)time / distm; /* âðåìÿ/äèñòàíöèÿ = âðåìÿ íà ìèëþ */
Mmin = (int)mtime / SM; /* íàõîäèò öåëîå ÷èñëî ìèíóò */
Msec = (int)mtime % SM; /* íàõîäèò îñòàòîê â ñåêóíäàõ */
Printf("Âû ïðîáåæàëè %1.2f KM (%1.2f ìèëè) çà %d ìèí %d ñ \n",distk, distm, mm, sec);
Printf(" Ýòà ñêîðîñòü ñîîòâåòñòâóåò ïðîáåãó ìèëè çà %d : ìèí", mmin);
Printf("%d c.\n Âàøà ñðåäíÿÿ ñêîðîñòü %l.2f ìèëü/÷ \n", msec, rate);
}
ÐÈÑ. 5. 8. Ïðîãðàììà, ïîëåçíàÿ äëÿ òåõ, êòî çàíèìàåòñÿ áåãîì.
Çäåñü ìû ïðèìåíèëè òîò æå ïîäõîä, êîòîðûé èñïîëüçîâàëè â ïðîãðàììå ñåêóíäû â ìèíóòû äëÿ ïåðåâîäà âðåìåíè, âûðàæåííîãî â ñåêóíäàõ, â ìèíóòû è ñåêóíäû. Êðîìå òîãî, íàì ïðèøëîñü âîñïîëüçîâàòüñÿ ïðåîáðàçîâàíèÿìè òèïîâ. Ïî÷åìó? Ïîòîìó ÷òî äëÿ òîé ÷àñòè ïðîãðàììû, êîòîðàÿ çàíèìàåòñÿ ïåðåâîäîì ñåêóíä â ìè íóòû, íàì òðåáóþòñÿ àðãóìåíòû öåëîãî òèïà, à ïðè ïðåîáðàçîâàíèè èç ìåòðè÷åñêîé ñèñòåìû â ìèëè èñïîëüçóþòñÿ ÷èñëà ñ ïëàâàþùåé òî÷êîé. Ìû ïðèìåíèëè îïåðàöèþ ïðèâåäåíèÿ äëÿ òîãî, ÷òîáû ñäåëàòü ýòè ïðåîáðàçîâàíèÿ ÿâíûìè.
×åñòíî ãîâîðÿ, íàøó ïðîãðàììó ìîæíî áûëî áû íàïèñàòü, èñïîëüçóÿ òîëüêî àâòîìàòè÷åñêîå ïðåîáðàçîâàíèå òèïîâ. Ìû òàê è äåëàëè, ïðèìåíÿÿ îïåðàöèþ ïðèâåäåíèÿ ïåðåìåííîé mtime ê òèïó int, ÷òîáû ïðè âû÷èñëåíèè âðåìåíè âñå îïåðàíäû áûëè öåëîãî òèïà. Îäíàêî òàêàÿ âåðñèÿ êîìïèëÿòîðà ðàáîòàåò âñåãî íà îäíîé èç äâóõ äîñòóïíûõ íàì ñèñòåì. Èñïîëüçîâàíèå îïåðàöèè ïðèâåäåíèÿ íå òîëüêî ïðîÿñíÿåò âàø çàìûñåë ÷åëîâåêó, çíàêîìÿùåìóñÿ c âàøåé ïðîãðàììîé, íî è óïðîùàåò åå êîìïèëÿöèþ.
Âîò ðåçóëüòàò ðàáîòû äàííîé ïðîãðàììû.
Ýòà ïðîãðàììà ïåðåñ÷èòûâàåò âàøå âðåìÿ ïðîáåãà äèñòàíöèè, âûðàæåííîé â êì,âî âðåìÿ, òðåáóåìîå äëÿ ïðîáåãà îäíîé ìèëè, è âàøó ñðåäíþþ ñêîðîñòü, â ìèëÿõ â ÷àñ.
Óêàæèòå, ïîæàëóéñòà äèñòàíöèþ â êèëîìåòðàõ.10,0.Ââåäèòå çàòåì âðåìÿ â ìèíóòàõ è ñåêóíäàõ.
Íà÷íèòå ñ ââîäà ìèíóò.36.Òåïåðü ââåäèòå ñåêóíäû.23Âû ïðîáåæàëè 10,00 êì (6,21 ìèëè) çà 36 ìèí. 23 ñ.
Ýòà ñêîðîñòü ñîîòâåòñòâóåò ïðîáåãó ìèëè çà 5 ìèí 51 ñ.
Âàøà ñðåäíÿÿ ñêîðîñòü 10.25 ìèëü/÷.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê èñïîëüçîâàòü îïåðàöèè: +,-,*,/,%,++, --, (type).
×òî òàêîå îïåðàíä: ýòî - âåëè÷èíà, íàä êîòîðîé âûïîëíÿåòñÿ îïåðàöèÿ.
×òî òàêîå âûðàæåíèå: ñîâîêóïíîñòü îïåðàöèé è îïåðàíäîâ.
Êàê âû÷èñëÿòü çíà÷åíèå âûðàæåíèÿ: â ñîîòâåòñòâèè ñ ïîðÿäêîì ñòàðøèíñòâà.
Êàê ðàñïîçíàòü îïåðàòîð: ïî ñèìâîëó.
Âèäû îïåðàòîðîâ: îïåðàòîðû îïèñàíèÿ, ïðèñâàèâàíèÿ, while, ñîñòàâíîé.
Êàê ñôîðìèðîâàòü ñîñòàâíîé îïåðàòîð: çàêëþ÷èòü ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ â ôèãóðíûå ñêîáêè {}.
Êàê ñôîðìèðóåòñÿ îïåðàòîð while: while (ïðîâåðêà óñëîâèÿ) îïåðàòîð.
Êàê âû÷èñëÿþòñÿ âûðàæåíèÿ ñî ñìåøàííûìè òèïàìè äàííûõ: ñ ïîìîùüþ àâòîìàòè÷åñêîãî ïðåîáðàçîâàíèÿ òèïîâ.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ
Âîïðîñû.
1. Ïðåäïîëîæèì, âñå ïåðåìåííûå èìåþò òèï int. Îïðåäåëèòå çíà÷åíèå êàæäîé èç ïîñëåäóþùèõ ïåðåìåííûõ:
à. õ = (2+3)*6,
á. õ = (12+6)/2*3,
â. y = x = (2+3)/4,
ã. y = 3 + 2*(x = 7/2 ),
ä. x = (int)3.8 + 3.3,
2. Ìû ïîäîçðåâàåì, ÷òî â ïðîãðàììå, ïðèâåäåííîé íèæå, èìååòñÿ íåñêîëüêî îøèáîê. Ñóìååòå ëè âû ïîìî÷ü íàì èõ îáíàðóæèòü?
Main( ).
{
Int i = 1,
Float n;
printf(" Âíèìàíèå! Ñåé÷àñ ïîÿâèòñÿ íåñêîëüêî äðîáåé. \n");
While (i < 30).
n = 1/ i;
printf(" %f", n);
Printf(" Âîò è âñå! Êîíåö! \n"),
}
3. Íèæå ïðèâåäåíà ïåðâàÿ ïîïûòêà ñäåëàòü ïðîãðàììó "ñåêóíäû â ìèíóòû" äèàëîãîâîé. Ïðîãðàììà íàñ íå óäîâëåòâîðÿåò. Ïî÷åìó? Êàê åå óëó÷øèòü?
#define SM 60.
Main( ).
{
Int sec, mm, left,
Printf( Ýòà ïðîãðàììà ïåðåâîäèò ñåêóíäû â ìèíóòû è ñåêóíäû \n );
Printf( 'Óêàæèòå ÷èñëî ñåêóíä \n ),
Printf( Äëÿ îêîí÷àíèÿ ðàáîòû ïðîãðàììû íåîáõîäèìî ââåñòè 0 \n);
While (sec < 0).
{
Scanf( %d", &sec),mm = sec/SM,left = sec % SM,
Printf("%d ñ ýòî % d ìèí %d ñ \n", sec, mm, left),
Printf(" Ââåäèòå ñëåäóþùåå çíà÷åíèå \n"),
}
Printf( Äî ñâèäàíèÿ!\n ),
}
Îòâåòû.
1. à. 30.
á. 27(à íå 3). Ðåçóëüòàò 3 ìîæíî ïîëó÷èòü â ñëó÷àå (12 + 6)/(2*3).
â. õ = 1, ó = 1 (äåëåíèå öåëûõ ÷èñåë).
ã. õ = 3 (äåëåíèå öåëûõ ÷èñåë) è ó = 9.
ä. õ = 6, òàê êàê (int)3.8=3.3 + 3.3 = 6.3, ýòî ÷èñëî áóäåò ïðåîáðàçîâàíî â ÷èñëî 6, ïîñêîëüêó õ èìååò òèï int.
2. Ñòðîêà 3: äîëæíà îêàí÷èâàòüñÿ òî÷êîé ñ çàïÿòîé, à íå çàïÿòîé.
Ñòðîêà 7: îïåðàòîð while ïðåäñòàâëÿåò ñîáîé áåñêîíå÷íûé öèêë, ïîòîìó ÷òî âåëè÷èíà ïåðåìåííîé i îñòàåòñÿ ðàâíîé 1 è âñåãäà áóäåò ìåíüøå 30. Ïî âñåé âèäèìîñòè, ìû ñîáèðàëèñü íàïèñàòü while(i+ + < 30).
Ñòðîêè 7-9: îòñòóïû â ñòðîêàõ ïîäðàçóìåâàþò, ïî âèäèìîìó, ÷òî èç îïåðàòîðîâ, ðàñïîëîæåíûõ â ñòðîêàõ 8 è 9, ìû íàìåðåâàëèñü ñôîðìèðîâàòü áëîê, íî îòñóòñòâèå ôèãóðíûõ ñêîáîê îçíà÷àåò, ÷òî öèêë while âêëþ÷àåò â ñåáÿ òîëüêî îïåðàòîð, ðàñïîëîæåííûé íà ñòðîêå 8; ïîýòîìó ôèãóðíûå ñêîáêè äîëæíû áûòü îáÿçàòåëüíî äîáàâëåíû.
Ñòðîêà 8: ïîñêîëüêó 1 è i - îáà öåëîãî òèïà, ðåçóëüòàò äåëåíèÿ áóäåò ðàâåí 1 ïðè i, ðàâíîì 1, è 0 - äëÿ âñåõ áîëüøèõ çíà÷åíèé. Íåîáõîäèìî ïèñàòü òàê n = 1.0/i; ïåðåä äåëåíèåì çíà÷åíèå ïåðåìåííîé i áóäåò ïðèâåäåíî ê òèïó äàííûõ ñ ïëàâàþùåé òî÷êîé è áóäåò ïîëó÷åí íåíóëåâîé ðåçóëüòàò.
Ñòðîêà 9: ìû îïóñòèëè ñèìâîë "íîâàÿ ñòðîêà" â óïðàâëÿþùåé ñòðîêå; ýòî ïðèâåäåò ê òîìó, ÷òî ÷èñëà áóäóò ïå÷àòàòüñÿ íà îäíîé ñòðîêå, åñëè òàê äîïóñêàåòñÿ óñòðîéñòâîì âûâîäà.
3. Îñíîâíàÿ òðóäíîñòü ëåæèò â ñîãëàñîâàíèè ìåæäó îïåðàòîðîì, âûïîëíÿþùèì ïðîâåðêó (âåëè÷èíà ïåðåìåííîé sec áîëüøå 0 èëè íåò?), è îïåðàòîðîì scanf( ), îñóùåñòâëÿþùèì ââîä çíà÷åíèÿ ïåðåìåííîé sec.  ÷àñòíîñòè, êîãäà ïðîâåðêà âûïîëíÿåòñÿ ïåðâûé ðàç, ïåðåìåííàÿ sec â ïðîãðàììå åùå íå ïîëó÷àåò ñâîåãî çíà÷åíèÿ, è ïîýòîìó ñðàâíåíèå áóäåò ïðîèçâîäèòüñÿ ñ íåêîòîðîé ñëó÷àéíîé âåëè÷èíîé (ìóñîðîì"), êîòîðàÿ ìîæåò îêàçàòüñÿ â ñîîòâåòñòâóþùåé ÿ÷åéêå ïàìÿòè. Îäíî ðåøåíèå, õîòÿ è íåêðàñèâîå, çàêëþ÷àåòñÿ â èíèöèàëèçàöèè ïåðåìåííîé sec, ñêàæåì âåëè÷èíîé 1, â ðåçóëüòàòå ÷åãî ïåðâûé ðàç ñðàâíåíèå âûïîëíèòñÿ. Íî çäåñü îáíàðóæèâàåòñÿ âòîðàÿ ïðîáëåìà. Êîãäà ïðè îêîí÷àíèè ðàáîòû ìû íàáèðàåì âåëè÷èíó 0, ÷òîáû îñòàíîâèòü ïðîãðàììó, îêàçûâàåòñÿ, ÷òî çíà÷åíèå ïåðåìåííîé sec ïðîâåðÿåòñÿ òîëüêî ïîñëå çàâåðøåíèÿ øàãà öèêëà è ïðîèñõîäèò âûâîä íà ïå÷àòü ðåçóëüòàòîâ äëÿ 0 ñåêóíä. Íà ñàìîì äåëå íàì õîòåëîñü áû, ÷òîáû îïåðàòîð scanf( ) âûïîëíÿëñÿ ïåðåä òåì, êàê îñóùåñòâëÿåòñÿ ïðîâåðêà â îïåðàòîðå while. Ýòîãî ìîæíî äîñòè÷ü ïóòåì ñëåäóþùåé ìîäèôèêàöèè ñðåäíåé ÷àñòè ïðîãðàììû.
Scanf(" %d," &sec);
While(sec > 0){
Mm = sec / SM;
Left = sec % SM;
Printf(" %d ñýòî%d ìèí%d ñ\n", sec, mm, left);
Printf(" Ââåäèòå ñëåäóþùåå çíà÷åíèå \n");
Scanf(" %d ", &sec);
}
 ïåðâûé ðàç ââîä óêàçàííîé âåëè÷èíû â ïðîãðàììó îñóùåñòâëÿåòñÿ ôóíêöèåé scanf( ), ïîìåùåííîé ïåðåä öèêëîì, à ââîä êàæäîé ïîñëåäóþùåé âåëè÷èíû áóäåò âûïîëíÿòüñÿ ôóíêöèåé scanf â êîíöå öèêëà (è, ñëåäîâàòåëüíî, êàê ðàç ïåðåä òåì, êàê íà÷íåòñÿ âûïîëíåíèå î÷åðåäíîãî øàãà öèêëà). Ýòîò ïîäõîä ÿâëÿåòñÿ îáùèì ñïîñîáîì ðåøåíèÿ ïðîáëåì ïîäîáíîãî ñîðòà.
ÓÏÐÀÆÍÅÍÈß.
Íèæå ïðèâîäÿòñÿ çàäà÷è, ðåøåíèÿ êîòîðûõ ìû íå äàåì. ×òîáû óçíàòü, ðàáîòàåò ëè âàøà ïðîãðàììà, íåîáõîäèìî âûïîëíèòü åå íà âàøåé ìàøèíå.
1. Èçìåíèòå íàøó ïðîãðàììó "ñóììà" òàê, ÷òîáû îíà îïðåäåëÿëà ñóììó ïåðâûõ 20 ÷èñåë. (Åñëè õîòèòå, ìîæåòå ñ÷èòàòü, ÷òî ýòà ïðîãðàììà âû÷èñëÿåò, ñêîëüêî äåíåã âû ïîëó÷èòå çà 20 äíåé, åñëè â ïåðâûé äåíü âû ïîëó÷èòå 1 äîëë , âî âòîðîé - 2, â òðåòèé - 3 è ò.ä.). Ìîäèôèöèðóéòå ïîòîì ñâîþ ïðîãðàììó òàêèì îáðàçîì, ÷òîáû âû ìîãëè â äèàëîãîâîì ðåæèìå óêàçàòü åé, äî êàêîãî äíÿ ñëåäóåò âåñòè ðàñ÷åò, ò. å. çàìåíèòå êîíñòàíòó 20 ïåðåìåííîé, çíà÷åíèå êîòîðîé ïðèñâàèâàåòñÿ â ðåçóëüòàòå îïåðàöèè ââîäà.
2. À òåïåðü ìîäèôèöèðóéòå ñâîþ ïðîãðàììó òàê, ÷òîáû îíà âû÷èñëÿëà ñóììó êâàäðàòîâ öåëûõ ÷èñåë (Èëè, åñëè âàì òàê áîëüøå íðàâèòñÿ, ñêîëüêî âû âñåãî ïîëó÷èòå äåíåã, åñëè â ïåðâûé äåíü âàì çàïëàòÿò 1 äîëë , âî âòîðîé - 4, â òðåòèé - 9 è ò. ä. Ýòî ãîðàçäî áîëåå ïðèáûëüíîå äåëî!) Ó÷òèòå, ÷òî â ÿçûêå Ñè íåò ôóíêöèè âîçâåäåíèÿ â êâàäðàò, íî âû ìîæåòå èñïîëüçîâàòü òîò ôàêò, ÷òî êâàäðàò ÷èñëà n - ýòî ïðîñòî n*n.
3. Èçìåíèòå ñâîþ ïðîãðàììó òàê, ÷òîáû ïîñëå çàâåðøåíèÿ âû÷èñëåíèé îíà çàïðàøèâàëà ó âàñ íîâîå çíà÷åíèå ïåðåìåííîé è âûïîëíÿëà âû÷èñëåíèÿ ïîâòîðíî. Îêîí÷àíèå ðàáîòû ïðîãðàììû äîëæíî ïðîèñõîäèòü ïðè ââîäå 0. (Óêàçàíèå, èñïîëüçóéòå òàêóþ êîíñòðóêöèþ, êàê öèêë â öèêëå Ñì òàêæå âîïðîñ 3 è ðåøåíèå ê íåìó ).
6. Ôóíêöèè è ïåðåêëþ÷åíèå ââîäà-âûâîäà
 âû÷èñëèòåëüíîé òåõíèêå ñëîâà "ââîä" è "âûâîä" ïðèìåíÿþòñÿ â íåñêîëüêèõ ðàçíûõ ñìûñëàõ. Ìû ìîæåì ãîâîðèòü îá óñòðîéñòâàõ ââîäà è âûâîäà, òàêèõ, êàê òåðìèíàëû, íàêîïèòåëè íà ìàãíèòíûõ äèñêàõ, òî÷å÷íî-ìàòðè÷íûå ïðèíòåðû è ò. ï., èëè î äàííûõ, èñïîëüçóåìûõ ïðè ââîäå è âûâîäå, èëè æå, íàêîíåö, î ôóíêöèÿõ, ðåàëèçóþùèõ ââîä è âûâîä. Îñíîâíîé öåëüþ äàííîé ãëàâû ÿâëÿåòñÿ îáñóæäåíèå ôóíêöèé, ïðèìåíÿåìûõ ïðè ââîäå è âûâîäå, íî, êðîìå ýòîãî, ìû êîñíåìñÿ è äâóõ äðóãèõ àñïåêòîâ ýòîãî ïîíÿòèÿ.
Ïîä ôóíêöèÿìè ââîäà-âûâîäà ïîäðàçóìåâàþòñÿ ôóíêöèè, êîòîðûå âûïîëíÿþò òðàíñïîðòèðîâêó äàííûõ â ïðîãðàììó è èç íåå. Ìû óæå èñïîëüçîâàëè äâå òàêèå ôóíêöèè: printf( ) è scanf( ). Òåïåðü æå ðàññìîòðèì íåñêîëüêî äðóãèõ âîçìîæíîñòåé, ïðåäîñòàâëÿåìûõ ÿçûêîì Ñè.
Ôóíêöèè ââîäà-âûâîäà íå âõîäÿò â îïðåäåëåíèå ÿçûêà Ñè; èõ ðàçðàáîòêà âîçëîæåíà íà ïðîãðàììèñòîâ, ðåàëèçóþùèõ êîìïèëÿòîð ñ ÿçûêà Ñè. Åñëè âû ÿâëÿåòåñü ïðîåêòèðîâùèêîì òàêîãî êîìïèëÿòîðà, òî ìîæåòå ðåàëèçîâàòü ëþáûå ôóíêöèè ââîäà-âûâîäà. Åñëè âû÷èñëèòåëüíàÿ ñèñòåìà, äëÿ êîòîðîé âû åãî ñîçäàåòå, îáëàäàåò òîé èëè èíîé îñîáåííîñòüþ, íàïðèìåð òåì, ÷òî êàíàëû ââîäà-âûâîäà ïîñòðîåíû íà îñíîâå ïîðòîâ ìèêðîïðîöåññîðà INTEL 8086, âû ìîæåòå âñòðîèòü â íåå ñïåöèàëüíûå ôóíêöèè ââîäà-âûâîäà, îðèåíòèðîâàííûå íà ýòó îñîáåííîñòü. Ìû ðàññìîòðèì ïðèìåð ïðèìåíåíèÿ òàêîãî ïîäõîäà â êîíöå äàííîé ãëàâû. Ñ äðóãîé ñòîðîíû, âûãîäà èñïîëüçîâàíèÿ ñòàíäàðòíîãî íàáîðà ôóíêöèé ââîäà-âûâîäà íà âñåõ ñèñòåìàõ î÷åâèäíà. Ýòî äàåò âîçìîæíîñòü ïèñàòü "ïåðåíîñèìûå" ïðîãðàììû, êîòîðûå ëåãêî ìîæíî ïðèìåíÿòü íà ðàçíûõ ìàøèíàõ.  ÿçûêå Ñè èìååòñÿ ìíîãî ôóíêöèé ââîäà-âûâîäà òàêîãî òèïà, íàïðèìåð printf( ) è scanf( ). Íèæå ìû ðàññìîòðèì ôóíêöèè getchar( ) è putchar( ).
Ýòè äâå ôóíêöèè îñóùåñòâëÿþò ââîä è âûâîä îäíîãî ñèìâîëà ïðè êàæäîì îáðàùåíèè ê íèì. Íà ïåðâûé âçãëÿä, âûïîëíåíèå îïåðàöèé ïîäîáíûì îáðàçîì ìîæåò ïîêàçàòüñÿ äîâîëüíî ñòðàííûì òàê êàê, ó÷èòûâàÿ âñå ñêàçàííîå âûøå, ìû óæå ìîæåì ñ ëåãêîñòüþ îñóùåñòâèòü ââîä íåñêîëüêèõ ñèìâîëîâ ïîäðÿä. Íî ýòîò ñïîñîá ââîäà äàííûõ ëó÷øå ñîîòâåòñòâóåò âîçìîæíîñòÿì ìàøèíû. Áîëåå òîãî, òàêîé ïîäõîä ñëóæèò îñíîâîé ïîñòðîåíèÿ áîëüøèíñòâà ïðî ãðàìì îáðàáîòêè òåêñòîâ, ÿâëÿþùèõñÿ ïîñëåäîâàòåëüíîñòÿìè îáû÷íûõ ñëîâ. Ìû óâèäèì, êàê ìîæíî ïðèìåíÿòü ýòè ôóíêöèè â ïðîãðàììàõ, çàíèìàþùèõñÿ ïîäñ÷åòîì ñèìâîëîâ, ÷òåíèåì è êîïèðîâàíèåì ôàéëîâ. Ïîïóòíî ìû óçíàåì ïðî áóôåðû, ýõî-ïå÷àòü è ïåðåêëþ÷åíèå ââîäà-âûâîäà.

ÂÂÎÄ È ÂÛÂÎÄ ÎÄÍÎÃÎ ÑÈÌÂÎËÀ: ÔÓÍÊÖÈÈ getchar( ) È putchar( ).
Ôóíêöèÿ getchar() ïîëó÷àåò îäèí ñèìâîë, ïîñòóïàþùèé ñ ïóëüòà òåðìèíàëà (è ïîýòîìó èìåþùèé íàçâàíèå), è ïåðåäàåò åãî âûïîëíÿþùåéñÿ â äàííûé ìîìåíò ïðîãðàììå. Ôóíêöèÿ putchar( ) ïîëó÷àåò îäèí ñèìâîë, ïîñòóïàþùèé èç ïðîãðàììû, è ïåðåñûëàåò åãî äëÿ âûâîäà íà ýêðàí. Íèæå ïðèâîäèòñÿ ïðèìåð î÷åíü ïðîñòîé ïðîãðàììû. Åäèíñòâåííîå, ÷òî îíà äåëàåò, ýòî ïðèíèìàåò îäèí ñèìâîë ñ êëàâèàòóðû è âûâîäèò åãî íà ýêðàí. Ìû áóäåì ïîñòåïåííî ìîäèôèöèðîâàòü äàííóþ ïðîãðàììó äî òåõ ïîð, ïîêà îíà íå ïðèîáðåòåò ðÿä ïîëåçíûõ âîçìîæíîñòåé. Èç äàëüíåéøåãî âû óçíàåòå, ÷òî ïðåäñòàâëÿþò èç ñåáÿ ýòè âîçìîæíîñòè, íî ñíà÷àëà äàâàéòå ïîñìîòðèì íà íàø ñêðîìíûé ïåðâûé âàðèàíò.
/* ââîä-âûâîä1 */
#include.
main( ).
{
Char ch;
Ch = getchar( ); /* ñòðîêà 1 */
Putchar (ch); /* ñòðîêà 2 */
}
Äëÿ áîëüøèíñòâà ñèñòåì ñïåöèôèêàöèè ôóíêöèé getchar è putchar ñîäåðæàòñÿ â ñèñòåìíîì ôàéëå stdio.h, è òîëüêî ïî ýòîé ïðè÷èíå ìû óêàçàëè äàííûé ôàéë â ïðîãðàììå. Èñïîëüçîâàíèå òàêîé ïðîãðàììû ïðèâîäèò ê ñëåäóþùåìó:
G [ââîä] g.
Èëè, âîçìîæíî, ê.
Gg.
Îáîçíà÷åíèå [ââîä] ñëóæèò óêàçàíèåì, ÷òî âû äîëæíû íàæàòü êëàâèøó [ââîä].  ëþáîì ñëó÷àå, ïåðâûé ñèìâîë g âû íàáèðàåòå íà êëàâèàòóðå ñàìè, à âòîðîé âûâîäèòñÿ êîìïüþòåðîì.
Ðåçóëüòàò çàâèñèò îò òîãî, åñòü â âàøåé ñèñòåìå "áóôåðèçîâàííûé" ââîä èëè íåò. Åñëè ïåðåä òåì êàê ïîëó÷èòü íà ýêðàíå îòâåò, âû äîëæíû íàæàòü êëàâèøó [ââîä], òî áóôåðèçàöèÿ â âàøåé ñèñòåìå èìååòñÿ. Äàâàéòå çàêîí÷èì ðàññìîòðåíèå ôóíêöèé getchar( ) è putchar( ) ïåðåä òåì, êàê ïðèñòóïèòü ê îáñóæäåíèþ ïîíÿòèÿ áóôåðîâ.
Ôóíêöèÿ getchar( ) àðãóìåíòîâ íå èìååò (ò. å. ïðè åå âûçîâå â êðóãëûå ñêîáêè íå ïîìåùàåòñÿ íèêàêàÿ âåëè÷èíà). Îíà ïðîñòî ïîëó÷àåò î÷åðåäíîé ïîñòóïàþùèé ñèìâîë è ñàìà âîçâðàùàåò åãî çíà÷åíèå âûïîëíÿåìîé ïðîãðàììå. Íàïðèìåð, åñëè óêàçàííàÿ ôóíêöèÿ ïîëó÷àåò áóêâó Q, åå çíà÷åíèåì â äàííûé ìîìåíò áóäåò ýòà áóêâà. Îïåðàòîð, ïðèâåäåííûé â ñòðîêå 1, ïðèñâàèâàåò çíà÷åíèå ôóíêöèè getchar( ) ïåðåìåííîé ch.
Ôóíêöèÿ putchar( ) èìååò îäèí àðãóìåíò. Ïðè åå âûçîâå íåîáõîäèìî â ñêîáêàõ óêàçàòü ñèìâîë, êîòîðûé òðåáóåòñÿ âûâåñòè íà ïå÷àòü. Àðãóìåíòîì ìîæåò áûòü îäèíî÷íûé ñèìâîë (âêëþ÷àÿ çíàêè ïðåäñòàâëÿåìûå óïðàâëÿþùèìè ïîñëåäîâàòåëüíîñòÿìè, îïèñàííûìè â ãë. 3), ïåðåìåííàÿ èëè ôóíêöèÿ, çíà÷åíèåì êîòîðîé ÿâëÿåòñÿ îäèíî÷íûé ñèìâîë. Ïðàâèëüíûì îáðàùåíèåì ê ôóíêöèè putchar( ) ÿâëÿåòñÿ óêàçàíèå ëþáîãî èç ýòèõ àðãóìåíòîâ ïðè åå âûçîâå.
Putchar ('S'); /* íàïîìíèì, ÷òî ñèìâîëüíûå */
Putchar ('\n'); /* êîíñòàíòû çàêëþ÷àþòñÿ â àïîñòðîôû */
Putchar ('\007');
Putchar (ch); /* ch - ïåðåìåííàÿ òèïà char */
Putchar (getchar ( ));
Ôîðìó çàïèñè, ïðèâåäåííóþ â ïîñëåäíåì ïðèìåðå, ìû ìîæåì èñïîëüçîâàòü äëÿ òîãî, ÷òîáû ïðåäñòàâèòü íàøó ïðîãðàììó â ñëåäóþùåì âèäå:
#include.
Main( ).
{
Putchar (getchar( ));
}
Òàêàÿ çàïèñü î÷åíü êîìïàêòíà è íå òðåáóåò ââåäåíèÿ âñïîìîãàòåëüíûõ ïåðåìåííûõ. Êðîìå òîãî, â ðåçóëüòàòå êîìïèëÿöèè òàêàÿ ïðîãðàììà îêàçûâàåòñÿ áîëåå ýôôåêòèâíîé, íî, ïîæàëóé, ìåíåå ïîíÿòíîé.
Ïîñëå òîãî êàê ìû îçíàêîìèëèñü ñ ðàáîòîé ýòèõ äâóõ ôóíêöèé, ìîæíî ïåðåéòè ê îáñóæäåíèþ ïîíÿòèÿ áóôåðîâ.
ÁÓÔÅÐÛ.
Ïðè âûïîëíåíèè äàííîé ïðîãðàììû (ëþáîé èç äâóõ åå âåðñèé) ââîäèìûé ñèìâîë â îäíèõ âû÷èñëèòåëüíûõ ñèñòåìàõ íåìåäëåííî ïîÿâëÿåòñÿ íà ýêðàíå ("ýõî-ïå÷àòü"), â äðóãèõ æå íè÷åãî íå ïðîèñõîäèò äî òåõ ïîð, ïîêà âû íå íàæìåòå êëàâèøó [ââîä]. Ïåðâûé ñëó÷àé îòíîñèòñÿ ê òàê íàçûâàåìîìó "íåáóôåðèçîâàííîìó" ("ïðÿìîìó") ââîäó, îçíà÷àþùåìó, ÷òî ââîäèìûé ñèìâîë îêàçûâàåòñÿ íåìåäëåííî äîñòóïíûì îæèäàþùåé ïðîãðàììå. Âòîðîé ñëó÷àé ñëóæèò ïðèìåðîì "áóôåðèçîâàííîãî" ââîäà, êîãäà ââîäèìûå ñèìâîëû ñîáèðàþòñÿ è ïîìåøàþòñÿ â íåêîòîðóþ îáëàñòü âðåìåííîé ïàìÿòè, íàçûâàåìóþ "áóôåðîì". Íàæàòèå êëàâèøè [ââîä] ïðèâîäèò ê òîìó, ÷òî áëîê ñèìâîëîâ (èëè îäèí ñèìâîë) ñòàíîâèòñÿ äîñòóïíûì ïðîãðàììå.  íàøåé ïðîãðàììå ïðèìåíÿåòñÿ òîëüêî ïåðâûé ñèìâîë, ïîñêîëüêó ôóíêöèÿ getchar( ) âûçûâàåòñÿ â íåé îäèí ðàç. Íàïðèìåð, ðàáîòà íàøåé ïðîãðàììû â ñèñòåìå, èñïîëüçóþùåé áóôåðèçîâàííûé ââîä, áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Âîò äëèííàÿ âõîäíàÿ ñòðîêà. [ââîä] Â.
 ñèñòåìå ñ íåáóôåðèçîâàííûì ââîäîì îòîáðàæåíèå íà ýêðàíå ñèìâîëà  ïðîèçîéäåò ñðàçó, êàê òîëüêî âû íàæìåòå ñîîòâåòñòâóþùóþ êëàâèøó. Ðåçóëüòàò ââîäà-âûâîäà ïðè ýòîì ìîæåò âûãëÿäåòü, íàïðèìåð, òàê:
ÂÂîò äëèííàÿ âõîäíàÿ ñòðîêà.
Ñèìâîë Â, ïîÿâèâøèéñÿ íà âòîðîé ïîçèöèè äàííîé ñòðîêè, - ýòî íåïîñðåäñòâåííûé ðåçóëüòàò ðàáîòû ïðîãðàììû.  êàæäîì ñëó÷àå, ïðîãðàììîé îáðàáàòûâàåòñÿ òîëüêî îäèí ñèìâîë, ïîñêîëüêó ôóíêöèÿ getchar( ) âûçûâàåòñÿ ëèøü îäèí ðàç.

ÐÈÑ. 6.2. Ñõåìà áóôåðèçîâàííîãî è íåáóôåðèçîâàííîãî ââîäà.
Çà÷åì íóæíû áóôåðû? Âî-ïåðâûõ, îêàçûâàåòñÿ, ÷òî ïåðåäà÷ó íåñêîëüêèõ ñèìâîëîâ â âèäå îäíîãî áëîêà ìîæíî îñóùåñòâèòü ãîðàçäî áûñòðåå, ÷åì ïåðåäàâàòü èõ ïîñëåäîâàòåëüíî ïî îäíîìó. Âî-âòîðûõ, åñëè ïðè ââîäå ñèìâîëîâ äîïóùåíà îøèáêà, âû ìîæåòå âîñïîëüçîâàòüñÿ êîððåêòèðóþùèìè ñðåäñòâàìè òåðìèíàëà, ÷òîáû åå èñïðàâèòü. È êîãäà â êîíöå êîíöîâ âû íàæìåòå êëàâèøó [ââîä], áóäåò ïðîèçâåäåíà ïåðåäà÷à îòêîððåêòèðîâàííîé ñòðîêè.
Îäíàêî äëÿ íåêîòîðûõ äèàëîãîâûõ ïðîãðàìì íåáóôåðèçîâàííûé ââîä ìîæåò îêàçàòüñÿ ïðèåìëåìûì. Íàïðèìåð, â ïðîãðàììàõ îáðàáîòêè òåêñòîâ áûëî áû æåëàòåëüíî, ÷òîáû êàæäàÿ êîìàíäà ââîäèëàñü, êàê òîëüêî âû íàæèìàåòå ñîîòâåòñòâóþùóþ êëàâèøó. Ïîýòîìó êàê áóôåðèçîâàííûé, òàê è íåáóôåðèçèðîâàííûé ââîä èìååò ñâîè äîñòîèíñòâà.
ÑËÅÄÓÞÙÈÉ ØÀÃ.
Òåïåðü âîçüìåìñÿ çà ÷òî-íèáóäü íåñêîëüêî áîëåå ñëîæíîå ÷åì ÷òåíèå è âûâîä íà ïå÷àòü îäíîãî ñèìâîëà - íàïðèìåð çà âûâîä íà ïå÷àòü ãðóïï ñèìâîëîâ. Æåëàòåëüíî òàêæå, ÷òîáû â ëþáîé ìîìåíò ìîæíî áûëî îñòàíîâèòü ðàáîòó ïðîãðàììû; äëÿ ýòîãî ñïðîåêòèðóåì åå òàê, ÷òîáû îíà ïðåêðàùàëà ðàáîòó ïðè ïîëó÷åíèè êàêîãî-íèáóäü ñïåöèàëüíîãî ñèìâîëà, ñêàæåì *. Ïîñòàâëåííóþ çàäà÷ó ìîæíî ðåøèòü, èñïîëüçóÿ öèêë while:
/*ââîä-âûâîä2 */
/*ââîä è ïå÷àòü ñèìâîëîâ äî ïîñòóïëåíèÿ çàâåðøàþùåãî ñèìâîëà*/
#include.
#define STOP * /*äàåò ñèìâîëó * ñèìâîëè÷åñêîå èìÿ STOP*/
Main().
{
Char ch;
Ch = getchar; /* ñòðîêà 9 */
While(ch!= STOP){ /* ñòðîêà 10 /
Putchar (ch); / * ñòðîêà 11 */
Ch=getchar (); / * ñòðîêà 12 */
}
}
 äàííîì ïðèìåðå áûëà èñïîëüçîâàíà ñòðóêòóðà ïðîãðàììû, îáñóæäàâøàÿñÿ íàìè â êîíöå ãë. 5 (âîïðîñ 3). Ïðè ïåðâîì ïðîõîæäåíèè òåëà öèêëà ôóíêöèÿ putchar() ïîëó÷àåò çíà÷åíèå ñâîåãî àðãóìåíòà â ðåçóëüòàòå âûïîëíåíèÿ îïåðàòîðà, ðàñïîëîæåííîãî â ñòðîêå 9; â äàëüíåéøåì, âïëîòü äî çàâåðøåíèÿ ðàáîòû öèêëà, çíà÷åíèåì ýòîãî àðãóìåíòà ÿâëÿåòñÿ ñèìâîë, ïåðåäàâàåìûé ïðîãðàììå ôóíêöèåé getchar( ), ðàñïîëîæåííîé â ñòðîêå 12. Ìû ââåëè íîâóþ îïåðàöèþ îòíîøåíèÿ !=, ñìûñë êîòîðîé âûðàæàåòñÿ ñëîâàìè "íå ðàâíî".  ðåçóëüòàòå âñåãî ýòîãî öèêë while áóäåò îñóùåñòâëÿòü ÷òåíèå è ïå÷àòü ñèìâîëîâ äî òåõ ïîð, ïîêà íå ïîñòóïèò ïðèçíàê STOP. Ìû ìîãëè áû îïóñòèòü â ïðîãðàììå äèðåêòèâó #define è èñïîëüçîâàòü ëèøü ñèìâîë * â îïåðàòîðå while, íî íàø ñïîñîá äåëàåò ñìûñë äàííîãî çíàêà áîëåå î÷åâèäíûì.
Ïåðåä òåì êàê ïðèñòóïèòü ê âûïîëíåíèþ ýòîé çàìå÷àòåëüíîé ïðîãðàììû íà ñâîåé ìàøèíå, âçãëÿíèòå íà åå ñëåäóþùèé âàðèàíò. Ïðîãðàììà, ïðèâåäåííàÿ íèæå, äåëàåò òî æå ñàìîå, íî ñòèëü åå íàïèñàíèÿ ëó÷øå îòâå÷àåò äóõó ÿçûêà Ñè:
/* ââîä-âûâîäÇ */
#include.
#define STOP *
Main( ).
{
Char ch;
While ((ch=getchar( )) != STOP) /* ñòðîêà 8 */
Putchar (ch);
}
Îäíà ñòðîêà 8 ýòîé ïðîãðàììû çàìåíÿåò ñòðîêè 9, 10 è 12 ïðîãðàììû ââîä-âûâîä2. Êàê æå ðàáîòàåò ýòîò îïåðàòîð? Íà÷íåì ñ òîãî, ÷òî ðàññìîòðèì ñîäåðæèìîå âíóòðåííèõ ñêîáîê:
Ch = getchar( ).
Ýòî - âûðàæåíèå. Åãî ñìûñë çàêëþ÷àåòñÿ â âûçîâå ôóíêöèè getchar( ) è ïðèñâàèâàíèè ïîëó÷åííîãî çíà÷åíèÿ ïåðåìåííîé ch. Îäíèì òàêèì äåéñòâèåì ìû âûïîëíèì òî, ÷åìó â ïðîãðàììå ââîä-âûâîä2 áûëè ïîñâÿùåíû ñòðîêè 9 è 12. Äàëåå íàïîìíèì, ÷òî ëþáîå âûðàæåíèå èìååò çíà÷åíèå è ÷òî çíà÷åíèå âûðàæåíèÿ, âêëþ÷àþùåãî â ñåáÿ îïåðàöèþ ïðèñâàèâàíèÿ, ñîâïàäàåò ñî çíà÷åíèåì ïåðåìåííîé, ðàñïîëîæåííîé ñëåâà îò çíàêà = . Ñëåäîâàòåëüíî, çíà÷åíèå âûðàæåíèÿ (ch = getchar( )) - ýòî âåëè÷èíà ïåðåìåííîé ch, òàê ÷òî.
(ch = getchar( )) ! = STOP
Èìååò òî æå äåéñòâèå, ÷òî è.
Ch != STOP
Òåì ñàìûì âûïîëíÿåòñÿ ïðîâåðêà, êîòîðóþ â ïðîãðàììå ââîä-âûâîä2 îñóùåñòâëÿë îïåðàòîð, ðàñïîëîæåííûé â ñòðîêå 10. Êîíñòðóêöèè ïîäîáíîãî ñîðòà (îáúåäèíåíèå â îäíîì âûðàæåíèè îïåðàöèé ïðèñâàèâàíèÿ è ñðàâíåíèÿ) äîâîëüíî ÷àñòî èñïîëüçóþòñÿ ïðè ïðîãðàììèðîâàíèè íà ÿçûêå Ñè:

Àíàëîãè÷íî íàøåìó ïðåäûäóùåìó ïðèìåðó, â êîòîðîì ïðèìåíÿëàñü êîíñòðóêöèÿ while (++ size < 18.5), äàííàÿ ôîðìà çàïèñè îáëàäàåò òåì ïðåèìóùåñòâîì, ÷òî ïîçâîëÿåò îáúåäèíÿòü â îäíîì âûðàæåíèè ïðîâåðêó óñëîâèÿ îêîí÷àíèÿ öèêëà è äåéñòâèå ïî èçìåíåíèþ îäíîãî èç îïåðàíäîâ îïåðàöèè ñðàâíåíèÿ. Ïîäîáíàÿ ñòðóêòóðà î÷åíü íàïîìèíàåò íàì ðàññóæäåíèÿ, êîòîðûìè ìîã áû ñîïðîâîæäàòüñÿ äàííûé ïðîöåññ: "ß ÷èòàþ ñèìâîë, àíàëèçèðóþ åãî è ðåøàþ, ÷òî äåëàòü äàëüøå".
Òåïåðü âåðíåìñÿ ê íàøåé ïðîãðàììå è ïîïðîáóåì åå âûïîëíèòü. Åñëè â âàøåé ñèñòåìå ðåàëèçîâàí íåáóôåðèçîâàííûé ââîä, ðåçóëüòàò ìîæåò âûãëÿäåòü, íàïðèìåð, ñëåäóþùèì îáðàçîì:
ÈÈííòòååððååññííîî ððààááîîòòààååòò ëëèè îîííàà . Äóìàþ ÷òî äà.
Ïðè ââîäå âñå ñèìâîëû âïëîòü äî ïðèçíàêà STOP (çâåçäî÷êà), ìåäëåííî îòîáðàæàþòñÿ íà ýêðàíå (ýõî-ïå÷àòü). Äóáëèðóþòñÿ äàæå ïðîáåëû. Îäíàêî, êàê òîëüêî âû ââåëè ïðèçíàê STOP, ðàáîòà ïðîãðàììû ïðåêðàùàåòñÿ è âñå, ÷òî âû íàáèðàåòå íà ïóëüòå ïîñëå ýòîãî, ïîÿâëÿåòñÿ íà ýêðàíå áåç ýõî-äóáëèðîâàíèÿ.
Òåïåðü ïîñìîòðèì, ÷òî áóäåò ïðîèñõîäèòü â ñèñòåìå, îáëàäàþùåé áóôåðèçîâàííûì ââîäîì.  ýòîì ñëó÷àå ïðîãðàììà íå íà÷íåò ðàáîòàòü äî òåõ ïîð, ïîêà âû íå íàæìåòå íà êëàâèøó [ââîä]. Âîò ïðèìåð âîçìîæíîãî äèàëîãà.
Èíòåðåñíî, ðàáîòàåò ëè îíà. Ãì , íå çíàþ [ââîä].
Èíòåðåñíî, ðàáîòàåò ëè îíà.
Ïåðâàÿ ñòðîêà áûëà öåëèêîì ïåðåäàíà ïðîãðàììå. Ïðîãðàììà ïîñëåäîâàòåëüíî ÷èòàåò ýòó ñòðîêó ïî îäíîìó ñèìâîëó è òàêæå ïî îäíîìó ñèìâîëó âûâîäèò íà ïå÷àòü äî òåõ ïîð, ïîêà íå âñòðåòèò ñèìâîë *.
Òåïåðü íàïèøåì íåñêîëüêî áîëåå ïîëåçíóþ ïðîãðàììó. Ìû çàñòàâèì åå ïîäñ÷èòûâàòü ñèìâîëû, êîòîðûå îíà ÷èòàåò. Íàì òðåáóåòñÿ äëÿ ýòîãî ââåñòè â ïðåäûäóùóþ ïðîãðàììó ëèøü íåêîòîðûå èçìåíåíèÿ.
/* ïîäñ÷åò ñèìâîëîâ! */
#define STOP *
Main( ).
{
char ch;
int count =0; /* èíèöèàëèçàöèÿ ñ÷åò÷èêà ñèìâîëîâ 0 */
while ((ch = getchar( ))!= STOP).
{
putchar (ch);
count++; /* ïðèáàâèòü 1 ê ñ÷åò÷èêó */
}
Printf (" \n Âñåãî áûëî ïðî÷èòàíî %d ñèìâîëîâ \n ' , count);
}
×òåíèå îäíîé ñòðîêè.
Äàâàéòå ïîäóìàåì, êàêèå äîïîëíèòåëüíûå óñîâåðøåíñòâîâàíèÿ ìîæíî ââåñòè â ïðîãðàììó, èñïîëüçóÿ òîëüêî òå ñðåäñòâà, êîòîðûìè ìû âëàäååì. Ïåðâîå, ÷òî ëåãêî ìîæíî ñäåëàòü - ýòî çàìåíèòü ïðèçíàê îêîí÷àíèÿ ââîäà äàííûõ. Íî ìîæíî ëè ïðåäëîæèòü ÷òî-òî ëó÷øåå, ÷åì ñèìâîë *? Îäíîé èç âîçìîæíîñòåé ÿâëÿåòñÿ èñïîëüçîâàíèå ñèìâîëà "íîâà ñòðîêà" (\n). Äëÿ ýòîãî íóæíî ëèøü ïåðåîïðåäåëèòü ïðèçíàê STOP.
#define STOP ' \n '.
Êàêîé ýòî äàñò ýôôåêò? Î÷åíü áîëüøîé âåäü ñèìâîë "íîâàÿ ñòðîêà" ïåðåñûëàåòñÿ ïðè íàæàòèè êëàâèøè [ââîä], ñëåäîâàòåëüíî, â ðåçóëüòàòå íàøà ïðîãðàììà áóäåò îáðàáàòûâàòü îäíó ââîäèìóþ ñòðîêó. Ïðåäïîëîæèì, íàïðèìåð, ÷òî ìû âíåñëè óêàçàííîå èçìåíåíèå â ïðîãðàììó ïîäñ÷åò ñèìâîëîâ1, à çàòåì ïðè åå âûïîëíåíèè ââåëè ñëåäóþùóþ ñòðîêó:
Î! Áûòü ñåé÷àñ âî Ôðåñíî, êîãäà çäåñü ëåòî, [ââîä].
 îòâåò íà ýêðàíå ïîÿâÿòñÿ ñëåäóþùèå ñòðîêè.
Î! Áûòü ñåé÷àñ âî Ôðåñíî, êîãäà çäåñü ëåòî, Âñåãî áüïî ïðñ÷èòàíî 43 ñèìâîëà.
(Åñëè áû ìû íå âêëþ÷èëè â óïðàâëÿþùóþ ñòðîêó îïåðàòîðà printf( ) â êà÷åñòâå ïåðâîãî ñèìâîëà ïðèçíàê \n, âòîðîå ñîîáùåíèå ïîÿâèëîñü áû ñïðàâà îò çàïÿòîé, ïîñëå ñëîâà ëåòî. Ìû ïðåäïî÷ëè èçáåæàòü òàêîãî ñêëåèâàíèÿ ñòðîê).
Ïðèçíàê, ïîÿâëÿþùèéñÿ â ðåçóëüòàòå íàæàòèÿ êëàâèøè [ââîä] íå âõîäèò â ÷èñëî ñèìâîëîâ (43), ïîäñ÷èòàííûõ ïðîãðàììîé, ïîñêîëüêó ïîäñ÷åò îñóùåñòâëÿåòñÿ âíóòðè öèêëà.
×òåíèå îäèíî÷íîãî ôàéëà.
Êàêèì ìîæåò áûòü èäåàëüíûé ïðèçíàê STOP? Ýòî äîëæåí áûòü òàêîé ñèìâîë, êîòîðûé îáû÷íî íå èñïîëüçóåòñÿ â òåêñòå è ñëåäîâàòåëüíî, íå ïðèâîäèò ê ñèòóàöèè, êîãäà îí ñëó÷àéíî âñòðåòèòñÿ ïðè ââîäå, è ðàáîòà ïðîãðàììû áóäåò îñòàíîâëåíà ðàíüøå ÷åì ìû õîòåëè áû.
Ïðîáëåìà ïîäîáíîãî ñîðòà íå íîâà, è, ê ñ÷àñòüþ äëÿ íàñ, îíà óæå áûëà óñïåøíî ðåøåíà ïðîåêòèðîâùèêàìè âû÷èñëèòåëüíûõ ñèñòåì. Íà ñàìîì äåëå çàäà÷à, êîòîðóþ îíè ðàññìàòðèâàëè, áûëà íå ñêîëüêî îòëè÷íîé îò íàøåé, íî ìû âïîëíå ìîæåì âîñïîëüçîâàòüñÿ èõ ðåøåíèåì. Çàíèìàâøàÿ èõ ïðîáëåìà êàñàëàñü "ôàéëîâ". Ôàéëîì ìîæíî íàçâàòü ó÷àñòîê ïàìÿòè, â êîòîðûé ïîìåùåíà íåêîòîðàÿ èíôîðìàöèÿ. Îáû÷íî ôàéë õðàíèòñÿ â íåêîòîðîé äîëãîâðåìåííîé ïàìÿòè, íàïðèìåð íà ãèáêèõ èëè æåñòêèõ äèñêàõ èëè íà ìàãíèòíîé ëåíòå. ×òîáû îòìå÷àòü, ãäå êîí÷àåòñÿ îäèí ôàéë è íà÷èíàåòñÿ äðóãîé, ïîëåçíî èìåòü ñïåöèàëüíûé ñèìâîë, óêàçûâàþùèé íà êîíåö ôàéëà. Ýòî äîëæåí áûòü ñèìâîë, êîòîðûé íå ìîæåò ïîÿâèòüñÿ ãäå-íèáóäü â ñåðåäèíå ôàéëà, òî÷íî òàê æå êàê âûøå íàì òðåáîâàëñÿ ñèìâîë, îáû÷íî íå âñòðå÷àþùèéñÿ âî ââîäèìîì òåêñòå. Ðåøåíèåì óêàçàííîé ïðîáëåìû ñëóæèò ââåäåíèå ñïåöèàëüíîãî ïðèçíàêà, íàçûâàåìîãî "End-of-File" (êîíåö ôàéëà), èëè EOF, äëÿ êðàòêîñòè. Âûáîð êîíêðåòíîãî ïðèçíàêà EOF çàâèñèò îò òèïà ñèñòåìû îí ìîæåò ñîñòîÿòü äàæå èç íåñêîëüêèõ ñèìâîëîâ. Íî òàêîé ïðèçíàê âñåãäà ñóùåñòâóåò, è êîìïèëÿòîð ñ ÿçûêà Ñè, êîòîðûì âû ïîëüçóåòåñü, êîíå÷íî æå "çíàåò", êàê òàêîé ïðèçíàê äåéñòâóåò â âàøåé ñèñòåìå.

ÐÈÑ. 6.4. Ñòðóêòóðà òåêñòîâîãî ôàéëà ñ ïðèçíàêîì EOF
Êàêèì îáðàçîì ìîæíî âîñïîëüçîâàòüñÿ ñèìâîëîì EOF? Îáû÷íî åãî îïðåäåëåíèå ñîäåðæèòñÿ â ôàéëå . Îáùåóïîòðåáèòåëüíûì ÿâëÿåòñÿ îïðåäåëåíèå.
#define EOF (-1).
Ýòî äàåò âîçìîæíîñòü èñïîëüçîâàòü â ïðîãðàììàõ âûðàæåíèÿ, ïîäîáíûå, íàïðèìåð, òàêîìó.
While ((ch=getchar( ))!= EOF).
Ïîýòîìó ìû ìîæåì ïåðåïèñàòü íàøó ïðåäûäóùóþ ïðîãðàììó, îñóùåñòâëÿþùóþ ââîä è ýõî-ïå÷àòü ñèìâîëîâ, òàê:
/* ââîä-âûâîä4 */
#include < stdio.h>
Main( ).
{
Int ch;
While ((ch = getchar( ))! = EOF).
Putchar (ch);
}
Îòìåòèì ñëåäóþùèå ìîìåíòû:
1. Íàì íå íóæíî ñàìèì îïðåäåëÿòü ïðèçíàê EOF, ïîñêîëüêó çàáîòó îá ýòîì áåðåò íà ñåáÿ ôàéë stdio.h.
2. Ìû ìîæåì íå èíòåðåñîâàòüñÿ ôàêòè÷åñêèì çíà÷åíèåì ñèìâîëà EOF, ïîñêîëüêó äèðåêòèâà #define, èìåþùàÿñÿ â ôàéëå stdio.h, ïîçâîëÿåò íàì èñïîëüçîâàòü åãî ñèìâîëè÷åñêîå ïðåäñòàâëåíèå.
3. Ìû èçìåíèëè òèï ïåðåìåííîé ch ñ char íà int. Ìû ïîñòóïèëè òàê ïîòîìó, ÷òî çíà÷åíèÿìè ïåðåìåííûõ òèïà char ÿâëÿþòñÿ öåëûå ÷èñëà áåç çíàêà â äèàïàçîíå îò 0 äî 255, a ïðèçíàê EOF ìîæåò èìåòü ÷èñëîâîå çíà÷åíèå -1. Ýòà âåëè÷èíà íåäîïóñòèìà äëÿ ïåðåìåííîé òèïà char, íî âïîëíå ïîäõîäèò äëÿ ïåðåìåííîé òèïà int. Ê ñ÷àñòüþ, ôóíêöèÿ getchar() ôàêòè÷åñêè âîçâðàùàåò çíà÷åíèå òèïà int, ïîýòîìó îíà â ñîñòîÿíèè ïðî÷åñòü ñèìâîë EOF.
4. Ïåðåìåííàÿ ch öåëîãî òèïà íèêàê íå ìîæåò ïîâëèÿòü íà ðàáîòó ôóíêöèè putchar( ). Îíà ïðîñòî âûâîäèò íà ïå÷àòü ñèìâîëüíûé ýêâèâàëåíò çíà÷åíèÿ àðãóìåíòà.
5. Ïðè ðàáîòå ñ äàííîé ïðîãðàììîé, êîãäà ñèìâîëû ââîäÿòñÿ ñ êëàâèàòóðû, íåîáõîäèìî óìåòü ââîäèòü ïðèçíàê EOF. He äóìàéòå, ÷òî âû ìîæåòå ïðîñòî óêàçàòü áóêâû E-Î-F èëè ÷èñëî -1. (×èñëî -1 ñëóæèò ýêâèâàëåíòîì êîäà ASCII äàííîãî ñèìâîëà, à íå ñàìèì ýòèì ñèìâîëîì. Âìåñòî ýòîãî âàì íåîáõîäèìî óçíàòü, êàêîå ïðåäñòàâëåíèå èñïîëüçóåòñÿ â âàøåé ñèñòåìå.  áîëüøèíñòâå ðåàëèçàöèé îïåðàöèîííîé ñèñòåìû UNIX, íàïðèìåð, ââîä çíàêà [CTRL/d] (íàæàòü íà êëàâèøó [d], äåðæà íàæàòîé êëàâèøó [CTRL]) èíòåðïðåòèðóåòñÿ êàê ïðèçíàê EOF. Âî ìíîãèõ ìèêðîêîìïüþòåðàõ äëÿ òîé æå öåëè èñïîëüçóåòñÿ çíàê [CTRL/z].
Ïðèâåäåì ðåçóëüòàò ðàáîòû ïðîãðàììû ââîä-âûâîä4 â ñèñòåìå, îáëàäàþùåé áóôåðèçîâàííûì ââîäîì:
0íà èäåò âî âñåé êðàñå -
Îíà èäåò âî âñåé êðàñå -
Ñâåòëà, êàê íî÷ü åå ñòðàíû.Ñâåòëà, êàê íî÷ü åå ñòðàíû.
Ëîðä Áàéðîí.
Ëîðä Áàéðîí.
[CTRL/z].
Êàæäûé ðàç ïðè íàæàòèè êëàâèøè [ââîä] ïðîèçâîäèòñÿ îáðàáîòêà ñèìâîëîâ, ïîïàâøèõ â áóôåð, è êîïèÿ ñòðîêè âûâîäèòñÿ íà ïå÷àòü. Ýòî ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà ìû íå ââåäåì ïðèçíàê EOF.
Äàâàéòå îñòàíîâèìñÿ è ïîäóìàåì î âîçìîæíîñòÿõ ïðîãðàììû ââîä-âûâîä4. Îíà îñóùåñòâëÿåò âûâîä íà ýêðàí ñèìâîëîâ íåçàâèñèìî îò òîãî, îòêóäà îíè ïîñòóïàþò. Ïðåäïîëîæèì, ìû ñóìåëè ñäåëàòü òàê, ÷òî ïðîãðàììà ââîäèò ñèìâîëû èç íåêîòîðîãî ôàéëà.  ýòîì ñëó÷àå îíà áóäåò îñóùåñòâëÿòü âûâîä ñîäåðæèìîãî ôàéëà íà ýêðàí è îñòàíîâèòñÿ òîëüêî òîãäà, êîãäà äîñòèãíåò êîíöà ôàéëà, ïîñêîëüêó îáíàðóæèò ïðèçíàê EOF. Èëè ïðåäïîëîæèì, ÷òî ó íàñ åñòü ñïîñîá îðãàíèçîâàòü âûâîä ðåçóëüòàòîâ ðàáîòû ïðîãðàììû â íåêîòîðûé ôàéë. Òîãäà ìîæíî íàáðàòü êàêîé-íèáóäü òåêñò íà êëàâèàòóðå è ïðè ïîìîùè ïðîãðàììû ââîä-âûâîä4 ïîìåñòèòü åãî âî âíåøíþþ ïàìÿòü. Èëè ìû ìîãëè áû âûïîëíèòü îáà äåéñòâèÿ îäíîâðåìåííî: íàïðèìåð, îñóùåñòâèòü ââîä äàííûõ èç îäíîãî ôàéëà è ïåðåñëàòü èõ â äðóãîé.  ýòîì ñëó÷àå ïðîãðàììà ââîä-âûâîä4 èñïîëüçîâàëàñü áû äëÿ êîïèðîâàíèÿ ôàéëîâ. Ñëåäîâàòåëüíî, íàøà ìàëåíüêàÿ ïðîãðàììà ìîãëà áû ïðîñìàòðèâàòü ñîäåðæèìîå ôàéëîâ, ñîçäàâàòü íîâûå ôàéëû è ïîëó÷àòü êîïèè ôàéëîâ. Íåïëîõî äëÿ òàêîé êîðîòêîé ïðîãðàììû! Êëþ÷ ê ðåøåíèþ ýòèõ ïðîáëåì - â óïðàâëåíèè ââîäîì è âûâîäîì. Ýòî ïîñëóæèò òåìîé ïðåäñòàâëåííîãî íèæå îáñóæäåíèÿ.
ÏÅÐÅÊËÞ×ÅÍÈÅ È ÐÀÁÎÒÀ Ñ ÔÀÉËÀÌÈ.
Ïîíÿòèå ââîäà-âûâîäà âêëþ÷àåò â ñåáÿ ôóíêöèè, äàííûå è óñòðîéñòâà. Ðàññìîòðèì, íàïðèìåð, íàøó ïðîãðàììó ââîä-âûâîä4.  íåé èñïîëüçóåòñÿ ôóíêöèÿ getchar( ), îñóùåñòâëÿþùàÿ ââîä, ïðè÷åì óñòðîéñòâî ââîäà - êëàâèàòóðà (â ñîîòâåòñòâèè ñ íàøèì ïðåäïîëîæåíèåì), à âõîäíûå äàííûå - îòäåëüíûå ñèìâîëû. Íàì áû õîòåëîñü ñîõðàíèòü ôóíêöèè ââîäà è òèï äàííûõ, íî èçìåíèòü èñòî÷íèê èõ ïîñòóïëåíèÿ â ïðîãðàììó. Çàäàäèìñÿ âîïðîñîì: îòêóäà ïðîãðàììà óçíàåò, ãäå èñêàòü âõîäíûå äàííûå?
Ïî óìîë÷àíèþ Ñè-ïðîãðàììà ðàññìàòðèâàåò "ñòàíäàðòíûé ââîä" êàê èñòî÷íèê ïîñòóïëåíèÿ äàííûõ. "Ñòàíäàðòíûì ââîäîì íàçûâàåòñÿ óñòðîéñòâî, ïðèíÿòîå â êà÷åñòâå îáû÷íîãî ñðåäñòâà ââîäà äàííûõ â ìàøèíó. Ýòî ìîæåò áûòü óñòðîéñòâî ÷òåíèÿ äàííûõ ñ ìàãíèòíîé ëåíòû èëè ïåðôîêàðò, òåëåòàéï èëè (êàê ìû ïðîäîëæàåì ñ÷èòàòü) òåðìèíàë. Ñîâðåìåííàÿ ìàøèíà - ýòî ïîñëóøíûé èíñòðóìåíò, è ìû ìîæåì âîçäåéñòâîâàòü íà íåå òàê, ÷òîáû îíà ââîäèëà äàííûå èç ëþáîãî èñòî÷íèêà.  ÷àñòíîñòè, ìû ìîæåì ñîîáùèòü ïðîãðàììå, ÷òî èñòî÷íèê âõîäíûõ äàííûõ - ôàéë, à íå êëàâèàòóðà.
Ñóùåñòâóþò äâà ñïîñîáà íàïèñàíèÿ ïðîãðàìì, ðàáîòàþùèõ ñ ôàéëàìè. Ïåðâûé ñïîñîá çàêëþ÷àåòñÿ â ÿâíîì èñïîëüçîâàíèè ñïåöèàëüíûõ ôóíêöèé, êîòîðûå îòêðûâàþò è çàêðûâàþò ôàéëû, îðãàíèçóþò ÷òåíèå è çàïèñü äàííûõ è ò. ï.; ìû íå õîòèì ïîêà êàñàòüñÿ ýòîãî âîïðîñà. Âòîðîé ñïîñîá ñîñòîèò â òîì, ÷òîáû èñïîëüçîâàòü ïðîãðàììó, ñïðîåêòèðîâàííóþ ïåðâîíà÷àëüíî â ïðåäïîëîæåíèè, ÷òî äàííûå â íåå ââîäÿòñÿ ñ êëàâèàòóðû è âûâîäÿòñÿ íà ýêðàí, ïåðåêëþ÷èòü ââîä è âûâîä íà äðóãèå èíôîðìàöèîííûå êàíàëû: íàïðèìåð, èç ôàéëà â ôàéë. Ýòîò ñïîñîá â íåêîòîðûõ îòíîøåíèÿõ îáëàäàåò ìåíüøèìè âîçìîæíîñòÿìè, ÷åì ïåðâûé, íî çàòî ãîðàçäî ïðîùå â èñïîëüçîâàíèè. Ìû èçó÷èì ïîíÿòèå ïåðåêëþ÷åíèÿ â äàííîì ðàçäåëå.
ÎÏÅÐÀÖÈÎÍÍÀß ÑÈÑÒÅÌÀ UNIX.
Ïåðåêëþ÷åíèå âûâîäà.
Ïðåäïîëîæèì, âû îñóùåñòâèëè êîìïèëÿöèþ ïðîãðàììû ââîä-âûâîä4 è ïîìåñòèëè âûïîëíÿåìûé îáúåêòíûé êîä â ôàéë ñ èìåíåì getput4. Çàòåì, ÷òîáû çàïóñòèòü äàííóþ ïðîãðàììó, âû ââîäèòå ñ òåðìèíàëà òîëüêî èìÿ ôàéëà.
Getput4.
È ïðîãðàììà âûïîëíÿåòñÿ òàê, êàê áûëî îïèñàíî âûøå, ò. å. ïîëó÷àåò â êà÷åñòâå âõîäíûõ äàííûõ ñèìâîëû, ââîäèìûå ñ êëàâèàòóðû. Òåïåðü ïðåäïîëîæèì, ÷òî âû õîòèòå ïîñìîòðåòü, êàê íàøà ïðîãðàììà ðàáîòàåò ñ "òåêñòîâûì ôàéëîì" ñ èìåíåì words. (Òåêñòîâûé ôàéë - ýòî ôàéë, ñîäåðæàùèé íåêîòîðûé òåêñò, ò å. äàííûå â âèäå ñèìâîëîâ. Ýòî ìîæåò áûòü, íàïðèìåð, î÷åðê èëè ïðîãðàììà íà ÿçûêå Ñè. Ôàéë, ñîäåðæàùèé êîìàíäû íà ìàøèííîì ÿçûêå, íàïðèìåð ôàéë, ïîëó÷åííûé â ðåçóëüòàòå êîìïèëÿöèè äàííîé ïðîãðàììû, íå ÿâëÿåòñÿ òåêñòîâûì. Ïîñêîëüêó íàøà ïðîãðàììà çàíèìàåòñÿ îáðàáîòêîé ñèìâîëîâ, îíà äîëæíà èñïîëüçîâàòüñÿ âìåñòå ñ òåêñòîâûìè ôàéëàìè.) Âñå, ÷òî äëÿ ýòîãî òðåáóåòñÿ - ââåñòè âìåñòî êîìàíäû, óêàçàííîé âûøå, ñëåäóþùóþ:
Getput4 < words.
Ñèìâîë < ñëóæèò îáîçíà÷åíèåì îïåðàöèè ïåðåêëþ÷åíèÿ, èñïîëüçóåìîé â ÎÑ UNIX. Âûïîëíåíèå óêàçàííîé îïåðàöèè ïðèâîäèò ê òîìó, ÷òî ñîäåðæèìîå ôàéëà words áóäåò íàïðàâëåíî â ôàéë ñ èìåíåì getput4. Ñàìà ïðîãðàììà ââîä-âûâîä4 íå çíàåò (è íå äîëæíà çíàòü), ÷òî âõîäíûå äàííûå ïîñòóïàþò èç íåêîòîðîãî ôàéëà, à íå ñ òåðìèíàëà; íà åå âõîä ïðîñòî ïîñòóïàåò ïîòîê ñèìâîëîâ, îíà ÷èòàåò èõ è ïîñëåäîâàòåëüíî ïî îäíîìó âûâîäèò íà ïå÷àòü äî òåõ ïîð, ïîêà íå âñòðåòèò ïðèçíàê EOF.  îïåðàöèîííîé ñèñòåìå UNIX ôàéëû è óñòðîéñòâà ââîäà-âûâîäà â ëîãè÷åñêîì ñìûñëå ïðåäñòàâëÿþò ñîáîé îäíî è òî æå, ïîýòîìó òåïåðü ôàéë äëÿ äàííîé ïðîãðàììû ÿâëÿåòñÿ "óñòðîéñòâîì" ââîäà-âûâîäà. Åñëè âû ïîïðîáóåòå ââåñòè êîìàíäó.
Getput4 < words.
Òî â ðåçóëüòàòå íà ýêðàíå ìîãóò ïîÿâèòüñÿ, íàïðèìåð, ñëåäóþùèå ñòðîêè:
 îäíîì ìãíîâåíüè âèäåòü âå÷íîñòü,
Îãðîìíûé ìèð - â çåðíå ïåñêà,
 åäèíîé ãîðñòè - áåñêîíå÷íîñòü,
È íåáî - â ÷àøå÷êå öâåòêà.
Ïåðåêëþ÷åíèå ââîäà.
Òåïåðü ïðåäïîëîæèì (åñëè âû åùå íå óñòàëè è â ñîñòîÿíèè ÷òî-íèáóäü ïðåäïîëîæèòü), âàì õî÷åòñÿ, ÷òîáû ñëîâà, ââîäèìûå ñ êëàâèàòóðû, ïîïàäàëè â ôàéë ñ èìåíåì mywords. Äëÿ ýòîãî âû äîëæíû ââåñòè êîìàíäó.
Getput4 > mywords.
È íà÷àòü ââîä ñèìâîëîâ. Ñèìâîë > ñëóæèò îáîçíà÷åíèåì åùå îäíîé îïåðàöèè ïåðåêëþ÷åíèÿ, èñïîëüçóåìîé â ÎÑ UNIX. Åå âûïîëíåíèå ïðèâîäèò ê òîìó, ÷òî ñîçäàåòñÿ íîâûé ôàéë ñ èìåíåì mywords, à çàòåì ðåçóëüòàò ðàáîòû ïðîãðàììû ââîä-âûâîä4, ïðåäñòàâëÿþùèé ñîáîé êîïèþ ââîäèìûõ ñèìâîëîâ, íàïðàâëÿåòñÿ â äàííûé ôàéë. Åñëè ôàéë ñ èìåíåì mywords óæå ñóùåñòâóåò, îí îáû÷íî óíè÷òîæàåòñÿ, è âìåñòî íåãî ñîçäàåòñÿ íîâûé. ( íåêîòîðûõ ðåàëèçàöèÿõ ÎÑ UNIX, îäíàêî, âàì ïðåäîñòàâëÿåòñÿ âîçìîæíîñòü çàùèòèòü ñóùåñòâóþùèå ôàéëû.) Íà ýêðàíå â äàííîì ñëó÷àå ïîÿâÿòñÿ ëèøü ââîäèìûå âàìè ñèìâîëû; èõ æå êîïèè áóäóò íàïðàâëåíû â óêàçàííûé ôàéë. ×òîáû çàêîí÷èòü ðàáîòó ïðîãðàììû, ââåäèòå ïðèçíàê EOF; â ñèñòåìå UNIX ýòî îáû÷íî ñèìâîë [CTRL/d]. Ïîïðîáóéòå âîñïîëüçîâàòüñÿ îïèñàííîé çäåñü îïåðàöèåé. Åñëè âàì íè÷åãî äðóãîãî íå ïðèäåò â ãîëîâó, ïðîñòî âîñïðîèçâåäèòå íà ñâîåé ìàøèíå ïðèìåð, ïðèâåäåííûé íèæå. Çíàê ïðèãëàøåíèÿ, âûâîäèìûé íà ýêðàí èíòåðïðåòàòîðîì êîìàíä SHELL, îáîçíà÷àåòñÿ çäåñü ñèìâîëîì %. Íå çàáûâàéòå îêàí÷èâàòü êàæäóþ ââåäåííóþ ñòðîêó ñèìâîëîì [âîçâðàò], ÷òîáû ñîäåðæèìîå áóôåðà ïåðåñûëàëîñü â ïðîãðàììó.
% getput4 > mywords.
Ó âàñ íå äîëæíî áûòü òðóäíîñòåé ñ çàïîìèíàíèåì òîãî, êàêàÿ îïåðàöèÿ ïåðåêëþ÷åíèÿ äëÿ ÷åãî ïðåäíàçíà÷åíà. Íåîáõîäèìî ïîìíèòü òîëüêî, ÷òî çíàê êàæäîé îïåðàöèè óêàçûâàåò íà íàïðàâëåíèå èíôîðìàöèîííîãî ïîòîêà. Âû ìîæåòå ïî àññîöèàöèè ïðåäñòàâëÿòü ñåáå ýòîò çíàê â âèäå âîðîíêè. [CTRL/d].
Ïîñëå òîãî êàê ââåäåí ñèìâîë [CTRL/d], ïðîãðàììà çàêàí÷èâàåò ñâîþ ðàáîòó è âîçâðàùàåò óïðàâëåíèå îïåðàöèîííîé ñèñòåìå UNIX, íà ÷òî óêàçûâàåò ïîâòîðíîå ïîÿâëåíèå çíàêà ïðèãëàøåíèÿ. Êàê óáåäèòüñÿ â òîì, ÷òî íàøà ïðîãðàììà âîîáùå ðàáîòàëà?  ÎÑ UNIX ñóùåñòâóåò êîìàíäà Is, êîòîðàÿ âûâîäèò íà ýêðàí èìåíà ôàéëîâ; îáðàùåíèå ê íåé äîëæíî ïðîäåìîíñòðèðîâàòü âàì, ÷òî ôàéë ñ èìåíåì mywords òåïåðü ñóùåñòâóåò. ×òîáû ïðîâåðèòü åãî ñîäåðæèìîå, âû ìîæåòå âîñïîëüçîâàòüñÿ êîìàíäîé cat èëè çàïóñòèòü çàíîâî ïðîãðàììó ââîä-âûâîä4, íàïðàâëÿÿ â íåå íà ýòîò ðàç ñîäåðæèìîå âõîäíîãî ôàéëà.
% getput4 < mywords.
Êîìáèíèðîâàííîå ïåðåêëþ÷åíèå.
Ïðåäïîëîæèì òåïåðü, ÷òî âû õîòèòå ñîçäàòü êîïèþ ôàéëà mywords è íàçâàòü åå savewords. Ââåäèòå äëÿ ýòîãî êîìàíäó.
Getput4 < mywords > savewords.
È òðåáóåìîå çàäàíèå áóäåò âûïîëíåíî. Êîìàíäà.
Getput4 > savewords < mywords.
Ïðèâåäåò ê òàêîìó æå ðåçóëüòàòó, ïîñêîëüêó ïîðÿäîê óêàçàíèÿ îïåðàöèé ïåðåêëþ÷åíèÿ íå èìååò çíà÷åíèÿ. Íåëüçÿ èñïîëüçîâàòü â îäíîé êîìàíäå îäèí è òîò æå ôàéë è äëÿ ââîäà è äëÿ âûâîäà îäíîâðåìåííî.
Getput4 mywords ÍÅÏÐÀÂÈËÜÍÎ.
Ïðè÷èíà ýòîãî çàêëþ÷àåòñÿ â òîì, ÷òî óêàçàíèå îïåðàöè, > mywords ïðèâîäèò ê ñòèðàíèþ èñõîäíîãî ôàéëà ïåðåä åãî èñïîëüçîâàíèåì â êà÷åñòâå âõîäíîãî.

ÐÈÑ. 6.5. Êîìáèíèðîâàííîå ïåðåêëþ÷åíèå.
Òåïåðü, ìû äóìàåì, íàñòàëî âðåìÿ ñóììèðîâàòü ïðàâèëà, êàñàþùèåñÿ èñïîëüçîâàíèÿ äâóõ îïåðàöèé ïåðåêëþ÷åíèÿ < è >.
1. Îïåðàöèÿ ïåðåêëþ÷åíèÿ ñâÿçûâàåò âûïîëíÿåìóþ ïðîãðàììó (â òîì ÷èñëå è ñòàíäàðòíûå êîìàíäû ÎÑ UNIX) ñ íåêîòîðûì ôàéëîì. Îíà íå ìîæåò èñïîëüçîâàòüñÿ äëÿ ñâÿçè îäíîãî ôàéëà ñ äðóãèì èëè îäíîé ïðîãðàììû ñ äðóãîé.
2. Èìÿ âûïîëíÿåìîé ïðîãðàììû äîëæíî ñòîÿòü ñëåâà îò çíàêà îïåðàöèè, à èìÿ ôàéëà - ñïðàâà îò íåãî.
3. Ïðè èñïîëüçîâàíèè ýòèõ îïåðàöèé ââîä íå ìîæåò îñóùåñòâëÿòüñÿ áîëåå ÷åì èç îäíîãî ôàéëà, à âûâîä - áîëåå ÷åì â îäèí ôàéë.
4. Îáû÷íî ìåæäó èìåíåì è îïåðàöèåé ïðîáåëû íå îáÿçàòåëüíû êðîìå òåõ ðåäêèõ ñëó÷àåâ, êîãäà èñïîëüçóþòñÿ íåêîòîðûå ñèìâîëû ñïåöèàëüíîãî íàçíà÷åíèÿ â èíòåðïðåòàòîðå êîìàíä UNIX. Ìû ìîãëè áû ïèñàòü, íàïðèìåð, òàê: getput4 < words, èëè, ÷òî áîëåå ïðåäïî÷òèòåëüíî, getput4 < words.
Ìû óæå ïðèâåëè âûøå íåñêîëüêî ïðèìåðîâ ïðàâèëüíîãî èñïîëüçîâàíèÿ îïåðàöèé ïåðåêëþ÷åíèÿ. Íèæå äàåòñÿ íåñêîëüêî îøèáî÷íûõ ïðèìåðîâ (addup è count - âûïîëíÿåìûå ïðîãðàììû, a fish è stars - òåêñòîâûå ôàéëû).
Fish > stars Íàðóøåíèå ïðàâèëà 1.
Addup < count Íàðóøåíèå ïðàâèëà 1.
Stars > count Íàðóøåíèå ïðàâèëà 2.
Addup < fish < stars Íàðóøåíèå ïðàâèëà 3.
Count > stars fish Íàðóøåíèå ïðàâèëà 3.
B OC UNIX ïðèìåíÿþòñÿ òàêæå îïåðàöèÿ >>, ïîçâîëÿþùàÿ äîáàâëÿòü äàííûå â êîíåö ñóùåñòâóþùåãî ôàéëà, è îïåðàöèÿ "êàíàë" (|), ñâÿçûâàþùàÿ ôàéë âûâîäà îäíîé ïðîãðàììû ñ ââîäîì äðóãîé. Äëÿ ïîëó÷åíèÿ áîëåå äåòàëüíîé èíôîðìàöèè îáî âñåõ ýòèõ îïåðàöèÿõ âàì íåîáõîäèìî îáðàòèòüñÿ ê ðóêîâîäñòâó ïî ÎÑ UNIX (ïî àíàëîãèè ñ ýòèì íàì ïðèõîäèò â ãîëîâó íàçâàíèå "ÎÑ UNIX: ðóêîâîäñòâî äëÿ íà÷èíàþùèõ").
Ðàññìîòðèì åùå îäèí ïðèìåð: íàïèøåì î÷åíü ïðîñòóþ ïðîãðàììó, øèôðóþùóþ ñîîáùåíèÿ; ñ ýòîé öåëüþ ìû íåìíîãî èçìåíèì ïðîãðàììó ââîä-âûâîä4 è ïîëó÷èì.
/* ïðîñòîé øèôð */
/* çàìåíÿåò êàæäûé ñèìâîë òåêñòà */
/* ñëåäóþùèì ïî ïîðÿäêó èç êîäà ASCII */
#include.
main( ).
{ int ch;
while ((ch = getchar ( )) ! = EOF).
putchar (ch + 1);
}
Ôóíêöèÿ putchar( ) ïåðåâîäèò öåëîå "ch + 1" â ñîîòâåòñòâóþùèé ñèìâîë. Âûïîëíèòå òåïåðü êîìïèëÿöèþ ïðîãðàììû è ïîìåñòèòå âûïîëíÿåìûé îáúåêòíûé êîä â ôàéë ñ èìåíåì simplecode. Çàòåì çàíåñè òå ïðèâåäåííûå íèæå ñòðîêè â ôàéë ñ èìåíåì original. (Äëÿ ýòîãî ìîæíî âîñïîëüçîâàòüñÿ ñèñòåìíûì òåêñòîâûì ðåäàêòîðîì èëè, êàê áûëî ïîêàçàíî ðàíåå, ïðîãðàììîé ââîä-âûâîä4) .
Good spelling is an aid.
To clear writing.
Òåïåðü ââåäèòå êîìàíäó.
Simplecode < original.
Ðåçóëüòàò äîëæåí âûãëÿäåòü ïðèáëèçèòåëüíî òàê:
!!!!!Hppe!tqfmmjoh!jt!bo!bje>Kup!dmfbs!xsjujohl> k.
Áóêâà G çàìåíèòñÿ íà Í, î íà ð è ò.ä. Âàñ ìîæåò óäèâèòü ñëåäóþùåå: âî-ïåðâûõ, ÷òî ïðîáåëû ïðåâðàòèëèñü â âîñêëèöàòåëüíûå çíàêè. Ýòî ñëóæèò íàïîìèíàíèåì, ÷òî ïðîáåë - òàêîé æå ñèìâîë, êàê è âñå îñòàëüíûå. Âî-âòîðûõ, äâå ñòðîêè ñëèëèñü â îäíó. Ïî÷åìó?
Îïåðàöèîííûå ñèñòåìû, îòëè÷íûå îò ÎÑ UNIX.
Çäåñü ìû ãëàâíûì îáðàçîì ðàññìîòðèì, ÷åì îòëè÷àþòñÿ äðóãèå îïåðàöèîííûå ñèñòåìû îò ÎÑ UNIX; ïîýòîìó åñëè âû ïðîïóñòèëè ïðåäûäóùèé ðàçäåë, âåðíèòåñü íàçàä è ïðî÷òèòå åãî.
Âñå îòëè÷èÿ ìîæíî ðàçäåëèòü íà äâå ãðóïïû:
1.  äðóãèõ îïåðàöèîííûõ ñèñòåìàõ ðåàëèçîâàíà îïåðàöèÿ ïåðåêëþ÷åíèÿ.
2. Êîìïèëÿòîðû ñ ÿçûêà Ñè ïðåäîñòàâëÿþò âîçìîæíîñòü èñïîëüçîâàòü îïåðàöèþ ïåðåêëþ÷åíèÿ.
Ìû íå ìîæåì ðàññìîòðåòü âñå âîçìîæíûå îïåðàöèîííûå ñèñòåìû, ïîýòîìó ïðèâåäåì ïðèìåð òîëüêî îäíîé èç íèõ, íî âåñüìà øèðîêî ðàñïðîñòðàíåííîé. Ýòî ñèñòåìà MS-DOS 2; îíà âíà÷àëå áûëà ïðîñòî "îòïðûñêîì" ÎÑ ÑÐ/Ì, à ñåé÷àñ ñàìîñòîÿòåëüíî ðàçâèâàåòñÿ â ñòîðîíó îïåðàöèîííîé ñèñòåìû XENIX, ïîäîáíîé ÎÑ UNIX.  âåðñèþ MS-DOS áûëè ââåäåíû îïåðàöèè ïåðåêëþ÷åíèÿ < è >; îíè ðàáîòàþò â íåé òî÷íî òàê æå, êàê áûëî îïèñàíî â ïðåäûäóùåì ðàçäåëå.
Ó íàñ íåò âîçìîæíîñòè ðàññìîòðåòü âñå êîìïèëÿòîðû ñ ÿçûêà Ñè. Îäíàêî â ïÿòè èç øåñòè âåðñèé êîìïèëÿòîðà, ïðåäíàçíà÷åííûõ äëÿ ìèêðîêîìïüþòåðîâ, ñ êîòîðûìè ìû èìåëè äåëî, äëÿ óêàçàíèÿ îïåðàöèè ïåðåêëþ÷åíèÿ èñïîëüçóþòñÿ ñèìâîëû < è >. Îïåðàöèÿ ïåðåêëþ÷åíèÿ, ðåàëèçóåìàÿ êîìïèëÿòîðîì ñ ÿçûêà Ñè, îòëè÷àåòñÿ îò àíàëîãè÷íîé îïåðàöèè, âûïîëíÿåìîé ÎÑ UNIX, â äâóõ àñïåêòàõ:
1. Óêàçàííàÿ îïåðàöèÿ âûïîëíÿåòñÿ ïðè ðàáîòå ïðîãðàìì, íàïèñàííûõ òîëüêî íà Ñè, â òî âðåìÿ êàê â ÎÑ UNIX îíà ìîæåò èñïîëüçîâàòúñÿ ïðè ðàáîòå ëþáîé ïðîãðàììû.
2. Ìåæäó èìåíåì ïðîãðàììû è çíàêîì îïåðàöèè äîëæåí áûòü îäèí ïðîáåë, à ìåæäó çíàêîì îïåðàöèè è èìåíåì ôàéëà ïðîáåë äîëæåí îòñóòñòâîâàòü. Íèæå ïðèâåäåí ïðèìåð ïðàâèëüíîé êîìàíäû:
Input4 <words.
Êîììåíòàðèé.
Îïåðàöèÿ ïåðåêëþ÷åíèÿ - ýòî ïðîñòîå, íî ìîùíîå ñðåäñòâî. Ñ åå ïîìîùüþ ìû ìîæåì ïðåâðàòèòü íàøó êðîøå÷íóþ ïðîãðàììó ââîä-âûâîä4 â èíñòðóìåíò äëÿ ñîçäàíèÿ, ÷òåíèÿ è êîïèðîâàíèÿ ôàéëîâ. Äàííûé ñïîñîá ñëóæèò èëëþñòðàöèåé ïîäõîäà, ïðèíÿòîãî â ÿçûêå Ñè (è ÎÑ UNIX) è çàêëþ÷àþùåãîñÿ â êîíñòðóèðîâàíèè ïðîñòûõ ñðåäñòâ, êîòîðûå ìîæíî êîìáèíèðîâàòü ðàçëè÷íûì îáðàçîì äëÿ âûïîëíåíèÿ êîíêðåòíûõ çàäà÷.
Ðåçþìå: êàê ïåðåêëþ÷àòü ââîä è âûâîä.
Íà áîëüøèíñòâå ìàøèí, â êîòîðûõ ðåàëèçîâàí êîìïèëÿòîð ñ ÿçûêà Ñè, îïåðàöèþ ïåðåêëþ÷åíèÿ ìîæíî èñïîëüçîâàòü ëèáî äëÿ âñåõ ïðîãðàìì, áëàãîäàðÿ ïîääåðæêå îïåðàöèîííîé ñèñòåìû, ëèáî òîëüêî äëÿ ïðîãðàìì, íàïèñàííûõ íà Ñè, áëàãîäàðÿ íàëè÷èþ êîìïèëÿòîðà ñ ýòîãî ÿçûêà. Íèæå prog áóäåò èìåíåì âûïîëíÿåìîé ïðîãðàììû, a file1 è file2 - èìåíàìè ôàéëîâ.
Ïåðåêëþ÷åíèå âûâîäà â ôàéë: >
Prog >file1.
Ïåðåêëþ÷åíèå ââîäà â ôàéë: <
Prog <file2.
Êîìáèíèðâàííîå ïåðåêëþ÷åíèå:
Prog <file2 >filel èëè prog >filel <file2.
 îáåèõ ôîðìàõ çàïèñè ôàéë ñ èìåíåì file2 èñïîëüçóåòñÿ äëÿ ââîäà äàííûõ, à ôàéë ñ èìåíåì filel - äëÿ âûâîäà.
Ðàñïîëîæåíèå ïðîáåëîâ.
Íåêîòîðûå ñèñòåìû (â îñîáåííîñòè êîìïèëÿòîðû ñ ÿçûêà Ñè) òðåáóþò íàëè÷èÿ ïðîáåëà ñëåâà îò çíàêà îïåðàöèè ïåðåêëþ÷åíèÿ è åãî îòñóòñòâèÿ ñïðàâà îò ýòîãî çíàêà. Äðóãèå ñèñòåìû (ÎÑ UNIX íàïðèìåð) äîïóñêàþò ëþáîå ÷èñëî ïðîáåëîâ (â òîì ÷èñëå è íè îäíîãî) ñëåâà è ñïðàâà îò çíàêà äàííîé îïåðàöèè.
Ãðàôè÷åñêèé ïðèìåð
Ìû ìîæåì âîñïîëüçîâàòüñÿ ôóíêöèÿìè getchar( ) è putchar( ) äëÿ èçîáðàæåíèÿ ãåîìåòðè÷åñêèõ ôèãóð ïðè ïîìîùè ñèìâîëîâ. Íèæå ïðèâåäåíà ïðîãðàììà, êîòîðàÿ ýòî äåëàåò. Îíà ÷èòàåò ñèìâîë, à çàòåì ïå÷àòàåò åãî íåêîòîðîå ÷èñëî ðàç çàâèñÿùåå îò êîäà ASCII ýòîãî ñèìâîëà. Êðîìå òîãî, îíà ïå÷àòàåò íà êàæäîé ñòðîêå òðåáóåìîå ÷èñëî ïðîáåëîâ, ÷òîáû òåêñò îêàçûâàëñÿ â öåíòðå ñòðîêè.
/* ôèãóðû */
/* èçîáðàæàåò ñèììåòðè÷íóþ ôèãóðó èç ñèìâîëîâ */
#include.
main( ).
{
Int ch; /* ïåðåìåííàÿ äëÿ ââîäà ñèìâîëà */
Int index;
Int chnum;
While ((ch=getchar( )) != '\n' ).
{
Chnum - ch %26; /* ïîëó÷åíèå ÷èñëà îò 0 äî 25 */
Index = 0;
While (index++ <(30 - chnum)).
Putchar( ); /* ïå÷àòü ïðîáåëîâ ñäâèãà ê öåíòðó */
Index = 0;
While (index++ <(2* chnum + 1)).
Putchar (ch); /* ïîâòîðíàÿ ïå÷àòü ñèìâîëà */
Putchar( \n );
}
}
Åäèíñòâåííûé íîâûé òåõíè÷åñêèé ïðèåì çäåñü - ýòî èñïîëüçîâàíèå ïîäâûðàæåíèé òàêèõ, êàê (30-chnum) ïðè çàïèñè óñëîâèè â öèêëàõ while. Îäèí öèêë while óïðàâëÿåò ïå÷àòüþ íåîáõîäèìîãî ÷èñëà íà÷àëüíûõ ïðîáåëîâ â êàæäîé ñòðîêå, à âòîðîé - âûâîäîì ñèìâîëîâ íà ïå÷àòü. Ðåçóëüòàò ðàáîòû ïðîãðàììû çàâèñèò îò äàííûõ, êîòîðûå ââîäÿòñÿ. Åñëè, íàïðèìåð, âû ââåäåòå.
What is up?
Òî íà ýêðàíå ïîÿâèòñÿ ñëåäóþùåå.
Wwwwwwwwwwwwwwwwwww.
H.
Ààààààààààààààààààààààààààààààààààààààà.
Ttttttttttttttttttttttttt iiiiiiiiiiiiiiiiiiiiiiiiiii.
Sssssssssssssssssssssss.
Uuuuuuuuuuuuuuuuuuuuuuuuuuu ppppppppppppppppp.
??????????????????????????
×òî âû ìîæåòå äåëàòü ñ ïîìîùüþ ýòîé ïðîãðàììû? Ìîæåòå ïðîñòî èãíîðèðîâàòü åå, èëè æå (ïåðåïèñàâ åå ïî-äðóãîìó) èçìåíÿòü âèä ôèãóð êîòîðûå îíà âûâîäèò íà ïå÷àòü, ëèáî íàêîíåö èñêàòü òàêèå êîìáèíàöèè âõîäíûõ ñèìâîëîâ, ÷òî â ðåçóëüòàòå íà ýêðàíå áóäóò ïîÿâëÿòüñÿ ïðèâëåêàòåëüíûå ôèãóðû íàïðèìåð ïðè ââîäå òàêîé ïîñëåäîâàòåëüíîñòè:
H i j k l m n o p q r s t u i i i.
Ðåçóëüòàò ðàáîòû ïðîãðàììû áóäåò âûãëÿäåòü òàê.
H i i i j j j j j.
K k k k k k k l l l l l l l l l.
M m m m m m m m m m m n n n n n n n n n n n n n.
O o o o o o o o o o o o o o o p p p p p p p p p p p p p p p p p.
Q q q q q q q q q q q q q q q q q q q ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã ã s s s s s s s s s s s s s s s s s s s s s s s.
T t t t t t t t t t t t t t t t t t t t t t t t t.
U u u u u u u u u u u u u u u u u u u u u u u u u u u 111.
L l l.
L l l.
ÑÈÑÒÅÌÍÎ-ÇÀÂÈÑÈÌÛÅ ÑÐÅÄÑÒÂÀ: ÏÎÐÒÛ ÂÂÎÄÀ-ÂÛÂÎÄÀ ÌÈÊÐÎÏÐÎÖÅÑÑÎÐÎÂ INTEL 8086/8088.
Ðàññìîòðèì ðàçëè÷íûå óñòðîéñòâà ââîäà-âûâîäà, ïîñêîëüêó òåïåðü ìû õîòèì îáñóäèòü âîïðîñ î òîì, êàê ïðèñïîñîáèòü ðåàëèçàöèþ êîìïèëÿòîðà ñ ÿçûêà Ñè ê òðåáîâàíèÿì êîíêðåòíîé âû÷èñëèòåëüíîé ñèñòåìû. Ìíîãèå èç ñîâðåìåííûõ ìèêðîêîìïüþòåðîâ ñïðîåêòèðîâàíû íà îñíîâå ìèêðîïðîöåññîðíûõ èíòåãðàëüíûõ ñõåì (ÈÑ) INTEL 8086 è INTEL 8088. Íàèáîëåå èçâåñòíûì ÿâëÿåòñÿ ïåðñîíàëüíûé êîìïüþòåð IBM PC, â êîòîðîì ïðèìåíÿþòñÿ ÈÑ âòîðîãî òèïà. Êîíêðåòíûé ïðèìåð, êîòîðûé ïðèâåäåí íèæå, îòíîñèòñÿ ê óïîìÿíóòîìó êîìïüþòåðó, íî îáñóæäàåìûå ïðèíöèïû ïðèìåíèìû è ïðè ðàññìîòðåíèè äðóãèõ ìèíè-ìàøèí, ïîñòðîåííûõ íà áàçå ñåìåéñòâà ìèêðîïðîöåññîðîâ 8086/8088.
 êîìïüþòåðå òèïà IBM PC êðîìå ÈÑ 8088 èìåþòñÿ è äðóãèå óñòðîéñòâà, íàïðèìåð êëàâèàòóðà, ãðîìêîãîâîðèòåëü, âîçìîæíî, íàêîïèòåëü íà ìèíè-êàññåòå èëè ìàãíèòíîì äèñêå, ìîíèòîð, âñòðîåííàÿ ïàìÿòü, òàéìåðû, à òàêæå ìèêðîïðîöåññîðû äëÿ óïðàâëåíèÿ ïîòîêîì äàííûõ. Öåíòðàëüíûé ïðîöåññîð (âñòðîåííûé â êðèñòàëë 8088) äîëæåí èìåòü âîçìîæíîñòü âçàèìîäåéñòâîâàòü ñ îñòàëüíûìè ÷àñòÿìè êîìïüþòåðà. Íåêîòîðûå èç òàêèõ âçàèìîäåéñòâèé îñóùåñòâëÿþòñÿ ïðè ïîìîùè àäðåñîâ ïàìÿòè, äðóãèå - ïðè ïîìîùè "ïîðòîâ" ââîäà-âûâîäà. Ó ìèêðîïðîöåññîðà 8088 èìååòñÿ 65536 ïîðòîâ, êîòîðûå ìîãóò èñïîëüçîâàòüñÿ ïðè ðàçëè÷íûõ âçàèìîäåéñòâèÿõ. Äëÿ ñâÿçè ñ ýòèì ìèêðîïðîöåññîðîì êàæäîìó óñòðîéñòâó íàçíà÷àåòñÿ ñâîé îïðåäåëåííûé ïîðò èëè ïîðòû. (Çàìåòèì, ÷òî èñïîëüçóþòñÿ íå âñå 65536 ïîðòîâ!) Íàïðèìåð, ïîðòû 992, 993, 1000-1004 èñïîëüçóþòñÿ äëÿ ñâÿçè ñ àäàïòåðîì öâåòíîé ãðàôèêè. Ðàáîòà ãðîìêîãîâîðèòåëÿ óïðàâëÿåòñÿ ïîðòîì ñ íîìåðîì 97. Ýòî âûãëÿäèò íåñêîëüêî ïðîùå, ÷åì óïðàâëåíèå àäàïòåðîì öâåòíîé ãðàôèêè, ïîýòîìó ìû èñïîëüçóåì åãî äëÿ èëëþñòðàöèè ðàáîòû ïîðòîâ ââîäà-âûâîäà.
Ïîðò 97 íå óïðàâëÿåò íåïîñðåäñòâåííîé ðàáîòîé ãðîìêîãîâîðèòåëÿ. Óñòðîéñòâî, îñóùåñòâëÿþùåå ýòè ôóíêöèè, íàçûâàåòñÿ "Ïðîãðàììèðóåìûé ïàðàëëåëüíûé èíòåðôåéñíûé êîíòðîëëåð 8255". Ýòîò ìèêðîïðîöåññîð èìååò òðè "ðåãèñòðà" (íåáîëüøèõ, ëåãêî äî ñòóïíûõ ýëåìåíòà ïàìÿòè), â êàæäîì èç êîòîðûõ ñîäåðæèòñÿ íåêîòîðîå ÷èñëî. ×èñëà â ðåãèñòðàõ èñïîëüçóþòñÿ äëÿ óïðàâëåíèÿ ðàáîòîé äàííîãî óñòðîéñòâà. Êàæäûé ðåãèñòð ñâÿçàí ñ ÈÑ 8088 ÷åðåç ïîðò, è ðåãèñòðó, óïðàâëÿþùåìó ãðîìêîãîâîðèòåëåì, âûäåëåí äëÿ ñâÿçè ïîðò 97. Ñ åãî ïîìîùüþ óïðàâëåíèå äàííûì óñòðîéñòâîì îñóùåñòâëÿåòñÿ ïóòåì èçìåíåíèÿ ÷èñëà â ðåãèñòðå. Ïðè ïîñûëêå ïðàâèëüíîãî" ÷èñëà ãðîìêîãîâîðèòåëü èçäàåò çâóêîâîé ñèãíàë; ïîñûëêà æå "íåïðàâèëüíîãî" ÷èñëà ìîæåò âûçâàòü ðÿä ïðîáëåì. Ïîýòîìó íàì íåîáõîäèìî çíàòü, êàêèå ÷èñëà òðåáóåòñÿ ïîñûëàòü è êàê èõ íóæíî ïîñûëàòü.  ÷àñòíîñòè, íàì õîòåëîñü áû çíàòü, êàê èñïîëüçîâàòü ÿçûê Ñè äëÿ ïîäîáíîãî ðîäà îïåðàöèé.

ÐÈÑ. 6.6. Ñâÿçü êîíòðîëëåðà 8255 ñ ìèêðîïðîöåññîðîì INTEL 8088.
Äàâàéòå ñíà÷àëà ïîñìîòðèì, êàêèå íóæíî ïîñûëàòü ÷èñëà. Ïåðâûì íåîáõîäèìî çíàòü - ðåãèñòð êîíòðîëëåðà 8255 ìîæåò ïðèíÿòü 8- ðàçðÿäíîå ÷èñëî, êîòîðîå ïîìåùàåòñÿ òóäà â äâîè÷íîì êîäå, íàïðèìåð, 01011011. Êàæäûé èç âîñüìè ðàçðÿäîâ ïàìÿòè ðàññìàòðèâàåòñÿ êàê ïåðåêëþ÷àòåëü "âêëþ÷åíî-âûêëþ÷åíî" äëÿ ñîîòâåòñòâóþùåãî óñòðîéñòâà èëè âîçäåéñòâèÿ. Íàëè÷èå 0 èëè 1 â ñîîòâåòñòâóþùåé ïîçèöèè îïðåäåëÿåò, âêëþ÷åíî èëè íåò ñîîòâåòñòâóþùåå óñòðîéñòâî. Íàïðèìåð, ðàçðÿä 3 (ðàçðÿäû íóìåðóþòñÿ îò 0 äî 7 ñïðàâà íàëåâî) îïðåäåëÿåò, âêëþ÷åí èëè íåò ýëåêòðîäâèãàòåëü íàòåëÿ íà ìèíè-êàññåòå, à ðàçðÿä 7 ðàçðåøàåò èëè çàïðåùàåò ðàáîòó ñ êëàâèàòóðîé òåðìèíàëà. Ïðè ïåðåäà÷å ÷èñëà â ðåãèñòð íåîáõîäèìî ñîáëþäàòü îñòîðîæíîñòü. Åñëè ïðè âêëþ÷åíèè ãðîìêîãîâîðèòåëÿ ìû íå îáðàòèì âíèìàíèÿ íà îñòàëüíûå ðàçðÿäû, òî ñëó÷àéíî ìîæåì âûêëþ÷èòü êëàâèàòóðó! Ïîýòîìó äàâàéòå ïîñìîòðèì ñ ïîìîùüþ ðèñ. 6.7, ÷åìó ñîîòâåòñòâóåò êàæäûé ðàçðÿä. (Èñïîëüçóåìàÿ èíôîðìàöèÿ âçÿòà èç òåõíè÷åñêîãî ñïðàâî÷íîãî ðóêîâîäñòâà ôèðìû IBM, è ìû âîâñå íå äîëæíû çíàòü, ÷òî áîëüøèíñòâî èç ýòèõ ðàçðÿäîâ îçíà÷àåò.).
Ðàçðÿä 0 + âêëþ÷åíèå ãðîìêîãîâîðèòåëÿ ÷åðåç òàéìåð 2.
Ðàçðÿä 1 + íàëè÷èå äàííûõ äëÿ ðàáîòû ãðîìêîãîâîðèòåëÿ.
Ðàçðÿä 2 + (÷òåíèå êëþ÷à ðàçìåðà îïåðàòèâíîé ïàìÿòè) èëè (÷òåíèå ðåçåðâíîãî êëþ÷à).
Ðàçðÿä 3 + âûêëþ÷åíèå äâèãàòåëÿ íàêîïèòåëÿ íà ìèíè-êàññåòå.
Ðàçðÿä 4 - ðàçáëîêèðîâêà îïåðàòèâíîé ïàìÿòè.
Ðàçðÿä 5 - ðàçáëîêèðîâêà êîíòðîëÿ ââîäà-âûâîäà.
Ðàçäÿð 6 - ïîääåðæàíèå íèçêîé òàêòîâîé ÷àñòîòû çàäàþùåãî ãåíåðàòîðà êëàâèàòóðû.
Ðàçðÿä 7 - (ðàçáëîêèðîâêà êëàâèàòóðû) èëè + (ñáðîñ êëàâèàòóðû & ðàçðåøåíèå îïðîñà ïðîãðàììíî-îïðàøèâàåìûõ ïåðåêëþ÷àòåëåé).
ÐÈÑ. 6.7. Ïîðò 97 íàçíà÷åíèå óïðàâëÿþùèõ ðàçðÿäîâ.
Îáðàòèòå âíèìàíèå íà çíàêè + è - íà ðèñ. 6.7. Çíàê + óêàçûâàåò, ÷òî â ñîîòâåòñòâóþùåì ðàçðÿäå âûïîëíåíèå óñëîâèÿ îáîçíà÷àåòñÿ ÷åðåç 1, à çíàê - óêàçûâàåò, ÷òî âûïîëíåíèå óñëîâèÿ â ðàçðÿäå îáîçíà÷àåòñÿ ÷åðåç 0. Ïîýòîìó 1 â 3-ì ðàçðÿäå ïîêàçûâàåò, ÷òî äâèãàòåëü íàêîïèòåëÿ íà ìèíè-êàññåòå âûêëþ÷åí, â òî âðåìÿ êàê 0 â 4-ì ðàçðÿäå óêàçûâàåò íà âîçìîæíîñòü äîñòóïà ê ïàìÿòè.
Êàêèì îáðàçîì ìîæíî âêëþ÷èòü ãðîìêîãîâîðèòåëü? Îêàçûâàåòñÿ, äëÿ ýòîãî íåîáõîäèìî â 0-é ðàçðÿä (âêëþ÷åíèå ãðîìêîãîâîðèòåëÿ ÷åðåç òàéìåð 2) è â 1-é ðàçðÿä (íàëè÷èå äàííûõ äëÿ ðàáîòû ãðîìêîãîâîðèòåëÿ) çàñëàòü 1. Ýòî îçíà÷àåò, ÷òî äëÿ âêëþ÷åíèÿ ãðîìêîãîâîðèòåëÿ ÷åðåç ïîðò 97 íåîáõîäèìî ïîñëàòü â ðåãèñòð äâîè÷íîå ÷èñëî 11 (èëè äåñÿòè÷íîå ÷èñëî 3). Íî, ïåðåä òåì êàê ïðèñòóïèòü ê ýòîìó, ó÷òèòå, ÷òî äàííàÿ îïåðàöèÿ èìååò òàêèå ïîáî÷íûå ýôôåêòû, êàê, íàïðèìåð, óñòàíîâêà ðàçðÿäà 4 â 0, ÷òî ìîæåò îêàçàòüñÿ âîâñå íåæåëàòåëüíûì. Îäíà èç ïðè÷èí, ïî êîòîðîé ìû íå ðàññêàçàëè, êàê èñïîëüçîâàòü ïîðòû, çàêëþ÷àåòñÿ â òîì, ÷òîáû ïðåäîòâðàòèòü íåïðèÿòíûå ïîñëåäñòâèÿ âàøåé ïîñïåøíîñòè.
Äëÿ íàäåæíîñòè ìû äîëæíû ïðîâåðèòü ñíà÷àëà, ÷òî ñîäåðæèòñÿ â ðåãèñòðå. Ê ñ÷àñòüþ, ýòî ñîâñåì íå òðóäíî (ìû ïðîäåìîíñòðèðóåì ýòî ÷óòü ïîçæå). Îòâåò âûãëÿäèò òàê: â ðåãèñòðå îáû÷íî ñîäåðæàòñÿ ÷èñëà "76" èëè "77 ". Äàâàéòå ïåðåâåäåì èõ â äâîè÷íóþ ñèñòåìó. (Çäåñü âàì, âîçìîæíî, çàõî÷åòñÿ çàãëÿíóòü â òàáëèöó ïðåîáðàçîâàíèÿ â äâîè÷íûé êîä, êîòîðàÿ ïðèâîäèòñÿ â êîíöå êíèãè â ïðèëîæåíèè.) Ðåçóëüòàòû ïðåîáðàçîâàíèÿ íåêîòîðûõ ÷èñåë ïðèâå-äåíû â òàáë. 6.1.
Íå âäàâàÿñü â ïîäðîáíîñòè ïî ïîâîäó çíà÷åíèÿ ñëîâ "ïîääåðæàíèå íèçêîé òàêòîâîé ÷àñòîòû çàäàþùåãî ãåíåðàòîðà êëàâèàòóðû.
Òàáëèöà 6.1.
| Äåñÿòè÷íîå ÷èñëî | Íîìåð ðàçðÿäà | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|
| 76 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | |
| 77 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | |
| 78 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | |
| 79 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 |
Èñïîëüçîâàíèå ïîðòà.
Ñóùåñòâóþò äâå îïåðàöèè, êîòîðûå ìîãóò âûïîëíÿòüñÿ ñ ïîìîùüþ ïîðòà: ìèêðîïðîöåññîð 8088 ìîæåò ïîñëàòü èíôîðìàöèþ â ïîäñîåäèíåííîå óñòðîéñòâî èëè ïðî÷èòàòü äàííûå èç íåãî.  ÿçûêå Àñåìáëåðà ýòè îïåðàöèè âûïîëíÿþòñÿ ïðè ïîìîùè êîìàíä OUT è IN, à â ÿçûêå Ñè èñïîëüçîâàíèå óêàçàííûõ ñðåäñòâ çàâèñèò îò êîìïèëÿòîðà. Íåêîòîðûå èç íèõ ïðåäîñòàâëÿþò âîçìîæíîñòü âûçîâà ñïåöèàëüíûõ ôóíêöèé (â ñîîòâåòñòâèè ñ òåì, êàê ýòî îáû÷íî äåëàåòñÿ â ÿçûêå Ñè).  êîìïèëÿòîðàõ Lattice Ñ è Supersoft Ñ, íàïðèìåð ñ ýòîé öåëüþ ïðèìåíÿþòñÿ ôóíêöèè outp( ) è inp( ), â äðóãèõ æå àíàëîãè÷íûå ôóíêöèè ìîãóò íîñèòü äðóãèå èìåíà. Åñëè âû ðàáîòàåòå ñ êîìïèëÿòîðîì, â êîòîðîì òàêèå âîçìîæíîñòè îòñóòñòâóþò äëÿ çàäàíèÿ óêàçàííûõ ôóíêöèé ìîæíî ëèáî âîñïîëüçîâàòüñÿ àññåìáëåðîì, ëèáî ïðîñòî âêëþ÷èòü â ñâîþ ïðîãðàììó ñîîòâåòñòâóþùèé àññåìáëåðíûé êîä (÷òî î÷åíü ïðîñòî).  ëþáîì ñëó÷àå âàì íåîáõîäèìî îçíàêîìèòüñÿ ñ äîêóìåíòàöèåé ïî âàøåìó êîìïèëÿòîðó. Ïîêà æå áóäåì ïðåäïîëàãàòü, ÷òî ó âàñ èìååòñÿ âîçìîæíîñòü âûçîâà ôóíêöèé outp( ) è inp( ).
Ïðèâåäåì ïðèìåð ïðîãðàììû, ïðåäñòàâëÿþùåé ñîáîé ïåðâóþ ïîïûòêó èçâëå÷ü çâóêîâîé ñèãíàë èç ãðîìêîãîâîðèòåëÿ:
/* ñèãíàë1 */
/* çàñòàâëÿåò ãðîìêîãîâîðèòåëü ïîäàâàòü ñèãíàë */
Main( ).
{
Int store;
Store = inp (97); /* çàïîìèíàíèå íà÷àëüíîãî çíà÷åíèÿ ñ ïîìîùüþ ïîðòà 97 */
Printf("ïîðò 97 = %d \n", store); /* ïðîâåðêà ðåçóëüòàòîâ*/
Outp(97, 79); /* ïîñûëàåò 79 â ïîðò 97; âêëþ÷åíèå ãðîìêîãîâîðèòåëÿ */
Outp(97, store); /* âîññòàíîâëåíèå íà÷àëüíîãî çíà÷åíèÿ */
}
Íåñìîòðÿ íà òî ÷òî, ïî-âèäèìîìó, âû è ñàìè ìîæåòå äîãàäàòüñÿ, ÷òî âûïîëíÿþò ôóíêöèè inp( ) è outp( ), íèæå ïðèâåäåì èõ ôîðìàëüíîå îïèñàíèå:
Inð(íîìåð ïîðòà).
Ýòà ôóíêöèÿ âîçâðàùàåò (ò. å. ôîðìèðóåò) 8-ðàçðÿäíîå öåëîå çíà÷åíèå (êîòîðîå ïðåîáðàçóåòñÿ â 16-ðàçðÿäíîå ÷èñëî òèïà int ïóòåì äîáàâëåíèÿ íóëåé ñëåâà), ïîëó÷åííîå èç ïîðòà ââîäà ñ óêàçàííûì íîìåðîì. Îáðàùåíèå ê íåé íå çàâèñèò îò íîìåðà ïîäêëþ÷åííîãî ïîðòà.
Îuð(íîìåð ïîðòà, çíà÷åíèå).
Ýòà ôóíêöèÿ ïåðåäàåò 8-ðàçðÿäíîå öåëîå çíà÷åíèå â ïîðò âûâîäà ñ óêàçàííûì íîìåðîì.
Çàìåòèì, ÷òî îäèí è òîò æå ïîðò ìîæåò áûòü êàê ïîðòîì ââîäà, òàê è ïîðòîì âûâîäà â çàâèñèìîñòè îò òîãî, êàê îí èñïîëüçóåòñÿ.
Äàâàéòå òåïåðü âûïîëíèì ïðîãðàììó.  èòîãå âû ìîæåòå áûòü íå ñîâñåì óäîâëåòâîðåíû, ïîñêîëüêó êîìïüþòåð âûêëþ÷àåò ãðîìêîãîâîðèòåëü äîâîëüíî áûñòðî ïîñëå âêëþ÷åíèÿ. Áûëî áû ëó÷øå åñëè áû ìû ñìîãëè çàñòàâèòü êîìïüþòåð ïîäîæäàòü íåìíîãî, ïðåæäå ÷åì âûêëþ÷èòü ãðîìêîãîâîðèòåëü. Êàê ýòî ìîæíî ñäåëàòü? Äîâîëüíî ïðîñòî! Íóæíî òîëüêî äàòü êîìïüþòåðó êàêóþ-íèáóäü ðàáîòó" íà ýòî âðåìÿ. Ïðèâåäåííàÿ íèæå ïðîãðàììà ïîêàçûâàåò, êàê ýòîãî äîñòè÷ü.
/* ñèãíàë2 */
/* áîëåå äëèííûé ñèãíàë */
#define LIMIT 10000.
Int store;
Int count = 0; /* ñ÷åò÷èê äëÿ îðãàíèçàöèè çàäåðæêè */
Store= inp (97);
Outp (97, 79);
While (count++ < LIMIT); /* çàäåðæêà íà âðåìÿ ðàáîòû ïóñòîãî öèêëà */
Outp (97, store);
Çàìåòèì, ÷òî âñÿ ðàáîòà îïåðàòîðà while ñîñòîèò â óâåëè÷åíèè íà êàæäîì øàãå öèêëà) çíà÷åíèÿ ïåðåìåííîé count äî òåõ ïîð, ïîêà îíî íå ñòàíåò ðàâíûì âåëè÷èíå êîíñòàíòû LIMIT. Ñèìâîë "òî÷êà ñ çàïÿòîé", ñëåäóþùèé çà îïåðàòîðîì while, - ýòî "ïóñòîé" îïåðàòîð, êîòîðûé íå âûïîëíÿåò íèêàêèõ äåéñòâèé. Ïîýòîìó ïðîãðàììà ñèãíàë2 âêëþ÷àåò ãðîìêîãîâîðèòåëü, ñ÷èòàåò äî 10000, à çàòåì âûêëþ÷àåò åãî. Âû ìîæåòå èçìåíÿòü çíà÷åíèå êîíñòàíòû LIMIT ÷òîáû ðåãóëèðîâàòü ïðîäîëæèòåëüíîñòü çâó÷àíèÿ, èëè ìîæåòå çàìåíèòü êîíñòàíòó LIMIT ïåðåìåííîé è èñïîëüçîâàòü ôóíêöèþ scanf( ) äëÿ ââîäà ñîîòâåòñòâóþùåãî çíà÷åíèÿ, îïðåäåëÿþùåãî ïðîäîëæèòåëüíîñòü ñèãíàëà.
Áûëî áû ïðåêðàñíî èìåòü âîçìîæíîñòü ðåãóëèðîâàòü è âûñîòó òîíà. Ýòî è â ñàìîì äåëå îñóùåñòâèìî. Ïîñëå òîãî êàê ìû èçó÷èì ôóíêöèè áîëåå ïîëíî, â ïðèëîæåíèè â êîíöå êíèãè âû ñìîæåòå ïîçíàêîìèòüñÿ ñ ïðîãðàììîé, êîòîðàÿ ïðåâðàùàåò êëàâèàòóðó òåðìèíàëà â êëàâèàòóðó ìóçûêàëüíîãî èíñòðóìåíòà.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÑÊÐÛÒÎÉ ÌÎÙÍÎÑÒÈ (Â ËÎØÀÄÈÍÛÕ ÑÈËÀÕ) ÂÀØÅÃÎ ÊÎÌÏÜÞÒÅÐÀ.
Õîòèòå óçíàòü ÷óäîâèùíûé ïîòåíöèàë ìàøèíû äëÿ "ïåðåìàëûâàíèÿ ÷èñåë"? Êàê ðàç äëÿ ýòîãî ìû íàïèñàëè çàìå÷àòåëüíóþ ïðîãðàììó (ïðèâåäåííóþ íà ðèñ 6.8). ×òîáû îöåíèòü åå ïîëíîñòüþ âàì íåîáõîäèìî âûïîëíèòü åå íà âàøåì êîìïüþòåðå. Ïðåäóïðåæäåíèå äëÿ ïîëó÷åíèÿ æåëàåìîãî ýôôåêòà âû äîëæíû âûáðàòü ïîäõîäÿùóþ äëÿ âàøåé ñèñòåìû âåëè÷èíó êîíñòàíòû LIMIT. Äîïîëíèòåëüíûå ïîäðîáíîñòè áóäóò îáñóæäåíû íèæå, à ñíà÷àëà ðàññìîòðèì ñàìó ïðîãðàììó.
/* Ãàíñ */
#include.
#define LIMIT 8000.
Lmain( ).
{
Int num1, num2;
Long delay =0;
Int count = 0;
Printf("Ëîøàäü-êîìïüþòåð Ãàíñ ñëîæèò äëÿ âàñ äâà î÷åíü");
Printf(" ìàëåíüêèõ öåëûõ ÷èñëà \n" );
Printf("Óêàæèòå, ïîæàëóéñòà, ïåðâîå ìàëåíüêîå ÷èñëî \n");
Scanf("%d", &num1);
Printf("Ñïàñèáî À òåïåðü ââåäèòå âòîðîå ÷èñëî \n");
Scanf("%d", &num2);
Printf("Èòàê, Ãàíñ, ñêîëüêî ó òåáÿ ïîëó÷èòñÿ? \n"),
While(delay++ < LIMIT);
While(count++ < num1 + num2 - 1)).
{
Putchar ('\007' );
Delay = 0;
While (delay++ < LIMIT);
Putchar ('\n');
}
Printf ("Äà? È ýòî âñå? \n");
Delay = 0;
While (delay++ < 3*LIMIT);
Putchar ('\007');
Printf(" Ïðåêðàñíî, Ãàíñ!\n");
}
ÐÈÑ. 6.8. Ïðîãðàììà äëÿ "ïåðåìàëûâàíèÿ ÷èñåë".
Òåõíè÷åñêèå çàìå÷àíèÿ: îïåðàòîðû while, â êîòîðûõ ñîäåðæèòñÿ ïåðåìåííàÿ delay, íå äåëàþò íè÷åãî äðóãîãî, êðîìå îðãàíèçàöèè ÇÀÄÅÐÆÊÈ ïî âðåìåíè.
Ñèìâîë "òî÷êà ñ çàïÿòîé" â êîíöå ñòðîêè ïîêàçûâàåò íà êîíåö òåëà öèêëà while, ò.å. ïîñëåäóþùèå îïåðàòîðû â íåãî íå âõîäÿò. Öèêë while, èñïîëüçîâàííûé âíóòðè äðóãîãî öèêëà whi1å, íàçûâàåòñÿ "âëîæåííûì".
Ìû ïîëàãàåì, ÷òî íà IBM PC ïîäõîäÿùèì çíà÷åíèåì äëÿ êîíñòàíòû LIMIT ÿâëÿåòñÿ ÷èñëî 8000 ÀÕ 11/750 ìû ïðåäïî÷èòàåì ÷èñëî ïîðÿäêà 50000, íî íà âûáîð ìîæåò âëèÿòü òàêæå óðîâåíü çàãðóçêè ñèñòåìû, ðàáîòàþùåé â ðåæèìå ðàçäåëåíèÿ âðåìåíè.
Ìû ïîëàãàåì LIMIT ðàâíîé çíà÷åíèþ êîíñòàíòû òèïà long (êàê ðàç íà ýòî è óêàçûâàåò ñèìâîë L, ñòîÿùèé â êîíöå) äëÿ òîãî, ÷òîáû èçáåæàòü òðóäíîñòåé, ñâÿçàííûõ ñ ïðåâûøåíèåì ìàêñèìàëüíîãî çíà÷åíèÿ âåëè÷èíû òèïà int (Äëÿ 8000 ïîäîáíûå ìåðû ïðåäîñòîðîæíîñòè íà ñàìîì äåëå îáÿçàòåëüíû, íî, íàïðèìåð, åãî çàìåíà ÷èñëîì 12000 íà IBM PC äåëàåò ýòî íåîáõîäèìûì, ïîñêîëüêó òîãäà âûðàæåíèå 3*LIMIT áóäåò ðàâíî 36000, ÷òî ïðåâûøàåò ìàêñèìàëüíîå çíà÷åíèå âåëè÷èíû òèïà int â ýòîé ñèñòåìå).
Åñëè â âàøåé âû÷èñëèòåëüíîé ñèñòåìå îòñóòñòâóåò ãðîìêîãîâîðèòåëü èëè çâîíîê, âû ìîãëè áû çàìåíèòü îïåðàòîð putchar('\007') íà printf ("Ñòóê êîïûò"). Ýòà ïðîãðàììà ïðîèçâåäåò âïå÷àòëåíèå íà âàøèõ äðóçåé è, âîçìîæíî, óñïîêîèò òåõ, êòî áîèòñÿ êîìïüþòåðîâ. Ìû äóìàåì, òàêàÿ ïðîãðàììà ìîæåò ñîñòàâèòü ÿäðî êàêîãî-íèáóäü "Ñè-âû÷èñëèòåëÿ", íî îñòàâëÿåì ðàçâèòèå ýòîé èäåè íàøèì ÷èòàòåëÿì.
ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
×òî äåëàåò ôóíêöèÿ getchar() ââîäèò â ïðîãðàììó ñèìâîë, ïîñòóïàþùèé ñ êëàâèàòóðû òåðìèíàëà.
×òî äåëàåò ôóíêöèÿ putchar(ch) îòîáðàæàåò ñèìâîë, ñîäåðæàùèéñÿ â ïåðåìåííîé ch, íà ýêðàí.
×òî ñèìâîëû != îçíà÷àþò: íå ðàâíî.
×òî òàêîå EOF: ñïåöèàëüíûé ñèìâîë, óêàçûâàþùèé íà êîíåö ôàéëà.
Êàê ïåðåêëþ÷èòü ñòàíäàðòíûé ââîä íà ââîä èç ôàéëà:
Program < file.
Êàê ïåðåêëþ÷èòü ñòàíäàðòíûé âûâîä íà âûâîä â ôàéë:
Program > file.
×òî òàêîå ïîðòû: ñðåäñòâà äîñòóïà ê ïîäñîåäèíåííûì óñòðîéñòâàì.
Êàê èñïîëüçîâàòü ïîðòû: ïóòåì âûçîâà ôóíêöèé inp( ) è outp( ).
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. Âûðàæåíèå putchar(getchar( )) ÿâëÿåòñÿ ïðàâèëüíûì. Áóäåò ëè ïðàâèëüíûì âû ðàæåíèå getchar(putchar( ))?
2. ×òî ïðîèçîéäåò â ðåçóëüòàòå âûïîëíåíèÿ êàæäîãî èç ñëåäóþùèõ îïåðàòîðîâ?
a. putchar('H' );
á. putchar(' \007');
â. putchar('\n');
ã. putchar(' \b').
3. Äîïóñòèì, ó âàñ åñòü ïðîãðàììà count, ïîäñ÷èòûâàþùàÿ ÷èñëî ñèìâîëîâ â ôàéëå. Íàïèøèòå êîìàíäó, â ðåçóëüòàòå âûïîëíåíèÿ êîòîðîé áóäåò ïðîèçâåäåí ïîäñ÷åò ÷èñëà ñèìâîëîâ â ôàéëå essay, à ðåçóëüòàò áóäåò ïîìåùåí â ôàéë essayct.
4. Äàíû ïðîãðàììà è ôàéëû, îïèñàííûå â âîïðîñå 3. Êàêèå èç ïðèâåäåííûõ íèæå êîìàíä ïðàâèëüíû?
a. essayct <essay.
á. count essay.
â. count < essayct.
ã. essay > count.
5. ×òî äåëàåò îïåðàòîð outp(212, 23)?
Îòâåòû.
1. Íåò. Ó ôóíêöèè getchar( ) àðãóìåíò äîëæåí îòñóòñòâîâàòü, à ó ôóíêöèè putchar( ) àðãóìåíò îáÿçàòåëüíî äîëæåí áûòü.
2.
à. ïå÷àòü áóêâû Í.
á. âûâîä ñèìâîëà '\007', â ðåçóëüòàòå ÷åãî ñðàáîòàåò ãðîìêîãîâîðèòåëü.
â. ïåðåõîä íà íîâóþ ñòðîêó íà óñòðîéñòâå âûâîäà.
ã. øàã íàçàä íà îäíó ïîçèöèþ.
3. count < essay > essayct èëè èíà÷å count > essayct < essay.
4.
à. íåïðàâèëüíî, ïîñêîëüêó essayct íå ÿâëÿåòñÿ âûïîëíÿåìîé ïðîãðàììîé.
á. íåïðàâèëüíî, ïîñêîëüêó îïóøåí çíàê îïåðàöèè ïåðåêëþ÷åíèÿ. (Ïîçæå âû íàó÷èòåñü ïèñàòü ïðîãðàììû, äëÿ êîòîðûõ íå íóæíî áóäåò èñïîëüçîâàòü îïåðàöèþ ïåðåêëþ÷åíèÿ).
â. ïðàâèëüíî, ïðè âûïîëíåíèè ýòîé êîìàíäû ÷èñëî ñèìâîëîâ, ïîëó÷åííîå â ðåçóëüòàòå ðàáîòû ïðîãðàììû count èç âîïðîñà 3, ïîÿâèòñÿ â âèäå ñîîáùåíèÿ íà ýêðàíå.
ã. íåïðàâèëüíî, èìÿ âûïîëíÿåìîé ïðîãðàììû äîëæíî ñòîÿòü ïåðâûì.
ÓÏÐÀÆÍÅÍÈß.
1. Íàïèøèòå ïðîãðàììó, îïèñàííóþ â ï. 3, ò. å. ïðîãðàììó, ïîäñ÷èòûâàþùóþ ÷èñëî ñèìâîëîâ â ôàéëå.
2. Ìîäèôèöèðóéòå ïðîãðàììó count òàê, ÷òîáû ïðè ó÷åòå êàæäîãî ñèìâîëà ðàçäàåòñÿ çâóêîâîé ñèãíàë. Ââåäèòå â ïðîãðàììó êîðîòêèé öèêë, ðåàëèçóþùèé âðåìåííóþ çàäåðæêó, äëÿ òîãî ÷òîáû îòäåëèòü îäèí ñèãíàë îò äðóãîãî.
7. Âûáîð âàðèàíòîâ.
Õîòèòå íàó÷èòüñÿ ñîçäàâàòü ìîùíûå, "èíòåëëåêòóàëüíûå", óíèâåðñàëüíûå è ïîëåçíûå ïðîãðàììû? Òîãäà âàì ïîòðåáóåòñÿ ÿçûê, îáåñïå÷èâàþùèé òðè îñíîâíûå ôîðìû óïðàâëåíèÿ ïðîöåññîì âûïîëíåíèÿ ïðîãðàìì. Ñîãëàñíî òåîðèè âû÷èñëèòåëüíûõ ñèñòåì (êîòîðàÿ ÿâëÿåòñÿ íàóêîé î âû÷èñëèòåëüíûõ ìàøèíàõ, à íå íàóêîé, ñîçäàâàåìîé òàêèìè ìàøèíàìè), õîðîøèé ÿçûê äîëæåí îáåñïå÷èâàòü ðåàëèçàöèþ ñëåäóþùèõ òðåõ ôîðì óïðàâëåíèÿ ïðîöåññîì âûïîëíåíèÿ ïðîãðàìì:
1. Âûïîëíåíèå ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ.
2. Âûïîëíåíèå îïðåäåëåííîé ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ äî òåõ ïîð, ïîêà íåêîòîðîå óñëîâèå èñòèííî.
3. Èñïîëüçîâàíèå ïðîâåðêè èñòèííîñòè óñëîâèÿ äëÿ âûáîðà ìåæäó ðàçëè÷íûìè âîçìîæíûìè ñïîñîáàìè äåéñòâèÿ.
ÎÏÅÐÀÒÎÐ if.
Íà÷íåì ñ î÷åíü ïðîñòîãî ïðèìåðà. Ìû óæå âèäåëè, êàê íóæíî íàïèñàòü ïðîãðàììó, ïîäñ÷èòûâàþùóþ ÷èñëî ñèìâîëîâ â ôàéëå. Ïðåäïîëîæèì, âìåñòî ñèìâîëîâ ìû õîòèì ïîäñ÷èòàòü ñòðîêè. Ýòî ìîæíî ñäåëàòü ïóòåì ñ÷åòà ÷èñëà ñèìâîëîâ "íîâàÿ ñòðîêà" â ôàéëå. Íèæå ïðèâîäèòñÿ ñîîòâåòñòâóþùàÿ ïðîãðàììà:
/* ïîäñ÷åò ñòðîê */
#include < stdio.h>
Main( ).
{
Int ch;
Int linecount = 0;
While((ch = getchar( )) != EOF).
If(ch =='\n').
linecount ++;
Printf(" ßíàñ÷èòàëà%d ñòðîê\n", linecount);
}
Ñåðäöåâèíîé" ïðîãðàììû ÿâëÿåòñÿ îïåðàòîð.
If(ch == '\n') linecount ++;
Ýòîò "îïåðàòîð if" ñëóæèò óêàçàíèåì êîìïüþòåðó óâåëè÷èòü çíà÷åíèå ïåðåìåííîé linecount íà 1, åñëè òîëüêî ÷òî ïðî÷èòàííûé ñèìâîë (ñîäåðæèìîå ïåðåìåííîé ch) ïðåäñòàâëÿåò ñîáîé ñèìâîë "íîâàÿ ñòðîêà". Çíàê == íå ÿâëÿåòñÿ îïå÷àòêîé; åãî ñìûñë âûðàæàåòñÿ ñëîâàìè "ðàâíÿåòñÿ". Íå ïóòàéòå ýòó îïåðàöèþ ñ îïåðàöèåé ïðèñâàèâàíèÿ (=).
×òî ïðîèñõîäèò â ñëó÷àå, êîãäà çíà÷åíèå ïåðåìåííîé ch íå ÿâëÿåòñÿ ñèìâîëîì "íîâàÿ ñòðîêà"? Òîãäà â öèêëå while ïðîèçâîäèòñÿ ÷òåíèå ñëåäóþùåãî ñèìâîëà.
Îïåðàòîð if, êîòîðûé ìû òîëüêî ÷òî ïðèìåíèëè â ïðîãðàììå, ñ÷èòàåòñÿ îäèíî÷íûì îïåðàòîðîì, íà÷èíàþùèìñÿ îò êëþ÷åâîãî ñëîâà if è çàâåðøàþùèìñÿ ñèìâîëîì "òî÷êà ñ çàïÿòîé". Âîò ïî÷åìó ìû íå èñïîëüçîâàëè ôèãóðíûå ñêîáêè, ÷òîáû îòìåòèòü íà÷àëî è êîíåö òåëà öèêëà while.
Ñîâñåì íåñëîæíî óñîâåðøåíñòâîâàòü ïðîãðàììó òàê, ÷òîáû îíà ïîäñ÷èòûâàëà ñèìâîëû è ñòðîêè îäíîâðåìåííî; äàâàéòå ïîïðîáóåì ýòî ñäåëàòü.
/* 1ññ - ïîäñ÷åò ÷èñëà ñòðîê è ñèìâîëîâ */
#include.
main( ).
{
Int ch;
Int linecount = 0;
Int charcount = 0;
While((ch = getchar( )) != EOF).
{
charcount ++ ;
if(ch == '\n' ) linecount++ ;
}
Printf(" ß íàñ÷èòàëà %d ñèìâîëîâ è %d ñòðîê.\n", charcount, linecount);
}
Òåïåðü â öèêë while âõîäÿò äâà îïåðàòîðà; ïîýòîìó ìû èñïîëüçîâàëè ôèãóðíûå ñêîáêè, ÷òîáû îòìåòèòü íà÷àëî è êîíåö òåëà öèêëà.
Ìû âûçûâàåì ñêîìïèëèðîâàííóþ ïðîãðàììó Icc è èñïîëüçóåì îïåðàöèþ ïåðåêëþ÷åíèÿ, ÷òîáû ïîäñ÷èòàòü ÷èñëî ñèìâîëîâ è ñòðîê â ôàéëå ñ èìåíåì chow.
Ice <chow ß íàñ÷èòàëà 8539 ñèìâîëîâ è 233 ñòðîêè.
Ñëåäóþùèé øàã â "ðàçâèòèè" ýòîé ïðîãðàììû - ïðèäàíèå åé ñïîñîáíîñòè ïîäñ÷èòûâàòü ÷èñëî ñëîâ. Ýòî ëèøü íåìíîãî òðóäíåå òîãî, ÷òî ìû äåëàëè äî ñèõ ïîð, íî ñíà÷àëà íàì íóæíî èçó÷èòü ðÿä äîïîëíèòåëüíûõ âîïðîñîâ, ñâÿçàííûõ ñ èñïîëüçîâàíèåì îïåðàòîðîâ if.
ÐÀÑØÈÐÅÍÈÅ ÎÏÅÐÀÒÎÐÀ if Ñ ÏÎÌÎÙÜÞ else.
Ïðîñòåéøåé ôîðìîé îïåðàòîðà if ÿâëÿåòñÿ òà, êîòîðîé ìû òîëüêî ÷òî âîñïîëüçîâàëèñü:
If(âûðàæåíèå)îïåðàòîð.
Îáû÷íî ïîä âûðàæåíèåì çäåñü ïîíèìàþò óñëîâíîå âûðàæåíèå, ñ åãî ïîìîùüþ ñðàâíèâàþòñÿ çíà÷åíèÿ äâóõ âåëè÷èí (íàïðèìåð x > y èëè c == 6). Åñëè òàêîå âûðàæåíèå èñòèííî (x áîëüøå ó èëè c ðàâíî 6), òî îïåðàòîð âûïîëíÿåòñÿ.  ïðîòèâíîì ñëó÷àå îí ïðîïóñêàåòñÿ. Âîîáùå ãîâîðÿ, â êà÷åñòâå óñëîâèÿ ìîæåò áûòü èñïîëüçîâàíî ëþáîå âûðàæåíèå, è åñëè åãî çíà÷åíèå ðàâíî 0, òî îíî ñ÷èòàåòñÿ ëîæíûì - äàëüíåéøèå äåòàëè ìû îáñóäèì ÷óòü ïîçæå. Îïåðàòîð ìîæåò áûòü ïðîñòûì, êàê â íàøåì ïðèìåðå, èëè ñîñòàâíûì (áëîêîì), íà÷àëî è êîíåö êîòîðîãî îòìå÷åíû ôèãóðíûìè ñêîáêàìè:
If (score > big) printf(" Ïîëíàÿ ïîáåäà!\n"); /* ïðîñòîé îïåðàòîð */
if (jîå > rîn) /* ñîñòàâíîé îïåðàòîð */
{
joecash + + ; printf(" Òû ïðîèãðàë, Ðîí.\n");
}
Ïðîñòàÿ ôîðìà îïåðàòîðà if ïîçâîëÿåò âûáðàòü îïåðàòîð (âîçìîæíî, ñîñòàâíîé) èëè ïðîïóñòèòü åãî. ßçûê Ñè ïðåäîñòàâëÿåò òàêæå âîçìîæíîñòü âûáðàòü ëþáîé èç äâóõ îïåðàòîðîâ ïóòåì èñïîëüçîâàíèÿ êîíñòðóêöèè if-else.
Âûáîð: êîíñòðóêöèÿ if-else.
 ïðåäûäóùåé ãëàâå ìû ïðèâåëè î÷åíü ïðîñòóþ ïðîãðàììó øèôðîâêè ñîîáùåíèé, êîòîðàÿ çàìåíÿëà êàæäûé ñèìâîë ñëåäóþùèì ïî ïîðÿäêó â òàáëèöå ASCII. Ê ñîæàëåíèþ, îíà çàìåíèëà äàæå ñèìâîë "íîâàÿ ñòðîêà", ÷òî ïðèâåëî ê îáúåäèíåíèþ íåñêîëüêèõ ñòðîê â îäíó. Ìîæíî èñêëþ÷èòü ýòó ïðîáëåìó, íàïèñàâ ïðîãðàììó, ðåàëèçóþùóþ ïðîñòîé âûáîð: åñëè ñèìâîë - "íîâàÿ ñòðîêà", òî îñòàâèòü åãî áåç èçìåíåíèé, â ïðîòèâíîì ñëó÷àå ïðåîáðàçîâàòü åãî. Âîò êàê ýòî ìîæíî çàïðîãðàììèðîâàòü íà ÿçûêå Ñè:
/* êîä1 */
#include.
main( ).
{
Char ch;
While((ch = getchar( )) != EOF).
{
if(ch =='\n' ) /* îñòàâèòü ñèìâîë */
putchar(ch); /* "íîâàÿ ñòðîêà" íåèçìåííûì */
else.
putchar(ch + 1); /* çàìåíèòü îñòàëüíûå ñèìâîëû */
}
}
 ïðîøëûé ðàç áûë èñïîëüçîâàí ôàéë, ñîäåðæàùèé ñëåäóþùèé òåêñò:
Good spelling is an aid to clear writing.
Åãî èñïîëüçîâàíèå â êà÷åñòâå òåñòà äëÿ íàøåé íîâîé ïðîãðàììû ïðèâîäèò ê ðåçóëüòàòó:
Óðà! Îíà ðàáîòàåò!
Ìåæäó ïðî÷èì, ñîâñåì íåñëîæíî íàïèñàòü è ïðîãðàììó äåøèôðîâêè. Ñêîïèðóéòå äëÿ ýòîãî ïðîãðàììó êîä1, íî òîëüêî çàìåíèòå âûðàæåíèå (ch + 1) íà (ch - 1).
Âû îáðàòèëè âíèìàíèå íà îáùèé âèä îïåðàòîðà if-else. Îí âûãëÿäèò ñëåäóþùèì îáðàçîì:
If (âûðàæåíèå)îïåðàòîð.
else.
Îïåðàòîð.
Åñëè âûðàæåíèå èñòèííî, òî âûïîëíÿåòñÿ ïåðâûé îïåðàòîð, à åñëè ëîæíî, òî âûïîëíÿåòñÿ îïåðàòîð, ñëåäóþùèé çà êëþ÷åâûì ñëîâîì else. Îïåðàòîðû ìîãóò áûòü ïðîñòûìè èëè ñîñòàâíûìè. Ïðàâèëà ÿçûêà Ñè íå òðåáóþò îòñòóïà â ñòðîêå, íî ýòî ñòàëî îáû÷íîé ïðàêòèêîé. Îòñòóï ïîçâîëÿåò ñ ïåðâîãî âçãëÿäà çàìåòèòü òå îïåðàòîðû, âûïîëíåíèå êîòîðûõ çàâèñèò îò ïðîâåðÿåìîãî óñëîâèÿ.
Ïðîñòàÿ êîíñòðóêöèÿ if ïîçâîëÿåò íàì âûáèðàòü: âûïîëíèòü èëè íåò íåêîòîðîå äåéñòâèå; êîíñòðóêöèÿ æå if-else äàåò âîçìîæíîñòü âûáðàòü îäíî èç äâóõ äåéñòâèé. ×òî äåëàòü, åñëè íàì òðåáóåòñÿ îñóùåñòâèòü âûáîð èç áîëüøîãî ÷èñëà âàðèàíòîâ?
Ìíîæåñòâåííûé âûáîð: êîíñòðóêöèÿ else-if.
×àñòî íàì ïðèõîäèòñÿ îñóùåñòâëÿòü âûáîð áîëåå, ÷åì èç äâóõ âàðèàíòîâ. ×òîáû ó÷åñòü ýòî, ìû ìîæåì ðàñøèðèòü ñòðóêòóðó if-else êîíñòðóêöèåé else-if. Ðàññìîòðèì êîíêðåòíûé ïðèìåð. Ðàñöåíêè, íàçíà÷àåìûå çà êîììóíàëüíûå óñëóãè íåêîòîðûìè êîìïàíèÿìè çàâèñÿò îò êîëè÷åñòâà ïîòðåáëÿåìîé ýíåðãèè. Ïðèâåäåì ðàñöåíêè, óñòàíîâëåííûå çà ïîëüçîâàíèå ýëåêòðîýíåðãèåé:
Ïåðâûå 240 êÂò/÷: 0.05418 äîëë. çà êÂò/÷.
Ñëåäóþùèå 300 êÂò/÷: 0.07047 äîëë. çà êÂò/÷.
Ñâûøå 540 êÂò/÷: 0.09164 äîëë. çà êÂò/÷.
Åñëè âàñ çàíèìàåò ýòîò âîïðîñ, ìû ìîãëè áû ïîäãîòîâèòü ïðîãðàììó, âû÷èñëÿþùóþ ñòîèìîñòü ïîòðåáëÿåìîé ýíåðãèè. Ïðèâåäåì ïðèìåð ïðîãðàììû, ÿâëÿþùåéñÿ ïåðâûì øàãîì, ñäåëàííûì â ýòîì íàïðàâëåíèè:

ÐÈÑ. 7.1. Îïåðàòîðû if è if else.
/* ñ÷åò çà ýëåêòðîýíåðãèþ */
/* âû÷èñëÿåò ïëàòó çà ýëåêòðîýíåðãèþ */
#dåfinå RATE1 0.05418 /* òàðèô çà ïåðâûå 240 êÂò/÷ */
#define RATE2 0.07047 /* òàðèô çà ñëåäóþùèå 300 êÂò/÷ */
#define RATE3 0.09164 /* òàðèô çà ïîòðåáëåíèå ñâûøå 540 êÂò/÷ */
#define BASE1 13.00 /* ïëàòà çà ïåðâûå 240 êÂò/÷ */
#define BASE2 34.14 /* ïëàòà çà ïåðâûå 540 êÂò/÷ */
#define BREAK1 240.0 /* âåëè÷èíà, îïðåäåëÿþùàÿ ïåðâîå óñëîâèå âåòâëåíèÿ */
#define BREAK2 540.0 /* âåëè÷èíà, îïðåäåëÿþùàÿ âòîðîå óñëîâèå âåòâëåíèÿ */
Main( ).
{
Float kwh; /* êîëè÷åñòâî èñïîëüçîâàííûõ êÂò/÷ */
Float bill; /* ïëàòà */
Printf(" Óêàæèòå, ïîæàëóéñòà, êîëè÷åñòâî èñïîëüçîâàííûõ êÂò/÷.\n");
Scanf(" %f, &kwh);
If (kwh < BREAK1) bill = RATEl * kwh;
Else if(kwh < BREAK2) /* êîëè÷åñòâîêÂò/÷ìåæäó240 è540 */
bill = BASE1 + RATE2*kwh;
Else /* êîëè÷åñòâîêÂò/÷ñâûøå540 */
bill = BASE2 + RATE3*kwh;
Printf(" Ïëàòàçà%.1f êÂò/÷ ñîñòàâëÿåò$%1.2f. \n", kwh, bill);
}
Äëÿ îáîçíà÷åíèÿ òàðèôîâ áûëè èñïîëüçîâàíû ñèìâîëè÷åñêèå êîíñòàíòû, êîòîðûå ïîýòîìó îêàçàëèñü ñîáðàííûìè â îäíîì ìåñòå. Åñëè ýëåêòðè÷åñêàÿ êîìïàíèÿ èçìåíèò ñâîè ðàñöåíêè (à ýòî ìîæåò ñëó÷èòüñÿ), òî òàêîå ðàñïîëîæåíèå êîíñòàíò íå ïîçâîëèò íàì çàáûòü ñêîððåêòèðîâàòü êàêóþ-íèáóäü èç íèõ. Ìû çàäàëè â ñèìâîëè÷åñêîì âèäå è êîíñòàíòû, ñîîòâåòñòâóþùèå ãðàíè÷íûì çíà÷åíèÿì ïîòðåáëÿåìîé ìîùíîñòè Îíè òàêæå ïîäâåðæåíû èçìåíåíèÿì. Óïðàâëÿþùàÿ ëîãèêà ïðîãðàììû ðåàëèçóåòñÿ ïóòåì nðîñòîãî âûáîðà îäíîé èç òðåõ ðàñ÷åòíûõ ôîðìóë â çàâèñèìîñòè îò çíà÷åíèÿ ïåðåìåííîé kwh, ÷òî èëëþñòðèðóåòñÿ íà ðèñ. 7.2. Ìû õîòèì ïîä÷åðêíóòü, ÷òî ïðîãðàììà â ïðîöåññå âûïîëíåíèÿ ìîæåò äîñòè÷ü ïåðâîãî óïîòðåáëåíèÿ else òîëüêî â òîì ñëó÷àå, åñëè âåëè÷èíà ïåðåìåííîé kwh áîëüøå èëè ðàâíà 240. Ïîýòîìó ñòðîêà else if(kwh < BREAK2) ýêâèâàëåíòíà òðåáîâàíèþ, ÷òîáû çíà÷åíèå kwh áûëî çàêëþ÷åíî ìåæäó 240 è 540, ýòî ìû è óêàçàëè â êîììåíòàðèè ê ïðîãðàììå. Ñîâåðøåííî àíàëîãè÷íî ïîñëåäíåå óïîòðåáëåíèå else ìîæåò áûòü äîñòèãíóòî, òîëüêî åñëè çíà÷åíèå kwh áîëüøå èëè ðàâíî 540. È íàêîíåö, îòìåòèì, ÷òî êîíñòàíòû BASE1 è BASE2 ïðåäñòàâëÿþò ñîáîé âåëè÷èíó ïëàòû çà ïåðâûå 240 èëè 540 êÂò/÷ ýëåêòðîýíåðãèè ñîîòâåòñòâåííî. Ïîýòîìó òðåáóåòñÿ òîëüêî ïðèáàâèòü äîïîëíèòåëüíóþ ïëàòó çà êîëè÷åñòâî ïîòðåáëÿåìîé ýëåêòðîýíåðãèè, ïðåâûøàþùåå ýòè âåëè÷èíû.
ÐÈÑ. 7.2. Áëîê ñõåìà ïðîãðàììû ðàñ÷åòà ïëàòû çà ýëåêòðîýíåðãèþ.
Ôàêòè÷åñêè êîíñòðóêöèÿ else-if ÿâëÿåòñÿ âèäîèçìåíåííûì ñïîñîáîì çàäàíèÿ óñëîâíîãî îïåðàòîðà, ñ êîòîðûì ìû ïîçíàêîìèëèñü ðàíüøå. ßäðî íàøåé ïðîãðàììû ïðåäñòàâëÿåò ñîáîé äðóãóþ ôîðìó çàïèñè ñëåäóþùåé ïîñëåäîâàòåëüíîñòè îïåðàòîðîâ.
If(kwh < BREAK1) bill = RATEl*kwh;
Else if(kwh < BREAK2).
bill = BASE1 + RATE2*kwh;
Else.
bill = BASE2 + RATE3*kwh;
Îòñþäà âèäíî, ÷òî ïðîãðàììà ñîñòîèò èç îïåðàòîðà if-else, äëÿ êîòîðîãî ÷àñòü else ïðåäñòàâëÿåò ñîáîé äðóãîé îïåðàòîð if-else.
Ïðî âòîðîé îïåðàòîð if-else ãîâîðÿò, ÷òî îí "âëîæåí" â ïåðâûì. (Ìåæäó ïðî÷èì, âñÿ ñòðóêòóðà if-else ñ÷èòàåòñÿ îäíèì îïåðàòîðîì. Âîò ïî÷åìó ìû íå äîëæíû çàêëþ÷àòü âëîæåííóþ êîíñòðóêöèþ if-else â ôèãóðíûå ñêîáêè).
Ýòè äâå ôîðìû çàïèñè ÿâëÿþòñÿ àáñîëþòíî ýêâèâàëåíòíûìè. Åäèíñòâåííîå îòëè÷èå - äîïîëíèòåëüíûå ïðîáåëû è ñèìâîëû "íîâàÿ ñòðîêà", íî îíè èãíîðèðóþòñÿ êîìïèëÿòîðîì. Òåì íå ìåíåå ïåðâàÿ ôîðìà çàïèñè ïðåäïî÷òèòåëüíåå, ïîñêîëüêó îíà áîëåå ÷åòêî ïîêàçûâàåò, ÷òî ìû îñóùåñòâëÿåì âûáîð èç òðåõ âîçìîæíîñòåé. Êðîìå òîãî, îíà îáëåã÷àåò ïðîñìîòð ïðîãðàììû è ïîíèìàíèå ñåìàíòèêè êàæäîãî âàðèàíòà. Ïðèìåíÿéòå ôîðìó çàïèñè, èñïîëüçóþùóþ âëîæåíèå îïåðàòîðîâ òàì, ãäå ýòî íåîáõîäèìî - íàïðèìåð êîãäà òðåáóåòñÿ ïðîâåðèòü çíà÷åíèÿ äâóõ ðàçíûõ âåëè÷èí èëè (â íàøåì ñëó÷àå) åñëè áû áûëà óñòàíîâëåíà 10%-íàÿ äîïîëíèòåëüíàÿ ïëàòà çà ïîòðåáëåíèå ýíåðãèè ñâûøå 540 êÂò/÷ òîëüêî â ëåòíèå ìåñÿöû.
 îäíîì îïåðàòîðå ìîæíî èñïîëüçîâàòü ñòîëüêî êîíñòðóêöèé else if, ñêîëüêî íóæíî, ÷òî èëëþñòðèðóåòñÿ ïðèâåäåííûì íèæå ôðàãìåíòîì:
If (score < 1000).
Bonus = 0; else if (score < 1500).
Bonus = 1; else if (score < 2000).
Bonus = 2; else if (score < 2500).
Bonus = 4; else bonus = 6;
(Ýòîò ôðàãìåíò ìîã áûòü âçÿò èç èãðîâîé ïðîãðàììû, ãäå ïåðåìåííàÿ bonus ïðåäñòàâëÿåò ñîáîé êîëè÷åñòâî äîïîëíèòåëüíûõ "ôîòîííûõ áîìá" èëè "ïèòàòåëüíûõ ãðàíóë", ïîëó÷àåìûõ èãðîêîì äëÿ ñëåäóþùåé ïàðòèè ).
Îáúåäèíåíèå îïåðàòîðîâ if è else.
Êîãäà ó âàñ â ïðîãðàììå èìååòñÿ íåñêîëüêî êîíñòðóêöèè if è else, êàêèì îáðàçîì êîìïèëÿòîð ðåøàåò, êàêîìó îïåðàòîðó if ñîîòâåòñòâóåò êàêîé îïåðàòîð else? Ðàññìîòðèì, íàïðèìåð, ôðàãìåíò ïðîãðàììû:
If(number > 6).
if(number < 12).
printf ("Âû çàêîí÷èëè!\n");
Else.
Printf("Ïðîñòèòå, âû ïîòåðÿëè õîä.\n");
 êàêîì ñëó÷àå ôðàçà "Ïðîñòèòå, âû ïîòåðÿëè õîä!" áóäåò íàïå÷àòàíà? Êîãäà çíà÷åíèå ïåðåìåííîé number ìåíüøå èëè ðàâíî 6, èëè êîãäà îíî áîëüøå 12? Äðóãèìè ñëîâàìè, ÷åìó ñîîòâåòñòâóåò else: ïåðâîìó if èëè âòîðîìó?
Îòâåò âûãëÿäèò òàê: else ñîîòâåòñòâóåò âòîðîìó if, ò.å. ïðè âûïîëíåíèè ïðîãðàììû ðåçóëüòàòû áóäóò òàêèìè:
×èñëî: Ðåçóëüòàò:
5 Íåò.
10 Âû çàêîí÷èëè!
15 Ïðîñòèòå, âû ïîòåðÿëè õîä!
Ñóùåñòâóåò ïðàâèëî, êîòîðîå ãëàñèò, ÷òî else ñîîòâåòñòâóåò áëèæàéøåìó if, êðîìå òåõ ñëó÷àåâ, êîãäà èìåþòñÿ ôèãóðíûå ñêîáêè. Ìû ñîçíàòåëüíî çàïèñàëè ýòîò ôðàãìåíò òàê, êàê áóäòî else ñîîòâåòñòâóåò ïåðâîìó if, íî âñïîìíèòå, ÷òî êîìïèëÿòîð íå îáðàòèò âíèìàíèÿ íà îòñòóïû â ñòðîêàõ. Åñëè ìû äåéñòâèòåëüíî õîòèì ÷òîáû else ñîîòâåòñòâîâàë ïåðâîìó if, íåîáõîäèìî äàííûé ôðàãìåíò îôîðìèòü ñëåäóþùèì îáðàçîì:
If(number > 6).
{
if(number < 12) printf (" Âûçàêîí÷èëè'\n");
}
Else.
printf(" Ïðîñòèòå, âû ïîòåðÿëè õîä!\n");
Òåïåðü ðåçóëüòàò ìîæåò âûãëÿäåòü òàê.
×èñëî: Ðåçóëüòàò:
5 Ïðîñòèòå, âû ïîòåðÿëè õîä!
10 Âû çàêîí÷èëè!
15 Íåò.

ÐÈÑ. 7.3. Ñòðóêòóðà ñîîòâåòñòâèÿ if è else.
Ðåçþìå: èñïîëüçîâàíèå îïåðàòîðîâ if äëÿ îðãàíèçàöèè âûáîðà èç íåñêîëüêèõ âàðèàíòîâ.
ÊËÞ×ÅÂÛÅ ÑËÎÂÀ: if, else
ÎÁÙÈÅ ÇÀÌÅ×ÀÍÈß:
 êàæäîé èç ïîñëåäóþùèõ ôîðì îïåðàòîðîì ìîæåò áûòü ëèáî ïðîñòîè îïåðàòîð, ëèáî ñîñòàâíîé. Âûðàæåíèå "èñòèííî" â îáîáùåííîì ñìûñëå, åñëè åãî çíà÷åíèå - íåíóëåâàÿ âåëè÷èíà.
ÔÎÐÌÀ ÇÀÏÈÑÈ 1:
If(âûðàæåíèå) îïåðàòîð.
Îïåðàòîð âûïîëíÿåòñÿ, åñëè âûðàæåíèå èñòèííî.
ÔÎÐÌÀ ÇÀÏÈÑÈ 2:
If(âûðàæåíèå)
Îïåðàòîð1 else.
Îïåðàòîð2.
Åñëè âûðàæåíèå èñòèííî, âûïîëíÿåòñÿ îïåðàòîð1, â ïðîòèâíîì ñëó÷àå - îïåðàòîð2.
ÔÎÐÌÀ ÇÀÏÈÑÈ 3:
If(âûðàæåíèå1) îïåðàòîð1.
Else if(âûðàæåíèå2) îïåðàòîð2.
Else îïåðàòîð3.
Åñëè âûðàæåíèå1 èñòèííî, âûïîëíÿåòñÿ îïåðàòîð1. Åñëè âûðàæåíèå1 ëîæíî, íî âûðàæåíèå2 èñòèííî, âûïîëíÿåòñÿ îïåðàòîð2.  ñëó÷àå, êîãäà îáà âûðàæåíèÿ ëîæíû, âûïîëíÿåòñÿ îïåðàòîð3.
ÏÐÈÌÅÐ:
If(legs == 4).
printf("Ýòî, âîçìîæíî, ëîøàäü. \n");
Else if (legs > 4).
printf(" Ýòî íå ëîøàäü. \n");
Else /* ñëó÷àé, êîãäà legs < 4 */
{ legs++;
printf(" Òåïåðü æèâîòíîå èìååò åùå îäíó íîãó.\n");
}
×ÒÎ ÂÀÆÍÅÅ: ÎÏÅÐÀÖÈÈ ÎÒÍÎØÅÍÈß ÈËÈ ÂÛÐÀÆÅÍÈß.
Îïåðàöèè îòíîøåíèÿ èñïîëüçóþòñÿ äëÿ ñðàâíåíèé. Ìû óæå èñïîëüçîâàëè ðàíåå íåêîòîðûå èç íèõ, à ñåé÷àñ ïðèâåäåì ïîëíûé ñïèñîê îïåðàöèé îòíîøåíèÿ, ïðèìåíÿåìûõ ïðè ïðîãðàììèðîâàíèè íà ÿçûêå Ñè.
| Îïåðàöèÿ: | Ñìûñë: |
|---|---|
| < | ìåíüøå |
| <= | ìåíüøå èëè ðàâíî |
| = = | ðàâíî |
| >= | áîëüøå èëè ðàâíî |
| > | áîëüøå |
| != | íå ðàâíî |
Ýòîò ñïèñîê äîâîëüíî õîðîøî ñîîòâåòñòâóåò âîçìîæíûì ÷èñëîâûì ñîîòíîøåíèÿì. (Âîîáùå ãîâîðÿ, ÷èñëà, äàæå êîìïëåêñíûå, ìåíåå ñëîæíû, ÷åì ëþäè). Ãëàâíîå ïðåäîñòåðåæåíèå, êîòîðîå ìû õîòèì ñäåëàòü, ñîñòîèò â òîì, ÷òîáû íå èñïîëüçîâàòü çíàê = âìåñòî = =.  íåêîòîðûõ ÿçûêàõ ïðîãðàììèðîâàíèÿ (íàïðèìåð. Áåéñèêå) îäèí è òîò æå çíàê èñïîëüçóåòñÿ è äëÿ îïåðàöèè ïðèñâàèâàíèÿ, è äëÿ îïåðàöèè îòíîøåíèÿ "ðàâåíñòâî", õîòÿ îíè ñîâåðøåííî ðàçëè÷íû. Ñ ïîìîùüþ îïåðàöèè ïðèñâàèâàíèÿ íåêîòîðîå çíà÷åíèå ïðèñâàèâàåòñÿ ïåðåìåííîé ñëåâà îò çíàêà ðàâåíñòâà.  òî æå âðåìÿ ñ ïîìîùüþ îïåðàöèè îòíîøåíèÿ "ðàâåíñòâî" ïðîâåðÿåòñÿ ðàâíî ëè âûðàæåíèå, ñòîÿùåå ñëåâà îò çíàêà, âûðàæåíèþ ñïðàâà îò íåãî. Ýòà îïåðàöèÿ íå èçìåíÿåò çíà÷åíèÿ ïåðåìåííîé â ëåâîé ÷àñòè, åñëè îíà òàì ïðèñóòñòâóåò.
Canoes = = 5 ïðîâåðÿåò, ðàâíÿåòñÿ ëè çíà÷åíèå ïåðåìåííîé canoes 5.
×òî òàêîå èñòèíà?
Êàæäîå óñëîâíîå âûðàæåíèå ïðîâåðÿåòñÿ "èñòèííî" ëè îíî èëè ëîæíî. Ïðè ýòîì âîçíèêàåò èíòåðåñíûé âîïðîñ: ×òî òàêîå èñòèíà?
Ìû ìîæåì îòâåòèòü íà ýòîò âå÷íûé âîïðîñ ïî êðàéíåé ìåðå òàê, êàê îí ðåøåí â ÿçûêå Ñè. Íàïîìíèì, âî-ïåðâûõ, ÷òî âûðàæåíèå â Ñè âñåãäà èìååò çíà÷åíèå. Ýòî óòâåðæäåíèå îñòàåòñÿ âåðíûì äàæå äëÿ óñëîâíûõ âûðàæåíèé, êàê ïîêàçûâàåò ïðèìåð, ïðèâåäåííûé íèæå.  íåì îïðåäåëÿþòñÿ çíà÷åíèÿ äâóõ óñëîâíûõ âûðàæåíèé, îäíî èç êîòîðûõ îêàçûâàåòñÿ èñòèííûì, à âòîðîå - ëîæíûì.
/* èñòèíà è ëîæü*/
Main( ).
{
int true, false;
true = (10 > 2); /* îòíîøåíèå èñòèííî */
false = (10 = =2); /* îòíîøåíèå ëîæíî */
printf("true = %d; false = %d\n" , true, false);
}
 äàííîì ïðèìåðå çíà÷åíèÿ äâóõ óñëîâíûõ âûðàæåíèé ïðèñâàèâàþòñÿ äâóì ïåðåìåííûì. ×òîáû íå çàïóòàòü ÷èòàòåëÿ, ìû ïðèñâîèëè ïåðåìåííîé true çíà÷åíèå âûðàæåíèÿ, êîòîðîå îêàçûâàåòñÿ èñòèííûì, à ïåðåìåííîé false - çíà÷åíèå âûðàæåíèÿ, êîòîðîå îêàçûâàåòñÿ ëîæíûì. Ïðè âûïîëíåíèè ïðîãðàììû ïîëó÷èì ñëåäóþùèé ïðîñòîé ðåçóëüòàò:
True = 1; false = 0.
Âîò êàê! Îêàçûâàåòñÿ, â ÿçûêå Ñè çíà÷åíèå "èñòèíà" - ýòî 1, a "ëîæü" - 0. Ìû ìîæåì ýòî ëåãêî ïðîâåðèòü, âûïîëíèâ ïðîãðàììó, ïðèâåäåííóþ íèæå.
/* ïðîâåðêà èñòèííîñòè */
Main( ).
{
If(1).
printf(" 1 ñîîòâåòñòâóåò èñòèíå.\n" );
Else.
printf(" 1 íå ñîîòâåòñòâóåò èñòèíå. \n");
If(0).
printf(" 0 íå îçíà÷àåò ëîæü. \n");
Else.
printf(" 0 îçíà÷àåòëîæü. \n");
}
Ìû ñêàæåì, ÷òî 1 äîëæíà ðàññìàòðèâàòüñÿ êàê èñòèííîå óòâåðæäåíèå, à 0 - êàê ëîæíîå. Åñëè íàøå ìíåíèå âåðíî, òî â ïåðâîì îïåðàòîðå if äîëæíà âûïîëíèòüñÿ ïåðâàÿ âåòâü (âåòâü if, à âî âòîðîì îïåðàòîðå if - âòîðàÿ (âåòâü else). Ïîïðîáóéòå çàïóñòèòü ïðîãðàììó, ÷òîáû óçíàòü, ïðàâû ëè ìû.
Èòàê, ÷åìó æå âñå-òàêè ñîîòâåòñòâóåò èñòèíà?
Ìû ìîæåì èñïîëüçîâàòü 1 è 0 â êà÷åñòâå ïðîâåðî÷íûõ çíà÷åíèé îïåðàòîðà if. Ñïðàøèâàåòñÿ, ìîæåì ëè ìû èñïîëüçîâàòü äðóãèå ÷èñëà. Åñëè äà, òî ÷òî ïðè ýòîì ïðîèñõîäèò? Äàâàéòå ïðîâåäåì ýêñïåðèìåíò.
/* if - òåñò */
Main( ).
{
If (200).
printf("200 - ýòî èñòèíà. \n");
If(-33).
printf(" -33 - ýòî èñòèíà \n");
}
Ðåçóëüòàòû âûãëÿäÿò òàê.
200 - ýòî èñòèíà.
-33- ýòî èñòèíà.
Î÷åâèäíî, â ÿçûêå Ñè ÷èñëà 200 è -33 òîæå ðàññìàòðèâàþòñÿ êàê "èñòèíà". È äåéñòâèòåëüíî, âñå íåíóëåâûå âåëè÷èíû ïðèíèìàþòñÿ â êà÷åñòâå "èñòèíû" è òîëüêî 0 - êàê "ëîæü".  ÿçûêå Ñè ïîíÿòèå èñòèíû îêàçûâàåòñÿ ÷ðåçâû÷àéíî ðàñòÿæèìûì.
Ìíîãèå ïðîãðàììèñòû îáû÷íî ïîëüçóþòñÿ ýòèì îïðåäåëåíèåì èñòèííîñòè. Íàïðèìåð, ñòðîêó.
If(goats !=0).
Ìîæíî çàìåíèòü òàêîé.
If(goats).
Ïîñêîëüêó âûðàæåíèå (goats != 0) è âûðàæåíèå (goats) îáà ïðèìóò çíà÷åíèå 0, èëè "ëîæü", òîëüêî â òîì ñëó÷àå, åñëè çíà÷åíèå ïåðåìåííîé goats ðàâíî 0. Ìû äóìàåì, ÷òî ñìûñë âòîðîé ôîðìû çàïèñè ìåíåå î÷åâèäåí, ÷åì ïåðâîé. Îäíàêî â ðåçóëüòàòå êîìïèëÿöèè îíà îêàçûâàåòñÿ áîëåå ýôôåêòèâíîé, òàê êàê ïðè ðåàëèçàöèè ïðî ãðàììû òðåáóåò ìåíüøåãî ÷èñëà ìàøèííûõ îïåðàöèé.
Îñëîæíåíèÿ ñ ïîíÿòèåì "èñòèíà".
Ðàñòÿæèìîñòü ïîíÿòèÿ èñòèíà â ÿçûêå Ñè ìîæåò ïðèâåñòè è ê íåïðèÿòíîñòÿì. Ðàññìîòðèì ñëåäóþùóþ ïðîãðàììó:
/* çàíÿòîñòü */
Main( ).
{
Int age = 20;
While(age++ <= 65).
{ if((age % 20) = =0) /* äåëèòñÿ ëè âîçðàñò íà 20 ? */
printf(" Âàì %d. Ïîçäðàâëÿåì ñ ïîâûøåíèåì!\n", age);
if (age = 65).
printf(" Âàì %d. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû \n", age);
} }
Ñ ïåðâîãî âçãëÿäà âàì ìîæåò ïîêàçàòüñÿ, ÷òî ðåçóëüòàò ðàáîòû ïðîãðàììû áóäåò âûãëÿäåòü, íàïðèìåð, òàê:
Âàì 40. Ïîçäðàâëÿåì ñ ïîâûøåíèåì.
Âàì 60. Ïîçäðàâëÿåì ñ ïîâûøåíèåì.
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
Íà ñàìîì äåëå, îäíàêî, âûõîä áóäåò òàêèì:
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
Âàì 65. Ïðåïîäíîñèì Âàì çîëîòûå ÷àñû.
È ò. ä.- äî áåñêîíå÷íîñòè.
 ÷åì äåëî? Ýòî ïðîèçîøëî íå òîëüêî ïîòîìó, ÷òî ìû ïëîõî ñïðîåêòèðîâàëè ïðîãðàììó, íî è ïîòîìó, ÷òî ìû çàáûëè ñâîè ñîáñòâåííûå ïðåäîñòåðåæåíèÿ è èñïîëüçîâàëè âûðàæåíèå:
If (àgå= 65).
Âìåñòî.
If (age == 65).
Ïîñëåäñòâèÿ îøèáêè îêàçàëèñü êàòàñòðîôè÷åñêèìè. Êîãäà â ïðîöåññå âûïîëíåíèÿ ïðîãðàììà äîñòèãàåò óêàçàííîãî îïåðàòîðà, îíà ïðîâåðèò âûðàæåíèå (àgå = 65). Ýòî âûðàæåíèå, âêëþ÷àþùåå â ñåáÿ îïðåàöèþ ïðèñâàèâàíèÿ, èìååò çíà÷åíèå, êîòîðîå ñîâïàäàåò ñî çíà÷åíèåì ïåðåìåííîé, ðàñïîëîæåííîé ñëåâà îò çíàêà, ò.å. ñ 65 (â ëþáîì ñëó÷àå). Ïîñêîëüêó 65 íå ðàâíî íóëþ, âûðàæåíèå ñ÷èòàåòñÿ èñòèííûì" è âûïîëíÿåòñÿ êîìàíäà âûâîäà íà ïå÷àòü. Çàòåì, êîãäà â ïðîãðàììå ïðîèñõîäèò ïåðåäà÷à óïðàâëåíèÿ íà êîìàíäó ïðîâåðêè óñëîâèÿ â öèêëå while, çíà÷åíèå ïåðåìåííîé àgå ïî-ïðåæíåìó ðàâíî 65, ÷òî ìåíüøå èëè ðàâíî 65. Óñëîâèå îêàçûâàåòñÿ èñòèííûì è âåëè÷èíà àgå óâåëè÷èâàåòñÿ äî 66 (ââèäó íàëè÷èÿ îïåðàöèè óâåëè÷åíèÿ ++ â ïîñòôèêñíîé ôîðìå), è òåëî öèêëà âûïîëíÿåòñÿ åùå ðàç. Ïðåêðàòèòñÿ ëè åãî âûïîëíåíèå íà ñëåäóþùåì øàãå? Äîëæíî áûëî áû, ïîñêîëüêó âåëè÷èíà àgå òåïåðü áîëüøå, ÷åì 65. Êîãäà ïðîãðàììà îïÿòü ïîïàäàåò íà íàø îøèáî÷íûé îïåðàòîð if ïåðåìåííàÿ àgå ñíîâà ïîëó÷èò çíà÷åíèå 65.  ðåçóëüòàòå ñîîáùåíèå áóäåò íàïå÷àòàíî åùå ðàç, çàòåì òåëî öèêëà âûïîëíèòñÿ åùå ðàç, è ò.ä. - äî áåñêîíå÷íîñòè (Êîíå÷íî, åñëè âû â êîíöå êîíöîâ íå çàõîòèòå îñòàíîâèòü ïðîãðàììó).
Ïîäâîäÿ èòîãè, ìîæíî ñêàçàòü, ÷òî îïåðàöèè îòíîøåíèÿ èñïîëüçóåòñÿ äëÿ îáðàçîâàíèÿ óñëîâíûõ âûðàæåíèé. Óñëîâíîå âûðàæåíèå èìååò çíà÷åíèå "1", êîãäà îíî èñòèííî, è "0", åñëè îíî ëîæíî.  îïåðàòîðàõ (òàêèõ êàê while è if), ãäå îáû÷íî èñïîëüçóþòñÿ óñëîâíûå âûðàæåíèÿ äëÿ çàäàíèÿ ïðîâåðÿåìûõ óñëîâèé, ìîãóò ïðèìåíÿòüñÿ ëþáûå âûðàæåíèÿ, ïðè÷åì íåíóëåâîå çíà÷åíèå ÿâëÿåòñÿ èñòèíîé", à íóëü - "ëîæüþ".
Ïðèîðèòåòû îïåðàöèé îòíîøåíèÿ.
Ïðèîðèòåò îïåðàöèé îòíîøåíèÿ ñ÷èòàåòñÿ ìåíüøèì, ÷åì ó îïåðàöèé + è -, è áîëüøå, ÷åì ó îïåðàöèè ïðèñâàèâàíèÿ. Íàïðèìåð, çíà÷åíèå âûðàæåíèÿ:
Õ > y + 2.
Òî æå, ÷òî è âûðàæåíèÿ.
Õ > (ó + 2).
Ýòî îçíà÷àåò òàêæå, ÷òî âûðàæåíèå.
Ch = getchar( ) != EOF.
Ýêâèâàëåíòíî.
Ch = (getchar( ) != EOF).
Ïîñêîëüêó íàëè÷èå ó îïåðàòîðà !=, áîëåå âûñîêîãî ïðèîðèòåòà ãîâîðèò î òîì, ÷òî îíà âûïîëíÿåòñÿ ïåðåä ïðèñâàèâàíèåì. Ïîýòîìó çíà÷åíèå ïåðåìåííîé ch ìîæåò ñòàòü ëèáî 1, ëèáî 0 ââèäó òîãî, ÷òî (getchar( ) != EOF) - óñëîâíîå âûðàæåíèå, çíà÷åíèå êîòîðîãî ïðèñâàèâàåòñÿ ïåðåìåííîé ch. Ïîñêîëüêó â ïðèìåðàõ ïðîãðàìì ðàññìîòðåííûõ äî ñèõ ïîð, ïðåäïîëàãàëîñü, ÷òî ïåðåìåííàÿ ch ïîëó÷àåò ñâîå çíà÷åíèå îò ôóíêöèè getchar( ), ìû èñïîëüçîâàëè ñêîáêè, ÷òîáû îðãàíèçîâàòü âûïîëíåíèå îïåðàöèé â íóæíîì ïîðÿäêå.
(ch = getchar( )) != EOF.
Ñàìè îïåðàöèè îòíîøåíèÿ ìîæíî ðàçáèòü íà äâå ãðóïïû â ñîîòâåòñòâèè ñ íàçíà÷åííûìè ïðèîðèòåòàìè:
ãðóïïà îïåðàöèé áîëåå âûñîêîãî ïðèîðèòåòà: < <= => >
ãðóïïà îïåðàöèé áîëåå íèçêîãî ïðèîðèòåòà: = = !=
Ïîäîáíî áîëüøèíñòâó îñòàëüíûõ îïåðàöèé îïåðàöèè îòíîøåíèÿ âûïîëíÿþòñÿ ñëåâà íàïðàâî. Ïîýòîìó ïîä çàïèñüþ:
Åõ != wye == zee.
Ïîäðàçóìåâàåòñÿ.
(ex != wye) == zee.
Ñëåäîâàòåëüíî, â ñîîòâåòñòâèè ñ ïðàâèëàìè ÿçûêà Ñè ñíà÷àëà ïðîâåðÿåòñÿ, ðàâíû ëè çíà÷åíèÿ ïåðåìåííûõ åõ è wye. Ðåçóëüòèðóþùàÿ âåëè÷èíà, ðàâíàÿ 1 èëè 0 (èñòèíà èëè ëîæü), çàòåì ñðàâíèâàåòñÿ ñî çíà÷åíèåì zee. Ìû íå âèäèì ðåàëüíîé íåîáõîäèìîñòè èñïîëüçîâàòü ïîäîáíîãî ñîðòà êîíñòðóêöèþ, íî ñ÷èòàåì ñâîèì äîëãîì óêàçàòü íà âîçìîæíûå ñëåäñòâèÿ ïðèíÿòîãî ïîðÿäêà âûïîëíåíèÿ îïåðàöèé.
×èòàòåëþ, îçàáî÷åííîìó ñîõðàíåíèåì ñâîåãî âûñîêîãî ïðèîðèòåòà, õîòèì íàïîìíèòü, ÷òî ïîëíûé ñïèñîê âñåõ îïåðàöèé âìåñòå ñ èõ ïðèîðèòåòàìè ïðèâåäåí â ïðèëîæåíèè  â êîíöå êíèãè.
Ðåçþìå: îïåðàöèè îòíîøåíèÿ è âûðàæåíèÿ.
1. Îïåðàöèè îòíîøåíèÿ.
Ñ ïîìîùüþ êàæäîé èç ïðèâåäåííûõ íèæå îïåðàöèè âåëè÷èíà ñëåâà îò çíàêà ñðàâíèâàåòñÿ ñ âåëè÷èíîé ñïðàâà îò íåãî:
2. Áîëüøå.
3. Áîëüøå èëè ðàâíî.
4. Ðàâíî.
5. Ìåíüøå èëè ðàâíî.
6. Ìåíüøå.
7. Íå ðàâíî
ÓÑËÎÂÍÛÅ ÂÛÐÀÆÅÍÈß
Ïîíÿòèå óñëîâíîå âûðàæåíèå ñîñòîèò èç çíàêà îïåðàöèè îòíîøåíèÿ è îïåðàíäîâ, ðàñïîëîæåííûõ ñëåâà è ñïðàâà îò íåãî. Åñëè îòíîøåíèå èñòèííî, çíà÷åíèå óñëîâíîãî âûðàæåíèÿ ðàâíî 1, åñëè îòíîøåíèå ëîæíî, çíà÷åíèå óñëîâíîãî âûðàæåíèÿ ðàâíî 0.
Ïðèìåðû:
Îòíîøåíèå 5 > 2: èñòèííî è èìååò çíà÷åíèå 1.
Îòíîøåíèå (2 + à) = = à: ëîæíî è èìååò çíà÷åíèå 0.
ËÎÃÈ×ÅÑÊÈÅ ÎÏÅÐÀÖÈÈ.
Èíîãäà áûâàåò ïîëåçíûì îáúåäèíèòü äâà èëè áîëåå óñëîâíûõ âûðàæåíèÿ. Íàïðèìåð, ïðåäïîëîæèì, íàì òðåáóåòñÿ ïðîãðàììà, êîòîðàÿ ïîäñ÷èòûâàåò òîëüêî "íåïóñòûå" ñèìâîëû, ò. å. ìû õîòèì çíàòü ÷èñëî ñèìâîëîâ, íå ÿâëÿþùèõñÿ ïðîáåëàìè, ñèìâîëàìè "íîâàÿ ñòðîêà" è òàáóëÿöèè. Äëÿ ýòîãî ìû ìîæåì èñïîëüçîâàòü "ëîãè÷åñêèå" îïåðàöèè. Íèæå ïðèâîäèòñÿ êîðîòêàÿ ïðîãðàììà èëëþñòðèðóþùàÿ ýòîò ñïîñîá ïîäñ÷åòà:
/* ÷èñëî ñèìâîëîâ */
/* ïîäñ÷èòûâàåò íå ïóñòûå ñèìâîëû */
Main( ).
{
Int ch;
Int charcount = 0;
While ((ch = getchar( )) != EOF).
If(ch !=' ' && ch \='\n' && ch != '\t') charcount++;
printf(" Âñåãî %d íåïóñòûõ ñèìâîëîâ. \n", charcount);
}
Òàê æå êàê ýòî îáû÷íî ïðîèñõîäèëî â íàøèõ ïðåäûäóùèõ ïðîãðàììàõ, äàííàÿ ïðîãðàììà íà÷èíàåò ñâîå âûïîëíåíèå ñ ÷òåíèåì ñèìâîëà è ïðîâåðêè, ÿâëÿåòñÿ ëè îí ïðèçíàêîì êîíöà ôàéëà. Äàëüøå ïîÿâëÿåòñÿ íå÷òî íîâîå - îïåðàòîð, èñïîëüçóþùèé ëîãè÷åñêóþ îïåðàöèþ "è", îáîçíà÷àåìóþ &&. Ñìûñë äåéñòâèé, îñóùåñòâëÿåìûõ îïåðàòîðîì if â äàííîì ñëó÷àå, ìîæíî ïîÿñíèòü ñëåäóþùèì îáðàçîì:
Åñëè ïðî÷èòàííûé ñèìâîë íå ïðîáåë, È íå ñèìâîë "íîâàÿ ñòðîêà", È íå ñèìâîë òàáóëÿöèè, òî ïðîèñõîäèò óâåëè÷åíèå çíà÷åíèÿ ïåðåìåííîé charcount íà åäèíèöó.
Âñå âûðàæåíèå áóäåò èñòèííûì, åñëè óêàçàííûå òðè óñëîâèÿ èñòèííû. Ëîãè÷åñêèå îïåðàöèè èìåþò ìåíüøèé ïðèîðèòåò, ÷åì îïåðàöèè îòíîøåíèÿ, ïîýòîìó íå áûëî íåîáõîäèìîñòè èñïîëüçîâàòü äîïîëíèòåëüíûå ñêîáêè äëÿ âûäåëåíèÿ ïîäâûðàæåíèé.
 ÿçûêå Ñè èìåþòñÿ òðè ëîãè÷åñêèå îïåðàöèè:
| Îïåðàöèÿ | Ñìûñë |
|---|---|
| && | È |
| || | ÈËÈ |
| ! | ÍÅ |
Ïðåäïîëîæèì, ÷òî expl è åõð2 - äâà ïðîñòûõ óñëîâíûõ âûðàæåíèÿ òèïà cat > rat èëè debt = = 1000. Òîãäà:
1. expl && åõð2: èñòèííî â òîì è òîëüêî â òîì ñëó÷àå, êîãäà îáà âûðàæåíèÿ expl è åõð2 èñòèííû.
2. expl || åõð2: èñòèííî â òîì ñëó÷àå, åñëè êàêîå-íèáóäü èç âûðàæåíèé expl èëè åõð2 èñòèííî èëè îáà èñòèííû.
3. !expl: èñòèííî, åñëè âûðàæåíèå expl ëîæíî, è íàîáîðîò.
Íèæå ïðèâåäåíî íåñêîëüêî êîíêðåòíûõ ïðèìåðîâ:
5 > 2 && 4 > 7: ëîæíî, ïîñêîëüêó èñòèííî òîëüêî îäíî ïîäâûðàæåíèå.
5 > 2 || 4 > 7: èñòèííî, ïîñêîëüêó ïî êðàéíåé ìåðå îäíî èç ïîäâûðàæåíèé èñòèííî.
!(4 > 7): èñòèííî, ïîòîìó ÷òî 4 íå áîëüøå 7.
Ïîñëåäíåå âûðàæåíèå ê òîìó æå ýêâèâàëåíòíî ñëåäóþùåìó:
4 < = 7.
Åñëè âû ñîâñåì íå çíàêîìû ñ ëîãè÷åñêèìè îïåðàöèÿìè èëè èñïûòûâàåòå òðóäíîñòè ïðè ðàáîòå ñ íèìè, ïîìíèòå, ÷òî ïðàêòèêà && âðåìÿ = = ñîâåðøåíñòâî.
Ïðèîðèòåòû.
Îïåðàöèÿ ! èìååò î÷åíü âûñîêèé ïðèîðèòåò, îí âûøå, ÷åì ó óìíîæåíèÿ, òàêîé æå, êàê ó îïåðàöèé óâåëè÷åíèÿ, è òîëüêî êðóãëûå ñêîáêè èìåþò áîëåå âûñîêèé ïðèîðèòåò. Ïðèîðèòåò îïåðàöèè && áîëüøå ÷åì îïåðàöèè ||, à îáå îíè èìåþò áîëåå íèçêèé ïðèîðèòåò, ÷åì îïåðàöèè îòíîøåíèÿ, íî áîëåå âûñîêèé, ÷åì îïåðàöèÿ ïðèñâàèâàíèÿ. Ïîýòîìó âûðàæåíèå:
À > b && b > c || b > d.
Èíòåðïðåòèðîâàíî òàê:
((a > b) && (b > ñ)) || (b > d).
Ò. å. b ñîäåðæèòñÿ ìåæäó ñ è à èëè b áîëüøå d.
Ïîðÿäîê âû÷èñëåíèé.
Îáû÷íî â ÿçûêå Ñè íå îïðåäåëÿåòñÿ, êàêèå ÷àñòè ñëîæíîãî âûðàæåíèÿ áóäóò âû÷èñëÿòüñÿ âíà÷àëå. Íàïðèìåð, â îïåðàòîðå:
Apples = (5 + 3)*(9 + 6);
Âûðàæåíèå 5 + 3 ìîæåò áûòü âû÷èñëåíî äî âû÷èñëåíèÿ âûðàæåíèÿ 9 + 6, èëè íàîáîðîò (Ïðèîðèòåòû, ïðèñâîåííûå îïåðàöèÿì ãàðàíòàòèðóþò, ÷òî îáà âûðàæåíèÿ áóäóò âû÷èñëåíû ïåðåä âûïîëíåíèåì îïåðàöèè óìíîæåíèÿ.) Ýòà íåîïðåäåëåííîñòü áûëà îñòàâëåíà â ÿçûêå, ÷òîáû ñîçäàòåëè êîìïèëÿòîðà èìåëè âîçìîæíîñòü â êîíêðåòíîé ñèñòåìå îñóùåñòâëÿòü íàèáîëåå ýôôåêòèâíûé âûáîð. Èñêëþ÷åíèåì èç ýòîãî ïðàâèëà (èëè åãî íàðóøåíèåì) ÿâëÿåòñÿ âûïîëíåíèå ëîãè÷åñêèõ îïåðàöèé. ßçûê Ñè ãàðàíòèðóåò, ÷òî ëîãè÷åñêèå âûðàæåíèÿ âû÷èñëÿþòñÿ ñëåâà íàïðàâî. Áîëåå òîãî, ãàðàíòèðóåòñÿ òàêæå, ÷òî, êàê òîëüêî îáíàðóæèâàåòñÿ ýëåìåíò, çíà÷åíèå êîòîðîãî óñòàíàâëèâàåò ëîæíîñòü âñåãî âûðàæåíèÿ êàê öåëîãî, âû÷èñëåíèå äàííîãî âûðàæåíèÿ ïðåêðàùàåòñÿ. Ýòî äàåò âîçìîæíîñòü èñïîëüçîâàòü êîíñòðóêöèè òèïà:
While((c = getchar( )) != EOF && ñ != '\n').
 ðåçóëüòàòå âû÷èñëåíèÿ ïåðâîãî ïîäâûðàæåíèÿ ïåðåìåííàÿ ñ ïîëó÷àåò ñâîå çíà÷åíèå, êîòîðîå çàòåì ìîæíî èñïîëüçîâàòü âî âòîðîì ïîäâûðàæåíèè. Åñëè áû òàêîé ïîðÿäîê âû÷èñëåíèé íå ãàðàíòèðîâàëñÿ, ïðè âûïîëíåíèè ïðîãðàììû êîìïüþòåð, âîçìîæíî, ïðîâåðÿë áû èñòèííîñòü âòîðîãî âûðàæåíèÿ ïåðåä íàõîæäåíèåì çíà÷åíèÿ ïåðåìåííîé ñ.
Ïðèâåäåì åùå îäèí ïðèìåð:
If (number !=0 && 12/number ==2) printf(" ×èñëî ðàâíî 5 èëè 6.\n" );
Åñëè çíà÷åíèå ïåðåìåííîé number ðàâíî 0, òî âñå âûðàæåíèå ëîæíî, è ïîýòîìó äàëüíåéøåå âû÷èñëåíèå äàííîãî óñëîâíîãî âûðàæåíèÿ ïðåêðàùàåòñÿ. Ýòî èçáàâëÿåò êîìïüþòåð îò ïîñëåäñòâèé äåëåíèÿ íà íóëü. Ìíîãèå ÿçûêè íå îáåñïå÷èâàþò âûïîëíåíèÿ ïîäîáíîãî òðåáîâàíèÿ, è, âûÿñíèâ, ÷òî number ðàâíî 0, êîìïüþòåð ïåðåõîäèò ê ïðîâåðêå ñëåäóþùåãî óñëîâèÿ.
Ðåçþìå: ëîãè÷åñêèå îïåðàöèè è âûðàæåíèÿ.
1. ËÎÃÈ×ÅÑÊÈÅ ÎÏÅÐÀÖÈÈ
Îïåðàíäàìè ëîãè÷åñêèõ îïåðàöèé îáû÷íî ÿâëÿþòñÿ óñëîâíûå âûðàæåíèÿ. Ó îïåðàöèè != èìååòñÿ òîëüêî îäèí îïåðàíä. Îñòàëüíûå èìåþò ïî äâà - îäèí ñëåâà îò çíàêà è äðóãîé ñïðàâà îò íåãî.
&& È|| ÈËÈ! ÍÅ.
II. ËÎÃÈ×ÅÑÊÈÅ ÂÛÐÀÆÅÍÈß
Âûðàæåíèå1 && âûðàæåíèå2: èñòèííî òîãäà è òîëüêî òîãäà, êîãäà îáà âûðàæåíèÿ èñòèííû.
Âûðàæåíèå1 || âûðàæåíèå2: èñòèííî, åñëè êàêîå-íèáóäü îäíî èëè îáà âûðàæåíèÿ èñòèííû.
!âûðàæåíèå: èñòèííî, åñëè âûðàæåíèå ëîæíî, è íà îáîðîò.
ÏÎÐßÄÎÊ ÂÛ×ÈÑËÅÍÈÈ
Ëîãè÷åñêèå âûðàæåíèÿ âû÷èñëÿþòñÿ ñëåâà íàïðàâî; âû÷èñëåíèÿ ïðåêðàùàþòñÿ, êàê òîëüêî óñòàíàâëèâàåòñÿ èñòèííîñòü èëè ëîæíîñòü âñåãî âûðàæåíèÿ.
ÏÐÈÌÅÐÛ
Âûðàæåíèå: 6 > 2 && 3 = = 3: èñòèííî.
Âûðàæåíèå: !(6 > 2 && 3 = = 3): ëîæíî.
Âûðàæåíèå: õ != 0 && 20/õ < 5: âòîðîå âûðàæåíèå âû÷èñëÿåòñÿ òîëüêî ïðè óñëîâèè, ÷òî õ íå ðàâåí íóëþ.
ÏÐÎÃÐÀÌÌÀ ÏÎÄÑ×ÅÒÀ ÑËÎÂ.
Òåïåðü ó íàñ åñòü âîçìîæíîñòè äëÿ íàïèñàíèÿ ïðîãðàììû ïîäñ÷åòà ÷èñëà ñëîâ â òåêñòå. (Îíà ìîæåò òàêæå ïîäñ÷èòûâàòü ñèìâîëû ñòðîêè.) Ðåøàþùèì ìîìåíòîì ÿâëÿåòñÿ ðàçðàáîòêà ñïîñîáà, ñ ïîìîùüþ êîòîðîãî ïðîãðàììà áóäåò ðàñïîçíàâàòü ñëîâà. Ìû áóäåì ïðèäåðæèâàòüñÿ ñðàâíèòåëüíî ïðîñòîãî ïîäõîäà è îïðåäåëèì ñëîâî êàê ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, êîòîðàÿ íå ñîäåðæèò "ïóñòûõ ñèìâîëîâ". Ïîýòîìó "glymxck" è "r2d2" - ýòî ñëîâà. Ïåðåìåííàÿ word áóäåò èñïîëüçîâàòüñÿ äëÿ õðàíåíèÿ óêàçàíèÿ î òîì, ÿâëÿåòñÿ ëè ââåäåííûé ñèìâîë ÷àñòüþ äàííîãî ñëîâà èëè íà÷àëîì ñëåäóþùåãî. Ïîÿâëåíèå "ïóñòîãî ñèìâîëà" (êîòîðûì ìîæåò áûòü ïðîáåë, òàáóëÿöèÿ èëè "íîâàÿ ñòðîêà") ñëóæèò ïðèçíàêîì êîíöà ñëîâà. Òîãäà ñëåäóþùèé "íåïóñòîé" ñèìâîë áóäåò îçíà÷àòü íà÷àëî íîâîãî ñëîâà, è ìû ñìîæåì óâåëè÷èòü çíà÷åíèå ñ÷åò÷èêà ñëîâ íà 1.
Âîò ýòà ïðîãðàììà:
#include.
#define YES 1.
#define NO 0.
Main( ).
{
int ch; /* ââåäåííûéñèìâîë*/
Long nc = 0L; /* ÷èñëî ñèìâîëîâ */
Int n1 = 0; /* ÷èñëî ñòðîê */
Int nw = 0; /* ÷èñëî ñëîâ */
Int word = NO; /* = = YES, åñëè ñîäåðæèìîå ch - ÷àñòü ñëîâà */
While((ch = getchar( )) != EOF).
{
nc++ ; / * ïîäñ÷åò ñèìâîëîâ * /
if (ch = = '\n' ) nl++; /* ïîäñ÷åò ñòðîê */
if (ch != ' ' && ch != '\n' && ch !='\t' && word ==NO).
{
word = YES; /* íà÷àëî íîâîãî ñëîâà */
nw++; /* ïîäñ÷åò ñëîâ */
}
If ((ch = = ' ' || ch = = '\n' || ch = = '\t' ) && word == YES).
word = NO; /* äîñòèãíóò êîíåö ñëîâà */
}
Printf(" ñèìâîëîâ = %1d, ñëîâ = %d, ñòðîê = %d\n", nc, nw, nl);
}
Ïîñêîëüêó ñóùåñòâóþò òðè ðàçëè÷íûõ "ïóñòûõ ñèìâîëà", ìû äîëæíû èñïîëüçîâàòü ëîãè÷åñêèå îïåðàöèè äëÿ ïðîâåðêè âñåõ òðåõ âîçìîæíîñòåé. Ðàññìîòðèì, íàïðèìåð, ñëåäóþùóþ ñòðîêó:
If(ch != ' ' && ch != '\n' && ch != '\t ' && word == NO).
 íåé ãîâîðèòñÿ: "åñëè ñîäåðæèìîå ch - íå ïðîáåë, è íå íîâàÿ ñòðîêà, è íå òàáóëÿöèÿ, è íå ïåðâûé ñèìâîë ñëîâà". (Ïåðâûå òðè óñëîâèÿ ýêâèâàëåíòíû ïðîâåðêå, íå ÿâëÿåòñÿ ëè ñîäåðæèìîå ch ïóñòûì ñèìâîëîì). Âûïîëíåíèå âñåõ ÷åòûðåõ óñëîâèé ñëóæèò ïðèçíàêîì íà÷àëà íîâîãî ñëîâà, è çíà÷åíèå ïåðåìåííîé nw óâåëè÷èâàåòñÿ. Åñëè ìû â ñåðåäèíå ñëîâà, òî ïåðâûå òðè óñëîâèÿ îêàçûâàþòñÿ âû ïîëíåííûìè, íî çíà÷åíèåì ïåðåìåííîé word îêàæåòñÿ ïðèçíàê YES, è çíà÷åíèå ïåðåìåííîé nw íå óâåëè÷èâàåòñÿ. Êîãäà â ïðîöåññå ââîäà âñòðåòèòñÿ î÷åðåäíîé "ïóñòîé" ñèìâîë, ïåðåìåííîé word áóäåò âíîâü ïðèñâîåí ïðèçíàê NO.
Ïðîñìîòðèòå ïðîãðàììó è ïðîâåðüòå, ïðàâèëüíî ëè îíà èíòåðïðåòèðóåò ñëó÷àè, êîãäà ìåæäó ñëîâàìè íàõîäèòñÿ íåñêîëüêî "ïóñòûõ" ñèìâîëîâ ïîäðÿä.
Åñëè âû çàõîòèòå ïðèìåíèòü ýòó ïðîãðàììó äëÿ ðàáîòû ñ ôàéëàìè, èñïîëüçóéòå îïåðàöèè ïåðåêëþ÷åíèÿ.
ÏÐÎÃÐÀÌÌÀ, "ÐÈÑÓÞÙÀß" ÑÈÌÂÎËÀÌÈ.
Äàâàéòå òåïåðü çàéìåìñÿ ÷åì íèáóäü ìåíåå óòèëèòàðíûì è áîëåå äåêîðàòèâíûì. Íàøåé öåëüþ ÿâëÿåòñÿ ñîçäàíèå ïðîãðàììû, ñ ïîìîùüþ êîòîðîé âû ñìîæåòå ðèñîâàòü íà ýêðàíå ãåîìåòðè÷åñêèå ôèãóðû, çàïîëíåííûå ñèìâîëàìè. Êàæäàÿ âûâîäèìàÿ ñòðîêà ïðåäñòàâëÿåò ñîáîé ñïëîøíîé ðàä îäèíàêîâûõ ñèìâîëîâ.
Íàì ïðåäîñòàâëÿåòñÿ âîçìæíîñòü âûáîðà ñèìâîëà, äëèíû ñòðîêè, à òåêæå íà÷àëüíîé ïîçèöèè, ñ êîòîðîé îíà âûâîäèòüñÿ íà ïå÷àòü. Ïðîãðàììà ÷èòàåò óêàçûâàåìûå ïàðàìåòðû äî òåõ ïîð, ïîêà íå âñòðåòèò ïðèçíàê EOF. Òåêñò ïðîãðàììû ïðåäñòàâëåí íà ðèñ. 7.5.
Ïîëîæèì, ìû âûçûâàåì ïðîãðàììó sketcher. ×òîáû åå âûïîëíèòü, ìû íàáèðàåì íà êëàâèàòóðå åå èìÿ, çàòåì ââîäèì ñèìâîë è äâà ÷èñëà. Íà ýêðàíå ïîÿâëÿåòñÿ îòêëèê, ïîñëå ÷åãî ìû ââîäèì åãî íàáîð ïàðàìåòðîâ, îòêëèê ïîÿâëÿåòñÿ âíîâü, è òàê äî òåõ ïîð ïîêà ìû íå ââåäåì ïðèçíàê EOF.
 ñðåäå ÎÑ UNIX äèàëîã áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
% sketcher.
B 10 20.
BBBBBBBBBBB.
Y 12 18.
YYYYYYY.
[CTRL/-d].
%
/* õóäîæíèê-ãðàôèê */
/* ÐÈÑÓÅÒ ñïëîøíûå ôèãóðû */
#include.
#define MAXLENGTH 80.
Main( ).
{
Int ch; /*ïå÷àòàåìûéñèìâîë*/
Int start, stop; /* íà÷àëüíàÿ è êîíå÷íûå ïîçèöè */
Int count; /* ñ÷åò÷èêïîçèöèé*/
Whilå((ñh = getchar( )) != EOF) /* ââîäñèìâîëà*/
{
if(ch != '\n' ) /*ïðîïóñê ñèìâîëà "íîâàÿ ñòðîêà"*/
{ scanf(" %d %d", &start, &stop); /* ââîä ãðàíè÷íûõ çíà÷íèé*/
if (start > stop || start < 1 || stop > MAXLENGTH).
printf(" Ââåäåíû íåïðàâèëüíûå ãðàíè÷íûå çíà÷å íèÿ \n");
else.
{ count = 0;
while(++count < start).
putchar(' '); /* ïå÷àòü ïðîáåëîâ âïëîòü äî íà÷àëüíîé ïîçèöèè */
while(count++ <= stop).
putchar(ch); /*ïå÷àòü ñèìâîëà äî êîíå÷íîé ïîçèöèè */
putchar(' \n'); /* çàêîí÷èòü ïå÷àòü ñòðîêè è íà÷àòü íîâóþ */
} /* êîíåö ÷àñòè else */
} /* êîíåö ïðîâåðêè ñîäåðæèìîãî ch */
} /* êîíåö öèêëà while */
} /* êîíåö ïðîãðàììû */
ÐÈÑ. 7. 5. Ïðîãðàììà, ðèñóþùàÿ ñèìâîëàìè.
Ïðîãðàììà âûâåëà íà ýêðàí ñèìâîë  â ïîçèöèÿõ ñ 10 ïî 20, à ñèìâîë Y - ñ 12 ïî 18. Ê ñîæàëåíèþ, ïðè äèàëîãîâîé ðàáîòå ñ ïðîãðàììîé íà ýêðàíå íàøè êîìàíäû ïåðåìåæàþòñÿ âûâîäèìûì ñòðîêàìè. Ãîðàçäî áîëåå óäîáíûì ñïîñîáîì èñïîëüçîâàíèÿ ïðîãðàììû ÿâëÿåòñÿ ñîçäàíèå ôàéëà, ñîäåðæàùåãî ïîäõîäÿùèé íàáîð äàííûõ, à çàòåì ïðèìåíåíèå îïåðàöèè ïåðåêëþ÷åíèÿ äëÿ ââîäà (èç íåãî) ïàðàìåòðîâ â ïðîãðàììó. Ïðåäïîëîæèì, íàïðèìåð, ÷òî â ôàéëå ñ èìåíåì fig ñîäåðæàòñÿ ñëåäóþùèå äàííûå:
- 30 50.
| 30 50.
| 30 50.
| 30 50.
| 30 50.
| 30 50.
= 20 60.
: 31 49.
: 31 49.
: 29 49.
: 27 49.
: 25 49.
: 30 49.
: 30 49.
/ 30 49.
: 35 48.
: 35 48.
Ïîñëå ââîäà êîìàíäû sketcher < fig ðåçóëüòàò ðàáîòû ïðîãðàììû áóäåò âûãëÿäåòü òàê, êàê ïîêàçàíî íà ðèñ. 7.6.
Àíàëèç ïðîãðàììû.
Äëèíà ñòðîêè.
Ñòðóêòóðà ïðîãðàììû.
 íàøåé ïðîãðàììå èìåþòñÿ òðè öèêëà while, îäèí îïåðàòîð if è îäèí îïåðàòîð if-else. Ïîñìîòðèì, ÷òî êàæäûé èç íèõ äåëàåò:
While((ch = getchar()) != EOF).
Çàäà÷åé ïåðâîãî öèêëà while ÿâëÿåòñÿ ââîä íåñêîëüêèõ íàáîðîâ äàííûõ. (Êàæäûé íàáîð äàííûõ ñîñòîèò èç ñèìâîëà è äâóõ öåëûõ ÷èñåë, óêàçûâàþùèõ ãðàíèöû åãî âûâîäà). Ïðîèçâîäÿ âíà÷àëå ÷òåíèå ñèìâîëà, ìû ñìîãëè îáúåäèíèòü â îäíîì âûðàæåíèè åãî ââîä è ïðîâåðêó òîãî, íå ÿâëÿåòñÿ ëè îí ïðèçíàêîì EOF. Åñëè ïðî÷èòàí ñèìâîë EOF, òî ïðîãðàììà îñòàíàâëèâàåòñÿ, íå äåëàÿ ïîïûòêè ââåñòè âåëè÷èíû, ñîîòâåòñòâóþùèå ïåðåìåííûì start è stop.  ïðîòèâíîì ñëó÷àå ïðè ïîìîùè ôóíêöè scanf( ) óêàçàííûì ïåðåìåííûì ïðèñâàèâàþòñÿ ââåäåííûå çíà÷åíèÿ, çàòåì ïðîãðàììà ïåðåõîäèò ê èõ îáðàáîòêå. Ýòèì çàâåðøàåòñÿ âûïîëíåíèå òåëà öèêëà, ïîñëå ÷åãî ââîäèòñÿ íîâûé ñèìâîë, è âåñü ïðîöåññ ïîâòîðÿåòñÿ ñíîâà.
Îáðàòèòå âíèìàíèå, ÷òî äëÿ ÷òåíèÿ äàííûõ ìû èñïîëüçîâàëè äâà îïåðàòîðà, à íå îäèí. Ïî÷åìó íåëüçÿ áûëî âîñïîëüçîâàòüñÿ îäíèì îïåðàòîðîì?
Scanf(" %ñ %D %D", &ch, &start, &stop).
Ïðåäïîëîæèì, ìû ýòî ñäåëàëè. Ðàññìîòðèì, ÷òî ïðîèñõîäèò, êîãäà ïðîãðàììà çàêàí÷èâàåò ÷òåíèå ïîñëåäíåãî íàáîðà äàííûõ èç ôàéëà. Ïåðåä íà÷àëîì âûïîëíåíèÿ î÷åðåäíîãî òåëà öèêëà åäèíñòâåííûì îñòàâøèìñÿ íåïðî÷èòàííûì ýëåìåíòîì ôàéëà áóäåò ïðèçíàê EOF. Ôóíêöèÿ scanf( ) ÷èòàåò óêàçàííûé ñèìâîë è ïðèñâàèâàåò åãî ïåðåìåííîé ch; çàòåì îíà ïûòàåòñÿ ââåñòè çíà÷åíèå äëÿ ïåðåìåííîé start, íî â ôàéëå íå îñòàëîñü äàííûõ, êîòîðûå íå áûëè áû óæå ïðî÷èòàíû! Êîìïüþòåð âûñêàæåò ñâîå íåäîâîëüñòâî, è âàøà ïðîãðàììà ïðåêðàòèò ðàáîòó. Îòäåëÿÿ ÷òåíèå ñèìâîëà îò ââîäà îñòàëüíûõ äàííûõ, ìû ïîçâîëÿåì êîìïüþòåðó îáíàðóæèòü ïîÿâëåíèå ïðèçíàêà EOF ïåðåä î÷åðåäíîé ïîïûòêîé ïðî÷åñòü îñòàâøèåñÿ äàííûå.
If (ch != '\n').
Öåëü ââåäåíèÿ â ïðîãðàììó ïåðâîãî îïåðàòîðà if ñîñòîèò â òîì, ÷òîáû óïðîñòèòü ÷òåíèå äàííûõ. Ìû îáúÿñíèì, êàê îí ðàáîòàåò â ñëåäóþùåì ðàçäåëå.
If(start > stop || start < 1 || stop > MAXLENGTH) printf(" Ââåäåíû íåïðàâèëüíûå ãðàíè÷íûå çíà÷åíèÿ \n");else.
Öåëü ïðèìåíåíèÿ îïåðàòîðà if-else ñîñòîèò â òîì, ÷òîáû èçáåæàòü èñïîëüçîâàíèÿ â ïðîãðàììå òàêèõ çíà÷åíèè ïåðåìåííûõ start è stop, êîòîðûå ìîãóò ïðèâåñòè ê íåæåëàòåëüíûì ïîñëåäñòâèÿì. Ýòîò âîïðîñ ìû òàêæå îáñóäèì íèæå. Îáðàòèòå, îäíàêî, âíèìàíèå íà òî, êàê ìû èñïîëüçîâàëè ëîãè÷åñêèå îïåðàöèè è îïåðàöèè îòíîøåíèÿ, ÷òîáû îáíàðóæèòü ïîÿâëåíèå ëþáîãî èç òðåõ "îïàñíûõ" çíà÷åíèé.

Îñíîâíàÿ ÷àñòü ïðîãðàììû ïðåäñòàâëÿåò ñîáîé ñîñòàâíîé îïåðàòîð, êîòîðûé ñëåäóåò çà êëþ÷åâûì ñëîâîì else.
Count = 0;
Âíà÷àëå ñ÷åò÷èê count óñòàíàâëèâàåòñÿ íà íóëü.
While(++count < start) putchar(' ');
Çàòåì â öèêëå while íà÷èíàåòñÿ âûâîä íà ïå÷àòü ïðîáåëîâ âïëîòü äî ïîçèöèè, îïðåäåëÿåìîé çíà÷åíèåì ïåðåìåííîé start. Åñëè çíà÷åíèå start, ñêàæåì, ðàâíî 10, òî ïå÷àòàåòñÿ äåâÿòü ïðîáåëîâ. Ïîýòîìó âûâîä ñèìâîëîâ íà ïå÷àòü íà÷íåòñÿ ñ 10-é ïîçèöèè. Îáðàòèòå âíèìàíèå, êàê èñïîëüçîâàíèå ïðåôèêñíîé ôîðìû îïåðàöèè óâåëè÷åíèÿ âìåñòå ñ îïåðàöèåé < ïîçâîëÿåò äîáèòüñÿ óêàçàííîãî ýôôåêòà. Åñëè áû âìåñòî ýòîãî ìû èñïîëüçîâàëè âûðàæåíèå count++ < start, òî ñðàâíåíèå ïðîâîäèëîñü áû ïåðåä óâåëè÷åíèåì çíà÷åíèÿ count, è â ðåçóëüòàòå ìîã áûòü íàïå÷àòàí îäèí äîïîëíèòåëüíûé ïðîáåë.
While(count++ <= stop) putchar(ch);
Âòîðîé öèêë while â âûøåóïîìÿíóòîì áëîêå îñóùåñòâëÿåò çàäà÷ó âûâîäà íà ïå÷àòü ñèìâîëà, íà÷èíàÿ ñ ïîçèöèè, çàäàâàåìîé ïåðåìåííîé start, è êîí÷àÿ ïîçèöèåé, çàäàâàåìîé ïåðåìåííîé stop. Íà ýòîò ðàç ìû âîñïîëüçîâàëèñü ïîñòôèêñíîé ôîðìîé îïåðàöèè óâåëè÷åíèÿ è îïåðàöèåé <=. Òàêàÿ êîìáèíàöèÿ îáåñïå÷èâàåò æåëàåìûé ðåçóëüòàò ïðè âûâîäå íà ïå÷àòü ñèìâîëà - âåðõíÿÿ ãðàíè÷íàÿ ïîçèöèÿ âõîäèò â ïîëå ïå÷àòè. Äëÿ ïðîâåðêè ýòîãî ôàêòà âû ìîæåòå âîñïîëüçîâàòüñÿ ëîãèêîé èëè ìåòîäîì ïðîá è îøèáîê.
Putchar(' \n');
Îïåðàòîð putchar('\n') èñïîëüçóåòñÿ äëÿ çàâåðøåíèÿ ïå÷àòè äàííîé ñòðîêè è ïåðåõîäà íà íîâóþ.
Ôîðìà äàííûõ.
Ïðè íàïèñàíèè ïðîãðàììû íåîáõîäèìî ïîíèìàòü, êàê îíà áóäåò âçàèìîäåéñòâîâàòü ñ âõîäíûìè äàííûìè. Ñåé÷àñ ìû îáðàòèìñÿ ê ýòîìó âîïðîñó.
Ââîäèìûå äàííûå äîëæíû áûòü ïðåäñòàâëåíû â ôîðìå, ñîâìåñòèìîé ñ òðåáîâàíèÿìè, êîòîðûå íàëàãàþòñÿ ôóíêöèÿìè ââîäà, èñïîëüçóåìûìè â ïðîãðàììå. Ïîýòîìó âñÿ òÿæåñòü ïðèâåäåíèÿ äàííûõ ê ïðàâèëüíîé ôîðìå ëîæèòñÿ íà ïîëüçîâàòåëÿ. Â áîëåå ñëîæíûõ ïðîãðàììàõ îñíîâíîé îáúåì ðàáîòû ïî òàêîìó ïðåîáðàçîâàíèþ ïåðåíîñèòñÿ íà ñàìó ïðîãðàììó. Íàèëó÷øåé ôîðìîé ïðåäñòàâëåíèÿ ââîäèìûõ äàííûõ ÿâëÿåòñÿ ñëåäóþùàÿ:
Í 10 40.
I 9 41.
Ãäå çà ñèìâîëîì ñëåäóþò íîìåðà íà÷àëüíîé è êîíå÷íîé ïîçèöèè. Íî íàøà ïðîãðàììà äîïóñêàåò òàêæå è òàêóþ ôîðìó äàííûõ:
Í.
10.
40.
I.
9.
41.
È òàêóþ.
H10 40I 9 41.
Íî íå.
Í 10 40 I 9 41.
Ïî÷åìó íàëè÷èå îäíèõ ïðîáåëîâ ÿâëÿåòñÿ íåîáÿçàòåëüíûì, à äðóãèõ - îáÿçàòåëüíûì? Ïî÷åìó ñèìâîë "íîâàÿ ñòðîêà" ìîæåò áûòü ïîìåùåí ìåæäó ïîñëåäíèì öåëûì ÷èñëîì èç îäíîãî íàáîðà äàííûõ è ïåðâûì ñèìâîëîì èç ñëåäóþùåãî íàáîðà, à ïðîáåë íåò?
Ýòè âîïðîñû ïîäíèìàþò ïðîáëåìû, êàñàþùèåñÿ íå òîëüêî äàííîé ïðîãðàììû. Ðàññìîòðèì ðàáîòó ôóíêöèé getchar() è putchar( ) è íàéäåì îòâåòû íà íèõ.
Ôóíêöèÿ getchar( ) ÷èòàåò ïåðâûé âñòðåòèâøèéñÿ ñèìâîë íåçàâèñèìî îò òîãî, ÿâëÿåòñÿ ëè îí àëôàâèòíûì ñèìâîëîì, ïðîáåëîì, ñèìâîëîì "íîâàÿ ñòðîêà" èëè åùå ÷åì-íèáóäü. Ôóíêöèÿ scanf() äåëàåò òî æå ñàìîå, åñëè ÷òåíèå ïðîèçâîäèòñÿ â ôîðìàòå %ñ (ñèìâîë). Íî, êîãäà scanf( ) îñóùåñòâëÿåò ââîä äàííûõ â ôîðìàòå %d (öåëûå), ïðîáåëû è ñèìâîëû "íîâàÿ ñòðîêà" ïðîïóñêàþòñÿ. Ïîýòîìó ñèìâîëû "íîâàÿ ñòðîêà" èëè ëþáûå ïðîáåëû ìåæäó ñèìâîëîì, ñ÷èòûâàåìûì ôóíêöèåé getchar( ), è ñëåäóþùèì öåëûì ÷èñëîì, ñ÷èòûâàåìûì ôóíêöèåé scanf( ), èãíîðèðóþòñÿ. Ôóíêöèÿ scanf( ) ÷èòàåò öèôðû äî òåõ ïîð, ïîêà íå âñòðåòèò íåöèôðîâîé ñèìâîë - ïðîáåë, ñèìâîë "íîâàÿ ñòðîêà" èëè áóêâó.
Ñëåäîâàòåëüíî, ìåæäó ïåðâûì è âòîðûì öåëûìè ÷èñëàìè íåîáõîäèìî ïîìåùàòü ïðîáåë èëè ñèìâîë "íîâàÿ ñòðîêà", ÷òîáû ôóíêöèÿ scanf( ) ìîãëà ðàñïîçíàòü ãäå êîí÷àåòñÿ îäíî è íà÷èíàåòñÿ äðóãîå. Ýòèì îáúÿñíÿåòñÿ, ïî÷åìó ìåæäó ñèìâîëîì è ñëåäóþùèì öåëûì ÷èñëîì ìîæåò ñòîÿòü ïðîáåë èëè ñèìâîë "íîâàÿ ñòðîêà", è ïî÷åìó ìåæäó äâóìÿ öåëûìè ÷èñëàìè îáÿçàòåëüíî äîëæåí áûòü ðàçäåëèòåëü òàêîãî âèäà. Íî ïî÷åìó ìåæäó öåëûì ÷èñëîì, ñòîÿùèì â êîíöå íàáîðà äàííûõ, è ñëåäóþùèì ñèìâîëîì íå ìîæåò áûòü ïðîáåë? Ïîòîìó ÷òî â ñëåäóþùèé ðàç íà î÷åðåäíîì øàãå âûïîëíåíèÿ öèêëà while ôóíêöèÿ getchar( ) îñóùåñòâëÿåò ââîä ñèìâîëà èç òîé ïîçèöèè, ãäå "îñòàíîâèëàñü" ôóíêöèÿ scanf( ). Ïîýòîìó îíà ïðî÷òåò ëþáîé ñëåäóþùèé ñèìâîë, ñòîÿùèé ïîñëå öåëîãî ÷èñëà, - ïðîáåë, ñèìâîë "íîâàÿ ñòðîêà" è ò. ï. Åñëè áû ìû ñëåäîâàëè òðåáîâàíèÿì ôóíêöèè getchar( ), ñòðóêòóðó äàííûõ íåîáõîäèìî áûëî áû îðãàíèçîâàòü òàê:
W10 50a20 60ó10 30.
Ãäå ìåæäó ïîñëåäíèì öåëûì ÷èñëîì, ñòîÿùèì â êîíöå ãðóïïû, è ñëåäóþùèì ñèìâîëîì ðàçäåëèòåëü îòñóòñòâóåò. Íî òàêàÿ ñòðóêòóðà âûãëÿäèò íåóêëþæå, ïîñêîëüêó ÷èñëî 50 ïðè ýòîì âûãëÿäèò òàê, êàê áóäòî îíî ïîìåùåíî â îäíó ãðóïïó ñ à, à íå ñ w. Ïîýòîìó ââåäåí îïåðàòîð.
If(ch != '\n').
×òîáû èìåòü âîçìîæíîñòü îáíàðóæèòü, êîãäà çíà÷åíèå ch ðàâíî ñèìâîëó "íîâàÿ ñòðîêà". Âìåñòî ýòîãî ìîæíî èñïîëüçîâàòü äàííûå, ââîäèìûå â âèäå.
W 10 50 à20 60 ó10 30.
Ãäå ìåæäó ÷èñëîì 50 è à ïîìåùåí ñèìâîë "íîâàÿ ñòðîêà". Ïðîãðàììà ÷èòàåò ýòîò ñèìâîë, èãíîðèðóåò åãî è çàòåì ïåðåõîäèò ê ÷òåíèþ ñëåäóþùåãî ñèìâîëà.
Êîíòðîëü îøèáîê.
Ñóùåñòâóåò øèðîêî ðàñïðîñòðàíåííàÿ ïðîáëåìà, ñâÿçàííàÿ ñ ââîäîì â ìàøèíó äàííûõ, êîòîðûå äîëæíû èñïîëüçîâàòüñÿ îïðåäåëåííûì îáðàçîì. Îäèí èç ìåòîäîâ åå ðåøåíèÿ ñîñòîèò â "êîíòðîëå îøèáîê". Ýòî îçíà÷àåò, ÷òî, ïåðåä òåì êàê ïðèñòóïèòü ê îáðàáîòêå äàííûõ, ïðîãðàììà äîëæíà ïðîâåðèòü èõ ïðàâèëüíîñòü.  íàøåé ïðîãðàììå ìû ñäåëàëè ïåðâóþ ïîïûòêó îñóùåñòâèòü òàêîé êîíòðîëü îøèáîê ñ ïîìîùüþ îïåðàòîðîâ:
If(start > stop || start < 1 || stop > MAXLENGTH).
printf(" Ââåäåíû íåïðàâèëüíûå ãðàíè÷íûå çíà÷åíèÿ. \n");
Îíè âõîäÿò â ñòðóêòóðó if-else, êîòîðàÿ îïðåäåëÿåò, ÷òî îñíîâíàÿ ÷àñòü ïðîãðàììû áóäåò âûïîëíÿòüñÿ òîëüêî â òîì ñëó÷àå, åñëè íè îäèí èç òðåõ if-òåñòîâ íå îêàæåòñÿ èñòèííûì.
Ñ êàêîé öåëüþ ìû ïðèíèìàåì âñå ýòè ìåðû ïðåäîñòîðîæíîñòè? Âî-ïåðâûõ, ñîâåðøåííî íåïðàâèëüíî ðàçìåùàòü íà÷àëüíóþ ïîçèöèþ ïîñëå êîíå÷íîé, ïîñêîëüêó îáû÷íî íà òåðìèíàë äàííûå âûâîäÿòñÿ ñëåâà íàïðàâî, à íå íàîáîðîò. Ïîýòîìó ñ ïîìîùüþ âûðàæåíèÿ start > stop ïðîâåðÿåòñÿ íàëè÷èå òàêîé ïîòåíöèàëüíîé îøèáêè. Âî-âòîðûõ, ïðè âûâîäå íà ýêðàí ïåðâûé ñòîëáåö èìååò íîìåð 1; ìû íå ìîæåì âûâîäèòü äàííûå ëåâåå ëåâîãî êðàÿ. Âûðàæåíèå start < 1 ñëóæèò ñðåäñòâîì îáíàðóæåíèÿ òàêîé îøèáêè. È íàêîíåö ñ ïîìîùüþ âûðàæåíèÿ stop > MAXLENGTH ïðîâåðÿåòñÿ, íå ïûòàåìñÿ ëè ìû âûâåñòè íà ïå÷àòü äàííûå ïðàâåå ïðàâîãî êðàÿ.
Ñóùåñòâóþò ëè åùå êàêèå-íèáóäü îøèáî÷íûå çíà÷åíèÿ, êîòîðûå ìû ìîæåì ïðèñâîèòü ïåðåìåííûì start è stop? Ìîæíî áûëî áû, êîíå÷íî, ïîïðîáîâàòü ïðèñâîèòü ïåðåìåííîé start çíà÷åíèå áîëüøå ÷åì MAXLENGTH. Ìîæåò ëè ýòîò âàðèàíò óñïåøíî ïðîéòè òåñò? Íåò, õîòÿ íàëè÷èå ïîäîáíîé îøèáêè ìû è íå ïðîâåðÿåì íåïîñðåäñòâåííî.
Ïðåäïîëîæèì, ÷òî âåëè÷èíà start áîëüøå êîíñòàíòû MAXLENGTH. Òîãäà ëèáî çíà÷åíèå stop òîæå ïðåâûøàåò âåëè÷èíó MAXLENGTH, ÷òî îáÿçàòåëüíî ïðèâåäåò ê îáíàðóæåíèþ îøèáêè, ëèáî stop îêàæåòñÿ ìåíüøåé èëè ðàâíîé MAXLENGTH. Òîãäà åå çíà÷åíèå äîëæíî áûòü ìåíüøå âåëè÷èíû start, ÷òî ïðèâåäåò ê îáíàðóæåíèþ ýòîé îøèáêè ïåðâûì òåñòîì. Äðóãàÿ âåðîÿòíî îøèáêà ìîæåò ñîñòîÿòü â òîì, ÷òî çíà÷åíèå stop îêàæåòñÿ ëåâåå 1. Ìû îñòàâëÿåì ÷èòàòåëÿì â êà÷åñòâå ñàìîñòîÿòåëüíîãî óïðàæíåíèÿ ïðîâåðêó òîãî, ÷òî äàííàÿ îøèáêà òàêæå íå îñòàíåòñÿ íå çàìå÷åííîé.
 íàøåé ïðîãðàììå êîíòðîëü îøèáîê âûãëÿäèò âåñüìà ïðîñòûì. Åñëè âû ïðîåêòèðóåòå ïðîãðàììó äëÿ ñåðüåçíûõ öåëåé, âû äîëæíû îáðàòèòü íà ýòîò áîëüøå âíèìàíèÿ, ÷åì ìû. Íàïðèìåð, âûâîäèìûå ñîîáùåíèÿ îá îøèáêàõ ìîãëè áû óêàçûâàòü êàêèå âåëè÷èíû íåâåðíû è ïî÷åìó; êðîìå òîãî, âû ìîãëè áû ïðèáàâèòü â ñîîáùåíèÿ ÷òî-òî îò ñåáÿ è ïðèäàòü èì áîëüøóþ ýìîöèîíàëüíóþ îêðàñêó.
Ïðèâåäåì íåñêîëüêî ïðèìåðîâ:
Óêàçàíîå âàìè çíà÷åíèå stop - 897654 ïðåâûøàåò øèðèíó ýêðàíà.
Âîò ýòî äà! Ó âàñ START áîëüøå, ÷åì STOP.
Ïîïðîáóéòå, ïîæàëóéñòà, åùå ðàç.
ÂÅËÈ×ÈÍÀ START ÄÎËÆÍÀ ÁÛÒÜ ÁÎËÜØÅ 0, ÈÍÄÞÊ.
ÎÏÅÐÀÖÈß ÓÑËÎÂÈß: ?:
 ÿçûêå Ñè èìååòñÿ êîðîòêèé ñïîñîá çàïèñè îäíîãî èç âèäîâ îïåðàòîðà if-else. Îí íàçûâàåòñÿ "óñëîâíûì âûðàæåíèåì" è èñïîëüçóåò îïåðàöèþ óñëîâèÿ - ?:. Ýòà îïåðàöèÿ ñîñòîèò èç äâóõ ÷àñòåé è ñîäåðæèò òðè îïåðàíäà. Íèæå ïðèâîäèòñÿ ïðèìåð îïåðàòîðà ñ ïîìîùüþ êîòîðîãî íàõîäèòñÿ àáñîëþòíîå çíà÷åíèå ÷èñëà:
X = (y < 0 )? -y : y;
Âñå, ÷òî íàõîäèòñÿ ìåæäó çíàêîì = è ñèìâîëîì "òî÷êà ñ çàíÿòîé" ïðåäñòàâëÿåò ñîáîé óñëîâíîå âûðàæåíèå. Ñìûñë ýòîãî îïåðàòîðà çàêëþ÷àåòñÿ â ñëåäóþùåì: åñëè ó ìåíüøå 0, òî õ = - ó; â ïðîòèâíîì ñëó÷àå õ = ó.  òåðìèíàõ îïåðàòîðà if-else äàííûé îïåðàòîð ìîã âûãëÿäåòü òàê:
If(ó < 0) x = (y < 0 )? -y : y;
õ = -ó;
Else.
õ = ó;
 îáùåì âèäå óñëîâíîå âûðàæåíèå ìîæíî çàïèñàòü ñëåäóþùèì îáðàçîì:
Âûðàæåíèå1 ? âûðàæåíèå2 : âûðàæåíèå3.
Åñëè âûðàæåíèå1 èñòèííî (áîëüøå íóëÿ), òî çíà÷åíèåì âñåãî óñëîâíîãî âûðàæåíèÿ ÿâëÿåòñÿ âåëè÷èíà âûðàæåíèÿ2;
Åñëè âûðàæåíèå1 ëîæíî (ðàâíî 0), òî çíà÷åíèå âñåãî óñëîâíîãî âûðàæåíèÿ - âåëè÷èíà âûðàæåíèÿ3.
Óñëîâíîå âûðàæåíèå óäîáíî èñïîëüçîâàòü â òåõ ñëó÷àÿõ, êîãäà èìååòñÿ íåêîòîðàÿ ïåðåìåííàÿ, êîòîðîé ìîæíî ïðèñâîèòü îäíî èç äâóõ âîçìîæíûõ çíà÷åíèé. Òèïè÷íûì ïðèìåðîì ÿâëÿåòñÿ ïðèñâàèâàíèå ïåðåìåííîé çíà÷åíèÿ áîëüøåé èç äâóõ âåëè÷èí:
Màõ = (à > b)? à : b;
Âîîáùå ãîâîðÿ, èñïîëüçîâàíèå óñëîâíûõ âûðàæåíèé íå ÿâëÿåòñÿ îáÿçàòåëüíûì, ïîñêîëüêó òåõ æå ðåçóëüòàòîâ ìîæíî äîñòè÷ü ïðè ïîìîùè îïåðàòîðîâ if-else. Îäíàêî óñëîâíûå âûðàæåíèÿ áîëåå êîìïàêòíû, è èõ ïðèìåíåíèå îáû÷íî ïðèâîäèò ê ïîëó÷åíèþ áîëåå êîìïàêòíîãî ìàøèííîãî êîäà.
Ðåçþìå: îïåðàöèÿ óñëîâèÿ.
I. Îïåðàöèÿ óñëîâèÿ: ?:
 ýòîé îïåðàöèè èìåþòñÿ òðè îïåðàíäà, êàæäûé èç êîòîðûõ ÿâëÿåòñÿ âûðàæåíèåì, ïðè÷åì âñÿ çàïèñü âûãëÿäèò ñëåäóþùèì îáðàçîì:
Âûðàæåíèå1 ? âûðàæåíèå2 : âûðàæåíèå3.
Çíà÷åíèå âñåãî âûðàæåíèÿ ðàâíî âåëè÷èíå âûðàæåíèÿ2, åñëè âûðàæåíèå1 èñòèííî, è âåëè÷èíå âûðàæåíèÿ3 â ïðîòèâíîì ñëó÷àå.
II. ÏÐÈÌÅÐÛ:
Âûðàæåíèå: (5 > 3) ? 1 : 2 èìååò çíà÷åíèå 1.
Âûðàæåíèå: (3 > 5) ? 1 : 2 èìååò çíà÷åíèå 2.
Âûðàæåíèå: (à > b) ? a : b èìååò çíà÷åíèå áîëüøåé èç âåëè÷èí à è b.
ÌÍÎÆÅÑÒÂÅÍÍÛÉ ÂÛÁÎÐ: ÎÏÅÐÀÒÎÐÛ switch È break.
Îïåðàöèÿ óñëîâèÿ è êîíñòðóêöèÿ if-else îáëåã÷àþò íàïèñàíèå ïðîãðàìì, â êîòîðûõ îñóùåñòâëÿåòñÿ âûáîð ìåæäó äâóìÿ âàðèàíòàìè. Îäíàêî èíîãäà â ïðîãðàììå íåîáõîäèìî ïðîèçâåñòè âûáîð îäíîãî èç íåñêîëüêèõ âàðèàíòîâ. Ìû ìîæåì ñäåëàòü ýòî èñïîëüçóÿ êîíñòðóêöèþ if-else if - ... - else, íî âî ìíîãèõ ñëó÷àÿõ îêàçûâàåòñÿ áîëåå óäîáíûì èñïîëüçîâàòü îïåðàòîð switch. Íèæå ïðèâîäèòñÿ ïðèìåð, èëëþñòðèðóþùèé åãî ðàáîòó. Ïðîãðàììà ÷èòàåò ñ òåðìèíàëà áóêâó, çàòåì âûâîäèò íà ïå÷àòü íàçâàíèå æèâîòíîãî íà÷èíåþùååñÿ ñ ýòîé áóêâû.
/*æèâîòíûå*/
Main( ).
{
char ch;
Printf("Ââåäèòå áóêâó àëôàâèòà, à ÿ óêàæó");
Printf("íàçâàíèå æèâîòíîãî, \n íà÷èíàþùååñÿ ñ íåå.\n");
Printf("Ââåäèòå, ïîæàëóéñòà, áóêâó; äëÿ çàâåðøåíèÿ ðàáîòû ââåäèòå #. \n");
While((ch = getchar())!= '#').
{
if(ch != '\n') /* ïðîïóñê ñèìâîëà "íîâàÿ ñòðîêà" */
{ if(ch >= 'a' && ch <= 'ÿ') /*ðàçðåøåíû òîëüêî ñòðî÷íûå áóêâû */
switch (ch).
{ case 'a' : printf(" àðãàëè, äèêèé ãîðíûé àçèàòñêèé áàðàí\n");
break;
case 'á' : printf(" áàáèðóññà, äèêàÿ ìàëàéñêàÿ ñâèíüÿ \n");
break;
case 'â' : printf(" âûõóõîëü, âîäîïëàâàþùèé êðîò \n");
break;
case 'ã' : printf(" ãèááîí, äëèííîðóêàÿ îáåçüÿíà \n");
break;
case 'ä' : printf(" äàìàíäðåâåñíûé\n");
break;
default: printf(" Ýòî òðóäíàÿ çàäà÷à!\n");
break;
} else.
printf(" ß ðàñïîçíàþ òîëüêî ñòðî÷íûå áóêâû. \n");
printf(" Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #.\n");
} /* êîíåö if, ïðîïóñêàþùåãî ñèìâîë "íîâàÿ ñòðîêà" */
} /* êîíåö öèêëà while */
}
ÐÈÑ. 7.7. Ïðîãðàììà, ïå÷àòàþùàÿ íàçâàíèÿ æèâîòíûõ.
Íàì ñòàëî ñêó÷íî ïðîäîëæàòü, è ìû îñòàíîâèëèñü íà áóêâå ä. Äàâàéòå òåïåðü ðàññìîòðèì îäèí ïðèìåð âûïîëíåíèÿ ïðîãðàììû ïåðåä òåì, êàê îáñóäèòü èñïîëüçîâàííûå â íåé íîâûå ñðåäñòâà ÿçûêà.
Ââåäèòå áóêâó àëôàâèòà, à ÿ óêàæó íàçâàíèå æèâîòíîãî, íà÷èíàþùååñÿ ñ íåå.
Ââåäèòå, ïîæàëóéñòà, áóêâó; äëÿ çàâåðøåíèÿ ðàáîòû ââåäèòå #.
à [âîçâðàò].
Àðãàëè, äèêèé ãîðíûé àçèàòñêèé áàðàí Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #. ã.
[âîçâðàò].
Ãèááîí, äëèííîðóêàÿ îáåçüÿíà Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #. ð.
[âîçâðàò].
Ýòî òðóäíàÿ çàäà÷à!
Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #. Ò.
[âîçâðàò].
ß ðàñïîçíàþ òîëüêî ñòðî÷íûå áóêâû. Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #. #
[âîçâðàò].
Ýòîò ïðèìåð ñëóæèò èëëþñòðàöèåé ðàáîòû îïåðàòîðà swith. Âíà÷àëå âû÷èñëÿåòñÿ âûðàæåíèå â ñêîáêàõ, ðàñïîëîæåííîå çà êëþ÷åâûì ñëîâîì switch.  äàííîì ñëó÷àå çíà÷åíèåì ýòîãî âûðàæåíèÿ áóäåò ñèìâîë, ïðèñâîåííûé ïåðåìåííîé ch, êîòîðûé ìû ââåëè ïåðåä ýòèì. Çàòåì ïðîãðàììà ïðîñìàòðèâàåò ñïèñîê "ìåòîê" (â ýòîì ïðèìåðå case 'a':, ñàså'á': è ò. ä.) äî òåõ ïîð, ïîêà íå íàõîäèò "ìåòêó", êîòîðàÿ ñîîòâåòñòâóåò äàííîìó çíà÷åíèþ. Äàëåå ïðîãðàììà ïåðåõîäèò ê âûïîëíåíèþ îïåðàòîðà, ðàñïîëîæåííîãî â ýòîé ñòðîêå. ×òî ïðîèçîéäåò â ñëó÷àå, êîãäà òàêîé ïîäõîäÿùåé ñòðîêè íå íàéäåòñÿ? Åñëè ñóùåñòâóåò ñòðîêà ñ "ìåòêîé" case default:, òî áóäåò âûïîëíÿòüñÿ îïåðàòîð, ïîìå÷åííûé ýòîé ìåòêîé.  ïðîòèâíîì ñëó÷àå ïðîèçîéäåò ïåðåõîä ê îïåðàòîðó, ðàñïîëîæåííîìó çà îïåðàòîðîì switch.
×òî ìîæíî ñêàçàòü ïî ïîâîäó îïåðàòîðà break? Åãî âûïîëíåíèå ïðèâîäèò ê òîìó, ÷òî â ïðîãðàììå ïðîèñõîäèò âûõîä èç îïåðàòîðà switch è îñóùåñòâëÿåòñÿ ïåðåõîä ê ñëåäóþùåìó çà íèì îïåðàòîðó (ñì. ðèñ. 7.8). Ïðè îòñóòñòâèè îïåðàòîðà break áóäóò âûïîëíåíû âñå îïåðàòîðû, íà÷èíàÿ ñ ïîìå÷åííîãî äàííîé ìåòêîé è çàâåðøàÿ îïåðàòîðîì switch. Åñëè óäàëèòü âñå îïåðàòîðû break èç íàøåé ïðîãðàììû, òî, óêàçàâ, íàïðèìåð, áóêâó ã, ïîëó÷èì ñëåäóþùèé äèàëîã:
Ââåäèòå áóêâó àëôàâèòà, à ÿ óêàæó íàçâàíèå æèâîòíîãî, íà÷èíàþùååñÿ ñ íåå.
Ââåäèòå, ïîæàëóéñòà, áóêâó; äëÿ çàâåðøåíèÿ ðàáîòû ââåäèòå #.
à [âîçâðàò].
Ãèááîí, äëèííîðóêàÿ îáåçüÿíà.
Äàìàí äðåâåñíûé.
Ýòî òðóäíàÿ çàäà÷à.
Ââåäèòå, ïîæàëóéñòà, ñëåäóþùóþ áóêâó èëè #.
# [âîçâðàò].
Ìû âèäèì, ÷òî âûïîëíèëèñü âñå îïåðàòîðû, íà÷èíàÿ îò ìåòêè case 'ã' è êîí÷àÿ îïåðàòîðîì switch. Åñëè âû çíàêîìû ñ ÿçûêîì Ïàñêàëü, òî ìîæåòå çàìåòèòü, ÷òî îïåðàòîð switch â Ñè ïîõîæ íà îïåðàòîð case â Ïàñêàëå. Âàæíåéøåå îòëè÷èå ñîñòîèò â òîì, ÷òî åñëè âû õîòèòå, ÷òîáû â êàæäîì êîíêðåòíîì ñëó÷àå âûïîëíÿëñÿ òîëüêî ïîìå÷åííûé îïåðàòîð, òî â îïåðàòîðå switch íåîáõîäèìî èñïîëüçîâàòü îïåðàòîðû break.
Ìåòêè, èìåþùèåñÿ â îïåðàòîðå switch, äîëæíû áûòü êîíñòàíòàìè èëè êîíñòàíòíûìè âûðàæåíèÿìè (âûðàæåíèÿ, îïåðàíäû êîòîðîãî êîíñòàíòû) öåëîãî òèïà (âêëþ÷àÿ òèï char). Çàïðåùàåòñÿ èñïîëüçîâàòü â êà÷åñòâå ìåòêè ïåðåìåííóþ. Çíà÷åíèåì âûðàæåíèÿ â ñêîáêàõ äîëæíà áûòü âåëè÷èíà öåëîãî òèïà (îïÿòü æå, âêëþ÷àÿ òèï char). Íèæå ïðèâîäèòñÿ îáùàÿ ñòðóêòóðà îïåðàòîðà switch:
Switch(öåëîå âûðàæåíèå).
{ case êîíñòàíòà1 : îïåðàòîðû; (íåîáÿçàòåëüíûå).
case êîíñòàíòà2 : îïåðàòîðû; (íåîáÿçàòåëüíûå).
case default (íåîáÿçàòåëüíûå) : îïåðàòîðû; (íåîáÿçàòåëüíûå).
}
switch (number).
{
case 1: îïåðàòîð1;
break;
case 2: îïåðàòîð 2;
break;
ñàçå 3: îïåðàòîð 3;
break;
default:îïåðàòîð4;
}
Îïåðàòîð5;
switch (number) {
Case 1: îïåðàòîð 1;
Case 2: îïåðàòîð 2;
Case 3: îïåðàòîð 3;
Defauit: îïåðàòîð 4;
}
Îïåðàòîð 5;
 îáîèõ ñëó÷àÿõ çíà÷åíèå number ðàâíî 2.
ÐÈÑ. 7.8. Õîä âûïîëíåíèÿ ïðîãðàììû, èñïîëüçóþùåé îïåðàòîð switch ïðè íàëè÷èè èëè â îòñóòñòâèè îïåðàòîðîâ break
Êîãäà ìû õîòèì ïîëó÷èòü îäèíàêîâûé ðåçóëüòàò ïðè ïåðåõîäå ê ðàçíûì ìåòêàì, ìû ìîæåì èñïîëüçîâàòü ìåòêè áåç îïåðàòîðîâ. Íàïðèìåð, ôðàãìåíò ïðîãðàììû.
Case 'E':
Case 'e':
printf(" åõèäíà, ìóðàâüåä êîëþ÷èé \n" );
break;
Ñâèäåòåëüñòâóåò î òîì, ÷òî óêàçàíèå áóêâ Å èëè å ïðèâîäèò ê ïå÷àòè íàçâàíèÿ "åõèäíà". Åñëè áóäåò ââåäåíà áóêâà Å, òî ïðîèçîéäåò ïåðåõîä ê ñîîòâåòñòâóþùåé ìåòêå, íî, ïîñêîëüêó òàì îïåðàòîðû îòñóòñòâóþò, áóäóò âûïîëíÿòüñÿ îïåðàòîðû, ðàñïîëîæåííûå íèæå, ïîêà íå âñòðåòèòñÿ îïåðàòîð break.
Íàøà ïðîãðàììà èìååò äâå íåáîëüøèå îñîáåííîñòè, î êîòîðûõ ìû õîòåëè áû óïîìÿíóòü.
Ïåðâàÿ ïîñêîëüêó ìû ñîáèðàåìñÿ èñïîëüçîâàòü ïðîãðàììó â äèàëîãîâîì ðåæèìå, ìû ðåøèëè âîñïîëüçîâàòüñÿ ñèìâîëîì # âìåñòî EOF â êà÷åñòâå ïðèçíàêà ïðåêðàùåíèÿ åå ðàáîòû.  ðàáîòå êîìïüþòåðà ìîãëè áû âîçíèêíóòü ñëîæíîñòè, åñëè áû îí ïðåäëîæèë íàì ââåñòè ïðèçíàê EOF èëè äàæå êàêîé-íèáóäü óïðàâëÿþùèé ñèìâîë, ìåæäó òåì êàê ñèìâîë # âïîëíå ïîäõîäèò äëÿ ýòîé öåëè. Ïîñêîëüêó òåïåðü îòñóòñòâóåò íåîáõîäèìîñòü ÷òåíèÿ ñèìâîëà EOF, ìû íå äîëæíû îïèñûâàòü â ïðîãðàììå ïåðåìåííóþ ch òèïà int.
Âòîðàÿ ìû èñïîëüçîâàëè îïåðàòîð if, êîòîðûé ïîçâîëÿåò èãíîðèðîâàòü ñèìâîëû "íîâàÿ ñòðîêà" ïðè ââîäå ñèìâîëîâ â ïðîãðàììó. Ýòî òîæå íåêîòîðàÿ ïëàòà çà âîçìîæíîñòü äèàëîãîâîé ðàáîòû. Áåç ýòîãî îïåðàòîðà if êàæäûé ðàç ïðè íàæàòèè êëàâèøè [âîçâðàò] ïðîãðàììå ïðèøëîñü áû ðàññìàòðèâàòü äàííûé ïðèçíàê êàê ïðî÷èòàííûé ñèìâîë.
Êîãäà òðåáóåòñÿ èñïîëüçîâàòü îïåðàòîð switch, à êîãäà êîíñòðóêöèþ else-if? ×àñòî ó íàñ íåò âîçìîæíîñòè âûáîðà. Âû íå ìîæåòå ïðèìåíèòü îïåðàòîð switch, êîãäà âûáîð âàðèàíòîâ îñíîâûâàåòñÿ íà âû÷èñëåíèè çíà÷åíèÿ ïåðåìåííîé èëè âûðàæåíèÿ òèïà int. Óäîáíîãî ñïîñîáà âîñïîëüçîâàòüñÿ îïåðàòîðîì switch â ñëó÷àå êîãäà âîçìîæíûå çíà÷åíèÿ ïåðåìåííîé ïîïàäàþò â íåêîòîðûé äèàïàçîí, òàêæå íå ñóùåñòâóåò. Ïðîùå íàïèñàòü, íàïðèìåð, òàê:
If(integer < 1000 && integer > 2).
 òî âðåìÿ êàê çàìåíà ýòîé ñòðîêè îïåðàòîðîì switch ïðèâåäåò ê íåîáõîäèìîñòè ââåñòè â ïðîãðàììó ìåòêè äëÿ âñåõ öåëûõ ÷èñåë îò 2 äî 999. Òåì íå ìåíåå, åñëè ó âàñ åñòü âîçìîæíîñòü ïðèìåíèòü îïåðàòîð switch, âàøà ïðîãðàììà áóäåò âûïîëíÿòüñÿ áîëåå ýôôåêòèâíî.
Ðåçþìå: ìíîæåñòâåííûé âûáîð âàðèàíòîâ ñ ïîìîùüþ îïåðàòîðà switch.
Óïðàâëåíèå â ïðîãðàììå ïåðåäàåòñÿ îïåðàòîðó, ó êîòîðîãî â êà÷åñòâå ìåòêè èñïîëüçóåòñÿ çíà÷åíèå íåêîòîðîãî âûðàæåíèÿ. Çàòåì â ïðîöåññå ïðîõîæäåíèÿ ïðîãðàììû áóäóò âûïîëíÿòüñÿ îñòàâøèåñÿ îïåðàòîðû, ïîêà íå ïðîèçîéäåò íîâûé ïåðåõîä.
Êàê âûðàæåíèÿ, òàê è ìåòêè äîëæíû èìåòü çíà÷åíèÿ öåëîãî òèïà (âêëþ÷àÿ òèï char), ìåòêè äîëæíû áûòü êîíñòàíòàìè èëè êîíñòàíòíûìè âûðàæåíèÿìè. Åñëè íå êîòîðîìó çíà÷åíèþ âûðàæåíèÿ íå ñîîòâåòñòâóåò íèêàêàÿ ìåòêà, óïðàâëåíèå ïåðåäàåòñÿ îïåðàòîðó ñ ìåòêîé default (åñëè òàêîé èìååòñÿ).  ïðîòèâíîì ñëó÷àå, óïðàâëåíèå ïåðåäàåòñÿ îïåðàòîðó, ñëåäóþùåìó çà îïåðàòîðîì switch.
III. Ôîðìà:
Switch (âûðàæåíèå).
{ case ìåòêà1: îïåðàòîð1.
case ìåòêà2: îïåðàòîð2.
default: îïåðàòîð3.
}
 îïåðàòîðå ìîæåò ïðèñóòñòâîâàòü áîëåå ÷åì 2 ïîìå÷åííûõ îïåðàòîðà, à íàëè÷èå ìåòêè default ÿâëÿåòñÿ íåîáÿçàòåëüíûì.
IV. Ïðèìåð.
Switch (letter).
{
case 'a':
case 'e': printf(" %c - ýòîãëàñíàÿ\n ", letter);
case 'c':
case 'n': printf(" Ñèìâîë%ñâíàáîðåáóêâ\ ñànå\ n ", letter);
default: printf(" Äîáðûéäåíü. \n" );
}
Åñëè ïåðåìåííàÿ letter èìååò çíà÷åíèå 'a' èëè 'e', áóäóò âûâåäåíû íà ïå÷àòü âñå òðè ñîîáùåíèÿ, åñëè æå 'c' èëè 'n', òî ïîñëåäíèå äâà.  ñëó÷àå îñòàëüíûõ çíà÷åíèé áóäåò íàïå÷àòàíî òîëüêî ïîñëåäíåå ñîîáùåíèå.
Èçëîæåííûé çäåñü ìàòåðèàë ïîçâîëèò âàì ïèñàòü ãîðàçäî áîëåå ìîùíûå è îáëàäàþùèå áîëüøèìè âîçìîæíîñòÿìè ïðîãðàììû, ÷åì ðàíüøå.  ñïðàâåäëèâîñòè ýòîãî óòâåðæäåíèÿ âû ñìîæåòå óáåäèòüñÿ, åñëè ñðàâíèòå íåêîòîðûå èç ïðèìåðîâ, ïðèâåäåííûõ â äàííîé ãëàâå, ñ ïðîãðàììàìè, ðàññìîòðåííûìè â ïðåäûäóùèõ ãëàâàõ. Íî âû èçó÷èëè åùå äàëåêî íå âñå. Âîò ïî÷åìó âàì ïðèäåòñÿ îäîëåòü åùå íåìàëî ñòðàíèö ýòîé êíèãè.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îñóùåñòâèòü âûáîð èç äâóõ âîçìîæíîñòåé âûïîëíèòü îïåðàòîð èëè ïðîïóñòèòü åãî: ñ ïîìîùüþ îïåðàòîðà if.
Êàê îñóùåñòâèòü âûáîð îäíîãî èç äâóõ âàðèàíòîâ: ñ ïîìîùüþ îïåðàòîðà if-else.
Êàê îñóùåñòâèòü âûáîð îäíîãî èç íåñêîëüêèõ âàðèàíòîâ: ñ ïîìîùüþ îïåðàòîðîâ else-if, switch.
Îïåðàöèè îòíîøåíèÿ: > >= = = <= < !=
Ëîãè÷åñêèå îïåðàöèè: && || !
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ
Âîïðîñû.
1. Îïðåäåëèòå, êàêèå âûðàæåíèÿ èñòèííû, à êàêèå ëîæíû.
à. 100 > 3.
á. 'à' > 'ñ'.
â. 100 > 3 && 'à' > 'ñ'.
ã. 100 > 3 || 'a' > 'ñ'.
ä. !(100 > 3).
2. Çàïèøèòå âûðàæåíèÿ, ñîîòâåòñòâóþùèå ñëåäóþùèì óñëîâèÿì.
à. Çíà÷åíèå number ðàâíî èëè áîëüøå 1, íî ìåíüøå 9.
á. Çíà÷åíèå ch íå ðàâíî q èëè k.
â. Çíà÷åíèå number ëåæèò ìåæäó 1 è 9, íî íå ðàâíî 5.
ã. Çíà÷åíèå number íå ëåæèò ìåæäó 1 è 9.
3.  ïðîãðàììå, ïðèâåäåííîé íèæå, íàðÿäó ñ íåîïðàâäàííî ñëîæíûìè óñëîâíûìè âûðàæåíèÿìè èìåþòñÿ è ïðÿìûå îøèáêè. Óòî÷íèòå ýòó ïðîãðàììó è èñïðàâüòå â íåé îøèáêè.
Main( ) /* 1 */
{ /* 2 */
int weight, height; /* âåñ â ôóíòàõ, ðîñò â äþéìàõ */
/* 4 */
Scanf('' %d, weight, height); /* 5 */
If(weight < 100) /* 6 */
if (height >= 72) /* 7 */
Printf(" Äëÿ òàêîãî âåñà ó âàñ ñëèøêîì áîëüøîé ðîñò \n");
Else if (height < 72 && > 64) /* 9 */
Printf(" Ó âàñ áîëüøîé ðîñò äëÿ âàøåãî âåñà. \n" );
Else if (weight > 300 && !(weight < = 300)) /* 11*/
If( !(height >= 48) /* 12 */
Printf(" Äëÿ òàêîãî âåñà ó âàñ ñëèøêîì ìàëåíüêèé ðîñò.\n" );
Else /* 14 */
Printf(" Ó âàñ èäåàëüíûé âåñ. \n"); /* 15*/
/* 16 */
}
Îòâåòû.
1. Âûðàæåíèÿ èñòèííû â âîïðîñàõ à è ã.
2. a. number > = 1 && number < 9.
á. ch != 'q' && ch != k.
Çàìå÷àíèå: âûðàæåíèå ch != q || ch!= k âñåãäà áóäåò èìåòü çíà÷åíèå "èñòèíà", ïîòîìó ÷òî åñëè ïåðåìåííàÿ ñh ðàâíà q, òî îíà íå ìîæåò ðàâíÿòüñÿ k, è âòîðîå óñëîâèå îêàçûâàåòñÿ âûïîëíåííûì âðåçóëüòàòå âñå âûðàæåíèÿ "ÈËÈ" áóäåò èñòèííûì.
â. number > 1 && number < 9 && number != 5.
ã. !(number > 1 && number < 9) èëè number < = 1 || number > = 9.
Çàìå÷àíèå: ñêàçàòü, ÷òî ÷èñëî ÍÅ ëåæèò ìåæäó 1 è 9 ýòî òî æå ñàìîå, ÷òî ñêàçàòü: ÷èñëî ðàâíî èëè ìåíüøå 1 ÈËÈ ðàâíî èëè áîëüøå 9. Âòîðàÿ ôîðìà íåñêîëüêî íåóêëþæå çâó÷èò íà ñëîâàõ, íî ïðîùå çàïèñûâàåòñÿ â âèäå âûðàæåíèÿ.
3. Ñòðîêà 5: äîëæíà âûãëÿäåòü òàê scanf(" %d %d", &weight, &height). He çàáûâàéòå óêàçûâàòü ñèìâîëû â êà÷åñòâå ïðåôèêñîâ èìåí ïåðåìåííûõ â ôóíêöèè scanf( ). Êðîìå òîãî, äàííîé ñòðîêå äîëæíà ïðåäøåñòâîâàòü ñòðîêà, ïðåäëàãàþùàÿ ââåñòè äàííûå.
Ñòðîêà 9: ïîäðàçóìåâàåìîå âûðàæåíèå äîëæíî âûãëÿäåòü òàê: (height < 72 && height > 64). Îäíàêî ïåðâàÿ ÷àñòü ýòîãî âûðàæåíèÿ íåîáÿçàòåëüíà, ïîñêîëüêó âåëè÷èíà height, åñëè ïîòîê óïðàâëåíèÿ äîñòèãíåò çàïèñè else-if, áóäåò îáÿçàòåëüíî ìåíüøå 72. Ïîýòîìó áîëåå ïðîñòîå óñëîâèå (height > 64) â äàííîì ñëó÷àå ñëóæèò òîé æå öåëè.
Ñòðîêà 11: èçáûòî÷íîå óñëîâèå; âòîðîå ïîäâûðàæåíèå (îòðèöàíèå óñëîâèÿ "âåëè÷èíà weight ìåíüøå èëè ðàâíà 300") îçíà÷àåò òî æå, ÷òî è ïåðâîå.  äåéñòâèòåëüíîñòè äàííîå óñëîâèå çàïèñûâàåòñÿ òàê: (weight > 300). Íî íåïðèÿòíîñòè íà ýòîì íå êîí÷àþòñÿ. Ñòðîêà 11 îòíîñèòñÿ ê îøèáî÷íîìó îïåðàòîðó if. Î÷åâèäíî, ÷òî ýòà ÷àñòü else àññîöèèðóåòñÿ ñ îïåðàòîðîì if, ðàñïîëîæåííûì â ñòðîêå 6, íî, ñîãëàñíî ïðàâèëó, ñâÿçûâàþùåìó åå ñ áëèæàéøèì îòðèöàíèåì óñëîâèÿ, ñîäåðæàùåãîñÿ â if, îíà áóäåò àññîöèèðîâàòüñÿ ñ îïåðàòîðîì if íà ñòðîêå 9. Ïîýòîìó óñëîâèå, ïîìåùåííîå íà ñòðîêå 11, áóäåò ïðîâåðÿòüñÿ â òîì ñëó÷àå, êîãäà âåëè÷èíà weight ìåíüøå 100, à âåëè÷èíà height ìåíüøå èëè ðàâíà 64. Ýòî äåëàåò íåâîçìîæíûì ïðåâûøåíèå ïåðåìåííîé weight çíà÷åíèÿ 300 ïðè âûïîëíåíèè äàííîãî îïåðàòîðà.
Ñòðîêè 7-9 äîëæíû áûòü çàêëþ÷åíû â ôèãóðíûå ñêîáêè. Òîãäà ñòðîêà 11 ñòàíåò àëüòåðíàòèâîé îïåðàòîðó, ðàñïîëîæåííîìó íà ñòðîêå 6, à íå íà ñòðîêå 9.
Ñòðîêà 12: äàííîå âûðàæåíèå íåîáõîäèìî óïðîñòèòü òàê: (height < 48).
Ñòðîêà 14: ýòî êëþ÷åâîå ñëîâî else îòíîñèòñÿ ê ïîñëåäíåìó îïåðàòîðó if, ðàñïîëîæåííîìó íà ñòðîêå 12. Îïåðàòîðû, ïîìåùåííûå íà ñòðîêàõ 12 è 13, íåîáõîäèìî çàêëþ÷èòü â ôèãóðíûå ñêîáêè, òîãäà else áóäåò îòíîñèòüñÿ ê îïåðàòîðó if íà ñòðîêå 11. Îáðàòèòå âíèìàíèå, ÷òî ïîñëåäíåå ñîîáùåíèå áóäåò íàïå÷àòàíî äëÿ òåõ, ÷åé âåñ çàêëþ÷åí ìåæäó 100 è 300 ôóíòàìè.
8. Öèêëû è äðóãèå óïðàâëÿþùèå ñðåäñòâà.
Ïðè óñëîæíåíèè ðåøàåìûõ çàäà÷ õîä âûïîëíåíèÿ ïðîãðàìì ñòàíîâèòñÿ áîëåå çàïóòàííûì. ×òîáû èìåòü âîçìîæíîñòü óïðàâëÿòü ïðîöåññîì âûïîëíåíèÿ ïðîãðàìì è åãî îðãàíèçàöèåé, âàì ïîïàäàþòÿ ñòðóêòóðû è íåêîòîðûå ñïåöèàëüíûå îïåðàòîðû. ßçûê ïðåäîñòàâëÿåò ýôôåêòèâíûå ñðåäñòâà ðåàëèçàöèè òàêèõ òðåáîâàíèé. Ìû óæå ñìîãëè óáåäèòüñÿ â ÷ðåçâû÷àéíîé öåííîñòè öèêëà if â òîì ñëó÷àå, êîãäà íåîáõîäèìî ïîâòîðèòü íåêîòîðóþ îïåðàöèþ íåñêîëüêî ðàç.  ÿçûêå Ñè, êðîìå òîãî, ðåàëèçîâàíî åùå äâà âèäà öèêëîâ: öèêë for è öèêë do ... while.  äàííîé ãëàâå ðàññìàòðèâàþòñÿ ïðèíöèïû ðàáîòû óïðàâëÿþùèõ ñòðóêòóð è äàþòñÿ ðåêîìåíäàöèè, êàêèì îáðàçîì ëó÷øå âñåãî ïðèìåíÿòü êàæäóþ èç íèõ. Îáñóäèì îïåðàòîðû break, continue, goto è îïåðàöèþ "çàïÿòàÿ" âñå îíè ìîãóò èñïîëüçîâàòüñÿ äëÿ óïðàâëåíèÿ õîäîì âûïîëíåíèÿ ïðîãðàììû. Êðîìå òîãî, ìû ðàññêàæåì âàì åùå íåìíîãî î ñâîéñòâàõ, êîòîðûå ÷àñòî èñïîëüçóþòñÿ âìåñòå ñ öèêëàìè.
ÖÈÊË while.
 ïðåäøåñòâóþùèõ ãëàâàõ ìû èíòåíñèâíî ïîëüçîâàëèñü ýòîé ôîðìîé öèêëà, ñåé÷àñ æå õîòèì ðàññìîòðåòü åãî ðàáîòó â ñëó÷àå ïðîñòîé, âîçìîæíî, äàæå ïðèìèòèâíîé ïðîãðàììû, óãàäûâàþùåé ÷èñëî.
/* óãàäûâàíèå ÷èñëà1 */
/* íåýôôåêòèâíûé ñïîñîá óãàäûâàíèÿ */
#inlude.
main( ).
{
Int guess = 1;
Char response;
Printf(" Çàäóìàéòå öåëîå ÷èñëî îò 1 äî 100. ß ïîïðîáóþ óãàäàòü");
Printf(" åãî.\n Îòâå÷àéòå ä, åñëè ìîÿ äîãàäêà ïðàâèëüíà è");
Printf(" \n í, åñëè ÿ îøèáàþñü. \n");
Ðintf("Èòàê ... âàøå ÷èñëî %d?\n" , guess);
While((response = getchar( )) != 'ä') /* ïîëó÷åíèåîòâåòà*/
if (response != ' \n') /* ïðîïóñê ñèìâîëà "íîâàÿ ñòðîêà" */
printf(" Íó, òîãäà îíî ðàâíî %d?\n", ++guess);
Printf(" ß çíàëà, ÷òî ñìîãó ñäåëàòü ýòî!\n");
}
Îáðàòèòå âíèìàíèå íà ëîãèêó ïðîãðàììû. Åñëè âû îòâå÷àåòå ä, â ïðîãðàììå îñóùåñòâëÿåòñÿ âûõîä èç öèêëà è ïåðåõîä íà çàâåðøàþùèé îïåðàòîð ïå÷àòè. Ïðîãðàììà ïðîñèò âàñ îòâå÷àòü è â ñëó÷àå, åñëè åå äîãàäêà íåâåðíà, íî ôàêòè÷åñêè ëþáîé îòâåò, îòëè÷íûé îò ñèìâîëà ä, ïðèâîäèò ê òîìó, ÷òî ïðîãðàììà âõîäèò â öèêë. Îäíàêî åñëè ââåäåí ñèìâîë "íîâàÿ ñòðîêà", òî ïðè äàííîì ïðîõîæäåíèè òåëà öèêëà íèêàêèõ îïåðàöèé íå ïðîèçâîäèòñÿ. Ïîëó÷åíèå äðóãîãî ñèìâîëà ïðèâîäèò ê î÷åðåäíîé ïîïûòêå óãàäûâàíèÿ öåëîãî ÷èñëà. (×òî ïðîèçîøëî áû â ñëó÷àå èñïîëüçîâàíèÿ îïåðàöèè guess++ âìåñòî îïåðàöèè ++guess?).
Ñòðîêà if(response ! = '\n') ïîçâîëÿåò ïðîãðàììå èãíîðèðîâàòü ïîñòóïëåíèå ïîñòîðîííåãî ñèìâîëà "íîâàÿ ñòðîêà", êîãäà âû íàæìåòå êëàâèøó [ââîä].
 ýòîì ñëó÷àå òåëî öèêëà while íå íóæíî çàêëþ÷àòü â ôèãóðíûå ñêîáêè, ïîñêîëüêó îïåðàòîð if, õîòÿ îí è çàíèìàåò äâå ñòðîêè â ïðîãðàììå, ðàññìàòðèâàåòñÿ êàê îäèí îïåðàòîð.
Âû, ïî-âèäèìîìó, óæå çàìåòèëè, ÷òî ýòî äîâîëüíî "òóïàÿ" ïðîãðàììà. Îíà íàïèñàíà ïðàâèëüíî è ðåøàåò ïîñòàâëåííóþ çàäà÷ó, íî äåëàåò ýòî êðàéíå íåýôôåêòèâíî. Äàííûé ïðèìåð ïîêàçûâàåò íàì, ÷òî ïðàâèëüíîñòü íàïèñàíèÿ - íå åäèíñòâåííûé êðèòåðèé, ïî êîòîðîìó íåîáõîäèìî îöåíèâàòü ïðîãðàììó. Ïðè ýòîì î÷åíü âàæíà åå ýôôåêòèâíîñòü. Ìû âåðíåìñÿ ê äàííîé ïðîãðàììå íåñêîëüêî ïîçæå è ïîïûòàåìñÿ åå íåìíîãî óëó÷øèòü.
 îáùåì âèäå öèêë while çàïèñûâàåòñÿ òàê:
While(âûðàæåíèå) îïåðàòîð.
 íàøèõ ïðèìåðàõ â êà÷åñòâå âûðàæåíèé èñïîëüçîâàëèñü óñëîâíûå âûðàæåíèÿ, íî, âîîáùå ãîâîðÿ, ýòî ìîãóò áûòü âûðàæåíèÿ ïðîèçâîëüíîãî òèïà.  êà÷åñòâå îïåðàòîðà ìîæíî èñïîëüçîâàòü ïðîñòîé îïåðàòîð ñ ñèìâîëîì "òî÷êà ñ çàïÿòîé" â êîíöå èëè ñîñòàâíîé îïåðàòîð, çàêëþ÷åííûé â ôèãóðíûå ñêîáêè. Åñëè âûðàæåíèå èñòèííî (ò.å. â îáùåì ñëó÷àå íå ðàâíî íóëþ), òî îïåðàòîð, âõîäÿùèé â öèêë while âûïîëíÿåòñÿ îäèí ðàç, à çàòåì âûðàæåíèå ïðîâåðÿåòñÿ ñíîâà, à ïîñëåäîâàòåëüíîñòü äåéñòâèé, ñîñòîÿùàÿ èç ïðîâåðêè è âûïîëíåíèÿ îïåðàòîðà, ïåðèîäè÷åñêè ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå íå ñòàíåò ëîæíûì (èëè â îáùåì ñëó÷àå ðàâíûì íóëþ). Òàêîé øàã íàçûâàåòñÿ "èòåðàöèÿ". Äàííàÿ ñòðóêòóðà àíàëîãè÷íà ñòðóêòóðå îïåðàòîðà if. Îñíîâíîå îòëè÷èå çàêëþ÷àåòñÿ â òîì, ÷òî â îïåðàòîðå if ïðîâåðêà óñëîâèÿ è (âîçìîæíîå) âûïîëíåíèå îïåðàòîðà îñóùåñòâëÿåòñÿ òîëüêî îäèí ðàç, à â öèêëå while ýòè äåéñòâèÿ ïðîèçâîäÿòñÿ, âîîáùå ãîâîðÿ, íåîäíîêðàòíî.

ÐÈÑ. 8.1. Ñòðóêòóðà öèêëà while.
Çàâåðøåíèå öèêëà while.
Ìû ïîäîøëè ê ñàìîìó ñóùåñòâåííîìó ìîìåíòó ðàññìîòðåíèÿ öèêëîâ while. Ïðè ïîñòðîåíèè öèêëà while âû äîëæíû âêëþ÷èòü â íåãî êàêèå-òî êîíñòðóêöèè, èçìåíÿþùèå âåëè÷èíó ïðîâåðÿåìîãî âûðàæåíèÿ òàê, ÷òîáû â êîíöå êîíöîâ îíî ñòàëî ëîæíûì.  ïðîòèâíîì ñëó÷àå âûïîëíåíèå öèêëà íèêîãäà íå çàâåðøèòñÿ. Ðàññìîòðèì ñëåäóþùèé ïðèìåð:
Index = 1;
While(index < 5).
Printf("Äîáðîå óòðî!\n");
Äàííûé ôðàãìåíò ïðîãðàììû ïå÷àòàåò ýòî ðàäîñòíîå ñîîáùåíèå áåñêîíå÷íîå ÷èñëî ðàç, ïîñêîëüêó â öèêëå îòñóòñòâóþò êîíñòðóêöèè, èçìåíÿþùèå âåëè÷èíó ïåðåìåííîé index, êîòîðîé áûëî ïðèñâîåíî çíà÷åíèå 1.
Index = 1;
While(--index < 5).
Printf("Êàê êîëåáëþòñÿ ñòàðûå àòîìû!\n");
È ýòîò ôðàãìåíò ïðîãðàììû ðàáîòàåò íåíàìíîãî ëó÷øå. Çíà÷åíèå ïåðåìåííîé index â íåì èçìåíÿåòñÿ, íî â "íåïðàâèëüíîì" íàïðàâëåíèè! Åäèíñòâåííûì óòåøåíèåì çäåñü ñëóæèò òîò ôàêò, ÷òî âûïîëíåíèå äàííîãî êóñêà ïðîãðàììû â êîíöå êîíöîâ çàâåðøèòñÿ. Ýòî ïðîèçîéäåò, êîãäà âåëè÷èíà ïåðåìåííîé index ñòàíåò ìåíüøå íàèìåíüøåãî îòðèöàòåëüíîãî ÷èñëà, äîïóñòèìîãî â ñèñòåìå.
Öèêë while ÿâëÿåòñÿ "óñëîâíûì" öèêëîì, èñïîëüçóþùèì ïðåäóñëîâèå (ò.å. óñëîâèå íà âõîäå). Îí íàçûâàåòñÿ óñëîâíûì, ïîòîìó ÷òî âûïîëíåíèå îïåðàòîðà çàâèñèò îò èñòèííîñòè óñëîâèÿ, îïèñûâàåìîãî ñ ïîìîùüþ âûðàæåíèÿ. Äåéñòâèòåëüíî ëè çíà÷åíèå ïåðåìåííîé index ìåíüøå 5? ßâëÿåòñÿ ëè ïîñëåäíèé ââåäåííûé ñèìâîë ïðèçíàêîì EOF? Ïîäîáíîå âûðàæåíèå çàäàåò ïðåäóñëîâèå, ïîñêîëüêó âûïîëíåíèå ýòîãî óñëîâèÿ äîëæíî áûòü ïðîâåðåíî ïåðåä íà÷àëîì âûïîëíåíèÿ òåëà öèêëà.  ñèòóàöèè, àíàëîãè÷íîé ïðèâåäåííîé íèæå, òåëî öèêëà íå âûïîëíèòñÿ íè ðàçó, ïîòîìó ÷òî èñïîëüçóåìîå óñëîâèå ñ ñàìîãî íà÷àëà ÿâëÿåòñÿ ëîæíûì.
Index = 10;
While(index++ < 5).
Printf(" Æåëàþ õîðîøî ïðîâåñòè äåíü.\n");
Èçìåíèòå ïåðâóþ ñòðîêó íà.
Index = 3;
È âû ïîëó÷èòå ðàáîòàþùóþ ïðîãðàììó.
ÀËÃÎÐÈÒÌÛ È ÏÑÅÂÄÎÊÎÄ.
À òåïåðü âåðíåìñÿ ê íàøåé "òóïîóìíîé" ïðîãðàììå, óãàäûâàþùåé ÷èñëî. Íåäîñòàòîê ýòîé ïðîãðàììû êðîåòñÿ íå â ïðîãðàììèðîâàíèè ñàìîì ïî ñåáå, à â "àëãîðèòìå", ò.å. ìåòîäå, èñïîëüçóåìîì äëÿ îòãàäûâàíèÿ ÷èñëà. Ýòîò ìåòîä ìîæíî îïèñàòü ñëåäóþùèì îáðàçîì: ïîïðîñèòå ïîëüçîâàòåëÿ çàäóìàòü ÷èñëî êîìïüþòåð íà÷èíàåò óãàäûâàíèå ñ 1 äî òåõ ïîð ïîêà äîãàäêà íåâåðíà, ïðåäëàãàåìîå çíà÷åíèå óâåëè÷èâàåòñÿ íà 1.
Ýòà çàïèñü, ìåæäó ïðî÷èì, ñëóæèò ïðèìåðîì "ïñåâäîêîäà" ïðåäñòàâëÿþùåãî ñîáîé ñïîñîá âûðàæåíèÿ ñìûñëà ïðîãðàìì íà ðàçãîâîðíîì ÿçûêå è ÿâëÿþùåãîñÿ íåêîòîðûì àíàëîãîì ÿçûêà ìàøèíû. Ïñåâäîêîä î÷åíü ýôôåêòèâåí ïðè ðàçðàáîòêå ëîãèêè ïðîãðàììû. Ïîñëå òîãî êàê ëîãèêà ïîêàæåòñÿ âàì ïðàâèëüíîé, âû ìîæåòå îáðàòèòü îñíîâíîå âíèìàíèå íà äåòàëè ïåðåâîäà ïñåâäîêîäà íà ðåàëüíûé ÿçûê ïðîãðàììèðîâàíèÿ. Ïðåèìóùåñòâî èñïîëüçîâàíèÿ ïñåâäîêîäà ñîñòîèò â òîì, ÷òî îí ïîçâîëÿåò ñêîíöåíòðèðîâàòüñÿ íà ëîãèêå è ñòðóêòóðå ïðîãðàììû, íå çàáîòÿñü ïîêà î ñïîñîáå ïåðåâîäà ýòèõ èäåé íà ÿçûê ìàøèíû. Åñëè ìû õîòèì óëó÷øèòü ïðîãðàììó, íàì â ïåðâóþ î÷åðåäü íåîáõîäèìî óëó÷øèòü àëãîðèòì. Îäèí èç ìåòîäîâ çàêëþ÷àåòñÿ â òîì, ÷òîáû âûáðàòü ÷èñëî ãäå-íèáóäü ïîñåðåäèíå ìåæäó 1 è 100 (50 íàì âïîëíå ïîäõîäèò) è ïîïðîñèòü ïîëüçîâàòåëÿ îòâåòèòü áîëüøå ëè ýòî ÷èñëî çàäóìàííîãî, ìåíüøå åãî èëè ðàâíî åìó. Åñëè îí ñîîáùàåò, ÷òî äàííîå ÷èñëî ñëèøêîì âåëèêî, òî òåì ñàìûì èç ðàññìîòðåíèÿ íåìåäëåííî èñêëþ÷àþòñÿ âñå ÷èñëà ìåæäó 50 è 100. Ñëåäóþùåé äîãàäêîé ïðîãðàììû ÿâëÿåòñÿ ÷èñëî, âûáðàííîå ãäå-òî ïîñåðåäèíå ìåæäó 1 è 49. È ñíîâà îòâåò íà âîïðîñ, âåëèêî èëè ìàëî ýòî ÷èñëî, ïîçâîëèò èñêëþ÷èòü èç ðàññìîòðåíèÿ ïîëîâèíó îñòàâøèõñÿ âîçìîæíûõ ÷èñåë; ïðîãðàììà ïðîäîëæàåò óêàçàííûé ïðîöåññ, áûñòðî ñóæàÿ ïîëå ïîèñêà äî òåõ ïîð, ïîêà çàäóìàííîå ÷èñëî íå áóäåò óãàäàíî. Äàâàéòå çàïèøåì ýòè ëîãè÷åñêèå ðàññóæäåíèÿ íà ïñåâäîêîäå. Ïóñòü highest - ìàêñèìàëüíî âîçìîæíàÿ âåëè÷èíà îòãàäûâàåìîãî ÷èñëà, a lowest - åãî ìèíèìàëüíî âîçìîæíîå çíà÷åíèå. Âíà÷àëå ýòèìè âåëè÷èíàìè áóäóò ñîîòâåòñòâåííî 100 è 1, ïîýòîìó àëãîðèòì çàïèøåòñÿ ñëåäóþùèì îáðàçîì:
Óñòàíîâèòü highest ðàâíûì 100.
Óñòàíîâèòü lowest ðàâíûì 1.
Ïîïðîñèòü ïîëüçîâàòåëÿ çàäóìàòü ÷èñëî.
Ïðåäëîæåííîå çíà÷åíèå (guess) ðàâíî (highest + lowest)/2.
Ïîêà äîãàäêà íåâåðíà, äåëàòü ñëåäóþùåå:
{åñëè ïðåäëîæåííîå çíà÷åíèå âåëèêî, óñòàíîâèòü highest ðàâíûì ýòîìó ïðåäëîæåííîìó çíà÷åíèþ ìèíóñ 1.
Åñëè ïðåäëîæåííîå çíà÷åíèå ìàëî, óñòàíîâèòü lowest ðàâíûì ýòîìó ïðåäëîæåííîìó çíà÷åíèþ ïëþñ 1.
Íîâîå ïðåäëîæåííîå çíà÷åíèå ðàâíî (highest + lowest)/2 }
Îáðàòèòå âíèìàíèå íà ëîãèêó àëãîðèòìà: åñëè ïðåäëîæåííîå çíà÷åíèå, ðàâíîå 50, âåëèêî, òî ìàêñèìàëüíî âîçìîæíàÿ âåëè÷èíà çàäóìàííîãî ÷èñëà áóäåò ðàâíà 49. Åñëè æå çíà÷åíèå 50 ìàëî, òî ìèíèìàëüíî âîçìîæíàÿ âåëè÷èíà ÷èñëà áóäåò ðàâíà 51.
Ñåé÷àñ ìû ïåðåâåäåì òåêñò, óêàçàííûé âûøå, íà ÿçûê Ñè. Ïîëó÷åííàÿ ïðîãðàììà ïðåäñòàâëåíà íà ðèñ. 8.2.
/* óãàäûâàíèå ÷èñëà2 */
/* áîëåå ýôôåêòèâíûé ñïîñîá óãàäûâàíèÿ*/
#include.
#define HIGH 100.
#define LOW 1.
Main( ).
{
Int guess = (HIGH + LOW)/2;
Int highest = HIGH;
Int lowest = LOW;
Char response;
Printf(" Çàäóìàéòå ÷èñëî îò %d äî %d. ß ïîïðîáóþ", LOW, HIGH);
Printf(" óãàäàòü åãî.\n Îòâå÷àéòå ä, åñëè ìîÿ äîãàäêà ïðàâèëüíà,");
Printf(" á, åñëè \n áîëüøå, è ì, åñëè");
Printf(" ìåíüøå.\n");
Printf(" Èòàê ... âàøå ÷èñëî %d?\n" , guess);
While((response = getchar( )) != 'ä').
{
if( response != '\n').
{
If (response == 'á').
{
/* óìåíüøåíèå âåðõíåãî ïðåäåëà,
åñëè ïðåäëîæåííîå çíà÷åíèå ñëèøêîì âåëèêî */
Highest = guess - 1;
Guess = (highest + lowest)/2;
Printf(" Ãì ... ñëèøêîì âåëèêî. Âàøå ÷èñëî %d?\n", guess);
}
Else if(response == 'ì').
{
/* óâåëè÷åíèå íèæíåãî ïðåäåëà,åñëè.
ïðåäëîæåííîå çíà÷åíèå ñëèøêîì ìàëî*/
Lowest = guess + 1;
Guess = (highest + lowest)/2;
Printf(" Ãì ... ñëèøêîì ìàëî. Âàøå ÷èñëî %d?\n" , guess);
}
Else.
{
/* ïîäâîäèòå ïîëüçîâàòåëÿ ê ïðàâèëüíîìó îòâåòó */
Printf(" ß íå ïîíèìàþ; ââåäèòå, ïîæàëóéñòà, ä,á");
Printf ("èëè ì.\n");
}
}
Printf("ß çíàëà, ÷òî ñìîãó ñäåëàòü ýòî!\n");
}
ÐÈÑ. 8.2. Ïðîãðàììà, óãàäûâàþùàÿ ÷èñëî.
Íàëè÷èå â ïðîãðàììå çàâåðøàþùåé ÷àñòè else ïðåäîñòàâëÿåò ïîëüçîâàòåëþ äîïîëíèòåëüíóþ âîçìîæíîñòü ïðàâèëüíî îòâåòèòü íà ñòàíäàðòíûé "îòêëèê" ïðîãðàììû. Çàìåòèì òàêæå, ÷òî ìû èñïîëüçîâàëè ñèìâîëè÷åñêèå êîíñòàíòû, ÷òîáû ñäåëàòü ïðîöåññ èçìåíåíèÿ äèàïàçîíà ÷èñåë äîñòàòî÷íî ïðîñòûì. Ðàáîòàåò ëè äàííàÿ ïðîãðàììà? Íèæå ïðèâîäÿòñÿ ðåçóëüòàòû ýòîãî ïðîãîíà. Çàäóìàííîå ÷èñëî - 71.
Çàäóìàéòå ÷èñëî îò 1 äî 100. ß ïîïðîáóþ óãàäàòü åãî.
Îòâå÷àéòå ä, åñëè ìîÿ äîãàäêà ïðàâèëüíà á, åñëè.
áîëüøå, è ì, åñëè ìåíüøå.
Èòàê ..., âàøå ÷èñëî 50?
ß íå ïîíèìàþ: ââåäèòå, ïîæàëóéñòà, ä,á èëè ì.
Ì.
Ãì ... ñëèøêîì ìàëî. Âàøå ÷èñëî 75?
Á.
Ãì ... ñëèøêîì âåëèêî. Âàøå ÷èñëî 62?
Ì.
Ãì ... ñëèøêîì ìàëî. Âàøå ÷èñëî 68?
Ì.
Ãì ... ñëèøêîì ìàëî. Âàøå ÷èñëî 71?
Ä.
ß çíàëà, ÷òî ñìîãó ñäåëàòü ýòî!
×òî ìîæåò áûòü íåïðàâèëüíîãî â ýòîé ïðîãðàììå? Ìû ðåàëèçîâàëè â íåé çàùèòó îò îøèáîê, âûçâàííûõ òåì, ÷òî ïîëüçîâàòåëè ìîãóò óêàçûâàòü íåâåðíûå ñèìâîëû, ïîýòîìó çäåñü íå äîëæíî áûòü íèêàêèõ ïðîáëåì. Åäèíñòâåííîå, ÷òî ìîæåò ïîâëèÿòü íà ïðàâèëüíîñòü ðàáîòû ïðîãðàììû: åñëè âû âìåñòî ì óêàæåòå á, èëè íàîáîðîò. Ê ñîæàëåíèþ, íå ñóùåñòâóåò ñïîñîáà çàñòàâèòü ïîëüçîâàòåëÿ ãîâîðèòü ïðàâäó è íå äåëàòü îøèáîê. Òåì íå ìåíåå, åñëè âû çàèíòåðåñîâàíû â ýòîì, ìîæåòå ïðåäïðèíÿòü íåêîòîðûå øàãè. (Íàïðèìåð, åñëè çàõîòèòå ïîðàçèòü ñâîþ øåñòèëåòíþþ ïëåìÿííèöó.) Âî-ïåðâûõ, îáðàòèòå âíèìàíèå íà òî, ÷òî íàø ñïîñîá òðåáóåò ñàìîå áîëüøåå ñåìè ïîïûòîê äëÿ óãàäûâàíèÿ ëþáîãî ÷èñëà. (Êàæäàÿ ïîïûòêà óìåíüøàåò ÷èñëî âîçìîæíîñòåé íàïîëîâèíó. Çà ñåìü ïîïûòîê ìîæíî óãàäàòü ëþáîå ÷èñëî â äèàïàçîíå îò 1 äî 27- 1, èëè 127, ÷òî âïîëíå äîñòàòî÷íî äëÿ ðàáîòû â äèàïàçîíå èëè 1 äî 100.) Âû ìîæåòå ìîäèôèöèðîâàòü ïðîãðàììó òàê, ÷òîáû îíà ïîäñ÷èòûâàëà ÷èñëî ïîïûòîê, è åñëè îêàæåòñÿ, ÷òî îíî ïðåâûøàåò 7, òî òîãäà ìîæíî âûâåñòè íà ïå÷àòü ñîîáùåíèå ñ âûðàæåíèåì íåäîâîëüñòâà, à çàòåì âîññòàíîâèòü ïåðâîíà÷àëüíûå çíà÷åíèÿ ïåðåìåííûõ highest, lowest è ñ÷åò÷èêà. Äîïîëíèòåëüíûå èçìåíåíèÿ, êîòîðûå ìîæíî âíåñòè â ïðîãðàììó, çàêëþ÷àþòñÿ â òàêîé ìîäèôèêàöèè îïåðàòîðîâ if, â ðåçóëüòàòå êîòîðîé äîïóñêàëñÿ áû ââîä êàê ïðîïèñíûõ, òàê è ñòðî÷íûõ áóêâ.
Ðåçþìå: îïåðàòîð while.
Îïåðàòîð while îïðåäåëÿåò îïåðàöèè, êîòîðûå öèêëè÷åñêè âûïîëíÿþòñÿ äî òåõ ïîð, ïîêà ïðîâåðÿåìîå âûðàæåíèå íå ñòàíåò ëîæíûì, èëè ðàâíûì íóëþ. Îïåðàòîð while - ýòî öèêë ñ ïðåäóñëîâèåì; ðåøåíèå, âûïîëíÿòü ëè â î÷åðåäíîé ðàç òåëî öèêëà, ïðèíèìàåòñÿ ïåðåä íà÷àëîì åãî ïðîõîæäåíèÿ. Ïîýòîìó âïîëíå âîçìîæíî, òåëî öèêëà íå áóäåò âûïîëíåíî íè ðàçó. Îïåðàòîð, îáðàçóþùèé òåëî öèêëà, ìîæåò áûòü ëèáî ïðîñòûì, ëèáî ñîñòàâíûì.
While(âûðàæåíèå) îïåðàòîð.
Âûïîëíåíèå îïåðàòîðà öèêëè÷åñêè ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå íå ñòàíåò ëîæíûì, èëè ðàâíûì íóëþ.
ÏÐÈÌÅÐÛ.
While(n++ < 100) printf(" %d %d \n",n, 2*n + 1);
While(fargo < 1000).
{
fargo = fargo + step; step = 2 * step;
}
 íàøåì ïîñëåäíåì ïðèìåðå â öèêëå while èñïîëüçóåòñÿ "íåîïðåäåëåííîå" óñëîâèå: ìû íå çíàåì çàðàíåå, ñêîëüêî ðàç âûïîëíèòñÿ òåëî öèêëà ïåðåä òåì, êàê âûðàæåíèå ñòàíåò ëîæíûì. Âî ìíîãèõ íàøèõ ïðåäûäóùèõ ïðèìåðàõ, îäíàêî, öèêëû while èñïîëüçîâàëèñü äëÿ ïîäñ÷åòà ÷èñëà âûïîëíåíèè òåëà öèêëà. Íèæå ïðèâåäåí êðàòêèé ïðèìåð, êîòîðûé ñîäåðæèò ïîäñ÷èòûâàþùèé öèêë.
Main( ).
{
int = 1; /* èíèöèàëèçàöèÿ */
while (count <= NUMBER) /* ïðîâåðêà */
{
printf(" Áóäü ìîèì Âàëåíòèíîì !\n"); /*äåéñòâèå */
count++; /* óâåëè÷åíèå ñ÷åò÷èêà */
}
}
Õîòÿ öèêë ïîäîáíîãî òèïà ïðåêðàñíî ðàáîòàåò, ýòî íå ëó÷øèé âàðèàíò åãî çàïèñè, ïîñêîëüêó îïåðàöèè, ðåàëèçóþùèå öèêë, íå ñîáðàíû âìåñòå. Ðàññìîòðèì ýòîò âîïðîñ áîëåå ïîäðîáíî. Ïðè îðãàíèçàöèè öèêëà, êîãäà åãî òåëî äîëæíî áûòü âûïîëíåíî ôèêñèðîâàííîå ÷èñëî ðàç, îñóùåñòâëÿþòñÿ òðè îïåðàöèè: èíèöèàëèçàöèÿ ñ÷åò÷èêà, ñðàâíåíèå åãî âåëè÷èíû ñ íåêîòîðûì ãðàíè÷íûì çíà÷åíèåì è óâåëè÷åíèå çíà÷åíèÿ ñ÷åò÷èêà ïðè êàæäîì ïðîõîæäåíèè òåëà öèêëà. Óñëîâíîå âûðàæåíèå, èìåþùååñÿ â öèêëå while, áåðåò íà ñåáÿ çàáîòó î ñðàâíåíèè, à ïðèðàùåíèå çíà÷åíèÿ ñ÷åò÷èêà îñóùåñòâëÿåòñÿ ñ ïîìîùüþ îïåðàöèè óâåëè÷åíèÿ. Òàê æå êàê ýòî äåëàëîñü ðàíüøå, ìîæíî îáúåäèíèòü ýòè äâà äåéñòâèÿ â îäíî âûðàæåíèå, èñïîëüçóÿ çàïèñü count++ <= NUMBER. Íî èíèöèàëèçàöèÿ ñ÷åò÷èêà îñóùåñòâëÿåòñÿ âíå öèêëà, êàê, íàïðèìåð, â íàøåì ïðèìåðå îïåðàòîðîì count = 1;. Ïðè ýòîì ìîæíî çàáûòü î íåîáõîäèìîñòè èíèöèàëèçàöèè ñ÷åò÷èêà, à òî, ÷òî ìîæåò ñëó÷èòüñÿ, ðàíî èëè ïîçäíî ñëó÷àåòñÿ. Ñåé÷àñ ìû ðàññìîòðèì óïðàâëÿþùèé îïåðàòîð, èñïîëüçîâàíèå êîòîðîãî ïîçâîëÿåò èçáåæàòü ýòèõ ïðîáëåì.
ÖÈÊË for
 öèêëå for âñå òðè âûøåóêàçàííûõ äåéñòâèÿ ñîáðàíû âìåñòå. Èñïîëüçóÿ öèêë for, ôðàãìåíò, ïðèâåäåííûé âûøå, ìîæíî çàïèñàòü â âèäå îäíîãî îïåðàòîðà:
For(count = 1; count <= NUMBER; count++).
printf(" Áóäü ìîèì Âàëåíòèíîì! \n ");
 êðóãëûõ ñêîáêàõ ñîäåðæàòñÿ òðè âûðàæåíèÿ, ðàçäåëåííûå ñèìâîëîì "òî÷êà ñ çàïÿòîé". Ïåðâîå èç íèõ ñëóæèò äëÿ èíèöèàëèçàöèè ñ÷åò÷èêà. Îíà îñóùåñòâëÿåòñÿ òîëüêî îäèí ðàç - êîãäà öèêë for íà÷èíàåò âûïîëíÿòüñÿ. Âòîðîå âûðàæåíèå - äëÿ ïðîâåðêè óñëîâèÿ; îíà ïðîèçâîäèòñÿ ïåðåä êàæäûì âîçìîæíûì âûïîëíåíèåì òåëà öèêëà. Êîãäà âûðàæåíèå ñòàíîâèòñÿ ëîæíûì (èëè â îáùåì ñëó÷àå ðàâíûì íóëþ), öèêë çàâåðøàåòñÿ. Òðåòüå âûðàæåíèå âû÷èñëÿåòñÿ â êîíöå êàæäîãî âûïîëíåíèÿ òåëà öèêëà. Ðàíåå ìû èñïîëüçîâàëè åãî äëÿ óâåëè÷åíèÿ çíà÷åíèÿ ñ÷åò÷èêà count, íî, âîîáùå ãîâîðÿ, åãî èñïîëüçîâàíèå ýòèì íå îãðàíè÷èâàåòñÿ. Çà çàãîëîâêîì öèêëà for ñëåäóåò ïðîñòîé èëè ñîñòàâíîé îïåðàòîð. Ðèñ. 8.3 ñëóæèò èëëþñòðàöèåé ñòðóêòóðû öèêëà for.

ÐÈÑ. 8.3. Ñòðóêòóðà öèêëà for.
Ñåé÷àñ ìû ïðîäåìîíñòðèðóåì, êàê öèêë for èñïîëüçóåòñÿ â ïðîãðàììå, ïå÷àòàþùåé òàáëèöó êóáîâ öåëûõ ÷èñåë:
/* òàáëèöà êóáîâ*/
Main( ).
{
int num;
for(num=1;num<=6;num++).
printf(" %5d %5d \n", num, num*num*num);
}
Ïðîãðàììà âûâîäèò íà ïå÷àòü ÷èñëà îò 1 äî 6 è èõ êóáû:
1.
8.
27.
64.
125.
216.
Èç ïåðâîé ñòðîêè öèêëà for ìû ñðàçó ìîæåì óçíàòü âñþ èíôîðìàöèþ î ïàðàìåòðàõ öèêëà: íà÷àëüíîå çíà÷àíèå ïåðåìåííîé num, êîíå÷íîå çíà÷åíèå, à òàêæå íàñêîëüêî óâåëè÷èâàåòñÿ çíà÷åíèå ïåðåìåííîé num ïðè êàæäîì âûïîëíåíèè òåëà öèêëà. Öèêë for ÷àñòî èñïîëüçóåòñÿ äëÿ ðåàëèçàöèè â ïðîãðàììå âðåìåííîé çàäåðæêè ñ öåëüþ ñîãëàñîâàíèÿ ñêîðîñòè ðåàãèðîâàíèÿ (â äàíîì ñëó÷àå çàìåäëåíèÿ) ìàøèíû ñ âîçìîæíîñòÿìè âîñïðèÿòèÿ ÷åëîâåêà.
For(n=1; n<= 10000; n++);
Ýòîò öèêë çàñòàâëÿåò ìàøèíó ñ÷èòàòü äî 10000. Åäèíñòâåííûé ñèìâîë "òî÷êà ñ çàïÿòîé", ðàñïîëîæåííûé âî âòîðîé ñòðîêå, èíòåðåñóåò íàñ î òîì, ÷òî íèêàêèõ äðóãèõ äåéñòâèé â ýòîì öèêëå íå ïðîèçâîäèòñÿ. Òàêîé óåäèíåííûé ñèìâîë "òî÷êà ñ çàïÿòîé" ìîæíî ïðåäñòàâëÿòü ñåáå êàê "ïóñòîé" îïåðàòîð, ò. å. îïåðàòîð, êîòîðûé íå âûïîëíÿåò íèêàêèõ äåéñòâèé.
Ãèáêîñòü êîíñòðóêöèè for.
Õîòÿ öèêë for íà ïåðâûé âçãëÿä î÷åíü ïîõîæ íà öèêë DO â Ôîðòðàíå, öèêë FOR â Ïàñêàëå è öèêë FOR ... NEXT â Áåéñèêå, for â Ñè ÿâëÿåòñÿ ãîðàçäî áîëåå ãèáêèì ñðåäñòâîì, ÷åì ëþáîé èç óïîìÿíóòûõ. Ýòà ãèáêîñòü - ñëåäñòâèå ñïîñîáà èñïîëüçîâàíèÿ óïîìÿíóòûõ âûøå òðåõ âûðàæåíèé â ñïåöèôèêàöèè öèêëà for. Äî ñèõ ïîð ïåðâîå âûðàæåíèå ïðèìåíÿëîñü äëÿ èíèöèàëèçàöèè ñ÷åò÷èêà, âòîðîå - äëÿ çàäàíèÿ åãî ãðàíè÷íîãî çíà÷åíèÿ, à òðåòüå - äëÿ óâåëè÷åíèÿ åãî òåêóùåãî çíà÷åíèÿ íà 1. Èñïîëüçîâàííûé òàêèì îáðàçîì îïåðàòîð for â ÿçûêå Ñè ñîâåðøåííî àíàëîãè÷åí óïîìÿíóòûì âûøå ñîîòâåòñòâóþùèì îïåðàòîðàì â äðóãèõ ÿçûêàõ. Íî, êðîìå îïèñàííîé, ñóùåñòâóåò åùå è ìíîãî äðóãèõ âîçìîæíîñòåé åãî ïðèìåíåíèÿ, äåâÿòü èç êîòîðûõ ìû ïðèâîäèì íèæå.
1. Ìîæíî ïðèìåíÿòü îïåðàöèþ óìåíüøåíèÿ äëÿ ñ÷åòà â ïîðÿäêå óáûâàíèÿ âìåñòî ñ÷åòà â ïîðÿäêå âîçðàñòàíèÿ:
For(n = 10; n > 0; n--).
printf(" %d ñåêóíä!\n", n);
Printf(" Ïóñê!\n");
2. Ïðè æåëàíèè âû ìîæåòå âåñòè ñ÷åò äâîéêàìè, äåñÿòêàìè è ò. ä.
For (n = 2; n & 60; n = n + 13).
printf(" %d\n", n);
 ýòîì îïåðàòîðå çíà÷åíèå ïåðåìåííîé n áóäåò óâåëè÷èâàòüñÿ íà 13 ïðè êàæäîì âûïîëíåíèè òåëà öèêëà; áóäóò íàïå÷àòàíû ÷èñëà 2, 15, 28, 41 è 54.
Çàìåòèì, ìåæäó ïðî÷èì, ÷òî â ÿçûêå Ñè èìååòñÿ è äðóãàÿ ñîêðàùåííàÿ ôîðìà çàïèñè äëÿ óâåëè÷åíèÿ ïåðåìåííîé íà ôèêñèðîâàííóþ âåëè÷èíó. Âìåñòî âûðàæåíèÿ n = n + 13 ìîæíî âîñïîëüçîâàòüñÿ çàïèñüþ n + = 13.
Çíàê += îïðåäåëÿåò "àääèòèâíóþ îïåðàöèþ ïðèñâàèâàíèÿ", â ðåçóëüòàòå âûïîëíåíèÿ êîòîðîé âåëè÷èíà, ñòîÿùàÿ ñïðàâà, ïðèáàâëÿåòñÿ ê çíà÷åíèþ ïåðåìåííîé, ðàñïîëîæåííîé ñëåâà. Äîïîëíèòåëüíûå äåòàëè, îòíîñÿùèåñÿ ê ýòîé îïåðàöèè, ïðèâåäåíû íèæå.
3. Ìîæíî âåñòè ïîäñ÷åò ñ ïîìîùüþ ñèìâîëîâ, à íå òîëüêî ÷èñåë.
For(ch = 'à' ; ch <= 'z'; ch++).
printf(" Âåëè÷èíà êîäà ASCII äëÿ %ñ ðàâíà %d.\n" , ch, ch);
Ïðè âûïîëíåíèè ýòîãî îïåðàòîðà áóäóò âûâåäåíû íà ïå÷àòü âñå áóêâû îò à äî z âìåñòå ñ èõ êîäàìè ASCII. Ýòîò îïåðàòîð "ðàáîòàåò", ïîñêîëüêó ñèìâîëû â ïàìÿòè ìàøèíû ðàçìåùàþòñÿ â âèäå ÷èñåë è ïîýòîìó â äàííîì ôðàãìåíòå ñ÷åò âåäåòñÿ íà ñàìîì äåëå ñ èñïîëüçîâàíèåì öåëûõ ÷èñåë.
4.Ìîæíî ïðîâåðèòü âûïîëíåíèå íåêîòîðîãî ïðîèçâîëüíîãî óñëîâèÿ, îòëè÷íîãî îò óñëîâèÿ, íàëàãàåìîãî íà ÷èñëî èòåðàöèé.  íàøåé ïðîãðàììå òàáëèöà êóáîâ âû ìîãëè áû çàìåíèòü ñïåöèôèêàöèþ.
For(num = 1; num <= 6; num ++).
Íà.
For(num = 1; num *num *num <= 216; num++).
Ýòî áûëî áû öåëåñîîáðàçíî â ñëó÷àå, åñëè áû íàñ áîëüøå çàíèìàëî îãðàíè÷åíèå ìàêñèìàëüíîãî çíà÷åíèÿ äèàïàçîíà êóáîâ ÷èñåë, à íå êîëè÷åñòâà èòåðàöèé.
5. Ìîæíî ñäåëàòü òàê, ÷òîáû çíà÷åíèå íåêîòîðîé âåëè÷èíû âîçðàñòàëî â ãåîìåòðè÷åñêîé, à íå â àðèôìåòè÷åñêîé ïðîãðåññèè, ò. å. âìåñòî ïðèáàâëåíèÿ ôèêñèðîâàííîãî çíà÷åíèÿ íà êàæäîì øàãå öèêëà, âûïîëíÿëîñü áû óìíîæåíèå:
For(debt = 100.0; debt < 150.0; debt = debt*l.l).
printf(" Âàøäîëãòåïåðü$%.2f.\n", debt);
 ýòîì ôðàãìåíòå ïðîãðàììû çíà÷åíèå ïåðåìåííîé debt óìíîæàåòñÿ íà 1.1 íà êàæäîì øàãå öèêëà, ÷òî óâåëè÷èâàåò åå íà 10%. Ðåçóëüòàò âûãëÿäèò ñëåäóþùèì îáðàçîì:
Âàø äîëã òåïåðü $100.00.
Âàø äîëã òåïåðü $110.00.
Âàø äîëã òåïåðü $121.00.
Âàø äîëã òåïåðü $133.10.
Âàø äîëã òåïåðü $146.41.
Êàê âû óæå ñìîãëè äîãàäàòüñÿ, äëÿ óìíîæåíèÿ debt íà 1.1 òàêæå ñóùåñòâóåò ñîêðàùåííàÿ çàïèñü. Ìû ìîãëè áû èñïîëüçîâàòü âûðàæåíèå.
Debt * = 1.1.
Äëÿ ïîëó÷åíèÿ òîãî æå ðåçóëüòàòà. Çíàê *= îïðåäåëÿåò "ìóëüòèïëèêàòèâíóþ îïåðàöèþ ïðèñâàèâàíèÿ", ïðè âûïîëíåíèè êîòîðîé çíà÷åíèå ïåðåìåííîé, ðàñïîëîæåííîé ñëåâà, óìíîæàåòñÿ íà âåëè÷èíó, ñòîÿùóþ ñïðàâà. (Ñì. ïîÿñíåíèÿ íèæå, íà ñ. 226.).
6.  êà÷åñòâå òðåòüåãî âûðàæåíèÿ ìîæíî èñïîëüçîâàòü ëþáîå ïðàâèëüíî ñîñòàâëåííîå âûðàæåíèå. Êàêîå áû âûðàæåíèå âû íè óêàçàëè, åãî çíà÷åíèå áóäåò ìåíÿòüñÿ ïðè êàæäîé èòåðàöèè.
For(x = 1; ó <= 75; ó = 5*õ++ + 10);
printf("%10d %10d\n", x, ó);
 ýòîì ôðàãìåíòå âûâîäÿòñÿ íà ïå÷àòü çíà÷åíèÿ ïåðåìåííîé x è àëãåáðàè÷åñêîãî âûðàæåíèÿ 5*õ + 10. Ðåçóëüòàò áóäåò âûãëÿäåòü òàê:
1 55.
2 60.
3 65.
4 70.
5 75.
Îáðàòèòå âíèìàíèå, ÷òî â ñïåöèôèêàöèè öèêëà ïðîâåðÿåòñÿ çíà÷åíèå ó, à íå x.  êàæäîì èç òðåõ âûðàæåíèé, óïðàâëÿþùèõ ðàáîòîé öèêëà for, ìîãóò èñïîëüçîâàòüñÿ ëþáûå ïåðåìåííûå.
Õîòÿ ýòîò ïðèìåð è ïðàâèëåí, îí íå ìîæåò ñëóæèòü èëëþñòðàöèåé õîðîøåãî ñòèëÿ ïðîãðàììèðîâàíèÿ. Ïðîãðàììà âûãëÿäåëà áû ãîðàçäî ïîíÿòíåå, åñëè áû ìû íå ñìåøàëè ïðîöåññ èçìåíåíèÿ ïåðåìåííîé öèêëà ñ àëãåáðàè÷åñêèìè âû÷èñëåíèÿìè.
7. Ìîæíî äàæå îïóñòèòü îäíî èëè áîëåå âûðàæåíèé (íî ïðè ýòîì íåëüçÿ îïóñòèòü ñèìâîëû "òî÷êà ñ çàïÿòîé"). Íåîáõîäèìî òîëüêî âêëþ÷èòü â òåëî öèêëà íåñêîëüêî îïåðàòîðîâ, êîòîðûå â êîíöå êîíöîâ ïðèâåäóò ê çàâåðøåíèþ åãî ðàáîòû.
Ans = 2;
For (n = 3; ans <= 25;) ans = ans*n;
Ïðè âûïîëíåíèè ýòîãî öèêëà âåëè÷èíà n îñòàíåòñÿ ðàâíîé 3. Çíà÷åíèå ïåðåìåííîé ans âíà÷àëå áóäåò ðàâíî 2, ïîòîì óâåëè÷èòñÿ äî 6, 18, à çàòåì áóäåò ïîëó÷åíà îêîí÷àòåëüíàÿ âåëè÷èíà 54. (18 ìåíüøå 25, ïîýòîìó â öèêëå for âûïîëíÿåòñÿ åùå îäíà èòåðàöèÿ, è 18 óìíîæàåòñÿ íà 3, äàâàÿ ðåçóëüòàò 54). Òåëî öèêëà.
For(; ;).
printf(" ß õî÷ó ñäåëàòü ÷òî-íèáóäü\n");
Áóäåò âûïîëíÿòüñÿ áåñêîíå÷íîå ÷èñëî ðàç, ïîñêîëüêó ïóñòîå óñëîâèå âñåãäà ñ÷èòàåòñÿ èñòèííûì.
8. Ïåðâîå âûðàæåíèå íå îáÿçàòåëüíî äîëæíî èíèöèàëèçèðîâàòü ïåðåìåííóþ. Âìåñòî ýòîãî, íàïðèìåð, òàì ìîã áû ñòîÿòü îïåðàòîð printf( ) íåêîòîðîãî ñïåöèàëüíîãî âèäà. Íåîáõîäèìî ïîìíèòü òîëüêî, ÷òî ïåðâîå âûðàæåíèå âû÷èñëÿåòñÿ òîëüêî îäèí ðàç ïåðåä òåì, êàê îñòàëüíûå ÷àñòè öèêëà íà÷íóò âûïîëíÿòüñÿ.
For(printf("Çàïîìèíàéòå ââåäåííûå ÷èñëà!\n"); num == 6;).
Scanf(" %d", &num);
Printf("Ýòî êàê ðàç òî, ÷òî ÿ õî÷ó!\n");
 ýòîì ôðàãìåíòå ïåðâîå ñîîáùåíèå îêàçûâàåòñÿ âûâåäåííûì íà ïå÷àòü îäèí ðàç, à çàòåì îñóùåñòâëÿåòñÿ ïðèåì ââîäèìûõ ÷èñåë äî òåõ ïîð, ïîêà íå ïîìòóïèò ÷èñëî 6.
9. Ïàðàìåòðû, âõîäÿùèå â âûðàæåíèÿ, íàõîäÿùèåñÿ â ñïåöèôèêàöèè öèêëà, ìîæíî èçìåíèòü ïðè âûïîëíåíèè îïåðàöèé â òåëå öèêëà. Ïðåäïîëîæèì, íàïðèìåð, ÷òî ó âàñ åñòü öèêë ñî ñïåöèôèêàöèåé ñëåäóþùåãî âèäà:
For(n = 1; n < 1000; n + = delta).
È åñëè ïîñëå íåñêîëüêèõ èòåðàöèé âàøà ïðîãðàììà ðåøàåò, ÷òî âåëè÷èíà ïàðàìåòðà delta ñëèøêîì ìàëà èëè âåëèêà, îïåðàòîð if âíóòðè öèêëà ìîæåò èçìåíèòü çíà÷åíèå ïàðàìåòðà.  äèàëîãîâîé ïðîãðàììå ïîëüçîâàòåëü ìîæåò èçìåíèòü ýòîò ïàðàìåòð â ïðîöåññå âûïîëíåíèÿ öèêëà.
Êîðî÷å ãîâîðÿ, áîëüøàÿ ñâîáîäà âûáîðà âèäà âûðàæåíèé, óïðàâëÿþùèõ ðàáîòîé öèêëà for, ïîçâîëÿåò ñ ïîìîùüþ ýòîé êîíñòðóêöèè äåëàòü ãîðàçäî áîëüøå, ÷åì ïðîñòî âûïîëíÿòü ôèêñèðîâàííîå ÷èñëî èòåðàöèé. Âîçìîæíîñòè öèêëà for ìîãóò áûòü åùå áîëåå ðàñøèðåíû ïóòåì èñïîëüçîâàíèÿ îïåðàöèé, êîòîðûå ìû âêðàòöå îáñóäèì íèæå.
Ðåçþìå: îïåðàòîð for.
I. ÊËÞ×ÅÂÎÅ ÑËÎÂÎ: FOR.
II. ÎÁÙÈÅ ÇÀÌÅ×ÀÍÈß:
 îïåðàòîðå for èñïîëüçóþòñÿ òðè âûðàæåíèÿ, óïðàâëÿþùèå ðàáîòîé öèêëà; îíè ðàçäåëåíû ñèìâîëàìè "òî÷êà ñ çàïÿòîé". Èíèöèàëèçèðóþùåå âûðàæåíèå âû÷èñëÿåòñÿ òîëüêî îäèí ðàç äî íà÷àëà âûïîëíåíèÿ êàêîãî-íèáóäü èç îïåðàòîðîâ öèêëà. Åñëè ïðîâåðÿåìîå âûðàæåíèå îêàçûâàåòñÿ èñòèííûì (èëè íå ðàâíûì íóëþ), òåëî öèêëà âûïîëíÿåòñÿ îäèí ðàç. Çàòåì âû÷èñëÿåòñÿ âåëè÷èíà êîððåêòèðóåìîãî âûðàæåíèÿ, è çíà÷åíèå ïðîâåðÿåìîãî âûðàæåíèÿ îïðåäåëÿåòñÿ âíîâü. Îïåðàòîð for - ýòî öèêë ñ ïðåäóñëîâèåì: ðåøåíèå, âûïîëíèòü â î÷åðåäíîé ðàç òåëî öèêëà èëè íåò, ïðèíèìàåòñÿ äî íà÷àëà åãî ïðîõîæäåíèÿ. Ïîýòîìó ìîæåò ñëó÷èòüñÿ òàê, ÷òî òåëî öèêëà íå áóäåò âûïîëíåíî íè ðàçó. Îïåðàòîð, îáðàçóþùèé òåëî öèêëà, ìîæåò áûòü êàê ïðîñòûì, òàê è ñîñòàâíûì.
III. ÔÎÐÌÀ ÇÀÏÈÑÈ:
For(èíèöèàëèçàöèÿ; ïðîâåðêà óñëîâèÿ; êîððåêöèÿ) îïåðàòîð.
Òåëî öèêëà âûïîëíÿåòñÿ äî òåõ ïîð, ïîêà ïðîâåðÿåìîå óñëîâèå íå ñòàíåò ëîæíûì èëè ðàâíûì íóëþ.
III.ÏÐÈÌÅÐ.
For(n = 0; n < 10; n++).
Printf(" %d %d\n", n, 2*n + 1);
Âûøå óæå óïîìèíàëîñü î òîì, ÷òî â ÿçûêå Ñè èìååòñÿ íåñêîëüêî îïåðàöèé ïðèñâàèâàíèÿ.
Âàæíåéøåé èç íèõ ÿâëÿåòñÿ, êîíå÷íî, îïåðàöèÿ =, ïðè èñïîëüçîâàíèè êîòîðîé çíà÷åíèå âûðàæåíèÿ ñïðàâà îò çíàêà ïðèñâàèâàåòñÿ ïåðåìåííîé ñëåâà îò íåãî. Îñòàëüíûå îïåðàöèè ïðèñâàèâàíèÿ êîððåêòèðóþò çíà÷åíèÿ ïåðåìåííûõ  çàïèñè êàæäîé èç íèõ èìåþòñÿ èìÿ ïåðåìåííîé, ñòîÿùåå ñëåâà îò çíàêà îïåðàöèè, è âûðàæåíèå ñïðàâà îò íåãî Ïåðåìåííîé ïðèñâàèâàåòñÿ íîâîå çíà÷åíèå, ðàâíîå ñòàðîìó, ñêîððåêòèðîâàííîìó ñ ïîìîùüþ âåëè÷èíû âûðàæåíèÿ, ñòîÿùåãî ñïðàâà. Ðåçóëüòàò çàâèñèò îò èñïîëüçóåìîé îïåðàöèè. Íàïðèìåð: scores+= 20 òî æå ñàìîå, ÷òî scores = scores + 20, dimes -= 20 òî æå ñàìîå, ÷òî dimes = dimes - 2, bunnies *= 2 òî æå ñàìîå, ÷òî bunnies = bunnies * 2, time /= 2.73 òî æå ñàìîå, ÷òî time = time / 2.73, reduce %= 3 òî æå ñàìîå, ÷òî reduce = reduce % 3.
Ïðàâûå ÷àñòè çäåñü ÿâëÿþòñÿ îáûêíîâåííûìè ÷èñëàìè, íî ìû ìîãëè áû èñïîëüçîâàòü è áîëåå ñëîæíûå âûðàæåíèÿ.
Õ*= 3*ó + 12.
Òî æå ñàìîå, ÷òî è.
Õ = õ*(3*ó + 12).
Ýòèì îïåðàöèÿì ïðèñâàèâàíèÿ íàçíà÷åí òîò æå íèçêèé ïðèîðèòåò, ÷òî è îáû÷íîé îïåðàöèè =, ò.å. ìåíüøèé, ÷åì îïåðàöèÿì + èëè *. Ýòî è îòðàæåíî â ïîñëåäíåì ïðèìåðå. Âàì ñîâåðøåííî íå îáÿçàòåëüíî èñïîëüçîâàòü âñå ýòè ôîðìû. Îäíàêî îíè áîëåå êîìïàêòíû, è ïðè òðàíñëÿöèè îáû÷íî ïîçâîëÿþò ïîëó÷èòü áîëåå ýôôåêòèâíûé ìàøèííûé êîä, ÷åì òðàäèöèîííàÿ, áîëåå äëèííàÿ çàïèñü. Îíè áûâàþò îñîáåííî ïîëåçíû â òîì ñëó÷àå, êîãäà âû õîòèòå ïîìåñòèòü íåêîòîðîå âûðàæåíèå â ñïåöèôèêàöèþ öèêëà for.
Îïåðàöèÿ "çàïÿòàÿ".
Îïåðàöèÿ "çàïÿòàÿ" óâåëè÷èâàåò ãèáêîñòü èñïîëüçîâàíèÿ öèêëà for, ïîçâîëÿÿ âêëþ÷àòü â åãî ñïåöèôèêàöèþ íåñêîëüêî èíèöèàëèçèðóþùèõ èëè êîððåêòèðóþùèõ âûðàæåíèé. Íàïðèìåð, íèæå ïðèâîäèòñÿ ïðîãðàììà, êîòîðàÿ âûâîäèò íà ïå÷àòü âåëè÷èíû ïî÷òîâûõ òàðèôîâ ïåðâîãî êëàññà îáñëóæèâàíèÿ. (Âî âðåìÿ íàïèñàíèÿ ýòîé êíèãè ïî÷òîâûå òàðèôû áûëè òàêèìè: 20 öåíòîâ çà ïåðâóþ óíöèþ è ïî 17 öåíòîâ çà êàæäóþ ñëåäóþùóþ.).
/* ïî÷òîâûå òàðèôû*/
#define FIRST 20.
#define NEXT 17.
Main( ).
{
Int ounces, cost;
Printf(" óíöèèñòîèìîñòü\n");
For(ounces = 1, cost = FIRST; ounces <= 16; ounces++, cost+ = NEXT).
printf(" %3d %7d\n" , ounces, cost);
}
Ïåðâûå ÷åòûðå ñòðîêè ðåçóëüòàòà ðàáîòû ïðîãðàììû áóäóò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Óíöèè ñòîèìîñòü.
1 20.
2 37.
3 54.
Ìû âîñïîëüçîâàëèñü îïåðàöèåé "çàïÿòàÿ" â ïåðâîì è òðåòüèõ âûðàæåíèÿõ: â ïåðâîì ñëó÷àå îíà ïîçâîëÿåò èíèöèàëèçèðîâàòü ïåðåìåííûå ounces è cost; âî âòîðîì - íà êàæäîé èòåðàöèè óâåëè÷èâàòü çíà÷åíèå ounces íà 1, à cost íà 17 (âåëè÷èíó êîíñòàíòû NEXT). Âñå âû÷èñëåíèÿ îñóùåñòâëÿþòñÿ â ñïåöèôèêàöèè öèêëà for. Ïðèìåíåíèå îïåðàöèè "çàïÿòàÿ" íå îãðàíè÷åíî òîëüêî öèêëàìè for íî èìåííî â íèõ îíà èñïîëüçóåòñÿ îñîáåííî ÷àñòî. Îïåðàöèÿ îáëàäàåò îäíèì äîïîëíèòåëüíûì ñâîéñòâîì: ïðè åå èñïîëüçîâàíèè ãàðàíòèðóåòñÿ, ÷òî âûðàæåíèÿ, ê êîòîðûì îíà ïðèìåíÿåòñÿ (ò. å. âûðàæåíèÿ, ðàçäåëåííûå çàïÿòîé), áóäóò âû÷èñëÿòüñÿ ñëåâà íàïðàâî. Ïîýòîìó ïåðåìåííàÿ ounces áóäåò èíèöèàëèçèðîâàíà äî ïåðåìåííîé cost.  äàííîì ïðèìåðå ýòî íå èìååò çíà÷åíèÿ, íî ïîðÿäîê èíèöèàëèçàöèè ìîã áû îêàçàòüñÿ ñóùåñòâåííûì, åñëè âûðàæåíèå, ñîîòâåòâóþùåå cost, ñîäåðæàëî áû ïåðåìåííóþ ounces. Ñèìâîë "çàïÿòàÿ" òàêæå èñïîëüçóåòñÿ êàê ðàçäåëèòåëü. Ïîýòîìó çàïÿòûå â îïåðàòîðàõ: char ch, date;
ÐÈÑ. 8.4. Îïåðàöèÿ "çàïÿòàÿ" è öèêë for
ÈËÈ.
Printf(" %d %d\n", chimps, chumps);
ßâëÿþòñÿ ðàçäåëèòåëÿìè, à íå çíàêàìè îïåðàöèè "çàïÿòàÿ".
Ðåçþìå: íàøè íîâûå îïåðàöèè.
I. ÎÏÅÐÀÖÈß ÏÐÈÑÂÀÈÂÀÍÈß.
Êàæäàÿ èç ýòèõ îïåðàöèé êîððåêòèðóåò çíà÷åíèå ïåðåìåííîé ñëåâà îò çíàêà ñ ïîìîùüþ âåëè÷èíû ñïðàâà îò íåãî, â ñîîòâåòñòâèè ñ óêàçàííîé îïåðàöèåé. Íèæå ìû èñïîëüçóåì îáîçíà÷åíèå ï.÷. äëÿ ïðàâîé ÷àñòè, à ë.÷. äëÿ ëåâîé ÷àñòè.
+= ïðèáàâëÿåò âåëè÷èíó ï.÷. ê ïåðåìåííîé ë.÷.
-= âû÷èòàåò âåëè÷èíó ï.÷. èç ïåðåìåííîé ë.÷.
*= óìíîæàåò íåðåìåííóþ ë.÷. íà âåëè÷èíó ï.÷.
/= äåëèò ïåðåìåííóþ ë.÷. íà âåëè÷èíó ï.÷.
%= äàåò îñòàòîê îò äåëåíèÿ ïåðåìåííîé ë.÷. íà âåëè÷èíó è.÷.
ÏÐÈÌÅÐ:
Rabbits *= 1.6; òî æå ñàìîå, ÷òî è rabbits * 1.6;
II. ÄÎÏÎËÍÈÒÅËÜÍÛÅ ÎÏÅÐÀÖÈÈ:ÎÏÅÐÀÖÈß "ÇÀÏßÒÀß".
Îïåðàöèÿ "çàïÿòàÿ" ñâÿçûâàåò äâà âûðàæåíèÿ â îäíî è ãàðàíòèðóåò, ÷òî ñàìîå ëåâîå âûðàæåíèå áóäåò âû÷èñëÿòüñÿ ïåðâûì. Îáû÷íî îíà èñïîëüçóåòñÿ äëÿ âêëþ÷åíèÿ äîïîëíèòåëüíîé èíôîðìàöèè â ñïåöèôèêàöèþ öèêëà for.
Ïðèìåð:
For(step == 2, fargo = 0; fargo < 1000; step *= 2).
fargo + = step;
Ôèëîñîô Çåíîí è öèêë for.
Ïîñìîòðèì, êàê ñ ïîìîùüþ îïåðàöèè "çàïÿòàÿ" ìîæíî ðàçðåøèòü ñòàðûé ïàðàäîêñ. Ãðå÷åñêèé ôèëîñîô Çåíîí óòâåðæäàë, ÷òî ïóùåííàÿ ñòðåëà íèêîãäà íå äîñòèãíåò öåëè. Ñíà÷àëà, ãîâîðèë îí, ñòðåëà ïðîëåòèò ïîëîâèíó ðàññòîÿíèÿ äî öåëè. Ïîñëå ýòîãî åé îñòàíåòñÿ ïðîëåòåòü ïîëîâèíó âñåãî ðàññòîÿíèÿ, íî ñíà÷àëà îíà äîëæíà áóäåò ïðîëåòåòü ïîëîâèíó òîãî, ÷òî åé îñòàëîñü ïðîëåòåòü, è ò. ä. äî áåñêîíå÷íîñòè. Ïîñêîëüêó ðàññòîÿíèå ïîëåòà ðàçáèòî íà áåñêîíå÷íîå ÷èñëî ÷àñòåé, äëÿ äîñòèæåíèÿ öåëè ñòðåëå ìîæåò ïîòðåáîâàòüñÿ áåñêîíå÷íîå âðåìÿ. Ìû ñîìíåâàåìñÿ, îäíàêî, ÷òî Çåíîí âûçâàëñÿ áû ñòàòü ìèøåíüþ äëÿ ñòðåëû, ïîëàãàÿñü òîëüêî íà óáåäèòåëüíîñòü ñâîåãî àðãóìåíòà. Ïðèìåíèì êîëè÷åñòâåííûé ïîäõîä è ïðåäïîëîæèì, ÷òî çà îäíó ñåêóíäó ïîëåòà ñòðåëà ïðîëåòàåò ïåðâóþ ïîëîâèíó ðàññòîÿíèÿ. Òîãäà çà ïîñëåäóþùóþ 1/2 ñåêóíäû îíà ïðîëåòèò ïîëîâèíó òîãî, ÷òî îñòàëîñü îò ïîëîâèíû, çà 1/4 - ïîëîâèíó òîãî, ÷òî îñòàëîñü ïîñëå ýòîãî, è ò ä. Ïîëíîå âðåìÿ ïîëåòà ïðåäñòàâëÿåòñÿ â âèäå ñóììû áåñêîíå÷íîãî ðÿäà 1 + 1/2 + 1/4 + 1/8 + 1/16 -1- ... . Ìû ìîæåì íàïèñàòü êîðîòêóþ ïðîãðàììó äëÿ íàõîæäåíèÿ ñóììû ïåðâûõ íåñêîëüêèõ ÷ëåíîâ.
/* Çåíîí*/
#define LIMIT 15.
Main ( ).
{
Int count;
Float sum, x;
For(sum = 0.0, x = 1.0, count = 1; count <= LIMIT; count++, x *= 2.0).
{
sum + = 1.0/x;
printf(" sum = %f êîãäàñîunt = %d.\n" , sum, count);
}
}
 ðåçóëüòàòå âûïîëíåíèÿ ïðîãðàììû ïîëó÷èì çíà÷åíèÿ ñóìì, ñîîòâåòñòâóþùèõ ïåðâûì 15 ÷ëåíàì ðÿäà:
Sum = 1.000000 êîãäà count = 1.
Sum = 1.500000 êîãäà count = 2.
Sum = 1.750000 êîãäà count = 3.
Sum = 1.875000 êîãäà count = 4.
Sum = 1.937500 êîãäà count = 5.
Sum = 1.968750 êîãäà count = 6.
Sum = 1.984375 êîãäà count = 7.
Sum = 1.992188 êîãäà count = 8.
Sum = 1.996094 êîãäà count = 9.
Sum = 1.998047 êîãäà count = 10.
Sum = 1.999023 êîãäà count = 11.
Sum = 1.999512 êîãäà count = 12.
Sum = 1.999756 êîãäà count = 13.
Sum = 1.999878 êîãäà count = 14.
Sum = 1.999939 êîãäà count = 15.
Ìîæíî âèäåòü, ÷òî, õîòÿ ìû è äîáàâëÿåì íîâûå ÷ëåíû, ñóììà, ïî-âèäèìîìó, ñòðåìèòñÿ ê êàêîìó-òî ïðåäåëó. È äåéñòâèòåëüíî, ìàòåìàòèêè ïîêàçàëè, ÷òî ïðè ñòðåìëåíèè ÷èñëà ÷ëåíîâ ê áåñêîíå÷íîñòè ñóììà ðÿäà ñõîäèòñÿ ê 2,0, ÷òî è äåìîíñòðèðóåòñÿ íàøåé ïðîãðàììîé. Êàêàÿ ðàäîñòü! Åñëè áû Çåíîí îêàçàëñÿ ïðàâ, äâèæåíèå áûëî áû íåâîçìîæíî. (Íî åñëè áû äâèæåíèå áûëî íåâîçìîæíî, òî íå áûëî áû Çåíîíà ).
×òî ìîæíî ñêàçàòü ïî ïîâîäó ñàìîé ïðîãðàììû?  íåé ïîêàçàíî, ÷òî â îäíîì âûðàæåíèè ìîæíî èñïîëüçîâàòü áîëåå, ÷åì îäíó îïåðàöèþ "çàïÿòàÿ".  ñïåöèôèêàöèè öèêëà ìû èíèöèàëèçèðîâàëè ïåðåìåííûå sum, x è count. Ïîñëå çàäàíèÿ óñëîâèé âûïîëíåíèÿ öèêëà îñòàâøàÿñÿ ÷àñòü ïðîãðàììû îêàçûâàåòñÿ î÷åíü êîðîòêîé.
ÖÈÊË Ñ ÓÑËÎÂÈÅÌ ÍÀ ÂÛÕÎÄÅ: do while.
Îáà öèêëà, while è for, ÿâëÿþòñÿ öèêëàìè ñ ïðåäóñëîâèÿìè. Ïðîâåðêà èñòèííîñòè óñëîâèÿ îñóùåñòâëÿåòñÿ ïåðåä íà÷àëîì êàæäîé èòåðàöèè öèêëà.  ÿçûêå Ñè èìååòñÿ òàêæå êîíñòðóêöèÿ öèêëà ñ ïîñòóñëîâèåì (óñëîâèåì íà âûõîäå), ãäå èñòèííîñòü óñëîâèÿ ïðîâåðÿåòñÿ ïîñëå âûïîëíåíèÿ êàæäîé èòåðàöèè öèêëà. Ýòîò ïîäõîä ðåàëèçóåòñÿ ñ ïîìîùüþ öèêëà do while, êîòîðûé èëëþñòðèðóåòñÿ ñëåäóþùèì ïðèìåðîì.
Do.
{
Ch = getchar( );
Putchar(ch);
}
while(ch != ' \n').
Ýòî ñèëüíî îòëè÷àåòñÿ îò çàïèñè, íàïðèìåð, òàêîãî âèäà.
While((ch = getchar( )) != '\n') putchar(ch);
Ðàçëè÷èå íà÷èíàåòñÿ ñ òîãî ìîìåíòà, êîãäà ïðî÷èòàí ñèìâîë "íîâàÿ ñòðîêà". Öèêë while ïå÷àòàåò âñå ñèìâîëû âïëîòü äî ïîÿâëåíèÿ ïåðâîãî ñèìâîëà "íîâàÿ ñòðîêà", à öèêë do while - âñå ñèìâîëû âïëîòü äî ñèìâîëà "íîâàÿ ñòðîêà" âêëþ÷èòåëüíî. Òîëüêî ïîñëå ïå÷àòè ýòîãî ñèìâîëà â öèêëå ïðîèçâîäèòñÿ ïðîâåðêà, ÿâëÿåòñÿ ëè ïîñëåäíèé ïðî÷èòàííûé ñèìâîë ñèìâîëîì "íîâàÿ ñòðîêà"  öèêëå while ýòè äåéñòâèÿ îñóùåñòâëÿþòñÿ ïåðåä ïðîâåðêîé èñòèííîñòè óñëîâèÿ.  îáùåì âèäå öèêë do while çàïèñûâàåòñÿ ñëåäóþùèì îáðàçîì:
Do.
Îïåðàòîð.
While(âûðàæåíèå);
Òàêîé îïåðàòîð ìîæåò áûòü êàê ïðîñòûì, òàê è ñîñòàâíûì.
ÐÈÑ. 8.5. Ñòðóêòóðà öèêëà do while.
Òåëî öèêëà do while âñåãäà âûïîëíÿåòñÿ ïî êðàéíåé ìåðå îäèí ðàç, ïîñêîëüêó ïðîâåðêà îñóùåñòâëÿåòñÿ òîëüêî ïîñëå åãî çàâåðøåíèÿ. Òåëî öèêëà for èëè while, âîçìîæíî, íå áóäåò âûïîëíåíî íè ðàçó, ïîñêîëüêó ïðîâåðêà îñóùåñòâëÿåòñÿ ïåðåä íà÷àëîì åãî âûïîëíåíèÿ. Èñïîëüçîâàòü öèêë do while ëó÷øå âñåãî â òåõ ñëó÷àÿõ êîãäà äîëæíà áûòü âûïîëíåíà ïî êðàéíåé ìåðå îäíà èòåðàöèÿ, ê ïðèìåðó, ìû ìîãëè áû ïðèìåíèòü öèêë do while â íàøåé ïðîãðàììå óãàäûâàíèÿ ÷èñëà. Íà ïñåâäîêîäå àëãîðèòì ðàáîòû ïðîãðàììû ìîæíî òîãäà çàïèñàòü ñëåäóþùèì îáðàçîì:
Do.
{
âûäâèíüòå ïðåäïîëîæåíèå ïîëó÷èòå îòâåò âèäà ä, á, èëè ì }.
while(îòâåò íå ñîâïàäàåò ñ ä).
Âû äîëæíû èçáåãàòü èñïîëüçîâàíèÿ öèêëà do while, ñòðóêòóðà êîòîðîãî àíàëîãè÷íà ïðåäñòàâëåííîé íèæå â çàïèñè íà ïñåâäîêîäå.
Ñïðîñèòå ïîëüçîâàòåëÿ, õî÷åò ëè îí ïðîäîëæàòü.
do.
Íåêîòîðûé óìíûé âçäîð.
While (îòâåò áóäåò äà).
 äàííîì ñëó÷àå, ïîñëå òîãî êàê ïîëüçîâàòåëü îòâåòèò "íåò", "íåêîòîðûé óìíûé âçäîð" áóäåò âûïîëíåí, ïîñêîëüêó ïðîâåðêà îñóùåñòâëÿåòñÿ ñëèøêîì ïîçäíî.
Ðåçþìå: îïåðàòîð do while.
I. Êëþ÷åâûå ñëîâà: do while.
II. Îáùèå çàìå÷àíèÿ:
Îïåðàòîð do while îïðåäåëÿåò äåéñòâèÿ, êîòîðûå öèêëè÷åñêè âûïîëíÿþòñÿ äî òåõ ïîð, ïîêà ïðîâåðÿåìîå âûðàæåíèå íå ñòàíåò ëîæíûì, èëè ðàâíûì íóëþ. Îïåðàòîð do while - ýòî öèêë ñ ïîñòóñëîâèåì; ðåøåíèå, âûïîëíÿòü èëè íåò â î÷åðåäíîå ðàç òåëî öèêëà, ïðèíèìàåòñÿ ïîñëå åãî ïðîõîæäåíèÿ. Ïîýòîìó òåëî öèêëà áóäåò âûïîëíåíî ïî êðàéíåé ìåðå îäèí ðàç. Îïåðàòîð, îáðàçóþùèé òåëî öèêëà, ìîæåò áûòü êàê ïðîñòûì, òàê è ñîñòàâíûì.
III. Ôîðìà çàïèñè.
Do îïåðàòîð.
While(âûðàæåíèå);
Âûïîëíåíèå îïåðàòîðà ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå íå ñòàíåò ëîæíûì, èëè ðàâíûì íóëþ.
IV. Ïðèìåð.
Do.
scanf(" %d" , amp;number);
While(number != 20);
ÊÀÊÎÉ ÖÈÊË ËÓרÅ?
Ïîñëå òîãî êàê âû ðåøèëè, ÷òî âàì íåîáõîäèìî èñïîëüçîâàòü îïåðàòîð öèêëà, âîçíèêàåò âîïðîñ: öèêëîì êàêîãî âèäà ëó÷øå âñåãî âîñïîëüçîâàòüñÿ? Âî-ïåðâûõ, ðåøèòå, íóæåí ëè âàì öèêë ñ ïðåäóñëîâèåì èëè æå ñ ïîñòóñëîâèåì. ×àùå âàì íóæåí áóäåò öèêë ñ ïðåäóñëîâèåì. Ïî îöåíêàì Êåðíèãàíà è Ðèò÷è; â ñðåäíåì öèêëû ñ ïîñòóñëîâèåì (do while) ñîñòàâëÿþò òîëüêî 5% îáùåãî ÷èñëà èñïîëüçóåìûõ öèêëîâ. Ñóùåñòâóåò íåñêîëüêî ïðè÷èí, ïî êîòîðûì ïðîãðàììèñòû ïðåäïî÷èòàþò ïîëüçîâàòüñÿ öèêëàìè ñ. ïðåäóñëîâèåì; â èõ ÷èñëå îäèí îáùèé ïðèíöèï, ñîãëàñíî êîòîðîìó ëó÷øå ïîñìîòðåòü, êóäà âû ïðûãàåòå, äî ïðûæêà, à íå ïîñëå. Âòîðûì ìîìåíòîì ÿâëÿåòñÿ òî, ÷òî ïðîãðàììó ëåã÷å ÷èòàòü, åñëè ïðîâåðÿåìîå óñëîâèå íàõîäèòñÿ â íà÷àëå öèêëà. È íàêîíåö, âî ìíîãèõ ñëó÷àÿõ âàæíî, ÷òîáû òåëî öèêëà èãíîðèðîâàëîñü ïîëíîñòüþ, åñëè óñëîâèå âíà÷àëå íå âûïîëíÿåòñÿ.
Ïîëîæèì, âàì íåîáõîäèìî èñïîëüçîâàòü öèêë ñ ïðåäóñëîâèåì. ×òî ëó÷øå: öèêë for èëè öèêë while? Îò÷àñòè ýòî äåëî âêóñà, ïîñêîëüêó âñå, ÷òî âû ìîæåòå ñäåëàòü ñ ïîìîùüþ îäíîãî, âû ìîæåòå ñäåëàòü è ñ ïîìîùüþ äðóãîãî. Äëÿ ïðåâðàùåíèÿ öèêëà for â öèêë while íóæíî îïóñòèòü ïåðâîå è òðåòüå âûðàæåíèÿ:
For(; ïðîâåðêà óñëîâèÿ;).
Òàêàÿ ñïåöèôèêàöèÿ ýêâèâàëåíòíà çàïèñè.
While(ïðîâåðêà óñëîâèÿ).
Äëÿ ïðåâðàùåíèÿ öèêëà while â öèêë for íåîáõîäèìî ïðåäâàðèòåëüíî îñóùåñòâèòü èíèöèàëèçàöèþ íåêîòîðûõ âûáðàííûõ ïåðåìåííûõ è âêëþ÷èòü â òåëî öèêëà îïåðàòîðû, êîððåêòèðóþùèå èõ çíà÷åíèÿ:
Èíèöèàëèçàöèÿ;
While (ïðîâåðêà óñëîâèÿ).
{
Òåëî;
Êîððåêöèÿ;
}
Äàííàÿ çàïèñü ïî ñâîèì ôóíêöèîíàëüíûì âîçìîæíîñòÿì ýêâèâàëåíòíà ñëåäóþùåé:
For(èíèöèàëèçàöèÿ; ïðîâåðêà óñëîâèÿ, êîððåêöèÿ) òåëî;
Èñõîäÿ èç ñîîáðàæåíèé ñòèëÿ ïðîãðàììèðîâàíèÿ, ïðèìåíåíèå öèêëà tor ïðåäñòàâëÿåòñÿ áîëåå ïðåäïî÷òèòåëüíûì â ñëó÷àå, êîãäà â öèêëå èñïîëüçóåòñÿ èíèöèàëèçàöèÿ è êîððåêöèÿ ïåðåìåííîé, à ïðèìåíåíèå öèêëà while - â ñëó÷àå, êîãäà ýòîãî íåò. Ïîýòîìó èñïîëüçîâàíèå öèêëà while âïîëíå îïðàâäàííî â ñëó÷àå.
While((ch = getchar( )) != EOF).
Ïðèìåíåíèå öèêëà for ïðåäñòàâëÿåòñÿ áîëåå åñòåñòâåííûì â ñëó÷àÿõ, êîãäà â öèêëàõ îñóùåñòâëÿåòñÿ ñ÷åò ïðîõîæäåíèé ñ îáíîâëåíèåì èíäåêñà:
For (count = 1; count <= 100; count++).
ÂËÎÆÅÍÍÛÅ ÖÈÊËÛ.
Âëîæåííûì íàçûâàåòñÿ öèêë, íàõîäÿùèéñÿ âíóòðè äðóãîãî öèêëà.  ýòîì ðàçäåëå ðàññìàòðèâàåòñÿ ïðèìåð, â êîòîðîì âëîæåííûå öèêëû èñïîëüçóþòñÿ äëÿ íàõîæäåíèÿ âñåõ ïðîñòûõ ÷èñåë, íå ïðåâûøàþùèõ äàííîãî çíà÷åíèÿ. Ïðîñòîå ÷èñëî - ýòî òàêîå ÷èñëî, êîòîðîå äåëèòñÿ íàöåëî òîëüêî íà 1 è ñàìî íà ñåáÿ. Ïåðâûìè ïðîñòûìè ÷èñëàìè áóäóò 2, 3, 5, 7 è 11.
Ñàìûé ëåãêèé ñïîñîá óçíàòü, ÿâëÿåòñÿ ëè ÷èñëî ïðîñòûì, ñîñòîèò â äåëåíèè åãî íà âñå ÷èñëà ìåæäó 1 è èì ñàìèì. Åñëè îíî äåëèòñÿ íàöåëî íà êàêîå-íèáóäü ÷èñëî èç ýòîãî ðÿäà, òî îíî - íå ïðîñòîå. Ìû âîñïîëüçóåìñÿ îïåðàöèåé äåëåíèÿ ïî ìîäóëþ (%) äëÿ ïðîâåðêè, âûïîëíÿëîñü ëè äåëåíèå íàöåëî. (Âû íå çàáûëè åùå, êîíå÷íî, îïåðàöèþ äåëåíèÿ ïî ìîäóëþ? Åå ðåçóëüòàòîì ÿâëÿåòñÿ îñòàòîê îò äåëåíèÿ ïåðâîãî îïåðàíäà íà âòîðîé. Åñëè îäíî ÷èñëî äåëèòñÿ íà äðóãîå íàöåëî, ðåçóëüòàòîì îïåðàöèè äåëåíèÿ ïîìîäóëþ áóäåò 0.) Ïðè îáíàðóæåíèè êàêîãî-íèáóäü îäíîãî äåëèòåëÿ ÷èñëà äàëüíåéøèå ïðîâåðêè ïîòåðÿþò ñìûñë. Ïîýòîìó â ïðîãðàììå ïðîöåññ ïðîâåðêè äàííîãî ÷èñëà çàâåðøàåòñÿ ïîñëå òîãî, êàê íàéäåí åãî äåëèòåëü.
Íà÷íåì ñ ïðîãðàììû, ïðîâåðÿþùåé äåëèìîñòü îäíîãî ÷èñëà.  íåé èìååòñÿ âñåãî îäèí îïåðàòîð öèêëà.
/* ïðîñòîå÷èñëî1 */
Main( ).
{
Int number, divisor;
Printf(" Î êàêîì ÷èñëå âû.
õîòèòå çíàòü, ïðîñòîå ëè îíî?\n");
Scanf(" %d" , &number); /* ïîëó÷åíèå îòâåòà */
While(number <2) /* ÷èñëî îòâåðãàåòñÿ */
{
printf(" Èçâèíèòå, ìû íå ïðèíèìàåì ÷èñåë ìåíüøå 2.\n");
printf(" Ïîæàëóéñòà, ïîïðîáóéòå åùå ðàç.\n");
scanf(" %d" , &number);
}
For(divisor = 2; number % divisor != 0; divisor++);
/* ïðîâåðêà, ïðîñòîå ÷èñëî èëè íåò,
îñóùåñòâëÿåòñÿ âíóòðè ñïåöèôèêàöèè öèêëà */
If (divisor == number) /* âûïîëíÿåòñÿ ïîñëå çàâåðøåíèÿ öèêëà */
printf(" %d - ïðîñòîå ÷èñëî.\n", number);
Else printf(" %d - íå ïðîñòîå ÷èñëî.\n", number);
}
Ìû âîñïîëüçîâàëèñü ñòðóêòóðîé öèêëà while, ÷òîáû èçáåæàòü ââîäà çíà÷åíèé, êîòîðûå ìîãëè áû ïðèâåñòè ê àâàðèéíîìó çàâåðøåíèþ ïðîãðàììû.
Îáðàòèòå âíèìàíèå, ÷òî âñå âû÷èñëåíèÿ âûïîëíÿþòñÿ âíóòðè ñïåöèôèêàöèè öèêëà for. Âåëè÷èíà ïåðåìåííîé number ïîñëåäîâàòåëüíî äåëèòñÿ íà âîçðàñòàþùèå çíà÷åíèÿ äåëèòåëåé äî òåõ ïîð, ïîêà íå ïðîèçîéäåò äåëåíèå íàöåëî (ò. å. number % divisor ñòàíåò ðàâíûì 0). Åñëè ïåðâûì äåëèòåëåì, êîòîðûé ïðèâåäåò ê òàêîìó ðåçóëüòàòó îêàæåòñÿ ñàìî ýòî ÷èñëî, òî çíà÷åíèå ïåðåìåííîé number - ïðîñòîå ÷èñëî.  ïðîòèâíîì ñëó÷àå äàííîå ÷èñëî áóäåò èìåòü ìåíüøèé äåëèòåëü, è ýòî ïðèâåäåò ê òîìó, ÷òî öèêë çàâåðøèòñÿ ðàíüøå.
Äëÿ íàõîæäåíèÿ âñåõ ïðîñòûõ ÷èñåë, ìåíüøèõ íåêîòîðîé çàäàííîé âåëè÷èíû, íàì íóæíî áóäåò çàêëþ÷èòü íàø öèêë for â íåêîòîðûé äðóãîé öèêë. Íà ïñåâäîêîäå ýòî áóäåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Äëÿ ÷èñëà (number)=1 äî âåðõíåãî ïðåäåëà limit ïðîâåðÿòü, ÿâëÿåòñÿ ëè ÷èñëî.
ïðîñòûì.
Âòîðàÿ ñòðîêà ïðåäñòàâëÿåò ñîáîé íàøó ïðåäûäóùóþ ïðîãðàììó.
Ïåðåâîäÿ ýòó çàïèñü íà ÿçûê Ñè, ïîëó÷èì ïðîãðàììó:
/* ïðîñòûå÷èñëà2 */
Main( ).
{
Int number, divisor, limit;
Int count = 0;
printf(" Óêàæèòå, ïîæàëóéñòà, âåðõíèé ïðåäåë äëÿ ïîèñêà ïðîñòûõ ÷èñåë.\n");
Printf(" Âåðõíèé ïðåäåë äîëæåí áûòü 2 èëè áîëüøå.\n");
Scanf(" %d", &limit);
While(limit < 2) /* âòîðàÿ ïîïûòêà, åñëè îøèáêà ïðè ââîäå */
{
printf(" Âû áûëè íåâíèìàòåëüíû! Ïîïðîáóéòå åùå ðàç. \n");
scanf(" %d", &limit);}printf(" Ñåé÷àñ áóäóò ïå÷àòàòüñÿ ïðîñòûå ÷èñëà!\n");
For(number = 2; number <= limit; number++) /* âíåøíèé öèêë*/
{
for(divisor =2; number % divisor != 0; divisor++);
if(divisor == number).
{
printf(" %5d", number);
if(++count % 10 == 0).
printf(" \n"); /* íîâàÿ ñòðîêà íà÷èíàåòñÿ.
÷åðåç êàæäûå 10 ïðîñòûõ ÷èñåë */
}
}
Printf(" \n Âîò è âñå!\n");
}
Âî âíåøíåì öèêëå êàæäîå ÷èñëî, íà÷èíàÿ ñ 2 è êîí÷àÿ âåëè÷èíîé limit, ïîñëåäîâàòåëüíî áåðåòñÿ äëÿ ïðîâåðêè. Óêàçàííàÿ ïðîâåðêà îñóùåñòâëÿåòñÿ âî âíóòðåííåì öèêëå. Ìû èñïîëüçîâàëè ïåðåìåííóþ count äëÿ õðàíåíèÿ ñ÷åò÷èêà ïîëó÷àåìûõ ïðîñòûõ ÷èñåë. Ïðè ïå÷àòè êàæäîå îäèííàäöàòîå ïðîñòîå ÷èñëî ìû íà÷èíàåì ñ íîâîé ñòðîêè. Íèæå ïðèâîäèòñÿ ïðèìåð ðåçóëüòàòîâ, ïîëó÷àåìûõ ñ ïîìîùüþ òàêîé ïðîãðàììû:
Óêàæèòå, ïîæàëóéñòà, âåðõíèé ïðåäåë äëÿ ïîèñêà ïðîñòûõ ÷èñåë.
Âåðõíèé ïðåäåë äîëæåí áûòü 2 èëè áîëüøå.
250.
Ñåé÷àñ áóäóò ïå÷àòàòüñÿ ïðîñòûå ÷èñëà!
2 3 5 7 11 13 17 19 23 29.
31 37 41 43 47 53 59 61 67 71.
73 79 83 89 97 101 103 107 109 113.
127 131 137 139 149 151 157 163 167 173.
179 181 191 193 197 199 211 223 227 229 233 239 241.
Âîò è âñå!
ÄÐÓÃÈÅ ÓÏÐÀÂËßÞÙÈÅ ÎÏÅÐÀÒÎÐÛ: break, continue, goto.
Îïåðàòîðû, îïðåäåëÿþùèå öèêëè÷åñêèå âû÷èñëåíèÿ, êîòîðûå òîëüêî ÷òî îáñóæäàëèñü, è óñëîâíûå îïåðàòîðû (if, if-else, switch) ÿâëÿþòñÿ âàæíåéøèìè ñðåäñòâàìè óïðàâëåíèÿ âûïîëíåíèåì ïðîãðàììû íà ÿçûêå Ñè. Îíè äîëæíû èñïîëüçîâàòüñÿ äëÿ ðåàëèçàöèè îáùåé ñòðóêòóðû ïðîãðàììû. Òðè îïåðàòîðà, ðàññìàòðèâàåìûå íèæå, îáû÷íî ïðèìåíÿþòñÿ ðåæå, ïîñêîëüêó ñëèøêîì ÷àñòîå èõ èñïîëüçîâàíèå óõóäøàåò ÷èòàåìîñòü ïðîãðàììû, óâåëè÷èâàåò âåðîÿòíîñòü îøèáîê è çàòðóäíÿåò åå ìîäèôèêàöèþ.
Break:
Âàæíåéøèì èç ýòèõ òðåõ óïðàâëÿþùèõ îïåðàòîðîâ ÿâëÿåòñÿ îïåðàòîð break, êîòîðûé óæå âñòðå÷àëñÿ íàì ïðè èçó÷åíèè îïåðàòîðà switch. Îí ìîæåò èñïîëüçîâàòüñÿ â îïåðàòîðå switch, ãäå ÷àñòî ýòî ïðîñòî íåîáõîäèìî, à òàêæå â öèêëàõ ëþáîãî èç òðåõ òèïîâ. Êîãäà â õîäå âûïîëíåíèÿ ïðîãðàììû âñòðå÷àåòñÿ óêàçàííûé îïåðàòîð, åãî âûïîëíåíèå ïðèâîäèò ê âûõîäó èç êîíñòðóêöèé switch, for, while èëè do while, â êîòîðûõ îí ñîäåðæèòñÿ, è ïåðåõîäó ê ñëåäóþùåìó îïåðàòîðó ïðîãðàììû. Åñëè îïåðàòîð break íàõîäèòñÿ âíóòðè íåêîòîðîé ñîâîêóïíîñòè âëîæåííûõ ñòðóêòóð, åãî äåéñòâèå ðàñïðîñòðàíÿåòñÿ òîëüêî íà ñàìóþ âíóòðåííþþ ñòðóêòóðó, â êîòîðîé îí íåïîñðåäñòâåííî ñîäåðæèòñÿ.
Áûâàåò, ÷òî break èñïîëüçóåòñÿ äëÿ âûõîäà èç öèêëà â òåõ ñëó÷àÿõ, êîãäà çàäàíû äâà ðàçíûõ óñëîâèÿ ïðåêðàùåíèÿ åãî ðàáîòû. Íèæå ïðèâîäèòñÿ öèêë, ðåàëèçóþùèé ýõî-ïå÷àòü ñèìâîëîâ è çàâåðøàþùèéñÿ ïðè ÷òåíèè ëèáî ïðèçíàêà EOF, ëèáî ñèìâîëà "íîâàÿ ñòðîêà":
While((ch = getchar( ))!= EOF).
{
if(ch == '\n') break;
putchar(ch);
}
Ìû ñäåëàåì ëîãèêó ýòîãî ôðàãìåíòà ïðîãðàììû áîëåå ïîíÿòíîé, åñëè îáúåäèíèì îáå ïðîâåðêè â îäíîì âûðàæåíèè:
While((ch = getchar( )) != EOF && ch != '\n') putchar(ch);
Åñëè âû îáíàðóæèòå, ÷òî break ÿâëÿåòñÿ ÷àñòüþ îïåðàòîðà if, ïîñìîòðèòå, íåëüçÿ ëè ïî-äðóãîìó âûðàçèòü ýòî óñëîâèå (êàê ìû òîëüêî ÷òî ñäåëàëè), ÷òîáû íåîáõîäèìîñòü åãî èñïîëüçîâàíèÿ îòïàëà.
Continue:
Ýòîò îïåðàòîð ìîæåò èñïîëüçîâàòüñÿ âî âñåõ òðåõ òèïàõ öèêëîâ, íî íå â îïåðàòîðå switch. Êàê è â ñëó÷àå îïåðàòîðà break, îí ïðèâîäèò ê èçìåíåíèþ õàðàêòåðà âûïîëíåíèÿ ïðîãðàììû. Îäíàêî âìåñòî çàâåðøåíèÿ ðàáîòû öèêëà íàëè÷èå îïåðàòîðà continue âûçûâàåò ïðîïóñê "îñòàâøåéñÿ" ÷àñòè èòåðàöèè è ïåðåõîä ê íà÷àëó ñëåäóþùåé. Çàìåíèì îïåðàòîð break â ïîñëåäíåì ôðàãìåíòå íà continue:
While((ch = getchar( ))!==EOF).
{
if(ch == '\n').
continue;
putchar(ch);
}
 âåðñèè, èñïîëüçóþùåé îïåðàòîð break, ðàáîòà öèêëà ïîëíîñòüþ ïðåêðàùàåòñÿ, êàê òîëüêî ïðè ââîäå âñòðå÷àåòñÿ ñèìâîë "íîâàÿ ñòðîêà".  âåðñèè ñ îïåðàòîðîì continue ïðîñòî ïðîïóñêàþòñÿ ñèìâîëû "íîâàÿ ñòðîêà", à âûõîä èç öèêëà ïðîèñõîäèò, òîëüêî êîãäà ÷èòàåòñÿ ïðèçíàê EOF.
Ýòîò ôðàãìåíò, êîíå÷íî, áîëåå êîìïàêòíî ìîæíî çàïèñàòü ñëåäóþùèì îáðàçîì:
While((ch=getchar( ))!= EOF).
if(ch != '\n') putchar(ch);
Î÷åíü ÷àñòî, òàê æå êàê è â äàííîì ñëó÷àå, èçìåíåíèå óñëîâèÿ â îïåðàòîðå if íà îáðàòíîå ïîçâîëÿåò èñêëþ÷èòü íåîáõîäèìîñòü ââåäåíèÿ â öèêë îïåðàòîðà continue.
Ñ äðóãîé ñòîðîíû, îïåðàòîð continue ïîìîãàåò èíîãäà ñîêðàòèòü íåêîòîðûå ïðîãðàììû, îñîáåííî åñëè îíè âêëþ÷àþò â ñåáÿ âëîæåííûå îïåðàòîðû if else.
Goto:
Îïåðàòîð goto - îäíî èç âàæíåéøèõ ñðåäñòâ Áåéñèêà è Ôîðòðàíà - òàêæå ðåàëèçîâàí è â Ñè. Îäíàêî íà ýòîì ÿçûêå â îòëè÷èå îò äâóõ äðóãèõ ìîæíî ïðîãðàììèðîâàòü, ñîâåðøåííî íå èñïîëüçóÿ óêàçàííîå ñðåäñòâî. Êåðíèãàí è Ðèò÷è ñ÷èòàþò îïåðàòîð goto "÷ðåçâû÷àéíî ïëîõèì" ñðåäñòâîì è ïðåäëàãàþò "ïðèìåíÿòü åãî êàê ìîæíî ðåæå èëè íå ïðèìåíÿòü ñîâñåì".
Ñíà÷àëà ìû ïîêàæåì, êàê åãî èñïîëüçîâàòü, à çàòåì îáúÿñíèì, ïî÷åìó ýòîãî íå íóæíî äåëàòü.
Îïåðàòîð goto ñîñòîèò èç äâóõ ÷àñòåé - êëþ÷åâîãî ñëîâà goto è èìåíè ìåòêè. Èìåíà ìåòîê îáðàçóþòñÿ ïî òåì æå ïðàâèëàì, ÷òî è èìåíà ïåðåìåííûõ. Ïðèâåäåì ïðèìåð çàïèñè îïåðàòîðà.
Goto pait2;
×òîáû ýòîò îïåðàòîð âûïîëíèëñÿ ïðàâèëüíî, íåîáõîäèìî íàëè÷èå äðóãîãî îïåðàòîðà, èìåþùåãî ìåòêó part2; â ýòîì ñëó÷àå çàïèñü îïåðàòîðà íà÷èíàåòñÿ ñ ìåòêè, çà êîòîðîé ñëåäóåò äâîåòî÷èå.
Part2: printf(" Óòî÷íåííûé àíàëèç:\n");
Èçáåãàéòå èñïîëüçîâàòü goto
 ïðèíöèïå âû íèêîãäà íå îáÿçàíû ïîëüçîâàòüñÿ îïåðàòîðîì goto ïðè ïðîãðàììèðîâàíèè íà Ñè. Íî åñëè âàø ïðåäûäóùèé îïûò ñâÿçàí ñ ðàáîòîé íà Ôîðòðàíå èëè Áåéñèêå, â êàæäîì èç êîòîðûõ òðåáóåòñÿ åãî èñïîëüçîâàòü, òî ó âàñ ìîãëè âûðàáîòàòüñÿ íàâûêè ïðîãðàììèðîâàíèÿ, îñíîâàííûå íà ïðèìåíåíèè äàííîãî îïåðàòîðà. ×òîáû ïîìî÷ü âàì ïðåîäîëåòü ýòó ïðèâû÷êó, íèæå âêðàòöå ïðèâîäèòñÿ íåñêîëüêî çíàêîìûõ âàì ñèòóàöèè, ðåàëèçóåìûõ ñ ïîìîùüþ goto, à çàòåì ïîêàçûâàåòñÿ, êàê ýòî ìîæíî îñóùåñòâèòü äðóãèìè ñðåäñòâàìè, â áîëüøåé ñòåïåíè ñîîòâåòñòâóþùèìè äóõó ÿçûêà Ñè.
1. Ðàáîòà â ñèòóàöèè, êîãäà â îïåðàòîðå if òðåáóåòñÿ âûïîëíèòü áîëåå îäíîãî îïåðàòîðà:
If(size > 12).
Goto a;
Goto b;
A: cost = cost * 1.05;
Flag = 2;
B: bill = cost * flag;
( ñòàíäàðòíûõ Áåéñèêå è Ôîðòðàíå òîëüêî îäèí îïåðàòîð, íåïîñðåäñòâåííî ñëåäóþùèé çà if-óñëîâèåì, ñ÷èòàåòñÿ îòíîñÿùèìñÿ ê îïåðàòîðó if. Ìû âûðàçèì ýòî ñ ïîìîùüþ ýêâèâàëåíòíîãî ôðàãìåíòà íà Ñè.).
Îáû÷íûé ïîäõîä, ïðèìåíÿåìûé â ÿçûêå Ñè è çàêëþ÷àþùèéñÿ â èñïîëüçîâàíèè ñîñòàâíîãî îïåðàòîðà, èëè áëîêà, óïðîùàåò ïîíèìàíèå ñìûñëà ïðîãðàììû:
If(size > 12);
{
cost = cost * 1.05;
flag = 2;
}
Bill = cost * flag;
2. Îñóùåñòâëåíèå âûáîðà èç äâóõ âàðèàíòîâ:
If(size > 14) goto a;
Sheds = 2;
Goto b;
A: sheds = 3;
B: help = 2 * sheds;
Íàëè÷èå â ÿçûêå Ñè ñòðóêòóðû if-else ïîçâîëÿåò ðåàëèçîâàòü òàêîé âûáîð áîëåå íàãëÿäíî:
If(ibex > 14).
sheds = 3;
Else.
sheds = 2;
Help = 2 * sheds;
3. Ðåàëèçàöèÿ áåñêîíå÷íîãî öèêëà:
Readin: scanf(" %d", &score);
If(score < 0) goto stagc2;
Áîëüøîå êîëè÷åñòâî îïåðàòîðîâ;
Goto readin:
Stagc2: äîïîëíèòåëüíàÿ ÷åïóõà;
}
Ýêâèâàëåíòíûé ôðàãìåíò, â êîòîðîì èñïîëüçóåòñÿ öèêë while, âûãëÿäèò òàê:
Scanf(" %d", &score);
Whilet(score >= 0).
{
áîëüøîå êîëè÷åñòâî îïåðàòîðîâ;
scanf("%d", &score);
}
Äîïîëíèòåëüíàÿ ÷åïóõà;
4. Ïðîïóñê îïåðàòîðîâ äî êîíöà òåëà öèêëà: èñïîëüçóéòå îïåðàòîð continue.
5. Âûõîä èç öèêëà: èñïîëüçóéòå îïåðàòîð break. Ôàêòè÷åñêè break è continue ÿâëÿþòñÿ ñïåöèàëüíûìè ôîðìàìè îïåðàòîðà goto. Ïðåèìóùåñòâî èõ èñïîëüçîâàíèÿ çàêëþ÷àåòñÿ â òîì, ÷òî, âî-ïåðâûõ, íàçâàíèÿ ýòèõ îïåðàòîðîâ ãîâîðÿò îá îñóùåñòâëÿåìûõ èìè ôóíêöèÿõ, à âî-âòîðûõ, ïîñêîëüêó îíè íå èñïîëüçóþò ìåòîê, îòñóòñòâóåò îïàñíîñòü ïîìåòèòü íå òîò îïåðàòîð ïðîãðàììû.
6. Âûïîëíåíèå ïåðåõîäîâ ê ðàçëè÷íûì ÷àñòÿì ïðîãðàììû íåïðåäñêàçóåìûì îáðàçîì: òàê ïðîãðàììèðîâàòü íåëüçÿ!
Ñóùåñòâóåò îäèí ñëó÷àé, êîãäà èñïîëüçîâàíèå îïåðàòîðà goto äîïóñêàåòñÿ îïûòíûìè ïðîãðàììèñòàìè, ðàáîòàþùèìè íà ÿçûêå Ñè,- ýòî âûõîä èç âëîæåííîãî íàáîðà öèêëîâ ïðè îáíàðóæåíèè êàêèõ-òî îøèáîê. (Ïðèìåíåíèå îïåðàòîðà break äàñò âîçìîæíîñòü îñóùåñòâèòü âûõîä òîëüêî èç ñàìîãî âíóòðåííåãî öèêëà.).
While(funct > 0).
{
for(i = 1; i < 100; i++).
{ for(j = 1; j<= 50; j++).
{ áîëüøîå ÷èñëî îïåðàòîðîâ;
if(áîëüøàÿ îøèáêà).
goto help;
îïåðàòîðû;
}
åùå íåêîòîðîå êîëè÷åñòâî îïåðàòîðîâ; }.
è åùå íåêîòîðîå êîëè÷åñòâî îïåðàòîðîâ; }.
È åùå îïåðàòîðû;
Help: óñòðàíåíèå îøèáêè;
Êàê âû ìîæåòå çàìåòèòü èç íàøèõ ïðèìåðîâ, àëüòåðíàòèâíûå ôîðìû ïðåäñòàâëåíèÿ ïðîãðàìì áîëåå ïîíÿòíû, ÷åì ôîðìû, èñïîëüçóþùèå îïåðàòîð goto. Ýòè ðàçëè÷èÿ ñòàíóò åùå áîëüøèìè, åñëè âû îáúåäèíèòå íåêîòîðûå èç ðàññìîòðåííûõ ñëó÷àåâ. Êàêèå îïåðàòîðû goto èñïîëüçóþòñÿ ïðè ðåàëèçàöèè îïåðàòîðîâ if, êàêèå ìîäåëèðóþò êîíñòðóêöèè if-else, êàêèå óïðàâëÿþò ðàáîòîé öèêëîâ, à êàêèå ïîÿâëÿþòñÿ ëèøü ïîòîìó, ÷òî ïîëüçîâàòåëü íàïèñàë ïðîãðàììó òàê, ÷òî íå ìîæåò áåç íèõ îáîéòèñü? ×ðåçìåðíîå óâåëè÷åíèå îïåðàòîðîì goto ïðèâîäèò ê ñîçäàíèþ ëàáèðèíòà â ëîãèêå ïðîãðàììû. Äàäèì âàì ñîâåò: åñëè âû ñîâñåì íå çíàêîìû ñ îïåðàòîðîì goto, òî íå ïðèìåíÿéòå åãî âîâñå; åñëè âû ïðèâûêëè ïîëüçîâàòüñÿ èì, ïîïûòàéòåñü îòó÷èòü ñåáÿ îò ýòîãî. Èðîíèÿ çàêëþ÷àåòñÿ â òîì, ÷òî â ÿçûêå Ñè, êîòîðûé âîâñå íå íóæäàåòñÿ â îïåðàòîðå goto, åãî ñòðóêòóðà îêàçûâàåòñÿ ëó÷øåé, ÷åì â áîëüøèíñòâå äðóãèõ ÿçûêîâ ïðîãðàììèðîâàíèÿ ïîñêîëüêó â êà÷åñòâå ìåòîê ìîæíî èñïîëüçîâàòü ñìûñëîâûå èìåíà, à íå ÷èñëà.
Ðåçþìå: ïåðåõîäû â ïðîãðàììàõ.
I. Êëþ÷åâûå ñëîâà: break, continue, goto.
II. Îáùèå çàìå÷àíèÿ.
Âûïîëíåíèå êàæäîãî èç ýòèõ òðåõ îïåðàòîðîâ ÿçûêà âûçûâàåò ñêà÷êîîáðàçíîå èçìåíåíèå ïðîöåññà âûïîëíåíèÿ ïðîãðàììû, ò. å. ïåðåõîä îò îäíîé êîìàíäû ïðîãðàììû ê äðóãîé (íå ñëåäóþùèé çà íåé íåïîñðåäñòâåííî).
III. break.
Îïåðàòîð break ìîæíî èñïîëüçîâàòü âíóòðè ëþáîé èç òðåõ ôîðì öèêëà è êîíñòðóêöèè switch. Åãî âûïîëíåíèå ïðèâîäèò ê òîìó, ÷òî óïðàâëåíèå ïðîãðàììîé, ìèíóÿ îñòàâøóþñÿ ÷àñòü òåëà öèêëà èëè êîíñòðóêöèþ switch, ñîäåðæàùóþ äàííûé îïåðàòîð, ïåðåäàåòñÿ íà ñëåäóþùóþ (çà ýòèì öèêëîì èëè çà êîíñòðóêöèåé switch) êîìàíäó.
Ïðèìåð:
Switch(number).
{
case 4: printf(" Ýòîõîðîøèéâûáîð.\n");
break;
case 5: printf(" Ýòî íåïëîõîé âûáîð.\n");
break;
default: ðrintf(" Ýòî ïëîõîé âûáîð.\n");
}
IV. Continue.
Îïåðàòîð continue ìîæåò èñïîëüçîâàòüñÿ â ëþáîé èç òðåõ ôîðì öèêëîâ, íî íå â îïåðàòîðå switch. Åãî âûïîëíåíèå ïðèâîäèò ê òàêîìó èçìåíåíèþ ëîãèêè ïðîãðàììû, ÷òî îñòàëüíûå îïåðàòîðû òåëà öèêëà ïðîïóñêàþòñÿ. Äëÿ öèêëîâ while èëè for âñëåä çà ýòèì íà÷èíàåòñÿ íîâûé øàã, à äëÿ öèêëà do while ïðîâåðÿåòñÿ óñëîâèå íà âûõîäå, è çàòåì, åñëè îíî îêàçûâàåòñÿ èñòèííûì, âûïîëíÿåòñÿ ñëåäóþùàÿ èòåðàöèÿ.
Ïðèìåð.
While((ch = gctchar( ))!= EOF).
{
if(ch == ' ') continue;
putchar(ch);
chcount++;
}
 ýòîì ôðàãìåíòå îñóùåñòâëÿåòñÿ ýõî-ïå÷àòü ÷èòàåìûõ ñèìâîëîâ è ïîäñ÷èòûâàåòñÿ ÷èñëî ñèìâîëîâ, îòëè÷íûõ îò ïðîáåëà.
V. goto.
Âûïîëíåíèå îïåðàòîðà goto âûçûâàåò ïåðåäà÷ó óïðàâëåíèÿ â ïðîãðàììå îïåðàòîðó, ïîìå÷åííîìó óêàçàííîé ìåòêîé. Äëÿ îòäåëåíèÿ îïåðàòîðà îò ñîîòâåòñòâóþùåé åìó ìåòêè èñïîëüçóåòñÿ äâîåòî÷èå. Èìåíà ìåòîê îáðàçóþòñÿ íî òåì æå ïðàâèëàì, ÷òî è èìåíà ïåðåìåííûõ. Ïîìå÷åííûé îïåðàòîð ìîæåò ïîÿâèòüñÿ â ïðîãðàììå òåêñòóàëüíî äî èëè ïîñëå goto.
Ôîðìà:
Goto ìåòêà;
...ìåòêà: îïåðàòîð.
Ïðèìåð.
Tîð : ch = getchar( );
...
If (ch != 'y').
Goto top;

ÌÀÑÑÈÂÛ.
Ìàññèâû ÿâëÿþòñÿ âàæíåéøèì ñðåäñòâîì ÿçûêà, ïðèìåíÿåìûì âî ìíîãèõ ïðîãðàììàõ. Èõ èñïîëüçîâàíèå ïîçâîëÿåò óäîáíûì ñïîñîáîì ðàçìåùàòü â ïàìÿòè áîëüøîå êîëè÷åñòâî íåîáõîäèìîé èíôîðìàöèè. Ïîçæå ìû ïîñâÿòèì ìàññèâàì öåëóþ ãëàâó, íî, ïîñêîëüêó îíè î÷åíü òåñíî ñâÿçàíû ñ öèêëàìè, ìû õîòèì íà÷àòü èõ èñïîëüçîâàòü óæå ñåé÷àñ.
Ìàññèâ - ýòî íàáîð ïåðåìåííûõ, èìåþùèõ îäíî è òî æå áàçîâîå èìÿ è îòëè÷àþùèõñÿ îäíà îò äðóãîé ÷èñëîâûì ïðèçíàêîì. Íàïðèìåð, ñ ïîìîùüþ îïèñàíèÿ.
Float debts [20];
Îáúÿâëÿåòñÿ, ÷òî debts - ìàññèâ, ñîñòîÿùèé èç äâàäöàòè ÷ëåíîâ, èëè "ýëåìåíòîâ". Ïåðâûé ýëåìåíò ìàññèâà íàçûâàåòñÿ debts[0], âòîðîé - debts[l], è ò. ä. âïëîòü äî debts[19]. Çàìåòèì, ÷òî ïåðå÷èñëåíèå ýëåìåíòîâ ìàññèâà íà÷èíàåòñÿ ñ 0, à íå ñ 1. Ïîñêîëüêó ìû îáúÿâèëè, ÷òî ìàññèâ èìååò òèï float, êàæäîìó åãî ýëåìåíòó ìîæíî ïðèñâîèòü âåëè÷èíó òèïà float. Ê ïðèìåðó, ìîæíî ïèñàòü òàê:
Debts[5] = 32.54;
Debts[6] = 1.2å+21;
Ìàññèâû ìîãóò áûòü îáðàçîâàíû èç äàííûõ ëþáîãî òèïà:
Int nannies[22]; /* ìàññíâ, ñîäåðæàùèé 22 öåëûõ ÷íñëà */
Char alpha[26]; /* ìàññíâ, ñîäåðæàùèé 26 ñèìâîëîâ */
Long big[500]; /*ìàññèâ, ñîäåðæàùèé 500 öåëûõ ÷èñåë òèïà long */
Ðàíüøå, íàïðèìåð, ìû ãîâîðèëè î ñòðîêàõ, ÿâëÿþùèõñÿ ÷àñòíûì ñëó÷àåì ìàññèâà òèïà char. ( îáùåì ìàññèâ òèïà char - ýòî ìàññèâ, ýëåìåíòàìè êîòîðîãî ÿâëÿþòñÿ âåëè÷èíû òèïà char. Ñòðîêà - ìàññèâ òèïà char, â êîòîðîì íóëü-ñèìâîë '\0' èñïîëüçóåòñÿ äëÿ òîãî, ÷òîáû îòìå÷àòü êîíåö ñòðîêè.).

ÐÈÑ. 8.6. Ìàññèâû ñèìâîëîâ è ñòðîêè.
×èñëà, èñïîëüçóåìûå äëÿ èäåíòèôèêàöèè ýëåìåíòîâ ìàññèâà, íàçûâàþòñÿ "ïîäñòðî÷íûìè èíäåêñàìè" èëè ïðîñòî "èíäåêñàìè". Èíäåêñàìè äîëæíû áûòü öåëûå ÷èñëà, è, êàê óæå óïîìèíàëîñü, èíäåêñèðîâàíèå íà÷èíàåòñÿ ñ 0. Ýëåìåíòû ìàññèâà ðàçìåøàþòñÿ â ïàìÿòè ïîñëåäîâàòåëüíî, äðóã çà äðóãîì, êàê ïîêàçàíî íà ðèñ. 8.6.
ÐÈÑ. 8.7. Ðàçìåùåíèå â ïàìÿòè ìàññèâîâ ñ ýëåìåíòàìè òèïà char è int
Ñóùåñòâóåò îãðîìíîå êîëè÷åñòâî âîçìîæíîñòåé ïðèìåíåíèÿ ìàññèâîâ. Íèæå ïðèâîäèòñÿ ñðàâíèòåëüíî ïðîñòîé ïðèìåð. Ïðåäïîëîæèì, âû õîòèòå íàïèñàòü ïðîãðàììó, îñóùåñòâëÿþùóþ ââîä 10 ðàçëè÷íûõ ðåçóëüòàòîâ ñïîðòèâíîé èãðû, êîòîðûå áóäóò îáðàáàòûâàòüñÿ ïîçæå. Èñïîëüçóÿ ïîíÿòèå ìàññèâà, âû ñìîæåòå èçáåæàòü ïðèäóìûâàíèÿ 10 ðàçëè÷íûõ èìåí ïåðåìåííûõ - ïî îäíîé äëÿ êàæäîãî ñ÷åòà. Êðîìå òîãî, äëÿ ÷òåíèÿ äàííûõ âû ìîæåòå âîñïîëüçîâàòüñÿ öèêëîì for:
/* ââîä ñ÷åòà*/
Main( ).
{
Int i, score[10];
for (i = 0; i <= 9; i++).
scanf(" %d", &a[i]); /* ââîä äåñÿòè ðåçóëüòàòîâ*/
Printf("Ââåäåíû ñëåäóþùèå ðåçóëüòàòû :\n" );
For (i = 0; i <= 9; i++).
printf(" %5d", a[i]); /* ïðîâåðêà ïðàâèëüíîñòè ââîäà*/
Printf("\n");
}
 ïîíÿòèå õîðîøåãî ñòèëÿ ïðîãðàììèðîâàíèÿ âõîäèò ýõî-ïå÷àòü òîëüêî ÷òî ââåäåííûõ âåëè÷èí. Îíà äàñò óâåðåííîñòü, ÷òî â ïðîãðàììå áóäóò îáðàáàòûâàòüñÿ òå äàííûå, äëÿ êîòîðûõ îíà ïðåäíàçíà÷åíà.
Ïðèìåíÿåìûé çäåñü ñïîñîá ãîðàçäî áîëåå óäîáåí, ÷åì èñïîëüçîâàíèå 10 ðàçëè÷íûõ îïåðàòîðîâ scanf() è 10 îòäåëüíûõ îïåðàòîðîâ printf() äëÿ ââîäà è ïðîâåðêè äåñÿòè ðåçóëüòàòîâ, îïðåäåëÿþùèõ ÷èñëî íàáðàííûõ î÷êîâ. Öèêë for îáåñïå÷èâàåò î÷åíü ïðîñòîè è óäîáíûé ñïîñîá èñïîëüçîâàíèÿ èíäåêñîâ ìàññèâîâ.
Êàêîãî òèïà îïåðàöèè ìîãëè áû ìû âûïîëíèòü íàä ýòèìè äàííûìè? Ìû ìîãëè áû íàéòè èõ ñðåäíåå, âåëè÷èíó ñòàíäàðòíîãî îòêëîíåíèÿ (ìû çíàåì äàæå, êàê ýòî ñäåëàòü) è ìàêñèìàëüíîå çíà÷åíèå ñ÷åòà, à òàêæå ïðîèçâåñòè èõ ñîðòèðîâêó â íåêîòîðîì ïîðÿäêå. Çàéìåìñÿ äâóìÿ ïðîñòåéøèìè çàäà÷àìè: íàõîæäåíèåì ñðåäíåãî è ìàêñèìàëüíîãî ðåçóëüòàòîâ.
×òîáû âû÷èñëèòü ñðåäíåå, ìû ìîæåì äîáàâèòü ê íàøåé ïðîãðàììå ïðèâåäåííûé íèæå ôðàãìåíò:
Int sum, average;
For(i = 0, sum = 0; i <= 9; i++) /* äâå èíèöèàëèçàöèè*/
sum + = a[i]; /* ñóììèðîâàíèå ýëåìåíòîâ ìàññèâà */
Average = sum/10; /*êëàññè÷åñêèé ìåòîä óñðåäíåíèÿ */
Printf(" Ñðåäíèé ðåçóëüòàò ðàâåí %d.\n", average);
Äëÿ íàõîæäåíèÿ ìàêñèìàëüíîãî ðåçóëüòàòà ê ïðîãðàììå ìîæíî äîáàâèòü ñëåäóþùèé ôðàãìåíò:
Int highest;
For(highest = à[0], i = 1; i <= 9; i++).
If(a[i] > highest) highest = a[i];
Printf ("Ìàêñèìàëüíûé ðåçóëüòàò ðàâåí %d.\n", highest);
Çäåñü ìû íà÷èíàåì ñ òîãî, ÷òî ïîëàãàåì ïåðåìåííóþ highest ðàâíîé âåëè÷èíå à[0]. Çàòåì ïðîèçâîäèòñÿ ñðàâíåíèå çíà÷åíèÿ highest ñ êàæäûì ýëåìåíòîì ìàññèâà. Êîãäà îáíàðóæèâàåòñÿ, ÷òî íåêîòîðàÿ âåëè÷èíà áîëüøå òåêóùåãî çíà÷åíèÿ ïåðåìåííîé highest, åé ïðèñâàèâàåòñÿ ýòà íîâàÿ áîëüøàÿ âåëè÷èíà.
Òåïåðü îáúåäèíèì âñå ÷àñòè ïðîãðàììû. Íà ïñåâäîêîäå àëãîðèòì åå ðàáîòû ìîæíî çàïèñàòü ñëåäóþùèì îáðàçîì:
Ââîä ðåçóëüòàòîâ.
Ýõî-ïå÷àòü ðåçóëüòàòîâ.
Âû÷èñëåíèå è ïå÷àòü ñðåäíåãî çíà÷åíèÿ.
Âû÷èñëåíèå è ïå÷àòü ìàêñèìàëüíîãî çíà÷åíèÿ.
Êðîìå òîãî, ìû íåñêîëüêî îáîáùèì íàøó ïðîãðàììó:
/* ðåçóëüòàòû*/
#define NUM 10.
Main( ).
{
Int i, sum, average, highest, score [NUM];
printf(" Óêàæèòå10 ðåçóëüòàòîâ. \n");
For(i = 0; i < NUM; i++).
scanf(" %d" , &scorc[i]); /* ââîä äåñÿòè ðåçóëüòàòîâ */
Printf(" Ââåäåíû ñëåäóþùèå ðåçóëüòàòû:\n");
For(i = 0; i<NUM; i++).
printf("%5d", score[i]);/* ïðîâåðêà ïðàâèëüíîñòè ââîäà*/
Printf("\n");
Tor(i = 0, sum = 0; i < NUM; i++).
sum + = score[i]; /* ñóììèðîâàíèå ýëåìåíòîâ ìàññèâà */
Average = sum/NUM; /* êëàññè÷åñêèé ìåòîä óñðåäíåíèÿ */
Printf(" Ñðåäíèé ðåçóëüòàò ðàâåí %d.\n", average);
For(highest = score[0], i = 1; i < NUM; i++).
if(score[i] > highest) /* êàêàÿ èç âåëè÷èí áîëüøå*/
highest = score[i];
Printf(" Ìàêñèìàëüíûé ðåçóëüòàò ðàâåí %d.\n", highest);
}
Ìû çàìåíèëè ÷èñëî 10 ñèìâîëè÷åñêîé êîíñòàíòîé è âîñïîëüçîâàëèñü òåì, ÷òî âûðàæåíèÿ i <=(NUM-1) è i < NUM ýêâèâàëåíòíû.
Äàâàéòå ñíà÷àëà ïîñìîòðèì, êàê ýòî ïðîãðàììà ðàáîòàåò, à çàòåì ñäåëàåì íåñêîëüêî çàìå÷àíèé.
Óêàæèòå 10 ðåçóëüòàòîâ:
76 85 62 48 98 71 66 89 70 77.
Ââåäåíû ñëåäóþùèå ðåçóëüòàòû:
76 85 62 48 98 71 66 89 70 77.
Ñðåäíèé ðåçóëüòàò ðàâåí 74. Ìàêñèìàëüíûé ðåçóëüòàò ðàâåí 98.
Ïåðâûé ìîìåíò, êîòîðûé íåîáõîäèìî îòìåòèòü, ñîñòîèò â òîì, ÷òî ìû èñïîëüçîâàëè ÷åòûðå ðàçëè÷íûõ öèêëà for. Âàñ ìîæåò çàèíòåðåñîâàòü âîïðîñ: ÿâëÿåòñÿ ëè ýòî íà ñàìîì äåëå íåîáõîäèìûì èëè ìû ìîæåì íåêîòîðûå èç äàííûõ îïåðàöèé îáúåäèíèòü â îäíîì öèêëå? Òàêàÿ âîçìîæíîñòü ñóùåñòâóåò, è îíà ïîçâîëèëà áû ñäåëàòü ïðîãðàììó áîëåå êîìïàêòíîé. Îäíàêî ìû ïîáîÿëèñü ñëåäîâàòü òàêîìó ïîäõîäó (âèäèòå, êàêèå ìû âïå÷àòëèòåëüíûå ëþäè!), ïîñêîëüêó ýòî ïðîòèâîðå÷èò ïðèíöèïó ìîäóëüíîñòè. Ñìûñë, çàêëþ÷åííûé â äàííîé ôðàçå, ñîñòîèò â òîì, ÷òî ïðîãðàììà äîëæíà áûòü ðàçáèòà íà îòäåëüíûå åäèíèöû, èëè "ìîäóëè", ïðè÷åì êàæäûé èç íèõ äîëæåí âûïîëíÿòü îäíó çàäà÷ó. (Íàøà çàïèñü íà ïñåâäîêîäå îòðàæàåò äåëåíèå ïðîãðàììû íà ÷åòûðå ìîäóëÿ.) Òàêîå ðàçáèåíèå îáëåã÷àåò ÷òåíèå òåêñòà ïðîãðàììû. Âîçìîæíî, åùå áîëåå âàæíûì ÿâëÿåòñÿ òî, ÷òî åñëè îòäåëüíûå ÷àñòè ïðîãðàììû íå ïåðåìåøàíû, åå êîððåêöèÿ èëè ìîäèôèêàöèÿ óïðîùàþòñÿ. Äëÿ ýòîãî íåîáõîäèìî òîëüêî èñêëþ÷èòü èç ïðîãðàììû òðåáóåìûé ìîäóëü, çàìåíèòü åãî íîâûì, à îñòàâøóþñÿ ÷àñòü ïðîãðàììû íå èçìåíÿòü.
ÏÐÎÁËÅÌÀ ÂÂÎÄÀ.
Ñóùåñòâóåò íåñêîëüêî ñïîñîáîâ ïîñëåäîâàòåëüíîãî ââîäà íàáîðà äàííûõ, ñêàæåì ÷èñåë. Ìû îáñóäèì çäåñü íåêîòîðûå èç íèõ, ïåðåõîäÿ îò ìåíåå óäîáíûõ ê áîëåå óäîáíûì.
Âîîáùå ãîâîðÿ, íàèìåíåå óäîáíûé ñïîñîá - ýòî òîò, êîòîðûé ìû òîëüêî ÷òî èñïîëüçîâàëè; íàïèñàíèå ïðîãðàììû, äîïóñêàþùåé ââîä ôèêñèðîâàííîãî ÷èñëà ýëåìåíòîâ äàííûõ. (Òàêîé ñïîñîá, îäíàêî, ïðåêðàñíî ïîäõîäèò äëÿ òåõ ñèòóàöèé, êîãäà ÷èñëî âõîäíûõ äàííûõ íèêîãäà íå èçìåíÿåòñÿ.) Åñëè ÷èñëî âõîäíûõ ýëåìåíòîâ äàííûõ èçìåíÿåòñÿ, íåîáõîäèìî îñóùåñòâèòü ïîâòîðíóþ êîìïèëÿöèþ ïðîãðàììû.
Ñëåäóþùèé øàã ñîñòîèò â òîì, ÷òîáû ñïðîñèòü ó ïîëüçîâàòåëÿ, ñêîëüêî ýëåìåíòîâ äàííûõ áóäåò ââåäåíî. Òàê êàê ðàçìåð ìàññèâà â ïðîãðàììå ôèêñèðîâàí, îíà äîëæíà ïðîâåðèòü, íå ïðåâûøàåò ëè âåëè÷èíà, ñîäåðæàùàÿñÿ â îòâåòå ïîëüçîâàòåëÿ, ðàçìåð ìàññèâà. Çàòåì ïîëüçîâàòåëü ìîæåò íà÷àòü ââîä äàííûõ. Òîãäà íà÷àëî íàøåé ïðîãðàììû ìîæíî ïåðåïèñàòü ñëåäóþùèì îáðàçîì:
Printf(" Ñêîëüêî ýëåìåíòîâ äàííûõ âû áóäåòå ââîäèòü ?\n");
Scanf(" %d", &nbr);
While(nbr > NUM).
{
Printf("ß ñìîãó îáðàáàòûâàòü íå áîëüøå %d ýëåìåíòîâ; ïîæàëóéñòà, óêàæèòå");
Printf("ìåíüøóþ âåëè÷èíó.\n", NUM);
Scanf("%d", &nbr);
}
/* ãàðàíòèðóåò,
×òî nbr <= NUM - ìàêñèìàëüíîãî ðàçìåðà ìàññèâà */
For(i = 0; i <nbr; i++).
scanf("%d", &score[i]);
Ìû ìîæåì ïðîäîëæèòü äâèæåíèå â ýòîì íàïðàâëåíèè, çàìåíÿÿ â êàæäîì ñëó÷àå ñèìâîëè÷åñêóþ êîíñòàíòó NUM â ïðîãðàììå (èñêëþ÷àÿ íàëè÷èå åå â äèðåêòèâå #define è â îïèñàíèè ìàññèâà) ïåðåìåííîé nbr. Ïðè òàêîì ñïîñîáå ðàçëè÷íûå îïåðàöèè áóäóò âûïîëíÿòüñÿ òîëüêî íàä òåìè ýëåìåíòàìè ìàññèâà, â êîòîðûå ââåäåíû äàííûå.
Íåäîñòàòêîì óêàçàííîãî ïîäõîäà ÿâëÿåòñÿ ëåæàùåå â åãî îñíîâå ïðåäïîëîæåíèå, ÷òî ïîëüçîâàòåëü íå îøèáàåòñÿ ïðè ïîäñ÷åòå ýëåìåíòîâ; åñëè æå ïðè ïðîãðàììèðîâàíèè ïîëàãàòüñÿ íà òî, ÷òî ïîëüçîâàòåëü âñåãäà âñå äåëàåò ïðàâèëüíî, ïðîãðàììû îêàçûâàþòñÿ íåíàäåæíûìè.
Ýòî ïîäâîäèò íàñ ê ñëåäóþùåìó ìåòîäó, ïðè êîòîðîì â ïðîãðàììå îñóùåñòâëÿåòñÿ ïîäñ÷åò êîëè÷åñòâà ââîäèìûõ ÷èñåë. Ïîñëå âñåãî ñêàçàííîãî âûøå î÷åâèäíî, ÷òî ó êîìïüþòåðîâ èìåþòñÿ äëÿ ýòîãî âåñ âîçìîæíîñòè. Îñíîâíàÿ ïðîáëåìà çäåñü ñîñòîèò â òîì, êàê ñîîáùèòü êîìïüþòåðó î çàâåðøåíèè ââîäà ÷èñåë. Îäèí èç ìåòîäîâ - äàòü ïîëüçîâàòåëþ âîçìîæíîñòü ââîäèòü ñïåöèàëüíûé ïðèçíàê, óêàçûâàþùèé íà êîíåö ââîäà. Ïðèçíàê äîëæåí ïðèíàäëåæàòü ê äàííûì òîãî æå òèïà, ÷òî è îñòàëüíûå ââîäèìûå äàííûå, òàê êàê îí äîëæåí áûòü ïðî÷èòàí òåì æå îïåðàòîðîì ïðîãðàììû. Íî ïðè ýòîì îí äîëæåí îòëè÷àòüñÿ îò îáû÷íûõ äàííûõ. Ê ïðèìåðó, åñëè áû ìû ââîäèëè ðåçóëüòàòû èãðû, ÷òîáû óçíàòü, êòî íàáðàë îò 0 äî 100 î÷êîâ, ìû íå ìîãëè áû âûáðàòü ÷èñëî 74 â êà÷åñòâå òàêîãî ïðèçíàêà, ïîòîìó ÷òî îíî ìîæåò ñîîòâåòñòâîâàòü íåêîòîðîìó âîçìîæíîìó ðåçóëüòàòó. Ñ äðóãîé ñòîðîíû, íàïðèìåð, ÷èñëî 999 èëè - 3 âïîëíå ìîãëî áû ïîäîéòè â êà÷åñòâå òàêîãî ïðèçíàêà, ïîñêîëüêó îíî íå ñîîòâåòñòâóåò òðåáóåìîìó ðåçóëüòàòó.
Íèæå ïðèâîäèòñÿ ïðîãðàììà, ÿâëÿþùàÿñÿ ðåàëèçàöèåé ýòîãî ìåòîäà:
#define STOP 999 /* ïðèçíàê çàâåðøåíèÿ ââîäà */
#define NUM 50.
Main( ).
{
Int i, count, temp, score [NUM];
Printf(" Íà÷íèòå ââîä ðåçóëüòàòîâ. Ââåäèòå 999 äëÿ óêàçàíèÿ \n");
Printf(" êîíöà ââîäà. Ìàêñèìàëüíîå ÷èñëî ðåçóëüòàòîâ, êîòîðîå âû\n");
Printf(" ìîæåòå ââåñòè.- ýòî %d.\n", NUM);
Count = 0;
Scanf(" %d", &temp); /* ââîäâåëè÷èíû*/
While(temp != STOP && count <= NUM) /* ïðîâåðêà íàëè÷èÿ ïðèçíàêà STOP */
{ /* è ïðîâåðêà, íå ïðîèçîøëî ëè ïðåâûøåíèÿ ðàçìåðà ìàññèâà */
Score[count++] = temp;
/* çàïèñü âåëè÷èíû â ïàìÿòü è êîððåêöèÿ ñ÷åò÷èêà */
If(count < NUM + 1).
scanf("%d", &temp); /* ââîä î÷åðåäíîãî ðåçóëüòàòà */
Else.
printf("ß íå ìîãó ïðèíÿòü áîëüøå äàííûõ.\n");
}
Printf("Âû ââåëè %d ðåçóëüòàòîâ, à èìåííî:\n", count);
For(i = 0; i < count; i++).
printf("%5d\n", scorc[i]);
}
Ìû ââîäèì äàííûå âî âðåìåííóþ ïåðåìåííóþ temp è ïðèñâàèâàåì åå çíà÷åíèå ñîîòâåòñòâóþùåìó ýëåìåíòó ìàññèâà òîëüêî â òîì ñëó÷àå, åñëè îíî íå ÿâëÿåòñÿ ïðèçíàêîì êîíöà ââîäà. Ñîâåðøåííî íå îáÿçàòåëüíî ðåàëèçîâûâàòü âñå èìåííî òàê; ìû ïðîñòî ñ÷èòàåì, ÷òî óêàçàííûé ñïîñîá äåëàåò ïðîöåññ ïðîâåðêè íåñêîëüêî áîëåå íàãëÿäíûì.
Îáðàòèòå âíèìàíèå íà òî, ÷òî ïðîâåðÿåòñÿ âûïîëíåíèå äâóõ óñëîâèé: ïðî÷èòàí ëè ïðèçíàê êîíöà ââîäà è åñòü ëè ìåñòî â ìàññèâå äëÿ ñëåäóþùåãî ÷èñëà. Åñëè ìû çàïîëíèëè ìàññèâ äàííûìè äî òîãî, êàê óêàçàëè ïðèçíàê êîíöà ââîäà, ïðîãðàììà âåæëèâî ñîîáùàåò íàì îá ýòîì è ïðåêðàùàåò ââîä äàííûõ.
Çàìåòüòå òàêæå, ÷òî ìû âîñïîëüçîâàëèñü ïîñòôèêñíîé ôîðìîé îïåðàöèè óâåëè÷åíèÿ. Ïîýòîìó, êîãäà çíà÷åíèå count ðàâíî 0, ýëåìåíòó ìàññèâà score[0] ïðèñâàèâàåòñÿ âåëè÷èíà ïåðåìåííîé temp, à çàòåì count âîçðàñòàåò íà 1. Ïîñëå êàæäîé èòåðàöèè öèêëà while âåëè÷èíà ñ÷åò÷èêà count ñòàíîâèòñÿ íà åäèíèöó áîëüøå ïîñëåäíåãî èñïîëüçîâàííîãî èíäåêñà ìàññèâà. Ýòî êàê ðàç òî, ÷òî íàì íóæíî, ïîñêîëüêó score[0] - ïåðâûé ýëåìåíò, score[20] - 2-é ýëåìåíò è ò. ä. Êîãäà ðàáîòà öèêëà â ïðîãðàììå çàâåðøàåòñÿ, çíà÷åíèå count îêàçûâàåòñÿ ðàâíûì ïîëíîìó ÷èñëó ïðî÷èòàííûõ ýëåìåíòîâ äàííûõ. Çàòåì âåëè÷èíà count èñïîëüçóåòñÿ â êà÷åñòâå âåðõíåé ãðàíèöû ÷èñëà èòåðàöèé äëÿ ïîñëåäóþùèõ öèêëîâ.
Ýòîò àëãîðèòì õîðîøî ðàáîòàåò, ïîêà ó íàñ èìååòñÿ çàïàñ òàêèõ ÷èñåë, êîòîðûå íèêîãäà íå áóäóò ââîäèòüñÿ êàê äàííûå. Íî ÷òî äåëàòü, åñëè ìû çàõîòèì èìåòü ïðîãðàììó, äîïóñêàþùóþ ââîä â êà÷åñòâå äàííûõ ëþáûõ ÷èñåë, îòíîñÿùèõñÿ ê íåêîòîðîìó îïðåäåëåííîìó òèïó?  òàêîì ñëó÷àå ìû íå ñìîæåì èñïîëüçîâàòü íè îäíî èç ÷èñåë êàê ïðèçíàê êîíöà ââîäà.
Ìû ñòîëêíóëèñü ñ àíàëîãè÷íîé ïðîáëåìîé, êîãäà èñêàëè ïîäõîäÿùèé ñèìâîë äëÿ ïðèçíàêà End-of-File. Òîãäà áûëî ïðèíÿòî ðåøåíèå èñïîëüçîâàòü äëÿ ââîäà ñèìâîëîâ ñïåöèàëüíóþ ôóíêöèþ(getchar( )), êîòîðàÿ ïðè îáðàùåíèè ê íåé ôàêòè÷åñêè âîçâðàùàëà âåëè÷èíó òèïà int. Ýòî ïîçâîëÿëî ôóíêöèè ÷èòàòü "ñèìâîë" EOF, êîòîðûé íà ñàìîì äåëå íå áûë îáû÷íûì ñèìâîëîì.  ðàññìàòðèâàåìîì íàìè ïðèìåðå ïîëåçíîé îêàçàëàñü áû ôóíêöèÿ, êîòîðàÿ îñóùåñòâëÿëà áû ââîä öåëûõ ÷èñåë, ìîãëà áû, êðîìå òîãî, ÷èòàòü äàííûå íå òîëüêî öåëîãî òèïà, íî è èñïîëüçîâàòü èõ â êà÷åñòâå ïðèçíàêà êîíöà ââîäà.
Ìû ìîæåì îäíîâðåìåííî è îáðàäîâàòü è îãîð÷èòü âàñ: òàêîå ðåøåíèå îêàçûâàåòñÿ âîçìîæíûì, íî âû äîëæíû óçíàòü íåñêîëüêî áîëüøå î ðàáîòå ôóíêöèé; ïîýòîìó îáñóæäåíèå äàííîé èäåè îòêëàäûâàåòñÿ äî ãë. 10.
ÐÅÇÞÌÅ.
Îñíîâíîé òåìîé äàííîé ãëàâû áûëî îáñóæäåíèå âîçìîæíîñòåé óïðàâëåíèÿ õîäîì âûïîëíåíèÿ ïðîãðàììû. ßçûê Ñè ïðåäîñòàâëÿåò ìíîãî ñðåäñòâ äëÿ ñòðóêòóðèðîâàíèÿ ïðîãðàìì. Ñ ïîìîùüþ îïåðàòîðîâ while è for ðåàëèçóþòñÿ öèêëû ñ ïðåäóñëîâèåì. Âòîðîé îïåðàòîð îñîáåííî ïîäõîäèò äëÿ öèêëîâ, âêëþ÷àþùèõ â ñåáÿ èíèöèàëèçàöèþ è êîððåêöèþ ïåðåìåííîé. Èñïîëüçîâàíèå îïåðàöèè "çàïÿòàÿ" â öèêëå for ïîçâîëÿåò èíèöèàëèçèðîâàòü è êîððåêòèðîâàòü áîëåå îäíîé ïåðåìåííîé. Äëÿ òåõ ðåäêèõ ñëó÷àåâ, êîãäà òðåáóåòñÿ èñïîëüçîâàòü öèêë ñ ïîñòóñëîâèåì, ÿçûê Ñè ïðåäîñòàâëÿåò îïåðàòîð do while. Îïåðàòîðû break, continue è goto îáåñïå÷èâàþò äîïîëíèòåëüíûå âîçìîæíîñòè óïðàâëåíèÿ õîäîì âûïîëíåíèÿ ïðîãðàììû.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Òðè òèïà öèêëîâ â ÿçûêå Ñè: while, for è do while.
Ðàçëè÷èå ìåæäó öèêëàìè ñ ïðåäóñëîâèåì è ñ ïîñòóñëîâèåì.
Ïî÷åìó öèêëû ñ ïðåäóñëîâèåì èñïîëüçóþòñÿ ãîðàçäî ÷àùå, ÷åì öèêëû ñ ïîñòóñëîâèåì.
Äîïîëíèòåëüíûå îïåðàöèè ïðèñâàèâàíèÿ: += -= *= /= %=.
Êàê ïîëüçîâàòüñÿ îïåðàöèåé "çàïÿòàÿ".
Êîãäà èñïîëüçîâàòü îïåðàòîðû break è continue: ïî âîçìîæíîñòè ðåäêî.
Êîãäà èñïîëüçîâàòü îïåðàòîð goto: êîãäà âû õîòèòå èìåòü íåóäîáíûå, òðóäíûå äëÿ ïîíèìàíèÿ ïðîãðàììû.
Êàê èñïîëüçîâàòü îïåðàòîð while äëÿ çàùèòû ïðîãðàììû îò îøèáîê ïðè ââîäå äàííûõ.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. Îïðåäåëèòå çíà÷åíèå ïåðåìåííîé quack ïîñëå âûïîëíåíèÿ êàæäîãî îïåðàòîðà èç ïðèâåäåííîé íèæå èõ ïîñëåäîâàòåëüíîñòè.
int quack = 2;
quack + = 5;
quack * = 10;
quack - = 6;
quack / = 8;
quack % = 3;
2. ×òî áóäåò ïîëó÷åíî íà âûõîäå â ðåçóëüòàòå ðàáîòû ñëåäóþùåãî öèêëà?
for(value = 36; value > 0; value /= 2) printf("%3d", value);
3. Êàê ìîæíî ìîäèôèöèðîâàòü îïåðàòîðû if â ïðîãðàììå óãàäûâàíèå ÷èñëà2 ÷òîáû áûë âîçìîæåí ââîä êàê ïðîïèñíûõ, òàê è ñòðî÷íûõ áóêâ?
4. Ìû ïîäîçðåâàåì, ÷òî ñëåäóþùàÿ ïðîãðàììà íå ñîâñåì ïðàâèëüíàÿ. Êàêèå îøèáêè âû ñìîæåòå â íåé îáíàðóæèòü?
Main( ) /* ñòðîêà 1 */
{ /* ñòðîêà 2 */
Int i, j, lisl[10]; /* ñòðîêà 3 */
For (i = 1, i < = 10, i++ ) /* ñòðîêà 5 */
{ /* ñòðîêà 6 */
List[i] = 2*i + 3; /* ñòðîêà 7 */
For(j = 1, j >= i, j++ ) /* ñòðîêà 8 */
Printf(" %d \n", lisl[j]); /* ñòðîêà 9 */
} /* ñòðîêà 10 */
5. Âîñïîëüçóéòåñü ïëîæåííûìè öèêëàìè ïðè íàïèñàíèè ïðîãðàììû, âûâîäÿùåé íà ïå÷àòü ñëåäóþùóþ ôèãóðó:
$$$$$$$$ $$$$$$$$ $$$$$$$$ $$$$$$$$
6. Íàïèøèòå ïðîãðàììó, êîòîðàÿ ñîçäàåò ìàññèâ èç 26 ýëåìåíòîâ è ïîìåùàåò â íåãî 26 ñòðî÷íûõ áóêâ.
Îòâåòû.
1. 2, 7, 70, 64, 8, 2.
2. 36 18 9 4 2 1.
Âñïîìíèòå, êàê âûïîëíÿåòñÿ äåëåíèå öåëûõ ÷èñåë. Ðåçóëüòàòîì äåëåíèÿ 1 íà 2 áóäåò 0, ïîýòîìó ðàáîòà öèêëà çàâåðøèòñÿ ïîñëå òîãî, êàê ïåðåìåííàÿ value ñòàíåò ðàâíîé 1.
3. if(response == 'á' || response == 'Á').
4. ñòðîêà 3: äîëæíî áûòü list[10].
ñòðîêà 5: âìåñòî çàïÿòûõ äîëæíû ñòîÿòü ñèìâîëû "òî÷êà ñ çàïÿòîé".
ñòðîêà 5: ïåðåìåííàÿ i äîëæíà èçìåíÿòüñÿ â äèàïàçîíå îò 0 äî 9, à íå îò 1 äî 10.
ñòðîêà 8: âìåñòî çàïÿòûõ äîëæíû ñòîÿòü ñèìâîëû "òî÷êà ñ çàïÿòîé".
ñòðîêà 8: çíàê >= äîëæåí áûòü çàìåíåí íà <=.  ïðîòèâíîì ñëó÷àå ïðè çíà÷åíèè i, ðàâíîì 1, öèêë íèêîãäà íå çàâåðøèòñÿ.
ñòðîêà 10: ìåæäó ñòðîêàìè 9 è 10 äîëæíà íàõîäèòüñÿ åùå îäíà çàêðûâàþùàÿ ôèãóðíàÿ ñêîáêà. Îäíà ñêîáêà çàêðûâàåò ñîñòàâíîé îïåðàòîð, à äðóãàÿ òåëî ïðîãðàììû.
5.
Main( )6.
{ int i, j;
For(i = 1; i <= 4; i++).
{
For( j = 1; j <= 8; j++).
Printf("$");
}
Printf("\N");
}
Main( ).
{ int i;
Char ch, alpha[26];
For(i = 0, ch = 'a'; i <= 26; i++, ch++).
Alpha[i] == ch;
ÓÏÐÀÆÍÅÍÈß.
1. Ìîäèôèöèðóéòå ïðîãðàììó óãàäûâàíèå ÷èñëà2 â ñîîòâåòñòâèè ñ íàøèìè ïðåäïîëîæåíèÿìè îá óëó÷øåíèè åå ðàáîòû.
2. Ðåàëèçóéòå íàøå ïðåäëîæåíèå î ïîâûøåíèè ýôôåêòèâíîñòè ðàáîòû ïðîãðàììû íàõîæäåíèÿ ïðîñòûõ ÷èñåë.
3. Âîñïîëüçóéòåñü âëîæåííûìè öèêëàìè ïðè íàïèñàíèè ïðîãðàììû, âûâîäÿùåé íà ïå÷àòü ñëåäóþùóþ ôèãóðó:
$
$$
$$$
$$$$
$$$$$
9. Êàê ïðàâèëüíî ïîëüçîâàòüñÿ ôóíêöèÿìè.
ÔÓÍÊÖÈÈ.
ÑÒÐÎÈÒÅËÜÍÛÅ ÁËÎÊÈ ÏÐÎÃÐÀÌÌÛ.
ÑÂßÇÜ ÌÅÆÄÓ ÔÓÍÊÖÈßÌÈ: ÀÐÃÓÌÅÍÒÛ, ÓÊÀÇÀÒÅËÈ, ÂÎÇÂÐÀÒ ÇÍÀ×ÅÍÈß.
ÒÈÏÛ ÔÓÍÊÖÈÉ.
ÊËÞ×ÅÂÎÅ ÑËÎÂÎ return.
Ïðèíöèïû ïðîãðàììèðîâàíèÿ íà ÿçûêå Ñè îñíîâàíû íà ïîíÿòèè ôóíêöèè.  ïðåäñòàâëåííûõ ðàíåå ïðèìåðàõ ïðîãðàììèðîâàíèÿ ìû óæå âîñïîëüçîâàëèñü íåñêîëüêèìè ôóíêöèÿìè: printf( ), scanf( ), getchar( ), putchar( ) è strlen( ). Ýòè ôóíêöèè ÿâëÿþòñÿ ñèñòåìíûìè, îäíàêî ìû ñîçäàëè è íåñêîëüêî ñâîèõ ñîáñòâåííûõ ôóíêöèé ïîä îáùèì èìåíåì main( ). Âûïîëíåíèå ïðîãðàììû âñåãäà íà÷èíàåòñÿ ñ êîìàíä, ñîäåðæàùèõñÿ â ôóíêöèè main( ), çàòåì ïîñëåäíÿÿ âûçûâàåò äðóãèå ôóíêöèè, íàïðèìåð getchar( ). Òåïåðü ìû ïåðåõîäèì ê âîïðîñó î òîì, êàê ñîçäàâàòü ñâîè ñîáñòâåííûå ôóíêöèè í äåëàòü èõ äîñòóïíûìè äëÿ ôóíêöèè main( ), à òàêæå äðóã äëÿ äðóãà.
Âî-ïåðâûõ, ÷òî òàêîå ôóíêöèÿ? Ôóíêöèÿ - ñàìîñòîÿòåëüíàÿ åäèíèöà ïðîãðàììû, ñïðîåêòèðîâàííàÿ äëÿ ðåàëèçàöèè êîíêðåòíîé çàäà÷è. Ôóíêöèè â ÿçûêå Ñè èãðàþò òó æå ðîëü, êàêóþ èãðàþò ôóíêöèè, ïîäïðîãðàììû è ïðîöåäóðû â äðóãèõ ÿçûêàõ, õîòÿ äåòàëè èõ ñòðóêòóðû ìîãóò áûòü ðàçíûìè. Âûçîâ ôóíêöèè ïðèâîäèò ê âûïîëíåíèþ íåêîòîðûõ äåéñòâèè. Íàïðèìåð, ïðè îáðàùåíèè ê ôóíêöèè printf( ) îñóùåñòâëÿåòñÿ âûâîä äàííûõ íà ýêðàí. Äðóãèå æå ôóíêöèè ïîçâîëÿþò ïîëó÷àòü íåêîòîðóþ âåëè÷èíó, èñïîëüçóåìóþ çàòåì â ïðîãðàììå. Ê ïðèìåðó, ôóíêöèÿ strlen( ) "ñîîáùàåò" ïðîãðàììå äëèíó êîíêðåòíîé ñòðîêè.  îáùåì ôóíêöèè ìîãóò âûïîëíÿòü äåéñòâèÿ è ïîëó÷àòü çíà÷åíèÿ âåëè÷èí, èñïîëüçóåìûõ â ïðîãðàììå.
Ïî÷åìó ìû ïîëüçóåìñÿ ôóíêöèÿìè? Âî-ïåðâûõ, îíè èçáàâëÿþò íàñ îò ïîâòîðíîãî ïðîãðàììèðîâàíèÿ. Åñëè êîíêðåòíóþ çàäà÷ó íåîáõîäèìî âûïîëíèòü â ïðîãðàììå íåñêîëüêî ðàç, ìû íàïèøåì ñîîòâåòñòâóþùóþ ôóíêöèþ òîëüêî îäèí ðàç, à çàòåì áóäåì âûçûâàòü åå âñåãäà, êîãäà ýòî òðåáóåòñÿ. Âî-âòîðûõ, ìû ìîæåì ïðèìåíÿòü îäíó ôóíêöèþ, íàïðèìåð putchar( ), â ðàçëè÷íûõ ïðîãðàììàõ. Äàæå â òîì ñëó÷àå, åñëè íåêîòîðàÿ çàäà÷à âûïîëíÿåòñÿ òîëüêî â îäíîé ïðîãðàììå, ëó÷øå îôîðìèòü åå ðåøåíèå â âèäå ôóíêöèè, ïîñêîëüêó ôóíêöèè ïîâûøàþò óðîâåíü ìîäóëüíîñòè ïðîãðàììû è, ñëåäîâàòåëüíî, îáëåã÷àþò åå ÷òåíèå, âíåñåíèå èçìåíåíèé è êîððåêöèþ îøèáîê. Ïðåäïîëîæèì, íàïðèìåð, ÷òî ìû õîòèì íàïèñàòü ïðîãðàììó, êîòîðàÿ äåëàåò ñëåäóþùåå: ââîäèò íàáîð ÷èñåë ñîðòèðóåò, ýòè ÷èñëà, íàõîäèò èõ ñðåäíåå, âûâîäèò íà ïå÷àòü ãèñòîãðàììó.
Ñîîòâåòñòâóþùóþ ïðîãðàììó ìîæíî çàïèñàòü òàê:
Main( ).
{
Float list [50];
Readlist(list);
Sort(list);
Average(list);
Bargrapli(list);
}
Ðàçóìååòñÿ, ìû äîëæíû áûëè áû çàïðîãðàììèðîâàòü ÷åòûðå ôóíêöèè readlist( ), sort( ), average( ) è bargraph( ), íî... ýòî óæå äåòàëè. Èñïîëüçóÿ ñìûñëîâûå èìåíà ôóíêöèè, ìû ÷åòêî îïðåäåëÿåì, ÷òî ïðîãðàììà äåëàåò è êàê îíà îðãàíèçîâàíà. Ïîñëå ýòîãî ìîæíî çàíèìàòüñÿ êàæäîé ôóíêöèåé îòäåëüíî è ñîâåðøåíñòâîâàòü åå äî òåõ ïîð, ïîêà îíà íå áóäåò ïðàâèëüíî âûïîëíÿòü òðåáóåìóþ çàäà÷ó. Äîïîëíèòåëüíîå ïðåèìóùåñòâî óêàçàííîãî ïîäõîäà çàêëþ÷àåòñÿ â òîì, ÷òî åñëè ìû ñîçäàäèì ôóíêöèè äîñòàòî÷íî îáùåãî âèäà, òî èõ ìîæíî áóäåò èñïîëüçîâàòü è â äðóãèõ ïðîãðàììàõ.
Ìíîãèå ïðîãðàììèñòû ïðåäïî÷èòàþò äóìàòü î ôóíêöèè, êàê î "÷åðíîì ÿùèêå"; îíè çàäàþò åå ÷åðåç ïîñòóïàþùóþ èíôîðìàöèþ (âõîä) è ïîëó÷åííûå ðåçóëüòàòû (âûõîä). Âñå, ÷òî ïðîèñõîäèò âíóòðè ÷åðíîãî ÿùèêà, èõ íå êàñàåòñÿ äî òåõ ïîð, ïîêà íå íóæíî ïèñàòü ïðîãðàììó, ðåàëèçóþùóþ ýòó ôóíêöèþ. Êîãäà ìû èñïîëüçóåì, íàïðèìåð, ôóíêöèþ printf( ), ìû çíàåì, ÷òî äîëæíû ïåðåäàòü åé óïðàâëÿþùóþ ñòðîêó è âîçìîæíî, íåñêîëüêî àðãóìåíòîâ. Ìû çíàåì òàêæå ðåçóëüòàò âû çîâà ôóíêöèé printf( ). He íóæíî ïîëàãàòü, ÷òî ïðè ïðîãðàììèðîâàíèè âàì ïðèäåòñÿ çàíèìàòüñÿ ñîçäàíèåì ôóíêöèè printf( ). Èñïîëüçîâàíèå ôóíêöèé óêàçàííûì âûøå ñïîñîáîì ïîçâîëÿåò ñêîíöåíòðèðîâàòü âíèìàíèå íà îáøåé ñòðóêòóðå ïðîãðàììû, à íå íà äåòàëÿõ.
×òî íàì òðåáóåòñÿ çíàòü î ôóíêöèÿõ? Íóæíî çíàòü, êàê èõ ìîæíî îïðåäåëÿòü, êàê ê íèì îáðàùàòüñÿ è êàê óñòàíàâëèâàòü ñâÿçè ìåæäó ôóíêöèåé è ïðîãðàììîé, åå âûçûâàþùåé. ×òîáû èçó÷èòü ýòî, ìû ðàññìîòðèì î÷åíü ïðîñòîè ïðèìåð, à çàòåì áóäåì îáîáùàòü åãî, ââîäÿ äîïîëíèòåëüíûå õàðàêòåðèñòèêè äî òåõ ïîð, ïîêà íå ïîëó÷èì ïîëíóþ è ÿñíóþ êàðòèíó.
ÑÎÇÄÀÍÈÅ È ÈÑÏÎËÜÇÎÂÀÍÈÅ ÏÐÎÑÒÎÉ ÔÓÍÊÖÈÈ.
Íàøà ïåðâàÿ ñêðîìíàÿ öåëü - ñîçäàíèå ôóíêöèè, êîòîðàÿ ïå÷àòàåò 65 ñèìâîëîâ * â ðÿä. ×òîáû ýòà ôóíêöèÿ âûïîëíÿëàñü â íåêîòîðîì êîíòåêñòå, ìû âêëþ÷èëè åå â ïðîãðàììó, êîòîðàÿ ïå÷àòàåò ïðîñòîé òèòóë ôèðìåííîãî áëàíêà. Íèæå ïðèâåäåíà ïîëíàÿ ñîîòâåòñòâóþùàÿ ïðîãðàììà. Îíà ñîñòîèò èç ôóíêöèè main( ) è starbar( ).
/* òèòóë ôèðìåííîãî áëàíêà! */
#define NAME "MEGATHINK, INC.".
#define ADDRESS "10 Megabuck Plaza".
#define PLACE "Megapolis, CA 94904".
Main( ).
{
Starbar( );
Printf("%s\n", NAME);
Printf(" %s\n", ADDRESS);
Printf("%s\n", PLACE);
Starbar( );
}
/* äàëåå ñëåäóåò ôóíêöèÿ starbar( ) */
#include.
#define LIMIT 65.
starbar( );
{
int count;
For (count = 1; count <= LIMIT; count++).
Putchar('*');
Putchar('\n');
}
Ðåçóëüòàò ðàáîòû ïðîãðàììû âûãëÿäèò òàê:
***********************************************************
MEGATHINK, INC 10 Megabuck Plaza Megapolis, CA 94904.
***********************************************************
Ïðè ðàññìîòðåíèè ýòîé ïðîãðàììû íåîáõîäèìî îáðàòèòü âíèìàíèå íà ñëåäóþùèå ìîìåíòû:
1. Ìû âûçâàëè ôóíêöèþ starbar( ) (èëè, ìîæíî ñêàçàòü, îáðàòèëèñü ê íåé) èç ôóíêöèè main( ), èñïîëüçóÿ òîëüêî åå èìÿ. Ýòî íåñêîëüêî íàïîìèíàåò çàêëèíàíèå, âûçûâàþùåå çëîãî äóõà, íî, âìåñòî òîãî ÷òîáû ÷åðòèòü ïÿòèóãîëüíèê, ìû ïîìåùàåì âñëåä çà èìåíåì ôóíêöèè òî÷êó ñ çàïÿòîé, ñîçäàâàÿ òàêèì îáðàçîì îïåðàòîð: starbar( );

ÐÈÑ. 9.1. Ñõåìà âûïîëíåíèÿ îïåðàòîðîâ ïðîãðàììû òèòóë "ôèðìåííîþ áëàíêà 1".
Ýòî îäíà èç ôîðì âûçîâà ôóíêöèè, íî äàëåêî íå åäèíñòâåííàÿ. Êîãäà â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû êîìïüþòåð äîñòèãàåò îïåðàòîðà starbar( ), îí íàõîäèò óêàçàííóþ ôóíêöèþ, ïîñëå ÷åãî íà÷èíàåò âûïîëíÿòü ñîîòâåòñòâóþùèå åé êîìàíäû. Çàòåì óïðàâëåíèå âîçâðàùàåòñÿ ñëåäóþùåé ñòðîêå "âûçûâàþùå" ïðîãðàììû" - â äàííîì ñëó÷àå main( ).
2. Ïðè íàïèñàíèè ôóíêöèè starbar( ) ìû ñëåäîâàëè òåì æå ïðàâèëàì, ÷òî è ïðè íàïèñàíèè main( ): âíà÷àëå óêàçûâàåòñÿ èìÿ, çàòåì èäåò îòêðûâàþùàÿ ôèãóðíàÿ ñêîáêà, ïðèâîäèòñÿ îïèñàíèå èñïîëüçóåìûõ ïåðåìåííûõ, äàþòñÿ îïåðàòîðû, îïðåäåëÿþùèå ðàáîòó ôóíêöèè, è, íàêîíåö, çàêðûâàþùàÿ ôèãóðíàÿ ñêîáêà. Ìû äàæå ïîìåñòèëè ïåðåä îïèñàíèåì ôóíêöèè starbar( ) äèðåêòèâû #define è #include, òðåáóþùèåñÿ äëÿ íåå, à íå äëÿ ôóíêöèè main( ).
ÐÈÑ. 9.2. Ñòðóêòóðà ïðîñòîé ôóíêöèè.
3. Ìû âêëþ÷èëè ôóíêöèè starbar() è main() â îäèí ôàéë. Âîîáùå ãîâîðÿ, ìîæíî áûëî ñîçäàòü äâà îòäåëüíûõ ôàéëà. Îäèí ôàéë íåñêîëüêî óïðîùàåò êîìïèëÿöèþ, à äâà îòäåëüíûõ ôàéëà îáëåã÷àþò èñïîëüçîâàíèå îäíîé ôóíêöèè â ðàçíûõ ïðîãðàììàõ. Ñëó÷àé äâóõ è áîëåå ôàéëîâ ìû îáñóäèì ïîçæå, à ïîêà áóäåì äåðæàòü âñå íàøè ôóíêöèè â îäíîì ìåñòå. Çàêðûâàþùàÿ ôèãóðíàÿ ñêîáêà ôóíêöèè main( ) óêàçûâàåò êîìïèëÿòîðó íà ñå êîíåö. Êðóãëûå ñêîáêè â èìåíè starbar( ) ãîâîðÿò î òîì, ÷òî starbar( ) - ýòî ôóíêöèÿ. Îáðàòèòå âíèìàíèå, ÷òî çäåñü çà èìåíåì starbar( ) íå ñëåäóåò ñèìâîë "òî÷êà ñ çàïÿòîé"; åãî îòñóòñòâèå ñëóæèò óêàçàíèåì êîìïèëÿòîðó, ÷òî ìû îïðåäåëÿåì ôóíêöèþ starbar( ), à íå èñïîëüçóåì åå.
Åñëè ðàññìàòðèâàòü ôóíêöèþ starbar( ) êàê ÷åðíûé ÿùèê, òî åå âûõîä - ýòî íàïå÷àòàííàÿ ñòðîêà, ñîñòîÿùàÿ èç ñèìâîëîâ *. Êàêèå áû òî íè áûëî äàííûå íà âõîäå ó íåå îòñóòñòâóþò, ïîòîìó ÷òî åé íå íóæíî èñïîëüçîâàòü èíôîðìàöèþ èç âûçûâàþùåé ïðîãðàììû. Âîîáùå, ýòîé ôóíêöèè íå òðåáóåòñÿ ñâÿçü ñ âûçûâàþùåé ïðîãðàììîé. Îáðàòèìñÿ ê ñëó÷àþ, êîãäà òàêàÿ ñâÿçü íåîáõîäèìà.
ÀÐÃÓÌÅÍÒÛ ÔÓÍÊÖÈÈ.
Òèòóë ôèðìåííîãî áëàíêà âûãëÿäåë áû íåñêîëüêî ëó÷øå, åñëè áû òåêñò áûë ñäâèíóò ê öåíòðó. Ìû ñìîæåì ïîìåñòèòü òåêñò â öåíòðå, åñëè íàïå÷àòàåì íóæíîå ÷èñëî ïðîáåëîâ ïåðåä âûâîäîì òðåáóåìîé ñòðîêè. Âîñïîëüçóåìñÿ íåêîòîðîé ôóíêöèåé äëÿ ïå÷àòè ïðîáåëîâ. Íàøà ôóíêöèÿ space( ) (äàâàéòå íàçîâåì åå òàê) áóäåò î÷åíü íàïîìèíàòü ôóíêöèþ starbar( ), çà èñêëþ÷åíèåì òîãî, ÷òî íà ýòîò ðàç ìåæäó ôóíêöèåé main( ) è ôóíêöèåé space( ) äîëæíà áûòü óñòàíîâëåíà ñâÿçü, òàê êàê íåîáõîäèìî ñîîáùèòü ïîñëåäíåé ôóíêöèè î òðåáóåìîì ÷èñëå ïðîáåëîâ.
Ðàññìîòðèì ýòî áîëåå êîíêðåòíî.  ñòðîêå, ñîñòîÿùåé èç çâåçäî÷åê, 65 ñèìâîëîâ, à â ñòðîêå MEGATHINK, INC. - 15. Ïîýòîìó â íàøåì ïåðâîì âàðèàíòå ïðîãðàììû âñëåä çà ýòèì ñîîáùåíèåì øëî 50 ïðîáåëîâ. ×òîáû ñìåñòèòü òåêñò ê öåíòðó, íóæíî ñíà÷àëà íàïå÷àòàòü 25 ïðîáåëîâ, à ïîòîì òåêñò, â ðåçóëüòàòå ÷åãî ñëåâà è ñïðàâà îò äàííîé ôðàçû îêàæåòñÿ ïî 25 ïðîáåëîâ. Ñëåäîâàòåëüíî, íåîáõîäèìî èìåòü âîçìîæíîñòü ïåðåäàòü âåëè÷èíó "25" ôóíêöèè, ïå÷àòàþùåé ïðîáåëû. Ìû ïðèìåíÿåì òîò æå ñïîñîá, ÷òî è ïðè ïåðåäà÷å ñèìâîëà '*' ôóíêöèè putchar( ): èñïîëüçóåì àðãóìåíò. Òîãäà çàïèñü space(25) áóäåò îçíà÷àòü, ÷òî íåîáõîäèìî íàïå÷àòàòü 25 ïðîáåëîâ. 25 - ýòî àðãóìåíò. Ìû áóäåì âûçûâàòü ôóíêöèþ space( ) òðè ðàçà: îäèí ðàç äëÿ êàæäîé ñòðîêè àäðåñà. Âîò êàê âûãëÿäèò ýòà ïðîãðàììà:
/* òèòóë ôèðìåííîãî áëàíêà2 */
#define NAME "MEGATHINK, INC.".
#define ADDRESS "10 Megabuck Plaza".
#define PLACE "Mcgapolis, CA 94904".
Main( ).
{
Int spaces;
Starbar( );
Space(25); /* space( ) èñïîëüçóåò â êà÷åñòâå àðãóìåíòà êîíñòàíòó*/
Printf("%s\n", NAME);
Spaces = (65 - strlen(ADDRESS))/2;
/* ìû çàñòàâëÿåì ïðîãðàììó âû÷èñëÿòü, ñêîëüêî ïðîïóñòèòü ïðîáåëîâ */
Space(spaces); /* àðãóìåíòîì ÿâëÿåòñÿ ïåðåìåííàÿ */
Printf("%s\n", ADDRESS);
Space((65 - strlen(PLACE))/2); /* àðãóìåíòîì ÿâëÿåòñÿ âûðàæåíèå */
Printf(" %s \n", PLACE);
Starbar( );
}
/* îïðåäåëåíèå ôóíêöèè starbar( ) */
#include.
#define LIMIT 65.
Starbar( ).
{
Int count;
For (count = 1;count <= LIMIT;count++) putchar('*');
Putchar('\n');
}
/* îïðåäåëåíèå ôóíêöèè space( ) */
Space(number).
Int number; /* àðãóìåíò îïèñûâàåòñÿ ïåðåä ôèãóðíîé ñêîáêîé */
{
Int count /* äîïîëíèòåëüíàÿ ïåðåìåííàÿ îïèñûâàåòñÿ.
ïîñëå ôèãóðíîé ñêîáêè */
For (count = 1;count <= number;count++).
Putchar(' ');
}
ÐÈÑ. 9.3. Ïðîãðàììà, ïå÷àòàþùàÿ òèòóë ôèðìåííîãî áëàíêà.
Îáðàòèòå âíèìàíèå íà òî, êàê ìû ýêñïåðèìåíòèðîâàëè ïðè âû çîâàõ ôóíêöèè space( ): ìû çàäàâàëè àðãóìåíò òðåìÿ ðàçëè÷íûìè ñïîñîáàìè. ßâëÿþòñÿ ëè âñå îíè ðàáîòîñïîñîáíûìè? Äà - è âîò äîêàçàòåëüñòâî.
*********************************************************************
MEGATHINK, INC.
10 Megabuck Plaza.
Megapolis, CA 94904.
*********************************************************************
Ðàññìîòðèì ñíà÷àëà, êàê îïðåäåëèòü ôóíêöèþ ñ îäíèì àðãóìåíòîì, ïîñëå ÷åãî ïåðåéäåì ê âîïðîñó î òîì, êàê îíà èñïîëüçóåòñÿ.
Îïðåäåëåíèå ôóíêöèè ñ àðãóìåíòîì: ôîðìàëüíûå àðãóìåíòû.
Îïðåäåëåíèå íàøåé ôóíêöèè íà÷èíàåòñÿ ñ äâóõ ñòðîê:
Space(number).
Int number;
Ïåðâàÿ ñòðîêà èíôîðìèðóåò êîìïèëÿòîð î òîì, ÷òî ó ôóíêöèè space( ) èìååòñÿ àðãóìåíò è ÷òî åãî èìÿ number. Âòîðàÿ ñòðîêà - îïèñàíèå, óêàçûâàþùåå êîìïèëÿòîðó, ÷òî àðãóìåíò number èìååò òèï int. Îáðàòèòå âíèìàíèå: àðãóìåíò îïèñûâàåòñÿ ïåðåä ôèãóðíîé ñêîáêîé, êîòîðàÿ îòìå÷àåò íà÷àëî òåëà ôóíêöèè. Âîîáùå ãîâîðÿ, âû ìîæåòå îáúåäèíèòü ýòè äâå ñòðîêè â îäíó:
Space(int number;).
Íåçàâèñèìî îò ôîðìû çàïèñè ïåðåìåííàÿ number íàçûâàåòñÿ "ôîðìàëüíûì" àðãóìåíòîì. Ôàêòè÷åñêè ýòî íîâàÿ ïåðåìåííàÿ, è â ïàìÿòè êîìïüþòåðà äëÿ íåå äîëæíà áûòü âûäåëåíà îòäåëüíàÿ ÿ÷åéêà. Ïîñìîòðèì, êàê ìîæíî ïîëüçîâàòüñÿ ýòîé ôóíêöèåé.
Âûçîâ ôóíêöèè ñ àðãóìåíòîì: ôàêòè÷åñêèå àðãóìåíòû.
Çàäà÷à â äàííîì ñëó÷àå ñîñòîèò â òîì, ÷òîáû ïðèñâîèòü íåêîòîðóþ âåëè÷èíó ôîðìàëüíîìó àðãóìåíòó number. Ïîñëå òîãî êàê ýòà ïåðåìåííàÿ ïîëó÷èò ñâîå çíà÷åíèå, ïðîãðàììà ñìîæåò âûïîëíèòü ñâîþ çàäà÷ó. Ìû ïðèñâàèâàåì ïåðåìåííîé number çíà÷åíèå ôàêòè÷åñêîãî àðãóìåíòà ïðè âûçîâå ôóíêöèè. Ðàññìîòðèì íàø ïåðâûé ñëó÷àé èñïîëüçîâàíèÿ ôóíêöèè space( ):
Space(25);
Ôàêòè÷åñêèé àðãóìåíò çäåñü 25, è ýòà âåëè÷èíà ïðèñâàèâàåòñÿ ôîðìàëüíîìó àðãóìåíòó - ïåðåìåííîé number, ò. å. âûçîâ ôóíêöèè îêàçûâàåò ñëåäóþùåå äåéñòâèå:
Number = 25;
Êîðî÷å ãîâîðÿ, ôîðìàëüíûé àðãóìåíò - ïåðåìåííàÿ â âûçûâàåìîé ïðîãðàììå, à ôàêòè÷åñêèé àðãóìåíò - êîíêðåòíîå çíà÷åíèå, ïðèñâîåííîå ýòîé ïåðåìåííîé âûçûâàþùåé ïðîãðàììîé. Êàê áûëî ïîêàçàíî â íàøåì ïðèìåðå, ôàêòè÷åñêèé àðãóìåíò ìîæåò áûòü êîíñòàíòîé, ïåðåìåííîé èëè äàæå áîëåå ñëîæíûì âûðàæåíèåì. Íåçàâèñèìî îò òèïà ôàêòè÷åñêîãî àðãóìåíòà îí âíà÷àëå âû÷èñëÿåòñÿ, à çàòåì åãî âåëè÷èíà (â äàííîì ñëó÷àå íåêîòîðîå öåëîå ÷èñëî) ïåðåäàåòñÿ ôóíêöèè. Ðàññìîòðèì, íàïðèìåð, íàøå ïîñëåäíåå îáðàùåíèå ê ôóíêöèè space( ).
Space((65- strlen(PLACE))/2);
Ôóíêöèÿ êàê "÷åðíûé ÿùèê".
Ðàññìàòðèâàÿ ôóíêöèþ space( ) êàê ÷åðíûé ÿùèê, ìîæíî ñêàçàòü, ÷òî åå âõîä - ýòî ÷èñëî ïðîïóùåííûõ ïîçèöèé, à âûõîä -j ôàêòè÷åñêèé ïðîïóñê ïîçèöèé. Âõîä ñâÿçàí ñ ôóíêöèåé ÷åðåç àðãóìåíò.
ÐÈÑ. 9.4. Ôàêòè÷åñêèå àðãóìåíòû è ôîðìàëüíûå àðãóìåíòû.
Ñ ïîìîùüþ àðãóìåíòà îáåñïå÷èâàåòñÿ ñâÿçü ìåæäó ôóíêöèÿìè main( ) è space( ).  òî æå âðåìÿ ïåðåìåííàÿ count îïèñàíà â òåëå ôóíêöèè, è äðóãèå ôóíêöèè íè÷åãî íå çíàþò î íåé. Óêàçàííàÿ ïåðåìåííàÿ ÿâëÿåòñÿ ÷àñòüþ ìåõàíèçìà, ñêðûòîãî âíóòðè ÷åðíîãî ÿùèêà. Ýòî íå òà æå ïåðåìåííàÿ, ÷òî count â starbar().
Íàëè÷èå íåñêîëüêèõ àðãóìåíòîâ.
Åñëè äëÿ ñâÿçè ñ íåêîòîðîé ôóíêöèåé òðåáóåòñÿ áîëåå îäíîãî àðãóìåíòà, òî íàðÿäó ñ èìåíåì ôóíêöèè ìîæíî çàäàâàòü ñïèñîê àðãóìåíòîâ, ðàçäåëåííûõ çàïÿòûìè, êàê ïîêàçàíî íèæå.
Printnum(i,j) int i, j;
{ printf(" Íîâûõ òî÷åê = %d. Âñåãî òî÷åê = %d.\n", i, j); }.
Ìû óæå çíàåì, êàê ïåðåäàâàòü èíôîðìàöèþ èç âûçûâàþùåé ïðîãðàììû â âûçûâàåìóþ ôóíêöèþ. Ìîæíî ëè ïåðåäàâàòü èíôîðìàöèþ êàêèì-íèáóäü äðóãèì ñïîñîáîì? Ýòîò âîïðîñ ïîñëóæèò íàì òåìîé ñëåäóþùåãî îáñóæäåíèÿ.
ÂÎÇÂÐÀÙÅÍÈÅ ÇÍÀ×ÅÍÈß ÔÓÍÊÖÈÅÉ: ÎÏÅÐÀÒÎÐ return.
Ñîçäàäèì ôóíêöèþ, âû÷èñëÿþùóþ àáñîëþòíóþ âåëè÷èíó ÷èñëà. Àáñîëþòíàÿ âåëè÷èíà ÷èñëà - ýòî åãî çíà÷åíèå (åñëè îòáðîñèòü çíàê). Ñëåäîâàòåëüíî, àáñîëþòíàÿ âåëè÷èíà 5 ðàâíà 5, à àáñîëþòíàÿ âåëè÷èíà -3 ðàâíà 3. Ìû íàçîâåì ýòó ôóíêöèþ abs( ). Âõîäîì äëÿ abs() ìîæåò áûòü ëþáîå ÷èñëî, äëÿ êîòîðîãî ìû õîòèì íàéòè àáñîëþòíóþ âåëè÷èíó. Âûõîäîì ôóíêöèè áóäåò ñîîòâåòñòâóþùåå íåîòðèöàòåëüíîå ÷èñëî. Âõîäíàÿ âåëè÷èíà ìîæåò îáðàáàòûâàòüñÿ áëàãîäàðÿ íàëè÷èþ àðãóìåíòà; âûõîäíàÿ âåëè÷èíà âîçâðàùàåòñÿ (ò. å. âûäàåòñÿ), êàê âû óâèäèòå íèæå, ïðè ïîìîùè êëþ÷åâîãî ñëîâà ÿçûêà Ñè - return. Ïîñêîëüêó ôóíêöèÿ abs( ) äîëæíà áûòü âûçâàíà äðóãîé ôóíêöèåé, ìû ñîçäàäèì ïðîñòóþ ïðîãðàììó main( ), îñíîâíîé öåëüþ êîòîðîé áóäåò ïðîâåðêà, ðàáîòàåò ëè ôóíêöèÿ abs( ). Ïðîãðàììà, ñïðîåêòèðîâàííàÿ äëÿ òîãî, ÷òîáû ïðîâåðÿòü ðàáîòó ôóíêöèè èìåííî òàêèì îáðàçîì, íàçûâàåòñÿ "äðàéâåðîì". Äðàéâåð ïîäâåðãàåò ôóíêöèþ ïîñëåäîâàòåëüíûì ïðîâåðêàì. Åñëè ðåçóëüòàòû îêàçûâàþòñÿ óäîâëåòâîðèòåëüíûìè, òî åå ìîæíî ïîìåñòèòü â ïðîãðàììó, çàñëóæèâàþùóþ áîëüøåãî âíèìàíèÿ. (Òåðìèí "äðàéâåð" îáû÷íî îòíîñèòñÿ ê ïðîãðàììàì, óïðàâëÿþùèì ðàáîòîé óñòðîéñòâ.) Ïðèâåäåì äàëåå íàø äðàéâåð è ôóíêöèþ, âû÷èñëÿþùóþ àáñîëþòíóþ âåëè÷èíó ÷èñëà:
/* abs.äðàéâåð */
Main( ).
{
Int à = 10, b = 0, ñ = -22;
Int d, e, f;
D = abs(a);
Ñ= abs(b);
F = abs(c);
Printf(" °%d %d %d\n" , d, e, f);
}
/* ôóíêöèÿ, âû÷èñëÿþùàÿ âåëè÷èíó ÷èñëà */
Abs(x) int x;
{
Int y;
Ó = (x < 0) ? -x : x; /* âñïîìíèòå îïåðàöèþ ?: */
Return (ó ); /* âîçâðàùàåò çíà÷åíèå ó âûçûâàþùåé ïðîãðàììå */
}
Ðåçóëüòàò ðàáîòû ïðîãðàììû âûãëÿäèò òàê:
10 0 22.
Ñíà÷àëà âñïîìíèì îïåðàöèþ óñëîâèÿ ?:. Ýòà îïåðàöèÿ â ôóíêöèè abs( ) âûïîëíÿåòñÿ ñëåäóþùèì îáðàçîì: åñëè x ìåíüøå 0, ó ïîëàãàåòñÿ ðàâíûì -x; â ïðîòèâíîì ñëó÷àå ó ïîëàãàåòñÿ ðàâíûì x. Ýòî êàê ðàç òî, ÷òî íàì íóæíî, ïîñêîëüêó åñëè x ðàâåí -5, òî ó ðàâåí -(-5), ò. e. 5.
Êëþ÷åâîå ñëîâî return óêàçûâàåò íà òî, ÷òî çíà÷åíèå âûðàæåíèÿ, çàêëþ÷åííîãî â êðóãëûå ñêîáêè, áóäåò ïðèñâîåíî ôóíêöèè, ñîäåðæàùåé ýòî êëþ÷åâîå ñëîâî. Ïîýòîìó, êîãäà ôóíêöèÿ abs( ) âïåðâûå âûçûâàåòñÿ íàøèì äðàéâåðîì, çíà÷åíèåì abs(a) áóäåò ÷èñëî 10, êîòîðîå çàòåì ïðèñâàèâàåòñÿ ïåðåìåííîé d.
Ïåðåìåííàÿ ó ÿâëÿåòñÿ âíóòðåííèì îáúåêòîì ôóíêöèè abs(), íî çíà÷åíèå ó ïåðåäàåòñÿ â âûçûâàþùóþ ïðîãðàììó ñ ïîìîùüþ îïåðàòîðà return. Äåéñòâèå, îêàçûâàåìîå îïåðàòîðîì.
D = abs(a);
Ïî-äðóãîìó ìîæíî âûðàçèòü òàê:
Abs(a);
D = ó;
Ìîæíî ëè â äåéñòâèòåëüíîñòè âîñïîëüçîâàòüñÿ òàêîé çàïèñüþ? Íåò, òàê êàê âûçûâàþùàÿ ïðîãðàììà äàæå íå ïîäîçðåâàåò î òîì, ÷òî ïåðåìåííàÿ ó ñóùåñòâóåò.
Âîçâðàùàåìîå çíà÷åíèå ìîæíî ïðèñâîèòü ïåðåìåííîé, êàê â íàøåì ïðèìåðå, èëè èñïîëüçîâàòü êàê ÷àñòü íåêîòîðîãî âûðàæåíèÿ, íàïðèìåð, ñëåäóþùèì îáðàçîì:
Answer = 2*abs(z) + 25;
Printf(" %d\n" , abs(-32 + answer));
Îïåðàòîð return îêàçûâàåò è äðóãîå äåéñòâèå. Îí çàâåðøàåò âûïîëíåíèå ôóíêöèè è ïåðåäàåò óïðàâëåíèå ñëåäóþùåìó îïåðàòîðó â âûçûâàþùåé ôóíêöèè. Ýòî ïðîèñõîäèò äàæå â òîì ñëó÷àå, åñëè îïåðàòîð return ÿâëÿåòñÿ íå ïîñëåäíèì îïåðàòîðîì òåëà ôóíêöèè. Ñëåäîâàòåëüíî, ôóíêöèþ abs( ) ìû ìîãëè áû çàïèñàòü ñëåäóþùèì îáðàçîì:
/* ôóíêöèÿ, âû÷èñëÿþùàÿ àáñîëþòíóþ âåëè÷èíó ÷èñëà,
Âòîðàÿ âåðñèÿ */
Abs(x) int x;
{
if(x < 0).
return(-x);
Else.
relurn(x);
}
Ýòà âåðñèÿ ïðîãðàììû ïðîùå, è â íåé íå èñïîëüçóåòñÿ äîïîëíèòåëüíàÿ ïåðåìåííàÿ ó. Äëÿ ïîëüçîâàòåëÿ, îäíàêî, îáå âåðñèè íåðàçëè÷èìû, ïîñêîëüêó ó íèõ èìååòñÿ îäèí è òîò æå âõîä è îíè îáåñïå÷èâàþò îäèí è òîò æå âûõîä. Òîëüêî âíóòðåííèå ñòðóêòóðû îáåèõ ôóíêöèé ðàçëè÷íû. Äàæå âåðñèÿ äàííîé ïðîãðàììû, ïðèâåäåííàÿ íèæå, ðàáîòàåò òî÷íî òàê æå:
/* ôóíêöèÿ, âû÷èñëÿþùàÿ àáñîëþòíóþ âåëè÷èíó ÷èñëà,
Òðåòüÿ âåðñèÿ */
Abs(x) int(x);
{
if (x < 0).
return(-x);
Else.
return(x);
Printf(" Ïðîôåññîð Ôëåïïàðä - áîëâàí. \n");
}
Íàëè÷èå îïåðàòîðà return ïðåïÿòñòâóåò òîìó, ÷òîáû îïåðàòîð ïå÷àòè printf( ) êîãäà-íèáóäü âûïîëíèëñÿ â ïðîãðàììå. Ïðîôåññîð Ôëåïïàðä ìîæåò ïîëüçîâàòüñÿ â ñâîèõ ïðîãðàììàõ îáúåêòíûì êîäîì, ïîëó÷åííûì â ðåçóëüòàòå êîìïèëÿöèè äàííîé ôóíêöèè, è íèêîãäà íå óçíàåò îá èñòèííûõ ÷óâñòâàõ ñâîåãî ñòóäåíòà-ïðîãðàììèñòà.
Âû ìîæåòå òàêæå èñïîëüçîâàòü ïðîñòî îïåðàòîð return;
Åãî ïðèìåíåíèå ïðèâîäèò ê òîìó, ÷òî ôóíêöèÿ, â êîòîðîé îí ñîäåðæèòñÿ, çàâåðøàåò ñâîå âûïîëíåíèå è óïðàâëåíèå âîçâðàùàåòñÿ â âûçûâàþùóþ ôóíêöèþ. Ïîñêîëüêó ó äàííîãî îïåðàòîðà îòñóòñòâóåò âûðàæåíèå â ñêîáêàõ, íèêàêîå çíà÷åíèå ïðè ýòîì íå ïåðåäàåòñÿ ôóíêöèè.
ËÎÊÀËÜÍÛÅ ÏÅÐÅÌÅÍÍÛÅ.
Ìû óæå íåñêîëüêî ðàç êàñàëèñü âîïðîñà î òîì, ÷òî ïåðåìåííûå â ôóíêöèè ÿâëÿþòñÿ åå âíóòðåííèìè ïåðåìåííûìè è "íå èçâåñòíû" âûçûâàþùåé ôóíêöèè. Àíàëîãè÷íî ïåðåìåííûå âûçûâàþùåé ôóíêöèè íå èçâåñòíû âûçûâàåìîé ôóíêöèè. Âîò ïî÷åìó äëÿ ñâÿçè ñ íåé, ò. å. äëÿ ïåðåäà÷è çíà÷åíèé â íåå è èç íåå, ìû ïîëüçóåìñÿ àðãóìåíòàìè è îïåðàòîðîì return.
Ïåðåìåííûå, èçâåñòíûå òîëüêî îäíîé ôóíêöèè, à èìåííî òîé, êîòîðàÿ èõ ñîäåðæèò, íàçûâàþòñÿ "ëîêàëüíûìè" ïåðåìåííûìè. Äî ñèõ ïîð ýòî áûë åäèíñòâåííûé âèä ïåðåìåííûõ, êîòîðûìè ìû ïîëüçîâàëèñü, íî â ÿçûêå Ñè äîïóñêàåòñÿ íàëè÷èå ïåðåìåííûõ, èçâåñòíûõ íåñêîëüêèì ôóíêöèÿì. Òàêèå íåëîêàëüíûå ïåðåìåííûå íàçûâàþòñÿ "ãëîáàëüíûìè", è ìû âåðíåìñÿ ê íèì ïîçæå. Òåïåðü æå ìû õîòèì ïîä÷åðêíóòü, ÷òî ëîêàëüíûå ïåðåìåííûå ÿâëÿþòñÿ äåéñòâèòåëüíî ëîêàëüíûìè. Äàæå â òîì ñëó÷àå, åñëè ìû èñïîëüçóåì îäíî è òî æå èìÿ äëÿ ïåðåìåííûõ â äâóõ ðàçëè÷íûõ ôóíêöèÿõ, êîìïèëÿòîð (è, òàêèì îáðàçîì, êîìïüþòåð "ñ÷èòàåò" èõ ðàçíûìè ïåðåìåííûìè. Ìû ìîæåì ïîêàçàòü ýòî, èñïîëüçóÿ îïåðàöèþ & (íå ïóòàéòå ñ îïåðàöèåé &&).
ÍÀÕÎÆÄÅÍÈÅ ÀÄÐÅÑÎÂ: ÎÏÅÐÀÖÈß &
 ðåçóëüòàòå âûïîëíåíèÿ îïåðàöèè & îïðåäåëÿåòñÿ àäðåñ ÿ÷åéêè ïàìÿòè, êîòîðàÿ ñîîòâåòñòâóåò ïåðåìåííîé. Åñëè pooh - èìÿ ïåðåìåííîé, òî &pooh - åå àäðåñ. Ìîæíî ïðåäñòàâèòü ñåáå àäðåñ êàê ÿ÷åéêó ïàìÿòè, íî ìîæíî ðàññìàòðèâàòü åãî è êàê ìåòêó, êîòîðàÿ èñïîëüçóåòñÿ êîìïüþòåðîì, äëÿ èäåíòèôèêàöèè ïåðåìåííîé. Ïðåäïîëîæèì, ìû èìååì îïåðàòîð.
Pooh = 24;
Ïóñòü òàêæå àäðåñ ÿ÷åéêè, ãäå ðàçìåùàåòñÿ ïåðåìåííàÿ pooh - 12126. Òîãäà â ðåçóëüòàòå âûïîëíåíèÿ îïåðàòîðà.
Printf(" %d %d\n" , pooh, &pooh);
Ïîëó÷èì.
24 12126.
Áîëåå òîãî, ìàøèííûé êîä, ñîîòâåòñòâóþùèé ïåðâîìó îïåðàòîðó, ñëîâàìè ìîæíî âûðàçèòü ïðèáëèçèòåëüíî òàê: "Ïîìåñòèòü ÷èñëî 24 â ÿ÷åéêó ñ àäðåñîì 12126".
Âîñïîëüçóåìñÿ óêàçàííîé âûøå îïåðàöèåé äëÿ ïðîâåðêè òîãî, â êàêèõ ÿ÷åéêàõ õðàíÿòñÿ çíà÷åíèÿ ïåðåìåííûõ, ïðèíàäëåæàùèõ ðàçíûì ôóíêöèÿì, íî èìåþùèõ îäíî è òî æå èìÿ.
/* êîíòðîëü àäðåñîâ */
Main( ).
{
int pooh = 2, bah = 5;
Printf(" Âmàin( ), pooh = %d è&ðîîh = %u \n" , pooh, &pooh);
Printf('B main( ), bah = %d è&bàh = %u\n>/, bah, &bah);
Mikado(pooh);
}
Mikado(bah) int bah;
{
Int pooh = 10;
Printf("B mikado( ), pooh = %d è&ðîîh = %u\n, pooh, &pooh);
Printf(" Âmiêàdî( ), bah = %d è&bàh = %u\n" , bah, &bah);
}
Ìû âîñïîëüçîâàëèñü ôîðìàòîì %u (öåëîå áåç çíàêà) äëÿ âûâîäà íà ïå÷àòü àäðåñîâ íà òîò ñëó÷àé, åñëè èõ âåëè÷èíû ïðåâûñÿò ìàêñèìàëüíî âîçìîæíîå çíà÷åíèå ÷èñëà òèïà int.  íàøåé âû÷èñëèòåëüíîé ñèñòåìå ðåçóëüòàò ðàáîòû ýòîé ìàëåíüêîé ïðîãðàììû âûãëÿäèò òàê:
Âmàin( ), pooh = 2 è&ðîîh = 56002.
B main( ), bah = 5 è&bàh = 56004.
B mikado( ), pooh = 10 è&ðîîh =55996.
 mikado( ), bah = 2 è &bah = 56000.
Î ÷åì ýòî ãîâîðèò? Âî-ïåðâûõ, äâå ïåðåìåííûå pooh èìåþò ðàçëè÷íûå àäðåñà. Òî æå ñàìîå âåðíî è îòíîñèòåëüíî ïåðåìåííûõ bah. Ñëåäîâàòåëüíî, êàê è áûëî îáåùàíî, êîìïüþòåð ðàññìàòðèâàåò èõ êàê ÷åòûðå ðàçíûå ïåðåìåííûå. Âî-âòîðûõ, ïðè âûçîâå mikado(pooh) âåëè÷èíà (2) ôàêòè÷åñêîãî àðãóìåíòà (pooh èç main( )) ïåðåäàñòñÿ ôîðìàëüíîìó àðãóìåíòó (bah èç mikado( )). Îáðàòèòå âíèìàíèå, ÷òî áûëî ïåðåäàíî òîëüêî çíà÷åíèå ïåðåìåííîé. Àäðåñà äâóõ ïåðåìåííûõ (pooh â main( ) è bah â mikado( )) îñòàþòñÿ ðàçëè÷íûìè.
Ìû êîñíóëèñü âòîðîãî âîïðîñà ïîòîìó, ÷òî ýòîò ôàêò îêàçûâàåòñÿ íåâåðíûì äëÿ âñåõ äðóãèõ ÿçûêîâ.  òîé èëè èíîé ïðîöåäóðå Ôîðòðàíà, íàïðèìåð, ìîæíî èñïîëüçîâàòü ïåðåìåííûå âûçûâàþùåé ïðîãðàììû. Êðîìå òîãî, â òàêîé ïðîöåäóðå ïåðåìåííûå ìîãóò èìåòü ðàçëè÷íûå èìåíà, íî àäðåñà èõ ïðè ýòîì áóäóò ñîâïàäàòü.  ÿçûêå Ñè ïîäîáíûå ìåõàíèçìû îòñóòñòâóþò. Êàæäàÿ ôóíêöèÿ èñïîëüçóåò ñâîè ñîáñòâåííûå ïåðåìåííûå. Ýòî áîëåå ïðåäïî÷òèòåëüíî, ïîòîìó ÷òî "èñõîäíûå" ïåðåìåííûå íå áóäóò òàèíñòâåííûì îáðàçîì èçìåíÿòüñÿ èç-çà òîãî, ÷òî âûçâàííàÿ ôóíêöèÿ îáëàäàåò ïîáî÷íûì ýôôåêòîì. Íî ýòî ìîæåò òàêæå ïðèâîäèòü è ê íåêîòîðûì òðóäíîñòÿì, î ÷åì è áóäåò ðàññêàçàíî è ñëåäóþùåì ðàçäåëå.
ÈÇÌÅÍÅÍÈÅ ÏÅÐÅÌÅÍÍÛÕ Â ÂÛÇÛÂÀÞÙÅÉ ÏÐÎÃÐÀÌÌÅ.
Èíîãäà òðåáóåòñÿ, ÷òîáû îäíà ôóíêöèÿ ìîãëà èçìåíÿòü ïåðåìåííûå, îòíîñÿùèåñÿ ê äðóãîé. Íàïðèìåð, â çàäà÷àõ ñîðòèðîâêè ÷àñòî áûâàåò íåîáõîäèìî îñóùåñòâëÿòü îáìåí çíà÷åíèÿìè ìåæäó äâóìÿ ïåðåìåííûìè. Ïðåäïîëîæèì, ó íàñ åñòü äâå ïåðåìåííûå õ è ó è ìû õîòèì, ÷òîáû îíè îáìåíÿëèñü ñâîèìè çíà÷åíèÿìè. Ïðîñòàÿ ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ.
Õ = ó;
Y = õ;
Íå ÿâëÿåòñÿ ðåøåíèåì ïîñòàâëåííîé çàäà÷è, ïîòîìó ÷òî ê òîìó ìîìåíòó, êîãäà íà÷íåò âûïîëíÿòüñÿ îïåðàòîð âî âòîðîé ñòðîêå, ïåðâîíà÷àëüíîå çíà÷åíèå ïåðåìåííîé x áóäåò ïîòåðÿíî. ×òîáû ñîõðàíèòü ýòî ïåðâîíà÷àëüíîå çíà÷åíèå, íåîáõîäèìî äîïîëíèòü äàííûé ôðàãìåíò åùå îäíîé ñòðîêîé:
Temp = õ;
Õ = ó;
Ó = temp;
Òåïåðü ó íàñ åñòü òðåáóåìûé ìåòîä; ðåàëèçóåì åãî â âèäå íåêîòîðîé ôóíêöèè, à òàêæå ñîçäàäèì äðàéâåð äëÿ åå ïðîâåðêè. ×òîáû ñäåëàòü áîëåå ÿñíûì, êàêàÿ ïåðåìåííàÿ ïðèíàäëåæèò ôóíêöèè main( ), à êàêàÿ - ôóíêöèè interchange( ), ìû áóäåì èñïîëüçîâàòü ïåðåìåííûå õ è ó â ïåðâîé èç íèõ, è u è v - âî âòîðîé.
/* îáìåí1 */
Main( ).
{
Int õ = 5, ó = 10;
Printf(" Âíà÷àëå õ = %d è ó = %d.\n" , õ, ó);
Interchange(x, ó);
Prinlf(" Òåïåðü õ = %d è ó = %d.\n" , õ, ó);
}
Interchangce(u, v) int u, v;
{
Int temp;
Temp = u;
U = v;
V = temp;
}
Ïîïðîáóåì âûïîëíèòü ýòó ïðîãðàììó. Ðåçóëüòàòû áóäóò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Âíà÷àëå õ = 5 è ó = 10.
Òåïåðü õ = 5 è ó = 10.
Íå ìîæåò áûòü! Çíà÷åíèÿ ïåðåìåííûõ íå ïîìåíÿëèñü ìåñòàìè! Âñòàâèì â ïðîãðàììó interchange( ) íåñêîëüêî îïåðàòîðîâ ïå÷àòè, ÷òîáû ïîíÿòü ïðè÷èíó äîïóùåííîé îøèáêè.
/* îáìåí2 */
Main( ).
{
Int õ = 5, ó = 10;
Printf(" Âíà÷àëå õ = %d è ó = %d.\n", õ,ó);
Interchange(x, ó);
Printf(" Òåïåðü õ = %d è ó = %d.\n", õ, ó);
}
interchange(u, v).
Int u, v;
{
int temp;
Printf(" Âíà÷àëåu = %d èv = %d.\n", u, v);
Temp = u;u = v;v = temp;
Printf(" Òåïåðü u = %d è v = %d.\n", u, v);
}
Ðåçóëüòàò ðàáîòû ýòîé ïðîãðàììû âûãëÿäèò òàê:
Âíà÷àëå x = 5 è y = 10.
Âíà÷àëå u = 5 è v = 10.
Âíà÷àëå u = 10 è v = 5.
Âíà÷àëå x = 5 è y = 10.
Îòñþäà âèäíî, ÷òî íè÷åãî íåïðàâèëüíîãî â ðàáîòå ôóíêöèè interchange( ) íåò; îíà îñóùåñòâëÿåò îáìåí çíà÷åíèÿìè ìåæäó ïåðåìåííûìè u è v. Ïðîáëåìà ñîñòîèò â ïåðåäà÷å ðåçóëüòàòîâ îáðàòíî â ôóíêöèþ main( ). Êàê ìû óæå óêàçûâàëè, ôóíêöèè interchange( ) è main() èñïîëüçóþò ðàçëè÷íûå ïåðåìåííûå, ïîýòîìó îáìåí çíà÷åíèÿìè ìåæäó ïåðåìåííûìè u è v íå îêàçûâàåò íèêàêîãî âëèÿíèÿ íà õ è ó! À íåëüçÿ ëè êàêèì-òî îáðàçîì âîñïîëüçîâàòüñÿ îïåðàòîðîì return? Ìû ìîãëè áû, êîíå÷íî, çàâåðøèòü òåëî ôóíêöèè interchange( ) ñòðîêîé.
Return(u);
È èçìåíèòü ôîðìó âûçîâà â ôóíêöèè main( ) ñëåäóþùèì îáðàçîì:
Õ = interchange(x, ó);
 ðåçóëüòàòå òàêîãî îáðàùåíèÿ ê ôóíêöèè ïåðåìåííàÿ õ ïîëó÷èò íîâîå çíà÷åíèå, íî ó ïðè ýòîì íå èçìåíèòñÿ.
Ñ ïîìîùüþ îïåðàòîðà return â âûçûâàþùóþ ïðîãðàììó ìîæíî ïåðåäàòü òîëüêî îäíó âåëè÷èíó. Íî íàì íóæíî ïåðåäàòü äâå âåëè÷èíû. Ýòî îêàçûâàåòñÿ âïîëíå îñóùåñòâèìûì! Äëÿ ýòîãî íóæíî ëèøü âîñïîëüçîâàòüñÿ "óêàçàòåëÿìè".
Óêàçàòåëè: ïåðâîå çíàêîìñòâî.
Óêàçàòåëè? ×òî ýòî òàêîå? Âîîáùå ãîâîðÿ, óêàçàòåëü - íåêîòîðîå ñèìâîëè÷åñêîå ïðåäñòàâëåíèå àäðåñà. Íàïðèìåð, ðàíåå ìû âîñïîëüçîâàëèñü îïåðàöèåé ïîëó÷åíèÿ àäðåñà äëÿ íàõîæäåíèÿ àäðåñà ïåðåìåííîé pooh.  äàííîì ñëó÷àå &pooh îçíà÷àåò "óêàçàòåëü íà ïåðåìåííóþ pooh". Ôàêòè÷åñêèé àäðåñ - ýòî ÷èñëî (â íàøåì ñëó÷àå 56002), à ñèìâîëè÷åñêîå ïðåäñòàâëåíèå àäðåñà &pooh ÿâëÿåòñÿ êîíñòàíòîé òèïà óêàçàòåëü. Ïîñëå âñåãî ñêàçàííîãî âûøå ñòàíîâèòñÿ î÷åâèäíûì, ÷òî àäðåñ ÿ÷åéêè, îòâîäèìîé ïåðåìåííîé pooh, â ïðîöåññå âûïîëíåíèÿ ïðîãðàììû íå ìåíÿåòñÿ.
 ÿçûêå Ñè èìåþòñÿ è ïåðåìåííûå òèïà óêàçàòåëü. Òî÷íî òàê æå êàê çíà÷åíèåì ïåðåìåííîé òèïà char ÿâëÿåòñÿ ñèìâîë, à çíà÷åíèåì ïåðåìåííîé òèïà int - öåëîå ÷èñëî, çíà÷åíèåì ïåðåìåííîé òèïà óêàçàòåëü ñëóæèò àäðåñ íåêîòîðîé âåëè÷èíû. Åñëè ìû äàäèì óêàçàòåëþ èìÿ ptr, òî ñìîæåì íàïèñàòü, íàïðèìåð, òàêîé îïåðàòîð.
Ptr = &pooh; /* ïðèñâàèâàåò àäðåñ pooh ïåðåìåííîé ptr */
Ìû ãîâîðèì â ýòîì ñëó÷àå, ÷òî ptr "óêàçûâàåò íà" pooh. Ðàçëè÷èå ìåæäó äâóìÿ ôîðìàìè çàïèñè: ptr è &pooh, çàêëþ÷àåòñÿ â òîì, ÷òî ptr - ýòî ïåðåìåííàÿ, â òî âðåìÿ êàê &pooh - êîíñòàíòà.  ñëó÷àå íåîáõîäèìîñòè ìû ìîæåì ñäåëàòü òàê, ÷òîáû ïåðåìåííàÿ ptr óêàçûâàëà íà êàêîé-íèáóäü äðóãîé îáúåêò:
Ptr = &bah; /* ptr óêàçûâàåò íà bah, à íå íà pooh */
Òåïåðü çíà÷åíèåì ïåðåìåííîé ptr ÿâëÿåòñÿ àäðåñ ïåðåìåííîé bah.
Îïåðàöèÿ êîñâåííîé àäðåñàöèè: *
Ïðåäïîëîæèì, ìû çíàåì, ÷òî â ïåðåìåííîé ptr ñîäåðæèòñÿ ññûëêà íà ïåðåìåííóþ bah. Òîãäà äëÿ äîñòóïà ê çíà÷åíèþ ýòîé ïåðåìåííîé ìîæíî âîñïîëüçîâàòüñÿ îïåðàöèåé "êîñâåííîé àäðåñàöèè" (*). (Íå ïóòàéòå ýòó óíàðíóþ îïåðàöèþ êîñâåííîé àäðåñàöèè ñ áèíàðíîé îïåðàöèåé óìíîæåíèÿ *).
Val = *ptr; /* îïðåäåëåíèå çíà÷åíèÿ, íà êîòîðîå óêàçûâàåò ptr */
Ïîñëåäíèå äâà îïåðàòîðà, âçÿòûå âìåñòå, ýêâèâàëåíòíû ñëåäóþùåìó:
Val = bah;
Èñïîëüçîâàíèå îïåðàöèé ïîëó÷åíèÿ àäðåñà è êîñâåííîé àäðåñàöèè îêàçûâàåòñÿ äàëåêî íå ïðÿìûì ïóòåì ê ðåçóëüòàòó; îòñþäà è ïîÿâëåíèå ñëîâà "êîñâåííàÿ" â íàçâàíèè îïåðàöèè.
Ðåçþìå: îïåðàöèè, ñâÿçàííûå ñ óêàçàòåëÿìè.
I. Îïåðàöèÿ ïîëó÷åíèÿ àäðåñà &
Êîãäà çà ýòèì çíàêîì ñëåäóåò èìÿ ïåðåìåííîé, ðåçóëüòàòîì îïåðàöèè ÿâëÿåòñÿ àäðåñ óêàçàííîé ïåðåìåííîé.
Ïðèìåð:
&nurse äàåò àäðåñ ïåðåìåííîé nurse.
II. Îïåðàöèÿ êîñâåííîé àäðåñàöèè.
* Êîãäà çà ýòèì òàêîì ñëåäóåò óêàçàòåëü íà ïåðåìåííóþ, ðåçóëüòàòîì îïåðàöèè ÿâëÿåòñÿ âåëè÷ííà, ïîìåùåííàÿ è ÿ÷åéêó ñ óêàçàííûì àäðåñîì.
Ïðèìåð:
Nurse = 22;pir = &nurse; /* óêàçàòåëü íà nurse */ val = *ptr;
Ðåçóëüòàòîì âûïîëíåíèÿ ýòîãî ôðàãìåíòà ÿâëÿåòñÿ ïðèñâàèâàíèå çíà÷åíèÿ 22 ïåðåìåííîé val.
Îïèñàíèå óêàçàòåëåé.
Ìû çíàåì, êàê îïèñûâàòü ïåðåìåííûå òèïà int è äðóãèõ òèïîâ. Íî êàê îïèñàòü ïåðåìåííóþ òèïà "óêàçàòåëü"? Íà ïåðâûé âçãëÿä ýòî ìîæíî ñäåëàòü òàê:
Pointer ptr; /* íåïðàâèëüíûé ñïîñîá îïèñàíèÿ óêàçàòåëÿ */
Ïî÷åìó íåëüçÿ èñïîëüçîâàòü òàêóþ çàïèñü? Ïîòîìó ÷òî íåäîñòàòî÷íî ñêàçàòü, ÷òî íåêîòîðàÿ ïåðåìåííàÿ ÿâëÿåòñÿ óêàçàòåëåì. Êðîìå ýòîãî, íåîáõîäèìî ñîîáùèòü åùå, íà ïåðåìåííóþ êàêîãî òèïà ññûëàåòñÿ äàííûé óêàçàòåëü! Ïðè÷èíà çàêëþ÷àåòñÿ â òîì, ÷òî ïåðåìåííûå ðàçíûõ òèïîâ çàíèìàþò ðàçëè÷íîå ÷èñëî ÿ÷ååê, â òî âðåìÿ êàê äëÿ íåêîòîðûõ îïåðàöèé, ñâÿçàííûõ ñ óêàçàòåëÿìè, òðåáóåòñÿ çíàòü îáúåì îòâåäåííîé ïàìÿòè. Íèæå ïðèâîäÿòñÿ ïðèìåðû ïðàâèëüíîãî îïèñàíèÿ óêàçàòåëåé:
Int *pi; /* óêàçàòåëü íà ïåðåìåííóþ òèïà öåëîãî */
Char *ðñ; /* óêàçàòåëü íà ñèìâîëüíóþ ïåðåìåííóþ */
Float *pf, *pg; /* óêàçàòåëè íà ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé */
Ñïåöèôèêàöèÿ òèïà çàäàåò òèï ïåðåìåííîé, íà êîòîðóþ ññûëàåòñÿ óêàçàòåëü, à ñèìâîë çâåçäî÷êà (*) îïðåäåëÿåò ñàìó ïåðåìåííóþ êàê óêàçàòåëü. Îïèñàíèå âèäà int *pi; ãîâîðèò, ÷òî pi - ýòî óêàçàòåëü è ÷òî *pi - âåëè÷èíà òèïà int.
ÐÈÑ. 9.5. Îïèñàíèå è èñïîëüçîâàíèå óêàçàòåëåé.
Òî÷íî òàê æå âåëè÷èíà (*ðñ), íà êîòîðóþ ññûëàåòñÿ ïåðåìåííà ðñ, èìååò òèï char. ×òî ìîæíî ñêàçàòü î ñàìîé ïåðåìåííîé ðñ? Ìû ñ÷èòàåì, ÷òî îíà èìååò òèï "óêàçàòåëü íà ïåðåìåííóþ òèïà char". Åå âåëè÷èíà, ÿâëÿþùàÿñÿ àäðåñîì,- ýòî öåëîå ÷èñëî áåç çíàêà, ïîýòîìó ïðè âûâîäå íà ïå÷àòü çíà÷åíèÿ ïåðåìåííîé ðñ ìû áóäåì ïîëüçîâàòüñÿ ôîðìàòîì %u.
Èñïîëüçîâàíèå óêàçàòåëåé äëÿ ñâÿçè ìåæäó ôóíêöèÿìè.
Ìû òîëüêî ïðèêîñíóëèñü ê îáøèðíîìó è óâëåêàòåëüíîìó ìèðó óêàçàòåëåé. Ñåé÷àñ íàøåé öåëüþ ÿâëÿåòñÿ èñïîëüçîâàíèå óêàçàòåëåé äëÿ ðåøåíèÿ çàäà÷è îá óñòàíîâëåíèè ñâÿçè ìåæäó ôóíêöèÿìè. Íèæå ïðèâîäèòñÿ ïðîãðàììà, â êîòîðîé óêàçàòåëè ñëóæàò ñðåäñòâîì, îáåñïå÷èâàþùèì ïðàâèëüíóþ ðàáîòó ôóíêöèè, êîòîðàÿ îñóùåñòâëÿåò îáìåí çíà÷åíèÿìè ïåðåìåííûõ. Ïîñìîòðèì, êàê îíà âûãëÿäèò, âûïîëíèì åå, à çàòåì ïîïûòàåìñÿ ïîíÿòü, êàê îíà ðàáîòàåò.
/* îáìåí3 */
Main( ).
{
Int x = 5, ó = 10;
Printf(" Âíà÷àëå x = %d è ó = %d.\n" , x, ó);
Interchange(&x,&y); /* ïåðåäà÷à àäðåñîâ ôóíêöèè */
Printf(" Òåïåðü x = %d è ó = %d.\n", x, ó);
}
Interchange(u, v).
Int *u, *v; /* u è v ÿâëÿþòñÿ óêàçàòåëÿìè */
{
Int temp;
Temp = *u; /* temp ïðèñâàèâàåòñÿ çíà÷åíèå, íà êîòîðîå óêàçûâàåò u */
*u = *v;
*v = temp;
}
Ïîñëå âñåõ âñòðåòèâøèõñÿ òðóäíîñòåé, ïðîâåðèì, ðàáîòàåò ëè ýòîò âàðèàíò 1
Âíà÷àëå x = 5 è y = 10.
Òåïåðü x = 10 è y = 5.
Äà ïðîãðàììà ðàáîòàåò. Ïîñìîòðèì, êàê îíà ðàáîòàåò. Âî-ïåðâûõ, òåïåðü âûçîâ ôóíêöèè âûãëÿäèò ñëåäóþùèì îáðàçîì:
Interchange(&x, &y);
Âìåñòî ïåðåäà÷è çíà÷åíèé õ è ó ìû ïåðåäàåì èõ àäðåñà. Ýòî îçíà÷àåò, ÷òî ôîðìàëüíûå àðãóìåíòû u è v, èìåþùèåñÿ â ñïåöèôèêàöèè:
Interchange(u,v).
Ïðè îáðàùåíèè áóäóò çàìåíåíû àäðåñàìè è, ñëåäîâàòåëüíî, îíè äîëæíû áûòü îïèñàíû êàê óêàçàòåëè. Ïîñêîëüêó õ è ó - öåëîãî òèïà, u è v ÿâëÿþòñÿ óêàçàòåëÿìè íà ïåðåìåííûå öåëîãî òèïà, è ìû ââîäèì ñëåäóþùåå îïèñàíèå:
Int *u, *v;
Äàëåå â òåëå ôóíêöèè îïåðàòîð îïèñàíèÿ:
Int temp;
Èñïîëüçóåòñÿ ñ öåëüþ ðåçåðâèðîâàíèÿ ïàìÿòè. Ìû õîòèì ïîìåñòèòü çíà÷åíèå ïåðåìåííîé õ â ïåðåìåííóþ temp, ïîýòîìó ïèøåì:
Temp = *u;
Âñïîìíèòå, ÷òî çíà÷åíèå ïåðåìåííîé u - ýòî &õ, ïîýòîìó ïåðåìåííàÿ u ññûëàåòñÿ íà õ. Ýòî îçíà÷àåò, ÷òî îïåðàöèÿ *u äàåò çíà÷åíèå x, êîòîðîå êàê ðàç íàì è òðåáóåòñÿ. Ìû íå äîëæíû ïèñàòü, íàïðèìåð, òàê:
Temp = u; /* íåïðàâèëüíî */
Ïîñêîëüêó ïðè ýòîì ïðîèñõîäèò çàïîìèíàíèå àäðåñà ïåðåìåííîé õ, à íå åå çíà÷åíèÿ; ìû æå ïûòàåìñÿ îñóùåñòâèòü îáìåí çíà÷åíèÿìè, à íå àäðåñàìè.
Òî÷íî òàê æå, æåëàÿ ïðèñâîèòü ïåðåìåííîé ó çíà÷åíèå ïåðåìåííîé õ, ìû ïîëüçóåìñÿ îïåðàòîðîì:
*u = *v;
Êîòîðûé ñîîòâåòñòâóåò îïåðàòîðó.
X = y;
Ïîäâåäåì èòîãè. Íàì òðåáîâàëàñü ôóíêöèÿ, êîòîðàÿ ìîãëà áû èçìåíÿòü çíà÷åíèÿ ïåðåìåííûõ õ è ó. Ïóòåì ïåðåäà÷è ôóíêöèè àäðåñîâ ïåðåìåííûõ õ è ó ìû ïðåäîñòàâèëè åé âîçìîæíîñòü äîñòóïà ê íèì. Èñïîëüçóÿ óêàçàòåëè è îïåðàöèþ *, ôóíêöèÿ ñìîãëà èçâëå÷ü âåëè÷èíû, ïîìåùåííûå â ñîîòâåòñòâóþùèå ÿ÷åéêè ïàìÿòè, è ïîìåíÿòü èõ ìåñòàìè.
Âîîáùå ãîâîðÿ, ïðè âûçîâå ôóíêöèè èíôîðìàöèÿ î ïåðåìåííîé ìîæåò ïåðåäàâàòüñÿ ôóíêöèè â äâóõ âèäàõ. Åñëè ìû èñïîëüçóåì ôîðìó îáðàùåíèÿ:
Function1(õ);
Ïðîèñõîäèò ïåðåäà÷à çíà÷åíèÿ ïåðåìåííîé õ. Åñëè æå ìû èñïîëüçóåì ôîðìó îáðàùåíèÿ:
Function2(&x);
Ïðîèñõîäèò ïåðåäà÷à àäðåñà ïåðåìåííîé õ. Ïåðâàÿ ôîðìà îáðàùåíèÿ òðåáóåò, ÷òîáû îïðåäåëåíèå ôóíêöèè âêëþ÷àëî â ñåáÿ ôîðìàëüíûé àðãóìåíò òîãî æå òèïà, ÷òî è õ:
Functionl(num).
Int num;
Âòîðàÿ ôîðìà îáðàùåíèÿ òðåáóåò, ÷òîáû îïðåäåëåíèå ôóíêöèè âêëþ÷àëî â ñåáÿ ôîðìàëüíûé àðãóìåíò, ÿâëÿþùèéñÿ óêàçàòåëåì íà îáúåêò ñîîòâåòñòâóþùåãî òèïà:
Function2(ptr).
Int *ptr;
Ïîëüçóéòåñü ïåðâîé ôîðìîé, åñëè âõîäíîå çíà÷åíèå íåîáõîäèìî ôóíêöèè äëÿ íåêîòîðûõ âû÷èñëåíèé èëè äåéñòâèé, è âòîðîé ôîðìîé, åñëè ôóíêöèÿ äîëæíà áóäåò èçìåíÿòü çíà÷åíèÿ ïåðåìåííûõ â âûçûâàþùåé ïðîãðàììå. Âòîðàÿ ôîðìà âûçîâà óæå ïðèìåíÿëàñü ïðè îáðàùåíèè ê ôóíêöèè scanf( ). Êîãäà ìû õîòèì ââåñòè íåêîòîðîå çíà÷åíèå â ïåðåìåííóþ num, ìû ïèøåì scanf("%d, &num). Äàííàÿ ôóíêöèÿ ÷èòàåò âåëè÷èíó, çàòåì, èñïîëüçóÿ àäðåñ, êîòîðûé åé äàåòñÿ, ïîìåùàåò ýòó âåëè÷èíó â ïàìÿòü.
Óêàçàòåëè ïîçâîëÿþò îáîéòè òîò ôàêò, ÷òî ïåðåìåííûå ôóíêöèè interchange( ) ÿâëÿþòñÿ ëîêàëüíûìè. Îíè äàþò âîçìîæíîñòü íàøåé ôóíêöèè "äîáðàòüñÿ" äî ôóíêöèè main( ) è èçìåíèòü âåëè÷èíû îïèñàííûõ â íåé îáúåêòîâ.
Ïðîãðàììèñòû, ðàáîòàþùèå íà ÿçûêå Ïàñêàëü, ìîãóò çàìåòèòü, ÷òî ïåðâàÿ ôîðìà âûçîâà àíàëîãè÷íà îáðàùåíèþ ñ ïàðàìåòðîì-çíà÷åíèåì, à âòîðàÿ - ñ ïàðàìåòðîì-ïåðåìåííîé. Ó ïðîãðàììèñòîâ, ïèøóùèõ íà ÿçûêå Áåéñèê, ïîíèìàíèå âñåé ýòîé ìåòîäèêè ìîæåò âûçâàòü íåêîòîðûå çàòðóäíåíèÿ.  ýòîì ñëó÷àå åñëè ìàòåðèàë äàííîãî ðàçäåëà ïîêàæåòñÿ âàì ïîíà÷àëó âåñüìà íå îáû÷íûì, íå ñîìíåâàéòåñü, ÷òî áëàãîäàðÿ íåêîòîðîé ïðàêòèêå, âñå îáñóæäàåìûå ñðåäñòâà ñòàíóò ïðîñòûìè, åñòåñòâåííûìè è óäîáíûìè.
Ïåðåìåííûå: èìåíà, àäðåñà è çíà÷åíèÿ.
Íàøå îáñóæäåíèå óêàçàòåëåé ñòðîèòñÿ íà ðàññìîòðåíèè ñâÿçåé ìåæäó èìåíàìè, àäðåñàìè è çíà÷åíèÿìè ïåðåìåííûõ; äàëüøå ìû ïðîäîëæèì îáñóæäåíèå ýòèõ âîïðîñîâ.
Ïðè íàïèñàíèè ïðîãðàììû ìû ïðåäñòàâëÿåì ñåáå ïåðåìåííóþ êàê îáúåêò, èìåþùèé äâà àòðèáóòà: èìÿ è çíà÷åíèå. (Êðîìå óêàçàííûõ, ñóùåñòâóþò åùå è äðóãèå àòðèáóòû, íàïðèìåð òèï, íî ýòî óæå äðóãîé âîïðîñ). Ïîñëå êîìïèëÿöèè ïðîãðàììû è çàãðóçêè â ïàìÿòü "ñ òî÷êè çðåíèÿ ìàøèíû" äàííàÿ ïåðåìåííàÿ èìååò òîæå äâà àòðèáóòà: àäðåñ è çíà÷åíèå. Àäðåñ - ýòî ìàøèííûé âàðèàíò èìåíè.
Âî ìíîãèõ ÿçûêàõ ïðîãðàììèðîâàíèÿ àäðåñ îáúåêòà ñêðûò îò ïðîãðàììèñòà è ñ÷èòàåòñÿ îòíîñÿùèìñÿ ê óðîâíþ ìàøèíû.  ÿçûêå Ñè áëàãîäàðÿ îïåðàöèè & ìû èìååì âîçìîæíîñòü óçíàòü è èñïîëüçîâàòü àäðåñ ïåðåìåííîé:
&bàrn - ýòî àäðåñ ïåðåìåííîé bàrn.
Ìû ìîæåì ïîëó÷èòü çíà÷åíèå ïåðåìåííîé, ñîîòâåòñòâóþùåå äàííîìó èìåíè, èñïîëüçóÿ òîëüêî ñàìî èìÿ:
Printf(" %d\n", barn) ïå÷àòàåò çíà÷åíèå ïåðåìåííîé barn.
Ìû ìîæåì òàêæå ïîëó÷èòü çíà÷åíèå ïåðåìåííîé, èñõîäÿ èç åå àäðåñà, ïðè ïîìîùè îïåðàöèè *:

ÐÈÑ. 9.6. Èìåíà, àäðåñà è âåëè÷ííû â ñèñòåìå ñ "áàéòîâîé àäðåñàöèåé" òèíà IBM PC.
Äàíî pbarn = &bàrn; òîãäà *pbarn - ýòî âåëè÷èíà, ïîìåùåííàÿ ïî àäðåñó &bàrn. Õîòÿ ìû è ìîæåì íàïå÷àòàòü àäðåñ ïåðåìåííîé äëÿ óäîâëåòâîðåíèÿ ñâîåãî ëþáîïûòñòâà, ýòî íå îñíîâíîå ïðèìåíåíèå îïåðàöèè &. Áîëåå âàæíûì ÿâëÿåòñÿ òî, ÷òî íàëè÷èå îïåðàöèé &, * è óêàçàòåëåé ïîçâîëÿåò îáðàáàòûâàòü àäðåñà è èõ ñîäåðæèìîå â ñèìâîëè÷åñêîì âèäå, ÷åì ìû è çàíèìàëèñü â ïðîãðàììå îáìåí3.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÍÀØÈÕ ÇÍÀÍÈÉ Î ÔÓÍÊÖÈßÕ.
Òåïåðü, êîãäà ìû çíàåì î ôóíêöèÿõ íåìíîãî áîëüøå, ñîáåðåì âìåñòå íåñêîëüêî ïîó÷èòåëüíûõ ïðèìåðîâ, íî ñíà÷àëà ðåøèì, ÷åì ìû áóäåò çàíèìàòüñÿ.
×òî âû ñêàæåòå íàñ÷åò ôóíêöèè âîçâåäåíèÿ â ñòåïåíü, êîòîðàÿ äàåò âîçìîæíîñòü âîçâîäèòü 2 â 5-þ ñòåïåíü èëè 3 â 3-þ è ò. ä.? Âî-ïåðâûõ, íåîáõîäèìî ðåøèòü, ÷òî áóäåò ñëóæèòü âõîäîì ïðîãðàììû. Ýòî ïîíÿòíî: Ñè òðåáóåòñÿ çíàòü ÷èñëî, âîçâîäèìîå â ñòåïåíü, è ïîêàçàòåëü ñòåïåíè. Äîñòè÷ü ýòîãî ìîæíî ïóòåì ââåäåíèÿ äâóõ àðãóìåíòîâ:
Ðîwår(base, exp).
Int base, exp;
(Ìû îãðàíè÷èëèñü çäåñü öåëûìè ÷èñëàìè, à òàêæå òåì ïðåäïîëîæåíèåì, ÷òî ðåçóëüòàò áóäåò ñðàâíèòåëüíî íåâåëèê.).
Äàëåå òðåáóåòñÿ ðåøèòü, ÷òî áóäåò âûõîäîì ôóíêöèè. Îòâåò, êîíå÷íî, òîæå î÷åâèäåí. Âûõîäîì äîëæíî áûòü îäíî ÷èñëî, ÿâëÿþùååñÿ çíà÷åíèåì ïåðåìåííîé answer. Ìû ìîæåì ðåàëèçîâàòü ýòî ñ ïîìîùüþ îïåðàòîðà.
Råturn(answcr);
Òåïåðü äëÿ ïîëó÷åíèÿ òðåáóåìîãî ðåçóëüòàòà âûáåðåì àëãîðèòì:
óñòàíîâèì ïåðåìåííóþ answer ðàâíîé 1,
óìíîæèì answer íà base ñòîëüêî ðàç, ñêîëüêî óêàçûâàåò exp.
Âîçìîæíî, íå ñîâñåì ÿñíî, êàê îñóùåñòâèòü âòîðîé øàã, ïîýòîìó ðàçîáüåì åãî äàëüøå íà áîëåå ìåëêèå øàãè:
óìíîæèì answer íà base è óìåíüøèì íà 1, îñòàíîâèìñÿ, êîãäà exp ñòàíåò ðàâíîé 0.
Åñëè çíà÷åíèå exp ðàâíî, ñêàæåì 3, òîãäà èñïîëüçîâàíèå òàêîãî àëãîðèòìà ïðèâåäåò ê òðåì óìíîæåíèÿì; ïîýòîìó äàííûé ñïîñîá êàæåòñÿ âïîëíå ðàçóìíûì.
Î÷åíü õîðîøî. Âûðàçèì òåïåðü ýòîò àëãîðèòì â âèäå ïðîãðàììû íà ÿçûêå Ñè.
/* âîçâîäèò îñíîâàíèå â ñòåïåíü */
Power(base, exp).
Int base, exp;
{
Int answer;
For (answer = 1; exp > 0; exp--).
answer = answer* base;
Return(answer);
}
Òåïåðü ïðîâåðèì åå ðàáîòó ñ ïîìîùüþ äðàéâåðà.
/* ïðîâåðêà âîçâåäåíèÿ â ñòåïåíü */
Main( ).
{
Int x;
Õ= power(2,3);
Printf(" %d\n", x);
X = power(-3,3);
Prinif(" %d\n", x);
X = power(4, -2);
Printf(" %d\n", x);
X = power(5, 10);
Printf(" %d\n", x);
}
Îáúåäèíèì óêàçàííûå äâå ôóíêöèè, ïðîâåäåì êîìïèëÿöèþ è âûïîëíèì äàííóþ ïðîãðàììó. Ðåçóëüòàòû îêàçûâàþòñÿ ñëåäóþùèìè:
8.
-27.
1.
761.
Èòàê, 2 â 3-é ñòåïåíè - ýòî 8, à - 3 â 3-é ðàâíî -27. Ïîêà âñå ïðàâèëüíî. Íî 4 â ñòåïåíè -2 ðàâíî 1/16, à íå 1. À 5 â 10-é ñòåïåíè, åñëè ïàìÿòü íàì íå èçìåíÿåò,- ýòî 9 765 625.  ÷åì äåëî? Âî-ïåðâûõ, ïðîãðàììà íå ïðåäíàçíà÷àëàñü äëÿ îáðàáîòêè îòðèöàòåëüíûõ ñòåïåíåé, ïîýòîìó îíà è íå ñìîãëà ñïðàâèòüñÿ ñ ýòîé çàäà÷åé. Âî-âòîðûõ, â íàøåé ñèñòåìå âåëè÷èíû òèïà int íå ìîãóò ïðåâîñõîäèòü 65 535.
Ìîæíî ðàñøèðèòü ïðîãðàììó ïóòåì âêëþ÷åíèÿ â íåå îáðàáîòêè îòðèöàòåëüíûõ ñòåïåíåé è èñïîëüçîâàíèÿ ÷èñåë ñ ïëàâàþùåé òî÷êîé äëÿ ïðåäñòàâëåíèÿ ïåðåìåííûõ base è answer.  ëþáîì ñëó÷àå ïîêàçàòåëü ñòåïåíè äîëæåí âûðàæàòüñÿ öåëûì ÷èñëîì, ïîòîìó ÷òî ýòî ÷èñëî âûïîëíÿåìûõ óìíîæåíèé; íåëüçÿ ïðîèçâåñòè 2,31 óìíîæåíèÿ.
/* âîçâîäèò îñíîâàíèå â ñòåïåíü*/
Double ðîwår(base, åõð).
Double, base;
Int exp;
{
double answer;
If(exp > 0).
{
For(answer = 1.0; exp > 0; exp --) answer * = base;
Return(answer);
}
else if(base != 0).
{
for(answer = 1.0; exp < 0; exp++ ) answer /= base;
Return(answer);
}
else /* base = 0 èåõð <= 0 */
{
printf(" Íåëüçÿ âîçâîäèòü 0 â %d ñòåïåíü!\n", exp);
Return(0);
}
}
Íåîáõîäèìî îòìåòèòü çäåñü íåñêîëüêî ìîìåíòîâ.
Ïåðâûé: ñàìûì ãëàâíûì ÿâëÿåòñÿ òî, ÷òî ìû äîëæíû îïèñàòü òèï ôóíêöèè! Ïåðåìåííàÿ answer èìååò òèï double, ñëåäîâàòåëüíî, ñàìà ôóíêöèÿ power() òîæå äîëæíà áûòü òèïà double, òàê êàê åé ïðèñâàèâàåòñÿ âåëè÷èíà, âîçâðàùàåìàÿ îïåðàòîðîì return. Ïî÷åìó, ñïðîñèòå âû, ìû íå îïèñûâàëè òèï ôóíêöèè ðàíüøå? Äåëî â òîì, ÷òî ïî óìîë÷àíèþ â ÿçûêå Ñè ôóíêöèÿ èìååò òèï int (äëÿ áîëüøèíñòâà ôóíêöèé ýòî òàê), åñëè íå óêàçàíî ÷òî-òî èíîå.
Âòîðîé: ìû õîòåëè ïîêàçàòü, ÷òî íå çàáûëè òå íîâûå îïåðàöèè ïðèñâàèâàíèÿ, êîòîðûå ââåëè â ãë. 8.
Òðåòèé: â ñîîòâåòñòâèè ñ àëãåáðàè÷åñêèìè ïðàâèëàìè âîçâåäåíèå â îòðèöàòåëüíóþ ñòåïåíü áûëî ïðåîáðàçîâàíî â äåëåíèå. Ýòî âíåñëî îïàñíîñòü äåëåíèÿ íà íóëü, íî â äàííîì ñëó÷àå ìû ïðåäóñìîòðåëè âûäà÷ó ñîîáùåíèÿ îá îøèáêå è âîçâðàò çíà÷åíèÿ 0, ÷òîáû ðàáîòà ïðîãðàììû íå ïðåêðàùàëàñü.
Ìû ìîæåì âîñïîëüçîâàòüñÿ òåì æå äðàéâåðîì ïðè óñëîâèè, ÷òî òèï ôóíêöèè power( ) òàì òîæå îïèñàí.
/* ïðîâåðêà âîçâåäåíèÿ â ñòåïåíü*/
Main( ).
{
Double x;
Double power( ); /* ýòî ïðèìåð îïèñàíèÿ ôóíêöèè */
X = power(2.0, 3);
Printf(" %.0f \n", x);x = power(-3.0, 3);
Printf(" %.0f\n" , x);x = power(4.0, -2);
Printf(" %.4f\n", x);x = power(5.0, 10);
Print f ("%.0f \n", x);
}
Íà ýòîò ðàç ðåçóëüòàòû ðàáîòû ïðîãðàììû âûãëÿäÿò âïîëíå óäîâëåòâîðèòåëüíî.
8.
-27.
0.0625.
9765625.
Äàííûé ïðèìåð ïîáóæäàåò íàñ ââåñòè ñëåäóþùèé êîðîòêèé ðàçäåë.
ÎÏÈÑÀÍÈÅ ÒÈÏÎÂ ÔÓÍÊÖÈÉ.
Òèï ôóíêöèè îïðåäåëÿåòñÿ òèïîì âîçâðàùàåìîãî åþ çíà÷åíèÿ, à íå òèïîì åå àðãóìåíòîâ. Åñëè óêàçàíèå òèïà îòñóòñòâóåò, òî ïî óìîë÷àíèþ ñ÷èòàåòñÿ, ÷òî ôóíêöèÿ èìååò òèï int. Åñëè çíà÷åíèÿ ôóíêöèè íå ïðèíàäëåæàò òèïó int, òî íåîáõîäèìî óêàçàòü åå òèï â äâóõ ìåñòàõ.
1. Îïèñàòü òèï ôóíêöèè â åå îïðåäåëåíèè:
Char pun(ch, n) /* ôóíêöèÿ âîçâðàùàåò ñèìâîë */
Int n;
Char ch;
Float raft(num) /* ôóíêöèÿ âîçâðàùàåò âåëè÷èíó òèïà float */
Int num;
2. Îïèñàòü òèï ôóíêöèè òàêæå â âûçûâàþùåé ïðîãðàììå. Îïèñàíèå ôóíêöèè äîëæíî áûòü ïðèâåäåíî íàðÿäó ñ îïèñàíèÿìè ïåðåìåííûõ ïðîãðàììû; íåîáõîäèìî òîëüêî óêàçàòü ñêîáêè (íî íå àðãóìåíòû) äëÿ èäåíòèôèêàöèè äàííîãî îáúåêòà êàê ôóíêöèè.
Main( ).
{
Char rch, pun( );
Float raft;
}
Çàïîìíèòå! Åñëè ôóíêöèÿ âîçâðàùàåò âåëè÷èíó íå òèïà int, óêàçûâàéòå òèï ôóíêöèè òàì, ãäå îíà îïðåäåëÿåòñÿ, è òàì, ãäå îíà èñïîëüçóåòñÿ.
Ðåçþìå: ôóíêöèè.
1. Ôîðìà çàïèñè.
Òèïè÷íîå îïðåäåëåíèå ôóíêöèè èìååò ñëåäóþùèé âèä:
Èìÿ (ñïèñîê àðãóìåíòîâ).
Îïèñàíèå àðãóìåíòîâ.
Òåëî ôóíêöèè.
Íàëè÷èå ñïèñêà àðãóìåíòîâ è îïèñàíèé íå ÿâëÿåòñÿ îáÿçàòåëüíûì. Ïåðåìåííûå, îòëè÷íûå îò àðãóìåíòîâ, îïèñûâàþòñÿ âíóòðè òåëà, êîòîðîå çàêëþ÷àåòñÿ â ôèãóðíûå ñêîáêè.
Ïðèìåð:
Diff(x, ó) /* èìÿ ôóíêöèè è ñïèñîê àðãóìåíòîâ */
Ini x, ó; /* îïèñàíèå àðãóìåíòîâ */
{ /* íà÷àëî òåëà ôóíêöèè */
Int z; /* îïèñàíèå ëîêàëüíîé ïåðåìåííîé */
Z = õ - ó;return(z);
} /* êîíåö òåëà ôóíêöèè */
II. Ïåðåäà÷à çíà÷åíèé ôóíêöèè:
Àðãóìåíòû èñïîëüçóþòñÿ äëÿ ïåðåäà÷è çíà÷åíèé èç âûçûâàþùåé ïðîãðàììû è ôóíêöèþ. Åñëè çíà÷åíèÿ ïåðåìåííûõ à è b áóäóò 5 è 2, òî ïðè âûçîâå.
Ñ = diff(à,b);
Îñóùåñòâëÿåòñÿ ïåðåäà÷à ýòèõ çíà÷åíèé ïåðåìåííûì õ è ó. Çíà÷åíèÿ 5 è 2 íàçûâàþò ñÿ ôàêòè÷åñêèìè àðãóìåíòàìè, à ïåðåìåííûå õ è ó, óêàçàííûå â îïèñàíèè ôóíêöèè: diff( ) - ôîðìàëüíûìè àðãóìåíòàìè.
Èñïîëüçîâàíèå êëþ÷åâîãî ñëîâà return ïîçâîëÿåò ïåðåäàâàòü â âûçûâàþùóþ ïðîãðàììó îäíî çíà÷åíèå èç âûçûâàåìîé ôóíêöèè.  íàøåì ïðèìåðå ïåðåìåííîé ñ ïðèñâàèâàåòñÿ çíà÷åíèå ïåðåìåííîé z, ðàâíîå 3.
Îáû÷íî âûïîëíåíèå ôóíêöèè íå îêàçûâàåò íèêàêîãî âëèÿíèÿ íà çíà÷åíèÿ ïåðåìåííûõ âûçûâàþùåé ïðîãðàììû. ×òîáû èìåòü âîçìîæíîñòü íåïîñðåäñòâåííî èçìåíÿòü çíà÷åíèÿ ïåðåìåííûõ âûçûâàþùåé ïðîãðàììû, íåîáõîäèìî èñïîëüçîâàòü óêàçàòåëè â êà÷åñòâå àðãóìåíòîâ. Ýòî ìîæåò îêàçàòüñÿ íåîáõîäèìûì â ñëó÷àå, åñëè â âûçûâàþùóþ ïðîãðàììó òðåáóåòñÿ ïåðåäàòü áîëåå ÷åì îäíî çíà÷åíèå.
III. Òèï ôóíêöèè.
Ôóíêöèè äîëæíû èìåòü òîò æå òèï, ÷òî è çíà÷åíèÿ, êîòîðûå îíè âîçâðàùàþò â êà÷åñòâå ðåçóëüòàòîâ. Ïî óìîë÷àíèþ ïðåäïîëàãàåòñÿ, ÷òî ôóíêöèè èìåþò òèï int. Åñëè ôóíêöèÿ èìååò äðóãîé òèï, îí äîëæåí áûòü óêàçàí è â âûçûâàþùåé ïðîãðàììå, è â ñàìîì îïðåäåëåíèè ôóíêöèè.
Ïðèìåð.
Main( ).
{
Float q, x, duff( ); /* îïèñàíèå â âûçûâàþùåé ïðîãðàììå */
Int n;
...
Q = duff(õ, n);
...
}
Float duff(u, k); /* îïèñàíèå â îïðåäåëåíèè ôóíêöèè */
Float u;
Int k;
{
Float tor;
...
Return(tor); /* âîçâðàùàåò çíà÷åíèå òèïà float */
}
 ßÇÛÊÅ ÑÈ ÂÑÅ ÔÓÍÊÖÈÈ ÐÀÂÍÎÏÐÀÂÍÛ.
Âñå ôóíêöèè â ïðîãðàììå, íàïèñàííîé íà ÿçûêå Ñè, ðàâíîïðàâíû: êàæäàÿ èç íèõ ìîæåò âûçûâàòü ëþáóþ äðóãóþ ôóíêöèþ è â ñâîþ î÷åðåäü êàæäàÿ ìîæåò áûòü âûçâàíà ëþáîé äðóãîé ôóíêöèåé. Ýòî äåëàåò ôóíêöèè ÿçûêà Ñè íåñêîëüêî îòëè÷íûìè îò ïðîöåäóð Ïàñêàëÿ, ïîñêîëüêó ïðîöåäóðû â Ïàñêàëå ìîãóò áûòü âëîæåíû â äðóãèå ïðîöåäóðû (ïðè÷åì, ïðîöåäóðû, ñîäåðæàùèåñÿ â îäíîì ãíåçäå, ÿâëÿþòñÿ íåäîñòóïíûìè äëÿ ïðîöåäóð, ðàñïîëîæåííûõ â äðóãîì).
Íåò ëè ó ôóíêöèè main( ) êàêîé-òî ñïåöèôèêè? Áåçóñëîâíî, åñòü; îíà çàêëþ÷àåòñÿ â òîì, ÷òî ïîñëå "ñáîðêè" ïðîãðàììû, ñîñòîÿùåé èç íåñêîëüêèõ ôóíêöèé, åå âûïîëíåíèå íà÷èíàåòñÿ ñ ïåðâîãî îïåðàòîðà ôóíêöèè main( ). Íî ýòèì åå èñêëþ÷èòåëüíîñòü è ãðàíè÷èâàåòñÿ. Äàæå ôóíêöèÿ main( ) ìîæåò áûòü âûçâàíà äðóãèìè ôóíêöèÿìè, êàê ïîêàçûâàåò ïðèâåäåííûé íèæå ïðèìåð:
/* âûçîâôóíêöèè main( ) */
#include
Main( ).
{
Char ch;
Printf (" Óêàæèòå ïðîèçâîëüíûé ñèìâîë. Q - ïðèçíàê êîíöà ðàáîòû. \n");
Ch = getchar( );
Printf ("Òàê! Âû óêàçàëè %ñ!\n", ch);
If(ch != 'Q') more( );
}
More( );
{
Main( );
}
Ôóíêöèÿ main( ) âûçûâàåò more(), à ôóíêöèÿ more() âûçûâàåò main()! Ïîñëå âûçîâà ôóíêöèè main( ) åå âûïîëíåíèå íà÷èíàåòñÿ ñ ñàìîãî íà÷àëà; ìû îðãàíèçîâàëè öèêë ñ âçàèìíûì âûçîâîì.
Ôóíêöèÿ ìîæåò äàæå âûçûâàòü ñàìà ñåáÿ. Óïðîñòèì ïðåäûäóùèé ïðèìåð ñëåäóþùèì îáðàçîì:
/* main.main */
#include.
Main( ).
{
Char ch;
Printf (" Óêàæèòå ïðîèçâîëüíûé ñèìâîë. Q - ïðèçíàê êîíöà ðàáîòû.\n");
Ch = getchar( );
Printf ("Òàê! Âû óêàçàëè %ñ!\n", ch);
If(ch != 'Q') main( );
}
Íèæå ïðèâîäÿòñÿ ðåçóëüòàòû îäíîãî ïðîãîíà ïðîãðàììû, ïîêàçûâàþùèå, ÷òî îíà ðàáîòàåò. Îáðàòèòå âíèìàíèå íà òî, êàê îáðàáàòûâàåòñÿ ñèìâîë "íîâàÿ ñòðîêà", êîòîðûé ïåðåäàåòñÿ ïðîãðàììå ïðè íàæàòèè êëàâèøè [ââîä].
Ââåäèòå ïðîèçâîëüíûé ñèìâîë. Q - ïðèçíàê êîíöà ðàáîòû.
I.
Òàê! Âû óêàçàëè I !
Ââåäèòå ïðîèçâîëüíûé ñèìâîë. Q - ïðèçíàê êîíöà ðàáîòû.
!
Òàê! Âû óêàçàëè ! !
Ââåäèòå ïðîèçâîëüíûé ñèìâîë. Q - ïðèçíàê êîíöà ðàáîòû.
Q.
Òàê! Âû óêàçàëè Q !
Äåéñòâèå, ñîñòîÿùåå â òîì, ÷òî ôóíêöèÿ âûçûâàåò ñàìà ñåáÿ, íàçûâàåòñÿ "ðåêóðñèåé". Öèêë, êîòîðûé ìû ñîçäàëè, èñïîëüçóÿ ðåêóðñèþ, îòëè÷àåòñÿ îò öèêëîâ while è do while. Êîãäà ôóíêöèÿ main( ) âûçûâàåò ñàìà ñåáÿ, íå ïðîèñõîäèò ïåðåäà÷è óïðàâëåíèÿ íà åå íà÷àëî. Âìåñòî ýòîãî â ïàìÿòè ìàøèíû ñîçäàþòñÿ êîïíè âñåãî íàáîðà ïåðåìåííûõ ôóíêöèè main( ). Åñëè âû âûâåäåòå íà ïå÷àòü àäðåñà ïåðåìåííûõ â îáû÷íîì öèêëå, òî óâèäèòå, ÷òî ýòè àäðåñà íå èçìåíÿþòñÿ îò èòåðàöèè ê èòåðàöèè. ×òî æå êàñàåòñÿ ðàññìàòðèâàåìîãî çäåñü öèêëà, òî â íåì àäðåñ èñïîëüçóåìîé ïåðåìåííîé ìåíÿåòñÿ, ïîñêîëüêó ïðè êàæäîì âûïîëíåíèè òåëà öèêëà ñîçäàåòñÿ íîâàÿ êîïèÿ ïåðåìåííîé ch. Åñëè ïðîãðàììà öèêëè÷åñêè âûïîëíÿåòñÿ 20 ðàç, òî áóäåò ñîçäàíî 20 ðàçëè÷íûõ êîïèé ïåðåìåííîé, êàæäàÿ èç êîòîðûõ íîñèò èìÿ ch, íî èìååò ñâîé ñîáñòâåííûé àäðåñ.
Êîìïèëÿöèÿ ïðîãðàìì, ñîñòîÿùèõ èç äâóõ èëè áîëåå ôóíêöèé.
Ïðîñòåéøèé ñïîñîá èñïîëüçîâàíèÿ íåñêîëüêèõ ôóíêöèé â îäíîé ïðîãðàììå çàêëþ÷àåòñÿ â òîì, ÷òîáû ïîìåñòèòü èõ â îäèí ôàéë, ïîñëå ÷åãî îñóùåñòâèòü êîìïèëÿöèþ ïðîãðàììû, ñîäåðæàùåéñÿ â ýòîì ôàéëå òàê, êàê áóäòî îíà ñîñòîÿëà èç îäíîé ôóíêöèè.
Âòîðîé ñïîñîá çàêëþ÷àåòñÿ è ïðèìåíåíèè äèðåêòèâû #include. Åñëè îäíà ôóíêöèÿ ñîäåðæèòñÿ â ôàéëå ñ èìåíåì file1.ñ, à âòîðàÿ è ôàéëå file2.c, ïîìåñòèòå ýòó äèðåêòèâó â ôàéë filel.c:
#include "file2.c".
Äîïîëíèòåëüíàÿ èíôîðìàöèÿ î äèðåêòèâå #include íàõîäèòñÿ â ãë. 11. Äðóãèå âîçìîæíûå ñïîñîáû ÿâëÿþòñÿ â áîëüøåé ñòåïåíè ñèñòåìíîçàâèñèìûìè. Âîò íåêîòîðûå èç íèõ:
OC UNIX.
Ïðåäïîëîæèì, file1.ñ è file2.c - äâà ôàéëà, ñîäåðæàùèå ïðîãðàììíûå òåêñòû, ñîîòâåòñòâóþùèå ôóíêöèÿì ÿçûêà Ñè. Â ðåçóëüòàòå âûïîëíåíèÿ êîìàíäû.
Cc file1.c file2.c.
Áóäåò îñóùåñòâëåíà êîìïèëÿöèÿ ôóíêöèé, ñîäåðæàùèõñÿ â îáîèõ ôàéëàõ, è ïîëó÷åí ôàéë âûïîëíÿåìîãî êîäà ñ èìåíåì a.out. Êðîìå òîãî, áóäóò ñîçäàíû äâà ôàéëà ñ "îáúåêòíûì" êîäîì - file1.0 è file2.0. Åñëè ïîçæå âû èçìåíèòå òåêñò, ñîäåðæàùèéñÿ â ôàéëå ñ èìåíåì filel.ñ, à âòîðîé ôàéë îñòàâèòå áåç èçìåíåíèé, òî ñìîæåòå îñóùåñòâèòü êîìïèëÿöèþ ïåðâîãî ôàéëà, à çàòåì îáúåäèíèòü ïîëó÷åííûé îáúåêòíûé êîä ñ îáúåêòíûì êîäîì, ñîîòâåòñòâóþùèì âòîðîìó ôàéëó, ïðè ïîìîùè êîìàíäû.
Cc file1.c file2.0
ÊîìïèëÿòîðûLàttiñå C èÌIÑRÎSÎFÒ C.
Âûïîëíèòå ðàçäåëüíóþ êîìïèëÿöèþ ôóíêöèè, ñîäåðæàùèõñÿ â ôàéëàõ filel.c è file2.c; â ðåçóëüòàòå áóäóò ïîëó÷åíû äâà ôàéëà ñ îáúåêòíûì êîäîì - file1.obj è file2.obj. Èñïîëüçóéòå ñèñòåìíûé ðåäàêòîð ñâÿçåé äëÿ îáúåäèíåíèÿ èõ äðóã ñ äðóãîì è ñî ñòàíäàðòíûì îáúåêòíûì ìîäóëåì ñ.obj:
Link ñ filel file2.
Ñèñòåìû, ïîñòðîåííûå íà îñíîâå òðàíñëÿöèè â àññåìáëåðíûé êîä.
Íåêîòîðûå èç òàêèõ ñèñòåì ïîçâîëÿþò êîìïèëèðîâàòü ôóíêöèè, ñîäåðæàùèåñÿ â íåñêîëüêèõ ôàéëàõ, ñðàçó òàê æå, êàê â ÎÑ UNIX ñ ïîìîùüþ êîìàíäû:
Ññ filel.ñ file2.c.
Èëè êàêîãî-òî åå ýêâèâàëåíòà.  íåêîòîðûõ ñëó÷àÿõ âû ìîæåòå ïîëó÷èòü îòäåëüíûå ìîäóëè ñ êîäîì àññåìáëåðà, à çàòåì îáúåäèíèòü èõ, èñïîëüçóÿ ïðîöåññ àññåìáëèðîâàíèÿ.
ÐÅÇÞÌÅ.
Äëÿ ñîçäàíèÿ áîëüøèõ ïðîãðàìì âû äîëæíû èñïîëüçîâàòü ôóíêöèè â êà÷åñòâå "ñòðîèòåëüíûõ áëîêîâ". Êàæäàÿ ôóíêöèÿ äîëæíà âûïîëíÿòü îäíó âïîëíå îïðåäåëåííóþ çàäà÷ó. Èñïîëüçóéòå àðãóìåíòû äëÿ ïåðåäà÷è çíà÷åíèé ôóíêöèè è êëþ÷åâîå ñëîâî return äëÿ ïåðåäà÷è ðåçóëüòèðóþùåãî çíà÷åíèÿ â âûçûâàþùóþ ïðîãðàììó. Åñëè âîçâðàùàåìîå ôóíêöèåé çíà÷åíèå íå ïðèíàäëåæèò òèïó int, âû äîëæíû óêàçàòü òèï ôóíêöèè â åå îïðåäåëåíèè è â ðàçäåëå îïèñàíèé âûçûâàþùåé ïðîãðàììû. Åñëè âû õîòèòå, ÷òîáû ïðè âûïîëíåíèè ôóíêöèè ïðîèñõîäèëî èçìåíåíèå çíà÷åíèè ïåðåìåííûõ â âûçûâàþùåé ïðîãðàììå, âû äîëæíû ïîëüçîâàòüñÿ àäðåñàìè è óêàçàòåëÿìè.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îïðåäåëÿòü ôóíêöèþ.
Êàê ïåðåäàâàòü ôóíêöèè èíôîðìàöèþ: ïðè ïîìîùè àðãóìåíòîâ.
Ðàçëè÷èå ìåæäó ôîðìàëüíûì è ôàêòè÷åñêèì àðãóìåíòàìè: ïåðâûé ÿâëÿåòñÿ ïåðåìåííîé, èñïîëüçóåìîé ôóíêöèåé, à âòîðîé - çíà÷åíèåì, ïîñòóïàþùèì èç âûçûâàþùåé ôóíêöèè.
Ãäå íåîáõîäèìî îïèñûâàòü àðãóìåíòû: ïîñëå èìåíè ôóíêöèè è ïåðåä ïåðâîé ôèãóðíîé ñêîáêîé.
Ãäå íåîáõîäèìî îïèñûâàòü îñòàëüíûå ëîêàëüíûå ïåðåìåííûå: ïîñëå ïåðâîé ôèãóðíîé ñêîáêè.
Êîãäà è êàê èñïîëüçîâàòü îïåðàòîð return.
Êîãäà è êàê èñïîëüçîâàòü àäðåñà è óêàçàòåëè äëÿ äîñòóïà ê îáúåêòàì.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. Íàïèøèòå ôóíêöèþ, âîçâðàùàþùóþ ñóììó äâóõ öåëûõ ÷èñåë.
2. Êàêèå èçìåíåíèÿ äîëæíû áûëè áû ïðîèçîéòè ñ ôóíêöèåé èç âîïðîñà 1, åñëè âìåñòî öåëûõ ñêëàäûâàëèñü áû äâà ÷èñëà òèïà float?
3. Íàïèøèòå ôóíêöèþ alter( ), êîòîðàÿ áåðåò äâå ïåðåìåííûå õ è ó òèïà int è çàìåíÿåò ñîîòâåòñòâåííî íà èõ ñóììó è ðàçíîñòü.
4. Ïðîâåðüòå, âñå ëè ïðàâèëüíî â îïðåäåëåíèè ôóíêöèè, ïðèâåäåííîé íèæå?
Salami(num).
{
Int num, count;
For(count = 1; count <= num; num++) printf(" Îñàëÿìè!\n");
}
Îòâåòû.
1.
Sum(j,k) int j, k;
{ return(j+k); }.
2.
Float sum(j,k) float j,k;
Íåîáõîäèìî òàêæå ïðèâåñòè îïèñàíèå ôóíêöèè float sum( ) è âûçûâàþùåé ïðîãðàììå.
3. Ïîñêîëüêó ìû õîòèì èçìåíèòü äâå ïåðåìåííûå â âûçûâàþùåé ïðîãðàììå, ìîæíî âîñïîëüçîâàòüñÿ àäðåñàìè è óêàçàòåëÿìè. Îáðàùåíèå ê ôóíêöèè áóäåò âûãëÿäåòü òàê: alter(&x,&y). Âîçìîæíîå ðåøåíèå èìååò ñëåäóþùèé âèä:
Alter(px, ðó).
Int *ðõ, *ðó; /* óêàçàòåëè íà õ è ó*/
{
Int sum, diff;
Sum = *ðõ + *ðó; /* ñêëàäûâàåò ñîäåðæèìîå äâóõ ïåðåìåííûõ, îïðåäåëÿåìûõ àäðåñàìè */
Diff = *ðõ- *ðó;
*ðõ= sum;
*ðó = diff;
}
4. Íåò; ïåðåìåííàÿ num äîëæíà áûòü îïèñàíà ïåðåä ïåðâîé ôèãóðíîé ñêîáêîé, à íå ïîñëå íåå. Êðîìå òîãî, âûðàæåíèå num++ íåîáõîäèìî çàìåíèòü íà count++.
ÓÏÐÀÆÍÅÍÈß.
1. Íàïèøèòå ôóíêöèþ màõ(õ, ó), âîçâðàùàþùóþ áîëüøåå èç äâóõ çíà÷åíèè.
2. Íàïèøèòå ôóíêöèþ chllne(ch, i, j), ïå÷àòàþùóþ çàïðîøåííûé ñèìâîë ñ i-é ïî j-þ ïîçèöèè. Ñìîòðè ïðîãðàììó õóäîæíèê-ãðàôèê, ïðèâåäåííóþ â ãë. 7.
10. Êëàññû ïàìÿòè è ðàçðàáîòêà ïðîãðàìì.
ËÎÊÀËÜÍÛÅ È ÃËÎÁÀËÜÍÛÅ ÏÅÐÅÌÅÍÍÛÅ.
ÊËÀÑÑÛ ÏÀÌßÒÈ.
ÔÓÍÊÖÈß ÏÎËÓ×ÅÍÈß ÑËÓ×ÀÉÍÛÕ ×ÈÑÅË.
ÏÐÎÂÅÐÊÀ ÎØÈÁÎÊ.
ÌÎÄÓËÜÍÎÅ ÏÐÎÃÐÀÌÌÈÐÎÂÀÍÈÅ.
ÑÎÐÒÈÐÎÂÊÀ.
ÊËÞ×ÅÂÛÅ ÑËÎÂÀ: auto, extern, static, register.
Îäíî èç äîñòîèíñòâ ÿçûêà Ñè ñîñòîèò â òîì, ÷òî îí ïîçâîëÿåò óïðàâëÿòü êëþ÷åâûìè ìåõàíèçìàìè ïðîãðàììû. Êëàññû ïàìÿòè ÿçûêà Ñè - ïðèìåð òàêîãî óïðàâëåíèÿ; îíè äàþò âîçìîæíîñòü îïðåäåëèòü, ñ êàêèìè ôóíêöèÿìè ñâÿçàíû êàêèå ïåðåìåííûå è êàê äîëãî ïåðåìåííàÿ ñîõðàíÿåòñÿ â ïðîãðàììå. Êëàññû ïàìÿòè - ïåðâàÿ òåìà äàííîé ãëàâû.
Ïðîãðàììèðîâàíèå, òî÷íî òàê æå êàê íàïèñàíèå ðîìàíà (èëè äàæå ïèñüìà),- ýòî íå ïðîñòî çíàíèå ÿçûêîâûõ ïðàâèë - ýòî íå÷òî áîëüøåå.  äàííîé ãëàâå ìû ðàññìîòðèì íåñêîëüêî ïîëåçíûõ ôóíêöèé. Ïðè ýòîì ïîïûòàåìñÿ ïðèâåñòè íåêîòîðûå ñîîáðàæåíèÿ, èñïîëüçóåìûå ïðè êîíñòðóèðîâàíèè ôóíêöèé.  ÷àñòíîñòè, ñäåëàåì óïîð íà çíà÷åíèå ìîäóëüíîãî ïîäõîäà, ðàçáèâàþùåãî ïðîãðàììû íà âûïîëíèìûå çàäà÷è. Ñíà÷àëà, îäíàêî, îáñóäèì êëàññû ïàìÿòè.
ÊËÀÑÑÛ ÏÀÌßÒÈ È ÎÁËÀÑÒÜ ÄÅÉÑÒÂÈß.
Ìû óæå óïîìèíàëè ðàíüøå, ÷òî ëîêàëüíûå ïåðåìåííûå èçâåñòíû òîëüêî ôóíêöèÿì, ñîäåðæàùèì èõ. Â ÿçûêå Ñè ïðåäïîëàãàåòñÿ òàêæå, ÷òî î ãëîáàëüíûõ ïåðåìåííûõ "çíàþò" ñðàçó íåñêîëüêî ôóíêöèé. Ïðåäïîëîæèì, íàïðèìåð, ÷òî è main( ), è critic( ) èìåþò äîñòóï ê ïåðåìåííîé units. Ýòî áóäåò èìåòü ìåñòî, åñëè îòíåñòè units ê "âíåøíåìó" êëàññó ïàìÿòè, êàê ïîêàçàíî íèæå:
/* ãëîáàëüíàÿ ïåðåìåííàÿ units */
Int units; /* âíåøíÿÿ ïåðåìåííàÿ */
Main( ).
{
Extern int units;
Printf (" Ñêîëüêî ôóíòîâ ìàñëà íàõîäèòñÿ â áî÷îíêå?\n");
Scanf (" %d" , &units);
While (units != 56) critic( );
Printf(" Âû äîëæíû ïîèñêàòü â ñïðàâî÷íèêå !\n");
} critic( ).
{
Extern int units;
Printf (" He ïîâåçëî, äðóæîê. Ïîïûòàéñÿ ñíîâà.\n");
Scanf (" %d" , &units);
}
Âîò ïîëó÷åííûé ðåçóëüòàò:
Ñêîëüêî ôóíòîâ ìàñëà íàõîäèòñÿ â áî÷îíêå?
14.
Íå ïîâåçëî, äðóæîê. Ïîïûòàéñÿ ñíîâà.
56.
Âû äîëæíû ïîèñêàòü â ñïðàâî÷íèêå!
(Ìû ñäåëàëè ýòî.).
Îáðàòèòå âíèìàíèå, ÷òî âòîðîå çíà÷åíèå units áûëî ïðî÷èòàíî ôóíêöèåé critic( ), îäíàêî main() òàêæå "óçíàëà" ýòî íîâîå çíà÷åíèå, êîãäà îíî âûøëî èç öèêëà while.
Ìû ñäåëàëè ïåðåìåííóþ units âíåøíåé, îïèñàâ åå âíå ëþáîãî îïðåäåëåíèÿ ôóíêöèè. Äàëåå, âíóòðè ôóíêöèé, èñïîëüçóþùèõ ýòó ïåðåìåííóþ, ìû îáúÿâëÿåì åå âíåøíåé ïðè ïîìîùè êëþ÷åâîãî ñëîâà extern, ïðåäøåñòâóþùåãî ñïåöèôèêàöèè òèïà ïåðåìåííîé. Ñëîâî extern ïðåäëàãàåò êîìïüþòåðó èñêàòü îïðåäåëåíèå ýòîé ïåðåìåííîé âíå ôóíêöèè. Åñëè áû ìû îïóñòèëè êëþ÷åâîå ñëîâî extern â ôóíêöèè critic( ), òî êîìïèëÿòîð ñîçäàë áû â ôóíêöèè critic íîâóþ ïåðåìåííóþ è òîæå íàçâàë áû åå units. Òîãäà äðóãàÿ ïåðåìåííàÿ units() [êîòîðàÿ íàõîäèòñÿ â main()] íèêîãäà íå ïîëó÷èëà áû íîâîãî çíà÷åíèÿ.
Êàæäàÿ ïåðåìåííàÿ, êàê ìû çíàåì, èìååò òèï. Êðîìå òîãî, êàæäàÿ ïåðåìåííàÿ ïðèíàäëåæèò ê íåêîòîðîìó êëàññó ïàìÿòè. Åñòü ÷åòûðå êëþ÷åâûõ ñëîâà, èñïîëüçóåìûå äëÿ îïèñàíèÿ êëàññîâ ïàìÿòè: extern (äëÿ âíåøíåãî), auto (äëÿ àâòîìàòè÷åñêîãî), static è register. Äî ñèõ ïîð ìû íå îáðàùàëè âíèìàíèå íà êëàññû ïàìÿòè, òàê êàê ïåðåìåííûå, îïèñàííûå âíóòðè ôóíêöèè, ñ÷èòàëèñü îòíîñÿùèìèñÿ ê êëàññó auto, åñëè îíè íå îïèñûâàëèñü èíà÷å (ïî óìîë÷àíèþ îíè îòíîñèëèñü ê êëàññó auto).
Îïðåäåëåíèå êëàññà ïàìÿòè ïåðåìåííîé çàâèñèò îò òîãî, ãäå ïåðåìåííàÿ îïèñàíà è êàêîå êëþ÷åâîå ñëîâî (åñëè îíî åñòü) èñïîëüçóåòñÿ.
Êëàññ ïàìÿòè ïîçâîëÿåò óñòàíîâèòü äâà ôàêòà. Âî-ïåðâûõ, îïðåäåëèòü, êàêèå ôóíêöèè èìåþò äîñòóï ê ïåðåìåííîé. (Ïðåäåëû, äî êîòîðûõ ïåðåìåííàÿ äîñòóïíà, õàðàêòåðèçóþò åå "îáëàñòü äåéñòâèÿ".) Âî-âòîðûõ, îïðåäåëèòü, êàê äîëãî ïåðåìåííàÿ íàõîäèòñÿ â ïàìÿòè. Òåïåðü ïåðåéäåì ê ñâîéñòâàì êàæäîãî òèïà.
Àâòîìàòè÷åñêèå ïåðåìåííûå.
Ïî óìîë÷àíèþ ïåðåìåííûå, îïèñàííûå âíóòðè ôóíêöèè, ÿâëÿþòñÿ àâòîìàòè÷åñêèìè. Ìîæíî, îäíàêî, ýòî ïîä÷åðêíóòü ÿâíî ñ ïîìîùüþ êëþ÷åâîãî ñëîâà auto:
Main( ).
{
Auto int plox;
Òàê ïîñòóïàþò, åñëè õîòÿò, íàïðèìåð, ïîêàçàòü, ÷òî îïðåäåëåíèå ïåðåìåííîé íå íóæíî èñêàòü âíå ôóíêöèè.
Àâòîìàòè÷åñêèå ïåðåìåííûå èìåþò ëîêàëüíóþ îáëàñòü äåéñòâèÿ. Òîëüêî ôóíêöèÿ, â êîòîðîé ïåðåìåííàÿ îïðåäåëåíà, "çíàåò" åå. (Êîíå÷íî, ìîæíî èñïîëüçîâàòü àðãóìåíòû äëÿ ñâÿçè çíà÷åíèÿ è àäðåñà ïåðåìåííîé ñ äðóãîé ôóíêöèåé, îäíàêî ýòî ÷àñòè÷íîå è êîñâåííîå "çíàíèå".) Äðóãèå ôóíêöèè ìîãóò èñïîëüçîâàòü ïåðåìåííûå ñ òåì æå ñàìûì èìåíåì, íî ýòî äîëæíû áûòü íåçàâèñèìûå ïåðåìåííûå, íàõîäÿùèåñÿ â ðàçíûõ ÿ÷åéêàõ ïàìÿòè.
Àâòîìàòè÷åñêàÿ ïåðåìåííàÿ íà÷èíàåò ñóùåñòâîâàòü ïðè âûçîâå ôóíêöèè, ñîäåðæàùåé åå. Êîãäà ôóíêöèÿ çàâåðøàåò ñâîþ ðàáîòó è âîçâðàùàåò óïðàâëåíèå òóäà, îòêóäà åå âûçâàëè, àâòîìàòè÷åñêàÿ ïåðåìåííàÿ èñ÷åçàåò. ß÷åéêà ïàìÿòè ìîæåò ñíîâà èñïîëüçîâàòüñÿ äëÿ ÷åãî-íèáóäü äðóãîãî.
Ñëåäóåò åùå ñêàçàòü îá îáëàñòè äåéñòâèÿ àâòîìàòè÷åñêîé ïåðåìåííîé: îáëàñòü äåéñòâèÿ îãðàíè÷åíà áëîêîì ({ }), â êîòîðîì ïåðåìåííàÿ îïèñàíà. Ìû âñåãäà äîëæíû îïèñûâàòü íàøè ïåðåìåííûå â íà÷àëå òåëà ôóíêöèè (áëîêà), òàê ÷òî îáëàñòüþ äåéñòâèÿ èõ ÿâëÿåòñÿ âñÿ ôóíêöèÿ. Îäíàêî â ïðèíöèïå ìîæíî áûëî áû îïèñàòü ïåðåìåííóþ âíóòðè ïîäáëîêà. Òîãäà ïåðåìåííàÿ áóäåò èçâåñòíà òîëüêî â ýòîé ÷àñòè ôóíêöèè. Îáû÷íî ïðè ñîçäàíèè ïðîãðàììû, ïðîãðàììèñòû ðåäêî ïðèíèìàþò âî âíèìàíèå óïîìÿíóòîå ñâîéñòâî. Íî èíîãäà òîðîïëèâûå ïðîãðàììèñòû ïîëüçóþòñÿ òàêîé âîçìîæíîñòüþ, îñîáåííî êîãäà ïûòàþòñÿ áûñòðåå âíåñòè êîððåêòèâû.
Âíåøíèå ïåðåìåííûå.
Ïåðåìåííàÿ, îïèñàííàÿ âíå ôóíêöèè, ÿâëÿåòñÿ âíåøíåé. Âíåøíþþ ïåðåìåííóþ ìîæíî òàêæå îïèñàòü â ôóíêöèè, êîòîðàÿ èñïîëüçóåò åå, ïðè ïîìîùè êëþ÷åâîãî ñëîâà extern. Îïèñàíèÿ ìîãóò âûãëÿäåòü ïðèìåðíî òàê:
Int errupt; /* Òðè ïåðåìåííûå, îïèñàííûå âíå ôóíêöèè */
Char coal;
Double up;
Main( ).
{
Extern int errupt; /* îáúÿâëåíî, ÷òî 3 ïåðåìåííûå */
Extern char coal; /* ÿâëÿþòñÿ âíåøíèìè */
Extern double up;
Ãðóïïó extern-îïèñàíèé ìîæíî ñîâñåì îïóñòèòü, åñëè èñõîäíûå îïðåäåëåíèÿ ïåðåìåííûõ ïîÿâëÿþòñÿ â òîì æå ôàéëå è ïåðåä ôóíêöèåé, êîòîðàÿ èõ èñïîëüçóåò. Âêëþ÷åíèå êëþ÷åâîãî ñëîâà extern ïîçâîëÿåò ôóíêöèè èñïîëüçîâàòü âíåøíþþ ïåðåìåííóþ, äàæå åñëè îíà îïðåäåëÿåòñÿ ïîçæå â ýòîì èëè äðóãîì ôàéëå. (Îáà ôàéëà, êîíå÷íî, äîëæíû áûòü ñêîìïèëèðîâàíû, ñâÿçàíû èëè ñîáðàíû â îäíî è òî æå âðåìÿ.).
Åñëè ñëîâî extern íå âêëþ÷åíî â îïèñàíèå âíóòðè ôóíêöèè, òî ïîä ýòèì èìåíåì ñîçäàåòñÿ íîâàÿ àâòîìàòè÷åñêàÿ ïåðåìåííàÿ. Âû ìîæåòå ïîìåòèòü âòîðóþ ïåðåìåííóþ êàê "àâòîìàòè÷åñêóþ" ñ ïîìîùüþ ñëîâà auto è òåì ñàìûì ïîêàçàòü, ÷òî ýòî âàøå íàìåðåíèå, à íå îïëîøíîñòü. Òðè ïðèìåðà äåìîíñòðèðóþò ÷åòûðå âîçìîæíûõ êîìáèíàöèÿ îïèñàíèé:
/* Ïðèìåð1 */
Int hocus;
Main( ) {
Extern int hocus; /* hocus îïèñàíà âíåøíåé */
...
}
Magic( ) {
Extern int hocus;
...
}
Çäåñü åñòü îäíà âíåøíÿÿ ïåðåìåííàÿ hocus, è îíà èçâåñòíà îáåèì ôóíêöèÿì main( ) è magic( ).
/* Ïðèìåð2 */
Int hocus ;
Main( ).
{
Extern int hocus; /* hocus îïèñàíà âíåøíåé */
...
}
Magic( ).
{
/* hocus íå îïèñàíà ñîâñåì */
...
}
Ñíîâà åñòü îäíà âíåøíÿÿ ïåðåìåííàÿ hocus, èçâåñòíàÿ îáåèì ôóíêöèÿì. Íà ýòîò ðàç îíà èçâåñòíà ôóíêöèèmàgiñ( ) ïî óìîë÷àíèþ.
/* Ïðèìåð3 */
Int hocus;
Main( ).
{
Int hocus; /* hocus îïèñàíà è.
ÿâëÿåòñÿ àâòîìàòè÷åñêîé ïî óìîë÷àíèþ */
...
}
Magic( ).
{
Auto int hocus; /* hocus îïèñàíà àâòîìàòè÷åñêîé */
...
}
 ýòîì ïðèìåðå ñîçäàíû òðè ðàçíûå ïåðåìåííûå ñ îäèíàêîâûì èìåíåì. Ïåðåìåííàÿ hocusâ ôóíêöèè main( )ÿâëÿåòñÿ àâòîìàòè÷åñêîé ïî óìîë÷àíèþ è ëîêàëüíîé äëÿ main( ), â ôóíêöèè magic( )îíà ÿâíî îïèñàíà àâòîìàòè÷åñêîé è èçâåñòíà òîëüêî äëÿ magic( ). Âíåøíÿÿ ïåðåìåííàÿ hocus íåèçâåñòíà íè main( ), íè magic( ), íî îáû÷íî èçâåñòíà ëþáîé äðóãîé ôóíêöèè â ôàéëå, êîòîðàÿ íå èìååò ñâîåé ñîáñòâåííîé ëîêàëüíîé ïåðåìåííîé hocus.
Ýòè ïðèìåðû èëëþñòðèðóþò îáëàñòü äåéñòâèÿ âíåøíèõ ïåðåìåííûõ. Îíè ñóùåñòâóþò, ïîêà ðàáîòàåò ïðîãðàììà, è òàê êàê ýòè ïåðåìåííûå äîñòóïíû ëþáîé ôóíêöèè, îíè íå èñ÷åçíóò, åñëè êàêàÿ-íèáóäü îäíà ôóíêöèÿ çàêîí÷èò ñâîþ ðàáîòó.
Ñòàòè÷åñêèå ïåðåìåííûå.
Íàçâàíèå ðàçäåëà íå ñëåäóåò ïîíèìàòü áóêâàëüíî, ò. å. ñ÷èòàòü, ÷òî òàêèå ïåðåìåííûå íå ìîãóò èçìåíÿòüñÿ.  äåéñòâèòåëüíîñòè ñëîâî "ñòàòè÷åñêèå" çäåñü îçíà÷àåò, ÷òî ïåðåìåííûå îñòàþòñÿ â ðàáîòå. Îíè èìåþò òàêóþ æå îáëàñòü äåéñòâèÿ, êàê àâòîìàòè÷åñêèå ïåðåìåííûå, íî îíè íå èñ÷åçàþò, êîãäà ñîäåðæàùàÿ èõ ôóíêöèÿ çàêîí÷èò ñâîþ ðàáîòó. Êîìïèëÿòîð õðàíèò èõ çíà÷åíèÿ îò îäíîãî âûçîâà ôóíêöèè äî äðóãîãî. Ñëåäóþùèé ïðèìåð èëëþñòðèðóåò ýòî è ïîêàçûâàåò, êàê îïèñàòü ñòàòè÷åñêóþ ïåðåìåííóþ.
/* ñòàòè÷åñêàÿ ïåðåìåííàÿ */
Main( ).
{
Int count;
For (count = 1; count <= 3; count++).
{
Printf(" Èòåðàöèÿ %d:\n", count);
Trystat( );
}
}
Trystat( ).
{
Int fade = 1;
Static int stay; = 1;
Printf("fade = %d è stay = %d\n", fade++, stay++);
}
Çàìåòèì, ÷òî ôóíêöèÿ trystat( ) óâåëè÷èâàåò êàæäóþ ïåðåìåííóþ ïîñëå ïå÷àòè åå çíà÷åíèÿ. Ðàáîòà ýòîé ïðîãðàììû äàñò ñëåäóþùèå ðåçóëüòàòû:
Èòåðàöèÿ 1:
Fade = 1 è staly = 1.
Èòåðàöèÿ 2:
Fade = 1 è stay = 2.
Èòåðàöèÿ 3:
Fade = 1 è stay = 3.
Ñòàòè÷åñêàÿ ïåðåìåííàÿ stay"ïîìíèò", ÷òî åå çíà÷åíèå áûëî óâåëè÷åíî íà 1, â òî âðåìÿ êàê äëÿ ïåðåìåííîé fade íà÷àëüíîå çíà÷åíèå óñòàíàâëèâàåòñÿ êàæäûé ðàç çàíîâî. Ýòî óêàçûâàåò íà ðàçíèöó â èíèöèàëèçàöèè: fade èíèöèàëèçèðóåòñÿ êàæäûé ðàç, êîãäà âûçûâàåòñÿ trystat( ), â òî âðåìÿ êàê stay èíèöèàëèçèðóåòñÿ òîëüêî îäèí ðàç ïðè êîìïèëÿöèè ôóíêöèè trystat( ).
Âíåøíèå ñòàòè÷åñêèå ïåðåìåííûå.
Âû ìîæåòå òàêæå îïèñàòü ñòàòè÷åñêèå ïåðåìåííûå âíå ëþáîé ôóíêöèè. Ýòî ñîçäàñò "âíåøíþþ ñòàòè÷åñêóþ" ïåðåìåííóþ. Ðàçíèöà ìåæäó âíåøíåé ïåðåìåííîé è âíåøíåé ñòàòè÷åñêîé ïåðåìåííîé çàêëþ÷àåòñÿ â îáëàñòè èõ äåéñòâèÿ. Îáû÷íàÿ âíåøíÿÿ ïåðåìåííàÿ ìîæåò èñïîëüçîâàòüñÿ ôóíêöèÿìè â ëþáîì ôàéëå, â òî âðåìÿ êàê âíåøíÿÿ ñòàòè÷åñêàÿ ïåðåìåííàÿ ìîæåò èñïîëüçîâàòüñÿ òîëüêî ôóíêöèÿìè òîãî æå ñàìîãî ôàéëà, ïðè÷åì ïîñëå îïðåäåëåíèÿ ïåðåìåííîé. Âû îïèñûâàåòå âíåøíþþ ñòàòè÷åñêóþ ïåðåìåííóþ, ðàñïîëàãàÿ åå îïðåäåëåíèå âíå ëþáîé ôóíêöèè.
Static randx = 1;
Rand( ).
{
Íåìíîãî ïîçæå ìû ïðèâåäåì ïðèìåð, â êîòîðîì áóäåò íåîáõîäèì ýòîò òèï ïåðåìåííîé.

ÐÈÑ. 10.1. Âíåøíèå è âíåøíèå ñòàòè÷åñêèå ïåðåìåííûå.
Ðåãèñòðîâûå ïåðåìåííûå.
Îáû÷íî ïåðåìåííûå õðàíÿòñÿ â ïàìÿòè ìàøèíû. Ê ñ÷àñòüþ, ðåãèñòðîâûå ïåðåìåííûå çàïîìèíàþòñÿ â ðåãèñòðàõ öåíòðàëüíîãî ïðîöåññîðà, ãäå äîñòóï ê íèì è ðàáîòà ñ íèìè âûïîëíÿþòñÿ ãîðàçäî áûñòðåå, ÷åì â ïàìÿòè.  îñòàëüíîì ðåãèñòðîâûå ïåðåìåííûå àíàëîãè÷íû àâòîìàòè÷åñêèì ïåðåìåííûì. Îíè ñîçäàþòñÿ ñëåäóþùèì îáðàçîì:
Main( ).
{
Register int quick;
Ìû ñêàçàëè "ê ñ÷àñòüþ", ïîòîìó ÷òî îïèñàíèå ïåðåìåííîé êàê ðåãèñòðîâîé, ÿâëÿåòñÿ ñêîðåå ïðîñüáîé, ÷åì îáû÷íûì äåëîì. Êîìïèëÿòîð äîëæåí ñðàâíèòü âàøè òðåáîâàíèÿ ñ êîëè÷åñòâîì äîñòóïíûõ ðåãèñòðîâ, ïîýòîìó âû ìîæåòå è íå ïîëó÷èòü òî, ÷òî õîòèòå.  ýòîì ñëó÷àå ïåðåìåííàÿ ñòàíîâèòñÿ ïðîñòîé àâòîìàòè÷åñêîé ïåðåìåííîé.
Êàêîé êëàññ ïàìÿòè ïðèìåíÿòü?
Îòâåò íà âîïðîñ ïî÷òè âñåãäà îäèí - "àâòîìàòè÷åñêèé".  êîíöå êîíöîâ ïî÷åìó ýòîò êëàññ ïàìÿòè âûáðàí ïî óìîë÷àíèþ? Ìû çíàåì, ÷òî íà ïåðâûé âçãëÿä èñïîëüçîâàíèå âíåøíèõ ïåðåìåííûõ î÷åíü ñîáëàçíèòåëüíî. Îïèøèòå âñå âàøè ïåðåìåííûå êàê âíåøíèå, è ó âàñ íèêîãäà íå áóäåò çàáîò ïðè èñïîëüçîâàíèè àðãóìåíòîâ è óêàçàòåëåé äëÿ ñâÿçè ìåæäó ôóíêöèÿìè â ïðÿìîì è îáðàòíîì íàïðàâëåíèÿõ. Ê ñîæàëåíèþ, ó âàñ âîçíèêíåò ïðîáëåìà ñ ôóíêöèåé Ñ, êîâàðíî èçìåíÿþùåé ïåðåìåííûå â ôóíêöèè À, à ýòî ñîâñåì íå âõîäèò â ïàøè èíòåðåñû. Íåîñïîðèìûé ñîâîêóïíûé îïûò èñïîëüçîâàíèÿ ìàøèí, íàêîïëåííûé â òå÷åíèå ìíîãèõ ëåò, ñâèäåòåëüñòâóåò î òîì, ÷òî òàêàÿ ïðîáëåìà çíà÷èòåëüíî ïåðåâåøèâàåò êàæóùóþñÿ ïðèâëåêàòåëüíîñòü øèðîêîãî èñïîëüçîâàíèÿ âíåøíèõ ïåðåìåííûõ.
Îäíî èç çîëîòûõ ïðàâèë çàùèòíîãî ïðîãðàììèðîâàíèÿ çàêëþ÷àåòñÿ â ñîáëþäåíèè ïðèíöèïà "íåîáõîäèìî çíàòü òîëüêî òî, ÷òî íóæíî". Îðãàíèçóéòå ðàáîòó êàæäîé ôóíêöèè àâòîíîìíî, íàñêîëüêî ýòî âîçìîæíî, è èñïîëüçóéòå ãëîáàëüíûå ïåðåìåííûå òîëüêî òîãäà, êîãäà ýòî äåéñòâèòåëüíî íåîáõîäèìî.
Èíîãäà ïîëåçíû è äðóãèå êëàññû ïàìÿòè. Íî ïðåæäå ÷åì èõ èñïîëüçîâàòü, ñïðîñèòå ñåáÿ, íåîáõîäèìî ëè ýòî.
Ðåçþìå: Êëàññû ïàìÿòè.
I. Êëþ÷åâûå ñëîâà: auto, extern, static, register.
II. Îáùèå çàìå÷àíèÿ:
Êëàññ ïàìÿòè îïðåäåëÿåò îáëàñòü äåéñòâèÿ ïåðåìåííîé è ïðîäîëæèòåëüíîñòü åå ñóùåñòâîâàíèÿ â ïàìÿòè. Êëàññ ïàìÿòè óñòàíàâëèâàåòñÿ ïðè îïèñàíèè ïåðåìåííîé ñ ñîîòâåòñòâóþùèì êëþ÷åâûì ñëîâîì. Ïåðåìåííûå, îïðåäåëåííûå âíå ôóíêöèè, ÿâëÿþòñÿ âíåøíèìè è èìåþò ãëîáàëüíóþ îáëàñòü äåéñòâèÿ. Ïåðåìåííûå, îïðåäåëåííûå âíóòðè ôóíêöèè, ÿâëÿþòñÿ àâòîìàòè÷åñêèìè è ëîêàëüíûìè, åñëè òîëüêî íå èñïîëüçóþòñÿ äðóãèå êëþ÷åâûå ñëîâà. Âíåøíèå ïåðåìåííûå, îïðåäåëåííûå ðàíüøå ôóíêöèè, äîñòóïíû åé, äàæå åñëè íå îïèñàíû âíóòðè åå.
III. Ñâîéñòâà.
| ÊËÀÑÑ ÏÀÌßÒÈ | ÊËÞ×ÅÂÎÅ ÑËÎÂÎ | ÏÐÎÄÎËÆÈÒÅËÜÍÎÑÒÜ ÑÓÙÅÑÒÂÎÂÀÍÈß | ÎÁËÀÑÒÜ ÄÅÉÑÒÂÈß |
|---|---|---|---|
| Àâòîìàòè÷åñêèé | auto | Âðåìåííî | Ëîêàëüíàÿ |
| Ðåãèñòðîâûé | register | Âðåìåííî | Ëîêàëüíàÿ |
| Ñòàòè÷åñêèé | static | Ïîñòîÿííî | Ëîêàëüíàÿ |
| Âíåøíèé | extern | Ïîñòîÿííî | Ãëîáàëüíàÿ (âñå ôàéëû) |
| Âíåøíèé ñòàòè÷åñêèé | static | Ïîñòîÿííî | Ãëîáàëüíàÿ (îäèí ôàéë) |
1. Ðàçäåëèì ñëó÷àéíîå ÷èñëî íà 32768.  ðåçóëüòàòå ïîëó÷èì ÷èñëî õ â äèàïàçîíå - 1 <= õ < 1. (Ìû äîëæíû ïðåâðàòèòü åãî â òèï float, ÷òîáû èìåòü äåñÿòè÷íûå äðîáè.).
2. Äîáàâèì 1. Íàøå íîâîå ÷èñëî óäîâëåòâîðÿåò îòíîøåíèþ 0 < = õ < 2.
3. Ðàçäåëèì íà 2. Òåïåðü èìååì 0 <= õ < 1.
4. Óìíîæèì íà 6. Èìååì 0 <= õ < 6. (Áëèçêî ê òîìó, ÷òî íóæíî, íî 0 íå ÿâëÿåòñÿ âîçìîæíûì çíà÷åíèåì.).
5. Ïðèáàâèì 1: 1 <= õ < 7. (Çàìåòèì, ÷òî ýòè ÷èñëà âñå åùå ÿâëÿþòñÿ äåñÿòè÷íûìè äðîáÿìè.).
6. Ïðåîáðàçóåì â öåëûå ÷èñëà. Òåïåðü ìû èìååì öåëûå â äèàïàçîíå îò 1 äî 6.
7. Äëÿ îáîáùåíèÿ äîñòàòî÷íî çàìåíèòü çíà÷åíèå 6 â ï. 4 íà ÷èñëî ñòîðîí.
Âîò ôóíêöèÿ, êîòîðàÿ âûïîëíÿåò ýòè äåéñòâèÿ:
/* ýëåêòðîííîå áðîñàíèå êîñòåé */
#define SCALE 32768.0.
Rollem(sides) float sides;
{
Float roll;
Roll = ((float)rand( )/SCALE + 1.0) * sides/2.0 + 1.0;
Return((int)roll);
}
Ìû âêëþ÷èëè â ïðîãðàììó äâà ÿâíûõ îïèñàíèÿ òèïà, ÷òîáû ïîêàçàòü, ãäå âûïîëíÿþòñÿ ïðåîáðàçîâàíèÿ òèïîâ. Îáðàòèìñÿ ê ïðîãðàììå, êîòîðàÿ èñïîëüçóåò ýòè ñðåäñòâà:
/* ìíîãîêðàòíîå áðîñàíèå êîñòè */
Main( ).
{
Int dice, count, roll, seed;
Float sides;
Printf(" Ââåäèòå, ïîæàëóéñòà, çíà÷åíèå çåðíà. \n");
Scanf(" %d, &seed);
Srand(seed);
Printf(" Ââåäèòå ÷èñëî ñòîðîí êîñòè, 0 äëÿ çàâåðøåíèÿ. \n");
Scanf(" %d", &sides);
While(sides > 0).
{ printf(" Ñêîëüêî êîñòåé?\n");
Scanf(" %d", &dice);
For( roll = 0, count = 1; count <= dice; count++).
Roll + = rollem(sides); /* áðîñàíèå âñåõ êîñòåé íàáîðà */
Printf(" Ó âàñ âûïàëî %d, äëÿ %d %.0f-ñòîðîííèõ êîñòåé.\n", roll, dice, sides);
Printf(" Ñêîëüêî ñòîðîí? Ââåäèòå 0 äëÿ çàâåðøåíèÿ.\n");
Scanf(" %f", &sides);
} printf(" Óäà÷è âàì!\n");
}
Òåïåðü äàâàéòå èñïîëüçóåì ýòó ïðîãðàììó:
Ââåäèòå çíà÷åíèå çåðíà.
1.
Ââåäèòå ÷èñëî ñòîðîí êîñòè, 0 äëÿ çàâåðøåíèÿ.
6.
Ñêîëüêî êîñòåé?
2.
Ó âàñ âûïàëî 4 äëÿ 2 6-ñòîðîííèõ êîñòåé.
Ñêîëüêî ñòîðîí ? Ââåäèòå 0 äëÿ çàâåðøåíèÿ.
6.
Ñêîëüêî êîñòåé ?
2.
Ó âàñ âûïàëî 7 äëÿ 2 6-ñòîðîííèõ êîñòåé.
Ñêîëüêî ñòîðîí? Ââåäèòå 0 äëÿ çàâåðøåíèÿ.
0.
֏ 刓!
Ñïàñèáî.
Âû ìîæåòå èñïîëüçîâàòü ôóíêöèþ rollem( )ïî-ðàçíîìó. Ïóñòü ÷èñëî ñòîðîí (sides) ðàâíî äâóì, òîãäà áðîñàíèå) ìîíåòû äàñò ñëåäóþùèé ðåçóëüòàò: "îðåë" âûïàë 2 ðàçà, a "ðåøêà" - îäèí (èëè íàîáîðîò, ñìîòðÿ, ÷òî âû ïðåäïî÷èòàåòå). Ìîæíî ëåãêî ìîäèôèöèðîâàòü ïðîãðàììó, ÷òîáû ïîêàçàòü êàê îòäåëüíûå ðåçóëüòàòû, òàê è èòîã. Èëè âû ìîæåòå ïîñòðîèòü èìèòàòîð èãðû "êðàïñ". Åñëè âàì íóæíî áîëüøîå ÷èñëî áðîñàíèé, âû ìîæåòå ëåãêî ìîäèôèöèðîâàòü ñâîþ ïðîãðàììó è ïîëó÷èòü ðåçóëüòàò, ïîäîáíûé ñëåäóþùåìó:
Ââåäèòå çíà÷åíèå çåðíà.
10.
Ââåäèòå êîëè÷åñòâî õîäîâ; ââåäèòå 0 äëÿ çàâåðøåíèÿ.
18.
Ñêîëüêî ñòîðîí è ñêîëüêî êîñòåé? 6 3.
Çäåñü 18 õîäîâ äëÿ 3 6-ñòîðîííèõ êîñòåé.
7 5 9 7 12 10 7 12 10 14.
9 8 13 9 10 7 16 10.
Ñêîëüêî õîäîâ? Ââåäèòå 0 äëÿ çàâåðøåíèÿ. 0.
Èñïîëüçîâàíèå ôóíêöèè rand( )[íî íå rîllåm( )] èçìåíèëî áû âàøó ïðîãðàììó óãàäûâàíèÿ ÷èñåë: êîìïüþòåð ñòàë áû âûáèðàòü, à âû óãàäûâàòü, âìåñòî òîãî ÷òîáû ñäåëàòü íàîáîðîò.
Ðàçðàáîòàåì åùå íåêîòîðûå ôóíêöèè. Ñíà÷àëà ìû õîòèì ñîçäàòü ôóíêöèþ, êîòîðàÿ ÷èòàåò öåëûå ÷èñëà.
ÔÓÍÊÖÈß ÏÎËÓ×ÅÍÈß ÖÅËÛÕ ×ÈÑÅË: getint( ).
Ïëàí.
Ê ñ÷àñòüþ, ìû óæå âûðàáîòàëè ñòðàòåãèþ. Âî-ïåðâûõ, çàìåòèì, ÷òî ëþáóþ ââîäèìóþ èíôîðìàöèþ ìîæíî ÷èòàòü êàê ñòðîêó ñèìâîëîâ. Öåëîå ÷èñëî 324, íàïðèìåð, ìîæíî ïðî÷èòàòü êàê ñòðîêó èç òðåõ ñèìâîëîâ: ñèìâîë '3', ñèìâîë '2' è ñèìâîë '4'. Ýòî ïîäñêàçûâàåò íàì ñëåäóþùèé ïëàí:
1. Ïðî÷èòàòü ââîäèìóþ èíôîðìàöèþ êàê ñèìâîëüíóþ ñòðîêó.
2. Ïðîâåðèòü, ñîñòîèò ëè ñòðîêà òîëüêî èç ñèìâîëîâ öèôð è ñòîèò ëè ïåðåä íèìè çíàê ïëþñ èëè ìèíóñ.
3. Åñëè âñå ýòî èìååò ìåñòî, ïðåâðàòèòü ñèìâîëüíóþ ñòðîêó â ïðàâèëüíîå ÷èñëîâîå çíà÷åíèå.
4. Åñëè íåò, âûäàòü ïðåäóïðåæäåíèå.
Ýòîò ïëàí òàê õîðîø, ÷òî îí äîëæåí ðàáîòàòü. (Òîò ôàêò, ÷òî îí ïðåäñòàâëÿåò ñîáîé ñòàíäàðòíûé ïîäõîä, ñóùåñòâîâàâøèé íà ïðîòÿæåíèè ìíîãèõ ëåò, ïðèäàåò íàì òàêæå íåêîòîðóþ óâåðåííîñòü â âîçìîæíîñòè åãî âûïîëíåíèÿ. Íî, ïðåæäå ÷åì íà÷àòü ïðîãðàììèðîâàòü, íóæíî ïîäóìàòü, ÷òî áóäåò äåëàòü íàøà ôóíêöèÿ.
 ÷àñòíîñòè, äî òîãî êàê ìû çàéìåìñÿ ñîäåðæàíèåì íàøåé ôóíêöèè getint( ), íóæíî òî÷íî ðåøèòü, êàê îíà äîëæíà âçàèìîäåéñòâîâàòü ñî ñâîèì îêðóæåíèåì: ñ êàêîé èíôîðìàöèåé? Êàêóþ èíôîðìàöèþ îíà äîëæíà ïîëó÷àòü îò âûçûâàþùåé ïðîãðàììû? Êàêóþ èíôîðìàöèþ äîëæíà âîçâðàùàòü?  êàêîì âèäå äîëæíà áûòü ýòà èíôîðìàöèÿ? Ñíîâà ìû ðàññìàòðèâàåì ôóíêöèþ êàê ÷åðíûé ÿùèê. Ìû õîòèì çíàòü, ÷òî âõîäèò â ôóíêöèþ è ÷òî âûõîäèò èç íåå è, íàêîíåö, ÷òî íàõîäèòñÿ âíóòðè åå. Ýòîò ïîäõîä ïîìîãàåò îáåñïå÷èâàòü áîëåå îäíîðîäíîå âçàèìîäåéñòâèå ìåæäó ðàçëè÷íûìè ÷àñòÿìè ïðîãðàììû. Èíà÷å âû ìîæåòå îêàçàòüñÿ â ïîëîæåíèè ÷åëîâåêà, ïûòàþùåãîñÿ óñòàíîâèòü òðàíñìèññèþ àâòîìàøèíû "Âîëâî" â àâòîìîáèëü "Òîéîòà". Ñàìà ôóíêöèÿ ïðàâèëüíàÿ, íî èíòåðôåéñ ÿâëÿåòñÿ ïðîáëåìîé.
Ïîòîê èíôîðìàöèè äëÿ getint( ).
Êàêîé âûõîä äîëæíà èìåòü íàøà ôóíêöèÿ? Âî-ïåðâûõ, íåñîìíåííî, ÷òî îíà äîëæíà áûëà áû âûäàâàòü çíà÷åíèå ïðî÷èòàííîãî ÷èñëà. Êîíå÷íî, ôóíêöèÿ scanf( ) óæå äåëàåò òàê. Âî-âòîðûõ, è ýòî î÷åíü ñóùåñòâåííî, ìû ñîáèðàåìñÿ ñîçäàòü òàêóþ ôóíêöèþ, êîòîðàÿ áóäåò âûäàâàòü ñîîáùåíèÿ î ñîñòîÿíèè, ò. å. íàéäåíî èëè íåò öåëîå ÷èñëî. ×òîáû ôóíêöèÿ áûëà äåéñòâèòåëüíî ïîëåçíîé, îíà äîëæíà òàêæå ñîîáùàòü î íàõîæäåíèè åþ ñèìâîëà EOF. Òîãäà ìû ìîãëè áû èñïîëüçîâàòü ôóíêöèþ getint( ) â öèêëå while, êîòîðûé ÷èòàåò öåëûå ÷èñëà äî òåõ ïîð, ïîêà íå îáíàðóæèò ñèìâîë EOF. Êîðî÷å ãîâîðÿ, íàì íóæíî, ÷òîáû getint( ) âîçâðàùàëà äâà çíà÷åíèÿ: öåëîå ÷èñëå è ñîñòîÿíèå.
Òàê êàê ìû õîòèì èìåòü äâà çíà÷åíèÿ, òî ñ îäíîé ôóíêöèåé return ñ ýòîé çàäà÷åé íàì íå ñïðàâèòüñÿ. Íàì ñëåäóåò èìåòü äâà óêàçàòåëÿ. Îäíàêî ïîëíîå ðåøåíèå çàäà÷è ìû ïîëó÷èì, åñëè èñïîëüçóåì óêàçàòåëè äëÿ âûïîëíåíèÿ îñíîâíîé ðàáîòû ôóíêöèè è ôóíêöèþ return äëÿ âûäà÷è íåêîòîðîãî êîäà ñîñòîÿíèÿ. Èìåííî ýòî è äåëàåò ôóíêöèÿ scanf( ). Îíà âîçâðàùàåò êîëè÷åñòâî ñèìâîëîâ, êîòîðûå íàøëà, è ñèìâîë EOF, åñëè âñòðå÷àåò åãî. Ðàíåå ìû íå ïîëüçîâàëèñü òàêîé âîçìîæíîñòüþ, íî ìîãëè áû, åñëè áû ïðèìåíÿëè âûçîâ âèäà.
Status = scanf(" % d", &number);
Òåïåðü áóäåì ýòî äåëàòü. Òîãäà íàø âûçîâ ôóíêöèè âûãëÿäåë áû ñëåäóþùèì îáðàçîì:
Status = getint(&number);
Ïðàâàÿ ÷àñòü ðàâåíñòâà èñïîëüçóåò àäðåñ ïåðåìåííîé number, ÷òîáû ïîëó÷èòü åå çíà÷åíèå, a råturnïðèìåíÿåòñÿ äëÿ ïîëó÷åíèÿ çíà÷åíèÿ ïåðåìåííîé status.
ÐÈÑ. 10.2. Ñîçäàíèå ôóíêöèè getint( ).
Ìû äîëæíû âûáðàòü êîäû äëÿ âûäà÷è ñîîáùåíèÿ î ñîñòîÿíèè. Òàê êàê ïðåäïîëàãàåòñÿ, ÷òî íåîïèñàííûå ôóíêöèè èìåþò òèï int, íàøè êîäû äîëæíû ñîñòîÿòü èç öåëûõ ÷èñåë. Èñïîëüçóåì ñëåäóþùèå êîäû äëÿ ñîîáùåíèÿ î ñîñòîÿíèè:
-1 îçíà÷àåò, ÷òî íàéäåí ñèìâîë EOF.
1 îçíà÷àåò, ÷òî íàéäåíà ñòðîêà, ñîäåðæàùàÿ íå öèôðû.
0 îçíà÷àåò, ÷òî íàéäåíà ñòðîêà, ñîäåðæàùàÿ òîëüêî öèôðû.
Íàøó ôóíêöèþ getint( ) ìîæíî ïðåäñòàâèòü ñåáå (ðèñ. 10.2) êàê èìåþùóþ îäèí âõîä è äâà âûõîäà. Íà åå âõîä ïîñòóïàåò àäðåñ öåëîé ïåðåìåííîé, çíà÷åíèå êîòîðîé ñ÷èòûâàåòñÿ. Íà ïåðâîì âûõîäå èìååì çíà÷åíèå ñ÷èòàííîãî öåëîãî, ïîëó÷åííîãî ÷åðåç óêàçàòåëü. (Òàêèì îáðàçîì, àðãóìåíò-óêàçàòåëü ÿâëÿåòñÿ äâóñòîðîííèì êàíàëîì ïåðåäà÷è èíôîðìàöèè.) Íà âòîðîì âûõîäå ïîëó÷àåì êîä ñîñòîÿíèÿ, ÷òî îáåñïå÷èâàåòñÿ ôóíêöèåéråturn. Îòñþäà ñëåäóåò, ÷òî "ñêåëåò" íàøåé ôóíêöèè äîëæåí âûãëÿäåòü ïðèìåðíî òàê:
Getint(ptint).
Int *ptint; /* óêàçàòåëü íà öåëîå ÷èñëî */
{
Int status;
...
Return (status);
}
Çàìå÷àòåëüíî! Òåïåðü ìû äîëæíû ïðîñòî çàïîëíèòü âíóòðåííîñòü ôóíêöèè.
Ñîäåðæàíèå getint( ).
Íàø îñíîâíîé ïëàí äëÿ getint( ) â îáùèõ ÷åðòàõ íà ïñåâäîêîäå âûãëÿäèò ïðèìåðíî òàê:
×èòàåì íà âõîäå èíôîðìàöèþ â âèäå ñèìâîëîâ.
Ïîìåùàåì ñèìâîëû â ñòðîêó, ïîêà íå âñòðåòèì ñèìâîë EOF.
Åñëè âñòðåòèëñÿ ñèìâîë EOF, óñòàíàâëèâàåì ñîñòîÿíèå â STOP.
 ïðîòèâíîì ñëó÷àå ïðîâåðÿåì ñòðîêó,
Ïðåîáðàçóåì ñèìâîëû â öåëîå ÷èñëî, åñëè âîçìîæíî, è âûäàåì ñîîáùåíèå î ñîñòîÿíèè (YESNUM èëè NONUM).
Çäåñü ìû èñïîëüçóåì STOP, YESNUM è NONUM êàê ñèìâîëè÷åñêèå êîíñòàíòû, ðàâíûå -1, 0 è 1, êàê îïèñàíî âûøå.
Ðàññìîòðèì åùå íåêîòîðûå âîïðîñû. Êàê ôóíêöèÿ áóäåò ðåøàòü, ÷òî îíà äîñòèãëà êîíöà âõîäíîé ñòðîêè? Äîëæíû ëè ìû îãðàíè÷èâàòü äëèíó ñòðîêè?
Ìû âîøëè â îáëàñòü, ãäå íàì ïðåäñòîèò ðåøàòü, ÷òî ïðåäïî÷åñòü: óäîáñòâî ïðîãðàììèñòà èëè óäîáñòâî ïîëüçîâàòåëÿ. Ñàìûì ïðîñòûì áûëî áû ïðåäëîæèòü ïîëüçîâàòåëþ íàæèìàòü íà êëàâèøó [ââîä], êîãäà ñòðîêó íàäî çàêîí÷èòü. Ýòî îçíà÷àëî áû îäèí ââîä íà ñòðîêó. Äëÿ ïîëüçîâàòåëÿ âñå æå áûëî áû ïðèÿòíåå, åñëè áû ôóíêöèÿ ìîãëà ðàçìåùàòü íåñêîëüêî ÷èñåë â îäíîé è òîé æå ñòðîêå:
2 34 4542 2 98.
Ìû ðåøèëè ïðåäîñòàâèòü ïðèâèëåãèþ ïîëüçîâàòåëþ. Ïóñòü ôóíêöèÿ áóäåò ñ÷èòàòü, ÷òî ñòðîêà íà÷èíàåòñÿ ñ ñèìâîëà, íå ÿâëÿþùåãîñÿ ïðîáåëîì èëè "íîâîé ñòðîêîé", è çàêàí÷èâàåòñÿ ñèìâîëîì ïðîáåëà èëè "íîâîé ñòðîêîé". Òàêîé ââîä ìîæåò ïðîèçâîäèòüñÿ â îäíó ñòðîêó èëè â íåñêîëüêî ñòðîê.
Ìû îãðàíè÷èì ââîäèìóþ ñòðîêó 80 ñèìâîëàìè. Òàê êàê ñòðîêè çàêàí÷èâàþòñÿ íóëü-ñèìâîëîì, íàì íóæåí ìàññèâ èç 81 ñèìâîëà äëÿ âêëþ÷åíèÿ â íåãî ýòîãî ñèìâîëà. Ýòî ñëèøêîì ùåäðî, ïîòîìó ÷òî íàì íóæíî òîëüêî 6 ñèìâîëîâ äëÿ 16-ðàçðÿäíîãî öåëîãî ÷èñëà è çíàêà. Âû ìîæåòå ââîäèòü áîëåå äëèííûå ÷èñëà, íî èõ ðàçìåð áóäåò ñîêðàùåí äî ðàçìåðà ñòðîêè.
×òîáû ñäåëàòü ïðîãðàììó áîëåå ìîäóëüíîé, ìû ïîðó÷èì ïðåîáðàçîâàíèå "ñòðîêà â öåëîå ÷èñëî" äðóãîé ôóíêöèè, è íàçîâåì åå stoi( ). Ó íàñ áóäåò òàêæå âîçâðàò ôóíêöèåé stoi( ) ñîîòâåòñòâóþùåãî êîäà ñîñòîÿíèÿ â ôóíêöèþ getint( ), a getint( ), â ñâîþ î÷åðåäü, ìîæåò ïåðåäàòü êîä ñîñòîÿíèÿ ñâîåé âûçûâàþùåé ïðîãðàììå. Ôóíêöèÿ stoi( ) âûïîëíèò ïîñëåäíèå äâå ñòðîêè íàøåãî ïëàíà (íà ïñåâäîêîäå).
Ðèñ. 10.3 ïðåäñòàâëÿåò ïðîãðàììó äëÿ ôóíêöèè getint( );. Ôóíêöèÿ stoi( ) áóäåò ïîêàçàíà ïîçæå:
/* getint( ) */
#include.
#define LEN 81 /* ìàêñèìàëüíàÿ äëèíà ñòðîêè */
#define STOP-1 /* êîäû ñîñòîÿíèé */
#define NONUM 1.
#define YESNUM Î.
Getint(ptint).
Int *ptint; /* óêàçàòåëü íà âûâîä öåëîãî ÷èñëà */
{
Char intarr[LEN]; /* çàïîìèíàíèå ââîäèìîé ñòðîêè */
Int ch;
Int ind = 0; /* èíäåêñ ìàññèâà */
While((ch = getchar( )) = = '\n' || ch == ' ' || ch == '\t');
/* îáõîä íà÷àëüíûõ ñèìâîëîâ "íîâàÿ ñòðîêà", ïðîáåëîâ è òàáóëÿöèé */
While(ch != EOF && ch != '\n' && ch != ' ' && ind < LEM).
{
Intarr[ind++] = ch; /* çàïèñü ñèìâîëà â ìàññèâ */
Ch = getchar( ); /* ïîëó÷åíèå î÷åðåäíîãî ñèìâîëà */
}
Intarr[ind] = '\0'; /* êîíåö ìàññèâà ïî íóëü-ñèìâîëó */
If(ch == EOF).
Return(STOP);
Else
Return(stoi(intarr, ptint) ); /* âûïîëíåíèå ïðåîáðàçîâàíèÿ */
}
ÐÈÑ. 10.3. Ïðîãðàììà ôóíêöèè getint( ).
Ìû ïîëó÷àåì ñèìâîë ñh. Åñëè îí ÿâëÿåòñÿ ñèìâîëîì ïðîáåëà, èëè "íîâîé ñòðîêè", èëè òàáóëÿöèè, ìû áåðåì ñëåäóþùèé ñèìâîë è òàê ïðîäîëæàåì äî òåõ ïîð, ïîêà íå ïîëó÷èì ñèìâîë, îòëè÷àþùèéñÿ îò ïåðå÷èñëåííûõ. Çàòåì, åñëè ýòîò ñèìâîë íå EOF, ïîìåùàåì åãî â ìàññèâ. Ïðîäîëæàåì áðàòü ñèìâîëû è ïîìåùàòü èõ â ìàññèâ, ïîêà íå íàéäåì çàïðåùåííûé ñèìâîë èëè íå äîñòèãíåì ïðåäåëüíîãî ðàçìåðà ñòðîêè. Äàëåå ïîìåùàåì íóëü-ñèìâîë (' \0') â ñëåäóþùóþ ïîçèöèþ ìàññèâà, ÷òîáû îòìåòèòü êîíåö ñòðîêè. Òàêèì îáðàçîì, ìû ñîçäàëè ìàññèâ â âèäå ñòàíäàðòíîé ñèìâîëüíîé ñòðîêè. Åñëè EOF áûë ïîñëåäíèì ïðî÷èòàííûì ñèìâîëîì, âîçâðàùàåì STOP; èíà÷å èäåì äàëüøå è ïûòàåìñÿ ïðåîáðàçîâàòü ñòðîêó. Ìû âûçûâàåì íîâóþ ôóíêöèþ stoi( ), ÷òîáû âûïîëíèòü ýòó ðàáîòó. ×òî äåëàåò stoi( )? Ïðè ââîäå îíà áåðåò ñèìâîëüíóþ ñòðîêó è óêàçàòåëü íà öåëóþ ïåðåìåííóþ, èñïîëüçóåò óêàçàòåëü äëÿ ïðèñâàèâàíèÿ çíà÷åíèÿ ñàìîé ïåðåìåííîé, à òàêæå return äëÿ ïåðåñûëêè ñîîáùåíèÿ î ñîñòîÿíèè, êîòîðîå getint( ) ïåðåäàåò çàòåì ôóíêöèè getarray( ). Ïîðàçèòåëüíî! Äâîéíàÿ èãðà! Âîò ìåíåå êîìïàêòíûé ñïîñîá èñïîëüçîâàíèÿ ôóíêöèè stoi( ):
Status = stoi(intarr, print);
Return (status);
Çäåñü status áûëà áû ïåðåìåííîé òèïà int. Ïåðâûé îïåðàòîð äàåò çíà÷åíèå, íà êîòîðîå óêàçûâàåò ptint; îíà òàêæå ïðèñâàèâàåò çíà÷åíèå ïåðåìåííîé status. Âòîðîé îïåðàòîð âîçâðàùàåò ýòî çíà÷åíèå ïðîãðàììå, êîòîðàÿ âûçâàëà getint( ). Íàøà åäèíñòâåííàÿ ñòðîêà ïðîãðàììû èìååò òî÷íî òàêîé æå ýôôåêò, çà èñêëþ÷åíèåì òîãî, ÷òî íàì íå íóæíà ïðîìåæóòî÷íàÿ ïåðåìåííàÿ status. Òåïåðü íàïèøåì ôóíêöèþ stoi( ).
Ïðåîáðàçîâàíèå ñòðîêè â öåëîå: stoi( ).
Ñíà÷àëà îïèøåì, êàêèì äîëæåí áûòü âõîä è âûõîä ó ýòîé ôóíêöèè. Âõîä áóäåò ñèìâîëüíîé ñòðîêîé, ïîýòîìó stoi( ) áóäåò èìåòü ñèìâîëüíóþ ñòðîêó â êà÷åñòâå àðãóìåíòà. Íà âûõîäå äîëæíî áûòü ïîëó÷åíî äâà çíà÷åíèÿ: ñîñòîÿíèå è ïðåîáðàçîâàííîå öåëîå ÷èñëî. Ìû ïðèìåíÿåì return äëÿ ñîñòîÿíèÿ è ïîýòîìó äîëæíû èñïîëüçîâàòü óêàçàòåëü äëÿ âîçâðàòà äðóãîãî çíà÷åíèÿ. Òàêèì îáðàçîì, ïîÿâèòñÿ âòîðîé àðãóìåíò - óêàçàòåëü íà öåëîå ÷èñëî. Ñêåëåò íàøåé ôóíêöèè áóäåò âûãëÿäåòü ïðèìåðíî òàê:
Stoi(string, intptr).
Char string[ ]; /* ââîäèìàÿ ñòðîêà * /
Int *intptr; /* óêàçàòåëü íà ïåðåìåííóþ, ïîëó÷àþùóþ öåëîå çíà÷åíèå*/
{
Int status;
...
Return(status);
}
Ïðåêðàñíî, à ÷òî ìîæíî ñêàçàòü îá àëãîðèòìå âûïîëíåíèÿ ïðåîáðàçîâàíèÿ? Íà íåêîòîðîå âðåìÿ ïðîèãíîðèðóåì çíàê è ïðåäïîëîæèì, ÷òî ñòðîêà ñîäåðæèò òîëüêî öèôðû. Âîçüìåì ïåðâûé ñèìâîë è ïðåîáðàçóåì åãî â ÷èñëîâîé ýêâèâàëåíò. Ïðåäïîëîæèì, ýòî ñèìâîë '4'. Îí èìååò â êîäå ASCII ÷èñëîâîå çíà÷åíèå 52 è â òàêîì âèäå çàïîìèíàåòñÿ. Åñëè ìû èç íåãî âû÷òåì 48, òî ïîëó÷èì 4, ò. å.
'4' - 48 = 4.
Íî 48 - ýòî ASCII-êîä ñèìâîëà '0', ïîýòîìó.
'4' - '0' =4.
Äåéñòâèòåëüíî, ýòîò ïîñëåäíèé îïåðàòîð áûë áû ñïðàâåäëèâ â ëþáîì êîäå, â êîòîðîì èñïîëüçóþòñÿ ïîñëåäîâàòåëüíûå ÷èñëà äëÿ ïðåäñòàâëåíèÿ ïîñëåäîâàòåëüíûõ öèôð. Ïîýòîìó åñëè num- ÷èñëîâîå çíà÷åíèå, a chn- ñèìâîë öèôðû, òî.
Num = chn - '0';
Èòàê, ìû èñïîëüçóåì ýòîò ìåòîä äëÿ ïðåîáðàçîâàíèÿ ïåðâîé öèôðû â ÷èñëî. Òåïåðü âîçüìåì ñëåäóþùèé ýëåìåíò ìàññèâà. Åñëè îí '\0', òî ó íàñ áûëà òîëüêî îäíà öèôðà, è ìû çàêîí÷èëè ðàáîòó. Ïðåäïîëîæèì, îäíàêî, ÷òî ýòîò ýëåìåíò '3'. Ïðåâðàòèì åãî â ÷èñëîâîå çíà÷åíèå 3. Íî åñëè îíî ðàâíî 3, òî 4 äîëæíî áûëî áûòü ÷èñëîì 40, à îáà ÷èñëà âìåñòå 43:
Num = 10 * num + chn - '0';
Òåïåðü ïðîñòî ïðîäîëæèì ýòîò ïðîöåññ, óìíîæàÿ ñòàðîå çíà÷åíèå num íà 10 êàæäûé ðàç, êîãäà ìû íàõîäèì ñëåäóþùóþ öèôðó. Íàøà ôóíêöèÿ áóäåò èñïîëüçîâàòü ýòîò ìåòîä.
Âîò îïðåäåëåíèå ôóíêöèè stoi( ). Ìû õðàíèì åå â òîì æå ôàéëå, ÷òî è getint( ), òàê ÷òî îíà ìîæåò èñïîëüçîâàòü òå æå ñàìûå äèðåêòèâû #define.
/* ïðåâðàùàåò ñòðîêó â öåëîå ÷èñëî è ñîîáùàåò î ñîñòîÿíèè */
Stoi(string, intptr).
Char string[ ]; /* ñòðîêà, ïîäëåæàùàÿ ïðåîáðàçîâàíèþ â öåëîå*/
Int *intptr; /* çíà÷åíèå öåëîãî */
{
Int sign = 1; /* ïðîâåðÿåò íàëè÷èå çíàêà + èëè - */
Int index = 0;
If(string[index] == '-' || string[index] == '+').
Sign = (string[index ++] == '-') ? -1 : 1; /* óñòàíîâèòü çíàê */
*intptr = 0; /* íà÷àëüíîå çíà÷åíèå */
While(string[index] >= '0' && string[index] <= '9').
*intptr = 10 * (*intptr) + strmg[index++] - '0';
If(string[index] == '\0').
{
*intptr = sign * (*intptr);
return(YESNUM); }.
Else /* íàéäåí ñèìâîë, îòëè÷íûé îò öèôðû, çíàêà èëè ' \0' */
Return(NONUM);
}
Îïåðàòîð while ïðîäîëæàåò ðàáîòó, ïðåîáðàçóÿ öèôðû â ÷èñëà, ïîêà íå äîñòèãíåò íåöèôðîâîãî ñèìâîëà. Åñëè ýòî ñèìâîë'\0', âñå ïðåêðàñíî, ïîòîìó ÷òî îí îçíà÷àåò êîíåö ñòðîêè. Ëþáîé äðóãîé íåöèôðîâîé ñèìâîë îòñûëàåò ïðîãðàììó êelse äëÿ ñîîáùåíèÿ îá îøèáêå.
Ñòàíäàðòíàÿ áèáëèîòåêà ÿçûêà Ñè ñîäåðæèò ôóíêöèþ atoi( ) (ïåðåâîä êîäà ASCII â öåëîå ÷èñëî), î÷åíü ïîõîæóþ íà stoi( ). Îñíîâíàÿ ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî stoi( ) ïðîâåðÿåò íà íåöèôðîâûå ñòðîêè, a atoi( ) èñïîëüçóåò return âìåñòî óêàçàòåëÿ, äëÿ âîçâðàòà ÷èñëà, è ïðîïóñêàåò ïðîáåë, êàê ìû ýòî äåëàëè â getint(). Ìîæíî áûëî áû îñóùåñòâèòü âñå ïðîâåðêè ñîñòîÿíèÿ â getint( ) è èñïîëüçîâàòü atoi( ) âìåñòî stoi( ), íî ìû ïîëàãàåì, ÷òî áûëî áû èíòåðåñíåå ðàçðàáîòàòü íàøó ñîáñòâåííóþ âåðñèþ.
Ïðîâåðêà.
Òàê ëè óæ ïðàâèëüíû íàøè ðàññóæäåíèÿ? Äàâàéòå ïðîâåðèì íàøó ôóíêöèþ íà ó÷åáíîé ïðîãðàììå:
/* ïðîâåðêà ôóíêöèè getint( )*/
#define STOP - 1.
#define NONUM 1.
#define YESNUM 0.
Main( ).
{
Int num, status;
Printf(" Ïðîãðàììà ïðåêðàùàåò ñ÷èòûâàíèå ÷èñåë, åñëè âñòðå÷àåò EOF. \n" );
While((status = getint(&num)) != STOP).
If(status = = YESNUM).
Printf(" ×èñëî %d ïðèíÿòî. \n", num);
Else.
Printf(" Ýòî íå öåëîå ÷èñëî! Ïîïûòàéòåñü ñíîâà. \n");
Printf("Ýòî îíî. \n");
}
Âîò ïðèìåð ðàáîòû ïðîãðàììû:
Ïðîãðàììà ïðåêðàùàåò ñ÷èòûâàíèå ÷èñåë, åñëè âñòðå÷àåò EOF.
100 -23.
×èñëî 100 ïðèíÿòî.
×ìñëî -23 ïðèíÿòî.
+892.
×èñëî 892 ïðèíÿòî.
Wonk.
Ýòî íå öåëîå ÷èñëî! Ïîïûòàéòåñü ñíîâà.
23skidoo.
Ýòî íå öåëîå ÷èñëî! Ïîïûòàéòåñü ñíîâà.
775.
×èñëî 775 ïðèíÿòî.
Êëàâèøà [control z] (ïîñûëàåò ñèìâîë EOF â íàøó ïðîãðàììó).
Ýòî îíî.
Êàê âèäèòå, ïðîãðàììà âûïîëíÿåòñÿ. Îáðàòèòå âíèìàíèå íà òî, êàê ìû ñóìåëè îðãàíèçîâàòü öèêë äëÿ íåîãðàíè÷åííîãî ñ÷èòûâàíèÿ öåëûõ ÷èñåë äî òåõ ïîð, ïîêà íå áóäåò ââåäåí ñèìâîë EOF. Ýòî óäîáíîå ñâîéñòâî.
Åñòü ëè çäåñü îøèáêè? Ïî ìåíüøåé ìåðå îäíà. Åñëè íåïîñðåäñòâåííî çà ÷èñëîì ñëåäóåò ñèìâîë EOF áåç ðàçäåëÿþùåãî ïðîáåëà èëè ñèìâîëà íîâîé ñòðîêè, ââîä ïðåêðàùàåòñÿ, è ýòî ÷èñëî íå ïðèíèìàåòñÿ âî âíèìàíèå:
706 EOF /* 706 ïðèíÿòî*/
706 EOF /* 706 íå ïðèíÿòî*/
Ìû íå õîòåëè äåëàòü ïðèìåð ñëèøêîì ñëîæíûì, ïîýòîìó äîïóñòèëè âîçìîæíîñòü ýòîé îøèáêè. Äàëüíåéøóþ ðàçðàáîòêó ïðîãðàììû, êàê ìû äóìàåì, ìîæåò îñóùåñòâèòü ñàì ÷èòàòåëü â êà÷åñòâå óïðàæíåíèÿ.
ÑÎÐÒÈÐÎÂÊÀ ×ÈÑÅË.
Îäíèì èç íàèáîëåå ðàñïðîñòðàíåííûõ òåñòîâ äëÿ ìàøèí ÿâëÿåòñÿ ñîðòèðîâêà. Ìû õîòèì ðàçðàáîòàòü ïðîãðàììó äëÿ ñîðòèðîâêè öåëûõ ÷èñåë. Ñíîâà ïðèìåíèì ïðèíöèï ÷åðíîãî ÿùèêà è ïîäóìàåì â òåðìèíàõ ââîäà è âûâîäà. Íàø îáùèé çàìûñåë, ïîêàçàííûé íà ðèñ. 10.4, äîâîëüíî ïðîñò.

ÐÈÑ. 10.4. Ïðîãðàììà ñîðòèðîâêè, ðàññìàòðèâàåìàÿ êàê ÷åðíûé ÿøèê.
Íà äàííîì ýòàïå ïðîãðàììà åùå íåäîñòàòî÷íî îïðåäåëåíà, ÷òîáû åå êîäèðîâàòü. Ñëåäóþùèé øàã çàêëþ÷àåòñÿ â îïðåäåëåíèè ãëàâíûõ çàäà÷, êîòîðûå äîëæíà âûïîëíèòü ïðîãðàììà äëÿ äîñòèæåíèÿ ïîñòàâëåííûõ öåëåé. Èõ òðè:
1. Ñ÷èòûâàíèå ÷èñåë.
2. Ñîðòèðîâêà ÷èñåë.
3. Ïå÷àòü îòñîðòèðîâàííûõ ÷èñåë. Íà ðèñ. 10.5 ïîêàçàíî ýòî ðàçäåëåíèå ïðè äâèæåíèè îò âåðõíåãî óðîâíÿ êîíñòðóêöèè âíèç ê áîëåå äåòàëüíîìó.

ÐÈÑ. 10.5 Ïðîãðàììà ñîðòèðîâêè: ñîäåðæàíèå.
Òåïåðü ìû èìååì òðè ÷åðíûõ ÿùèêà, êàæäûé ñî ñâîèì âõîäîì è âûõîäîì. Ìîæíî ïåðåäàòü êàæäóþ ÷àñòü ðàçíûì ãðóïïàì ïðîãðàììèñòîâ, åñëè ìû óâåðåíû â òîì, ÷òî ÷èñëà, âûâîäèìûå áëîêîì "ñ÷èòûâàíèå", ïðåäñòàâëåíû â òîé æå ñàìîé ôîðìå, êîòîðóþ èñïîëüçóåò áëîê "ñîðòèðîâêà" äëÿ ââîäà.
Êàê âû ìîæåòå âèäåòü, äåëàåòñÿ óïîð íà ìîäóëüíîñòü. Ìû ðàçäåëèëè èñõîäíóþ çàäà÷ó íà òðè áîëåå ìåëêèõ, íî ëó÷øå óïðàâëÿåìûõ.
×òî äàëüøå? Òåïåðü ïðèëîæèì íàøè óñèëèÿ ê êàæäîìó èç òðåõ ìîäóëåé â îòäåëüíîñòè, ðàçäåëÿÿ èõ íà áîëåå ïðîñòûå ýëåìåíòû äî òåõ ïîð, ïîêà íå äîñòèãíåì ìîìåíòà, êîãäà ïðîãðàììà ñòàíåò î÷åâèäíîé. Äåëàÿ ýòî, îáðàòèì âíèìàíèå íà òàêèå âàæíûå ïðîáëåìû, êàê âûáîð ïðåäñòàâëåíèÿ äàííûõ, ëîêàëèçàöèÿ îøèáîê è ïåðåäà÷à èíôîðìàöèè. Âåðíåìñÿ ê íàøåìó ïðèìåðó è çàéìåìñÿ ñíà÷àëà çàäà÷åé ñ÷èòûâàíèÿ.
Ñ÷èòûâàíèå ÷èñëîâûõ äàííûõ.
Ìíîãèå ïðîãðàììû âêëþ÷àþò ñ÷èòûâàíèå ÷èñåë, ïîýòîìó èäåè, êîòîðûå ìû ðàçâèâàåì çäåñü, áóäóò ïîëåçíû âåçäå. Îáùèé âèä ïåðâîé ÷àñòè ïðîãðàììû ÿñåí: èñïîëüçîâàòü öèêë äëÿ ñ÷èòûâàíèÿ ÷èñåë äî òåõ ïîð, ïîêà âñå ÷èñëà íå áóäóò ñ÷èòàíû. Íî â ýòîì åñòü íå÷òî áîëüøåå, ÷åì âû ìîæåòå ñåáå ïðåäñòàâèòü!
Âûáîð ïðåäñòàâëåíèÿ äàííûõ.
Êàê ìû ïðåäñòàâëÿåì ãðóïïó ÷èñåë? Ìîæíî èñïîëüçîâàòü ãðóïïó ïåðåìåííûõ, ïî îäíîé íà êàæäîå ÷èñëî. Îá ýòîì äàæå ñòðàøíî ïîäóìàòü. Ìîæíî èñïîëüçîâàòü ìàññèâ, ïî îäíîìó ýëåìåíòó íà êàæäîå ÷èñëî. Ýòî çíà÷èòåëüíî ëó÷øå, ïîýòîìó äàâàéòå èñïîëüçîâàòü ìàññèâ.
Îäíàêî êàêîãî òèïà áóäåò ìàññèâ? Òèïà int? Òèïà double? Íàì íóæíî çíàòü, êàê òàêóþ ïðîãðàììó ìîæíî áóäåò ïðèìåíÿòü. Ïðåäïîëîæèì, ÷òî îíà äîëæíà ðàáîòàòü ñ öåëûìè ÷èñëàìè. (À ÷òî åñëè îíà äîëæíà ïðèìåíÿòü è öåëûå è íåöåëûå ÷èñëà? Ýòî âîçìîæíî, íî ïîòðåáóåòñÿ ðàáîòû áîëüøå, ÷åì íàì áû õîòåëîñü ñåé÷àñ.) Áóäåì èñïîëüçîâàòü ìàññèâ öåëûõ ÷èñåë äëÿ çàïîìèíàíèÿ ÷èñåë, êîòîðûå ìû ñ÷èòûâàåì.
Çàâåðøåíèå ââîäà.
Êàê ïðîãðàììà "óçíàåò", ñêîëüêî åé íóæíî ñ÷èòàòü ÷èñåë?  ãë. 8 ìû îáñóäèëè íåñêîëüêî ðåøåíèé ýòîé ïðîáëåìû, áîëüøèíñòâî èç êîòîðûõ áûëè íåóäîâëåòâîðèòåëüíû. Îäíàêî òåïåðü, êîãäà åñòü ôóíêöèÿ getint( ), ó íàñ íåò ïðîáëåì. Âîò îäèí ïîäõîä:
×èòàåì ÷èñëî äî òåõ ïîð ïîêà íå âñòðåòèòñÿ ñèìâîë EOF.
Çàíîñèì ÷èñëî â ìàññèâ è.
×èòàåì ñëåäóþùåå ÷èñëî, åñëè ìàññèâ íå çàïîëíåí.
Çàìåòèì, ÷òî çäåñü åñòü äâà ðàçíûõ óñëîâèÿ, ïðèâîäÿùèõ ê çàâåðøåíèþ ýòîé ÷àñòè ïðîãðàììû: ñèìâîë EOF è çàïîëíåíèå ìàññèâà.
Äàëüíåéøèå ðàññóæäåíèÿ.
Ïðåæäå ÷åì ðåàëèçîâàòü âñå ýòî íà ÿçûêå Ñè, íàì íóæíî åùå ðåøèòü, ÷òî áóäåì äåëàòü ñ ïðîâåðêîé îøèáîê ? Äîëæíû ëè ìû ïðåâðàòèòü ýòó ÷àñòü ïðîãðàììû â ôóíêöèþ?
Ñíà÷àëà ìû ðåøèì, ÷òî äåëàòü, åñëè ïîëüçîâàòåëü ââîäèò îøèáî÷íûå äàííûå, ñêàæåì áóêâó âìåñòî öåëîãî ÷èñëà? Áåç ôóíêöè getint( ) ìû ïîëàãàëèñü áû íà "ãèïîòåçó èäåàëüíîãî ïîëüçîâàòåëÿ", ñîãëàñíî êîòîðîé ïîëüçîâàòåëü íå äåëàåò îøèáîê ïðè ââîäå. Îäíàêî ìû ñ÷èòàåì, ÷òî ýòó ãèïîòåçó íåëüçÿ ïðèìåíÿòü íèê îäíîìó ïîëüçîâàòåëþ, êðîìå ñåáÿ. Ê ñ÷àñòüþ, ìîæíî èñïîëüçîâàòü ñïîñîáíîñòü ôóíêöèè getint() ñîîáùàòü î ñîñòîÿíèè, êòî ïîìîæåò íàì âûéòè èç çàòðóäíèòåëüíîãî ïîëîæåíèÿ.
Òåïåðü çàéìåìñÿ ïðîãðàììèðîâàíèåì, êîòîðîå ìîæíî ëåãêî ðåàëèçîâàòü â main( ). Äëÿ ñîáëþäåíèÿ ìîäóëüíîñòè ñëåäóåò èñïîëüçîâàòü ðàçíûå ôóíêöèè äëÿ êàæäîé èç òðåõ îñíîâíûõ ÷àñòåé ïðîãðàììû, ÷òî ìû êàê ðàç è ñäåëàåì. Âõîäîì äëÿ ýòîé ôóíêöèè áóäóò ÷èñëà ñ êëàâèàòóðû èëè ôàéë, à âûõîäîì - ìàññèâ, ñîäåðæàùèé íå îòñîðòèðîâàííûå ÷èñëà. Áûëî áû õîðîøî, åñëè áû òàêàÿ ôóíêöèÿ ïîìîãëà îñíîâíîé ïðîãðàììå óçíàòü, ñêîëüêî áûëî ñ÷èòàíî ÷èñåë, ïîýòîìó ïðåäóñìîòðèì ýòî äëÿ âûõîäà.  êîíöå êîíöîâ íóæíî ïîäóìàòü è î ïîëüçîâàòåëå. Ìû çàñòàâèì ôèêöèþ ïå÷àòàòü ñîîáùåíèå, óêàçûâàþùåå åå ïðåäåëû, è, îñóùåñòâëÿòü ýõî-ïå÷àòü âõîäíîé èíôîðìàöèè.
Main( ) è getarray( ).
Âûçîâåì íàøó ôóíêöèþ getarray( ), ïðåäíàçíà÷åííóþ äëÿ ñ÷èòûâàíèÿ. Ìû îïðåäåëèëè ýòó ôóíêöèþ â òåðìèíàõ ââîäà è âûâîäà è íàìåòèëè â îáùèõ ÷åðòàõ ñõåìó íà ïñåâäîêîäå. Òåïåðü äàâàéòå íàïèøåì ôóíêöèþ è ïîêàæåì, êàê îíà âêëþ÷àåòñÿ â îñíîâíóþ ïðîãðàììó:
Ñíà÷àëà íàïèøåì main( ):
/* ñîðòèðîâêà 1 */
#define MAXSIZE 100 /* ïðåäåëüíîå êîëè÷åñòâî ñîðòèðóåìûõ öåëûõ ÷èñåë */
Main( ).
{
Int numbers [MAXSIZE]; /* ìàññèâ äëÿ ââîäà */
Int size; /* êîëè÷åñòâî ââîäèìûõ ÷èñåë */
Size = getarray(numbers, MAXSIZE); /* çàïèñü ÷èñåë â ìàññèâ */
Sort(numbers, size); /* ñîðòèðîâêà ìàññèâà */
Print(numbers,/size); /* ïå÷àòü îòñîðòèðîâàííîãî ìàññèâà */
}
Ýòî îáùèé âèä ïðîãðàììû. Ôóíêöèÿ getarray() ðàçìåùàåò ââåäåííîå ÷èñëà â ìàññèâå numbers è âûäàåò ñîîáùåíèå î òîì, ñêîëüêî çíà÷åíèé áûëî ñ÷èòàíî; ýòà âåëè÷èíà çàïèñûâàåòñÿ â size. Çàòåì èäÿ ôóíêöèè sîrt( ) è print( ), êîòîðûå ìû åùå äîëæíû íàïèñàòü; îíè ñîðòèðóþò ìàññèâ è ïå÷àòàþò ðåçóëüòàòû. Âêëþ÷àÿ â íèõ size, ìû îáëåã÷àåì èì ðàáîòó è èçáàâëÿåì îò íåîáõîäèìîñòè âûïîëíÿòü ñàìèì ïîäñ÷åò. Ìû òàêæå ñíàáäèëè getarray( ) ïåðåìåííîé MAXSIZE, êîòîðàÿ ñîîáùàåò ðàçìåð ìàññèâà, íåîáõîäèìîãî äëÿ çàïîìèíàíèÿ.
Òåïåðü, êîãäà ìû äîáàâèëè size ê ïåðåäàâàåìîé èíôîðìàöèè, íóæíî ìîäèôèöèðîâàòü ðèñóíîê íàøåãî ÷åðíîãî ÿùèêà. Ñì. ðèñ. 10.6.

ÐÈÑ. 10.6. Ïðîãðàìì: ñîðòèðîâêè, äîïîëíèòåëüíûå äåòàëè.
Òåïåðü ðàññìîòðèì ôóíêöèþ getarray( ):
/* getarray( ), èñïîëüçóþùàÿ getint( ) */
#define STOP -1 /* ïðèçíàê EOF */
#define NONUM 1 /* ïðèçíàê íåöèôðîâîé ñòðîêè */
#define YESNUM 0 /* ïðèçíàê ñòðîêè öèôð */
Getarray(array, limit);
Int array[ ], limit;
{
Int num, status;
Int index = 0; /* èíäåêñ ìàññèâà */
Printf(" Ýòà ïðîãðàììà ïðåêðàùàåò ñ÷èòûâàíèå ÷èñåë ïîñëå %d çíà÷åíèé. \n", limit);
Printf(" èëè åñëè ââåäåí ñèìâîë EOF.\n");
While(index < limit && (status = getint(&num)) != STOP).
{ /* ïðåêðàùàåò ñ÷èòûâàíèå ïîñëå äîñòèæåíèÿ limit èëè EOF */
If(status == YESNUM).
{ array[index++] = num;
Printf(" ÷èñëî %d ïðèíÿòî.\n", num);
} else if(status == NONUM).
Printf(" Ýòî áûëî íå öåëîå ÷èñëî! Ïîïûòàéòåñü ñíîâà. \n");
Else.
Printf(" Ýòîãî íå ìîæåò áûòü! ×òî-òî íåïðàâèëüíî. \n");
If(index == limit) /* ñîîáùèòü, åñëè ìàññèâ çàïîëíåí */
Printf(" Âñå %d ýëåìåíòîâ ìàññèâà çàïîëíåíû. \n ", limit);
Return(index);
}
Ýòî çíà÷èòåëüíàÿ ÷àñòü ïðîãðàììû, è ó íàñ åñòü íåìàëî çàìå÷àíèé.
Ðàçúÿñíåíèÿ.
Òàê êàê íåìíîãî òðóäíî âñïîìíèòü çíà÷åíèå, ñêàæåì êîäà -1, ìû èñïîëüçóåì ìíåìîíè÷åñêèå ñèìâîëè÷åñêèå êîíñòàíòû äëÿ ïðåäñòàâëåíèÿ êîäîâ ñîñòîÿíèÿ.
Ïðèìåíÿÿ ýòè êîäû, ìû ñîçäàåì getarray( ) äëÿ óïðàâëåíèÿ êàæäûì èç âîçìîæíûõ çíà÷åíèé ñîñòîÿíèÿ. Ñîñòîÿíèå STOP âûçûâàåò ïðåêðàùåíèå öèêëà ÷òåíèÿ, åñëè getint( ) íàõîäèò íà ñâîåì "ïóòè" EOF. Ñîñòîÿíèå YESNUM ãîâîðèò î çàïîìèíàíèè ÷èñëà â ïðåäëàãàåìîì ìàññèâå. Êðîìå òîãî, îòñûëàåòñÿ "ýõî-÷èñëî" ïîëüçîâàòåëþ, ÷òîáû îí çíàë, ÷òî îíî ïðèíÿòî. Ñîñòîÿíèå NONUM ïðåäïèñûâàåò ïîëüçîâàòåëþ ïîïûòàòüñÿ âûïîëíèòü çàäà÷ó åùå ðàç. (Ýòî ïðèçíàê "äðóæåëþáèÿ").
Ó íàñ åñòü åùå îïåðàòîð else. Åäèíñòâåííûé ïóòü äîñòèæåíèÿ ýòîãî îïåðàòîðà âîçìîæåí, åñëè getint( ) âîçâðàùàåò çíà÷åíèå, îòëè÷íîå îò -1, 0 èëè 1. Îäíàêî ýòî åäèíñòâåííûå çíà÷åíèÿ, êîòîðûå ìîãóò áûòü âîçâðàùåíû, ïîýòîìó else ÿâëÿåòñÿ, ïî-âèäèìîìó áåñïîëåçíûì îïåðàòîðîì. Ïî÷åìó îí âêëþ÷åí â ïðîãðàììó? Ìû âñòàâèëè åãî êàê ïðèìåð "çàùèòíîãî ïðîãðàììèðîâàíèÿ", êàê ñïîñîá çàùèòû ïðîãðàììû îò áóäóùåé îøèáêè.
Êîãäà-íèáóäü ìû (èëè êòî-íèáóäü åùå), ìîæåò áûòü, ðåøèì îáðàòèòüñÿ ê ôóíêöèè getint( ) è äîáàâèòü â åå ðåïåðòóàð íåìíîãî áîëüøå âîçìîæíûõ çíà÷åíèé ñîñòîÿíèÿ. Íàèáîëåå âåðîÿòíî, ÷òî ìû çàáóäåì (à îíè ìîãóò íèêîãäà íå óçíàòü), ÷òî getarray( ) ïðåäïîëàãàåò òîëüêî òðè âîçìîæíûõ îòâåòà. Ïîýòîìó ìû âêëþ÷àåì ýòî ïîñëåäíåå else, ÷òîáû "ïîéìàòü" ëþáûå íîâûå îòâåòû, êîòîðûå ïîÿâÿòñÿ, è çíà÷èòåëüíî óïðîñòèòü áóäóùóþ îòëàäêó.
Ðàçìåð ìàññèâà óñòàíàâëèâàåòñÿ â main(). Ïîýòîìó ìû íå çàäàåì åãî, êîãäà îïèñûâàåì àðãóìåíò-ìàññèâ â getarray(). Ìû ñòàâèì òîëüêî êâàäðàòíûå ñêîáêè â îïåðàòîð, ÷òîáû óêàçàòü, ÷òî àðãóìåíò ÿâëÿåòñÿ ìàññèâîì.
Int numbers [MAXSIZE]; /* ðàçìåð çàäàåòñÿ â main */
Int array[ ] /* íåò îïðåäåëåíèÿ ðàçìåðà â âûçâàâøåé ôóíêöèè */
Èñïîëüçîâàíèå ìàññèâîâ â ôóíêöèÿõ îáñóäèì â ãë. 12. Ìû ðåøèëè ïðèìåíèòü êëþ÷åâîå ñëîâî return äëÿ âîçâðàòà ÷èñëà ïðî÷èòàííûõ ýëåìåíòîâ. Òàêèì îáðàçîì, âûçîâ íàøåé ôóíêöèè:
Size = getarray(numbers);
Ïðèñâàèâàåò çíà÷åíèå ïåðåìåííîé size è äàåò çíà÷åíèÿ ìàññèâó numbers. Âû ìîæåòå ñïðîñèòü, ïî÷åìó ìû íå èñïîëüçîâàëè óêàçàòåëè â âûçîâå.
Size = gåtàrràó (numbers);
Âåäü ó íàñ ôóíêöèÿ èçìåíÿåò çíà÷åíèå ÷åãî-òî (ìàññèâà) â âûçûâàþùåé ïðîãðàììå? Îøèáàåòåñü - ìû èñïîëüçîâàëè óêàçàòåëü!  ÿçûêå Ñè èìÿ ìàññèâà ÿâëÿåòñÿ òàêæå óêàçàòåëåì íà ïåðâûé ýëåìåíò ìàññèâà, ò. å.
Numbers == &numbers[0].
Êîãäà ôóíêöèÿ getarray() ñîçäàåò ìàññèâ array, òî àäðåñ ýëåìåíòà àrràó[0] ñîâïàäàåò ñ àäðåñîì ýëåìåíòà numbers[0] è ò. ä. äëÿ âñåõ äðóãèõ èíäåêñîâ. Ïîýòîìó âñå ìàíèïóëÿöèè, êîòîðûå âûïîëíÿåò qetarray( ) ñ àrràó[ ], ôàêòè÷åñêè âûïîëíÿþòñÿ ñ numbers[ ]. Ìû áóäåì áîëåå ïîäðîáíî ãîâîðèòü î ñâÿçè ìåæäó óêàçàòåëÿìè è ìàññèâàìè â ãë. 12. Òåïåðü æå íàì íóæíî óñâîèòü, ÷òî ôóíêöèÿ âîçäåéñòâóåò íà ìàññèâ â âûçûâàþùåé ïðîãðàììå, åñëè ìû èñïîëüçóåì ìàññèâ â êà÷åñòâå àðãóìåíòà ôóíêöèè.
 ôóíêöèÿõ, ñîäåðæàùèõ ñ÷åò÷èêè è ïðåäåëû, òàêèõ êàê getarray( ), íàèáîëåå âåðîÿòíûì ìåñòîì ïîÿâëåíèÿ îøèáîê ÿâëÿþòñÿ "ãðàíè÷íûå óñëîâèÿ", ãäå çíà÷åíèÿ ñ÷åò÷èêîâ äîñòèãàþò ñâîèõ ïðåäåëîâ. Ìû ñîáèðàåìñÿ ïðî÷èòàòü ìàêñèìàëüíîå êîëè÷åñòâî ÷èñåë, óêàçàííîå â MAXSIZE, èëè æå ìû íàìåðåíû îãðàíè÷èòüñÿ îäíèì? Õîòèì îáðàòèòü âíèìàíèå íà äåòàëè, òàêèå, êàê ++index èëè index++ è<èëè<=. Ìû òàêæå äîëæíû ïîìíèòü, ÷òî ó ìàññèâîâ èíäåêñû íà÷èíàþòñÿ ñ 0, à íå ñ 1.
Ïðîâåðüòå âàøó ïðîãðàììó è ïîñìîòðèòå, ðàáîòàåò ëè îíà òàê, êàê äîëæíà. Ñàìîå ïðîñòîå - ïðåäïîëîæèòü, ÷òî limit ðàâåí 1 è ïðîéòè ïî ïðîãðàììå øàã çà øàãîì.
Ñîðòèðîâêà äàííûõ.
Ðàññìîòðèì åùå ðàç ôóíêöèþ main( ):

Main( ).
{
Int numbers[MAXSIZE]; /* ìàññèâ äëÿ ââîäà */
Int size; /* êîëè÷åñòâî ââåäåííûõ ýëåìåíòîâ */
Size = getarray(numbers, MAXSIZE); /* ïîìåùàåò ââîä â ìàññèâ */
Sort(numbers, size); /* ñîðòèðîâêà ìàññèâà */
Printf(numbers, size); /* ïå÷àòü îòñîðòèðîâàííîãî ìàññèâà */
}
Ìû âèäèì, ÷òî ôóíêöèÿ sort() èìååò íà âõîäå ìàññèâ öåëûõ ÷èñåë, ïðåäíàçíà÷åííûõ äëÿ ñîðòèðîâêè, è ñ÷åò÷èê êîëè÷åñòâà ýëåìåíòîâ, ïîäëåæàùèõ ñîðòèðîâêå. Íà âûõîäå ïîëó÷àåòñÿ ìàññèâ, ñîäåðæàùèé îòñîðòèðîâàííûå ÷èñëà. Ìû âñå åùå íå ðåøèëè, êàê âûïîëíÿòü ñîðòèðîâêó, ïîýòîìó ìû äîëæíû äîïîëíèòåëüíî óòî÷íèòü ýòî îïèñàíèå.
Î÷åâèäíî, â íà÷àëå òðóäíî îïðåäåëèòü íàïðàâëåíèå ñîðòèðîâêè. Ñîáèðàåìñÿ ëè ìû âåñòè ñîðòèðîâêó îò áîëüøåãî ê ìåíüøåìó, èëè íàîáîðîò? Ìû ñâîáîäíû â âûáîðå è äîïóñòèì, ÷òî õîòèì ñîðòèðîâàòü îò áîëüøåãî ê ìåíüøåìó. (Ìîæíî ñäåëàòü ïðîãðàììó, ðàáîòàþùóþ ëþáûì èç ýòèõ ìåòîäîâ, íî òîãäà íàì íóæíî ïðèäóìàòü ñïîñîá ñîîáùèòü åé î ñâîåì âûáîðå.).
Ðàññìîòðèì òåïåðü ìåòîä, êîòîðûé áóäåì èñïîëüçîâàòü äëÿ ñîðòèðîâêè. Â íàñòîÿùåå âðåìÿ ðàçðàáîòàíî ìíîãî àëãîðèòìîâ ñîðòèðîâêè; âîçüìåì îäèí èç ñàìûõ ïðîñòûõ.
Âîò íàø ïëàí íà ïñåâäîêîäå:
Îò n = ïåðâîìó ýëåìåíòó äî n = áëèæàéøåìó - ê- ïîñëåäíåìó ýëåìåíòó íàõîäèì ñàìîå áîëüøîå èç îñòàâøèõñÿ ÷èñåë è ïîìåùàåì åãî â n-þ ïîçèöèþ.
Îí âûïîëíÿåòñÿ ïðèìåðíî òàê. Ñíà÷àëà ïóñòü n = 1. Ìû ïðîñìàòðèâàåì âåñü ìàññèâ, íàõîäèì ñàìîå áîëüøîå ÷èñëî è ïîìåùàåì åãî â ïåðâûé ýëåìåíò. Çàòåì n = 2, è ìû îïÿòü ïðîñìàòðèâàåì âåñü ìàññèâ, êðîìå ïåðâîãî ýëåìåíòà, íàõîäèì ñàìîå áîëüøîå èç îñòàâøèõñÿ ÷èñåë è ïîìåùàåì åãî âî âòîðîé ýëåìåíò. Ïðîäîëæàåì ýòîò ïðîöåññ äî òåõ ïîð, ïîêà íå äîñòèãíåì áëèæàéøåãî - ê - ïîñëåäíåìó ýëåìåíòó. Òåïåðü îñòàëîñü òîëüêî äâà ýëåìåíòà. Ìû ñðàâíèâàåì ýòè ÷èñëà è ïîìåùàåì áîëüøåå â ýëåìåíò, áëèæàéøèé - ê - ïîñëåäíåìó. Îñòàâøååñÿ ñàìîå ìåíüøåå èç âñåõ ÷èñåë ïîìåùàåì â ïîñëåäíèé ýëåìåíò.
Ýòî âûãëÿäèò î÷åíü ïîõîæå íà çàäà÷ó ñ öèêëîì for, íî ìû âñå æå äîëæíû îïèñàòü ïðîöåññ "íàéòè è ïîìåñòèòü" áîëåå äåòàëüíî. Êàê ñäåëàòü òàê, ÷òîáû ìû íàõîäèëè êàæäûé ðàç ñàìîå áîëüøîå èç îñòàâøèõñÿ ÷èñåë? Âîò îäèí ñïîñîá. Ñðàâíèòå ïåðâûé è âòîðîé ýëåìåíòû îñòàâøåãîñÿ ìàññèâà. Åñëè âòîðîé áîëüøå, ïîìåíÿéòå èõ ìåñòàìè. Òåïåðü ñðàâíèòå ïåðâûé ýëåìåíò ñ òðåòüèì. Åñëè òðåòèé áîëüøå, ïîìåíÿéòå ìåñòàìè ýòè äâà. Êàæäûé ðàç áîëüøèé ýëåìåíò ïåðåìåùàåòñÿ ââåðõ. Ïðîäîëæàåì òàêèì îáðàçîì, ïîêà íå ñðàâíèì ïåðâûé ýëåìåíò ñ ïîñëåäíèì. Åñëè ìû äîøëè äî êîíöà, ñàìîå áîëüøîå ÷èñëî òåïåðü áóäåò â ïåðâîì ýëåìåíòå îñòàâøåãîñÿ ìàññèâà. Ïî ñóùåñòâó ìû èìååì îòñîðòèðîâàííûé ìàññèâ äëÿ ïåðâîãî ýëåìåíòà, íî îñòàòîê ìàññèâà íàõîäèòñÿ â áåñïîðÿäêå. Íà ïñåâäîêîäå ýòî ìîæíî âûðàçèòü òàê:
Äëÿ n = îò âòîðîãî äî ïîñëåäíåãî ýëåìåíòà ñðàâíèâàåì n-é ýëåìåíò ñ ïåðâûì; åñëè n-é áîëüøå, ìåíÿåì èõ ìåñòàìè.
Ýòî íàïîìèíàåò åùå îäèí öèêë for. Åãî ñëåäóåò âñòàâèòü â ïåðâûé öèêë for. Âíåøíèé öèêë ïîêàçûâàåò, êàêîé ýëåìåíò ìàññèâà äîëæåí áûòü çàïîëíåí, à âíóòðåííèé öèêë íàõîäèò çíà÷åíèå, êîòîðîå ñëåäóåò ïîìåñòèòü òóäà. Çàïèñûâàÿ îáå ÷àñòè íà ïñåâäîêîäå è ïåðåâîäÿ èõ íà ÿçûê Ñè, ìû ïîëó÷àåì ñëåäóþùóþ ôóíêöèþ:
/* ñîðòèðîâêà ìàññèâà öåëûõ ÷èñåë â ïîðÿäêå óáûâàíèÿ */
Sortarray(array, limit).
Int array[ ], limit;
{
Int top, search;
For(top = 0; top < limit - 1; top++).
For(search = top + 1; search < limit; search++).
If(array [search] > array[top]
Interchange(&array[search], &array[top] );
}
Ìû ïîìíèì, ÷òî ïåðâûé ýëåìåíò èìååò èíäåêñ 0. Êðîìå òîãî, åùå â ãë. 9 áûëà ñîçäàíà ôóíêöèÿ îáìåíà, ïîýòîìó ìû èñïîëüçîâàëè åå çäåñü. Òàê êàê ôóíêöèÿ interchange "ðàáîòàåò" ñ äâóìÿ ýëåìåíòàìè ìàññèâà, à íå ñî âñåì ìàññèâîì, ìû äîëæíû èñïîëüçîâàòü àäðåñà òîëüêî äâóõ èíòåðåñóþùèõ íàñ ýëåìåíòîâ. (Â òî âðåìÿ êàê èìÿ array ÿâëÿåòñÿ óêàçàòåëåì íà âåñü ìàññèâ, íàì íóæíî ïðèìåíèòü îïåðàöèþ &, ÷òîáû óêàçûâàòü íà îòäåëüíûå ýëåìåíòû.).
Ìû èñïîëüçîâàëè top â êà÷åñòâå èíäåêñà äëÿ ýëåìåíòà ìàññèâà, êîòîðûé ñëåäóåò çàïîëíèòü, òàê êàê îí ÿâëÿåòñÿ âåðøèíîé íå îòñîðòèðîâàííîé ÷àñòè ìàññèâà. Èíäåêñ search ïåðåìåùàåò ïî ìàññèâó â ïîðÿäêå óáûâàíèÿ òåêóùèé ýëåìåíò. Áîëüøèíñòâî òåêñòîâ èñïîëüçóåò îáîçíà÷åíèÿ i è j äëÿ ýòèõ èíäåêñîâ, îäíàêî ýòî îñëîæíÿåò ñèòóàöèþ, åñëè íóæíî ïîñìîòðåòü, ÷òî ïðîèñõîäèò.
Ýòîò àëãîðèòì èíîãäà íàçûâàþò "ïóçûðüêîâîé ñîðòèðîâêîé", òàê êàê ñàìîå áîëüøîå çíà÷åíèå ìåäëåííî ïîäíèìåòñÿ ââåðõ. Èìåííî òåïåðü ìû äîëæíû íàïèñàòü ôóíêöèþ ðrint( ).
Ïå÷àòü äàííûõ.

Ýòà ïðîãðàììà äîñòàòî÷íî ïðîñòà:
/* ïå÷àòü ìàññèâà */
Print(array, limit).
Int array[ ], limit;
{
Int index;
For(index = 0; index <= limit; index ++).
Printf(" %d\n", array[index]);
}
Åñëè ìû õîòèì ñäåëàòü ÷òî-íèáóäü äðóãîå, íàïðèìåð ïå÷àòàòü ïî ñòðîêàì, à íå â ñòîëáåö, ìîæíî âñåãäà âåðíóòüñÿ è èçìåíèòü ýòó ôóíêöèþ, îñòàâèâ äðóãèå ôóíêöèè íåèçìåííûìè. Àíàëîãè÷íî, åñëè ìû íàøëè àëãîðèòì ñîðòèðîâêè, êîòîðûé íàì áîëüøå íðàâèòñÿ, ìîæíî. çàìåíèòü ýòîò ìîäóëè ïðîãðàììû. Ýòî îäèí èç ïðèÿòíûõ ìîìåíòîâ ìîäóëüíîé ïðîãðàììû.
Ðåçóëüòàòû.
Äàâàéòå ñêîìïèëèðóåì è ïðîòåñòèðóåì íàøó ïðîãðàììó ñîðòèðîâêè. ×òîáû óïðîñòèòü ïðîâåðêó ãðàíè÷íûõ óñëîâèé, âðåìåííî èçìåíèì MAXSIZE íà 5.
 íàøåì ïåðâîì òåñòå áóäåì ñíàáæàòü ïðîãðàììó ÷èñëàìè äî òåõ ïîð, ïîêà îíà íå îòêàæåòñÿ èõ ïðèíèìàòü.
Ýòà ïðîãðàììà ïðåêðàùàåò ñ÷èòûâàíèå ÷èñåë ïîñëå 5 çíà÷åíèé, èëè åñëè âñòðåòèëñÿ ñèìâîë EOF.
12 34 54 23 67.
Âñå 5 ýëåìåíòîâ ìàññèâà çàïîëíåíû.
67.
54.
34.
23.
12.
Ïðîãðàììà ñ÷èòàëà 5 ÷èñåë è îòñîðòèðîâàëà èõ. Òåïåðü ïîñìîòðèì, êàê áóäåò âûãëÿäåòü ðåçóëüòàò, åñëè îíà îñòàíîâèòñÿ, âñòðåòèâ ñèìâîë EOF.
Ýòà ïðîãðàììà ïðåêðàùàåò ñ÷èòûâàíèå ÷èñåë ïîñëå 5 çíà÷åíèé, èëè åñëè âñòðåòèëñÿ ñèìâîë EOF.
456 928.
-23 +16.
Êëàâèøà [control -z] (ïåðåäàåò EOF â íàøó ñèñòåìó).
928.
456.
16.
-23.
Áûñòðåå ÷åì âû ñìîæåòå ñêàçàòü "ýêîëîãèÿ ýòî íàóêà î äîìàøíåì õîçÿéñòâå", öåëûé îãðîìíûé ìàññèâ îòñîðòèðîâàí.

Óñïåõ! Ýòî áûëî íå ïðîñòî, íî íå íåâîçìîæíî. Ðàçäåëèâ çàäà÷ó íà íåáîëüøèå ÷àñòè è ïðîäóìàâ, êàêîé èíôîðìàöèåé äîëæíà îáìåíèâàòüñÿ êàæäàÿ èç íèõ, ìû ñâåëè çàäà÷ó ê ÷àñòÿì, ïîääàþùèìñÿ óïðàâëåíèþ. Êðîìå òîãî, îòäåëüíûå ìîäóëè, êîòîðûå ìû ñîçäàëè, ìîæíî èñïîëüçîâàòü êàê ÷àñòè ïîäîáíûõ ïðîãðàìì.
Ýòèì çàâåðøàþòñÿ íàøè ïðèìåðû â äàííîé ãëàâå. Äàâàéòå òåïåðü âåðíåìñÿ íåìíîãî íàçàä è ñäåëàåì îáçîð ãëàâû.
ÎÁÇÎÐ
×åãî æå ìû äîñòèãëè? Åñëè ïîñìîòðåòü ñ ïðàêòè÷åñêîé ñòîðîíû, òî ìû ðàçðàáîòàëè ãåíåðàòîð ñëó÷àéíûõ ÷èñåë è ïðîãðàììó ñîðòèðîâêè öåëûõ ÷èñåë. Ïðè ýòîì ñîçäàëè ôóíêöèþ getint( ), êîòîðóþ ìîæíî èñïîëüçîâàòü â äðóãèõ ïðîãðàììàõ. Åñëè ïîñìîòðåòü ñ ïåäàãîãè÷åñêîé òî÷êè çðåíèÿ, òî ìû ïðîèëëþñòðèðîâàëè íåñêîëüêî îñíîâíûõ ïðèíöèïîâ è êîíöåïöèé, ïîëåçíûõ ïðè ñîçäàíèè ïðîãðàìì.
Ñëåäóåò îáðàòèòü âíèìàíèå íà ñàìûé ñóùåñòâåííûé ìîìåíò:
Ïðîãðàììû íóæíî ïðîåêòèðîâàòü, à íå ñîçäàâàòü èõ ìåòîäîì ïðîá è îøèáîê. Âû äîëæíû âíèìàòåëüíî ïîäóìàòü î ôîðìå è ñîäåðæàíèè ââîäà è âûâîäà äëÿ ïðîãðàììû. Íåîáõîäèìî ðàçäåëèòü ïðîãðàììó íà õîðîøî îïðåäåëåííûå çàäà÷è, çàòåì ðàçäåëüíî çàïðîãðàììèðîâàòü, ïðèíèìàÿ âî âíèìàíèå âçàèìîäåéñòâèå èõ äðóã ñ äðóãîì. Èäåÿ çàêëþ÷àåòñÿ â äîñòèæåíèè ìîäóëüíîñòè. Åñëè íåîáõîäèìî, ðàçáèâàéòå ìîäóëè íà åùå áîëåå ìåëêèå ìîäóëè. Èñïîëüçóéòå ôóíêöèè äëÿ ïîâûøåíèÿ ñòåïåíè ìîäóëüíîñòè è ïðîñòîòû ïðîãðàììû.
Ïðè ïðîåêòèðîâàíèè ïðîãðàììû, ïîïûòàéòåñü ïðåäâèäåòü, ÷òî ìîæåò èäòè íåïðàâèëüíî è ïðîãðàììèðóéòå, èñõîäÿ èç ýòîãî. Èñïîëüçóéòå ëîêàëèçàöèþ îøèáîê, ÷òîáû êîíòðîëèðîâàòü äåéñòâèÿ â ìåñòàõ ïîòåíöèàëüíûõ çàòðóäíåíèé, èëè ïî êðàéíåé ìåðå ïðåäóïðåæäàòü ïîëüçîâàòåëÿ, ÷òî ìîæåò âîçíèêíóòü îñëîæíåíèå. Ãîðàçäî ëó÷øå äàòü ïîëüçîâàòåëþ åùå îäíó âîçìîæíîñòü ââåñòè äàííûå, ÷åì ïðîäîëæàòü âûïîëíÿòü ïðîãðàììó è ïðèéòè ê àâàðèéíîé ñèòóàöèè.
Åñëè ñîçäàåòñÿ ôóíêöèÿ, ñíà÷àëà îïðåäåëèòå, êàê îíà áóäåò âçàèìîäåéñòâîâàòü ñ âûçûâàþùåé ïðîãðàììîé. Ðåøèòå òàêæå, êàêàÿ èíôîðìàöèÿ áóäåò âõîäèòü â íåå, à êàêàÿ âûõîäèòü. Êàêèìè äîëæíû áûòü àðãóìåíòû? Õîòèòå ëè âû èñïîëüçîâàòü óêàçàòåëè, èëè âîçâðàò, èëè òî è äðóãîå? Åñëè âû ïðèìåòå âî âíèìàíèå âñå ýòè ïàðàìåòðû, òî ìîæåòå îáðàòèòü âíèìàíèå íà ðàáîòó ñàìîé ôóíêöèè.
Èñïîëüçóéòå ýòè èäåè, è âàøà ïðîãðàììà áóäåò áîëåå íàäåæíîé è ìåíåå ïîäâåðæåííîé àâàðèéíûì ñèòóàöèÿì. Âû ïîëó÷àåòå òåëî ôóíêöèè, êîòîðîå ìîæåòå ïðèìåíÿòü â äðóãèõ ïðîãðàììàõ. Ïðîãðàììèðîâàíèå â òàêîì ñëó÷àå ïîòðåáóåò ìåíüøå âðåìåíè. Âîîáùå âñå ýòî ïîõîæå íà õîðîøèé ðåöåïò çäîðîâîãî ïðîãðàììèðîâàíèÿ.
Íå çàáûâàéòå î êëàññàõ ïàìÿòè. Ïåðåìåííûå ìîæíî îïðåäåëÿòü âíå ôóíêöèè; â ýòîì ñëó÷àå èõ íàçûâàþò âíåøíèìè (èëè ãëîáàëüíûìè) è îíè äîñòóïíû áîëåå ÷åì äëÿ îäíîé ôóíêöèè. Ïåðåìåííûå, îïðåäåëåííûå âíóòðè ôóíêöèè, ÿâëÿþòñÿ ëîêàëüíûìè äëÿ íåå è íå èçâåñòíû äðóãèì ôóíêöèÿì. Åñëè ìîæíî, èñïîëüçóéòå àâòîìàòè÷åñêóþ ðàçíîâèäíîñòü ëîêàëüíûõ ïåðåìåííûõ. Îíè îõðàíÿþò ïåðåìåííûå îäíîé ôóíêöèè îò âîçäåéñòâèÿ äðóãèõ ôóíêöèé.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê ïðåäñòàâëÿòü ôóíêöèþ: ÷åðíûé ÿùèê ñ èíôîðìàöèîííûì ïîòîêîì.
×òî òàêîå "ïðîâåðêà îøèáîê" è ïî÷åìó ýòà ïðîöåäóðà õîðîøà.
Àëãîðèòì ñîðòèðîâêè.
Êàê çàñòàâèòü ôóíêöèþ èçìåíÿòü ìàññèâ: function(array).
Êàê ïðåîáðàçîâàòü ñòðîêó öèôð â ÷èñëî.
Êëàññû ïàìÿòè: auto, extern, static è register.
Îáëàñòü äåéñòâèÿ êàæäîãî êëàññà ïàìÿòè.
Êàêîé êëàññ ïàìÿòè èñïîëüçîâàòü: îáû÷íî auto.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ
Âîïðîñû.
1. ×òî ìîæåò ñäåëàòü íàø àëãîðèòì ñîðòèðîâêè íåýôôåêòèâíûì?
2. Êàê ñëåäóåò èçìåíèòü íàøó ïðîãðàììó ñîðòèðîâêè, ÷òîáû îíà ñîðòèðîâàëà è ïî ðÿäêå âîçðàñòàíèÿ, à íå óáûâàíèÿ?
3. Èçìåíèòå ôóíêöèþ print( ) òàêèì îáðàçîì, ÷òîáû îíà ïå÷àòàëà ïî 5 ÷èñåë â ñòðîêå.
4. Êàê ñëåäóåò èçìåíèòü ôóíêöèþ stoi( ), ÷òîáû îáðàáàòûâàòü ñòðîêè, ïðåäñòàâëÿþùèå âîñüìåðè÷íûå ÷èñëà?
5. Êàêèå ôóíêöèè "çíàþò" êàæäóþ ïåðåìåííóþ èç îïèñàííûõ íèæå? Åñòü ëè çäåñü êàêèå-íèáóäü îøèáêè?
/* ôàéë1 */
Int daisy;
Main( ).
{
Int lily;
}
Petal( ) {
Extern int daisy, lily;
}
/* ôàéë2 */
Static int lily;
Int rose;
Stem( ) {
Int rose;
}
Root( ).
{
Extern int daisy;
}
Îòâåòû.
1. Ïðåäïîëîæèì, ÷òî âû ñîðòèðóåòå 20 ÷èñåë. Ïðîãðàììà ïðîèçâîäèò 19 ñðàâíåíèé, ÷òîáû íàéòè îäíî ñàìîå áîëüøîå ÷èñëî. Çàòåì äåëàåòñÿ 18 ñðàâíåíèé, ÷òîáû íàéòè ñëåäóþùåå ñàìîå áîëüøîå. Âñÿ èíôîðìàöèÿ, ïîëó÷åííàÿ âî âðåìÿ ïåðâîãî ïîèñêà "çàáûâàåòñÿ" çà èñêëþ÷åíèåì ñàìîãî áîëüøîãî ÷èñëà, ïîñòàâëåííîãî íà ïåðâîå ìåñòî. Âòîðîå ñàìîå áîëüøîå ÷èñëî ìîæíî âðåìåííî ïîìåñòèòü íà ìåñòî ñ íîìåðîì 1, à çàòåì ïðè ñîðòèðîâêå îïóñòèòü âíèç. Ìíîãî ñðàâíåíèé, âûïîëíÿâøèõñÿ â ïåðâûé ðàç, ïîâòîðÿåòñÿ âòîðîé, òðåòèé ðàç è ò. ä.
2. Çàìåíèòå array[search] > array[top] íà array[search] < array[top].
3.
/* ïå÷àòü ìàññèâà */
Print(array, limit).
Int array[ ], limit);
{
Int index;
For(index = 0; index < limit; index++).
{ printf("%10d", array[index]);
If(index % 5 == 4) primf("\n" );
} printf("\n");
}
4. Âî-ïåðâûõ, îáåñïå÷üòå, ÷òîáû ðàçðåøåííûå ñèìâîëû áûëè òîëüêî öèôðàìè îò 0 äî 7. Âî-âòîðûõ, óìíîæàéòå íà 8 âìåñòî 10 êàæäûé ðàç, êîãäà îáíàðóæèòå íîâóþ öèôðó.
5. daisy èçâåñòíà ôóíêöèè main( ) ïî óìîë÷àíèþ è ôóíêöèÿì petal( ) è rîî1( ) áëàãîäàðÿ extern-îïèñàíèþ. Îíà íå èçâåñòíà ôóíêöèè stem( ), ïîòîìó ÷òî îíè íàõîäÿòñÿ â ðàçíûõ ôàéëàõ.
Ïåðâàÿ lily ëîêàëüíà äëÿ main: ññûëêà íà lily â petal( ) ÿâëÿåòñÿ îøèáî÷íîé, ïîòîìó ÷òî â êàæäîì èç ýòèõ ôàéëîâ íåò âíåøíåé lily.
Åñòü âíåøíÿÿ ñòàòè÷åñêàÿ lity, íî îíà èçâåñòíà òîëüêî ôóíêöèÿì âòîðîãî ôàéëà. Ïåðâàÿ, âíåøíÿÿ rose, èçâåñòíà ôóíêöèè root( ), à ôóíêöèÿ stem( ) îòìåíèëà åå ñâîåé ñîáñòâåííîé ëîêàëüíîé rose.
ÓÏÐÀÆÍÅÍÈß.
1. Íåêîòîðûå ïîëüçîâàòåëè, âîçìîæíî èñïóãàþòñÿ, åñëè èõ ïîïðîñèòü ââåñòè ñèìâîë EOF.
à. Ìîäèôèöèðóéòå getarray( ) è âûçûâàåìûå åþ ôóíêöèè òàê, ÷òîáû èñïîëüçîâàòü ñèìâîë # âìåñòî EOF.
á. Ìîäèôèöèðóéòå çàòåì èõ òàê, ÷òîáû ìîæíî áûëî èñïîëüçîâàòü ëèáî EOF, ëèáî #.
2. Ñîçäàéòå ïðîãðàììó, êîòîðàÿ ñîðòèðóåò ÷èñëà òèïà float.
3. Ñîçäàéòå ïðîãðàììó, ïðåâðàùàþùóþ ñìåøàííûé òåêñò èç ïðîïèñíûõ è ñòðî÷íûõ áóêâ â òåêñò, ñîñòîÿùèé òîëüêî èç ïðîïèñíûõ áóêâ.
4. Ñîçäàéòå ïðîãðàììó, êîòîðàÿ óäâàèâàåò ïðîáåëû â òåêñòå ñ îäèíî÷íûìè ïðîáåëàìè.
11. Ïðåïðîöåññîð ÿçûêà Ñè.
ÄÈÐÅÊÒÈÂÛ ÏÐÅÏÐÎÖÅÑÑÎÐÀ ÑÈÌÂÎËÜÍÛÅ ÊÎÍÑÒÀÍÒÛ ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈß È "ÌÀÊÐÎÔÓÍÊÖÈÈ" ÏÎÁÎ×ÍÛÅ ÝÔÔÅÊÒÛ ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈÈ ÂÊËÞ×ÅÍÈÅ ÔÀÉËΠÓÑËÎÂÍÀß ÊÎÌÏÈËßÖÈß.
ÄÈÐÅÊÒÈÂÛ ÏÐÅÏÐÎÖÅÑÑÎÐÀ #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif.
ßçûê Ñè áûë ðàçðàáîòàí â ïîìîùü ðàáîòàþùèì ïðîãðàììèñòàì, à èì íðàâèòñÿ åãî ïðåïðîöåññîð. Ýòîò ïîëåçíûé ïîìîùíèê ïðîñìàòðèâàåò ïðîãðàììó äî êîìïèëÿòîðà (îòñþäà è òåðìèí "ïðåïðîöåññîð") è çàìåíÿåò ñèìâîëè÷åñêèå àááðåâèàòóðû â ïðîãðàììå íà ñîîòâåòñòâóþùèå äèðåêòèâû. Îí îòûñêèâàåò äðóãèå ôàéëû, íåîáõîäèìûå âàì, è ìîæåò òàêæå èçìåíèòü óñëîâèÿ êîìïèëÿöèè. Îäíàêî ýòè ñëîâà íå îòðàæàþò èñòèííóþ ïîëüçó è çíà÷åíèå ïðåïðîöåññîðà, ïîýòîìó îáðàòèìñÿ ê ïðèìåðàì. Êîíå÷íî, äî ñèõ ïîð ìû ñíàáæàëè âñå ïðèìåðû äèðåêòèâàìè #define è #include, íî òåïåðü ìû ìîæåì ïîäûòîæèòü âñå, ÷òî èçó÷èëè, è ðàçâèòü òåìó äàëüøå.
ÑÈÌÂÎËÈ×ÅÑÊÈÅ ÊÎÍÑÒÀÍÒÛ: #define.
Äèðåêòèâà #define, ïîäîáíî âñåì äèðåêòèâàì ïðåïðîöåññîðà, íà÷èíàåòñÿ ñ ñèìâîëà # â ñàìîé ëåâîé ïîçèöèè. Îíà ìîæåò ïîÿâèòüñÿ â ëþáîì ìåñòå èñõîäíîãî ôàéëà, à äàâàåìîå åþ îïðåäåëåíèå èìååò ñèëó îò ìåñòà ïîÿâëåíèÿ äî êîíöà ôàéëà. Ìû àêòèâíî èñïîëüçóåì ýòó äèðåêòèâó äëÿ îïðåäåëåíèÿ ñèìâîëè÷åñêèõ êîíñòàíò â íàøèõ ïðîãðàììàõ, îäíàêî îíà èìååò áîëåå øèðîêîå ïðèìåíåíèå; ÷òî ìû è ïîêàæåì äàëüøå. Âîò ïðèìåð, èëëþñòðèðóþùèé íåêîòîðûå âîçìîæíîñòè è ñâîéñòâà äèðåêòèâû #define:
/* ïðîñòûå ïðèìåðû äèðåêòèâû ïðåïðîöåññîðà */
#define TWO 2 /* ïî æåëàíèþ ìîæíî èñïîëüçîâàòü êîììåíòàðèè */
#define MSG "Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ.".
/* îáðàòíàÿ êîñàÿ ÷åðòà ïðîäîëæàåò îïðåäåëåíèå íà ñëåäóþùóþ ñòðîêó */
#define FOUR TWO *TWO.
#define PX printf("X ðàâåí %d.\n", x).
#define FMT "X ðàâåí %d.\n".
Main( ).
{
Int x = TWO;
PX;
X = FOUR;
Printf(FMT, x);
Printf( "%s\n", MSG);
Printf("FTWO: MSG\n");
}
Êàæäàÿ ñòðîêà ñîñòîèò èç òðåõ ÷àñòåé. Ïåðâîé ñòîèò äèðåêòèâà #define. Äàëåå èäåò âûáðàííàÿ íàìè àááðåâèàòóðà, èçâåñòíàÿ ó ïðîãðàììèñòîâ êàê "ìàêðîîïðåäåëåíèå". Ìàêðîîïðåäåëåíèå íå äîëæíî ñîäåðæàòü âíóòðè ñåáÿ ïðîáåëû. È íàêîíåö, èäåò ñòðîêà (íàçûâàåìàÿ "ñòðîêîé çàìåùåíèÿ"), êîòîðóþ ïðåäñòàâëÿåò ìàêðîîïðåäåëåíèå. Êîãäà ïðåïðîöåññîð íàõîäèò â ïðîãðàììå îäíî èç âàøèõ ìàêðîîïðåäåëåíèé, îí ïî÷òè âñåãäà çàìåíÿåò åãî ñòðîêîé çàìåùåíèÿ. (Åñòü îäíî èñêëþ÷åíèå, êîòîðîå ìû âàì ñåé÷àñ ïîêàæåì.) Ýòîò ïðîöåññ ïðîõîæäåíèÿ îò ìàêðîîïðåäåëåíèÿ äî çàêëþ÷èòåëüíîé ñòðîêè çàìåùåíèÿ íàçûâàåòñÿ "ìàêðîðàñøèðåíèåì". Çàìåòèì, ÷òî ïðè ñòàíäàðòíîé ôîðìå çàïèñè íà ÿçûêå Ñè ìîæíî âñòàâëÿòü êîììåíòàðèè; îíè áóäóò èãíîðèðîâàòüñÿ ïðåïðîöåññîðîì. Êðîìå òîãî, áîëüøèíñòâî ñèñòåì ðàçðåøàåò èñïîëüçîâàòü îáðàòíóþ êîñóþ ÷åðòó ('\') äëÿ ðàñøèðåíèÿ îïðåäåëåíèÿ áîëåå ÷åì íà îäíó ñòðîêó.
"Çàïóñòèì" íàø ïðèìåð, è ïîñìîòðèì çà åãî âûïîëíåíèåì.
Õ ðàâåí 2.
Õ ðàâåí 4.
Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ. TWO: MSG.
Âîò ÷òî ïðîèçîøëî. Îïåðàòîð int x = TWO; ïðåâðàùàåòñÿ â int x = 2;.

ÐÈÑ. 11.1. ×àñòè ìàêðîîïðåäåëåíèÿ.
Ò. å. ñëîâî TWO çàìåíèëîñü öèôðîé 2. Çàòåì îïåðàòîð ÐÕ; ïðåâðàùàåòñÿ â printf("X ðàâíî %d. \n", õ); ïîñêîëüêó ñäåëàíà ïîëíàÿ çàìåíà. Ýòî íîâøåñòâî, òàê êàê äî ñèõ ïîð ìû èñïîëüçîâàëè ìàêðîîïðåäåëåíèÿ òîëüêî äëÿ ïðåäñòàâëåíèÿ êîíñòàíò. Òåïåðü æå ìû âèäèì, ÷òî ìàêðîîïðåäåëåíèå ìîæåò ïðåäñòàâëÿòü ëþáóþ ñòðîêó, äàæå öåëîå âûðàæåíèå íà ÿçûêå Ñè. Çàìåòèì, îäíàêî, ÷òî ýòî êîíñòàíòíàÿ ñòðîêà; ÐÕ íàïå÷àòàåò òîëüêî ïåðåìåííóþ, íàçâàííóþ x.
Ñëåäóþùàÿ ñòðîêà òàêæå ïðåäñòàâëÿåò ÷òî-òî íîâîå. Âû ìîæåòå ïîäóìàòü, ÷òî FOUR çàìåíÿåòñÿ íà 4, íî íà ñàìîì äåëå âûïîëíÿåòñÿ ñëåäóþùåå:
Õ = FOUR;
Ïðåâðàùàåòñÿ â õ = TWO *TWO; ïðåâðàùàåòñÿ â õ = 2*2; è íà ýòîì âñå çàêàí÷èâàåòñÿ. Ôàêòè÷åñêîå óìíîæåíèå èìååò ìåñòî íå âî âðåìÿ ðàáîòû ïðåïðîöåññîðà è íå ïðè êîìïèëÿöèè, à âñåãäà áåç èñêëþ÷åíèÿ ïðè ðàáîòå ïðîãðàììû. Ïðåïðîöåññîð íå âûïîëíÿåò âû÷èñëåíèé; îí òîëüêî î÷åíü òî÷íî äåëàåò ïðåäëîæåííûå ïîäñòàíîâêè.
Çàìåòèì, ÷òî ìàêðîîïðåäåëåíèå ìîæåò âêëþ÷àòü äðóãèå îïðåäåëåíèÿ. (Íåêîòîðûå êîìïèëÿòîðû íå ïîääåðæèâàþò ýòî ñâîéñòâî "âëîæåíèÿ".).
 ñëåäóþùåé ñòðîêå printf(FMT, õ); ïðåâðàùàåòñÿ â printf(" Õ ðàâíî %d.\n", õ) êîãäà FMT çàìåíÿåòñÿ ñîîòâåòñòâóþùåé ñòðîêîé. Ýòîò ïîäõîä ìîæåò îêàçàòüñÿ î÷åíü óäîáíûì, åñëè ó âàñ åñòü äëèííàÿ ñòðîêà, êîòîðóþ âû èñïîëüçóåòå íåñêîëüêî ðàç.
 ñëåäóþùåé ñòðîêå ïðîãðàììû MSG çàìåíÿåòñÿ ñîîòâåòñòâóþùåé ñòðîêîé. Êàâû÷êè äåëàþò çàìåùàþùóþ ñòðîêó êîíñòàíòîé ñèìâîëüíîé ñòðîêè; ïîñêîëüêó ïðîãðàììà ïîëó÷àåò åå ñîäåðæèìîå, ýòà ñòðîêà áóäåò çàïîìèíàòüñÿ â ìàññèâå, çàêàí÷èâàþùåìñÿ íóëü-ñèìâîëîì. Òàê, #define HAL 'Z' îïðåäåëÿåò ñèìâîëüíóþ êîíñòàíòó, à #define ÍÀÐ "Z" îïðåäåëÿåò ñèìâîëüíóþ ñòðîêó: Z\0.
Îáû÷íî ïðåïðîöåññîð, âñòðå÷àÿ îäíî èç âàøèõ ìàêðîîïðåäåëåíèé â ïðîãðàììå, î÷åíü òî÷íî çàìåíÿåò èõ ýêâèâàëåíòíîé ñòðîêîé çàìåùåíèÿ. Åñëè ýòà ñòðîêà òàêæå ñîäåðæèò ìàêðîîïðåäåëåíèÿ, îíè òîæå çàìåøàþòñÿ. Åäèíñòâåííûì èñêëþ÷åíèåì ïðè çàìåíå ÿâëÿåòñÿ ìàêðîîïðåäåëåíèå, íàõîäÿùååñÿ âíóòðè äâîéíûõ êàâû÷åê. Ïîýòîìó printf("TWO: MSG"); ïå÷àòàåò áóêâàëüíî TWO: MSG âìåñòî ïå÷àòè ñëåäóþùåé ñòðîêè:
2: "Ñòàðûé ñåðûé êîò ïîåò âåñåëóþ ïåñíþ.".
Åñëè âàì íóæíî íàïå÷àòàòü ýòó ñòðîêó, ìîæíî èñïîëüçîâàòü îïåðàòîð.
Printf("%d: %s\n", TWO, MSG);
Ïîòîìó ÷òî çäåñü ìàêðîîïðåäåëåíèÿ íàõîäÿòñÿ âíå êàâû÷åê.
Êîãäà ñëåäóåò èñïîëüçîâàòü ñèìâîëè÷åñêèå êîíñòàíòû? Âåðîÿòíî, âû äîëæíû ïðèìåíÿòü èõ äëÿ áîëüøèíñòâà ÷èñåë. Åñëè ÷èñëî ÿâëÿåòñÿ êîíñòàíòîé, èñïîëüçóåìîé â âû÷èñëåíèÿõ, òî ñèìâîëè÷åñêîå èìÿ äåëàåò ÿñíåå åå ñìûñë. Åñëè ÷èñëî - ðàçìåð ìàññèâà, òî ñèìâîëè÷åñêîå èìÿ óïðîùàåò èçìåíåíèå âàøåé ïðîãðàììû ïðè ðàáîòå ñ áîëüøèì ìàññèâîì. Åñëè ÷èñëî ÿâëÿåòñÿ ñèñòåìíûì êîäîì, ñêàæåì äëÿ ñèìâîëà EOF, òî ñèìâîëè÷åñêîå ïðåäñòàâëåíèå äåëàåò âàøó ïðîãðàììó áîëåå ïåðåíîñèìîé; èçìåíÿåòñÿ òîëüêî îïðåäåëåíèå EOF. Ìíåìîíè÷åñêîå çíà÷åíèå, ëåãêîñòü èçìåíåíèÿ, ïåðåíîñèìîñòü: âñå ýòî äåëàåò ñèìâîëè÷åñêèå êîíñòàíòû çàñëóæèâàþùèìè âíèìàíèÿ. Ëåãêî ëè ýòîãî äîñòè÷ü? Ðèñêíåì è ðàññìîòðèì ïðîñòóþ ôóíêöèþ, ò. å. ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÀÐÃÓÌÅÍÒÎÂ Ñ #define.
Ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè î÷åíü ïîõîæå íà ôóíêöèþ, ïîñêîëüêó àðãóìåíòû åãî çàêëþ÷åíû â ñêîáêè. Íèæå ïðèâåäåíî íåñêîëüêî ïðèìåðîâ, èëëþñòðèðóþùèõ, êàê îïðåäåëÿåòñÿ è èñïîëüçóåòñÿ òàêàÿ "ìàêðîôóíêöèÿ".  íåêîòîðûõ ïðèìåðàõ ê òîìó æå óêàçàíû âîçìîæíûå ëîâóøêè, ïîýòîìó ÷èòàéòå èõ âíèìàòåëüíî.

/* ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè */
#define SQUARE (õ) õ*õ.
#define PR(x) printf("x ðàâåí %d.\n" ,x).
Main( ).
{
Int x = 4;
Int z;
Z = SQUARE(x);
PR(z);
Z = SQUARE(2);
PR(z);
PR(SQUARE(x));
PR(SQUARE(x + 2));
PR(100/SQUARE(2));
PR(SQUAREC(++x));
}
Âñþäó, ãäå â âàøåé ïðîãðàììå ïîÿâëÿåòñÿ ìàêðîîïðåäåëåíèå SQUARE(x), îíî çàìåíÿåòñÿ íà õ*õ.  îòëè÷èå îò íàøèõ ïðåæíèõ ïðèìåðîâ ïðè èñïîëüçîâàíèè ýòîãî ìàêðîîïðåäåëåíèÿ ìû ìîæåì ñîâåðøåííî ñâîáîäíî ïðèìåíÿòü ñèìâîëû, îòëè÷íûå îò x.  ìàêðîîïðåäåëåíèè 'x' çàìåùàåòñÿ ñèìâîëîì, èñïîëüçîâàííûì â ìàêðîâûçîâå ïðîãðàììû. Ïîýòîìó ìàêðîîïðåäåëåíèå SQUARE(2) çàìåùàåòñÿ íà 2*2. Òàêèì îáðàçîì, x íà ñàìîì äåëå äåéñòâóåò êàê àðãóìåíò. Îäíàêî, êàê âû âñêîðå óâèäèòå, àðãóìåíò ìàêðîîïðåäåëåíèÿ íå "ðàáîòàåò" òî÷íî òàê æå, êàê àðãóìåíò ôóíêöèè. Âîò ðåçóëüòàòû âûïîëíåíèÿ ïðîãðàììû. Îáðàòèòå âíèìàíèå, ÷òî íåêîòîðûå îòâåòû îòëè÷àþòñÿ îò òåõ, êîòîðûå âû ìîãëè áû îæèäàòü.
Z ðàâíî 16.
Z ðàâíî 4.
SQUARE(x) ðàâíî 16.
SQUARE(x + 2) ðàâíî 14.
100/SQUARE(2) ðàâíî 100.
SQUAREC(++ x) ðàâíî 30.
Ïåðâûå äâå ñòðîêè ïðåäñêàçóåìû. Çàìåòèì, îäíàêî, ÷òî äàæå âíóòðè äâîéíûõ êàâû÷åê â îïðåäåëåíèè PR ïåðåìåííàÿ çàìåùàåòñÿ ñîîòâåòñòâóþùèì àðãóìåíòîì. Âñå àðãóìåíòû â ýòîì îïðåäåëåíèè çàìåùàþòñÿ.
Òðåòüÿ ñòðîêà ïðåäñòàâëÿåò èíòåðåñ:
PR(SQUARE(x));
Îíà ñòàíîâèòñÿ ñëåäóþùåé ñòðîêîé:
Printf("SQUARE(x) ðàâíî %d.\n", SQUARE(x));
Ïîñëå ïåðâîãî ýòàïà ìàêðîðàñøèðåíèÿ. Âòîðîå SQUARE(x) ðàñøèðÿåòñÿ, ïðåâðàùàÿñü â õ*õ, à ïåðâîå îñòàåòñÿ áåç èçìåíåíèÿ, ïîòîìó ÷òî òåïåðü îíî íàõîäèòñÿ âíóòðè äâîéíûõ êàâû÷åê â îïåðàòîðå ïðîãðàììû, è òàêèì îáðàçîì çàùèùåíî îò äàëüíåéøåãî ðàñøèðåíèÿ. Îêîí÷àòåëüíî ñòðîêà ïðîãðàììû ñîäåðæèò.
Printf(" SQUARE(x) ðàâíî %d.\n", x*x);
È âûâîäèò íà ïå÷àòü.
SQUARE(x) ðàâíî 16.
Ïðè ðàáîòå ïðîãðàììû.
Äàâàéòå åùå ðàç ïðîâåðèì òî, ÷òî çàêëþ÷åíî â äâîéíûå êàâû÷êè. Åñëè âàøå ìàêðîîïðåäåëåíèå âêëþ÷àåò àðãóìåíò ñ äâîéíûìè êàâû÷êàìè, òî àðãóìåíò áóäåò çàìåùàòüñÿ ñòðîêîé èç ìàêðîâûçîâà. Íî ïîñëå ýòîãî îí â äàëüíåéøåì íå ðàñøèðÿåòñÿ, äàæå åñëè ñòðîêà ÿâëÿåòñÿ åùå îäíèì ìàêðîîïðåäåëåíèåì.  íàøåì ïðèìåðå ïåðåìåííàÿ õ ñòàëà ìàêðîîïðåäåëåíèåì SQUARE(x) è îñòàëàñü èì.
Òåïåðü ìû äîáðàëèñü äî íåñêîëüêî ñïåöèôè÷åñêèõ ðåçóëüòàòîâ. Âñïîìíèì, ÷òî õ èìååò çíà÷åíèå b. Ýòî ïîçâîëÿåò ïðåäïîëîæèòü, ÷òî SQUARE(x + 2) áóäåò ðàâíî 6*6 èëè 36. Íî íàïå÷àòàííûé ðåçóëüòàò ãîâîðèò, ÷òî ïîëó÷àåòñÿ ÷èñëî 14, êîòîðîå, íåñîìíåííî, íèêàê íå ïîõîæå íà êâàäðàò öåëîãî ÷èñëà! Ïðè÷èíà òàêîãî ââîäÿùåãî â çàáëóæäåíèå ðåçóëüòàòà ïðîñòà, è ìû óæå îá ýòîì ãîâîðèëè: ïðåïðîöåññîð íå äåëàåò âû÷èñëåíèé, îí òîëüêî çàìåùàåò ñòðîêó. Âñþäó, ãäå íàøå îïðåäåëåíèå óêàçûâàåò íà õ, ïðåïðîöåññîð ïîäñòàâèò ñòðîêó õ + 2. Òàêèì îáðàçîì, õ*õ ñòàíîâèòñÿ õ + 2*õ + 2.
Åäèíñòâåííîå óìíîæåíèå çäåñü 2*x. Åñëè x ðàâíî 4, òî ïîëó÷àåòñÿ ñëåäóþùåå çíà÷åíèå ýòîãî âûðàæåíèÿ:
4+2*4+2=4+8+2= 14.
Ýòîò ïðèìåð òî÷íî ïîêàçûâàåò î÷åíü âàæíîå îòëè÷èå ìåæäó âûçîâîì ôóíêöèè è ìàêðîâûçîâîì. Âûçîâ ôóíêöèè ïåðåäàåò çíà÷åíèå àðãóìåíòà â ôóíêöèþ âî âðåìÿ âûïîëíåíèÿ ïðîãðàììû. Ìàêðîâûçîâ ïåðåäàåò ñòðîêó àðãóìåíòîâ â ïðîãðàììó äî åå êîìïèëÿöèè; ýòî äðóãîé ïðîöåññ, ïðîèñõîäÿùèé â äðóãîå âðåìÿ.
Ìîæíî ëè âàøå îïðåäåëåíèå ïåðåäåëàòü òàê, ÷òîáû SQUARE(x + 2) áûëî ðàâíî 36? Êîíå÷íî. Íàì ïðîñòî íóæíî áîëüøå ñêîáîê:
#define SQUARE(x) (x)*(x).
Òîãäà SQUARE(x + 2) ñòàíîâèòñÿ (õ + 2)*(õ + 2), è ìû ïîëó÷àåì íàøå æåëàííîå óìíîæåíèå, òàê êàê ïåðåíåñëè ñêîáêè â ñòðîêó çàìåùåíèÿ.
Îäíàêî ýòî íå ðåøàåò âñåõ íàøèõ ïðîáëåì. Ðàññìîòðèì ñëó÷àè, êîòîðûå ïðèâîäÿò ê ñëåäóþùåé ñòðîêå íà âûõîäå: 100/SQUARE(2) ïðåâðàùàåòñÿ â 100/2*2 .
Âû÷èñëåíèÿ ñëåäóåò âåñòè ñëåâà íàïðàâî, ò. å. (100/2)*2 èëè 50*2 èëè 100.
Ýòó ïóòàíèöó ìîæíî èñïðàâèòü, îïðåäåëèâ SQUARE(x) ñëåäóþùèì îáðàçîì:
#define SQUARE(x) (x*x).
Ýòî äàñò 100/(2 *2), ÷òî â êîíå÷íîì ñ÷åòå ýêâèâàëåíòíî 100/4 èëè 25.
×òîáû âûïîëíèòü äâà ïîñëåäíèõ ïðèìåðà, íàì íåîáõîäèìî îïðåäåëåíèå.
#define SQUARE(x) ((x)*(x)).
Ýòî óðîê èñïîëüçîâàíèÿ íåîáõîäèìîãî êîëè÷åñòâà ñêîáîê äëÿ ãàðàíòèè, ÷òî îïåðàöèè è ñîåäèíåíèÿ âûïîëíÿþòñÿ â ïðàâèëüíîì ïîðÿäêå.
Äàæå ýòè ïðåäîñòîðîæíîñòè íå ñïàñàþò ïîñëåäíèé ïðèìåð îò áåäû: SQUARE(++ õ) ïðåâðàùàåòñÿ â ++õ * ++õ è x óâåëè÷èâàåòñÿ äâàæäû - îäèí ðàç äî óìíîæåíèÿ è îäèí ðàç ïîñëå: ++õ * ++õ = 5*6 = 30.
(Òàê êàê ïîðÿäîê âûïîëíåíèÿ îïåðàöèé íå óñòàíîâëåí, òî íåêîòîðûå êîìïèëÿòîðû ïðåâðàòÿò ýòî â 6*5, íî êîíå÷íûé ðåçóëüòàò áóäåò òåì æå ñàìûì.).
Åäèíñòâåííîå ëåêàðñòâî â ýòîì ñëó÷àå - íå èñïîëüçîâàòü ++õ â êà÷åñòâå àðãóìåíòà äëÿ ìàêðîîïðåäåëåíèÿ. Çàìåòèì, ÷òî ++õ îáû÷íî ðàáîòàåò êàê àðãóìåíò ôóíêöèè, òàê êàê åìó ïðèñâàèâàåòñÿ çíà÷åíèå 5, è çàòåì ýòî çíà÷åíèå 5 ïåðåäàåòñÿ ôóíêöèè.
ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈÅ ÈËÈ ÔÓÍÊÖÈß?
Ìíîãèå çàäà÷è ìîæíî ðåøàòü, èñïîëüçóÿ ìàêðîîïðåäåëåíèå ñ àðãóìåíòàìè èëè ôóíêöèþ. ×òî èç íèõ ñëåäóåò ïðèìåíÿòü íàì? Íà ýòîò ñ÷åò íåò ñòðîãèõ ïðàâèë, íî åñòü íåêîòîðûå ñîîáðàæåíèÿ.
Ìàêðîîïðåäåëåíèÿ äîëæíû èñïîëüçîâàòüñÿ ñêîðåå êàê õèòðîñòè, à íå êàê îáû÷íûå ôóíêöèè: îíè ìîãóò èìåòü íåæåëàòåëüíûå ïîáî÷íûå ýôôåêòû, åñëè âû áóäåòå íåîñòîðîæíû. Íåêîòîðûå êîìïèëÿòîðû îãðàíè÷èâàþò ìàêðîîïðåäåëåíèÿ îäíîé ñòðîêîé, è, ïî-âèäèìîìó, ëó÷øå ñîáëþäàòü òàêîå îãðàíè÷åíèå, äàæå åñëè âàø êîìïèëÿòîð ýòîãî íå äåëàåò.
Âûáîð ìàêðîîïðåäåëåíèÿ ïðèâîäèò ê óâåëè÷åíèþ îáúåìà ïàìÿòè, à âûáîð ôóíêöèè - ê óâåëè÷åíèþ âðåìåíè ðàáîòû ïðîãðàììû. Òàê ÷òî äóìàéòå, ÷òî âûáðàòü! Ìàêðîîïðåäåëåíèå ñîçäàåò "ñòðî÷íûé" êîä, ò. å. âû ïîëó÷àåòå îïåðàòîð â ïðîãðàììå. Åñëè ìàêðîîïðåäåëåíèå ïðèìåíèòü 20 ðàç, òî â âàøó ïðîãðàììó âñòàâèòñÿ 20 ñòðîê êîäà. Åñëè âû èñïîëüçóåòå ôóíêöèþ 20 ðàç, ó âàñ áóäåò òîëüêî îäíà êîïèÿ îïåðàòîðîâ ôóíêöèè, ïîýòîìó ïîëó÷àåòñÿ ìåíüøèé îáúåì ïàìÿòè. Îäíàêî óïðàâëåíèå ïðîãðàììîé ñëåäóåò ïåðåäàòü òóäà, ãäå íàõîäèòñÿ ôóíêöèÿ, à çàòåì âåðíóòüñÿ â âûçûâàþùóþ ïðîãðàììó, à íà ýòî ïîòðåáóåòñÿ áîëüøå âðåìåíè, ÷åì ïðè ðàáîòå ñî "ñòðî÷íûìè" êîäàìè.
Ïðåèìóùåñòâî ìàêðîîïðåäåëåíèé çàêëþ÷àåòñÿ â òîì, ÷òî ïðè èõ èñïîëüçîâàíèè âàì íå íóæíî áåñïîêîèòüñÿ î òèïàõ ïåðåìåííûõ (ìàêðîîïðåäåëåíèÿ èìåþò äåëî ñ ñèìâîëüíûìè ñòðîêàìè, à íå ñ ôàêòè÷åñêèìè çíà÷åíèÿìè). Òàê íàøå ìàêðîîïðåäåëåíèå SQUARE(x) ìîæíî èñïîëüçîâàòü îäèíàêîâî õîðîøî ñ ïåðåìåííûìè òèïà int èëè float.
Îáû÷íî ïðîãðàììèñòû èñïîëüçóþò ìàêðîîïðåäåëåíèÿ äëÿ ïðîñòûõ äåéñòâèè, ïîäîáíûõ ñëåäóþùèì:
#define MAX(X,Y) ( (X) > (Y) ? (X) : (Y)).
#define ABS(X) ( (X) < 0 ? -(X) : (X)).
#define ISSIGN(X) ( (X) == '+' || (X) == '-' ? 1 : 0).
(Ïîñëåäíåå ìàêðîîïðåäåëåíèå èìååò çíà÷åíèå 1 (èñòèííî), åñëè X ÿâëÿåòñÿ ñèìâîëîì àëãåáðàè÷åñêîãî çíàêà.) Îòìåòèì ñëåäóþùèå ìîìåíòû:
1.  ìàêðîîïðåäåëåíèè íåò ïðîáåëîâ, íî îíè ìîãóò ïîÿâèòüñÿ â çàìåùàþùåé ñòðîêå. Ïðåïðîöåññîð "ïîëàãàåò", ÷òî ìàêðîîïðåäåëåíèå çàêàí÷èâàåòñÿ íà ïåðâîì ïðîáåëå, ïîýòîìó âñå, ÷òî ñòîèò ïîñëå ïðîáåëà, îñòàåòñÿ â çàìåùàþùåé ñòðîêå.
ÐÈÑ. 11.2. Îøèáî÷íûé ïðîáåë è ìàêðîîïðåäåëåíèè.
2. Èñïîëüçóéòå êðóãëûå ñêîáêè äëÿ êàæäîãî àðãóìåíòà è âñåãî îïðåäåëåíèÿ. Ýòî ÿâëÿåòñÿ ãàðàíòèåé òîãî, ÷òî ýëåìåíòû áóäóò ñãðóïïèðîâàíû íàäëåæàùèì îáðàçîì â âûðàæåíèè, ïîäîáíîì forks = 2*MAX(guests + 3, last);
3. Äëÿ èìåí ìàêðîôóíêöèé ñëåäóåò èñïîëüçîâàòü ïðîïèñíûå áóêâû. Ýòî ñîãëàøåíèå íå ðàñïðîñòðàíÿåòñÿ òàê øèðîêî, êàê ñîãëàøåíèå îá èñïîëüçîâàíèè ïðîïèñíûõ áóêâ äëÿ ìàêðîêîíñòàíò. Ïðèìåíåíèå èõ ïðåäîñòåðåæåò âàñ îò âîçìîæíûõ ïîáî÷íûõ ýôôåêòîâ ìàêðîîïðåäåëåíèé.
Ïðåäïîëîæèì, ÷òî âû ðàçðàáîòàëè íåñêîëüêî ìàêðîôóíêöèé ïî ñâîåìó óñìîòðåíèþ. Äîëæíû ëè âû èõ ïåðåîïðåäåëÿòü êàæäûé ðàç, êîãäà ïèøåòå íîâóþ ïðîãðàììó? Íåò, åñëè âû âñïîìíèòå î äèðåêòèâå #include. Òåïåðü ðàññìîòðèì åå.
ÂÊËÞ×ÅÍÈÅ ÔÀÉËÀ: #include.
Êîãäà ïðåïðîöåññîð "ðàñïîçíàåò" äèðåêòèâó #include, îí èùåò ñëåäóþùåå çà íåé èìÿ ôàéëà è âêëþ÷àåò åãî â òåêóùèé ôàéë. Äèðåêòèâà âûäàåòñÿ â äâóõ âèäàõ:
#include <stdio.h> èìÿ ôàéëà â óãëîâûõ ñêîáêàõ.
#include "mystuff.h" èìÿ ôàéëà â äâîéíûõ êàâû÷êàõ.
 îïåðàöèîííîé ñèñòåìå UNIX óãëîâûå ñêîáêè ñîîáùàþò ïðåïðîöåññîðó, ÷òî ôàéë ñëåäóåò èñêàòü â îäíîì èëè íåñêîëüêèõ ñòàíäàðòíûõ ñèñòåìíûõ êàòàëîãàõ. Êàâû÷êè ãîâîðÿò åìó, ÷òî ñíà÷àëà íóæíî ñìîòðåòü â âàøåì êàòàëîãå (èëè â êàêîì-òî äðóãîì, åñëè âû îïðåäåëÿåòå åãî èìåíåì ôàéëà), à çàòåì èñêàòü â "ñòàíäàðòíûõ" ìåñòàõ.
#include <stdio.h> èùåò â ñèñòåìíîì êàòàëîãå.
#include "hot.h" èùåò â âàøåì òåêóùåì ðàáî÷åì êàòàëîãå.
#include "/usr/biif/p.h" èùåò â êàòàëîãå /usr/biff.
 òèïè÷íîé ìèêðîïðîöåññîðíîé ñèñòåìå ýòè äâå ôîðìû ÿâëÿþòñÿ ñèíîíèìàìè, è ïðåïðîöåññîð âåäåò ïîèñê íà óêàçàííîì äèñêå.
#include "stdio.h" èùåò íà ñòàíäàðòíîì äèñêå.
#include <stdio.h> èùåò íà ñòàíäàðòíîì äèñêå.
#include "a : stdio.h" èùåò íà äèñêå à.
Çà÷åì âêëþ÷àþò ôàéëû? Ïîòîìó ÷òî îíè íåñóò íóæíóþ âàì èíôîðìàöèþ. Ôàéë stdio.h, íàïðèìåð, îáû÷íî ñîäåðæèò îïðåäåëåíèÿ EOF, getchar( ) è putchar( ). Äâå ïîñëåäíèå Ôóíêöèè îïðåäåëåíû êàê ìàêðîôóíêöèè.
Ïî ñîãëàøåíèþ ñóôôèêñ .h èñïîëüçóåòñÿ äëÿ "çàãîëîâî÷íûõ" ôàéëîâ, ò. å. ôàéëîâ ñ èíôîðìàöèåé, êîòîðàÿ ðàñïîëàãàåòñÿ â íà÷àëå âàøåé ïðîãðàììû. Çàãîëîâî÷íûå ôàéëû îáû÷íî ñîñòîÿò èç îïåðàòîðîâ ïðåïðîöåññîðà. Íåêîòîðûå ôàéëû, ïîäîáíî stdio.h, âêëþ÷åíû â ñèñòåìó, íî âû ìîæåòå ñîçäàòü è ñâîé ñîáñòâåííûé.
Çàãîëîâî÷íûå ôàéëû:
Ïðèìåð:
Ïðåäïîëîæèì, íàïðèìåð, ÷òî âàì ïðàâèòñÿ èñïîëüçîâàòü áóëåâû ïåðåìåííûå, ò. ñ. âìåñòî òîãî ÷òîáû èìåòü 1 êàê "èñòèíó" è 0 êàê "ëîæü", õîòåëè áû èñïîëüçîâàòü ñëîâà TRUE è FALSE. Ìîæíî ñîçäàòü ôàéë, íàçâàííûé, ñêàæåì, bool.h, êîòîðûé ñîäåðæàë áû ýòè îïðåäåëåíèÿ:
/* ôàéë bool.h */
#define BOOL int;
#define TRUE 1.
#define FALSE 0.
Âîò ïðèìåð ïðîãðàììû, èñïîëüçóþùåé ýòîò çàãîëîâîê:
/* ñ÷èòàåò ïóñòûå ñèìâîëû */
#include <stdio.h>
#include "bool.h".
Main( ).
{
Int ch;
Int count = 0;
BOOL whitesp( );
While((ch = getchar( )) != EOF).
if(whitesp(ch)) count++;
Printf(" Èìååòñÿ %d ïóñòûõ ñèìâîëîâ. \n", count);
}
BOOL whitesp(c).
Char c;
If(c == ' ' || ñ == '\n' || ñ == '\t').
Return(TRUE);
Else.
Return(FALSE);
}
Çàìå÷àíèÿ ïî ïðîãðàììå.
1. Åñëè äâå ôóíêöèè â ýòîé ïðîãðàììå ('main( )' è 'whitesp( )') ñëåäîâàëî ñêîìïèëèðîâàòü ðàçäåëüíî, òî íóæíî áûëî áû èñïîëüçîâàòü äèðåêòèâó #include "bool.h" ñ êàæäîé èç íèõ.
2. Âûðàæåíèå if(whitesp(ch)) àíàëîãè÷íî if(whitesp(ch)) == TRUE, òàê êàê ñàìà ôóíêöèÿ whitesp(ch) èìååò çíà÷åíèå TRUE èëè FALSE.
3. Ìû íå ñîçäàëè íîâûé òèï BOOL, òàê êàê BOOL óæå èìååò òèï int. Öåëü íàèìåíîâàíèÿ ôóíêöèè BOOL - íàïîìíèòü ïîëüçîâàòåëþ, ÷òî ôóíêöèÿ èñïîëüçóåòñÿ äëÿ ëîãè÷åñêèõ âû÷èñëåíèé (â ïðîòèâîïîëîæíîñòü àðèôìåòè÷åñêèì).
4. Èñïîëüçîâàíèå ôóíêöèè â ïðåäóñìàòðèâàåìûõ ëîãè÷åñêèõ ñðàâíåíèÿõ ìîæåò ñäåëàòü ïðîãðàììó ÿñíåå. Îíà ìîæåò òàêæå ñýêîíîìèòü íàø òðóä, åñëè ñðàâíåíèå âñòðå÷àåòñÿ â ïðîãðàììå áîëåå îäíîãî ðàçà.
5. Ìû ìîãëè áû èñïîëüçîâàòü ìàêðîîïðåäåëåíèå âìåñòî ôóíêöèè äëÿ çàäàíèÿ whitesp( ).
Ìíîãèå ïðîãðàììèñòû ðàçðàáàòûâàþò ñâîè ñòàíäàðòíûå çàãîëîâî÷íûå ôàéëû, ÷òîáû èñïîëüçîâàòü èõ â ïðîãðàììàõ. Íåêîòîðûå ôàéëû ìîãóò ñîçäàâàòüñÿ äëÿ ñïåöèàëüíûõ öåëåé, äðóãèå ìîæíî èñïîëüçîâàòü ïî÷òè â êàæäîé ïðîãðàììå. Òàê êàê âêëþ÷åííûå ôàéëû ìîãóò ñîäåðæàòü äèðåêòèâû #include, ìîæíî, åñëè õîòèòå, ñîçäàòü ñæàòûé, õîðîøî îãðàíèçîâàííûé çàãîëîâî÷íûé ôàéë. Ðàññìîòðèì ýòîò ïðèìåð:
/*çàãîëîâî÷íûé ôàéë mystuff.h*/
#include.
#include "bool.h".
#include "funct.h".
#define YES 1.
#define NO 0.
Âî-ïåðâûõ, ìû õîòèì íàïîìíèòü âàì, ÷òî ïðåïðîöåññîð ÿçûêà Ñè ðàñïîçíàåò êîììåíòàðèè, ïîìå÷åííûå /* è */, ïîýòîìó ìû ìîæåì âêëþ÷àòü êîììåíòàðèè â ýòè ôàéëû.
Âî-âòîðûõ, ìû âêëþ÷èëè òðè ôàéëà. Ïî-âèäèìîìó, òðåòèé ñîäåðæèò íåêîòîðûå ìàêðîôóíêöèè, êîòîðûå èñïîëüçóþòñÿ ÷àñòî.
Â-òðåòüèõ, ìû îïðåäåëèëè YES êàê 1, òîãäà êàê â ôàéëå bool.h ìû îïðåäåëèëè TRUE êàê 1. Íî çäåñü íåò êîíôëèêòà, è ìû ìîæåì èñïîëüçîâàòü ñëîâà YES è TRUE â îäíîé è òîé æå ïðîãðàììå. Êàæäîå èç íèõ áóäåò çàìåíÿòüñÿ íà 1. Ìîæåò âîçíèêíóòü êîíôëèêò, åñëè ìû äîáàâèì â ôàéë ñòðîêó.
#define TRUE 2.
Âòîðîå îïðåäåëåíèå âûòåñíèëî áû ïåðâîå, è íåêîòîðûå ïðåïðîöåññîðû ïðåäóïðåæäàëè áû âàñ, ÷òî TRUE ïåðåîïðåäåëåíî.
Äèðåêòèâà #include íå îãðàíè÷èâàåòñÿ çàãîëîâî÷íûìè ôàéëàìè. Åñëè âû çàïèñàëè íóæíóþ ôóíêöèþ â ôàéë sort.ñ, òî ìîæíî èñïîëüçîâàòü.
#include "sort.ñ".
×òîáû ñêîìïèëèðîâàòü åãî ñîâìåñòíî ñ âàøåé òåêóùåé ïðîãðàììîé.
Äèðåêòèâû #include è #define ÿâëÿþòñÿ íàèáîëåå àêòèâíî èñïîëüçóåìûìè ñðåäñòâàìè ïðåïðîöåññîðà ÿçûêà Ñè. Ðàññìîòðèì áîëåå ñæàòî äðóãèå åãî äèðåêòèâû.
ÄÐÓÃÈÅ ÄÈÐÅÊÒÈÂÛ: #undef, #if, #ifdef, #ifndef, #else È #endif.
Ýòè äèðåêòèâû îáû÷íî èñïîëüçóþòñÿ ïðè ïðîãðàììèðîâàíèè áîëüøèõ ìîäóëåé. Îíè ïîçâîëÿþò ïðèîñòàíîâèòü äåéñòâèå áîëåå ðàííèõ îïðåäåëåíèé è ñîçäàòü ôàéëû, êàæäûé èç êîòîðûõ ìîæíî êîìïèëèðîâàòü ïî-ðàçíîìó.
Äèðåêòèâà #undef îòìåíÿåò ñàìîå ïîñëåäíåå îïðåäåëåíèå ïîèìåíîâàííîãî ìàêðîîïðåäåëåíèÿ.
#define BIG 3.
#define HUGE 5.
#undef BIG /* BIG òåïåðü íå îïðåäåëåí */
#define HUGE 10 /* HUGE ïåðåîïðåäåëåí êàê 10 */
#undef HUGE /* HUGE ñíîâà ðàâåí 5*/
#undef HUGE /* HUGE òåïåðü íå îïðåäåëåí */
Î÷åâèäíî (ìû íàäååìñÿ), âû íå áóäåòå êîìïèëèðîâàòü ôàéë, êàê â ýòîì ïðèìåðå. Ïðåäïîëîæèì, ÷òî ó âàñ åñòü áîëüøîé ñòàíäàðòíûé ôàéë, îïðåäåëåííûé äèðåêòèâîé #include, êîòîðûé âû õîòåëè áû èñïîëüçîâàòü, íî äëÿ ýòîãî íåêîòîðûå èç åãî îïðåäåëåíèé äëÿ îäíîé èç ôóíêöèé ïðîãðàììû íóæíî áóäåò âðåìåííî èçìåíèòü, Âìåñòî òîãî ÷òîáû èìåòü äåëî ñ ýòèì ôàéëîì, âû ìîæåòå ïðîñòî âêëþ÷èòü åãî, à çàòåì îêðóæèòü òàêóþ âûäåëÿþùóþñÿ ôóíêöèþ ñîîòâåòñòâóþùèìè äèðåêòèâàìè #define è #undef.
Èëè, ïðåäïîëîæèì, ÷òî âû ðàáîòàåòå ñ áîëüøîé ñèñòåìîé ïðîãðàìì. Âû õîòèòå çàäàòü ìàêðîîïðåäåëåíèå, íî íå óâåðåíû, èñïîëüçóåò ëè âàøå îïðåäåëåíèå äðóãèå îïðåäåëåíèÿ îòêóäà-íèáóäü èç äðóãîãî ìåñòà ñèñòåìû.  ýòîì ñëó÷àå ïðîñòî îòìåíèòå âàøå ìàêðîîïðåäåëåíèå â òîì ìåñòå, ãäå îíî âàì áîëüøå íå íóæíî, à îðèãèíàë ýòîãî ìàêðîîïðåäåëåíèÿ, åñëè îí åñòü, áóäåò ïî-ïðåæíåìó îñòàâàòüñÿ â ñèëå äëÿ îñòàëüíîé ÷àñòè ñèñòåìû.
Äðóãèå óïîìÿíóòûå íàìè äèðåêòèâû ïîçâîëÿþò âûïîëíÿòü óñëîâíóþ êîìïèëÿöèþ. Âîò ïðèìåð:
#ifdef MAVIS
#include " horse.h" /* âûïîëíèòñÿ, åñëè MAVIS îïðåäåëåí */
#define STABLES 5.
#else.
#include "cow.h" /*âûïîëíèòñÿ, åñëè MAVIS íå îïðåäåëåí */
#define STABLES 15.
#endif.
Äèðåêòèâà #ifdef ñîîáùàåò, ÷òî åñëè ïîñëåäóþùèé èäåíòèôèêàòîð (MAVIS) îïðåäåëÿåòñÿ ïðåïðîöåññîðîì, òî âûïîëíÿþòñÿ âñå ïîñëåäóþùèå äèðåêòèâû âïëîòü äî ïåðâîãî ïîÿâëåíèÿ #else èëè #endif. Êîãäà â ïðîãðàììå åñòü #else, òî ïðîãðàììà îò #else äî #endif áóäåò âûïîëíÿòüñÿ, åñëè èäåíòèôèêàòîð íå îïðåäåëåí.
Òàêàÿ ñòðóêòóðà î÷åíü íàïîìèíàåò êîíñòðóêöèþ if-else ÿçûêà Ñè. Îñíîâíàÿ ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî ïðåïðîöåññîð íå ðàñïîçíàåò ôèãóðíûå ñêîáêè {}, îòìå÷àþùèå áëîê, ïîòîìó ÷òî îí èñïîëüçóåò äèðåêòèâû #else (åñëè åñòü) è #endif (êîòîðàÿ äîëæíà áûòü) äëÿ ïîìåòêè áëîêîâ äèðåêòèâ.
Ýòè óñëîâíûå êîíñòðóêöèè ìîãóò áûòü âëîæåííûìè.
Äèðåêòèâû #ifdef è #if ìîæíî èñïîëüçîâàòü ñ #else è #endif òàêèì æå îáðàçîì. Äèðåêòèâà #ifndef îïðàøèâàåò, ÿâëÿåòñÿ ëè ïîñëåäóþùèé èäåíòèôèêàòîð íåîïðåäåëåííûì; ýòà äèðåêòèâà ïðîòèâîïîëîæíà #ifdef. Äèðåêòèâà #if áîëüøå ïîõîæà íà îáû÷íûé îïåðàòîð if ÿçûêà Ñè. Çà íåé ñëåäóåò êîíñòàíòíîå âûðàæåíèå, êîòîðîå ñ÷èòàåòñÿ èñòèííûì, åñëè îíî íå ðàâíî íóëþ:
#if SYS == "IBM".
#include "ibm.h".
#endif.
Îäíà èç öåëåé èñïîëüçîâàíèÿ "óñëîâíîé êîìïèëÿöèè" - ñäåëàòü ïðîãðàììó áîëåå ìîáèëüíîé. Èçìåíÿÿ íåñêîëüêî êëþ÷åâûõ îïðåäåëåíèé â íà÷àëå ôàéëà, âû ìîæåòå óñòàíàâëèâàòü ðàçëè÷íûå çíà÷åíèÿ è âêëþ÷àòü ðàçëè÷íûå ôàéëû äëÿ ðàçíûõ ñèñòåì.
Ýòè êðàòêèå ïðèìåðû èëëþñòðèðóþò óäèâèòåëüíóþ ñïîñîáíîñòü ÿçûêà Ñè èçîùðåííî è ñòðîãî óïðàâëÿòü ïðîãðàììàìè.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îïðåäåëÿòü ñèìâîëüíûå êîíñòàíòû äèðåêòèâîé #define: #define FINGERS 10.
Êàê âêëþ÷àòü äðóãèå ôàéëû: #include "albanian.h".
Êàê îïðåäåëèòü ìàêðîôóíêöèþ: #define NEG(X) (-(X)).
Êîãäà èñïîëüçîâàòü ñèìâîëè÷åñêèå êîíñòàíòû: ÷àñòî.
Êîãäà èñïîëüçîâàòü ìàêðîôóíêöèè: èíîãäà.
Îïàñíîñòü ïðèìåíåíèÿ ìàêðîôóíêöèé: ïîáî÷íûå ýôôåêòû.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ
Âîïðîñû.
1. Íèæå ïðèâåäåíû ãðóïïû îïåðàòîðîâ, ñîäåðæàùèõ ïî îäíîìó è áîëåå ìàêðîîïðå äåëåíèé, çà êîòîðûìè ñëåäóþò ñòðîêè èñõîäíûõ êîäîâ, èñïîëüçóþùèõ ýòè ìàêðî îïðåäåëåíèÿ. Êàêîé ðåçóëüòàò ïîëó÷àåòñÿ â êàæäîì ñëó÷àå? Ïðàâèëåí ëè îí?
A. #define FPM 5280 /* ôóòîâ â ìèëå */
Dist = FPM * miles;
Á. #define FEET 4.
#define POD FEET + FEET.
Plort = FEET * POD;
Â. #define SIX = 6;
Nex = SIX;
Ã. #define NEW(X) X + 5.
Ó = NEW(y);
Berg = NEW(berg) * lob;
Est = NEW(berg) / NEW(y);
Nilp = lob * NEW(-berg);
2. Ïîäïðàâüòå îïðåäåëåíèå â âîïðîñå 1.ã, ÷òîáû ñäåëàòü åãî áîëåå íàäåæíûì.
3. Îïðåäåëèòå ìàêðîôóíêöèþ, êîòîðàÿ âîçâðàùàåò ìèíèìàëüíîå èç äâóõ çíà÷åíèé.
4. Çàäàéòå ìàêðîîïðåäåëåíèå, â êîòîðîì åñòü ôóíêöèÿ whitesp(ñ) ñ÷èòàþùàÿ â ïðîãðàììå ïóñòûå ñèìâîëû.
5. Îïðåäåëèòå ìàêðîôóíêöèþ, êîòîðàÿ ïå÷àòàåò ïðåäñòàâëåíèÿ çíà÷åíèÿ äâóõ öåëûõ âûðàæåíèé.
Îòâåòû.
1.
À. dist = 5280 * miles; ïðàâèëüíî.
Á. plot = 4 * 4 + 4; ïðàâèëüíî, íî åñëè ïîëüçîâàòåëü íà ñàìîì äåëå õîòåë èìåòü 4 * (4 + 4), òî ñëåäîâàëî ïðèìåíÿòü äèðåêòèâó #define POD (FEET + FEET).
Â. nex = = 6; íåïðàâèëüíî; î÷åâèäíî, ïîëüçîâàòåëü çàáûë, ÷òî îí ïèøåò äëÿ ïðåïðîöåññîðà, à íå íà ÿçûêå Ñè.
Ã. ó - ó + 5; ïðàâèëüíî.
Berg = berg + 5 * lob; ïðàâèëüíî, íî, âåðîÿòíî, ýòî íåæåëàòåëüíûé ðåçóëüòàò.
Est = berg + 5/ó + 5; òî æå ñàìîå.
Nilp = lob * -berg + 5; òî æå ñàìîå.
2. #define NEW(X) ((X) + 5).
3. #deline MIN(X,Y) ((X) < (Y) ? (X) : (Y)).
4. #define WHITESP(C) ((Ñ) == ' ' || (Ñ) == '\n' || (Ñ)) == '\t').
5. #define PR2(X,Y) printf(" X ðàâíî %d è Y ðàâíî %d.\n", X, Y).
Òàê êàê â ýòîì ìàêðîîïðåäåëåíèè Õ è Y íèêîãäà íå èñïîëüçóþòñÿ íèêàêèìè äðóãèìè îïåðàöèÿìè (òàêèìè, êàê óìíîæåíèå), ìû íå äîëæíû íè÷åãî çàêëþ÷àòü â ñêîáêè.
ÓÏÐÀÆÍÅÍÈÅ.
1. Ñîçäàéòå çàãîëîâî÷íûé ôàéë îïðåäåëåíèé ïðåïðîöåññîðà, êîòîðûå âû õîòèòå ïðèìåíÿòü.
12. Ìàññèâû è óêàçàòåëè.
ÌÀÑÑÈÂÛ. ÌÍÎÃÎÌÅÐÍÛÅ ÌÀÑÑÈÂÛ. ÈÍÈÖÈÀËÈÇÀÖÈß ÌÀÑÑÈÂÎÂ. ÓÊÀÇÀÒÅËÈ È ÎÏÅÐÀÖÈÈ ÍÀÄ ÓÊÀÇÀÒÅËßÌÈ. ÑÂßÇÜ ÌÅÆÄÓ ÌÀÑÑÈÂÎÌ È ÓÊÀÇÀÒÅËÅÌ. ÎÏÅÐÀÖÈÈ & * (óíàðíûå).
Ìåæäó ìàññèâàìè è óêàçàòåëÿìè ñóùåñòâóåò î÷åíü òåñíàÿ ñâÿçü, ïîýòîìó îáû÷íî èõ ðàññìàòðèâàþò âìåñòå. Íî, ïðåæäå ÷åì èññëåäîâàòü ýòó ñâÿçü, äàâàéòå ïðîâåðèì íàøè çíàíèÿ î ìàññèâàõ è ïîïîëíèì èõ, à óæ ïîñëå ýòîãî ïåðåéäåì ê èçó÷åíèþ ñâÿçè ìåæäó ìàññèâàìè è óêàçàòåëÿìè.
ÌÀÑÑÈÂÛ
Âû óæå çíàåòå, ÷òî ìàññèâ ïðåäñòàâëÿåò ñîáîé ãðóïïó ýëåìåíòîâ îäíîãî òèïà. Êîãäà íàì òðåáóåòñÿ äëÿ ðàáîòû ìàññèâ, ìû ñîîáùàåì îá ýòîì êîìïèëÿòîðó ïðè ïîìîùè îïåðàòîðîâ îïèñàíèÿ. Äëÿ ñîçäàíèÿ ìàññèâà êîìïèëÿòîðó íåîáõîäèìî çíàòü òèï äàííûõ è òðåáóåìûé êëàññ ïàìÿòè, ò. å. òî æå ñàìîå, ÷òî è äëÿ ïðîñòîé ïåðåìåííîé (íàçûâàåìîé "ñêàëÿðíîé"). Êðîìå òîãî, äîëæíî áûòü èçâåñòíî, ñêîëüêî ýëåìåíòîâ èìååò ìàññèâ. Ìàññèâû ìîãóò èìåòü òå æå òèïû äàííûõ è êëàññû ïàìÿòè, ÷òî è ïðîñòûå ïåðåìåííûå, è ê íèì ïðèìåíèì òîò æå ïðèíöèï óìîë÷àíèÿ. Ðàññìîòðèì ïðèìåðû, ðàçëè÷íûõ îïèñàíèé ìàññèâîâ:
/* íåñêîëüêî îïèñàíèé ìàññèâîâ */
Int temp[365]; /* âíåøíèé ìàññèâ èç 365 öåëûõ ÷èñåë */
Main( ).
{
Float rain[365]; /* àâòîìàòè÷åñêèé ìàññèâ èç 365 ÷èñåë òèïà.
Float */
Static char code[12]; /* ñòàòè÷åñêèé ìàññèâ èç 12 ñèìâîëîâ */
Extern temp[ ]; /* âíåøíèé ìàññèâ; ðàçìåð óêàçàí âûøå */
}
Êàê óæå óïîìèíàëîñü, êâàäðàòíûå ñêîáêè ([ ]) ãîâîðÿò î òîì, ÷òî temp è âñå îñòàëüíûå èäåíòèôèêàòîðû ÿâëÿþòñÿ èìåíàìè ìàññèâîâ, à ÷èñëî, çàêëþ÷åííîå â ñêîáêè, óêàçûâàåò êîëè÷åñòâî ýëåìåíòîâ ìàññèâà. Îòäåëüíûé ýëåìåíò ìàññèâà îïðåäåëÿåòñÿ ïðè ïîìîùè åãî íîìåðà, íàçûâàåìîãî òàêæå èíäåêñîì. Íóìåðàöèÿ ýëåìåíòîâ íà÷èíàåòñÿ ñ íóëÿ, ïîýòîìó temp[0] ÿâëÿåòñÿ ïåðâûì, à temp[364] ïîñëåäíèì 365-ýëåìåíòîì ìàññèâà temp. Íî âñå ýòî âàì óæå äîëæíî áûòü èçâåñòíî, ïîýòîìó èçó÷èì ÷òî-íèáóäü íîâîå.
Èíèöèàëèçàöèÿ ìàññèâîâ è êëàññû ïàìÿòè.
Äëÿ õðàíåíèÿ äàííûõ, íåîáõîäèìûõ ïðîãðàììå, ÷àñòî èñïîëüçóþò ìàññèâû. Íàïðèìåð, â ìàññèâå èç 12 ýëåìåíòîâ ìîæíî õðàíèòü èíôîðìàöèþ î êîëè÷åñòâå äíåé êàæäîãî ìåñÿöà.  ïîäîáíûõ ñëó÷àÿõ æåëàòåëüíî èìåòü óäîáíûé ñïîñîá èíèöèàëèçàöèè ìàññèâà ïåðåä íà÷àëîì ðàáîòû ïðîãðàììû. Òàêàÿ âîçìîæíîñòü, âîîáùå ãîâîðÿ, ñóùåñòâóåò, íî òîëüêî äëÿ ñòàòè÷åñêîé è âíåøíåé ïàìÿòè. Äàâàéòå ïîñìîòðèì, êàê îíà èñïîëüçóåòñÿ.
Ìû çíàåì, ÷òî ñêàëÿðíûå ïåðåìåííûå ìîæíî èíèöèàëèçèðîâàòü â îïèñàíèè òèïà ïðè ïîìîùè òàêèõ âûðàæåíèé, êàê, íàïðèìåð:
Int fix = 1;
Float flàõ = PI*2;
Ïðè ýòîì ïðåäïîëàãàåòñÿ, ÷òî PI - ðàíåå ââåäåííîå ìàêðîîïðåäåëåíèå. Ìîæåì ëè ìû äåëàòü ÷òî-ëèáî ïîäîáíîå ñ ìàññèâîì? Îòâåò íå îäíîçíà÷åí: è äà, è íåò.
Âíåøíèå è ñòàòè÷åñêèå ìàññèâû ìîæíî èíèöèàëèçèðîâàòü.
Àâòîìàòè÷åñêèå è ðåãèñòðîâûå ìàññèâû èíèöèàëèçèðîâàòü íåëüçÿ.
Ïðåæäå ÷åì ïîïûòàòüñÿ èíèöèàëèçèðîâàòü ìàññèâ, äàâàéòå ïîñìîòðèì, ÷òî òàì íàõîäèòñÿ, åñëè ìû â íåãî íè÷åãî íå çàïèñàëè.
/* ïðîâåðêà ñîäåðæèìîãî ìàññèâà */
Main( ) {
Int fuzzy[2]; /*àâòîìàòè÷åñêèé ìàññèâ */
Static int wuzzy[2]; /* ñòàòè÷åñêèé ìàññèâ */
Printf("%d %d\n", fuzzy[1], wuzzy[1];
}
Ïðîãðàììà íàïå÷àòàåò.
525 0.
Ïîëó÷åííûé ðåçóëüòàò èëëþñòðèðóåò ñëåäóþùåå ïðàâèëî:
Åñëè íè÷åãî íå çàñûëàòü â ìàññèâ ïåðåä íà÷àëîì ðàáîòû ñ íèì, òî âíåøíèå è ñòàòè÷åñêèå ìàññèâû èíèöèàëèçèðóþòñÿ íóëåì, à àâòîìàòè÷åñêèå è ñòàòè÷åñêèå ìàññèâû ñîäåðæàò êàêîé-òî "ìóñîð", îñòàâøèéñÿ â ýòîé ÷àñòÿ ïàìÿòè.
Ïðåêðàñíî! Òåïåðü ìû çíàåì, ÷òî íóæíî ïðåäïðèíÿòü äëÿ îáíóëåíèÿ ñòàòè÷åñêîãî èëè âíåøíåãî ìàññèâà - ïðîñòî íè÷åãî íå äåëàòü. Íî êàê áûòü, åñëè íàì íóæíû íåêîòîðûå çíà÷åíèÿ, îòëè÷íûå îò íóëÿ, íàïðèìåð êîëè÷åñòâî äíåé â êàæäîì ìåñÿöå.  ýòîì ñëó÷àå ìû ìîæåì äåëàòü òàê:
/* äíè ìåñÿöà */
Int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < 12; index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days[index]);
}
Ðåçóëüòàò:
Ìåñÿö 1 èìååò 31 äíåé. Ìåñÿö 2 èìååò 28 äíåé. Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé. Ìåñÿö 5 èìååò 31 äíåé. Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé. Ìåñÿö 8 èìååò 31 äíåé. Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé. Ìåñÿö 11 èìååò 30 äíåé. Ìåñÿö 12 èìååò 31 äíåé.
Ïðîãðàììà íå ñîâñåì êîððåêòíà, ïîñêîëüêó îíà âûäàåò íåïðàâèëüíûé ðåçóëüòàò äëÿ âòîðîãî ìåñÿöà êàæäîãî ÷åòâåðòîãî ãîäà.
Îïðåäåëèâ ìàññèâ days[ ] âíå òåëà ôóíêöèè, ìû òåì ñàìûì ñäåëàëè åãî âíåøíèì. Ìû èíèöèèðîâàëè åãî ñïèñêîì, çàêëþ÷åííûì â ñêîáêè, èñïîëüçóÿ ïðè ýòîì çàïÿòûå äëÿ ðàçäåëåíèÿ ýëåìåíòîâ ñïèñêà.
Êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå äîëæíî ñîîòâåòñòâîâàòü ðàçìåðó ìàññèâà. À ÷òî áóäåò, åñëè ìû îøèáëèñü â ïîäñ÷åòå? Ïîïðîáóéòå ïåðåïèñàòü ïîñëåäíèé ïðèìåð, èñïîëüçóÿ ñïèñîê, êîòîðûé êîðî÷å, ÷åì íóæíî (íà äâà ýëåìåíòà):
/* äíè ìåñÿöà */
Int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < 12; index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days[index]);
}
 ýòîì ñëó÷àå ðåçóëüòàò îêàçûâàåòñÿ èíûì:
Ìåñÿö 1 èìååò 31 äíåé.
Ìåñÿö 2 èìååò 28 äíåé.
Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé.
Ìåñÿö 5 èìååò 31 äíåé.
Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé.
Ìåñÿö 8 èìååò 31 äíåé.
Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé.
Ìåñÿö 11 èìååò 0 äíåé.
Ìåñÿö 12 èìååò 0 äíåé.
Ìîæíî âèäåòü, ÷òî ó êîìïèëÿòîðà íå âîçíèêëî íèêàêèõ ïðîáëåì: ïðîñòî êîãäà îí èñ÷åðïàë âåñü ñïèñîê ñ èñõîäíûìè äàííûìè, òî ñòàë ïðèñâàèâàòü âñåì îñòàëüíûì ýëåìåíòàì ìàññèâà íóëåâûå çíà÷åíèÿ.
Îäíàêî â ñëó÷àå èçëèøíå áîëüøîãî ñïèñêà êîìïèëÿòîð áóäåò óæå íå ñòîëü "âåëèêîäóøåí" ê âàì, ïîñêîëüêó ïîñ÷èòàåò âûÿâëåííóþ èçáûòî÷íîñòü îøèáêîé. Ïîýòîìó íåò íèêàêîé íåîáõîäèìîñòè çàðàíåå ïîäâåðãàòü ñåáÿ "íàñìåøêàì" êîìïèëÿòîðà. Íàäî ïðîñòî âûäåëèòü ìàññèâ, ðàçìåð êîòîðîãî áóäåò äîñòàòî÷åí äëÿ ðàçìåùåíèÿ ñïèñêà:
/* äíè ìåñÿöà */
Int days[ ]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < sizeof days/(sizeof (int)); index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days [index]);
}
Ê ýòîé ïðîãðàììå ñëåäóåò ñäåëàòü äâà ñóùåñòâåííûõ çàìå÷àíèÿ:
Ïåðâîå: åñëè âû èñïîëüçóåòå ïóñòûå ñêîáêè äëÿ èíèöèàëèçàöèè ìàññèâà, òî êîìïèëÿòîð ñàì îïðåäåëèò êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå è âûäåëèò äëÿ íåãî ìàññèâ íóæíîãî ðàçìåðà.
Âòîðîå: îíî êàñàåòñÿ äîáàâëåíèÿ, ñäåëàííîãî ï óïðàâëÿþùåì îïåðàòîðå for. He ïîëàãàÿñü (âïîëíå îáîñíîâàííî) íà ñâîè âû÷èñëèòåëüíûå ñïîñîáíîñòè, ìû âîçëîæèëè çàäà÷ó ïîäñ÷åòà ðàçìåðà ìàññèâà íà êîìïèëÿòîð. Îïåðàòîð sizeof îïðåäåëÿåò ðàçìåð â áàéòàõ îáúåêòà èëè òèïà, ñëåäóþùåãî çà íèì. (Ìû. óæå óïîìèíàëè îá ýòîì â ãë. 3.)  íàøåé âû÷èñëèòåëüíîé ñèñòåìå ðàçìåð êàæäîãî ýëåìåíòà òèïà int ðàâåí äâóì áàéòàì, ïîýòîìó äëÿ ïîëó÷åíèÿ êîëè÷åñòâà ýëåìåíòîâ ìàññèâà ìû äåëèì îáùåå ÷èñëî áàéòîâ, çàíèìàåìîå ìàññèâîì, íà 2. Îäíàêî â äðóãèõ ñèñòåìàõ ýëåìåíò òèïà int ìîæåò èìåòü èíîé ðàçìåð. Ïîýòîìó â îáùåì ñëó÷àå âûïîëíÿåòñÿ äåëåíèå íà çíà÷åíèå ïåðåìåííîé sizeof (äëÿ ýëåìåíòà òèïà int). Íèæå ïðèâåäåíû ðåçóëüòàòû ðàáîòû íàøåé ïðîãðàììû:
Ìåñÿö 1 èìååò 31 äíåé.
Ìåñÿö 2 èìååò 28 äíåé.
Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé.
Ìåñÿö 5 èìååò 31 äíåé.
Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé.
Ìåñÿö 8 èìååò 31 äíåé.
Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé.
Íó âîò, òåïåðü ìû ïîëó÷àåì òî÷íî 10 çíà÷åíèé. Íàø ìåòîä, ïîçâîëÿþùèé ïðîãðàììå ñàìîé íàõîäèòü ðàçìåð ìàññèâà, íå ïîçâîëèë íàì íàïå÷àòàòü êîíåö ìàññèâà.
Ñóùåñòâóåò è áîëåå êîðîòêèé ñïîñîá èíèöèàëèçàöèè ìàññèâîâ, íî ïîñêîëüêó îí ïðèìåíèì òîëüêî ê ñèìâîëüíûì ñòðîêàì, ìû ðàññìîòðèì åãî â ñëåäóþùåé ãëàâå.
 çàêëþ÷åíèå ìû ïîêàæåì, ÷òî ìîæíî ïðèñâàèâàòü çíà÷åíèÿ ýëåìåíòàì ìàññèâà, îòíîñÿùåãîñÿ ê ëþáîìó êëàññó ïàìÿòè. Íàïðèìåð, â ïðèâåäåííîì íèæå ôðàãìåíòå ïðîãðàììû ïðèñâàèâàþòñÿ ÷åòíûå ÷èñëà ýëåìåíòàì àâòîìàòè÷åñêîãî ìàññèâà:
/* ïðèñâàèâàíèå çíà÷åíèé ìàññèâó */
Main( ).
{
Int counter, evens [50];
For(counter = 0; counter < 50; counter++).
Evens[counter] = 2 * counter;
...
}
ÓÊÀÇÀÒÅËÈ ÌÀÑÑÈÂÎÂ.
Êàê áûëî ñêàçàíî â ãë. 9, óêàçàòåëè ïîçâîëÿþò íàì ðàáîòàòü ñ ñèìâîëè÷åñêèìè àäðåñàìè. Ïîñêîëüêó â ðåàëèçóåìûõ àïïàðàòíî êîìàíäàõ âû÷èñëèòåëüíîé ìàøèíû èíòåíñèâíî èñïîëüçóþòñÿ àäðåñà, óêàçàòåëè ïðåäîñòàâëÿþò âîçìîæíîñòü ïðèìåíÿòü àäðåñà ïðèìåðíî òàê, êàê ýòî äåëàåòñÿ â ñàìîé ìàøèíå, è òåì ñàìûì ïîâûøàòü ýôôåêòèâíîñòü ïðîãðàìì.  ÷àñòíîñòè, óêàçàòåëè ïîçâîëÿþò ýôôåêòèâíî îðãàíèçîâàòü ðàáîòó ñ ìàññèâàìè. Äåéñòâèòåëüíî, êàê ìû ìîãëè óáåäèòüñÿ, íàøå îáîçíà÷åíèå ìàññèâà ïðåäñòàâëÿåò ñîáîé ïðîñòî ñêðûòóþ ôîðìó èñïîëüçîâàíèÿ óêàçàòåëåé.
Íàïðèìåð, èìÿ ìàññèâà îïðåäåëÿåò òàêæå åãî ïåðâûé ýëåìåíò, ò. å. åñëè flizny[] - ìàññèâ, òî.
Flizny == &flizny[0].
È îáå ÷àñòè ðàâåíñòâà îïðåäåëÿþò àäðåñ ïåðâîãî ýëåìåíòà ìàññèâà. (Âñïîìíèì, ÷òî îïåðàöèÿ & âûäàåò àäðåñ.) Îáà îáîçíà÷åíèÿ ÿâëÿþòñÿ êîíñòàíòàìè òèïà óêàçàòåëü, ïîñêîëüêó îíè íå èçìåíÿþòñÿ íà ïðîòÿæåíèè âñåé ïðîãðàììû. Îäíàêî èõ ìîæíî ïðèñâàèâàòü (êàê çíà÷åíèÿ) ïåðåìåííîé òèïà óêàçàòåëü è èçìåíÿòü çíà÷åíèå ïåðåìåííîé, êàê ïîêàçàíî â íèæå ñëåäóþùåì ïðèìåðå. Ïîñìîòðèòå, ÷òî ïðîèñõîäèò ñî çíà÷åíèåì óêàçàòåëÿ, åñëè ê íåìó ïðèáàâèòü ÷èñëî.
/* ïðèáàâëåíèå ê óêàçàòåëþ */
Main( ).
{
Int dates[4], *pti, index;
Float bills [4], *ptf;
Pti = dates; /* ïðèñâàèâàåò àäðåñ óêàçàòåëþ ìàññèâà */
Ptf = bills;
For(index = 0; index < 4; index++).
Printf(" óêàçàòåëè + %d: %10 u %10u \n", index, pti + index, ptf + index);
}
Âîò ðåçóëüòàò:
Óêàçàòåëè + 0 56014 56026.
Óêàçàòåëè + 1 56016 56030.
Óêàçàòåëè + 2 56018 56034.
Óêàçàòåëè + 3 56020 56038.
Ïåðâàÿ íàïå÷àòàííàÿ ñòðîêà ñîäåðæèò íà÷àëüíûå àäðåñà äâóõ ìàññèâîâ, à ñëåäóþùàÿ ñòðîêà - ðåçóëüòàò ïðèáàâëåíèÿ åäèíèöû ê àäðåñó è ò. ä. Ïî÷åìó òàê ïîëó÷àåòñÿ?
56014 + 1 = 56016? 56026 + 1 = 56030?
Íå çíàåòå, ÷òî ñêàçàòü?  íàøåé ñèñòåìå åäèíèöåé àäðåñàöèè ÿâëÿåòñÿ áàéò, íî òèï int èñïîëüçóåò äâà áàéòà, à òèï float - ÷åòûðå. ×òî ïðîèçîéäåò, åñëè âû ñêàæåòå: "ïðèáàâèòü åäèíèöó ê óêàçàòåëþ?" Êîìïèëÿòîð ÿçûêà Ñè äîáàâèò åäèíèöó ïàìÿòè. Äëÿ ìàññèâîâ ýòî îçíà÷àåò, ÷òî ìû ïåðåéäåì ê àäðåñó ñëåäóþùåãî ýëåìåíòà, à íå ñëåäóþùåãî áàéòà. Âîò ïî÷åìó ìû äîëæíû ñïåöèàëüíî îãîâàðèâàòü òèï îáúåêòà, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü; îäíîãî àäðåñà çäåñü íåäîñòàòî÷íî, òàê êàê ìàøèíà äîëæíà çíàòü, ñêîëüêî áàéòîâ ïîòðåáóåòñÿ äëÿ çàïîìèíàíèÿ îáúåêòà. (Ýòî ñïðàâåäëèâî òàêæå äëÿ óêàçàòåëåé íà ñêàëÿðíûå ïåðåìåííûå; èíûìè ñëîâàìè, ïðè ïîìîùè îïåðàöèè *pt íåëüçÿ ïîëó÷èòü çíà÷åíèå.).

ÐÈÑ. 12.1. Óâåëè÷åíèå óêàçàòåëÿ ìàññèâà.
Áëàãîäàðÿ òîìó ÷òî êîìïèëÿòîð ÿçûêà Ñè óìååò ýòî äåëàòü, ìû èìååì ñëåäóþùèå ðàâåíñòâà:
Dates + 2 == &dates[2] /* îäèí è òîò æå àäðåñ */
*(dates + 2) == dates[2] /* îäíî è òî æå çíà÷åíèå */
Ýòè ñîîòíîøåíèÿ ñóììèðóþò òåñíóþ ñâÿçü ìåæäó ìàññèâàìè è óêàçàòåëÿìè. Îíè ïîêàçûâàþò, ÷òî ìîæíî èñïîëüçîâàòü óêàçàòåëü äëÿ îïðåäåëåíèÿ îòäåëüíîãî ýëåìåíòà ìàññèâà, à òàêæå äëÿ ïîëó÷åíèÿ åãî çíà÷åíèÿ. Ïî ñóùåñòâó ìû èìååì äâà ðàçëè÷íûõ îáîçíà÷åíèÿ äëÿ îäíîãî è òîãî æå. Äåéñòâèòåëüíî, êîìïèëÿòîð ïðåâðàùàåò îáîçíà÷åíèå ìàññèâà â óêàçàòåëè, ïîýòîìó ìåòîä óêàçàòåëåé áîëåå ïðåäïî÷òèòåëåí.
Ìåæäó ïðî÷èì, ïîñòàðàéòåñü ðàçëè÷àòü âûðàæåíèÿ *(dates + 2), è *dates + 2. Îïåðàöèÿ (*) èìååò áîëåå âûñîêèé ïðèîðèòåò, ÷åì +, ïîýòîìó ïîñëåäíåå âûðàæåíèå îçíà÷àåò.
(*dates) + 2:
*(dates + 2) /* çíà÷åíèå 3-ãî ýëåìåíòà ìàññèâà dates */
*dates +2 /* 2 äîáàâëÿåòñÿ ê çíà÷åíèþ 1-ãî ýëåìåíòà ìàññèâà */
Ñâÿçü ìåæäó ìàññèâàìè è óêàçàòåëÿìè ÷àñòî ïîçâîëÿåò íàì ïðèìåíÿòü îáà ïîäõîäà ïðè ñîçäàíèè ïðîãðàìì. Îäíèì èç ïðèìåðîâ ýòîãî ÿâëÿåòñÿ ôóíêöèÿ ñ ìàññèâîì â êà÷åñòâå àðãóìåíòà.
ÔÓÍÊÖÈÈ, ÌÀÑÑÈÂÛ È ÓÊÀÇÀÒÅËÈ.
Ìàññèâû ìîæíî èñïîëüçîâàòü â ïðîãðàììå äâîÿêî. Âî-ïåðâûõ, èõ ìîæíî îïèñàòü â òåëå ôóíêöèè. Âî-âòîðûõ, îíè ìîãóò áûòü àðãóìåíòàìè ôóíêöèè. Âåñ, ÷òî áûëî ñêàçàíî â ýòîé ãëàâå î ìàññèâàõ, îòíîñèòñÿ ê ïåðâîìó èõ ïðèìåíåíèþ; òåïåðü ðàññìîòðèì ìàññèâû â êà÷åñòâå àðãóìåíòîâ.
Îá ýòîì óæå ãîâîðèëîñü â ãë. 10. Ñåé÷àñ, êîãäà ìû ïîçíàêîìèëèñü ñ óêàçàòåëÿìè, ìîæíî çàíÿòüñÿ áîëåå ãëóáîêèì èçó÷åíèåì ìàññèâîâ-àðãóìåíòîâ. Äàâàéòå ïðîàíàëèçèðóåì ñêåëåò ïðîãðàììû, îáðàùàÿ âíèìàíèå íà îïèñàíèÿ:
/* ìàññèâ-àðãóìåíò */
Main( ).
{
Int ages[50]; /* ìàññèâ èç 50 ýëåìåíòîâ */
Convert(ages);
...
}
Convert (years);
Int years [ ]; /* êàêîâ ðàçìåð ìàññèâà? */
{
...
}
Î÷åâèäíî, ÷òî ìàññèâ ages ñîñòîèò èç 50 ýëåìåíòîâ. À ÷òî ìîæíî ñêàçàòü î ìàññèâå years? Îêàçûâàåòñÿ, â ïðîãðàììå íåò òàêîãî ìàññèâà. Îïèñàòåëü.
Int years[ ];
Ñîçäàåò íå ìàññèâ, à óêàçàòåëü íà íåãî. Ïîñìîòðèì, ïî÷åìó ýòî òàê.
Âîò âûçîâ íàøåé ôóíêöèè:
Convert(ages);
Ages - àðãóìåíò ôóíêöèè convert. Âû ïîìíèòå, ÷òî èìÿ ages ÿâëÿåòñÿ óêàçàòåëåì íà ïåðâûé ýëåìåíò ìàññèâà, ñîñòîÿùåãî èç 50 ýëåìåíòîâ. Òàêèì îáðàçîì, îïåðàòîð âûçîâà ôóíêöèè ïåðåäàåò åé óêàçàòåëü, ò. å. àäðåñ ôóíêöèè convert(). Ýòî çíà÷èò, ÷òî àðãóìåíò ôóíêöèè ÿâëÿåòñÿ óêàçàòåëåì, è ìû ìîæåì íàïèñàòü ôóíêöèþ convert() ñëåäóþùèì îáðàçîì:
Convert (years);
Int *years;
{
}
Äåéñòâèòåëüíî, îïåðàòîðû.
Int years[ ];
Int *years;
Ñèíîíèìû. Îáà îíè îáúÿâëÿþò ïåðåìåííóþ years óêàçàòåëåì ìàññèâà öåëûõ ÷èñåë. Îäíàêî ãëàâíîå èõ îòëè÷èå ñîñòîèò â òîì, ÷òî ïåðâûé èç íèõ íàïîìèíàåò íàì, ÷òî óêàçàòåëü years ññûëàåòñÿ íà ìàññèâ.
Êàê òåïåðü ñâÿçàòü åãî ñ ìàññèâîì ages? Âñïîìíèì, ÷òî ïðè èñïîëüçîâàíèè óêàçàòåëÿ â êà÷åñòâå àðãóìåíòà, ôóíêöèÿ âçàèìîäåéñòâóåò ñ ñîîòâåòñòâóþùåé ïåðåìåííîé â âûçûâàþùåé ïðîãðàììå, ò. å. îïåðàòîðû, èñïîëüçóþùèå óêàçàòåëü years â ôóíêöèè ñînvårt(), ôàêòè÷åñêè ðàáîòàþò ñ ìàññèâîì ages, íàõîäÿùèìñÿ â òåëå ôóíêöèè main().
Ïîñìîòðèì, êàê ðàáîòàåò ýòîò ìåõàíèçì. Âî-ïåðâûõ, âûçîâ ôóíêöèè èíèöèàëèçèðóåò óêàçàòåëü years, ññûëàÿñü íà ages[0]. Òåïåðü ïðåäïîëîæèì, ÷òî ãäå-òî âíóòðè ôóíêöèè convert( ) åñòü âûðàæåíèå years[3]. Êàê âû âèäåëè â ïðåäûäóùåì ðàçäåëå, îíî àíàëîãè÷íî *(years + 3). Îäíàêî åñëè years óêàçûâàåò íà ages[0], òî years+3 ññûëàåòñÿ íà ages[3]. Ýòî ïðèâîäèò ê òîìó, ÷òî *(years+3) îçíà÷àåò ages[3]. Åñëè âíèìàòåëüíî ïðîñëåäèòü äàííóþ öåïî÷êó, òî ìû óâèäèì, ÷òî years[3] àíàëîãè÷íî *(years + 3), êîòîðîå â ñâîþ î÷åðåäü ñîâïàäàåò ñ ages[3]. ×òî è òðåáîâàëîñü äîêàçàòü, ò. å. îïåðàöèè íàä óêàçàòåëåì years ïðèâîäÿò ê òåì æå ðåçóëüòàòàì, ÷òî è îïåðàöèè íàä ìàññèâîì ages.
Êîðî÷å ãîâîðÿ, êîãäà èìÿ ìàññèâà ïðèìåíÿåòñÿ â êà÷åñòâå àðãóìåíòà, ôóíêöèè ïåðåäàåòñÿ óêàçàòåëü. Çàòåì ôóíêöèÿ èñïîëüçóåò ýòîò óêàçàòåëü äëÿ âûïîëíåíèÿ èçìåíåíèé â èñõîäíîì ìàññèâå, ïðèíàäëåæàùåì ïðîãðàììå, âûçâàâøåé ôóíêöèþ. Ðàññìîòðèì ïðèìåð.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÓÊÀÇÀÒÅËÅÉ ÏÐÈ ÐÀÁÎÒÅ Ñ ÌÀÑÑÈÂÀÌÈ.
Ïîïðîáóåì íàïèñàòü ôóíêöèþ, èñïîëüçóþùóþ ìàññèâû, à çàòåì ïåðåïèøåì åå, ïðèìåíÿÿ óêàçàòåëè.
Ðàññìîòðèì ïðîñòóþ ôóíêöèþ, êîòîðàÿ íàõîäèò (èëè ïûòàåòñÿ íàéòè) ñðåäíåå çíà÷åíèå ìàññèâà öåëûõ ÷èñåë. Íà âõîäå ôóíêöèè ìû èìååì èìÿ ìàññèâà è êîëè÷åñòâî ýëåìåíòîâ. Íà âûõîäå ïîëó÷àåì ñðåäíåå çíà÷åíèå, êîòîðîå ïåðåäàñòñÿ ïðè ïîìîùè îïåðàòîðà return. Îïåðàòîð âûçîâà ôóíêöèè ìîæåò âûãëÿäåòü ñëåäóþùèì îáðàçîì:
Printf("Ñðåäíåå èç çàäàííûõ çíà÷åíèé %d.\n", mean(numbs,size));
/* íàõîäèò ñðåäíåå çíà÷åíèå ìàññèâà èç n öåëûõ ÷èñåë */
Int mean(array, n);
Int array[ ], n;
{
Int index;
Long sum; /* Åñëè öåëûõ ñëèøêîì ìíîãî, èõ ìîæíî.
ñóììèðîâàòü â ôîðìàòå long int */
If(n > 0).
{
For(index = 0, sum = 0; index < n; index++).
sum + = array[index];
Return((int)(sum/n)); /* âîçâðàùàåò int * / }.
Else {
Printf("Íåò ìàññèâà. \n");
Return(0); }.
}
Ýòó ïðîãðàììó ëåãêî ïåðåäåëàòü, ïðèìåíÿÿ óêàçàòåëè. Îáúÿâèì ðà óêàçàòåëåì íà òèï int. Çàòåì çàìåíèì ýëåìåíò ìàññèâà array[index] íà ñîîòâåòñòâóþùåå çíà÷åíèå: *(ðà + index).
/* Èñïîëüçîâàíèå óêàçàòåëåé äëÿ íàõîæäåíèÿ.
ñðåäíåãî çíà÷åíèÿ ìàññèâà n öåëûõ ÷èñåë */
Int mean(pa, n) int îðà, n;
{
Int index;
Long sum; /*Åñëè öåëûõ ñëèøêîì ìíîãî,
èõ ìîæíî ñóììèðîâàòü â ôîðìàòå long int */
If(n > 0).
{
For(index=0, sum=0; index < n; index++).
Sum + = *(pa + index);
Return((int)(sum/n)); /* Âîçâðàùàåò öåëîå */ }.
Else {
Printf("Íåò ìàññèâà.\n");
Return(0); }.
}
Ýòî îêàçàëîñü íåñëîæíûì, íî âîçíèêàåò âîïðîñ: äîëæíû ëè ìû èçìåíèòü ïðè ýòîì âûçîâ ôóíêöèè, â ÷àñòíîñòè numbs, êîòîðûé áûë èìåíåì ìàññèâà â îïåðàòîðå mean(numbs, size)? Íè÷åãî íå íóæíî ìåíÿòü, ïîñêîëüêó èìÿ ìàññèâà ÿâëÿåòñÿ óêàçàòåëåì. Êàê ìû óæå ãîâîðèëè â ïðåäûäóùåì ðàçäåëå, îïåðàòîðû îïèñàíèÿ:
Int ðà[ ];
È.
Int *ðà;
Èäåíòè÷íû ïî äåéñòâèþ: îáà îáúÿâëÿþò ðà óêàçàòåëåì.  ïðîãðàììå ìîæíî ïðèìåíÿòü ëþáîé èç íèõ, õîòÿ äî ñèõ ïîð ìû èñïîëüçîâàëè âòîðîé â âèäå *(ðà + index).
Ïîíÿòíî ëè âàì, êàê ðàáîòàòü ñ óêàçàòåëÿìè? Óêàçàòåëü óñòàíàâëèâàåòñÿ íà ïåðâûé ýëåìåíò ìàññèâà, è çíà÷åíèå, íàõîäÿùååñÿ òàì, äîáàâëÿåòñÿ â sum. Çàòåì óêàçàòåëü ïåðåäâèãàåòñÿ íà ñëåäóþùèé ýëåìåíò (ê óêàçàòåëþ ïðèáàâëÿåòñÿ åäèíèöà), è çíà÷åíèå, íàõîäÿùååñÿ â íåì, òàêæå ïðèáàâëÿåòñÿ ê sum è ò. ä. Ýòî ïîõîæå íà ìåõàíèçì ðàáîòû ñ ìàññèâîì, ãäå èíäåêñ äåéñòâóåò êàê ñòðåëêà ÷àñîâ, ïîêàçûâàþùàÿ ïî î÷åðåäè íà êàæäûé ýëåìåíò ìàññèâà.
Òåïåðü ó íàñ åñòü äâà ïîäõîäà; êàêîé æå èç íèõ âûáðàòü? Âî-ïåðâûõ, õîòÿ ìàññèâû è óêàçàòåëè òåñíî ñâÿçàíû, ó íèõ åñòü îòëè÷èÿ. Óêàçàòåëè ÿâëÿþòñÿ áîëåå îáùèì è øèðîêî ïðèìåíÿåìûì ñðåäñòâîì, îäíàêî ìíîãèå ïîëüçîâàòåëè (ïî êðàéíåé ìåðå íà÷èíàþùèå) ñ÷èòàþò, ÷òî ìàññèâû áîëåå ïðèâû÷íû ê ïîíÿòíû. Âî-âòîðûõ, ïðè èñïîëüçîâàíèè óêàçàòåëåé ó íàñ íåò ïðîñòîãî ýêâèâàëåíòà äëÿ çàäàíèÿ ðàçìåðà ìàññèâà. Ñàìóþ òèïè÷íóþ ñèòóàöèþ, â êîòîðîé ìîæíî ïðèìåíÿòü óêàçàòåëü, ìû óæå ïîêàçàëè: ýòî ôóíêöèÿ, ðàáîòàþùàÿ ñ ìàññèâîì, êîòîðûé íàõîäèòñÿ ãäå-òî â äðóãîé ÷àñòè ïðîãðàììû. Ìû ïðåäëàãàåì èñïîëüçîâàâ ëþáîé èç ïîäõîäîâ ïî âàøåìó æåëàíèþ. Îäíàêî íåñîìíåííîå ïðåèìóùåñòâî èñïîëüçîâàíèÿ óêàçàòåëåé â ïðèâåäåííîì âûøå ïðèìåðå äîëæíî íàó÷èòü âàñ ëåãêî ïðèìåíÿòü èõ, êîãäà â ýòîì âîçíèêàåò íåîáõîäèìîñòü.
ÎÏÅÐÀÖÈÈ Ñ ÓÊÀÇÀÒÅËßÌÈ
×òî æå ìû òåïåðü óìååì äåëàòü ñ óêàçàòåëÿìè? ßçûê Ñè ïðåäëàãàåò ïÿòü îñíîâíûõ îïåðàöèé, êîòîðûå ìîæíî ïðèìåíÿòü ê óêàçàòåëÿì, à íèæåñëåäóþùàÿ ïðîãðàììà äåìîíñòðèðóåò ýòè âîçìîæíîñòè. ×òîáû ïîêàçàòü ðåçóëüòàòû êàæäîé îïåðàöèè, ìû áóäåì ïå÷àòàòü çíà÷åíèå óêàçàòåëÿ (ÿâëÿþùåãîñÿ àäðåñîì, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü), çíà÷åíèå, íàõîäÿùååñÿ ïî ýòîìó àäðåñó, è àäðåñ ñàìîãî óêàçàòåëÿ.
/* îïåðàöèè ñ óêàçàòåëÿìè */
#define PR(X).
Printf("X = %u,*X = %d, &X = %u\n",X, *X,&X);
/* ïå÷àòàåò çíà÷åíèå óêàçàòåëÿ (àäðåñ),
çíà÷åíèå, íàõîäÿùååñÿ ïî */
/* ýòîìó àäðåñó, è àäðåñ ñàìîãî óêàçàòåëÿ */
Main( ).
Static int urn[ ] = [100, 200, 300];
Int *ptrl, *ptr2;
{
Ptrl = urn; /* ïðèñâàèâàåò àäðåñ óêàçàòåëþ */
Ptr2 = &urn [2]; /* òî æå ñàìîå */
PR(ptrl); /* ñì. ìàêðîîïðåäåëåíèå, óêàçàííîå âûøå */
Ptrl++; /* óâåëè÷åíèå óêàçàòåëÿ */
PR(ptrl);
PR(ptr2);
++ðtr2; /* âûõîäèò çà êîíåö ìàññèâà */
PR(ptr2);
Printf("ptr2 - ptrl = %u\n", ptr2 - ptrl);
}
 ðåçóëüòàòå ðàáîòû ïðîãðàììû ïîëó÷åíû ñëåäóþùèå ðåçóëüòàòû:
Ptrl = 18, *ptrl = 100, &ptrl = 55990.
Ptrl = 20, *ptrl = 200, &ptrl = 55990.
Ptr2 =22, *ptr2 = 300, &ptr2 = 55992.
Ptr2 =24, *ptr2 = 29808, &ptr2 = 55992.
Ptr2 - ptrl = 2.
Ïðîãðàììà äåìîíñòðèðóåò ïÿòü îñíîâíûõ îïåðàöèé, êîòîðûå ìîæíî âûïîëíÿòü íàä ïåðåìåííûìè òèïà óêàçàòåëü.
1. ÏÐÈÑÂÀÈÂÀÍÈÅ. Óêàçàòåëþ ìîæíî ïðèñâîèòü àäðåñ. Îáû÷íî ìû âûïîëíÿåì ýòî äåéñòâèå, èñïîëüçóÿ èìÿ ìàññèâà èëè îïåðàöèþ ïîëó÷åíèÿ àäðåñà (&). Ïðîãðàììà ïðèñâàèâàåò ïåðåìåííîé ptrl àäðåñ íà÷àëà ìàññèâà urn; ýòîò àäðåñ ïðèíàäëåæèò ÿ÷åéêå ïàìÿòè ñ íîìåðîì 18. ( íàøåé ñèñòåìå ñòàòè÷åñêèå ïåðåìåííûå çàïîìèíàþòñÿ â ÿ÷åéêàõ îïåðàòèâíîé ïàìÿòè.) Ïåðåìåííàÿ ptr2 ïîëó÷àåò àäðåñ òðåòüåãî è ïîñëåäíåãî ýëåìåíòà ìàññèâà, ò. å. urn[2].

2. ÎÏÐÅÄÅËÅÍÈÅ ÇÍÀ×ÅÍÈß. Îïåðàöèÿ âûäàåò çíà÷åíèå, õðàíÿùååñÿ â óêàçàííîé ÿ÷åéêå. Ïîýòîìó ðåçóëüòàòîì îïåðàöèè *ptrl â ñàìîì íà÷àëå ðàáîòû ïðîãðàììû ÿâëÿåòñÿ ÷èñëî 100, íàõîäÿùååñÿ â ÿ÷åéêå ñ íîìåðîì 18.
3. ÏÎËÓ×ÅÍÈÅ ÀÄÐÅÑÀ ÓÊÀÇÀÒÅËß. Ïîäîáíî ëþáûì ïåðåìåííûì ïåðåìåííàÿ òèïà óêàçàòåëü èìååò àäðåñ è çíà÷åíèå. Îïåðàöèÿ & ñîîáùàåò íàì, ãäå íàõîäèòñÿ ñàì óêàçàòåëü.  íàøåì ïðèìåðå óêàçàòåëü ptrl íàõîäèòñÿ â ÿ÷åéêå ñ íîìåðîì 55990. Ýòà ÿ÷åéêà ñîäåðæèò ÷èñëî 18, ÿâëÿþùååñÿ àäðåñîì íà÷àëà ìàññèâà urn.
4. ÓÂÅËÈ×ÅÍÈÅ ÓÊÀÇÀÒÅËß. Ìû ìîæåì âûïîëíÿòü ýòî äåéñòâèå ñ ïîìîùüþ îáû÷íîé îïåðàöèè ñëîæåíèÿ ëèáî ñ ïîìîùüþ îïåðàöèè óâåëè÷åíèÿ. Óâåëè÷èâàÿ óêàçàòåëü, ìû ïåðåìåùàåì åãî íà ñëåäóþùèé ýëåìåíò ìàññèâà. Ïîýòîìó îïåðàöèÿ ptr1++ óâåëè÷èâàåò ÷èñëîâîå çíà÷åíèå ïåðåìåííîé ptrl íà 2 (äâà áàéòà íà êàæäûé ýëåìåíò ìàññèâà öåëûõ ÷èñåë), ïîñëå ÷åãî óêàçàòåëü ptrl ññûëàåòñÿ óæå íà urn[l] (ðèñ. 12.2). Òåïåðü ptrl èìååò çíà÷åíèå 20 (àäðåñ ñëåäóþùåãî ýëåìåíòà ìàññèâà), à îïåðàöèÿ *ptrl âûäàåò ÷èñëî 200, ÿâëÿþùååñÿ çíà÷åíèåì ýëåìåíòà urn[1]. Çàìåòèì, ÷òî àäðåñ ñàìîé ÿ÷åéêè ptrl îñòàåòñÿ íåèçìåííûì, ò.å. 55990. Ïîñëå âûïîëíåíèÿ îïåðàöèè ñàìà ïåðåìåííàÿ íå ïåðåìåñòèëàñü, ïîòîìó ÷òî îíà òîëüêî èçìåíèëà çíà÷åíèå!

ÐÈÑ. 12.2. Óâåëè÷åíèå óêàçàòåëÿ òèïà int.
Àíàëîãè÷íûì îáðàçîì ìîæíî è óìåíüøèòü óêàçàòåëü. Îäíàêî ïðè ýòîì ñëåäóåò ñîáëþäàòü îñòîðîæíîñòü. Ìàøèíà íå ñëåäèò, ññûëàåòñÿ ëè åùå óêàçàòåëü íà ìàññèâ èëè óæå íåò. Îïåðàöèÿ ++ptr2 ïåðåìåùàåò óêàçàòåëü ptr2 íà ñëåäóþùèå äâà áàéòà, è òåïåðü îí ññûëàåòñÿ íà íåêîòîðóþ èíôîðìàöèþ, ðàñïîëîæåííóþ â ïàìÿòè çà ìàññèâîì.
Êðîìå òîãî, îïåðàòîð óâåëè÷åíèÿ ìîæíî èñïîëüçîâàòü äëÿ ïåðåìåííîé òèïà óêàçàòåëü, íî íå äëÿ êîíñòàíò ýòîãî òèïà ïîäîáíî òîìó, êàê âû íå ìîæåòå ïðèìåíÿòü îïåðàòîð óâåëè÷åíèÿ äëÿ îáû÷íûõ êîíñòàíò. Äëÿ ïåðåìåííûõ è êîíñòàíò òèïà óêàçàòåëü ìîæíî èñïîëüçîâàòü ïðîñòîå ñëîæåíèå:
| Ïðàâèëüíî | Íåïðàâèëüíî |
|---|---|
| ptr1++; | urn ++; |
| õ ++; | 3++; |
| ptr2 = ptr1 + 2; | ptr2 = urn++; |
| ptr2 = urn + 1; | õ = ó + 3++; |
5. ÐÀÇÍÎÑÒÜ. Ìîæíî íàõîäèòü ðàçíîñòü äâóõ óêàçàòåëåé. Îáû÷íî ýòî äåëàåòñÿ äëÿ óêàçàòåëåé, ññûëàþùèõñÿ íà ýëåìåíòû îäíîãî è òîãî æå ìàññèâà, ÷òîáû îïðåäåëèòü, íà êàêîì ðàññòîÿíèè äðóã îò äðóãà íàõîäÿòñÿ ýëåìåíòû. Ïîìíèòå, ÷òî ðåçóëüòàò èìååò òîò æå òèï, ÷òî è ïåðåìåííàÿ, ñîäåðæàùàÿ ðàçìåð ìàññèâà.
Ïåðå÷èñëåííûå âûøå îïåðàöèè îòêðûâàþò áîëüøèå âîçìîæíîñòè. Ïðîãðàììèñòû íà ÿçûêå Ñè ñîçäàþò ìàññèâû óêàçàòåëåé, óêàçàòåëè íà ôóíêöèè, ìàññèâû óêàçàòåëåé íà óêàçàòåëè, ìàññèâû óêàçàòåëåé íà ôóíêöèè è ò. ä. Ìû áóäåì ïðèäåðæèâàòüñÿ îñíîâíûõ ïðèìåíåíèé, êîòîðûå óæå óïîìèíàëèñü. Ïåðâîå èç íèõ - ïåðåäà÷à èíôîðìàöèè â ôóíêöèþ è èç íåå. Ìû èñïîëüçîâàëè óêàçàòåëè, êîãäà õîòåëè, ÷òîáû ôóíêöèÿ èçìåíèëà ïåðåìåííûå, íàõîäÿùèåñÿ â âûçûâàþùåé ïðîãðàììå. Âòîðîå - èñïîëüçîâàíèå óêàçàòåëåé â ôóíêöèÿõ, ðàáîòàþùèõ ñ ìíîãîìåðíûìè ìàññèâàìè.
ÌÍÎÃÎÌÅÐÍÛÅ ÌÀÑÑÈÂÛ.
Òåìïåñò Êëàóä, ìåòåîðîëîã, çàíèìàþùàÿñÿ ÿâëåíèåì ïåðèñòî-ñòè îáëàêîâ, õî÷åò ïðîàíàëèçèðîâàòü äàííûå î åæåìåñÿ÷íîì êîëè÷åñòâå îñàäêîâ íà ïðîòÿæåíèè ïÿòè ëåò.  ñàìîì íà÷àëå îíà äîëæíà ðåøèòü, êàê ïðåäñòàâëÿòü äàííûå. Ìîæíî èñïîëüçîâàòü 60 ïåðåìåííûõ, ïî îäíîé íà êàæäûé ìåñÿö. (Ìû óæå óïîìèíàëè î òàêîì ïîäõîäå ðàíåå, íî â äàííîì ñëó÷àå îí òàêæå íåóäà÷åí.) Ëó÷øå áûëî áû âçÿòü ìàññèâ, ñîñòîÿùèé èç 60 ýëåìåíòîâ, íî ýòî óñòðîèëî áû íàñ òîëüêî äî òåõ ïîð, ïîêà ìîæíî õðàíèòü ðàçäåëüíî äàííûå çà êàæäûé ãîä. Ìû ìîãëè áû òàêæå èñïîëüçîâàòü 5 ìàññèâîâ ïî 12 ýëåìåíòîâ êàæäûé, íî ýòî î÷åíü ïðèìèòèâíî è ìîæåò ñîçäàòü äåéñòâèòåëüíî áîëüøèå íåóäîáñòâà, åñëè Òåìíååò ðåøèò èçó÷àòü äàííûå î êîëè÷åñòâå îñàäêîâ çà 50 ëåò âìåñòî ïÿòè. Íóæíî ïðèäóìàòü ÷òî-íèáóäü ïîëó÷øå.
Õîðîøî áûëî áû èñïîëüçîâàòü ìàññèâ ìàññèâîâ. Îñíîâíîé ìàññèâ ñîñòîÿë áû òîãäà èç 5 ýëåìåíòîâ, êàæäûé èç êîòîðûõ â ñâîþ î÷åðåäü áûë áû ìàññèâîì èç 12 ýëåìåíòîâ. Âîò êàê ýòî çàïèñûâàåòñÿ:
Static float rain[5][12];
Ìîæíî òàêæå ïðåäñòàâèòü ìàññèâ rain â âèäå äâóìåðíîãî ìàññèâà, ñîñòîÿùåãî èç 5 ñòðîê è 12 ñòîëáöîâ.
Ïðè èçìåíåíèè âòîðîãî èíäåêñà íà åäèíèöó ìû ïåðåäâèãàåìñÿ âäîëü ñòðîêè, à ïðè èçìåíåíèè ïåðâîãî èíäåêñà íà åäèíèöó, ïåðåäâèãàåìñÿ âåðòèêàëüíî âäîëü ñòîëáöà. Â íàøåì ïðèìåðå âòîðîé èíäåêñ äàåò íàì ìåñÿöû, à ïåðâûé - ãîäû.

ÐÈÑ. 12.3. Äâóìåðíûé ìàññèâ.
Èñïîëüçóåì ýòîò äâóìåðíûé ìàññèâ â ìåòåîðîëîãè÷åñêîé ïðîãðàììå. Öåëü íàøåé ïðîãðàììû - íàéòè îáùåå êîëè÷åñòâî îñàäêîâ äëÿ êàæäîãî ãîäà, ñðåäíåãîäîâîå êîëè÷åñòâî îñàäêîâ è ñðåäíåå êîëè÷åñòâî îñàäêîâ çà êàæäûé ìåñÿö. Äëÿ ïîëó÷åíèÿ îáùåãî êîëè÷åñòâà îñàäêîâ çà ãîä ñëåäóåò ñëîæèòü âñå äàííûå, íàõîäÿùèåñÿ â íóæíîé ñòðîêå. ×òîáû íàéòè ñðåäíåå êîëè÷åñòâî îñàäêîâ çà äàííûé ìåñÿö, ìû ñíà÷àëà ñêëàäûâàåì âñå äàííûå â óêàçàííîì ñòîëáöå. Äâóìåðíûé ìàññèâ ïîçâîëÿåò ëåãêî ïðåäñòàâèòü è âûïîëíèòü ýòè äåéñòâèÿ. Ðèñ. 12.4 ñîäåðæèò ïðîãðàììó.
/* íàéòè îáùåå êîëè÷åñòâî îñàäêîâ äëÿ êàæäîãî ãîäà, ñðåäíåãî */
/* äîâîå, ñðåäíåìåñÿ÷íîå êîëè÷åñòâî îñàäêîâ, çà íåñêîëüêî ëåò */
#define TWLV 12 /* ÷èñëî ìåñÿöåâ â ãîäó */
#define YRS 5 /* ÷èñëî ëåò */
Main( ).
{
Static float rain [YRS][TWLV] = {
{10.2, 8.1, 6.8, 4.2, 2.1, 1.8, 0.2, 0.3, 1.1, 2.3, 6.1, 7.4},
{9.2, 9.8, 4.4, 3.3, 2.2, 0.8, 0.4, 0.0, 0.6, 1.7, 4.3, 5.2},
{6.6, 5.5, 3.8, 2.8, 1.6, 0.2, 0.0, 0.0, 0.0, 1.3, 2.6, 4.2},
{4.3, 4.3, 4.3, 3.0, 2.0, 1.0, 0.2, 0.2, 0.4, 2.4, 3.5, 6.6},
{8.5, 8.2, 1.2, 1.6, 2.4, 0.0, 5.2, 0.9, 0.3, 0.9, 1.4, 7.2}.
};
/* èíèöèàëèçàöèÿ äàííûõ ïî êîëè÷åñòâó îñàäêîâ çà 1970-1974 */
Int year, month;
Float subtot, total;
Printf("ÃÎÄ ÊÎËÈ×ÅÑÒÂÎ ÎÑÀÄÊΠ(äþéìû)\n\n");
For(year = 0, total = 0; year < YRS; year++).
{ /* äëÿ êàæäîãî ãîäà, ñóììèðóåì êîëè÷åñòâî îñàäêîâ äëÿ êàæäîãî ìåñÿöà */
For(month = 0, subtot = 0; month < TWLV; month++).
subtot + = rain [year][month];
Printf("%5d %15.lf\n", 1970 + year, subtot);
Total + = subtot; /* îáùåå äëÿ âñåõ ëåò */
}
Printf(" \n ñðåäíåãîäîâîå êîëè÷åñòâî îñàäêîâ.
ñîñòàâëÿåò %.lf äþéìîâ. \n \n ", total/YRS );
Printf(" ßíâ. Ôåâ. Map. Àïð.Ìàé Èþí.Èþë. Àâã.Ñåíò.");
Printf(" Îêò. Íîÿá. Äåê.\n" );
For(month = 0; month < TWLV; month++).
{ /* äëÿ êàæäîãî ìåñÿöà, ñóììèðóåì.
êîëè÷åñòâî îñàäêîâ çà âñå ãîäû */
For(year = 0, subtot = 0; year < YRS; year++).
Subtot += rain[year][month];
Printf(" %4.lf ", subtot/YRS); }.
Printf(" \n");
}
ÐÈÑ. 12.4. Ìåòåîðîëîãè÷åñêàÿ ïðîãðàììà.
ÃÎÄ ÊÎËÈ×ÅÑÒÂÎ ÎÑÀÄÊΠ(äþéìû).
1970 50.6.
1971 41.9.
1972 28.6.
1973 32.3.
1974 37.8.
Ñðåäíåãîäîâîå êîëè÷åñòâî îñàäêîâ ñîñòàâëÿåò 38.2 äþéìà.
ÅÆÅÌÅÑß×ÍÎÅ ÊÎËÈ×ÅÑÒÂÎ:
ßíâ. Ôåâ. Ìàð. Àïð. Ìàé. Èþí. Èþë. Àâã. Ñåíò. ÎÊÒ. Íîÿá. Äåê.
7.8 7.2 4.1 3.0 2.1 0.8 1.2 0.3 0.5 1.7 3.6 6.l.
 ýòîé ïðîãðàììå ñëåäóåò îòìåòèòü äâà îñíîâíûõ ìîìåíòà: èíèöèàëèçàöèþ è âû÷èñëåíèÿ. Èíèöèàëèçàöèÿ ñëîæíåå, ïîýòîìó ìû ñíà÷àëà ðàññìîòðèì âû÷èñëåíèÿ.
×òîáû íàéòè îáùåå êîëè÷åñòâî îñàäêîâ çà ãîä, ìû íå èçìåíÿåì year, à çàñòàâëÿåì ïåðåìåííóþ month ïðîéòè âñå ñâîè çíà÷åíèÿ. Òàê âûïîëíÿåòñÿ âíóòðåííèé öèêë for, íàõîäÿùèéñÿ â ïåðâîé ÷àñòè ïðîãðàììû. Çàòåì ìû ïîâòîðÿåì ïðîöåññ äëÿ ñëåäóþùåãî çíà÷åíèÿ year. Ýòî âíåøíèé öèêë ïåðâîé ÷àñòè ïðîãðàììû. Ñòðóêòóðà âëîæåííîãî öèêëà, ïîäîáíàÿ îïèñàííîé, ïîäõîäèò äëÿ ðàáîòû ñ äâóìåðíûì ìàññèâîì. Îäèí öèêë óïðàâëÿåò îäíèì èíäåêñîì, à âòîðîé öèêë - äðóãèì.
Âòîðàÿ ÷àñòü ïðîãðàììû èìååò òàêóþ æå ñòðóêòóðó, íî òåïåðü ìû èçìåíÿåì year âî âíóòðåííåì öèêëå, a month âî âíåøíåì. Ïîìíèòå, ÷òî ïðè îäíîêðàòíîì ïðîõîæäåíèè âíåøíåãî öèêëà âíóòðåííèé öèêë âûïîëíÿåòñÿ ïîëíîñòüþ. Òàêèì îáðàçîì, ïðîãðàììà ïðîõîäèò â öèêëå ÷åðåç âñå ãîäû, ïðåæäå ÷åì èçìåíèòñÿ ìåñÿö, è äàåò íàì îáùåå êîëè÷åñòâî îñàäêîâ çà ïÿòü ëåò äëÿ ïåðâîãî ìåñÿöà, çàòåì îáùåå êîëè÷åñòâî çà ïÿòü ëåò äëÿ âòîðîãî ìåñÿöà è ò. ä.
Èíèöèàëèçàöèÿ äâóìåðíîãî ìàññèâà.
Äëÿ èíèöèàëèçàöèè ìàññèâà ìû âçÿëè ïÿòü çàêëþ÷åííûõ â ñêîáêè ïîñëåäîâàòåëüíîñòåé ÷èñåë, à âñå ýòè äàííûå åùå ðàç çàêëþ÷èëè â ñêîáêè. Äàííûå, íàõîäÿùèåñÿ â ïåðâûõ âíóòðåííèõ ñêîáêàõ, ïðèñâàèâàþòñÿ ïåðâîé ñòðîêå ìàññèâà, äàííûå âî âòîðîé âíóòðåííåé ïîñëåäîâàòåëüíîñòè - âòîðîé ñòðîêå è ò. ä. Ïðàâèëà, êîòîðûå ìû îáñóæäàëè ðàíüøå, î íåñîîòâåòñòâèè ìåæäó ðàçìåðîì ìàññèâà è äàííûõ ïðèìåíÿþòñÿ çäåñü äëÿ êàæäîé ñòðîêè. Åñëè ïåðâàÿ ïîñëåäîâàòåëüíîñòü â ñêîáêàõ âêëþ÷àåò äåñÿòü ÷èñåë, òî òîëüêî ïåðâûì äåñÿòè ýëåìåíòàì ïåðâîé ñòðîêè áóäóò ïðèñâîåíû çíà÷åíèÿ. Ïîñëåäíèå äâà ýëåìåíòà â ýòîé ñòðîêå áóäóò, êàê îáû÷íî, èíèöèàëèçèðîâàíû íóëåì ïî óìîë÷àíèþ. Åñëè ÷èñåë áîëüøå, ÷åì íóæíî, òî ýòî ñ÷èòàåòñÿ îøèáêîé; ïåðåõîäà ê ñëåäóþùåé ñòðîêå íå ïðîèçîéäåò.
Ìû ìîãëè áû îïóñòèòü âñå âíóòðåííèå ñêîáêè è îñòàâèòü òîëüêî äâå ñàìûå âíåøíèå. Äî òåõ ïîð ïîêà ìû áóäåì äàâàòü ïðàâèëüíîå êîëè÷åñòâî âõîäíûõ äàííûõ, ðåçóëüòàò áóäåò òåì æå ñàìûì. Îäíàêî, åñëè äàííûõ ìåíüøå, ÷åì íóæíî, ìàññèâ çàïîëíÿåòñÿ ïîñëåäîâàòåëüíî (íå îáðàùàåòñÿ âíèìàíèå íà ðàçäåëåíèå ïî ñòðîêàì), ïîêà íå êîí÷àòñÿ âñå äàííûå. Çàòåì îñòàâøèìñÿ ýëåìåíòàì áóäóò ïðèñâîåíû íóëåâûå çíà÷åíèÿ. Ñì. ðèñ. 12.5.

ÐÈÑ. 12.5. Äâà ìåòîäà èíèöèàëèçàöèè ìàññèâà.
Âñå, ÷òî ìû ñêàçàëè î äâóìåðíûõ ìàññèâàõ, ìîæíî ðàñïðîñòðàíèòü è íà òðåõìåðíûå ìàññèâû è ò. ä. Òðåõìåðíûé ìàññèâ îïèñûâàåòñÿ ñëåäóþùèì îáðàçîì:
Int solido[10][20][30];
Âû ìîæåòå ïðåäñòàâèòü åãî â âèäå äåñÿòè äâóìåðíûõ ìàññèâîâ (êàæäûé 20õ30), ïîñòàâëåííûõ äðóã íà äðóãà, èëè â âèäå ìàññèâà èç ìàññèâîâ. Òî åñòü ýòî ìàññèâ èç 10 ýëåìåíòîâ, è êàæäûé åãî ýëåìåíò òàêæå ÿâëÿåòñÿ ìàññèâîì. Âñå ýòè ìàññèâû â ñâîþ î÷åðåäü èìåþò ïî 20 ýëåìåíòîâ, êàæäûé èç êîòîðûõ ñîñòîèò èç 30 ýëåìåíòîâ. Ïðåèìóùåñòâî ýòîãî âòîðîãî ïîäõîäà ñîñòîèò â òîì, ÷òî ìîæíî äîâîëüíî ïðîñòî ïåðåéòè ê ìàññèâàì áîëüøåé ðàçìåðíîñòè, åñëè îêàæåòñÿ, ÷òî âû íå ìîæåòå ïðåäñòàâèòü íàãëÿäíî ÷åòûðåõìåðíûé îáúåêò! Ìû æå îñòàíåìñÿ âåðíû äâóì èçìåðåíèÿì.
ÓÊÀÇÀÒÅËÈ È ÌÍÎÃÎÌÅÐÍÛÅ ÌÀÑÑÈÂÛ.
Êàê ñîçäàòü óêàçàòåëè äëÿ ìíîãîìåðíûõ ìàññèâîâ? ×òîáû íàéòè îòâåò íà ýòîò âîïðîñ, ðàññìîòðèì íåñêîëüêî ïðèìåðîâ.
Ïðåäïîëîæèì, ÷òî ó íàñ åñòü îïèñàíèÿ.
Int zippo[4][2]; /* ìàññèâ òèïà int.
èç 4 ñòðîê è 2 ñòîëáöîâ */
Int *pri; /* óêàçàòåëü íà öåëûé òèï */
Òîãäà íà ÷òî pri = zippo; óêàçûâàåò? Íà ïåðâûé ñòîëáåö ïåðâîé ñòðîêè:
Zippo == &zippo[0][0].
À íà ÷òî óêàçûâàåò pri + 1? Íà zippo[0][l], ò.å. íà 1-þ ñòðîêó 2-ãî ñòîëáöà? Èëè íà zippo[l][0], ýëåìåíò, íàõîäÿùèéñÿ âî âòîðîé ñòðîêå ïåðâîãî ñòîëáöà? ×òîáû îòâåòèòü íà ïîñòàâëåííûé âîïðîñ, íóæíî çíàòü, êàê ðàñïîëàãàåòñÿ â ïàìÿòè äâóìåðíûé ìàññèâ. Îí ðàçìåùàåòñÿ, ïîäîáíî îäíîìåðíûì ìàññèâàì, çàíèìàÿ ïîñëåäîâàòåëüíûå ÿ÷åéêè ïàìÿòè. Ïîðÿäîê ýëåìåíòîâ îïðåäåëÿåòñÿ òåì, ÷òî ñàìûé ïðàâûé èíäåêñ ìàññèâà èçìåíÿåòñÿ ïåðâûì, ò. å. ýëåìåíòû ìàññèâà ðàñïîëàãàþòñÿ ñëåäóþùèì îáðàçîì:
Zippo[0][0] zippo[0][1] zippo[1][0] zippo[1][1] zippo[2][0].
...
Ñíà÷àëà çàïîìèíàåòñÿ ïåðâàÿ ñòðîêà, çà íåé âòîðàÿ, çàòåì òðåòüÿ è ò. ä. Òàêèì îáðàçîì â íàøåì ïðèìåðå:
Pri == &zippo[0][0] /* 1-ÿ ñòðîêà, 1 ñòîëáåö */
Pri + 1 == &zippo[0][1] /* 1-ÿ ñòðîêà, 2 ñòîëáåö */
Pri + 2 == &zippo[1][0] /* 2-ÿ ñòðîêà, 1 ñòîëáåö */
Pri + 3 == &zippo[1][1] /* 2-ÿ ñòðîêà, 2 ñòîëáåö */
Ïîëó÷èëîñü? Õîðîøî, à íà ÷òî óêàçûâàåò pri + 5? Ïðàâèëüíî, íà zippo[2][l].
Ìû îïèñàëè äâóìåðíûé ìàññèâ êàê ìàññèâ ìàññèâîâ. Åñëè zippo ÿâëÿåòñÿ èìåíåì íàøåãî äâóìåðíîãî ìàññèâà, òî êàêîâû èìåíà ÷åòûðåõ ñòðîê, êàæäàÿ èç êîòîðûõ ÿâëÿåòñÿ ìàññèâîì èç äâóõ ýëåìåíòîâ? Èìÿ ïåðâîé ñòðîêè zippo[0], èìÿ ÷åòâåðòîé ñòðîêè zippo[3]; âû ìîæåòå çàïîëíèòü ïðîïóùåííûå èìåíà. Îäíàêî èìÿ ìàññèâà ÿâëÿåòñÿ òàêæå óêàçàòåëåì íà ýòîò ìàññèâ â òîì ñìûñëå, ÷òî îíî ññûëàåòñÿ íà ïåðâûé åãî ýëåìåíò. Çíà÷èò,
Zippo[0] == &zippo[0][0].
Zippo[1] == &zjppo[1][0].
Zippo[2] == &zippo[2][0].
Zippo[3] == &zippo[3][0].
Ýòî ñâîéñòâî ÿâëÿåòñÿ áîëåå, ÷åì íîâøåñòâîì. Îíî ïîçâîëÿåò èñïîëüçîâàòü ôóíêöèþ, ïðåäíàçíà÷åííóþ äëÿ îäíîìåðíîãî ìàññèâà, äëÿ ðàáîòû ñ äâóìåðíûì ìàññèâîì! Âîò äîêàçàòåëüñòâî (õîòÿ ìû íàäååìñÿ, ÷òî òåïåðü âû áû ïîâåðèëè íàì è òàê) èñïîëüçîâàíèÿ äâóìåðíîãî ìàññèâà â íàøåé ïðîãðàììå íàõîæäåíèÿ ñðåäíåãî çíà÷åíèÿ:
/* îäíîìåðíàÿ ôóíêöèÿ, äâóìåðíûé ìàññèâ */
Main( ).
{
Static int junk[3][4] = {
{2, 4, 6, 8},
{100, 200, 300, 400},
{10, 40, 60, 90} };
Int row;
For(row = 0; row < 3; row ++).
Printf(" Ñðåäíåå ñòðîêè %d ðàâíî %d.\n", row, mean(junk[row],4));
/* junk [row] - îäíîìåðíûé ìàññèâ ÈÇ ÷åòûðåõ ýëåìåíòîâ */
}
/* íàõîäèò ñðåäíåå â îäíîìåðíîì ìàññèâå */
Int mean(array,n).
Int array[ ], n;
{
Int index;
Long sum;
If(n > 0) {
For(index = 0, sum = 0; index < n; index++).
sum += (long)array[index];
Return((int)(sum/n)); }.
Else {
Printf(" Íåò ìàññèâà. \n");
Return(0); }.
}
Ðåçóëüòàò ðàáîòû ïðîãðàììû:
Ñðåäíåå ñòðîêè 0 ðàâíî 5.
Ñðåäíåå ñòðîêè 1 ðàâíî 250.
Ñðåäíåå ñòðîêè 2 ðàâíî 50.
Ôóíêöèè è ìíîãîìåðíûå ìàññèâû.
Ïðåäïîëîæèì, ÷òî âû õîòèòå èìåòü ôóíêöèþ, ðàáîòàþùóþ ñ äâóìåðíûì ìàññèâîì, ïðè÷åì ñî âñåì öåëèêîì, à íå ñ ÷àñòÿìè. Êàê âû çàïèøèòå îïðåäåëåíèÿ ôóíêöèè è åå îïèñàíèÿ? Ïîäîéäåì ê ýòîìó áîëåå êîíêðåòíî è ñêàæåì, ÷òî íàì íóæíà ôóíêöèÿ, óïðàâëÿþùàÿ ìàññèâîì junk[ ][ ] â íàøåì ïîñëåäíåì ïðèìåðå. Ïóñòü ôóíêöèÿ main( ) âûãëÿäèò òàê:
/* junk â main */
Main( ).
{
Static int junk[3][4] = {
{2, 4, 5, 8},
{100, 200, 300, 400}.
{10, 40, 60, 90} };
Stuff(junk);
}
Ôóíêöèÿ stuff( ) èñïîëüçóåò â êà÷åñòâå àðãóìåíòà junk, ÿâëÿþùèéñÿ óêàçàòåëåì íà âåñü ìàññèâ. Êàê íàïèñàòü çàãîëîâîê ôóíêöèè, íå çíàÿ, ÷òî äåëàåò stuff( )?
Ïîïðîáóåì íàïèñàòü:
Stuff(junk) int junk[ ];
Èëè.
Stuff(junk) int junk[ ][ ];
Íåò è íåò. Ïåðâûå äâà îïåðàòîðà åùå áóäóò ðàáîòàòü íåêîòîðûì îáðàçîì, íî îíè ðàññìàòðèâàþò junk êàê îäíîìåðíûé ìàññèâ, ñîñòîÿùèé èç 12 ýëåìåíòîâ. Èíôîðìàöèÿ î ðàñ÷ëåíåíèè ìàññèâà íà ñòðîêè îòñóòñòâóåò.
Âòîðàÿ ïîïûòêà îøèáî÷íà, ïîòîìó ÷òî õîòÿ îïåðàòîð è óêàçûâàåò ÷òî junk ÿâëÿåòñÿ äâóìåðíûì ìàññèâîì, íî íèãäå íå ãîâîðèòñÿ, èç ÷åãî îí ñîñòîèò. Èç øåñòè ñòðîê è äâóõ ñòîëáöîâ? Èç äâóõ ñòðîê è øåñòè ñòîëáöîâ? Èëè èç ÷åãî-íèáóäü åùå? Êîìïèëÿòîðó íåäîñòàòî÷íî ýòîé èíôîðìàöèè. Åå äàþò ñëåäóþùèå îïåðàòîðû:
Stuff(junk).
Int junk[ ][4];
Îíè ñîîáùàþò êîìïèëÿòîðó, ÷òî ìàññèâ ñëåäóåò ðàçáèòü íà ñòðîêè ïî ÷åòûðå ñòîëáöà. Ìàññèâû ñèìâîëüíûõ ñòðîê ÿâëÿþòñÿ îñîáûì ñëó÷àåì, òàê êàê ó íèõ íóëåâîé ñèìâîë â êàæäîé ñòðîêå ñîîáùàåò êîìïèëÿòîðó î êîíöå ñòðîêè. Ýòî ðàçðåøàåò îïèñàíèÿ, ïîäîáíûå ñëåäóþùåìó:
Char *list[ ];
Ñèìâîëüíûå ñòðîêè ïðåäñòàâëÿþò îäíî èç íàèáîëåå ÷àñòûõ ïðèìåíåíèé ìàññèâîâ è óêàçàòåëåé; ìû âåðíåìñÿ ê ýòîé òåìå â ãë. 13.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îáúÿâèòü îäíîìåðíûé ìàññèâ: long id_no[200];
Êàê îáúÿâèòü äâóìåðíûé ìàññèâ: short chess[8][8];
Êàêèå ìàññèâû ìîæíî èíèöèàëèçèðîâàòü: âíåøíèå è ñòàòè÷åñêèå.
Êàê èíèöèàëèçèðîâàòü ìàññèâ: static int hats[3]=[10,20,15];
Äðóãîé ñïîñîá èíèöèàëèçàöèè: static int caps[ ]=[3,56,2];
Êàê ïîëó÷èòü àäðåñ ïåðåìåííîé: èñïîëüçîâàòü îïåðàöèþ &.
Êàê ïîëó÷èòü çíà÷åíèå, ññûëàÿñü íà óêàçàòåëü: èñïîëüçîâàòü îïåðàöèþ *.
Ñìûñë èìåíè ìàññèâà: hats == &hats[0].
Ñîîòâåòñòâèå ìàññèâà è óêàçàòåëÿ: åñëè ptr = hats; òî ptr + 2 == &hat[2]; è *(ptr+2) == hat[2];
Ïÿòü îïåðàöèé, êîòîðûå ìîæíî ïðèìåíÿòü äëÿ ïåðåìåííûõ òèïà óêàçàòåëü: ñì. òåêñò.
Ìåòîä óêàçàòåëåé äëÿ ôóíêöèé, ðàáîòàþùèõ ñ ìàññèâàìè.
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. ×òî íàïå÷àòàåòñÿ â ðåçóëüòàòå ðàáîòû ýòîé ïðîãðàììû?
#define PC(X, Y).
Printf(" %ñ %c \n", X, Y).
Char ref[ ] = { D, Î, L, Ò};
Main( ).
{
Char *ptr;
Int index;
For(index =0; ptr = ref; index < 4; index++, ptr++).
PC(ref[indcx], *ptr);
}
2. Ïî÷åìó â âîïðîñå 1 ìàññèâ ref îïèñàí äî îïåðàòîðà main( )?
3. Îïðåäåëèòå çíà÷åíèå *ptr è *(ptr + 2) â êàæäîì ñëó÷àå:
à. int *ptr;
static int boop[4] = {12, 21, 121, 212};
ptr = bîîð;
á. float *ptr;
static float awk[2][2] = { {1.0, 2.0}, {3.0, 4.0}};
ptr = awk[0];
â. int *ptr;
static int jirb[4] = {10023, 7};
ptr = jirb;
ã. int = *ptr;
static int torf[2][2] = {12, 14, 16};
ptr = torf[0];
ä. int *ptr;
static int fort[2][2] = { { 12}, {14, 16} };
ptr = fort[0];
4. Ïðåäïîëîæèì, ó íàñ åñòü îïèñàíèå static int grid[30][100];
à. Âûðàçèòå àäðåñ grid [22][56] èíà÷å.
á. Âûðàçèòå àäðåñ grid[22][0] äâóìÿ ñïîñîáàìè.
â. Âûðàçèòå àäðåñ grid[0][0] òðåìÿ ñïîñîáàìè.
Îòâåòû.
1.
D D.
O O.
L L.
Ò Ò.
2. Ïî óìîë÷àíèþ òàêîå ïîëîæåíèå ref îòíîñèò åãî ê êëàññó ïàìÿòè òèïà extern, a ìàññèâû ýòîãî êëàññà ïàìÿòè ìîæíî èíèöèàëèçèðîâàòü.
3.
à. 12 è 121.
á. 1.0 è 3.0.
â. 10023 è 0 (àâòîìàòè÷åñêàÿ èíèöèàëèçàöèÿ íóëåì).
ã. 12 è 16.
ä. 12 è 14 (èìåííî 12 ïîÿâëÿåòñÿ â ïåðâîé ñòðîêå èç-çà ñêîáîê).
4.
a. &grid[22][56].
á. &grid[22][01 è grid[22].
ÓÏÐÀÆÍÅÍÈÅ.
1. Ìîäèôèöèðóéòå íàøó ìåòåîðîëîãè÷åñêóþ ïðîãðàììó òàêèì îáðàçîì, ÷òîáû îíà âûïîëíÿëà âû÷èñëåíèÿ, èñïîëüçóÿ óêàçàòåëè âìåñòî èíäåêñîâ. (Âû ïî-ïðåæíåìó äîëæíû îáúÿâèòü è èíèöèàëèçèðîâàòü ìàññèâ.).
13. Ñèìâîëüíûå ñòðîêè è ôóíêöèè íàä ñòðîêàìè.
ÑÈÌÂÎËÜÍÛÅ ÑÒÐÎÊÈ.
ÈÍÈÖÈÀËÈÇÀÖÈß ÑÈÌÂÎËÜÍÛÕ ÑÒÐÎÊ.
ÂÂÎÄ-ÂÛÂÎÄ ÑÒÐÎÊ.
ÈÑÏÎËÜÇÎÂÀÍÈÅ ÔÓÍÊÖÈÉ, ÐÀÁÎÒÀÞÙÈÕ CO ÑÒÐÎÊÀÌÈ.
ÀÐÃÓÌÅÍÒÛ ÊÎÌÀÍÄÍÛÕ ÑÒÐÎÊ.
ÑÈÌÂÎËÜÍÛÅ ÑÒÐÎÊÈ
Ñèìâîëüíûå ñòðîêè ïðåäñòàâëÿþò îäèí èç íàèáîëåå ïîëåçíûõ è âàæíûõ òèïîâ äàííûõ ÿçûêà Ñè. Õîòÿ äî ñèõ ïîð âñå âðåìÿ ïðèìåíÿëèñü ñèìâîëüíûå ñòðîêè, ìû åùå íå âñå çíàåì î íèõ. Êîíå÷íî, íàì óæå èçâåñòíî ñàìîå ãëàâíîå: ñèìâîëüíàÿ ñòðîêà ÿâëÿåòñÿ ìàññèâîì òèïà char, êîòîðûé çàêàí÷èâàåòñÿ íóëü-ñèìâîëîì ('\0').  ýòîé ãëàâå ìû áîëüøå óçíàåì î ñòðóêòóðå ñòðîê, î òîì, êàê îïèñûâàòü è èíèöèàëèçèðîâàòü ñòðîêè, êàê èõ ââîäèòü èëè âûâîäèòü èç ïðîãðàììû, êàê ðàáîòàòü ñî ñòðîêàìè.
Íà ðèñ. 13.1 ïðåäñòàâëåíà ðàáîòàþùàÿ ïðîãðàììà, êîòîðàÿ èëëþñòðèðóåò íåñêîëüêî ñïîñîáîâ ñîçäàíèÿ ñòðîê, èõ ÷òåíèÿ è âûâîäà íà ïå÷àòü. Ìû èñïîëüçóåì äâå íîâûå ôóíêöèè: gets( ), êîòîðàÿ ïîëó÷àñò ñòðîêó, è puts( ), êîòîðàÿ âûâîäèò ñòðîêó. (Âû, âåðîÿòíî, çàìåòèëè ñõîäñòâî èõ èìåí ñ ôóíêöèÿìè getchar( ) è putchar( ).)  îñòàëüíîì ïðîãðàììà âûãëÿäèò äîñòàòî÷íî ïðèâû÷íî.
/* ðàáîòà ñî ñòðîêàìè */
#include <stdio.h>
#deline MSG "Ó âàñ, íàâåðíîå, ìíîãî òàëàíòîâ.
Ðàññêàæèòå î íåêîòîðûõ" .
/* êîíñòàíòà ñèìâîëüíîé ñòðîêè */
#define NULL 0.
#define LIM 5.
#define LINLEN 81 /* ìàêñèìàëüíàÿ äëèíà ñòðîêè + 1 */
Char ml[ ] = " Òîëüêî îãðàíè÷üòåñü îäíîé ñòðîêîé.";
/* èíèöèàëèçàöèÿ âíåøíåãî ñèìâîëüíîãî ìàññèâà */
Char *m2 = " Åñëè âû íå ìîæåòå âñïîìíèòü ÷òî-íèáóäü, ïðèäóìàéòå.";
/* èíèöèàëèçàöèÿ óêàçàòåëÿ âíåøíåãî ñèìâîëüíîãî ìàññèâà */
Main( ).
{
Char name[LlNLEN];
Static char talents[LINLEN];
Int i;
Int count = 0;
Char *m3 = " \n Äîñòàòî÷íî îáî ìíå -- Êàê âàñ çîâóò?";
/* èíèöèàëèçàöèÿ óêàçàòåëÿ */
Static char *mytal[LlM] = ("Áûñòðî ñêëàäûâàþ ÷èñëà",
"Òî÷íî óìíîæàþ",
"Çàïèñûâàþ äàííûå",
"Ïðàâèëüíî âûïîëíÿþ êîìàíäû",
"Ïîíèìàþ ÿçûê Ñè"};
/* èíèöèàëèçàöèÿ ìàññèâà ñòðîê */
Printf("Ïðèâåò! ß Êëàéä, êîìïüþòåð.
Ó ìåíÿ ìíîãî òàëàíòîâ.\n");
Printf("%s \n", "Ïîçâîëüòå ðàññêàçàòü î íåêîòîðûõ èç íèõ.");
Puts(" Êàêîâû îíè? Àõ äà, âîò èõ íåïîëíûé ïåðå÷åíü.");
For(i = 0; i<LIM; i++).
Puts(mytal[i]); /* ïå÷àòàåò ïåðå÷åíü òàëàíòîâ êîìïüþòåðà */
Puts(m3);
Gets(name);
Printf(" Õîðîøî, %s, %s\n" , name, MSG);
Printf(" %s\n %s\n", m1, m2);
Gets(talents);
Puts(" Äàâàéòå, ïîñìîòðèì, ïîëó÷èë ëè ÿ ýòîò ïåðå÷åíü:");
Puts(talents);
Printf(" Ñïàñèáî çà èíôîðìàöèþ, %s \n" , name);
}
ÐÈÑ. 13.1. Ïðîãðàììà, èñïîëüçóþùàÿ ñòðîêè.
×òîáû ïîìî÷ü âàì ðàçîáðàòüñÿ â òîì, ÷òî äåëàåò ýòà ïðîãðàììà, ìû ïðèâîäèì ðåçóëüòàò åå ðàáîòû:
Ïðèâåò, ÿ Êëàéä, êîìïüþòåð. Ó ìåíÿ ìíîãî òàëàíòîâ.
Ïîçâîëüòå ðàññêàçàòü î íåêîòîðûõ èç íèõ.
Êàêîâû îíè? Àõ äà, âîò èõ íåïîëíûé ïåðå÷åíü.
Áûñòðî ñêëàäûâàþ ÷èñëà.
Òî÷íî óìíîæàþ.
Çàïèñûâàþ äàííûå.
Ïðàâèëüíî âûïîëíÿþ êîìàíäû êîìàíäû.
Ïîíèìàþ ÿçûê Ñè.
Äîñòàòî÷íî îáî ìíå - Êàê âàñ çîâóò? Íàéäæåë Áàðíòâèò.
Õîðîøî, Íàéäæåë Áàðíòâèò, ó âàñ, íàâåðíîå, ìíîãî òàëàíòîâ.
Ðàññêàæèòå î íåêîòîðûõ.
Òîëüêî îãðàíè÷òåñü îäíîé ñòðîêîé.
Åñëè âû íå ìîæåòå âñïîìíèòü ÷òî-íèáóäü, ïðèäóìàéòå.
Ôåõòîâàíèå, ïåíèå òèðîëüñêèõ ïåñåí, ñèìóëÿöèÿ, äåãóñòàöèÿ ñûðà.
Äàâàéòå ïîñìîòðèì, ïîëó÷èë ëè ÿ ýòîò ïåðå÷åíü.
Ôåõòîâàíèå, ïåíèå òèðîëüñêèõ ïåñåí, ñèìóëÿöèÿ, äåãóñòàöèÿ ñûðà.
Ñïàñèáî çà èíôîðìàöèþ, Íàéäæåë Áàðíòâèò.
Òùàòåëüíî èññëåäóåì ïðîãðàììó. Íî âìåñòî òîãî ÷òîáû ïðîñìàòðèâàòü ñòðîêó çà ñòðîêîé, ïðèìåíèì áîëåå îáùèé ïîäõîä. Ñíà÷àëà ðàññìîòðèì ñïîñîáû îïðåäåëåíèÿ ñòðîê â ïðîãðàììå. Çàòåì âûÿñíèì, ÷òî íóæíî äëÿ ÷òåíèÿ ñòðîêè â ïðîãðàììå. È íàêîíåö, èçó÷èì ñïîñîáû âûâîäà ñòðîêè.
ÎÏÐÅÄÅËÅÍÈÅ ÑÒÐÎÊ Â ÏÐÎÃÐÀÌÌÅ.
Ñòðîêîâûå êîíñòàíòû.
Âñÿêèé ðàç, êîãäà êîìïèëÿòîð âñòðå÷àåòñÿ ñ ÷åì-òî, çàêëþ÷åííûì â äâîéíûå êàâû÷êè, îí îïðåäåëÿåò ýòî êàê ñòðîêîâóþ êîíñòàíòó. Ñèìâîëû, çàêëþ÷åííûå â êàâû÷êè, ïëþñ çàâåðøàþùèé ñèìâîë '\0', çàïèñûâàþòñÿ â ïîñëåäîâàòåëüíûå ÿ÷åéêè ïàìÿòè. Êîìïèëÿòîð ïîäñ÷èòûâàåò êîëè÷åñòâî ñèìâîëîâ, ïîñêîëüêó åìó íóæíî çíàòü ðàçìåð ïàìÿòè, íåîáõîäèìîé äëÿ çàïîìèíàíèÿ ñòðîêè. Íàøà ïðîãðàììà èñïîëüçóåò íåñêîëüêî òàêèõ ñòðîêîâûõ êîíñòàíò, ÷àùå âñåãî â êà÷åñòâå àðãóìåíòîâ ôóíêöèé printf( ) è puts( ). Çàìåòèì òàêæå, ÷òî ìû ìîæåì îïðåäåëÿòü ñòðîêîâûå êîíñòàíòû ïðè ïîìîùè äèðåêòèâû #define.
Åñëè âû õîòèòå âêëþ÷èòü â ñòðîêó ñèìâîë äâîéíîé êàâû÷êè, åìó äîëæåí ïðåäøåñòâîâàòü ñèìâîë îáðàòíîé äðîáíîé ÷åðòû:
Ðrintf("\"Áåãè, Ñïîò, áåãè!\" - ñêàçàë Äèê.\n");
 ðåçóëüòàòå ðàáîòû ýòîãî îïåðàòîðà áóäåò íàïå÷àòàíà ñòðîêà:
"Áåãè, Ñïîò, áåãè! - "ñêàçàë Äèê.
Ñòðîêîâûå êîíñòàíòû ðàçìåùàþòñÿ â ñòàòè÷åñêîé ïàìÿòè. Âñÿ ôðàçà â êàâû÷êàõ ÿâëÿåòñÿ óêàçàòåëåì íà ìåñòî â ïàìÿòè, ãäå çàïèñàíà ñòðîêà. Ýòî àíàëîãè÷íî èñïîëüçîâàíèþ èìåíè ìàññèâà, ñëóæàùåãî óêàçàòåëåì íà ðàñïîëîæåíèå ìàññèâà. Åñëè ýòî äåéñòâèòåëüíî òàê, òî êàê âûãëÿäèò îïåðàòîð, êîòîðûé âûâîäèò ñòðîêó?
/* ñòðîêè â êà÷åñòâå óêàçàòåëåé */
Main( ).
{
Printf("%s, %u, %c \n", "We", "love", *"figs");
Èòàê, ôîðìàò %s âûâîäèò ñòðîêó We. Ôîðìàò %u âûâîäèò öåëîå áåç çíàêà. Åñëè ñëîâî "love" ÿâëÿåòñÿ óêàçàòåëåì, òî âûäàåòñÿ åãî çíà÷åíèå, ÿâëÿþùååñÿ àäðåñîì ïåðâîãî ñèìâîëà ñòðîêè. Íàêîíåö, *"figs" äîëæíî âûäàòü çíà÷åíèå, íà êîòîðîå ññûëàåòñÿ àäðåñ, ò. å. ïåðâûé ñèìâîë ñòðîêè "figs". Ïðîèçîéäåò ëè ýòî íà ñàìîì äåëå? Äà, ìû ïîëó÷èì ñëåäóþùèé òåêñò:
We, 34, f.
Íó, âîò! Äàâàéòå òåïåðü âåðíåìñÿ ê ñòðîêàì, íàõîäÿùèìñÿ â ñèìâîëüíûõ ìàññèâàõ.
Ìàññèâû ñèìâîëüíûõ ñòðîê è èõ èíèöèàëèçàöèÿ.
Ïðè îïðåäåëåíèè ìàññèâà ñèìâîëüíûõ ñòðîê íåîáõîäèìî ñîîáùèòü êîìïèëÿòîðó òðåáóåìûé ðàçìåð ïàìÿòè. Îäèí èç ñïîñîáîâ ñäåëàòü ýòî - èíèöèàëèçèðîâàòü ìàññèâ ïðè ïîìîùè ñòðîêîâîé êîíñòàíòû. Òàê êàê àâòîìàòè÷åñêèå ìàññèâû íåëüçÿ èíèöèàëèçèðîâàòü, íåîáõîäèìî äëÿ ýòîãî èñïîëüçîâàòü ñòàòè÷åñêèå èëè âíåøíèå ìàññèâû. Íàïðèìåð, îïåðàòîð.
Char m1[ ] = "Òîëüêî îãðàíè÷üòåñü îäíîé ñòðîêîé.";
Èíèöèàëèçèðîâàë âíåøíèé (ïî óìîë÷àíèþ) ìàññèâ m1 äëÿ óêàçàííîé ñòðîêè. Ýòîò âèä èíèöèàëèçàöèè ÿâëÿåòñÿ êðàòêîé ôîðìîé ñòàíäàðòíîé èíèöèàëèçàöèè ìàññèâà.
Char m1[ ] = {'Ò', 'î', 'ë', 'ü', 'ê', 'î', ' ',
'î', 'ã', 'ð', 'à', 'í', 'è', '÷',
'ü', 'ò', 'e', 'ñ', 'ü', ' ', 'î',
'ä', 'í', 'î', 'é', ' ', 'ñ', 'ò',
'ð' 'î', 'ê', 'î', 'é', ' .', '\0'};
(Îáðàòèòå âíèìàíèå íà çàìûêàþùèé íóëü-ñèìâîë. Áåç íåãî ìû èìååì ìàññèâ ñèìâîëîâ, à íå ñòðîêó.) Äëÿ òîé è äðóãîé ôîðìû (à ìû ðåêîìåíäóåì ïåðâóþ) êîìïèëÿòîð ïîäñ÷èòûâàåò ñèìâîëû è òàêèì îáðàçîì ïîëó÷àåò ðàçìåð ìàññèâà.
Êàê è äëÿ äðóãèõ ìàññèâîâ, èìÿ m1 ÿâëÿåòñÿ óêàçàòåëåì íà ïåðâûé ýëåìåíò ìàññèâà:
M1 == &m1[0], *m1 == 'Ò', è *(m1 + l) == m1[1] == 'î',
Äåéñòâèòåëüíî, ìû ìîæåì èñïîëüçîâàòü óêàçàòåëü äëÿ ñîçäàíèÿ ñòðîêè. Íàïðèìåð:
Char *m3 = " \n Äîñòàòî÷íî îáî ìíå - êàê âàñ çîâóò?";
Ýòî ïî÷òè òî æå ñàìîå, ÷òî è.
Static char m3[ ] = "\n Äîñòàòî÷íî îáî ìíå - êàê âàñ çîâóò?" ;
Îáà îïèñàíèÿ ãîâîðÿò îá îäíîì: m3 ÿâëÿåòñÿ óêàçàòåëåì ñòðîêè ñî ñëîâàìè " Êàê âàñ çîâóò?" .  òîì è äðóãîì ñëó÷àå ñàìà ñòðîêà îïðåäåëÿåò ðàçìåð ïàìÿòè, íåîáõîäèìîé äëÿ åå ðàçìåùåíèÿ. Îäíàêî âèä èõ íå èäåíòè÷åí.
Ìàññèâ èëè óêàçàòåëü.
 ÷åì æå òîãäà ðàçíèöà ìåæäó ýòèìè äâóìÿ îïèñàíèÿìè? Îïèñàíèå ñ ìàññèâîì âûçûâàåò ñîçäàíèå â ñòàòè÷åñêîé ïàìÿòè ìàññèâà èç 38 ýëåìåíòîâ (ïî îäíîìó íà êàæäûé ñèìâîë ïëþñ îäèí íà çàâåðøàþùèé ñèìâîë '\0'. Êàæäûé ýëåìåíò èíèöèàëèçèðóåòñÿ ñîîòâåòñòâóþùèì ñèìâîëîì.  äàëüíåéøåì êîìïèëÿòîð áóäåò ðàññìàòðèâàòü èìÿ m3 êàê ñèíîíèì àäðåñà ïåðâîãî ýëåìåíòà ìàññèâà, ò. å. &m3[0]. Ñëåäóåò îòìåòèòü, ÷òî m3 ÿâëÿåòñÿ êîíñòàíòîé óêàçàòåëÿ. Âû íå ìîæåòå èçìåíèòü m3, òàê êàê ýòî îçíà÷àëî áû èçìåíåíèå ïîëîæåíèÿ (àäðåñ) ìàññèâà â ïàìÿòè. Ìîæíî èñïîëüçîâàòü îïåðàöèè, ïîäîáíûå m3+1, äëÿ èäåíòèôèêàöèè ñëåäóþùåãî ýëåìåíòà ìàññèâà, îäíàêî íå ðàçðåøàåòñÿ âûðàæåíèå ++m3. Îïåðàòîð óâåëè÷åíèÿ ìîæíî èñïîëüçîâàòü ñ èìåíàìè ïåðåìåííûõ, íî íå êîíñòàíò.
Ôîðìà ñ óêàçàòåëåì òàêæå âûçûâàåò ñîçäàíèå â ñòàòè÷åñêîé ïàìÿòè 38 ýëåìåíòîâ äëÿ çàïîìèíàíèÿ ñòðîêè. Íî, êðîìå òîãî, âûäåëÿåòñÿ åùå îäíà ÿ÷åéêà ïàìÿòè äëÿ ïåðåìåííîé m3, ÿâëÿþùåéñÿ óêàçàòåëåì. Ñíà÷àëà ýòà ïåðåìåííàÿ óêàçûâàåò íà íà÷àëî ñòðîêè, íî åå çíà÷åíèå ìîæåò èçìåíÿòüñÿ. Ïîýòîìó ìû ìîæåì èñïîëüçîâàòü îïåðàöèþ óâåëè÷åíèÿ; ++m3 áóäåò óêàçûâàòü íà âòîðîé ñèìâîë ñòðîêè (Ä). Çàìåòèì, ÷òî ìû íå îáúÿâèëè *m3 ñòàòè÷åñêîé íåðåìåííîé, ïîòîìó ÷òî ìû èíèöèàëèçèðîâàëè íå ìàññèâ èç 38 ýëåìåíòîâ, à îäíó ïåðåìåííóþ òèïà óêàçàòåëü. Íå ñóùåñòâóåò îãðàíè÷åíèé íà êëàññ ïàìÿòè ïðè èíèöèàëèçàöèè îáû÷íûõ ïåðåìåííûõ, íå ÿâëÿþùèõñÿ ìàññèâîì.
Ñóùåñòâåííû ëè ýòè îòëè÷èÿ? ×àùå âñåãî íåò, íî âñå çàâèñèò îò òîãî, ÷òî âû ïûòàåòåñü äåëàòü. Ïîñìîòðèòå íåñêîëüêî ïðèìåðîâ, à ìû âîçâðàùàåìñÿ ê âîïðîñó âûäåëåíèÿ ïàìÿòè äëÿ ñòðîê.
Ìàññèâ è óêàçàòåëü: ðàçëè÷èÿ.
 íèæåñëåäóþùåì òåêñòå ìû îáñóäèì ðàçëè÷èÿ â èñïîëüçîâàíèè îïèñàíèé ýòèõ äâóõ âèäîâ:
Static char heart[ ] ="ß ëþáëþ Òèëëè !";
Char *head ="ß ëþáëþ Ìèëëè!";
Îñíîâíîå îòëè÷èå ñîñòîèò â òîì, ÷òî óêàçàòåëü heart ÿâëÿåòñÿ êîíñòàíòîé, â òî âðåìÿ êàê óêàçàòåëü head - ïåðåìåííîé. Ïîñìîòðèì, ÷òî íà ñàìîì äåëå äàñò ýòà ðàçíèöà.
Âî-ïåðâûõ, è â òîì è â äðóãîì ñëó÷àå ìîæíî èñïîëüçîâàòü îïåðàöèþ ñëîæåíèÿ ñ óêàçàòåëåì.
For(i = 0; i < 6; i++ ).
Putchar(*(heart + i));
Putchar('\n');
For(i = 0; i < 6; i++ ).
Putchar(*(head + i));
Putchar('\n');
 ðåçóëüòàòå ïîëó÷àåì.
ß ëþáëþ ß ëþáëþ.
Íî òîëüêî â ñëó÷àå ñ óêàçàòåëåì ìîæíî èñïîëüçîâàòü îïåðàöèþ óâåëè÷åíèÿ:
While( *(head) != '\0') /* îñòàíîâ è êîíöå ñòðîêè */
Putchar(*(head++ )); /* ïå÷àòü ñèìâîëà è ïåðåìåùåíèå óêàçàòåëÿ */
Äàþò â ðåçóëüòàòå:
ß ëþáëþ ÌÈËËÈ!
Ïðåäïîëîæèì, ìû õîòèì çàìåíèòü head íà heart. Ìû ìîæåì ñêàçàòü.
Head = heart /* òåïåðü head óêàçûâàåò íà ìàññèâ håàrt */
Íî òåïåðü ìû ìîæåì ñêàçàòü.
Heart = head; /* çàïðåùåííàÿ êîíñòðóêöèÿ */
Ñèòóàöèÿ àíàëîãè÷íà õ = 3 èëè 3 = õ; ëåâàÿ ÷àñòü îïåðàòîðà ïðèñâàèâàíèÿ äîëæíà áûòü èìåíåì ïåðåìåííîé.  äàííîì ñëó÷àå head = heart; íå óíè÷òîæèò ñòðîêó Ìèëëè, à òîëüêî èçìåíèò àäðåñ, çàïèñàííûé â head. Âîò êàêèì ïóòåì ìîæíî èçìåíèòü îáðàùåíèå ê heart è ïðîíèêíóòü â ñàì ìàññèâ:
Heart[8] = 'Ì';
Èëè.
*(heart + 8) = 'Ì';
Ýëåìåíòû ìàññèâà (íî íå èìÿ) ÿâëÿþòñÿ ïåðåìåííûìè.
ßâíîå çàäàíèå ðàçìåðà ïàìÿòè.
Èíîé ïóòü âûäåëåíèÿ ïàìÿòè çàêëþ÷àåòñÿ â ÿâíîì åå çàäàíèè. Âî âíåøíåì îïèñàíèè ìû ìîãëè áû ñêà÷àòü:
Char m1[44] = "Òîëüêî îãðàíè÷üòåñü îäíîé ñòðîêîé.";
Âìåñòî.
Char m1[ ] = "Òîëüêî îãðàíè÷üòåñü îäíîé ñòðîêîé.";
Ìîæíî áûòü óâåðåííûì, ÷òî ÷èñëî ýëåìåíòîâ ïî êðàéíåé ìåðå íà îäèí (ýòî ñíîâà íóëü-ñèìâîë) áîëüøå, ÷åì äëèíà ñòðîêè. Êàê è â äðóãèõ ñòàòè÷åñêèõ èëè âíåøíèõ ìàññèâàõ, ëþáûå íåèñïîëüçîâàííûå ýëåìåíòû àâòîìàòè÷åñêè èíèöèàëèçèðóþòñÿ íóëåì (êîòîðûé â ñèìâîëüíîì âèäå ÿâëÿåòñÿ íóëü-ñèìâîëîì, à íå ñèìâîëîì öèôðû íóëü).

ÐÈÑ. 13.2. Èíèöèàëèçàöèÿ ìàññèâà.
Îòìåòèì, ÷òî â íàøåé ïðîãðàììå ìàññèâó name çàäàí ðàçìåð:
Char name [81];
Ïîñêîëüêó ìàññèâ name äîëæåí ÷èòàòüñÿ âî âðåìÿ ðàáîòû ïðîãðàììû, ó êîìïèëÿòîðà íåò äðóãîãî ñïîñîáà óçíàòü çàðàíåå, ñêîëüêî ïàìÿòè íóæíî âûäåëèòü äëÿ ìàññèâà. Ýòî íñ ñèìâîëüíàÿ êîíñòàíòà, â êîòîðîé êîìïèëÿòîð ìîæåò ïîñ÷èòàòü ñèìâîëû. Ïîýòîìó ìû ïðåäïîëîæèëè, ÷òî 80 ñèìâîëîâ áóäåò äîñòàòî÷íî, ÷òîáû ïîìåñòèòü â ìàññèâ ôàìèëèþ ïîëüçîâàòåëÿ.
Ìàññèâû ñèìâîëüíûõ ñòðîê.
Îáû÷íî áûâàåò óäîáíî èìåòü ìàññèâ ñèìâîëüíûõ ñòðîê.  ýòîì ñëó÷àå ìîæíî èñïîëüçîâàòü èíäåêñ äëÿ äîñòóïà ê íåñêîëüêèì ðàçíûì ñòðîêàì. Ïîêàæåì ýòî íà ïðèìåðå:
Static char *mytal[LIM] = {"Áûñòðî ñêëàäûâàþ ÷èñëà",
"Òî÷íî óìíîæàþ",
"Çàïèñûâàþ äàííûå",
"Ïðàâèëüíî âûïîëíÿþ êîìàíäû",
"Ïîíèìàþ ÿçûê Ñè"};
Ðàçáåðåìñÿ â ýòîì îïèñàíèè. Âñïîìíèì, ÷òî LIM èìååò çíà÷åíèå 5, ìû ìîæåì ñêàçàòü, ÷òî mytal ÿâëÿåòñÿ ìàññèâîì, ñîñòîÿùèì èç ïÿòè óêàçàòåëåé íà ñèìâîëüíûå ñòðîêè. Êàæäàÿ ñòðîêà ñèìâîëîâ, êîíå÷íî æå, ïðåäñòàâëÿåò ñîáîé ñèìâîëüíûé ìàññèâ, ïîýòîìó ó íàñ åñòü ïÿòü óêàçàòåëåé íà ìàññèâû. Ïåðâûì óêàçàòåëåì ÿâëÿåòñÿ mytal[0], è îí ññûëàåòñÿ íà ïåðâóþ ñòðîêó. Âòîðîé óêàçàòåëü mytal[1] ññûëàåòñÿ íà âòîðóþ ñòðîêó. Êàæäûé óêàçàòåëü, â ÷àñòíîñòè, ññûëàåòñÿ íà ïåðâûé ñèìâîë ñâîåé ñòðîêè:
*mytal[0] == 'Á', *mytal[1] == 'Ò', mytal[2] == 'Ç'.
È ò. ä.
Èíèöèàëèçàöèÿ âûïîëíÿåòñÿ ïî ïðàâèëàì, îïðåäåëåííûì äëÿ ìàññèâîâ. Òåêñòû â êàâû÷êàõ ýêâèâàëåíòíû ñêîáî÷íîé çàïèñè.
{{...}, {...}, ..., {...}};
Ãäå ìíîãîòî÷èÿ ïîäðàçóìåâàþò òåêñòû, êîòîðûå ìû ïîëåíèëèñü íàïå÷àòàòü.  ïåðâóþ î÷åðåäü ìû õîòèì îòìåòèòü, ÷òî ïåðâàÿ ïîñëåäîâàòåëüíîñòü, çàêëþ÷åííàÿ â äâîéíûå êàâû÷êè, ñîîòâåòñòâóåò ïåðâûì ïàðíûì ñêîáêàì è èñïîëüçóåòñÿ äëÿ èíèöèàëèçàöèè ïåðâîãî óêàçàòåëÿ ñèìâîëüíîé ñòðîêè. Ñëåäóþùàÿ ïîñëåäîâàòåëüíîñòü â äâîéíûõ êàâû÷êàõ èíèöèàëèçèðóåò âòîðîé óêàçàòåëü è ò. ä. Çàïÿòàÿ ðàçäåëÿåò ñîñåäíèå ïîñëåäîâàòåëüíîñòè.
Êðîìå òîãî, ìû ìîãëè áû ÿâíî çàäàâàòü ðàçìåð ñòðîê ñèìâîëîâ, èñïîëüçóÿ îïèñàíèå, ïîäîáíîå òàêîìó:
Static char mytal[LIM][LINLIM];
Ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî âòîðîé èíäåêñ çàäàåò "ïðÿìîóãîëüíûé" ìàññèâ, â êîòîðîì âñå "ðÿäû" (ñòðîêè) èìåþò îäèíàêîâóþ äëèíó. Îïèñàíèå.
Static char *mytal [LIM].
Îäíàêî, îïðåäåëÿåò "ðâàíûé" ìàññèâ, ãäå äëèíà êàæäîãî "ðÿäà" îïðåäåëÿåòñÿ òîé ñòðîêîé, êîòîðàÿ ýòîò "ðÿä" èíèöèàëèçèðîâàëà. Ðâàíûé ìàññèâ íå òðàòèò ïàìÿòü íàïðàñíî.

ÐÈÑ. 13.3. Ïðÿìîóãîëüíûé ìàññèâ èëè ðâàíûé.
Óêàçàòåëè è ñòðîêè.
Âîçìîæíî, âû çàìåòèëè ïåðèîäè÷åñêîå óïîìèíàíèå óêàçàòåëåé â íàøåì ðàññêàçå î ñòðîêàõ. Áîëüøèíñòâî îïåðàöèè ÿçûêà Ñè, èìåþùèõ äåëî ñî ñòðîêàìè, ðàáîòàåò ñ óêàçàòåëÿìè. Íàïðèìåð, ðàññìîðèì ïðèâåäåííóþ íèæå áåñïîëåçíóþ, íî ïîó÷èòåëüíóþ ïðîãðàììó.
/* óêàçàòåëè è ñòðîêè */
#define PX(X) printf("X = %s; çíà÷åíèå = %u; &X = %u\n", X, X, &X).
Main( ) {
Static char *mesg = "He äåëàé ãëóïîñòåé!";
Static char *copy;
Copy = mesg;
Printf(" %s \n" , copy);
PX(mesg);
PX(copy);
}
Âçãëÿíóâ íà ýòó ïðîãðàììó, âû ìîæåòå ïîäóìàòü, ÷òî îíà êîïèðóåò ñòðîêó "Íå äåëàé ãëóïîñòåé!", è ïðè áåãëîì âçãëÿäå íà âûâîä âàì ìîæåò ïîêàçàòüñÿ ïðàâèëüíûì ýòî ïðåäïîëîæåíèå:
He äåëàé ãëóïîñòåé!
Mesg = He äåëàé ãëóïîñòåé!; çíà÷åíèå = 14; &mesg = 32.
Copy = He äåëàé ãëóïîñòåé!; çíà÷åíèå = 14; &ñîðó = 34.
Íî èçó÷èì âûâîä ÐÕ(). Ñíà÷àëà X, êîòîðûé ïîñëåäîâàòåëüíî ÿâëÿåòñÿ mesg è ñîðó, ïå÷àòàåòñÿ êàê ñòðîêà (%s). Çäåñü íåò ñþðïðèçà. Âñå ñòðîêè ñîäåðæàò "Íå äåëàé ãëóïîñòåé!".
Äàëåå ... âåðíåìñÿ ê ýòîìó íåñêîëüêî ïîçäíåå.
Òðåòüèì ýëåìåíòîì â êàæäîé ñòðîêå ÿâëÿåòñÿ &X, ò. å. àäðåñ X. Óêàçàòåëè mesg è copy çàïèñàíû â ÿ÷åéêàõ 32 è 34 ñîîòâåòñòâåííî.
Òåïåðü î âòîðîì ýëåìåíòå, êîòîðûé ìû íàçûâàåì çíà÷åíèåì. Ýòî ñàì X. Çíà÷åíèåì óêàçàòåëÿ ÿâëÿåòñÿ àäðåñ, êîòîðûé îí ñîäåðæèò. Ìû âèäèì, ÷òî mesg ññûëàåòñÿ íà ÿ÷åéêó 14, è ïîýòîìó âûïîëíÿåòñÿ ñîðó.
Ñìûñë çàêëþ÷àåòñÿ â òîì, ÷òî ñàìà ñòðîêà íèêîãäà íå êîïèðóåòñÿ. Îïåðàòîð copy=mesg; ñîçäàñò âòîðîé óêàçàòåëü, ññûëàþùèéñÿ íà òó æå ñàìóþ ñòðîêó.
Çà÷åì âñå ýòè ïðåäîñòîðîæíîñòè? Ïî÷åìó áû íå ñêîïèðîâàòü âñþ ñòðîêó? Õîðîíþ, à ÷òî ýôôåêòèâíåå - êîïèðîâàòü îäèí àäðåñ èëè, ñêàæåì, 50 îòäåëüíûõ ýëåìåíòîâ ? ×àñòî áûâàåò, ÷òî àäðåñ ýòî âñå, ÷òî íåîáõîäèìî äëÿ âûïîëíåíèÿ ðàáîòû.
Òåïåðü, êîãäà ìû îáñóäèëè îïðåäåëåíèå ñòðîê â ïðîãðàììå, äàâàéòå çàéìåìñÿ ââîäîì ñòðîê.
ÂÂÎÄ ÑÒÐÎÊ.
Ïðîöåññ ââîäà ñòðîêè âûïîëíÿåòñÿ çà äâà øàãà: âûäåëåíèå ïàìÿòè äëÿ çàïîìèíàíèÿ ñòðîêè è ïðèìåíåíèå ôóíêöèè ââîäà äëÿ ïîëó÷åíèÿ ñòðîêè.
Âûäåëåíèå ïàìÿòè.
Ñíà÷àëà ñëåäóåò îïðåäåëèòü ìåñòî äëÿ ðàçìåùåíèÿ ñòðîêè ïðè ââîäå. Êàê áûëî îòìå÷åíî ðàíüøå, ýòî çíà÷èò, âûäåëèòü ïàìÿòü, äîñòàòî÷íóþ äëÿ ðàçìåùåíèÿ ëþáûõ ñòðîê, êîòîðûå ìû ïðåäïîëàãàåì ÷èòàòü. Íå ñëåäóåò íàäåÿòüñÿ, ÷òî êîìïüþòåð ïîäñ÷èòàåò äëèíó ñòðîêè ïðè åå ââîäå, à çàòåì âûäåëèò äëÿ íåñ ïàìÿòü. Îí íå áóäåò ýòîãî äåëàòü (åñëè òîëüêî âû íå íàïèøèòå ïðîãðàììó, êîòîðàÿ äîëæíà ýòî âûïîëíÿòü). Åñëè âû ïîïûòàåòåñü ñäåëàòü ÷òî-òî ïîäîáíîå.
Static char *name;scanf(" %s", name);
Êîìïèëÿòîð, âåðîÿòíî, âûïîëíèò íóæíûå äåéñòâèÿ. Íî ïðè ââîäå èìÿ áóäåò çàïèñûâàòüñÿ íà äàííûå èëè òåêñò âàøåé ïðîãðàììû. Áîëüøèíñòâî ïðîãðàììèñòîâ ñ÷èòàåò ýòî î÷åíü çàáàâíûì, íî òîëüêî â ÷óæèõ ïðîãðàììàõ. Ïðîùå âñåãî âêëþ÷èòü â îïèñàíèå ÿâíûé ðàçìåð ìàññèâà:
Char name[81];
Ìîæíî òàêæå èñïîëüçîâàòü áèáëèîòå÷íûå ôóíêöèè ÿçûêà Ñè, êîòîðûå ðàñïðåäåëÿþò íàìÿòü, è ìû ðàññìîòðèì èõ â ãë. 15.
 íàøåé ïðîãðàììå äëÿ name èñïîëüçîâàëñÿ àâòîìàòè÷åñêèé ìàññèâ. Ìû ñìîãëè ýòî ñäåëàòü, ïîòîìó ÷òî íå òðåáîâàëîñü èíèöèàëèçàöèè ìàññèâà.
Êàê òîëüêî âûäåëåíà ïàìÿòü äëÿ ìàññèâà, ìîæíî ñ÷èòûâàòü ñòðîêó. Ìû óæå óïîìèíàëè, ÷òî ïðîãðàììû ââîäà íå ÿâëÿþòñÿ ÷àñòüþ ÿçûêà. Îäíàêî áîëüøèíñòâî ñèñòåì èìåþò äâå áèáëèîòå÷íûå ôóíêöèè scanf( ) è gets( ), êîòîðûå ìîãóò ñ÷èòûâàòü ñòðîêè. ×àùå âñåãî èñïîëüçóåòñÿ ôóíêöèÿ gets( ), ïîýòîìó ìû âíà÷àëå ðàññêàæåì î íåé.
Ôóíêöèÿ gets( ).
Ýòà ôóíêöèÿ ñ÷èòûâàíèÿ ñòðîêè î÷åíü óäîáíà äëÿ äèàëîãîâûõ ñèñòåì. Îíà ïîëó÷àåò ñòðîêó îò ñòàíäàðòíîãî óñòðîéñòâà ââîäà âàøåé ñèñòåìû, êîòîðûì, êàê ìû ïðåäïîëàãàåì, ÿâëÿåòñÿ êëàâèàòóðà. Ïîñêîëüêó ñòðîêà íå èìååò çàðàíåå çàäàííîé äëèíû, ôóíêöèÿ gets( ) äîëæíà çíàòü, êîãäà åé ïðåêðàòèòü ðàáîòó. Ôóíêöèÿ ÷èòàåò ñèìâîëû äî òåõ ïîð, ïîêà åé íå âñòðåòèòñÿ ñèìâîë íîâîé ñòðîêè ('\n'), êîòîðûé âû ñîçäàåòå, íàæèìàÿ êëàâèøó [ââîä]. Ôóíêöèÿ áåðåò âñå ñèìâîëû äî (íî íå âêëþ÷àÿ) ñèìâîëà íîâîé ñòðîêè, ïðèñîåäèíÿåò ê íèì íóëü-ñèìâîë ('\0') è ïåðåäàåò ñòðîêó âûçûâàþùåé ïðîãðàììå. Âîò ïðîñòîé ñïîñîá èñïîëüçîâàíèÿ ôóíêöèè.
/* ïîëó÷åíèå èìåíè1 */
Main( ).
{
Char name[81]; /* âûäåëåíèå ïàìÿòè */
Printf(" Ïðèâåò, êàê âàñ çîâóò?\n");
Gets(name); /* ðàçìåùåíèå ââåäåííîãî èìåíè â ñòðîêó "name" */
Printf(" Õîðîøåå èìÿ, %s. \n" , name);
}
Ôóíêöèÿ ïðèìåò ëþáîå èìÿ (âêëþ÷àÿ ïðîáåëû) äëèíîé äî 80 ñèìâîëîâ. (Íå çàáóäüòå çàïàñòè îäèí ñèìâîë äëÿ '\0'.)
Îòìåòèì, ÷òî ìû õîòåëè ïðè ïîìîùè ôóíêöèè gets( ) âîçäåéñòâîâàòü íà íå÷òî (name) â âûçûâàþùåé ïðîãðàììå. Çíà÷èò, íóæíî èñïîëüçîâàòü óêàçàòåëü â êà÷åñòâå àðãóìåíòà; à èìÿ ìàññèâà, êîíå÷íî, ÿâëÿåòñÿ åãî óêàçàòåëåì.
Ôóíêöèÿ gets( ) îáëàäàåò áîëüøèìè âîçìîæíîñòÿìè, ÷åì ïîêàçàíî â ïîñëåäíåì ïðèìåðå. Âçãëÿíèòå íà ýòó ïðîãðàììó:
/* ïîëó÷åíèå èìåíè2 */
Main( ).
{
Char name [80];
Char *ptr, *gets( );
Printf(" Ïðèâåò, êàê âàñ çîâóò?\n");
Ptr = gets(name);
Printf(" %s? Ax! %s!\n", name, ptr);
}
Ïîëó÷èëñÿ äèàëîã:
Ïðèâåò, êàê âàñ çîâóò?
Òîíè äå Òóíà.
Òîíè äå Òóíà? Àõ! Òîíè äå Òóíà!
Ôóíêöèÿ gets( ) ïðåäîñòàâëÿåò âàì äâà ñïîñîáà ââîäà ñòðîêè!
1. Èñïîëüçóåò ìåòîä óêàçàòåëåé äëÿ ïåðåäà÷è ñòðîêè â name.
2. Èñïîëüçóåò êëþ÷åâîå ñëîâî return äëÿ âîçâðàòà ñòðîêè â ptr.
Íàïîìíèì, ÷òî ptr ÿâëÿåòñÿ óêàçàòåëåì íà òèï char. Ýòî îçíà÷àåò, ÷òî gets( ) äîëæíà âåðíóòü çíà÷åíèå, êîòîðîå ÿâëÿåòñÿ óêàçàòåëåì íà òèï char. È â ïðèâåäåííîì âûøå èçëîæåíèè âû ìîæåòå óâèäåòü, ÷òî ìû òàê è îïèñàëè gets( ).
Îïèñàíèå âèäà.
Char *gets( );
Ãîâîðèò î òîì, ÷òî gets( ) ÿâëÿåòñÿ ôóíêöèåé (îòñþäà êðóãëûå ñêîáêè) òèïà "óêàçàòåëü íà òèï char" (ïîýòîìó * è char).  ïðèìåðå ïîëó÷åíèå èìåíè1 ìû îáõîäèëèñü áåç ýòîãî îïèñàíèÿ, ïîòîìó ÷òî ìû íèêîãäà íå ïûòàëèñü èñïîëüçîâàòü âîçâðàùåííîå çíà÷åíèå ôóíêöèè gets( ).
Ìåæäó ïðî÷èì, âû ìîæåòå òàêæå îïèñàòü óêàçàòåëü íà ôóíêöèþ. Ýòî âûãëÿäåëî áû ñëåäóþùèì îáðàçîì:
Char (*foop)( );
È foop áûë áû óêàçàòåëåì íà ôóíêöèþ òèïà char. Ìû ðàññêàæåì íåìíîãî ïîäðîáíåå î òàêèõ ïðè÷óäëèâûõ îïèñàíèÿõ â ãë. 14.
Ñòðóêòóðà ôóíêöèè gets( ) âûãëÿäåëà áû ïðèìåðíî òàê:
Char *gets(s);
Char *s;
{
Char *p;
Return(p);
}
Íà ñàìîì äåëå ñòðóêòóðà íåìíîãî ñëîæíåå, è äëÿ gets( ) åñòü äâå âîçìîæíîñòè âîçâðàòà. Åñëè âñå èäåò õîðîøî, îíà âîçâðàùàåò ñ÷èòàííóþ ñòðîêó, êàê ìû óæå ñêàçàëè. Åñëè ÷òî-òî íåïðàâèëüíî èëè åñëè gets( ) âñòðå÷àåò ñèìâîë EOF, îíà âîçâðàùàåò NULL, èëè íóëåâîé àäðåñ. Òàêèì îáðàçîì gets( ) âêëþ÷àåò ðàçðÿä ïðîâåðêè îøèáêè. Ïîýòîìó äàííàÿ ôóíêöèÿ óäîáíà äëÿ èñïîëüçîâàíèÿ â êîíñòðóêöèÿõ, ïîäîáíûõ.
While(gets(name) != NULL).
Ãäå NULL îïðåäåëåí â ôàéëå stdio.h êàê 0. Ïðè ïîìîùè óêàçàòåëÿ ìàññèâó name ïðèñâàèâàåòñÿ çíà÷åíèå. Íàëè÷èå âîçâðàòà ïîçâîëÿåò ïðèñâàèâàòü çíà÷åíèå âñåé gets(name) è âûïîëíÿòü ïðîâåðêó íà EOF. Ýòîò äâîÿêèé ïîäõîä áîëåå êîìïàêòåí, ÷åì èñïîëüçîâàíèå ôóíêöèè getchar( ), êîòîðàÿ èìååò âîçâðàò áåç àðãóìåíòà.
While((ch = getchar( )) != EOF).
Ôóíêöèÿ scanf( ).
Ìû óæå èñïîëüçîâàëè ðàíåå ôóíêöèþ scanf( ) è ôîðìàò %s äëÿ ñ÷èòûâàíèÿ ñòðîêè. Îñíîâíîå ðàçëè÷èå ìåæäó scanf( ) è gets( ) çàêëþ÷àåòñÿ â òîì, êàê îíè îïðåäåëÿþò, ÷òî äîñòèãëè êîíöà ñòðîêè: scanf( ) ïðåäíàçíà÷åíà ñêîðåå äëÿ ïîëó÷åíèÿ ñëîâà, à íå ñòðîêè. Ôóíêöèÿ gets( ), êàê ìû óæå âèäåëè, ïðèíèìàåò âñå ñèìâîëû äî òåõ ïîð, ïîêà íñ âñòðåòèò ïåðâûé ñèìâîë "íîâàÿ ñòðîêà". Ôóíêöèÿ scanf( ) èìååò äâà âàðèàíòà. Äëÿ ëþáîãî èç íèõ ñòðîêà íà÷èíàåòñÿ ñ ïåðâîãî âñòðåòèâøåãîñÿ íåïóñòîãî ñèìâîëà. Åñëè âû èñïîëüçóåòå ôîðìàò %s, ñòðîêà ïðîäîëæàåòñÿ äî (íî íå âêëþ÷àÿ) ñëåäóþùåãî ïóñòîãî ñèìâîëà (ïðîáåë, òàáóëÿöèÿ èëè íîâàÿ ñòðîêà). Åñëè âû îïðåäåëÿåòå ðàçìåð ïîëÿ êàê %10s, òî ôóíêöèÿ scanf( ) ñ÷èòàåò íå áîëåå 10 ñèìâîëîâ èëè æå ñ÷èòàåò äî ëþáîãî ïðèøåäøåãî ïåðâûì ïóñòîãî ñèìâîëà.
Ôóíêöèÿ scanf( ) âîçâðàùàåò öåëîå çíà÷åíèå, ðàâíîå ÷èñëó ñ÷è òàííûõ ñèìâîëîâ, åñëè ââîä ïðîøåë óñïåíèþ, èëè ñèìâîë ÅÎF, åå ëè îí âñòðåòèëñÿ.
/* scanf( ) è ïîäñ÷åò êîëè÷åñòâà */
Main( ).
{
Static char name1[40], name2[11];
Int count;
Printf(" Ââåäèòå, ïîæàëóéñòà, 2 èìåíè.\n");
Count = scanf(" %s %10s", name1, name2);
Printf(" ß ñ÷èòàë %d èìåí %s è %s.\n", count, name1, name2);
}
Âîò äâà ïðèìåðà ðàáîòû ïðîãðàììû:
Ââåäèòå, ïîæàëóéñòà, äâà èìåíè.
Äæñññèêà Äæóêñ.
ß ñ÷èòàë äâà èìåíè.
Äæñññèêà è Äæóêñ.
Ââåäèòå, ïîæàëóéñòà, 2 èìåíè.
Ëèçà Àïïëåáîòòõýì.
ß ñ÷èòàë 2 èìåíè Ëèçà è Àïïëåáîòòõýì.
Âî âòîðîì ïðèìåðå áûëè ñ÷èòàíû òîëüêî ïåðâûå 10 ñèìâîëîâ îò Àïïëåáîòòõýì, òàê êàê ìû èñïîëüçîâàëè ôîðìàò %10s.
Åñëè âû ïîëó÷àåòå òîëüêî òåêñò ñ êëàâèàòóðû, ëó÷øå ïðèìåíÿòü, ôóíêöèþ gets( ). Îíà ïðîùå â èñïîëüçîâàíèè, áûñòðåå è áîëåå êîìïàêòíà. Ôóíêöèÿ scanf( ) ïðåäíàçíà÷åíà â îñíîâíîì äëÿ ââîäà ñìåñè òèïîâ äàííûõ â íåêîòîðîé ñòàíäàðòíîé ôîðìå. Íàïðèìåð, åñëè êàæäàÿ ââîäèìàÿ ñòðîêà ñîäåðæèò íàèìåíîâàíèå èíñòðóìåíòà, êîëè÷åñòâî åãî íà ñêëàäå è ñòîèìîñòü êàæäîãî èíñòðóìåíòà, âû ìîæåòå èñïîëüçîâàòü ôóíêöèþ scanf( ) èëè ìîæåòå ñîçäàòü ñâîþ ñîáñòâåííóþ ôóíêöèþ, êîòîðàÿ âûïîëíÿåò ïðîâåðêó íåêîòîðûõ îøèáîê ïðè ââîäå.
ÂÛÂÎÄ ÑÒÐÎÊ
Îïÿòü ìû äîëæíû ïîëàãàòüñÿ íà áèáëèîòå÷íûå ôóíêöèè, êîòîðûå ìîãóò íåìíîãî èçìåíÿòüñÿ îò ñèñòåìû ê ñèñòåìå. Ôóíêöèè puts( ) è printf( ) - äâå ðàáî÷èå ëîøàäêè, èñïîëüçóåìûå ïðè âûâîäå ñòðîê.
Ôóíêöèÿ puts( ).
Ýòî î÷åíü ïðîñòàÿ ôóíêöèÿ; ó íåå åñòü òîëüêî îäèí àðãóìåíò, ÿâëÿþùèéñÿ óêàçàòåëåì ñòðîêè. Íèæåñëåäóþùèé ïðèìåð èëëþñòðèðóåò íåêîòîðûå èç ìíîãèõ ñïîñîáîâ åå ïðèìåíåíèÿ.
/* ïðîñòûå âûäà÷è */
#include <stdio.h>
#define DEF "ß ñòðîêà #define.".
Main( ).
{
Static char str1[ ] = "Ìàññèâ èíèöèàëèçèðîâàí ìíîé.";
Static char *str2 = "Óêàçàòåëü èíèöèàëèçèðîâàí ìíîé.";
Puts(" ß àðãóìåíò ôóíêöèè puts( )." );
Puts(DEF);
Puts(str1);
Puts(str2);
Puts(&str1[4]);
Puts(str2 + 4);
}
 ðåçóëüòàòå ðàáîòû ïðîãðàììû ïîëó÷àåì.
ß àðãóìåíò ôóíêöèè puts( ).
ß ñòðîêà #define.
Ìàññèâ èíèöèàëèçèðîâàí ìíîé.
Óêàçàòåëü èíèöèàëèçèðîâàí ìíîé.
Èâ èíèöèàëèçèðîâàí ìíîé.
Àòåëü èíèöèàëèçèðîâàí ìíîé.
Ýòîò ïðèìåð íàïîìèíàåò íàì, ÷òî ôðàçû â êàâû÷êàõ è èìåíà ñòðîê ñèìâîëüíûõ ìàññèâîâ ÿâëÿþòñÿ óêàçàòåëÿìè. Îáðàòèòå âíèìàíèå íà äâà ïîñëåäíèõ îïåðàòîðà. Óêàçàòåëü &strl[4] ññûëàåòñÿ íà ïÿòûé ýëåìåíò ìàññèâà str1. Ýòîò ýëåìåíò ñîäåðæèò ñèìâîë 'è', è ôóíêöèÿ puts( ) èñïîëüçóåò åãî â êà÷åñòâå íà÷àëüíîé òî÷êè. Àíàëîãè÷íî str2 + 4 ññûëàåòñÿ íà ÿ÷åéêó ïàìÿòè, ñîäåðæàùóþ 'à' â "óêàçàòåëå", è ñ íåå íà÷èíàåòñÿ âûâîä ñòðîêè.
Êàê puts( ) óçíàåò, êîãäà îñòàíîâèòüñÿ? Îíà ïðåêðàùàåò ðàáîòó, åñëè âñòðå÷àåò íóëü-ñèìâîë, ïîýòîìó ëó÷øå, ÷òîáû îí áûë. Íå ïûòàéòåñü äåëàòü òàê!
/* íåò ñòðîêè! */
Main( ).
{
Static char dont[ ] = (' H', ' Ã , ' ! ', ' ! ');
Puts(dont); /* dont íå ÿâëÿåòñÿ ñòðîêîé */
}
Ïîñêîëüêó â dont îòñóòñòâóåò çàâåðøàþùèé íóëü-ñèìâîë, îíà íå ÿâëÿåòñÿ ñòðîêîé. Òàê êàê íóëü-ñèìâîë îòñóòñòâóåò, puts( ) íå çíàåò, êîãäà åé îñòàíàâëèâàòüñÿ. Îíà áóäåò ïðîñòî ïåðåáèðàòü ÿ÷åéêè ïàìÿòè, ñëåäóþùèå çà dont äî òåõ ïîð, ïîêà íå íàéäåò ãäå-íèáóäü íóëü-ñèìâîë. Åñëè ïîâåçåò, îíà, ìîæåò áûòü, íàéäåò åãî â áëèæàéøåé ÿ÷åéêå, íî ìîæåò è íå ïîâåçòè.
Îáðàòèòå âíèìàíèå, ÷òî ëþáàÿ ñòðîêà, ââîäèìàÿ ôóíêöèåé puts( ), íà÷èíàåòñÿ ñ íîâîé ñòðîêè. Åñëè puts( ) â êîíöå êîíöîâ íàõîäèò çàâåðøàþùèé íóëü-ñèìâîë, îíà çàìåíÿåò åãî ñèìâîëîì "íîâîé ñòðîêè" è çàòåì âûâîäèò ñòðîêó.
Ôóíêöèÿ printf( ).
Ìû óæå îáñóæäàëè ôóíêöèþ printf( ) äîâîëüíî îñíîâàòåëüíî. Ïîäîáíî puts( ), îíà èñïîëüçóåò óêàçàòåëü ñòðîêè â êà÷åñòâå àðãóìåíòà. Ôóíêöèÿ printf( ) ìåíåå óäîáíà, ÷åì puts( ), íî áîëåå ãèáêà.
Ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî printf( ) íå âûâîäèò àâòîìàòè÷åñêè êàæäóþ ñòðîêó òåêñòà ñ íîâîé ñòðîêè. Âû äîëæíû óêàçàòü, ÷òî õîòèòå âûâîäèòü ñ íîâûõ ñòðîê. Òàê,
Printf(" %s\n" , string);
Äàåò òî æå ñàìîå, ÷òî è.
Puts(string);
Âû ìîæåòå âèäåòü, ÷òî ïåðâûé îïåðàòîð òðåáóåò ââîäà áîëüøåãî ÷èñëà ñèìâîëîâ è áîëüøåãî âðåìåíè ïðè âûïîëíåíèè íà êîìïüþòåðå. Ñ äðóãîé ñòîðîíû, printf( ) ïîçâîëÿåò ëåãêî îáúåäèíÿòü ñòðîêè äëÿ ïå÷àòè èõ â îäíîé ñòðîêå. Íàïðèìåð:
Printf(" Õîðîøî, %s, %s \n", name, MSG);
Îáúåäèíÿåò " Õîðîøî" ñ èìåíåì ïîëüçîâàòåëÿ è c ñèìâîëüíîé ñòðîêîé MSG â îäíó ñòðîêó.
ÑÎÇÄÀÍÈÅ ÑÎÁÑÒÂÅÍÍÛÕ ÔÓÍÊÖÈÉ.
Íå îãðàíè÷èâàéòå ñåáÿ ïðè ââîäå è âûâîäå òîëüêî ýòèìè áèáëèîòå÷íûìè ôóíêöèÿìè. Åñëè ó âàñ íåò íóæíîé ôóíêöèè, èëè îíà âàì íå íðàâèòñÿ, ìîæíî ñîçäàâàòü ñâîè ñîáñòâåííûå âåðñèè, èñïîëüçóÿ äëÿ ýòîãî getchar( ) è putchar( ).
Ïðåäïîëîæèì, ó âàñ íåò ôóíêöèè puts( ). Âîò îäèí èç ïóòåé åå ñîçäàíèÿ:
/* put1 - ïå÷àòàåò ñòðîêó */
Put1(string);
Char *string;
{
While(*string != '\0') putchar(*string++);
Putchar('\n');
}
Ñèìâîëüíûé óêàçàòåëü string âíà÷àëå ññûëàåòñÿ íà ïåðâûé ýëåìåíò âûçâàííîãî àðãóìåíòà. Ïîñëå ïå÷àòè åãî ñîäåðæèìîãî óêàçàòåëü óâåëè÷èâàåòñÿ è ññûëàåòñÿ óæå íà ñëåäóþùèé ýëåìåíò. Ýòî ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà óêàçàòåëü íå äîéäåò äî ýëåìåíòà, ñîäåðæàùåãî íóëü-ñèìâîë. Çàòåì â êîíöå ñòðîêè áóäåò ïîñòàâëåí ñèìâîë íîâîé ñòðîêè.
Ïðåäïîëîæèì, ó âàñ åñòü puts( ), íî âàì íóæíà ôóíêöèÿ, êîòîðàÿ, êðîìå òîãî, ñîîáùàåò, ñêîëüêî íàïå÷àòàíî ñèìâîëîâ. Ýòó âîçìîæíîñòü ëåãêî äîáàâèòü:
/* put2- - ïå÷àòàåò ñòðîêó è ñ÷èòûâàåò ñèìâîëû */
Put2 (string);
Char *string;
{
Int count = 0;
While(*string != '\0') {
Putchar(* string++);
Count++;
Putchar('\n');
Return(count);
}
Âûçîâ:
Put2(" ïèööà" );
Ïå÷àòàåò ñòðîêó ïèööà, â òî âðåìÿ êàê îïåðàòîð.
Num = puts(" ïèööà");
Ïåðåäàñò, êðîìå òîãî, êîëè÷åñòâî ñèìâîëîâ â num; â äàííîì ñëó÷àå ýòî ÷èñëî 5. Âîò íåñêîëüêî áîëåå ñëîæíûé âàðèàíò, ïîêàçûâàþùèé âëîæåííûå ôóíêöèè:
/* âëîæåííûå ôóíêöèè */
#include <stdio.h>
Main( ).
{
Put1("Åñëè áû ÿ èìåë ñòîëüêî äåíåã, ñêîëüêî ìîãó ïîòðàòèòü,");
Ðrintf("ß ñ÷èòàþ %d ñèìâîëà.\n",
Put2(" ß íèêîãäà áû íå æàëîâàëñÿ, ÷òî ïðèõîäèòñÿ ÷èíèòü ñòàðûå ñòóëüÿ.");
}
(Ìû âêëþ÷èëè â ïðîãðàììó ïðè ïîìîùè äèðåêòèâû #include ôàéë stdio.h, ïîòîìó ÷òî â íàøåé ñèñòåìå â íåì îïðåäåëåíà ôóíêöèÿ putchar( ), à îíà èñïîëüçóåòñÿ â íàøåé íîâîé ôóíêöèè.).
Äà-à, ìû èñïîëüçóåì ôóíêöèþ printf( ) äëÿ ïå÷àòè çíà÷åíèÿ put2( ), íî â ïðîöåññå íàõîæäåíèÿ çíà÷åíèÿ put2( ) êîìïüþòåð äîëæåí ñíà÷àëà çàñòàâèòü åå ïîðàáîòàòü - íàïå÷àòàòü ñòðîêó. Âîò ÷òî ïîëó÷àåòñÿ ïðè ýòîì:
Åñëè áû ÿ èìåë ñòîëüêî äåíåã, ñêîëüêî ìîãó ïîòðàòèòü,
ß íèêîãäà áû íå æàëîâàëñÿ, ÷òî ïðèõîäèòñÿ ÷èíèòü ñòàðûå ñòóëüÿ.
ß ñ÷èòàþ 63 ñèìâîëà.
Òåïåðü âû ìîæåòå ïîñòðîèòü ðàáîòàþùóþ âåðñèþ ôóíêöèè gets( ); îíà äîëæíà áûòü ïîõîæà íà íàøó ôóíêöèþ getint( ) èç ãë. 10, íî ãîðàçäî ïðîùå åå.
ÔÓÍÊÖÈÈ, ÐÀÁÎÒÀÞÙÈÅ ÑÎ ÑÒÐÎÊÀÌÈ.
Áîëüøèíñòâî áèáëèîòåê ÿçûêà Ñè ñíàáæåíî ôóíêöèÿìè, ðàáîòàþùèìè ñî ñòðîêàìè. Ðàññìîòðèì ÷åòûðå íàèáîëåå ïîëåçíûõ è ðàñïðîñòðàíåííûõ: strlen( ), strcat( ), strcmp( ) è strcpy( ).
Ìû óæå ïðèìåíÿëè ôóíêöèþ strlen( ), êîòîðàÿ íàõîäèò äëèíó ñòðîêè. Èñïîëüçóåì åå â íèæåñëåäóþùåì ïðèìåðå ôóíêöèè, óêîðà÷èâàþùåé äëèííûå ñòðîêè.
Ôóíêöèÿ strlen( ).
/* Ôóíêöèÿ Ïðîêðóñòà */
Fit(string, size).
Char *string;
Int size;
{
If(strlen(string) > size).
*(string + size) = '\0';
}
Ïðîâåðüòå åå â "äåëå" â ýòîé òåñòîâîé ïðîãðàììå:
/* òåñò */
Main( ) {
Static char mesg[ ] = "Íó, òåïåðü äåðæèòåñü, êîìïüþòåðîìàíû.";
Puts(mesg);
Fit(mesg, 10);
Puts(mesg);
}
Ïðîãðàììà âûäàåò:
Íó, òåïåðü äåðæèòåñü, êîìïüþòåðîìàíû.
Íó, òåïåðü.
Íàøà ôóíêöèÿ ïîìåùàåò ñèìâîë '\0' â îäèííàäöàòûé ýëåìåíò ìàññèâà, çàìåíÿÿ ñèìâîë ïðîáåëà. Îñòàòîê ìàññèâà îñòàåòñÿ íà ñòàðîì ìåñòå, íî puts( ) ïðåêðàùàåò ðàáîòó íà ïåðâîì íóëü-ñèìâîëå è èãíîðèðóåò îñòàòîê ìàññèâà.
Ôóíêöèÿ strcat( ).
Âîò ÷òî óìååò äåëàòü ôóíêöèÿ strcat( ):
/* îáúåäèíåíèå äâóõ ñòðîê */
#include.
< stdio.h>
Main( ).
{
Static char flower [80];
Static char addon[ ] = "û ïàõíóò ñòàðûìè áîòèíêàìè.";
Puts(" Íàçîâèòå âàø ëþáèìûé öâåòîê." );
Gets(flower);
Strcat (flower, addon);
Puts(flower);
Puts(addon);
}
Ïîëó÷àåì íà ýêðàíå:
Íàçîâèòå âàø ëþáèìûé öâåòîê.
Èðèñ.
Èðèñû ïàõíóò ñòàðûìè áîòèíêàìè.
Î÷åâèäíî, ÷òî strcat( ) (string concatenation) èñïîëüçóåò â êà÷åñòâå àðãóìåíòîâ äâå ñòðîêè. Êîïèÿ âòîðîé ñòðîêè ïðèñîåäèíÿåòñÿ ê êîíöó ïåðâîé, è ýòî îáúåäèíåíèå ñòàíîâèòñÿ íîâîé ïåðâîé ñòðîêîé. Âòîðàÿ ñòðîêà íå èçìåíÿåòñÿ.
Âíèìàíèå! Ýòà ôóíêöèÿ íå ïðîâåðÿåò, óìåùàåòñÿ ëè âòîðàÿ ñòðîêà â ïåðâîì ìàññèâå. Åñëè âû îøèáëèñü ïðè âûäåëåíèè ïàìÿòè äëÿ ïåðâîãî ìàññèâà, òî ó âàñ âîçíèêíóò ïðîáëåìû. Êîíå÷íî, ìîæíî èñïîëüçîâàòü strlen( ) äëÿ îïðåäåëåíèÿ ðàçìåðà ñòðîêè äî îáúåäèíåíèÿ.
/* Îáúåäèíåíèå äâóõ ñòðîê, ïðîâåðêà ðàçìåðà ïåðâîé */
#include <stdio.h>
#define SIZE 80.
Main( ).
{
Static char flower[SIZE];
Static char addon[ ] = " û ïàõíóò ñòàðûìè áîòèíêàìè." ;
Puts(" Íàçîâèòå âàø ëþáèìûé öâåòîê. ");
Gets(flower);
If((strlen(addon) + strlen(flower) + 1) < SIZE).
strcat (flower, addon);
Puts(flower);
}
Ìû äîáàâëÿåì 1 ê îáúåäèíåííîé äëèíå äëÿ ðàçìåùåíèÿ íóëü-ñèìâîëà.
Ôóíêöèÿ strcmp( ).
Ïðåäïîëîæèì, ÷òî âû õîòèòå ñðàâíèòü ÷åé-òî îòâåò ñî ñòðîêîé, íàõîäÿùåéñÿ â ïàìÿòè:
/* Áóäåò ëè ýòî ðàáîòàòü? */
#include <stdio.h>
#define ANSWER " Ãðàíò".
Main( ).
{
Char try [40];
Puts(" Êòî ïîõîðîíåí â ìîãèëå Ãðàíòà?" );
Gets(try);
While(try != ANSWER).
Puts(" Íåò, íåâåðíî. Ïîïûòàéòåñü åùå ðàç." );
Gets(try);
} puts(" Ïðàâèëüíî.");
}
Õîòÿ ýòà ïðîãðàììà è ñìîòðèòñÿ íåïëîõî, îíà íå áóäåò ðàáîòàòü ïðàâèëüíî, try è ANSWER íà ñàìîì äåëå ÿâëÿþòñÿ óêàçàòåëÿìè, ïîýòîìó ñðàâíåíèå (try != ANSWER) ñïðàøèâàåò íå î òîì, îäèíàêîâû ëè ýòè äâå ñòðîêè, à îäèíàêîâû ëè äâà àäðåñà, íà êîòîðûå ññûëàþòñÿ try è ANSWER. Òàê êàê ANSWER è try çàïîìèíàþòñÿ â ðàçíûõ ÿ÷åéêàõ, ýòè äâà óêàçàòåëÿ íèêîãäà íå ìîãóò áûòü îäíèì è òåì æå, è ïîëüçîâàòåëþ âñåãäà ñîîáùàåòñÿ, ÷òî ïðîãðàììà íåâåðíà. Òàêèå ïðîãðàììû îáåñêóðàæèâàþò ëþäåé.
Íàì íóæíà ôóíêöèÿ, êîòîðàÿ ñðàâíèâàåò ñîäåðæèìîå ñòðîê, à íå èõ àäðåñà. Ìîæíî áûëî áû ïðèäóìàòü åå, íî ýòî óæå ñäåëàëà çà íàñ ôóíêöèÿ strcmp( ) (string comparision).
Òåïåðü èñïðàâèì íàøó ïðîãðàììó:
/* ýòî áóäåò ðàáîòàòü */
#inñludå <stdio.h>
#define ANSWER " Ãðàíò".
Main( ).
{
Char try [40];
Puts(" Êòî ïîõîðîíåí â ìîãèëå Ãðàíòà?" );
Gets(try);
While(strcmp(try, ANSWER) != 0).
{ puts(" Íåò, íåâåðíî. Ïîïûòàéòåñü åùå ðàç.");
Gets(try);
} puts(" Ïðàâèëüíî!");
}
Òàê êàê íåíóëåâûå çíà÷åíèÿ èíòåðïðåòèðóþòñÿ âñåãäà êàê "true", ìû ìîæåì ñîêðàòèòü îïåðàòîð while do while(strcmp(try, ANSWER)).
Èç ýòîãî ïðèìåðà ìîæíî ñäåëàòü âûâîä, ÷òî strcmp( ) èñïîëüçóåò äâà óêàçàòåëÿ ñòðîê â êà÷åñòâå àðãóìåíòîâ è âîçâðàùàåò çíà÷åíèå 0, åñëè ýòè äâå ñòðîêè îäèíàêîâû. Ïðåêðàñíî, åñëè âû ïðèäåòå ê òàêîìó âûâîäó.
Õîðîøî, ÷òî Strcmp( ) ñðàâíèâàåò ñòðîêè, à íå ìàññèâû. Ïîýòîìó, õîòÿ ìàññèâ try çàíèìàåò 40 ÿ÷ååê ïàìÿòè, à " Ãðàíò" - òîëüêî 6 (íå çàáûâàéòå, ÷òî îäíà íóæíà äëÿ íóëü-ñèìâîëà), ñðàâíåíèå âûïîëíÿåòñÿ òîëüêî ñ ÷àñòüþ try, äî åãî ïåðâîãî íóëü-ñèìâîëà. Òàêóþ ôóíêöèþ strcmp( ) ìîæíî èñïîëüçîâàòü äëÿ ñðàâíåíèÿ ñòðîê, íàõîäÿùèõñÿ â ìàññèâàõ ðàçíîé äëèíû.
À ÷òî åñëè ïîëüçîâàòåëü îòâåòèë " ÃÐÀÍÒ" èëè " ãðàíò" èëè "Óëèññåñ Ñ. Ãðàíò" ? Õîðîøî, åñëè ïîëüçîâàòåëþ ñêàçàëè, ÷òî îí îøèáñÿ? ×òîáû ñäåëàòü ïðîãðàììó ãèáêîé, âû äîëæíû ïðåäóñìîòðåòü íåñêîëüêî äîïóñòèìûõ ïðàâèëüíûõ îòâåòîâ. Çäåñü åñòü íåêîòîðûå òîíêîñòè. Âû ìîãëè áû â îïåðàòîðå #define îïðåäåëèòü â êà÷åñòâå îòâåòà " ÃÐÀÍÒ" è íàïèñàòü ôóíêöèþ, êîòîðàÿ ïðåâðàùàåò ëþáîé îòâåò òîëüêî â ýòî ñëîâî. Ýòî óñòðàíÿåò ïðîáëåìó íàêîïëåíèÿ, íî îñòàþòñÿ äðóãèå ïîâîäû äëÿ áåñïîêîéñòâà.
Ìåæäó ïðî÷èì, êàêîå çíà÷åíèå âîçâðàùàåò strcmp( ), åñëè ñòðîêè íå îäèíàêîâû? Âîò ïðèìåð:
/* âîçâðàòû ôóíêöèè strcmp */
#include <a: stdio.h>
Main( ).
{
Printf(" %d \n" , strcmp( "A" , " A" ));
Printf(" %d \n" , strcmp( "A" , " B" ));
Printf(" %d \n" , strcmp( "B" , " A" ));
Printf(" %d \n" , strcmp( "C" , "A" ));
Printf(" %d \n" , strcmp(" apples", " apple"));
}
 ðåçóëüòàòå ïîëó÷àåì.
0 -1.
1.
2 115.
Êàê ìû è ïðåäïîëàãàëè, ñðàâíåíèå "À" ñ ñàìèì ñîáîé âîçâðàùàåò 0. Ñðàâíåíèå "À" ñ "Â" äàåò -1, à "Â" ñ "À" äàåò 1. Ýòî íàâîäèò íà ìûñëü, ÷òî strcmp( ) âîçâðàùàåò îòðèöàòåëüíîå ÷èñëî, åñëè ïåðâàÿ ñòðîêà ïðåäøåñòâóåò âòîðîé â àëôàâèòíîì ïîðÿäêå, èëè ïîëîæèòåëüíîå ÷èñëî, åñëè ïîðÿäîê èíîé. Êðîìå òîãî, ñðàâíåíèå "Ñ" ñ "À" äàåò 2 âìåñòî 1. Êàðòèíà ïðîÿñíÿåòñÿ: ôóíêöèÿ âîçâðàùàåò ðàçíèöó ìåæäó äâóìÿ ñèìâîëàìè â êîäå ASCII.  áîëåå îáùåì ñìûñëå strcmp() ïåðåäâèãàåòñÿ âäîëü ñòðîê äî òåõ ïîð, ïîêà íå íàõîäèò ïåðâóþ ïàðó íå ñîâïàäàþùèõ ñèìâîëîâ; çàòåì îíà âîçâðàùàåò ðàçíèöó â êîäàõ ASCII. Íàïðèìåð, â ñàìîì ïîñëåäíåì ïðèìåðå "apples" è "apple" ñîâïàäàþò, êðîìå ïîñëåäíåãî ñèìâîëà 's', â ïåðâîé ñòðîêå. Îí ñîïîñòàâëÿåòñÿ ñ øåñòûì ñèìâîëîì â "apple", êîòîðûé ÿâëÿåòñÿ íóëü-ñèìâîëîì (0 â ASCII).
Âîçâðàùàåòñÿ çíà÷åíèå.
's' - '\0' = 115 - 0 = 115,
Ãäå 115 ÿâëÿåòñÿ êîäîì áóêâû 's' â ASCII.
Îáû÷íî âàì íå íóæíî òî÷íî çíàòü âîçâðàùàåìîå çíà÷åíèå. ×àùå âñåãî âû òîëüêî õîòèòå çíàòü, íóëü ýòî èëè íåò, ò. å. áûëî ëè ñîâïàäåíèå. Èëè, ìîæåò áûòü, âû ïûòàåòåñü îòñîðòèðîâàòü ñòðîêè â àëôàâèòíîì ïîðÿäêå è õîòèòå óçíàòü, â êàêîì ñëó÷àå ñðàâíåíèå äàåò ïîëîæèòåëüíûé, îòðèöàòåëüíûé èëè íóëåâîé ðåçóëüòàò.
Ìîæíî èñïîëüçîâàòü ýòó ôóíêöèþ, ÷òîáû ïðîâåðèòü, îñòàíîâèòñÿ ëè ïðîãðàììà, ÷èòàÿ ââîäèìóþ èíôîðìàöèþ:
/* Íà÷àëî êàêîé-òî ïðîãðàììû */
#include &stdio.h&
#define SIZE 81.
#define LIM 100.
#define STOP " " /* íóëåâàÿ ñòðîêà */
Main( ).
{
Static char input[LIM][SIZE];
Int ct = 0;
While(gets(input[ct]) != NUL && strcmp(input[ct].STOP) !=0.
&& ct++ < LIM).
...
}
Ïðîãðàììà ïðåêðàùàåò ÷òåíèå ââîäèìîé ñòðîêè, åñëè âñòðå÷àåò ñèìâîë EOF [â ýòîì ñëó÷àå gets( ) âîçâðàùàåò NULL], èëè åñëè âû íàæèìàåòå êëàâèøó [ââîä] â íà÷àëå ñòðîêè (ò.e. ââåäåòå ïóñòóþ ñòðîêó), èëè åñëè âû äîñòèãëè ïðåäåëà LIM. ×òåíèå ïóñòîé ñòðîêè äàåò ïîëüçîâàòåëþ ïðîñòîé ñïîñîá ïðåêðàùåíèÿ ââîäà.
Äàâàéòå ïåðåéäåì ê ïîñëåäíåé èç îáñóæäàåìûõ íàìè ôóíêöèé, ðàáîòàþùèõ ñî ñòðîêàìè.
Ôóíêöèÿ strcpy( ).
Ìû óæå ãîâîðèëè, ÷òî åñëè pts1 è pts2 ÿâëÿþòñÿ óêàçàòåëÿìè ñòðîê, òî âûðàæåíèå.
Pts2 = ptsl;
Êîïèðóåò òîëüêî àäðåñ ñòðîêè, à íå ñàìó ñòðîêó. Ïðåäïîëîæèì, ÷òî âû âñå æå õîòèòå ñêîïèðîâàòü ñòðîêó.  ýòîì ñëó÷àå ìîæíî èñïîëüçîâàòü ôóíêöèþ strcpy( ). Îíà ðàáîòàåò ïðèìåðíî òàê:
/* äåìîíñòðàöèÿ strcpy( ) */
#include <stdio.h>
#define WORDS "Ïðîâåðüòå, ïîæàëóéñòà, âàøó ïîñëåäíþþ ÷àïèñü.".
Main( ) {
Static char *orig = WORDS;
Static char copy [40];
Puts(orig);
Puts(copy);
Strcpy(copy, orig);
Puts(orig);
Puts(copy);
}
Âîò ðåçóëüòàò:
Ïðîâåðüòå, ïîæàëóéñòà, âàøó ïîñëåäíþþ çàïèñü.
Ïðîïåðüòå, ïîæàëóéñòà, ïàøó ïîñëåäíþþ çàïèñü.
Ïðîâåðüòå. ïîæàëóéñòà, ïàøó ïîñëåäíþþ çàïèñü.
Î÷åâèäíî, ÷òî ñòðîêà, íà êîòîðóþ óêàçûâàåò âòîðîé àðãóìåíò (orig) ôóíêöèè strcpy( ), ñêîïèðîâàíà â ìàññèâ, íà êîòîðûé óêàçûâàåò ïåðâûé àðãóìåíò (copy). Ïîðÿäîê àðãóìåíòîâ ôóíêöèè òàêîé æå, êàê â îïåðàòîðå ïðèñâàèâàíèÿ: ñòðîêà, ïîëó÷àþùàÿ çíà÷åíèå, ñòîèò ñëåâà. (Ïóñòàÿ ñòðîêà ÿâëÿåòñÿ ðåçóëüòàòîì ïå÷àòè ìàññèâà copy äî êîïèðîâàíèÿ, è îíà ãîâîðèò î òîì, ÷òî ñòàòè÷åñêèå ìàññèâû .èíèöèàëèçèðóþòñÿ íóëÿìè, ò. å. íóëü-ñèìâîëàìè â ñèìâîëüíîì âèäå.).
Íóæíî îáåñïå÷èòü, ÷òîáû ðàçìåð ìàññèâà, ïðèíèìàþùåãî ñòðîêó, áûë äîñòàòî÷åí äëÿ åå ðàçìåùåíèÿ. Ïîýòîìó ìû èñïîëüçóåì îïèñàíèå.
Static char copy [40];
À íå.
Static char *copy; /* íå âûäåëÿåò ïàìÿòü äëÿ ñòðîêè */
Êîðî÷å ãîâîðÿ, strcpy() òðåáóåò äâà óêàçàòåëÿ ñòðîê â êà÷åñòâå àðãóìåíòîâ. Âòîðîé óêàçàòåëü, ññûëàþùèéñÿ íà èñõîäíóþ ñòðîêó, ìîæåò áûòü îáúÿâëåííûì óêàçàòåëåì, èìåíåì ìàññèâà èëè ñòðîêîâîé êîíñòàíòîé. À ïåðâûé óêàçàòåëü, ññûëàþùèéñÿ íà êîïèþ, äîëæåí ññûëàòüñÿ íà ìàññèâ èëè ÷àñòü ìàññèâà, èìåþùåãî ðàçìåð, äîñòàòî÷íûé äëÿ ðàçìåùåíèÿ ñòðîêè.
Òåïåðü, êîãäà ìû îïèñàëè íåñêîëüêî ôóíêöèé, ðàáîòàþùèõ ñî ñòðîêàìè, ðàññìîòðèì öåëóþ ïðîãðàììó, ðàáîòàþùóþ ñî ñòðîêàìè.
ÏÐÈÌÅÐ: ÑÎÐÒÈÐÎÂÊÀ ÑÒÐÎÊ.
Âîçüìåì ðåàëüíóþ çàäà÷ó ñîðòèðîâêè ñòðîê â àëôàâèòíîì ïîðÿäêå. Ýòà çàäà÷à ìîæåò âîçíèêíóòü ïðè ïîäãîòîâêå ñïèñêà ôàìèëèé, ïðè ñîçäàíèè àëôàâèòíîãî óêàçàòåëÿ è âî ìíîãèõ äðóãèõ ñèòóàöèÿõ.  òàêîé ïðîãðàììå îäíèì èç ãëàâíûõ èíñòðóìåíòîâ ÿâëÿåòñÿ ôóíêöèÿ strcmp( ), òàê êàê åå ìîæíî èñïîëüçîâàòü äëÿ îïðåäåëåíèÿ ñòàðøèíñòâà äâóõ ñòðîê. Ïîñëåäîâàòåëüíîñòü íàøèõ äåéñòâèé áóäåò ñîñòîÿòü èç ñ÷èòûâàíèÿ ìàññèâà ñòðîê, èõ ñîðòèðîâêè è ïîñëåäóþùåãî âûâîäà. Ñîâñåì íåäàâíî ìû ïîêàçàëè ïîñëåäîâàòåëüíîñòü äåéñòâèé äëÿ ñ÷èòûâàíèÿ ñòðîê, è ñåé÷àñ ìû íà÷íåì ïðîãðàììó òàêèì æå îáðàçîì.
/* ñ÷èòûâàåò ñòðîêè è ñîðòèðóåò èõ */
#include <stdio.h>
#define SIZE 81 /* ïðåäåëüíàÿ äëèíà ñòðîêè, âêëþ÷àÿ \0 */
#define LIM 20 /* ìàêñèìàëüíîå êîëè÷åñòâî ñ÷èòûâàåìûõ ñòðîê */
#define HALT " " /* íóëåâàÿ ñòðîêà äëÿ ïðåêðàùåíèÿ ââîäà */
Main( ).
{
Static char input[LIM][SIZE]; /* ìàññèâ äëÿ çàïîìèíàíèÿ ââîäèìûõ ñòðîê */
Char *ptstr[LIM]; /* ìàññèâ ïåðåìåííûõ òèïà óêàçàòåëü */
Int ct = 0; /* ñ÷åò÷èê ââîäèìûõ ñòðîê */
Int k; /* ñ÷åò÷èê âûâîäèìûõ ñòðîê */
Printf(" Ââåäèòå äî %d ñòðîê è ÿ èõ îòñîðòèðóþ.\n" , LIM);
Printf(" Äëÿ ïðåêðàùåíèÿ ââîäà íàæìèòå êëàâèøó [ââîä] â íà÷àëå ñòðîêè.\n");
While((gets(input[ct])!= NULL) && strcmp(input[ct], HALT).
!= 0 && ct++ < LIM).
ptstr[ct - 1] = input[ct - 1]; /*óêàçûâàåò íà åùå íå.
îòñîðòèðîâàííûé ââîä */
Stsrt(ptstr, ct); /* ñîðòèðîâêà ñòðîê */
Puts(" \n Âîò îòñîðòèðîâàííûé ñïèñîê ñòðîê:\n");
For(k = 0; k < ct; k++).
Puts(ptstr[k]); /* óêàçàòåëè íà îòñîðòèðîâàííûå ñòðîêè */
}
/* ôóíêöèÿ ñîðòèðîâêè-ñòðîê-ñ-èñïîëüçîâàíèåì-óêàçàòåëåé */
Stsrt(strings, num).
Char *strings[ ];
Int num;
{ char *temp;
Int top, seek;
For(top = 0; top < num-1; top++).
For(seek = top + 1; seek < num; seek++).
If(strcmp(strings[top], strings[seek]) > 0).
{ temp = strings [top];
Strings [top] = strings [seek];
Strings [seek] = temp;
} }
ÐÈÑ. 13.4. Ïðîãðàììà ÷òåíèÿ è ñîðòèðîâêè ñòðîê.
Âûâîä ñòðîê íà ïå÷àòü íå ñîñòàâëÿåò ïðîáëåìû, à äëÿ ñîðòèðîâêè ìîæíî âçÿòü òîò æå àëãîðèòì, êîòîðûé èñïîëüçîâàëñÿ ðàíüøå äëÿ ÷èñåë. Ñåé÷àñ ìû ïðèìåíèì îäèí õèòðûé òðþê: ïîñìîòðèì, ñìîæåòå ëè âû åãî çàìåòèòü.
Äëÿ ïðîâåðêè âîçüìåì äåòñêèé ñòèøîê.
Ââåäèòå 20 ñòðîê, è ÿ èõ îòñîðòèðóþ.
Äëÿ ïðåêðàùåíèÿ ââîäà íàæìèòå êëàâèøó [ââîä] â íà÷àëå ñòðîêè.
Æèë íà ñâåòå ÷åëîâåê.
Ñêðþ÷åííûå íîæêè.
È ãóëÿë îí öåëûé âåê.
Ïî ñêðþ÷åííîé äîðîæêå.
Âîò îòñîðòèðîâàííûé ñïèñîê ñòðîê.
Æèë íà ñâåòå ÷åëîâåê.
È ãóëÿë îí öåëûé âåê.
Ïî ñêðþ÷åííîé äîðîæêå.
Ñêðþ÷åííûå íîæêè.
Äåòñêèå ñòèøêè íå êàæóòñÿ ñëèøêîì èñêàæåííûìè ïîñëå ñîðòèðîâêè èõ ïî àëôàâèòó.
Òðþê ñîñòîèò â òîì ÷òî âìåñòî ïåðåãðóïïèðîâêè ñàìèõ ñòðîê ìû ïåðåãðóïïèðîâàëè èõ óêàçàòåëè. Ðàçáåðåìñÿ â ýòîì.  íà÷àëå ptrst[0] ññûëàåòñÿ íà input[0] è ò. ä. Êàæäûé input[ ] ÿâëÿåòñÿ ìàññèâîì èç 81 ýëåìåíòà, à êàæäûé ýëåìåíò ptrst[ ] ÿâëÿåòñÿ îòäåëüíîé ïåðåìåííîé. Ïðîöåäóðà ñîðòèðîâêè ïåðåãðóïïèðîâûâàåò ptrst, íå òðîãàÿ input. Åñëè, íàïðèìåð, input[l] ñòîèò ïåðåä input[0] ïî àëôàâèòó, òî ïðîãðàììà ïåðåêëþ÷àåò óêàçàòåëè ptrst, â ðåçóëüòàòå ÷åãî ptrst[0] ññûëàåòñÿ íà input[1], a ptrst[1] íà input[0]. Ýòî ãîðàçäî ëåã÷å, ÷åì, èñïîëüçóÿ strcpy( ), ìåíÿòü ìåñòàìè äâå ââåäåííûå ñòðîêè. Ïðîñìîòðèòå åùå ðàç ýòîò ïðîöåññ íà ðèñóíêå.
È íàêîíåö, äàâàéòå ïîïûòàåìñÿ çàïîëíèòü ïðîáåëû, îñòàâøèåñÿ â íàøåì îïèñàíèè, à èìåííî "ïóñòîòó" ìåæäó ñêîáêàìè â ôóíêöèè main( ).
ÀÐÃÓÌÅÍÒÛ ÊÎÌÀÍÄÍÎÉ ÑÒÐÎÊÈ.
Êîìàíäíàÿ ñòðîêà - ýòî ñòðîêà, êîòîðóþ âû ïå÷àòàåòå íà êëàâèàòóðå, ÷òîáû çàïóñòèòü âàøó ïðîãðàììó. Ýòî íåòðóäíî. Ïðåäïîëîæèì, ó íàñ åñòü ïðîãðàììà â ôàéëå ñ èìåíåì fuss.  ýòîì ñëó÷àå êîìàíäíàÿ ñòðîêà âûãëÿäåëà áû òàê:

ÐÈÑ. 13.5. Óêàçàòåëè ñîðòèðóåìûõ ñòðîê.
Èëè, ìîæåò áûòü,
À > fuss.
Ñ èñïîëüçîâàíèåì äâóõ ñèñòåìíûõ ïðèãëàøåíèé.
Àðãóìåíòû êîìàíäíîé ñòðîêè ÿâëÿþòñÿ äîïîëíèòåëüíûìè ýëåìåíòàìè â òîé æå ñàìîé ñòðîêå:
%fuss - r Ginger.
Ñëåäóåò çàìåòèòü, ÷òî ïðîãðàììà íà ÿçûêå Ñè ìîæåò ââîäèòü èíôîðìàöèþ â ýòè ýëåìåíòû è ïðèìåíÿòü èõ äëÿ ñîáñòâåííûõ íóæä. Ýòîò ìåõàíèçì ïðåäíàçíà÷åí äëÿ èñïîëüçîâàíèÿ àðãóìåíòîâ ôóíêöèè main( ). Âîò òèïè÷íûé ïðèìåð:
/* main( ) ñ àðãóìåíòàìè */
Main(argc, argv).
Int argc;
Char *argv[ ];
{
Int count;
For(count = 1; count < argc; count++).
printf(" %s", argv[count]);
Printf("\n");
}
Ïîìåñòèòå ýòó ïðîãðàììó â âûïîëíÿþùèé ôàéë, íàçâàííûé echo, è âîò ÷òî ïðîèçîéäåò:
À > echo
ß ìîã áû âîñïîëüçîâàòüñÿ íåáîëüøîé ïîìîùüþ.
ß ìîã áû âîñïîëüçîâàòüñÿ íåáîëüøîé ïîìîùüþ.
Âåðîÿòíî, âû âèäèòå, ïî÷åìó ôóíêöèÿ íàçûâàåòñÿ echo, íî åùå íå ìîæåòå ïîíÿòü, êàê îíà ðàáîòàåò. Ìîæåò áûòü, ýòî îáúÿñíåíèå ïîìîæåò âàì (ìû íàäååìñÿ).
Êîìïèëÿòîðû Ñè ïðåäïîëàãàþò íàëè÷èå ó main( ) äâóõ àðãóìåíòîâ. Ïåðâûé àðãóìåíò ïðåäñòàâëÿåò êîëè÷åñòâî ñòðîê, ñëåäóþùèõ çà êîìàíäíûì ñëîâîì. Îáû÷íî (íî íå îáÿçàòåëüíî) ýòîò àðãóìåíò òèïà int íàçûâàåòñÿ argc (argument count). Ñèñòåìà èñïîëüçóåò ïðîáåëû, ÷òîáû ñîîáùèòü î êîíöå îäíîé ñòðîêè è íà÷àëå ñëåäóþùåé. Òàê, íàø ïðèìåð ñ echo èìååò øåñòü ñòðîê, à ïðèìåð ñ fuss èìåë äâå ñòðîêè. Âòîðîé àðãóìåíò ÿâëÿåòñÿ ìàññèâîì óêàçàòåëåé ñòðîê. Êàæäîé ñòðîêå, âõîäÿùåé â êîìàíäíóþ ñòðîêó, ïðèñâàèâàåòñÿ åå.

Ñîáñòâåííûé óêàçàòåëü. Ïî ñîãëàøåíèþ, ýòîò ìàññèâ óêàçàòåëåé íàçûâàåòñÿ argv (argument values). Åñëè ìîæíî (íåêîòîðûå îïåðàöèîííûå ñèñòåìû íå ïîçâîëÿþò ýòîãî), ýëåìåíòó argv[0] ïðèñâàèâàåòñÿ èìÿ ñàìîé ïðîãðàììû.  ýòîì ñëó÷àå àðãóìåíòó argv[l] ïðèñâàèâàåòñÿ ïåðâàÿ ñëåäóþùàÿ ñòðîêà è ò. ä. Äëÿ íàøåãî ïðèìåðà èìååì.
Argv[0] ññûëàåòñÿ íà echo (äëÿ áîëüøèíñòâà ñèñòåì).
Argv[1] ññûëàåòñÿ íà ÿ.
Argv [2] ññûëàåòñÿ íà ìîã.
Argv [6] ññûëàåòñÿ íà ïîìîùüþ.
Ïîñêîëüêó âû èñïîëüçóåòå ýòè îáîçíà÷åíèÿ, òî ìîæåòå ëåãêî ïðîñëåäèòü îñòàòîê ïðîãðàììû.

ÐÈÑ. 13.6. Àðãóìåíòû êîìàíäíîé ñòðîêè.
Ìíîãèå ïðîãðàììèñòû èñïîëüçóþò äëÿ argv è äðóãèå îáîçíà÷åíèÿ:
Main(arge, argv).
Int arge;
Char **argv;
Îïèñàíèå argv íà ñàìîì äåëå ýêâèâàëåíòíî char *àrgv[ ];. ×èòàÿ åãî, âû ìîãëè áû ñêàçàòü, ÷òî argv ÿâëÿåòñÿ óêàçàòåëåì íà óêàçàòåëü íà òèïchar. Íàø ïðèìåð äàåò òî æå ñàìîå. Ó íàñ áûë ìàññèâ èç ñåìè ýëåìåíòîâ. Èìÿ ìàññèâà ÿâëÿåòñÿ óêàçàòåëåì íà åãî ïåðâûé ýëåìåíò. Ïîýòîìó argv ññûëàåòñÿ íà argv[0], a argv[0] ÿâëÿåòñÿ óêàçàòåëåì íà òèï char. Ñëåäîâàòåëüíî, äàæå ñ èñõîäíûì îïðåäåëåíèåì argv ÿâëÿåòñÿ óêàçàòåëåì íà óêàçàòåëü íà òèï char. Âû ìîæåòå èñïîëüçîâàòü ëþáóþ èç ýòèõ ôîðì, íî âèäíî, ÷òî ïåðâàÿ ïðîùå äëÿ ïîíèìàíèÿ.
Î÷åíü ÷àñòî àðãóìåíòû êîìàíäíûõ ñòðîê èñïîëüçóþòñÿ äëÿ óêàçàíèÿ âîçìîæíîñòåé ïðîãðàììû. Íàïðèìåð, ìîæíî ïðèìåíÿòü êîìáèíàöèþ ñèìâîëîâ - r, ÷òîáû çàñòàâèòü ïðîãðàììó âûïîëíÿòü ñîðòèðîâêó â îáðàòíîì ïîðÿäêå. Îáû÷íî àëüòåðíàòèâû çàäàþòñÿ ïðè ïîìîùè äåôèñà è áóêâû, êàê - r. Ýòè "ôëàæêè" íè÷åãî íñ îçíà÷àþò â ÿçûêå Ñè; âû äîëæíû ñàìè çàïðîãðàììèðîâàòü èõ ðàñïîçíàâàíèå.
Âîò î÷åíü ïðîñòîé ïðèìåð, ïîêàçûâàþùèé, êàê ïðîãðàììà ìîæåò ïðîâåðÿòü è èñïîëüçîâàòü ôëàæîê.
/* îáû÷íîå íà÷àëî */
#define YES 1.
#define NO 0.
Main(argc, argv).
Int argc;
Char *argv[ ];
{
Float array[100];
Int n;
Int flag = NO;
If(argv[l][0] == '-' && argv[l][l] == 'r').
flag = YES;
...
If flag = NO.
sort1(array, n);
Else.
Sort2(array, n);
...
}
Ýòà ïðîãðàììà ïðîâåðÿåò ïåðâóþ ñòðîêó ïîñëå èìåíè êîìàíäíîãî ôàéëà, ÷òîáû ïîñìîòðåòü, íà÷èíàåòñÿ ëè îíà ñ äåôèñà. Çàòåì îíà ïðîâåðÿåò, ÿâëÿåòñÿ ëè ñëåäóþùèé ñèìâîë êîäîì áóêâû r. Åñëè ýòî òàê, òî óñòàíàâëèâàåòñÿ ôëàæîê, ïðèâîäÿùèé ê èñïîëüçîâàíèþ äðóãîé ïðîãðàììû ñîðòèðîâêè. Ñòðîêè ïîñëå ïåðâîé èãíîðèðóþòñÿ. Êàê ìû óæå ñêàçàëè, ýòîò ïðèìåð äîñòàòî÷íî ïðîñò.
Åñëè âû èñïîëüçîâàëè ñèñòåìó UNIX, òî, âåðîÿòíî, çàìåòèëè, ÷òî êîìàíäû UNIX ïðåäîñòàâëÿþò ðàçíîîáðàçíûå âàðèàíòû êîìàíäíîé ñòðîêè è åå àðãóìåíòîâ. Ýòè ïðèìåðû ïîêàçûâàþò, êàê èñïîëüçîâàòü àðãóìåíòû êîìàíäíîé ñòðîêè ÿçûêà Ñè, ïîñêîëüêó áîëüøàÿ ÷àñòü ñèñòåìû UNIX íàïèñàíà íà ÿçûêå Ñè.
Àðãóìåíòû êîìàíäíûõ ñòðîê ìîãóò áûòü òàêæå èìåíàìè ôàéëîâ, è âû ìîæåòå èñïîëüçîâàòü èõ âìåñòî îïåðàòîðîâ ïåðåêëþ÷åíèÿ, ÷òîáû óêàçàòü ïðîãðàììå, íàä êàêèìè ôàéëàìè íàäî ðàáîòàòü. Ìû ïîêàæåì âàì, êàê ýòî äåëàåòñÿ, â ãë. 15.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
Êàê îáúÿâèòü ñòðîêó ñèìâîëîâ: static char fun[ ] è ò. ä.
Êàê èíèöèàëèçèðîâàòü ñòðîêó ñèìâîëîâ: static char *p0 = "0!".
Êàê èñïîëüçîâàòü gets( ) è puts( ).
Êàê èñïîëüçîâàòü strlen( ), strcmp( ), strcpy( ) è strcatf( ).
Êàê èñïîëüçîâàòü àðãóìåíòû êîìàíäíîé ñòðîêè.
 ÷åì ñõîäñòâî è ðàçëè÷èå îïèñàòåëåé char *bliss è char bliss[ ].
Êàê ñîçäàòü ñòðîêîâóþ êîíñòàíòó: "èñïîëüçóÿ êàâû÷êè".
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. ×òî íåïðàâèëüíî â ýòîé ïîïûòêå îïèñàíèÿ ñèìâîëüíîé ñòðîêè?
Main( ) {
Char name[ ] = {'F', 'ñ', 's', 's'};
2. ×òî íàïå÷àòàåò ýòà ïðîãðàììà?
#include <stdio.h>
Main( ).
{
Static char note[ ] = "Äî âñòðå÷è â áóôåòå." ;
Char *ptr;
Ptr = note;
Puts(ptr);
Puts(++ptr);
Note[7] = '\0';
Puts(note);
Puts(++ptr);
}
3. ×òî íàïå÷àòàåò ýòà ïðîãðàììà?
Main( ).
{ static char food[ ] = "Éóììè";
Char *ptr;
Ptr = food + strlen(food);
While(--ptr >= food) puts(ptr);
}
4. ×òî íàïå÷àòàåò íèæåñëåäóþùàÿ ïðîãðàììà?
Main( ).
{
Static char goldwyn[28] = " àç ÿ ñ÷èòûâàþ".
Static char samuel[40] = " Êàæäûé ð" ;
Char *quote = " ÷àñòü ñòðîêè.".
Strcat(goldwyn, quote);
Strcat(samuel, goldwyn);
Puts(samuel);
}
5. Ñîçäàéòå ôóíêöèþ, êîòîðàÿ èñïîëüçóåò óêàçàòåëü ñòðîêè â êà÷åñòâå àðãóìåíòà è âîçâðàùàåò óêàçàòåëü, ññûëàþùèéñÿ íà ïåðâûé ïðîáåë â ñòðîêå â óêàçàííîì ìåñòå èëè ïîñëå íåãî. Åñëè îíà íå íàõîäèò íè îäíîãî ïðîáåëà, òî ïóñòü âîçâðàùàåò NULL-óêàçàòåëü.
Îòâåòû.
1. Êëàññ ïàìÿòè äîëæåí áûòü extern èëè static; èíèöèàëèçàöèÿ äîëæíà âêëþ÷àòü ñèìâîë '\0'.
2.
Äî âñòðå÷è â áóôåòå.
î âñòðå÷è â áóôåòå.
Äî âñò.
âñò.
3.
È.
ìè.
ììè.
óììè.
Éóììè.
4.
Êàæäûé ðàç ÿ ñ÷èòûâàþ ÷àñòü ñòðîêè.
5.
Char *strblk(string).
Char *string; {
While(*string != ' ' && *string != '\0').
string++; /* îñòàíàâëèâàåòñÿ íà ïåðâîì ïðîáåëå èëè íóëü-ñèìâîëå */
If(*string == '\0').
return(NULL); /* NULL = 0 */
Else return(string); }.
ÓÏÐÀÆÍÅÍÈß.
1. Ñîçäàéòå ôóíêöèþ, êîòîðàÿ ñ÷èòûâàåò î÷åðåäíûå n ñèìâîëîâ ïðè ââîäå, âêëþ÷àÿ ñèìâîëû ïðîáåëîâ, òàáóëÿöèè è íîâîé ñòðîêè.
2. Ìîäèôèöèðóéòå ïîñëåäíþþ ôóíêöèþ òàêèì îáðàçîì, ÷òîáû îíà îñòàíàâëèâàëàñü ïîñëå ââîäà n ñèìâîëîâ èëè ïîñëå ïåðâîãî ñèìâîëà ïðîáåëà, òàáóëÿöèè èëè íî âîé ñòðîêè íåçàâèñèìî îò òîãî, êàêîé èç íèõ èäåò ïåðâûì [òîëüêî íå èñïîëüçóéòå ôóíêöèþ scanf( )].
3. Ñîçäàéòå ôóíêöèþ, êîòîðàÿ ñ÷èòûâàåò î÷åðåäíîå ñëîâî ïðè ââîäå; îïðåäåëèòå ñëîâî êàê ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, íå âêëþ÷àþùóþ ñèìâîëû ïðîáåëà, òàáóëÿöèè èëè íîâîé ñòðîêè.
4. Ñîçäàéòå ôóíêöèþ, êîòîðàÿ èùåò ïåðâîå ïîÿâëåíèå îïðåäåëåííîãî ñèìâîëà â îïðåäåëåííîé ñòðîêå. Ôóíêöèÿ äîëæíà âîçâðàùàòü óêàçàòåëü, ññûëàþùèéñÿ íà ýòîò ñèìâîë, â ñëó÷àå óñïåøíîãî ïîèñêà èëè NULL, åñëè ñèìâîë â ñòðîêå íå íàéäåí.
14. Ñòðóêòóðû è äðóãèå òèïû äàííûõ.
ÑÒÐÓÊÒÓÐÛ ÄÀÍÍÛÕ.
ÑÒÐÓÊÒÓÐÍÛÅ ØÀÁËÎÍÛ, ÒÅÃÈ È ÏÅÐÅÌÅÍÍÛÅ.
ÄÎÑÒÓÏÍÛÅ ×ÀÑÒÈ ÑÒÐÓÊÒÓÐÛ.
ÑÒÐÓÊÒÓÐÍÛÅ ÓÊÀÇÀÒÅËÈ.
ÑÒÐÓÊÒÓÐÍÛÅ ÌÀÑÑÈÂÛ.
ÔÓÍÊÖÈÈ È ÑÒÐÓÊÒÓÐÛ.
ÎÁÚÅÄÈÍÅÍÈß.
ÑÎÇÄÀÍÈÅ ÍÎÂÛÕ ÒÈÏÎÂ.
ÊËÞ×ÅÂÛÅ ÑËÎÂÀ struct, union, typedef.
ÎÏÅÐÀÖÈÈ ->
Óñïåõ ïðîãðàììû ÷àñòî çàâèñèò îò óäà÷íîãî âûáîðà ñïîñîáà ïðåäñòàâëåíèÿ äàííûõ, ñ êîòîðûìè îíà äîëæíà ðàáîòàòü.  ýòîì îòíîøåíèè ÿçûêó Ñè î÷åíü ïîâåçëî (è íå ñëó÷àéíî), òàê êàê îí îáëàäàåò î÷åíü ìîùíûìè ñðåäñòâàìè ïðåäñòàâëåíèÿ ñëîæíûõ äàííûõ. Ýòîò òèï äàííûõ, íàçûâàåìûõ "ñòðóêòóðîé", íå òîëüêî äîñòàòî÷íî ãèáîê äëÿ ïðåäñòàâëåíèÿ ðàçíîîáðàçíûõ äàííûõ, íî, êðîìå òîãî, îí ïîçâîëÿåò ïîëüçîâàòåëþ ñîçäàâàòü íîâûå òèïû. Åñëè âû çíàêîìû ñ "çàïèñÿìè" ÿçûêà Ïàñêàëü, âàì äîëæíû áûòü óäîáíû ñòðóêòóðû.
Ïîñìîòðèì íà êîíêðåòíîì ïðèìåðå, ïî÷åìó ñòðóêòóðû íàì íåîáõîäèìû è êàê èõ ñîçäàâàòü è èñïîëüçîâàòü.
ÒÈÏÎÂÀß ÇÀÄÀ×À: ÈÍÂÅÍÒÀÐÈÇÀÖÈß ÊÍÈÃ.
Ãâåí Ãëåíí õî÷åò íàïå÷àòàòü îïèñü ñâîèõ êíèã. Îíà õîòåëà áû çàíåñòè â íåå ðàçëè÷íóþ èíôîðìàöèþ î êàæäîé êíèãå: åå íàçâàíèå, ôàìèëèþ àâòîðà, èçäàòåëüñòâî, ãîä èçäàíèÿ, ÷èñëî ñòðàíèö, òèðàæ è öåíó. Òåïåðü íåêîòîðûå èç ýòèõ ýëåìåíòîâ, òàêèå, êàê íàçâàíèå, ìîæíî çàïèñàòü â ìàññèâ ñòðîê. Äðóãèå ýëåìåíòû òðåáóþò ìàññèâ öåëîãî òèïà èëè ìàññèâ òèïà float. Åñëè ðàáîòàòü ñ ñåìüþ ðàçëè÷íûìè ìàññèâàìè è ñëåäèòü çà âåñè ñîäåðæàùåéñÿ â íèõ èíôîðìàöèåé, ìîæíî ñîéòè ñ óìà, îñîáåííî åñëè Ãâåí æåëàåò èìåòü íåñêîëüêî ñïèñêîâ - ñïèñîê, óïîðÿäî÷åííûé ïî íàçâàíèÿì, ñïèñîê, óïîðÿäî÷åííûé ïî àâòîðàì, ïî öåíå è ò. ä. Ãîðàçäî ëó÷øå áûëî áû èñïîëüçîâàòü îäèí ìàññèâ, â êîòîðîì êàæäûé ýëåìåíò ñîäåðæàë áû âñþ èíôîðìàöèþ î êíèãå.
Íî êàêîé òèï äàííûõ ìîæåò ñîäåðæàòü ñòðîêè è ÷èñëà îäíîâðåìåííî è êàê-òî õðàíèòü ýòó èíôîðìàöèþ ðàçäåëüíî? Îòâåòîì äîëæíà áûòü, êîíå÷íî, òåìà äàííîé ãëàâû - ñòðóêòóðà. ×òîáû ïîñìîòðåòü, êàê ñîçäàåòñÿ ñòðóêòóðà è êàê îíà ðàáîòàåò, íà÷íåì ñ íåáîëüøîãî ïðèìåðà. Äëÿ óïðîùåíèÿ çàäà÷è ââåäåì äâà îãðàíè÷åíèÿ: ïåðâîå - ìû âêëþ÷èì â îïèñü òîëüêî íàçâàíèå êíèãè, ôàìèëèþ àâòîðà è öåíó; âòîðîå - îãðàíè÷èì îïèñü äî îäíîé êíèãè. Åñëè ó âàñ áîëüøå êíèã, íå áåñïîêîéòåñü; ìû ïîêàæåì, êàê ðàñøèðèòü ýòó ïðîãðàììó.
Ñíà÷àëà ïîñìîòðèòå íà ïðîãðàììó è åå ðåçóëüòàò, à ïîòîì ìû ðàññìîòðèì îñíîâíûå âîïðîñû.
/* èíâåíòàðèçàöèÿ îäíîé êíèãè */
#include <stdio.h>
#define MAXTIT 41 /* ìàêñèìàëüíàÿ äëèíà íàçâàíèÿ + 1 */
#define MAXAUT 31 /* ìàêñèìàëüíàÿ äëèíà ôàìèëèè àâòîðà + 1 */
Struct book { /* øàáëîí ïåðâîé ñòðóêòóðû: book.
ÿâëÿåòñÿ èìåíåì òèïà ñòðóêòóðû */
Char title [MAXTIT]; /* ñèìâîëüíûé ìàññèâ äëÿ íàçâàíèÿ */
Char author [MAXAUT]; /* ñèìâîëüíûé ìàññèâ äëÿ ôàìèëèè àâòîðà */
Float value; /* ïåðåìåííàÿ äëÿ õðàíåíèÿ öåíû êíèãè */
}; /* êîíåö øàáëîíà ñòðóêòóðû */
Main( ).
{
Struct book libry; /* îïèñàíèå ïåðåìåííîé òèïà book */
Printf(" Ââåäèòå, ïîæàëóéñòà, íàçâàíèå êíèãè.\n");
Gets(libry. title); /* äîñòóï ê ýëåìåíòó title */
Printf(" Òåïåðü ââåäèòå ôàìèëèþ àâòîðà.\n");
Gets(libry.author);
Printf(" Òåïåðü ââåäèòå öåíó.\n");
Scanf(" %f ", &libry.value);
Printf("%s, %s: %p.2f \n", libry.title, libry.autor,
libry.value);
Printf("%s: \" %s \" \(%p.2f\)\n", libry.author,
libry.title, libry.value);
}
Âîò îáðàçåö ðàáîòû ïðîãðàììû:
Ââåäèòå, ïîæàëóéñòà, íàçâàíèå êíèãè.
Èñêóññòâî ïðîãðàììèðîâàíèÿ äëÿ ÝÂÌ.
Òåïåðü ââåäèòå ôàìèëèþ àâòîðà.
Ä. Êíóò.
Òåïåðü ââåäèòå öåíó.
5ð.67.
Èñêóññòâî ïðîãðàììèðîâàíèÿ äëÿ ÝÂÌ, Ä. Êíóò: 5ð.67.
Ä. Êíóò: "Èñêóññòâî ïðîãðàììèðîâàíèÿ äëÿ ÝÂÌ" (5ð. 67).
Ñîçäàííàÿ íàìè ñòðóêòóðà ñîñòîèò èç òðåõ ÷àñòåé: îäíà äëÿ íàçâàíèÿ, äðóãàÿ äëÿ ôàìèëèè àâòîðà è òðåòüÿ äëÿ öåíû. Ìû äîëæíû èçó÷èòü òðè îñíîâíûõ âîïðîñà:
1. Êàê óñòàíàâëèâàòü ôîðìàò èëè "øàáëîí" äëÿ ñòðóêòóðû.
2. Êàê îáúÿâëÿòü ïåðåìåííóþ, ñîîòâåòñòâóþùóþ ýòîìó øàáëîíó.
3. Êàê îñóùåñòâëÿòü äîñòóï ê îòäåëüíûì êîìïîíåíòàì ñòðóêòóðíîé ïåðåìåííîé.
ÓÑÒÀÍÎÂÊÀ ÑÒÐÓÊÒÓÐÍÎÃÎ ØÀÁËÎÍÀ.
Ñòðóêòóðíûé øàáëîí ÿâëÿåòñÿ îñíîâíîé ñõåìîé, îïèñûâàþùåé êàê ñîáèðàåòñÿ ñòðóêòóðà. Íàø øàáëîí âûãëÿäåë áû òàê:
Struct book.
{
Char title [MAXTIT];
Char author [MAXAUT];
Float value;
};
Ýòîò øàáëîí îïèñûâàåò ñòðóêòóðó, ñîñòàâëåííóþ èç äâóõ ñèìâîëüíûõ ìàññèâîâ è îäíîé ïåðåìåííîé òèïà tloat. Äàâàéòå ðàññìîòðèì åãî äåòàëüíî.
Ïåðâûì ñòîèò êëþ÷åâîå ñëîâî struct; îíî îïðåäåëÿåò, ÷òî âñå, ÷òî ñòîèò çà íèì, ÿâëÿåòñÿ ñòðóêòóðîé. Äàëåå ñëåäóåò íåîáÿçàòåëüíûé "òåã" (èìÿ òèïà ñòðóêòóðû) - ñëîâî book, ÿâëÿþùååñÿ ñîêðàùåííîé ìåòêîé, êîòîðóþ ìû ìîæåì èñïîëüçîâàòü ïîçæå äëÿ ññûëêè íà ýòó ñòðóêòóðó. Ïîýòîìó ãäå-íèáóäü ïîçæå ó íàñ áóäåò îïèñàíèå:
Struct book libry;
Êîòîðîå îáúÿâëÿåò libry ñòðóêòóðîé òèïà book.
Äàëåå ó íàñ åñòü ñïèñîê "ýëåìåíòîâ" ñòðóêòóðû, çàêëþ÷åííûé â ïàðíûå ôèãóðíûå ñêîáêè. Êàæäûé ýëåìåíò îïðåäåëÿåòñÿ ñâîèì ñîáñòâåííûì îïèñàíèåì. Íàïðèìåð, ýëåìåíò title ÿâëÿåòñÿ ñèìâîëüíûì ìàññèâîì, ñîñòîÿùèì èç MAXTIT-ýëåìåíòîâ. Êàê ìû óæå îòìå÷àëè, ýëåìåíòû ìîãóò áûòü äàííûìè ëþáîãî òèïà, âêëþ÷àÿ äðóãèå ñòðóêòóðû! È íàêîíåö, ìû ñòàâèì òî÷êó ñ çàïÿòîé, çàâåðøàþùóþ îïðåäåëåíèå øàáëîíà.
Âû ìîæåòå ðàçìåñòèòü ýòîò øàáëîí çà ïðåäåëàìè ëþáîé ôóíêöèè (âíå), êàê ìû è ñäåëàëè, èëè âíóòðè îïðåäåëåíèÿ ôóíêöèè. Åñëè ìû óñòàíîâèëè øàáëîí âíóòðè ôóíêöèè, òî îí ìîæåò èñïîëüçîâàòüñÿ òîëüêî âíóòðè ýòîé ôóíêöèè. Åñëè âíå, òî øàáëîí äîñòóïåí âñåì ôóíêöèÿì ïðîãðàììû, ñëåäóþùèì çà åãî îïðåäåëåíèåì. Íàïðèìåð, â äðóãîé ôóíêöèè âû ìîæåòå îïðåäåëèòü.
Struct book dickens;
È ýòà ôóíêöèÿ äîëæíà èìåòü ïåðåìåííóþ dickens, êîòîðàÿ ñëåäóåò çà íàøèì øàáëîíîì.
Ìû ñêàçàëè, ÷òî èìÿ òèïà ñòðóêòóðû íåîáÿçàòåëüíî, íî åãî ñëåäóåò èñïîëüçîâàòü, åñëè âû ñîçäàåòå ñòðóêòóðó òàê, êàê ýòî ñäåëàëè ìû, îïðåäåëèâ øàáëîí â îäíîì ìåñòå, à ôàêòè÷åñêèå ïåðåìåííûå â äðóãîì. Ìû âåðíåìñÿ ê ýòîìó âîïðîñó ïîñëå òîãî, êàê ðàññìîòðèì îïðåäåëåíèå ñòðóêòóðíûõ ïåðåìåííûõ.
ÎÏÐÅÄÅËÅÍÈÅ ÑÒÐÓÊÒÓÐÍÛÕ ÏÅÐÅÌÅÍÍÛÕ.
Ñëîâî "ñòðóêòóðà" èñïîëüçóåòñÿ äâîÿêî. Âî-ïåðâûõ, â ñìûñëå "ñòðóêòóðíîãî øàáëîíà", î êîòîðîì ìû òîëüêî ÷òî ðàññêàçàëè. Øàáëîí ÿâëÿåòñÿ ñõåìîé áåç ñîäåðæàíèÿ; îí ñîîáùàåò êîìïèëÿòîðó, êàê äåëàòü ÷òî-ëèáî, íî íñ âûçûâàåò íèêàêèõ äåéñòâèé â ïðîãðàììå. Ñëåäóþùèé øàã çàêëþ÷àåòñÿ â ñîçäàíèè "ñòðóêòóðíîé ïåðåìåííîé"; ýòî è åñòü âòîðîé ñìûñë ñëîíà ñòðóêòóðà. Ñòðîêà íàøåé ïðîãðàììû, ñîçäàþùàÿ ñòðóêòóðíóþ ïåðåìåííóþ, âûãëÿäèò òàê:
Struct book libry;
Íà îñíîâàíèè ýòîãî îïåðàòîðà êîìïèëÿòîð ñîçäàñò ïåðåìåííóþ libry. Ñîãëàñíî ïëàíó, óñòàíîâëåííîìó øàáëîíîì book, îí âûäåëÿåò ïàìÿòü äëÿ ñèìâîëüíîãî ìàññèâà, ñîñòîÿùåãî èç MAXTIT-ýëåìåíòîâ, äëÿ ñèìâîëüíîãî ìàññèâà èç MAXAUT-ýëåìåíòîâ è äëÿ ïåðåìåííîé òèïà float. Ýòà ïàìÿòü îáúåäèíÿåòñÿ ïîä èìåíåì libry. (Â ñëåäóþùåì ðàçäåëå ìû ðàññêàæåì, êàê åå "ðàçúåäèíèòü", åñëè ïîíàäîáèòñÿ.).
ÐÈÑ. 14.1. Ðàñïðåäåëåíèå ïàìÿòè äëÿ ñòðóêòóðû.
 ýòîì îïèñàíèè struct book èãðàåò òó æå ðîëü, ÷òî è int èëè float â ñâîèõ îïèñàíèÿõ. Íàïðèìåð, ìû ìîãëè áû îïèñàòü äâå ïåðåìåííûå òèïà struct book èëè äàæå óêàçàòåëü íà ýòîò òèï ñòðóêòóðû:
Struct book doyle panshin, *ptbook;
Êàæäàÿ ñòðóêòóðíàÿ ïåðåìåííàÿ, doyle è panshin, èìåëà áû ÷àñòè title, author è value. Óêàçàòåëü ptbook ìîã áû ññûëàòüñÿ íà doyle, panshin èëè ëþáóþ äðóãóþ book-ñòðóêòóðó. Äëÿ êîìïüþòåðà îïåðàòîð íàøåé ïðîãðàììû.
Struct book libry;
ßâëÿåòñÿ ñîêðàùåííîé çàïèñüþ.
Struct book libry;
ßâëÿåòñÿ ñîêðàùåííîé çàïèñüþ.
Struct book {
Char title [MAXTIT];
Char author [MAXAUT];
Float value;
} libry; /* ïðèñîåäèíÿåò èìÿ ïåðåìåííîé ê øàáëîíó */
Äðóãèìè ñëîâàìè, ïðîöåññ îïðåäåëåíèÿ ñòðóêòóðíîãî øàáëîíà è ïðîöåññ îïðåäåëåíèÿ ñòðóêòóðíîé ïåðåìåííîé ìîæíî îáúåäèíèòü â îäèí ýòàï. Îáúåäèíåíèå øàáëîíà è îïðåäåëåíèé ïåðåìåííûõ ÿâëÿåòñÿ èìåííî òåì ñëó÷àåì, êîãäà íå íóæíî èñïîëüçîâàòü èìÿ òèïà ñòðóêòóðû:
Struct { /* áåç èìåíè òèïà ñòðóêòóðû */
Char title [MAXTIT];
Char author [MAXAUT];
Float value;
} libry;
Ôîðìà ñ èìåíåì òèïà ñòðóêòóðû óäîáíåå, åñëè âû èñïîëüçóåòå ñòðóêòóðíûé øàáëîí áîëåå îäíîãî ðàçà.
Åñòü îäèí àñïåêò îïðåäåëåíèÿ ñòðóêòóðíîé ïåðåìåííîé, êîòîðûé íå íàøåë îòðàæåíèÿ â íàøåì ïðèìåðå - èíèöèàëèçàöèÿ. Òåïåðü ìû õîòèì çàíÿòüñÿ ýòèì âîïðîñîì.
Èíèöèàëèçàöèÿ ñòðóêòóðû.
Ìû âèäåëè, êàê èíèöèàëèçèðóþòñÿ ïåðåìåííûå è ìàññèâû:
Int count = 0;
Static int fibo[ ]={0, 1, 1, 2, 3, 5, 8};
Ìîæíî ëè èíèöèàëèçèðîâàòü è ñòðóêòóðíóþ ïåðåìåííóþ? Äà, åñëè ñòðóêòóðíàÿ ïåðåìåííàÿ áóäåò âíåøíåé èëè ñòàòè÷åñêîé. Çäåñü ñëåäóåò èìåòü â âèäó, ÷òî ïðèíàäëåæíîñòü ñòðóêòóðíîé ïåðåìåííîé ê âíåøíåìó òèïó çàâèñèò îò òîãî, ãäå îïðåäåëåíà ïåðåìåííàÿ, à íå ãäå îïðåäåëåí øàáëîí.  íàøåì ïðèìåðå øàáëîí book ÿâëÿåòñÿ âíåøíèì, à ïåðåìåííàÿ libry - âíóòðåííåé, òàê êàê îíà îïðåäåëåíà âíóòðè ôóíêöèè è ïî óìîë÷àíèþ ðàñïîëàãàåòñÿ â êëàññå àâòîìàòè÷åñêîé ïàìÿòè. Ïðåäïîëîæèì, ìû ñîçäàëè òàêîå îïèñàíèå:
Static struct book libry;
 ýòîì ñëó÷àå èñïîëüçóåòñÿ ñòàòè÷åñêàÿ ïàìÿòü, è ìîæíî èíèöèàëèçèðîâàòü ñòðóêòóðó ñëåäóþùèì ñïîñîáîì:
Static struct book libry={"Ïèðàò è äåâèöà",
"Ðåíå Âèâîò",
1ð.95 } ;
×òîáû ñäåëàòü àññîöèàöèè áîëåå ÿâíûìè, ìû äàëè êàæäîìó ýëåìåíòó ñâîþ ñîáñòâåííóþ ñòðîêó äëÿ èíèöèàëèçàöèè, õîòÿ êîìïèëÿòîðó òðåáóþòñÿ òîëüêî çàïÿòûå, ÷òîáû îòäåëèòü èíèöèàëèçàöèþ îäíîãî ýëåìåíòà îò èíèöèàëèçàöèè ñëåäóþùåãî.
Ïðîäîëæèì íàøè ðàçúÿñíåíèÿ ñâîéñòâ ñòðóêòóðû.
ÄÎÑÒÓÏ Ê ÝËÅÌÅÍÒÀÌ ÑÒÐÓÊÒÓÐÛ.
Ñòðóêòóðà ÿâëÿåòñÿ ðàçíîâèäíîñòüþ ñóïåðìàññèâà, â êîòîðîì îäèí ýëåìåíò ìîæåò áûòü ìàññèâîì òèïà char, ñëåäóþùèé - float è åùå îäèí int. Îáû÷íî ìîæíî îáðàùàòüñÿ ê îòäåëüíûì ýëåìåíòàì ìàññèâà, èñïîëüçóÿ èíäåêñ. Êàê ýòî ñäåëàòü äëÿ îòäåëüíûõ ýëåìåíòîâ ñòðóêòóðû? Äëÿ ýòîãî ìû èñïîëüçóåì ñèìâîë ".", îáîçíà÷àþùèé îïåðàöèþ ïîëó÷åíèÿ ýëåìåíòà ñòðóêòóðû. Íàïðèìåð, libry .value ÿâëÿåòñÿ ýëåìåíòîì value ñòðóêòóðû libry. Ìîæíî ïðèìåíÿòü libry.value òî÷íî òàê æå, êàê âû èñïîëüçîâàëè áû ëþáóþ äðóãóþ ïåðåìåííóþ òèïà float. Ìîæíî ïðèìåíÿòü è libry.title òî÷íî-òàê æå, êàê ìàññèâ òèïà char. Ïîýòîìó ìû ìîãëè áû èñïîëüçîâàòü âûðàæåíèÿ, ïîäîáíûå.
Gets(libry.title).
È.
Scanf(" %f ", &libry.value);
 ñóùíîñòè .title, .author è .value èãðàþò ðîëü èíäåêñîâ äëÿ ñòðóêòóðû book.
Åñëè ó âàñ åñòü âòîðàÿ ñòðóêòóðíàÿ ïåðåìåííàÿ òàêîãî æå òèïà, âû ìîãëè áû åå èñïîëüçîâàòü òî÷íî òàê æå:
Struct book spiro; gerald;
Gets (spiro.title);
Gets (gerald.title);
.title ññûëàåòñÿ íà ïåðâûé ýëåìåíò ñòðóêòóðû book.
Ïîñìîòðèòå, êàê â ñàìîé ïåðâîé ïðîãðàììå ìû ïå÷àòàëè ñîäåðæèìîå ñòðóêòóðíîé ïåðåìåííîé libry â äâóõ ðàçëè÷íûõ ôîðìàòàõ; îíà äåìîíñòðèðóåò íàì âîçìîæíîñòü èñïîëüçîâàíèÿ ýëåìåíòîâ ñòðóêòóðû.
Ìû èçëîæèëè ñàìîå îñíîâíîå. Òåïåðü õîòåëîñü áû ðàñøèðèòå âàø êðóãîçîð è ðàññìîòðåòü íåêîòîðûå ïîíÿòèÿ, ñâÿçàííûå åå ñòðóêòóðàìè, âêëþ÷àÿ ìàññèâû ñòðóêòóð, ñòðóêòóðû ñòðóêòóð, óêàçàòåëè íà ñòðóêòóðû, à òàêæå ôóíêöèè è îáúåäèíåíèÿ.
ÌÀÑÑÈÂÛ ÑÒÐÓÊÒÓÐ.
Íàñòðîèì íàøó ïðîãðàììó èíâåíòàðèçàöèè íà îáðàáîòêó, åñëè ïîòðåáóåòñÿ, äâóõ èëè òðåõ (èëè, ìîæåò áûòü, äàæå áîëüøåãî ÷èñëà) êíèã. Î÷åâèäíî, êàæäóþ êíèãó ìîæíî îïèñàòü ñòðóêòóðíîé ïåðåìåííîé òèïà book. Äëÿ îïèñàíèÿ äâóõ êíèã íàì íóæíû äâå òàêèå ïåðåìåííûå è ò. ä. Äëÿ îáðàáîòêè íåñêîëüêèõ êíèã ïîòðåáóåòñÿ ìàññèâ òàêèõ ñòðóêòóð, è ìû åãî ñîçäàëè â ïðîãðàììå, ïîêàçàííîé íà ðèñ. 14.2.
/* èíâåíòàðèçàöèÿ áîëüøîãî êîëè÷åñòâà êíèã */
#include <stdio.h>
#define MAXTIT 40.
#define MAXAUT 40.
#define MAXBKS 100 /* ìàêñèìàëüíîå êîëè÷åñòâî êíèã */
#define STOP " " /* íóëåâàÿ ñòðîêà ïðåêðàùàåò ââîä */
Struct book { /* ñîçäàíèå øàáëîíà òèïà book */
Char title [MAXTIT];
Char author [MAXAUT];
Float value; };
Main ( ).
{
Struct book libry[MAXBKS]; /* ìàññèâ ñòðóêòóð òèïà book */
Int count = 0;
Int index;
Printf("Ââåäèòå, ïîæàëóéñòà, íàçâàíèå êíèãè.\n");
Printf(" Íàæìèòå êëàâèøó [ââîä] â íà÷àëå ñòðîêè äëÿ îñòàíîâà.\n");
While(strcmp(gets(libry [count].title), STOP) != 0 &&
count < MAXBKS).
{ printf("Ââåäèòå òåïåðü ôàìèëèþ àâòîðà.\n");
gets(libry [count].author);
printf("Ââåäèòå òåïåðü öåíó.\n");
scanf(" %f", & libry [count++].value);
while(getchar()!='n'); /* î÷èñòèòå ñòðîêó ââîäà */
if(counts < MAXBKS).
printf("Ââåäèòå íàçâàíèå ñëåäóþùåé êíèãè.\n");
} printf ("Âîò ñïèñîê âàøèõ êíèã: \n");
For(index = 0; index < count; index++).
Printf("%s, %s: %p.2f\n", libry [index].title, libry[index].author,
libry[index].value);
}
ÐÈÑ. 14.2. Ïðîãðàììà èíâåíòàðèçàöèè áîëüøîãî êîëè÷åñòâà êíèã.
Âîò ïðèìåð ðàáîòû ïðîãðàììû:
Ââåäèòå, ïîæàëóéñòà, íàçâàíèå êíèãè.
Íàæìèòå êëàâèøó [ââîä] â íà÷àëå ñòðîêè äëÿ îñòàíîâà.
Èñêóññòâî ïðîãðàììèðîâàíèÿ.
Ââåäèòå òåïåðü ôàìèëèþ àâòîðà. Ä.Êíóò.
Ââåäèòå òåïåðü öåíó.
5ð.67.
Ââåäèòå íàçâàíèå ñëåäóþùåé êíèãè.
... åùå ââîäû...
Âîò ñïèñîê âàøèõ êíèã:
Èñêóñòâî ïðîãðàììèðîâàíèÿ äëÿ ÝÂÌ, Ä.Êíóò: 5ð.67.
ÏË/1 äëÿ ïðîãðàììèñòîâ, Ñêîòò Ð., Ñîíäàê Í: 1ð.08.
Ïðîãðàììèðîâàíèå íà ÿçûêå Ïàñêàëü, Ï. Ãðîãîíî: 1ð.30.
ßçûê Ôîðòðàí 77, Ã. Êàíòàí: 0ð.80.
Òðàíñëÿöèÿ ÿçûêîâ ïðîãðàììèðîâàíèÿ, Ô. Âàéíãàðòåí: 0ð.75.
ßçûê Ýñïåðàíòî, Ì.È. Èñàåâ: 0ð.60.
Àññåìáëåðû è çàãðóç÷èêè, Ä.Áàððîí: 0ð.30.
Ñòðóêòóðíîå ïðîãðàììèðîâàíèå, Ó. Äàë, Ý. Äåéêñòðà, Ê. Õîîð: 1ð.11.
Îïåðàöèîííûå ñèñòåìû, Ã. Êàòöàí: 2ð.25.
Ïàðàëëåëüíûå âû÷èñëèòåëüíûå ñèñòåìû, Á.À.Ãîëîâêèí: 2ð.50.
Ñëåäóåò îáðàòèòü âíèìàíèå íà äâà âàæíûõ ìîìåíòà, îòíîñÿùèõñÿ ê ìàññèâàì ñòðóêòóð, - êàê îïèñûâàòü è êàê îáðàùàòüñÿ ê îòäåëüíûì èõ ýëåìåíòàì. Ïîñëå ðàçúÿñíåíèÿ ýòèõ âîïðîñîâ ìû âåðíåìñÿ è ñäåëàåì ïàðó çàìå÷àíèé ïî íàøåé ïðîãðàììå.
Îïèñàíèå ìàññèâà ñòðóêòóð.
Ïðîöåññ îïèñàíèÿ ìàññèâà ñòðóêòóð ñîâåðøåííî àíàëîãè÷åí îïèñàíèþ ëþáîãî äðóãîãî òèïà ìàññèâà:
Struct book libry [MAXBKS];
Ýòîò îïåðàòîð îáúÿâëÿåò libry ìàññèâîì, ñîñòîÿùèì èç MAXBKS-ýëåìåíòîâ. Êàæäûé ýëåìåíò ìàññèâà ïðåäñòàâëÿåò ñîáîé ñòðóêòóðó òèïà book. Òàêèì îáðàçîì, libry[0] ÿâëÿåòñÿ book-ñòðóêòóðîé, libry[1] - âòîðîé book-ñòðóêòóðîé è ò. ä. Ðèñ. 14.3 ìîæåò ïîìî÷ü âàì ïðåäñòàâèòü ýòî. Èìÿ libry ñàìî ïî ñåáå íå ÿâëÿåòñÿ èìåíåì ñòðóêòóðû; ýòî èìÿ ìàññèâà, ñîäåðæàùåãî ñòðóêòóðû.
ÐÈÑ. 14.3. Ìàññèâ ñòðóêòóð.
Îïðåäåëåíèå ýëåìåíòîâ ìàññèâà ñòðóêòóð.
Ïðè îïðåäåëåíèè ýëåìåíòîâ ìàññèâà ñòðóêòóð ìû ïðèìåíÿåì òå æå ñàìûå ïðàâèëà, êîòîðûå èñïîëüçóþòñÿ äëÿ îòäåëüíûõ ñòðóêòóð: ñîïðîâîæäàåì èìÿ ñòðóêòóðû îïåðàöèåé ïîëó÷åíèÿ ýëåìåíòà è èìåíåì ýëåìåíòà:
Libry [0].value value - ïåðâûé ýëåìåíò ìàññèâà.
Libry [4].title title - ïÿòûé ýëåìåíò ìàññèâà.
Çàìåòèì, ÷òî èíäåêñ ìàññèâà ïðèñîåäèíÿåòñÿ ê libry, à íå ê êîíöó èìåíè:
Libry. value[2] /* íåïðàâèëüíî */
Libry[2].value /* ïðàâèëüíî */
Ìû èñïîëüçóåì libry[2].value, ïîòîìó ÷òî libry[2] ÿâëÿåòñÿ èìåíåì ñòðóêòóðíîé ïåðåìåííîé òî÷íî òàê æå, êàê libry[l] ÿâëÿåòñÿ èìåíåì äðóãîé ñòðóêòóðíîé ïåðåìåííîé, à ðàíåå doyle áûëî èìåíåì ñòðóêòóðíîé ïåðåìåííîé.
Ìåæäó ïðî÷èì, ÷òî áû ýòî çíà÷èëî?
Libry[2].title[4].
Ýòî áûë áû ïÿòûé ýëåìåíò ýëåìåíòà title (ò. å. title[4]) ñòðóêòóðû òèïà book, îïèñàííûé òðåòüåé ñòðóêòóðîé (ò.e. libry[2]).  íàøåì ïðèìåðå èì áûë áû ñèìâîë ð. Ýòî îçíà÷àåò, ÷òî èíäåêñû, íàõîäÿùèåñÿ ñïðàâà îò îïåðàöèè ".", îòíîñÿòñÿ ê îòäåëüíûì ýëåìåíòàì, â òî âðåìÿ êàê èíäåêñû, ðàñïîëîæåííûå ñëåâà îò îïåðàöèè, îòíîñÿòñÿ ê ìàññèâàì ñòðóêòóð.
Òåïåðü ïîêîí÷èì ñ ýòîé ïðîãðàììîé.
Äåòàëèçàöèÿ ïðîãðàììû.
Ãëàâíîå îòëè÷èå åå îò íàøåé ïåðâîé ïðîãðàììû çàêëþ÷àåòñÿ â òîì, ÷òî òåïåðü ñîçäàåòñÿ öèêë äëÿ ñ÷èòûâàíèÿ íàçâàíèé êíèã. Ìû íà÷èíàåì öèêë ñ while-óñëîâèÿ:
While(strcmp(gets(libry [count].title), STOP) != 0.
&& count < MAXBKS).
Âûðàæåíèå gets(libry [count].title) ñ÷èòûâàåò ââîäèìóþ ñòðîêó, ñîäåðæàùóþ íàçâàíèå êíèãè. Ôóíêöèÿ strcmp( ) ñðàâíèâàåò ýòó ñòðîêó ñî STOP, êîòîðàÿ ÿâëÿåòñÿ " " , ò.e. ïóñòîé ñòðîêîé. Åñëè ïîëüçîâàòåëü íàæìåò êëàâèøó [ââîä] â íà÷àëå ñòðîêè, òî ïåðåïèøåòñÿ ïóñòàÿ ñòðîêà è öèêë çàêîí÷èòñÿ. Ìû òàêæå äîëæíû ïðîâåðÿòü, íå ïðåâûñèëî ëè ÷èñëî ñ÷èòàííûõ íà òåêóùèé ìîìåíò êíèã ïðåäåëüíîãî ðàçìåðà ìàññèâà.
 ïðîãðàììå åñòü ñòðàííàÿ ñòðîêà while(getchar ( ) ! = '\n'); /* î÷èñòèòü ñòðîêó ââîäà */
Îíà âêëþ÷åíà äëÿ òîãî, ÷òîáû èñïîëüçîâàòü îñîáåííîñòü ôóíêöèè scanf( ), êîòîðàÿ èãíîðèðóåò ñèìâîëû ïðîáåëà è íîâîé ñòðîêè. Êîãäà âû îòâå÷àåòå íà çàïðîñ îá ýëåìåíòå value â ñòðóêòóðå book, òî ââîäèòå ÷òî-íèáóäü âðîäå.
12.50 [ââîä].
Ïðè ýòîì ïåðåäàåòñÿ ïîñëåäîâàòåëüíîñòü ñèìâîëîâ.
12.50\n.
Ôóíêöèÿ scanf( ) ñîáèðàåò ñèìâîëû 1, 2, . , 5, 0, íî îïóñêàåò ñèìâîë \n, ñòîÿùèé òàì, è îæèäàåò, ÷òî ñëåäîì ïðèäåò åùå êàêîé-íèáóäü îïåðàòîð ÷òåíèÿ. Åñëè ïðîïóñòèòü íàøó ñòðàííóþ ñòðîêó, òî ñëåäóþùèì îïåðàòîðîì ÷òåíèÿ áóäåò gets(libry [count].title) â îïåðàòîðå óïðàâëåíèÿ öèêëîì. Îí ïðî÷åë áû îñòàâøèéñÿ ñèìâîë íîâîé ñòðîêè êàê ïåðâûé ñèìâîë, è ïðîãðàììà ðåøèëà áû, ÷òî ìû ïîñëàëè ñèãíàë îñòàíîâà. Ïîýòîìó ìû è âñòàâèëè òàêóþ ñòðàííóþ ñòðîêó. Åñëè âû ïîíÿëè ýòî, òî óâèäèòå, ÷òî îíà "ïðîãëàòûâàåò" ñèìâîëû äî òåõ ïîð, ïîêà íå íàéäåò è íå ïîëó÷èò ñèìâîë íîâîé ñòðîêè. Ôóíêöèÿ íè÷åãî íå äåëàåò ñ äàííûì ñèìâîëîì, òîëüêî ïðèíèìàåò åãî îò óñòðîéñòâà ââîäà. Ýòî ïðèâîäèò ê òîìó, ÷òî ôóíêöèÿ gets( ) ñíîâà íà÷èíàåò ðàáîòàòü. Âåðíåìñÿ òåïåðü ê èçó÷åíèþ ñòðóêòóð.
ÂËÎÆÅÍÍÛÅ ÑÒÐÓÊÒÓÐÛ.
Èíîãäà áûâàåò óäîáíî, ÷òîáû îäíà ñòðóêòóðà ñîäåðæàëàñü èëè áûëà "âëîæåíà" â äðóãóþ. Íàïðèìåð, Øàëàëà Ïèðîñêè ñòðîèò ñòðóêòóðó, ñîäåðæàùóþ èíôîðìàöèþ î åå äðóçüÿõ. Îäèí ýëåìåíò ñòðóêòóðû - ýòî, êîíå÷íî, èìÿ äðóãà. Îäíàêî èìÿ ìîæíî ïðåäñòàâèòü ñàìîé ñòðóêòóðîé ñ ðàçíûìè ýëåìåíòàìè äëÿ èìåíè è ôàìèëèè. Íà ðèñ. 14.4 ïðèâåäåí ñîêðàùåííûé ïðèìåð äåÿòåëüíîñòè Øàëàëû.
/* ïðèìåð âëîæåííîé ñòðóêòóðû */
#define LEN 20.
#define M1 "Ñïàñèáî çà ïðåêðàñíûé âå÷åð,".
#define M2 "Âû, êîíå÷íî, ïðàâû, ÷òî".
#define M3 " -ñâîåîáðàçíûé ïàðåíü. Ìû äîëæíû ñîáðàòüñÿ".
#define Ì4 " îòâåäàòü î÷åíü âêóñíûé".
#define M5 "è íåìíîãî ïîâåñåëèòüñÿ.".
Struct names { /*ïåðâûé ñòðóêòóðíûé øàáëîí */
Char first[LEN];
Char last[LEN], };
Struct guy { /* âòîðîé øàáëîí */
Struct names handle; /* âëîæåííàÿ ñòðóêòóðà */
Char favfood[LEN];
Char job[LEN];
Float income;
};
Main( ) {
Static struct guy fellow = { /*èíèöèàëèçàöèÿ ïåðåìåííîé */
{" Ôðàíêî," " Óîòýë"},
" áàêëàæàí",
" âÿçàëüùèê ïîëîâèêîâ",
15435.00 };
Printf("Äîðîãîé %s, \n \n," fellow.handle.first);
Printf(" %s %s.\n", M1, fellow.handle.first);
Printf(" %s %s\n" , M2, fellow.job);
Printf(" %s \n" , M3);
Printf(" %s %s %s\n\n", M4, fellow.favfood, M5);
Printf(" %40s %s \n", " " , " Äî ñêîðîé âñòðå÷è" );
Printf(" %40s %s\n", " ", Øàëàëà");
}
ÐÈÑ. 14.4. Ïðîãðàììà âëîæåííîé ñòðóêòóðû.
Âîò ðåçóëüòàò ðàáîòû ïðîãðàììû:
Äîðîãîé Ôðàíêî,
Ñïàñèáî çà ïðåêðàñíûé âå÷åð, Ôðàíêî.
Âû, êîíå÷íî, ïðàâû. ÷òî âÿçàëüùèê ïîëîâèêîâ - ñâîåîáðàçíûé ïàðåíü.
Ìû äîëæíû ñîáðàòüñÿ îòâåäàòü î÷åíü âêóñíûé áàêëàæàí è íåìíîãî ïîâåñåëèòüñÿ.
Äî ñêîðîé âñòðå÷è,
Øàëàëà.
Âî-ïåðâûõ, ñëåäóåò ðàññêàçàòü î òîì, êàê ïîìåñòèòü âëîæåííóþ ñòðóêòóðó â øàáëîí. Îíà ïðîñòî îïèñûâàåòñÿ òî÷íî òàê æå, êàê ýòî äåëàëîñü áû äëÿ ïåðåìåííîé òèïà int:
Struct names handle;
Ýòî îçíà÷àåò, ÷òî handle ÿâëÿåòñÿ ïåðåìåííîé òèïà struct names. Êîíå÷íî, ôàéë äîëæåí òàêæå ñîäåðæàòü øàáëîí äëÿ ñòðóêòóðû òèïà names.
Âî-âòîðûõ, ñëåäóåò ðàññêàçàòü, êàê ìû ïîëó÷àåì äîñòóï ê ýëåìåíòó âëîæåííîé ñòðóêòóðû. Íóæíî äâàæäû èñïîëüçîâàòü îïåðàöèþ "." :
Fellow.handle.first = = " Ôðàíêî";
Ìû èíòåðïðåòèðóåì ýòó êîíñòðóêöèþ, ïåðåìåùàÿñü ñëåâà íàïðàâî;
(fellow.handle).first.
Òî åñòü ïåðâûì íàõîäèì ýëåìåíò fellow, äàëåå ýëåìåíò handle ñòðóêòóðû fellow, à çàòåì åãî ýëåìåíò first. Òåïåðü ðàññìîòðèì óêàçàòåëè.
ÓÊÀÇÀÒÅËÈ ÍÀ ÑÒÐÓÊÒÓÐÛ.
Ëþáèòåëè óêàçàòåëåé áóäóò ðàäû óçíàòü, ÷òî óêàçàòåëè ìîæíî èñïîëüçîâàòü è äëÿ ñòðóêòóð. Ýòî õîðîøî ïî êðàéíåé ìåðå ïî òðåì ïðè÷èíàì. Âî-ïåðâûõ, òî÷íî òàê æå êàê óêàçàòåëè íà ìàññèâû, îíè ëåã÷å â èñïîëüçîâàíèè (ñêàæåì, â çàäà÷å ñîðòèðîâêè), ÷åì ñàìè ìàññèâû, à óêàçàòåëÿìè íà ñòðóêòóðû ëåã÷å ïîëüçîâàòüñÿ, ÷åì ñàìèìè ñòðóêòóðàìè. Âî-âòîðûõ, ñòðóêòóðà íå ìîæåò èñïîëüçîâàòüñÿ â êà÷åñòâå àðãóìåíòà ôóíêöèè, à óêàçàòåëü íà ñòðóêòóðó ìîæåò. Â-òðåòüèõ, ìíîãèå óäîáíûå ïðåäñòàâëåíèÿ äàííûõ ÿâëÿþòñÿ ñòðóêòóðàìè, ñîäåðæàùèìè óêàçàòåëè ê äðóãèì ñòðóêòóðàì.
Ñëåäóþùèé êîðîòêèé ïðèìåð (ðèñ. 14.5) ïîêàçûâàåò, êàê îïðåäåëÿòü óêàçàòåëü íà ñòðóêòóðó è êàê èñïîëüçîâàòü åãî äëÿ ïîëó÷åíèÿ ýëåìåíòîâ ñòðóêòóðû.
/* óêàçàòåëü íà ñòðóêòóðó */
#define LEN 20 struct names {
Char first [LEN];
Char last [LEN]; };
Struct guy {
Struct names handle;
Char favfood [LEN];
Char job [LEN];
Float income; };
Main( ) {
Static struct guy fellow [2] = {
{ "Ôðàíêî", "Óîòýë" }.
"áàêëàæàí",
" âÿçàëüùèê ïîëîâèêîâ ",
15435.00},
{{"Ðîäíåé", "Ñâèëáåëè" },
"ëîñîñåâûé ìóññ", "äåêîðàòîð èíòåðüåðà",
35000.00 } };
Struct guy *him; /* ÝÒÎ - - óêàçàòåëü ïà ñòðóêòóðó */
Printf("àäðåñ #1: %u #2 : %u\n", &fellow[0],
&fellow[1]);
Him = &fellow[0]; /* ñîîáùàåò óêàçàòåëþ, íà ÷òî ññûëàòüñÿ */
Printf("óêàçàòåëü #1: %u #2: %u \n ", him, him + 1);
Printf("him -> äîõîä $ %.2f: (*him).äîõîä $ %.2f \n",
him -> äîõîä, (*him).äîõîä);
Him++; /* óêàçûâàåò íà ñëåäóþùóþ ñòðóêòóðó */
Printf("him -> favfood is %s : him -> names.last is %s\n",
him-> favfood, him -> handle.last);}.
ÐÈÑ. 14.5. Ïðîãðàììà ñ èñïîëüçîâàíèåì óêàçàòåëÿ íà ñòðóêòóðó.
Âîò, ïîæàëóéñòà, åå âûõîä:
Àäðåñ #1: 12 #2: 96.
Óêàçàòåëü #1: 12 #2: 96.
Him -> äîõîä $15435.00: (*him).äîõîä $15435.00.
Him -> favfood ëîñîñåâûé ìóññ: him -> names.last.
- Ñâèëáåëè.
Ñíà÷àëà ïîñìîòðèì, êàê ìû ñîçäàëè óêàçàòåëü íà ñòðóêòóðó guy. Çàòåì íàó÷èìñÿ îïðåäåëÿòü îòäåëüíûå ýëåìåíòû ñòðóêòóðû ïðè ïîìîùè óêàçàòåëåé.
Îïèñàíèå è èíèöèàëèçàöèÿ óêàçàòåëÿ íà ñòðóêòóðó.
Âîò ñàìîå ïðîñòîå îïèñàíèå, êàêîå òîëüêî ìîæåò áûòü:
Struct guy *him;
Ïåðâûì ñòîèò êëþ÷åâîå ñëîâî struct, çàòåì ñëîâî guy, ÿâëÿþùååñÿ èìåíåì ñòðóêòóðíîãî øàáëîíà, äàëåå * è çà íåþ èìÿ óêàçàòåëÿ. Ñèíòàêñèñ òîò æå, êàê äëÿ îïèñàíèé äðóãèõ óêàçàòåëåé, êîòîðûå ìû âèäåëè.
Òåïåðü ìîæíî ñîçäàòü óêàçàòåëü him äëÿ ññûëîê íà ëþáûå ñòðóêòóðû òèïà guy. Ìû èíèöèàëèçèðóåì him, çàñòàâëÿÿ åãî ññûëàòüñÿ íà fellow[0]; çàìåòèì, ÷òî ìû èñïîëüçóåì îïåðàöèþ ïîëó÷åíèÿ àäðåñà:
Him = &fellow[0];
Ïåðâûå äâå âûâåäåííûå ñòðîêè ïîêàçûâàþò ðåçóëüòàò ýòîãî ïðèñâàèâàíèÿ. Ñðàâíèâàÿ äâå ñòðîêè, ìû âèäèì, ÷òî him ññûëàåòñÿ íà fellow[0], a him+1 - íà fellow[l]. Çàìåòèì, ÷òî äîáàâëåíèå 1 ê him ïðèáàâëÿåò 84 ê àäðåñó. Ýòî ïðîèñõîäèò ïîòîìó, ÷òî êàæäàÿ guy-ñòðóêòóðà çàíèìàåò 84 áàéòà ïàìÿòè: ïåðâîå èìÿ - 20, ïîñëåäíåå èìÿ - 20, favfood - 20, job - 20 è income - 4 áàéòà (ðàçìåð ýëåìåíòà òèïà float â íàøåé ñèñòåìå).
Äîñòóï ê ýëåìåíòó ñòðóêòóðû ïðè ïîìîùè óêàçàòåëÿ.
him ññûëàåòñÿ íà ñòðóêòóðó fellow[0]. Êàêèì îáðàçîì ìîæíî èñïîëüçîâàòü him äëÿ ïîëó÷åíèÿ çíà÷åíèÿ ýëåìåíòà ñòðóêòóðû fellow[0]? Òðåòüÿ âûâåäåííàÿ ñòðîêà äàñò äëÿ ýòîãî äâà ñïîñîáà.
Ïåðâûé ñïîñîá, íàèáîëåå îáùèé, èñïîëüçóåò íîâóþ îïåðàöèþ ->. Îíà çàêëþ÷àåòñÿ â ââîäå äåôèñà (-) è ñëåäóþùåãî çà íèì ñèìâîëà "áîëüøå ÷åì" (>). Ïðèìåð ïîìîãàåò ïîíÿòü ñìûñë ñêàçàííîãî:
Him -> income - ýòî fellow[0].income,
åñëè him = &fellow[0].
Äðóãèìè ñëîâàìè, ñòðóêòóðíûé óêàçàòåëü, çà êîòîðûì ñëåäóåò îïåðàöèÿ ->, ðàáîòàåò òàê æå, êàê èìÿ ñòðóêòóðû ñ ïîñëåäóþùåé îïåðàöèåé ".". (Ìû íå ìîæåì ñêàçàòü him.income, ïîòîìó ÷òî him íå ÿâëÿåòñÿ èìåíåì ñòðóêòóðû.).
Î÷åíü âàæíî îòìåòèòü, ÷òî him-óêàçàòåëü, à him - > income - ýëåìåíò ñòðóêòóðû, íà êîòîðóþ äåëàåòñÿ ññûëêà. Òàêèì îáðàçîì, â ýòîì ñëó÷àå him - > income ÿâëÿåòñÿ ïåðåìåííîé òèïà float.
Âòîðîé ñïîñîá îïðåäåëåíèÿ çíà÷åíèÿ ýëåìåíòà ñòðóêòóðû âûòåêàåò èç ïîñëåäîâàòåëüíîñòè:
Åñëè him == &fellow[0], òî *him == fellow[0]. Ýòî òàê, ïîñêîëüêó & è * - âçàèìîîáðàòíûå îïåðàöèè. Ñëåäîâàòåëüíî, ïîñëå ïîäñòàíîâêè.
Fellow[0].income == (*him).income.
Êðóãëûå ñêîáêè íåîáõîäèìû, ïîñêîëüêó îïåðàöèÿ "." èìååò ïðèîðèòåò âûøå, ÷åì *.
Îòñþäà ìîæíî ñäåëàòü âûâîä, ÷òî åñëè him ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó fellow[0], òî ñëåäóþùèå îáîçíà÷åíèÿ ýêâèâàëåíòíû:
Fellow[0].income == (*him).income == him->income.
Äàâàéòå òåïåðü ïîñìîòðèì, êàê âçàèìîäåéñòâóþò ñòðóêòóðû è ôóíêöèè.
Ðåçþìå: îïåðàöèè íàä ñòðóêòóðàìè è îáúåäèíåíèÿìè.
Ýòà îïåðàöèÿ èñïîëüçóåòñÿ ñ èìåíåì ñòðóêòóðû èëè îáúåäèíåíèÿ äëÿ îïðåäåëåíèÿ ýëåìåíòà ýòîé ñòðóêòóðû èëè îáúåäèíåíèÿ. Åñëè name ÿâëÿåòñÿ èìåíåì ñòðóêòóðû, a member - ýëåìåíòîì, îïðåäåëåííûì ñòðóêòóðíûì øàáëîíîì, òî name.member îáîçíà÷àåò ýòîò ýëåìåíò ñòðóêòóðû. Îïåðàöèÿ ïîëó÷åíèÿ ýëåìåíòà ìîæåò èñïîëüçîâàòüñÿ òàêèì æå îáðàçîì äëÿ îáúåäèíåíèé.
Ïðèìåðû
Struct {
Int code;
Float cost;
} item;
Item.code = 1265;
Äàííûé îïåðàòîð ïðèñâàèâàåò çíà÷åíèå ýëåìåíòó code ñòðóêòóðû item.
II. ÎÏÅÐÀÖÈß ÊÎÑÂÅÍÍÎÃÎ ÏÎËÓ×ÅÍÈß ÝËÅÌÅÍÒÀ: ->
Ýòà îïåðàöèÿ èñïîëüçóåòñÿ ñ óêàçàòåëåì íà ñòðóêòóðó èëè îáúåäèíåíèå äëÿ îïðåäåëåíèÿ ýëåìåíòà ñòðóêòóðû èëè îáúåäèíåíèÿ. Ïðåäïîëîæèì, ÷òî ptrstr ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó è ÷òî member ýëåìåíò, îïðåäåëåííûé ñòðóêòóðíûì øàáëîíîì. Òîãäà.
Ptrstr -> member.
Îïðåäåëÿåò ýëåìåíò, íà êîòîðûé âûïîëíÿåòñÿ ññûëêà. Îïåðàöèþ êîñâåííîãî îáðàùåíèÿ ê ýëåìåíòó ìîæíî èñïîëüçîâàòü òàêèì æå îáðàçîì è äëÿ îáúåäèíåíèé.
Ïðèìåð
Struct {
Int code.
Float cost;
} item, *ptrst;
Ptrst = &item;
Ptrst -> code = 3451;
Îïåðàòîðû ïðèñâàèâàþò çíà÷åíèå ýëåìåíòó code ñòðóêòóðû item. Ñëåäóþùèå òðè âûðàæåíèÿ ýêâèâàëåíòíû:
Ptrst->code item.code (*ptrst).code.
ÏÅÐÅÄÀ×À ÈÍÔÎÐÌÀÖÈÈ Î ÑÒÐÓÊÒÓÐÀÕ ÔÓÍÊÖÈßÌ.
Âñïîìíèì, ÷òî àðãóìåíòû ôóíêöèè ïåðåäàþò çíà÷åíèÿ â ôóíêöèþ. Êàæäîå çíà÷åíèå ÿâëÿåòñÿ ëèáî ÷èñëîì òèïà int èëè float, ëèáî ASCII-êîäîì èëè àäðåñîì. Ñòðóêòóðà ãîðàçäî ñëîæíåå, ÷åì îòäåëüíàÿ ïåðåìåííàÿ, ïîýòîìó íåóäèâèòåëüíî, ÷òî ñàìó ñòðóêòóðó íåëüçÿ èñïîëüçîâàòü â êà÷åñòâå àðãóìåíòà ôóíêöèè. (Ýòî îãðàíè÷åíèå ñíÿòî â íåêîòîðûõ íîâûõ ðåàëèçàöèÿõ.) Îäíàêî åñòü ñïîñîáû ââåñòè èíôîðìàöèþ î ñòðóêòóðå âíóòðü ôóíêöèè. Ðàññìîòðèì òðè ñïîñîáà (íà ñàìîì äåëå äâà ñ âàðèàöèÿìè).
Èñïîëüçîâàíèå ýëåìåíòîâ ñòðóêòóðû.
Ïîñêîëüêó ýëåìåíò ñòðóêòóðû ÿâëÿåòñÿ ïåðåìåííîé ñ åäèíñòâåííûì çíà÷åíèåì (ò.å. òèïà int èëè îäíîãî èç åãî "ðîäñòâåííèêîâ" - char, float, double èëè óêàçàòåëü), îí ìîæåò áûòü ïåðåäàí êàê àðãóìåíò ôóíêöèè. Ïðîñòàÿ ïðîãðàììà ôèíàíñîâûõ ðàñ÷åòîâ íà ðèñ. 14.6, êîòîðàÿ ïðèáàâëÿåò âçíîñ êëèåíòà ê åãî ñ÷åòó, èëëþñòðèðóåò ýòîò ñïîñîá. Çàìåòèì, ìåæäó ïðî÷èì, ÷òî ìû îáúåäèíèëè îïðåäåëåíèå øàáëîíà, îïèñàíèå ïåðåìåííîé è èíèöèàëèçàöèþ â îäèí îïåðàòîð.
/* ïåðåäà÷à ýëåìåíòîâ ñòðóêòóðû êàê àðãóìåíòîâ ôóíêöèè */
Struct funds {
Char *bank;
Float bankfund;
Char *save;
Float savefund; }.
Stan = { " Áàíê ñèíüîðà Ïîìèäîðà",
1023.43,
" Ñáåðåæåíèÿ è çàéìû Ñíóïè",
4239.87 };
Main( ).
{
Float total, sum( );
Extern struct funds stan; /* íåîáÿçàòåëüíîå îïèñàíèå */
Printf("Ó Ñòýíà âñåãî %.2f äîëë.\n", sum(stan.bankfund,
stan.savefund));
}
/* ñêëàäûâàåò äâà ÷èñëà òèïà float */
Float sum(x, ó);
Float x, ó;
{ return( x + y); }.
ÐÈÑ. 14.6. Ïðîãðàììà, ïåðåäàþùàÿ ôóíêöèè àðãóìåíòû, ÿâëÿþùèåñÿ ýëåìåíòàìè ñòðóêòóðû.
Ðåçóëüòàò âûïîëíåíèÿ ýòîé ïðîãðàììû:
Ó Ñòýíà âñåãî 5263.30 äîëë.
Âîò ýòî äà, îíà ðàáîòàåò. Çàìåòèì, ÷òî ôóíêöèÿ sum( ) "íå çíàåò", èëè æå ñè áåçðàçëè÷íî, ÿâëÿþòñÿ ëè ýëåìåíòàìè ñòðóêòóðû ôàêòè÷åñêèå àðãóìåíòû; îíà òîëüêî "òðåáóåò", ÷òîáû îíè èìåëè òèï float.
Êîíå÷íî, åñëè âû õîòèòå, ÷òîáû ïðîãðàììà âîçäåéñòâîâàëà íà çíà÷åíèå ýëåìåíòà â âûçûâàþùåé ïðîãðàììå, ìîæíî ïåðåäàòü åé àäðåñ ýòîãî ýëåìåíòà:
Modify(&stan.bank fund);
È òîãäà ïîëó÷èëàñü áû ôóíêöèÿ, êîòîðàÿ èçìåíèëà áû áàíêîâñêèé ñ÷åò â ñòðóêòóðå stan.
Âòîðîé ñïîñîá ïåðåäà÷è èíôîðìàöèè î ñòðóêòóðå çàêëþ÷àåòñÿ â âîçìîæíîñòè ñîîáùèòü ñóììèðóþùåé ôóíêöèè, ÷òî îíà èìååò äåëî ñî ñòðóêòóðîé.
Èñïîëüçîâàíèå àäðåñà ñòðóêòóðû.
Ìû áóäåì ðåøàòü òó æå ñàìóþ çàäà÷ó, ÷òî è ïðåæäå, íî ïðè ýòîì èñïîëüçîâàòü àäðåñ ñòðóêòóðû â êà÷åñòâå àðãóìåíòà. Ýòî õîðîøî, ïîñêîëüêó àäðåñ ïðåäñòàâëÿåò ñîáîé òîëüêî îäíî ÷èñëî. Òàê êàê ôóíêöèÿ äîëæíà ðàáîòàòü ñî ñòðóêòóðîé funds, îíà òîæå äîëæíà èñïîëüçîâàòü øàáëîí funds. Ñì. ðèñ. 14.7.
/* ïåðåäà÷à àäðåñà ñòðóêòóðû â ôóíêöèþ */
Struct funds {
char *bank;
float bankfund;
char *save;
float savefund;
} stan = {
"Áàíê ñèíüîðà Ïîìèäîðà" ,
1023.43,
" Ñáåðåæåíèÿ è çàéìû Ñíóïè" ,
4239.87.
};
Main( ).
{
Float total, sum( );
Printf(" Ó Ñòýíà âñåãî %.2f äîëë.\n", sum(&stan) );
}
Float sum (money).
Struct funds *money;
}
Return( money-> bankfund + money-> savefund);
}
ÐÈÑ. 14.7. Ïðîãðàììà, ïåðåäàþùàÿ ôóíêöèè àäðåñ ñòðóêòóðû. Ýòà ïðîãðàììà òîæå âûäàåò.
Ó Ñòýíà âñåãî 5263.30 äîëë.
Ôóíêöèÿ sum( ) èìååò óêàçàòåëü (money) íà ñòðóêòóðó fund. Ïåðåäà÷à àäðåñà &stan â ôóíêöèþ çàñòàâëÿåò óêàçàòåëü money ññûëàòüñÿ íà ñòðóêòóðó stan. Çàòåì èñïîëüçóåì îïåðàöèþ - > äëÿ ïîëó÷åíèÿ çíà÷åíèé ýëåìåíòîâ stan.bankfund è stan.savefund.
Ýòà ôóíêöèÿ òàêæå èìååò äîñòóï ê íàçâàíèÿì ó÷ðåæäåíèé, õîòÿ èõ íå èñïîëüçóåò. Çàìåòèì, ÷òî ìû äîëæíû ïðèìåíÿòü îïåðàöèþ & äëÿ ïîëó÷åíèÿ àäðåñà ñòðóêòóðû.  îòëè÷èå îò èìåíè ìàññèâà èìÿ ñòðóêòóðû ñàìî ïî ñåáå íå ÿâëÿåòñÿ ñèíîíèìîì ñâîåãî àäðåñà.
Íàø ñëåäóþùèé ñïîñîá ïðèìåíèì ê ìàññèâàì ñòðóêòóð è ÿâëÿåòñÿ âàðèàíòîì äàííîãî ñïîñîáà.
Èñïîëüçîâàíèå ìàññèâà.
Ïðåäïîëîæèì, ó íàñ åñòü ìàññèâ ñòðóêòóð. Èìÿ ìàññèâà ÿâëÿåòñÿ ñèíîíèìîì åãî àäðåñà, ïîýòîìó åãî ìîæíî ïåðåäàòü ôóíêöèè. Ñ äðóãîé ñòîðîíû, ôóíêöèè áóäåò íåîáõîäèì äîñòóï ê ñòðóêòóðíîìó øàáëîíó. ×òîáû ïîêàçàòü, êàê òàêàÿ ïðîãðàììà ðàáîòàåò (ðèñ. 14.8), ìû ðàñøèðèì íàøó ïðîãðàììó òàêèì îáðàçîì, ÷òîáû îíà îáñëóæèâàëà äâóõ ÷åëîâåê, à ìû, ñëåäîâàòåëüíî, èìåëè áû ìàññèâ äâóõ ñòðóêòóð funds.
/* ïåðåäà÷à ìàññèâà ñòðóêòóð â ôóíêöèþ */
Struct funds {
char *bank;
float bankfund;
char *save;
float savefund; }.
Jones[2] ={
{ " Áàíê ñèíüîðà Ïîìèäîðà" ,
1023.43,
" Ñáåðåæåíèÿ è çàéìû Ñíóïè" ,
4239.87 },
{ " Áàíê ×åñòíîãî Äæåêà",
976.57,
"Íàêîïëåíèÿ ïî ïðåäâàðèòåëüíîìó ïëàíó",
1760.13 } };
Main( ).
{
Float total, sum( );
Printf("Äæîíñû èìåþò âñåãî %.2f äîëë.\n", sum(jones));
}
Float sum(money);
Struct funds *money;
{
Float total;
Int i;
for( i = 0, total = 0; i < 2; i++, money++ ).
total += money- > bankfund + money -> savefund;
return(total);
}
ÐÈÑ. 14. 8. Ïðîãðàììà, ïåðåäàþùàÿ ôóíêöèè ìàññèâ ñòðóêòóð.
Ïðîãðàììà âûäàåò.
Äæîíñû èìåþò âñåãî 8000.00 äîëë.
(×òî çà êðóãëàÿ ñóììà! Ìîæíî ïîäóìàòü, ÷òî ýòè öèôðû âçÿòû ñ ïîòîëêà.) Èìÿ ìàññèâà jones ÿâëÿåòñÿ óêàçàòåëåì íà ìàññèâ.  ÷àñòíîñòè, îíî ññûëàåòñÿ íà ïåðâûé ýëåìåíò ìàññèâà, êîòîðûé ÿâëÿåòñÿ ñòðóêòóðîé jones[0]. Òàêèì îáðàçîì, â íà÷àëå óêàçàòåëü money çà äàåòñÿ ÷åðåç.
Money = &jones[0];
Çàòåì èñïîëüçîâàíèå îïåðàöèè - > ïîçâîëÿåò íàì äîáàâèòü äâà âêëàäà äëÿ ïåðâîãî Äæîíñà. Ýòî äåéñòâèòåëüíî î÷åíü ïîõîæå íà ïîñëåäíèé ïðèìåð. Äàëåå, öèêë for óâåëè÷èâàåò óêàçàòåëü money íà 1. Òåïåðü îí ññûëàåòñÿ íà ñëåäóþùóþ ñòðóêòóðó, jones[1], è îñòàòîê âêëàäîâ ìîæåò áûòü äîáàâëåí ê total.
Âîò äâà îñíîâíûõ çàìå÷àíèÿ:
1. Èìÿ ìàññèâà ìîæíî èñïîëüçîâàòü äëÿ ïåðåäà÷è â ôóíêöèþ óêàçàòåëÿ íà ïåðâóþ ñòðóêòóðó â ìàññèâå.
2. Çàòåì ìîæíî èñïîëüçîâàòü àðèôìåòè÷åñêóþ îïåðàöèþ íàä óêàçàòåëåì, ÷òîáû ïåðåäâèãàòü åãî íà ïîñëåäóþùèå ñòðóêòóðû â ìàññèâå. Çàìåòèì, ÷òî âûçîâ ôóíêöèè.
Sum(&jones[0]).
Äàë áû òîò æå ñàìûé ýôôåêò, ÷òî è ïðèìåíåíèå èìåíè ìàññèâà, òàê êàê îáà îíè ññûëàþòñÿ íà îäèí è òîò æå àäðåñ. Èñïîëüçîâàíèå èìåíè ìàññèâà ÿâëÿåòñÿ ïðîñòî êîñâåííûì ñïîñîáîì ïåðåäà÷è àäðåñà ñòðóêòóðû.
ÑÒÐÓÊÒÓÐÛ: ×ÒÎ ÄÀËÜØÅ?
Ìû íå áóäåì áîëüøå ðàññêàçûâàòü î ñòðóêòóðàõ, íî õîòåëîñü áû îòìåòèòü îäíî î÷åíü âàæíîå èñïîëüçîâàíèå ñòðóêòóð: ñîçäàíèå íîâûõ òèïîâ äàííûõ. Ïîëüçîâàòåëè êîìïüþòåðîâ ðàçðàáîòàëè íîâûå òèïû äàííûõ, ãîðàçäî áîëåå ýôôåêòèâíûå äëÿ îïðåäåëåííûõ çàäà÷, ÷åì ìàññèâû è ïðîñòûå ñòðóêòóðû, êîòîðûå ìû îïèñàëè.
Ýòè òèïû èìåþò òàêèå íàçâàíèÿ, êàê î÷åðåäè, äâîè÷íûå äåðåâüÿ, íåóïîðÿäî÷åííûå ìàññèâû, ðàíäîìèçèðîâàííûå òàáëèöû è ãðàôû. Ìíîãèå èç ýòèõ òèïîâ ñîçäàþòñÿ èç "ñâÿçàííûõ" ñòðóêòóð. Îáû÷íî êàæäàÿ ñòðóêòóðà áóäåò ñîäåðæàòü îäèí èëè äâà òèïà äàííûõ ïëþñ îäèí èëè äâà óêàçàòåëÿ íà äðóãèå ñòðóêòóðû òàêîãî æå òèïà. Óêàçàòåëè ñëóæàò äëÿ ñâÿçè îäíîé ñòðóêòóðû ñ äðóãîé è äëÿ îáåñïå÷åíèÿ ïóòè, ïîçâîëÿþùåãî âàì âåñòè ïîèñê ïî âñåé ñòðóêòóðå. Íàïðèìåð, íà ðèñ. 14.9 ïîêàçàíî äâîè÷íîå äåðåâî, â êîòîðîì êàæäàÿ îòäåëüíàÿ ñòðóêòóðà (èëè "óçåë") ñâÿçàíà ñ äâóìÿ, ðàñïîëîæåííûìè íèæå.

ÐÈÑ. 14.9. Ñòðóêòóðà äâîè÷íîãî äåðåâà.
ßâëÿåòñÿ ëè ýòà ðàçâåòâëåííàÿ êîíñòðóêöèÿ áîëåå ýôôåêòèâíîé ÷åì ìàññèâ? Ðàññìîòðèì ñëó÷àé äåðåâà ñ 10 óðîâíÿìè óçëîâ. Åñëè âû ñîñòàâèòå åãî, òî íàéäåòå 1023 óçëà, â êîòîðûõ âû ìîæåòå çàïîìíèòü, ñêàæåì, 1023 ñëîâà. Åñëè ñëîâà óïîðÿäî÷åíû, ñîãëàñíî íåêîòîðîìó ðàçóìíîìó ïëàíó, âû ìîæåòå íà÷àòü ñ âåðõíåãî óðîâíÿ è íàõîäèòü ëþáîå ñëîâî â ëó÷øåì ñëó÷àå çà 9 ïåðåìåùåíèé, åñëè âàø ïîèñê èäåò ñâåðõó âíèç ñ îäíîãî óðîâíÿ íà ñëåäóþùèé. Åñëè ñëîâà íàõîäÿòñÿ â ìàññèâå, âàì, ìîæåò áûòü, ïðèäåòñÿ ïåðåáðàòü âñå 1023 ýëåìåíòà, ïðåæäå ÷åì âû íàéäåòå íóæíîå ñëîâî.
Êîãäà âàñ èíòåðåñóþò áîëåå ïðîãðåññèâíûå ñòðóêòóðû äàííûõ, îáðàòèòåñü ê ëèòåðàòóðå ïî âû÷èñëèòåëüíîé òåõíèêå. Èñïîëüçóÿ ñòðóêòóðû ÿçûêà Ñè, âû ñìîæåòå ñîçäàâàòü òèïû, î êîòîðûõ âû ïðî÷èòàëè.
Ýòî íàøå ïîñëåäíåå ñëîâî î ñòðóêòóðàõ. Äàëåå ìû õîòèì âêðàòöå îçíàêîìèòü âàñ ñ äâóìÿ äðóãèìè ñðåäñòâàìè ÿçûêà Ñè äëÿ ðàáîòû ñ äàííûìè: îáúåäèíåíèåì è ôóíêöèåé typedef.
ÎÁÚÅÄÈÍÅÍÈß - ÊÐÀÒÊÈÉ ÎÁÇÎÐ.
Îáúåäèíåíèå - ýòî ñðåäñòâî, ïîçâîëÿþùåå çàïîìèíàòü äàííûå ðàçëè÷íûõ òèïîâ â îäíîì è òîì æå ìåñòå ïàìÿòè. Òèïè÷íûì èñïîëüçîâàíèåì åãî áûëî áû ñîçäàíèå òàáëèöû, ñîäåðæàùåé ñìåñü òèïîâ â íåêîòîðîì ïîðÿäêå, êîòîðûé íå ÿâëÿåòñÿ ïîñòîÿííûì è íå èçâåñòåí çàðàíåå. Îáúåäèíåíèå ïîçâîëÿåò ñîçäàâàòü ìàññèâ, ñîñòîÿùèé èç ýëåìåíòîâ îäèíàêîâîãî ðàçìåðà, êàæäûé èç êîòîðûõ ìîæåò ñîäåðæàòü ðàçëè÷íûå òèïû äàííûõ.
Îáúåäèíåíèÿ óñòàíàâëèâàþòñÿ òàêèì æå ñïîñîáîì, êàê è ñòðóêòóðû. Åñòü øàáëîí îáúåäèíåíèÿ è ïåðåìåííûå îáúåäèíåíèÿ. Îíè ìîãóò îïðåäåëÿòüñÿ îäíîâðåìåííî èëè, åñëè èñïîëüçóåòñÿ èìÿ îáúåäèíåíèÿ, ïîñëåäîâàòåëüíî çà äâà øàãà. Âîò ïðèìåð øàáëîíà ñ èìåíåì îáúåäèíåíèÿ:
Union holders {
Int digit;
Double bigf1;
Char letter; };
À âîò ïðèìåð îïðåäåëåíèÿ ïåðåìåííûõ îáúåäèíåíèÿ òèïà holdem:
Union holdem fit; /* ïåðåìåííàÿ îáúåäèíåíèÿ òèïà holdem */
Union holdem save[10]; /* ìàññèâ èç 10 ïåðåìåííûõ îáúåäèíåíèÿ */
Union holdem *pu; /* óêàçàòåëü íà ïåðåìåííóþ òèïà holdem */
Ïåðâîå îïèñàíèå ñîçäàñò îäíó ïåðåìåííóþ fit. Êîìïèëÿòîð âûäåëÿåò äîñòàòî÷íî ïàìÿòè äëÿ ðàçìåùåíèÿ ñàìîé áîëüøîé èç îïèñàííûõ ïåðåìåííûõ.  ýòîì ñëó÷àå íàèáîëüøåé èç âîçìîæíûõ ÿâëÿåòñÿ ïåðåìåííàÿ double, äëÿ êîòîðîé òðåáóåòñÿ â íàøåé ñèñòåìå 64 ðàçðÿäà èëè 8 áàéòîâ. Ìàññèâ save èìåë áû 10 ýëåìåíòîâ, êàæäûé ïî 8 áàéòîâ.
Âîò êàê èñïîëüçóåòñÿ îáúåäèíåíèå:
Fit.digit = 23; /* 23 çàïèñûâàåòñÿ â fit; èñïîëüçóåòñÿ 2 áàéòà */
Fit.double = 2.0; /* 23 ñòèðàåòñÿ, 2.0 çàïèñûâàåòñÿ; èñïîëüçóåòñÿ 8 áàéòîâ */
Fit.letter = 'h'; /* 2.0 ñòèðàåòñÿ, h çàïèñûâàåòñÿ; èñïîëüçóåòñÿ 1 áàéò */
Âû ïðèìåíÿåòå îïåðàöèþ ïîëó÷åíèÿ ýëåìåíòà, ÷òîáû ïîêàçàòü, êàêèå òèïû äàííûõ èñïîëüçóþòñÿ.  êàæäûé ìîìåíò âðåìåíè çàïîìèíàåòñÿ òîëüêî îäíî çíà÷åíèå; íåëüçÿ çàïèñàòü char è int îäíîâðåìåííî, äàæå åñëè äëÿ ýòîãî äîñòàòî÷íî ïàìÿòè.
Âû ñàìè äîëæíû ñëåäèòü çà òèïîì äàííûõ, çàïèñûâàåìûõ â äàííûé ìîìåíò â îáúåäèíåíèå; ïðèâåäåííàÿ íèæå ïîñëåäîâàòåëüíîñòü îïåðàòîðîâ ïîêàçûâàåò, ÷òî íåëüçÿ äåëàòü:
Fit.låttår = 'A';
Finum = 3.02*fit.double; /* ÎØÈÁÊÀ ÎØÈÁÊÀ ÎØÈÁÊÀ */
Îøèáêà çàêëþ÷àåòñÿ â òîì, ÷òî çàïèñàíî çíà÷åíèå òèïà char, a ñëåäóþùàÿ ñòðîêà ïðåäïîëàãàåò, ÷òî ñîäåðæèìîå fit èìååò òèï double.
Ìîæíî èñïîëüçîâàòü îïåðàöèþ - > ñ îáúåäèíåíèÿìè òàêèì æå îáðàçîì, êàê ýòî äåëàëîñü äëÿ ñòðóêòóð:
Pu = &fit;
Õ = ðu -> digit; /* òî æå, ÷òî è õ=fit.digit */
Ðàññìîòðèì òåïåðü åùå îäíî ñðåäñòâî ÿçûêà äëÿ ðàáîòû ñ äàííûìè.
Typedef - ÊÐÀÒÊÈÉ ÎÁÇÎÐ.
Ôóíêöèÿ typedef ïîçâîëÿåò íàì ñîçäàòü ñâîå ñîáñòâåííîå èìÿ òèïà. Ýòî íàïîìèíàåò äèðåêòèâó #define, íî ñî ñëåäóþùèìè òðåìÿ èçìåíåíèÿìè:
1.  îòëè÷èå îò #define ôóíêöèÿ typedef äàåò ñèìâîëè÷åñêèå èìåíà, íî îãðàíè÷èâàåòñÿ òîëüêî òèïàìè äàííûõ.
2. Ôóíêöèÿ typedef âûïîëíÿåòñÿ êîìïèëÿòîðîì, à íå ïðåïðîöåññîðîì.
3.  ñâîèõ ïðåäåëàõ ôóíêöèÿ typedef áîëåå ãèáêà, ÷åì #define.
Ïîñìîòðèì, êàê îíà ðàáîòàåò. Ïðåäïîëîæèì, âû õîòèòå èñïîëüçîâàòü òåðìèí real äëÿ ÷èñåë òèïà float. Òîãäà âû îïðåäåëÿåòå òåðìèí real, êàê åñëè áû îí áûë ïåðåìåííîé òèïà float, è ïåðåä åãî îïðåäåëåíèåì ñòàâèòå êëþ÷åâîå ñëîâî typedef:
Typedef float real;
Ñ ýòîãî ìîìåíòà âû ìîæåòå èñïîëüçîâàòü real äëÿ îïðåäåëåíèÿ ïåðåìåííûõ:
Real õ, ó[25], *ðr;
Îáëàñòü äåéñòâèÿ òàêîãî îïðåäåëåíèÿ çàâèñèò îò ðàñïîëîæåíèÿ îïåðàòîðà typedef. Åñëè îïðåäåëåíèå íàõîäèòñÿ âíóòðè ôóíêöèè, òî îáëàñòü äåéñòâèÿ ëîêàëüíà è îãðàíè÷åíà ýòîé ôóíêöèåé. Åñëè îïðåäåëåíèå ðàñïîëîæåíî âíå ôóíêöèè, òî îáëàñòü äåéñòâèÿ ãëîáàëüíà.
×àñòî â ýòèõ îïðåäåëåíèÿõ èñïîëüçóþòñÿ ïðîïèñíûå áóêâû, ÷òîáû íàïîìíèòü ïîëüçîâàòåëþ, ÷òî èìÿ òèïà ÿâëÿåòñÿ íà ñàìîì äåëå ñèìâîëè÷åñêîé àááðåâèàòóðîé:
Typedef float REAL;
 ïîñëåäíåì ïðèìåðå ìîæíî áûëî áû ïðèìåíèòü äèðåêòèâó #define. À çäåñü ýòî äåëàòü íåëüçÿ:
Typedef char *STRING;
Áåç êëþ÷åâîãî ñëîâà typedef îïåðàòîð îïðåäåëÿë áû STRING êàê óêàçàòåëü íà òèï char. Ñ êëþ÷åâûì ñëîâîì îïåðàòîð äåëàåò STRING èäåíòèôèêàòîðîì óêàçàòåëåé íà òèï char. Òàê,
STRING name, sign;
Îçíà÷àåò.
Char *name, *sign;
Ìû ìîæåì èñïîëüçîâàòü typedef è äëÿ ñòðóêòóð. Âîò ïðèìåð:
Typedef struct COMPLEX {
Float real;
Float imag; };
Êðîìå òîãî, ìîæíî èñïîëüçîâàòü òèï COMPLEX äëÿ ïðåäñòàâëåíèÿ êîìïëåêñíûõ ÷èñåë.
Îäíà èç ïðè÷èí èñïîëüçîâàíèÿ typedef çàêëþ÷àåòñÿ â ñîçäàíèè óäîáíûõ, ðàñïîçíàâàåìûõ èìåí äëÿ ÷àñòî âñòðå÷àþùèõñÿ òèïîâ. Íàïðèìåð, ìíîãèå ïîëüçîâàòåëè ïðåäïî÷èòàþò ïðèìåíÿòü STRING èëè åãî ýêâèâàëåíò, êàê ýòî ìû äåëàëè âûøå. Âòîðàÿ ïðè÷èíà: èìåíà typedef ÷àñòî èñïîëüçóþòñÿ äëÿ ñëîæíûõ òèïîâ. Íàïðèìåð, îïèñàíèå.
Typedef char *FRPTC ( ) [5];
Ïðèâîäèò ê òîìó, ÷òî FRPTC îáúÿâëÿåò òèï, ÿâëÿþùèéñÿ ôóíêöèåé, êîòîðàÿ âîçâðàùàåò óêàçàòåëü íà ïÿòèýëåìåíòíûé ìàññèâ òèïà char. (Ñì. "Ïðè÷óäëèâûå îïèñàíèÿ".).
Òðåòüÿ ïðè÷èíà èñïîëüçîâàíèÿ typedef çàêëþ÷àåòñÿ â òîì, ÷òîáû ñäåëàòü ïðîãðàììû áîëåå ìîáèëüíûìè. Ïðåäïîëîæèì, íàïðèìåð, ÷òî âàøåé ïðîãðàììå íóæíî èñïîëüçîâàòü 16-ðàçðÿäíûå ÷èñëà.  íåêîòîðûõ ñèñòåìàõ ýòî áûë áû òèï short, â äðóãèõ æå îí ìîæåò áûòü òèïîì int. Åñëè âû èñïîëüçîâàëè â âàøèõ îïèñàíèÿõ short èëè int, òî äîëæíû èçìåíèòü âñå îïèñàíèÿ, êîãäà ïåðåéäåòå îò îäíîé ñèñòåìû ê äðóãîé. Âìåñòî ýòîãî ñäåëàéòå ñëåäóþùåå,  ôàéëå äèðåêòèâû #include åñòü òàêîå îïðåäåëåíèå:
Typedef short TWOBYTE;
Èñïîëüçóéòå TWOBYTE â âàøèõ ïðîãðàììàõ äëÿ ïåðåìåííûõ òèïà short, êîòîðûå äîëæíû áûòü 16-ðàçðÿäíûìè. Òîãäà åñëè âû ïåðåìåøàåòå ïðîãðàììó òóäà, ãäå íåîáõîäèìî èñïîëüçîâàòü òèï int, òî ñëåäóåò òîëüêî èçìåíèòü îäíî îïðåäåëåíèå â âàøåì ôàéëå äèðåêòèâû #include:
Typedef int TWOBYTE;
Ýòî ïðèìåð òîãî, ÷òî äåëàåò ÿçûê Ñè ñòîëü ìîáèëüíûì. Ïðè èñïîëüçîâàíèè tóðådåf ñëåäóåò èìåòü â âèäó, ÷òî îí íå ñîçäàñò íîâûõ òèïîâ, îí òîëüêî ñîçäàåò óäîáíûå ìåòêè.
ÏÐÈ×ÓÄËÈÂÛÅ ÎÏÈÑÀÍÈß.
ßçûê Ñè ïîçâîëÿåò âàì ñîçäàâàòü ñëîæíûå ôîðìû äàííûõ. Îáû÷íî ìû ïðèäåðæèâàåìñÿ áîëåå ïðîñòûõ ôîðì, íî ñ÷èòàåì ñïîèì äîëãîì óêàçàòü íè ïîòåíöèàëüíûå âîçìîæíîñòè ÿçûêà. Ïðè ñîçäàíèè îïèñàíèÿ ìû èñïîëüçóåì èìÿ (èëè "èäåíòèôèêàòîð"), êîòîðîå ìîæíî èçìåíÿòü ïðè ïîìîùè ìîäèôèêàòîðà:
| Ìîäèôèêàòîð | çíà÷åíèå |
|---|---|
| * | óêàçàòåëü |
| ( ) | ôóíêöèÿ |
| [ ] | ìàññèâ |
ßçûê Ñè ïîçâîëÿåò èñïîëüçîâàòü îäíîâðåìåííî áîëåå îäíîãî ìîäèôèêàòîðà, ÷òî äàñò âîçìîæíîñòü ñîçäàâàòü ìíîæåñòâî òèïîâ:
Int board[8] [8]; /* ìàññèâ ìàññèâîâ òèïà int */
Int **ptr; /* óêàçàòåëü íà óêàçàòåëü íà òèï int */
Int *risks[10]; /* 10-ýëåìåíòíûé ìàññèâ óêàçàòåëåé íà òèï int */
Int (*wisks) [10]; /* óêàçàòåëü íà 10-ýëåìñíòíûé ìàññèâ òèïà int */
Int *oof[3] [4]: /* 3-ýëåìåíòíûè ìàññèâ óêàçàòåëåé íà 4-ýëåìåíòíûé.
ìàññèâ òèïà int */
Int (*uuf) [3][4]; /* óêàçàòåëü íà ìàññèâ 3õ4 òèïà int */
Äëÿ ðàñïóòûâàíèÿ ýòèõ îïèñàíèé íóæíî ïîíÿòü, â êàêîì ïîðÿäêå ñëåäóåò ïðèìåíÿòü ìîäèôèêàòîðû. Òðè ïðàâèëà ïîìîãóò âàì ñïðàâèòüñÿ ñ ýòèì.
1. ×åì áëèæå êîäèôèêàòîð ñòîèò ê èäåíòèôèêàòîðó, òåì âûøå åãî ïðèîðèòåò.
2. Ìîäèôèêàòèðû [ ] è ( ) èìåþò ïðèîðèòåò âûøå, ÷åì *.
3. Êðóãëûå ñêîáêè èñïîëüçóþòñÿ äëÿ îáúåäèíåíèÿ ÷àñòåé âûðàæåíèÿ, èìåþùèõ ñàìûé âûñîêèé ïðèîðèòåò.
Äàâàéòå ïðèìåíèì ýòè ïðàâèëà ê îïèñàíèþ int *oof[3] [4];
* è [3] ïðèìûêàþò ê oof è èìåþò áîëåå âûñîêèé ïðèîðèòåò, ÷åì [4] (ïðàâèëî 1). [3] èìååò ïðèîðèòåò áîëåå âûñîêèé, ÷åì * (ïðàâèëî 2). Ñëåäîâàòåëüíî, oof ÿâëÿåòñÿ 3-ýëåìåíòíûì ìàññèâîì (ïåðïûé ÌÎÄÈÔÈÊÀÒÎÐ) óêàçàòåëåé (âòîðîé ìîäèôèêàòîð) íà 4-ýëåìåíòíûé ìàññèâ (òðåòèé ìîäèôèêàòîð) òèïà int (îïèñàíèå òèïà).
 îïèñàíèè.
Int (*uuf)[3][4];
Ñêîáêè ãîâîðÿò, ÷òî ìîäèôèêàòîð * äîëæåí èìåòü ïåðâûé ïðèîðèòåò, à ýòî äåëàåò uuf óêàçàòåëåì, êàê ïîêàçàíî â ïðåäûäóùåì îïèñàíèè. Ýòè ïðàâèëà ñîçäàþò òàêæå ñëåäóþùèå òèïû:
Char *fump( ); /* ôóíêöèÿ, âîçâðàùàþùàÿ óêàçàòåëü íà òèï char */
Char (*frump) ( ); /* óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ òèï char */
Char *flump ( ) [3] /* ôóíêöèÿ, âîçâðàùàþùàÿ óêàçàòåëü íà 3-ýëåìåíòíûé.
ìàññèâ òèïà char */
Char *flimp[3] ( ) /* 3-ýëåìåíòíûé ìàññèâ óêàçàòåëåé íà ôóíêöèþ, êîòîðàÿ.
âîçâðàùàåò òèï char */
Åñëè âû ïðèìåíèòå ñòðóêòóðû ê ýòèì ïðèìåðàì, òî óâèäèòå, ÷òî âîçìîæíîñòè äëÿ îïèñàíèé äåéñòâèòåëüíî ðàñòóò ïðè÷óäëèâî. À ïðèìåíåíèÿ ... òàê è áûòü, ÌÛ îñòàâèì èõ äëÿ áîëåå îïûòíûõ ïðîãðàììèñòîâ.
ßçûê Ñè ñî ñòðóêòóðàìè, îáúåäèíåíèÿìè è typedef äàåò íàì ñðåäñòâà äëÿ ýôôåêòèâíîé è ìîáèëüíîé îáðàáîòêè äàííûõ.
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ
×òî òàêîå ñòðóêòóðíûé øàáëîí, è êàê åãî îïðåäåëÿòü.
×òî òàêîå èìÿ ñòðóêòóðû è êàê îíî èñïîëüçóåòñÿ.
Êàê îïðåäåëèòü ñòðóêòóðíóþ ïåðåìåííóþ: struct car honda;
Êàê îáðàòèòüñÿ ê ýëåìåíòó ñòðóêòóðû: honda.mpg.
Êàê îáðàòèòüñÿ ê óêàçàòåëþ íà ñòðóêòóðó: struct car *ptcar;
Êàê îáðàòèòüñÿ ê ýëåìåíòó ïðè ïîìîùè óêàçàòåëÿ: ptcar->mpg.
Êàê ïåðåäàòü â ôóíêöèþ ýëåìåíò ñòðóêòóðû: eval(honda.mpg).
Êàê ñîîáùèòü ôóíêöèè î ñòðóêòóðå: rate(&honda).
Êàê ñîçäàòü âëîæåííóþ ñòðóêòóðó.
Êàê îáðàòèòüñÿ ê ýëåìåíòó âëîæåííîé ñòðóêòóðû: honda.civic.cost.
Êàê ñîçäàâàòü è èñïîëüçîâàòü ìàññèâû ñòðóêòóð: struct car gm[5];
Êàê ñîçäàòü îáúåäèíåíèå: ïîäîáíî ñòðóêòóðå.
Êàê èñïîëüçîâàòü typedef: typedef struct car CRATE;
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. ×òî íåïðàâèëüíî â ýòîì øàáëîíå?
Structure {char itible;
Int num [20];
Char *togs;
};
2. Âîò ôðàãìåíò ïðîãðàììû; ÷òî îíà íàïå÷àòàåò?
Struct house {
float sqft;
int rooms;
int stories;
char *address; };
Main ( ) {
Static struct house fruzt = { 1560.0, 6, 1, " 22 Spiffo Road";
Struct house *sign;
Sign = &fruzt;
Printf(" %d %d\n" , fruzt.rooms, sign-> stories);
Printf(" %s\n", frurt.address);
Prinlf(" %c %c \n" sign- >address[3], fruzt.address[4]);
}
3. Ïðèäóìàéòå ñòðóêòóðíûé øàáëîí, êîòîðûé áóäåò ñîäåðæàòü íàçâàíèå ìåñÿöà, òðåõáóêâåííóþ àááðåâèàòóðó ìåñÿöà, êîëè÷åñòâî äíåé â ìåñÿöå è íîìåð ìåñÿöà.
4. Îïðåäåëèòå ìàññèâ, ñîñòîÿùèé èç äâåíàäöàòè ñòðóêòóð òîãî æå òèïà, ÷òî è â âîïðîñå 3, è èíèöèàëèçèðóéòå åãî äëÿ íå âèñîêîñíîãî ãîäà.
5. Íàïèøèòå ôóíêöèþ, êîòîðàÿ ïîëó÷àåò íîìåð ìåñÿöà, à âîçâðàùàåò îáùåå ÷èñëî äíåé ãîäà âïëîòü äî ýòîãî ìåñÿöà. Ñ÷èòàéòå, ÷òî ñòðóêòóðíûé øàáëîí è ìàññèâ èç âîïðîñîâ 3 è 4 îïèñàíû êàê âíåøíèå.
6. Âçÿâ çà îñíîâó íèæåñëåäóþùóþ ôóíêöèþ typedet, îïèøèòå 10-ýëåìåíòíûé ìàññèâ óêàçàííîé ñòðóêòóðû. Çàòåì, èñïîëüçóÿ ïðèñâàèâàíèå îòäåëüíîãî ýëåìåíòà ïîïûòàéòåñü îïèñàòü òðåòüèì ýëåìåíòîì ìàññèâà ëèíçó Ðåìàðêàòàðà ñ ôîêóñíûì ðàññòîÿíèåì 500 ìì è àïåðòóðîé f / 2.0.
Typedef struct { /* îïèñàòåëü ëèíçû */
Float foclen; /* ôîêóñíîå ðàññòîÿíèå, ìì */
Float fstop; /* àïåðòóðà */
Char *brand; /* ôèðìåííàÿ ìàðêà */ } LENS;
Îòâåòû:
1. Äîëæíî áûòü êëþ÷åâîå ñëîâî struct, à íå structure. Øàáëîí òðåáóåò ëèáî èìåíè ñòðóêòóðû ïåðåä îòêðûâàþùåé ñêîáêîé èëè èìåíè ïåðåìåííîé ïîñëå çàêðûâàþùåé ñêîáêè. Êðîìå òîãî, òî÷êà ñ çàïÿòîé äîëæíà ñòîÿòü ïîñëå *togs è â êîíöå øàáëîíà.
2.
6 1.
22 Spiffo Road S p.
Ýëåìåíò fruzt.address ÿâëÿåòñÿ ñèìâîëüíîé ñòðîêîé, à fruzt.address[4] ÿâëÿåòñÿ ïÿòûì ýëåìåíòîì ýòîãî ìàññèâà.
3.
Struct month {
Char name[10]; /* èëè char *name; */
Char abbrev[4]; /* èëè char *abbrev; */
Int days;
Int monumb; };
4.
Struct month months [12] = {
{" ßíâàðü" , " ßíâ" , 31, 1} , {" Ôåâðàëü" , " Ôåâ" , 28, 2} ,
È ò. ë. {"Äåêàáðü", "Äåê" , 31, 12}.
5.
Days(monlh);
Inl month;
{
Int index, tolal;
If(month < 1 || month > 12).
Return (-1); /* ïðèçíàê îøèáêè */
Else.
For(index = 0, total = 0; index < month; index++).
Total + = months [index].days;
Return (total);}.
Çàìåòèì, ÷òî index ñîäåðæèò íîìåð ìåñÿöà, óìåíüøåííûé íà åäèíèöó, òàê êàê ìàññèâû íà÷èíàþòñÿ ñ èíäåêñà 0; ñëåäîâàòåëüíî, ìû èñïîëüçóåì âûðàæåíèå index < month âìåñòî index <= month.
6.
ËÈÍÇÀ tubby [10];
Tubby [2].foclen = 300.0;
Tubby [2].fstop = 2.0;
Tubby [2].brand = "Ðñìàðêàòàð";
ÓÏÐÀÆÍÅÍÈß.
1. Ïåðåäåëàéòå âîïðîñ 5, èñïîëüçóÿ â êà÷åñòâå àðãóìåíòà íàïèñàííîå áóêâàìè íàçâàíèå ìåñÿöà âìåñòî íîìåðà ìåñÿöà. [Íå çàáûâàéòå î ôóíêöèè strcmp( ).]
2. Íàïèøèòå ïðîãðàììó, êîòîðàÿ çàïðàøèâàåò ó ïîëüçîâàòåëÿ äåíü, ìåñÿö è ãîä. Ìåñÿö ìîæåò îáîçíà÷àòüñÿ íîìåðîì, íàçâàíèåì ìåñÿöà èëè åãî àááðåâèàòóðîé. Ïîñëå ðàáîòû ïðîãðàììà âûäàåò îáùåå êîëè÷åñòâî äíåé â ãîäó âïëîòü äî äàííîãî äíÿ.
3. Ïåðåäåëàéòå íàøó ïðîãðàììó èíâåíòàðèçàöèè êíèã òàêèì îáðàçîì, ÷òîáû îíà ïå÷àòàëà èíôîðìàöèþ î êíèãàõ, óïîðÿäî÷åííóþ â àëôàâèòíîì ïîðÿäêå ïî íàçâàíèÿì êíèã, è çàòåì ïå÷àòàëà îáùóþ ñòîèìîñòü êíèã.
15. Áèáëèîòåêà ÿçûêà Ñè è ôàéëû ââîäà-âûâîäà.
ÁÈÁËÈÎÒÅÊÀ ßÇÛÊÀ ÑÈ.
ÔÀÉËÛ Â ßÇÛÊÅ ÑÈ.
ÔÓÍÊÖÈÈ ÐÀÁÎÒÛ Ñ ÔÀÉËÎÌ.
ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈß ÄËß ÏÐÎÂÅÐÊÈ ÑÈÌÂÎËÎÂ.
ÔÓÍÊÖÈÈ ÐÀÑÏÐÅÄÅËÅÍÈß ÏÀÌßÒÈ.
Âñÿêèé ðàç, êîãäà íàì íóæíî èñïîëüçîâàòü òàêèå ôóíêöèè, êàê printf( ), getchar( ) è strlen( ), ìû îáðàùàåìñÿ â áèáëèîòåêó ÿçûêà Ñè. Îíà ñîäåðæèò ìíîæåñòâî ôóíêöèé è ìàêðîîïðåäåëåíèé. Áèáëèîòåêè ìåíÿþòñÿ îò ñèñòåìû ê ñèñòåìå, íî åñòü ÿäðî ôóíêöèé (íàçûâàåìîå ñòàíäàðòíîé áèáëèîòåêîé), êîòîðîå èñïîëüçóåòñÿ ÷àùå âñåãî.  ýòîé ãëàâå ìû ðàññìîòðèì ïÿòíàäöàòü íàèáîëåå îáùèõ èç ýòèõ ôóíêöèé, óäåëÿÿ áîëüøå âíèìàíèÿ ôóíêöèÿì ââîäà-âûâîäà è èñïîëüçîâàíèþ ôàéëîâ.
Îäíàêî ñíà÷àëà äàâàéòå ïîãîâîðèì î òîì, êàê ïîëüçîâàòüñÿ áèáëèîòåêîé.
ÄÎÑÒÓÏ Â ÁÈÁËÈÎÒÅÊÓ ßÇÛÊÀ ÑÈ.
Ïîëó÷åíèå äîñòóïà ê áèáëèîòåêå çàâèñèò îò ñèñòåìû, ïîýòîìó âàì íóæíî ïîñìîòðåòü â ñâîåé ñèñòåìå, êàê ïðèìåíÿòü íàèáîëåå ðàñïðîñòðàíåííûå îïåðàòîðû. Âî-ïåðâûõ, åñòü íåñêîëüêî ðàçëè÷íûõ ìåñò ðàñïîëîæåíèÿ áèáëèîòå÷íûõ ôóíêöèé. Íàïðèìåð, getchar( ) îáû÷íî çàäàþò êàê ìàêðîîïðåäåëåíèå â ôàéëå stdio.h, â òî âðåìÿ êàê strlen( ) îáû÷íî õðàíèòñÿ â áèáëèîòå÷íîì ôàéëå. Âî-âòîðûõ, ðàçëè÷íûå ñèñòåìû èìåþò ðàçíûå ñïîñîáû äîñòóïà ê ýòèì ôóíêöèÿì. Âîò òðè èç íèõ.
Àâòîìàòè÷åñêèé äîñòóï
Âî ìíîãèõ áîëüøèõ ñèñòåìàõ UNIX âû òîëüêî êîìïèëèðóåòå ïðîãðàììû, à äîñòóï ê áîëåå îáùèì áèáëèîòå÷íûì ôóíêöèÿì âûïîëíÿåòñÿ àâòîìàòè÷åñêè.
Âêëþ÷åíèå ôàéëà.
Åñëè ôóíêöèÿ çàäàíà êàê ìàêðîîïðåäåëåíèå, òî ìîæíî äèðåêòèâîé #include âêëþ÷èòü ôàéë, ñîäåðæàùèé åå îïðåäåëåíèå. ×àñòî ïîäîáíûå ôóíêöèè ìîãóò áûòü ñîáðàíû â ñîîòâåòñòâóþùèì îáðàçîì íàçâàííûé çàãîëîâî÷íûé ôàéë. Íàïðèìåð, íåêîòîðûå ñèñòåìû èìåþò ôàéë ctype.h, ñîäåðæàùèé ìàêðîîïðåäåëåíèÿ, çàäàþùèå òèï ñèìâîëà: ïðîïèñíàÿ áóêâà, öèôðà è ò. ä.
Âêëþ÷åíèå áèáëèîòåêè.
Íà íåêîòîðîì ýòàïå êîìïèëÿöèè èëè çàãðóçêè ïðîãðàììû âû ìîæåòå âûáðàòü áèáëèîòåêó.  íàøåé ñèñòåìå, íàïðèìåð, åñòü ôàéë lc.lib, ñîäåðæàùèé ñêîìïèëèðîâàííóþ âåðñèþ áèáëèîòå÷íûõ ôóíêöèé, è ìû ïðåäëàãàåì ðåäàêòîðó ñâÿçåé IBM PC èñïîëüçîâàòü ýòó áèáëèîòåêó. Äàæå ñèñòåìà, êîòîðàÿ àâòîìàòè÷åñêè êîíòðîëèðóåò ñâîþ ñòàíäàðòíóþ áèáëèîòåêó, ìîæåò èìåòü äðóãèå áèáëèîòåêè ðåäêî ïðèìåíÿåìûõ ôóíêöèé, è ýòè áèáëèîòåêè ñëåäóåò çàïðàøèâàòü ÿâíî, óêàçûâàÿ ñîîòâåòñòâóþùèé ïðèçíàê âî âðåìÿ êîìïèëÿöèè.
Î÷åâèäíî, ìû íå ñìîæåì ðàññìîòðåòü âñå îñîáåííîñòè âñåõ ñèñòåì, íî ýòè òðè ïðèìåðà äîëæíû ïîêàçàòü, ÷òî âàñ îæèäàåò. Òåïåðü äàâàéòå ðàññìîòðèì íåêîòîðûå ôóíêöèè.
ÁÈÁËÈÎÒÅ×ÍÛÅ ÔÓÍÊÖÈÈ, ÊÎÒÎÐÛÅ ÌÛ ÈÑÏÎËÜÇÎÂÀËÈ.
Ïîêà ìû õîòèì òîëüêî ïåðå÷èñëèòü ýòè ôóíêöèè, ÷òîáû íàïîìíèòü î íèõ.
Ñíà÷àëà ïðèâåäåì ôóíêöèè ââîäà-âûâîäà:
Getchar( ) /* ïîëó÷åíèå ñèìâîëà */
Putchar( ) /* ïå÷àòü ñèìâîëà */
Gefs( ) /* ïîëó÷åíèå ñòðîêè */
Puts( ) /* ïå÷àòü ñòðîêè */
Scanf( ) /* ïîëó÷åíèå ôîðìàòèðîâàííîãî ââîäà */
Printf( ) /* ïå÷àòü ôîðìàòèðîâàííîãî âûâîäà */
Çàòåì ïðèâåäåì ôóíêöèè, ðàáîòàþùèå ñî ñòðîêàìè:
Strlen( ) /* íàõîæäåíèå äëèíû ñòðîêè */
Strcmp( ) /* ñðàâíåíèå äâóõ ñòðîê */
Strcpy( ) /* êîïèðîâàíèå ñòðîêè */
Strcat( ) /* îáúåäèíåíèå äâóõ ñòðîê */
Ê ýòîìó ñïèñêó ìû äîáàâèì ôóíêöèè îòêðûòèÿ è çàêðûòèÿ ôàéëîâ, ñâÿçè ñ ôàéëàìè, ïðîâåðêè è ïðåîáðàçîâàíèÿ ñèìâîëîâ, ïðåîáðàçîâàíèÿ ñòðîê, ôóíêöèþ âûõîäà è ôóíêöèè ðàñïðåäåëåíèÿ ïàìÿòè.
Äàâàéòå ñíà÷àëà îáðàòèìñÿ ê ïðîáëåìå ñâÿçè ìåæäó ôàéëîì è ïðîãðàììîé.
ÑÂßÇÜ Ñ ÔÀÉËÀÌÈ.
×àñòî íàì áûâàåò íóæíà ïðîãðàììà ïîëó÷åíèÿ èíôîðìàöèè îò ôàéëà èëè ðàçìåùåíèÿ ðåçóëüòàòîâ â ôàéëå. Îäèí ñïîñîá îðãàíèçàöèè ñâÿçè ïðîãðàììû ñ ôàéëîì çàêëþ÷àåòñÿ â èñïîëüçîâàíèè îïåðàöèé ïåðåêëþ÷åíèÿ < è >. Ýòîò ìåòîä ïðîñò, íî îãðàíè÷åí. Íàïðèìåð, ïðåäïîëîæèì, âû õîòèòå íàïèñàòü äèàëîãîâóþ ïðîãðàììó, êîòîðàÿ ñïðàøèâàåò ó âàñ íàçâàíèÿ êíèã (çâó÷èò ôàìèëüÿðíî?), è âû íàìåðåíû ñîõðàíèòü âåñü ñïèñîê â ôàéëå. Åñëè âû èñïîëüçóåòå ïåðåêëþ÷åíèå êàê, íàïðèìåð, â.
Books > bklist.
Òî âàøè äèàëîãîâûå ïðèãëàøåíèÿ òàêæå áóäóò ïåðåêëþ÷åíû íà bklist. È òîãäà íå òîëüêî íåæåëàòåëüíàÿ ÷åïóõà çàïèøåòñÿ â bklist, íî è ïîëüçîâàòåëü áóäåò èçáàâëåí îò âîïðîñîâ, íà êîòîðûå îí, êàê ïðåäïîëàãàëîñü, äîëæåí îòâå÷àòü.
Ê ñ÷àñòüþ, ÿçûê Ñè ïðåäîñòàâëÿåò è áîëåå ìîùíûå ìåòîäû ñâÿçè ñ ôàéëàìè. Îäèí ïîäõîä çàêëþ÷àåòñÿ â èñïîëüçîâàíèè ôóíêöèè fopen( ), êîòîðàÿ îòêðûâàåò ôàéë, çàòåì ïðèìåíÿþòñÿ ñïåöèàëüíûå ôóíêöèè ââîäà-âûâîäà äëÿ ÷òåíèÿ ôàéëà èëè çàïèñè â ýòîò ôàéë è äàëåå èñïîëüçóåòñÿ ôóíêöèÿ fclose( ) äëÿ çàêðûòèÿ ôàéëà. Îäíàêî ïðåæäå ÷åì èññëåäîâàòü ýòè ôóíêöèè, íàì íóæíî õîòÿ áû êðàòêî ïîçíàêîìèòüñÿ ñ ñóùíîñòüþ ôàéëà.
×ÒÎ ÒÀÊÎÅ ÔÀÉË?
Äëÿ íàñ ôàéë ÿâëÿåòñÿ ÷àñòüþ ïàìÿòè, îáû÷íî íà äèñêå, ñî ñâîèì èìåíåì. Ìû ñ÷èòàåì, íàïðèìåð, stdio.h èìåíåì ôàéëà, ñîäåðæàùåãî íåêîòîðóþ ïîëåçíóþ èíôîðìàöèþ. Äëÿ îïåðàöèîííîé ñèñòåìû ôàéë áîëåå ñëîæåí, íî ýòî ñèñòåìíûå ïðîáëåìû, à íå íàøè. Îäíàêî ìû äîëæíû çíàòü, ÷òî îçíà÷àåò ôàéë äëÿ ïðîãðàììû íà ÿçûêå Ñè.  ïðåäëàãàåìûõ äëÿ îáñóæäåíèÿ ôóíêöèÿõ, ðàáîòàþùèõ ñ ôàéëàìè, ÿçûê Ñè "ðàññìàòðèâàåò" ôàéë êàê ñòðóêòóðó. Äåéñòâèòåëüíî, ôàéë stdio.h ñîäåðæèò îïðåäåëåíèå ñòðóêòóðû ôàéëà. Âîò òèïè÷íûé ïðèìåð, âçÿòûé èç IBM-âåðñèè êîìïèëÿòîðà Lattice Ñ:
Struct _ iobuf.
{
Char *_ptr; /* òåêóùèé óêàçàòåëü áóôåðà */
Int_cnt; /* òåêóùèé ñ÷åò÷èê áàéòîâ */
Char*_base; /* áàçîâûé àäðåñ áóôåðà ââîäà-âûâîäà*/
Char_flag; /* óïðàâëÿþùèé ïðèçíàê */
Char _ file; /* íîìåð ôàéëà */
};
#define FILE struct_iobuf /* êðàòêàÿ çàïèñü */
Çäåñü ìû íå ñîáèðàåìñÿ ðàçáèðàòüñÿ äåòàëüíî â ýòîì îïðåäåëåíèè. Ãëàâíîå ñîñòîèò â òîì, ÷òî ôàéë ÿâëÿåòñÿ ñòðóêòóðîé, è ÷òî êðàòêîå íàèìåíîâàíèå øàáëîíà ôàéëà - FILE. (Ìíîãèå ñèñòåìû èñïîëüçóþò äèðåêòèâó typedef äëÿ óñòàíîâëåíèÿ ýòîãî ñîîòâåòñòâèÿ.) Òàêèì îáðàçîì, ïðîãðàììà, èìåþùàÿ äåëî ñ ôàéëàìè, áóäåò èñïîëüçîâàòü òèï ñòðóêòóðû FILE, ÷òîáû äåëàòü òàê.
Èìåÿ ýòî â âèäó, ìû ñìîæåì ëó÷øå ïîíÿòü îïåðàöèè íàä ôàéëàìè.
ÏÐÎÑÒÛÅ ÏÐÎÃÐÀÌÌÛ ×ÒÅÍÈß ÔÀÉËÀ: fopen( ), fclose( ), getc( ) è putc( ).
×òîáû ïîêàçàòü ýëåìåíòàðíûå ïðèìåðû èñïîëüçîâàíèÿ ôàéëîâ, ìû ñîñòàâèëè íåáîëüøóþ ïðîãðàììó, êîòîðàÿ ÷èòàåò ñîäåðæèìîå ôàéëà, íàçâàííîãî test, è âûâîäèò åãî íà ýêðàí. Âû íàéäåòå íàøè ïîÿñíåíèÿ ñðàçó ïîñëå ïðîãðàììû.
/* ðàññêàæèòå, ÷òî íàõîäèòñÿ â ôàéëå "test" */
#include <stdio.h>
Main( ).
{
FILE *in; /* îïèñûâàþ óêàçàòåëü íà ôàéë */
Int ch;
If((in = fopen("test", "r"))!=NULL).
/* îòêðûâàþ test äëÿ ÷òåíèÿ, ïðîâåðÿÿ ñóùåñòâóåò ëè îí */
/* óêàçàòåëü FILE ññûëàåòñÿ òåïåðü íà test */
{
While((ch = getc(in) != EOF) /* ïîëó÷àþ ñèìâîë èç in */
putc(ch, stdout); /* ïîñûëàþ íà ñòàíäàðòíûé âûâîä */
Fclose(in); /* çàêðûâàþ ôàéë */ }.
Else.
printf("ÿ íå ñìîãëà îòêðûòü ôàéë \" test\" .\n");
}
Ñëåäóåò îáúÿñíèòü òðè îñíîâíûõ ìîìåíòà: ðàáîòó fopen( ), ðàáîòó fclose( ) è èñïîëüçîâàíèå ôóíêöèé ââîäà-âûâîäà ôàéëà. Çàéìåìñÿ èìè.
Îòêðûòèå ôàéëà: fopen( ).
Ôóíêöèåé fopen( ) óïðàâëÿþò òðè îñíîâíûõ ïàðàìåòðà. Ïåðâûé - èìÿ ôàéëà, êîòîðûé ñëåäóåò îòêðûòü. Îí ÿâëÿåòñÿ è ïåðâûì àðãóìåíòîì fopen( ); â íàøåì ñëó÷àå ýòî "test" .
Âòîðîé ïàðàìåòð [è âòîðîé àðãóìåíò fopen( )] îïèñûâàåò, êàê äîëæåí èñïîëüçîâàòüñÿ ôàéë. Âîò òðè îñíîâíûõ ïðèìåíåíèÿ ôàéëà:
| "r": | ôàéë íóæíî ñ÷èòàòü |
| "w": | ôàéë íóæíî çàïèñàòü |
| "à": | ôàéë íóæíî äîïîëíèòü |
Íåêîòîðûå ñèñòåìû ïðåäîñòàâëÿþò åùå äîïîëíèòåëüíûå âîçìîæíîñòè, íî ìû áóäåì ïðèäåðæèâàòüñÿ ýòèõ. Çàìåòèì, ÷òî èñïîëüçóåìûå íàìè êîäû ÿâëÿþòñÿ ñòðîêàìè, à íå ñèìâîëüíûìè êîíñòàíòàìè; ñëåäîâàòåëüíî, îíè çàêëþ÷àþòñÿ â äâîéíûå êàâû÷êè. Ïðè ïðèìåíåíèè "r" îòêðûâàåòñÿ ñóùåñòâóþùèé ôàéë. Ïðè äâóõ äðóãèõ ïðèìåíåíèÿõ òîæå áóäåò îòêðûâàòüñÿ ñóùåñòâóþùèé ôàéë, íî åñëè òàêîãî ôàéëà íåò, îí áóäåò ñîçäàí.
Âíèìàíèå: Åñëè âû èñïîëüçóåòå "w" äëÿ ñóùåñòâóþùåãî ôàéëà, òî ñòàðàÿ âåðñèÿ åãî ñòèðàåòñÿ, è âàøà ïðîãðàììà íà÷èíàåò íà "÷èñòîì ìåñòå".
Òðåòèé ïàðàìåòð ÿâëÿåòñÿ óêàçàòåëåì íà ôàéë; ýòî çíà÷åíèå âîçâðàùàåòñÿ ôóíêöèåé:
FILE *in;
In = fopen("test", "r");
Òåïåðü in ÿâëÿåòñÿ óêàçàòåëåì íà ôàéë "test". Ñ ýòîãî ìîìåíòà ïðîãðàììà ññûëàåòñÿ íà ôàéë ïðè ïîìîùè óêàçàòåëÿ in, à íå ïî èìåíè test.
Åñëè âû î÷åíü ñîîáðàçèòåëüíû, òî òåïåðü ìîæåòå çàäàòü òàêîé âîïðîñ: "Åñëè fopen( ) âîçâðàùàåò óêàçàòåëü íà 'FILE' â êà÷åñòâå àðãóìåíòà, òî ïî÷åìó ìû íå äîëæíû îáúÿâèòü fopen( ) êàê ôóíêöèþ óêàçàòåëÿ íà 'FILE' ?" Õîðîøèé âîïðîñ. Îòâåò çàêëþ÷àåòñÿ â òîì, ÷òî ýòî îïèñàíèå ñäåëàë äëÿ íàñ ôàéë stdio.h, êîòîðûé ñîäåðæèò ñòðîêó.
FILE *topen( );
Åñòü åùå îäèí âàæíûé ìîìåíò îòíîñèòåëüíî ôóíêöèè fopen(), êîòîðóþ ìû èñïîëüçîâàëè. Åñëè fopen() íå ñïîñîáíà îòêðûòü òðåáóåìûé ôàéë, îíà âîçâðàùàåò çíà÷åíèå 'NULL' (îïðåäåëåííîå â stdio.h êàê 0). Ïî÷åìó îíà íå ñìîãëà îòêðûòü ôàéë? Âû ìîæåòå ïîïðîñèòü åå ñ÷èòàòü ôàéë, êîòîðûé íå ñóùåñòâóåò. Âîò ïî÷åìó ìû èìååì â ïðîãðàììå ñòðîêó.
If((in=fopen("test", "r"))!= NULL).
Çàïîëíåíèå äèñêà, èñïîëüçîâàíèå çàïðåùåííîãî èìåíè èëè íåêîòîðûå äðóãèå ïðè÷èíû ìîãóò ïðåïÿòñòâîâàòü îòêðûòèþ ôàéëà. Ïîýòîìó ïîáåñïîêîéòåñü, ÷òîáû èõ íå áûëî - ìàëåíüêàÿ îøèáêà ìîæåò óâåñòè âàñ î÷åíü äàëåêî.
Çàêðûòü ôàéë ïðîùå.
Çàêðûòèå ôàéëà: fclose( ).
Íàø ïðèìåð ïîêàçûâàåò, êàê çàêðûâàòü ôàéë:
Fclose(in);
Ïðîñòî èñïîëüçóéòå ôóíêöèþ fclose( ). Çàìåòèì, ÷òî àðãóìåíòîì åå ÿâëÿåòñÿ in, óêàçàòåëü íà ôàéë, à íå test, èìÿ ôàéëà.
Äëÿ ïðîãðàììû, áîëåå ñåðüåçíîé, ÷åì ýòà, ñëåäîâàëî áû ïîñìîòðåòü, óñïåøíî ëè çàêðûò ôàéë. Ôóíêöèÿ fclose( ) âîçâðàùàåò çíà÷åíèå 0, åñëè ôàéë çàêðûò óñïåøíî, è -1 â ïðîòèâíîì ñëó÷àå.
Òåêñòîâûå ôàéëû ñ áóôåðèçàöèåé.
Ôóíêöèè fopen() è fclose() ðàáîòàþò ñ òåêñòîâûìè ôàéëàìè ñ "áóôåðèçàöèåé". Ïîä áóôåðèçàöèåé ìû ïîíèìàåì, ÷òî ââîäèìûå è âûâîäèìûå äàííûå çàïîìèíàþòñÿ âî âðåìåííîé îáëàñòè ïàìÿòè, íàçûâàåìîé áóôåðîì. Åñëè áóôåð çàïîëíèëñÿ, ñîäåðæèìîå åãî ïåðåäàåòñÿ â áëîê, è ïðîöåññ áóôåðèçàöèè íà÷èíàåòñÿ ñíîâà. Îäíà èç îñíîâíûõ çàäà÷ fclose( ) çàêëþ÷àåòñÿ â òîì, ÷òîáû "îñâîáîäèòü" ëþáûå ÷àñòè÷íî çàïîëíåííûå áóôåðà, åñëè ôàéë çàêðûò.
Òåêñòîâûì ñ÷èòàåòñÿ ôàéë, â êîòîðîì èíôîðìàöèÿ çàïîìèíàåòñÿ â âèäå ñèìâîëîâ â êîäå ASCII (èëè àíàëîãè÷íîì). Îí îòëè÷àåòñÿ îò äâîè÷íîãî ôàéëà, êîòîðûé îáû÷íî èñïîëüçóåòñÿ äëÿ çàïîìèíàíèÿ êîäîâ ìàøèííîãî ÿçûêà. Ôóíêöèè ââîäà-âûâîäà, î êîòîðûõ ìû ñîáèðàåìñÿ ðàññêàçàòü, ïðåäíàçíà÷åíû òîëüêî äëÿ ðàáîòû ñ òåêñòîâûìè ôàéëàìè.
Ââîä-âûâîä ôàéëà: getc( ) è putc( ).
Äâå ôóíêöèè getc( ) è putc( ) ðàáîòàþò àíàëîãè÷íî ôóíêöèÿì getchar( ) è putchar( ). Ðàçíèöà çàêëþ÷àåòñÿ â òîì, ÷òî âû äîëæíû ñîîáùèòü íîâè÷êàì, êàêîé ôàéë ñëåäóåò èñïîëüçîâàòü. Òàêèì îáðàçîì, íàø "ñòàðûé äðóæèùå".
Ch = getchar( );
Ïðåäíàçíà÷åí äëÿ ïîëó÷åíèÿ ñèìâîëà îò ñòàíäàðòíîãî ââîäà, à.
Ch = getc(in);
- äëÿ ïîëó÷åíèÿ ñèìâîëà îò ôàéëà, íà êîòîðûé óêàçûâàåò in. Àíàëîãè÷íî ôóíêöèÿ.
Putc(ch, out);
Ïðåäíàçíà÷åíà äëÿ çàïèñè ñèìâîëà ch â ôàéë, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü out òèïà FILE.  ñïèñêå àðãóìåíòîâ ôóíêöèè putc( ) ýòîò ñèìâîë ñòîèò ïåðâûì, à çàòåì óêàçàòåëü ôàéëà.  íàøåì ïðèìåðå ìû èñïîëüçîâàëè.
Putc(ch, stdout);
Ãäå stdout ÿâëÿåòñÿ óêàçàòåëåì íà ñòàíäàðòíûé âûâîä. Òàêèì îáðàçîì, ýòîò îïåðàòîð ýêâèâàëåíòåí.
Putchar(ch);
Äåéñòâèòåëüíî, îïåðàòîð putchar(ch) îïðåäåëåí äèðåêòèâîé #define òàê æå êàê ôóíêöèÿ putc(ch, stdout) îïðåäåëåíà â ôàéëå stdio.h. Ýòîò óæàñíûé ôàéë ê òîìó æå îïðåäåëÿåò â äèðåêòèâå #define óêàçàòåëè stdout è stdin íà ñòàíäàðòíûé âûâîä è ñòàíäàðòíûé ââîä ñèñòåìû.
Ýòî âûãëÿäèò äîâîëüíî ïðîñòî? Õîðîøî, äîáàâèì ïàðó ïîëåçíûõ íîâøåñòâ.
ÏÐÎÑÒÀß ÏÐÎÃÐÀÌÌÀ ÑÆÀÒÈß ÔÀÉËÀ.
 íàøåì ïðèìåðå èìÿ ôàéëà, êîòîðûé ñëåäîâàëî îòêðûòü, áûëî çàïèñàíî â ïðîãðàììå. Ìû íñ îáÿçàíû ñ÷èòàòüñÿ ñ ýòèì îãðàíè÷åíèåì. Èñïîëüçóÿ àðãóìåíòû êîìàíäíîé ñòðîêè, ìîæíî ñîîáùèòü íàøåé ïðîãðàììå èìÿ ôàéëà, êîòîðûé õîòèì ñ÷èòàòü. B íàøåì ñëåäóþùåì ïðèìåðå (ðèñ. 15.1) òàê è ïðîèñõîäèò. Ñ ïîìîùüþ ïðèìèòèâíîãî ïðèåìà ñæèìàåòñÿ ñîäåðæèìîå - îñòàåòñÿ òîëüêî êàæäûé òðåòèé ñèìâîë. Íàêîíåö, ñæàòàÿ âåðñèÿ ðàçìåùàåòñÿ â íîâûé ôàéë, èìÿ êîòîðîãî ñîñòîèò èç ñòàðîãî èìåíè ñ äîáàâêîé .red (ñîêðàùåíèå ñëîâà reduced). Îáû÷íî âåñüìà âàæíû ïåðâûé è ïîñëåäíèé ýëåìåíòû (àðãóìåíò êîìàíäíîé ñòðîêè è äîáàâêà ê èìåíè ôàéëà). Ñàìî æå ñæàòèå èìååò áîëåå îãðàíè÷åííîå ïðèìåíåíèå, íî, êàê âû óâèäèòå, èì ìîæíî ïîëüçîâàòüñÿ.
/* ñîæìèòå âàøè ôàéëû â 2-3 ðàçà! */
#include <stdio.h>
Main(argc, argv).
Int argc;
Char *argv[ ];
{
FILE *in, *out; /* îïèñûâàåò äâà óêàçàòåëÿ òèïà FILE */
Int ch;
Static char name[20]; /* ïàìÿòü äëÿ èìåíè âûõîäíîãî ôàéëà */
Int count = 0;
If(argc < 2) /* ïðîâåðÿåò, åñòü ëè âõîäíîé ôàéë */
Printf(" Èçâèíèòå, ìíå íóæíî èìÿ ôàéëà â êà÷åñòâå àðãóìåíòà.\n" );
Else.
{ if((in = fopen(argv[1], "r")) != NULL).
{
Strcpy(name, argv[1]; /* êîïèðóåò èìÿ ôàéëà â ìàññèâ */
Strcat(name, ".red"); /* äîáàâëÿåò .red ê èìåíè */
Out = fopen(name, "w"); /* îòêðûâàåò ôàéë äëÿ çàïèñè */
While((ch = getc(in)) ! = EOF).
If( count ++ %3 ==0).
Putc(ch, out); /* ïå÷àòàåò êàæäûé òðåòèé ñèìâîë */
Fclose(in);
Fñlîså(out); }.
Else.
printf(" ß íå ñìîãëà îòêðûòü ôàéë\" %s\" .\n", argv[1]);
} }
ÐÈÑ. 15.1. Ïðîãðàììà ñæàòèÿ ôàéëà.
Ìû ïîìåñòèëè ïðîãðàììó â ôàéë, íàçâàííûé reduce è ïðèìåíèëè ýòó ïðîãðàììó ê ôàéëó, íàçâàííîìó eddy, êîòîðûé ñîäåðæàë îäíó åäèíñòâåííóþ ñòðîêó.
Äàæå Ýääè íàñ îïåðåäèë ñ äåòñêèì õîðîì.
Áûëà âûïîëíåíà êîìàíäà.
Reduce eddy.
È íà âûõîäå ïîëó÷åí ôàéë, íàçâàííûé eddy.red, êîòîðûé ñîäåðæèò.
Äåä ñïåë òèõî.
Êàêàÿ óäà÷à! Íàø ñëó÷àéíî âûáðàííûé ôàéë ñäåëàë îñìûñëåííîå ñîêðàùåíèå.
Âîò íåêîòîðûå çàìå÷àíèÿ ïî ïðîãðàììå.
Âñïîìíèòå, ÷òî argc ñîäåðæèò îïðåäåëåííîå êîëè÷åñòâî àðãóìåíòîâ, â ÷èñëî êîòîðûõ âõîäèò èìÿ ïðîãðàììíîãî ôàéëà. Âñïîìíèòå òàêæå, ÷òî ñ ñîãëàñèÿ îïåðàöèîííîé ñèñòåìû argv[0] ïðåäñòàâëÿåò èìÿ ïðîãðàììû, ò. å. â íàøåì ñëó÷àå reduce. Âñïîìíèòå åùå, ÷òî argv[l] ïðåäñòàâëÿåò ïåðâûé àðãóìåíò, â íàøåì ñëó÷àå eddy. Òàê êàê ñàì argv[l] ÿâëÿåòñÿ óêàçàòåëåì íà ñòðîêó, îí íå äîëæåí çàêëþ÷àòüñÿ â äâîéíûå êàâû÷êè â îïåðàòîðå âûçîâà ôóíêöèè.
Ìû èñïîëüçóåì argc, ÷òîáû ïîñìîòðåòü, åñòü ëè àðãóìåíò. Ëþáûå èçáûòî÷íûå àðãóìåíòû èãíîðèðóþòñÿ. Ïîìåùàÿ â ïðîãðàììó åùå îäèí öèêë, âû ìîãëè áû èñïîëüçîâàòü äîïîëíèòåëüíûå àðãóìåíòû - èìåíà ôàéëîâ è ïðîïóñêàòü â öèêëå êàæäûé èç ýòèõ ôàéëîâ ïî î÷åðåäè.
Ñ öåëüþ ñîçäàíèÿ íîâîãî èìåíè âûõîäíîãî ôàéëà ìû èñïîëüçóåì ôóíêöèþ strcpy( ) äëÿ êîïèðîâàíèÿ èìåíè eddy â ìàññèâ nàmå. Çàòåì ïðèìåíÿåì ôóíêöèþ strcat( ) äëÿ îáúåäèíåíèÿ ýòîãî èìåíè ñ .red.
Ïðîãðàììà òðåáóåò, ÷òîáû äâà ôàéëà áûëè îòêðûòû îäíîâðåìåííî, ïîýòîìó ìû îïèñàëè äâà óêàçàòåëÿ òèïà 'FILE '. Çàìåòèì, ÷òî êàæäûé ôàéë äîëæåí îòêðûâàòüñÿ è çàêðûâàòüñÿ íåçàâèñèìî îò äðóãîãî. Ñóùåñòâóåò îãðàíè÷åíèå íà êîëè÷åñòâî ôàéëîâ, êîòîðûå âû ìîæåòå äåðæàòü îòêðûòûìè îäíîâðåìåííî. Îíî çàâèñèò îò òèïà ñèñòåìû, íî ÷àùå âñåãî íàõîäèòñÿ â ïðåäåëàõ îò 10 äî 20. Ìîæíî èñïîëüçîâàòü îäèí è òîò æå óêàçàòåëü äëÿ ðàçëè÷íûõ ôàéëîâ ïðè óñëîâèè, ÷òî îíè íñ îòêðûâàþòñÿ â îäíî è òî æå âðåìÿ.
Ìû íå îãðàíè÷èâàåìñÿ èñïîëüçîâàíèåì òîëüêî ôóíêöèé getc( ) è putc( ) äëÿ ôàéëîâ ââîäà-âûâîäà. Äàëåå ìû ðàññìîòðèì íåêîòîðûå äðóãèå âîçìîæíîñòè.
ÂÂÎÄ-ÂÛÂÎÄ ÔÀÉËÀ: fprintf( ), fscanf( ), fgets( ) È fputs( ).
Âñå ôóíêöèè ââîäà-âûâîäà, êîòîðûå ìû èñïîëüçîâàëè â ïðåäûäóùèõ ãëàâàõ, èìåþò àíàëîãè äëÿ ââîäà-âûâîäà ôàéëà. Îñíîâíîå îòëè÷èå ñîñòîèò â òîì, ÷òî âàì íóæíî èñïîëüçîâàòü óêàçàòåëü òèïà FILE, ÷òîáû ñîîáùèòü íîâûì ôóíêöèÿì, ñ êàêèì ôàéëîì èì ñëåäóåò ðàáîòàòü. Ïîäîáíî getc( ) è putc( ) ýòè ôóíêöèè èñïîëüçóþòñÿ ïîñëå ôóíêöèè fopen( ), îòêðûâàþùåé ôàéë, è ïåðåä fclose( ), çàêðûâàþùåé åãî.
Ôóíêöèè fprintf( ) è fscanf( ).
Ýòè ôóíêöèè ââîäà-âûâîäà ðàáîòàþò ïî÷òè êàê printf( ) è scanf( ), íî èì íóæåí äîïîëíèòåëüíûé àðãóìåíò äëÿ ññûëêè íà ñàì ôàéë. Îí ÿâëÿåòñÿ ïåðâûì â ñïèñêå àðãóìåíòîâ. Âîò ïðèìåð, èëëþñòðèðóþùèé îáðàùåíèå ê ýòèì ôóíêöèÿì:
/* îáðàçåö èñïîëüçîâàíèÿ fprintf( ) è fscanf( ) */
#include <stdio.h>
Main( ).
{
FILE *fi;
Int age;
Fi = fopen("sam", "r"); /* ñ÷èòûâàíèå */
Fscanf(fi, "%d", &age); /* fi óêàçûâàåò íà sam */
Fclose(fi);
Fi = fopen("data", "a"); /* äîïîëíåíèå "/
Fprintf(fi, "sam is %d. \n", age); /* fi óêàçûâàåò íà data */
Fclose(fi);
}
Çàìåòèì, ÷òî ìîæíî áûëî èñïîëüçîâàòü fi äëÿ äâóõ ðàçëè÷íûõ ôàéëîâ, ïîòîìó ÷òî ìû çàêðûëè ïåðâûé ôàéë, ïðåæäå ÷åì îòêðûòü âòîðîé.
 îòëè÷èå îò getc( ) è putc( ) ýòè äâå ôóíêöèè ïîëó÷àþò óêàçàòåëü òèïà FILE â êà÷åñòâå ïåðâîãî àðãóìåíòà. Äâå äðóãèå, îïèñàííûå íèæå, ïîëó÷àþò åãî â êà÷åñòâå ïîñëåäíåãî àðãóìåíòà.
Ôóíêöèÿ fgets( ).
Ýòà ôóíêöèÿ èìååò òðè àðãóìåíòà, â òî âðåìÿ êàê gets( ) èìååò îäèí. Âîò ïðèìåð åå èñïîëüçîâàíèÿ:
/* ñ÷èòûâàåò ôàéë ñòðîêà çà ñòðîêîé */
#include <stdio.h>
#define MAXLIN 80.
Main( ).
{
FILE *f1;
Char *string [MAXLIN];
F1 = fopen("story", "r");
While(fgets(string, MAXLIN, f1) != NULL).
Puts(string);
}
Ïåðâûé èç òðåõ àðãóìåíòîâ ôóíêöèè fgets( ) ÿâëÿåòñÿ óêàçàòåëåì íà ìåñòîïîëîæåíèå ñ÷èòûâàåìîé ñòðîêè. Ìû ðàñïîëàãàåì ââîäèìóþ èíôîðìàöèþ â ñèìâîëüíûé ìàññèâ string.
Âòîðîé àðãóìåíò ñîäåðæèò ïðåäåëüíóþ äëèíó ñ÷èòûâàåìîé ñòðîêè. Ôóíêöèÿ ïðåêðàùàåò ðàáîòó ïîñëå ñ÷èòûâàíèÿ ñèìâîëà íîâîé ñòðîêè èëè ïîñëå ñ÷èòûâàíèÿ ñèìâîëîâ îáùèì ÷èñëîì MAXLIN - 1 (â çàâèñèìîñòè îò òîãî, ÷òî ïðîèçîéäåò ðàíüøå).  ëþáîì ñëó÷àå íóëü-ñèìâîë ('\0') äîáàâëÿåòñÿ â ñàìûé êîíåö ñòðîêè.
Òðåòèé àðãóìåíò óêàçûâàåò, êîíå÷íî, íà ôàéë, êîòîðûé áóäåò ÷èòàòüñÿ.
Ðàçíèöà ìåæäó gets( ) è fgets( ) çàêëþ÷àåòñÿ â òîì, ÷òî gets( ) çàìåíÿåò ñèìâîë íîâîé ñòðîêè íà '\0', â òî âðåìÿ êàê fgets( ) ñîõðàíÿåò ñèìâîë íîâîé ñòðîêè.
Ïîäîáíî gets( ) ôóíêöèÿ fgets( ) âîçâðàùàåò çíà÷åíèå NULL, åñëè âñòðå÷àåò ñèìâîë EOF. Ýòî ïîçâîëÿåò âàì ïðîâåðèòü, êàê ìû è ñäåëàëè, äîñòèãëè ëè âû êîíöà ôàéëà.
Ôóíêöèÿ fputs( ).
Ýòà ôóíêöèÿ î÷åíü ïîõîæà íà puts( ). Îïåðàòîð.
Fputs(" Âû áûëè ïðàâû.", fileptr);
Ïåðåäàåò ñòðîêó "Âû áûëè ïðàâû."  ôàéë, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü fileptr òèïà FILE. Êîíå÷íî, ñíà÷àëà íóæíî îòêðûòü ôàéë ïðè ïîìîùè ôóíêöèè fopen( ).  ñàìîì îáùåì âèäå ýòî âûãëÿäèò òàê.
Status = fputs(óêàçàòåëü ñòðîêè, óêàçàòåëü ôàéëà);
Ãäå status ÿâëÿåòñÿ öåëûì ÷èñëîì, êîòîðîå óñòàíàâëèâàåòñÿ â EOF, åñëè fputs( ) âñòðå÷àåò EOF èëè îøèáêó.
Ïîäîáíî puts( ) ýòà ôóíêöèÿ íå ñòàâèò çàâåðøàþùèé ñèìâîë '\0' â êîíåö êîïèðóåìîé ñòðîêè.  îòëè÷èå îò puts() ôóíêöèÿ fputs( ) íå äîáàâëÿåò ñèìâîë íîâîé ñòðîêè â åå âûâîä.
Øåñòü ôóíêöèé ââîäà-âûâîäà êîòîðûå ìû òîëüêî ÷òî îáñóäèëè, äîëæíû äàòü âàì èíñòðóìåíò, äëÿ ÷òåíèÿ è çàïèñè òåêñòîâûõ ôàéëîâ. Åñòü åùå îäíî ñðåäñòâî, êîòîðîå ìîæåò îêàçàòüñÿ ïîëåçíûì, è ìû åãî ñåé÷àñ îáñóäèì.
ÏÐÎÈÇÂÎËÜÍÛÉ ÄÎÑÒÓÏ: fseek( ).
Ôóíêöèÿ fseek( ) ïîçâîëÿåò íàì îáðàáàòûâàòü ôàéë ïîäîáíî ìàññèâó è íåïîñðåäñòâåííî äîñòèãàòü ëþáîãî îïðåäåëåííîãî áàéòà â ôàéëå, îòêðûòîì ôóíêöèåé fopen( ). Âîò ïðîñòîé ïðèìåð, ïîêàçûâàþùèé, êàê îíà ðàáîòàåò. Êàê è â íàøèõ ïðåäûäóùèõ ïðèìåðàõ, ôóíêöèÿ èñïîëüçóåò àðãóìåíò êîìàíäíîé ñòðîêè äëÿ ïîëó÷åíèÿ èìåíè ôàéëà, ñ êîòîðûì îíà ðàáîòàåò. Çàìåòèì, ÷òî fseek() èìååò òðè àðãóìåíòà è âîçâðàùàåò çíà÷åíèå òèïà int.

/*èñïîëüçîâàíèå fscek( ) äëÿ ïå÷àòè ñîäåðæèìîãî ôàéëà */
#include <stdio.h&
Main(number, names) /* íå ñëåäóåò èñïîëüçîâàòü argc è argv */
Int number;
Char *nàmås[ ];
{
FILE *fp;
Long offset = OL; /*îáðàòèòå âíèìàíèå, ÷òî ýòî òèï long */
If(number < 2).
Puts("Ìíå íóæíî èìÿ ôàéëà â êà÷åñòâå àðãóìåíòà.");
Else {
If((fp = fopen(names[1], "r")) == 0).
Printf(" ß íå ìîãó îòêðûòü %s.\n", names[1]);
Else {
While(fseek(fp, offset++, 0) == 0).
Putchar(getc(fp));
Fclose(fp); }.
}
}
Ïåðâûé èç òðåõ àðãóìåíòîâ ôóíêöèè fseek( ) ÿâëÿåòñÿ óêàçàòåëåì òèïà FILE íà ôàéë, â êîòîðîì âåäåòñÿ ïîèñê. Ôàéë ñëåäóåò îòêðûòü, èñïîëüçóÿ ôóíêöèþ fopen( ).
Âòîðîé àðãóìåíò íàçâàí "offset" (âîò ïî÷åìó ìû âûáðàëè äàííîå èìÿ äëÿ ïåðåìåííîé). Ýòîò àðãóìåíò ñîîáùàåò, êàê äàëåêî ñëåäóåò ïåðåäâèíóòüñÿ îò íà÷àëüíîé òî÷êè (ñì. íèæå); îí äîëæåí èìåòü çíà÷åíèå òèïà long, êîòîðîå ìîæåò áûòü ïîëîæèòåëüíûì (äâèæåíèå âïåðåä) èëè îòðèöàòåëüíûì (äâèæåíèå íàçàä).
Òðåòèé àðãóìåíò ÿâëÿåòñÿ êîäîì, îïðåäåëÿþùèì íà÷àëüíóþ òî÷êó:
| Êîä | Ïîëîæåíèå â ôàéëå |
|---|---|
| 0 | íà÷àëî ôàéëà |
| 1 | òåêóùàÿ ïîçèöèÿ |
| 2 | êîíåö ôàéëà |
Ôóíêöèÿ fseek( ) âîçâðàùàåò 0, åñëè âñå õîðîøî, è -1, åñëè åñòü îøèáêà, íàïðèìåð ïîïûòêà ïåðåìåùàòüñÿ çà ãðàíèöû ôàéëà. Òåïåðü ìû ìîæåì ðàçúÿñíèòü íàø ìàëåíüêèé öèêë:
While(fseek(fp, offset++, 0)==0).
putchar(getc(fp));
Ïîñêîëüêó ïåðåìåííàÿ offset èíèöèàëèçèðîâàíà íóëåì, ïðè ïåðâîì ïðîõîæäåíèè ÷åðåç öèêë ìû èìååì âûðàæåíèå.
Fseek(fp, OL, 0).
Îçíà÷àþùåå, ÷òî ìû èäåì â ôàéë, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü fp, è íàõîäèì áàéò, îòñòîÿùèé íà 0 áàéò îò íà÷àëà, ò.å. ïåðâûé áàéò. Çàòåì ôóíêöèÿ putchar( ) ïå÷àòàåò ñîäåðæèìîå ýòîãî áàéòà. Ïðè ñëåäóþùåì ïðîõîæäåíèè ÷åðåç öèêë ïåðåìåííàÿ offset óâåëè÷èâàåòñÿ äî 1L, è ïå÷àòàåòñÿ ñëåäóþùèé áàéò. Ïîñóùåñòâó, ïåðåìåííàÿ offset äåéñòâóåò ïîäîáíî èíäåêñó äëÿ ýëåìåíòîâ ôàéëà. Ïðîöåññ ïðîäîëæàåòñÿ äî òåõ ïîð, ïîêà offset íå ïîïûòàåòñÿ ïîïàñòü â fseek( ) ïîñëå êîíöà ôàéëà.  ýòîì ñëó÷àå fseek( ) âîçâðàùàåò çíà÷åíèå - 1 è öèêë ïðåêðàùàåòñÿ.
Ýòîò ïîñëåäíèé ïðèìåð ÷èñòî ó÷åáíûé. Íàì íå íóæíî èñïîëüçîâàòü fseek( ), ïîòîìó ÷òî getc( ) òàê èëè èíà÷å ïðîõîäèò ÷åðåç ôàéë áàéò çà áàéòîì; fseek( ) ïðèêàçàëà getc( ) "ïîñìîòðåòü" òóäà, êóäà îíà ñàìà óæå ñîáèðàëàñü ïîñìîòðåòü.
Âîò ïðèìåð (ðèñ. 15.2), â êîòîðîì âûïîëíÿåòñÿ ÷òî-òî íåñêîëüêî áîëåå íåîáû÷íîå (Ìû áëàãîäàðèì Âèëüÿìà Øåêñïèðà çà ýòîò ïðèìåð â ïüåñå "Äâåíàäöàòàÿ íî÷ü").
/* ÷åðåäîâàíèå ïå÷àòè â ïðÿìîì è îáðàòíîì íàïðàâëåíèÿõ */
#include <stdio.h>
Main(number, names) /* âàì íå íóæíî ïðèìåíÿòü argc è argv */
Int number;
Char *names[ ];
{
FILE *fp;
Long offset = 0L;
If(number < 2).
Puts(" Ìíå íóæíî èìÿ ôàéëà â êà÷åñòâå àðãóìåíòà.");
Else {
If(fp = fopen(names[l], "r")) == 0).
Printf(" ß íå ìîãó îòêðûòü %s.\n", names[l]);
Else {
While(fseek(fp, offset++, 0) == 0).
{ putchar(getc(fp));
If(fseek(fp, -(offset + 3), 2) == 0).
Putchar(getc(fp)); }.
Fclose(fp); }.
} }
ÐÈÑ. 15.2. Ïðîãðàììà, ÷åðåäóþùàÿ ïå÷àòü â ïðÿìîì è îáðàòíîì íàïðàâëåíèÿõ.
Ïðèìåíåíèå ýòîé ïðîãðàììû ê ôàéëó, ñîäåðæàùåìó èìÿ "Ìàëüâîëèî", äàåò òàêîé ïðèÿòíûé ðåçóëüòàò:
ÌîàèëëüîââîüëëèàîÌ.
Íàøà ïðîãðàììà ïå÷àòàåò ïåðâûé ñèìâîë ôàéëà, çàòåì ïîñëåäíèé, çàòåì âòîðîé, çàòåì ïðåäøåñòâóþùèé ïîñëåäíåìó è ò.ä. Ìû òîëüêî äîáàâèëè âîò ýòè ñòðîêè â ïîñëåäíþþ ïðîãðàììó:
If(fseek(fp, -(offset + 3), 2) == 0).
putchar(getc(fp));
Êîä 2 â îïåðàòîðå ïðåäïîëàãàåò, ÷òî ìû áóäåì ñ÷èòàòü ïîçèöèè îò êîíöà ôàéëà. Çíàê ìèíóñ îçíà÷àåò ñ÷åò â îáðàòíîì íàïðàâëåíèè. +3 ñòîèò çäåñü ïîòîìó, ÷òî ìû íà÷èíàåì ñ ïîñëåäíåãî ðåãóëÿðíîãî ñèìâîëà ôàéëà è ïðîïóñêàåì íåñêîëüêî ñèìâîëîâ "íîâàÿ ñòðîêà" è EOF â ñàìîì êîíöå ôàéëà. (Òî÷íîå çíà÷åíèå ýòîé êîððåêòèðîâêè çàâèñèò îò òèïà ñèñòåìû. Íàøè ôàéëû èìåþò â êîíöå ïî äâà ñèìâîëà íîâîé ñòðîêè, çà êîòîðûìè ñëåäóþò äâà EOF, ïîýòîìó ìû êàê ðàç èõ è îáõîäèì.).
Òàêèì îáðàçîì, ýòà ÷àñòü ïðîãðàììû ÷åðåäóåò ïå÷àòü â îáðàòíîì íàïðàâëåíèè è ïå÷àòü â ïðÿìîì íàïðàâëåíèè. Ñëåäóåò çàìåòèòü, ÷òî â íåêîòîðûõ ñèñòåìàõ ìîæåò íå ïðåäóñìàòðèâàòüñÿ êîä 2 äëÿ fseek( ).
Òåïåðü îñòàâèì íà íåêîòîðîå âðåìÿ ôàéëû è ïåðåéäåì ê äðóãîìó ðàçäåëó áèáëèîòåêè.
ÏÐÎÂÅÐÊÀ È ÏÐÅÎÁÐÀÇÎÂÀÍÈÅ ÑÈÌÂÎËÎÂ.
Çàãîëîâî÷íûé ôàéë ctype.h ñîäåðæèò íåñêîëüêî ôóíêöèé ìàêðîîïðåäåëåíèé, êîòîðûå ïðîâåðÿþò, ê êàêîìó êëàññó ïðèíàäëåæàò ñèìâîëû. Ôóíêöèÿ isalpha(c), íàïðèìåð, âîçâðàùàåò íåíóëåâîå çíà÷åíèå (èñòèíà), åñëè ñ ÿâëÿåòñÿ ñèìâîëîì áóêâû, è íóëü (ëîæü), åñëè ñèìâîë íå ÿâëÿåòñÿ áóêâîé. Òàêèì îáðàçîì,
Isalpha('S') != 0, íî isalpha('#') ==0.
Íèæå ïåðå÷èñëåíû ôóíêöèè, ÷àùå âñåãî íàõîäÿùèåñÿ â ýòîì ôàéëå.  êàæäîì ñëó÷àå ôóíêöèÿ âîçâðàùàåò íåíóëåâîå çíà÷åíèå, åñëè ñ ïðèíàäëåæèò ê îïðàøèâàåìîìó êëàññó, è íóëü â ïðîòèâíîì ñëó÷àå.
| ÔÓÍÊÖÈß | ÏÐÎÂÅÐßÅÒ, ßÂËßÅÒÑß ËÈ Ñ |
|---|---|
| isalpha(c) | áóêâîé |
| isdigit(c) | öèôðîé |
| islower(c) | ñòðî÷íîé áóêâîé |
| isspace(c) | ïóñòûì ñèìâîëîì (ïðîáåë, òàáóëÿöèÿ èëè íîâàÿ ñòðîêà) |
| isupper(c) | ïðîïèñíîé áóêâîé |
Âàøà ñèñòåìà ìîæåò èìåòü äîïîëíèòåëüíûå ôóíêöèè, òàêèå êàê.
| ÔÓÍÊÖÈß | ÏÐÎÂÅÐßÅÒ, ßÂËßÅÒÑß ËÈ Ñ |
|---|---|
| isalnum(c) | àëôàâèòíîöèôðîâûì (áóêâà èëè öèôðà) |
| isascii(c) | êîäîì ASCII (0-127) |
| iscntrl(c) | óïðàâëÿþùèì ñèìâîëîì |
| ispunct(c) | çíàêîì ïóíêòóàöèè |
Åùå äâå ôóíêöèè âûïîëíÿþò ïðåîáðàçîâàíèÿ.
| toupper(c) | ïðåîáðàçóåò ñ â ïðîïèñíóþ áóêâó |
| tolower(c) | ïðåîáðàçóåò ñ â ñòðî÷íóþ áóêâó |
 íåêîòîðûõ ñèñòåìàõ ïðåîáðàçîâàíèå âûïîëíÿåòñÿ òîëüêî â ñëó÷àå, åñëè ñèìâîë íàõîäèòñÿ â ðåãèñòðå (ïðîïèñíûõ èëè ñòðî÷íûõ áóêâ), ïðîòèâîïîëîæíîì òîìó, ñ êîòîðîãî ñëåäóåò íà÷èíàòü. Îäíàêî íàäåæíåå ïðåäâàðèòåëüíî ïðîâåðèòü ðåãèñòð.
Íèæå (ðèñ. 15.3.) äàíà ïðîãðàììà, èñïîëüçóþùàÿ íåêîòîðûå èç ýòèõ ôóíêöèé äëÿ ïðåîáðàçîâàíèÿ âñåãî ôàéëà â ïðîïèñíûå èëè ñòðî÷íûå áóêâû, ïî âàøåìó æåëàíèþ. Äëÿ ïîëó÷åíèÿ íåáîëüøîãî ðàçíîîáðàçèÿ èñïîëüçóåì äèàëîãîâûé ïîäõîä, âìåñòî òîãî ÷òîáû ïðèìåíÿòü àðãóìåíòû êîìàíäíîé ñòðîêè äëÿ ñíàáæåíèÿ ïðîãðàììû èíôîðìàöèåé.
/* ïðåîáðàçîâàíèå ñòðî÷íûõ áóêâ â ïðîïèñíûå è îáðàòíî */
#include <stdio.h>
#include <ctype.h> /* âêëþ÷àåò ôàéë ìàêðîîïðåäåëåíèé */
#define UPPER 1.
#define LOWER 0.
Main( ).
{
Int crit; /* äëÿ óñòàíîâêè ðåãèñòðà ïðîïèñíûõ èëè ñòðî÷íûõ áóêâ */
Char file1[14], file2[14]; /* èìåíà âõîäíîãî è âûõîäíîãî ôàéëîâ */
Crit = choose( ); /* âûáèðàåò ïðîïèñíûå èëè ñòðî÷íûå áóêâû */
Getfiles(file1, file2); /* ïîëó÷àñò èìåíà ôàéëîâ */
Conv(file1, file2, crit); /* âûïîëíÿåò ïðåîáðàçîâàíèå */
} choose( ).
{ int ch;
Printf("Ïðîãðàììà ïðåîáðàçóåò âåñü ôàéë â ïðîïèñíûå áóêâû èëè \n");
Printf(" â ñòðî÷íûå áóêâû. Ââîäèò U, åñëè íóæíû ïðîïèñíûå áóêâû\n");
Printf(" èëè ââîäèò L, åñëè íóæíû ñòðî÷íûå áóêâû. \n");
While((ch=getchar( ))!='U' && ch!='u' && ch!='L'.
&& ch!='l').
printf(" Ââåäèòå, ïîæàéëóñòà, U èëè L.\n");
While(getchar( )!='\n').
; /* ñáðàñûâàåò ïîñëåäíèé ñèìâîë íîâîé ñòðîêè */
If(ch =='U' || ch =='u').
{ printf(" Âñå â ïîðÿäêå, åñòü ðåãèñòð ïðîïèñíûõ áóêâ.");
Return(UPPER);
Else.
{ printf(" Âñå â ïîðÿäêå, åñòü ðåãèñòð ñòðî÷íûõ áóêâ.");
Return(LOWER); } }.
Getfiles(namel, name2);
Char *namel, name2;
{ printf(" Êàêîé ôàéë âû õîòèòå ïðåîáðàçîâàòü?\n");
Gets(name1);
Printf(" Ýòî\" %s\" .\n", name1);
Printf("Êàêîå èìÿ âû õîòèòå âûáðàòü äëÿ ïðåîáðàçóåìîãî ôàéëà?\n");
While(strcmp(gets(name2), name1) == NULL).
Printf(" Âûáåðèòå äðóãîå èìÿ.\n" );
Printf(" Âàø âûõîäíîé ôàéë\" %s \".\n", name2);
} conv(name1, name2, crit);
Char *name1, name2;
Int crit;
{ int ch;
FILE *f1, *f2;
If((f1 = fopen(name1, "r" )) == NULL).
Printf(Èçâèíèòå, ÿ íå ìîãó îòêðûòü % s. Äî ñâèäàíèÿ.\n", name1);
Else.
{ puts(" Èòàê, íà÷íåì!");
F2 = fopen(name2, "w");
While((ch = getc(f1)) != EOF).
If(crit == UPPER).
Ch = islower(ch) ? toupper(ch) : ch;
Else.
Ch = isupper(ch) ? tolower(ch) : ch;
Putc(ch, f2);
} fclosc(f2);
Fclosc(f1);
Puts("Ñäåëàíî!");
} }
ÐÈÑ. 15.3. Ïðîãðàììà ïðåîáðàçîâàíèÿ ñòðî÷íûõ áóêâ â ïðîïèñíûå è îáðàòíî.
Ìû ðàçäåëèëè ïðîãðàììó íà òðè ÷àñòè: ïîëó÷åíèå îò ïîëüçîâàòåëÿ óêàçàíèÿ î âèäå ïðåîáðàçîâàíèÿ, ïîëó÷åíèå èìåíè âõîäíîãî è âûõîäíîãî ôàéëîâ è âûïîëíåíèå ïðåîáðàçîâàíèÿ. ×òîáû îñóùåñòâèòü âñå ýòî, ìû ñîçäàëè ðàçíûå ôóíêöèè äëÿ êàæäîé ÷àñòè. Ôóíêöèÿ choose( ) äîâîëüíî ïðîñòà çà èñêëþ÷åíèåì, ìîæåò áûòü, öèêëà.
While(getchar( ) != '\n');
Ýòîò öèêë âêëþ÷åí äëÿ ðåøåíèÿ ïðîáëåìû, ñ êîòîðîé ìû ñòîëêíóëèñü â ãë. 14. Êîãäà ïîëüçîâàòåëü îòâå÷àåò íà âîïðîñ î âèäå ïðåîáðàçîâàíèÿ, ñêàæåì, áóêâîé U, îí íàæèìàåò êëàâèøó U, à çàòåì êëàâèøó [ââîä], êîòîðàÿ ïåðåäàåò '\n'.
Ïåðâîíà÷àëüíàÿ ôóíêöèÿ getchar( ) èçâëåêàåò U, íî îñòàâëÿåò '\n' äëÿ ñëåäóþùåãî ÷òåíèÿ ñòðîêè. Ôóíêöèÿ gets(), âõîäÿùàÿ â getnames(), èíòåðïðåòèðîâàëà áû '\n' êàê ïóñòóþ ñòðîêó, ïîýòîìó ìû èñïîëüçîâàëè ìàëûé öèêë while, ÷òîáû èçáàâèòüñÿ îò ñèìâîëà "íîâàÿ ñòðîêà". Äåéñòâèòåëüíî, ïðîñòàÿ getchar( ), ñäåëàëà áû ýòî, åñëè áû ïîëüçîâàòåëü íåïîñðåäñòâåííî çà U íàæèìàë áû [ââîä]. Íî íàøà âåðñèÿ, êðîìå òîãî, ïðåäóñìàòðèâàåò âîçìîæíîñòü íàæàòü íà êëàâèøó ïðîáåëà íåñêîëüêî ðàç ïåðåä [ââîä].
 ôóíêöèè getnames( ) äëÿ âàñ íå äîëæíî áûòü ñþðïðèçîâ. Ó÷òèòå, ÷òî ìû çàïðåùàåì ïîëüçîâàòåëþ ïðèìåíÿòü îäèíàêîâûå èìåíà äëÿ âûõîäíîãî è âõîäíîãî ôàéëîâ. Ñòàíäàðòíàÿ âåðñèÿ ôóíêöèè fopen( ) íå ïîçâîëÿåò âàì è ÷èòàòü è çàïèñûâàòü îäèí è òîò æå ôàéë, åñëè âû îòêðûëè åãî îäèí ðàç.
Ôóíêöèÿ conv( ) ÿâëÿåòñÿ ôóíêöèåé êîïèðîâàíèÿ ñ âûïîëíåíèåì ïðåîáðàçîâàíèÿ. Çíà÷åíèå crit èñïîëüçóåòñÿ äëÿ îïðåäåëåíèÿ òðåáóåìîãî ïðåîáðàçîâàíèÿ. Ðàáîòà âûïîëíÿåòñÿ ïðîñòûì óñëîâíûì îïåðàòîðîì, òàêèì êàê.
Ch = islower(ch) ? toupper(ch) : ch;
Îí ïðîâåðÿåò, ÿâëÿåòñÿ ëè ch ñòðî÷íîé áóêâîé. Åñëè äà, òî ñèìâîë ïðåîáðàçóåòñÿ â ïðîïèñíóþ áóêâó. Åñëè íåò, îñòàåòñÿ êàê åñòü.
Ìàêðîôóíêöèè ôàéëà ctype.h ïðåäîñòàâëÿþò óäîáíûå è ïîëåçíûå ñðåäñòâà äëÿ ïðîãðàììèðîâàíèÿ. Òåïåðü äàâàéòå çàéìåìñÿ íåêîòîðûìè áîëåå ñëîæíûìè ôóíêöèÿìè ïðåîáðàçîâàíèÿ.
ÏÐÅÎÁÐÀÇÎÂÀÍÈß ÑÈÌÂÎËÜÍÛÕ ÑÒÐÎÊ: atoi( ), atof( ).
Èñïîëüçîâàíèå scanf( ) äëÿ ñ÷èòûâàíèÿ öèôðîâûõ çíà÷åíèé íå ÿâëÿåòñÿ ñàìûì íàäåæíûì ñïîñîáîì, ïîñêîëüêó scanf( ) ëåãêî âíåñòè â çàáëóæäåíèå îøèáêàìè ïîëüçîâàòåëåé ïðè ââîäå ÷èñåë ñ êëàâèàòóðû. Íåêîòîðûå ïðîãðàììèñòû ïðåäïî÷èòàþò ñ÷èòûâàòü äàæå ÷èñëîâûå äàííûå êàê ñèìâîëüíûå ñòðîêè è ïðåîáðàçîâûâàòü ñòðîêó â ñîîòâåòñòâóþùåå ÷èñëîâîå çíà÷åíèå. Äëÿ ýòîãî èñïîëüçóþòñÿ ôóíêöèè atoi( ) è atof( ). Ïåðâàÿ ïðåîáðàçóåò ñòðîêó â öåëîå, âòîðàÿ - â ÷èñëî ñ ïëàâàþùåé òî÷êîé. Âîò (ðèñ. 15.4) îáðàçåö èõ èñïîëüçîâàíèÿ:
/* âêëþ÷åíèå atoi( ) */
#include <stdio.h>
#define issign(c) (((ñ) == '-' || (ñ) == '+') ? (1) : (0)).
#define SIZE 10.
#define YES 1.
#define NO 0.
Main( ).
{
Char ch;
Static char number[SIZE];
Int value;
Int digit = YES;
Int count = 0;
Puts(" Ââåäèòå, ïîæàëóéñòà, öåëîå.");
Gets(number);
If(number[SIZE - 1] != '\0').
{ puts("Ñëèøêîì ìíîãî öèôð; âû óíè÷òîæèëè ìåíÿ.");
Exit(1);
} while((ch = number[count]) !='0' && digit == YES).
If(!issign(ch) && iisdigit(ch) && !isspace(ch)).
digit = NO;
If(digit == YES).
{ value = atoi(number);
Printf(" ×èñëî áûëî %d.\n" , value); }.
Else.
Printf(" Ýòî íå ïîõîæå íà öåëîå.");
}
ÐÈÑ. 15.4. Ïðîãðàììà èñïîëüçîâàíèÿ atoi( ).
Ìû ïðåäóñìîòðåëè ïðîâåðêó íåêîòîðûõ îøèáîê. Âî-ïåðâûõ, ñëåäóåò ïîñìîòðåòü, óìåùàåòñÿ ëè âõîäíàÿ ñòðîêà â ïðåäíàçíà÷åííîì äëÿ íåå ìàññèâå. Ïîñêîëüêó number ÿâëÿåòñÿ ñòàòè÷åñêèì ñèìâîëüíûì ìàññèâîì, îí èíèöèàëèçèðóåòñÿ íóëÿìè. Åñëè ïîñëåäíèé ýëåìåíò ìàññèâà íå ÿâëÿåòñÿ íóëåì, çíà÷èò ÷òî-òî íåâåðíî, è ïðîãðàììà ïðåêðàùàåò ðàáîòó. Çäåñü ìû èñïîëüçîâàëè áèáëèîòå÷íóþ ôóíêöèþ exit( ), êîòîðàÿ âûâîäèò íàñ èç ïðîãðàììû. Íåìíîãî ïîçæå ìû ðàññêàæåì êðàòêî îá ýòîé ôóíêöèè.
Çàòåì ïîñìîòðèì, íå ñîäåðæèò ëè ñòðîêà ÷òî-íèáóäü êðîìå ïðîáåëîâ, öèôð è àëãåáðàè÷åñêèõ çíàêîâ. Ôóíêöèÿ îòâåðãàåò òàêèå ñòðîêè, êàê "äåðåâî" èëè "1.2Å2". Åå óñòðàèâàåò ñìåñü, ïîäîáíàÿ "3 - 4 + 2", íî atoi( ) áóäåò âûïîëíÿòü äàëüíåéøèé îòáîð. Âñïîìíèì, ÷òî ! ÿâëÿåòñÿ îïåðàöèåé îòðèöàíèÿ, ïîýòîìó !isdigit(c) îçíà÷àåò: "ñ íå ÿâëÿåòñÿ öèôðîé". Ñòðîêà.
Value = atoi(nuinbcr);
Ïîêàçûâàåò, êàê èñïîëüçóåòñÿ ôóíêöèÿ atoi( ). Åå àðãóìåíò ÿâëÿåòñÿ óêàçàòåëåì ñèìâîëüíîé ñòðîêè; â ýòîì ñëó÷àå ìû ïðèìåíèëè èìÿ ìàññèâà number. Ôóíêöèÿ âîçâðàùàåò öåëîå çíà÷åíèå äëÿ òàêîé ñòðîêè. Òàêèì îáðàçîì, "1234" ÿâëÿåòñÿ ñòðîêîé èç ÷åòûðåõ ñèìâîëîâ è ïåðåâîäèòñÿ â 1234 - åäèíîå ÷èñëî òèïà int.
Ôóíêöèÿ atoi( ) èãíîðèðóåò âåäóùèå ïðîáåëû, îáðàáàòûâàåò âåäóùèé àëãåáðàè÷åñêèé çíàê, åñëè îí åñòü, è îáðàáàòûâàåò öèôðû âïëîòü äî ïåðâîãî ñèìâîëà, íñ ÿâëÿþùåãîñÿ öèôðîé. Ïîýòîìó íàø ïðèìåð "3 - 4 + 2" áûë áû ïðåâðàùåí â çíà÷åíèå 3. Ïîñìîòðèòå "Âîïðîñû" â êîíöå ãëàâû äëÿ âîçìîæíîãî ïðèìåíåíèÿ ýòîé ôóíêöèè.
Ôóíêöèÿ atof( ) âûïîëíÿåò ïîäîáíûå äåéñòâèÿ äëÿ ÷èñåë ñ ïëàâàþùåé òî÷êîé. Îíà âîçâðàùàåò òèï double, ïîýòîìó äîëæíà áûòü îïèñàíà êàê double â èñïîëüçóþùåé åå ïðîãðàììå.
Ïðîñòûå âåðñèè atof( ) áóäóò îáðàáàòûâàòü ÷èñëà âèäà 10.2, 46 è - 124.26. Áîëåå ìîùíûå âåðñèè ïðåîáðàçóþò òàêæå ýêñïîíåíöèàëüíóþ çàïèñü, ò. å. ÷èñëà, ïîäîáíûå 1.25Å - 13.
Âàøà ñèñòåìà ìîæåò òàêæå èìåòü îáðàòíûå ôóíêöèè, ðàáîòàþùèå â ïðîòèâîïîëîæíîì íàïðàâëåíèè. Ôóíêöèÿ itoa( ) áóäåò ïðåîáðàçîâûâàòü öåëîå â ñèìâîëüíóþ ñòðîêó, à ôóíêöèÿ ftoa( ) ïðåîáðàçîâûâàòü ÷èñëî ñ ïëàâàþùåé òî÷êîé â ñèìâîëüíóþ ñòðîêó.
ÂÛÕÎÄ: exit( ).
Ôóíêöèÿ exit( ) äàñò âàì óäîáíûé ñïîñîá "ïîêèíóòü" ïðîãðàììó. Îíà ÷àñòî èñïîëüçóåòñÿ äëÿ ïðåêðàùåíèÿ ðàáîòû ïðîãðàììû ïðè ïîÿâëåíèè îøèáêè. Åñëè ê exit( ) îáðàòèëèñü èç ôóíêöèè, âûçâàííîé ãëàâíîé ïðîãðàììîé, òî ïðåêðàùàåò ðàáîòó âñÿ ïðîãðàììà, à íå òîëüêî ýòà ôóíêöèÿ.  ïðèâåäåííîì âûøå ïðèìåðå ñ ôóíêöèåé atoi( ) èñïîëüçîâàíèå exit( ) ïîçâîëÿåò íàì èçáåæàòü âêëþ÷åíèÿ äîïîëíèòåëüíîãî îïåðàòîðà else äëÿ îáõîäà îñòàòêà ïðîãðàììû.
Ïðèÿòíàÿ ñïîñîáíîñòü exit( ) çàêëþ÷àåòñÿ â òîì, ÷òî îíà çàêðûâàåò ëþáûå ôàéëû, îòêðûòûå ôóíêöèåé fopen( ). Ýòî äåëàåò íàø âûõîä èç ïðîãðàììû áîëåå êîððåêòíûì.
Àðãóìåíòîì exit( ) ÿâëÿåòñÿ íîìåð êîäà îøèáêè.  íåêîòîðûõ ñèñòåìàõ îí ìîæåò ïåðåäàâàòüñÿ äðóãîé ïðîãðàììå, åñëè èñõîäíàÿ ïðåêðàòèëà ðàáîòó. Ñóùåñòâóåò ñîãëàøåíèå, ÷òî 0 óêàçûâàåò íà íîðìàëüíîå çàâåðøåíèå, â òî âðåìÿ êàê ëþáîå äðóãîå çíà÷åíèå ãîâîðèò îá îøèáêå.
Åñòü åùå îäíà òåìà, êîòîðóþ ìû õîòèì îáñóäèòü.
ÐÀÑÏÐÅÄÅËÅÍÈÅ ÏÀÌßÒÈ: malloc( ) È ñà11îñ( ).
Âàøà ïðîãðàììà äîëæíà ïðåäîñòàâèòü äîñòàòî÷íûé îáúåì ïàìÿòè äëÿ çàïîìèíàíèÿ èñïîëüçóåìûõ äàííûõ. Íåêîòîðûå èç ýòèõ ÿ÷ååê ïàìÿòè ðàñïðåäåëÿþòñÿ àâòîìàòè÷åñêè. Íàïðèìåð, ìû ìîæåì îáúÿâèòü.
Char place[ ] = "Çàëèâ Ñâèíîé ïå÷åíêè";
È áóäåò âûäåëåíà ïàìÿòü, äîñòàòî÷íàÿ äëÿ çàïîìèíàíèÿ ýòîé ñòðîêè.
Èëè ìû ìîæåì áûòü áîëåå êîíêðåòíû è çàïðîñèòü îïðåäåëåííûé îáúåì ïàìÿòè:
Int plates[100];
Ýòî îïèñàíèå âûäåëÿåò 100 ÿ÷ååê ïàìÿòè, êàæäàÿ èç êîòîðûõ ïðåäíàçíà÷åíà äëÿ çàïîìèíàíèÿ öåëîãî çíà÷åíèÿ.
ßçûê Ñè íå îñòàíàâëèâàåòñÿ íà ýòîì. Îí ïîçâîëÿåò âàì ðàñïðåäåëÿòü äîïîëíèòåëüíóþ ïàìÿòü âî âðåìÿ ðàáîòû ïðîãðàììû. Ïðåäïîëîæèì, íàïðèìåð, âû ïèøåòå äèàëîãîâóþ ïðîãðàììó è íå çíàåòå çàðàíåå, ñêîëüêî äàííûõ âàì ïðèäåòñÿ ââîäèòü. Ìîæíî âûäåëèòü íóæíûé âàì (êàê âû ñ÷èòàåòå) îáúåì ïàìÿòè, à çàòåì, åñëè ïîíàäîáèòñÿ, ïîòðåáîâàòü åùå. Íà ðèñ. 15.5 äàí ïðèìåð, â êîòîðîì èñïîëüçóåòñÿ ôóíêöèÿ malloc( ), ÷òîáû ñäåëàòü èìåííî ýòî. Êðîìå òîãî, îáðàòèòå âíèìàíèå íà òî, êàê òàêàÿ ïðîãðàììà ïðèìåíÿåò óêàçàòåëè.
/* äîáàâëÿåò ïàìÿòü, åñëè íåîáõîäèìî */
#include <sldio.h>
#define STOP " " /* ñèãíàë ïðåêðàùåíèÿ ââîäà */
#define BLOCK 100 /* áàéòû ïàìÿòè */
#define LIM 40 /* ïðåäåëüíàÿ äëèíà ââîäèìîé ñòðîêè */
#define MAX 50 /* ìàêñèìàëüíîå ÷èñëî ââîäèìûõ ñòðîê */
#define DRAMA 20000 /* áîëüøàÿ çàäåðæêà âðåìåíè */
Main( ).
{
Char store[BLOCK]; /* èñõîäíûé áëîê ïàìÿòè */
Char symph[LIM]; /* ïðèåìíèê ââîäèìûõ ñòðîê */
Char *end; /* óêàçûâàåò íà êîíåö ïàìÿòè */
Char *starts[MAX]; /* óêàçûâàåò íà íà÷àëà ñòðîê */
Int index = 0; /* êîëè÷åñòâî ââîäèìûõ ñòðîê */
Int count; /* ñ÷åò÷èê */
Char *malloc( ); /* ðàñïðåäåëèòåëü ïàìÿòè */
Starts[0] = store;
End = starts[0] + BLOCK - 1;
Puts(" Íàçîâèòå íåñêîëüêî ñèìôîíè÷åñêèõ îðêåñòðîì.");
Puts(" Ââîäèòå ïî îäíîìó: íàæìèòå êëàâèøó [ââîä] â íà÷àëå");
Puts(" ñòðîêè äëÿ çàâåðøåíèÿ âàøåãî ñïèñêà. Õîðîøî, ÿ ãîòîâà." );
While(strcmp(fgets(symph, LIM, stdin), STOP) != 0 && index < MAX).
{ if(strlen(symph) > end - starts[index]).
{ /* äåéñòâèÿ ïðè íåäîñòàòêå ïàìÿòè äëÿ çàïîìèíàíèÿ ââîäèìûõ äàííûõ*/
Puts(" Ïîäîæäèòå ñåêóíäó. ß ïîïðîáóþ íàéòè äîïîëíèòåëüíóþ ïàìÿòü.");
Starts[index] = malloc(BLOCK);
End = starts[index] + BLOCK - 1;
For(count = 0; count < DRAMA; count++);
Puts(" Íàøëà íåìíîãî!" ); }.
Strcpy (starts [index], symph);
Starts[index + 1] = starts[index] + strlen(symph) + 1;
If(++index < MAX).
printf("Ýòî %d. Ïðîäîëæàéòå, åñëè õîòèòå.\n", index); }.
Puts(" Õîðîøî, âîò ÷òî ÿ ïîëó÷èëà:");
For(count = 0; count < index; count ++).
puts(starts[count]);
}
ÐÈÑ. 15.5. Ïðîãðàììà, äîáàâëÿþùàÿ ïàìÿòü ïî òðåáîâàíèþ.
Âîò îáðàçåö ðàáîòû ïðîãðàììû:
Íàçîâèòå íåñêîëüêî ñèìôîíè÷åñêèõ îðêåñòðîâ îðêåñòðîâ.
Ââîäèòå èõ ïî îäíîìó; íàæìèòå êëàâèøó [ââîä] â íà÷àëå.
Ñòðîêè äëÿ çàâåðøåíèÿ íàøåãî ñïèñêà. Õîðîøî, ÿ ãîòîâà.
Ñàí-ôðàíöèñêèé ñèìôîíè÷åñêèé.
Ýòî 1. Ïðîäîëæàéòå, åñëè õîòèòå.
×èêàãñêèé ñèìôîíè÷åñêèé.
Ýòî 2. Ïðîäîëæàéòå, åñëè õîòèòå.
Áåðëèíñêèé ôèëàðìîíè÷åñêèé.
Ýòî 3. Ïðîäîëæàéòå, åñëè õîòèòå.
Ìîñêîâñêèé êàìåðíûé.
Ýòî 4. Ïðîäîëæàéòå, åñëè õîòèòå. Ëîíäîíñêèé ñèìôîíè÷åñêèé.
Ýòî 5. Ïðîäîëæàéòå, åñëè õîòèòå. Âåíñêèé ôèëàðìîíè÷åñêèé.
Ïîäîæäèòå ñåêóíäó. ß ïîïðîáóþ íàéòè äîïîëíèòåëüíóþ ïàìÿòü.
Íàøëà íåìíîãî!
Ýòî 6. Ïðîäîëæàéòå, åñëè õîòèòå.
Ïèòòñáóðãñêèé ñèìôîíè÷åñêèé.
Ýòî 7. Ïðîäîëæàéòå, åñëè õîòèòå.
Õîðîøî, âîò ÷òî ÿ ïîëó÷èëà:
Ñàí-ôðàíöèçêèé ñèìôîíè÷åñêèé.
×èêàãñêèé ñèìôîíè÷åñêèé.
Áåðëèíñêèé ôèëàðìîíè÷åñêèé.
Ìîñêîâñêèé êàìåðíûé.
Ëîíäîíñêèé ñèìôîíè÷åñêèé.
Âåíñêèé ôèëàðìîíè÷åñêèé.
Ïèòòñáóðãñêèé ñèìôîíè÷åñêèé.
Ñíà÷àëà äàâàéòå ïîñìîòðèì, ÷òî äåëàåò ôóíêöèÿ malloc( ). Îíà áåðåò àðãóìåíò â âèäå öåëîãî áåç çíàêà, êîòîðîå ïðåäñòàâëÿåò êîëè÷åñòâî òðåáóåìûõ áàéòîâ ïàìÿòè. Òàê, malloc(BLOCK) òðåáóåò 100 áàéò. Ôóíêöèÿ âîçâðàùàåò óêàçàòåëü íà òèï char â íà÷àëî íîâîãî áëîêà ïàìÿòè. Ìû èñïîëüçîâàëè îïèñàíèå.
Char *malloc( );
×òîáû ïðåäóïðåäèòü êîìïèëÿòîð, ÷òî malloc( ) âîçâðàùàåò óêàçàòåëü íà òèï char. Ïîýòîìó ìû ïðèñâîèëè çíà÷åíèå ýòîãî óêàçàòåëÿ ýëåìåíòó ìàññèâà starts[index] ïðè ïîìîùè îïåðàòîðà.
Starts[index] = malloc(BLOCK);
Õîðîøî, äàâàéòå òåïåðü ðàññìîòðèì ïðîåêò ïðîãðàììû, çàêëþ÷àþùèéñÿ â òîì, ÷òîáû çàïîìíèòü âñå èñõîäíûå ñòðîêè ïîäðÿä â áîëüøîì ìàññèâå store. Ìû õîòèì èñïîëüçîâàòü starts[0] äëÿ ññûëêè íà íà÷àëî ïåðâîé ñòðîêè, starts[l] - âòîðîé ñòðîêè è ò. ä. Íà ïðîìåæóòî÷íîì ýòàïå ïðîãðàììà ââîäèò ñòðîêó â ìàññèâ symph. Ìû èñïîëüçîâàëè fgets( ) âìåñòî gets( ), ÷òîáû îãðàíè÷èòü âõîäíóþ ñòðîêó äëèíîé ìàññèâà symph.

ÐÈÑ. 15.6. Ïîñëåäîâàòåëüíûå ñòðîêè symph, çàïèñàííûå â ìàññèâ store.
Ïðåæäå ÷åì êîïèðîâàòü symph â store, ìû äîëæíû ïðîâåðèòü, äîñòàòî÷íî ëè äëÿ íåå îñòàâøåãîñÿ ìåñòà. Óêàçàòåëü end ññûëàåòñÿ íà êîíåö ïàìÿòè, à òåêóùåå çíà÷åíèå starts[index] ññûëàåòñÿ íà íà÷àëî íåèñïîëüçîâàííîé ïàìÿòè. Òàêèì îáðàçîì, ìû ìîæåì ñðàâíèòü ðàçíèöó ìåæäó ýòèìè äâóìÿ óêàçàòåëÿìè ñ äëèíîé symph è îïðåäåëèòü, äîñòàòî÷íî ëè îñòàëîñü ïàìÿòè.
Åñëè ìåñòà íåäîñòàòî÷íî, âûçûâàåì malloc( ), ÷òîáû ïîäãîòîâèòü äîïîëíèòåëüíóþ ïàìÿòü. Ìû óñòàíàâëèâàåì starts[index] íà íà÷àëî íîâîãî áëîêà ïàìÿòè, a end - íà êîíåö íîâîãî áëîêà. Çàìåòèì, ÷òî ó íàñ íåò èìåíè ýòîé íîâîé ïàìÿòè. Îíà íå ÿâëÿåòñÿ, íàïðèìåð, ðàñøèðåíèåì store. Ó íàñ åñòü òîëüêî îáîçíà÷åíèÿ óêàçàòåëåé, ññûëàþùèõñÿ íà íîâóþ îáëàñòü ïàìÿòè.
Êîãäà ïðîãðàììà ðàáîòàåò, íà êàæäóþ íîâóþ ñòðîêó ññûëàåòñÿ ýëåìåíò ìàññèâà óêàçàòåëåé starts. Íåêîòîðûå ñòðîêè íàõîäÿòñÿ â store, äðóãèå - â îäíîé èëè íåñêîëüêèõ íîâûõ îáëàñòÿõ ïàìÿòè.
Íî ïîêà ó íàñ åñòü óêàçàòåëè, ìû ìîæåì ðàáîòàòü ñî ñòðîêàìè, êàê ïîêàçûâàåò íàì ÷àñòü ïðîãðàììû, âûïîëíÿþùàÿ âûâîä íà ïå÷àòü.
Òàêèì îáðàçîì èñïîëüçóåòñÿ màllîñ( ). Íî ïðåäïîëîæèì, ÷òî âû õîòèòå ðàáîòàòü ñ ïàìÿòüþ òèïà int, à íå char. Ìîæåòå è çäåñü èñïîëüçîâàòü màllîñ( ). Âîò êàê ýòî äåëàåòñÿ:
Char *malloc( ); /* ïî-ïðåæíåìó îïèñûâàåì êàê óêàçàòåëü íà char */
Int *newmem;
Newmem = (int *) malloc(l00); /* èñïîëüçóåì îïåðàöèþ ïðèâåäåíèÿ òèïà */
Ñíîâà òðåáóåòñÿ 100 áàéò. Îïåðàöèÿ ïðèâåäåíèÿ òèïà ïðåîáðàçóåò çíà÷åíèå, âîçâðàùåííîå óêàçàòåëåì íà òèï char, â óêàçàòåëü íà òèï int. Åñëè, êàê â íàøåé ñèñòåìå, int çàíèìàåò äâà áàéòà ïàìÿòè, ýòî çíà÷èò, ÷òî newmem + 1 áóäåò óâåëè÷èâàòü óêàçàòåëü íà äâà áàéòà, ò. å. ïåðåäâèãàòü åãî ê ñëåäóþùåìó öåëîìó. Ýòî òàêæå îçíà÷àåò, ÷òî 100 áàéò ìîæíî èñïîëüçîâàòü äëÿ çàïîìèíàíèÿ 50 öåëûõ ÷èñåë.
Äðóãóþ âîçìîæíîñòü ðàñïðåäåëåíèÿ ïàìÿòè äàåò íàì ïðèìåíåíèå ôóíêöèè ñàllîñ( ):
Char *calloc( );
Long *newmem;
Newmem = (long *) calloc(100, sizeof(long));
Ïîäîáíî malloc( ) ôóíêöèÿ ñàllîñ( ) âîçâðàùàåò óêàçàòåëü íà char. Íóæíî èñïîëüçîâàòü îïåðàòîð ïðèâåäåíèÿ òèïà, åñëè âû õîòèòå çàïîìíèòü äðóãîé òèï. Ýòà íîâàÿ ôóíêöèÿ èìååò äâà àðãóìåíòà, è îáà îíè äîëæíû áûòü öåëûìè áåç çíàêà. Ïåðâûé àðãóìåíò ñîäåðæèò êîëè÷åñòâî òðåáóåìûõ ÿ÷ååê ïàìÿòè. Âòîðîé àðãóìåíò - ðàçìåð êàæäîé ÿ÷åéêè â áàéòàõ.  íàøåì ñëó÷àå long èñïîëüçóåò ÷åòûðå áàéòà, ïîýòîìó îïåðàòîð âûäåëèò 100 ÷åòûðåõáàéòíûõ ýëåìåíòîâ, èñïîëüçóÿ â öåëîì 400 áàéòîâ ïàìÿòè.
Ïðèìåíÿÿ sizeof (long) âìåñòî 4, ìû ñäåëàëè ýòó ïðîãðàììó áîëåå ìîáèëüíîé. Îíà áóäåò ðàáîòàòü íà ñèñòåìàõ, ãäå long èìååò ðàçìåð, îòëè÷íûé îò ÷åòûðåõ.
Ôóíêöèÿ ñàllîñ( ) èìååò åùå îäíó îñîáåííîñòü; îíà îáíóëÿåò ñîäåðæèìîå âñåãî áëîêà.
Âàøà áèáëèîòåêà ÿçûêà Ñè, âåðîÿòíî, ïðåäîñòàâëÿåò íåñêîëüêî äðóãèõ ôóíêöèé óïðàâëåíèÿ ïàìÿòüþ, è âû ìîæåòå çàõîòåòü ïðîâåðèòü èõ.
ÄÐÓÃÈÅ ÁÈÁËÈÎÒÅ×ÍÛÅ ÔÓÍÊÖÈÈ.
Áîëüøèíñòâî áèáëèîòåê áóäóò âûïîëíÿòü è ðÿä äîïîëíèòåëüíûõ ôóíêöèé â òåõ ñëó÷àÿõ, êîòîðûå ìû ðàññìîòðåëè. Êðîìå ôóíêöèé, ðàñïðåäåëÿþùèõ ïàìÿòü, åñòü ôóíêöèè, îñâîáîæäàþùèå ïàìÿòü ïîñëå ðàáîòû ñ íåþ. Ìîãóò áûòü äðóãèå ôóíêöèè, ðàáîòàþùèå ñî ñòðîêàìè, íàïðèìåð òàêèå, êîòîðûå èùóò â ñòðîêå îïðåäåëåííûé ñèìâîë èëè ñî÷åòàíèå ñèìâîëîâ.
Íåêîòîðûå ôóíêöèè, ðàáîòàþùèå ñ ôàéëàìè, âêëþ÷àþò îðån( ), close( ), create( ), fseek( ), read( ) è write( ). Îíè âûïîëíÿþò ïî÷òè òå æå ñàìûå çàäà÷è, ÷òî è ôóíêöèè, êîòîðûå ìû îáñóäèëè, íî íà áîëåå ôóíäàìåíòàëüíîì óðîâíå. Äåéñòâèòåëüíî, ôóíêöèè, ïîäîáíûå fopen( ), îáû÷íî ïèøóòñÿ ñ ïðèìåíåíèåì ýòèõ áîëåå îáùèõ ôóíêöèé. Îíè íåìíîãî áîëåå òðóäíû â èñïîëüçîâàíèè, íî ìîãóò ðàáîòàòü ñ äâîè÷íûìè ôàéëàìè òàê æå, êàê è ñ òåêñòîâûìè.
Âàøà ñèñòåìà ìîæåò èìåòü áèáëèîòåêó ìàòåìàòè÷åñêèõ ôóíêöèé. Îáû÷íî òàêàÿ áèáëèîòåêà áóäåò ñîäåðæàòü ôóíêöèè êâàäðàòíîãî êîðíÿ, ñòåïåííûå, ýêñïîíåíöèàëüíûå, ðàçëè÷íûå òðèãîíîìåòðè÷åñêèå ôóíêöèè è ôóíêöèþ ïîëó÷åíèÿ ñëó÷àéíûõ ÷èñåë.
Âàì íóæíî âðåìÿ, ÷òîáû îñâîèòü òî, ÷òî ïðåäëàãàåò íàøà ñèñòåìà. Åñëè ó íåå íåò òîãî, ÷òî âàì íóæíî, ñîçäàéòå ñâîè ñîáñòâåííûå ôóíêöèè. Ýòî ÷àñòü ÿçûêà Ñè. Åñëè âû ïîëàãàåòå, ÷òî ìîæåòå óëó÷øèòü ðàáîòó, ñêàæåì, ôóíêöèè ââîäà, ñäåëàéòå ýòî! À êîãäà âû óñîâåðøåíñòâóåòå è îòøëèôóåòå ñâîè ìåòîäû ïðîãðàììèðîâàíèÿ, âû ïåðåéäåòå îò îáû÷íîãî ÿçûêà Ñè ê áëåñòÿùåìó ÿçûêó Ñè.
ÇÀÊËÞ×ÅÍÈÅ.
Ìû ïðîøëè äîëãèé ïóòü îò íà÷àëà ýòîãî ðóêîâîäñòâà. Òåïåðü âû óæå ïîçíàêîìèëèñü ñ áîëüøèíñòâîì îñíîâíûõ ñâîéñòâ ÿçûêà Ñè. (Ãëàâíîå èç òîãî ÷òî, ìû îïóñòèëè,- îïåðàöèè ñ ðàçðÿäàìè è ðàñøèðåíèÿ UNIX 7 - ðàññìàòðèâàþòñÿ êðàòêî â ïðèëîæåíèè Á). Âû óçíàëè è èñïîëüçîâàëè âñå èçîáèëèå åãî îïåðàòîðîâ, îãðîìíîå ðàçíîîáðàçèå îñíîâíûõ è ïðîèçâîäíûõ òèïîâ äàííûõ, åãî "óìíûå" óïðàâëÿþùèå êîíñòðóêöèè è ìîùíóþ ñèñòåìó óêàçàòåëåé. Ìû íàäååìñÿ, ÷òî ïîäãîòîâèëè âàñ ê èñïîëüçîâàíèþ ÿçûêà Ñè â âàøèõ ñîáñòâåííûõ öåëÿõ. Ïîýòîìó íà÷èíàéòå ïðîãðàììèðîâàòü, è óäà÷è âàì!
×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
×òî òàêîå áèáëèîòåêà ÿçûêà Ñè è êàê åå èñïîëüçîâàòü.
Êàê îòêðûâàòü è çàêðûâàòü òåêñòîâûå ôàéëû: fopen( ) è fclose( ).
×òî òàêîå òèï FILE.
Êàê ÷èòàòü èç ôàéëà è çàïèñûâàòü â ôàéë: getc( ), putc( ), fgets( ), fputs( ), fscanf( ), fprintf( ).
Êàê ïðîâåðÿòü êëàññû ñèìâîëîâ: isdigit( ), isalpha( ) è ò. ä.
Êàê ïðåâðàùàòü ñòðîêè â ÷èñëà: atoi( ) è atof( ).
Êàê îñóùåñòâëÿòü áûñòðûé âûõîä: exit( ).
Êàê ðàñïðåäåëÿòü ïàìÿòü: malloc( ), ñàllîñ( )
ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
Âîïðîñû.
1. ×òî íåïðàâèëüíî â ýòîé ïðîãðàììå?
Main( ).
{ int *fp;
Int k;
Fp = fopen("æåëå");
For(k = 0; k < 30; k++).
Fputs(fp, "Íàíåòòà åñò æåëå.");
Fclose("æåëå");
}
2. ×òî áóäåò äåëàòü ñëåäóþùàÿ ïðîãðàììà?
#include <stdio.h>
#include <ctype.h>
Main(argc, argv).
Int argc;
Char *argv[ ];
{ int ch;
FILE *fp;
If((fp=fopen(argv[1], "r")) == NULL).
Exit(1);
While((ch=getc(fp)) != EOF).
if(isdigit(ch)).
putchar(ch);
Fclose (fp);
}
3. Âñå ëè ïðàâèëüíî â âûðàæåíèè isalpha(c[i]), ãäå ñ ÿâëÿåòñÿ ìàññèâîì òèïà char. ×òî ìîæíî ñêàçàòü î isalpha(c[i ++])?
4.Èñïîëüçóéòå ôóíêöèè êëàññèôèêàöèè ñèìâîëå" äëÿ ïîäãîòîâêè âûïîëíåííèÿ atoi( ).
5. Êàê âû ìîãëè áû ðàñïðåäåëèòü, ïàìÿòü äëÿ ðàçìåùåíèÿ ìàññèâà ñòðóêòóð?
Îòâåòû.
1. Äîëæíà áûòü äèðåêòèâà #include <stdio.h> äëÿ îïðåäåëåíèÿ åå ôàéëîâ. Ñëåäóåò îïèñàòü óêàçàòåëü fp ôàéëà: FILE *fp; ôóíêöèÿ fopen( ) äîëæíà èìåòü âèä fopen("æåëå", "w"), èëè, ìîæåò áûòü, âêëþ÷àòü "à" . Ïîðÿäîê àðãóìåíòîâ â fputs( ) äîëæåí áûòü îáðàòíûì. Ôóíêöèÿ fclose( ) òðåáóåò óêàçàòåëÿ ôàéëà, à íå èìåíè ôàéëà: fclose(fp).
2. Îíà áóäåò îòêðûâàòü ôàéë, çàäàííûé êàê àðãóìåíò êîìàíäíîé ñòðîêè, è âûâî äèòü íà ïå÷àòü âñå öèôðû â ôàéëå. Ïðîãðàììà äîëæíà ïðîâåðÿòü (íî íå äåëàåò ýòîãî), íå àðãóìåíò ëè ýòî êîìàíäíîé ñòðîêè.
3. Ïåðâîå âûðàæåíèå ïðàâèëüíî, òàê êàê ñ[i] èìååò çíà÷åíèå òèïà char. Âòîðîå âûðàæåíèå íå âûâîäèò êîìïüþòåð èç ñòðîÿ, íî ìîæåò äàâàòü íåïðåäñêàçóåìûé ðåçóëüòàò. Ïðè÷èíà â òîì, ÷òî isalpha( ) ÿâëÿåòñÿ ìàêðîîïðåäåëåíèåì, ó êîòîðîãî, ïî âñåé âåðîÿòíîñòè, àðãóìåíò ïîÿâëÿåòñÿ äâàæäû â îïðåäåëÿþùåì âûðàæåíèè (ïðîâåðêà íà ïðèíàäëåæíîñòü ê ðåãèñòðó ñòðî÷íûõ áóêâ, à çà÷åì - ïðîïèñíûõ áóêâ) è ýòî äàåò â ðåçóëüòàòå äâà óâåëè÷åíèÿ i. Ëó÷øå âñåãî èçáåãàòü èñïîëüçîâàíèÿ îïåðàòîðà óâåëè÷åíèÿ â àðãóìåíòå ìàêðîôóíêöèè.
4.
#include <stdio.h>
#include <ctype.h>
#define issign(c) (((c) == '-' || (c) == '+') ? (1) : (0)) atoi(s);
Char *s;
{
Int i = 0;
Int n, sign;
While(isspace(s[i])).
I ++; /* ïðîïóñê ïóñòîãî ñèìâîëà */
Sign = 1;
If(issign(s[i])) /* óñòàíîâêà íåîáÿçàòåëüíîãî çíàêà */
Sign = (s[i++] == '+') ? 1 : -1;
For(n = 0; isdigit(s[i]); i++).
n = 10*n + s[i] - '0';
Return(sign * n);
}
5. Ïðåäïîëîæèì, ÷òî wine ÿâëÿåòñÿ èìåíåì ñòðóêòóðû. Ýòè îïåðàòîðû, íàäëåæàùèì îáðàçîì ðàñïîëîæåííûå â ïðîãðàììå, áóäóò âûïîëíÿòü äàííóþ ðàáîòó.
Struct wine *ptrwine;
Char *calloc( );
Ptrwine = (struc wine *) calloc(100, sizcof(struct wine));
ÓÏÐÀÆÍÅÍÈß.
1. Íàïèøèòå ïðîãðàììó êîïèðîâàíèÿ ôàéëà, êîòîðàÿ èñïîëüçóåò èìåíà èñõîäíîãî ôàéëà ôàéëà è êîïèðóåìîãî ôàéëà êàê àðãóìåíòû êîìàíäíîé ñòðîêè.
2. Íàïèøèòå ïðîãðàììó, êîòîðàÿ áóäåò ïðèíèìàòü âñå ôàéëû, çàäàííûå ðàäîì àðãóìåíòîâ êîìàíäíîé ñòðîêè, è ïå÷àòàòü èõ îäèí çà äðóãèì. Èñïîëüçóéòå argc äëÿ ñîçäàíèÿ öèêëà.
3. Ìîäèôèöèðóéòå âàøó ïðîãðàììó èíâåíòàðèçàöèè êíèã â ãë. 14 òàê, ÷òîáû èíôîðìàöèÿ, êîòîðóþ âû ââîäèòå, äîáàâëÿëàñü â ôàéë, íàçâàííûé mybooks.
4. Èñïîëüçóéòå gets( ) è atoi( ) äëÿ ñîçäàíèÿ ôóíêöèè, ýêâèâàëåíòíîé íàøåé getint( ) â ãë. 10.
5. Ïåðåïèøèòå íàøó ïðîãðàììó èç ãë. 7, ñ÷èòàþùóþ ñëîâà, èñïîëüçóÿ ìàêðîîïðåäåëåíèÿ ctype.h è àðãóìåíò êîìàíäíîé ñòðîêè äëÿ îáðàáîòêè ôàéëà.
Ïðèëîæåíèÿ.
ÏÐÈËÎÆÅÍÈÅ À. ÄÎÏÎËÍÈÒÅËÜÍÀß ËÈÒÅÐÀÒÓÐÀ.
Åñëè âû õîòèòå áîëüøå óçíàòü î ÿçûêå Ñè è âîîáùå î ïðîãðàììèðîâàíèè, òî íàéäåòå ïîëåçíîé ñëåäóþùóþ ëèòåðàòóðó:
ßçûêÑè.
Kernighan Brian W. and Ritchie Dennis M., The ÑÐrîgràmming Language, Prentice-Hall, 1978. (Èìååòñÿ ïåðåâîä: ÊÅÐÍÈÃÀÍ Á., Ðèò÷è Ä. ßçûê ïðîãðàììèðîâàíèÿ Ñè.- M.: Ôèíàíñû è ñòàòèñòèêà, 1985.).
Ïåðâàÿ è íàèáîëåå àâòîðèòåòíàÿ êíèãà ïî ÿçûêó Ñè. (Çàìåòèì. ÷òî îäèí èç àâòîðîâ ýòîé êíèãè Äåííèñ Ðèò÷è - ñîçäàòåëü ÿçûêà Ñè.) Ïðàêòè÷åñêè îíà ÿâëÿåòñÿ îôèöèàëüíûì îïèñàíèåì ÿçûêà è âêëþ÷àåò ìíîãî èíòåðåñíûõ ïðèìåðîâ. Îäíàêî àâòîðû ïðåäïîëàãàþò, ÷òî ÷èòàòåëü çíàêîì ñ ñèñòåìíûì ïðîãðàììèðîâàíèåì.
Feuer Alan R., The Ñ Puzzle Hook, Prentice-Hall, 1982. (Èìååòñÿ ïåðåâîä: Ôüþýð À. Çàäà÷è ïî ÿçûêó Ñè.- M.: Ôèíàíñû è ñòàòèñòèêà, 1985.).
Êíèãà ñîäåðæèò áîëüøîå êîëè÷åñòâî ïðîãðàìì, ðåçóëüòàò ðàáîòû êîòîðûõ âû ìîæåòå ïðåäñêàçàòü. Îíà äàåò õîðîøóþ âîçìîæíîñòü ïðîâåðèòü è ðàñøèðèòü âàøè çíàíèÿ î ÿçûêå Ñè. Êíèãà âêëþ÷àåò îòâåòû è ïîÿñíåíèÿ.
Ritchie D. M., Johnson S. Ñ., Lesk M. E., and Kernighan Â. W., The ÑÐrîgràmming Language, The Bell System Technical Journal, Vol. 57, No. 6, July-August 1978.
 ñòàòüå îáñóæäàåòñÿ èñòîðèÿ ñîçäàíèÿ ÿçûêà Ñè è äàåòñÿ îáçîð îñîáåííîñòåé ïðîãðàììèðîâàíèÿ ñ èñïîëüçîâàíèåì ýòîãî ÿçûêà.
BYTE, Vol. 8, No. 8, August 1983.
Ýòîò âûïóñê æóðíàëà "Áàéò" ïîñâÿùåí ÿçûêó Ñè. Îí ñîäåðæèò ñòàòüè, ãäå îáñóæäàþòñÿ èñòîðèÿ åãî ñîçäàíèÿ, êîíöåïöèè è ïðèìåíåíèÿ. Ïðîâåðÿþòñÿ è îöåíèâàþòñÿ äâåíàäöàòü êîìïèëÿòîðîâ ÿçûêà Ñè äëÿ ìèêðîïðîöåññîðîâ. Âêëþ÷åíà òàêæå îáøèðíàÿ ñîâðåìåííàÿ áèáëèîãðàôèÿ êíèã è ñòàòåé ïî ÿçûêó Ñè. Êàæäàÿ êíèãà è ñòàòüÿ âêëþ÷àåò êðàòêîå ñîäåðæàíèå.
Ïðîãðàììèðîâàíèå.
Kernighan Brian W. and Plauger P. J., The Elements of Programming Style (Second Edition), McGraw-HiII, 1978.
 ýòîì ñòðîéíîì êëàññè÷åñêîì ïðîèçâåäåíèè èñïîëüçóþòñÿ ïðèìåðû, âçÿòûå èç äðóãèõ êíèã, äëÿ èëëþñòðàöèè òîãî, ÷òî íóæíî è ÷òî íå íóæíî äåëàòü äëÿ îäíîçíà÷íîãî è ðåçóëüòàòèâíîãî ïðîãðàììèðîâàíèÿ.
Kernighan Brian V. and Plauger P. J., Software Tools, Addison-Wesley, 1976.
 êíèãå îïèñûâàåòñÿ íåñêîëüêî ïîëåçíûõ ïðîãðàìì è ïðîãðàììíûõ ñèñòåì, ïðè÷åì äåëàåòñÿ óïîð íà ýôôåêòèâíîå ïðîåêòèðîâàíèå ñòðóêòóð ïðîãðàìì. Ïðåäñòàâëåíû îïèñàíèÿ ÿçûêà RATFOR (ðàöèîíàëèçèðîâàííîãî Ôîðòðàíà) è îäíîé èç âåðñèé Ïàñêàëÿ. Òàê êàê ñîçäàíèå ÿçûêà RATFOR - ýòî ïîïûòêà ñäåëàòü ñõîäíîé ðàáîòó ÿçûêîâ Ôîðòðàí è Ñè, îí ëó÷øå âñåãî ïîäõîäèò ïîëüçîâàòåëÿì ÿçûêà êàê äëÿ çíàêîìñòâà ñ íèì.
Îïåðàöèîííàÿ ñèñòåìà UNIX.
Waite Mitchell, Martin Don and Praia Stephen , UNIX Primer Plus, Howard W. Sams and Company, Inc., 1983.
Ýòà êíèãà - ëåãêî ÷èòàåìîå ââåäåíèå â îïåðàöèîííóþ ñèñòåìó UNIX.  íåå âêëþ÷åíû íåêîòîðûå ìîùíûå ðàñøèðåíèÿ ýòîé ñèñòåìû, ðåàëèçîâàííûå â Êàëèôîðíèéñêîì óíèâåðñèòåòå (Áåðêëè).
ÏÐÈËÎÆÅÍÈÅ Á. ÊËÞ×ÅÂÛÅ ÑËÎÂÀ ßÇÛÊÀ ÑÈ.
Êëþ÷åâûå ñëîâà â ÿçûêå ÿâëÿþòñÿ ñëîâàìè, âûðàæàþùèìè äåéñòâèÿ ýòîãî ÿçûêà. Êëþ÷åâûå ñëîâà ÿçûêà Ñè çàðåçåðâèðîâàíû, ò. å. âû íå ìîæåòå èñïîëüçîâàòü èõ äëÿ äðóãèõ öåëåé, òàêèõ êàê çàäàíèå èìåíè ïåðåìåííîé.
Êëþ÷åâûå ñëîâà âûïîëíåíèÿ ïðîãðàììû.
Öèêëû.
For while do.
Ïðèíÿòèå ðåøåíèÿ è âûáîð.
If else switch case default.
Ïåðåõîäû.
Break continue goto.
Òèïû äàííûõ.
Char int short long unsigned float double struct union typedef.
Êëàññû ïàìÿòè.
Auto extern register static.
Ðàçíîå.
Return sizeof.
Åùå íå ðåàëèçîâàííîå.
Entry.
Ïðèìåíÿåìûå òîëüêî â íåêîòîðûõ ñèñòåìàõ.
Asm endasm fortran enum.
ÏÐÈËÎÆÅÍÈÅ Â. ÎÏÅÐÀÖÈÈ ßÇÛÊÀ ÑÈ.
 ÿçûêå Ñè ïðåäóñìîòðåíî ìíîæåñòâî îïåðàöèé. Çàòåì ìû ïðèâîäèì çäåñü òàáëèöó îïåðàöèé, ðàñïîëàãàÿ èõ ïî ïðèîðèòåòàì è ïîêàçûâàÿ ïîðÿäîê âûïîëíåíèÿ. Ìû ðàññêàçûâàåì î âñåõ îïåðàöèÿõ, çà èñêëþ÷åíèåì ïîðàçðÿäíûõ, êîòîðûå áóäóò ðàññìîòðåíû â ïðèëîæåíèè Å.
I. Àðèôìåòè÷åñêèå îïåðàöèè.
| + | Ïðèáàâëÿåò âåëè÷èíó, íàõîäÿùóþñÿ ñïðàâà, ê âåëè÷èíå, ñòîÿùåé ñëåâà |
| - | Âû÷èòàåò âåëè÷èíó, ñòîÿùóþ ñïðàâà, èç âåëè÷èíû, óêàçàííîé ñëåâà |
| - | Áóäó÷è óíàðíîé îïåðàöèåé, èçìåíÿåò çíàê âåëè÷èíû, ñòîÿùåé ñïðàâà |
| * | Óìíîæàåò âåëè÷èíó ñïðàâà íà âåëè÷èíó, íàõîäÿùóþñÿ ñëåâà |
| / | Äåëèò âåëè÷èíó, ñòîÿùóþ ñëåâà, íà âåëè÷èíó ñïðàâà. Ðåçóëüòàò óñåêàåòñÿ, åñëè îáà îïåðàíäà öåëûå ÷èñëà |
| % | Äàåò îñòàòîê îò äåëåíèÿ âåëè÷èíû ñëåâà íà âåëè÷èíó, ñòîÿùóþ ñïðàâà (òîëüêî äëÿ öåëûõ ÷èñåë) |
| ++ | Ïðèáàâëÿåò 1 ê çíà÷åíèþ ïåðåìåííîé, ñòîÿøåé ñëåâà (ïðåôèêíàÿ ôîðìà), èëè ê ïåðåìåííîé, ñòîÿøåé ñïðàâà (ïîñòôèêñíàÿ ôîðìà) |
| -- | Àíàëîãè÷íî ++, íî âû÷èòàåò 1 |
| Îïåðàöèè (îò âûñøåãî ïðèîðèòåòà ê íèçøåìó) | Ïîðÿäîê âûïîëíåíèÿ |
|---|---|
| () {} -> . | Ë-Ï |
| ! ~ ++ -- - (òèï) * & sizeof (âñå óíàðíûå) | Ï-Ë |
| * / % | Ë-Ï |
| + - | Ë-Ï |
| << >> | Ë-Ï |
| < <= > >= | Ë-Ï |
| == !== | Ë-Ï |
| & | Ë-Ï |
| /\ | Ë-Ï |
| | | Ë-Ï |
| && | Ë-Ï |
| || | Ë-Ï |
| ?: | Ë-Ï |
| = += -= *= /* %= | Ï-Ë |
| , | Ë-Ï |
| Óñëîâíûå îáîçíà÷åíèÿ: Ë-Ï - ïîðÿäîê âûïîëíåíèÿ ñëåâà íàïðàâî, à Ï-Ë - íàîáîðîò. |
II. Îïåðàöèè ïðèñâàèâàíèÿ.
= Ïðèñâàèâàåò çíà÷åíèå, óêàçàííîå ñïðàâà, ïåðåìåííîé, ñòîÿùåé ñëåâà.
Êàæäàÿ èç ïðèâîäèìûõ íèæå îïåðàöèè èçìåíÿåò ïåðåìåííóþ, ñòîÿùóþ ñëåâà, íà âåëè÷èíó, íàõîäÿùóþñÿ ñïðàâà. Ìû èñïîëüçóåì ñëåäóþùèå îáîçíà÷åíèÿ: Ï äëÿ ïðàâîé ÷àñòè è Ë äëÿ ëåâîé. + = ïðèáàâëÿåò âåëè÷èíó Ï ê ïåðåìåííîé Ë.
| -= | âû÷èòàåò âåëè÷èíó Ï èç ïåðåìåííîé Ë |
| *= | óìíîæàåò ïåðåìåííóþ Ë íà âåëè÷èíó Ï |
| /= | äåëèò ïåðåìåííóþ Ë íà âåëè÷èíó Ï |
| %= | âûäàåò îñòàòîê îò äåëåíèÿ ïåðåìåííîé Ë íà âåëè÷èíó Ï |
Ïðèìåð:
Rabbits *= 1.6; òî æå ñàìîå, ÷òî rabbits = rabbits * 1.6;
III. Îïåðàöèè îòíîøåíèÿ.
Êàæäàÿ èç ýòèõ îïåðàöèé ñðàâíèâàåò çíà÷åíèå ñëåâà ñî çíà÷åíèåì ñïðàâà. Îïåðàòîð îòíîøåíèÿ, ñîñòîÿùèé èç îïåðàöèè è äâóõ åå îïåðàíäîâ, èìååò çíà÷åíèå 1, åñëè âûðàæåíèå èñòèííî, è çíà÷åíèå 0, åñëè âûðàæåíèå ëîæíî.
| < | ìåíüøå |
| <= | ìåíüøå èëè ðàâíî |
| == | ðàâíî |
| >= | áîëüøå èëè ðàâíî |
| > | áîëüøå |
| != | íå ðàâíî |
IV. Ëîãè÷åñêèå îïåðàöèè.
Îáû÷íî ëîãè÷åñêèå îïåðàöèè "ñ÷èòàþò" óñëîâíûå âûðàæåíèÿ îïåðàíäàìè. Îïåðàöèÿ ! èìååò îäèí îïåðàíä, ðàñïîëîæåííûé ñïðàâà. Îñòàëüíûå îïåðàöèè èìåþò äâà îïåðàíäà: îäèí ñëåâà è îäèí ñïðàâà.
| && | Ëîãè÷åñêîå È: ðåçóëüòàò îïåðàöèè èìååò çíà÷åíèå "èñòèíà", åñëè îáà îïåðàíäà èñòèííû, è "ëîæü" â ïðîòèâíîì ñëó÷àå. |
| || | Ëîãè÷åñêîå ÈËÈ: ðåçóëüòàò îïåðàöèè èìååò çíà÷åíèå "èñòèíà", åñëè îäèí èëè îáà îïåðàíäà èñòèííû, è "ëîæü" â ïðîòèâíîì ñëó÷àå. |
| ! | Ëîãè÷åñêîå ÍÅ: ðåçóëüòàò èìååò çíà÷åíèå "èñòèíà", åñëè îïåðàíä èìååò çíà÷åíèå "ëîæü", è íàîáîðîò. |
V. Îïåðàöèè íàä óêàçàòåëÿìè.
| & | Îïåðàöèÿ ïîëó÷åíèÿ àäðåñà: âûäàñò àäðåñ ïåðåìåííîé, èìÿ êîòîðîé ñòîèò çà îáîçíà÷åíèåì îïåðàöèè: &nurse ÿâëÿåòñÿ àäðåñîì ïåðåìåííîé nurse |
| * | Êîñâåííàÿ àäðåñàöèÿ: âûäàåò çíà÷åíèå, çàïèñàííîå ïî àäðåñó, íà êîòîðûé ññûëàåòñÿ óêàçàòåëü: |
Nurse = 22;
Ptr = &nurse; /* óêàçàòåëü íà nurse */
Val = *ptr.
 ðåçóëüòàòå ðàáîòû ýòèõ îïåðàòîðîâ ïåðåìåííîé val ïðèñâàèâàåòñÿ çíà÷åíèå 22.
VI. Îïåðàöèè íàä ñòðóêòóðàìè è îáúåäèíåíèÿìè.
| . | Îïåðàöèÿ ïðèíàäëåæíîñòè (òî÷êà) èñïîëüçóåòñÿ ñîâìåñòíî ñ èìåíåì ñòðóêòóðû (èëè îáúåäèíåíèÿ) äëÿ çàäàíèÿ ýëåìåíòà ýòîé ñòðóêòóðû (èäè îáúåäèíåíèÿ). Åñëè name ÿâëÿåòñÿ èìåíåì ñòðóêòóðû, à member - ýëåìåíòîì, óêàçàííûì â ñòðóêòóðíîì øàáëîíå, òî name.member îïðåäåëÿåò ýòîò ýëåìåíò ñòðóêòóðû. Îïåðàöèþ ïðèíàäëåæíîñòè ìîæíî àíàëîãè÷íûì îáðàçîì ïðèìåíÿòü è ê îáúåäèíåíèÿì. |
Ïðèìåð:
Struct {
int code;
float cost;
} item;
Item.code = 1265;
Âûïîëíÿåòñÿ ïðèñâàèâàíèå çíà÷åíèÿ ýëåìåíòó code ñòðóêòóðû item.
| -> | Êîñâåííàÿ àäðåñàöèÿ (îïðåäåëåíèå ïðèíàäëåæíîñòè) ýëåìåíòà èñïîëüçóåòñÿ ñîâìåñòíî ñ óêàçàòåëåì íà ñòðóêòóðó (èëè îáúåäèíåíèå) äëÿ èäåíòèôèêàöèè òîãî èëè èíîãî ýëåìåíòà ýòèõ ñòðóêòóð (èëè îáúåäèíåíèÿ). Ïðåäïîëîæèì, ÷òî ptrstr ÿâëÿåòñÿ óêàçàòåëåì íà ñòðóêòóðó, a member - ýëåìåíòîì, óêàçàííûì â ñòðóêòóðíîì øàáëîíå. Òîãäà ptrstr -> member îïðåäåëÿåò, ÷òî ýòî ýëåìåíò ñòðóêòóðû, íà êîòîðóþ ññûëàåòñÿ óêàçàòåëü. Îïåðàöèþ êîñâåííîé àäðåñàöèè ýëåìåíòà ìîæíî ïðèìåíÿòü àíàëîãè÷íûì îáðàçîì è ê îáúåäèíåíèÿì. |
Ïðèìåð:
Struct {
int code;
float cost;
} item, *ptrst;
Ptrst = &item;
Ptrst-> code = 3451;
Ýòè îïåðàòîðû ïðèñâàèâàþò çíà÷åíèå ýëåìåíòó code ñòðóêòóðû item. Ñëåäóþùèå òðè âûðàæåíèÿ ýêâèâàëåíòíû:
Ptrst -> code
Item.code
(*ptrst).code.
VII. Äîïîëíèòåëüíûå îïåðàöèè.
| sizeof | Âûäàåò ðàçìåð (â áàéòàõ) îïåðàíäà, ñòîÿùåãî ñïðàâà. Îïåðàíäîì ìîæåò áûòü îáîçíà÷åíèå òèïà, çàêëþ÷åííîå â ñêîáêè, êàê, íàïðèìåð, â sizeof(float), ëèáî èìÿ êîíêðåòíîé ïåðåìåííîé èëè îïðåäåëåííîãî ìàññèâà è ò. ä., êàê, íàïðèìåð, â sizeof foo. |
| (type) | Îïåðàöèÿ ïðèâåäåíèÿ òèïà: ïðåâðàùàåò ñëåäóþùåå çà íåé çíà÷åíèå â òèï, îïðåäåëåííûé êëþ÷åâûì ñëîâîì (èëè ñëîâàìè), çàêëþ÷åííûì â ñêîáêè. Íàïðèìåð, (float)9 ïðåâðàùàåò öåëîå 9 â ÷èñëî ñ ïëàâàþùåé òî÷êîé 9.0. Îïåðàöèÿ "çàïÿòàÿ" ñâÿçûâàåò äâà âûðàæåíèÿ â îäíî è ãàðàíòèðóåò, ÷òî ëåâîå âûðàæåíèå áóäåò âû÷èñëåíî ïåðâûì. Òèïè÷íûì ïðèìåðîì èñïîëüçîâàíèÿ ÿâëÿåòñÿ âêëþ÷åíèå äîïîëíèòåëüíîé èíôîðìàöèè â óïðàâëÿþùåå âûðàæåíèå öèêëà for:for(step = 2, fargo = 0; fargo < 1000; step *= 2) fargo + = step; |
| ?: | Îïåðàöèÿ óñëîâèÿ èìååò òðè îïåðàíäà, êàæäûé èç êîòîðûõ ÿâëÿåòñÿ âûðàæåíèåì. Îíè ðàñïîëîæåíû ñëåäóþùèì îáðàçîì:âûðàæåíèå1 ? âûðàæåíèå2 : âûðàæåíèå3. Çíà÷åíèå âñåãî âûðàæåíèÿ ðàâíî çíà÷åíèþ âûðàæåíèÿ2, åñëè âûðàæåíèå1 èñòèííî, è çíà÷åíèþ âûðàæåíèÿ3 â ïðîòèâíîì ñëó÷àå. |
Ïðèìåðû:
(5 > 3) ? 1 : 2 èìååò çíà÷åíèå 1.
(3 > 5) ? 1 : 2 èìååò çíà÷åíèå 2.
(a > b) ? à : b èìååò çíà÷åíèå áîëüøåãî à è b.
ÏÐÈËÎÆÅÍÈÅ Ã. ÒÈÏÛ ÄÀÍÍÛÕ È ÊËÀÑÑÛ ÏÀÌßÒÈ
Îñíîâíûå òèïû äàííûõ.
Êëþ÷åâûå ñëîâà: Îñíîâíûå òèïû äàííûõ îïðåäåëÿþòñÿ ñ ïîìîùüþ ñëåäóþùèõ ñåìè êëþ÷åâûõ ñëîâ: int, long, short, unsigned, char, float, double
Öåëûå ñî çíàêîì: Ìîãóò èìåòü ïîëîæèòåëüíûå è îòðèöàòåëüíûå çíà÷åíèÿ.
Int: îñíîâíîé òèï öåëûõ ÷èñåë äëÿ êîíêðåòíîé ñèñòåìû.
Long èëè long int: ìîãóò èìåòü öåëîå êàê ìèíèìóì òàêîãî æå ðàçìåðà, êàê ñàìîå áîëüøîå int è, âîçìîæíî, áîëüøå.
Short èëè short int: ñàìîå áîëüøîå öåëîå òèïà short íå áîëüøå ñàìîãî áîëüøîãî int, à âîçìîæíî, è ìåíüøå. Îáû÷íî long äîëæíî áûòü áîëüøå short, a int äîëæíî áûòü òàêèì æå, êàê îäíî èç íèõ. Íàïðèìåð, âåðñèÿ ÿçûêà Ñè Lattice Ñ äëÿ êîìïüþòåðà IBM PC èìååò 16-ðàçðÿäíûå öåëûå òèïà short è int è 32-ðàçðÿäíûå long. Âñå ýòî çàâèñèò îò èñïîëüçóåìîé ñèñòåìû.
Öåëûå áåç çíàêà: èìåþò òîëüêî íóëåâûå è ïîëîæèòåëüíûå çíà÷åíèÿ. Îíè íå ìîãóò áûòü áîëüøå ñàìîãî áîëüøîãî âîçìîæíîãî ïîëîæèòåëüíîãî ÷èñëà.
Êëþ÷åâîå ñëîâî: unsigned èñïîëüçóåòñÿ ïåðåä îáîçíà÷åíèåì òèïà: unsigned int, unsigned long, unsigned short.
Îòäåëüíî ñòîÿùåå unsigned îáîçíà÷àåò òî æå ñàìîå, ÷òî è unsigned int.
Ñèìâîëû: ýòî òèïîãðàôñêèå çíàêè, òàêèå, êàê À, & è +.
Îáû÷íî êàæäûé èç íèõ çàíèìàåò â ïàìÿòè òîëüêî îäèí áàéò.
Char: êëþ÷åâîå ñëîâî äëÿ ýòîãî òèïà.
×èñëà ñ ïëàâàþùåé òî÷êîé: îíè ìîãóò èìåòü ïîëîæèòåëüíûå è îòðèöàòåëüíûå çíà÷åíèÿ.
Float: îñíîâíîé (äëÿ èñïîëüçóåìîé ñèñòåìû) ðàçìåð ÷èñåë ñ ïëàâàþùåé òî÷êîé.
Double èëè long float: áîëüøèé (âîçìîæíî) ýëåìåíò äëÿ ðàçìåùåíèÿ ÷èñåë ñ ïëàâàþùåé òî÷êîé. Ñ åãî ïîìîùüþ â ïðèíöèïå ìîæíî èñïîëüçîâàòü áîëüøå çíà÷àùèõ öèôð è, âîçìîæíî, áîëüøèé ïîðÿäîê.
Êàê îïèñàòü ïðîñòóþ ïåðåìåííóþ:
1. Âûáåðèòå íåîáõîäèìûé òèï.
2. Âûáåðèòå èìÿ äëÿ ïåðåìåííîé.
3. Èñïîëüçóéòå ñëåäóþùèé ôîðìàò äëÿ îïåðàòîðà îïèñàíèÿ:
îáèçíà÷åíèå-òèïà èìÿ-ïåðåìåííîé;
Îáîçíà÷åíèå-òèïà ñîñòîèò èç îäíîãî èëè áîëåå êëþ÷åâûõ ñëîâ òèïà. Âîò íåñêîëüêî ïðèìåðîâ:
Int erest;unsigned short cash;
4. Ìîæíî îïèñàòü áîëåå ÷åì îäíó ïåðåìåííóþ îäíîãî è òîãî æå òèïà, ðàçäåëèâ èìåíà ïåðåìåííûõ çàïÿòûìè:
Char ch, init, ans;
5. Ìîæíî èíèöèàëèçèðîâàòü òó èëè èíóþ ïåðåìåííóþ â îïåðàòîðå îïèñàíèÿ:
Float mass = 6.0E24;
Êëàññû ïàìÿòè.
I.Êëþ÷åâûå ñëîâà:
Auto, external, static, register.
II. Îñíîâíûå çàìå÷àíèÿ
Êëàññ ïàìÿòè ïåðåìåííîé îïðåäåëÿåò îáëàñòü åå äåéñòâèÿ è ïðîäîëæèòåëüíîñòü èñïîëüçîâàíèÿ. Êëàññ ïàìÿòè îïðåäåëÿåòñÿ ìåñòîì çàäàíèÿ ïåðåìåííîé è ñîîòâåòñòâóþùèì êëþ÷åâûì ñëîâîì. Ïåðåìåííûå, îïðåäåëåííûå âíå ôóíêöèè, ÿâëÿþòñÿ âíåøíèìè è èìåþò ãëîáàëüíóþ îáëàñòü äåéñòâèÿ. Ïåðåìåííûå, îïèñàííûå âíóòðè ôóíêöèè, ÿâëÿþòñÿ àâòîìàòè÷åñêèìè è ëîêàëüíûìè, åñëè íå èñïîëüçóåòñÿ êàêîå-ëèáî äðóãîå êëþ÷åâîå ñëîâî. Âíåøíèå ïåðåìåííûå, îïðåäåëåííûå ðàíüøå ôóíêöèè, "èçâåñòíû" åé, äàæå åñëè îíè íå îïèñàíû âíóòðè åå.
III. Ñâîéñòâà
Êëàññû, ïåðå÷èñëåííûå âûøå ïóíêòèðíîé ëèíèè, îïèñûâàþòñÿ âíóòðè ôóíêöèè.
Êëàññû, ïåðå÷èñëåííûå íèæå ýòîé ëèíèè, îïðåäåëÿþòñÿ âíå ôóíêöèè.
| Êëàññ ïàìÿòè | Êëþ÷åâîå ñëîâî | Ïðîäîëæèòåëüíîñòü | Îáëàñòü äåèñòâèÿ |
|---|---|---|---|
| Àâòîìàòè÷åñêèé | auto | Âðåìåííî | Ëîêàëüíàÿ |
| Ñòàòè÷åñêèé | static | Ïîñòîÿííî | Ëîêàëüíàÿ |
| Âíåøíÿÿ | extern | Ïîñòîÿííî | Ãëîáàëüíàÿ (âñå ôàéëû) |
| Âíåøíÿÿ ñòàòè÷åñêàÿ | static | Ïîñòîÿííî | Ãëîáàëüíàÿ (îäèí ôàéë) |
ÏÐÈËÎÆÅÍÈÅ Ä. ÓÏÐÀÂËÅÍÈÅ ÕÎÄÎÌ ÂÛÏÎËÍÅÍÈß ÏÐÎÃÐÀÌÌÛ.
ßçûê Ñè èìååò íåñêîëüêî êîíñòðóêöèé, ïðåäíàçíà÷åííûõ äëÿ óïðàâëåíèÿ âûïîëíåíèåì ïðîãðàììû. Çäåñü ìû êðàòêî îïèñûâàåì îïåðàòîðû öèêëîâ (while, for è do while), âåòâëåíèé (if, if else è switch) è ïåðåõîäîâ (goto, break è continue).
Îïåðàòîð while.
Êëþ÷åâîå ñëîâî: while.
Îáùèå çàìå÷àíèÿ:
Îïåðàòîð while ñîçäàåò öèêë, êîòîðûé ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà ïðîâåðÿåìîå âûðàæåíèå íå ñòàíåò ëîæíûì, èëè íóëåì. Îïåðàòîð while ÿâëÿåòñÿ öèêëîì ñ ïðåäóñëîâèåì, ðåøåíèå î ïðîõîæäåíèè öèêëà ïðèíèìàåòñÿ äî ïðîõîæäåíèÿ öèêëà. Ïîýòîìó âîçìîæíî, ÷òî öèêë íèêîãäà íå áóäåò ïðîéäåí. ×àñòü òàêîé êîíñòðóêöèè, îòíîñÿùàÿñÿ ê îïåðàòîðó, ìîæåò áûòü ïðîñòûì èëè ñîñòàâíûì îïåðàòîðîì.
Ôîðìà çàïèñè:
While(âûðàæåíèå) îïåðàòîð;
"Îïåðàòîð" ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå íå ñòàíåò ëîæíûì, èëè íóëåì.
Ïðèìåðû:
while(n++ < 100).
printf(" %d %d\n", n, 2*n + 1);
While(fargo < 1000) {
fargo = fargo + step;
step = 2 * step; }.
Îïåðàòîð for.
Êëþ÷åâîå ñëîâî: for.
Îáùèå çàìå÷àíèÿ:
Îïåðàòîð for äëÿ óïðàâëåíèÿ öèêëè÷åñêèì ïðîöåññîì èñïîëüçóåò òðè âûðàæåíèÿ, ðàçäåëåííûå ñèìâîëàìè "òî÷êà ñ çàïÿòîé". Èíèöèàëèçèðóþùåå âûðàæåíèå âûïîëíÿåòñÿ îäèí ðàç, äî âûïîëíåíèÿ ëþáîãî èç îïåðàòîðîâ öèêëà. Åñëè ïðîâåðÿåìîå âûðàæåíèå èñòèííî (èëè íå íóëü), öèêë äîëæåí áûòü ïðîéäåí îäèí ðàç. Çàòåì âûïîëíÿåòñÿ êîððåêòèðóþùåå âûðàæåíèå, è íóæíî ñíîâà ïðîàíàëèçèðîâàòü ïðîâåðÿåìîå âûðàæåíèå. Îïåðàòîð for ÿâëÿåòñÿ öèêëîì ñ ïðåäóñëîâèåì: äî ïðîõîæäåíèÿ öèêëà âûïîëíÿåòñÿ ïðîâåðêà, ïðîõîäèòü ëè ýòîò öèêë åùå îäèí ðàç. Ïîýòîìó âîçìîæíî, ÷òî öèêë íèêîãäà íå áóäåò ïðîéäåí. ×àñòü òàêîé êîíñòðóêöèè, îòíîñÿùàÿñÿ ê îïåðàòîðó, ìîæåò áûòü ïðîñòûì èëè ñîñòàâíûì îïåðàòîðîì.
Ôîðìà çàïèñè: for(èíèöèàëèçàöèÿ; ïðîâåðêà óñëîâèÿ; êîððåêöèÿ) îïåðàòîð;
Öèêë ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà ïðîâåðÿåìîå âûðàæåíèå íå ñòàíåò ëîæíûì, èëè íóëåì.
Ïðèìåð:
for(n = 0; n < 10; n++).
printf(" %d %d\n", n, 2*n + 1);
Îïåðàòîð do while.
Êëþ÷åâûå ñëîâà: do, while.
Îáùèå çàìå÷àíèÿ:
Îïåðàòîð do while ñîçäàåò öèêë, êîòîðûé ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå, ïðîâåðÿþùåå óñëîâèå, íå ñòàíåò ëîæíûì, èëè íóëåì. Îïåðàòîð do while ÿâëÿåòñÿ öèêëîì ñ ïîñòóñëîâèåì; ïîñëå ïðîõîæäåíèÿ öèêëà ïðèíèìàåòñÿ ðåøåíèå, ïðîõîäèòü ëè åãî åùå ðàç. Ïîýòîìó öèêë äîëæåí âûïîëíÿòüñÿ ïî êðàéíåé ìåðå îäèí ðàç. ×àñòü êîíñòðóêöèè, îòíîñÿùàÿñÿ ê îïåðàòîðó, ìîæåò áûòü ïðîñòûì èëè ñîñòàâíûì îïåðàòîðîì.
Ôîðìà çàïèñè:
Do îïåðàòîð while(âûðàæåíèå).
Îïåðàòîð ïîâòîðÿåòñÿ äî òåõ ïîð, ïîêà âûðàæåíèå íå ñòàíåò ëîæíûì, èëè íóëåì.
Ïðèìåð:
Do.
Scanf(" %d", &number) while(number != 20);
Èñïîëüçîâàíèå îïåðàòîðîâ if äëÿ âûáîðà âàðèàíòîâ
Êëþ÷åâûå ñëîâà: if, else.
Îáùèå çàìå÷àíèÿ:
 êàæäîé èç ñëåäóþùèõ ôîðì îïåðàòîð ìîæåò áûòü ëèáî ïðîñòûì, ëèáî ñîñòàâíûì îïåðàòîðîì. Âîîáùå ãîâîðÿ, "èñòèííîå" âûðàæåíèå îçíà÷àåò âûðàæåíèå ñ íåíóëåâûì çíà÷åíèåì.
Ôîðìà 1:
If(âûðàæåíèå) îïåðàòîð.
Îïåðàòîð âûïîëíÿåòñÿ, åñëè âûðàæåíèå èñòèííî.
Ôîðìà 2:
If(âûðàæåíèå)
Îïåðàòîð1 else.
Îïåðàòîð2.
Åñëè âûðàæåíèå èñòèííî, âûïîëíÿåòñÿ îïåðàòîð1.  ïðîòèâíîì ñëó÷àå âûïîëíÿåòñÿ îïåðàòîð2.
Ôîðìà 3:
If(âûðàæåíèå1)
Îïåðàòîð1 else if(âûðàæåíèå2)
Îïåðàòîð2 else.
Îïåðàòîð3.
Åñëè âûðàæåíèå1 èñòèííî, òî âûïîëíÿåòñÿ îïåðàòîð2.
Åñëè âûðàæåíèå1 ëîæíî, íî âûðàæåíèå2 èñòèííî, âûïîëíÿåòñÿ îïåðàòîð2.
Åñëè æå îáà âûðàæåíèÿ ëîæíû, âûïîëíÿåòñÿ îïåðàòîð3.
Ïðèìåð:
If(legs == 4).
printf(" Ýòî, âîçìîæíî, ëîøàäü.\n");
Else if(legs > 4).
printf(" Ýòî íå ëîøàäü.\n");
Else /* âûïîëíèòü, åñëè legs < 4 */
{ legs++;
printf(" Òåïåðü ó íåå åùå îäíà íîãà.\n");
}
Ìíîæåñòâåííûé âûáîð ïðè ïîìîùè switch
Êëþ÷åâîå ñëîâî: switch.
Îáùèå çàìå÷àíèÿ:
Óïðàâëåíèå ïðîãðàììîé ïåðåõîäèò ê îïåðàòîðó, èìåþùåìó çíà÷åíèå âûðàæåíèÿ â êà÷åñòâå ìåòêè. Çàòåì ïðîãðàììà ïðîäîëæàåò âûïîëíÿòüñÿ, ïðîõîäÿ îñòàëüíûå îïåðàòîðû, åñëè ñíîâà íå ïðîèçîéäåò ïåðåêëþ÷åíèÿ íàïðàâëåíèÿ. È âûðàæåíèå, è ìåòêè äîëæíû èìåòü öåëûå çíà÷åíèÿ (âêëþ÷àÿ òèï char), à ìåòêè äîëæíû áûòü ëèáî êîíñòàíòàìè, ëèáî âûðàæåíèÿìè, ñîñòîÿùèìè òîëüêî èç êîíñòàíò. Åñëè íè îäíà ìåòêà íå ñîîòâåòñòâóåò çíà÷åíèþ âûðàæåíèÿ, óïðàâëåíèå ïåðåäàåòñÿ îïåðàòîðó, ïîìå÷åííîìó default, åñëè îí ñóùåñòâóåò.  èíîì ñëó÷àå óïðàâëåíèå ïåðåäàåòñÿ îïåðàòîðó, ñëåäóþùåìó çà îïåðàòîðîì switch.
Ôîðìà çàïèñè:
Switch(âûðàæåíèå)
{
case ìåòêà1 : îïåðàòîð1;
case ìåòêà2 : îïåðàòîð2;
default : îïåðàòîð3;
}
Ìîæíî çàïèñûâàòü áîëåå äâóõ ïîìå÷åííûõ îïåðàòîðîâ, à âàðèàíò default íå îáÿçàòåëåí.
Ïðèìåð:
Switch(áóêâà) {
Case 'a' :
Case 'å' : printf(" %d ãëàñíàÿ\n", áóêâà);
Case 'ñ' :
Case 'n' : printf(" %d â \" íàáîðå ñànå \" \n", áóêâà);
Default : printf(" Ïðåêðàñíûé äåíü. \n");
}
Åñëè áóêâà èìååò çíà÷åíèå 'à' èëè 'å', ïå÷àòàþòñÿ âñå òðè ñîîáùåíèÿ; 'ñ' è 'n' âûçûâàþò ïå÷àòü äâóõ ïîñëåäíèõ ñòðîê. Âñå îñòàëüíûå çíà÷åíèÿ ïðèâîäÿò ê ïå÷àòè ïîñëåäíåãî ñîîáùåíèÿ.
Ïåðåõîäû â ïðîãðàììå.
Êëþ÷åâûå ñëîâà: break, continue, goto.
Îáùèå çàìå÷àíèÿ:
Ýòè òðè êîìàíäû âûçûâàþò ïåðåõîä îò îäíîãî îïåðàòîðà ïðîãðàììû ê äðóãîìó, ðàñïîëîæåííîìó â èíîì ìåñòå (â òåëå ïðîãðàììû).
Break.
Êîìàíäó break ìîæíî èñïîëüçîâàòü ñ ëþáîé èç òðåõ ôîðì öèêëà è ñ îïåðàòîðîì switch. Îíà ïðèâîäèò ê òîìó, ÷òî óïðàâëåíèå ïðîãðàììîé "èãíîðèðóåò" îñòàòîê öèêëà èëè îïåðàòîð switch, ñîäåðæàùèé ýòîò îñòàòîê, è âîçîáíîâëÿåò âûïîëíåíèå ñ îïåðàòîðà, ñëåäóþùåãî çà öèêëîì èëè switch.
Ïðèìåð:
Switch(number) {
case 4: printf(" Õîðîøèé âûáîð!\n");
break;
case 5: printf("Ýòî íåïëîõîé âûáîð. \n");
break;
default: printf("Ýòî ïëîõîé âûáîð.\n");
Continue.
Êîìàíäà continue ìîæåò èñïîëüçîâàòüñÿ ñ ëþáûìè òðåìÿ ôîðìàìè öèêëà, íî íå ñî switch. Îíà ïðèâîäèò ê òîìó, ÷òî óïðàâëåíèå ïðîãðàììîé èãíîðèðóåò îñòàâøèåñÿ îïåðàòîðû öèêëà. Äëÿ öèêëà while èëè for íà÷èíàåòñÿ ñëåäóþùèé øàã öèêëà. Äëÿ öèêëà do while ïðîâåðÿåòñÿ óñëîâèå âûõîäà, à çàòåì, åñëè íóæíî, íà÷èíàåòñÿ ñëåäóþùèé øàã öèêëà:
Ïðèìåð:
While((ch = getchar( )) != EOF) {
if(ch == ' ') continue;
putchar(ch);
chcount ++; }.
Ýòîò ôðàãìåíò ïðîãðàììû âûïîëíÿåò ýõî-êîïèðîâàíèå è ïîäñ÷åò ñèìâîëîâ, íå ÿâëÿþùèõñÿ ïðîáåëàìè.
Goto.
Îïåðàòîð goto âûçûâàåò ïåðåäà÷ó óïðàâëåíèÿ â ïðîãðàììå îïåðàòîðó, ïîìå÷åííîìó óêàçàííîé ìåòêîé. Äëÿ îòäåëåíèÿ ïîìå÷åííîãî îïåðàòîðà îò åãî ìåòêè èñïîëüçóåòñÿ äâîåòî÷èå. Ìåòêå ïðèñâàèâàåòñÿ èìÿ ïî ïðàâèëàì, ïðèíÿòûì äëÿ èìåíè ïåðåìåííîé. Ïîìå÷åííûé îïåðàòîð ìîæåò íàõîäèòüñÿ äî èëè ïîñëå îïåðàòîðà goto.
Ôîðìà çàïèñè: goto label;
...
Label : statement
Ïðèìåð:
Top : ch = getchar( );
If(ch != 'y') goto top;
ÏÐÈËÎÆÅÍÈÅ Å. ÌÀÍÈÏÓËßÖÈÈ ÐÀÇÐßÄÀÌÈ: ÎÏÅÐÀÖÈÈ È ÏÎËß.
Äëÿ íåêîòîðûõ ïðîãðàìì íåîáõîäèìà (èëí ïî êðàéíåé ìåðå ïîëåçíà) âîçìîæíîñòü ìàíèïóëèðîâàòü îòäåëüíûìè ðàçðÿäàìè â áàéòå èëè ñëîâå. Íàïðèìåð, ÷àñòî âàðèàíòû ðåæèìîâ óñòðîéñòâ ââîäà-âûâîäà óñòàíàâëèâàþòñÿ áàéòîì, â êîòîðîì êàæäûé ðàçðÿä äåéñòâóåò êàê ïðèçíàê "âêëþ÷åíî-âûêëþ÷åíî".  ÿçûêå Ñè åñòü ÄÂÀ ñðåäñòâà, ïîìîãàþùèå ìàíèïóëèðîâàòü ðàçðÿäàìè. Âî-ïåðâûõ, íàáîð èç øåñòè "ïîðàçðÿäíûõ" îïåðàöèé, âûïîëíÿþùèõñÿ íàä ðàçðÿäàìè. Âî-âòîðûõ, ôîðìà äàííûõ, íàçûâàåìàÿ field (ïîëå), äàþùàÿ äîñòóï ê ðàçðÿäàì ïåðåìåííîé òèïà int. Òåïåðü ìû êðàòêî îïèøåì ýòè õàðàêòåðíûå ÷åðòû ÿçûêà Ñè.
Îïåðàöèè.
 ÿçûêå Ñè ïðåäóñìàòðèâàþòñÿ ïîðàçðÿäíûå ëîãè÷åñêèå îïåðàöèè è îïåðàöèè ñäâèãà. Äàëåå ìû áóäåì çàïèñûâàòü çíà÷åíèÿ â äâîè÷íîì êîäå, ÷òîáû âû ìîãëè âèäåòü, êàê âûïîëíÿþòñÿ îïåðàöèè.  ðåàëüíûõ ïðîãðàììàõ èñïîëüçóþòñÿ öåëûå ïåðåìåííûå èëè êîíñòàíòû, çàïèñàííûå â îáû÷íîé ôîðìå. Íàïðèìåð, âìåñòî (00011001) ìîæíî èñïîëüçîâàòü 25 èëè 031, ëèáî äàæå 0õ19.  íàøèõ ïðèìåðàõ áóäóò ïðèìåíÿòüñÿ 8-ðàçðÿäíûå ÷èñëà, â êîòîðûõ ðàçðÿäû ïðîíóìåðîâàíû îò 7 äî 0 ñëåâà íàïðàâî.
Ïîðàçðÿäíûå ëîãè÷åñêèå îïåðàöèè.
×åòûðå îïåðàöèè ïðîèçâîäÿò äåéñòâèÿ íàä äàííûìè, îòíîñÿùèìèñÿ ê êëàññó öåëûõ, âêëþ÷àÿ char. Îíè íàçûâàþòñÿ "ïîðàçðÿäíûìè", ïîòîìó ÷òî âûïîëíÿþòñÿ îòäåëüíî íàä êàæäûì ðàçðÿäîì íåçàâèñèìî îò ðàçðÿäà, íàõîäÿùåãîñÿ ñëåïà èëè ñïðàâà.
~ : Äîïîëíåíèå äî åäèíèöû, èëè ïîðàçðÿäíîå îòðèöàíèå
Ýòà óíàðíàÿ îïåðàöèÿ èçìåíÿåò êàæäóþ 1 íà 0, à 0 íà 1. Ïîýòîìó.
~(10011010) == (01100101).
&: Ïîðàçðÿäíîå È
Ýòà áèíàðíàÿ îïåðàöèÿ ñðàâíèâàåò ïîñëåäîâàòåëüíî ðàçðÿä çà ðàçðÿäîì äâà îïåðàíäà. Äëÿ êàæäîãî ðàçðÿäà ðåçóëüòàò ðàâåí 1, åñëè òîëüêî îáà ñîîòâåòñòâóþùèõ ðàçðÿäà îïåðàíäîâ ðàâíû 1. ( òåðìèíàõ "èñòèííî-ëîæíî" ðåçóëüòàò ïîëó÷àåòñÿ èñòèííûì, åñëè òîëüêî êàæäûé èç äâóõ îäíîðàçðÿäíûõ îïåðàíäîâ ÿâëÿåòñÿ èñòèííûì.) Òàê,
(10010011) & (00111101) == (00010001).
Ïîòîìó ÷òî òîëüêî ÷åòâåðòûé è ïåðâûé ðàçðÿäû îáîèõ îïåðàíäîâ ñîäåðæàò 1.
| : Ïîðàçðÿäíîå ÈËÈ
Ýòà áèíàðíàÿ îïåðàöèÿ ñðàâíèâàåò ïîñëåäîâàòåëüíî ðàçðÿä çà ðàçðÿäîì äâà îïåðàíäà. Äëÿ êàæäîãî ðàçðÿäà ðåçóëüòàò ðàâåí 1, åñëè ëþáîé èç ñîîòâåòñòâóþùèõ ðàçðÿäîâ îïåðàíäîâ ðàâåí 1. [ òåðìèíàõ "èñòèííî-ëîæíî" ðåçóëüòàò ïîëó÷àåòñÿ èñòèííûì, åñëè îäèí èç äâóõ (èëè îáà) îäíîðàçðÿäíûõ îïåðàíäîâ ÿâëÿåòñÿ èñòèííûì.] Òàê,
(10010011) | (00111101) == (10111111).
Ïîòîìó ÷òî âñå ðàçðÿäû, êðîìå øåñòîãî, â îäíîì èç äâóõ îïåðàíäîâ èìåþò çíà÷åíèå 1.
^: Ïîðàçðÿäíîå èñêëþ÷àþùåå ÈËÈ
Ýòà áèíàðíàÿ îïåðàöèÿ ñðàâíèâàåò ïîñëåäîâàòåëüíî ðàçðÿä çà ðàçðÿäîì äâà îïåðàíäà. Äëÿ êàæäîãî ðàçðÿäà ðåçóëüòàò ðàâåí 1, åñëè îäèí íç äâóõ (íî íå îáà) ñîîòâåòñòâóþùèõ ðàçðÿäîâ îïåðàíäîâ ðàâåí 1. [ òåðìèíàõ "èñòèííî-ëîæíî" ðåçóëüòàò ïîëó÷àåòñÿ èñòèííûì, åñëè îäèí èç äâóõ (íî íå îáà) îäíîðàçðÿäíûõ îïåðàíäîâ ÿâëÿåòñÿ èñòèííûì.] Ïîýòîìó.
(10010011) ^ (00111101) == (10101110).
Çàìåòèì, ÷òî, ïîñêîëüêó íóëåâîé ðàçðÿä â îáîèõ îïåðàíäàõ èìååò çíà÷åíèå 1, íóëåâîé ðàçðÿä ðåçóëüòàòà èìååò çíà÷åíèå 0.
Ïðèìåíåíèå
Îïèñàííûå âûøå îïåðàöèè ÷àñòî èñïîëüçóþòñÿ äëÿ óñòàíîâêè íåêîòîðûõ ðàçðÿäîâ, ïðè÷åì äðóãèå ðàçðÿäû îñòàþòñÿ íåèçìåííûìè. Íàïðèìåð, ïðåäïîëîæèì, ÷òî ìû îïðåäåëèëè MASK â äèðåêòèâå #define MASK, ðàâíûì 2, ò. å. äâîè÷íîìó çíà÷åíèþ 00000010, èìåþùåìó íåíóëåâîå çíà÷åíèå òîëüêî â ïåðâîì ðàçðÿäå. Òîãäà îïåðàòîð.
Flags = flags & MASK;
Óñòàíîâèò âñå ðàçðÿäû flags (êðîìå ïåðâîãî) â 0, ïîòîìó ÷òî ëþáîå çíà÷åíèå ðàçðÿäà ïðè âûïîëíåíèè îïåðàöèè. & äàåò 0, åñëè ðàçðÿä âòîðîãî îïåðàíäà ðàâåí 0. Îäíàêî ïåðâûé ðàçðÿä îñòàíåòñÿ íåèçìåííûì. (Åñëè ïåðâûé ðàçðÿä îïåðàíäà ñîäåðæèò 1, òî ðåçóëüòàò îïåðàöèè 1 & 1 ðàâåí 1, à åñëè ïåðâûé ðàçðÿä èìååò çíà÷åíèå 0, òî 0 & 1 áóäåò ðàâíî 0.) Àíàëîãè÷íî îïåðàòîð.
Flags = flags | MASK;
Óñòàíîâèò ïåðâûé ðàçðÿä â 1 è îñòàâèò âñå îñòàëüíûå ðàçðÿäû íåèçìåííûìè. Ýòî ïðîèñõîäèò ïîòîìó, ÷òî ëþáîå çíà÷åíèå ðàçðÿäà ïðè âûïîëíåíèè îïåðàöèè 1, åñëè ðàçðÿä âòîðîãî îïåðàíäà ðàâåí íóëþ, îñòàåòñÿ áåç èçìåíåíèÿ, à åñëè ðàçðÿä âòîðîãî îïåðàíäà ðàâåí 1, òî ïåðâûé ðàçðÿä ðåçóëüòàòà áóäåò èìåòü çíà÷åíèå 1.
Ïîðàçðÿäíûå îïåðàöèè ñäâèãà.
Ýòè îïåðàöèè ñäâèãàþò ðàçðÿäû âëåâî èëè âïðàâî. Ìû ñíîâà çàïèøåì äâîè÷íûå ÷èñëà â ÿâíîé ôîðìå, ÷òîáû ïîäðîáíî ïîêàçàòü ìåõàíèçì ñäâèãà.
&& : Ñäâèã âëåâî
Ýòà îïåðàöèÿ ñäâèãàåò ðàçðÿäû ëåâîãî îïåðàíäà âëåâî íà ÷èñëî ïîçèöèé, óêàçàííîå ïðàâûì îïåðàíäîì. Îñâîáîæäàþùèåñÿ ïîçèöèè çàïîëíÿþòñÿ íóëÿìè, à ðàçðÿäû, ñäâèãàåìûå çà ëåâûé ïðåäåë ëåâîãî îïåðàíäà, òåðÿþòñÿ. Ïîýòîìó.
(10001010) << 2 == 00101000.
Ãäå êàæäûé ðàçðÿä ñäâèíóëñÿ íà äâå ïîçèöèè âëåâî.
>> : Ñäâèã âïðàâî
Ýòà îïåðàöèÿ ñäâèãàåò ðàçðÿäû ëåâîãî îïåðàíäà âïðàâî íà ÷èñëî ïîçèöèé, óêàçàííîå ïðàâûì îïåðàíäîì. Ðàçðÿäû, ñäâèãàåìûå çà ïðàâûé ïðåäåë ëåâîãî îïåðàíäà, òåðÿþòñÿ. Äëÿ ÷èñåë òèïà unsigned ïîçèöèè, îñâîáîæäàþùèåñÿ ñëåâà, çàïîëíÿþòñÿ íóëÿìè. Äëÿ ÷èñåë ñî çíàêîì ðåçóëüòàò çàâèñèò îò òèïà ÝÂÌ. Îñâîáîæäàþùèåñÿ ïîçèöèè ìîãóò çàïîëíÿòüñÿ íóëÿìè èëè çíà÷åíèåì çíàêîâîãî ðàçðÿäà (ñàìîãî ëåâîãî). Äëÿ çíà÷åíèé áåç çíàêà èìååì.
(10001010) >> 2 == (00100010).
Ãäå êàæäûé ðàçðÿä ïåðåìåñòèëñÿ íà äâå ïîçèöèè âïðàâî.
Ïðèìåíåíèå
Ýòè îïåðàöèè âûïîëíÿþò ñäâèã, à òàêæå ýôôåêòèâíîå óìíîæåíèå è äåëåíèå íà ñòåïåíè 2:
Number << n óìíîæàåò number íà 2 â n-é ñòåïåíè.
Number >> n äåëèò number íà 2 â n-é ñòåïåíè, åñëè ÷èñëî íåîòðèöàòåëüíîå.
Ýòî àíàëîãè÷íî ñîîòâåòñòâóþùåìó àëãîðèòìó äëÿ äåñÿòè÷íîé ñèñòåìû ñ÷èñëåíèÿ, îáåñïå÷èâàþùåìó ñäâèã äåñÿòè÷íîé òî÷êè ïðè óìíîæåíèè èëè äåëåíèè íà 10.
Ïîëÿ.
Âòîðîé ñïîñîá ìàíèïóëÿöèè ðàçðÿäàìè çàêëþ÷àåòñÿ â èñïîëüçîâàíèè ïîëÿ. Ïîëåì ñ÷èòàåòñÿ ïîñëåäîâàòåëüíîñòü ñîñåäíèõ ðàçðÿäîâ â ÷èñëå òèïà int èëè unsigned int. Ïîëå óñòàíàâëèâàåòñÿ ïðè ïîìîùè îïðåäåëåíèÿ ñòðóêòóðû, â êîòîðîì ïîìå÷àåòñÿ êàæäîå ïîëå è îïðåäåëÿåòñÿ åãî ðàçìåð. Ñëåäóþùåå îïèñàíèå óñòàíàâëèâàåò ÷åòûðå 1-ðàçðÿäíûõ ïîëÿ:
Struct {
Unsigned autfd: 1;
Unsigned bldfc: 1;
Unsigned undln: 1;
Unsigned itals: 1;
} prnt;
Ïåðåìåííàÿ prnt ñîäåðæèò òåïåðü ÷åòûðå 1-ðàçðÿäíûõ íîëÿ. Îáû÷íóþ îïåðàöèþ ïðèíàäëåæíîñòè ýëåìåíòà ñòðóêòóðû ìîæíî èñïîëüçîâàòü äëÿ ïðèñâîåíèÿ çíà÷åíèè îòäåëüíûì ïîëÿì:
Prnt.itals = 0;
Prnt.undln = 1;
Ïîñêîëüêó êàæäîå ïîëå ñîñòîèò òîëüêî èç îäíîãî ðàçðÿäà, ìû ìîæåì èñïîëüçîâàòü äëÿ ïðèñâàèâàíèÿ ëèøü çíà÷åíèå 0 èëè 1.
Ïåðåìåííàÿ prnt çàïîìèíàåòñÿ â ÿ÷åéêå ïàìÿòè, èìåþùåé ðàçìåð, ðàâíûé äëèíå ÷èñëà òèïà int, íî äëÿ íàøåãî ïðèìåðà èñïîëüçóåòñÿ òîëüêî ÷åòûðå ðàçðÿäà.
Ðàçìåð ïîëÿ íå îãðàíè÷èâàåòñÿ îäíèì ðàçðÿäîì. Ìû ìîæåì äåëàòü, íàïðèìåð, òàê:
Struct {
Unsigned code1 : 2;
Unsigned code2 : 2;
Unsigned code3 : 8;
} prcode;
Òàêèì ïóòåì ñîçäàþòñÿ äâà 2-ðàçðÿäíûõ ïîëÿ è îäíî 8-ðàçðÿäíîå. Ìû ìîæåì âûïîëíÿòü ïðèñâàèâàíèÿ, ïîäîáíûå ñëåäóþùèì:
Prcode.code1 = 0;
Prcode.code2 = 3;
Prcode.code3 = 102;
Óäîñòîâåðüòåñü òîëüêî, ÷òî çíà÷åíèå íå ïðåâûøàåò ðàçìåð ïîëÿ.
×òî ïðîèçîéäåò, åñëè îáùåå ÷èñëî îáúÿâëåííûõ âàìè ðàçðÿäîâ ïðåâûñèò ðàçìåð ïåðåìåííîé òèïà int?  ýòîì ñëó÷àå èñïîëüçóåòñÿ ñëåäóþùàÿ ÿ÷åéêà ïàìÿòè òèïà int. Îäèíî÷íîå ïîëå íå ìîæåò ïåðåêðûâàòü ãðàíèöó ìåæäó äâóìÿ int, êîìïèëÿòîð àâòîìàòè÷åñêè ñäâèãàåò îïðåäåëåíèå ïåðåêðûâàþùåãî ïîëÿ òàêèì îáðàçîì, ÷òîáû äàííîå ïîëå áûëî âûðàâíåíî ïî ãðàíèöå int. Åñëè ýòî ïðîèñõîäèò, îí îñòàâëÿåò â ïåðâîì int áåçûìÿííîå "ïóñòîå ìåñòî".
Âû ìîæåòå çàïîëíèòü ñòðóêòóðó ïîëÿ ñ áåçûìÿííûìè ïóñòûìè ìåñòàìè, èñïîëüçóÿ ïîëå áåç èìåíè. Ïðèìåíåíèå ïîëÿ áåç èìåíè ñ ðàçìåðîì 0 âûðàâíèâàåò î÷åðåäíîå ïîëå ïî ãðàíèöå ñëåäóþùåãî öåëîãî:
Struct {
field1 : 1;
: 2;
field2 : 1;
: 0;
field3 : 1; } stuff;
Çäåñü åñòü 2-ðàçðÿäíûé ïðîìåæóòîê ìåæäó stuff.field1 è stuff.field2, a stuff.field3 çàïîìèíàåòñÿ â ñëåäóþùåì int.
Ïîðÿäîê ðàçìåùåíèÿ ïîëåé â int çàâèñèò îò òèïà ÝÂÌ. Â îäíèõ ìàøèíàõ ïîëÿ ðàñïîëàãàþòñÿ ñëåâà íàïðàâî, â äðóãèõ - ñïðàâà íàëåâî.
ÏÐÈËÎÆÅÍÈÅ Æ. ÄÂÎÈ×ÍÛÅ È ÄÐÓÃÈÅ ×ÈÑËÀ
Äâîè÷íûå ÷èñëà.
 îñíîâå ñïîñîáà, êîòîðûé ìû îáû÷íî èñïîëüçóåì äëÿ çàïèñè ÷èñåë, ëåæèò ÷èñëî 10. Ìîæåò áûòü, âû êîãäà-òî ñëûøàëè, ÷òî ÷èñëî 3652 èìååò 3 â ïîçèöèè òûñÿ÷, 6 â ïîçèöèè ñîòåí, 5 â ïîçèöèè äåñÿòêîâ è 2 â ïîçèöèè åäèíèö. Ïîýòîìó ìû ìîæåì ïðåäñòàâèòü ÷èñëî 3652 â âèäå.
3 ´ 1000 + 6 ´ 100 + 5 ´ 10 + 2 ´ 1.
Îäíàêî 1000 - ýòî 10 â êóáå, 100 - äåñÿòü â êâàäðàòå, 10 - äåñÿòü â ïåðâîé ñòåïåíè, à 1, êàê ïðèíÿòî â ìàòåìàòèêå, 10 (èëè ëþáîå ïîëîæèòåëüíîå ÷èñëî) â íóëåâîé ñòåïåíè. Ñëåäîâàòåëüíî, ìû ìîæåì çàïèñàòü 3652 êàê.
3 ´ 103 + 6 ´ 102 + 5 ´ 101 + 2 ´ 100
Òàê êàê íàøà ñèñòåìà çàïèñè ÷èñåë îñíîâûâàåòñÿ íà ñòåïåíÿõ äåñÿòè, ìû ìîæåì ñêàçàòü, ÷òî 3652 çàïèñûâàåòñÿ ïî îñíîâàíèþ 10.
Âåðîÿòíî, ìû ñîçäàëè òàêóþ ñèñòåìó ïîòîìó, ÷òî èìååì 10 ïàëüöåâ íà ðóêàõ. Êîìïüþòåð æå, â êàêîì-òî ñìûñëå, èìååò òîëüêî äâà "ïàëüöà", ïîýòîìó åãî ìîæíî óñòàíîâèòü òîëüêî â ñîñòîÿíèå 0 èëè 1 (âûêëþ÷åíî èëè âêëþ÷åíî). Ýòî äåëàåò ñèñòåìó ñ îñíîâàíèåì 2 åñòåñòâåííîé äëÿ êîìïüþòåðà. Êàê îíà ðàáîòàåò? Èñïîëüçóþòñÿ ñòåïåíè 2 âìåñòî ñòåïåíåé 10. Íàïðèìåð, òàêîå äâîè÷íîå ÷èñëî, êàê 1101, îçíà÷àëî áû.
1 ´ 23 + 1 ´ 22 + 0 ´ 21 + 1 ´ 20.
 äåñÿòè÷íîé çàïèñè îíî ñòàíîâèòñÿ ðàâíûì.
1 ´ 8 + 1 ´ 4 + 0 ´ 2 + 1 ´ 1 = 13.
Ñèñòåìà ñ îñíîâàíèåì 2 (èëè "äâîè÷íàÿ") ïîçâîëÿåò âûðàçèòå ëþáîå ÷èñëî (åñëè ó ïàñ äîñòàòî÷íî ðàçðÿäîâ â äâîè÷íîé ñèñòåìå, êàê êîìáèíàöèþ åäèíèö è íóëåé. Ýòî î÷åíü "ïðèÿòíî" äëÿ êîìïüþòåðà, îñîáåííî åñëè ó÷åñòü, ÷òî ó íåãî íåò èíîãî âûáîðà. Ïîñìîòðèì, êàê ðàáîòàåò òàêîé ìåõàíèçì äëÿ 1-áàéòíîãî öåëîãî ÷èñëà.
Ìîæíî ñ÷èòàòü åãî 8 ðàçðÿäîâ ïðîíóìåðîâàííûìè ñëåâà íàïðàâî îò 7 äî 0. Òàêèå "íîìåðà ðàçðÿäîâ" ñîîòâåòñòâóþò ñòåïåíÿì 2. Ïðåäñòàâüòå ñåáå, ÷òî áàéò âûãëÿäèò ïðèìåðíî òàê:

Çäåñü 128 - ýòî 2 â 7-è ñòåïåíè è ò. ä. Ñàìîå áîëüøîå ÷èñëî, êîòîðîå ìîæåò ñîäåðæàòü ýòîò áàéò, èìååò âî âñåõ ðàçðÿäàõ 1 : 11111111. Çíà÷åíèå òàêîãî äâîè÷íîãî ÷èñëà.
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255.
Ñàìîå ìàëåíüêîå äâîè÷íîå ÷èñëî áûëî áû ðàâíî 00000000, èëè ïðîñòî 0. Áàéò ìîæåò ñîäåðæàòü ÷èñëà îò 0 äî 255 äëÿ âñåõ 256 âîçìîæíûõ çíà÷åíèé.
Äâîè÷íûå ÷èñëà ñ ïëàâàþùåé òî÷êîé.
×èñëà ñ ïëàâàþùåé òî÷êîé õðàíÿòñÿ â ïàìÿòè â âèäå äâóõ ÷àñòåé: äâîè÷íîé äðîáè è äâîè÷íîãî ïîðÿäêà. Ïîñìîòðèì, êàê ýòî äåëàåòñÿ.
Äâîè÷íûå äðîáè
Îáû÷íóþ äðîáü .324 ìîæíî ïðåäñòàâèòü â âèäå.
3/10 + 2/100 + 4/1000,
Ãäå çíàìåíàòåëè - óâåëè÷èâàþùèåñÿ ñòåïåíè 10.  äâîè÷íîé äðîáè ìû èñïîëüçóåì â êà÷åñòâå çíàìåíàòåëåé ñòåïåíè 2. Ïîýòîìó äâîè÷íóþ äðîáü .101 ìîæíî çàïèñàòü â âèäå.
1/2 + 0/4 + 1/8,
×òî â äåñÿòè÷íîì âèäå äàñò.
.50 + .00 + .125.
Èëè .625.
Ìíîãèå äðîáè, òàêèå êàê 1/3, íåëüçÿ òî÷íî ïðåäîñòàâèòü äåñÿòè÷íîé ôîðìå, è àíàëîãè÷íî ìíîãèå äðîáè íåëüçÿ òî÷íî ïðåäñòàâèòü â äâîè÷íîé ôîðìå. Äåéñòâèòåëüíî, òîëüêî äðîáè, êîòîðûå ÿâëÿþòñÿ êîìáèíàöèÿìè ÷èñåë, êðàòíûõ ñòåïåíÿì 1/2, ìîæíî ïðåäñòàâèòü òî÷íî. Ïîýòîìó 3/4 è 7/8 ìîæíî òî÷íî ïðåäñòàâèòü êàê äâîè÷íûå äðîáè, à 1/3 è 2/5 íåëüçÿ.
Ïðåäñòàâëåíèå ÷èñåë ñ ïëàâàþùåé òî÷êîé
Äëÿ ïðåäñòàâëåíèÿ â êîìïüþòåðå ÷èñëà ñ ïëàâàþùåé òî÷êîé íåêîòîðîå êîëè÷åñòâî (â çàâèñèìîñòè îò ñèñòåìû) ðàçðÿäîâ âûäåëÿåòñÿ äëÿ õðàíåíèÿ äâîè÷íîé äðîáè è, êðîìå òîãî, äîïîëíèòåëüíûå ðàçðÿäû ñîäåðæàò ïîêàçàòåëü ñòåïåíè.  îáùåì ñëó÷àå ôàêòè÷åñêîå çíà÷åíèå ÷èñëà ñîñòîèò èç äâîè÷íîé äðîáè, óìíîæåííîé íà 2 â óêàçàííîé ñòåïåíè. Ïîýòîìó óìíîæåíèå ÷èñëà ñ ïëàâàþùåé òî÷êîé, ñêàæåì, íà 4 óâåëè÷èâàåò ïîêàçàòåëü ñòåïåíè ïà 2 è îñòàâëÿåò äâîè÷íóþ äðîáü íåèçìåííîé. Óìíîæåíèå íà ÷èñëî, íå ÿâëÿþùååñÿ ñòåïåíüþ 2, èçìåíÿåò äâîè÷íóþ äðîáü è, åñëè íåîáõîäèìî, ïîêàçàòåëü ñòåïåíè.
Äðóãèå îñíîâàíèÿ ñèñòåìû ñ÷èñëåíèÿ.
Ïîëüçîâàòåëè êîìïüþòåðîâ ÷àñòî ïðèìåíÿþò ñèñòåìû ñ÷èñëåíèÿ ïî îñíîâàíèþ 8 èëè 16. Òàê êàê 8 è 16 ÿâëÿþòñÿ ñòåïåíÿìè 2, ýòè ñèñòåìû áîëåå òåñíî ñâÿçàíû ñ äâîè÷íîé ñèñòåìîé ñ÷èñëåíèÿ êîìïüþòåðîâ, ÷åì äåñÿòè÷íàÿ ñèñòåìà.
Âîñüìåðè÷íûå ÷èñëà
"Âîñüìåðè÷íûìè" íàçûâàþòñÿ ÷èñëà â ñèñòåìå ñ÷èñëåíèÿ ïî îñíîâàíèþ 8.  ýòîé ñèñòåìå ðàçëè÷íûå ïîçèöèè â ÷èñëå ïðåäñòàâëÿþò ñòåïåíè ÷èñëà 8. Ìû èñïîëüçóåì äëÿ ýòîãî öèôðû îò 0 äî 7. Íàïðèìåð, âîñüìåðè÷íîå ÷èñëî 451 (çàïèñûâàåìîå êàê 0451 íà ÿçûêå Ñè) ïðåäñòàâëÿåòñÿ â âèäå.
4 ´ 82 + 5 ´ 81 + 1 ´ 81 = 297 (ïî îñíîâàíèþ 10).
Øåñòíàäöàòåðè÷íûå ÷èñëà
"Øåñòíàäöàòåðè÷íûìè" (èëè hex) íàçûâàþòñÿ ÷èñëà â ñèñòåìå ïî îñíîâàíèþ 16. Ïîñêîëüêó ó íàñ íåò îòäåëüíûõ öèôð äëÿ ïðåäñòàíëåíèÿ çíà÷åíèè îò 10 äî 15, ìû èñïîëüçóåì â ýòèõ öåëÿõ áóêâû îò À äî F. Íàïðèìåð, øåñòíàäöàòåðè÷íîå ÷èñëî A3F (çàïèñàííîå êàê 0´À3F íà ÿçûêå Ñè) ïðåäñòàâëÿåòñÿ êàê.
10 ´ 162 + 3 ´ 161 + 15 ´ 160 = 2623 (ïî îñíîâàíèþ 10).
ÏÐÈËÎÆÅÍÈÅ Ç. "ÌÓÇÛÊÀ" Â ÑÈÑÒÅÌÅ IBM PC.
Ãðîìêîãîâîðèòåëåì ïåðñîíàëüíîãî êîìïüþòåðà IBM PC ìîæíî óïðàâëÿòü, èñïîëüçóÿ åãî ïîðòû ââîäà-âûâîäà.  ãë. 6 ìû îáñóæäàëè, êàê ïðèìåíÿòü ïîðò 97 äëÿ âîçáóæäåíèÿ çâóêîâîãî ñèãíàëèçàòîðà êîìïüþòåðà IBM PC. Ìû ïðèìåíÿëè ñïåöèàëüíûå ôóíêöèè ââîäà-âûâîäà inp( ) è outp( ), êîòîðûå ïðåäóñìîòðåíû â íåêîòîðûõ êîìïèëÿòîðàõ ñ ÿçûêà Ñè äëÿ ñèñòåì IBM PC. Áîëüøèíñòâî êîìïèëÿòîðîâ IBM PC ïîçâîëÿþò òàêæå ïðèìåíÿòü ýêâèâàëåíòíûå ñðåäñòâà íà ÿçûêå àññåìáëåðà. Ìû âèäåëè, êàê íàäî èñïîëüçîâàòü öèêëû, ðåàëèçóþùèå âðåìåííóþ çàäåðæêó, äëÿ óïðàâëåíèÿ ïðîäîëæèòåëüíîñòüþ çâó÷àíèÿ; â ýòîì ïðèëîæåíèè ìû ðàñøèðèì íàø ïîäõîä, ÷òî ïîçâîëèò íàì âûáèðàòü è ÷àñòîòó. Ìû ñîñòàâèì ôóíêöèþ, àðãóìåíòàìè êîòîðîé ÿâëÿþòñÿ ÷àñòîòà è ïðîäîëæèòåëüíîñòü çâó÷àíèÿ. Çàòåì ïîêàæåì îáðàçåö ïðîãðàììû, èñïîëüçóþùåé ôóíêöèþ tone( ) äëÿ ïðåâðàùåíèÿ ÷àñòè êëàâèàòóðû ìàøèíû IBM PC â ïðîñòóþ ìóçûêàëüíóþ êëàâèàòóðó.
Ôóíêöèÿ tone ( )
Âîò çàãîëîâîê íàøåé ôóíêöèè:
Tone(freq, time);
Int freq, time;
Ïåðåìåííàÿ freq îïèñûâàåò ÷àñòîòó òîíà, âûðàæàåìóþ â ãåðöàõ (Ãö), ò. å. ÷èñëîì êîëåáàíèé â ñåêóíäó. Ïåðåìåííàÿ time õàðàêòåðèçóåò ïðîäîëæèòåëüíîñòü çâó÷àíèÿ â äåñÿòûõ äîëÿõ ñåêóíäû, çíà÷åíèå 10 äëÿ time îçíà÷àåò ïðîäîëæèòåëüíîñòü 10 äåñÿòûõ, èëè 1 ñåêóíäà. Òåïåðü ìû äîëæíû ðàçðàáîòàòü ñïîñîáû ïåðåäà÷è ýòîé èíôîðìàöèè íà çâóêîâîñïðîèçâîäÿùåå óñòðîéñòâî. Ñíà÷àëà ðàññìîòðèì ïðîäîëæèòåëüíîñòü çâó÷àíèÿ.
Ïðîäîëæèòåëüíîñòü çâó÷àíèÿ.
Ìû ìîæåì ðåãóëèðîâàòü ïðîäîëæèòåëüíîñòü òàê, êàê áûëî óêàçàíî â ãë. 6. Âñïîìíèì, ÷òî ãðîìêîãîâîðèòåëü óïðàâëÿåòñÿ óñòðîéñòâîì, íàçûâàåìûì "Ïðîãðàììèðóåìûé ïàðàëëåëüíûé èíòåðôåéñíûé êîíòðîëëåð 8255". Ñïåöèàëüíûå êàíàëû ââîäà-âûâîäà, íàçûâàåìûå ïîðòàìè, ñâÿçûâàþò ýòîò è äðóãèå êîíòðîëëåðû ñ "ìîçãîì" ñèñòåìû, ìèêðîïðîöåññîðîì 8088. Ìû èñïîëüçóåì ïîðò 97 äëÿ âêëþ÷åíèÿ ãðîìêîãîâîðèòåëÿ, öèêë, ÷òîáû îòìå÷àòü âðåìÿ, è çàòåì ïîðò 97 äëÿ îòêëþ÷åíèÿ ãðîìêîãîâîðèòåëÿ. Âîò ôðàãìåíò ïðîãðàììû, êîòîðàÿ áóäåò âûïîëíÿòü ýòè äåéñòâèÿ:
#define TIMESCALE.
1270 /* ÷èñëî îòñ÷åòîâ âðåìåíè â 0,1 ñ */
#define BEEPPORT 97 /* ïîðò óïðàâëÿåò ãðîìêîãîâîðèòåëåì */
#define ON 79 /* ñèãíàë âêëþ÷åíèÿ ãðîìêîãîâîðèòåëÿ */
Count = TIMESCALE *time; /* ïðåîáðàçîâàíèå âðåìåíè.
 åäèíèöû òàéìåðà */
Port = inp(BEEPPORT); /* çàïîìèíàíèå ñîñòîÿíèÿ ïîðòà */
Outp(BEEPPORT, ON); /* âêëþ÷åíèå ãðîìêîãîâîðèòåëÿ */
For(i = 0; i < count; i++).
; /* îòìåòêà âðåìåíè */
Outp(ÂÅÅÐÐÎRÒ, port); /* âûêëþ÷åíèå ãðîìêîãîâîðèòåëÿ, âîññòàíîâëåíèå ñîñòîÿíèÿ */
Çíà÷åíèå count (÷èñëî îòñ÷åòîâ) äàåò âðåìÿ, â òå÷åíèå êîòîðîãî ãðîìêîãîâîðèòåëü âêëþ÷åí. Êîýôôèöèåíò TIMESCALE ïðåîáðàçóåò äåñÿòûå äîëè ñåêóíäû â ýêâèâàëåíòíîå êîëè÷åñòâî îòñ÷åòîâ âðåìåíè. Êîíå÷íî, ìû äîëæíû óñòàíîâèòü òðåáóåìóþ ÷àñòîòó çâóêà äî òîãî, êàê çàçâó÷èò ãðîìêîãîâîðèòåëü, ïîýòîìó ðàññìîòðèì ýòîò ïàðàìåòð.
×àñòîòà çâóêà.
×àñòîòó çâóêà ìîæíî óñòàíîâèòü ïðè ïîìîùè äðóãîãî óñòðîéñòâà, íàçûâàåìîãî "Ïðîãðàììèðóåìûì èíòåðâàëüíûì òàéìåðîì 8253". Ýòîò êîíòðîëëåð â ÷èñëå ïðî÷åãî îïðåäåëÿåò, ñêîëüêî èìïóëüñîâ â ñåêóíäó ñëåäóåò ïîñëàòü íà ãðîìêîãîâîðèòåëü. Óñòðîéñòâî 8253 âûðàáàòûâàåò áàçîâóþ ÷àñòîòó 1,190,000 Ãö, êîòîðàÿ çíà÷èòåëüíî âûøå ãðàíè÷íîé ÷àñòîòû âîñïðèÿòèÿ çâóêà ÷åëîâåêîì. Îäíàêî ìû ìîæåì ïîñëàòü íà óñòðîéñòâî 8253 ÷èñëî äëÿ äåëåíèÿ ýòîé áàçîâîé ÷àñòîòû. Íàïðèìåð, åñëè ìû íàïðàâëÿåì òóäà 5000, òî ïîëó÷àåì ÷àñòîòó, ñëåäîâàíèÿ èìïóëüñîâ.
1,190,000/5000 = 238 Ãö,
êîòîðàÿ íåìíîãî íèæå ñðåäíåãî çâóêà ñè (íîòà, à íå âåðñèè áîëåå íèçêîãî êëàññà ðàññìàòðèâàåìîãî ÿçûêà). Åñëè ìû çíàåì, êàêàÿ ÷àñòîòà freq íàì íóæíà, ìîæíî âû÷èñëèòü òðåáóåìûé äåëèòåëü, ñêàæåì, òàê:
divisor = 1,190,000/freq;
Íàøà ôóíêöèÿ ïîçâîëÿåò ñäåëàòü ýòî, â ñâÿçè ñ ÷åì íàì íóæíî òîëüêî çíàòü, êàê ïîäàòü çíà÷åíèå ïåðåìåííîé divisor íà óñòðîéñòâî 8253. Òåïåðü òðåáóåòñÿ èñïîëüçîâàòü åùå äâà ïîðòà.
Ïåðâûé øàã çàêëþ÷àåòñÿ â óñòàíîâêå òàéìåðà 8253 â ïðàâèëüíûé ðàáî÷èé ðåæèì äëÿ ïðèåìà äåëèòåëÿ. Ýòî äîñòèãàåòñÿ ïîñûëêîé çíà÷åíèÿ 182 (0´Â6 â øåñòíàäöàòåðè÷íîì êîäå) ÷åðåç ïîðò 67. Êàê òîëüêî òàêàÿ ïîñûëêà áóäåò âûïîëíåíà, ìîæíî èñïîëüçîâàòü ïîðò 66 äëÿ ïåðåäà÷è äåëèòåëÿ.
Ïîñûëêà äåëèòåëÿ ïðåäñòàâëÿåò ñîáîé íåñëîæíóþ çàäà÷ó. Ñàì äåëèòåëü ÿâëÿåòñÿ 16-ðàçðÿäíûì ÷èñëîì, íî åãî ñëåäóåò ïåðåäàâàòü äâóìÿ ÷àñòÿìè. Ñíà÷àëà ìû ïîñûëàåì ìëàäøèé áàéò, èëè ïîñëåäíèå 8 ðàçðÿäîâ ÷èñëà, à çàòåì ñòàðøèé áàéò, ò.å. íà÷àëüíûå 8 ðàçðÿäîâ ÷èñëà.  ñëåäóþùåé ïðîãðàììå ìû íàçûâàåì ýòè ÷àñòè lobyt è hibyt è âû÷èñëÿåì èõ çíà÷åíèÿ ÷åðåç divisor:
Lobyt = divisor % 256;
Hibyt = divisor % 256;
Ìîæíî òàêæå èñïîëüçîâàòü ïîðàçðÿäíûå îïåðàöèè:
Lobyt = divisor & 255;
Hibyt = divisor >> 8;
Ïåðâûé îïåðàòîð â êàæäîé ïàðå ñòðîê ïðèìåðîâ óñòàíàâëèâàåò ïåðâûå âîñåìü ðàçðÿäîâ â 0, îñòàâëÿÿ â ïîñëåäíèõ âîñüìè ðàçðÿäàõ ïåðâîãî áàéòà ÷èñëî. Ïðîâåðüòå ðåçóëüòàòû îïåðàöèåé ïîëó÷åíèÿ ìîäóëÿ è ïîðàçðÿäíîé îïåðàöèåé È, ÷òîáû óâèäåòü, êàê ýòî äåëàåòñÿ. Âòîðîé îïåðàòîð êàæäîé ïàðû áåðåò èñõîäíîå çíà÷åíèå divisor è ñäâèãàåò åãî íà 8 ïîçèöèé âïðàâî (÷òî ýêâèâàëåíòíî äåëåíèþ íà 28, èëè íà 256). Âîñåìü ëåâûõ ðàçðÿäîâ óñòàíàâëèâàþòñÿ â 0, ñîõðàíÿÿ 8-ðàçðÿäíîå ÷èñëî, ñîäåðæàùåå èñõîäíûå çíà÷åíèÿ âîñüìè ëåâûõ ðàçðÿäîâ.
Íèæå ïîêàçàíà òàêàÿ ôóíêöèÿ öåëèêîì:
/* tone(freq, time) -- óñòàíàâëèâàåò çâóê çàäàííîé ÷àñòîòû è ïðîäîëæèòåëüíîñòè */
#define TIMERMODE 182 /* êîä óñòàíîâêè òàéìåðà â íóæíûé ðåæèì */
#define FREQSCALE 119000L /* áàçîâàÿ ÷àñòîòà â ãåðöàõ */
#define TIMESCALE 1230L /* ÷èñëî îòñ÷åòîâ âðåìåíè â 0,1 ñ */
#define T_MODEPORT 67 /* ïîðò óïðàâëÿåò ðåæèìîì ðàáîòû òàéìåðà */
#define FREQPORT 66 /* ïîðò ðåãóëèðóåò ÷àñòîòó çâóêà*/
#define BEEPPORT 97 /* ïîðò óïðàâëÿåò ãðîìêîãîâîðèòåëåì */
#define ON 97 /* ñèãíàë âêëþ÷åíèÿ ãðîìêîãîâîðèòåëÿ */
Tone(freq, time).
Int freq, time;
{
Int hibyt, lobyt, port;
Long i, count, divisor;
Divisor = FREQSCALE/freq; /* ìàñøòàáèðîâàíèå ÷àñòîòû â åäèíèöàõ òàéìåðà */
Lobyt = divisor % 256; /* ðàçáèâàåò öåëîå */
Hibyt = divisor / 256; /* íà äâà áàéòà */
Count = TIMESCALE * time; /* ïðåîáðàçóåò âðåìÿ â åäèíèöû òàéìåðà */
Outp(T_MODEPORT, TIMERMODE); /* ïîäãîòàâëèâàåò òàéìåð ê ââîäó */
Outp(FREQPORT, lobyt); /* óñòàíàâëèâàåò ìëàäøèé áàéò ðåãèñòðà òàéìåðà */
Outp(FREQPORT, hibyt); /* óñòàíàâëèâàåò ñòàðøèé áàéò ðåãèñòðà òàéìåðà */
Port = inp(BEEPPORT); /* çàïîìèíàåò ñîñòîÿíèå ïîðòà */
Outp(BEEPPORT, ON) /* âêëþ÷àåò ãðîìêîãîâîðèòåëü */
For(i = 0, i < count; i++).
; /* îòìåòêà çàäåðæêè */
Outp(BEEPPORT, port); /* âûêëþ÷àåò Ãðîìêîãîâîðèòåëü, âîññòàíàâëèâàåò ñîñòîÿíèå */
Ìû îïðåäåëÿåì TIMESCALE â äèðåêòèâå #define êàê öåëîå òèï long, ïîòîìó ÷òî âû÷èñëåíèå TIMESCALE * time áóäåò âûïîëíÿòüñÿ äëÿ òèïà long, à íå int. Èíà÷å ðåçóëüòàò, åñëè îí áîëüøå 32767 áóäåò óñåêàòüñÿ ïåðåä çàíåñåíèåì â count.
Èñïîëüçîâàíèå ôóíêöèè tînå( ).
Íàøà ôóíêöèÿ tone( ) â çíà÷èòåëüíîé ñòåïåíè äóáëèðóåò äåéñòâèå îïåðàòîðà SOUND ÿçûêà Áåéñèê äëÿ êîìïüþòåðà IBM PC Çäåñü ìû èñïîëüçóåì åå äëÿ ñîçäàíèÿ äîâîëüíî îãðàíè÷åííîé ( 8 íîò, îäíà îêòàâà) êëàâèàòóðû, â êîòîðîé èñïîëüçóþòñÿ 8 êëàâèøåé, íà÷èíàÿ ñ À, äëÿ âîñïðîèçâåäåíèÿ íîò. Íèæå ïðèâåäåíà ñîîòâåòñòâóþùàÿ ïðîãðàììà, à òàêæå íåêîòîðûå ïîÿñíåíèÿ ê íåé.
/* ïðîñòàÿ ìóçûêàëüíàÿ êëàâèàòóðà */
#include <conio.h> /* èñïîëüçóåò íåáóôñðèçîâàííûé ââîä-âûâîä */
#include <ctype.h>
#define Ñ 262 /* îïðåäåëÿåò ÷àñòîòû */
#define D 294.
#define E 330.
#define F 349.
#define G 392.
#define À 440.
#define  494.
#define C2 524.
Main( ).
{
Int key, freq, tempo, time;
Puts(" Ââåäèòå, ïîæàëóéñòà, îñíîâíîé òåìï: 10 = 1 ñ.");
Scanf(" %d", &tempo);
Printf(" %d \n \r", tempo); /* ýõî-ââîä */
Puts(" Ñïàñèáî. Èñïîëüçóéòå êëàâèøè à - k äëÿ âîñïðîèçâåäåíèÿ íîò.\n\r");
Puts(" Êëàâèøà ïåðåêëþ÷åíèÿ ðåãèñòðà óäâàèâàåò ïðîäîëæèòåëüíîñòü çâó÷àíèÿ.
Ñèìâîë ! ïðåêðàùàåò ðàáîòó.");
While((key = getchar( )) != '!').
{ time = isupper(key)? 2 * tempo : tempo;
key = tolower(key);
switch (key) {
case 'a' : tone(C, time);
break;
case 's' : tone(D, time);
break;
case 'd' : tone(E, time);
break;
case 'f' : tone(E, time);
break;
case 'g' : tone(G, time);
break;
case 'h' : tone(A, time);
break;
case 'j' : tone(B, time);
break;
case 'k' : tone(C2, time);
break;
default : break; }.
}
Ðuts("Äî ñâèäàíèÿ!\n\r");
} }
Ãëàâíîé îñîáåííîñòüþ ñîçäàííîé ïðîãðàììû ÿâëÿåòñÿ îïåðàòîð switch, êîòîðûé ïðèñâàèâàåò ðàçíûå çâóêè âîñüìè êëàâèøàì îò À äî Ê. Êðîìå òîãî, ïðîãðàììà óäâàèâàåò ïðîäîëæèòåëüíîñòü çâó÷àíèÿ íîòû, åñëè âû èñïîëüçóåòå âåðõíèé ðåãèñòð. Ýòà ïðîäîëæèòåëüíîñòü (time) óñòàíàâëèâàåòñÿ ïåðåä îïåðàòîðîì switch, çàòåì âåðõíèé ðåãèñòð ïåðåêëþ÷àåòñÿ íà íèæíèé, ÷òîáû ñîêðàòèòü ÷èñëî íåîáõîäèìûõ ìåòîê.
Âòîðàÿ âàæíàÿ îñîáåííîñòü çàêëþ÷àåòñÿ â òîì, ÷òî ìû èñïîëüçóåì çàãîëîâî÷íûé ôàéë conio.h. Ýòîò ôàéë ñîäåðæèò äèðåêòèâû #define, êîòîðûå çàìåíÿþò îáû÷íûå ôóíêöèè ââîäà-âûâîäà [òàêèå, êàê getchar( )] íà âåðñèè "ïóëüòîâîãî ââîäà-âûâîäà", ÿâëÿþùèåñÿ íå áóôåðèçîâàííûìè. È â ðåçóëüòàòå, åñëè âû íàæèìàåòå, ñêàæåì, êëàâèøó [à], íåìåäëåííî çâó÷èò íîòà, è âàì íå íóæíî íàæèìàòü êëàâèøó [ââîä]. Ìåæäó ïðî÷èì, ýòè ôóíêöèè íå òîëüêî íå âûïîëíÿþò ýõî-ïå÷àòü, íî è íå íà÷èíàþò àâòîìàòè÷åñêè íîâóþ ñòðîêó. Ïîýòîìó ìû âñòàâèëè îïåðàòîð printf( ) äëÿ ýõî-ïå÷àòè ââîäèìîé ïåðåìåííîé tempo è èñïîëüçîâàëè ñèìâîëû \n è \r äëÿ ïåðåìåùåíèÿ êóðñîðà íà íîâóþ ñòðîêó è âîçâðàòà åãî ê ëåâîé ñòîðîíå ýêðàíà. Åñëè âû õîòèòå, ÷òîáû ñèìâîëû, êîòîðûå ñîîòâåòñòâóþò íàæèìàåìûì êëàâèøàì, îòîáðàæàëèñü îäíîâðåìåííî íà ýêðàíå, âñòàâüòå.
Putchar(key);
 ïðîãðàììó.
Õîòÿ ââîä íå áóôåðèçîâàí, êëàâèàòóðà èìååò ñâîé ñîáñòâåííûé áóôåð. Ýòî ïîçâîëÿåò âàì, åñëè âû õîòèòå, çàðàíåå íàáèðàòü âñå òðåáóåìûå ñèìâîëû. À íîòû áóäóò çâó÷àòü â ñîáñòâåííîì óñòîé÷èâîì òåìïå. Âîò, ïðèìåð, íà÷àëî ìåëîäèè "Ðàäîñòü ìèðà".
KjhGfdsA.
Ïðåäîñòàâëÿåì âàì âîçìîæíîñòü çàêîí÷èòü ýòó ìåëîäèþ.
ÏÐÈËÎÆÅÍÈÅ È. ÐÀÑØÈÐÅÍÈÅ ßÇÛÊÀ ÑÈ.
Âåðñèÿ 7 ÎÑ UNIX ïðåäîñòàâëÿåò äâà âàæíûõ ðàñøèðåíèÿ ÿçûêà Ñè. Ïåðâîå çàêëþ÷àåòñÿ â òîì, ÷òî ìîæíî èñïîëüçîâàòü ñàìó ñòðóêòóðó (à íå òîëüêî àäðåñ èëè ýëåìåíò ñòðóêòóðû) â êà÷åñòâå àðãóìåíòà ôóíêöèè. Âòîðîå ðàñøèðåíèå ïîçâîëÿåò èñïîëüçîâàòü íîâóþ ôîðìó äàííûõ, íàçûâàåìóþ "ïåðå÷èñëèìûé òèï äàííûõ". Òåïåðü ðàññìîòðèì ýòè ðàñøèðåíèÿ.
Ñòðóêòóðû â êà÷åñòâå àðãóìåíòîâ ôóíêöèè.
 íå ðàñøèðåííîì ÿçûêå Ñè ìîæíî ïåðåäàâàòü ôóíêöèè àäðåñ ñòðóêòóðû. Íàïðèìåð, åñëè montana ÿâëÿåòñÿ ñòðóêòóðíîé ïåðåìåííîé ñòðóêòóðíîãî òèïà player, ìû ìîæåì îáðàòèòüñÿ ê ôóíêöèè ñëåäóþùèì îáðàçîì:
Stats(&montana);
Ôóíêöèÿ stats( ) áóäåò èìåòü ïðèìåðíî òàêîé çàãîëîâîê:
Stat(name) struct player * name;
Ïîñëå âûçîâà ôóíêöèè óêàçàòåëü name áóäåò ññûëàòüñÿ íà ñòðóêòóðó montana è ôóíêöèÿ áóäåò èñïîëüçîâàòü montana â ñâîèõ ìàíèïóëÿöèÿõ.
 ðàñøèðåííîì ÿçûêå Ñè ìû ìîæåì ïðèìåíÿòü èìÿ ñàìîé ñòðóêòóðû â êà÷åñòâå àðãóìåíòà, è ýòî ïðèâåäåò ê ñîçäàíèþ êîïèè èñõîäíîé ñòðóêòóðû â ñîñòàâå âûçâàííîé ôóíêöèè. Íàïðèìåð, îáðàùåíèå ê òîé èëè èíîé ôóíêöèè ìîæåò âûãëÿäåòü ïðèìåðíî òàê:
Stats(montana);
Òåïåðü ôóíêöèÿ stats( ) äîëæíà èìåòü íåñêîëüêî èíîé çàãîëîâîê:
Stats(name) struct player name;
Íà ýòîò ðàç ïîñëå âûçîâà ôóíêöèè ñîçäàåòñÿ íîâàÿ ñòðóêòóðíàÿ ïåðåìåííàÿ òèïà player. Íîâàÿ ïåðåìåííàÿ ïîëó÷àåò íàçâàíèå name, è êàæäûé ýëåìåíò name èìååò òàêîå æå çíà÷åíèå, êàê è ñîîòâåòñòâóþùèé ýëåìåíò ñòðóêòóðû montana.
Ýòî ðàñøèðåíèå ïîçâîëÿåò ôóíêöèè èìåòü ñâîþ "ëè÷íóþ" êîïèþ ñòðóêòóðû òî÷íî òàê æå, êàê îíà îáû÷íî èìååò ñâîè êîïèè ñòàíäàðòíûõ ïåðåìåííûõ. Ïðåèìóùåñòâî çäåñü òî æå, ÷òî è ðàíüøå: ñòðóêòóðû íå èçìåíÿþòñÿ íåîáúÿñíèìî èç-çà íåïðåäâèäåííîãî ïîáî÷íîãî âîçäåéñòâèÿ ôóíêöèè.
Áóäüòå îñòîðîæíû: Íåêîòîðûå êîìïèëÿòîðû äîïóñêàþò îáðàùåíèå âèäà.
Stats(montana);
Íî íà ñàìîì äåëå èíòåðïðåòèðóþò åãî êàê.
Stats(&montana);
 ýòîì ñëó÷àå ïåðåäàåòñÿ àäðåñ, è ôóíêöèÿ ðàáîòàåò ñ ñàìîé èñõîäíîé ñòðóêòóðíîé ïåðåìåííîé, à íå ñ åå êîïèåé.
Ïåðå÷èñëèìûå òèïû.
Êëþ÷åâîå ñëîâî enum ïîçâîëÿåò ñîçäàâàòü íîâûé òèï è îïðåäåëÿòü çíà÷åíèÿ, êîòîðûå îí ìîæåò èìåòü. Ïðèâåäåì ïðèìåð:
Enum spectrum (red, orange, yellow, green, blue, violet);
Enum spectrum color;
Ïåðâûé îïåðàòîð îáúÿâëÿåò íîâûé òèï: spectrum. Îí ïåðå÷èñëÿåò òàêæå âîçìîæíûå çíà÷åíèÿ ïåðåìåííûõ òèïà spectrum: red, orange è ò. ä. Îíè ÿâëÿþòñÿ êîíñòàíòàìè òèïà spectrum òàê æå, êàê 4 ÿâëÿåòñÿ êîíñòàíòîé òèïà int, a 'g' - êîíñòàíòîé òèïà char.
Âòîðîé îïåðàòîð îáúÿâëÿåò color ïåðåìåííîé òèïà spectrum. Âû ìîæåòå ïðèñâîèòü ïåðåìåííîé color ëþáóþ êîíñòàíòó òèïà spectrum; íàïðèìåð:
Color = green;
Íà ïåðâûé âçãëÿä òèïû enum ìîãóò ïîêàçàòüñÿ ïîõîæèìè íà îïðåäåëåííûå ïîëüçîâàòåëåì ïîðÿäêîâûå òèïû ÿçûêà Ïàñêàëü. Äåéñòâèòåëüíî, ñõîäñòâî åñòü, íî åñòü è ñóùåñòâåííûå ðàçëè÷èÿ, ïîýòîìó, åñëè âû çíàåòå Ïàñêàëü, òî íñ ïðèäåòå ê òàêîìó çàêëþ÷åíèþ.
Ðàññìîòðèì õàðàêòåð ýòèõ íîâûõ êîíñòàíò è îïåðàöèé, êîòîðûå ìîæíî âûïîëíÿòü ñ èñïîëüçîâàíèåì ïåðåìåííûõ òèïà.
Enum êîíñòàíòû.
Êàê êîìïüþòåð çàïîìèíàåò ÷òî-íèáóäü ïîäîáíîå red? Îí ìîæåò ðàññìàòðèâàòü ýòî êàê ñèìâîëüíóþ ñòðîêó, íî ó íåå íåò êàâû÷åê. È äåéñòâèòåëüíî, red è äðóãèå enum êîíñòàíòû çàïîìèíàþòñÿ êàê öåëûå ÷èñëà. Íàïðèìåð, ïîïðîáóéòå âûïîëíèòü.
Printf("red = %d, orange = %d\n", red, orange);
È ñ ó÷åòîì âûøåóêàçàííûõ îïèñàíèè âû ïîëó÷èòå òàêîé ðåçóëüòàò:
Red = 0, orange = 1.
Ïî ñóùåñòâó ïåðåìåííàÿ red è åå "ñåñòðû" äåéñòâóþò êàê ñèíîíèìû öåëûõ ÷èñåë îò 0 äî 5. Ðåçóëüòàò ïîäîáåí èñïîëüçîâàíèþ.
#define red 0.
Çà èñêëþ÷åíèåì òîãî, ÷òî ñîîòâåòñòâèå, óñòàíîâëåííîå ïðè ïîìîùè îïåðàòîðà enum áîëåå îãðàíè÷åííî. Íàïðèìåð, åñëè index ÿâëÿåòñÿ ïåðåìåííîé òèïà int, òî îáà íèæåñëåäóþùèõ îïåðàòîðà íåäîïóñòèìû:
Index = blue; /* íåñîîòâåòñòâèå òèïà */
Color = 3; /* íåñîîòâåòñòâèå òèïà */
Ïîçæå ìû ðàññìîòðèì äðóãèå îãðàíè÷åíèÿ ïðè èñïîëüçîâàíèè êîíñòàíò è ïåðåìåííûõ òèïà enum. Ñíà÷àëà áîëåå âíèìàòåëüíî ðàññìîòðèì çíà÷åíèÿ êîíñòàíò òèïà enum.
Çíà÷åíèÿ ïî óìîë÷àíèþ.
Íàø ïðèìåð ïðîèëëþñòðèðîâàë ïðèñâàèâàíèå êîíñòàíòàì çíà÷åíèé ïî óìîë÷àíèþ. Êîíñòàíòàì, ïîÿâëÿþùèìñÿ â îïèñàíèè enum, ïðèñâàèâàþòñÿ öåëûå ÷èñëà 0, 1, 2 è ò. ä. â ïîðÿäêå èõ ðàñïîëîæåíèÿ. Òàê, îïèñàíèå.
Enum kids {nippy, slats, skip, nana, liz};
Ïðèñâàèâàåò nànà çíà÷åíèå 3.
Ïðèñâîåííûå çíà÷åíèÿ.
Ìîæíî âûáèðàòü çíà÷åíèÿ, êîòîðûå âû õîòèòå ïðèñâîèòü êîíñòàíòàì, íî îíè äîëæíû áûòü öåëîãî òèïà (âêëþ÷àÿ char). Äëÿ ýòîãî âêëþ÷èòå æåëàåìûå çíà÷åíèÿ â îïèñàíèå:
Enum levels {low = 100, medium = 500, high = 2000};
Åñëè âû ïðèñâàèâàåòå êàêîå-ëèáî çíà÷åíèå îäíîé êîíñòàíòå è íå ïðèñâàèâàåòå íè÷åãî êîíñòàíòàì, ñëåäóþùèì çà íåé, òî èì áóäóò ïðèñâîåíû ïîñëåäîâàòåëüíûå çíà÷åíèÿ, èäóùèå çà ÿâíî ïðèñâîåííûì çíà÷åíèåì. Íàïðèìåð,
Enum feline {cat = 20, tiger, lion, puma};
Ïðèñâàèâàåò ïåðåìåííîé tiger çíà÷åíèå 21, ïåðåìåííîé lion - çíà÷åíèå 22 è puma - çíà÷åíèå 23.
Îïåðàöèè.
Òåïåðü ðàññìîòðèì, ÷òî ìîæíî è íåëüçÿ äåëàòü ñ âåëè÷èíàìè òèïà enum.
Âû ìîæåòå ïðèñâîèòü êîíñòàíòó òèïà enum ïåðåìåííîé òîãî æå òèïà.
Enum feline pet;
Pet = tiger;
Íåëüçÿ èñïîëüçîâàòü äðóãèå îïåðàöèè ïðèñâàèâàíèÿ:
Pet += cat; /* íåäîïóñòèìî */
Ìîæíî ïðîâåñòè ñðàâíåíèå ñ öåëüþ âûÿâëåíèÿ ðàâåíñòâà èëè íåðàâåíñòâà:
If ( per = = cat) ...
If ( color ! = violet)...
Íåëüçÿ èñïîëüçîâàòü äðóãèå îïåðàöèè îòíîøåíèÿ:
If(color > yellow) /* íåäîïóñòèìî */
Ìîæíî ïðèìåíÿòü àðèôìåòè÷åñêèå îïåðàöèè ê êîíñòàíòàì òèïà enum:
Color = red + blue;
Pet = puma * lion;
Èìåþò ëè òàêèå âûðàæåíèÿ êàêîé-òî ñìûñë - ýòî óæå äðóãîé âîïðîñ.
Íåëüçÿ èñïîëüçîâàòü àðèôìåòè÷åñêèå îïåðàöèè äëÿ ïåðåìåííûõ òèïà enum:
Color = color + green; /* íåäîïóñòèìî */
Íåëüçÿ èñïîëüçîâàòü îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ:
Color++ ; /* íåäîïóñòèìî */
Íåëüçÿ èñïîëüçîâàòü êîíñòàíòó òèïà enum äëÿ èíäåêñà ìàññèâà:
Marbles[red] = 23; /* íåäîïóñòèìî */
ÏÐÈÌÅÍÅÍÈÅ.
Îñíîâíàÿ ïðè÷èíà èñïîëüçîâàíèÿ òèïà enum çàêëþ÷àåòñÿ â óëó÷øåíèè ÷èòàåìîñòè ïðîãðàìì. Åñëè âû èìååòå äåëî ñ íåêîòîðûì âèäîì öâåòîâûõ êîäîâ, òî èñïîëüçîâàíèå red è blue ÷òî îáû÷íî òèïû enum ïðåäíàçíà÷åíû äëÿ èñïîëüçîâàíèÿ âíóòðè ïðîãðàììû, à íå äëÿ ââîäà-âûâîäà. Íàïðèìåð, åñëè âû õîòèòå ââåñòè çíà÷åíèå äëÿ ïåðåìåííîé color òèïà spectrum, òî äîëæíû áûëè áû ââåñòè, ñêàæåì, öåëîå ÷èñëî 1, à íå ñëîâî orange. (Êîíå÷íî, ìîæíî áûëî áû ñîçäàòü ôóíêöèþ ââîäà, êîòîðàÿ âîñïðèíÿëà áû ñòðîêó "orange" è çàòåì ïðåîáðàçîâàëà áû åå â öåëîå ÷èñëî orange.)
ÏÐÈËÎÆÅÍÈÅ Ê. ÒÀÁËÈÖÀ ÊÎÄÎÂ ASCII.
×èñëîâûå ïðåîáðàçîâàíèÿ
×èñëîâûå ïðåîáðàçîâàíèÿ äåñÿòè÷íîå - øåñòíàäöàòåðè÷íîå - âîñüìåðè÷íîå - äâîè÷íîå - ASCII.
| Äåñÿòåðè÷íîå | Øåñòíàäöàòåðè÷íîå | Âîñüìåðè÷íîå | Äâîè÷íîå | ASCII | Êëþ÷* |
| X10 | X16 | X8 | PXx | ||
| 0 | 0 | 0 | 0 | NUL | CTRL/I |
| 1 | 1 | 1 | 10000001 | SOH | CTRL/A |
| 2 | 2 | 2 | 10000010 | STX | CTRL/B |
| 3 | 3 | 3 | 11 | ÅÒÕ | CTRL/C |
| 4 | 4 | 4 | 10000100 | EOT | CTRL/D |
| 5 | 5 | 5 | 101 | ENQ | CTRL/E |
| 6 | 6 | 6 | 110 | ÀÑÊ | CTRL/F |
| 7 | 7 | 7 | 10000111 | BEL | CTRL/G |
| 8 | 8 | 10 | 10001000 | BS | ÑÒRL/Í,âîçâðàò |
| 9 | 9 | 11 | 1001 | HT | CTRL/I,òàáóëÿöèÿ |
| 10 | 0À | 12 | 1010 | LF | CTRL/J,íîâàÿ ñòðîêà |
| 11 | 0B | 13 | 10001011 | VT | CTRL/K |
| 12 | 0Ñ | 14 | 1100 | FF | CTRL/L |
| 13 | 0D | 15 | 10001101 | CR | CTRL/M,âîçâðàò |
| 14 | 0E | 16 | 10001110 | SO | CTRL/N |
| 15 | 0F | 17 | 1111 | SI | CTRL/O |
| 16 | 10 | 20 | 10010000 | DLE | CTRL/P |
| 17 | 11 | 21 | 10001 | C1 | CTRL/Q |
| 18 | 12 | 22 | 10010 | DC2 | CTRL/R |
| 19 | 13 | 23 | 10010011 | DC3 | CTRL/S |
| 20 | 14 | 24 | 10100 | DC4 | CTRL/T |
| 21 | 15 | 25 | 10010101 | NAK | CTRL/U |
| 22 | 16 | 26 | 10010110 | SYN | CTRL/V |
| 23 | 17 | 27 | 10111 | TB | CTRL/W |
| 24 | 18 | 30 | 11000 | CAN | CTRL/X |
| 25 | 19 | 31 | 10011001 | EM | CTRL/Y |
| 26 | 1A | 32 | 10011010 | SUB | CTRL/Z |
| 27 | 1B | 33 | 11011 | ESC | ESC,âîçâðàò |
| 28 | 1Ñ | 34 | 10011100 | FS | ÑÒRL< |
| 29 | 1D | 35 | 11101 | GS | CTRL/ |
| 30 | 1E | 36 | 11110 | RS | CTRL/= |
| 31 | 1F | 37 | 10011111 | US | ÑÒRL/- |
| 32 | 20 | 40 | 10100000 | SP | Ïðîáåë |
| 33 | 21 | 41 | 100001 | ! | ! |
| 34 | 22 | 42 | 100010 | " | " |
| 35 | 23 | 43 | 10100011 | # | # |
| 36 | 24 | 44 | 100100 | $ | $ |
| 37 | 25 | 45 | 10100101 | ½ | ½ |
| 38 | 26 | 46 | 10100110 | & | & |
| 39 | 27 | 47 | 100111 | ' | ' |
| 40 | 28 | 50 | 101000 | ( | ( |
| 41 | 29 | 51 | 10101001 | ) | ) |
| 42 | 2À | 52 | 10101010 | * | * |
| 43 | 2Â | 53 | 101011 | + | + |
| 44 | 2Ñ | 54 | 10101100 | ' | ' |
| 45 | 2D | 55 | 101101 | - | - |
| 46 | 2Å | 56 | 101110 | . | . |
| 47 | 2F | 57 | 10101111 | / | / |
| 48 | 30 | 60 | 110000 | 0 | 0 |
| 49 | 31 | 61 | 10110001 | 1 | 1 |
| 50 | 32 | 62 | 10110010 | 2 | 2 |
| 51 | 33 | 63 | 110011 | 3 | 3 |
| 52 | 34 | 64 | 10110100 | 4 | 4 |
| 53 | 35 | 65 | 110101 | 5 | 5 |
| 54 | 36 | 66 | 110110 | 6 | 6 |
| 55 | 37 | 67 | 10110111 | 7 | 7 |
| 56 | 38 | 70 | 10111000 | 8 | 8 |
| 57 | 39 | 71 | 111001 | 9 | 9 |
| 58 | 3À | 72 | 111010 | : | : |
| 59 | 3Â | 73 | 10111011 | ; | ; |
| 60 | 3Ñ | 74 | 111100 | < | < |
| 61 | 3D | 75 | 10111101 | = | = |
| 62 | 3Å | 76 | 10111110 | > | > |
| 63 | 3F | 77 | 111111 | ? | ? |
| 64 | 40 | 100 | 11000000 | @ | @ |
| 65 | 41 | 101 | 1000001 | À | À |
| 66 | 42 | 102 | 1000010 | â | â |
| 67 | 43 | 103 | 11000011 | ñ | ñ |
| 68 | 44 | 104 | 1000100 | D | D |
| 69 | 45 | 105 | 11000101 | Å | Å |
| 70 | 46 | 106 | 11000110 | F | F |
| 71 | 47 | 107 | 1000111 | G | G |
| 72 | 48 | 110 | 1001000 | í | Í |
| 73 | 49 | 111 | 11001001 | I | I |
| 74 | 4A | 112 | 11001010 | J | J |
| 75 | 4Â | 113 | 1001011 | ê | Ê |
| 76 | 4Ñ | 114 | 11001100 | L | L |
| 77 | 4D | 115 | 1001101 | M | M |
| 78 | 4Í | 116 | 1001110 | N | N |
| 79 | 4F | 117 | 11001111 | 0 | 0 |
| 80 | 50 | 120 | 1010000 | P | Ð |
| 81 | 51 | 121 | 11010001 | Q | Q |
| 82 | 52 | 122 | 11010010 | R | R |
| 83 | 53 | 123 | 1010011 | S | S |
| 84 | 53 | 124 | 11010100 | T | Ò |
| 85 | 55 | 125 | 1010101 | U | U |
| 86 | 56 | 126 | 1010110 | V | V |
| 87 | 57 | 127 | 11010111 | W | W |
| 88 | 58 | 130 | 11011000 | X | X |
| 89 | 59 | 131 | 1011001 | Y | Y |
| 90 | 5À | 132 | 1011010 | Z | Z |
| 91 | 5Â | 133 | 11011011 | [ | [ |
| 92 | 5Ñ | 134 | 1011100 | / | / |
| 93 | 5D | 135 | 11011101 | ] | ] |
| 94 | 5Å | 136 | 11011110 | ^ | ^ |
| 95 | 5F | 137 | 1011111 | - | - |
| 96 | 60 | 140 | 1100000 | . | . |
| 97 | 61 | 141 | 11100001 | a | a |
| 98 | 62 | 142 | 11100010 | b | b |
| 99 | 63 | 143 | 1100011 | ñ | c |
| 100 | 64 | 144 | 11100100 | d | d |
| 101 | 65 | 145 | 1100101 | å | å |
| 102 | 66 | 146 | 1100110 | f | f |
| 103 | 67 | 147 | 11100111 | g | g |
| 104 | 68 | 150 | 11101000 | h | h |
| 105 | 69 | 151 | 1101001 | i | I |
| 106 | 6À | 152 | 1101010 | j | j |
| 107 | 6Â | 153 | 11101011 | k | k |
| 108 | 6Ñ | 154 | 1101100 | l | 1 |
| 109 | 6D | 155 | 11101101 | m | m |
| 110 | 6Å | 156 | 11101110 | n | n |
| 111 | 6F | 157 | 1101111 | o | î |
| 112 | 70 | 160 | 11110000 | p | p |
| 113 | 71 | 161 | 1110001 | q | q |
| 114 | 72 | 162 | 1110010 | r | r |
| 115 | 73 | 163 | 11110011 | s | s |
| 116 | 74 | 164 | 1110100 | t | t |
| 117 | 75 | 165 | 11110101 | u | u |
| 118 | 76 | 166 | 11110110 | v | v |
| 119 | 77 | 167 | 1110111 | w | w |
| 120 | 78 | 170 | 1111000 | x | x |
| 121 | 79 | 171 | 11111001 | y | y |
| 122 | 7A | 172 | 11111010 | z | z |
| 123 | 7B | 173 | 1111011 | R | R |
| 124 | 7Ñ | 174 | 11111100 | / | / |
| 125 | 7D | 175 | 1111101 | T | T |
| 126 | 7Å | 176 | 1111110 | ~ | ~ |
| 127 | 7F | 177 | 11111111 | DEL | DEL,îòìåíà ñèìâîëà |
Ñîäåðæàíèå.
- 1. Âñòóïëåíèå.
- ÏÐÎÈÑÕÎÆÄÅÍÈÅ ßÇÛÊÀ ÑÈ.
- ÄÎÑÒÎÈÍÑÒÂÀ ßÇÛÊÀ ÑÈ.
- ÁÓÄÓÙÅÅ ßÇÛÊÀ ÑÈ.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ßÇÛÊÀ ÑÈ.
- Èñïîëüçîâàíèå òåêñòîâîãî ðåäàêòîðà äëÿ ïîäãîòîâêè ïðîãðàììû.
- Èñõîäíûå ôàéëû è âûïîëíÿåìûå ôàéëû.
- Êîìïèëÿöèÿ Ñè-ïðîãðàììû â ÎÑ UNIX.
- Êîìïèëÿöèÿ Ñè-ïðîãðàììû íà IBM PC. (êîìïèëÿòîðû Microsoft Ñ è Lattice Ñ).
- Àëüòåðíàòèâíûé ñïîñîá òðàíñëÿöèè.
- Ïî÷åìó êîìïèëÿöèÿ?
- ÍÅÊÎÒÎÐÛÅ ÑÎÃËÀØÅÍÈß.
- Âèä øðèôòà.
- Öâåò.
- Óñòðîéñòâî ââîäà-âûâîäà.
- Ôóíêöèîíàëüíûå êëàâèøè.
- Íàøà âû÷èñëèòåëüíàÿ ñèñòåìà.
- ÑÎÂÅÒ.
- 2. Ââåäåíèå â ÿçûê Ñè.
- ÏÐÈÌÅÐ ÏÐÎÑÒÎÉ ÏÐÎÃÐÀÌÌÛ ÍÀ ßÇÛÊÅ ÑÈ.
- Ïåðâûé ïðîñìîòð: êðàòêèé îáçîð.
- Âòîðîé ïðîñìîòð: äåòàëè.
- ÑÒÐÓÊÒÓÐÀ ÏÐÎÑÒÎÉ ÏÐÎÃÐÀÌÌÛ.
- ÍÅÑÊÎËÜÊÎ ÑÎÂÅÒÎÂ, ÊÀÊ ÑÄÅËÀÒÜ ÏÐÎÃÐÀÌÌÓ ×ÈÒÀÅÌÎÉ.
- ÑËÅÄÓÞÙÈÉ ØÀÃ.
- ÄÎÏÎËÍÈÒÅËÜÍÛÉ ÏÐÈÌÅÐ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- ÓÏÐÀÆÍÅÍÈß.
- 3. Äàííûå, ÿçûê Ñè è âû.
- ÄÀÍÍÛÅ: ÏÅÐÅÌÅÍÍÛÅ È ÊÎÍÑÒÀÍÒÛ.
- ÄÀÍÍÛÅ: ÒÈÏÛ ÄÀÍÍÛÕ.
- Öåëûå ÷èñëà.
- ×èñëà ñ ïëàâàþùåé òî÷êîé.
- ÒÈÏÛ ÄÀÍÍÛÕ Â ßÇÛÊÅ ÑÈ.
- Òèïû int, short è long.
- Îïèñàíèå äàííûõ öåëîãî òèïà.
- Öåëûå êîíñòàíòû.
- Èíèöèàëèçàöèÿ ïåðåìåííûõ öåëîãî òèïà.
- Ðåêîìåíäàöèè.
- Òèï äàííûõ unsigned.
- Òèï äàííûõ char.
- Îïèñàíèå ñèìâîëüíûõ ïåðåìåííûõ.
- Ñèìâîëüíûå êîíñòàíòû.
- Ïðîãðàììà.
- Òèïû äàííûõ float è double.
- Îïèñàíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé.
- Êîíñòàíòû ñ ïëàâàþùåé òî÷êîé.
- Ïåðåïîëíåíèå è ïîòåðÿ çíà÷èìîñòè ïðè îáðàáîòêå ÷èñåë ñ ïëàâàþùåé òî÷êîé.
- Ðåçþìå: îñíîâíûå òèïû äàííûõ.
- Öåëûå ÷èñëà ñî çíàêîì.
- Öåëûå ÷èñëà áåç çíàêà.
- Ñèìâîëû.
- Äðóãèå òèïû.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ÒÈÏÎÂ ÄÀÍÍÛÕ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- 4. Ñèìâîëüíûå ñòðîêè äèðåêòèâà #define, ôóíêöèè printf( ) è scanf( ).
- ÑÈÌÂÎËÜÍÛÅ ÑÒÐÎÊÈ - ÂÂÅÄÅÍÈÅ.
- Äëèíà ñòðîêè - ôóíêöèÿ strlen( ).
- ÊÎÍÑÒÀÍÒÛ È ÏÐÅÏÐÎÖÅÑÑÎÐ ßÇÛÊÀ Ñè.
- Íåñêîëüêî çàìå÷àíèé ïî ïîâîäó ôîðìàòà.
- ßçûê Ñè - èñêóñíûé ôîêóñíèê: ñîçäàíèå ïñåâäîèìåí.
- ÈÇÓ×ÅÍÈÅ È ÈÑÏÎËÜÇÎÂÀÍÈÅ ÔÓÍÊÖÈÉ printf( ) È scanf( ).
- Èñïîëüçîâàíèå ôóíêöèè printf( ).
- Ìîäèôèêàòîðû ñïåöèôèêàöèè ïðåîáðàçîâàíèÿ, èñïîëüçóåìûå â ôóíêöèè printf( ).
- Ïðèìåðû.
- Èñïîëüçîâàíèå ôóíêöèè printf( ) äëÿ ïðåîáðàçîâàíèÿ äàííûõ.
- Ïðèìåíåíèå ôóíêöèè scanf( ).
- ÑÎÂÅÒÛ ÏÎ ÏÐÈÌÅÍÅÍÈÞ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- 5. Îïåðàöèè, âûðàæåíèÿ è îïåðàòîðû.
- ÂÂÅÄÅÍÈÅ.
- ÎÑÍÎÂÍÛÅ ÎÏÅÐÀÖÈÈ.
- Îïåðàöèÿ ïðèñâàèâàíèÿ: =
- Îïåðàöèÿ ñëîæåíèÿ: +
- Îïåðàöèÿ âû÷èòàíèÿ: -
- Îïåðàöèÿ èçìåíåíèÿ çíàêà: -
- Îïåðàöèÿ óìíîæåíèÿ: *
- Îïåðàöèÿ äåëåíèÿ: /
- Ïîðÿäîê âûïîëíåíèÿ îïåðàöèé.
- ÍÅÊÎÒÎÐÛÅ ÄÎÏÎËÍÈÒÅËÜÍÛÅ ÎÏÅÐÀÖÈÈ.
- Îïåðàöèÿ äåëåíèÿ ïî ìîäóëþ: %
- Îïåðàöèè óâåëè÷åíèÿ è óìåíüøåíèÿ: ++ è --
- Îïåðàöèÿ óìåíüøåíèÿ: --
- Ñòàðøèíñòâî îïåðàöèé.
- Íå áóäüòå ñëèøêîì óìíûìè.
- ÂÛÐÀÆÅÍÈß È ÎÏÅÐÀÒÎÐÛ.
- Âûðàæåíèÿ.
- Îïåðàòîðû.
- Ñîñòàâíûå îïåðàòîðû (áëîêè).
- Ðåçþìå: âûðàæåíèÿ è îïåðàòîðû.
- ÏÐÅÎÁÐÀÇÎÂÀÍÈÅ ÒÈÏÎÂ.
- Âîò ÷òî ïðîèñõîäèò â ïðîãðàììå.
- Îïåðàöèÿ ïðèâåäåíèÿ.
- Ðåçþìå: îïåðàöèè â ÿçûêå Ñè.
- ÏÐÈÌÅÐ ÏÐÎÃÐÀÌÌÛ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 6. Ôóíêöèè è ïåðåêëþ÷åíèå ââîäà-âûâîäà.
- ÂÂÎÄ È ÂÛÂÎÄ ÎÄÍÎÃÎ ÑÈÌÂÎËÀ: ÔÓÍÊÖÈÈ getchar( ) È putchar( ).
- ÁÓÔÅÐÛ.
- ÑËÅÄÓÞÙÈÉ ØÀÃ.
- ×òåíèå îäíîé ñòðîêè.
- ×òåíèå îäèíî÷íîãî ôàéëà.
- ÏÅÐÅÊËÞ×ÅÍÈÅ È ÐÀÁÎÒÀ Ñ ÔÀÉËÀÌÈ.
- ÎÏÅÐÀÖÈÎÍÍÀß ÑÈÑÒÅÌÀ UNIX.
- Ïåðåêëþ÷åíèå âûâîäà.
- Ïåðåêëþ÷åíèå ââîäà.
- Êîìáèíèðîâàííîå ïåðåêëþ÷åíèå.
- Îïåðàöèîííûå ñèñòåìû, îòëè÷íûå îò ÎÑ UNIX.
- Ðåçþìå: êàê ïåðåêëþ÷àòü ââîä è âûâîä.
- ÑÈÑÒÅÌÍÎ-ÇÀÂÈÑÈÌÛÅ ÑÐÅÄÑÒÂÀ: ÏÎÐÒÛ ÂÂÎÄÀ-ÂÛÂÎÄÀ ÌÈÊÐÎÏÐÎÖÅÑÑÎÐÎÂ INTEL 8086/8088.
- Èñïîëüçîâàíèå ïîðòà.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ÑÊÐÛÒÎÉ ÌÎÙÍÎÑÒÈ (Â ËÎØÀÄÈÍÛÕ ÑÈËÀÕ) ÂÀØÅÃÎ ÊÎÌÏÜÞÒÅÐÀ.
- ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 7. Âûáîð âàðèàíòîâ.
- ÎÏÅÐÀÒÎÐ if.
- ÐÀÑØÈÐÅÍÈÅ ÎÏÅÐÀÒÎÐÀ if Ñ ÏÎÌÎÙÜÞ else.
- Âûáîð: êîíñòðóêöèÿ if-else.
- Ìíîæåñòâåííûé âûáîð: êîíñòðóêöèÿ else-if.
- Îáúåäèíåíèå îïåðàòîðîâ if è else.
- Ðåçþìå: èñïîëüçîâàíèå îïåðàòîðîâ if äëÿ îðãàíèçàöèè âûáîðà èç íåñêîëüêèõ âàðèàíòîâ.
- ×ÒÎ ÂÀÆÍÅÅ: ÎÏÅÐÀÖÈÈ ÎÒÍÎØÅÍÈß ÈËÈ ÂÛÐÀÆÅÍÈß.
- ×òî òàêîå èñòèíà?
- Èòàê, ÷åìó æå âñå-òàêè ñîîòâåòñòâóåò èñòèíà?
- Îñëîæíåíèÿ ñ ïîíÿòèåì "èñòèíà".
- Ïðèîðèòåòû îïåðàöèé îòíîøåíèÿ.
- Ðåçþìå: îïåðàöèè îòíîøåíèÿ è âûðàæåíèÿ.
- ËÎÃÈ×ÅÑÊÈÅ ÎÏÅÐÀÖÈÈ.
- Ïðèîðèòåòû.
- Ïîðÿäîê âû÷èñëåíèé.
- Ðåçþìå: ëîãè÷åñêèå îïåðàöèè è âûðàæåíèÿ.
- ÏÐÎÃÐÀÌÌÀ ÏÎÄÑ×ÅÒÀ ÑËÎÂ.
- ÏÐÎÃÐÀÌÌÀ, "ÐÈÑÓÞÙÀß" ÑÈÌÂÎËÀÌÈ.
- Àíàëèç ïðîãðàììû.
- Äëèíà ñòðîêè.
- Ñòðóêòóðà ïðîãðàììû.
- Ôîðìà äàííûõ.
- Êîíòðîëü îøèáîê.
- ÎÏÅÐÀÖÈß ÓÑËÎÂÈß: ?
- Ðåçþìå: îïåðàöèÿ óñëîâèÿ.
- ÌÍÎÆÅÑÒÂÅÍÍÛÉ ÂÛÁÎÐ: ÎÏÅÐÀÒÎÐÛ switch È break.
- Ðåçþìå: ìíîæåñòâåííûé âûáîð âàðèàíòîâ ñ ïîìîùüþ îïåðàòîðà switch.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- 8. Öèêëû è äðóãèå óïðàâëÿþùèå ñðåäñòâà.
- ÖÈÊË while.
- Çàâåðøåíèå öèêëà while.
- ÀËÃÎÐÈÒÌÛ È ÏÑÅÂÄÎÊÎÄ.
- Ðåçþìå: îïåðàòîð while.
- ÏÐÈÌÅÐÛ.
- ÖÈÊË for.
- Ãèáêîñòü êîíñòðóêöèè for.
- Ðåçþìå: îïåðàòîð for.
- Îïåðàöèÿ "çàïÿòàÿ".
- Ðåçþìå: íàøè íîâûå îïåðàöèè.
- Ôèëîñîô Çåíîí è öèêë for.
- ÖÈÊË Ñ ÓÑËÎÂÈÅÌ ÍÀ ÂÛÕÎÄÅ: do while.
- Ðåçþìå: îïåðàòîð do while.
- ÊÀÊÎÉ ÖÈÊË ËÓרÅ?
- ÂËÎÆÅÍÍÛÅ ÖÈÊËÛ.
- ÄÐÓÃÈÅ ÓÏÐÀÂËßÞÙÈÅ ÎÏÅÐÀÒÎÐÛ: break, continue, goto.
- break…
- continue…
- goto…
- Èçáåãàéòå èñïîëüçîâàòü goto.
- Ðåçþìå: ïåðåõîäû â ïðîãðàììàõ.
- ÌÀÑÑÈÂÛ.
- ÏÐÎÁËÅÌÀ ÂÂÎÄÀ.
- ÐÅÇÞÌÅ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 9. Êàê ïðàâèëüíî ïîëüçîâàòüñÿ ôóíêöèÿìè.
- ÊËÞ×ÅÂÎÅ ÑËÎÂÎ return.
- ÑÎÇÄÀÍÈÅ È ÈÑÏÎËÜÇÎÂÀÍÈÅ ÏÐÎÑÒÎÉ ÔÓÍÊÖÈÈ.
- ÀÐÃÓÌÅÍÒÛ ÔÓÍÊÖÈÈ.
- Îïðåäåëåíèå ôóíêöèè ñ àðãóìåíòîì: ôîðìàëüíûå àðãóìåíòû.
- Âûçîâ ôóíêöèè ñ àðãóìåíòîì: ôàêòè÷åñêèå àðãóìåíòû.
- Ôóíêöèÿ êàê "÷åðíûé ÿùèê".
- Íàëè÷èå íåñêîëüêèõ àðãóìåíòîâ.
- ÂÎÇÂÐÀÙÅÍÈÅ ÇÍÀ×ÅÍÈß ÔÓÍÊÖÈÅÉ: ÎÏÅÐÀÒÎÐ return.
- ËÎÊÀËÜÍÛÅ ÏÅÐÅÌÅÍÍÛÅ.
- ÍÀÕÎÆÄÅÍÈÅ ÀÄÐÅÑÎÂ: ÎÏÅÐÀÖÈß &
- ÈÇÌÅÍÅÍÈÅ ÏÅÐÅÌÅÍÍÛÕ Â ÂÛÇÛÂÀÞÙÅÉ ÏÐÎÃÐÀÌÌÅ.
- Óêàçàòåëè: ïåðâîå çíàêîìñòâî.
- Îïåðàöèÿ êîñâåííîé àäðåñàöèè: *
- Ðåçþìå: îïåðàöèè, ñâÿçàííûå ñ óêàçàòåëÿìè.
- Îïèñàíèå óêàçàòåëåé.
- Èñïîëüçîâàíèå óêàçàòåëåé äëÿ ñâÿçè ìåæäó ôóíêöèÿìè.
- Ïåðåìåííûå: èìåíà, àäðåñà è çíà÷åíèÿ.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ÍÀØÈÕ ÇÍÀÍÈÉ Î ÔÓÍÊÖÈßÕ.
- ÎÏÈÑÀÍÈÅ ÒÈÏÎÂ ÔÓÍÊÖÈÉ.
- Ðåçþìå: ôóíêöèè.
-  ßÇÛÊÅ ÑÈ ÂÑÅ ÔÓÍÊÖÈÈ ÐÀÂÍÎÏÐÀÂÍÛ.
- Êîìïèëÿöèÿ ïðîãðàìì, ñîñòîÿùèõ èç äâóõ èëè áîëåå ôóíêöèé.
- OC UNIX.
- ÊîìïèëÿòîðûLàttiñå C èÌIÑRÎSÎFÒ C.
- Ñèñòåìû, ïîñòðîåííûå íà îñíîâå òðàíñëÿöèè â àññåìáëåðíûé êîä.
- ÐÅÇÞÌÅ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 10. Êëàññû ïàìÿòè è ðàçðàáîòêà ïðîãðàìì.
- ÊËÞ×ÅÂÛÅ ÑËÎÂÀ: auto, extern, static, register.
- Àâòîìàòè÷åñêèå ïåðåìåííûå.
- Âíåøíèå ïåðåìåííûå.
- Ñòàòè÷åñêèå ïåðåìåííûå.
- Âíåøíèå ñòàòè÷åñêèå ïåðåìåííûå.
- Ðåãèñòðîâûå ïåðåìåííûå.
- Êàêîé êëàññ ïàìÿòè ïðèìåíÿòü?
- Ðåçþìå: Êëàññû ïàìÿòè.
- ÔÓÍÊÖÈß ÏÎËÓ×ÅÍÈß ÖÅËÛÕ ×ÈÑÅË: getint( ).
- Ïîòîê èíôîðìàöèè äëÿ getint( ).
- Ñîäåðæàíèå getint( ).
- Ïðåîáðàçîâàíèå ñòðîêè â öåëîå: stoi( ).
- Ïðîâåðêà.
- ÑÎÐÒÈÐÎÂÊÀ ×ÈÑÅË.
- Ñ÷èòûâàíèå ÷èñëîâûõ äàííûõ.
- Âûáîð ïðåäñòàâëåíèÿ äàííûõ.
- Çàâåðøåíèå ââîäà.
- Äàëüíåéøèå ðàññóæäåíèÿ.
- main( ) è getarray( ).
- Ðàçúÿñíåíèÿ.
- Ñîðòèðîâêà äàííûõ.
- Ïå÷àòü äàííûõ.
- Ðåçóëüòàòû.
- ÎÁÇÎÐ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 11. Ïðåïðîöåññîð ÿçûêà Ñè.
- ÄÈÐÅÊÒÈÂÛ ÏÐÅÏÐÎÖÅÑÑÎÐÀ #define, #include, #undef, #if, #ifdef, #ifndef, #else, #endif.
- ÑÈÌÂÎËÈ×ÅÑÊÈÅ ÊÎÍÑÒÀÍÒÛ: #define.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ÀÐÃÓÌÅÍÒÎÂ Ñ #define.
- ÌÀÊÐÎÎÏÐÅÄÅËÅÍÈÅ ÈËÈ ÔÓÍÊÖÈß?
- ÂÊËÞ×ÅÍÈÅ ÔÀÉËÀ: #include.
- Çàãîëîâî÷íûå ôàéëû…
- Çàìå÷àíèÿ ïî ïðîãðàììå.
- ÄÐÓÃÈÅ ÄÈÐÅÊÒÈÂÛ: #undef, #if, #ifdef, #ifndef, #else È #endif.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈÅ.
- 12. Ìàññèâû è óêàçàòåëè.
- ÌÀÑÑÈÂÛ.
- Èíèöèàëèçàöèÿ ìàññèâîâ è êëàññû ïàìÿòè.
- ÓÊÀÇÀÒÅËÈ ÌÀÑÑÈÂÎÂ.
- ÔÓÍÊÖÈÈ, ÌÀÑÑÈÂÛ È ÓÊÀÇÀÒÅËÈ.
- ÈÑÏÎËÜÇÎÂÀÍÈÅ ÓÊÀÇÀÒÅËÅÉ ÏÐÈ ÐÀÁÎÒÅ Ñ ÌÀÑÑÈÂÀÌÈ.
- ÎÏÅÐÀÖÈÈ Ñ ÓÊÀÇÀÒÅËßÌÈ.
- ÌÍÎÃÎÌÅÐÍÛÅ ÌÀÑÑÈÂÛ.
- Èíèöèàëèçàöèÿ äâóìåðíîãî ìàññèâà.
- ÓÊÀÇÀÒÅËÈ È ÌÍÎÃÎÌÅÐÍÛÅ ÌÀÑÑÈÂÛ.
- Ôóíêöèè è ìíîãîìåðíûå ìàññèâû.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈÅ.
- 13. Ñèìâîëüíûå ñòðîêè è ôóíêöèè íàä ñòðîêàìè.
- ÑÈÌÂÎËÜÍÛÅ ÑÒÐÎÊÈ.
- ÎÏÐÅÄÅËÅÍÈÅ ÑÒÐÎÊ Â ÏÐÎÃÐÀÌÌÅ.
- Ñòðîêîâûå êîíñòàíòû.
- Ìàññèâû ñèìâîëüíûõ ñòðîê è èõ èíèöèàëèçàöèÿ.
- Ìàññèâ èëè óêàçàòåëü.
- Ìàññèâ è óêàçàòåëü: ðàçëè÷èÿ.
- ßâíîå çàäàíèå ðàçìåðà ïàìÿòè.
- Ìàññèâû ñèìâîëüíûõ ñòðîê.
- Óêàçàòåëè è ñòðîêè.
- ÂÂÎÄ ÑÒÐÎÊ.
- Âûäåëåíèå ïàìÿòè.
- Ôóíêöèÿ gets( ).
- Ôóíêöèÿ scanf( ).
- ÂÛÂÎÄ ÑÒÐÎÊ.
- Ôóíêöèÿ puts( ).
- Ôóíêöèÿ printf( ).
- ÑÎÇÄÀÍÈÅ ÑÎÁÑÒÂÅÍÍÛÕ ÔÓÍÊÖÈÉ.
- ÔÓÍÊÖÈÈ, ÐÀÁÎÒÀÞÙÈÅ ÑÎ ÑÒÐÎÊÀÌÈ.
- Ôóíêöèÿ strlen( ).
- Ôóíêöèÿ strcat( ).
- Ôóíêöèÿ strcmp( ).
- Ôóíêöèÿ strcpy( ).
- ÏÐÈÌÅÐ: ÑÎÐÒÈÐÎÂÊÀ ÑÒÐÎÊ.
- ÀÐÃÓÌÅÍÒÛ ÊÎÌÀÍÄÍÎÉ ÑÒÐÎÊÈ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- 14. Ñòðóêòóðû è äðóãèå òèïû äàííûõ.
- ÒÈÏÎÂÀß ÇÀÄÀ×À: ÈÍÂÅÍÒÀÐÈÇÀÖÈß ÊÍÈÃ.
- ÓÑÒÀÍÎÂÊÀ ÑÒÐÓÊÒÓÐÍÎÃÎ ØÀÁËÎÍÀ.
- ÎÏÐÅÄÅËÅÍÈÅ ÑÒÐÓÊÒÓÐÍÛÕ ÏÅÐÅÌÅÍÍÛÕ.
- Èíèöèàëèçàöèÿ ñòðóêòóðû.
- ÄÎÑÒÓÏ Ê ÝËÅÌÅÍÒÀÌ ÑÒÐÓÊÒÓÐÛ.
- ÌÀÑÑÈÂÛ ÑÒÐÓÊÒÓÐ.
- Îïèñàíèå ìàññèâà ñòðóêòóð.
- Îïðåäåëåíèå ýëåìåíòîâ ìàññèâà ñòðóêòóð.
- Äåòàëèçàöèÿ ïðîãðàììû.
- ÂËÎÆÅÍÍÛÅ ÑÒÐÓÊÒÓÐÛ.
- ÓÊÀÇÀÒÅËÈ ÍÀ ÑÒÐÓÊÒÓÐÛ.
- Îïèñàíèå è èíèöèàëèçàöèÿ óêàçàòåëÿ íà ñòðóêòóðó.
- Äîñòóï ê ýëåìåíòó ñòðóêòóðû ïðè ïîìîùè óêàçàòåëÿ.
- Ðåçþìå: îïåðàöèè íàä ñòðóêòóðàìè è îáúåäèíåíèÿìè.
- II. ÎÏÅÐÀÖÈß ÊÎÑÂÅÍÍÎÃÎ ÏÎËÓ×ÅÍÈß ÝËÅÌÅÍÒÀ: ->
- ÏÅÐÅÄÀ×À ÈÍÔÎÐÌÀÖÈÈ Î ÑÒÐÓÊÒÓÐÀÕ ÔÓÍÊÖÈßÌ.
- Èñïîëüçîâàíèå ýëåìåíòîâ ñòðóêòóðû.
- Èñïîëüçîâàíèå àäðåñà ñòðóêòóðû.
- Èñïîëüçîâàíèå ìàññèâà.
- ÑÒÐÓÊÒÓÐÛ: ×ÒÎ ÄÀËÜØÅ?
- ÎÁÚÅÄÈÍÅÍÈß - ÊÐÀÒÊÈÉ ÎÁÇÎÐ.
- typedef - ÊÐÀÒÊÈÉ ÎÁÇÎÐ.
- ÏÐÈ×ÓÄËÈÂÛÅ ÎÏÈÑÀÍÈß.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû…
- ÓÏÐÀÆÍÅÍÈß.
- 15. Áèáëèîòåêà ÿçûêà Ñè è ôàéëû ââîäà-âûâîäà.
- ÄÎÑÒÓÏ Â ÁÈÁËÈÎÒÅÊÓ ßÇÛÊÀ ÑÈ.
- Àâòîìàòè÷åñêèé äîñòóï.
- Âêëþ÷åíèå ôàéëà.
- Âêëþ÷åíèå áèáëèîòåêè.
- ÁÈÁËÈÎÒÅ×ÍÛÅ ÔÓÍÊÖÈÈ, ÊÎÒÎÐÛÅ ÌÛ ÈÑÏÎËÜÇÎÂÀËÈ.
- ÑÂßÇÜ Ñ ÔÀÉËÀÌÈ.
- ×ÒÎ ÒÀÊÎÅ ÔÀÉË?
- ÏÐÎÑÒÛÅ ÏÐÎÃÐÀÌÌÛ ×ÒÅÍÈß ÔÀÉËÀ: fopen( ), fclose( ), getc( ) è putc( ).
- Îòêðûòèå ôàéëà: fopen( ).
- Çàêðûòèå ôàéëà: fclose( ).
- Òåêñòîâûå ôàéëû ñ áóôåðèçàöèåé.
- Ââîä-âûâîä ôàéëà: getc( ) è putc( ).
- ÏÐÎÑÒÀß ÏÐÎÃÐÀÌÌÀ ÑÆÀÒÈß ÔÀÉËÀ.
- ÂÂÎÄ-ÂÛÂÎÄ ÔÀÉËÀ: fprintf( ), fscanf( ), fgets( ) È fputs( ).
- Ôóíêöèè fprintf( ) è fscanf( ).
- Ôóíêöèÿ fgets( ).
- Ôóíêöèÿ fputs( ).
- ÏÐÎÈÇÂÎËÜÍÛÉ ÄÎÑÒÓÏ: fseek( ).
- ÏÐÎÂÅÐÊÀ È ÏÐÅÎÁÐÀÇÎÂÀÍÈÅ ÑÈÌÂÎËÎÂ.
- ÏÐÅÎÁÐÀÇÎÂÀÍÈß ÑÈÌÂÎËÜÍÛÕ ÑÒÐÎÊ: atoi( ), atof( ).
- ÂÛÕÎÄ: exit( ).
- ÐÀÑÏÐÅÄÅËÅÍÈÅ ÏÀÌßÒÈ: malloc( ) È ñà11îñ( ).
- ÄÐÓÃÈÅ ÁÈÁËÈÎÒÅ×ÍÛÅ ÔÓÍÊÖÈÈ.
- ÇÀÊËÞ×ÅÍÈÅ.
- ×ÒÎ ÂÛ ÄÎËÆÍÛ ÁÛËÈ ÓÇÍÀÒÜ Â ÝÒÎÉ ÃËÀÂÅ.
- ÂÎÏÐÎÑÛ È ÎÒÂÅÒÛ.
- Âîïðîñû.
- Îòâåòû.
- ÓÏÐÀÆÍÅÍÈß.
- Ïðèëîæåíèÿ.
- ÏÐÈËÎÆÅÍÈÅ À. ÄÎÏÎËÍÈÒÅËÜÍÀß ËÈÒÅÐÀÒÓÐÀ.
- ßçûêÑè.
- Ïðîãðàììèðîâàíèå.
- Îïåðàöèîííàÿ ñèñòåìà UNIX.
- ÏÐÈËÎÆÅÍÈÅ Á. ÊËÞ×ÅÂÛÅ ÑËÎÂÀ ßÇÛÊÀ ÑÈ.
- ÏÐÈËÎÆÅÍÈÅ Â. ÎÏÅÐÀÖÈÈ ßÇÛÊÀ ÑÈ.
- I. Àðèôìåòè÷åñêèå îïåðàöèè.
- II. Îïåðàöèè ïðèñâàèâàíèÿ.
- III. Îïåðàöèè îòíîøåíèÿ.
- IV. Ëîãè÷åñêèå îïåðàöèè.
- V. Îïåðàöèè íàä óêàçàòåëÿìè.
- VI. Îïåðàöèè íàä ñòðóêòóðàìè è îáúåäèíåíèÿìè.
- VII. Äîïîëíèòåëüíûå îïåðàöèè.
- ÏÐÈËÎÆÅÍÈÅ Ã. ÒÈÏÛ ÄÀÍÍÛÕ È ÊËÀÑÑÛ ÏÀÌßÒÈ.
- Îñíîâíûå òèïû äàííûõ.
- Êëàññû ïàìÿòè.
- ÏÐÈËÎÆÅÍÈÅ Ä. ÓÏÐÀÂËÅÍÈÅ ÕÎÄÎÌ ÂÛÏÎËÍÅÍÈß ÏÐÎÃÐÀÌÌÛ.
- Îïåðàòîð while.
- Îïåðàòîð for.
- Îïåðàòîð do while.
- Èñïîëüçîâàíèå îïåðàòîðîâ if äëÿ âûáîðà âàðèàíòîâ.
- Ìíîæåñòâåííûé âûáîð ïðè ïîìîùè switch.
- Ïåðåõîäû â ïðîãðàììå.
- break.
- continue.
- goto.
- ÏÐÈËÎÆÅÍÈÅ Å. ÌÀÍÈÏÓËßÖÈÈ ÐÀÇÐßÄÀÌÈ: ÎÏÅÐÀÖÈÈ È ÏÎËß.
- Îïåðàöèè.
- Ïîðàçðÿäíûå ëîãè÷åñêèå îïåðàöèè.
- Ïîðàçðÿäíûå îïåðàöèè ñäâèãà.
- Ïîëÿ.
- ÏÐÈËÎÆÅÍÈÅ Æ. ÄÂÎÈ×ÍÛÅ È ÄÐÓÃÈÅ ×ÈÑËÀ.
- Äâîè÷íûå ÷èñëà.
- Äâîè÷íûå ÷èñëà ñ ïëàâàþùåé òî÷êîé.
- Äðóãèå îñíîâàíèÿ ñèñòåìû ñ÷èñëåíèÿ.
- ÏÐÈËÎÆÅÍÈÅ Ç. "ÌÓÇÛÊÀ" Â ÑÈÑÒÅÌÅ IBM PC.
- Ôóíêöèÿ tone ( ).
- Ïðîäîëæèòåëüíîñòü çâó÷àíèÿ.
- ×àñòîòà çâóêà.
- Èñïîëüçîâàíèå ôóíêöèè tînå( ).
- ÏÐÈËÎÆÅÍÈÅ È. ÐÀÑØÈÐÅÍÈÅ ßÇÛÊÀ ÑÈ.
- Ñòðóêòóðû â êà÷åñòâå àðãóìåíòîâ ôóíêöèè.
- Ïåðå÷èñëèìûå òèïû.
- Çíà÷åíèÿ ïî óìîë÷àíèþ.
- Ïðèñâîåííûå çíà÷åíèÿ.
- Îïåðàöèè.
- ÏÐÈÌÅÍÅÍÈÅ.
- ÏÐÈËÎÆÅÍÈÅ Ê. ÒÀÁËÈÖÀ ÊÎÄÎÂ ASCII.