实验6 数组程序设计.docx

上传人:b****6 文档编号:5742877 上传时间:2022-12-31 格式:DOCX 页数:25 大小:630.32KB
下载 相关 举报
实验6 数组程序设计.docx_第1页
第1页 / 共25页
实验6 数组程序设计.docx_第2页
第2页 / 共25页
实验6 数组程序设计.docx_第3页
第3页 / 共25页
实验6 数组程序设计.docx_第4页
第4页 / 共25页
实验6 数组程序设计.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

实验6 数组程序设计.docx

《实验6 数组程序设计.docx》由会员分享,可在线阅读,更多相关《实验6 数组程序设计.docx(25页珍藏版)》请在冰豆网上搜索。

实验6 数组程序设计.docx

实验6数组程序设计

实验6数组程序设计

实验目的:

1.掌握的定义方法。

2.掌握静态和动态数组使用。

3.掌握控件数组的产生方法

4.明确控件数组中控件名称的特点

5.掌握运用控件数组的编程方法。

实验6.1一维数组

实验任务:

编程随机产生10个任意的两位正整数,并把它们保存在数组a(1To10)中,要求输出数组中所存放的10个数值,如图6-1所示。

图6-1实验6.1的实验结果

提示:

可以根据Rnd函数的取值范围来确定如何随机产生两位正整数。

实验6.2二维数组

实验任务:

编程用InputBox函数输入一个二维数组(矩阵),并在窗体上按如图6-2所示的标准格式输出每行中最大的元素。

图6-2二维数组的输出

提示:

1.输入时InputBox上的提示信息要表明当前输入的是矩阵中的哪一个元素(动态显示方法),如图6-3所示。

图6-3输入框

2.数组输入和输出,一般情况下都要使用两重循环结构。

外面一重循环对应于行的变化,里面一重循环对应于列的变化(列的变化比行的变化快)。

标准输出方式是在Picture1.Print语句的输出项之间用逗号间隔,输出时要产生3行⨯4列的效果,还应该在两重循环之间添加一个无参数的Picture1.Print语句,用来换行。

求每行的最大值也需要通过双重循环实现。

实验步骤:

1.完善代码

OptionExplicit

PrivateSubForm_Click()

Dima(4,3)AsInteger,iAsInteger,jAsInteger

DimmaxAsInteger

Fori=1To4

Forj=1To3

a(i,j)=InputBox("请输入矩阵的第("&i&","&j&")元数","输入矩阵元数")

Picture1.Printa(i,j),

Nextj

Nexti

Fori=1To4

Forj=2To3

Ifmax

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1