专升本VF程序设计复习资料CH2算法.docx
《专升本VF程序设计复习资料CH2算法.docx》由会员分享,可在线阅读,更多相关《专升本VF程序设计复习资料CH2算法.docx(34页珍藏版)》请在冰豆网上搜索。
专升本VF程序设计复习资料CH2算法
CH2结构化程序设计语句和算法
一、顺序结构
1.求园的面积
Clear
Input“请输入园的半径:
”tor
S=pi()*r^2
?
”园的面积是:
”,s
2.鸡兔同笼问题
二、选择结构
2.1if
1.判断闰年
Clear
Input“请输入年份:
”toy
If(y%4=0andy%100<>0)ory%400=0
?
y,”是闰年!
”
Else
?
y,”是闰年!
”
endif
cancel
2.2docase
2.判断学生成绩等级
clear
input"请输入学生成绩:
"tox
ifx>100orx<0then
?
"输入成绩必须位于0-100之间"
else
docase
casex>=90
?
"等级为A"
casex>=80
?
"等级为B"
casex>=70
?
"等级为C"
casex>=60
?
"等级为D"
other
?
"等级为E"
endcase
endif
cancel
3.判断一个数是否是水仙花数。
clear
input"m="tom
x=int(m/100)
y=int((m%100)/10)
z=m%10
ifx^3+y^3+z^3=m
?
m,"是水仙花数"
else
?
m,"不是水仙花数"
endif
cancel
三、循环结构
3.1Dowhile循环
1.s=1+2+3….+100
Clear
I=1
S=0
Dowhilei<=100
S=s+i
I=i+1
Enddo
?
”s=”,s
cancel
3.2FOR循环
1.将上例用for语句实现
Clear
S=0
Fori=1to100
S=s+i
Next
?
”s=”,s
Cancel
2.求1-100奇数的和。
Clear
S=0
Fori=1to100step2
S=s+i
Next
?
”s=”,s
Cancel
3.求1-100偶数的和。
Clear
S=0
Fori=2to100step2
S=s+i
Next
?
”s=”,s
Cancel
4.求N!
=1×2×3×4…×N
Clear
Input“请输入n:
”ton
f=1
Fori=1ton
f=f*i
Next
?
”f=”,f
Cancel
5.求级数s=1+1/2-1/3+1/4+....
clear
s=1
d=1
input"输入N:
"ton
fori=2ton
s=s+d*1/i
d=-d
nexti
?
"s=",s
cancel
6.输出整数1-100,要求数据以5个为一组输出。
clear
fori=1to100
?
?
i
ifi%5=0
?
endif
next
cancel
7.求fibnocsi数列。
1,1,2,3,5,8,13,21。
。
。
,要求以5个位一组输出前20个数。
clear
f1=1
f2=1
*首先显示前两个数1,1
?
?
f1,f2
fori=3to20
f=f2+f1
?
?
f
f1=f2
f2=f
*以5个为一组显示
ifi%5=0
?
endif
nexti
cancel
8.求两个数(m,n,其中m>n)的最大公倍数和最小公约数。
采用辗转相除法:
m除以n,得余数r;如果r不等于0,则将n赋予m,r赋予n,再用m除以n,得余数r;依次类推,直到r=0为止,此时的n就是最大公约数。
M和n的乘积除以最大公约数就是最小公倍数。
Cancel
input"输入M:
"tom
input"输入N"ton
x=m
y=n
ifn=0then
?
"数据有错,不能为0!
"
exit
endif
r=mod(m,n)
dowhiler>0
m=n
n=r
r=mod(m,n)
enddo
?
"最大公约数是:
",n
?
"最小公倍数是:
",x*y/n
cancel
9.判断某个数是否是素数。
(除了1和它本身之外不能被任何一个整数所整除的自然数叫质数,除去2之外,其它质数都是奇数,又称为素数)
在程序设计中,经常要记录一些状态,作为判断的条件。
因此需要在程序中设置一些标志,通常标志是整型变量。
如:
设置变量f用于记录是否为素数,
f=0是素数;
f=1不是素数。
程序:
clear
input"m="tom
f=.T.
fori=2tom-1
ifm%i=0
f=.F.
exit
endif
next
iff=.T.
?
"yes"
else
?
"no"
endif
cancel
10.输出100-1000以内的所有素数,并计算这些素数之和。
(输出时按照每行5个数据方式输出)。
(在3.2中6题的基础上进行扩充)
clear
count=0
s=0
form=100to1000
f=.T.
fori=2tom-1
ifm%i=0
f=.F.
exit
endif
next
iff=.T.
?
?
m
count=count+1
ifcount%5=0
?
endif
endif
s=s+m
next
?
"s=",s
cancel
12、显示所有的水仙花数。
clear
form=100to999
x=int(m/100)
y=int((m%100)/10)
z=m%10
ifx^3+y^3+z^3=m
?
m,"yes"
endif
next
cancel
12、猴子摘桃问题。
已知猴子第一天摘了2个桃子,第二天摘的桃子是第一天的2倍多一个;以此类推,第n天摘了多少个桃子?
clear
input"请输入第几天:
"ton
x=2
fori=2ton
x=x*2+1
next
?
"共摘了:
",x
cancel
13、计算t=1!
+2!
+……+n!
(即求阶乘之和)
clear
input"n="ton
sum=0
fori=1ton
f=1
forj=1toi
f=f*j
next
sum=sum+f
next
?
"sum=",sum
Cancel
14、计算t=1!
+1/2!
+1/3!
……+1/n!
(即求阶乘之和)
clear
input"n="ton
sum=0
fori=1ton
f=1
forj=1toi
f=f*j
next
sum=sum+1/f
next
?
"sum=",sum
Cancel
15、穷举法:
百钱买百鸡问题。
clear
forx=1to19
fory=1to33
z=100-x-y
ifz%3=0
if5*x+3*y+z/3=100
?
x,y,z
endif
endif
next
next
cancel
16、设计1个程序,要求是:
(查找算法、统计、求和、找素数或质数)
(1)在键盘上输入1个不小于3的自然数N(例输入10),求出其不到第N个自然数中奇数之和,并输出结果
(2)输出1到第N自然数中所有质数的个数
clear
input"n="ton
s=0
x=0
ifn<3then
?
"请输入大于等于3的数"
else
fori=3tonstep2
s=s+i
next
form=2ton
f=.T.
fori=2tom/2
ifm%i=0
f=.F.
exit
endif
next
iff=.T.
x=x+1
endif
next
endif
?
"奇数和为:
",s
?
"质数个数为:
",x
cancel
17、从键盘随机输入一字符串,统计该字符串中字母字符,数字字符和其他字符出现的次数。
clear
input"请输入字符串:
"toa
x=0
y=0
z=0
fori=1tolen(a)
b=substr(a,i,1)
docase
caseupper(b)>="A"andupper(b)<="Z"
x=x+1
caseb>="0"a_ndb<="9"
y=y+1
otherwise
z=z+1
endcase
next
?
"字母:
",x
?
"数字:
",y
?
"其他字符",z
cancel
四、数组
1.1一维数组
1)定义:
Dimensionarr(n)
下标从1开始,
2)一维数组的赋值和输出
*利用键盘输入数据值
dimena(10)
fori=1to10
input"输入数据:
"toa(i)
next
fori=1to10
?
?
a(i)
next
cancel
*利用rand()函数随机产生10-99的随机整数
dimena(10)
fori=1to10
a(i)=int(rand()*(99-10+1)+10)
?
?
a(i)
next
1.将具有n个元素的一维数组的值按逆序重新存放。
clear
input"请输入元素个数:
"ton
dimena(n)
*数组元素赋初值
fori=1ton
input"输入数据:
"toa(i)
next
*输出数组元素值
fori=1ton
?
?
a(i)
next
fori=1toint(n/2)
temp=a(i)
a(i)=a(n-i+1)
a(n-i+1)=temp
next
*换行
?
fori=1ton
?
?
a(i)
next
cancel
2.从键盘输入10个数,从中找出最大和最小的数,以及它们的位置。
求最小数和其位置:
clear
dimena(10)
fori=1to10
input"输入数据:
"toa(i)
next
minx=a
(1)
minp=1
fori=2to10
ifminx>a(i)
minx=a(i)
minp=i
endif
next
?
"min=",minx
?
"position=",minp
cancel
求最大数和其位置:
clear
dimena(10)
fori=1to10
input"输入数据:
"toa(i)
next
maxx=a
(1)
maxp=1
fori=2to10
ifmaxxmaxx=a(i)
maxp=i
endif
next
?
"max=",maxx
?
"position=",maxp
cancel
3.随机产生n个两位整数,按由小到大的顺序排列并显示输出。
(排序算法--选择法排序)
clear
dimensiona(10)
fori=1to10
a(i)=int(rand()*90+1)
?
a(i)
next
?
fori=1to9
minx=a(i)
minp=i
forj=i+1to10
ifminx>a(j)
minx=a(j)
minp=j
endif
next
ifminp<>i
temp=a(minp)
a(minp)=a(i)
a(i)=temp
endif
next
fori=1to10
?
a(i)
next
cancel
4.冒泡法排序
clear
dimensiona(10)
fori=1to10
a(i)=int(rand()*90+1)
?
a(i)
next
?
fori=1to9
forj=1to10-i
ifa(j)>a(j+1)then
temp=a(j)
a(j)=a(j+1)
a(j+1)=temp
endif
next
next
fori=1to10
?
a(i)
next
cancel
5.随机产生20个20-99之间的整数,先按照每行5个数据方式输出,再进行升序排列,再按照每行5个数据方式输出
clear
dimensiona(10)
*数组赋值
fori=1to10
a(i)=int(rand()*90+1)
?
?
a(i)
ifi%5=0
?
endif
next
*排序
fori=1to9
minx=a(i)
minp=i
forj=ito10
ifminx>a(j)
minx=a(j)
minp=j
endif
next
ifminp<>i
temp=a(minp)
a(minp)=a(i)
a(i)=temp
endif
next
*换行
?
*排序结果输出
fori=1to10
?
?
a(i)
ifi%5=0
?
endif
next
cancel
6.(对字符串排序处理)有5个英文单词,分别为:
Word,Excel,Powerpoint,Type,Angle,要求设计出如下程序:
(1)在键盘上输入数N(本例输入5),把英文单词放入名为a大小为N的数组中
(2)显示出X数组中的英文单词
(3)对数组中的英文单词从小到大排序
(4)显示出排序后X数组中英文单词
clear
input"请输入字符串总个数:
"ton
dimena(n)
fori=1ton
input"请依次输入字符串:
"toa(i)
next
fori=1ton
?
a(i)
next
?
"排序后的字符串为:
"
fori=1ton-1
minword=left(a(i),1)
minp=i
forj=i+1ton_
ifminword>left(a(j),1)
minword=left(a(j),1)
minp=j
endif
next
ifminp<>i
temp=a(i)
a(i)=a(minp)
a(minp)=temp
endif
next
fori=1ton
?
a(i)
next
cancel
7.查找算法(顺序查找.prg)
又称线性查找,是一种最简单的查找方法。
从第1个元素到最后1个元素,逐个进行比较,直至找到为止。
clear
dimea(10)
fori=1to10
a(i)=int(rand()*100)
?
?
a(i)
nexti
input"输入要查找的数:
"tox
fori=1to10
ifa(i)=x
?
"找到:
",x,i
cancel
endif
nexti
?
"没有找到!
"
cancel
8.查找算法(折半查找.prg"):
先排序,后查找,是查找一个已排好序的表的最好方法。
算法思想:
将有序数列的中点设置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
即通过一次比较,将查找区间缩小一半。
二分查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率。
但是,二分查找的先决条件是查找表中的数据元素必须有序。
clear
dimena(10)
*数组初始化
fori=1to10
a(i)=int(rand()*100+1)
?
?
a(i)
next
*利用选择法排序
?
fori=1to9
minnum=a(i)
p=i
forj=i+1to10
ifminnum>a(j)then
minnum=a(j)
p=j
endif
next
ifp<>ithen
temp=a(i)
a(i)=a(p)
a(p)=temp
endif
?
a(i)
nexti
*折半查找
input"pleaseinputnumber;"tok
l=1
h=10
flag=0
dowhilel<=h
m=int((h+l)/2)
ifa(m)=kthen
flag=1
exit
endif
ifa(m)>kthen
h=m-1
else
l=m+1
endif
enddo
ifflag=1then
?
"find"
else
?
"notfind"
endif
cancel
9.有序数列的插入算法。
(在定义数组时就多定义一个元素,如n=9,dimea(10))
(有序数列插入1.prg)
算法:
先将数列排好序,再将要插入的数据从数列中最后一个元素开始比较,如果数列中的元素大于待插入数据,则将数列中的数据后移,如果小于待插入数据则停止比较;然后再将待插入数据放入比它小的数据的后面。
clear
*输入数据到数组
input"输入n="ton
dimea(n+1)
fori=1ton
input"依次输入数据:
"toa(i)
next
*显示输入的数据
fori=1ton
?
?
a(i)
next
*排序
fori=1ton-1
forj=1ton-i
ifa(j)>a(j+1)
temp=a(j+1)
a(j+1)=a(j)
a(j)=temp
endif
next
next
*显示排序后的数据
?
fori=1ton
?
?
a(i)
next
*输入要插入的数据
input"请输入要插入的数据:
"tok
fori=nto1step-1
ifa(i)>k
a(i+1)=a(i)
else
exit
endif
next
a(i+1)=k
*显示插入后的结果
fori=1ton+1
?
?
a(i)
next
cancel
10.有序序列删除操作
算法:
先将数列排好序,再从第一个元素开始,找到后将待删除数据后面的数据依次前移。
clear
*输入数据到数组
input"输入n="ton
dimea(n)
fori=1ton
input"依次输入数据:
"toa(i)
next
*显示输入数据值
fori=1ton
?
?
a(i)
next
*排序
fori=1ton-1
forj=1ton-i
ifa(j)>a(j+1)
temp=a(j+1)
a(j+1)=a(j)
a(j)=temp
endif
next
next
*显示排序后的数据
?
fori=1ton
?
?
a(i)
next
*输入要删除的数据
input"请输入要删除的数据:
"tok
flag=.f.
fori=1ton
ifa(i)=k
flag=.t.
exit
endif
next
ifflag=.t.
forj=i+1ton
a(j-1)=a(j)
?
*显示删除后的序列
fori=1ton-1
?
?
a(i)
next
next
else
?
"没有需要删除的数据!
"
endif
11.字符串处理(插入、删除、连接和比较)与有序数列的插入、删除操作相似,但不需要排序
插入:
clear
*输入数据到数组
input"请输入字符串:
"tostr1
n=len(str1)
dimea(n+1)
*将字符串中的字符依次给数组a的各个元素
fori=1ton
a(i)=substr(str1,i,1)
next
*输入要插入的字符
input"请输入要插入的字符:
"tomychar
fori=nto1step-1
ifa(i)>mychar
a(i+1)=a(i)
else
exit
endif
next
a(i+1)=mychar
*显示插入后的结果
fori=1ton+1
?
?
a(i)
next
cancel
删除
clear
*输入数据到数组
input"请输入字符串:
"tostr1
n=len(str1)
dimea(n)
*将字符串中的字符依次给数组a的各个元素
fori=1ton
a(i)=substr(str1,i,1)
next
*输入要删除的字符
input"请输入要删除的字符:
"tomychar
flag=.f.
fori=1ton
ifa(i)=mychar
flag=.t.
exit
endif
next
ifflag=.t.
forj=i+1ton
a(j-1)=a(j)
next
*显示删除后的结果
fori=1ton-1
?
?
a(i)
next
else
?
"没有找到需要删除的字符!
"
endif
cancel
4.2二维数组
1)定义:
dimea(3,4)表示定义了一个3行4列的数组,共有3*4=12个元素,每个元素引用a(i,j)表示;
a(1,1)
a(1,2)
a(1,3)
a(1,4)
a(2,1)
a(2,2)
a(2,3)
a(2,1)
a(3,1)
a(3,2)
a(3,3)
a(3,4)
2)二维数组初始化
Fori=1to3
Forj=1to4
Input“请依次输入元素值:
”toa(i,j)
next
next
其中input语句也可以改为由随机函数rand()来赋值:
a(i,j)=int(rand()*(终值-初值+1)+初值)
3)二维数组输出
Fori=1to3
Forj=1to4
?
?
a(i,j)
Next
?
next
1.生成如图矩阵
clear
dimea(5,5)
fori=1to5
forj=1to5
docase
caseia(i,j)=2
casei=j
a(i,j)=1
otherwise
a(i,j)=3
endcase
nextj
nexti
fori=1to5
forj=1to5
?
?
a(i,j)
nextj
?
nexti