ðåôåðàòû ðåôåðàòû
 

Ãëàâíàÿ

Ðàçäåëû

Íîâîñòè

Πñàéòå

Êîíòàêòû

 
ðåôåðàòû

Àâèàöèÿ è êîñìîíàâòèêà
Àäìèíèñòðàòèâíîå ïðàâî
Àðáèòðàæíûé ïðîöåññ
Àðõèòåêòóðà
Àñòðîëîãèÿ
Àñòðîíîìèÿ
Áàíêîâñêîå äåëî
Áåçîïàñíîñòü æèçíåäåÿòåëüíîñòè
Áèçíåñ-ïëàí
Áèîëîãèÿ
Áóõó÷åò óïðàâëåí÷ó÷åò
Âîäîñíàáæåíèå âîäîîòâåäåíèå
Âîåííàÿ êàôåäðà
Ãåîãðàôèÿ è ãåîëîãèÿ
Ãåîäåçèÿ
Ãîñóäàðñòâåííîå ðåãóëèðîâàíèå è íàëîãîîáëîæåíèå
Ãðàæäàíñêîå ïðàâî
Ãðàæäàíñêîå ïðîöåññóàëüíîå ïðàâî
Æèâîòíûå
Æèëèùíîå ïðàâî
Èíîñòðàííûå ÿçûêè è ÿçûêîçíàíèå
Èñòîðèÿ è èñòîðè÷åñêèå ëè÷íîñòè
Êîììóíèêàöèè ñâÿçü öèôðîâûå ïðèáîðû è ðàäèîýëåêòðîíèêà
Êðàåâåäåíèå è ýòíîãðàôèÿ
Êóëèíàðèÿ è ïðîäóêòû ïèòàíèÿ
Êóëüòóðà è èñêóññòâî
Ëèòåðàòóðà
Ëîãèêà
Ëîãèñòèêà
Ìàðêåòèíã
Ìàññ-ìåäèà è ðåêëàìà
Ìàòåìàòèêà
Ìåäèöèíà
Ìåæäóíàðîäíîå è Ðèìñêîå ïðàâî
Óãîëîâíîå ïðàâî óãîëîâíûé ïðîöåññ
Òðóäîâîå ïðàâî
Æóðíàëèñòèêà
Õèìèÿ
Ãåîãðàôèÿ
Èíîñòðàííûå ÿçûêè
Áåç êàòåãîðèè
Ôèçêóëüòóðà è ñïîðò
Ôèëîñîôèÿ
Ôèíàíñû
Ôîòîãðàôèÿ
Õèìèÿ
Õîçÿéñòâåííîå ïðàâî
Öèôðîâûå óñòðîéñòâà
Òàìîæåííàÿ ñèñòåìà
Òåîðèÿ ãîñóäàðñòâà è ïðàâà
Òåîðèÿ îðãàíèçàöèè
Òåïëîòåõíèêà
Òåõíîëîãèÿ
Òîâàðîâåäåíèå
Òðàíñïîðò
Òðóäîâîå ïðàâî
Òóðèçì
Óãîëîâíîå ïðàâî è ïðîöåññ
Óïðàâëåíèå
Ðàäèîýëåêòðîíèêà
Ðåëèãèÿ è ìèôîëîãèÿ
Ðèòîðèêà
Ñîöèîëîãèÿ
Ñòàòèñòèêà
Ñòðàõîâàíèå
Ñòðîèòåëüñòâî
Ñõåìîòåõíèêà
Èñòîðèÿ
Êîìïüþòåðû ÝÂÌ
Êóëüòóðîëîãèÿ
Ñåëüñêîå ëåñíîå õîçÿéñòâî è çåìëåïîëüçîâàíèå
Ñîöèàëüíàÿ ðàáîòà
Ñîöèîëîãèÿ è îáùåñòâîçíàíèå

ðåôåðàòû
ðåôåðàòû

ÍÀÓ×ÍÀß ÁÈÁËÈÎÒÅÊÀ - ÐÅÔÅÐÀÒÛ - Íàáîð ïðîöåäóð ìàíèïóëèðîâàíèÿ ñ öåëûìè ÷èñëàìè ïðîèçâîëüíîé äëèíû

Íàáîð ïðîöåäóð ìàíèïóëèðîâàíèÿ ñ öåëûìè ÷èñëàìè ïðîèçâîëüíîé äëèíû


Îò÷åò òåñòîâîé ïðîãðàììû
Ïðîâåðêà ðàáîòû êîíñòðóêòîðîâ: Áåç èíèöèàëèçàöèè: unlim a; a=0 Èíèöèàëèçàöèÿ ñòðîêîé: unlim b="123" b=123 unlim c="-123" c=-123 unlim d="+123" d=123 unlim e="+"
Unlim class error: Sign without value. Value=0 e=0 unlim f="-"
Unlim class error: Sign without value. Value=0 f=0 unlim g="aaa"
Unlim class error: Not digit symbol in string. String ignored. Value=0 g=0 unlim h="4a123"
Unlim class error: Not digit symbol in string. String ignored. Value=0 h=0
Ïðîâåðêà âûâîäà, àðèôìåòèêè è ñðàâíåíèÿ:
Ââåäåíî: a=123 b=45
Ðåçóëüòàò: a=123 b=45
-a=-123
+a=123
a>b a>=b a!=b
a+b=168
a-b=78
a*b=5535
--------------------------------------------------
Ââåäåíî: a=+0000000000000000123 b=0000000000000000000000000000000045
Ðåçóëüòàò: a=123 b=45
-a=-123
+a=123
a>b a>=b a!=b
a+b=168
a-b=78
a*b=5535
--------------------------------------------------
Ââåäåíî: a=-123 b=-45
Ðåçóëüòàò: a=-123 b=-45
-a=123
+a=-123
a=b a!=b
a+b=78
a-b=168
a*b=-5535
--------------------------------------------------
Ââåäåíî: a=-123 b=45
Ðåçóëüòàò: a=-123 b=45
-a=123
+a=-123
a=b a!=b
a+b=1999999999999999999999999999999999999999999999
a-b=1
a*b=999999999999999999999999999999999999999999999000000000000000000000000000000000000000000000
--------------------------------------------------
Ââåäåíî: a=-100000000000000000000000000000000000000000000 b=999999999999999999999999999999999999999999999
Ðåçóëüòàò: a=-100000000000000000000000000000000000000000000 b=999999999999999999999999999999999999999999999
-a=100000000000000000000000000000000000000000000
+a=-100000000000000000000000000000000000000000000
a
 ÌÎÑÊÎÂÑÊÈÉ ÈÍÑÒÈÒÓÒ ÐÀÄÈÎÒÅÕÍÈÊÈ ÝËÅÊÒÐÎÍÈÊÈ
È ÀÂÒÎÌÀÒÈÊÈ
            ÌÅÆÄÓÍÀÐÎÄÍÛÉ ÔÀÊÓËÜÒÅÒ
ÈÍÔÎÐÌÀÒÈÊÈ
                         ÈÍÒÅÐ ÝÂÌ
               Ê Ó Ð Ñ Î Â À ß   Ð À Á Î Ò À
  ïî äèñöèïëèíå "Àëãîðèòìè÷åñêèå ßçûêè è
Ïðîãðàììèðîâàíèå"
                        Ìîñêâà 1993ã
.
    Ïîñòàíîâêà çàäà÷è:
    Ñîñòàâèòü íàáîð  ïðîöåäóð  
ìàíèïóëèðîâàíèÿ   ñ   öåëûìè
÷èñëàìè  ïðîèçâîëüíîé äëèíû.  Ïðîöåäóðû äîëæíû îáåñïå÷èâàòü:
ôîðìèðîâàíèå  è 
ââîä  öåëûõ   ÷èñåë  
ïðîèçâîëüíîé   äëèíû,
ñëîæåíèå,  âû÷èòàíèå, 
ñðàâíåíèå  è  óìíîæåíèå 
öåëûõ ÷èñåë.
Ðàáîòîñïîñîáíîñòü     ïðîöåäóð     ïðîäåìîíñòðèðîâàòü    
íà
äåìîíñòðàöèîííîé
ïðîãðàììå.
.
    Èñïîëüçîâàííûå ñðåäñòâà ÿçûêà:
    Ìîäóëü, ðåàëèçóþùèé  öåëûå 
÷èñëà ïðîèçâîëüíîé äëèíû,  è
òåñòîâàÿ
ïðîãðàììà íàïèñàíû íà ÿçûêå Ñ++.
    Äëÿ ïðåäñòàâëåíèÿ   öåëûõ  
÷èñåë   ïðîèçâîëüíîé   äëèíû
îïðåäåëåí  êëàññ  
UNLIM.   Îïåðàöèè   íàä  
ýòèìè   ÷èñëàìè
ðåàëèçîâàíû
ïóòåì ïåðåîïðåäåëåíèÿ äëÿ êëàññà UNLIM ñëåäóþùèõ
îïåðàöèé:
    + (óíàðíûé è áèíàðíûé)
    - (óíàðíûé è áèíàðíûé)
    *
    ==
    !=
    <
    >
    <=
    >=
    << (îïåðàöèÿ âûâîäà êëàññà OSTREAM)
.
    Ñòðóêòóðà äàííûõ:
    Àáñîëþòíàÿ âåëè÷èíà ÷èñëà ïðîèçâîëüíîé
äëèíû õðàíèòñÿ  â
ïàìÿòè  â âèäå ìàññèâà òèïà CHAR.  Â êàæäîì ýëåìåíòå ìàññèâà
ìîæåò
íàõîäèòñÿ ÷èñëî îò 0 äî 99,  òî åñòü äâà
ðàçðÿäà âñåãî
÷èñëà.   
íóëåâîì ýëåìåíòå õðàíÿòñÿ ìëàäøèå äâà ðàçðÿäà,  â
ïîñëåäíåì
ýëåìåíòå - ñòàðøèå äâà ðàçðÿäà.  Åñëè
÷èñëî  èìååò
íå÷åòíîå   êîëè÷åñòâî 
ðàçðÿäîâ,  òî  â 
ïîñëåäíåì  ýëåìåíòå
ìàññèâà
õðàíèòñÿ îäèí ïîñëåäíèé ðàçðÿä, 
ò.å.  ÷èñëî îò 0 äî
9.   Ëèäèðóþùèå   íóëè   â  ìàññèâå 
íå  õðàíÿòñÿ.  ×èñëî 
0
ïðåäñòàâëåíî
ìàññèâîì èç îäíîãî ýëåìåíòà, â êîòîðîì õðàíèòñÿ
0.
    Ñ öåëüþ ìèíèìèçèðîâàòü êîïèðîâàíèå è
ðàñõîä ïàìÿòè êëàññ
UNLIM  ðåàëèçîâàí òàê,  ÷òî íà îäíî ïðåäñòàâëåíèå àáñîëþòíîé
âåëè÷èíû
ìîãóò ññûëàòüñÿ íåñêîëüêî ÷èñåë,  ïðè
ýòîì  âåäåòñÿ
ó÷åò
ññûëîê.
    Îáúåêò êëàññà UNLIM ñîñòîèò èç ïîëÿ SIGN -
çíàêà ÷èñëà è
ïîëÿ  PV  -
óêàçàòåëÿ íà äåñêðèïòîð ïðåäñòàâëåíèÿ àáñîëþòíîé
âåëè÷èíû.
×èñëî 0 âñåãäà èìååò çíàê PLUS.
    Äåñêðèïòîð ïðåäñòàâëåíèÿ   àáñîëþòíîé   âåëè÷èíû   ÷èñëà
ïðåäñòàâëÿåò  ñîáîé 
îáúåêò  ñòðóêòóðû  DESCRIPTOR 
è  èìååò
ñëåäóþùèå
ïîëÿ:
    body   
- óêàçàòåëü íà  ìàññèâ,   â  
êîòîðîì   õðàíèòñÿ
              ïðåäñòàâëåíèå àáñîëþòíîé
âåëè÷èíû ÷èñëà;
    len    
- äëèíà ìàññèâà body[] â áàéòàõ;
    HowMany - êîëè÷åñòâî ññûëîê íà äàííîå
ïðåäñòàâëåíèå;
.
    Ðåàëèçàöèÿ îïåðàöèé ñðàâíåíèÿ:
    Èç îïåðàöèé  ñðàâíåíèÿ òîëüêî < è != íàïðÿìóþ ñðàâíèâàþò
÷èñëà,
îñòàëüíûå îïåðàöèè âûðàæåíû ÷åðåç ýòè äâå. Ïðè ðàáîòå
îïåðàöèé  < è != ñíà÷àëà ïðîâåðÿþòñÿ çíàêè è äëèíû
÷èñåë,  è
òîëüêî  â 
ñëó÷àå  èõ  ñîâïàäåíèÿ 
ïðîèçâîäèòñÿ  ïîðàçðÿäíîå
ñðàâíåíèå  ÷èñåë 
(â  êà÷åñòâå  ðàçðÿäîâ çäåñü áåðóòñÿ öåëûå
áàéòû -
ò.å. ðàçðÿäû â ñèñòåìå ñ÷èñëåíèÿ ñ îñíîâàíèåì 100).
    Ðåàëèçàöèÿ îïåðàöèé àðèôìåòèêè:
    Îïåðàöèÿ óíàðíûé + ïðîñòî âîçâðàùàåò ñàìî
÷èñëî.
    Îïåðàöèÿ óíàðíûé - âîçâðàùàåò íîâûé îáúåêò
êëàññà UNLIM,
êîòîðûé
ññûëàåòñÿ íà òî æå ïðåäñòàâëåíèå ìîäóëÿ ÷èñëà, ÷òî è
àðãóìåíò,
è èìååò çíàê, ïðîòèâîïîëîæíûé çíàêó àðãóìåíòà.
    Îïåðàöèÿ áèíàðíûé +  îïðåäåëåíà 
è  äëÿ  ñëó÷àåâ,  êîãäà
çíàêè
îïåðàíäîâ ñîâïàäàþò, è êîãäà ýòè çíàêè ðàçëè÷íû.
    Â ïåðâîì 
ñëó÷àå  çíàê  ðåçóëüòàòà 
ñîîòâåòñòâóåò  çíàêó
îäíîãî  (ëþáîãî) èç îïåðàíäîâ,  à ìîäóëü ðåçóëüòàòà ÿâëÿåòñÿ
ðåçóëüòàòîì  ñëîæåíèÿ 
ìîäóëåé  îïåðàíäîâ.  Ïðè 
ýòîì   åñëè
êîëè÷åñòâî
ðàçðÿäîâ ïåðâîãî îïåðàíäà ðàâíî A, à âòîðîãî - B,
òî
êîëè÷åñòâî ðàçðÿäîâ îïåðàíäà ìîæåò 
áûòü  ëèáî  max(A,B),
ëèáî
max(A,B)+1, ïîýòîìó ïðè âûäåëåíèè ïàìÿòè ïîä ìàññèâ äëÿ
ìîäóëÿ   ðåçóëüòàòà   áåðåòñÿ   âòîðîå   çíà÷åíèå.  
Íèêàêîé
îïòèìèçàöèè  ýòîãî 
ìàññèâà ïîñëå ñëîæåíèÿ ìîäóëåé îïåðàíäîâ
íå
äåëàåòñÿ,  òàê êàê  â 
äàííîì  ñëó÷àå  ïîòåðÿ 
ïàìÿòè  íà
ëèäèðóþùèå  íóëè 
ìîæåò  áûòü  ìàêñèìóì 
1 áàéò,  è âûãîäíåå
ñýêîíîìèòü
íà ñêîðîñòè, ÷åì íà ïàìÿòè.
     ñëó÷àå,   êîãäà   çíàêè   îïåðàíäîâ  
ðàçëè÷íû,   çíàê
ðåçóëüòàòà
ðàâåí çíàêó îïåðàíäà ñ 
ìàêñèìàëüíûì  ìîäóëåì,  à
ìîäóëü  ðåçóëüòàòà 
ïîëó÷àòñÿ  âû÷èòàíèåì  ìîäóëÿ îïåðàíäà ñ
ìèíèìàëüíûì  ìîäóëåì 
èç  ìîäóëÿ  îïåðàíäà 
ñ   ìàêñèìàëüíûì
ìîäóëåì.  Ïðè 
ýòîì  ïîä ìîäóëü ðåçóëüòàòà
âûäåëÿåòñÿ ìàññèâ
äëèíû,  ðàâíîé 
íàèáîëüøåé  èç  äëèí 
îïåðàíäîâ,  íî   ïîñëå
âû÷èòàíèÿ   ÷èñåë 
îí  îïòèìèçèðóåòñÿ  ôóíêöèåé 
optimize(),
êîòîðàÿ
óäàëÿåò ëèäèðóþùèå íóëè (ñîçäàåò íîâûé ìàññèâ äëèíû,
íåîáõîäèìîé  äëÿ õðàíåíèÿ ìîäóëÿ ÷èñëà áåç ëèäèðóþùèõ
íóëåé,
êîïèðóåò  â 
íåãî  âñå  çíà÷àùèå 
ðàçðÿäû,  ïåðåàäðåñîâûâàåò
ññûëêó
äåñêðèïòîðà íà ýòîò ìàññèâ è óäàëÿåò ñòàðûé ìàññèâ).
    Ñëîæåíèå è âû÷èòàíèå ìîäóëåé
àðãóìåíòîâ  ïðîèçâîäèòñÿ  â
ñèñòåìå
ñ÷èñëåíèÿ ñ îñíîâàíèåì 100.
    Îïåðàöèÿ áèíàðíûé - îïðåäåëåíà  ÷åðåç 
óíàðíûé  ìèíóñ  è
áèíàðíûé
ïëþñ.
    Îïåðàöèÿ *  ïðîèçâîäèòñÿ  ïî   òåõíîëîãèè,   àíàëîãè÷íîé
óìíîæåíèþ
â ñòîëáèê. Ïðè ýòîì âñå äåéñòâèÿ âåäóòñÿ â ñèñòåìå
ñ÷èñëåíèÿ
ñ îñíîâàíèåì 100.  Äëèíà ìàññèâà
ðåçóëüòàòà  ìîæåò
áûòü
ðàâíà ëèáî ñóììå äëèí îïåðàíäîâ,  ëèáî
ýòîé ñóììå ìèíóñ
1.  Ýòà ñèòóàöèÿ àíàëîãè÷íà òîé,  êîòîðàÿ áûëà ïðè  ñëîæåíèè
÷èñåë   ñ 
îäèíàêîâûì  çíàêîì,  è 
çäåñü  òîæå  íå 
äåëàåòñÿ
îïòèìèçàöèè.
    Îïåðàöèÿ <<  - 
ïðîñòî  îïåðàöèÿ  âûâîäà êëàññà OSTREAM,
îïðåäåëåííàÿ
äëÿ êëàññà UNLIM.  Ñíà÷àëà îíà âûâîäèò
'-' åñëè
çíàê
÷èñëà îòðèöàòåëüíûé,  à çàòåì ñàìî ÷èñëî
ïîðàçðÿäíî (ïî
äåñÿòè÷íûì  ðàçðÿäàì), 
íà÷èíàÿ  ñî   ñòàðøåãî.  
Ïðè   ýòîì
èñïîëüçóåòñÿ   ôóíêöèÿ  
digit(number),  êîòîðàÿ  âîçâðàùàåò
çíà÷åíèå
äåñÿòè÷íîãî ðàçðÿäà ñ íîìåðîì number.
    Ôóíêöèÿ- êîíñòðóêòîð      unlim(char*)      îáðàáàòûâàåò
èíèöèàëèçàöèþ  ñèìâîëüíîé 
ñòðîêîé.  Ïðè  ýòîì 
ðàñïîçíàþòñÿ
ñëåäóþùèå
îøèáî÷íûå ñèòóàöèè:  èíèöèàëèçàöèÿ
ïóñòîé ñòðîêîé;
íåäîïóñòèìûé  ñèìâîë â ñòðîêå;  ñòðîêà ñîäåðæèò çíàê,  íî
íå
ñîäåðæèò   çíà÷åíèÿ.  
Âî   âñåõ    ýòèõ   
ñëó÷àÿõ    ÷èñëî
èíèöèàëèçèðóåòñÿ
íóëåì.
    Ôóíêöèÿ- êîíñòðóêòîð     unlim(unlim&)      îáðàáàòûâàåò
èíèöèàëèçàöèþ
äðóãèì îáúåêòîì êëàññà UNLIM.
//#include
<string.h>
#include
<iostream.h>
#include
<fstream.h>
//#include
<values.h>
#include
"unlimit.h"
#define
CR "\n"
void
main()
      {
      ofstream r("report.txt",1);
      ostream_withassign rc;
      rc=cout;
      cout<<"\nÒåñòîâàÿ ïðîãðàììà äëÿ
êëàññà UNLIM\n"
            <<"(öåëûå ÷èñëà ñ
ïðîèçâîëüíîé òî÷íîñòüþ)\n"
            ;
      cout=r;
      r     <<"Îò÷åò
òåñòîâîé ïðîãðàììû\n"
            <<"\nÏðîâåðêà ðàáîòû
êîíñòðóêòîðîâ:\n"
            <<"    Áåç èíèöèàëèçàöèè:\n"
            ;
      r     <<"        unlim a;\n";
      unlim a;
      r     <<"              a="<<a<<"\n"
            <<"    Èíèöèàëèçàöèÿ ñòðîêîé:\n"
            <<"        unlim b=\"123\"\n";
      unlim b="123";
      r     <<"              b="<<b<<CR
            <<"        unlim c=\"-123\"\n";
      unlim c="-123";
      r     <<"              c="<<c<<CR
            <<"        unlim d=\"+123\"\n";
      unlim d="+123";
      r     <<"              d="<<d<<CR
            <<"        unlim e=\"+\"\n";
      unlim e="+";
      r     <<"              e="<<e<<CR
            <<"        unlim f=\"-\"\n";
      unlim f="-";
      r     <<"              f="<<f<<CR
            <<"        unlim g=\"aaa\"\n";
      unlim g="aaa";
      r     <<"              g="<<g<<CR
            <<"        unlim h=\"4a123\"\n";
      unlim h="4a123";
      r     <<"             
h="<<h<<"\n\n"
            <<"Ïðîâåðêà âûâîäà,
àðèôìåòèêè è ñðàâíåíèÿ:\n\n";
      while ( a!="0" ||
b!="0" )
            {
            cout=rc;
            cout<<"\nÂâîäèòå îäíî çà
äðóãèì 2 ÷èñëà; äëÿ îêîí÷àíèÿ - îáà íóëè\n";
            char
                  aa[128],
                  bb[128];
            cout<<" a=";
            cin   >>aa;
            cout<<" b=";
            cin   >>bb;
            cout=r;
            r     <<"Ââåäåíî:\n"
                  <<"
a="<<aa<<CR
                  <<"
b="<<bb<<CR
                  <<"\nÐåçóëüòàò:\n"
                  ;
            a=aa;
            b=bb;
            r     <<"
a="<<a<<CR<<"
b="<<b<<"\n\n"
                  <<"-a="<<-a<<CR<<"+a="<<+a<<"\n\n";
            if (a<b)  r<<"a<b   ";
            if (a>b)  r<<"a>b   ";
            if (a<=b)
r<<"a<=b   ";
            if (a>=b)
r<<"a>=b   ";
            if (a!=b)
r<<"a!=b\n";
            if (a==b)
r<<"a==b\n";
            r     <<"\na+b="<<(a+b)<<CR
                  <<"a-b="<<(a-b)<<CR
                  <<"a*b="<<(a*b)
                  <<"\n\n--------------------------------------------------\n\n"
                  ;
            }
      }
#include
<stdlib.h>
#include
<ctype.h>
#include
<string.h>
#include
<iostream.h>
#define
COUNT unsigned int
#define
TRUE 1
#define
FALSE 0
#define
ILLEGAL 10
enum
      {
      PLUS,
      MINUS
      };
class
unlim
      {
      public:
            unlim(char*);
            unlim();
            unlim(unlim&);
            ~unlim();
            unlim
                  &operator = (char*),
                  &operator = (unlim&);
            friend int
                  operator ==
(unlim&,unlim&),
                  operator !=
(unlim&,unlim&),
                  operator >  (unlim&,unlim&),
                  operator >=
(unlim&,unlim&),
                  operator <  (unlim&,unlim&),
                  operator <=
(unlim&,unlim&);
            friend unlim
                  operator + (unlim&),          // unary
                  operator - (unlim&),          // unary
                  operator +
(unlim&,unlim&),   // binary
                  operator -
(unlim&,unlim&),   // binary
                  operator *
(unlim&,unlim&),
                  abs(unlim&);
            friend ostream
                  &operator <<
(ostream&,unlim&);
      private:
            struct descriptor
                  {
                  char
                        *body;
                  COUNT
                        len,
                        HowMany;
                  };
            descriptor
                  *pv;    //pointer to value descriptor
            char
                  sign,
                  digit(COUNT number);
            char &operator [](COUNT i)
{return pv->body[i];}
            void
                  init0(),      //init by zero
                  NotDigit(),   //message "no digit" & init0
                  optimize(),   //optimize length of body
                  error(char*); //display error
message
      };
inline
void unlim::error(char *message)
      {
      cout <<"Unlim class error:
"
             <<message
             <<"\n";
      }
void
unlim::init0()
      {
      (pv->body)=new char;
      *(pv->body)=0;
      (pv->len)=1;
      sign=PLUS;
      }
char
unlim::digit(COUNT number)
      {
      if ( number>=(pv->len) )
            return ILLEGAL;
      char byte=(pv->body)[number/2];
      if (number%2==0)
            return byte%10;
      else
            return byte/10;
      }
unlim::unlim()
      {
      pv=new descriptor;
      init0();
      (pv->HowMany)=1;
      }
unlim::~unlim()
      {
      if ( --(pv->HowMany)==0 )
            {
            delete pv->body;
            delete pv;
            }
      }
char
DecVal(char symbol)
      {
      if ( isdigit(symbol) )
            return symbol-'0';
      return ILLEGAL;
      }
unlim::unlim(char
*string)
      {
      pv=new descriptor;
      (pv->HowMany)=1;
      COUNT Length=strlen(string);
      if (Length==0)
            {
            error("Empty string assigned.
Value=0");
            init0();
            return;
            }
      else
            {
            COUNT LeftLimit=0;
            switch (string[0])
                  {
                  case '-':
                        sign=MINUS;
                        LeftLimit=1;
                        break;
                  case '+':
                        LeftLimit=1;
                  default:
                        sign=PLUS;
                  }
            if (Length-LeftLimit==0)
                  {
                  error("Sign without
value. Value=0");
                  init0();
                  return;
                  }
            else
                  {
                  while (string[LeftLimit]=='0')
                        LeftLimit++;
                  if ( (Length-=LeftLimit)==0 )
                        {
                        init0();
                        return;
                        }
                  COUNT
DestLength=Length/2+Length%2;
                  (pv->body)=new
char[DestLength];
                  for   ( COUNT si=Length+LeftLimit-1, ki=0 ; ki<DestLength ;
si-=2,ki++ )
                        {
                        char
a=DecVal(string[si]);
                        if (a==ILLEGAL)
                             {
                             NotDigit();
                             return;
                             }
                        (pv->body)[ki]=a;
                        if (si!=LeftLimit)
                             {
                             char
a=DecVal(string[si-1]);
                             if (a==ILLEGAL)
                                   {
                                   NotDigit();
                                   return;
                                   }
                             (pv->body)[ki]+=10*a;
                             }
                        }
                  (pv->len)=Length;
                  }
            }
      }
void
unlim::NotDigit()
      {
      error("Not digit symbol in string.
String ignored. Value=0");
      delete pv->body;
      init0();
      }
unlim::unlim(unlim
&arg)
      {
      (arg.pv)->HowMany++;
      pv=arg.pv;
      sign=arg.sign;
      }
unlim
&unlim::operator=(unlim &arg)
      {
      (arg.pv)->HowMany++;
      if ( --(pv->HowMany)==0 )
            {
            delete pv->body;
            delete pv;
            }
      pv=arg.pv;
      sign=arg.sign;
      return *this;
      }
unlim
&unlim::operator=(char *string)
      {
      return *this=unlim(string);
      }
ostream
&operator<<(ostream &s,unlim &x)
      {
      if (x.sign==MINUS)
            s << "-";
      for ( COUNT i=((x.pv)->len) ; i>0 ;
i-- )
            s << int(x.digit(i-1));
      return s;
      }
int
operator!=(unlim &a,unlim &b)
      {
      if ( (a.pv)->len != (b.pv)->len)
            return TRUE;
      if (a.sign!=b.sign)
            return TRUE;
      COUNT
length=((a.pv)->len)/2+((a.pv)->len)%2;
      for ( COUNT i=0 ; i<length ; i++ )
            if (a[i]!=b[i])
                  return TRUE;
      return FALSE;
      }
int
operator<(unlim &a,unlim &b)
      {
      if (a.sign!=b.sign)
            return a.sign==MINUS;
      if ( (a.pv)->len == (b.pv)->len )
            {
            COUNT i=((a.pv)->len)-1;
            while ( a.digit(i) == b.digit(i) )
                  {
                  if (i==0)
                        return FALSE;
                  i--;
                  }
            char
                  aLess= a.digit(i) <
b.digit(i),
                  SignPlus= a.sign==PLUS;
            return ( aLess && SignPlus)
|| ( !aLess && !SignPlus );
            }
      else
            )
      }
inline
int operator ==(unlim &a,unlim &b)
      {
      return !(a!=b);
      }
inline
int operator <=(unlim &a,unlim &b)
      !(a!=b);

inline
int operator >=(unlim &a,unlim &b)
      {
      return !(a<b);
      }
inline
int operator >(unlim &a,unlim &b)
      {
      return !(a<b) && (a!=b);
      }
inline
unlim operator +(unlim &x)
      {
      return x;
      }
unlim
abs(unlim &x)
      {
      unlim r=x;
      r.sign=PLUS;
      return r;
      }
unlim
operator -(unlim &x)
      {
      if ( (x.pv)->len==1 && x[0]==0
)
            {
            unlim y;
            return y;
            }
      unlim y=x;
      if (x.sign==PLUS)
            y.sign=MINUS;
      else
            y.sign=PLUS;
      return y;
      }
void
unlim::optimize()
      {
      COUNT i=pv->len/2+pv->len%2-1;
      char optimized=FALSE;
      while (pv->body[i]==0)
            {
            optimized=TRUE;
            if (i--==0)
                  {
                  init0();
                  return;
                  }
            }
      if (optimized)
            {
            char *NewBody=new char[++i];
            for (COUNT ni=0;ni<i;ni++)
                  NewBody[ni]=pv->body[ni];
            delete pv->body;
            pv->body=NewBody;
            pv->len=(i--)*2;
            }
      if ( (pv->body[i]/10)==0 &&
(pv->len%2)==0 )
            pv->len--;
      }
inline
COUNT max (COUNT a,COUNT b)
      {
      return (a>b)?a:b;
      }
unlim
operator +(unlim &a,unlim &b)
      {
      unlim r;
      delete (r.pv)->body;
      if (a.sign==b.sign)
            {
            r.sign=a.sign;
            COUNT
                  rlen=max(
(a.pv)->len,(b.pv)->len )+1,
                  alen=(a.pv)->len/2+(a.pv)->len%2,
                  blen=(b.pv)->len/2+(b.pv)->len%2;
            (r.pv)->len=rlen;
            rlen=rlen/2+rlen%2;
            (r.pv)->body=new char[rlen];
            *(r.pv)->body=0;
            for (COUNT i=0;i<rlen;i++)
                  {
                  unsigned char sum=( i<alen
? a[i] : 0)+( i<blen ? b[i] : 0);
                  r[i]+=sum%100;
                  r[i+1]=sum/100;
                  }
            if ( r.digit( (r.pv)->len-1 )==0
)
                  (r.pv)->len--;
            }
      else
            {
            unlim
                  aa=a,
                  bb=b;
            if (abs(a)<abs(b))
                  {
                  aa=b;
                  bb=a;
                  }
            r.sign=aa.sign;
            COUNT
                  rlen=(aa.pv)->len,
                  blen=(bb.pv)->len/2+(bb.pv)->len%2;
            (r.pv)->len=rlen;
            rlen=rlen/2+rlen%2;
            (r.pv)->body=new char[rlen];
            *(r.pv)->body=0;
            for (COUNT i=0;i<rlen;i++)
                  {
                  char sub=aa[i]-( i<blen ?
bb[i] : 0 )+r[i];
                  if (sub<0)
                        {
                        r[i+1]=-1;
                        sub+=100;
                        }
                  else
                        r[i+1]=0;
                  r[i]=sub;
                  }
            r.optimize();
            }
      return r;
      }
unlim
operator -(unlim &a,unlim &b)
      {
      return a+(-b);
      }
unlim
operator *(unlim &a,unlim &b)
      {
      unlim r;
      delete (r.pv)->body;
      if (a.sign==b.sign)
            r.sign=PLUS;
      else
            r.sign=MINUS;
      COUNT
            rlen=(a.pv)->len+(b.pv)->len,
            alen=(a.pv)->len/2+(a.pv)->len%2,
            blen=(b.pv)->len/2+(b.pv)->len%2;
      (r.pv)->len=rlen;
      rlen=rlen/2+rlen%2;
      (r.pv)->body=new char[rlen];
      COUNT i;
      for (i=0;i<rlen;i++)
            r[i]=0;
      for (i=0;i<alen;i++)
            {
            unsigned int
                  next=0,
                  mul;
            for(COUNT j=0;j<blen;j++)
                  {
                  next+=r[i+j];
                  mul=a[i]*b[j]+next;
                  r[i+j]=mul%100;
                  next=mul/100;
                  }
            r[i+blen]=next;
            }
      if ( r.digit((r.pv)->len-1)==0 )
            (r.pv)->len--;
      if ( r.digit((r.pv)->len-1)==0 )
            r.init0();
      return r;
      }
#define
COUNT unsigned int
#define
TRUE 1
#define
FALSE 0
#define
ILLEGAL 10
enum
      {
      PLUS,
      MINUS
      };
extern
class unlim
      {
      public:
            unlim(char*);
            unlim();
            unlim(unlim&);
            ~unlim();
            unlim
                  &operator = (char*),
                  &operator = (unlim&);
            friend int
                  operator ==
(unlim&,unlim&),
                  operator !=
(unlim&,unlim&),
                  operator >  (unlim&,unlim&),
                  operator >=
(unlim&,unlim&),
                  operator <  (unlim&,unlim&),
                  operator <=
(unlim&,unlim&);
            friend unlim
                  operator + (unlim&),          // unary
                  operator - (unlim&),          // unary
                  operator +
(unlim&,unlim&),   // binary
                  operator -
(unlim&,unlim&),   // binary
                  operator *
(unlim&,unlim&),
                  abs(unlim&);
            friend ostream
                  &operator <<
(ostream&,unlim&);
      private:
            struct descriptor
                  {
                  char
                        *body;
                  COUNT
                        len,
                        HowMany;
                  };
            descriptor
                  *pv;    //pointer to value descriptor
            char
                  sign,
                  digit(COUNT number);
            char
                  &operator [](COUNT i)
{return pv->body[i];}
            void
                  init0(),      //init by zero
                  NotDigit(),   //message "no digit" & init0
                  optimize(),   //optimize length of body
                  error(char*); //display error
message
      };
inline
int operator ==(unlim &a,unlim &b)
      {
      return !(a!=b);
      }
inline
int operator <=(unlim &a,unlim &b)
     

inline
int operator >=(unlim &a,unlim &b)
      {
      return !(a<b);
      }
inline
int operator >(unlim &a,unlim &b)
      {
      return !(a<b) && (a!=b);
      }
inline
unlim operator +(unlim &x)
      {
      return x;
      }
ðåôåðàòû
© ÐÅÔÅÐÀÒÛ, 2012

ðåôåðàòû