编程题.
多选题评分程序。
一张试卷,满分100分,全部是多项选择题。
每道题分数分配有三种方法:
(1)每道题满分相同,具体分数由题目数决定。如试卷有20道题,则每题满分为5分。
(2)每道题满分不一定相等,由该题正确答案的选项数与全部题目正确答案的选项数之和的比值决定。如某题正确答案的选项为ACD,其选项数就为3,而全部题目的正确答案的选项数之和为60,那么这道题目的满分为(3/60)*100 = 5分。
(3)每道题满分不一定相等,由出题者指定。
每道题的评分方案有三种:
(1)多选少选均不得分。
(2)少选可得部分分数,而多选不得分。如正确答案为AD,那么选A则得该题满分1/2。
(3)选对一个选项得一定分值,选错一个选项扣掉同样的分值,但每道题不应出现负分。
假设正确答案为ACD, 如选AD,那么可以得该题满分的2/3;
如选ABD,那么可以得该题满分的1/3;等等。
注:一张试卷的所有题目实行同样的评分方案。
评分步骤:
每次评分时,按照以下步骤进行:
1、 通过函数GetQuestionNum()获得试卷中的试题数目;
2、 通过GetPaperAndAnswer()获得试卷信息和标准答案;
3、 通过GetMethod()获得评分方案和每题分数分配方法;
4、 按照每题分数分配方法和评分方案计算成绩;
5、 将成绩通过函数OutputResult输出;
以下是数据结构和接口函数的说明:
数据结构:
//每道选择题的答案
typedef struct {
int No; //题目编号
char Choice[10]; //答题情况
char Answer[10]; //正确答案
float Score; //题目满分
}QuestionItem_t;
其中Choice,Answer的说明如下:
1、 选项个数不定,最后以’\0’结束,最多有9个;
2、 均为大写字母,不用做异常检查;
3、 选项可能无序;
接口函数:
1、//获得试卷中试题总数目
int GetQuestionNum();
2、//获得试卷信息和标准答案
int GetPaperAndAnswer( QuestionItem_t *Paper //试卷信息:试题列表);
3、//获得判分方案及每题分数分配方法
int GetMethod(int *pScoreMethod,//分数分配1:第一种/ 2:第二种/3: 第三种
int *pJudgeMethod //判分方案1:第一种/ 2:第二种/3: 第三种
);
4、//输出试卷成绩
int OutputResult(float TotalScore); // TotalScore为最后成绩
题目要求:
1、 考试工程以及答题要求:
a) 考试工程有VC6、VS2003、VS2005、VS2008等四种,请考试者根据本机上的工程环境任选其一。
b) 请在选定工程的CodeTest.cpp中完成程序;请不要修改工程中其他文件,否则后果自负。
c) 上面提到的数据结构和接口函数定义在IO.h/IO.cpp中,可以参考。
d) 编程时可以使用以下字符串函数,禁止使用其他字符串函数,否则扣分。
允许使用 C "string.h"、C++标准库的string类的函数;其他禁止。
2、 请遵守以下有关调试方法及测试数据的约定,否则后果自负。
a) 请先将给定的测试数据文件(question.txt)放在D:\目录下;
b) 再在工程中调试程序;程序输出结果输出在文件D:\Score.txt中;
c) 在调试过程中,您也可以调整question.txt的用例, 进行全面测试;
代码实现:
#include "stdafx.h"
#include "io.h"
#include "stdlib.h"
#include "string.h"
#include <iostream>
using namespace std;
//请从main函数开始编程
#define QUESTION_MAX (100)
static QuestionItem_t Question[QUESTION_MAX];
static int JudgeMethod = 0;
static int ScoreMethod = 0;
/*声明函数*/
int GetPerQuastionScore(int i, //当前题号
int Num, //题目总数
QuestionItem_t *Paper, //试题列表
int *pScoreMethod , //每道题总分的分数分配
float *PerTotalScore); //每道题的总分
int CheckOneQuastion(int i, //当前题号
QuestionItem_t *Paper, //试题列表
float *PerTotalScore, //每道题的总分
int *pJudgeMethod, //每道题的评分方案
float *score); //最后得分
int main()
{
int Num = 0; //题目总数
float PerTotalScore = 0; //每道题的总分
float score = 0; //最后得分
QuestionItem_t *Paper = Question; //为每道题占的内存申请空间
int *pScoreMethod =&JudgeMethod; //分数分配 1:第一种/ 2:第二种 /3: 第三种
int *pJudgeMethod = &ScoreMethod; //判分方案 1:第一种/ 2:第二种 /3: 第三种
int i = 0;
Num = GetQuestionNum(); //获得试卷中选择题的总数
GetPaperAndAnswer(Paper); //取得试卷列表信息
GetMethod(pScoreMethod,pJudgeMethod); //取得评分方案
for(i = 0; i < Num; ++i)
{
GetPerQuastionScore(i,Num,Paper,pScoreMethod,&PerTotalScore);
CheckOneQuastion(i,Paper,&PerTotalScore,pJudgeMethod,&score);
}
OutputResult(score);
return 0;
}
/*当分数分配是第2种时,获得该题号的总分的方法*/
float GetScore(int i, //当前题号
QuestionItem_t *Paper, //试题列表
int Num) //题目总数
{
int j = 0, k = 0; //操作数,用于下表操作
int m = 0,n = 0; //m为所有题答案选项个数,n为该题正确答案的个数
for(k = 0; k < 10; ++k) //获得该题答案选项个数
{
if('\0' != Paper[i].Answer[k])
{
n++;
}
else
{
break;
}
}
for (j = 0; j < Num; ++j) //获得所有题答案选项个数
{
for(k = 0; k < 10; ++k)
{
if('\0' != Paper[j].Answer[k])
{
m++;
}
else
{
break;
}
}
}
return 100.0f*n/m;
}
/*求每道题的总分*/
int GetPerQuastionScore(int i, //当前题号
int Num, //题目总数
QuestionItem_t *Paper, //试题列表
int *pScoreMethod , //每道题总分的分数分配
float *PerTotalScore) //每道题的总分
{
if (1 == *pScoreMethod)
{
*PerTotalScore = 100.0f/Num;
}
else if (2 == *pScoreMethod)
{
*PerTotalScore = GetScore(i,Paper,Num);
}
else if (3 == *pScoreMethod)
{
*PerTotalScore = Paper[i].Score;
}
return 0;
}
int CheckOneQuastion(int i, //当前题号
QuestionItem_t *Paper, //试题列表
float *PerTotalScore,
int *pJudgeMethod, //每道题的评分方案
float *score)
{
int j = 0, k = 0; //操作数,用于下表操作
int m = 0, n = 0; //m为答题结果的个数,n为该题正确答案的个数
int count = 0; //记录题目答题结果正确的选项个数
for(k = 0; k < 10; ++k)
{
if('\0' != Paper[i].Answer[k])
{
n++;
}
else
{
break;
}
}
for(k = 0; k < 10; ++k)
{
if ('\0' != Paper[i].Choice[k])
{
m++;
}
else
{
break;
}
}
for( j = 0; j < m; ++j)
for(k = 0; k < n; ++k)
{
if (Paper[i].Choice[j] == Paper[i].Answer[k])
{
count ++;
}
else
{
count += 0;
}
}
if (1 == *pJudgeMethod)
{
if (count == n && m == n) //如果答案结果全对
{
*score += *PerTotalScore;
}
else
{
*score += 0;
}
}
else if(2 == *pJudgeMethod)
{
if(m>n) //答题答案数大于正确答案数
{
*score += 0;
}
else if (count == n && m == n)
{
*score += *PerTotalScore ;
}
else if (count < n)
{
*score += *PerTotalScore * 1 / 2;
}
else
{
*score += 0;
}
}
else if(3 == *pJudgeMethod)
{
if (count == n && m == n)
{
*score += *PerTotalScore;
}
else if (count < n && m < n)
{
*score += *PerTotalScore * count / n;
}
else
{
*score += 0;
}
}
return 0;
}