PAT 乙级 1058 选择题

本文主要介绍了PAT乙级编程竞赛中的一道题目,涉及结构体的使用和错误统计。通过输入学生答题信息,计算错误次数,排序找出错误最多的题目,并输出错误次数及对应题目编号。代码实现包括问题结构体定义、错误次数比较函数以及遍历学生答题信息的过程。

PAT 乙级 1058 选择题

在这里插入图片描述

思路:先将每道题的各项信息存到定义的question结构体里,然后每输入一个人的做题信息,分别与结构体里的问题信息进行比较,计算出该学生的分数并修改结构体里的错误次数的值,最后通过定义好的cmp函数进行排序,就可以求出错误次数最多的题目和编号了。要注意输入每个同学的做题信息是的括号要吸收掉,所以代码看起来会很乱。

#include<bits/stdc++.h>
using namespace std;
struct Question{//定义问题结构体,包含本题的分数,选项个数,正确选项个数,错误次数,序号,一个用来存放正确选项的数组
    int score;
    int maxOption;
    int rightOption;
    int number;
    int count = 0;
    char chq[5];
}question[101];

bool cmp(Question a, Question b){ //定义一个排序的cmp函数,先按照错误次数比较,若错误次数相同则按照序号比较
    if(a.count!=b.count){
        return a.count>b.count;
    }
    else return a.number<b.number;
}
int main(){
    int n, m;
    cin>>n>>m;
    for(int i = 0; i < m;i++){ //将每道题的各项信息存到结构体里
        cin>>question[i].score>>question[i].maxOption>>question[i].rightOption;
        question[i].number = i+1; //因为i从零开始,题目编号从一开始,因此要加一
        for(int j = 0; j < question[i].rightOption; j++){
             cin>>question[i].chq[j];  //存正确选项
        }
    }
    
    for(int i = 0; i < n; i++){ 
        int points = 0; //每输入一个人的做题信息,输出一个分数
        for(int j = 0; j < m; j++){
            char k; //从第一题开始遍历,k用来吸收左括号
            cin>>k;
            int chose,flag = 1; //输入该同学该题选的选项数,flag用来记录该题是否做对
            cin>>chose;
            if(chose!=question[j].rightOption) //该同学选的选项数不等于正确选项数,说明做错了
                flag = 0;
            for(int o = 0; o < chose;o++){ //输入该同学选的选项,依次与正确的选项比较,若不同,则做错,flag置为零
            char l;
            cin>>l;
            if(l!=question[j].chq[o]){
                    flag = 0;
                    }
                }
             if(flag){ //如果做对了,该同学分数增加
                        points += question[j].score;
                    }
            else question[j].count++; //如果做错了,该题目错误次数增加
            char p; //吸收右括号
            cin>>p;
            
        }
     cout<<points<<endl; 
    }
    sort(question,question+m,cmp); //按照cmp函数排序后,question[0].count存放的是错误次数最多的题目,若为零,则说明没人做错
    if(question[0].count == 0){
        cout<<"Too simple";
    }
    else{
        int cnt2 = 0; //输出错误次数最多的题目
        cout<<question[cnt2].count<<" ";
        while(question[cnt2].count==question[cnt2+1].count){
            cout<<question[cnt2].number<<" ";
            cnt2++;
        }
        cout<<question[cnt2].number;
    }
   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值