以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]超费脑的逻辑判断,求传说级出来指点下~  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=77225)

--  作者:jwt
--  发布时间:2015/11/13 10:42:00
--  [求助]超费脑的逻辑判断,求传说级出来指点下~
我弄了个测评记录软件,根据得分自动给出评价,但是有个气质类型的判断,太复杂了,上来求教
这是气质类型的判断方法:
1、如果某类气质得分明显高出其他三种,均高出4分以上,则属于该种气质类型。

2、如果两种气质类型的得分很接近,两者之差小于3,但同时又明显高于其他两种类型,其高出部分超过4分以上者,则属于两种气质的混合型。

3、如果三种气质的得分很接近,之差均小于3,但又明显高于第四种者,且超过4分以上,则属于三种气质的混合型。

4、如果四种气质的得分很接近,之差均小于三,则属于无法判断的情况。

求:如果评价列为表达式列,那么表达式如何写,如果非表达式列,那代码如何写?
附软件的气质类型界面。
此主题相关图片如下:1.png
按此在新窗口浏览图片

--  作者:大红袍
--  发布时间:2015/11/13 11:03:00
--  

A、B、C、D

 

比如第一种,得出A的,这样写

iif((A-B>4 OR A-B<-4) AND (A-C>4 OR A-C<-4) AND (A-D>4 OR A-D<-4),\'A\', \'否则继续其余的判断\')

 

得出A、B这样写

iif((A-B>4 OR A-B<-4) AND (A-C>4 OR A-C<-4) AND (A-D>4 OR A-D<-4),\'A\', iif((B-A>4 OR B-A<-4) AND (B-C>4 OR B-C<-4) AND (B-D>4 OR B-D<-4),\'B\',\'否则继续其余的判断\'))

 

-------------------------- 拼凑起来,就是一大段判断


--  作者:大红袍
--  发布时间:2015/11/13 11:10:00
--  

比如第一种的情况,就这样处理。其余你的,你照着逻辑写代码就行。分别判断。

 

Dim ary1() As String = {"A", "B", "C", "D"}
Dim ary2() As Integer = {-3, 7,  -1, -11}

 

For i As Integer = 0 To ary1.Length - 1
    Dim flag As Boolean = True
    For j As Integer = 0 To ary2.length - 1
        If i<>j AndAlso Math.Abs(ary2(i)-ary2(j)) < 4 Then
            flag = False
            Exit For
        End If
    Next
    If flag  = True Then
        msgbox(ary1(i))
        Return Nothing
    End If
Next


--  作者:jwt
--  发布时间:2015/11/13 11:22:00
--  
谢谢,我再捣鼓捣鼓~顺便帮我看下另一个问题吧,随机抽取5行记录,代码如下,为啥他有时显示3行、有时4行、有时5行??


Dim cnt As Integer = DataTables("题库").DataRows.Count
Dim ids1 As New List(of Integer) \'用于存储洗牌前的位置
Dim ids2 As New List(of Integer) \'用于存储洗牌后的位置
For i As Integer = 0 To cnt -1 \'准备初始的牌
    ids1.add(i)
Next
For i As Integer = 0 To cnt - 1 \'开始洗牌
    ids2.Add(ids1(rand.Next(0,ids1.count)))
Next
Tables("题库").StopRedraw()
DataTables("题库").ReplaceFor("抽取",False)
For i As Integer = 0 To 5 - 1 \'5为要抽取的行数
    DataTables("题库").DataRows(ids2(i))("抽取") = True
Next
Tables("题库").Filter = "[抽取] = True"
Tables("题库").ResumeRedraw()

--  作者:大红袍
--  发布时间:2015/11/13 11:30:00
--  

洗牌要这样

 

Dim cnt As Integer = DataTables("表A").DataRows.Count
Dim str As New List(of Integer) \'用于存储洗牌前的位置

For i As Integer = 0 To cnt -1 \'准备初始的牌
    str.add(i)
Next

For i As Integer = 1 To str.count \'洗牌测次数
    Dim rnum1 As Integer = Rand.Next(str.count -1)
    Dim rnum2 As Integer = Rand.Next(str.count -1)
    Dim temp As String = str(rnum1)
    str(rnum1) = str(rnum2)
    str(rnum2) = temp   
Next

For i As Integer = 0 To 5 - 1 \'5为要抽取的行数
    output.show(str(i))
Next


--  作者:yan2006l
--  发布时间:2015/11/13 11:35:00
--  

先数组排序,从高到低分别为 a1 a2 a3 a4

b1 = a1 - a2

b2 = a2 - a3

b3 = a3 - a4

后面代码很简单,只要对比b就可以了如下:

if b1 > 4 then

(就是第一种情况(单高),为什么呢:因为如果b1>4,由于a1>=a2 ,所以 a1-a3 肯定也是大于4的,a1- a4也肯定大于4.所以可以直接下结论,后面同理)

elseif b1 < 3 and b2 >4

(双高)

elseif b1 < 3 and b2 < 3 and b3 > 4

(三高)

elseif b1 < 3 and b2 < 3 and b3 < 3

无法判断

else

end if


--  作者:jwt
--  发布时间:2015/11/13 11:39:00
--  
额 .....代码复制过去,把表名改了后,点击按钮,没反应0.0
--  作者:大红袍
--  发布时间:2015/11/13 11:50:00
--  
Tables("题库").StopRedraw()
DataTables("题库").ReplaceFor("抽取",False)
For i As Integer = 0 To 5 - 1 \'5为要抽取的行数
    DataTables("题库").DataRows(str(i))("抽取") = True
Next
Tables("题库").Filter = "[抽取] = True"
Tables("题库").ResumeRedraw()

--  作者:狐表开发
--  发布时间:2015/11/13 15:15:00
--  
楼主,你的第一个问题做好了?
--  作者:jwt
--  发布时间:2015/11/18 9:45:00
--  
狐大大,没有解决,目前还是人工判断,真个系统就这个一个缺陷,好复杂0.0