云南大学数据库系统与设计实验6
云大 数据库 实验七:数据库的安全性
实验七:数据库的安全性一、实验目的1.掌握Windows NT认证模式下数据库用户帐号的建立与取消方法;2.掌握混合模式下数据库用户帐号的建立与取消方法;P2233.掌握数据库用户权限(即角色)的设置方法;P2384.熟悉数据库数据库用户帐号的权限分配、回收等方法;P2425.了解数据库角色的分类、作用及使用方法。
二、实验环境已安装SQL Server 2005 企业版的计算机(13台);具有局域网环境,有固定IP;三、实验学时2学时四、实验要求1.了解SQL Server 2005系统安全;2.熟悉数据库用户、服务器角色及数据库角色的用法;3.完成实验报告;五、实验内容及步骤以系统管理员身份登录到SQL Server服务器,在SQL Server2005界面中实现以下操作,并独立写出部分题目的程序代码;1.在当前计算机中增加一个用户zhang和cheng,密码为secret。
使此用户通过winows NT模式下登录SQL Server服务器,登录名分别为zhang和cheng;安装SQL Server2005时,设置服务器验证方式为“SQL Server和Windows身份验证模式”。
点击对象资源管理器—安全性—登录名—单击右键“新建登录名”进行相关操作,单击确定。
在登录名下面就会出现新的用户登录名zhang和cheng,重新启动SQL Server Management Studio,就可以使用“SQL Server身份验证”方式使用登录名和密码,成功连接SQL Server Management Studio。
2.新建以混合模式登录SQL Server服务器的用户登录名为stu1、stu2和stu3,登录密码为secret,默认登录数据库为stu;新建登录名时将默认数据库设置为stu,然后设置用户映射为“Stu”数据库。
3.将帐号zhang添加为数据库stu的用户,用户名为zhang;右键单击账号“zhang”—属性—用户映射—进行设置:4.在数据库stu中创建用户stu1、stu2和stu3,登录帐号分别为stu1、stu2和stu3;设置stu1、stu2和stu3用户映射为“Stu”数据库。
数据库实验六-综合实验
实验六数据库原理综合实验1实验目的(1)运用所学的数据库设计技术,针对一个具体的应用系统,完成系统数据库的概念模型、逻辑模型和物理模型的设计。
以巩固理论课程上所学的知识,更好地掌握数据库设计技术方法。
(2)对前面章节所学的知识加以综合应用。
2实验内容给定一个应用环境,如学生选课系统、超市管理系统、某企业库存管理系统、学校图书管理系统、学校综合积分管理系统等等。
(同学们课从上述选定一个题目,也可以选取一个自己较熟悉的应用环境)。
完成下面的工作2.1 数据库概念模型设计(1)进行需求分析。
-对系统的语义进行描述(包括功能、所需的数据及他们之间的关系和处理方法)(2)识别系统中的实体及实体的属性,分析实体之间的联系。
(3)设计数据库概念模型,画出E-R图。
2.2 数据库逻辑模型设计(1)根据数据库概念模型设计数据库的逻辑模型。
-将E-R模型转化到逻辑模型(2)根据应用需要和规范化理论对逻辑模型进行优化。
2.3 数据库物理模型设计(1)针对某种DBMS,设计数据库物理模型,包括表空间、表和索引等于物理存储有关的设计。
(2)优化物理模型(3)生成某种DBMS的SQL语句,创建数据库及其表。
2.4 装载数据(1)收集真实数据或者生成模拟数据。
(2)批量加载数据到数据库中。
(3)设计一系列SQL语句,尤其是连接查询、嵌套查询等SQL语句,已测试数据库性能。
3实验要求(1)可以借助POWERDESIGNER等系统分析与设计辅助工具进行数据库设计,也可以使用WORD文件直接生成各种设计文档。
(2)选择的数据库应用系统应该规模适中,不宜太大太复杂,可能做不完;也不宜太小太简单,甚至仅有三两个表组成。
(3)要设计良好的数据库完整性约束。
(4)思考题:数据库设计通常由哪些辅助工具?各有哪些优缺点?4实验步骤4.1 数据库概念模型设计(1)进行需求分析。
(2)设计数据库概念模型,画出E-R图。
4.2 数据库逻辑模型设计(3)根据数据库概念模型设计数据库的逻辑模型。
多媒体数据库实验6
云南大学软件学院实验报告序号:实验老师:秦江龙课程名称:多媒体数据库系统设计实验实验名称:高级数据库设计学号:姓名:课程名称多媒体数据库系统设计实验实验项目高级数据库设计实验目的1.熟悉数据库建模工具Visio的使用。
2.采用Cr ow’s Feet数据库建模方法,绘制出下列各数据库的ER图。
实验内容(算法、程序、步骤和方法)a)用一个数据为记录Billy Bob的游船公司(Boats)出售的游船信息。
需要存储名称、成本、出售价格、长度、船幅(宽度)及所有游船的制造商。
Billy Bob还想记录所有帆船的桅杆高度和龙骨类型(固定的或可收缩的)。
数据库还必须为所有机动船存储引擎大小(单位为马力)和引擎类型(舷内的、舷外的、或内外均有的)。
b)Hip Threads是一个成衣零售商,他想用一个数据库记录产品信息。
需要为每个产品保存名称和零售价格。
Hip Threads还为套装产品提供特殊价格,这些套装是由单独的成衣组成的。
例如,男人的休闲套装可能是由衬衫、裤子和腰带组成的。
这些套装是经过深思熟虑的产品。
一个成衣产品(例如衬衫)可能包含于多个套装中。
c)Cray的Casual Catering(临时餐饮业)为大量活动提供餐饮服务。
Cray想要设计一个数据库来存储关于活动和在每个活动中供应的食物(被称为食谱)的信息。
数据库必须存储用于每个活动和在每个活动的食谱。
Cary目前使用计划表单来记录服务于每个活动的相关信息。
下图是其中的一个例子:Cary还要存储关于每个客户的一些基本信息,包括名字、地址和电话号码。
对于个人客户,需要存储客户的名和姓。
对于公司客户,需要记录公司的名字。
目前,Cary使用食谱信息卡片来记录必要的信息。
下图显示的是这样的一个卡片的例子。
注意,不必存储食谱的制作方法。
指标等级 A B C D功能完整程序质量按时检查提问回答检查时间总评成绩下图显示的是另一个食谱信息卡片。
注意这个食谱将来自另一个例子的食谱Tapenade作为其成分之一。
数据库的设计实验报告
一、实验目的1. 理解数据库设计的概念、过程和步骤。
2. 掌握数据库概念结构、逻辑结构和物理结构的设计方法。
3. 能够运用E-R图进行数据库概念结构设计。
4. 能够运用SQL语句进行数据库逻辑结构和物理结构设计。
二、实验环境1. 操作系统:Windows 102. 数据库管理系统:MySQL 5.73. 开发工具:MySQL Workbench三、实验内容1. 数据库概念结构设计2. 数据库逻辑结构设计3. 数据库物理结构设计四、实验步骤1. 数据库概念结构设计(1)分析需求,确定实体和属性以“图书管理系统”为例,确定实体和属性如下:实体:图书、读者、借阅信息属性:- 图书:书名、作者、出版社、ISBN、出版日期、分类号、库存数量- 读者:读者编号、姓名、性别、出生日期、联系电话、邮箱、住址- 借阅信息:借阅编号、图书编号、读者编号、借阅日期、归还日期、状态(2)绘制E-R图根据实体和属性,绘制E-R图如下:```图书(书名,作者,出版社,ISBN,出版日期,分类号,库存数量)读者(读者编号,姓名,性别,出生日期,联系电话,邮箱,住址)借阅信息(借阅编号,图书编号,读者编号,借阅日期,归还日期,状态) ```2. 数据库逻辑结构设计(1)确定关系模式根据E-R图,确定关系模式如下:- 图书(书名,作者,出版社,ISBN,出版日期,分类号,库存数量)- 读者(读者编号,姓名,性别,出生日期,联系电话,邮箱,住址)- 借阅信息(借阅编号,图书编号,读者编号,借阅日期,归还日期,状态)(2)编写SQL语句创建表```sqlCREATE TABLE 图书 (书名 VARCHAR(100),作者 VARCHAR(50),出版社 VARCHAR(50),ISBN VARCHAR(20),出版日期 DATE,分类号 VARCHAR(10),库存数量 INT);CREATE TABLE 读者 (读者编号 VARCHAR(10),姓名 VARCHAR(50),性别 CHAR(1),出生日期 DATE,联系电话 VARCHAR(20),邮箱 VARCHAR(50),住址 VARCHAR(100));CREATE TABLE 借阅信息 (借阅编号 VARCHAR(10),图书编号 VARCHAR(10),读者编号 VARCHAR(10),借阅日期 DATE,归还日期 DATE,状态 VARCHAR(10));```3. 数据库物理结构设计(1)确定索引根据需求,确定索引如下:- 图书表:ISBN、分类号- 读者表:读者编号- 借阅信息表:借阅编号、图书编号、读者编号(2)编写SQL语句创建索引```sqlCREATE INDEX idx_isbn ON 图书(ISBN);CREATE INDEX idx_分类号 ON 图书(分类号);CREATE INDEX idx_读者编号 ON 读者(读者编号);CREATE INDEX idx_借阅编号 ON 借阅信息(借阅编号);CREATE INDEX idx_图书编号 ON 借阅信息(图书编号);CREATE INDEX idx_读者编号 ON 借阅信息(读者编号);```五、实验结果与分析1. 通过实验,掌握了数据库设计的概念、过程和步骤。
云南大学综合实践技能《常用数据库系统的安装和调试》实验报告
云南大学软件学院综合技能实践——《常用数据库系统的安装和调试》实验报告指导教师:蔡莉、朱艳萍第一部分MySQL数据库的安装和使用一、实验目的:1.掌握MySQL数据库环境搭建的具体步骤和操作方法。
2.掌握启动和运行MySQL的方法。
3.掌握使用SQL语句创建数据库、表及向表中插入记录的方法。
二、实验内容预习MySQL MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发、发布并支持的。
MySQL AB是由多名MySQL开发人创办的一家商业公司。
它是一家第二代开放源码公司,结合了开放源码价值取向、方法和成功的商业模型。
SQL语句的介绍结构化查询语言(Structured Query Language,SQL)是1974年由Boyce和Chamberlin提出的。
在IBM公司San Jose Research Laboratory研制的System R上实现了该语言。
SQL语言由以下几个部分组成:1、数据定义:(SQL DDL),用于定义SQL模式、基本表、视图、索引等。
2、数据操纵:(SQL DML),分为数据查询和数据更新两大类操作,其中数据更新包括插入、删除和更新三种操作3、数据控制:(SQL DCL),基本表和视图的授权、完整性规则的描述和事务控制语句等。
三、实验内容和步骤1、首先,查看本台机器的C盘根目录下是否有mysql的文件夹,如果没有,下载mysql-4.0.20a-win.zip文件,解压后进行安装。
2、进入安装目录,然后切换到bin文件夹下,双击运行命令mysqld.exe:3、打开命令窗口,然后切换到C:\mysql\bin文件夹下,并输入如下命令:C:\mysql\bin>mysql -u root -p回车后出现Enter password: 提示信息,继续敲入回车符,就进入到MySQL的工作界面:mysql>。
成功地连接后,可以在mysql>提示下输入QUIT (或\q)随时退出:mysql> QUITBye3、在mysql>提示符输入select version(), current_date();命令,系统将显示:4、下面,在mysql>提示下输入命令SHOW DATABASES; 系统将显示:5、在mysql>提示下输入命令use test; ,系统给出提示信息Database changed,表示已经转到数据库test中:6、在mysql>提示下输入命令show tables; ,系统给出的提示信息是:7、创建数据库、表和表中的记录。
2022年云南大学计算机科学与技术专业《数据库原理》科目期末试卷A(有答案)
2022年云南大学计算机科学与技术专业《数据库原理》科目期末试卷A(有答案)一、填空题1、在SELECT命令中进行查询,若希望查询的结果不出现重复元组,应在SEL ECT语句中使用______保留字。
2、在SQL Server 2000中,某数据库用户User在此数据库中具有对T 表数据的查询和更改权限。
现要收回User对T表的数据更改权,下述是实现该功能的语句,请补全语句。
_____UPDATE ON T FROM User;3、主题在数据仓库中由一系列实现。
一个主题之下表的划分可按______、______数据所属时间段进行划分,主题在数据仓库中可用______方式进行存储,如果主题存储量大,为了提高处理效率可采用______方式进行存储。
4、数据模型是由______________、______________和______________三部分组成。
5、从外部视图到子模式的数据结构的转换是由______________实现;模式与子模式之间的映象是由______________实现;存储模式与数据物理组织之间的映象是由______________实现。
6、安全性控制的一般方法有____________、____________、____________、和____________视图的保护五级安全措施。
7、数据仓库主要是供决策分析用的______,所涉及的数据操作主要是______,一般情况下不进行。
8、在RDBMS中,通过某种代价模型计算各种查询的执行代价。
在集中式数据库中,查询的执行开销主要包括______和______代价。
在多用户数据库中,还应考虑查询的内存代价开销。
9、以子模式为框架的数据库是______________;以模式为框架的数据库是______________;以物理模式为框架的数据库是______________。
10、已知系(系编号,系名称,系主任,电话,地点)和学生(学号,姓名,性别,入学日期,专业,系编号)两个关系,系关系的主码是______________,系关系的外码是______________,学生关系的主码是______________,外码是______________。
数据库实验报告(6)
数据库实验报告(6)一实验题目1.存储过程的定义和使用2。
触发器的创建和使用二实验目的1.掌握存储过程的定义、执行和调用方法。
2.掌握触发器的创建和使用。
三实验内容1.存储过程的定义和使用(1)创建存储过程查找姓李的学生的选修课成绩信息。
(2)创建一个存储过程,计算每个学生选修课的总分,并显示得分最高的三名学生的分数。
(3)创建一个存储过程以查找课程的最高分数(带有输入参数的存储过程)。
(4)创建一个存储过程来计算同学的平均分数并返回统计结果。
(带输入和输出参数的存储过程)(5)创建一个存储过程,计算选修课的数量,然后返回数字。
(6)用存储过程统计选修课,用存储值最多的学生。
(存储过程的嵌套)2.触发器的创建与使用(1)如果学分大于5,在为表格C插入新课程信息时,定义行前级别的触发学分uu触发器分,自动修改为5分。
(2)定义行后级别触发器。
当SC表的等级发生变化时,它将自动出现在等级变化表SC_uu增加日志中加一条新的纪录,该新纪录包括:操作者名称、操作日期、操作类型。
(3)建立一个delete触发器,针对于sc表,每次只能删除一条信息。
(4)创建不允许用户更改学号的更新触发器。
如果学生号被更改,将给出提示信息:学生号不允许更改。
(5)执行相应的SQL语句来触发上面定义的触发器。
(6)删除触发信用触发四实验步骤1.存储过程的定义和格式:createproc[edure]procedure_name[;number][{@parameterdata_type}[变化][=默认值][输出][with[用于复制]assql_statement[...n]创建存储过程以查找姓李的学生的选修课分数信息。
(1)创建存储过程,统计每个学生的选修课的总成绩,显示成绩最好的前3名学生成绩。
SC表的基本信息如图1所示:图表1代码:createprocp_sumscoreas从SCGroupByNo中选择Top 3Sum(成绩)作为总分execp_sumscore运行结果:命令已成功完成。
云南大学软件学院数据结构实验报告六
云南大学软件学院数据结构实验报告(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)实验难度:A□ B □ C ■序号学号姓名成绩12指导教师:(签名)学期:2012秋季学期任课教师:实验题目: 图及其应用小组长:联系电话:电子邮件:完成提交时间:2012年12月 20日云南大学软件学院2012学年秋季学期《数据结构实验》成绩考核表学号:姓名:本人承担角色:小组长综合得分:(满分100分)指导教师:年月日学号:姓名:本人承担角色:组员综合得分:(满分100分)指导教师:年月日(注:此表在难度为C时使用,每个成员一份。
)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)本实验要求设计一个校园导游系统,要求通过图这一数据结构计算两点之间的最短距离,实现校园导航功能。
首先要收集校园景点信息和景点之间的距离信息,然后利用图存储校园景点信息和景点之间的距离信息,最后使用Dijkstra算法计算最短路径。
离散数学相关知识:正确合理使用与或非之间的关系,进行程序分支判断,保证程序正常进行,以及图的使用。
二、【实验设计(Design)】(20%)本次实验使用C进行编写,自定义函数2个:void init_graph(graph *g)//图的初始化函数void shortest_path(graph *g,int s, int t,int n)//求最短路径的算法主函数为功能选择界面三、【实现描述(Implement)】(30%)主函数显示开始界面,选择相应的功能求最短路径。
人性化设计:1.在输入出现错误时例如功能选择错误时,程序会给出友好的提示;2. 界面友好,容易上手。
四、【代码】(10%)#include<iostream>#include<stdio.h>#include<stdlib.h>#include<windows.h>#define INFINITY 9999 //最大距离#define MAX_NODES 30 //最大结点数int dist[MAX_NODES][MAX_NODES]; //dist[i][j]表示i、j连线的权重int path[MAX_NODES];using namespace std;typedef struct VertexType{char* sight; //景点名称//char* info; //景点描述}VertexType; //定义顶点的类型typedef struct{int vexnum;VertexType vex[MAX_NODES];}graph;void init_graph(graph *g){int a,x,y=0;g->vexnum = 27;g->vex[0].sight="云大西二门";g->vex[1].sight="百家道";g->vex[2].sight="文典广场";g->vex[3].sight="云大会堂";g->vex[4].sight="中山邦翰楼";g->vex[5].sight="仰止楼";g->vex[6].sight="桦苑";g->vex[7].sight="楠苑";g->vex[8].sight="格物楼";g->vex[9].sight="楠苑体育场";g->vex[10].sight="知味堂";g->vex[11].sight="楠苑超市";g->vex[12].sight="综合服务楼";g->vex[13].sight="楸苑";g->vex[14].sight="力行楼";g->vex[15].sight="软件楼";g->vex[16].sight="校医院";g->vex[17].sight="明远楼";g->vex[18].sight="至公大道";g->vex[19].sight="行政办公楼";g->vex[20].sight="云大北门";g->vex[21].sight="文汇楼";g->vex[22].sight="余味堂";g->vex[23].sight="梓苑超市";g->vex[24].sight="梓苑";g->vex[25].sight="钟楼";g->vex[26].sight="校车乘车点";for(x=0;x<g->vexnum;x++)for(y=0;y<g->vexnum;y++)dist[x][y]=INFINITY;//下边是可直接到达的景点间的距离,由于两个景点间距离是互相的,所以要对图中对称的边同时赋值 dist[0][1]=dist[1][0]=10;dist[1][2]=dist[2][1]=20;dist[2][3]=dist[3][2]=20;dist[1][4]=dist[4][1]=50;dist[4][5]=dist[5][4]=200;dist[4][6]=dist[6][4]=130;dist[5][7]=dist[7][5]=600;dist[5][8]=dist[8][5]=800;dist[5][9]=dist[9][5]=600;dist[7][8]=dist[8][7]=100;dist[7][9]=dist[9][7]=600;dist[7][10]=dist[10][7]=150;dist[7][11]=dist[11][7]=110;dist[7][12]=dist[12][7]=100;dist[8][12]=dist[12][8]=80;dist[9][11]=dist[11][9]=700;dist[10][11]=dist[11][10]=5;dist[10][12]=dist[12][10]=50;dist[10][13]=dist[13][10]=150;dist[12][13]=dist[13][12]=100;dist[12][26]=dist[26][12]=20;dist[13][14]=dist[14][13]=200;dist[13][15]=dist[15][13]=250;dist[13][16]=dist[16][13]=700;dist[13][26]=dist[26][13]=100;dist[14][15]=dist[15][14]=20;dist[14][16]=dist[16][14]=500;dist[14][17]=dist[17][14]=1500;dist[16][17]=dist[17][16]=1300;dist[17][18]=dist[18][17]=50;dist[17][25]=dist[25][17]=300;dist[18][19]=dist[19][18]=30;dist[19][20]=dist[20][19]=100;dist[20][21]=dist[21][20]=950;dist[20][22]=dist[22][20]=900;dist[21][22]=dist[22][21]=150;dist[21][24]=dist[24][21]=110;dist[21][25]=dist[25][21]=750;dist[22][23]=dist[23][22]=40;dist[22][24]=dist[24][22]=120;dist[23][24]=dist[24][23]=60;dist[24][1]=dist[1][24]=300;}void shortest_path(graph *g,int s, int t,int n){struct state{int predecessor; //前驱节点int length; //到起始点的距离int label;}state[MAX_NODES];int i,k,min,mypath[MAX_NODES];struct state * p;for(p=&state[0]; p<&state[n]; p++){p->predecessor = -1;p->length = INFINITY;p->label = 0;}state[t].length = 0;state[t].label = 1;k = t; //当前工作结点do{for(i=0; i<n; i++){if(dist[k][i]!=0 && state[i].label==0){if(state[k].length+dist[k][i]<state[i].length){state[i].length = state[k].length+dist[k][i]; state[i].predecessor = k;}}}k=0;min=INFINITY;for(i=0; i<n; i++){if(state[i].label==0 && state[i].length<min){k=i;min=state[i].length;}}state[k].label = 1;}while(k!=s);i=0;k=s;do{path[i] = k;k = state[k].predecessor;mypath[i]=path[i];i++;}while(k>=0);for(i--;i>0;i--){printf("%s->",g->vex[mypath[i]].sight);}printf("%s\n",g->vex[mypath[i]].sight);printf("\n距离为%d m\n",min);}int main(){int m,s,e,c;graph g;g.vexnum = 27;init_graph(&g);printf("\n===========================================================\n");printf("\n 呈贡云南大学校园导游 \n");printf("\n\n");//打印景点列表for(m=0;m<g.vexnum;m++){printf("\t%2d:%s\t\t",m,g.vex[m].sight);if(++m<27&&m!=7)printf("\t%2d:%s\t\n",m,g.vex[m].sight);else if(m==7)printf("\t %d:%s\t\n",m,g.vex[m].sight);elseprintf("\n");}printf("\n===========================================================\n");printf("\n\t■■■■■■■■■■■■■■■■■\n");printf("\t■ ■\n");printf("\t■ 1、查询景点路径■\n");printf("\t■ ■\n");printf("\t■ 0、退出■\n");printf("\t■ ■\n");printf("\t■■■■■■■■■■■■■■■■■\n");while(1){printf("\n===========================================================\n");printf("\n请输入您的选择:");scanf("%d",&c);while(!(c==0||c==1)){printf("\n输入非法,请重新选择:\n");scanf("%d",&c);}switch(c){case 0:exit(0);case 1:printf("\n输入出发点与结束点:");scanf("%d %d",&s,&e);while(s<0||s>26||e<0||e>26||s==e){printf("\n输入非法,请重新选择:");scanf("%d %d",&s,&e);}printf("\n从“ %s ”到“ %s ”的最短路径为\n\n",g.vex[s].sight,g.vex[e].sight); shortest_path(&g,e,s,g.vexnum);break;}//switch}//whilereturn 0;}。
【实验六】大学计算机实验六
【实验六】大学计算机实验六实验报告课程名称:SQL Server 数据库基础任课教师:池宗琳实验名称:视图、规则和索引的使用年级、专业:2018级电子信息工程学号:***-*****199 姓名:苟诚日期:2019 年11 月13 日云南大学信息学院一、实验目的1、掌握视图的创建、修改和删除操作2、掌握规则的创建、绑定、解除和删除操作3、掌握索引的创建、修改和删除操作二、实验内容、方法、步骤和实验结果与分析(一)视图1. 创建视图view1,使该视图中包含HrSystem数据库中一个员工的明细信息(视图中的列名全部使用中文)。
use HrSystem go create view view1 as select e.Emp_id as 员工编号,e.Emp_name as 员工姓名,e.Sex as 性别,e.Title as 职务,e.Wage as 工资,e.IdCard as 身份证,d.Dep_id as 部门编号from Employees e inner join Departments d on e.Dep_id =d.Dep_id 2. 显示第1题创建的视图view1的所有数据。
use HrSystem go select all * from view1 go 3. 利用第1题创建的视图view1,列出视图中所有姓李的员工的所有信息。
use HrSystem go select all * from view1 where 员工姓名='李%'go 4. 使用ALTER VIEW修改第1题创建的视图view1,使其只包含所有员工的姓名、职务和部门三列(视图中的列名全部使用中文)。
use HrSystem go alter view view1 as select e.Emp_name as 员工姓名,e.Title as 职务,d.Dep_name as 部门名字from Employees e inner join Departments d on e.Dep_id =d.Dep_id go 5. 删除以上创建的视图view1。
数据库实验7 数据库设计实验
实验7 数据库模型的设计与建立1.一、实验目的:2.了解数据库设计概念设计中的基本知识: 如实体、属性、联系集…3.能解决设计中常见问题: 如把一个对象转化成实体还是属性4.使学生能独立完成数据库模式的设计, 包括各表的结构(属性名、类型、约束和关键字等)及表之间的关系以及其连接方式, 在选定的DBMS上建立数据库表。
5.熟悉数据库建模工具的使用(PowerDesigner)二、实验要求:1. 认真阅读业务需求, 作出E-R图, 并依据设计原则对数据库结构的设计务必做到最优化2. 在选定的DBMS上建立数据库, 比较手工输入SQL建立数据库与用建模工具自动生成数据库的优缺点三、实验环境及学时安排:1. OFFICE, POWERDESIGN112.SQL SERVER20003. 学时: 3学时四、实验内容:以完成学生选课系统的数据库设计为例。
如: 某学院有基本实体集: 系、教师、学生和课程。
1.它们各有属性:系: 系编号、系名, 位置课程: 课程号, 课程名称, 开课学期学生: 学生学号, 学生姓名、性别、地址教师:员工号, 教师姓名, 办公室2.有如下语义设定每个系有一位系主任, 有多位教师;一个教师仅在一个系任职;每个系开设多门不同课程;每门课程由多位教师授课;一位教师可教多门课程一个学生可以选修多门课程。
一门课程可以供多位学生选修3.存在联系有:1对1: 系与系主任(系主任是教师)1对多: 系与教师、系与课程多对多: 学生与课程,教师与课程五、实验任务及步骤:1.实验准备1)根据需求建立ER模型:ER模型的组成:实体属性联系连接2)ER模型转换为数据库表●实体转化为表●实体的属性转化为表中的列●多对多联系也转化为表, 主键确定为相联系表中主键的组合, 联系本身的属性转化为表的列一对一、一对多联系无需新建表, 被决定的一方应含有决定方的主键作为外部键3)利用power designer建立所要求的数据库2.实验操作1)新建word文件, 并保存为ER.doc2)分析需求, 画出上述关系的E-R 图(word) 3) 根据ER 模型进行数据库的逻辑结构设计: (建模工具PowerDesign 建立phisical data model) 六、实验结果按照需求绘制E-R 图如下:完整的实体-联系E-R 图如下:建立数据库模型(概念数据模型)如下:n mn mn 111系 教师学生课程系-老师教授选修系主任系编号 系名 位置员工号教师姓名办公室课程号课程名开课学期学号姓名性别地址物理数据模型如下:。
云南大学实验六数据库完整性报告
云南大学软件学院实验报告课程:数据库原理与实用技术实验任课教师:刘宇、张璇姓名:学号:专业:信息安全成绩:实验6 数据库完整性实验6-1 完整性约束1、创建规则(用图形或者语句方法创建)(1)创建入学日期规则“Enter_University_date_rule”,假定该学校于1923年4月30日创建。
要求:入学日期必须大于等于学校创建日期,并且小于等于当前日期测试:(2)创建学生年龄规则“Age_rule”。
要求:学生年龄必须在15~30岁之间测试:(3)创建学生性别规则“Sex_rule”。
要求:性别只能为“男”或“女”测试:《数据库原理与实用技术》实验3 / 21(4)创建学生成绩规则“Score_rule ”。
要求:学生成绩只能在0~100之间(5)用图形方法查看学生成绩规则“Score_rule ”,截图为:双击:成绩:(6)用语句方法查看学生成绩规则“Score_rule ”,语句为:2、删除规则Enter_University_date_rule3、创建默认(用图形或者语句方法创建)(1)创建默认时间“Time_default”为当前系统时间(2)创建默认入学年龄“Age_default”为18岁(3)用图形方法查看默认入学年龄“Age_default”,截图为:《数据库原理与实用技术》实验5 /21(4)用语句方法查看默认入学年龄“Age_default ”,语句为:4、删除默认入学年龄“Age_default ”5、创建声明式默认:在创建表的过程中创建声明式默认 (1)创建表“default_example ”,表中包含字段pid 、name 、sex 、age 。
要求设定sex 的默认值为“男”、age 的默认值为18。
编号 姓名 性别 年龄 101 苏晴 女 201马拯山20执行结果为:输入数据:获取数据结果为:(2)在表中增加新的默认,将编号默认为100。
插入一条记录,执行结果为:6、在“学生管理数据库”各个数据表中建立相应的主键、外键、惟一值、以及check约束,要求:学生的年龄必须是两位数,其中第一位是1或2:学生表如下:《数据库原理与实用技术》实验授课表如下课程表如下:7/ 21成绩表如下:删除check 约束:学生表的:《数据库原理与实用技术》实验9/21授课表的:课程表的:成绩表的:7、完成教科书456页如下习题:[7.1]a:实验6-2 触发器《数据库原理与实用技术》实验11 / 211、使用触发器(1)创建一个触发器trig_update ,返回对“学生表”进行更新操作后,被更新的记录条数(2)执行触发器(3)修改触发器trig_update ,除返回被更新的记录条数外,再返回学生的所有基本信息2、使用触发器的两个特殊表:插入表(inserted)和删除表(deleted)。
实验报告_精品文档
数据库应用系统开发指导书实验1: 需求分析------大学生选课管理系统☐ 1. 实验内容说明:☐教务处的管理人员录入全校的课程基本信息和本学期的课程授课教师、地点、时间;☐在学生入学的时候, 学院的管理人员录入学生基本信息;☐学生每学期自己上网登录系统选课, 选课成功后信息存入数据库中, 学生自己可以查询选课的情况;☐学生选课不成功的情况有:☐所选课程的先修课还没有记录, 系统提示“缺先修课, 选课失败”;☐本学期所选课程的上课时间有冲突, 系统提示“上课时间有冲突, 选课失败”;☐学生一学期所选课程的学分最多不能超18学分☐学生可以注销所选课程。
☐学院管理员可以查询学生前几学期的选课信息、可以查询课程基本信息、学生基本信息;☐当学生退学时, 由教务处的管理人注销学生基本信息;☐如果开课之后, 学生要求退课, 则由教务处的工作人员为学生注销所选课程;☐允许学生休学, 教务处为休学的退学做学籍冻结处理;复学后为其办理解冻处理;☐每学期教务处为学生办理学期注册手续;没有办理学期注册的学生不能选课;学期末, 学院工作人员负责录入学生的成绩。
1)2. 实验目的2)通过本实验使学生掌握结构化需求分析的方法、过程和相应的文档内容与格式。
特别是熟悉数据流程图、数据字典和IPO图三个核心技术的应用。
3. 实验学时:4学时1)4. 实验步骤2)结合实验内容说明, 对现有的学生选课系统进行必要的调研, 了解基本的工作流程、软件功能、数据需求和界面风格。
3)分析实验内容说明和调研结果, 画出系统的数据流程图。
4)编写系统的数据字典。
5)用IPO图描述系统的处理过程。
6)画出系统ER图。
5. 实验结果实验结果包括:1)一份需求分析说明书, 至少包括以下内容:2)数据流程图。
3)数据字典。
4)系统的ER图。
实验2: 系统设计------选课管理系统设计1)1. 实验内容说明:2)对实验1的结果进行概要设计和详细设计, 画出功能模块图。
云南大学软件学院数据库实验7:DB2_Customization
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:2011-2012学年第二学期任课教师:专业:学号:姓名:成绩:Exercise 1_DB2 Customization Section 2 - Creating a New User ID1. Use the User Manager application to create your new user ID called inst1. Answer:1) create your new user ID called inst1.(用户名:inst1全名:inst1 Instance SysAdmin描述:System Administrator for INST1 Instance密码:inst1用户组:Administrators)右击计算机,选择管理,.2)更改inst1的账户类型在控制面板里,. Section 4 - Creating the Instance1. Open up a DB2 Command Window and issue the following command: db2ilist Record the output:Answer:在开始菜单里找到IBM的DB2,打开命令行工具输入db2ilist,查看主机的实例得:2. For your lab environment, you will create another instance called INST1. (创建称为inst1 的新实例)Answer:在命令窗口中输入如下命令:1)输入db2icrt inst1,创建称为inst1 的新实例2)查看你所创建的新实例inst1输入db2ilist后显示:3. Reissue the command to list your instances. Now which instances are listed?Answer:实例有:inst1 和DB2,Section 5 - Creating the DB2 System Administrator Group(建立DB2 系统管理员用户组)按以下要求建立DB2 系统管理员用户组adm1(adm1 应小写而且),并且使inst1 和db2admin成为该组成员组名:adm1描述:inst1 Instance SysAdmin Group可以桌面上,右击“计算机”,选择“管理”,右如下界面创建新组adm1(adm1 应小写而且),并且使inst1 和db2admin成为该组成员,同样,先建adm1再按照要求添加那2个用户,就可以了结果:Section 6 - Setting the Environment1. Perform the following tasks to check your DB2 environment variables.What is the DB2INSTANCE (default instance) Value in System Variables?Answer:做如下的选择Change the system variable value of DB2INSTANCE to INST1.所以,没有包含X:\SQLLIB\BIN2. Do the following to verify your DB2 environment variables are correct. Answer:选择开始菜单—>程序—>附件—>命令提示符;输入: set | more3. Check the values of your registry variables(注册变量表) (hint: use db2set on aDB2 Command Window).在DB2的命令窗口中What is the value for your DB2 Administration Server?Answer:4. What is your system name?Answer:Section 7 - Exploring and Setting Database Manager Configuration Parameters4. Record the following values:(打开控制中心,按照要求去找)a. Does the AUTHENTICATION parameter have a value (look under theAdministration)? What is the purpose of this parameter? What are the possible values for this parameter?answer:b. Does the SYSADM_GROUP parameter have a value (look underAdministration)? What is the value of this parameter? What is the hint associated with it?answer:c. What is the value of NODETYPE (look under Environment) answer:。
云南大学数据库期末大作业:数据库设计
云南大学软件学院实验报告课程:数据库原理与实用技术实验学期:任课教师:专业:学号:姓名:成绩:期末大作业:Electronic Ventor 数据库设计一、实验目的(1)掌握数据库设计的基本方法(2)掌握各种数据库对象的设计方法(3)熟练掌握DBA必须具备的技能二、实验内容1、根据项目的应用和项目的需求说明文档,进行详细的需求分析,给出需求分析的结果。
(1)客户可以在网站上注册,注册的客户要提供客户的姓名、电话、地址,以方便售后和联系,姓名即作为用户名,和密码一起用于注册和登录,客户编号可唯一识别用户,卡号可网上支付。
其中地址、电话以方便联系和寄货;(2)网站管理员可以登记各种商品,供客户查询,订购。
登记商品时要提供商品的名称、价格,商店中现有商品量,商品编号可唯一识别商品;(3)类别表示商品所属类别,类别编号可唯一识别类别,其中包含了,商品类别名称和制造厂商,可以对商品进行分类售卖;(4)客户可以在网上下订单,也可以到实体店购物,其在订单上所选择的支付方式不同(信用卡、借记卡、现金,现金代表实体店购物),网站管理员可以查看订单,并及时将订单的处理情况更新(比如货物已寄出的信息,订单状态:0:未处理,1:已处理,2:已发货);订单编号可唯一识别订单,订单中包含订单产生时间,订单状态,支付方式和支付总额;(5)实体商店有自己的店名,卖多种商品,每个商店都有固定的地址,顾客可以到店中买商品,(注:在实体店中购买商品的顾客一律将顾客名默认为佚名),当商店中的库存量小于10时会有提醒到仓库中拿货;(6)配送单中包含查询号可唯一识别配送单,配送人,联系方式;(7)仓库中仓库编号可唯一识别仓库,其中每个仓库都有区号,代表其地址。
(8)各实体间关系1)一个客户可以购买多种商品,一种商品可以被多个客户购买;2)一个商品属于且仅属于一种类别,一种类别的商品可以包含多个商品或没有;3)一种商品放在多个商店中销售,一个商店至少销售一种或销售多种商品;4)一个订单对应一个客户,一个客户对应多个订单;5)一个订单对应至少有一件商品或多件,一个商品对应多个订单;6)一个订单可以有一个商品配送单7)一个仓库可以存放多种商品,一种商品可以存放在一个仓库;2、数据库逻辑设计:用文字简要描述实体之间的联系,画出E-R图(标出各联系中实体的基数)。
数据库原理及应用实验报告 6
实验成绩《数据库系统原理及应用》实验报告六专业班级: 计算机科学与技术学号: 3姓名: 范晓曈指导教师: 苏小玲2013年11 月21 日实验六名称:SQL Server存储过程一、实验内容及要求1.使用输入参数存储过程的创建和执行任务1:查询学生的学号、姓名、选修的课程号、课程名、课程学分,将学生所在系作为输入参数,默认值为“软件工程系”。
执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
2.修改视图任务1:查询指定系的男生人数,其中系为输入参数,人数为输出参数。
执行此存储过程,并分别指定一些不同的输入参数值,查看执行过程。
任务2:查询指定学生(姓名)在指定学期的选课门数和考试平均成绩,要求姓名和学期为输入参数,选课门数和平均成绩用输出参数返回,平均成绩保留到小数点后两位。
3.使用返回代码存储过程的创建和执行任务1:查询指定学生(学号)的选课门数。
如果指定学生不存在,则返回代码1;如果指定的学生没有选课,则返回代码2;如果指定学生有选课,则返回代码0,并用输出参数返回该学生的选课门数。
4.使用实现对数据库修改、删除和插入操作的存储过程创建和执行任务1:删除指定学生(学号)的修课,如果指定的学生不存在,则显示提示信息“没有指定学生”;如果指定的学生没有选课,则显示提示信息“该学生没有选课”。
学号为输入参数。
任务2:修改指定课程的开课学期。
输入参数为:课程号和修改后的开课学期。
任务3:在course表中插入一行数据,课程号、课程名、学分、开课学期均为输入参数。
课程号为C100、课程名为操作系统、学分为4、开课学期为4,开课学期的默认值为3。
如果学分大于10或者小于1,则不插入数据,并显示提示信息“学分为1~10之间的整数”。
二、实验目的掌握存储过程的创建和执行;掌握存储过程中输入参数和输出参数的设置和使用方法。
三、实验步骤及运行结果1.使用输入参数存储过程的创建和执行任务1:查询学生的学号、姓名、选修的课程号、课程名、课程学分,将学生所在系作为输入参数,默认值为“软件工程系”。
云南大学_数字电路与逻辑设计实验六实验报告
数字电路与逻辑设计实验六实验报告信息学院一、实验目的1、熟悉MSI时序器件74LS160、74LS194的逻辑功能和使用方法2、掌握MSI时序逻辑电路的分析方法二、实验仪器及设备1、直流稳压电源、数字逻辑电路实验箱、万用表、示波器2、74LS00、74LS02、74LS04、74LS74、74LS76(或74LS112)三、实验内容及步骤1.数码显示电路2.同步十进制计数器用74LS160和74LS48芯片建立如图5-3所示的实验电路(74LS160引脚编号旁边标注的是对应引脚的逻辑名称之别名)。
图5-3计数器的时钟脉冲输入端CP接单脉冲,进位输出端Oc、计数输出端、、、各接一个LED,并且最好按照从左到右的顺序排列(为什么?)。
让74LS160从=0000(十进制数“0”)开始工作(如何做到?),按动单脉冲按钮逐个送入计数脉冲。
每送入一个脉冲就记下相应的时钟脉冲数以及输出端、、、、的状态变化和数码管显示出的数字(应与时钟脉冲数相等)。
送入第十个脉冲时,计数器应当回复到全0状态。
整理结果,画出74LS160的计数时序波形图。
3.双向移位寄存器图5-5所示为集成双向移位寄存器74LS194的逻辑功能测试图,同样在芯片引脚编号旁边标注了引脚逻辑功能的别名(没有标注的即为暂无别名)。
74LS194的逻辑功能较为复杂,实验中使用的逻辑开关较多,建议所用逻辑开关的排列顺序与原理图中的顺序相同,以便操作记忆。
如图建立实验电路,模式选择输入端、、清零输入端(也就是端)、移位方向控制输入端、分别接到五只逻辑开关,时钟脉冲输入端CP(也就是CLK端)接到单脉冲,在并行数据输入端~(也就是图中的DCBA端)上加载数据=1011,寄存器输出端~(也就是图中的端)分别接到四只LED。
先将74LS194的计数清零,用同步置数功能,将输出端~置为并行输入数据1011.改变并行数据,重复一次实验,记录实验过程和结果。
将计数清零,用右移功能,用四个单脉冲,将输出端~按0000→0001→0010 0101→1011的顺序最终得到=1011的状态,记录实验过程和结果。
云南大学软件学院数据结构实验6
云南大学软件学院数据结构实验6预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制实验难度:A □ B □ C □学期:2017秋季学期任课教师:实验题目:组员及组长:承担工作:联系电话:电子邮件:完成提交时间:年月日一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计等相关知识,对问题进行概要性地分析)1.基本思路:用无向网表示校区内的各建筑的平面图,图中顶点表示主要建筑,存放建筑的编号、名称、简介等信息,图中的边表示建筑间的道路,存放路径长度等信息,将导游图看作一张带权无向图,顶点表示校园的各个建筑,边表示各建筑之间的道路,边上的权值表示距离;根据用户的输入信息用迪杰斯特拉算法计算出任意两个地点之间的最短路径,并用二维数组来存储相关的信息,输出给用户;同时用数组存储各个地点的相关信息,当用户输入要了解的地点名称是,调用相关函数输出该地点的相关信息给用户。
2、在程序中运用到了图的相关知识以及迪杰斯特拉算法和哈密尔顿图的遍历等,无向图的相关知识和相关操作,还有图的存储及相关的数据结构。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的定义和基本操作说明,程序包含的模块以及各模块间的调用关系,关键算法伪码描述及程序流程图等,如有界面则需包括界面设计,功能说明等)主程序模块:该模块包含一个main函数,在main函数中调用其他函数和子程序。
int main(){int v0, v1;int i, num;char flag;Create(NUM, 11);do{flag = Menu();switch (flag){case'1':system("cls");//清空屏幕的当前内容List();//输出景点列表printf("\请选择起点景点(0~26):");scanf("%d", &v0);printf("\请选择终点景点(0~26):");scanf("%d", &v1);ShortPath(v0);//求出最短路径Output(v0, v1);//输出结果printf("\请按任意键继续...\");getchar();//利用getchar()函数让程序运行到上一行时,等待下下一个按键时才返回getchar();break;system("cls");List();printf("\请输入您要查找的景点编号:"); scanf("%d", &num);for (i = 0; i<="" p="">{if (num == g.vex[i].number){printf("\你要查找的景点信息如下:"); printf("\%s:", g.vex[i].sight);printf("%s\\", g.vex[i].description); printf("\按任意键返回...");getchar();getchar();break;}}if (i == NUM){printf("\没有找到!");printf("\按任意键返回...");getchar();getchar();}break;case'e':exit(0);}} while (flag != '0');}流程图:子程序模块包括:地点列表函数、输出函数、哈密尔顿图的遍历函数、迪杰斯特拉算法判断最短路径函数、创建图的函数。
云南大学软件学院计算机网络原理实验六实验报告3
实验六、传输层可靠传输协议GBN编程实验报告序号:姓名:学号:成绩指导老师:一、实验目的:1、通过编写实现一个简单可靠的数据传输协议GBN的发送和接收代码,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
二、实验指导:参考教材。
动画演示:三、实验要求:编程实现一个GBN传输协议的发送方和接收方两程序,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.1.实验流程图如下:N2.实验截图与代码如下: 截图: 传送下一个数据包结束代码及注释:一、GBN.h#pragma once#include <stdio.h>//基础功能模块的数据结构声明#define BIDIRECTIONAL 1 /* change to 1 if you're doing extra credit andwrite a routine called B_output *//* a "msg" is the data unit passed from layer 5 (teachers code) to layer4 (students' code). It contains the data (characters) to be delivered tolayer 5 via the students transport level protocol entities. */struct msg{ char data[20];};/* a packet is the data unit passed from layer 4 (students code) to layer3 (teachers code). Note the pre-defined packet structure, which allstudents must follow. */struct pkt{int seqnum;int acknum;int checksum;char payload[20];};#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1//网络仿真部分数据结构声明***********************************************************struct event{float evtime; /* event time */int evtype; /* event type code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */ struct event *prev;struct event *next;};/* possible events: */#define TIMER_INTERRUPT 0#define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1//基础功能模块的函数声明******************************************************************* void ComputeChecksum(struct pkt *packet);//计算校验和int CheckCorrupted(struct pkt packet);//检查数据是否出错void A_output( struct msg message);//A端向外发送数据void A_input(struct pkt packet);//A端接收数据void A_timerinterrupt();//A计时器超时void A_init();//A端初始化void B_output(struct msg message);void B_input(struct pkt packet);void B_timerinterrupt();void B_init();//网络仿真部分的函数声明**************************************************void init(); //初始化仿真器float jimsrand();//随机数发生器[0,1]//处理事件列表部分的函数声明*********************************************void generate_next_arrival();//产生下一个到达的分组void insertevent(struct event *p);//向事件列表中插入一条新的事件void printevlist();//打印事件列表//******************************************************************** //**********************计时器模块*********************************** void stoptimer(int);//停止计时器void starttimer(int,float);//启动计时器//******************************************************************** *//**************************网络各层之间传送模块***********************void tolayer3(int AorB,struct pkt packet);//向第3层发送信息void tolayer5(int AorB,char datasent[20]);//向第5层发送信息二、GBN.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE = 1; /* for my debugging */为我的调试extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从5到4extern int nsimmax = 0; /* number of msgs to generate, then stop */如果信息产生的数字为0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped*/这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number co rrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0; /* expected se quence number at receiver side */在接收者这边接收到预期的序列数据static int nextseqnum; /* next sequence number to use in sender side */下一个序列数据使用在发送者这边static int base; /* t he head of sender window */发送者的头窗口struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */数据包缓冲区窗口static int winfront,winrear; /* front and rear points of wind ow buffer */窗口缓冲区的前方点和后方点static int pktnum; /* packet number of window buffer */窗口缓冲区的数据包个数struct msg buffer[MAXBUFSIZE]; /* sender message buffer */发送消息缓冲区int buffront,bufrear; /* front and rear pointers of buffer */缓冲区的前指针与后指针static int msgnum; /* message number of buffer */信息数量的缓冲int packet_lost =0;int packet_corrupt=0;int packet_sent =0;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list *///计算校验和void ComputeChecksum( struct pkt *packet){int checksum;int i;checksum = packet->seqnum;checksum = checksum + packet->acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet->payload[i]);checksum = 0-checksum;packet->checksum = checksum;}//检查是否出错int CheckCorrupted(struct pkt packet){int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i<20; i++ )checksum = checksum + (int)(packet.payload[i]);if ( (packet.checksum+checksum) == 0 )return (FALSE);elsereturn (TRUE);}//A端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void A_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* update state variables */nextseqnum = nextseqnum+1;starttimer(A,RTT);B_input(sendpkt);A_input(sendpkt);}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//B端向外发送数据/* called from layer 5, passed the data to be sent to other side */ void B_output(struct msg message){int i;struct pkt sendpkt;/* if window is not full */if ( nextseqnum < base+WINDOWSIZE ){printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = message.data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (A, sendpkt);A_input(sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;pktnum ++;winbuf[winrear] = sendpkt;for (i=0; i<20; i++)winbuf[winrear].payload[i]= sendpkt.payload[i];/* if it is the first packet in window, start timeout */ //if ( base == nextseqnum )//{//starttimer(A,RTT);//printf("----A: start a new timer!\n");// }/* update state variables */nextseqnum = nextseqnum+1;}/* if window is full */else{printf("----A: New message arrives, send window is full,");/* if buffer full, give up and exit*/if ( msgnum == MAXBUFSIZE){printf (" Error: Sender buffer is full! \n");exit (1);}/* otherwise, buffer the message */else{printf("buffer new message!\n");bufrear = (bufrear+1) % MAXBUFSIZE;for (i=0; i<20; i++)buffer[bufrear].data[i] = message.data[i];msgnum ++;}}}//A端接收数据void A_input(struct pkt packet){struct pkt sendpkt;int i;/* if received packet is not corrupted and ACK is received */if ( (CheckCorrupted(packet) == FALSE) && (packet.acknum != NACK) ) {printf("----A: ACK %d is correctly received,",packet.acknum);packet_correct++;/* delete the acked packets from window buffer */winfront = (winfront+(packet.acknum+1-base)) % WINDOWSIZE; pktnum = pktnum - (packet.acknum+1-base);/* move window base */base = packet.acknum+1;stoptimer(A);if ( base < nextseqnum){//starttimer(A,RTT);printf ("\n\n\nsend new packets!");}/* if buffer is not empty, send new packets */while ( (msgnum!=0) && (nextseqnum<base+WINDOWSIZE) ) {/* create packet */sendpkt.seqnum = nextseqnum;sendpkt.acknum = NOTUSED;buffront = (buffront+1) % MAXBUFSIZE;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = buffer[buffront].data[i];/* computer checksum */ComputeChecksum (&sendpkt);/* if it is the first packet in window, start timeout */if ( base == nextseqnum ){//starttimer(A,RTT);printf ("send new packets!\n");}/* send out packet */tolayer3 (A, sendpkt);/* copy the packet to window packet buffer */winrear = (winrear+1)%WINDOWSIZE;winbuf[winrear] = sendpkt;pktnum ++;/* update state variables */nextseqnum = nextseqnum+1;/* delete message from buffer */msgnum --;}}elseprintf ("----A: NACK is received, do nothing!\n");}//B端接收数据*****************************************************一定要调用这个/* Note that with simplex transfer from a-to-B, there is no B_output() */ /* called from layer 3, when a packet arrives for layer 4 at B*/void B_input(struct pkt packet){struct pkt sendpkt;int i;/* if not corrupted and received packet is in order */if ( (CheckCorrupted(packet) == FALSE) && (packet.seqnum == expectedseqnum)){printf("\n----B: packet %d is correctly received, send ACK!\n",packet.seqnum);/* send an ACK for the received packet *//* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = expectedseqnum;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet *///tolayer3 (B, sendpkt);/* update state variables */expectedseqnum = expectedseqnum+1;printf("----B:expectedseqnum = %d\n",expectedseqnum);/* deliver received packet to layer 5 *///tolayer5(B,packet.payload);}/* otherwise, discard the packet and send a NACK */else{printf("----B: packet %d is corrupted or not I expects, send NACK!\n",packet.seqnum);/* create packet */sendpkt.seqnum = NOTUSED;sendpkt.acknum = NACK;for ( i=0; i<20 ; i++ )sendpkt.payload[i] = '0';/* computer checksum */ComputeChecksum (&sendpkt);/* send out packet */tolayer3 (B, sendpkt);}}//A计时器超时/* called when A's timer goes off */void A_timerinterrupt(){int i;printf("----A: time out,resend packets!\n");/* start timer */starttimer(A,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(A,winbuf[(winfront+i)%WINDOWSIZE]);}}//B计时器超时/* called when B's timer goes off */void B_timerinterrupt(){int i;printf("----B: time out,resend packets!\n");/* start timer */starttimer(B,RTT);/* resend all packets not acked */for ( i=1; i<=pktnum; i++ ){packet_resent++;tolayer3(B,winbuf[(winfront+i)%WINDOWSIZE]);}}//A端初始化/* entity A routines are called. You can use it to do any initialization */void A_init()base = 0;nextseqnum = 0;buffront = 0;bufrear = 0;msgnum = 0;winfront = 0;winrear = 0;pktnum = 0;}//B端初始化/* entity B routines are called. You can use it to do any initialization */void B_init(){expectedseqnum = 0;}//初始化仿真器void init() /* initialize the simulator */{int i;float sum, avg;float jimsrand();FILE *fp;fp = fopen ("parameter.txt","r");printf("----- Stop and Wait Network Simulator Version 1.1 -------- \n\n");printf("Enter the number of messages to simulate: ");//fscanf(fp,"%d",&nsimmax);scanf("%d",&nsimmax);printf("\nEnter packet loss probability [enter 0.0 for no loss]: "); //fscanf(fp, "%f",&lossprob);scanf("%f",&lossprob);printf("\nEnter packet corruption probability [0.0 for no corruption]: "); //fscanf(fp,"%f",&corruptprob);scanf("%f",&corruptprob);printf("\nEnter average time between messages from sender's layer5 [ > 0.0]: ");//fscanf(fp,"%f",&lambda);scanf("%f",&lambda);printf("\nEnter TRACE: ");//fscanf(fp,"%d",&TRACE);scanf("%d",&TRACE);printf("\n\n");srand(9999); /* init random number generator */sum = 0.0; /* test random number generator for students */for (i=0; i<1000; i++)sum=sum+jimsrand(); /* jimsrand() should be uniform in [0,1] */avg = sum/1000.0;/*if(avg < 0.25 || avg > 0.75){printf("It is likely that random number generation on your machine\n" ); printf("is different from what this emulator expects. Please take\n"); printf("a look at the routine jimsrand() in the emulator code. Sorry. \n");exit(0);}*/printf("%f",avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */}//随机数发生器float jimsrand(){double mmm = 2147483647; /* largest int - MACHINE DEPENDENT */float x; /* individual students may need to change mmm */x = rand()/mmm; /* x should be uniform in [0,1] */return(x);}//**************************************************************************************//*******************************事件处理部分*******************************************void generate_next_arrival(){double x,log(),ceil();struct event *evptr;float ttime;int tempint;//if (TRACE>2)//printf("-----------------GENERATE NEXT ARRIVAL: creating new arrival\n");x = lambda*jimsrand()*2; /* x is uniform on [0,2*lambda] *//* having mean of lambda */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + x;evptr->evtype = FROM_LAYER5;if (jimsrand()<0.5){evptr->eventity = A;}evptr->eventity = B;insertevent(evptr);}//向事件列表中插入一条新的事件void insertevent(struct event *p){struct event *q,*qold;if (TRACE>2){//printf(" INSERTEVENT: time is %lf\n",time);//printf(" INSERTEVENT: future time will be %lf\n",p->evtime);}q = evlist; /* q points to front of list in which p struct inserted */if (q==NULL)/* list is empty */{evlist=p;p->next=NULL;p->prev=NULL;}else{for (qold = q; q !=NULL && p->evtime > q->evtime; q=q->next) qold=q;if (q==NULL)/* end of list */{qold->next = p;p->prev = qold;p->next = NULL;}else if (q==evlist)/* front of list */p->next=evlist;p->prev=NULL;p->next->prev=p;evlist = p;}else /* middle of list */{p->next=q;p->prev=q->prev;q->prev->next=p;q->prev=p;}}}//打印事件列表void printevlist(){struct event *q;int i;printf("--------------\nEvent List Follows:\n");for(q = evlist; q!=NULL; q=q->next){printf("Event time: %f, type: %d entity: %d\n",q->evtime,q->evtype,q->eventity);}printf("--------------\n");}//启动计时器void starttimer(int AorB,float increment){struct event *q;struct event *evptr;if (TRACE>2)printf("\n----A: START TIMER: starting timer at %f\n",time);/* be nice: check to see if timer is already started, if so, then warn *//* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) ){//printf("Warning: attempt to start a timer that is already started\n");return;}/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtime = time + increment;evptr->evtype = TIMER_INTERRUPT;evptr->eventity = AorB;insertevent(evptr);}//停止计时器/* called by students routine to cancel a previously-started timer */ void stoptimer(int AorB) /* A or B is trying to stop timer */{struct event *q,*qold;if (TRACE>2)printf("\n----A: STOP TIMER: stopping timer\n");/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==TIMER_INTERRUPT && q->eventity==AorB) )/* remove this event */{if (q->next==NULL && q->prev==NULL)evlist=NULL; /* remove first and only event on listelse if (q->next==NULL) /* end of list - there is one in front */ q->prev->next = NULL;else if (q==evlist) /* front of list - there must be event after */{q->next->prev=NULL;evlist = q->next;}else /* middle of list */{q->next->prev = q->prev;q->prev->next = q->next;}free(q);return;}//printf("Warning: unable to cancel your timer. It wasn't running.\n");}//向第三层发送信息/************************** TOLAYER3 ***************/void tolayer3(int AorB,struct pkt packet){struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3++;/* simulate losses: */if (jimsrand() < lossprob){nlost++;if (TRACE>0)printf(" TOLAYER3: packet being lost\n");return;}/* make a copy of the packet student just gave me since he/she may decide *//* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt));mypktptr->seqnum = packet.seqnum;mypktptr->acknum = packet.acknum;mypktptr->checksum = packet.checksum;for (i=0; i<20; i++)mypktptr->payload[i] = packet.payload[i];if (TRACE>2){printf(" TOLAYER3: seq: %d, ack %d, check: %d ", mypktptr->seqnum,mypktptr->acknum, mypktptr->checksum);for (i=0; i<20; i++)printf("%c",mypktptr->payload[i]);printf("");}/* create future event for arrival of packet at the other side */evptr = (struct event *)malloc(sizeof(struct event));evptr->evtype = FROM_LAYER3; /* packet will pop out from layer3 */ evptr->eventity = (AorB) % 2; /* event occurs at other entity */evptr->pktptr = mypktptr; /* save ptr to my copy of packet *//* finally, compute the arrival time of packet at the other end. medium can not reorder, so make sure packet arrives between 1 and 10 time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL && q->next!=NULL; q = q->next) */for (q=evlist; q!=NULL ; q = q->next)if ( (q->evtype==FROM_LAYER3 && q->eventity==evptr->eventity) ) lastime = q->evtime;evptr->evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() < corruptprob){ncorrupt++;if ( (x = jimsrand()) < .75)mypktptr->payload[0]='Z'; /* corrupt payload */else if (x < .875)mypktptr->seqnum = 999999;elsemypktptr->acknum = 999999;if (TRACE>0)printf(" TOLAYER3: packet being corrupted\n");}//if (TRACE>2)//printf(" TOLAYER3: scheduling arrival on other side\n");insertevent(evptr);}//向第五层发送信息/************************** TOLAYER5 ***************/void tolayer5(int AorB,char datasent[20]){int i;if (TRACE>2){printf(" TOLAYER5: data received: ");for (i=0; i<20; i++)printf("%c",datasent[i]);printf("\n");}}三、GBN-CS.c#include "GBN.h"#include <stdio.h>#include <string.h>#include <stdlib.h>extern int TRACE ; /* for my debugging */extern int nsim ; /* number of messages from 5 to 4 so far */extern int nsimmax; /* number of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main(){struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c;init();A_init();B_init();while (1){eventptr = evlist; /* get next event to simulate */ if (eventptr==NULL)goto terminate;evlist = evlist->next; /* remove this event from event list */if (evlist!=NULL)evlist->prev=NULL;if (TRACE >= 2){printf("\nEVENT time: %f,",eventptr->evtime);printf(" type: %d",eventptr->evtype);if (eventptr->evtype==0)printf(", timerinterrupt ");else if (eventptr->evtype==1)printf(", fromlayer5 ");elseprintf(", fromlayer3 ");printf(" entity: %d\n",eventptr->eventity);}time = eventptr->evtime; /* update time to next event time*/if (nsim==nsimmax)break; /* all done with simulation */if (eventptr->evtype == FROM_LAYER5 ){generate_next_arrival(); /* set up future arrival *//* fill in msg to give with string of same letter */j = nsim % 26;for (i=0; i<20; i++)msg2give.data[i] = 97 + j;if (TRACE>2){printf(" MAINLOOP: data given to student: ");for (i=0; i<20; i++)printf("%c", msg2give.data[i]);printf("\n");}nsim++;if (eventptr->eventity == A){A_output(msg2give);}else{B_output(msg2give);}}else if (eventptr->evtype == FROM_LAYER3){pkt2give.seqnum = eventptr->pktptr->seqnum;pkt2give.acknum = eventptr->pktptr->acknum;pkt2give.checksum = eventptr->pktptr->checksum;for (i=0; i<20; i++)pkt2give.payload[i] = eventptr->pktptr->payload[i];if (eventptr->eventity == A) /* deliver packet by calling */ A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr->pktptr); /* free the memory for packet */ }else if (eventptr->evtype == TIMER_INTERRUPT){if (eventptr->eventity == A)A_timerinterrupt();elseB_timerinterrupt();}else{printf("INTERNAL PANIC: unknown event type \n");}free(eventptr);}terminate:printf(" Simulator terminated at time %f\n after sending %d msgs from layer5\n",time,nsim);printf(" correctly sent pkts: %d \n", packet_correct);printf(" resent pkts: %d \n", packet_resent);system("pause");}附源代码及注释四. 实验小结通过本次试验了解了编程实现简单可靠的数据传输GBN协议,模拟了可靠数据传输理解了TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南大学软件学院实验报告姓名:赵宇学号:2010112018班级:2010级软件工程日期: 2013/5/24 成绩:实验六 Physical Database Design II一实验任务对给出的实体建立关系数据模型,对建立的关系模型转化为DBMS中的数据库,对数据库中的数据的更新做约束,实现该数据库的业务要求,最后是对SQL 语句的考察,通过SQL语句对数据库中的数据进行查询。
二实验环境SQL Server 2005 、Power Designer三实验结果记录1.已知StayHome 数据库各实体之间的关系如下图所示:表中数据参考文件”StayHomeData.xls”,其中数据供参考,不足的属性或关联关系,请自己添加,并加说明。
需要添加一个表,演员和电影是多对多的关系,需要通过第三个表来实现对3NF,同时对于员工表应该添加电话属性和性别属性,这样会更加方便对员工的管理。
2.使用数据库建模工具,给出StayHome 数据库的ER 模型图、LDM 图和PDM图。
ER图:PlayslnisPartOfbelongBranchbranchNo streetcitystate zipCode mgrStaffNo <pi>Characters (20Variable charaCharacters (20Characters (6)Characters (20Characters (20Identifier_1 ...<pi>StaffstaffNonamepositionsalaryphonegenderbranchNo1<pi>Characters (2Variable charCharacters (5MoneyIntegerCharacters (6Characters (2 Identifier_1...<pi>VideoForRentvideoNO available catalogNo1 branchNo1<Undefined><Undefined>Characters (2Characters (2ActoractorNoactorNameactorGenderactorDescribe<pi>Characters (2Variable charCharacters (2TextIdentifier_1...<pi>VideocatalogNo1titlecategorydailyRentalprice<pi>Characters (2Variable charCharacters (2MoneyMoneyIdentifier_1...<pi>MembermemberNOfnamelnameaddressgender<pi>Characters (2Characters (1Characters (1Characters (5Characters (6Identifier_1...<pi>RegistrationbranchNo1menberNo1staffNo1dateJoinedCharacters (2Characters (2Characters (2Date RentalAgreementrentalNodateOutdateReturnmenberNo1videoNo2<pi>Characters (DateDateCharacters (Characters (Identifier_1...<pi>DirectordirectorNodirectorNamedirectorGenderdirectorDescribe<pi>Characters (20Variable chara<Undefined><Undefined>Identifier_1...<pi>LDM图:PlayslnisisPartOfbelong3(D)belong2BranchbranchNostreetcitystatezipCodemgrStaffNo<pi>Characters (20Variable charaCharacters (20Characters (6)Characters (20Characters (20Identifier_1...<pi>StaffstaffNobranchNoSta_staffNonamepositionsalaryphonegenderbranchNo1...<pi><fi2><fi1>CharactersCharactersCharactersVariable cCharactersMoneyIntegerCharactersCharactersVideoForRentvideoNOavailablecatalogNo1 branchNo branchNo1<fi1><fi2><Undef<UndefCharacCharacCharacActoractorNoactorNameactorGenderactorDescribe<pi>Characters (2Variable charCharacters (2TextIdentifier_1...<pi>VideocatalogNo1titlecategorydailyRentalprice<pi>Characters (2Variable charCharacters (2MoneyMoneyIdentifier_1...<pi>MembermemberNOfnamelnameaddressgender<pi>Characters (2Characters (1Characters (1Characters (5Characters (6Identifier_1...<pi>RegistrationmemberNObranchNostaffNobranchNo1menberNo1staffNo1...<fi1><fi2><fi3>CharactCharactCharactCharactCharactCharact RentalAgreementrentalNomemberNOdateOutdateReturnmenberNo1videoNo2<pi><fi2>CharactersCharactersDateDateCharactersCharactersDirectordirectorNocatalogNo1directorNamedirectorGenderdirectorDescribe<pi><fi>Characters (20Characters (20Variable chara<Undefined><Undefined>DirectscatalogNo1actorNo<pi,fi2><pi,fi1>Characters (20)Characters (20)<M><M>Identifier_1...<pi>PDM图:BranchbranchNo street city state zipCode mgrStaffNo ...char(20)varchar(50)char(20)char(6)char(20)char(20)<pk>StaffstaffNo branchNo Sta_staffNo nameposition salary phone gender branchNo1...char(20)char(20)char(20)varchar(20)char(50)numeric(8,2)integer char(6)char(20)<pk><fk1><fk2>VideoForRentvideoNO available catalogNo1branchNo branchNo1...<Undefined><Undefined>char(20)char(20)char(20)<fk1><fk2>ActoractorNo actorName actorGender actorDescribe ...char(20)varchar(50)char(20)long varchar<pk>VideocatalogNo1title category dailyRental price ...char(20)varchar(50)char(20)numeric(8,2)numeric(8,2)<pk>MembermemberNO fname lname address gender ...char(20)char(10)char(10)char(50)char(6)<pk>RegistrationmemberNO branchNo staffNo branchNo1menberNo1staffNo1dateJoined ...char(20)char(20)char(20)char(20)char(20)char(20)date<fk1><fk2><fk3>RentalAgreementrentalNo memberNO dateOut dateReturn menberNo1videoNo2...char(20)char(20)date datechar(20)char(20)<pk><fk2>DirectordirectorNo catalogNo1directorName directorGender directorDescribe ...char(20)char(20)varchar(20)<Undefined><Undefined><pk><fk>DirectscatalogNo1actorNochar(20)char(20)<pk,fk2><pk,fk1>3. 创建StayHome 数据库、数据表、导入数据。