3.1.10基本函数程序设计 - 基本函数程序设计-专题辅导课件_第1页
3.1.10基本函数程序设计 - 基本函数程序设计-专题辅导课件_第2页
3.1.10基本函数程序设计 - 基本函数程序设计-专题辅导课件_第3页
3.1.10基本函数程序设计 - 基本函数程序设计-专题辅导课件_第4页
3.1.10基本函数程序设计 - 基本函数程序设计-专题辅导课件_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C程序设计专题辅导课

基本函数程序设计

函数知识要点定义函数、声明函数、调用函数的一致函数参数的传递

——传值

——传地址(指针概念)局部变量和全局变量静态变量(局部、全局)函数知识结构化程序设计思想

——函数组织问题(多文件)函数嵌套求解复杂问题递归函数命令行参数宏(符号常量)与带参数的宏函数是独立的程序模块库函数:如C语言系统提供:

scanf()、printf()、sqrt()等函数自定义函数,如排序sort-选择法、插入法main()是一个函数C程序由一个main(),以及0个或多个其他函数构成函数定义函数类型函数名(形参表)

/*函数首部*/{ /*函数体*/

函数实现过程

return表达式;}函数处理结果回送给调用函数;函数类型是void,无return只能返回一个值函数返回值的类型没有分号形参类型1参数1,类型2参数2,……,类型n参数n参数之间用逗号分隔,每个参数前面的类型都必须分别写明多个形参类型相同,不能写成列表形式:类型

参数1,参数2;函数类型函数名(形参表){

函数实现过程

return表达式;}无返回值的函数定义void

函数名(参数表) /*函数首部*/{ /*函数体*/

函数实现过程

return;

/*可以省略return*/}这类函数通常用于屏幕输出等不能省略否则,函数类型被默认定义为int函数调用调用标准库函数时,在程序的最前面用#include包含相应的头文件调用自定义函数时,调用函数中必须有与被调用函数定义相一致的函数申明函数声明函数类型函数名(参数表);函数必须先定义后调用,将主调函数放在被调函数的后面,就像变量先定义后使用一样。如果自定义函数在主调函数的后面,就需要在函数调用前,加上函数原型声明。函数声明:说明函数的类型和参数的情况,以保证编译时能判断对该函数的调用是否正确。函数定义第1行(函数首部),以分号结束。变量与函数局部变量和全局变量静态局部变量局部变量和全局变量局部变量在函数内定义的变量(包括形参)作用范围:本函数内部定义在复合语句内的变量作用范围:复合语句内部全局变量 与局部变量同名问题在函数以外定义的变量,不从属于任一函数。作用范围:从定义处到源文件结束(包括各函数)static

类型名变量表作用范围:局部变量生命周期:数据被保留,类似全局变量静态局部变量结构化程序设计采用自顶向下和逐步求精相结合的方式来解决复杂的问题把大问题分解成若干小问题,小问题再进一步分解成若干更小的问题,直到问题已相对简单,容易处理为止。当所有的子问题都得到了解决(已通过函数实现),整个问题(程序)也就解决了。每一次分解都是对上一层的问题进行细化和逐步求精,最终形成一种类似树形的层次结构。函数的组织结构化程序设计写程序时,用main()解决整个问题,它调用解决小问题的函数这些函数又进一步调用解决更小问题的函数,从而形成函数的嵌套调用main()函数1函数2……函数m函数1_1函数1_2函数m_1函数m_n……程序结构例10-1设计一个常用圆形体体积计算器,采用命令方式输入1、2、3,分别选择计算球体、圆柱体、圆锥体的体积,并输入计算所需相应参数。分析:main()函数:输入1、2、3选择计算3种体积,其他输入结束计算设计一个控制函数cal(),经它辨别圆形体的类型再调用计算球体、圆柱体、圆锥体体积的函数设计单独的函数计算不同圆形体的体积程序解析-计算常用圆形体体积3层结构,5个函数降低程序的分析设计、编写、调试的复杂度可读性好程序结构main()cal()vol_ball()vol_cylind()vol_cone()例10-1源程序#definePI3.141592654voidcal(int

sel);

int

main(void){int

sel;

while(1){

printf("1-计算球体体积\n");

printf("2-计算圆柱体积\n");

printf("3-计算圆锥体积\n");

printf("其他-退出程序运行\n");

printf(“请输入计算命令:”);

scanf("%d",&sel); if(sel<1||sel>3)

break; /*输入非1~3,循环结束*/

else

cal(sel); /*输入1~3,调用cal()*/ }return0;}/*常用圆形体体积计算器的主控函数*/voidcal(intsel){doublevol_ball(void);

doublevol_cylind(void);

doublevol_cone(void);switch(sel){ case1: printf("球体积为:%.2f\n",vol_ball()); break;case2:

printf("圆柱体积为:%.2f\n",vol_cylind()); break;case3:

printf("圆锥体积为:%.2f\n",vol_cone()); break; }}/*计算球体体积V=4/3*PI*r*r*r*/doublevol_ball(){doubler;

printf("请输入球的半径:");

scanf("%lf",&r);return(4.0/3.0*PI*r*r*r);}/*计算圆柱体积V=PI*r*r*h*/doublevol_cylind(){doubler,h;

printf("请输入圆柱的底圆半径和高:");

scanf("%lf%lf",&r,&h);

return(PI*r*r*h);}/*计算圆锥体积V=h/3*PI*r*r*/doublevol_cone(){doubler,h;

printf("请输入圆锥的底圆半径和高:");

scanf("%lf%lf",&r,&h);

return(PI*r*r*h/3.0);}所有函数的原型声明全部放在main()的前面,这样各函数的调用方式及调用顺序的改变时,函数的定义无需改变。10.1.2函数的嵌套调用顺序调用int

main(void){……y=fact(3);……z=mypow(3.5,2);

……}doublefact(intn){……}doublemypow(doublex,inn){……}mainfactmypowmainfactmypow函数的嵌套调用在一个函数中再调用其它函数的情况称为函数的嵌套调用。如函数A调用函数B,函数B再调用函数C,一个调用一个地嵌套下去,构成了函数的嵌套调用。函数的嵌套调用嵌套调用int

main(void){……cal(sel);

……}voidcal(int

sel){ ……

vol_ball()……}doublevol_ball(){ ……}maincalvol_ballmaincalvol_ball文件包含程序文件模块为了避免一个文件过长,可以把程序分别保存为几个文件。一个大程序会由几个文件组成,每一个文件又可能包含若干个函数。保存有一部分程序的文件称为程序文件模块。程序-文件-函数大程序-若干程序文件模块各程序文件模块分别编译,再连接整个程序只允许有一个main()函数问题:如何把若干程序文件模块连接成一个完整的可执行程序?文件包含建立工程文件文件包含格式#include<需包含的文件名>#include“需包含的文件名”作用把指定的文件模块内容插入到#include所在的位置,当程序编译连接时,系统会把所有#include指定的文件拼接生成可执行代码。文件包含在程序开始编译前,系统会把#include指定的文件的内容插入,以替换该行include指令,然后开始编译.将例10-1的5个函数分别存储在2个.C文件上,要求通过文件包含把它们联结起来。例10-2注意编译预处理命令,以#开头。在程序编译时起作用,不是真正的C语句,行尾没有分号。如果使用<>,将使用C语言的标准头文件,即在系统的include文件夹中搜索如果使用“”,则首先在当前工作文件夹中搜索,后在系统的include文件夹中搜索。工程文件为了把多个文件模块连接成一个完整程序,除了#include文件包含外,还可以定义工程文件,把需要连接在一起的文件名加入到该工程文件中,经程序连接后,便可生成完整的可执行文件。TC环境中,以文本方式编辑一个工程文件(.prj),将各源程序名称加入其中,然后Build。VC环境,参见实验指导书。#include<stdio.h> /*

prog10-1.c */int

main(void){externint

Add(inta,intb); externint

Sub(inta,intb);

intx,y,z; charch;

scanf("%d%c%d",&x,&ch,&y);

if(ch=='+')

z=Add(x,y);

elseif(ch=='-')

z=Sub(x,y);

else

printf("运算符输入错误!\n");

printf("%d%c%d=%d\n",x,ch,y,z); return0; } /*prog10-2.c*/int

Add(inta,intb)

{

intc;c=a+b; returnc;} /*prog10-3.c*/int

Sub(inta,intb)

{

intc;c=a-b; returnc;} 全局变量与程序文件模块局部变量作用范围:函数(复合语句)内部生命周期:从函数调用开始-函数调用结束全局变量 作用范围:从定义处到源文件结束生命周期:从程序执行开始-程序运行结束静态局部变量作用范围:局部变量生命周期:全局变量外部变量(extern)在某个程序文件模块中定义了全局变量,该全局变量可以在整个程序的所有文件模块中起作用在其他模块中如果要使用该全局变量,必须将它声明为外部变量只起说明作用,不分配存储单元,对应的存储单元在全局变量定义处分配。可用于全局变量使用位置先于该变量的定义位置intx;voidmain(){………}

文件名file1.cexternx;/*使用file1.c中的全局变量x*/f1(){………}

文件名file2.c扩大全局变量的作用域staticintx;voidmain(){………}使全局变量只限于本文件引用,而不能被其他文件引用

文件名file1.cexternx;/*使用file1.c中的全局变量x*/intf1(){………}

文件名file2.c无法引用静态全局变量函数与程序文件模块外部函数函数能够被程序中的其他程序文件模块调用在其他文件模块中调用该函数前,声明为外部函数extern

函数类型函数名(参数表说明);一般可省略externexternintf1();int

main(void){………f1();………}

文件名file1.cintf1(){………}

文件名file2.c调用另一模块中的函数externintf1();int

main(void){………f1();………}staticintf1(){………}内部函数使函数只能在本程序文件模块中被调用static

函数类型函数名(参数表说明);

文件名file1.c

文件名file2.c无法调用宏定义#define宏名标识符宏定义字符串编译时,把程序中所有与宏名相同的字符串,用宏定义字符串替代#definePI3.14说明:宏名一般用大写字母,以与变量名区别宏定义不是C语句,后面不得跟分号宏名与宏定义字符串之间用空格分隔宏定义字符串中间可以有空格,以回车结束多用于符号常量要具体分析#definePI3.14;voidmain(){doubled;d=2*PI;

printf("%f\n",d);}替换成d=2*3.14;;程序仍正确。宏定义可以嵌套使用#definePI3.14#defineS2*PI*PI宏定义可以写在程序中任何位置,它的作用范围从定义书写处到文件尾。可以通过“#undef”强制指定宏的结束范围。宏基本定义#defineA“Thisisthefirstmacro”voidf1(){

printf(“A\n”);}#defineB“Thisisthesecondmacro”

A的有效范围voidf2(){

printf(B); B的有效范围}#undefBint

main(void){f1();f2();return0;}例10-6宏的作用范围10.3.2带参数的宏定义例:#definef(a)a*a*a

int

main(void)/*水仙花数*/{int

i,x,y,z;for(i=1;i<1000;i++){x=i%10;y=i/10%10;z=i/100;if(x*x*x+y*y*y+z*z*z==i)

printf(“%d\n”,i);} return0;}#definef(a)(a)*(a)*(a)各位数字的立方和等于它本身的数。例如153的各位数字的立方和是13+53+33=153=x+y*x+y*x+y(f(x)+f(y)+f(z)==i)f(x+y)=(x+y)3?要适当地加入括号,以提高替换后的运算优先级带参数的宏定义实现简单的函数功能例10-7简单的带参数的宏定义。#include<stdio.h>#defineMAX(a,b)(a)>(b)?(a):(b)#defineSQR(x)(x)*(x)intmain(void){

intx,y;

scanf(“%d%d”,&x,&y); x=MAX(x,y); /*引用宏定义*/ y=SQR(x); /*引用宏定义*/

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

#definef(a,b,t)t=a;a=b;b=t;

intmain()

{ intx,y,t;

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

f(x,y,t)

printf(“%d%d\n”,x,y); return0;}t=x;x=y;y=t;编译时被替换带参数的宏定义不是函数,宏与函数是两种不同的概念宏可以实现简单的函数功能示例用宏实现两个变量值的交换与函数的区别在哪里?#defineF(x)x-2#defineD(x)x*F(x)intmain(){

printf("%d,%d",D(3),D(D(3))); return0;}宏定义阅读带宏定义的程序,先全部替换好,最后再统一计算不可一边替换一边计算,更不可以人为添加括号D(3)=x*F(x) 先用x替换展开 =x*x-2进一步对F(x)展开,这里不能加括号 =3*3-2=7 最后把x=3代进去计算D(D(3))=D(x*x-2)先对D(3)用x替换展开, =x*x-2*F(x*x-2)拿展开后的参数对D进一步进行宏替换 =x*x-2*x*x-2-2拿展开后的参数对F进一步进行宏替换 =3*3-2*3*3-2-2=-13 最后把x=3代进去计算运行结果:7-13结果分析宏定义应用示例定义宏LOWCASE,判断字符c是否为小写字母。

#defineLOWCASE(c)(((c)>='a')&&((c)<='z'))

定义宏CTOD将数字字符(‘0’~‘9’)转换为相应的

十进制整数,-1表示出错。

#defineCTOD(c)(((c)>='0')&&((c)<='9')?c-'0':-1)

2007试题#include<stdio.h>#defineP(a)a*a+5#defineQ(a,b)a*bintmain(){

printf("%d",P(3)/Q(2,3));return0;}3*3+5/2*3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论