#include<stdio.h>
#include<malloc.h>
#include<string.h>
typedef char* string; //字符串
//学生结构体
typedef struct Student{
char name[16]; //姓名
int id; //学号
float grade; //成绩
struct Student *next;//下一个学生节点
}Student,*student;
//班级结构体
typedef struct Class{
student list; //学生列表
int num; //学生人数
}Class,*class;
//创建一个新班级
class newClass();
//销毁一个班级
void destroyClass(class c);
//创建一个新学生
student newStudent(string name,int id,float grade);
//向班级中加入一个学生
void append(class c,student stu);
//统计不及格人数,并打印名单
void showNotPass(class c);
//统计全班平均分及以上的学生人数并打印名单
void showGreaterThanAvg(class c);
//统计各分数段的学生人数及所占百分比
void showGradeRange(class c);
//输出最高分及学号
void showFirst(class c);
//输出班里的所有成员
void output(class c);
int main(){
char name[16];
int id;
float grade;
class myClass = newClass(); //创建一个班级
printf("输入学生信息\n");
puts("姓名\t学号\t成绩");
while(~scanf("%s%d%f",name,&id,&grade) && grade >= 0){ //grade<0结束
append(myClass,newStudent(name,id,grade)); //向班级中加入一名新学生
}
//不及格信息
showNotPass(myClass);
//超过平均分的信息
showGreaterThanAvg(myClass);
//区间信息
showGradeRange(myClass);
//第一名
showFirst(myClass);
return 0;
}
//创建一个新班级
class newClass(){
class tmp = (class)malloc(sizeof(Class));
tmp->num = 0;
tmp->list = NULL;
return tmp;
}
//销毁一个班级
void destroyClass(class c){
if(c == NULL) return;
student list = c->list;
student next = NULL;
while(list!=NULL){
next = list->next;
free(list); //释放当前节点
list = next;
}
free(c);
c = NULL;
}
//创建一个新学生
student newStudent(string name,int id,float grade){
student tmp = (student)malloc(sizeof(Student));
strcpy(tmp->name,name);
tmp->id = id;
tmp->grade = grade;
tmp->next = NULL;
return tmp;
}
//向班级中加入一个学生
void append(class c,student stu){
if(c == NULL || stu == NULL) return;
stu->next = c->list;
c->list = stu;
c->num++;
}
//统计不及格人数,并打印名单
void showNotPass(class c){
if(c == NULL) return;
class tmpClass = newClass();
student tmp = c->list;
for(;tmp != NULL;tmp = tmp->next){
if(tmp->grade < 60){
student tmpStu = (student)malloc(sizeof(Student));
memcpy(tmpStu,tmp,sizeof(Student));
append(tmpClass,tmpStu);
}
}
printf("不及格人数:%d\n",tmpClass->num);
output(tmpClass);
destroyClass(tmpClass);
}
//统计全班平均分及以上的学生人数并打印名单
void showGreaterThanAvg(class c){
if(c == NULL || c->num == 0){
puts("班级没有人");
return;
}
student tmp = c->list;
float sum = 0;
for(;tmp != NULL;tmp = tmp->next){
sum+=tmp->grade;
}//统计总分
float avg = sum / c->num;//平均分
class tmpClass = newClass();
for(tmp=c->list;tmp != NULL; tmp = tmp->next){
if(tmp->grade >= avg){
student tmpNode = (student)malloc(sizeof(Student)); //一个临时学生节点
memcpy(tmpNode,tmp,sizeof(Student));
append(tmpClass,tmpNode);
}
}
printf("平均分及以上的学生人数为:%d\n",tmpClass->num);
output(tmpClass);
destroyClass(tmpClass);
}
//统计各分数段的学生人数及所占百分比
void showGradeRange(class c){
if(c == NULL){
puts("班级没有人");
return;
}
int i;
class container[10];
for(i = 0; i < 10; i++){ //初始化分数段班级容器
container[i] = newClass();
}
student tmp = c->list;
for(; tmp != NULL; tmp = tmp->next){
int index = (int)tmp->grade % 10; //区间
if(index > 9) index = 9; //大于90的算成一个区间
student tmpStu = (student)malloc(sizeof(Student));
memcpy(tmpStu,tmp,sizeof(Student));
append(container[index],tmpStu);
}
for(i = 0; i < 10; i++){
int num = container[i]->num;
printf("%d~%d的人数:%d,占比:%.6g%%\n",i*10,(i+1)*10,num,(float)(num*100)/c->num);
destroyClass(container[i]);
}
puts("");
}
//输出最高分及学号
void showFirst(class c){
if(c == NULL || c->list == NULL) return;
student max = c->list;
student tmp = max->next;
for(;tmp != NULL;tmp = tmp->next){
if(tmp->grade > max->grade) max = tmp;
}
printf("最高分:%.2g,学号:%d\n",max->grade,max->id);
}
void output(class c){
if(c == NULL) return;
puts("名单:");
student tmp = c->list;
for(;tmp!=NULL;tmp = tmp->next){
printf("%s\n",tmp->name);
}
puts("");
}
代码有点长....