133
Кез келген басқа объектілер сияқты функцияларда да нҧсқауышты пайда-
лануға болады, мысалы, type t, type z параметрлі type типін қайтаратын
функциядағы р нҧсқауышын келесі тҥрде сипаттауға болады:
type (*p)(type1 t1, type2 t2);
Айтылғандарды тҧжырымдай келе функцияда бір және екі ӛлшемді жиым-
дарды (массивтерді) пайдалануды қарастырайық.
Функцияға нақты параметр ретінде бір ӛлшемді жиымды жіберуге болады,
ол ҥшін жиымның бастапқы (нӛлінші) элементінің орнын кӛрсетсек жеткілікті.
Бір ӛлшемді жиымды пайдалану мысалы:
int min_index(int sp[], int ras)
{ int i, mindx, m;
mindx=0;m=sp[mindx];
for(i=0; i
if(sp[i]
{ m=sp[i]; mindx=i; };
return(mindx);
}
Бҧл жерде С тілінің артықшылығын айта кеткен жӛн. Жоғарыда
қарастырылған мысалдан кӛріп отырғанымыздай, компиляторға ӛңделіп
отырған жиым мӛлшерін анық кӛрсетудің қажеті жоқ. Функция тҧлғасында
жиымның бастапқы элементінің адресін кӛрсету жеткілікті. Бір ӛлшемді
жиымды кездейсоқ бҥтін сандармен толтыру ҥшін келесі тҥрдегі функцияны
пайдалануға болады:
void init(int mas[ ],int ras); //функцияны сипаттау
{
int k;
for(k=0; k
mas[k]=rand();
}
Программаның қандай да бір бӛлігінде жоғарыда аталған функцияны
init(spisok, dlina) тҥрінде шақырсақ, бір ӛлшемді ҧзындығы dlina
болатын spisok жиымының элементтері кездейсоқ мәндерге ие болады. Енді
min_index функциясын пайдаланатын программаны қарастырайық:
#include
#include
#define dlina 150
main()
{int k, list[dlina];
for(k=0; k
list[k]=rand();
k= min_index(list, dlina);
printf("list[%3d]=%6d\n",k, list[k]);
}
134
Функцияның нақты параметрі ретінде екі немесе одан да кӛп ӛлшемді
жиымдарды да пайдалануға болады.
Екі ӛлшемді жиымды пайдалану мысалы:
void minit(int matrix[][KO],int str);
{
int i,j;
for(i=0; i
for(j=0; j
matrix[i][j]= rand();
}
Жоғарыда қарастырылған функцияда екі ӛлшемді жиымның бағаналарының
саны тҧрақты және ол ауқымды KO айнымалысымен анықталған.
4- мысал. NxN ӛлшемді бҥтін сандар жиымын (50-ден кӛп емес) енгізіп, функ-
ция арқылы оның оң мәндерінің қосындысын табу керек.
#include
#include
void summa(int,int a1[ ][50]); // функцияны сипаттау
void main(void)
{
int a[50][50];
int i,j,N;
clrscr();
puts("\n Жиым өлшемін N(<50) енгізіңіз \n");
scanf(“%d”,&N);
printf("\n Мәліметтерді енгізіңіз \n");
for(i=0; i
for(j=0; j
{
printf("\n a[%d][%d]=", i+1, j+1);
scanf("%d", &a[i][j]);
}
summa(N,a);
}
void summa(int n,int a1[ ][50])//функцияны анықтау
{
int i, j, s;
/* Жиымның оң элементтерінің қосындысын есептеу*/
for(s=0,i=0; i
{
printf("\n");
for(j=0;j
if (a1[i][j]>0) s+=a1[i][j];
}
135
printf("\a Қосынды = %d, Press any key... ",s);
getch();
}
5- мысал. Берілген s1 символдар тізбегінен k-сыншы символдан бастап
ҧзындығы L болатындай бағыныңқы s2 тізбегін бӛліп алатын substr
функциясын программа ішінде қарастырайық:
#include
#include
substr(s1, s2, L, k, m)
char s1[], s2[]; int L,k,m;
{
int i,j;
if (L+k>=m) k=m-L-1;
for(i=1, j=0; i
s2[j] = s1[i];
}
void main(void)
{
char str1[80], str2[80]; int L, k, m=0;
clrscr();
puts("\n сөз тізбегін енгізіңіз \n:");
while((str1[m++] = getchar())!=‟\n‟)
;
printf("\n");
/* m өз мәнін сақтап қалады */
printf("\n L және k мәндерін енгізіңіз:\n");
scanf(“%d %d”,&L,&k);
substr(str1,str2,L,k,m);
printf("%s\n",str2);
}
6-мысал. Берілген s1 символдар тізбегінің қҧрамында бағыныңқы s2
тізбегінің бар жоқтығын анықтайтын index функциясын қарастырайық. Егер s2
тізбегі s1 символдар тізбегінің қҧрамында бар болса, онда index функциясы s2
тізбегінің s1-дегі орнын (индексін) анықтайды:
index(s1, s2)
char s1[], s2[];
{ int i,j,k;
for(i=0,s[1]!=‟\0‟;i++)
{
for(j=i,k=0;s2[k]!=‟\0‟&& s1[j]==s2[k];j++,k++)
;
if(s2[k]==‟\0‟)
return(i);
136
}
return(-1);
}
char str1[ ]= “информатика”;
char str2[ ]= “форма”;
#include
#include
void main(void)
{clrscr();
printf("%d\n", index(str1,str2));
}
7-мысал. Функцияның параметрі ретінде оған нҧсқауышты пайдалану мысалын
қарастырайық. Функция cos(x)-тің туындысын есептейді.
double proiz(double x,double dx,double(*f)(double x));
double fun(double z);
int main()
{
double x; /*туынды есептелетін нүкте*/
double dx; /*ығысу*/
double z; /*туындының мәні*/
scanf("%f,%f",&x,&dx);
z=proiz(x,dx,fun); /* функцияны шақыру */
printf("%f",z);
return 0;
}
double proiz(double x, double dx, double(*f)(double z))
{
double xk,xk1,pr;
xk=fun(x);
xk1=fun(x+dx);
pr=(xk1/xk-1e0)*xk/dx;
return pr;
}
double fun( double z)
{
return (cos(z));
}
Жоғарыда қарастырылған fun функциясын кез келген функцияның туындысын
табу ҥшін қолдануға болады. Ол ҥшін анықталған fun функциясының
тҧлғасын ӛзгерту керек немесе proiz функциясын шақырған кезде туындысы
қарастырылып отырған функцияның атымен шақырса болғаны. Мысалы, sin(x)
функциясының туындысын табу ҥшін жоғарыда қарастырылған proiz
функциясын z=proiz(x,dx,sin); тҥрінде шақыру жеткілікті болып
саналады.
Достарыңызбен бөлісу: |