#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define M 20
struct Grade
{
int math;
int English;
int computer;
int PE;
};
typedef struct student
{
struct Grade grade;
char student_number[20];
char name[20];
char sex[2];
int old;
int total;
double average;
char key[20];
char leave_massage[100];
} Student;
struct link
{
Student stu;
struct link * next;
};
struct link *head=NULL;
void total_page_design();//系统的登录页面/总页面;
void help();//使用说明;
struct link * student_register(int * m);//学生登录;在登陆的同时就遍历链表,并返回当前节点的指针,之后的函数就不用再遍历,节省时间;
void teacher_register(int *m);//教师登录;
/**-----------------------------------------------------------------学生端函数声明----------------------------------------------------**/
#define N 2
void student_main();//学生端主函数;
void student_page_design();//学生端主页面设计;
struct student_register
{
char account[20];
char key[20];
};
struct student_register ST[N]= {{"729041065","123456"},{"123456","123456"}};
void reset_key(struct link * p);
void school_precaution(struct link * p);//学业预警;
void inquir_leave_message(struct link * p);//查询老师的留言;
/**-----------------------------------------------------------------教师端函数声明----------------------------------------------------**/
void teacher();//教师端主函数;
void Welcome_teather(void);//教师端总函数主菜单页面设计;
void record_grade(struct link *head);//分科目修改学生成绩
void Record();//记录学生信息的总页面(里面包含与记录成绩,记录基本信息先关的函数);
struct link * append(struct link *head);//创建学生链表;
void display(struct link *head );//用于测试啊;
int tuichu(int t);//退出学生管理系统;
void record_grade_yemiansheji();//录入学生成绩的页面设计;
void print_information(struct link *head);//打印全部学生的全部信息
void grade_record(struct link *head);//第一次记录学生的各科成绩;
int Count (struct link *head);//统计已经记录的学生人数;
void find_stu();//查找学生的信息的页面,以及实现选择功能;
void find_stu_by_num (struct link *head );//实现按名字查找学生的信息;
void find_stu_by_name (struct link * head);//实现按学号查找学生的信息;
void change (struct link * head);//修改学生的全部信息;
struct link * delete_stu(struct link * head);//删除学生的信息;
void find_unrecord_grade(struct link * head);//找出未记录成绩的学生,并补强制记录他的成绩;
void saveStu(); // 保存学生信息
void readStu(); // 读取学生信息
void information_exchange(struct link * p);//交换学生的所有信息;
void sort_by_average(struct link *head);//冒泡排序,平均分;
void sort_by_total(struct link * head);//冒泡排序,总分;
void sort_by_Eglish(struct link * head);
void sort_by_math(struct link * head);
void sort_by_PE(struct link * head);
void sort_by_computer(struct link * head);
void sort_yemiansheji();//排序的页面设计;
void statistical_analysis(struct link * head );//统计成绩数据,并分析数据,主页面;
void count_sorted_stu(int score[]);//统计不及格人数(<60),及格(60-70),中等(70-80),优秀(>80);
void copy_to_arry(struct link *head,int English[],int computer[],int PE[],int math[],int total[],int average[]);//将链表中的数复制到数组中;目的:脱离链表后,使统计函数具有可多次利用性,从而减少大量重复代码;
void print_conclum_diagram(int a,int b,int c,int d);//打印出彩色条形统计图;
void leave_massage();//老师留言
void color(short x) //自定义函根据参数改变颜色;
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
}
int main()
{
int t=1;
while(t)
{
total_page_design();
char ch=_getch();
switch(ch)
{
case '2':
system("cls");
teacher();
system("pause");
system("cls");
break;
case '1':
system("cls");
student_main();
system("pause");
system("cls");
break;
case '3':
t=tuichu(t);
color(11);
printf("记得五星好评哦!(^*^)\n");
color(7);
system("pause");
break;
case '4':
help();
system("pause");
system("cls");
break;
default:
color(4);
printf("您的输入有误,请重新输入。\n");
color(7);
system("pause");
system("cls");
break;
}
}
return 0;
}
struct link * student_register(int * m)//学生端登录;
{
struct link *p=head;
char account[20],key[20];
int i,n=3;
system("cls");
color(11);
printf("账号:");
scanf("%s",account);
for(p=head; p!=NULL; p=p->next)
{
if(strcmp(account,p->stu.student_number)==0)
{
FLAG3:
system("cls");
color(11);
printf("账号:%s\n",account);
printf("\n密码:");
scanf("%s",key);
if(strcmp(key,p->stu.key)==0)
{
color(11);
printf("登录成功!\n");
color(7);
system("pause");
return p;
}
else
{
color(4);
printf("密码错误!\您还有%d次机会\n",n);
if(n==0)
{
*m=1;
system("pause");
system("cls");
return NULL;
}
n--;
system("pause");
system("cls");
goto FLAG3;
color(7);
}
}
}
color(4);
printf("账号错误!\n");
color(7);
*m=1;
return NULL;
}
void teacher_register(int *m)
{
char account[20],key[20];
int i,n=3;
system("cls");
color(11);
printf("账号:");
scanf("%s",account);
for(i=0; i<N; i++)
{
if(strcmp(account,ST[i].account)==0)
{
FLAG3:
system("cls");
color(11);
printf("账号:%s\n",account);
printf("\n密码:");
scanf("%s",key);
if(strcmp(key,ST[i].key)==0)
{
color(11);
printf("登录成功!\n");
color(7);
system("pause");
break;
}
else
{
color(4);
printf("密码错误!\您还有%d次机会\n",n);
if(n==0)
{
*m=1;
system("pause");
system("cls");
return;
}
n--;
system("pause");
system("cls");
goto FLAG3;
color(7);
}
}
}
if(strcmp(account,ST[i].account)!=0)
{
color(4);
printf("账号错误!\n");
color(7);
*m=1;
}
}
/**----------------------------------------------------------------------------------以下为学生端功能函数-----------------------------------------------------------------------------------------------------------------**/
void total_page_design()
{
color(238);
printf("\t\t\t");
printf(" \n");
printf("\t\t\t");
color(238);
printf(" ");
color(190);
printf(" ");
color(238);
printf(" \n");
color(238);
printf("\t\t\t");
printf(" ");
color(190);
printf(" *---------------智汇学绩管家----------------* ");
color(238);
printf(" \n");
color(238);
printf("\t\t\t");
printf(" ");
color(190);
printf(" *-1.学生端登录 || 2.教师端登录-* ");
color(238);
printf(" \n");
printf("\t\t\t");
color(238);
printf(" ");
color(190);
printf(" *-3.退出 || 4.help(^-^) -* ");
color(238);
printf(" \n");
printf("\t\t\t");
color(238);
printf(" ");
color(190);
printf(" *-------------------------------------------* ");
color(238);
printf(" \n");
printf("\t\t\t");
color(238);
printf(" \n");
color(7);
}
void help()
{
color(11);
printf("智汇学绩管家,精准管理,助力学业腾飞!\n");
color(14);
printf("1.学生的初始账号为学号\n2.学生的初始密码为学号\n3.老师的账户和密码请前往教务处获得\n");
color(7);
}
void student_main()
{
if(head==NULL)
readStu();
system("cls");
struct link * p=NULL;
if(head==NULL)
{
color(13);
printf("目前老师并没有录入学生信息,请等待!\n");
color(7);
return ;
}
int f=0;
int *m=&f;
p=student_register(m);
if(f==1)
return;
system("cls");
int t=1;
while(t)
{
student_page_design();
char ch=_getch();
switch(ch)
{
case '1':
find_stu_by_num(head);
system("pause");
system("cls");
break;
case '2':
school_precaution(p);
system("pause");
system("cls");
break;
case '6':
t=tuichu(t);
color(11);
printf("记得五星好评哦!(^*^)\n");
color(7);
system("pause");
break;
case '3':
printf("好好学习,天天向上!");
system("pause");
system("cls");
break;
case '4':
inquir_leave_message(p);
system("pause");
system("cls");
break;
case '5':
reset_key(p);
system("pause");
system("cls");
break;
default:
color(4);
printf("您的输入有误,请重新输入。\n");
color(7);
system("pause");
system("cls");
break;
}
system("cls");
}
}
void student_page_design()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
printf("$*$#############################################################$*$\n");//
printf("$*$ 欢迎使用学生端智汇学绩管家 $*$\n");//
printf("$*$#############################################################$*$\n");//
printf("$*$ ($输入对应的序号便可执行相应的操作$) $*$\n");//
printf("$*$ 1.成绩查询 $*$\n");//
printf("$*$ 2.学业预警 $*$\n");
printf("$*$ 3.学生手册 $*$\n");
printf("$*$ 4.老师留言 $*$\n");
printf("$*$ 5.重置密码 $*$\n");
printf("$*$ 6.退出系统 $*$\n");//
printf("$*$#############################################################$*$\n");//
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void reset_key(struct link *p)
{
color(15);
printf("请输入你的新密码:");
scanf("%s",p->stu.key);
saveStu();
}
void school_precaution(struct link *p)
{
int a=1;
if (p->stu.grade.English<60)
{
color(4);
printf("你的英语成绩不合格\n");
printf("成绩为:%d\n",p->stu.grade.English);
color(11);
printf("学习建议:\n");
printf("对于英语学习,以下是一些建议,这些建议可以帮助您更有效地提高英语水平:\n\
1,设定明确目标:\n*确定您学习英语的具体目标。\n*设定短期和长期目标,并为之制定计划\n。3,创造沉浸式学习环境:\n\
*尽可能多地接触英语,如观看英语电影、电视剧、听英语歌曲、阅读英文书籍和文章。\n*使用英语作为日常交流语言,与英语母语者交流或加入英语学习社群。\n\
4,基础语法和词汇:\n*打好基础是关键。确保您理解英语的基本语法规则,并持续扩大词汇量。\n5,阅读和写作:\n\
*阅读不同类型的英文材料,包括小说、新闻、杂志文章和学术论文,以提高阅读理解能力。\n*尝试用英语写日记、文章或博客,以锻炼写作技巧。\n6,坚持与毅力:\n\
7,保持积极心态:\n*英语学习过程中难免会遇到挫折和困难,但要保持积极的心态和信心。\n\
*相信自己能够克服困难并取得进步,享受英语学习的过程。\n");
color(12);
printf("----------------------------------------------------------------------------------\n");
printf("----------------------------------------------------------------------------------\n");
a=0;
}
if (p->stu.grade.computer<60)
{
color(4);
printf("你的C语言成绩不合格\n");
printf("成绩为:%d\n",p->stu.grade.computer);
color(11);
printf("学习建议:\n");
printf("多做练习:通过大量练习来巩固知识,加深理解,可以从课本、习题集和在线资源中寻找练习题目。\n\
阅读经典书籍:如《C程序设计语言》(The C Programming Language)等,这些书籍能够提供更深入、全面的学习指导。\n\
注重编程风格:养成良好的编程风格,包括注释的编写、代码的组织和缩进等,使代码易于阅读和维护。\n\
参与项目:尝试参与一些小型项目,将C语言应用于实际问题中,提高实践能力。\n\
调试与测试:学会使用调试工具进行代码调试,以及编写测试代码来确保程序的正确性。\n\
保持耐心和热情:C语言的学习过程可能会有些枯燥,但保持耐心和热情,坚持下去会有收获的。\n");
color(12);
printf("----------------------------------------------------------------------------------\n");
printf("----------------------------------------------------------------------------------\n");
a=0;
}
if (p->stu.grade.math<60)
{
color(4);
printf("你的数学成绩不合格\n");
printf("成绩为:%d\n",p->stu.grade.math);
color(11);
printf("学习建议:\n");
printf("打好基础:回顾并巩固数学基础知识,确保理解基本概念和公式。\n\
多做练习:通过大量练习来提高解题能力和速度,掌握常见题型和解题方法。\n\
寻求帮助:遇到难题时,不要害怕向老师、同学或网络资源求助。\n\
制定计划:制定合理的学习计划,分配好每天的学习时间,保持学习的持续性。\n\
培养兴趣:尝试将数学与实际应用相结合,培养对数学的兴趣和热爱。\n\
耐心和毅力:学习数学需要耐心和毅力,不要因一次失败而气馁,坚持下去会看到进步。\n");
color(12);
printf("----------------------------------------------------------------------------------\n");
printf("----------------------------------------------------------------------------------\n");
a=0;
}
if(p->stu.grade.PE<60)
{
color(4);
printf("你的体育成绩不合格\n");
printf("成绩为:%d\n",p->stu.grade.PE);
color(11);
printf("学习建议:\n");
printf("多去锻炼,多跑步吧!\n");
color(12);
printf("----------------------------------------------------------------------------------\n");
printf("----------------------------------------------------------------------------------\n");
a=0;
}
if(p->stu.average<60)
{
printf("你的平均成绩比较差!");
printf("成绩为:%lf\n",p->stu.average);
printf("建议:\n你需要注重各个科目的学习,每一科都很重要!\n");
a=0;
}
if (a==1)
{
color(14);
printf("你的表现优异,没有不及格的科目,请你再接再厉!\n");
}
}
void inquir_leave_message(struct link * p)
{
char leave[100];
strcpy(leave,p->stu.leave_massage);
int i;
printf("老师的留言是:\n");
printf("%s\n",leave);
}
/**----------------------------------------------------------------------------------以下为教师端的功能函数---------------------------------------------------------------------------------------------------------------**/
void leave_massage()
{
if (head==NULL)
{
printf("当前记录了0个学生!\n");
return;
}
char name[20];
printf("请输入您要留言学生的学号:");
scanf("%s",name);
struct link *p=head;
while (strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
{
p=p->next;
}
if (strcmp(p->stu.student_number,name)==0)
{
printf("请给%s留言:(100字以内!)\n",p->stu.name);
scanf("%s",p->stu.leave_massage);
}
else
{
printf("未找到该学生!\n");
return ;
}
color(10);
printf("留言成功!");
color(7);
}
void teacher()
{
if(head==NULL)
readStu();
int f=0;
int *m=&f;
teacher_register(m);
if(f==1)
return;
int t=1,a=0,p;
while(t)
{
Welcome_teather();
printf("请输入你要执行的操作:\n");
char ch =_getch();
switch (ch)
{
case '1':
system("cls");
Record();
system("pause");
break;
case '2':
print_information(head);
system("pause");
break;
case '3':
saveStu();
system("pause");
break;
case '4':
readStu();
system("pause");
break;
case '5':
color(3);
printf("一共统计了%d个学生!\n",Count(head));
system("pause");
break;
case '6':
find_stu();
system("pause");
break;
case '7':
record_grade(head);
system("pause");
break;
case '8':
head=delete_stu(head);
system("pause");
break;
case '9':
change(head);
system("pause");
break;
case 'a':
find_unrecord_grade(head);
system("pause");
break;
case 'b':
statistical_analysis(head);
system("pause");
break;
case 'c':
sort_yemiansheji();
break;
case 'e':
leave_massage();
system("pause");
break;
case 'd':
color(11);
printf("\n是否保存学生信息?(是请输入1//否请输入0)\n");
flag1:
p=_getch();
if (p!='0'&&p!='1')
{
printf("输入有误请重新输入(1.是/0.否):\n");
goto flag1;
}
if (p=='1')
saveStu();
t=tuichu(t);
color(11);
printf("记得五星好评哦!(^*^)");
system("pause");
break;
default:
color(4);
printf("您的输入有误,请重新输入。\n");
system("pause");
system("cls");
break;
}
system("cls");
}
return 0;
}
//系统欢迎页面。
void Welcome_teather(void)
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
printf("$*$#############################################################$*$\n");//
printf("$*$ 欢迎使用教师端学生信息管理系统 $*$\n");//
printf("$*$#############################################################$*$\n");//
printf("$*$ ($输入对应的序号便可执行相应的操作$) $*$\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("$*$ a.检查是否全部学生都已经录入成绩 $*$\n");//完成
printf("$*$ b.统计分析 $*$\n");//完成
printf("$*$ c.一键排序 $*$\n");//完成
printf("$*$ d.退出系统 $*$\n");//完成
printf("$*$ e.给学生留言 $*$\n");//完成
printf("$*$#############################################################$*$\n");//
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void Record(void)//录入学生信息;
{
char p='1';
do
{
system("cls");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
printf("$*$#############################################################$*$\n");
printf("$*$ 请选择你要录入的信息 $*$\n");
printf("$*$#############################################################$*$\n");
printf("$*$ ($输入对应的序号便可执行相应的操作$) $*$\n");
printf("$*$ 1.录入学生基本信息 $*$\n");
printf("$*$ 2.(录入/修改)学生成绩 $*$\n");
printf("$*$ 3.结束录入 $*$\n");
printf("$*$#############################################################$*$\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
printf("请输入您要进行的操作的序号:\n");
char ch =_getch();
switch (ch)
{
case '1':
head=append(head);
//display(head);
break;
case '2':
grade_record(head);
break;
default :
p=0;
break;
}
system("cls");
printf("\n是否继续录入学生信息?(继续请输入1//结束请输入0)\n");
flag1:
p=_getch();
if (p!='0'&&p!='1')
{
printf("输入有误请重新输入(1.继续/0.结束):\n");
while(getchar()!='\n');
goto flag1;
}
}
while(p=='1');
printf("录入成功!\n");
}
//用于添加新的节点并传入数据;
struct link * append(struct link *head)
{
struct link *p=NULL,*pr=head,*pre=head;
int flag=1;
p=(struct link *)malloc (sizeof (struct link));
if (p==NULL)
{
printf("\nNo memory !\n");
exit (0);
}
if (head==NULL)
{
head=p;
flag=0;
}
else
{
while (pr->next!=NULL)
{
pr=pr->next;
}
pr->next=p;
}
char num[20];
p->next=NULL;
printf("请输入学生的学号:\n");
l:
scanf("%s",num);
if(flag)
{
while (pre->next!=NULL)
{
//printf("jjjj");
if(strcmp(num,pre->stu.student_number)==0)
{
// printf("jjjj");
color(4);
printf("\t--------------\t\n");
printf("\t|该学号已存在|\t\n");
printf("\t--------------\t\n");
color(11);
printf("请重新输入:");
goto l;
}
pre=pre->next;
}
}
strcpy(p->stu.student_number,num);
printf("请输入学生的姓名:\n");
scanf("%s",p->stu.name);
printf("请输入学生的性别(男/女):\n");
char sex[2];
again:
scanf("%s",sex);
if(strcmp("男\0",sex)==0)
{
strcpy(p->stu.sex,sex);
}
else if(strcmp("女\0",sex)==0)
{
strcpy(p->stu.sex,sex);
}
else
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
goto again;
}
printf("请输入学生的年龄:\n");
FLAG1:
if(scanf ("%d",&p->stu.old)==0)
{
while(getchar()!='\n');
color(4);
printf("输入错误!\n请重新输入:");
color(7);
goto FLAG1;
}
p->stu.grade.computer=-1;
p->stu.grade.English=-1;
p->stu.grade.math=-1;
p->stu.grade.PE=-1;
p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
p->stu.average=p->stu.total/4.0;
strcpy(p->stu.key,p->stu.student_number);
char leave[100]="你的老师还没有给你留言!";
strcpy(p->stu.leave_massage,leave);
return head;
}
void display(struct link *head )//该函数用于检测链表内部数据;
{
struct link *p=head;
while (p)
{
printf("输出:\n");
printf("%s\n",p->stu.student_number);
p=p->next;
}
}
void record_grade(struct link *head)
{
struct link *p=head;
int t=1;
while (t)
{
p=head;
system("cls");
if(head==NULL)
{
printf("当前学生人数为0!\n");
t=0;
}
else
{
char num[20];
int m,k=1;
while (k)
{
printf("录入成绩请按1/结束录入请按0!\n");
k=scanf ("%d",&m);
if (k=0||(m!=1&&m!=0))
{
printf("输入错误!\n");
while(getchar()!='\n');
}
else
k=0;
}
if (m==0)
{
break;
}
record_grade_yemiansheji();
printf("请输入学生的学号:");
scanf("%s",&num);
while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
{
p=p->next;
}
//system("pause");
if(strcmp(p->stu.student_number,num)==0)
{
flag:
system("cls");
record_grade_yemiansheji();
printf("请输入操作序号:\n");
int grade;
char ch =_getch();
switch (ch)
{
case '1':
printf("\n请输入%s的英语成绩:",p->stu.name);
FLAG2:
if(scanf ("%d",&grade)==0||grade>100||grade<0)
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
while(getchar()!='\n');
goto FLAG2;
}
while(getchar()!='\n');
p->stu.grade.English=grade;
break;
case '2':
printf("\n请输入%s的C语言成绩:",p->stu.name);
FLAG3:
if(scanf ("%d",&grade)==0||grade>100||grade<0)
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
while(getchar()!='\n');
goto FLAG3;
}
while(getchar()!='\n');
p->stu.grade.computer=grade;
break;
case '3':
printf("\n请输入%s的数学成绩:",p->stu.name);
FLAG4:
if(scanf ("%d",&grade)==0||grade>100||grade<0)
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
while(getchar()!='\n');
goto FLAG4;
}
while(getchar()!='\n');
p->stu.grade.math=grade;
break;
case '4':
printf("\n请输入%s的体育成绩:",p->stu.name);
FLAG5:
if(scanf ("%d",&grade)==0||grade>100||grade<0)
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
while(getchar()!='\n');
goto FLAG5;
}
while(getchar()!='\n');
p->stu.grade.PE=grade;
break;
default :
t=0;
break;
}
char a[2];
printf("是否继续录入%s的成绩?(是/否)",p->stu.name);
scanf ("%s",a);
if (strcmp("是\0",a)==0)
{
goto flag;
}
p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
p->stu.average=p->stu.total/4.0;
}
else
{
printf("未找到该学生!\n");
}
}
//printf("hhhhh");
system("pause");
system("cls");
}
}
int tuichu(int t)
{
int h;//控制是否确认退出
flag3:
printf("即将退出,确认请按1,取消请按0\n");
scanf("%d",&h);
if (h!=0&&h!=1)
{
printf("输入错误,请重新输入!!\n");
goto flag3;
}
if(h==1)
{
t=0;
color(11);
printf("成功退出,感谢您的使用!\n");
}
if(h==0)
{
color(14);
printf("退出已经取消!\n");
system("pause");
}
return t;
}
void record_grade_yemiansheji()
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 191);
printf("$*$#############################################################$*$\n");
printf("$*$选择你要录入或修改的成绩(输入选项前的序号) $*$\n");
printf("$*$#############################################################$*$\n");
printf("$*$1.英语 $*$\n");
printf("$*$2.C语言 $*$\n");
printf("$*$3.数学 $*$\n");
printf("$*$4.体育 $*$\n");
printf("$*$5.退出 $*$\n");
printf("$*$#############################################################$*$\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void print_information(struct link *head)
{
struct link *p=head;
if (head==NULL)
{
printf("录入了0个学生!!!");
return ;
}
else
{
find_unrecord_grade(head);
printf("请确认每位学生都已经录入了正确成绩,否则会影响成绩的打印!\n");
printf("返回修改成绩请按1,按任意键可继续操作!\n");
char ch=_getch();
if (ch=='1')
{
printf("已返回,请去录入他们的成绩!\n");
return;
}
int i=1;
color(10);
printf("$*$############################################################################################################$*$\n");
printf("$*$ 序号 学号\t\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
do
{
printf("$*$ %d\t%s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",i,p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.computer,p->stu.grade.PE,p->stu.total,p->stu.average);
i++;
p=p->next;
}
while(p!=NULL);
printf("$*$############################################################################################################$*$\n");
color(7);
}
}
void grade_record(struct link *head)
{
int a=0;
struct link *p=head;
int t=1;
while (t)
{
system("cls");
if(head==NULL)
{
printf("当前学生人数为0!\n");
t=0;
}
else
{
char num[20];
int m,k=1;
while (k)
{
printf("录入成绩请按1/结束录入请按0!\n");
k=scanf ("%d",&m);
if (k=0||(m!=1&&m!=0))
{
printf("输入错误!\n");
}
else
k=0;
}
if (m==0)
{
break;
}
printf("请输入学生的学号:");
scanf("%s",&num);
p=head;
while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
{
p=p->next;
}
if(strcmp(p->stu.student_number,num)==0)
{
system("cls");
printf("请输入该学生各科成绩\n");
printf("英语 数学 体育 C语言 \n");
FLAG6:
a=scanf("%d%d%d%d",&p->stu.grade.English,&p->stu.grade.math,&p->stu.grade.PE,&p->stu.grade.computer);
if(a!=4)
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
while(getchar()!='\n');
goto FLAG6;
}
while(getchar()!='\n');
p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
p->stu.average=p->stu.total/4.0;
}
else
{
printf("未找到该学生!\n");
}
}
system("pause");
system("cls");
}
}
int Count (struct link *head)//计算已录入学生的人数;
{
struct link *p=head;
int c=0;
while (p)
{
c++;
p=p->next;
}
return c;
}
void find_stu(void)
{
int t=1;
system("cls");
color(54);
printf("$*$###########################################$*$\n");
printf("$*$ 1,按学号查找 ## 2,按姓名查找 $*$\n");
printf("$*$-------------------------------------------$*$\n");
printf("$*$ 按其他键退出查找功能 $*$\n");
printf("$*$###########################################$*$\n");
color(7);
do
{
printf("请输入你要执行的操作:\n");
char ch=_getch();
switch (ch)
{
case '1':
find_stu_by_num(head);
break;
case '2':
find_stu_by_name(head);
break;
default:
t=0;
printf("退出成功!\n");
break;
}
}
while(t);
}
void find_stu_by_num (struct link *head )
{
if (head==NULL)
{
printf("当前记录了0个学生!\n");
return;
}
char num[20];
printf("请输入您要查找学生的学号:");
scanf("%s",num);
//printf(" %s\n ",num);
struct link * p=head;
while (strcmp(p->stu.student_number,num)!=0&&p->next!=NULL)
{
p=p->next;
}
if (strcmp(p->stu.student_number,num)==0)
{
printf("$*$ 学号\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
printf("$*$ %s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.math,p->stu.grade.PE,p->stu.total,p->stu.average);
}
else
{
printf("未找到该学生,请您重新查询!\n");
}
}
void find_stu_by_name (struct link * head)
{
int k=0;
if (head==NULL)
{
printf("当前记录了0个学生!\n");
return;
}
char name[20];
printf("请输入您要查找学生的姓名:");
scanf("%s",name);
struct link *p=head,pr[M];
while (p!=NULL)
{
if (strcmp(p->stu.name,name)==0)
{
color(11);
printf("$*$ 学号\t姓名\t年龄\t性别\t英语\t数学\tC语言\t体育\t总分\t各科平均分$*$\n");
printf("$*$ %s\t%s\t%d\t%s\t%d\t%d\t%d\t%d\t%d\t%lf$*$\n",p->stu.student_number,p->stu.name,p->stu.old,p->stu.sex,p->stu.grade.English,p->stu.grade.math,p->stu.grade.math,p->stu.grade.PE,p->stu.total,p->stu.average);
color(7);
k=1;
}
p=p->next;
}
if (k==0)
{
color(4);
printf("未找到该学生,请您重新查询!\n");
color(7);
}
}
void change(struct link * head)
{
int a[5]= {0};
if (head==NULL)
{
printf("当前记录了0个学生!\n");
return;
}
char name[20];
printf("请输入您要查找学生的学号:");
scanf("%s",name);
struct link *p=head;
while (strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
{
p=p->next;
}
if (strcmp(p->stu.student_number,name)==0)
{
printf("请输入%s新的姓名:\n",p->stu.name);
scanf("%s",p->stu.name);
strcpy(p->stu.key,p->stu.student_number);
printf("请输入%s新的学号:\n",p->stu.name);
scanf("%s",p->stu.student_number);
while(a[0]==0)
{
while(getchar()!='\n');
printf("请输入%s新的年龄:\n",p->stu.name);
a[0]=scanf("%d",&p->stu.old);
}
while(getchar()!='\n');
printf("请输入%s新的性别:\n",p->stu.name);
char sex[2];
again:
scanf("%s",sex);
if(strcmp("男\0",sex)==0)
{
strcpy(p->stu.sex,sex);
}
else if(strcmp("女\0",sex)==0)
{
strcpy(p->stu.sex,sex);
}
else
{
color(4);
printf("输入错误!!!\n");
color(7);
printf("请重新输入:");
goto again;
}
while(a[1]==0)
{
while(getchar()!='\n');
printf("请输入%s新的英语成绩:\n",p->stu.name);
a[1]=scanf("%d",&p->stu.grade.English);
}
while(a[2]==0)
{
while(getchar()!='\n');
printf("请输入%s新的数学成绩:\n",p->stu.name);
a[2]=scanf("%d",&p->stu.grade.math);
}
while(a[3]==0)
{
while(getchar()!='\n');
printf("请输入%s新的C语言成绩:\n",p->stu.name);
a[3]=scanf("%d",&p->stu.grade.computer);
}
while(a[4]==0)
{
while(getchar()!='\n');
printf("请输入%s新的体育成绩:\n",p->stu.name);
a[4]=scanf("%d",&p->stu.grade.PE);
}
printf("学生信息修改完毕,系统将自动更改他的总分和平均成绩!\n");
p->stu.total=p->stu.grade.computer+p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE;
p->stu.average=p->stu.total/4.0;
}
else
{
printf("未找到该学生,请您重新输入他的姓名!\n");
}
}
struct link *delete_stu(struct link *head)
{
if (head==NULL)
{
printf("当前录入了0个学生!\n");
return;
}
char name[20];
printf("请输入要删除学生的学号:\n");
scanf("%s",name);
struct link *p=head,*pr=head;
while(strcmp(p->stu.student_number,name)!=0&&p->next!=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(p->stu.student_number,name)==0)
{
if (p==head)
{
head=p->next;
free(p);
}
else
{
pr->next=p->next;
free(p);
}
printf("已经成功删除该学生!\n");
}
else
{
printf("未找到该学生!\n");
}
return head;
}
void find_unrecord_grade(struct link * head)
{
int lm=1;
if(head==NULL)
{
color(4);
printf("当前录入了0个学生!");
return ;
}
struct link *p=head;
int grade=-1;
while(p!=NULL)
{
if (p->stu.grade.computer==-1||p->stu.grade.English==-1||p->stu.grade.math==-1||p->stu.grade.PE==-1)
{
color(4);
printf("有学生的成绩没有被录入,请您录入他们的成绩!\n");
lm=0;
break;
}
p=p->next;
}
if(lm==0)
{
while(p!=NULL)
{
if (p->stu.grade.computer==-1)
{
printf("\n请输入%s的C语言成绩:",p->stu.name);
scanf ("%d",&grade);
p->stu.grade.computer=grade;
}
if(p->stu.grade.English==-1)
{
printf("\n请输入%s的英语成绩:",p->stu.name);
scanf ("%d",&grade);
p->stu.grade.English=grade;
}
if(p->stu.grade.math==-1)
{
printf("\n请输入%s的数学成绩:",p->stu.name);
scanf("%d",&grade);
p->stu.grade.math=grade;
}
if(p->stu.grade.PE==-1)
{
printf("\n请输入%s的体育成绩:",p->stu.name);
scanf("%d",&grade);
p->stu.grade.PE=grade;
}
p->stu.total=p->stu.grade.English+p->stu.grade.math+p->stu.grade.PE+p->stu.grade.computer;
p->stu.average=p->stu.total/4.0;
p=p->next;
}
}
printf("所有学生的成绩已经全部录入!\n");
}
void saveStu()
{
FILE *fp=fopen("Stu.txt", "w"); // 定义一个文件指针;
if (fp == NULL)
{
printf("打开文件失败.\n");
return;
}
struct link * p = head;
for (p; p != NULL; p = p->next)
{
fwrite(&p->stu, sizeof(Student), 1, fp); // 将要保存的信息写入到指定文件中;
}
fclose(fp); // 关闭文件;
printf("信息保存成功!\n");
}
void readStu()
{
FILE* fp = fopen("Stu.txt", "r");
if (fp == NULL)
{
printf("\n打开文件失败\n");
return;
}
Student stu;
while (fread(&stu, sizeof(Student), 1, fp)) // 遍历链表,使用文件读操作,将学生信息从文件中输出
{
struct link * pnew = (struct link *)malloc(sizeof(struct link));
pnew->next = NULL;
memcpy(pnew, &stu, sizeof(Student));
if (head == NULL)
{
head = pnew;
}
else
{
pnew->next = head;
head = pnew;
}
}
fclose(fp);
color(10);
printf("加载数据成功!\n");
}
void information_exchange(struct link * p)
{
struct link *temp=NULL;
temp=(struct link *)malloc(sizeof (struct link ));
if (temp==NULL)
{
printf ("No memory !");
exit (0);
}
temp->stu=p->stu;
p->stu=p->next->stu;
p->next->stu=temp->stu;
}
void sort_by_average (struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.average<pr->next->stu.average)
{
information_exchange(pr);
}
}
}
}
void sort_by_total(struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.total<pr->next->stu.total)
{
information_exchange(pr);
}
}
}
}
void sort_yemiansheji()
{
system("cls");
if(head==NULL)
{
color(4);
printf("当前录入了0个学生,无法排序!\n");
return ;
}
if(Count(head)==1)
{
color(4);
printf("当前录入的学生小于2个!\n");
}
color(11);
printf("##########################################\n");
printf("# 1,按平均分排序 #\n");
printf("# 2,按总分排序 #\n");
printf("# 3,按数学成绩排序 #\n");
printf("# 4,按英语成绩排序 #\n");
printf("# 5,按C语言成绩排序 #\n");
printf("# 6,按体育成绩排序 #\n");
printf("##########################################\n");
color(7);
char ch=_getch();
switch(ch)
{
case '1':
sort_by_average(head);
color(11);
printf("排序成功!");
system("pause");
break;
case '2':
sort_by_total(head);
color(11);
printf("排序成功!");
system("pause");
break;
case '3':
sort_by_math(head);
color(11);
printf("排序成功!");
system("pause");
break;
case '4':
sort_by_Eglish(head);
color(11);
printf("排序成功!");
system("pause");
break;
case '5':
sort_by_computer(head);
color(11);
printf("排序成功!");
system("pause");
break;
case '6':
sort_by_PE(head);
color(11);
printf("排序成功!");
system("pause");
break;
default:
color(4);
printf("输入错误!");
system("pause");
}
}
void sort_by_Eglish(struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.grade.English<pr->next->stu.grade.English)
{
information_exchange(pr);
}
}
}
}
void sort_by_math(struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.grade.math<pr->next->stu.grade.math)
{
information_exchange(pr);
}
}
}
}
void sort_by_PE(struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.grade.PE<pr->next->stu.grade.PE)
{
information_exchange(pr);
}
}
}
}
void sort_by_computer(struct link * head)
{
struct link * p=head,*pr=head;
for (p=head; p->next!=NULL; p=p->next)
{
for (pr=head; pr->next!=NULL; pr=pr->next)
{
if (pr->stu.grade.computer<pr->next->stu.grade.computer)
{
information_exchange(pr);
}
}
}
}
void statistical_analysis(struct link * head)
{
system("cls");
if (head==NULL)
{
printf("录入了0个学生!!!");
return ;
}
// 不及格 及格 中等 优秀
int k=Count(head);
int English[k],computer[k],PE[k],math[k],total[k],average[k];
color(60);
printf("按照分数分为以下等级: \n");
printf("及格(<60分),及格(60-70分),中等(70-80分),优秀(>80分)\n");
color(7);
copy_to_arry(head,English,computer,PE,math,total,average);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
color(3);
printf("英语成绩\n");
color(7);
count_sorted_stu(English);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
color(4);
printf("数学成绩\n");
color(7);
count_sorted_stu(math);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
color(5);
printf("C语言成绩\n");
color(7);
count_sorted_stu(computer);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
color(6);
printf("体育成绩\n");
color(7);
count_sorted_stu(PE);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
color(9);
printf("平均分\n");
color(7);
count_sorted_stu(average);
printf("\n");
printf("-------------------------------------\n");
printf("-------------------------------------\n");
}
void count_sorted_stu(int score[])
{
int k=Count(head),i;
double sum=0;
int a=0,b=0,c=0,d=0;// 不及格 及格 中等 优秀
double min=score[0],max=score[0];
for(i=0; i<k; i++)
{
if(score[i]<60)
a++;
else if(score[i]>=60&&score[i]<70)
b++;
else if(score[i]>=70&&score[i]<80)
c++;
else if(score[i]>=80)
d++;
if(score[i]>max)
max=score[i];
if(score[i]<min)
min=score[i];
sum+=score[i];
}
printf("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");
printf("┃总人数为---------------%人 ┃\n",k);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃等级为不及格的人数有: %d ┃\n",a);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃等级为及格的人数有: %d ┃\n",b);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃等级为中等的人数有: %d ┃\n",c);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃等级为优秀的人数有: %d ┃\n",d);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃最高分为:%6.2lf 分! ┃\n",max);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃最低分为:%2.2lf 分! ┃\n",min);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃该科目平均分为:%.2lf 分! ┃\n",(double)sum/k);
printf("┣━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n");
printf("┃及格率为-----%.2lf%% ┃\n",((b+c+d)/(k*1.0))*100);
printf("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");
color(14);
printf("条形统计图 \n");
color(7);
printf(" \n");
print_conclum_diagram(a,b,c,d);
}
void copy_to_arry(struct link *head,int English[],int computer[],int PE[],int math[],int total[],int average[])
{
struct link *p=head;
int k=Count(head),i=0;
while(p)
{
English[i]=p->stu.grade.English;
computer[i]=p->stu.grade.computer;
PE[i]=p->stu.grade.PE;
math[i]=p->stu.grade.math;
total[i]=p->stu.total;
average[i]=p->stu.average;
p=p->next;
i++;
}
}
void print_conclum_diagram(int a,int b,int c,int d)
{
int rank[4]= {a,b,c,d},max=rank[0],i,j,k=70;
for(i=0; i<4; i++)
{
if(rank[i]>max)
max=rank[i];
}
color(15);
printf(" y↑\n");
color(7);
for(i=max+1; i>=0; i--)
{
color(15);
printf("%8d|_ ",i);
color(7);
for(j=0; j<4; j++)
{
if(i==rank[j])
{
color(15);
printf(" %d ",rank[j]);
color(7);
}
else if(i<=rank[j]-1)
{
printf(" ");
color(k);
printf(" ");
color(7);
printf(" ");
}
else
{
printf(" ");
}
k=k+16;
}
printf(" ");
printf("\n");
k=70;
}
color(15);
printf(" ");
color(4);
printf(" 不及格 ");
color(14);
printf("及格 ");
color(3);
printf("中等 ");
color(10);
printf("优秀 ");
color(7);
}
C语言程序设计高分期末大作业
于 2024-07-23 17:58:35 首次发布