学生管理系统.docx
《学生管理系统.docx》由会员分享,可在线阅读,更多相关《学生管理系统.docx(27页珍藏版)》请在冰点文库上搜索。
学生管理系统
福建工程学院计算机与信息科学系
实验报告
2011–2012学年第学期任课老师:
课程名称
结构化程序设计
班级
座号
姓名
实验题目
学生成绩管理系统
实验时间
实验开始日期:
报告提交日期:
实验目的、要求
1.程序完成后应该完成如下基本功能:
1)用自定义结构体typedefstruct设计该软件的数据结构;
2)用数组或指针链表将所有学生的数据按照学号顺序链接起来;
3)程序能够按照学号顺序输入学生的三门成绩,并计算平均成绩和总成绩。
4)程序能够显示已经输入的指定学号的学生成绩以及平均成绩和总成绩。
5)程序能够按要求显示指定分数段的学生成绩以及平均成绩和总成绩。
6)能够统计班级总人数、班级平均成绩。
7)能够增加和删除指定学生的成绩。
8)按照指定的要求以及顺序(升序或降序)显示学生成绩以及平均成绩和总成绩。
2.在完成上述基本功能的前提下,有能力的同学可以完成如下加强功能:
1)能够输入的数据长期存储在文件中,再次运行程序时从文件中读取数据,无须重复输入。
5)在程序的提示语言清晰明确,界面美观并且适用。
实验步骤与内容
按如下顺序写:
1、主要设计思想;
将每一个学生的信息存放在链表的一个结点里,所有学生的信息存在一条链表里,然后应用对链表的插入,删除,修改,查看,排序等方法以完成学生成绩管理系统的学生数据新建或添加,数据删除,修改学生信息,查看学生信息,还有按成绩排序查看信息和按学号排序查看等功能
2、主要数据结构及其解释
typedefstructnode/*数据结构*/
{
charNO[11];//学号
charname[20];//姓名
intscore1,score2,score3;//3科成绩
floataver;//平均分
structnode*next;//指针
}linklist;
3.模块关系图;
4.所有函数的流程图及简要说明;
(1)数据新建或添加
(2)数据删除
(3)修改数据
(4)查询数据
(5)排序(成绩)
(6)排序(学号)
(7)文件保存并输出数据至屏幕
5.所有源代码;
附表后
试验过程记录
记录试验中遇到的困难及解决方法;
1.文件:
将数据保存在文件并不是难事,但将文件里的数据读取出来进行删除修改等操作,我觉得很是困难,这一块有做了很久,但结果总是不尽人意.最后,还是没去做数据读取这块了.
2.排序:
排序这块也耗费了我不少时间,起先是想用冒泡排序的思想,直接通过改变指向结点的指针进行排序,当然,这种改变指针的方法效率真的很高,我也编出来了,但是总会有一些漏洞,等把漏洞补上去时,,就感觉到整个排序很混乱,过一段时间后,,连自己都读不清楚,无奈呀,最后,我还是换了一个方法,就是相对简单些的插入排序,通过新建头结点,插入有序,整个排序的想法简单些,没前面那么混乱了.
3.数据的添加和插入
这边也需要我们去注意下,插入的学生学号不能重复,于是这里做了一个当输入学号后先判断是否已近存在,若是显示错误,停止插入,若没有存在,便插入.
实验结果记录以及与预期结果比较以及分析
记录每次实验结果以及分析情况
添加数据
数据重复
删除学生信息
查询学生信息
修改学生信息
按序号排序
按成绩排序
总结以及心得体会
指导老师评阅意见
指导老师:
年月日
填写内容时,可把表格扩大。
实验的源程序代码(要有注释)附在表后。
#include
#include
#include
#include
typedefstructnode/*数据结构*/
{
charNO[11];
charname[20];
intscore1,score2,score3;
floataver;
structnode*next;
}linklist;
linklist*InitList(linklist*L)/*初始化链表*/
{
L=(linklist*)malloc(sizeof(linklist));/*存在空的头结点并分配空间*/
L->next=NULL;
return(L);
}
voidfilesave(linklist*L)/*存入文件,并显示全部数据*/
{
system("cls");
FILE*fp;
linklist*p;
p=L->next;
fp=fopen("Test.txt","w+");
fprintf(fp,"|NO.|name|SCORE1|SCORE2|SCORE3|aver|sum|\n");
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|sum|\n");
while(p!
=NULL)
{
fprintf(fp,"|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->NO,p->name,p->score1,p->score2,p->score3,p->aver);
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->NO,p->name,p->score1,p->score2,p->score3,p->aver);
p=p->next;
}
getchar();
fclose(fp);
printf("\t\t\tpressEntertocotinue~\n");
getchar();
}
linklist*order_aver(linklist*L)
{
system("cls");
linklist*head,*head1,*p,*inser,*newL;
newL=(linklist*)malloc(sizeof(linklist));/*存在空的头结点并分配空间*/
newL->next=NULL;
head=L->next;
while(head)
{
p=(linklist*)malloc(sizeof(linklist));
strcpy(p->name,head->name);
strcpy(p->NO,head->NO);
p->score1=head->score1;
p->score3=head->score3;
p->score2=head->score2;
p->aver=head->aver;
head1=newL;//从头开始寻找插入位置
if(head1->next==NULL)//新表头为空,则直接插入
{
head1->next=p;
p->next=NULL;
}
else
{
inser=head1->next;
while(inser)//寻找插入位置
{
if(inser->aver>p->aver)
{
head1=inser;
inser=inser->next;
}
else
break;
}
if(inser==NULL)//插入的位置是否在尾部
{
head1->next=p;
p->next=NULL;
}
else
{
head1->next=p;
p->next=inser;
}
}
head=head->next;
}
returnnewL;
}
linklist*order_no(linklist*L)//与前面按成绩排序的原理相同
{
system("cls");
linklist*head,*head1,*p,*inser,*newL;
newL=(linklist*)malloc(sizeof(linklist));
newL->next=NULL;
head=L->next;
while(head)
{
p=(linklist*)malloc(sizeof(linklist));
strcpy(p->name,head->name);
strcpy(p->NO,head->NO);
p->score1=head->score1;
p->score3=head->score3;
p->score2=head->score2;
p->aver=head->aver;
head1=newL;
if(head1->next==NULL)//新表头为空,则直接插入
{
head1->next=p;
p->next=NULL;
}
else//h1不为空
{
inser=head1->next;
while(inser){
if(strlen(inser->NO)NO))
{
head1=inser;
inser=inser->next;
}
else
break;
}
if(inser==NULL)
{
head1->next=p;
p->next=NULL;
}
else
{
head1->next=p;
p->next=inser;
}
}
head=head->next;
}
returnnewL;
}
linklist*DelItem(linklist*L)/*删除数据(成功)*/
{
system("cls");
charc,no[11];
linklist*p1,*p2;
p1=L;
p2=L;
if(p1->next==NULL)
{
printf("数据为空,无法删除!
");
getchar();
getchar();
returnL;
}
else
{
printf("EnterNO.thatyouwanttodelete!
NO:
");
scanf("%s",no);
while(p1!
=NULL&&strcmp(p1->NO,no))
{
p2=p1;//删除用的
p1=p1->next;
}
if(p1==NULL)
{
printf("输入的学号不存在,请重新输入!
");
getchar();
getchar();
L=DelItem(L);
}
else
{
p2->next=p1->next;
printf("成功删除!
!
!
");
getchar();
}
return(L);
}
}
linklist*adddata(linklist*L)/*追加数据(成功)*/
{
system("cls");
inttemp,i,n,j=1;
linklist*check,*p,*t;
p=L;
while(p->next!
=NULL)
p=p->next;//指向尾巴
printf("Howmanydatasdoyouwanttoadd?
()\b\b\b");
scanf("%d",&n);
getchar();
for(i=0;i{temp=0;
check=L->next;
t=(linklist*)malloc(sizeof(linklist));
t->next=NULL;
printf("\n第%d个学生数据:
\n|NO.",j);
scanf("%s",t->NO);
getchar();
while(check!
=NULL)/*判断是否存在重复数据*/
if(strcmp(check->NO,t->NO)==0)
{
printf("Thisrecordisexist.pleasereput!
\n");
temp=1;
break;
}
elsecheck=check->next;
if(temp)
{
i--;
continue;
}//进入下一次循环
printf("|name:
");
scanf("%s",t->name);
printf("|SCORE1:
");
scanf("%d",&t->score1);
printf("|SCORE2:
");
scanf("%d",&t->score2);
printf("|SCORE3:
");
scanf("%d",&t->score3);
getchar();
t->aver=(t->score1+t->score2+t->score3)/3;
p->next=t;
p=p->next;
j++;
}
j=1;
return(L);
}
linklist*modify(linklist*L)/*修改数据*/
{system("cls");
charno[11],ch1[20];
inti,ch,esc,flag=0;
linklist*p;
p=L;
if(L->next==NULL)
{
printf("链表未空,无数据!
!
!
");
getchar();getchar();
}
else
{
printf("请输入要修改的学生数据的学生学号:
NO()\b");
getchar();
scanf("%s",no);
}
while(p->next!
=NULL)
{
if(strcmp(p->NO,no)==0)
{
printf("Whatdoyouwanttomodify?
");
printf("\n
(1)NO
(2)name(3)score1(4)score2(5)score3(0)exit\n");
scanf("%d",&ch);
switch(ch)
{case1:
{printf("change");scanf("%s",ch1);strcpy(p->NO,ch1);break;}
case2:
{printf("change");scanf("%s",ch1);strcpy(p->name,ch1);break;}
case3:
{printf("change");scanf("%d",&i);p->score1=i;p->aver=(p->score1+p->score2+p->score3)/3;break;}
case4:
{printf("change");scanf("%d",&i);p->score2=i;p->aver=(p->score1+p->score2+p->score3)/3;break;}
case5:
{printf("change");scanf("%d",&i);p->score3=i;p->aver=(p->score1+p->score2+p->score3)/3;break;}
case0:
return(0);
default:
printf("Error!
\n");
}
flag=1;
break;
}
p=p->next;
}
if(L->next!
=NULL&&!
flag)
{
printf("您所输入的学号不存在,按1继续修改,按0退出~");
scanf("%d",&esc);
getchar();
if(esc==1)
L=modify(L);
}
returnL;
}
linklist*search(linklist*L)/*查询(成功)*/
{
system("cls");
inti,ch;
linklist*p;
charno[11],ch1[20];
while
(1)
{
system("cls");
printf("请问您想通过哪个信息来查询数据?
()\b\b\n\n");
printf("\n
(1)NO
(2)name(3)score1(4)score2(5)score3(0)退出查询\n\n");
scanf("%d",&ch);
p=L;
switch(ch)
{
case1:
printf("请输入学号:
()\b\b");scanf("%s",ch1);
while(p->next!
=NULL)
{
if(strcmp(p->next->NO,ch1)==0)
{
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|\n");
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->next->NO,p->next->name,p->next->score1,p->next->score2,p->next->score3,p->next->aver);getchar();getchar();break;
}
else
p=p->next;
}
break;
case2:
printf("请输入名字:
()\b\b");getchar();scanf("%s",ch1);
while(p->next!
=NULL)
{
if(strcmp(p->next->name,ch1)==0)
{
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|\n");
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->next->NO,p->next->name,p->next->score1,p->next->score2,p->next->score3,p->next->aver);getchar();getchar();
break;
}
else
p=p->next;
}
break;
case3:
printf("请输入score1:
()\b\b");scanf("%d",&i);
while(p->next!
=NULL)
{
if(p->next->score1==i)
{
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|\n");
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->next->NO,p->next->name,p->next->score1,p->next->score2,p->next->score3,p->next->aver);getchar();getchar();break;
}
else
p=p->next;
}
break;
case4:
printf("请输入score2:
()\b\b");scanf("%d",&i);
while(p->next!
=NULL)
{
if(p->next->score2==i)
{
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|\n");
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->next->NO,p->next->name,p->next->score1,p->next->score2,p->next->score3,p->next->aver);getchar();getchar();break;
}
else
p=p->next;
}
break;
case5:
printf("请输入score3:
()\b\b");scanf("%d",&i);
while(p->next!
=NULL)
{
if(p->next->score3==i)
{
printf("|NO.|name|SCORE1|SCORE2|SCORE3|aver|\n");
printf("|%-9s|%-10s|%-6d|%-6d|%-6d|%-4.1f|\n",p->next->NO,p->next->name,p->next->score1,p->next->score2,p->next->score3,p->next->aver);getchar();getchar();break;
}
else
p=p->next;
}
break;
case0:
return(0);
default:
printf("Error!
\n");
}
}
}
intmain()
{
inti;
linklist*L=InitList(L),*p;
while
(1)
{system("cls");
printf("\t\t********************MENU********************\n\n\t\t\t欢迎光临学生成绩管理系统\n\n\n\t\t\t
(1)创建学生数据)\n\t\t\t
(2)插入学生数据\n\t\t\t(3)删除学生数据\n\t\t\t(4)查询学生数据\n\t\t\t(5)修改学生数据\n\t\t\t(6)查看以保存的学生数据\n\t\t\t(7)以成绩排序查看数据\n\t\t\t(0)退出系统\n");
printf("\n\t\t************************************************\n\t\tPleasechoose()\b\b");
scanf("%d",&i);
switch(i)
{case1:
L=adddata(L);break;/*创建链表*/
case2:
L=adddata(L);break;/*增加信息*/
case3:
L=DelItem(L);break;/*删除信息*/
case5:
L=modify(L);break;/*更改信息*/
case4:
search(L);break;/*查询信息*/
cas