VF程序设计复习资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二部分结构化程序设计语句和算法
一、程序的概念
程序:是计算机能够分析执行的命令序列的集合。
程序设计:是计算机用户将解决某一实际问题所用的命令按一定的逻辑顺序编制成程序,并以文件的形式存放于磁盘的过程。
执行程序时,计算机按顺序自动执行程序文件中的命令。
例编程求1+2+3+……+100
clear
s=0
for i=1 to 100
s=s+i
endfor
? “s=”,s
return
二、VF语言基础
1.数据类型
1)数值型:由数字0-9以及正负号(+和-)和小数点(.)组成。
例如:123,34.56,-100
2)字符型:英文、汉字、数字、空格和标点符等组成的一串字符。
例如:”hello”,”good
morning”。
注意:其表示方法用" "将字符串括起来。
3)逻辑型:表示的值为真和假两种状态, .T.或.t.表示真,.F.或.f.表示假。
2.常量
1)数值型常量:例如:123,34.56,-100
2)字符型常量:”hello”,”good morning”。
3)逻辑型常量: .T.表示真,.F.表示假。
3.变量
1)概念:变量是指在程序运行期间其值可以变化的量,一个变量可以存放一个数据。
2)变量名:每个变量应有一个名字,称为变量名。
(尽量用一个字母作为一个变量名)如:x,y,z,i,j等。
注意:VF中变量不需要定义就可以直接使用。
4.运算符及表达式
●运算符:用来进行运算的符号;
●表达式:是指用运算符将变量、数组元素、常量、函数连接组合得到的一组有物理意义
的式子。
表达式分为算术表达式、字符表达式、关系表达式和逻辑表达式4类。
表达式和常量一样,是具有数据类型的数据(求值之后),因此一个表达式中的各项必须具有相同类型。
1)算术运算符:( ) ^ % *、/ +、-
算术表达式:10+3*4-15 2^3 x^3/y+a%5
2)字符运算符:
完全连接“+”:“I have a ” +“Book”= “I have a Book”
包含运算“$”:“abc”$“abcdef”=.t.
“ABC”$“abcdef”=.f.
3) 关系运算符:< > = == <= >= <>
关系表达式:<表达式> <关系运算符> <表达式>
关系表达式相当于一个命题,这个命题要么成立,要么不成立,如果成立,命题为真,如果不成立命题为假。
1244.33>=12 结果:.t.
10=20 结果:.f.
”A” <”B”结果:.t.
”ABC” >”ABD”结果:.f.
4) 逻辑运算符: !, NOT 或 .NOT. OR 或 .OR. AND 或 .AND.
逻辑表达式:<关系表达式> <逻辑运算符> <关系表达式>
逻辑表达式也相当于一个命题,这个命题要么成立,要么不成立,如果成立,命题为真,如果不成立命题为假。
x>5 OR y<10 .T.或者.F.,取决于x,y的值
推导判断闰年的表达式:
闰年:能被4整除,但是不能被100整除;或者能被400整除。
(y%4=0 and y%100<>0) or y%400=0
5.常用函数
1)取绝对值函数:abs(数值表达式)
2)取整函数:int(数值表达式)
功能:取数值表达式的整数部分。
int(12.3)=12
int(56.78)=56
3)求平方根函数:sqrt(数值表达式)
4)求字符串长度函数:len(字符串表达式)
len("hello")=5
len("你好")=4
说明:一个汉字占两个字符的宽度。
5)取子串函数:
●Left(字符串表达式,长度)
●Right(字符串表达式,长度)
●substr(字符串表达式,起始位置,长度)
功能:从指定表达式值的指始位置取指定长度的字符串作为函数值。
Substr(“hello”,2,3) 结果:ell
6)计算字串出现次数函数:
Occurs(字符串表达式1,字符串表达式2)
功能:返回第一个字符串在第二个字符串中出现的次数。
Occurs(“a”,”abcaa”) 结果:3
7)大小写转换函数
Lower(字符串表达式):
Upper(字符串表达式):
8)生成空格字符函数:space(数值表达式)
功能:生成若干个空格,空格的个数由数值表达式确定。
Space(5) 其作用是产生5个空格
9)数值转换成字符串函数:str(数值表达式,长度,小数位数)
功能:将数值表达式的值转换为字符串,转换时根据需要自动四舍五入。
转换后的理想长度应该是数值表达式值的整数部分位数加上小数位数值,再加上一位小数点。
Str(“123.567”,7,3) 结果:123.567
Str(“123.567”,6,2) 结果:123.57
10)随机函数: rand()
功能:系统随机产生一个0到1之间的纯小数
产生某个范围的随机整数:Int(rand()*(终值-初值+1)+初值)
例如:随机产生两位随机整数。
Int(rand()*(99-10+1)+10)
三程序设计基本语句:
1.变量的赋值:=
格式:变量=表达式
功能:将“=”(赋值号)右边表达式的值赋予左边的变量。
2.输入命令
1)input命令
格式:input “提示信息”to 变量
功能:在屏幕上显示“提示信息”,并等待用户从键盘上输入表达式,再把表达式
的值赋给指定的变量。
2)Accept命令
格式:accept “提示信息” to 变量
功能:在屏幕上显示[<提示信息>],等待用户从键盘上输入,再把输入内容作为字
符串常量赋值给指定的变量。
3.输出命令?|??
格式:?表达式1,[< 表达式2>…]
功能:将表达式的结果在当前光标的下一行输出;
格式:?? 表达式1,[< 表达式2>…]
功能:将表达式的结果在当前光标位置输出;
四、VF程序基本结构
4.1 顺序结构
顺序结构:就是计算机要按照程序中语句出现的先后次序依次执行各条语句的结构。
顺序结构是程序设计中最常见、使用最多的结构。
顺序结构程序主要由赋值语句、输入语句和输出语句构成。
程序:
1求园的面积
clear
input “r=” to r
s=3.14*r^2
?s
return
2交换任意两个变量的值
clear
input “x=” to x
input “y=” to y
t=x
x=y
y=t
? “x=”,x
?”y=”, y
return
3鸡兔同笼问题。
已知鸡兔的总头数为h,总脚数为f,求鸡兔各有多少只?
clear
input "h=" to h
input "f=" to f
x=(4*h-f)/2
y=(f-2*h)/2
?”鸡的个数:”,x
?”兔的个数:”,y
return
三、选择结构
1) IF语句格式:
IF 条件表达式
语句序列1
ELSE
语句序列2
ENDIF
功能:执行该语句时,如果条件表达式的值为.t.,则执行语句序列1,否则执行语句序列2,然后再执行endif之后的语句。
其中else可以省略,即如果语句序列2为空,则没有ELSE 以及语句序列1。
程序
1.判断闰年。
从键盘任意输入一年份,判断其是否是闰年,是则输出“是“,不是则输出
“否”。
Clear
Input “y=” to y
If (y%4=0 and y%100<>0) or y%400=0
?”是”
Else
?”否”
endif
return
2.输出3个数中最大值
clear
input "x=" to x
input "y=" to y
input "z=" to z
if x>=y
m=x
else
m=y
endif
if m<z then
m=z
endif
?m
return
3.判断一个数是否是水仙花数。
所谓水仙花数是指一个3位数,其每位数字的立方和等于
它本身。
clear
input "m=" to m
x=int(m/100)
y=int((m%100)/10)
z=m%10
if x^3+y^3+z^3=m
?"是"
else
?"否"
endif
return
2) 多分支语句:
DO CASE
CASE 逻辑达式1
命令序列1
[CASE 逻辑表达式2
命令序列2
…
CASE 逻辑表达式n
命令序列N]
[OTHERWISE
命令序列]
ENDCASE
说明:
1)从第一个逻辑表达式开始判断,当找到一个逻辑表达式的值为.T.时,就执行紧跟其后的命令序列,然后执行ENDCASE之后的语句。
2)在一个DO CASE结构中,最多只能执行一个CASE语句后面的语句序列。
如果case后的所有逻辑表达式的值均为.F.,则执行OTHERWISE后面的语句序列。
4.输入一个成绩,输出其等级。
CLEAR
INPUT “请输入学生成绩:” TO n
DO CASE
CASE n>=90 and n<=100
? “优秀”
CASE n>=80
? “良好”
CASE n>=70
? “中等”
CASE n>=60
? “及格”
OTHERWISE
? “不及格”
ENDCASE
return
四、循环结构
1)do while循环
Do while 条件
循环体
Enddo
提示:级数求和问题从累加求和到最难的求和一鼓作气学完。
算法:
1.求1-100的累加和:s=1+2+3…+100
i=1
s=0
Do while i<=100
s=s+i
i=i+1
Enddo
? s
return
2.求1-100奇数的和。
Clear
i=1
s=0
Do while i<=100
s=s+i
i=i+2
Enddo
? s
return
3.求1-100偶数的和。
Clear
i=2
s=0
Do while i<=100
s=s+i
i=i+2
Enddo
? s
return
2)For循环
For 循环变量=初值 TO 终值 STEP 步长循环体
Endfor
其中步长为1时,STEP 1 可以省略。
4.将1-3题用for语句实现
1)1-100所有整数的和
Clear
s=0
For i=1 to 100
s=s+i
endfor
? s
Return
2)1-100所有奇数的和
s=0
For i=1 to 100 step 2
s=s+i
endfor
? s
Return
3)1-100所有偶数的和
Clear
s=0
For i=2 to 100 step 2
s=s+i
endfor
? s
Return
强调:当循环次数确定的时候尽量用for循环实现。
5.求s=1+1/2+1/3+1/4+....+1/100
clear
s=0
for i=1 to 100
s=s+1/i
endfor
?"s=",s
Return
6.求s=1-1/2+1/3-1/4+....+1/100
clear
s=0
for i=1 to 100
s=s+ 1/i*(-1)^ (i+1)
endfor
?s
Return
7.求s=1-1/2+1/3-1/4+....+1/n,n由键盘输入clear
input “n=” to n
s=0
for i=1 to n
s=s+ 1/i*(-1)^ (i+1)
endfor
?s
Return
8.求N!=1×2×3×4…×N,其中N由键盘输入。
Clear
Input “n=” to n
For i=1 to n
t=t*i
endfor
?t
return
9.求s=1!+2!+……+n!,n由键盘输入。
(即求阶乘之和)clear
input "n=" to n
s=0
t=1
for i=1 to n
t=t*i
s=s+t
endfor
? s
Return
10.s=1+(1*2)+(1*2*3)+...+(1*2*3* (10)
此题相当于求:s=1!+2!+ (10)
clear
t=0
s=0
for i=1 to 10
t=t+i
s=s+t
endfor
?s
Return
11.s=1+(1+2)+(1+2+3)+...+(1+2+3+4+5+6+7+8+9+10)
clear
t=0
s=0
for i=1 to 10
t=t+i
s=s+t
endfor
?s
Return
12.s=1+1/(1+2)+1/(1+2+3)+...+1/(1+2+3+4+5+6+7+8+9+10) clear
t=0
s=0
for i=1 to 10
t=t+i
s=s+1/t
endfor
?s
return
13.计算 s=1!+1/2!+1/3!……+1/n!,n由键盘输入(即求阶乘倒数之和)
clear
input "n=" to n
s=0
t=1
for i=1 to n
t=t*i
s=s+1/t
endfor
? s
Return
14.计算 s=1!+1/2!+1/3!……+1/n!(要求1/n!<10-6为止)
clear
s=0
t=1
i=1
do while 1/t>=10^(-6)
s=s+1/t
i=i+1
t=t*i
endfor
?"s=",s
return
15.计算 s=1!-1/2!+1/3!-1/4!……±1/n!(要求1/n!<10-6为止)
clear
s=0
t=1
i=1
do while 1/t>=10^(-6)
s=s+1/t*(-1)^(i+1)
i=i+1
t=t*i
endfor
?"s=",s
return
16.计算 s=x/1!+x2/2!+x3/3!……+x n/n!,x由键盘输入。
( 要求x n/n!<10-6为止)
Clear
Input “x=” to x
s=0
t=1
i=1
do while x^i/t>=10^(-6)
s=s+(x^i/t)
i=i+1
t=t*i
endfor
?"s=",s
return
17.计算 s=x/1!-x2/2!+x3/3!……±x n/n!( 要求x n/n!<10-6为止)
Clear
Input “x=” to x
s=0
t=1
i=1
do while x^i/t>=10^(-6)
s=s+(x^i/t)*(-1)*(i+1)
i=i+1
t=t*i
endfor
?"s=",s
return
18.e x=1+x+x2/2!+x3/3!……+x n/n!( 要求x n/n!<10-6为止)
Clear
Input “x=” to x
s=1
t=1
i=1
do while x^i/t>=10^(-6)
s=s+x^i/t
i=i+1
t=t*i
endfor
?"s=",s
return
19.求s=2!+4!+6!+8!+10!
S=0
T=1
For i=2 to 10 step 2
T=t*(i-1)*i
S=s+t
Endfor
?s
return
20.求s=1/2!+1/4!+1/6!+1/8!+1/10!
S=0
T=1
For i=2 to 10 step 2
T=t*(i-1)*i
S=s+1/t
Endfor
?s
return
21.求s=1/2!-1/4!+1/6!-1/8!+1/10!
S=0
T=1
d=1
For i=2 to 10 step 2
T=t*(i-1)*i
S=s+1/t*d
d=-d
Endfor
?s
return
22.求s=1!+3!+5!+7!+9!
可以看成 s=1+3!+5!+7!+9!,令s=1,只需求出3!+5!+7!+9!即可S=1
T=1
For i=3 to 9 step 2
T=t*(i-1)*i
S=s+t
Endfor
?s
return
23.求s=1/1!-1/3!+1/5!-1/7!+1/9!
S=1
T=1
D=1
For i=3 to 9 step 2
T=t*(i-1)*i
S=s+1/t*d
Endfor
?s
return
24.
25.cos(x)= 1-x2/2!+x4/4!-x6/6!……±x n/n!( 精度为10^(-8))
Clear
Input “x=” to x
s=1
t=2
i=2
d=-1
do while x^i/t>=10^(-8)
s=s+x^i/t*d
i=i+1
t=t*i
d=-d
endfor
?"s=",s
return
26.输出所有的水仙花数。
提示:先判断某个数是否是水仙花数。
clear
for n=100 to 999
x=int(n/100)
y=int((n%100)/10)
z=n%10
if x^3+y^3+z^3=n then
?n
endif
endfor
return
27.从键盘任意输入一个整数,判断其是否是素数。
除了1和它本身之外不能被任何一个整数所整除的自然数叫质数,又称为素数。
例如3,5,17是素数,而4,6,8,9 就不是素数。
特殊:1既不是质数也不是合数,2是最小的质数。
clear
input "n=" to n
for i=2 to n-1
if n%i=0
exit
endif
endfor
if i=n
?"是"
else
?"否"
endif
return
exit作用:退出循环。
28.以5个为一组输出1-100的整数。
Clear
C=0
for i=1 to 100
??i
if i%5=0
?
Endif
endfor
return
29.以5个为一组输出1-100能被3整除的数。
Clear
C=0
for i=1 to 100
if i%3=0
??i
c=c+1
if c%5=0
?
Endif
endif
endfor
return
30.以5个为一组输出100-1000以内的所有素数,并计算这些素数之和。
(两重循环的应
用)
分析:1)先找出所有素数
2)以5个数据为一组显示
3)计算所有素数的和
clear
c=0
s=0
for m=100 to 1000
for i=2 to m-1
if m%i=0
exit
endif
endfor
if i=m
?? m
c=c+1
if c%5=0
?
endif
s=s+m
endif
endfor
?“素数的和:”,s
31.百钱买百鸡问题。
公鸡5元一只,母鸡3元一只,小鸡3只一块钱,假设用100元买了
100只鸡,问公鸡、母鸡、小鸡各有多少只?
穷举法:所谓穷举法就是将各种组合的可能性全部一一测试一遍,对每一组合检查它是否符合给定的条件,将符合条件的解全部输出即可。
clear
for x=1 to 19
for y=1 to 33
z=100-x-y
if z%3=0 and 5*x+3*y+z/3=100
?x,y,z
endif
endfor
endfor
return
32.请显示如下图所示的九九乘法表。
clear
for i=1 to 9
for j=1 to 9
??str(i,1) + "*" + str(j,1) + "=" + str(i*j,2) + space(3)
endfor
?
endfor
return
33.要求显示如下乘法表。
clear
s=0
for i=1 to 4
for j=i to 4
??str(i,1) + "*" + str(j,1) + "=" + str(i*j,2),space(3)
endfor
?
endfor
34.请显示如下图所示的九九乘法表。
clear
for i=1 to 9
for j=i to 9
??str(i,1) + "*" + str(j,1) + "=" + str(i*j,2) + space(3)
endfor
?space(i*9)
endfor
return
35.设计1个程序,要求是:
(1)在键盘上输入1个不小于3的自然数N(例输入10),求出其不到第N个自然数
中奇数之和,并输出结果
(2)输出1到第N自然数中所有质数的个数
clear
input "n=" to n
if n<3
?”请输入大于等于3的数!”
else
s=0
for i=1 to n-1 step 2
s=s+i
endfor
?”奇数的和:”,s
c=0
for i=1 to n
for j=2 to i-1
if i%j=0
exit
endif
endfor
if j=I
c=c+1
endif
endfor
?”质数的个数”,c
Return
36.求两个数的最大公约数。
算法(采用辗转相除法):m除以n(m>n),得余数r;如果r不等于0,则将n赋予m,r赋予n,再用m除以n,得余数r;依次类推,直到r=0为止,此时的n就是最大公约数。
例如:30和20的最大公约数为10
采用辗转相除法(要求m>n):
1)m除以n,得余数r;
2)如果r不等于0,则将n赋予m,r赋予n,再用m除以n,得余数r;
3)依次类推,直到r=0为止,此时的n就是最大公约数。
Clear
Input "m=" to m
Input "n=" to n
r=m%n
do while r<>0
m=n
n=r
r=m%n
enddo
? n
Return
37.求两个数的最小公倍数。
M和n的乘积除以最大公约数就是最小公倍数
例如:30和20的最小公倍数为60
Clear
input "m=" to m
input "n=" to n
x=m
y=n
r=mod(m,n)
do while r<>0
m=n
n=r
r=mod(m,n)
enddo
?x*y/n
Return
38.猴子摘桃问题。
已知猴子第一天摘了2个桃子,第二天摘的桃子是第一天的2倍多一个;
以此类推,第n天摘了多少个桃子?(递推法)
clear
input "n=" to n
x=2
for i=2 to n
x=x*2+1
?x
Return
39.从键盘随机输入一字符串,统计该字符串中字符“a”出现的次数,不区分大小写。
方法1:
clear
accept "请输入字符串:" to s
x=0
for i=1 to len(s)
c=substr(s,i,1)
if c="a" or c="A" then
x=x+1
endif
endfor
?x
Return
方法2:
clear
accept "请输入字符串:" to s
x=occurs(“a”,lower(s))
?x
Return
40.从键盘随机输入一字符串,统计该字符串中字母字符,数字字符,空格其他字符出现的
次数。
clear
accept "请输入字符串:" to s
x=0
y=0
z=0
w=0
for i=1 to len(s)
c=substr(s,i,1)
do case
case upper(c)>="A" and upper(c)<="Z"
x=x+1
case c>="0" and c<="9"
y=y+1
case c=””
z=z+1
otherwise
w=w+1
endcase
endfor
?"字母:",x
?"数字:",y
?"空格:",z
?”其他字符:”,w
Return
41.将一个字符串中的大写字母转换为小写字母,小写字母转换为大写字母。
clear
accept "s=" to s
s1=""
for i=1 to len(s)
c=substr(s,i,1)
if asc(c)>=65 and asc(c)<=90 then
s1=s1+lower(c)
else
if asc(c)>=97 and asc(c)<=122 then
s1=s1+upper(c)
endif
endif
endfor
?s1
return
42.计算1到100中每个数据的立方根(数据总长度为10,小数位数为7),将结果存于外存,
文件名为root.c.
写文件函数:Strtofile(字符串,文件名,.t./.f.)
.t.: 表示追加
.f.: 覆盖原文件中的内容
数值转换成字符串函数:str(数值表达式,<长度>,<小数位数>)
功能:将数值表达式的值转换为字符串,转换时根据需要自动四舍五入。
转换后的理想长度应该是: 数值表达式值的整数部分位数加上小数位数值,再加上一位小数点,即整数和小数位数的总数+小数点。
如果长度和小数位数缺省,则长度默认值为10,小数位数默认值为0.
Str(“123.567”,7,3) 结果:123.567
Str(“123.567”,6,2) 结果:123.57
Str(“123.567”) 结果: 123
clear
For i=1 to 100
X=i^(1/3)
Strtofile(str(x,10,7),”c:\root.c”,.t.)
Endfor
return
五、一维数组
1、定义:Dime 数组名(长度)
dim a(10)
2、引用:数组名(下标)
1)下标通常都是整数常量,如:a(1),a(2),a(3) 2)下标也可以是变量,如:a(i)
3、一维数组的赋值和输出
1)利用键盘给数组元素赋值
dimen a(10)
for i=1 to 10
input "输入数据:" to a(i)
endfor
return
2)利用rand()函数给数组元素赋值
利用rand()函数随机产生10-99的随机整数
Rand()函数将产生0到1之间的随机小数
int(rand()*(终值-初值+1)+初值)
例:随机产生10个两位整数
dimen a(10)
for i=1 to 10
a(i)=int(rand()*(90)+10)
Endfor
4、一维数组的输出
for i=1 to 10
??a(i)
Endfor
程序
1、从键盘上输入10个数,输出其平均值。
Clear
Dime x(10)
S=0
For i=1 to 10
S=s+x(i)
Endfor
? s/10
Return
2、将具有n个元素的一维数组的值按逆序重新存放。
clear
input "n=" to n
dime a(n)
for i=1 to n
input "请输入元素值:" to a(i)
endfor
for i=1 to int(n/2)
t=a(i)
a(i)=a(n+1-i)
a(n-i+1)= t
endfor
for i=1 to n
??a(i)
endfor
return
3、从键盘输入10个数,从中找出最小和最大的数,以及它们的位置。
求最小数和其位置:
clear
Dime a(10)
for i=1 to 10
input "输入数据:" to a(i)
endfor
m=a(1)
p=1
for i=2 to 10
if m>a(i)
m=a(i)
p=i
endif
endfor
?”最小数:”,m
?”位置:”, p
Return
求最大数和其位置:
clear
Dime a(10)
for i=1 to 10
input "输入数据:" to a(i)
endfor
m=a(1)
p=1
for i=2 to 10
if m <a(i)
m =a(i)
p=i
endif
endfor
?”最大数:”,m
?”位置:”, p
Return
4、编写程序,从键盘上任意输入10整数,将这10个整数在屏幕上显示成一行,并在下一
行显示其最接近平均值的数。
clear
Dime a(10)
for i=1 to 10
input "输入数据:" to a(i)
endfor
s=0
for i=1 to 10
??a(i)
s=s+a(i)
endfor
ave=s/10
?ave
m=abs(a(1)-ave)
p=1
for i=2 to 10
if m>abs(a(i)-ave) then
m=abs(a(i)-ave)
p=i
endif
endfor
?a(p)
return
5、随机产生10个两位整数,先输出这10个整数,然后按升序排序并显示输出。
选择法排序(弱化)
举例:9 6 8 2 4
clear
dime a(10)
for i=1 to 10
a(i)=int(rand()*90)+10
?a(i)
endfor
for i=1 to 9
m=a(i)
p=i
for j=i+1 to 10
if m>a(j)
m=a(j)
p=j
endif
endfor
t=a(p)
a(p)=a(i)
a(i)=t
endfor
for i=1 to 10
? a(i)
endfor
return
5、随机产生10个两位整数,先输出这10个整数,然后按升序排序并显示输出。
冒泡法排序(重点)
clear
dime a(10)
for i=1 to 10
a(i)=int(rand()*90)+10
? a(i)
endfor
for i=1 to 9
for j=1 to 10-i
if a(j)>a(j+1)
t=a(j)
a(j)=a(j+1)
a(j+1)=t
endif
endfor
endfor
for i=1 to 10
??a(i)
endfor
return
6、随机产生20个20-99之间的整数,先按照每行5个数据方式输出,再进行降序排
列,并按照每行5个数据方式输出。
clear
Dime a(20)
for i=1 to 20
a(i)=int(rand()*80)+20
??a(i)
if i%5=0
?
endif
endfor
for i=1 to 19
for j=1 to 20-i
if a(j)<a(j+1)
t=a(j)
a(j)=a(j+1)
a(j+1)=t
endif
endfor
endfor
for i=1 to 20
?? a(i)
if i%5=0
?
endif
endfor
return
7、(对字符串排序处理)有5个英文单词,分别为:Word,Excel,Powerpoint,Typ
e,Angle,要求设计出如下程序:
(1)在键盘上输入数N(本例输入5),把英文单词放入名为X大小为N的数组中(2)显示出X数组中的英文单词
(3)对数组中的英文单词从小到大排序
(4)显示出排序后X数组中英文单词
clear
input "n=" to n
Dime x(n)
for i=1 to n
accept "请依次输入字符串:" to x(i)
?x(i)
endfor
for i=1 to n-1
for j=1 to n-i
if x(j)>x(j+1)
t=x(j)
x(j)=x(j+1)
x(j+1)=t
endif
endfor
endfor
for i=1 to n
?x(i)
endfor
return
8、斐布拉契数列。
1,1,2,3,5,8,13,21…请输出该数列前20项。
Dime a(20)
A(1)=1
A(2)=1
?a(1)
?a(2)
For i=3 to 20
a(i)=a(i-2)+a(i-1)
?a(i)
Endfor
return
9、查找算法(顺序查找.prg)
顺序查找是一种最简单的查找方法,从第1个元素到最后1个元素逐个进行比较,直至找到为止。
随机产生10个两位随机整数,先显示这10个整数,然后从键盘任意输入一个需要查找整数,在产生的10个整数中进行查找,如果找到了则显示“yes”,没有找到则显示“no”。
clear
dime a(10)
for i=1 to 10
a(i)=int(rand()*(99-10+1)+10)
?a(i)
Endfor
input "n=" to n
for i=1 to 10
if n=a(i)
exit
endif
endfor
if i<=10
?"yes"
Else
? "no"
Endif
Return
10、折半查找。
算法:将数列按有序化(递增或递减)排列,取中间位置数据a(m)与待查找的x作比较,如果相等x=a(n/2)则找到x,算法终止。
如果x<a(n/2),则只要在数组a的左半部继续搜索x (这里假设数组元素呈升序排列)。
如果x>a(n/2),则我们只要在数组a的右半部继续搜索从键盘输入有序(升序)的10个整数到数组a中,再从键盘输入一个整数,用折半查找法查找有没有该数据,并显示查找后的结果。
clear
for i=1 to 10
input "请输入数据:" to a(i)
Endfor
input "请输入待查找数据:" to n
l=1
h=10
do while l<h
m=int((l+h)/2)
if n=a(m) then
exit
else
if n<a(m) then
h=m-1
else
l=m+1
endif
endif
enddo
if l<h then
?"find"
else
?"not find"
endif
return
11、有序数列的插入算法。
算法:先将数列排好序,再将要插入的数据从数列中最后一个元素开始比较,如果数列中的元素大于待插入数据,则将数列中的数据后移,如果小于待插入数据则停止比较;然后再将待插入数据放入比它小的数据的后面。
从键盘输入有序(升序)的10个整数到数组a中,再从键盘输入一个整数,将该整数插入数组a中,并保持数组的有序性,最后显示插入数据后的结果。
clear
dime a(11)
for i=1 to 10
input "请输入数据:" to a(i)
Endfor
input "请输入要插入的数据:" to n
for i=10 to 1 step -1
if n<a(i)
a(i+1)=a(i)
else
exit
endif
endfor
for i=1 to 11
? a(i)
endfor
return
12、有序序列删除操作
算法:先将数列排好序,再从第一个元素开始,找到后将待删除数据后面的数据依次前移。
从键盘输入有序(升序)的10个整数到数组a中,再从键盘输入一个整数,并在数组a中查找该数,如果找到了则删除该数,并保持数组的有序性,最后显示删除数据后的结果。
clear
dime a(10)
for i=1 to 10
input "请输入数据:" to a(i)
Endfor
input "请输入要删除的数据:" to n
for i=1 to 10
if n=a(i)
exit
endif
endfor
if i<=10
for j=i+1 to 10
a(j-1)=a(j)
endfor
for i=1 to 9
?a(i)
Endfor
else
?"没有需要删除的数据!"
endif
return
二维数组
Dime a(m,n)
13、随机产生4*4的二维数组,数组中每个元素都是两位数。
Dime a(4,4)
For i=1 to 4
For j=1 to 4
a(i,j)=int(rand()*(99-10+1)+10)
??a(i,j)
Endfor
?
Endfor
Return
14、矩阵的转置。
I=2
J=1 to 1 a(i,j)-a(j,i)
I=3
J=1 to 2
I=4
J=1 to 3
a(2,1)-a(1,2)
a(3,1)-a(1,3) a(3,2)-a(2,3)
a(4,1)-a(1,4) a(4,2)-a(2,4) a(4,3)-a(3,4)
clear
Dime a(4,4)
For i=1 to 4
For j=1 to 4
a(i,j)=int(rand()*(99-10+1)+10)
??a(i,j)
Endfor
?
Endfor
For i= 2 to 4
For j=1 to i-1
T=a(I,j)
a(I,j)=a(j,i)
a(j,i)=t
endfor
endfor
For i=1 to 4
For j=1 to 4
??a(i,j)
Endfor
?
Endfor
M*N
clear
Dime a(3,4)
dime b(4,3)
For i=1 to 3
For j=1 to 4
a(i,j)=int(rand()*(99-10+1)+10)
??a(i,j)
Endfor
?
Endfor
For i= 1 to 3
For j=1 to 4
b(j,i)=a(i,j)
endfor
endfor
?
For i=1 to 4
For j=1 to 3
??b(i,j)
Endfor
?
Endfor
六.函数
1、函数的定义
Func 函数名
Para 参数表
函数体
return表达式
endfunc
2、函数的调用
函数名(参数表)
3、相关程序(可以将前面所讲程序改为由函数来实现)1)求半径为r的园的面积(带参数)。
input "r=" to r
?f(r)
Return
func f
para r
s=3.14*r^2
return s
endfunc
2)累加求和。
S=1+2+3+…+n
clear
input "n=" to n
?f(n)
return
func f
para n
s=0
for i=1 to n
s=s+i
endfor
return s
endfunc
3)求n!
clear
input "n=" to n
? f(n)
Return
func f
para n
t=1
for i=1 to n
t=t*i
endfor
return t
endfunc
4)求S=1!+2!+3!+….+N!。
要求n!由函数实现
clear
input "n=" to n
s=0
for i=1 to n
s=s+f(i)
endfor
?"s=",s
Return
func f
para i
t=1
for j=1 to i t=t*j endfor return t endfunc
5)用函数求s=a+aa+aaa+……
n
a a
⋯
⋯(a和n由键盘输入)
如:a=2,n=3
S=2+22+222
t=0*10+2=2
t=2*10+2=t*10+2=22
t=22*10+2=222=t*10+2
因此: t=t*10+2,初始t=0
Clear
Input "a=" to a
Input "n=" to n
?f(a,n)
Return
func f
Para a,n
S=0
t=0
For i=1 to n
t=t*10+a
s=s+t
endfor
return s
endfunc
6)复习材料2中练习1,程序设计第2小题求cos(x)
Cos(x)=1-x^2/2!+x^4/4!-x^6/6!+…(x为弧度,由键盘输入;计算精度为10^(-8)
方法1:不采用函数,cos(x)看作s=s+t,t=x^n/n!,s的初值为1,t的初始值为2即2!input "x=" to x
s=1
t=2
i=2
d=-1
do while x^i/t>=10^(-8)
s=s+t*d
i=i+2
t=t*(i-1)*i
d=-d
enddo
? s
return
方法2:x^i/i!用函数实现
clear
input "x=" to x
s=1.0000000
i=2
d=-1
do while f(x,i)>=10^(-8)
s=s+f(x,i)*d
i=i+2
d=-d
enddo
?s
Return
func f
para x,i
t=1
for j=1 to i
t=t*j
endfor
return x^i/t
endfunc
7) 复习材料2中练习1程序设计最后一题,用梯形法求定积分,要求用函数实现
用梯形法求定积分⎰∏==b
a b a xdx )2/0(sin ,要求数据初始化、调用函数及输出结果用主程序实现,其余用函数实现。
近似的计算公式如下:
h/2[sin(a)+2(sin(a+h)+sin(a+2h)+….+sin(a+nh))-sin(b))
提示: h=(b-a)/n
clear
input "n=" to n
a=0
b=3.14/2
?f(a,b,n)
Return
func f
para a,b,n
h=(b-a)/n
s=0
for i=1 to n
s=s+sin(a+i*h)
endfor
s=h*(sin(a)+2*s-sin(b))/2
Return s
endfunc
设a=-2,b=1,则f(a)<0,f(b)>0
1 求区间(a,b)的中点m
2 计算f(m).
(1) 若f(m)·f(a)>0,则令a=m;
(2) 若f(m)·f(a)<0,则令b=m.
(3) 判断是否达到精确度10^(-6):即若┃a-b┃<10^(-6),则得到零点近似值m,否则重复1-2
通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
clear
a=-2
b=1
do while abs(b-a)>=10^(-6)
m=(a+b)/2
if (3*m^3-4*m^2-5*m+13)* (3*a^3-4*a^2-5*a+13)>0
a=m
else
b=m
endif
enddo
strtofile(str(m,10,6),” result.dat”,.t.)
return
2. 已知“双色球”每注投注号码由6个红色球号码和1个蓝色球号码组成。
红色球号码从1-33中选择;蓝色球号码从1-16中选择。
请编写一个机选一注的程序。
程序功能,运行一次该程序,则程序自动随机产生一注号码。
显示格式如下:R1,R2,R3,R4,R5,R6: B1 例如:2,4,12,17,22,29: 9
dime a(6)
for i=1 to 6
a(i)=int(rand()*33+1)
endfor
for i=1 to 5
for j=1 to 6-i
if a(j)>a(j+1)
t=a(j)
a(j)=a(j+1)
a(j+1)=t
endif
endfor
endfor
b=int(rand()*16+1)
for i=1 to 5
??a(i),","
endfor
??a(6),":",b
Return
a1=1
a2=1a1=1
a3=a1+2a2=1a1+2a2=a2+2a2=3a2
a4=a1+2a2+3a3=a3+3a3=4a3。
a n=na n-1
规律从第3项开始
dime a(1000)
a(1)=1
a(2)=1
for i=3 to 1000
a(i)=i*a(i-1)
endfor
?a(1000)
Return
-1 2 -3 4 5 -6 7 8 9 -10…的数列
i=1
flag=.f.
j=1
t=1
do while i<=20
if flag=.f. then
??-t
flag=.t.
t=t+1
else
for k=1 to j
??t
t=t+1
endfor
j=j+1
flag=.f.
endif
i=i+1
enddo
return
补程序
1. 计算机一个整数各个数位上数字的和。
input "n=" to n
s=0
do while n<>0 then
x=n%10
n=int(n/10)
?x
s=s+x
enddo
?s
Return
2. 统计一个字符串中单词的个数,字符串所有字符都是英文字符,单词间用空格分隔,字符串开始没有空格。
clear
accept "s=" to s
x=0
for i=1 to len(s)
if substr(s,i,1)=" " then
x=x+1
endif
endfor
Return
3.删除一个字符串中指定的字符“a”,并显示删除后的结果。
clear
accept "s=" to s
s1=""
for i=1 to len(s)
if substr(s,i,1)<>"a" then
s1=s1+substr(s,i,1)
endif
endfor
?s1
Return。