软件体系结构实验报告 下载本文

学 生 实 验 报 告

课程名称:

学生学号:

所属院部:

(理工类)

软件体系结构 专业班级:13软件工程2班 1305104067 学生姓名: 黄可非

软件工程学院 指导教师: 陈圣国

20 15 ——20 16 学年 第 1 学期

金陵科技学院教务处制

实验报告书写要求

实验报告原则上要求学生手写,要求书写工整。若因课程特点需打印的,要遵照以下字体、字号、间距等的具体要求。纸张一律采用A4的纸张。

实验报告书写说明

实验报告中一至四项内容为必填项,包括实验目的和要求;实验仪器和设备;实验内容与过程;实验结果与分析。各院部可根据学科特点和实验具体要求增加项目。

填写注意事项

(1)细致观察,及时、准确、如实记录。 (2)准确说明,层次清晰。

(3)尽量采用专用术语来说明事物。

(4)外文、符号、公式要准确,应使用统一规定的名词和符号。 (5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。

实验报告批改说明

实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用百分制,具体评分标准由各院部自行制定。

实验报告装订要求

实验批改完毕后,任课老师将每门课程的每个实验项目的实验报告以自然班为单位、按学号升序排列,装订成册,并附上一份该门课程的实验大纲。

实验项目名称:经典软件体系结构风格 实验学时: 4学时 同组学生姓名: 实验地点: 1216 实验日期: 2015.10.27-2015.11.3 实验成绩: 批改教师: 批改时间:

一、 实验目的和要求

(1)理解管道-过滤器软件体系结构、面向对象软件体系结构的原理 (2)掌握管道-过滤器软件体系结构、面向对象软件体系结构特点 (3)面向对象软件体系结构的编程实现

二、 实验仪器和设备

奔腾以上计算机,Windows 10 、Visual Studio 2013、MySQL

三、 实验过程

(1)在dos下体会管道过滤器的体系结构。

使用 dir | more 命令了解管道-过滤器风格的程序。

(2)数据抽象和面向对象软件体系结构设计实现。设计一个应用程序,在该程序定义平面图形的抽象类和其派生类圆、矩形、三角形,椭圆。该程序的功能包括:输入相应的图形参数,如矩形的长和宽,单击相应按钮,能根据输入参数创建图形类并输出该对象的面积。使用c#、c++或Java或语言进行面向对象的程序设计:(1)首先考虑数据封装性,(2)考虑继承性,(3)考虑抽象类。

应用程序代码: Graphic.cs:

namespace WindowsFormsApplication1 {

public abstract class Graphic {

public abstract double Area(); } }

Rectangle.cs:

namespace WindowsFormsApplication1 {

public class Rectangle : Graphic {

double len; double wid;

public Rectangle(double length,double width) {

len = length; wid = width; }

public override double Area() {

return len * wid; } } }

Triangle.cs:

namespace WindowsFormsApplication1 {

public class Triangle : Graphic {

double btm; double hgt;

public Triangle(double bottom, double height) {

btm=bottom; hgt=height; }

public override double Area() {

return btm * hgt/2; } } }

Circle.cs:

namespace WindowsFormsApplication1 {

public class Circle:Graphic {

double radius;

public Circle(double r) {

radius = r; }

public override double Area() {

return radius * radius * 3.14; } } }

Ellipse.cs:

using System;

using System.Collections.Generic; using System.Linq; using System.Text;

namespace WindowsFormsApplication1 {

public class Ellipse : Graphic {

double la; double lb;

public Ellipse(double a, double b) {

la = a; lb = b; }

public override double Area() {

return la * lb*3.14; } } }

From1.cs:

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent(); }

private void button1_Click(object sender, EventArgs e) {

if (comboBox1.SelectedItem == \圆\ {

double r=Convert.ToDouble(textBox1.Text); Circle circle=new Circle(r);

textBox4.Text = Convert.ToString(circle.Area()); }

else if (comboBox1.SelectedItem == \矩形\ {

double len = Convert.ToDouble(textBox1.Text); double wid = Convert.ToDouble(textBox2.Text); Rectangle rec = new Rectangle(len, wid); textBox4.Text = Convert.ToString(rec.Area()); }

else if (comboBox1.SelectedItem == \三角形\ {

double btm = Convert.ToDouble(textBox1.Text); double hgt = Convert.ToDouble(textBox3.Text); Triangle tri = new Triangle(btm, hgt); textBox4.Text = Convert.ToString(tri.Area()); }

else if (comboBox1.SelectedItem == \椭圆\ {

double a = Convert.ToDouble(textBox1.Text); double b = Convert.ToDouble(textBox2.Text); Ellipse elp = new Ellipse(a, b);

textBox4.Text = Convert.ToString(elp.Area()); } }

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {

if (comboBox1.SelectedItem == \圆\ {

label1.Text = \半径\ label2.Visible = false; label3.Visible = false; textBox2.Visible = false; textBox3.Visible = false; }

else if (comboBox1.SelectedItem == \ {

label1.Text = \ label2.Visible = true; textBox2.Visible = true; label3.Visible = false; textBox3.Visible = false; }

else if (comboBox1.SelectedItem == \ {

label1.Text = \ label3.Visible = true; textBox3.Visible = true; label2.Visible = false; textBox2.Visible = false; }

else if (comboBox1.SelectedItem == \ {

label1.Text = \ label2.Text = \ label2.Visible = true; textBox2.Visible = true; label3.Visible = false; textBox3.Visible = false; } } } }

矩形\长\三角形\底\椭圆\半长轴\半短轴\

四、 实验结果与分析 程序初始界面:

如选择椭圆,输入半长轴和半短轴,点击计算,输出结果:

如选择三角形,输入底和高,点击计算,输出结果:

五、 思考题

(1) 管道-过滤器软件体系结构与批处理软件体系结构的区别和联系是什么?

答:管道/过滤器结构通常导致进程成为批处理的结构,因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计者必须将每一个过滤器看成一个完整的从输入到输出的转换。.限定过滤器的数据存储容量,就可以得到有界管道/过滤器。过滤器将所有输入数据作为单个实体进行处理,这就是批处理系统 (2) 面向对象软件体系结构与主程序-子程序软件体系结构的区别和联系是什么?

答:主程序-子程序体系结构在设计上使用层次化的划分方法,通常采用自顶向下的功能化设计方法,面向对象体系结构在设计上使用面向对象的设计方法,可以隐藏对象的内部状态并且要求所有对象间的交互都通过该方法,即进行了数据封装,这也是面向对象编程的基本原则

六、实验心得与体会

在管道/过滤器风格的软件体系结构中,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。因此,这里的构件被称为过滤器,这种风格的连接件就象是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。通过实验,我对这种软件体系结构有了进一步了解。

实验项目名称:多层C/S结构应用设计 实验学时: 4学时 同组学生姓名: 实验地点: 1216 实验日期: 2015.11.10-2015.11.24 实验成绩: 批改教师: 批改时间:

一、 实验目的和要求

设计并实现一个基于多层C/S结构的数据库应用,熟悉多层C/S体系结构及其基本处理流程,了解多层结构表现层、业务逻辑层(功能层)、数据访问层所完成的功能,掌握多层C/S结构的数据库应用设计方法,对这三层进行明确分割,并在逻辑上使其独立。学生通过本实验的训练能够熟练掌握对小型数据库应用系统三层结构层次划分方法及系统实现技术。

二、 实验仪器和设备

奔腾以上计算机,Windows 10 、Visual Studio 2013、MySQL

三、 实验过程

分别采用二层C/S结构和多层C/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

应用程序代码:

using System;

using System.Windows.Forms; using MySql.Data.MySqlClient;

namespace WindowsFormsApplication2 {

public partial class Form1 : Form {

public int action = 0;//0:添加;1:修改 public Form1() {

InitializeComponent(); }

private void groupBox3_Enter(object sender, EventArgs e) {

}

private void button3_Click(object sender, EventArgs e) {

frm1.Enabled = true; frm2.Enabled = false; action = 0;

}

private void add() {

long id=0;

int count=list1.Items.Count; if (count == 0) {

id = 1001; } else {

id = long.Parse(list1.Items[count - 1].Text)+1; }

Dbcon connector = new Dbcon();

MySqlConnection con = connector.dbcon(); con.Open();

MySqlCommand cmd = new MySqlCommand(\(id,name,phoneno,location) values(@id,@name,@phoneno,@location)\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\ cmd.ExecuteNonQuery();

con.Close(); build(); }

private void modify() {

foreach (ListViewItem item in list1.SelectedItems) {

Dbcon connector = new Dbcon();

MySqlConnection con = connector.dbcon(); con.Open();

MySqlCommand cmd = con.CreateCommand(); cmd.CommandText=\

name=@name,phoneno=@phoneno,location=@location where id=@id\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\ cmd.Parameters.AddWithValue(\

cmd.ExecuteNonQuery(); con.Close(); } build(); }

private void button1_Click(object sender, EventArgs e) {

if (action == 0) {

add(); }

else if (action == 1) {

modify(); }

name.Clear(); phoneno.Clear(); location.Clear(); frm2.Enabled = true; frm1.Enabled = false; }

private void button4_Click(object sender, EventArgs e) {

foreach (ListViewItem item in list1.SelectedItems) {

frm1.Enabled = true; frm2.Enabled = false;

name.Text = item.SubItems[1].Text; phoneno.Text = item.SubItems[2].Text; location.Text = item.SubItems[3].Text; action = 1; } }

private void Form1_Load(object sender, EventArgs e) {

build();

}

public void build() {

list1.BeginUpdate(); list1.Items.Clear();

Dbcon connector = new Dbcon();

MySqlConnection con = connector.dbcon(); con.Open();

MySqlCommand cmd = new MySqlCommand(\* from person\con); MySqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) {

ListViewItem item = new ListViewItem(); item.Text = Convert.ToString(dr[\

item.SubItems.Add(Convert.ToString(dr[\ item.SubItems.Add(Convert.ToString(dr[\ item.SubItems.Add(Convert.ToString(dr[\ list1.Items.Add(item); }

dr.Close(); con.Close(); list1.EndUpdate(); }

private void button5_Click(object sender, EventArgs e) {

foreach (ListViewItem item in list1.SelectedItems) {

Dbcon connector = new Dbcon();

MySqlConnection con = connector.dbcon(); con.Open();

MySqlCommand cmd = new MySqlCommand(\from person where id=\

cmd.ExecuteNonQuery(); } build(); }

private void button2_Click(object sender, EventArgs e) {

frm2.Enabled = true; frm1.Enabled = false; name.Clear(); phoneno.Clear(); location.Clear(); }

private void textBox2_TextChanged(object sender, EventArgs e) {

}

private void list1_SelectedIndexChanged(object sender, EventArgs e) {

//MessageBox.Show(); }

private void button6_Click(object sender, EventArgs e) {

MessageBox.Show(\ } }

public class Dbcon {

public MySqlConnection dbcon()

{

String constr = \Id=root;password=root;Database=contact\

MySqlConnection con = new MySqlConnection(constr); return con; } } }

四、 实验结果与分析 程序主界面:

点击“添加联系人信息”:

点击“确定”:

选中列表上的某项内容,点击“修改联系人信息”:

修改信息并点击“确定”:

五、思考题

与二层C/S体系结构比较,三层(多层)体系结构有什么优点?采用三层体系结构在系统设计时应该注意哪些问题? 答:三层体系结构的优点:

①允许合理地划分三层结构的功能,使之在逻辑上保持相对独立性 ②允许更灵活有效地选用相应的平台和硬件系统

③三层C/S结构中,应用的各层可以并行开发,各层也可以选择各自最合适的开发语言。 ④允许充分利用功能层有效地隔离层表示层与数据层。 ⑤三层C/S结构各层间的通信效率若不高,即使分配给各层的硬件能力很强,其作为整体来说也达不到所要求的性能。

在设计三层结构时,首先要考虑的问题在于数据层和业务层的连接是否畅通,数据的吞吐量是否过大。在用户对于程序相应速度要求一般或者数据吞吐量较小的情况下,可以采用三层结构进行设计

六、实验心得与体会

实验涉及到c#技术对于JDBC的操作,遇到一定困难,但都完美解决了。收获了很多经验和知识。同时我对多层c/s结构也有了更加深刻的认知和了解,掌握了这种软件体系结构想必十分有用。

实验项目名称:B/S结构应用设计 实验学时: 4学时 同组学生姓名: 实验地点: 1216 实验日期:2015.12.01-2015.12.15 实验成绩: 批改教师: 批改时间:

一、 实验目的和要求

设计并实现一个基于B/S结构的数据库应用,熟悉B/S体系结构及其基本处理流程,了解B/S结构系统各部分所完成的功能,掌握B/S结构的数据库应用设计方法。学生通过本实验的训练能够熟练掌握对小型数据库应用系统B/S结构设计及系统实现技术。

二、 实验仪器和设备

奔腾以上计算机,Windows 10、MyEclipse2014、Sencha CMD、MySQL

三、 实验过程

1.采用B/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:

2.三层B/S结构的个人通讯录 2.1.项目结构截图

2.2.运行效果截图:

2.3.“添加联系人”功能:

添加后的效果:

“添加”功能的代码:

public void AddFriend(ContactEntry friend) {

SqlConnection conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

SqlCommand cmd = new SqlCommand();

cmd.CommandText = \; cmd.Connection = conn;

conn.Open();

SqlDataReader reader = cmd.ExecuteReader();

int[] temp = new int[2]; temp[0] = 0;

while (reader.Read()) {

temp[1] = reader.GetInt32(0); if (temp[0] < temp[1]) {

temp[0] = temp[1]; } }

int cID = temp[0] + 1;

reader.Close(); conn.Close();

conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

cmd = new SqlCommand();

cmd.CommandText = \; cmd.CommandText += \ + cID + \; cmd.CommandText += friend.CName + \; cmd.CommandText += friend.CAddress + \; cmd.CommandText += friend.CPhone + \; cmd.CommandText += friend.CEmail + \; cmd.Connection = conn;

conn.Open();

cmd.ExecuteNonQuery(); conn.Close(); }

调用Bean中的属性:

调用配置文件中的信息:

2.4.“修改联系人信息”功能:

点击一条信息右边的“修改”按钮进入修改界面:

“修改”功能的代码:

public void UpdateFriendByID(ContactEntry friend) {

SqlConnection conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

SqlCommand cmd = new SqlCommand();

cmd.CommandText = \ + friend.CName; cmd.CommandText += \ + friend.CAddress; cmd.CommandText += \ + friend.CEmail;

cmd.CommandText += \ + friend.CPhone + \; cmd.CommandText += \ + friend.ID; cmd.Connection = conn;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close(); }

2.5.“删除”联系人功能:

点击一条信息右边的“删除”按钮即将信息删除: (删除前)

(删除后)

“删除”功能的代码:

public void DeleteFriendByID(int id) {

SqlConnection conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

SqlCommand cmd = new SqlCommand();

cmd.CommandText = \ + id; cmd.Connection = conn;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close(); }

2.6.“搜索”联系人功能:

“搜索”功能的代码:

public SqlDataReader GetFriendKey(string key) {

SqlConnection conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

SqlCommand cmd = new SqlCommand();

cmd.CommandText = \; cmd.CommandText += \ + key + \; cmd.CommandText += \ + key + \; cmd.CommandText += \ + key + \; cmd.CommandText += \ + key + \; cmd.Connection = conn;

conn.Open();

SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);

return reader; }

3.二层B/S结构个人通讯录

3.1.二层B/S结构和三层B/S结构的区别:

3.2.二层B/S结构界面设计和逻辑代码未分离

(示例:图中的箭头标记的是“执行添加”按钮的事件)

protected void Button1_Click(object sender, EventArgs e) {

if(Page.IsValid) {

SqlConnection conn = new SqlConnection(); conn.ConnectionString =

ConfigurationManager.AppSettings[\];

SqlCommand cmd = new SqlCommand();

cmd.CommandText = \into contact(ID,cName,cAddress,cPhone,cEmail)\; cmd.CommandText += \ + cID + \; cmd.CommandText += TextBox1.Text + \; cmd.CommandText += TextBox2.Text + \; cmd.CommandText += TextBox3.Text + \; cmd.CommandText += TextBox4.Text + \; cID++;

cmd.Connection = conn;

conn.Open();

cmd.ExecuteNonQuery();

conn.Close();

Response.Redirect(\); } }

五、 思考题

与C/S体系结构比较,B/S体系结构有什么优点?采用B/S与C/S混合体系结构在系统设计时应该注意哪些问题?

答: 基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决。用户在使用系

统时,仅需要一个浏览器就可以运行全部的模块,真正达到了“零客户端”的功能,很容易在运行时自动升级。B/S体系结构还提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开发性基础。用B/S和C/S混合结构设计时应考虑B/S、C/S的具体使用环境。比如B/S适用于外部远程访问,C/S适用于内部局域网访问,服务端也能对客户端加以识别,避免远程主机使用C/S的权限进行非法访问

六、实验心得与体会

三层B/S结构实现了界面设计和逻辑代码的分离,更加规范化,使后期的修改代码和维护更加便利。在制作的时候也遇到了一些麻烦,比如由于不小心输入sql代码字段没有添加空格,导致运行的时候没有报任何错误,却使得系统一直卡在那里,只好用任务管理器将他终结,才使得系统退出运行,后来用断点调试,发现运行到执行sql语句下一句的时候,给出的参数值有问题,于是才发现问题所在。