GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Contador usando For


#1

Pessoal, estou desenvolvendo um programinha daqueles de cronômetro, que está funcionando do jeito certo, mas eu queria que ele exibisse os números como num contador normal, onde aparece um número, ele some e vem outro.
Segue código:
/*
Contador
*/

package contador;

import java.util.Scanner;

public class Contador {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Com quantos números quer começar o contador? ");
        int qtdNumeros = sc.nextInt();
        
        int i;
        
        for( i = qtdNumeros; i >=0; --i){
            System.out.println("Contagem em andamento: "+i);
          if(i == 0){System.out.println("Contador finalizado!");}   
                
            }
            }
        }

Modo como o console mostra:

run:
Com quantos números quer começar o contador?
5
Contagem em andamento: 5
Contagem em andamento: 4
Contagem em andamento: 3
Contagem em andamento: 2
Contagem em andamento: 1
Contagem em andamento: 0
Contador finalizado!

eu n quero desse jeito scrr


#2

Usando a impressão no console não tem como fazer isso que você quer!

Você vai conseguir fazer algo dessa forma quando começar a utilizar interfaces gráficas.


#3

Pior que dá, @Jonathan_Medeiros!

Ao invés de println, vc vai usar printf. Olha só, @carlosed.01, como ficou seu código com algumas modificações minhas:

import java.util.Scanner;

public class Contador {

    public static void main(String[] args) throws InterruptedException {
        Scanner sc = new Scanner(System.in);
        System.out.println("Com quantos números quer começar o contador? ");
        int qtdNumeros = sc.nextInt();

        for (int i = qtdNumeros; i >= 0; --i) {
            Thread.sleep(1000);
            System.out.printf("\rContagem em andamento: %4d", i);
        }

        System.out.println("\nContador finalizado!");
    }
}

O segredo é aquele \r no inicio da frase. Ele faz o cursor retornar pro inicio da mesma linha.

O Thread.sleep(1000) adiciona uma pausa de 1 segundo (1000 milésimos de segundos) e o InterruptedException é necessário quando se invoca o método sleep.

Aquele seu if dentro do loop era desnecessário, então o removi.

Claro que pra coisas mais avançadas e controle maior do cursor, vc vai precisar de uma biblioteca dedicada a isso ou criar uma aplicação grafica.


#4

Interessante esse recurso, até hoje eu não sabia da existência dele!


#5

Digo o mesmo. Interessante mesmo, sempre ouvi dos meus professores que isso era impossível pois “O java não tinha tanta autonomia sobre o console quanto o C”. x)


#6

Eu também sempre ouvi isso, até na época passei dias pesquisando uma forma de fazer isso por eu não concordar com a ideia de que não teria como ser feito, mas como não havia encontrado nada acabei me conformando com falso “impossível” que eles me diziam.


#7

Esses “controle de linha” (\r \n) são OS-based e até onde eu me lembro o Eclipse tinha um grande problema com eles. Você usava \r e ele interpretava como \n


#8

Muito bom @wldomiciano !!! Eu também não sábia dessa.

Passei pelas mesmas coisas kk


#9

Muito legal o Thread.sleep. Só não entendi muito o throws InterruptedException. Eu sou iniciante e já tive dificuldades com for até no visualg huehuehue. Pode me explicar esse throws? O seu código ficou muito bom!

Edit: esse %4d no printf está certo? Toda vez que coloco ele, aparecem erros.

Thx!


#10

Você vai entender melhor quando estudar Exceções. Mas basicamente…

Exceções é como o Java representa situações adversas que podem ocorrer durante a execução do seu programa.

Se, por algum motivo, o método sleep for interrompido antes do tempo que vc determinou acabar, uma exceção é lançada (InterruptedException).

O Java exige que vc trate esta exceção de alguma forma e se vc não quiser tratá-la, vc deve avisar pro resto do programa que aquele trecho de código pode lançar a tal exceção.

Quando vc escreve:

public static void main(String[] args) throws InterruptedException

Vc quer dizer algo como:

“Este método se chama main. Ele é publico, estático, não retorna valor algum e fique atento, pois ele pode lançar uma exceção”.

Bom, vou deixar o link pra um artigo que explica bem melhor o conceito de Exceções, espero que ajude.


Sobre o %4d… Está certo sim e pra mim não aparecem erros. Qual a mensagem de erro que aparece pra vc? Tenta sem o número 4, só com %d


#11

Valeuuuuu