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

5-дәріс.Тақырыбы: Си-дегі функциялар.

1. Си-дегі функциялар.

2. Функцияны құру және қолдану.

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

Функцияның баяндалуын қарастырайық: функцияны баяндаудың екі түрлі стилін (классикалық және қазіргі стиль) қолдануға болады. Бірінші жағдайда, функцияны баяндау форматы келесідей:

Тип функция_аты ();

Бұл спецификация функцияның атын және қайтаратын мәннің типін баяндайды.

қазіргі стиль ANSІ ұсынған Си тілінің кеңейтілген түрлерінің конструкцияларында қолданылады. Бұл Си тілінің түрінде функцияны баяндау кезінде “функция прототипі” деп аталатын тілдің арнайы құралдары қолданылады. Оның прототипін қолданып функцияны баяндау кезінде параметрлері туралы қосымша ақпарат болады:

Тип функция_аты(парам_ақпар1, парам_ақпар2, ...);

Бұндағы парам_ақпар1 параметрі - формальды параметрлердің аты және типі туралы мәлімет.

Функция анықтамасы. Функцияны баяндау сияқты оны анықтау кезінде де екі стильді қолдануға болады - классикалық және қазіргі. Функцияны анықтаудың классикалық форматы келесідей:

Тип функция_аты (параметрлер аты) параметрлер анықтамасы;

{

локалдық баяндау;

операторлар;

}

қазіргі стиль баяндалу форматы функция атынан кейін тұратын жақша ішіндегі функция параметрлерінің анықталуын қарастырады.

Тип функция_аты(парамақпар, парам_ақпар, ...);

Бұндағы, параметр анықтамасы парам_ақпар - берілетін параметр (тип және идентификатор) туралы ақпаратты сақтайды.

Функция ішінде (maіn() басты функциясынан басқа) тұрған баяндаулар тізбегі (константалар, мәліметтер типі, айнымалылар) тек осы функция ішінде анықталады. Сондықтан Си тілі ішкі циклдерді қамтымайды, яғни бір функция басқа функцияның ішінде баянала алмайды.

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

Функцияны шақыру функция аты және жақша ішінде аргументтері бойынша жүзеге асырылады.

Функцияның орындалу нәтижесі return операторы көмегімен қайтарылады. Жалпы түрі:

Return (өрнек);

Оператор функция жұмысын аяқтайды және басқаруды шақырған программадағы келесі операторға береді. Бұл return операторы функция денесінің соңғы операторы болмаса да, орындалады.

Return операторын мына түрде қолдануға болады:

return; return 0;

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

Maіn()

{

25

float y, x, mult(); /*шақырушы программадағы баяндау*/

іnt n;

y=mult(x, n); }

float mult(v, k) /*функция анықтамасында баяндау*/

float v; іnt k;

{

float res;

for(res=0.0; k>0; k--)

res=res*v;

return(res); /*float типті мәнді қайтарады*/

}

Return операторы көмегімен шақырушы программаға тек бір ғана мән беріледі. Егер екі шама берілу керек болса, онда көрсеткіштерді қолдану керек.

Функция анықталуы атымен, формалды параметрлерімен және функция денесімен ерекшеленеді. Ол тағы да қайтаратын мәнінің типі және функцияның жады класы бойынша ерекшеленеді. Функцияны анықтау синтаксисі келесідей:

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлер тізбегі>])[<параметрлерді баяндау>]<функция денесі>

Жады класының түрі <ЖК түрі> функцияның жады класын береді. <Тип түрі> сипаттаушымен бірге қайтаратын мәннің типін және функция атын анықтайды. <Параметрлер тізбегі> өз кезегінде функцияны шақыру кезінде мәні берілетін формалды параметрлер атынан тұратын тзбек (бос болуы мүмкін). <Параметрлерді баяндау> формалды параметрлердің типтерін және идентификаторларды береді. <Функция денесі> - жергілікті айнымалыларды баяндаудан және операторлардан тұратын құрамды оператор.

қазіргі құрылымы:

[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлерді баяндау тізімі>])<функция денесі>

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

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

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

Float f1(float a; float b)

{

float c;

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

return c; }

maіn()

26

{

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 осы айнымалының адресі болып табылады.

Көрсеткіштер. Көрсеткіш қандай да бір мәліметтің адресінен тұратын айнымалы болып табылады. Жалпы айтқанда, көрсеткіш - адрестің қандай да бір символикалық бейнеленуі. &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 айнымалыларының адресін функцияға беру арқылы біз оларға қол жеткізуге мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолданып, функция жадыдағы сәйкес ұяшықтарда орналасқан шамаларды алуға және олардың орнын ауыстыруға мүмкіндік алды.