昆明理工大学
《计算机程序设计基础》课程
综合实践型教学课题报告
课题名称:100以内的整数四则运算测试程序设计
组长:      学号 040401067 姓名 周绍平
组员:      学号 040401070 姓名      
学号 040401106 姓名 刘云路
学号                姓名               
学号              姓名               
学号              姓名               
学号              姓名               
学院: 信自学院    专业班级:  自动化0421         
指导教师:  耿植林 
昆明理工大学计算中心
2005 618

昆明理工大学计算中心
计算机程序设计基础》课程综合实践型教学课题报告
课程名称:100以内的整数四则运算测试程序设计 
学院: 信自学院  专业班级:  自动化0421
学号
姓名
小组编号
所选题号
自评小组工作量
(1—6)
自评分数
分数
040401067
周绍平
15
5
85
95
040401070
邓  磊
15
5
85
86
040401106
刘云路
15
5
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'&&c<'6'));  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<=sy;i++)    { if(sy%i==0)  {  cs[b]=i;  b++;}  else  continue; }
c=rand()%b;    if(c==0)  c=c+1;             
  组长签名: 周绍平              2005年 06 15 
教师评语
    本小组同学能够相互协作,共同完成综合设计任务。程序功能设计达到了设计要求,报告内容完整。较好地完成了综合设计任务。
教师签名:    耿植林              2005 年 6月18日

正文内容:
一、问题描述
这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。另外,由于除法的特殊性——其除数不能为0。又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。所以有必要把除法单独拿出来作为一个函数处理。
问题分析
    这是一个任务很明确的程序设计用于100以内的整数的四则运算。这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。
这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。不论是数据的输入与输出,都要求其为整数。
鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。
对各成员的分工如下:
计算、正解和菜单(周绍平)
评价和除法(邓磊)
答卷和重做(刘云路)
主函数及各函数的连接则由小组成员共同完成。
三、程序设计思路功能模块说明
各函数流程图:
1、 除法(chufa                          2、计算(jisuan
   
                                                       
              i>=10
               
   
   
         
         
   
       
   
3、重做(chongzuo)    4、主函数(main)
       
   
   
       
           
    1
   
   
    2
   
    3
        4
   
    5
   
由于其它四个函数较为简单或者和某些函数相似,这里就不再重复说明。
在程序中用到的数据说明:
运算符:随机产生4个数字(0123),定义为int p(全局变量),再转换为运算符(+-*/),定义为char fh[10](全局变量) .
运算数:随机产生两个运算数,对100取余。定义为 int sy[10],sr[10](全局变量).
结果和答案:定义为 int jd[10],jg[10](全局变量).
循环控制变量:定义为 int i(函数(jisuan,chufa),j(函数(dajuan)k(函数printf函数(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",&jd[m]);                       
if(jd[m]==jg[m])  { printf("恭喜!你做对了!\n");  break;}/*跳出循环*/
                }    ” 
     
   
这样就很好的解决了前面所遇到的问题。
第二;评价程序中遇到的问题:
    我们做的这个自动出题程序中,当答题者做完题目后,程序会按成绩分段给出响应的评价。在做这部分程序的时候遇到的困难主要是score数据的获得,一开始不知道该用哪个函数对成绩进行评价,经过看书和小组内部的讨论才知道了应当用条件函数switch对成绩score
进行分段并给出相应的评价结果score的数据从主函数获得:“      int fs; 
    printf("请输入成绩(0,100):");
    scanf("%d",&fs);
    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道题后(循环结束),显示测试结果并进行评价。             
第五;除法程序中遇到的问题:
  除法运算程序的设计是本程序设计中最难解决也是出错最多的部分。主要除法运算的每一次运算不可能都是整数,这就使得程序的设计难度提高了许多,特别是在主函数的调用中
主程序中遇到的问题:
在主程序的调试过程中,遇到的问题较为突出。主要有两个方面。一是菜单选项的不运行。二是计算函数对除法函数的调用问题。
为了解决这两个问题,我们小组进行了多次的试验,但是都无法解决这两个问题。这使得我们有点失落。
主程序最后的解决是在询问了老师之后才解决的。我们在老师的帮助下发现并解决了这两个问题。菜单选项的问题是由于,对选项字符的合法性验证有问题。对函数调用的不成功则是对指针的不熟悉,从而造成了调用的不恰当,使数据的返回存在问题。