-
001
-
说明
假定表中数据为:
姓名 学号 E 5 A 1 C 3 E 5 B 2 C 3 D 4 A 1 index on 学号 tag xh
执行此条命令过后,根据建立的索引里的逻辑顺序,表中数据如下显示(没有选择排序方式,所以默认为升序):索引是和表之间是映射关系~ ,并没改变表的记录,但是因为我们刚刚建立了索引,建立时索引会被默认打开,所以我们接下来的操作就可以按照索引里的逻辑顺序关系,我也不知道你会不会弄混~,要是混了就干脆理解为变了,嗯~ ,就酱,这段话先选择性忽略吧,如果你看到这里脑袋不太清,,清醒~
姓名 学号 A 1 A 1 B 2 C 3 C 3 D 4 E 5 E 5 程序从第1条记录开始遍历,比较第 n 和 n+1(n=1,2,3,...) 条记录学号是否相等,相等则对n+1记录添加删除标记;然后重复此操作直到文件末尾;
姓名 学号 A 1 * A 1 B 2 C 3 * C 3 D 4 E 5 * E 5 遍历结束过后使用
pack
命令物理删除添加标记内容; -
代码
&& 关闭程序运算的显示过程,一般大型程序的运算过程很多,为了方便,就大小程序都关闭显示;set talk off clear && 清屏,清除屏幕上之前的内容,只显示现在程序的运行结果;use xs && 打开xs 表 && 根据学号字段建立索引,使表中记录处于有序状态;index on 学号 tag xh && 对表中记录进行遍历;若记录指针已处于文件末尾,eof()为逻辑真(.t.),否则为逻辑假(.f.);do while !eof() xh = 学号 && 将此时指针指向记录的学号赋给变量 xh; skip && 记录指针跳转到下一条记录; if 学号 = xh && 判断现在指针指向记录的学号是否和上条记录相等,相等则为重复记录; delete && 对该重复记录添加删除标记; endifenddo pack && 对标记的记录进行理删除;use && 关闭当前打开的表;set talk on && 恢复到系统默认状态(打开状态),这两句命令可有可无,属于固定格式;复制代码
> 注释好像写的有点啰里啰嗦,将就看啦~ -.-复制代码
-
002
-
说明
这个题就是遍历表中数据,然后把记录依次打印在屏幕上~;你应该是
str(入学分,5,1)
这个不知道意思(如果那两个也不知道为什么的话就该挨捶了,呵);str()函数的用法,
str(a,b,c)
,将 a 代表的值转换为总长度为 b ,小数位数为 c 的字符串,转换过后函数的值为c,字符型;题里面意思,将入学分代表的记录转换成总长为5个字节,小数位1位的字符串; -
代码(注释的标志我换掉了,那个好丑哎~,现在这个注释不是VFP的标准,所以别弄混了,嗯,就酱)
set talk offclearuse xsda /*对谁操作就打开谁;*/do while !eof() ?姓名+性别+str(N,5,1) /* 这里的"+"是字符串的连接符,之前给你说过的","也是连接符,他可以 进行不同类型的连接,比如*?"计算结果=",sum*,从题目里可以看到 姓名和性别都是C,字符型数据,学分是N,数值型,加号只是字符型 数据的连接符,所以通过str()函数将数值型转为字符型;*/ skipenddouseset talk on复制代码
-
003
-
说明
S = 1! + 2! +3! + 4! + 5! + ... + n! ,现在眼熟了吧,咸鱼~
题目中把头部和尾部换成 K 和 M ,将用户输入的数据作为计算边界;
之前说的遇到这种样子的就先写一个计算单个阶乘的通用程序,然后再使用这个程序去计算不同的值得阶乘,最后将他们的结果加起来(从1加到100的那个模板);
现在看题,题里有提到用了一个过程,就理解为这是一个独立的小程序好了,他的代码把刚刚提到的计算单个阶乘的通用程序放到了过程里,使用的时候每次调用这个小程序来计算不同的值得阶乘;
-
代码
在VFP里大小写不影响代码的执行;
set talk offclearinput "输入k值:" to kinput "输入m值:" to mstor 0 to s,p /* 下面的代码里使用了S和P,但是没有发现他们的定义,所以这一行要对变量进行定 义,因为这里只有空了一行,所以只能用store命令同时定义s,p并一起赋初值0;*/for n = k to m do sub with n,p /*过程的固定调用格式,do <过程名> with <参数1> , <参数2> 这里参数的格式要按照下面定义过程时形参的格式,参数个数与形参相等;*/ s = s + p /*固定模板,下次不注释这句了;*/endfor?"s的值为:",s /*输出计算的结果;*/ return proc sub /*过程的固定使用方法,proc后面跟过程名*/ para x,y /*这里个单词后面是形参,那天给你说过的~ (单词太长,只写了前四个字母) 不影响结果;*/ y = 1 /*定义一个变量y来接收结果,并给y赋值1;(因为这里是求阶乘,所以初值不能赋0)*/ for t = 1 to x y = y * t /*固定模板下次不注释这句了;*/ endfor return /*返回到调用函数的下一条语句;和自定义函数有区别,上次的那个题是自定义函 数,可以附带返回值;(见程序改错1-2,好像是那里,有空翻一眼咯~)*/endproc /*固定格式,嗯!*/set talk on复制代码 参数2> 参数1> 过程名>
-
004 (这个程序有问题,先不管了)
set talk offclearuse ghxxindex on 单位编号 tag dwbhtotal to xb on 单位编号 fields 数量,单价 all asceuse xbselect 0use dwxxdo while !eof()select dwxxreplace 商品总量 with xb.数量 for 单位编号 = xb.单位编号 replace 货款总额 with xb.单价 for 单位编号 = xb.单位编号skipenddoclose allset talk onreturn 复制代码
-
005(吃馍)
set talk off clear /*找遍所有可能的组合*/for i = 1 to 34 /*大和尚*/ for j = 1 to 50 /*中和尚*/ k = 100-i-j /*小和尚*/ if i*3+j*2+k/3=100 ?"大和尚数量=",str(i,2),"中和尚数量=",str(j,2),"小河上数量=",str(k,2) endif endfor endforset talk onreturn复制代码
-
006 (统计字符)
set talk offclearacce "please input:" to ch stor 0 to a,b,c,ds = ""for i = 1 to len(ch) /*len(),这个函数功能统计输入的字符串长度*/ s = substr(ch,i,1) /*取第i个字符出来进行判断*/ do case /*'a'~'z'和'A'~'Z'是所有字母的取值范围*/ case (s >= 'a' and s <= 'z ') or (s >= 'A' and s <= 'Z ') a = a+1 case s >= '0' and s <= '9 ' /*因为输入是字符类型,所以就算是数字,也不能用来加减乘除,所以这里要加引号*/ b = b+1 case s = " " c = c+1 other d = d+1 endcase /*中午记成enddo了,难怪一直错*/endfor?"字母个数=",str(a,2),"数字个数=",str(b,2),"空格个数=",str(c,2),"特殊字符个数=",str(d,2)set talk onreturn复制代码
-
007(水仙花)
set talk offclearsum = 0for i = 100 to 999 /*水仙花数都是位数,所以在100~999范围里找*/ x1 = i%10 /*把每个位取出来*/ x2 = int(i/10)%10 x3 = int(i/100) if x1^3 + x2^3 +x3^3 = i sum = sum +i /*固定模板*/ endifendfor?sumset talk onreturn复制代码
-
008(末尾为3的素数)
set talk offclearf = .t. /*定义一个找到素数的标志,赋值为0*/for i = 2 to 100 /*素数的定义是大于1的自然数,所有从2开始找*/ for j = 2 to sqrt(i) if i % j = 0 /*每个数除以2~自己平方根范围内的数,能除尽就不是素数*/ f = .f. /*能除尽的时候,f重新赋值.f.,假*/ exit endif endfor if f = .t. and i%10=3 /*如果f和最开始不一样,那么代表这个时候的i在他的范围内*/ ?i /*被除尽了,所以此时i不是素数,反之,若f没有变化,则是素数*/ endif /*取出此时i的个位上的数字判断是不是3,输出结果*/f = .t. /*使用了f之后需要对标志f的值清零,也就是恢复原样*/endfor set talk onreturn复制代码
-
009(房子面积这个题,字太多懒得看,立即放弃)
-
010(打印很丑的图形的题)
set talk offcleardime a(6,6) /*定义一个二位数组a*/a= 0 /*初始化数组的值,因为之后要用到加法运算*/x=0y=0 /*这两个东西出现的原因是vfp糟糕的用户体验,这样写a(i,j)=a(i-1,j-1)就会报错,所以添加一个中间变量过渡一下*/for i = 1 to 6 /*把需要打印的图形的值按位置填到二维数组里*/ for j = 1 to i if j=1 or i=j /*如果是第一列,或者行数等于列数就给这些格子里填1*/ a(i,j)=1 else /*否则,(也就是剩下的所有格子)按照下面的规则赋值,(举个栗子:a32 = a21 + a22)*/ x = i-1 y = j-1 a(i,j) = a(x,y) + a(x,j) endif endforendforfor i = 1 to 6 /*将刚刚填到数组里面的数值打印在屏幕上*/ for j = 1 to i ??str(a(i,j),2) /*两个问号意思是不换行输出,str()是为了让输出结果的样子好看点*/ endfor? /*单独的一个问号的作用是换行*/endfor set talk onreturn复制代码