#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <ctype.h>
#define num 3
int max[num]={0},min[num]={100,100,100},sum[num]={0};
int count=0; //成绩记录条数(计数器)
double average[num]={0};
char filename[20];
typedef struct student
{
char name[20];
char xue[20];
int chinese;
int math;
int english;
struct student *next;
}student;
student *head=NULL;
void Print() //打印函数
{ char name[20];
char xue[20];
int chinese;
int math;
int english;
FILE *fpp;
if((fpp=fopen(filename,"r+"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
printf("\t姓名\t学号\t语文\t数学\t英语\n");
printf("--------------------------------------------------\n");
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
printf("\t%s\t%s\t%d\t%d\t%d\n",name,xue,chinese,math,english);
}
fclose(fpp);
}
void Sum() //各科目总分求和函数
{
sum[0]=sum[1]=sum[2]=0;
char name[20];
char xue[20];
int chinese;
int math;
int english;
FILE *fpp;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
sum[0]+=chinese;
sum[1]+=math;
sum[2]+=english;
}
fclose(fpp);
}
void Average() //各科目求平均函数
{
average[0]=sum[0]*1./count;
average[1]=sum[1]*1./count;
average[2]=sum[2]*1./count;
printf("\t 各科平均分\n");
printf("\t语\t数\t英\n");
printf("----------------------------------------\n");
printf("\t%.2lf\t%.2lf\t%.2lf\n",average[0],average[1],average[2]);
}
void Fcount() //统计文件中的记录条数
{
FILE *fpp;
char name[20];
char xue[20];
int chinese;
int math;
int english;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
count++;
}
fclose(fpp);
}
void Add() //添加一个节点
{
student *p,*pp;
student *p5;
FILE *fpp;
char name[20];
char xue[20];
int i,n;
printf("请输入您要添加第N条记录:\n");
scanf("%d",&n);
p=head;
i=1;
if(n>count+1) //所要添加的位置大于文件数据的总长
printf("找不到该节点!\n");
else
{
if(n==1) //添加到第一个节点(作为头结点)
{
pp=(student *)malloc(sizeof(student));
printf("请输入该学生的名字与学号:\n");
getchar();
scanf("%s %s",name,xue);
printf("请分别输入语数英成绩:\n");
scanf("%d %d %d",&pp->chinese,&pp->math,&pp->english);
strcpy(pp->name,name);
strcpy(pp->xue,xue);
pp->next=p;
head=pp;
count++;
}
else
{
while(i<n-1)
{
i++;
p=p->next;
}
pp=(student *)malloc(sizeof(student));
printf("请输入该学生的名字与学号:\n");
getchar();
scanf("%s %s",name,xue);
printf("请分别输入语数英成绩:\n");
scanf("%d %d %d",&pp->chinese,&pp->math,&pp->english);
strcpy(pp->name,name);
strcpy(pp->xue,xue);
pp->next=p->next;
p->next=pp;
count++;
}
}
if((fpp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
p5=head;
while(p5->next!=NULL)
{
fputs(p5->name,fpp);
fputc(' ',fpp);
fputs(p5->xue,fpp);
fputc(' ',fpp);
fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
fputc('\n',fpp);
p5=p5->next;
}
fclose(fpp);
}
void Delect() //删除一个节点
{
struct student *p,*pp;
struct student *p5;
FILE *fpp;
int i,n;
printf("请输入您要删除第N条记录:\n");
scanf("%d",&n);
p=head;
i=0;
if(n>count) //所要删除的位置大于文件数据的总长
printf("找不到该节点!\n");
else
{
if(n==1) //删除第一个节点(头结点后移)
{
head=p->next;
free(p);
printf("删除成功!\n");
}
else
{
while(i<n-2 && p->next!=NULL)
{
i++;
p=p->next;
}
pp=p->next;
p->next=pp->next;
free(pp);
printf("删除成功!\n");
}
count--;
}
if((fpp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
p5=head;
while(p5->next!=NULL)
{
fputs(p5->name,fpp);
fputc(' ',fpp);
fputs(p5->xue,fpp);
fputc(' ',fpp);
fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
fputc('\n',fpp);
p5=p5->next;
}
fclose(fpp);
}
void Collect(int a,int b) //成绩筛选函数
{
char name[20];
char xue[20];
int chinese;
int math;
int english;
FILE *fpp;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
if((chinese+math+english)>=a && (chinese+math+english)<=b)
printf("%s:%d\n",name,(chinese+math+english));
}
fclose(fpp);
}
int Find(char s[]) //成绩查改函数
{
student *p5;
char name[20];
char xue[20];
int chinese;
int math;
int english;
FILE *fpp;
int flag=0,fen;
char course,col,pan;
count=0;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
if(strcmp(name,s)==0)
{
printf("语:%d\n数:%d\n英:%d\n",chinese,math,english);
flag=1;
break;
}
}
if(flag==1)
{
printf("已找到该同学\n");
}
else
{
printf("该同学不存在\n");
return 0;
}
printf("请输入是否要修改成绩:(y/n)\n");
getchar();
scanf("%c",&pan); //是否要修改成绩的标志
if(pan=='n')
return 0;
else if(pan=='y')
{
p5=head;
if((fpp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
printf("请输入要改的科目的首字母:(c,m,e)\n");
getchar();
scanf("%c",&course);
printf("请输入该科目的正确数据:\n");
scanf("%d",&fen);
while(p5->next!=NULL)
{
if(strcmp(p5->name,s)==0)
{
if(course=='c')
{
p5->chinese=fen;
}
else if(course=='m')
{
p5->math=fen;
}
else if(course=='e')
{
p5->english=fen;
}
break;
}
p5=p5->next;
}
p5=head;
while(p5->next!=NULL)
{
fputs(p5->name,fpp);
fputc(' ',fpp);
fputs(p5->xue,fpp);
fputc(' ',fpp);
fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
fputc('\n',fpp);
p5=p5->next;
}
}
else
{
printf("你输入的指令无效!\n");
return 0;
}
fclose(fpp);
}
void Comp() //成绩排序函数
{
struct student *p5,*p6,*p1,*p2,*p3,*temp;
FILE *fpp;
int c,i;
if(count==1)
return 1;
else
{
for(i=1;i<count;i++)
{
p3=head;
p2=p3->next;
p1=p2->next;
if((p3->chinese+p3->math+p3->english)>(p2->chinese+p2->math+p2->english))
{
head=p2;
p2->next=p3;
p3->next=p1;
}
c=count-2;
p3=head;
p2=p3->next;
p1=p2->next;
while(c--)
{
if((p2->chinese+p2->math+p2->english)>(p1->chinese+p1->math+p1->english))
{
p2->next=p1->next;
p1->next=p2;
p3->next=p1;
}
p3=p3->next;
p2=p3->next;
p1=p2->next;
}
}
}
/*for(i=1;i<count;i++)
{
p5=head;
while(p5->next!=NULL)
{
p6=p5;
p5=p5->next;
if(p5->name[0]=='0' && p5->xue[0]=='0')
break;
if((p6->chinese+p6->math+p6->english)>(p5->chinese+p5->math+p5->english))
{
strcpy(_name,p6->name);
strcpy(p6->name,p5->name);
strcpy(p5->name,_name);
strcpy(_xue,p6->xue);
strcpy(p6->xue,p5->xue);
strcpy(p5->xue,_xue);
c=p6->chinese;
p6->chinese=p5->chinese;
p5->chinese=c;
c=p6->math;
p6->math=p5->math;
p5->math=c;
c=p6->english;
p6->english=p5->english;
p5->english=c;
}
}
} */
if((fpp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
p5=head;
while(p5->next!=NULL)
{
fputs(p5->name,fpp);
fputc(' ',fpp);
fputs(p5->xue,fpp);
fputc(' ',fpp);
fprintf(fpp,"%d %d %d",p5->chinese,p5->math,p5->english);
fputc('\n',fpp);
p5=p5->next;
}
fclose(fpp);
}
int menu_select() //菜单打印函数
{
char s;
int cn;
system("cls");
printf("\t*********************************\n");
printf("\t*\t 2B成绩系统\t\t*\n");
printf("\t*\t \t\t*\n");
printf("\t*\t1. 录入所有成绩\t\t*\n"); //Creat
printf("\t*\t2. 打印所有成绩\t\t*\n"); //Print
printf("\t*\t3. 排序输出成绩\t\t*\n"); //Comp
printf("\t*\t4. 添加一条记录\t\t*\n"); //Add
printf("\t*\t5. 删除一条成绩\t\t*\n"); //Delect
printf("\t*\t6. 查改单人成绩\t\t*\n"); //Find
printf("\t*\t7. 各科平均成绩\t\t*\n"); //Average
printf("\t*\t8. 总分区间筛选\t\t*\n"); //Collect
printf("\t*\t9. 退出\t\t\t*\n");
printf("\t*********************************\n");
printf("请输入数字1-9进入相应功能:");
do
{
s=getchar();
cn=(int)s-'0';
}while(cn<0 || cn>9);
return cn;
}
void Creat() //建立链表函数
{
char name[20],xue[20];
int n=0;
FILE *fp;
student *p1,*p2,*p,*temp;
head=NULL;
p=head;
if(p!=NULL)
{
for(p=head;p!=NULL;p=temp)
{
temp=p->next;
free(p);
}
if(p==NULL)
{
printf("内存释放成功!\n");
}
}
count=0;
if((fp=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
printf("请输入该学生的名字与学号(以0 0结束):\n");
getchar();
while(scanf("%s %s",name,xue)!=EOF) //尾插法建立链表
{
p1=(student *)malloc(sizeof(student));
n++;
if(n==1)
head=p1;
else
{
p2->next=p1;
}
if(name[0]=='0' && xue[0]=='0')
{
strcpy(p1->name,name);
strcpy(p1->xue,xue);
break;
}
printf("请分别输入语数英成绩:\n");
strcpy(p1->name,name);
strcpy(p1->xue,xue);
fputs(name,fp);
fputc(' ',fp);
fputs(xue,fp);
scanf("%d %d %d",&p1->chinese,&p1->math,&p1->english);
fputc(' ',fp);
fprintf(fp,"%d %d %d",p1->chinese,p1->math,p1->english);
fputc('\n',fp);
count++;
while(getchar()!='\n')
continue;
p2=p1;
printf("请输入该学生的名字与学号(以0 0结束):\n");
}
p1->next=NULL;
printf("总记录数:%d\n",count);
fclose(fp);
}
void Recreat() //重建立链表函数
{
student *p1,*p2;
char name[20];
char xue[20];
int chinese;
int math;
int english;
FILE *fpp;
int n1=0;
count=0;
if((fpp=fopen(filename,"r"))==NULL)
{
printf("打开文件失败!\n");
exit(0);
}
while(fscanf(fpp,"%s %s %d %d %d",name,xue,&chinese,&math,&english)==5)
{
count++;
p1=(student *)malloc(sizeof(student));
n1++;
if(n1==1)
head=p1;
else
p2->next=p1;
strcpy(p1->name,name);
strcpy(p1->xue,xue);
p1->chinese=chinese;
p1->math=math;
p1->english=english;
p2=p1;
}
p1=(student *)malloc(sizeof(student));
p1->name[0]='0',p1->xue[0]='0';
p2->next=p1;
p1->next=NULL;
fclose(fpp);
}
void menu_pri() //菜单功能调用函数
{
int a,b;
char mou[20];
student *p5,*temp;
Recreat();
for(;;)
{
switch(menu_select())
{
case 1:
count=0;
Creat();
system("pause");
break;
case 2:
Print();
system("pause");
break;
case 3:
Comp();
Print();
system("pause");
break;
case 4:
count=0;
Fcount();
Add();
Print();
system("pause");
break;
case 5:
count=0;
Fcount();
Delect();
Print();
system("pause");
break;
case 6:
printf("请输入该同学的名字:\n");
scanf("%s",mou);
Find(mou);
system("pause");
break;
case 7:
count=0;
Fcount();
Sum();
Average();
system("pause");
break;
case 8:
printf("请输入要选择成绩的区间:\n");
scanf("%d %d",&a,&b);
Collect(a,b);
system("pause");
break;
case 9:
p5=head;
for(p5=head;p5!=NULL;p5=temp)
{
temp=p5->next;
free(p5);
}
if(p5==NULL)
{
printf("内存释放成功!\n");
}
printf("Goodbye!\n");
exit(0);
}
}
}
int main()
{
printf("请输入保存成绩的文件名:\n");
scanf("%s",filename);
menu_pri();
return 0;
}
成绩管理(链表+文件)
最新推荐文章于 2021-12-25 14:40:22 发布