《软件工程导论》实验报告.docx
- 文档编号:10633928
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:29
- 大小:62.05KB
《软件工程导论》实验报告.docx
《《软件工程导论》实验报告.docx》由会员分享,可在线阅读,更多相关《《软件工程导论》实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
《软件工程导论》实验报告
软件工程导论
实验报告
学院:
班级
姓名
学号
、
2012年5月5日
实验一:
:
项目计划、分析和设计
[实验日期]2012年4月14日
[实验目的]
初步了解结构化分析、设计方法的原理、步骤以及各阶段的文档,练习撰写简要的需求文档、设计文档。
[实验内容]
根据周围的实际应用需求,自选一个小型的C语言应用项目,依据项目可行性研究的结果,进行需求分析和设计,编写简要的需求文档、设计文档。
[实验原理和步骤]
当前的建模方法主要有传统的结构化分析、设计方法(SA/D)和面向对象分析、设计方法(OOA/D)两种,以下只对SA/D进行说明。
分析阶段:
结构化分析(SA)是一种建模技术,它通过一定方法帮助开发人员定义系统需要什么功能,系统需要存储和使用哪些数据,以及为完成这些功能,系统需要什么样的输入和输出以及如何把这些功能结合在一起来完成任务。
结构化分析方法的实质是采用一组分层数据流图及相应的数据字典作为系统的模型,从总体来看是一种强烈依赖数据流图的自顶向下的建模方法。
由事件列表、数据流图、实体关系图、数据流定义、数据字典、结构化英语、状态转换图等最终构成系统的分析模型。
设计阶段:
分总体设计和详细设计两阶段。
总体设计阶段的任务主要是确定系统由哪些模块组成,以及这些模块之间的相互关系;详细设计阶段的任务主要是设计每个模块的处理过程。
总体设计又称为概要设计或初步设计,它的基本目的就是回答“概括地说,系统应该如何实现?
”这个问题。
总体设计通常由系统设计和结构设计两个阶段组成。
系统设计阶段确定一个合理的、具体的实现方案;结构设计阶段确定软件的结构,即确定系统由哪些模块组成,以及这些模块之间的相互关系。
【方案+体系结构】
常用的结构化设计(SD)方法有面向数据流分析(DFA)的设计方法和面向数据的设计方法【如Jackson方法(JSD)和逻辑构造程序方法(LCP)(一般用于详细设计)】。
DFA方法以数据流图为基础,它定义了把DFD(变换型数据流,事务型数据流及混合型)变换成软件结构图(SC)的不同映射方法。
DFA设计技术实施的通用步骤:
(1)复查并精化DFD;
(2)确定DFD类型;(3)把DFD映射到系统模块结构,设计出模块结构的上层;(4)基于DFD逐步分解高层模块,设计出下层模块〈初步结构〉;(5)根据模块独立性原理,精化模块结构,得到更为合理的软件结构;(6)模块接口描述;(7)修改和补充数据词典;(8)制定测试计划。
详细设计阶段的任务主要是确定每个模块的处理过程,包括
(1)确定每个模块的算法。
(2)确定每一个模块的数据组织。
(3)为每个模块设计一组测试用例。
(4)编写详细设计说明书。
详细设计阶段采用的方法是结构化程序设计(SP),与SA,SD方法衔接。
目标是给出可以直接用以编码的程序逻辑结构,强调清晰第一。
【实验结果】
1、功能:
构建一个选修课的管理系统,其中每个学生的信息由:
学号、姓名、班级、成绩等几项数据构成,通过链表进行数据管理,实现以下基本功能:
插入、删除、查询、浏览、初始化、导入、导出等
2、IPO图:
数据输入处理输出
3、设计数据结构
运用链表构造该系统,同时朱门运用typedef定义结点结构体类型,并通过定义和调用函数来实现各个功能模块
主菜单页面:
各选项功能
4、伪代码
Typedefstructst
{cahrnum[10],name[9],bclass[11];
floatscore1,score2,score;
structst*next;
}stud;
charmenu();
stud*load();
stud*search(stud*,int*);
voidsave(stud*);
voidscorein(stud*);
voidinsert(stud*);
voiddeletel(stud*);
voidchange(stud*);
voidbrowse(stud*);
表头
While
(1)
{
Switch(choice)
{case1:
printf(“浏览选课情况:
\n”);浏览选项
case2:
printf(“查询选课学生:
\n”);浏览选项
…………
case0:
printf(“退出选修课系统:
\n”);
是否保存数据到文件
If(Yes)保存并退出;
else直接退出
}
if(choice=='0')break;
printf(“按任意键继续………”)
}
主菜单页面
Voidbrowse(stud*head)
{inti=0;
stud*p;
p=head->next;
while(p!
=NULL)
{输出结果}
Voidinsert(stud*head)
{插入新结点;
do
{
输入学生具体信息
}while(条件);}
Stud*search(stud*hea,int*i)
{int姓名、学号;
If(姓名)
{输入姓名;
While(找到姓名)
{输出}}
else
{输入学号
While(找到学号)
{输出}}
Voiddeletel(structst*head)
{inti,xz,n;
p=head;
if(指针不为空)
{选择删除方式;
删除结点;}
If(结点为空)
{无可执行删除}
Voidscorein(stud*head)
{输入成绩在总评成绩中的百分比;
While(指针不为空)
{录入成绩}}
Voidchange(stud*head)
{stud*p;
do
{
查找结点
If(找到)
{输出数据}
}while(!
p);
选择修改部分;
Switch(xz)
{case1:
修改学号;
case2:
修改班级;
case3:
修改姓名;
case4:
修改平时成绩;
case5;修改期末成绩;
}}
Stud*load()
{FILE*fp;
puts(需要从哪个文件导入)
If(文件为空)找不到;
while(找到文件)
{打开文件}}
Voidsave(stud*head)
{FILE*fp;
Puts(选课情况导入的文件)
If(文件为空)无法导入;
While(不为空)
{导入文件}}
【实验总结】
1、注意先对整个程序进行结构的规划,选择可以用的函数类型
2、IPO图的运用意识还不是很强,而且也不能更好的将其运用到所需的程序编写中
实验二编码
[实验日期]2012年4月19日
[实验目的]培养良好的编码风格
[实验内容]
根据详细设计的结果,按结构化思想编写代码,并对程序进行注释。
[实验原理和步骤]
编码风格强调“清晰易读”而不是个人技巧。
请注意变量或函数的名字要有意义,表达式和语句要一目了然,排版风格、循环语句风格要保持一致,函数宏的定义,常数的定义,注释要全面。
#include
#include
#include
typedefstructst
{
charnum[10],name[9],bclass[11];//学号、姓名、班级
floatscore1,score2,score;//平时成绩、期末成绩、总评成绩
structst*next;
}stud;
charmenu();//选单
stud*load();//导入
stud*search(stud*,int*);//查询
voidsave(stud*);//导入
voidscorein(stud*);//成绩录入
voidinsert(stud*);//插入
voiddeletel(stud*);//删除
voidchange(stud*);//修改
voidbrowse(stud*);//浏览
//************************************************************
main()
{
charchoice,c;
inti;
stud*head,*p;
head=(stud*)malloc(sizeof(stud));//准备好表头
head->next=NULL;
while
(1)
{
choice=menu();
switch(choice)
{
case'1':
printf("浏览选课情况。
\n");
browse(head);getchar();break;
case'2':
printf("插入选课学生。
\n");
insert(head);break;
case'3':
printf("查询选课学生。
\n");
p=search(head,&i);
if(p!
=NULL)//输入数据
{
printf("%2d%10s%8s%10s",i,p->num,p->name,p->bclass);
printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score);
}
elseprintf("未找到!
");break;
case'4':
printf("删除学生记录。
\n");
deletel(head);break;
case'5':
printf("学生成绩录入。
\n");
scorein(head);break;
case'6':
printf("修改学生记录。
\n");
change(head);break;
case'7':
printf("从文件中将选课情况导入链表。
\n");
head=load();break;
case'8':
printf("将链表中选尅情况保存到文件。
\n");
save(head);break;
case'9':
printf("系统初始化。
\n");
head=(stud*)malloc(sizeof(stud));
head->next=NULL;
printf("%d%d\n",head,head->next);
break;
case'0':
printf("退出选修课管理系统。
\n");
printf("是否保存当前数据到文件?
(Y/N):
");
c=toupper(getchar());getchar();
if(c=='Y')save(head);
break;
default:
printf("输入错误!
");
}
if(choice=='0')break;
printf("\n按任意键继续......!
");
getchar();
}
}
//***********************************************************
charmenu()
{
charc;
printf("\n\n\n\n\n\n\n=====通讯录管理系统=====\n");
printf("-----------\n");
printf("1、浏览选课情况\n");
printf("2、插入选课学生\n");
printf("3、查询选课学生\n");
printf("4、删除学生记录\n");
printf("5、学生成绩录入\n");
printf("6、修改学生记录\n");
printf("7、从文件中将选课情况导入到链表中\n");
printf("8、将链表中选课情况导出到文件\n");
printf("9、系统初始化\n");
printf("0、退出系统\n");
printf("\n\n请选择......\n\n\n\n\n");
c=getchar();
getchar();
returnc;
}
voidbrowse(stud*head)
{
//将链表中各结点的数据一次输出
inti=0;
stud*p;//工作指针
p=head->next;//指向首结点
printf("序号学号姓名班级平时成绩期末成绩总评成绩\n");
while(p!
=NULL)//指针不空
{
printf("%2d%-10s%-8s%-10s",++i,p->num,p->name,p->bclass);
printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score);
p=p->next;//工作指针p移动
}
}
//***********************************************************
voidinsert(stud*head)
{
//插入新结点,并使链表各结点按学号升序排列
charan,xh[10],xm[9],bc[11];
stud*p,*q;//工作指针
do{
p=head;
printf("请输入学生的学号、姓名、班级:
\n");
gets(xh);gets(xm);gets(bc);//输入数据
if(!
strcmp(xh,"0000"))return;//以“0000”作为结束标记
while((p->next!
=NULL)&&(strcmp(xh,p->next->num)>=0))
p=p->next;//查找新结点的插入位置
q=(stud*)malloc(sizeof(stud));//生成新结点由q指向
strcpy(q->num,xh);
strcpy(q->name,xm);
strcpy(q->bclass,bc);
q->next=p->next;p->next=q;//把新结点插入链表中
printf("继续吗?
");
an=toupper(getchar());getchar();
}while(an=='Y');
}
//**********************************************************
stud*search(stud*head,int*i)
{//在链表中按姓名或学号进行查找
intxz;
charxh[10],xm[9];
stud*p;//工作指针
p=head->next;*i=1;//指向首结点
printf("1.按姓名查找0.按学号查找\n");
scanf("%d",&xz);
getchar();
if(xz)
{
printf("请输入学生姓名:
\n");
gets(xm);//输入姓名
while(p!
=NULL&&strcmp(xm,p->name)!
=0)//按姓名查找
{
p=p->next;
(*i)++;
}
}
else
{
printf("请输入学生学号:
\n");
gets(xh);//输入学号
while(p!
=NULL&&strcmp(xh,p->num)!
=0)//按学号查找
{
p=p->next;
(*i)++;
}
}
returnp;
}
//**************************************************************
voiddeletel(structst*head)
{//删除结点
inti,xz,n;
charc,xm[9],xh[10];
structst*p,*q;//工作指针
p=head;//指针p指向头结点
if(p->next!
=NULL)
{
printf("1.按学号删除2.按姓名删除3.按序号删除\n");
scanf("%d",&xz);
switch(xz)
{
case1:
printf("请输入学生学号:
\n");
getchar();
gets(xh);//输入学号
while(p->next!
=NULL&&strcmp(xh,p->next->num)!
=0)//按学号查找
p=p->next;
break;
case2:
printf("请输入学生姓名:
\n");
getchar();
gets(xh);//输入学号
while(p->next!
=NULL&&strcmp(xh,p->next->num)!
=0)//按姓名查找
p=p->next;
break;
case3:
printf("请输入序号:
\n");
i=1;
scanf("%d",&n);
getchar();//输入序号
while(p->next!
=NULL&&i p=p->next; i++; } break; default: printf("选择错误! \n"); return; } q=p->next;//指针q指向p的直接后继 if(q==NULL) { printf("未找到指定结点,没有执行删除! \n"); return; } printf("%-10s%-8s请确认! (Y/N)",q->num,q->name); c=getchar(); getchar(); if(tolower(c)=='y') { p->next=q->next;//把结点从链表中删除 free(q); return;//释放q所指的结点 } } printf("无结点可删除! \n"); } //*************************************************************** voidscorein(stud*head) {//依次给链表中各结点的数据录入成绩 inti=0,ps,qm; stud*p;//工作指针 p=head->next;//指向节点 printf("请输入平时成绩在总评成绩中所占的百分比: \n"); scanf("%d",&ps); qm=100-ps; while(p! =NULL)//指针不空 { printf("%2d%10s%8s%10s\n",++i,p->num,p->name,p->bclass); printf("平时成绩期末成绩: "); scanf("%f%f",&p->score1,&p->score2);//;录入平时成绩和期末成绩p->score=p->score1*ps/100+p->score2*qm/100;//计算出总评成绩 printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score); p=p->next;//工作指针p移动 } getchar(); } //************************************************************ voidchange(stud*head) {//对链表中指定结点的数据进行修改 inti=0,xz; floatx,y; stud*p;//工作指针 do{ p=search(head,&i);//查找要修改的结点 if(p)//输出数据 { printf("%2d%10s%8s%10s",i,p->num,p->name,p->bclass); printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score); } elseprintf("未找到! \n"); }while(! p); printf("修改哪些部分信息? \n"); printf("1.修改学号\n"); printf("2.修改姓名\n"); printf("3.修改班级\n"); printf("4.修改平时成绩\n"); printf("5.修改期末成绩\n"); printf("0.不修改\n"); scanf("%d,&xz"); getchar(); switch(xz) { case1: printf("请重新输入学号: "); gets(p->num); break; case2: printf("请重新输入姓名: "); gets(p->name); break; case3: printf("请重新输入班级: "); gets(p->bclass); break; case4: x=p->score1/p->score; y=1-x;//计算平时和期末在总评成绩中所占比例 printf("请重新输入平时成绩: "); scanf("%f",&p->score1); p->score=x*p->score1+y*p->score2;//重新计总评成绩 break; } printf("%2d%10s%8s%10s\n",i,p->num,p->name,p->bclass); printf("%5.1f%5.1f%5.1f\n",p->score1,p->score2,p->score); } //************************************************************* stud*load()//从文件中将选课情况导入到链表 { FILE*fp; charfn[12]; stud*head,*p,*q; puts("从哪个文件中将选课情况导入: "); gets(fn); if((fp=fopen(fn,"rb"))==NULL) { printf("cannotopenfile"); exit(0); } q=head=(stud*)malloc(sizeof(stud)); q->next=NULL; while(! feof(fp)) { p=(stud*)malloc(sizeof(stud)); if(fread(p,sizeof(stud),1,fp)==1) { p->next=q->next; q->next=p; q=p; } } fclose(fp); returnhead; } //************************************************ voidsave(stud*head)//将链表中选课情况保存到文件 { FILE*fp; charfn[12]; stud*p; puts("将选课情况导出到哪个文件中: "); gets(fn);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程导论 软件工程 导论 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)