数据结构大作业实验报告.docx
- 文档编号:28123052
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:33
- 大小:244.83KB
数据结构大作业实验报告.docx
《数据结构大作业实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构大作业实验报告.docx(33页珍藏版)》请在冰豆网上搜索。
数据结构大作业实验报告
《数据结构》实验报告
--------------学生成绩分析系统
学校 南京大学
院系 工程管理学院
专业 管理科学与工程类
年级 2010级
课题 学生成绩分析系统
指导老师 朱美琳
小组成员信息
姓名
学号
叶皓恺
101279055
殷承来
101279056
于婴朴
101279058
周道航
101279062
摘要
一需求分析 3
二概要设计 4
一算法设计 4
二存储结构设计 5
三详细设计 5
四调试分析 18
一调试结果 18
二时间复杂度分析 24
三程序中存在问题以及可能改进的地方 24
五总结 25
一需求分析
本成绩分析管理系统可以实现以下主要功能:
1.信息的输入:
建立学生档案文件(包括姓名,学号,班级,课程编号,成绩)
2.信息的维护:
添加:
增加新学生
修改:
学生信息的改变
删除:
学生减少
3.信息的处理
按要求检索学生信息
按要求统计信息
本成绩分析管理系统同时可以实现以下系统界面:
1.管理员进入
请输入密码:
2.一级菜单
1.信息维护 输入“1”进入信息维护二级菜单
2.信息检索 输入“2”进入信息检索二级菜单
3.信息统计 输入“3”进入信息统计二级菜单
4.退出 输入“4”退出系统
3.二级菜单
信息维护
1.建立学生成绩文件
2.添加学生纪录
3.删除学生纪录
4.修改学生纪录
5.返回上级菜单
信息检索
1.按姓名查找
2.按班级查找
3.返回上级菜单
信息统计
1.成绩统计
2.返回上级菜单
二概要设计
一算法设计
1.用口令(密码)形式验证管理员身份(可输入三次密码),合法者进入,否则程序结束。
算法实现可以使用break和continue语句,使用一个变量计数;
2.有关功能说明
(1)建立学生成绩表 voidestablish(void); //建立学生成绩表函数
建立新的学生纪录(包括姓名,学号,班级,课程编号,成绩)(暂定为2个班级,2门课程,学生个数每班10人左右)
算法实现可以使用fp头文件指针,将指定的记录写入相应的文本文件中;
(2)添加学生纪录 voidadd(void); //添加学生纪录函数
在已存在的学生成绩文件中添加新纪录
算法实现同样利用文件操作将新添加的记录追加到文件的尾部即可;
(3)删除学生纪录 voiddeleteinfo(void); //删除学生记录函数
在学生成绩文件中删除2个课程没有成绩的学生纪录
删除前,逐条显示符合删除条件的学生姓名,成绩,确认后再删除
算法实现先在文件中将记录读出,再寻找删除项,最后将其重新写入文本文件中;
(4)修改学生信息 voidmodify(void); //修改学生记录函数
输入学生学号,在学生成绩文件中找出该学生纪录
在屏幕上逐条显示该学生的各条纪录
每显示一条,询问是否修改,如果“1",输入修改后的数据,文件原记录删除,保存新的记录
算法实现与删除学生记录相似就是将原文件内容读出,后根据条件修改内容,最后再重新写入文件中;判断是否修改时,利用if循环就可以了;
(5)按姓名和班级查找
输入姓名,显示该学生所有信息voidsearchname(void); //按姓名查找学生记录函数
输入班级,显示所有学生信息 voidsearchclass(void); //按班级查找学生记录函数
算法实现先将文本内容读出,利用条件查找相应的记录,再将相应的记录输出
(6)信息统计 voidtongji(void); //统计学生成绩信息函数
同时按照班级和课程统计每门课程,每个课程每个班级的平均成绩,最高分,最低分
在屏幕上先依次显示各门课程,对应的各个班级的统计数据。
算法实现利用文件操作将学生成绩表中内容读出,然后利用循环语句将对应的统计项找到,输出结果
(7)退出信息管理系统,返回操作系统
利用switchcase语句
二存储结构设计
因为每个学生纪录包括姓名,学号,班级,课程编号,成绩,所以要使用结构变量,同时考虑到处理数据的数量,我们采用结构数组来完成程序的实现,具体定义如下;
structstudent{
charname[20]; //学生的姓名
longn; //学生的学号
charclassnum[10]; //学生的班级
charcoursenum[2][10]; //学生的所有课程编号
intgrade[2]; //学生的各科的成绩
}STU[maxsize]; //最大数据容量常数maxsize
三详细设计
C语言源代码如下:
/*-----------------------------头文件定义-------------------------*/
#include
#include
#include
#include
/*-----------------------------------------------------------------*/
#definemaxsize20 //定义最大数据容量常数maxsize
/*----------数据类型定义-----------*/
structstudent{
charname[20]; //学生的姓名
longn; //学生的学号
charclassnum[10]; //学生的班级
charcoursenum[2][10]; //学生的所有课程编号
intgrade[2]; //学生的各科的成绩
}STU[maxsize];
/*---------------------------------*/
/*------------------------------函数列表----------------------*/
voidestablish(void); //建立学生成绩表函数
voidadd(void); //添加学生纪录函数
voiddeleteinfo(void); //删除学生记录函数
voidmodify(void); //修改学生记录函数
voidsearchname(void); //按姓名查找学生记录函数
voidsearchclass(void); //按班级查找学生记录函数
voidtongji(void); //统计学生成绩信息函数
/*------------------------------------------------------------*/
/*=================---------主函数------------------------*/
intmain(void)
{
intcount,i,j;
char password[15]="1B620",password1[15]; //其中password为管理员密码;
printf("---------欢迎来到南京大学学生成绩分析系统--------\n");
/*-----------------管理员密码验证------------------*/
for(count=0;count<3;count++) //用密码形式验证管理员身份(可输入三次密码),合法者进入,否则程序结束
{
printf("----------请输入密码:
------------\n");
gets(password1);
if(strcmp(password1,password)==0)
break;
else
continue;
}
/*------------------------------------------------*/
if(count==3)
return0;//身份验证次数超过3次,程序结束;
elseif(count<3)
{ /*----------------------一级菜单--------------------------*/
loop:
//loop是回到一级菜单的语句标号
printf("-----------1信息维护-----------\n");
printf("-----------2信息检索-----------\n");
printf("-----------3信息统计-----------\n");
printf("-----------4退出---------------\n");
/*--------------------------------------------------------*/
scanf("%d",&i);
switch(i)
{
case1:
/*----------------------信息维护的二级菜单--------------------------*/
lo:
//lo是回到信息维护二级菜单的语句标号
printf("-----------1建立学生成绩文件-----------\n");
printf("-----------2添加学生记录---------------\n");
printf("-----------3删除学生记录---------------\n");
printf("-----------4修改学生记录---------------\n");
printf("-----------5返回上级菜单---------------\n");
/*--------------------------------------------------------*/
scanf("%d",&j);
switch(j)
{
case1:
establish();gotolo; //调用建立学生成绩表函数;并且调用完之后返回信息维护二级菜单
case2:
add();gotolo; //调用添加学生纪录函数;并且调用完之后返回信息维护二级菜单
case3:
deleteinfo();gotolo; //调用删除学生记录函数;并且调用完之后返回信息维护二级菜单
case4:
modify();gotolo; //调用修改学生记录函数;并且调用完之后返回信息维护二级菜单
case5:
gotoloop; //回到一级菜单;
}
break;
case2:
/*-------------------------信息检索的二级菜单-------------------*/
op:
//op是回到信息维护二级菜单的语句标号
printf("-----------1按姓名查找-----------------\n");
printf("-----------2按班级查找----------------\n");
printf("-----------3放回上级菜单---------------\n");
/*-------------------------------------------------------------*/
scanf("%d",&j);
switch(j)
{
case1:
searchname();gotoop; //调用按姓名查找学生记录函数;并且调用完之后返回信息检索二级菜单
case2:
searchclass();gotoop; //调用按班级查找学生记录函数;并且调用完之后返回信息检索二级菜单
case3:
gotoloop; //回到一级菜单
}
break;
case3:
/*----------------------------信息统计的二级菜单------------------------*/
to:
//to是返回到信息统计的二级菜单的语句标号
printf("-----------1成绩统计-----------------\n");
printf("-----------2放回上级菜单----------------\n");
/*----------------------------------------------------------------------*/
scanf("%d",&j);
switch(j)
{
case1:
tongji();gototo; //调用信息统计函数;并且调用完之后返回信息统计二级菜单
case2:
gotoloop; //回到一级菜单
}
break;
case4:
break;
}
}
return0;
}
/*-------------------------------------------------------------------------*/
/*--------------------建立学生成绩文件函数的具体实现------------*/
voidestablish(void)
{
FILE*fp; //定义头文件指针fp;
intt,i;
printf("pleaseinputanumber:
"); //要输入的学生记录个数为t
scanf("%d",&t);
/*---------------------输入t条学生记录------------------------*/
for(i=0;i { scanf("%s%ld%s%s%s%d%d",STU[i].name,&STU[i].n,STU[i].classnum,STU[i].coursenum[0],STU[i].coursenum[1],&STU[i].grade[0],&STU[i].grade[1]); } /*--------------------------------------------------------*/ /*---------------打开成绩分析管理文本文件并添加学生记录---------------------*/ if((fp=fopen("成绩分析管理.txt","wb"))==NULL) { printf("打开文件错误\n"); return; //文件打开错误直接返回; } for(i=0;i { if(fwrite(&STU[i],sizeof(structstudent),1,fp)! =1)/*写文件*/ { printf("删除时写文件错误\n"); return; } } fclose(fp);//关闭该文本文件; /*---------------------------------------------------------------------------*/ return; } //----------------------------------------------------------------- /*--------------------------------添加学生记录函数的具体实现-------------------*/ voidadd(void) { FILE*fp; //定义头文件指针fp intcnt=0,i=0; structstudent*stu;//定义结构指针变量stu printf("\npleaseinputthenewstudentinfomation! : "); if((stu=(structstudent*)malloc(sizeof(structstudent)))==NULL) { //为结构指针变量stu分配存储空间 printf("\n分配存储空间错误! \n"); return; } /*---------------为该结构变量赋值---------*/ scanf("%s%ld%s%s%s%d%d",stu->name,&stu->n,stu->classnum,stu->coursenum[0],stu->coursenum[1],&stu->grade[0],&stu->grade[1]); /*--------------------将该结构变量加到成绩分析管理文本文件的末尾-------------*/ if((fp=fopen("成绩分析管理.txt","ab"))==NULL) /*打开文件*/ { printf("打开文件错误\n"); return; } if(fwrite(stu,sizeof(structstudent),1,fp)! =1)/*写文件*/ { printf("写文件错误\n"); return; } fclose(fp);/*--关闭文件----*/ /*---------------------------------------------------------------------------*/ return; } /*---------------------------------------------------------------*/ /*-----------------------------删除记录函数的具体实现-------------*/ voiddeleteinfo(void) { FILE*fp;//定义头文件指针fp intcnt=0,i=0,flag=0; //flag用作标识符,cnt和i用作计数 if((fp=fopen("成绩分析管理.txt","rb"))==NULL)/*打开文件*/ { printf("打开成绩分析管理.txt文件失败\n"); return; } while(i { if(fread(&STU[i],sizeof(structstudent),1,fp)==1) /*读文件*/ { cnt++;//统计文件中记录条数 } else { if(i==0) printf("读文件失败\n"); break; } i++; } fclose(fp);/*关闭文件*/ /*-------------------------读取文件中的记录-------------------------*/ if((fp=fopen("成绩分析管理.txt","rb"))==NULL) /*打开文件*/ { printf("删除时打开文件失败\n"); return; } for(i=0;i if(fread(&STU[i],sizeof(structstudent),1,fp)! =1) /*先读文件*/ { printf("读文件错误\n"); return; } fclose(fp); /*关闭文件*/ /*------------------------------------------------------------------*/ for(i=0;i if((STU[i].grade[0]==0)&&(STU[i].grade[1]==0))//输出各科成绩为0的学生记录,并对学生的姓名做上标记; { printf("%s,%ld,%s,%s,%s,%d,%d\n",STU[i].name,STU[i].n,STU[i].classnum,STU[i].coursenum[0],STU[i].coursenum[1],STU[i].grade[0],STU[i].grade[1]); strcpy(STU[i].name,"#"),flag=1; } if(! flag)printf("\nTherearenorecordstodelete! \n");//如果文件中没有满足条件的记录输出该信息 /*----------------------将删除后的学生记录写入文件中-------------------------------*/ if((fp=fopen("成绩分析管理.txt","wb"))==NULL) /*打开文件*/ { printf("删除时打开文件失败\n"); return; } for(i=0;i if(strcmp(STU[i].name,"#")! =0) if(fwrite(&STU[i],sizeof(structstudent),1,fp)! =1)/*写文件*/ { printf("删除时写文件错误\n"); return; } fclose(fp);/*关闭文件*/ /*--------------------------------------------------------------------------------*/ return; } /*---------------------------------------------------------------------*/ /*------------------------------修改学生记录函数具体实现---------------------------*/ voidmodify(void) { FILE*fp;//定义头文件指针fp longn1; charname1[20]; charclassnum1[10]; charcoursenum1[2][10]; intgrade1[2],ch,cnt=0,i=0,flag=1; //定义变量 /*---------------------打开成绩分析管理文本文件并读出文件中的学生记录-----------*/ if((fp=fopen("成绩分析管理.txt","rb"))==NULL)/*打开文件*/ { printf("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 作业 实验 报告