2.2. Ïðîìåíëèâè
Ïðåäñòàâåòå ñè, ÷å Âè å äàäåíà çàäà÷à
äà èç÷èñëèòå 2 íà ñòåïåí 10. Íàøèÿò ïúðâè îïèò áè ìîãúë äà èçãëåæäà
òàêà:
#include <striam.h>
main() {
// a first
solution
cout << 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2;
cout
<< "n";
return 0;
}
Íàïèñàíîòî ðàáîòè, âúïðåêè ÷å ùå íè
ñå íàëîæè äà ïðåáðîèì äâà èëè òðè ïúòè äàëè ñìå çàïèñàëè êîíñòàíòàòà 2 òî÷íî 10
ïúòè. Ñàìî òîãàâà ùå áúäåì äîâîëíè. Íàøàòà ïðîãðàìà ïðàâèëíî äàâà îòãîâîð
1024.
Ñåãà îáà÷å, íè ñå íàëàãà äà èç÷èñëèì 2, ïîâäèãíàòî íà 17 ñòåïåí, à
ñëåä òîâà íà 23. Íåïðèÿòíî å äà ïðîìåíÿìå ïðîãðàìàòà ñè âñåêè ïúò. Îùå ïî-ëîøî,
èçãëåæäà ïîðàçèòåëíî ëåñíî äà ñå íàïðàâè ãðåøêà êàòî ñå ïîñòàâè åäíà äâîéêà â
ïîâå÷å èëè ïî-ìàëêî. Îáà÷å, ïîíåæå ñìå âíèìàòåëíè, íèå èçáÿãâàìå
ãðåøêèòå.
Íàêðàÿ íè ñå íàëàãà äà íàïðàâèì òàáëèöà, êîÿòî äà ñúäúðæà
ñòåïåíèòå íà äâîéêàòà îò 0 äî 31. Àêî èçïîëçóâàìå ëèòåðàëíè êîíñòàíòè â äèðåêòíè
êîäîâè ïîñëåäîâàòåëíîñòè ùå íè áúäàò íåîáõîäèìè 64 ðåäà îò ñëåäíèÿ
âèä:
cout << "2 raised to the power of Xt";
cout << 2 *
... * 2;
êúäåòî Õ ùå ñå óâåëè÷àâà ñ åäèíèöà çà âñÿêà êîäîâà
äâîéêà.
 òîçè ìîìåíò, à ìîæå áè è ïî-ðàíî, íèå îñúçíàâàìå, ÷å òðÿáâà äà
èìà ïî-äîáúð íà÷èí. Êàêòî è íàèñòèíà èìà. Ðåøåíèåòî èçèñêâà âúâåæäàíåòî íà äâå
ïîíÿòèÿ, êîèòî âñå îùå íå ñà ôîðìàëíî äåôèíèðàíè:
1. Ïðîìåíëèâè, êîèòî
ïîçâîëÿâàò äà ñå ñúõðàíÿâàò è âúçñòàíîâÿâàò ñòîéíîñòè.
2. Ñúâêóïíîñò îò
óïðàâëÿâàùè îïåðàòîðè, êîèòî ïîçâîëÿâàò ìíîãîêðàòíîòî èçïúëíåíèå íà ÷àñò îò
ïðîãðàìíèÿ êîä. Íàïðèìåð, åòî åäèí âòîðè íà÷èí çà èç÷èñëÿâàíå íà 2 íà 10
ñòåïåí:
#include <stream.h>
main() {
// a second more
general solution
int value = 2;
int pow = 10;
cout <<
value<< " raised to the power of "
<< pow << ":
t";
for ( int i = 1, res = 1; i <= pow; ++i )
{ res = res *
value;}
cout << res << "n";
return
0;
}
Îïåðàòîðúò, çàïî÷âàù ñ for, ñå íàðè÷à îïåðàòîð çà öèêúë: äîêàòî i
å ïî-ìàëêî èëè ðàâíî íà pow, ñå èçïúëíÿâà òÿëîòî íà for, çàòâîðåíî âúâ ôèãóðíè
ñêîáè. Öèêúëúò for ñå íàðè÷à ïîòî÷íî óïðàâëÿâàù îïåðàòîð.
value, pow, res
è i ñà ïðîìåíëèâè, êîèòî ïîçâîëÿâàò äà ñå ñúõðàíÿâàò, ïðîìåíÿò è âúçñòàíîâÿâàò
ñòîéíîñòè. Òå ñà òåìà íà ñëåäâàùèòå ïîäãëàâè. Ïúðâî, îáà÷å, íåêà ïðèëîæèì äðóãî
íèâî íà îáîáùàâàíå íà ïðîãðàìàòà êàòî îòäåëèì ÷àñò îò ïðîãðàìàòà, êîÿòî
èç÷èñëÿâà ñòåïåíòà íà âåëè÷èíàòà è äà ÿ äåôèíèðàìå êàòî îòäåëíà
ôóíêöèÿ.
Âñÿêà çàäà÷à, êîÿòî èçèñêâà èç÷èñëÿâàíåòî íà íÿêàêâà ñòåïåí íà
äàäåíà ñòîéíîñò, ñåãà ìîæå ïðîñòî äà èçâèêà pow() ñ ïîäõîäÿùî ìíîæåñòâî
àðãóìåíòè. Èñêàíàòà òàáëèöà îò ñòåïåíè íà äâîéêàòà ñåãà ìîæå äà áúäå ïîëó÷åíà ïî
ñëåäíèÿ íà÷èí:
Òàáëèöà 1.1 ïðåäñòàâÿ ðåçóëòàòà îò èçïúëíåíèåòî íà òàçè
ïðîãðàìà.
Ñòåïåíè íà 2
0: 1
1: 2
2: 4
3: 8
4: 16
5:
32
6: 64
7: 128
8: 256
9: 512
10: 1024
11: 2048
12:
4096
13: 8192
14: 16384
Ñòåïåíè íà 2
Òàçè ðåàëèçàöèÿ
íà pow() íå ïðîâåðÿâà îíåçè îñîáåíè ñëó÷àè, êîãàòî èìàìå ïîâäèãàíå íà
îòðèöàòåëíà ñòåïåí èëè ñòîéíîñòòà - ðåçóëòàò å ìíîãî
ãîëÿìà.
Óïðàæíåíèå 1-1. Êàêâî ùå ñòàíå àêî pow() áúäå èçâèêàíà ñ
îòðèöàòåëåí âòîðè àðãóìåíò? Êàê ìîæå äà áúäå ïðîìåíåíà pow() çà äà îáðàáîòâà
òîâà?
Óïðàæíåíèå 1-2. Âñåêè òèï äàííè èìà äîëíà è ãîðíà ãðàíèöà çà
ñòîéíîñòèòå, êîèòî ìîæå äà ïîääúðæà, îïðåäåëåíè îò áðîÿ íà áèòîâåòå, îòäåëåíè çà
ïðåäñòàâÿíåòî ìó. Êàê òîâà ìîæå äà ñå îòðàçè íà pow()? Êàê äà áúäå ïðîìåíåíà
ôóíêöèÿòà pow() çà äà îáðàáîòâà ïîâèêâàíèÿ êàòî pow( 2, 48 )?
Êàêâî å
ïðîìåíëèâà?
Âñÿêà ïðîìåíëèâà ñå èäåíòèôèöèðà îò èìå, äåôèíèðàíî îò
ïîòðåáèòåëÿ. Òÿ èìà è ñúîòâåòåí òèï. Íàïðèìåð, ñëåäâàùèÿò îïåðàòîð äåôèíèðà
ïðîìåíëèâà ch îò òèï char:
char ch;
char ñïåöèôèêàòîð íà òèï.
short, int, long, float è double ñúùî ïðåäñòàâÿò òèïîâè ñïåöèôèêàöèè. Èçîáùî,
âñÿêà äåêëàðàöèÿ òðÿáâà äà çàïî÷âà ñ òèïîâ ñïåöèôèêàòîð. Òèïîâåòå íà äàííèòå
îïðåäåëÿò êîëè÷åñòâîòî ïàìåò, îòäåëåíî çà ïðîìåíëèâàòà, êàêòî è íàáîðà îò
îïåðàöèè, êîèòî ìîãàò äà áúäàò ïðèëàãàíè íàä òîçè òèï äàííè. (Çà íàøèòå
ïðåäïîëîæåíèÿ char ùå èìà ðàçìåð â áèòîâå 8).
Êàêòî ïðîìåíëèâèòå, òàêà è
êîíñòàíòèòå ñå ñúõðàíÿâàò â ïàìåòòà è ñà ñâúðçàíè ñ îïðåäåëåí òèï. Ðàçëèêàòà ñå
ñúñòîè â òîâà, ÷å ïðîìåíëèâèòå ñà àäðåñèðóåìè. Ò.å., èìà äâå ñòîéíîñòè, ñâúðçàíè
ñ äàäåíà ïðîìåíëèâà:
1. Íåéíàòà ñòîéíîñò, ñúõðàíåíà íà íÿêàêâî ìÿñòî â
ïàìåòòà. Òîâà ïîÿíêîãà ñå íàðè÷à íåéíà rvalue (ïðîèçíàñÿ ñå
“are-value”).
2. Ñòîéíîñòòà, îïðåäåëÿùà ìåñòîïîëîæåíèåòî é; ò.å., àäðåñà
â ïàìåòòà, êúäåòî å çàïèñàíà âåëè÷èíàòà. Òîâà ïîíÿêîãà ñå íàðè÷à íåéíà lvalue
(ïðîèçíàñÿ ñå “ell-value”).
 èçðàçà
ch = ch -
‘0’;
ïðîìåíëèâàòà ch ñå íàìèðà êàêòî îò ëÿâî òàêà è îòäÿñíî íà îïåðàòîðà
çà ïðèñâîÿâàíå. Íàïèñàíà îò ëÿâî, òÿ òðÿáâà äà áúäå ïðî÷åòåíà. Ñòîéíîñòòà é ñå
èçâëè÷à îò ìåñòîïîëîæåíèåòî é â ïàìåòòà. Ñëåä òîâà ñèìâîëíèÿò ëèòåðàë ñå èçâàæäà
îò òàçè ñòîéíîñò. Òåðìèíúò rvalue ïðîèçëèçà îò ìåñòîïîëîæåíèåòî íà ïðîìåíëèâàòà
â äÿñíî íà îïåðàòîðà çà ïðèñâîÿâàíå. Òÿ ìîæå äà áúäå ÷åòåíà, íî íå è ïðîìåíÿíà.
Çà íåÿ ìîæå äà ñå ìèñëè êàòî çà ñòîéíîñò çà ÷åòåíå.
Íàïèñàíà îò äÿñíî,
ïðîìåíëèâàòà ch ùå áúäå çàïèñâàíà. Ðåçóëòàòúò îò îïåðàöèÿòà èçâàæäàíå ñå çàïèñâà
íà ìÿñòîòî çà ñòîéíîñò íà ch âúðõó ïðåäõîäíàòà ñòîéíîñò. Òåðìèíúò lvalue
ïðîèçëèçà îò ðàçïîëîæåíèåòî íà ïðîìåíëèâàòà îò ëÿâàòà ñòðàíà íà îïåðàòîðà çà
ïðèñâîÿâàíå. Çà íåÿ ìîæå äà ñå ìèñëè êàòî çà ñòîéíîñò íà ìåñòîïîëîæåíèå. ch ñå
îçíà÷àâà êàòî îáåêò. Âñåêè îáåêò ïðåäñòàâÿ íÿêàêâà îáëàñò îò ïàìåòòà. ch
ïðåäñòàâÿ îáëàñò îò ïàìåòòà ñ ðàçìåð 1 áàéò.
Äåôèíèöèÿòà íà åäíà
ïðîìåíëèâà óêàçâà êàê òÿ äà áúäå ñúõðàíåíà. Äåôèíèöèÿòà îïðåäåëÿ èìåòî íà
ïðîìåíëèâàòà è íåéíèÿ òèï. Ñúîòâåòíî, áè ìîãëà äà áúäå äîáàâåíà è íà÷àëíà
ñòîéíîñò çà ïðîìåíëèâàòà. Òðÿáâà äà èìà åäíà è ñàìî åäíà äåôèíèöèÿ íà äàäåíà
ïðîìåíëèâà â ïðîãðàìà.
Äåêëàðàöèÿòà íà ïðîìåíëèâàòà îáÿâÿâà, ÷å
ïðîìåíëèâàòà ñúùåñòâóâà è å äåôèíèðàíà íÿêúäå. Òÿ ñå ñúñòîè îò èìåòî íà
ïðîìåíëèâàòà, òèïà é è êëþ÷îâàòà äóìà extern. (Çà ïîâå÷å èíôîðìàöèÿ, âæ. ðàçäåë
4.9 Ïðîãðàìåí îáõâàò). Äåêëàðàöèÿòà íå å äåôèíèöèÿ. Òÿ íå ïðåäèçâèêâà çàäåëÿíå
íà ìÿñòî â ïàìåò. Ïî-ñêîðî òÿ åäíî òâúðäåíèå, ÷å äåôèíèöèÿòà íà ïðîìåíëèâàòà
ñúùåñòâóâà íÿêúäå â òåêñòà íà ïðîãðàìàòà. Åäíà ïðîìåíëèâà ìîæå äà áúäå
äåêëàðèðàíà íåêîëêîêðàòíî â ïðîãðàìàòà.
 Ñ++ âñÿêà ïðîìåíëèâà òðÿáâà äà
áúäå äåôèíèðàíà èëè äåêëàðèðàíà â ïðîãðàìàòà ïðåäè äà ìîæå äà áúäå
èçïîëçóâàíà.
Èìå íà ïðîìåíëèâà
Èìåòî íà ïðîìåíëèâàòà, ò.å.
íåéíèÿò èäåíòèôèêàòîð, ìîæå äà áúäå îáðàçóâàíî îò áóêâè, öèôðè è ïîä÷åðòàâàùî
òèðåíöå. Ãëàâíèòå è ìàëêèòå áóêâè ñà ðàçëè÷èìè. Íÿìà åçèêîâî íàëîæåíî
îãðàíè÷åíèå âúðõó ðàçðåøåíàòà äúëæèíà íà èìåòî, òÿ å ðàçëè÷íà çà ðàçëè÷íèòå
ðåàëèçàöèè.
 Ñ++ èìà íàáîð îò äóìè, ïðåäíàçíà÷åíè çà èçïîëçóâàíå îò
åçèêà êàòî êëþ÷îâè äóìè. Ïðåäâàðèòåëíî äåôèíèðàíèòå òèïîâè ñïåöèôèêàòîðè,
íàïðèìåð, ñà çàïàçåíè äóìè. Èäåíòèôèêàòîðèòå, êîèòî ñà êëþ÷îâè äóìè, íå ìîãàò äà
áúäàò èçïîëçóâàíè êàòî ïðîãðàìíè èäåíòèôèêàòîðè. Òàáëèöà 1.2 äàâà ñïèñúê íà
çàïàçåíèòå êëþ÷îâè äóìè â Ñ++.
Ñúùåñòâóâàò ìíîæåñòâî îáùîïðèåòè
ñïîðàçóìåíèÿ çà èìåíóâàíå íà èäåíòèôèêàòîðè, ïîäïîìàãàùè ÷èòàåìîñòòà íà
ïðîãðàìàòà:
- Îáèêíîâåíî èäåíòèôèêàòîðúò ñå çàïèñâà ñ ìàëêè áóêâè.
-
Èäåíòèôèêàòîðúò èìà ìíåìîíè÷íî èìå; ò.å., èìå, êîåòî ïîÿñíÿâà íåãîâîòî
èçïîëçóâàíå â ïðîãðàìàòà.
- Èäåíòèôèêàòîðèòå, êîèòî ñå ñúñòîÿò îò íÿêîëêî
äóìè, ñå çàïèñâàò èëè ñ ðàçäåëÿùî ïîä÷åðòàâàùî òèðå èëè êàòî ñå èçïîëçóâàò
ãëàâíè áóêâè çà âñÿêà âêëþ÷åíà äóìà. Íàïðèìåð, ìîæå äà ñå íàïèøå is_empty èëè
isEmpty, íî íå isempty.
Çàáåëåæåòå, ÷å template å ïðåäïîëàãàåìà êëþ÷îâà
äóìà çà âúçìîæíî áúäåùî ðàçøèðåíèå íà Ñ++ çà ïîääúðæàíå íà ïàðàìå-òðèçèðàíè
òèïîâå.
Òàáëèöà 1.2 Êëþ÷îâè äóìè â
Ñ++
asmdelete
If
register
template
auto
do
Inline
Return
try
break
double
default
Int
Short
typedef
case
else
this
Long
Signed
union
goto
catch
enum
New
Sizeof
unsigned
char
extern
protected
Operator
Static
virtual
class
float
public
Overload
Struct
void
while
const
for
Private
Switch
volatile
continue
friend