资源描述
学 生 实 验 报 告
(理工类)
课程名称: 软件体系结构 专业班级:13软件工程2班
学生学号: 1305104069 学生姓名: 管东升
所属院部: 软件工程学院 指导教师: 陈圣国
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("insert into person (id,name,phoneno,location) values(@id,@name,@phoneno,@location)", con);
cmd.Parameters.AddWithValue("@name", name.Text);
cmd.Parameters.AddWithValue("@phoneno", phoneno.Text);
cmd.Parameters.AddWithValue("@location", location.Text);
cmd.Parameters.AddWithValue("@id", Convert.ToString(id));
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="update person set name=@name,phoneno=@phoneno,location=@location where id=@id";
cmd.Parameters.AddWithValue("@name", name.Text);
cmd.Parameters.AddWithValue("@phoneno", phoneno.Text);
cmd.Parameters.AddWithValue("@location", location.Text);
cmd.Parameters.AddWithValue("@id", item.Text);
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("select * from person", con);
MySqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
ListViewItem item = new ListViewItem();
item.Text = Convert.ToString(dr["id"]);
item.SubItems.Add(Convert.ToString(dr["name"]));
item.SubItems.Add(Convert.ToString(dr["phoneno"]));
item.SubItems.Add(Convert.ToString(dr["location"]));
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("delete from person where id="+item.Text, con);
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("developed by altair");
}
}
public class Dbcon
{
public MySqlConnection dbcon()
{
String constr = "server=localhost;User 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
三、 实验过程
采用B/S结构实现个人通讯录系统。该系统的设计目标是能够轻松地管理个人的联系人信息,包括添加、修改和删除操作。联系人信息包括姓名、住址、电话。整个系统的功能图如下图所示:
2.三层B/S结构的个人通讯录
.项目结构截图
public void AddFriend(ContactEntry friend)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationManager.AppSettings["ConnectionString"];
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "Select * from contact ";
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["ConnectionString"];
cmd = new SqlCommand();
cmd.CommandText = "insert into contact(ID
展开阅读全文