实验二 结构化分析与设计

一.实验信息

|博客班级|AHPU-软件工程导论-计算机18级 (安徽工程大学 - 计算机与信息学院)
|----|----|----|
| 实验要求|结构化分析与设计|
|实验目标|1.掌握结构化的需求分析方法;2.掌握分层数据流图的绘制、数据字典和加工说明的编制等等 |
| 学号| 3180701335|

二.实验目的

(1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;
(5)掌握测试的基本方法。

三.实验内容

(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;
(2)绘制系统的分层数据流图,并给出数据字典;
(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;
(4)为关键模块进行详细设计,如绘制关键模块的流程图;
(5)实现系统部分功能并测试。
【实例1】机票预订系统
参考:
(1)携程网
(2)去哪儿
为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行
时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出
机票给顾客
【实例2】教材订购系统
销售系统的工作过程为:首先由教师或学生提交购书单,经教材发行人员审核是有效购书单后,开发票、登记并返给教师或学生领
书单,教师或学生即可去书库领书。
采购系统的主要工作过程为:若是脱销教材,则登记缺书,发缺书单给书库采购人员;一旦新书入库后,即发进书单通知给教材发
行人员。
【实例3】图书管理系统
参考:http://lib.ahpu.edu.cn/

四.实验步骤

(1)复习结构化的分析与设计方法的主要过程;
(2)讨论系统存在的用户角色、工作流等;
(3)对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性;
(4)对应数据流图,设计系统的功能结构图,关键模块的流程图;
(5)选择对应的结构化程序设计语言,实现并测试部分功能模块

选择图书管理系统

实验内容
(1)
用户需求

账号信息(创建,修改等)图书信息、图书超期提醒、图书排行信息等等的基础设计,提供精确查找和模糊查找信息

系统需求

不同权限、不同用户对该系统进行操作,也就是说,图书管理员和学生都可以进入该系统来进行操作。另外,该系统还必须保证数据的安全性、完整性和准确性

业务需求

学生:可以查询图书,查看公告,查询个人信息,预约借书,还书。
图书管理员:发布公告,上架新书,下架图书,处理书籍的借阅和异常还书。
系统管理员:管理用户和管理员的密码,添加和删除普通用户和图书管理员。

(2)
分层数据流图
一层数据流程图

二层数据流图


数据字典

数据项条目表
|编号|名称|数据类型|长度|说明|
|----|----|----|----|----|----|
|S001|学生编号|Int|20|学生在系统中的代码标识|
|S002|学生姓名|Varchar|10|学生姓名的说明|
|S003|学生类型|Int|4|学生的分类说明|
|S004|学生性别|Varchar|2|学生的性别说明|
|S005|学生出生日期|Datetime|8|学生出生日期说明|
|S006|学生联系方式|Varchar|100|学生联系的说明|
|S007|图书ID|Int|4|图书的标识|
|S008|图书书名|Varchar|100|图书书名说明|
|S009|图书类别|Varchar|50|关于图书类别说明|
|S010|作者|Varchar|200|图书作者说明|
|S011|ISBN|Varchar|20|图书编号标识|
|S012|出版社|Varchar|50|图书出版说明|
|S013|图书价格|Money||图书单价说明|
|S014|库存量|Int|6|图书在库数量说明|
|S015|超期罚款|Money||图书超期而罚款说明|
|S016|简介|Varchar|200|图书介绍说明|
|S017|借出次数|Int|6|图书被解约的次数说明|
|S018|入库日期|Datetime|8|图书采购日期|
|S019|借阅时间|Datetime|8|图书被借阅的日期|
|S020|应还时间|Datetime|8|图书应被归还的日期|
|S021|可借天数|Int|4|图书可以被借阅的时间|

数据存储条目表

编号 名称 来源 去向 组成 简述
D1 学生库 P6 P7 学生编号、姓名、类别、联系方式 对学生信息的记录
D2 图书库 P1 P3 图书编号、名称、库存数量、出版社、简介 对图书信息的记录
D3 借阅库 P2 P2 借阅数量、日期、操作员借阅人、图书编号 对借阅图书的信息的记录
数据流条目表
编号 名称 来源 去处 组成 说明
---- ---- ---- ---- ---- ----
F1 编号及姓名查询 学生 学生查询处理 学生编号,学生姓名 查询学生信息的条件
F2 编号及书名查询 读者 图书查询处理 图书编号、图书名称 查询图书信息的条件
F3 图书预定 学生 图书预定处理 图书编号、图书名称、预订时间、学生姓名、读者编号 预订图书的信息
F4 图书续借 学生 图书借阅处理 图书编号、图书名称、学生姓名、学生编号 续借图书的信息
F5 图书预订信息 图书管理员 图书预定处理 图书编号、图书名称、预订时间、学生姓名、学生编号、操作员 图书管理员对预定信息进行处理
F6 图书续借信息 图书管理员 图书续借处理 图书编号、图书名称、学生姓名、学生编号、操作员
F7 学生信息 图书管理员 学生信息处理 学生编号、姓名、性别、类型、出生日期 图书管理员对学生信息进行处理
F8 图书信息 图书管理员 图书信息处理 图书编号、书名、库存数量、单价、简介 图书管理员对图书信息进行处理
数据处理条目表
编号 名称 输入 输出 处理过程
---- ---- ---- ---- ----
P1 图书信息处理 图书信息 图书库 根据图书信息修改图书库
P2.1 图书归还处理 还书信息 图书库、借阅库 根据还书信
P2.2 检查读者编号 学生库 有效 根据学生库的信息检查读者是否已存在
P2.3 检查图书是否有现存 图书库 有现存 根据图书信息检查图书是否有现存
P2.4 填写借阅信息和修改图书信息 有现存 借阅库、图书库 有现存则借阅图书,修改图书库存量
P3.1 图书查询处理 图书查询条件 图书库、查询结果 根据查询条件,查看相关图书
P4.1 预定信息输入 预定信息 读者身份检查 根据图书库信息,选择预约的图书
P4.2 学生身份检查 学生库 有效 根据学生库信息检查学生是否已存在
P4.3 图书预定处理 图书库 预定信息 填写预订信息,申请预订
P5 图书续借处理 图书续借 借阅库 根据续借信息修改借阅库
P6 学生信息处理 学生信息 学生库 根据学生信息修改学生库
P7 学生查询处理 学查询 学生库 根据学生库信息查询学生情况

管理员功能模块图


读者功能模块图

(3)部分代码
登录代码

namespace BookManagerexe { 
    public partial class FrmDL : Form     
{ 
        int i = 0; 
        public TextBox uid; 
        public static string userType;         
public static string userId;         
public static string password;         
public FrmDL(TextBox uid)        
 { 
            this.uid = uid;            
 InitializeComponent();         
    groupPanel1.Visible = false;         } 
        private void FrmDL_Load(object sender, EventArgs e)        
 { 
            // this.compurview.Text = "系统管理员";       
  } 
        private void btnOK_Click(object sender, EventArgs e)        
 { 
            //     userType = compurview.Text;           
  userId = txtUID.Text;  
            bool flag = BLL.LoginUser.loginDuzhe(txtUID.Text, txtpasword.Text);       
      if (flag)            
 { 
                this.uid.Text = this.txtUID.Text;                 
password = txtpasword.Text; 
                //  MessageBox.Show("恭喜,登陆成功  欢迎" + this.compurview.Text + this.txtUID.Text, "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);   
              this.Close();           
 } 
            Model.LoginUser m = new Model.LoginUser();          
   m.Book_Id = this.txtUID.Text.Trim(); 
            m.Book_password = this.txtpasword.Text.Trim();            
 //   m.Book_Name = this.compurview.Text.Trim();        
     DataSet ds = BLL.LoginUser.GetAll(m);            
 // }        
 } 
        private bool ValidateIput()     
    { 
            if (this.txtUID.Text.Trim() == "")        
     { 
                MessageBox.Show("请输入用户名", "输入提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);            
     this.txtUID.Focus();          
       return false;          
   } 
            else if (this.txtpasword.Text.Trim() == "")        
     { 
                MessageBox.Show("请输入用户密码", "输入提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);               
  this.txtpasword.Focus();               
  return false;          
   } 
            //else if (this.compurview.Text.Trim() == "")     
        //
{ 
            //    MessageBox.Show("请选择登陆权限", "输入提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);           
  //    this.compurview.Focus();         
    //    return false;             
//} 
 else            
 { 
                return true;        
 }       
  } 
        private void btncancle_Click(object sender, EventArgs e)   
      { 
            DialogResult dr = MessageBox.Show("确定退出吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);        
     if (dr == DialogResult.OK)          
   { 
                this.Close();        
     }      
   }  
        private void button1_Click(object sender, EventArgs e)     
    { 
            groupPanel1.Visible = true;       
  }  
        private void button2_Click(object sender, EventArgs e)     
    { 
            string intNO = BLL.LoginUser.returnID(textBox1.Text.Trim());      
       if (intNO == "aaa")           
  { 
                MessageBox.Show("请输入正确的证件号");      
           return;    
         }            
 else           
  { 
                duzheyemian duzhezhuomian = new duzheyemian(intNO);       
          duzhezhuomian.Show();            
     this.Hide();         
    } 
 }  
        private void label1_Click(object sender, EventArgs e)       
  
        private void groupPanel1_Click(object sender, EventArgs e)       
     }
 }  

图书信息代码:

namespace BookManagerexe { 
    public partial class frmUpdate : Form    
 { 
        private bool a = true; 
        private DataGridView Dgv = null;    
     private DataSet ds = null; 
        public frmUpdate(DataGridView DgvPerson, bool a)       
  { 
 this.a = a; 
            this.Dgv = DgvPerson;       
      InitializeComponent();      
   }  
        #region 窗体加载事件 
        private void frmUpdate_Load(object sender, EventArgs e)     
    { 
            this.comSex.Items.Add("男");         
    this.comSex.Items.Add("女");           
  this.comSex.SelectedIndex = 0; 
            this.comAvailability.Items.Add("身份证");           
  this.comAvailability.Items.Add("军官证");           
  this.comAvailability.Items.Add("教师证");          
   this.comAvailability.Items.Add("学生证");        
     this.comAvailability.Items.Add("其他证件");  
            if (this.a == false)            
 { 
                this.txtId.ReadOnly = true;  
                DataGridViewRow row = this.Dgv.CurrentRow;              
   this.Text = "读者档案信息--修改"; 
                this.txtId.Text = row.Cells[0].Value.ToString();       
          this.txtName.Text = row.Cells[1].Value.ToString();               
  this.comSex.Text = row.Cells[2].Value.ToString();            
     this.comType.Text = row.Cells[3].Value.ToString();          
       this.DataTimeBirth.Text = row.Cells[4].Value.ToString();      
           this.comAvailability.Text = row.Cells[5].Value.ToString();    
             this.txtPapers.Text = row.Cells[6].Value.ToString();           
      this.txtNumber.Text = row.Cells[7].Value.ToString();        
         this.txtRemark.Text = row.Cells[8].Value.ToString();         
        this.DataTimeRegistration.Text = row.Cells[9].Value.ToString(); 
 this.txtOp.Text = row.Cells[10].Value.ToString();             
    btnCheck.Visible = false;         
    }        
 } 
        #endregion     
    #region 取消 
        private void btnClose_Click(object sender, EventArgs e)     
    { 
            this.Close();     
    } 
        #endregion     
    #region 修改 
        private void btnOk_Click(object sender, EventArgs e)     
    { 
            if (txtPapers.Text.Trim() == "")         
    { 
                MessageBox.Show("请输入证件号码!");          
       return;            
 } 
            if (this.a == false)      
       { 
                if (this.DataTimeBirth.Value < this.DataTimeRegistration.Value)                 { 
                    Model.Person p = new Model.Person();  
                    p.Id = this.txtId.Text;               
      p.Sex = this.comSex.Text;                  
   p.Cname = this.txtName.Text;                   
  p.Type = this.comType.Text; 
                    p.Birth = this.DataTimeBirth.Value; 
                    p.Registration = this.DataTimeRegistration.Value;            
         p.Availability = this.comAvailability.Text;          
           p.Papers = this.txtPapers.Text; 
  p.Number = this.txtNumber.Text;                 
    p.Deposit = this.txtOp.Text;                 
    p.Remark = this.txtRemark.Text;                 
    BLL.Person.Update(p); 
  MessageBox.Show("修改成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.None);            
         this.Close(); 
  ds = BLL.Person.SelectPerson();    
                 this.Dgv.DataSource = ds.Tables[0];          
       }        
         else             
    { 
                    MessageBox.Show("日期不合逻辑,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.None);             
    }          
   } 
            else if (this.a == true)        
     { 
                if (this.DataTimeBirth.Value < this.DataTimeRegistration.Value)                 { 
                    if (txtId.Text.Trim() == "")         
 { 
             MessageBox.Show("请输入学号/教师号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);                  
       return;  
                    } 
 if (BLL.Person.ifHaveUserName(txtId.Text.Trim()))         
{ 
 MessageBox.Show("该学号/教师号已被使用,请更换!", "提示",MessageBoxButtons.OK, MessageBoxIcon.Stop);           
              return;                 
    } 
Model.Person p = new Model.Person();          
           p.Id = this.txtId.Text;        
             p.Sex = this.comSex.Text;     
                p.Cname = this.txtName.Text; 
                    p.Type = this.comType.Text; 
                    p.Birth = this.DataTimeBirth.Value; 
                    p.Registration = this.DataTimeRegistration.Value;            
         p.Availability = this.comAvailability.Text;    
                 p.Papers = this.txtPapers.Text;  
                   p.Number = this.txtNumber.Text;         
            p.Op = ""; 
                    p.Remark = this.txtRemark.Text;      
               p.Borrow = "";            
         p.Countermand = ""; 
                    p.Deposit = this.txtOp.Text;   
                  p.Amerce = "";               
      BLL.Person.Added(p); 
      MessageBox.Show("增加成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.None);                     this.Close(); 
   ds = BLL.Person.SelectPerson();            
         this.Dgv.DataSource = ds.Tables[0];           
      }          
       else     
            { 
          MessageBox.Show("日期不合逻辑,请重新输入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.None);              
   }        
     }       
  } 
        #endregion   
  private void btnCheck_Click(object sender, EventArgs e)     
    { 
            if (txtId.Text.Trim() == "")         
    { 
                MessageBox.Show("请输入学号/教师号!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);       
          return;  
            } 
            bool flag = BLL.Person.ifHaveUserName(txtId.Text.Trim());     
        if (flag)           
  { 
                MessageBox.Show("该学号/教师号已被使用,请更换!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Stop);        
     }      
       else  
           { 
                MessageBox.Show("该学号/教师号可以使用!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);       
      }       
  } 
    } 
}           

五.思考题

(1)简述需求说明书,概要设计,详细设计说明书的主要内容。

需求说明书也称为软件规格说明。该说明书对所开发软件的功能、性能、用户 界面及运行环境等做出详细的说明。
概要设计是一个设计师根据用户交互过程和用户需求来形成交互框架和视觉框架的过程,其结果往往以反映交互控件布置、界面元素分组以及界面整体板式的页面框架图的形式来呈现。主要任务是把需求分析得到的系统扩展用例图转换为软件结构和数据结构
详细设计,是软件工程中软件开发的一个步骤,就是对概要设计的一个细化,就是详细设计每个模块实现算法,所需的局部结构。在详细设计阶段,主要是通过需求分析的结果,设计出满足用户需求的软件系统产品。

(2)结构化分析方法与面向对象分析方法有无本质上的不同?

结构化系统分析方法是采用“自顶向下,由外到内,逐层分解”的思想对复杂的系统进行分解化简,从而有效地控制了系统分析每一步的难度,并运用数据流图、加工说明和数据字典作为表达工具的一种系统分析技术。
而面向对象的分析方法则是通过将数据和逻辑结构抽象成为对象,运用对象属性和方法等来操作和处理业务数据和逻辑的系统分析方法。
两者的区别在于:当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到最简洁、高效率的逻辑模型,结构化方法对复杂问题的帮助有限,而面向对象的分析方法提供了一种方便的、可持续观测和扩展系统的机制,通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,对于需求变化频繁的系统,可以用面向对象软件系统的方法。

(3)对数据流图进行审查有何意义?

对数据流图中进行检查,避免有错误和不合理的部分。

(4)给出一次完整的会议讨论纪要,包括议题,最终结果。

议题:图书管理系统项目会议纪要
内容:
1)确定新的管理信息系统 
2)确定完成新的管理信息系统的步骤 
3)分配此次工作任务 
二、组员发言 
1)张紫阳:建立高效、便利的管理信息系统是优化管理的最重要的因素。现如今的 图书馆管理虽已经在利用管理系统,但还是存在不足之处,所以我们这次的工作是 为吉首大学图书馆开发一款更人性化的系统。
2)高晗:图书馆是我们学习、增储知识的圣地,为图书馆设计开发一款更加完善的 系统的确是一个不错的建议。我们需要调查了解图书馆系统还存在什么缺陷,以及 借阅者和管理员还有什么潜在需要,收集相关信息,明确战略目标和方案,计划实 施进度。
结果:会议确定截取图书馆查询系统的图书信息查询、借阅查询以及罚款查询这三个+子模块进行设计。****

六.实验小结

这次实验加深了面向过程分析法和面向对象分析法的分析步骤和主要区别。
原文地址:https://www.cnblogs.com/nidus/p/14037085.html