2. 准备测试数据

 

新建数据表存入文件 EmpInfo.txt,表中包括 5 个字段:ID 为自然数序号主键;Name 为姓名;Gender 为性别;Birthday 为生日。生成 1000 条随机数据,其中 Name 根据 Top500MaleNames.txt、Top500FemaleNames.txt 和 Top500Surnames.txt 这 3 个文件随机生成,男女各约占一半,Gender 为 M 或 F,随机生成;Birthday 为 1990~2005 年的随机日期。数据存储后从文件中读取为序表。要求采用两种方法:(1)使用 for 循环生成数据(2)在循环中使用子程序生成数据。

参考答案:

7

解答:

(1)

A B C
1 1000 500
2 =create(ID, Name, Gender, Birthday)
3 =file(“Top500MaleNames.txt”).import@i() =file(“Top500FemaleNames.txt”).import@i() =file(“Top500Surnames.txt”).import@i()
4 1990-1-1 2006-1-1 =B4-A4
5 for A1 =rands(“MF”,1) =C3(rand(B1)+1)
6 if B5==“M” >name=A3(rand(B1)+1)
7 else >name=B3(rand(B1)+1)
8 =A4+rand(C4) >A2.insert(0, A5, name+" " +C5, B5, B8)
9 =file(“EmpInfo.txt”) >A9.export@t(A2) =A9.import@t()

A1 准备生成的记录数,B1 为名字和姓资料库中的数目。在 A2 中创建空序表。第 3 行从资料库中读取信息。使用 @i 选项,可以将单列数据读为序列。第 4 行中用日期的起止点,在 C4 中计算出相差天数,准备用来生成随机生日。在 A5 中执行循环,每次生成一条数据,其中 B5 随机选择 MF 中 1 个字母作为性别,C5 中随机选择一个 Surname,根据不同的性别,在 C6 或 C7 中将随机的 Firstname 设入 name 变量。B8 中随机生成生日,在 C8 中根据各种信息在序表 A2 中增加一条新记录。循环完成后,B9 中将序表中数据存储到文件,存储文件时也可以使用 T()函数,即将 B9 中代码修改为 >T(“EmpInfo.txt”:A2)。在 C9 中可以看到读取后的结果,读取的结果和 A2 中是一致的。

(2)

A B C
1 1000 500 0
2 =create(ID, Name, Gender, Birthday)
3 =file(“Top500MaleNames.txt”).import@i() =file(“Top500FemaleNames.txt”).import@i() =file(“Top500Surnames.txt”).import@i()
4 1990-1-1 2006-1-1 =B4-A4
5 >A1.(newRec())
6 func newRec() =rands(“MF”,1) =C3(func(A10, B1))
7 if B6==“M” >name=A3(func(A10, B1))
8 else >name=B3(func(A10, B1))
9 =A4+rand(C4) >A2.insert(0, C1=C1+1, name+" " +C6, B6, B9)
10 func =rand(A10) =B10*B10\A10+1
11 =file(“EmpInfo.txt”) >A11.export@t(A2) =A11.import@t()

前 4 行的代码和前一种方式是一致的,A5 中按照所需的记录数循环调用 A6 中的子函数 newRec()。第 6~9 行为起始于 A6 的子程序,子函数命名为 newRec,作用是随机生成一条新记录添加到 A2 的序表中;特别的,在生成随机的名字序号时,调用了 A10 中的子程序,调用时设置了随机数的范围作为参数。第 10 行为起始于 A10 的子程序,作用是随机选择名字序号时,将其做x2/n的调整,使得排在前方的名字更容易被选中;调用子程序输入的参数会填入起始格,可以在计算中使用它的值,如果多于一个参数,会依次填入起始格的右侧,此时需要注意将其空出来。