北邮电路综合实验报告

2024-07-11

北邮电路综合实验报告(通用6篇)

篇1:北邮电路综合实验报告

电子电路仿真实验报告

班级:

姓名:

学号:

电子电路仿真实验报告

摘要:OrCAD Capture(以下以Capture代称)是一款基于Windows 操作环境下的电路设计工具。利用Capture软件,能够实现绘制电路原理图以及为制作PCB和可编程的逻辑设计提供连续性的仿真信息。本实验运用OrCAD10.5对晶体管共射放大电路分别进行了静态工作点仿真、直流扫描仿真、交流小信号频率特性仿真、瞬态特性仿真,以及参数扫描仿真。

一 功率放大电路

如上图:电路为一带有发射级负反馈的分压工作点稳定电路,类型为共射放大电路,信号源内阻为50Ω,信号源与防大电阻之间、放大电路和负载之间分别通过容值为100μF、10μF的电容做做容耦合,放大电路采用由Rb1、Rb2以及发射极电阻Re构成的电路提供静态工作点,在Re两端还并联了一个大的电容Ce,在交流时旁路掉Re,该电路的集电极电阻为阻值为2KΩ的电阻Rc,负载阻值为10KΩ,信号源Vcc为12V。设计发达倍数为50倍。

二 仿真过程及分析

1.静态工作点仿真

仿真结果:

分析:基射之间电压约为0.7V,与理论大致相符

2.直流扫描仿真

参数设置

仿真结果:

分析:由图可知,基极电压在直流信号下随着Vcc的增加线性递增

3.交流小信号频率特性仿真

参数设置:从1Hz开始到110MHz,步长为10Hz

仿真结果:输入波形

输出波形:

分析:有输入波形可知当信号源频率达到一定程度时(这里约为1MHz),电容Cb的阻抗不能忽略,它会分走一部分电源电压,导致输入不稳定,所以,放大是在一定的频率内才吻合。有输出波形可知,带宽约为8.7MHz,上截止频率约为8.7MHz,下截止频率约为40Hz 放大倍数约为56,与理论大致想似

4.瞬态特性仿真

参数设置:瞬态分析截止时间为2500μs,开始保存数据的时间为500μs,允许的最大时间间

隔为10μs。因为最初可能电路不稳定,所以保存数据从半个周期开始,共记录两个周期的数据。

仿真结果:输入波形

输出波形:

分析:由输出波形可知,输出略有失真,不过在可接受的范围内

5.参数扫描仿真

参数设置:以Rb2为例,需要将Rb2设置为全局参数

仿真结果:输出波形随Rb2变化时的波形

分析:

三 结论与心得体会

通过仿真我发现理论和仿真大致相仿,但还是有一定差别,数据上还存在一定误差。当然仿真和具体时间还有一定差距,很多数据和结果还有待实践的具体检验。通过此次仿真,我学会了安装OrCAD,并学会了一些基本的仿真操作,期间遇到了一些困难,但在同学们的帮助下也顺利完成了。以后要多加强此类能力的锻炼,在学习中学会合理的利用某些软件工具,以加深和强化自己对所学知识的理解和掌握。

篇2:北邮电路综合实验报告

实验名称:

CAN总线技术与iCAN模块实验

学院:

自动化学院

专业:

自动化专业

班级:

2010211411

姓名:

韩思宇

学号:

10212006

指导老师:

杨军

一、实验名称:

实验一:CAN总线技术与iCAN模块实验

二、实验设备:

计算机,CAN总线系列实验箱,测控设备箱,万用表。

三、实验内容:

1、熟悉iCAN各模块的功能及原理,了解接线端子。

2、学习USBCAN-2A接口卡的使用及安装,安装USBCAN-2A接口卡的驱动程序。

3、根据实验指导书中的手动设置iCAN模块MACID的方法手动设置各模块的MACID。

4、使用提供的iCANTest测试软件工具来测试各模块的功能及用法,利用测试工具与模块之间通信。

5、学习了解iCAN主站函数库中的主要操作函数及其应用。

6、学习利用VC或者VB编程来对iCAN系列各模块进行操作。

四:实验过程:

1、驱动程序安装:

USBCAN-2A接口卡的驱动程序需要自己手动进行安装,驱动程序已经存放于实验准备内容中。找到驱动程序,直接点击进行安装即可。安装完成后,在“管理->设备管理器->通用串行总线控制器”中查看驱动是否安装成功。

注意:安装驱动程序过程中PC机不能连接USB电缆。

2、iCANTEST安装与运行:

连接设备后,打开iCANTEST软件,点击“系统配置”,设置设备类型为USBCAN2,点击“启动”->“上线”,试验各模块的功能。点击“全部下线”,将断开主机与所有模块的连接。

3、各种iCAN模块的测试

4、指示灯,按钮,温湿度传感器的连接

5、测试运行记录与截屏图:

iCAN模块测试运行记录与截图。

图(1)

iCANTEST界面

iCAN4055模块界面如图(2)。DI输入由测控设备箱中的开关控制,DO输出控制设备箱上的灯泡亮灭。

图(2)

iCAN4055模块界面

iCAN4210模块如图(3)。iCAN4210模块为2路模拟量输出模块。将该模块的输出通道0与iCAN4017模块的输入通道3相连,可观察到改变iCAN4210的通道0设定值时,iCAN4017的通道3显示值会随之变化。(通道0为0x8000时,通道3显示为5.000V。)

图(3)

iCAN4210模块界面

iCAN4017模块如图(4)。iCAN4017模块为8路模拟量输入模块。将该模块的通道0与通道1与测控设备箱的温湿度传感器相连,可由通道0和1的电压值推导出传感器测出的环境温度和湿度。由于实验时使用的温湿度传感器温度测量部分故障,所以通道0显示0.000V,湿度测量部分正常,通道1显示为6.182V。

图(4)

iCAN4017模块界面

6、自编程序主要功能

(1)添加一个输入编辑框和一个按钮控件,通过输入0x00-0xFF之间的十六

进制数来控制iCAN4055的DO通道的输入;再设置一个编辑框edit控件来读取iCAN4055的8位数字量输入通道的状态。(2)设置两个输入编辑框控件,来分别设置iCAN4210两个通道的输出。(3)设置4个编辑框edit控件来分别读取iCAN4017前四个通道ch0、ch1、ch2、ch3的模拟量输入值。

7、自编程序运行结果与截图(课上未做,课下做了界面和程序)

图(5)

iCAN4055模块界面

图(6)

iCAN4017模块界面

8、主要程序部分

(1)有关iCAN4055功能模块的简单功能的实现的整体代码如下:

首先在生成的类头文件Sample4055dlg.h中的类CSample4055中添加申明变量: public:

unsigned char buf[1];//发送数据的数据缓存区 unsigned char recbuf[1];//接受数据的数据缓存区 unsigned long len;int outvalue;int count;CString str;在Sample4055.cpp文件中编写控制代码: 首先添加对变量的定义: ROUTECFG cfg;

HANDLE hRoute=0;//新的ICAN网络

HANDLE hSlave4055=0;//数字量输入输出模块4055,MACID=1 CSample4055::CSample4055(CWnd* pParent /*=NULL*/){

}

(2)添加每个控件消息响应函数的代码: void CSample4055::OnStartsysButton1(){ : CDialog(CSample4055::IDD, pParent)buf[0]=0;recbuf[0]=0;count=0;len=0;str=“";

// TODO: Add your control notification handler code here cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

} void CSample4055::OnLink4055Button2(){ if(Mgr_IsStarted()!=1){ { } else { } MessageBox(”CAN网络已启动“);MessageBox(”系统启动失败“);

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,1,&hSlave4055);//添加从站4055,MACID=1

if(Slave_Connect(hSlave4055)!=ICANOK)//判断从站4055是否连接成功 { } MessageBox(”4055连接失败“);

else

{ } MessageBox(”4055连接成功“);

SetTimer(1,1000,NULL);//设定开启定时循环,1代表消息事件id,1000表示1000ms即1s } void CSample4055::OnTimer(UINT nIDEvent)//Timer事件函数 {

// TODO: Add your message handler code here and/or call default if(nIDEvent==1){ }

len=1;Slave_GetDIData(hSlave4055,recbuf,&len);//读取4055数字量输入端口数据 str.Format(”0x%02x:%d“,recbuf[0],count);

m_getDI.SetWindowText(str);count=count+1;

CDialog::OnTimer(nIDEvent);

} } void CSample4055::OnButtonSetvalue()//设定4055数字量输出端口值 { // TODO: Add your control notification handler code here if((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4055)==1))

{

UpdateData(true);

outvalue=strtol(m_invalue,NULL,16);//按十六进制进行读取 if(outvalue >= 0 && outvalue <= 255){

buf[0]=(unsigned short)strtol(m_invalue,NULL,16);

Slave_SendData(hSlave4055,0x20,buf,1);//发送数据 } else { } } else { MessageBox(”请输入00~FF之间的十六进制数“);

MessageBox(”系统未启动或从站未连接,请查看后再进行操作“);}

(3)2路模拟量输出模块iCAN4210的编程使用 实验代码如下:

首先添加所用变量的申明: ROUTECFG cfg;

HANDLE hRoute=0;//新的ICAN网络 HANDLE hSlave4210=0;//MACID=2

控制代码:

void CSample4210::OnBUTTONStartCANSys(){ // TODO: Add your control notification handler code here } 8

cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

} void CSample4210::OnButtonLink4210(){

// TODO: Add your control notification handler code here if(Mgr_IsStarted()!=1){ { } else { } MessageBox(”CAN网络已启动“);MessageBox(”系统启动失败“);

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,2,&hSlave4210);

if(Slave_Connect(hSlave4210)!=ICANOK){ } MessageBox(”4210连接失败“);

else

} void CSample4210::OnButtonCanok(){ if((Mgr_IsStarted()==1)&&(Slave_IsConnected(hSlave4210)==1)){ } } MessageBox(”4210连接成功“);

{ unsigned char buf[32]={0};

UpdateData(true);if(m_setch0>=0.0&&m_setch0<=10.0){

buf[1]=(unsigned short)(m_setch0/10)*65535;

buf[0]=(unsigned short)((m_setch0/10)*65535)>>8;

} else { } if(m_setch1>=0.0&&m_setch1<=10.0)MessageBox(”提示:请输入0~10V电压“);

{

buf[3]=(unsigned short)(m_setch1/10)*65535;

buf[2]=(unsigned short)((m_setch1/10)*65535)>>8;

}

else { } MessageBox(”提示:请输入0~10V电压“);

Slave_SendData(hSlave4210,0x60,buf,4);

} else {

MessageBox(”系统未启动或从站未连接,请查看后再进行操作“);}(4)8路模拟量输入模块iCAN4017 首先,在生成的.h头文件中添加使用到的变量的申明。public:

unsigned char recbuf[16];unsigned long len;int count;} 在.cpp文件中首先添加iCAN网络定义和申明以及变量的初始化操作。

ROUTECFG cfg;HANDLE hRoute=0;//新的ICAN网络

HANDLE hSlave4017=0;//AI模块4017,MACID=3

CSample4017::CSample4017(CWnd* pParent /*=NULL*/){

: CDialog(CSample4017::IDD, pParent)//{{AFX_DATA_INIT(CSample4017)m_valuech0 = 0.0;m_valuech1 = 0.0;m_valuech2 = 0.0;

} m_valuech3 = 0.0;m_counter = 0;//}}AFX_DATA_INIT recbuf[0]=0;recbuf[1]=0;recbuf[2]=0;recbuf[3]=0;recbuf[4]=0;recbuf[5]=0;recbuf[6]=0;recbuf[7]=0;len=0;count=0;void CSample4017::OnBUTTONStartCANSys(){

// TODO: Add your control notification handler code here cfg.iCardType=4;//使用usbcan2接线口 cfg.iCardInd=0;//卡序号

cfg.iCANInd=0;//CAN通道选择(0表示0通道;1表示1通道)cfg.wCANBaud=0x001c;//波特率的设定0x001c(500kbps)cfg.iMasterCycle=500;//主站循环周期 cfg.wMasterID=0;//主站ID

Mgr_AddRoute(cfg,&hRoute);//添加iCAN网络

if(Mgr_StartSys()!=ICANOK)//调用Mgr_StartSys()函数对CAN网络是否启动进行判断,返回为ICANOK

{

} } else { } MessageBox(”系统启动失败“);MessageBox(”CAN网络已启动“);void CSample4017::OnButtonLink4017(){

// TODO: Add your control notification handler code here if(Mgr_IsStarted()!=1){

MessageBox(”系统未启动或启动失败,请先启动CAN网络“);

} else { // TODO: Add your control notification handler code here Route_AddSlave(hRoute,3,&hSlave4017);if(Slave_Connect(hSlave4017)!=ICANOK){ } MessageBox(”4017连接失败“);

else

{ }

SetTimer(1,1000,NULL);} MessageBox(”4017连接成功");} void CSample4017::OnTimer(UINT nIDEvent){

// TODO: Add your message handler code here and/or call default if(nIDEvent==1){

Slave_GetAIData(hSlave4017,recbuf,&len);

m_valuech0=((double)(recbuf[0]*16*16+recbuf[1])-0x8000)*10/(double)0x8000;

m_valuech1=((double)(recbuf[2]*16*16+recbuf[3])-0x8000)*10/(double)0x8000;

m_valuech2=((double)(recbuf[4]*16*16+recbuf[5])-0x8000)*10/(double)0x8000;

m_valuech3=((double)(recbuf[6]*16*16+recbuf[7])-0x8000)*10/(double)0x8000;

}

篇3:北邮电路综合实验报告

关键词:电路,实验,教学,综合素质,创新

基于“高层次、多样化、创造性”的人才培养目标, 适应当前社会对人才的需要。高等教育的发展要求对学生进行全方位的培养, 尤其要加强大学生综合素质和创新能力的培养。电路实验是电子信息类专业学生学习和掌握现代电子技术的一门基础性课程。通过电路实验, 不仅要学生掌握基本理论知识、方法和技巧, 更要培养学生分析问题、解决问题和独立思考的能力, 为今后的专业课学习和从事电子或相关工作奠定坚实的基础。对电路实验教学方法及教学模式进行改革, 是近年来高校教学改革的主要内容, 也取得了很多研究成果[1,2,3]。郑州大学信息工程学院电路课程组教师特别注重学生能力培养, 借鉴已有的教改成果, 进行了大量的相关研究和实践。

1 传统电路实验教学存在的问题

随着电子技术的发展, 电路的应用日益广泛。电路作为电子、通信、自动化控制等理工科电类专业的基础课程, 其实验教学是培养过程中极为重要的组成部分, 担负着巩固学生理论知识, 培养学生动手操作能力、知识应用能力及创新能力的重任。但是, 目前许多院校还在沿用电路实验教学的传统实验模式、方法和手段, 使得一部分学生理论联系实际的能力和动手操作能力较差。

传统电路实验存在的问题主要有以下几个方面:一是实验方法、步骤教条化。学生课前不预习, 课上完全机械、被动地按照教师的讲解、实验指导书, 按部就班地操作, 束缚了学生学习的主动性, 也很难充分激发学生的兴趣。二是受实验室实验条件的限制, 可提供的实验设备有限。学生亲自动手的机会少, 接触仪器设备的机会和时间也比较少。三是实验教学内容往往在规定的学时内开设一些验证型实验, 缺乏设计型、综合型、创新型的实验内容, 不利于对学生独立思考能力、综合运用能力及创新能力的培养。四是实验课程的开设、实施、管理和评价等均由教师决定, 没有给学生提供广泛的自主空间。以上问题导致学生对实验轻视, 要想使实验教学能更好地发挥作用, 必须对实验教学内容和教学模式进行改革。

2 实施开发式的实验运作模式

在信息时代, 随着学生规模的不断扩大、现代电子技术的发展以及对人才需求的变化等, 电路实验教学应根据学生的智力类型、学习风格等, 激发学生的学习欲望, 引导学生主动地获取知识。开放式的实验是一种从时间、空间、实践内容、指导教师以及经费等方面最大程度地满足学生实践的需求, 并创造出一个宽松、便利, 能够充分发挥学生个人潜能的开放实验环境[4]。它有着丰富的内涵和多元化的形式:

2.1 实验室资源的开放。

资源包括教学资料、仪器设备、实验材料等均向学生开放。这种方式提供给学生多元化的知识获取途径, 保证学生必要的实验环境, 有助于培养学生自主学习等素质的培养。

2.2 实验室时间和空间的开放。

学生可以根据自己的实际进行实验, 即进入实验室的时间及做实验的时数均开放。实验前学生可以到实验室进行预习, 实验后结果不理想的学生可以进行重做实验, 对于实验能力强的学生可以开展综合型、设计型及研究型的实验。

2.3 实验内容的开放。

包括实验教学内容、教学手段、教学方法和实验形式的开放, 让学生能够真正做到自主学习。实验开放教学内容, 一方面应与交叉学科实验相结合, 以扩大学生知识面, 提高学生应用交叉学科知识的综合能力;另一方面应与课外科技活动、科研课题相结合, 如“挑战杯”、“大学生创业计划大赛”及指导教师的科研课题等项目, 利用学生课外科技实践活动来培养学生创新能力, 激发学生求知欲望和探索进取精神。

制定完善的管理制度是实验室开放工作顺利进行的基本保障, 是确保实验教学质量的基础保证。首先, 制定开放式实验室相应的规章制度, 如“开放实验室设备管理办法”、“实验指导教师岗位职责”、“开放式教学的试行方法”等;其次, 延长开发实验时间, 在规定时间内每个下午开放3小时左右, 便于每个学生完成实验项目;最后, 根据学时、专业要求的不同, 对学生进行分片安排, 便于教师有针对性的辅导。成绩评定标准以人为本, 允许学生充分发挥个性特长, 鼓励学生进行开发性实验。开放实验室采取分项考核的方式, 包括平时成绩 (25%) 、实验操作 (50%) 、实验报告 (25%) 。平时成绩主要考核预习、实验步骤拟订等;实验操作主要包括仪器设备操作方法、数据获得情况、排除故障情况等;实验报告的评定, 主要由实验原理与电路图、实验内容和过程的陈述、数据记录和处理、结果与讨论等决定。成绩评定的原则是保证学生的实验主体地位, 发挥他们主观能动性, 提高学生发现和解决问题的能力, 培养学生的创新能力。

3 实施分层次的实验教学模式

为使实验教学真正成为创新人才培养的主渠道, 学校整合实验室资源, 优化实验设备, 增设了综合型、创新型实验教学环节, 构建多层次、课内外一体化、因材施教的实验教学体系, 从体系和机制上保证理论教学与实验教学统筹安排, 实现理论、实验、技能训练、科学研究的有机结合[5]。

3.1 基础型实验

在电路实验初始阶段, 在实验教学内容上首先安排基础实验。以传统的验证实验为主, 教学目标重在掌握基本的实验技能与实验方法, 掌握常规电子测量仪器仪表的使用方法。在实验过程中通过理论知识与实验内容的有机结合, 使学生加深对抽象理论知识的理解, 同时又用理论知识验证实验结果的正确性。根据由易到难、循序渐进的原则, 先开设几个基础实验, 为后面的综合型和创新型实验打好基础。比如基尔霍夫定律、戴维宁定理、基本门电路逻辑功能测试等经典理论知识的验证性实验。通过实验使学生熟练基本实验仪器及器件的使用。

3.2 综合型实验

综合型实验是运用所学过的知识进行系统的、全面的实验。实验内容涉及的范围是课程的部分内容或全部内容, 也可以是与课程相关的实验内容。与传统的实验教学相比, 综合型实验要求的知识面更广由多项任务组成, 各项任务的先后顺序具有逻辑性。通过综合型实验的开设, 使学生理解和掌握学科的基础知识、前沿领域研究进展和发展方向, 理解研究方法的进步对学科的推动作用, 从不同的角度提高学生的综合动手能力, 培养学生综合运用相关学科知识及解决问题的系统思维能力, 提高学生发现、分析、解决问题的能力使学生有更多的判断和选择的机会, 并为后续专业课的学习奠定一定的基础。

3.3 创新型实验

创新型实验是实验教学的高级阶段, 它打破了原有的教学模式, 树立“开发教学、创新教学”观念, 综合集成现代科技发展的新知识、新技术和新方法, 从科研、生产和工程实践中有针对性地选用综合性、先进性、应用性强的内容, 根据学生创造性探索的需要, 为学生提供开放的实验教学内容。整个创新型实验过程, 从搜集资料、确定方案、实施研究到最终阶段性成果的形成, 让学生自主设计、自主探索、自主总结、自主解决问题, 充分发挥学生的想象力和创造力, 提高学生的实验技能和科研能力, 培养学生科学思维、创新精神及实践能力及协同攻关能力。创新型实验教学具有开放性, 一方面实验内容具有选择性, 学生可以根据自身发展需要, 自主选择实验内容, 独立开展研究训练;另一方面是教学时空具有广延性, 学生可以通过预约方式, 自主选择实验时间, 将课堂实验延伸至课外自主创新。目前开展的创新型实验主要有直流稳压电源、语言录放电路、限时抢答电路、彩灯循环控制电路等自选课题。

4 总结

随着现代社会对高素质、创新型人才的需要, 寓知识、能力、创新教育于一体的电路实验课在新时代的电路教学中的重要性越来越突出。在电路实验教学中, 郑州大学信息工程学院积极探索适应素质教育的方法和方式, 如更新观念、加强实验室建设、改革实验教学的方法和手段等, 取得了较好的教学效果, 使学生实验动手能力、学习能力、分析和解决问题能力、创新能力、科学品质等综合素质得到了全面提高。

参考文献

[1]沈一骑, 万凯.电路分析实验的改进与研究性拓展[J].实验技术与管理, 2013, 30 (4) :79-80.

[2]金波, 刘开健.电路分析实验改革与创新意识的培养[J].实验科技与技术, 2010, 8 (1) :85-87.

[3]张文婷, 王紫婷.电路分析实验课程教学改革的研究与探索[J].实验室研究与探索, 2010, 29 (5) :146-147, 195.

[4]卢艳军.开放式实验教学模式的探讨[J].实验室科学, 2009 (1) , 23-26.

篇4:北邮电路综合实验报告

一、总原则

选择仪器和电路的目的是为了减小实验误差,使测量尽量准确.因此,为了使测量尽量准确和保护仪器,选择仪器和电路时应注意如下总原则.

1.电表的选择:①尽量选择较理想(即安培表内阻越小越好,伏特表内阻越大越好)的电表(电压表,电流表);②选量程时应尽量使指针达半偏以上,这样有利于减小误差.

2.变阻器的选择:原则上要便于调节.所以在限流接法中其电阻值应接近待测电阻,不要过大,也不要过小;在分压接法中,尽量选阻值小的.额定电流则越大越好.

3.安培表内、外接法的选择:当RxRARVRx时,即测大电阻时用安培表内接法.

4. 分压、限流电路的选择:①选择电路时优先考虑限流电路,当电路中最小电流仍超过电流表量程(或电路中额定电流)时,就用分压电路;②要求负载电压从零开始或尽量多测几组试验数据时,用分压电路;③用图线法处理数据时,用分压电路.

二、例题解析

例1(2013·北京·21)某同学通过实验测定一个阻值约为5 Ω的电阻Rx的阻值.

(1)现有电源(4V,内阻可不计)、滑动变阻器(0~50 Ω,额定电流2A)、开关和导线若干,以及下列电表:

A.电流表(0~3 A,内阻约0.025 Ω)

B.电流表(0~0.6 A,内阻约0.125 Ω)

C.电压表(0~3 V,内阻约3 kΩ)

D.电压表(0~15 V,内阻约15 kΩ)

为减小测量误差,在实验中,电流表应选用,电压表应选用(选填器材前的字母);实验电路应采用图1中的(选填“甲”或“乙”).

图1(2)图2是测量Rx的实验器材实物图,图中已连接了部分导线.请根据在(1)问中所选的电路图,用笔画线代替导线补充完成图中实物间的连线.

图2(3)接通开关,改变滑动变阻器滑片P的位置,并记录对应的电流表示数I、电压表示数U.某次电表示数如图3所示,可得该电阻的测量值Rx=UI=Ω(保留两位有效数字).

图3(4)若在(1)问中选用甲电路,产生误差的主要原因是;若在(1)问中选用乙电路,产生误差的主要原因是.(选填选项前的字母)

A.电流表测量值小于流经Rx的电流值

B.电流表测量值大于流经Rx的电流值

C.电压表测量值小于Rx两端的电压值

D.电压表测量值大于Rx两端的电压值

解析(1)为了减小误差,应使电表读数为量程的13~23,电源电动势为4 V,故电压表选C.估算通过Rx的最大电流约为Im=35A=0.6 A,所以电流表应选B.因为RVRx>RxRA,所以电流表应外接,即应采用甲电路,测量误差较小.

(2)如图4所示.

图4(3)电流表、电压表的读数分别为I=0.50 A,U=2.60 V,所以Rx=2.600.50Ω=5.2 Ω.

(4)甲电路中产生误差的主要原因是电压表的分流作用,选项B正确.乙电路中产生误差的主要原因是电流表的分压作用,故选项D正确.

例2在“测定金属的电阻率”的实验中,若待测金属丝的电阻约为5 Ω,要求测量结果尽量准确,提供以下器材供选择:

A.电池组(3 V,内阻1 Ω)

B.电流表(0~3 A,内阻0.012 5 Ω)

C.电流表(0~0.6 A,内阻0.125 Ω)

D.电压表(0~3 V,内阻4 kΩ)

E.电压表(0~15 V,内阻15 kΩ)

F.滑动变阻器(0~20 Ω,允许最大电流1 A)

G.滑动变阻器(0~2 000 Ω,允许最大电流0.3 A)

H.开关、导线若干

(1)实验时应从上述器材中选用(填写仪器前的字母代号);

(2)测电阻时,电流表、电压表、待测金属丝电阻Rx在组成测量电路时,应采用电流表(选填“外”或“内”)接法,待测金属丝电阻的测量值比真实值偏(选填“大”或“小”);

图5(3)若用螺旋测微器测得金属丝的直径d的读数如图5所示,则读数为mm;

(4)若用L表示金属丝的长度,d表示直径,测得电阻为R,请写出计算金属丝电阻率的表达式ρ=.

解析(1)电池组电压是3 V,流过金属丝的最大电流Im=Er+Rx=0.5 A,故电流表选C,电压表选D;滑动变阻器选总阻值小的,便于调节,故选F;另外要选导线、开关.

(2)因为RxRA=40,RVRx=800,故电流表选择外接法,外接法测量值偏小.

(3)根据千分尺的读数规则知,读数是0.5 mm+40.0×0.01 mm=0.900 mm.

(4)R=ρLS=ρ4Lπd2,解得ρ=πRd24L.

例3物理兴趣小组的同学们从实验室中找到一只小灯泡,其标称功率值为0.75 W,额定电压值已模糊不清.他们想测定其额定电压值,于是先用欧姆表直接测出该灯泡的电阻约为2 Ω,然后根据公式计算出该灯泡的额定电压U=PR=0.75×2 V=1.22 V.他们怀疑所得电压值不准确,于是,再利用下面可供选择的实验器材设计一个电路,测量通过灯泡的电流和它两端的电压并根据测量数据来绘制灯泡的U-I图线,进而分析灯泡的额定电压.

A.电压表V(量程3 V,内阻约3 kΩ)

B.电流表A1(量程150 mA,内阻约2 Ω)

C.电流表A2(量程500 mA,内阻约0.6 Ω)

D.滑动变阻器R1(0~20 Ω)

E.滑动变阻器R2(0~100 Ω)

F.电源E(电动势4.0 V,内阻不计)

G.开关S和导线若干

H.待测灯泡L(额定功率0.75 W,额定电压未知)

(1)在下面所给的虚线框中画出他们进行实验的电路原理图,指出上述器材中,电流表选择(填“A1”或“A2”);滑动变阻器选择(填“R1”或“R2”).

(2)在实验过程中,该同学将灯泡两端的电压由零缓慢地增加,当电压达到1.23 V时,发现灯泡亮度很暗,当达到2.70 V时,发现灯泡已过亮,便立即断开开关,并将所测数据记录在下边表格中.

篇5:北邮小学期c++实验报告

c++实验总结报告

——网络工程14班饶思哲 ——学号:2013211574 实验一简单C++程序设计 1.猜价格游戏

编写C++程序完成以下功能:

(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);

(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;

(3)直到猜对为止,并给出提示。

题目1-1总结:

1)本题需要随机生成整数,我开始只使用rand(),即price=rand();来生成随机整数

但这样只是一个伪随机函数,每一次重新打开程序生成的数都是一致的。因此加入时间随机种子:srand((unsigned)time(NULL))2)个人改进1:定义最大值最小值,在每次猜测数字时显示应猜的数字范围,作为提示。

想到这个是因为有一次猜了很多遍都没猜到,一时突然忘记猜到什么范围,然后往前翻猜过的数字和大小感觉相当麻烦,所以就添上了应猜范围,方便再一次猜数。3)个人改进2:本来有一个判断条件判断生成的随机数是不是1~1000范围内,而后更进为随机生成整数对1000取余得到0~999整数,再+1得到1~1000的整数。

实验二类与对象 1.矩形

编写C++程序完成以下功能:

(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;(3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;(4)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(5)计算其面积,并输出。

题目2-1总结:

1)这一题是第一次用到class类的题目,开始并不明白为何要定义class,然后还需要区分public和private。而后来去图书馆借了书看到c++最大特色就是可以封装,定义私有属性和公有函数,以确保有些函数和参数不会被轻易访问到,降低错误率。2)class类在最起初定义时总是在class Rectangle那一行报错,经查书发现class定义最后一个大括号后有分号,开始并没有加上。

3)起初在调用class中函数时用c调用的方式,没有跟面向的对象结合,导致编译出错,而后从distance()改为p.distance()就正确了。

4)计算两点距离和面积运用开方和绝对值函数,前面若没有加头文件math.h则会报错。5)输入左上角右下角坐标时,若输入不当,可能会出现面积为负值的情况,所以加上绝对值函数保证面积非负。

6)起初不知道构造函数和析构函数的定义和用法,经翻阅书籍和运行程序得知构造函数在创建对象时调用,可以有多个。而析构函数则在释放对象时调用,一般每一个class中都只有一个默认析构函数。且构造函数与类名称一致,析构函数则在类名称前加~。

2.友元

编写C++程序完成以下功能:

(1)定义一个Boat和Car两个类,他们都具有私用属性——重量;

(2)编写一个函数,计算两者的重量和。double TotalWeight(Boat& b, Car& c);

题目2-3总结:

1)友元函数:在两个对象中都使用到时,可以使用友元函数,并在类外单独定义。

友元函数是允许在类外访问类中的任何成员的。开始在类外单独定义时跟类的成员函数单独定义混淆,写成了double Boat::TotalWeight(),导致编译错误,而后发现友元函数直接用函数名和函数返回值类型定义即可,不需要加上class类的名称。

2)起初定义完class Boat和class Car后发现编译错误,在友元函数的声明那一行出错,而后发现在这行之前没有定义Car类,于是将其在最开头声明出来,通过。

3)起初并没有加上boat和car类的构造函数和析构函数,可是经上网查阅,默认构造函数和析构函数可以系统自动生成,但析构函数只能删除成员指针,并不能释放指针指向的空间,所以若没有申请动态内存,析构函数可不写出,若申请,则需自行在析构函数中delete。

实验三数组与指针 1.矩阵

(一)编写C++程序完成以下功能:

(1)假定矩阵大小为4×5(整型数组表示);

(2)定义矩阵初始化函数,可以从cin中输入矩阵元素;(3)定义矩阵输出函数,将矩阵格式化输出到cout;

(4)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(5)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(6)定义三个矩阵:A1、A2、A3;(7)初始化A1、A2;

(8)计算并输出:A3 = A1加A2,A3 = A1减A2。

题目3-1总结:

1)起初在矩阵相加相减的赋值中所用语句为:m.matrix[i][j]=a.matrix[i][j]+b.matrix[i][j] 但是运行程序发现m矩阵所有元素都是0。经单步调试,发现并没有赋值成功。经查阅书籍,了解到this指针是指向类的对象的地址,便改用this->matrix[i][j]作为赋值对象,最后程序正确。

2)个人改进:将行数列数在文件开头用define定义,可以随时更改。

3)经多次调试后,程序运行结果正确,但矩阵看起来非常混乱,因为并没有行列对齐,于是在打印矩阵中每列直接用table空格隔开,保证美观。2.矩阵

(二)编写C++程序完成以下功能:

(1)假定矩阵大小为4×5(整型);

(2)矩阵空间采用new动态申请,保存在指针中;

(3)定义矩阵初始化函数,可以从cin中输入矩阵元素;(4)定义矩阵输出函数,将矩阵格式化输出到cout;

(5)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(6)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(7)动态申请三个矩阵:A1、A2、A3;(8)初始化A1、A2;

(9)计算并输出A3 = A1加A2,A3 = A1减A2;(10)释放矩阵空间。

题目3-2总结:

1)与3-1题目的区别在int main中用new函数动态申请内存,然后析构函数需要释放申请的空间而不只是自动删除指向空间的指针。析构函数如图。

一开始并不知道该怎么动态申请内存,在c中使用malloc可是c++中并不一样。经查阅书籍,发现c++中申请释放内存用new和delete非常简便。2)指针调用类成员函数一开始不知道该怎么写,写成A1.input()结果编译错误。经查阅书籍,得知指针调用成员函数需写成A1->input()的形式。

3)在释放动态内存时,用到delete函数。但开始的时候写delete matrix时候会出问题。上网查询后得到以下delete用法。

Delete用法:当释放内部类型,如int double型时,直接delete a 即可。若是释放自己定义的class类型,需用delete[]matrix来释放内存。3.矩阵

(三)编写C++程序完成以下功能:

(1)用类来实现矩阵,定义一个矩阵的类,属性包括:

 矩阵大小,用 lines, rows(行、列来表示);

 存贮矩阵的数组指针,根据矩阵大小动态申请(new)。(2)矩阵类的方法包括:

 构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组;  析构函数,需要释放矩阵的数组指针;  拷贝构造函数,需要申请和复制数组;  输入,可以从cin中输入矩阵元素;  输出,将矩阵格式化输出到cout;  矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同;  矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵类,但必须矩阵大小相同。

(3)定义三个矩阵:A1、A2、A3;(4)初始化A1、A2;

(5)计算并输出A3 = A1加A2,A3=A1减A2;

(6)用new动态创建三个矩阵类的对象:pA1、pA1、pA3;(7)初始化pA1、pA2;

(8)计算并输出pA3=pA1加pA2,pA3=pA1减pA2;(9)释放pA1、pA1、pA3。

题目3-3总结:

1)拿到这道题我认为要定义一个矩阵类对象,其中包括3-1和3-2一样的input函数,print函数,plus函数,subtract函数,还有新增的构造函数析构函数。一上来我认为class中属性不再是之前的某行某列的数值,而是行数和列数还有矩阵的头指针。根据输入的行数列数来申请内存,再将数值存入不同的位置。然后在主函数中分为两个部分,一个是直接创建对象,另一个是创建矩阵数组指针。

2)第一部分跟前两题类似,所以很快就调试完成并且得到了正确的结果,但是指针部分一直出现问题。最开始是三个矩阵分别申请内存,这样的后果就是要输入三次行数和列数的数值,有可能出现行列数不相等的情况,给之后的加减操作带来麻烦。因此想到让A1矩阵申请内存,而让A2、A3矩阵都与A1相等,就可以避免多次输入行列数,且保证了矩阵大小相等。但这样输入第一个矩阵数值后,矩阵元素获取正常。可当输入第二个矩阵的数值以后,A1和A2矩阵的元素都变为第二个矩阵的元素,即第一个矩阵的元素被覆盖掉。导致和矩阵为第二个矩阵的2倍,差矩阵都是零。经过反复调试,曾经试过将含参构造函数中输入行列数改到主函数中,再给A1申请动态内存。但是因为A2和A3还是初始化跟A1相等,结果并没有改变,还是错误的。而后想到用含参构造函数来申请动态内存,输入固定的行列数后,用确定的行列数来new Matrix(x,y),这样一来不仅矩阵大小相等,而且也不会存在前一个矩阵的值被后一个覆盖掉的问题。经过调试,终于得到了正确的结果。

3)调试过程中我了解到指针初始化和赋值过程中是容易发生树脂覆盖的,所以尽量不要将指针初始化成跟某个指针相等。

实验四继承与派生

1、形状

(一)编写C++程序完成以下功能:

(1)声明一个基类Shape(形状),其中包含一个方法来计算面积;(2)从Shape派生两个类矩形和圆形;(3)从矩形派生正方形;

(4)分别实现派生类构造函数、析构函数和其他方法;

(5)创建派生类的对象,观察构造函数、析构函数调用次序;(6)不同对象计算面积。

题目4-1总结:

1)这一题主要是函数的派生方法使用,经过查阅书籍,得知在class定义后加上:: public(基类名称)便是作为一个派生类的定义,可以沿用基类中的成员函数。

2)并且经过对构造函数和析构函数调用,得知是先调用基类的构造函数,再调用派生类的构造函数创建派生类对象,在程序结束时,先调用派生类的析构函数释放派生类对象,再调用基类的析构函数释放基类对象。

2、形状

(二)——虚函数(1)将【形状

(一)】中的基类计算面积的方法定义为虚函数,比较与【形状

(一)】程序的差异;

(2)将【形状

(一)】中的基类定义抽象类,比较与【形状

(一)】程序的差异。

题目4-2总结:

1)起初并不知道虚函数的作用,后来经过查阅书籍得知在基类中定义虚函数,是为了在派生类中定义这一函数的不同操作方式。并且起初只改变了基类中area函数,在其前面加了virtual,但并没有体现出虚函数的运用。而后看到书上虚函数的应用,发现虚函数是可以让一个基类指针调用派生类相应函数的。于是经过改进,在主函数中定义了3个基类指针,分别指向派生矩形类对象、派生圆形类对象、派生正方形对象,然后并非通过对象名称调用成员函数,而是用基类指针调用派生类中的area函数,充分体现出对虚函数的应用。

2)这一题虽然跟上一题相似,但却因为运用了虚函数而变得不同。这一题让我对虚函数有了更加深入的了解。也了解到调用类中的成员函数不一定非要用对象名或者对象指针调用,也可以用其基类的指针通过虚函数调用。

实验五多态性

1、对Point类重载++和――运算符

编写C++程序完成以下功能:

(1)Point类的属性包括点的坐标(x,y);(2)实现 Point类重载++和――运算符:

 ++p,--p,p++,p--。

 ++和――分别表示x,y增加或减少1。

题目5-1总结:

1)对于符号的重载开始并不理解什么意思,后来得知是重新定义一下++、--操作的过程,包括自加自减和赋值。

2)通过这一道题,对于自加符号的前后置的区别又有了更深的印象。起初在—p和++p的时候都只是将x和y加一,并没有赋值,导致在主函数中写q=++p和q=--p时q保持原值,造成结果错误。单步调试后发现这一错误,及时改正过来。3)程序结果正确后编写菜单界面,使其操作步骤更加清晰明了。实验六流式IO

1、流式IO

(一)编写C++程序完成以下功能:

(1)使用ofstream向一个文本文件中输出各种类型的数据,并打开文件观察结果:

 整数、无符号整型、长整型、浮点型、字符串、……

(2)用十进制、八进制、十六进制方式向文本文件中输出整数;(3)使用控制符和成员函数来控制输出的格式:

 set()precision()...题目6-1总结:

1)文件流主要是向文件中输入信息和从文件读取信息。而跟c语言不同的是c需要fopen来打开一个文件,而c++中只需要用fstream函数。且文件输入方式也比c语言简便很多。2)转换进制开始想到的是用数学的方法算出不同进制下的数值,再输入文件中,但非常的麻烦。后经查阅书籍,看到有指定进制的函数,可以用来修改默认的十进制:oct和hex。3)最后程序正确后,编辑menu显示菜单,使操作更加清晰明了。

2、流式

(三)编写C++程序完成以下功能:(1)输入一个文本文件名;

(2)打开文件名,在该文件的每一行前面加上一个行号,保存在另外一个文本文件中。

题目6-3总结:

1)因为第一题流式已经尝试过向文件中输入信息,而经过翻阅书籍得知从文件中可以用getline整行读取字符串,便可以轻易的将文件内容加上行数,并输出到另一个文本文件中。

2)本题我觉得最大的困难在于输入文本文件名,并打开文件名。书上也并没有关于打开文件名的相关资料,于是上网查询,发现可以用string.h中的c_str()函数来获取键盘输入的文件名字符串,并打开文件名。

3)因为文件处理并没有在屏幕上有所显示,为了让每一步操作更加明了,在复制完一行后会在屏幕上打出某某行复制成功,使程序运行过程更清晰。实验七 C++程序设计应用

1、电话本

编写C++程序完成以下功能:

(1)实现简单电话本功能,用姓名来搜索电话号码;(2)用户输入姓名,程序查找并输出结果;(3)用户可以通过输入,添加姓名和电话号码;(4)用户可以删除姓名和电话号码;(5)电话本可以保存在指定文件中;(6)电话可被从指定文件中读入到内存。

题目7-1总结:

1)电话本分为几大部分:读到内存、输出到文件、新增联系人、删除联系人、查找联系人。因为是读到内存,就想到了可以用数组或者链表来构成电话本的框架。而这两种方式在c语言用过,所以逻辑方便很熟悉,于是选择了比较简便的数组,这样不易出现指针错误的情况。

2)个人改进1: 新增联系人函数中,就是将联系人信息从键盘逐项读入,然后选择将联系人插入到什么位置。若一共6个联系人,插入位置输入3,则插入第三个位置,后面的联系人依次向后移一位。但若是一共6个联系人,插入位置输入8,则会提醒输入位置不当,直接将联系人插入到最后一个位置,即第七。

3)删除、查找、修改函数中都用到了用姓名查找,于是将其单独摘出来定义findposition,找到联系人位置。起初写的是将输入的字符串逐个跟name比较,即a == name,但却发现这样程序查找出来联系人永远不存在。经上网查阅,发现字符串相等不能直接像字符一样用==来判断,而是用><来判断,于是将其改为>=&&<=。但一开始由于疏忽,将&&且关系写成||或关系,导致查找出来永远是第一个联系人。后来单步调试发现错误,改正过来。

4)个人改进2: 删除、查找、修改中,若是联系人不存在,需要输出提示。而我另外又加了一句,并不是说不存在就直接返回,而是让用户自己选择是继续输入姓名还是返回主菜单。也让手误的时候不再把前面的操作进行一遍,留有手误的余地。5)修改联系人模块,一开始class类中只有setPhone函数,并没有setname,setmobile等等,而是直接将所有属性值组合起来构建联系人。这样的后果就是在修改联系人的时候,只修改了一项,但是并不能赋值进去。表面上虽然修改了,可查找后发现联系人的信息并没有改变。后来将每一项信息都分别set,经过调试最终结果正确。

6)从指定文件将电话本读入内存,就跟实验6第三题的流式很相似,都是逐行读取信息,只是读取后是存入数组的不同属性值中。开始不知道该怎么确定文本文件中不再有联系人信息,而后上网查资料发现当文件中不再有信息可以读的时候,infile>>name>>mobile…的值就是0,便可停止操作。而姓名等信息也可以逐个赋值到phone类数组里。

7)个人改进3: 电话本不需要手动保存在指定文件中,主菜单也不再显示这一操作,而是当选择退出电话本时自动保存到输出的output.txt中。

篇6:北邮数据结构实验报告 单链表

实验名称: 实验一

线性表 学生姓名:

级:

班内序号:

号:

期: 2014年1月3日

实验目的

 熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法  学习指针、模板类、异常处理的使用  掌握线性表的操作的实现方法  学习使用线性表解决实际问题的能力 实验内容

2.1题目1 根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。

线性表存储结构(五选一):

1、带头结点的单链表

2、不带头结点的单链表

3、循环链表

4、双链表

5、静态链表

线性表的基本功能:

1、构造:使用头插法、尾插法两种方法

2、插入:要求建立的链表按照关键字从小到大有序

3、删除

4、查找

5、获取链表长度

6、销毁

7、其他:可自行定义

编写测试main()函数测试线性表的正确性。程序分析

3.1 存储结构 单链表的存储结构:

3.2 关键算法分析

一、关键算法 1.头插法

自然语言描述:a.在堆中建立新结点

b.将a[i]写入到新结点的数据域

c.修改新结点的指针域

d.修改头结点的指针域,将新结点加入链表中 代码描述: template LinkList::LinkList(T a[], int n)//头插法建立 {

front = new Node;front->next = NULL;for(int i=n-1;i>=0;i--){ Node* s = new Node;s->data = a[i];

}

} s->next = front->next;front->next = s;时间复杂度:O(n)

2.尾插法

自然语言描述:a.在堆中建立新结点

b.将a[i]写入到新结点的数据域

c.将新结点加入到链表中

d.修改修改尾指针 代码描述: template LinkList::LinkList(T a[], int n)//尾插法建立 {

front = new Node;front->next=NULL;Node * r = front;for(int i=0;i * s = new Node;

}

} s->data = a[i];s->next = r->next;r->next= s;r=s;时间复杂度:O(n)

3.析构函数

自然语言描述:a.新建立一个指针,指向头结点

b.移动a中建立的指针

c.逐个释放指针

代码描述: template LinkList::~LinkList()//析构函数,销毁链表 {

Node * p = front;while(p){ front = p;p = p->next;

} } delete front;4.按位查找函数

自然语言描述: a.初始化工作指针p和计数器j,p指向第一个结点,j=1

b.循环以下操作,直到p为空或者j等于1

b1:p指向下一个结点

b2:j加1

c.若p为空,说明第i个元素不存在,抛出异常

d.否则,说明p指向的元素就是所查找的元素,返回元素地址

代码描述: template Node* LinkList::Get(int i)//按位查找 {

Node * p = front;int j=0;while(p){

if(j

} else break;p = p->next;j++;

} if(!p)throw“查找位置非法”;else

return p;} 时间复杂度:O(n)

5.按值查找函数

自然语言描述:a.初始化工作指针p和计数器j,p指向第一个结点,j=1

b.循环以下操作,找到这个元素或者p指向最后一个结点

b1.判断p指向的结点是不是要查找的值,如果是,返回j;

b2.否则p指向下一个结点,并且j的值加一

c.如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息

代码描述: template int LinkList::Locate(T x)//按值查找 {

Node * p = front->next;int j = 1;while(p){

} return-1;if(p->data == x)return j;else { p = p->next;

j++;} } 时间复杂度:O(n)6.插入函数

自然语言描述: a.在堆中建立新结点

b.将要插入的结点的数据写入到新结点的数据域

c.修改新结点的指针域

d.修改前一个指针的指针域,使其指向新插入的结点的位置

代码描述: template void LinkList::Insert(int i,T x)//插入函数 {

Node * p = Get(i-1);if(p){

} else throw“插入位置非法”;Node * s = new Node;s->data = x;s->next = p->next;p->next = s;} 时间复杂度:O(n)7.按位删除函数

自然语言描述:a.从第一个结点开始,查找要删除的位数i前一个位置i-1的结点

b.设q指向第i个元素

c.将q元素从链表中删除

d.保存q元素的数据

e.释放q元素 代码描述: template T LinkList::Delete(int i)//删除函数 { Node *p = Get(i-1);Node *q = p->next;

T x=q->data;

} p->next = q->next;delete q;return x;

8.遍历打印函数

自然语言描述: a.判断该链表是否为空链表,如果是,报错

b.如果不是空链表,新建立一个temp指针

c.将temp指针指向头结点

d.打印temp指针的data域

e.逐个往后移动temp指针,直到temp指针的指向的指针的next域为空

代码描述: template void LinkList::PrintList()//打印链表 {

} Node * p = front->next;while(p){

} cout<data<<;p = p->next;9.获取链表长度函数

自然语言描述: a.判断该链表是否为空链表,如果是,输出长度0

b.如果不是空链表,新建立一个temp指针,初始化整形数n为0

c.将temp指针指向头结点

d.判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return n

e.使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n 代码描述: template int LinkList::GetLength()//分析链表长度 {

} Node * p = front;int i=0;while(p){

} return i-1;p = p->next;i++;4 程序运行结果

4.1主函数流程图

4.2程序运行框图

实验心得

1.调试时出现的问题及解决的方法

在编写按值查找函数时,由于没有处理好指针类型的原因,导致指针无法正常返回,屡屡报错。最后意识到c++没有指针强制类型的转换机制,经过细致检查后才改正错误使得程序正常运行。2.心得体会

了解了单链表的基本的操作函数实现,对链式存储结构有了较好的认识 3.下一步的改进

可以增加完善报错机制,增强程序的健壮性

完整源代码

#include using namespace std;

template struct Node {

};

template class LinkList { public:

};

//template //LinkList::LinkList(T a[], int n)//头插法建立 LinkList(){ front = new Node;front->next = NULL;}//无参构造函数 LinkList(T a[],int n);//构造函数 void Insert(int i,T x);//插入函数 T Delete(int i);//删除函数

Node* Get(int i);//查找第几个的元素,返回的是该元素的地址 int Locate(T x);//定位某元素 int GetLength();//分析链表长度 ~LinkList();//析构函数 void PrintList();//打印链表 Node * front;T data;Node * next;private: //{ // // // // // // // // // //}

template LinkList::LinkList(T a[], int n)//尾插法建立 {

}

template LinkList::~LinkList()//析构函数,销毁链表 {

}

template void LinkList::PrintList()//打印链表 { Node * p = front;while(p){

} front = p;p = p->next;delete front;front = new Node;front->next=NULL;Node * r = front;for(int i=0;i

} Node * s = new Node;s->data = a[i];s->next = r->next;r->next= s;r=s;front = new Node;front->next = NULL;for(int i=n-1;i>=0;i--){

} Node* s = new Node;s->data = a[i];s->next = front->next;front->next = s;

} Node * p = front->next;while(p){

} cout<data<<;p = p->next;

template Node* LinkList::Get(int i)//按位查找 {

}

template int LinkList::Locate(T x)//按值查找 {

} Node * p = front->next;int j = 1;while(p){

} return-1;if(p->data == x)return j;else

{ } p = p->next;

j++;Node * p = front;int j=0;while(p){

} if(!p)throw“查找位置非法”;else

return p;if(j

} else break;p = p->next;j++;

template void LinkList::Insert(int i,T x)//插入函数 {

}

template T LinkList::Delete(int i)//删除函数 {

}

template int LinkList::GetLength()//分析链表长度 {

}

void main(){ Node * p = front;int i=0;while(p){

} return i-1;p = p->next;i++;Node *p = Get(i-1);Node *q = p->next;p->next = q->next;delete q;return x;Node * p = Get(i-1);if(p){

} else throw“插入位置非法”;Node * s = new Node;s->data = x;s->next = p->next;p->next = s;

T x=q->data;

上一篇:部门职能职责表下一篇:2024届毕业论文(设计)答辩流程