实验二 结构化分析与设计
一.实验目的
(1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;
(5)掌握测试的基本方法。
二.实验内容
(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;
(2)绘制系统的分层数据流图,并给出数据字典;
(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;
(4)为关键模块进行详细设计,如绘制关键模块的流程图;
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】机票预订系统
参考:
(1)携程网:https://flights.ctrip.com/international/search/domestic
(2)去哪儿:https://www.qunar.com/?ex_track=auto_4e0d874a
为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行
时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出
机票给顾客
【实例2】教材订购系统
销售系统的工作过程为:首先由教师或学生提交购书单,经教材发行人员审核是有效购书单后,开发票、登记并返给教师或学生领
书单,教师或学生即可去书库领书。
采购系统的主要工作过程为:若是脱销教材,则登记缺书,发缺书单给书库采购人员;一旦新书入库后,即发进书单通知给教材发
行人员。
【实例3】图书管理系统
三.实验步骤
(1)复习结构化的分析与设计方法的主要过程;
(2)讨论系统存在的用户角色、工作流等;
(3)对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性;
(4)对应数据流图,设计系统的功能结构图,关键模块的流程图;
(5)选择对应的结构化程序设计语言,实现并测试部分功能模块
四.思考题
1)结构化分析方法与面向对象分析方法有无本质上的不同?
有
结构化分析也是面向过程分析,与面向对象分析是两种思路完全不同的分析方法,面向过程分析方法,就是说我们先考虑问题大的方面,然后再从外面到里面去深入这个问题的细节部分,一步一步去解决问题。
就是问题大的方面,然后我们再深入深入问题的细节部分,逐步解决问题。面向对象分析方法,我们把问题看作由几个对象组成,以对象为主分析问题。
(2)对数据流图进行审查有何意义?
确保以下作用:
1、便于用户表达功能需求和数据需求及其联系;
2、便于两类人员共同理解现行系统和规划系统的框架;
3、清晰表达数据流的情况;
4、有利于系统建模.