这是在学校的时候写的计算24点的程序,它具备了比较烂的程序的大部分特点。

这段程序是很久以前写的了,用的是Turbo C++ 3.0,现在看这段程序头皮都麻。我觉得这段代码几乎可以作反面教材了,难以理解的宏,函数指针!GoTo语句,毫无意义的命名,多达七层的循环!现在我看到 Void* 和 Inti(*) 这些东西都有点佩服自己,这些都是什么玩意啊!看的时候,有的注释我想了好长时间才知道啥意思。不过它真的可以给出结果!我特意从网上下载了Trubo C++ 3.0重新编译了这段代码,能正确运行,只是中文显示乱码,于是把中文改为英文,生成了exe文件:24.exe ,不过每计算一次就要重新执行一次程序啊!

Code
Code
/**//*
 * 24.cpp Author-ZhiQiao
 * 24 点游戏
 * 四个 1 到 10 之间的整数, 每个数都必须使用且只能用一次.
 * 加,减,乘,除可以随意使用,设法使运算结果为24.
 */
#include<iostream.h>
#include<conio.h>

#define N 4
//LOOP 宏的定义为了书写方便
#define LOOP(i) for(i=0; i<N; i++)
//此函数将void型指针转换为四个操作符对应的函数指针.
#define F(i) ( (int(*)(int,int))opt[i] )
#define FI F(i)
#define FJ F(j)
#define FK F(k)

//定义+,-,x,/四个操作对应的函数
int  add(int a, int b) 
{ return a + b; }
int  sub(int a, int b) 
{ return a - b; }
int  mul(int a, int b) 
{ return a * b; }
int  div(int a, int b) 
{ //如果a不能被b整除或b为0就返回一个比较大的整数
 if(b==0 || a%b) return 2401;
 return a/b;
}

   // 根据相应函数在数组中的下标判断其运算符号,用来输出结果
char whichOpt(int index)
{
 if(index==0)    return '+';
 else if(index==1) return '-';
 else if(index==2) return '*';
       return '/';
}

// 求解24点的算法实现
void howObtain24(int num[], void* opt[])
{
 int i,j,k,a,b,c,d;

 LOOP(i) LOOP(j) LOOP(k)                  //选择运算符
 LOOP(a) LOOP(b) LOOP(c) LOOP(d)  //数字不同的排列顺序
 
{
  if(a==b||a==c||a==d||b==c||b==d||c==d)
     continue; 
  if( FI(FJ(FK(num[a], num[b]), num[c]), num[d]) == 24)
{
   cout << "((" << num[a] << whichOpt(k) << num[b] << ')'
           << whichOpt(j) << num[c] << ')'
           << whichOpt(i) << num[d] << endl;
   goto END;
  }
  if( FI(FJ(num[a], num[b]), FK(num[c], num[d])) == 24 )
{
   cout << '(' << num[a]  << whichOpt(j) << num[b] << ')'
           << whichOpt(i) <<
     '(' << num[c]  << whichOpt(k) << num[d] << ')' << endl;
   goto END;
  }
 }
 cout << "这几个数字无法得到 24\n"; return;
 END: return;
}

//=======================================================================
int main()
{
 //四个数字
 int  num[N]; 
 //四个运算符对应的函数指针
 void*  opt[N] = 
{ (void*)add, (void*)sub, (void*)mul, (void*)div };
 
 cout << "请输入四个 1 到 10 之间的整数 :\n";
 for(int i=0; i<N; i++) cin >> num[i];  
 
 for(int j=0; j<N; j++)
  if(num[j]<1 || num[j]>10)
{   
   cout << "输入不符合要求!\n";
   getch();
   return 0;
  }
 howObtain24(num,opt);
 getch();  
 return 0;
}