基于动态链表的学生成绩管理系统
2015-06-19 22:23
357 查看
摘要
学生综合利用本学期所学完成了学生成绩管理系统的编写,利用预处理、数据类型、自定义函数、结构体、链表、文件操作、Windows.h中某些处理等知识,在VS2012中对学生成绩管理系统进行编写,初步实现了管理员模式、来宾模式下的输入、删除、查询、修改、排序、保存、切换登陆模式、修改管理员信息、退出等功能,并且在删除、查询功能中实现按照学号或姓名操作,排序功能中实现按照学号、姓名、五门课成绩、总分进行由大到小或由小到大的排序。同时,本学生成绩管理系统初步解决了由于输入错误造成的严重后果,又以蓝底黄字及区域化布局的友好界面展示在使用者眼前。
撰写顺序
由于学生将本实验在完成实验任务的基础上做成了功能较为完整的学生信息管理系统,但考虑到代码较长(1357行),故学生通过先展示成果后附加代码的形式进行实验分析。
成果展示
图1 创建系统管理员
图一程序开始访问admin.txt文件,若无账号密码信息,则创建系统管理员,并将账号密码信息保存于admin.txt中。
图2 选择登陆方式
图2展示已经有管理员信息的情况下选择登陆方式,当输入账号密码时,与admin.txt中的信息匹配,若正确允许进入,错误,提示错误后,重新选择登录方式。
图3 管理员菜单界面
图3为管理员菜单界面,0-11分别完成相应的操作。输入错误显示错误,重新输入。
图4 学生信息输入
图4为无学生记录情况下的学生信息输入。
图5 学生信息再输入
图4为有学生记录情况下的学生信息输入。依次要求输入学号、姓名、5门科成绩。且学科成绩要求整数(依据实际情况设计),若输入错误,提示错误,重新输入直至正确。
图6 学生信息删除
图6为有学生记录时学生信息删除,按照学号或姓名两种方式删除。若无学生记录,提示无学生记录,无法删除。
图7 学生成绩查询
图7为有学生记录时学生成绩查询,通过学号或姓名进行查询。若无学生记录,提示无学生记录,不提供查询。
图8 学生信息修改
图8为有学生记录时学生信息修改,按照学号进行修改其他内容。若无学生记录,提示无学生记录,不提供修改。
图9 排序菜单
图9为排序菜单,0-14分别提供如上内容。
图10排序
图10为选择排序菜单中“4”时的排序结果。一旦进行排序,数据将保存于stu-sort.c中,而不改变原文件stu.c。
图11 保存记录
图11为有新数据写入时保存记录后的界面(因为图4后的操作,故有5名学生记录)。若无新数据写入,保存失败。
图12 显示不及格学生
图12为显示不及格学生具体信息及不及格同学总人数。
图13 显示优秀学生
图13为显示优秀学生具体信息及总人数。
图14 修改管理员信息
图14为修改管理员信息,管理员信息同样保存在admin.txt中。
图15 来宾菜单界面
图15为登陆方式选择“0”时,来宾菜单界面,0-6分别完成具体操作。
图16 退出系统若有数据未保存询问是否保存
图16 退出系统若有数据未保存询问是否保存,选择后退出整个程序。
【附件】
[源程序]
下面分别对上述知识进行总结,以帮助今后的进一步学习。
预处理:
预处理功能主要包括宏定义,文件包含,条件编译三部分。分别对应宏定义命令,文件包含命令,条件编译命令三部分实现。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
数据类型:
自定义函数:
C源程序是由函数组成的。虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。
由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。
结构体:
C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
链表:
C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
文件操作:
文件的基本概念
所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。
声明:以上详情均可见网站链接。
学生综合利用本学期所学完成了学生成绩管理系统的编写,利用预处理、数据类型、自定义函数、结构体、链表、文件操作、Windows.h中某些处理等知识,在VS2012中对学生成绩管理系统进行编写,初步实现了管理员模式、来宾模式下的输入、删除、查询、修改、排序、保存、切换登陆模式、修改管理员信息、退出等功能,并且在删除、查询功能中实现按照学号或姓名操作,排序功能中实现按照学号、姓名、五门课成绩、总分进行由大到小或由小到大的排序。同时,本学生成绩管理系统初步解决了由于输入错误造成的严重后果,又以蓝底黄字及区域化布局的友好界面展示在使用者眼前。
撰写顺序
由于学生将本实验在完成实验任务的基础上做成了功能较为完整的学生信息管理系统,但考虑到代码较长(1357行),故学生通过先展示成果后附加代码的形式进行实验分析。
成果展示
图1 创建系统管理员
图一程序开始访问admin.txt文件,若无账号密码信息,则创建系统管理员,并将账号密码信息保存于admin.txt中。
图2 选择登陆方式
图2展示已经有管理员信息的情况下选择登陆方式,当输入账号密码时,与admin.txt中的信息匹配,若正确允许进入,错误,提示错误后,重新选择登录方式。
图3 管理员菜单界面
图3为管理员菜单界面,0-11分别完成相应的操作。输入错误显示错误,重新输入。
图4 学生信息输入
图4为无学生记录情况下的学生信息输入。
图5 学生信息再输入
图4为有学生记录情况下的学生信息输入。依次要求输入学号、姓名、5门科成绩。且学科成绩要求整数(依据实际情况设计),若输入错误,提示错误,重新输入直至正确。
图6 学生信息删除
图6为有学生记录时学生信息删除,按照学号或姓名两种方式删除。若无学生记录,提示无学生记录,无法删除。
图7 学生成绩查询
图7为有学生记录时学生成绩查询,通过学号或姓名进行查询。若无学生记录,提示无学生记录,不提供查询。
图8 学生信息修改
图8为有学生记录时学生信息修改,按照学号进行修改其他内容。若无学生记录,提示无学生记录,不提供修改。
图9 排序菜单
图9为排序菜单,0-14分别提供如上内容。
图10排序
图10为选择排序菜单中“4”时的排序结果。一旦进行排序,数据将保存于stu-sort.c中,而不改变原文件stu.c。
图11 保存记录
图11为有新数据写入时保存记录后的界面(因为图4后的操作,故有5名学生记录)。若无新数据写入,保存失败。
图12 显示不及格学生
图12为显示不及格学生具体信息及不及格同学总人数。
图13 显示优秀学生
图13为显示优秀学生具体信息及总人数。
图14 修改管理员信息
图14为修改管理员信息,管理员信息同样保存在admin.txt中。
图15 来宾菜单界面
图15为登陆方式选择“0”时,来宾菜单界面,0-6分别完成具体操作。
图16 退出系统若有数据未保存询问是否保存
图16 退出系统若有数据未保存询问是否保存,选择后退出整个程序。
【附件】
[源程序]
#include <stdio.h>#include <string.h> #include <conio.h> #include <time.h> #include <stdlib.h> #define HEADER2 " **********************************************************************\n * 学号 姓名 学科1 学科2 学科3 学科4 学科5 总分 平均 *\n **********************************************************************\n" #define FORMAT " * %8s %7s %5d %5d %5d %5d %5d %5d %.2f *\n **********************************************************************\n" #define DATA p->data.num,p->data.name,p->data.grade[0],p->data.grade[1],p->data.grade[2],p->data.grade[3],p->data.grade[4],p->data.total,p->data.ave int saveflag=0; /*是否需要存盘的标志变量*/ int sortflag=0; /*是是否已经排序的标志变量*/ time_t now;/*系统时间*/ struct student { char num[20]; /*学号*/ char name[15]; /*姓名*/ int grade[5]; /*学科成绩*/ int total; /*总分*/ float ave; /*平均分*/ }; typedef struct node{ //定义每条记录或结点的数据结构 struct student data; /*数据域*/ struct node *next; /*指针域*/ }Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/ void menu() { now = time (NULL); printf(" 学生成绩管理系统 \n"); printf("\n"); printf(" *************************************************************\n"); printf(" * *\n"); printf(" * 1 输入成绩 2 删除成绩 *\n"); printf(" * *\n"); printf(" * 3 查询成绩 4 修改成绩 *\n"); printf(" * *\n"); printf(" * 5 排序成绩 6 保存记录 *\n"); printf(" * *\n"); printf(" * 7 不及格学生 8 优秀学生 *\n"); printf(" * *\n"); printf(" * 9 显示所有 0 退出系统 *\n"); printf(" * *\n"); printf(" *************************************************************\n"); printf(" * 10 切换登录模式 11 修改管理员信息 *\n"); printf(" *************************************************************\n"); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf("\n *************************************************************\n"); printf(" * 请您选择操作命令(0~11):"); /*显示提示信息*/ } void menu2(){ now = time (NULL); system("cls"); //清屏 printf("\n 来宾模式\n\n\n"); printf(" 学生成绩管理系统 \n"); printf("\n"); printf(" *************************************************************\n"); printf(" * *\n"); printf(" * 1 查询成绩 2 排序成绩 *\n"); printf(" * *\n"); printf(" * 3 不及格学生 4 优秀学生 *\n"); printf(" * *\n"); printf(" * 5 显示所有 0 退出系统 *\n"); printf(" * *\n"); printf(" *************************************************************\n"); printf(" * 6 切换登录模式 *\n"); printf(" *************************************************************\n"); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf("\n *************************************************************\n"); printf(" * 请您选择操作命令(0~6):"); /*显示提示信息*/ } void sortmenu(){ now = time (NULL); system("cls"); //清屏 printf("\n 学生成绩管理系统 \n"); printf("\n"); printf(" ****************************排序菜单*************************\n"); printf(" * *\n"); printf(" * 1 按学号从小到大 2 按学号从大到小 *\n"); printf(" * *\n"); printf(" * 3 按总分从小到大 4 按总分从大到小 *\n"); printf(" * *\n"); printf(" * 5 按学科1从小到大 6 按学科1从大到小 *\n"); printf(" * *\n"); printf(" * 7 按学科2从小到大 8 按学科2从大到小 *\n"); printf(" * *\n"); printf(" * 9 按学科3从小到大 10 按学科3从大到小 *\n"); printf(" * *\n"); printf(" * 11 按学科4从小到大 12 按学科4从大到小 *\n"); printf(" * *\n"); printf(" * 13 按学科5从小到大 14 按学科5从大到小 *\n"); printf(" * *\n"); printf(" * 0 按姓名字典序排序 *\n"); printf(" *************************************************************\n"); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf("\n *************************************************************\n"); printf(" * 请您选择操作命令(0~14):"); /*显示提示信息*/ } void printheader(){ printf(HEADER2); } /*格式化输出表头*/ void printdata(Node *pp) { Node* p; p=pp; printf(FORMAT,DATA); }/*格式化输出表中数据*/ void Wrong() { printf("\n"); printf(" *************************************************************\n"); printf(" * 错误:输入不合法!!! *\n"); printf(" *************************************************************\n"); getch(); }/*输出按键错误信息*/ void Nofind(){ /*输出未查找此学生的信息*/ printf("\n"); printf(" *************************************************************\n"); printf(" * 没有该学生!!! *\n"); printf(" *************************************************************\n"); } void Disp(Link l){ /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/ system("cls"); //清屏 Node *p; p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/ printf("\n 学生成绩管理系统 \n"); if(!p) /*p==NULL,NUll在stdlib中定义为0*/ { printf(" ***************************学生记录**************************\n"); printf(" * 无学生记录! *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); return; } printheader(); /*输出表格头部*/ while(p) /*逐条输出链表中存储的学生信息*/ { printdata(p); p=p->next; /*移动直下一个结点*/ } now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); } 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) /*按姓名查询*/ { r=l->next; while(r) { if(strcmp(r->data.name,findmess)==0) /*若找到findmess值的学生姓名*/ return r; r=r->next; } } return 0; /*若未找到,返回一个空指针*/ } void failStu(Link l) { Node *r; int q,sum=0; system("cls"); now = time (NULL); printf("\n 学生成绩管理系统 \n"); printheader(); r=l->next; while(r) { int i; q=0; for(i=0;i<5;i++) if(r->data.grade[i]<60) { q=1; break; } if(q) { printdata(r); } sum+=q; r=r->next; } if(sum) printf(" * 共有%d名学生不及格 *\n",sum); else printf(" * good,没有同学不及格 *\n",sum); printf(" **********************************************************************\n"); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); getchar(); } void prefectStu(Link l) { Node *r; int q,sum=0; system("cls"); now = time (NULL); printf("\n 学生成绩管理系统 \n"); printheader(); r=l->next; while(r) { int i; q=0; for(i=0;i<5;i++) if(r->data.grade[i]>=90) { q=1; break; } if(q) { printdata(r); } sum+=q; r=r->next; } if(sum) printf(" * 共有%d名学生优秀 *\n",sum); else printf(" * poor,没有同学是优秀的 *\n",sum); printf(" **********************************************************************\n"); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); getchar(); } void stringinput(char *t,int lens,char *notice){/*输入字符串信息*/ char n[255]; do { printf(notice); /*显示提示信息*/ scanf("%s",n); /*输入字符串*/ if(strlen(n)>lens) /*进行长度校验,超过lens值重新输入*/ { printf("\n"); printf(" *************************************************************\n"); printf(" * 超出长度!!! *\n"); printf(" *************************************************************\n"); } }while(strlen(n)>lens); strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/ } int numberinput(char *notice){/*输入分数信息*/ int t=0; do { printf(notice); /*显示提示信息*/ scanf("%d",&t); /*输入分数*/ if(t>100 || t<0) //分数校验 { printf("\n"); printf(" *************************************************************\n"); printf(" * 分数必须在0~100之间!!! *\n"); printf(" *************************************************************\n"); } }while(t>100 || t<0); return t; } void Add(Link l){/*在表尾添加学生信息*/ Node *p,*r,*s; int i; char ch,flag=0,num[10]; r=l; system("cls"); Disp(l); /*先打印出已有的学生信息*/ while(r->next!=NULL) r=r->next; /*将指针移至于链表最末尾,准备添加记录*/ while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/ { s=l->next; while(1) { printf(" **********************************************************************\n"); stringinput(num,10," * 学号(按0退出):"); /*格式化输入学号并检验*/ flag=0; if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ return ; s=l->next; while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/ { if(strcmp(s->data.num,num)==0) { flag=1; break; } s=s->next; } if(flag==1) /*提示用户是否重新输入*/ { getchar(); printf(" **********************************************************************\n"); printf(" * 学号%s已存在,是否重新输入?(y/n)\a",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return ; } else break; } p=(Node *)malloc(sizeof(Node)); strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/ printf(" **********************************************************************\n"); stringinput(p->data.name,15," * Name:"); printf(" **********************************************************************\n"); p->data.grade[0]=numberinput(" * 学科1[0-100]:"); printf(" **********************************************************************\n"); p->data.grade[1]=numberinput(" * 学科2[0-100]:"); printf(" **********************************************************************\n"); p->data.grade[2]=numberinput(" * 学科3[0-100]:"); printf(" **********************************************************************\n"); p->data.grade[3]=numberinput(" * 学科4[0-100]:"); printf(" **********************************************************************\n"); p->data.grade[4]=numberinput(" * 学科5[0-100]:"); printf(" **********************************************************************\n"); for(i=0,p->data.total=0;i<5;i++) p->data.total+=p->data.grade[i]; /*计算总分*/ p->data.ave=(float)(p->data.total*1.0/5); /*计算平均分*/ p->next=NULL; while(r->next!=NULL) r=r->next; r->next=p; saveflag=1; } } void Qur(Link l){ /*按学号或姓名,查询学生记录*/ system("cls"); int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/ char searchinput[20]; /*保存用户输入的查询内容*/ Node *p; if(!l->next) /*若链表为空*/ { printf("\n 学生成绩管理系统 \n\n"); printf(" ***************************查询成绩**************************\n"); printf(" * 暂无学生记录,查询失败 *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); getchar(); return; } printf("\n 学生成绩管理系统 \n\n"); printf(" ***************************查询成绩**************************\n"); printf(" * *\n"); printf(" * 1 通过学号查找 2 通过姓名查找 *\n"); printf(" * *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf("\n"); printf(" *************************************************************\n"); printf(" * 请选择[1,2]:"); scanf("%d",&select); if(select==1) /*按学号查询*/ { stringinput(searchinput,10," * 请输入要查找的学号:"); p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/ if(p) /*若p!=NULL*/ { printheader(); printdata(p); printf(" *************************************************************\n"); } else Nofind(); } else if(select==2) /*按姓名查询*/ { stringinput(searchinput,15," * 请输入学生姓名:"); p=Locate(l,searchinput,"name"); if(p) { printheader(); printdata(p); printf(" *************************************************************\n"); } else Nofind(); } else Wrong(); system("PAUSE"); } void Del(Link l){//删除学生记录:先找到保存该学生记录的节点,然后删除该节点 int sel; Node *p,*r; char findmess[20]; if(!l->next) { system("cls"); printf("\n"); printf(" 学生成绩管理系统 \n"); printf("\n"); printf(" *************************************************************\n"); printf(" * 暂无学生记录!!! *\n"); printf(" *************************************************************\n"); getch(); return; } system("cls"); Disp(l); printf(" *************************************************************\n"); printf(" * 1 通过学号删除 2 通过姓名删除 *\n"); printf(" * 请选择[1,2]:"); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10," * 请输入学号:"); p=Locate(l,findmess,"num"); if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next; free(p); /*释放内存空间*/ printf(" *************************************************************\n"); printf(" * 删除成功!!! *\n"); printf(" *************************************************************\n"); saveflag=1; } else Nofind(); } else if(sel==2) /*先按姓名查询到该记录所在的节点*/ { stringinput(findmess,15," * 请输入学生姓名:"); p=Locate(l,findmess,"name"); if(p) { r=l; while(r->next!=p) r=r->next; r->next=p->next; free(p); printf(" *************************************************************\n"); printf(" * 删除成功!!! *\n"); printf(" *************************************************************\n"); saveflag=1; } else Nofind(); } else Wrong(); getchar(); } void Modify(Link l){//修改学生记录.先按输入的学号查询到该记录,然后提示用户修改学号之外的值,学号不能修改 Node *p; int i; char findmess[20]; if(!l->next) { system("cls"); printf("\n 学生成绩管理系统 \n\n"); printf(" *************************************************************\n"); printf(" * 没有学生记录!!! *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); getchar(); return; } system("cls"); printf("修改学生记录"); Disp(l); printf(" **********************************************************************\n"); stringinput(findmess,10," * 请输入学号:"); /*输入并检验该学号*/ printf(" **********************************************************************\n"); p=Locate(l,findmess,"num"); /*查询到该节点*/ if(p) /*若p!=NULL,表明已经找到该节点*/ { printf(" * 学号:%s\n",p->data.num); printf(" * 姓名:%s *\n",p->data.name); stringinput(p->data.name,15," * 输入新姓名:"); printf(" * 学科1:%d *\n",p->data.grade[0]); p->data.grade[0]=numberinput(" * 学科1[0-100]:"); printf(" * 学科2:%d *\n",p->data.grade[1]); p->data.grade[1]=numberinput(" * 学科2[0-100]:"); printf(" * 学科3:%d *\n",p->data.grade[2]); p->data.grade[2]=numberinput(" * 学科3[0-100]:"); printf(" * 学科4:%d *\n",p->data.grade[3]); p->data.grade[3]=numberinput(" * 学科4[0-100]:"); printf(" * 学科5:%d *\n",p->data.grade[4]); p->data.grade[4]=numberinput(" * 学科5[0-100]:"); for(i=0,p->data.total=0;i<5;i++) p->data.total+=p->data.grade[i]; /*计算总分*/ p->data.ave=(float)(p->data.total*1.0/5); printf(" **********************************************************************\n"); printf(" * 修改成功!!! *\n"); printf(" **********************************************************************\n%"); getchar(); saveflag=1; } else Nofind(); getchar(); } void Sort(Link l){ system("cls"); Link ll; Node *p,*rr,*s; int i=0,select; if(l->next==NULL) { printf("\n 学生成绩管理系统 \n"); printf(" *************************************************************\n"); printf(" * 暂无学生记录!请输入学生记录后再进行排序 *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); getchar(); getchar(); return ; } sortmenu(); scanf("%d",&select); printf(" *************************************************************\n"); switch(select) { case 1:/*按学号从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.num<p->data.num) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 2:/*按学号从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.num>=p->data.num) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 3:/*按总分从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.total<p->data.total) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 4:/*按总分从大到小*/ { ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/ ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); /*显示排序前的所有学生记录*/ // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/ s->data=p->data; /*填数据域*/ s->next=NULL; /*指针域为空*/ rr=ll; /*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/ while(rr->next!=NULL && rr->next->data.total>=p->data.total) { rr=rr->next; } /*指针移至总分比p所指的节点的总分小的节点位置*/ if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total大时,就将p所指节点加入链表尾部*/ rr->next=s; else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/ { s->next=rr->next; rr->next=s; } p=p->next; /*原链表中的指针下移一个节点*/ } l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/ p=l->next; /*已排好序的头指针赋给p,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ { i++; /*结点序号*/ p=p->next; /*指针后移*/ } break; } case 5:/*按学科1从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[0]<p->data.grade[0]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 6:/*按学科1从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[0]>=p->data.grade[0]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 7:/*按学科2从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[1]<p->data.grade[1]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 8:/*按学科2从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[1]>=p->data.grade[1]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 9:/*按学科3从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[2]<p->data.grade[2]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 10:/*按学科3从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[2]>=p->data.grade[2]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 11:/*按学科4从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[3]<p->data.grade[3]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 12:/*/*按学科4从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[3]>=p->data.grade[3]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; /*增加学生记录*/ } case 13:/*按学科5从小到大*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[4]<p->data.grade[4]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 14:/*按学科5从大到小*/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.grade[4]>=p->data.grade[4]) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } case 0:/**/ { ll=(Node*)malloc(sizeof(Node)); ll->next=NULL; printf("当前状态:\n"); // puts("错误不在这!"); Disp(l); // system("PAUSE"); p=l->next; while(p) /*p!=NULL*/ { s=(Node*)malloc(sizeof(Node)); s->data=p->data; s->next=NULL; rr=ll; while(rr->next!=NULL && rr->next->data.name>=p->data.name) { rr=rr->next; } if(rr->next==NULL) rr->next=s; else { s->next=rr->next; rr->next=s; } p=p->next; } l->next=ll->next; p=l->next; while(p!=NULL) { i++; p=p->next; } break; } default: Wrong();getch();break; /*按键有误,必须为数值0-9*/ } printf("\n*********************************************\n"); // puts("错误不在这!"); Disp(l); saveflag=1; printf(" **********************************************************************\n"); printf(" * 排序完成!!! *\n"); printf(" **********************************************************************\n"); sortflag=1; system("PAUSE"); } void Save(Link l){ //数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘 FILE* fp1, *fp2; Node *p; int count=0; fp1=fopen("stu.c","w+");/*以只写方式打开二进制文件*/ fp2=fopen("stu-sort.c","w+");/*以只写方式打开二进制文件*/ if(sortflag==0) { p=l->next; while(p) { if(fwrite(p,sizeof(Node),1,fp1)==1) { p=p->next; count++; } else break; } if(count>0) { printf("\n\n\n\n\n"); printf(" *************************************************************\n"); printf(" * 保存完毕,当前有%d名学生记录 *\n",count); printf(" *************************************************************\n"); saveflag=0; } else printf("空文件,保存失败!!\n"); fclose(fp1); //关闭此文件 getch(); } else { p=l->next; while(p) { if(fwrite(p,sizeof(Node),1,fp2)==1) { p=p->next; count++; } else break; } if(count>0) { printf("\n\n\n\n\n 保存完毕,当前有%d名学生记录\n",count); saveflag=0; } else printf("空文件,保存失败!!\n"); fclose(fp2); //关闭此文件 getch(); sortflag=0; } } int login(){ FILE *fp1,*fp2; int state; char str1[20],str2[20],str_z[20],str_m[20]; if((fp1=fopen("admin.txt","rb"))==NULL) { printf("\n 学生成绩管理系统 \n\n"); printf(" *************************创建管理员账号**********************\n"); printf(" * 本系统无管理员,请创建! *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf(" *************************************************************\n"); printf(" * 请输入管理员账号:"); scanf("%s",str_z); printf(" * 请输入密码: "); scanf("%s",str_m); printf(" *************************************************************\n"); fp2=fopen("admin.txt","wb"); fprintf(fp2,"%s%c",str_z,'\n'); fprintf(fp2,"%s%c",str_m,' '); fclose(fp2); } fp1=fopen("admin.txt","rb"); fscanf(fp1,"%s",str1); fscanf(fp1,"%s",str2); fclose(fp1); while(1) { system("cls"); printf("\n 学生成绩管理系统 \n\n"); printf(" ****************************登录方式*************************\n"); printf(" * *\n"); printf(" * 1.管理员模式 0.来宾模式 *\n"); printf(" * *\n"); printf(" *************************************************************\n"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); printf(" *************************************************************\n"); printf(" * 请你选择(0-1):"); scanf("%d",&state); printf(" *************************************************************\n"); if(state==0) return 0; else if(state==1) { printf("\n *************************************************************\n"); printf(" * 请输入账号:"); scanf("%s",str_z); printf(" * 请输入密码:"); scanf("%s",str_m); printf(" *************************************************************\n"); if(strcmp(str1,str_z)==0&&strcmp(str2,str_m)==0) { getchar(); getchar(); return 1; } else { printf(" *************************************************************\n"); printf(" * 账号或密码错误!!! *\n"); printf(" *************************************************************\n"); system("PAUSE"); system("cls"); } } else { printf(" *************************************************************\n"); printf(" * 输入不合法!!! *\a \n"); printf(" *************************************************************\n"); system("PAUSE"); system("cls"); } } } void Modify_admin(){ FILE *fp; char str_z[20],str_m[20]; fp=fopen("admin.txt","wb"); printf(" *************************************************************\n"); printf(" * 请输入管理员账号:"); scanf("%s",str_z); printf(" * 请输入密码: "); scanf("%s",str_m); printf(" *************************************************************\n"); fprintf(fp,"%s%c",str_z,'\n'); fprintf(fp,"%s%c",str_m,' '); fclose(fp); printf("\n *************************************************************\n"); printf(" * 管理员信息更新完毕!!! *\a\n"); printf(" *************************************************************\n"); getch(); } int main(){ system("color 9e");//主屏函数*** Link L; /*定义链表*/ FILE *fp,*fp1; /*文件指针*/ int select,State=0; /*保存选择结果变量*/ char ch,admin[20],admin_p[20]; /*保存(y,Y,n,N)*/ int count=0; /*保存文件中的记录条数(或结点个数)*/ Node *p,*r; /*定义记录指针变量*/ L=(Node*)malloc(sizeof(Node)); L->next=NULL; r=L; fp=fopen("stu.c","ab+"); fp1=fopen("stu-sort.c","ab+"); Loop:{ State=login(); } while(!feof(fp)) { p=(Node*)malloc(sizeof(Node)); if(fread(p,sizeof(Node),1,fp)==1) /*一次从文件中读取一条学生成绩记录*/ { p->next=NULL; r->next=p; r=p; /*r指针向后移一个位置*/ count++; } } fclose(fp); /*关闭文件*/ if(State==1) { while(1) { system("cls"); printf("\n 管理员模式\n\n\n"); menu(); p=r; scanf("%d",&select); printf(" *************************************************************\n"); if(select==0) { if(saveflag==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ { getchar(); printf(" *************************************************************\n"); printf(" * 记录已修改,是否保存当前记录?(y/n):"); scanf("%c",&ch); printf(" *************************************************************\n"); if(ch=='y'||ch=='Y') Save(L); } printf(" *************************************************************\n"); printf(" * 谢谢您的使用!!! *\n"); printf(" *************************************************************\n"); break; } switch(select) { case 1:Add(L);break; /*增加学生记录*/ case 2:Del(L);break; /*删除学生记录*/ case 3:Qur(L);break; /*查询学生记录*/ case 4:Modify(L);break; /*修改学生记录*/ case 5:Sort(L);break; /*排序学生记录*/ case 6:Save(L);break; /*保存学生记录*/ case 7:failStu(L);break; /*不及格学生记录*/ case 8:prefectStu(L);break; /*优秀学生记录*/ case 9:Disp(L);system("PAUSE");break; /*显示学生记录*/ case 10:system("cls");goto Loop; case 11:Modify_admin();break; default: Wrong();getch();break; /*按键有误,必须为数值0-9*/ } } } else { while(1) { system("cls"); now = time (NULL); printf(" Made by ChengXiang, now time is %s\n",ctime(&now)); menu2(); scanf("%d",&select); printf(" *************************************************************\n"); if(select==0) { printf(" *************************************************************\n"); printf(" * 谢谢您的使用!!! *\n"); printf(" *************************************************************\n"); exit(1); } switch(select) { case 1:Qur(L);break; /*查询学生记录*/ case 2:Sort(L);break; /*排序学生记录*/ case 3:failStu(L);break; /*不及格学生记录*/ case 4:prefectStu(L);break; /*优秀学生记录*/ case 5:Disp(L);system("PAUSE");break; /*显示学生记录*/ case 6:system("cls");goto Loop; default: Wrong();getch();break; /*按键有误,必须为数值0-9*/ } } } return 0; }
下面分别对上述知识进行总结,以帮助今后的进一步学习。
预处理:
预处理功能主要包括宏定义,文件包含,条件编译三部分。分别对应宏定义命令,文件包含命令,条件编译命令三部分实现。
预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。
预处理指令是以#号开头的代码行。#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。
数据类型:
自定义函数:
C源程序是由函数组成的。虽然在C语言入门系列前面几篇的程序中大都只有一个主函数main(),但实用程序往往由多个函数组成。函数是C源程序的基本模块,通过对函数模块的调用实现特定的功能。C语言中的函数相当于其它高级语言的子程序。C语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由各式各样的函数完成的,所以也把C语言称为函数式语言。
由于采用了函数模块式的结构,C语言易于实现结构化程序设计。使程序的层次结构清晰,便于程序的编写、阅读、调试。
结构体:
C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
链表:
C语言中,结构体是一种很常用的数据类型。简单而又复杂,能够用好它实属不易。下面总结下它的常见用法及容易出错的地方。
文件操作:
文件的基本概念
所谓“文件”是指一组相关数据的有序集合。 这个数据集有一个名称,叫做文件名。 实际上在前面的各章中我们已经多次使用了文件,例如源程序文件、目标文件、可执行文件、库文件 (头文件)等。文件通常是驻留在外部介质(如磁盘等)上的, 在使用时才调入内存中来。从不同的角度可对文件作不同的分类。从用户的角度看,文件可分为普通文件和设备文件两种。
声明:以上详情均可见网站链接。
相关文章推荐
- 我在 超级课程表 实习的那个月
- iOS 在一个应用程序中调另一个应用程序
- 做了一个个人网站
- Hibernate实体关系映射——双边的多对多关系
- HDU 4864 Task 贪心 好题
- Redis3.0 集群
- iOS-学习笔记-UI-第十五天
- 集线器(HUB),交换机(Switch),路由器(Route)
- 【麦可网】Cocos2d-X跨平台游戏开发学习笔记---第五课:Hello World
- 面试题
- iOS-学习笔记-UI-第十四天
- iOS-学习笔记-UI-第十三天
- 2015061906 - firebug安装和下载(2)
- Bootstrap系列 -- 8. 代码显示
- iOS-学习笔记-UI-第十二天
- u Calculate e
- C语言连接MySQL数据库
- u Calculate e 分类: HDU 2015-06-19 22:18 14人阅读 评论(0) 收藏
- 让你的Git水平更上一层楼的10个小贴士
- Redis 2.8 架构分析