




已阅读5页,还剩54页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章 模块化程序设计函数,求给定三角形的外心模块化程序设计 函数 程序设计实例,【例5.1】求给定三角形的外心,以e为例,求解垂直平分线,假设 A点坐标为xa、ya B点坐标为xb、yb C点坐标为xc、yc AC边的中点E的坐标为xe、ye AC边的直线方程表示为 Y=a1*X+b1 AB边的直线方程表示为Y=a2*X+b2 AC边垂直平分线e的直线方程为Y=u1*X+v1 AB边垂直平分线f的直线方程为Y=u2*X+v2,#include / 括入标准输入输出函数库头文件 void main( ) / 主函数 float xa,ya,xb,yb,xc,yc; /分别保存三角形三个顶点的X、Y方向坐标 float xe,ye; / AC边的中点E的坐标 float xf,yf; / AB边的中点F的坐标 float a1 , b1; / AC边的直线方程系数 float a2 , b2; / AB边的直线方程系数 float u1 , v1; / AC边的垂直平分线的直线方程系数 float u2 ,v2; / AB边的垂直平分线的直线方程系数 float xo,yo; /外心O的坐标 /* 输入三个点的X、Y方向坐标 */ printf(“please input xa,ya,xb,yb,xc,yc:n“); scanf(“%f%f%f%f%f%f“,/* 求AC边垂直平分线e */ xe=(xa+xc)/2; / 先求AC边的中点E ye=(ya+yc)/2; a1=(ya-yc)/(xa-xc); /再求过A、C两点的直线方程 b1=ya-a1*xa; u1= -1/a1; / 求过E点的与AC垂直的直线的直线方程 v1= ye-u1*xe; /* 求AB边垂直平分线f */ xf=(xa+xb)/2; / 先求AB边的中点E yf=(ya+yb)/2; a2=(ya-yb)/(xa-xb); /再求过A、B两点的直线方程 b2=ya-a1*xa; u2= -1/a2; / 求过F点的与AC垂直的直线的直线方程 v2= yf-u2*xf; /* 求e,f交点O */ xo=(u2-u1)/(v2-v1); yo=u1*xo+v1; /* 打印输出 */ printf(“外心坐标:x=%10.3f y=%10.3f n”,xo,yo); ,计算过程一致,而参与运算的数据不同,【例5.2】用函数改写例5.1的程序,#include / 括入标准输入输出函数库头文件 1 /* 求垂直平分线:参数:两个顶点r、s的x、y坐标 */ float aa; /全局变量,用于保存传递rs边的垂直平分线的直线方程斜率 2 float lines( float xr,float yr,float xs,float ys ) /3 float xt,yt; / 中点T的坐标 4 float a , b; / 过r、s两点的直线方程系数5 /* 先求中点T */ xt=(xr+xs)/2; /6 yt=(yr+ys)/2; /7 /* 再求过r、s两点的直线方程rs */ a=(yr-ys)/(xr-xs); /8 b=yr-a*xr; /9 /* 求过中点T的与rs垂直的直线方程 */ aa = -1/a; /计算斜率aa 10 return yt-aa*xt; /计算截距b,并带着b值返回11 ,void main( ) / 主函数 13 float xa,ya,xb,yb,xc,yc; /分别保存三角形三个顶点的X、Y坐标14 float u1 , v1; / AC边的垂直平分线的直线方程系数 15 float u2 ,v2; / AB边的垂直平分线的直线方程系数 16 float xo,yo; /外心O的坐标 17 /* 输入三个点的X、Y方向坐标 346 360 416 108 116 212 */ printf(“please input xa,ya,xb,yb,xc,yc:n“); /18 scanf(“%f%f%f%f%f%f“,/* 求AC边垂直平分线e */ v1=lines( xa, ya, xc, yc ); / 截距20 u1=aa; / 斜率21 /* 求AB边垂直平分线f */ v2=lines( xa, ya, xb, yb ); / 截距22 u2=aa; / 斜率23 /* 求e,f交点O */ xo= -(v2-v1)/(u2-u1); /24 yo=u1*xo+v1; /25 /* 打印输出 */ printf(“外心坐标:x=%10.3f y=%10.3f n”,xo,yo ); /26 ,子程序,自顶向下、逐步求精”程序设计技术的基础 从问题的整体(最顶层)出发,向下分解问题。 逐层细分,得到整个问题的解决方法 使用子程序技术分离了“做什么”与“怎么做” 程序逻辑结构清晰,易写,易读,易懂。 程序的设计,调试,维护变得容易,5.2 函数,【例5.2】程序执行过程 函数概念的组成 函数定义 函数调用 使用函数注意事项 先定义该函数(标准库函数除外) 类似于数学中的函数定义。 再在表达式中调用该函数 数学中计算某函数的一个特定值。,5.2.1 函数定义(function-declaration),除标准库函数外, 程序中使用函数必须先定义,然后再用“函数调用”调用它。 函数定义形式 类型说明符 标识符 ( 参数列表 ) 复合语句,float dis( float xr,float yr,float xs,float ys ) return sqrt( (xr-xs)*(xr-xs)+(yr-ys)*(yr-ys); ,函数类型,函数名字,形参列表,复合语句 函数体,函数定义说明符,函数定义说明符 上述形式的第一行称“函数定义说明符”,形式如下 TT F ( 参数列表) 具体指明以下点: 函数的结果类型 由“类型说明符”( TT )标明; 函数的名字 由类型说明符后的“标识符” ( F )标明; 函数的形式参数个数和每个形式参数的特性 由“参数列表”标明。,函数类型 函数的结果类型 缺省 int 类型 结果类型不能是数组类型、函数类型 函数可以是无值的,即“无类型”void 参数列表(parameter-list) 每个参数声明具体说明形式: 类型说明符 标识符 参数列表形式 T id ,T id ,. ,T id,C允许使用无参函数,无参函数的参数列表为空,或使用“空类型”的类型说明符“void” TT F() TT F (void ) 复合语句(compound-statement)由声明和语句列表组成 声明部分具体的说明本函数内使用的其它量; 语句部分规定在本函数中要执行的算法动作。 函数定义的形式: TT F ( T id ,T id ,. ,T id ) . ,int f(int x, int y, float z) int f(int x,y ; float z) int f(int x,y , float z),5.2.2 函数调用,调用过程 首先顺序计算实参表中各实参值 然后把这些值顺序传入形参表的各个形参中 最后进入函数执行复合语句。 一般形式 F (U, U, ,U) F ( ) 例子 lines( xa, ya, xc, yc ) lines( xa, ya, xb, yb ) printf(“外心坐标:x=%10.3f y=%10.3f n”,xo,yo),主程序,调用函数,返回,结束,函数,参数结合规则 静态上看,实参表中的实参与被调用函数中形参表的形参,按位置从左向右依次一一对应 对应位置上的形实参间要赋值兼容 各个实参的计算次序是依赖于实现的。 参数结合动作 计算实参表达式的值 把实参的值按赋值转换规则,转换成形参的类型。如果不能完成该转换,则称函数参数不一致,产生错误 把转换后的实参值送入形参,3,int f (int x, int y) return x*y; void main() int a=3, b=2,x=9; int c; c=f(a+b,a+x); printf(“%dn”, c); printf(“%dn”, x); ,2,9,程序输出为: 60 9,a,b,x,返回值,x,y,c,main,f,内存,5,12,60,60,0,x,y,v,z,u,main,f,内存,g,返回值,返回值,由左至右 #include “stdio.h“ int x,y ; int f( int z ) x=x+1 ; return (z*z); int g( int u , int v ) void main() x=0 ; g(x,f(2) ; ,0,2,1,4,4,0,x,y,v,z,u,main,f,内存,g,返回值,返回值,由右至左 #include “stdio.h“ int x,y ; int f( int z ) x=x+1 ; return (z*z); int g( int u , int v ) void main() x=0 ; g(x,f(2) ; ,1,2,1,4,4,并行计算-不知道结果 #include “stdio.h“ int x,y ; int f( int z ) x=x+1 ; return (z*z); int g( int u , int v ) void main() x=0 ; g(x,f(2) ; ,代码中参数值不能依赖计算次序!,根据参数出现的位置 形式参数函数声明(局部于函数的变量) int f(int x,int y) return x+y; 实际参数函数调用 void main() int a=2,b=3; f(a+b, b); f(2+b,3); ,根据参数值的传递规则 值参 当调用函数时,把实参的值传入形参变量 变参 当调用函数时,把实参的地址值传入形参变量 C语言中的参数都是值参,函数返回 返回方式: return ; return 表达式; 函数运行到复合语句末尾(最后那个闭花括号“”)后。 例子 return sqrt( (xr-xs)* (xr-xs)+(yr-ys)* (yr-ys) ); return sqrt(s*(s-uv)*(s-uw)*(s-vw) );,函数值,有返回类型的函数 int f (int x, int y) if (x=y) return x; else return y; ,无返回类型的函数 void g( int w) if (w=1) return; else x=3; ,有返回类型函数的函数值 使用 return e; 向调用函数的主程序传递函数值 return e ; 的执行过程是: 计算表达式e的值 把表达式值按赋值转换规则,转换成函数的结果类型; 返回语句中表达式的类型与函数的结果类型必须赋值兼容。 用类型转换后的值作为函数值,并带着它返回到调用该函数处,无返回类型函数的函数值 void g( int w) if (w=1) return; else x=3; 在函数调用处,所调函数无值可以带回。 对于无类型函数,在函数调用处不需要函数值,这种返回是正常的; 对于有类型函数,在函数调用处极可能需要函数值参加下一步运算,这将带来不可预料的结果,5.2.3 先调用后定义,函数原型 为什么使用函数原型 任何标识符都必须声明,而且必须先声明后使用 在声明定义函数时必须保证函数声明位置在使用前出现 从程序行文顺序上控制 一般比较难实现 函数原型 方便灵活,一般形式 TT F ( T ,T ,. ,T ); TT F ( T id ,T id ,. ,T id ); 例子 float f ( int, float, int, char ) ; float f ( int z, float u, int v, char w ) ;,函数原型的功能 满足了C标识符先定义后使用的要求 并向编译系统提供所调用函数的信息 函数返回类型 函数的参数个数 函数参数特性等信息 程序设计风格 最好把所有函数原型集中,放在主函数之前,float xa,ya,xb,yb,xc,yc,xd,yd; float s1,s2,ss,m; float liners( float xr,float yr,float xs,float ys ) ; float areauvw(float xu,float yu, float xv,float yv, float xw,float yw ); void main(void) printf(“please input xa,ya,xb,yb, xc,yc,xd,yd:n“); scanf(“%f%f%f%f%f%f %f%f “, return sqrt( s*(s-uv)*(s-uw)*(s-vw) ,程序设计实例,重写打印字符矩阵 重写打印100以内素数 验证 Pascal 定理,重写打印字符方阵,A B C D E F G H I A B C D E F G H I A B C D E F G H I A B B B C D E F G H I A B C D E F G H I A B C C C C C D E F G H I A B C D E F G H I A B C D D D D D D D E F G H I A B C D E F G H I A B C D E E E E E E E E E F G H I A B C D E F G H I A B C D E F F F F F F F F F F F G H I A B C D E F E F G H I A B C D E E E E E E E E E F G H I A B C D E D E F G H I A B C D D D D D D D E F G H I A B C D C D E F G H I A B C C C C C D E F G H I A B C B C D E F G H I A B B B C D E F G H I A B A B C D E F G H I A B C D E F G H I A,打印前 6 行,打印后5行,x,void writelinex(char); void main( ) char x ; for ( x=A;x=A;x-) writelinex(x); ,void writelinex(char u) / 打印第u行 char y ; int i ; for ( y=u; y=I;y+) printf ( “%c”, y); for ( y=A; y=u-1;y+) printf ( “%c”, y); for( i=1;i=(5-(u-A)*2; i+) printf ( “”); for( i=1;i=2*(u-A)+1;i+) printf ( “%c”, u); for( i=1;i=(5-(u-A)*2); i+) printf ( “”); for ( y=u+1; y=I;y+) printf ( “%c”, y); for ( y=A; y=u;y+) printf ( “%c”, y); printf ( “n”); ,重写打印100以内素数,return false,for (j=i/2;j=2;j-),return true,i%j = 0,#include “stdio.h” bool prime( int ); void main( ) int i ; for ( i = 2 ;i = 2 ; j- ) if ( n%j = 0 ) return false ; return true ; ,验证 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 是否在一条直线上,/*PROGRAM Pascal theorem*/ #include “math.h“ #include “stdio.h“ #define PI 3.1415927 #define eps 1e-5 float radius; /* 圆的半径 */ float theta1, theta2, theta3, theta4, theta5, theta6; / * 六个极角的度数 */ float xa, ya, xb, yb, xc, yc, xd, yd, xe, ye, xf, yf; /* 六个顶点的直角坐标 */ float b1_x, b1_y, b2_x, b2_y, b3_x, b3_y; /* 三个交点的直角坐标 */ float b12_a, b12_b; /*B1和B2构成直线的斜率和截距*/,/*主程序之前这段为“函数原型”以及各个函数返回结果所用变量*/ void trans_abcdef(); float px, py; /* 用来保存coordinate()转换的直角坐标 */ void coordinate (float, float); void three_inter(); void intersection (float, float, float, float, float, float, float, float); float l1_a, l1_b, l2_a, l2_b; /* 两条直线的斜率和截距 */ void equation (float, float, float, float, float, float, float, float); float a, b; /* 直线方程的斜率和截距 */ void straightline(float, float, float, float); float wx, wy; /* 直线交点的直角坐标 */ void inter (float, float, float, float); int test (float, float, float, float, float, float);,/*主函数*/ void main() /*读入圆形的半径*/ printf(“please input the radius of the circle:“); scanf(“%f“, ,/*计算六个顶点坐标*/ void trans_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; ,/*计算一个顶点坐标*/ void coordinate(float r, float theta) /* 先把“角度”转换成“弧度”,再转换成直角坐标 */ px=r*cos(PI*theta/180); py=r*sin(PI*theta/180); ,/*求三个交点*/ void three_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; intersect
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 谭浩强课件第九章
- 2025年度餐厅承包合同范本:农家乐特色餐饮合作协议
- 2025版咖啡厅员工劳动合同解除补偿计算方法下载
- 2025版装配式建筑预制构件生产施工合同
- 2025版三亚新能源管道非开挖顶管建设服务合同
- 2025年发光字广告牌制作与新媒体推广合同
- 2025版数字货币交易平台货权转让与交易规则合同
- 2025版政府部门人事外包项目合同
- 语言文字知识培训内容课件
- 2025房屋出租委托代理合同样本模板
- 老年女性子宫颈癌筛查中国专家共识(2024版)解读
- 安全防护设施培训
- 保洁投标书范本
- 二甲药剂科培训材料
- 医院科室副主任竞聘
- 《路由与交换技术》教学大纲
- 博士后研究报告(出站)
- 新人教版七年级上册生物全册教案(2024年秋季新版教材)
- 高标准农田改造提升建设项目投标方案(技术标)
- 关于天然气安全知识
- (高清版)DZT 0331-2020 地热资源评价方法及估算规程
评论
0/150
提交评论