综合作业题目

更新时间:2024-04-15 18:54:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

山西信息职业技术学院

《C语言程序设计基础》课程 综合实践型教学课题报告

组长: 姓名 贤天华 组员: 姓名 王平

姓名 许杨 姓名 覃毅 姓名 肖雪

专业班级: 网管0901班 指导教师:

山西信息职业技术学院

课题名称: 数学计算工具程序设计 山西信息职业技术学院

《C

语言程序设计基础》课程综合实践型教学课题报告

姓名 贤天华 王 平 覃 毅 小组编号 所选题号 1 1 1 1 1 1 1 1 自评小组工作量 (1—6) (1) (2)、(3) (4) (5) 自评分数 96 92 88 89 分数 96 92 88 89 课程名称:数学计算工具程序设计 学院:电力学院 专业班级 电自041班 学号 040501002 040501027 040501001 040501015 0405010033 许 杨 设计说明与功能描述(基本思路及关键语句说明) 教师评语 1 1 88 88 肖 雪 (6) 功能要求及分工:各计算功能单独编写成函数,在主函数中通过选项菜单调用函数。(括号内为负责人姓名) 主函数: 大概思路:显示界面并提示选择功能函数→判断选择的正确性→调用所选功能函数→选择是否继续调用当前功能函数→判断选择的正确性→返回主菜单继续运行 (1) 实现主函数完成选项菜单集成各个计算功能函数(贤天华); (2) 实现求任意数的阶乘(王平); (3) 实现求组合数(王平); (4) 实现求任意两个整数的最大公约数和最小公倍数(许杨); (5) 实现判断任意数是否素数(覃毅); (6) 实现显示菲波拉契数列的前N项(肖雪)。 各功能函数的数据输入形式和范围在显示界面上有适当提示,基输入出错或超出范围则提示重新输入。所输出的数据仅在屏幕上显示,不作保存。 本程序在很好地完成上述各基本功能的基础上,力求显示出十分清新友好的人机交互界面,不但使用户看到界面后感到精神愉悦,而且可以使用户按提示实现他所要求的操作,方便快捷。 本程序的优点在于善用循环结构控制程序运行方向,根据用户意向轻松实现循环调用各功能函数。此程序没什么大的难点,而循环结构却成为本程序主函数的一大亮点。如用do-while 循环结构,或判断所输入的字符是否为所要求输入的字符,或反复调用正在运行的功能函数,或返回主菜单继续运行。整个主函数被囊括在一个大的do-while 循环结构当中,使其实现不断循环,其中借助getchar语句实现运行的停顿。因而每个getchar语句既起到了录入字符的作用又起到了运行停顿的作用,当用户一输入数据时,程序便可立刻运行,快捷完成其功能,而不需要重新启动程序。 本程序目前的功能尚小,但其设计所体现的精神及其优点可谓优秀。倘若继续发扬其全心全意为人民服务精神,努力研究解决其中的个别难题难症,将其它更多的功能逐步完善,它有望一个十分优秀的学习或办公软件。 组长签名:贤天华 2005 年 6 月 16 日 实现课题基本功能,完成课题报告。 教师签名: 张启富 200 5 年 6 月 22 日 正文内容:

一、问题描述

在计算中我们会经常遇到一些比较复杂的计算。这些计算不但复杂难于计算,往往中断我们思考问题的思维,影响工作效率,而且常常使我们算得头晕脑胀,易于出错。为方便用户计算,实现某些计算机器自动化,特开发设计此《数学计算工具程序》。

二、问题分析

功能要求及分工:各计算功能单独编写成函数,在主函数中通过选项菜单调用函数。(括

号内为负责人姓名)

(7) 主函数完成选项菜单集成各个计算功能函数(贤天华); (8) 求任意数的阶乘(王平); (9) 求组合数(王平);

(10) 求任意两个整数的最大公约数和最小公倍数(许杨); (11) 判断任意数是否素数(覃毅); (12) 显示菲波拉契数列的前N项(肖雪)。

各功能函数的数据输入形式和范围在显示界面上有适当提示,基输入出错或超出范围则提示重新输入。所输出的数据仅在屏幕上显示,不作保存。

三、程序设计思路功能模块说明

程序的控制流程入下图所示。

Y

d=? d=? 输入数字d N 开始 0

d=? d=? d=? N N N

四、程序调试与测试

本程序在经过本小组的大量的反复修改和反复调试工作完,基本做到了性能和严密性良好,得以问世。 (1)调试中遇到的主要问题是如何更好地利用循环结构实现程序对数据的合法性的判断及如何利用循环结构实现对程序的反复调用过程.在测试过程中遇到了用scanf函数录入某些数据是会出现本次输入的数据保留作下一步执行所需的数据用的情况,而出现某些错误.今改用getchar函数则避免了这种情况的发生.

(2)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。输出结果已直接抓取屏幕图像粘贴在下。

求任意数的阶乘

求组合数

求任意两个整数的最大公约数和最小公倍数

判断任意数是否素数

显示菲波拉契数列的前N项

五、程序清单

// 作者:电自041第一小组 // 组长:贤天华

// 其他组员(按姓氏笔画顺序排列):王 平 许 杨 肖 雪 覃 毅 // 编写日期:2005.6.5. // 最后修改日期:2005.6.16.

// 版权:本软件为山西信息职业技术学院电力工程学院04级电气工程及其自动化专业1班第一小组全体所有。版权所有,仿冒必究!

//鸣谢:在本程序的缩写和调试过程中得到了张启富导师的亲临指导和大力支持,在此我们全体组员向他表示衷心的感谢!!!

#include \ //文件包含 #include \char d,h;

//定义全局字符变量 //功能函数:求任意数的阶乘(主要负责人员:王 平)

double fact(t) //用户自定义一个函数,用来求任意数的阶乘 int t; { int i; double sum=1;

for(i=1;i<=t;i++) //用for循环求由实参传给形参的数 sum=sum*i;

return(sum); //返回函数值 }

//功能函数:求组合数(主要负责人员:王 平) void comb()

{int m,n,i,result;

scanf(\ //输入m,n的值

while(m>n); //判断当m>n时,循环继续,直到m

//功能函数:求任意两个整数的最大公约数和最小公倍数(主要负责人员:许 杨) void abc()

{ int a,b,num1,num2,temp; //定义整型变量a,b,num1,num2,temp(中间变量) printf(\请输入两个整数,用空格分隔,并回车确认:\\n\

scanf(\ //键盘敲入两个数num1,num2

if(num1

while(b!=0) //利用辗除法,直到b为0为止 {temp=a%b; a=b; b=temp; }

printf(\公约数:%d\\n\

printf(\公倍数:%d\\n\}

//功能函数:判断任意数上否素数(主要负责人员: 覃 毅) void xyz() {

int n,m,k,flag; //定义变量,flag是一个标志变量 printf(\请输入一个整数,并回车确认:\ //输入要判断的整数 scanf(\ //将输入的整数存入变量n的空间 m=sqrt(n); //定义m为n的平方根 flag=0;

for(k=2;k<=m;k++) //从2到m之间的整数逐个判断 if(n%k==0){flag=1;

do {printf(\输入m和n的值,用空格分隔(m<=n),并回车确认:\\n\ //用do循环判断当m

break;} //若条件成立跳出循环 if(flag) //判断标志变量,确定结果 printf(\不是素数。\\n\ //输出结果 else printf(\是素数。\\n\ //同上 }

//功能函数:显示菲波拉契数列的前n项(主要负责人员:肖 雪) void Fibonacci()

#define MAX 48 //定义宏名并赋值 {

//功能函数:判断继续还是返回主菜单(主要负责人员:贤天华) void aaa() {

for(d='a';d!='y'&&d!='n'&&d!='Y'&&d!='N';d=getchar() ) //当所输入的字符不是小写的或大写的y和n时提示重新输入

printf(\是否继续本项操作?请选择y/n并回车确认:\\n\

printf(\菲波拉契数列的前%d项为:\\n\\n\ //输出数列的各项 printf(\ Ln=2;

for(i=3;i<=N;i++) {

f3=f1+f2; //数列通项 if(Ln++%6==0) printf(\ //每6个数换行 printf(\ //输出f3 f1=f2; f2=f3;

while(1) //永循环 {

printf(\ //换两行

printf(\请输入菲波拉契数列的项数,并回车确认\\n\ //提示输入

tp=scanf(\ //输入项数

if(tp==1&&(N>0&&N

int N,i,tp,Ln=0; //定义整型变量,给Ln赋初值 unsigned long int f1=1,f2=1,f3; //定义无符号长整型常量

printf(\输入的数据非法,请重新输入项数!\\n\scanf(\ //重新输入 getchar(); }

}

printf(\ }//换行

}

//主函数功能:显示界面菜单选项,集成调用各功能函数等;(主要负责人员:贤天华) main()

{do //用do-while 循环结囊括整个主函数体,目的是让程序在执行完任务后立刻返回主菜单 { printf(\ printf(\ *\\n\ printf(\ 天 欢迎使用! 好 *\\n\ printf(\ *\\n\ printf(\ 天 请按数字键选择功能函数: 好 *\\n\ printf(\ *\\n\ printf(\ 向 按1,求任意数的阶乘 学 *\\n\

printf(\ 按2,求组合数 *\\n\ //显示友好界面 printf(\ 上 按3,求任意两个整数的最大公约数和最小公倍数 习 *\\n\ printf(\ 按4,判断任意数上否素数 *\\n\ printf(\ 按5,显示菲波拉契数列的前n项 *\\n\ printf(\ *\\n\ printf(\ printf(\

// do-while 循环结构判断所输入的数据合法性

do {printf(\请按1-5数字键选择功能函数,按回车键确认:\\n\ while(h<'1'||h>'6'); switch(h)

//switch结构函数内的所有do-while循环结构被用来根据用户需要而重复执行一个功能函数 { case '1': do{ int x; double y; //调用求阶乘函数 do

{printf(\声明:由于资源有限,只能输入0-170之间的任何整数,否则将导致错误结果! scanf(\ y=fact(x);

printf(\所要求的阶乘%lu!=%le\\n\ aaa();}while(d=='y'||d=='Y');break;

\\n请输入所要求阶乘的数:\\n\

case '2': do{ comb(); aaa();}while(d=='y'||d=='Y');break; //调用求组合数函数

case '3': do{ abc(); aaa();}while(d=='y'||d=='Y');break; //调用求最大公约数和最小公倍数函数 case '4': do{ xyz(); aaa();}while(d=='y'||d=='Y');break; //调用判断是否是素数函数 case '5': do{ Fibonacci(); aaa();}while(d=='y'||d=='Y');break; //调用Fibonacci数列函数 }

}while(1); //返回主菜单 }-

个人收获和体会:

(1)组长:贤天华

此次编程实践是我第一次以小组长的身份带领几个同学去独立编写一道小程序的编程

实践。在此过程中,我作为其中主要的一员,收获不少。下面就谈谈我的几点较大的收获吧。

我体会到对编程项目领导人员所要求的宏观把握性。作为一个编程项目的策划者就必须对象有整体的概念,对要着手编写的程序要完成多少个功能,可分为几个模块来完成,每个模块的工作量大概有多大,程序的总体性能、它所要求达到的精广度以及各个模块对编程人员的思维深度及技巧的要求等问题都应该有个比较清楚的轮廓。

我更加深入地认识到如何去调试和连接各个调用函数。比如,在调试过程中可将各个完成功能的小程序段分别调试,各个通过后再穿针引线地将各个功能函数通过主函数连接起来,即可较容易地将整个程序调试成功。

我更加深刻在全会到如何提高程序的严密性和可靠性。比如,在要求用户通过菜单输入数字选择函数功能时就必须应该设法使其所输入的字符为0—9之间的任何整数才有效,、就要考究他所输入的字符是否是所概的字符的问题。比如说如何运用do-while结构来达到此功能。这就需要用某些控制结构来达到程序的严密性问题。

通过编写这个小程序,我更加深刻地体会到了调用函数的好处和技巧,懂得如何显示出简单的人机交互界面,更加实在地领会到了循环结构在程序运行中的重要作用,并更深刻地掌握了某些用牾结构控制程序运行方向的技巧。

此次编写的程序还算相对比较简单,其中遇到的基本性问题不算得很多,而且几乎都解决了。但其它问题还是有的。比如说如何程序更简捷地完成某项功能。如何提高程序的技巧性、严密性,如何提高程序的可读性等问题。不过,此乃我用C语言编程的开始阶段,相信随着自己的努力和付出的增长,这些问题会有答案的。

(2)组员:

王 平: 在我写的两个程序中,都存在同一个问题,就是所要求的阶乘的数如果太大,

则程序将无法识别,在课本中,最长的整数为无符号长整形数,但是,太大的阶乘如100!,200!等在程序种就无法得出结论。我定义双精度浮点数来表示sum的值,用浮点数%e来表示较长的数的阶乘,但是由于浮点数默认的只到小数点后六位,比如在求100等较大阶乘时,由于使用了科学计数法,只默认小数点后面6位,在小数点6位后面的数就被省略了,在无形中,以把阶乘的值换了,但要是把数字换成可显示的全部数字的输出方法时,可以表示的阶乘实在是太小了,所以,最后我还是采用了%e的输出方法。第二个程序其实就是在第一个程序的基础上开完成的,求组合数说到底还是求任意数的阶乘,差别只在于在求组合数时,要求三次阶乘分别是n! (n-m)! m!所以在用户可以自己定义一个求任意数的函数来调用,在求循环时只要写一次,这样既缩短了程序的长度,也提高了程序的可读性,显得比较方便。在此程序时值得强调的是do while 循环用的好,控制调节(m>n)作为循环继续的条件,这样只要用户输入m大于n时,系统不往下执行,直到符合组合数的要求n大于m时才跳出循环,往下执行。

许 杨:

主要任务:求任意两个整数的最大公约数和最小公倍数

思考:1.键盘输入两个整数num1和num2后,把其中较大的数赋值给a,把较小的数赋值给b,这个过程可以通过定义一个中间变量temp来完成交换

2.用较大的数来除以较小的数,如果两个数可以整除,例如15和5,它们的余数为0,这样5就是他们的最小公约数,15就是它们的最小公倍数。

如果两个数不能够整除,必然有余数r,把b的原值赋给新的a,把余数r赋给新的b,再次进行

求余运算,直到余数r为0,循环结束。此时的a的值1即为两个数的最大公约数,公倍数即为两个数的乘积。这个过程(辗转相除法)可以用一个while循环来完成,循环的条件可以设为b不等于0。

比如说3和2不能整除, 第(1)步r=1,a=2,b=1,满足循环条件,继续循环;

第(2)步 r=2%1=1,a=1,b=1,满足循环条件,继续循环; 第(3)步 r=1%1=0,a=1,b=0,循环结束。

3.综上所述,无论是整除与否,所求最大公约数即为a 的值,所求最小公倍数即为所敲入两个数的乘积除以最大公约数a。

总结:本次C语言实验我的任务是编程实现“求两个整数的最大公约数和最小公倍数”。从数学的观点看,这是一个很基础而且很实际的问题;可以看到,两位数的计算还可以勉强接受,三位或者三位以上通过人工计算是相当耗时的,而且容易出错;如果把这个问题通过一个程序来解决,就可以节约大量的人力,提高效率。这里就体现出了C语言的优越性所在。具体算法如下:①把输入的数据大的作为分子,小的作为分母。②辗转相除知道余数为0。在思考的过程中,因为与数学计算中的过程有很大区别,所以辗转相除这一步不容易想到,这也是整个程序的核心所在。辗转相除的过程也是一个循环赋值的过程,即在余数不为0的情况下,总把分母赋值给分子,余数赋值给分母。而在余数为0的情况下,分母即所求最大公约数;原始数据的乘积除以最大公约数也就得到了最小公倍数。在这个算法的指导下,通过一个while语句就可以实现上述功能。

因为所选难度为C类,所以并没有给我在编程 的过程中造成很大困难,反而是我加深对这个程序的理解。如果能够对诸如此类的程序举一反三,一定会收到事半功倍触类旁通的效果。通过这次实验我有3点体会:⑴算法在C语言中的重要性;⑵实际问题→抽象思考→解决问题的过程;⑶团队合作精神对整个课题的完成起到了至关重要的作用。

覃 毅: 这次c语言程序设计的小组课题活动我很高兴和几个同学一起合作,而且在

我和小组成员的共同努力下使得程序设计的课题得以顺利的圆满的完成,使我受益颇多。

我此次负责的程序模块是判断用户输入的数字是否为素数,这个任务在难度上不是很大,在对程序基础知识的了解和运用的要求不是很高,所以在完成我的程序模块的时候遇到的问题和困难不是很多。

判断数字是否为素数重要是判断输入的数字是在被2到输入的数字的平方根之间的每一个整数,如果能被其中一个整数整除,就可以判断数字不是素数。主要是利用循环机构和函数调用的方法完成程序的主要功能。引入标志变量也是一个很重要的知识点,在这个程序中起到了判断的作用。

这次的小组活动我重要参与小组成员其他程序的编写讨论和调试程序,在同小组成员合作讨论调试的过程中,不仅能巩固自己掌握的知识,还能在别人遇到困难时帮助并找到自己欠缺的地方,使得对知识掌握的更全面更扎实,更能在这种互助的氛围下,体会到合作的重要,更能从中找到合作的快乐。 肖 雪: C语言心得体会 本次编程我非常高兴可以和几个同学共同完成一个课题,同时,我也亲身体会到合作的

重要性。尽管这个课题是个全新的挑战,但是在大家的努力之下,我们本次课题却得以顺利完成。

菲波拉锲数列是个数学性很强的一个数列,在数学和程序设计的理解上的要求还是较高的,而且在编写程序的过程中,遇到的困难不止在程序的基本构架的完成,还在于使程序的可行性和人性化方面存在一定难度。

针对这个程序模块的特点,了解结构化程序的两种结构,即顺序结构和循环结构,还有for循环和if选择结构的使用就显得至关重要。

虽然本题也可以用函数来定义编程,在数据处理中也并未遇到很大的困难,但在程序可行性的设计上存在的预想和程序具体表达上却存在了偏差,根据程序要求通俗易懂的特点,我采用了循环结构来编写,并且,通过我与小组成员的不断讨论和调试下,程序终于臻于完美。

我觉得对于这样的编程方式对于循环结构的熟悉有很大益处。我相信通过多次这样的合作编程,和上机反复实践,我们可以从中学到更多的东西,这个在今后的学习工作和生活的影响是不可估量的。

本文来源:https://www.bwwdw.com/article/swep.html

Top