《学生成绩管理系统》课程设计报告专业:信息科学与工程学院班级:电气0916班姓名:陈光尧指导教师:汤哲学号:09090916112010-7-92一、程序整体规划:1.系统的基本功能数据的录入:如录入学生的基本信息,以及该学生选修课程的基本信息;数据的修改:如修改指定学号、或者指定姓名的学生信息,或者修改其选修课程信息;数据的插入:插入某个学生信息;数据的查询:如按学号查询、按姓名查询等;数据的删除:如删除指定学号、或者指定姓名的学生及其选修课程信息;平均成绩的计算:计算每个学生各门功课的平均成绩,并按平均成绩从高到低的次序输出学生信息;考虑用文件把数据保存起来2、首先是结构体的定义:typedefstructmessage_studentcharnumber[6];charname[20];charsex[4];floatsubject[numsubs];floatscore;floataverage;intindex;}student;intnumstus;定义学生数目student*pointer;指向结构体数组intlens;次迟到时候分配内存3、部分重要函数声明:intmenu_select();决定主界面的函数intopenfile(studentstu[]);打开文件的函数intfindrecord(studentstud[]);查找信息的函数intwritetotext(studentstud[]);保存文件的函数3voidsort(studentstu[]);查找信息的函数voiddeleterecord(studentstu[],inti);删除信息的函数voidaddrecord(studentstud[]);增加学生信息的函数voiddisplay(studentstud[],intn1,intn2);数据的显示函数voidsortnum(studentstud[]);以下几个均为排序函数voidsortnum2(studentstud[]);voidsortname(studentstud[]);voidsortname2(studentstud[]);voidsortcount(studentstud[]);voidsortcount2(studentstud[]);4、设计思路1、主函数以switch和case语句引出其他子函数。然后进行其他子函数的调用。2、定义结构体student,让其包含如姓名性别等基本信息。同时定义结构体指针,以便后面子函数对某一项排序后输出该学生的全部信息。LENS给结构体数组分配内存。3、各个函数运行并相互调用其他子函数,例如几个排序函数全部被其它函数调用并输出结果。具体各子函数之间的关系见源代码。4、studentstu[i]表示的是一个结构体,[]内填大于等于0的数,这可以解释各个子函数中出现此类情况:例如strcmp(str,stud[i].name)==0是该结构体内的第i+1个学生满足上述条件。由Stud[i].变量来引用各结构体中的变量,然后用输出函数相应输出该结构体内的信息。4二.程序模板细致分析:1.程序涉及的模板:主程序模板.查询模块.删除模板.将所有记录写入文件.输出模板.修改信息模板.录入信息模板.和排序模板.排序模板可按如下进行分类:按学号:按学号降序排序模块.按学号升序排序模块.按姓名:按姓名降序排序模块.按姓名升序排序模块.按名次:按名次降序排序模块.按名次升序排序模块.2.功能结构联系图如下图所示:现对各个功能的实现及个人认为每个功能中所用到的程序的闪光点和难点:主函数模板增加学生记录查询学生记录修改学生记录学生纪录排序保存文件打开文件统计信息51.增加学生记录2.已有记录是否覆盖:if(numstus!=0){printf(已有记录存在是否覆盖?(y/n)\n);fflush(stdin);gets(str);if(str[0]=='Y'||str[0]=='y')i=0;当输入数据过多时内存的扩展:(通过定义LENS开辟增加内存)if(numstuslens){lens+=50;pointer=(student*)realloc(pointer,lens*LEN);输入数字为1.0,但是结果输出为男.女:printf(请输入性别(男/女1/0):);gets(stud[i].sex);if(stud[i].sex[0]=='0')strcpy(stud[i].sex,女);elsestrcpy(stud[i].sex,男);2.查询学生记录增加学生记录已有记录是否覆盖当输入数据过多时内存的扩展输入数字为1.0,但是结果输出为男.女查询学生记录按学号,姓名,名次进行查询如何根据学号输出其相应的成绩,性别等6例:按学号查找:if(str[0]=='1'){printf(请输入学号:);fflush(stdin);亮点:清除数据缓冲区间gets(str);for(i=0;i=numstus;i++){if(strcmp(str,stud[i].number)==0)亮点:利用该函数将结构体数组中相应相同项联系在一起,确定其相应位置,便于输出。{display(stud,i,i);子函数又调用了其他子函数break;}elsecontinue;3.修改学生记录例:inti=-1,j;if(numstus==0)/*没有记录返回*/printf(没有可供修改的记录!);while(i0){i=findrecord(stud);if(i=0){printf(要删除这个学生的信息吗?(y/n));此处有一个难点就是while函数和调用其他子函数findrecord,以及解释为什么一开始要定义i为-14.学生纪录排序按学号:按学号降序排序模块.按学号升序排序模块.按姓名:按姓名降序排序模块.按姓名升序排序模块.按名次:按名次降序排序模块.按名次升序排序模块.在排序过程中比较名次,成绩大小是不难的事情,名字通过STRCMPY函数来解决排序问题,但排序中的难点在于指针,结构体变量,结构体数组的综合应用,通过比较你的一组数据要输出所有该成员相应的信息,几个排序中7指针既指明了变量的地址,也指明了结构体数组的地址。此处感觉很棘手详细如下一条典型的例子:(其余的大致相同)studenttemp;student*p;p=stud;for(i=0;inumstus;i++)for(j=0;jnumstus-i-1;j++){if(strcmp(stud[j].name,stud[j+1].name)0){temp=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=temp;}}5.打开文件和保存文件fgetc(fp);while(inumstus){fscanf(fp,%s,stu[i].number);fscanf(fp,%s,stu[i].name);fscanf(fp,%s,stu[i].sex);for(j=0;jnumsubs;j++)fscanf(fp,%f,&stu[i].subject[j]);fscanf(fp,%f,&stu[i].score);fscanf(fp,%f,&stu[i].average);fscanf(fp,%d,&stu[i].index);i++;}打开文件用函数fopen,fclose实现文件的打开,文件的关闭。其中按格式将内存中的数据转换成对应的ASCII字符,并以码形式输出到文本文件中保存文件先给所要保存的文件一个内存地址fp,然后将数据输入,数据存储过程中所用到的fscanf将数据通过一个文件指针指向一个已打开的文本文件。此处的难点见函数的整体规划的详细说明。8三、部分运行的图像主界面:纪录排序:9信息查找和修改文件保存和显示10数据统计四.程序主要代码includestdio.h#includestring.h#includemalloc.h#defineH_STUDENT_HH#defineLENsizeof(structmessage_student)/*一个结构体数组元素的长度*/#definenumsubs4/*学科数目*/typedefstructmessage_student/*结构体定义*/{charnumber[6];charname[20];charsex[4];floatsubject[numsubs];floatscore;floataverage;intindex;11}student;intnumstus;/*学生数目*/student*pointer;/*指向结构体数组*/intlens;intmenu_select();/*函数声明*/intopenfile(studentstu[]);intfindrecord(studentstud[]);intwritetotext(studentstud[]);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();intmenu_select(){charc;intnum;printf(\n\n中南大学电气信息类学生信息管理系统);printf(\n\n);printf(*制作人:陈光尧电气0916班学号0909091611\n\n);printf(\n\n);printf(**************************系统功能菜单**********************\n\n);12printf(--------------------------------------------\n);printf(☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n);printf(☆☆\n);printf(☆1.增加学生记录5.统计信息☆\n);printf(☆********************************************☆\n);printf(☆2.查询学生记录6.打开文件☆\n);printf(☆********************************************☆\n);printf(☆3.修改学生记录7.保存文件☆\n);printf(☆********************************************☆\n);printf(☆4.学生纪录排序☆\n);printf(☆********************************************☆\n);printf(☆☆\n);printf(☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n);printf(请选择1-8:);fflush(stdin);c=getchar();return(c);}/*-----------------------------查询模块-------------------------------*/intfindrecord(studentstud[])/*查找信息*/{system(cls);charstr[2