
C语言程序设计基础第25次课函数定义、调用、参数传递、函数声明变量作用域和生存期
C语言程序设计基础 第25次课 函数定义、调用、 参数传递、函数声明 变量作用域和生存期

学习任务(课前学习)观看智慧树在线课程视频《用户函数的定义与调用》、《函数的参数》《函数的返回值》《变量的作用域和生存期》阅读学习教材9.1节、9.2节、9.3节、9.4节。注:若知到App拥堵,可以扫描教材中的二维码观看
学习任务(课前学习) 观看智慧树在线课程视频: 《用户函数的定义与调用》、《函数的参数》、 《函数的返回值》《变量的作用域和生存期》 阅读学习 教材9.1节、9.2节、9.3节、9.4节 注:若 知到App拥堵,可以扫描教材中的二维码观看

练习与讨论1.在一个程序中,如果存在几段完全相同的程序段,如何将这个程序段定义为一个独立的函数?(无参函数)2.在一个程序中,如果存在几段功能相同但数据不同的程序段,如何将这个程序段定义为一个独立的函数?(有参函数)3.C语言的参数传递方式是单向传递还是双向传递?4.既然利用全局变量(9.4节)或指针参数(10.1节)可以从被调函数向主调函数同时返回多个数据,为什么还说函数的一次调用至多有一个返回值呢?5.如何确定一个函数的类型,什么样的函数可以定义为void类型?6.何为局部变量?都有哪几种?不同函数中可以出现同名变量吗?为什么?7.局部变量可以和全局变量重名吗?8.静态局部变量和动态局部变量有何相同和不同?
练习与讨论 1. 在一个程序中,如果存在几段完全相同的程序段,如何将这个程 序段定义为一个独立的函数?(无参函数) 2. 在一个程序中,如果存在几段功能相同但数据不同的程序段,如 何将这个程序段定义为一个独立的函数?(有参函数) 3. C语言的参数传递方式是单向传递还是双向传递? 4. 既然利用全局变量(9.4节)或指针参数(10.1节)可以从被调函 数向主调函数同时返回多个数据,为什么还说函数的一次调用至多有 一个返回值呢? 5. 如何确定一个函数的类型,什么样的函数可以定义为void类型? 6. 何为局部变量?都有哪几种?不同函数中可以出现同名变量吗? 为什么? 7. 局部变量可以和全局变量重名吗? 8. 静态局部变量和动态局部变量有何相同和不同?

函数函数的特点8设计一个复杂的程序时函数是C程序的基本组成单位必须有且只能有一个名为通常将它分解为若干个相对main的主函数独立的程序模块,这就是模C程序的执行总是从main函数块化的程序设计,有利于程开始,在main中结束序的调试和维护。函数之间是平行的独立的在C语言中通过将一个main函数可以调用任意其他函数,其他函数(除main函数程序划分为若干个函数,来外)之间可相互调用实现程序的模块化
函 数 设计一个复杂的程序时, 通常将它分解为若干个相对 独立的程序模块,这就是模 块化的程序设计,有利于程 序的调试和维护。 在C语言中通过将一个 程序划分为若干个函数,来 实现程序的模块化。 函数的特点 ➢ 函数是C程序的基本组成单位 ➢ 必须有且只能有一个名为 main的主函数 ➢ C程序的执行总是从main函数 开始,在main中结束 ➢ 函数之间是平行的独立的 ➢ main函数可以调用任意其他 函数,其他函数(除main函数 外)之间可相互调用

C语言函数的分类1.按来源划分2.按函数有无参数分(1)库函数:(1)无参函数:由C语言编译系统预先定不带参数(自变量)的函数义好的函数,用户可直接调用如getchar()等如printf()、sqrt()等(2)有参函数:带有参数(自变量)的函数(2)用户定义函数:如 printf()、sqrt()由用户自己定义的函数。strcpy()等
1. 按来源划分 ⑴库函数: 由C语言编译系统预先定 义好的函数,用户可直接调用 如 printf( )、sqrt( )等 ⑵用户定义函数: 由用户自己定义的函数。 C语言函数的分类 2.按函数有无参数分 ⑴无参函数: 不带参数(自变量)的函数 如 getchar( ) 等 ⑵有参函数: 带有参数(自变量)的函数 如 printf( )、sqrt( ) strcpy( ) 等

9.1用户函数的定义和调用用户编写程序时,可以将程序中相对独立的程序段定义为一个单独的函数在包含多个函数的程序中,如果一个函数要调用另一个函数,则称之为主调函数;而被另一个函数调用的函数称之为被调函数
9.1 用户函数的定义和调用 用户编写程序时,可以将程序中相对独立的 程序段定义为一个单独的函数。 在包含多个函数的程序中,如果一个函数要 调用另一个函数,则称之为主调函数;而被另一 个函数调用的函数称之为被调函数

1.无参函数的定义#include 格式:main()类型说明符函数名()int i,j;函数体printf("The first one:In):for(i=1;iprintf("*");void starprintf("\n");int i,j;printf("The second one: In");for(i=1;i<=4;i++)for(i=1;i<=4;i++)Yfor(j=1;j<=i;j++)for(j=1;j<=i;j++)printf("*");printf("");printf("n");printf("n");return;
1. 无参函数的定义 格式: 类型说明符 函数名( ) { 函数体 } 【例9.2】编写程序,打印出如下图形。 The first one: * ** *** **** The second one: * ** *** **** #include main( ) { int i,j; printf("The first one:\n"); for(i=1;i void star() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } return; }

#include void star0int i,j;总是从主函数开始执行,for(i=1;i<=4;i++)当遇到函数调用时,则转向被3调函数的函数体中执行for(j=1;j<=i;j++)printf("*");在被调函数中,执行到printf("\n");return语句时,则返回到主!调函数中继续执行。return;main0printf("The first one:In"):starO;printf("The second one: In");star(;
2 无参函数的调用 用户自定义函数可以像调用库函数那样调用它。 无参函数的调用格式: 函数名( ) 由多个函数构成的程序,其执行流程是怎样的呢? main() { printf("The first one:\n"); star(); printf("The second one:\n"); star(); } #include void star() { int i,j; for(i=1;i<=4;i++) { for(j=1;j<=i;j++) printf("*"); printf("\n"); } return; } 总是从主函数开始执行, 当遇到函数调用时,则转向被 调函数的函数体中执行。 在被调函数中,执行到 return语句时,则返回到主 调函数中继续执行

m!3.有参函数的定义和调用n!(m-n)!【例9.3】已知m、n是正整数,编写程序求m中取n的组合数#includek=n:main()p=1;int m,n,i,k:for(i=1;i<=k;i++)p=p*i;long p,c,c1,c2,c3;/*n的阶乘*printf("请输入m与n的值:");c2=p;k=m-n;scanf("%d%d",&m,&n);k=m:p=1;p=1;for(i=1;i<=k;i++)p=p*i;for(i=1;i<=k;i++)/*m-n的阶乘*p=p*i;c3=p;c1=p;/*m的阶乘*/c=c1/(c2*c3);printf("组合数=%ld\n",c);
3 . 有参函数的定义和调用 【例9.3】已知m、n是正整数,编写程序求m中取n的组合数。 #include main() { int m,n,i,k; long p,c,c1,c2,c3; printf("请输入m与n的值:"); scanf("%d%d",&m,&n); k=m; p=1; for(i=1;i<=k;i++) p=p*i; c1=p; /*m的阶乘*/ k=n; p=1; for(i=1;i<=k;i++) p=p*i; c2=p; /*n的阶乘*/ k=m-n; p=1; for(i=1;i<=k;i++) p=p*i; c3=p; /*m-n的阶乘*/ c=c1/(c2*c3); printf("组合数=%ld\n",c); } m! n! (m-n)!

long fac()longfac(intk)Y主long p;nlong p;的int i,k;p=1;int i;量for(i=1;i<=k;i++)plp=1;p=p*i;c2return;for(i=l;i<=k;i++)p=p*i;return p;①将被调函数中用于从主移到函数首部的括号中,②将被调函数中用于向主调函数传递数据的变量(或表达式)置于return之后,称为被调函数的返回值
long fac( ) { long p; int i,k; p=1; for(i=1;i<=k;i++) p=p*i; return; } 一是变量m、n的值显然应该在 主调函数中输入,如何将m、n及m-n 的值传递给变量k呢? 二是如何将求得的阶乘(即变量 p的值)传递给主调函数中的变量c1、 c2与c3呢? ①将被调函数中用于从主调函数接受数据的变量的定义 移到函数首部的括号中,称为被调函数的参数。 p=1; for(i=1;i<=k;i++) p=p*i; return p; } long fac(int k) { long p; int i; ②将被调函数中用于向主调函数传递数据的变量(或表达式) 置于return之后,称为被调函数的返回值