7使用C语言编写一个答题系统

7-1 C实训大作业——使用C语言编写一个答题系统(仅作收集和查重使用)

分数 100

全屏浏览题目

切换布局

作者 刘毅文

单位 怀化学院

平时大作业——使用C语言编写一个答题系统
一、选择题、判断题、填空题
/*分组情况见学习通*/
第一组:填空题数据:20道题
(1)题干
(2)正确答案 Five five

第二组:判断题数据:20道题
(1)题干
(2)正确答案(T/t F/f ,True , False)

第三组:选择题数据:20道题
(1)题干
(2)正确答案(A/B/C/D)
(3)候选项(A/B/C/D a/b/c/d)

二、需要随机出题,题目出现顺序要不一致
C语言需要学会如何随机抽取
(1)产生随机数 1~20
C语言随机数的生成【详解】_星空之路Star的博客-CSDN博客_c语言随机数
(2)解决运气不好的问题1-18 极少出现19 20

三、及时反馈正确情况,记录同学的准确率

四、自定义特性
(1) 大小写答案不区分
(2) 答错之后,要告诉我正确答案是什么
(3) 自己再增加一些人性化的功能
(比如:一开始什么都不输入,就只输出回车或者空格,就判断为错误不太好
思考:_5 5 5_是否算同一个答案? _A A A_是否算同一个答案?)

大作业最终提交输入样例:

59063134 54398635

大作业最终提交输出样例:

我承诺本次大作业由本人独立完成,若查重发现有抄袭情况,抄袭与被抄袭的双方后果自负。
本人经再三确认后系统功能完备,基本达到合格要求;并知晓本次提交大作业之后,再无更正机会。

我抽到的题目是完成一个20道选择题的答题系统,看到这题目头要炸了,对于一个只学了两个多月的C语言的孩子来说简直太难了,只能一点一点找资料来完成,哎!

困难:如何让20道题随机出现且这些道题里面没有重复的题?

方法:相关资料可以搜这个C语言随机数的生成【详解】_星空之路Star的博客-CSDN博客_c语言随机数

srand((unsigned int)time(NULL));//设置随机数步骤

int v[21]={0};
for(int i=1;i<=20;i++)
{
    v:v[i]=rand()%20+1;//设置20个随机数
    for(int j=0;j<i;j++)
    {
        if(v[i]==v[j])
        {
            goto v;//保证随机数不重复
        }
    } 

完整代码:#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
int main()
{
    int n=59063134,m=54398635;
    scanf("%d %d",&n,&m);
    printf("我承诺本次大作业由本人独立完成,若查重发现有抄袭情况,抄袭与被抄袭的双方后果自负。\n");
    printf("本人经再三确认后系统功能完备,基本达到合格要求;并知晓本次提交大作业之后,再无更正机会。\n");
    char q[21][1000];//用来存放题目
    char a[21];//用来存放正确答案
    char b[21][1000];//用来存放用户输入的答案
        printf("第三大题:选择题(每题5分,一共20题,请将正确的选项填入括号中)\n");
        strcpy(q[1],"C语言中标识符只能由字母、数字和下划线组成,且第一个字符:A.必须为字母\nB.必须为字母或下划线\nC.必须为下划线\nD.可以是字母、数字和下划线中任一种字符\n");//输入好题目和选项存入每道题目中
        a[1]='C';//将每道题的答案配对好
        strcpy(q[2],"已知程序要使用函数printf,则程序必须包含头文件( )\nA.math.h\tB.stdlib.h\tC.stdio.h\tD.ctpe.h\n");
        a[2]='C';
        strcpy(q[3],"以下选项可用作C语言合法用户标识符的是:\n A)2a\n B)void\n C)-abc\n D)_123\n");
        a[3]='D';
        strcpy(q[4],"C语言中while和do-while循环的主要区别是( )\nA.do-while的循环体至少无条件执行一次\tB.while的循环控制条件比do-while的循环控制条件严格\tC.do-while允许从外部转到循环体内\tD.do-while的循环体不能是复合语句\n");
        a[4]='A';
        strcpy(q[5],"若有定义“char a; int b; float c; double d;”, 则表达式a*b+d-c值的类型为()。\nA.[float\nB.int\nC.char\nD.double\n");
        a[5]='D';
        strcpy(q[6],"如果int a=3,b=4;则条件表达式a<b? a:b的值是( )\nA.3\tB.4\tC.0\tD.1\n");
        a[6]='A';
        strcpy(q[7],"结构化程序设计的3种结构是( )\nA.顺序结构,选择结构,循环结构\tB.分支结构,数组结构,循环结构\tC.顺序结构,分支结构,跳转结构\tD.分支结构,选择结构,循环结构\n");
        a[7]='A';
        strcpy(q[8],"逻辑运算符两则运算对象的数据类型( )\nA.只能是0或1\nB.只能是0或非0正数\nC.可以是任何类型的数据\nD.只能是整型或字符型数据\n");
        a[8]='C';
        strcpy(q[9],"判断实数 x 属于闭区间 [ a, b ] 的表达式为 ( )\nA.x <= [a, b]\tB.a <= x <= b\tC.a <= x && x <= b\tD.a ≤ x && x ≤ b\n");
        a[9]='C';
        strcpy(q[10],"逗号运算符执行下面的语句后,变量 a 的值为 ▁▁▁▁▁。a = 1, 2, 3, 4;\nA.1\nB.2\nC.3D.4\n");
        a[10]='A';
        strcpy(q[11],"假设所有变量已正确定义,以下for语句不能编译的是( )\nA.for(i=0; i<10, j<10; i++)\tB.for(i=0; j=0; i<10; i++ )\tC.for(i=0; i<10; i--)\tD.for(i=0; j<10; j++)\n");
        a[11]='B';
        strcpy(q[12],"以下与k=n++等价的表达式是( )\nA.k=++n\tB.n=n+1,k=n\tC.k=n,n=n+1\tD.k+=n\n");
        a[12]='C';
        strcpy(q[13],"机器语言和汇编语言都属于( )\n A.高级语言\nB.低级语言\nC.编辑语言\nD.二进制代码\n");
        a[13]='B';
        strcpy(q[14],"C 语言程序中可以对程序进行注释,注释部分必须用的符号是( )\nA.‘{’和‘}’\tB.‘[’和‘]’\tC.‘/*’和‘*/’\tD.‘*/’和‘/*’\n");
        a[14]='C';
        strcpy(q[15],"以下叙述不正确的是( )。\nA.c程序中,语句之间必须用分号分隔。\n行语句可以写在一行上。\nC.c程序中,可以不必包含主函数。\nD.一个c程序,可以由多个函数组成。\n");
        a[15]='C';
        strcpy(q[16],"设有数组定义:char array [ ]={“China”};则数组 array所占的空间为( )\nA.4个字节\tB.5个字节\tC.6个字节\tD.7个字节\n");
        a[16]='C';
        strcpy(q[17],"下列运算符中优先级最低的是__.\nA.II\nB.>=\nC.!=\nD.~\n");
        a[17]='A';
        strcpy(q[18],"即使两个指针变量的类型相同,它们也不能( )\nA.相减\tB.相加\tC.比较\tD.指向同一地址\n");
        a[18]='B';
        strcpy(q[19],"continue语句用于( )\nA.退出循环程序\tB.退出本次循环\tC.空操作\tD.根据if语句的判断进行选择\n");
        a[19]='B';
        strcpy(q[20],"设ch是char型变量,其值为G,且有表达式ch=(ch>='A'&&ch<='Z')?(ch+32):ch,表达式的值是\nA.A\tB.a\tC.G\tD.g\n");
        a[20]='D';
        srand((unsigned int)time(NULL));//设置随机数步骤
        int i,j,c=0,flag=0,sum=0;
        int d[21]={0};
        for(i=1;i<=20;i++)
        {
            d:d[i]=rand()%20+1;//设置20个随机数
            for(j=0;j<i;j++)
            {
                if(d[i]==d[j])
                {
                    goto d;//保证随机数不重复
                }
            }
            printf("第%d题:%s请输入你的选项:()(按回车进入下一题)\n",i,q[d[i]]);//随机输出每道题
            scanf("%s",b[i]);//用户输入答案
            int len=strlen(b[i]);
            for(j=0;j<len;j++)
            {
                if(b[i][j]!=' ')
                {
                    c=1;
                    break;//保证输入空格不跳题
                }
            }
            getchar();//防止按完回车程序退出
            if(c==1)
            {
                if(b[i][j]==a[d[i]]||b[i][j]==a[d[i]]+32)//大小写都算正确
                {
                    printf("恭喜你回答正确,进入下一道题!\n");
                    flag++;
                    sum=sum+5;//每回答正确一次加5分
                }
                else
                    printf("很抱歉,回答错误,正确答案是%c。进入下一道题!\n",a[d[i]]);//及时反馈正确答案
                printf("你当前回答正确了%d道题,当前得分为:%d\n\n",flag,sum);//反映总共答对的题目数量
                if(i==20)
                    printf("恭喜你回答完了所有问题,你的最终得分为:%d\n你的正确率为:%.2f%%\n",sum,sum/100.0*100);//当所有题目抽完了反映用户的正确率
            }
        }
    return 0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值