《面向对象程序设计实验》指导书.docx
《《面向对象程序设计实验》指导书.docx》由会员分享,可在线阅读,更多相关《《面向对象程序设计实验》指导书.docx(22页珍藏版)》请在冰豆网上搜索。
![《面向对象程序设计实验》指导书.docx](https://file1.bdocx.com/fileroot1/2023-1/30/df810161-f46e-4a65-beee-75d0ae47e297/df810161-f46e-4a65-beee-75d0ae47e2971.gif)
《面向对象程序设计实验》指导书
《面向对象程序设计实验》
指导书
实验日期
实验111.20
实验2:
11.27
实验3:
12.4
适应专业:
通信工程06级~08级
学时:
16
执笔人:
xxx
实验一制作图片浏览器
一实验目的:
学习并掌握VisualBasic基本控件的使用,学习并掌握VisualBasic6.0的基本语法规则,理解并掌握容器的概念,掌握面向对象编程的基本原理与方法。
二实验内容:
利用PicturBoxe、Image控件结合文件系统空间制作支持多种静态图片文件格式的浏览器。
三实验原理:
VisualBasic6.0支持几乎全部的图片格式,包括BMP,JPGGIF,CUR,ICO等格式,通过文件系统控件可以访问到全部本地磁盘、软盘、光盘、移动存储设备以及局域网内用油访问权限的逻辑磁盘上的文件,通过利用FileListBox控件的文件过滤功能,将可显示的图片罗列出来后在Image控件中进行显示。
PictureBox控件是一款用来加载和处理图片的控件,它不仅仅可以用来显示图片,而且可以加载上面的图片进行更高级的编辑,如按位操作、像素级图像处理等,PictureBox拥有独立的坐标系统,可作为容器来加载其他控件。
Image控件是一款专门用来显示图片的控件,它可以显示全部图像格式,同时由于具备Stretch属性,可以使图像按照Image控件的二维视图区域进行显示,又由于该控件占用的内存空间比PictureBox控件小得多,因此在不对图像进行处理的场合下应优先选择。
加载图像使用VB自带的LoadPicture函数,它的引用方法为:
Picture1.picture=LoadPicture(Pathname)
Image1.picture=LoadPicture(Pathname)
其中Picture1为图片框控件PictureBox的对象引用名称,Image1为图像框控件Image的对象引用名称。
Pathname为图片文件的路径。
由于本实验仅仅涉及图片的浏览,因此建议使用Image控件。
同时,显示过程中为了保证图像显示的完整性,应该使Image控件的大小符合图片自身的大小,在支持缩放时,图片的高和宽两项参数应该按比例同时发生变化。
在显示图片时,首先应该将Image控件的Visible属性设置为False,Stretch属性设置为False,此时,Image控件不可见,同时,加载图片后,Image控件的大小与图片的原始大小相同。
为了适应显示窗口,需要选择具有独立坐标系统的PictureBox控件作为显示区,并要求Image控件在PictureBox的限定范围内显示全部的图像信息。
由于图片的自身大小各异,高宽比(Height/Width)未知,因此,为了在限定显示区内显示全部图片信息,应该考虑图像自身高宽比与显示区高宽比的关系,它们的比例关系有如下两种情况,见下图:
显示区
显示区
图1图2
在图1中,图片的高宽比小于显示区的高宽比,此时,为了显示全部图像信息,应将图片的高度等同于显示区的高度,而宽度则按比例做适应性调整。
在图2中,图片的高宽比大于显示区的高宽比,此时,为了显示全部图像信息,应将图片的宽度等同于显示区的宽度,而高度则按比例做适应性调整。
当然,若图片与显示区高宽比相同,则按上述两种情况之一执行即可。
当图片的大小小于显示区,可直接进行显示不必进行调整。
另外,在对图片进行浏览、缩放时需要对图片进行居中调整,可使显示效果更加美观。
图片的TOP属性=(显示区域高度-图片高度)/2
图片Left属性=(显示区域宽度-图片宽度)/2
具体示例代码如下:
DimWHPAsSingle‘定义图片框控件高宽比的变量
DimWHFAsSingle‘定义图像框控件(显示区域)高宽比的变量
Image1.Visible=False‘设置图片框不可见,避免显示抖动
Image1.Stretch=False‘设置图片框大小等同于随图片大小
Image1.Picture=LoadPicture(Pathname)‘加载图片到图片框
WHP=Image1.Width/Image1.Height‘取得图片框即原始图像的高宽比
WHF=Picture1.Width/Picture1.Height‘取得图像框即显示区域的高宽比
IfWHP>=WHFThen判断,若图片框高宽比大于或等于图像框高宽比
Image1.Width=Picture1.Width
Image1.Height=Image1.Width/WHP‘调整图片框宽度和高度参数
Else‘否则,若图片框高宽比小于图像框高宽比
Image1.Height=Picture1.Height
Image1.Width=Image1.Height*WHP‘调整图片框宽度和高度参数
EndIf
Image1.Top=(Picture1.Height-Image1.Height)/2
Image1.Left=(Picture1.Width-Image1.Width)/2‘居中调整图片框
Image1.Stretch=True‘拉伸图片到合适大小
Image1.Visible=True‘显示图片
四、实验步骤
1新建工程,名称自拟。
2添加一个窗体,名称自拟。
3添加六个Command控件,名称自拟。
添加一个Timer控件,设置它的Interval属性为1000。
4添加一个PictureBox控件,然后再将一个Image控件添加到PictureBox控件上。
5添加一个DriveListBox控件,一个DirListBox控件,一个FileListBox控件。
6在DriveListBox控件、DirListBox控件的Change事件中填写代码使三个文件系统控件实现连接互动。
在FileListBox控件的Click事件中填写加载图片文件以及位置调整的代码。
7将六个Command控件的Caption属性分别设置为:
“上一个”、“下一个”、“自动播放”、“停止”、“放大”、“缩小”,并在对应的Click事件中填写相关处理代码。
8选定菜单->文件->保存工程选项,保存工程后,按F5调试程序。
9打包,发布,异地安装并运行该程序。
10代码部分自主编写,可参考实验课示例代码。
其他可扩展部分自拟,功能应丰富,不拘泥于教师课堂讲授的内容。
五、实验中应注意的问题与思考题:
1当图片大小小于显示区间时,应使用原来大小现实图片,避免失真。
2如何保证文件列表控件显示的文件都是可显示文件类型?
3当加载文件为非法格式时,程序将出错中断,应怎样处理?
4如何设置慢速自动浏览,快速自动浏览及自定义浏览速度?
5应用程序界面自行定义,美观大方,不拖沓。
六、实验报告内容:
1实验原理与要求
2实验步骤截图
3程序源代码
4实验结果截图
5实验中遇到的问题及解决方案。
6回答思考题。
实验二制作圆盘式时钟
一实验目的:
通过实验了解并掌握VisuaBasic坐标系统的特征和开发技巧,了解并掌握Timer控件和Line、Shape控件的使用方法。
培养解决实际问题时数学建模能力。
二实验内容:
利用Timer控件和Line、Shape等控件利用制作一个圆盘式时钟。
要求时钟的初始化时间与系统时间相同。
三实验原理:
坐标系统
PC机的屏幕坐标原点位于屏幕的左上方。
从左至右为X轴正方向,从上至下为Y轴正方向。
如下图
第三象限第四象限
(0,0)
X
第一象限
第二象限
Y
圆盘式时钟的示例见下图X
(0,0)
秒针
时针
分针
Y
圆盘式时钟的三个指针:
时针、分针、秒针均为顺时针旋转。
它们的数学关系如下:
1秒=1/60分=1/3600小时。
而对于圆盘式时钟而言,由于圆周为2π。
则秒针单位转动增量弧度为2π/30=π/30。
当每秒钟秒针运行π/30时,分针的转动增量弧度为π/(30×60)=π/1800。
由于圆盘式时钟的一个圆周为12小时,则时针此时的转动增量弧度为:
π/(1800×12)=π/21600。
即,每秒钟秒针转动π/30,分针转动π/1800,时针转动π/21600。
当顺时针转动时,转动时弧度均为增量。
当某个指针转动一定的角度时,它的坐标位置会随着自身的转动而发生改变,当然,在这里指针的“轴”位置(x1,y1)不会发生改变,发生改变的是指针位置的坐标值(x2,y2)。
转动时,它们的数学关系为:
x2=x1+Cos(当前弧度)*指针长度。
当前弧度为指针在坐标系统中的弧度值,当指针指向0点时,弧度为3π/2
系统启动时,应保证时钟显示的当前时间与计算机系统的时间一致,此时应该应对指针进行一次初始化。
若当前系统时间为14:
58:
58,此时,将得到系统的小时、分、秒分别为14、58、58,在计算指针初始化弧度时,应考虑三个问题:
1每个指针因为当前时间值带来的弧度偏移量。
2分针除自身时间值带来偏移量外因为秒针偏移量带来的微小偏移。
3时针除自身时间值带来偏移量外因为分针偏移量带来的微小偏移。
如当前时间为14:
58:
58,则分针的指示位置不应该为指向58分的位置,而应该是很接近59分的位置,同理,时针的位置不该是指向14点(2点),而应该很接近15点(3点)的位置。
由于当指针位于零点时初始弧度为3π/2,因此此时它们的具体数学关系如下:
秒针偏移=秒数×2π/60=秒数×π/30。
分针偏移=分数×π/30+秒针偏移/60
时针偏移=时数×π/6+分针偏移/12
秒针位置=3π/2+秒针偏移
分针位置=3π/2+分针偏移
时针位置=3π/2+时针偏移
控件简介
Timer控件是VB集成的系统控件,它可在规定时间间隔内向用户发送中断,用户可在中断处理事件中填写相应处理代码以实现定时处理任务。
Timer控件设计时可见,运行时不可见,因此编程时可以不必考虑它在窗体的具体位置。
Timer控件的Interval属性提供给用户设置中断时间间隔,单位为毫秒,即1000毫秒=1秒。
当Interval属性为0时,Timer控件停止工作。
Enabled属性可看作是它的开关,当该属性值为True时,Teimer控件启动,若未False,则停止工作。
在本实验中,Timer控件的Interval属性设置为1000。
Line控件是绘图控件,它为用户提供一个线型外观,通过设置它的端点坐标值(x1,y2)(x2,y2)来设置它的位置,VB没有提供它的长度参数,不过它的长度可以通过空间两点距离公式求得:
长度=
用户可以设置它的显示颜色以及粗细等信息,其他属性见教材。
Shape控件是绘图控件,它为用户提供一个二维图形外观,可自由设置显示矩形、圆、椭圆等多种显示模型。
用户用户可以设置它的显示颜色以及粗细等信息,其他属性见教材。
示例代码见实验课附件
四、实验步骤
1创建一个工程,名称自拟
2添加一个窗体,名称自拟
3在窗体上放置一个Timer控件,一个Shape控件(表盘),三个Line控件(指针)控件名称自拟。
4设置Timer的中断属性为1000,设置Shape控件Shape属性为3即circle。
BroderWidth属性为5,调整三个Line控件,其中秒针最细长,分针次之,时针粗短,通过设置BroderWidth可调整指针的粗细,通过调整Brodercolor配置指针的颜色,配色方案自拟。
5在Form_Load事件中填写初始化代码
6在Timer控件的Timer事件中填写定时修改指针位置的代码。
7选定菜单->文件->保存工程选项,保存工程后,按F5调试程序。
8打包,发布,异地安装并运行该程序。
9代码部分自主编写,可参考实验课示例代码。
其他可扩展部分自拟,功能应丰富,不拘泥于教师课堂讲授的内容。
五、实验中应注意的问题与思考题:
1放置Line控件时其初始位置对运行结果有影响吗,如果有如何避免这种影响?
2如果Timer控件的Interval属性设置过小或过大,会影响显示效果吗,为什么?
3如果在程序执行过程中,用户修改系统时间,那么显示效果会发生变化吗?
如何实现保证显示效果与系统时钟的实时性?
4π的值定为3.1416。
如果取3.14会带来什么样的影响?
5由于时间偏移持续累加,如果程序长时间运行,会使保存时钟偏移的变量溢出,应该怎样解决这个问题?
六、实验报告内容:
1实验原理与要求
2实验步骤截图
3程序源代码
4实验结果截图
5实验中遇到的问题及解决方案。
6回答思考题。
实验三网络通信实验
一实验目的:
了解并掌握网络通信的基本原理与方法,了解TCP/UDP协议的通信原理与区别,掌握利用TCP/UDP协议的技术特征与编程方法。
了解并掌握Winsock控件的使用方法,掌握高层用户通信协议的设计方法。
培养编写网络通信程序的实践能力。
二实验内容:
利用TCP/UDP协议结合Winsock控件开发点对点、C/S模式通信程序。
三实验原理:
网络编程基础:
关于TCP和UDP
TCP:
传输控制协议,面向连接的网络传输模式,在传输数据前,发送端和接受端必须事先建立连接,然后再进行数据传输。
UDP:
用户数据报协议,面向无连接的网络传输模式,发送端发送数据前不必和接受端建立连接,只需直接发送数据即可。
特点:
TCP发送数据代价高,需要事先建立连接,但数据传输稳定,可靠。
在网络设施不可靠的情况下传输品质好。
UDP:
发送成本低,不需要建立连接,数据传输不稳定,不可靠。
但在网络设施可靠的情况下,性价比比TCP协议高。
微软为Visual系列用户提供了使用网络编程功能
MicrosoftVisualBasic提供了用于WindowsSockets编程的可用控件——Winsock控件。
该控件为用户提供了访问TCP和UDP网络的极其方便的途径。
并且适用于MicrosoftAccess、VisualBasic、VisualC++和VisualFoxPro等多种可视化环境。
通过Winsock控件编制C/S程序,程序员无须了解TCP或低级WinsockAPI调用实现的细节,如用户无须考虑网络字节顺序与本机字接顺序便可直接进行数据的传送。
用该控件实现网间进程通信极其方便。
Winsock控件的基本属性
IndexLocalPortRemotehost
RemotePortProtocol
Index:
控件数组的下标值。
LocalPort:
设置本地通信的端口。
1000以上即可。
Remotehost:
设置远程主机名。
可以是计算机名,也可
以是IP地址。
RemotePort:
设置远程主机的通信端口。
Protocol:
选择协议,TCP/UDP。
.事件:
Error错误DataArrival数据到达
ConnectionRequest连接请求Connect连接
.方法:
Bind[本地端口],[本地IP地址]绑定本地端口。
Accept[申请号]接受申请号。
Listen监听网络信号。
Close关闭网络连接和控件功能。
SendData[String]发送数据(字符串)。
Connect[远程主机],[远程主机端口]连接。
使用TCP协议编程
TCP协议即数据传输协议,它允许创建和维护与远程计算机的连接,使其彼此可以进行数据传输。
利用TCP协议通讯必须分别建立客户应用程序和服务器应用程序。
在TCP应用中,为了建立一个网络连接实例的服务器端,只需设置本地服务端口号,然后服务器调用方法Listen进入阻塞状态,等待来自客户的连接请求。
与此对应的客户端不但要将Winsock的属性RemoteHost置为服务器的名称(IP地址或网络代号),还应设置服务器所监听的相应服务的端口号(RemotePort),如FTP服务在21号端口,HTTP在81号端口等。
然后调用方法Winsock.Connect向服务器发出请求。
服务器接收到客户请求时,事件ConnectionRequest将被触发。
如服务器愿意提供服务,则可调用Accept方法接受连接。
一旦连接建立,两端均可使用SendData或GetData进行数据的发送或接收。
事件DataArrival将在另一端数据准备就绪时被触发。
简单的过程如下:
S为服务器,C为客户端。
S绑定本地端口,S监听端口,C设置服务器的主机名
或IP地址和远程端口,进行连接,S收到后接受请求,
建立连接,两端进行通信。
利用UDP协议编程方法
UDP协议也称为用户数据报文协议,是一个无连接协议。
何谓无连接协议?
就是说利用此协议连接时,不必象TCP协议那样:
需要服务器端侦听,客户机端请求连接,服务器端建立连接后双方才能通信。
另外,UDP应用程序可以是客户机,也可以是服务器程序,而不必向TCP应用程序那样必须分别建立客户机程序和服务器程序。
UDP协议通信的过程:
UDP协议中,为了在甲乙两机中传输数据,必须先分别设置两机的LocalPort属性;再将甲机的RemoteHost属性设置为乙机的IP地址,RemotePort属性设置为乙机的LocalPort属性值,此时甲机调用SendData方法就可以传送数据了,乙机同样使用DataArrival事件中的GetData方法来获取甲机发送给乙机的信息。
如想乙机向甲机传送数据,只需仿照上面的过程设置即可。
用UDP协议来传输信息较TCP协议来说简单的多,它无须侦听(LISTEN),也无须请求连接(CONNECT),就象我们平时发信一样,只要写好地址及收信人姓名并发送出去即可。
简单的过程如下:
A、B分别绑定本地端口(LocalPort)
A、B分别设置对方的主机名或IP地址为远程主机名(RemoteHost)
A、B分别设置对方的本地端口号为远程端口号
(RemotePort)
A、B双方可以发送数据(Senddata)
或接受数据(Getdata)
使用TCP/UDP实现C/S模式通信
C/S即Client—Server模式是一种一对多的通信模式,首先,所有客户端与服务器端建立连接,并将本地IP地址和端口通知服务器,此时,服务器得知所有客户端的IP地址和端口,此时,客户端可以通过服务器将数据转发给另一端的客户端,或者在通过服务器得到对方IP地址和端口后,直接将数据发送给对方客户端。
高层用户协议的设置
由于客户端-服务器、客户端-客户端通信不仅仅有普通的数据信息,更多的是诸如登录信息、上线、下线、客户端用户资料等诸多控制信息,因此,区分数据的性质是非常重要的,定制用户协议不可或缺。
设置用户协议的要求:
1避免冗余,数据报的合成采用“最小使用原则”。
2控制界限分明,避免解析错误。
3协议定义详细明确,避免二义性。
四、实验步骤
1创建一个工程,工程名字为TCPA
2添加一个窗体,窗体名称自拟。
3添加一个Winsock控件“W”,Protocol属性设置为0即sckTCPProtocol,添加两个TextBox控件“T1”“T2”,添加一个Command控件“Command1。
4填写代码
PrivateSubCommand1_Click()
W.Connect
EndSub
PrivateSubForm_Load()
W.RemotePort=1201
EndSub
PrivateSubT2_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=13Then
W.SendDataT2
T2=""
EndIf
EndSub
PrivateSubW_DataArrival(ByValbytesTotalAsLong)
DimaAsString
W.GetDataa
T1=T1&a&Chr(13)&Chr(10)
EndSub
5创建一个工程,工程名字为TCPB
6添加一个窗体,窗体名称自拟。
7添加一个Winsock控件“W”,Protocol属性设置为0即sckTCPProtocol,添加两个TextBox控件“T1”“T2”。
8填写代码
PrivateSubForm_Load()
W.Bind1201
W.Listen
EndSub
PrivateSubT2_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=13Then
W.SendDataT2
T2=""
EndIf
EndSub
PrivateSubW_ConnectionRequest(ByValrequestIDAsLong)
IfW.State<>sckClosedThenW.Close
MsgBox"连接成功,可以进行通信!
"
W.AcceptrequestID
EndSub
PrivateSubW_DataArrival(ByValbytesTotalAsLong)
DimaAsString
W.GetDataa
T1=T1&a&Chr(13)&Chr(10)
EndSub
9存盘,将两个工程分别在两台机器上运行调试
10创建一个工程,工程名字为UDPA
11添加一个窗体,窗体名称自拟。
12添加一个Winsock控件“W”,Protocol属性设置为1即sckUDPProtocol,添加两个TextBox控件“T1”“T2”。
13添加代码
PrivateSubForm_Load()
W.Bind1201
W.RemoteHost="192.168.0.3"
W.RemotePort=1200
EndSub
PrivateSubT2_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
IfKeyCode=13Then
W.SendDataT2
T2=""
EndIf
EndSub
PrivateSubW_DataArrival(ByValbytesTotalAsLong)
DimaAsString
W.GetDataa
T1=T1&a&Chr(13)&Chr(10)
EndSub
14创建一个工程,工程名字为UDPA
15添加一个窗体,窗体名称自拟。
16添加一个Winsock控件“W“,Protocol属性设置为1即sckUDPProtocol,添加两个TextBox控件“T1”“T2”。
17添加代码:
PrivateSubForm_Load()
W.Bind1200
W.RemoteHost="192.168.0.2"
W.RemotePort=1201
EndSub
PrivateSubT2_KeyDown(KeyCodeAsInteger,