C语言四则运算测试程序设计报告

C语言四则运算测试程序设计报告本文简介:昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号040401067姓名周绍平组员:学号040401070姓名邓磊学号040401106姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421指导教师:耿植林昆
C语言四则运算测试程序设计报告本文内容:
昆明理工大学
《计算机程序设计基础》课程
综合实践型教学课题报告
课题名称:100以内的整数四则运算测试程序设计
组长:
学号
040401067
姓名
周绍平
组员:
学号
040401070
姓名
邓
磊
学号
040401106
姓名
刘云路
学号
姓名
学号
姓名
学号
姓名
学号
姓名
学院:
信自学院
专业班级:
自动化0421
指导教师:
耿植林
昆明理工大学计算中心
2005
年
6月18日
昆明理工大学计算中心
《计算机程序设计基础》课程综合实践型教学课题报告
课程名称:100以内的整数四则运算测试程序设计
学院:
信自学院
专业班级:
自动化0421
学号
姓名
小组编号
所选题号
自评小组工作量
(1—6)
自评分数
分数
040401067
周绍平
15
5
8
85
95
040401070
邓
磊
15
5
6
85
86
040401106
刘云路
15
5
4
80
85
设计说明与功能描述(基本思路及关键语句说明)
作为一个数学运算的程序,在我看来至少要有以下几个功能:
1、
出题。既然是出题,那么就要求每次出的不一样。
2、
解题。如果一个用于数学计算的程序,无法让使用者输入解答。这便是
一个空壳。
3、
判断。和解题相似,如果一个程序无法判断使用者输入结果的正误,又在谁会使用它呢?
4、
显示。使用者有看到自己做的答卷和正确答案的要求和希望。
5、
重做。使用者在知道自己做错的题后,一般会选择重做错题,以达到对其的了解。
6、
菜单。不用说,这几乎是每一个程序都要求的。这是为了方便使用者进行多种选择。
7、
循环。这就要求程序能多次重复地运行。
设计这个程序的基本思路:
分别设计出题(计算和除法)、评分、答卷、正解、菜单、重做七个功能模块。然后再设计一个主函数,不断地调用菜单这个函数,使其达到各项功能。同时,菜单函数与各函数要紧密地联系在一起,可以说菜单这个函数是整个程序中的枢纽。
关键语句说明:
由于数据要求共享,即多次调用。将几个变量定义为全局变量(运算数(sy[10],sr[10]),运算符(fh[10]),输入结果(jd[10]),正确结果(jg[10]),分数(fs)。
运算数由随机函数产生,并对100取余以保证其在100以内。随即数种子由系统时间函数产生。运算符也由随机函数产生,对4取余。生成4个数字,再转换为相应的运算符。(srand(
(unsigned)time(
NULL
)
);
sy[i]=rand()%100;
sr[i]=rand()%100;
p=rand()%4;
)
程序中多次用到循环,对控制循环变量的定义和运算有很高的要求。
由于菜单选项函数的出现,这就要求对输入选项的合法性进行验证,如果不合法就要求重输。(
while(!(c>=
0
return
c;
)
错题正解和错题重做都要求其的处理在知道错题的基础上的。因此if(jg[i]=jd[i],这个语句是个基础,在这两个函数中它是根本,如果不能对其正确的判断,就无法达到相应的功能。
由于除法的特殊性――除数不能为0和得到的结果是整数。我们专门设计了一个用于产生除法的函数,将其放入计算这个函数中。下面是这个函数的核心部分:
srand(
(unsigned)time(
NULL
)
);
FA:
sy=rand()%100;
if(sy==0)
goto
FA;
for(i=1;i=10
sy是否为0
随机产生两个数对100取余及运算符
输入结果(jd)是否为答案(jg)
假
For循环产生sy的约数cs[b]
从cs[b]中随机抽取一个除数
将值返回函数jisuan
分数(fs+0)
分数(fs+10)
真否
结束
结束
3、重做(chongzuo)4、主函数(main)
开始
开始
调用计算函数(jisuan)
调用计算这个函数(jisuan)
m<10?
假
调用菜单函数(caidan)
真
For循环
jd=jg?
输入选项(key=?)
真
key=0?
假
输出题目
dajuan
1
zhengjie
输入结果
2
假
pingjia
jd=jg?
3
真
chongzuo
4
假
jisuan
For循环再次输出该题
5
结束
结束
真
由于其它四个函数较为简单或者和某些函数相似,这里就不再重复说明。
在程序中用到的数据说明:
运算符:随机产生4个数字(0、1、2、3),定义为int
p(全局变量),再转换为运算符(+、-、*、/),定义为char
fh[10](全局变量)
.
运算数:随机产生两个运算数,对100取余。定义为
int
sy[10],sr[10](全局变量).
结果和答案:定义为
int
jd[10],jg[10](全局变量).
循环控制变量:定义为
int
i(函数(jisuan,chufa)),j(函数(dajuan)),k(函数(zhengjie)),m,n(函数(chongzuo)),key(主函数(main)).
临时交换数据变量:int
gh(函数(jisuan)).
统计分数:int
fs(全局变量).
四、程序调试与测试
100以内的四则运算出题
(程序调试过程中遇到的问题)
第一;重做程序调试中遇到的问题:
在重做程序的调试中遇到的问题不太多,主要是答错的题给三次重做机会的程序设计一开始不能正常运行,要不就是给予无限次的机会,要不就是只能重做一次。由于开始我不能找出错误所在,调试了多次也不能很好的运行,经过多次的调试,改正,再调试,再改正,到最后终于将错误的地方改正了,正确的程序应当是“for(n=0;n<3;n++)
{
printf(“你仍未做对!你还有%d次机会:
“,2-n);/*再次计算*/
printf(“%2d
%c
%2d
=?“,sy[m],fh[m],sr[m]);
scanf(“%d“,if(jd[m]==jg[m])
{
printf(“恭喜!你做对了!\n“);
break;}/*跳出循环*/
}”
这样就很好的解决了前面所遇到的问题。
第二;评价程序中遇到的问题:
我们做的这个自动出题程序中,当答题者做完题目后,程序会按成绩分段给出响应的评价。在做这部分程序的时候遇到的困难主要是score数据的获得,一开始不知道该用哪个函数对成绩进行评价,经过看书和小组内部的讨论才知道了应当用条件函数switch对成绩score进行分段并给出相应的评价结果score的数据从主函数获得:“int
fs;
printf(“请输入成绩(0,10,20.100):“);
scanf(“%d“,switch(fs)”
这才使得程序能够正常运行。
第三;菜单程序设计中遇到的问题:
本程序的主菜单选项分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项。在做这个程序的时候,一开始我用的是0—5代表以上各选项,但是在定义的时候却定义成了1—6,导致程序在运行的过程中5选项和0选项都无法运行,而这个错误在编译时又不能找出来,所以让我费了大量的时间才知道是自己不认真定义错了。而这个程序主要是使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数:“printf(“\n**********
数学四则运算测试软件*********\n\n\n“);
printf(“1.显示答卷
2.错题正解\n\n“);
printf(“3.系统评估
4.错题重做\n\n“);
printf(“5.再次练习
0.退出系统\n\n“);
printf(“\n********************************************“);
printf(“\n请输入选项(0-5):“);
/*提示输入选项*/
第四;计算程序的设计中的问题:
在这部分程序的设计中没什么大的问题,计算程序主要是用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数运算符也由随机数产生,rand()%4
得到0-3之间的随机数,约定0:减法,1:加法,2:乘法,3:除法。for循环控制题目数量,每次循环先产生题目并显示出来,将计算结果保存在jg中然后再等待做题的人从键盘输入计算结果保存在s中,将jg与s进
行比较判定正确性做完10道题后(循环结束),显示测试结果并进行评价。
第五;除法程序中遇到的问题:
除法运算程序的设计是本程序设计中最难解决也是出错最多的部分。主要除法运算的每一次运算不可能都是整数,这就使得程序的设计难度提高了许多,特别是在主函数的调用中
主程序中遇到的问题:
在主程序的调试过程中,遇到的问题较为突出。主要有两个方面。一是菜单选项的不运行。二是计算函数对除法函数的调用问题。
为了解决这两个问题,我们小组进行了多次的试验,但是都无法解决这两个问题。这使得我们有点失落。
主程序最后的解决是在询问了老师之后才解决的。我们在老师的帮助下发现并解决了这两个问题。菜单选项的问题是由于,对选项字符的合法性验证有问题。对函数调用的不成功则是对指针的不熟悉,从而造成了调用的不恰当,使数据的返回存在问题。
五、程序清单
#include
“stdio.h“#include
#include
#include
/*
字符操作函数*/
/*
定义全局变量*/
int
sy[10],sr[10],jd[10],jg[10];
/*
sy,fh,sr,jd,jg分别保存第一运算数,运算符,
第二运算数,输入结果,正确结果*/
int
fs=0;
/*
s接收键盘输入的结果,score保存成绩*/
char
fh[10];
/*
fh保存运算符号*/
/*作者:邓磊
编写日期:2005.6.13
最后修改日期:2005.6.13*/
void
chufa(ints1,ints2,ints3)
{
int
i,b=1,c,jg;
/*i为控制循环变量,jg,jd分别保存输入结果和正确答案*/
int
cs[20]={0},sy,sr;
/*cs为除数数组,sy保存被除数,sr为从cs中抽取的除数*/
srand(
(unsigned)time(
NULL
)
);
FA:
sy=rand()%100;
if(sy==0)
goto
FA;
for(i=1;i<=sy;i++)
/*产生除数数组的循环*/
{
if(sy%i==0)
{
cs[b]=i;
b++;}
else
continue;
}
/*循环结束*/
c=rand()%b;
/*随机抽取除数*/
if(c==0)
c=c+1;
sr=cs[c];
jg=sy/sr;s1=sy;
/*指针变量*/s2=sr;s3=jg;
}
/*
作者:周绍平
编写日期:2005.6.8
最后修改日期:2005.6.14*/
/*
自动生成10道运算题目,数值在0-99之间
每出1道题后等待操作者输入运算结果
判断输入的结果是否正确,正确则加10分
给出最终得分*/
/*
算法:用随机函数rand()产生0-32767之间的整数,与100取余数后得到0-99之间的整数
运算符也由随机数产生,rand()%4
得到0-3之间的随机数,约定0:减法,1:加法,
2:乘法,3:除法。for循环控制题目数量,每次循环先产生题目并显示出来,将计
算结果保存在jg中然后再等待做题的人从键盘输入计算结果保存在s中,将jg与s进
行比较判定正确性做完10道题后(循环结束),显示测试结果并进行评价*/
void
jisuan()
{
int
p;
/*
p为随机产生的运算符号,规定0为加法,1为减法,2为乘法,3为除法*/
int
i,gh;
/*
i为循环控制变量,gh用于临时交换数据*/
printf(“你将进行的是100以内数字的四则运算!\n“);
srand(
(unsigned)time(
NULL
)
);
/*
随即数种子由系统时间函数产生*/
/*
循环产生10道100之内的加减乘除法运算题目*/
for(i=0;i<10;i++)
{
sy[i]=rand()%100;
/*
随机产生第一个操作数(1-99)*/
sr[i]=rand()%100;
/*
随机产生第二个操作数(1-99)*/
p=rand()%4;
/*
随机产生运算符(0-3)*/
if(p==0)
/*
转换成运算符号,p为0表示做加法*/
{fh[i]=
+
;
jg[i]=sy[i]+sr[i];
}
/*
fh为‘+’,jg为sy[i]+sr[i]*/
else
if(p==1)
/*
p为1,表示做减法*/
{fh[i]=
-
;
if(sy[i] { gh=sy[i]; sy[i]=sr[i];sr[i]=gh; } /* 如果sy= 0 /*验证选项是否合法,若否则重输*/ return c; /*返回选择项*/ } /*作者:邓磊 编写日期:2005.6.12 最后修改日期:2005.6.12*/ /*对成绩结果进行评价,便于做题都了解自己的情况,进行有针对性的学习.按分数的不同层次进行评价*/ /*算法:用条件函数switch对成绩score进行分段并给出相应的评价,结果score的数据从主函数获得*/ void pingjia() { printf(“你的成绩是%d分.\n“,fs); /* 显示测试结果*/ switch(fs) /*显示评价*/ { case 100: printf(“真棒!不要骄傲哟!\n“); break; case 90: printf(“优秀!恭喜你取得了好成绩!\n“); break; case 80: case 70: printf(“良好!请继续努力,下次取得更好的成绩!\n“); break; case 60: printf(“及格!成绩不太理想哟!再接再励吧!\n“); break; case 50: case 40: case 30: case 20: case 10: printf(“多花点功夫吧,不然你会后悔的!!\n“); break; case 0: printf(“太差劲了!再不努力的话,你就完了!再做一次吧!!!!\n“); break; } printf(“\n\n“); } /*作者:刘云路 编写日期:2005.6.12 最后修改日期:2005.6.12*/ /*显示答卷*/ /*各数据从主函数中获取*/ void dajuan() { int j; printf(“你的答卷为:\n“); for(j=0;j<10;j++) printf(“%2d %c %2d = %2d\n“,sy[j],fh[j],sr[j],jd[j]); printf(“\n\n“); } /*作者:周绍平 编写日期:2005.6.12 最后修改日期:2005.6.12*/ /*对错题给出正确的答案*/ /*各数据从主函数中获取*/ void zhengjie() { int k; printf(“你答错的题的正确答案为:\n“); for(k=0;k<10;k++) { if(jd[k]==jg[k]) continue; else { printf(“%2d %c %2d = %2d\n“,sy[k],fh[k],sr[k],jg[k]); } } printf(“\n\n“); } /*作者:刘云路 编写日期:2005.6.12 最后修改日期:2005.6.12*/ /*将错题给出,让做题者再次对其进行计算*/ /*各数据从主函数中获取*/ void chongzuo() { int m,n; printf(“以下是你做错的题,请重做:\n“); for(m=0;m<10;m++) /*用循环对错题进行选择*/ if(jd[m]==jg[m]) continue; /*做对的题则跳过*/ else { printf(“%2d %c %2d =?“,sy[m],fh[m],sr[m]); scanf(“%d“,if(jd[m]==jg[m]) printf(“恭喜!你做对了!\n“);/*再次对输入的答案进行检验*/ else /*若仍未做对,则用此函数*/ { for(n=0;n<3;n++) { printf(“你仍未做对!你还有%d次机会: “,2-n);/*再次计算*/ printf(“%2d %c %2d =?“,sy[m],fh[m],sr[m]); scanf(“%d“,if(jd[m]==jg[m]) { printf(“恭喜!你做对了!\n“); break;}/*跳出循环*/ } } } /*循环结束*/ printf(“\n\n“); } /*作者:周绍平、刘云路、邓磊 编写日期:2005.6.13 最后修改日期:2005.5.14*/ /*主函数*/ void main() { int key=1; jisuan(); while(key) { switch(caidan()) { case 1 : { printf(“\n\n\n“); dajuan(); } break; case 2 : { printf(“\n\n\n“); zhengjie(); } break; case 3 : { printf(“\n\n\n“); pingjia(); } break; case 4 : { printf(“\n\n\n“); chongzuo(); } break; case 5 : { printf(“\n\n\n“); jisuan(); } break; case 0 : key=0; } } } 个人收获和体会: (1)组长: 周绍平 这次C语言的程序设计,对于我来说是一个挑战。我对C语言的学习并不是很好,尤其是在数组之后的内容,对它并不了解,使用也达不到要求,更不要说灵活的运用它们了。这在程序的设计中也有所体现。每一个函数都设计好了,也调试好了,把它们分开运行并没有错误,但是当把它们组合成一个程序时,便是一个一个地出现错误。把这个问题解决了,另一个新的问题又来了。这不能说是对知识的欠缺。 通过这次的程序设计,我懂得了无论什么事都要去做才会发现问题,才有可能去解决问题。对知识的学习,不能潜偿辄止,,要深入去学习,去了解,这样才会有所收获。有许多东西,许多事,不是想像中的那么容易,不去实践,永远也不会有提高,尤其是学习计算机。 我的另一个感受便是团队精神,如果没有我们这个小组成员的共同努力,我想这个程序也是没法完成的。共同合作、共同分享、共同研究这才是一个好的团队。 (2)组员: 邓磊 这次C语言的实践,我们做的是数字100以内的四则运算,在其中我们各自分工,最后结合成一个自动出题,错题重做,自动打分以及加减乘除四则运算的统一完整的程序。 我做的是“对成绩结果进行评价,便于做题都了解自己的情况,进行有针对性的学习.按分数的不同层次进行评价。” 在其中采用简单的C代码,并加入幽默风趣的语句来鼓励做题的人,例如:case 100: printf(“真棒!不要骄傲哟!\n“); case 0: printf(“太差劲了!再不努力的话,你就完了!再做一次吧!!!!\n“); 经过这次C语言程序设计的实践,让我学到了更多知识,也增强了自己的动手能力,同时也看到了C程序在社会上的广泛应用及优良的效果,已经成为一个我们应该懂得一点的技术。在这次实践中虽然我只做了其中一部分,但是体味到了其中的乐趣。 我会在以后的学习和生活中努力思考,善于发现和解决问题,开动脑筋,去发现更多新的东西。 刘云路 这次C语言的实践,我们做的是数字100以内的四则运算,在其中我们各自分工,最后结合成一个自动出题,错题重做,自动打分以及加减乘除四则运算的统一完整的程序。 我做的是“将错题给出,让做题者再次对其进行计算”这一部分 printf(“以下是你做错的题,请重做:\n“); for(m=0;m<10;m++) /*用循环对错题进行选择*/ if(jd[m]==jg[m]) continue; /*做对的题则跳过*/ 在其中用了简单的C语言代号,反映出了智能化的效果。 经过这次C语言程序设计的实践,让我学到了更多知识,也增强了自己的动手能力,同时也看到了C程序在社会上的广泛应用及优良的效果,已经成为一个我们应该懂得一点的技术。在这次实践中虽然我只做了其中一部分,但是体味到了其中的乐趣。 我会在以后的学习和生活中努力思考,善于发现和解决问题,开动脑筋,去发现更多新的东西。
