C sharp - Cacular niveles

 
Vista:
sin imagen de perfil
Val: 121
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Cacular niveles

Publicado por Meta (67 intervenciones) el 31/07/2020 23:41:33
Hola:

Tengo esta barra que pone de 0 % al 100 %.

0% 19 % 95 % 100%
|--------|-----------------------------------------------------------|--------------|

Mejor imagen de abjo.

captura-2155795

Dentro de Windows Form incluyo la barra progressBar y el trackBar para regular una variable.

Internamente del programa, hay dos variables, una que pone 19 y otra variabe que pone 95. Esas con constantes.

Internamente una variable es capaz de moverse del 19 al 95. En otra variable indica que es un 0 al 100 %.

Por ejemplo, si con el trackBar lo pongo al valor 95, en un label tiene que indicar que estoy al 100.

Internamente funciona del 19 al 95 y cara del usuario lo ve como si fuera del 0 al 100 %.

Código que he hecho hasta ahora y no me funciona.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using System;
using System.Windows.Forms;
 
namespace Regular_nivel_batería_01
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            progressBar1.Value = (trackBar1.Value - 19) * 100 / (95 - 19);
            //progressBar1.Value = trackBar1.Value;
            label_Porcentaje.Text = trackBar1.Value.ToString() + " %";
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            // Valores del trackBar.
            trackBar1.Maximum = 100;
            trackBar1.Minimum = 0;
            trackBar1.SmallChange = 5;
            trackBar1.Value = 19;
 
            // Valores barra de progreso.
            progressBar1.Maximum = 95;
            progressBar1.Minimum = 19;
            progressBar1.Step = 5;
            progressBar1.Value = trackBar1.Value;
        }
    }
}

¿Es posible hacerlo?

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Cacular niveles

Publicado por Nacho (94 intervenciones) el 01/08/2020 09:12:00
Lo único que no es posible hacer es lo que no sabes hacer.

1
2
3
4
double De1995A0100(int valor)
{
     return ((valor-19) / (double)(95 - 19)) * 100;
}

Hay algo que os cuesta tener en cuenta. Si a esa fucción le quitas el (double) deja de funcionar.

Por cierto, ¿qué estamos programando?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cacular niveles

Publicado por Nacho (94 intervenciones) el 01/08/2020 09:41:04
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
return ((valor-19) / (95 - 19)) * 100;
0A85E363  mov         eax,dword ptr [ebp-40h]
0A85E366  add         eax,0FFFFFFEDh
0A85E369  mov         ecx,4Ch
0A85E36E  cdq
0A85E36F  idiv        eax,ecx
0A85E371  imul        eax,eax,64h
0A85E374  mov         dword ptr [ebp-4Ch],eax
0A85E377  fild        dword ptr [ebp-4Ch]
0A85E37A  fstp        qword ptr [ebp-48h]
0A85E37D  nop
0A85E37E  jmp         0A85E380
 
return ((valor-19) / (double)(95 - 19)) * 100;
0B96A94B  mov         eax,dword ptr [ebp-40h]
0B96A94E  add         eax,0FFFFFFEDh
0B96A951  mov         dword ptr [ebp-4Ch],eax
0B96A954  fild        dword ptr [ebp-4Ch]
0B96A957  fdiv        dword ptr ds:[0B96A980h]
0B96A95D  fmul        dword ptr ds:[0B96A988h]
0B96A963  fstp        qword ptr [ebp-48h]
0B96A966  nop
0B96A967  jmp         0B96A969

Como se ve, el código generado en uno y otro caso no se parece en nada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 121
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Cacular niveles

Publicado por Meta (67 intervenciones) el 01/08/2020 13:30:24
Hola:

captura-2155795

Lo normal es programar que en label de arriba, indique del 0% al 100 % tal como lo muestra en el trackBar y el progresBar. Eso es en apariencia.

En el label de abajo, tiene que mostrar solo del 19 % al 95%.

En el label de abajo, cuando llegue al 19% significa que he puesto el 0% arriba. Si muevo el trackBar al 100%, en el label de abajo significa que es el 95%.

Mínimo valor: 0% = 19 %.
Máximo valor: 100 % = 95 %.

Ejemplo, si muevo el trackbar, en el progressBar y el label de arriba pone al 100 %, el label de abajo tiene que aparecer el 95 % que para él es su máximo.

Si no se entiende lo que quiero decir, lo explico de otra manera.

Gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Cacular niveles

Publicado por Nacho (94 intervenciones) el 02/08/2020 11:42:31
Te he dicho ya antes que si estás pendiente de si te entiendo yo a ti no estás pendiente de entenderme tú a mí, que es lo que te interesa.

Lo que quieres es pasar de una escala a otra, da igual de cuál a cuál, y eso se hace con una regla de tres que ya conocían los matemáticos de la Grecia clásica. Lo que no sabían ellos, y tú tampoco, es que si la operación de la regla de tres la hace la ALU las cuentas no salen. En el segundo mensaje, con el código asm generado, se ve claramente cuál es el problema. En el primer caso las operaciones matemáticas las realiza la ALU del procesador (idiv eax,ecx) y en el segundo la FPU ( fdiv dword ptr ds:[0B96A980h]). ¿Se entiende?

Para pasar de una escala a otra, en una regla de tres, lo que hay que hallar primero es la relación entre valores. La cuenta será entonces: valor de una escala * relación = valor de otra escala. Podemos prescindir del valor en la que empiece y acabe una y otra porque no importa ahora. Tenemos entonces que si la relación entre una escala y otra es de 3/5, por ejemplo, valor de una escala * 3/5 = valor de otra escala.

Hasta ahí, perfecto. El problema es que para la ALU, 3/5 = 0. Así que valor de una escala *0 = 0. Otro valor de una escala * 0 = 0. Y otro valor más * 0 = 0. Como se ve, las cuentas no salen. Por eso hay que dejarle bien claro al compilador que esas cuentas no quieres que las haga la ALU, sino la FPU. Para la FPU 3/5 es igual a una mantisa de 64 bits, casi nada, y un exponente de 16 bits. Total, un número en coma flotante de 80 bits, casi nada. Así las cuentas salen. ¿Y cómo se le dice al compilador que las cuentas tiene que hacerla la FPU? Con el (double), por ejemplo.

Y eso es así para pasar de la escala de 0 a 100 a la de 19 a 95 como para pasar de la de 19 a 95 a la de 0 a 100, o para pasar de gradros celsuis a fahrenheit, o para las transformadas de lorentz de magnitud de espacio, tiempo, masa... de la teoría de la relatividad.

Si no se me entiende no sé explicarlo más fácilmente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar