1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[Duvida] programa java

Discussão em 'Programação' iniciada por Silvering, 9 de Abril de 2009. (Respostas: 27; Visualizações: 2444)

  1. Como posso apresentar num output um valor com 3 casas decimais tendo em conta que introduzi um valor inteiro no input

    por exemplo:

    double a = in.nextDouble(); // introduzo um valor inteiro no teclado, por exemplo 3

    System.out.println(a);

    o output será 3.0

    Ou seja com uma casa decimal. Como posso colocar o output com 3 casas decimais?

    PS: Este post foi modificado por completo. Há uma hora coloquei aqui uma questão, no entanto deixei de ter duvidas relativamente a essa mesma questão pelo que a apaguei na totalidade.
    Agora tenho outra...

    Cumps ;)
     
    Última edição: 9 de Abril de 2009
  2. Mr_Miguel

    Mr_Miguel Power Member

    Código:
    public class tres_casas_decimais {
        public static void main(String args[]) {
            double o_meu_double = 5.0;
            System.out.printf("%.3f\n", o_meu_double);
        }
    }
    
    Se, por exemplo, quisesses imprimir com 5 casas decimais, o formato seria "%.5f" em vez de "%.3f".
     
  3. Obrigado, mas isso não me ajuda muito naquilo que eu pretendo :sad:

    O que eu gostava era de saber como uma variável (do tipo double ou float) pode ficar reduzida a 3 casas decimais através de uma instrução de afectação...
     
  4. Mr_Miguel

    Mr_Miguel Power Member

    Um float e um double têm a precisão que têm. À partida, tu não podes dizer a nenhum deles "olha, só quero que armazenes, no máximo, até 3 casas decimais, faça o que eu fizer. Se eu fizer uma soma, vais continuar com 3 casas; se eu fizer uma multiplicação, continuas com 3 casas. Ficas sempre com três casas e nunca mais do que 3".

    O máximo que podes fazer, tal como mostrei, é formatar o output de modo a que só mostre até 3 casas decimais. Também é possível obter uma String que tem lá dentro uma representação do número também com 3 casas decimais.

    O que estás a tentar fazer ao certo? Preciso de mais algumas "dicas" tuas, se não estou a dar tiros no escuro. ;)
     
  5. Percebo :rolleyes:

    Eu fiz um programa que cumpre este enunciado:
    [FONT=&quot]1.[/FONT][FONT=&quot]Escreva um programa que leia várias sequências de[/FONT][FONT=&quot]números inteiros, apresentando no standard output a média dos números pares e a média dos números ímpares de cada sequência.
    Cada sequência é precedida de um número inteiro que indica a sua dimensão. A leitura termina quando for introduzida uma sequência vazia (de dimensão 0).
    A seguir apresenta-se um exemplo com duas sequências e a respectiva saída formatada a 3 casas decimais.[/FONT]



    [FONT=&quot]<entrada>[/FONT]
    5 1 2 3 4 5 4 22 11 33 21 0

    [FONT=&quot]<saída>[/FONT]
    Teste 1
    Media pares 3.000
    Media impares 3.000
    Teste 2
    Media pares 22.000
    Media impares 21.667


    O programa que eu fiz calcula a média dos valores pares e ímpares de cada sequência, guardando, aquando do cálculo de cada uma, tudo numa String e tudo separado por espaços. As duas primeiras médias dizem respeito ao teste 1, as outras dizem respeito ao teste 2 e assim sucessivamente...

    Depois faço um ciclo para mostrar os valores em output... Uma coisa assim:
    Código:
    while (i<S.length()){
    System.out.println("Teste " + t );
    t++;
    System.out.print("Media pares  ");
        while(S.charAt(i) != ' ' ) {
        System.out.print(S.charAt(i));
        i++;
        }
    i++;
    System.out.println("");
    System.out.print("Media impares  ");
        while(S.charAt(i) != ' '){
        System.out.print(S.charAt(i));
        i++;
        }
    i++;
    System.out.println("");
    System.out.println();
    }
    
    Se a única maneira de reduzir a 3 casas é formatando o output acho que posso esquecer...

     
  6. AliFromCairo

    AliFromCairo Power Member

    Hmm, não devias guardar esses dados numa String. Podes utilizar uma colecção de Doubles, e em seguida podes seguir a sugestão que já aqui foi colocada; é bastante mais simples.
     
  7. Uma colecção de Doubles...

    Troca lá isso por miúdos... :rolleyes:
     
  8. AliFromCairo

    AliFromCairo Power Member

    Ao invés de ires concatenando os valores a uma String, utilizas uma colecção (lista, por exemplo) para guardar esses mesmos valores. Ou seja, ao invés de teres algo do género:

    Código:
    String S = "";
    para cada valor:
         S += " " + valor;
    
    Vais ter:
    Código:
    List<Double> medias = new LinkedList<Double>();
    para cada valor:
        medias.add(valor);
    
    Obviamente que o código precisa de ser modificado, tendo em conta as manipulações que estás a fazer, mas a ideia base de utilizar uma colecção é esta.
     
  9. Depois como recupero os valores?

    Nunca utilizei isso isso... lol...

    ;)
     
  10. AliFromCairo

    AliFromCairo Power Member

    Utilizas o método get. Por exemplo, medias.get(20) irá devolver o elemento na posição 20 da lista, tal como o S.charAt(i) devolve o elemento na posição i da String S.
     
  11. Mr_Miguel

    Mr_Miguel Power Member

    Tanta complicação...

    Eu acabei de fazer o tal programa em Java e passa às mil maravilhas no teste que apresentaste com a sugestão que te dei. E não precisei de usar nenhuma colecção.

    Com 4 variáveis (ok, não são só 4, mas são as principais) resolve-se logo o problema:

    1 variável para a soma dos números pares (int)
    1 variável para a soma dos números ímpares (int)
    1 variável para o número de números pares (int)
    1 variável para o número de números ímpares (int)

    Pura e simplesmente eu não preciso de armazenar números. Para a média só preciso da soma deles e do número deles.

    Outra sugestão tem a ver com o facto de haver a possibilidade de imprimir uma vírgula como separador decimal em vez do ponto (i.e 3,000 em vez de 3.000). Para isso, o printf sofre a seguinte alteração:

    Código:
    System.out.printf(Locale.US, "%.3f\n", o_meu_double);
    


    Nos Estados Unidos, o separador decimal é o ponto, daí o Locale.US.

     
    Última edição: 9 de Abril de 2009
  12. Eu também fiz assim Mr_Miguel o problema é que tenho mesmo de armazenar os números.

    Assim que acaba uma sequência tenho de escrever logo a outra, não deve aparecer logo o output relativo à media dos valores pares e ímpares dessa sequência.

    O output só deve aparecer quando finalizas após finalizares a ultima sequência colocando depois 0 no input.

    Depois surge o output com a média de cada uma das sequências.


    Vou tentar fazer isto aplicando a colecção de Doubles ;)
     
  13. Mr_Miguel

    Mr_Miguel Power Member

    Mesmo assim é desnecessário armazenar os números. Se queres "atrasar" a mostragem do output de tal modo que só no final é que aparece, podes é armazenar o próprio output. Isso consegue-se com um BufferedWriter.

    Isto parece-me um daqueles problemas em que se faz um programa e depois submete-se para uma plataforma que diz se o programa está bem, se está mal, se corre dentro do limite de tempo que eles querem, etc.

    É que eu efectivamente tive duas cadeiras com esse tipo de problemas, e usávamos uma plataforma chamada Mooshak onde se submetia o código.

    É este o teu caso? É que se este é o teu caso, pouco importa à plataforma se o output é mostrado no início, no meio ou no fim. O que tu deves estar a tentar dizer-me é que compensa mais só mostrar o output todo no fim, porque efectivamente isso demora menos tempo. É isso?
     
  14. Eu estou simplesmente a basear-me na interpretação que fiz do enunciado. Também fiz um programa que mostrava o output sequencialmente, mas achei que o programa não respeitava o enunciado. Preciosismos meus se calhar :rolleyes:

    Não sei o que é um BufferedWriter, nem um Mooshak, repara isto é apenas um exercício respeitante ao primeiro trabalho da cadeira de Programação do 1º Semestre de Engenharia Informática portanto não compliques demasiado a questão, eu estou apenas no 1º semestre. ;)

    Neste trabalho posso utilizar condições, ciclos, String's e pouco mais, só para teres uma ideia.

    Provavelmente nem poderei utilizar listas de Doubles, mas que se dane, tentarei elaborar o programa dessa forma.

    Até já :cool:
     
  15. Mr_Miguel

    Mr_Miguel Power Member

    OK, assim já se fez mais luz deste lado :)

    Vai fazendo o programa da maneira que entenderes, então. Quando concluíres e o tiveres submetido ao professor (ou a quem tiveres que submeter) e tiveres a resposta dele, podemos comparar soluções se quiseres.

    Por outro lado, se chegares à conclusão que não consegues fazer o programa, dá uma apitadela. Uma coisa eu digo-te: se de facto isso de mostrar o output só depois de introduzires o 0 não era um preciosismo teu, então a tua faculdade exige demasiado dos estudantes logo no 1º semestre, mas deixamos isso para depois :)
     
  16. List<Double> medias = new LinkedList<Double>();

    da erro de compilação :S

    E como faço para o tamanho da lista:

    S.length() - utilizo este metodo para saber o tamanho da uma String S

    Posso usar medias.length ??
     
  17. Mr_Miguel

    Mr_Miguel Power Member

    Eu acho que o AliFromCairo quis dizer foi:

    Código:
    LinkedList<Double> medias = new LinkedList<Double>();
    
    Para o tamanho da lista, não usas length(), mas sim size()

    Código:
    int tamanho = medias.size();
    
     
  18. AliFromCairo

    AliFromCairo Power Member

    Assumindo que estás a utilizar uma versão recente do Java, não deveria haver problema uma vez que a LinkedList implementa a interface List. De qualquer das formas, e tendo em conta o que disseste acerca do contexto desse trabalho, talvez a interpretação que o Mr_Miguel fez seja a correcta, uma vez que apenas envolve conceitos básicos da linguagem. No enunciado que aqui colocaste apenas é referido que a leitura termina naquele carácter; não diz nada em relação à ordem de escrita.
     
  19. Curiosamente também já tinha tentado isso (e voltei a tentar) e continuo na mesma, dá erro de compilação.

    Estou a usar linha de comandos executando o javac, poderá estar aqui o problema?

    EDIT: Pois, provavelmente não tenho a versão mais recente do Java
     
  20. AliFromCairo

    AliFromCairo Power Member

    Hmm, caso seja possível, coloca aqui o erro exacto que te está a aparecer.
     

Partilhar esta Página