科目三灯光考试(一代版本)

过两天要去自动挡科目三考试。正好闲来无事,试着用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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值