Duvida iniciante - Fazer um grafico com 4 barras, usando digitos de um numero

Estou a aprender Java à 3 semanas e o exercicio é o seguinte.

Elabore um programa que recebendo o valor do numero inteiro de 4 digitos, represente esse numero na forma de um grafico de quatro barras.
Ex, numero é 9241
grafico deve ficar assim:

o
o
o
o
o
o o
o o
ooo
oooo

(aqui fica um bocado torto, mas a ideia é na primeira barra 9 bolas, na segunda 2 , terceira 4 e quarta 1. nao sao o, sao *, mas aqui os * ainda ficavam pior na simulaçao)

Nao estou a ver como imprimir as barras uma ao lado das outras…
Nota: ainda nao aprendi a usar Strings nem arrays.

Ja procurei no site algum exercicio parecido mas nao consegui achar.

Bem vindo(a) ao fórum. O ideal é você tentar fazer o código com o que conhece, e tirar dúvidas de erros (ao invés de postar questões para as pessoas aqui escreverem tudo pra ti, porque assim você não treina) mas vamos lá…

Como eu faria?

  1. Eu coletaria o número em formato de String
  2. Faria um laço For, com i correndo pela quantidade de caracteres da string
  3. Faria um laço For, com y correndo até o valor do caractere coletado no For acima
  4. Com um printf escreveria as linhas

Então seu exemplo ficaria:
ooooooooo
oo
oooo
o

Para fazer verticalmente (como você colocou na sua postagem), teria que usar matrizes (arrays de duas dimensões).

Tente escrever esse código, da forma simples que eu botei acima. Depois que fizer, se ainda não funcionar, volta aqui e posta ele, que a gente te ajuda de forma específica, combinado?

Novamente seja bem vindo(a) ao fórum! E, quando estiver mais experiente, lembre de ajudar os novatos aqui!

Obrigado!
Tens razao, vou colocar o que ja fiz.

Em relaçao à tua ajuda, eu ainda nao dei Strings nem arrays, por isso tenho de resolver sem usar isso.

Fica aqui o que fiz:

public class e13 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(“Insira um numero de 4 digitos”);
int num = sc.nextInt();
numValido(num);
tabela(num);

}

//Esta metodo é so para validar que o numero tem 4 digitos, mas este parte nao é importante para o caso//

private static int numValido (int num){
    Scanner sc = new Scanner(System.in);
    while (num < 1000 || num > 9999) {
        System.out.println("Numero inserido invalido! Insira novo numero de 4 digitos");
        num = sc.nextInt();
    }
    return num;
}
private static int tabela (int numero){
    int digito=0;
    int restonumero=0;
    for (int i=1000; numero > 0; i= i/10 ){
        restonumero = numero%i;
        digito=numero/i;
        numero= restonumero;

    }
    return digito;
}

}

//---------------------------------------------- parte para imprimir os *, é aqui que nao estou a conseguir fazer o pretendido //

    int numero=3495;
    int restonumero=0;
    int digito=0;
    for (int i=1000; numero > 0; i= i/10 ){
        restonumero = numero%i;
        digito=numero/i;
        numero= restonumero;

        for (int j=9; j >= 1; j--){
            if (j>digito){
                System.out.println();
            }else System.out.println("*");
        }
    }

Como eu tenho ele nao imprime as barras uma ao lado das outras. Imprime em baixo. Nao é esse o objectivo.

Você está usando uma poderosa linguagem de orientação a objetos de forma estruturada.

Além disso, dá pra simplificar muito teu código.

Mas vamos ao que importa: no final, onde você escreve os (*), experimente trocar de println para print.

Testa aí pra ver se fica como você quer.

Thks pelo feedback, ainda estou a tentar perceber como usar a logica de uma maneira que facilite o codigo.

Se deixar print ele vai imprimir na horizontal.assim:




Mas acho que percebo onde queres chegar, em vez de eu imprimir uma tabela vertical de cada vez, imprimo as 4 ao mesmo tempo, é isso?

Mas dessa maneira tinha de criar uma variavel para cada valor do digito, certo?

Me faz uma gentileza… desenha como você quer o resultado e posta aqui. Nem que seja no paint, todo tremido, serve. Vai ajudar a entender melhor as adequações no código. Obrigado.

Da para entender?

Minha ideia inicial era isolar digito a digito, depois criar um ciclo que imprimi-se * ou de-se espaços. A começar de cima para baixo.

Sem usar array é complicado, pois é o que eu usaria (guardaria os dígitos em um array e faria uma versão “genérica” do algoritmo abaixo).

Mas para esse caso específico (um número de exatamente 4 dígitos), e sem usar String ou array, daria pra fazer assim:

int n = 9241;
int d4 = n % 10;
int d3 = (n / 10) % 10;
int d2 = (n / 100) % 10;
int d1 = n / 1000;
for (int i = 9; i >= 1; i--) {
    if (d1 == i) {
        System.out.print("o ");
        d1--;
    } else System.out.print("  ");
    if (d2 == i) {
        System.out.print("o ");
        d2--;
    } else System.out.print("  ");
    if (d3 == i) {
        System.out.print("o ");
        d3--;
    } else System.out.print("  ");
    if (d4 == i) {
        System.out.print("o ");
        d4--;
    } else System.out.print("  ");
    System.out.println();
}

Primeiro eu uso divisões e resto da divisão (%) para pegar cada um dos dígitos.

Depois faço um loop de 9 a 1, e verifico se cada dígito é igual ao valor da linha atual (a primeira linha é 9, a segunda é 8, etc). Se for, eu imprimo um caractere da coluna (decrementando o dígito correspondente, assim ele também será impresso na linha seguinte) e se não for eu só imprimo espaço.

O resultado é:

o       
o       
o       
o       
o       
o   o   
o   o   
o o o   
o o o o 

Outra opção é ver se o dígito é maior ou igual ao valor da linha atual:

for (int i = 9; i >= 1; i--) {
    if (d1 >= i)
        System.out.print("o ");
    else System.out.print("  ");
    if (d2 >= i)
        System.out.print("o ");
    else System.out.print("  ");
    if (d3 >= i)
        System.out.print("o ");
    else System.out.print("  ");
    if (d4 >= i)
        System.out.print("o ");
    else System.out.print("  ");
    System.out.println();
}

Assim não precisa nem mudar o valor das variáveis.

2 curtidas

Valeu.

Muito obrigado. Honestamente esta foi a primeira ideia que me surgiu, mas isto é uma ficha de exercicios do curso onde é suposto usarmos sempre metodos!
Entao eu tentei arranjar uma maneira de fazer isso, mas ainda nao percebi como posso usar um metodo, sendo Static (porque o void, ainda nao percebi quando o usar), que me imprima 4 variaveis diferentes. Da maneira que eu sei so consigo dar return a um valor.

Mas muito obrigado mais uma vez, era bem simples, eu é que compliquei. Se este exercicio me tivesse aparecido na ficha anterior, onde o objetivo era treinar os ciclos, tinha sido muito provavelmente o jeito que ia fazer.

“Usar métodos” é uma descrição meio genérica pois tem várias formas de fazer, mas enfim, uma alternativa é criar um método pra imprimir o dígito:

void imprime(int digito, int linha) {
    if (digito >= linha)
        System.out.print("o ");
    else System.out.print("  ");
}

...
for (int i = 9; i >= 1; i--) {
    imprime(d1, i);
    imprime(d2, i);
    imprime(d3, i);
    imprime(d4, i);
    System.out.println();
}

E só pra constar - e deixar o tópico mais “completo” - uma solução com arrays seria:

int n = 2357104; // não estou considerando números negativos
// constrói o array com os dígitos de n
int digitos[] = new int[(int) (Math.log10(n) + 1)]; // log(n) + 1 = quantidade de dígitos de n
int maiorDigito = -1;
int aux = n;
for (int i = digitos.length - 1; i >= 0; i--) {
    digitos[i] = aux % 10;
    aux /= 10;
    if (digitos[i] > maiorDigito)
        maiorDigito = digitos[i];
}

// começa pelo maior dígito encontrado (assim evito linhas em branco se o maior não for 9)
for (int i = maiorDigito; i >= 1; i--) {
    for (int d : digitos) {
        if (d >= i)
            System.out.print("o ");
        else System.out.print("  ");
    }
    System.out.println();
}

Eu não estou considerando números negativos (mas se fosse o caso, bastaria usar Math.abs(n) no início para eliminar o sinal).

Primeiro eu construo um array contendo todos os dígitos do número. E também guardo o maior dígito, assim posso começar a imprimir a partir deste (no algoritmo que sugeri nas mensagens anteriores, ele sempre começa do 9, então se o número fosse 123, seriam impressas várias linhas em branco até chegar no 3).

Depois, tendo o array de dígitos, basta usar a mesma lógica que usei anteriormente. Só que antes eu fiz para uma quantidade fixa de dígitos, mas agora ficou mais “genérico” e funciona para qualquer quantidade de dígitos. No caso do exemplo acima, a saída é:

      o       
      o       
    o o       
    o o     o 
  o o o     o 
o o o o     o 
o o o o o   o 

Repare que a penúltima coluna está vazia, representando o 0.

3 curtidas