实验二 结构化分析与设计

结构化分析与设计

博客班级 AHPU软件工程
作业要求 结构化分析与设计
作业目标 掌握结构化分析与设计方法
学号 3180701214


一.实验目的

(1)掌握结构化的需求分析方法;

(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;

(3)掌握数据流图映射为软件结构图的方法;

(4)掌握需求说明书和设计说明书的主要内容,学习软件需求说明书和设计说明书的编写;

(5)掌握测试的基本方法。

二.实验内容

(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;

(2)绘制系统的分层数据流图,并给出数据字典;

(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;

(4)为关键模块进行详细设计,如绘制关键模块的流程图;

(5)实现系统部分功能并测试。

  【实例1】机票预订系统

  参考:

  (1)携程网:https://flights.ctrip.com/international/search/domestic

  (2)去哪儿:https://www.qunar.com/?ex_track=auto_4e0d874a

     为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行

  时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出

  机票给顾客

  【实例2】教材订购系统

     销售系统的工作过程为:首先由教师或学生提交购书单,经教材发行人员审核是有效购书单后,开发票、登记并返给教师或学生领

  书单,教师或学生即可去书库领书。

     采购系统的主要工作过程为:若是脱销教材,则登记缺书,发缺书单给书库采购人员;一旦新书入库后,即发进书单通知给教材发

  行人员。

  【实例3】图书管理系统

  参考:http://lib.ahpu.edu.cn/

三.实验步骤

Ⅰ.复习结构化的分析与设计方法的主要过程

1>结构化分析方法步骤

①分析当前的情况,做出反映当前物理模型的DFD;
②推导出等价的逻辑模型的DFD;
③设计新的逻辑系统,生成数据字典和基元描述;
④建立人机接口,提出可供选择的目标系统物理模型的DFD;
⑤确定各种方案的成本和风险等级,据此对各种方案进行分析;
⑥选择一种方案;
⑦建立完整的需求规约。

2>结构设计化方法步骤

①评审和细化数据流图;
②确定数据流图的类型;
③把数据流图映射到软件模块结构,设计出模块结构的上层;
④基于数据流图逐步分解高层模块,设计中下层模块;
⑤对模块结构进行优化,得到更为合理的软件结构;
⑥描述模块接口。

Ⅱ.讨论系统存在的用户角色、工作流等

1>用户角色

用户:可以对自身信息(例如密码等信息)进行修改,并有对账户金额进行操作的权限
管理员:可以对用户信息进行管理

2>工作流

●系统提示插入银行卡
●用户插入银行卡后,系统提示用户输入密码
●用户输入自己的密码
●系统检查用户密码是否正确
●若密码匹配,则进入系统选择界面
●用户选择所需要的功能选项
●用户进行相关操作后,系统检查该操作的合法性
●若操作合法,则该操作顺利完成;否则,系统反馈提示相关错误信息

Ⅲ.对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性

1>数据流图

①顶层数据流图

②第一层数据流图

③第二层数据流图

④总数据流图

2>数据字典

3>加工说明

①加工说明1

②加工说明2

Ⅳ.对应数据流图,设计系统的功能结构图,关键模块的流程图

1>系统功能结构图

2>流程图

Ⅴ.选择对应的结构化程序设计语言,实现并测试部分功能模块

开户界面

int CreateAccount(){
	printf("\n\t\t\t\t\t请输入您的姓名:");
	char szUsername[20];
	scanf("%s",szUsername);//szUsername指针 地址 
	
	printf("\n\t\t\t\t\t请设置您的银行卡密码:"); 
	char szPassword[7];
	scanf("%s",szPassword);
	
	printf("\n\t\t\t\t\t请再次输入您的银行卡密码:"); 
	char szRePassword[7];
	scanf("%s",szRePassword);
	
	//判断两次输入的密码是否一致 
	if(strcmp(szPassword,szRePassword)!=0){//相同为0,不同不为0 
		printf("\n\t\t\t\t\t两次输入的密码不一致!\n");
		return 0;
	}

	//随机生成银行账号
	char szAccountNum[20];//0000 0000 0000 0000 0 0
	//1000~9999
	srand((unsigned int)time(NULL));
	sprintf(szAccountNum,"%d%d%d%d%d%d",rand()%9000+1000,
					rand()%9000+1000,rand()%9000+1000,rand()%9000+1000,rand()%10,rand()%10);//sprintf格式化字符串 
		
	//循环找到链表的尾结点	
	Node *p=g_pHead;
	while(g_pHead!=NULL&&p->pNext!=NULL){
		p = p->pNext;
	}
	
	//开辟一个新节点 
	Node *pNewNode=(Node*)malloc(sizeof(Node));
	strcpy(pNewNode->per.szUsername,szUsername);
	strcpy(pNewNode->per.szPassword,szPassword);
	strcpy(pNewNode->per.szAccountNumber,szAccountNum);
	pNewNode->per.fMoney=0.0f;
	pNewNode->pNext=NULL;
	
	//添加到尾结点后面
	if(g_pHead==NULL){
		g_pHead=pNewNode;
	}
	else{
		p->pNext=pNewNode; 
	}
	
	//打印信息
	printf("\n\t\t\t\t\t您的账户信息如下:\n"); 
	printf("\n\t\t\t\t\t\t姓名:%s\n",pNewNode->per.szUsername); 
	printf("\n\t\t\t\t\t\t卡号:%s\n",pNewNode->per.szAccountNumber); 
	printf("\n\t\t\t\t\t\t余额:%0.2f\n",pNewNode->per.fMoney); 
	
	printf("\n\t\t\t\t\t恭喜!账户申请成功!\n");
	
	return 1; 
} 

登录界面

int Login(){
	char szAccountNum[20];//账号
	char szPassword[7];//密码 
	
	printf("\n\t\t\t\t\t请输入您的卡号:");
	scanf("%s",szAccountNum);
	
	//遍历链表寻找当前账号 
	Node *p=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,szAccountNum)!=0){
			p=p->pNext;
			continue;
		}
		else{
			int i=0;
			for(i=0;i<3;i++){
				printf("\n\t\t\t\t\t请输入您的密码:");
				scanf("%s",szPassword);
				
				if(strcmp(szPassword,p->per.szPassword)!=0){
					printf("\n\t\t\t\t\t密码输入错误,请重新输入密码,剩余次数:%d\n",2-i);
					system("pause");
					system("cls");
					continue;
				}
				else{
					system("cls");
					//进入菜单页面 
					Menu(p);
					
					return 1; 
				}
			}
		}
	} 
	printf("\n\t\t\t\t\t请输入您的密码:");
	
	return 1;
}


存款界面

int Deposits(Node *pNode){
	float fMoney;
	printf("\n\t\t\t\t\t请输入要存款的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	while(fMoney<=0){
		printf("\n\t\t\t\t\t存款额不能小于等于零,请重新输入!\n");
		printf("\n\t\t\t\t\t请输入要存款的金额:");
		scanf("%f",&fMoney);
	}
	pNode->per.fMoney+=fMoney;
	printf("\n\t\t\t\t\t您的账户成功存入%.2f元!\n",fMoney); 
	return 1;
}

取款界面

int WithDrawal(Node *pNode){
	float fMoney;
	printf("\n\t\t\t\t\t请输入要取款的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	while(fMoney<=0||fMoney>pNode->per.fMoney){
		printf("\n\t\t\t\t\t取款额不能小于等于零或者大于余额,请重新输入!\n");
		scanf("%f",&fMoney);
	}
	pNode->per.fMoney-=fMoney;
	printf("\n\t\t\t\t\t您的账户成功取出%.2f元!\n",fMoney); 
	return 1;
}

转账界面

int TransFer(Node *pNode){
	char szAccountNum[20];
	float fMoney;
	printf("\n\t\t\t\t\t请输入要转入的账户卡号:");
	fflush(stdin);
	scanf("%s",szAccountNum);
	
	printf("\n\t\t\t\t\t请输入要转入的金额:");
	fflush(stdin);
	scanf("%f",&fMoney);
	
	//遍历寻找需要转入的账号
	Node *p=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,szAccountNum)!=0){
			p=p->pNext; 
			continue;
		}
		else{
			pNode->per.fMoney-=fMoney;
			p->per.fMoney+=fMoney;
			printf("\n\t\t\t\t\t转账成功!\n"); 
			return 1; 
		}
	}
	printf("\n\t\t\t\t\t转出账户不存在!\n");
	return 1;	
}

查询余额界面

int Find(Node *pNode){
	printf("\n\t\t\t\t\t当前账户余额为%.2f\n",pNode->per.fMoney);
	return 1;
}

修改密码界面

int ChangePa(Node *pNode){
	char passWord1[7],passWord2[7];
	printf("\n\t\t\t\t\t请输入原密码:");
	scanf("%s",passWord1);
	printf("\n\t\t\t\t\t请输入新密码:");
	scanf("%s",passWord2);
	for(int i=0;i<3;i++){
		if(strcmp(passWord1,pNode->per.szPassword)!=0){
			printf("\n\t\t\t\t\t原密码输入错误!还有%d次输入机会,请重新输入:\n",2-i);
			scanf("%s",passWord1);
		}
		else{
			strcpy(pNode->per.szPassword,passWord2);
			printf("\n\t\t\t\t\t密码修改完成!\n");
			return 1;
		} 
	}
	return 1;
}

销户界面

int CancelAccount(){
	char Number[20],passWord[7];
	printf("\n\t\t\t\t\t请输入所需要注销的账户卡号:");
	scanf("%s",Number);
	
	Node *p=g_pHead,*q=g_pHead;
	while(p!=NULL){
		if(strcmp(p->per.szAccountNumber,Number)!=0){
			q=p;
			p=p->pNext;
			continue;
		}
		else{
			int i=0;
			for(i=0;i<3;i++){
				printf("\n\t\t\t\t\t请输入所需要注销的账户卡号密码:");
				scanf("%s",passWord);
				if(strcmp(passWord,p->per.szPassword)!=0){
					printf("\n\t\t\t\t\t密码输入错误,请重新输入密码,剩余次数:%d\n",2-i);
					system("pause");
					system("cls");
					continue;
				}
				else{
					q->pNext=p->pNext;
					free(p);
					printf("\n\t\t\t\t\t注销账户成功!\n");
					return 1;
				}
				printf("\n\t\t\t\t\t注销账户失败!\n");
				return 0;
			}
		}
	}
	return 1;
}

四.思考题

Ⅰ.简述需求说明书,概要设计,详细设计说明书的主要内容。
1>需求说明书
主要内容:主要包括开发软件系统的目的、意义和背景,用户的特点、约束,需求说明(功能说明,性能说明,输入输出要求,数据管理要求,故障处理要求),数据描述(数据流图,数据字典,接口说明),运行环境规定,限制(说明软件开发在成本、进度、设计和实现方面的限制)这几个方面。
2>概要设计说明书
主要内容:包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、安全设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。
3>详细设计说明书
主要内容:详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序(每个模块或子程序)的设计考虑,如果一个软件系统比较简单,层次很少,则可将有关内容合并入概要设计说明书。

Ⅱ.结构化分析方法与面向对象分析方法有无本质上的不同?
1>结构化分析方法
分析问题的过程中各个环节联系紧密,环环相扣。主要用来分析系统的功能,是一种直接根据数据流划分功能层次的分析方法,该方法较为传统,主要适用于数据处理。主要帮助开发人员定义系统需要做什么,系统需要存储和使用那些数据,系统需要什么样的输入和输出,以及如何把这些功能结合在一起来完成任务。面向过程分析的主要工具是数据流图(DFD)。

2>面向对象分析方法
定义在系统中工作的所有类型的对象,且对象之间相互独立,互不影响,但通过整体性的协调和相互作用完成任务,构成完整的体系。面向对象的方法关注的是事件、重用和继承,关注的多态,它自己有一整套独特的思维方式,这和面向过程方法是根本不同的。但相对于结构化分析方法而言呢,其各个部分或者环节是可以经过修改的,而且不会对其他部分造成多余的影响。 面向对象分析方法主要分为问题分析和应用分析两个方面。面向对象分析方法则是根据获得的需求信息从中抽象出类与对象并分析他们之间的静态关系,再结合实际问题,确定对象的动态行为以及对象间的信息传递,以此建立需求模型。主要工具是统一建模语言(UML)。

二者有本质不同:
①将系统分解成子系统的方式不同。前者将系统描述成一组交互作用的处理,后者则描述成一组交互作用的对象。
②子系统之间的交互关系的描述方式不一样。前者加工之间的交互是通过不太精确的数据流来表示的,而后者对象之间通过消息传递交互关系。因此,面向对象软件需求分析的结果能更好地刻画现实世界,处理复杂问题,对象比过程更具有稳定性,便于维护与复用。

Ⅲ.对数据流图进行审查有何意义?
意义:数据流图是一种分析工具,全面地描述系统数据流程,整个系统中信息的全貌在数据流程图中用一组符号来描述,综合地反映出系统中信息的流动、处理和存储情况。它在系统分析中的作用是,它用结构化系统分析方法从数据传递和加工角度出发,用图形方式来表达系统的逻辑功能、数据在系统内部的逻辑流向和逻辑变换过程。对数据流图进行审查的意义是确保两大特性:一致性和完整性。
一致性:分层DFD中不存在矛盾和冲突。
完整性:是否有遗漏的数据流、加工等。

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

posted on 2020-12-08 01:58  繁霜银河  阅读(425)  评论(0编辑  收藏  举报