欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

那几个题(没懂的地方留言)

发布时间:2024/9/21 编程问答 60 豆豆
生活随笔 收集整理的这篇文章主要介绍了 那几个题(没懂的地方留言) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
  • 001

  • 说明

    假定表中数据为:

    姓名学号
    E5
    A1
    C3
    E5
    B2
    C3
    D4
    A1

    index on 学号 tag xh 执行此条命令过后,根据建立的索引里的逻辑顺序,表中数据如下显示(没有选择排序方式,所以默认为升序):

    索引是和表之间是映射关系~ ,并没改变表的记录,但是因为我们刚刚建立了索引,建立时索引会被默认打开,所以我们接下来的操作就可以按照索引里的逻辑顺序关系,我也不知道你会不会弄混~,要是混了就干脆理解为变了,嗯~ ,就酱,这段话先选择性忽略吧,如果你看到这里脑袋不太清,,清醒~

    姓名学号
    A1
    A1
    B2
    C3
    C3
    D4
    E5
    E5

    程序从第1条记录开始遍历,比较第 n 和 n+1(n=1,2,3,...) 条记录学号是否相等,相等则对n+1记录添加删除标记;然后重复此操作直到文件末尾;

    姓名学号
    A1
    * A1
    B2
    C3
    * C3
    D4
    E5
    * E5

    遍历结束过后使用pack命令物理删除添加标记内容;

  • 代码

&& 关闭程序运算的显示过程,一般大型程序的运算过程很多,为了方便,就大小程序都关闭显示; set talk off clear && 清屏,清除屏幕上之前的内容,只显示现在程序的运行结果; use xs && 打开xs 表&& 根据学号字段建立索引,使表中记录处于有序状态; index on 学号 tag xh && 对表中记录进行遍历;若记录指针已处于文件末尾,eof()为逻辑真(.t.),否则为逻辑假(.f.); do while !eof() xh = 学号 && 将此时指针指向记录的学号赋给变量 xh;skip && 记录指针跳转到下一条记录;if 学号 = xh && 判断现在指针指向记录的学号是否和上条记录相等,相等则为重复记录;delete && 对该重复记录添加删除标记;endif enddo pack && 对标记的记录进行理删除; use && 关闭当前打开的表; set talk on && 恢复到系统默认状态(打开状态),这两句命令可有可无,属于固定格式; 复制代码> 注释好像写的有点啰里啰嗦,将就看啦~ -.- 复制代码
  • 002

  • 说明

    这个题就是遍历表中数据,然后把记录依次打印在屏幕上~;你应该是str(入学分,5,1)这个不知道意思(如果那两个也不知道为什么的话就该挨捶了,呵);

    str()函数的用法,str(a,b,c),将 a 代表的值转换为总长度为 b ,小数位数为 c 的字符串,转换过后函数的值为c,字符型;题里面意思,将入学分代表的记录转换成总长为5个字节,小数位1位的字符串;

  • 代码(注释的标志我换掉了,那个好丑哎~,现在这个注释不是VFP的标准,所以别弄混了,嗯,就酱)

set talk off clear use xsda /*对谁操作就打开谁;*/ do while !eof()?姓名+性别+str(N,5,1)/* 这里的"+"是字符串的连接符,之前给你说过的","也是连接符,他可以进行不同类型的连接,比如*?"计算结果=",sum*,从题目里可以看到 姓名和性别都是C,字符型数据,学分是N,数值型,加号只是字符型数据的连接符,所以通过str()函数将数值型转为字符型;*/skip enddo use set talk on 复制代码
  • 003

  • 说明

    S = 1! + 2! +3! + 4! + 5! + ... + n! ,现在眼熟了吧,咸鱼~

    题目中把头部和尾部换成 KM ,将用户输入的数据作为计算边界;

    之前说的遇到这种样子的就先写一个计算单个阶乘的通用程序,然后再使用这个程序去计算不同的值得阶乘,最后将他们的结果加起来(从1加到100的那个模板);

    现在看题,题里有提到用了一个过程,就理解为这是一个独立的小程序好了,他的代码把刚刚提到的计算单个阶乘的通用程序放到了过程里,使用的时候每次调用这个小程序来计算不同的值得阶乘;

  • 代码

    在VFP里大小写不影响代码的执行;

set talk off clear input "输入k值:" to k input "输入m值:" to m stor 0 to s,p /* 下面的代码里使用了S和P,但是没有发现他们的定义,所以这一行要对变量进行定义,因为这里只有空了一行,所以只能用store命令同时定义s,p并一起赋初值0;*/ for n = k to mdo 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 /*固定模板下次不注释这句了;*/endforreturn /*返回到调用函数的下一条语句;和自定义函数有区别,上次的那个题是自定义函数,可以附带返回值;(见程序改错1-2,好像是那里,有空翻一眼咯~)*/ endproc /*固定格式,嗯!*/ set talk on 复制代码
  • 004 (这个程序有问题,先不管了)

set talk off clear use ghxx index on 单位编号 tag dwbh total to xb on 单位编号 fields 数量,单价 all asce use xb select 0 use dwxx do while !eof() select dwxx replace 商品总量 with xb.数量 for 单位编号 = xb.单位编号 replace 货款总额 with xb.单价 for 单位编号 = xb.单位编号 skip enddo close all set talk on return 复制代码
  • 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 endfor set talk on return 复制代码
  • 006 (统计字符)

set talk off clear acce "please input:" to ch stor 0 to a,b,c,d s = "" 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+1case s >= '0' and s <= '9 ' /*因为输入是字符类型,所以就算是数字,也不能用来加减乘除,所以这里要加引号*/b = b+1case s = " "c = c+1otherd = d+1endcase /*中午记成enddo了,难怪一直错*/ endfor ?"字母个数=",str(a,2),"数字个数=",str(b,2),"空格个数=",str(c,2),"特殊字符个数=",str(d,2) set talk on return 复制代码
  • 007(水仙花)

set talk off clear sum = 0 for i = 100 to 999 /*水仙花数都是位数,所以在100~999范围里找*/x1 = i%10 /*把每个位取出来*/x2 = int(i/10)%10x3 = int(i/100)if x1^3 + x2^3 +x3^3 = isum = sum +i /*固定模板*/endif endfor ?sum set talk on return 复制代码
  • 008(末尾为3的素数)

set talk off clear f = .t. /*定义一个找到素数的标志,赋值为0*/ for i = 2 to 100 /*素数的定义是大于1的自然数,所有从2开始找*/for j = 2 to sqrt(i) if i % j = 0 /*每个数除以2~自己平方根范围内的数,能除尽就不是素数*/f = .f. /*能除尽的时候,f重新赋值.f.,假*/exitendifendforif f = .t. and i%10=3 /*如果f和最开始不一样,那么代表这个时候的i在他的范围内*/?i /*被除尽了,所以此时i不是素数,反之,若f没有变化,则是素数*/endif /*取出此时i的个位上的数字判断是不是3,输出结果*/ f = .t. /*使用了f之后需要对标志f的值清零,也就是恢复原样*/ endfor set talk on return 复制代码
  • 009(房子面积这个题,字太多懒得看,立即放弃)

  • 010(打印很丑的图形的题)

set talk off clear dime a(6,6) /*定义一个二位数组a*/ a= 0 /*初始化数组的值,因为之后要用到加法运算*/ x=0 y=0 /*这两个东西出现的原因是vfp糟糕的用户体验,这样写a(i,j)=a(i-1,j-1)就会报错,所以添加一个中间变量过渡一下*/ for i = 1 to 6 /*把需要打印的图形的值按位置填到二维数组里*/for j = 1 to iif j=1 or i=j /*如果是第一列,或者行数等于列数就给这些格子里填1*/a(i,j)=1else /*否则,(也就是剩下的所有格子)按照下面的规则赋值,(举个栗子:a32 = a21 + a22)*/x = i-1y = j-1a(i,j) = a(x,y) + a(x,j)endifendfor endfor for i = 1 to 6 /*将刚刚填到数组里面的数值打印在屏幕上*/for j = 1 to i??str(a(i,j),2) /*两个问号意思是不换行输出,str()是为了让输出结果的样子好看点*/endfor ? /*单独的一个问号的作用是换行*/ endfor set talk on return 复制代码

总结

以上是生活随笔为你收集整理的那几个题(没懂的地方留言)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。