📄 学生管理系统.c
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define LEN sizeof(struct student)
typedef struct student
{ int num;
char name[15];
char glade[10];
int math;
int eng;
int comp;
struct student *next;
}st;
void *load()
{
st *p,*q,*h;
FILE *fp;
if((fp=fopen("data.txt","rb"))==NULL)
{
printf("Cant't open file\n");
exit(1);
}
p=(st *)malloc(LEN);
if(!p)
{
printf("数据为空!\n");
}
h=p;
rewind(fp);
while(!feof(fp))
{
fscanf(fp,"%d%s%s%d%d%d",&p->num,p->name,p->glade,&p->math,
&p->eng,&p->comp);
p->next=(st *)malloc(LEN);
if(!(p->next))
{
printf("数据结束!\n");
return h;
}
q=p;
p=p->next;
}
q->next=NULL;
fclose(fp);
return h;
}
st *sort(st *h)
{
st *p,*q,*t,*h0;
h0=h->next;
h->next=NULL;
while(h0!=NULL)
{
t=h0;
h0=h0->next;
p=h;
q=h;
while(strcmp(t->glade,p->glade)<0&&p!=NULL)
{
q=p;
p=p->next;
}
if(q == p)
{
t->next=p;
h=t;
}
else
{
t->next=p;
q->next=t;
}
}
return h;
}
st *sort1(st *h)
{
float ave1,ave2;
st *p,*q,*t,*h0;
h0=h->next;
h->next=NULL;
while(h0!=NULL)
{ p=h;
q=h;
t=h0;
h0=h0->next;
while(strcmp(t->glade,p->glade)==0&&p!=NULL)
{
ave1=(float)(t->math+t->eng+t->comp)/3;
ave2=(float)(p->math+p->eng+p->comp)/3;
if(ave1<ave2)
{
q=p;
p=p->next;
}
else break;
}
if(q == p)
{
t->next=p;
h=t;
}
else
{
t->next=p;
q->next=t;
}
}
return h;
}
void print(st *h)
{
st *p;
p=h;
printf("\n\t学号 姓名 班级 数学 英语 计算机 平均分\n");
printf("\t************************************************************************\n\n");
while(p->next!=NULL)
{
printf("\t %d \t%-16s%s\t%d\t%d\t%d\t%.2f\n",p->num,p->name,p->glade,
p->math,p->eng,p->comp,(float)(p->math+p->eng+p->comp)/3);
if(strcmp(p->glade,p->next->glade)!=0&&p->next!=NULL)
printf("\n");
p=p->next;
}
printf("\t***********************************************************************\n");
}
void *findnum(st *h)
{
st *p;
int num;
p=h;
printf("请输入学生学号:\n");
scanf("%d",&num);
while(p->next!=NULL)
{
if(num==p->num)
{printf("\n\t学号 姓名 班级 数学 英语 计算机 平均分\n");
printf("\t %d \t%-16s%s\t%d\t%d\t%d\t%.2f\n",p->num,p->name,p->glade,
p->math,p->eng,p->comp,(float)(p->math+p->eng+p->comp)/3);break;}
p=p->next;
}
if(p->next==NULL)
printf("该学号不存在!\n");
}
void *findname(st *h)
{
st *p;
char name[15];
p=h;
printf("请输入学生姓名:\n");
scanf("%s",name);
while(p->next!=NULL)
{
if(strcmp(name,p->name)==0)
{printf("\n\t学号 姓名 班级 数学 英语 计算机 平均分\n");
printf("\t %d \t%-16s%s\t%d\t%d\t%d\t%.2f\n",p->num,p->name,p->glade,
p->math,p->eng,p->comp,(float)(p->math+p->eng+p->comp)/3);break;}
p=p->next;
}
if(p->next==NULL)
printf("该学生姓名不存在!\n");
}
void tongji(st *h)
{st *p;
char glade[10],subject[6];
int i=0,e1=0,e2=0,sum=0;
printf("请输入要统计的班级:\n");
scanf("%s",glade);
if(strlen(glade)>10)
{ printf("班级名称过长!\n");return;}
printf("请输入要统计的科目:\n");
printf("(数学:math 英语:eng 计算机:comp)\n");
scanf("%s",subject);
if(strlen(subject)>6)
printf("科目名称过长!\n");
p=h;
while(p->next!=NULL)
{if(strcmp(p->glade,glade)==0)
{
i++;
if(strcmp("math",subject)==0)
{if(p->math>80)e1++;
if(p->math>60)e2++;
sum+=p->math;}
else if(strcmp("eng",subject)==0)
{if(p->eng>80)e1++;
if(p->eng>60)e2++;
sum+=p->eng;}
else if(strcmp("comp",subject)==0)
{if(p->comp>80)e1++;
if(p->comp>60)e2++;
sum+=p->comp;}
}
p=p->next;
}
if(i==0)
printf("你所查找的未能找到!\n");
else
{printf("\t班级 科目 平均分 优秀率 及格率\n");
printf("\t%s%10s%10.2f%6d%%%8d%%\t\n",glade,subject,(float)sum/i,e1*100/i,e2*100/i);}
}
void menu()
{printf("\t\t ***欢迎使用学生管理系统!***\n");
printf("\t\t **************************************************\n");
printf("\t\t| 1.按班级与成绩显示学生的信息 |\n");
printf("\t\t| 2.通过学号查找学生信息 |\n");
printf("\t\t| 3.通过学生姓名查找学生信息 |\n");
printf("\t\t| 4.统计各班的优秀,及格率 |\n");
printf("\t\t| 5.退出系统 |\n");
printf("\t\t **************************************************\n");
}
main()
{
int i;
char ch;
st *head;
star:menu();
printf("请输入你的选择:\n");
scanf("%d",&i);
system("cls");
switch(i)
{
case 1:
{head=load(head);
head=sort(head);
head=sort1(head);
print(head);
printf("press the enter to continue!\n");
getch();
system("cls");
goto star;}
case 2:
{head=load();
findnum(head);
printf("press the enter to continue!\n");
getch();
system("cls");
goto star;}
case 3:
{head=load();
findname(head);
printf("press the enter to continue!\n");
getch();
system("cls");
goto star;}
case 4:
{head=load();
tongji(head);
printf("press the enter to continue!\n");
getch();
system("cls");
goto star;}
case 5:
{printf("是否退出系统?(y/n)\n");
getchar();
ch=getchar();
getchar();
if(ch=='y'||ch=='Y')
exit(0);
else
{
printf("press the enter to continue!\n");
getch();
system("cls");
goto star;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -