Categorías
Otros

Modelo de secuencia

Wuanta curso de aprendizaje de profundidad quinta lección – notas del modelo de secuencia

Wanna crear un modelo de secuencia, su declaración de entrada es la siguiente: «Harry Potter y Herminoe Grange Inventó un nuevo hechizo.», Cómo representar una sola palabra en una oración.

Construir un diccionario, si eliges diccionario de 10.000 palabras, una manera de construir este diccionario es atravesar tu conjunto de entrenamiento, y encontrar las primeras 10.000 palabras comunes, también puedes navegar por algún diccionario de red, te puede decir en inglés Las 10.000 palabras más utilizadas, a continuación puedes usar la representación One-Hot para representar cada palabra en el diccionario.

Por ejemplo, aquí x <1> representa palabras de Harry, es una línea de 2075 es 1, el resto del valor es vector, porque ese es Harry en este diccionario.

Esta representación es para supervisar el aprendizaje, con (x, y) etiquetas de datos, X se refiere a cualquier palabra de la oración, es un vector de un solo hot, porque sólo tiene un valor de 1 es 0, por lo que habrá 9 vectores uno-HOT para representar 9 palabras en esta oración, el propósito es representar X, y utilizar el modelo de secuencia para establecer una asignación entre X y la salida de destino Y.

Si ha encontrado una palabra en la tabla de palabras, la respuesta es crear una nueva marca, que es una pseudo palabra llamada Palabra no conocida, que se utiliza como una etiqueta para indicar las palabras que no están en la tabla de palabras.

1.3 Modelo de red neuronal circulante (modelo de network neural recurrente)

La red neuronal circulante está hecha. Cuando lee la segunda palabra de la oración, se supone que es x <2> no predice Y <2> con x <2>, también introducirá información del paso 1 de algún tiempo. Específicamente, el valor de activación del paso de tiempo 1 se pasa al paso de tiempo 2.

Desde el último paso de tiempo, la X es predecir Y, en cada paso de tiempo, la red neuronal cíclica transmite un valor de activación al siguiente paso de tiempo para el cálculo. En este ejemplo, la longitud de la secuencia de entrada y la longitud de la secuencia de salida son las mismas.

La red neuronal circulante se escanea de izquierda a derecha, y los parámetros de cada paso de tiempo también se comparten.
Utilizamos WAX para administrar una serie de parámetros desde X <> hasta la capa oculta, cada paso de tiempo es el mismo parámetro Wax, y el valor de activación es la conexión horizontal determinada por el parámetro waa. Al mismo tiempo, cada paso de tiempo utiliza el mismo parámetro WAA, el mismo resultado de salida es determinado por WYA.

Proceso de pre-transmisión RNN

Esquema de comunicación de reenvío RNN:

1.4 Expresarse a través del tiempo

Para calcular la propagación inversa, todavía necesita una función de pérdida, primero defina una función de pérdida de elemento

Corresponde a una palabra específica de la secuencia. Si es el nombre de una persona, el valor de Y es 1, y la red neuronal generará esta palabra es el valor de probabilidad del nombre, como 0.1. Lo defino como una función estándar de pérdida de regresión lógica, también llamada pérdida de entropía cruzada.
Ahora vamos a definir la función de pérdida de toda la secuencia y definir la L como

Es decir, se agrega la función de pérdida de cada paso de tiempo individual.

El algoritmo de propagación inversa necesita calcular y transmitir información en la dirección opuesta. Al final, haga lo que haga, puede calcular toda la cantidad adecuada después de esto, luego puede pasar los parámetros relacionados derivados, utilizar métodos de colocación de degradado para actualizar los parámetros.

Esquema de comunicación inversa RNN:

.

Categorías
Otros

PAT Una suma máxima de subsecuencia de grado 1007

El tema es muy bueno:
da un rigor de los enteros K, una subsecuencia continua se define como ** {ni, ni + 1, …, nj} && 1 <= i <= j <= k **, la subsecuencia máxima es una subsecuencia continua del elemento más grande y la secuencia continua, y se obtiene el primer elemento, se obtiene el último elemento.

Entrar:
1 primera línea de un entero positivo K
2 segunda línea k enteros

Salida:
Esta subsecuencia continua y el primer elemento, el último elemento.
** Requisitos: ** Si esta sub-secuencia máxima no es única, el orden de salida es mínimo.
Si los números k son negativos, salida 0, el primer elemento de secuencia original, el último elemento

Idea:
Planificación dinámica, establezca una matriz NUM para almacenar este K digital, DP almacena la suma de los subsecuentes máximos.
Dp [i] se almacena en la suma de los subsecuentes máximos que terminan con NUM [i].
Ecuación de transferencia de estado:Dp[i]= max(num[i]Dp[i-1]+num[i])

Código:

#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int num[10005];
int dp[10005];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    scanf("%d",&num[i]);
    dp[0]=num[0];
    for(int i=1;i<n;i++)
    {
        dp[i]=max(dp[i-1]+num[i],num[i]);
    }
    int k=0;
    for(int i=1;i<n;i++)/ / From a small to large enumeration, find the minimum order of the maximum subsequence
    {
        if(dp[i]>dp[k])
        k=i;
    }
    if(dp[k]<0)
    {
        printf("0 %d %dn",num[0],num[n-1]);// The maximum subsequence is a negative, the original sequence is affirm that it is negative
    }
    else
    {
        int sum=0;
        int index;
        for(int i=k;i>=0;i--)
        {
            sum+=num[i];
            index=i;
            if(sum==dp[k])
            {
                printf("%d %d %dn",dp[k],num[index],num[k]);
            }
        }
    }
    return 0;
}

.

Categorías
Otros

[MYSQL Statement Optimization] (Artículo 3) Optimización de detalles simples

Creo firmemente que los detalles determinan el éxito o el fracaso, no mire estas pequeñas optimizaciones!

Uno: Solo tiene que usar el límite 1 siempre y cuando consulte una línea de datos.

Las siguientes condiciones de optimización deben utilizarse según el escenario de desarrollo real

1: [Use union all instead of or]

[Between instead of in, not in]

Las operaciones de expresión de los campos pueden provocar un error de índice

[LIKE blurring query should be noted that% must fail at the left side of the query condition (% xx%,% xx))]


DosVarios principios de indexación

1, el principio más importante, principio muy importante, MySQL siempre coincidirá con el derecho a la consulta correcta (>, <, Entre, Como) detener la coincidencia, tales como A 1 = «» y = «» b = » 2 «c =»> 3 y D = 4 Si se puede utilizar el índice de la secuencia de secuencia (A, B, C, D), D, si se establece el índice de (A, B, D, C) Se puede utilizar en el orden de A, B y D.

2, = y IN se puede secuenciar, como A = 1 y b = 2 y c = 3 el índice de establecimiento (A, B, C) puede estar en cualquier orden, el optimizador de consultas de Mysql le ayudará a optimizar la forma de un índice para identificar

3. Trate de seleccionar una lista de alta definición como índice, la división de la división es conteo (COL distinto) / recuento (*), lo que indica que el campo no se repite, cuanto mayor sea el número de registros que escaneamos, se distinga la clave única El grado es 1, y algunos estados, el campo de género puede dividirse en 0 frente al big data, que algunas personas pueden preguntar, ¿hay alguna experiencia en esta proporción? Diferente usando la escena, este valor también es difícil de determinar, los campos de Join us necesitan ser 0.1 o más, es decir, 1 escaneo de 10 registros

4, la columna de índice no puede participar en el cálculo, mantener la columna «limpia», como from_unixtime (CREATE_TIME) = ‘2014-05-29’, no se puede utilizar el índice, el motivo es simple, el árbol B + se almacena en la tabla de datos de la tabla de datos. Sin embargo, al realizar la recuperación, debe aplicar una función a todos los elementos para comparar, obviamente demasiado costo. Por lo tanto, la declaración debe escribirse en create_time = UNIX_TIMESTAMP (en lo que va de 2014-05-29»);

5, intente ampliar el índice, no cree un nuevo índice. Por ejemplo, hay un índice de A en la tabla, ahora agregue (A, b) índice y, a continuación, solo necesita modificar el índice original

En tercer lugar, seleccione el motor de almacenamiento adecuado para la tabla:
Myisam: Aplicación y operación de inserción al aplicar, sólo una pequeña cantidad de actualización y eliminación, y la integridad de la transacción no es muy alta.

Innodb: Procesamiento de transacciones y requisitos de coherencia en condiciones de simultaneidad. Además de la inserción y la consulta, hay muchas actualizaciones y eliminaciones. (InnoDB reduce eficazmente el bloqueo y la actualización causados por el bloqueo). Para la tabla de tipos INNODB que admite la transacción, la razón principal de la velocidad es que la configuración predeterminada de AutoCommit está abierta y el programa no llama explícitamente a Las transacciones iniciales de BeGin, lo que resulta en la confirmación automática de cada inserción, lo que afecta gravemente a la velocidad. Se puede llamar a Begin antes de ejecutar SQL y varios formularios SQL (incluso si AutoCommit está abierto), mejorará en gran medida el rendimiento.

.

Categorías
Otros

Decodificación codificada y copia de secuencia de caracteres archivo Java

Codificación y decodificación y flujo de caracteres

1, codificación y decodificación

2, utilice una función de salida y entrada de secuencia de caracteres
Salida
(1),OutputStreamWriter(OutputStream out)
Cree OutputStreamWriter mediante el juego de caracteres predeterminado.

(2),OutputStreamWriter(OutputStream out, String charsetName)
Cree OutputStreamWriter mediante el juego de caracteres especificado.

3. Utilice la salida de flujo de caracteres de búfer y la función de entrada para almacenar en búfer la nueva línea específica de la secuencia de salida de caracteres () y la secuencia de entrada de caracteres de búfer.

4. Utilice las características del búfer para completar la copia del archivo Java.

En primer lugar, codificación y decodificación

String s = "China";
		byte[] byt =null;
		try {
			 byt = s.getBytes("GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println(Arrays.toString(byt));
	}

Resultado:

Texto China, usamos GBK para decodificar, obtener [-42, -48, -71, -6], una palabra china corresponde a dos bytes.

A continuación queremos decodificar el UTF-8 más utilizado en Unicode.

UTF-8 decodifica para obtener [-28, -72, -83, -27, -101, -67], correspondiente a 3 bytes de caracteres chinos.
En este momento, creemos que si usa código GBK, ¿qué pasará con la decodificación UTF-8?

byte[] byt = new byte[] {-42, -48, -71, -6};
		try {
			System.out.println(new String(byt, "UTF-8"));
		} catch (UnsupportedEncodingException e) {	
			e.printStackTrace();
		}
	}

 En este momento, la salida es confusa, cambiamos a decodificación GBK.
 Por lo tanto, utilice una codificación de conjunto de codificación de caracteres, debe usarla en la decodificación, de lo contrario habrá problemas confusos.

En segundo lugar, la salida y la entrada de la secuencia de caracteres

FileInputStream in = new FileInputStream("src//file//demo01.txt");
	FileOutputStream out = new FileOutputStream("src//file//demo01.txt");
	OutputStreamWriter ow = new OutputStreamWriter(out);
	InputStreamReader ir = new InputStreamReader(in);
	char[] charr1 = "hellow,world".toCharArray();
	ow.write(charr1);	
	int data;
	while((data = ir.read()) != -1)
		System.out.print((char)(data));
	ir.close();
	ow.close();
	

Resultado:

Hemos encontrado que dos secuencias se operan mientras podemos ver que hay contenido en el archivo, pero utilice el método de lectura para leer Return -1. Estamos creando secuencias de entrada después de cerrar la secuencia de salida a través de la prueba.

FileOutputStream out = new FileOutputStream("src//file//demo01.txt");
	OutputStreamWriter ow = new OutputStreamWriter(out);	
	char[] charr1 = "hellow,world".toCharArray();
	ow.write(charr1);	
	ow.close();
	FileInputStream in = new FileInputStream("src//file//demo01.txt");
	InputStreamReader ir = new InputStreamReader(in);
	int data;
	while((data = ir.read()) != -1)
		System.out.print((char)(data));
	ir.close();
}
}

Resultado:

Por lo tanto, podemos concatenar, las secuencias de salida y las secuencias de entrada no pueden operar un archivo al mismo tiempo, y la secuencia de salida debe desactivarse para usar la secuencia de entrada al mismo tiempo. Además, debe apagarse después de usar un flujo.(1, si la secuencia de salida no escribe el contenido del archivo, es muy probable que la secuencia no esté cerrada.
2, Close libera recursos, en lugar de contener recursos, puede reclamar automáticamente objetos, expresados como memoria asignada a memoria pero no puede reciclar recursos, y puede causar agotamiento de recursos si no realiza Close. )

En tercer lugar, el uso del flujo de almacenamiento en búfer y su método específico

FileOutputStream out = new FileOutputStream("src//file//demo01.txt");
	OutputStreamWriter ow = new OutputStreamWriter(out);
	BufferedWriter bw = new BufferedWriter(ow);	
	char[] charr1 = "hellow,world".toCharArray();
	bw.write(charr1);
	bw.newLine();
	bw.flush();// Write a line to use Flush, refresh the stream buffer.
	bw.write("Hello there");
	bw.close();
	ow.close();
	out.close();
	FileInputStream in = new FileInputStream("src//file//demo01.txt");
	InputStreamReader ir = new InputStreamReader(in);
	BufferedReader br = new BufferedReader(ir);
	String s;
	while((s = br.readLine()) != null) {
		System.out.print(s);
	}
	br.close();
	ir.close();
	in.close();

Resultado:

Hemos encontrado que la nueva línea no se lee, por lo que cada una de las necesidades de cada lectura necesita ser envolvente.
Resultado:

Cuarto, utilice el flujo de búfer para copiar archivos Java

Pasaremos un FileWriter y FileReader objetos a la secuencia de búfer, que es más fácil de usar.

FileWriter writer  = new FileWriter("src//file//copy.java");
	BufferedWriter bw = new BufferedWriter(writer);	
	FileReader reader = new FileReader("src//home_work//Test_27.java");
	BufferedReader br = new BufferedReader(reader);
	String s;
	while((s = br.readLine()) != null) {
		bw.write(s);
		bw.flush();
		bw.newLine();
		
	}
	bw.close();
	writer.close();
	br.close();
	reader.close();
}

Resultado:
 Lo anterior se utiliza directamente para producir anomalías de E/S y no se utiliza la estructura TRY-CATCH. Y con el fin de facilitar la escritura del método Close en el bloque de código Finally, es necesario utilizar el método descrito anteriormente en el proyecto para escribir la conformidad.

.

Categorías
Otros

Secuencia de Python tipo 2 (tupla de tupla)

Tupla

La tupla es similar a la lista y los elementos de la tupla no se pueden cambiar.
lista y tuplas se pueden convertir entre sí
Ventajas

  • Proteger los datos sin procesar
  • Obtenga una velocidad de recorrido más rápida

1. Creación de la tupla

tup=(1,2)
tup1=(1,)
tup2=('a','b','c')

La creación de la tupla solo se puede agregar a los paréntesis para agregar un elemento dividido por una coma.
Nota: Cuando solo hay un elemento en el grupo de ing, debe agregar un elemento secundario después de que el elemento no esté claro.

tup=(1)
tup1=(1,)
print(type(tup))
print(type(tup1))
<class 'int'>
<class 'tuple'>

2. Acceso a la tupla

Se puede acceder a los elementos de la tupla mediante un valor de índice o un sector

tup=(1,2,3,4,5)
print("The first element is:",tup[0])
print("The first to third elements is,",tup[:3])
print("The group is:",tup)

El resultado de la operación es el siguiente

The first element is: 1
 The first one to the third element is, (1, 2, 3)
 The group is: (1, 2, 3, 4, 5)

3. Modificación de la tupla

Los elementos de la tupla no se pueden modificar, pero podemos crear un nuevo grupo de ing y empalmar el grupo de tuplas.

tup=('China','United States','United Kingdom','France')
tup1=('Germany','Japan','Italy')
tup2=tup1+tup
#tup [1] = 'Canada' error ingline elements cannot be modified
print(tup2)

El resultado de la operación es el siguiente

('Germany', 'Japan', 'Italy', 'China', 'United States', 'United Kingdom', 'France')

4. Eliminar la tupla

Los elementos de la tupla no pueden ser modificados naturaleza, pero podemos usarlo.del Método Eliminar toda la tupla

tup=('China','United States','United Kingdom','France')
print(tup)
del tup
print(tup)

El resultado de la operación es el siguiente

NameError: name 'tup' is not defined  # Here I have deleted the entire tuple, TUP has been recycled
('China', 'United States', 'United Kingdom', 'France')

5. Método incorporado

CMP (tupla1, tupla2) (!! Método integrado python2) Comparar dos elementos de tupla
Operator.eq (TUP, TUP2) (método integrado python3) Comparar dos elementos de tupla
len(tupla) Calcular el número de elementos de peaje
max(tupla) Devuelve el elemento máximo en la tupla
min(tupla) Valor mínimo del elemento devuelto en la tupla
tupla(seq) Convierta la lista en un grupo de tuplas
5-1 comparar dos elementos Operator.eq ()

El método de comparación integrado en Python2 es CMP (tupla1, tupla2) y el método se cancela en Python3. En su lugar, es operator.eq () y es necesario importar la biblioteca del operador cuando se utiliza.
Tome Python3 aquí como ejemplo

import operator
tup=(1,2,3)
tup_1=(1,2,4)
tup1=('a','b','c')
tup1_1=('a','c','b')
tup1_2=('a','b','c','d')
tup2=("hello",)
tup2_1=("halo",)
print(operator.eq(tup,tup_1)) #      
print(operator.eq(tup1,tup1_1))# Characters and characters
print(operator.eq(tup1,tup1_2))# Characters and characters
print(operator.eq(tup2,tup2_1))# String with strings
print(operator.eq(tup,tup2_1))#      

La tupla mixta también se puede comparar
El resultado de la operación es el siguiente

False
False
False
False
False
5-2 Calcular la longitud de la tupla Len (tupla)
tup=(1,2,3,4,5)
print(len(tup))

El resultado de la operación es el siguiente

5
5-3 Calcular el valor máximo (tupla) y mínimo menos MIN (Tupla)
tup=(1,2,3,4,5)
tup1=('a','b','c','c')
tup2=('hello','helloa','halo')
print(max(tup))
print(max(tup1))
print(max(tup2))

El resultado de la operación es el siguiente

5
c
helloa
5-4 lista Convertir a tupla TUPLE (LISTA)
list1=[1,2,3,4]
print(tuple(list1))

El resultado de la operación es el siguiente

(1, 2, 3, 4)
Grupo Yuan derivado

Lo mismo es lo mismo que la lista, la tupla también se deriva, y se utiliza para generar un determinado elemento regular y ponerlo en una tupla.

tup1=(x for x in range(10) if x%2==0)
print(tup1)
print(tuple(tup1))

El resultado de la operación es el siguiente

<generator object <genexpr> at 0x000002060A70B408>
(0, 2, 4, 6, 8)

Nota: El iterador se genera directamente con el
Requiere convertir al tipo TUPLE

.

Categorías
Otros

Fijación interna, cuidado postoperatorio _ pacientes fracturados rehabilitan, placas de acero deben ser sacadas? Los rumores del médico, enseñarle a decidir de acuerdo con la condición …

No demasiado, unoLos pacientes causaron gran confusión debido a los médicos debido a las placas de aceroNo es porque la enfermedad sea más complicada, sino porque no es posible hacer un diagnóstico mejor y claro. El muslo del paciente es muy largoPlaca de aceroY esta placa de acero es hace 20 años, porque la fractura se coloca, el material esMetal ordinario, no placa de titanio

La pregunta del paciente se consideraDaños en la tabla de media luna en el mismo ladoEs necesario hacer un magnético nuclear para confirmar aún más el diagnóstico. Se determina si es un tratamiento conservador o quirúrgico, pero debido a que el magnético nuclear no se puede llevar a cabo, la cirugía según los síntomas del paciente es muy eficaz, pero le preocupa que el tratamiento conservador sea pobre, por lo que es muy problemático.

Finalmente negoció con el pacienteTratamiento conservadorAfortunadamente, el tratamiento conservador sigue siendo mejor, pero no sé cuánto dura el efecto, esto es típico.Debido a que la placa de acero no tiene un caso en el que los efectos médicos tienen, A continuación, hacer los materiales de fijación interna en el cuerpo de la ortopedia, ¿necesita sacarlo? Hablemos de este problema hoy.

53a750cad566d8d51fc324bffd7adfb5.png

De hecho, los consumibles fijos internos no toman, hay muchos factores que influyen.

Material

Si los consumibles fijos internos sonAleación de titanioSi no afecta a la belleza, no causa un impacto especial, se puede dejar en el cuerpo. Debido a estos materiales, no afecta a la futura inspección magnética nuclear del paciente.No afectará a los pacientes en el tratamiento futuro, esto es muy importante

Pero si esMetal ordinarioOAlambreLa existencia, entonces se recomienda poner lo interno al orden después de la cicatrización de la fractura, de lo contrario afectará el diagnóstico y tratamiento de otras enfermedades.

Parte

Fractura adicional¿Es la parte la necesidad de sacar en la fijación interna, afectando es másPor ejemplo, la fractura del hilo superior de las extremidades superiores, esta posición a menudo no está lidiando con fracturas, en primer lugarNervio tibialEsta neurona se disecciona, evitando a fondo la posibilidad de daño a la obstrucción, y luego procesa la fractura.

9bb98c6c604b0f590529bf36c5b9539f.png

Después de la cicatrización de la fractura del paciente,El nervio neutro puede formar adherencias con el perímetro.Aunque no afecta a las actividades del paciente, si se fija de nuevo, es muy difícil encontrar el paso ilegítimo, que es muy difícil encontrar el proceso.Daños a la Por lo tanto, generalmente recomendamos que los pacientes con fracturas en el centro de las extremidades superiores no estén fijos.

93dc7aaf84f80785394a4f89ff2d62b6.png

AlternativaFracturas pélvicas, esta cirugía en sí tiene unDebido a que hay un vaso sanguíneo muy rico y nervios alrededor de la pelvis, es posible causar daños muy graves, por lo que después de que la operación es exitosa, no hay necesidad de sacar la uña del riesgo.

399f40d7f44b80d0a077df4f227d4994.png

Edad

Si el paciente es relativamente ligero, se recomienda tomar la fijación interna después de la fractura o la cicatrización del daño. en caso deLa edad es relativamente grandePor ejemplo, más de 60 años de edad, entonces se recomienda que no hay necesidad de tomar el riesgo de cirugía, aumentar la carga económica para eliminar la fijación interna.

Características quirúrgicas

AdemásHay algunas fijaciones internas que son completamente innecesarias.Es muy pequeño en el campo de la medicina deportiva, y esAleación de titanioCuando estás en su lugar, no necesitas sacarlo, como el tratamiento de lesiones de ligamentos, ligamentos, tendonesAnclaSe coloca en el hueso, por lo que tal consumible no necesariamente se saca.

94139cd70a70af3f5611b2d43abe0aa1.png

AlgunosSe necesita la fijación interna de la operación.Por ejemplo, después de la dislocación de la articulación del bloqueo del hombro, algunos los médicos elegirán ponerlo.Placa de acero de ganchilloEsta placa de acero puede afectar la función de la articulación del hombro del paciente, por lo que después de un período de recuperación postoperatoria, sacarlo.

263f663a0fe1585de3b27c03561983e2.png

¿Hay un descanso fijo y se cae?

A veces los consumibles fijos son demasiado largos en nuestro cuerpo, es posible suceder.RomperTambién es posible aparecerTornillo fijo que se caeEsta situación también es más común, hay tal situación, lo que sugiere que todavía se saca. Debido a que a veces caerse de los tornillos estimulará el tejido blando circundante, lo que resulta enDolor y derrame,Grave puede causar infección.

Factores psicológicos

Los factores psicológicos postoperatorios también tienen un cierto impacto en los pacientes, como algunos amigos piensan que su cuerpo está en estas fijaciones internas.organismo extranjeroEs muy probable que la exclusión ocurra o cause algunos efectos adversos, por lo queEl corazón siempre está inquieto,Si no lo sacas, siento que hayAnsiedadEn este caso, si la dificultad quirúrgica no es grande, no aumentará el riesgo de traumatismo, debe tomarse, no afectar la mentalidad del paciente.

a7262293a604304d7ea4d7dc4e1e16b1.png

para resumir

Si es necesario eliminar los consumibles fijos internos,Variar de persona a personaporqueVariar de la condición¿Necesitas sacarlo, debes hablar de tu propio médico principal con cuchillos? Si el riesgo de arreglar el coche es demasiado grande, es posible causar más daños, entonces se recomienda mantener en el cuerpo.

Insisto en que Xie Xinhui, explicando el conocimiento complejo de la enfermedad con lenguajes simples, palabras en clave no son fáciles, si usted piensa que este artículo es útil para usted, por favor reenvíe este artículo a los amigos que necesita, gracias!

9cdad1268ab64f29b65bcf905b75823f.png

# v ## ## #

.

Categorías
Otros

Consejos de IF

Escritura general:

if (status===1) {
  return 'a'
} else if(status===2) {
  return 'b'
} else if(status===3) {
  return 'c'
} else if(status===4){
  return 'd'
} else if(status===5){
  return 'e'
} else {
  return 'f'
}

Escritura fácil:

function test (val) {
	  let obj = {
		1: 'a',
		2: 'b',
		3: 'c',
		4: 'd',
		5: 'e',
		6: 'f'
	  }
	  return obj[val]
	}
	let name1 = test(2)
	console.log(name1)

.

Categorías
Otros

Algoritmo basado en la visualización de la implementación de Qt (Hannota)

UnirseAlgoritmo basado en la visualización de la implementación de Qt (cobertura de tablero de ajedrez, Hannota, proveedor de viajes)Este artículo proporciona principalmente la implementación específica de la edición de Hannota.

Este artículo proporciona la implementación dinámica de Hanota Mobile. Aunque QT tiene una clase de animación, pero la impotencia no es un corto tiempo, no se utilizará en poco tiempo, es decir, el rectángulo se renovable continuamente en un corto período de tiempo, en el que se logra el efecto de movimiento dinámico. Además, la Torre Hanno es un problema recursivo. Si dibuja bordes, tendrá el caso en el que la velocidad de trazado no coincide, de modo que el contador sea caótico. Por lo tanto, la idea final es similar al problema del tablero de ajedrez, es decir, el movimiento inicial de cada paso en el problema hannota se registra inicialmente de nuevo y luego implementar dinámicamente estos movimientos. Comentarios de código específicos.

archivo de cabeza:

#ifndef HANOI_H
#define HANOI_H

#include <QWidget>
#include <QPushButton>
#include <QPixmap>
#include <QTimer>
#include <QPainter>
#include <QLineEdit>
#include <QLabel>
#include <stack>

class hanoi : public QWidget
{
    Q_OBJECT
public:
    explicit hanoi(QWidget *parent = 0);

    void return_main(); //back to main interface

    void setInit();     / / Generate Hanno Tower on the plate

    void setpath(int n, int a, int b, int c);     / / Generate Hannota mobile path

    // Hannota's movement is realized by continuously redrawing images in a short period of time
    void hanioMove();       // Hanno's movement
    void recMove_up();      // Rectangular moves upward
    void recMove_hor();     // Rectangular horizontal movement
    void recMove_down();    // Rectangular move downward

protected:
    void paintEvent(QPaintEvent *ev);   // Drawing event, used in Hanno Tag

signals:
    void return_sign();     / / Return to the signal of the main interface

public slots:

private:
    // B1 is "Return to the Main Interface" button, B2 is "Start Move" button, B3 is "OK" button
    QPushButton b1, b2, b3;

    QPixmap *pix;           // Hannota image
    QLineEdit lineEdit;     // line text editor, used to read K value
    QLabel label;           // Used to display the input prompt of the line text editor

    QTimer timer1, timer2, timer3;      // Rectangular translation timer

    int num;                            // Number of trays on the initial column of Hannota
    int x[10], y[10], w[10], h[10];     / / The horizontal section of each tray and the length of the tray, the height

    int moveNum, nowMove;           // Hanno Tita issue total movement and current movement
    int path[100][2];               // Hannota problem mobile path, Path [i] [0] is the starting column, Path [i] [1] is the target column
    int id, st, des;                // Currently moving plate, start column, target pillar

    std::stack<int> pillar[3];      // Current state of three columns

    bool moveFlag;                  // Record the correctness of the input data
};

#endif // HANOI_H

Archivo CPP:

#include "hanoi.h"
#include <QPen>
#include <QBrush>
#include <QDebug>
#include <QString>
#include <QtGlobal>
#include <QMessageBox>
#include <QFont>

hanoi::hanoi(QWidget *parent) : QWidget(parent), moveFlag(false)
{
    // Window setting
    setWindowTitle(Hanno Tag issue);
    resize(1000, 650);

    // button setting
    b1.setParent(this); b2.setParent(this); b3.setParent(this);                 // Set the parent class
    b1.setText("back to main interface"); b2.setText("Start"); b3.setText("determine");       // Set button content
    b1.move(725, 425); b2.move(725, 325); b3.move(830, 224);                    // Set button position
    b1.show(); b2.show(); b3.show();                                            / / Set button is displayed in the parent window
    b1.resize(150, 40); b2.resize(150, 40); b3.resize(50, 27);                  // Set button size
    // Set button style
    b1.setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;font:15px;");
    b2.setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;font:15px;");
    b3.setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;font:15px;");

    / / Draw the initial background
    pix=new QPixmap(500, 500);
    QPainter p(pix);
    pix->fill(Qt::white);                   // Background Fill
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::black));
    p.drawRect(0, 400, 500, 100);           // Painting the base
    QPen pen(Qt::black); pen.setWidth(3);
    p.setPen(pen);
    for(int i=0; i<3; i++)                  // Picture
        p.drawLine(100+i*150, 100, 100+i*150, 400);

    // Enter the settings of the prompt interface
    label.setParent(this);                          // Set the parent class
    label.setText("Please enter an integer from 1 to 6:");        // Set the prompt content
    label.move(720, 125);                           // Set the prompt location
    label.resize(300, 100);                         // Set the prompt size
    label.setStyleSheet("font:15px;");              // Set the prompt interface style
    label.show();                                   // Set the prompt interface display in the parent window

    // line text editor setting
    lineEdit.setParent(this);   // Set the parent class
    lineEdit.move(725, 225);    // Set the editor location
    lineEdit.resize(100, 25);   // Set the editor size
    lineEdit.setStyleSheet("border:2px groove gray;border-radius:10px;padding:2px 4px;");   // Set the line text editor style
    lineEdit.show();            / / Set the editor to display in the parent window

    / / Connection signal and groove function
    connect(&b1, &QPushButton::clicked, [=]()
    {
        / / Draw the initial background
        delete(pix);
        pix=new QPixmap(500, 500);
        QPainter p(pix);
        pix->fill(Qt::white);               // Background Fill
        p.setPen(QPen(Qt::white));
        p.setBrush(QBrush(Qt::black));
        p.drawRect(0, 400, 500, 100);       // Painting the base
        QPen pen(Qt::black); pen.setWidth(3);
        p.setPen(pen);
        for(int i=0; i<3; i++)              // Picture
            p.drawLine(100+i*150, 100, 100+i*150, 400);

        timer1.stop(); timer2.stop(); timer3.stop();    / / Timer stops
        lineEdit.clear();                               // Text Editor Clears
        return_main();                                  //back to main interface
    });
    connect(&b2, &QPushButton::clicked, this, &hanoi::setInit);    // For special processing of moving directly click
    connect(&b2, &QPushButton::clicked, this, &hanoi::hanioMove);  // Hanno Tower Mobile
    connect(&b3, &QPushButton::clicked, this, &hanoi::setInit);    / / Generate Hanno Tower on the plate
    connect(&timer1, &QTimer::timeout, this, &hanoi::recMove_up);  / / Connect Timer1 and upward
    connect(&timer2, &QTimer::timeout, this, &hanoi::recMove_hor); / / Connect Timer2 and horizontal movement
    connect(&timer3, &QTimer::timeout, this, &hanoi::recMove_down);/ / Connect Timer3 and downward movement
}

/ / Return to the slot function of the main interface
void hanoi::return_main() {emit return_sign();}

// Drawing event
void hanoi::paintEvent(QPaintEvent *ev)
{
    QPainter p(this);
    p.drawPixmap(100, 50, *pix);    / / Draw an image in position (100, 50)
    QWidget::paintEvent(ev);
}

/ / Generate Hanno Tower on the plate
void hanoi::setInit()
{
    / / Get the number of trays of Hanno
    QString Q = lineEdit.text();
    num = Q.toInt();

    timer1.stop(); timer2.stop(); timer3.stop();    / / Terminate last move

    // Data initialization
    moveNum=0; moveFlag=false;
    for(int i=0;i<3;i++)
        while(pillar[i].size())
            pillar[i].pop();

    // If the input is less than or equal to 0 or greater than 6, a warning box is given.
    if(num<=0 || num>6)
    {
        QMessageBox qmb(QMessageBox::Warning, "caveat", "Your input is incorrect, please re-enter!", QMessageBox::Close);
        qmb.resize(200, 300);
        moveFlag = false;   // Record input data incorrect
        qmb.exec();
    }
    else
    {
        // Initialization image
        delete(pix);
        pix=new QPixmap(500, 500);

        / / Draw the initial background
        QPainter p(pix);
        pix->fill(Qt::white);               // Background Fill
        p.setPen(QPen(Qt::white));
        p.setBrush(QBrush(Qt::black));
        p.drawRect(0, 400, 500, 100);       // Painting the base
        QPen pen(Qt::black); pen.setWidth(3);
        p.setPen(pen);
        for(int i=0; i<3; i++)              // Picture
            p.drawLine(100+i*150, 100, 100+i*150, 400);

        moveFlag=true;

        // Draw Hanno Tag
        for(int i=1; i<=num; i++)
        {
            pillar[0].push(i);
            w[i]=100-(i-1)*10; h[i]=30;
            x[i]=100-w[i]/2; y[i]=400-i*30;

            p.setPen(QPen(Qt::white));
            p.setBrush(QBrush(Qt::black));
            p.drawRect(x[i], y[i], w[i], h[i]);
        }
        update();
    }
}

//Move up
void hanoi::recMove_up()
{
    QPainter p(pix);

    // Wipe the rectangle
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::white));
    p.drawRect(x[id], y[id], w[id], h[id]);

    // Supplement
    if(y[id]+h[id] > 100)
    {
        QPen pen(Qt::black); pen.setWidth(3);
        p.setPen(pen);
        p.drawLine(100+st*150, 100, 100+st*150, y[id]+h[id]);
    }

    / / Moving 1 pixel up
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::black));
    y[id]-=1;
    p.drawRect(x[id], y[id], w[id], h[id]);

    update();

    if(y[id] == 50) // If moved to the ordinate of 50, move the upward to move, start horizontal movement
    {
        timer1.stop();
        timer2.start(1);
    }
}

// Left and right
void hanoi::recMove_hor()
{
    QPainter p(pix);

    // Wipe the rectangle
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::white));
    p.drawRect(x[id], y[id], w[id], h[id]);

    if(st<des)      / / Light 1 pixel
    {
        p.setPen(QPen(Qt::white));
        p.setBrush(QBrush(Qt::black));
        x[id] += 1;
        p.drawRect(x[id], y[id], w[id], h[id]);

        update();

        if(x[id] == 100 + des*150 - w[id]/2)    // If moved to the upper end of the target column, the translation stops and starts downward.
        {
            timer2.stop();
            timer3.start(1);
        }
    }
    else            / / Translate 1 pixel to the left
    {
        p.setPen(QPen(Qt::white));
        p.setBrush(QBrush(Qt::black));
        x[id] -= 1;
        p.drawRect(x[id], y[id], w[id], h[id]);

        update();

        if(x[id] == 100 + des*150 - w[id]/2)    // If moved to the upper end of the target column, the translation stops and starts downward.
        {
            timer2.stop();
            timer3.start(1);
        }
    }
}

/ / Move 1 pixel down
void hanoi::recMove_down()
{
    QPainter p(pix);

    // Wipe the rectangle
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::white));
    p.drawRect(x[id], y[id], w[id], h[id]);

    // Supplement
    if(y[id]+h[id] > 100){
        QPen pen(Qt::black); pen.setWidth(3);
        p.setPen(pen);
        p.drawLine(100+des*150, 100, 100+des*150, y[id]+h[id]);
    }

    // Update layout
    p.setPen(QPen(Qt::white));
    p.setBrush(QBrush(Qt::black));
    y[id] += 1;
    p.drawRect(x[id], y[id], w[id], h[id]);

    update();

    if(y[id] == 400 - 30*((int)pillar[des].size())) // If you move to the target location, the translation stops
    {
        timer3.stop();

        nowMove++;
        if(nowMove < moveNum)   // If the move is not over, nowMove points to the next mobile path.
        {
            st=path[nowMove][0]; des=path[nowMove][1];
            id = pillar[st].top();

            timer1.start(1);

            pillar[des].push(id);   // Press the current square into the target stack
            pillar[st].pop();       // Put the current square from the beginning stack
        }
        else                    / / The end is ended, and the data is initialized
            moveFlag = false;
    }
}

// Hanno Tower Mobile
void hanoi::hanioMove()
{
    if(moveFlag)
    {
        // Generate the path
        moveNum=0;
        setpath(num,0,1,2);

        st=path[nowMove][0],des=path[nowMove][1];
        id=pillar[st].top();

        nowMove=0;
        timer1.start(1);

        pillar[des].push(id);   // Press the current square into the target stack
        pillar[st].pop();       // Put the current square from the beginning stack
    }
}

/ / Generate Hannota mobile path
void hanoi::setpath(int num, int a, int b, int c)
{
    if(num == 0)
        return;

    setpath(num-1, a, c, b);
    path[moveNum][0]=a; path[moveNum][1]=c; moveNum++;
    setpath(num-1, b, a, c);
}


efecto final:

Interfaz inicial

Estado inicial de Hannota

Proceso móvil

.

Categorías
Otros

Texto venenoso de sopa de pollo pequeño código fuente del programa

Introducción:

El pequeño programa compartido de Poisonous Chicken Tang Wen, puede abrir el lugar principal del tráfico para hacer un anuncio para ganar dinero, comenta

Dirección de descarga del disco web:

https://zijiewangpan.com/yEJjaA0rxj2

Imagen:

.

Categorías
Otros

Easyui DataGrid no permite la selección de datos ni se desmarca al hacer clic en la fila

Generalmente, cuando usamos Easyui DataGrid, hacemos clic en la línea para seleccionar / desmarcar. Pero bajo algunas escenas de negocios especiales, pregunte si hace clic en la fila, haga clic en si no está seleccionada. Lo mejor es no cambiar el código fuente de EASYUI. Después de todo, esta característica sigue siendo muy razonable, pero no existe tal función predeterminada en nuestro negocio.

A continuación, he completado tal efecto a través del método JS, y puedo empezar a pensar que el código mira a su alrededor, se recomienda imprimir datos a través de la consola, por lo que es más fácil entender la lógica del código. Publicación de código

onClickRow: function(index,row){
	/ * If the current row data is selected by the start, then click CHECKEDROWS without the current data; 
	   If the current row data is not selected, then click CHECKEDROW in CheckeedRows that contain current data;
	*/
			var checkedRows = $("#datagrid").datagrid("getChecked");
			 Var checkedflag = true; // Default is selected
			   if(row){
			       for(var i=0;i<checkedRows.length;i++){
			 IF (row.name == checkedrows [i] .name) {// can not be Name, can be other fields such as ID
			              checkedFlag = false;
			               break;
			           }
			       }
			   }
			 / * So originally selected, it is not selected, and it will not be selected. * /
			   if(checkedFlag){
				 $('#datagrid').datagrid('selectRow', index);
			   } else {
			     $('#datagrid').datagrid('unselectRow', index);
			   }
		}

.