实验5 综合程序设计

8-1 学生信息

问题描述:综合设计一个程序,要求存储每个学生的信息,包括学号、姓名、性别、出生日期、电话、5门课程的分数等。要求:

  • (1)输入学生信息,计算每个学生的平均分,并能分别按平均分和年龄(不考虑月份)从高到低排序,在屏幕上输出排序后的学生信息;
  • (2)* 将有不及格科目的学生姓名按字典序排列,写入文件fail.txt中。

要求输入学生信息、按平均分排序、按年龄排序、输出学生信息、输出不及格学生名单到文件等分别以函数来实现。

#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();
}

8-2 学生成绩管理程序的设计与实现

学生成绩管理程序的设计与实现

  • (1)对学生的姓名、各科成绩进行输入和修改;
  • (2)老师可以对成绩按各种条件进行查询、统计、排名;
  • (3)以班为单位打印成绩单;
  • (4)学生对自己的成绩和排名进行查询;
  • (5)将(2)-(4)的结果写入文件中。
    要求各功能分别以函数来实现。
#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();
    }
}

你可能感兴趣的:(PTA,c语言)