1197
题名: 考试排名(一)(结构体专题)
首先
是对结构的规划:
结构体包括:
1.学号
2.完成的科目
3.一个数组来表示 该学生完成第几个的科目
4.该学生成绩
** 思路:
1、先输入人数、课程、及格线,科目的分值
2、进入循环 录入学生的信息
3、进入循环 计算学生的总分 利用total += arr[stu[i].arr1[i]]来获取该生所有分数
4、进行比较 →冒泡排序 对总分进行降序 总分相同 利用strcmp进行比较学号
5、从第一个开始输出 学号+分数 (筛选掉不及格的人数)**
代码:
#include<stdio.h>
#include<string.h>
#define MAX 15
struct s{
char name[20];//学生的姓名
int sum_sub;//学生解决的题目数量
int arr1[MAX]; //学生解决的题号是哪几个?
int total_grade; //计算该学生的总分
};
int main(void){
int n; //人数
scanf("%d",&n);
int subject_num;//题目
scanf("%d",&subject_num);
int pass_line;
scanf("%d",&pass_line);//及格线
int arr[subject_num+1];
int i;
for(i=1;i<=subject_num;i++){//统计1-n课的成绩
scanf("%d",&arr[i]);
}
struct s stu[n+1];
int j;
for(i=1;i<=n;i++){ //输入学生的学号、完成的科目
scanf("%s",stu[i].name);
scanf("%d",&stu[i].sum_sub);
memset(stu[i].arr1,0,sizeof(stu[i].arr1));
for(j=1;j<=stu[i].sum_sub;j++){
scanf("%d",&stu[i].arr1[j]);
}
}
for(i=1;i<=n;i++){ //计算每个学生的总分是多少?
int num = stu[i].sum_sub;
stu[i].total_grade=0;
for(j=1;j<=num;j++){
stu[i].total_grade +=(arr[stu[i].arr1[j]]);
}
}
//计算出及格的人数+各个及格人数学号和成绩
int count=0;
for(i=1;i<=n;i++){
if(stu[i].total_grade >= pass_line){
count++;
}
}
printf("%d\n",count);
struct s temp;
for(i=1;i<=n-1;i++){ //对学生的总成绩排序 按照从大到小排序
for(j=i+1;j<=n;j++){//如果成绩相同 则按照学号 升序排序
if((stu[i].total_grade < stu[j].total_grade )){
temp = stu[i];
stu[i]=stu[j];
stu[j]=temp;
}else if(stu[i].total_grade == stu[j].total_grade){
if(strcmp(stu[i].name,stu[j].name) > 0){
temp = stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
}
for(i=1;i<=n;i++){ // 输出成绩
if(stu[i].total_grade >= pass_line){
printf("%s %d\n",stu[i].name,stu[i].total_grade);
}
}
return 0;
}