免费预览已结束,剩余48页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章函数,带子程序的C程序函数程序设计实例,带子程序的C程序,编程计算其中,voidmain()floaty,f,p0,p2,p5,x;printf(pleaseinputx:);scanf(%f,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,/*13*/printf(y(x)=%8.4fn,y)/*14*/,P(x)称为函数调用,函数定义说明符,小括号()为形式参数表,内为函数p的函数体,具体规定p的操作和计算,Return:表达式的值作为函数值返回,定义函数f,执行顺序:111213(分别以x,x+5,x+2为实参调用函数p)14,定义函数p,程序执行的主要步骤从键盘读入x的值printf(pleaseinputx:);scanf(%f,依次计算以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.4fn,y),计算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行的表达式语句内。,主程序,调用函数,返回,结束,函数,使用子程序技术分离了“做什么”与“怎么做”程序逻辑结构清晰,易写,易读,易懂。程序的设计,调试,维护变得容易。,函数,数学中函数函数概念的组成函数定义函数调用使用函数注意事项先定义该函数(标准库函数除外)类似于数学中的函数定义。再在表达式中调用该函数数学中计算某函数的一个特定值。,函数调用(function-designator),调用过程形参实参结合进入函数执行复合语句一般形式F(e,e,e)F()例子p(x+5)f(u*0.3,x+u),函数定义(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*/,由上述语法可知,一个函数定义的形式是:类型说明符标识符(参数列表)复合语句,floatf(floatu)return(f(u*0.3,x+u)+(u/2)/(2*x);,函数类型,函数名字,形参列表,复合语句函数体,函数定义说明符,函数定义说明符上述形式的第一行称“函数定义说明符”,形式如下TTF(参数列表)具体指明以下点:函数的结果类型由“类型说明符”(TT)标明;函数的名字由类型说明符后的“标识符”(F)标明;函数的形式参数个数和每个形式参数的特性由“参数列表”标明。,函数类型(返回值的类型)不能是数组或函数没有返回值的函数类型是void函数返回返回方式:return;return表达式;函数运行到复合语句末尾(最后那个闭花括号“”)后。,intf(intx)returnx*x;,inty=9;voidf(intx)if(x=y)returnx;elsereturny;,无返回类型的函数voidg(intw)if(w=1)return;elsex=3;,有返回类型函数的函数值使用returne;向调用函数的主程序传递函数值returne;的执行过程是:计算表达式e的值把表达式值按赋值转换规则,转换成函数的结果类型;返回语句中表达式的类型与函数的结果类型必须赋值兼容。用类型转换后的值作为函数值,并带着它返回到调用该函数处,无返回类型函数的函数值voidg(intw)if(w=1)return;elsex=3;在函数调用处,所调函数无值可以带回。对于无类型函数,在函数调用处不需要函数值,这种返回是正常的;对于有类型函数,在函数调用处极可能需要函数值参加下一步运算,这将带来不可预料的结果,函数原型为什么使用函数原型任何标识符都必须声明,而且必须先声明后使用在声明定义函数时必须保证函数声明位置在使用前出现从程序行文顺序上控制一般比较难实现函数原型方便灵活,一般形式TTF(T,T,.,T);TTF(Tid,Tid,.,Tid);例子floatf(int,float,int,char);floatf(intz,floatu,intv,charw);一一对应,函数原型的功能满足了C标识符先定义后使用的要求并向编译系统提供所调用函数的信息函数返回类型函数的参数个数函数参数特性等信息程序设计风格最好把所有函数原型集中,放在主函数之前,floatx,y;floatf(float,float);floatp(float);voidmain()printf(pleaseinputx:);scanf(%f,例4-3生成伪随机数,生成伪随机数公式rk=(multiplier*rk-1+increment)%modulus如下给定三个常数值,产生65536个随机数multiplier=25173increment=13849modulus=216=65536,随机数序列的k-1项,#definemultiplier25173#defineincrement13849#definemodulus65536intseed=0;intrandom(void)seed=(multiplier*seed+increment)%modulus;returnseed;,seed是外部变量,在第一次调用该函数前必须给seed赋予初始值,模拟掷骰子,函数修改成:intrandom(void)seed=(multiplier*seed+increment)%modulus;returnseed%6+1;产生0与1之间的实数型随机数序列,函数修改成:floatrandom(void)seed=(multiplier*seed+increment)%modulus;return(float)seed/modulus;,例4-4验证Pascal定理,圆内接六边形三双对边延线的交点在一条直线上,将6个点的极坐标转换成直角坐标,已知极角theta,矢径r,求一点的直角坐标(px,py),求交点B1,B2,B3的坐标,已知四点r,s,t,u求两条直线交点B,已知四点r,s,t,u求两条直线l1,l2的方程,已知两点坐标px,py,qx,qy,求直线的斜率a和截距b,已知两条直线方程斜率分别为ma,na;截距mb,nb;求直线交点(wx,wy),验证B1,B2,B3是否在一条直线上,/*PROGRAMPascaltheorem*/#includemath.h#includestdio.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构成直线的斜率和截距*/,/*主程序之前这段为“函数原型”以及各个函数返回结果所用变量*/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);booltest(float,float,float,float,float,float);,/*主函数*/voidmain()/*读入圆形的半径*/printf(pleaseinputtheradiusofthecircle:);scanf(%f,/*计算六个顶点坐标*/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;,/*计算一个顶点坐标*/voidcoordinate(floatr,floattheta)/*先把“角度”转换成“弧度”,再转换成直角坐标*/px=r*cos(PI*theta/180);py=r*sin(PI*theta/180);,/*求三个交点*/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;b2_y=wy;intersection(xc,yc,xd,yd,xf,yf,xa,ya);b3_x=wx;b3_y=wy;,/*已知四点,求两条直线交点*/voidintersection(floatrx,floatry,floatsx,floatsy,floattx,floatty,floatux,floatuy)equation(rx,ry,sx,sy,tx,ty,ux,uy);inter(l1_a,l1_b,l2_a,l2_b);,/*已知四点,求两条直线方程*/voidequation(floatrx,floatry,floatsx,floatsy,floattx,floatty,floatux,floatuy)straightline(rx,ry,sx,sy);l1_a=a;l1_b=b;straightline(tx,ty,ux,uy);l2_a=a;l2_b=b;,/*计算由两点确定直线方程的斜率(a)和截距(b)*/voidstraightline(floatex,floatey,floatfx,floatfy)a=(fy-ey)/(fx-ex);/*斜率*/b=ey-a*ex;/*截距*/,/*已知两个直线方程的斜率和截距,求它们交点*/voidinter(flo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1+X商务数据分析考试试题与答案
- 2025年鹤壁辅警协警招聘考试真题及答案详解1套
- 2025年珠海辅警招聘考试真题附答案详解(培优)
- 2025年玉溪辅警招聘考试真题含答案详解(预热题)
- 2025年铜仁辅警招聘考试题库及答案详解(典优)
- 2025年西宁辅警招聘考试题库附答案详解(夺分金卷)
- 2025年贵阳辅警招聘考试真题及完整答案详解一套
- 2025年赤峰辅警招聘考试题库及完整答案详解一套
- 2025年菏泽辅警协警招聘考试真题含答案详解(完整版)
- 2025年璧山县辅警招聘考试真题及答案详解(考点梳理)
- 2025年贵阳中考卷试题及答案
- 2025发展对象考试测试题库(附含答案)
- 合理用药培训试题及答案
- 2025浙江省新能源投资集团股份有限公司招聘26人笔试历年参考题库附带答案详解
- 医疗器械报废方案
- 2025年四川省拟任县处级领导干部任职资格试题及参考答案
- DR成像技术操作规范与管理
- 中国石化2026年度毕业生招聘备考考试题库附答案解析
- 神奇的圆周率课件
- 2025年版民间借款合同范本全文
- 加油站油料安全培训内容课件
评论
0/150
提交评论