C语言学生成绩管理系统课程设计报告.doc
. .设计一个学生成绩管理系统,对上学期的本班的学习成绩进展管理,具有查询和检索功能,并且能够对指定文件操作,也可将多个文件组成一个文件。A、 设计容1、每一条记录包括一个学生的学号、XX、性别、各门课成绩上学期的科目、平均成绩。2、输入功能:可以一次完成假设干条记录的输入。3、显示功能:完成全部学生记录的显示。4、查找功能:完成按XX或学号查找学生记录,并显示。5、排序功能:按学生平均成绩进展排序。6、插入功能:按学号顺序插入一条学生记录。7、将学生记录存在文件student.dat中。8、应提供一个界面来调用各个功能,调用界面和各个功能的操作界面应尽可能清晰美观!B、设计要求一、 有存储本班学生记录包括学号、XX、科目成绩、性别、的文件student.dat,所有学生以学号从小到大排序该文件自行建立。要求编程序实现查询、排序、插入、删除诸功能。具体要求如下:A要求显示如下界面*1-查询2-排序3-插入4-删除*通过选择1-4来确定要做哪一个操作。B假设选1,那么出现如下界面*1.1-按学号查询1.2-按XX查询1.3-按成绩查询*通过选择1.1-1.3来确定要做哪一个操作,其中:按XX查询用顺序法实现;按成绩查询实现查询成绩小于m分的学生;找到该生将学生记录输出到屏幕,假设查无此人,输出相关信息。C假设选2,那么按成绩从大到小排序,XX,学号顺序也随之调整。D假设选3,将一个新学生记录按学号顺序插入,并把结果保存到文件student.dat中。E假设选4,删除指定学生的记录,并把结果保存到文件student.dat中。G不同的模块都要有出错处理,并能给出出错提示。如输入数据错误,文件操作错误等等F以上各个功能均编写成子函数,由主函数调用实现。G利用构造体数组实现学生成绩的数据构造设计;模块:学生成绩管理系统查询模块排序模块显示模块保存模块删除模块插入模块完毕显示返回插入返回选择返回保存返回按学号查询按学号选择删除按XX选择删除返回主菜单按XX查询按成绩查询排序返回数学平均分英语C语言安康教育返回计算机历史程序构造图:main:int flag=1;struct student *head=NULL;head=load();Doswitch(menu()case '0':flag=0;break;case '1':search(head);break;case '2':sort(head);break;case '3':head=NULL?head=insert(head):insert(head); save(head); break;case '4':head=delete(head);save(head);break;case '5':save(head);printf("It's saved!");getch();break;case '6':clrscr();formhead();print(head);break;while(flag)frees(head);int menu();char ch;textmode(C80);textbackground(BLUE);textcolor(YELLOW);clrscr();gotoxy(20,3);cprintf("Students' performance management system");gotoxy(20,6);cprintf("*");gotoxy(30,8); cprintf("1-Search;");gotoxy(30,10); cprintf("2-Sort;");gotoxy(30,12); cprintf("3-Insert;");gotoxy(30,14); cprintf("4-Delete;");gotoxy(30,16); cprintf("5-Save in file;");gotoxy(30,18); cprintf("6-Display;");gotoxy(30,20); cprintf("0-Exit;");gotoxy(20,22); cprintf("*");gotoxy(1,25); cprintf("please press the number you choose:");ch=getchar();return ch;int menu2();char ch;textmode(C80);textbackground(BLUE);textcolor(YELLOW);clrscr();gotoxy(34,5); cprintf("Query menu");gotoxy(20,8); cprintf("*");gotoxy(25,10); cprintf("1-search by ID number;");gotoxy(25,12); cprintf("2-search by name;");gotoxy(25,14); cprintf("3-search by score;");gotoxy(25,16); cprintf("0-Return to main menu;");gotoxy(20,20); cprintf("*");gotoxy(1,25); cprintf("please press the number you choose:");ch=getchar();return ch;int menu3();char ch;textmode(C80);textbackground(BLUE);textcolor(YELLOW);clrscr();clrscr();gotoxy(20,3); cprintf("Enter the number of subjects to check");gotoxy(20,6); cprintf("*");gotoxy(25,8);cprintf("1-Math;");gotoxy(25,9); cprintf("2-English;");gotoxy(25,10); cprintf("3-C Program;");gotoxy(25,11);cprintf("4-puter;");gotoxy(25,12);cprintf("5-Health Education;");gotoxy(25,13);cprintf("6-History;");gotoxy(25,14);cprintf("7-average;");gotoxy(25,15);cprintf("0-Return to previous menu;");gotoxy(20,18); cprintf("*");gotoxy(1,25); cprintf("please press the number you choose:");ch=getchar();return ch;void search(struct student *head);int flag=1; while(flag)switch(menu2()case 49:search1(head);break;case 50:search2(head);break;case 51:search3(head);break;case 48:flag=0;break;void search1(struct student *);struct student *p;int none=1;char number11;p=head;clrscr();printf("please in put a student's number:");scanf("%s",number); 直到确认printf("Search results:n");formhead(); while(p!=0)NY (strcmp(p->num,number)=0?putout(p);none=0;p=p->next;NYNone=0?printf("ncan not find the data!") printf("npress any key to return.");getch();void search2(struct student *);int none=1; char name11;struct student *p;p=head;clrscr();printf("please in put a student's name:");scanf("%s",name);直到确认clrscr();printf("Search results:n");formhead();while(p!=NULL)NYstrcmp(p->name,name)=0?putout(p);none=0;p=p->next;YNnone=0?printf("ncan not find the data!");printf("npress any key to return.");getch();void search3(struct student *);p1=head;m=menu3() 直到0<=m<=6clrscr();printf("Please enter a highest score:n");scanf("%f",&high); 直到确认clrscr();printf("Search results:n");formhead(); switch(m)1while(p1!=0)NYp1->math-high<0.0?putout(p1);none=0;p1=p1->next;YNNone=0?printf("ncan not find the data!")printf("npress any key to return.");getch();break;2与1同理3与1同理4与1同理5与1同理6与1同理7与1同理struct student *sort(struct student *);struct student *p1,*p2,*t,*temp;temp=head->next;head->next=NULL;while(temp!=NULL)t=temp;temp=temp->next;p1=head; p2=head; while(t->aver<p1->aver&&p1!=NULL)p2=p1;p1=p1->next;NYp1=p2?t->next=p1;t->next=p1;p2->next=t;head=t;p1=head;while(p1!=NULL)p1=p1->next;clrscr();formhead();print(head);return(head);struct student *insert(struct student *);struct student *p,*q,*hed;hed=head;p=creat(); /*建链表*/q=findw(head); /*找出传进来链表的表尾*/NYq=NULL?q->next=p;return hed=NULL?p:hed;void input(struct student *);float temp;char c;clrscr();printf("input the student's number:");scanf("%s",p->num); 直到确认printf("ninput the student's name:");scanf("%s",p->name);while(!sure(); 直到确认c=getchar();p->sex=c>'a'?c-32:c; 直到(p->sex='M'|p->sex='W')printf("input the student's Math score:scanf("%f",&temp); 直到确认p->math=temp;下面成绩同理void putout(struct student *);printf("n|%-10s|%-10s| %c |%-6.1f|%-6.1f|%-6.1f|%-6.1f|%-6.1f|%-6.1f|%-6.1f|", p->num,p->name,p->sex,p->math,p->english,p->cp,p->puter,p->hthy,p->history,p->aver);printf("n+-+-+-+-+-+-+-+-+-+-+");void print(struct student *);struct student *p;p=head;YNp!=NULLputout(p);p=p->next;printf("It'sa empty list!n"); 直到p为空getch();int sure();har c;getchar();printf("Press any key if you are sure but 'Esc':");c=getch();YNc=27return 1;return 0;void frees( struct student *);struct student *p;p=head;while(p!=0)free(p);p=p->next;head=NULL;struct student *creat(void);char c;struct student *p1,*p2,*head;int n=0,flag=1;p1=p2=(struct student *)malloc(LEN);head=NULL; input(p1);while(flag) n=n+1;n=1?head=p1:p2->next=p1;p2=p1;if(flag=1) printf("ncontinue or not?(Y/N):");if(flag=2) printf("npress 'Y'('y') or 'N'('n') only:");c=getch();YN(c='N'|c='n'|c='Y'|c='y')?flag=2;NYc='Y'|c='y'?flag=0;p1=(struct student *)malloc(sizeof(struct student);input(p1);flag=1;p2->next=NULL;return (head);struct student *load(void);struct student *p1,*p2,*head=NULL;FILE *fp;YNfp=fopen("student.dat","rb")=NULLprintf("fail to open the file!n");return (0);printf("loading.n");p1=(struct student *)malloc(LEN);YN!p1?printf("out of memory!ngetch();return(0);head=p1while(!feof(fp)NYfread(p1,LEN,1,fp)!=1?break;p1->next=(struct student *)malloc(LEN);NY!p1->next/printf("Out of memory!n");return (head);p2=p1; p1=p1->next;p2->next=NULL;fclose(fp);return (head);void save(struct student *);FILE *fp;struct student *p;Nfp=fopen("student.dat","wb")=NULL?Yprintf("fail to open the file!n");getch();return;p=head;while(p!=NULL)fwrite(p,LEN,1,fp);p=p->next;fclose(fp);struct student *findw(struct student *);struct student *p;p=head;Np=NULL? Yreturn p;while(p->next!=NULL)p=p->next;return (p);struct student *delete(struct student *);char del11;char x;int none=1; struct student *p1,*_del;p1=_del=head;Np1=NULL? Yclrscr();printf("there is no data!press any key to back.");getch();return 0;clrscr();printf("nnnnnnnnnnnn 1-By Student Number to delete;");printf("nn 2-By Student Name to delete;");printf("nn 0-cancel;n");printf("nnnnnnnnnPlease enter you choice:"); x=getchar(); 直到输入正确if(x='0')return head;if(x='1')clrscr();printf("enter number gonna Del:");scanf("%s",del); 直到确认while(_del=p1&&_del!=NULL)N(strcmp(_del->num,del)=0) Yelse _del=p1->next;none=0; clrscr();printf("delete this data? Cancel by 'Esc:'")formhead();putout(_del);Ngetch()=27 Yp1=_del->next;_del=p1->next;free(_del);del=p1;printf("nDelete successfully!");getch();head=p1;while(_del!=0)Nstrcmp(_del->num,del)=0 Yp1=p1->next;_del=_del->next;none=0; clrscr();printf("ndelete this data? Cancel by 'Esc':");formhead();putout(_del);Ngetch()=27? Yp1->next=_del->next; p1=p1->next;free(_del);_del=_del->next;_del=p1->next; printf("nDelete successfully!");getch();N!none? Yprintf("Can not find the data.");printf("nNo more data.");getch();getch();if(x='2') 同x=1程序代码:#include "stdio.h" /*标准输入输出函数库*/#include "stdlib.h" /*标准函数库*/#include "string.h" /*字符串函数库*/#include "conio.h" /*屏幕操作函数库*/#define HEADER1 " -学生- n"#define HEADER2 " | 学号 | XX |C语言|数学|英语 | 总分 | 平均分 |排名 | n"#define HEADER3 " |-|-|-|-|-|-|-|-| "#define FORMAT " | %-10s |%-15s|%4d|%4d|%4d| %4d | %.2f |%4d |n"#define DATA p->data.num,p->data.name,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.total,p->data.ave,p->data.mingci#define END " - n"int saveflag=0; /*是否需要存盘的标志变量*/*定义与学生有关的数据构造*/typedef struct student /*标记为student*/char num10; /*学号*/char name15; /*XX*/int cgrade; /*C语言成绩*/int mgrade; /*数学成绩*/int egrade; /*英语成绩*/int total; /*总分*/float ave; /*平均分*/int mingci; /*名次*/;/*定义每条记录或结点的数据构造,标记为:node*/typedef struct nodestruct student data; /*数据域*/struct node *next; /*指针域*/Node,*Link; /*Node为node类型的构造变量,*Link为node类型的指针变量*/void menu() /*主菜单*/system("cls"); /*调用DOS命令,清屏.与clrscr()功能一样*/textcolor(10); /*在文本模式中选择新的字符颜色*/gotoxy(10,5); /*在文本窗口中设置光标*/printf(" 学生成绩管理系统 n");/gotoxy(10,8);printf(" *Menu*n");/gotoxy(10,9);printf(" * 1 输入数据 2 删除数据 *n");/gotoxy(10,10);printf(" * 3 查询数据 4 修改数据 *n");/gotoxy(10,11);printf(" * 5 插入数据 6 统计数据 *n");/gotoxy(10,12);printf(" * 7 数据排序 8 保存数据 *n");/gotoxy(10,13);printf(" * 9 显示数据 0 退出系统 *n");/gotoxy(10,14);printf(" *n");/*cprintf()送格式化输出至文本窗口屏幕中*/void printheader() /*格式化输出表头*/ printf(HEADER1); printf(HEADER2); printf(HEADER3);void printdata(Node *pp) /*格式化输出表中数据*/ Node* p; p=pp; printf(FORMAT,DATA);void Wrong() /*输出按键错误信息*/printf("nnnnn*错误:输入有错! 按任意键继续*n");getchar();void Nofind() /*输出未查找此学生的信息*/printf("n=>没找到该学生!n");void Disp(Link l) /*显示单链表l中存储的学生记录,容为student构造中定义的容*/Node *p;p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/if(!p) /*p=NULL,NUll在stdlib中定义为0*/ printf("n=>没该学生记录!n"); getchar(); return;printf("nn");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) /*按学号查询*/ r=l->next; while(r) if(strcmp(r->data.num,findmess)=0) /*假设找到findmess值的学号*/ return r; r=r->next; else if(strcmp(nameornum,"name")=0) /*按XX查询*/ r=l->next; while(r) if(strcmp(r->data.name,findmess)=0) /*假设找到findmess值的学生XX*/ return r; r=r->next; return 0; /*假设未找到,返回一个空指针*/*输入字符串,并进展长度验证(长度<lens)*/void stringinput(char *t,int lens,char *notice) char n255; do printf(notice); /*显示提示信息*/ scanf("%s",n); /*输入字符串*/ if(strlen(n)>lens)printf("n 超过这必需的长度! n"); /*进展长度校验,超过lens值重新输入*/ while(strlen(n)>lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/*输入分数,0<分数<100)*/int numberinput(char *notice) int t=0; do printf(notice); /*显示提示信息*/ scanf("%d",&t); /*输入分数*/ if(t>100 | t<0) printf("n 分数必须在 0,100! n"); /*进展分数校验*/ while(t>100 | t<0); return t; /*增加学生记录*/void Add(Link l)Node *p,*r,*s; /*实现添加操作的临时的构造体指针变量*/char ch,flag=0,num10;r=l;s=l->next;system("cls");Disp(l); /*先打印出已有的学生信息*/while(r->next!=NULL) r=r->next; /*将指针移至于链表最末尾,准备添加记录*/while(1) /*一次可输入多条记录,直至输入学号为0的