📄 001.cpp
字号:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
/*========定义结构体=========*/
typedef struct
{
char classno[10]; //学生所在班级
int no; //学生班级学号
char name[10]; //学生姓名
int score[4]; //课程各分数
}stud; //存放学生信息的结构体
/**/
void pprintf(); //输出当前信息情况函数
void manage(); //管理模块
void find(); //查找模块
void all(); //统计模块
/**/
void instud(); //添加函数
void destud(); //删除函数
void orderstud(); //排序函数
/**/
void nostud();
void scstud();
/**/
void namefind(); //名字查找函数
void numfind(); //学号查找函数
void course(); //课程查找函数
/**/
void high(); //统计出最高分函数
void low(); //统计出最低分函数
void alv(); //统计出平均分函数
void pass(); //统计出各门功课的通过率函数
/**/
stud s1,s2,temp; //定义几个外部变量
stud s[30];
int i,j,k,exchange;
FILE *fp;
/*===================================主菜单模块main函数=====================================*/
void main()
{
int xz;
if((fp=fopen("student.txt","ab+"))==NULL)
{printf("\n>>不能打开student.txt文件");return;}
rewind(fp);
for(i=0;!feof(fp);i++)
fread(&s[i],sizeof(stud),1,fp);
i--; //i已经记录了学生的个数
fclose(fp);
//信息已经读取到s[]结构体数组中
do
{
printf(">>主选菜单:1.管理信息 2.统计信息 3.查找学生信息 4.输出 0.退出=>");
scanf("%d",&xz);
switch(xz)
{
case 1:manage();break;
case 2:all();break;
case 3:find();break;
case 4:pprintf();break;
case 0:exit(0);
default:printf("\n>>请选择正确的选项:");
}
}while(1); //使用循环对主菜单进行控制
}
/*================================manage模块========================================*/
void manage()
{
int mxz;
do
{
printf(">>菜单选择:1.添加学生 2.删除学生 3.排序 4.输出 0.返回=>");
scanf("%d",&mxz);
switch(mxz)
{
case 1:instud();break;
case 2:destud();break;
case 3:orderstud();break;
case 4:pprintf();break;
case 0:return;
default:printf("\n>>请选择正确的选项:");
}
}while(1);
return;
}
void instud()
{
int ixz;
if((fp=fopen("student.txt","ab+"))==NULL)
{printf("\n>>不能创建或打开student.txt文件");return;}
printf(">>请输信息:班级 学号 姓名 分数(语 数 外)");
scanf("%s%d%s%d%d%d",s1.classno,&s1.no,s1.name,&s1.score[0],&s1.score[1],&s1.score[2]);
s1.score[3]=s1.score[0]+s1.score[1]+s1.score[2];
rewind(fp);
do
{
fread(&s2,sizeof(stud),1,fp);
if(s1.no==s2.no) break;
}while(!feof(fp));
if(!feof(fp))
{
printf("\n>>该学生信息已经存在,保存失败!\n>>是否按此修改该学生信息:1.是 0.否");
scanf("%d",&ixz);
while(1)
{
switch(ixz)
{
case 1:
{
fseek(fp,-(long)sizeof(stud),1);
fwrite(&s1,sizeof(stud),1,fp);
printf("\n>>修改成功!");break;
}
case 0:return;
default:printf(">>\n情感选择正确的选项");
}
}
}
else fwrite(&s1,sizeof(stud),1,fp);
fclose(fp);
}
void destud() //删除学生记录
{
int dxz,exchange=0;
printf("\n>>请输入需要删除的学生的学号:");
scanf("%d",&dxz);
if((fp=fopen("student.txt","ab+"))==NULL)
{printf("\n>>不能打开student.txt文件");return;}
rewind(fp);
for(i=0;!feof(fp);i++)
{
fread(&s[i],sizeof(stud),1,fp); //信息已经读取到s[]结构体数组中
if(s[i].no==dxz)
{
printf("\n>>找到,进行删除……\n");
i--;
exchange++;
}
} //i已经记录了学生的个数
if(!exchange)
{printf("\n>>没有找到要删除的学生!\n");fclose(fp);return;}
if((fp=fopen("student.txt","wb+"))==NULL) //重新写入文件
{printf("\n>>不能创建student.txt文件");return;}
for(j=0;j<i;j++)
fwrite(&s[j],sizeof(stud),1,fp); //学生信息在s[]结构体数组中存在
fclose(fp);
}
/*==========================排序模块================================*/
void orderstud()
{
int oxz;
do
{
printf(">>选择方式:1.学号 2.成绩 3.输出 0.返回=>");
scanf("%d",&oxz);
switch(oxz)
{
case 1:nostud();break;
case 2:scstud();break;
case 3:pprintf();break;
case 0:return;
default:printf("\n>>请选择正确的选项!");
}
}while(1);
return;
}
void nostud()//================按学号排名
{
for(j=0;j<i-1;j++) //i已经记录学生个数使用冒泡排序
{
exchange=0;
for(k=i-2;k>=j;k--)
if(s[k+1].no<s[k].no) //s[k+1]是原来排在最后的学生
{
temp=s[k+1];
s[k+1]=s[k];
s[k]=temp;
exchange=1;
}
if(!exchange) break;
}
printf("\n>>班级 学号 姓名 分数(语、数、外)");
if((fp=fopen("student.txt","wb+"))==NULL)
{printf("\n>>不能创建student.txt文件");return;}
for(j=0;j<i;j++)
{
printf("\n%s %d %s %d %d %d",
s[j].classno,
s[j].no,
s[j].name,
s[j].score[0],
s[j].score[1],
s[j].score[2],
s[j].score[3]);
fwrite(&s[j],sizeof(stud),1,fp); //学生信息在s[]结构体数组中存在重新写入文件
}
printf("\n");
fclose(fp);
}
void scstud()//==================按分数排名
{
for(j=0;j<i;j++)
s[j].score[3]=s[j].score[0]+s[j].score[1]+s[j].score[2]; //统计总分
for(j=0;j<i;j++)
{
exchange=0;
{
for(k=i-2;k>=j;k--)
if(s[k+1].score[3]<s[k].score[3])
{
temp=s[k+1];
s[k+1]=s[k];
s[k]=temp;
exchange=1;
}
if(!exchange) break;
}
}
printf("\n>>按总分排名");
printf("\n>>班级 学号 姓名 分数(语、数、外) 总分");
if((fp=fopen("student.txt","wb+"))==NULL)
{printf("\n>>不能创建student.txt文件");return;}
for(j=0;j<i;j++)
{
printf("\n%s %d %s %d %d %d %d",
s[j].classno,
s[j].no,
s[j].name,
s[j].score[0],
s[j].score[1],
s[j].score[2],
s[j].score[3]);
fwrite(&s[j],sizeof(stud),1,fp); //学生信息在s[]结构体数组中存在
}
printf("\n");
fclose(fp);
}
/*===================================统计模块=================================================*/
void all()
{
int axz;
do
{
printf("\n>>选择统计:1.最高分 2.最低分 3.平均分 4.通过率 0.返回=>");
scanf("%d",&axz);
switch(axz)
{
case 1:high();break;
case 2:low();break;
case 3:alv();break;
case 4:pass();break;
case 5:pprintf();break;
case 0:return;
default:printf("\n>>请选择正确的选项!");
}
}while(1);
return;
}
void high() //最高分函数
{
stud a,b,c,d;
a.score[0]=s[0].score[0];
b.score[1]=s[0].score[1];
c.score[2]=s[0].score[2];
d.score[3]=s[0].score[3];
for(j=0;j<i;j++)
{
if(a.score[0]<s[j].score[0]) //找语文最高分
a=s[j];
if(b.score[1]<s[j].score[1]) //找数学最高分
b=s[j];
if(c.score[2]<s[j].score[2]) //找外语最高分
c=s[j];
if(d.score[3]<s[j].score[3]) //找总分最高分
d=s[j];
}
printf("\n>>以下输出各项分数最高的学生信息");
printf("\n>>个个门最高分班级 学号 姓名 分数(语、数、外) 总分");
printf("\n>>语文最高分>>");
printf("%s %d %s %d %d %d %d",
a.classno,
a.no,
a.name,
a.score[0],
a.score[1],
a.score[2],
a.score[3]);
printf("\n>>数学最高分>>");
printf("%s %d %s %d %d %d %d",
b.classno,
b.no,
b.name,
b.score[0],
b.score[1],
b.score[2],
b.score[3]);
printf("\n>>外语最高分>>");
printf("%s %d %s %d %d %d %d",
c.classno,
c.no,
c.name,
c.score[0],
c.score[1],
c.score[2],
c.score[3]);
printf("\n>>总分最高分>>");
printf("%s %d %s %d %d %d %d",
d.classno,
d.no,
d.name,
d.score[0],
d.score[1],
d.score[2],
d.score[3]);
}
void low() //最高分函数
{
stud a,b,c,d;
a.score[0]=s[0].score[0];
b.score[1]=s[0].score[1];
c.score[2]=s[0].score[2];
d.score[3]=s[0].score[3];
for(j=0;j<i;j++)
{
if(a.score[0]>s[j].score[0]) //找语文最高分
a=s[j];
if(b.score[1]>s[j].score[1]) //找数学最高分
b=s[j];
if(c.score[2]>s[j].score[2]) //找外语最高分
c=s[j];
if(d.score[3]>s[j].score[3]) //找总分最高分
d=s[j];
}
printf("\n>>以下输出各项分数最高的学生信息");
printf("\n>>个个门最高分班级 学号 姓名 分数(语、数、外) 总分");
printf("\n>>语文最高分>>");
printf("%s %d %s %d %d %d %d",
a.classno,
a.no,
a.name,
a.score[0],
a.score[1],
a.score[2],
a.score[3]);
printf("\n>>数学最高分>>");
printf("%s %d %s %d %d %d %d",
b.classno,
b.no,
b.name,
b.score[0],
b.score[1],
b.score[2],
b.score[3]);
printf("\n>>外语最高分>>");
printf("%s %d %s %d %d %d %d",
c.classno,
c.no,
c.name,
c.score[0],
c.score[1],
c.score[2],
c.score[3]);
printf("\n>>总分最高分>>");
printf("%s %d %s %d %d %d %d",
d.classno,
d.no,
d.name,
d.score[0],
d.score[1],
d.score[2],
d.score[3]);
}
void alv() //统计平均分函数
{
float a=0,b=0,c=0,d=0;
for(j=0;j<i;j++)
{
a+=s[j].score[0];
b+=s[j].score[1];
c+=s[j].score[2];
d+=s[j].score[3];
}
a=a/i; //语文平均分
b=b/i; //数学平均分
c=c/i; //外语平均分
d=d/i; //总分平均分
printf("\n>>以下各项统计的平均分");
printf("\n>>语文平均分:%.2f",a);
printf("\n>>数学平均分:%.2f",b);
printf("\n>>外语平均分:%.2f",c);
printf("\n>>总分平均分:%.2f",d);
}
void pass() //计算各门课程的通过率
{
float a=0,b=0,c=0;
for(j=0;j<i;j++)
{
if(s[j].score[0]>=60)
a++;
if(s[j].score[1]>=60)
b++;
if(s[j].score[2]>=60)
c++;
}
a=a/i*100;
b=b/i*100;
c=c/i*100;
printf("\n>>以下是各门课程的通过率");
printf("\n>>语文的通过率是%.2f%%",a);
printf("\n>>数学的通过率是%.2f%%",b);
printf("\n>>外语的通过率是%.2f%%",c);
}
/*=============================查找模块=================================*/
void find()
{
int fxz;
do
{
printf("\n>>选择方式:1.名字查找 2.学号查找 3.课程查找 4.输出 0.返回=>");
scanf("%d",&fxz);
switch(fxz)
{
case 1:namefind();break;
case 2:numfind();break;
case 3:course();break;
case 4:pprintf();break;
case 0:return;
default:printf("\n>>请选择正确的选项!");
}
}while(1);
return;
}
void namefind()
{
char fname[10];
stud a;
printf("\n>>请输入需要查找的学生的姓名:");
scanf("%s",&fname);
if((fp=fopen("student.txt","rb+"))==NULL)
{printf("\n>>不能打开student.txt文件");return;}
do
{
fread(&a,sizeof(stud),1,fp);
if(strcmp(fname,a.name)==0)
{
printf("\n>>班级 学号 姓名 分数(语、数、外) 总分");
printf("\n>>%s %d %s %d %d %d %d",
a.classno,
a.no,
a.name,
a.score[0],
a.score[1],
a.score[2],
a.score[3]);
break;
}
}while(!feof(fp));
if(feof(fp)) printf("\n>>没有查找到该学生");
fclose(fp);
}
void numfind()
{
int number;
stud a;
printf("\n>>请输入需要查找的学生的学号 :");
scanf("%d",&number);
if((fp=fopen("student.txt","rb+"))==NULL)
{printf("\n>>不能打开student.txt文件");return;}
do
{
fread(&a,sizeof(stud),1,fp);
if(number==a.no)
{
printf("\n>>班级 学号 姓名 分数(语、数、外) 总分");
printf("\n>>%s %d %s %d %d %d %d",
a.classno,
a.no,
a.name,
a.score[0],
a.score[1],
a.score[2],
a.score[3]);
break;
}
}while(!feof(fp));
if(feof(fp)) printf("\n>>没有查找到该学生");
fclose(fp);
}
void course()//==================课程查找
{
stud a;
int c;
if((fp=fopen("student.txt","rb+"))==NULL)
{printf("\n>>不能打开student.txt文件");return;}
do
{
rewind(fp);
printf("\n>>课程代号:1.语文 2.数学 3.外语 4.总分 0.返回=>");
scanf("%d",&c);
printf("\n>>班级 学号 姓名 成绩");
switch(c)
{
case 1:
case 2:
case 3:
case 4:
{ fread(&a,sizeof(stud),1,fp);
do
{
printf("\n>>%s %d %s %d",a.classno,a.no,a.name,a.score[c-1]);
fread(&a,sizeof(stud),1,fp);
}while(!feof(fp));
}
case 0:return;
default:printf("请正确选择!");
}
fclose(fp);
}while(1);
}
/*=======================输出信息函数=======================*/
void pprintf() //输出当前信息情的况函数
{
stud pp;
if((fp=fopen("student.txt","ab+"))==NULL)
{printf("不能student.txt打开文件");return;}
fseek(fp,0,2);
if(ftell(fp)==0) {printf(">>无任何信息\n");fclose(fp);return;}
else
{
rewind(fp);
printf("班级 学号 姓名 成绩=>");
fread(&pp,sizeof(stud),1,fp);
do
{
printf("\n%s %d %s %d %d %d %d",
pp.classno,
pp.no,
pp.name,
pp.score[0],
pp.score[1],
pp.score[2],
pp.score[3]);
fread(&pp,sizeof(stud),1,fp);
}while(!feof(fp));
printf("\n");
fclose(fp);
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -