| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1250 人关注过本帖
标题:不可思议的运行结果!
只看楼主 加入收藏
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
结帖率:85.71%
收藏
已结贴  问题点数:20 回复次数:5 
不可思议的运行结果!
遇到一不可思议的问题!!!
第一段代码:
*
*       插入排序算法练习
*
*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




第二段代码:

*
*            插入排序算法编程练习
*
*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 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
第一段代码和第二段代码运行结果应该是相同的呀!  为什么第二段代码出错啊!不可思议,求高手解答!! 谢谢!!!
搜索更多相关主题的帖子: 代码 排序 数组 命令 while 
2018-05-23 20:00
gs2536785678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:601
专家分:1770
注 册:2017-7-16
收藏
得分:7 
代码太长了,复杂!
无非是个排序问题,为何这样写呢?
放入数组中,放入DBF表中都是可以的啊。。。
2018-05-24 09:09
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11771
专家分:43421
注 册:2006-5-13
收藏
得分:7 
简单问题复杂化,表和数组都有现成的排序命令,放着现成命令不用,非得自己去写一段程序。
你的ii_c应该是字符型变量,值应该是字符2-10,那么你的AA&ii_c又是什么数据类型呢?前面的AA0已经赋值AA&ii_c,后面循环的条件AA0 < AA&ii_c条件又如何能成立呢?

结果不可思议在于你的程序结构混乱。

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2018-05-24 13:27
schtg
Rank: 12Rank: 12Rank: 12
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1542
专家分:3003
注 册:2012-2-29
收藏
得分:7 
@hu9jj,高!
2018-05-24 19:30
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
是的,数组就是可以用函数Asort()排序的,表中的记录也可以用命令排序,但是本人就是想了解一下“插入排序”的算法。
第一段代码是正确的预想结果,第二段代码:改为:
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 编程的过程,遇到过一些不可思议的问题

[此贴子已经被作者于2018-5-24 21:28编辑过]

2018-05-24 20:04
zhangheyuan
Rank: 1
等 级:新手上路
帖 子:75
专家分:4
注 册:2018-5-23
收藏
得分:0 
回复版主 hu9jj :
ii_c 字符型变量,'0'  '1'  '2'  '10'  
AA&ii_c  就是模拟数组的数值型变量, AA0  AA1  AA2  AA3 ....   AA10

“后面循环的条件AA0 < AA&ii_c条件又如何能成立呢?”

您看错了,是 AA&jj_c 呢!
 
VFoxPro 不能引用 0 下标的数组元素的,所以数组不能用。 插入排序的巧妙之处就在于引用0下标的元素,控制循环到最后情况的安全退出。

[此贴子已经被作者于2018-5-24 21:36编辑过]

2018-05-24 20:13
快速回复:不可思议的运行结果!
数据加载中...
 
   



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

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