|  | 
 
| 
本帖最后由 时而动摇 于 2021-2-28 10:20 编辑
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  
 //学生成绩管理系统
 //需要自己建一个名为Information的txt文件来存储数据
 //txt文件与cpp文件路径相同
 #include<stdio.h>
 #include<stdlib.h>
 #include<string.h>
 #include<conio.h>
 #define LEN sizeof(struct student)
 #include <windows.h>
 //学生信息结构体
 struct student
 {
 char name[10];//学生姓名
 char id[15];//学生学号
 char sex[5];//学生性别
 float score[3];//学生三科成绩
 float Total;//总分
 float Ave;//平均分
 struct student *next;
 };
 
 typedef struct student stu;
 
 //声明函数
 stu* enter(stu *h);//成绩录入函数
 stu* initialize();//初始化链表头函数
 void menu();//菜单
 void print(stu *h);//成绩打印函数
 void modify(stu *h);//成绩修改函数
 void statistics(stu *h);//查找统计信息
 void del(stu *h);//删除函数
 void sortEglish(stu *h);//排序函数,用于对英语成绩排序
 void sortmath(stu *h);//排序函数,用于对数学成绩排序
 void sortcomputer(stu *h);//排序函数,用于对计算机成绩排序
 void sortTotal(stu *h);//排序函数,用于对总成绩排序
 void quit(stu *h);//退出函数
 void save(stu *h);//保存文件函数
 void open(stu *h);//打开文件读取信息建立链表函数
 
 
 //主函数
 int main()
 {
 stu *data;//指向链表头,建立成绩链表,所有学生信息存放 在此链表
 int function;//功能选项
 char flag;//判断变量
 int t=0;
 data=initialize();//初始化头结点
 open(data);//读取文件内的数据,并建立链表
 while(1)
 {
 menu();//打开菜单
 printf("请选择操作:");
 scanf("%d",&function);//输入你想要实现的功能
 switch(function)//构建多个功能分支
 {
 case 1:while(1)
 {
 enter(data);//输入一个数据并连接在链表的后面
 printf("是否继续输入(y/n)");
 scanf("%s",&flag);
 if(flag=='N'||flag=='n')break;
 }system("cls");break;
 case 2:print(data);_getch();system("cls");break;
 case 3:modify(data);system("cls");break;
 case 4:statistics(data);_getch();system("cls");break;
 case 5:del(data);_getch();system("cls");break;
 case 6:sortmath(data);system("cls");break;
 case 7:sortEglish(data);system("cls");break;
 case 8:sortcomputer(data);system("cls");break;
 case 9:sortTotal(data);system("cls");break;
 case 10:quit(data);break;
 default:printf("error!!!请重新输入:");
 break;
 }//switch结束
 }
 return 0;
 }
 
 //系统界面显示
 void menu()
 {
 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("                       10.退出系统并保存                              \n");
 printf("          ***********************************************             \n");
 }
 
 //初始化头节点函数
 stu* initialize()
 {
 stu *head;
 head=(stu*)malloc(LEN);
 if(head==NULL)
 {
 printf("error!");
 exit(1);
 }
 head->next=NULL;//使头结点指针域为空
 return head;
 }
 
 
 
 //成绩录入
 stu* enter(stu *h)
 {
 stu *p,*q=h;
 char name[10],id[15],sex[5];
 int math, English,computer;
 p=(stu*)malloc(LEN);//为学生信息申请节点
 printf("请依次输入学生信息:\n");
 printf("姓名 学号 性别 数学 英语 计算机\n");
 scanf("%s %s %s %d %d %d",name,id,sex,&math,&English,&computer);
 
 for(;q->next!=NULL;q=q->next){;}//移动到尾结点
 
 //将输入的内容赋值给链表中的相应位置
 strcpy(p->name,name);
 strcpy(p->id,id);
 strcpy(p->sex,sex);
 p->score[0]=math;
 p->score[1]=English;
 p->score[2]=computer;//赋值完毕
 p->Total = p->score[0]+ p->score[1]+p->score[2];        //计算总分
 p->Ave = p->Total / 3.0f;        //计算平均分
 //移动指针
 p->next=NULL;
 q->next=p;
 q=p;
 return h;
 }
 
 
 //成绩打印
 void print(stu *h)
 {
 stu *p=h->next;//从头结点之后的结点开始输出
 printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");//左对齐的方式输出
 while(p!=NULL)//输出链表的全部内容
 {
 printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
 p=p->next;
 }
 }
 
 
 
 //成绩修改
 void modify(stu *h)
 {
 stu *p=h->next;
 char name[10],id[15],sex[5];
 int math,English,computer;
 printf("请输入学生学号:");
 scanf("%s",id);
 
 while(p)
 {
 if(strcmp(p->id,id)==0)
 {
 printf("当前学生信息:\n");
 printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");
 printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
 printf("请输入更正后的数学成绩:");
 scanf("%d",&math);
 printf("请输入更正后的英语成绩:");
 scanf("%d",&English);
 printf("请输入更正后的计算机成绩:");
 scanf("%d",&computer);
 p->score[0]=math;
 p->score[1]=English;
 p->score[2]=computer;
 p->Total = p->score[0]+ p->score[1]+p->score[2];
 p->Ave = p->Total / 3.0f;
 printf("更改完成!\n");
 system("pause");
 break;
 }
 else
 {
 p=p->next;
 }
 }//while循环结束
 }
 
 
 //查询统计
 void statistics(stu *h)
 {
 while(1)
 {
 int z;//选项变量
 system("cls");//清屏
 printf("请输入查找方式:\n11.按学号查找\n.12退出\n") ;
 scanf("%d",&z);
 system("cls");
 switch(z)
 {
 case 11:{
 stu *p=h->next;
 char name[10],id[15],sex[5];
 printf("请输入学生学号:");
 scanf("%s",id);
 while (p)
 {
 if(strcmp(p->id,id)==0)//比较学号
 {
 printf("当前学生信息:\n");
 printf("%-15s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n","学号","姓名","性别","数学","英语","计算机","总分","平均分");
 printf("%-15s%-10s%-10s%-10d%-10d%-10d%-10d%-10d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->Total,p->Ave);
 break;
 }
 else
 {
 p=p->next;
 }
 }//while循环结束
 }system("pause");system("cls");break;
 
 case 12:goto label1;//跳出双重循环
 default:break;
 }
 }
 label1:printf("已退出\n");
 }
 
 
 
 //删除函数
 void del(stu *h)
 {
 stu *p=h,*q;
 q=p->next;
 char id[15];
 printf("请输入学生学号:");
 scanf("%s",id);
 while(q)
 {
 if(strcmp(q->id,id)==0)
 {
 p->next=q->next;
 free(q);//删除p结点
 printf("删除成功\n");
 break;
 }
 else
 {
 p=p->next;
 q=q->next;
 }
 }//while循环结束
 }
 
 
 
 //退出系统
 void quit(stu *h)
 {
 save(h);//退出时保存信息
 exit(0);
 }
 
 
 
 //打开文件
 void open(stu *h)
 {
 stu *p=h;
 stu *q;//临时变量,用于保存从文件中提取的信息
 FILE*file=fopen("./Information.txt","rb");
 if(!file)
 {
 printf("文件打开失败!");
 return ;
 }
 
 
 q=(stu*)malloc(LEN);//开辟内存
 fread(q,LEN,1,file);//进入循环前先读取一个结点
 while(!feof(file))//判断是否到达文件结尾,如果没有就进入或继续循环
 //否则,就绕过或结束循环
 {
 //代码执行到这里,说明没有到达文件结尾,本次读取的节点数据有效
 p->next=q;//更新链表数据,把新的节点纳入链表
 p=q;//更新链表数据,把新的节点纳入链表
 q=(stu*)malloc(LEN);//分配内存,准备读取下一个结点
 fread(q,LEN,1,file);//读取下一个结点,执行完此句,返回到while循环入口
 }//while循环结束
 
 p->next=NULL;//使尾结点指向空,结束链表
 fclose(file);
 }
 
 
 //保存信息到文件中
 void save(stu *h)
 {
 stu *p=h->next;
 int flag;
 FILE *file=fopen("./information.txt","wb");
 if(!file)
 {
 printf("文件打开失败!");
 return ;
 }
 while (p!=NULL)
 {
 flag=fwrite(p,LEN,1,file);//依次将p所指向的链表中的内容写入到文件中
 if(flag!=1)
 {
 break;
 }
 p=p->next;
 }
 fclose(file);
 }
 | 
 |