之前发布了简易的学生成绩管理系统:点我跳转
今天这个版本,使用了结构体、文件指针。可将信息自定义保存到txt中,并且可以在txt读入信息。
本程序未使用动态申请内存,最大学生数量为50人。
整体程序结构较为严谨,多处验证。
#include
#include
#include
#include
#define true 1
#define false 0
#define num_max 50 //宏定义最大学生人数
//定义学生结构体
struct student{
int id;
char name[20];
int score[3];
int sum;
float aver;
};
//创建结构体数组
struct student stu[num_max];
//菜单选择函数
char menu_select();
//获取学生人数
int get_num();
//新创建输入
void input(struct student stu[],int num);
//输出函数
void output(struct student stu[],int num);
//交换结构体数组的整体信息
void change(struct student *stu1,struct student *stu2);
//删除函数
void del(struct student stu[],int num,int *p);
//查找函数
void search(struct student stu[],int num);
//插入函数
void input_again(struct student stu[],int num,int *p);
//排序函数
void sort(struct student stu[],int num);
//加载
void load_txt(struct student stu[],int num,int *p);
//保存
void save_txt(struct student stu[],int num);
int main()
{
int num;
char ch;
int *p=#
while(1)
{
ch=menu_select();
switch(ch)
{
case '1':system("cls"),num=get_num(),input(stu,num),system("pause");break;
case '2':system("cls"),output(stu,num),system("pause");break;
case '3':system("cls"),search(stu,num),system("pause");break;
case '4':system("cls"),del(stu,num,p),system("pause");break;
case '5':system("cls"),sort(stu,num),system("pause");break;
case '6':system("cls"),input_again(stu,num,p),system("pause");break;
case '7':system("cls"),save_txt(stu,num),system("pause");break;
case '8':system("cls"),load_txt(stu,num,p),system("pause");break;
case '0':break;
default :printf("输入错误");
}
if(ch=='0')
break;
system("cls");
}
}
//菜单选择函数
char menu_select()
{
char n;
printf("********************************************************************************\n");
printf("\t\t\t 欢迎 Welcome to\n");
printf("\n\t\t\t 使用学生成绩查询管理系统\n\n\t\t\t\t\t\n");
printf("*************************************MENU***************************************\n");
printf("\t\t\t1. 输入学生成绩记录 Enter the record\n"); /*输入学生成绩记录*/
printf("\t\t\t2. 显示 Print the record\n"); /*显示*/
printf("\t\t\t3. 寻找 Search record on name\n"); /*寻找*/
printf("\t\t\t4. 删除 mydelete a record\n"); /*删除*/
printf("\t\t\t5. 排序 Sort by ID or sum or average\n"); /*排序*/
printf("\t\t\t6. 插入 Insert record to list\n"); /*插入*/
printf("\t\t\t7. 保存 Save the file\n"); /*保存*/
printf("\t\t\t8. 读取 Load the file\n"); /*读取*/
printf("\t\t\t0. 退出 Quit\n"); /*退出*/
printf("********************************************************************************\n");
do
{
printf("\n\t\t\t输入你的选择Enter your choice(0~8):");
n=getch();
}
while(n<'0'||n>'8'); /*如果选择项不在1~9之间则重输*/
return n;
}
//获取学生人数
int get_num()
{
int num;
do
{
printf("输入学生人数(<50人):");
scanf("%d",&num);
}while(num<=0||num>50);
return num;
}
//新创建输入
void input(struct student stu[],int num)
{
int i,j,flag;
//printf("\n依次输入学生的ID、姓名、成绩:\n");
for(i=0;i<num;i++)
{
flag=true;
printf("\n输入学生的ID:\n");
scanf("%d",&stu[i].id);
for(j=0;j<i;j++)
{
if(stu[i].id==stu[j].id)
{
printf("此ID已录入。");
i--;
flag=false;
break;
}
}
if(flag==true)
{
printf("\n输入学生的姓名及三门课成绩(空格隔开):\n");
scanf("%s %d %d %d",stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver=stu[i].sum/3.0;
}
}
}
//输出函数
void output(struct student stu[],int num)
{
int i;
printf("\n************************************STUDENT************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| ID | Name | Sc1 | Sc2 | Sc3 | Sum | Ave |\n");
printf("-------------------------------------------------------------------------------\n");
for(i=0;i<num;i++)
{
printf("| %4d | %-4s | %3d | %3d | %3d | %3d | %4.2f |\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].aver);
}
}
//查找函数
void search(struct student stu[],int num)
{
int i,j,id;
char ch='a';
char name[20];
printf("选择查找方式:1:按ID查找;2:按姓名查找;0:退出。\n");
while(1)
{
ch=getch();
if(ch=='0')
return ;
if(ch=='1')
{
printf("输入ID:");
scanf("%d",&id);
for(i=0,j=-1;i<num;i++)
{
if(id==stu[i].id)
{
j=i;
break;
}
}
}
if(ch=='2')
{
printf("输入Name:");
scanf("%s",name);
for(i=0,j=-1;i<num;i++)
{
if(strcmp(name,stu[i].name)==0)
{
j=i;
break;
}
else
printf("没有找到此ID信息");
}
}
if(j==-1)
printf("未找到信息");
else
{
printf("\n************************************STUDENT************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| ID | Name | Sc1 | Sc2 | Sc3 | Sum | Ave |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4d | %-4s | %3d | %3d | %3d | %3d | %4.2f |\n",stu[j].id,stu[j].name,stu[j].score[0],stu[j].score[1],stu[j].score[2],stu[j].sum,stu[j].aver);
return ;
}
}
}
//交换结构体数组的整体信息
void change(struct student *stu1,struct student *stu2)
{
struct student temp;
temp=*stu1;
*stu1=*stu2;
*stu2=temp;
}
//删除函数
void del(struct student stu[],int num,int *p)
{
int i,j,id;
char ch='a';
char name[20];
output(stu,num);
printf("选择删除方式:1:按ID删除;2:按姓名删除。0:结束删除。\n");
while(1)
{
ch=getch();
if(ch=='0')
return ;
if(ch=='1')
{
printf("输入ID:");
scanf("%d",&id);
for(i=0,j=-1;i<num;i++)
{
if(id==stu[i].id)
{
j=i;
break;
}
}
}
if(ch=='2')
{
printf("输入Name:");
scanf("%s",name);
for(i=0,j=-1;i<num;i++)
{
if(strcmp(name,stu[i].name)==0)
{
j=i;
break;
}
}
}
if(j==-1)
{
printf("未找到此学生信息");
return ;
}
else
{
for(;j<num;j++)
stu[j]=stu[j+1];
*p=*p-1;
printf("删除成功");
output(stu,num);
return ;
}
}
}
//排序函数
void sort(struct student stu[],int num)
{
int i,j,ch;
printf("1:按总分排序;2:按平均分排序");
ch=getch();
switch(ch)
{
case '1':
for(i=0;i<num;i++)
for(j=0;j<num-1-i;j++)
{
if(stu[j].sum<stu[j+1].sum)
change(&stu[j],&stu[j+1]);
}
case '2':
for(i=0;i<num;i++)
for(j=0;j<num-1-i;j++)
{
if(stu[j].aver<stu[j+1].aver)
change(&stu[j],&stu[j+1]);
}
}
output(stu,num);
}
//插入函数
void input_again(struct student stu[],int num,int *p)
{
int i,j;
if(num>num_max)
printf("超过最大人数,无法继续添加");
else
{
for(i=num,j=0;i<num_max;i++,j++)
{
printf("\n输入学生的ID(ID为0则退出插入):\n");
scanf("%d",&stu[i].id);
if(stu[i].id==0)
break;
printf("\n依次输入学生的姓名、成绩:\n");
scanf("%s %d %d %d",stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver=stu[i].sum/3.0;
printf("插入成功\n");
}
*p=*p+j;
}
}
//保存
void save_txt(struct student stu[],int num)
{
int i;
FILE *fp;
char file_name[50];
printf("输入想要保存的文件名,建议为今日日期(2020-5-2.txt)");
scanf("%s",file_name);
fp=fopen(file_name,"w");
for(i=0;i<num;i++)
{
fprintf(fp,"%d %s %d %d %d\n",stu[i].id,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].sum,stu[i].aver);
}
printf("保存成功,文件名为:%s",file_name);
fclose(fp);
}
//加载
void load_txt(struct student stu[],int num,int *p)
{
int i;
FILE *fp;
char file_name[50];
printf("输入加载的文件名,例如:(2020-5-2.txt)");
scanf("%s",file_name);
fp=fopen(file_name,"r");
if(fp==NULL)
{
printf("未找到该文件。\n");
printf("为避免文件异常,结束程序,请核对好文件名再重新打开本程序。");
exit(1);
}
for(i=0;!feof(fp)&&i<num_max;i++)
{
fscanf(fp,"%d %s %d %d %d",&stu[i].id,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
stu[i].sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver=stu[i].sum/3.0;
}
*p=i-1;
printf("读取文件名为 %s 信息成功",file_name);
fclose(fp);
}