Cómo usar VB para escribir una operación de función cuadrática que admita 24 puntos de números negativos o cualquier valor
Las vacaciones largas siempre me resultan aburridas, así que jugué al juego de cartas de 24 puntos que solía jugar con mis compañeros por aburrimiento. Este juego es muy simple, solo usa suma, resta, multiplicación, división y paréntesis para formar una expresión con un valor de 24 a partir de las cuatro cartas dadas. Pero también hay preguntas interesantes entre ellas. No, simplemente jugamos un rato y encontramos un problema difícil: 3, 6, 6, 10 (en realidad, pensándolo más tarde, esta pregunta no fue demasiado difícil, pero mi mente es). girando, jaja).
Dado que ha surgido el problema, por supuesto que hay que solucionarlo. Mientras pensaba mucho, de repente se me ocurrió una pregunta: ¿por qué no escribir un programa para resolver el problema? ¿No existe tal procedimiento en mandarín? Entonces esta idea debería ser factible. Cuando pensé en esto, inmediatamente comencé a pensar en el algoritmo de este programa. Lo primero que me vino a la mente fue, naturalmente, el método exhaustivo (más tarde descubrí que no podía pensar en un método mejor, lo cual fue triste, jaja). , porque durante este semestre había escrito un pequeño programa que utiliza paréntesis para evaluar expresiones simples. Mientras puedas programar una expresión que consta de cuatro números más símbolos aritméticos, ¿no puedes usar este programa de cálculo para completar el programa para calcular veinticuatro puntos? Después de determinar esta idea, comencé a pensar en los detalles de este tema.
La primera es la cuestión de la viabilidad del agotamiento. Divido las expresiones en las siguientes tres categorías:
1. Expresiones simples sin paréntesis.
2. Una expresión simple con un paréntesis.
3. Una expresión más compleja con dos paréntesis.
El comienzo de una investigación exhaustiva. Ordené los cuatro números dados. El número de tipos posibles es 4*3*2*1=24. Utilizo funciones anidadas para implementar la disposición de cuatro números. El algoritmo es el siguiente:
/* ans[] matrices de varias disposiciones*/
/* c[] cuatro cartas. Matriz de */
/* k[] c[] Una lista de cuatro tarjetas. [] Nombres en clave de cuatro cartas, donde k[I]=I+1.
Utilice esto en lugar de c[] para procesar, teniendo en cuenta que puede haber el mismo número de tarjetas en c[]*/
/* kans[] almacena temporalmente el permutación generada* /
/* j Número de bucles anidados*/
int fans(c,k,ans.kans,j)
int j, k[ ],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4] ;
for(p=0,q=0;p<4;p++)
{ for(r=0, bandera=0;r if(k[p]! =kans [r]) bandera++;
if(bandera==j) t[j][q++]=k[p]; for( s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j]]; /p >
if (j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1];
p>for(h=0;h<3;h++)
symbol(ans, h); /* Agregar símbolos a las expresiones*/
}
else { j++;
fans(c,k,ans,kans,j
j--; }
}
}
Como se describe en la función anterior, después de organizar las cuatro tarjetas, el símbolo del operador se agrega a la expresión, ya que solo hay cuatro, por lo que solo es necesario agregar tres símbolos. Dado que cada símbolo se puede repetir, las posibilidades calculadas son 4*4*4=64:
/* ans[], j como arriba.
sy[] contiene cuatro símbolos, h es una expresión.
int sans(ans,sy,j,h)
char ans[],sy[];int j,h
{ int i, p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j]];
if(j==2)
{ respuesta[5]=sy [k[j]];
{ Respuesta [2*j+1]=sy[k[j]]
{ Respuesta [2*j+1]=sy; [k[j]];
/* Según diferentes expresiones, los símbolos de operación aquí se almacenan en los bits 1, 3 y 5 respectivamente, y luego se procesan en consecuencia*/
}
else { j++; sans(ans,sy,j--,h }
}
}
}
}
Bien, a continuación consideraré cómo manejar diferentes expresiones. Dividí las expresiones en tres categorías porque agregar tres corchetes definitivamente sería repetitivo para cuatro tarjetas. Para el primer caso, naturalmente no se procesará solo sin paréntesis, mientras que para el segundo caso, se pueden resumir seis posibilidades del siguiente código, una de las cuales también es redundante.
para(m=0;m<=4;m+=2)
para(n=m+4;n<=8;n+=2)
Este bucle proporciona el número de posibilidades para agregar paréntesis, donde m y n son las posiciones de los paréntesis izquierdo y derecho agregados a la expresión, respectivamente. Lo que quiero decir con redundante es m=0 y n=8, colocados en cada extremo de la expresión. Esto es realmente redundante, ¿verdad? El último caso es agregar dos paréntesis. Después del análisis, descubrí que solo este formulario no se repetirá: (a b) (c d). ¿Por qué los paréntesis anidados no hacen esto? Porque si tiene paréntesis anidados, el paréntesis exterior debe contener tres números (no necesariamente cuatro), lo que significa que los paréntesis contienen dos operadores separados por otro paréntesis. Luego, si la precedencia de los dos símbolos de operación es la misma, por supuesto, puede eliminar los corchetes mediante algunas conversiones (es posible que desee probar algunos ejemplos), lo que significa que este corchete es innecesario si la precedencia de los dos símbolos de operación; no son iguales, también deben tener esta forma ((a + -b)*/c). Entre estos símbolos de operación, * y / tienen la mayor prioridad, por lo que no es necesario agregar paréntesis fuera de ellos.
En resumen, el número de tipos de expresión posibles es 24*64*(1+6+1)=12,288. Jaja, sólo hay 10.000 posibilidades (también hay duplicados), ¡lo cual es un evento de baja probabilidad para una computadora! De esta forma se completa el análisis exhaustivo y la implantación de viabilidad.
La siguiente pregunta es cómo lidiar con expresiones simples con signo. Esta es una aplicación famosa de pila, entonces, ¿qué es una pila? El concepto de pila se abstrae del proceso de almacenamiento y recuperación de pilas de mercancías en la vida diaria, es decir, las últimas mercancías almacenadas en la pila (grapadas por la salida) son las primeras en salir, en línea con "primero en Principio de primero en salir, último en entrar, primero en salir. Esta estructura es como un clip de bala.
En la pila, insertar elementos se llama empujar o empujar, y elementos se llama hacer estallar o regresar.
La pila tiene tres operaciones básicas, incluidas las operaciones de pila, las operaciones emergentes de la pila y la lectura del elemento superior de la pila. Estas operaciones se mencionan en la información de estructura de datos relevante. Con base en estas operaciones básicas, puede simular una pila con una matriz.
Como aplicación bien conocida de la pila, las expresiones se pueden evaluar de dos maneras.
El primer método:
Primero, cree dos pilas, a saber, la pila de operandos OVS y la pila de operadores OPS, donde la pila de operandos se utiliza para recordar las operaciones en el número de expresión. , el puntero superior de la pila es topv, que inicialmente está vacío, es decir, topv=0 la pila de operadores se usa para recordar los operadores en la expresión, y el puntero superior de la pila es topv=0, que inicialmente es; vacío, es decir, la pila de operadores se usa para memorizar operadores en expresiones, el puntero superior de la pila es topv = 0, que inicialmente está vacío, es decir, topv = 0 se usa para memorizar operadores en expresiones, y el puntero superior de la pila es topp, que inicialmente está vacío, es decir, topp=1, OPS(1)=';'. El ';' aquí es el terminador de expresión.
Luego escanee la expresión a procesar de izquierda a derecha, suponga que el símbolo actualmente escaneado es W y realice el siguiente procesamiento diferente de acuerdo con el símbolo W:
1. Si W es un operador
2. Empuje W en la pila de operadores OVS
3 Continúe escaneando el siguiente carácter
4. p>5. El procesamiento correspondiente se realizará según la naturaleza del operador:
(1) Si el operador es el operador en el paréntesis izquierdo o la prioridad del operador es mayor que la del operador en la parte superior. de la pila de operadores (es decir, OPS (arriba)), luego el operador W será empujado a la pila de operadores OPS y continuará escaneando el siguiente carácter.
(2) Si el operador W es el terminador de expresión ';', y el operador en la parte superior de la pila de operadores también es el terminador de expresión (es decir, OPS(toppp)=';'), entonces procese Fin, en este momento el elemento en la parte superior de la pila de operadores (es decir, OVS (topv)) es el valor de la expresión.
(3). Si el operador W es un paréntesis derecho y el operador en la parte superior de la pila de operadores es un paréntesis izquierdo (es decir, OPS (topp) = '(')), entonces el paréntesis izquierdo será. ser eliminado del operador Salga de la pila y continúe escaneando el siguiente símbolo.
(4). Si el lado derecho del operador no es más grande que el operador en la parte superior de la pila de operadores (es decir, OPS (toppp)), entonces se extraerán dos operadores de la pila de operadores OVS. , y se extraerán los consecutivos. Los operadores se configuran en a y b, luego se extrae un operador de la pila de operadores OPS, se establece en +, y luego se realiza la operación de a + b, y el resultado de la operación será. empujado en la pila del operador OVS. Este operador será reconsiderado la próxima vez.
El segundo método:
Primero linealice la expresión y luego convierta la expresión lineal en una secuencia de instrucciones de máquina para su evaluación.
Entonces, ¿qué es la linealización de expresiones? La forma idiomática de expresar expresiones se llama notación sufija. La característica de la notación postfija es que el operador se ubica en el medio del operando. Sin embargo, esta notación a veces requiere el uso de paréntesis para aclarar el orden de las operaciones y es más complicada de manejar.
En 1929, el lógico polaco Lukasiewicz propuso un sistema de símbolos lógicos sin paréntesis, que más tarde se denominó símbolo polaco. La característica de la expresión polaca es que el operador se ubica después del operando, por eso se llama notación postfija. Las expresiones polacas se evalúan estrictamente de izquierda a derecha. A continuación se dan algunas expresiones y sus correspondientes expresiones polacas.
Expresión Expresión polaca
A-B AB-
(A-B)*C+D AB-C*D+
A* (B +C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/
OK, la llamada expresión La linealización de una expresión se refiere a convertir la expresión representada por el sufijo intermedio en una expresión polaca. Para cada expresión, la pila se puede usar para convertir la expresión en una expresión polaca, o la pila se puede usar para evaluar la expresión polaca.
El proceso de conversión y cálculo es más o menos el mismo que el del primer método, por lo que no entraré en detalles aquí.
El siguiente es el programa de implementación específico de conversión y cálculo:
/* La primera función da la prioridad de cada operador, donde = es el terminador de la expresión* / p>
int primero(char c)
{ int p