#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define Size sizeof(struct Student)
struct Student *p = NULL;
typedef struct Student
{
int grade;
long student_number;
char name[20];
char course[20];
float usual_score;
float test_score;
float total_score;
struct Student *next;
} S;
void print_char()
{
printf("********************************************************************************\n");
}
void print_menu()
{
printf("学生成绩管理系统\n\n");
printf("1、输入学生信息\n");
printf("2、修改学生信息\n");
printf("3、删除学生信息\n");
printf("4、按姓名查询\n");
printf("5、按班级查询\n");
printf("6、按学号查询\n");
printf("7、按课程名称查询\n");
printf("8、按总分高低排序\n");
printf("9、单科成绩排名\n");
printf("10、查询班级优秀率\n");
printf("11、查询课程最高分,最低分\n");
printf("12、输出文件学生信息\n");
printf("13、退出系统\n");
}
void print(S *head)
{
printf("所有信息如下:\n");
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
S *ptr = head;
while( ptr != NULL)
{
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",ptr->grade,ptr->student_number,ptr->name,ptr->course,ptr->usual_score,ptr->test_score,ptr->total_score);
ptr = ptr->next;
}
}
S *creat_file()
{
void print();
unsigned n;
S *head,*node,*end;
FILE *fp;
if((fp = fopen("date_students.txt","r")) == NULL)
{
printf("connot open the file\n");
exit(0);
}
fscanf(fp,"%d",&n);
printf("文件学生信息:\n");
head = (S*)malloc(Size);
fscanf(fp,"%d%ld%s%s%f%f",&head->grade,&head->student_number,head->name,head->course,&head->usual_score,&head->test_score);
head->total_score = head->usual_score*0.2 + head->test_score*0.8;
end = head;
for(int i = 2; i <= n; i++)
{
node = (S*)malloc(Size);
end->next = node;
end = node;
fscanf(fp,"%d%ld%s%s%f%f",&node->grade,&node->student_number,node->name,node->course,&node->usual_score,&node->test_score);
node->total_score =node->usual_score*0.2 +node->test_score*0.8;
}
end->next = NULL;
return head;
}
S *creat()
{
void print();
FILE *fp;
unsigned n;
if((fp = fopen("T_date.txt","w")) == NULL)
{
printf("connot open the file\n");
exit(0);
}
printf("有多少组学生数据:\n");
scanf("%u",&n);
if(n == 0)
exit(0);
printf("请依次输入%d组数据:",n);
printf("班级 学号 姓名 科目 平时成绩 考试成绩\n");
fprintf(fp,"班级 学号 姓名 科目 平时成绩 考试成绩\n");
S *head,*node,*end;
head = (S*)malloc(Size);
scanf("%d%ld%s%s%f%f",&head->grade,&head->student_number,head->name,head->course,&head->usual_score,&head->test_score);
head->total_score = head->usual_score*0.2 + head->test_score*0.8;
fprintf(fp,"%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",head->grade,head->student_number,head->name,head->course,head->usual_score,head->test_score,head->total_score);
end = head;
for(int i = 2; i <= n; i++)
{
node = (S*)malloc(Size);
end->next = node;
end = node;
scanf("%d%ld%s%s%f%f",&node->grade,&node->student_number,node->name,node->course,&node->usual_score,&node->test_score);
node->total_score =node->usual_score*0.2 +node->test_score*0.8;
fprintf(fp,"%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",node->grade,node->student_number,node->name,node->course,node->usual_score,node->test_score,node->total_score);
}
end->next = NULL;
fclose(fp);
return head;
}
S* change(S *head)
{
int i = 1,n = 0;
S *t = head;
printf("修改第几个学生的信息\n");
scanf("%d",&n);
while(i < n && t != NULL )
{
t = t->next;
i++;
}
if(n != 0 && t != NULL)
{
printf("请输入要修改学生的信息:\n");
scanf("%d%ld%s%s%f%f",&t->grade,&t->student_number,t->name,t->course,&t->usual_score,&t->test_score);
t->total_score =t->usual_score*0.2 +t->test_score*0.8;
}
else
puts("结点不存在!\n");
return head;
}
S * delet(S *head)
{
int i = 1,n = 0;
printf("删除第几个学生信息:\n");
scanf("%d",&n);
S* t = head, *in;
if(n == 1)
{
in = t;
head = head->next;
free(in);
}
else
{
while (i < n && t != NULL)
{
in = t;
t = t->next;
i++;
}
if (n != 0 && n != 1&& t != NULL)
{
in->next = t->next;
free(t);
}
else
{
puts("结点不存在");
}
}
return head;
}
void serch_number(S *head)
{
long student_number;
int flag = 1,i = 1;
printf("请输入需要查询的学号:\n");
scanf("%ld",&student_number);
S *t = head;
while(t != NULL)
{
while(t != NULL && t->student_number != student_number )
t = t->next;
if(t != NULL)
{
if(i)
{
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
i = 0;
}
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
flag = 0;
}
else
break;
t = t->next;
}
if(flag)
printf("没有学号为%ld学生信息\n",student_number);
}
void serch_date(S *head,char date[])
{
S *t = head;
int flag = 1,i = 1;
while( t != NULL )
{
while( t != NULL && strcmp(t->name,date) != 0 )
t = t->next;
if(t != NULL)
{
if(i)
{
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
i = 0;
}
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
flag = 0;
}
else
break;
t = t->next;
}
if(flag)
printf("没有%s信息\n",date);
}
void serch_grade(S *head,int grade)
{
S *t = head;
int flag = 1,i = 1;
while(t != NULL)
{
while( t != NULL && t->grade != grade )
t = t->next;
if(t != NULL)
{
if(i)
{
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
i = 0;
}
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
flag = 0;
}
else
break;
t = t->next;
}
if(flag)
printf("没有%d班信息\n",grade);
}
void serch_date_course(S *head,char date[])
{
S *t = head;
int flag = 1,i = 1;
while(t != NULL)
{
while( t != NULL && strcmp(t->course,date) != 0 )
t = t->next;
if(t != NULL)
{
if(i)
{
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
i = 0;
}
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
flag = 0;
}
else
break;
t = t->next;
}
if(flag)
printf("没有%s信息\n",date);
}
S *sort_total_score(S *head)
{
S *q = head,*p;
int temp1;
long temp2;
char temp3[20];
char temp4[20];
float temp5;
float temp6;
float temp7;
for( ; q!=NULL ; q = q->next)
for(p = q->next; p != NULL; p = p->next )
{
if( q->total_score < p->total_score )
{
temp1 = p->grade;
temp2 = p->student_number;
strcpy(temp3, p->name ) ;
strcpy( temp4, p->course) ;
temp5 = p->usual_score;
temp6 = p->test_score ;
temp7 = p->total_score ;
p->grade = q->grade;
p->student_number = q->student_number;
strcpy( p->name, q->name ) ;
strcpy( p->course, q->course) ;
p->usual_score = q->usual_score;
p->test_score = q->test_score ;
p->total_score = q->total_score ;
q->grade = temp1;
q->student_number = temp2;
strcpy(q->name, temp3 ) ;
strcpy( q->course, temp4) ;
q->usual_score = temp5;
q->test_score = temp6 ;
q->total_score = temp7 ;
}
}
return head;
}
void sort_one_course(S *head,char course[])
{
S *t = head;
int flag = 1,i = 1;
sort_total_score(head);
while(t != NULL)
{
while( t != NULL && strcmp(t->course,course) != 0)
t = t->next;
if(t != NULL)
{
if(i)
{
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
i = 0;
}
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",t->grade,t->student_number,t->name,t->course,t->usual_score,t->test_score,t->total_score);
flag = 0;
}
else
break;
t = t->next;
}
if(flag)
printf("没有%s信息\n",course);
}
void grade_great_number(S *head,int grade)
{
float num1 = 0,num2 = 0,num3 = 0;
int flag = 0;
S *t = head;
while(t != NULL)
{
while( t != NULL && t->grade != grade )
t = t->next;
if(t != NULL)
{
flag = 1;
num1++;
if(t->total_score >= 90)
num2++;
else if(t->total_score < 60)
num3++;
}
else
break;
t = t->next;
}
if(flag)
printf("%d班:\n优秀率:%-5.2f%% 不及格率:%-5.2f%%\n",grade,(num2/num1)*100,(num3/num1)*100) ;
else
printf("没有%d班信息!\n",grade);
}
S *sort_one_course1(S *head,char course[])
{
S *t = head, *min = NULL;
int flag = -1;
sort_total_score(head);
while(t != NULL)
{
while(t != NULL && strcmp(t->course,course) != 0 )
t = t->next;
if(t != NULL)
{
flag ++;
}
else
break;
min = t;
t = t->next;
}
if(flag)
return min;
else
return NULL;
}
void sort_m(S *head,char course[] )
{
S *t = head,*max,*min =sort_one_course1(head,course) ;
sort_total_score(head);
while( t != NULL && strcmp(t->course,course) != 0 )
{
t = t->next;
if(t == NULL)
break ;
}
max = t;
if(max != NULL)
{
printf("%s最大值学生信息:\n",course);
printf("班级 \t 学号\t 姓名\t 科目 平时成绩 考试成绩 总成绩\n");
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",max->grade,max->student_number,max->name,max->course,max->usual_score,max->test_score,max->total_score);
}
else
{
printf("没有%s课程信息\n",course);
return;
}
if(min != NULL)
{
printf("%s最小值学生信息:\n",course);
printf("%d\t%ld\t%-10s %-10s %.2f %.2f %.2f\n",min->grade,min->student_number,min->name,min->course,min->usual_score,min->test_score,min->total_score);
}
else
printf("%s只有1个同学信息,不存在最值\n",course);
}
void mean_in(int num)
{
char date[20],course[20];
int grade;
switch(num)
{
case 1:
{
p = creat();
print(p);
}
break;
case 2:
print(change(p));
break;
case 3:
{
p =delet(p);
print(p);
}
break;
case 4:
{
printf("请输入需要查询的姓名:\n");
getchar();
serch_date(p, gets(date));
}
break;
case 5:
{
printf("请输入要查询的班级:\n");
scanf("%d",&grade);
serch_grade(p,grade);
}
break;
case 6:
serch_number(p);
break;
case 7:
{
printf("请输入需要查询的课程名:\n");
getchar();
serch_date_course(p,gets(date));
}
break;
case 8:
print(sort_total_score(p)) ;
break;
case 9:
{
printf("请输入需要排序的课程名:\n");
getchar();
sort_one_course(p,gets(course));
}
break;
case 10:
{
printf("请输入需要查询的班级:\n");
scanf("%d",&grade);
grade_great_number(p,grade);
}
break;
case 11:
{
printf("请输入需要查询的课程的最值:\n");
getchar();
sort_m(p, gets(course));
}
break;
case 12:
{
p = creat_file();
print(p);
}
break;
case 13:
exit(0);
break;
}
}
int main()
{
int num = 0;
print_menu();
print_char();
while(1)
{
printf("请选择功能序号(1——13)\n");
scanf("%d",&num);
if(!(num >= 1 && num <= 13))
{
printf("功能选择有误,请重新选择\n");
scanf("%d",&num);
}
mean_in(num);
print_char();
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通