3067徐永贺课程设计报告.docx
《3067徐永贺课程设计报告.docx》由会员分享,可在线阅读,更多相关《3067徐永贺课程设计报告.docx(16页珍藏版)》请在冰豆网上搜索。
3067徐永贺课程设计报告
学生成绩管理系统
本题目设计目的是训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。
本程序中涉及结构体、单链表、文件等方面的知识。
通过本程序的训练,使学生能对C语言的文件操作有一个更深刻的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的管理信息系统打下坚实的基础。
一、问题定义
创建一个学生成绩管理系统。
假设系统中每个学生记录只包括班级、学号、姓名、性别、数学成绩、英语成绩、计算机成绩、总分、平均分、名次等信息。
程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1学生成绩管理系统功能需求
二、系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
图2.1学生成绩管理系统功能模块图
本成绩管理系统要求采用单链表实现,如上图2.1所示,它由如下五大功能模块组成:
●输入记录模块。
完成将数据存入单链表的工作。
记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入学生记录。
学生记录由学生的基本信息和成绩信息字段构成。
当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。
●查询记录模块。
完成在单链表中查找满足相关条件的学生记录。
在此成绩管理系统中,用户可以按照学生的班级、学号、名次或姓名在单链表中进行查找。
若找到该学生的记录,则返回指向该学生的记录的指针。
否则返回一个值为NULL的空指针,并打印出未找到该学生记录的提示信息。
●更新记录模块。
完成对学生记录的维护。
在此成绩管理系统中,它实现了对学生记录的删除和排序操作,并将修改后的数据存入源数据文件。
●统计记录模块。
完成对各门功课最高分和不及格人数的统计。
●输出记录模块。
一是实现对学生记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。
2.2详细设计
2.2.1数据结构设计
●学生成绩信息结构体
#ifndefH_STUDENT_HH/*如果H_STUDENT_HH没有定义*/
#defineH_STUDENT_HH/*那就定义H_STUDENT_HH*/
#include
#include
#include
#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/
#definenumsubs3/*学科数目*/
typedefstructmessage_student/*结构体定义*/
{
charnumber[6];/*学号*/
charnumber1[6];/*班级*/
charname[20];/*学生姓名*/
charsex[4];/*性别*/
floatsubject[numsubs];/*科目*/
floatscore;/*总分*/
floataverage;/*平均分*/
intindex;
}student;
externintnumstus;/*学生数目*/
externstudent*pointer;/*指向结构体数组*/
externintlens;
intmenu_select();/*声明函数*/
intdakaiwenjian(studentstu[]);/*打开文件*/
intchaxunjilu(studentstud[]);/*查询记录*/
intcunchujilu(studentstud[]);/*存储记录*/
voidhuanying();/*欢迎界面*/
voidxianshijilu1();/*显示记录*/
voidshowtable();/*显示桌面*/
voidpaixu(studentstu[]);/*排序*/
voidshanchujilu(studentstu[],inti);/*删除*/
voidtianjiajilu(studentstud[]);/*添加记录*/
voidxianshijilu(studentstud[],intn1,intn2);/*显示记录*/
voidxiugaijilu(studentstud[]);/*修改记录*/
voidjishu(studentstud[]);/*为记录计数*/
voidpaixunum(studentstud[]);/*为记录排序*/
voidpaixunum2(studentstud[]);/*为记录排序*/
voidpaixuname(studentstud[]);/*为记录排序*/
voidpaixuname2(studentstud[]);/*为记录排序*/
voidpaixujishu(studentstud[]);/*为记录排序*/
voidpaixujishu2(studentstud[]);/*为记录排序*/
voidtongjishuju(studentstud[]);/*统计记录*/
voidxianshijilu1();/*显示记录*/
2.2.2主控main()函数执行流程
本成绩管理系统根据按键判断。
在判断键值时,有效的输入为本0至8之间的任意数值,其他输入都被视为错误按键。
若输入为0(即变量select=0),它会继续判断,如果对记录进行过更新操作,那么是否已经保存过新的数据,若没有,则全局变量saveflage=1,系统会提示用户是否需要进行数据存盘操作,用户输入y或n,系统会自动进行存盘操作后再执行退出成绩管理系统的操作。
若选择1,则调用tianjiajilu函数,执行增加学生记录操作;
若选择2,则调用chaxunjilu函数,执行查询学生记录操作;
若选择3,则首先调用chaxunjilu函数,执行查询学生记录操作,查找出学生纪录后再调用shanchujilu函数,执行删除学生记录操作;
若选择4,则调用sort函数,执行按降序排序学生记录操作;
若选择5,则调用tongjishuju函数,执行统计学生记录操作;
若选择6,则调用dakaiwenjian函数,打开一个已储存的文件;
若选择8,则调用cunchujilu函数,执行将学生记录存入数据文件的操作;
若选择0,break,退出系统;
若输入为0~9之外的值,default,给出按键错误的提示"输入错误,请输入数字0~8:
"。
2.2.3函数功能描述
●函数名:
strcmp
功 能:
串比较
用 法:
intstrcmp(char*str1,char*str2);
程序例:
#include
#include
intmain(void)
{
char*buf1="aaa",*buf2="bbb",*buf3="ccc";
intptr;
ptr=strcmp(buf2,buf1);
if(ptr>0)
printf("buffer2isgreaterthanbuffer1\n");
else
printf("buffer2islessthanbuffer1\n");
ptr=strcmp(buf2,buf3);
if(ptr>0)
printf("buffer2isgreaterthanbuffer3\n");
else
printf("buffer2islessthanbuffer3\n");
return0;
}
●函数名:
getchar
功 能:
从stdin流中读字符
用 法:
intgetchar(void);
程序例:
#include
intmain(void)
{
intc;
/*Notethatgetcharreadsfromstdinand
islinebuffered;thismeansitwill
notreturnuntilyoupressENTER.*/
while((c=getchar())!
='\n')
printf("%c",c);
return0;
}
●函数名:
gets
功 能:
从流中取一字符串
用 法:
char*gets(char*string);
程序例:
#include
intmain(void)
{
charstring[80];
printf("Inputastring:
");
gets(string);
printf("Thestringinputwas:
%s\n",
string);
return0;
}
●函数名:
fopen
功 能:
打开一个流
用 法:
FILE*fopen(char*filename,char*type);
程序例:
#include
#include
#include
intmain(void)
{
char*s;
chardrive[MAXDRIVE];
chardir[MAXDIR];
charfile[MAXFILE];
charext[MAXEXT];
intflags;
s=getenv("COMSPEC");/*getthecomspecenvironmentparameter*/
flags=fnsplit(s,drive,dir,file,ext);
printf("Commandprocessorinfo:
\n");
if(flags&DRIVE)
printf("\tdrive:
%s\n",drive);
if(flags&DIRECTORY)
printf("\tdirectory:
%s\n",dir);
if(flags&FILENAME)
printf("\tfile:
%s\n",file);
if(flags&EXTENSION)
printf("\textension:
%s\n",ext);
return0;
}
●函数名:
fscanf
功 能:
从一个流中执行格式化输入
用 法:
intfscanf(FILE*stream,char*format[,argument...]);
程序例:
#include
#include
intmain(void)
{
inti;
printf("Inputaninteger:
");
/*readanintegerfromthe
standardinputstream*/
if(fscanf(stdin,"%d",&i))
printf("Theintegerreadwas:
%i\n",
i);
else
{
fprintf(stderr,"Errorreadingan\
integerfromstdin.\n");
exit
(1);
}
return0;
}
●函数名:
fgetc
功 能:
从流中读取字符
用 法:
intfgetc(FILE*stream);
程序例:
#include
#include
#include
intmain(void)
{
FILE*stream;
charstring[]="Thisisatest";
charch;
/*openafileforupdate*/
stream=fopen("DUMMY.FIL","w+");
/*writeastringintothefile*/
fwrite(string,strlen(string),1,stream);
/*seektothebeginningofthefile*/
fseek(stream,0,SEEK_SET);
do
{
/*readacharfromthefile*/
ch=fgetc(stream);
/*displaythecharacter*/
putch(ch);
}while(ch!
=EOF);
fclose(stream);
return0;
}
●函数名:
fprintf
功 能:
传送格式化输出到一个流中
用 法:
intfprintf(FILE*stream,char*format[,argument,...]);
程序例:
/*Programtocreatebackupofthe
AUTOEXEC.BATfile*/
#include
intmain(void)
{
FILE*in,*out;
if((in=fopen("\\AUTOEXEC.BAT","rt"))
==NULL)
{
fprintf(stderr,"Cannotopeninput\
file.\n");
return1;
}
if((out=fopen("\\AUTOEXEC.BAK","wt"))
==NULL)
{
fprintf(stderr,"Cannotopenoutput\
file.\n");
return1;
}
while(!
feof(in))
fputc(fgetc(in),out);
fclose(in);
fclose(out);
return0;
}
●函数名:
strcpy
功 能:
串拷贝
用 法:
char*strcpy(char*str1,char*str2);
程序例:
#include
#include
intmain(void)
{
charstring[10];
char*str1="abcdefghi";
strcpy(string,str1);
printf("%s\n",string);
return0;
}
三、总结
为期三周的高级语言程序设计结束了。
这学期后期,我们被通知要进行三周的课程设计。
当时有点懵,感觉学的东西很少,很零散,不知该怎么联到一起,就要课程设计,是不是太难为我们了。
第一天基本上都是在看书,把基本知识再熟悉一边。
老师发过来20道设计题目题,但我们几乎不知道怎样完成这些任务,不过任务中还附带着一些设计样例,从这几道样例上我得到了不少启发,然后我们组把整个程序的思路理清了,开始着手写程序。
第一周结束的时候,我感觉自己收获挺大的,从一开始的迷茫,不知道从何下手到把程序中的几个模块编写出来,心里挺开心的。
但是,到了第二周,我们由不得不再次陷入困境。
在整个程序的编写过程中。
最难的就是修改和删除这两个模块,这也是我们第二周要解决的重点问题。
开始编写修改和删除时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,我编完了修改程序,但编译时老出错,修改后的内容将文本内的信息全部覆盖了。
困难之时,老师,帮助了我我们,完成了修改和删除。
这样的话,整个程序基本上全部完成了,就剩下完善工作了。
我们组写了两个程序,最后,两个程序相互组合,互补,大功告成
虽然设计时完成了,但是我觉得其中还是由一些不足之处:
1.字符。
程序中一些对长字符串的输入显示效果不好。
2.重名的情况。
由于考虑的不周全,没有设计遇到重名和学号重合的情况该怎么处理。
3.选择单一。
我们设计的程序中,只设计了按名字选择,进行操作,忽略了重名的情况。
整个程序完成了,还有很多不完善的地方,希望自己以后办事的时候要认真,仔细,考虑周全。
短短的三周课程设计结束了,但是这段时间里,我又学到了更多C知识,如:
对象数组,string类,文件流等,同时我也被提醒以后办事的时候要认真,仔细,考虑周全。
,也看到了团队精神和互帮互助的重要性。
这一点会让我终生受益。
通过三周的课程设计,我觉得自己肚子里的墨水多了,收获也挺大的,这三周过的挺充实!