摘要
为了提高数学算术计算能力,通过C语言编程实现数学类计算出题、判断以及成绩统计的程序。
此外如果没有时间看正文,一 定 一 定 要 把 引 言 看 完 ! ! !
文末附加程序,所有人都可以进行训练。
编程并不是我的目的。我的真正目的,是为了加速人脑的思考速度。
这才是我最想达到的目的,我希望更多的人能因此受益。
引言
人的大脑,瞬间可以进行多快的思考?
这是在我曾经有过一段时间高速的思考以后意识到的问题。
在股市热门的时候我为了甄选股票,连续长时间的翻阅很多股票的基本资料,因为开市时间有限,时间紧急,我不得不在短时间内观察几十上百只股票的形态走势,因为这段时间精神注意力强烈集中,导致我在这段时间以后,大脑还是以这样的速度去思考生活中的问题,然后我突然意识到,时间变慢了,或者反过来说,我的思考速度比往常快了很多。(当然,由于这段时间以后我不再这样做了,大脑又退化回原来的样子。)
这段神奇的体验让我意识到,如果人的大脑经常以高度注意力去思考问题,快速解决问题,那么大脑会逐渐形成习惯,然后人的平常思考速度就会变快很多。
这有什么用?
对于学生来说,加速思考能让他们更高效的学习,并且在考试中以更加优秀的状态去解决问题。
而理科尤其需要大量逻辑思考,提升大脑思考速度能明显增加学生的学习效率。这就是我设计这个程序的初衷。
我曾经也思考过这样一个问题,为什么有些人被称作天才,他们难道天生就比普通人优秀吗?
通过我从书上看到的介绍天才的例子,我认为所谓天才就是大脑的某些能力突出导致的平时表现优于其他大多数人。有些人依靠他的短时记忆力优秀,整个学期都在玩,然后在考试前一天复习整本书,最后考出优异成绩。巴菲特被人注意是因为他的赚钱能力,但大多数人没有注意到他的心算能力优异,可以短时间把一只股票的大致盈利区间算清楚。
就像人人都羡慕特异功能,这是因为特异功能是大多数人做不到的能力,如果一种能力大多数人都有,那么也就无法被定义成特异功能。您仔细品!
因此我的目的是制造天才。我认为天才等于普通人加上一些优异的能力。普通人,每个人都是,优异的能力是脱颖于普通的能力。
就像一万小时理论,如果一种能力或者技术练习一万小时,那么你就是这个领域的专家。
而短时记忆力,心算能力之所以不被人注意是因为它模糊不清,无法被清楚的描述。
想象一下,在生活中如果你随手记下别人说过的话,或者一段电话号码,那么就会被惊为天人,
电视剧《奋斗》里陆涛背下夏琳20个电话号码,最后打电话打过去,约到妹子。
计算能力的挑战,是没有上限的。
人在短时可以记住七个数字,但是通过一定的训练,能够记住更多,不管方法如何,能记住就达到了效果。这是考验记忆力的一方面。
有了单纯的记忆力还不够,还要提升计算思考能力,这样才是更高级的发展。
我设想的是,通过多位数的加减乘除,以及分数、根号这些题目的心算,来达到既能锻炼记忆力,又能锻炼计算能力的方式。
单纯的心算人人都会做,但是却没有几个人有动力这样做。
我的想法是,把这项活动当作挑战,这样能刺激人的注意力更加集中,这样的话达到的效果更好。
正文
设计目标:
我的目的是为了让人类整体的计算能力提高,达到一个新的台阶。
我觉得应该有一些大规模的比赛,可以将这个比赛推广到世界,可以引起全世界的关注。
这个世界欠数学一个奖项。诺贝尔奖有物理,化学,生物,文学,和平。却唯独没有数学。就像我们重点科目语数外理化生,唯独缺少数学是不完整的。
数学的计算能力很重要,只有不断提升计算能力,我们才能进阶下一个阶段。至于下一个阶段是如何的,我也不知道。
设计需求:
1、出题的难度可以自行设定,目的是为了在多用户使用情况下,使他们按照同难度不同题目进行训练。同难度是保证练习的公平性,不同题目是为了避免抄袭。
2、给题目设置一个综合评分,目的是用于跟自己的历史成绩相比,在细微之处看出自己是否有进步。有进步才有继续下去的动力。
3、要有一个排行榜,用于更新每日挑战的最优秀的人,目的是增加用户的练习动力。(能力不足暂不考虑)
4、设置不同模式的挑战。内容方面:加减乘除,分号,根号,幂运算,指数运算。挑战模式方面:固定数量题目限时挑战,无尽模式,计算能力测评,每日固定时间排位赛(一对一,进行多种类型题目比赛),每日打卡挑战(经常练习能力才不会退化,用于稳固能力)。
5、可以将练习题目保存为文件,通过读取文件可以再次进行练习。目的是多人同时比赛的时候,使用的是同一套题目,保证的难度的绝对公平。并且在超出以上练习方式以后,通过编辑题目跟答案能够达到更多的扩展。
6、最好可以在手机上实现,并且联网。目的是随时随地能进行练习。(能力不足暂不考虑)
模块规划:
根据上述要求,程序主要有以下几个独立模块互相连接。
1、出题模块:主要有两种获得题目的方法,一种是程序自行设计出题并计算对应答案,还有一种是通过调用外部文件将题目导入程序。
2、考试练习模块:此模块通过设置考试类型以及时间以后,给用户出题,并统计每一道题目所花费的时间。出题的时候应该是循环机制,所以在结束循环的判定条件上有两个,一个是时间结束判定,还有一个是所有题目完成判定。这里要注意一个问题,即在输入的时候时间到了该怎样处理。在C语言里面,很容易产生正在输入与时间结束的冲突,需要很好的协调这个问题。
3、统计评分模块:这里有两个必须做的事件,一个可选事件。必做一,存储用户成绩。必做二,存储错题,用于以后的错题复习。选做的事件是将考试题目与答案存储,用于以后的回顾。
这里我要说一下统计评分——用户成绩存储。这个很重要,因为这是评判标准,也是人能否坚持下去的动力。
我认为成绩查看有两个目的:
一是给自己看,用于跟自己过去成绩的对比,看看自己进步了多少,属于自我满足。
这里建议增加成就系统,用于各种成就挑战。
二是给其他人看,用于分享展示自己的能力,获得认同感。
在这一点上应该细分下去
个人的分享展示只能给自己的周围好友看,属于围观人数少的情况,挑战难度简单,成就感低。
这里我推荐设置一个排行榜,同于展示个人的成绩。排行榜的成绩按一定周期频率更新。展示的内容有能力指数(按题目难度与时间比计算),挑战指数(在一次无尽挑战中共计算了多少题目),标准测试评分(按最短时间内全部答对排序)。挑战难度大,成就感高。
排行榜的设置应该可以有一个小范围的人群,比如同校区范围,或者同省市。最好有一个全国性的或者世界性的排行。
在介于两者之间的情况,我认为应该设计一个百分比排序,即本人成绩在每百人(千人,或者万人)中的位置。
程序设计:
由于水平有限,这里用C语言来实现项目。
操作系统:WIN10
编程软件:C-Free 5
这里介绍一下问题,WIN10系统下CFree5运行时有可能报错,这是因为安装时候的安装地址上面不允许有空格存在,把文件夹地址“C-Free 5”中的空格删除再安装就能解决问题。
软件很好用,但只有一个月的试用期。在这里我要说:大家要支持正版。
全局设置
首先做一个设置模块,用于设置出题的格式。
设置题目的格式有计算模式,前后两位数字的位数,几个数字进行计算(此处考虑到复杂性,默认两个数字)
这里看上去有四部分,最上面一块是结构体数组。我本来想把它做成链表形式的,但因为懒没有做。(主要是我烦透了链表的遍历,考虑编程的话需要消耗大量脑细胞)
数组与链表的差别在于,数组属于固定存储大小的内容,而链表可以无限扩展的,在考虑存储结构问题上链表是最好的。如果是一个大的程序,存储结构必须是链表,这样才能保证不浪费存储空间。而我此处用数组的原因在于我这个程序很小,占用存储空间不大。此外数组的话遍历数据很方便,只要一个for循环就可以把内容全部调用出来了。
第二部分是为了出题设置的几个变量。我喜欢C语言的地方就在这里,设置一个全局变量可以随处调用,但是这也是一个缺点,如果程序很大,不小心调用错一个变量的话会导致莫名其妙的错误。所以,各位一定要记住自己设计的全局变量,不要设置太多。
第三部分是为了解题而设置的变量。我这里用了一个状态变量,daan_stuff,这是一个字符类型变量,用来存储“Y”或“N”。这个用来考虑编程的时候有些时候需要查看问题跟答案,而真正在用户使用的时候需要隐藏的。我是为了调试方便设置的。设置成“Y”以后我可以在运行的时候直接看到答案,而设置成“N”以后就看不到答案了。比如下图:
第四部分是我最后加的内容,用于存储答题时候答对答错的结果,以及用时。
以下是设置模块
效果如下
题目设计模块
题目的设计我想了很久,其实都并不如意,但勉强还能用。
这里我要考虑的一个问题是,我需要设置很多的随机数,由这些数组合成数字。
有一点要注意:我并没有直接用随机数生成一组数(比如1234,45678,9348532……这样的数字),而是一个一个数生成出来的(3,2,6,4,8,4,1……这样生成的)。在这里我要保证的是每个数字出现的机率尽可能均匀,或者如果增加难度的话应该让数字7,8,9出现的更多一点,而0,1,2出现的更少一点。
所以我为此专门做了一个函数,首先生成单个数字,用于保证生成的数字概率上是相等的。
当然我这里还是设置简单了,我觉得应该有提升的空间,这是出题的核心,应该可以设置很多种模式,比如简单的模式下小数字出现的更多(0,1,2,3),而困难模式下,大数字出现的更多(6,7,8,9)。
而且,我将数存储为字符格式,这里有我的考虑:
1、如果要进行八进制或者十六进制的运算的时候,生成数字不好,会影响观察效果,而这里可以变成存储为英文字母的时候就可以让结果更适用。甚至是任意进制都可以很容易扩展。
2、如果数出现的概率不一样,那么我可以直接把英文字母替代为数字。比如如果这一串数列里面(A,B,C,D,E,F,G,H,I,J)C的概率出现的最大,而我想要设置难度的时候,可以把(1~9)中任何我想要它出现的最多的数字替代进去,这样就可以设置出题的时候难度问题了,我想要出题简单就把1或者0替代C,而我想要出题困难就把9替代C。
以下是设置效果
以上因为我设置数列从0开始的,所以0,1出现的量会比其他数字更多。
这里有一点,如果我想要设置更困难的出题模式的话,可以把0替换掉。
shu[i]=48+i%10;生成的是0~9
改成shu[i]=49+i%9;则生成的是1~9
数列生成以后就是出题了。
这里,我是把数字连带运算符号全部变成字符,存储于一个字符串数组里面,等用的时候一个一个导出来。
为了保证两道题之间的数字不会连在一起,我在其中加了一个空格“ ”存储。上图203行。
运行效果如图:
仔细看出题的数字跟上面数组的数字,其实我就是按顺序放进去的。
答案计算模块
出完题以后,就是计算答案了。
由于题是字符串形式存储的,所以我需要把它变成数字。
这里我就不贴图了,原理就是取出题目中的每一个代表数字的字符串,然后导入专门的转化成数字的函数。再计算。
这里有一个我要提出的重点:
我把数字的存储格式设置成long long int
这样做的好处是存储的数字更大了。
int存储4个字节,最多存放10位数。
而long long int存储8个字节,最多存放20位进制数,应该是19位数。
用这个形式存储就导致我这的运算可以进行两个9位数字相乘而不出错。
所以我这个程序看似简单,但它的功能很强大!
组合模块
出题于解答完成后就是组装到结构体数组里面了。
重点来了!
一个程序的核心就在这里——练习模块
话不多说先放图
我这里设置了两种模式,一种是正常回答模式,结束以后跳到主系统,还有一种是循环无尽循环模式。(这主要是我比较喜欢挑战,所以专门设置了这个内容,目的是不断挑战自己的极限,尽可能提升答题速度。)
当然,这里数组的缺陷就暴露出来了,它的固定内存是无法做出无尽模式的,也同样的当初生成数字数组的时候也是一个缺陷。为此,我只能按照题量出题,完成以后需要重置这个结构体,这样的结果就是里面存储的所有数据都被擦除了。这是一种遗憾,所以为了弥补遗憾,我将里面的内容全部存储在txt文件里面,这样就可以回头看看自己做过的题目了。
这里我把回答的输入也变成了字符串输入。
这样做的好处就是哪怕意外输入一些字符进去,程序会自动跳过这些字符。
给你们看一下实际效果
上图第一题的结果是604,第二题的结果是900
我在里面额外加入了很多的字符符号,但都不影响程序识别。
还有两个附属的函数时存储用函数以及显示函数。
这里有一点要注意的,我当初认真答题没有出错,而一旦为了测试答题就程序卡死。这是因为我设置了答题正确数量这个变量。
而我在一条显示里面,它用做分母,所以一旦全部回答出错,程序就导致卡死。
而我的改进是将这一条加一个条件判断语句,一旦分母是0就不执行这一步。
上图的377行跟384行。
当然我还没有考虑文件的读操作。这一点以后可以考虑改进。
这里,文件的存储函数里面,要注意的是到底要如何操作文件
FILE *fpWrite=fopen(DI_ZHI,"a");a是追加写,不擦除文件内容
FILE *fpWrite=fopen(DI_ZHI,"w");w是擦除文件全部内容,然后写进去
这两者是要注意的。
DI_ZHI是我文件开头定义的,作用是定义存放txt文件的位置,我直接把文件放在桌面了
这里要注意define的作用,其实是在程序运行的前把各个名词代入程序段,然后再运行。
其实define的作用是为了方便程序员更改一些预定义的数据。这里我直接把地址预定义了。也要注意文件的读写里面都是两根“”这是因为斜杠是C语言里面重要符号,它后面跟的内容不一样导致的结果也不一样。而双斜杠的意思其实就是一根斜杠的意思。但如果你只打一根斜杠就要出错了。
最后还是放一下这个文件吧,希望大家能挑战自己。
最后放两张效果图
最后放一下源代码
#include
程序还有一些问题,比如除法计算还没完善,不能使用。并且很多功能没有精简。代码段重用效果不好,还能进一步完善。
此外我在想如果能把它放在手机上就更好了。
最后,谢谢观看!