Ўзгармас объект эълон қилингандан кейин, унинг this кўрсаткичи ҳам ўзгармас кўрсаткич сифатида ишлатилади. соnst this кўрсаткичи орқали фақатгина const спецификатори мавжуд бўлган методларни чақириш мумкин.
Бу масала навбатдаги машғулотларда батафсил ўрганилади.
Кўрсаткичлар ёрдамида ҳисоблаш
Бир кўрсаткични бошқа кўрсаткичдан айириш мумкин. Масалан, агарда иккита кўрсаткич массивнинг турли элементларига мурожаат қилса, бир кўрсаткичнинг иккинчисидан айирмаси, берилган массив элементларининг орасидаги элементлар сонига тенг бўлади. Бу методика белгили массивлар устида иш бажаришда самарали тарзда қўлланилади. Бунга мисол 8.11. листингда келтирилган.
8.11. – листинг. Белгили массивдан сўзларни белгилаш.
# inсlude < iostream.h>
# inсlude < ctype.h>
# inсlude < string.h>
bool GetWord ( char * string, char * word, int& WordOff Set);
// Асосий дастур
int main( )
{
const int bufferSize = 255;
char buffer[bufferSize+1];// Барча сатрларни //сақлаш учун ўзгарувчи
char word[bufferSize+1];//Барча сўзларни сақлаш //учун ўзгарувчи
int wordOffSet=0; //Биринчи белгидан бошлаймиз
cout <<”Enter a string:”
cin.getLine(buffer, bufferSize);
While(GetWord( buffer, word, wordOffSet))
{
cout<< “Got this word:”<
}
return 0;
}
// Белгилар сатридан сўзни белгилаб олувчи функция
bool GetWord(char *string, char *word, int &wordOffSet)
{
if(!string[wordOffSet])//Сатр охирини аниқлайди.
return false;
char* p1, p2;
p1= p2 = string+ wordOffSet // навбатдаги сатрга кўрсаткич
// Cатр бошидаги пробелларни ўчирамиз.
for(int i=0;i<(int)strlen(p1)&& !isalnum(p1[0]); i++)
p1++;
// Cўз мавжудлигини текшириш
if(!isalnum(p1[0]))
return false;
// p1 кўрсаткич навбатдаги сўзнинг бошини // кўрсатади. худди шундай p2 ҳам
р2 = p1;
// P2 ни сўзнинг охирини кўрсатишига қадар ўзгартирамиз
while (isalnum(p2[0]))
p2++;
// р2 сатр охирини кўрсатади.
// р1 эса cатр бошини кўрсаткичларнинг айирмаси //эса сўзнинг узунлигини беради.
int len = int (p2- p1);// Сўзни буферга оламиз.
Strncopy(word, p1, len );
// ва янги сатрга ўтиш белгиини қўямиз
word[len]=“\0”;
//Навбатдаги сўзини бошланишини излаймиз.
for(inti=int(p2–string); i<(int)strlen(string)&& !isalnum(p2[0]); i++);
p2++;
wordOffSet = int(p2–string );
return true;
}
НАТИЖА:
Enter a string: this code first appeared in C++ Report
Got this word : this
Got this word : code
Got this word : first
Got this word : appeared
Got this word : in
Got this word : C++
Got this word : Report
ТАҲЛИЛ
Листингнинг 13 – сатрида фойдаланувчи матн киритади. Киритилган сатр GetWord() функцияси орқали қайта ишланади. Бу функцияга WordOffSet бутун ўзгарувчиси параметр сифатида узатилади. WordOffSet ўзгарувчисига 11 – сатрда 0 қиймат ўзлаштирилади.
GetWord() функцияси ҳар сафар чақирилганда дастур бошқаруви 23–сатрга берилади. 23–сатрда эса string[wordOffSet] қиймати 0 га тенг ёки тенг эмаслиги текширилади. Шартни бажарилиши сатрни чегарасида эканлигимизни англатади. GetWord() функцияси false қиймат қайтаради.
24–сатрда белгили типга кўрсаткич бўлган иккита ўзгарувчи эълон қилинади. 26 – сатрда бу ўзгарувчиларга WordOffSet ўзгарувчиси қийматининг навбатдаги сўзи бошланишининг адреси ўзлаштирилади. p1 кўрсаткичига ҳарф ёки рақам бўлган 1 – белгининг адреси ўзлаштирилади. Агарда бундай белги учрамаса, функция false қиймат қайтаради.
Шундай қилиб p1 кўрсаткичи навбатдаги сўзнинг бошига мос келади. 46 – сатрда p2 кўрсаткичга ҳам худди шу қиймат ўзлаштирилади.
45 – ва 49 – сатрларда берилган сатрдан ҳарф ҳам, рақам ҳам бўлмаган биринчи белгини излаш амалга оширилади. p2 кўрсаткич шу белгига кўчирилади. Энди p1 ват p2 кўрсаткичлар мос равишда сўзнинг бошини ва охирини кўрсатиб турадилар. p2 кўрсаткичнинг қийматидан p1 кўрсаткични қийматини айириб уни бутун сонли типга ўгирамиз. Бундай операциянинг бажарилиши натижасида шу сўзнинг узунлигини олишимиз мумкин. Кейин эса сўзнинг бошланиш жойи ва узунлигига асосланган ҳолда уни буфер ўзгарувчисига кўчирамиз.
Do'stlaringiz bilan baham: |