自动出题软件--小结及初识界面设计

总结及界面设计

git连接:
Operation3.1.1
此次修改内容:改变了语言的读取方式,把代码从dev移植到vs中。git

关于栈的算法

       表达式的话我也没用到栈的知识,由于只是用到随机数随机符号,而后排列好了,也就没有检验的必要了。
       核心是在计算的时候。中缀表达式转后缀表达式,而后进行计算的道理都懂的,我就讲讲具体实现。假设自述表达式中的符号以字符形式由键盘输入,并存放在字符型数组str中,其后缀表达式存放在字符型数组exp中,在将自述表达式转换成后缀表达式的过程当中用一个字符型数组stack做为栈。设字符“#”为表达式的终止符。下面给出将自述表达式转换成后缀表达式的方法。
       依次从键盘输入表达式中的字符ch,对于每个ch作以下操做:github

  1. 若ch为数字,将后续的全部数字依次存入数组exp中,并以字符“#”标示数字结束。
  2. 若ch为左括号“(”,则将此括号插入栈stack。
  3. 若ch为右括号“)”,则将栈stack中左括号“(”之前的字符依次删除并存入数组exp中,而后将左括号“(”删除。
  4. 若ch为“+”或“-”,则将当前栈stack中的栈顶端连续的“*”或“/”删除并依次存入数组exp中,而后将ch插入栈stack中。
  5. 若ch为“*”或“”,则将当前栈stack中的栈顶端连续的“*”或“/”删除并依次存入数组exp中,而后将ch插入栈stack中。
  6. 若ch为“#”,则将栈stack中的全部运算符依次删除并存入数组exp中,而后再将ch存入数组exp中。最后可在数组exp中获得表达式的后缀表示。

       对于表达式“(56-20)/(4+2)#”,其转换成后缀表达式的过程,就以下:算法

Stack exp 说明
Ch为“(”,将此括号插入栈stack
56# Ch为数字,将56存入数组exp中,并插入一个字符“#”
(- 56# Ch为“-”,因为stack中“(”之前没有字符,故直接将ch插入栈stack中
(- 56#20# Ch为数字,将20#存入数组exp中
56#20#- Ch为“)”,将栈stack中“(”之前的字符依次删除并存入数组exp中,而后将“(”删除
56#20#- Ch为“/”,将ch插入栈stack中
/( 56#20#- Ch为“(”,将此括号插入栈stack中
/( 56#20#-4# Ch为数字,将4#存入数组exp中
/(+ 56#20#-4# Ch为“+”,因为stack中“(”之前没有字符,故直接将ch插入栈stack中
/(+ 56#20#-4#2# Ch为数字,将2#存入数组exp中
56#20#-4#2#+ Ch为“)”,故将栈stack中“(”之前的字符依次删除并存入数组exp中,而后将“(”删除
56#20#-4#2#+/ Ch为“#”,故将栈stack中的全部有符依次弹出并存入数组exp中,而后再将ch存入数组exp中,获得后缀表达式
int Question::check(string str)//用于计算生成的运算式的结果

{
    stringstream s;
    s << str << '#';
    str = s.str();
    s.str("");
    int   i, t, top = 0,len=str.length();
    double d;
    char str1[11]; //表达式
    char exp[15];  //存后缀表达式
    char stack[15]; //做为栈来使用
    char ch;
    for (i = 1; i <= len; i++)
        str1[i] = str[i - 1];
    
    t = 1; i = 1;
    ch = str1[i]; i++;
    while (ch != '#')
    {
        switch (ch)
        {
        case '(':  //断定为左括号
            top++; stack[top] = ch;
            break;
        case ')':  /*断定为右括号*/
            while (stack[top] != '(')
            {
                exp[t] = stack[top]; top--; t++;
            }
            top--;
            break;
        case '+':   /*断定为加减号*/
        case '-':
            while (top != 0 && stack[top] != '(')
            {
                exp[t] = stack[top]; top--; t++;
            }
            top++; stack[top] = ch;
            break;
        case '*':  /*断定为'*'或'/'号*/
        case '/':
            while (stack[top] == '*' || stack[top] == '/')
            {
                exp[t] = stack[top]; top--; t++;
            }
            top++; stack[top] = ch;
            break;
        case ' ':break;
        default:
            while (ch >= '0' && ch <= '9') /*断定为数字*/
            {
                exp[t] = ch; t++;
                ch = str1[i]; i++;
            }
            i--;
            exp[t] = '#'; t++;
        }
        ch = str1[i]; i++;
    }
    while (top != 0)
    {
        exp[t] = stack[top]; t++; top--;
    }
    exp[t] = '#';

    t = 1; top = 0;
    ch = exp[t]; t++;
    while (ch != '#')
    {
        switch (ch)
        {
        case '+':stack[top - 1] = stack[top - 1] + stack[top];
            top--; break;
        case '-':stack[top - 1] = stack[top - 1] - stack[top];
            top--; break;
        case '*':stack[top - 1] = stack[top - 1] * stack[top];
            top--; break;
        case '/':if (stack[top] != 0)
            stack[top - 1] = stack[top - 1] / stack[top];
                 else
                 {
                     printf("\n\t除零错误!\n");
                     exit(0);/*异常退出*/
                 }
                 top--; break;
        default:d = 0;
            while (ch >= '0' && ch <= '9')   /*断定为数字字符*/
            {
                d = 10 * d + ch - '0';  /*将数字字符转换成对应的数值*/
                ch = exp[t]; t++;
            }
            top++;
            stack[top] = char(d);
        }
        ch = exp[t]; t++;
    }
    return stack[top];
}

C++界面编程

原本是想看看Qt的,qt的方法学起来也很简单容易看懂跟swing有点类似,可是qt for vs2017的版本还没发布,只好用一下vs自带的MFC,MFC呢看起来比较繁琐
可是,若是不想本身敲代码,能够在建立MFC工程的时候选基于对话框,这样用起来就比较方便,跟vb同样的把控件拖入,设置控件的属性以及动做。不过MFC还要设置类、
变量等。


编程

相关文章
相关标签/搜索