| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3319 人关注过本帖
标题:不可思议的运行结果...... 再讨论!
取消只看楼主 加入收藏
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
结帖率:85.71%
收藏
 问题点数:0 回复次数:7 
不可思议的运行结果...... 再讨论!
遇到一不可思议的问题!!!     ( 代码的适用性不重要,重要的是解决这个“不可思议”的困惑。请大家看清楚,注意区分 ii 和 jj )

 第一段代码:
*
*       插入排序算法练习
*
*Dimension AA(20)   &&数组名 有大小写之分;使用[]和()都行!
*Declare AA(20)  &&也可以。Declare和 Dimension 一样,就和EDIT命令和change命令相同一样。重定义数组,对应的元素值不变化!
**由于FoXPro数组的下标,一般是从1开始的,所有不能使用数组来完成 插入排序,当然Asort函数就可以直接排序数组。

input '请输入第1个数值型数据:' to AA1
 for ii=2 to 10    && 10个数组排序,n=10
   ii_c=transform(ii)
   input '请输入第'+ii_c+'个数值型数据:' to AA&ii_c
   AA0 = AA&ii_c
   jj=ii-1
   jj_c=transform(jj)
   do while .t.    &&为什么用 do while AA0 < AA&jj_c 出现不是预知的逻辑错误呢?
   if AA0 < AA&jj_c   && transform(0) 就是返回 '0'
     jj1_c=transform(jj+1)
     AA&jj1_c = AA&jj_c
     jj=jj-1
     jj_c=transform(jj)
    else
     exit
    endif
   enddo
   jj1_c=transform(jj+1)
   AA&jj1_c = AA0
 endfor

 for ii=1 to 10
   ii_c=transform(ii)
   ? 'AA'+ii_c+':'+transform(AA&ii_c)
 endfor


第二段代码:

input '请输入第1个数值型数据:' to AA1
 for ii=2 to 10    && 10个数组排序,n=10
   ii_c=transform(ii)
   input '请输入第'+ii_c+'个数值型数据:' to AA&ii_c
   AA0 = AA&ii_c
   jj=ii-1
   jj_c=transform(jj)
   do while AA0 < AA&jj_c    &&为什么 do while AA0 < AA&jj_c 出现逻辑错误呢?  transform(0) 就是返回 '0'
     jj1_c=transform(jj+1)
     AA&jj1_c = AA&jj_c
     jj=jj-1
     jj_c=transform(jj)
   enddo
   jj1_c=transform(jj+1)
   AA&jj1_c = AA0
 endfor

 for ii=1 to 10
   ii_c=transform(ii)
   ? 'AA'+ii_c+':'+transform(AA&ii_c)
 endfor
第一段代码和第二段代码运行结果应该是相同的呀!  为什么第二段代码出现不是预知的逻辑错误啊!不可思议,求高手解答!! 谢谢!!!

第二段代码:改为:
for ii=2 to 10    && 10个数组排序,n=10
    ii_c=transform(ii)
    input '请输入第'+ii_c+'个数值型数据:' to AA&ii_c
    AA0 = AA&ii_c
    jj=ii-1
    jj_c=transform(jj)
    AAn=AA&jj_c
    do while AA0 < AAn    &&为什么 do while AA0 < AA&jj_c 出现逻辑错误呢?  transform(0) 就是返回 '0' do whhile "条件表达式"不能使用宏代换符号 "&"  吗? 为什么 IF 条件表达式就可以呢?
     jj1_c=transform(jj+1)
      AA&jj1_c = AA&jj_c
      jj=jj-1
      jj_c=transform(jj)
      AAn=AA&jj_c
    enddo
    jj1_c=transform(jj+1)
    AA&jj1_c = AA0
  endfor

  for ii=1 to 10
    ii_c=transform(ii)
    ? 'AA'+ii_c+':'+transform(AA&ii_c)
  endfor
这样也可以运行出 预想的结果的!



高手可以试运行一下这三段代码,帮忙分析分析第二段代码错在哪里?
 
代码的适用性不重要,重要的是解决这个“不可思议”的困惑。

 这是插入排序的典型算法,巧妙引用数组 下标0的元素  AA(0)  控制循环到最后的安全退出。

 由于VFP不能引用0下标,本人采用了变量:AA0, AA1, AA2, ....,AA10  的方法模拟数组。原理是一样的,排序结果在:AA1到AA10的变量里。
 本人在多年使用VFP6.0 编程的过程,遇到过一些不可思议的问题。


搜索更多相关主题的帖子: 运行 代码 排序 数组 do 
2018-06-05 21:00
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
  在VFP中这个排序,确实没有实际意义,VFP有多种处理方法,谁测试过着3段代码?帮忙分析分析,从语句结构看,三段代码执行效果应该是一致的。
可就是第二段代码,运行后没有排序,出现了比预想的结果有偏差。希望高手运行、跟踪一下。看看原因。

感谢5楼兄弟 对插入排序的解释。我的插入排序算法是不交换,只是移位,把要排序的数,先放入AA0(AA零不是字母O);这样在J-1 减到最后,J为0了,也能安全退出,(相等了嘛,大于的时候向前移位)
如:   第5个数是 5     AA1-AA4: 1 2  3 4 ;  先AA5->AA0,比较 1和5   1小 5大 1->AA5;在向后比较 2和5 还是5 大 2->AA4 ....3->AA3  4->AA2
这是J为0了 AA0 和5 相等了,AA1空出来了,将5送入AA1,就是插入5到 AA1 位置,就是所谓的插入排序啊!

5楼兄弟你的排序法,我觉得应该是交换排序(和冒泡排序有点相似)!     

就没人能给我个满意的解答吗?


[此贴子已经被作者于2018-6-6 21:17编辑过]

2018-06-06 21:03
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
高手,好像没明白我的困惑在哪里? 大家运行过这三段代码吗?
第一段代码和第三段代码都 可以排序
第二段代码就不能排序了,从程序结构看,这三段代码是等效的,高手们认真运行一下,看看结果。这个真是让人困惑个问题!
2018-06-11 22:32
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
第二段代码,不会出现运行错误的,就是运行结果,不是预想的排序结果。
2018-06-11 22:34
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
回复 7楼 吹水佬
回答一下,三段代码是不是等效的?如果是等效的,为什么第二段代码,不是预想的排序结果。
2018-06-11 22:38
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
感谢10楼的提醒,可能是数据类型的问题,0下标的引用,才是这个排序的巧妙之处嘛!
2018-11-26 18:58
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
我是用VF6。
2018-11-26 18:59
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
谢谢以上高手!结贴!
2018-11-27 20:52
快速回复:不可思议的运行结果...... 再讨论!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018165 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved