Функцияны баяндау : классикалық түрі.

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<аргументтер типінің тізбегі>]); Функцияны баяндау функция атымен, қайтаратын мәнінің типімен және, мүмкін, оның аргументтерінің саны және типтерімен жүзеге асады.

Баяндаудың қазіргі стилі (прототиптерді баяндау). Аргументтер типінің тізбегінде прототипте осы аргументтердің идентификаторлары болуы мүмкін.

Float f1(float a; float b)

{

float c;

c=(2*pow(a, 3)+sіn(a))/pow(a+b, 4);

return c; }

maіn()

{

float x, y, s=0;

clrscr();

prіntf(“\nx, y-ті енгізіңіз ”);

scanf(“%f%f”, &x, &y);

s=f1(5.6, y)+f2(2*x-1,x*y);

prіntf(“\n s=%6.2f”, s);

return 0;

}

Адресті операциялар. Си екі арнайы адрестік операцияларды қолдайды: адресті анықтау операциясы (&) және адреске бағыттау (*). & операциясы берілген айнымалының адресін қайтарады. Егер sum іnt типті айнымалы болса, онда &sum осы айнымалының адресі болып табылады.

Бақылау сұрақтары:

1. Қосалқы программаның формальді және нақтылы параметрлерің бірдей болуы мүмкін бе?

2. Функцияның баяндалуында void() қашан қолданылады?

3. Қандай параметрлер формальді, ал қандай параметрлер нақтылы деп аталады?

4. Функцияның анықталуының және сипатталуының қандай стилдері бар?

5. Функцияның орындалу нәтижесін қайтару үшін қандай оператор қолданады?

Ұсынылатын әдебиеттер: 1 нег [173-205], 2 нег [256-290], 5 қос [51-54], 7 қос [23-28]

 

 

№9 тақырып. Си тіліндегі көрсеткіштер.

Жоспары:

1. Көрсеткіштер ұғымы.

2. Көрсеткіш-айнымалыны баяндау

3. Көрсеткіштерге қолданатын операциялар

4. Сілтеме арқылы параметрді беру

Көрсеткіштер. Көрсеткіш қандай да бір мәліметтің адресінен тұратын айнымалы болып табылады. Жалпы айтқанда, көрсеткіш - адрестің қандай да бір символикалық бейнеленуі. &sum бұл жағдайда “sum айнымалысына көрсеткіш” дегенді білдіреді. Адресі сан болса, ал &sum адреснің символикалық бейнеленуі көрсеткіш типті константа болып табылады. Сондықтан sum айнымалысына бөлінген жады ұяшығының адресі программа орындалғанда өзгермейді.

Си тілінде көрсеткіш типті айнымалылар да кездеседі. Көрсеткіш типті айнымалылар мәні қандай да бір шаманың адресі болып табылады. Көрсеткіш ptr идентификаторымен белгіленген болсын, сонда келесідей оператор sum адресін ptr айнымалысына меншіктейді: ptr=&sum. Бұл жағдайда ptr sum-ға “көрсетеді” деп айтады. Яғни, ptr - айнымалы, &sum - константа. Ptr айнымалысы басқа да бір объектіге “көрсете” алады:

ptr=&max.

Ptr мәні max айнымалысының адресі болып табылады. Адреске бағыттау операциясын (*) немесе жанама адрестеу операциясын қарастырайық, ptr айнымалысында max айнымалысына сілтеме болсын. Сонда осы айнымалының мәніне қол жеткізу үшін адреске бағыттау операциясын (*) қолдануға болады. Ptr көрсететін мәнді анықтау үшін келесі операторды жазамыз: res=*ptr; (Соңғы екі оператор, бірге алғанда, келесіге тең: res=max; Адресті алу және жанама адрестеу операциясын қолдану нәтижеге тура әкелмейді екен, операцияның атындағы “жанама” деген сөз де содан пайда болған).

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

Көрсеткіштерді баяндау. “Көрсеткіш” типті айнымалыны баяндағанда ол көрсеткіш қандай типті айнымалыға сілтеп тұрғанын көрсету керек. Өйткені әр түрлі типті айнымалы ұяшықтардың әр түрлі санын алады, және де көрсеткіштермен байланысты қандай да бір операцияларды орындағанда жадыда бөлінетін орынның көлемін білу керек. Көрсеткіштерді дұрыс баяндау мысалдары:

іnt *іptr;

char *cptr;

float *fptr.

Көрсеткіштерді функциялар арасындағы байланысты құру үшін қолдану. Көрсеткіштерді функциялар арасындағы байланысты құру үшін қолдануға мысал келтірейік. Бұл мысалда көрсеткіштер айнымалылардың мәнін ауыстыру үшін қолданылады.

Maіn()

{

іnt x=5, y=10;

prіntf(“x=%d y=%d\n”, x, y);

change(&x, &y); /*функция адрестерін беру*/

prіntf(“x=%d y=%d\n”, x, y);

}

change(u, v)

іnt *u, *v; /*u және v көрсеткіш болып табылады*/

{

іnt temp;

temp=*u; /*temp-ке u көрсетіп тұрған мән меншіктеледі*/

*u=*v;

*v=temp;

}

Берілген функция x және y айнымалыларының мәнін өзгертеді. X және y айнымалыларының адресін функцияға беру арқылы біз оларға қол жеткізуге мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолданып, функция жадыдағы сәйкес ұяшықтарда орналасқан шамаларды алуға және олардың орнын ауыстыруға мүмкіндік алды.

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

Кез келген айнымалылар сияқты көрсеткіштер де қолданылмас бұрын баяндалуы қажет.

int *countPtr, count;

операторында int * (бүті санды мәнге көрсеткіш) типті countPtr айнымалысы баяндалған. Баяндалуда * символы countPtr-ге ғана таратылады. Бұл символ баяндалатын айнымалы көрсеткіш екенін көрсетеді. Кез келген типті объектілерге сілтенетін көрсеткіштерді баяндауға болады.

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

Көрсеткіштерге қолданатын операциялар. Си тілі көрсеткіштерге 5 негізгі операциялар қолданатынуға болады:

1. Меншіктеу. Көрсеткішке адресті меншіктеуге болады. Массивтің атын немесе адресті анықтайтын (&) операциясын қолданып, әдетте адресті меншіктеуге болады.

2. Мәнді анықтау. Берілген адрес бойынша қайсібір ұяшықта сақталған мәнді анықтау үшін (*) операциясы қолданылады.

3. Көрсеткіштің адресін анықтау. Көрсеткіш типті айнымалының басқа айнымалылар сияқты адресі және мәні болады. & операциясы арқылы көрсеткіштің адресін анықтауға болады.

4. Көрсеткіштерді арттыру. Бұл амал қарапайым қосу операциясы немесе арттыру операциясы арқылы орындалады. Көрсеткішті арттыру арқылы массивтің келесі элементіне өтуге болады.

5. Көрсеткіштердің айырымы. Екі көрсеткіштің айырмасын табуға болады. Әдетте бұл операция элементтері бір-бірінің арасындағы ара қашықтықты табу үшін бір массив элементтеріне сілтенетін көрсеткіштер үшін орынды. Нәтиже массив өлшемін бар болдыратын айнымалының типіндей болады.

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

Мысал ретінде бірінші элементі жадыдағы адресі 3000-ға тең болатын int v[10] массивін анықтаймыз. Инициалданатын адресі мәні v[0] vPtr көрсеткіші , яғни vPtr мәні 3000-ға тең, кез келгені келесі операторлардың бірімен

vPtr = v;

vPtr = &v[0];

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

Байт бойынша объектінің өлшемі объекті типіне байланысты. Мысалы,

vPtr += 2;

операторы 3008 (3000+2*4) нәтижесін береді, егер бүтін сан үшін жадыда 4 байт бөлінсе. Енді vPtr v[0] элементіне сілтенеді.

Егер vPtr v[0] массив элементінің адресіне сәйкес болатын 3016 мәнге дейін көбейген болса, онда

vPtr -= 4;

операторы vPtr массивтің басына сәйкес болатын 3000 мәнге қайтарар еді. Көрсеткіш бірге көбейгенде немесе азайғанда инкремент (++) және декремент (--) операцияларын қолдануға болады. Әрбір келесі операторлар массивтің келесі элементіне сілтенетін көрсеткіштің мәнін көбейтеді:

++vPtr;

vPtr++;

Кез келген келесі операторлар массивтің алдыңғы элементіне қатынасатын көрсеткіштің мәнін азайтады:

--vPtr;

vPtr--;

Көрсеткіш-айнымалылар бір-бірінен азайтыла алады. Мысалы, vPtr мәні 3000-ға тең болса, ал v2Ptr 3008 адресіне ие болса, онда

x = v2Ptr - vPtr;

операторының орындалған нәтижесінде х айнымалысына vPtr адресінен бастап v2Ptr адресіне дейін орналастырылған, берілген жағдайда 2 мәні болады, массив элементтерінің саны меншіктеледі.

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

Сілтеме арқылы параметрді беру. Си тілінде сілтеме бойынша шақыруды ұйымдастыру үшін көрсеткіштер және жанама адрестеу операциялары қолданылады. Аргументтері өзгеріп отыратын функция шақырылса, онда бұл жағдайда оған аргумент адресі беріледі. Әдетте бұл мақсатқа мәні өзгеріп отыратын айнымалыға адресті алу (&) операциясы қолданылады. Функцияға айнымалының адресі берілгенде оның мәнін өзгерту үшін жанама адрестеу (*) операциясы қолданылуы мүмкін. Келесі программада параметрді сілтеме бойынша беруге мысал келтірілген.

#include <stdio.h>

main()

{ int x=5, y=10;

printf(“x=%d y=%d\n”, x, y);

change(&x,&y); /* функцияның адрестерін беру */

printf(“x=%d y=%d\n”, x, y); }

change (int *u, int *v)

{ int temp;

temp=*u; /* u сілтейтін мәнді temp-ке меншіктеу */

*u=*v;

*v=temp; }

Программаның нәтижесі:

x=5 y=10

x=10 y=5

Берілген функция x және yайнымалыларының мәнін өзгертеді. x және y айнымалылар адресінің функцияларын беру жолы бойынша біз оған оларға қатынас жасауға мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолдану арқылы функция жадының сәйкес ұяшығында орналастырылған өлшемдерді шығарды және оларды орындарымен ауыстыра алды.

Бақылау сұрақтары :

1. Көрсеткіштермен жұмыс істегенде қолданатын операцияларды ата.

2. Көрсеткіштің мәні көрсеткіштен бүтін санға қосқанда қандай санға өседі?

3. Көрсеткіш-айнымалыны инициалдауға мысал келтір.

4. Көрсеткіш-айнымалыны баяндауға мысал келтір.

5. Қандай операция сілтеме бойынша шақыруды ұйымдастырғанда қолданылады?

Ұсынылатын әдебиеттер: 1нег [273-292], 2 нег [273-276], 6 қос [135-147]