#include
#include
#include
#include
#include
struct stu
{
char num[11];
char name[8];
int maths;
int physics;
int english;
int circuit;
int computer;
float avg;
char is_ok[2];
struct stu *next;
};
int n;
//全局变量n
//以下是函数声明
struct stu *input();
//输入函数
void output(struct stu * head); //输出函数
void find(struct stu * head);
//查找和排名函数
void level(struct stu * head);
//分数段人数函数
void average(struct stu * head); //各科平均分函数
void menushow();
//主菜单函数
void submenu1();
//查找子菜单函数
void submenu2();
//增加子菜单函数
void submenu3();
//删除子菜单函数
void welcome();
//欢迎界面函数
void savefile(struct stu * head);//保存入函数
struct stu *readfile();
//读取成绩信息函数
void print();
//输出函数
void cutout(struct stu * head);
//删除函数
void add(struct stu * head);
//增加函数
main()
//主函数
{
struct stu *head,*p;
int j,k,i,l,m=1,n;
//m为控制变量,j,k,i,l为子菜单控制变量
welcome();
//调用欢迎函数
while(1){
//建立菜单循环
menushow();
//调用menushow函数
scanf("%d",&j);
//读取变量j
switch(j){
case 1:system("cls");
//输入学生信息,并返回主菜单
print();
head=input();
p=head;
printf("输入成功!");
Sleep(1000);
break;
case 2:system("cls");
//输出学生信息,返回主菜单
output(p);
printf("任意键返回上一级");
getchar();
getchar();
break;
case 3:m=1;
while(m)
//以m的值确定是否循环,m为1循环,m为0退出该级循环
{
system("cls");
add(p);
//调用增加函数
printf("增加成功!");
getchar();
getchar();
system("cls");
n=1;
// 以n的值确定是否循环,n为1循环,n为0退出该级循环
while(n){
submenu2();
scanf("%d",&i);
switch(i){
case 1:n=0;break; //退出该级循环,回到上一级增加函数
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单
default:printf("\t 选择错误,请重新输入!\n");
n=1;
//子菜单选择错误,重新选择
Sleep(3000);
system("cls");
break;
}
}
}
break;
case 4:system("cls"); //调用保存文件函数,返回主菜单
savefile(p);
printf("保存成功!");
Sleep(1000);
break;
case 5:system("cls");
//输出各科平均分,返回主菜单
average(p);
printf("任意键返回上一级");
getchar();
getchar();
break;
case 6:m=1;
//m控制循环
while(m)
{
system("cls");
//调用find函数,用于查询学生信息
find(p);
getchar();
getchar();
system("cls");
n=1;
while(n){
//调用查找子菜单
submenu1();
scanf("%d",&k);
switch(k){
case 1:n=0;break;
//退出该循环,回到查找函数
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单
default:printf("\t 选择错误,请重新输入!\n");
Sleep(3000);
system("cls");
n=1;
break;
//子菜单选择错误,重新选择
}
}
}break;
case 7:system("cls"); //调用level函数,返回主菜单
level(p);
printf("任意键返回上一级");
getchar();
getchar();
break;
case 8:
m=1;
while(m)
//控制循环
{
system("cls");
cutout(p);
//调用删除函数
getchar();
getchar();
system("cls");
n=1;
while(n){
submenu3();
//调用删除子菜单
scanf("%d",&l);
switch(l){
case 1:n=0;break;
//退出该级循环,回到删除函数
case 0:m=0;n=0;break;//退出上两级循环,回到主菜单
default:printf("\t 选择错误,请重新输入!\n");
Sleep(3000);
n=1;
system("cls");
break;
//子菜单选择错误,重新选择
}
}
}break;
case 9:
system("cls");
head=readfile();
//调用读取函数
p=head;printf("读取成功!");
Sleep(1000);break;
case 0:printf("\t 再见!\n");return 0;break;
default:printf("\t 选择错误,请重新输入!\n");
Sleep(3000);
break;
//主菜单选择错误,重新选择
}
}
}
void print()
//输出函数
{
printf("请输入学生信息及成绩\n");
printf(" 学号 姓名 数学 物理 英语 电路 计算机 是否继续(y/n)\n");
printf("例403140101 xx 100 100 100 100 100 y\n");
}
struct stu *input()
//输入学生成绩信息
{
struct stu *head,*p1,*p2;
n=0;
p1=p2=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
head=NULL;
while(strcmp(p1->is_ok,"n")!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
}
p2->next=NULL;
return(head);
}
void output (struct stu * head)
//输出学生成绩信息
{
struct stu * p;
printf("\n学生成绩如下:\n");
printf(" \n 学号 姓名 数学 物理 英语 电路 计算机 平均分\n");
p=head;
if(head!=NULL)
do{
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
printf("%s %-8s %5d %5d %5d %5d %5d %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
p=p->next;
}while(p!=NULL);
}
void find(struct stu * head)
//查找学生成绩信息
{
struct stu * p;
int k=1,m=1;
float j=200;
char num[11];
char Name[8];
p=head;
if(head!=NULL)
printf("请输入需要查找的学生的学号:");
scanf("%s",num);
do{
if(strcmp(p->num,num)==0)
{
printf("\n 学号 姓名 数学 物理 英语 电路 计算机 平均分\n");
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
printf("%s %-8s %5d %5d %5d %5d %5d %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
j=p->avg;
strcpy(Name,p->name);
}
p=p->next;
}while(p!=NULL);
p=head;
for(p;p!=NULL;p=p->next)
{
//按照平均分输出排名
if((p->avg)>j)
k++;
}
if(j<200)
printf("%s的排名为:%d\n",Name,k);
p=head;
for(p;p!=NULL;p=p->next)
{
if(strcmp(p->num,num)==0)
m=0;
}
if(m==1)
printf("未找到该同学信息!");
}
void level(struct stu * head) //分数段信息函数
{
struct stu * p;
int i,j=0,k=0,x=0,y=0,z=0;
p=head;
if(head!=NULL)
do{
if(p->avg>=90&&p->avg<=100)j++;
if(p->avg>=80&&p->avg<90)k++;
if(p->avg>=70&&p->avg<80)x++;
if(p->avg>=60&&p->avg<70)y++;
if(p->avg<60)z++;
p=p->next;
}while(p!=NULL);
printf(" 分数段分布如下:\n");
printf("90-100分有 %-3d人\n",j);
printf("80-89分有 %-3d人\n",k);
printf("70-79分有 %-3d人\n",x);
printf("60-69分有 %-3d人\n",y);
printf("60分以下有 %-3d人\n",z);
}
void average(struct stu * head)
//求各科平均分函数
{
float avg_maths=0;
float avg_physics=0;
float avg_english=0;
float avg_circuit=0;
float avg_computer=0;
struct stu * p;
p=head;
if(head!=NULL)
do
{
avg_maths+=p->maths;
avg_physics+=p->physics;
avg_english+=p->english;
avg_circuit+=p->circuit;
avg_computer+=p->computer;
p=p->next;
}while(p!=NULL);
avg_maths=avg_maths/n;
avg_physics=avg_physics/n;
avg_english=avg_english/n;
avg_circuit=avg_circuit/n;
avg_computer=avg_computer/n;
printf("各科的平均分如下:\n");
printf("数学: %-6.2f \n",avg_maths);
printf("物理: %-6.2f \n",avg_physics);
printf("英语: %-6.2f \n",avg_english);
printf("电路: %-6.2f \n",avg_circuit);
printf("计算机:%-6.2f \n",avg_computer);
}
void menushow()
{
system("cls");
printf(" \n\n\n\n\n\n\n\t\t\t 欢迎使用学生成绩管理系统\n");
printf(" *************************\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(" * 0. 退 出 *\n");
printf(" *************************\n");
printf(" 请选择:");
}
void savefile(struct stu * head)
//读取文件成绩信息函数
{
struct stu * p;
FILE *fp;
fp=fopen("stu.txt","w");
p=head;
if(head!=NULL)
do{
p->avg=(p->maths+p->physics+p->english+p->circuit+p->computer)/5;
fprintf(fp,"%s %-8s %5d %5d %5d %5d %5d %5.2f\n",p->num,p->name,p->maths,p->physics,p->english,p->circuit,p->computer,p->avg);
p=p->next;
}while(p!=NULL);
fclose(fp);
}
void submenu1()
//查找子菜单
{
printf(" \n\n\n\n\n\n\n");
printf(" **************************\n");
printf(" * 1. 继 续 查 找 *\n");
printf(" **************************\n");
printf(" * 0. 返 回 上 一 级 *\n");
printf(" **************************\n");
printf(" 请选择:");
}
void welcome()
//输入密钥进入程序,欢迎函数
{
char password[5];
char num[5];
strcpy(num,"njit");
loopback3:printf(" \n\n\n\n\n\n\n\n");
system("color 0F");
printf("\t\t\t欢迎使用学生成绩管理系统!\n");
printf("\t\t\t\t请输入密码:");
scanf("%s",&password);
if(strcmp(password,num)==0)
{
system("cls");
system("color 02");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 04");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 05");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 06");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 0C");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
system("cls");
system("color 0F");
printf(" \n\n\n\n\n\n\n\n\n\t\t\t欢迎使用学生成绩管理系统!");
Sleep(300);
}
else
{
printf("\t\t\t\t 密码错误!");
//密码错误重新输出
Sleep(2000);
system("cls");
goto loopback3;
}
}
void submenu2()
//增加学生信息的子菜单
{
printf(" \n\n\n\n\n\n\n");
printf(" **************************\n");
printf(" * 1. 继 续 增 加 *\n");
printf(" **************************\n");
printf(" * 0. 返 回 上 一 级 *\n");
printf(" **************************\n");
printf(" 请选择:");
}
void submenu3()
//删除学生信息的子菜单
{
printf(" \n\n\n\n\n\n\n");
printf(" **************************\n");
printf(" * 1. 继 续 增 加 *\n");
printf(" **************************\n");
printf(" * 0. 返 回 上 一 级 *\n");
printf(" **************************\n");
printf(" 请选择:");
}
void add(struct stu * head)
//增加学生成绩信息函数
{
struct stu * p,*p1;
p=head;
while(p->next!=NULL)
{
p=p->next;
}
printf(" 请输入成绩\n 学号 姓名 数学 物理 英语 电路 计算机\n");
p1=(struct stu*)malloc(sizeof(struct stu));
scanf("%s%s%d%d%d%d%d",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
p1->next=NULL;
p->next=p1;
}
void cutout(struct stu *head)
//删除学生成绩信息函数
{
struct stu *p;
struct stu *p1;
p1=head;
p=head->next;
char num[11];
printf("请输入需要删除的学生的学号:");
scanf("%s",num);
while(p!=NULL)
//找到同学并删除
{
if(strcmp(p->num,num)==0)
{
p1->next=p->next;
free(p);
printf("删除成功!\n");
return;
}
p=p->next;
p1=p1->next;
}
if(p==NULL)
//未找到该学生
{
printf("找不到要删除的学生信息!\n");
return ;
}
}
struct stu *readfile() //读取文件输入
{
FILE *fp;
struct stu *head,*p1,*p2;
fp=fopen("stu1.txt","r");
n=0;
p1=p2=(struct stu*)malloc(sizeof(struct stu));
fscanf(fp,"%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
head=NULL;
while(strcmp(p1->is_ok,"n")!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct stu*)malloc(sizeof(struct stu));
fscanf(fp,"%s%s%d%d%d%d%d%s",p1->num,p1->name,&p1->maths,&p1->physics,&p1->english,&p1->circuit,&p1->computer,p1->is_ok);
p1->avg=(p1->maths+p1->physics+p1->english+p1->circuit+p1->computer)/5;
}
p2->next=NULL;
return(head);
}