-->
Главная » Статьи » Информатика

КӨРСЕТКІШТЕРМЕН ОРЫНДАЛАТЫН АРИФМЕТИКА

КӨРСЕТКІШТЕРМЕН ОРЫНДАЛАТЫН АРИФМЕТИКА

 

Егер р массивттің кейбір элементтеріне көрсеткіш болса, онда р+ + р-ны келесі элементке сілтейтіндей жылжытады, онда р+=i оны бұрын көрсеткен i-ші элементке сілтейтіндей арттырады. Бұл және осыған ұқсас конструкциялар  адрестік арифметика деп аталатын, көрсеткіштермен жасалатын арифметиканың өте қарапайым мысалдары.      

Си тілінің бір өзінде көрсеткіштерді, массивтерді және адрестік арифметиканы біріктіру - оның ең мықты жақтарының бірі.

Көрсеткішті кез-келген басқа айнымалы сияқты, сәйкес типті мәліметтердің бұрын анықталған адресіне келтіретін нөл немесе өрнек сияқты инициализациялауға болады.

Static  char –декларациясы p-ны  char –ға көрсеткіш ретінде анықтайды және оны ar  массивінің адресімен инициализациялайды. Көрсетілген декларация мынадай түрге ие болар еді:

             static  char *p=&ar[0]

массив аты оның нөлдік элементтінің адресі болып табылатындықтан қасиеттерді атап өтейік:

 -          кейбір ережелерді сақтай отырып көрсеткіштерді салыстыруға болады. Егер p және q бір массивтің элементтеріне көрсетсе, онда оларға қатынас операторын = =, !=, <, <=, > және т.б. қолдануға болады. Мысалы,  егер  р  q-ден бұрынғы массив элементіне сілтеме жасаса, p<q  түріндегі қатынас шындық болады;

-      кез-келген көрсеткішті әрқашанда нөлмен тең болуын және тең болмауын салыстыруға болады;

-      әртүрлі массивтер элементтеріне сілтеме жасайтын көрсеткіштер үшін арифметикалық операциялар немесе салыстырулар нәтижесі анықталмаған;

-      көрсеткіштерді және бүтіндерді қосуға және кемітуге болады. p+n  жазбасы р көрсететін объектілерден кейінгі  n-ші орынды алатын объектінің адресін білдіреді. Бұл р сілтемесін объектінің типіне қатыссыз шындық; n автоматты түрде объектінің өлшеміне (типіне) сәйкес келетін коэффициентке көбейеді. Өлшем жөніндегі ақпарат р-ның сипаттамасында берілген. Егер, мысалға int төрт байттан тұрса, онда көбейту коэфициенті төртке тең болады;

-      сондай-ақ көрсеткіштерді кемітуге болады. Мысалы, егер p және q бір массивтің элементтеріне сілтеме жасаса және р<q, онда q-p+1 дегеніміз  р-дан   q-ға дейін элементтер саны болады;

-      көрсеткішті арифметика объектінің типін ескереді: егер ол char-ға қарағанда көп жадыдан орын алатын float мәнімен жұмыс жасаса және  р-көрсеткіш float-қа, онда  р+ + р-ны float-тың келесі мәніне жылжытады;

"I am a string”түрінде жазылған, стрингтік тұрақты литер массиві болып табылады. Ішкі көріністе бұл массив программа стринг соңын таба алатын ‘\0’, "бос” литермен аяқталады.

Стрингтік тұрақтыға қатынас оның бірінші элементіне көрсеткіш арқылы жүзеге асады. 

Әдетте стрингілік тұрақтылар функцияның аргументі ретінде қолднылады, мысалы printf-та. Келесі сипаттаманы қарастырайық

   char *pmessage;

pmessage=”now is the time” меншіктеуі; Осы айнымалыға сілтемені литерлік массивке орналастырамыз, бұдан стрингтің өзі көшпейді, тек оған көрсеткіші ғана көшіріледі.

Си-де стрингпен жұмыс істеу операциясы түгелдей қарастырылмаған.

Литерлі массивті стрингілік тұрақтыға сілтемемен инициазацияланған, литер тізбегегінің ‘\0’ массиві ретінде және көрсеткіштің көмегімен екі тәсілмен ұйымдастыруға болады, яғни

   char armessage [ ] = "now is the time”;

   char *pmessage = "now is the time”;

сәйкес келеді.

Осы екі анықтамалардың арасында маңызды айырмашылық баркөрсеткіш бұл айнымалыал массив аты – тұрақтылыкөрсеткіш.

Кез-келген басқа айнымалылар сияқты, көрсеткіштерді массивке топтастыруға болады. Ақпараттық жүйелерде іздеу алгоритмдері және әртүрлі табиғаттағы мәліметтерді сұрыптау, жеке жағдайда кез-келген ұзындықтағы мәтіндік жолдар кеңінен қолданылады. Іздеу алгоритмдері мен сұрыптаудың тиімділігі көп жағдайда мәліметтердің көрінісін таңдаумен байланысты. Осындай ыңғайлы және тиімді көріністің бірі кез-келген ұзындықтағы мәтіндік жолдың басындағы көрсеткіштер массиві болып табылады.

Жадыда жолдар бір-бірімен тығыз орналасқандықтан, әр жеке жолға көрсеткіш арқылы оның бірініші литеріне қатынас жасау жүзеге асады.

Көрсеткіштердің өзін массив түрінде ұйымдастыруға болады. Мүмкіндіктердің бірі: екі жолдарды салыстыру арқылы – олардың strcmp функцияларына көрсеткіштерді беру. Жолдардың орындарын ауыстыру үшін, массивте олардың көрсеткіштерінің орнын ауыстыру жеткілікті (жолдардың өзін емес).

Бұдан екі мәселе бірдей шешіледі: біреуі – жадыны басқару күрделілігімен, ал екіншішісі – жолдардың өзін ауыстыруда жинақталған үлкен шығындармен байланысты.

Сұрыптау процессі үш кезеңге бөлінеді:

-      енгізу кезінде барлық жолдард оқу;

-      енгізілген жолдарды сұрыптау;

-      оларды рет-ретімен басып шығару.

Енгізу программасы барлық жолдардағы литерлерді оқу және есте сақтау керек, сол сиқты жолдрадың көрсеткіштер массивін тұрғызу керек. Бұл функция сол сияқты, енгізілген жолдардың санын есептеу керек – бұл ақпарат сұрыптау және баспаға шығару үшін қажет болады.

Шығару программасы жолдарды басып шығарумен ғана айналысады және ол көрсеткіштер массивінде олраға сілтеме жасайтындай ретпен орындалуы керек.

Сұрыптау алгоритмі реінде 1962 жылы К.А. Хоор ұсынған тез сұрыптауды пайдалану ұсынылған.

Си-де тікбұрышты көпөлшемді массивтерді және жеке жағдайда екі өлшемді массивтерді беру мүмкіндігі бар. Си-де екі өлшемді массивтің ерекшелігі жазбаның формасында ғана, ал қалған жағдайда оны басқа тілдердегідей айтуға болады. Элементтер жолдрамен есте сақталады, сәйкесінше, олар жадыда қалай орналасқан сияқты ретпен таңдағанда, көбінесе ең бірінші индексі өзгереді.

Массив фигуралы жақшамен жабылған бастапқы мәндердің тізімімен инициализацияланады; екі өлшемді массивтің әр жолы сәйкес ішкі тізімдермен инициализацияланады.

Егер екі өлшемді массив функцияға аргумент ретінде берілсе, онда оның параметріне сәйкес декларация бағандар санынан тұруы керек; осы жағдайда, әдеттегідей функцияға массив жолдарының сілтемесі берілетіндіктен, жолдар саны болмайды.

Екі өлшемді массив декларациясын қарастырайық

int ar[5] [10];

Егер ar массиві f –тің кейбір функциясына берілсе, онда бұл функцияны келесі түрде анықтауға болады:

f(int array[5][10]) {…};

Бұның орнына төмендегіні жазуға болады:

f( int array [][10]) {…}

мұнда жолдар санының маңызы жоқ болғандықтан немесе

f( int (*array )[10]) {…}

соңғы жазбада параметр int типті 10 мәннен тұратын массивтің көрсеткіші екенін сипаттайды. Тік [] жақшаның *-ға қарағанда приоритеті жоғарырақ болғандықтан, мұнда жақша қажет болады. Жақшасыз (дөңгелек) декларация int * array[10]  int-тің 10 көрсеткішінен тұратын массивті анықтайды. Жалпы жағдайда тек бірінші өлшемді (бірінші индеске сәйкес келетін) бермеуге болады, қалған басқаларының өзгешеліктерін анықтау қажет.

      Көрсеткіштер массивтің инициализациясының механизмін n-20 айдың атынан тұратын, стринг литеріне сілтеме жасауды қайтаратын, month-name (n) функциясының мысалында көрсетейік. Бұл функция статистикалық массивтерді қолдануды көрсету үшін өте жақсы. Функцияның стринг массивтері бар, олардың біреуіне ол сілтеме жасауды қайтарады.

month_name: char * month _ name (int n) – n-20 айдың атын қайтарамыз

{ static char * name [] { "Дұрыс емес ат,

"Қаңтар”, "Ақпан”, "Наурыз”, "Сәуір”, "Мамыр”, "Маусым”, "Шілде”, "Тамыз”, "Қыркүйек”, "Қазан”, "Қараша”, "Желтоқсан”,};

return (n<1 ¦¦ n>12)? name [0]: name [n];

Инициализатор ретінде стрингтер тізімі қызмет атқарадыолардың әрқайсысына массивте белгілі бір орын сәйкес келедіі-ші стрингтің литері жадыда орналасқан және оларға көрсеткіш name [і]-де есте сақталады. name массив өлшемініңөзгешеліктері анықталмағандықтанкомпилятор оны берілген бастапқы мәннің мөлшері бойынша есептейді(инициализацияланатын өрнек).

Екі өлшемді массив пен көрсеткіш массивтерінің арасындағы айырмашылық қандайКелесі анықтамалар үшін:

   int ar [10][20];

   int*x[10];

ar[3] [4] жазбасы және x[3] [4]-те int типінің кейбір мәндеріне сілтеме синтаксистік жағынан дұрыс боладыБірақта ar ғанарасында да екі өлшемді массив болып табылады: int типінің екі жүз элементі үшін жады бөлінедіал ar [жолбағанэлементінжылжытып қою массивтің басынан бастапоның тікбұрышты табиғатын ескере отырып, 20 * жол + бағанформуласыбойынша есептеу жүргізіледі.

х массиві үшін 10 ғана көрсеткіш анықталады және ол инициализациясыз. Инициализация анық түрде – статистикалық немесе есептеу процесінде берілуі тиіс.

Егер әрбір x элементі бес элементті массивке сілтеме жасаса, онда нәтижесінде жадыда int типті 50 мәнді орналастыру үшін және көрсеткіштердің 10 ұяшықты үшін кеңістік бөлінеді.

Көрсеткіштердің маңызды артықшылығы мұндай массивтің жолдары әр түрлі ұзындыққа ие бола алатындығында.

Си-ді қолдауды қамтамасыз ететін операциялық жүйеде, командалық жолдың көмегімен жіберілетеін программадағы параметрлер немесе аргументтерді беру мүмкіншілігі бар. Біріншіден, әдетте argc (argument count) деп аталатын, командалық жолда беріген аргументтер саны тұрады. Екінші argv (argument vector) аргументтердің өзі тұратын литерлік стрингтер массивіне сілтеме жасау болып табылады. Бұл стрингтермен жұмыс жасау үшін әдетте бірнеше деңгейлердің көрсеткіштері қолданылады. Бір жолдағы командалық жады аргументтерін бір-бірінен бос орынмен бөле отырып басып шығаратын, echo (эхо) деп аталатын қарапайым программа – мысалы. Сонымен команда

Echo Здравствуй, мир! – ді басып шығарады.

include <stdio.h>

 

main (int argc, char*arg [])

{int i;

for (i=1; i<argc; i++)

printf ("% s %  s”, argv [i], (i<argc-1)? ” ”: ” ”);

printf ("\n”);

return  0 ;

}

argv [0] келісімі бойынша шығарылатын программалық аты барсондықтан argc-нің мәні әрқашанда 1-ден кем болмайды.Егер argc=1, онда командалық жадыда программаның атынан кейін ешқандай да аргументтер болмайды. Біздің масалымызда argc 3-ке тең, және сәйкесінше argv[0]="echo”; argv [1]= "Здравствуй”, argv [2]= "мир!” болады. Стандарт argv [argc] әрқашанда бос көрсеткіш болғанын талап етеді.

argv көрсеткіштер массивіне көрсеткіш болғандықтан, біз онымен индекстелінетін массив ретінде емес, көрсеткіш ретінде жұмыс жасай аламыз. echo, программаның екінші версиясын келтіреміз, мұнда көрсеткішке көрсеткіш, сондай-ақ профикстік операторлар ұғымдарын қолданылады.

# include <stdio.h>

main (int argc, char * argv [])

{while (--argc >0)

printf ("% s % s”,*++ argv,(argc>1)?’’:’’);

printf ("\n”);

return  0 ;

}

 

Категория: Информатика | Добавил: admin_ (17.11.2013)
Просмотров: 1670 | Теги: КӨРСЕТКІШТЕРМЕН ОРЫНДАЛАТЫН АРИФМЕТ | Рейтинг: 0.0/0
Всего комментариев: 0

Имя *:
Email:
Код *: