第7章 数组与自定义数据类型 2Word文档格式.docx
《第7章 数组与自定义数据类型 2Word文档格式.docx》由会员分享,可在线阅读,更多相关《第7章 数组与自定义数据类型 2Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
分析一下这个程序的功能是什么。
1DimnAsInteger,kAsInteger,xAsInteger,rAsInteger'
模块级变量
2Dima(8)AsInteger'
模块级数组
3PrivateSubconv(dAsInteger,r,i)
4i=0
5DoWhiled<
>
0
6i=i+1
7a(i)=dModr:
d=d\r
8Loop
9EndSub
10
11PrivateSubForm_click()
12x=12'
A语句
13r=2'
B语句
14PrintCStr(x);
"
("
;
CStr(r);
)="
15Ifx=0Then
16Print0
17Else
18Callconv(x,r,n)
19Fork=nTo1Step-1
20Printa(k);
21Nextk
22Print
23EndIf
24EndSub
2.阅读下面程序,当单击窗体时,窗体上显示的内容是(3)。
1PrivateSubForm_Click()
2Dima(3,3)AsInteger:
DimiAsInteger
3a(1,1)=1:
a(1,2)=2:
a(1,3)=3:
a(2,1)=4
4a(2,2)=5:
a(2,3)=6:
a(3,1)=7:
a(3,2)=8:
a(3,3)=9
5Fori=1To3
6Fork=1Toi
7Callchang(a,i)
8Next
9Next
10Fori=1To3
11Fork=iTo3
12Printa(i,k)&
"
13Next
14Next
15EndSub
16
17Subchang(a()AsInteger,iAsInteger)
18c=a(i,UBound(a,2))
19Fork=UBound(a,2)-1To1Step-1
20a(i,k+1)=a(i,k)
21Next
22a(i,1)=c
23EndSub
3.下面的事件过程把一维数组中元素的值向右循环移位,移位次数由文本框输入。
“循环”指的是最右边的元素值补到最左边。
例如,数组各元素的值依次为0,1,2,3,4,5,6,7,8,9,10;
移位三次后,各元素的值依次为:
8,9,10,0,1,2,3,4,5,6,7。
在画线处填入适当的语句。
1PrivateSubCommand1_Click()
2DimintArray(10)AsInteger
3DimintIAsInteger,intJAsInteger,intKAsInteger
4ForintI=0To10
5intArray(intI)=intI
6Next
7intJ=Text1.Text
8Do
9intK=intK+1
10(4)
11LoopUntil(5)
12ForintI=0To10
13PrintintArray(intI)
17PrivateSubMoveright(intA()AsInteger)
18DimintIAsInteger,intJAsInteger,intKAsInteger
19intI=UBound(intA):
intJ=intA(intI)
20ForintK=intIToLBound(intA)+1Step-1
21(6)
22Next
23(7)
4.本程序段的功能是重新排列数组a中元素的值,使相等元素值相邻存放,并且保持它们在数组中首次出现时的相对次序。
在画线处填入适当内容。
例如,原数组:
1,2,4,3,3,3,2,1,4,5
重排后:
1,1,2,2,4,4,3,3,3,5
排列的原理是:
先删去重复元素,再根据各元素在数组中出现的次数展开排列。
1DimnAsInteger
2DimiAsInteger,jAsInteger,kAsInteger,tAsInteger,mAsInteger
3Dima()AsInteger,b()AsInteger
4n=10
5ReDima(n),b(n)
6a
(1)=1:
a
(2)=2:
a(3)=4:
a(4)=3:
a(5)=3
7a(6)=3:
a(7)=2:
a(8)=1:
a(9)=4:
a(10)=5
8m=1
9(8)
10DoWhilem<
=t
11k=1:
i=m+1
12DoWhilei<
13Ifa(i)=a(m)Then
14k=k+1
15Forj=(9)
16a(j)=a(j+1)
17Nextj
18t=t-1
19Else
20(10)
21EndIf
22Loop
23b(m)=k:
m=m+1
24Loop
25t=n
26Fori=m-1To1Step-1
27Forj=1To(11)
28a(t)=a(i)
29(12)
30Nextj
31Nexti
32Forj=1Ton
33Printa(j)
34Nextj
5.本程序生成50个位于-100~100之间的不重复的随机整数,并找出第几个是最大值(执行结果如图7.15所示)。
填空完善程序。
1OptionBase1
2PrivateSubCommand1_Click()
3DimiAsInteger,kAsInteger,tAsInteger,sAsInteger
4DimmaxAsInteger,pmaxAsInteger
5Dima()AsInteger
6Randomize
7max=-100
8pmax=1
9(13)
10Do
11IfRnd>
0.5Thens=1Elses=-1
12t=s*Int(Rnd*100)+1
13(14)
14DoWhilek<
i
15Ift<
a(k)Then
16k=k+1
17Else
18ExitDo
19EndIf
20Loop
21Ifk=iThen
22(15)
23a(k)=t
24Printa(k);
25i=i+1
26If(i-1)Mod10=0ThenPrint
27Ifmax<
tThenmax=t:
(16)
28EndIf
29LoopUntili>
50
30Print
31Print"
最大值为"
max;
,位于第"
pmax;
个"
32EndSub
四、改错题
下面程序的功能是分别找出48、308和1155三个数的所有质因子(如图7.16所示)。
要求:
(1)新建工程,输入以下代码;
(2)改正程序中的错误,改错时,不得增加或删除语句;
(3)分别以tform和tprj为文件名将窗体和工程保存到C:
盘新建的文件夹t中。
1PrivateSubForm_click()
2DimFac()AsInteger,N(3)AsInteger
3DimIAsInteger,JAsInteger
4N
(1)=48:
N
(2)=308:
N(3)=1155
5ForI=1To3
6CallFactor(Fac,N(I))
7PrintN(I);
的质因子有:
"
8ForJ=1ToUBound(Fac)
9PrintFac(J);
10Next
11Print
12ReDimFac(I)
13Next
14EndSub
15
16PrivateSubFactor(F()AsInteger,ByValN()AsInteger)
17DimIAsInteger,JAsInteger,IdxAsInteger
18DimKAsInteger
19K=2
20DoUntilN=1
21IfNModK=0Then
22Idx=Idx+1
23ReDimF(Idx)
24F(Idx)=K
25N=N/K
26Else
27K=K-1
29Loop
30EndSub
五、编程题
1.编程找出三个三位数,它们分别是某三个二位数的平方,且1~9这九个数字在这三个三位数中各只允许出现一次。
2.定义一个二维动态数组a(1Ton,1Ton)代表n×
n的方阵(n由文本框输入)。
编程给数组元素赋值,使之成为如下所示的螺旋方阵(图中是n=5时的情况)。
3.有17个人围成一个圈(编号为0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。
求此人原来的编号是多少。
4*.编写递归函数过程实现折半查找。
5*.编写一个求多个正整数最大公约数的递归函数。
参考答案
1.D2.B3.B4.A5.D
1.√2.×
3.×
4.√5.×
6.×
7.√8.√
1.
(1)12
(2)=1100
(2)64(8)=100
2.(3)3,1,2,6,4,9,
3.(4)CallMoveright(intArray)或MoverightintArray(5)intK=intJ
(6)intA(intK)=intA(intK-1)(7)intA(LBound(intA))=intJ
4.(9)t=n(9)iTot-1(10)i=i+1(11)b(i)(12)t=t-1
5.(13)i=1(14)k=1(15)ReDimPreservea(k)(16)pmax=k
(1)第16行中形参N后面的空括号应删除
(2)第23行应为:
ReDimPreServeF(Idx)
(3)第27行应为:
K=K+1.
1.这三个三位数分别是:
361、529和784。
2DimintA(10To31,1To4)
3Dimint1AsInteger,int2AsInteger,int3AsInteger
4Dimint4AsInteger
5Dimbln1AsBoolean
6Forint1=10To31
7intA(int1,1)=int1*int1
8intA(int1,2)=intA(int1,1)Mod10
9intA(int1,3)=intA(int1,1)\10Mod10
10intA(int1,4)=intA(int1,1)\100
11Next
12Forint1=10To31
13Forint2=int1+1To31
14Forint3=int2+1To31
15Forint4=1To9
16bln1=False
17bln1=bln1Or(int4=intA(int1,2))
18bln1=bln1Or(int4=intA(int1,3))
19bln1=bln1Or(int4=intA(int1,4))
20bln1=bln1Or(int4=intA(int2,2))
21bln1=bln1Or(int4=intA(int2,3))
22bln1=bln1Or(int4=intA(int2,4))
23bln1=bln1Or(int4=intA(int3,2))
24bln1=bln1Or(int4=intA(int3,3))
25bln1=bln1Or(int4=intA(int3,4))
26IfNotbln1ThenExitFor
27Next
28
29Ifint4=10Then
30PrintintA(int1,1),intA(int2,1),intA(int3,1)
31EndIf
32Next
33Next
34Next
35EndSub
2.
2Dima()AsInteger
3DimncAsInteger,nrAsInteger,nAsInteger
4DimiAsInteger,jAsInteger,kAsInteger
5n=Cint(Text1.Text)
6ReDima(1Ton,1Ton)
7nc=n:
nr=1:
i=1:
j=1
8Fork=1Ton*n
9a(i,j)=k
10Ifi<
ncAndj=nrThen
11i=i+1
12ElseIfi=ncAndj<
ncThen
13j=j+1
14ElseIfi>
nrAndj=ncThen
15i=i–1
16ElseIfi=nrAndj>
nr+1Then
17j=j–1
18EndIf
19Ifi=nrAndj=nr+1Then
20nc=nc–1
21nr=nr+1
22EndIf
23Next
24Fori=1Ton
25Forj=1Ton
26Printa(i,j),
28Print
29Next
3.10号。
解法一:
2DimintA(0To16)AsInteger
3DimintNumAsInteger
4Dimint1AsInteger
5Dimint2AsInteger
6Forint1=0To16
7intA(int1)=1
8Next
9int1=0
10int2=0
11intNum=17
12DoWhileintNum>
1
13int1=int1+intA(int2)
14Ifint1Mod3=0AndintA(int2)<
0Then
15intA(int2)=0
16intNum=intNum-1
17EndIf
18int2=int2+1
19Ifint2>
16Thenint2=0
21Forint1=0To16
22IfintA(int1)=1ThenPrintint1
解法二:
2DimintA(0To16)AsBoolean
4Dimint1AsInteger
6int1=0
7int2=0
8intNum=17
9DoWhileintNum>
10DoWhileintA(int2)
11int2=int2+1
12Ifint2>
13Loop
14int1=int1+1
15Ifint1Mod3=0Then
16intA(int2)=True
17intNum=intNum-1
19int2=int2+1
20Ifint2>
21Loop
22Forint1=0To16
23IfNotintA(int1)ThenPrintint1
24Next
25EndSub
4.
1FunctionSearch3(a()AsInteger,intStartAsInteger,_
2intEndAsInteger,bAsInteger)AsInteger
3DimmAsInteger,nAsInteger,int1AsInteger
4m=intStart
5n=intEnd
6int1=(m+n)\2
7Ifb<
a(int1)Then
8n=int1-1
9Search3=Search3(a,m,n,b)
10ElseIfb>
11m=int1+1
12Search3=Search3(a,m,n,b)
13Else
14Search3=int1
15EndIf
16Ifm=nThen
17Search3=m
19EndFunction
说明:
对应于形参a()的实参为被搜索的数组(递增或递减),intStart和intEnd是数组下标的下界和上界,b是要查找的数值。
5.
1PrivateFunctiongcd(a()AsInteger)AsInteger
2DimiAsInteger,jAsInteger
3DimuAsInteger,vAsInteger,rAsInteger
4i=LBound(a)
5j=UBound(a)
6Ifi=jThen
7gcd=a(i)
8Else
9u=a(j-1)
10v=a(j)
11DoWhilev<
12r=uModv
13u=v
14v=r
15Loop
16a(j-1)=u
17ReDimPreservea(iToj-1)
18gcd=gcd(a)
20EndFunction
对应于形参a()的实参必须是动态数组,本函数计算并返回此数组各元素的最大公约数。