过两天要去自动挡科目三考试。正好闲来无事,试着用C语言写个相关的小玩意。
主体环节是设置题库、生成题序、判断正误、以及选择继续答题或中止答题。
设置题库
一开始想过很多办法,试图解决内存分配的问题。可惜碍于能力有限没有弄懂malloc在这里能不能用。
个人以为malloc是动态内存分配,而题库是静态初始化。或许之后再看看(大概。
最后还是选择用二维数组解决,毕竟熟悉。
生成题序
目标是连续随机生成0-13内不重复的整型数组(因为统共只有14道题)。
鉴于在校内没学随机数,所以狠狠地参考了@打孔猿的文章:
C语言程序生成指定范围的不重复的随机数_c语言随机打印1到33中11个不相同数值_打孔猿的博客-CSDN博客
再结合了菜鸟教程上面对rand和srand的讲解大概理解了一点。
把这个部分放在打印“科目三灯光考试正式开始”之后主要是为了有一种“加载中”的真实感。
判断正误、选择继续答题或中止答题
这两个部分比较容易,无非是循环语句和条件语句的结合。
注意用清空输入缓冲区就可以了。
我比较懒所以都用的getchar,可能还有更好的办法吧。
当然目前只是一代版本,之后应该会加文字回答和错题练习的环节。会更真实一点。
代码如下,请多指教捏。
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
int main()
{
/* 设置题库内容与标准答案 */
char question[14][40] = {"请开启前照灯",
"同方向近距离行驶",
"通过急弯",
"通过坡路",
"通过拱桥",
"通过人行横道",
"通过没有交通信号灯的路口",
"与机动车会车",
"通过有交通信号灯的路口",
"超越前方车辆",
"在照明不良的道路行驶",
"在无照明的道路行驶",
"在有路灯、照明良好的道路行驶",
"路边临时停车"};
char answer[14] = {'A','A','C','C','C','C','C',
'A','A','D','B','B','A','D'};
printf("科目三灯光考试正式开始。\n");
/* 生成无重复的出题顺序 */
srand((int)time(0)); // 以当前时间播种
int sequence[14] = {-1}, count = 0;
while(count < 14)
{
int ran = rand() % 14, sign = 0;
for (int i = 0; i < count; i++)
{
if (ran == sequence[i])
{
sign = 1;
break;
}
}
if (sign == 0)
{
sequence[count] = ran;
count++;
}
}
/* 出题与答题 */
int count_2 = 0;
for ( ; count_2 < 14; count_2++)
{
/* 打印题目与选项 */
for (int j = 0; j < 40; j++)
printf("%c", question[sequence[count_2]][j]);
printf("\n");
printf("A.近光灯 B.远光灯 C.远近光灯交替 D.其它\n");
/* 判断回答是否正确 */
char input_ans;
scanf("%c", &input_ans);
while(input_ans != answer[sequence[count_2]])
{
getchar();
printf("回答错误!请重新选择.\n");
scanf("%c", &input_ans);
}
getchar();
printf("回答正确!您要继续答题吗? (输入“Y”或“N”进行选择)\n");
/* 判断用户是否继续 */
char con_stop;
scanf("%c", &con_stop);
if (con_stop == 'N')
{
printf("感谢您的参与!\n");
break;
}
getchar();
}
if (count_2 == 14)
printf("所有题目均已完成!感谢您的参与!");
return 0;
}