吉林大学程序设计基础教材模块化程序设计函数实用教案_第1页
吉林大学程序设计基础教材模块化程序设计函数实用教案_第2页
吉林大学程序设计基础教材模块化程序设计函数实用教案_第3页
吉林大学程序设计基础教材模块化程序设计函数实用教案_第4页
吉林大学程序设计基础教材模块化程序设计函数实用教案_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、【例5.1】求给定(i dn)三角形的外心CB图5.1 三角形外心YXAdefOEFD输入三个顶点坐标求垂直平分线e求垂直平分线f图5.2 求三角形外心的PAD求e 、f交点OO点即为外心,输出其坐标第1页/共59页第一页,共60页。 以e为例,求解(qi ji)垂直平分线图5.3 求垂直平分线e求AC边的中点E求AC边的直线方程求过E点的与AC垂直的直线的直线方程第2页/共59页第二页,共60页。假设A点坐标为xa、yaB点坐标为xb、ybC点坐标为xc、ycAC边的中点(zhn din)E的坐标为xe、yeAC边的直线方程表示为 Y=a1*X+b1AB边的直线方程表示为Y=a2*X+b2A

2、C边垂直平分线e的直线方程为Y=u1*X+v1AB边垂直平分线f的直线方程为Y=u2*X+v2第3页/共59页第三页,共60页。输入三个顶点坐标图5.4 求三角形外心的完整PADxo=(u2-u1)/(v2-v1);yo=u1*xo+v1;O点即为外心,输出其坐标xe=(xa+xc)/2; ye=(ya+yc)/2;a1=(ya-yc)/(xa-xc);b1=ya-a1*xa;u1= -1/a1;v1= ye-u1*xexf=(xa+xb)/2;yf=(ya+yb)/2;a2=(ya-yb)/(xa-xb);b2=ya-a1*xa;u2= -1/a2;v2= yf-u2*xf第4页/共59页第

3、四页,共60页。#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边的直线(zhxin)方程系数float a2 , b2; / AB边的直线(zhxin)方程系数float u1 , v1; / AC边的垂直平分线的直线(zhxin)方程系数float u2 ,v2;/ AB边的垂直平分线的直线(zhxin)方程系数float xo,y

4、o;/外心O的坐标/* 输入三个点的X、Y方向坐标 */printf(please input xa,ya,xb,yb,xc,yc:n);scanf(%f%f%f%f%f%f,&xa,&ya,&xb,&yb,&xc,&yc);第5页/共59页第五页,共60页。/* 求AC边垂直平分线e */xe=(xa+xc)/2; / 先求AC边的中点Eye=(ya+yc)/2;a1=(ya-yc)/(xa-xc); /再求过A、C两点的直线方程(fngchng)b1=ya-a1*xa; u1= -1/a1; / 求过E点的与AC垂直的直线的直线方程(fngc

5、hng)v1= ye-u1*xe;/* 求AB边垂直平分线f */xf=(xa+xb)/2; / 先求AB边的中点Eyf=(ya+yb)/2;a2=(ya-yb)/(xa-xb); /再求过A、B两点的直线方程(fngchng)b2=ya-a1*xa;u2= -1/a2; / 求过F点的与AC垂直的直线的直线方程(fngchng)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); 计算过程一致(yzh),而参与运算的数据不同第6

6、页/共59页第六页,共60页。【例5.2】用函数改写(gixi)例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; / 中点(zhn din)T的坐标4 float a , b; / 过r、s两点的直线方程系数5 /* 先求中点(zhn din)T */ xt=(xr+xs)/2;/6 yt=(yr+ys)/

7、2; /7 /* 再求过r、s两点的直线方程rs */ a=(yr-ys)/(xr-xs);/8 b=yr-a*xr; /9 /* 求过中点(zhn din)T的与rs垂直的直线方程 */ aa = -1/a; /计算斜率aa 10 return yt-aa*xt; /计算截距b,并带着b值返回11第7页/共59页第七页,共60页。void main( ) / 主函数 13 float xa,ya,xb,yb,xc,yc; /分别保存三角形三个顶点的X、Y坐标14 float u1 , v1; / AC边的垂直平分线的直线方程系数(xsh) 15 float u2 ,v2;/ AB边的垂直平分

8、线的直线方程系数(xsh) 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,&xa,&ya,&xb,&yb,&xc,&yc);第8页/共59页第八页,共60页。/* 求AC边垂直平分线e */v1=lines( xa, ya, xc, yc );/ 截距20u1=aa;/ 斜率(xil)21/* 求AB边垂直平分线f */v2=

9、lines( xa, ya, xb, yb );/ 截距22u2=aa;/ 斜率(xil)23/* 求e,f交点O */xo= -(v2-v1)/(u2-u1); /24yo=u1*xo+v1; /25/* 打印输出 */printf(“外心坐标:x=%10.3f y=%10.3f n”,xo,yo ); /26 第9页/共59页第九页,共60页。子程序自顶向下、逐步求精”程序设计技术的基础 从问题的整体(最顶层)出发,向下分解问题。逐层细分,得到整个问题的解决方法使用子程序技术分离了“做什么(shn me)”与“怎么做”程序逻辑结构清晰,易写,易读,易懂。程序的设计,调试,维护变得容易第10

10、页/共59页第十页,共60页。5.2 函数(hnsh) 【例5.2】程序执行过程 函数概念的组成(z chn) 函数定义 函数调用 使用函数注意事项 先定义该函数(标准库函数除外)类似于数学中的函数定义。 再在表达式中调用该函数数学中计算某函数的一个特定值。第11页/共59页第十一页,共60页。5.2.1 函数(hnsh)定义(function-declaration) 除标准库函数外, 程序中使用函数必须先定义,然后再用“函数调用”调用它。 函数定义形式 类型(lixng)说明符 标识符 ( 参数列表 ) 复合语句第12页/共59页第十二页,共60页。float dis( float xr,

11、float yr,float xs,float ys ) return sqrt( (xr-xs)*(xr-xs)+(yr-ys)*(yr-ys); 函数(hnsh)类型函数(hnsh)名字形参列表(li bio)复合语句函数体函数定义说明符第13页/共59页第十三页,共60页。 函数定义说明符 上述形式的第一行称“函数定义说明符”,形式如下 TT F ( 参数(cnsh)列表)具体指明以下点:函数的结果类型 由“类型说明符”( TT )标明;函数的名字 由类型说明符后的“标识符” ( F )标明;函数的形式参数(cnsh)个数和每个形式参数(cnsh)的特性 由“参数(cnsh)列表”标明。

12、第14页/共59页第十四页,共60页。 函数类型 函数的结果类型 缺省 int 类型 结果类型不能是数组类型、函数类型 函数可以是无值的,即“无类型”void 参数列表(li bio)(parameter-list) 每个参数声明具体说明形式: 类型说明符 标识符 参数列表(li bio)形式 T id ,T id ,. ,T id 第15页/共59页第十五页,共60页。 C允许使用无参函数,无参函数的参数列表为空,或使用“空类型”的类型说明符“void” TT F() TT F (void ) 复合语句(compound-statement)由声明和语句列表组成(z chn) 声明部分具体的

13、说明本函数内使用的其它量; 语句部分规定在本函数中要执行的算法动作。 函数定义的形式: TT F ( T id ,T id ,. ,T id ) . 第16页/共59页第十六页,共60页。int f(int x, int y, float z)int f(int x,y ; float z)int f(int x,y , float z)第17页/共59页第十七页,共60页。5.2.2 函数调用调用过程首先顺序计算实参表中各实参值然后把这些值顺序传入形参表的各个(gg)形参中最后进入函数执行复合语句。一般形式F (U, U, ,U)F ( )例子lines( xa, ya, xc, yc )l

14、ines( xa, ya, xb, yb )printf(“外心坐标:x=%10.3f y=%10.3f n”,xo,yo)第18页/共59页第十八页,共60页。主程序调用函数返回(fnhu)结束(jish)函数(hnsh)第19页/共59页第十九页,共60页。参数结合规则(guz)静态上看,实参表中的实参与被调用函数中形参表的形参,按位置从左向右依次一一对应对应位置上的形实参间要赋值兼容各个实参的计算次序是依赖于实现的。参数结合动作计算实参表达式的值把实参的值按赋值转换规则(guz),转换成形参的类型。如果不能完成该转换,则称函数参数不一致,产生错误把转换后的实参值送入形参第20页/共59页

15、第二十页,共60页。3int 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);29程序(chngx)输出为:609abx返回值xycmainf内存(ni cn)5126060第21页/共59页第二十一页,共60页。0 xyvzumainf内存(ni cn)g返回值返回值n 由左至右#include stdio.h int x,y ; int f( int z ) x=x+1 ; return (z*z); int g( int

16、 u , int v ) void main() x=0 ; g(x,f(2) ; 02144第22页/共59页第二十二页,共60页。0 xyvzumainf内存(ni cn)g返回值返回值n 由右至左#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) ; 12144第23页/共59页第二十三页,共60页。n 并行计算-不知道(zh do)结果n#include stdio.hn int x,y ; n int f( i

17、nt z ) n x=x+1 ; n return (z*z); n n int g( int u , int v ) n n n void main() n x=0 ; n g(x,f(2) ; n 代码中参数值不能依赖(yli)计算次序!第24页/共59页第二十四页,共60页。 根据(gnj)参数出现的位置 形式参数函数声明(局部于函数的变量) int f(int x,int y) return x+y; 实际参数函数调用void main() int a=2,b=3; f(a+b, b); f(2+b,3); 第25页/共59页第二十五页,共60页。 根据参数值的传递规则 值参当调用函数

18、时,把实参的值传入(chun r)形参变量 变参 当调用函数时,把实参的地址值传入(chun r)形参变量 C语言中的参数都是值参第26页/共59页第二十六页,共60页。 函数返回 返回方式: return ; return 表达式; 函数运行到复合语句末尾(mwi)(最后那个闭花括号“”)后。 例子 return sqrt( (xr-xs)* (xr-xs)+(yr-ys)* (yr-ys) ); return sqrt(s*(s-uv)*(s-uw)*(s-vw) );第27页/共59页第二十七页,共60页。n 函数(hnsh)值有返回(fnhu)类型的函数 int f (int x, i

19、nt y) if (x=y) return x; else return y;无返回(fnhu)类型的函数 void g( int w) if (w=1) return; else x=3;第28页/共59页第二十八页,共60页。有返回类型函数的函数值使用 return e; 向调用函数的主程序传递函数值return e ; 的执行过程是:计算表达式e的值把表达式值按赋值转换规则,转换成函数的结果(ji gu)类型;返回语句中表达式的类型与函数的结果(ji gu)类型必须赋值兼容。用类型转换后的值作为函数值,并带着它返回到调用该函数处第29页/共59页第二十九页,共60页。 无返回类型函数(h

20、nsh)的函数(hnsh)值 void g( int w) if (w=1) return; else x=3; 在函数(hnsh)调用处,所调函数(hnsh)无值可以带回。 对于无类型函数(hnsh),在函数(hnsh)调用处不需要函数(hnsh)值,这种返回是正常的; 对于有类型函数(hnsh),在函数(hnsh)调用处极可能需要函数(hnsh)值参加下一步运算,这将带来不可预料的结果第30页/共59页第三十页,共60页。5.2.3 先调用(dioyng)后定义函数原型为什么使用函数原型任何标识符都必须声明(shngmng),而且必须先声明(shngmng)后使用在声明(shngmng)定

21、义函数时必须保证函数声明(shngmng)位置在使用前出现从程序行文顺序上控制 一般比较难实现函数原型 方便灵活第31页/共59页第三十一页,共60页。 一般(ybn)形式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 ) ;第32页/共59页第三十二页,共60页。 函数原型的功能 满足(mnz)了C标识符先定义后使用的要求 并向编译系统提供所调用函数的信息 函数返回类型 函数的参数个数

22、 函数参数特性等信息 程序设计风格 最好把所有函数原型集中,放在主函数之前第33页/共59页第三十三页,共60页。第34页/共59页第三十四页,共60页。程序设计(chn x sh j)实例 重写打印字符矩阵 重写打印100以内素数(s sh) 验证 Pascal 定理 第35页/共59页第三十五页,共60页。重写打印字符(z f)方阵 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

23、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 FG 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

24、 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打印打印(d yn)前前 6 行行 打印打印(d yn)后后5行行xfor(x=A;x=A;x-)第36页/共59页第三十六页,共60页。void writelinex(char);void main( ) char x ;for ( x=A;x=A;x-)writelinex(x);第37页/共59页第三十七页,共60页。void writelinex(char u) / 打印(d yn)第u行char y ;int i

25、;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”);第38页/共59页第

26、三十八页,共60页。重写打印(d yn)100以内素数 for (i=2;i=2;j-)return true i%j = 0第39页/共59页第三十九页,共60页。#include “stdio.h”bool prime( int );void main( ) int i ; for ( i = 2 ;i = 2 ; j- ) if ( n%j = 0 )return false ; return true ;第40页/共59页第四十页,共60页。验证(ynzhng) Pascal 定理 圆内接六边形三双对边延线的交点(jiodin)在一条直线上ABCDEFB1B2B3读入六个极角的值求六个

27、顶点A, B, C, D, E, F 在直角坐标系中的坐标求三双对边交点B1, B2, B3 坐标验证B1, B2, B3 是否在一条直线上开始结束第41页/共59页第四十一页,共60页。 将6个点的极坐标转换成直角坐标(zh jio zu bio) 已知极角theta,矢径r,求一点(y din)的直角坐标(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第42

28、页/共59页第四十二页,共60页。 求交点(jiodin)B1,B2,B3的坐标 已知四点r, s, t, u求两条直线(zhxin)交点Bthree_inter求AB 、DE交点B1求BC 、EF交点B2求CD 、FA交点B3returnintersection 求r, s ; t, u直线方程l1, l2求l1、l2交点Breturn第43页/共59页第四十三页,共60页。 已知四点r, s, t, u求两条直线(zhxin)l1,l2的方程 已知两点坐标px, py, qx, qy, 求直线(zhxin)的斜率a和截距bequtionreturn求r,s直线方程l1求t,u直线方程l2s

29、traightline b=(py*qx-qy*px)/(qx-px)return a=(py-qy)/(px-qx)第44页/共59页第四十四页,共60页。 已知两条直线方程(fngchng)斜率分别为ma, na; 截距mb, nb;求直线交点(wx, wy) 验证(ynzhng)B1, B2, B3是否在一条直线上interwx=(nb-mb)/(ma-na); wy=ma*px+mb; returntestreturn 求过B1, B2直线方程L判断B3是否在直线L上第45页/共59页第四十五页,共60页。/*PROGRAM Pascal theorem*/#include math.

30、h#include stdio.h#define PI 3.1415927#define eps 1e-5float radius; /* 圆的半径 */float theta1, theta2, theta3, theta4, theta5, theta6; / * 六个极角的度数 */float xa, ya, xb, yb, xc, yc, xd, yd, xe, ye, xf, yf; /* 六个顶点的直角坐标(zh jio zu bio) */float b1_x, b1_y, b2_x, b2_y, b3_x, b3_y; /* 三个交点的直角坐标(zh jio zu bio) *

31、/ float b12_a, b12_b; /*B1和B2构成直线的斜率和截距*/第46页/共59页第四十六页,共60页。/*主程序之前这段为“函数原型”以及各个函数返回结果所用变量*/void trans_abcdef();float px, py; /* 用来保存coordinate()转换(zhunhun)的直角坐标 */void coordinate (float, float);void three_inter();void intersection (float, float, float, float, float, float, float, float);float l1_a

32、, 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

33、);第47页/共59页第四十七页,共60页。/*主函数(hnsh)*/void main() /*读入圆形的半径*/ printf(please input the radius of the circle:); scanf(%f, &radius); /*读入六个角*/ printf(please input six angle:); scanf(%f %f %f %f %f %f, &theta1, &theta3, &theta3, &theta4, &theta5, &theta6); trans_abcdef(); /*计算六个

34、定点坐标*/ three_inter(); /*求三个交点*/ if( test(b1_x, b1_y, b2_x, b2_y, b3_x, b3_y) ) /*验证*/ printf(ok); else printf(There is an error when:n); printf(theta1=%d theta2=%dn, theta1, theta2); printf(theta3=%d theta4=%dn, theta3, theta4); printf(theta5=%d theta6=%dn, theta5, theta6); 第48页/共59页第四十八页,共60页。/*计算六

35、个顶点(dngdin)坐标*/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;第49页/共59页第四十九页

36、,共60页。/*计算(j sun)一个顶点坐标*/void coordinate(float r, float theta) /* 先把“角度”转换成“弧度”,再转换成直角坐标 */ px=r*cos(PI*theta/180); py=r*sin(PI*theta/180);第50页/共59页第五十页,共60页。/*求三个交点(jiodin)*/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; intersection(xc, yc, xd, yd, xf, yf, xa, ya); b3_x=wx; b3_y=wy;第51页/共59页第五十一页,共60页。/*已知四点,求两条直线(zhxin)交点*/void intersection(float rx, float ry, float sx, floa

温馨提示

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

评论

0/150

提交评论