24点游戏程序(C++实现)
C语言写的24点游戏
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点 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点的算法程序
//#include "stdafx.h"# include <stdio.h>#include "conio.h"#include "stdlib.h"#include "time.h"#include "math.h"#include "string.h"#include "iostream.h"/*从一副扑克牌中,任取4张。
2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按1 计算要求通过加减乘除四则运算得到数字24。
本程序可以随机抽取纸牌,并用试探法求解。
*/int s[21][4]={-1};int sum=0;void GivePuzzle(char* buf){char card[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};for(int i=0; i<4; i++){buf[i] = card[rand() % 13];}}void SetPuzzle(char *buf){scanf("%c %c %c %c",&buf[0],&buf[1],&buf[2],&buf[3]);}void shuffle(char * buf){for(int i=0; i<5; i++){int k = rand() % 4;char t = buf[k];buf[k] = buf[0];buf[0] = t;}}int GetCardValue(int c){if(c=='T') return 10;if(c>='0' && c<='9') return c - '0';return 1;}char GetOper(int n){switch(n){case 0:return '+';case 1:return '-';case 2:return '*';case 3:return '/';}return ' ';}double MyCalcu(double op1, double op2, int oper){switch(oper){case 0:return op1 + op2;case 1:return op1 - op2;case 2:return op1 * op2;case 3:if(fabs(op2)>0.0001)return op1 / op2;elsereturn 100000;}return 0;}void MakeAnswer(char* answer, int type, char* question, int* oper){char p[4][3];for(int i=0; i<4; i++){if( question[i] == 'T' )strcpy(p[i], "10");elsesprintf(p[i], "%c", question[i]);}switch(type){case 0:sprintf(answer, "%s %c (%s %c (%s %c %s))",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 1:sprintf(answer, "%s %c ((%s %c %s) %c %s)",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 2:sprintf(answer, "(%s %c %s) %c (%s %c %s)",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 3:sprintf(answer, "((%s %c %s) %c %s) %c %s",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;case 4:sprintf(answer, "(%s %c (%s %c %s)) %c %s",p[0], GetOper(oper[0]), p[1], GetOper(oper[1]), p[2], GetOper(oper[2]), p[3]);break;}}bool TestResolve(char* question, int* oper, char* answer){// 等待考生完成int type[5]={0,1,2,3,4};//计算类型double p[4];double sum=0;for(int i=0; i<4; i++) //循环取得点数{p[i]=GetCardValue(int(question[i]));}for(i=0;i<5;i++){MakeAnswer(answer,type[i],question,oper); //获取可能的答案//printf("Doing:%s\n", answer);switch(type[i]){case 0:sum=MyCalcu(p[0],MyCalcu( p[1],MyCalcu(p[2], p[3], oper[2]),oper[1]),oper[0]); //A*(B*(c*D))break;case 1:sum=MyCalcu(p[0],MyCalcu(MyCalcu(p[1], p[2], oper[1]),p[3],oper[2]),oper[0]); //A*((B*C)*D)break;case 2:sum=MyCalcu(MyCalcu(p[0], p[1], oper[0]),MyCalcu(p[2], p[3], oper[2]),oper[1]); // (A*B)*(C*D)break;case 3:sum=MyCalcu(MyCalcu(MyCalcu(p[0], p[1], oper[0]),p[2],oper[1]),p[3],oper[2]); //((A*B)*C)*Dbreak;case 4:sum=MyCalcu(MyCalcu(p[0],MyCalcu(p[1], p[2], oper[1]),oper[0]),p[3],oper[2]); //(A*(B*C))*Dbreak;}if(sum==24) return true;}return false;}bool permNum(int* oper, int i,int N,char*question,char*answer) //递归实现重新排列数字、运算符{int j, k;char tmp;if(i < N){for(j = i; j < N; j++){tmp = question[j];for(k = j; k > i; k--)question[k] = question[k-1];question[i] = tmp;if( permNum(oper, i+1,N,question,answer)) return true;for(k = i; k < j; k++)question[k] = question[k+1];question[j] = tmp;}}else{//int type;if( TestResolve(question, oper, answer) ){//getch();return true;}}return false;}bool perm(int* num, int i,int N,char*question,char*answer) //递归实现重新排列数字、运算符{int j, k, tmp;if(i < N){for(j = i; j < N; j++){tmp = num[j];for(k = j; k > i; k--)num[k] = num[k-1];num[i] = tmp;if(perm(num, i+1,N,question,answer)) return true;for(k = i; k < j; k++)num[k] = num[k+1];num[j] = tmp;}}else{if (permNum(num,0,4,question,answer)) return true;}return false;}int ifcan(int str[4]){for(int i=0;i<sum;i++){if(s[i][0]==str[0]&&s[i][1]==str[1]&&s[i][2]==str[2]) {return 1;}}s[i-1][0]=str[0];s[i-1][1]=str[1];s[i-1][2]=str[2];sum++;return 0;}bool Chooseoper(int *oper,char*question,char*answer) //递归从四个运算符获取三个运算符{int n=3,m=12,i,j;int oper1[12];for (i=0;i<n;i++){oper1[i]=i;}for (i=0;i<n;i++){oper[i]=oper1[i]/3;}if (!ifcan(oper)){if(perm(oper,0,n,question,answer)) return true;}j=n-1;while (1){if (oper1[n-1]==m-1)j--;else j=n-1;oper1[j]++;for (i=j+1;i<n;i++)oper1[i]=oper1[i-1]+1;for (i=0;i<n;i++){oper[i]=oper1[i]/3;}if (!ifcan(oper)){if(perm(oper,0,n,question,answer)) return true;}if (oper1[0]>=m-n)break;}return false;}bool Try(int *oper,char*question,char* answer){if(Chooseoper(oper,question,answer)) return true;return false;}int main(int argc, char* argv[]){// 初始化随机种子srand( (unsigned)time( NULL ) );char buf1[4]; // 题目char buf2[30]; // 解答printf("***************************\n");printf("计算24\n");printf("A J Q K 均按1计算,其它按牌点计算,T 代表10\n");printf("目标是:通过四则运算组合出结果:24\n");printf("Mode 1 of Give Puzzle: Rand to give puzzle\n");printf("Else Type of Give Puzzle:Give by Youself \n");printf("***************************\n\n");int mode=1; //默认为1printf("Mode:");scanf("%d",&mode);getchar();printf("***************************\n");for(;;){if (mode==1){GivePuzzle(buf1); // 出题模式1}else{printf("Num:");SetPuzzle(buf1); //出题模式2}getchar();printf("题目:");for(int j=0; j<4; j++){if( buf1[j] == 'T' )printf("10 ");elseprintf("%c ", buf1[j]);}printf("\n按任意键参考答案...\n");getch();int type[4];if( Try(type, buf1,buf2) ) //1全局搜索解法,精确解printf("参考:%s\n", buf2);elseprintf("无解...\n");for (int i=0;i<sum;i++){for(int j=0;j<3;j++)s[i][j]=-1;}sum=0;printf("按任意键出下一题目,x 键退出...\n");if( getch() == 'x' ) break;}return 0;}。
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点小游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月 4 日课程设计报告模块内容要求:(1)系统需求分析:基本简单小游戏通过c++实现(2)总体设计:1. 系统自动给出4个数字(1-k,其中J,Q,K按一点算)2. 由玩家自主计算,当给出数字不能算出24点时,按任意键继续;3. 由玩家自行决定是否继续游戏;4. 在任何情况下都可以按Esc键结束游戏;(3)系统调试:程序实现代码:1.主函数:2.#include "stdio.h"3.#include "conio.h"4.#include "stdlib.h"5.#include "time.h"6.#include "math.h"7.#include "string.h"8./*9.从一副扑克牌中,任取4张。
10.2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按1 计算11.要求通过加减乘除四则运算得到数字24。
12.本程序可以随机抽取纸牌,并用试探法求解。
13.*/14.v oid GivePuzzle(char* buf)15.{16.int i;17.char card[] = {'A','2','3','4','5','6','7','8','9','T','J','Q','K'};18.for(i=0;i<4;i++)19.{20.buf[i]=card[rand()%13];21.}22.}23.v oid shuffle(char * buf)24.{25.int i,k;26.char t;27.for(i=0; i<5; i++)28.{29.k = rand() % 4;30.t = buf[k];31.buf[k] = buf[0];32.buf[0] = t;33.}34.}35.i nt GetCardValue(int c)36.{37.if(c=='T') return 10;38.if(c>='0' && c<='9') return c - '0';39.return 1;40.}41.c har GetOper(int n)42.{43.switch(n)44.{45.case 0:46.return '+';。
自己编写的算24点c法度模范代码(解答无重复)[整理版]
自己编写的算24点c++程序代码(解答无重复)<删除本句话,并将文件后缀改为.cpp>#include <iostream>using namespace std;const double ANS=24;double sourse[4], suan[4];void four(){ if (suan[0]+suan[1]+suan[2]+suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"+"<<suan[2]<<"+"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]*suan[2]*suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"*"<<suan[2]<<"*"<<suan[3]<<"="<<A NS<<endl;}void three(){ if (suan[0]+suan[1]+suan[2]-suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"+"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]*suan[2]+suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"*"<<suan[2]<<"+"<<suan[3]<<"="<<A NS<<endl;if (suan[3]-suan[0]-suan[1]-suan[2]==ANS) cout<<suan[3]<<"-"<<suan[0]<<"-"<<suan[1]<<"-"<<suan[2]<<"="<<A NS<<endl;if (suan[0]*suan[1]*suan[2]-suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"*"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[3]-suan[0]*suan[1]*suan[2]==ANS) cout<<suan[3]<<"-"<<suan[0]<<"*"<<suan[1]<<"*"<<suan[2]<<"="<<A NS<<endl;if (suan[3]/suan[0]/suan[1]/suan[2]==ANS) cout<<suan[3]<<"/"<<suan[0]<<"/"<<suan[1]<<"/"<<suan[2]<<"="<<A NS<<endl;if (suan[0]*suan[1]*suan[2]/suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"*"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;if ((suan[0]+suan[1]+suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"+"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]+suan[1]+suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"+"<<suan[2]<<")/"<<suan[3]<< "="<<ANS<<endl;if (suan[3]/(suan[0]+suan[1]+suan[2])==ANS) cout<<suan[3]<<"/("<<suan[0]<<"+"<<suan[1]<<"+"<<suan[2]<<")="< <ANS<<endl;}void two(){ if (suan[2]-suan[0]*suan[1]-suan[3]==ANS) cout<<suan[2]<<"-"<<suan[0]<<"*"<<suan[1]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[2]/suan[3]+suan[0]+suan[1]==ANS) cout<<suan[2]<<"/"<<suan[3]<<"+"<<suan[0]<<"+"<<suan[1]<<"="<<A NS<<endl;if (suan[2]/suan[0]/suan[1]+suan[3]==ANS) cout<<suan[2]<<"/"<<suan[0]<<"/"<<suan[1]<<"+"<<suan[3]<<"="<<A NS<<endl;if (suan[2]/suan[3]-suan[0]-suan[1]==ANS) cout<<suan[2]<<"/"<<suan[3]<<"-"<<suan[0]<<"-"<<suan[1]<<"="<<ANS<<endl;if (suan[2]/suan[0]/suan[1]-suan[3]==ANS) cout<<suan[2]<<"/"<<suan[0]<<"/"<<suan[1]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[2]-suan[3]/suan[0]/suan[1]==ANS) cout<<suan[2]<<"-"<<suan[3]<<"/"<<suan[0]<<"/"<<suan[1]<<"="<<A NS<<endl;if (suan[2]+suan[0]*suan[1]-suan[3]==ANS) cout<<suan[2]<<"+"<<suan[0]<<"*"<<suan[1]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[0]+suan[1]-suan[2]/suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"-"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]-suan[2]/suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"-"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;if (suan[2]/suan[3]-suan[0]*suan[1]==ANS) cout<<suan[2]<<"/"<<suan[3]<<"-"<<suan[0]<<"*"<<suan[1]<<"="<<A NS<<endl;if (suan[0]*suan[1]/suan[2]-suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"/"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[2]-suan[0]*suan[1]/suan[3]==ANS) cout<<suan[2]<<"-"<<suan[0]<<"*"<<suan[1]<<"/"<<suan[3]<<"="<<A NS<<endl;if ((suan[0]+suan[1])/suan[2]-suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[2]<<"-"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]-suan[3])/suan[0]/suan[1]==ANS) cout<<"("<<suan[2]<<"-"<<suan[3]<<")/"<<suan[0]<<"/"<<suan[1]<< "="<<ANS<<endl;if (suan[2]+(suan[0]+suan[1])/suan[3]==ANS) cout<<suan[2]<<"+("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[2]-(suan[0]+suan[1])*suan[3]==ANS) cout<<suan[2]<<"-("<<suan[0]<<"+"<<suan[1]<<")*"<<suan[3]<<"="< <ANS<<endl;if (suan[2]-(suan[0]+suan[1])/suan[3]==ANS) cout<<suan[2]<<"-("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[2]*(suan[0]+suan[1])+suan[3]==ANS) cout<<suan[2]<<"*("<<suan[0]<<"+"<<suan[1]<<")+"<<suan[3]<<"="< <ANS<<endl;if (suan[2]/(suan[0]+suan[1])+suan[3]==ANS) cout<<suan[2]<<"/("<<suan[0]<<"+"<<suan[1]<<")+"<<suan[3]<<"="< <ANS<<endl;if (suan[2]*(suan[0]+suan[1])-suan[3]==ANS) cout<<suan[2]<<"*("<<suan[0]<<"+"<<suan[1]<<")-"<<suan[3]<<"="< <ANS<<endl;if (suan[2]/(suan[0]+suan[1])-suan[3]==ANS) cout<<suan[2]<<"/("<<suan[0]<<"+"<<suan[1]<<")-"<<suan[3]<<"="< <ANS<<endl;if (suan[2]*(suan[0]+suan[1])/suan[3]==ANS) cout<<suan[2]<<"*("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[2]/(suan[0]+suan[1])/suan[3]==ANS) cout<<suan[2]<<"/("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[0]/(suan[2]-suan[3])*suan[1]==ANS) cout<<suan[0]<<"/("<<suan[2]<<"-"<<suan[3]<<")*"<<suan[1]<<"="< <ANS<<endl;if (suan[0]*(suan[2]-suan[3])*suan[1]==ANS) cout<<suan[0]<<"*("<<suan[2]<<"-"<<suan[3]<<")*"<<suan[1]<<"="< <ANS<<endl;if ((suan[0]+suan[1]-suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"-"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]-suan[0]-suan[1])*suan[3]==ANS) cout<<"("<<suan[2]<<"-"<<suan[0]<<"-"<<suan[1]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]+suan[0]*suan[1])*suan[3]==ANS) cout<<"("<<suan[2]<<"+"<<suan[0]<<"*"<<suan[1]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]-suan[0]*suan[1])*suan[3]==ANS) cout<<"("<<suan[2]<<"-"<<suan[0]<<"*"<<suan[1]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]*suan[1]-suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"*"<<suan[1]<<"-"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]+suan[1]-suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]-suan[0]-suan[1])/suan[3]==ANS) cout<<"("<<suan[2]<<"-"<<suan[0]<<"-"<<suan[1]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]+suan[0]*suan[1])/suan[3]==ANS) cout<<"("<<suan[2]<<"+"<<suan[0]<<"*"<<suan[1]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[2]-suan[0]*suan[1])/suan[3]==ANS) cout<<"("<<suan[2]<<"-"<<suan[0]<<"*"<<suan[1]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]*suan[1]-suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"*"<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<<"="<<ANS<<endl;if (suan[2]/(suan[0]+suan[1]-suan[3])==ANS) cout<<suan[2]<<"/("<<suan[0]<<"+"<<suan[1]<<"-"<<suan[3]<<")="< <ANS<<endl;if (suan[2]/(suan[3]-suan[0]-suan[1])==ANS) cout<<suan[2]<<"/("<<suan[3]<<"-"<<suan[0]<<"-"<<suan[1]<<")="< <ANS<<endl;if (suan[2]/(suan[3]+suan[0]*suan[1])==ANS) cout<<suan[2]<<"/("<<suan[3]<<"+"<<suan[0]<<"*"<<suan[1]<<")="< <ANS<<endl;if (suan[2]/(suan[3]-suan[0]*suan[1])==ANS) cout<<suan[2]<<"/("<<suan[3]<<"-"<<suan[0]<<"*"<<suan[1]<<")="< <ANS<<endl;if (suan[2]/(suan[0]*suan[1]-suan[3])==ANS) cout<<suan[2]<<"/("<<suan[0]<<"*"<<suan[1]<<"-"<<suan[3]<<")="< <ANS<<endl;if ((suan[0]+suan[1])*(suan[2]-suan[3])==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")*("<<suan[2]<<"-"<<suan[3]< <")="<<ANS<<endl;if ((suan[0]+suan[1])/(suan[2]-suan[3])==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")/("<<suan[2]<<"-"<<suan[3]< <")="<<ANS<<endl;}void dou_two(){ if (suan[0]+suan[1]-suan[2]-suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"-"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]+suan[2]+suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"+"<<suan[2]<<"+"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]-suan[2]-suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"-"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]-suan[2]*suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"-"<<suan[2]<<"*"<<suan[3]<<"="<<A NS<<endl;if (suan[0]*suan[1]/suan[2]/suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"/"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;if (suan[0]+suan[1]-suan[2]*suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"-"<<suan[2]<<"*"<<suan[3]<<"="<<A NS<<endl;if ((suan[0]+suan[1])/suan[2]/suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")/"<<suan[2]<<"/"<<suan[3]<< "="<<ANS<<endl;if (suan[2]/(suan[0]+suan[1])*suan[3]==ANS) cout<<suan[2]<<"/("<<suan[0]<<"+"<<suan[1]<<")*"<<suan[3]<<"="< <ANS<<endl;if (suan[2]*(suan[0]+suan[1])*suan[3]==ANS) cout<<suan[2]<<"*("<<suan[0]<<"+"<<suan[1]<<")*"<<suan[3]<<"="< <ANS<<endl;if ((suan[0]+suan[1])/(suan[2]+suan[3])==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")/("<<suan[2]<<"+"<<suan[3]< <")="<<ANS<<endl;}void exp(){if (suan[0]/suan[1]+suan[2]/suan[3]==ANS) cout<<suan[0]<<"/"<<suan[1]<<"+"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;}void ext(){if ((suan[0]-suan[1])*(suan[2]-suan[3])==ANS) cout<<"("<<suan[0]<<"-"<<suan[1]<<")*("<<suan[2]<<"-"<<suan[3]< <")="<<ANS<<endl;}void ex2(){if ((suan[0]+suan[1])*(suan[2]+suan[3])==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<")*("<<suan[2]<<"+"<<suan[3]< <")="<<ANS<<endl;if (suan[0]*suan[1]+suan[2]*suan[3]==ANS) cout<<suan[0]<<"*"<<suan[1]<<"+"<<suan[2]<<"*"<<suan[3]<<"="<<A NS<<endl;}void one(){ if (suan[0]/suan[1]-suan[2]/suan[3]==ANS) cout<<suan[0]<<"/"<<suan[1]<<"-"<<suan[2]<<"/"<<suan[3]<<"="<<A NS<<endl;if (suan[0]+suan[1]/suan[2]-suan[3]==ANS) cout<<suan[0]<<"+"<<suan[1]<<"/"<<suan[2]<<"-"<<suan[3]<<"="<<A NS<<endl;if ((suan[0]-suan[1])/suan[2]-suan[3]==ANS) cout<<"("<<suan[0]<<"-"<<suan[1]<<")/"<<suan[2]<<"-"<<suan[3]<< "="<<ANS<<endl;if (suan[0]-suan[1]/suan[2]-suan[3]==ANS) cout<<suan[0]<<"-"<<suan[1]<<"/"<<suan[2]<<"-"<<suan[3]<<"="<<ANS<<endl;if (suan[0]+(suan[1]-suan[2])/suan[3]==ANS) cout<<suan[0]<<"+("<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[0]*(suan[1]-suan[2])+suan[3]==ANS) cout<<suan[0]<<"*("<<suan[1]<<"-"<<suan[2]<<")+"<<suan[3]<<"="< <ANS<<endl;if (suan[0]/(suan[1]-suan[2])+suan[3]==ANS) cout<<suan[0]<<"/("<<suan[1]<<"-"<<suan[2]<<")+"<<suan[3]<<"="< <ANS<<endl;if (suan[0]*(suan[1]-suan[2])-suan[3]==ANS) cout<<suan[0]<<"*("<<suan[1]<<"-"<<suan[2]<<")-"<<suan[3]<<"="< <ANS<<endl;if (suan[0]/(suan[1]-suan[2])-suan[3]==ANS) cout<<suan[0]<<"/("<<suan[1]<<"-"<<suan[2]<<")-"<<suan[3]<<"="< <ANS<<endl;if (suan[0]*(suan[1]-suan[2])/suan[3]==ANS) cout<<suan[0]<<"*("<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<<"="< <ANS<<endl;if (suan[0]/(suan[1]-suan[2])/suan[3]==ANS) cout<<suan[0]<<"/("<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<<"="< <ANS<<endl;if ((suan[0]+suan[1]/suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"/"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]-suan[1]/suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"-"<<suan[1]<<"/"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]/suan[1]-suan[2])*suan[3]==ANS) cout<<"("<<suan[0]<<"/"<<suan[1]<<"-"<<suan[2]<<")*"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]+suan[1]/suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"+"<<suan[1]<<"/"<<suan[2]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]-suan[1]/suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"-"<<suan[1]<<"/"<<suan[2]<<")/"<<suan[3]<< "="<<ANS<<endl;if ((suan[0]/suan[1]-suan[2])/suan[3]==ANS) cout<<"("<<suan[0]<<"/"<<suan[1]<<"-"<<suan[2]<<")/"<<suan[3]<< "="<<ANS<<endl;if (suan[0]/(suan[1]+suan[2]/suan[3])==ANS) cout<<suan[0]<<"/("<<suan[1]<<"+"<<suan[2]<<"/"<<suan[3]<<")="< <ANS<<endl;if (suan[0]/(suan[1]-suan[2]/suan[3])==ANS) cout<<suan[0]<<"/("<<suan[1]<<"-"<<suan[2]<<"/"<<suan[3]<<")="< <ANS<<endl;if (suan[0]/(suan[1]/suan[2]-suan[3])==ANS) cout<<suan[0]<<"/("<<suan[1]<<"/"<<suan[2]<<"-"<<suan[3]<<")="< <ANS<<endl;if ((suan[0]-suan[1])/(suan[2]-suan[3])==ANS &&(suan[0]-suan[1])*(suan[2]-suan[3])!=0) cout<<"("<<suan[0]<<"-"<<suan[1]<<")/("<<suan[2]<<"-"<<suan[3]< <")="<<ANS<<endl;}int main(){ int i=0, j=0, k=0;int count=0;int tong1; int tong2; int tong3; int butong1; int butong2;int bao1; int bao2; int bao3; int zi1; int zi2;bool flag=false;char ch='y';do{count=0;do {cout <<"请输入四个正整数:";cin >>sourse[0]>>sourse[1]>>sourse[2]>>sourse[3];} while (sourse[0]<1 || sourse[1]<1 || sourse[2]<1 || sourse[3]<1);for (i=0; i<3; i++)for (j=i+1; j<4; j++){ if (sourse[i]==sourse[j]){ count++;if (flag) count++;flag=true;}flag=false;}switch (count){ case 0:for (i=0; i<4; i++){suan[0]=sourse[i];for (j=0; j<4; j++)if (j!=i){suan[1]=sourse[j];for (k=0; k<4; k++)if (k!=i && k!=j){suan[2]=sourse[k];suan[3]=sourse[6-i-j-k]; one();}}}for (i=0; i<6; i++){bao1=i%4; bao2=(i+1+i/4)%4; zi1=(i+2+i/4)%4; zi2=6-bao1-bao2-zi1;suan[0]=sourse[bao1]; suan[1]=sourse[bao2]; suan[2]=sourse[zi1]; suan[3]=sourse[zi2];dou_two(); two();suan[2]=sourse[zi2]; suan[3]=sourse[zi1]; two();}for (i=0; i<3; i++){bao1=i; bao2=(i+1)%3; zi1=(i+2)%3;zi2=6-bao1-bao2-zi1;suan[0]=sourse[bao1]; suan[1]=sourse[bao2]; suan[2]=sourse[zi1]; suan[3]=sourse[zi2];ext(); exp(); ex2();suan[2]=sourse[zi2]; suan[3]=sourse[zi1]; ext(); exp();suan[0]=sourse[bao2]; suan[1]=sourse[bao1]; exp();suan[2]=sourse[zi1]; suan[3]=sourse[zi2];exp();}for (i=0; i<4; i++){bao1=i; bao2=(i+1)%4; bao3=(i+2)%4; zi1=(i+3)%4;suan[0]=sourse[bao1]; suan[1]=sourse[bao2]; suan[2]=sourse[bao3]; suan[3]=sourse[zi1];three();}suan[0]=sourse[0]; suan[1]=sourse[1];suan[2]=sourse[2]; suan[3]=sourse[3];four(); break;case 1:for (i=0; i<3; i++){for (j=i+1; j<4; j++)if (sourse[i]==sourse[j]) break;if (sourse[i]==sourse[j]) break;}tong1=i; tong2=j;for (i=0; i<4; i++)if (i!=tong1 && i!=tong2){butong1=i; butong2=6-tong1-tong2-butong1; break;}suan[0]=sourse[tong1]; suan[1]=sourse[tong2]; suan[2]=sourse[butong1]; suan[3]=sourse[butong2];four(); two(); dou_two(); three(); ext(); exp(); ex2(); one();suan[2]=sourse[butong2]; suan[3]=sourse[butong1]; two(); three(); ext(); exp(); one();suan[0]=sourse[butong1]; suan[1]=sourse[tong1]; suan[2]=sourse[tong2]; suan[3]=sourse[butong2];two(); dou_two(); ext(); exp(); ex2(); one();suan[0]=sourse[butong2]; suan[3]=sourse[butong1]; two(); dou_two(); exp(); one();suan[0]=sourse[butong1]; suan[1]=sourse[butong2]; suan[2]=sourse[tong1]; suan[3]=sourse[tong2];two(); dou_two(); three(); one();suan[0]=sourse[butong2]; suan[1]=sourse[butong1]; one();suan[0]=sourse[tong1]; suan[1]=sourse[butong1]; suan[2]=sourse[butong2]; suan[3]=sourse[tong2];two(); one();suan[1]=sourse[butong2]; suan[2]=sourse[butong1]; two(); one();suan[0]=sourse[tong1]; suan[1]=sourse[butong1]; suan[2]=sourse[tong2]; suan[3]=sourse[butong2];ext(); exp(); one();suan[1]=sourse[butong2]; suan[3]=sourse[butong1]; one();suan[0]=sourse[butong1]; suan[1]=sourse[tong1]; suan[2]=sourse[butong2]; suan[3]=sourse[tong2];exp(); one();suan[0]=sourse[butong2]; suan[2]=sourse[butong1]; one(); break;case 2:for (i=1; i<4; i++)if (sourse[i]==sourse[0]) break;tong1=0; tong2=i;for (i=0; i<4; i++)if (i!=tong1 && i!=tong2){butong1=i; butong2=6-tong1-tong2-butong1; break;}suan[0]=sourse[tong1]; suan[1]=sourse[tong2]; suan[2]=sourse[butong1]; suan[3]=sourse[butong2];four(); two(); dou_two(); ext(); exp(); ex2(); three(); one();suan[0]=sourse[butong1]; suan[1]=sourse[tong1]; suan[2]=sourse[tong2]; suan[3]=sourse[butong2];two(); dou_two(); ext(); exp(); ex2(); one();suan[0]=sourse[butong1]; suan[1]=sourse[butong2]; suan[2]=sourse[tong1]; suan[3]=sourse[tong2];two(); dou_two(); three(); one();suan[0]=sourse[tong1]; suan[1]=sourse[butong1]; suan[2]=sourse[butong2]; suan[3]=sourse[tong2];two(); one();suan[0]=sourse[tong1]; suan[1]=sourse[butong1]; suan[2]=sourse[tong2]; suan[3]=sourse[butong2];ext(); exp(); one();suan[0]=sourse[butong1]; suan[1]=sourse[tong1]; suan[2]=sourse[butong2]; suan[3]=sourse[tong2];exp(); one(); break;case 3:for (i=0; i<4; i++)if(sourse[i]!=sourse[(i+1)%4] &&sourse[i]!=sourse[(i+2)%4]) break;butong1=i; tong1=3-i;for (i=0; i<4; i++)if (i!=butong1 && i!=tong1){tong2=i; tong3=6-tong1-tong2-butong1; break;}suan[0]=sourse[tong1]; suan[1]=sourse[tong2]; suan[2]=sourse[tong3]; suan[3]=sourse[butong1];four(); two(); dou_two(); three(); ext(); exp(); ex2(); one();suan[0]=sourse[tong1]; suan[1]=sourse[tong2]; suan[2]=sourse[butong1]; suan[3]=sourse[tong3];two(); three(); exp(); one();suan[0]=sourse[tong1]; suan[1]=sourse[butong1]; suan[2]=sourse[tong2]; suan[3]=sourse[tong3];two(); dou_two(); one();suan[0]=sourse[butong1]; suan[1]=sourse[tong1]; suan[2]=sourse[tong2]; suan[3]=sourse[tong3];one(); break;case 6:suan[0]=sourse[0]; suan[1]=sourse[1];suan[2]=sourse[2]; suan[3]=sourse[3];four(); two(); dou_two(); three(); ext(); exp(); one();break;}do{cout << "继续?(y/n):"; cin >> ch;} while (ch!='y' && ch!='n' && ch!='Y' && ch!='N');} while (ch=='y' || ch=='Y');return 0;}。
24点程序讲解
24点游戏的编程算法:1、问题描述给定4个整数(1-10之间的正整数),其中每个数字只能使用一次;任意使用+– * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。
这方面的程序很多,一般都是穷举求解。
本文介绍一种典型的算24点的程序算法面向过程的C实现。
2、问题分析及算法描述基本原理是穷举4个整数所有可能的表达式,然后对表达式求值。
表达式的定义: expression = (expression|number) operator (expression|number)因为能使用的4种运算符+ – * / 都是2元运算符,所以本文中只考虑2元运算符。
2元运算符接收两个参数,输出计算结果,输出的结果参与后续的计算。
由上所述,构造所有可能的表达式的算法如下:(1) 将4个整数放入数组中(2) 在数组中取两个数字的排列,共有 P(4,2) 种排列。
对每一个排列,(2.1) 对 +– * / 每一个运算符,(2.1.1) 根据此排列的两个数字和运算符,计算结果(2.1.2) 改数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中(2.1.3) 对新的数组,重复步骤 2(2.1.4) 恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉可见这是一个递归过程。
步骤 2 就是递归函数。
当数组中只剩下一个数字的时候,这就是表达式的最终结果,此时递归结束。
在程序中,一定要注意递归的现场保护和恢复,也就是递归调用之前与之后,现场状态应该保持一致。
在上述算法中,递归现场就是指数组,2.1.2 改变数组以进行下一层递归调用,2.1.4 则恢复数组,以确保当前递归调用获得下一个正确的排列。
括号 () 的作用只是改变运算符的优先级,也就是运算符的计算顺序。
所以在以上算法中,无需考虑括号。
括号只是在输出时需加以考虑。
注意2.1输出的判定和四位数字的类型:在输出的时候对最后结果等于24的判别,因为考虑到有除法,有可能中途结果可能会出现不能整除的情况与小数,所以输出的四个数都设为float型,且输出判定的时候用近似判定法,而不直接写让最后结果等于24。
24点游戏程序设计
杭州电子科技大学2012年6月短学期姓名:谷蒙蒙学号:09056002班级:09056011班专业: 计算机科学与技术(2+2)学院:计算机学院课题:24点游戏实现指导老师:张彦斌完成时间:2012.06.19一、程序功能及规则设定本题目将设计一个24点游戏。
程序主要负责实现随机发牌、设置牌面、表达式验算、计算机给出解答、结果统计等功能。
系统可随机给出4个数,也可由用户自行输入四张牌的值。
用户输入表达式,先判断表达式是否正确,如果正确,计算是否24,不正确的话,给出可能的正确表达式。
用户可放弃输入,由系统直接给出可能的答案24点游戏是一种常见的纸牌游戏,就是利用加减乘除以及括号将给出的四张牌组成一个值为24的表达式,玩法十分简单,是一个消遣的好方法。
本程序对传统24点作了一定的改变,用户不必自己手动输入表达式,程序提供相应的按钮,通过点击按钮键入表达式,方便用户操作。
二、程序实现思路通过一定的功能分析,将程序基本化为:随机发牌,设置牌面,退出游戏,表达式键入,表达式验证,系统给出答案,判断是否无解这7个功能模块。
2.1随机发牌:产生4个随机数rand(),将4个数保存下来,对相应的按钮及图片做出对应的处理,即显示相对应的扑克牌、修改数字按钮上显示的数字、设置按钮的可用性等。
这些处理写在主窗口的私有成员函数中,名为startupCard(),其中调用较多的API函数,如载入图片loadImage()、设置按钮内容SetDlgItemText()等。
2.2设置牌面:用户自己设置扑克牌牌面(此时跳出一个设置窗口),获取用户输入的数字,其余操作与随机发牌操作相同,调用startupCard()完成。
2.3退出游戏:弹出关闭提示窗口,询问用户事故否确认退出。
点击确定,则退出;点击取消,则返回,继续游戏。
2.4表达式键入:设置4个数组、加、减、乘、除、左括号、右括号、清除、完成等按钮,并且一定时期某些按钮可用,某些按钮不可用。
C++实现简单24点游戏
C++实现简单24点游戏本⽂实例为⼤家分享了C++实现简单24点游戏的具体代码,供⼤家参考,具体内容如下随机⽣成4个代表扑克牌牌⾯的数字字母,程序⾃动列出所有可能算出24的表达式,⽤擅长的语⾔(C/C++/Java或其他均可)实现程序解决问题。
程序风格良好(使⽤⾃定义注释模板)列出表达式⽆重复。
以下为源代码#include<iostream>#include<string>#include <stdlib.h>#include<time.h>using namespace std;char card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' };char buf[4];double nums[4];char ope[4] = { '+','-','*','/' };void cre()//⽣成{int i = 0;int j;cout << "⽣成的四张牌⾯为:";srand((unsigned)time(0));for (i = 0; i<4; i++){j =rand() % 13;buf[i] = card[j];}cout << buf[0] << ";" << buf[1] << ";" << buf[2] << ";" << buf[3] << "。
高级语言程序设计之24点游戏
《高级语言程序设计》课程设计说明书设计题目:算24游戏目录1.课程设计的目的 (1)2.课程设计任务内容 (1)2.1 说明 (1)2.2 算法分析 (1)2.3 用户使用说明 (1)2.4 模块说明 (1)3.系统模块图 (1)4.效果预览 (3)5.经验和体会 (4)6.参考文献 (4)7.附录 (4)一、课程设计的目的《高级语言程序设计》课程设计是电子信息专业集中实践性环节之一,是学习完《高级语言程序设计》课程后进行的一次全面的综合练习,其目的在于加深对程序设计基本知识的理解,掌握使用C语言进行模块化软件设计的基本方法,提高通过编写程序解决实际问题能力,为今后从事设计工作和后续各种编程课程的学习打好基础。
二、课程设计任务内容算24游戏【说明】主要功能:(1)能罗列出四张牌用四则运算凑成24的游戏。
(2)凑不成给出提示。
【算法分析】计算24点主要应用四种运算.开始状态有四个操作数,一个运算符对应两个操作数,所以一开始选择两个操作数分别对四个操作符进行循环检测,每一次运算后产生了新的数,两个数运算变成一个数,整体是少了一个操作数,所以四个数最终是三次运算。
由于操作的层数比较少(只有三层),所以可以用回溯的算法来进行检测,当找到一个解时便结束查找。
以此循环,最终找到所有解。
如果所有的情况都找过后仍然没有,则输出无解的信息。
【用户使用说明】当游戏界面出现时,玩家可以按照系统提示从1到13之间任意选择4个整数,然后可以多人同时进行四则运算快速得出计算出24点的运算方法。
最后可以通过对程序的运行得到所有的解法。
如果所给的数能够得到24点,计算机将会罗列出所有的算法;如果不能构成24点,计算机将会给出提示。
【模块说明】从大的方面讲,本程序可以分为两个大的模块。
一个模块是对使用者所给数字的分析说明以及程序算法;另一个模块是对运算符的分析说明与使用。
本程序主要采用了循环的结构体,通过回溯法对所给数字进行四则运算,然后通过循环体的功能将所有结果输出,以得到所有满足条件的算法。
C程序设计 24点小游戏
1设计内容有2、3、4、5、6、7、8、9、10、J、Q、K、A共13张牌,编一程序,判断对任意给定的4张牌,能否在进行加、减、乘、除运算后,其运算结果等于24。
其中J按11计算,Q按12计算,K按13计算,A按1计算。
如果能得到结果24,则输出可得到该结果的计算表达式。
若输入数据符合要求,且经过加、减、乘、除运算后,运行结果能得到24,如输入5,5,5,1,则显示可得到该结果的计算表达式,如5*(5-(1/5))。
若输入数据小于1或者大于13或者不是整数时,提示输入错误。
若输入不能运算出24的数据,如1,1,1,1,则显示经过加、减、乘、除运算后,运行结果不能得到24。
2程序设计2.1存储结构设计由于要储存的数据不多,主要是储存所输入的4个整数,所以采用一维数组(a[4])储存。
而计算过程会出现小数,所以数据类型采用浮点型(float)。
2.2主要程序设计程序采用穷举法,对输入的4个数进行排列,有 4!=24种。
用for来循环,if来判断,算法如下。
for (i=0;i<4;i++)for (j=0;j<4;j++)if (j!=i)for (k=0;k<4;k++)if (k!=j && k!=i)for (l=0;l<4;l++)if (l!=i && l!=j && l!=k){ calculate(a[i],a[j],a[k],a[l]);}用if来判断括号的类型,然后作出不同顺序的运算。
括号有两对,主要有两种类型:一种是( ) ( )型,如(a+b)*(c+d) ;另一种是( ( ) )型,继续细分又有4种类型,如下a*(b*(c+d)) ,(a*(b+c))*d ,a*((b+c)*d) ,((a+b)*c)*d。
算法如下if ((!(i==3 && b==0)) && (!(j==3 && c==0)) && (!(k==3 && d==0))) {sum1=arithmetic(i,a,b);sum2=arithmetic(j,sum1,c);sum3=arithmetic(k,sum2,d);}if (k==2){sum1=arithmetic(i,a,b);sum2=arithmetic(j,c,d);sum3=sum1*sum2;}if (k==3){sum1=arithmetic(i,a,b);sum2=arithmetic(j,c,d);if(sum2!=0){sum3=sum1/sum2;}}在输入方面,按要求,数据类型是 1 至13 的整数,符合则进行运算,不符合则重新输入。
C语言计算24点(原创完美版)
#include<stdio.h>char cha[4]="+-*/",c=0;float fun(float a1,float a2,int b){switch(b) //选择四则运算{case 0:return (a1+a2);case 1:return (a1-a2);case 2:return (a1*a2);case 3:return (a1/a2);}}void algebra(int x[4])//计算满足要求的表达式{int i,j,k;float temp1,temp2,temp3;for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++){temp1=fun(x[0],x[1],i);temp2=fun(temp1,x[2],j);temp3=fun(temp2,x[3],k);if(temp3==24){printf("\t\t\t\t[(%d%c%d)%c%d]%c%d=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[0],x[1],i);temp2=fun(x[2],x[3],k);temp3=fun(temp1,temp2,j);if(temp3==24){printf("\t\t\t\t(%d%c%d)%c(%d%c%d)=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[1],x[2],j);temp2=fun(temp1,x[0],i);temp3=fun(temp2,x[3],k);if(temp3==24){printf("\t\t\t\t[%d%c(%d%c%d)]%c%d=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[1],x[2],j);temp2=fun(temp1,x[3],k);temp3=fun(temp2,x[0],i);if(temp3==24){printf("\t\t\t\t%d%c[(%d%c%d)%c%d]=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}temp1=fun(x[2],x[3],k);temp2=fun(temp1,x[1],j);temp3=fun(temp2,x[0],i);if(temp3==24){printf("\t\t\t\t%d%c[%d%c(%d%c%d)]=24\n",x[0],cha[i],x[1],cha[j],x[2],cha [k],x[3]);c=1;}}}int arrange(int num[4])//将四个数排列为24种方式{int i,j,k,l;int temp[4];for(i=0;i<4;i++)for(j=0;j<4;j++)for(k=0;k<4;k++)for(l=0;l<4;l++){if(i!=j&&i!=k&&i!=l&&j!=k&&j!=l&&k!=l){temp[0]=num [i];temp[1]=num[j];temp[2]=num[k];temp[3]=num[l];algebra(temp);}}}int main(){int i, num[4];char ch;printf(" **计算24点游戏**\n\n请输入4个整数,然后按“回车”键: \n");for(i=0;i<4;i++)scanf("%d",&num[i]);//将四个数输入到数组中去printf("结果是:\n");arrange(num);if(c==0)printf("无解.\n");printf("是否继续?(y,n): ");fflush(stdin);ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ****再见!****\n\n");return 0;}while(ch!='y'){printf("输入错误,请重输(y或n): ");ch=getchar();fflush(stdin);if(ch=='n')return 0;}while(ch=='y'){printf("请输入四个整数:");for(i=0;i<4;i++)scanf("%d",&num[i]);//将四个数输入到数组中去fflush(stdin);printf("结果是:\n");arrange(num);if(c==0)printf("无解.\n");printf("是否继续?(y,n): ");ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ******再见!****\n\n");return 0;}while(ch!='y'){printf("输入错误,请重输(y或n): ");ch=getchar();fflush(stdin);if(ch=='n'){printf("\t\t\t\t ******再见!****\n\n");return 0;} }}return 0;}。
24点游戏(C#)
24点游戏(C#)游戏描述:输入参数:4个0…9之间的数字(顺序可调)计算方法:加减乘除(括号)计算结果:24程序截图:程序描述:程序的三种模式:1,全部组合(有解):将有解的组合全部列出(因为数据组合较多,一屏可能显示不下,所以分段显示)。
如下图(第一段):2,全部组合(无解含):将所有的组合一一列出,包括无解的组合(同模式一,分屏显示)。
如下图(第一段):3,手动输入(默认):手动输入4个数字,程序自动计算,得出结果。
如下图:程序代码用VS创建ConsoleApplication程序,拷贝一下代码覆盖原代码即可。
(有任何问题,可以私密我)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;namespace Game24{public class Program{///<summary>///計算結果String///</summary>private static Stack<string> stackResult = new Stack<string>();///<summary>///起動方法///</summary>///<param name="args"></param>public static void Main(string[] args){bool reFlg = true;int[] aryInput = new int[4];Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine("===================24点Game===================");Console.WriteLine("========================================tpj");while (reFlg){Console.ForegroundColor = ConsoleColor.Yellow;Console.WriteLine(" 1:全部組合(有解)");Console.WriteLine(" 2:全部組合(無解含)");Console.WriteLine(" 3:手動輸入(默認)");Console.WriteLine(" 4:中止");Console.Write("選択:");string select = Console.ReadLine();#region全部組合if (select == "1" || select == "2"){int mukaisu = 0;int youkaisu = 0;int current = 0;for (int i = 0; i < 10; i++){for (int j = i; j < 10; j++){for (int k = j; k < 10; k++){for (int d = k; d < 10; d++){current++;aryInput[0] = i;aryInput[1] = j;aryInput[2] = k;aryInput[3] = d;bool isRight = Keisan(aryInput);if (select == "1"){if (isRight){youkaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;string allResult =GetAllResult(stackResult.ToList());Console.WriteLine(allResult);}else{mukaisu++;}}else{if (isRight){youkaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu + mukaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;string allResult =GetAllResult(stackResult.ToList());Console.WriteLine(allResult);}else{mukaisu++;Console.ForegroundColor = ConsoleColor.Gray;Console.Write(string.Format("{0}:{1}、{2}、{3}、{4} ", youkaisu + mukaisu, aryInput[0], aryInput[1], aryInput[2], aryInput[3]));Console.ForegroundColor = ConsoleColor.DarkYellow;Console.WriteLine("無解...");}}if (current != 0 && current % 120 == 0){Console.ForegroundColor = ConsoleColor.Yellow;Console.Write(string.Format("({0},{1},{2},{3})⇒({4},{5},{6},{7})完了。
24点程序C#代码(随机方法实现)
if (s4 == 24)
{
MessageBox.Show("可以组成24!");
}
public double shu(double i, double j, double k, double m, ref double result1,
ref double result2, ref double result3, ref double result4)
for (a = 0; a < 4; a++)
{
if (a !=random &&a !=random1 )
{
result3 = array[a];
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
for (int i = 0; i < 100000; i++)
{
int math1 = ra.Next(1, 5); //math1为随机运算符1
int math2 = ra.Next(1, 5); //math2为随机运算符2
}
else if (random == 4)
{
return this.chu(i, j);
}
else { return 0; }
c语言程序 计算24点
for (f2=0;f2<4;f2++)
for (f3=0;f3<4;f3++) // 运算符 f1,f2,f3
{
4 、 //----------- 未 用 循 环 , 直 接 穷 举 三 个 运 算 符 的 优 先 级 : 3!-1=5 种
( 3*2-1=5)-------------------
3、24 点计算。定义 double t1,t2,t3;
t1,t2,t3 用于存放计算的中间值,
两个两个地按优先级进行计算。
4、判断是否为 24。在运算过程中除法的特殊性——除数不能为零。因为可能会
用到除法,所以要考虑精度问题。这里通过结果减去 24 取绝对值与一个接近 0
的小数(如 0.001)比较,如小于它,即可判定结果是 24。
比较运算结果 是否等于 24
否
2、编程实现。
1、加减乘除运算
否 是否循环结束
是
结束
double {
}
cal(double a,double b,int op)
switch (op) { case 0: return(a+b); case 1: return(a-b); case 2: return(a*b); }
//i 表示 v[i]下标的位置 i1
i2 i3 i4 不能相等(分别为 0 1 2 3) 表示 4 个数排列在数组 4 个不同的位置
上
for (i2=0;i2<4;i2++)
// 四重循环对四个数穷举
if (i2!=i1)
for (i3=0;i3<4;i3++)
if (i3!=i2 && i3!=i1)
24点游戏 C语言(穷举法)
}
if(i==5)
{
s1= f(Data[Sx3],Data[Sx4],Sign[Fh1]);
s2 = f(s1,Data[Sx2],Sign[Fh2]);
s3= f(s2,Data[Sx1],Sign[Fh3]);
{
fprintf(fp,"第一步=%lf,%lf,%c, =%lf\n",Data[Sx1],Data[Sx2],Sign[Fh1],s1);
fprintf(fp,"第二步=%lf,%lf,%c, =%lf\n",Data[Sx3],Data[Sx4],Sign[Fh2],s2);
{
s1= f(Data[Sx1],Data[Sx2],Sign[Fh1]);
s2 = f(Data[Sx3],Data[Sx4],Sign[Fh2]);
s3 = f(s1,s2,Sign[Fh3]);
if(XD(s3,24.0))
if(XD(s3,24.0))
{
fprintf(fp,"第一步=%lf,%lf,%c, =%lf\n",Data[Sx2],Data[Sx3],Sign[Fh1],s1);
fprintf(fp,"第二步=%lf,%lf,%c, =%lf\n",s1,Data[Sx1],Sign[Fh2],s2);
s2 = f(s1,Data[Sx3],Sign[Fh,Sign[Fh3]);
if(XD(s3,24.0))
{
fprintf(fp,"第一步=%lf,%lf,%c, =%lf\n",Data[Sx1],Data[Sx2],Sign[Fh1],s1);
24点游戏课程设计报告书
高级语言程序设计课程设计报告书题目:C编程实现“24点游戏”学生姓名:学号:学院:电子信息学院班级:二零一八年六月C编程实现“24点游戏”一、课题的目的和意义:1、对高级语言程序设计课程一学年的知识进行回顾与总结;2、强化编程能力;3、针对一个全新的课题,培养项目开发能力和团队协作能力。
二、课题开发的内容介绍:1、什么是“24点游戏”:拿一副牌,抽去大小王和J/Q/K,剩下1~10这40张牌(以下用1代替A)。
任意抽取4张牌(称为牌组),用加、减、乘、除四则运算把牌面上的数算成24。
每张牌必须且只能用一次。
如抽出的牌是3、8、8、9,那么算式为(9-8)×8×3=24。
2、实现过程:第一步:由电脑随机发牌,或由玩家任意输入,得到由4张牌组成的牌组;第二步:写程序遍历所有可能性,如果能算出24,则显示所有的解法;如果算不出24,则输出不可能得到答案。
三、推荐的技术方案1、开发环境:VC++6.0;2、开发难点:可以使用类,也可使用函数实现。
A、如果使用电脑随机发牌,则需要使用C的函数产生随机数;B、遍历策略问题:需要使用循环结构,找出由1~10 的数字以及4个运算符号组成的所有可能性。
四、程序设计的具体流程:1、程序流程图:2、源代码:#include <iostream>#include <ctime> //获取时间#include <string>#include <math.h>using namespace std;char allnumber[10] = { 1,2,3,4,5,6,7,8,9,10 };int a,b,c,d;int Calculate ( float x, float y, float z, float w); //int main(){srand((unsigned)time(NULL));//获取当前时间作为参数,生可以随时间变化的随机数,为了避免重复出现同一组数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录1. 基本功能描述 (1)2. 设计思路 (1)3. 软件设计 (3)3.1 设计步骤 (3)3.2 界面设计 (3)3.3 关键功能的实现 (4)4. 结论与心得体会 (4)5. 参考文献 (5)6. 思考题 (5)7. 附录 (6)7.1 调试报告 (6)7.2 测试结果 (6)7.3 关键源代码 (9)24点游戏1. 基本功能描述(1)游戏开始之前可以进行难度选择(默认为简单),难度选定后点击“发牌”按钮,程序上方会随机显示4张扑克牌,进度条开始工作,用以标识耗时,同时“发牌”按钮名称变为“重新开始”。
(2)在规定时间范围内,用户可以思考并输入算式。
输入完成后,点击“验算”按钮,系统将对输入结果进行检验。
若结果正确,显示“你真行!”,同时计分栏将根据难度给予不同的分值奖励;若结果不是24,则显示“输入错误!”,计分栏分数不变。
(3)若在规定时间内没有完成输入或没有点击“验算”按钮,则会弹出“时间到!”对话框。
(4)菜单可同样实现“发牌”和“结束”功能,同时还有“帮助”菜单,下面的“关于”项写入程序信息。
(5)完成一次游戏后,若用户想继续游戏,点击“重新开始”即可;若不想继续,点击“退出”按钮即可关闭程序。
2. 设计思路本程序采用基本对话框,初始化过程中载入位图,位图资源从系统的纸牌游戏资源Card.dll中获得。
点击“发牌”调用OnStart函数,完成随机发牌和计时功能,时间长短根据难度的不同,由变量m_length控制。
用户完成输入后,点击“验算”调用OnCalc函数(OnCalc函数调用qiuzhi函数对输入的多项式进行计算),完成对输入的正误判断并给出相应提示,计分栏显示分值,每次得分分值大小由m_PScore变量根据难度设置。
若想重新开始,点击“重新开始”,重新执行OnStart函数;若想结束,点击“结束”,调用OnOK 函数,即可退出游戏。
程序流程图如下:图1 24点游戏程序流程图3. 软件设计3.1 设计步骤1)进入VC++程序后,创建MFC AppWizard(exe)工程,以自己姓名的拼音作为工程名,在应用程序类型中选择基本对话框,完成对话框的创建。
2)在对话框中根据设计要求添加控件,包括按钮,单选按钮,编辑框,进度条,组合框,静态文本和位图。
修改其属性,并建立类向导,在相应的地方添加代码。
3)添加菜单,关联到主窗口。
4)对程序进行调试,修改其中的错误,直到实现所要求的各项功能。
3.2 界面设计表1 界面控件表3.3 关键功能的实现1)纸牌显示:在BOOL CHukunDlg::OnInitDialog( )中,使用LoadBitmap( )加载纸牌位图,然后在void CHukunDlg::OnStart( )中,通过SetBitmap( )显示纸牌。
2)随机发牌:在void CHukunDlg::OnStart( )中,通过随机函数Number[i]=rand()%13得到随机数,控制纸牌的显示。
同时为了使每次运行程序时发牌都不一样,需要调用系统时间做种子,语句srand((unsigned) time(&t))来实现。
3)计时:使用SetTimer( )函数设置计时器,使用SetRange( ),SetStep( )和SetPos( )函数设置进度条, 将控制进度条的函数置于OnTimer( )函数中。
每次计时器向窗口发送消息WM_TIMER时会触发函数OnTimer( ),从而使进度条前进。
4)难度变化:三种难度有各自不同的ID值,通过获取ID值使系统明白所选难度。
通过变量m_length改变进度条的变化范围,即通过改变函数SetRange( )来控制不同难度下游戏时间的长短。
通过变量m_PScore控制不同难度下每答对一题给予的分值奖励。
5)验算结果:利用堆栈思想编写多项式算法,通过void CHukunDlg::OnCalc( )调用算法函数qiuzhi( )。
系统通过GetWindowText( )获取用户的输入后,调用void CHukunDlg::OnCalc( )对用户输入进行检验,并根据结果给出相应提示和加分。
6)结束:调用函数void CHukunDlg::OnOk( )。
4. 结论与心得体会通过对各项功能的测试,发现本程序均能达到要求。
因此,本程序从设计思路到代码编写到最后的结果都是符合设计规范的,是正确无误的。
这次课程设计,给了我很多启发。
在一开始拿到选题表时,仅仅是因为感觉24点游戏有意思才选择了它。
当进行程序流程图的绘制时,也感觉比较容易,因为仅仅只写个函数名,主要是对MFC运行过程的熟悉。
而真正开始编程时才发现,自己平时学的都是纸上谈兵。
虽然课本已经看了个遍,MFC编程部分更是看了几遍,可真正动手起来,还是无从下手。
且不说编得如何,单单对控件的设计就是丢三落四的,不是忘了添加变量,就是菜单没有进行关联。
总之,平时不注意的一些小细节,反而造成了大错误,而且还不容易发现。
在编写代码过程中,更是困难重重,漏洞百出。
最开始编写结束后我印象极为深刻,当时一共有30多个错误,当然,不少是重复的。
尽管如此,也让我一阵眩晕,一个完美的程序果然是要经过无数次修改才行的。
编程遇到的最大的问题就是多项式算法的编写,尽管通过数据结构的学习已经知道需要用到栈来实现,同时对其原理也理解了,但是实际应用中还是存在不少问题,而且开始时在网上还找不到资料(实际是查阅方法不对),代码的编写总是不能很好的应用起来。
后来通过询问老师和查阅资料,反复试验后终于成功了,当时用欣喜若狂形容也不为过,那种感觉大概就是无数编程员能坦然面对枯燥繁杂的代码,孜孜不倦的追求更人性化、多功能化程序的动力吧。
在课程设计即将结束时,我总结得到的启发:1.对于编程这类实践性的课程,绝对不要停留在书本上,看十本书不如动手一次;2.查阅资料是一门学问,具有一定的技巧,学会正确快速查询是我们必备的能力;3.准备要充分,方向要明确,定下来后就不要因旁人影响东添西改,否则容易出错且混乱不堪;4.不要妄想一步登天,任何一件事情都需要从基本到高级一步步来;5.不要怕出错,对于初学者来说,改错是一种极好的学习过程,快速又有效。
通过这次课程设计,对于C++认识终于从理论提升到了实践,尽管我们编写的都是极其简单的程序,但起码掌握了一个程序的设计制作过程,MFC应用程序的启动流程,和简单代码的编写。
总而言之,对于C++的编程,可以说是初窥门径了。
5. 参考文献[1] 刘卫宏、陈培.Visual c++编程基础.上海理工大学出版社.2003[2] 侯伯亨.24点游戏的各种开发工具.西安电子科技大学出版社.2001[3] 揣锦华.面向对象程序设计与VC++实践.西安电子科技大学出版社.20056. 思考题(1) 改变难度可以变化游戏的限时和游戏加分的规则,如何实现?答:游戏的限时是通过改变进度条的SetRange( )函数来实现的。
定义变量m_length,将函数设置为m_Progress->Setrange(0,m_lenght),用变量来设置进度条的变化范围,选择不同难度的时候m_length的值也会不同,难度越大它的值越小,时间也就越短,反之时间越长。
同理,加分也定义变量m_PScore,不同的难度m_PScore值不同。
即每答对一题,给予的加分各不相同,难度越大分值越高,反之越小。
(2) 如何使用随机函数控制扑克牌的显示?答:先利用语句srand((unsigned) time(&t))以系统时间做种子,使每次打开程序时扑克牌显示不会重复。
再通过Number[i]=rand()%13,可以获得0~12这13个数字,在初始化函数OnInitDialog()中,加载位图时已经通过语句Bitmap[0].LoadBitmap(IDB_BITMAP27)(其余类似)将这13个数字分别与13张扑克牌位图对应。
故在OnStart函数中,通过语句((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(Bitmap[Number[0]])(其余类似)显示对应的扑克牌图案。
(3) 如何保证程序是根据给出的牌来书写算式的?答:定义数组与扑克牌点数关联,每一项一一对应。
当用户点击“验算”后,系统将把输入的四个运算数与数组元素(即显示的四张牌)相比较,一样则进行下面的各项操作,否则提示错误。
7. 附录7.1 调试报告1)运行程序出错,错误显示:d:\我的文档\桌面\课程设计胡坤\hukun\hukunDlg.cpp(412) : error C2065: 'm_PScore' : undeclared identifierd:\我的文档\桌面\课程设计胡坤\hukun\hukunDlg.cpp(447) : error C2065: 'm_length' : undeclared identifier这两个错误都是没有给定义的变量添加声明造成的。
只需要在hukunDlg.h中的class CHukunDlg : public Cdialog中将变量声明添加入public里即可。
2)一次输入结束后重新开始发现进度条没有清零,仍然接着上次的进度继续走。
其原因为在OnStart( )函数中没有设定进度条的初始状态,应该添加m_Progress->SetPos(0)。
3)添加菜单后,将各个菜单项与对应按钮地ID值改为相同,同时给菜单连接了类,但运行时仍未显示菜单栏。
开始一直以为是ID的问题,结果是菜单没有与主窗口连接。
这都是菜单添加不熟悉造成得。
7.2 测试结果1)程序正确运行后,界面显示与要求相符合,难度默认为简单,得分栏为零。
图2 进入程序初始界面2)选定难度后,点击“发牌”,进度条走动,“发牌”按钮名称变为“重新开始”。
在正确输入后点击“验算”后弹出“你真行!”对话框,同时得分栏分数增加。
图3 点击“发牌”后界面图4 输入正确时界面3)输入结果不为24时弹出“输入错误!”对话框。
图5 输入错误界面4)在规定时间内没完成输入,弹出“时间到!”对话框。
图6 时间到界面7.3 关键源代码1)在hukunDlg.h中的class CHukunDlg : public CDialog类中添加公有成员:int Number[4];CStatic* m_Static[4];CBitmap Bitmap[13];int m_length;int m_PScore;2)在hukunDlg.cpp中开头部分添加定义:#include "string.h"#include "math.h"#include "stdlib.h"#include "stdio.h"#define stack_init_size 100#define stackincrement 10#define maxlen 100#define ok 1#define error 0typedef int status;#define overflow -23)以下为关键代码:BOOL CHukunDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.Bitmap[0].LoadBitmap(IDB_BITMAP27); //载入已经创建好的纸牌位图对象Bitmap[1].LoadBitmap(IDB_BITMAP28);Bitmap[2].LoadBitmap(IDB_BITMAP29);Bitmap[3].LoadBitmap(IDB_BITMAP30);Bitmap[4].LoadBitmap(IDB_BITMAP31);Bitmap[5].LoadBitmap(IDB_BITMAP32);Bitmap[6].LoadBitmap(IDB_BITMAP33);Bitmap[7].LoadBitmap(IDB_BITMAP34);Bitmap[8].LoadBitmap(IDB_BITMAP35);Bitmap[9].LoadBitmap(IDB_BITMAP36);Bitmap[10].LoadBitmap(IDB_BITMAP37);Bitmap[11].LoadBitmap(IDB_BITMAP38);Bitmap[12].LoadBitmap(IDB_BITMAP39);CProgressCtrl*m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS); //设置指向进度条的指针m_Progress->SetStep(1); //设置进度条每次向前1个单位m_Progress->SetPos(0); //设置进度条初始状态处于0位GetDlgItem(IDC_CALC)->EnableWindow(FALSE); //使“验算”按钮不可用CheckRadioButton(IDC_Easy,IDC_Hard,IDC_Easy); //使难度默认为“简单”}//多项式算法typedef struct{char *base,*top;int stacksize;}sqstack1; //定义运算符栈typedef struct{float *base,*top;int stacksize;}sqstack2; //定义运算数栈int isp(char a) //栈内优先数{int e;if(a=='*'||a=='/') e=2;if(a=='+'||a=='-') e=1;if(a=='(') e=0;if(a=='=') e=-1;return e;}int icp(char a) //栈外优先数{int e;if(a=='*'||a=='/')e=2;if(a=='+'||a=='-')e=1;if(a=='(')e=3;return e;}status initstack1(sqstack1 &s) //运算符栈的初始化{s.base=(char*)malloc(stack_init_size*sizeof(char));if(!s.base)exit(overflow);s.top=s.base;s.stacksize=stack_init_size; return ok;}status gettop1(sqstack1 s, char &e) //取栈顶元素{if(s.top==s.base)return error;e=*(s.top-1); return ok;}status push1(sqstack1 &s,char e) //进栈{if(s.top-s.base>=s.stacksize){s.base=(char*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(char));if(!s.base)exit(overflow);s.top=s.base+s.stacksize;s.stacksize+=stackincrement;}*s.top++=e; return ok;}status pop1(sqstack1 &s,char &e){if(s.top==s.base)return error;e=*--s.top; return ok;}status initstack2(sqstack2 &s) //运算数栈的初始化{s.base=(float*)malloc(stack_init_size*sizeof(float));if(!s.base)exit(overflow);s.top=s.base;s.stacksize=stack_init_size; return ok;}status gettop2(sqstack2 s, float &e) //取栈顶元素{if(s.top==s.base)return error;e=*(s.top-1); return ok;}float push2(sqstack2 &s,float e) //进栈{if(s.top-s.base>=s.stacksize){s.base=(float*)realloc(s.base,(s.stacksize+stackincrement)*sizeof(float));if(!s.base)exit(overflow);s.top=s.base+s.stacksize;s.stacksize+=stackincrement;}*s.top++=e; return ok;}float pop2(sqstack2 &s,float &e) //出栈{if(s.top==s.base)return error;e=*--s.top; return ok;}status postfix(char la[],char lb[]){int i,j,k;char c,ea,eb,ec;sqstack1 optr;initstack1(optr);ec='=';push1(optr,ec); //optr栈的初始化,栈底为=i=0;j=0;c=la[0];while(c!='='&& i<maxlen) //k指示是否是运算数{if((c>='0'&&c<='9')||c=='.'){lb[i++]=c;k=0;}else{if(c==')') //遇" ) "则一直退到" ( "{lb[i++]=' '; gettop1(optr,ea);while(ea!='(' ){pop1(optr,eb); lb[i++]=eb;lb[i++]=' ';k=1;gettop1(optr,ea);}pop1(optr,eb);}else{if(i>1&&k==0)lb[i++]=' ';gettop1(optr,ea);while(isp(ea)>=icp(c)) //比较优先级{pop1(optr,eb);gettop1(optr,ea);lb[i++]=eb;lb[i++]=' ';k=1;}push1(optr,c);lb[i++]=' ';}}c=la[++j];}gettop1(optr,ea);while(ea!='=') //退栈到栈底{lb[i++]=' ';pop1(optr,eb);lb[i++]=eb; gettop1(optr,ea);}if(i==maxlen)return(overflow);else lb[i++]=' ';lb[i]='=';return ok;}float qiuzhi(char lb[]){int i,j,k,n,flag;float m,e,ta,tb,d,t;float *p;char c;sqstack2 opnd;initstack2(opnd); //opnd栈的初始化i=j=n=0;flag=0;c=lb[0];while(c!='='){if(c==' '){if(j>=2) //把字符转化为实数{ m=0;k=j;while(j>0){pop2(opnd,e); //弹出栈顶元素m+=e*(float)pow(10,k-j);j--;}m=m/(float)pow(10,n);push2(opnd,m);}else j=0;n=0;flag=0; //flag指示小数点的起始,n指示小数点后的位数}else{ if((c>='0'&&c<='9')||c=='.'){ if(c=='.')flag=1;else{ if(flag==1)n++;d=(float)(c-'0');push2(opnd,d);j++;}}else //遇运算符则取数进行运算{pop2(opnd,ta);pop2(opnd,tb); //弹出栈顶两个元素进行运算if(c=='*')t=ta*tb;if(c=='/'){if(ta==0)return error;else t=tb/ta;} //除数为0返回0if(c=='+')t=ta+tb;if(c=='-')t=tb-ta;push2(opnd,t);}} p=opnd.base;c=lb[++i];}gettop2(opnd,e);return e; //返回计算结果}void CHukunDlg::OnCalc(){// TODO: Add your control notification handler code hereKillTimer(1); //清除计时器int i=1;float result;char str[50];char cbufer[50];char exps[50];m_Input.GetWindowText(cbufer,20); //获取用户输入strcpy(str,cbufer);postfix(str,exps);char c=exps[0];while(c!='='){c=exps[i];i++;}result=qiuzhi(exps); //调用多项式算法函数if (result==24.0){m_Score+=m_PScore; //加分UpdateData(FALSE); //分数显示AfxMessageBox("你真行!",MB_OK);}elseAfxMessageBox("输入错误!",MB_OK);}void CHukunDlg::OnOk(){// TODO: Add your control notification handler code here OnOK(); //退出}void CHukunDlg::OnStart(){// TODO: Add your control notification handler code herem_Input.SetWindowText(""); //编辑框空白显示UpdateData(FALSE);time_t t;srand((unsigned) time(&t)); //以系统时间作为种子for(int i=0;i<4;i++)Number[i]=rand()%13; //产生随机数((CStatic*)GetDlgItem(IDC_Picture1))->SetBitmap(Bitmap[Number[0]]); //位图显示((CStatic*)GetDlgItem(IDC_Picture2))->SetBitmap(Bitmap[Number[1]]);((CStatic*)GetDlgItem(IDC_Picture3))->SetBitmap(Bitmap[Number[2]]);((CStatic*)GetDlgItem(IDC_Picture4))->SetBitmap(Bitmap[Number[3]]);UpdateData(FALSE);GetDlgItem(IDC_START)->SetWindowText("重新开始"); //“发牌”按钮显示变为“重新开始”GetDlgItem(IDC_CALC)->EnableWindow(TRUE); //使“验算”按钮可用int iRADIO=GetCheckedRadioButton(IDC_Easy,IDC_Hard); //难度的判断if(iRADIO==IDC_Easy){m_length=90; //进度条上限设定m_PScore=1; //奖励分值设定}else if(iRADIO==IDC_Middle){m_length=45;m_PScore=3;}else if(iRADIO==IDC_Hard){m_length=15;m_PScore=5;}CProgressCtrl* m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS);//定义指向进度条的指针m_Progress->SetPos(0); //设置进度条的初始状态SetTimer(1,1000,NULL); //设置计时器每隔1S发送一次消息GetDlgItem(IDC_Easy)->EnableWindow(FALSE); //使难度选择按钮不可用GetDlgItem(IDC_Middle)->EnableWindow(FALSE);GetDlgItem(IDC_Hard)->EnableWindow(FALSE);}void CHukunDlg::OnTimer(UINT nIDEvent){// TODO: Add your message handler code here and/or call defaultif(nIDEvent==1){CProgressCtrl* m_Progress=(CProgressCtrl*)GetDlgItem(IDC_PROGRESS);m_Progress->SetPos(m_Progress->GetPos( )+1); //进度条前进一个单位m_Progress->SetRange(0,m_length); //设置进度条的范围if(m_Progress->GetPos( )>=m_length) //判断是否超时{KillTimer(nIDEvent);AfxMessageBox("时间到!",MB_OK);GetDlgItem(IDC_CALC)->EnableWindow(FALSE); //“验算”按钮不可用}}CDialog::OnTimer(nIDEvent);}void CHukunDlg::OnAbout( ) //菜单“关于”中的内容显示{// TODO: Add your command handler code hereMessageBox("这是一个24点游戏,作者:胡坤");}。