实验5:端口扫描器的设计与实现
(一)实验目的和内容:
目的:加深对TCP/IP的理解,学习端口扫描技术和原理,熟悉socket编程。
内容:实现一个扫描器,使用TCP connect进行端口扫描,并对扫描结果进行记录。
(二)课程设计要求:
Windows或Linux环境下,程序在单机上运行;
使用端口扫描器对一台主机进行扫描,并显示出结果;
对一个网段进行IP扫描,显示出结果;
编程语言不限;
提供友好的用户界面。
(三)端口扫描技术:
“端口” 是专门为计算机通信而设计的,它不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。
“端口” 是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。
具体来说,就是用[IP:端口]来定位一台主机中的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。端口与进程是一一对应的,入侵者通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。
(四)扫描端口的目的:
端口扫描是入侵者搜集信息的几种常用手法之一,也正是这一过程最容易使入侵者暴露自己的身份和意图。
? 判断目标主机上开放了哪些服务;
? 判断目标主机的操作系统。
如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能够使用相应的手段实现入侵。
(五)端口的分类:
端口是一个16 bit的地址,用端口号进行标识不同的作用。端口一般分为两类。
?熟知端口号(公认端口号):由因特网指派名字和号码公司ICANN负责分配给一些常用的应用层程序固定使用的熟知端口,其数值一般为0~1023。
?一般端口号:用来随时分配给请求通信的客户进程。
(六)扫描原理的基础知识:
TCP/IP模型四层结构
TCP与UDP协议
TCP报文结构
TCP连接和释放过程
(七)TCP/IP模型四层结构:
(八)TCP与UDP协议:
Internet的网络通信大多是建立在这两个协议之上的,各个主机遵循着TCP/IP协议封装数据包进行通信。
传输控制协议TCP(Transmission Control Protocol):TCP提供可靠的、面向连接的运输服务,用于高可靠性数据的传输。TCP具有完善的错误检测与恢复、顺序控制和流量控制等功能。注重可靠性的场合一般使用TCP协议,例如FTP、Telnet。
用户数据报协议UDP(User Datagram Protocol):UDP在传送数据之前不需要先建立连接。远地主机的运输层在收到UDP数据报后,不需要给出任何确认。广泛应用于只需一次的C/S 模式的请求-应答查询,或者要求提供高效率数据传输的场合。注重实时性、传输率、吞吐量的场合一般使用UDP,如QQ。
(久)TCP connect扫描:
实现原理:通过调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程。如果端口处于侦听状态,那么connect()就能成功返回。否则,这个端口不可用,即没有提供服务。
优点:稳定可靠,不需要特殊的权限。
缺点:扫描方式不隐蔽,服务器日志会记录下大量密集的连接和错误记录,并容易被防火墙发现和屏蔽。
实验设计流程:
1.原理概述
通过调用socket函数connect()连接到目标计算机上,完成一次完整的三次握手过程。如果端口处于侦听状态,那么connect()就能成功返回。否则,这个端口不可用,即没有提供服务。
2.运行环境
本扫描软件用java语言开发,可稳定的运行在linux和windows环境下。
3.基本设计思路
用户界面:使用java里面的swing包来开发用户界面;
端口扫描:使用socket函数connect()连接目标计算机来判定是否目标计算机开放了要测试的端口;
Ip扫描:通过测试一些经常开放的端口,如果能连接其中一个,则该ip地址在该网段内使用着,否则可以判断未使用。测试的常用端口越多,得到的结果越精确,但运行的速度越慢。
4..功能模块设计
本软件有两个功能模块,分别是指定主机的端口扫描和指定网段的ip扫描.。
5.程序流程及主要算法
核心算法是TCP 的连接函数
Socket socket = new Socket(portscan.getIp(),portscan.getPort());
根据连接结果判断指定的端口是否开放。
if(socket.isConnected()){
jta2.append(portscan.getPort() + "\n");
}
6.程序使用说明
在ip扫描面板上点击“开始”按钮进行ip地址的扫描,为了提高ip地址的扫描速度,这里使用了多线程的并发机制,大大提高了扫描的速度。
在port扫描面板上点击“开始端口扫描”按钮,对输入的ip地址的指定端口范围进行扫描。
在linux下运行:
在linux下运行时,有一个非常惊人的发现(相对于我来说),在linux 下进行端口扫描时,3分钟左右就可以扫描一遍所有的(65535个)端口,而在windows下,每秒钟只能扫描1个端口。难怪企业级服务器最好的选择是linux,unix!
7.程序分析与总结
本程序使用java语言开发,可以稳定的运行在windows和linux系统下,在ip扫描时由于扫描的速度比较慢,故使用了多线程的并发机制,大大提高了运行速度。
附录A - 源程序代码文件说明
源代码为java的工程,在bin目录下有编译好的字节码文件,可以直接运行。
附录B - 参考文献
Java语言程序设计基础篇
Java语言程序设计进阶篇
源代码如下:
代码1:Main.java(程序运行的入口)
publicclass Main {
/**
* @param args
*/
publicstaticvoid main(String[] args) {
new PortScannerFrame();
}
}
代码2:IPScan.java(实现网段内ip地址的扫描)
import java.io.IOException;
import https://www.doczj.com/doc/2d16579334.html,.InetAddress;
import https://www.doczj.com/doc/2d16579334.html,.InetSocketAddress;
import https://www.doczj.com/doc/2d16579334.html,.Socket;
import https://www.doczj.com/doc/2d16579334.html,.UnknownHostException;
import java.util.ArrayList;
public class IPScan {
Socket socket;
String startIP;
String endIP;
ArrayList
public IPScan(){
this.setPortArray();
}
public IPScan(String startIP,String endIP,int port){
this.startIP = startIP;
this.endIP = endIP;
}
public IPScan(String startIP){
this.startIP = startIP;
}
public ArrayList
return portArray;
}
public void setPortArray() {
portArray.add(80);
//portArray.add(135);
//portArray.add(443);
portArray.add(445);
//portArray.add(843);
//portArray.add(902);
//portArray.add(912);
portArray.add(8080);
}
public synchronized void plusIP(){
String[] ipcodes = startIP.split("[.]");
int temp = Integer.parseInt(ipcodes[3]);
temp ++;
startIP = ipcodes[0] + "." + ipcodes[1] + "." + ipcodes[2] + "." + temp;
System.out.println(startIP);
}
public Socket getSocket() {
return socket;
}
public void setSocket(Socket socket) {
this.socket = socket;
}
public String getStartIP() {
return startIP;
}
public void setStartIP(String startIP) {
this.startIP = startIP;
}
public String getEndIP() {
return endIP;
}
public void setEndIP(String endIP) {
this.endIP = endIP;
}
}
代码三:PortScan.java
import java.io.IOException;
import https://www.doczj.com/doc/2d16579334.html,.*;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
public class PortScan {
String ip;
Socket socket;
int port =0,endPort = 65525;
public PortScan(){
this.ip = "127.0.0.1";
this.port = 8000;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public int getEndPort() {
return endPort;
}
public void setEndPort(int endPort) {
this.endPort = endPort;
}
}
代码四:PortScannerFrame.java(程序的主要窗体)
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import https://www.doczj.com/doc/2d16579334.html,.Socket;
import https://www.doczj.com/doc/2d16579334.html,.UnknownHostException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.swing.*;
public class PortScannerFrame extends JFrame implements ActionListener{
JTabbedPane jtp = new JTabbedPane();//卡片布局
JPanel ipPanel = new JPanel();
JPanel portPanel = new JPanel();
JTextField ipField = new JTextField("192.168.1.100",20);
JLabel label1 = new JLabel("请输入起始ip");
JTextField ipField2= new JTextField("192.168.1.130",20);
JLabel label2 = new JLabel("请输入终止ip");
JButton startButton = new JButton("开始");
JTextArea jta0 = new JTextArea("在该网段下使用的ip地址:\n");
JTextArea jta1 = new JTextArea("在该网段下未使用的ip地址:\n");//ip扫描结果
//端口扫描部分
JLabel label3 = new JLabel("请输入要扫描的主机的ip地址:");
JTextField ipFieldForPortScan = new JTextField("127.0.0.1",20);
JButton startPortScan = new JButton("开始端口扫描");
JTextArea jta2 = new JTextArea("目标主机开放的端口:\n");//显示端口扫描结果,此处显示开放的端口
JTextArea jta3 = new JTextArea("目标主机未开放的端口:\n");
JLabel label4 = new JLabel("请输入开始端口:");
JLabel label5 = new JLabel("请输入终止端口:");
JTextField startPort = new JTextField("8000",10);
JTextField endPort = new JTextField("8080",10);
IPScan ipscan = new IPScan();//扫描ip地址是否在该网段下使用
PortScan portscan = new PortScan();
public PortScannerFrame(){
init();
ipScaninit();
portScanInit();
}
public synchronized IPScan plusIP(){
IPScan ipscan = new IPScan();
String[] ipcodes = this.ipscan.startIP.split("[.]");
int temp = Integer.parseInt(ipcodes[3]);
temp ++;
this.ipscan.startIP = ipcodes[0] + "." + ipcodes[1] + "." + ipcodes[2] + "." + temp;
//System.out.println(startIP);
ipscan.setStartIP(this.ipscan.getStartIP());
return ipscan;
}
private void portScanInit(){
jtp.add(portPanel,"port扫描");
JPanel portPanelNorth = new JPanel();
JPanel portPanelCenter = new JPanel();
JScrollPane jsp1 = new JScrollPane(jta2);
JScrollPane jsp2 = new JScrollPane(jta3);
portPanelCenter.setLayout(new GridLayout(0,2));
portPanelNorth.setLayout(new GridLayout(0,2));
portPanel.setLayout(new BorderLayout());
portPanelNorth.add(label3);
portPanelNorth.add(ipFieldForPortScan);
portPanelNorth.add(label4);
portPanelNorth.add(startPort);
portPanelNorth.add(label5);
portPanelNorth.add(endPort);
portPanelNorth.add(startPortScan);
portPanel.add(portPanelNorth,BorderLayout.NORTH);
portPanelCenter.add(jsp1);
portPanelCenter.add(jsp2);
portPanel.add(portPanelCenter);
startPortScan.addActionListener(this);
startPort.addActionListener(this);
}
private void ipScaninit(){
jtp.add(ipPanel,"ip扫描");
ipPanel.setLayout(new BorderLayout());
JPanel panelTop = new JPanel();
JPanel panelCenter = new JPanel();
panelCenter.setLayout(new GridLayout(0,2));
panelTop.add(label1);
panelTop.add(ipField);
panelTop.add(label2);
panelTop.add(ipField2);
panelTop.add(startButton);
JScrollPane jsp1 = new JScrollPane(jta0);
JScrollPane jsp2 = new JScrollPane(jta1);
panelCenter.add(jsp1);
panelCenter.add(jsp2);
ipPanel.add(panelTop,BorderLayout.NORTH);
ipPanel.add(panelCenter,BorderLayout.CENTER);
startButton.addActionListener(this);
}
private void init(){
//ipPanel.setLayout(new GridLayout(0,2));
this.add(jtp);
this.setResizable(false);
this.setVisible(true);
this.setSize(800, 600);
this.setTitle("端口扫描器");
this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
this.setBackground(Color.cyan);
this.setLocationRelativeTo(null);
}
public int calculateIPCount(){
String[] ipCodes = this.ipscan.getStartIP().split("[.]");
int temp = Integer.parseInt(ipCodes[3]);
String[] ipCodes1 = this.ipscan.getEndIP().split("[.]");
int temp1 = Integer.parseInt(ipCodes1[3]);
return temp1 - temp;
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource() == startButton){
//点击开始扫描ip地址
int ipNum = 50;
ipscan.setStartIP(ipField.getText());
ipscan.setEndIP(ipField2.getText());
ipNum = this.calculateIPCount();
ExecutorService executor = Executors.newFixedThreadPool(5);
for(int i = 0;i < ipNum;i ++)
executor.execute(new IpScanThread());
}
if(e.getSource() == this.startPortScan){
portscan.setIp(ipFieldForPortScan.getText().trim());
portscan.setPort(Integer.parseInt(startPort.getText()));//设置起始扫描端口
portscan.setEndPort(Integer.parseInt(endPort.getText()));
//portscan.start(jta2);
new Thread(new PortScanThread()).start();
}
if(e.getSource() == this.startPort){
System.exit(0);
}
}
class PortScanThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
startScan();
}
public void startScan(){//调用该方法开始扫描
while(portscan.getPort() <= portscan.getEndPort()){
try {
Socket socket = new Socket(portscan.getIp(),portscan.getPort());
if(socket.isConnected()){
jta2.append(portscan.getPort() + "\n");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
jta3.append(portscan.getPort() + "\n");
}
portscan.setPort(portscan.getPort() + 1);
}
}
}
class IpScanThread implements Runnable{
IPScan ipscan;
public IpScanThread(){
ipscan = plusIP();
}
@Override
public void run() {
startScan();
}
private void startScan() {
// TODO Auto-generated method stub
int port;
Socket socket = new Socket();
for(int i = 0;i < ipscan.portArray.size();i ++){
port = ipscan.portArray.get(i);
try {
socket.close();
socket = new Socket(ipscan.getStartIP(),port);
if(socket.isConnected()){
jta0.append("" + ipscan.getStartIP() + "\n");
return;
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
jta1.append("" + ipscan.getStartIP() + "\n");
}
}
}
南昌航空大学 数学与信息科学学院 实验报告 课程名称:数学实验 实验名称: MATLAB基本操作 实验类型:验证性■综合性□ 设计性□ 实验室名称:数学实验室 班级学号: 10 学生姓名:钟 X 任课教师(教师签名): 成绩: 实验日期: 2011-10- 10
一、实验目的 1、熟悉MATLAB基本命令与操作 2、熟悉MATLAB作图的基本原理与步骤 3、学会用matlab软件做图 二、实验用仪器设备、器材或软件环境 计算机MATLAB软件 三、实验原理、方案设计、程序框图、预编程序等 问题1:在区间【0,2π】画sinx 实验程序: >> x=linspace(0,2*pi,30); >> y=sin(x); >> plot(x,y) 问题2:在【0,2π】用红线画sinx,用绿圈画cosx,实验程序:
>> x=linspace(0,2*pi,30); >> y=sin(x); >> z=cos(x); >> plot(x,y,'r',x,z,'co') >> 问题3:在【0,π】上画y=sinx的图形。 实验程序: >> ezplot('sin(x)',[0,pi]) >> 问题4:在【0,π】上画x=cos3t,y=sin3t星形图形。
实验程序: >> ezplot('cos(t).^3','sin(t).^3',[0,pi]) >> 问题5:[-2,0.5],[0,2]上画隐函数 实验程序: >> ezplot('exp(x)+sin(x*y)',[-2,0.5,0,2]) >> 问题6:在[-2,2]范围内绘制tanh的图形。实验程序: >> fplot('tanh',[-2,2])
数据结构《实验5》实验报告 实验项目5:快速排序 回答问题完整、实验结果(运行结果界面及源程序,运行结果界面放在前面):
#include
L.maxsize=MaxListSize; L.r=new EType[L.maxsize]; L.length=0; } bool InputLinearList(LinearList &L) { int i,num; cout<<"请输入要存储元素的个数:"; cin>>num; L.length=num; cout<
. .. . .. .. 实验三、图的遍历操作 一、目的 掌握有向图和无向图的概念;掌握邻接矩阵和邻接链表建立图的存储结构;掌握DFS及BFS对图的遍历操作;了解图结构在人工智能、工程等领域的广泛应用。 二、要求 采用邻接矩阵和邻接链表作为图的存储结构,完成有向图和无向图的DFS 和BFS操作。 三、DFS和BFS 的基本思想 深度优先搜索法DFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后选择一个与Vo相邻且没被访问过的顶点Vi访问,再从Vi出发选择一个与Vi相邻且没被访问过的顶点Vj访问,……依次继续。如果当前被访问过的顶点的所有邻接顶点都已被访问,则回退到已被访问的顶点序列中最后一个拥有未被访问的相邻顶点的顶点W,从W出发按同样方法向前遍历。直到图中所有的顶点都被访问。 广度优先算法BFS的基本思想:从图G中某个顶点Vo出发,首先访问Vo,然后访问与Vo相邻的所有未被访问过的顶点V1,V2,……,Vt;再依次访问与V1,V2,……,Vt相邻的起且未被访问过的的所有顶点。如此继续,直到访问完图中的所有顶点。 四、示例程序 1.邻接矩阵作为存储结构的程序示例
#include"stdio.h" #include"stdlib.h" #define MaxVertexNum 100 //定义最大顶点数 typedef struct{ char vexs[MaxVertexNum]; //顶点表 int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表int n,e; //图中的顶点数n和边数e }MGraph; //用邻接矩阵表示的图的类型 //=========建立邻接矩阵======= void CreatMGraph(MGraph *G) { int i,j,k; char a; printf("Input VertexNum(n) and EdgesNum(e): "); scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数 scanf("%c",&a); printf("Input Vertex string:"); for(i=0;i
淮海工学院计算机工程学院实验报告书 课程名:《数据库原理及应用》 题目:数据库的完整性 班级:软件132 学号:2013122907 姓名:莹莹
一.目的与要求 1.掌握索引创建和删除的方法; 2.掌握创建视图和使用视图的方法; 3.掌握完整性约束的定义方法,包括primary key、foreign key等。 二.实验容 1.基于前面建立的factory数据库,使用T-SQL语句在worker表的“部门号”列上创建一个非聚集索引,若该索引已经存在,则删除后重建。 2.在salary表的“职工号”和“日期”列创建聚集索引,并且强制唯一性。 3.建立视图view1,查询所有职工的职工号、、部门名和2004年2月工资,并按部门名顺序排列。 4.建立视图view2,查询所有职工的职工号、和平均工资; 5.建立视图view3,查询各部门名和该部门的所有职工平均工资; 6.显示视图view3的定义; 7.实施worker表的“性别”列默认值为“男”的约束; 8.实施salary表的“工资”列值限定在0~9999的约束; 9.实施depart表的“部门号”列值唯一的非聚集索引的约束; 10.为worker表建立外键“部门号”,参考表depart的“部门号”列。 11.建立一个规则sex:性别=’男’ OR 性别=’女’,将其绑定到“性别”上; 12.删除上面第7、8、9和10建立的约束; 13.解除第11题所建立的绑定并删除规则sex。 三.实验步骤 1 USE factory GO --判断是否存在depno索引;若存在,则删除之 IF EXISTS(SELECT name FROM sysindexes WHERE name='depno') DROP INDEX worker.depno GO --创建depno索引 CREATE INDEX depno ON worker(部门号) GO EXEC sp_helpindex worker GO 2 USE factory GO --判断是否存在no_date索引;若存在,则删除之 IF EXISTS(SELECT name FROM sysindexes WHERE name='no_date') DROP INDEX salary.no_date GO --创建no_date索引
实验名称:Windows的基本操作 一、实验目的 1.掌握桌面主题的设置。 2.掌握快捷方式的创建。 3.掌握开始菜单的组织。 4.掌握多任务间的数据传递——剪贴板的使用。 5.掌握文件夹和文件的创建、属性查看和设置。 6.掌握文件夹和文件的复制、移动和删除与恢复。 7.熟悉文件和文件夹的搜索。 8.熟悉文件和文件夹的压缩存储和解压缩。 二、实验环境 1.中文Windows 7操作系统。 三、实验内容及步骤 通过上机完成实验4、实验5所有内容后完成该实验报告 1.按“实验4--范例内容(1)”的要求设置桌面,将修改后的界面复制过来。 注:没有桌面背景图“Autumn”的,可选择其它背景图。 步骤:在桌面空白区域右击,选择菜单中的“个性化”,在弹出的窗口中点击“桌面背景”,在背景栏内选中“某一张图片”,单击“确定”。 修改后的界面如下图所示: 2.将画图程序添加到“开始”菜单的“固定项目列表”上。 步骤:右击“开始/所有程序/附件”菜单中的画图程序项,在弹出的快捷菜单中选“附到「开始」菜单”命令。 3.在D盘上建立以“自己的学号+姓名”为名的文件夹(如01108101刘琳)和其子文件 夹sub1,然后:
步骤:选定D:\为当前文件夹,选择“文件/新建/文件夹”命令,并将名字改为“学号+姓名”;选定“ D:\学号+姓名”为当前文件夹,选择“文件/新建/文件夹”命令,并将名字改为“sub1” ①在C:\WINDOWS中任选2个TXT文本文件,将它们复制到“学号+姓名”文件夹中;步骤:选定“C:\WINDOWS”为当前文件夹,随机选取2个文件, CTRL+C复制,返回“D:\学号+姓名”的文件夹,CTRL+V粘贴 ②将“学号+姓名”文件夹中的一个文件移到其子文件夹sub1中; 步骤:选定“ D:\学号+姓名”为当前文件夹,选中其中任意一个文件将其拖拽文件到subl ③在sub1文件夹中建立名为“”的空文本文档; 步骤:选定“ D:\学号+姓名\ sub1”为当前文件夹,在空白处单击右键,选择“新建\文本文档”,把名字改为test,回车完成。 ④删除文件夹sub1,然后再将其恢复。 步骤:选定“ D:\学号+姓名”为当前文件夹,右键单击“sub1”文件夹,选择“删除”,然后打开回收站,右键单击“sub1”文件夹,在弹出的快捷菜单中选择“还原”。 4.搜索C:\WINDOWS\system文件夹及其子文件夹下所有文件名第一个字母为s、文件长 度小于10KB且扩展名为exe的文件,并将它们复制到sub1文件夹中。 步骤:选定“ C:\WINDOWS\system”为当前文件夹,单击“搜索”按钮,在左侧窗格选择“所有文件和文件夹”,在“全部或部分文件名”中输入“s*.exe”,在“大小”中,选择“0~10KB”。 5.用不同的方法,在桌面上创建名为“计算器”、“画图”和“剪贴板”的三个快捷方式, 它们应用程序分别为:、和。并将三个快捷方式复制到sub1文件夹中。 步骤:①在"开始"菜单的"所有程序"子菜单中找到"计算器",单击右键,在弹出的快捷菜单中选择“发送到\桌面快捷方式”。 ②在"开始"菜单的"所有程序"子菜单中找到"画图",将其拖至桌面空白处。 ③在桌面上单击右键,在弹出的快捷菜单中选择“新建\快捷方式”,在“创建快捷方式”
数据库原理及应用实验报告(五) 实验题目:过程 专业:数字媒体技术 班级:1306班 姓名:***************
运城学院实验报告 专业:数字媒体技术系(班):计算机科学与技术系1306班姓名:************* 课程名称:数据库原理及应用 实验项目:过程实验类型:验证型指导老师:***** 实验地点:软件实验室一时间:2015年12月10日 一、实验目的: 掌握用户存储过程的创建,了解一些常用的系统存储过程,以及调用和删除过程,并熟悉使用存储过程来进行数据库应用程序的设计。 二、实验内容: (1)基于学生—课程数据库创建一存储过程,用于检索数据库中某个专业学生的人数,带有一个输入参数,用于指定专业。执行结果如图二所示: create procedure pro_s @stu_sdept varchar(5) //这是带参数的过程,参数不用()括 As select count(*) as 人数from student where sdept = @ stu_sdept 1、存储过程的执行 execute pro_s 实参//实参可以是变量,也可以是常量 (2)基于学生-课程数据库创建一存储过程,该过程带有一个输入参数,一个输出参数。其中输入参数用于指定学生的学号,输出参数用于返回学生的平均成绩。执行结果如图四所示: create procedure pro_stu @stu_sno char(6),@stu_avg float output //这个带output的是输出参数as select @stu_avg = avg(grade) //将平均值给了变量 from student,sc where student. sno = sc. sno and student.sno=@stu_sno 1.存储过程的执行 declare @stuavg float //用于存放输出变量内容的 execute pro_stu ‘1000’,@stuavg output// 输出参数必须是变量 select @stuavg //看结果 (3)在pubs数据库中建立一个存储过程,用于检索数据库中某一价位的图书信息。参数有两个,用
学号:20164477 姓名:陈家凤 实验五SQL语言 一、目的与要求 1.掌握SQL语言的查询功能; 2.掌握SQL语言的数据操作功能; 3.掌握对象资源管理器建立查询、索引和视图的方法; 二、实验准备 1.了解SQL语言的查改增删四大操作的语法; 2.了解查询、索引和视图的概念; 3.了解各类常用函数的含义。 三、实验内容 (一)SQL查询功能 使用提供的studentdb数据库文件,先附加到目录树中,再完成下列题目,SQL命令请保存到脚本文件中。 1.基本查询 (1)查询所有姓王的学生的姓名、学号和性别 Select St_Name,St_Sex,St_ID From st_info Where St_Name like'王%' 图5-1 (2)查询全体学生的情况,查询结构按班级降序排列,同一班级再按学号升序, 并将结果存入新表new中 select*into new from st_info order by Cl_Name desc,st_ID asc
图5-2 (3)对S_C_info表中选修了“体育”课的学生的平均成绩生成汇总行和明细 行。(提示:用compute汇总计算) 因2014版本已不支持compute关键字,所以选择用其他方式。 Select c_no,score From s_c_info Where c_no=29000011 group by c_no,score 图5-3 2.嵌套查询 (1)查询其他班级中比“材料科学0601班”的学生年龄都大的学生姓名和年 龄 select st_name,born_date from st_info where cl_name!='材料科学0601班'and born_date<(select min(born_date) from st_info where cl_name='材料科学0601班')
浙江大学城市学院实验报告 课程名称数据结构 实验项目名称实验十三/十四图的基本操作 学生姓名专业班级学号 实验成绩指导老师(签名)日期2014/06/09 一.实验目的和要求 1、掌握图的主要存储结构。 2、学会对几种常见的图的存储结构进行基本操作。 二.实验内容 1、图的邻接矩阵定义及实现: 建立头文件test13_AdjM.h,在该文件中定义图的邻接矩阵存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度等基本操作实现函数。同时建立一个验证操作实现的主函数文件test13.cpp(以下图为例),编译并调试程序,直到正确运行。 2、图的邻接表的定义及实现: 建立头文件test13_AdjL.h,在该文件中定义图的邻接表存储结构,并编写图的初始化、建立图、输出图、输出图的每个顶点的度等基本操作实现函数。同时在主函数文件test13.cpp中调用这些函数进行验证(以下图为例)。
3、填写实验报告,实验报告文件取名为report13.doc。 4、上传实验报告文件report13.doc到BB。 注: 下载p256_GraphMatrix.cpp(邻接矩阵)和 p258_GraphAdjoin.cpp(邻接表)源程序,读懂程序完成空缺部分代码。 三. 函数的功能说明及算法思路 (包括每个函数的功能说明,及一些重要函数的算法实现思路) 四. 实验结果与分析 (包括运行结果截图、结果分析等)
五.心得体会
程序比较难写,但是可以通过之前的一些程序来找到一些规律 (记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。) 【附录----源程序】 256: //p-255 图的存储结构以数组邻接矩阵表示, 构造图的算法。 #include 1.使用系统存储过程(sp_rename)将视图“V_SPJ”更名为“V_SPJ_三建”。(5分) exec sp_rename v_spj, v_spj_三建; 2.针对SPJ数据库,创建并执行如下的存储过程:(共计35分) (1)创建一个带参数的存储过程—jsearch。该存储过程的作用是:当任意输入一个工 程代号时,将返回供应该工程零件的供应商的名称(SNAME)和零件的名称(PNAME) 以及工程的名称(JNAME)。执行jsearch存储过程,查询“J1”对应的信息。(10 分) create proc jsearch @jno char(2) as select sname, pname, jname from s,p,j,spj where s.sno=spj.sno and p.pno=spj.pno and j.jno=spj.jno and spj.jno=@jno; 执行: exec jsearch 'J1' (2)使用S表,为其创建一个加密的存储过程—jmsearch。该存储过程的作用是:当执 行该存储过程时,将返回北京供应商的所有信息。(10分) 创建加密存储过程: create proc jmsearch with encryption as select * from s where s.city='北京'; sp_helptext jmsearch; (3)使用系统存储过程sp_helptext查看jsearch, jmsearch的文本信息。(5分) 用系统存储过程sp_helptext查看jsearch: exec sp_help jsearch; exec sp_helptext jsearch; 计算机系统结构实验报告 班 级 实验日期 实验成绩 姓 名 学号 实 验 名 称 计算机系统结构实验5(磁盘、固态盘仿真) 实 验 目 的 、 要 求 编译Disksim,测试单个磁盘的性能(Response time) 配置RAID0、RAID1、RAID5并做性能测试 探究性实验(2选1) 实 验 内 容 、 步 骤 及 结 果 一、编译D ISKSIM,测试单个磁盘的性能(R ESPONSE TIME) 测试某个磁盘,cheetah4LP.parv ../src/disksim cheetah4LP.parv cheetah4LP.outv validate cheetah4LP.trace 0 查看相应的outv文件,获取响应时间结果,使用grep命令得到 grep "IOdriver Response time average" cheetah4LP.outv 二、配置RAID0、RAID1、RAID5并做性能测试 (1)RAID5:为了方便对性能进行比较,进行如下的参数修改: 保存为synthraid5.parv,并进行测试 (2)RAID0:删除多余的generator 0 只留下一个,做如下更改: 保存为synthraid0.parv,并进行测试 (3)RAID1:删除多余的generator 0 只留下一个,做如下更改: 保存为synthraid1.parv,并进行测试 结论:通过测试我们可以发现在有效存储容量相同的情况下,RAID0使用的时间最少,速度最快。 三、探究性实验(2选1) 设计实验,任意选择其中一种RAID模式,分析验证其参数敏感性 参数包括盘数,条带大小。 ◎敏感性指:给定负载,其性能是否会随着参数变化而剧烈变化? ◎看上去完全没变化?注意负载强度是否足够。 这里我们选择RAID5模式进行测试。 (1)条带大小一定,磁盘数改变 此时(Stripe unit = 64,Parity stripe unit = 64) 磁盘个数7个8个9个10个11个 设备有效容量12336048 14392056 16448064 18504072 20560080 Synthetic结果21.657719 20.865686 20.332438 19.923599 19.728367 Financial结果2014.436976 1355.984474 1019.857911 882.827067 676.563854 目录 实验一:数字图像的基本处理操作 (4) :实验目的 (4) :实验任务和要求 (4) :实验步骤和结果 (5) :结果分析 (8) 实验二:图像的灰度变换和直方图变换 (9) :实验目的 (9) :实验任务和要求 (9) :实验步骤和结果 (9) :结果分析 (13) 实验三:图像的平滑处理 (14) :实验目的 (14) :实验任务和要求 (14) :实验步骤和结果 (14) :结果分析 (18) 实验四:图像的锐化处理 (19) :实验目的 (19) :实验任务和要求 (19) :实验步骤和结果 (19) :结果分析 (21) 实验一:数字图像的基本处理操作 :实验目的 1、熟悉并掌握MATLAB、PHOTOSHOP等工具的使用; 2、实现图像的读取、显示、代数运算和简单变换。 3、熟悉及掌握图像的傅里叶变换原理及性质,实现图像的傅里叶变换。:实验任务和要求 1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分 成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。 2.对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分 别显示,注上文字标题。 3.对一幅图像进行平移,显示原始图像与处理后图像,分别对其进行傅里叶变换, 显示变换后结果,分析原图的傅里叶谱与平移后傅里叶频谱的对应关系。 4.对一幅图像进行旋转,显示原始图像与处理后图像,分别对其进行傅里 叶变换,显示变换后结果,分析原图的傅里叶谱与旋转后傅里叶频谱的 对应关系。 :实验步骤和结果 1.对实验任务1的实现代码如下: a=imread('d:\'); i=rgb2gray(a); I=im2bw(a,; subplot(1,3,1);imshow(a);title('原图像'); subplot(1,3,2);imshow(i);title('灰度图像'); subplot(1,3,3);imshow(I);title('二值图像'); subplot(1,3,1);imshow(a);title('原图像'); 结果如图所示: 南京晓庄学院 《数据库原理与应用》课程实验报告 实验五嵌套子查询设计实验 所在院(系):数学与信息技术学院 班级: 学号: 姓名: 1.实验目的 (1)掌握多表查询和子查询的方法。 (2)熟练使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作。 (3)理解不相关子查询和相关子查询的实现方法和过程。 2.实验要求 (1)针对“TM”数据库,在SQL Server查询分析器中,用T-SQL语句实现以下查询操作: a)查询选修了数据结构与算法的学生学号和姓名。 b)查询07294002课程的成绩低于孙云禄的学生学号和成绩。 c)查询和孙云禄同年出生的学生的姓名和出生年份。 d)查询其他系中年龄小于数学与信息技术学院年龄最大者的学生。 e)查询其他系中比数学与信息技术学院学生年龄都小的学生。 f)查询同孙云禄数据库原理与应用课程分数相同的学生的学号和姓名。 g)查询选修了07294002课程的学生姓名。 h)查询没有选07294002课程的学生姓名。 i)查询同时选修了07295006和07295007课程的学生的学号。 j)查询所有未授课的教师的工号、姓名和院系,结果按院系升序排列。 扩展实验: a)查询和10060101选修的全部课程相同的学生的学号、课程号、期末考试 成绩。 b)查询至少选了10060101选修的全部课程的学生的学号。 c)查询年龄比所在院系平均年龄小的学生的学号、姓名、年龄、院系,按 院系和年龄升序排列。 d)查询每门课都在80分以上的学生的学号和姓名。 (2)在SQL Server Management Studio中新建查询,尽可能用多种形式表示实验中的查询语 句,并进行比较。 (3)按要求完成实验报告。 3.实验步骤、结果和总结实验步骤/结果 将调试成功的T-SQL语句写在下方(标明题号)。 北京联合大学信息学院实验报告 题目:实验五用户自定义函数 系别:软件系 专业:软件工程 班级:软件1203B 学号:20120803600 姓名: 同组人:无 指导教师:果晓来 2014年5月21日 5.用户自定义函数(2学时) 实验目的: 学习、掌握用户自定义函数的建立和使用 实验内容: 1、创建自定义函数 创建一个用户自定义函数,并测试、查看函数返回值。1)输入并执行下面语句 USE Northwind GO CREATE FUNCTION fn_TaxRate (@ProdID INT) RETURNS numeric(5,4) AS BEGIN RETURN (SELECT CASE CategoryID WHEN 1 THEN 1.10 WHEN 2 THEN 1 WHEN 3 THEN 1.10 WHEN 4 THEN 1.05 WHEN 5 THEN 1 WHEN 6 THEN 1.05 WHEN 7 THEN 1 WHEN 8 THEN 1.05 END FROM Products WHERE ProductID = @ProdID) END GO 2)此函数中输入变量是什么?返回值类型?如何定义的返回值? 输入变量:@ProdID 返回类型:numeric 定义的返回值:RETURNS numeric(5,4) 3)输入并执行语句测试函数 SELECT ProductName, UnitPrice,Northwind.dbo.fn_TaxRate(ProductID) AS TaxRate, UnitPrice * Northwind.dbo.fn_TaxRate(ProductID) AS PriceWithTax FROM Products 目录 实验一:数字图像的基本处理操作....................................................................... 错误!未定义书签。:实验目的 .............................................................................................................. 错误!未定义书签。:实验任务和要求..................................................................................................... 错误!未定义书签。:实验步骤和结果..................................................................................................... 错误!未定义书签。:结果分析................................................................................................................. 错误!未定义书签。实验二:图像的灰度变换和直方图变换............................................................... 错误!未定义书签。:实验目的 .............................................................................................................. 错误!未定义书签。:实验任务和要求..................................................................................................... 错误!未定义书签。:实验步骤和结果..................................................................................................... 错误!未定义书签。:结果分析................................................................................................................. 错误!未定义书签。实验三:图像的平滑处理....................................................................................... 错误!未定义书签。:实验目的 .............................................................................................................. 错误!未定义书签。:实验任务和要求..................................................................................................... 错误!未定义书签。:实验步骤和结果..................................................................................................... 错误!未定义书签。:结果分析................................................................................................................. 错误!未定义书签。实验四:图像的锐化处理......................................................................................... 错误!未定义书签。:实验目的 .............................................................................................................. 错误!未定义书签。:实验任务和要求..................................................................................................... 错误!未定义书签。:实验步骤和结果..................................................................................................... 错误!未定义书签。:结果分析................................................................................................................. 错误!未定义书签。 《程序设计基础》 实验报告 学号:2016211990 姓名:王贯东 班级:16-计算机科学与技术-1班 学院:计算机与信息学院 实验五指针 1.实验目的要求 (1)掌握指针的概念,学会定义和使用指针变量。 (2)学会使用数组指针和指向数组的指针变量。 (3)学会使用字符串指针和指向字符串的指针变量。 (4)了解指向指针的指针的概念以及其使用方法。 (5)掌握指针、引用、数组做函数参数的传递机制。 (6)*学会使用指向函数的指针变量。 2.实验设备 Visual C++ 6.0 3.实验内容 (1)阅读下面程序,写出其运行结果。 <1> #include { int stre ( char[ ] ) ; char str [ 10 ] , *p = str ; gets ( p ) ; cout << stre ( p ) << endl ; } int stre ( char str[ ] ) { int num = 0 ; while( * ( str + num ) != ’\0’ ) num ++ ; return ( num ) ; } 解:题目库函数少了 北京邮电大学 实验报告 课程名称数据库系统原理 实验内容实验5 数据库完整性与安全性实验 班级2013211***姓名 *** 指导老师成绩_________ 2016年05月20日 实验5 数据库完整性与安全性实验 实验目的: 1.通过对完整性规则的定义实现,熟悉了解SQL SERVER中完整性保证的规则和实现方 法,加深对数据完整性的理解。 2.通过对安全性相关内容的定义,熟悉了解SQL SERVER中安全性的内容和实现方法, 加深对数据库安全性的理解 实验内容 完整性实验与要求: 1.分别定义数据库中各基表的主键、外键,实现实体完整性约束和参照完整性约束; 定义主键: 方法一:使用Enterprise Manager设置主键(以book表为例) ①光标移到book表的位置,右键->设计 ②在你要选的属性列右键->设置主键,完成。 方法二:使用SQL语句。 ①右键数据库,新建查询 设置外键: 方法一:使用Enterprise Manager设置外键(以student表为例) ①单击student表,鼠标移到“键”文件夹,单击右键,选择“新建外键”。 ②选择“表和列规范”进行设置 ③我们想在student表设置class_id属性为外键,按照下图选择,点击确定,保存即可。 方法二:SQL语句 新建查询,输入如图语句。 2.向学生表插入具有相同学号的数据,验证其实体完整性约束; Student表的主键是学号,所以不能插入有相同学号的学生。 3.向学生表中插入一条数据,班级号是学生表的外键,验证参照完整性约束; Class表中没有“2013211302”这个班级,所以无法插入。改变班级号为class表中存在的,则能够进行插入,结果如下: 4.删除教师表中的所有数据,验证参照完整性约束; 实验报告 课程名称:高级语言程序设计 实验五:循环结构程序设计 班级: 学生姓名: 学号: 专业: 指导教师: 学期:2010-2011学年上学期 云南大学信息学院 一、实验目的 1、理解循环的概念 2、理解并掌握循环结构相关语句的含义、格式及使用 3、学会循环的应用及控制,包括: ① 掌握使用循环输入多个数据的方法 ② 掌握在多个数据中有选择地输出数据的方法 ③ 掌握在多个数据中对某种数据进行计数的方法 ④ 掌握求多个数据中最大值、最小值的方法 ⑤ 掌握使用break 、continue 语句终止循环 4、掌握循环的嵌套 二、知识要点 1、循环变量、循环条件、循环体的概念 2、三种循环语句的一般格式、执行过程 3、理解选择结构与循环结构中“条件表达式”之不同含义 4、二重循环的执行过程 三、实验预习 (要求做实验前完成) 1、循环变量的主要用途是: 2、用循环求多个数的和之前,先要把和的初始值赋为: 3、用循环求多个数的乘积之前,先要把乘积的初始值赋为: 4、字符变量能否作为循环变量? 5、循环过程中,如果循环条件成立,但需要结束循环,可采用什么办法? 6、什么叫循环的嵌套? 四、实验内容 (要求提供:① 算法描述或流程图 ② 源程序 ) 1、编程,利用循环计算以下表达式的值: (5+52)*(4+42)*(3+32)*(2+22)*(1+12)*(1/2+1/3+1/4+1/5)(for 循环) 2、编程,从键盘输入若干个整数,当输入0时,输入停止。统计并输出总共输入了几个 数,以及所有输入数的和。(while 循环) 3、输入一行字符,分别统计其中的英文字母、数字、空格和其他字符的个数。 4、使用二重循环编程,绘制如下图形: *****A ****B ***C **D *E 5. 输入10个整数,输出最大值、最小值和平均分。 6. 编写程序,其功能是:根据以下公式求π的值(要求精度0.0005,即某项小于0.0005时停止迭代)。程序运行后,若输入精度0.0005,则程序应输出为3.14…。 () 1121231234121233535735793521n n π?????????=++++++?????????+………… 五、实验结果(要求写出运行界面及输出的运行结果) Tutorial 5 实验报告 实验名称:Matlab 绘图操作 实验目的: 1、 掌握绘制二维图形的常用函数; 2、 掌握绘制三维图形的常用函数; 3、 掌握绘制图形的辅助操作。 实验内容: 1. 设sin .cos x y x x ?? =+ ??+?? 23051,在x=0~2π区间取101点,绘制函数的曲线。 2. 已知: y x =21,cos()y x =22,y y y =?312,完成下列操作: (1) 在同一坐标系下用不同的颜色和线性绘制三条曲线; (2) 以子图形式绘制三条曲线; (3) 分别用条形图、阶梯图、杆图和填充图绘制三条曲线。 3. 已知:ln(x y x x ≤=??+>??0102 ,在x -≤≤55区间绘制函数曲线。 4. 绘制极坐标曲线sin()a b n ρθ=+,并分析参数a 、b 、n 对曲线形状的影响。 5.在xy 平面内选择区域[][],,-?-8888, 绘制函数z =的三种三维曲面图。 6. 用plot 函数绘制下面分段函数的曲线。 ,(),,x x f x x x x ?+>? ==??+23 50 00 50 7. 某工厂2005年度各季度产值(单位:万元)分别为:450.6、395.9、410.2、450.9,试绘制柱形图和饼图,并说明图形的实际意义。 8. 在同一坐标轴中绘制下列两条曲线。 (1).y x =-205 (2)sin()cos ,sin()sin x t t t y t t π=?≤≤? =?303 实验结果: 1. 2. (1) (2) (3)数据库实验报告1
实验5-RAID实验-实验报告
数字图像处理实验报告
数据库原理实验报告(5)
数据库实验5报告
数字图像处理实验报告
C++程序设计实验报告5
北邮大三下数据库实验报告5
实验报告5答案
实验5 Matlab绘图操作实验报告