#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 3
typedef struct student
{
char studentID[12];
char name[20];
float score[3];
float sum;
float aver;
}STU;
void f_menu();
unsigned short int Input(STU* p, int n);
int f_initial(STU stu[]);
void SavetoFile(STU* stu, int num);
void f_output(STU* p, int n);
void f_px(STU* p, int n);
void f_find(STU* p, int n);
void f_max();
void f_findfail();
//主函数
int main(void)
{
STU stu[N];
int select = 0;
int anum = 0;
char ch;
f_menu();
while (1)
{
printf("请选择功能(0~5):");
scanf_s("%d", &select);
ch=getchar();
printf("\n");
switch (select)
{
case 0:exit(0);
case 1:anum = f_initial(stu);
f_output(stu, anum);
break;
case 2:f_px(stu, N);
break;
case 3:f_findfail();
break;
case 4:f_max();
break;
case 5:f_find(stu, N);
break;
}
}
return 0;
}
//菜单
void f_menu()
{
printf("==========欢迎使用“班级成绩管理系统”==========\n");
printf("1.显示全班同学信息(如果没有就录入)\n");
printf("2.全班同学成绩降序排序显示\n");
printf("3.显示所有不及格同学信息\n");
printf("4.查询最高分\n");
printf("5.按姓名来查询成绩\n");
printf("0.退出系统\n");
}
//初始化系统
int f_initial(STU stu[])
{
//system("cls");
int num = 0;
STU* p = stu;
FILE* fp;
fopen_s(&fp,"xuesheng.txt", "wb");
if (fp == NULL)
{
printf("Failure to open xuesheng.txt!\n");
exit(0);
}
while (1)
{
if (fread(p, sizeof(STU), 1, fp) != 1)
{
//printf("Read from file error!\n");
break;
}
num++;
p++;
}
printf("班级学生总人数:%d\n", num);
fclose(fp);
if (num == 0) //如果从文件中导入的个数为0,则从键盘录入信息
{
Input(stu, N);
num = N;
SavetoFile(stu, num);
}
return num;
}
//录入学生信息
unsigned short int Input(STU* p, int n)
{
int i, j;
char ch;
if (p == NULL)
{
printf("无指针指向\n");
return 0;
}
if (n <= 0)
{
printf("人数不合理\n");
return 0;
}
for (i = 0; i < n; i++)
{
printf("请输入第 %d 个人的学号:", i + 1);
gets_s((*p).studentID);
printf("请输入第 %d 个人的姓名:", i + 1);
gets_s((*p).name);
printf("请输入第 %d 个人的三门成绩:", i + 1);
p->sum = 0;
for (j = 0; j < 3; j++)
{
scanf_s("%f", &((p->score)[j]));
p->sum = p->sum + (p->score)[j];
ch=getchar();//处理回车符
}
p++;
}
return 1;
}
//保存数据到文件
void SavetoFile(STU* stu, int num)
{
int i = 0;
FILE* fp;
fopen_s(&fp, "D:\\afterc.txt", "wb");
if (fp== NULL)
{
printf("Open error!\n");
exit(0);
}
for (i = 0; i < num; i++)
{
if (fwrite(stu, sizeof(STU), 1, fp) != 1)
{
printf("写入第%d 个学生信息失败!\n", i + 1);
}
stu++;
}
fclose(fp);
}
//输出
void f_output(STU* p, int n)
{
int i;
for (i = 0; i < n; i++, p++)
{
printf("第%d 个学生:学号:%s,姓名:%s,总分:%.2f,平均分:%.2f\n", i + 1,
p->studentID, p->name, p->sum, (p->sum) / 3);
}
}
//成绩排名
void f_px(STU* p, int n)
{
STU* (pSTU[N]), * temp;
STU** pf;
int i;
for (pf = pSTU, i = 0; i < n; pf++, i++)
{
*pf = p + i;
}
for (i = 0; i < n; i++)
{
for (pf = pSTU; pf < pSTU + n - 1 - i; pf++)
{
if ((**pf).sum < (*(pf + 1))->sum)
{
temp = *pf;
*pf = *(pf + 1);
*(pf + 1) = temp;
}
}
}
for (pf = pSTU, i = 0; i < n; pf++, i++)
{
printf("第%d名:%s %.2f分\n", i + 1, (*pf)->name, (*pf)->sum);
}
}
//查找学生信息
void f_find(STU* p, int n)
{
STU* pf;
char nm[20];
int i = 0;
int k;
printf("请输入要查找的学生的姓名:");
gets_s(nm);
for (pf = p; pf <= p + n - 1; pf++)
{
k= strcmp(nm, pf->name);
if (k == 0)
{
printf("该生各科成绩如下:");
for (i = 0; i < 3; i++)
{
printf("%.2f ", (pf->score)[i]);
}
printf("总分:%.2f,平均分:%.2f\n", pf->sum, (pf->sum) / 3);
break;
}
}
}
//查找最高分
void f_max()
{
STU stu[N] = { 0 };
int i, j = 0;
FILE* fp;
int m = 0;
fopen_s(&fp, "D:\\afterc.txt", "rb");
if (fp== NULL)
{
printf("Open error!\n");
exit(0);
}
while (!feof(fp))
{
if ((fread(&stu[m], sizeof(STU), 1, fp)) == 1)
{
m++;
}
}
fclose(fp);
if (m == 0)
{
printf("文件中没有内容!\n");
}
for (i = 0; i < m; i++)
{
if (stu[i].sum > stu[j].sum)
j = i;
}
printf("总成绩最高的同学是:\n");
printf("学号:%s,姓名:%s,总分:%.2f,平均分:%.2f\n", stu[j].studentID, stu[j].name, stu[j].sum, stu[j].sum / 3);
}
//查找不及格同学信息
void f_findfail()
{
STU stu[N];
int i, m = 0;
FILE* fp;
int ch;
fopen_s(&fp, "D:\\afterc.txt", "rb");
if (fp == NULL)
{
printf("Open error!\n");
exit(0);
}
while (!feof(fp))
{
if ((fread(&stu[m], sizeof(STU), 1, fp)) == 1)
{
m++;
}
}
fclose(fp);
if (m == 0)
{
printf("文件中没有内容!\n");
}
printf("1.第一门成绩不及格\n2.第二门成绩不及格\n3.第三门成绩不及格\n请选择:");
scanf_s("%d", &ch);
switch (ch)
{
case 1:
for (i = 0; i < m; i++)
{
if (stu[i].score[0] < 60)
printf("学号:%s,姓名:%s,分数:%.2f\n", stu[i].studentID, stu[i].name, stu[i].score[0]);
}
break;
case 2:
for (i = 0; i < m; i++)
{
if (stu[i].score[1] < 60)
printf("学号:%s,姓名:%s,分数:%.2f\n", stu[i].studentID, stu[i].name, stu[i].score[2]);
}
break;
case 3:
for (i = 0; i < m; i++)
{
if (stu[i].score[2] < 60)
printf("学号:%s,姓名:%s,分数:%.2f\n", stu[i].studentID, stu[i].name, stu[i].score[2]);
}
break;
}
}