[Duvida] programa java

Silvering

Membro
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:
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".
 
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...
 
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. ;)
 
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...

 
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.
 
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.
 
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.
 
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:
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 ;)
 
O output só deve aparecer quando finalizas após finalizares a ultima sequência colocando depois 0 no input.

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?
 
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:
 
Programação do 1º Semestre de Engenharia Informática (...) 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.

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 :)
 
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 ??
 
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 ??

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();
 
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.
 
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
 
Back
Topo