第06章 模块化程序设计习题参考答案Word格式.docx
《第06章 模块化程序设计习题参考答案Word格式.docx》由会员分享,可在线阅读,更多相关《第06章 模块化程序设计习题参考答案Word格式.docx(30页珍藏版)》请在冰点文库上搜索。
y=-x
Callmyabs(a,b)'
第2题
Functionfact(nAsInteger)aslong
t=1
Fori=1Ton
t=t*i
Nexti
fact=t
DimA%,b%,c%
a"
b=Val(InputBox("
c=Val(InputBox("
y=fact(a)+fact(b)+fact(c)
Printy
Subfact(nAsInteger,tAsLong)
t=t*i
Dima%,b%,c%,yAsLong,sAsLong
Callfact(a,y)'
调用过程计算a!
结果为y
s=s+y
b"
Callfact(b,y)'
c=Val(InputBox("
c"
Callfact(c,y)'
Prints
第3题
方法1定义Function过程Gdc(x,y),实现两个数求最大公约数
FunctionGdc(ByValx,ByValy)'
求最大公约数
yThen'
处理x、y,要求x<
=y
t=x:
x=y:
Forn=xTo1Step-1'
最大公约数所在区间为[1,x]
IfxModn=0AndyModn=0Then'
最大公约数判断
ExitFor
Nextn
Gdc=n
请输入第1个数"
请输入第2个数"
请输入第3个数"
m=Gdc(a,b)'
求得两个数a,b的最大公约数
m=Gdc(m,c)'
求m,c的最大公约数
Printm'
输出最大数
主程序可简化为:
m=Gdc(Gdc(a,b),c)'
嵌套调用求得a,b,c的最大公约数
第4题
方法1定义sub过程Myrand(),实现随机数产生
SubMyrand(aAsInteger,bAsInteger,nAsInteger)
Ifa>
bThen'
要求a<
=b
t=a:
a=b:
b=a
Randomize'
设置随机种子
r=Int(Rnd()*(b-a+1)+a)'
产生指定范围随机数
Printr'
输出随机数
Dima%,b%,n%
输入下限a"
输入上限b"
n=Val(InputBox("
输入个数n"
CallMyrand(a,b,n)
方法2定义Function过程Myrand(),实现随机数产生
FunctionMyrand(aAsInteger,bAsInteger,nAsInteger)
第5题
方法1定义数组赋值sub过程(ArrayLet),数组输出sub过程(ArrayPrint),数组求和Function过程(ArraySum)。
主程序定义动态数组,用随机数赋值,调用过程实现处理。
SubArrayLet(b()AsInteger,nAsInteger)'
数组赋值
Forj=1Ton
b(i,j)=Int(Rnd()*10)'
用(0,10)区间的随机整数给数组赋值
Nextj
SubArrayPrint(b()AsInteger,nAsInteger)'
数组输出
Printb(i,j);
Print
FunctionArraySum(b()AsInteger,nAsInteger)'
数组运算输出
s=0
Ifi=jOrj=n+1-iThen'
对角线元素求和
s=s+b(i,j)
Mysum=s
Dimm%,b%,n%
m=Val(InputBox("
输入m"
))'
输入数组大小
ReDima(1Tom,1Tom)AsInteger'
定义数组大小
CallArrayLet(a(),m)'
CallArrayPrint(a(),m)'
PrintArraySum(a(),m)'
数组运算
方法2定义数组赋值sub过程(ArrayProces),实现数组赋值、输出,求和。
SubArrayProces(b()AsInteger,nAsInteger,resultAsInteger)'
数组元素赋值
数组元素输出
result=s
Dimm%,b%,n%,y%
CallArrayProces(a(),m,y)'
数组处理
Printy'
结果输出
方法3定义数组赋值Function过程(ArrayProces),实现数组赋值、输出,求和。
FunctionArrayProces(b()AsInteger,nAsInteger)AsInteger'
ArrayProces=s
y=ArrayProces(a(),m)'
第6题
方法1定义Function过程Prime(n),n为判断的数据,m[2,n-1]为可能整除n的数,采用穷举法,判断n能否被所有的m整除。
若n不能被所有m[2,n-1]整除,则n为质数(prime=true)
FunctionPrime(nAsLong)AsBoolean'
定义函数,判断质数,返回值为逻辑值
DimmAsLong
Form=2Ton-1'
m为可能整除n的数,范围为[2,n-1]
IfnModm=0Then'
整除判断
ExitFor'
若整除,则不是质数,不再进行下一次判断,退出循环
Nextm'
若不能整除,则进行下一次判断,m=m+1
Ifn=mThen'
若n=m,则说明所有m不能整除n
Prime=True'
n是质数
Prime=False'
n不是质数
PrivateSubCommand1_Click()'
DimiAsLong
Fori=100To200'
判断100~200之间的所有数
IfPrime(i)=TrueThen'
调用函数判断1个数是否为质数
Printi;
是质数,则输出
s=s+1'
输出计数
IfsMod10=0Then'
控制输出换行
Print'
方法2定义Function过程Prime(n),n为判断的数据,m[2,sqr(n)]为可能整除n的数,采用穷举法,判断n能否被所有的m整除。
若n不能被所有m整除,则n为质数(prime=true)
Form=2Tosqr(n)'
m为可能整除n的数,范围为[2,sqr(n)]
Ifm>
=Sqr(n)Then'
若m>
=Sqr(n),则说明所有m不能整除n
IfPrime(i)Then'
方法3定义Function过程Prime(n),n为判断的数据,m[2,sqr(n)]为可能整除n的数,采用穷举法,判断n能否被所有的m整除。
若n不能被所有m[2,n-1]整除,则n为质数(prime=0)
FunctionPrime(nAsLong)AsInteger'
定义函数,判断质数,返回值为0或1
DimmAsLong,pAsInteger
p=0'
默认p=0,表示是质数,
Form=2ToSqr(n)'
p=1'
若整除,则p=1,表示不是质数
不是质数,不再进行下一次判断,退出循环
Prime=p'
若p=0,则n是质数;
若p=1,则n不是质数
IfPrime(i)=0Then'
第7题
方法1定义Function过程Prime(n),判断质数(prime=true);
定义Functionhw(n)判断回文数,返回值为逻辑值,通过调用两个函数判断回文质数
Sqr(n)Then'
Sqr(n),则说明所有m不能整除n
Functionhw(nAsLong)AsBoolean'
定义函数,判断回文数,返回值为逻辑值
获得n的各位数码,判断是否对称
Dima%,b%,c%,d%
a=n\10000'
a为第1位数字
b=(nMod10000)\1000'
b为第2位数字
c=(nMod100)\10'
c为倒数第2位数字
d=nMod10'
d为倒数第1位数字
Ifa=dAndb=cThen'
判断对称,是否为回文数
hw=True'
n是回文数
hw=False'
Fori=10000To99999'
判断10000~99999之间的所有数
IfPrime(i)=TrueAndhw(i)=TrueThen'
调用函数判断1个数是否为质数和回文数
是回文质数,则输出
MsgBox"
ok"
方法2
在方法1的主程序中,通过同时调用两个函数判断回文质数,这种方法效率不高,因为对任意1个数,都要进行质数和回文数判断,运算量大。
若考虑先判断质数,若是质数,再次基础上再判断是否是回文数,这种方法就可以减少对不是质数的数进行回文判断。
因此,主程序修改如下:
DimiAsLong
IfPrime(i)=TrueThen'
Ifhw(i)=TrueThen'
调用函数判断1个数是否为回文数
EndIf
方法3
在方法2的主程序中,若考虑先判断质数,若是质数,再次基础上再判断是否是回文数,这种方法就可以减少对不是质数的数进行回文判断。
但是,判断质数的运算量相对判断回文数运算量,判断质数的运算量较大,这种方法效率不够高效。
改进的方法是先进行回文数判断,若是回文数,再进行质数判断,可减少运算量。
Ifhw(i)=TrueThen'
方法4定义Function过程Prime(n),判断质数(prime=true);
IfnModm=0Then'
采用字符处理方式,判断回文数,返回值为逻辑值
将n装换为字符串,获取各位数码,判断是否对称
Dims$,a$,b$,c$,d$
s=LTrim(Str(n))
a=Mid(s,1,1)'
b=Mid(s,2,1)'
c=Mid(s,4,1)'
d=Mid(s,5,1)'
方法5定义Function过程Prime(n),判断质数;
定义Functionhw(n)判断回文数,返回值为逻