回 帖 发 新 帖 刷新版面

主题:关于检索排序的新问题?

首先说明:站内的帖子中我没有找到答案,

现有一个二维数组SZ(N,X),N表示编号,X 表示各学科成绩,如下:
         数学  语文  英语  计算机
     SZ   1     2     3      4   ...
编号  1  成绩  成绩  成绩  成绩
      2  成绩  成绩  成绩  成绩
      3  成绩  成绩  成绩  成绩
      4  成绩  成绩  成绩  成绩
     ...

请教一个检索程序?(就是根据用户提出要求检索,并输出符合要求的数据)
例如:当用户要检索数学成绩高于60分时,就是要显示SZ(N,1)>60的人的各科成绩。
     呵呵!简单吧

问题是:用户提出的要求不确定(连方式都不确定),现在如下几种方式:
1.可根据某科的分数线检索(如:例子)
2.可根据某几科的分线线检索(如:要数学80以上、语文60以上的)
3.按某科成绩排序(如:按数学成绩从高到低排序)
4.按某几科成绩排序(如:按数学成绩从高到低排序,若数学成绩相同则语文成绩高的在前)
5.同3.4.但只显示某科分数线上的(如:从高到低显示数学成绩在60以上的,若成绩相同则语文高的在前)
...
更头疼的是:
    分数线不是只检索高的,如1中可以检索成绩高于、低于或等于
    排序可不一定是从高到低,如3中数学成绩从高到低,相同的按语文成绩从低到高,再相同的按英语成绩从高到低...
--讨论----------------------
其实问题就在于判断的条件
我曾想过根据用户给出的要求确定判断条件,象问题1中:
    先确定几个大的查询方式让用户选择 (如获得用户是按单科成绩查询)
    再让用户选择学科 (如获得用户是按数学成绩查询) X1=1
    再让用户确定分数线 (如60) X2=60
    再让用户确定方式 (如高于且包括60分) Y1$=">="

    这时就可以根据以上信息确定出判断条件 X1 Y1$ X2 求得SZ(N,1)>=60
    FOR A=1 TO N
        IF SZ(A,x1)>=x2 THEN 输出
    NEXT A
真正的问题是:数学1可以用变量,分数线60也可以用变量,但关系运算符怎么代入?
如果能解这个问题,查询方式1就搞定了,其它也好办了。

我现在的处理方式是:
1.在主程序中将判断条件生成为一个字符串
2.用这个字符串修改文件A.bas中IF与THEN中的相关代码,并执行A.bsa生成一个A.TMP文件存放符合条件的编号序列
3.返回主程序打开A.TMP文件提取编号序列输出,最后删除A.TMP
但我认为这总不是办法,还请高手赐教

回复列表 (共11个回复)

沙发

不会是标题的问题吧(是老土了点)怎么没有理呢?
也许是我表达能力太差了,现在浓缩一下

总的来说一句话:当你无法确定IF的判断条件时该怎么处理?

还望高手们忙里偷闭帮忙解决一下

板凳

老实说,你的题目很有想头,
不过我嫌太麻烦了,所以很久以前就没再想办法去解决这些事情了。
因为有数据库的管理软件。犯不上要用QB来解决。

[color=FF00FF]真正的问题是:数学1可以用变量,分数线60也可以用变量,但关系运算符怎么代入?[/color]
[color=FF00FF]如果能解这个问题,查询方式1就搞定了,其它也好办了。[/color]

关系运算符的表达,
我估计你是想问如何表达一个查询要求的方向,比如顺序,比如倒序。
比如分数线,分数线还好说,麻烦的是大小于号。

可以用某一个标志变量来代表某一个要求(也就是方向)(也就是关系运算符)
比如说要求查询语文成绩从低到高的变量标志值是1
                      由高到低的变量标志值是2
我举个最简单的只有两个数的例子吧,s(1)=80分和s(2)=90分
查询大小的标志变量是K,为1时取小数,为2时取大数,

if s(1)>s(2) then a=1
if s(1)=s(2) then a=2
if s(1)<s(2) then a=3
select case k*10 + a
case 13
  print s(1)
case 11
  print s(2)
*****
end select

明白了吗?

3 楼

这种想法我也想到过,但是:
关于IF A>B OR C>B THEN 和IF A>B THEN
也就是说关于OR AND 等等,当条件项都不确定的话
象我说的2,4中当你不确定他会用几项时就同 > < = 一样麻烦了

我没学过汇编,我不知道能不能用中断什么的,在内存变量中找到关于存放关系运算的部分,将其修改??
也就是我所说的直接象变量一样代入关系符号,呵呵,是不是异想天开[em12])

4 楼

这并不是异想天开,很多事情也是需要从你的想象出发的
有了方向,自然就有了发明创造的机会和条件了。

你可以用一个函数来表达两个数的大小关系
比如:

function daxiao%(a,b)
select case a
case is >b
daxiao%=1
case is =b
daxiao%=2
case is <b
daxiao%=3
end select
end function

然后要求 >= 的时候就是 Daxiao% <3
         <= 的时候就是 Daxiao% >1
按具体当时要求对 Daxiao% 的值作判断就是了,
这个很容易转换的,
但不要怕麻烦,
因为这世界上有很多事情,明明很应该有更近的路可以走的
但偏偏要走很久很远,你要明白,这世界总会有无可奈何的事情。

比如说要求查询一个大于60分的语文成绩
(特别的只是这个大于的条件是可变的,我们就用一个变量来表达这个要求)

请选择

科目 X        逻辑比较 Y        分数线 Z
1.语文成绩    1.0 小于          ____分
2.数学成绩    1.5 小于或等于        
3.英语成绩    2.0 等于
4.物理成绩    2.5 大于或等于
              3.0 大于

我们把这三个选择归纳到三个变量去,

X 代表科目
Y 代表关系符号
Z 代表分数值

检查某一个分数时   

F= 分数(学生,X)    '某个学生的第X科成绩
G=Daxiao%(F,Z)
if ABS(G-Y)=<0.5 then print F

5 楼

谢谢MOZ
你所说的用中间变量我懂,而且我用这种方法把第2个问题也解决了。

我是用一个中间数组zj(科目,1 TO 2)其中:1为逻辑比较 2为分数线
先为其赋一个初值 1逻辑 初值为大于 2分数 初值为-1

再根据用户要求修改1和2,也就是没有要求的科目就是>-1

FOR A=1 TO 学生
   FOR B=1 TO 科目
       SELECT CASE ZJ(B,1)
           CASE 1 '1 表示>
                  IF SZ(A,B)>ZJ(B,2) THEN Z=Z+1
           CASE 2 '2 表示<
                  IF SZ(A,B)<ZJ(B,2) THEN Z=Z+1
           CASE 3 '1 表示=
                  IF SZ(A,B)=ZJ(B,2) THEN Z=Z+1
           CASE 4 '1 表示>=
                  IF SZ(A,B)>=ZJ(B,2) THEN Z=Z+1
           CASE 5 '1 表示<=
                  IF SZ(A,B)<=ZJ(B,2) THEN Z=Z+1
           CASE 6 '1 表示<>
                  IF SZ(A,B)<>ZJ(B,2) THEN Z=Z+1
       END SELECT
   NEXT B
   IF Z=科目 THEN PRINT...
   Z=0
NEXT A

这样就不管用户用几科要求查都没问题了,而且也可以用在1中,因为单科查询只是多科查询中的一个特例。
但这只是问题2中的多科查询中各科的关系都是 AND的原因,仍然没有解决AND与OR不确定时的问题?
我也想过将这种方法用在各科间的AND和OR中,但太麻烦了,因为如果科目很多排列出来的组合形势太多了,况且这只是检索查询子程序,在成绩管理子程序中有一个新增科目的功能,就是每学年所开设的课程数并不相同。(唉!不确定的因素太多了是不[em10])
我想与其组合出所有的查询形势,还不如用让用户自己给出。如果不能代入关系倒不如就象我最初的做法用一个文件转换来的实际。(因为那样也算是代入了关系)

6 楼

要[color=FF00FF]组合出所有的查询形势[/color]并不难,知道科目总数(这肯定能知道的不是?) 在这数字内循环,检查条件指标就可以了
比如说总科目有5科,在用户查询的时候用多选打勾的形式选择的话
  1.[ ]  2.[x]  3.[ ]  4.[x]  5.[ ]
根据选择的标志去判断就行了,
for i=1 to 5
   if choice(i)=true then .....
不会很难做的,只是有点繁琐而已.
这是锻炼的一个好机会

至于做新的源文件来调用,这个问题实在有点不好说
一个是因为依赖到QB的运行环境
二个是有点像机器人自我生息

7 楼

你可能没有明白我的意思
我是说各项之间的关系,即AND、OR
比如:要第2科或第4科高于60 即: 2>60 or 4>60
      第2科和第4科都高于60 即: 2>60 and 4>60

我计算过,一共有2^(科目数-1)种组合,5科就有16种呀
再多几科就是成平方的增加呀

8 楼

你再把第4楼与第6楼结合一下

你甚至可以计算它们的值
当其中一个符合的时候某个标志变量加一
当 and 的时候标志值等于个数
当 or 的时候标志值大于你的界线为准

比如说有五个条件
当一条件成立时,标志变量+1=1
当二条件成立时,标志变量+1=2
当三条件不成立时,标志变量不变
当四条件不成立时,标志变量不变
当五条件成立时,标志变量+1=3

这样当你要求所以的 and 的时候就是说需要五个条件都成立, 3<5,也就是不符合条件
当你要求一个条件以上成立的时候 ,也就是 or , 3>1 , 也就是已经符合要求了

9 楼

我懂你说的,但AND和OR是表示各项之间的关系呀,而且AND与OR的计算还有先后的原因
例:要12科大小60或34科大于60
IF 1>60 AND 2>60 OR 3>60 AND 4>60 THEN
如果我13科及格,照你说的标志变量应该为2,那你说我的要求值设为几呀,如果是2不是成立了吗?
这样怎么体显OR的关系呢?

10 楼

要懂得灵活变通
很多事情并不是一成不变定死的

按实际要求设定或获得总科目数量 m
要求亦可以根据 m 定义数组 dim s(m)
不但只可以只科目数要求可达成
连指定哪几科在什么分数线上的要求都可以实现
按照第四楼的选择,首先由用户设定要求的条件,
某一科需要些什么条件要求,
用些什么样的变量去标志
用 for 去检测一翻

这些东西我也说不清楚了,自己慢慢研究考虑一下吧.
不定及格科目更简单,及格一科就加一,十三科及格值就大于等于十三,你说呢.

我来回复

您尚未登录,请登录后再回复。点此登录或注册