【实验时间】:2022年6月1日星期三
【实验地点】:家中
【实验目的】:
(1)培养和锻炼对具有一定复杂度和规模的问题分析与求解能力
(2)掌握程序设计的综合方法,能综合应用各种数据类型实现较为复杂数据的存储
(3)培养良好的C程序设计风格与代码规范意识
【实验过程】:
学生成绩管理
设计一个菜单驱动的学习成绩管理程序,管理n个学生3门考试科目成绩,实现以下功能:
- 能够新增学生信息,并计算总分和平均分
- 能够根据学号修改和删除某个学生的信息
- 能够显示所有学生的成绩信息
- 能够分别按总分和学号进行排序
- 能够根据学号查询该学生的基本信息
- 学生成绩数据最终保存在文件中,能够对文件读、写学生数据
菜单形式如下:
Management for Students’ scores
- Append record
- List record
- Delete record
- Modify record
- Search record
- Sort in descending order by sum
- Sort in ascending order by sum
- Sort in descending order by Id
- Sort in ascending order by Id
【实验目的】:
(1)培养和锻炼对具有一定复杂度和规模的问题分析与求解能力
(2)掌握程序设计的综合方法,能综合应用各种数据类型实现较为复杂数据的存储
(3)培养良好的C程序设计风格与代码规范意识
【实验过程】:
学生成绩管理
设计一个菜单驱动的学习成绩管理程序,管理n个学生3门考试科目成绩,实现以下功能:
- 能够新增学生信息,并计算总分和平均分
- 能够根据学号修改和删除某个学生的信息
- 能够显示所有学生的成绩信息
- 能够分别按总分和学号进行排序
- 能够根据学号查询该学生的基本信息
- 学生成绩数据最终保存在文件中,能够对文件读、写学生数据
菜单形式如下:
Management for Students’ scores
- Append record
- List record
- Delete record
- Modify record
- Search record
- Sort in descending order by sum
- Sort in ascending order by sum
- Sort in descending order by Id
- Sort in ascending order by Id
W.Write to a File
R. Read from a File
0. Exit
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
#define N 100
int If_End=0;//判断是否结束
int Last=0;//存储添加学生个数
FILE *file;
struct Students_Message//学生信息
{
int Id;
int Score1;
int Score2;
int Score3;
double Average_Score;
double Sum_Score;
}Students[N];
void putout()//在显示界面输出信息
{
for(int i=0;i<Last;i++)
{
if(Students[i].Id!=0)
printf("学生id: %d 三门成绩分别为:%d %d %d 总成绩: %lf 平均分: %lf\n",Students[i].Id,Students[i].Score1,Students[i].Score2,Students[i].Score3,Students[i].Sum_Score,Students[i].Average_Score);
}
}
void Menu()//成绩管理系统菜单界面
{
printf("Management for Students’ scores\n");
printf("1. Append record\n");
printf("2. List record\n");
printf("3. Delete record\n");
printf("4. Modify record\n");
printf("5. Search record\n");
printf("6. Sort in descending order by sum\n");
printf("7. Sort in ascending order by sum\n");
printf("8. Sort in descending order by Id\n");
printf("9. Sort in ascending order by Id\n");
printf("W. Write to a File\n");
printf("R. Read from a File\n");
printf("0. Exit\n");
}
void Judge(char x)//判断进行哪一种操作
{
if(x=='1') Add_Student();
if(x=='2') Message_List();
if(x=='3') Delete_Student();
if(x=='4') Modify_Student();
if(x=='5') Search_Student();
if(x=='6') Sort_Sum_Down();
if(x=='7') Sort_Sum_Up();
if(x=='8') Sort_Student_Id_Down();
if(x=='9') Sort_Student_Id_Up();
if(x=='0') If_End=1;
if(x=='W') Write_File();
if(x=='R') Read_File();
}
void Add_Student()//添加学生信息
{
printf("请输入要添加信息的学生id: ");
fscanf(file,"%d",&Students[Last].Id);
printf("%d\n",Students[Last].Id);//让每一步的数据读取在操作界面可视
printf("请输入学生成绩三科(以空格间隔): ");
fscanf(file,"%d %d %d",&Students[Last].Score1,&Students[Last].Score2,&Students[Last].Score3);
printf("%d %d %d\n",Students[Last].Score1,Students[Last].Score2,Students[Last].Score3);//让每一步的数据读取在操作界面可视
Students[Last].Sum_Score=Students[Last].Score1+Students[Last].Score2+Students[Last].Score3;
Students[Last].Average_Score=Students[Last].Sum_Score/3.0;
Last++;
}
void Swap_Message(int *a,int *b)//交换学生的每一单项数据
{
int tem=*a;
*a=*b;
*b=tem;
}
void Swap(int a,int b)//用于交换学生a,b在结构体中的位置
{
Swap_Message(&Students[a].Id,&Students[b].Id);
Swap_Message(&Students[a].Score1,&Students[b].Score1);
Swap_Message(&Students[a].Score2,&Students[b].Score2);
Swap_Message(&Students[a].Score3,&Students[b].Score3);
Students[a].Sum_Score=Students[a].Score1+Students[a].Score2+Students[a].Score3;
Students[a].Average_Score=Students[a].Sum_Score/3.0;
Students[b].Sum_Score=Students[b].Score1+Students[b].Score2+Students[b].Score3;
Students[b].Average_Score=Students[b].Sum_Score/3.0;
}
void Delete_Student()//对学生信息进行删除
{
int tar;
int rate;//某学生信息在结构体中的位置
printf("请输入要删除的学生id: ");
fscanf(file,"%d",&tar);
printf("%d\n",tar);
for(int i=0;i<Last;i++)
{
if(Students[i].Id==tar)
{
rate=i;
break;
}
}
while(rate<Last)
{
Swap(rate,rate+1);
rate++;
}
Last--;
}
void Modify_Student()//对学生信息进行修改
{
int tar;
int rate;
printf("请输入要修改学生的id号: ");
fscanf(file,"%d",&tar);
printf("%d\n",tar);//让每一步的数据读取在操作界面可视
for(int i=0;i<Last;i++)
{
if(Students[i].Id==tar)
{
rate=i;
break;
}
}
printf("请输入学生三科成绩(以空格间隔): ");
fscanf(file,"%d%d%d",&Students[rate].Score1,&Students[rate].Score2,&Students[rate].Score3);
printf("%d %d %d\n",Students[rate].Score1,Students[rate].Score2,Students[rate].Score3);
Students[rate].Sum_Score=Students[rate].Score1+Students[rate].Score2+Students[rate].Score3;
Students[rate].Average_Score=Students[rate].Sum_Score/3.0;
}
void Sort_Student_Id_Down()//对学生进行按id降序排序
{
printf("学生成绩按id从小到大排序名单如下:\n");
for(int i=0;i<Last;i++)
{
for(int j=i+1;j<Last;j++)
{
if(Students[i].Id>Students[j].Id)
Swap(i,j);
}
}
putout();
}
void Sort_Student_Id_Up()//对学生进行按id升序排序
{
printf("学生成绩按id从大到小排序名单如下:\n");
for(int i=0;i<Last;i++)
{
for(int j=i+1;j<Last;j++)
{
if(Students[i].Id<Students[j].Id)
Swap(i,j);
}
}
putout();
}
void Sort_Sum_Down()//对学生进行按总成绩降序排序
{
printf("学生按总成绩从小到大排序名单如下:\n");
for(int i=0;i<Last;i++)
{
for(int j=i+1;j<Last;j++)
{
if(Students[i].Sum_Score>Students[j].Sum_Score)
Swap(i,j);
}
}
putout();
}
void Sort_Sum_Up()//对学生进行按总成绩升序排序
{
printf("学生按总成绩从大到小排序名单如下:\n");
for(int i=0;i<Last;i++)
{
for(int j=i+1;j<Last;j++)
{
if(Students[i].Sum_Score<Students[j].Sum_Score)
Swap(i,j);
}
}
putout();
}
void Search_Student()//搜索某学生信息
{
printf("输入要查询学生的id\n");
int tar;
int rate;//某学生信息在结构体中的位置
fscanf(file,"%d",&tar);
printf("%d\n",tar);//让每一步的数据读取在操作界面可视
for(int i=0;i<Last;i++)
{
if(Students[i].Id==tar)
{
printf("学生id: %d 三门成绩分别为:%d %d %d 总成绩: %lf 平均分: %lf\n",Students[i].Id,Students[i].Score1,Students[i].Score2,Students[i].Score3,Students[i].Sum_Score,Students[i].Average_Score);
break;
}
}
}
void Write_File()//写入文件
{
FILE *file2;
file2 = fopen("C:/Users/86135/Desktop/list.txt","r");
fwrite(&Students[0],sizeof(Students[0]),100,file2);
fclose(file2);
}
void Read_File()//读取文件数据
{
file = fopen("C:/Users/86135/Desktop/students.txt","r");
if(file==NULL)//如果未打开就提示读取错误
{
printf("读取信息失败\n");
}else{
printf("读取信息成功\n");
}
}
void Message_List()//显示所有学生信息
{
putout();
printf("\n");
}
int main()
{
Menu();
Read_File();
//Message_List();
while(1)
{
char chance;
fscanf(file,"%c",&chance);
Judge(chance);
if(If_End==1) break;
}
fclose(file);
Write_File();//最终成绩写入文件
return 0;
}