|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 一世轻尘 于 2021-1-6 08:41 编辑
自己写的,很菜
- //学生成绩管理系统
- //需要自己建一个名为Information的txt文件来存储数据
- //txt文件与cpp文件路径相同
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<conio.h>
- #define LEN sizeof(struct student)
- //学生信息结构体
- struct student
- {
- char name[10];//学生姓名
- char id[15];//学生学号
- int score[3];//学生三科成绩
- 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 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: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(" *********************************************** \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];
- int math, English,computer;
- p=(stu*)malloc(LEN);//为学生信息申请节点
- printf("请依次输入学生信息:\n");
- printf("姓名 学号 数学 英语 计算机导论与程序设计\n");
- scanf("%s %s %d %d %d",name,id,&math,&English,&computer);
-
- for(;q->next!=NULL;q=q->next){;}//移动到尾结点
- //将输入的内容赋值给链表中的相应位置
- strcpy(p->name,name);
- strcpy(p->id,id);
- p->score[0]=math;
- p->score[1]=English;
- p->score[2]=computer;//赋值完毕
- //移动指针
- p->next=NULL;
- q->next=p;
- q=p;
- return h;
- }
- //成绩打印
- void print(stu *h)
- {
- stu *p=h->next;//从头结点之后的结点开始输出
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");//左对齐的方式输出
- while(p!=NULL)//输出链表的全部内容
- {
- printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
- p=p->next;
- }
- }
- //成绩修改
- void modify(stu *h)
- {
- stu *p=h->next;
- char name[10],id[15];
- int math,English,computer;
- printf("请输入学生姓名:");
- scanf("%s",name);
- printf("请输入学生学号:");
- scanf("%s",id);
-
- while(p)
- {
- if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)
- {
- printf("当前学生信息:\n");
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
- printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
- printf("请输入更正后的数学成绩:");
- scanf("%d",&math);
- printf("请输入更正后的英语成绩:");
- scanf("%d",&English);
- printf("请输入更正后的计算机导论与程序设计成绩:");
- scanf("%d",&computer);
- p->score[0]=math;
- p->score[1]=English;
- p->score[2]=computer;
- printf("更改完成!\n");
- system("pause");
- break;
- }
- else
- {
- p=p->next;
- }
- }//while循环结束
- }
- //查询统计
- void statistics(stu *h)
- {
- while(1)
- {
- int z;//选项变量
- system("cls");//清屏
- printf("请输入查找方式:\n7.按姓名学号查找\n8.按成绩查找\n9.退出\n") ;
- scanf("%d",&z);
- system("cls");
- switch(z)
- {
- case 7:{
- stu *p=h->next;
- char name[10],id[15];
- printf("请输入学生姓名:");
- scanf("%s",name);
- printf("请输入学生学号:");
- scanf("%s",id);
- while (p)
- {
- if(strcmp(p->name,name)==0&&strcmp(p->id,id)==0)//比较姓名学号
- {
- printf("当前学生信息:\n");
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
- printf("%-15s%-10s%-10d%-10d%-10d\n",p->id,p->name,p->score[0],p->score[1],p->score[2]);
- break;
- }
- else
- {
- p=p->next;
- }
- }//while循环结束
- }system("pause");system("cls");break;
- case 8:{
- while(1){
- int x;//选项变量
- int num=0;//初始化满足条件的人数
- printf("请输入按哪一科成绩进行查找:\n按数学成绩查找输入10\n按英语成绩查找输入11\n按计算机导论与程序设计成绩查找输入12\n退出输入13\n");
- scanf("%d",&x);
- switch(x)
- {
- case 10:{
- stu *p1=h->next;
- int M1,M2;
- printf("请依次输入所要查找的数学成绩的下界与上界:\n");
- scanf("%d %d",&M1,&M2);
- printf("学生信息:\n");
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
-
- while(p1){
- if((p1->score[0]-M1)>=0&&(p1->score[0]-M2<=0))
- {
- printf("%-15s%-10s%-10d%-10d%-10d\n",p1->id,p1->name,p1->score[0],p1->score[1],p1->score[2]);
- num++;
- p1=p1->next;
- }
- else
- {
- p1=p1->next;
- }
- }//while循环结束
- printf("人数为%d\n",num);//输出人数
- system("pause");
- system("cls");
- }break;
- case 11:{
- stu *p2=h->next;
- int E1,E2;
- printf("请依次输入所要查找的英语成绩的下界与上界:\n");
- scanf("%d %d",&E1,&E2);
- printf("学生信息:\n");
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
- while(p2){
- if((p2->score[1]-E1)>=0&&(p2->score[2]-E2<=0))
- {
- printf("%-15s%-10s%-10d%-10d%-10d\n",p2->id,p2->name,p2->score[0],p2->score[1],p2->score[2]);
- num++;
- p2=p2->next;
- }
- else
- {
- p2=p2->next;
- }
- }//while循环结束
- printf("人数为%d\n",num);
- system("pause");
- system("cls");
- }
- break;
- case 12:{
- stu *p3=h->next;
- int C1,C2;
- printf("请依次输入所要查找的计算机导论与程序设计成绩的下界与上界:\n");
- scanf("%d %d",&C1,&C2);
- printf("学生信息:\n");
- printf("%-15s%-10s%-10s%-10s%-10s\n","学号","姓名","数学","英语","计算机导论与程序设计");
- while(p3){
- if((p3->score[2]-C1)>=0&&(p3->score[2]-C2<=0))
- {
- printf("%-15s%-10s%-10d%-10d%-10d\n",p3->id,p3->name,p3->score[0],p3->score[1],p3->score[2]);
- num++;
- p3=p3->next;
- }
- else
- {
- p3=p3->next;
- }
- }//while循环结束
- printf("人数为%d\n",num);
- system("pause");
- system("cls");
- }
- break;
- case 13:goto label2;//跳出双重循环
- default:break;
- }
- }
- label2:printf("已退出");
- }system("pause");system("cls");break;
- case 9:goto label1;//跳出双重循环
- default:break;
- }
- }
- label1:printf("已退出\n");
- }
- //删除函数
- void del(stu *h)
- {
- stu *p=h,*q;
- q=p->next;
- char name[10],id[15];
- printf("请输入学生姓名:");
- scanf("%s",name);
- printf("请输入学生学号:");
- scanf("%s",id);
- while(q)
- {
- if(strcmp(q->name,name)==0&&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);
- }
复制代码 |
评分
-
查看全部评分
|