目录
前言:
伴随着本学期c语言学习的尾声,迎来了人生中第一个c语言编程的项目
基本功能:
(1)大小写答案、全称缩写不区分
(2) 答错之后告知正确答案
(3)允许答案内含有空格无论位置在何处
(4)防误触,防止输入其他字符影响作答
(5)错题题号统计
(6)随机抽取题库内的题目
(7)做题时进行鼓励语
模块:
这里就给出最让人头痛的几个模块的讲解吧,剩下的可自行通过总览代码的注释进行理解
随机数生成板块:
这里用了系统时间做了rand的种子
未避免生成随机数重复用一个循环进行查重保证每一个随机数都唯一
同时将随机数存入数组tk内方便调用
剩下的请自行参考注释理解
防误触模块:
这个模块写了很久才写出一个通俗易懂的,运用的是strcmp函数的字符串比较,运用循环和条件语句写出防止输错别的字符而导致的答案错误
char a[100] = "t";
char b[100] = "T";
char c[100] = "f";
char d[100] = "F";
char e[100] = "ture";
char f[100] = "TURE";
char g[100] = "false";
char h[100] = "FALSE";
int jxsr = 0;
int tsy;
for (tsy = 0; jxsr != 6; tsy++)
{
if (tsy >= 1)
{
printf("检测到输入无关字符,请您继续答题\n");
}
scanf("%s", dn);
if (strcmp(a, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(b, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(c, dn) == 0)
{
jxsr = 6; //避免因为误触输入其他字符而使答案错误
break;
}
if (strcmp(d, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(e, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(f, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(g, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(h, dn) == 0)
{
jxsr = 6;
break;
}
}
功能选择模块:
写了俩个功能错题题号打印以及成绩结算的功能
错题题号打印比较好实现即把一个数组嵌套在判题模块内,每错一次就把题号写入数组
//功能选择模块
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有3次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("请输入你的选择:\n");
scanf("%s", &gnxz);
//错题题号统计模块
if(gnxz=='2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0) //未被替换的数组将被剔除 剩下的都只能输出错题
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
//成绩结算模块
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
//若输入无关的字符 第一次输入错误
if (gnxz != '1' && gnxz != '2')
{
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有2次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n请重新输入:\n");
printf("请输入您的选择:\n");
scanf("%s", &gnxz);
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
if (gnxz != '1' && gnxz != '2') //二次输入错误
{
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有1次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n请重新输入:\n");
printf("请输入您的选择:\n");
scanf("%s", &gnxz);
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
if (gnxz != '1' && gnxz != '2') //第三次输入错误
{
printf("######################################\n");
printf("# 您现有0次使用本功能机会 #\n");
printf("# #\n");
printf("# 启用默认选项 #\n");
printf("# #\n");
printf("# #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n");
printf("正在启动默认选项(2)\n");
gnxz = '2';
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
}
}
}
总览代码(文字版):
因为自己技术不够精湛写了500来行用的都是比较通俗易懂的写法2233333,以后会不断完善自己
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
printf("######################################\n");
printf("# 考生须知: #\n");
printf("# 1.本次考试为20道选择题 #\n");
printf("# 2.支持大小写缩写单词空格 #\n"); //考试准备
printf("# 3.答题系统为即时反馈 #\n");
printf("# 4.考试完可在功能区得到分析 #\n");
printf("######################################\n");
printf("准备好了嘛?按下任意字符键开始考试,然后回车\n");
char ryj;
scanf("%s",&ryj);
int ch[20] = { 0 };//查重
char gnxz; //用于功能选择
int cs = 20; //答题次数(题数)
int tk[20] = {0}; //如果需要增加答题数目则修改tk[题目数量],并在两个switch中 按照已经给出的模板添加即可
srand(time(NULL)); //将系统时间做种子,避免运行后种子一成不变
char dn[100];
for (; cs;)
{
int sjz = rand() % 20; //控制随机数范围只能在20以内
if (!ch[sjz])
{
ch[sjz] = 1; //查重板块避免出现重复的随机数
tk[cs - 1] = sjz + 1; //通过变换使随机数从0-19变为1-20并存入数组
cs--;
}
}
/*for (int j = 0; j < 20; j++)
{ //测试随机数是否生成成功
printf("%d\n", tk[j]);
}*/
int cttj[20] = {0}; //错题统计 赋初值的目的是让数组内一开始每个都为零,后续再替换错题题号,没有替换的仍旧为0,再用一个条件语句就可以分离开正误了
int i;
int jf = 0; //计分
for (i = 0; i < 20; i++)
{
printf("第%d题:", i + 1);
switch (tk[i])
{
/*添加题目模板
case 题号:printf(" 题目 \n请输入t(T) or f(F)\n"); break;
*/
case 1:printf("C 语言具有简洁明了的特点\n请输入t(T) or f(F)\n"); break;
case 2:printf("预处理命令的前面必须加一个“#”号。\n请输入t(T) or f(F)\n"); break;
case 3:printf("标准格式输入函数scanf()可以从键盘上接收不同数据类型的数据项。\n请输入t(T) or f(F)\n"); break;
case 4:printf("在if语句的三种形式中,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。\n请输入t(T) or f(F)\n"); break;
case 5:printf("共用体变量可以作结构体的成员,结构体变量也可以作共用体的成员。\n请输入t(T) or f(F)\n"); break;
case 6:printf("C 语言标准格式输入函数 scanf() 的参数表中要使用变量的地址值。\n请输入t(T) or f(F)\n"); break;
case 7:printf("任何表达式语句都是表达式加分号组成的。5*5=25\n请输入t(T) or f(F)\n"); break;
case 8:printf("可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数\n请输入t(T) or f(F)\n"); break;
case 9:printf("枚举类型中的元素都具有一个整型值\n请输入t(T) or f(F)\n"); break;
case 10:printf("C 语言是一种具有某些低级语言特征的高级语言\n请输入t(T) or f(F)\n"); break;
case 11:printf("C语言的三种循环不可以互相嵌套。\n请输入t(T) or f(F)\n"); break; //题库
case 12:printf("增1减1运算符的前缀运算和后缀运算的表达式值是相同的。\n请输入t(T) or f(F)\n"); break;
case 13:printf("在C语言中能逐个地使用下标变量,也能一次引用整个数组。\n请输入t(T) or f(F)\n"); break;
case 14:printf("结构体成员的类型必须是基本数据类型。\n请输入t(T) or f(F)\n"); break;
case 15:printf("随机操作只适用于二进制文件。\n请输入t(T) or f(F)\n"); break;
case 16:printf("表达式语句和表达式没有什么区别。\n请输入t(T) or f(F)\n"); break;
case 17:printf("break 可用于循环体中,不可用于switch语句中。\n请输入t(T) or f(F)\n"); break;
case 18:printf("C 语言是一种非结构化程序设计语言\n请输入t(T) or f(F)\n"); break;
case 19:printf("结构体成员必须是不同数据类型的变量\n请输入t(T) or f(F)\n"); break;
case 20:printf("输入操作称为写操作,将输入流中的信息存到内存时,使用写函数。\n请输入t(T) or f(F)\n"); break;
}
char a[100] = "t";
char b[100] = "T";
char c[100] = "f";
char d[100] = "F";
char e[100] = "ture";
char f[100] = "TURE";
char g[100] = "false";
char h[100] = "FALSE";
int jxsr = 0;
int tsy;
for (tsy = 0; jxsr != 6; tsy++)
{
if (tsy >= 1)
{
printf("检测到输入无关字符,请您继续答题\n");
}
scanf("%s", dn);
if (strcmp(a, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(b, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(c, dn) == 0)
{
jxsr = 6; //避免因为误触输入其他字符而使答案错误
break;
}
if (strcmp(d, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(e, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(f, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(g, dn) == 0)
{
jxsr = 6;
break;
}
if (strcmp(h, dn) == 0)
{
jxsr = 6;
break;
}
}
switch (tk[i])
{
/*添加题目模板
case 对应题目题号:if (dn[0] == '答案是什么填什么这里填小写' || dn[0] == '这里填大写')
{
printf("恭喜回答正确\n");
jf++;
}
else
{
printf("回答错误,正解是 这里填与之相反答案 \n不要懦弱,不要畏怯,你要心有所向一生明朗\n");
cttj[i] = i + 1;
}
break;
*/
case 1:if (dn[0] == 't' || dn[0] == 'T')
{
printf("回答正确,雀氏6\n");
jf++;
} //判断模块,默认题库答案为前10个正确,后十个错误,可自行修改
//由字符数组存答案和进行判断,支持大小写,各类空格位置
else
{
printf("回答错误,正解是T\n慢慢的也好,步子再小也没关系,是在向前走就行了\n");
cttj[i] = i + 1; //放在每次回答错误的条件语句中并用循环的次数加1表示题号存入数组
}
break;
case 2:if (dn[0] == 't' || dn[0] == 'T')
{
printf("恭喜回答正确\n");
jf++;
}
else
{
printf("回答错误,正解是T\n不要懦弱,不要畏怯,你要心有所向一生明朗\n");
cttj[i] = i + 1;
}
break;
case 3:if (dn[0] == 't' || dn[0] == 'T')
{
printf("又得分了哦,继续加油吧!\n");
jf++;
}
else
{
printf("回答错误,正解是T\n相信相信的力量\n");
cttj[i] = i + 1;
}
break;
case 4:if (dn[0] == 't' || dn[0] == 'T')
{
printf("稳定得分,再接再厉\n");
jf++;
}
else
{
printf("很遗憾回答错误,正解是T\n没关系继续加油吧!\n");
cttj[i] = i + 1;
}
break;
case 5:if (dn[0] == 't' || dn[0] == 'T')
{
printf("雀氏蟀,又得一分\n");
jf++;
}
else
{
printf("细心点哦,正解是T\n期待你下次能回答正确\n");
cttj[i] = i + 1;
}
break;
case 6:if (dn[0] == 't' || dn[0] == 'T')
{
printf("回答的相当正确,太棒了\n");
jf++;
}
else
{
printf("别急着烦闷细心作答你可以的,正解是T\n");
cttj[i] = i + 1;
}
break;
case 7:if (dn[0] == 't' || dn[0] == 'T')
{
printf("回答正确,太棒了\n");
jf++;
}
else
{
printf("可不能粗心了哦,继续加油吧,正解是T\n");
cttj[i] = i + 1;
}
break;
case 8:if (dn[0] == 't' || dn[0] == 'T')
{
printf("正确,太棒了吧,继续加油\n");
jf++;
}
else
{
printf("不要气馁,相信你是最棒的,正解是T\n");
cttj[i] = i + 1;
}
break;
case 9:if (dn[0] == 't' || dn[0] == 'T')
{
printf("分数+1,又离好成绩更进一步\n");
jf++;
}
else
{
printf("下一题指不定很简单呢,正解是T\n");
cttj[i] = i + 1;
}
break;
case 10:if (dn[0] == 't' || dn[0] == 'T')
{
printf("太棒了回答正确\n");
jf++;
}
else
{
printf("回答错误,正解是T\n接受自己的不完美不断完善自己,下一次可不能错了哦\n");
cttj[i] = i + 1;
}
break;
case 11:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("太腻害了吧(●'◡'●)\n");
jf++;
}
else
{
printf("回答错误,正解是F\n不能气馁哦( ̄︶ ̄)\n");
cttj[i] = i + 1;
}
break;
case 12:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("正确得分(●'◡'●)\n");
jf++;
}
else
{
printf("答错了哦,不要紧继续加油,正解是F\n");
cttj[i] = i + 1;
}
break;
case 13:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("正确^_^\n");
jf++;
}
else
{
printf("回答错误,正解是F,下次一样的题型可不能再错\n");
cttj[i] = i + 1;
}
break;
case 14:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("真棒又得一分\n");
jf++;
}
else
{
printf("回答有问题哦,正解是F,继续加油哦\n");
cttj[i] = i + 1;
}
break;
case 15:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("稳定发挥又得一分\n");
jf++;
}
else
{
printf("回答错误,状态不好可以放松一会继续答题哦,正解是F\n");
cttj[i] = i + 1;
}
break;
case 16:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("稳定得分\n");
jf++;
}
else
{
printf("这题本来就易错,下次细心哦,正解是F\n");
cttj[i] = i + 1;
}
break;
case 17:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("太棒了这次考试稳了\n");
jf++;
}
else
{
printf("继续答题,乾坤未定皆为黑马,正解是F\n");
cttj[i] = i + 1;
}
break;
case 18:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("雀氏厉害φ(* ̄0 ̄)\n");
jf++;
}
else
{
printf("回答错误,不急慢慢来,正解是F\n");
cttj[i] = i + 1;
}
break;
case 19:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("太棒了吧回答正确\n");
jf++;
}
else
{
printf("不着急细心答题,正解是F\n");
cttj[i] = i + 1;
}
break;
case 20:if (dn[0] == 'f' || dn[0] == 'F')
{
printf("雀氏6\n");
jf++;
}
else
{
printf("下次别错了哦,正解是F\n");
cttj[i] = i + 1;
}
break;
}
}
printf("\n");
printf("\n");
//功能选择模块
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有3次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("请输入你的选择:\n");
scanf("%s", &gnxz);
//错题题号统计模块
if(gnxz=='2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0) //未被替换的数组将被剔除 剩下的都只能输出错题
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
//成绩结算模块
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
//若输入无关的字符 第一次输入错误
if (gnxz != '1' && gnxz != '2')
{
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有2次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n请重新输入:\n");
printf("请输入您的选择:\n");
scanf("%s", &gnxz);
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
if (gnxz != '1' && gnxz != '2') //二次输入错误
{
printf("######################################\n");
printf("# 功能选择模块 #\n");
printf("# 成绩结算(1) #\n");
printf("# 统计错题并结算(2) #\n");
printf("# 您现有1次使用本功能机会 #\n");
printf("# 错误输入超次后默认(2) #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n请重新输入:\n");
printf("请输入您的选择:\n");
scanf("%s", &gnxz);
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
if (gnxz != '1' && gnxz != '2') //第三次输入错误
{
printf("######################################\n");
printf("# 您现有0次使用本功能机会 #\n");
printf("# #\n");
printf("# 启用默认选项 #\n");
printf("# #\n");
printf("# #\n");
printf("######################################\n");
printf("检测到无关字符!!!\n");
printf("正在启动默认选项(2)\n");
gnxz = '2';
if (gnxz == '2')
{
printf("######################################\n");
printf("#您的错题集如下: #\n");
for (int w = 0; w < 20; w++)
{
if (cttj[w] == 0)
continue;
printf("# %02d #\n", cttj[w]);
}
gnxz = '1';
}
if (gnxz == '1')
{
printf("######################################\n");
printf("# 答题正式完结 #\n");
printf("# 共计答对%02d题目 #\n", jf);
printf("# 回答错误%02d题 #\n", 20 - jf);
printf("# 总分%02d #\n", jf);
printf("######################################\n");
}
}
}
}
return 0;
}
代码总览(图片版):