数据结构实验教案(通用7篇)
数据结构实验教案 篇1
第一次实验 线性表
(一)实验目的和要求:
1.熟悉VC集成环境
2.会定义线性表的顺序结构和链式结构
3.熟悉对线性表的基本操作,如插入、删除等
(二)实验内容和原理或涉及的知识点(综合性实验):
自己编写程序实现线性表的建立、插入、删除等功能。
写出线性表、顺序表、链表的定义,简单写出主要算法的思路。
(三)实验条件:安装有VC的计算机
(四)实验设计方案
设计的顺序表算法有: 1.初始化顺序表 2.顺序表的插入操作 3.顺序表的删除操作 设计的链表算法有: 1.建立链表
2.链表的插入操作 3.链表的删除操作 4.链表数据元素的访问
(五)实验过程、数据和实验结果记录
程序代码(略)
实验过程中输入/输出数据、程序运行结果的记录。(一定要有!)
第二次实验 栈和队列
(一)实验目的和要求:
1.熟练掌握栈和队列的结构,以及这种数据结构的特点 2.会定义顺序栈、循环队列,能实现栈、队列的基本操作 3.会利用栈解决典型问题,如数制转换等
(二)实验内容和原理或涉及的知识点(综合性实验):
自己编写程序实现栈(或者队列)的各种基本操作,如初始化、入栈、出栈、判断栈是否为空等
写出栈的定义,简单写出主要算法的思路。
(三)实验条件:安装有VC的计算机
(四)实验设计方案
设计的算法有: 1.初始化栈 2.入栈 3.出栈
4.判断栈是否为空 5.十进制转换为八进制
(五)实验过程、数据和实验结果记录
程序代码(略)
实验过程中输入/输出数据、程序运行结果的记录。(一定要有!)
第三次实验 二叉树
(一)实验目的和要求:
1.熟练掌握二叉树的结构,以及这种数据结构的特点 2.会定义二叉树的链式存储结构
3.能实现二叉树的建立、遍历等功能,需要完成先序遍历、中序遍历和后序遍历递归算法
(二)实验内容和原理或涉及的知识点(综合性实验):
自己编写程序实现二叉树的各种基本操作,如二叉树的建立(头插法或者尾插法),遍历等 写出二叉树的定义,简单写出主要算法的思路。
(三)实验条件:安装有VC的计算机
(四)实验设计方案
设计的算法有: 1.递归建立二叉树 2.先序遍历二叉树 3.中序遍历二叉树 4.后序遍历二叉树
(五)实验过程、数据和实验结果记录
程序代码(略)
实验过程中输入/输出数据、程序运行结果的记录。(一定要有!)
第四次实验
查找
(一)实验目的和要求:
1.熟练掌握查找算法的基本思想,以及算法的适用条件
2.会定义静态查找表的顺序结构,能实现顺序查找、二分查找
(二)实验内容和原理或涉及的知识点(综合性实验):
自己编写程序实现顺序查找、二分查找。
写出静态查找表的定义,简单写出主要算法的思路。
(三)实验条件:安装有VC的计算机
(四)实验设计方案
设计的算法有: 1.建立静态查找表 2.顺序查找
3.建立有序的静态查找表 4.二分查找
(五)实验过程、数据和实验结果记录
程序代码(略)
实验过程中输入/输出数据、程序运行结果的记录。(一定要有!)
数据结构实验教案 篇2
扬州话是江淮官话的代表方言, 她的存在至少也有三、四百年的历史了。方言学上的“扬州话”一般指扬州城区及毗邻的双桥、城东等乡村的方言, 扬州四乡又称其为“街上话”。它曾经是明朝时期的官话, 至今还有很多古汉语词汇, 以及一些生动的、有意思的口头语。以扬州方言为载体的曲艺有扬州清曲、扬州评剧、扬剧等。这些曲艺已经被列入国家非物质文化遗产。而广义上的扬州话还包括邗江全境20多个乡镇以及仪征北部数乡镇的方言。地级扬州市所辖县的高邮、仪征、宝应等方言, 通常不将其看作扬州方言来研究。本次实验主要是调查扬州话单字字调的发音情况。
1.实验材料和过程
1.1实验目的
(1) 学会独立完成扬州方言单字调的实验研究, 熟悉整个实验的步骤, 运用相应的仪器和软件, 得到声调数据结果, 与传统方言数据进行比较。
(2) 用学习到的声调理论知识将实验数据进行分析讨论, 能够在实际的操作中掌握理论。
(3) 学会编制录音底本, 选取有效的调查字表, 合适的发音人。
(4) 自主完成使用Audition软件录制方言单字调的过程, 在不断调试后, 获取有效音频文档。
(5) 在前次实验的基础之上, 对自己完成的录音文档用Praat软件进行标注和提取数据, 对声调承载段问题有更深入的认识。
(6) 利用Excel表格得出的数据结果描绘出扬州方言声调格局图, 比对传统值和老师实验值的出入, 找出自己实验问题在哪里。
1.2实验准备
1.2.1调查点
(1) 调查点:江苏省扬州市维扬区
(2) 扬州市东经:119°26北纬度:32°24′
(3) 扬州市市区人口 (不算下级单位) :100万左右
(4) 扬州市民族和其人口:90%以上是汉族, 同时有少数各族人民。
(5) 扬州市少数民族语言:无
(6) 方言种类:江淮官话洪巢片扬州话
(7) 方言艺术:扬剧、扬州评话、扬州清曲
1.2.2发音人
(1) 姓名:滕惟茜 (2) 性别:女 (3) 民族:汉
(4) 出生年月:1965年6月 (5) 出生地:扬州市广陵区
(6) 主要经历:一直在扬州生活与工作
(7) 文化程度:高中 (8) 职业:会计
(9) 会说的话:扬州话、不标准普通话
(10) 现在主要说什么话:扬州话
(11) 父亲是哪里人:扬州人
(12) 母亲是哪里人:泰州黄桥人
1.2.3调查人
(1) 姓名:滕菲 (2) 性别:女
(3) 单位:南京师范大学文学院
1.2.4调查人
(1) 调查时间:2012年1月30号
(2) 调查地点:扬州市五台山医院特别检查室
(3) 背景噪音:较为安静, 但笔记本不插电源时本身有声音
1.2.5调查人
(1) 调查字表的确定过程
根据资料的查找, 确定了扬州方言共有五个调类, 分别是阴平、阳平、上声、去声和入声。
以方言声调采录底本为参照, 单字每个调类取12个字, 尽量避免送气音、多音字和在日常生活中不能单说的字。
让发音人检查字表, 检查有没有读音不准确的字, 进行剔除重选, 最终选定调查字表如下:
1.3录音
阴1平.3.1器材方阳案:平笔记本电脑上+声简易录音话去筒声入声
(1) 笔记本电脑:东芝 (M833) —1G内存、Window7系统
(2) 话筒:简易有底座的话筒
1.1.3.2准备工作
(1) 场所:较为安静的办公室, 关闭门窗, 关掉所有交流电源, 包括笔记本电脑的话筒。
(2) 话筒:使用时, 嘴巴不能正对话筒, 要与话筒成斜角, 保持固定的3~5cm, 防止“扑麦”和“爆音”。
(3) 提示和方式:事先和发音人明确“开始录音”和“停止录音”的手势。
(4) 试音:为了让录音人熟悉录音的过程和要求、测试录音效果, 在正式录音前, 让发音人试录部分调查单字调。
1.3.3录音软件
阴平本次调查运阳用平了老师推荐上声的Adobe Au去di声tion3.0版录入音声和音频处理软件。
点12.和34音986频484处43理软2.2件89。71356992.3136445782.34099310032.3738757367点22.345311.439.0483基本2.2录85音193参49数092.30340897892.34233435182.371964342点32.3334 (2616) 25声3道2:.2单81声530道94772.29721084672.3491326522.3722301751点42.3187 (026) 27采8样2.率2:9247411809508H5z2.29315093472.35675664042.3702818893点52.2984 (3632) 34分7辨2.率3:1416669位15082.28814919492.36595672.3681207176点62.2782 (4642) 64音2频2.格35式79:95W1i5n6d3ow2s.P28C3M30 (8*3.3w9a6v) 2.37394561482.3697722777点72.256411.816.033.75录2.音39过549程685412.27452097592.37464350852.3678108741点82.2399 (2410) 68选7择2“.4文07件66”36—55“2新建2.”26选811择37相56应的2.3参669数18和111保1存2文.36件87的688824点92.类21型608—911按14下红2.4色10按255钮032开5始2.录25音71, 882查996看背2.3景63噪780音83和81观2察.36录89音265855点102.人18发86音498后76的波2.4形14, 27及09时808进行2.调252整45。352432.36553438632.367250869
(2) 试音之后, 开始正式录音。按照讲好的手势开始, 因为字较多, 所以四个字一录, 避免发音人因喘气或呼气造成的失败。
(3) 录完之后, 按照声调类别进行归类, 用“混合型粘贴”将每个调类的字剪切在一起, 形成一个整的12个发音字的文件。
(4) 全部结束后进行试听, 查看背景噪音—选中一段无用的过渡段—“效果”—“修复”—“降噪器”, 选择相应的参数, FFT6000, 衰减12DB—“获取特性”—“确定”—再次进入降噪器—“波形全选”—“确定”—二次试听, 达到要求后, 分别保存在F盘的temp文件的五个调类文件中 (文件类型是
(5) 由于第一次操作不熟练, 在进行提取基频时, 发现音频的波形出现问题, 于是再次录音, 但这次的背景没有上次安静, 电平为-40DB———-42DB, 经过降噪之后 (12DB) , 为-52DB———-57DB, 听时仍会感到电脑电池运行的声音。
1.4提取基频和做声调格局图
1.4.1工具:
Praat音频处理软件。
1.4.2提取基频:
(1) 打开声音文件, 由于电脑运行速度慢, 没有将五个声音文件粘贴在一起, 而是分调类依次打开和修改基频。
(2) 选中声音文件Sound—Periodicity—Topitch在对话框中修改:女声:最小Pitchfloor (Hz) :75.0, 最大Pitchceiling (Hz) :600.0, 生成Pitch文件。打开Pitch, 发现呈现的声调再次范围之类, 就不需要再修改Periodicity。
(3) 选中Pitch—Edit进行调整, 去除野点, 补足空余段。首先选中一个声调, 记住其图形特征, 按in不断放大, 直到删除野点时能够不影响其他的声调段, 然后选中要删的点, 选Selection-Unvoice去除野点。而补足空余时, 只能在有数字显示的地方补。
(4) 做好之后, 选中Pitch中的Down to pitch tier, 生成pitch tier文件, 保存在C盘Temp文件夹中。
1.4.3标注文件:
(1) 选中Sund—Annotate—To TextGrid修改All tier name Mary John (说明标注有两层内容) , 下面的不改, 生成TextGrid。
(2) 将Sound和TextGrid关联起来, 点击Edit进行标注。
(3) 我选择的方法是先选中一个字的读音, 将其放大到能看清蓝线的每一点, 逐字进行标注。
标注第一层音节时, 选取用拼音表示, 因为标汉字时, 发现软件有不识别的情况。
标注时, 发现听感和图像显示有较大区别, 按图像说, 有蓝线的地方才应该有声, 但放大到一定限度时, 实际听到的超过蓝线范围, 尤其是遇到送气的辅音。笔者没有选择完全按照图像显示, 而是根据听感, 选择清晰地一段, 因为音节的标注对于最后数据处理没有影响。
标注第二层声调承载段时, 一开始用“主要元音及过渡段”法, 但是多次尝试之后发现, 听耳很难分辨出, 尤其是有韵尾或多音节的情况, 所以最终选择“韵母段”, 同时仍然处理了“弯头”、“降尾”。在标注时, 选择用数字1-7来表示声调, 奇数为阴调, 偶数为阳调, 分别为:阴平-1、阳平-2、上声-3、去声-5、入声-7。
说明:在标注入声时发现, “百”、“读”在蓝线后的一段上有较为清晰的声调出现, 如果不选, 声音显得无力 (后补录, 发现还是这样, 可能是发音人的问题) , 就将后面一段清晰地声音也算在范围之类, 可能对数据有影响。最终T值里, 入声的值有几个基频点不到4, 其余的在4-5之间, 但都偏向4, 就将入值归为4, 与传统值和刘利李老师的实验值5不同。
标注完成之后, 保存文件。
1.4.4提取基频值:
点击Control-Open Praat Script选择脚本:提取音节或声韵母的音高数据, 运行Run将标注层数设为2, 将每个样本提取的数据数设为10。
1.4.5用Excel表格进行数据分析和做声调格局图:
(1) 新建Excel表格, 导入外部数据, 数据为来自C盘temp文件夹中的Pitch (txt) 文档。
(2) 复制数据到Sheet2, 整理数据, 标注顺序排序, 留下标注内容、时长和各基频点值。
(average) 和对数值 (log10) 和标准差 (stdev) 。
(4) 利用Excel表的“公式”, 选取所有对数值中得最大值和最小值阴 (平设最大值刚为、a专, 、尊最、丁小、边值、安为、b开, 、粗对、昏数、商值、三变、飞量为x) 。
(5) 根阳平据公式T=穷 (、l床gx、才-l、g平b、) 寒, 、鹅计、娘算、人出、龙相、难应、麻的、云五度值, 并保
上声纸、l走ga、短-l、g草b、好、受、五、女、老、武、买、有阴平刚、专、尊、丁、边、安、开、粗、昏、商、三、飞
留两位小去数声。帐、正、对、汉、送、放、大、数、饭、岸、漏、用
阳平穷、床、才、平、寒、鹅、娘、人、龙、难、麻、云
(6) 将入声计算出来曲的、出五、突度、各值、桌绘、百制、尺成、拍折、药线、杂图、读, 、修舌改刻度。
上声纸、走、短、草、好、受、五、女、老、武、买、有
要检查数据是否合格, 就要算出基频点的标准差, 单字调<或=25时, 说明数据是可靠的。在本次试验中, 所有数据只有阴平的点9为25.96和点10的标准差为28.88, 其余都合格。
点1-0121
2.1.1.1与已有实验值相比
(1) 阴平和上声的调值完全一样。
(2) 阳平都显示为升调, 上升的幅度大致相同, 但此实验值略高于已有的实验值。
(3) 去声和入声都是高平调, 但此实验值略低。
(4) 相比较, 二次实验值虽有具体数据的不同, 但显示的调型和声拱特征是一样, 此次实验的数据具有可采纳性。
2.1.1.2与传统值 (听感描写) 的相比
对于扬州方言单字调的研究成果, 主要记录在《江苏省志·方言志》与《扬州方言词典中》, 也就是所列出的传统值。实验结果与听感描写基本一致, 但也存在差异:
(1) 阴平的实验结果是41, 但听感描写分别是21和11, 存在较大差异。实验值41是一个全降调, 传统值21也是降调, 数据的不同可能与发音人有关, 同时听觉毕竟只是一个大概感知, 与数据计算会有一定的差别。但另一传统值11, 就完全不同, 这是个低平调, 而不是降调, 可能作为本地人听本地音, 又受到普通话阴平55值的影响, 觉得扬州方言的阴平发音与之相似, 只是低了个调。但两次实验值和传统值1都
认为是降调, 只是调域不同, 那11这个值就有待斟酌。
(2) 阳平的描写较为一致, 都是一个升幅不大的声调实验值与传统值分别是35、24和34、35, 没有多大出入。
(3) 上声的实验值是32, 传统值是42, 只是调域起点的不一样, 都是一个中降调, 结果基本一致。
(4) 去声的已有实验值和传统听感值都是55, 一个高平调。本次实验结果是44, 也是一个高平调, 但发音较低, 可能与发音人本身有关, 但并不与55值冲突。
(5) 入声已有实验值是5, 本次实验和传统值是4, 都是短促的高平调, 同时听感上都能感到短促的收缩。
综上, 实验的结果与听感描写是相一致的, 不同大多是具体数值的差异, 调类、调型也是相同的。可见实验的手段是对传统语音学“口说耳辩”的补充, 利于更加细致的比较研究。
2.1.1.3声调的声学空间
“每一种声调语言或者方言, 都具有一个特定的声调格局。声调格局是由该语言或方言中全部单字调所构成的格局, 是各种声调变化的基础形式。而每一种声调在声调格局中不仅是一条曲线, 而且是一条的带状的声学空间。可以采用带状的包络线来表示声调调位的声学空间。只要一条声调曲线位于这个声学空间中, 就符合这个声调的特征, 就不会为其他的声调。”虽然两次实验值有数据差异, 与传统值也有差别, 但从声调的声学空间来看, 是在范围之内, 也反过来证明了声学空间的存在。
2.2声调承载段讨论
声调承载段的认识发端于声调与音段的认识关系。中国语音学界主要有三说:1.音节说:声调由整个音节承载;2.带音说声调由音节的带音部分承载, 包括带音声母;3.韵母说:声调附着于音节的韵母之上。1995-1996林茂灿的讲话提出“主要元音及过渡段”是声调的承载段。从语图和“弯头”、“降尾”来看, 这种说法更为准确, 但实际操作困难。到底哪里是主要元音, 切分不易, 所以本次实验采取了“韵母段”的做法。在实际操作中, 听感与语图会有差异, 本人将窄带语图不断放大, 但有时还是很难分清, 采取了往韵母段靠的方法, 保证承载段的稳定性。最后结合语图, 处理“弯头”和“降尾”。
原始数据表格:
去声220.44222.98220.93221.10222.32218.86218.15219.44219.70219.92
参考文献
[1]宋益丹.南京方言声调实验研究, 2006.
[2]丁琳.姜堰方言声调实验研究, 2005.
[3]刘利李.江淮方言声调实验研究和折度分析[M].巴蜀书社, 2007.
[4]石峰.语音格局——语音学与音系学的交汇点[M].商务印书馆, 2008.
[5]南开大学语言研究所.语音学实验研究报告写作规范 (草案) [J].南开语言学刊, 2009 (1) .
[6]刘俐李.汉语声调的曲拱特征和降势音高[J].中国语文, 2005 (3) .
《数据结构实验》教学探析 篇3
关键词:数据结构;实验;编程;教学
中图分类号:TP3-4 文献标识码:A文章编号:1007-9599 (2011) 06-0000-01
Teaching Research on Data Structure Experiment
Zhang Xiujian
(Guangzhou University Sontan Collehe,Guangzhou 511370,China)
Abstract:Data structure is a course that emphasizes that exercise of logical thinking and programming ideas.In this paper,we argue that the appropriate experimental program and integration of software engineering can improve student’s innovative ability.
Keyword:Data Structure;Experiment;Programming;Teaching
《数据结构》,是一门重要的理论学科。通过调研看出,该科目在各个院校的实验教学情况存在较大差异。学生学习理解过程缓慢,教师教学也不能得心应手,尤其是实验课,由于部分学生对编程语言掌握不熟练,实验内容抽象,而有较大畏难情绪,甚至不参加实验课。虽然曾经有些教师参考了任务驱动、实例教学等方法,但过于强调某种教法,也会影响教学效果。所以,该课程宜结合课程特点设计教学,切实通过贴近于实际的方法传道授业,结合实验落实教学效果是非常重要的。
一、数据结构课程实验教学中问题所在
(一)实验课时欠缺。有的学校压缩实验时间,让位于理论教学,这对学习效果的落实来说是本末倒置。没有足够的实验课时,学生就无法把理论知识加以系统地整理,进而在实验中消化吸收。
(二)综合性、创新性实验科目欠缺,系统性不强。开设的数据结构的实验课程中,虽然安排了相关知识点的实例,但是对设计的创新性和综合性上有待提高,要加强知识点的综合运作。
(三)没有很好地结合课堂教学和实验教学。作为一门比较抽象的理论教学课,尤其要重视课堂和实验教学相结合。实验中要突出该课程的实践性,教学中要注重理论和实践的结合。现在,不少教师只重视知识的灌输,在实验中任务不明确,要求不明晰,让学生在实验中迷失了对理论的进一步实践的方向。
二、实验教学的改革探索
(一)教学模式的改变。基于数据结构课程理论难于理解的特点,要突出实验课的效果,要注重“课堂.一章的基础性实验.综合实验”相结合的框架。注意从逻辑机构到存储结构,再到实现基本算法,继而具体应用的方法,一以贯之地落实到数据结构教学中去。算法的讲授要先分析算法,再运用编程语言演练算法,最后进一步分析算法。如能采用多媒体演示算法的步骤,会使学生更加清晰地理解。课堂教学始终要把应用的要求作为做种目标,辅以实验训练,加强学生动手编程和自我创新的能力。
(二)基础实验环节要重视。实验环节要让学生进一步理解数据结构的特点,明确相关概念,熟练各种基本算法的实现。枯燥的理论讲述的再多,也不如配合实验让学生一练,所以教学要重视基础实验环节。要想获得扎实的教学效果,教师要提供实验编程语言,Turbo C、Visual C++、Delphi等都可以。根据教材确定实验方案,明确实验目的、内容、要点和必备注意事项,最后安排几个演练题目,比如矩阵的遍历、数据的折半查找等。实验课程要贴近学生的编程水平,不可偏离太过。实验中,学生有章可循,对要点有较强的针对性,实验效率就会大大提高,使学生真正能举一反三。
(三)课程实验要理论应用相结合。实验要注意结合原理和应用,让学生在解决实际问题时学会调用学过的知识点,养成动手练习语言编程的习惯,所以,这个层面的综合实验要求要高于普通的课下练习和基础实验,更贴近于应用。平时虽然侧重练习简单的算法程序,但综合实验课是软件设计的高级训练阶段,融合了问题的分析,系统结构设计、操作界面设计、编程技能技巧,是软件设计的系统工程。教师分阶段拟定数据机构在实践中的各种应用,比如:汉诺塔问题、约涩夫环问题、Huffman Coding方式、班级信息管理系统等,把任务分配给学生,让学生组织课题公关。课题的结题要提供课题表述、基本要求、实验数据、实现结果和关键实现步骤等内容,这能协助学生破题解题,以免形成错误的认识,同时也讲解了程序设计的基本路线,确保实验目标的实现。最后每个课题组都集中展示实验过程接结果。试试证明,这样的实验环节,综合了数据结构知识、编程语言技能和软件工程思想,让学生系统地理解各门课程的联系,融合相关专业课的精髓,锻炼了学生的团队合作互助精神,提高了组织能力和管理水平
三、重点组织好教学实验的各个环节
(一)实验题目的设计。鉴于实验环节教学时间的限制,学生的编程基础和技能较为薄弱,所以,设计和拟定合适的实验题目尤为重要。实践题目应该由易到难循序渐进:
1.常用算法练习。主要讲解各章节知识点,深入贯彻算法理论的理解;2.基础性应用练习。主要让学生针对单一的数据结构解决应用难题,其难度中等;3.综合应用题目练习。要涵盖多个章节的内容,系统性强,难度较高,可以组织学生成立课题组,在课外实验环节共同研讨解决,再集中展示。课题的设计要注意:(1)常用算法的练习要有一定代表性,重点练习各个章节的知识点,难度较小,目的在于理论知识的掌握。课堂教学要和实验环节对应,学生在试验中重点演练课上讲授的内容。(2)基础性应用练习难度要适中,既要带动基础薄弱的学生,又要注意发挥基础好的学生的能动性,可以加以延伸,或是鼓励提供多种解决方法,进行不同思路的性能的比较,让各个层面的学生都能参与实验。(3)综合应用练习题不宜太难,但要引起学生的兴趣,宜于结合实际中的事物或应用系统,让学生宜于接受和理解,这样才能促进学生的积极性。
(二)实验环境的搭建。现在很多学校选取谭浩强教授出版的《数据结构(c语言版)》作为教材,应用C语言进行数据结构的设计语言,用TC搭建实验环境。而在实际教学中,应用C语言讲解数据结构常常对算法设计和实现上较为突出,对数据结构的系统性容易忽视。如果用C++进行数据结构的实验练习,可以注重其整体性和系统性,先定义数据结构的类,再分析其逻辑特性,然后把存储结构延伸到算法的实现中去,能帮助学生构建数据机构的概念。
(三)实验过程的组织与实施。实验中可以采取学生分组、一人负责的机制进行实验。提倡互动探讨和交流,既能让学生接触更多的实验题目,也能提高学生的团队合作精神。
(四)实验结果的检验和考核。对实验结果,教师要辅以必备的检查来进行督导。对于实验报告的书面汇报,要设计题目、要求、步骤、结构、程序代码和改进方法,以及最后的体会等。教师通过实验报告书可以详细了解学生的实验情况,进而发现共性的问题集中解决。
(五)实验问题的总结与弥补。通过实验,教师对于学生学习中存在的问题要进行系统总结和分析加以更正,有些不良的编程习惯,教师要着重强调。
四、结束语
《数据结构》的实验课注重学生动手能力的培养,强调创新思维的养成,通过实验,结合应用案例,能够进一步提高该课程的教学质量,加深学生对知识点的理解,具有积极的现实意义。
参考文献:
[1]程满玲.数据结构课程教学模式改革的探索与研究[J].武汉商业服务学院学报,2007,3
数据结构实验报告 篇4
实验(实习)名称数据结构实验(实习)日期 2011-11-2得分指导教师周素萍
系公共管理系专业信息管理与信息系统年级10级班次1姓名常玲学号2010230700
3实验一顺序表的基本操作及C语言实现
【实验目的】
1、顺序表的基本操作及 C 语言实现
【实验要求】
1、用 C 语言建立自己的线性表结构的程序库,实现顺序表的基本操作。
2、对线性表表示的集合,集合数据由用户从键盘输入(数据类型为整型),建立相应的顺序表,且使得数据按从小到大的顺序存放,将两个集合的并的结果存储在一个新的线性表集合中,并输出。
【实验内容】
1、根据教材定义的顺序表机构,用 C 语言实现顺序表结构的创建、插入、删除、查找等操作;
2、利用上述顺序表操作实现如下程序:建立两个顺序表表示的集合(集合中无重
复的元素),并求这样的两个集合的并。
【实验结果】
[实验数据、结果、遇到的问题及解决]
一. Status InsertOrderList(SqList &va,ElemType x)
{
}
二. Status DeleteK(SqList &a,int i,int k)
{//在非递减的顺序表va中插入元素x并使其仍成为顺序表的算法 int i;if(va.length==va.listsize)return(OVERFLOW);for(i=va.length;i>0,x } //注意i的编号从0开始 int j;if(i<0||i>a.length-1||k<0||k>a.length-i)return INFEASIBLE;for(j=0;j<=k;j++)a.elem[j+i]=a.elem[j+i+k];a.length=a.length-k;return OK; 三.// 将合并逆置后的结果放在C表中,并删除B表 Status ListMergeOppose_L(LinkList &A,LinkList &B,LinkList &C) { LinkList pa,pb,qa,qb;pa=A;pb=B;qa=pa;qb=pb;// 保存pa的前驱指针 // 保存pb的前驱指针 pa=pa->next;pb=pb->next;A->next=NULL;C=A;while(pa&&pb){} while(pa){} qa=pa;pa=pa->next;qa->next=A->next;A->next=qa;if(pa->data data){} else{} qb=pb;pb=pb->next;qb->next=A->next;//将当前最小结点插入A表表头 A->next=qb;qa=pa;pa=pa->next;qa->next=A->next;//将当前最小结点插入A表表头 A->next=qa; } } pb=B;free(pb);return OK;qb=pb;pb=pb->next;qb->next=A->next;A->next=qb; 顺序表就是把线性表的元素存储在数组中,元素之间的关系直接通过相邻元素的位置来表达。 优点:简单,数据元素的提取速度快; 缺点:(1)静态存储,无法预知问题规模的大小,可能空间不足,或浪费存储空间;(2)插入元素和删除元素时间复杂度高——O(n) 求两个集合的并集 小组成员:xxxxxxxx日期:xxxxxxxx 一、需求分析(xxx) 1.链队列 1)在本演示程序中,首先要链队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。最后销毁队列,释放空间。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“销毁队列”“清空队列”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到链队列 1输出队列长度 2元素入队 3元素出队 4销毁队列 5清空队列 6对头元素 7退出链队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”“销毁队列”“清空队列”等操作。2.顺序队列 1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,它只允许在表的一端进行插入,而在另一端删除元素,允许插入的一段叫队尾,允许删除的一端则为对头,接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到顺序队列 1入队 2出队 3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。3循环队列 1)在本演示程序中,首先要顺序队列添加一个头结点,并判断队列是否为空,初始化建空队列时,令front=rear=0,每当插入新的队列尾元素时,“尾指针增1”;每当删除队列头元素时,“头指针增1”。接着访问队列中所有元素,并输出,输出是每个元素之间用空格来完成。2)演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“欢迎来到链队列”“元素入队”“元素出队”“取得头结点”“输出显示”之后。由用户在键盘上输入演示程序中规定的运算命令,相应的运算数据和显示结果显示在其后。3)程序执行的命令包括: 欢迎来到循环队列 1入队 2出队 3判断是否为空 4取得头结点 5输出显示 6退出顺序队列 4)测试数据 入队 1 2 3 4 5 分别执行“元素入队”“元素出队”等操作。 二.概要设计(xxxx) ⒈ 为实现上述算法,需要顺序表的抽象数据类型,抽象数据类型定义如下: ADT Queue { 数据对象:D={ ai|ai∈ElemSet, i=1,2,3...,n, n>=0 } 数据关系: R={ |ai-1,ai∈D,i=2,...,n } 基本操作: InitQueue(&Q)操作结果:构造一个空队列。DestroyQueue(&Q)初始条件:队列Q已存在。 操作结果:队列Q已被销毁。ClearQueue(&Q)初始条件:队列Q已存在。 操作结果:将Q清为空队列。QueueEmpty(Q)初始条件:队列Q已存在。 操作结果:若Q为空队列,则返回TRUE,否则FALSE。QueueLength(Q)初始条件:队列Q已存在。 操作结果:返回Q元素的个数,即队列的长度。GetHead(Q,&e)初始条件:Q为非空队列。 操作结果:用e返回Q的队头元素。EnQueue(&Q,e)初始条件:队列Q已存在。 操作结果:插入e返回Q的新的队尾元素。DeQueue(&Q,&e)初始条件:Q为非空队列。 操作结果:删除Q的队头元素,并用e返回其值。}ADT Queue 2.单链队列 typedefstructQNode { QElemType;structQNode *next;//指针域 }QNode,*QueuePtr;Typedefstruct{ QueuePtr front;QueuePtr rear;}LinkQueue;Status InitQueue(LinkQueue&Q)//构造一个空队列。 Status DestroyQueue(LinkQueue&Q)//销毁队列Q,Q不存在。 Status ClearQueue(LinkQueue&Q)//将Q清为空队列。 Status QueueEmpty(LinkQueueQ)//若Q为空队列,则返回TRUE,否则FALSE。intQueueLength(LinkQueueQ)//返回Q元素的个数,即队列的长度。 Status GetHead(LinkQueueQ,QElemType&e)//若队列不为空,则用e返回Q的队头元素,并返回OK;否则返回ERROR。 Status EnQueue(LinkQueue&Q,QElemType e)//插入e返回Q的新的队尾元素。 Status DeQueue(LinkQueue&Q,QElemType&e)//若队列不空,则删除Q的队头元素,并用e返回其值,并返回OK;否则返回ERROR。 三.详细设计(xxx) 1.顺序队列的实现和运算 1)元素的类型 typedefstruct { Datatypedata[MAXSIZE];intfront,rear;}Squeue;2)空的队列的构造 void InitSqueue(Squeue *p)/*初始化队列*/ { p->front=0;p->rear=0;} 3)元素的入队 int Ensqueue1(Squeue1 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} 4)元素的出队 int DeSqueue1(Squeue1 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->data[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 5)判断队列是否为空 int QueueEmpty1(Squeue1 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 6)队头元素的取值的算法 int Gethead1(Squeue1 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->data[q->front];return 1;} 7)遍历顺序队列的算法 void display1(Squeue1 q)//遍历顺序对列 { printf(“此队列数据为:n”);if(q.front==q.rear)printf(“此队列为空!”);else { while(q.front void InitQueue2(LinkQueue *q){ // 构造一个空队列Q q->front=q->rear=malloc(sizeof(QNode));if(!q->front)exit(1);q->front->next=NULL;} 2)元素的入队算法 void EnQueue2(LinkQueue *q, QElemType e)//将元素e进队 { QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));//创建新节点 if(!p)//如果内存分配成功 exit(1); p->data=e;//初始化新节点数据为e p->next=NULL; q->rear->next=p; q->rear=p;} 3)元素的出队的算法 int DeQueue2(LinkQueue *q,QElemType e)//队头结点出队,将出队的元素存入e { QueuePtr p;if(q->front==q->rear)//队列为空 return 0;p=q->front->next;//初始化temp为要出队的结点指针 if(q->front->next==q->rear)//要出队的结点为最后一个结点 q->rear=q->front;e=p->data;//要出队的数据元素为e q->front->next=p->next;//使下一个结点变为对头 free(p);//删除要出队的结点 return e;} 4)队列的长度算法 void QueueLength2(LinkQueue *q)//返回队列长度 { QueuePtr p;int i=0;p=q->front->next;while(p){ ++i; p=p->next;} printf(“链队列长度为:%dn”,i);} 5)队列的销毁 void DestroyQueue2(LinkQueue *q){ while(q->front){ q->rear=q->front->next; free(q->front); q->front=q->rear; if(!q->rear) free(q->rear);} free(q->front);} 6)队列的输出算法 void output2(LinkQueue *q)//输出队列 { QueuePtr p;p=q->front->next;printf(“链队列元素依次为:”);while(p){ printf(“%d->”,p->data); p=p->next;} printf(“n”);} 7)队列的清空的算法 void Clear2(LinkQueue *q)//清空队列 { QueuePtr temp=q->front->next;while(temp){ QueuePtrtp=temp; temp=temp->next; free(tp);} temp=q->front; q->front=q->rear=NULL;free(temp);} 8)返回对头元素的算法 int GetHead2(LinkQueue *q, int *e)//返回对头结点元素,存入e { if(q->front==q->rear) return 0;*e=q->front->next->data;return 1;} 3.循环队列的实现和运算 1)队列的初始化算法 void InitSqueue3(Squeue3 *p)/*初始化队列*/ { p->base=(Datatype *)malloc(sizeof(Datatype)* MAXSIZE);p->front=0;p->rear=0;} 2)入队的算法 int Ensqueue3(Squeue3 *q, Datatype e)/*入队*/ { if((q->rear+1)% MAXSIZE == q->front){ printf(“n队列已满n”);return 0;} else q->base[q->rear]=e;/*将接收到得值付给队尾所指的节点*/ q->rear=(q->rear+1)% MAXSIZE;/*队尾向后移一位完成入队*/ return 1;} 3)出队的算法 int DeSqueue3(Squeue3 *q,Datatype *e)/*出队*/ { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} *e=q->base[q->front];q->front=(q->front+1)%MAXSIZE;return 1;} 4判断队列是否为空的算法 int QueueEmpty3(Squeue3 q)// 判断是否为空 { if(q.front==q.rear)return 1;else return 0;} 5)对头元素的返还的算法 int Gethead3(Squeue3 *q,Datatype *e)// 取对头元素 { if(q->front==q->rear){ printf(“队列已空,无法出队!”);return 0;} else *e=q->base[q->front];return 1;} 6)遍历循环队列的算法 void display3(Squeue3 *q)//遍历循环对列 { int tail;tail=q->front;printf(“此队列数据为:n”);if(q->front==q->rear)printf(“此队列为空!”);else { while(tail!=q->rear){ printf(“%dt”, q->base[tail]);tail=(tail+1)%MAXSIZE;} printf(“n”);} } 4.主函数的算法 void main(){ int choice;Datatype e1;int i1,a1,x1,s1,j1;//顺序队列定义的量 int e2,i2,n2,s2,a2;//链队列定义的量 int i3,a3,x3,s3,j3;//循环队列定义的量 Datatype e3; Squeue1 Q1; //******************************* LinkQueue q; //******************************** Squeue3 Q; //**************************** choice=-1;Begin();while(choice!=0){ scanf(“%d”,&choice);switch(choice){ case 1://顺序队列 { system(“cls”);InitSqueue1(&Q1);printf(“创建队列完成!n”);printf(“请输入数据个数j1=”);scanf(“%d”,&j1);for(i1=1;i1<=j1;i1++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf(“请输入第%d个数据:”,i1);scanf(“%d”,&a1);Ensqueue1(&Q1,a1); } printf(“对头为:%dn”,Q1.data[Q1.front]);printf(“队尾为:%dn”,Q1.data[Q1.front+j1-1]);display1(Q1);s1=-1;start1();while(s1!=0) { scanf(“%d”,&s1);switch(s1) { case 0: system(“cls”); choice=-1; Begin(); break;case 1: { system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x1);Ensqueue1(&Q1,x1);display1(Q1); s1=-1; start1();break; } case 2: { system(“cls”);DeSqueue1(&Q1,&e1);display1(Q1);s1=-1; start1();break; } case 3: { system(“cls”);if(QueueEmpty1(Q1))printf(“此队列为空!n”);else printf(“此队列不为空!n”); } s1=-1; start1();break;case 4: { system(“cls”); Gethead1(&Q1,&e1);printf(“对头元素为:%dn”,e1); s1=-1; start1();break; } case 5: { system(“cls”);display1(Q1);s1=-1; start1();break; } }//switch } //while }//case1 break;//************************************************* case 2: { system(“cls”); InitQueue2(&q);printf(“创建队列完成!n”);printf(“输入将建立链队列元素的个数:n2=”);scanf(“%d”,&n2);printf(“请输入队列的元素:n”);for(i2=1;i2<=n2;i2++) { printf(“请输入第%d个元素:”,i2); scanf(“%d”,&e2); EnQueue2(&q,e2); } a2=-1;start2();while(a2!=0) { scanf(“%d”,&a2); switch(a2) { case 1:system(“cls”); QueueLength2(&q); a2=-1;start2(); break; case 2:{ system(“cls”); printf(“请输入入队元素:”); scanf(“%d”,&e2);EnQueue2(&q,e2); output2(&q);a2=-1;start2(); }break; case 3: system(“cls”); e2=DeQueue2(&q,e2); output2(&q); printf(“出队元素为:%dn”,e2);a2=-1;start2(); break; case 4:DestroyQueue2(&q);printf(“队列已销毁!n”); a2=0;system(“cls”); choice=-1; Begin(); break; case 5: Clear2(&q);printf(“队列已清空n”); a2=0;system(“cls”); choice=-1; Begin(); break; case 6: system(“cls”);GetHead2(&q,&e2); printf(“队头元素为:%dn”,e2);s2=-1; start2(); break; case 0: system(“cls”); choice=-1; Begin(); break; }//switch }//while }//case2 break;//************************************************** case 3: { system(“cls”); InitSqueue3(&Q);printf(“创建队列完成!n”);printf(“请输入数据个数j3=”);scanf(“%d”,&j3);for(i3=1;i3<=j3;i3++)//输入的数据个数不要超过MAXSIZE,多了的部分没有插入队列 { printf(“请输入第%d个数据:”,i3);scanf(“%d”,&a3);Ensqueue3(&Q,a3); } printf(“对头为:%dn”,Q.base[Q.front]);printf(“队尾为:%dn”,Q.base[Q.front+j3-1]);display3(&Q);s3=-1;start3();while(s3!=0) { scanf(“%d”,&s3);switch(s3) { case 0: system(“cls”); choice=-1; Begin(); break;case 1: { system(“cls”);printf(“请输入入队元素:n ”);scanf(“%d”,&x3);Ensqueue3(&Q,x3);display3(&Q); s3=-1; start3();break; } case 2: { system(“cls”);DeSqueue3(&Q,&e3);display3(&Q);s3=-1; start3();break; } case 3: { system(“cls”);if(QueueEmpty3(Q))printf(“此队列为空!n”);else printf(“此队列不为空!n”); } s3=-1; start3();break;case 4: { system(“cls”); Gethead3(&Q,&e3);printf(“对头元素为:%dn”,e3); s3=-1; start3();break; } case 5: { system(“cls”);display3(&Q);s3=-1; start3();break; } }//switch } //while }//case 3 break; case 0: printf(“ 谢谢使用!!n”); break; //*************************** }//switch }//while }//main 四.调试分析(xxx) 顺序队列 1.编译并调试,运行程序。 2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。3.判断队列是否为空。队列是否为空的标志就是队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等。 4.队列满时候不能入队列,否则会出现溢出现象。即先要判断队列是否已经已满,因为队尾指针的最大值是MAXQSIZE,所以通过检查队尾指针rear是否等于MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。 5.在元素出队操作,先通过队头指针和队尾指针是否相等判断队列是否已空,空时不能操作,这是要注意的。 6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 7.本程序存在较多不足,如有问题,参考用户手册。 8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 链队列 1.编译并调试,运行程序。2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。 3.要注意设定一个在链队列添加一个头结点并令指针指向头结点。同时,删除不可以在最后面进行删除,但是插入可以最后一个进行插入,这点需要注意 4.需要分别指向队头和队尾的指针。 5.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 6.本程序存在较多不足,如有问题,参考用户手册。 7.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 循环队列 1.编译并调试,运行程序。 2.设计测试用例,分析测试结果,以验证所完成的系统是否达到预期效果。 3.为了避免顺序队列造成的“假溢出”现象,我们通常采用顺序循环队列实现队列的顺序存储。4.队头指针和对尾指针与队列元素之间关系和顺序队列一样,不变。5.先判断队列是否为空。就是看队头指针和队尾指针是否同时指向队列中的同一个位置,即队头指针和队尾指针是否相等,空时不能操作,这是要注意的。 6.在将元素插入到队列之前首先要判断队列是否已经已满,根据顺序循环队列队满条件front==(rear+1)%MAXQSIZE来判断队列是否已满。在删除队首元素时,应首先通过队头指针和队尾指针是否相等判断队列是否已空。 6.程序满足了本次试验的目的和任务要求,可以进行人机交互,在后来的程序中将会做些改进,以增强人机交互性。 7.本程序存在较多不足,如有问题,参考用户手册。 8.在程序语句中,原本使用了大量的生僻的函数名,经过改进,目前使用都是通俗易懂的函数名称,方便用户理解。 五、用户手册(xx)1.链队列 (1)本程序的运行环境为DOS操作系统,执行文件名为:j.exe.(2)进入演示程序后即显示文本方式的用户界面,输入元素1,2,3,4,5创建队列。 (3)根据提示,选择操作2执行元素入队操作。回车,输入入队元素0,回车,将0插入到队列中。 (4)选择操作3执行元素出队操作,回车,队首元素1出队。 (5)选择操作1执行输出队列长度操作,回车,输出队列长度为5.(6)选择操作5执行清空队列操作,回车,清空。 (7)选择操作6执行输出队头元素操作,回车,输出元素2。 2.顺序队列 (1)创建队列,输入数据 1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0 (3)选择操作2,执行出队操作。 队首元素1出队.(4)选择操作3,判断对是否为空 (5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素 3、循环队列 (1)创建队列,输入数据 1,2,3,4,5.(2)选择操作1,执行入队操作.输入入队元素0 (3)选择操作2,执行出队操作。队首元素1出队.(3)选择操作3,判断对是否为空 (5)选择操作4,输出对头元素2.(6)选择操作5,显示队列元素为,2,3,4,5,0 六.测试结果(xxx)1.顺序队列的实现和运算 1)输入1即可进行进入到顺序队列 2)顺序队列的建立,输入元素的个数为5,输入的数据分别为1,2,3,4,5,对头为1,队尾为5,此时队列的数据为1 2 3 3)输入2即可进行入队运算,输入的入队元素为0,此时的队列的数据为1 2 3 4 5 0 4)输入3即可进行判断队列的是否为空,如下图: 5)输入4即可进行去的对头元素的算法,如下图所示: 6)此时的队列的数 据 为 0,如 下 图 : 7)输入0即可退出顺序队列,如下图: 8)输入3即可进行顺序队列的算法,如下图所示: 9)输入1即可进 行 相 应的入 队 运 算,如 下 10)输入2即可进行队列的出队运算,如下图所示: 所 示 图 :11)输入3 即可判断顺序队列是否为空的算法,如下图所示: 12)输入4即可进行去的头结点的运算,如下图所示: 13)输入5即可进行队列的输出显示的运算,如 14)输入0即可进行退出顺序队列的算法,如下图所示: 下图所示:2.链式队列的实现和运算 1)队列的建立以及队列的个数输入为5,输入的数据分别为1,2,3,4,5.如下图: 2)输入2即可进入到元素的入队运算,输入入队的元素的为0,输入3即可进行相应的元素的出队运算,出队元素为1.如下图: 3)则此时的队列的长度为5,输入4即可进行队列的销毁以及输入5即可进行队列的清空运算,如下图: 4)输入6即可进行输出队列的对头元素,输入0即可进行退出链队列的运算 3.循环队列的实现和运算 1)输入3即可进行循环队列的操作,输入5个数据,它们分别为1 2 3 4 5,输入1,即可进行入队操作,输入入队的元素为0,则此时的数据为1 2 3 4 5 0,如下图所示: 2)输入2即可进行出队运算,如下图所示: 3)输入3即可进行判断队列的是否为空,如下图所示: 4)输入4即可进行取得对头元素,如 下 5)输入5即可进行输出所有的数据显示,如下图所示: 所示图: 七.心得体会(xx) 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 1 拟静力试验 拟静力试验方法几乎可以用于各种工程结构或构件的抗震性能的研究, 是目前在结构 (或构件) 抗震性能研究中应用最广泛的一种试验方法。它是以一定的荷载或位移作为控制值对试件进行低周反复加载, , 以获得结构非线性的荷载--变形特性, 故又称为“低周反复加载试验”或“恢复力特性试验”。这种试验方法是在二十世纪六、七十年代基于结构非线性地震反应分析的要求提出的。应用该试验方法可以最大限度地利用试件提供的各种信息.其根本目的是对结构在荷载作用下的基本性能进行深入研究, 进而建立恢复力模型和承载力计算公式, 探讨结构的破坏机制, 并改进结构的抗震构造措施。 1.1 试验设备与加载装置 对工程结构进行拟静力试验常用的设备有加载设备、反力墙、试验台座、荷载架等。其中加载设备近年来谁着经济的发展和科学技术水平的提高, 结构加载设备有了质的改变, 目前许多结构试验室主要采用电液伺服加载系统进行结构的拟静力试验加载, 并采用计算机进行试验控制和数据采集。 1.2 单向反复加载制度 目前国内外较为普遍采用的单向 (一维) 反复加载制度主要有力控制加载、位移控制加载、力—位移混合控制加载。 1.2.1 位移控制加载 位移控制加载是在加载过程中以位移 (包括线位移、角位移、曲率或应变等) 作为控制值或以屈服位移的倍数作为控制值, 按一定的位移增幅进行循环加载。当试件具有明确屈服点时, 一般都以屈服位移的倍数为控制值。当试件不决有明确屈服点时 (如轴压比较大的柱) 或干脆无屈服点时 (如无筋砌体) , 则由研究者根据知识或经验规定一个合适的位移标准值来控制试验加载。在位移控制加载中, 根据位移控制的幅值不同, 又可分为变幅加载、等幅加载和变幅等幅混合加载。 变幅位移控制加载多用于研究构件的恢复力特性, 并建立恢复力模型。一般, 每一级位移幅值下循环二至三次, 由试验测得的滞回曲线建立构件的恢复力模型。等幅位移控制加载主要用于确定构件在特定位移幅值下的特定性能, 例如极限滞回耗能、强度降低率和刚度退化规律等, 混合位移控制加载可以综合地研究构件的性能, 其中包括等幅部分的强度和刚度变化, 以及在变幅部分特别是大变形增长情况下强度和耗能能力的变化。在上述三种位移控制加载制度中, 以变幅等幅混合加载方案使用得最多。 1.2.2 力控制加载 力控制加载是在使用加载过程中以力作为控制值, 按一定的力幅值进行循环加载, 因为试件屈服后难以控制加载的力, 所以这种加载制度较少单独使用。 1.2.3 力—位移混合加载 这种加载制度是先以力控制进行加载, 当试件达到屈服状态时改用位移控制, 一直至试件破坏, 《建筑抗震试验方法规程》 (GBJ101-96) 规定:试件屈服前, 应采用荷载控制并分级加载, 接近开裂和屈服荷载前宜减少级差加载;试件屈服后应采用变形控制, 变形值应取屈服时试件的最大位移值, 并以该位移的倍数为级差进行控制加载;施加反复荷载的次数应根据试验目的确定, 屈服前每级荷载可反复一次, 屈服以后应反复三次。 1.2.4 多点同步加载 多层房屋或多层框架结构是经常遇到的试验对象。这样的试件就需要用多个加载器加载, 如图所示。由于地震荷载在结构上的作用常常近似成为按倒三角形分布的, 所以各质点的加载应由上到下也要按倒三角形分布加载。当结构进入塑性状态后特别是在下降阶段控制作用力是很困难的, 所以目前的控制方法是选择一个上部的电液伺服加载器为主控加载器。主控加载器采用位移控制模式但监测的是作用力的大小, 其余的加载器用力控制模式, 作用力数值的大小根据主控加载器量测值的大小按比例确定。现在的主要问题是如何保证几个加载器的同步, 对于多质点体系, 各加载器的作用是耦联的, 一个加载器力值的改变将影响到其他加载器作用力的变化。解决这个问题有两种途径, 这里针对下图中三质点的结构体系来说明。 一种方法称之为“模控方法”即把3号加载器的力信号乘上比例系数后直接作为2号加载器和1号加载器的力控制命令信号。由于模控控制过程是连续反馈的, 所以当3号加载时, 2号加载器和1号加载器将迅速地将3号加载器的量测力值动作。这样计算机只控制3号加载器的加载, 对2号和1号加载器采集力和位移信号并进行安全监视。 另一种方法称为“数控方法”, 是将3号加载器作为主控加载器采用位移控制, 另外两个加载器作为从动加载器采用力控制模式。对于主控加载器采用较小的位移步长进行加载, 由于三个加载器作用力是耦联的。所以, 在主控加载器的每一个加载步长之内, 两个从动加载器的力控制加载需经几次调整迭代, 直到满足给定的误差。然后主控加载器进行下一步的加载。 1.2.5 双向反复加载制度 为了研究地震对结构构件的空间组合效应, 克服采用在结构构件单方向 (平面内) 加载时不考虑另一方向 (平面外) 地震力同时作用对结构影响的局限性, 可在x、y两个主轴方向 (二维) 同时施加低周反复荷载。例如, 对框架柱或压杆的空间受力和框架梁柱节点在两个主轴方向所在平面内采用梁端加载方案加反复荷宰试验时, 可采用双向同步或非同步的加载制度。 (1) x、y轴双向同步加载 与单向反复加载相同, 低周反复荷载作用在与构件截面主轴成α角的方向做斜向加载, 使x、y两个主轴的方向的分量同步作用。 反复加载同样可以采用位移控制、力控制和两者混合控制的加载制度。 (2) x、y轴双向非同步加载 非同步加载是在构件截面的x、y两个主轴方向分别施加低周反复荷载。由于x、y两个方向可以不同步地先后或交替加载。 1.3 优缺点 拟静力试验与其他结构抗震试验相比, 突出优点是它的经济性和实用性, 从而它的应用具有广泛性。同时, 对试验设备和设施的要求比较低, 这也是一个优点。但由于拟静力试验中没有考虑应变速率的影响, 这又是它的不足。 2 拟动力试验 2.1 拟动力试验的基本概念 拟静力加载试验方法虽然是目前工程结构中应用最为广泛的试验方法, 可以最大限度地获得试件的刚度、承载力、变形和耗能等信息, 但是它不能模拟结构在实际地震作用下的反应。虽然地震模拟震动台试验是最理想的再现地震动和结构反应的试验方法, 高精度的多自由度地震模拟震动台的建造和发展为研究结构弹塑性地震反应提供了有效的手段, 但是对于大比例模型结构或构件, 需要有大型的地震模拟震动台, 设备投资很大, 从而影响了许多大型结构进行地震模拟试验。正是由于地震模拟震动台承载能力的限制, 一般的震动台试验只能进行小尺寸的模型试验;而小尺寸结构模型的动力相似律很难满足要求。尤其是在弹塑性范围内, 试验结果往往难以推算到原型结构中去, 这也是地震模拟台试验的不足之处, 因此限制了它的应用。虽然计算机技术有了迅速的发展, 结构的理论分析和计算水平有了很大的提高, 但是对于结构地震作用下的弹塑性响应计算, 需要事先给出结构的恢复力模型, 而这种恢复力模型的选择和参数确定是目前结构理论中还没解决好的问题, 尤其对于具有复杂形体和构造的结构体系更是如此。拟动力试验方法吸收了拟静力加载试验和地震模拟振动台试验两种方法的优点, 同时又考虑了结构理论分析和计算的特色, 可以模拟大型复杂结构的地震反应, 在工程结构抗震试验方面得到了广泛的应用。同时, 拟动力试验方法本身的研究也取得了重大进展, 特别是近年来, 在概念、方法、技术和设备等方面都与最初阶段的拟动力试验有了很大的不同, 应用领域也从最初的研究一般建筑结构扩展到了研究土-结构相互作用、桥梁结构、多维多点结构地震输入和设备抗震等方面。 用于工程结构弹塑性地震反应的拟动力试验系统产生于1974年。当初其目的在于研究目前描述结构或构件恢复力特性的数学模型是否正确, 进一步了解难以用数学公式表达恢复力特性的结构地震反应。此项试验获得了成功, 更为重要的是它标志着工程结构抗震试验方法的重大进展。从此, 拟动力试验方法在工程结构抗震试验研究中确立了它不可替代的地位。 与理论计算相比, 它无需对工程结构作任何假定就能获得结构体系的真实地震反应特征;而与拟静力试验和地震模拟振动台试验相比, 它既有拟静力试验那样经济方便的特点, 又具有振动台那样真实模拟地震作用的能力。 拟动力试验技术把电液伺服试验装置与计算机控制系统结合起来, 利用加载试验给出结构恢复力的实际数据, 利用计算机数据分析技术给出加载试验的逐步控制数据, 从而为原型结构的模拟地震试验开辟了一条新途径。与拟静力试验相比, 拟动力试验的试验周期缩短, 并且由于采用地震动时程作为加载制度, 因此, 试验结果能够良好地指示结构的地震反应过程, 值得指出的是, 尽管对于单层或双层框架结构可以采用更接近实际的位移控制制度, 但对于大型结构, 更实用的是将多自由度体系改变为等效单自由度体系进行联机试验。即对加载力沿高度的分布作出某种假定 (例如倒三角形分布) , 而仅对高度上某一点的加载器按位移控制, 并通过计算机联机控制实现, 其余各点的加载则按上述力分布假定按荷载控制加载器。80年代后, 日美合作进行的七层钢筋混凝土原型结构拟动力试验, 就是采用这种等效技术。拟动力试验技术中的控制难点在于计算误差的扩散, 需进一步研究。 结构抗震静力试验方法是我们研究工程结构抗震性能的常用的重要方法, 本文讨论的是目前实验室常采用的两种方法。但作为研究, 除上述各种试验类型外, 近年来还提出了许多新的模拟地震试验的思想。但目前见诸报道的试验很少, 具有深入研究价值的成功先例更少。但作为方向, 这方面工作是有发展潜力的。 摘要:工程结构抗震试验可分为两大类, 即工程抗震静力试验和工程结构抗震动力试验。而在试验室经常进行的主要有拟静力试验方法、拟动力试验方法. 关键词:抗震,拟静力试验,拟动力试验 参考文献 [1]李忠献.工程结构试验理论与技术.天津大学出版社, 2004. [2]李顺国, 王学国.工程抗震试验技术现状.国外建材科技, 2003. 一、小学生在实验数据处理中遇见的问题 在小学科学教学中学生对于数据的处理还存在许多的问题,这些问题都会严重影响学生的数据收集意识的培养,不利于学生养成严谨的科学探索态度。下面就主要谈几点问题。 1.学生对于数据的收集不太真实 在小学科学教学过程中,学生往往会对课堂实验表现出极大的兴趣,会比较认真地观摩教学实验,一旦学生有机会上手做实验也会非常认真。但是在做实验的过程中,学生经常忽略一个环节,那就是收集数据并记录数据。所以往往会出现学生实验结束后,课本上的记录却是空白情况。等到实验进行完成后,教师需要实验数据时,学生会互相询问数据,凭借自己的记忆,然后比较草率地填写数据,最终造成数据收集不太真实,会导致学生在处理实验现象的时候被不真实的数据所诱导,偏离实验本质要求。例如在《导体和绝缘体》的教学中,学生就只顾去分辨材料,实验也是越做越开心,可是最终却忘记记录材料是否绝缘,导致数据收集不太真实,容易出错,也不利于后期整理材料是否绝缘的实验报告。这种现象在低年级的学生身上很容易发生。 另一方面,教师在科学教学过程中经常会对学生进行提问,但是往往在提问中会找优秀的学生进行回答,当学生回答正确后,教师会停止讨论。所以久而久之,学生开始为了迎合教师的问题而对数据进行“修改”,最终给出“完美”的实验数据。故而,这也导致了学生在科学教学中收集数据不真实,影响学生数据意识的培养。 2.学生对数据的处理不准确 在小学科学教学过程中,还存在一个问题,就是学生对于数据的收集处理不太准确。这也会导致学生在科学数据处理中出现错误,不利于数据意识的培养。例如在小学科学实验中经常会出现对比实验,而且在对比试验中还经常出现比较高的要求,但是学生却不能有效对实验中的对比变量进行认识和控制,所以会导致在科学实验过程中出现数据处理不准确,最终与实验现象差距较大,出现错误等现象。还有在一些需要利用仪器进行实验的科学试验中,学生因为不能准确掌握仪器正确使用方法和规则,也很容易造成数据的错误采集。例如对于温度计的读数,正确方法是平视温度计的刻度线,但是如果学生俯视或者仰视温度计刻度线,那么就会导致温度计读数出现错误,最终导致收集的数据不准确,影响实验效果。 3.学生对实验数据的收集不太全面 在科学实验过程中,经常会发生学生因为时间问题自己保留一部分实验数据,教师就参考学生这部分数据进行实验分析,最终导致实验出现较大的偏差,这样的实验数据导致实验结果不全面,降低实验真实性。所以实验数据收集不全面也是学生经常容易在科学试验中所出现的问题。 二、小学生数据处理中存在问题的原因 对于在小学科学实验教学过程中,学生容易出现的问题需要仔细分析其背后的原因,帮助学生尽快纠正,利于学生养成良好的数据意识,利于学生未来研究能力的提升。 首先从教师角度讲,在小学科学实验教学过程中缺乏对学生数字收集意识的培养。教师从教学计划出发,忽略学生在数字收集上的能力拓展,只是教会学生分析实验现象和实验结果,往往忽略了学生需要掌握数据收集,分析和整理才能更加准确地形成数据意识,也才能更好地分析出实验现象和结果,所以教师在意识上还存在问题。另外教师在指导学生形成数据意识的方法上也存在问题。教师不能激发学生自己形成数据收集的意识,而是一味让学生记录数据,寻找数据,整理数据,缺乏对学生创新能力的培养,让学生只形成简单的数据记录,不能有效建立数据敏感,更不能通过数据得出结论,指导实验。 从学生角度看,学生对于实验比较好奇,但是对实验数据的重视度却偏低,很多时候收集实验数据都只是为了完成任务,而不是提高自己的数据收集能力。所以这种意识淡薄的情况就会导致数据收集出现问题,最终影响数据意识的形成。另外,学生很容易为了获得教师的认可和表扬,就会去对收集的数据进行“修改”,然后导致所有试验数据处理痕迹过多,严重影响实验的真实性,最终导致实验数据无法体现实验现象,更加大学生对数据的收集的淡薄意识,不利于数据意识的创新与发展。最后,学生在实验过程中没有记录数据的意识,导致在试验后没有充分时间整理数据,所以很容易出现错误的数据,这也是数据不准确的主要原因。 最后,仪器的准确度以及操作方法也成为学生数据意识难以形成的原因。 三、对策 既然知道了问题,并且分析了原因,那么就需要进一步落实对策,帮助学生收集好数据,分析好数据,利用好数据,形成良好的数据意识,帮助学生创新与发展,提高学生的探索能力,利于学生未来的成长。 1.充分做好课前准备 首先在小学科学实验教学过程中,教师要加强学生数据意识的培养,要精心为学生数据意识培养设置实验。任何科学的推导都需要数据作为支撑,所以在数据的收集中更加需要精心设计,教师需要为学生数据收集预留空间,教会学生科学地探究知识,结合原有不足的数据收集问题,针对性设计实验,帮助学生观察实验的同时还能做好数据采集工作,帮助学生形成良好的数据收集意识,要时刻提醒学生数据收集的重要性,让学生重视数据,提高数据的准确性。 其次,要为学生创造良好的氛围,让学生在科学实验过程中更加大胆和创新。对于学生数据出现问题后,教师要耐心了解,要倾听学生内心的想法,让数据收集有问题的学生也能畅所欲言。这样可以培养学生的勇气和胆量,更加利于学生在数据收集过程中勇于创新,大胆采集,利于学生建立数据意识。 2.设计好记录表,让数据说话 要让学生养成数据收集的意识,就需要让学生看到数据的价值,最好是能直观为学生展示出来。所以利用数据记录表格就可以准确为学生做好数据记录,帮助学生透过数据看到实验的真实情况,更加了解数据的价值,更有利于学生培养数据意识。例如在“测量心跳和呼吸”这个实验中,教师需要制作一个表格,在“行”与“列”的首个表格中注明“心率”和“呼吸频率”,这样学生就可以将不同的心率对应到不同的呼吸频率中,这样得出的数据就是一一对应,既能有效收集数据,而且还能让数据发声,清楚展示出心率与呼吸频率的对应关系,让学生一目了然,更能体会到数据的真实性和有效性,更容易激发学生数据意识的形成。 3.教师要熟练实验,帮助学生解惑 教师在指导学生实验前需要自己先熟悉实验,要对实验数据进行掌握和预判断。因为每个实验存在的条件不一致,所以很可能在实验过程中出现数据难以掌握的情况,最终数据不能有效解决实验现象,就会打击学生收集数据的积极性,导致学生数据意识的偏差。所以教师需要对每个实验的数据进行预先评价,控制数据的范围,让学生得到的数据能够更加准确。例如“研究拉力大小与小车的运动的关系”,由于摩擦力的存在,所以,最开始小车静止时,拉力计显示的数据会比后面小车运动的数据大,但是学生往往会觉得这是错误的数据,所以教师在预判断的时候就需要指导学生进行数据处理,帮助学生形成良好的数据分析能力,让学生相信数据,借助数据,最终解决问题,不断在数据使用中进行创新与发展,更有利于数据意识的形成。 四、结束语 数据是试验中非常重要的资源,对于现象的解释,实验的成败具有重要作用,所以在小学科学实验教学中帮助学生形成良好的数据意识,让学生在数据上进行创新和发展,为将来的实验学习提供思维方法,帮助学生成长。 【数据结构实验教案】推荐阅读: 数据结构实验01-22 数据结构实验报告05-14 数据结构实验图二05-17 数据结构实验顺序表09-10 数据结构 实验指导书07-28 数据结构的实验指导书08-26 《数据结构》实验教学方法探讨的教育论文12-09 数据结构实验报告三线性表的链式存储09-02 数据库应用实验教案02-24数据结构 队列实验报告 篇5
结构抗震静力实验方法综述 篇6
实验,因数据而精彩 篇7