当前位置:文档之家› C语言四则运算测试程序设计报告

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

昆明理工大学《计算机程序设计基础》课程综合实践型教学课题报告课题名称:100以内的整数四则运算测试程序设计组长:学号 040401067 姓名周绍平组员:学号 040401070 姓名邓磊学号 040401106 姓名刘云路学号姓名学号姓名学号姓名学号姓名学院:信自学院专业班级:自动化0421 指导教师:耿植林昆明理工大学计算中心2005 年 6月18日昆明理工大学计算中心《计算机程序设计基础》课程综合实践型教学课题报告课程名称:100以内的整数四则运算测试程序设计正文内容:一、问题描述这是一个进行数学计算的程序,且要求拥有多种功能,包括(1)选项菜单集成各功能函数模块(2)出题(每次出10道题目)(3)答题并评分(4)答错的题给出正确答案(5)显示答卷。

总体看来,大多数功能要求调用错题,所以面临的两个难题便是出题和保存答题者做错的题以便其它函数调用。

另外,由于除法的特殊性——其除数不能为0。

又因为这是一个用于100以内整数的四则运算的程序,又对除法这个特殊成员提出了新的要求——要使得到的结果为整数。

所以有必要把除法单独拿出来作为一个函数处理。

二、问题分析这是一个任务很明确的程序设计—用于100以内的整数的四则运算。

这个程序要求拥有选项菜单、出题、答题评分、显示答卷、错题再解、重复练习的功能。

既然是一个用于计算的程序那它的主要作用就是给练习者答题,并验证答题的正确与否。

当然,还要有一些附加功能,比如:把答卷显示出来,错题给出正解,错题再抽出来再做。

这个程序只要求100以内的四则运算,所以随机出现的数字只能是100以内的,并且要求其为整数。

不论是数据的输入与输出,都要求其为整数。

鉴于这个程序所要求达到的功能,我们小组决定把它分为计算、菜单、答卷、重做、正解、评价、除法七个函数模块。

对各成员的分工如下:计算、正解和菜单(周绍平)评价和除法(邓磊)答卷和重做(刘云路)主函数及各函数的连接则由小组成员共同完成。

三、程序设计思路功能模块说明各函数流程图:1、除法(chufa)2、计算(jisuan)3、重做(chongzuo)4、主函数(main)由于其它四个函数较为简单或者和某些函数相似,这里就不再重复说明。

在程序中用到的数据说明:运算符:随机产生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",&jd[m]);if(jd[m]==jg[m]) { printf("恭喜!你做对了!\n"); break;}/*跳出循环*/} ”这样就很好的解决了前面所遇到的问题。

第二;评价程序中遇到的问题:我们做的这个自动出题程序中,当答题者做完题目后,程序会按成绩分段给出响应的评价。

在做这部分程序的时候遇到的困难主要是score数据的获得,一开始不知道该用哪个函数对成绩进行评价,经过看书和小组内部的讨论才知道了应当用条件函数switch对成绩score进行分段并给出相应的评价结果score的数据从主函数获得:“int fs;printf("请输入成绩(0,10,20...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道题后(循环结束),显示测试结果并进行评价。

第五;除法程序中遇到的问题:除法运算程序的设计是本程序设计中最难解决也是出错最多的部分。

主要除法运算的每一次运算不可能都是整数,这就使得程序的设计难度提高了许多,特别是在主函数的调用中主程序中遇到的问题:在主程序的调试过程中,遇到的问题较为突出。

主要有两个方面。

一是菜单选项的不运行。

二是计算函数对除法函数的调用问题。

为了解决这两个问题,我们小组进行了多次的试验,但是都无法解决这两个问题。

这使得我们有点失落。

主程序最后的解决是在询问了老师之后才解决的。

我们在老师的帮助下发现并解决了这两个问题。

菜单选项的问题是由于,对选项字符的合法性验证有问题。

对函数调用的不成功则是对指针的不熟悉,从而造成了调用的不恰当,使数据的返回存在问题。

五、程序清单#include "stdio.h"#include <stdlib.h>#include <time.h>#include <ctype.h> /* 字符操作函数*//* 定义全局变量*/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(int *s1,int *s2,int *s3){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]<sr[i]) { gh=sy[i]; sy[i]=sr[i];sr[i]=gh; } /* 如果sy<sr则交换sy,sr,以保证结果为正数*/jg[i]=sy[i]-sr[i]; /* fh为‘-’,jg为sy-sr*/ }else if(p==2) /* p为2表示做乘法*/{ fh[i]='*'; jg[i]=sy[i]*sr[i]; } /* fh为‘*’,jg为sy*sr*/else if(p==3){fh[i]='/'; /* p为3表示做除法*/chufa(&sy[i],&sr[i],&jg[i]);}printf("第%2d题: %2d %c %2d = ? ",i+1,sy[i],fh[i],sr[i]); /* 显示题目*/scanf("%d",&jd[i]); /* 等待键盘输入计算结果*/if(jd[i]==jg[i]) fs+=10; /* 如果输入的结果与计算机运算结果相符则加10分*/} /* 循环结束*/printf("\n测试结束!\n\n");}/* 作者:周绍平编写日期:2005.6.12最后修改日期:2005.6.12*//* 主菜单选项,分为显示答卷、错题的正确解、再进行一次练习、系统对成绩的评价、退出系统等选项*//* 算法:使用printf()函数显示菜单项,用sacnf()函数接收选项字符while条件限定选项的合法性,非法字符则重新输入并返回主函数*/char caidan(){char c='0'; /*定义变量*/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):"); /*提示输入选项*/do{ scanf("%c",&c); } /*输入选项*/while(!(c>='0'&&c<'6')); /*验证选项是否合法,若否则重输*/ 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",&jd[m]);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",&jd[m]);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语言的程序设计,对于我来说是一个挑战。

相关主题