个人作业1--基于控制台的小学四则运算程序

题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

1.除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
2.运算符为 +, −, ×, ÷
3.并且要求能处理用户的输入,并判断对错,打分统计正确率。
4.要求能处理用户输入的真分数, 如 1/2, 5/12 等
5.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
Myapp.exe -n 10

需求分析:
1.对于真分数的四则运算,真分数的分子不能大于分母的数,且分母不能为0,并且要考虑随机产生的分子分母消去公约数的问题,还要考虑计算结果的化简和判断问题。
2.此程序自动生成的是小学生运算题目,因此不能出现负数运算。(实现中没有考虑到真分数与整数的混合运算)
3.让程序能够接受用户输入的答案,并判定对错,最后给出总共对的数量对其进行打分并给出正确率。
4.能够随机生成整数与真分数四则运算,能用参数控制生成题目个数。

设计实现:
1.提示用户生成的运算题数目,用户输入题目数后开始答题。
2.题目依次随机产生,第一道题目产生后,用户答完题,判断对错,错则给出正确答案,再继续产生下一道题。
3.答完所有题目后给出成绩及正确率。

代码说明
1.采用最大公因数来对分数题目以及答案进行化简,得出最简的答案。

int k=0;
int gcd(int x, int y)
{
    int z;
    if ((z = x % y) != 0)
    {
        gcd(y, z);
    }
    else
        return y;
}

2.真分数产生随机数。

void fraction()
{
	int i,j,x,y,z,temp,a,b,c,z1,z2;
		srand(unsigned(time(NULL)));
		char r1[10], r2[10];
    memset(r1, 0, sizeof(r1));
    memset(r2, 0, sizeof(r2));
         i=rand()%10;//rand()返回一个随机数
         j=rand()%10;
        while(j==0||i>=j)
        {
            i=rand()%10;
            j=rand()%10;
        }
        x=rand()%10;
        y=rand()%10;
        while(y==0||x>=y)
        {
            x=rand()%10;
            y=rand()%10;
        }
         z=rand()%100/25;
		z1=0;z2=0;
        switch(z)

3.真分数除法运算。

case 3:
        cout<<"("<<x<<"/"<<y<<")"<<"/"<<"("<<i<<"/"<<j<<")"<<"=";
        a = x*j;
        b = y*i;
        c = gcd(a, b);
        a = a / c;
        b = b / c;
        if (b != 1) {
            sprintf(r1, "%d/%d", a, b);
            cin >> r2;
            if (strcmp(r1, r2) == 0)
        {
            cout << "    " << "True" << endl;
            k = k + 1;
        }
        else cout << "    " << "False" << "    "  <<"正确答案是:"<<r1<<endl;
		}
        else {
            cin >> z1;
            if (z1 == a)
            {
                cout << "    " << "True" << endl;
                k = k + 1;
            }
            else cout << "    " << "False" << "    "  << "正确答案是:"<<a<<endl;
        }
        break;
    default:
        cout << "wrong" << endl;
        break;
    }

4.主函数,能用参数控制生成题目个数。

 int main(int argc,char *argv[])
{	
	int n,i;
    float m;
   	n=atoi(argv[2]);
    cout<<"生成运算题数目:"<<n<<endl;	
    for(i=0;i<n;i++)
    {
        int c=rand()%2;
        switch(c)
        {
        case 0: integer();break;
        case 1: fraction();break;

        }
    }
  m=(float)k/(float)n;
    cout<<"您答对的题数是:"<<k<<"    "<<"正确率是:" <<m<<endl; 
    return 0;
} 

运行结果:

实验总结:由于个人编码能力有限,这次作业做下来感觉非常吃力,花费了很多时间。虽然本次作业有参考同学的代码,但是通过自己理一遍思路,把各种情况列出来,一步步把各类情况的代码敲出来,并一步步改错,最后运行出了结果。在编码过程中遇到了很多的问题,如开始每次调用时,随机数发生器返回的随机数序列都是一样的,通过查阅资料,用当前时间(time(NULL))返回值作为种子对随机数发生器进行初始化,由于每次当前时间不一样,所以随机数发生器产生的随机数序列不一样,即rand()函数调用的返回值不一样,就达到了得真随机数而不是伪随机数的目的。很遗憾最后没能实现真分数与整数的混合运算。学习c++编程是一个漫长的过程,我会慢慢积累,多做练习,多敲代码!

码市地址:https://git.coding.net/zlj201421123101/zenglijun-The-first-assignment.git

PSP2.1 Personal Software Process Stages Time (%) Senior Student(/hour) Time (%)(/hour)
· Planning 计划 40 40
· Estimate 估计这个任务需要多少时间 31 39
· Analysis 需求分析 (包括学习新技术) 2 1.5
· Coding Standard 代码规范 1 0.5
· Design 具体设计 2 1.5
· Coding 具体编码 16 24
· Test 测试(自我测试,修改代码,提交修改) 8 9
Reporting 报告 2 2.5

posted on 2017-03-06 22:35  曾丽君  阅读(169)  评论(1编辑  收藏  举报