ch04-函数省公开课一等奖全国示范课微课金奖课件_第1页
ch04-函数省公开课一等奖全国示范课微课金奖课件_第2页
ch04-函数省公开课一等奖全国示范课微课金奖课件_第3页
ch04-函数省公开课一等奖全国示范课微课金奖课件_第4页
ch04-函数省公开课一等奖全国示范课微课金奖课件_第5页
已阅读5页,还剩48页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

第四章函数带子程序C程序函数程序设计实例第1页带子程序C程序编程计算

其中第2页voidmain(){floaty,f,p0,p2,p5,x;printf("pleaseinputx:");scanf("%f",&x);f=((x+x)+(x*0.3))/(7*(x*0.3));

p0=(f+x/2)/(2*x);f=((x+(x+2))+((x+2)*0.3))/(7*((x+2)*0.3));

p2=(f+(x+2)/2)/(2*x);f=((x+(x+5))+((x+5)*0.3))/(7*((x+5)*0.3));

p5=(f+(x+5)/2)/(2*x);y=((p0*p0+5*x)/(p5-sqrt(x)))*p2;printf("y(x)=%8.4f\n",y);}第3页floatx,y; /*3*/floatf(floatv,floatw){ /*4*/ return(w+v)/(7*v); /*5*/} /*6*/floatp(floatu){ /*7*/ return(f(u*0.3,x+u)+(u/2))/(2*x)); /*8*/} /*9*/voidmain(){ /*10*/ printf("pleaseinputx:"); /*11*/ scanf("%f",&x); /*12*/ y=(p(x)*p(x)+(5*x))/(p(x+5)-sqrt(x))*p(x+2);/*13*/printf("y(x)=%8.4f\n",y) /*14*/}第4页程序执行主要步骤从键盘读入x值

printf("pleaseinputx:"); scanf("%f",&x);依次计算以x,x+5,x+2作为实参函数p值

y=(p(x)*p(x)+(5*x))/(p(x+5)-sqrt(x))*p(x+2)输入出函数y值

printf("y(x)=%8.4f\n",y)第5页计算p(x+5)过程

计算x+5得6.0;将6.0送入p形参u中,这时u值为6.0;进入函数p,执行p操作部分(第8行),即返回语句“return...;”,先计算返回语句中表示式值。以u*0.3和u+x为实参调用函数f次序计算u*0.3、u+x得1.8、7.0;将1.8、7.0次序送入f形参v、w中,v=1.8、w=7.0;进入函数f执行f操作部分(第5行),执行返回语句计算出表示式值为0.698413带着函数值0.698413返回调用处,p中返回语句内(第8行)计算出返回语句中表示式值为1.84921即p值。带着函数值1.84921返回调用处:主程序第13行表示式语句内。第6页主程序调用函数返回结束函数第7页使用子程序技术分离了“做什么”与“怎么做”程序逻辑结构清楚,易写,易读,易懂。程序设计,调试,维护变得轻易。第8页函数数学中函数

函数概念组成函数定义函数调用使用函数注意事项先定义该函数(标准库函数除外)

——类似于数学中函数定义。再在表示式中调用该函数 ——数学中计算某函数一个特定值。第9页函数调用(function-designator)调用过程形参实参结合进入函数执行复合语句普通形式F(e,e,…,e)F()例子p(x+5)f(u*0.3,x+u)第10页函数定义(function-declaration)除标准库函数外,程序中使用函数必须先定义,然后再用“函数调用”调用它。标准函数是系统已经定义好函数,无须定义即可直接调用。在程序example401A中:floatf(floatv,floatw){ /*4*/ return(w+v)/(7*v); /*5*/} /*6*/floatp(floatu){ /*7*/ return(f(u*0.3,x+u)+(u/2))/(2*x)); /*8*/} /*9*/第11页由上述语法可知,一个函数定义形式是:

类型说明符标识符(参数列表)复合语句floatf(floatu){ return(f(u*0.3,x+u)+(u/2))/(2*x); } 函数类型函数名字形参列表复合语句函数体函数定义说明符第12页

函数定义说明符上述形式第一行称“函数定义说明符”,形式以下

TTF(参数列表) 详细指明以下点:函数结果类型

——由“类型说明符”(TT)标明;函数名字

——由类型说明符后“标识符”(F)标明;函数形式参数个数和每个形式参数特征 ——由“参数列表”标明。第13页函数类型(返回值类型)不能是数组或函数没有返回值函数类型是void函数返回返回方式:return;return表示式;函数运行到复合语句末尾(最终那个闭花括号“}”)后。第14页intf(intx){ returnx*x;}inty=9;voidf(intx){ if(x<0) return; y=y+x;}第15页参数列表(parameter-list)组成:每个参数申明详细说明形式:

类型说明符标识符参数列表形式

Tid,Tid,...,TidC允许使用无参函数,无参函数参数列表为空,或使用“空类型”类型说明符“void”

TTF()

TTF(void)第16页intf(intx,inty,floatz)intf(intx,y;floatz)intf(intx,y,floatz)第17页依据参数出现位置形式参数——函数申明(局部于函数变量)intf(intx,inty){

returnx+y;

}实际参数——函数调用

voidmain(){

inta=2,b=3;

f(a+b,b);

f(2+b,3);

}第18页依据参数值传递规则值参

当调用函数时,把实参值传入形参变量变参当调用函数时,把实参地址值传入形参变量

C语言中参数都是值参第19页3intf(intx,inty){returnx*y;}voidmain(){ inta=3,b=2,x=9; intc; c=f(a+b,a+x); printf(“%d\n”,c); printf(“%d\n”,x);}29程序输出为: 60 9 abx返回值xycmainf内存5126060第20页复合语句(compound-statement)由申明和语句列表组成申明部分详细说明本函数内使用其它量;语句部分要求在本函数中要执行算法动作。函数定义形式:

TTF(Tid,Tid,...,Tid){...}

第21页参数结合规则静态上看,实参表中实参加被调用函数中形参表形参,按位置从左向右依次一一对应对应位置上形实参间要赋值兼容各个实参计算次序是依赖于实现。参数结合动作计算实参表示式值把实参值按赋值转换规则,转换成形参类型。假如不能完成该转换,则称函数参数不一致,产生错误把转换后实参值送入形参第22页0xyvzumainf内存……g返回值返回值由左至右#include"stdio.h"intx,y;intf(intz){x=x+1;return(z*z);}intg(intu,intv){……}voidmain(){x=0;g(x,f(2));}

02144第23页0xyvzumainf内存……g返回值返回值由右至左#include"stdio.h"intx,y;intf(intz){x=x+1;return(z*z);}intg(intu,intv){……}voidmain(){x=0;g(x,f(2));}

12144第24页并行计算-----不知道结果#include"stdio.h"intx,y;intf(intz){x=x+1;return(z*z);}intg(intu,intv){……}voidmain(){x=0;g(x,f(2));}

第25页

函数值有返回类型函数

intf(intx,inty){

if(x>=y)

returnx;

else

returny;

}无返回类型函数

voidg(intw){

if(w==1)

return;

else

x=3;

}第26页有返回类型函数函数值使用returne;向调用函数主程序传递函数值returne;执行过程是:计算表示式e值把表示式值按赋值转换规则,转换成函数结果类型;返回语句中表示式类型与函数结果类型必须赋值兼容。用类型转换后值作为函数值,并带着它返回到调用该函数处第27页无返回类型函数函数值voidg(intw){

if(w==1)

return;

else

x=3;

}在函数调用处,所调函数无值能够带回。对于无类型函数,在函数调用处不需要函数值,这种返回是正常;对于有类型函数,在函数调用处极可能需要函数值参加下一步运算,这将带来不可预料结果第28页函数原型为何使用函数原型任何标识符都必须申明,而且必须先申明后使用在申明定义函数时必须确保函数申明位置在使用前出现从程序行文次序上控制——普通比较难实现函数原型——方便灵活第29页普通形式

TTF(T,T,...,T); TTF(Tid,Tid,...,Tid);例子floatf(int,float,int,char);floatf(intz,floatu,intv,charw);第30页函数原型功效满足了C标识符先定义后使用要求并向编译系统提供所调用函数信息函数返回类型函数参数个数函数参数特征等信息程序设计格调最好把全部函数原型集中,放在主函数之前第31页floatx,y; floatf(float,float);floatp(float);

voidmain(){ printf("pleaseinputx:"); scanf("%f",&x); y=(p(x)*p(x)+(5*x))/(p(x+5)-sqrt(x))*p(x+2);printf("y(x)=%8.4f\n",y) }floatf(floatv,floatw){ return(w+v)/(7*v); } floatp(floatu){ return(f(u*0.3,x+u)+(u/2))/(2*x)); } 第32页例4-3生成伪随机数生成伪随机数公式

rk

=(multiplier*rk-1+increment)%modulus以下给定三个常数值,产生65536个随机数multiplier=25173increment=13849modulus=216=65536第33页#definemultiplier25173#defineincrement13849#definemodulus65536intseed=0;intrandom(void){seed

=(multiplier*seed+increment)%modulus;returnseed;}第34页模拟掷骰子,函数修改成:intrandom(void){seed

=(multiplier*seed+increment)%modulus;returnseed%6+1;}产生0与1之间实数型随机数序列,函数修改成:floatrandom(void){seed

=(multiplier*seed+increment)%modulus;return(float)seed/modulus;}第35页例4-4验证Pascal定理圆内接六边形三双对边延线交点在一条直线上ABCDEFB1B2B3读入六个极角值求六个顶点A,B,C,D,E,F在直角坐标系中坐标求三双对边交点B1,B2,B3坐标验证B1,B2,B3是否在一条直线上开始结束第36页将6个点极坐标

转换成直角坐标已知极角theta,矢径r,求一点直角坐标(px,py)coordinatepx=r*cos(theta);py=r*sin(theta);returntrans_abcdef转换a→xa,ya转换b→xb,yb转换d→xd,yd转换f→xf,yf转换e→xe,ye转换c→xc,ycreturn第37页求交点B1,B2,B3坐标已知四点r,s,t,u

求两条直线交点Bthree_inter求AB、DE交点B1求BC、EF交点B2求CD、FA交点B3returnintersection求r,s;t,u直线方程l1,l2求l1、l2交点Breturn第38页已知四点r,s,t,u

求两条直线l1,l2方程已知两点坐标px,py,qx,qy,求直线斜率a和截距bequtionreturn求r,s直线方程l1求t,u直线方程l2straightlineb=(py*qx-qy*px)/(qx-px)returna=(py-qy)/(px-qx)第39页已知两条直线方程斜率分别为ma,na;截距mb,nb;求直线交点(wx,wy)验证B1,B2,B3

是否在一条直线上interwx=(nb-mb)/(ma-na);wy=ma*px+mb;returntestreturn求过B1,B2直线方程L判断B3是否在直线L上第40页/*PROGRAMPascaltheorem*/#include"math.h"#include"stdio.h"#definePI3.1415927#defineeps1e-5floatradius;/*圆半径*/floattheta1,theta2,theta3,theta4,theta5,theta6;/*六个极角度数*/floatxa,ya,xb,yb,xc,yc,xd,yd,xe,ye,xf,yf;/*六个顶点直角坐标*/floatb1_x,b1_y,b2_x,b2_y,b3_x,b3_y;/*三个交点直角坐标*/floatb12_a,b12_b;/*B1和B2组成直线斜率和截距*/第41页/*主程序之前这段为“函数原型”以及各个函数返回结果所用变量*/voidtrans_abcdef();floatpx,py;/*用来保留coordinate()转换直角坐标*/voidcoordinate(float,float);voidthree_inter();voidintersection(float,float,float,float,float,float,float,float);floatl1_a,l1_b,l2_a,l2_b; /*两条直线斜率和截距*/voidequation(float,float,float,float,float,float,float,float);floata,b; /*直线方程斜率和截距*/voidstraightline(float,float,float,float);floatwx,wy; /*直线交点直角坐标*/voidinter(float,float,float,float);inttest(float,float,float,float,float,float);第42页/*主函数*/voidmain(){/*读入圆形半径*/printf("pleaseinputtheradiusofthecircle:");scanf("%f",&radius);/*读入六个角*/printf("pleaseinputsixangle:");scanf("%f%f%f%f%f%f",&theta1,&theta3,&theta3,&theta4,&theta5,&theta6);trans_abcdef();/*计算六个定点坐标*/three_inter();/*求三个交点*/if(test(b1_x,b1_y,b2_x,b2_y,b3_x,b3_y))/*验证*/printf("ok");else{printf("Thereisanerrorwhen:\n");printf("theta1=%dtheta2=%d\n",theta1,theta2);printf("theta3=%dtheta4=%d\n",theta3,theta4);printf("theta5=%dtheta6=%d\n",theta5,theta6);}}第43页/*计算六个顶点坐标*/voidtrans_abcdef(){coordinate(radius,theta1);xa=px;ya=py;coordinate(radius,theta2);xb=px;yb=py;coordinate(radius,theta3);xc=px;yc=py;coordinate(radius,theta4);xd=px;yd=py;coordinate(radius,theta5);xe=px;ye=py;coordinate(radius,theta6);xf=px;yf=py;}第44页/*计算一个顶点坐标*/voidcoordinate(floatr,floattheta){/*先把“角度”转换成“弧度”,再转换成直角坐标*/px=r*cos(PI*theta/180);py=r*sin(PI*theta/180);}第45页/*求三个交点*/voidthree_inter(){intersection(xa,ya,xb,yb,xd,yd,xe,ye);b1_x=wx;b1_y=wy;intersection(xb,yb,xc,yc,xe,ye,xf,yf);b2_x=wx;

温馨提示

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

最新文档

评论

0/150

提交评论