📄 成绩管理.c
字号:
# include <stdlib.h>
# include <conio.h>
# include <stdio.h>
# include <string.h>
# include <malloc.h>
# define NULL 0
# define LEN sizeof(struct student)
# define M 10
# define N 3
/*学生*/
struct student
{
long numb;
char student_name[100];
float score[N];
float student_average;
struct student *next;
};
/*功课*/
struct courses
{
char course_name[100];
}course[N];
/*data文件的存储*/
void save(struct student *head)
{
int j;
FILE *fp;
struct student *p;
p=head;
if((fp=fopen("data","wb"))==NULL)
{
printf("cannot open file\n");
return;
}
for(j=0;j<N;j++)
if(fwrite(&course[j],sizeof(struct courses),1,fp)!=1)
printf("File write error!");
for(p=head;p!=NULL;p=p->next)
if(fwrite(p,LEN,1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
/*读取data文件的数据*/
void load(struct student *head)
{
int j=0;
FILE *fp;
struct student *p;
p=head;
if((fp=fopen("data","rb"))==NULL)
{
printf("\n\n\n\t\tFile cannot be opened!\n\n\t\tPlease input student data first!");
printf("\n\n\n\n\t\tIf you have inputted data,please try again!!!");
getch();
exit(0);
}
for(j=0;j<N;j++)
fread(&course[j],sizeof(struct courses),1,fp);
for(p=head;p!=NULL;p=p->next)
fread(p,LEN,1,fp);
}
/*输入单链表的相关数据*/
struct student *creat(struct student *head)
{
int j=0;
int i=0;
FILE *fp;
struct student *p;
p=head;
printf("\n\n\n\n**********************************数据的输入***********************************\n\n");
printf("\n\t#######请输入这%d门课的名字:#########\n\n",N);
for(j=0;j<N;j++)
{
printf("\n\t\t◎◎◎◎◎◎第%d门课是: ",j+1);
scanf("%s",course[j].course_name);
}
printf("\n\n\n\t#######请输入这%d名学生的数据及成绩的名字:#########\n\n",M);
for(p=head;p!=NULL;p=p->next)
{
i++;
printf("\n\n\t\t◎◎◎◎◎◎第%d名学生: ",i);
printf("\n\t\t\t姓名:");
scanf("%s",p->student_name);
printf("\n\t\t\t学号:");
scanf("%d",&p->numb);
for(j=0;j<N;j++)
{
printf("\n\t\t\t%s得分:",course[j].course_name);
scanf("%f",&p->score[j]);
}
}
return(head);
save(head);
}
/*输出数据列表*/
void print1(struct student *head)
{
int i=0;
int j;
float s;
struct student *p;
printf("\n\n\n\n\n\n===============信息03-3班学生成绩列表===========================================\n\n");
printf("\n\n\n\t学号 姓名 ");
for(j=0;j<N;j++)
printf("%-8s",course[j].course_name);
printf("总分 平均分");
p=head;
while(p!=NULL)
{
i=i+1;
for(j=0,s=0;j<N;j++)
{
s=s+p->score[j];
}
p->student_average=s/N;
printf("\n\t%-10d%-7s",p->numb,p->student_name);
for(j=0;j<N;j++)
printf("%-8.2f",p->score[j]);
printf("%-9.2f",s);
printf("%-8.2f",p->student_average);
p=p->next;
}
printf("\n\n\n\n\n\n======================================================DATA TABLE================\n\n");
getch();
}
/*输出排序列表*/
void print2(struct student *head)
{
int i=0;
int j;
float s;
struct student *p;
printf("\n\n\n\n\n\n===============信息03-3班学生成绩排序列表=======================================\n\n");
printf("\n\n\n\t学号 姓名 ");
for(j=0;j<N;j++)
printf("%-8s",course[j].course_name);
printf("总分 平均分 名次");
p=head;
while(p!=NULL)
{
i=i+1;
for(j=0,s=0;j<N;j++)
{
s=s+p->score[j];
}
p->student_average=s/N;
printf("\n\t%-10d%-7s",p->numb,p->student_name);
for(j=0;j<N;j++)
printf("%-8.2f",p->score[j]);
printf("%-9.2f",s);
printf("%-8.2f",p->student_average);
printf("%-7d",i);
p=p->next;
}
printf("\n\n\n\n\n\n=================================================DATA SORT TABLE================\n\n");
getch();
}
/*根据平均成绩对学生进行排序*/
void sort(struct student *head)
{
struct student *m,*p,*s,*a;
int change=1;
a=(struct student * )malloc(LEN);
m=a;
m->next=head;
p=head;
s=p->next;
while (change)
{
change=0;
while(p&&s)
{
if(p->student_average>=s->student_average)
{
m=p;
p=s;
s=s->next;
}
else
{
p->next=s->next;
s->next=p;
m->next=s;
if(p==head)head=s;
change=1;
m=s;
s=p->next;
}
}
m=a;
m->next=head;
p=head;
s=p->next;
}
printf("排序后:\n");
print2(head);
}
/*主菜单显示页面*/
void display()
{
printf("\n\n\n");
printf("\n\n\n==========================信息03-3班学生成绩管理系统=======================\n\n");
printf("\n\t\t\t1: 信息03-3班学生成绩列表 \n");
printf("\n\t\t\t2: 根据平均成绩进行排序 \n");
printf("\n\t\t\t3: 重新输入学生数据及成绩\n");
printf("\n\t\t\t0: 退出系统\n");
printf("\n\n\n====================================================主菜单=================\n");
printf("\n\t\t\t 请选择(填入0~3中的一个数字): ");
}
/*主函数*/
main(void)
{
int c,i;
struct student *head,*p1,*p2;
p1=p2=(struct student * )malloc(LEN);/*建立一个单链表*/
head=p1;
for(i=1;i<M;i++)
{
p2=(struct student * )malloc(LEN);
p1->next=p2;
p1=p2;
}
p1->next=NULL;
do
{ display();
scanf("%d",&c);
switch(c)
{
case 1:
load(head);
print1(head);
save(head);
break;
case 2:
load(head);
sort(head);
break;
case 3:
creat(head);
print1(head);
save(head);
break;
case 0:
printf("\n\n\n\n\t\t\t谢谢使用!");
break;
default:
printf("\n\n\n\n\t\t\t 没有这个选项!");
break;
}
}while(c!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -