软件工程——结对作业(2)

一、项目选题

   本次作业要求两个人合作完成,驾驶员和导航员角色自定。在小学四则运算自动生成程序和电梯调度问题中,我们选择了四则运算题目。

二、题目要求

①能够自动生成四则运算练习题
②可以定制题目数量
③用户可以选择运算符
④用户设置最大数(如十以内、百以内等)
⑤用户选择是否有括号、是否有小数
⑥用户选择输出方式(如输出到文件、打印机等)
⑦最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

三、角色选定

  • 驾驶员:王成成
    • 任务
      (1)能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中。
      (2)能够对导航员在本次编程工作中起到的作用给出客观评价。
  • 领航员:耿蝶芮
    • 任务
      (1)能够辅助驾驶员完成全部代码工作,并且为关键函数选用合适的覆盖标准设计测试用例,并编写代码进行单元自动测试。
      (2)能够根据上次作业的代码检查表对驾驶员的本次工作进行评价。

四、代码上传

  • 博客地址:

五、程序设计
  四则运算问题,关键是能够自动生成算数表达式。在这部分中,我们整体代码采用C语言和结构体进行设计。而针对页面显示结构,我们则采用了html以及js进行设计。我们给出表达式的组数、表达式中涉及到的数据的大小范围以及数据类型。除此之外,还要考虑到生成的表达式是否含有括号、具体包含哪些运算符等。因此,我们在代码中进行了详细分析设计,并且进行了重构,从而使得代码整洁、可修改性强。
1、结构体设计

struct data
{
    int num[10001];
    float num1[10001];
}p[10001];

2、主函数
  在主函数中,我们主要针对一些必要要求进行了判断,并依据此在其各个子函数中进行处理。对于运算符的选择,我们依据学生的要求进行设计,通过设定字符串数组来完成运算符的选择。

int main()
{
    int NUM,Num,Max;
    int parentheses,print_yes_no,decimal;
    char op_operator[5];
    printf("----------------------------------------------------------\n");
    printf("请输入共有多少组运算表达式:");
    cin>>NUM;
    printf("----------------------------------------------------------\n");
    printf("请输入运算数的最大值,以保证所有计算数据都在该数字以内: ");
    cin>>Max;
    printf("----------------------------------------------------------\n");
    printf("请输入有无括号(1代表有括号、0代表无括号): ");
    cin>>parentheses;
    printf("----------------------------------------------------------\n");
    printf("请输入是否将结果存到文件中(1代表存放、0代表不存放): ");
    cin>>print_yes_no;
    printf("----------------------------------------------------------\n");
    printf("请选择输入是小数还是整数(1代表整数、0代表小数):");
    cin>>decimal;
    printf("----------------------------------------------------------\n");
    printf("请选择输入的运算符:");
    cin>>op_operator;
    printf("----------------------------------------------------------\n");
    Num=-1;
    while(1)
    {
        if(Num<2||Num>8)
            Num=int(rand()%10);//定义每个表达式有多少个参与运算的实数
        else
            break;
    }
    if(parentheses==1)
        Have_parentheses(NUM,Max,Num,print_yes_no,op_operator,decimal);
    else if(parentheses==0)
        No_parentheses(NUM,Max,Num,print_yes_no,op_operator,decimal);
    system("pause");
    return 0;
}

3、括号处理
  对于表达式中是否含有括号的问题,我们分为两部分:有括号和无括号。在程序中,我们利用了随机数生成函数进行处理。
(1)无括号形式的表达式

void No_parentheses(int NUM,int Max,int Num,int print_yes_no,char op_operator[],int decimal)//无括号的运算形式
{
    int i,j,len;
    int op;
    len=strlen(op_operator);
    FILE *fp;
    fp=fopen("a.txt","w");
    for(i=0;i<NUM;i++)
    {
        for(j=0;j<Num;j++)
        {
            op=int(rand()%len);
            if(decimal==1)
                calculate_int(&p[i].num[j],&p[i].num[j+1],&op_operator[op],NUM,Max);
            if(decimal==0)
                calculate_decimal(&p[i].num1[j],&p[i].num1[j+1],&op_operator[op],NUM,Max);
            if(j<Num-1)
            {
                if(decimal==1)
                {
                    cout<<p[i].num[j]<<" "<<op_operator[op]<<" ";
                    if(print_yes_no==1)
                    {
                        if(fp==NULL)
                            printf("打开文件a.txt失败\n");
                        fprintf(fp,"%d",p[i].num[j]);
                        fprintf(fp,"%c",' ');
                        fprintf(fp,"%c",op_operator[op]);
                        fprintf(fp,"%c",' ');
                    }
                }
                else
                {
                    printf("%.1f",p[i].num1[j]);
                    cout<<" "<<op_operator[op]<<" ";
                    if(print_yes_no==1)
                    {
                        if(fp==NULL)
                            printf("打开文件a.txt失败\n");
                        fprintf(fp,"%.1f",p[i].num1[j]);
                        fprintf(fp,"%c",' ');
                        fprintf(fp,"%c",op_operator[op]);
                        fprintf(fp,"%c",' ');
                    }
                }
            }
            if(j==Num-1)
            {
                if(decimal==1)
                {
                    cout<<p[i].num[j]<<" ";
                    if(print_yes_no==1)
                    {
                        if(fp==NULL)
                            printf("打开文件a.txt失败\n");
                        fprintf(fp,"%d",p[i].num[j]);
                        fprintf(fp,"%c",' ');
                    }
                }
                else
                {
                    printf("%.1f ",p[i].num1[j]);
                    if(print_yes_no==1)
                    {
                        if(fp==NULL)
                            printf("打开文件a.txt失败\n");
                        fprintf(fp,"%.1f",p[i].num1[j]);
                        fprintf(fp,"%c",' ');
                    }
                }
            }
        }
        cout<<"= "<<"\n";
        if(print_yes_no==1)
        {
           if(fp==NULL)
               printf("打开文件a.txt失败\n");
           fprintf(fp,"%c",'=');
           fprintf(fp,"%c",'\n');
        }
    }
    fclose(fp);
}

(2)有括号形式的表达式

void Have_parentheses(int NUM,int Max,int Num,int print_yes_no,char op_operator[],int decimal)//带括号的运算
{
    int flag1=0,flag2=0;
    int k1,k2;
    int op;
    int i,j,len;
    len=strlen(op_operator);
    FILE *fp;
    fp=fopen("a.txt","w");
    for(i=0;i<NUM;i++)
    {
        k1=-1;
        k2=-1;
        while(1)
        {
            if(k1>k2||k2-k1<2||k2>Num)
            {
                k1=int(rand()%3);
                k2=int(rand()%4);
            }
            else
                break;
        }
        for(j=0;j<Num;j++)
        {
            op=int(rand()%len);
            if(decimal==1)
                calculate_int(&p[i].num[j],&p[i].num[j+1],&op_operator[op],NUM,Max);
            if(decimal==0)
                calculate_decimal(&p[i].num1[j],&p[i].num1[j+1],&op_operator[op],NUM,Max);
            if(j<Num-1)
            {
                if(j==k1)
                {
                    if(decimal==1)
                    {
                        cout<<"("<<p[i].num[j]<<" "<<op_operator[op]<<" ";
                        flag1=1;
                        if(print_yes_no==1)
                        {
                           if(fp==NULL)
                               printf("打开文件a.txt失败\n");
                           fprintf(fp,"%c",'(');
                           fprintf(fp,"%d",p[i].num[j]);
                           fprintf(fp,"%c",' ');
                           fprintf(fp,"%c",op_operator[op]);
                           fprintf(fp,"%c",' ');
                        }
                    }
                    else
                    {
                        cout<<"(";
                        printf("%.1f",p[i].num1[j]);
                        cout<<" "<<op_operator[op]<<" ";
                        flag1=1;
                        if(print_yes_no==1)
                        {
                           if(fp==NULL)
                               printf("打开文件a.txt失败\n");
                           fprintf(fp,"%c",'(');
                           fprintf(fp,"%.1f",p[i].num1[j]);
                           fprintf(fp,"%c",' ');
                           fprintf(fp,"%c",op_operator[op]);
                           fprintf(fp,"%c",' ');
                        }
                    }
                }
                else if(j==k2)
                {
                    if(decimal==1)
                    {
                        cout<<p[i].num[j]<<")"<<" "<<op_operator[op]<<" ";
                        flag1=1;
                        if(print_yes_no==1)
                        {
                           if(fp==NULL)
                               printf("打开文件a.txt失败\n");
                           fprintf(fp,"%d",p[i].num[j]);
                           fprintf(fp,"%c",')');
                           fprintf(fp,"%c",' ');
                           fprintf(fp,"%c",op_operator[op]);
                           fprintf(fp,"%c",' ');
                        }
                    }
                    else
                    {
                        printf("%.1f",p[i].num1[j]);
                        cout<<")"<<" "<<op_operator[op]<<" ";
                        flag1=1;
                        if(print_yes_no==1)
                        {
                           if(fp==NULL)
                               printf("打开文件a.txt失败\n");
                           fprintf(fp,"%.1f",p[i].num1[j]);
                           fprintf(fp,"%c",')');
                           fprintf(fp,"%c",' ');
                           fprintf(fp,"%c",op_operator[op]);
                           fprintf(fp,"%c",' ');
                        }
                    }
                }
                else
                {
                    if(decimal==1)
                    {
                        cout<<p[i].num[j]<<" "<<op_operator[op]<<" ";
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                 printf("打开文件a.txt失败\n");
                            fprintf(fp,"%d",p[i].num[j]);
                            fprintf(fp,"%c",' ');
                            fprintf(fp,"%c",op_operator[op]);
                            fprintf(fp,"%c",' ');
                        }
                    }
                    else
                    {
                        printf("%.1f",p[i].num1[j]);
                        cout<<" "<<op_operator[op]<<" ";
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                 printf("打开文件a.txt失败\n");
                            fprintf(fp,"%.1f",p[i].num1[j]);
                            fprintf(fp,"%c",' ');
                            fprintf(fp,"%c",op_operator[op]);
                            fprintf(fp,"%c",' ');
                        }
                    }
                }
            }
            else
            {
                if(flag1==1&&flag2==0)
                {
                    if(decimal==1)
                    {
                        cout<<p[i].num[j]<<")"<<" ";
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                printf("打开文件a.txt失败\n");
                            fprintf(fp,"%d",p[i].num[j]);
                            fprintf(fp,"%c",')');
                            fprintf(fp,"%c",' ');
                        }
                    }
                    else
                    {
                        printf("%.1f",p[i].num1[j]);
                        cout<<")"<<" ";
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                printf("打开文件a.txt失败\n");
                            fprintf(fp,"%.1f",p[i].num1[j]);
                            fprintf(fp,"%c",')');
                            fprintf(fp,"%c",' ');
                        }
                    }
                }
                else
                {
                    if(decimal==1)
                    {
                        cout<<p[i].num[j]<<" ";
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                printf("打开文件a.txt失败\n");
                            fprintf(fp,"%d",p[i].num[j]);
                            fprintf(fp,"%c",' ');
                        }
                    }
                    else
                    {
                        printf("%.1f ",p[i].num1[j]);
                        if(print_yes_no==1)
                        {
                            if(fp==NULL)
                                printf("打开文件a.txt失败\n");
                            fprintf(fp,"%.1f",p[i].num1[j]);
                            fprintf(fp,"%c",' ');
                        }
                    }
                }
            }
        }
       cout<<"= "<<"\n";
       if(print_yes_no==1)
       {
           if(fp==NULL)
               printf("打开文件a.txt失败\n");
           fprintf(fp,"%c",'=');
           fprintf(fp,"%c",'\n');
       }
    }
    fclose(fp);
}

六、界面设计
  对于界面的设计,我们采用了html以及js等技术,大体上实现了四则运算的显示界面。
七、总结
  本次结对作业,由于种种原因,我们假期结束后才开始进行设计、编码等工作,时间较紧。

猜你喜欢

转载自www.cnblogs.com/wangchengcheng/p/10822049.html