C语言 选择题功课批改
C语言 选择题作业批改
输入
第一行包含2个整数n,k,分别表示本次考试中试选择题的个数和每个选择题的分值。第二行包含一个长度为n的字符串,表示标准答案。第三行包含一个整数s,表示试卷的份数。其下的s行,每行代表一个应试者的答卷中选择题的作答。"X"表示应试者没有回答此题。
输出
按照顺序,每行输出一份试卷的选题题得分。
样例输入
10 2
ABCDABCDAB
4
ABCDABCDAB
BBCDDBCDAB
AACDDBCDAA
ABCDAXCDAB
样例输出
20
16
14
18
下面是我写的代码,为什么会多加2呢?求解。
#include<stdio.h>
int main()
{
int n,k,s,i,j,t,r;
char a[100],b[100];
scanf("%d%d",&n,&k);//输入整数n表示选择题的个数,k表示每个选择题的分数
for(i=0;i<n;i++)//接受n个字符
scanf("%c",&a[i]);
getchar();
scanf("%d",&s);//接下来有s个要批改的作业数
for(j=0;j<s;j++)
{
for(r=0;r<n;r++)//接受一个字符数组
scanf("%c",&b[r]);
getchar();
t=0;//记录正确题目的分数
for(i=0;i<n-1;i++)//一个一个字符进行比对
{
if(a[i]==b[i] && b[i]!='X')
t=t+k;
}
printf("%d\n",t);
}
return 0;
}
------解决方案--------------------
------解决方案--------------------
或者也可以用楼上那位的方法
不过那样的话,fgets后面要加上getchar()
因为fgets是会丢弃掉换行符的
输入
第一行包含2个整数n,k,分别表示本次考试中试选择题的个数和每个选择题的分值。第二行包含一个长度为n的字符串,表示标准答案。第三行包含一个整数s,表示试卷的份数。其下的s行,每行代表一个应试者的答卷中选择题的作答。"X"表示应试者没有回答此题。
输出
按照顺序,每行输出一份试卷的选题题得分。
样例输入
10 2
ABCDABCDAB
4
ABCDABCDAB
BBCDDBCDAB
AACDDBCDAA
ABCDAXCDAB
样例输出
20
16
14
18
下面是我写的代码,为什么会多加2呢?求解。
#include<stdio.h>
int main()
{
int n,k,s,i,j,t,r;
char a[100],b[100];
scanf("%d%d",&n,&k);//输入整数n表示选择题的个数,k表示每个选择题的分数
for(i=0;i<n;i++)//接受n个字符
scanf("%c",&a[i]);
getchar();
scanf("%d",&s);//接下来有s个要批改的作业数
for(j=0;j<s;j++)
{
for(r=0;r<n;r++)//接受一个字符数组
scanf("%c",&b[r]);
getchar();
t=0;//记录正确题目的分数
for(i=0;i<n-1;i++)//一个一个字符进行比对
{
if(a[i]==b[i] && b[i]!='X')
t=t+k;
}
printf("%d\n",t);
}
return 0;
}
------解决方案--------------------
#include <stdio.h>
#define MAX (100)
int main(int argc, char* argv[])
{
int ac, qc;
int is, ts;
char a[MAX + 1];
char q[MAX + 1];
int i, j;
scanf("%d%d\n", &ac, &is);
fgets(a, MAX, stdin);
scanf("%d\n", &qc);
printf("\n");
for(i = 0; i < qc; i++)
{
fgets(q, MAX, stdin);
ts = 0;
for(j = 0; j < ac; j++)
if((a[j] == q[j]) && (q[j] != 'X'))
ts += is;
printf("%d\n", ts);
}
return 0;
}
------解决方案--------------------
#include <stdio.h>
#include <string.h>
int main(void)
{
int n,k,s,i,j,t;
char a[100],b[100];
scanf("%d%d",&n,&k);//输入整数n表示选择题的个数,k表示每个选择题的分数
getchar();//这里要加上
gets(a);//接受n个字符,逐个输入是要人为加上结束标志的
//getchar();
scanf("%d",&s);//接下来有s个要批改的作业数
getchar();
for(j=0;j<s;j++)
{
gets(b);//接受一个字符数组,比gets要好些,认为要求输入的宽度
//getchar();//fgets会吸收回车符并丢弃掉
t=0;//记录正确题目的分数
for(i=0;i<n;i++)//一个一个字符进行比对
{
if(a[i]==b[i] && b[i]!='X')
t+=k;
}
printf("%d\n",t);
}
return 0;
}
或者也可以用楼上那位的方法
不过那样的话,fgets后面要加上getchar()
因为fgets是会丢弃掉换行符的