主题:MOZ快来,谢谢!!!!
梧桐秋雨1229
[专家分:0] 发布于 2006-01-10 19:42:00
上次问你的问题是这样的:让计算机随机产生一段英文字母(大小写均有),编程将大小写英文字母全部转换成大写英文字母,然后按26个英文字母在该段英文中出现的频率大小,将它们重新排序.
RANDOMIZE TIMER
l% = RND * 16383
FOR i% = 1 TO l%
j% = RND * 51
IF j% > 25 THEN j% = j% + 6
s$ = s$ + CHR$(j% + 65)
NEXT
PRINT s$
s$ = UCASE$(s$)
DIM p%(26)
FOR i% = 1 TO LEN(s$)
j% = ASC(MID$(s$, i%, 1)) - 64
p%(j%) = p%(j%) + 1
NEXT
FOR i% = 1 TO 26
m% = 0
k% = 0
FOR j% = 1 TO 26
IF p%(j%) > m% THEN
m% = p%(j%)
k% = j%
END IF
NEXT
z$ = z$ + CHR$(64 + k%)
p%(k%) = 0
NEXT
PRINT z$
你给出的答案我不太懂哦,可以解释一下吗?randomize timer的作用是什么呢?题目中说产生一段英文字母,不知道是多少个,那么为什么是l=rnd*16383?数组P是表示每个英文字母的概率吗?麻烦解释一下每个程序段的含义?多谢了,麻烦你不好意思了!!!
--------------------------------------------------------------------------------
回复列表 (共8个回复)
沙发
moz [专家分:37620] 发布于 2006-01-11 23:32:00
1. randomize timer 是预置随机数的种子
2. 一个可变长的字符串一般最大可以到32767的,但我一般情况下为了少出错,只限制到16383个字符就好了,rnd是一个大于等0小于1的随机数,也就是获得一个不大于16383的整数.
3. 数组p()是获得某个字母出现的次数(而不是概率).
4. 有时间再解释吧,时间太小了.
板凳
moz [专家分:37620] 发布于 2006-01-12 15:44:00
RANDOMIZE TIMER '[color=FF00FF]预置随机数的种子[/color]
l% = RND * 16383 '[color=FF00FF]得到一个不大于16383的整数,用作这段字母(字符串)的长度[/color]
FOR i% = 1 TO l% '[color=FF00FF]从一而终[/color]
j% = RND * 51 '[color=FF00FF]随机生成一个字母,0-25是大写字母[/color]
IF j% > 25 THEN j% = j% + 6 '[color=FF00FF]26-51是小写字母[/color]
s$ = s$ + CHR$(j% + 65) '[color=FF00FF]把数值转换成字母字符[/color]
NEXT
PRINT s$
s$ = UCASE$(s$) '[color=FF00FF]把所有小写字母换成大写[/color]
DIM p%(26) '[color=FF00FF]定义数组,记录某个字母出现的次数[/color]
FOR i% = 1 TO LEN(s$)'[color=FF00FF]用一个高级的词组:“遍历”字符串[/color]
j% = ASC(MID$(s$, i%, 1)) - 64 '[color=FF00FF]计算下标,A为1,B为2,Z为26[/color]
p%(j%) = p%(j%) + 1 '[color=FF00FF]该字母个数加一[/color]
NEXT
FOR i% = 1 TO 26 '[color=FF00FF]二十六个字母[/color]
m% = 0
k% = 0
FOR j% = 1 TO 26
IF p%(j%) > m% THEN '[color=FF00FF]找出个数最多的字母[/color]
m% = p%(j%) '[color=FF00FF]字母个数[/color]
k% = j% '[color=FF00FF]是第几个字母[/color]
END IF
NEXT
z$ = z$ + CHR$(64 + k%) '[color=FF00FF]把出现最多的字母加入排列[/color]
p%(k%) = 0 '[color=FF00FF]把它的个数清零,下一圈最多数就没它份了[/color]
NEXT
PRINT z$
3 楼
梧桐秋雨1229 [专家分:0] 发布于 2006-01-13 19:35:00
MOZ,不知道这样作是否可以?
dim p(26)
randomize
l=rnd*16383
for i=1 to l
j=rnd*58+65
if j>=97 then
a$=chr$(j-32)
else
if j<91 then then
a$=chr$(j)
end if
end if
s$=s$+a$
next i
print s$
for i=1 to l
b$=mid$(s$,i,1)
k=asc(b$) mod 65+1
p(k)=p(k)+1
next i
然后是排序的程序段?不知道是否可以?感觉这样好象比较容易理解一些,请指教哦,呵呵,谢谢
4 楼
moz [专家分:37620] 发布于 2006-01-13 22:34:00
>=97
<91
那中间的不用管了?
mod 65 + 1 与 -64 有什么区别?
5 楼
梧桐秋雨1229 [专家分:0] 发布于 2006-01-14 16:46:00
中间的是特殊字符啊,题目是不考虑的呀
6 楼
moz [专家分:37620] 发布于 2006-01-14 18:26:00
那么再想一想这个时候a$等于什么值,对s$会不会有影响?
7 楼
梧桐秋雨1229 [专家分:0] 发布于 2006-01-14 22:25:00
A$对S$的影响?想不到,呵呵
8 楼
moz [专家分:37620] 发布于 2006-01-15 10:41:00
当j=95的时候
a$的值没变,还是上一次的字符,
s$的末端又重复了一个a$
对这个程序的结果来说并没有大的错误
但对写程序的人来说,这算是一个忽略的地方。
我来回复