软件体系结构实验报告.docx

上传人:b****4 文档编号:3833705 上传时间:2023-05-06 格式:DOCX 页数:48 大小:355.38KB
下载 相关 举报
软件体系结构实验报告.docx_第1页
第1页 / 共48页
软件体系结构实验报告.docx_第2页
第2页 / 共48页
软件体系结构实验报告.docx_第3页
第3页 / 共48页
软件体系结构实验报告.docx_第4页
第4页 / 共48页
软件体系结构实验报告.docx_第5页
第5页 / 共48页
软件体系结构实验报告.docx_第6页
第6页 / 共48页
软件体系结构实验报告.docx_第7页
第7页 / 共48页
软件体系结构实验报告.docx_第8页
第8页 / 共48页
软件体系结构实验报告.docx_第9页
第9页 / 共48页
软件体系结构实验报告.docx_第10页
第10页 / 共48页
软件体系结构实验报告.docx_第11页
第11页 / 共48页
软件体系结构实验报告.docx_第12页
第12页 / 共48页
软件体系结构实验报告.docx_第13页
第13页 / 共48页
软件体系结构实验报告.docx_第14页
第14页 / 共48页
软件体系结构实验报告.docx_第15页
第15页 / 共48页
软件体系结构实验报告.docx_第16页
第16页 / 共48页
软件体系结构实验报告.docx_第17页
第17页 / 共48页
软件体系结构实验报告.docx_第18页
第18页 / 共48页
软件体系结构实验报告.docx_第19页
第19页 / 共48页
软件体系结构实验报告.docx_第20页
第20页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

软件体系结构实验报告.docx

《软件体系结构实验报告.docx》由会员分享,可在线阅读,更多相关《软件体系结构实验报告.docx(48页珍藏版)》请在冰点文库上搜索。

软件体系结构实验报告.docx

软件体系结构实验报告

南京信息工程大学实验(实习)报告

实验(实习)名称软件体系结构设计实验(实习)日期11.9.2010得分指导教师潘锦基

系计算机专业软件工程年级2009班次1姓名武奎俊学号20092344022

1实验目的.

(1)熟练使用环境进行小规模软件体系结构设计。

(2)进一步掌握软件体系结构的描述。

(3)掌握常用的软件体系结构风格。

(4)培养团队协作精神。

2.实验内容

学生成绩管理系统用于学生成绩的管理和查询,该系统能完成成绩的录入、修改、查询、统计等基本功能以及用户的管理。

根据具体情况,选择合适的软件体系结构风格,设计该系统的软件体系结构。

3.实验准备

(1)合理分组,确定负责人。

(2)熟悉常用的软件体系结构风格及其优缺点。

(3)熟悉软件体系结构描述方法。

(4)熟悉学生成绩管理系统的需求。

4.实验步骤

现有学生成绩信息,内容如下:

姓名学号语文数学英语

张明明01677882

李成友02789188

张辉灿03688256

王露04564577

陈东明05673847

设计要求:

(1)信息维护:

要求学生信息数据要以文件的形式保存,能实现学生信息数据的维护。

此模块包括子模块有:

增加学生信息、删除学生信息、修改学生信息

(2)信息查询:

要求查询时可实现按姓名查询、按学号查询

(3)成绩统计:

要求输入任意的一个课程名(如数学)和一个分数段(如60--70),统计出在此分数段的学生情况。

(4)排序:

能对用户指定的任意课程名,按成绩升序或降序排列学生数据并显示排序结果(使用表格的形式显示排序后的输出结果)(使用多种方法排序者,加分)

(5)至少采用文本菜单界面(如果能采用图形菜单界面更好)

(6)学生可自动增加新功能模块(视情况可另外加分)

主要技术指标及特点

程序流程图如下:

登录界面显示

 

此登录界面是预先设定好作为菜单来显示的,在主函数中以menu()来实现的,在函数中,是通过switch……case来实现选择功能的,用户可以通过需要进行选择,方便了用户的使用,非常人性化。

登记学生资料

 

当系统中没有保存学生信息时,就会提示没有学生记录!

也就是说不能从文件中导出,这时就需要用户进行学生资料的导入,当输入的学号已经存在时,系统会提示用户重新输入一个未被占用的学号信息,否则就重新分配内存空间。

保存学生资料

该操作是将用户输入的学生信息进行保存,用文件的方法进行调试,当用户输入对象的个数超过0时,显示保存成功,否则提示,系统连接为空。

删除学生资料

删除后结果紧随其后

这里又是通过switch……case函数的调用,让用户进行选择,共有两种方法:

1.按照学号2.按照姓名,操作完成后,系统会自动提示,该学生已经成功删除,当再次显示的时候,函数中的链表就不再指向该学号,从而起到删除的作用。

删除完成后,再次保存一下学生资料,不然系统仍然默认为原始人数。

修改学生资料

通过选择到达修改界面:

此时将呈现出现有的学生资料,按照要求将新的信息输入其中,再保存资料,如果输入的学号系统中未显示,那么系统则提示没有资料可以修改。

这个为修改完的图片

查询学生资料

按照选择,则会呈现出用户需要查找的所有信息,每次呈现出来的时候都要用之前定义的printheader()函数,这个很好地将数据按照格式化的形式显现出来。

此为按照学号查找的例子,按照姓名查找是同样道理。

统计学生资料

统计学生资料主要还是用的switch……case函数,通过选择,用printheader(),printdata(r),printf(END)等函数用表格的形式将符合条件的学生信息全部显示出来,不过唯一不足的就是所有的学生信息没有能够连贯起来,每个学生信息前面都有表头,没处理好。

对学生资料进行排序

该图显示的是按照语文成绩排序完的结果,用链表将数据进行一个接一个的比较,按照降序将学生信息排列下来,最后提示排序已经完成,并将所有结果按照用户要求显示出来。

程序主要代码

#include"stdio.h"/*标准输入输出函数库*/

#include"stdlib.h"/*标准函数库*/

#include"string.h"/*字符串函数库*/

#include"conio.h"/*屏幕操作函数库*/

#defineHEADER1"----------------------------学生成绩----------------------------\n"

#defineHEADER2"|学号|姓名|语文|数学|英语|总分|均分|\n"

#defineHEADER3"|---------------|---------------|----|----|----|--------|-------|"

#defineFORMAT"|%-10s|%-15s|%4d|%4d|%4d|%4d|%.2f|\n"

#defineDATAp->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave

#defineEND"--------------------------------------------------------------\n"

intshoudsave=0;/**/

structstudent

{

charnum[10];/*学号*/

charname[20];

charsex[4];

intcgrade;

intmgrade;

integrade;

inttotal;

floatave;

charneartime[10];/*最近更新时间*/

};

typedefstructnode

{

structstudentdata;

structnode*next;

}Node,*Link;

voidmenu()

{

system("cls");/*调用DOS命令,清屏.与clrscr()功能相同*/

cprintf("\n");

cprintf("学生成绩管理系统\n\n");

cprintf("*************************菜单**************************\n");

cprintf("*1登记学生资料2删除学生资料*\n");

cprintf("*3查询学生资料4修改学生资料*\n");

cprintf("*5插入学生资料6统计学生资料*\n");

cprintf("*7排序学生资料8保存学生资料*\n");

cprintf("*9呈现学生资料0退出系统*\n");

cprintf("*******************************************************\n");

/*cprintf()送格式化输出至文本窗口屏幕中*/

}

voidprintheader()/*格式化输出表头*/

{

printf(HEADER1);

printf(HEADER2);

printf(HEADER3);

}

voidprintdata(Node*pp)/*格式化输出表中数据*/

{

Node*p;

p=pp;

printf(FORMAT,DATA);

}

voidWrong()

{

printf("\n=====>提示:

输入错误!

\n");

}

voidNofind()

{

printf("\n=====>提示:

没有找到该学生!

\n");

}

voidDisp(Linkl)/*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/

{

Node*p;

p=l->next;/*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/

if(!

p)/*p==NULL,NUll在stdlib中定义为0*/

{

printf("\n=====>没有学生记录!

\n");

getchar();

return;

}

printf("\n\n");

printheader();/*输出表格头部*/

while(p)/*逐条输出链表中存储的学生信息*/

{

printdata(p);

p=p->next;/*移动直下一个结点*/

printf(HEADER3);

}

getchar();

}

/*************************************************************

作用:

用于定位链表中符合要求的节点,并返回指向该节点的指针

参数:

findmess[]保存要查找的具体内容;nameornum[]保存按什么查找;

在单链表l中查找;

**************************************************************/

Node*Locate(Linkl,charfindmess[],charnameornum[])/*该函数用于定位连表中符合要求的接点,并返回该指针*/

{

Node*r;

if(strcmp(nameornum,"num")==0)/*按学号查询*/

{

r=l->next;

while(r!

=NULL)

{

if(strcmp(r->data.num,findmess)==0)

returnr;

r=r->next;

}

}

elseif(strcmp(nameornum,"name")==0)/*按姓名查询*/

{

r=l->next;

while(r!

=NULL)

{

if(strcmp(r->data.name,findmess)==0)

returnr;

r=r->next;

}

}

return0;

}

/*增加学生记录*/

voidAdd(Linkl)

{

Node*p,*r,*s;/*实现添加操作的临时的结构体指针变量*/

charch,flag=0,num[10];

r=l;

s=l->next;

system("cls");

Disp(l);/*先打印出已有的学生信息*/

while(r->next!

=NULL)

r=r->next;/*将指针移至于链表最末尾,准备添加记录*/

while

(1)/*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/

{

while

(1)/*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/

{

printf("请你输入学号(以'0'返回上一级菜单:

)");

scanf("%s",num);

flag=0;

if(strcmp(num,"0")==0)/*输入为0,则退出添加操作,返回主界面*/

{return;}

s=l->next;

while(s)/*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/

{

if(strcmp(s->data.num,num)==0)

{

flag=1;

break;

}

s=s->next;

}

if(flag==1)/*提示用户是否重新输入*/

{getchar();

printf("=====>学号%s不存在,重新输入吗?

(y/n):

",num);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

continue;

else

return;

}

else

{break;}

}

p=(Node*)malloc(sizeof(Node));/*申请内存空间*/

if(!

p)

{

printf("\n分配内存失败");/*如没有申请到,打印提示信息*/

return;/*返回主界面*/

}

strcpy(p->data.num,num);/*将字符串num拷贝到p->data.num中*/

printf("请你输入姓名:

");

scanf("%s",p->data.name);

getchar();

printf("请你输入语文成绩:

");

scanf("%d",&p->data.cgrade);

getchar();

printf("请你输入数学成绩:

");

scanf("%d",&p->data.mgrade);

getchar();

printf("请你输入英语成绩:

");

scanf("%d",&p->data.egrade);

p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=p->data.total/3;

getchar();

/*信息输入已经完成*/

p->next=NULL;

r->next=p;

r=p;

shoudsave=1;

}

}

voidQur(Linkl)/*按学号或姓名,查询学生记录*/

{

intsel;/*1:

按学号查,2:

按姓名查,其他:

返回主界面(菜单)*/

charfindmess[20];/*保存用户输入的查询内容*/

Node*p;

if(!

l->next)/*若链表为空*/

{

system("cls");

printf("\n=====>提示:

没有资料可以查询!

\n");

return;

}

system("cls");

printf("\n=====>1按学号查找\n=====>2按姓名查找\n");

printf("请选择[1,2]:

");

scanf("%d",&sel);

if(sel==1)/*学号*/

{

printf("请你输入要查找的学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/

if(p)/*若p!

=NULL*/

{

printheader();

printdata(p);

printf(END);

printf("请按任意键返回");

getchar();

}

else

Nofind();

getchar();

}

elseif(sel==2)/*姓名*/

{

printf("请你输入要查找的姓名:

");

scanf("%s",findmess);

p=Locate(l,findmess,"name");

if(p)

{

printheader();

printdata(p);

printf(END);

printf("请按任意键返回");

getchar();

}

else

Nofind();

getchar();

}

else

Wrong();

}

/*删除学生记录:

先找到保存该学生记录的节点,然后删除该节点*/

voidDel(Linkl)/*删除*/

{

intsel;

Node*p,*r;

charfindmess[20];

if(!

l->next)

{

printf("\n=====>提示:

没有资料可以删除!

\n");

getchar();

return;

}

printf("\n=====>1按学号删除\n=====>2按姓名删除\n");

scanf("%d",&sel);

if(sel==1)

{

printf("请你输入要删除的学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");

if(p)

{

r=l;

while(r->next!

=p)

r=r->next;

r->next=p->next;

free(p);

printf("\n=====>提示:

该学生已经成功删除!

\n");

getchar();

shoudsave=1;

}

else

Nofind();

}

elseif(sel==2)

{

printf("请你输入要删除的姓名:

");

scanf("%s",findmess);

p=Locate(l,findmess,"name");

if(p)

{

r=l;

while(r->next!

=p)

r=r->next;

r->next=p->next;

free(p);

printf("\n=====>提示:

该学生已经成功删除!

\n");

getchar();

shoudsave=1;

}

else

Nofind();

getchar();

}

else

Wrong();

getchar();

}

/*修改学生记录。

先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改*/

voidModify(Linkl)

{

Node*p;

charfindmess[20];

if(!

l->next)

{system("cls");

printf("\n=====>提示:

没有资料可以修改!

\n");

getchar();

return;

}

system("cls");

printf("修改学生资料");

Disp(l);

printf("请你输入要修改的学生学号:

");

scanf("%s",findmess);

p=Locate(l,findmess,"num");

if(p)

{

printf("请你输入新学号(原来是%s):

",p->data.num);

scanf("%s",p->data.num);

printf("请你输入新姓名(原来是%s):

",p->data.name);

scanf("%s",p->data.name);

getchar();

printf("请你输入新的语文成绩(原来是%d分):

",p->data.cgrade);

scanf("%d",&p->data.cgrade);

getchar();

printf("请你输入新的数学成绩(原来是%d分):

",p->data.mgrade);

scanf("%d",&p->data.mgrade);

getchar();

printf("请你输入新的英语成绩(原来是%d分):

",p->data.egrade);

scanf("%d",&p->data.egrade);

p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=p->data.total/3;

printf("\n=====>提示:

资料修改成功!

\n");

shoudsave=1;

getchar();

}

else

Nofind();

getchar();

}

/*插入记录:

按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。

*/

voidInsert(Linkl)

{

Linkp,v,newinfo;/*p指向插入位置,newinfo指新插入记录*/

charch,num[10],s[10];/*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/

intflag=0;

v=l->next;

system("cls");

Disp(l);

while

(1)

{printf("请输入需要插入的新学号:

\n");

scanf("%s",num);

flag=0;v=l->next;

while(v)/*查询该学号是否存在,flag=1表示该学号存在*/

{

if(strcmp(v->data.num,s)==0){flag=1;break;}

v=v->next;

}

if(flag==1)

break;/*若学号存在,则进行插入之前的新记录的输入操作*/

else

{getchar();

printf("\n=====>学号%s不存在,重新试吗?

(y/n):

",s);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

{continue;}

else

{return;}

}

}

/*以下新记录的输入操作与Add()相同*/

printf("请输入需要输入的新学生学号:

\n");

scanf("%s",num);

v=l->next;

while(v)

{

if(strcmp(v->data.num,num)==0)

{

printf("=====>对不起,新学号:

'%s'已经存在!

\n",num);

printheader();

printdata(v);

printf("\n");

getchar();

return;

}

v=v->next;

}

newinfo=(Node*)malloc(sizeof(Node));

if(!

newinfo)

{

printf("\n分配资源失败");/*如没有申请到,打印提示信息*/

return;/*返回主界面*/

}

strcpy(newinfo->data.num,num);

printf("请输入学生的姓名:

\n");

scanf("%s",newinfo->data.name);

printf("请输入学生的语文成绩[0-100]:

\n");

scanf("%s",newinfo->data.cgrade);

printf("请输入学生的数学成绩[0-100]:

\n");

scanf("%s",newinfo->data.mgrade);

printf("请输入学生的英语成绩[0-100]:

\n");

scanf("%s",newinfo->data.egrade);

newinfo->data.total=newinfo->data.egrade+newinfo->data.cgrade+newinfo->data.mgrade;

newinfo->data.ave=(float)(newinfo->data.total/3);

newinfo->next=NULL;

shoudsave=1;/*在main()有对该全局变量的判断,若为1,则进行存盘操作*/

/*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着学生的记录*/

p=l->next;

while

(1)

{

if(strcmp(p->data.num,s)==0)/*在链表中插入一个节点*/

{

newinfo->next=p->next;

p->next=newinfo;

brea

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2