• Matéria: Informática
  • Autor: xremix20
  • Perguntado 8 anos atrás

Boas alguém me pode ajudar neste exercico?
crie uma função para calcular Sn= 1 + 1/1 + 1/2 + 1/3 + 1/4...1/n
o n é o numero que o utilizador digita.
o código que tentei fazer foi:

public static void main(String[] args) {
Scanner teclado = new Scanner(System.in);
System.out.println("Introduza um número n:");
int n = teclado.nextInt();
calcularS(n);
}

public static int calcularS(int n){
int count=1;
double divide =0;
double soma =0;
for (int i = 0; i <= n;i++) {
if(n<9){
count++;
divide = n/count;
soma *= divide;
System.out.println("total: "+soma);
}

}
return count;
}
}

Respostas

respondido por: bokomoko
1
De fato o programa tem alguns problemas.

Primeiro, a soma de uma série 1 + 1/1 + 1/2 + 1/3 + 1/4 ... + 1/n vai resultar num número fracionário, real. Não num int

Acontece que a função que você criou, 
public static int calcularS(int n)

está definida como int !! Não pode ! ela tem que ser double. assim
public static double calcularS(int n)

dentro da função a coisa complicou .
você criou duas variáveis que não são necessárias 
count não é necessária pois você já usará a própria variável i para fazer o contador
divide também não é necessária porque basta dividir 1 pelo contador e somar.
A variável soma está definida corretamente porém ela tem que ser iniciada com 1 e não com 0. Observe a série
1 + 1/1 + 1/2 + 1/3 + 1/4 ... 1/n  
Ora toda série começa com 1 + alguma coisa
imagine que o denominador dessas frações acima será o i que vai variar de 1 até n inclusive 
Portanto soma = 1;

Depois o loop for começa de 1 e vai até n inclusive

Dentro   do loop você faz um if se o n < 9 ... para que ? 
Esse if é totalmente desnecessário. Não precisa testar isso

Aí vem o erro na soma
você está usando o operador *= que é multiplicar por
esse comando foi escrito por você assim
soma *= divide;
Bom, já expliquei que o divide não é necessário. basta colocar 1/i;
Mas além disso, é preciso SOMAR e não MULTIPLICAR. Do jeito que você fez a série seria
1 * 1/1 * 1/2 * 1/3 * 1/4 .... * 1/n
não é isso que o enunciado pediu. O enunciado pediu SOMA e não MULTIPLICACAO então o operador deve ser += assim
soma += 1/i;

Aí tem um problema. Em Java, divisão de operadores inteiros resulta em divisão inteira. então 1/i, será sempre 0 para qualquer i maior que 1
quanto é 1 divido por 2 ? se a divisão for inteira vai dar 0. Se a divisão for ponto flutuante vai dar 0.5 e é essa que queremos
Então  usamos um truque para tornar a divisão ponto flutuante fazemos assim
soma += 1.0 / i ; 
O numerador da fração deixou de ser 1 (int) para ser 1.0 (double) e aí tudo vai ser calculado corretamente.

Por último, você colocou DENTRO do laço for a impressão do resultado do cálculo. Isso significa que o resultado intermediário do cálculo será exibido sem necessidade. A boa prática recomenda que não se imprima dentro das funções. A função deve apenas calcular o valor e a decisão se imprime ou não fica a cargo do programa principal.

Corrigindo o código, fica bem mais simples assim

/*
crie uma função para calcular Sn= 1 + 1/1 + 1/2 + 1/3 + 1/4...1/n 
o n é o numero que o utilizador digita.
*/ 

import java.util.Scanner;
class Main {
  public static void main(String[] args) {
    Scanner teclado = new Scanner(System.in);
    System.out.println("Introduza um número n:");
    int n = teclado.nextInt();
    System.out.println("Resultado da série : "+calcularS(n)); 
  }

  public static double calcularS(int n){
    double soma =1;
    for (int i = 1; i <= n;i++) {
          soma += 1.0 / i ;
    };
    return soma;
  }
}

se quiser ver o programa funcionando, acesse o link
https://repl.it/@bokomoko/soma-de-serie-1n

Você quer tornar-se programador ? 


xremix20: Sim. Eu ando a estudar numa universidade meu problema é que muitas das vezes não consigo chegar facilmente á conclusão do problema. penso que esteja relacionado com a matemática.
xremix20: Voçê explicou muito bem o exercício. Obrigado
bokomoko: você tem que praticar mais. As dificuldades que você tem não são relacionadas a conhecimento de matemática mas sim a raciocínio lógico. Pensar mais antes de fazer. Experimentar mais e entender o que está fazendo.
Perguntas similares