none
Contador atrás RRS feed

  • Pregunta

  • Buenas:

    En C# modo consola.

    Quiero que muestre este mensaje.

    Cuenta atrás: 3

    Empieza con un 3, y funciona en cada segundo, tiene que llegar a 0. De 3 a 0 y cuando llegue a 0.

    Sale otro mensaje que dice:

    ¡¡¡Ha llegado a 0!!!

    ¿Cómo se hace?

    Saludos.


    http://electronica-pic.blogspot.com

    domingo, 7 de marzo de 2021 8:51

Respuestas

  • Una observación sobre tu código: te sobra un contador. Las variables "contador" e "i" hacen lo mismo. Si usas el for con la "i" entonces no necesitas "contador", la "i" ya hace de contador.

    En cuanto al Timer: sí, podrías usarlo, pero tienes que usar el Timer correcto. No puedes usar el Timer de Windows Forms porque ese depende de la bomba de mensajes, y en una aplicación de consola no la tienes disponible. Puedes usar System.Threading.Timer o System.Timers.Timer. Pero es mucho más complicado que lo que tienes. Necesitas instanciar el correspondiente timer, conectar el evento o delegado que dispara a una subrutina, y desde esa subrutina hacer el Console.WriteLine. No podrás usar un "for" (ya que a cada disparo del timer entras y sales de la subrutina), sino que necesitarás un contador en una variable externa al método, y compararla dentro del Timer. También necesitas meter el código de espera dentro del Main para que la aplicación no se cierre hasta que hayan terminado los tres disparos del Timer. Y puesto que el Main de todas maneras se va a tener que quedar "parado" en ese punto de espera, para eso te daría igual usar el Thread.Sleep. No implica ninguna diferencia en el funcionamiento de la aplicación (a diferencia de una aplicación de ventanas, en la que efectivamente no querríamos usar el Thread.Sleep de esta manera).

    • Marcado como respuesta Metaconta lunes, 8 de marzo de 2021 19:31
    lunes, 8 de marzo de 2021 11:57
    Moderador

Todas las respuestas

  • Necesitarás declarar una variable de tipo entero, que se inicializa con 3.

    Después escribes un bucle que a cada iteración escriba la variable y la decremente, y haga una pausa de 1 segundo (System.Threading.Thread.Sleep(1000)), y al llegar a cero salga del bucle. Y después de salir del bucle escribes el mensaje final.

    Perdona que solo te lo diga así de forma "genérica" y no te escriba el código (es muy simple de escribir, no más de media docena de líneas). Pero se ve que se trata de un ejercicio académico, y en el foro no podemos dar la solución de los ejercicios lista para copiarla. Solo podemos dar pistas genéricas, pero sin escribirte la solución.

    domingo, 7 de marzo de 2021 9:43
    Moderador
  • Buenas:

    Siguiendo a raja tabla lo que me cuentas, funciona.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Cuentra_atras_Consola_01
    {
        class Program
        {
            static void Main(string[] args)
            {
                // Variable.
                int contador = 3;
    
                // Ocultar cursor.
                Console.CursorVisible = false;
    
                // Cuenta atrás.
                for (int i = 0; i <= 3; i++)
                {
                    Console.SetCursorPosition(10, 10); // Posición en la pantalla.
                    Console.WriteLine("Cuenta atrás: {0}", contador);
                    System.Threading.Thread.Sleep(1000); // Retardo de 1 segundo.
                    contador--; // Decrementa variable.
                }
    
                // Muestra mensaje.
                    Console.Clear(); // Limpia pantalla completa.
                    Console.SetCursorPosition(10, 10); // Posición en la pantalla.
                    Console.WriteLine("¡¡¡Ha llegado a 0!!!");
                    Console.ReadKey(); // Pulse cualquier tecla para salir.
            }
        }
    }

    Lo que no me hace ni pizca de gracia usar el Sleep.

    ¿Se puede hacer lo mismo con Timer?

    Se que hay que usar esto, Timer.Star(); y timer.Stop();

    Lo he intentado codear pero no me sale ni a la de trés.

    ¿Alguna idea?

    Saludos.


    http://electronica-pic.blogspot.com

    lunes, 8 de marzo de 2021 7:40
  • Una observación sobre tu código: te sobra un contador. Las variables "contador" e "i" hacen lo mismo. Si usas el for con la "i" entonces no necesitas "contador", la "i" ya hace de contador.

    En cuanto al Timer: sí, podrías usarlo, pero tienes que usar el Timer correcto. No puedes usar el Timer de Windows Forms porque ese depende de la bomba de mensajes, y en una aplicación de consola no la tienes disponible. Puedes usar System.Threading.Timer o System.Timers.Timer. Pero es mucho más complicado que lo que tienes. Necesitas instanciar el correspondiente timer, conectar el evento o delegado que dispara a una subrutina, y desde esa subrutina hacer el Console.WriteLine. No podrás usar un "for" (ya que a cada disparo del timer entras y sales de la subrutina), sino que necesitarás un contador en una variable externa al método, y compararla dentro del Timer. También necesitas meter el código de espera dentro del Main para que la aplicación no se cierre hasta que hayan terminado los tres disparos del Timer. Y puesto que el Main de todas maneras se va a tener que quedar "parado" en ese punto de espera, para eso te daría igual usar el Thread.Sleep. No implica ninguna diferencia en el funcionamiento de la aplicación (a diferencia de una aplicación de ventanas, en la que efectivamente no querríamos usar el Thread.Sleep de esta manera).

    • Marcado como respuesta Metaconta lunes, 8 de marzo de 2021 19:31
    lunes, 8 de marzo de 2021 11:57
    Moderador
  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN.

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.

    lunes, 8 de marzo de 2021 15:06
    Moderador
  • Vale, entiendo los del timer.

    Aquí ya me funciona todo.

                // Cuenta atrás.
                for (int i = 3; i >= 0; i--)
                {
                    Console.SetCursorPosition(10, 10); // Posición en la pantalla.
                    Console.WriteLine("Cuenta atrás: {0}", i);
                    System.Threading.Thread.Sleep(1000); // Retardo de 1 segundo.
                }


    http://electronica-pic.blogspot.com

    lunes, 8 de marzo de 2021 19:27