该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#define N 3
//数据结构
typedef struct learn
{ //成绩结构
int score[N]; //各门课成绩
int sum; //总分
float ave; //平均分
int order; //名次
}Learn;
typedef struct student
{ //学生结构体
char no[10]; //学号
char name[20]; //姓名
char sex; //性别
int age; //年龄
Learn success; //成绩
struct student*next; //只想后继结点的指针
}Student;
Student*initlist()
{
Student*head;
head=(Student*)malloc(sizeof(Student));
head->next=NULL;
return head;
}
void menushow();
void menuselect(Student*head,int k);
void inputstuinfo(Student*head);
void readfromfile(Student*head);
Student*searchbyno(Student*head,char*no);
int searchbyname(Student*head,char*name);
void compute(Student*head);
void sort(Student *head);
void insertnode(Student *head);
void modifystuinfo(Student *head);
void deletenode(Student *head);
void printfstuinfo(Student *head);
void printsinglestu(Student *p);
void savetofile(Student *head,char *filename);
void copy();
//菜单显示
void menushow()
{
printf("\n\t***************学生成绩管理系统***************\n");
printf("\n\t\t0.帮助");
printf("\n\t\t-----------------");
printf("\n\t\t1.键盘输入\t\t2.文件读取");
printf("\n\t\t-----------------");
printf("\n\t\t3.按学号查找\t\t4.按姓名查找");
printf("\n\t\t5.统计总分平均分\t6.按总分排序");
printf("\n\t\t-----------------");
printf("\n\t\t7.插入数据\t\t8.修改数据");
printf("\n\t\t9.删除数据");
printf("\n\t\t-----------------");
printf("\n\t\t10.数据显示");
printf("\n\t\t11.保存数据\t\t12.文件备份");
printf("\n\t\t-----------------");
printf("\n\t\t13.销毁链表\t\t14.退出系统\n");
printf("\n\t\t*********************************************");
}
//菜单选择
void menuselect(Student*head,int k)
{
int flag=0;
Student*p;
char no[10],name[20];
switch(k)
{
case 0:help();break;
case 1:inputstuinfo(head);break;
case 2:readfromfile(head);printf("文件读取成功!\n");break;
case 3:printf("请输入要查找的学号:");
gets(no);flushall();
p=searchbyno(head,no);
if(p)
{
printsinglestu(p);
}
else
{
printf("未找到!\n");
}
break;
case 4:printf("请输入要查找的姓名:");
gets(name);flushall();
flag=searchbyname(head,name);
if(!flag)
{
printf("未找到!\n");
}
break;
case 5:compute(head);printf("总分平均分统计完毕。\n");break;
case 6:sort(head);printf("排序结束。\n");break;
case 7:insertnode(head);printf("插入完毕。\n");break;
case 8:modifystuinfo(head);printf("修改完毕。\n");break;
case 9:deletenode(head);printf("删除完毕。\n");break;
case 10:printstuinfo(head);break;
case 11:savetofile(head,"stuinfo.dat");printf("文件已保存。\n");break;
case 12:copy();printf("文件备份结束。\n");break;
case 13:destorylist(head);printf("链表已销毁。\n");break;
case 14:printf("欢迎再次使用,再见!\n");exit(0);
}
}
//主函数
int main()
{
Student*head;
int k,flag;
head=initlist(); //初始化单链表
while(1)
{
system("cls");
flag=1;
menushow(); //显示菜单
printf("请根据菜单选择所需操作:");
while(flag)
{
scanf("%d",&k);
flushall(); //清空缓冲区
if(k<0||k>14)
{
printf("输入错,请重新输入\n");
}
else
{
flag=0;
}
}
menuselect(head,k);
printf("按任意键继续!");
getch();
flushall();
}
return 0;
}
void inputstuinfo(Student*head)//数据输入
{
Student *r,*s,*p;
char ch;
int f=1;
r=head;
system("cls");
do
{
flushall();
s=(Student*)malloc(sizeof(Student));
printf("请输入要插入学生的信息\n");
printf("请输入学生的学号:");
gets(s->no);
while(f&&head->next!=NULL)
{
p=seachbyno(head,s->no);
if(p=NULL)
{
break;
}
else
{
printf("该学号已存在,请重新输入\n");
printf("请重新输入学生的学号:");
gets(s->no);
}
}
printf("请输入学生的姓名:");
gets(s->name);
printf("请输入学生的性别:");
s->sex=getchar();
printf("请输入学生的年龄:");
scanf("%d",&s->age);
printf("请输入学生的三门课程成绩:");
scanf("%d",&s->success.score[0]);
scanf("%d",&s->success.score[1]);
scanf("%d",&s->success.score[2]);
scanf("%d",&s->success.score[0]);
s->success.sum=0;
s->success.ave=0;
s->success.order=0;
s->next=NULL;
r->next=s; //尾插法
r=s;
flushall();
printf("是否继续输入学生记录(Y/N):");
ch=getchar();
}while(ch=='Y'||ch=='y');
}
//文件读取学生信息
void readfromfile(Student*head)
{
FILE*fp;
Student stu,*p,*q;
p=head;
if((fp=fopen("stuinfo.dat","rb"))==NULL)
{
printf("不能打开文件\n");
return;
}
fred(&stu,sizeof(stu),1,fp);
while(!feof(fp))
{
q=(Student*)malloc(sizeof(Student));
*q=stu;
q->next=NULL;
p->next=q;
p=q;
fread(&stu,sizeof(stu),1,fp);
}
fclose(fp);
}
//数据统计
Student*searchbyno(Student*head,char*no)
{
Student*p; //移动指针
p=head->next;
while(p!=NULL&&strcmp(p->no,no))
p=p->next; //移动指针,指向下一结点
return p;
}
//按照姓名查找记录
int searchbyname(Student*head,char*name)
{
Student*p;
int flag=0;
system("cls");
p=head;
while(p->next!=NULL)
{
p=p->next;
if(strcmp(p->name,name)==0)
{
flag=1; //查找成功
printsinglestu(p); //输出学生信息
}
}
return flag;
}
//计算总分和平均分
void compute(Student*head)
{
Student*p;
int i;
p=head->next;
while(p!=NULL)
{
p->success.sum=0;
for(i=0;i
{
p->success.sum+=p-success.score[i];
}
p->success.ave=(float)p->success.sum/n;
p=p->next;
}
printstuinfo(head); //显示所有学生信息
savetofile(head,"stuinfo.dat"); //保存信息至文件
}
void sort(Student *head)
{
int i=0;
Student *p,*q,*t,*h,h1;
if(head->next==NULL)
{
printf("空表\n\n");
return;
}
h1=head->next->next;
head->next->next=NULL;
while(h!=NULL)
{
t=h1;
h1=h1->next;
p=h1->next;
q=h1->next;
while(p!=NULL&&t->success.sumsuccess.sum)//进行总分比较
{
q=p;
p=->next;
}
if(p==q)
{
t->next=p;
head->next=t;
}
else
{
t->next=p;
q->next=t;
}
}
p=head;
while(p->next!=NULL)
{
i++;
p=p->next;
p->sucess.order=i;
}
printf("排序成功!\n");
printstuinfo(head);
savetofile(head,"stuinfosort.dat");
}
void insertnode(Student *head)
{
char no[10];
Student *p,*q,*r;
int f=1;
q=(Student *)malloc(sizeof(Student));
printf("请输入要插入的学生的信息\n");
printf("请输入学生的学号:");
gets(q->no);
while(f&&head->next!=NULL)
{
r=searchbyno(head,q->no);
if(r==NULL)
{
break;
}
else
{
printf("该学号已经存在,请重新输入\n");
printf("请重新输入学生的学号:");
gets(q->no);
}
}
printf("请输入学生的姓名:");
gets(q->name);
printf("请输入学生的性别:");
q->sex=getchar();
printf("请输入学生的年龄:");
scanf("%d",&q->age);
printf("请输入学生的三门课程成绩:");
scanf("%d",&q->success.socre[0]);
scanf("%d",&q->success.socre[1]);
scanf("%d",&q->success.socre[2]);
q->success.sum=0;
q->success.ave=0.0;
q->success.order=0;
flushall();
printf("请输入该学生信息插入的位置(插入该学号之后)");
gets(no);
if(p==NULL)
{
printf("没有找到需要插入的位置,新学生信息自动插入到最后!\n");
p=head;
while(p-next!=NULL)
{
p=p->next;
}
q->next=NULL;
p->next=q;
}
else
{
q->next=p->next;
p->next=q;
}
//手动保存或者自动保存savetofile(head,"stuinfo.dat");
}
void modifystuinfo(Student *head)
{
char no[10];
Student *p;
int i;
system("cls");
printf("请输入要修改学生信息的学号:");
gets(no);
p=searchbyno(head,no);
if(p==NULL)
{
printf("没有找到该学生!\n");
}
else
{
printf("学号\t姓名\t性别\t年龄\t课程成绩\n");
printf("%s\t%s\t%c\t%d\t%3d%3d%3d\n",p->no,p->name,p->sex,p->age,p->success.socre[0],p->success.score[1],p->success.socre[2]);
printf("请输入修改后的学生信息:\n");
printf("请输入学生的姓名:");
gets(p->name);
printf("请输入学生的性别:");
p-sex=getchar();
printf("请输入学生的年龄:");
scanf("%d",&p->age);
printf("请输入学生的三门课程成绩:");
scanf("%d",&q->success.socre[0]);
scanf("%d",&q->success.socre[1]);
scanf("%d",&q->success.socre[2]);
for(i=0;i
{//重新计算总分与平均分
p-success.sum=p->success.score[i];
}
p->success.ave=(float)p->success.sum/N;
}
//手动或自动保存 savetofile(head,"stuinfo.dat");
}
void deletenode(Student *head)
{
char no[10];
Student *p,*q;
system("cls");
printf("请输入要删除学生信息的学号:");
gets(no);
q=head
while(q-next&&strcmp(q->next->no,no)!=0)
{
q=q->next;
}
if(q==NULL)
{
printf("没有找到该学生!\n");
}
else
{
p=q->next;
q->next=p->next;
free(p);
}
}
void printfstuinfo(Student *head)
{
Student *p;
p=head->next;
system("cls");
if(p==NULL)
{
printf("没有记录!");
}
else
{
printf("学号\t姓名\t性别\t年龄\t课程成绩\t总成绩\t平均成绩\t名次\n");
while(p!=NULL)
{
printf("%s\t%s\t%c\t%d\t%3d%3d%3d\t%d\t%8.2f\t%d\n",p->no,p-name,p-sex,p->age,p->success.socre[0],p->success.score[1],p->success.socre[2],p->success.sum,p->success.ave,p->success.order);
p=p->next;
}
}
}
void printsinglestu(Student *p)
{
printf("学号\t姓名\t性别\t年龄\t课程成绩\t总成绩\t平均成绩\t名次\n");
printf("%s\t%s\t%c\t%d\t%3d%3d%3d\t%d\t%8.2f\t%d\n",p->no,p-name,p-sex,p->age,p->success.socre[0],p->success.score[1],p->success.socre[2],p->success.sum,p->success.ave,p->success.order);
void savetofile(Student *head,char *filename)
{
FILE *fp;
Student stu,*p;
p=head->next;
if((fp=fopen(filename,"wb"))==NULL
{
printf("不能打开文件\n");
return;
}
do
{
stu=*p
fwrite(&stu,sizeof(stu),1,fp);
p=p->next;
}while(p);
fclose(fp);
}
void copy()
{
FILE *fp1,*fp2;
Student stu;
if(fp1=fopen("stuinfo.dat,"rb"))==NULL)
{
printf("不能打开文件\n");
return;
}
if((fp2=fopen("stuinfocopy.dat,"wb"))==NULL)
{
printf("不能打开文件\n");
return;
}
fread(&stu,sizeof(stu),1,fp1);
while(!feof(fp1))
{
fread(&stu,sizeof(stu),1,fp2);
fread(&stu,sizeof(stu),1,fp1);
}
fclose(fp1);
fclose(fp2);
}