综合课程设计学生成绩管理系统.docx
《综合课程设计学生成绩管理系统.docx》由会员分享,可在线阅读,更多相关《综合课程设计学生成绩管理系统.docx(22页珍藏版)》请在冰豆网上搜索。
![综合课程设计学生成绩管理系统.docx](https://file1.bdocx.com/fileroot1/2022-12/13/6dd4153f-1d2c-47c1-8007-b81191798d1f/6dd4153f-1d2c-47c1-8007-b81191798d1f1.gif)
综合课程设计学生成绩管理系统
目录
一、各功能模块程序流程图…………………………………………2
二、程序解析…………………………………………………………5
三、调试分析…………………………………………………………7
四、设计体会…………………………………………………………8
五、参考书目…………………………………………………………9
六、源代码……………………………………………………………10
一、各功能模块程序流程图:
(1)学生成绩管理系统总流程图(图4.1)
N
Y
(2)查询学生记录流程图(图4.3)
Y
N
N
(3)学生记录排序流程图(图4.5)
(4)显示文件流程图(图4.7)
Y
N
二、程序解析
1.数据结构
链表是线形表的一种,线形表分为顺序存储结构和链式存储结构。
线形表的顺序存储结构的特点是逻辑关系上相邻的两个元素物理位置上也相邻,因此可以随机存取表中任一元素。
链式存储结构的特点是用一组任意的存储单元存储线形表的数据元素。
链表的最大的优点是对表的添加、删除、查找、排序等操作比较方便,因此采用链表来存储学生相关信息。
且对结点的定义如下:
typedefstructmessage_student/*结构体定义*/
{
charnumber[6];
charname[20];
charsex[4];
floatsubject[numsubs];
floatscore;
floataverage;
intindex;
}studen
2查询学生记录类C码算法:
函数说明:
#include"stdio.h"
intfindrecord(studentstud[])/*查找信息*/
定义相关变量:
charstr[2];
inti,num;
如果没有保存文件:
if(numstus==0)
输出没有可被查找的记录:
printf("没有可被查找的记录\n");
返回函数:
return-1;
否则,输出“按何种方式查询”:
printf("以何种方式查找?
\n1.学号\t2.姓名\t3.名次\n");
选择1,按学号查找:
if(str[0]=='1')/*按学号查找*/
输出“请输入学号”:
printf("请输入学号:
");
进行for和if语句的循环,进行选择:
for(i=0;i<=numstus;i++)
if(strcmp(str,stud[i].number)==0)
若找到符合要求的信息,则输出:
display(stud,i,i);
否则退出,执行其它程序:
break;
按姓名,名次查询的程序与其相同,不再累赘;
如果输入的条件都不符合;if(i>numstus)
输出“没有查找所要的信息”printf("没有查找所要的信息。
\n");
返回函数:
return-1;
返回主函数:
returni;
三、调试分析
错误结果分析
在实验过程中,我们遇到许多的问题,但是在老师的指导下和同组成员的交流中得到了解决。
其中,主要的错误有主函数mian()重复,缺少分号等。
主函数main()重复(图5.10)
缺少分号(图5.11)
分号是C语句中不可缺少的一部分,语句末尾必须有分号。
缺少或多加分号都会引起错误,下面是对这两种情况的简单分析:
(a)忘记加分号:
a=1
b=2
编译时,编译程序在“a=1”后面没发现分号,就把下一行“b=2”也作为上一行语句的一部分,这就会出现语法错误。
改错时,有时在被指出有错的一行中未发现错误,就需要看一下,上一行是否漏掉了分号。
{z=x+y;
t=z/100;
printf("%f",t);
}
对于复合语句来说,最后一个语句中最后的分号不能忽略不写。
(b)多加分号:
对于一个复合语句,如:
{z=x+y;
t=z/100;
printf("%f",t);
};
复合语句的花括号后不应再加分号,否则将会画蛇添足。
以上这些错误是由于对于课本知识的不熟悉,本来不应该出现的错误,却多次出现,说明对于课本知识不能够灵活的运用。
四、设计体会
C语言是一门计算机基础语言,通过这一学期的学习,对于它的一些特点和算法有了一定程度的了解,并能够做一些中等的题目,但并没有完全掌握。
这周的课程设计正是让我们巩固以前的知识并在此基础上能够有所突破的好时机。
C语言程序设计是过程性程序设计语言,它的发展贯穿了计算机发展的整个历程,它蕴含了程序设计的基本思想,囊括了程序设计的基本概念,所以它是理工科高等院校的一门基础课程。
在C语言程序设计过程中,了解了TurboC与VisualC++在使用过程中的不同之处。
学习C语言,必需注意每一个细节,书上的例子代码一定要自己亲自敲一遍,编译执行输出都跟书上说的一致才能算是学完了一个例子,如果不一致,就要仔细找原因,这样才能掌握其中的知识。
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程.随着科学技术发展的日新日异,C语言编程已经成为当今计算机应用中空前活跃的领域,在生活中可以说是无处不在。
因此作为二十一世纪的大学生来说掌握C语言的编译与开发技术是十分重要的。
在同组人员的共同努力下,经过几天的奋斗,我们总算将此程序设计出来。
尽管不是自己独立完成,但仍然很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料,相互合作是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序。
回顾起此次C语言程序课程设计,至今我仍感慨颇多,从理论到实践,在编程的那些日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
五、参考书目
1杨路明.C语言程序设计教程.北京:
北京邮电大学出版社,2005
2杨路明.C语言程序设计上机指导与习题选解(第二版).北京:
北京邮电大学出版社,2005
3李莎等.VisualC++数据库通用模块与系统移植.北京:
清华大学出版社,2007
4林瑞仲等.C语言实例解析精粹.北京:
人民邮电出版社,2005
、
六、源程序清单
源程序清单(带注释)如下:
#include"stdio.h"/*头文件名*/
#include"string.h"
#include"malloc.h"
#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/
#definenumsubs4/*学科数目*/
typedefstructmessage_student/*结构体定义*/
{
charnumber[6];
charname[20];
charsex[4];
floatsubject[numsubs];
floatscore;
floataverage;
intindex;
}student;
externintnumstus;/*学生数目*/
externstudent*pointer;/*指向结构体数组*/
externintlens;
intmenu_select();/*函数声明*/
intopenfile(studentstu[]);
intfindrecord(studentstud[]);
intwritetotext(studentstud[]);
voidwelcome();
voiddisplay1();
voidshowtable();
voidsort(studentstu[]);
voiddeleterecord(studentstu[],inti);
voidaddrecord(studentstud[]);
voiddisplay(studentstud[],intn1,intn2);
voidamendrecord(studentstud[]);
voidcount(studentstud[]);
voidsortnum(studentstud[]);
voidsortnum2(studentstud[]);
voidsortname(studentstud[]);
voidsortname2(studentstud[]);
voidsortcount(studentstud[]);
voidsortcount2(studentstud[]);
voidstatistic(studentstud[]);
voiddisplay1();
#include"stdio.h"
intmenu_select()/*界面显示*/
{
charc;
printf("\n\n");
printf("|1.增加学生记录5.统计信息|\n");
printf("|2.查询学生记录6.打开文件|\n");
printf("|3.修改学生记录7.保存文件|\n");
printf("|4.学生纪录排序8.显示记录|\n");
printf("|0.退出系统|\n");
printf("\n\n");
printf("请选择(0-8):
");
c=getchar();
getchar();
return(c-'0');
}
#include"stdio.h"
voidsort(studentstud[])/*排序文件*/
{
inti,j=0;
charstr[5];
student*p;
p=stud;
if(numstus==0)
{
printf("没有可供查询的记录!
");
}
while
(1)
{
for(i=0;;i++)
{
printf("请输入查询方式:
");
printf("(直接输入回车则结束查询操作)\n");
printf("1.按照学号\t");
printf("2.按照姓名\t");
printf("3.按照名次\n");
gets(str);
if(strlen(str)==0)break;
if(str[0]=='1')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortnum2(p);
else
sortnum(p);
display(stud,0,numstus-1);
}
elseif(str[0]=='2')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortname2(p);
else
sortname(p);
display(stud,0,numstus-1);
}
elseif(str[0]=='3')
{
printf("请输入排序次序:
\n");
printf("1.升序排列\t");
printf("2.降序排列\n");
gets(str);
if(str[0]=='1')
sortcount2(p);
else
sortcount(p);
display(stud,0,numstus-1);
}
elseprintf("请输入1~3");
printf("是否退出排序?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')break;
}
return;
}
}
voidsortnum(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j+1].number,stud[j].number)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
voidsortnum2(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j].number,stud[j+1].number)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
voidsortname(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j+1].name,stud[j].name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
voidsortname2(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(strcmp(stud[j].name,stud[j+1].name)>0)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
voidsortcount(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(stud[j+1].index>stud[j].index)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
voidsortcount2(studentstud[])
{
inti,j;
studenttemp;
student*p;
p=stud;
for(i=0;ifor(j=0;j{
if(stud[j].index>stud[j+1].index)
{
temp=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=temp;
}
}
}
#include"stdio.h"
#include
voidamendrecord(studentstud[])
{
charpassword[10];
again:
printf("请输入密码:
");
scanf("%s",password);
if(strcmp(password,"123")==0)
{
printf("密码确认!
!
!
\n");
printf("请修改!
\n");
}
else
{
printf("密码不正确,请重新输入!
!
!
\n");
gotoagain;
}
charstr[5];/*供用户输入*/
inti=-1,j;
if(numstus==0)/*没有记录返回*/
printf("没有可供修改的记录!
");
while(i<0)
{
i=findrecord(stud);
if(i>=0)
{
printf("要删除这个学生的信息吗?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
deleterecord(stud,i);
count(stud);
}
else
{
printf("确定要修改这个学生的信息吗?
(y/n)");
gets(str);
if(str[0]=='y'||str[0]=='Y')
{
printf("下面请重新输入学生的信息:
\n");
printf("请输入学号:
\n");
gets(stud[i].number);
printf("请输入姓名:
\n");
gets(stud[i].name);
printf("请输入性别(男/女1/0):
\n");
gets(str);
if(str[0]=='0')
strcpy(stud[i].sex,"女");
else
strcpy(stud[i].sex,"男");
stud[i].score=0;
printf("请按顺序输入成绩:
");
for(j=0;j{
scanf("%f",&stud[i].subject[j]);
stud[i].score+=stud[i].subject[j];
}
getchar();
stud[i].average=stud[i].score/numsubs;
}
count(stud);
}
display(stud,0,numstus-1);
}
printf("是否继续进行其他修改?
(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y')
i=-1;
elsei=1;
}
}
voiddeleterecord(studentstu[],inti)/*删除信息*/
{
intj;
while(i>=0)
{
for(j=i;jstu[j]=stu[j+1];
numstus--;
printf("删除成功!
\n");
}
}
voidcount(studentstud[])
{
inti,j;
for(i=0;i{
stud[i].index=1;
for(j=0;jif(stud[j].score>stud[i].score)
stud[i].index++;
}
}
#include"stdio.h"
voidaddrecord(studentstud[])
{
inti=0,j,num;
charstr[4];
if(numstus!
=0)
{
printf("已有记录存在是否覆盖?
(y/n)\n");
gets(str);
if(str[0]=='Y'||str[0]=='y')
i=0;
elsei=numstus;
}
printf("请输入增加的学生信息条目数:
");
scanf("%d",&num);
if(i==0)
numstus=num;
elsenumstus+=num;
if(numstus>lens)
{
lens+=50;
pointer=(student*)realloc(pointer,lens*LEN);
}
printf("请输入学生信息:
\n");
for(;i{
getchar();
printf("请输入学号:
\n");
gets(pointer[i].number);
printf("请输入姓名:
\n");
gets(pointer[i].name);
printf("请输入性别(男/女1/0):
");
gets(pointer[i].sex);
if(pointer[i].sex[0]=='0')strcpy(pointer[i].sex,"女");
elsestrcpy(pointer[i].sex,"男");
printf("请输入各科成绩:
(按语文,数学,英语,政治的顺序):
\n");
stud[i].score=0;
for(j=0;j{
scanf("%f",&stud[i].subject[j]);/*计算总分*/
stud[i].score+=stud[i].subject[j];
}
stud[i].average=stud[i].score/numsubs;/*计算平均分*/
}
count(stud);/*附名次*/
display(stud,0,numstus-1);
getchar();
}
#include"stdio.h"
intnumstus;
intlens;
student*pointer;
voidmain()
{
inti=1;
charstr[2];
lens=100;
pointer=(student*)malloc(lens*LEN);/*分配内存*/
numstus=0;
welcome();/*欢迎界面*/
while(i>0)
{
i=menu_select();/*控制菜单*/
switch(i)
{
case1:
addrecord(pointer);break;/*增加学生信息*/
case2:
findrecord(pointer);break;/*查询学生信息*/
case3:
amendrecord(pointer);break;/*修改学生信息*/
case4:
sort(po