#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char password[20]="0307102324"; /*初始化密码*/
typedef struct stu
{
char num[20];
char name[20];
char sex;
int score[3];
float sum,averge;
struct stu *next;
}StuNode,*student;
typedef struct
{
StuNode *front,*rear;
}Point; /*将头尾指针封装在一起,分别指向链表的头部和尾部*/
static int first=0,total=0; /*初始化化后first=1,没初始化无法进行添加学生信息等操作,每增加一个学生数据,total就加1*/
/*算法较多,以下函数声明,方便找算法*/
void Main_Menu(); /*主菜单*/
Point * Create_Stu(); /*初始化*/
Point * Add_Stu(); /*添加学生记录*/
Point * Del_Stu(); /*删除指定学生记录*/
Point * AddOrDel(); /*调用 添加 和 删除 学生记录的算法*/
Point * Input_Score(); /*添加学生的成绩*/
void Menu_For_View(); /*按要求查看记录 菜单*/
Point * D_InsertSortByNum(); /*按 学号 进行升序排序*/
void D_InsertSortByScore(); /*按 学科分数 进行升降排序*/
void D_InsertSortBySum(); /*按 总分 进行升降排序*/
void View(); /*调用 学号,学科分数,总分 排序查看的算法*/
void Menu_For_Search(); /*按要求搜索记录 菜单*/
void SearchByNum(); /*按指定学号搜索*/
void SearchByScore(); /*按指定学科分数段搜索*/
void SearchBySum(); /*按总分数段搜索*/
void Search(); /*调用 指定学号,指定学科分数,总分数 搜索的算法*/
void averge_score(); /*统计班级平均成绩*/
void Output(); /*输出学生记录(无排序)*/
void Save(); /*数据保存在文件中*/
Point * Read(); /*读取文件中的数据*/
Point * SaveOrRead(); /*调用 保存 和 读取 文件的算法*/
/*主函数*/
void main()
{
Point *R;
int flag;
char x,code[20];
printf("**********************************************\n");
printf("\t\t班级成绩管理系统\n");
printf("**********************************************\n\n");
printf("欢迎您的使用..\n\n");
printf("*****************\n");
printf("\t\t\t按任意键进入菜单选项..\n");
getch();
clrscr();
do
{
clrscr();
Main_Menu();
x=getch();
switch(x)
{
case '0':
{
clrscr();
printf("\n\n\n\n\n\n\n\t\t***************************************************\n");
printf("\t\t\t谢谢使用班级成绩管理系统!\n");
printf("\t\t***************************************************\n");
printf("\n\t按任意键退出...");
getch();
exit(0);
}break;
case '1':
{
clrscr();
printf("\n\t\t\t******************************");
printf("\n\t\t\t初始化将删除之前所有存储的记录",total);
printf("\n\t\t\t******************************\n");
printf("\n\n\t\t请问是否继续? 1.是 0.否\t\t");
scanf("%d",&flag);
if(flag==1)
{
printf("\n提示:密码小于20位字符");
printf("\n\n\t\t请输入密码:");
scanf("%s",code); /*密码为本人学号*/
if(strcmp(code,password)==0)
{
printf("\n\t\t初始化成功! 您可以开始添加学生记录!");
R=Create_Stu();
total=0; /*初始化后没有学生记录*/
}
else {
printf("\n\t\t\t密码错误!");
goto loop; /*密码错误直接跳到下一步*/
}
}
loop : printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '2':
{
clrscr();
AddOrDel(R); /*调用 添加 和 删除 学生记录的算法*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '3':
{
clrscr();
D_InsertSortByNum(R);
Input_Score(R); /*按学号顺序对学生输入成绩*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '4':
{
clrscr();
Output(R); /*输出当前学生记录*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '5':
{
View(R); /*调用 学号,学科分数,总分 排序查看的算法*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '6':
{
clrscr();
Search(R); /*调用 指定学号,指定学科分数,总分数 搜索的算法*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '7':
{
clrscr();
averge_score(R); /*统计班级平均成绩*/
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '8':
{
clrscr();
printf("\n\t\t\t**********************");
printf("\n\t\t\t**班级一共有%d个学生**",total);
printf("\n\t\t\t**********************\n");
printf("\n\n\n\t\t\t按任意键返回主菜单");
getch();
}break;
case '9':
{
clrscr();
R=SaveOrRead(R); /*调用 保存 和 读取 文件的算法*/
}break;
}
}while(x!='0');
}
/*主菜单*/
void Main_Menu()
{
printf("*******************************************\n");
printf("\t\t学生管理系统\n");
printf("*******************************************\n");
printf("*****提示:第一次使用该系统请先初始化!!****\n");
printf("*******************************************\n");
printf("1.初始化\t\t\t");
printf("2.添加、删除学生记录\n\n");
printf("3.添加学生成绩\t\t\t");
printf("4.查看学生记录(当前)\n\n");
printf("5.按指定要求排序查看学生记录\t");
printf("6.按学号或分数段搜索部分学生记录\n\n");
printf("7.统计班级平均成绩\t\t");
printf("8.统计班级学生数\n\n");
printf("9.保存、读取文件\t\t");
printf("0.退出该系统\n");
printf("*******************************************\n");
printf("选择选项0~9\n");
printf("*******************\n");
}
/*初始化(带头结点)*/
Point * Create_Stu( )
{/*可以删除之前所有的学生记录*/
student S;
Point *r; /*r用来指向链表尾部*/
S=(StuNode *)malloc(sizeof(StuNode));
r=(Point *)malloc(sizeof(Point));
S->next=NULL;
r->front=S; /*头尾指针都指向链表头结点*/
r->rear=S;
first=1;
return r;
}
/*添加新的学生记录*/
Point * Add_Stu(Point *r)
{
Point *R;
StuNode *p,*H;
int j; /*j用来控制学号输入错误时的循环*/
char i;
if(first==0) /*还未初始化*/
printf("\t\t您还未初始化,请先初始化,谢谢!");
else
{
R=r;
do
{
p=(StuNode *)malloc(sizeof(StuNode));
do
{
j=0;
printf("\t\t*************************************************\n");
printf("\t\t*注: 输入学号为10位数,其输入形式如 0307102324 *\n");
printf("\t\t*\t\t学号最后两位为座号\t\t*\n");
printf("\t\t*************************************************\n");
printf("******************************\n");
printf("请输入学号: ");
scanf("%s",p->num);
flushall();
if(strlen(p->num)!=10) /*判断输入的学号是否为10位数*/
{
printf("\t#对不起,您输入的学号格式错误,请重新输入,按任意键开始#\n");
getch();
clrscr();
j=1; /*学号输入错误,j 赋值为1*/
}
else
{
H=R->front; /*从头结点开始向链表尾部查找*/
while(H->next!=NULL)
{
if(strcmp(H->next->num,p->num)==0) /*判断输入的学号是否已经存在*/
{
printf("\t#对不起,您输入的学号已存在,请重新输入,按任意键开始#\n");
getch();
clrscr();
j=1;
}
H=H->next;
}
}
}while(j==1);
printf("姓名: ");
scanf("%s",p->name);
flushall();
printf("性别 f/m: ");
scanf(