Nextj
Picture1.Print"第"&i&"行最大的是:
";max
Nexti
EndSub
2.保存文件,调试运行。
思考:
如果要求显示每行最大元素的行列位置,应如何修改代码。
实验6.3判断完数
实验任务:
已知一个数如果恰好等于它的因子之和,这个数就被称为“完数”。
一个数的因子是指除了该数本身以外能够被其整除的数。
例如6是一个完数,因为6的因子是1,2,3,而且6=1+2+3。
要求编程对于任意输入的一个数,能够判断出该数是否是完数,并对不同结果进行输出;单击“输入下一个数”时,要清除文本框和图片框中的内容,并且光标在文本框中闪烁。
提示:
可以将输入的数的因子逐个求出,放到数组中,并对因子进行累加,若为完数或不是完数结果输出如图6-4所示。
因为无法预知因数的个数,所以要使用动态数组。
图6-4运行结果界面
实验步骤:
1.窗体布局,在窗体上摆放Label、TextBox、Frame、PictureBox(用于显示结果)各一个,在将三个CommandButton拖放到窗体上,具体布局参见图6-4。
2.完善代码
PrivateSubCmdJudeg_Click()
DimmAsInteger,iAsInteger,jAsInteger,kAsInteger
Dima()
m=Text1.Text
ReDima
(1)'重定义数组
a
(1)=1
‘k=1
j=1
Fori=2To‘m-1
IfmModi=0Then
k=k+i'因数和
j=j+1'因数个数
ReDimPreservea(j)'重定义数组,且保留原有数据
a(j)=i'将因数保存在数组中
EndIf
Nexti
Ifm=kThen
Picture1.Printm&"是完数,因为"
Picture1.Printm;"=";
Fori=1ToUBound(a)-1'UBound(a)求数组上界函数
Picture1.Printa(i);"+";
NextI
Picture1.Printa(i)'输出最后一个因数
Else
Picture1.Printm&"不是完数"
EndIf
EndSub
PrivateSubCmdExit_Click()
UnloadMe
EndSub
PrivateSubCmdNext_Click()
Picture1.Cls'清除图片框中内容
Text1.Text=""
‘Text1.SetFocus
EndSub
3.保存文件,调试运行。
思考:
如何修改程序求出1000以内的所有“完数”并将结果存入一个文件?
试一试。
实验6.4成绩统计
实验任务:
编程随机产生32个学生的计算机课程的成绩存放数组Mark(1To32)中,统计各分数段50~59、60~69、70~79、80~89、90~100的人数n以及求出最高分max和最低分min。
结果输出要求:
32名学生的成绩按每行8个显示在窗体上,第5行显示最高分和最低分,并以同样输出格式将结果存放于顺序文件out.dat中。
提示:
统计各分数段的人数,可以利用数组下标来实现。
实验6.5计算天数
实验任务:
编程任意输入一个日期,即可计算出这个日期是一年中的第几天。
提示:
一年中的每一个月天数是一定的,只有闰年时,2月份是29天,所以要对输入的年份进行闰年判断。
另外,每月的天数可以事先赋值到数组中,但是用InputBox从键盘接受多个固定数据很不方便,VB中又没有给数组赋初值的语句。
为解决这一问题,采用将初值放在ListBox中,运行时用代码将ListBox中的数据给数组赋初值。
闰年算法是年份能被4整除同时不能被100整除,或者年份能被100整除同时能被400整除,这一年就是闰年,是闰年就用一个标签框表示出来。
将闰年和非闰年的1~12月份的天数分为两组,放置在两个ListBox中,定义一个两维数组mtable(2,12),第一维作为闰年标致,第二维作为月份天数。
两个ListBox在运行时不显示出来,见图6-6。
对于固定1到12个月和1到31天这些数字,将它们放在两个组合框中便于选择。
实验步骤:
1.窗体布局设计如图6-5所示。
图6-5计算天数窗体布局
图6-6计算天数运行界面
2.部分控件属性设置
控件名称
属性名称
属性值
组合框1
Name
CmbMonth
Text
1
List
123456789101112
Style
0
组合框2
Name
CmbDay
Text
1
List
12345678......3031
Style
0
列表框1
List
312831303120313130313031
Visible
False
列表框2
List
312931303120313130313031
Visible
False
闰年显示标签框
Name
LabLeap
Caption
闰年
Font
斜体4号字
Visible
False
3.添加代码
OptionBase1’数组下标从1开始
PrivateSubCmdCountdays_Click()
DimdaysAsInteger,iAsInteger,leapAsInteger
Dimmtable(2,12)AsInteger
Forj=1To12
mtable(1,j)=List1.List(j-1)’将非闰年的月份天数赋给数组
Nextj
Forj=1To12
mtable(2,j)=List2.List(j-1)’将闰年的月份天数赋给数组
Nextj
leap=1’标志闰年的变量赋初值1
If(TxtYearMod4=0AndTxtYearMod100<>0OrTxtYearMod400=0)Then
leap=2’闰年则标志变量值变为2
LabLeap.Visible=True’闰年标签出现
EndIf
days=CmbDay.Text
Fori=1ToCmbMonth.Text-1
days=days+mtable(leap,i)‘闰年标志作变量为下标变量
Nexti
TxtDays.Text=days
EndSub
PrivateSubTxtYear_Change()
LabLeap.Visible=False'输入年份时,闰年标签隐藏
EndSub
PrivateSubCmdExit_Click()
UnloadMe
EndSub
4.保存文件,调试运行。
随机输入四位数的不同年份,仔细体验各种控件、属性、事件的作用;深刻理解leap变量的作用。
实验6.6字符数组
实验任务:
编程随机产生15个不重复的英文大写字母,存放在字符数组中并显示出来。
提示:
1.可以利用函数Rnd和Chr使得随机产生数值可转变为字符。
2.每产生一个新的字符要与已经存在的字符逐一比较,非重复字符方可存入。
实验6.7数值排序
实验任务:
编程产生10个二位随机整数,按升序排列。
提示:
假设在数组A中存放N个无序数据,要求将这N个数按升序重新排列。
第一轮比较:
将A
(1)和A
(2)比较,若A
(1)>A
(2)则交换这两个数组元素的值,否则不交换;然后再用A
(2)和A(3)比较,处理方法相同;⋯⋯以此类推,直到A(N-1)和A(N)比较后,这时A(N)中就存放了N个数中最大的数。
第二轮比较:
将A
(1)和A
(2)、A
(2)和A(3),⋯⋯,A(N-2)和A(N-1)比较,处理方法和第一轮相同,这一轮比较结束后A(N-1)中就存放了N个数中第二大的数。
第N-1轮比较:
将A
(1)和A
(2)进行比较,处理方法同上,比较结束后,这N个数按从小到大的次序排列好。
这种排序方法较冒泡排序,它与选择排序法的不同之处在于:
选择排序法每一轮比较是拿固定位置的数组元素和其后的若干数组元素依次比较;而冒泡排序法则是将相邻的两个数组元素进行比较,实现上类似但不完全相同。
实验步骤:
1.完善代码
PrivateSubForm_click()
DimrndArray(10)AsInteger
DimiAsInteger,jAsInteger,tempAsInteger
Randomize’随机语句
Print"排序前:
"
Fori=1To10
rndArray(i)=Int(90*Rnd+10)’Rnd随机函数
PrintrndArray(i);
Nexti
Fori=1To_____________
Forj=______To_____________
If_________________Then
temp=______
________
__________
EndIf
Nextj
Nexti
Print
Print"排序后:
"
Fori=1To10
PrintrndArray(i);
Nexti
Print
EndSub
2.保存文件,调试运行。
实验6.8加密解密
实验任务:
编程对任意输入的英文短语加密和解密。
要求
(1)按照原字母ASCII码加2的规则进行加密。
(2)按照加密后的字母ASCII码减2的规则进行解密。
(3)用InputBox从键盘输入短语;加密和解密的结果用MsgBox输出。
提示:
可以用四个命令按钮构成控件数组。
编制代码时用IF-Then-Else对控件数组的下标(Index)进行判断,以便执行相应的操作。
实验步骤:
1.在窗体上摆放一个命令按钮,并对其设置相关属性(见属性设置表),用复制、粘贴的方法产生另外两个命令按钮。
形成控件数组,见图6-7。
2.属性设置
控件
属性
设置值
窗体1
Caption
加密解蜜
命令按钮1(0)
Name
cmdOperate
Caption
输入短语
Font
小四、粗体
命令按钮1
(1)
Name
cmdOperate
Caption
加密
Font
小四、粗体
命令按钮1
(2)
Name
cmdOperate
Caption
解密
Font
小四、粗体
命令按钮1(3)
Name
cmdOperate
Caption
退出
Font
小四、粗体
3.添加代码
OptionExplicit
DimsPhraseAsString,sEncryptedAsString'说明共用变量
DimiLenAsInteger
PrivateSubcmdOperate_Click(IndexAsInteger)
'其中Index参数是命令按钮下标,系统会自动产生。
DimsCurrentAsString,sNewAsString
DimsDecryptedAsString
DimxAsInteger
IfIndex=0Then
sPhrase=InputBox("请输入短语","短语将被加密")
iLen=Len(sPhrase)'计算长度
ElseIfIndex=1Then
sEncrypted=""'变量初始化
Forx=1ToiLen'加密
sCurrent=Mid(sPhrase,x,1)
sNew=Chr(Asc(sCurrent)+2)
sEncrypted=sEncrypted&sNew
Nextx
MsgBoxsEncrypted,vbExclamation,"加密的短语"'输出加密结果
ElseIfIndex=2Then
Forx=1ToiLen
sCurrent=Mid(sEncrypted,x,1)'解密
sNew=Chr(Asc(sCurrent)-2)
sDecrypted=sDecrypted&sNew
Nextx
MsgBoxsDecrypted,vbExclamation,"解密的短语"'输出解密结果
Else
UnloadMe
EndIf
EndSub
4.保存文件,调试运行,结果参见图6-8。
图6-8输入、加密、解密对话框
思考:
若要使YZ和yz加密变为AB和ab,即最后两个字母加密变成前两个字母而不是其它的符号,解密与此反之即可。
该怎样修改程序?
实验6.9旅游路线
实验任务:
编程提供有关旅游线路、出行方式以及相应价格。
旅游线路有三条,每一条旅游线都提供两种出行方式,且对应的价格不同,具体数据见下表。
要求:
三条旅游线路的选择用一组选项按钮(单选按钮)实现;当选中某条线路时,出现与这条线路相关的两种出行方式;选中具体的出行方式后,显示出对应的价格。
旅游线路
出行方式
价格(元/人)
南京-青岛-大连
双卧6日游
1580
单飞5日游
1880
南京-三峡-重庆
单飞7日游
1880
轮船12日游
1280
南京-杭州-普陀
汽车5日游
780
双飞3日游
1080
提示:
由于三条旅游线路共对应六种出行方式,当选中某条线路时,只能出现与这条线路相关的两种出行方式,另外四种出行方式要隐藏起来。
所以将六种出行方式分为三组,每次出现其中的一组,隐藏其它两组。
实验步骤:
1.在窗体上放置一个标签框,一个图象框(PictureBox)和一个命令按钮;
2.放置框架1(Frame控件),在框架中用控件数组的方式产生一组(三个)单选按纽,用来提供旅游线路。
3.放置框架2(Frame控件),在框架中用控件数组的方式产生一组(两个)单选按纽,用来提供第一条旅游线路所对应的出行方式。
选中框架2,对其进行两次复制、粘贴操作(框架中的单选按钮会一同被复制),既产生一组(三个)框架控件数组;这三个框架中的六个单选按钮,也自动形成一组控件数组(图6-9)。
将各个控件的属性设计好后,把旅游方式三个框架重叠在一起,运行界面效果如图6-10所示。
注意,通过对框架2控件数组的可见性(Visible)属性的不同设置,就可以控制某一个框架出现,而另两个隐藏起来。
4.属性设置
控件
属性
设置值
窗体1
Caption
旅游咨询
标签框1
Caption
价格
Font
小四、粗斜体
图象框1
Name
PctPrice
Font
小四、粗体
框架1
Name
FrmRoad
Caption
旅游线路
单选按钮1(0)
Caption
南京-青岛-大连
Font
小四、斜体、华文彩云
单选按钮1
(1)
Caption
南京-三峡-重庆
Font
小四、斜体、华文彩云
单选按钮1
(2)
Caption
南京-杭州-普佗
Font
小四、斜体、华文彩云
框架2(0)
Name
FrmWay
Caption
旅游方式
Visible
True
框架2
(1)
Name
FrmWay
Caption
旅游方式
Visible
false
框架2
(2)
Name
FrmWay
Caption
旅游方式
Visible
false
单选按钮2(0)
Caption
双卧6日游
单选按钮2
(1)
Caption
单飞5日游
单选按钮2
(2)
Caption
单飞7日游
单选按钮2(3)
Caption
轮船12日游
单选按钮2(4)
Caption
汽车5日游
单选按钮2(5)
Caption
双飞3日游
命令按钮1
Name
cmdExit
Caption
退出
5.添加代码
OptionExplicit
PrivateSubOption1_Click(IndexAsInteger)
SelectCaseIndex
Case0
FrmWay(0).Visible=True’按匹配条件选定旅游方式的框架可见
FrmWay
(1).Visible=False’不匹配的框架不可见
FrmWay
(2).Visible=False
PctPrice.Cls’图象框清屏
Option2(0).Value=False’单选按钮初始化
Option2
(1).Value=False
Case1
FrmWay
(1).Visible=True
FrmWay(0).Visible=False
FrmWay
(2).Visible=False
PctPrice.Cls
Option2
(2).Value=False
Option2(3).Value=False
Case2
FrmWay
(2).Visible=True
FrmWay(0).Visible=False
FrmWay
(1).Visible=False
PctPrice.Cls
Option2(4).Value=False
Option2(5).Value=False
EndSelect
EndSub
PrivateSubOption2_Click(IndexAsInteger)
SelectCaseIndex
Case0
PctPrice.Cls
PctPrice.Print"1580元/人"
Case1
PctPrice.Cls
PctPrice.Print"1880元/人"
Case2
PctPrice.Cls
PctPrice.Print"1980元/人"
Case3
PctPrice.Cls
PctPrice.Print"1280元/人"
Case4
PctPrice.Cls
PctPrice.Print"980元/人"
Case5
PctPrice.Cls
PctPrice.Print"1180元/人"
EndSelect
EndSub
PrivateSubCmdExit_Click()
UnloadMe
EndSub
6.保存文件,调试运行。
测试各种旅游线路和出行方式的组合情况,参见图6-10。
思考:
请自己添加两条旅游线路,以及配套的出行方式。
将旅游线路改放在组合框控件中,以便选择;出行方式仍用本例中的框架控件数组方法;修改代码实现功能。
习题6
习题6.1选择题
1.如下数组声明语句,()正确。
(A)Dima[3,4]AsInteger(B)Dima(3,4)AsInteger
(C)Dima(n,n)AsInteger(D)Dima(34)AsInteger
2.要分配存放如下方阵的数据,可使用数组声明语句()来实现(不能浪费空间)。
(A)Dima(9)AsSingle
(B)Dima(3,3)AsSingle
(C)Dima(-1To1,-5To-3)AsSingle
(D)Dima(-3To-1,5TO7)AsInteger
3.如下数组声明语句,数组a包含元素的个数为()。
Dima(3,-2to2,5)
(A)120(B)75(C)60(D)13
4.以下程序输出的结果是()。
Dima
a=Array(1,2,3,4,5,6,7)
Fori=Lbound(a)ToUbound(a)
a(i)=a(i)*a(i)
Nexti
Printa(i)
(A)49(B)0(C)不确定(D)程序出错
5.以下程序输出的结果是()。
OptionBase1
PrivateSubCommandl_Click()
Dima%(3,3)
Fori=1To3
Forj=1To3
Ifi>1Andj>1Then
a(i,j)=a(a(i-1,j-1),a(i,j-1))+1
E1se
a(i,j)=i*j
EndIf
Printa(i,j);"";
Nextj