问题描述:综合设计一个程序,要求存储每个学生的信息,包括学号、姓名、性别、出生日期、电话、5门课程的分数等。要求:
要求输入学生信息、按平均分排序、按年龄排序、输出学生信息、输出不及格学生名单到文件等分别以函数来实现。
#include
#include
#include
typedef struct{
int year,mouth,day;
} birthday;
typedef struct{
int score[5];
double aver;
} score;
typedef struct {
char num[30],name[30],tel[30];
int sex;
birthday bir;
score sco;
} student;
typedef struct{
char name[30];
} failstudent;
student stu[2000];
failstudent failstu[2000];
int num;
int scorecmp(const void *a,const void *b){
return ((student*)a)->sco.aver < ((student*)b)->sco.aver;
}
int bircmp(const void *a,const void *b){
return ((student*)a)->bir.year > ((student*)b)->bir.year;
}
int failcmp(const void *a,const void *b){
return strcmp(((failstudent*)a)->name,((failstudent*)b)->name);
}
void input(){
printf("学生数(最大支持2000人):");
scanf("%d",&num);
while(num < 0 || num > 2000)
printf("学生数非法,请再输入一遍:"),scanf("%d",&num);
printf("学号 名字 性别(1为男生,0为女生) 生日(年-月-日) 电话 分数(5个科目)\n");
for(int i = 0;i < num;i++){
scanf("%s %s %d %d-%d-%d %s",stu[i].num,stu[i].name,&stu[i].sex,&stu[i].bir.year,&stu[i].bir.mouth,&stu[i].bir.day,stu[i].tel);
stu[i].sco.aver = 0;
for(int j = 0;j < 5;j++){
scanf("%d",&stu[i].sco.score[j]);
stu[i].sco.aver += (stu[i].sco.score[j] / 5);
}
}
}
void print(){
printf("学号 名字 性别 生日 电话 分数\n");
for(int i = 0;i < num;i++){
printf("%s %s %d %d-%d-%d %s",stu[i].num,stu[i].name,stu[i].sex,stu[i].bir.year,stu[i].bir.mouth,stu[i].bir.day,stu[i].tel);
for(int j = 0;j < 5;j++)
printf(" %d",stu[i].sco.score[j]);
printf("\n");
}
}
void scoresort(){
qsort(stu,num,sizeof(student),scorecmp);
printf("按平均分排序:\n");
print();
}
void birsort(){
qsort(stu,num,sizeof(student),bircmp);
printf("按生日排序:\n");
print();
}
void fail(){
int cnt = 0,isfail = 0;
for(int i = 0;i < num;i++,isfail = 0){
for(int j = 0;j < 5 && !isfail;j++)
if(stu[i].sco.score[j] < 60) isfail = 1;
if(isfail)
strcpy(failstu[cnt++].name,stu[i].name);
}
printf("%d",cnt);
qsort(failstu,cnt,sizeof(failstudent),failcmp);
FILE* fp = fopen("fail.txt","w+");
if(fp) for(int i = 0;i < cnt;i++) fprintf(fp,"%s\n",failstu[i].name);
else printf("文件打开失败");
fclose(fp);
}
signed main(){
input();
scoresort();
birsort();
fail();
}
学生成绩管理程序的设计与实现
#include
#include
#include
typedef struct{
char name[30];
int score[3];
double aver;
} student;
student stu[2000];
int num;
char ret[1000],name[30];
int find(char *name){
for(int i = 0;i < num;i++)
if(!strcmp(stu[i].name,name)) return i;
return -1;
}
char* printdetail(){
printf("请输入学生的姓名:");
scanf("%s",name);
int id = find(name);
if(id == -1) sprintf(ret,"查无此人\n");
else{
student s = stu[id];
sprintf(ret,"姓名:%s\n平均分:%lf\n排名:%d\n各科成绩:%d %d %d",s.name,s.aver,id + 1,s.score[0],s.score[1],s.score[2]);
}
return ret;
}
void printstaistic(){
FILE *fp = fopen("staistic.txt","w+");
int fail[3],excel[3];
double aver[3];
for(int i = 0;i < 3;i++) fail[i] = excel[i] = aver[i] = 0;
for(int i = 0;i < 3;i++)
for(int j = 0;j < num;j++){
if(stu[j].score[i] < 60 ) fail[i]++;
else if(stu[j].score[i] > 80) excel[i]++;
aver[3] += stu[j].score[i]*1.0 / num;
}
if(fp){
fprintf(fp,"平均分 不及格人数 优秀人数\n");
for(int i = 0;i < 3;i++) fprintf(fp,"%lf %d %d\n",aver[i],fail[i],excel[i]);
}
fclose(fp);
}
void printall(){
FILE* fp = fopen("all.txt","w+");
if(fp) {
fprintf(fp,"姓名 科目1 科目2 科目3 平均分\n");
for(int i = 0;i < num;i++){
fprintf(fp,"%s",stu[i].name);
for(int j = 0;j < 3;j++) fprintf(fp," %d",stu[i].score[j]);
fprintf(fp,"%lf\n",stu[i].aver);
}
}
fclose(fp);
}
int cmp(const void * a,const void * b){
return ((student*)a)->aver < ((student*)b)->aver;
}
void printrate(){
FILE* fp = fopen("rate.txt","w+");
if(fp) {
fprintf(fp,"姓名 科目1 科目2 科目3 平均分 排名\n");
for(int i = 0;i < num;i++){
fprintf(fp,"%s",stu[i].name);
for(int j = 0;j < 3;j++) fprintf(fp," %d",stu[i].score[j]);
fprintf(fp,"%lf %d\n",stu[i].aver,i + 1);
}
}
fclose(fp);
}
void input(){
printf("输入的学生数:");
scanf("%d",&num);
while(num < 0 && num > 2000) printf("学生数非法,请重新输入:"),scanf("%d",&num);
printf("姓名 科目1 科目2 科目3\n");
for(int i = 0;i < num;i++){
scanf("%s",stu[i].name);
for(int j = 0;j < 3;j++){
scanf("%d",&stu[i].score[j]);
stu[i].aver += stu[i].score[j] * 1.0 / 3;
}
}
qsort(stu,num,sizeof(student),cmp);
}
void modify(){
printf("请输入学生的姓名:");
scanf("%s",name);
int id = find(name);
if(id == -1) printf("查无此人\n");
else{
printf("修改后的成绩:");
for(int j = 0;j < 3;j++){
scanf("%d",&stu[id].score[j]);
stu[id].aver += stu[id].score[j] * 1.0 / 3;
}
}
qsort(stu,num,sizeof(student),cmp);
}
void teachercontrol(){
int control;
printf("请输入你的操作:(1为查询,2为统计,3为排名,4为打印,5为输入,6为修改)");
scanf("%d",&control);
if(control == 1) printf("%s",printdetail());
else if(control == 2) printstaistic();
else if(control == 3) printrate();
else if(control == 4) printall();
else if(control == 5) input();
else if(control == 6) modify();
}
void studentcontrol(){
FILE *fp = fopen("student.txt","w+");
if(fp) fprintf(fp,"%s",printdetail());
fclose(fp);
}
signed main(){
int c = 1;
while(c >= 1 && c <= 2){
printf("操作者:(1为老师,2为学生)");
scanf("%d",&c);
if(c == 1) teachercontrol();
else if(c == 2) studentcontrol();
}
}