第三次作业-徐镇、尚清丽

 —— 题目:
           请编写一个能自动生成小学四则运算题目的 “软件”。
           让程序能接受用户输入答案,并判定对错。
           最后给出总共 对/错 的数量。

——需求分析:

            此“软件”主要面向小学生,考虑到小学生对计算机的使用和掌握程度有限,所以此“软件”的操作应尽量简单,易使用;

            用户能在此"软件"上练习简单的四则运算;

            此“软件”能提交用户的答案,并判断对错;

           在使用此 “软件”后及时给出正确与错误的题目数。

——基本功能要求:

          对于该题目,首先该设计一个程序能自动生成两个0-100之间的整数;

          其次,在键盘上要选择哪种运算,需要做一个判断选择代码;

          再次,用户在控制窗口输入自己的答案,该程序能够判断用户所输入的答案对错;

          最后,程序能给出最后所做题目的数量以及所做题目对与错的数量。

——扩展功能:

       1.用户答题结束以后,程序可以显示用户答题所用的时间;

       2.程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。


——设计:

         考虑到小学生的计算能力有限,本“软件”随机生成百以内的操作数;

         考虑学生的年级跨越较大,且各年级的学生掌握的知识水平有差异。本“软件”采用菜单的方式,可由用户选择所要练习的运算法则;

         考虑到小学生在小学阶段没有接受过负数知识,本“软件”确保在用户进行减法练习时,随机生成的两个操作数相减不会出现负数;

         另外,考虑到用户进行除法练习时对无法整除的运算结果输入不便,本“软件”确保在用户进行除法练习时,随机生成的两个操作数相除不会出现分数或小数;

         对年级较高的学生,本“软件”设计了四则混合运算,方便用户进行综合练习;

         最后,本“软件”在设计上使用C语言实现,在VC++6.0运行。

——代码实现:

       采用模块化设计思想,修改之前的code,将 “计算功能” 封装起来在C语言环境下,将函数声明与具体实现分别存放在头文件(.h)和源文件(.c)中;

       

       

函数声明declare.h  

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int calc(const char operation,int num1,int num2);
int test(int n);
void doExercise(int n);

主函数main.cpp:

#include "declare.h"

void main()
{
    int choice=0;
    do
    {
        printf("	1、加法练习	2、减法练习
");
        printf("	3、乘法练习	4、除法练习
");
        printf("	5、综合练习	0、退出系统
");
        printf("===================================================
");
        printf("请输入你的选择(0--5):");
        
        int choice;
        scanf("%d",&choice);
        
        while(choice<0 || choice>5)
        {
            printf("你的输入有误,请重新输入:");
            scanf("%d",&choice);
        }
        if(choice==0)
            break;                    //用户选择0,退出循环(退出系统)
        
        doExercise(choice);        //做什么练习,并启动评分
        
    }while(true);
    printf("尚清丽和徐镇制作
");
    printf("谢谢使用本软件,再见
");
}

计算函数calc.h

#include "declare.h"
int calc(const char operation,int num1,int num2)
{
    switch(operation)
    {
    case '+':
        return num1+num2;
        break;
        
    case '-':
        return num1-num2;
        break;
        
    case '*':
        return num1*num2;
        break;
        
    case '/':
        return num1/num2;
        break;
    }
}
int test(int n)
{
    int ranswer=0;            //正确答案
    int uanswer=0;            //用户输入的答案
    int t=0;            //临时变量
    char operation;            //运算类别
    int num1=0;            //操作数1
    int num2=0;            //操作数2
    
    srand(time(NULL));        //初始化随机数种子
    num1=rand()%100;        //取0—100之间的随机数
    num2=rand()%100;
    
    //进入程序功能,如果选择5就随机产生1-4所代表的每一种运算方式
    if(n==5)
    {
        n=rand()%4+1;
    }
    
    switch(n)
    {
    case 1:
        operation='+';
        break;
    case 2:
        operation='-';
        break;
    case 3:
        operation='*';
        break;
    case 4:
        operation='/';
        break;
    }
    
    if((operation=='-') && (num1<num2))//当减数大于被减数数时,交换
    {
        t=num1;
        num1=num2;
        num2=t;
    }
    
    if(operation=='/')
    {
        if(num2==0)
            num2=1;//当除数随机取0时,就将除数置为1
        num1=num1*num2;//为确保整除将被除数与除数的乘积赋值给被除数
    }
    
    //输出测试题本身、提示用户输入
    printf("%d%c%d= ",num1,operation,num2);
    scanf("%d",&uanswer);
    
    //程序计算正确结果
    ranswer=calc(operation,num1,num2);

    //评判,做对返回1,做错返回0
    if(uanswer==ranswer)
    {
        printf("回答正确!
");
        return 1;
    }
    else 
    {
        printf("回答错误!
");
        return 0;
    }
}
void doExercise(int n)
{
    clock_t start,end;
    double use=0;
    int score=0;        //练习得分,初始化为0
    int i=0;            //练习题数的计数器
    start=clock();//记录开始时间    
    for(i=1;i<=10;i++)
    {        
        end=clock();//记录结束时间
        if((double)(end-start)/CLK_TCK<120)
        {
            score=score+test(n);
        }
        else 
        {
            printf("时间已到,不能答题!
");
            break;
        }
    }
    if(i==11)
    {
        end=clock();//记录结束时间
        use=(double)(end-start)/CLK_TCK;
        printf("耗时%lf秒
",use);
    }
    printf("本次练习%d道题,你答对了%d道,答错了%d道
",i-1,score,i-1-score);
    printf("========================================================
");
}

测试代码test.h

#include "declare.h"
#include "assert.h"
void main()
{
    int result=0;
    result=calc('+',4,2);
    assert(result==6);

    result=calc('-',4,2);
    assert(result==2);

    result=calc('*',4,2);
    assert(result==8);

    result=calc('/',4,2);
    assert(result==2);
}

——运行效果:

 

——两人合作步骤:

     本次作业是在第二次作业的基础上进一步修改与完善的,徐镇和尚清丽同学组成了一组进行了相应的讨论与改进。

     1、需求分析,建立在第一次作业的基础上,没有做太多的改动;

     2、代码规范设计方面,我们认真阅读教材Page57:4.2-4.3节中内容,进行了风格讨论,了解之后修改了一下我们的原程序,使之符合 “代码风格和设计规范”的基本要求,并          采用模块化的思想,我们将函数封装起来,将函数声明存放在头文件(.h),具体实现存放在源文件(.cpp)中;

     3、我们认真阅读教材Page21:2.1.1节内容,并进行了相关测试;编写test.c文件对加减乘除进行相关测试;

     4、对该软件的功能进行了扩展,每一次测试结束会给出本次测试的时间,或者在120秒时间内未完成给出的题目,则会显示时间已到,不能答题!;

     5、我们进行的每一步,两个人分工合作,你做我看,互相监督并指出相应的问题等等,同时也进行了PSP项目耗时记录。

 ——PSP:

——总结:

     本次作业对于我们来说还是有一定的难度,我们也努力认真的去对待,认真阅读了书籍,了解到代码规范和两人合作的相关内容,体会到了软件工程这门课的魅力。当然,我们的作业依然存在很多不足,我们深知我们的编程能力和设计能力都还远远不够,相信以后在老师的指导下能够进一步的去提高自己。同时,也希望老师针对我们的作业给出宝贵的意见,我们会针对老师提出的问题再去进一步的讨论!!!谢谢!!

                                             

                                                                                                                                                                          作者: 徐镇、尚清丽

                                                                                                                                                                          时间:2015年4月19日

  

【永不言弃】
原文地址:https://www.cnblogs.com/xuzhen1992/p/4439592.html