收藏 分销(赏)

表格形式的学生成绩管理系统模板.doc

上传人:w****g 文档编号:9496574 上传时间:2025-03-28 格式:DOC 页数:13 大小:40.04KB
下载 相关 举报
表格形式的学生成绩管理系统模板.doc_第1页
第1页 / 共13页
表格形式的学生成绩管理系统模板.doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述
#include "stdio.h" /*I/O函数*/ #include "stdlib.h" /*其它说明*/ #include "string.h" /*字符串函数*/ #include "conio.h" /*屏幕操作函数*/ #include "ctype.h" /*字符操作函数*/ #define N 3 /*定义常数*/ #define M 30 /*定义数据结构*/ typedef struct z1 { char no[11]; char name[15]; int score[N]; float sum; float average; int order; struct z1 *next; }STUDENT; /*菜单函数, 返回值为整数*/ menu_select() { char *menu[]={" ***************MENU***************", /*定义菜单字符串数组*/ " 1. Enter list", /*输入统计*/ " 2. Print list", /*显示单链表中全部统计*/ " 3. Sort to make new file ", /*排序*/ " 4. Insert record to list ", /*插入统计到表中*/ " 5. Delete a record from list", /*从表中删除统计*/ " 6. Save the file", /*将单链表中统计保留到文件中*/ " 7. Load the file", /*从文件中读入统计*/ " 8. Quit", /*退出*/ /*屏幕调整, 没有实际意义*/ " ***********************************",}; char s[3]; /*以字符形式保留选择号*/ int c,i; /*定义整形变量*/ textbackground(GREEN); /*设置背景颜色为黄色*/ gotoxy(1,25); /*移动光标*/ printf("Press any key enter menu......\n"); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏*/ for(i=0;i<16;i++) /*输出主菜单数组*/ { gotoxy(10,i+1); cprintf("%s",menu[i]); } window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ do { printf("\n Enter you choice(1-8):"); /*在菜单窗口外显示提醒信息*/ scanf("%s",s); /*输入选择项*/ c=atoi(s); /*将输入字符串转化为整形数*/ }while(c<0||c>9); /*选择项不在0~9之间重输*/ return c; /*返回选择项, 主程序依据该数调用对应函数*/ } /*初始化链表*/ STUDENT *init() { return NULL; } /*创建链表, 完成数据录入功效*/ STUDENT *create() { int i; int s; STUDENT *h=NULL,*info; /* STUDENT指向结构体指针*/ for(;;) { info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) /*假如指针info为空*/ { printf("\nOut of memory"); /*输出内存溢出*/ return NULL; /*返回空指针*/ } printf("Input imformation as follow.\n"); printf("Press '#'after'Enter NO'to end the input.\n"); inputs("Enter NO.:",info->no,11); /*输入学号并校验*/ if(info->no[0]=='#') break; /*假如学号首字符为#则结束输入*/ inputs("Enter name:",info->name,15); /*输入姓名, 并进行校验*/ printf("Please input %d scores \n",N); /*提醒开始输入成绩*/ s=0; /*计算每个学生总分, 初值为0*/ for(i=0;i<N;i++) /*N门课程循环N次*/ { do{ printf("score%d:",i+1); /*提醒输入第几门课程*/ scanf("%d",&info->score[i]); /*输入成绩*/ if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/ printf("Bad data,repeat input\n"); /*犯错提醒信息*/ }while(info->score[i]>100||info->score[i]<0); s=s+info->score[i]; /*累加各门课程成绩*/ } info->sum=s; /*将总分保留*/ info->average=(float)s/N; /*求出平均值*/ info->order=0; /*未排序前此值为0*/ info->next=h; /*将头结点做为新输入结点后继结点*/ h=info; /*新输入结点为新头结点*//*没排序前,后输入数据将排在最上*/ } return(h); /*返回头指针*/ } /*自定义输入控制函数inputs*/ inputs(char *prompt, char *s, int count) { char p[255]; do{printf(prompt); /*显示提醒信息*/ scanf("%s",p); /*输入字符串*/ if(strlen(p)>count)printf("\n Too long! \n"); /*进行长度校验, 超出count值重输入*/ }while(strlen(p)>count); strcpy(s,p); /*将输入字符串拷贝到字符串s中*/ } /*显示模块*/ void print(STUDENT *h) { int i=0; /* 统计统计条数*/ STUDENT *p; /*移动指针*/ clrscr(); /*清屏*/ p=h; /*初值为头指针*/ printf("\n\n\n----------------------------------STUDENT---------------------------------\n"); printf("|rec|NO. | name | english| math | computer | ave |order |\n"); printf("|---|----------|---------------|--------|------|-----------|------|------|\n"); while(p!=NULL) { i++; if(i%15==0){getch();clrscr(); printf("\n\n\n\n");} /*不然什么也不做*/ else printf("|%2d |%-10s|%-15s|%8d|%6d|%11d| %5.2f| %5d|\n", i, p->no,p->name,p->score[0],p->score[1], p->score[2],p->average,p->order); p=p->next; } printf("---------------------------------end--------------------------------------\n"); } /*排序模块*/ STUDENT *sort(STUDENT *h) { int i=0; /*用来保留名次*/ STUDENT *p,*q,*t,*h1; /*定义临时指针*/ h1=h->next; /*将原表头指针所指下一个结点作头指针*/ h->next=NULL; /*断开原来链表头结点与其它结点连接*/ while(h1!=NULL) /*当原表不为空时, 进行排序*/ { t=h1; /*取原表头结点*/ h1=h1->next; /*原表头结点指针后移*/ p=h; /*设定移动指针p, 从头指针开始*/ q=h; /*设定移动指针q做为p前驱, 初值为头指针*/ while(t->sum<p->sum&&p!=NULL) /*作总分比较*/ { q=p; /*待插入点值小, 则新表指针后移*/ p=p->next; } if(p==q) /*p==q, 上面while没有实施, 也即插入点大于头指针, 此点应排在首位*/ { t->next=p; /*待排序点后继为p*/ h=t; /*新头结点为待排序点*/ } else /*待排序点应插入在q和p之间, 如p为空则是尾部*/ { t->next=p; /*t后继是p*/ q->next=t; /*q后继是t*/ } } p=h; /*已排好序头指针赋给p*/ while(p!=NULL) /*给予各组数据排序号*/ { i++; /*结点序号*/ p->order=i; /*将名次赋值*/ p=p->next; /*指针后移*/ } printf("Sort sucess!!!\n"); /*排序成功*/ return (h); /*返回头指针*/ } STUDENT *insert(STUDENT *h) { STUDENT *p,*q,*info,*k; /*p指向插入位置, q是其前驱, info指新插入统计*/ int s1,i,n=0; printf("\nplease new record\n"); info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) { printf("\Out of memory"); /*如没有申请到, 内存溢出*/ return NULL; /*返回空指针*/ } inputs("Enter NO.:",info->no,11); /*以下是待插入数据录入和处理, 具体同创建模块同*/ inputs("Enter name:",info->name,15); printf("Please input %d score \n",N); s1=0; for(i=0;i<N;i++) { do{ printf("score%d:",i+1); scanf("%d",&info->score[i]); if(info->score[i]>100||info->score[i]<0) printf("bad data,repeat input\n"); }while(info->score[i]>100||info->score[i]<0); s1=s1+info->score[i]; } info->sum=s1; info->average=(float)s1/N; info->next=NULL; /*设后继指针为空*/ p=h; /*将指针赋值给p*/ q=h; /*将指针赋值给q*/ if(h==NULL) /*链表为空*/ {h=info;info->next=NULL;} else {while((info->sum<p->sum)&&(p->next!=NULL)) {q=p; /*使q指向p刚才结点*/ p=p->next;} /*使p后移一个结点*/ if(info->sum>=p->sum) {if(h==p){h=info; info->next=p;} /*info作为头指针, p作为info后继指针*/ else q->next=info; /*q后继指针是info*/ info->next=p;} /*info后继指针是p*/ else {p->next=info;info->next=NULL;}} /*p后继指针是info,info后继指针是空*/ k=h; while(k!=NULL) /*重新给予排序号(排序号因为被插入新数据而改变)*/ { n++; k->order=n; k=k->next; } printf("\n ----have inserted %s student----\n",info->name); return(h); /*返回头指针*/ } /*删除统计模块*/ STUDENT *delete(STUDENT *h) { char k[5]; /*定义字符串数组, 用来确定删除信息*/ STUDENT *p,*q; /*p为查找到要删除结点指针, q为其前驱指针*/ char s[11]; /*存放学号*/ clrscr(); /*清屏*/ printf("Please enter deleted No.\n"); /*显示提醒信息*/ scanf("%s",s); /*输入要删除统计学号*/ q=p=h; /*给q和p赋初值头指针*/ while(strcmp(p->no,s)&&p!=NULL) /*当统计学号不是要找, 或指针不为空时*/ { q=p; /*将p指针值赋给q作为p前驱指针*/ p=p->next; /*将p指针指向下一条统计*/ } if(p==NULL) /*假如p为空, 说明链表中没有该结点*/ printf("\nlist no %s student\n",s); else /*p不为空, 显示找到统计信息*/ { printf("----------------------------------have found---------------------------------\n"); printf("|rec|NO. | name | english| math | computer | ave |order |\n"); printf("|---|----------|---------------|--------|------|-----------|------|------|\n"); printf("| |%-10s|%-15s|%8d|%6d|%11d| %5.2f| %5d|\n", p->no,p->name,p->score[0],p->score[1],p->score[2] ,p->average,p->order); printf("---------------------------------end--------------------------------------\n"); do{inputs("Do you really want to deleted? (y/n)",k,5); }while(k[0]!='y'&&k[0]!='n'); if(k[0]!='n') /*删除确定判定*/ {if(p==h) /*假如p==h, 说明被删结点是头结点*/ h=p->next; /*修改头指针指向下一条统计*/ else q->next=p->next; /*不是头指针, 将p后继结点作为q后继结点*/ free(p); /*释放p所指结点空间*/ printf("\n have deleted No %s student\n",s); }} return(h); /*返回头指针*/ } /*保留数据到文件模块*/ void save(STUDENT *h) { FILE *fp; /*定义指向文件指针*/ STUDENT *p; /* 定义移动指针*/ char outfile[20]; /*保留输出文件名*/ printf("Enter outfile name,for example G:\\f1\\score.txt:\n"); scanf("%s",outfile); if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件, 如没有则建立*/ { printf("Can not open file\n"); exit(1); } printf("\nSaving file......\n"); /*打开文件, 提醒正在保留*/ p=h; /*移动指针从头指针开始*/ while(p!=NULL) /*如p不为空*/ { fwrite(p,sizeof(STUDENT),1,fp); /*写入一条统计*/ p=p->next; /*指针后移*/ } fclose(fp); /*关闭文件*/ printf("-----Save success!!-----\n"); /*显示保留成功*/ } /*导入信息模块*/ STUDENT *load() { STUDENT *p,*q,*h=NULL; /*定义统计指针变量*/ FILE *fp; /* 定义指向文件指针*/ char infile[20]; /*保留文件名*/ printf("Enter infile name,for example G:\\f1\\score.txt:\n"); scanf("%s",infile); /*输入文件名*/ if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件, 为读方法*/ { printf("Can not open file\n"); /*如不能打开, 返回头指针*/ return h; } printf("\n -----Loading file!-----\n"); p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!p) { printf("Out of memory!\n"); /*如没有申请到, 则内存溢出*/ return h; /*返回空头指针*/ } h=p; /*申请到空间, 将其作为头指针*/ while(!feof(fp)) /*循环读数据直到文件尾结束*/ { if(1!=fread(p,sizeof(STUDENT),1,fp)) break; /*假如没读到数据, 跳出循环*/ p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/ if(!p->next) { printf("Out of memory!\n"); /*如没有申请到, 则内存溢出*/ return h; } q=p; /*保留目前结点指针, 作为下一结点前驱*/ p=p->next; /*指针后移, 新读入数据链到目前表尾*/ } q->next=NULL; /*最终一个结点后继指针为空*/ fclose(fp); /*关闭文件*/ printf("Load success!!!\n"); return h; /*返回头指针*/ } /******主函数开始*******/ main() { int i; STUDENT *head; /*链表定义头指针*/ head=init(); /*初始化链表*/ clrscr(); /*清屏*/ while(8) /*无限循环*/ { switch(menu_select()) /*调用主菜单函数, 返回值整数作开关语句条件*/ { /*实施初始化*/ case 1:head=create();break; /*创建链表*/ case 2:print(head);break; /*显示全部统计*/ case 3:head=sort(head);break; /*排序*/ case 4:head=insert(head); break; /*插入统计*/ case 5:head=delete(head);break; /*删除统计*/ case 6:save(head);break; /*保留文件*/ case 7:head=load(); break; /*读文件*/ case 8:exit(0);break; /*如菜单返回值为9程序结束*/ } } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服