自動出題軟件--小結及初識界面設計

總結及界面設計

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還要設置類、
變量等。


編程

相關文章
相關標籤/搜索