如何做一个选择题考试系统

要求:实现此系统可以导入选择题,判断题,做完后提交可以自动算分。... 要求:实现此系统可以导入选择题,判断题,做完后提交可以自动算分。 展开
 我来答
匿名用户
推荐于2016-10-11
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct question {
char ask[200];/*选择题题目*/
char answer[4][80];/*选择题选项*/
int right;/*正确答案*/
struct question *next;
};

int MenuChoice(void);
struct question *InsertList(struct question *fst, const struct question *ad);
struct question *ListSeek(struct question *seek, long len, long max);
void GetQuestion(struct question *src);
void SaveFile(const struct question *ed, FILE *saf);
struct question *LoadFile(struct question *td, FILE *laf);
int GetAnswer(void);
void ExplainQuestion(const struct question *que, int n);

main()
{
struct question *start = NULL, temp;
long choice, line = 0, c;
FILE *fp = fopen("kstm.dat", "a+");

start = LoadFile(start, fp);

while ((choice = MenuChoice()) != 3)
if (choice == 1) {
GetQuestion(&temp);
start = InsertList(start, &temp);
++line;/*统计列表的长度*/
}
else if (choice == 2){
c =600;
while (c > 500 || c > line) {
printf("请输入要回答的问题数量: ");
scanf("%d", &c);
}

ExplainQuestion(start, line);
}

SaveFile(start, fp);/*进行最后的工作*/
fclose(fp);
return 0;
}

/*ListSeek函数确定一个读取答案的位置,len代表要读取的答案数,max代表列表的长度*/
struct question *ListSeek(struct question *seek, long len, long max)
{
int i;

srand(time(NULL));

while (i = rand() % max + len < max)/*随机选取一个读题目的位置*/
;

while (i--)
seek = seek->next;/*找到指定的位置*/

return seek;
}

/*向列表中插入试题*/
struct question *InsertList(struct question *fst, const struct question *ad)
{
struct question *newPtr = (struct question *)malloc(sizeof(struct question));

if (newPtr == NULL)
exit(0);

*newPtr = *ad;
newPtr->next = fst;

return newPtr;
}

/*获取问题,选项,以及正确答案*/
void GetQuestion(struct question *src)
{
int i = 0;

printf("请输入选择题题目:\n");
scanf("%s", src->ask);

while (i < 4) {
printf("请输入选项%c的答案:\n", i + 'A');
scanf("%s", src->answer[i++]);
}

src->right = GetAnswer();
}

/*从文件中读取题目,将题目添加到列表中*/
struct question *LoadFile(struct question *td, FILE *laf)
{
struct question temp;

while (fread(&temp, 1, sizeof(struct question), laf))
td = InsertList(td, &temp);

return td;
}

/*将列表中的试题保存在文件中*/
void SaveFile(const struct question *ed, FILE *saf)
{
fclose(saf);

if ((saf = fopen("kstm.dat", "w")) == NULL)/*以写的方式重新打开文件*/
return ;

while (ed) {
fwrite(ed, 1, sizeof(struct question), saf);
ed = ed->next;
}

}

/*得到选择题的答案(不保证是正确的答案)*/
int GetAnswer(void)
{
int c = 0;/*必须进行初始化,避免出现偶然性的错误*/

fflush(stdin);
while (c < 'A' || c > 'D') {/*确保输入的答案是A, B, C, D中的一个*/
printf("请输入正确的答案: ");
scanf("%c", &c);
}

return c;
}

/*回答问题,并统计答对题目数,显示得分*/
void ExplainQuestion(const struct question *que, int n)
{
int i = 0, t = n;
char result[1001], *p = result;

for (i = 0; n--; que = que->next) {
printf("%s\nA.%s\nB.%s\nC.%s\nD.%s\n\n", que->ask, que->answer[0], que->answer[1],
que->answer[2], que->answer[3]);

if ((*p = que->right) == (*(p + 1) = GetAnswer()))
++i;

p += 2;
}

*p = '\0';

printf("\n%-13s%-13s%s\n", "标准答案", "您的答案", "评价");
for (p = result; *p != '\0'; p += 2)
printf("%-13c%-13c%s\n", *p, *(p + 1), *p == *(p + 1) ? "正确" : "错误");
printf("\n您回答了%d道题, 答对%d道题目, 得分: %.2f\n\n", t, i, (float)i / t * 100.00);
}

/*选择菜单*/
int MenuChoice(void)
{
int value;

printf("1 - 添加选择题\n2 - 回答选择题\n3 - 退出\n");
scanf("%d", &value);

return value;
}

随即抽题
struct question *ListSeek(struct question *seek, long len, long max)
{
int i;
srand(time(NULL));
while (i = rand() % max + len < max)/*随机选取一个读题目的位置*/
;
while (i--)
seek = seek->next;/*找到指定的位置*/
return seek;
}
蓝鲸智能科技
2024-11-21 广告
理论考试系统是我们河南蓝鲸智能科技有限公司研发的一款高效、便捷的在线考试平台。该系统集题库管理、在线组卷、自动评分等功能于一体,支持多种题型和考试模式。通过智能化的防作弊手段,确保考试的公平公正。用户可以随时随地进行在线练习和模拟考试,有效... 点击进入详情页
本回答由蓝鲸智能科技提供
微肩离j
2021-09-03 · TA获得超过103个赞
知道小有建树答主
回答量:1006
采纳率:91%
帮助的人:20.4万
展开全部
借助已经开发好的、功能非常完善的在线考试系统就可以了。往往在线考试系统功能齐全完善,题库功能支持上传选择题、判断题、填空题、简答题等多种题型的。组卷考试也很简单。
在线考试完之后,系统会自动阅卷判分,十分便捷。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-09-20
展开全部
你这个问题问的就好比是"如何生一个儿子?"一样..你自己都还没实践. 你就来问. 自己先做做吧. 遇到问题了再来问.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式