以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  如何用分数形式显示计算结果  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=24094)

--  作者:明丰
--  发布时间:2012/9/29 15:09:00
--  如何用分数形式显示计算结果

output.show(Fract(eval(1-999/7999)))

 

上面的结果为:7/8,而不是7000/7999。

 

请问能精确显示吗?


--  作者:lin_hailun
--  发布时间:2012/9/29 15:23:00
--  
 不可能精确显示,电脑不会运算分数,除非自己编程实现。

 说说你要的需求,然后根据需求帮你弄弄。

--  作者:明丰
--  发布时间:2012/9/29 15:35:00
--  

初中学生的作业中有很多含分数的算式,家长每晚要检查签名,如果每道题都核算一遍,头都大了。希望在软件中输入含分数算式,结果用分式表示。

由于电脑计算时以小数形式进行计算,最后转换为分数,所以结果出现误差,上面的要求感觉很难实现。


--  作者:mr725
--  发布时间:2012/9/29 16:24:00
--  
想办法弄成这样:output.show((7999-999) & "/" & 7999)
--  作者:lin_hailun
--  发布时间:2012/9/29 18:00:00
--  
 下面的代码,只支持一个分数的加减操作。

 如果要实现楼主想要的分数计算,就必须自己去实现eval()函数,对表达式进行提取,分析,运算。比较麻烦......涉及递归,操作符比较。

 也就是说,让电脑按照人的顺序去运算,很费精力……楼主请高手帮忙哈。

Dim data As String = "10/5+(5-2/10)+4"
Dim catchs As New System.Text.RegularExpressions.Regex("[\\+\\-\\*/\\(\\)]*\\d+")
Dim mc As System.Text.RegularExpressions.MatchCollection = catchs.Matches(data)
Dim maxfm As Double = 1
Dim nums(mc.count - 1) As String
Dim fzs(mc.count - 1) As String

catchs = New System.Text.RegularExpressions.Regex("^[\\+\\-\\*/\\(]+")
Dim mc0 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(mc(0).Value)
If mc0.Count = 0 Then
    nums(0) = "+" & mc(0).Value
Else
    nums(0) = mc(0).Value
End If
Dim m, n, r As Double
For i As Integer = 1 To mc.Count - 1
    nums(i) = mc(i).Value
    If nums(i).IndexOf("/") <> -1 Then
        catchs = New System.Text.RegularExpressions.Regex("\\d+")
        Dim mc2 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
        Dim right As Integer = mc2(0).Value
        \'求最小公倍数
        If right > maxfm Then
            m = right
            n = maxfm
        Else
            m = maxfm
            n = right
        End If
        Do
            r = m Mod n
            If r = 0 Then Exit Do
            m = n
            n = r
        Loop
        maxfm = maxfm * right / n    
    End If
Next
Dim Index As Integer = 0
For i As Integer = 0 To nums.Length - 1
    catchs = New System.Text.RegularExpressions.Regex("[^\\d]+")
    Dim mc2 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
    Dim left As String = mc2(0).Value
    catchs = New System.Text.RegularExpressions.Regex("\\d+")
    Dim mc3 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(nums(i))
    Dim right As Integer = mc3(0).Value  
    If nums(i).IndexOf("/") = -1 Then   \'如果不是分母
        fzs(Index) = left & right * maxfm
        Index = Index + 1
    Else
        catchs = New System.Text.RegularExpressions.Regex("[^\\d]+")
        Dim mc4 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(fzs(Index - 1))
        Dim last_left As String = mc4(0).Value
        catchs = New System.Text.RegularExpressions.Regex("\\d+")
        Dim mc5 As System.Text.RegularExpressions.MatchCollection = catchs.Matches(fzs(Index - 1))
        Dim last_right As Double = mc5(0).Value
        fzs(Index - 1) = last_left & last_right / right
    End If
Next

Dim fz As String = ""
For i As Integer = 0 To fzs.Length - 1
    fz = fz & fzs(i)
Next
Dim num As String = ""
For i As Integer = 0 To nums.Length - 1
    num = num & nums(i)
Next
fz = fz & data.SubString(num.Length - 1)
fz = eval(fz)

\'约分
If fz > maxfm Then
    m = fz
    n = maxfm
Else
    m = maxfm
    n = fz
End If
Do
    r = m Mod n
    If r = 0 Then Exit Do
    m = n
    n = r
Loop
fz = fz / n
Dim fm As Integer = maxfm / n
Dim result As String = fz & "/" & fm
Output.Show(result)
[此贴子已经被作者于2012-9-30 19:38:04编辑过]

--  作者:程兴刚
--  发布时间:2012/9/29 20:38:00
--  

用得着那么复杂吗?

 

Dim s As String = "355/555"
Dim a As Integer = s.split("/")(0) \'分子数
Dim b As Integer = s.split("/")(1)  \'分母数
Dim c As Integer =  Math.Min(a,b)
If a > 1 And b > 1
    For i As Integer = c To 2 Step -1
        If b Mod i = 0 And a Mod i = 0
            Output.show(a/i & "/" & b/i )
            Exit For
        End If
        If i = 2
            Output.show(a & "/" & b)
        End If
    Next
End If


--  作者:程兴刚
--  发布时间:2012/9/29 21:11:00
--  

哦,我看错了楼主的意思,以为仅仅是约分呢!按照楼主的要求出现1-这样的情况,这样即可,同时实现自动约分:

 

Dim s As String = "1-999/7999"
Dim s1 As String
Dim a As Integer = s.split("/")(1) - s.split("/")(0).split("-")(1)
Dim b As Integer = s.split("/")(1)  \'分母数
Dim c As Integer =  Math.Min(a,b)
If a > b
    s = a \\ b & "-"
Else
    s = Nothing
End If
If a > 1 And b > 1
    For i As Integer = c To 2 Step -1
        If b Mod i = 0 And a Mod i = 0
            Output.show(s & a/i & "/" & b/i )
            Exit For
        End If
        If i = 2
            Output.show(a & "/" & b)
        End If
    Next
End If

 

 


--  作者:明丰
--  发布时间:2012/9/29 23:15:00
--  

祝各位中秋节快乐!辛苦了。

 

如果给定的算式是含分数、整数、连除的混合运算,这个设置还是比较复杂,学习中。


--  作者:程兴刚
--  发布时间:2012/9/29 23:51:00
--  

复杂在于分解公式,其他的并不可怕,您可以将不同的复杂公式贴出来,让大家在摸索中寻找规律!


--  作者:明丰
--  发布时间:2012/9/30 7:00:00
--  
综合测试题:-4*25/2/5/10*(-1)*1-1/600+5*5*5/125*(1/5+(-1/5))+1/600-41/7999-(-41/7999)-999/7999