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的调整,使得排在前方的名字更容易被选中;调用子程序输入的参数会填入起始格,可以在计算中使用它的值,如果多于一个参数,会依次填入起始格的右侧,此时需要注意将其空出来。
英文版