⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 check_if_not2.c

📁 fgdgyh trtrh rrt ertge e er er
💻 C
字号:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//#include<time.h>
#include<math.h>
#define MAX 13
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
//#define OVERFLOW -2
#define OPSETSIZE 7
#define STACK_INIF_SIZE 50
#define STACKINCREMENT 10
typedef int status;
typedef struct sqstack{
	double *base;
	double *top;
	int stacksize;
	}sqstack;
unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
  	  '>','>','<','<','<','>','>',
	  '>','>','<','<','<','>','>',
	  '>','>','>','>','<','>','>',
	  '>','>','>','>','<','>','>',	
	  '<','<','<','<','<','=',' ',
	  '>','>','>','>',' ','>','>',
	  '<','<','<','<','<',' ','='
};
char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
int number[2][4]={8,4,2,4};
enum
{
	eNumber = 0,	//操作数
	eOperator = 1	//算子
};
 /*enum MyOP
{
	eAdd = 43,
	eSub = 45,
	eMulti = 42,
	eDiv = 47,
	eLeftParen = 40,
	eRightParen = 41,
	head_end = 35
};*/

int oper[7]={43,45,42,47,40,41,35};
 double Operate(double a,int theta, double b) {
//	printf("a=%d,theta=%c,b=%d\n",a,theta,b);
   switch(theta) {

      case 43: return a+b;
      case 45: return a-b;
      case 42: return a*b;
      case 47:
		  {if(b==0){
			  printf("除数不能为0!\n");
			  exit(ERROR);
		  }
			else	return a/b;
		  }
      default : return 0;
   } 
}	

int ReturnOpOrd(char op,char* TestOp) {
   int i;
   for(i=0; i< OPSETSIZE; i++) {
      if (op == TestOp[i]) return i;
   }
   return 0;
}

char precede(char Aop, char Bop) {
 //   printf("%c\n",Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)]);
//	printf("%c,  %c\n",Aop,Bop);
	return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
   
}
status initstack(sqstack *s){
	(s)->base = (double*)malloc(STACK_INIF_SIZE*sizeof(double));
	if((s)->base==NULL) exit(OVERFLOW);
	(s)->top=(s)->base;
	(s)->stacksize = STACK_INIF_SIZE;
//	printf("initstack is finished!\n");
	return OK;	
	}
double gettop(sqstack *s){
		double e;
		if(s->top==s->base){
			 printf("NULL1\n");
			 return 0;
			 }
		e=*(s->top-1);
	//	printf("gettop %d is OK!\n",e);
		return e;
		}
status push(sqstack *s,double e){
	if(s->top-s->base>=s->stacksize){
		s->base=(double*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(double));
		if(!s->base) exit(OVERFLOW);
		s->stacksize+= STACKINCREMENT;
		}
	*(s->top++)=e;
//    printf("push %d is OK\n",e);
	return OK;
	}
status pop(sqstack *s,double *e){
	if(s->top==s->base){
		printf("NULL2\n");
		return ERROR;
		}
	*e=*(--s->top);
 //   printf("pop %d is OK!\n",*e);
	return OK;
	}


 double CalcOneExpress(int expression[][2])
 {
	    // 算术表达式求值的算符优先算法。
   // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。
	double result,theta,a,b;
	int c,index=0;
	sqstack  OPTR;    // 运算符栈,字符元素
   sqstack  OPND;    // 运算数栈,实数元素
   initstack(&OPTR);
   push(&OPTR, 35);
   initstack (&OPND);
   c=expression[index][0];
   while (c!= 35 || gettop(&OPTR)!=35){
//	  printf("while start!\n");
      if (expression[index][1]!=1) {
         push(&OPND, c);
		 index++;
		 c=expression[index][0];
		 
         } // 不是运算符则进栈
     else {  		 
		 switch (precede(gettop(&OPTR), c)) { 
            case '<': 
		//		printf("case <!\n");			  // 栈顶元素优先权低
                 push(&OPTR, c);  				 
					 index++;
					 c=expression[index][0];								 
					  
                 break;
            case '=':   // 脱括号并接收下一字符
                 pop(&OPTR, &c);   				 
				 index++;
				 c=expression[index][0];								 
					  
                 break;
            case '>':   // 退栈并将运算结果入栈
                 pop(&OPTR, &theta);
                 pop(&OPND, &b);  
                 pop(&OPND, &a);
				// printf("q->num_ch is %d\n",q->num_ch);
                 push(&OPND, Operate(a, theta, b)); 
			/*	 if (q->num_ch !=35){
					 index++;
					 c=expression[index][0];
					 
				 	 printf("%d\n",c);*/
			//	 }		
                 break;
			default :
				printf("have not this oper!\n");
				return 0;
         } // switch
      }//else
   } // while
   result=gettop(&OPND);
   printf("the result is %f\n",result);
   return result;
} // EvaluateExpression

/*status CombineResult(int expression[][2],int n)
{
	char s[15];
*/
int Equal24(double dInput)
{
	if (fabs(dInput-24)<0.000001)
	{
		return TRUE;
	}
	return FALSE;
}





int CalcArray2(int iNumInput[2][4])
{
	// (a * b) * c * d	//9 number
	int expression[10][2],ii,jj,i,j,k,l,kk;
	double dRes;
	printf("CalcArray2\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    expression[2][0]=iNumInput[0][i];
                    expression[4][0]=iNumInput[0][j];
                    expression[7][0]=iNumInput[0][k];
                    expression[9][0]=iNumInput[0][l];

					expression[2][1]=eNumber;
					expression[4][1]=eNumber;
					expression[7][1]=eNumber;
					expression[9][1]=eNumber;
					for (ii=0;ii<4;ii++)
					{
						for (jj=0;jj<4;jj++)
						{
							for (kk=0;kk<4;kk++)
							{

									expression[3][0] = oper[ii];
									expression[3][1] = eOperator;
									expression[6][0] = oper[jj];
									expression[6][1] = eOperator;
									expression[8][0] = oper[kk];
									expression[8][1] = eOperator;
									expression[9][0] = oper[6];
									expression[9][1] = eOperator;
									expression[1][0] = oper[4];
									expression[1][1] = eOperator;
									expression[8][0] = oper[5];
									expression[8][1] = eOperator;
									
									dRes = CalcOneExpress(expression);
									if(Equal24(dRes))
									{
									//	CombineResult(expression, 7);//组织结果表达式
									//	printf("%d,%d,%d,%d,%d,%d,%d\n",i,ii,j,jj,k,kk,l);
									//	printf("%d%c\n",expression[i][0],oper[ii]);
										printf("%d%c%d%c%d%c%d\n",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);
										return TRUE;
										
									}
								
							}
						}
					}//end of for oper
				}
			}
		}
	}

	return FALSE;
}


int CalcArray1(int iNumInput[2][4])
{
	// a * b * c * d	//7 number
	int expression[8][2],ii,jj,i,j,k,l,kk;
	double dRes;
	
	printf("CalcArray1\n");
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)    
        {
            if(j==i)
            {
                continue;
            }
            for(k=0;k<4;k++)
            {
                if(k==i||k==j)
                {
                    continue;
                }
                for(l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k)
                    {
                        continue;
                    }
                    expression[0][0]=iNumInput[0][i];
                    expression[2][0]=iNumInput[0][j];
                    expression[4][0]=iNumInput[0][k];
                    expression[6][0]=iNumInput[0][l];

					expression[0][1]=eNumber;
					expression[2][1]=eNumber;
					expression[4][1]=eNumber;
					expression[6][1]=eNumber;
					for (ii=0;ii<4;ii++)
					{
						for (jj=0;jj<4;jj++)
						{
							for (kk=0;kk<4;kk++)
							{

									expression[1][0] = oper[ii];
									expression[1][1] = eOperator;
									expression[3][0] = oper[jj];
									expression[3][1] = eOperator;
									expression[5][0] = oper[kk];
									expression[5][1] = eOperator;
									expression[7][0] = oper[6];
									expression[7][1] = eOperator;																	
									dRes = CalcOneExpress(expression);
									if(Equal24(dRes))
									{
									//	CombineResult(expression, 7);//组织结果表达式
									//	printf("%d,%d,%d,%d,%d,%d,%d\n",i,ii,j,jj,k,kk,l);
									//	printf("%d%c\n",expression[i][0],oper[ii]);
										printf("%d%c%d%c%d%c%d\n",expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]);
										return TRUE;
										
									}
								
							}
						}
					}//end of for oper
				}
			}
		}
	}

	return FALSE;
}


int Calc24(int number[2][4])
{
	//括号的几种情况
	//1	无括号
	//2 (a b) c d		同a b (c d), 下省略
	//3 (a b c) d
	//4 a (b c) d
	//5 (a b) (c d)
	//6 ((a b) c) d
	//7 (a (b c)) d
	int t=0;

	//计算不含括号的情况

	if (CalcArray1(number))
	{
		t=1;
		return TRUE;
	}

	if (CalcArray2(number))
	{
		t=1;
		return TRUE;
	}

/*	if (CalcArray3(number[2][4]))
	{
		bol=1;
		return bol;
	}

	if (CalcArray4(number[2][4]))
	{
		bol=1;
		return bol;
	}

	if (CalcArray5(number[2][4]))
	{
		bol=1;
		return bol;
	}

	if (CalcArray6(number[2][4]))
	{
		bol=1;
		return bol;
	}

	if (CalcArray7(number[2][4]))
	{
		bol=1;
		return bol;
	}*/
	if(t==0)
		{
			printf("These numbers cannot be combined to 24\n");
		}
	return FALSE;
}
void main (){
	Calc24(number);
	//printf("finished main\n");
}

	      

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -