整理VFP程序步骤.docx
《整理VFP程序步骤.docx》由会员分享,可在线阅读,更多相关《整理VFP程序步骤.docx(31页珍藏版)》请在冰豆网上搜索。
整理VFP程序步骤
第一部分:
程序入门
一级
一、选择结构(IF-ELSE-ENDIF)
语句格式:
IF〈条件〉
〈语句序列1〉
[ELSE
〈语句序列2〉]
ENDIF
说明:
IF和ENDIF必须配对使用,而ELSE可选。
三个语句应各占一行。
若省略ELSE子句,条件为真时,则执行〈语句序列1〉,然后再执行ENDIF后的语句;否则,若条件为假,即执行ENDIF后的语句。
二、循环结构
1、条件循环:
语句格式:
DOWHILE〈条件表达式〉
〈语句序列1〉
[ LOOP]
〈语句序列2〉
[EXIT]
〈语句序列3〉
ENDDO
说明:
系统执行该语句时,先测试条件表达式的值,若为真,则执行循环体,在循环体中修改循环条件,直到条件为假时,脱离循环,执行循环体ENDDO后的语句。
若遇到LOOP语句,则直接返回执行DO语句,测试条件以决定是否继续循环。
若执行循环体时遇到EXIT语句,则不执行下面的语句,直接跳出循环,执行ENDDO后面的语句。
注意:
DO WHILE 必须和ENDDO配合使用,两者缺一不可,DOWHILE语句前一定要有条件变量的初始值。
2、计数循环
FOR 〈循环变量〉=〈循环初值〉TO 〈循环终值〉[STEP〈步长〉]
〈语句序列1〉
[LOOP]
〈语句序列2〉
[EXIT]
〈语句序列3〉
ENDFOR/NEXT
说明:
使用和DOWHILE基本一致,注意步长和ENDFOR语句。
三、程序举例:
A.简单整除,求和求个数。
Eg:
求出[10,100]内所有能被2整除的整数的和(2530),个数(46)
settalkoff
clear
n=0&&设置计数变量
s=0&&设置求和变量
fori=10to100
ifmod(i,2)=0
n=n+1&&满足条件计数变量加1
s=s+i&&满足条件,求和变量增加
endif
endfor
?
n,s
settalkon
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)
A8.将大于1000且能被3和5中至少一个数整除的所有整数按从小到大顺序排列后,求前面20个数之和。
(20465)
settalkoff
clear
k=1
s=0&&设置求和变量
x=1000
dowhilek<=20
x=x+1
ifmod(x,3)=0ormod(x,5)=0
s=s+x&&满足条件,求和变量增加
k=k+1
endif
enddo
?
s
settalkon
return
A9将小于2000且能被4和6中至少一个数整除的所有整数按从小到大顺序排列后,求最后20个数之和。
(39390)
B类:
简单余数
Eg:
编写程序,求出100到500之间同时满足除5余4和除7余2条件的数的个数及和。
(12)(3678)
Settalkoff
S=0
N=0
ForI=100to500
Ifmod(I,5)=4andmod(I,7)=2
S=s+I
N=n+1
Endif
Endf
?
n,s
settalkon
return
B1、.编写程序,求在10~1000之间所有能被4除余2,被7除余3,被9除余5的数之和。
2000
B2.求出[200,800]内被除3余1并且被除5余3的整数的和。
20020
C类:
退出控制
Eg:
编写程序,求出1到6000之间的能被5整除的前若干个偶数之和,当和值大于650时退出并输出和值。
660
Settalkoff
S=0
ForI=1to6000
Ifmod(I,5)=0andmod(I,2)=0
S=s+I
Endif
Ifs>650
Exit
Endif
Endf
?
s
C1:
编写程序,求出1到5000之间的能被7整除的前若干个数之和,当和值大于等于1500时退出并输出和值。
1617
C2:
编写程序,已知:
S=2+4+8+16+32+…,求S不大于980的最大值。
510
Settalkoff
S=0
ForI=1to1000
X=2**i
S=s+x
?
x,s
Ifs>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)
settalkoff
clear
s=0
forn=1to50
s=s+1/n&&先求倒数再求和
ifs>=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)
settalkoff
clear
s=0
forn=1to50
a=99+2*n
s=s+a
ifs>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
settalkoff
clear
s=1
forn=2001to2100
s=s*1.03
ifs=2&&应改为ifs>=2
loop&&应改为exit
endif
endfor
?
n
settalkon
return
C12.某国今年的人口总数为1亿,若以每年4%的速度递增,试求出至少要再过几年该国人口总数才会翻一翻。
18
C13.一球从100米高处落至平地,并且连续多次再反弹再落下,假设每次反弹的高度都是前一高度的3/4倍,试求出最小的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程超过678米。
13
settalkoff
clear
h=100
s=0应改为:
s=100
forn=2to100
h=h*3/4
s=s+h应改为:
s=s+2*h
ifs>678
exit
endif
endfor
?
n
settalkon
return
C14.一球从100米高处落至平地,并且连续多次再反弹再落下,假设每次反弹的高度都是前一高度的3/4倍,试求出最大的自然数n,使得此球从开始下落至第n次着地时在垂直方向所经过的总路程不超过590米。
6
第二部分:
算法举例
D类:
多循环控制
穷举法:
穷举法就是将所有可能的方案都一一测试,找出其中符合指定要求的。
Eg.把一张一元钞票,换成一分、二分和五分硬币,每种至少1枚,问有多少种方案?
(461)
settalkoff
clea
n=0
foryi=1to100&&1分的最少1枚,最多100枚。
forer=1to50
forwu=1to20
ifyi+er*2+wu*5=100
n=n+1
endif
endfor
endfor
endfor
?
n
settalkon
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)
(修改并调试下列程序)
settalkoff
fory=1to300
forc=1to400
forj=1to500
fort=1to400
if5*y+4*c+3*j+2*t=1496and4*y+2*c+6*j+3*t=1175;
3*y+1*c+7*j+5*t=958and2*y+3*c+5*j+1*t=861
?
y,c,j,t
endif
endf
endf
endf
endf
settalkon
E类:
简单位数运算
Eg:
编写程序,求三位数的奇数中,所有各位数字之和是15的倍数的数的和。
19731
Settalkoff
S=0
ForI=100to999
A=int(I/100)
B=int(mod(I,100)/10)
C=mod(I,10)
Ifmod(I,2)=1andmod(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
settalkoff
n=0
forI=1000to9999
a=int(i/1000)
b=int(mod(I,1000)/100)
c=int(mod(I,100)/10)
d=mod(I,10)
ifmod(I,2)=0andmod(a+b+c+d,24)=0
n=n+1
endif
endf
?
n
e7:
编写程序,求四位数的奇数中,所有各位数字之积(且不为0)是125的倍数的数的和。
161095
e8:
编写程序,求在四位数的偶数中,所有各位数字之积(且不为0)是18的倍数的数的和。
8638596
e9:
编写程序,计算100-10000以内个位上的数小于百位上的数的所有数之和。
23314500
(改错并调试下列程序)
settalkoff
clea
n=100
fori=100to10000
bw=mod(i,1000)
gw=mod(i,10)
ifgwn=n+1
endif
endfor
?
n
return
F类:
回文数
Eg:
所谓回文数是从左至右与从右至左读起来都是一样的数字,如:
121是一个回文数。
编写程序,求出100-200的范围内所有回文数的和。
1460
Settalkoff
S=0
ForI=100to200
A=int(i/100)
B=int(mod(I,100)/10)
c=mod(I,10)
Ifa=c
S=s+i
endif
endf
?
s
f1:
所谓回文数是从左至右与从右至左读起来都是一样的数字,如:
121是一个回文数。
编写程序,求在100-900的范围内所有能被3整除的回文数的个数。
26
f2:
所谓回文数是从左至右或从右至左读起来都是一样的数字,如:
121是一个回文数。
编写程序,计算从1981年开始到3000年为止,共有多少个年号是回文数年号。
11
f3:
求出[123,456]内恰好有两个数字相同的所有整数之和。
26406
(改正并调试下列程序)
settalkoff
clear
s=0
forx=123to456
a=int(x/100)
b=int((x-a*100)/10)
c=mod(x,1)
ifa=banda!
=cora!
=banda=c
s=s+x
endif
endfor
?
s
settalkon
return
G类:
水仙花数
Eg:
“水仙花数”是指这样的数,其各位数字的立方和等于该数本身。
编写程序求100至400的范围内有多少个水仙花数。
3
Settalkoff
n=0
ForI=100to400
A=int(i/100)
B=int(mod(I,100)/10)
c=mod(I,10)
Ifa^3+b^3+c^3=i
N=n+1
endif
endf
?
n
g1:
"水仙花数"是指这样的数,其各位数字的立方和等于该数本身。
编写程序求100至999的范围内有多少个水仙花数。
4
g2:
"水仙花数"是指这样的数,其各位数字的立方和等于该数本身。
编写程序,计算从100年开始到2000年为止,共有多少个年号是水仙花数年号。
4
g3:
设某四位数的各位数字的平方和等于198,问满足这种条件的最大数和最小数之和是多少?
12749
(改正并调试下列程序)
settalkoff
clea
min1=1000
max1=1000
forx=1000to9999
a=int(x/1000)
b=int((x-a*1000)/100)
c=int(x/100)/10
d=mod(x,10)
ifa*a+b*b+c*c+d*d=198
ifmax1x=max1
endif
ifmin1>x
min1=x
endif
endif
endfor
?
max1+min1
settalkon
return
H类:
位数及多条件运算
Eg:
编写程序,求满足下列条件的所有四位数ABCD的个数,该四位数是8的倍数,且A+B=B+C,即第1位数加上第2位数等于第2位数加上第3位数。
110
settalkoff
n=0
forI=1000to9999
a=int(i/1000)
b=int(mod(I,1000)/100)
c=int(mod(I,100)/10)
d=mod(I,10)
ifmod(I,8)=0anda+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
settalkoff
n=0
forI=1000to9999
a=int(i/1000)
b=int(mod(I,1000)/100)
c=int(mod(I,100)/10)
d=mod(I,10)
ifa+c=10andb*d=12andint(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<=B,当A越大时A+B越小)953
settalkoff
clear
c=54321
k=int(sqrt(c))
fora=1tok
b=int(c/a)
ifa*b=c
max=b
endif
endfor
?
max
settalkon
return
h5:
求满足条件A*B=54321的所有自然数对A、B对应的A+B的最小值。
(提示:
设A<=B,当A越大时A+B越小)1010
h6:
设a=234,b=569,求a/b的精确值中小数点后前40位数字中数字8的个数。
(提示:
基于人工计算的思想)6
settalkoff
clear
a=234
b=569
n=0
fork=1to40
a=a*10
q=int(a/b)
ifq=8
n=n+1
endif
a=mod(a,b)&&余数是下次运算时的被除数
endfor
?
n
settalkon
return
h7:
求出将十进制整数98765432等值转换为二进制形式表示后其中数字0的个数。
(提示:
模拟人工计算的“2除取余”法)14
h8:
求出将十进制整数99887766554等值转换为十六进制形式表示后其中字母C的个数。
(提示:
模拟人工计算的“16除取余”法)2
h9:
对自然数A、B、C,若A
试求出弦为25000的勾股弦数组的个数。
5
settalkoff
clear
c=25000
n=0
fora=1toc
b=int(sqrt(c*c-a*a))
ifa*a+b*b=c*canda
n=n+1
endif
endfor
?
n
settalkon
return
h10:
对自然数A、B、C,若A
试求出弦为1300的勾股弦组数。
7
h11:
求方程3x-7y=1在条件|x|<100且|y|<40下的整数解的个数。
26
settalkoff
clear
n=0
forx=-99to99
y=int((3*x-1)/7)
if3*x-7*y=1andabs(y)<40
n=n+1
endif
endfor
?
n
settalkon
return
h12:
求方程4x+9y=1000的正整数解的个数。
27
h13:
求方程9x+4y=2000的所有正整数解的|x-y|的最小值。
6
settalkoff
clear
min=500&&求最小值时初值必须要足够大
forx=1to230
y=int((2000-9*x)/4)
z=abs(x-y)
if9*x+4*y=2000andy>0andmin>z&&取最小值并保证都是正数解
?
min
min=z
endif
endfor
?
min
settalkon
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
试求出弦为[100,300]内符合条件的数有多少组?
63
(改正并调试下列程序)
settalkoff
clear
n=0
fora=100to300
forb=1to300
forc=1to300
ifa*a+b*b=c*c
n=n+a+b+c
endif
endfor
endfor
endfor
?
n
settalkon
return
I类:
等差数列或一般数列
Eg:
编写程序,求一正整数等差数列的前三项的和,该数列前四项之和是26、之积是880。
15
clea
settalkoff
fora1=1to7
ford=1to7
ifa1+(a1+d)+(a1+2*d)+(a1+3*d)=26anda1*(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
(改正并调试下列程序)
settalkoff
clear
a=1
k=0
forn=1to100
a=a+n
ifmod(n,4)=0
k=k+1
endif
endfor
?
k
settalkon
return
J类:
完数
Eg:
一个数如果刚好与它所有的因子之和相等,则称该数为一个"完数",如:
6=1+2+3,则6就是一个完数。
求出200到500之间所有的完数之和。
496
settalkoff
clea
s=0
fori=200to500
k=0&&k是因子的和变量
fora=1toi-1&&a是I的真因子
ifmod(i,a)=0
k=k+a
endif
endf
ifk=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
settalkoff
clea
f1=0
f2