中南大学《C语言程序设计》课程设计报告课题名称:学生成绩管理系统专业电气信息学生姓名舒畅班级0914学号**********指导教师穆帅完成日期2010年7月10日信息科学与工程学院目录1 课程设计的目的 (1)2 设计内容与要求 (1)3 主要技术指标及特点 (2)3.1 登录界面显示 (2)3.2登记学生资料 (4)3.3保存学生资料 (5)3.4 删除学生资料 (6)3.5修改学生资料 (7)3.6 查询学生资料 (8)3.6统计学生资料(自加功能) (8)3.8对学生资料进行排序 (9)3.9程序主要代码 (9)4 设计小结 (31)成绩管理系统1 课程设计的目的1.加深对《C语言程序设计》课程知识的理解,掌握C语言应用程序的开发方法和步骤;2.进一步掌握和利用C语言进行程设计的能力;3.进一步理解和运用结构化程序设计的思想和方法;4.初步掌握开发一个小型实用系统的基本方法;5.学会调试一个较长程序的基本方法;6.学会利用流程图或N-S图表示算法;7.掌握书写程设计开发文档的能力(书写课程设计报告)。
2 设计内容与要求设计内容:成绩管理系统现有学生成绩信息,内容如下:姓名学号 C 数学英语shuchang 12 99 98 99jiutian 32 87 68 87changzi 33 98 89 99jiutia 13 7 43 45设计要求:✧封面(参见任务书最后一页)✧系统描述:分析和描述系统的基本要求和内容;✧功能模块结构:包括如何划分功能模块,各功能模块之间的结构图,以及各模块的功能描述;✧数据结构设计:设计数据结构以满足系统的功能要求,并加以注释说明;✧主要模块的算法说明:即实现该模块的思路;✧运行结果:包括典型的界面、输入和输出数据等;✧总结:包括C语言程序设计实践中遇到的问题,解决问题的过程及体会、收获、对程序开发的认识与思考等。
附录:包括主要程序清单,要有适当的注释,使程序容易阅读。
3 主要技术指标及特点程序流程图如下:3.1 登录界面显示此登录界面是预先设定好作为菜单来显示的,在主函数中以menu()来实现的,在函数中,是通过switch……case来实现选择功能的,用户可以通过需要进行选择,方便了用户的使用,非常人性化。
当系统中没有保存学生信息时,就会提示没有学生记录!也就是说不能从文件中导出,这时就需要用户进行学生资料的导入,当输入的学号已经存在时,系统会提示用户重新输入一个未被占用的学号信息,否则就重新分配内存空间。
该操作是将用户输入的学生信息进行保存,用文件的方法进行调试,当用户输入对象的个数超过0时,显示保存成功,否则提示,系统连接为空。
这里又是通过switch……case函数的调用,让用户进行选择,共有两种方法:1.按照学号2.按照姓名,操作完成后,系统会自动提示,该学生已经成功删除,当再次显示的时候,函数中的链表就不再指向该学号,从而起到删除的作用。
删除完成后,再次保存一下学生资料,不然系统仍然默认为原始人数。
通过选择到达修改界面:此时将呈现出现有的学生资料,按照要求将新的信息输入其中,再保存资料,如果输入的学号系统中未显示,那么系统则提示没有资料可以修改。
这个为修改完的图片按照选择,则会呈现出用户需要查找的所有信息,每次呈现出来的时候都要用之前定义的printheader()函数,这个很好地将数据按照格式化的形式显现出来。
此为按照学号查找的例子,按照姓名查找是同样道理。
3.6 统计学生资料(自加功能)统计学生资料主要还是用的switch……case函数,通过选择,用printheader(),printdata(r),printf(END)等函数用表格的形式将符合条件的学生信息全部显示出来,不过唯一不足的就是所有的学生信息没有能够连贯起来,每个学生信息前面都有表头,没处理好。
3.8 对学生资料进行排序该图显示的是按照语文成绩排序完的结果,用链表将数据进行一个接一个的比较,按照降序将学生信息排列下来,最后提示排序已经完成,并将所有结果按照用户要求显示出来。
3.9 程序主要代码主函数#include "stdio.h" /*标准输入输出函数库*/#include "stdlib.h" /*标准函数库*/#include "string.h" /*字符串函数库*/#include "conio.h" /*屏幕操作函数库*/#define HEADER1 " ----------------------------student's information---------------------------- \n"#define HEADER2 " | Number | Name |C|Math|English| Total | Average | \n"#define HEADER3 " |---------------|---------------|----|----|----|--------|-------|"#define FORMAT " | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |\n"#define DATA p->data.num,p->,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave#define END " -------------------------------------------------------------- \n"int shoudsave=0; /* */struct student{char num[10];/* Number */char name[20];char sex[4];int cgrade;int mgrade;int egrade;int total;float ave;char neartime[10];/* 最近更新时间*/};typedef struct node{struct student data;struct node *next;}Node,*Link;菜单函数void menu(){system("cls"); /*调用DOS命令,清屏.与clrscr()功能相同*/cprintf("\n");printf("@@@@@Students' performance management system@@@@@@\n\n");printf("@@@@@@@@@@@@@@@@@@@@@@@Menu@@@@@@@@@@@@@@@@@@@ @@@@@\n");printf(" *1 input 2 delete *\n");printf(" *3 search 4 modify *\n");printf(" *5 insert 6 count *\n");printf(" *7 sort 8 save *\n");printf(" *9 dispaly 0 exit *\n");printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@\n");/*cprintf()送格式化输出至文本窗口屏幕中*/}void printheader() /*格式化输出表头*/{printf(HEADER1);printf(HEADER2);printf(HEADER3);}void printdata(Node *pp) /*格式化输出表中数据*/{Node* p;p=pp;printf(FORMA T,DATA);}void Wrong(){printf("\n=====>error!\n");}void Nofind(){printf("\n=====>No record now!Please press Enter\n");}void Disp(Link l) /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/{Node *p;p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p) /*p==NULL,NUll在stdlib中定义为0*/{printf("\n=====>No record now!Please press Enter\n");getchar();return;}printf("\n\n");printheader(); /*输出表格头部*/while(p) /*逐条输出链表中存储的学生信息*/{printdata(p);p=p->next; /*移动直下一个结点*/printf(HEADER3);}getchar();}/*************************************************************作用:用于定位链表中符合要求的节点,并返回指向该节点的指针参数:findmess[]保存要查找的具体内容; nameornum[]保存按什么查找;在单链表l中查找;**************************************************************/Node* Locate(Link l,char findmess[],char nameornum[]) /* 该函数用于定位连表中符合要求的接点,并返回该指针*/{Node *r;if(strcmp(nameornum,"num")==0) /* 按Number查询*/{r=l->next;while(r!=NULL){if(strcmp(r->data.num,findmess)==0)return r;r=r->next;}}else if(strcmp(nameornum,"name")==0) /* 按Name查询*/{r=l->next;while(r!=NULL){if(strcmp(r->,findmess)==0)return r;r=r->next;}}return 0;}/*增加学生记录*/void Add(Link l){Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/char ch,flag=0,num[10];r=l;s=l->next;system("cls");Disp(l); /*先打印出已有的学生信息*/while(r->next!=NULL)r=r->next; /*将指针移至于链表最末尾,准备添加记录*/while(1) /*一次可输入多条记录,直至输入Number为0的记录结点添加操作*/{while(1) /*输入Number,保证该Number没有被使用,若输入Number为0,则退出添加记录操作*/ {printf("please input the Number(press'o'to upper level):");scanf("%s",num);flag=0;if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/{return;}s=l->next;while(s) /*查询该Number是否已经存在,若存在则要求重新输入一个未被占用的Number*/ {if(strcmp(s->data.num,num)==0){flag=1;break;}s=s->next;}if(flag==1) /*提示用户是否重新输入*/{ getchar();printf("=====>Number %s existed already!Please press Enter.input again?(y/n):",num);scanf("%c",&ch);if(ch=='y'||ch=='Y')continue;elsereturn;}else{break;}}p=(Node *)malloc(sizeof(Node)); /*申请内存空间*/if(!p){printf("\n Allocate memory failure "); /*如没有申请到,打印提示信息*/return ; /*返回主界面*/}strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/printf("please input the Name:");scanf("%s",p->);getchar();printf("please input the score of C:");scanf("%d",&p->data.cgrade);getchar();printf("please input the score of Math:");scanf("%d",&p->data.mgrade);getchar();printf("please input the score of English:");scanf("%d",&p->data.egrade);p->data.total=p->data.egrade+p->data.cgrade+p->data.mgrade;p->data.ave=p->data.total / 3;getchar();/* 信息输入已经完成*/p->next=NULL;r->next=p;r=p;shoudsave=1;}}查询函数void Qur(Link l) /*按Number或Name,查询学生记录*/{int sel; /*1:按Number查,2:按Name查,其他:返回主界面(菜单)*/char findmess[20]; /*保存用户输入的查询内容*/Node *p;if(!l->next)/*若链表为空*/{system("cls");printf("\n=====>No record now!Please press Enter\n");return;}system("cls");printf("\n=====>1Search by Number\n=====>2Search by Name\n");printf(" select[1,2]:");scanf("%d",&sel);if(sel==1)/* Number */{printf("please input the Number you want to search:");scanf("%s",findmess);p=Locate(l,findmess,"num");/*在l中查找Number为searchinput值的节点,并返回节点的指针*/ if(p)/*若p!=NULL*/{printheader();printdata(p);printf(END);printf("press any key to back");getchar();}elseNofind();getchar();}else if(sel==2) /* Name */{printf("please input the Name you want to search:");scanf("%s",findmess);p=Locate(l,findmess,"name");if(p){printheader();printdata(p);printf(END);printf("press any key to back");getchar();}elseNofind();getchar();}elseWrong();}删除函数/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/ void Del(Link l) /* 删除*/{int sel;Node *p,*r;char findmess[20];if(!l->next){printf("\n=====>no record!\n");getchar();return;}printf("\n=====>1Delete by Number\n=====>2Delete by Name\n"); scanf("%d",&sel);if(sel==1){printf("please input the Number you want to delete:");scanf("%s",findmess);p=Locate(l,findmess,"num");if(p){r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("\n=====>Delete successful!\n");getchar();shoudsave=1;}elseNofind();}else if(sel==2){printf("please input the Name you want to delete:");scanf("%s",findmess);p=Locate(l,findmess,"name");if(p){r=l;while(r->next!=p)r=r->next;r->next=p->next;free(p);printf("\n=====>Delete successful!\n");getchar();shoudsave=1;}elseNofind();getchar();}elseWrong();getchar();}修改函数/*修改学生记录。