#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
//定义学生结构体
typedef struct _Student//每个学生对应一个结构体
{
char ID[200];//学号
char Name[20];//姓名
char Gender[4];//性别
float Mark1;//c成绩
float Mark2;//数学成绩
float Mark3;//英语成绩
float Sum;//个人总成绩
float Avg;//平均成绩
}Student;
//链表
//节点
typedef struct _Node
{
Student stu; //数据域
struct _Node* next; //指针域
}Node;
Node* g_pStudentlist=NULL; //学生链表 ,头结点
void menu();//进入主菜单
void input();//录入学生信息
void display();//浏览学生信息
void save();//保存学生信息
void read();//读取学生信息
void find();//查找学生信息
void change();//修改学生信息
void Delete(); //删除学生信息//有误 只能按顺序删除
void math_sort_max();//数学成绩从小到大排序,取最大值
void math_sort_min();//数学成绩从大到小排序,取最小值
void c_sort_max();//数学成绩从小到大排序,取最大值
void c_sort_min();//数学成绩从大到小排序,取最小值
void english_sort_max();//数学成绩从小到大排序,取最大值
void english_sort_min();//数学成绩从大到小排序,取最小值
int main()//主函数
{
while(1)
{
menu();
//直接读取一个字符,接受键盘的输入
printf("请输入选择类型(1-8)(不显示):\n");
char ch = getch();
int numstudents=0;
int i=0;
int ch3,ch4,ch5,ch6,ch7;
switch (ch)
{
case '1'://录入学生信息
printf("请输入要录入的学生人数:\n");
scanf("%d",&numstudents);
if(numstudents == 0||numstudents > 50)
{
printf("学生人数不在1-50之间,请重新录入学生人数\n");
continue;
}
for(i;i<numstudents;i++)
{
input();
printf("学生信息录入成功!是否继续录入(y/n):");
char ch1 = getch();
if(ch1 =='y'||ch1 =='Y')
{
printf("继续录入\n");
}
if(ch1 =='n'||ch1 =='N')
{
printf("停止录入\n");
break;
}
if(ch1 !='y'||ch1 !='Y'||ch1 !='n'||ch1 !='N')
{
continue;
}
}
break;
case '2'://浏览学生信息
display();
system("pause");//暂停
system("cls");//清屏
break;
case '3'://保存学生信息
save();
break;
case '4'://读取学生信息
read();
break;
case '5'://查找学生信息
find();
break;
case '6'://统计学生信息
printf("统计学生信息,按1对数学进行统计,按2对英语进行统计,按3对c成绩进行统计,按4统计函数功能结束:\n");
scanf("%d",&ch4);
if(ch4 == 1)
{
printf("统计学生数学信息,按1对数学成绩进行排序:\n");
scanf("%d",&ch7);
if(ch7 == 1)
{
math_sort_min();
display();
math_sort_max();
display();
system("pause");//暂停
system("cls");//清屏
}
}
if(ch4 == 2)
{
printf("统计学生英语信息,按1对英语进行排序:\n");
scanf("%d",&ch7);
if(ch7 == 1)
{
english_sort_min();
display();
english_sort_max();
display();
system("pause");//暂停
system("cls");//清屏
}
}
if(ch4 == 3)
{
printf("统计学生c信息,按1对c成绩进行排序");
scanf("%d",&ch7);
if(ch7 == 1)
{
c_sort_min();
display();
c_sort_max();
display();
system("pause");//暂停
system("cls");//清屏
}
}
if(ch4 == 4)
{
printf("统计函数功能结束\n");
break;
}
break;
case '7'://更改学生信息
printf("更改学生信息,按1修改学生信息,按2删除学生信息:");
scanf("%d",&ch3);
if(ch3 == 1)
{
printf("是否确认修改(y/n):");
char ch5 = getch();
if(ch5 =='y'||ch5 =='Y')
{
printf("修改学生信息\n");
change();
display();
system("pause");//暂停
system("cls");//清屏
}
if(ch5 =='n'||ch5 =='N')
{
printf("取消修改\n");
break;
}
}
if(ch3 == 2)
{
printf("是否确认删除(y/n):");
char ch6 = getch();
if(ch6 =='y'||ch6 =='Y')
{
printf("删除学生信息\n");
Delete();
display();
system("pause");//暂停
system("cls");//清屏
}
if(ch6 =='n'||ch6 =='N')
{
printf("取消删除\n");
break;
}
}
break;
case '0'://退出程序
printf("退出程序!!!\n");
return 0;//结束程序
default:
printf("输入有误,请重新输入\n");
system("pause");
system("cls");
break;
}
}
return 0;
}
//主菜单
void menu()
{
printf("*************************************************************************************************\n");
printf(" 学生成绩管理系统 \n");
printf(" |1.录入学生信息 | |2.浏览学生信息 | \n");
printf(" |3.保存学生信息 | |4.读取学生信息 | \n");
printf(" |5.查找学生信息 | |6.统计学生信息 | \n");
printf(" |7.更新学生信息 | |0.退出程序 | \n");
printf("*************************************************************************************************\n");
}
//录入学生信息
void input()
{
char id[200];
float c,math,english,sum,avg;
int flag;
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->next = NULL;
//输入学生姓名
printf("请输入姓名:\n");
scanf("%s",pNewNode->stu.Name);
//检验学号的唯一性
printf("请录入一名同学后再使用此功能,检查学号是否已存在(1.执行;2.不执行):\n");
scanf("%d",&flag);
if(flag ==1)
{
printf("请输入学号:\n");
scanf("%s",id);
//检查学号是否已存在
if(strcmp(pNewNode->stu.ID,id) == 0)
{
printf("输入的学号已存在\n");
return;
}
printf("请再输入学号:\n");
scanf("%s",pNewNode->stu.ID);
}
if(flag ==2)
{
printf("请输入学号:\n");
scanf("%s",pNewNode->stu.ID);
printf("不执行\n");
}
printf("请输入性别:\n");
scanf("%s",pNewNode->stu.Gender);
printf("请输入c成绩:\n");
scanf("%f",&c);
pNewNode->stu.Mark1 = c;
printf("请输入数学成绩:\n");
scanf("%f",&math);
pNewNode->stu.Mark2 = math;
printf("请输入英语成绩:\n");
scanf("%f",&english);
pNewNode->stu.Mark3 = english;
sum=c+math+english;
printf("总分:%.1f\n",sum);
pNewNode->stu.Sum = sum;
avg=sum/3;
printf("平均分:%.1f\n",avg);
pNewNode->stu.Avg = avg;
//插入到链表
if(g_pStudentlist == NULL)
{
g_pStudentlist = pNewNode;
}
else
{
pNewNode->next = g_pStudentlist;
g_pStudentlist = pNewNode;
}
printf("录入学生信息成功\n");
system("pause");//暂停
system("cls");//清屏
}
//浏览学生信息
void display()
{
printf("*************************************************************************************************\n");
printf("\t浏览学生信息系统\t\n");
printf("\t学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
printf("*************************************************************************************************\n");
//遍历链表
Node* p = g_pStudentlist;
while(p!=NULL)
{
printf("\t%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
p = p->next;
}
printf("*************************************************************************************************\n");
}
//保存学生信息
void save()
{
//打开文件
FILE* fp=fopen("D:\\students.txt","wb");
if(fp==NULL)
{
printf("打开文件失败\n");
return;
}
//遍历链表
Node* p = g_pStudentlist;
while(p!=NULL)
{
fwrite(&p->stu,sizeof(Student),1,fp);
p = p->next;
}
//关闭文件
fclose(fp);
printf("\n数据保存成功\n");
system("pause");
system("cls");
}
//读取学生信息
void read()
{
//打开文件
FILE* fp=fopen("D:\\students.txt","rb");
if(fp==NULL)
{
printf("打开文件失败\n");
return;
}
//读取文件
Student stu;
while (fread(&stu,sizeof(Student),1,fp))
{
//创建一个新节点
Node* pNewNode = (Node*)malloc(sizeof(Node));
pNewNode->next = NULL;
memcpy(pNewNode,&stu,sizeof(Student));
//头插法
if (g_pStudentlist == NULL)
{
g_pStudentlist = pNewNode;
}
else
{
pNewNode->next = g_pStudentlist;
g_pStudentlist = pNewNode;
}
}
//关闭文件
fclose(fp);
printf("加载数据成功");
system("pause");
system("cls");
}
//查找
void find()
{
int flag=0;
char id[200];//学号
char name[20];//姓名
Node* p = g_pStudentlist;
printf("输入1按照姓名查找,输入2按照学号查找:\n");
scanf("%d",&flag);
if (flag == 1)
{
printf("请输入要查找学生的姓名:\n");
scanf("%s",name);
while(p!=NULL)
{
if(strcmp(p->stu.Name,name)==0)
{
printf("查询到该姓名\n");
printf("学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
}
else
{
printf("未查询到该姓名\n");
}
p=p->next;
}
}
if (flag == 2)
{
printf("请输入要查找学生的学号:\n");
scanf("%s",&id);
while(p!=NULL)
{
if(strcmp(p->stu.ID,id)==0)
{
printf("查询到该学号\n");
printf("学号\t姓名\t性别\tc成绩\t数学\t英语\t总分\t平均分\n");
printf("%s\t%s\t%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n",p->stu.ID,p->stu.Name,p->stu.Gender,p->stu.Mark1,p->stu.Mark2,p->stu.Mark3,p->stu.Sum,p->stu.Avg);
}
else
{
printf("未查询到该学号\n");
}
p=p->next;
}
}
system("pause");
system("cls");
}
//修改学生信息
void change()
{
char a,b;
float c,d,e,sum,avg;
char num[200];
printf("请输入需要修改的学生信息的学号:\n");
scanf("%s",num);
//遍历链表
Node* p = g_pStudentlist;
while (p!=NULL)
{
// 将输入的信息与链表中的信息进行比较
// strcmp字符串比较函数(0 == strcmp(p->stu.ID,num) ),trcmp数字比较函数(p->stu.Mark2==English)相等取值为0
if (0 == strcmp(p->stu.ID,num))
{
printf("请输入要修改的学生姓名 性别:\n");
scanf("%s %s",&a,&b);
printf("请输入要修改的学生c成绩 数学成绩 英语成绩:\n");
scanf("%f %f %f",&c,&d,&e);
sum=c+d+e;
printf("修改后的学生总分:%.1f\n",sum);
avg=sum/3;
printf("修改后的学生平均分:%.1f\n",avg);
printf("请再次输入要修改的学生姓名 性别 c成绩 数学成绩 英语成绩 总分 平均分:\n");
scanf("%s %s %f %f %f %f %f",p->stu.Name,p->stu.Gender,&p->stu.Mark1,&p->stu.Mark2,&p->stu.Mark3,&p->stu.Sum,&p->stu.Avg); //注意整型与浮点型要用&取p的地址,字符串本身为地址
printf("修改成功\n");
break;
}
p = p->next;
}
if (p == NULL)
{
printf("没有找到该学生信息\n");
}
system("pause");
system("cls");
}
//删除学生信息
void Delete()
{
char num[200];
printf("请输入需要删除的学生信息的学号:\n");
scanf("%s",num);
//遍历链表
Node* p = g_pStudentlist;
while (p!=NULL)
{
if (0 == strcmp(p->stu.ID,num))
{
p->stu.Mark1,p->stu.Mark2,p->stu.Mark3=-1;
printf("删除成功\n");
break;
}
p = p->next;
}
Node *pa,*t1,*temp1;//创建2个链表,temp临时链表,g_pStudentlist头链表
t1=(Node*)malloc(sizeof(Node));
for(temp1 = g_pStudentlist ; temp1!=NULL ; temp1=temp1->next)
{
for(pa = g_pStudentlist ; pa->next!=NULL ; pa = pa->next)
{
if(pa->stu.Mark1 > pa->next->stu.Mark1)
{
t1->stu = pa->stu;
pa->stu = pa->next->stu;
pa->next->stu = t1->stu;//交换数据区
}
}
}
Node *pb,*t2,*temp2;//创建2个链表,temp临时链表,g_pStudentlist头链表
t2=(Node*)malloc(sizeof(Node));
for(temp2 = g_pStudentlist ; temp2!=NULL ; temp2=temp2->next)
{
for(pb = g_pStudentlist ; pb->next!=NULL ; pb = pb->next)
{
if(pb->stu.Mark2 > pb->next->stu.Mark2)
{
t2->stu = pb->stu;
pb->stu = pb->next->stu;
pb->next->stu = t2->stu;//交换数据区
}
}
}
Node *pc,*t3,*temp3;//创建2个链表,temp临时链表,g_pStudentlist头链表
t3=(Node*)malloc(sizeof(Node));
for(temp3 = g_pStudentlist ; temp3!=NULL ; temp3=temp3->next)
{
for(pc = g_pStudentlist ; pc->next!=NULL ; pc = pc->next)
{
if(pc->stu.Mark3 > pc->next->stu.Mark3)
{
t3->stu = pc->stu;
pc->stu = pc->next->stu;
pc->next->stu = t3->stu;//交换数据
}
}
}
//定义指针p1,p2
Node* p1,*p2;
// 将输入的信息与链表中的信息进行比较
// strcmp字符串比较函数(0 == strcmp(p->stu.ID,num) ),trcmp数字比较函数(p->stu.Mark2==English)相等取值为0
//判断是不是头结点,strcmp字符串比较函数(0 == strcmp(p->stu.ID,num)
while(p!=NULL)
{
if (0 == strcmp(g_pStudentlist->stu.ID,num))
{
//备份头结点
p1=g_pStudentlist;
g_pStudentlist = g_pStudentlist->next;//下一个作头
//释放g_pStudentlist
free(p1);
printf("删除成功\n");
}
else
{
printf("未查询到该学生信息\n");
}
p=p->next;
}
system("pause");
system("cls");
}
//按成绩排序
void math_sort_max()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark2 > p->next->stu.Mark2)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据区
}
}
}
printf("数学成绩最高分:%.1f\n",p->stu.Mark2);
printf("统计成功\n");
}
void math_sort_min()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark2 < p->next->stu.Mark2)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据区
}
}
}
printf("数学成绩最低分:%.1f\n",p->stu.Mark2);
printf("统计成功\n");
}
void c_sort_max()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark1> p->next->stu.Mark1)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据区
}
}
}
printf("c成绩最高分:%.1f\n",p->stu.Mark1);
printf("统计成功\n");
}
void c_sort_min()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark1< p->next->stu.Mark1)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据区
}
}
}
printf("c成绩最低分:%.1f\n",p->stu.Mark1);
printf("统计成功\n");
}
void english_sort_max()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark3> p->next->stu.Mark3)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据
}
}
}
printf("英语成绩最高分:%.1f\n",p->stu.Mark3);
printf("统计成功\n");
}
void english_sort_min()
{
Node *p,*t,*temp;//创建2个链表,temp临时链表,g_pStudentlist头链表
t=(Node*)malloc(sizeof(Node));
for(temp = g_pStudentlist ; temp!=NULL ; temp=temp->next)
{
for(p = g_pStudentlist ; p->next!=NULL ; p = p->next)
{
if(p->stu.Mark3< p->next->stu.Mark3)
{
t->stu = p->stu;
p->stu = p->next->stu;
p->next->stu = t->stu;//交换数据
}
}
}
printf("英语成绩最低分:%.1f\n",p->stu.Mark3);
printf("统计成功\n");
}