用C-FREE 做一个学生成绩管理系统 100分求 验货有效追加200

2025-05-13 02:08:26
推荐回答(1个)
回答(1):

#include 
#include 
#include 

const unsigned MAXSTUDS = 150; // 学生人数
const unsigned MAXITEMS = 4; // 课程数目

struct student {
unsigned id; // 学号
char name[16];
double scores[MAXITEMS + 2]; // 增加平均成绩和总成绩
}stus[MAXSTUDS];

int num_stus = 0;  // 当前学生人数
char filename[60] = {'\0'}; // 学生数据文件的名称

// 读磁盘数据
void ReadFile() {
int i,an;
FILE *fin;
if(filename[0] == '\0') {
printf("请输入文件名:");
fflush(stdin);
gets(filename);
}
fin = fopen(filename,"rb");
if(fin == NULL) {
printf("不能打开文件:%s\n",filename);
return;
}
if(num_stus > 0) {
do {
printf("新读入的数据将:\n1、追加到现有数据的的尾部\n2、覆盖现有数据\n");
printf("请选择:");
}while(scanf("%d",&an) != 1 || an < 1 || an > 2);
switch(an) {
case 1 : for(i = num_stus; i < MAXSTUDS && !feof(fin); ++i)
 fread(&stus[i],sizeof(struct student),1,fin);
num_stus = i;
fclose(fin);
break;
case 2 : for(i = 0; i < MAXSTUDS && !feof(fin); ++i)
 fread(&stus[i],sizeof(struct student),1,fin);
num_stus = i;
fclose(fin);
break;
}
}
else {
for(i = 0; i < MAXSTUDS && !feof(fin); ++i)
fread(&stus[i],sizeof(struct student),1,fin);
num_stus = i;
fclose(fin);
}
}

// 数据存盘
void WriteFile() {
int i;
FILE *fout;
if(filename[0] == '\0') {
printf("请输入文件名:");
fflush(stdin);
gets(filename);
}
fout = fopen(filename,"wb");
if(fout == NULL) {
printf("无法打开文件:%s\n",filename);
return;
}
printf("正在写文件:%s......\n",filename);
for(i = 0; i < num_stus; ++i)
fwrite(&stus[i],sizeof(struct student),1,fout);
printf("成功创建文件:%s\n",filename);
}

// 读入学生的信息,总成绩和平均成绩由计算获取
void ReadData(struct student *a,int model) { // model 1:不用读入学号,2:不用读入姓名
int i;
if(model != 1) {
printf("学号:");
scanf("%u",&a->id);
}
if(model != 2) {
fflush(stdin);
printf("姓名:");
gets(a->name);
}
printf("输入%d门成绩(空格隔开):",MAXITEMS);
a->scores[MAXITEMS + 1] = 0;
for(i = 0; i < MAXITEMS; ++i) {
scanf("%lf",&a->scores[i]);
a->scores[MAXITEMS + 1] += a->scores[i];
}
a->scores[MAXITEMS] = a->scores[MAXITEMS + 1] / MAXITEMS;
}

void Browse() {
int i,j,nopass[MAXITEMS];
double score,total[MAXITEMS];
double min[MAXITEMS]; // 各科最差成绩
double max[MAXITEMS]; // 各科最好成绩
if(num_stus == 0) return;
for(i = 0; i < MAXITEMS; ++i) {
min[i] = 100;
max[i] = total[i] = 0;
nopass[i] = 0;
}
for(i = 0; i < 27 + 8 * MAXITEMS; ++i) printf("*");
printf("\n");
for(i = 0; i < num_stus; ++i) {
printf("%03d %6s ",stus[i].id,stus[i].name);
for(j = 0; j < MAXITEMS; ++j) {
score = stus[i].scores[j];
printf("%7.2lf ",score);
total[j] += score;
if(score < min[j]) min[j] = score;
if(score > max[j]) max[j] = score;
if(score < 60) ++nopass[j];
}
printf("%7.2lf %7.2lf\n",stus[i].scores[MAXITEMS],stus[i].scores[MAXITEMS + 1]);
}
for(i = 0; i < 27 + 8 * MAXITEMS; ++i) printf("*");
printf("\n");
printf("最好成绩:  ");
for(i = 0; i < MAXITEMS; ++i) printf("%7.2lf ",max[i]);
printf("\n");
printf("最差成绩:  ");
for(i = 0; i < MAXITEMS; ++i) printf("%7.2lf ",min[i]);
printf("\n");
printf("平均成绩:  ");
for(i = 0; i < MAXITEMS; ++i) printf("%7.2lf ",total[i] / num_stus );
printf("\n");
printf("  不及格:  ");
for(i = 0; i < MAXITEMS; ++i) printf("%7d ",nopass[i]);
printf("\n");
for(i = 0; i < 27 + 8 * MAXITEMS; ++i) printf("=");
printf("\n");
}

int HasThis(unsigned id) {
int i;
for(i = 0; i < num_stus; ++i) {
if(stus[i].id == id)
return i;
}
return -1;
}

void Insert() {
int an;
struct student *a;
do {
a = &stus[num_stus];
printf("请输入学号:");
scanf("%u",&a->id);
if(HasThis(a->id) == -1) {
ReadData(a,1);
++num_stus;
do {
fflush(stdin);
printf("0:返回,其他继续。\n");
printf("请选择:");
}while(scanf("%d",&an) != 1);
}
else printf("重复的学号:%u\n",a->id);
}while(an && num_stus < MAXSTUDS - 1);
}

void Query() {
unsigned id;
printf("请输入学号:");
scanf("%u",&id);
if(HasThis(id) >= 0) printf("找到了!\n");
else printf("没有找到学号是:%u 的学生。\n",id);
}

void Sort() {
int i,j,k;
struct student t;
for(i = 0; i < num_stus - 1; ++i) {
k = i;
for(j = i + 1; j < num_stus; ++j) {
if(stus[k].scores[MAXITEMS + 1] < stus[j].scores[MAXITEMS + 1])
k = j;
}
if(k != i) {
t = stus[i];
stus[i] = stus[k];
stus[k] = t;
}
}
}

int Erase() {
int i,res;
unsigned id;
printf("请输入学号:");
scanf("%u",&id);
res = HasThis(id);
if(res == -1) {
printf("没有找到学号是:%u 的学生。\n",id);
return 0;
}
for(i = res; i < num_stus - 1; ++i)
stus[i] = stus[i + 1];
--num_stus;
printf("删除成功。\n");
return 1;
}

int menu_select() {
int com;
char cn[20];
printf("1、录入\n");
printf("2、浏览\n");
printf("3、查询\n");
printf("4、排序\n");
printf("5、删除\n");
printf("6、读文件\n");
printf("7、写文件\n");
printf("0、退出管理系统\n");
printf("选择0 - 7:");
for(;;) {
fflush(stdin);
gets(cn);
com = atoi(cn);
if(com < 0 || com > 7) printf("输入错误,重新选择0 - 7:");
else break;
}
return com;
}


void handle_menu() {
for(;;) {
switch(menu_select()) {
case 1 : printf(">> 录入......\n"); Insert(); break;
case 2 : printf(">> 浏览......\n"); Browse(); break;
case 3 : printf(">> 查询......\n"); Query(); break;
case 4 : printf(">> 排序......\n"); Sort(); break;
case 5 : printf(">> 删除......\n"); Erase(); break;
case 6 : printf(">> 读数据文件......\n"); ReadFile(); break;
case 7 : printf(">> 数据存盘......\n");WriteFile(); break;
case 0 : printf(">> 退出管理系统\n"); return; break;
}
}
}

int main() {
handle_menu();
return 0;
}