资源描述
1.课程设计总体要求22.设计任务与分析22.1设计题目22.2主要内容22.3任务分析23.设计方案23.1模块23.2流程图33.3主要函数33.4负责的模块设计34.程序调试65.总结与心得126.参考文献131. 课程设计总体要求采用模块儿化程序设计; 鼓励可视化编程; 源程序中有足够的注释; 学生可自行增加新功能模块儿; 必须上机调试通过; 注重算法运用,优化存储效率与运算效率; 需提交源程序及相关文件;2. 设计任务与分析2.1设计题目 简单图形处理2.2主要内容 只考虑点、直线、圆三种基本图形。对于点,给出点的横纵坐标;对于直线,给出直线方程ax+by+c0的三个系数a,b,c;对于圆,给出圆心坐标和半径。试说明图形的几何形状类型,并编写输入和输出图形数据、求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线等函数。2.3任务分析这个系统主要需要实现对求两点矩离、求两直线交点、已知点和半径形成圆、已知两点形成直线。我们可以先构建一个主函数,然后一次插入不同的功能函数。在实现功能函数的过程中又通过菜单函数进行各功能函数的调用。在运用图形处理函数的时候要用到图形文件。3. 设计方案3.1模块(1)输入两点,求出之间的距离。(2)输入圆心和半径输出一般的圆。(3)输入两直线表达式X,Y的系数,求出两直线的交点。(4)输入两点,输出通过该两点的直线。(5)退出。3.2流程图进入选择菜单输入数字040退出系统开始1两点之间的距离退出系统4形成直线2两直线的交点退出系统3形成圆3.3主要函数1.pointjl() (求两点之间的距离)2.linejd();(求两直线的交点)3.yuan();(已知圆心和半径形成圆)4.line1();(已知两点形成直线)5.choice();(功能选择)3.4负责的模块设计我所负责的模块:(1) 输入两直线表达式X,Y的系数,求出两直线的交点。 void linejd()/*求两直线交点*/float a1,a2,b1,b2,c1,c2,x,y;/*请输入直线的系数*/printf(*n);printf(请输入直线1 a1x+b1y+c10 的系数 a1,b1,c1 和直线2 a2x+b2y+c20 的系数 a2,b2,c1:n); printf(*n);scanf(%f,%f,%f,%f,%f,%f,&a1,&b1,&c1,&a2,&b2,&c2);if(a1*b2=b1*a2)if(b1*c2=c1*b2)printf(两直线重合,有无数个交点。n);elseprintf(两直线平行,无交点。n);elsex=(c2/b2-c1/b1)/(a1/b1-a2/b2); y=(c2/a2-c1/a1)/(b1/a1-b2/a2); printf(两直线交点是 x=%f,y=%f.n,x,y);getchar();(2) 输入两点,输出通过该两点的直线。void line1() /*输出输入已知数据的直线*/int x1,y1,x2,y2;int gdriver, gmode, i;printf(*n);printf(请输入两点 ,x1,y1,x2,y2:n);printf(*n);scanf(%d,%d,%d,%d,&x1,&y1,&x2,&y2);gdriver=DETECT;initgraph(&gdriver, &gmode, c:caicbgi);setbkcolor(BLUE);/*设定背景颜色为蓝色*/cleardevice();setcolor(GREEN);setlinestyle(0, 0, 3);setcolor(2);setcolor(WHITE);setlinestyle(4, 0xaaaa, 1);line(x1+320, y1+240, x2+320, y2+240);getch();closegraph();(3) 选择函数的设计int choice ()/*选择函数的定义*/char c;int k=1;menu();c=getchar();while(k)switch(c) case 1:pointjl() ;k=0;break; case 2:linejd() ;k=0;break; /*求已知两直线之间的交点函数*/ case 3:yuan();k=0;break; case 4:line1();k=0;break; case 0:k=0;break; printf(*n);printf(欢迎使用该系统n);printf(*n);return 1;4. 程序调试下面是进入时出现的一个示例图片。通过查找资料并以此图来调试我们知道画面中心的坐标是(320,240),我们就在程序中每个输入的横坐标加上320,纵坐标加上240,以防输入坐标偏离中心太远导致显示不理想。同时该圆的半径是98,这样我们就对数字代表的长度有了一个大概的了解。下面是对输出直线功能的调试。输入数据:0,0,200,200;显示出的图形如下图所示。我们可以看出,X轴正方向向左,Y轴正方向向下。为了进一步验证Y轴正方向向下,我做了第二次输入。如下图,此次输入的数据为:0,0,0,-200;由此可以断定,Y轴的正方向向下。接下来是对求两直线交点的调试。由下图可以看出当输入数据为1,2,3,3,2,1时得出交点为(1,-2)。对于直线x+2y+3=0与直线3x+2y+1=0,我们直接将x=1,y=-2带入,发现均成立,于是所求交点是正确的,程序没有问题。但是当我们输入两条重合或者平行直线时,程序给出了以下结果:可以发现给出的结果为1.#INF00的字样,这表示超出机器浮点类型所表示的范围。于是我认为程序还需改进。改进后调试结果如下:改进成功!下面是对选择功能的调试。输入1,结果如下:没有问题。输入2,结果如下:没有问题。输入3,结果如下:没有问题。输入4,结果如下:没有问题。至此,调试完毕!5. 总结与心得每一个简单的功能的实现实际上背后都有一个繁重的工程。尽管这是一个很简单的图形的输出、处理系统,但是每一个函数的设计、每一个功能的实现都来之不易。尤其是当每一个模块的程序编写好后的试运行,一个个error的寻找、改正花费了数倍于编写的时间。尽管编写的过程漫长、枯燥,甚至痛苦,但是当最后程序成功运行时,兴奋的心情还是立刻充斥心间,最后的成功就是对前面付出的最好回报。通过这次实践我也学到了很多。C语言的知识更加扎实、丰富,做事更加细心、耐心,还学会了如何与人合作来更快、更高效地完成任务。总之,这次实践中我收获了许多,希望以后可以继续与他人合作完成更多的任务!6. 参考文献 1 谭浩强. C语言程序设计M.北京:清华大学出版社.20062 张高煜. C语言程序设计实训.北京:中国水利出版社.20013 王晓东. C语言设计简明教程.北京:中国水利出版社.2006附:源代码: #include #include stdio.h#include math.h#include stdlib.h#include conio.hvoid linejd()/*求两直线交点*/float a1,a2,b1,b2,c1,c2,x,y;/*请输入直线的系数*/printf(*n);printf(请输入直线1 a1x+b1y+c10 的系数 a1,b1,c1 和直线2 a2x+b2y+c20 的系数 a2,b2,c1:n); printf(*n); scanf(%f,%f,%f,%f,%f,%f,&a1,&b1,&c1,&a2,&b2,&c2);if(a1*b2=b1*a2)if(b1*c2=c1*b2)printf(两直线重合,有无数个交点。n);elseprintf(两直线平行,无交点。n);elsex=(c2/b2-c1/b1)/(a1/b1-a2/b2); y=(c2/a2-c1/a1)/(b1/a1-b2/a2); printf(两直线交点是 x=%f,y=%f.n,x,y);getchar();void pointjl() /*求两点之间的距离*/int x1,y1,x2,y2; float jl;printf(*n);printf(请输入两点,x1,y1,x2,y2:n);printf(*n);scanf(%d,%d,%d,%d,&x1,&y1,&x2,&y2);jl=sqrt(pow(x1-x2,2)+pow(y1-y2,2);printf(这是两点 x1=%d , y1=%d 和 x2=%d , y2=%d 之间的距离是n jl=%fn,x1,y1,x2,y2,jl); getchar();void line1() /*输出输入已知数据的直线*/int x1,y1,x2,y2;int gdriver, gmode, i;printf(*n);printf(请输入两点 ,x1,y1,x2,y2:n);printf(*n);scanf(%d,%d,%d,%d,&x1,&y1,&x2,&y2);gdriver=DETECT;initgraph(&gdriver, &gmode, c:caicbgi);setbkcolor(BLUE);/*设定背景颜色为蓝色*/cleardevice();setcolor(GREEN);setlinestyle(0, 0, 3);setcolor(2);setcolor(WHITE);setlinestyle(4, 0xaaaa, 1);line(x1+320, y1+240, x2+320, y2+240);getch();closegraph();void yuan() /*输出输入了已知数据的圆*/int x1,y1,r;int gdriver, gmode, i;printf(*n);printf(请输入圆心 x1,y1 圆的半径 r:n);printf(*n);scanf(%d,%d,%d,&x1,&y1,&r);gdriver=DETECT;initgraph(&gdriver, &gmode, c:caicbgi);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(x1+320, y1+240, r);setlinestyle(0, 0, 3);setcolor(2);setcolor(WHITE);setlinestyle(4, 0xaaaa, 1);getch();closegraph();void menu() /*菜单函数*/printf(*n);printf(欢迎进入简单的图形处理系统!n);printf(*n);printf(*n);printf(请输入 1,2,3,4:n);/*请输入数字1,2,3,4*/printf(1.两点之间的距离n);/*两点之间的距离*/printf(2.两直线的交点 n);/*两直线的交点*/ printf(3.已知点和半径形成圆n);/*已知点和半径形成圆*/ printf(4.已知两点形成直线 n);/*已知两点形成直线*/printf(*n);int choice ()/*选择函数的定义*/char c;int k=1;menu();c=getchar();while(k)switch(c) case 1:pointjl() ;k=0;break; case 2:linejd() ;k=0;break; /*求已知两直线之间的交点函数*/ case 3:yuan();k=0;break; case 4:line1();k=0;break; case 0:k=0;break; printf(*n);printf(欢迎使用该系统n);printf(*n);return 1;int main()int gdriver, gmode, i;/*在进入主菜单之前先形成一个已知图形*/gdriver=DETECT;initgraph(&gdriver, &gmode, c:caicbgi);setbkcolor(BLUE);cleardevice();setcolor(GREEN);circle(320, 240, 98);setlinestyle(0, 0, 3); setcolor(2);rectangle(220, 140, 420, 340);setcolor(WHITE);setlinestyle(4, 0xaaaa, 1);line(220, 240, 420, 240);line(320, 140, 320, 340);getch();closegraph();choice();getchar();return 1; 16
展开阅读全文