自己写的 不算太好 慢慢改进吧。。。。。。
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>
#include<string.h>
#define HEADER1 "-----------------------------------------------------------------------------\n"
#define HEADER2 "|系 |班级 |学号 |姓名 |数学 |英语 |c语言 |\n"
#define HEADER3 "|------------|------------|------------|------------|-------|-------|-------|\n"
#define FORMAT "|%-12s|%-12s|%-12s|%-12s|%-7d|%-7d|%-7d|\n"
#define DATA h->data.xibie,h->data.banji,h->data.xuehao,h->data.name,h->data.math,h->data.eng,h->data.c
#define DATA1 q->data.xibie,q->data.banji,q->data.xuehao,q->data.name,q->data.math,q->data.eng,q->data.c
#define DATA2 stu.xibie,stu.banji,stu.xuehao,stu.name,stu.math,stu.eng,stu.c
struct student //结构体
{
char xibie[20];
char banji[20];
char xuehao[15];
char name[20];
int math,eng,c,total;
};
typedef struct node //链表
{
struct student data;
struct node *next;
}Link;
/*********************初始化链表*********************/
Link *InitList()
{
Link *p;
p=(Link *)malloc(sizeof(Link));
p->next=NULL;
return p;
}
/*****************************输出表头********************************/
void PrintfHeader()
{
printf(HEADER1);printf(HEADER2);printf(HEADER3);
}
/***************************输出表中数据******************************/
void PrintfData(Link *p)
{
Link *h=p;
while(h->next!=NULL)
{
h=h->next;
printf(FORMAT,DATA);
printf(HEADER3);
}
}
/*********************添加学生信息***********************/
void Add(Link *p)
{
Link *h=p,*s;
int n;
while(h->next!=NULL)
h=h->next;
printf("\n请输入要添加学生信息的个数:");
scanf("%d",&n);
while(n--)
{
printf("\n请分别输入学生的系别、班级、学号、姓名和高数、英语、c语言成绩:");
s=(Link *)malloc(sizeof(Link)); s->next=NULL;
scanf("%s%*c%s%*c%s%*c%s%*c%d%d%d",s->data.xibie,s->data.banji,s->data.xuehao,s->data.name,&s->data.math,&s->data.eng,&s->data.c);
h->next=s; h=s; s->next=NULL;
}
}
/***************************查找学生信息****************************/
Link *Search(Link *p)
{
Link *h=p,*q=p;
char a[10],b[20],ch;
loop:printf("\n请输入要查找学生的关键字(xuehao或者name):");
scanf("%s",a);
if(strcmp(a,"xuehao")==0)
{
l:printf("\n请输入该生学号:");
scanf("%s",b);
while(h->next!=NULL)
{
h=h->next;
if(strcmp(b,h->data.xuehao)==0) goto a;
}
printf("\n输入错误!!\n");
printf("\n是否继续查找(Y/N)?:");
getchar();scanf("%c",&ch);
if(ch=='Y'|| ch=='y') {h=q;goto l;}
else return NULL;
}
else if(strcmp(a,"name")==0)
{
o:printf("\n请输入该生姓名:");
scanf("%s",b);
while(h->next!=NULL)
{
h=h->next;
if(strcmp(b,h->data.name)==0) goto a;
}
printf("\n输入错误!!\n");
printf("\n是否继续查找(Y/N)?:");
getchar();scanf("%c",&ch);
if(ch=='Y'|| ch=='y') {h=q;goto o;}
else return NULL;
}
else {printf("\nSorry,输入信息错误!!请重新输入:");goto loop;}
a:return h;
}
void Search1()
{
struct student stu;
FILE *fp;
char a[10],b[20],ch;
fp=fopen("student.txt","ab+");
loop:printf("\n请输入要查找学生的关键字(xuehao或者name):");
scanf("%s",a);
if(strcmp(a,"xuehao")==0)
{
l:printf("\n请输入该生学号:");
scanf("%s",b);
while(fread(&stu,sizeof(stu),1,fp)==1)
{
if(strcmp(stu.xuehao,b)==0)
{
printf("您要查找的学生信息如下:\n");
PrintfHeader();
printf(FORMAT,DATA2);
printf(HEADER3);
goto a;
}
}
printf("\n输入错误!!\n");
printf("\n是否继续查找(Y/N)?:");
getchar();scanf("%c",&ch);
if(ch=='Y'|| ch=='y') {rewind(fp);goto l;}
else return;
}
else if(strcmp(a,"name")==0)
{
o:printf("\n请输入该生姓名:");
scanf("%s",b);
while(fread(&stu,sizeof(stu),1,fp)==1)
{
if(strcmp(stu.name,b)==0)
{
printf("您要查找的学生信息如下:\n");
PrintfHeader();
printf(FORMAT,DATA2);
printf(HEADER3);
goto a;
}
}
printf("\n输入错误!!\n");
printf("\n是否继续查找(Y/N)?:");
getchar();scanf("%c",&ch);
if(ch=='Y'|| ch=='y') {rewind(fp);goto o;}
else return;
}
else {printf("\nSorry,输入信息错误!!请重新输入:");goto loop;}
fclose(fp);
a:return;
}
/***********************删除学生信息*************************/
void Delete(Link *p)
{
Link *h=p,*q,*r;
char ch;
printf("\n查找要删除的学生信息\n");
q=Search(p);
if(q!=NULL)
{
printf("您要查找的学生信息如下:\n");
PrintfHeader(); printf(FORMAT,DATA1);printf(HEADER3);
printf("\n确定要删除该生信息么?(Y/N):");
getchar();
scanf("%c",&ch);
if(ch=='Y'||ch=='y')
{
while(h->next!=q)
h=h->next;
r=h; r->next=h->next->next;
printf("\n删除成功\n!!");
}
else printf("\n删除失败!!!\n");
}
else printf("\n对不起,您的输入信息有误!");
}
void Delete1()
{
struct student stu;
FILE *fp1,*fp2;
char num[20],ch;
int n;
fp1=fopen("student.txt","rb");
if(fp1==NULL)
{
printf("\n\n 文件打开失败!!!!\n");
return;
}
fp2=fopen("temp.txt","wb");
if(fp2==NULL)
{
printf("\n\n 文件打开失败!!!!\n");
return;
}
printf("\n请输入要删除学生的学号:");
scanf("%s",num);
while(fread(&stu,sizeof(stu),1,fp1)==1)
{
n=0;
if(strcmp(stu.xuehao,num)==0)
{
printf("\n该生信息如下:\n");
PrintfHeader();printf(FORMAT,DATA2);printf(HEADER3);
printf("\n确定要删除么(y/n)?");
getchar();scanf("%c",&ch);
if(ch=='Y'||ch=='y') {n=1;printf("\n删除成功!!");}
}
if(!n) fwrite(&stu,sizeof(stu),1,fp2);
}
fclose(fp1);fclose(fp2);
remove("student.txt");
rename("temp.txt","student.txt");
}
/*************************修改学生信息**************************/
Link *Modify(Link *p)
{
Link *q=p,*s=p;
char xuehao[20],ch;
l:printf("\n请输入要修改信息的学生的学号:");
scanf("%s",xuehao);getchar();
while(q->next!=NULL)
{
q=q->next;
if(strcmp(q->data.xuehao,xuehao)==0)
{
printf("\n该生信息如下:\n");
PrintfHeader(); printf(FORMAT,DATA1);printf(HEADER3);
printf("\n请输入新的学生信息:");
s=(Link *)malloc(sizeof(Link));
scanf("%s%*c%s%*c%s%*c%s%*c%d%d%d",s->data.xibie,s->data.banji,s->data.xuehao,s->data.name,&s->data.math,&s->data.eng,&s->data.c);
strcpy(q->data.xibie,s->data.xibie); strcpy(q->data.banji,s->data.banji);strcpy(q->data.xuehao,s->data.xuehao);
strcpy(q->data.name,s->data.name);q->data.math=s->data.math;q->data.eng=s->data.eng;q->data.c=s->data.c;
printf("\n修改成功!!!\n");
goto loop;
}
}
printf("\n输入信息有误!!!是否重新输入(Y/N)?");
scanf("%c",&ch);
if(ch=='Y' || ch=='y') {q=s;goto l;}
else return NULL;
loop:return q;
}
/****************************分析学生成绩****************************/
void Analysis(Link *p)
{
Link *h=p;
char a[10],b[20];
float count=0,m1=0,e1=0,c1=0,m2=0,m3=0,e2=0,e3=0,c2=0,c3=0;
printf("\n您想知道班级还是系里的学生成绩平均分、及格率和优秀率(xibie或banji)?");
printf("\n请输入xibie或banji:");
scanf("%s",a);
if(strcmp(a,"xibie")==0)
{
printf("\n请输入系别名称:");
scanf("%s",b);
while(h->next!=NULL)
{
h=h->next;
if(strcmp(h->data.xibie,b)==0)
{
count++;
m1+=h->data.math;
if(h->data.math>=60) m2++;
if(h->data.math>=80) m3++;
e1+=h->data.eng;
if(h->data.eng>=60) e2++;
if(h->data.eng>=80) e3++;
c1+=h->data.c;
if(h->data.c>=60) c2++;
if(h->data.c>=80) c3++;
}
}
printf("\n%s系的高数 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,m1/count,m2/count,m3/count);
printf("\n%s系的英语 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,e1/count,e2/count,e3/count);
printf("\n%s系的c语言平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,c1/count,c2/count,c3/count);
}
else
{
printf("\n请输入班级名称:");
scanf("%s",b);
while(h->next!=NULL)
{
h=h->next;
if(strcmp(h->data.banji,b)==0)
{
count++;
m1+=h->data.math;
if(h->data.math>=60) m2++;
if(h->data.math>=80) m3++;
e1+=h->data.eng;
if(h->data.eng>=60) e2++;
if(h->data.eng>=80) e3++;
c1+=h->data.c;
if(h->data.c>=60) c2++;
if(h->data.c>=80) c3++;
}
}
printf("\n%s班的高数 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,m1/count,m2/count,m3/count);
printf("\n%s班的英语 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,e1/count,e2/count,e3/count);
printf("\n%s班的c语言平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,c1/count,c2/count,c3/count);
}
}
void Analysis1()
{
struct student stu;
FILE *fp;
char a[10],b[20];
float count=0,m1=0,e1=0,c1=0,m2=0,m3=0,e2=0,e3=0,c2=0,c3=0;
fp=fopen("student.txt","rb");
if(fp==NULL)
{
printf("\n文件打开失败!!!");
exit(1);
}
printf("\n您想知道班级还是系里的学生成绩平均分、及格率和优秀率(xibie或banji)?");
printf("\n请输入xibie或banji:");
scanf("%s",a);
if(strcmp(a,"xibie")==0)
{
printf("\n请输入系别名称:");
scanf("%s",b);
while(fread(&stu,sizeof(stu),1,fp)==1)
{
if(strcmp(stu.xibie,b)==0)
{
count++;
m1+=stu.math;
if(stu.math>=60) m2++;
if(stu.math>=80) m3++;
e1+=stu.eng;
if(stu.eng>=60) e2++;
if(stu.eng>=80) e3++;
c1+=stu.c;
if(stu.c>=60) c2++;
if(stu.c>=80) c3++;
}
}
printf("\n%s系的高数 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,m1/count,m2/count,m3/count);
printf("\n%s系的英语 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,e1/count,e2/count,e3/count);
printf("\n%s系的c语言平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,c1/count,c2/count,c3/count);
}
else
{
printf("\n请输入班级名称:");
scanf("%s",b);
while(fread(&stu,sizeof(stu),1,fp)==1)
{
if(strcmp(stu.banji,b)==0)
{
count++;
m1+=stu.math;
if(stu.math>=60) m2++;
if(stu.math>=80) m3++;
e1+=stu.eng;
if(stu.eng>=60) e2++;
if(stu.eng>=80) e3++;
c1+=stu.c;
if(stu.c>=60) c2++;
if(stu.c>=80) c3++;
}
}
printf("\n%s班的高数 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,m1/count,m2/count,m3/count);
printf("\n%s班的英语 平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,e1/count,e2/count,e3/count);
printf("\n%s班的c语言平均分: %.2f 及格率: %.2f 优秀率:%.2f\n",b,c1/count,c2/count,c3/count);
}
}
/**************************显示学生信息****************************/
void Show1()
{
struct student stu;
FILE *fp=fopen("student.txt","ab+");
if(fp==NULL)
{
printf("\n文件打开失败!!");
exit(1);
}
PrintfHeader();
while(fread(&stu,sizeof(stu),1,fp)==1)
{
printf(FORMAT,DATA2);
printf(HEADER3);
}
fclose(fp);
}
void Show(Link *p)
{
Link *h=p;
PrintfHeader();
PrintfData(h);
}
/**************************单科学生成绩排序****************************/
void SingleSort(Link *p)
{
Link *h,*s,*q,*r;
r=NULL;q=p;
while(q->next!=r) //链表排序
{
h=q;
s=h->next;
while(s!=r && s->next!=r)
{
if(s->data.math<s->next->data.math)
{
h->next=s->next; s->next=s->next->next;h->next->next=s;
}
h=h->next;
s=h->next;
}
r=s;
}
printf("\n高数成绩排名如下:\n");
PrintfHeader(); PrintfData(h);
r=NULL;q=p;
while(p->next!=r) //链表排序
{
h=q;
s=h->next;
while(s!=r && s->next!=r)
{
if(s->data.eng<s->next->data.eng)
{
h->next=s->next; s->next=s->next->next;h->next->next=s;
}
h=h->next;
s=h->next;
}
r=s;
}
printf("\n英语成绩排名如下:\n");
PrintfHeader(); PrintfData(h);
r=NULL;q=p;
while(p->next!=r) //链表排序
{
h=q;
s=h->next;
while(s!=r && s->next!=r)
{
if(s->data.c<s->next->data.c)
{
h->next=s->next; s->next=s->next->next;h->next->next=s;
}
h=h->next;
s=h->next;
}
r=s;
}
printf("\nc语言成绩排名如下:\n");
PrintfHeader(); PrintfData(h);
}
/*************************总成绩排序***************************/
void TotalSort(Link *p)
{
Link *h,*w,*s,*k,*r=p;
int i=0;
while(r->next!=NULL)
{
r=r->next;r->data.total=r->data.math+r->data.eng+r->data.c;
}
s=NULL;w=p;
while(p->next!=s) //链表排序
{
h=w;
k=h->next;
while(k!=s && k->next!=s)
{
if(k->data.total<k->next->data.total)
{
h->next=k->next; k->next=k->next->next; h->next->next=k;
}
h=h->next;
k=h->next;
}
s=k;
}
printf("\n总成绩排名如下:\n");
while(h->next!=NULL)
{
h=h->next;i++;
printf("\n 名次:%d %-10s %-10s %-10s %-10s %-5d %-5d %-5d %-7d",i,h->data.xibie,h->data.banji,h->data.xuehao,h->data.name,h->data.math,h->data.eng,h->data.c,h->data.total);
}
}
/*****************************出错信息****************************/
void Wrong()
{
printf("\n对不起,您输入的数据不合法,请审查后再输入!!\n\n\n");
}
/**************************存盘***************************/
void Save(Link *p)
{
Link *h=p;
FILE *fp;
fp=fopen("student.txt","ab+");
if(fp==NULL)
{
printf("\n文件打开失败!!!\n");
return;
}
while(h->next!=NULL)
{
h=h->next;
if(fwrite(&h->data,sizeof(h->data),1,fp)==1)
continue;
else break;
}
fclose(fp);
}
/******************主菜单********************/
void menu()
{
printf("\n\n\n\n 学生成绩管理系统 \n\n");
printf(" *************************************************************\n");
printf("\n\n * 1 添加学生信息 2 删除学生信息 *\n");
printf("\n\n * 3 查找学生信息 4 修改学生信息 *\n");
printf("\n\n * 5 班级或系里学生成绩分析 6 显示保存的学生信息*\n");
printf("\n\n * 7 单科成绩排序 8 总成绩排序 *\n");
printf("\n\n * 9 显示本次操作学生信息 0 退出 *\n");
printf("\n\n *************************************************************\n");
}
/******************主函数********************/
int main()
{
Link *q,*h;
FILE *fp;
int select,count=0;
char ch,cha;
fp=fopen("student.txt","ab+");
if(fp==NULL)
{
printf("\n======>文件打开失败!\n");
exit(0);
}
fclose(fp);
h=InitList();
while(1)
{
menu();
printf("\n请输入你的选择(0—9):");
scanf("%d",&select);
if(select==0)
{
printf("\n ======>是否保存对文件的修改?(Y/N):");
getchar();scanf("%c",&ch);
if(ch=='y'|| ch=='Y')
Save(h);
exit(0);
}
switch(select)
{
case 1:
Add(h);
printf("\n\n\n学生信息添加成功,具体信息如下:\n");
PrintfHeader(); PrintfData(h);
break;
case 2:getchar();
printf("\nT:在本次操作中删除 F:在保存的文件中删除\n");printf("\n请输入您的选择(T/F):");
scanf("%c",&cha);
if(cha=='T'|| cha=='t')
Delete(h);
else Delete1();
break;
case 3:
getchar();
printf("\nT:在本次操作中查找 F:在保存的文件中查找\n");printf("\n请输入您的选择(T/F):");
scanf("%c",&cha);
if(cha=='T'|| cha=='t')
{
q=Search(h);
if(q!=NULL)
{
printf("\n\n\n\n您要查找的学生信息如下:\n");
PrintfHeader(); printf(FORMAT,DATA1);printf(HEADER3);
}
}
else Search1();
break;
case 4:
q=Modify(h);
if(q==NULL) printf("\n修改失败!!\n");
else
{
printf("\n\n\n修改后的学生信息如下:\n");
PrintfHeader();printf(FORMAT,DATA1);printf(HEADER3);
}
break;
case 5:
getchar();
printf("\nT:分析本次操作的学生成绩 F:分析文件保存的学生成绩\n");printf("\n请输入您的选择(T/F):");
scanf("%c",&cha);
if(cha=='T'|| cha=='t')
Analysis(h);
else Analysis1();
break;
case 6:printf("\n\n\n\n所有学生信息如下:\n");Show1();break;
case 7:SingleSort(h);break;
case 8:TotalSort(h);break;
case 9:printf("\n\n\n\n本次操作学生信息如下:\n");Show(h);break;
default:Wrong();break;
}
printf("\n\n\no(>﹏<)oo(>﹏<)o请按任意键返回主菜单o(>﹏<)oo(>﹏<)o.......");getch();system("cls");
}
return 0;
}