12/12/2018, 08:57:31 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ¡Atención! Hay que poner la matemática con LaTeX, y se hace así (clic aquí):
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: ¿Métodos de asignar un valor a un número?  (Leído 385 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Tachikomaia
Pleno*
*****

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Uruguay Uruguay

Mensajes: 180


Ver Perfil
« : 12/02/2018, 08:40:01 am »

No es necesario leer tanto para entender. Escribí intentando más o menos poner la info más relevante al inicio, así que lean hasta que les parezca haber entendido.

------------------------------------------------------------------------------------------------

Quiero hacer un programa que en pantalla muestre métodos en los que se asigne un valor a una variable C, basados en otra variable V y a veces también en un valor F, fijo y elegido, o incluso en más de un F.
Ejemplo:
C = V+F

Y quiero que evite hacer "tonterías", como mostrar métodos que dan el mismo resultado o que pueden resumirse.
Ejemplo:
C = V+V+V+V+V-V se puede resumir a C = V*F, y si se mostraran ambos resultados sería una falla, quiero sólo el 2ndo.

------------------------------------------------------------------------------------------------

Nótese que no se pone V*4 por ejemplo, siempre que haya un número fijo se pone F, o sea que no preciso tanta especificación.

------------------------------------------------------------------------------------------------

Uds dirán cómo puedo hacer esto que quiero, especialmente lo de evitar tonterías.

------------------------------------------------------------------------------------------------

Por ahora logré que en la 1era línea pueda aparecer cualquiera de esto:
C = V+F
C = V*F
C = F/V
C = Math.pow ( V, V )
C = Math.pow ( V, F )
C = Math.pow ( F, V )

Algunas posibilidades que pueden imaginarse las descarté por evitar tonterías. Por ejemplo V+V es abarcado por V*F.
Dado que las computadoras tienen problemas para cálculos con decimales la diferencia en los resultados del ejemplo (o sino en casos como V*0.33333333... comparado con V/3, que no está en la lista) podría ser mucha, pero no busco TANTA precisión.

Obviamente quiero que comenten si creen que falta alguna "combinación" importante o si hay alguna tontería.

------------------------------------------------------------------------------------------------

En las próximas líneas puede aparecer cualquiera de estas:
C = C+V
C = C+F
C = C*V
C = C*F
C = V/C
C = F/C
C = Math.pow ( C, C )
C = Math.pow ( C, V )
C = Math.pow ( V, C )
C = Math.pow ( C, F )
C = Math.pow ( F, C )

En este caso no analicé mucho el tema de las tonterías, así que en comparación con las combinaciones anteriores es más probable que haya.

------------------------------------------------------------------------------------------------

El programa aún no genera métodos que contengan paréntesis.

Si continúo como hasta ahora la solución que intuyo es que a partir de la 2nda línea puedan ir cosas como C2 = V+F, es decir, que sea posible algo así:
C = V+F
C2 = V-F
C = C/C2
...lo cual equivaldría a C = (V+F) / (V-F)

Uno de los problemas es que al agregar una definición en base a C2 o una C "mayor" (C3, etc) habría que ver si tal variable fue definida en una línea anterior, y no en un método anterior, o sea que habría que llevar un conteo de las Cs definidas en el método. Fácil creo... pero tiene consecuencias (tonterías o repeticiones) complicadas de resolver.

------------------------------------------------------------------------------------------------

En la forma normal de expresar ecuaciones o como se llamen está permitido que haya más de una operación por línea. Con el tema de los paréntesis tendríamos que lo 1ero agregado podría ser:
(
V
F/
Math.pow ( V,
Math.pow ( F,

En vez de Math.pow y sus paréntesis podría usar ^, pero igual me parece complicado, que dependiendo de qué se agregó lo siguiente pueda ser una cosa u otra. Por ejemplo si se agregó un "(" entonces se puede agregar "V", pero si sólo se agregó "V" entonces lo 2ndo debe ser un símbolo.
Well, mi limitación de operaciones por línea también da problemas, quizá a la larga da más, pero en este punto aún no, por lo tanto lo seguiré usando.

------------------------------------------------------------------------------------------------

El programa aún no genera métodos que contengan F2 o "mayores".

No sé si es un problema.

El programa es para darme pistas sobre:
A- Cómo definir una variable de modo que cumpla una condición (esto puede sonar fácil, pero no siempre lo es, porque una variable puede representar una acción que no puede ser deducida simplemente por el valor de dicha variable, por ejemplo 2 en un ajedréz puede significar mover el rey a la derecha).
B- Cómo definir una condición (no sé por qué puede ser difícil, pero ya me ha pasado).

Entonces, que el método me diga por ejemplo:
C = V*F
C = C+F
...no sería un problema si yo tuviera en cuenta que en cada caso F puede ser un valor distinto.

Pero no estoy seguro de si siempre sería tan fácil o tan poco problemático. Habría que re-revisar el tema de las tonterías y las repeticiones...

Si decido poner F2 y demás, habría que poner un contador como había mencionado con las Cs y los paréntesis. La lista de agregables se agranda, y también se complica la detección de tonterías y repeticiones, so, no sé si esto es necesario o mejor que lo otro.

¿Qué creen?

------------------------------------------------------------------------------------------------

El programa aún no genera métodos que contengan la acción:
- Obtener parte
- Obtener largo
- Si
- Repetir

¿Pueden ser sustituídas por matemática normal? ¿cuales son las instrucciones mínimas necesarias para generar cualquier método de definir una variable como dije al inicio? No estoy pidiendo que me hablen de lenguaje máquina o cosas así, sino cosas como:
¿Puede la acción "redondear hacia abajo" aplicarse la acción "si", divisiones y cualquier cosa "normal", o es necesario que use esa acción?
Obviamente no conocen todas las acciones "raras" o de informática, pero yo tampoco, así que no se preocupen tanto por dar una respuesta completa o perfecta.

------------------------------------------------------------------------------------------------

La repetición de una suma sería una multiplicación, y la repetición de una multiplicación por si mismo sería una potenciación o como se llame.
Entonces, para evitar repeticiones de métodos tengo que:
A- Evitar que se generen repeticiones que sean simplemente una suma/multiplicación de un valor que no cambiará en la repetición (o como se diga, se supone que uds entienden mejor que yo a qué me refiero en esto (*)).
B- Evitar que haya sumas y evitar multiplicaciones por si mismo.

La opción A parece mejor, pero es más fácil decirlo que hacerlo.

(*): Ni siquiera tendría que explicarlo, pero bue, por las dudas.
Esto habría que evitarlo:
Repeticiones = 0
Repetir
   C = C+V
   Repeticiones = Repeticiones+1
hasta que Repeticiones == 3

Porque basta con decir
C2 = V*F (F sería 3).
C = C+C2

Y esto también habría que evitarlo:
Repeticiones = 0
Repetir
   C = C*V
   Repeticiones = Repeticiones+1
hasta que Repeticiones == 3

Porque basta con decir
C2 = V^F (F sería 3).
C = C*V

¿no?

Si C es 2 y V es 3.
Usando el método repetición: 2*3*3*3 = 54
El método reducido: 3^3*2 = 27*2 = 54

Ahora bien, si "el valor cambia", así:
Repeticiones = 0
Repetir
   C = C*C
   Repeticiones = Repeticiones+1
hasta que Repeticiones == 3

Entonces resultaría... 3*3... 9*9... 27*27
que no sería lo mismo que C^3

------------------------------------------------------------------------------------------------

El programa genera tonterías y repeticiones a partir de la 3era línea (o quizá la 2nda, no sé tanto).

Y no sé bien cómo evitar esto. Es más o menos el mismo problema de usar expresiones normales (las ecuaciones pudiendo tener más de una operación por línea).

Por ejemplo:
C = V+F
C = C+V
C = C+V

¿Cómo lo evito?

Si digo "no pongas C = C+V en la 3era línea", entonces no se podría generar esto:
C = V+F
C = C*V
C = C+V
que estaría bien, creo..

Si digo "si la línea anterior es C = C+V entonces no pongas C = C+V", podría ser... pero no quisiera tener que poner este tipo de excepciones...

Si ni siquiera sé cuales son. Y a medida que agregue más opciones van a ser más.

------------------------------------------------------------------------------------------------

¿Por qué Fs en vez de números?
Véase para qué hago esto, mencionado en "El programa aún no genera métodos que contengan F2 o "mayores"."

Entonces, ver en pantalla cosas como esto:
1:
C = V^V*F/(F+V)

2:
C = V^V*F/(F*V)

...me resulta más útil que esto:

1:
C = V^V*2/(3+V)

2:
C = V^V*2/(4+V)

...creo. Porque los valores a los Fs más o menos los puedo averiguar una vez que tenga "la estructura", los relacionamientos, la ecuación o como se llame, pero esas cosas me es más complicado, intento que l@s genere el programa.

------------------------------------------------------------------------------------------------

El programa muestra los resultados siempre en el mismo orden.

Lo cual a la larga me puede resultar aburrido, pero por ahora, considerando lo complicado que es todo esto, no tiene sentido complicarme en que haya azar a la vez que se eviten las repeticiones.

Los resultados es como si fuesen números. Pero en vez de 1, 2... 10, 11, etc, son LíneaA1, LíneaA2... LíneaA1 y LíneaB1, LíneaA1 y LíneaB2, etc.

------------------------------------------------------------------------------------------------

Este es el código del programa:

Escena 1
   actions for fotograma 1
      Mod1 = "C = V+F;\n";
      Mod2 = "C = V*F;\n";
      Mod3 = "C = F/V;\n";
      Mod4 = "C = Math.pow ( V, V );\n";
      Mod5 = "C = Math.pow ( V, F );\n";
      Mod6 = "C = Math.pow ( F, V );\n";
      // 2nda línea.
      Mod7 = "C = C+V;\n";
      Mod8 = "C = C+F;\n";
      Mod9 = "C = C*V;\n";
      Mod10 = "C = C*F;\n";
      Mod11 = "C = V/C;\n";
      Mod12 = "C = F/C;\n";
      Mod13 = "C = Math.pow ( C, C );\n";
      Mod14 = "C = Math.pow ( C, V );\n";
      Mod15 = "C = Math.pow ( V, C );\n";
      Mod16 = "C = Math.pow ( C, F );\n";
      Mod17 = "C = Math.pow ( F, C );\n";
      Line1ID = 0;
      Lines = 1;
      Resp = "";
   actions for fotograma 2
      C = "";
      Cursor = Lines;
   actions for fotograma 3
      Line_Cursor_ID = "Line"+Cursor+"ID";
      EvaledxLine_Cursor_IDxPlus1 = eval(Line_Cursor_ID)+1;
      // Línea lista para modificarse.
   actions for fotograma 4
      if (Cursor>1) {
         if (EvaledxLine_Cursor_IDxPlus1<18) {
            // Línea puede cambiar.
            set (Line_Cursor_ID, EvaledxLine_Cursor_IDxPlus1);
            // Línea cambia.
            // Hay que actualizar C.
         } else {
            // La línea no puede cambiar, no hay más posibilidades para ella.
            set (Line_Cursor_ID, 7);
            Cursor = Cursor-1;
            // Hay que modificar la línea anterior.
            gotoAndPlay (3);
         }
      } else if (EvaledxLine_Cursor_IDxPlus1<7) {
         // Línea 1 puede cambiar.
         set (Line_Cursor_ID, EvaledxLine_Cursor_IDxPlus1);
         // Línea cambia.
         // Hay que actualizar C.
      } else {
         // La línea 1 no puede cambiar, no hay más posibilidades para ella.
         set (Line_Cursor_ID, 1);
         // Hay que agregar una línea.
         Lines = Lines+1;
         set ("Line"+Lines+"ID", 7);
         // Hay que actualizar C.
      }
   actions for fotograma 5
      // Actualizar C.
      C = "";
      Cursor = Lines;
   actions for fotograma 6
      C = eval("Mod"+eval("Line"+Cursor+"ID"))+C;
      Cursor = Cursor-1;
   actions for fotograma 7
      if (Cursor>0) {
         // Continuar actualizando líneas.
         gotoAndPlay (6);
      } else {
         // Listo, mostrar en pantalla y crear otras instrucciones.
         Resp = C+"\n"+Resp;
         gotoAndPlay (2);
      }

Como mencioné arriba en la parte de no azar, el funcionamiento es análogo a como varía un número. La 1era unidad (lo que por ejemplo sería 2 en 2333) correspondería al contenido de la 1era línea, y así sucesivamente. Y al igual que los números, el último (izquierda en los números, abajo en cuanto a líneas) es el 1ero que varía (si hablamos de enteros y le estamos sumando 1), los demás varían cuando el posterior supera su máximo valor, momento en el que se resetea. Cuando a 19 se le suna 1 el 9 pasa a 0 y el 1 aumenta a 2. 20.
Acá es un poco más complejo porque el 1er valor va de 1 a 6 creo, y los demás de 7 a 17.

El código digamos que tiene 2 partes.

Desde el frame 1 hasta el 4 se modifican los IDs de las líneas, es decir, se aumenta el valor, como si fuesen números y como ya expliqué.

En los frames posteriores ese ID es usado para asignar a la línea el contenido que marque la correspondiente variable "Mod", definidas al inicio.

------------------------------------------------------------------------------------------------

Gracias.
En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!