项目一、24点游戏
1 问题描述
1.1 问题描述任意给出4张牌,计算能否用+、-、×、÷将其组合成24
输出其可能的组合式
1.2 游戏描述
棋牌类益智游戏,要求结果等于二十四,一起来玩玩吧!这个游戏用扑克牌更容易来开展。拿一副牌,抽去大小王后(初练也可以把J/Q/K也拿去),剩下1~10这40张牌(以下用1代替A)。
任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。每张牌必须且只能用一次。如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24。
它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受。这种游戏方式简单易学,能健脑益智,是一项极为有益的活动。
2 功能分析
2.1 帮我计算
当我们用扑克牌玩24点时,抽出四张扑克牌,自己死活也想不出来,难道这四张扑克牌真的算不出来24点?
“帮我计算”是24点程序的核心内容。用户输入4张扑克牌,由计算机帮助用户得到所有解并输出到屏幕上。用户不禁感叹,自己万万没有想到,原来可以这样算出24点。
拓展:
支持输入JQKA、jqka 甚至是小数
支持24点的修改,用户可以改成36点、10点等等
算法详见 算法分析 部分
2.2 开始练习
当你想锻炼一下自己算24点的能力时,那么请开始练习!
系统随机给出4张扑克牌,当然,这四张扑克牌是可以算出24点的。然后,亲们请输入算式比如 (13+1)*2-4 然后按回车 程序内置的计算器可以计算出结果并且判断是不是等于24,如果不是24的话,程序会告诉你正确的解法的。通过不断的练习,你的计算24点的水平会越来越高的。
2.3 开始挑战
当你的计算水平越来越高,练习模式是远远不能满足你的需求的,那么,挑战(天梯、闯关)模式才是你的归属。一次出错,立刻出局。准备好了吗?挑战一下你自己吧,看看自己能闯多少关。
2.4 双人模式
独乐乐不如众乐乐,两个人比比谁算的快也是不错的。输入用户A和用户B的姓名后,开始PK!A先算出来按空格,B先算出来按回车,如果两个人都算不出来,可以按其他键跳过。A按了空格之后,要输入有效的算式才会加分。如果答案错误,那么A是会扣分哦。结束PK后,会有简单的判定判断谁获胜或是平局。
2.5 设置
输入相应的数字,可以修改如下设置:
当前下限(最小的扑克牌):默认A
当前上限(最大的扑克牌):默认K
is 24点(该项设置不会在下次游戏开启时载入…)默认 24
重置所有设置(程序有bug时也可以重置)
下次运行游戏是否载入当前设置:默认 是
返回菜单
3 算法分析
3.1 穷举法
给定 4 个数 a,b,c,d ,如何用加减乘除以及括号将其组合起来,得到结果24,是求解24点游戏的算法。由于 a,b,c,d 可以任意交换位置,故有 A44 =24种不同的排列。对于a ,b,c,d 的某个排列 A B C D,中间可以安排运算( 表示+、-、×、 /中的任何一个),即:A B C D 。如果选取所有不同的运算符组合,3 个位置的运算符组合有4^3 =64种排列。
再考虑到运算的先后顺序,又有 5 种排列。它们分别是:(A B) (C D)、 ((A B) C) D 、(A (B C)) D 、A ((B C) D)、A (B (C D))。总共有 24×64×5=7680 种不同的算法。此法穷尽了所有可能的组合,它不会遗漏任何一个可能的解。如果有 4 个数,按此法找不到结果为 24 的解,那就是无解。
3.2 制定重解消除规则满足加法交换律的只输出1组解
尽量少的使用括号,最好不使用括号
如果有括号,那么括号必须放在最前
经过以上规则,可以消除大部分重复解。
3.3 模拟二叉树
3.4 循环实现以及栈的恢复
4 函数详解voidmain(void);//程序入口
voidmenuPrint();//显示菜单并根据settings.mode的值显示光标
intmove();//根据键盘的输入,显示菜单和光标,如果点击回车或数字则进入相应下一级函数
voidexitGame(void);//退出程序
voiduserGet();//与userGetIn()配合使用,直到用户正确输入四张牌才退出死循环
voidexercise();//练习模式核心函数
voidtianti();//天梯模式核心函数
voidpk();//pk模式核心函数
voidprint_settings();//设置界面核心函数
voidhelp();//帮助界面核心函数
voidchange_settings(intnum);//设置界面二级函数,传入要修改设置的内容序号,修改相应的设置
voidsave_settings();//保存设置到本地文件
voidinitSettings_temp();//初始化菜单光标 指向 1.帮我计算
voidresetting();//重置所有设置
voidread_settings();//读取上次保存的设置.第一次打开游戏时显示帮助界面
char*number_to_poker(floatnumber);//把读入的数字变成扑克(字符数组)
floatpoker_to_number(char*poker);//把扑克(字符数组)变成浮点数
voidinitAllFromCon();//恢复堆栈数组(从原始数组中)
voidinitArrFromCur();//恢复临时数组
floatcalc(floatn1,floatn2,charo);//传入数字n1.n2.和操作符(+-*/),返回一个浮点数
voidrandomGet();//随机得到四个能计算出24点的扑克牌
voidprintResult_1(inta,intb,intc);//传来三个操作符 读取数组cur[4]的四个数据 打印出来
voidprintResult_2(inta,intb,intc);//等同于printResult_1
ints_first(intisPrint);//模拟平衡二叉树之单挂 传入参数为1时输出正解 0则不输出
ints_second(intisPrint);//模拟平衡二叉树之双链 这两个函数是核心算法 返回1时则是可以算出 返回0就是算不出24点
intuserGetIn();//帮我计算核心函数
char*keyControl_to_charPointer(intkey);//逗比函数 未完成的函数 多半是废了
charkey_to_char(intkey);//读取键盘输入 返回字符型 多半也是废了
inttest(void);//测试函数
voidtranslate(charstr[],charexp[]);//对堆栈的细节处理
floatcal_value(charexp[]);//一个使用堆栈的计算器 支持() + - * /
intzhabi();//调用translate和cal_value函数
voidgoto_pos(intx,inty);//光标移动函数
项目二、高级语言源程序注释部分的处理
1 问题描述
1.1 程序描述
1.1.1 任务描述
将C语言程序中的所有注释都去掉,并将去掉注释的文件和注释分别放入一个新的文件中。
1.1.2 功能描述读取用户指定名字的源程序,例如,用户输入:exercise.cpp,程序能读取该文件进行处理
将文件中的注释(同一行中//之后的部分,以及/*和*/之间的部分,包括//、/*和*/)部分删除
将去掉的注释部分和删除注释后的C语言程序,分别保存到两个不同的文件中,文件名允许用户指定
1.2 程序描述
程序在实现上述功能后,还可以直接在框框里面输入代码,在Windows 10下可以直接Ctrl+V粘贴,但是在Windows 7下则不可以,这是由于Win32控制台的限制。同时,不能以各种键(如ESC)作为结束标志,也不能以回车作为结束标志。所以,我选择了@符号作为结束标志。如果代码中有@,推荐直接读取xxx.cpp就好。
2 函数详解intfirst(void);//读取本地文件进行代码与注释分离
intsecond(void);//在框框里面输入代码分离注释
voidmenuPrint(inti);//根据光标的位置打印出对应的菜单
intmove();//移动光标
intmain(void);//主函数
项目三、单项选择题标准化考试系统
1 问题描述
1.1 任务描述
设计一个单项选择题的考试系统,可实现自动组卷功能。
1.2 功能描述
1.2.1 管理员功能试题管理:每个试题包括题干、4个备选答案、标准答案等信息。可进行试题添加、删除、修改、查询、保存、浏览等操作
组卷功能:指定题目数、题目总分,生成试卷。将试卷输出到文件,将答案输出到另一个文件
用户管理:对用户信息进行添加、删除、修改、查询、保存、浏览等操作
用户答题情况管理:指定用户,统计其做试卷的总次数,以及每次所得的总分
1.2.2 用户功能练习功能:用户指定题目数,随机选题。对用户的答案与标准答案进行对比,并最终给出成绩。对错误题目,要能给出正确答案
考试功能:用户指定题目数,随机生成总分100分的试卷,系统可根据用户答案与标准答案的对比实现判卷,并给出成绩。并将用户所答试卷、用户的答案、用户所得总分,输出到磁盘文件保存。进行基本试题分析
1.2.3 设计提示
管理员和用户分别通过密码登录,进行题目维护和答题操作。用户产生的答题文件,应以用户名+系统时间.txt的形式存储,以便于进行管理。
2 程序流程(框图结构)
3 函数详解//main.cpp
voidmain(void);//程序入口
intmove_1(intnum,void(*p)(int));//集大成的move_1函数 传入菜单选项的个数已经相应的void menuPrint_x(int a); 即可打印各种菜单
voidmenuPrint(inta);//菜单显示函数
voidprintLaugh(intx,inty);//打印(*^_^*)并把光标移动至笑脸的中央
voidgoto_pos(intx,inty);//光标移动函数
intfuzzy_search(charstr[],charstr2[]);//模糊查找函数,char str[]为源字符串,char str2[]为查找的关键字
//admin.cpp
intsign_in();//管理员登录界面
voidadmin();//管理员控制界面 1.试题管理(增删改查) 2.组卷功能 3.用户账号及答题情况管理 4.修改管理员密码 0.注销登录
voidmenuPrint_2(inta);//显示菜单~~管理员登录界面
voidquestion_admin();//question() -> question.cpp
voidauto_paper();//自动出卷
voiduser_admin();//进入函数admin_user()
voidchange_admin_password();//修改管理员密码
structinfo*find_info_num(structinfo*head,intnum);//根据题号查找试题
structinfo*find_info_score_num(structinfo*head,intlev);//根据分数查找试题 多半是废了
//question.cpp
voidquestion();//试题管理界面
voidmenuPrint_3(inta);//显示菜单~~试题管理界面
structinfo*solo_info();//申请malloc单个题目
voidinput_info(structinfo*head);//新建一个题目并初始化题目信息带头结点的尾插法
voidwrite_info(structinfo*head);//把题库写入到文件info.txt中
structinfo*read_info();//从本地文件info.txt读入题库
voidfree_info(structinfo*head);//释放链表
voidprint_info(structinfo*node);//输出所有题目的信息
voidprint_info_solo(structinfo*node);//输出一个题目全部信息到屏幕
voidfprint_info_solo(FILE*fp,structinfo*node);//输出一个题目全部信息到文件fp
//time.cpp
voidprint_time(longlt);//输出当前时间到屏幕
voidsprint_time(char*buf);//输出当前时间到字符数组
//find_info.cpp
structinfo*find_info(structinfo*head);//查找试题界面
voidmenuPrint_4(inta);//显示菜单~~查找试题界面
structinfo*find_info_key(structinfo*head);//按照关键字查找题目,返回题目的上一个指针
voiddelete_info_no(structinfo*find);//删除题目信息
structinfo*find_info_no(structinfo*head);//按照题目编号查找题目,返回题目的上一个指针
voidchange_info(structinfo*node);//修改题目详细信息
voidfind_info_next(structinfo*node);//选择修改题目信息或删除题目,传来的是题目的上一个节点
structinfo*find_info_lever(structinfo*head);//按题目难度查找
structinfo*find_info_score(structinfo*head);//按题目分值查找
structinfo*find_info_time(structinfo*head);//按最近添加/修改题目
//admin_user.cpp
voidadmin_user();//学生信息管理界面
voidmenuPrint_5(inta);//显示菜单~~学生信息管理界面
structuser*solo_user();//申请内存
voidinput_user(structuser*head);//学生注册不~带头结点的尾插法
voidwrite_user(structuser*head);//把学生信息写入文件中
structuser*read_user();//从文件中读入学生信息
voidfree_user(structuser*head);//释放内存
voidprint_user(structuser*node);//输出所有学生信息
voidprint_user_solo(structuser*node);//单个输出学生信息
//find_user.cpp
structuser*find_user(structuser*head);//查找学生界面
voidmenuPrint_6(inta);//显示菜单~~查找学生界面
structuser*find_user_name_key(structuser*head);//按学生姓名(模糊)查找
structuser*find_user_no_key(structuser*head);//按学生学号(模糊)查找
voiddelete_user_no(structuser*find);//按照学号删除用户信息
structuser*find_user_no(structuser*head);//按照学号查找用户
structuser*find_user_name(structuser*head);//按照姓名查找用户
voidchange_user(structuser*node);//修改用户学号和密码
voidfind_user_next(structuser*node);//修改用户信息或删除用户
structuser*find_user_time(structuser*head);//最近登录的用户
//user.cpp
voiduser();//学生登录界面
voiduser_login(structuser*head,structuser*node);//用户登录后
voidmenuPrint_7(inta);//显示菜单~~单项选择题标准化考试系统
voidprintRectangle(intx,inty);//在指定位置输出黄色矩形
voidcolor(constunsignedshortcolor1);//改变颜色---
voidexam(structuser*node);//考试
intisQusetion(structinfo*node,char*p);//题目是否满足要求
interrorsNum(structuser*node);//计算用户错了多少题
voidanswerWrong(structuser*node,structinfo*temp);//用户答题错误之后...
voidexecrise(structuser*node);//练习
c语言高级语言源程序注释部分处理 课内资源 - 基于C语言实现的24游戏-高级语言源程序注释部分的处理-单项选择题标准化考试系统...
如果觉得《c语言高级语言源程序注释部分处理 课内资源 - 基于C语言实现的24游戏-高级语言源程》对你有帮助,请点赞、收藏,并留下你的观点哦!