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

博客围绕VFP编程展开,涉及索引操作,按索引逻辑顺序显示表中数据,还介绍遍历表数据、添加删除标记及物理删除的操作。此外,讲解了str()函数用法,以及计算阶乘累加和的题目思路,同时提及多个VFP编程题目但部分有问题或被放弃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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  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
复制代码
  • 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+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 on
return
复制代码
  • 007(水仙花)

set talk off
clear
sum = 0
for 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   /*固定模板*/
	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.,假*/
		    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 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 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
    endfor
endfor
for i = 1 to 6  /*将刚刚填到数组里面的数值打印在屏幕上*/
    for j = 1 to i
        ??str(a(i,j),2)  /*两个问号意思是不换行输出,str()是为了让输出结果的样子好看点*/
    endfor
?  /*单独的一个问号的作用是换行*/
endfor   
set talk on
return
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值