回 帖 发 新 帖 刷新版面

主题:MOZ快来,谢谢!!!!

上次问你的问题是这样的:让计算机随机产生一段英文字母(大小写均有),编程将大小写英文字母全部转换成大写英文字母,然后按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个回复)

沙发

1. randomize timer 是预置随机数的种子
2. 一个可变长的字符串一般最大可以到32767的,但我一般情况下为了少出错,只限制到16383个字符就好了,rnd是一个大于等0小于1的随机数,也就是获得一个不大于16383的整数.
3. 数组p()是获得某个字母出现的次数(而不是概率).
4. 有时间再解释吧,时间太小了.

板凳

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 楼

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 楼

>=97
<91
那中间的不用管了?
mod 65 + 1  与  -64  有什么区别?

5 楼

中间的是特殊字符啊,题目是不考虑的呀

6 楼

那么再想一想这个时候a$等于什么值,对s$会不会有影响?

7 楼

A$对S$的影响?想不到,呵呵

8 楼

当j=95的时候
a$的值没变,还是上一次的字符,
s$的末端又重复了一个a$
对这个程序的结果来说并没有大的错误
但对写程序的人来说,这算是一个忽略的地方。

我来回复

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