C语言实现24点游戏

合集下载

C语言写的24点游戏

C语言写的24点游戏
else
if((m%4)==0&&newp[j]%newp[q]==0&&c==3&&newp[q+1]%s2==0)
printf("%d%c((%d%c%d)%c%d)=%d\n",p[3],p1[2],p[0],p1[0],p[1],p1[1],p[2],s3);
}
}
}
}
}
}
}
}
for(c=0;c<4;c++)
{
switch(b[c])
{
case 1:s3=s2+newp[q+1];sign='+';break;
case 2:s3=s2-newp[q+1];sign='-';break;
int a[4],newp[4],b[4]={1,2,3,4};//a[4]数组存放随机生成的四个数
char p1[3],sign; //定义存储运算符的字符数组
printf("四个数是:");
for(i=0;i<4;i++)
{
a[i]=rand()%13+1; //获得随机数
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[2],p1[2],p[3],p1[1],p[0],p1[0],p[1],s3);
else
printf("(%d%c%d)%c(%d%c%d)=%d\n",p[0],p1[0],p[1],p1[1],p[2],p1[2],p[3],s3);

经典游戏--24点--c++代码实现和总体思路(简单暴力向)

经典游戏--24点--c++代码实现和总体思路(简单暴力向)

经典游戏--24点--c++代码实现和总体思路(简单暴⼒向)24点 24点是⼀个⾮常经典的游戏,从扑克牌⾥抽4张牌,其中J=11,Q=12,K=13,然后经过+,-,*,/,(),的计算后,使得计算得值为24,例如抽到1,2,2,5四张牌,那么 (1+5)*(2+2)=24; 这就是可以凑成24点的⼀种情况,作为⼀个经典题⽬,在leetcode上也有对应的题⽬进⾏练习 PS 看见知乎⼤佬有⼀种必24点的算法,但是要⽤到阶乘和次⽅式⼦为(a0+b0+c0+d0)! =24⼀、总体思路 1.因为是简单暴⼒向的,所以我们的做法就是直接穷举出所有可能的情况,⾸先是考虑四个数a,b,c,d的排列情况 如b,a,c,d等等,通过排列组合可以得到 4*3*2*1 = 24 种情况 2.然后考虑a,b,c,d中的三个运算符的情况设⼀个⾃定义的运算符为,可以是+,-,*,/中的任意⼀个 则有 a b c$d 这个式⼦,同样,运算符的可能性有 3*4 = 12 种 3.最后考虑()的情况,我们规定,每次⼀对()只框住两个数,⽐如a+b+c+d =(((a+b)+c)+d) = ((r1+c)+d)=(r2+d)=r3(其中r1=a+b,r2=r1+c,r3=r2+d) ()的情况其实就是运算优先级的问题,⽆论运算符是什么,都⼀定是先运算括号⾥的内容 所以我们可以穷举出情况 第⼀种r1=a b,r2=r1c,r3=r2$d; 第⼆种r1=b c,r2=a r1,r3=r2$d; 第三种r1=b c,r2=r1d,r3=a$r2; 第四种r1=c d,r2=b r1,r3=a$r2; 第五种r1=a b,r2=c d,r3=r1$r2; 仔细观察不难发现,我们控制了运算符和数字的绝对顺序从左到右的顺序严格是a b c$d,不论任何情况都不会改变abcd的顺序,是因为我们在上⾯已经排出来了所有的24种情况,所以我们这就可以严格控制abcd的顺序了⼆、代码实现1 #include <iostream>2 #include <string>3using namespace std;4int mark_int[4] = { 1,2,3,4 };5string mark_char = "+-*/";6double cal(double a, int m, double b)7 {8switch (m)9 {10case1: return a + b;11case2: return a - b;12case3: return a * b;13case4: return a / b;14 }15 }1617bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(a, m1, b);25if (r3 == 24)26 {27 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }3233bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(a, m2, r1);40 r3 = cal(r2, m3, d);41if (r3 == 24)42 {43 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;44return1;45 }46return0;47 }4849bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(b, m1, c);55 r2 = cal(r1, m2, d);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;60return1;61 }62return0;63 }6465bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(c, m1, d);71 r2 = cal(b, m2, r1);72 r3 = cal(a, m3, r2);73if (r3 == 24)74 {75 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;76return1;77 }78return0;79 }8081bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)82 {83double r1;84double r2;85double r3;86 r1 = cal(a, m1, b);87 r2 = cal(c, m3, d);88 r3 = cal(r1, m2, r2);89if (r3 == 24)90 {91 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;92return1;93 }94return0;95 }969798bool all_cal(int a, int b, int c, int d)99 {100for (int i = 1; i <= 4; i++)101for (int j = 1; j <= 4; j++)102for (int k = 1; k <= 4; k++)103 {104if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 105return1;106 }107return0;108 }110111bool judge(int a, int b, int c, int d)112 {113int all[24][4] = {114 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},115 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},116 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},117 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},118 };119for (int i = 0; i < 24; i++)120 {121if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))122return1;123 }124return0;125 }126127int main()128 {129int a, b, c, d;130 cin >> a >> b >> c >> d;131if (!judge(a, b, c, d))132 cout << "凑不成24点" << endl;133134 }三、代码解释先做⼀个计算两个数的函数,⽤数组int mark_int[4] = {1,2,3,4}的四个数表⽰+ - * /,string mark_char是⽤来最后显⽰的1int mark_int[4] = { 1,2,3,4 };2string mark_char = "+-*/";3double cal(double a, int m, double b)4 {5switch (m)//⽤switch来进⾏运算符的选择6 {7case1: return a + b;8case2: return a - b;9case3: return a * b;10case4: return a / b;11 }12 }我们在实现五种括号的函数,并且我们规定运算⼀定是 a m1 b m2 c m3 d(m1,m2,m3是三个运算符的代号),意思就是abcd的从左到右顺序不乱,m1m2m3从左到右的顺序也不会乱,⽐较粗暴的理解就是ab之间⼀定是m1,bc之间⼀定是m2,cd之间⼀定其实m3,然后如果成功返回运算的过程和true,否则返回false1bool cal1(double a, double b, double c, double d, int m1, int m2, int m3)2 {3double r1;4double r2;5double r3;6 r1 = cal(a, m1, b);7 r2 = cal(r1, m2, c);8 r3 = cal(r2, m3, d);9if (r3 == 24)10 {11 cout << "(((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << ")" << endl;12return1;13 }14return0;15 }//第⼀种r1=a$b,r2=r1$c,r3=r2$d;1617bool cal2(int a, int b, int c, int d, int m1, int m2, int m3)18 {19double r1;20double r2;21double r3;22 r1 = cal(b, m1, c);23 r2 = cal(a, m2, r1);24 r3 = cal(r2, m3, d);25if (r3 == 24)26 {27 cout << "((" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << c << "))" << mark_char[m3 - 1] << d << ")" << endl;28return1;29 }30return0;31 }//第⼆种r1=b$c,r2=a$r1,r3=r2$d;33bool cal3(int a, int b, int c, int d, int m1, int m2, int m3)34 {35double r1;36double r2;37double r3;38 r1 = cal(b, m1, c);39 r2 = cal(r1, m2, d);40 r3 = cal(a, m3, r2);41if (r3 == 24)42 {43 cout << "(" << a << mark_char[m1 - 1] << "((" << b << mark_char[m2 - 1] << c << ")" << mark_char[m3 - 1] << d << "))" << endl;44return1;45 }46return0;47 }//第三种r1=b$c,r2=r1$d,r3=a$r2;4849bool cal4(int a, int b, int c, int d, int m1, int m2, int m3)50 {51double r1;52double r2;53double r3;54 r1 = cal(c, m1, d);55 r2 = cal(b, m2, r1);56 r3 = cal(a, m3, r2);57if (r3 == 24)58 {59 cout << "(" << a << mark_char[m1 - 1] << "(" << b << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << ")))" << endl;60return1;61 }62return0;63 }//第四种r1=c$d,r2=b$r1,r3=a$r2;6465bool cal5(int a, int b, int c, int d, int m1, int m2, int m3)66 {67double r1;68double r2;69double r3;70 r1 = cal(a, m1, b);71 r2 = cal(c, m3, d);72 r3 = cal(r1, m2, r2);73if (r3 == 24)74 {75 cout << "((" << a << mark_char[m1 - 1] << b << ")" << mark_char[m2 - 1] << "(" << c << mark_char[m3 - 1] << d << "))" << endl;76return1;77 }78return0;79 }//第五种r1=a$b,r2=c$d,r3=r1$r2;接下来是12种的符号的排列情况,如果有⼀种括号情况满⾜,我们就返回true,否则返回false1bool all_cal(int a, int b, int c, int d)2 {3for (int i = 1; i <= 4; i++)4for (int j = 1; j <= 4; j++)5for (int k = 1; k <= 4; k++)6 {7if (cal1(a, b, c, d, i, j, k) == true || cal2(a, b, c, d, i, j, k) == true || cal3(a, b, c, d, i, j, k) == true || cal4(a, b, c, d, i, j, k) == true || cal5(a, b, c, d, i, j, k) == true) 8return1;9 }10return0;11 }最后是在总判断函数中写⼊24种的abcd排列情况1bool judge(int a, int b, int c, int d)2 {3int all[24][4] = {4 {a,b,c,d},{a,b,d,c},{a,c,b,d},{a,c,d,b},{a,d,b,c},{a,d,c,b},5 {b,a,c,d},{b,a,d,c},{b,c,a,d},{b,c,d,a},{b,d,a,c},{b,d,c,a},6 {c,a,b,d},{c,a,d,b},{c,b,a,d},{c,b,d,a},{c,d,a,b},{c,d,b,a},7 {d,a,b,d},{d,a,d,b},{d,b,a,c},{d,b,c,a},{d,c,a,b},{d,c,b,a},8 };9for (int i = 0; i < 24; i++)10 {11if (all_cal(all[i][0], all[i][1], all[i][2], all[i][3]))12return1;13 }14return0;15 }主函数调⽤judge就完成整个算法了✿✿ヽ(°▽°)ノ✿1int main()4 cin >> a >> b >> c >> d;5if (!judge(a, b, c, d))6 cout << "凑不成24点" << endl;78 }失败的话会显⽰“凑不成24点”其实这个算法的话我写的可以说基本没有优化,就是枚举所有情况实现的,csdn上有⼤佬是有更好的思路的,这篇⽂章也是看了csdn的⼤佬的代码然后⾃⼰修修补补写出来的(我原来看的那篇有bug,⼤佬⾃⼰没发现好像。

c语言实现24点游戏

c语言实现24点游戏

#include "stdio.h"#include "math.h"#include "time.h"void main(){void first();void second();int third();time_t t; /设置机器时间int close=0;char get;clrscr();/清除屏幕缓冲区及液晶显示缓冲区光标位置回到屏幕左上角。

srand((unsigned) time(&t)); /系统时间来初始化for(;;){clrscr();清除屏幕缓冲区及液晶显示缓冲区光标位置回到屏幕左上角printf("24 POINTS SYSTEM v2.2\n"); printf("MADE BY DANTE WANG\n");printf("Jul.28th 2006\n\n");printf("Please choose mode!\n\n");printf("1. Game Mode\n");printf("2. Count Mode\n");printf("3. Quit\n\n");get=getch();等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句switch(get){case '1': first(); break;case '2': second();break;case '3': close=third(); break;default: printf("Please input 1, 2 or 3!\n"); getch(); }if(close)break;}}void first(){int jdgsgn(int a,int b,int c,int d); 1)统计出求不出24的所有组合数目(2)将每一种组合的计算结果写入文件result.txt,每两个组合占一行。

24点游戏C语言代码及报告

24点游戏C语言代码及报告

24点游戏C语言代码及报告24点游戏一,问题分析二十四点游戏规则:给出4个数字,所给数字均为有理数,用加、减、乘、除(可加括号)把给出的数算成24(每个数必须用一次且只能用一次,先算出结果者获胜。

步骤:比如下面的例子:例:3、8、8、9,答案1:(9—8)×8×3答案2: 3×8 ?(9—8)答案3:(9—8?8)×3利用3×8,24、4×6,24求解我的主要想法是首先穷举的可行性问题。

我把表达式如下分成三类—— 1、无括号的简单表达式。

2、有一个括号的简单表达式。

3、有两个括号的较复4、杂表达式。

穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列二,源程序及注释//首先穷举的可行性问题。

我把表达式如下分成三类——//1、无括号的简单表达式。

//2、有一个括号的简单表达式。

//3、有两个括号的较复4、杂表达式。

//穷举的开始我对给出的四个数进行排列,其可能的种数为4*3*2*1=24。

我利用一个嵌套函数实现四个数的排列#include <iostream>#include <string>using namespace std;int number=0;string sss[5000];float cal(float a,float b,int p) {switch(p){case 1:return a+b;case 2:return a-b;case 3:return a*b;case 4:return a/b;case 5:return b-a;case 6:return b/a;}}string link(string a,string b,int p) {string st=a;switch(p){case 1:st+=("+"+b);break;case 2:st+=("-"+b);break;case 3:st+=("*"+b);break;case 4:st+=("/"+b);break;case 5:st=b+"-"+st;break;case 6:st=b+"/"+st;break;}st="("+st+")";return st;}void putout1(string c[],int p[]) { string st;st=link(c[1],c[2],p[1]);st=link(st,c[3],p[2]);st=link(st,c[4],p[3]);st=st.erase(0,1);st=st.erase(st.length()-1,1); number++;sss[number]=st;}void putout2(string c[],int p[]) { string st1,st2,st;st1=link(c[1],c[2],p[1]);st2=link(c[3],c[4],p[3]);st=link(st1,st2,p[2]);st=st.erase(0,1);st=st.erase(st.length()-1,1);number++;sss[number]=st;}void suan(float a[],string c[]) {int p[4];int i;float sum,sum1,sum2;for(p[1]=1;p[1]<=6;p[1]++)for(p[2]=1;p[2]<=6;p[2]++)for(p[3]=1;p[3]<=6;p[3]++){sum=cal(a[1],a[2],p[1]);sum=cal(sum,a[3],p[2]);sum=cal(sum,a[4],p[3]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout1(c,p); sum1=cal(a[1],a[2],p[1]);sum2=cal(a[3],a[4],p[3]);sum=cal(sum1,sum2,p[2]);if((sum-24>=0&&sum-24<1e-5)||(sum-24<=0&&sum-24>-1e-5)) putout2(c,p); }}void disorder(float a[],string c[]){float b[5];string d[5];int i,j,k,l;for(i=1;i<=4;i++)for(j=1;j<=4;j++){if(j==i)continue;for(k=1;k<=4;k++){if(k==i||k==j)continue;for(l=1;l<=4;l++){if(l==i||l==j||l==k)continue;b[1]=a[i];b[2]=a[j];b[3]=a[k];b[4]=a[l]; d[1]=c[i];d[2]=c[j];d[3]=c[k];d[4]=c[l]; suan(b,d);}}}}int main(){cout<<"请输入四个数字";float a[5];int i,j;string c[5];for(i=1;i<=4;i++){cin>>a[i];if(a[i]==10)c[i]="10" ;else c[i]=int(a[i])+'0';}disorder(a,c);int v=1,u=0;for(i=1;i<=number;i++){v=1;for(j=1;j<i;j++)if(sss[i]==sss[j])v=0;if(v==1){cout<<sss[i]<<endl;u=1;}}if(u==0)cout<<"无解"<<endl;system("pause");return 0;}三,运行结果显示四,调试和运行程序过程中产生的问题及采取的措施:。

c语言课程设计24点

c语言课程设计24点
20.教学时间:共计16课时,每课时45分钟,安排在每周的两次课文中进行;
21.教学地点:计算机实验室,确保学生有足够的实践机会;
22.教学安排还应考虑学生的实际情况和需要,如学生的作息时间、兴趣爱好等,尽量安排在学生较为轻松的时间段进行授课,并提供与学生兴趣相关的编程实例。
七、差异化教学
根据学生的不同学习风格、兴趣和能力水平,本节课采取以下差异化教学措施:
6.学生分组讨论,合作编写24点游戏的程序;
7.学生展示自己的程序,互相评价,教师进行点评和总结。
三、教学方法
本节课采用讲授法、讨论法、案例分析法和实验法等多种教学方法,以激发学生的学习兴趣和主动性。
8.讲授法:教师讲解C语言的基本语法、编程技巧和24点游戏的实现方法;
9.讨论法:学生分组讨论,合作编写程序,互相交流思路和经验;
十、跨学科整合
本节课将考虑不同学科之间的关联性和整合性,促进跨学科知识的交叉应用和学科素养的综合发展:
32.结合数学学科:通过编写程序解决数学问题,如计算几何图形的面积、体积等,培养学生运用编程解决数学问题的能力;
33.结合物理学:利用编程模拟物理现象,如模拟物体运动、碰撞等,让学生了解编程在物理学领域的应用。
十一、社会实践和应用
为了培养学生的创新能力和实践能力,本节课将设计以下社会实践和应用相关的教学活动:
34.参观企业:学生参观软件开发企业,了解企比赛,如“蓝桥杯”等,提高学生的编程能力和竞争意识;
36.实际项目参与:为学生提供参与实际项目的机会,如合作开发一个小型的软件系统,让学生在实践中提升编程能力。
23.学习风格:提供多种教学资源,如教材、参考书、多媒体资料等,满足不同学习风格的学生;
24.兴趣:结合学生的兴趣爱好,选择有趣的编程实例进行教学,提高学生的学习积极性;

c课程设计24点

c课程设计24点

c 课程设计24点一、教学目标本课程的教学目标是让学生掌握24点游戏的规则和解题技巧,培养学生的逻辑思维能力和运算能力。

具体目标如下:1.知识目标:使学生了解24点游戏的历史背景和基本规则,掌握加、减、乘、除四则运算。

2.技能目标:培养学生独立完成24点游戏的能力,提高学生的运算速度和准确性。

3.情感态度价值观目标:培养学生团队合作精神,增强学生面对挑战的信心和勇气。

二、教学内容本课程的教学内容主要包括24点游戏的规则讲解、解题技巧训练和游戏实践。

具体安排如下:1.第一课时:介绍24点游戏的基本规则和玩法。

2.第二课时:讲解24点游戏的解题技巧,如数字拆分、运算顺序等。

3.第三课时:进行24点游戏实践,学生分组进行比赛,教师点评并指导。

4.第四课时:总结24点游戏的学习心得,学生分享自己的解题经验。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用以下教学方法:1.讲授法:教师讲解24点游戏的规则和解题技巧。

2.讨论法:学生分组讨论解题策略,分享心得体会。

3.案例分析法:教师出示典型病例,学生分析并解答。

4.实验法:学生动手实践,进行24点游戏比赛。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《24点游戏教程》2.参考书:《数学思维训练教程》3.多媒体资料:24点游戏教学视频、动画演示等。

4.实验设备:计算器、纸张、笔等。

五、教学评估本课程的评估方式包括以下几个方面:1.平时表现:观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和积极性。

2.作业:布置适量的作业,评估学生的掌握程度和运算能力。

3.考试:进行期中和期末考试,全面测试学生的知识水平和解题技巧。

4.比赛:24点游戏比赛,评估学生在实际操作中的表现。

评估方式应客观、公正,能够全面反映学生的学习成果。

教师应及时给予反馈,鼓励学生持续进步。

六、教学安排本课程的教学安排如下:1.课时:共8课时,每周2课时。

c语言课程设计24点

课程设计报告题目 24点游戏课程名称软件项目实践(二)院部名称龙蟠学院专业计算机科学与技术班级学生姓名学号课程设计地点校内实验室课程设计学时 2周(40学时)指导教师沈奇金陵科技学院教务处制成绩课程设计报告目录一、实验目的和要求 (2)二、实验仪器和设备 (2)三、实验过程 (2)四、实验结果与分析 (6)五、实验心得 (10)一、实验目的和要求1.实验目的1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4)训练用系统的观点和软件开发一般规范进行软件开发。

5)培养快速学习新的知识,并在项目中使用的能力。

2.实验要求设计并实现24点游戏,满足以下基本要求:①运行系统后,用户登录,输入用户名后,可以进入游戏,或查看英雄榜。

②玩家开始游戏后,系统随机产生四个1-13的数,分别代表13张牌。

提示玩家输入算式。

判断玩家输入的表达式是否合法,其中算式中的四个数字只能是程序所给的四个数字。

当玩家正确输入算式后,运用“用堆栈求解表达式”的原理,求出结果并判断是否为24,得出用户是输是赢的结果。

③如果用户赢,计算其所用时间(从输入算式开始计算,直至输入算式结束),并与英雄榜中成绩进行比较。

可以进入英雄榜的,则需更新英雄榜。

英雄榜只按成绩降序记录1-5名相关信息。

二、实验仪器和设备Microsoft WindowsXP / Windows 7Turbo C/Visual C++三、实验过程一.需求分析1.1 需求概述分析本系统共分为四个模块:普通用户登录模块,用户模块,游戏模块和更改用户模块以下是各个模块的功能简介。

(1)普通用户登录模块检测用户名是否存在,检查密码是否正确;(2)用户模块选择用户需要执行的操作(进入游戏、查看英雄榜、切换用户、退出)。

(3)游戏模块用户进行游戏,计算用户游戏时间,更新英雄榜。

C语言实现24点问题详解

C语⾔实现24点问题详解⽬录题⽬描述问题分析代码实现运⾏结果题⽬描述在屏幕上输⼊1〜10范围内的4个整数(可以有重复),对它们进⾏加、减、乘、除四则运算后(可以任意的加括号限定计算的优先级),寻找计算结果等于24的表达式。

例如输⼊4个整数4、5、6、7,可得到表达式:4*((5-6)+7)=24。

这只是⼀个解,要求输出全部的解。

要求表达式中数字的顺序不能改变。

问题分析这道题理解起来很简单,就是拼凑加减乘除,使4个数的运算结果等于24。

由于四则运算中,乘除的优先级⾼于加减,所以必须“加括号”来限定4个数之间运算优先级。

例如:A+B*C-D 这个式⼦,通过增加括号,可以产⽣多种结果,⽐如 (A+B)*(C-D) 和 A+(B*C-D)。

那么总共有⼏种加括号的⽅法呢,该如何分类呢?⼀开始我在想是不是能按照括号对数进⾏分类,但后来发现,要想将4个数字的运算优先级细分,必须使⽤两对括号。

可以这么理解:我们的⽬的是将4个数的运算转换成两个“数”的运算(这⾥的“数”包括括号表达式),⽽每两个数运算,就能得出⼀个结果,即每对括号可以减少⼀个要计算的数字(如(A+B)*(C+D)中,A和B运算,使式⼦变成了3个数,C接着和D运算,使式⼦剩下两个数字)。

4-2=2即为需要的括号数。

下⾯列举所有可能的括号表达式:(#表⽰四则运算符)1. ((A#B)#C)#D2. (A#(B#C))#D3. A#((B#C)#D)4. A#(B#(C#D))5. (A#B)#(C#D)具体思路:上⾯5种括号表达式都可以单独写成函数,函数内部按照括号的优先级+从左往右的顺序进⾏运算,最后返回计算结果。

每个表达式中有3个'#'号,它们是四则运算符(+、-、*、/),可以定义⼀个全局字符数组,存放4这四个字符。

char my_oprator[4] = {'+', '-', '*', '/'};主函数使⽤穷举法,对表达式的每个#符号进⾏遍历(4种运算符),使⽤3层 for循环实现(层数对应3个#符号,每层循环4次,对应4种运算符),最后将符合条件的表达式输出。

C语言程序设计计算24游戏实验报告

C语言程序设计计算24游戏实验报告学院、系: 吉林大学珠海学院计算机科学与技术系专业名称: 软件工程课程设计科目 C语言程序课程设计所在班级: 10班学生学号: 04121010 学生姓名: 赵学文指导教师: 郭晓燕完成时间: 2013年3月-5月计算24游戏一、设计任务与目标题目计算24游戏,最终要求是输入四个一位数,通过加减乘除,允许加入括号,计算出24,显示计算过程,并提示成功信息。

可以首先完成输入三个一位数,只通过加减,计算出12;再完成通过加减乘除,再完成可以加入括号。

刚看到题目的时候,手上并无其他资料,纯粹觉得是一个有趣的数学问题,需要自己全动手设计才能到达目标,而目标是在输入四个数之后,先进行全排列,然后进行全运算,从而最终得到结果以输出。

本次上机实践所使用的平台和相关软件。

平台:Windows XP or Windows7相关软件:VC6.0。

二、方案设计与论证关于这个计算24游戏的设计,首先我将题目看成两部分,一部分为运算数,一部分为运算符。

首先由于有四个数,则只有三个运算符,三个运算符中在加减乘除中选取。

由于涉及了括号,个人认为用穷举法才能全面地进行运算,我们可以将运算符和括号这部分归为主运算部分,在这部分中,运算数的位置固定,但是运算符和括号的位置会改变,而且程序主要就是在这部分运算,直接将数值引入,然后计算判断是否等于24,若等于24,则输出数值和这些运算符、括号的位置构成的运算式;然而,这是不够全面的,因为还要考虑到运算数的排列位置,于是有了第二部分,运算数的位置全排列,同样是采用穷举法,将运算数全排列,在每个排列后面调用主运算的方法,从而达到全面不遗漏地计算。

在MAIN函数中,我们仅需要记录输入的4个数字,然后将数值用在全排列函数中即可。

整个程序的设计只需定义一个主函数,并不涉及相关的函数调用。

看起来很繁琐,但在运用上很简单,只要将各种情况运用数学思维列举出来,能简明扼要地表现出来。

C语言版24点游戏

#include<stdio.h>#include<malloc.h>#include<stdlib.h>#include<time.h>#include<windows.h>struct s_node{int date;struct s_node *next;};typedef struct s_node s_list;typedef s_list *link;link OPER=NULL;link OPND=NULL;char m;link creat(link stack) //创建空栈的函数{stack=(link)malloc(sizeof(s_list));if (!stack){printf("\nERROR");return NULL;}return stack;}link push(link stack,int value) //添加新的元素value为stack的栈顶元素{link newnode;newnode=(link)malloc(sizeof(s_list));if (!newnode){printf("\nERROR");return NULL;}newnode->date=value;newnode->next=stack;stack=newnode;return stack;}link pop(link stack) //栈顶出栈的函数,m表示出栈的栈顶元素{link top;if (stack!=NULL){top=stack;stack=stack->next;m=top->date;free(top);return stack;}elsem=-1;}int is_oper(char oper) //判断是否为算符的函数{switch (oper){case'+':case'-':case'*':case'/':case'(':case')':case'#':return 1;default:return 0;}}int compare(char q1,char q2) //比较算符优先程度的函数{if (q1=='+') //‘+’的比较{switch (q2){case '+':return 1;case '-':return 1;return 0;case '/':return 0;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='-') //‘-’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='*') //‘*’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;return 0;case ')':return 1;case '#':return 1;}}else if (q1=='/') //‘/’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;case '(':return 0;case ')':return 1;case '#':return 1;}}else if (q1=='(') //‘(’的比较{switch (q2){case '+':return 0;case '-':return 0;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return 2;return -1;}}else if (q1==')') //‘)’的比较{switch (q2){case '+':return 1;case '-':return 1;case '*':return 1;case '/':return 1;case '(':return -1;case ')':return 1;case '#':return 1;}}else if (q1=='#') //‘#’的比较{switch (q2){case '+':return 0;case '-':return 0;case '*':return 0;case '/':return 0;case '(':return 0;case ')':return -1;case '#':return 2;}}}int operate(int p1,int p2,char q) //二元运算的函数,q代表运算符,p1为运算符的左边数值,p2为运算符的右边数值{int p;if (q=='+'){p=p1+p2;return p;}else if (q=='-'){p=p1-p2;return p;}else if (q=='*'){p=p1*p2;return p;}else if (q=='/'){p=p1/p2;return p;}}int main(){char c,e,u;int n,a,b,t,v;int i=0;int f1,f2,f3,f4,flag=0;int h[5]={0};OPER=creat(OPER);OPND=creat(OPND);while (1){OPER->date=0;OPND->date=0;printf("------------------------------------------------------------------------------\n\n\n");printf(" 24点游戏系统\n\n");printf(" 您得到的四个随机数\n\n");srand( (unsigned)time( NULL ) );f1=rand()%13+1;f2=rand()%13+1;f3=rand()%13+1;f4=rand()%13+1;printf(" 【%d】【%d】【%d】【%d】\n\n",f1,f2,f3,f4);printf(" 请输入表达式'#'号结束,无法解答请输入? 直接结束请输入* \n\n");printf("------------------------------------------------------------------------------\n\n\n");printf(" ");c=getchar();if (c=='?'){system("cls");getchar();continue;}else if (c=='*')break;while (OPER->date!='#'){if (flag==1)break;if (is_oper(c)){if (OPER->date==0) //判断OPER是否为空{OPER=push(OPER,c); //若为空则为第一次输入,进栈.c=getchar();continue;}else{n=compare(OPER->date,c);switch (n){case 0:{OPER=push(OPER,c);c=getchar();break;}case 1:{OPER=pop(OPER);e=m;OPND=pop(OPND);if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}b=m;OPND=pop(OPND);if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}a=m;t=operate(a,b,e);h[i]=t;i++;OPND=push(OPND,t);break;}case 2:{OPER=pop(OPER);c=getchar();break;}}}}else{OPND=push(OPND,c-48);c=getchar();if (is_oper(c))continue;else{OPND=pop(OPND);v=c-'0';t=m*10+v;if((t!=f1)&&(t!=f2)&&(t!=f3)&&(t!=f4)&&(t!=h[0])&&(t!=h[1])&&(t!=h[2])&&(t!=h[3])&&(t!=h[4])& &(t!=h[5])){printf("\n\n-----------------------------没有使用给出的数字!-------------------------------\n\n");flag=1;}OPND=push(OPND,t);h[i]=t;i++;c=getchar();continue;}}}if (OPND->date==24&&flag==0){printf("----------------------------------------------------------------------------\n\n\n");printf(" **【Congratulation!】** \n\n\n");printf("----------------------------------------------------------------------------\n\n\n");}else if (flag==0){printf("----------------------------------------------------------------------------\n\n\n");printf(" **【Incorrect!】** \n\n\n");printf("----------------------------------------------------------------------------\n\n\n");}system("pause");printf(" 是否继续游戏?y:继续.n:结束\n\n\n");flag=0;u=getchar();if (u=='n'){break;}else{c=getchar();system("cls");continue;}}printf("\n\n\n-----------------------------24点游戏系统-------------------------------\n\n\n");printf("\n\n\n **谢谢使用!**\n");system("pause");return 0;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void second()
{ int n[4],i; char c[4][10]; int exam(char *p); void sign(int a,int b,int c,int d); double recog(char *p); clrscr(); printf("Input 0 to leave.\n\n"); for(;;) { for(i=0;i<4;i++) { scanf("%s",&c[i]); 意思就是读取到的数据是 CHAR 型,存放到 c_c 变量中
strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; } if(s1/2==0&&s2/2==1&&s3/2==0) { strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,"("); strcat(p,change(i[n3]));
再执行下面的语句
switch(get) { case '1': first(); break; case '2': second();break; case '3': close=third(); break; default: printf("Please input 1, 2 or 3!\n"); getch(); } if(close) break; } }
strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; } } if(flag) break; } if(flag) break; } if(flag) break; }
正 1<2 负 1=2 零 strlwr 转换小写字母
break; else { strcpy(ch1,ch); ch 拷贝到 ch1 中 if(!check(ch)&&!exam2(ch,n[0],n[1],n[2],n[3])&&fabs (figure(ch1)-24)<=0.000001) 求浮点数 x 的绝对值 { printf("\nGood job!\n"); getch(); } else { printf("\nWrong!\n\nAnswer: "); sign(n[0],n[1],n[2],n[3]); getch(); } } } }
strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,")"); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; } if((s1/2==0||s2/2==0)&&s3/2==1) { strcat(p,"("); strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3]));
如果去掉,c_c!='#'永远不会成立当然是死循环
if(exam(c[i])) { printf("GRAMMER ERROR!\n"); i--; continue; } n[i]=(int)recog(c[i]); if(n[i]==0)
break; } if(n[0]&&n[1]&&n[2]&&n[3]) sign(n[0],n[1],n[2],n[3]); else break; } }
strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,")"); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; } if(s2/2==0&&s1/2==1) { strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2]));
#include "stdio.h" #include "math.h" #include "time.h"
void main() { void first(); void second(); int third(); time_t t; /设置机器时间 int close=0; char get; clrscr();/清除屏幕缓冲区及液晶显示缓冲区
strcat(p,change(i[n1])); strcat(p,s[s1]); strcat(p,"("); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcat(p,")"); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; } if(s1/2==0&&s2/2==1) { strcat(p,"("); strcat(p,change(i[n1]));
if(flag) break; } if(flag) break; } if(flag) break; } if(flag==0) printf("No answer!\n"); }
char *change(int x) { static char a[64]; char *c; c=a+63; *c='\0'; c--; for(;;c--) {
int sign,kuoh=0,flag2=0; double result,chu; add(p); for(sign=0;*c!='\0';c++) { if(*c=='+'||*c=='-'||*c=='*'||*c=='/'||*c=='('||*c= =')') { sign++; break; } } if(sign==0) return(recog(p)); else { c=p; for(;*c!='\0';c++) { if(*c=='(') kuoh++; if(*c==')')
void first() { int jdgsgn(int a,int b,int c,int d); 1)统计出求不出 24 的所
有组合数目
(2)将每一种组合的计算结果写入文件 result.txt,每两个组合占一行。
附上 C 语言代码。
int n[4],i; char ch[100],ch1[100]; int check(char *p); int exam2(char *p,int a,int b,int c,int d); void sign(int a,int b,int c,int d); double figure(char *p); void draw(int *p); for(;;) { for(i=0;i<4;i++) { n[i]=rand()%13+1; N 的值就是一个 0~10 的随机数,如果要产生 1~10,则是这样 int
N=1+random()%10
} draw(n); if(!jdgsgn(n[0],n[1],n[2],n[3])) { printf("No answer!"); getch(); continue; } gets(ch); 获取 ch
if(!strcmp(strlwr(ch),"quit")) strcmp()比较字符串大小 1>2
{ for(s2=0;s2<4;s2++) { for(s3=0;s3<4;Байду номын сангаас3++) { strcat(p,change(i[n1])); 字符串首尾连接 strcat(p,s[s1]); strcat(p,change(i[n2])); strcat(p,s[s2]); strcat(p,change(i[n3])); strcat(p,s[s3]); strcat(p,change(i[n4])); strcpy(p1,p); if(fabs(figure(p1)-24)<=0.000001) { printf("%s\n",p); flag++; break; } *p='\0'; if(s1/2==1&&(s2/2==0||s3/2==0)) {
相关文档
最新文档