Informática, perguntado por mamelia1969, 1 ano atrás

Por favor me ajudem! Não consigo sair dessa questão!

Faça um programa em linguagem C que calcule e escreva a soma dos N primeiros termos da série: (na imagem)

Um termo é uma divisão do tipo Numerador/Denominador. O número de termos deve ser fornecido pelo usuário. Escreva mensagens para o usuário, informando o que deve ser digitado. Cuidado, pois algumas variáveis devem ser de números reais. Cuidado também com o sinal que se alterna. Procure controlar o numerador e o denominador com variáveis diferentes.

Tabulação dos blocos, capricho na escrita, legibilidade valem nota. Você pode usar o DevCpp para auxiliá-lo nessa tarefa.

Anexos:

Soluções para a tarefa

Respondido por MetalUp
1
Bom, vou tentar te dar uma luz, cabe a você terminar e testar.

int nTermos, cont;
float sTotal = 0;
float temp = 0;

scanf("%d", &nTermos);

for(cont=1; cont<=nTermos; cont++){

       temp = (400 - 5*cont)/(10 + 3*cont);

       if(cont%2 == 0) {  //se é entrada par
              sTotal -= temp;
       } 
       else{
             sTotal+=temp;
       }

}

bokomoko: tá horrível esse código. Pode ser muito simplificado
MetalUp: Argumenta aí o "espertão". Quer trazer o que? Generalização matematica e recursividade? A única coisa que da pra simplificar realmente nesse nível de programação é a remoção da variável temporária.
bokomoko: Você não aceita críticas mesmo né ? :)
MetalUp: Não de quem não argumenta.
MetalUp: Esse código aí de cima só tem o excesso na variável 'temp'
MetalUp: Os que você citou do site lá estão bem maiores, e tem mais variáveis.
bokomoko: O sinal pode ser otimizado. Dá uma olhada na resposta que editei.
Respondido por bokomoko
1
Temos 3 coisas aí

O numerador diminui de 5 em 5 a partir de 400 
O denominador aumenta de 3 em 3  a partir de 10
O sinal alterna entre +1 e -1 

A soma começa com zero
O loop pode ser controlado tanto pelo numerador, como pelo denominador. 

Presumimos que o numerador começa em 400 e vai até 0 com passo 5, esse pode ser o for
Dentro do laço, fazemos a soma, adicionamos mais 3 ao denominador e invertemos o sinal para a próxima iteração.

Para inverter o sinal é só multiplicar por -1. O sinal começa com 1 e a cada iteração multiplica por -1. Assim 1 * -1 = -1 , -1 * -1 = 1 e assim vai.

COnsegue fazer agora ? 

int main() {
     float soma = 0;
     for (int numerador = 400, denominador =10, sinal=1; numerador >0 ; numerador -= 5 ) {
         soma+= sinal * numeador / denominador;
         sinal *= -1;
        denominador += 3;
     }
     printf("%f\n", soma);
}

ou podemos fazer assim, de uma forma bem pouco ortodoxa
int main(void) {
  int sinal, denominador, numerador;
  int conta(){ 
     sinal *=-1;
     denominador+=3;
     numerador -=5;
  }

  float soma = 0;
  for ( (numerador= 400, denominador = 10, sinal=1); numerador >0; conta() ){
    soma += (float) sinal * numerador / denominador;
  }
  printf("soma %f\n",soma);
  return 0;



bokomoko: Seguindo a segunda hipótes, podemos fazer assim
MetalUp: Existe uma tendencia matemática dos valores futuros se tornarem 0, mas o numerador pode ser -5, -10, -15... ao menos nessa descrição. Então não existe assumir que tudo será 0 a partir de x iterações.
MetalUp: Será um valor tão pequeno quanto.
bokomoko: Tem razão!
bokomoko: O numerador não vai zerar. Eu estava enganado ! Ele pode continuar indefinidamente ! Bom, de qualquer forma, o ponto que eu acho que pode melhorar no seu programa é o lance do sinal ok ?
Dá para fazer mais simples, basta só multiplicar por -1, sacou ? Que acha ?
MetalUp: Não acho certo nem errado, cada pessoa tem uma solução. Existem várias formas de resolver problemas de programação. Eu fiquei chateado pois você não pode atribuir uma solução como ruim, exceto, que se fale de desempenho. Se a pessoa pede ajuda por aqui, ela não chegou ao ponto de se preocupar com isso, ela só precisa saber como resolver.
bokomoko: Concordo. Perdoe-me se fui incisivo, ok ? Sem ressentimos ? Na boa.
Mas diz aí, que achou da ideia ? Gostou da dica ?
bokomoko: Que achou daquela dica de chamar uma função o incrementador do laço, hein ? Pouco usual né ?
bokomoko: você rodou o seu programa ? Quanto dá até o numerador ser 0 ? Só para comparar aqui com o meu.
bokomoko: Não há perdão em seu coração ?
Perguntas interessantes