[code=vb
]Private Sub Command7_Click(Index As Integer)
m1 = Val(Text1.Text)                         '计算符号前取数1
suanfa = Command7(Index).Caption
Text1.Text = ""
End Sub
Private Sub Command6_Click()
m2 = Val(Text1.Text)                          '等号取数2
Select Case suanfa
Case "+"
Text1.Text = m1 + m2
Case "-"
Text1.Text = m1 - m2
Case "*"
Text1.Text = m1 * m2
Case "/"
If (m2 = 0) Then
Text1.Text = "除数不能为0."
Else
Text1.Text = m1 / m2
End If
                                      这个是作业。。目前只能实现一次的加减。。如何连加连减呢?
End Select
End Sub
[/code]

解决方案 »

  1.   

    参考《编译原理》中的词法分析和有限状态自动机。
    参考下面,尽管是C://有字符串
    //1_22_333,,4444__55555,_666666
    //需要解析为
    //1
    //22
    //333
    //_
    //4444
    //55555
    //666666
    #include <stdio.h>
    char s[]="1_22_333,,4444__55555,_666666";
    char c,*p,*p1;
    int st;
    void main() {
        st=0;
        p=s;
        while (1) {
            c=*p;
            if (0==c) {
                switch (st) {
                case 1:printf("_\n");    break;
                case 2:printf("%s\n",p1);break;
                }
                break;//
            }
            switch (st) {
            case 0:
                     if ('_'==c) {                            st=0;}
                else if (','==c) {                            st=1;}
                else             {p1=p;                       st=2;}
            break;
            case 1:
                     if ('_'==c) {                            st=1;}
                else if (','==c) {printf("_\n");              st=1;}
                else             {p1=p;                       st=2;}
            break;
            case 2:
                     if ('_'==c) {*p=0;printf("%s\n",p1);*p=c;st=0;}
                else if (','==c) {*p=0;printf("%s\n",p1);*p=c;st=1;}
                else             {                            st=2;}
            break;
            }
            p++;
        }
    }
    //1
    //22
    //333
    //_
    //4444
    //55555
    //666666
      

  2.   

    只能逐字符扫描表达式....扫描到非字符,记录下位置,将该字符之前的文本用mid取出,然后转成数字,当作 数字1参与运算,然后取出运算符号,然后继续扫描到下个运算符或者表达式结尾,用mid取出,做为数字2,用刚才的运算符号运算,结果当作数字1,然后继续扫描到表达式结束....整个流程就是这样....不过做为给初学者的题目,有点难为了....说实在的....
      

  3.   


    代码调试通过....Private Sub Form_Load()
        Dim exp As String
        
        exp = "3*4/6" '要计算的表达式,只支持从做往右的+-*/ 不支持小数运算    Dim strNum As String, strOpt As String '暂存数字
        Dim str As String
        Dim Result As Long, Num As Long
        Dim i As Long    For i = 1 To Len(exp)
        
            str = Mid$(exp, i, 1) '每次取一个字符        If (IsNumeric(str) = False) Then '遇到运算符,            Num = Int(strNum) '将之前的数字字符串转为数字
                strNum = ""            If Len(strOpt) = 0 Then '之前没有发现过标点符号,第一个数做为结果
                    Result = Num
                Else
                    Result = CalIt(Result, Num, strOpt)  '之前发现过标点符号,进行运算
                End If
                strOpt = str  '记录新的标点符号        Else '没遇到运算符,合并到之前的数字
                strNum = strNum & str
            End If
        Next    If Len(strNum) > 0 Then
            Num = Int(strNum)
            Result = CalIt(Result, Num, strOpt)
        End If    MsgBox Result
    End SubFunction CalIt(ByVal Num1 As Long, ByVal Num2 As Long, ByVal Opt As String) As Long    If Len(Opt) = 0 Then Opt = "+" '默认运算符是加号    Select Case Opt
            Case "+"
            CalIt = Num1 + Num2        Case "-"
            CalIt = Num1 - Num2        Case "*"
            CalIt = Num1 * Num2
            
            Case "/"
            CalIt = Num1 / Num2    End Select
    End Function