学生成绩管理系统课程设计报告_第1页
学生成绩管理系统课程设计报告_第2页
学生成绩管理系统课程设计报告_第3页
学生成绩管理系统课程设计报告_第4页
学生成绩管理系统课程设计报告_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学生成绩管理系统课程设计报告编写人:郭忠同组成员:郭忠刘文斌郭东东完成日期:2010/12/04

辅导教师:祁俊批阅日期:分数:功能描述此成绩管理系统主要利用单链表实现,由如下三个功能模块实现文件模块。主要完成将文件中的成绩信息导入链表、从键盘输入信息到链表和链表信息存储功能。编辑模块。主要完成对成绩信息的插入、修改和删除。查找模块。主要完成按学号或姓名方式进行成绩信息查询数据结构设计学生成绩信息结构体structz1{charnum[15];charname[25];intscore[N];intsum;floataverage;structz1*next;}函数功能描述main()功能:调用各个函数,实现学生管理系统的诸多功能。menu()功能:显示菜单选项。open()功能:从磁盘中打开文件并将其中的成绩信息导入到系统中。create()功能:建立单链表,并提示用户输入学生成绩信息。input(char*pri,char*s,unsignedintcount)参数含义:*pri--提示语句,*s---要输入的内容,count---输入的内容所规定的长度功能:提示用户正确地输入相关的成绩信息。output(student*head)参数含义:head---单链表的首地址功能:显示系统当前的学生成绩信息,并简单输出总分和平均值。lookst1(student*head,char*s)参数含义:head---单链表的首地址,*s---要查找的学号功能:查找用户输入的学号所在链表位置。lookst2(student*h,char*s)参数含义:head---单链表的首地址,*s---要查找的姓名功能:查找用户输入的姓名所在链表位置。insl(student*head)参数含义:head---单链表的首地址功能:将新的学生成绩信息插入到链表的指定位置。search1(student*head)参数含义:head---单链表的首地址功能:按学号进行学生信息查找。search2(student*head)参数含义:head---单链表的首地址功能:按姓名进行学生信息查找。change(student*head)参数含义:head---单链表的首地址功能:修改用户指定的学生成绩信息。desl(student*head参数含义:head---单链表的首地址功能:删除用户指定的学生成绩信息total(student*head)参数含义:head---单链表的首地址功能:对系统当前的学生成绩信息进行简单统计,计算出各门课的总分和平均分。save(student*head)参数含义:head---单链表的首地址功能:将系统当前的学生成绩信息储存为文本文件,保存在磁盘中。back()功能:显示交互语句,使界面跟友好。五、程序实现1、源代码分析⑴程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作。#include"stdio.h"#include"stdlib.h"#include"string.h"#defineN3/*N为学生所考科目的门数*/typedefstructz1/************定义结构体**************/{charnum[15];charname[25];intscore[N];intsum;floataverage;structz1*next;}student;⑵主函数main()voidmain()/************主函数**************/{intxz;student*head=NULL;while(1)/*循环菜单选项*/{menu();scanf("%d",&xz);/*用户选择相应功能*/switch(xz){ case0:head=open();break;case1:head=create();break; case2:output(head);back();break; case3:head=insl(head);break;case4:search1(head);break; case5:search2(head);break; case6:head=change(head);break; case7:head=desl(head);break; case8:total(head);break; case9:save(head);break; case10:system("cls"); printf("谢谢使用,再见!\n"); exit(0); default:printf("操作错误,请重新选择!"); getchar(); getchar(); }}}⑶程序代码#include"stdio.h"#include"stdlib.h"#include"string.h"#defineN3/*N为学生所考科目的门数*/typedefstructz1/************定义结构体**************/{charnum[15];charname[25];intscore[N];intsum;floataverage;structz1*next;}student;voidmenu()/************菜单**************/{system("cls"); printf("━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("┃━━━━━欢迎使用学生成绩管理系统━━━━┃\n"); printf("━━━━━━━━━━━━━━━━━━━━━━━\n"); printf("┃0、打开已有文件┃\n"); printf("┃1、新建学生记录┃\n"); printf("┃2、显示学生记录┃\n"); printf("┃3、插入学生成绩┃\n");printf("┃4、按学号查找学生信息┃\n"); printf("┃5、按姓名查找学生信息┃\n"); printf("┃6、修改指定学生信息┃\n"); printf("┃7、删除指定学生信息┃\n"); printf("┃8、统计各门课程的学生成绩┃\n"); printf("┃9、保存学生信息记录┃\n"); printf("┃10、退出系统┃\n"); printf("━━━━━━━━━━━━━━━━━━━━━━━\n");printf("请选择1~10中的某一个选项\n");}voidback()/************交互模块**************/{printf("按回车键返回上一菜单......");getchar();getchar();}student*open()/************打开文件**************/{FILE*fp; student*p=NULL,*q=NULL,*h=NULL; charc[25];/*用来接收p->next*/charfilename[25];/*定义文件名*/system("cls"); p=(student*)malloc(sizeof(student));/*新建链表*/ h=p; printf("请输入要打开的文件名以及路径(C:\\stu.txt):\n"); scanf("%s",filename); if((fp=fopen(filename,"a+"))==NULL)/*检查问该文件能否打开*/ {printf("\n无法打开文件");returnNULL; } printf("正在打开文件,请稍后...");fscanf(fp,"%s",&p->num);/*将该文件中的数据填入链表*/fscanf(fp,"%s",&p->name);fscanf(fp,"%d",&p->score[0]);fscanf(fp,"%d",&p->score[1]);fscanf(fp,"%d",&p->score[2]); fscanf(fp,"%d",&p->sum);fscanf(fp,"%f",&p->average); while(fscanf(fp,"%s",&c)!=EOF)/*判断该文件是否还有其他学生的成绩信息*/ { q=(student*)malloc(sizeof(student));/*新建另一个链表*/ p->next=q;/*将p链表与q链表连接成新链表*/p=q;strcpy(p->num,c);fscanf(fp,"%s",&p->name);fscanf(fp,"%d",&p->score[0]);fscanf(fp,"%d",&p->score[1]);fscanf(fp,"%d",&p->score[2]); fscanf(fp,"%d",&p->sum);fscanf(fp,"%f",&p->average); }p->next=NULL;/*置链表未为空*/ fclose(fp); printf("文件%s打开成功!\n",filename); back(); returnh;/*返回由文件中创建的链表*/}voidinput(char*pri,char*s,unsignedintcount)/************输入支持**************/{/*用来判断输入的数据是否超出规定的范围*/charn[255]; do { printf(pri);/*显示提示语句*/scanf("%s",&n); if(strlen(n)>count)printf("你输入的太长了,请重新输入!\n");/*判断用户输入的数据是否超出范围*/ }while(strlen(n)>count);strcpy(s,n);/*传回正确的数据*/}student*create()/************输入**************/{student*h=NULL,*p=NULL,*q=NULL;inti,s=0;/*接收总分*/ charcc; p=(student*)malloc(sizeof(student)); system("cls"); h=p; printf("━━━━━━━━━━━━━━━━━━━━━━\n");printf("现在开始输入学生成绩信息......\n"); printf("━━━━━━━━━━━━━━━━━━━━━━\n"); input("请输入学号:",p->num,15);/*输入学号、姓名*/ input("请输入姓名:",p->name,25); printf("现在开始输入%d门课的分数......\n",N); for(i=0;i<N;i++)/*循环输入N门课的分数*/ { do { printf("请输入第%d门课的分数:",i+1); scanf("%d",&p->score[i]); if(p->score[i]>100||p->score[i]<0)printf("输入错误,请检查输入的分数是否正确!\n"); }while(p->score[i]>100||p->score[i]<0);/*限定分数介于0~100*/ s=s+p->score[i];/*计算总分*/ } p->sum=s; p->average=(float)s/N;/*计算平均值*/ s=0;/*s清零*/printf("是否继续输入下一个学生的成绩信息?\nY/N"); getchar(); cc=getchar(); if(cc=='n'||cc=='N')p->next=NULL;/*判断是否继续输入*/ while(cc=='Y'||cc=='y') { q=(student*)malloc(sizeof(student));/*建立新链表*/ system("cls"); p->next=q;/*连接两个链表*/ p=p->next;printf("现在开始输入学生成绩信息......\n"); input("请输入学号:",p->num,15); input("请输入姓名:",p->name,25); printf("现在开始输入%d门课的分数......\n",N); for(i=0;i<N;i++) { do { printf("请输入第%d门课的分数:",i+1); scanf("%d",&p->score[i]); if(p->score[i]>100||p->score[i]<0)printf("输入错误,请检查输入的分数是否正确!\n"); }while(p->score[i]>100||p->score[i]<0); s=s+p->score[i]; } p->sum=s; p->average=(float)s/N; s=0;printf("是否继续输入下一个学生的成绩信息?\nY/N"); getchar(); cc=getchar(); if(cc=='n'||cc=='N')p->next=NULL;/*置链表末位空*/ }returnh;}voidoutput(student*h)/************输出**************/{student*p=NULL;inti=1;/*显示学生人数*/p=h; system("cls"); printf("┃━━━━━━━━━━━━━━━学生成绩信息━━━━━━━━━━━━┃\n");printf("┃序号┃学号┃姓名┃语文┃英语┃数学┃总分┃平均分┃\n");printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n"); while(p!=NULL)/*循环输出整个链表信息*/ { printf("┃%2d┃%10s┃%9s┃%2d┃%2d┃%2d┃%2d┃%2.2f┃\n", i,p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average); p=p->next; i++; } printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");}student*lookst1(student*h,char*s)/************学号查找支持**************/{student*p; p=h; while((p->next!=NULL)&&(strcmp((p->next)->num,s)!=0))/*循环查找,直到找到或没找到*/ { p=p->next; } returnp;/*返回查找数据的前一个指针*/}student*insl(student*h)/************插入**************/{student*p=NULL,*q=NULL; inti,s=0;/*总分清零*/ charn[15]; system("cls"); output(h); printf("请输入插入点学生的学号:"); scanf("%s",&n); p=(student*)malloc(sizeof(student)); printf("━━━━━━━━━━━━━━━━━━━━━━\n");printf("现在开始输入学生成绩信息......\n"); printf("━━━━━━━━━━━━━━━━━━━━━━\n"); input("请输入学号:",p->num,15); input("请输入姓名:",p->name,25); printf("现在开始输入%d门课的分数......\n",N); for(i=0;i<N;i++) { do { printf("请输入第%d门课的分数:",i+1); scanf("%d",&p->score[i]); if(p->score[i]>100||p->score[i]<0)printf("输入错误,请检查输入的分数是否正确!\n"); }while(p->score[i]>100||p->score[i]<0); s=s+p->score[i]; } p->sum=s; p->average=(float)s/N; if(h==NULL)/*判断head是否为空*/ {h=p;/**/ p->next=NULL;/*将新表赋给head*/ printf("已经插入了%s同学的成绩信息,不要忘记存盘哦!\n",p->name); back(); returnh; } if(strcmp(h->num,n)==0)/*判断查找学号是否处在头节点处*/ { p->next=h;/*将head置于新链表的末尾,连接两链表*/ h=p; printf("已经插入了%s同学的成绩信息,不要忘记存盘哦!\n",p->name); back(); returnh; }q=lookst1(h,n);/*要查找的学号不处在头结点处,进行查找并返回前一个节点的指针*/ p->next=q->next;/*将新链表插入到原链表中*/ q->next=p; printf("已经插入了%s同学的成绩信息,不要忘记存盘哦!\n",p->name); back();/*调用交互界面*/ returnh;}voidsearch1(student*h)/************学号查找**************/{charn[15]; student*p=NULL; system("cls"); printf("请输入要查找学生的学号:"); scanf("%s",&n); if(h==NULL)/*判断head是否为空*/ { printf("抱歉,系统中还没有任何学生成绩信息呢!\n"); back(); return; } if(strcmp(h->num,n)==0)/*判断查找学号是否处在头节点处*/ { p=h; printf("┃━━━━━━━━━━━━━该学生成绩信息━━━━━━━━━━┃\n");printf("┃学号┃姓名┃语文┃英语┃数学┃总分┃平均分┃\n");printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n"); printf("┃%10s┃%9s┃%2d┃%2d┃%2d┃%2d┃%2.2f┃\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average); printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n"); back(); return; } p=lookst1(h,n);/*查找该学号的前一个节点的指针*/ if(p->next==NULL)/*判断链表中是否由该学号的学生成绩信息*/ { printf("抱歉,系统当中没有学号为%s的学生成绩信息呢!\n",n); back(); return; } p=p->next;/*置此学号对应的指针p*/printf("┃━━━━━━━━━━━━━该学生成绩信息━━━━━━━━━━┃\n");printf("┃学号┃姓名┃语文┃英语┃数学┃总分┃平均分┃\n");printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("┃%10s┃%9s┃%2d┃%2d┃%2d┃%2d┃%2.2f┃\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average); printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");back(); return;}student*lookst2(student*h,char*s)/************姓名查找支持**************/{student*p; p=h; while((p->next!=NULL)&&(strcmp((p->next)->name,s)!=0))/*循环查找,直到找到或没找到*/ { p=p->next; } returnp;/*返回查找数据的前一个指针*/}voidsearch2(student*h)/************姓名查找**************/{charn[15]; student*p=NULL; system("cls"); printf("请输入要查找学生的姓名:"); scanf("%s",&n); if(h==NULL)/*判断head是否为空*/ { printf("抱歉,系统中还没有任何学生成绩信息呢!\n"); back(); return; } if(strcmp(h->name,n)==0)/*判断查找姓名是否处在头节点处*/ { p=h; printf("┃━━━━━━━━━━━━━该学生成绩信息━━━━━━━━━━┃\n");printf("┃学号┃姓名┃语文┃英语┃数学┃总分┃平均分┃\n");printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n"); printf("┃%10s┃%9s┃%2d┃%2d┃%2d┃%2d┃%2.2f┃\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average); printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n"); back(); return; } p=lookst2(h,n);/*查找该姓名的前一个节点的指针*/ if(p->next==NULL)/*判断链表中是否由该姓名的学生成绩信息*/ { printf("抱歉,系统当中没有姓名为%s的学生成绩信息呢!\n",n); back(); return; } p=p->next;/*置此姓名对应的指针p*/printf("┃━━━━━━━━━━━━━该学生成绩信息━━━━━━━━━━┃\n");printf("┃学号┃姓名┃语文┃英语┃数学┃总分┃平均分┃\n");printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");printf("┃%10s┃%9s┃%2d┃%2d┃%2d┃%2d┃%2.2f┃\n", p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average); printf("┃━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┃\n");back(); return;}student*change(student*h)/************修改**************/{charn[15]; inti; student*p=NULL; system("cls"); output(h); printf("请输入要修改信息的学生学号:"); scanf("%s",&n); if(h==NULL)/*判断head是否为空*/ { printf("抱歉,系统中还没有任何学生成绩信息呢!\n"); back(); returnNULL; } if(strcmp(h->num,n)==0)/*判断要修改信息的学号是否处在头节点处*/ { printf("修改该学生的:1、学号2、姓名3、语文成绩4、英语成绩5、数学成绩\n"); printf("请选择1~5中的某一个选项:"); scanf("%d",&i); switch(i)/*选择修改什么信息*/ {/*修改相应的学生信息*/ case1:input("请输入学号:",h->num,15);break;case2: input("请输入姓名:",h->name,25);break; case3:printf("请输入语文课的分数:"); scanf("%d",&h->score[0]);break;case4:printf("请输入英语课的分数:"); scanf("%d",&h->score[1]);break; case5:printf("请输入数学课的分数:"); scanf("%d",&h->score[2]);break; default:printf("操作错误,请重新选择!"); getchar(); getchar(); } printf("学生信息已修改,不要忘记存盘哦!\n"); back(); returnh; } p=lookst1(h,n);/*查找该学号的前一个节点的指针*/ if(p->next==NULL)/*判断链表中是否由该学号的学生成绩信息*/ { printf("抱歉,系统当中没有学号为%s的学生成绩信息呢!\n",n); back(); returnh; } p=p->next;/*置此学号对应的指针p*/printf("修改该学生的:1、学号2、姓名3、语文成绩4、英语成绩5、数学成绩\n");printf("请选择1~5中的某一个选项:"); scanf("%d",&i); switch(i)/*选择修改什么信息*/ {/*修改相应的学生信息*/ case1:input("请输入学号:",p->num,15);break;case2:input("请输入姓名:",p->name,25);break; case3:printf("请输入语文课的分数:"); scanf("%d",&p->score[0]);break; case4:printf("请输入英语课的分数:"); scanf("%d",&p->score[1]);break; case5:printf("请输入数学课的分数:"); scanf("%d",&p->score[2]);break; default:printf("操作错误,请重新选择!"); getchar(); getchar(); } printf("学生信息已修改,不要忘记存盘哦!\n");back(); returnh;}student*desl(student*h)/************删除**************/{charn[15]; student*p=NULL,*q=NULL; system("cls"); output(h); printf("请输入要删除成绩信息的学生学号:"); scanf("%s",&n); if(strcmp(h->num,n)==0)/*判断要删除信息的学生学号与head指向的学号是否一致*/ { p=h->next;/*将head节点从链表中移除*/ free(h);/*释放该空间*/ printf("已经删除了学号为%s的同学的成绩信息,不要忘记存盘哦!\n",n); back(); returnp; } p=lookst1(h,n);/*查找该学号的前一个节点的指针*/ if(p->next==NULL)/*判断链表中是否由该学号的学生成绩信息*/ { printf("抱歉,系统中还没有任何学生成绩信息呢!\n"); back(); }q=p->next;/*置此学号对应的指针p*/ p->next=q->next;/*将q节点从链表中移除*/ free(q);/*释放该空间*/printf("已经删除了学号为%s的同学的成绩信息,不要忘记存盘哦!\n",n); back(); returnh;}voidsave(student*h)/************存盘**************/{FILE*fp;student*p;charfilename[25];p=h; system("cls"); if(p==NULL)/*判断链表中是否有学生成绩信息*/ { printf("抱歉,系统中还没有任何学生成绩信息呢!\n"); back(); return; }printf("请输入要创建的文件名以及路径(C:\\stu.txt):\n");scanf("%s",filename);if((fp=fopen(filename,"w+"))==NULL)/*判断该文件是否能打开*/ {printf("\n无法打开文件");return; }printf("\n正在保存文件,请稍后...");while(p!=NULL)/*循环将链表中的信息格式化输入到该文件中*/ {fprintf(fp,"%10s",p->num); fprintf(fp,"%10s",p->name); fprintf(fp,"%3d",p->score[0]); fprintf(fp,"%3d",p->score[1]); fprintf(fp,"%3d",p->score[2]); fprintf(fp,"%4d",p->sum); fprintf(fp,"%6.2f\n",p->average); p=p->next; }fclose(fp);printf("保存成功!\n"); back();}voidtotal(student*h)/************统计成绩**************/{intn=0,s0=0,s1=0,s2=0; student*p=NULL; p=h;system("cls");if(p->next==NULL)/*判断链表中是否只有一名学生的成绩信息*/ { s0=p->score[0];/*接收各科成绩*/s1=p->score[1]; s2=p->score[2]; printf("━━━━━━━━━━━━━━━━━━━━\n"); printf("各门课程的学生成绩统计数据\n");printf("━━━━━━━━━━━━━━━━━━━━\n");printf("┃┃语文┃英语┃数学┃

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论