c lects (4)
TRANSCRIPT
Functions Функц
Functions- функц
Тодорхой нэртэй бүлэг коммандууд
Тодорхой утга зорилготой байна.
Дэд програм
main нь функц юм
main дотроос өөр функцуудыг дуудна
Функцийн дотроос бусад функцийг дуудаж
болно гэх мэтээр…
Жишээ - Квадрат#include <stdio.h>
double square(double a)
{
return a*a;
}
int main(void)
{
double num;
printf("enter a number\n");
scanf("%lf",&num);
printf("square of %g is %g\n",num,square(num));
return 0;
}
Main –н гадаа тодорхойлогдсон функц
Square функцийг дуудаж байна
Яагаад функц хэрэглэх
шаардлагатай вэ?
Бодлогыг жижиг хэсгүүдэд хувааж өгдөг
Том хэмжээний бодлогыг бодох хялбар арга
Дахин дахин хэрэглэгдэх зааврууд
Бид нэг ижил зүйлийг дахин дахин бичих
хэрэггүй
printf ба scanf …
Програмыг уншиж ойлгоход хялбар болно
Функц бичигдэх хэлбэр
return-type name(arg_type1 arg_name1, arg_type2 arg_name2, …)
{
function body;
return value;
}
double square(double a){
return a*a;}
int main(void){
…}
Return комманд
Return биелэхэд функцийн биелэлт
дуусаж дуудсан функцэд утгыг
буцааж өгдөг
Буцах утгын төрөл функцийн
төрөлтэй адил байх ѐстой
Дасгал
Өгөгдсөн эерэг бүхэл тоо хүртлэх
анхны тоонуудыг хэвлэх програм
бич.
(Хэрэв параметр нь анхны тоо бол
нэг бусад тохиолдолд 0 утгыг
буцаадаг функц ашигла)
Бодолт
is_prime_func.c
Void төрөл
Зарим үед функц утга буцаах
шаардлагагүй байдаг
Энэ үед ‘void’ төрлийн утгыг
буцаана
‘return’ үг таарвал функцийн
биелэлт утга буцаахгүйгээр дуусна
Void
Хэрэв функц параметр авдаггүй бол‘void’ гэж бичиж болно
Жишээ
void ShowHelp(void)
{
printf("This function explains what this program does…\n");
printf(“hgjdgshgdfj sjdgf jsf");
/* ... */
}
int main(void)
{
char choice;
printf("Please enter your selection: ");
scanf("%c", &choice);
if (choice==‘h’)
ShowHelp();
else if /* Program continues … */
}
Утгаар дамжуулах
Функц аргументийг хүлээн авахдаа
түүний хуулбарыг авч болно
энэ үед функц дотор уг аргументыг
өөрчлөхөд эх хувь үл өөрчлөгдөнө
Жишээ нь – add_one.c
add_one – алхам
алхмаар
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
a b
34 1
main() memory state
a b
34 1
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
main() memory state
add_one – алхам
алхмаар
add_one – алхам
алхмаар
a b
34 1
b
1
add_one memory
state
main() memory
state
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
a b
34 1
add_one – алхам
алхмаар
b
2
add_one memory state
main() memory state
a b
34 1
add_one – алхам
алхмаар
b
2
add_one memory
state
main() memory
state
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
add_one – алхам
алхмаар
a b
2 1
main() memory
state
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
add_one – алхам
алхмаар
a b
2 1
main() memory
state
int add_one(int b)
{
b=b+1;
return b;
}
int main(void)
{
int a=34,b=1;
a = add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
Үүнийг тайлбарла
#include <stdio.h>
int factorial(int n)
{
int fact = 1;
while (n>1)
{
fact *= n;
n--;
}
return fact;
}
int main(void)
{
int n;
printf("enter a number\n");
scanf("%d",&n);
printf("%d!=%d\n", n,
factorial(n));
/* What will this print? */
printf("n = %d\n", n);
return 0;
}
Хувьсагчийн үйлчлэх хүрээ
Функц дотор зарлагдсан хувьсагч
ижил нэртэй бусад газар зарлагдсан
хувьсагчаас үл хамаарна
Өөр функц дотор зарлагдсан
хувьсагч руу функц хандаж чадахгүй
Жишээ – scope.c
Scope.c
int do_something(void)
{
int a;
printf("Entered do_something\n");
a = 7;
printf("In do_something,
a = %d\n", a);
printf("Exiting do_something\n");
return a;
}
int main(void)
{
int res, a = 34;
printf("Entered main\n");
printf("In main, a = %d\n",a);
res = do_something();
printf("do_something
returned %d\n", res);
printf("In main, a = %d\n", a);
printf("Exiting main...\n");
return 0;
}
Энд юу буруу байна вэ?
int add_one(int b)
{
a=b+1;
}
int main(void)
{
int a=34,b=1;
add_one(b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
Функцийн зарлалт
C бичсэн сайн програм нь олон
файлуудаас бүрддэг
Бид аль нэг файлд функцийг бичээд
бусад файлуудад ашиглаж болно
Функцийн зарлалт
Функц нь түүнийг хэрэглэхээр
дуудахаас өмнө заавал зарлагдсан
байх ѐстой
Зарлалт нь: биегүй байна
return_type Function_name(argument types);
Функцийн зарлалт
#include <stdio.h>
int factorial(int a); /* Функцийн зарлалт! */
int main(void){
int num;
printf("enter a number\n");
scanf("%d", &num);
printf("%d != %d\n", num, factorial(num));
return 0;
}
int factorial(int a){
int i, b = 1;
for(i = 1; I <= a; i++)
b = b*i;
return b;
}
Функцийн зарлалт
stdio.h файлд олон тооны
функцийн зарлалт байдаг
#include нь дуудагдсан функцийн
зарлалтыг хөрвүүлэгчид оруулж өгнө
math сан
Математик функцуудын сан
Ашиглахдаа (#include <math.h>)
Жишээ нь.
double s,p;
s = sqrt(p);
math.h санд уг функц зарлагдсан:
double sqrt (double x);
math сангийн зарим функц
sin(x), cos(x), tan(x)
x радианаар өгөгднө
asin(x), acos(x), atan(x)
log(x)
sqrt(x)
pow(x,y) – x-н yзэрэгт.
ceil(x), floor(x) …гэх мэт
Дасгал
Дараах томъѐог ашиглан
-г ойролцоогоор бодох програм бич. Функцийн аргумент n –г хүлээн авч бодолтыг хийнэ. Буцах утга нь байна.
2
21
π 1 1 1 11
6 4 9 16n n
Дасгал
Өмнөх бодлогыг тодорхой
нарийвчлалд хүргэж
боддог болго. Функцийн
аргумент нь нарийвчлалын
утга байна.