前言

用最基础的C语言做了一个调试窗口,实现了自动数学计算出题,单词拼写的功能,并且设有管理员模式,可以设置题目的难度,并且不同的题目难度可以赋予不同的分数。

视图浏览:

注意:C语言大作业,该项目仅供参考,严禁抄袭!

需求分析

 需求:1.自动出题,可以实现加减乘除(1)自动出题(2)实现加减乘除(3)出题量固定为10 (4)输出最终的成绩 2.用调试窗口做一个简单的UI界面(1)登陆功能 (2)<1>做数学题<2>单词拼写<3>成绩查询 3.管理员模式,可以设定题目难度



根据这样的需求,可以制作一个简单的调试窗口。

说一下一些细节的分析:
(1)关于自动出题
可以使用随机数的方式自动产生随机数,方法如下:

/** 从随机数组中获取随机数 * 输入一个数字,返回 (0,n]的范围 */
int getRandom(int n)
{int ans = random[index]%(n+1);while(ans ==0)//ans不能为0 {index++;judgeIndex(index);ans = random[index] % (n+1);}  index++;judgeIndex(index);//printf("ans=%d\n",ans);return ans;
}

但事实上,使用rand()函数有很大的弊端,因为rand()的伪随机数太伪了,每一次生成的数字顺序都是一样的,不信?你把我下面的代码copy自己去运行一遍,每次出来的结果都是一样的…

#include<stdlib.h>
#include<stdio.h>
int main()
{int mid;for(int i=0;i<10;i++){mid = rand()%100;printf("%d\n",mid);}return 0;
}


所以这种随机数太不可靠了,我们需要自己创建一个随机数。那么怎样可以每次都生成不一样的随机数呢?我想大家都想到了,用时间戳的方法,当前时间的ms数是很难确定的;还有一个就是程序运行的时间,所以第一时间我们想到了运用时间作为随机数种子来影响生成数,为此,我们需要先提取一下时间,于是我们调用了time.h的SYSTEMTIME结构体里面的元素,如下图。

获取了时间之后,我们希望用这两个值来创造一个随机数数组,容量为1000,每一次都可以调用不同的随机数元素,那么如何用两个值来创造这么多随机数呢?在这里我们参考了当下最常见的hash算法,初始化了一个随机数组,虽然事实上这还是一个伪随机数组,因为时间变量具有周期性,只要重复的次数一多,一定会产生周期性重复的元素,但是通过一套伪哈希散列算法,我们已经基本可以忽略掉这种周期性的影响了。

int random[1000];//这里我设计了一个随机数数组,一次性将随机数存到里面,但事实void encryption()
{SYSTEMTIME st={0};GetLocalTime(&st); long nowTime = st.wMilliseconds;//获取随机因子1(ms) long nowSecondTime = st.wSecond;//获取随机因子2(s) long mid = nowTime * nowSecondTime; //获取随机因子3 if(mid ==0){printf("程序错误,请重启\n");return;}random[0] = mid ;//printf("mid=%d",mid);//随机数组初始化long long int realRandom;//获取随机因子4 for(int i=1;i<1000;i++){//创建一个随机数realRandom =(nowTime*i*mid<<10^i)% Llimit;//realRandom = rand() * (i*i);int j=3;while(realRandom <=0){realRandom=(nowTime*(j*i)<<5^j)%Llimit;j+=j<<(j%10)%1000;}
//      printf("%d\n",realRandom);random[i] = realRandom;}//随机数因子调试
//      for(int i =0;i<1000;i++)
//      {//          printf("%d\n",random[i]);
//      }
}

初始化完成之后,在需要随机数的时候,我们直接使用getRandom函数就可以获取随机数了。但需要说明的是,我们的随机数组初始化是在做题之前完成的,也就是说,用户犹豫的时间会100%的影响生成的随机数数组。

(2)关于设计方式
对于每一种功能,可以单独使用一个或多个函数来实现,以模块化的原则来设计程序,可以更好地提高程序的健壮性和鲁棒性,方便后续的代码修改和扩展。因为C是面向过程的语言,所以在设计模块化项目的类型上不占优势,但是对于这种小量级的应用还是不成问题的。详细的设计思路可以参考下述主代码。

主程序代码:

#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<windows.h>
#include<stdlib.h>
/*需求:1.自动出题,可以实现加减乘除(1)自动出题(2)实现加减乘除(3)出题量固定为10 (4)输出最终的成绩 2.用调试窗口做一个简单的UI界面(1)登陆功能 (2)<1>做数学题<2>单词拼写<3>成绩查询 3.管理员模式,可以设定题目难度
*/
/*变量声明*/
int score;//成绩
clock_t start, finish;//时钟
double duration;//持续时间
long long int random[1000];//随机数组[当前范围为1-1000,可设定]
int index;//随机数下标
bool isFirst=true;//判断是否为第一次进入登陆界面,修改界面细节
int Llimit=10;//设置数学题的出题范围
int hard=1;//数学题难度 /*函数初始化声明*/
void login();
void doMath();
void encryption();
void doWordSplling();
void clockStart();
void clockFinish();
void adminLogin();
void enterAdmin();
void printLine();
void setLimit(int n);
int getRandom(int n);
void modifyRank(int n);
void printScore(int localScore);
void judgeIndex(int index);
void isRepeat(int *a,int *b,int *sign);
void getReflectMessage();/** 主函数入口 */
int main()
{//system("COLOR fc");login();
}/** 登陆界面 */
void login()
{clockStart();printLine();if(isFirst)printf("* 欢迎使用全球最先进的答题系统   *\n");printf("* 1.做数学题                     *\n"); printf("* 2.做单词拼写题                 *\n");printf("* 3.成绩查询                     *\n");printf("* 4.管理员模式                   *\n");printf("* 5.退出                         *\n");printLine();printf("\n");printf("请输入一个数字(功能如上):");int n;scanf("%d",&n);while(n>5||n<1){printf("错误的输入,请重新输入:");scanf("%d",&n);} clockFinish();//随机数初始化完成 switch(n){case 1:doMath();break;case 2:doWordSplling(); break;case 3:printLine();printf("当前成绩为:%d           *\n",score); printLine();break;case 4: adminLogin();break;case 5:printf("exit\n");return;   }
} /** 单词拼写 */
void doWordSplling()
{int localScore;int i =33;while(i-->0)printf("*");printf("\n"); printf("正在出题,请稍后.....\n");sleep(1);int ans;char word[100];for(int j=0;j<6;j++){ans==1; //ans=getRandom(3);switch(ans){case 1:printf("请输入苹果的英文:");scanf("%s",word);if(strcmp(word,"apple")==0){printf("你真棒~\n");localScore++;}else{printf("拼错了哦~\n");}break;case 2:printf("请输入香蕉的英文:");scanf("%s",word);if(strcmp(word,"banana")==0){printf("你真棒~\n");localScore++;}else{printf("拼错了哦~\n");}break;case 3:printf("请输入昨天的英文:");scanf("%s",word);if(strcmp(word,"yesterday")==0){printf("你真棒~\n");localScore++;}else{printf("拼错了哦~\n");}break;case 4:printf("请输入高兴的的英文:");scanf("%s",word);if(strcmp(word,"happy")==0){printf("你真棒~\n");localScore++;}else{printf("拼错了哦~\n");}break;case 5:printf("请输入悲伤的的英文:");scanf("%s",word);if(strcmp(word,"sad")==0){printf("你真棒~\n");localScore++;}else{printf("拼错了哦~\n");}break;}ans++;}printScore(localScore);}/** 出数学题,通过运行时间戳来计算随机数* 题目包括加减乘除四则运算*/
void doMath()
{int a1,b1,c,ans,localScore=0;//加载界面 printf("正在出题,请稍后.....\n");sleep(1);printLine();int kind;//题目初始化,十道题目一次性放进数组中//如果存在重复的题目则重新出题 (暂时取消该功能)for(int i=0;i<10;i++){//加减乘除选择一个//注意:为了程序的稳定性,暂时未实现除法 kind = getRandom(2);//1为加法,2为减法,3为除法,4为乘法 a1=getRandom(Llimit);b1=getRandom(Llimit);switch(kind){case 1://加法c = a1+b1;printf("%d.%d+%d=",(i+1),a1,b1);scanf("%d",&ans);if(c==ans)localScore +=hard;break;case 2://减法 c = a1-b1;//printf("%d.%d-%d=",(i+1),a1,b1);if(c < 0){c = b1-a1;printf("%d.%d-%d=",(i+1),b1,a1);}else{printf("%d.%d-%d=",(i+1),a1,b1);}scanf("%d",&ans);if(c==ans)localScore +=hard;break;case 3://乘法 c = a1*b1;printf("%d.%d*%d=",(i+1),a1,b1);scanf("%d",&ans);if(c==ans)localScore +=hard;break;}} printScore(localScore);return;
}/** 打印横线 */
void printLine()
{int i=34;while(i-->0) printf("*");printf("\n");
}/** 管理员模式 */
void adminLogin()
{printf("please input your password:");char str[6];scanf("%s",str);int count=0; while(count <=5){count ++;if(strcmp(str,"123456")==0){enterAdmin();break;}printf("Your password is wrong,please check it agagin!\n");scanf("%s",str);}printf("Goodbye~\n");
}
/** 进入管理员模式 */
void enterAdmin()
{printLine();int ans;printf("Welcome to admin mode.     *\n"); printf("1.简单模式             *\n");//默认难度 printf("2.普通模式           *\n");printf("3.炼狱模式          *\n");printf("4.随机数因子查询       *\n");  printLine();printf("请输入功能码:");scanf("%d",&ans);modifyRank(ans);
}
/** 修改模式 */
void modifyRank(int ans)
{switch(ans){case 1:setLimit(10);hard =1;getReflectMessage();break;case 2:setLimit(1000);hard =2;getReflectMessage();break;case 3:setLimit(100000);   hard =3;getReflectMessage();break;case 4://随机数因子调试 for(int i =0;i<1000;i++)printf("%d\n",random[i]);}isFirst = false;login();
}
void getReflectMessage()
{printf("当前limit为%d",Llimit); printf("修改成功\n");
}/** 打印成绩 */
void printScore(int localScore)
{score +=localScore;printLine();printf("当前成绩为%d           *\n",score);printf("本局成绩为%d           *\n",localScore);printLine();isFirst = false;login();
}/** 该算法执行后会完成随机数数组初始化 * 注意:该随机算法只有结束了一个时间周期之后才可以执行 */
void encryption()
{SYSTEMTIME st={0};GetLocalTime(&st); long nowTime = st.wMilliseconds;//获取随机因子1(ms) long nowSecondTime = st.wSecond;//获取随机因子2(s) long mid = nowTime * nowSecondTime; //获取随机因子3 if(mid ==0){printf("程序错误,请重启\n");return;}random[0] = mid ;//printf("mid=%d",mid);//随机数组初始化long long int realRandom;//获取随机因子4 for(int i=1;i<1000;i++){//创建一个随机数realRandom =(nowTime*i*mid<<10^i)% Llimit;//realRandom = rand() * (i*i);int j=3;while(realRandom <=0){realRandom=(nowTime*(j*i)<<5^j)%Llimit;j+=j<<(j%10)%1000;}
//      printf("%d\n",realRandom);random[i] = realRandom;}//随机数因子调试
//      for(int i =0;i<1000;i++)
//      {//          printf("%d\n",random[i]);
//      }
} /** 设置随机数组的范围,默认值为10* 随机值的难度随着选择的难度而调整 */
void setLimit(int n)
{Llimit = n;
} /** 从随机数组中获取随机数 * 输入一个数字,返回 (0,n]的范围 */
int getRandom(int n)
{int ans = random[index]%(n+1);while(ans ==0)//ans不能为0 {index++;judgeIndex(index);ans = random[index] % (n+1);}  index++;judgeIndex(index);//printf("ans=%d\n",ans);return ans;
}/** 判断数组是否越界 */
void judgeIndex(int index)
{if(index>999){index =1;}
}/** 程序启动时启动该时钟 */
void clockStart()
{start = clock();
}/** 时钟结束函数* 此函数只有在出题前才会调用 */
void clockFinish()
{finish = clock();duration = (double)(finish - start)*1000000 / CLOCKS_PER_SEC;//printf("%lf",duration);encryption();//启用高级加密算法提供随机数
}

注意事项:
(1)该项目仅供参考学习。
(2)dev写的程序,用vc大概率跑不了,编译器不一样,操作起来有很多不一样的地方。

参考文献:
(1)https://jrhar.blog.csdn.net/article/details/80499906
(2)https://blog.csdn.net/sea_snow/article/details/82752492

C语言实现自动出题、单词拼写等功能,附带管理员模式相关推荐

  1. 列表根据下标取值_散列表(上):Word文档中的单词拼写检查功能是如何实现的?...

    Word这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在Word里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼写 ...

  2. 18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

    问题引入 在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误",Word 文本编辑器的拼写检查功能是如何实现的呢?散列表(Hash Table) 散列表 散列 ...

  3. 【散列表(哈希表) Hash Table(上)】:Word文档中的单词拼写检查功能是如何实现的?

    Word 这种文本编辑器你平时应该经常用吧,那你有没有留意过它的拼写检查功能呢?一旦我们在 Word 里输入一个错误的英文单词,它就会用标红的方式提示"拼写错误".Word 的这个 ...

  4. 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

    [思考题]:在Word里面输入一个错误的英文单词,它会用标红的方式提示"拼写错误".Word的这个单词拼写检查功能,虽然很小但是却非常实用.你有没有想过,这个功能是如何实现的? 1 ...

  5. 散列表(上):Word 文档中单词拼写检查功能是如何实现的?

    本文是学习算法的笔记,<数据结构与算法之美>,极客时间的课程 在平时我们使用Word的时候,输入一个错误的单词,它就会用标红的方式提示"拼写错误".Word的这个单词拼 ...

  6. 18散列表(上):Word文档中的单词拼写检查功能是如何实现的

    文章目录 1.散列思想 2. 散列函数 3. 散列冲突 4. 解答开篇 问题:Word的这个单词拼写检查功能是如何实现的? 1.散列思想 散列表:Hash table. **散列表利用数组支持按照下标 ...

  7. windows下使用aspell开启emacs的单词拼写检查功能

    第一步,你需要下载aspell安装文件和至少一个字典,下载地址为http://aspell.net/win32/. 下载之后,分别安装aspell和字典. 需要注意的是,在64位的WIN7下,&quo ...

  8. C#——《C#语言程序设计》实验报告——面向对象程序设计——自动出题判分小程序

    一.实验目的 掌握Visual Studio(C#编程界面)和调试的基本方法: 掌握C#类型系统: 掌握C#控制语句用法: 掌握数组的用法: 二.实验内容 编写一个Windows程序,实现自动出题并判 ...

  9. [C#][Windows窗体程序]实现自动出题并判分

    文章目录 一.pandas是什么? 二.效果演示 三.代码 Form1.cs 四.补充 一.pandas是什么? 编写一个Windows程序,实现自动出题并判分的功能. 功能要求: 能使用Random ...

最新文章

  1. 《少年先疯队》第九次团队作业:Beta冲刺第二天
  2. Logstash 实践: 分布式系统的日志监控
  3. ibatis example Class 使用
  4. 边工作边刷题:70天一遍leetcode: day 97-1
  5. python实操题_Python100道练习题,光看不练假把式,Python实操资源
  6. python ipaddress_Python3标准库:ipaddress Internet地址
  7. 【Go API 开发实战】Go API 开发实战教程简介(1-7)
  8. 牛客网【每日一题】5月15日题目 储物点的距离
  9. 格式说明_ISO11784/85 FDX-B动物芯片格式写码说明
  10. 在计算机中查找notepad,notepad一般在电脑哪里呀
  11. maven创建java项目_使用maven命令行创建java项目
  12. AI 会替代程序员?超好用的自动补全代码工具 Deep TabNine!
  13. JAVA自定义Mybatis注解
  14. webpack的可视化资源分析工具webpack-bundle-analyzer的使用
  15. 助学贷款系统导入预申请时问题解决办法汇总
  16. 必须了解的程序员 8个职业发展方向
  17. 位运算实现求一个数的相反数
  18. 怎么使用软件操作将桌面上CAD转换为黑色背景WMF格式?
  19. Activiti 介绍
  20. [c++学习笔记19]:stack容器

热门文章

  1. vc6.0关于code jock在打开多文档debug版本崩溃的问题解决
  2. 最经典的常用拍照姿势大全,顶级POSE
  3. 业务数据分析的8个流程与常用7个思路
  4. 8月2日 jquery
  5. unity把公共方法在Inspector 界面上实现一个按钮点击直接调用的最快最方便的方式
  6. 学霸创业团队的崛起:以大数据重塑K12在线教育
  7. 必看干货!微信营销话术,微信营销技巧有哪些
  8. Energy 收购 VDD Tech
  9. stata 求输出相关系数矩阵命令_Stata外部命令:那些最常用的和最新的命令
  10. UC伯克利马毅教授于2021年2月23日发的微博