1197: 考试排名(一)(结构体专题)(简单易学版本)

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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值