#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30
const char *PATH="student.bin"; //文件的路径
int n=0;
typedef struct student
{
char cNo[13]; //12位的学号
char cName[11];//10个英文字符,或5个汉字
float chinese;
float math;
float english;
float total; //总分
float aver; //平均分
}STUDENT;
void acceptData(STUDENT stu[],int n,int m);
void calcByCourse(STUDENT stu[],int n,int m);
void calcByStudent(STUDENT stu[],int n,int m);
void sortByTotalAsc(STUDENT stu[],int n,int m);
void sortByTotalDesc(STUDENT stu[],int n,int m);
void sortByStuNo(STUDENT stu[],int n,int m);
void sortByName(STUDENT stu[],int n,int m);
void findByNo(STUDENT stu[],int n,int m);
void findByName(STUDENT stu[],int n,int m);
void calcByGrade(STUDENT stu[],int n,int m);
void printAllStu(STUDENT stu[],int n,int m);
void saveToFile(STUDENT stu[],int n,int m);
void loadFromFile(STUDENT stu[],int n);
void Swap(struct student *p,struct student *p1);
int main()
{
STUDENT stu[N];
int n,m=3;
printf("1.Input record\n");
printf("2.Caculate total and average score of every course\n");
printf("3.Caculate total and average score of every student\n");
printf("4.Sort in descending order by total score of every student\n");
printf("5.Sort in ascending order by total score of every student\n");
printf("6.Sort in ascending order by number\n");
printf("7.Sort in dictionary order by name\n");
printf("8.Search by number\n");
printf("9.Search by name\n");
printf("10.Statistic analysis for every course\n");
printf("11.List record\n");
printf("12.Write to a file\n");
printf("13.Read from a file\n");
printf("0.Exit\n");
printf("Please enter your choice:\n");
printf("How many students?\n");
scanf("%d",&n);
acceptData(stu,n,m);
printf("\n计算每门课程的总分和平均分:\n");
calcByCourse(stu,n,m);
printf("\n计算每个学生的总分和平均分:\n");
calcByStudent(stu,n,m);
printf("\n按每个学生的总分由高到低排出名次表:\n");
sortByTotalAsc(stu,n,m);
printf("\n按每个学生的总分由低到高排出名次表\n");
sortByTotalDesc(stu,n,m);
printf("\n按学号由小到大排出成绩表:\n");
sortByStuNo(stu,n,m);
printf("\n按姓名的字典顺序排出成绩表:\n");
sortByName(stu,n,m);
printf("\n按学号查询学生排名及其考试成绩:\n");
findByNo(stu,n,m);
printf("\n按姓名查询学生排名及其考试成绩:\n");
findByName(stu,n,m);
calcByGrade(stu,n,m);
printf("\n输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分:\n");
printAllStu(stu,n,m);
printf("\n将每个学生的记录信息写入文件\n");
saveToFile(stu,n,m);
printf("\n从文件中读出每个学生的记录信息并显示\n");
loadFromFile(stu,n);
return 0;
}
//录入每个学生的学号、姓名和各科考试成绩
void acceptData(STUDENT stu[],int n,int m)
{
int i;
for(i=0;i<n;i++)
{
printf("Input record %d:\n",i+1);
scanf("%s",&stu[i].cNo);
stu[i].cNo[12]='\0';
scanf("%s",&stu[i].cName);
stu[i].cName[10]='\0';
scanf("%f",&stu[i].chinese);
if(stu[i].chinese<0||stu[i].chinese>100)//确保输入的成绩在0到100之间
{
printf("error!\n请重新输入:");
scanf("%f",&stu[i].chinese);
}
scanf("%f",&stu[i].math);
if(stu[i].math<0||stu[i].math>100)//确保输入的成绩在0到100之间
{
printf("error!\n请重新输入:");
scanf("%f",&stu[i].math);
}
scanf("%f",&stu[i].english);
if(stu[i].english<0||stu[i].english>100)//确保输入的成绩在0到100之间
{
printf("error!\n请重新输入:");
scanf("%f",&stu[i].english);
}
}
}
//计算每门课程的总分和平均分
void calcByCourse(STUDENT stu[],int n,int m)
{
int i;
float sum;
sum=0;
for(i=0;i<n;i++)
{
sum+=stu[i].chinese;
}
printf("语文的总分为:%f ",sum);
printf("语文的平均分为:%f\n",sum/n);
sum=0;
for(i=0;i<n;i++)
{
sum+=stu[i].math;
}
printf("数学的总分为:%f ",sum);
printf("数学的平均分为:%f\n",sum/n);
sum=0;
for(i=0;i<n;i++)
{
sum+=stu[i].english;
}
printf("英语的总分为:%f ",sum);
printf("英语的平均分为:%f\n",sum/n);
}
//计算每个学生的总分和平均分
void calcByStudent(STUDENT stu[],int n,int m)
{
int i;
float sum;
for(i=0;i<n;i++)
{
sum=0;
sum+=stu[i].chinese;
sum+=stu[i].math;
sum+=stu[i].english;
stu[i].total=sum;
stu[i].aver=sum/m;
printf("%d的总分为%f,平均分为%f\n",i,stu[i].total,stu[i].aver);
}
}
//按每个学生的总分由高到低排出名次表
void sortByTotalAsc(STUDENT stu[],int n,int m)
{
int i,j;
struct student *pstr;
struct student *pstr1;
for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
if(stu[i].total<stu[j].total)
{
pstr=&stu[i];
pstr1=&stu[j];
Swap(pstr,pstr1);
}
}
}
for(i=0;i<n;i++)
{
printf("第%d名,%f分\n",i+1,stu[i].total);
}
}
//按每个学生的总分由低到高排出名次表
void sortByTotalDesc(STUDENT stu[],int n,int m)
{
int i,j;
struct student *pstr;
struct student *pstr1;
for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
if(stu[i].total>stu[j].total)
{
pstr=&stu[i];
pstr1=&stu[j];
Swap(pstr,pstr1);
}
}
}
for(i=0;i<n;i++)
{
printf("第%d名,%f分\n",i+1,stu[i].total);
}
}
//按学号由小到大排出成绩表
void sortByStuNo(STUDENT stu[],int n,int m)
{
int i,j;
struct student *pstr;
struct student *pstr1;
for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
if(strcmp(stu[i].cNo,stu[j].cNo)>0)
{
pstr=&stu[i];
pstr1=&stu[j];
Swap(pstr,pstr1);
}
}
}
for(i=0;i<n;i++)
{
printf("%f,%f,%f,%f\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
}
}
//按姓名的字典顺序排出成绩表
void sortByName(STUDENT stu[],int n,int m)
{
int i,j;
struct student *pstr;
struct student *pstr1;
for(i=0;i<n-1;i++)
{
for(j=0;j<n;j++)
{
if(strcmp(stu[i].cName,stu[j].cName)>0)
{
pstr=&stu[i];
pstr1=&stu[j];
Swap(pstr,pstr1);
}
}
}
for(i=0;i<n;i++)
{
printf("%f,%f,%f,%f\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
}
}
//按学号查询学生排名及其考试成绩
void findByNo(STUDENT stu[],int n,int m)
{
char pNo[13];
int i,flag=0;
scanf("%s",pNo);
pNo[12]='\0';
for(i=0;i<n;i++)
{
flag=0;
if(strcmp(pNo,stu[i].cNo)==0)
{
flag=1;
}
if(flag==1)
{
printf("该学生的学号排名为:%d,考试成绩为:%f ,%f ,%f ,%f\n",i+1,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
break;
}
}
if(flag==0)
{
printf("没有此学生!");
}
}
//按姓名查询学生排名及其考试成绩
void findByName(STUDENT stu[],int n,int m)
{
char pNo[13];
int i,flag=0;
scanf("%s",pNo);
pNo[12]='\0';
for(i=0;i<n;i++)
{
flag=0;
if(strcmp(pNo,stu[i].cName)==0)
{
flag=1;
}
if(flag==1)
{
printf("该学生的学号排名为:%d,考试成绩为:%f ,%f ,%f ,%f\n",i+1,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total);
break;
}
}
if(flag==0)
{
printf("没有此学生!\n");
}
}
//对每门课程分别统计每个类别的人数及所占的百分比
void calcByGrade(STUDENT stu[],int n,int m)
{
float a[3][5];
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{
a[i][j]=0;
}
}
for(i=0;i<n;i++)
{
if(stu[i].chinese>=90)
{
(a[0][0])++;
}
else if(stu[i].chinese>80&&stu[i].chinese<90)
{
(a[0][1])++;
}
else if(stu[i].chinese>70&&stu[i].chinese<80)
{
(a[0][2])++;
}
else if(stu[i].chinese>60&&stu[i].chinese<70)
{
(a[0][3])++;
}
else
{
(a[0][4])++;
}
}
for(i=0;i<n;i++)
{
if(stu[i].math>=90)
{
(a[1][0])++;
}
else if(stu[i].math>80&&stu[i].math<90)
{
(a[1][1])++;
}
else if(stu[i].math>70&&stu[i].math<80)
{
(a[1][2])++;
}
else if(stu[i].math>60&&stu[i].math<70)
{
(a[1][3])++;
}
else
{
(a[1][4])++;
}
}
for(i=0;i<n;i++)
{
if(stu[i].english>=90)
{
(a[2][0])++;
}
else if(stu[i].english>80&&stu[i].english<90)
{
(a[2][1])++;
}
else if(stu[i].english>70&&stu[i].english<80)
{
(a[2][2])++;
}
else if(stu[i].english>60&&stu[i].english<70)
{
(a[2][3])++;
}
else
{
(a[2][4])++;
}
}
for(i=0;i<5;i++)
{
printf("第%d等\n",i+1);
printf("chinese %f,math %f,english %f\n",a[0][i]/n,a[1][i]/n,a[2][i]/n);
}
}
//输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分
void printAllStu(STUDENT stu[],int n,int m)
{
int i;
for(i=0;i<n;i++)
{
printf("\n%s,%s,%f,%f,%f,%f,%f\n",stu[i].cNo,stu[i].cName,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total,stu[i].aver);
}
}
//将每个学生的记录信息写入文件student.txt中
void saveToFile(STUDENT stu[],int n,int m)
{
FILE * fp;
int i;
if((fp = fopen("F:\\PATH","w")) == NULL)
{
printf("Failure to open student.bin!\n");
exit(0);
}
fprintf(fp,"%d\t%d\n",n,m);
for(i=0;i<n;i++)
{
fprintf(fp,"%s,%s,%f,%f,%f,%f,%f",stu[i].cNo,
stu[i].cName,
stu[i].chinese,
stu[i].math,
stu[i].english,
stu[i].total,
stu[i].aver);
}
fclose(fp);
}
//从文件中读出每个学生的记录信息并显示
void loadFromFile(STUDENT stu[],int n)
{
FILE * fp;
int i=0;
if((fp = fopen("F:\\PATH","r")) == NULL)
{
printf("Failure to open student.txt!\n");
exit(0);
}
while(!feof(fp))
{
fread(&stu[i],sizeof(STUDENT),1,fp);
i++;
}
i=0;
while(i<n)
{
printf("\n%s,%s,%f,%f,%f,%f,%f\n",stu[i].cNo,stu[i].cName,stu[i].chinese,stu[i].math,stu[i].english,stu[i].total,stu[i].aver);
i++;
}
fclose(fp);
}
//交换结构体内部的两组数据
void Swap(struct student *p,struct student *p1)
{
struct student a;
a=*p1;
*p1=*p;
*p=a;
}
学生信息管理系统
最新推荐文章于 2023-05-17 11:02:54 发布