Ïîìîãíè íè äà íàïðàâèì Uroci.net ïî - áîãàò! Äîáàâè óðîê
Êàòåãîðèè Äðóãè óðîöè Adobe Photoshop Adobe Illustrator Adobe Flash Adobe Fireworks DreamWeaver CSS è HTML Corel Draw Image Ready PHP SEO CMS Microsoft Windows Microsoft Word Microsoft Excel PowerPoint Microsoft Access Microsoft Publisher Linux Visual basic JavaScript Ajax 3ds Max Maya 3D C++
C++
Sound Forge Gimp SWiSH

Ñ++ ÷àñò.2 (Òèïîâå äàííè)

C++ » C++
fix3d   òðóäíîñò:    âèäÿí: 8093



Äåôèíèöèè íà ïðîìåíëèâè

Åäíà ïðîñòà äåôèíèöèÿ ñå ñúñòîè îò ñïåöèôèêàòîð íà òèï ñëåäâàí îò èìå. Äåôèíèöèÿòà ñå îãðàíè÷àâà îò òî÷êà è çàïåòàÿ. Åòî íÿêîè ïðèìåðè íà ïðîñòè äåôèíèöèè:

double salary;
double wage;
int month;
int day;
int year;
unsigned long distance;

Êîãàòî ñå äåôèíèðà ïîâå÷å îò åäèí èäåíòèôèêàòîð çà äàäåí òèï, ñïèñúêúò îò èäåíòèôèêàòîðè, çàïèñàí ñëåä ñïåöèôèêàòîðà íà òèï, ñå ðàçäåëÿ ÷ðåç çàïåòàè. Òîçè ñïèñúê ìîæå äà áúäå ðàçïîëîæåí íà íÿêîë-êî ðåäà. Îãðàíè÷àâà ñå îò òî÷êà è çàïåòàÿ. Íàïðèìåð, ïðåäõîäíèòå äåôèíèöèè ìîãàò äà áúäàò çàïèñàíè ïî ñëåäíèÿ íà÷èí:

double salary, wage;
int month,
day, year;
unsigned long distance;

Âñÿêà ïðîñòà äåôèíèöèÿ îïðåäåëÿ òèïà è èäåíòèôèêàòîðà íà ïðîìåíëèâàòà. Òÿ íå äàâà íà÷àëíà ñòîéíîñò. Çà ïðîìåíëèâà, êîÿòî íÿìà íà÷àëíà ñòîéíîñò, ñå êàçâà ÷å å íåèíèöèàëèçèðàíà. Âñÿêà íåèíèöèàëèçèðàíà ïðîìåíëèâà ôàêòè÷åñêè èìà ñòîéíîñò; íî ïî-ñêîðî ìîæå äà ñå êàæå, ÷å ñòîéíîñòòà é å íåäåôèíèðàíà. Òîâà å òàêà, ïîíåæå ïàìåòòà, îòäåëåíà çà ñúõðàíÿâàíå íà ïðîìåíëèâàòà íå å èçòðèòà. Ïðîñòî å îñòàíàëî òîâà, êîåòî å áèëî çàïèñàíî â ïàìåòòà ïðè ïðåäõîäíîòî èçïîëçóâàíå íà òàçè ïàìåò. Êîãàòî ñå ÷åòå åäíà íåèíèöèàëèçèðàíà ïðîìåíëèâà ñëó÷àéíàòà áèòîâà ïîñëå-äîâàòåëíîñò ñå èíòåðïðåòèðà êàòî íåéíà ñòîéíîñò. Òàçè ñòîéíîñò ùå ñå ïðîìåíÿ çà ðàçëè÷íèòå èçïúëíåíèÿ íà ïðîãðàìàòà. Ñëåäíàòà ïðèìåðíà ïðîãðàìà èëþñòðèðà ñëó÷àéíèÿ õàðàêòåð íà íåèíèöèàëèçèðàíèòå äàííè.

#include <stream.h>

const iterations = 2;
void func() {
// illustrate danger of uninitialized variables
int value1, value2; // uninitialized
static int depth = 0;
if ( depth < iterations ) {
++depth;
func();
}
else depth = 0;
cout << "nvalue1:t" << value1;
cout << "nvalue2:t" << value2;
cout << "tsum:t" << value1 + value2;
}
main() {
for ( int i = 0; i < iterations; ++i )
func();
}

Êîãàòî òàçè ïðîãðàìà áúäå êîìïèëèðàíà è èçïúëíåíà, ñå ïîëó÷àâà ñëåäíèÿ ïî-ñêîðî èçíåíàäâàù èçõîä (îñâåí òîâà, òåçè ðåçóëòàòè ùå ñå ïðîìåíÿò ïðè âñÿêî êîìïèëèðàíå è èçïúëíåíèå íà ïðîãðàìàòà):

value1: 0 value2: 74924 sum: 74924
value1: 0 value2: 68748 sum: 68748
value1: 0 value2: 68756 sum: 68756
value1: 148620 value2: 2350 sum: 150970
value1: 2147479844 value2: 671088640 sum: -1476398812
value1: 0 value2: 68756 sum: 68756

 òàçè ïðîãðàìà iterations ñå èçïîëçóâà êàòî êîíñòàíòà. Òîâà ñå îòáåëÿçâà ñ êëþ÷îâàòà äóìà const. Êîíñòàíòèòå ñå ðàçãëåæäàò â ðàçäåë 1.5 íà òàçè ãëàâà. depth ïðåäñòàâëÿâà ëîêàëíà ñòàòè÷íà ïðîìåíëèâà.

Çíà÷åíèåòî íà äóìàòà static ñå ðàçÿñíÿâà â ðàçäåë 3.10 ïðè îáñúæäàíåòî íà îáõâàòà. func() å îïèñàíà êàòî ðåêóðñèâíà ôóíêöèÿ. Ðàçäåë 4.1 ðàçãëåæäà ðåêóðñèâíèòå ôóíêöèè.

 äåôèíèöèÿòà íà åäíà ïðîìåíëèâà ìîæå äà é ñå äàäå ïúðâîíà÷àëíà ñòîéíîñò. Çà ïðîìåíëèâà, íà êîÿòî å äàäåíà ïúðâîíà÷àëíà ñòîéíîñò â äåêëàðàöèÿòà ñå êàçâà, ÷å å èíèöèàëèçèðàíà. Åòî íÿêîëêî ïðèìåðà çà èíèöèàëèçèðàíå íà ïðîìåíëèâè:

#include <math.h>
double price = 109.99, discount = 0.16,
salePrice = price * discount;
int val = getValue();
unsigned absVal = abs ( val );

Ïðåäâàðèòåëíî äåôèíèðàíàòà ôóíêöèÿ abs(), íàìèðàùà ñå â áèáëèîòåêàòà math, âðúùà àáñîëþòíàòà ñòîéíîñò íà àðãóìåíòà ñè. getValue() å ôóíêöèÿ, äåôèíèðàíà îò ïîòðåáèòåëÿ, êîÿòî âðúùà ñëó÷àéíî öÿëî ÷èñëî. Ïðîìåíëèâèòå ìîãàò äà áúäàò èíèöèàëèçèðàíè ñúñ ïðîèçâîëíè ñëîæíè èçðàçè.

2.3. Óêàçàòåëíè òèïîâå

Ïðîìåíëèâàòà óêàçàòåë ñúäúðæà ñòîéíîñò, êîÿòî ïðåäñòàâëÿâà àäðåñ íà îáåêò â ïàìåòòà. ×ðåç óêàçàòåëÿ ìîæåì äà ñå îáúðíåì êúì îáåêòà íåïðÿêî. Åäíî òèïè÷íî èçïîëçóâàíå íà óêàçàòåëè å çà ñúçäàâàíå íà ñâúðçàíè ñïèñúöè è óïðàâëåíèå íà îáåêòè, àäðåñèðàíè ïî âðåìå íà èçïúëíåíèå íà ïðîãðàìàòà.

Âñåêè óêàçàòåë ñå ñâúðçâà ñ îïðåäåëåí òèï. Òèïúò íà äàííèòå îïðåäåëÿ òèïà íà îáåêòà, êîéòî ùå áúäå àäðåñèðàí ÷ðåç óêàçàòåëÿ. Íàïðèìåð, óêàçàòåë îò òèï int ùå ñî÷å îáåêò îò òèï int. Ñúîòâåòíî, çà äà ñî÷è îáåêò îò òèï double óêàçàòåëÿò òðÿáâà äà ñå äåôèíèðà îò òèï double.

Ïàìåòòà, îòäåëåíà çà åäèí óêàçàòåë, èìà ðàçìåð, íåîáõîäèì çà çàïèñâàíå íà àäðåñ â ïàìåòòà. Òîâà îçíà÷àâà, ÷å óêàçàòåëè îò òèï int è óêàçàòåëè îò òèï double èìàò îáèêíîâåíî åäíàêúâ ðàçìåð. Òèïà, àñîöèèðàí ñ óêàçàòåëÿ, îïðåäåëÿ êàê äà áúäå èíòåðïðåòèðàíî ñúäúðæàíèåòî è êàêâà äà å äúëæèíàòà íà áèòîâàòà ïîñëåäîâàòåëíîñò íà òîçè àäðåñ îò ïàìåòòà. Åòî íÿêîëêî ïðèìåðà íà äåôèíèöèè íà ïðîìåíëèâè óêàçàòåëè:

int *ip1, *ip2;
unsigned char *ucp;
double *dp;

Äåôèíèöèÿòà íà óêàçàòåë ñå ñúñòîè îò èäåíòèôèêàòîð, ïðåäõîæäàí îò îïåðàòîðà (“*”). Â ðàçäåëåíèÿ ñúñ çàïåòàè ñïèñúê íà äåôèíèöèèòå îïåðàòîðúò * òðÿáâà äà ïðåäõîæäà âñåêè èäåíòèôèêàòîð, êîéòî èñêàìå äà íè ñëóæè êàòî óêàçàòåë. Â ñëåäâàùèÿ ïðèìåð lp ñå èíòåðïðåòèðà êàòî óêàçàòåë êúì ïðîìåíëèâà îò òèï long, à lp2 - êàòî äàííîâ îáåêò îò òèï long, à íå êàòî óêàçàòåë.

long *lp, lp2;

 ïðèìåðà, êîéòî ñëåäâà, fp ñå èíòåðïðåòèðà êàòî äàííîâ îáåêò îò òèï float, à fp2 ñå èíòåðïðåòèðà êàòî óêàçàòåë êúì ïðîìåíëèâà îò òèï float:

float fpf, *fp2;

Çà ïî-ãîëÿìà ÿñíîòà ñå ïðåïîðú÷âà äà ñå çàïèñâà

char *cp;

à íå

char* cp;

Ìíîãî ÷åñòî, ïðîãðàìèñòúò, æåëàåù äà äåôèíèðà ïî-êúñíî âòîðè óêàçàòåë êúì òèï char, ùå ïðîìåíè íåïðàâèëíî òàçè äåôèíèöèÿ òàêà:

char* cp, cp2;

Äàäåí óêàçàòåë ìîæå äà áúäå èíèöèàëèçèðàí ñúñ ñòîéíîñòòà çà çàïèñ (lvalue) íà äàííîâ îáåêò îò ñúùèÿ òèï. Ïðèïîìíÿìå, ÷å îáåêòà, íàìèðàù ñå îò äÿñíî íà îïåðàòîðà çà ïðèñâîÿâàíå äàâà ñòîéíîñòòà çà ÷åòåíå (rvalue). Çà äà ñå èçâëå÷å ñòîéíîñòòà çà çàïèñ íà îáåêò à òðÿáâà äà ñå ïðèëîæè ñïåöèàëåí îïåðàòîð. Òîé ñå íàðè÷à àäðåñåí îïåðàòîð è ñå çàïèñâà ñúñ ñúìâîëà &. Íàïðèìåð,

int i = 1024;
int *ip = &i; // assign ip the addres of i

Óêàçàòåë ìîæå äà áúäå èíèöèàëèçèðàí êàòî ñå èçïîëçóâà äðóã óêàçàòåë îò ñúùèÿ òèï.  òîçè ñëó÷àé àäðåñíèÿò îïåðàòîð íå å íåîáõîäèì:

int *ip2 = ip;

Âèíàãè ñå ñ÷èòà çà ãðåøêà àêî óêàçàòåë ñå èíèöèàëèçèðà êàòî ñå èçïîëçóâà äàííîâ îáåêò îò òèï rvalue. Ñëåäíèòå äåêëàðàöèè íÿìà äà áúäàò ïðèåòè çà ïðàâèëíè ïî âðåìå íà êîìïèëàöèÿ:

int i = 1024;
int *ip = i; //error

Ãðåøíî å ñúùî óêàçàòåë äà ñå èíèöèàëèçèðà ÷ðåç ñòîéíîñòòà çà çàïèñ lvalue íà îáåêò îò ðàçëè÷åí òèï. Äåôèíèöèèòå íà uip è uip2 ùå áúäàò îòáåëÿçàíè êàòî íåïðàâèëíè ïî âðåìå íà êîìïèëàöèÿ:

int i = 1024, *ip = &i; // ok
unsigned int *uip = &i; // illegal
*uip2 = ip; // illegal

Ñ++ å ñòðîãî òèïèçèðàí åçèê. Âñè÷êè èíèöèàëèçàöèè è ïðèñâîÿâàíèÿ íà ñòîéíîñòè ñå ïðîâåðÿâàò çà äà ñìå ñèãóðíè, ÷å òåçè ñòîéíîñòè ñà êîðåêòíî ñúïîñòàâèìè. Àêî òå íå ñà è ñúùåñòâóâà ïðàâèëî çà ñúïîñòàâÿíåòî èì, êîìïèëàòîðúò ùå ãî ïðèëîæè. Òîâà ïðàâèëî ñå íàðè÷à ïðàâèëî çà ïðåîáðàçóâàíå íà òèïîâåòå. (âæ. ðàçäåë 2.10 çà ïîäðîáíîñòè). Àêî ïðàâèëî íÿìà, îïåðàòîðúò ñå îòáåëÿçâà êàòî ãðåøåí. Æåëàòåëíî å òîâà äà áúäå èçâúðøâàíî, ïîíåæå íå å áåçîïàñíî äà ñå ïðàâè èíèöèàëèçàöèÿ èëè ïðèñâîÿâàíå áåç ïðåîáðàçóâàùî ïðàâèëî è âåðîÿòíî ùå áúäå ïîñëåäâàíî îò ïðîãðàìíà ãðåøêà ïî âðåìå íà èçïúëíåíèå.

Áè ñëåäâàëî äà áúäå î÷åâèäíî çàùî å îïàñíî ïðèñâîÿâàíåòî íà îáåêò îò òèï rvalue íà óêàçàòåë. Ïî äåôèíèöèÿ ñòîéíîñòòà íà óêàçàòåëÿ ïðåäñòàâÿ àäðåñ â ïàìåòòà. Âñåêè îïèò çà ÷åòåíå èëè çàïèñ íà òîçè “àäðåñ” å îïàñåí.

Ïî-íåÿñíî å çàùî ñúùåñòâóâà îïàñíîñò ïðè èíèöèàëèçèðàíå íà óêàçàòåë ñúñ ñòîéíîñòòà çà çàïèñ íà îáåêò îò äðóã òèï. Íåêà ñå âúðíåì íàçàä è ñè ïðèïîìíèì èäåÿòà, ÷å òèïúò íà óêàçàòåëÿ îïðåäåëÿ êàê äà áúäå èíòåðïðåòèðàíà àäðåñèðàíàòà ïàìåò.

Íàïðèìåð, âúïðåêè ÷å, óêàçàòåë êúì ïðîìåíëèâà îò òèï int è óêàçàòåë êúì ïðîìåíëèâà îò òèï double ìîãàò äà ñúäúðæàò åäèí è ñúù àäðåñ â ïàìåòòà, ðàçìåðúò íà ïàìåòòà, îò êîÿòî ùå áúäå ÷åòåíî è çàïèñâàíî êàòî ñå èçïîëçóâàò óêàçàòåëèòå ùå áúäå ðàçëè÷åí ïîðàäè ðàçëè÷íèÿ ðàçìåð íà int è double. Îñâåí òîâà, îðãàíèçàöèÿòà è çíà÷åíèåòî íà áèòîâèòå ïîñëåäîâàòåëíîñòè ùå áúäå ðàçëè÷íà çà ðàçëè÷íèòå òèïîâå.

Êàçàíîòî äî òóê íå îçíà÷àâà, ÷å ïðîãðàìèñòúò íå áè ìîãúë äà ïðåâúðíå óêàçàòåë îò åäèí òèï êúì óêàçàòåë îò äðóã òèï. Íåçàâèñèìî îò ôàêòà, ÷å òîâà å ïîòåíöèàëíî îïàñíî, òî áè ìîãëî äà áúäå íàïðàâåíî, íî ñàìî àêî å îïèñàíî ÿâíî. (Ðàçäåë 3.10 ðàçãëåæäà ÿâíîòî ïðåîáðàçóâàíå íà òèïîâåòå).

Óêàçàòåë îò ïðîèçâîëåí òèï ìîæå äà ïîëó÷è ñòîéíîñò 0, êàòî òîâà ùå ïîêàçâà, ÷å â ìîìåíòà óêàçàòåëÿò íå àäðåñèðà äàííîâ îáåêò. Ñòîéíîñòòà 0, êîãàòî ñå èçïîëçóâà êàòî ñòîéíîñò íà óêàçàòåë, ïîíÿêîãà ñå íàðè÷à NULL. Ñúùåñòâóâà ñúùî ñïåöèàëåí òèï íà óêàçàòåë, void*, ñ êîéòî ìîæå äà áúäå ïðèñâîåí àäðåñ íà îáåêò îò ïðîèçâîëåí äàííîâ òèï. (Ðàçäåë 3.10 ðàçãëåæäà óêàçàòåëíèÿ òèï void*).

Çà äà èìàòå äîñòúï äî îáåêò ïî àäðåñ â óêàçàòåë òðÿáâà äà ïðèëîæèòå îïåðàòîðà *. Íàïðèìåð,

int i = 1024;
int *ip = &i; // ip now points to i
int k = *ip; // k now contains 1024

Êîãàòî íå å ïðèëîæåí îïåðàòîðà *, k ùå áúäå èíèöèàëèçèðàíà êàòî àäðåñ íà i, à íå ÷ðåç íåéíàòà ñòîéíîñò, êîåòî ùå ïðåäèçâèêà ãðåøêà ïðè êîìïèëàöèÿ.

int *ip = &i; // ip now points to i
int k = ip; // error

Çà äà ïðèñâîèòå ñòîéíîñò íà îáåêò, ñî÷åí îò óêàçàòåë, òðÿáâà äà ïðèëîæèòå îïåðàòîðà * êúì óêàçàòåëÿ. Íàïðèìåð,

int *ip = &i; // ip now points to i
*ip = k; // i = k;
*ip = abs( *ip ); // i = abs(i);
*ip = *ip + 1; // i = i + 1;

Ñëåäíèòå äâà îïåðàòîðà çà ïðèñâîÿâàíå äàâàò ñúâñåì ðàçëè÷íè ðåçóëòàòè, âúïðåêè ÷å è äâàòà ñà êîðåêòíè. Ïúðâèÿò îïåðàòîð óâåëè÷àâà àäðåñà êîéòî óêàçàòåëÿ ip ñúäúðæà; âòîðèÿò óâåëè÷àâà ñòîéíîñòòà íà äàííîâèÿ îáåêò, êîéòî ip àäðåñèðà.

int i, j, k;
int *ip = &i;
ip = ip + 2; // add to the address ip contains
*ip = *ip + 2; // i = i + 2;

Êúì àäðåñíàòà ñòîéíîñò íà óêàçàòåëÿ ìîæå äà áúäå äîáàâÿíà èëè èçâàæäàíà öÿëà ñòîéíîñò. Òîçè òèï îáðàáîòêà íà óêàçàòåëè, íàðè÷àí óêàçàòåëíà èëè àäðåñíà àðèòìåòèêà, â íà÷àëîòî èçãëåæäà ìàëêî íååñòåñòâåí, äîêàòî íå îñúçíàåì, ÷å ñå îñúùåñòâÿâà ñúáèðàíå ñ äàííîâ îáåêò, à íå ñ îòäåëíà äåñåòè÷íà ñòîéíîñò. Ò.å., äîáàâÿíåòî íà 2 êúì åäèí óêàçàòåë óâåëè÷àâà ñòîéíîñòòà íà àäðåñà, êîéòî òîé ñúäúðæà, ñ ðàçìåðà íà äâà îáåêòà îò íåãîâèÿ òèïà. Íàïðèìåð, êàòî äîïóñíåì, ÷å òèïúò char çàåìà 1 áàéò, int - 4 áàéòà, à double - 8, äîáàâÿíåòî íà 2 êúì äàäåí óêàçàòåë óâåëè÷àâà àäðåñíàòà ìó ñòîéíîñò ñúîòâåòíî ñ 2, 8 èëè 16 â çàâèñèìîñò îò òèïà ìó char, int èëè double.

Óïðàæíåíèå 1-3. Äàäåíè ñà ñëåäíèòå äåôèíèöèè:

int ival = 1024;
int *iptr;
double *dptr;

ó÷àñòâóâàùè â ñëåäíèòå îïåðàòîðè çà ïðèñâîÿâàíå. Êîè îò òÿõ ñà ïðàâèëíè? Îáÿñíåòå çàùî.

(a) ival = *iptr; (b) ival = iptr;
(c) *iptr = ival; (d) iptr = ival;
(e) *iptr = &ival; (f) iptr = &ival;
(g) dptr = iptr; (h) dptr = *iptr;

Óïðàæíåíèå 1-4. Íà äàäåíà ïðîìåíëèâà ñå ïðèñâîÿâà åäíà îò ñëåäíèòå òðè ñòîéíîñòè:

0, 128 è 255.

Ðàçãëåäàéòå ïðåäèìñòâàòà è íåäîñòàòúöèòå íà äåêëàðèðàíåòî íà ïðîìåíëèâàòà êàòî ïðèíàäëåæàùà íà íÿêîè îò ñëåäíèòå äàííîâè òèïîâå:

(a) double (c) unsigned char
(b) int (d) char


Óêàçàòåëè êúì íèçîâå

Íàé-÷åñòî óêàçàòåëè ñå äåôèíèðàò êúì ïðåäâàðèòåëíî äåôèíèðàíèÿ äàííîâ òèï char*. Òîâà å òàêà, ïîíåæå öÿëàòà îáðàáîòêà íà íèçîâå â Ñ++ ñå îñúùåñòâÿâà ÷ðåç ñèìâîëíè óêàçàòåëè. Òîçè ïîäðàçäåë ïîÿñíÿâà ïîäðîáíî èçïîëçóâàíåòî íà char*.  ãëàâà 6 ùå äåôèíèðàìå êëàñîâèÿ òèï String.

Òèïúò íà ëèòåðàëíà íèçîâà êîíñòàíòà ïðåäñòàâëÿâà óêàçàòåë êúì ïúðâèÿ ñèìâîë íà íèçà. Òîâà îçíà÷àâà, ÷å âñÿêà íèçîâà êîíñòàíòà å îò òèï char* è ìîæå äà áúäå èíèöèàëèçàðàíà êàòî íèç ïî ñëåäíèÿ íà÷èí:

char *st = "The expense of spiritn";

Ñëåäíàòà ïðîãðàìà, ïðîåêòèðàíà äà èç÷èñëÿâà äúëæèíàòà íà st, èçïîëçóâà àäðåñíàòà àðèòìåòèêà çà ïðåãëåæäàíåòî íà íèçà. Èäåÿòà å äà ñå çàâúðøè èçïúëíåíèåòî íà öèêúëà, êîãàòî áúäå ñðåùíàò íóëåâèÿ ñèìâîë, ïîñòàâÿí îò êîìïèëàòîðà â êðàÿ íà âñÿêà ëèòåðàëíà íèçîâà êîíñòàíòà. Çà íåùàñòèå ïðîãðàìàòà, êîÿòî ñìå íàïèñàëè å íåïðàâèëíà. Áèõòå ëè ìîãëè äà óñòàíîâèòå êàêâà å ãðåøêàòà?

#include <stream.h>

char *st = "The expense of spiritn";
main() {
int len = 0;
while ( st++ != ‘�’ ) ++len;
cout << len << ": " << st;
return 0;
}

Ãðåøêàòà â òàçè ïðîãðàìà ïðîèçòè÷à îò ôàêòà, ÷å st íå å óêàçàíà. Ò.å.,

st++ != ‘�’

ïðîâåðÿâà äàëè àäðåñà, ñî÷åí îò st å íóëåâèÿ ñèìâîë, à íå äàëè àäðåñèðàíèÿò ñèìâîë å íóëåâèÿ. Óñëîâèåòî âèíàãè ùå ïîëó÷àâà ñòîéíîñò èñòèíà, çàùîòî ïðè âñÿêà èòåðàöèÿ íà öèêúëà ñå äîáàâÿ åäèíèöà êúì àäðåñà íà st.

Íàøàòà âòîðà âåðñèÿ íà ïðîãðàìàòà ïîïðàâÿ òàçè ãðåøêà. Òÿ ñå èçïúëíÿâà äî êðàé. Çà íeùàñòèå, îáà÷å, èìà ãðåøêà â èçõîäà é. Íèçúò, àäðåñèðàí îò st íå ñå îòïå÷àòâà. Áèõòå ëè ìîãëè äà îòêðèåòå ãðåøêàòà?

#include <stream.h>

char *st = "The expense of spiritn";
main() {
int len = 0;
while ( *st++ != ‘�’ ) ++len;
cout << len << ": " << st;
return 0;
}

Ãðåøêàòà ïðîèçòè÷à îò ôàêòà, ÷å st âå÷å íå ñúäúðæà àäðåñà íà íèçîâàòà ëèòåðàëíà êîíñòàíòà. Òÿ å áèëà óâåëè÷àâàíà äî òîãàâà, äî êàòî å îãðàíè÷åíà îò íóëåâèÿ ñèìâîë. Òîâà å ñèìâîëà, êîéòî ïðîãðàìàòà íàñî÷âà êúì ñòàíäàðòíèÿ èçõîä. Íåîáõîäèìî å íÿêàê äà ñå âúðíåì íà àäðåñà íà íèçà. Åòî åäíî ðåøåíèå íà òîçè ïðîáëåì:

st -= len;
cout << len << ": " << st;

Ïðîãðàìàòà ìîæå äà áúäå êîìïèëèðàíà è èçïúëíåíà. Íî èçõîäúò é âñå îùå å íåêîðåêòåí. Òîé èìà âèäà:

22: he expense of spirit

Òîâà å ñâúðçàíî ñúñ ñàìîòî åñòåñòâî íà ïðîãðàìèðàíåòî. Ìîæåòå ëè äà îòêðèåòå ãðåøêàòà, êîÿòî å äîïóñíàòà òîçè ïúò?

Íå å âçåò ïîä âíèìàíèå îãðàíè÷èòåëíèÿ íóëåâ ñèìâîë íà íèçà. st òðÿáâà äà áúäå îòìåñòåíà ñ åäèíèöà â ïîâå÷å îò äúëæèíàòà íà íèçà. Ïðàâèëåí å ñëåäíèÿ çàïèñ:

st -= len + 1;

Êîãàòî òàçè ïðîãðàìà áúäå êîìïèëèðàíà è èçïúëíåíà ùå ïîëó÷èì ñëåäíèÿ ïðàâèëåí ðåçóëòàò:


Ñòðàíèöè: «1 2 3 4 5 6 »

Ðåãèñòðèðàéòå ñå, çà äà äîáàâèòå êîìåíòàð

ðåêëàìà

© Âñè÷êè ïðàâà çàïàçåíè. 2006-2008. Created by: Site.bg
Ïðåïîðú÷âàìå: IT Íîâèíè | Êèíî è èãðè | Äèïëîìà.áã | Paparak.bg | Òóíèíã Ïîðòàë | uchenik.com | TRAVEL òóðèçúì | Ðåôåðàòè | AmAm.bg | Èäå.ëè | Êóðñîâè ðàáîòè | AnimeS-bg.com | Ôîòî Ôîðóì | Çàïîçíàíñòâà | Ìðåæà îò ïðèÿòåëè | IT Light | Spodeli.net | Ôîòî-Êóëò | IDG.BG | Teenproblem.net | Áëîã - Îáðàçîâàíèå | Fresh-BG.com | Hanovete.com | Bulfleet.com | Mythlands.com | Ohoboho.com | Êàçàíëúê.Com | News24 | Setcom.bg | Atol.bg | Elmaz.com | MobileBulgaria.com