结对同学:姜珊

 

目录:

1.需求分析

2.基本设计

3.代码说明

4.测试运行

5.重难点知识

6.缺点改进及体会

 

1.需求分析:

       作业链接:https://edu.cnblogs.com/campus/nenu/SWE2017FALL/homework/997

软件工程第四次作业-3四则运算

 

软件工程第四次作业-3四则运算

  功能一和功能二其实可以合并成为一个功能,就是计算带括号的四则运算式,并对结果进行判断和输出。

软件工程第四次作业-3四则运算

 

  功能三是利用输入参数来进行出题并输出。

 

2.基本设计

       由需求分析可以得到,可以根据参数个数来执行某一程序段。

       对于功能一二,只有一个参数就是文件名,直接输入f4并回车即可运行。

       对于功能三,要输入三个参数如:f4 –c 2,其中-c后边的数字要当作程序体中的循环次数,完成输出个数的限定。

 

3.代码说明

       地址:https://git.coding.net/immixiaomi/f4-mhjs.git

       首先定义了字符类型的栈及相关操作,在将中序表达式转化为后序表达式时要用到:

typedef int Status;
typedef char ElemType;
typedef struct 
{
    ElemType data[MAXSIZE];
    int top;//栈顶指针
}Stack;

Status InitStack(Stack *S)//初始化
{
    int i;
    for(i = 0; i < MAXSIZE; i++)
    S->data[i] = NULL;
    S->top = -1;
    return 1;
}

Status CreateStack(Stack *S,int n)//创建一个长度为n的堆栈
{
    if(n>MAXSIZE || n<1)
    {
        printf("输入长度有误!\n");
        return -1;
    }
    srand(time(0));
    int i;
    for(i = 0; i < n; i++)
    {
        S->data[i] = rand()%100+1;
    }
    S->top = n-1;
    return 1;
}

Status push(Stack *S,ElemType e)//压栈操作
{
    if(MAXSIZE-1 == S->top)
    {
        printf("栈已满\n");
        return -1;
    }
    ++(S->top);
    S->data[S->top] = e;
    return 1;
}

Status pop(Stack *S,ElemType *e)//出栈
{
    if(-1 == S->top){
        printf("栈为空!\n");
        return -1;
    }
    *e = S->data[S->top];
    --(S->top);
    return 1;
}

  GetStr()函数是自动生成字符串的函数,参数是空字符数组,通过随机数的产生,并将随机数用itoa()函数转化成字符型,加入随机的运算符产生了中序表达式。先产生了表达式再向其中加入括号,括号都是成对加入,完成了带括号表达式的构建。

void GetStr(char *str)//构建随机串,并添加括号 
{
    char str1[1] = "";
    int a, b, c, d;
    char op1, op2, op3;
    int i;
    srand((int)time(0));
    a = (int)(rand()%10);//四个变量 
    b = (int)(rand()%10);
    c = (int)(rand()%10);
    d = (int)(rand()%10); 
    i = (int)(rand()%4);//三个操作符 
    switch(i)
    {
        case 0:
            op1 = '+'; break;
        case 1:
            op1 = '-'; break;
        case 2:
            op1 = '*'; break;
        case 3:
            op1 = '/'; break;
    }
    i=(int)(rand()%4);
    switch(i)
    {
        case 0:
            op2 = '+'; break;
        case 1:
            op2 = '-'; break;
        case 2:
            op2 = '*'; break;
        case 3:
            op2 = '/'; break;
    }
    i=(int)(rand()%4);
    switch(i)
    {
        case 0:
            op3 = '+'; break;
        case 1:
            op3 = '-'; break;
        case 2:
            op3 = '*'; break;
        case 3:
            op3 = '/'; break;
    }
    itoa(a, str1, 10);
    strcpy(str, str1);
    str[1] = op1;
    itoa(b, str1, 10);
    strcat(str, str1);
    str[3] = op2;
    itoa(c, str1, 10);
    strcat(str, str1);
    str[5] = op3;
    itoa(d, str1, 10);
    strcat(str, str1);
    for(int j = 0; j < 7; j++)
    {
        if(str[j] == '/')
        {
            int e;
            e = (int)(rand()%9)+1;
            itoa(a, str1, 10);
            str[j+1] = str1[0];
        }
    }
    int j, k;//左括号右括号 
    int flag = 0;
    j = (int)(rand()%3);
    int length = 8;
    if(j == 0)//位置1加不加左括号的判定 
    {
        k = (int)(rand()%4);
        if(k != 3&&flag != 2)
        {
            for(int i = length;i > 0;i--)//向坐标0处插入括号 
            {
                str[i] = str[i-1];
            }
            str[0] = '(';
            flag++;
            length++;
            int l = (int)(rand()%4);
            if(l < 2)
            {
                for(int i = length; i > 4; i--)
                {
                    str[i] = str[i-1];
                }
                str[4] = ')';
                flag--;
                length++;
                for(int i = length;i > 6;i--)
                {
                    str[i] = str[i-1];
                }
                str[6] = '(';
                flag++;
                length++;
                for(int i = length;i > 10;i--) 
                {
                    str[i] = str[i-1];
                }
                str[10] = ')';
                flag--;
                length++;
            }
            else if(l = 2)
            {
                for(int i = length; i > 4; i--) 
                {
                    str[i] = str[i-1];
                }
                str[4] = ')';
                flag--;
                length++;
            }
            else if(l = 3)
            {
                for(int i = length; i > 6; i--)//插入括号 
                {
                    str[i] = str[i-1];
                }
                str[6] = ')';
                flag--;
                length++;
            }

        }
        else if(k != 2&&flag != 2)
        {
            for(int i = length+1; i > 1; i--)//向坐标0,1处插入俩左括号 
            {
                str[i] = str[i-2];
            }
            str[0] = '(';
            str[1] = '(';
            flag = flag+2;
            length = length+2;
            
            for(int i = length; i > 5; i--)
            {
                str[i] = str[i-1];
            }
            str[5] = ')';
            flag--;
            length++;
            
            for(int i = length; i > 8; i--)
            {
                str[i] = str[i-1];
            }
            str[8] = ')';
            flag--;
            length++;
        }
    }
    
    else if(j == 1)
    {
        k=(int)(rand()%4);
        if(k != 3&&flag != 2)
        if(0)
        {
            for(int i = length; i > 2; i--)//向坐标2处插入括号 
            {
                str[i] = str[i-1];
            }
            str[2] = '(';
            flag++;
            length++;
        }
        else if(k != 2&&flag != 2)
        {
            for(int i = length+1; i > 3; i--)//向坐标2,3处插入俩左括号 ,只能接着向6和8(原坐标)添加括号 
            {
                str[i] = str[i-2];
            }
            str[2] = '(';
            str[3] = '(';
            flag = flag+2;
            length = length+2;
            
            for(int i = length; i > 7; i--)
            {
                str[i] = str[i-1];
            }
            str[7] = ')';
            flag--;
            length++;
            for(int i = length;i > 10;i--)
            {
                str[i] = str[i-1];
            }
            str[10] = ')';
            flag--;
            length++;
        }
    }
    else if(j == 2)
    {
        k = (int)(rand()%4);
        if(k != 3&&flag != 2)
        {
            for(int i = length; i>4; i--)//向坐标4处插入括号 
            {
                str[i] = str[i-1];
            }
            str[4] = '(';
            flag++;
            length++;
            //str4 插入左括号一个
            for(int i = length; i>8; i--)
            {
                str[i] = str[i-1];
            }
            str[8] = ')';
            flag--;
            length++;
        }
    }
    
    for(i = 0; i < length-1; i++)
    {
        printf("%c",str[i]);
    }
    printf("="); 
}
View Code

相关文章: