Presento una nueva problemática ante un mismo código del cual ya he consultado anteriormente. Abro otro tema ya que es una situación diferente y no quería reciclar algo que ya poseía su solución.
Paso a explicar. El código que coloco más abajo está generando constantemente operaciones matemáticas aleatorias, cuyos números también son aleatorios pero sus resultados siempre están comprendidos entre 1 y 4.
Para realizar esto cree una función por cada operación (suma, resta, multiplicación y división) y luego las "agrupé" dentro de un array para luego poder ser llamadas al azar.
Ahora bien...la idea sería mostrar: una sola vez en el monitor, 3 operaciones cualquiera al azar y cuyos resultados no se repitan entre sí. Es decir, a modo de ejemplo:
La primera operación es: 3+1= 4
La segunda operación es: 2*1= 2
La tercera operación es: 6/2=3
Si se resetea desde el IDE o la placa, debería producirse el mismo resultado pero siempre con operaciones y resultados diferentes, que a mi entender, con el uso del "random" descripto hasta el momento en el código, no debería ser un problema.
Espero no haberme embrollado mucho para darme a entender, desde ya muchas gracias. Saludos coordiales.
int numX;
int numY;
int pin1 = 1;
void suma ();
void resta ();
void mult ();
void divi ();
void (*operaciones[])() = {suma, resta, mult, divi};
void setup (){
Serial.begin (9600);
randomSeed (analogRead (pin1));
}
void loop (){
int rnd = random(0, 4);
operaciones[rnd]();
}
//Funciones desarrolladas de cada operación.
void suma (){
numX = random (1,10);
numY = random (0,10);
int resultado = numX + numY;
if (resultado <= 4 && resultado >=1){
Serial.print (numX);
Serial.print (" + ");
Serial.print (numY);
Serial.print (" = ");
Serial.println (resultado);
}
}
void resta (){
numX = random (1,10);
numY = random (0,10);
int resultado = numX - numY;
if (resultado <= 4 && resultado >=1){
Serial.print (numX);
Serial.print (" - ");
Serial.print (numY);
Serial.print (" = ");
Serial.println (resultado);
}
}
void mult (){
numX = random (1,10);
numY = random (1,10);
int resultado = numX * numY;
if (resultado <= 4 && resultado >=1){
Serial.print (numX);
Serial.print (" * ");
Serial.print (numY);
Serial.print (" = ");
Serial.println (resultado);
}
}
void divi (){
numX = random (1,10);
numY = random (1,10);
if (numX % numY == 0){
int resultado = numX / numY;
if (resultado <= 4 && resultado >=1){
Serial.print (numX);
Serial.print (" / ");
Serial.print (numY);
Serial.print (" = ");
Serial.println (resultado);
}
}
}
Pues básicamente, a partir de lo que ya tengo hasta el momento, no estaría viendo como resolver en código lo que aquí especificaba .
Por si no se entiende el resultado, supongamos que el código funcional está cargado en el arduino. Lo conectas, abres el monitor del IDE y aparece esto:
La primera operación es: 3+1= 4
La segunda operación es: 2*1= 2
La tercera operación es: 6/2=3
Y queda ahí, no hace más nada. Luego se hace un reset, o se vuelve a mandar el código, y hace lo mismo pero ahora con otras operaciones al azar:
La primera operación es: 4/4= 1
La segunda operación es: 12-8= 4
La tercera operación es: 27/9 = 3
Si, se entiende pero no puedes esperar que todos tengamos tiempo disponible inmediatamente para resolver tu problema.
Declara una array similar a operaciones[] donde guardar un flag que indique la operación que ya se ha realizado.
Luego por el número de la operación a realizar consulta a ver si ya se hizo, si ya está buscas otro numero aleatorio de operación, sino realizas la operación y guardas el flag.
Con un for() y un while() anidado dentro de éste lo resuelves en minutos.
Lo primero que me pregunto es como vas a repetir algo si usas un random? imposible o bueno muy dificil a menos que tu random sea de 4 números entonces aumentas las chances.
Pero la probabilidad que dado un digito se repita el siguiente empieza a hacerse cada vez mas chica. Entonces.. por ese lado no hay problema.
Por el otro lado.. la técnica de @MaximoEsfuerzo esta perfecta.
Usa otro random para generar las operaciones y si ya esta que genere otra, hasta completar las 3.
Almacenas las que van saliendo y no pueden repetirse.
Tu random de operaciones va de 0 a 3 donde 0= suma 1 = resta 2=multiplicacion 3=division
sale 2 entonces multiplicas
Acumulas en el vector opera[0] = 2
Luego preguntas de nuevo sale 2
chequeas contra opera que tiene solo 1 temino porque el indice es 1 y eso lo usas para manejar tu for()
te dice que opera[0] = 0 entonces lo descartas y preguntas de nuevo y te sale 3 o sea division
indice loincrementas a 2.
opera[0] = 2
opera[1] = 3
y asi.
Muchísimas gracias por los aportes, ahora logro entender por donde encarar el dilema.
Por otra parte...
¿Disculpa?...sinceramente no sé a qué viene tal llamado de atención. En ningún momento he sido irrespetuoso, ni mucho menos hice alusión o declaración alguna de estar exigiéndole nada a nadie, mucho menos tiempo de atención.
Lo había pensado, creo que más simple.
Si tiene suma (0) guarda en el otro array [0] un 1y hace la suma
Si vuelve a salir 0, consulta en 0, como hay un 1 significa que suma ya se hizo, vuelve por otro número, pongamos sale 2, busca en la posición 2, ¿está a 0? Hace la multiplicación, y pone la posición 2 en 1. Y lo para la 3ra operación.
No te preocupes, no dedico tiempo a que algo me genere alguna molestia, menos un mal entendido.
Lo de irrespetuoso lo sumé por si las dudas, ya que lo de "impaciente" ya estaba de más. Creo que te debes haber confundido con otro post ya que, como te comentaba, en ningún momento le exigí atención a alguien. A b707 le contesté sus dudas 10 hrs después, si eso demuestra impaciencia, no sé lo que significa la palabra entonces . Un saludo!