ßçûê Ñè - ðóêîâîäñòâî äëÿ íà÷èíàþùèõ.

Ïðèëîæåíèÿ. 

ÏÐÈËÎÆÅÍÈÅ À.  ÄÎÏÎËÍÈÒÅËÜÍÀß ËÈÒÅÐÀÒÓÐÀ.

     Åñëè âû õîòèòå áîëüøå óçíàòü î ÿçûêå Ñè è âîîáùå î ïðîãðàììèðîâàíèè, òî íàéäåòå ïîëåçíîé ñëåäóþùóþ ëèòåðàòóðó:

ßçûêÑè.

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,îòìåíà ñèìâîëà