Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
35
Добавлен:
20.02.2017
Размер:
28.55 Кб
Скачать

8-дәріс. Тақырыбы: Көрсеткіштер.

Жоспар:

1. Бір өлшемді және екі өлшемді массивтерді өңдеу барысында

көрсеткіштерді қолдану.

Массивтер және көрсеткіштер. Массивтерді баяндағанда мәліметтер

типі және талап етілетін жады класы көрсетіледі. қарапайым айнымалылар

жағдайындағы қарастырылған сәйкес қасиеттер массивтерге де баяндағанда

қолданылуы мүмкін. Массивті баяндауға мысал қарастырайық:

33

int b[30]; /*30 бүтін элементтен тұратын сыртқы массив*/

float a[30]; /*30 саннан тұратын float типті автоматты массив*/

static char c[20]; /* 20 символдан тұратын статикалық массив*/

extern b[ ]; /*сыртқы массив; өлшемі жоғарыда келтірілген*/

}

Жадылар класына байланысты сыртқы, статикалық, автоматты және

регистрлік массивтер болып ерекшеленеді. Массивті инициалдауды

қарастырайық. Типті баяндауда тек қана сыртқы және статикалық

массивтерді ғана инициалдауға болады. Сыртқы және статикалық

массивтерді баяндау келісім бойынша осы массив элементтерінің нөлденуіне

әкеледі. (Сонымен, статикалық және сыртқы массивтерді нөлдеу үшін

ешқандай шара қолданбауға болады). Сыртқы массивтің инициалдануына

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

тобының студенттер саны болады:

int stud[10]={10,12,14,16,12,10,17,10,15,13};

main( )

{ int i;

extern int stud{ }; /*маңызды емес баяндалу*/

for (i=0; i<10; i++)

printf(“Группа N %d %d студентов”, i+1, stud[i]); }

stud[10] массиві жақшаларға алынған тізіммен инициалдаған, тізімнің

элементтерін үтір арқылы бөлген. Тізімдегі элементтер саны массивтің

өлшеміне сәйкес болуы қажет. Егер Тізімдегі элементтер саны массивтің

өлшемінен аз болса, онда қалған массив элементтері нөлдік мәндерге ие

болады. Егер тізімде элементтер көп болса, онда қате тура хабарланады.

Массив элементтерін инициалдауды келесі түрде де көрсетуге болады:

int stud[ ]={10,12,15,16,17,11,18,10};

main ( )

{ int i;

extern int stud [ ];

for (i=0; i<sizeof stud/(sizeof(int)); i++)

printf (“Группа N %d %d студентов.\n”,i+1,stud[i]); }

Егер массивті инициалдауға бос батырмалар лар қолданылса, онда

компилятор өзі тізімдегі элементтер санын анықтайды және ол үшін қажетті

өлшемдегі массивті белгілейді. Массивтің өлшемін анықтау үшін sizeof

операторы қолданылады. sizeof операторы объектінің немесе типтің өлшемін

байтпен анықтайды. Массив элементтерінің санын анықтау үшін массив

орын алатын жалпы байттар санын 2-ге бөледі (берілген жүйеде int типті

әрбір элементтің өлшемі 2 байтқа тең). Жалпы жағдайда сәйкес типтің sizeof

айнымалысының мәніне бөледі.

Массивтердің көрсеткіштері. Жоғарыда айтылғандай, көрсеткіштер

символдық адрестермен жұмыс істеуді ұйымдастырады. (Бұл жағдайда

массивті өңдеу тиімдірек ұйымдасады). Массивті белгілеу жасырын түрде

көрсеткіштерді қолдану болып табылады.

34

Мысалы, массивтің аты сондай-ақ соңғы элементті анықтайды, яғни

егер a[] массив болса, онда соңғысы a[0].

Екі мәнде барлық программаның барысында өзгермейтін

болғандықтан, көрсеткіш типті константа болады. Оларды көрсеткіш типті

айнымалыға (мән ретінде) меншіктеуге болады және айнымалының мәнін

өзгертуге болады. Көрсеткіштің мәніне сан қосылатын мысалды

қарастырайық:

{ int a[4], *pti, i;

float b[4], *ptf;

pti=a; /*массив көрсеткішіне адресті меншіктейді */

ptf=b;

for (i=0, i<4,i++)

printf(“көрсеткіш +%d: %8u %10u\n”, i, pti+i, ptf+i); }

Нәтиже:

көрсеткіш +0: 56014 56026 (массивттердің бастапқы адрестері)

көрсеткіш +1: 56016 56030 (адреске бірді қосқандағы нәтиже)

көрсеткіш +2: 56018 56034

көрсеткіш +3: 56020 56038

Адрестеудің бірлігі байт болып табылады, бірақ int типі 2 байтты, ал float

типі 4 байтты қолданады.

«Көрсеткішке бірді қосу»-компилятор бірді жадыға қосады. Массив үшін

бұл келесі байт емес, келесі элементтің адресіне көшу болып табылады.

Сондықтан да көрсеткіш сілтенетін объектінің типі арнайы ескертіледі.

Келесі теңдікті қарастырайық:

a+2==&a[2]; /*екеуі де бірдей адрес*/

*(a+2)==a[2]; /*екеуі де бірдей мән*/

Бұл ара қатынастар массивтер мен көрсеткіштердің арасындағы

байланысты көрсетеді, яғни көрсеткішті массивтің жеке элементін, сондай-ақ

оның мәнін анықтау үшін қолдануға болады.

Нақтылы біз екі әртүрлі белгілеулерді бірдей қолданамыз. Шыныменде,

компилятор массив белгілуін көрсеткіштерге айналдырады, сондықтан

көрсеткіштер әдістері маңыздырақ.

Көрсеткіштерді қолданып, массивтермен жұмыс істеу. Массивтерді

қолданатын функцияны қарастырайық, содан кейін осы функцияны

көрсеткіштерді пайдаланып, жазу керек.

int func(a, l)

int a[ ], l;

{ int i, sum;

for (i=0, sum=0; i<l; i++)

if (a[i]%2!=0)

sum+=a[i];

return (sum); }

for (i=0,sum=0;i<l; i++)

sum+=a[i];

35

return ((int) (sum/l)); }

Шақырушы функцияда шақырылатын операторды келесі түрде жазуға

болады:

func(x, size);

Функцияны көрсеткіштерді қолданып, қайтадан жазамыз. Ра-ны int

типіне сілтенетін көрсеткіш деп баяндаймыз. Содан соң a[i] массив

элементтерін сәйкесінше *(pa+i) мәніне ауыстырамыз.

int func(pa, l)

int *pa, l;

{ int i, sum;

for (i=0, sum=0; i<l; i++)

sum+=*(pa+i);

return ((int) (sum/l));

}

for (i=0, sum=0; i<l; i++)

if (*(pa+i)%2!=0)

sum+=*(pa+i);

return (sum); }

Функцияны шақыру сол түрінде қалады:

func(x, size)/

Массив аты көрсеткіш болғандықтан, келесі баяндалу операторлары

әрекеттері бойынша ұқсас, яғни екеуі де ра көрсеткішімен баяндалады.

int pa[ ]; и int *pa;

Программада бұлардың кез келгенін қолдануға болады, әйтсе де біз

екінші түрін *(pa+i)-ды қолданамыз.

Екі өлшемді массивтермен жұмыс істегенде көрсеткіштерді қолдану.

a[3][2] массивін қарастырамыз.

int a[3][2]; /* 3 жолдан және 2 бағаннан тұратын int типті

массив */

int *pri; /* бүтін типке сілтейді */

pri=a; /* көрсеткіш a[0][0] элементіне сілтейді */

a==&a[0][0]; /* pri+1 көрсеткіші a[0][1] элементке сілтейді

*/

Бұл массивті қарастырғанда келесі теңдеулер орынды:

pri==&a[0][0]; /* 1-ші жол, 1-ші баған */

pri+1==&a[0][1]; /* 1-ші жол, 2-ші баған */

pri+2==&a[1][0]; /* 2-ші жол, 1-ші баған */

pri+3==&a[1][1]; /* 2-ші жол, 2-ші баған */

pri+4==&a[2][0]; /* 3-ші жол, 1 -ші баған */

pri+5==&a[2][1]; /* 3-ші жол, 2-ші баған */

Екі өлшемді массив бір өлшемді массивтерден құрылған массив ретінде

қарастырылуы мүмкін. Яғни, берілген екі өлшемді массив 3 жолдан тұрады,

ал әрбір жол 2 элементтен тұратын массив болып табылады. Бірінші жолдың

аты a[0], екінші жолдың аты a[1 ], үшінші жолдың аты a[2]. Массивтің аты

36

берілген массивтің көрсеткіші болып табылады, яғни ол массивтің 1-ші

элементіне сілтейді. Сонымен келесі теңдеулер орынды:

a[ 0]==&a[0][0]

a[ 1]==&a[1][0]

a[ 2]==&a[2][0].

Бұл қасиет бір өлшемді массивке арналған функцияны екі өлшемді

массивпен жұмыс істеу үшін мүмкіндік береді.

main( )

{ static int b[3][4]={{6,4,8,10},

{10,20,30,40},

{20,40,60,80}};

int i;

for (i=0; i<3; i++)

printf(“Среднее значение строки %d равно %d\n”, i, func(b[i], 4));

/*b[i] - 4 элементтен тұратын бірөлшемді массив*/

}

/*Бірөлшемді массивтен орта мәнді табу*/

int func(x, n)

int x[ ],n;

{ int l;

float s;

for (l=0, s=0; l<n; l++)

s+=x[l];

return ((int) (s/n));

Бөлшектеп емес, барлық циклдарымен бірге екі өлшемді массивпен жұмыс

істейтін функцияны баяндау үшін функцияның анықтамасын және оның

баяндалуын дұрыс жазу қажет.

main() функциясы келесі түрге ие болады:

main()

{ static int b[3][4]={{6,4,8,10},

{10,20,30,40},

{20,40,60,80}};

sr(b); }

sr(b) функцияның басы келтірілген:

sr(b)

int b[ ][4];

int mult (int b[ ][4], int m)

{ int i, j; p=1;

for (i=0; i<m; i++)

for (j=0; j<4; j++)

if (b[i][j]!=0) p=p*b[i][j]; }

Тағы бір әдісті қарастырамыз:

b[5,4] массиві берілген. Келесі баяндалуды келтіруге болады.:

37

mult (int a[ ], int size)

Функцияға қатынасқанда келесі түрді аламыз:

mult (b, 5*4); (b 20 элементтен тұратын бірөлшемді массив ретінде

қарастырылады).