吉林大学程序设计基础教材第五章-模块化程序设计--函数.ppt

上传人:w****2 文档编号:6294614 上传时间:2020-02-21 格式:PPT 页数:59 大小:1.56MB
返回 下载 相关 举报
吉林大学程序设计基础教材第五章-模块化程序设计--函数.ppt_第1页
第1页 / 共59页
吉林大学程序设计基础教材第五章-模块化程序设计--函数.ppt_第2页
第2页 / 共59页
吉林大学程序设计基础教材第五章-模块化程序设计--函数.ppt_第3页
第3页 / 共59页
点击查看更多>>
资源描述
第五章模块化程序设计 函数 求给定三角形的外心 模块化程序设计函数程序设计实例 例5 1 求给定三角形的外心 以e为例 求解垂直平分线 假设A点坐标为xa yaB点坐标为xb ybC点坐标为xc ycAC边的中点E的坐标为xe yeAC边的直线方程表示为Y a1 X b1AB边的直线方程表示为Y a2 X b2AC边垂直平分线e的直线方程为Y u1 X v1AB边垂直平分线f的直线方程为Y u2 X v2 include 括入标准输入输出函数库头文件voidmain 主函数floatxa ya xb yb xc yc 分别保存三角形三个顶点的X Y方向坐标floatxe ye AC边的中点E的坐标floatxf yf AB边的中点F的坐标floata1 b1 AC边的直线方程系数floata2 b2 AB边的直线方程系数floatu1 v1 AC边的垂直平分线的直线方程系数floatu2 v2 AB边的垂直平分线的直线方程系数floatxo yo 外心O的坐标 输入三个点的X Y方向坐标 printf pleaseinputxa ya xb yb xc yc n scanf f f f f f f 求AC边垂直平分线e xe xa xc 2 先求AC边的中点Eye 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边的中点Eyf 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 3fy 10 3f n xo yo 计算过程一致 而参与运算的数据不同 例5 2 用函数改写例5 1的程序 include 括入标准输入输出函数库头文件1 求垂直平分线 参数 两个顶点r s的x y坐标 floataa 全局变量 用于保存传递rs边的垂直平分线的直线方程斜率2floatlines floatxr floatyr floatxs floatys 3floatxt yt 中点T的坐标4floata b 过r s两点的直线方程系数5 先求中点T xt xr xs 2 6yt yr ys 2 7 再求过r s两点的直线方程rs a yr ys xr xs 8b yr a xr 9 求过中点T的与rs垂直的直线方程 aa 1 a 计算斜率aa10returnyt aa xt 计算截距b 并带着b值返回11 voidmain 主函数13floatxa ya xb yb xc yc 分别保存三角形三个顶点的X Y坐标14floatu1 v1 AC边的垂直平分线的直线方程系数15floatu2 v2 AB边的垂直平分线的直线方程系数16floatxo yo 外心O的坐标17 输入三个点的X Y方向坐标346360416108116212 printf pleaseinputxa ya xb yb xc yc n 18scanf f f f f f f 求AC边垂直平分线e v1 lines xa ya xc yc 截距20u1 aa 斜率21 求AB边垂直平分线f v2 lines xa ya xb yb 截距22u2 aa 斜率23 求e f交点O xo v2 v1 u2 u1 24yo u1 xo v1 25 打印输出 printf 外心坐标 x 10 3fy 10 3f n xo yo 26 子程序 自顶向下 逐步求精 程序设计技术的基础从问题的整体 最顶层 出发 向下分解问题 逐层细分 得到整个问题的解决方法使用子程序技术分离了 做什么 与 怎么做 程序逻辑结构清晰 易写 易读 易懂 程序的设计 调试 维护变得容易 5 2函数 例5 2 程序执行过程函数概念的组成函数定义函数调用使用函数注意事项先定义该函数 标准库函数除外 类似于数学中的函数定义 再在表达式中调用该函数 数学中计算某函数的一个特定值 5 2 1函数定义 function declaration 除标准库函数外 程序中使用函数必须先定义 然后再用 函数调用 调用它 函数定义形式类型说明符标识符 参数列表 复合语句 floatdis floatxr floatyr floatxs floatys returnsqrt xr xs xr xs yr ys yr ys 函数类型 函数名字 形参列表 复合语句函数体 函数定义说明符 函数定义说明符上述形式的第一行称 函数定义说明符 形式如下TTF 参数列表 具体指明以下点 函数的结果类型 由 类型说明符 TT 标明 函数的名字 由类型说明符后的 标识符 F 标明 函数的形式参数个数和每个形式参数的特性 由 参数列表 标明 函数类型函数的结果类型缺省int类型结果类型不能是数组类型 函数类型函数可以是无值的 即 无类型 void参数列表 parameter list 每个参数声明具体说明形式 类型说明符标识符参数列表形式Tid Tid Tid C允许使用无参函数 无参函数的参数列表为空 或使用 空类型 的类型说明符 void TTF TTF void 复合语句 compound statement 由声明和语句列表组成声明部分具体的说明本函数内使用的其它量 语句部分规定在本函数中要执行的算法动作 函数定义的形式 TTF Tid Tid Tid intf intx inty floatz intf intx y floatz intf intx y floatz 5 2 2函数调用 调用过程首先顺序计算实参表中各实参值然后把这些值顺序传入形参表的各个形参中最后进入函数执行复合语句 一般形式F U U U F 例子lines xa ya xc yc lines xa ya xb yb printf 外心坐标 x 10 3fy 10 3f n xo yo 主程序 调用函数 返回 结束 函数 参数结合规则静态上看 实参表中的实参与被调用函数中形参表的形参 按位置从左向右依次一一对应对应位置上的形实参间要赋值兼容各个实参的计算次序是依赖于实现的 参数结合动作计算实参表达式的值把实参的值按赋值转换规则 转换成形参的类型 如果不能完成该转换 则称函数参数不一致 产生错误把转换后的实参值送入形参 3 intf 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 2 9 程序输出为 609 a b x 返回值 x y c main f 内存 5 12 60 60 0 x y v z u main f 内存 g 返回值 返回值 由左至右 include stdio h intx y intf intz x x 1 return z z intg intu intv voidmain x 0 g x f 2 0 2 1 4 4 0 x y v z u main f 内存 g 返回值 返回值 由右至左 include stdio h intx y intf intz x x 1 return z z intg intu intv voidmain x 0 g x f 2 1 2 1 4 4 并行计算 不知道结果 include stdio h intx y intf intz x x 1 return z z intg intu intv voidmain x 0 g x f 2 代码中参数值不能依赖计算次序 根据参数出现的位置形式参数 函数声明 局部于函数的变量 intf intx inty returnx y 实际参数 函数调用voidmain inta 2 b 3 f a b b f 2 b 3 根据参数值的传递规则值参当调用函数时 把实参的值传入形参变量变参当调用函数时 把实参的地址值传入形参变量C语言中的参数都是值参 函数返回返回方式 return return表达式 函数运行到复合语句末尾 最后那个闭花括号 后 例子returnsqrt xr xs xr xs yr ys yr ys returnsqrt s s uv s uw s vw 函数值 有返回类型的函数intf intx inty if x y returnx elsereturny 无返回类型的函数voidg intw if w 1 return elsex 3 有返回类型函数的函数值使用returne 向调用函数的主程序传递函数值returne 的执行过程是 计算表达式e的值把表达式值按赋值转换规则 转换成函数的结果类型 返回语句中表达式的类型与函数的结果类型必须赋值兼容 用类型转换后的值作为函数值 并带着它返回到调用该函数处 无返回类型函数的函数值voidg intw if w 1 return elsex 3 在函数调用处 所调函数无值可以带回 对于无类型函数 在函数调用处不需要函数值 这种返回是正常的 对于有类型函数 在函数调用处极可能需要函数值参加下一步运算 这将带来不可预料的结果 5 2 3先调用后定义 函数原型为什么使用函数原型任何标识符都必须声明 而且必须先声明后使用在声明定义函数时必须保证函数声明位置在使用前出现从程序行文顺序上控制 一般比较难实现函数原型 方便灵活 一般形式TTF T T T TTF Tid Tid Tid 例子floatf int float int char floatf intz floatu intv charw 函数原型的功能满足了C标识符先定义后使用的要求并向编译系统提供所调用函数的信息函数返回类型函数的参数个数函数参数特性等信息程序设计风格最好把所有函数原型集中 放在主函数之前 floatxa ya xb yb xc yc xd yd floats1 s2 ss m floatliners floatxr floatyr floatxs floatys floatareauvw floatxu floatyu floatxv floatyv floatxw floatyw voidmain void printf pleaseinputxa ya xb yb xc yc xd yd n scanf f f f f f f f f returnsqrt s s uv s uw s vw 程序设计实例 重写打印字符矩阵重写打印100以内素数验证Pascal定理 重写打印字符方阵 ABCDEFGHIABCDEFGHIABCDEFGHIABBBCDEFGHIABCDEFGHIABCCCCCDEFGHIABCDEFGHIABCDDDDDDDEFGHIABCDEFGHIABCDEEEEEEEEEFGHIABCDEFGHIABCDEFFFFFFFFFFFGHIABCDEFEFGHIABCDEEEEEEEEEFGHIABCDEDEFGHIABCDDDDDDDEFGHIABCDCDEFGHIABCCCCCDEFGHIABCBCDEFGHIABBBCDEFGHIABABCDEFGHIABCDEFGHIA 打印前6行 打印后5行 x voidwritelinex char voidmain charx for x A x A x writelinex x voidwritelinex charu 打印第u行chary inti 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以内素数 returnfalse for j i 2 j 2 j returntrue i j 0 include stdio h boolprime int voidmain inti for i 2 i 2 j if n j 0 returnfalse returntrue 验证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 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构成直线的斜率和截距 主程序之前这段为 函数原型 以及各个函数返回结果所用变量 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 主函数 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 floatma floatmb floatna floatnb wx nb mb ma na wy ma wx mb 检验 booltest floatb1 x floatb1 y floatb2 x floatb2 y floatb3 x floatb3 y straightline b1 x b1 y b2 x b2 y if fabs b3 y a b3 x b eps returntrue elsereturnfalse 本章小结 函数的定义函数的调用模块化程序设计思想 作业 5 45 8
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!