• 欢迎来到自由勇的Blog! 订阅本博客
  • Blog首页关于自由勇Blog存档联系自由勇留言板网站地图友情链接

  • 日记:2010-04-05

    王志勇 发表于 2010年04月05日 17:56

    昨天重新写了一个新的分页程序,类似于这样的存档功能:http://www.ufoaq.com/archives/201003/。这个分页程序比较复杂,是打开2组数据库,大约是在2006年完成的ASP程序,后来移植到PHP程序。因为当时写程序的时候,没有记笔记,算法已经记不清了。后来重新写了这个程序大约2次,每次都需要2~4天,都没有成功,失败了,运行的结果总是不正确。这次重新编写成功了,并记录了笔记。因为这个分页的算法太重要了,我需要熟练地掌握它,并且理解它,希望让它有更简单的算法,我以前写的论坛程序www.ufoaq.com、留言板程序http://www.ufoaq.com/cast/wish/,都是使用这样的分页算法,所以才可以支持很大的容量。

    因为当时没有写工作日志,算法已经完全忘记了。直接看程序,无法看出当时打草稿时的数字规律,无法看懂。所以很多程序都直接使用大约2006年推算的算法,经过很多的测试,从未出错。http://www.ufoaq.com/archives/201003/的程序是每页300条记录,分为2纵列。打开2组数据库,然后依次显示每条数据。当显示完第150条数据时,输出一个<li>元素使其分成第2列。现在这个程序重新写,2组数据库提取时,让其合并为1组就方便多了。2组数据库,或者多组数据库合并为1组的好处是后续的操作简便,可以实现更多的功能。例如让其第1页显示100条记录,从第2页开始每页显示300条记录;15条记录×2列为1个区域,即30条记录/区域,每页10个区域,即每页300条,以分区域的方式显示。

    我写的博客程序www.auiou.com和www.zj7.com的分页程序的算法相对比上述简单很多,如首页之后的第2页、第3页的分页程序,分类和按月存档的的分页程序,都是相同的算法,如这里http://www.auiou.com/relevant/00000445.jsp,这个算法任何语言都可以通用。但还可以再简化,例如PHP可以直接用$p=ceil($auf/$w3);一个语句就可以获得总共的页数。所以这个博客的分页程序可以简化为:

    <?//$pa为页数
    $w3=10;
    $p=ceil($auf/$w3);
    if (!$p) $p=1;
    $w1=($pa-1)*$w3+1;
    $w2=$pa*$w3;
    if ($w2>$auf) $w2=$auf;?>

    因为打开多组数据库的分页比较复杂,这2天总是出现很多的错误。每一次程序很乱的时候,就把相应的大片的程序删除,再重新写,反复写了3次。今天调试的时候,发现昨天写的程序中有四、五处错误,逐个排查之后,经过很多测试,程序运行正常。

    这2天运算的一些过程:

    23 4:
    第N页数据组1组数据库的情形2组数据库的情形规律
    131-41-3 1-1
    225-82-52=5-3
    329-126-96=9-3
    4213-1610-10 1-310=13-3
    5117-204-74=17-13
    6121-238-108=21-13

    说明:上面的23 4,表示:23是总共有23条数据,4为每页显示4条记录;其中,每组数据库有10条记录,下述用变量$i3表示。下面的数据与上述的格式相同,因为篇幅的关系,不再打表格,因为我在用数字做演算测试的时候,也没有像上面一样打表格,而是直接用下面的方式来记录:

    23 5
    1 3 1-5 1-3 1-2
    2 2 6-10 3-7 3=6-3
    3 2 11-15 8-10 1-2 8=11-3
    4 1 16-20 3-7 3=16-13
    5 1 21-23 8-10 8=21-13

    23 6
    1 3 1-6 1-3 1-3
    2 2 7-12 4-9 4=7-3
    3 2 13-18 10-10 1-5 10=13-3
    4 1 19-23 6-10 6=19-13

    30 6
    1 3 1-6 1-6
    2 3 7-12 7-10 1-2
    3 2 13-18 3-8 3=13-10
    4 1 19-24 9-10 1-4 9=19-10
    5 1 25-30 5-10 5=25-20

    33 6
    1 4 1-6 1-3 1-3
    2 3 7-12 4-9 4=7-3
    3 3 13-18 10-10 1-5 10=13-3
    4 2 19-24 6-10 1-1 6=19-13
    5 1 25-30 2-7 2=25-23
    6 1 31-33 8-10 8=31-23

    $e4的值表示提取最近一组数据的数据条数:
    <?$pb=ceil($e1/$i3);
    $p=$pb;
    $e4=$e1-($pb-1)*$i3;?>

    通过上述很多数据的反复对比,如23 4这些数据,其规律10=13-3,4=17-13,8=21-13,其中等号左边的值如10、4、8,是2组数据库时提取第1组数据库时的$w1,等号右边的被减数13、17、21,是2组数据库时的$w1,等号右边的减数3、13、13,是我需要重点推算出来的值,这个值很容易出错,假设这个值的变量是$e5。$e5的意义是,在当前的页面中,$e5表示之前显示过多少条数据。最终经过直接观察数字的规律而直接写公式,我并不明白这是为什么,但是根据数字的规律用这个推算出来的公式,就不会出错了。规律如下:

    数据编号需要减去的值$n1
    30
    210
    120

    同样的格式:

    2 0
    1 10

    如果将$n1显示为未乘以$i3前的值,如下:

    3 0
    2 1
    1 2

    4 0
    3 1
    2 2
    1 3

    通过上述的规律,最终,$e5的值可以准确地获得了,如下:
    <?$e5=$e4+($pb-1-$f1)*$i3?>
    其中,$f1表示数据组的编号。用上述获得$p页数同样的方法来获得$f1,如下:

    <$i=$e1+1;
    $j1=$i-$w5;
    $f1=ceil($j1/$i3);?>

    变量$a5表示如上述提到的第1页特定显示的条目数如100条记录,$w5和$w6是最终要获得的2组数据库合并后的起始和结束值,$w5是起始值,$w6是结束值;相当于这页程序http://www.auiou.com/relevant/00000445.jsp的$w1和$w2。为了不造成混淆,必须使用2个不同的变量,因为当$a5存在时,$w5和$w1的值不同。$w5和$w6的获得方法:

    <$w5=$w1;$w6=$w2;
    if ($a5){if ($pa==1){$w6=$a5;$e6=$a5;}
    if ($pa>1){$w5=$w5-($w3-$a5);$w6=$w3+$w5-1;}
    $p=ceil(($e1-$a5)/$i3)+1;}
    if ($w6>$e1) $w6=$e1;?>

    通过对各个部分的反复思考和测试,最终大功告成了。很多程序,以及程序中的变量代表的含义,经常是没有唯一的意义,或者方法,或者思维方法,一会儿这样,一会儿那样;一会儿代表这个含义,一会儿代表那个含义。但最终还是能通过使用不同的方法,实现想要实现的功能、解决问题,殊途同归,有些类似于代数、几何的证明题用不同的方法证明同一个命题。

    0条评论:

    发表评论:
    名字: (*必填)
    博客: (可省,仅限于Blog地址)
    验证码: a48d58a68p78t88 (*必填)

    正文:

      记住信息? 是 否

    直接发送Trackback

  • 王志勇(自由勇):网站程序设计。
    公历1980-09-26 天秤座 30岁
    我的联系方式:信息反馈、留言板。

    版权声明:
    本博客所有文章,均符合原创和创作共用的定义,请勿转载。如需引用本博客的文章全文,复制本博客文章的网址即可。

    相关的链接:
    和平海底1 | Auciou | 自由勇专栏 | UFO问答
    呼叫星际联邦/祈祷 | 我们看不见外星人的原因
    郝相国先生星际联邦接触官方网站

    文章分类 Category:
    编程 | PHP | 互联网 | 真相与UFO | JavaScript
    BBS社区研究 | QQ研究 | Blog的发展 | 生活
    食虫植物
    Gratitude | 食虫植物

    Blog存档 Archives:
    2010年09月 | 2010年08月 | 2010年07月
    2010年06月 | 2010年05月 | 2010年04月
    2010年03月 | 2010年02月 | 2010年01月
    2009年12月

    近期的主题:
    蚊子要不要清除?
    活水苔的获得
    糟糕的Flash Player 10.1.82.76:全屏白屏
    document.body.innerHTML出现“操作已终止”解决一例
    养食虫植物增加空气湿度的简单方法
    日记随笔:论坛程序再次开发完成
    地球扬升与家人、朋友
    日记随笔:2010-07-09
    梦见第四密度和梦见飞碟
    日记:2010-06-05 音乐
    感谢郝先生!
    所有人都可以直接参与百度贴吧的管理
    坚守真诚到永远
    有关30年后的未来人的帖子
    每天的时间太有限
    伏尔加河大桥扭曲事件之感想
    善良的人在灾难中遇难怎样解释
    有关星际联邦是否降落
    郝相国先生与外星人接触进展(6)
    郝相国先生与外星人接触进展(5)


  • Copyright © 2004-2010 zj7.com All rights reserved.
    此Blog程序由王志勇编写