电子信息学院数据结构课程设计范例.docx
- 文档编号:15110797
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:31
- 大小:334.45KB
电子信息学院数据结构课程设计范例.docx
《电子信息学院数据结构课程设计范例.docx》由会员分享,可在线阅读,更多相关《电子信息学院数据结构课程设计范例.docx(31页珍藏版)》请在冰点文库上搜索。
电子信息学院数据结构课程设计范例
电子信息学院
课程设计报告
设计名称:
数据结构课程设计
姓名:
学号:
专业班级:
2013级软件工程班
系(院):
计算机与通信工程系
设计时间:
2014~2015学年第二学期
设计地点:
知行楼软件基础实验室
成绩:
指导教师评语:
签名:
年月日
1.课程设计目的
1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
4.训练用系统的观点和软件开发一般规范进行软件开发,巩固、深化学生的理论知识,提高编程水平,并在此过程中培养他们严谨的科学态度和良好的工作作风。
2.课程设计任务与要求:
任务
学生成绩管理
问题描述:
已知某学生成绩表中现有N位同学的成绩(要求各人数据不同),如:
知识点提示:
在线性表中删除某个指定元素,并在规定位置插入一个新元素,要求操作后的结果按元素(姓名)升序的方式显示出来。
学号
姓名
成绩
01101
李平
75
01202
王露
70
01205
张强
85
01118
曹雨
90
……
……
……
现需要删除已转学的某位同学的成绩,同时添加某位同学的成绩(学号、姓名、成绩自定),插入位置按姓名升序排列。
请根据所学过的线性表知识用C/C++编程实现此操作。
程序要求:
(1)现有N位同学的数据要求从数据文件中读入,不用交互方式录入;
(2)拟删除同学的姓名及新添加同学的数据采用交互方式输入;
(3)删除及插入操作完毕,需将成绩表中的所有记录按姓名升序方式显示出来;
(4)将更新后的成绩表保存到另一个数据文件中;
(5)可以增加功能:
如修改某位同学的成绩。
要求:
1、在处理每个题目时,要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编制上机程序和上机调试等若干步骤完成题目,最终写出完整的分析报告。
前期准备工作完备与否直接影响到后序上机调试工作的效率。
在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率。
2、设计的题目要求达到一定工作量(300行以上代码),并具有一定的深度和难度。
3、程序设计语言推荐使用C/C++,程序书写规范,源程序需加必要的注释;
4、每位同学需提交可独立运行的程序;
5、每位同学需独立提交设计报告书(每人一份),要求编排格式统一、规范、内容充实,不少于10页(代码不算);
6、课程设计实践作为培养学生动手能力的一种手段,单独考核。
3.课程设计说明书
一需求分析
要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。
要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。
这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。
问题是将输入的信息保存入文件和从文件输出。
这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。
综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C++知识(本次我将使用C实现),以及丰富的程序调适经验。
二概要设计
首先由于程序中要有对学生信息的增加和减少,定义一个全局变量n,在此程序的任意的模块中均可以使用。
宏定义,用LEN来代替开辟地址空间,定义三个结构体变量,学号num,姓名name,分数marks.
设计实现主要功能的函数有:
创建学生信息的子函数creat();排序的子函数print();查找的子函数search();文件保存的子函数wfile();文件读取的子函数frile();插入信息的子函数insert();修改信息的子函数xg();删除转学学生的信息的子函数del();然后在main()函数中使用一个switch()语句实现对各个子函数的调用。
为了使用的方便,程序中将设计三种排序的方式,按照学号排序funnum(),按照姓名的首字母排序funname(),按照分数排序funmarks()。
在排序子函数print()中还要用一个switch()语句用于对不同的排序方法的函数的调用.
为了直观的看到操作以后的结果,还要有一个输出显示的函数listall()。
程序运行中,为了保持屏幕的清楚和美观,时刻进行清屏也是必要的。
抽象数据类型线性表的定义如下:
ADTList{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}
数据关系:
R1={
基本操作:
Insert(&L,i,j)
初始条件:
线性表L已存在,1≤i≤n+1。
操作结果:
在L中第i个位置之前插入新的数据元素j,L的长度加1。
Del(&L,i,j)
初始条件:
线性表L已存在,1≤i≤n。
操作结果:
删除L的第i个数据元素,L的长度减1
Xg(&L,i,j)
初始条件:
线性表L已存在。
操作结果:
用新的输入数据项j代替原有的指定要修改的数据项i。
Search(&L,i,e)
初始条件:
线性表L已存在。
操作结果:
查找指定的某元素i,并将值赋给e,用e输出。
}
三详细设计
1)宏定义,定义全局变量、结构体:
#defineLENsizeof(structstudent)/*宏定义*/
staticintn;/*n为静态全局变量,本文件模块中各函数均可使用它*/
charnumstr[100];/*全局变量*/
structstudent/*定义结构体*/
{longnum;
charname[10];
doublemarks;
}stu[1000],temp;
2)主函数的算法如下:
voidmain()
{jm:
system("cls");
do{choice=getchar();getchar();
switch(choice)/*switch语句用于循环选择所要的选项*/
{
case'1':
creat();gotojm;break;
case'2':
print();gotojm;break;
case'3':
search();gotojm;break;
case'4':
wfile();gotojm;break;
case'5':
frile();gotojm;break;
case'6':
insert();gotojm;break;
case'7':
xg();gotojm;break;
case'8':
del();gotojm;break;
case'0':
exit(0);
default:
/*用户使用错误*/
puts("\nEnteronlyselectionslisted");break;
}/*结束switch语句*/
}while
(1);/*结束while语句*/
}/*结束main函数*/
3)创建学生信息的算法如下:
creat(void)/*创建学生成绩信息*/
while(ch=='Y'||ch=='y')
{gets(numstr);//输入学号
stu[n].num=atoi(numstr);
gets(stu[n].name);//输入姓名
gets(numstr);//输入成绩
stu[n++].marks=atof(numstr);
ch=getchar();
getchar();/*用于输入y或者n*/
}
4)排序函数的算法如下:
intprint(void)/*排序输出*/
ch=getchar();/*输入a,b,c的语句*/
switch(ch)/*选择排序的方式*/
{
case'a':
funname();/*调用按姓名查找的函数*/
getchar();break;
case'b':
funmarks();/*调用按成绩查找的函数*/
getchar();break;
case'c':
funnum();/*调用按学号查找的函数*/
getchar();break;
}
funname(void)/*按照姓名排序*/
if(n<1)
{printf("\t\t该文件为空!
\n");}
else
{for(i=0;i {for(j=i+1;j {if(strcmp(stu[i].name,stu[j].name)>0) {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;}}} } funmarks(void)/*按照成绩排序*/ if(n<1) {printf("\t\t该文件为空! \n");} else {for(i=0;i {for(j=i+1;j {if(stu[i].marks>stu[j].marks) {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;}}}} funnum(void)/*按照学号排序*/ if(n<1) {printf("\t\t该文件为空! \n");} else {for(i=0;i {for(j=i+1;j {if(stu[i].num>stu[j].num) {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;}}}} 5)写入文件的算法如下: wfile(void)/*写入文件*/ {FILE*fptr; if(n<1) {printf("\t文件为空,无法写操作! \n"); else{fwrite(stu,sizeof(stu[0]),n,fptr); fclose(fptr); } 6)读取文件的算法如下: frile(void)/*读出文件*/ { FILE*fptr; while(fread(&stu[i],sizeof(stu[0]),1,fptr)==1) i++;n=i; fclose(fptr); } 7)查找的算法如下: search(void)/*查找*/ flag=0; for(i=0;i {if((strcmp(numstr,stu[i].name)==0)||atol(numstr)==stu[i].num) {printf("%ld",stu[i].num); printf("%s",stu[i].name); printf("%.2f",stu[i].marks); flag=1; getchar();return0; } } 8)插入的算法如下: insert(void)/*插入*/ {gets(numstr); stu[n].num=atoi(numstr); gets(stu[n].name); gets(numstr); stu[n++].marks=atof(numstr); funname(); } 9)删除的算法如下: del(void)/*删除*/ printf("\t\t请输入要删除的学号: \n"); gets(numstr); {for(i=0;i {if(stu[i].num==atol(numstr)) {j=i; flag=1;} if(flag==1) {for(i=j;i {stu[i]=stu[i+1];} n--;} } } 10)修改的算法如下: xg(void)/*修改*/ flag=0; charch; gets(numstr); for(i=0;i {if(stu[i].num==atol(numstr)) {j=i; flag=1;} if(flag==1) {switch(ch) {case'1': printf("\t请输入修改后的姓名: "); gets(stu[j].name); break; case'2': printf("\t请输入修改后的成绩: "); gets(numstr); stu[j].marks=atof(numstr);break; case'0': return0;}}} 11)各个模块之间的调用关系如下: 四设计与调试分析 从上面的算法和调用关系可以看出,这个程序的基本样子已经非常的清楚,但是真正的程序中还要考虑各种限制条件。 例如在查找的过程中,可能不存在要查找的信息,就要给出不存在此信息的提示等。 还有就是涉及到返回值得问题和程序中所要用到的变量的问题。 在调试的过程中所遇到的问题很多,其中最难的两个问题是给出的六个警告错误,在5.0的版本下就是两个使得程序无法运行的错误。 其中五个是因为在变量的声明中因为使用了浮点型和双精度型两种而造成在某些模块中两个变量相互赋值时类型不匹配。 另一个是在查找的子函数中忘记了需要的返回语句,return1. 五用户手册 1本程序可以在vc++5.0和vc++6.0的环境下运行。 2在vc中创建一个工程,将源程序复制到.cpp中,编译链接就可以。 3选择编译、运行以后会出现运行界面,选择相应的选项,根据提示即可进行演示。 界面如下: 4创建信息就是把最开始要输入的信息输入到系统里。 5浏览信息就是按照要求的顺序浏览已经输入的信息。 6保存信息就是把输入的信息保存如指定的磁盘。 7打开文件就是把保存的信息从磁盘读取保存的信息。 8插入,修改,删除分别是对指定的某信息进行相应的操作。 六测试成果 保存完毕,关机以后下次重新启动此程序的情况: 因为没有打开文件操作,所以在浏览的时候提示为空文件。 当操作5打开文件以后,再次浏览的时候就可以浏览到在文件D: \data,txt中保存的文件内容。 七附录(源程序清单) /*计算机051班XXX的课程设计题目,选题是: 学生成绩管理系统*/ #include"stdio.h"/*头文件*/ #include"string.h" #include"stdlib.h" #defineLENsizeof(structstudent)/*宏定义*/ staticintn;/*n为静态全局变量,本文件模块中各函数均可使用它*/ charnumstr[100];/*全局变量*/ structstudent/*定义结构体*/ { longnum; charname[10]; doublemarks; }stu[1000],temp; creat(void)/*创建学生成绩信息*/ { charch='y'; while(ch=='Y'||ch=='y') { printf("\t\t请输入学号: "); gets(numstr); stu[n].num=atoi(numstr); printf("\t\t请输入姓名: "); gets(stu[n].name); printf("\t\t请输入成绩: "); gets(numstr); stu[n++].marks=atof(numstr); printf("\t\t是否继续添加? (y/n)"); ch=getchar();/*用于输入y或者n*/ getchar(); } printf("\t\t按任意键返回.............");getchar();/*按键返回的输入函数*/ return0; } intprint(void)/*排序*/ {intfunnum(void);/*函数声明*/ intfunname(void);/*函数声明*/ intfunmarks(void);/*函数声明*/ charch; printf("\ta.按姓名首字母排序b.按成绩排序c.按学号排序\n"); printf("\t\t请按键选择"); ch=getchar();getchar();/*输入a,b,c的语句*/ switch(ch)/*选择排序的方式*/ { case'a': funname();/*调用按姓名排序的函数*/ printf("\t按任意键返回............."); getchar();break; case'b': funmarks();/*调用按成绩排序的函数*/ printf("\t按任意键返回............."); getchar();break; case'c': funnum();/*调用按学号排序的函数*/ printf("\t按任意键返回............."); getchar();break; default: printf("\t\t对不起选择错误\n"); printf("\t按任意键返回............."); getchar();break; } return0; } funname(void)/*按照姓名排序*/ {inti,j; intlistall(void);/*函数声明*/ if(n<1) {printf("\t\t该文件为空! \n");} else { for(i=0;i { for(j=i+1;j { if(strcmp(stu[i].name,stu[j].name)>0)/*比较姓名的首字母进行相应交换操作*/ {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;} } } listall();/*调用listall函数显示排序以后的信息*/ } return0; } funmarks(void)/*按照成绩排序*/ { inti,j; intlistall(void);/*函数声明*/ if(n<1) {printf("\t\t该文件为空! \n");} else { for(i=0;i { for(j=i+1;j { if(stu[i].marks>stu[j].marks)/*如果前面的成绩大于后面的就进行交换*/ {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;} } } listall();/*调用listall函数显示盘许以后的信息*/ } return0; } funnum(void)/*按照学号排序*/ { inti,j; intlistall(void);/*函数声明*/ if(n<1) { printf("\t\t该文件为空! \n"); } else { for(i=0;i { for(j=i+1;j { if(stu[i].num>stu[j].num) {temp=stu[i]; stu[i]=stu[j]; stu[j]=temp;} } } listall();/*调用listall函数显示盘许以后的信息*/ } return0; } doublesub(void)/*求总分数的函数*/ { inti; doublesub=0; for(i=0;i {sub+=stu[i].marks;}returnsub;/*把学生的分数相加,返回总分数sub*/ } listall(void)/*输出显示排序的信息*/ { intj; doublemark; if(n<0) {printf("\n\t\t空文件! "); printf("\t按任意键返回.............");getchar();} else {printf("\t学号姓名成绩"); for(j=0;j {printf("\n\t%ld\t",stu[j].num); printf("\t%s\t",stu[j].name); printf("\t%.2f",stu[j].marks);} mark=sub()/n;/*调用求总分数的子函数,除以学生人数n求出平均分*/ printf("\n\t平均分是: %.2f",mark);printf("\n"); }return0; } wfile(void)/*写入文件*/ { FILE*fptr; if(n<1) {printf("\t文件为空,无法写操作! \n"); printf("\t按任意键返回.............");getchar();return0;} printf("\t请输入要保存的路径及文件名(例如c: \\stus.txt): "); scanf("%s",numstr);getchar();/*输入需要保存的磁盘,可以是c,d,e等任意磁盘*/ if((fptr=fopen(numstr,"wb"))==NULL) {printf("\n\t\t无法打开! %s\n",numstr); printf("\t按任意键返回.............");getchar(); } else {fwrite(stu,sizeof(stu[0]),n,fptr);/*把信息写入磁盘的函数*/ fclose(fptr); printf("\t\t有%d个记录保存成功! \n",n); printf("\t按任意键返回.............");getchar();} return0; } frile(void)/*读出文件*/ { FILE*fptr; inti=0; printf("\t请输入要打开的文件(例如c: \\stus.txt): "); scanf("%s",numstr);getchar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子信息 学院 数据结构 课程设计 范例