PAT 1058 选择题

题目连接:请点击
思路:定义一个关于题目的结构体,其中用int型的数组来存储答案(即 数组的下标对应答案a,b,c… 若是正确答案里面存储1)。然后循环输入学生答案并判题,然后给出分数,且定义了一个int型的err[]数组用于记录每道题的错误人数。具体看代码傍边注释。
其他:这道题挺容易想到怎么做的,但最令人头疼的问题是下面学生答案的输入格式。行行之间有换行符,每个学生每道题的答案之间有空格、左右括号。起初无论是换行还是空格,都选择用getchar()吸收,后来仍然不正确也没找到错误原因,网上参考了柳婼大神对于格式的处理用scanf("\n") scanf(" ")这样一看就知道吸收的是换行还是空格。但其实还是未得到正确结果,可又实在没觉得想的有问题,又重新理了一遍思路,终于发现了问题。如下
在这里插入图片描述代码中蓝框的就是错误的根源。原本是打算可以先判断学生的答案选项个数是否与正确选项个数相同,若是不同直接就break,这样节约点时间。然而,就错在了break上,一旦break掉,就意味着此次循环退出。但是学生输入此题的答案仍在进行,这样当前学生此题的输入就会占用下一层循环(也就是下一题)的输入,从而导致数据出错。
AC代码

#include<iostream>
using namespace std;
struct Que{
	int score;//题目分值
	int optNum;//选项个数
	int rigOptNum;//正确选项个数 
	int rigOpt[5]={0};//下标对应a,b,c... 若是正确选项则rigOpt[i]=1 
};
int main(){
	int N,M;
	cin>>N>>M;
	Que ques[M];
	for(int i=0;i<M;i++){//输入题目信息 
		cin>>ques[i].score>>ques[i].optNum>>ques[i].rigOptNum;
		for(int j=0;j<ques[i].rigOptNum;j++){
			char alph; cin>>alph;
			ques[i].rigOpt[alph-'a']=1;
		}
	}
	int err[M]={0};//每道题的错误次数 下标对应题目编号(数组下标0开始) 
	for(int i=0;i<N;i++){//输入每个学生作答信息 
		scanf("\n"); 
		int stuScore=0;
		for(int j=0;j<M;j++){//每个学生每道题目作答信息 
			if(j!=0) scanf(" ");
			int stuOptNum,flag=1;//stuScore学生作答此题选项个数 flag判断是否全部答对 
			scanf("(%d",&stuOptNum);
			if(stuOptNum!=ques[j].rigOptNum) flag=0; 
			for(int k=0;k<stuOptNum;k++){ 
				char stuOpt;
				scanf(" %c",&stuOpt);
				if(ques[j].rigOpt[stuOpt-'a']==0) flag=0;
			} 
			scanf(")");
			if(flag==1) stuScore+=ques[j].score; 
			else err[j]++;
		}
		cout<<stuScore<<endl;
	} 
	int maxErr=0;
	for(int i=0;i<M;i++){//先找到最大的错误数
		if(maxErr<err[i]) maxErr=err[i];
	}
	if(maxErr==0) cout<<"Too simple";
	else{ 
		cout<<maxErr;
		for(int i=0;i<M;i++){
			if(err[i]==maxErr) cout<<" "<<i+1;
		}
	} 
	return 0;
} 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值