[ Foro de C# ]

Resultado en tiempo real

27-Jul-2014 23:55
Invitado (Wind)
5 Respuestas

Busco crear un programa en C# en modo consola,  de tal manera que al agregar cifras, me vaya entregando el resultado inmediatamente en tiempo real,  y si borro una cifra, obviamente el resultado se actualizará.

En otras palabras, simplemente busco que el usuario, ingrese un solo dato, para realizar la conversión.

¿Se puede hacer en C#?


29-Jul-2014 11:35
Invitado (Caranim)

La primera parte es sencilla: Cada vez que ingreses un dato recalculas y haces un Write de la variable.
La segunda parte no me queda clara, ¿ Cómo se va a poder borrar la cifra ?. Si es la última parece sencillo, pero si fuese alguna distinta a la última deberías de diseñar la manera en la que el usuario va a indicar la cifra que quiere borrar: Presentarle todas las cifras en pantalla con un identificador único para cada una y que el usuario seleccione el índice a borrar... no sé, seguro que hay mil maneras distintas de hacerlo, pero tienes que decidir cual quieres utilizar.

En el "resumen" final que haces es sencillo:
Hasta que se decida que se acaba el proceso pedimos un dato al usuario.
Recalculamos el valor añadiendo el nuevo dato.

Espero que te sirva. Si puedes detallar un poco más trataré de acercarme más a lo que realmente necesites.

Saludos.


30-Jul-2014 00:28
Invitado (wind)

Gracias por responder, por ejemplo busco ingresar un solo dato en un programa en consola. Osea que el cursor "_" siempre estará en "ingrese un dato:  " (Desconozco si se puede hacer eso)

ejemplo:
Ingrese un dato:  1.2   // El usuario no presiona enter para mostrar el resultado, simplemente al ir escribiendo cifras, se va actualizando el resultado. Y si borra una cifras o varias cifras tambien se actualiza.

Resultado: 3.999 //Supongamos que me entrega la conversión a grados Celsius.


//A eso le llamaría resultados en tiempo real.

En html5 se puede hacer, es por ello, que me pregunto si se puede hacer en C#. Entiendo que son lenguajes muy distintos.

http://www.anerbarrena.com/html5-output-935/  (Resultados en HTML5 en tiempo real)

Saludos!


30-Jul-2014 14:43
Raúl Abascal (+4)

A ver si te puede ayudar lo que adjunto. Están sin controlar las cantidades negativas, posiblemente se pudiese hacer mejor el control de los decimales... no sé, seguro que mil cosas mas, pero creo que esto puede ser parecido a lo que buscas.


using System;

namespace ConsoleApplication1
{
    class Program
    {
        static Double ConvertirGrados(Double grados) 
        {
            Double retorno;
            retorno = (grados - 32)  / 1.8  ;            
            return retorno;
        }

        static void Main(string[] args)
        {
            ConsoleKeyInfo tecla;
            int  posx, posy;
            string svalor = "";
            string espacios = new string(' ', Console.WindowWidth);
            bool bhaycoma = false; // Para que solo haya un punto decimal.
            
            Console.Clear();
            Console.WriteLine("Introduce el valor ");
            posx = Console.CursorLeft;
            posy = Console.CursorTop;
            
            do
            {
                // Leer la tecla pulsada por el usuario.
                tecla = Console.ReadKey(true);
                // Comprobar si estamos borrando.
                if (tecla.KeyChar == 8 && svalor.Length > 0)
                {
                    if (svalor.EndsWith(","))
                    {
                        bhaycoma = false; // Si borramos el punto decimal tenemos que informarlo para aceptar otro.
                    }
                    svalor = svalor.Substring(0, svalor.Length - 1);
                    Console.CursorLeft--; // Ponemos el cursor en la posición del carácter borrado...
                    Console.Write(" ");       // ... y pintamos un blanco para ocultar el carácter que queríamos borrar.
                }

                // Comprobar que son caracteres numéricos.
                if (tecla.KeyChar > 47 && tecla.KeyChar < 58)
                {
                    svalor += tecla.KeyChar.ToString();
                }
                // Comprobar coma y punto ( para decimales )
                if ((tecla.KeyChar == 44 || tecla.KeyChar == 46) && !bhaycoma)
                {
                    svalor += ",";
                    bhaycoma = true;
                }
                // Mostrar al usuario la conversión de la cifra entrada hasta el momento.
                Console.CursorLeft = posx;
                Console.CursorTop = posy + 5;
                if (svalor.Length > 0) // Evitamos el error que produciría borrar el primer caracter.
                {
                    Console.Write(svalor + " grados Farenhait son " + ConvertirGrados(Convert.ToDouble(svalor)).ToString() + " grados Celsius.");
                }
                // Mostrar al usuario las teclas válidas pulsadas para que pueda ver lo tecleado.
                Console.CursorLeft = posx;
                Console.CursorTop = posy;                
                Console.Write(svalor + espacios);
                Console.CursorTop = posy;  // Para que el cursor se muestre en la posición donde se pintará el carácter tecleado.

            } while (tecla.KeyChar != 27); // Se sale al pulsar Escape                        
        }
    }
}



30-Jul-2014 18:45
Invitado (wind)

exacto! eso es lo que buscaba!. gracias por todo.


31-Jul-2014 14:50
Nacho Cabanes (+83)

Coincido con Caranim: la forma de hacerlo es usando órdenes avanzadas de consola: leer letra a letra con ReadKey, y recolocarte siempre donde quieres el resultado, usando SetCursorPosition.

Una forma simple, sin control de errores (la de Caranim es mucho más exhaustiva) de mostrar un dato calculado en tiempo real, por ejemplo el doble de lo que se teclee, sería:


using System;

class TiempoReal
{
    static void Main()
    {
        char tecla;
        string entrada="";
        int resultado;
        
        do
        {
            Console.SetCursorPosition(10, 5);
            Console.Write("Escriba un numero: " + entrada + " ");
            tecla = Console.ReadKey().KeyChar;
            if (tecla == 8) // Retroceso para borrar
                entrada = entrada.Substring(0, entrada.Length-1);
            else
                entrada += tecla;
                
            resultado = 2 * Convert.ToInt32(entrada);
            Console.SetCursorPosition(10, 8);
            Console.Write("Su doble es: " + resultado + " ");
        }
        while (tecla != 13);  // Intro para acabar
    }
}


Insisto: fallará si tecleas datos no numéricos, si borras al principio, etc., pero creo que es un esqueleto mínimo que te ayudará con la idea básica.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)