实验二 结构化分析与设计
一.实验目的
(1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;
(5)掌握测试的基本方法。
二.实验内容
(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;
(2)绘制系统的分层数据流图,并给出数据字典;
(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;
(4)为关键模块进行详细设计,如绘制关键模块的流程图;
(5)实现系统部分功能并测试。
三.实验步骤
1.顶层图
2.一层数据图
3.子图1
4.子图2
5.数据字典
6.软件结构图
7.部分功能测试
定义
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
//机票预订系统
struct FLIGHT
{
char fli[4]; //航班号
int num;
}flights[20];
struct node
{
char name[40]; //姓名
char sex[1]; //性别
char tele[20]; //手机号
char D[18]; //身份证号码
char fli[4]; //航班号
struct node *users;//指向下一结点的指针
};
int total;//需要录入的旅客数
int sum=0,flag=0;//记录系统中旅客信息的数量
struct node *users=NULL;//这个要放在外面声明,放在个函数内部,无法共享
清除录入失败的用户信息
void clear(int sum)
{
if(users==NULL)
users=(struct node *)malloc(total*sizeof(struct node));
strcpy(users[sum].name,users[sum+1].name);
strcpy(users[sum].sex,users[sum+1].sex);
strcpy(users[sum].tele,users[sum+1].tele);
strcpy(users[sum].D,users[sum+1].D);
strcpy(users[sum].fli,users[sum+1].fli);
}
录入旅客信息
void enter() //录入旅客信息............................................................................
{
int i;
if(flag==0)
{
flag=1;
system("cls");
printf("请输入录入旅客的数量:");
scanf("%d",&total);
system("cls");
}
if(users==NULL)
users=(struct node *)malloc(total*sizeof(struct node));
if(sum<total)
{
printf("请输入姓名: ");
scanf("%s",users[sum].name);
printf("请输入性别: ");
scanf("%s",users[sum].sex);
printf("请输入手机号: ");
scanf("%s",users[sum].tele);
printf("请输入身份证号码: ");
scanf("%s",users[sum].D);
for(i=0;i<sum;i++)
{
if(strcmp(users[sum].name,users[i].name)==0)
{
printf("\n\n操作失败!\n姓名重复!\n");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("\n\n按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].tele,users[i].tele)==0)
{
printf("\n\n操作失败!\n电话重复!\n");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("\n\n按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].D,users[i].D)==0)
{
printf("\n\n操作失败!\n身份证号重复!\n");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("\n\n按回车返回上一界面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
}
if(i>=sum||sum==0)
{
sum++;
printf("\n\n操作成功!\n");
printf("可录入人数为%d个,当前人数为%d个",total,sum);
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
return;
}
else
{
printf("人数超标\n ");
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
}
机票预订
void book(struct FLIGHT flights[20]) //机票预订
{
int i,j;
char fli[4],name[40],D[18];
system("cls");
printf("航班号 出发地 目的地 出发时间 预计到达时间 剩余座位\n");
printf(" %s 广州 上海 12:30 19:30 %d \n",flights[0].fli,flights[0].num);
printf(" %s 广州 北京 13:30 21:30 %d \n",flights[1].fli,flights[1].num);
printf("\n\n请输入乘客姓名:");
scanf("%s",name);
printf("请输入乘客身份证号:");
scanf("%s",D);
for(i=0;i<sum;i++)
if(strcmp(users[i].name,name)==0 && strcmp(users[i].D,D)==0)
{
flag=1;
printf("乘客绑定成功!\n");
break;
}
if(i>=sum)
{
printf("\n未查找到该乘客\n");
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
printf("请选择航班:");
scanf("%s",fli);
for(j=0;j<20;j++)
{
if(strcmp(flights[j].fli,fli)==0)
{
flights[j].num-=1;
strcpy(users[i].fli,fli);
printf("\n订票成功\n");
break;
}
else
{
printf("\n未查找到该航班\n");
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
航班查询
void inquiry()//航班查询............................................................................
{
char name[40];
char D[18];
int i,flag=0;
printf("\n");
printf("\n");
printf("请输入姓名:");
scanf("%s",name);
printf("请输入身份证号:");
scanf("%s",D);
for(i=0;i<sum;i++)
if(strcmp(users[i].name,name)==0 && strcmp(users[i].D,D)==0)
{
flag=1;
printf("您的航班号为:%s\n",users[i].fli);
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
return;
}
if(flag==0)
{
printf("\n");
printf("错误!");
printf("\n\n按回车返回上一界面......");
getchar();
getchar();
system("cls");
}
}
主函数
int main()
{
int choice;
struct FLIGHT flights[20] = {{"D20",18}, {"D21",16}};
system("cls");
while(1)
{
printf("\n\n\t\t************* 欢迎进入机票预订系统 **************\n");
printf("\n");
printf("\n");
printf("\t\t1:录入旅客信息\n");
printf("\t\t2:机票预订\n");
printf("\t\t3:查询航班信息\n");
printf("\t\t4:注册账户(暂未开放)\n");
printf("\t\t5:账户充值(暂未开放)\n");
printf("\t\t6:余额查询(暂未开放)\n");
printf("\t\t0:退出系统\n");
printf("\n");
printf("\t\t*********** 请选择您需进行的选项 ****************\n\n\n");
printf("\n\n");
printf("请选择:");
scanf("%d",&choice);
printf("\n\n");
switch(choice)
{
case 1:
system("cls");
enter(); //录入旅客信息
break;
case 2:
system("cls");
book(flights); //预订机票
break;
case 3:
system("cls");
inquiry();
break;
case 4:
system("cls");
break;
case 5:
system("cls");
break;
case 6:
system("cls");
break;
case 0:
exit(0);
break;
}
}
return 0;
}
录入信息
订票功能
航班查询功能
四.思考题
(1)简述需求说明书,概要设计,详细设计说明书的主要内容。
(2)结构化分析方法与面向对象分析方法有无本质上的不同?
答:结构化系统分析方法是采用“自顶向下,由外到内,逐层分解'的思想对复杂的系统进行分解化简,从而有效地控制了系统分析每一步的难度,并运用数据流图、加工说明和数据字典作为表达工具的一种系统分析技术。
而面向对象的分析方法则是通过将数据和逻辑结构抽象成为对象,运用对象属性和方法等来操作和处理业务数据和逻辑的系统分析方法。
两者的区别在于:当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到最简洁、高效率的逻辑模型,结构化方法对复杂问题的帮助有限,而面向对象的分析方法提供了一种方便的、可持续观测和扩展系统的机制,通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,对于需求变化频繁的系统,可以用面向对象软件系统的方法。
(3)对数据流图进行审查有何意义?
对数据流进行审查,是对系统功能的一种检验。
系统编写参照数据流图中的信息流向,一旦数据流中出现数据缺失或流向错误,此模块的系统的编写也会出现或多或少的问题。
对数据流图进行审查,比起对代码进行复核更为直观。
(4)给出一次完整的会议讨论纪要,包括议题,最终结果。