人人范文网 范文大全

一级程序(教学用)VFP

发布时间:2020-03-01 18:49:36 来源:范文大全 收藏本文 下载本文 手机版

第一部分:程序入门

一级

一、选择结构( IF- ELSE - ENDIF) 语句格式:IF〈条件〉

〈语句序列1〉 [

ELSE 〈语句序列2〉] ENDIF 说明:IF和ENDIF必须配对使用,而ELSE可选。三个语句应各占一行。 若省略ELSE子句,条件为真时,则执行〈语句序列1〉,然后再执行ENDIF后的语句;否则,若条件为假,即执行ENDIF后的语句。

二、循环结构

1、条件循环: 语句格式:

DO WHILE 〈条件表达式〉

〈语句序列1〉

[ LOOP]

〈语句序列2〉

[ EXIT ]

〈语句序列3 〉 ENDDO 说明:系统执行该语句时,先测试条件表达式的值,若为真,则执行循环体,在循环体中修改循环条件,直到条件为假时,脱离循环,执行循环体ENDDO后的语句。若遇到LOOP语句,则直接返回执行DO语句,测试条件以决定是否继续循环。若执行循环体时遇到EXIT语句,则不执行下面的语句,直接跳出循环,执行ENDDO后面的语句。

注意:DO WHILE

必须和ENDDO配合使用,两者缺一不可,DO WHILE语句前一定要有条件变量的初始值。

2、计数循环

FOR 〈循环变量〉=〈循环初值〉TO 〈循环终值〉[STEP〈步长〉]

〈语句序列1〉

[LOOP]

〈语句序列2〉

[EXIT]

〈语句序列3〉 ENDFOR/NEXT 说明:使用和DO WHILE 基本一致,注意步长和ENDFOR语句。

三、程序举例:

A.

Eg:求出[10,100]内所有能被2整除的整数的和(2530),个数(46) set talk off clear 简单整除,求和求个数。n=0 &&设置计数变量 s=0 &&设置求和变量 I=10 &&设置循环变量

Do while I

n=n+1 &&满足条件计数变量加1

s=s+i &&满足条件,求和变量增加 endif &&结束条件

1 I=I+1

&&循环变量累加

Enddo &&此句使循环回到 do while 处 ? n,s &&输出结果 set talk on return

A1.求出[10,100]内所有能被7和9中至少一个数整除的整数的个数(22),和(1250).A2.求出[10,100]内所有能被7但不能被9整除的整数的个数(12), (665)

A3.求出[10,100]内所有能被7和9中的一个且只有一个数整除的整数的个数(21),(1187)

A4.编写程序,求出1~7000以内能被3或者7整除的数的个数(3000)。 A5.编写程序,求[1,500]既能被6整除又能被7整除的数之和。(2772) A6.求前[1,100]内能被6或8整除的所有自然数的平方根的和(将第1位小数四舍五入,结果只保留整数)。(162)

A7.将大于1000且能被3和5中至少一个数整除的所有整数按从小到大顺序排列后,求前面20个数之和。 (20465) set talk off clear k=1 s=0 &&设置求和变量 x=1000 do while k

k=k+1 endif enddo ? s set talk on return

A9 将小于2000且能被4和6中至少一个数整除的所有整数按从小到大顺序排列后,求最后20个数之和。 (39390) B类: 简单余数

Eg: 编写程序,求出100到500之间同时满足除5余4和除7余2条件的数的个数及和。(12 ) (3678) Set talk off S=0 N=0 I=100 Do while I

B!.编写程序,求在10~1000之间所有能被4除余2,被7除余3,被9除余5的数之和。2000 B2.求出[200,800]内被除3余1并且被除5余3的整数的和。20020

2

C类:退出控制

Eg: 编写程序,求出1到6000之间的能被5整除的前若干个偶数之和,当和值大于650时退出并输出和值。660 Set talk off S=0 For I=1 to 6000

If mod(I,5)=0 and mod(I,2)=0 S=s+I Endif If s>650 Exit Endif Endf ?s

C1: 编写程序,求出1到5000之间的能被7整除的前若干个数之和,当和值大于等于1500时退出并输出和值。1617 C2: 编写程序,已知:S=2+4+8+16+32+„,求S不大于980的最大值。510 Set talk off S=0 For I =1 to 1000 X=2*i S=s+x ?x,s If s>980 Exit Endif Endf ?s-x

C3: 编写程序,已知:S=1+3+5+7+9+„,求S不大于1000的最大值。961 C4: 编写程序,已知:S=2+4+8+16+32+„,求S不大于9000的最大值。8190 C5 .已知数列:1,2,4,7,11,16,„,其规律是相邻两项之差依次是1,2,3,4,5,„。试求出此数列中大于5000的最小的项。5051 C6.求出50以内最大的自然数n,使得从1开始的连续n个自然数的倒数之和小于3.5。(18) set talk off clear s=0 for n=1 to 50 s=s+1/n &&先求倒数再求和 if s>=3.5 exit

&&退出循环

endif endfor ? n-1 &&为什么? return

C7: 求出50以内最小的自然数n,使得从1开始的连续n个自然数的倒数之和大于3.6 (21) C8: 求出50以内最小的自然数n,使得从1开始的连续n个自然数的立方和小于20000 (16)

C9.求出50以内最大的自然数n,使得从101开始的连续n个奇数之和小于2000。(17) set talk off clear

3 s=0 for n=1 to 50 a=99+2*n s=s+a if s>2000 exit endif endfor ? n-1

return

C10.求出100以内使得算式1/(1*2)+1/(2*3)+„+1/(n*(n+1))的值小于0.952的最大的自然数n。 19

C11.某国在2000年时人口总数为1亿,若以每年3%的速度递增,试求出至少要到哪一年该国人口总数才会翻一翻。2024 set talk off clear s=1 for n=2001 to 2100 s=s*1.03 if s=2 &&应改为 if s>=2 loop &&应改为

exit endif endfor ? n set talk on return

C12.某国今年的人口总数为1亿,若以每年4%的速度递增,试求出至少要再过几年该国人口总数才会翻一翻。18 C13.一球从100米高处落至平地,并且连续多次再反弹再落下,假设每次反弹的高度都是前一高度的3/4倍,试求出最小的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程超过678米。13 set talk off clear h=100 s=0 应改为: s=100 for n=2 to 100 h=h*3/4 s=s+h 应改为: s=s+2*h if s>678 exit endif endfor ? n set talk on return C14 .一球从100米高处落至平地,并且连续多次再反弹再落下,假设每次反弹的高度都是前一高度的3/4倍,试求出最大的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程不超过590米。6

第二部分:算法举例

D类:多循环控制

4 穷举法:穷举法就是将所有可能的方案都一一测试,找出其中符合指定要求的。

Eg.把一张一元钞票,换成一分、二分和五分硬币,每种至少1枚,问有多少种方案?(461)

set talk off clea n=0 for yi=1 to 100 && 1分的最少1枚,最多100枚。 for er=1 to 50

for wu=1 to 20 if yi+er*2+wu*5=100 n=n+1 endif endfor endfor endfor ? n set talk on return

d1.把一张一元钞票,换成一分、二分和五分硬币,每种至少1枚,问兑换后硬币总数最多的与硬币总数最少的枚数之差是多少?(73) d2.把一张一元钞票,换成一分、二分和五分硬币,每种至少1枚,问兑换后其中 二分的硬币恰有20枚的方案共有多少种? (11) d3.有60个学生一起买小吃,共花钱100元,其中每个大学生花3元,

每个中学生花2元,每个小学生花1元,问大、中、小学生的人数分配共有多少种

不同的解(去掉某类学生为0的)? 19

D4.有5羊4犬3鸡2兔值钱1496,4羊2犬6鸡3兔值钱1175,3羊1犬7鸡5兔值钱958,2羊3犬5鸡1兔值钱861,求兔值多少钱?(鸡13, 兔29 犬121, 羊177) (修改并调试下列程序)

set talk off for y=1 to 300

for c=1 to 400 for j=1 to 500 for t=1 to 400 if 5*y+4*c+3*j+2*t=1496 and 4*y+2*c+6*j+3*t=1175;

3*y+1*c+7*j+5*t=958 and 2*y+3*c+5*j+1*t=861 ? y,c,j,t endif endf endf

endf

endf set talk on

E类:简单位数运算

Eg:编写程序,求三位数的奇数中,所有各位数字之和是15的倍数的数的和。19731 Set talk off S=0 For I=100 to 999 A=int(I/100) B=int(mod(I,100)/10)

5 C=mod(I,10) If mod(I,2)=1 and mod(a+b+c,15)=0 S=s+I Endif Endf ?s

e1: 编写程序,求三位数的奇数中,所有各位数字之和是12的倍数的数的个数。38 e2: 编写程序,求三位数的偶数中,所有各位数字之和是15的倍数的数的个数。34 e3: 编写程序,计算在0~50的范围内有多少个数,其每位数的乘积小于每位数的和。26 e4: 编写程序,计算1000以内有多少个这样的数,其个位数为6且该数能被9整除。11 e5: 编写程序,统计200~400之间的所有满足三个数字之积为42,三个数字之和为12的数的个数 4 e6: 编写程序,求四位数的偶数中,所有各位数字之和是24的倍数的数的个数。187 set talk off n=0 for I=1000 to 9999 a=int(i/1000) b=int(mod(I,1000)/100) c=int(mod(I,100)/10) d=mod(I,10) if mod(I,2)=0 and mod(a+b+c+d,24)=0

n=n+1 endif endf ?n

e7: 编写程序,求四位数的奇数中,所有各位数字之积(且不为0)是125的倍数的数的和。 161095 e8: 编写程序,求在四位数的偶数中,所有各位数字之积(且不为0)是18的倍数的数的和。8638596 e9: 编写程序,计算100-10000以内个位上的数小于百位上的数的所有数之和。23314500 (改错并调试下列程序) set talk off clea n=100 for i=100 to 10000 bw=mod(i,1000) gw=mod(i,10) if gw

F类:回文数

Eg:所谓回文数是从左至右与从右至左读起来都是一样的数字,如:121是一个回文数。编写程序,求出100-200的范围内所有回文数的和。1460 Set talk off S=0 For I=100 to 200 A=int(i/100) B=int(mod(I,100)/10) c=mod(I,10)

6 If a=c S=s+i endif endf ?s f1: 所谓回文数是从左至右与从右至左读起来都是一样的数字,如:121是一个回文数。编写程序,求在100-900的范围内所有能被3整除的回文数的个数。26 f2: 所谓回文数是从左至右或从右至左读起来都是一样的数字,如:121是一个回文数。编写程序,计算从1981年开始到3000年为止,共有多少个年号是回文数年号。11 f3: 求出[123,456]内恰好有两个数字相同的所有整数之和。26406 (改正并调试下列程序) set talk off clear s=0 for x=123 to 456 a=int(x/100) b=int((x-a*100)/10) c=mod(x,1) if a=b and a!=c or a!=b and a=c s=s+x endif endfor ? s set talk on return

G 类:水仙花数

Eg: “水仙花数”是指这样的数,其各位数字的立方和等于该数本身。编写程序求100至400的范围内有多少个水仙花数。3 Set talk off n=0 For I=100 to 400 A=int(i/100) B=int(mod(I,100)/10) c=mod(I,10) If a^3+b^3+c^3=i N=n+1 endif endf ?n

g1: \"水仙花数\"是指这样的数,其各位数字的立方和等于该数本身。编写程序求100至999的范围内有多少个水仙花数。4 g2: \"水仙花数\"是指这样的数,其各位数字的立方和等于该数本身。编写程序,计算从100年开始到2000年为止,共有多少个年号是水仙花数年号。4 g3: 设某四位数的各位数字的平方和等于198,问满足这种条件的最大数和最小数之和是多少?12749 (改正并调试下列程序) set talk off clea min1=1000 max1=1000 for x=1000 to 9999 a=int(x/1000)

7 b=int((x-a*1000)/100) c=int(x/100)/10 d=mod(x,10) if a*a+b*b+c*c+d*d=198 if max1x min1=x endif endif endfor ? max1+min1 set talk on return

H类:位数及多条件运算

Eg: 编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是8的倍数,且A+B=B+C,即第1位数加上第2位数等于第2位数加上第3位数。110 set talk off n=0 for I=1000 to 9999 a=int(i/1000) b=int(mod(I,1000)/100) c=int(mod(I,100)/10) d=mod(I,10) if mod(I,8)=0 and a+b=b+c

n=n+1 endif endf ?n

h1: 编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是18的倍数,且C=7,A+B=C+D,即第1位数加上第2位数等于第3位数加上第4位数。9 h2: 编写程序,统计1000~9999之间的所有满足以下条件的四位数的个数。该四位数是一个完全平方数,且其第1位与第3位数字之和为10,第2位与第4位数字之积为12。2 set talk off n=0 for I=1000 to 9999 a=int(i/1000) b=int(mod(I,1000)/100) c=int(mod(I,100)/10) d=mod(I,10) if a+c=10 and b*d= 12 and int(sqrt(i))=sqrt(i) &&注意判定完全平方数

n=n+1 ? i endif endf ?n

h3: 编写程序,统计1000~9999之间的所有满足以下条件的四位数的个数。该数是一个完全平方数,且其第

1、2位数字之和为10,第

3、4位数字之积为18。1 h4: 求满足条件A*B=54321且使A+B的值最小的自然数对A、B中较大的一个数。(提示:设A

8 set talk off clear c=54321 k=int(sqrt(c)) for a=1 to k b=int(c/a) if a*b=c max=b endif endfor ? max set talk on return h5: 求满足条件A*B=54321的所有自然数对A、B对应的A+B的最小值。(提示:设A

&&余数是下次运算时的被除数 endfor ? n set talk on return

h7: 求出将十进制整数98765432等值转换为二进制形式表示后其中数字0的个数。(提示:模拟人工计算的“2除取余”法)14 h8: 求出将十进制整数99887766554等值转换为十六进制形式表示后其中字母C的个数。(提示:模拟人工计算的“16除取余”法)2 h9: 对自然数A、B、C,若A

if a*a+b*b=c*c and a

&&排除A、B交换的情况。

n=n+1 endif endfor ? n set talk on return h10: 对自然数A、B、C,若A

9 中A、B、C分别称为勾、股、弦。试求出弦为1300的勾股弦组数。7 h11: 求方程3x-7y=1在条件|x|0 and min>z &&取最小值并保证都是正数解 ?min min=z endif endfor ? min set talk on return h14: 求方程9x+4y=2000的所有正整数解的|x-y|的最大值。487 h15: 找满足以下条件: X^2+Y^2=41^2 且X+Y之值最大的二个正整数X,Y, 求X+Y之值.49 h16: 对自然数A、B、C,若A

Eg: 编写程序,求一正整数等差数列的前三项的和,该数列前四项之和是

26、之积是880。15

10 clea set talk off for a1=1 to 7

for d=1 to 7 if a1+(a1+d)+(a1+2*d)+(a1+3*d)=26 and a1*(a1+d)*(a1+2*d)*(a1+3*d)=880 ?a1,d ?a1+(a1+d)+(a1+2*d) endif endf endf i1: 编写程序,求一正整数等差数列的前五项的立方和,该数列前四项之和是

26、之积是880。4720 i2: 已知数列:

1、

2、

4、

7、

10、

15、„,其特点是:相邻两项之差恰好构成自然数列:

1、

2、

3、

4、

5、„。求此数列的前100项中能被4整除的项的个数。25 (改正并调试下列程序) set talk off clear a=1 k=0 for n=1 to 100 a=a+n if mod(n,4)=0 k=k+1 endif endfor ? k set talk on return

J类:完数

Eg: 一个数如果刚好与它所有的因子之和相等,则称该数为一个\"完数\",如:6=1+2+3,则6就是一个完数。求出200到500之间所有的完数之和。496 set talk off clea s=0 for i=200 to 500 k=0 && k是因子的和变量

for a=1 to i-1 && a是I的真因子

if mod(i,a)=0

k=k+a

endif

endf if k=I && I的因子求完后,看因子和是否等于原来的数i ?I &&显示有几个完数

s=s+i endif endf ?s

j1: 一个数如果刚好与它所有的因子之和相等,则称该数为一个\"完数\",如:6=1+2+3,则6就是一个完数。求出1000以内的完数的个数。3 j2: 一个数如果刚好与小于它的所有因子之和相等,则称该数为一个“完数”,求出1000以内的所有完数的平方和。246836

K类:递推

Eg: 已知一个数列的前3个数为0,0,1,以后每个数为前3个数的和,编程序求此数列的第36个数。334745777 set talk off clea f1=0 f2=0 f3=1 for i=4 to 36 f4=f1+f2+f3 f1=f2 f2=f3 f3=f4 endf ?f4

k1: 已知一个数列的前3个数为1,2,3,以后每个数为前3个数的和,编程序求此数列的第20项 101902 k2: 已知一个数列的前3个数为3,4,5,以后每个数为前3个数的和,编程序求此数列的第33项.537346739 k3: 设一数列{f(n)}:f(1)=1,当n>1时f(n)=1/(f(n-1)+1)。试求出此数列的前20项中大于0.618的项的数目。15

(改正并调试下列程序) set talk off clear f=1.00000000 n=0 for k=2 to 20 f=1/f+1 if f>0.618 n=n+1 endif * ? k,f,n endfor ? n set talk on return

k4: 设有用26个字母表示的26个表达式:a=1,b=1/(a+1),c=1/(b+2),„,z=1/(y+25)。试求出这26个字母中其值小于0.1的字母个数。16 (改正并调试下列程序) set talk off clear lett=1 n=0 for k=1 to 26 lett=1/(lett+k) if lett

12

k5: 已知数列{f(n)}:f(1)=1,f(2)=4,当n=3,4,5,„时,f(n)=3*f(n-1)-f(n-2)。试求出100以内最大的自然数n使得此数列的前n项之和首次大于75364321。19 (改正并调试下列程序) set talk off clear dimension f(100) && 递推可能用数组的方法解决。 f(1)=1 f(2)=4 s=0 for n=3 to 100 f(n)=3*f(n-1)-f(n-2) s=s+f(n) if s

L类:因子

eg: 已知24有8个正整数因子(即:1,2,3,4,6,8,12,24),而24正好被其因子个数8整除。求[100,300]之间能被其因子数目整除的数的个数。19 set talk off clea c=0 && c是累计个数的。 for n=100 to 300 s=0 for i=1 to n && I是n的所有因子。 if mod(n,i)=0 s=s+1 && s是某个n的因子总个数 endif endfor if mod(n,s)=0 ?n c=c+1 endif endfor ? c set talk on return l1: 已知24有8个正整数因子(即:1,2,3,4,6,8,12,24),而24正好被其因子个数8整除。求[200,300]之间能被其因子数目整除的数中且能被3整除的数之和 1713 l2: 求出45678的所有非平凡因子(即除1和它本身以外的约数)中奇数的个数。7 (改正并调试下列程序) set talk off clear a=45678 n=0 for b=3 to a step 2 if mod(b,a)=0 n=n+1 endif endfor

13 ? b set talk on return

M类:最大公约数

Eg: 求出179869和196037的最大公约数。2021 set talk off clear a=179869 b=196037 c=0 for d=2 to a if mod(a,d)=0 and mod(b,d)=0 c=max(c,d) ?c endif endfor set talk on return m1: 求出20677和42067的最大公约数 713

N类:最小公倍数

Eg: 求出9269和8671的最小公倍数。[ 算法提示:a与b的最小公倍数是a的倍数中第1个被b整除的数 ] 268801 set talk off clear a=9269 b=8671 for k=a to a*b step a &&为什么? if mod(k,b)=0 exit

&&为什么保证了最小公倍数。 endif endfor ? k set talk on return

O类:素数

素数函数:

function p para x

flag=1

for k=2 to int(sqrt(x))

if mod(x,k)=0

flag=0

exit

endi

endf

retu flag

Eg : 编写程序,求出3到200之间的所有非偶数非素数的数之和。5774

14 clea set talk off s=0 for i=3 to 200 if

p(i)=0 and mod(i,2)=1 s=s+i endif endf ?s

function p para x

flag=1

for k=2 to int(sqrt(x))

if mod(x,k)=0

flag=0

exit

endi

endf

retu flag o1: 编写程序,求出3到100之间的所有非偶数非素数的数的个数。25 o2: 所谓素数是指这样的自然数,除1和它本身外不再有其它因子。编写程序,计算从1981年开始到3000年为止,我们将遇到多少个素数年号。131 o3: 梅森尼数是指能使2^n-1为素数的数n,求[1,21]范围内的梅森尼数的个数?14 (改正并调试下列程序) set talk off clea n=0 s=2 for x=2 to 21 s=s*2 flag=1 for i=1 to int(sqrt(x)) if mod(s-1,i)=0 flag=0 exit endif endfor if flag=0 n=n+1 endif endfor ? n return

vfp程序题总结

VFP读程序选择题

vfp教学实例

VFP程序设计教学反思

VFP命令、函数及程序语句解读

一级建造师报名程序

vfp教学大纲

数据库VFP教学体会(推荐)

《用解析法设计程序》教学设计

一级建造师具体报名程序

一级程序(教学用)VFP
《一级程序(教学用)VFP.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档