实验四报告
20192419实验四《Python程序设计》实验报告
20192419实验四《Python程序设计》实验报告20192419 2019-2020-2 《Python程序设计》实验4课程:《Python程序设计》班级:1924姓名:万腾阳学号:20192419实验教师:王志强实验⽇期:2020年6⽉3⽇必修/选修:公选课1. Python综合应⽤:运⽤pygame尝试编写flappy bird代码2. ⼀开始,我打算照着课本将飞机⼤战的代码稍作更改,差不多就相当于flappy bird代码。
但是经过⼀段时间编写后,我发现课本上的代码⼀环扣⼀环,稍作更改⼀处,就会导致出现错误,甚⾄有时候不报错,但是整个程序连图⽚的不产⽣,⼗分令⼈⼼烦。
后⾯,我上⽹查找了视频,参照视频我编出了flappy bird,视频中也存在⼀些⼩错误,这在稍后再讲。
代码:import pygameimport sysimport timeclass Bird(object):#定义⼩鸟def __init__(self):#定义初始化⽅法self.birdRect = pygame.Rect(65,50,50,50)self.birdStatus = [pygame.image.load(r'picture/1.png'),pygame.image.load(r'picture/2.png'),pygame.image.load(r'picture/dead.png')]self.status = 0self.birdx = 120self.birdy = 350self.jump = Falseself.jumpSpeed = 10self.gravity = 5self.dead = Falsedef birdUpdate(self):#定义移动⽅法if self.jump:self.jumpSpeed -= 1self.birdy -= self.jumpSpeedelse:self.gravity += 0.2self.birdy += self.gravityself.birdRect[1] = self.birdyclass Pipeline(object):#定义管道类def __init__(self):self.wallx = 400self.pineUp = pygame.image.load(r'picture/top.png')self.pineDown = pygame.image.load(r'picture/bottom.png')def updatePipeline(self):#定义移动⽅法self.wallx -= 5if self.wallx < -80 :global scorescore +=1self.wallx = 400def createMap():screen.blit(background,(0,0))#显⽰管道screen.blit(Pipeline.pineUp,(Pipeline.wallx,-300))screen.blit(Pipeline.pineDown,(Pipeline.wallx, 500))Pipeline.updatePipeline()#显⽰⼩鸟if Bird.dead:Bird.status = 2elif Bird.jump:Bird.status = 1screen.blit(Bird.birdStatus[Bird.status] , (Bird.birdx,Bird.birdy))Bird.birdUpdate() #更新⼩鸟状态font.render('Score'+str(score),-1,(255,255,255))screen.blit(font.render('Score'+str(score),-1,(255,255,255)),(100,50))pygame.display.update()def checkDead():upRect = pygame.Rect(Pipeline.wallx,-300,Pipeline.pineUp.get_width(),Pipeline.pineUp.get_height())downRect = pygame.Rect(Pipeline.wallx, 500, Pipeline.pineDown.get_width(), Pipeline.pineDown.get_height())#检测矩形碰撞if upRect.colliderect(Bird.birdRect) or downRect.colliderect(Bird.birdRect):Bird.dead = True#边界检测else:if 0 < Bird.birdRect[1] < height:Bird.dead = Falsereturn Trueelse:return Falsedef getResult():#获取总分final_text1 = "Game Over"final_text2 = "Your Score:" + str(score)ft1_font = pygame.font.SysFont("Arial",70)ft1_surf = font.render(final_text1,1,(242,3,36))ft2_font = pygame.font.SysFont("Arial", 50)ft2_surf = font.render(final_text2, 1, (253, 177, 6))screenwidth = int (screen.get_width() / 2)surf1 = int(ft1_surf.get_width()/2)surf2 = int(ft2_surf.get_width() / 2)screen.blit(ft1_surf,[screenwidth- surf1,100])screen.blit(ft2_surf, [screenwidth- surf2, 200])pygame.display.update()if __name__ == '__main__':pygame.init()pygame.font.init()#初始化字体类font = pygame.font.SysFont(None,50)size = width,height = 400,650screen = pygame.display.set_mode(size) #设置窗⼝clock = pygame.time.Clock() #设置时钟color = (255,255,255)Bird = Bird()#实例⼩鸟类Pipeline = Pipeline()score = 0while True:clock.tick(60)#每秒执⾏60次#轮询事件监测for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()if event.type == pygame.KEYDOWN or pygame.MOUSEBUTTONDOWN and not Bird.dead:Bird.jump = TrueBird.gravity = 5Bird.jumpSpeed = 10# screen.fill(color)background = pygame.image.load(r'picture/background.png')if checkDead():passelse:createMap()getResult()time.sleep(2)createMap() #⽣成地图pygame.quit()```以上是本次实验的代码,⼀开始需要通过代码显⽰窗⼝,并设置其背景及宽度和长度,然后循环绘制屏幕,更新屏幕。
电子技术实验报告—实验4单级放大电路
电子技术实验报告实验名称:单级放大电路系别:班号:实验者:学号:实验日期:实验报告完成日期:目录一、实验目的 (3)二、实验仪器 (3)三、实验原理 (3)(一)单级低频放大器的模型和性能 (3)(二)放大器参数及其测量方法 (4)四、实验容 (5)1、搭接实验电路 (5)2、静态工作点的测量和调试 (6)3、基本放大器的电压放大倍数、输入电阻、输出电阻的测量 (6)4、放大器上限、下限频率的测量 (7)5、电流串联负反馈放大器参数测量 (8)五、思考题 (8)六、实验总结 (8)一、实验目的1.学会在面包板上搭接电路的方法;2.学习放大电路的调试方法;3.掌握放大电路的静态工作点、电压放大倍数、输出电阻和通频带测量方法;4.研究负反馈对放大器性能的影响;了解射级输出器的基本性能;5.了解静态工作点对输出波形的影响和负载对放大电路倍数的影响。
二、实验仪器1.示波器 1台2.函数信号发生器 1台3. 直流稳压电源 1台4.数字万用表 1台5.多功能电路实验箱 1台6.交流毫伏表 1台三、实验原理(一)单级低频放大器的模型和性能1. 单级低频放大器的模型单级低频放大器能将频率从几十Hz~几百kHz的低频信号进行不失真地放大,是放大器中最基本的放大器,单级低频放大器根据性能不同科分为基本放大器和负反馈放大器。
从放大器的输出端取出信号电压(或电流)经过反馈网络得到反馈信号电压(或电流)送回放大器的输入端称为反馈。
若反馈信号的极性与原输入信号的极性相反,则为负反馈。
根据输出端的取样信号(电压或电流)与送回输入端的连接方式(串联或并联)的不同,一般可分为四种反馈类型——电压串联反馈、电流串联反馈、电压并联反馈和电流并联反馈。
负反馈是改变房卡器及其他电子系统特性的一种重要手段。
负反馈使放大器的净输入信号减小,因此放大器的增益下降;同时改善了放大器的其他性能:提高了增益稳定性,展宽了通频带,减小了非线性失真,以及改变了放大器的输入阻抗和输出阻抗。
信息安全实验报告四
实验成绩《信息安全概论》实验报告实验四网络端口扫描实验一、专业班级:学号:姓名:完成时间:2016/ 05/ 09二、实验目的学习端口扫描技术的基本原理,理解端口扫描技术在网络攻防中的应用;熟练掌握目前最为常用的网络扫描工具Nmap的使用,并能利用工具扫描漏洞,更好地弥补安全不足。
二、实验内容选择局域网中的主机作为扫描对象,使用Nmap提供的默认配置文件,以及自行设定相关参数,对制定范围的主机进行PING扫描、TCP connect扫描、UDP扫描、秘密扫描等,记录并分析扫描结果。
三、实验环境和开发工具1.Windows 7操作系统2.Zenmap 5.21四、实验步骤和结果1.全面TCP扫描这是一种基本的扫描模式,不需要任何命令选项开关,即可对目标主机进行全面TCP 扫描,显示监听端口的服务情况。
命令行格式为:nmap –sS –v IP地址,例如nmap –sS –v 172.18.69.173,则可对目标主机172.18.69.173进行全面TCP扫描,结果下图:扫描模式的缺点:日志服务的主机可以很容易地监测到这类扫描。
要达到隐蔽功能,必须设置一些命令选项开关,从而实现较高级的功能。
2、PING扫描如果想知道网络上有哪些主机是开放的,格式为:nmap –sN 172.18.69.173,则可对目标主机172.18.69.173进行探测,输出结果包括开放主机的IP地址和MAC地址,如图所示3、TCP connect扫描这是对TCP的最基本形式的侦测,也是nmap的默认扫描方式。
命令行格式为:nmap –sT –v 172.18.69.173,则可对目标主机172.18.69.173进行TCP连接扫描,输出结果如图所示。
4、UDP扫描UDP扫描可以用来确定主机上哪些UDP端口处于开放状态,这一扫描方法命令行格式为:nmap –sU –v 172.18.69.173,则可对目标主机172.18.69.173进行UDP扫描,输出结果如图所示。
实验报告 范文(四)
中毒事故后果模拟一、训练目的1.通过训练,学会使用PHAST软件对石油化工装置泄漏后可能发生的中毒事故进行分析,掌握使用PHAST软件建立相对模型,模拟分析中毒影响范围和严重程度。
2.掌握毒性物质致死概率。
二、训练内容要求毒性气体或液体泄漏后中毒事故的模拟三、训练仪器本训练所用实验软件为:PHAST6.7四、训练方法和步骤:1.了解毒性物质泄漏中毒的原理,学习使用Vessel/pipe source 模型模拟中毒事故的方法。
2.选择Vessel/pipe source 模型3.输入相关参数(硫化氢泄漏)4.分别对扩散结果和毒性结果进行分析⑴扩散浓度结合硫化氢毒性阈限值,根据模拟结果进行分析,给出造成轻伤、重伤和死亡等不同中毒效果的浓度范围。
⑵致死概率通过看图和查看毒性报告,找出不同毒性致死概率与对应的范围,对付这些区域进行分析。
五、气体泄漏扩散浓度计算1.阈限值(TLVs)美国政府工业卫生专家协会针对多种化学物质制定了极限剂量,称为阈限值。
阈限值是空气中一种物质的浓度,其所代表的工作条件是,几乎所有的工人长期在这样的暴露条件下工作时,不会有不良的健康影响。
工人只有在工作时间才会暴露于此种毒物中,即每天八小时,每周五天。
2.阈限值与允许暴露浓度美国职业安全与健康管理局制定了一套极限剂量,称为允许暴露浓度。
3.致死概率的计算个体致死概率可通过中毒事故后果模型计算出某一事故场景在位置处产生的毒物浓度数值,然后根据概率函数法计算得到。
六、实验体会通过本次实验学习使用了PHAST软件,并了解了毒性物质泄漏中毒的原理及相关计算。
压力容器认知训练一、训练目的及要求使学生了解并熟悉压力容器的分类、特点、安全管理及检测检验方法和事故原因分析。
掌握KZL4—13—AII型工业锅炉,LSG立式水直管锅炉安全管理及检测检验方法。
二、设备KZL4—13—AII型工业锅炉,LSG立式水直管锅炉.三、认知训练内容1.压力容器的分类和特点。
数电实验报告:实验4-计数器及应用161
广东海洋大学学生实验报告书(学生用表)实验名称实验名称课程名称课程名称课程号课程号学院学院((系) 专业专业班级班级学生姓名学生姓名学号学号实验地点实验地点实验日期实验日期实验4 计数器及其应用一、实验目的1、熟悉中规模集成计数器的逻辑功能及使用方法、熟悉中规模集成计数器的逻辑功能及使用方法2、掌握用74LS161构成计数器的方法构成计数器的方法3、熟悉中规模集成计数器应用、熟悉中规模集成计数器应用二、实验原理计数器是典型的时序逻辑电路,它是用来累计和记忆输入脉冲的个数.计数是数字系统中很重要的基本操作,集成计数器是最广泛应用的逻辑部件之一。
计数器种类较多,按构成计数器中的多触发器是否使用一个时钟脉冲源来分,有同步计数器和异步计数器;步计数器和异步计数器;根据计数制的不同,根据计数制的不同,根据计数制的不同,可分为二进制计数器、可分为二进制计数器、可分为二进制计数器、十进制计数十进制计数器和任意进制计数器;根据计数的增减趋势,又分为加法、减法和可逆计数器。
还有可预置数和可编程序功能计数器等。
本实验主要研究中规模十进制计数器74LS161的功能及应用。
的功能及应用。
1、中规模集成计数器74LS161 是四位二进制可预置同步计数器,由于它采用4 个主从JK 触发器作为记忆单元,故又称为四位二进制同步计数器,其集成芯片管脚如图元,故又称为四位二进制同步计数器,其集成芯片管脚如图11所示:所示:管脚符号说明:电源正端Vcc ,接+5V ;异步置零(复位)端Rd ;时钟脉冲CP ;预置数控制端数控制端 A 、B 、C 、D ;数据输出端;数据输出端 QA 、QB 、QC 、QD ;进位输出端;进位输出端 RCO :使能端:使能端EP EP EP,,ET ET;预置端;预置端;预置端LD ;图1 74LS161 管脚图管脚图GDOU-B-11-112该计数器由于内部采用了快速进位电路,所以具有较高的计数速度。
通信原理实验报告四DPSK和QPSK
WORD 格式可编辑
QPSK调制解调系统调制信号的波形:
结果分析,QPSK调制的过程中, 信号电平的大小有 2 /2. 从图像中可以看到, QPSK 调制信号幅度的浮动范围稍大于 BPSK,且均值与 BPSK是一样的,浮动中心都在 0 附近。
专业技术分享
WORD 格式可编辑
QPSK调制解调系统中误差概率和信噪比( dB)的函数关系曲线图:
专业技术分享
WORD 格式可编辑
结果分析: BPSK由, 于相位分别为 0 和 pi ,所以调制信号电平有 1 和-1 两种,平均 值为 0,调制信号波形图像显示信号的幅度大概在 0 附近浮动,与理论预期是相符 的。 BPSK调制解调系统 误差概率和信噪比( dB)的函数关系曲线图:
结果分析: 可以看到, 图中显示的误码率在信噪比为 -10dB 到 10dB 之间的函数关系 图,蓝色曲线为实际图像,红色曲线为理论图像,可以看到实际曲线和理论曲线吻 合得很好,误码率随信噪比的上升时单调下降的。
结果分析: 可以看到, 图中显示的误码率在信噪比为 -10dB 到 10dB 之间的函数关系 图,蓝色曲线为实际图像,红色曲线为理论图像,可以看到相同的信噪比下, QPSK 误码率的误差要比 BPSK要大,说明 BPSK的性能更优
专业技术分享
WORD 格式可编辑 专业技术分享
WORD 格式可编辑 专业技术分享
WORD 格式可编辑
实验四 调制解调( BPSK,QPSK,信噪比)
一、实验目的 掌握数字频带传输系统调制解调的仿真过程 掌握数字频带传输系统误码率仿真分析方法 二、实验原理 数字频带信号通常也称为数字调制信号,其信号频谱通常是带通型的,适合于在带 通型信道中传输。数字调制是将基带数字信号变换成适合带通型信道传输适应信道特性, 也可以采用频率调制、相位调制的方式来达到同样的目的。 1. BPSK 调制解调原理
霍尔效应实验报告优秀4篇
霍尔效应实验报告优秀4篇实验四霍尔效应篇一实验原理1.液晶光开关的工作原理液晶的种类很多,仅以常用的TN(扭曲向列)型液晶为例,说明其工作原理。
TN型光开关的结构:在两块玻璃板之间夹有正性向列相液晶,液晶分子的形状如同火柴一样,为棍状。
棍的长度在十几埃(1埃=10-10米),直径为4~6埃,液晶层厚度一般为5-8微米。
玻璃板的内表面涂有透明电极,电极的表面预先作了定向处理(可用软绒布朝一个方向摩擦,也可在电极表面涂取向剂),这样,液晶分子在透明电极表面就会躺倒在摩擦所形成的微沟槽里;电极表面的液晶分子按一定方向排列,且上下电极上的定向方向相互垂直。
上下电极之间的那些液晶分子因范德瓦尔斯力的作用,趋向于平行排列。
然而由于上下电极上液晶的定向方向相互垂直,所以从俯视方向看,液晶分子的排列从上电极的沿-45度方向排列逐步地、均匀地扭曲到下电极的沿+45度方向排列,整个扭曲了90度。
理论和实验都证明,上述均匀扭曲排列起来的结构具有光波导的性质,即偏振光从上电极表面透过扭曲排列起来的液晶传播到下电极表面时,偏振方向会旋转90度。
取两张偏振片贴在玻璃的两面,P1的透光轴与上电极的定向方向相同,P2的透光轴与下电极的定向方向相同,于是P1和P2的透光轴相互正交。
在未加驱动电压的情况下,来自光源的'自然光经过偏振片P1后只剩下平行于透光轴的线偏振光,该线偏振光到达输出面时,其偏振面旋转了90°。
这时光的偏振面与P2的透光轴平行,因而有光通过。
在施加足够电压情况下(一般为1~2伏),在静电场的作用下,除了基片附近的液晶分子被基片“锚定”以外,其他液晶分子趋于平行于电场方向排列。
于是原来的扭曲结构被破坏,成了均匀结构。
从P1透射出来的偏振光的偏振方向在液晶中传播时不再旋转,保持原来的偏振方向到达下电极。
这时光的偏振方向与P2正交,因而光被关断。
由于上述光开关在没有电场的情况下让光透过,加上电场的时候光被关断,因此叫做常通型光开关,又叫做常白模式。
统计学四篇实验报告
《统计学》四篇实验报告实验一:用Excel构建指数分布、绘制指数分布图图1-2:指数分布在日常生活中极为常见,一般的电子产品寿命均服从指数分布。
在一些可靠性研究中指数分布显得尤为重要。
所以我们应该学会利用计算机分析指数分布、掌握EXPONDIST函数的应用技巧。
指数函数还有一个重要特征是无记忆性。
在此次实验中我们还学会了产生“填充数组原理”。
这对我们今后的工作学习中快捷地生成一组有规律的数组有很大的帮助。
实验二:用Excel计算置信区间一、实验目的及要求1、掌握总体均值的区间估计2、学习CONFIDENCE函数的应用技巧二、实验设备(环境)及要求1、实验软件:Excel 20072、实验数据:自选某市卫生监督部门对当地企业进行检查,随机抽取当地100家企业,平均得分95,已知当地卫生情况的标准差是30,置信水平0.5,试求当地企业得分的置信区间及置信上下限。
三、实验内容与步骤某市卫生监督部门对当地企业进行检查,随机抽取当地100家企业,平均得分95,已知当地卫生情况的标准差是30,置信水平0.5,试求当地企业得分的置信区间及置信上下限。
第1步:打开Excel2007新建一张新的Excel表;第2步:分别在A1、A2、A3、A4、A6、A7、A8输入“样本均值”“总体标准差”“样本容量”“显著性水平”“置信区间”“置信上限”“置信下限”;在B1、B2、B3、B4输入“90”“30”“100”“0.5”第3步:在B6单元格中输入“=CONFIDENCE(B4,B2,B3)”,然后按Enter键;第4步:在B7单元格中输入“=B1+B6”,然后按Enter键;第5步:同样在B8单元格中输入“=B1-B6”,然后按Enter键;计算结果如图2-1四、实验结果或数据处理图2-1:实验二:用Excel产生随机数见图3-1实验二:正态分布第1步:同均匀分布的第1步;第2步:在弹出“随机数发生器”对话框,首先在“分布”下拉列表框中选择“正态”选项,并设置“变量个数”数值为1,设置“随机数个数”数值为20,在“参数”选区中平均值、标准差分别设置数值为30和20,在“输出选项”选区中单击“输出区域”单选按钮,并设置为D2 单元格,单击“确定”按钮完成设置。
酶工程实验报告四(纤维素酶酶促反应初速度的测定)
0.8 0.7115 1.0640 1.2330 1.2730 1.2930 1.4340 1.5520 1.5620 1.6180 1.6860 1.7900
5.2 结果处理 以反应时间为横坐标,以相对反应速度(吸光度值)为纵坐标,做出四种酶
浓度的进程曲线,求出各种酶浓度下的初速度时间范围和反应初速度。 统计软件 SPSS 作图分析如图一 、图二: 纤维素酶反应的速度曲线
4
5、实验结果与数据处理:
5.1 实验数据与结果:如表一
OD540 值
时间 (min) 3 6 9 12 15 20 25 30 40 50 60
0.2 0.3995 0.6560 0.8170 0.9380 1.0120 1.0970 1.1690 1.2370 1.2940 1.3580 1.4160
7
确表示酶的反应速度。 6.2 讨论 从实验结果表一可以看出不同酶浓度的反应初速度时间范围与反应初速
度差异极大,实验中用同一纤维素酶测定其不同浓度反应进程曲线,纤维素酶浓度 0.2 mg/ml,0.4 mg/ml,0.6mg/ml,0.8 mg/ml,实验中采用最适 pH、最适温度和足够高的底物浓 度,采用比色法求得还原糖的浓度, 生成的葡萄糖的含量与所测的吸光度成正比[2]。因此 随酶浓度增加曲线应该逐渐升高,0.4 mg/ml 测定时可能存在系统误差,如温度、酶液称取与稀
① 反应温度准确,酶液准确稀释。不同 pH 所用酶液用对应 pH 缓冲液稀释 ②试管上编号:贴上用圆珠笔写上编号的胶布,以防止保温或沸水加热时脱落; ③移液管使用时量取精准,保证结果可靠准确。 ④精确记时:每一管加入酶液的时间要做记录,每管之间间隔的时间要合理; ⑤避免试管进水:煮沸和用流水冲洗时;
实验4 链路层实验实验报告
链路层实验一、实验目的1)计算机网络的数据链路层协议保证通信双方在有差错的通信线路上进行无差错的数据传输,是计算机网络各层协议中通信控制功能最典型的一种协议。
2)本实验实现一个数据链路层协议的数据传送部分,目的在于使学生更好地理解基本数据链路层协议的基本工作原理,掌握计算机网络协议的基本实现技术。
二、实验内容在一个数据链路层的模拟实现环境中,用C 语言实现下面数据链路层协议。
分析一个理想的链路层协议的实现,熟悉它的实现环境。
对于前面实现的协议进行扩充,实现它的第一次改进,如何防止发方过快淹没收方。
对②再假设在不可靠的的链路上进行通信。
三、实验步骤1)实验程序a)发送端sender.c:#pragma comment(lib, "ws2_32.lib")#include <winsock.h>#include <stdio.h>////////////////////////////////////////////////////////////////////////////发送帧////////////////////////////////////////////////////////////////////////// voidSendFrame(int * frameNumCurrent,intwinSizeCurrent,SOCKET * socketConn){char sendBuffer[128]; //发送数据if (_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",*frameNumCurrent) < 0){printf("写数据出错!\n");return;}else{sendBuffer[sizeof(sendBuffer)-1] = '\0';}//发送数据第几帧if(send(*socketConn,sendBuffer,sizeof(sendBuffer),0) == SOCKET_ERROR){printf("发送数据失败!\n");return;}else{printf("现在在传送帧%s\n",sendBuffer);}}////////////////////////////////////////////////////////////////////////////接收ACK////////////////////////////////////////////////////////////////////////// voidReceiveACK(int * frameNumCurrent,SOCKET * socketConn){char recvBuffer[128];//接收数据int length = sizeof(structsockaddr);intframeNum = 0;//接收到的ACK号//接收ACK,判断是否有超时或者是否错误ACKif(recv(*socketConn,recvBuffer,sizeof(recvBuffer),0) == SOCKET_ERROR)//出现超时{printf("接收数据超时!需要重新传送帧%d\n\n",*frameNumCurrent);return;}else{frameNum = atoi(recvBuffer);//正确ACKif (frameNum == *frameNumCurrent){//正确ACK 准备传送下一帧*frameNumCurrent ^= 1;printf("接收到正确的ACK,已经成功传送帧%d,将要传送帧%d\n\n",(*frameNumCurrent)^1,*frameNumCurrent);}//错误ACKelse if (frameNum == ((*frameNumCurrent) ^ 1)){//得到错误ACK 不进行操作,主函数中进行重传操作printf("接收到错误ACK,帧%d传送错误,需要重新传送帧%d\n\n",*frameNumCurrent,*frameNumCurrent);}}}////////////////////////////////////////////////////////////////////////////初始化发送端监听socket//////////////////////////////////////////////////////////////////////////BOOL InitSocketSender(SOCKET * socketSender){SOCKADDR_IN addrSender;WORD wVersionRequested;WSADATA wsaData;//版本wVersionRequested = MAKEWORD(1,1);//启动if (WSAStartup( wVersionRequested, &wsaData) != 0){printf("启动不成功!\n");return FALSE;}if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ){printf("版本错误!\n");WSACleanup();return FALSE;}//创建socket*socketSender = socket(AF_INET,SOCK_STREAM,0);if(*socketSender == INVALID_SOCKET){printf("创建套接字失败!\n");return FALSE;}//创建地址信息addrSender.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//所有地址addrSender.sin_family=AF_INET;addrSender.sin_port=htons(8000);//端口号//绑定端口if(bind(*socketSender,(SOCKADDR*)&addrSender,sizeof(structsockaddr)) == SOCKET_ERROR){printf("绑定失败!\n");return FALSE;}//监听if (listen(*socketSender,SOMAXCONN) == SOCKET_ERROR){printf("监听失败!\n");return FALSE;}return TRUE;}////////////////////////////////////////////////////////////////////////////线程函数用于处理一个客户端请求//////////////////////////////////////////////////////////////////////////DWORD WINAPI ConnectClient(LPVOID socketConn){int count = 0;//循环次数计数器intwinSizeCurrent = 0;//当前发送窗口大小intframeNumCurrent = 0;//当前发送的帧号printf("初始状态发送窗口是:%d,准备向接收端发送数据\n\n",winSizeCurrent);++winSizeCurrent;while(count < 20){SendFrame(&frameNumCurrent,winSizeCurrent,(SOCKET*)socketConn);ReceiveACK(&frameNumCurrent,(SOCKET*)socketConn);++count;}printf("模拟结束!\n");//关闭Socketclosesocket(*((SOCKET*)socketConn));free(socketConn);return 0;}void main(){HANDLE hThread;//线程句柄DWORD threadId;SOCKET socketSender;//监听socketSOCKADDR_IN addrReceiver;//服务器地址int length = sizeof(structsockaddr);inttimeOut = 3000;//超时3秒//初始化发送端监听socketif (!InitSocketSender(&socketSender)){printf("初始化失败,退出!\n");WSACleanup();return;}printf("等待建立连接\n\n");//循环等待请求while (TRUE){SOCKET *socketConn = (SOCKET *)malloc(sizeof(SOCKET));*socketConn = accept(socketSender,(structsockaddr*)&addrReceiver,&length);printf("连接建立成功!接收端的地址是:%s\n\n",inet_ntoa(addrReceiver.sin_addr));if(setsockopt(*socketConn,SOL_SOCKET,SO_RCVTIMEO,(char*)&timeOut,sizeof(timeOut)) == SOCKET_ERROR){printf("设置接收时限错误!");closesocket(*socketConn);continue;}//开辟线程处理一个客户端请求hThread = CreateThread(NULL,0,ConnectClient,(LPVOID)socketConn,0,&threadId);}//清理操作closesocket(socketSender);WSACleanup();system("pause");}b)接收端receiver.c:#pragma comment(lib, "ws2_32.lib")#include <winsock.h>#include <stdio.h>#include <time.h>char buffer[128];int front=0;////////////////////////////////////////////////////////////////////////////接收帧//////////////////////////////////////////////////////////////////////////BOOL ReceiveFrame(int * frameExpect,int * frameRecv,intwinRecvSize,SOCKET socket){char recvBuffer[128];//接收数据intframeNum;//接收帧号//从发送端接收帧if(recv(socket,recvBuffer,sizeof(recvBuffer),0) == SOCKET_ERROR){printf("接收数据失败!\n");return FALSE;}frameNum = atoi(recvBuffer);if (frameNum != *frameExpect)//接收帧和希望接收帧号不匹配{printf("所要接收的帧和接收到的帧不匹配!,要接收的帧号是:%d,接收到的帧号是:%d\n",*frameExpect,frameNum);return FALSE;}else//接收帧和希望接收帧号匹配{*frameRecv = frameNum;printf("已经成功地接收帧%d,接收端窗口大小是:%d\n",*frameRecv,winRecvSize);}return TRUE;}////////////////////////////////////////////////////////////////////////////发送ACK//////////////////////////////////////////////////////////////////////////BOOL SendACK(int * frameExpect,int * frameRecv,SOCKET socket){//通过随机数随机产生正确ACK帧号、错误ACK帧号以及不发送ACK帧char sendBuffer[128];//发送数据int random = 0;//随机数0,1,2,0表示返回正确ACK 1表示返回错误ACK 2表示不返回ACKrandom = rand()%3;if (random == 0)//表示正确接收,并且正确回复ACK{if (_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",*frameRecv) < 0){printf("写数据出错!\n");return FALSE;}else{sendBuffer[sizeof(sendBuffer)-1] = '\0';}//发送正确的ACKif(send(socket,sendBuffer,sizeof(sendBuffer),0) == SOCKET_ERROR){printf("发送数据失败!\n");return FALSE;}else{*frameExpect ^= 1;//经过确认,准备接受下一帧printf("针对已经接收到的帧%d回复ACK,回复的ACK号是%d:\n\n",*frameRecv,*frameRecv);}}else if (random == 1)//表示正确接收,并且错误回复ACK{if (_snprintf(sendBuffer,sizeof(sendBuffer)-1,"%d",(*frameRecv)^1) < 0){printf("写数据出错!\n");return FALSE;}else{sendBuffer[sizeof(sendBuffer)-1] = '\0';}//发送错误的ACKif(send(socket,sendBuffer,sizeof(sendBuffer),0) == SOCKET_ERROR){printf("发送数据失败!\n");return FALSE;}else{printf("针对已经接收到的帧%d回复ACK,回复的ACK号是%d:\n\n",*frameRecv,(*frameRecv)^1);}}else//表示正确接收,并且不回复ACK{//不发送ACKprintf("没有针对已经接收到的帧%d发送ACK\n\n",*frameRecv);}return TRUE;}////////////////////////////////////////////////////////////////////////////初始化发送端监听socket//////////////////////////////////////////////////////////////////////////BOOL InitSocketReceiver(SOCKET * socketRecv){WORD wVersionRequested;WSADATA wsaData;SOCKADDR_IN addrSender;int length = sizeof(structsockaddr);//版本wVersionRequested = MAKEWORD(1,1);//启动if (WSAStartup( wVersionRequested, &wsaData) != 0){printf("启动socket不成功!\n");return FALSE;}if ( LOBYTE( wsaData.wVersion ) != 1 || HIBYTE( wsaData.wVersion ) != 1 ){printf("版本错误!\n");WSACleanup( );return FALSE;}//创建socket*socketRecv = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); ;if(socket == INVALID_SOCKET){printf("创建套接字失败!\n");return FALSE;}//创建地址信息addrSender.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//发送端主机IP addrSender.sin_family = AF_INET;addrSender.sin_port = htons(8000); //端口//连接发送端if (connect(*socketRecv,(structsockaddr*)&addrSender,length) == SOCKET_ERROR) {printf( "连接服务器失败!\n" );WSACleanup();return FALSE;}return TRUE;}void main(){SOCKET socketRecv;//接收端socketintframeExpect = 0;//期待的帧号intwinRecvSize = 8;//窗口大小intframeRecv = 0;//接收的帧号int count = 0;//循环次数计数器BOOL recvFlag = FALSE;//是否正确接收帧//连接服务器if (!InitSocketReceiver(&socketRecv)){printf( "初始化客户端失败,退出!\n" );WSACleanup();return;}else{printf("已经成功连接服务器\n\n");printf("初始状态接收端窗口大小是:%d,准备接收发送端数据\n\n",winRecvSize);srand((unsigned)time(NULL));while(count < 20){recvFlag = ReceiveFrame(&frameExpect,&frameRecv,winRecvSize,socketRecv);if (recvFlag)//正确接收帧,发送ACK{SendACK(&frameExpect,&frameRecv,socketRecv);}else{printf("得到错误的帧!\n");}++count;}printf("模拟结束!\n");}//清理closesocket(socketRecv);WSACleanup( );system("pause");}2)实验结果a)发送端:b)接收端:四、实验小结本次实验我们实现的是ARQ协议,而本次实验程序设计的精妙之处在于对ACK的正确返回、ACK的错误返回以及ACK丢失三种情形的成功模拟。
Windows操作系统实验四实验报告
Windows操作系统C/C++ 程序实验姓名:___________________学号:___________________班级:___________________院系:_________________________________年_____月_____日实验四Windows 2000/xp线程间通信一、背景知识二、实验目的三、工具/准备工作四、实验内容1. 文件对象步骤1:登录进入Windows 2000/xp Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-1.cpp。
步骤4:单击“Build”菜单中的“Compile 4-1.cpp”命令,并单击“是”按钮确认。
系统对4-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 4-1.exe”命令,建立4-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?____________________________________________________________________ ________________________________________________________________________步骤6:在工具栏单击“Execute Program”按钮,执行4-1.exe程序。
运行结果(如果运行不成功,则可能的原因是什么?) :____________________________________________________________________ ________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________阅读和分析程序4-1,请回答问题:1) 清单4-1中启动了多少个单独的读写线程?____________________________________________________________________2) 使用了哪个系统API函数来创建线程例程?____________________________________________________________________3) 文件的读和写操作分别使用了哪个API函数?____________________________________________________________________ ________________________________________________________________________每次运行进程时,都可看到清单4-3中的每个线程从前面的线程中读取数据并将数据增加,文件中的数值连续增加。
四份实验报告
四份实验报告
实验目的
xxx
实验器材与软件
- 器材:xxx
- 软件:xxx
实验步骤
1. xxx
2. xxx
3. xxx
实验结果与分析
在进行实验过程中我们观察到以下现象:xxx,由此我们得出结论:xxx。
实验结论
本实验证明了xxx。
实验报告二:xxxx实验
实验目的
xxx
实验器材与软件
- 器材:xxx
- 软件:xxx
实验步骤
1. xxx
3. xxx
实验结果与分析
在进行实验过程中我们观察到以下现象:xxx,由此我们得出结论:xxx。
实验结论
本实验证明了xxx。
实验报告三:xxxx实验
实验目的
xxx
实验器材与软件
- 器材:xxx
- 软件:xxx
实验步骤
1. xxx
2. xxx
3. xxx
实验结果与分析
在进行实验过程中我们观察到以下现象:xxx,由此我们得出结论:xxx。
实验结论
本实验证明了xxx。
实验报告四:xxxx实验
实验目的
实验器材与软件
- 器材:xxx
- 软件:xxx
实验步骤
1. xxx
2. xxx
3. xxx
实验结果与分析
在进行实验过程中我们观察到以下现象:xxx,由此我们得出结论:xxx。
实验结论
本实验证明了xxx。
实验报告(四)研究自由落体运动
班级:姓名:实验报告(四)研究自由落体运动的规律一、实验目的:1、判断自由落体运动是否是匀变速直线运动2、测量重力加速度g值二、实验原理:1、匀变速直线运动的v-t图像一定是一条直线,直线的斜率为加速度a。
2、匀变速直线运动任意连续相等时间内的位移差Δx为恒量,可用Δx=aT2计算出加速度a。
三、实验器材:打点计时器、刻度尺、铁架台、纸带、重物四、实验步骤:1、把铁架平台放在桌面边缘上,将打点计时器固定在铁架台上。
2、将纸带一端系重物,另一端穿过打点计时器,用手捏住纸带的上端,把纸带拉成竖直状态。
3、接通打点计时器的电源,待打点稳定后,释放纸带让重物连同纸带一起自由下落。
4、纸带离开打点计时器后,立即关闭电源,取下纸带。
5、换上新纸带,重复操作两次。
6、整理实验器材。
五、注意事项:1、按实验要求接好线路,并用手托重物将纸带拉到最上端;2、打点计时器的安装要使两限位孔在同一竖直线上,且保证下落前纸带处于竖直状态,以减少摩擦阻力;3、应选用质量和密度较大的重物,增大重力可使阻力的影响相对减少,增大密度可以减小体积,可使空气阻力减小;4、先接给打点计时器通电再放开纸带;5、手捏纸带上端松手前,让重物尽量靠近打点计时器,保证重物不晃动。
六、实验数据的处理:1.纸带的选取:(1)选取一条点迹清晰的纸带,舍掉开头一些过于密集的点迹,从一个适当的点开始(起始点,标记为0),往后数出若干个点,依次标记为1、2、3……。
2.采集数据:测量起始点0到各点的距离x ,记录在表中:3.数据处理:【方案一:逐差法】计算出相邻两点间的位移及相邻两段位移的差,按要求填入表中:x I = x 1+ x 2+ x 3= cm x II = x 4+ x 5+ x 6= cm△x = x II -x I = cm= m ,x I 或x II 所用的时间T= s 根据Δx =aT 2,可得a = m·s -2★ 实验结论:1、任意两个相邻相等时间间隔内的位移之差是 ,即可验证自由落体运动 匀加速直线运动;2、利用逐差法计算出的加速度a =m ·s -2。
武汉理工大学软件工程基础实验第四次实验报告
实验项目名称 实 验 者 同 组 者 UML 建模工具的安装与使用 徐强国 专业班级 软件 1602 实验成绩 组 别 2018 年 9 月 28 日
实验日期
第一部分:实验预习报告(包括实验目的、意义,实验基本原理与方法,主要仪器设备及 耗材,实验方案与技术路线等) 一、实验目的 学习使用 EA 开发环境创建模型的一般方法, 理解 EA 界面布局和元素操作的一般技巧。 二、实验内容及要求 1.学会安装、启动和关闭 EA 开发环境 2.使用目标项目(project)的向导创建一个项目。 3. 了解 EA 界面的六大组成部分 (菜单 Menu、 浏览器 Browser、 文档 窗口 Document Window、图窗口 Diagram Window、日值窗口 Log Window 和工具栏。 ) 4. 在浏览器中实现如下操作:增加模型元素(包括角色、用例、类、组件、图等) ; 查看现有模型元素;查看现有模型元素之间的关系;移动模型元素;更名模型元素;访问 元素的详细规范。 5. 分别在图中增加、删除图元素和在浏览器中增加删除图元素格式规范 实验报告过程清晰,内容详实 实验报告结果正确性 实验分析与总结详尽 总得分
2 4 2 2 10
增加类
删除类
更改累的属性、功能、类名
EA 界面六大组成部分: 菜单 Menu、浏览器 Browser、文档 窗口 Document Window、图窗口 Diagram Window、 日值窗口 Log Window 和工具栏。
使用情况
二、小结、建议及体会 徐强国:通过本次实验,我初步了解了 UML 建模工具 EA 并在实际中加以运用。之前使用过的 UML 建模工具都是轻型的在线端的,比如墨刀等。这次使用软件级别的 UML 建模工具明显感觉功能要来 的更加多样、复杂。希望在接下来的实验中可以熟练使用 EA 软件。 成绩评定表: 序号 评分项目 满分 实得分
数字电子技术实验四 数据选择器及其应用+学生报告
实验名称:数据选择器及其应用1.实验目的(1)掌握中规模集成数据选择器的逻辑功能和使用方法。
(2)学习用数据选择器构成组合逻辑电路的方法。
2.实验设备与器件(1) +5V直流电源 (2) 逻辑电平开关(3) 逻辑电平显示器 (4)74LS151、74LS1533.实验原理数据选择器又叫“多路开关”。
数据选择器在地址码(或叫选择控制)电位的控制下,从几个数据输入中选择一个并将其送到一个公共的输出端。
数据选择器的功能类似一个多掷开关,如图4-3-1所示,图中有四路数据D0~D3,通过选择控制信号 A1、A0(地址码)从四路数据中选中某一路数据送至输出端Q。
数据选择器为目前逻辑设计中应用十分广泛的逻辑部件,它有2选1、4选1、8选1、16选1等类别。
数据选择器的电路结构一般由与或门阵列组成,也有用传输门开关和门电路混合而成的。
(1) 八选一数据选择器74LS15174LS151为互补输出的8选1数据选择器,引脚排列如图4-3-2。
选择控制端(地址端)为A2~A0,按二进制译码,从8个输入数据D0~D7中,选择一个需要的数据送到输出端Q,S为使能端,低电平有效。
图4-3-1 4选1数据选择器示意图图4-3-2 74LS151引脚排列①使能端S= 1 时,不论A2~A0状态如何,均无输出(Q=0,Q=1),多路开关被禁止。
②使能端S = 0 时,多路开关正常工作,根据地址码A 2、A 1、A 0的状态选择D 0~D 7中某一个通道的数据输送到输出端Q 。
如:A 2A 1A 0=000,则选择D 0数据到输出端,即Q = D 0 。
如:A 2A 1A 0=001,则选择D 1数据到输出端,即Q = D 1 ,其余类推。
(2) 双四选一数据选择器 74LS153所谓双4选1数据选择器就是在一块集成芯片上有两个4选1数据选择器。
引脚排列如图4-3-3。
图4-3-3 74LS153引脚排列S 1、S 2为两个独立的使能端;A 1、A 0为公用的地址输入端;1D 0~1D 3和2D 0~2D 3分别为两个4选1数据选择器的数据输入端;Q 1、Q 2为两个输出端。
山东大学数据结构实验报告四
山东大学软件工程学院数据结构课程实验报告学号:姓名:班级:软件工程2014级2班实验题目:矩阵和散列表实验学时:实验日期: 2015.11.11实验目的:掌握特殊矩阵和稀疏矩阵。
掌握散列表及其应用。
硬件环境:实验室软件环境:Vistual Studio 2013实验步骤与内容:实验内容:1、创建三对角矩阵类,采用按列映射方式,提供store和retrieve 方法。
2、创建下三角矩阵类,采用按列映射方式,提供store和retrieve 方法。
3、创建稀疏矩阵类,采用行主顺序把稀疏矩阵映射到一维数组中,实现稀疏矩阵的转置和两个稀疏矩阵的加法操作。
4、使用散列表设计实现一个字典,假设关键字为整数且D为961,在字典中插入随机产生的500个不同的整数,实现字典的建立和搜索操作。
分别使用线性开型寻址和链表散列解决溢出。
代码体:ChainHashTableNode.h#pragma once#include"ChainHashTableNode.h"using namespace std;class ChainHashTable{public:ChainHashTable(int divisor);~ChainHashTable();bool Insert(int k);bool Search(int k);void print();private:int d;ChainHashTableNode *ht;};ChainHashTableNode.cpp#include"ChainHashTable.h"#include<iostream>using namespace std;ChainHashTable::ChainHashTable(int divisor) {d = divisor;ht = new ChainHashTableNode[d];}bool ChainHashTable::Insert(int k){int j = k%d;if (ht[j].Insert(k)){return true;}else{return false;}}void ChainHashTable::print(){for (int i = 0; i < d; i++){ht[i].print();}}ChainHashTableNode.h#pragma once#include"Node.h"class ChainHashTableNode{public:ChainHashTableNode();bool Insert(int k);bool Search(int k);void print();private:Node *first;};ChainHashTableNode.cpp#include"ChainHashTableNode.h"#include<iostream>using namespace std; ChainHashTableNode::ChainHashTableNode() {first = 0;}bool ChainHashTableNode::Search(int k) {if (first == 0) return false;Node *current = first;while (current){if (current->value == k){return true;}current = current->link;if (current){if (current->value == k){return true;}}}return false;}bool ChainHashTableNode::Insert(int k) {if (Search(k)){cout << "已经存在此元素" << endl;return false;}else {Node *p = new Node();p->value = k;if (first == 0){first = p;return true;}else{p->link = first;first = p;return true;}}}void ChainHashTableNode::print(){Node *current = first;if (first){while (first){cout << first->value << " ";first = first->link;}cout << endl;first = current;}else {cout << -1 << endl;}}HashTable.h#pragma onceclass HashTable{public:HashTable(int divisor);~HashTable();int Search(int k);//搜索算法bool Insert(int e);void print();private:int hSearch(int k);int d;//除数int *ht;//桶,大小取决于d就是除数是多少bool *empty;//一维数组,用来存储第I个桶是否存入了元素};HashTable.cpp#include"HashTable.h"#include<iostream>using namespace std;HashTable::HashTable(int divisor){d = divisor;ht = new int[d];empty = new bool[d];for (int i = 0; i < d; i++){empty[i] = true;ht[i] = 0;}}HashTable::~HashTable(){delete[]ht;delete[]empty;}int HashTable::hSearch(int k)//搜索值为K的元素{int i = k%d;int j = i;do{if (ht[j] == k || empty[j]) return j;j = (j + 1) % d;} while (j != i);return j;}int HashTable::Search(int k)//搜索值为K的元素{int b = hSearch(k);if (ht[b] == k) return b;return -1;}bool HashTable::Insert(int e){int b = hSearch(e);if (empty[b]){ht[b] = e;empty[b] = false;return true;}else if (ht[b] == e){cout << "已经存在此元素" << endl;return false;}else{cout << "表已经满了" << endl;return false;}}void HashTable::print(){for (int i = 0; i < 961; i++){cout << ht[i] << " ";}cout << endl;return;}LowerTriangularMatrix.h#pragma onceclass LowerTriangularMatrix{public:LowerTriangularMatrix(int size);void Store(int x, int i, int j);//向矩阵里存储一个元素int Retrieve(int i, int j);//返回矩阵中的一个元素void print();private:int n;//矩阵维数int sum;//矩阵非零元素个数int *t;//用数组来存储矩阵};LowerTriangularMatrix.cpp#include"LowerTriangularMatrix.h"#include<iostream>using namespace std;LowerTriangularMatrix::LowerTriangularMatrix(int size){n = size;sum = n*(n + 1) / 2;t = new int[sum];}void LowerTriangularMatrix::Store(int x, int i, int j){if (i<0 || j<0 || i >= n || j >= n){cout << "下三角矩阵行列输入错误" << i << " " << j << endl;return;}else if (x == 0){cout << "下三角所添加的元素必须非零" << endl;return;}else if (i<j){cout << "下三角添加元素位置错误" << endl;return;}t[sum - ((n - j)*(n - j + 1) / 2) + (i - j)] = x;return;}int LowerTriangularMatrix::Retrieve(int i, int j){if (i<0 || j<0 || i >= (n - 1) || j >= (n - 1)){cout << "三对角矩阵行列输入错误" << endl;return -1;}else if (i >= j){return t[sum - ((n - j)*(n - j + 1) / 2) + (i - j)];}else{return 0;}}void LowerTriangularMatrix::print(){for (int i = 0; i < sum; i++){cout << t[i] << " ";}cout << endl;return;}Node.h#pragma onceclass Node{friend class ChainHashTableNode;private:int value;Node *link;};Node.cpp#include"Node.h"using namespace std;SparseMatrix.h#pragma once#include"Term.h"class SparseMatrix{public:SparseMatrix(int row, int col);void transpose();void Store(int x, int i, int j);//向矩阵里存储一个元素void Add(SparseMatrix &b);//两个稀疏矩阵相加void print();private:int row, col;//数组维数int sum;//元素个数int maxsum;//最多的元素个数Term *t;//存储的数组};SparseMatrix.cpp#include"SparseMatrix.h"#include<iostream>using namespace std;SparseMatrix::SparseMatrix(int r, int c){row = r;col = c;sum = 0;maxsum = r*c;t = new Term[maxsum];}void SparseMatrix::transpose(){Term *cur = new Term[maxsum];int *ColSize = new int[col];int *RowNext = new int[row];for (int i = 0; i < col; i++) ColSize[i] = 0;for (int i = 0; i < row; i++) RowNext[i] = 0;for (int i = 0; i < sum; i++) ColSize[t[i].col]++;//表示每一列的非零元素个数RowNext[0] = 0;for (int i = 1; i < col; i++) RowNext[i] = RowNext[i - 1] + ColSize[i - 1];//表示新矩阵中每一行的矩阵的前面的矩阵的个数//进入转置操作for (int i = 0; i < sum; i++){int j = RowNext[t[i].col]++;cur[j].value = t[i].value;cur[j].col = t[i].row;cur[j].row = t[i].col;}delete t;t = cur;}void SparseMatrix::Store(int x, int i, int j){t[sum].value = x;t[sum].row = i;t[sum].col = j;sum++;return;}void SparseMatrix::print(){for (int i = 0; i < sum; i++){cout << t[i].value << " ";}cout << endl;return;}void SparseMatrix::Add(SparseMatrix &b)//两个稀疏矩阵相加{if (col != b.col || row != b.row){cout << "两个矩阵行列不同无法相加" << endl;return;}int sa = 0;int sb = 0;Term *cur = new Term[maxsum];int k = 0;while (sa < sum || sb < b.sum){if (t[sa].col == b.t[sb].col&&t[sa].row == b.t[sb].row){cur[k].col = t[sa].col;cur[k].row = t[sa].row;cur[k].value = t[sa].value + b.t[sb].value;k++;sa++;sb++;}else if (t[sa].row < b.t[sb].row){cur[k].value = t[sa].value;cur[k].row = t[sa].row;cur[k].col = t[sa].col;k++;sa++;}else if (t[sa].row > b.t[sb].row){cur[k].value = b.t[sb].value;cur[k].row = b.t[sb].row;cur[k].col = b.t[sb].col;k++;sb++;}else if (t[sa].col < t[sb].col){cur[k].col = t[sa].col;cur[k].row = t[sa].row;cur[k].value = t[sa].value;k++;sa++;}else{cur[k].value = b.t[sb].value;cur[k].row = b.t[sb].row;cur[k].col = b.t[sb].col;k++;sb++;}}sum = k;delete t;t = cur;return;}Term.h#pragma onceclass Term{friend class SparseMatrix;private:int col, row;int value;};Term.cpp#include"Term.h"TridiagonalMatrix.h#pragma onceclass TridiagonalMatrix{public:TridiagonalMatrix(int size);void Store(int x, int i, int j);//向矩阵里存储一个元素int Retrieve(int i, int j);//返回矩阵中的一个元素void print();private:int n;//矩阵非0元素个数int *t;//用数组来存储矩阵};TridiagonalMatrix.cpp#include"TridiagonalMatrix.h"#include<iostream>using namespace std;TridiagonalMatrix::TridiagonalMatrix(int size){n = size;t = new int[3 * n - 2];}void TridiagonalMatrix::Store(int x, int i, int j){if (i<0 || j<0 || i >= n || j >= n){cout << "三对角矩阵行列输入错误" << i << " " << j << endl;return;}else if (x == 0){cout << "三对角矩阵所添加的元素必须非零" << endl;return;}else if (abs(i - j)>1){cout << "三对角矩阵添加元素位置错误" << endl;return;}switch (i - j){case -1:t[3 * j - 1] = x;break;case 0:t[3 * j] = x;break;case 1:t[3 * j + 1] = x;break;}return;int TridiagonalMatrix::Retrieve(int i, int j){if (i<0 || j<0 || i >= (n - 1) || j >= (n - 1)) {cout << "三对角矩阵行列输入错误" << endl;return -1;}else if (abs(i - j) <= 1){return t[3 * j + (i - j)];}else{return 0;}}void TridiagonalMatrix::print(){for (int i = 0; i < 3 * n - 2; i++){cout << t[i] << " ";}cout << endl;return;}Test.cpp#include<iostream>#include<cstring>#include<cstdlib>#include"TridiagonalMatrix.h"#include"LowerTriangularMatrix.h"#include"SparseMatrix.h"#include"HashTable.h"#include"ChainHashTable.h"using namespace std;int wei, num[100][100];void c(){for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)cin >> num[i][j];}int main(){int k = 0, l = 0;/*三对角矩阵实验开始测试数据4~10~3n-241 2 0 03 4 5 00 7 8 90 0 8 7*/cout << "请输入三对焦矩阵维数及内容:" << endl;cin >> wei;c();TridiagonalMatrix *TM = new TridiagonalMatrix(wei);for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)if (num[j][i] != 0)TM->Store(num[j][i], j, i);TM->print();cout << "请输入要查询的元素的位置" << endl;cin >> k >> l;l = TM->Retrieve(k, l);cout << "查询结果:" << l << endl;cout << "***********************************************" << endl;/*下三角矩阵实验开始测试数据4~10~n*(n+1)/241 0 0 02 3 0 04 5 6 07 8 9 -1*/cout << "请输入下三角矩阵维数及内容:" << endl;k = 0, l = 0;cin >> wei;c();LowerTriangularMatrix *LTM = new LowerTriangularMatrix(wei);for (int i = 0; i < wei; i++)for (int j = 0; j < wei; j++)if (num[j][i] != 0)LTM->Store(num[j][i], j, i);cout << "请输入要查询的元素的位置" << endl;cin >> k >> l;l = LTM->Retrieve(k, l);cout << "查询结果:" << l << endl;cout << "***********************************************" << endl;/*稀疏角矩阵实验开始测试数据4 54 51 0 0 0 20 3 0 0 04 0 05 00 6 7 0 84 58 0 7 6 00 5 0 0 40 0 0 3 02 0 0 0 19 0 7 6 20 8 0 0 44 0 0 8 02 6 7 0 9*/cout << "请输入稀疏矩阵的维数及内容:" << endl;cin >> k >> l;SparseMatrix *SM = new SparseMatrix(k, l);for (int i = 0; i < k; i++)for (int j = 0; j < l; j++){cin >> num[i][j];if (num[i][j])SM->Store(num[i][j], i, j);}cout << "稀疏矩阵为: ";SM->print();SM->transpose();cout << "转置后稀疏矩阵为: ";SM->print();SM->transpose();cout << "重新转置后稀疏矩阵为: ";cout << "矩阵相加开始,请输入要使用的矩阵维数及内容:" << endl;cin >> k >> l;SparseMatrix *SM2 = new SparseMatrix(k, l);for (int i = 0; i < k; i++)for (int j = 0; j < l; j++){cin >> num[i][j];if (num[i][j])SM2->Store(num[i][j], i, j);}cout << "新矩阵为: ";SM2->print();SM->Add(*SM2);cout << "矩阵相加后为: ";SM->print();cout << "***********************************************" << endl;cin.get();system("pause");/*使用散列表设计实现一个字典,假设关键字为整数且D为961,在字典中插入随机产生的500个不同的整数,实现字典的建立和搜索操作。
大学计算机第四次实验报告
实验四课程名称:大学计算机实验项目名称:演示文稿设计方法、步骤:1.基础操作创建、打开、保存、关闭演示文稿2.表格、图表和图片操作创建、编辑表格创建图表插入图片实现书本案例4-4,并给出截图3.幻灯片动画设计设计幻灯片跳入、退出动画效果4.设计一个个人介绍ppt实验过程及内容:一.基础操作1.创建、打开、保存、关闭演示文稿1)进入PowerPoint后找到新建选项卡,点击新建一个空白演示即可创建。
或者进入PowerPoint后直接点击想要打开的演示即可打开。
找到左上角的一个保存符号单击即可保存。
找到右上角的×号单击即可关闭。
二.表格、图表和图片操作1.创建、编辑表格1)点击“插入”选项卡,点开“表格”下拉框,通过鼠标拖动,表格会变成橘黄色,橘黄色的大小就是创建的表格的大小,即可选择所需的行和列数。
2)单击选中表格内的元素即可直接编辑。
3)选中需要调整大小的表格,将鼠标放置到表格边框有正方形小点的地方,当鼠标变成两个箭头的样式时,长按鼠标左键并且拖动到需要的大小即可。
4)选中表格,即可看见上方功能区出现一个角“表设计”的选项卡,点进去,找到“表格样式”,单击“其他”按钮,在弹出的下拉列表中即可选择理想的表格样式,选择时会有自动生成预览效果,可以据此选择。
2.创建图表1)在“插入”选项卡中找到“图表”,在单击之后弹出的对话框中选择需要的图表类型。
2)如果对图表类型不满意,可以选中图表,在功能区找到“图表格式”,点进去之后找到“图表类型”,选择所需的类型即可。
3)选中需要更改数据的图表,在“图表设计”中找到“编辑数据”,用户可以选择直接编辑数据或者在Excel中编辑数据。
编辑完毕后直接退出编辑即可。
3.插入图片1)在“插入”选项卡中找到“图片”,在弹出的对话框中根据图片的存储路径即可找到插入的图片,选中并且点击“插入”即可。
2)调整图片的大小可以通过鼠标拖动调整,也可以在“图片格式”的“大小”中输入确定的数值,并且按下“Enter”键完成设置。
上海大学计算机网络实验报告4
是一种内部网关协议,灵魂在于距离向量算法,实现简单,开销小。
适用于小型网络,而在于较大网络中,由于其“好消息传播的快,坏消息传播的慢”的特性并不适合。定时要交换路由器的路由表。
OSPF:
是一种内部网关协议,灵魂在于最短路径优先算法。
能够使用于较大的网络,因为它将网络分成若干个区域,并在此基础上使用泛洪法来向全网更新链路状态。只有当解决的?(10分)
得分:
问题1:Netsim的版权以及无法使用。
最终选用了Cisco Packet Tracer来做这次的模拟实验。
问题2:静态路由实验中,PC ping不通其他网络上的路由器。
一个个ping过去发现是PC的默认网关没有设置。设置之后正常。
问题3:OSPF动态路由实验右半部分始终有问题。
RIP:
拓扑结构:
Router0路由表:
Router2路由表:
Router1路由表:
PC0 ping PC2
OSPF:
拓扑结构:
Router 5路由表:
Router 6路由表:Router6 ping Router3
Router 3路由表:Router3 ping Router6
Router 2路由表:
动态路由在较大范围内配置时很有用,在网络规模小的时候,配置起来很麻烦,但是随着网络的成长,动态路由在网络发生变化时只需修改局部范围,在某种意义上减轻了我们的劳动量,更人性化。
动态路由因为类型不同使用的网络类型也不同,各有其优势,在选择使用哪种协议之前需要斟酌。
思考题:(10分)
思考题1:(4分)
得分:
最终发现是输入错误,修改了一个路由器端口的ip地址之后一切正常。
本次实验的体会(结论)(10分)
大学mysql实验报告(四)附答案
⼤学mysql实验报告(四)附答案实验报告(四)专业:班级:学号:姓名:实验名称:数据库的多表连接查询实验报告内容:1、⽤SELECT语句完成第183页实验3的23)27)28)31)的查询语句23) 求选修了课程的学⽣⼈数SELECT COUNT(*)选课⼈数FROM Enrollment27)求选修每门课程的学⽣⼈数。
SELECT Cno AS '课程号', COUNT(Sno) AS '选修⼈数'FROM Enrollment GROUP BY Cno28)求每个学⽣的学号和各门课程的总成绩。
SELECT Sno '学号', Sum(grade) '总成绩' FROM Enrollment GROUP BY Sno31)查询选修了C1课程的学⽣的学号和成绩,查询结果按成绩降序排列。
SELECT Sno, Grade FROM Enrollment WHERE Cno='C1' ORDER BY Grade DESC32)查询全体学⽣信息,查询结果按所在系的系名升序排列,同⼀系的学⽣按年龄降序排列。
SELECT * FROM Students ORDER BY Sdept, Sage DESC2、⽤SELECT语句完成第183页实验4的2)3)4)6)的查询语句2)查询每个学⽣的学号、姓名、选修的课程名、成绩。
SELECT Students.Sno,Sname, Cname,GradeFROM Students,Courses,EnrollmentWHERE Students.Sno = Enrollment.Sno AND /doc/4b14113722.htmlo= /doc/4b14113722.htmlo3)查询选修了C2且成绩⼤于90分的学⽣的学号、姓名、成绩。
SELECT Students.Sno,Sname, GradeFROM Students, EnrollmentWHERE Students.Sno = Enrollment.Sno AND Cno='C2 ' AND Grade>904)求计算机系选修课程超过2门课的学⽣的学号、姓名、平均成绩, 并按平均成绩从⾼到低排序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四动态规划算法
一、实验目的与要求
1、熟悉最长公共子序列问题的算法;
2、初步掌握动态规划算法;
二、实验题
若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。
例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。
给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。
给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。
改进LCS函数,不使用数组b而仅借助数组c本身在O(m+n)时间内构造最长公共子序列。
三.实验结果
四.运行结果分析
运行结果正确,且运行速度很快,算法很简洁,但是理解上还是有些困难。
五.程序代码
#include<iostream>
using namespace std;
int c[1024][1024],b[1024][1024];
void LCSLength(char *x ,char *y,int m,int n)
{
int i ,j;
for (i = 1; i <= m; i++) c[i][0] = 0;
for (i = 1; i <= n; i++) c[0][i] = 0;
for (i = 1; i <= m; i++)
for (j = 1; j <= n; j++)
{
if (x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else if (c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{ c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
void LCS(int i ,int j, char *x)
{
if (i ==0 || j==0) return;
if (b[i][j]== 1)
{
LCS(i-1,j-1,x);
printf("%c",x[i]);
}
else if (b[i][j]== 2)
LCS(i-1,j,x);
else LCS(i,j-1,x);
}
void main()
{
int m,n;
char x[100],y[100];
cout<<"请输入第一个字符串的长度:"<<endl;
cin>>m;
cout<<"请输入第一个字符串:"<<endl;
for(int i=1;i<=m;i++)
cin>>x[i];
cout<<"请输入第二个字符串的长度:"<<endl;
cin>>n;
cout<<"请输入第二个字符串:"<<endl;
for(int j=1;j<=n;j++)
cin>>y[j];
LCSLength(x,y,m,n);
LCS(m,n,x);
cout<<endl;
}
知识总结。