Un favor este es mi codigo quisiera saber porque no me sale el reusltado

Iniciado por Julia13, 13 Mayo 2021, 16:03 PM

0 Miembros y 1 Visitante están viendo este tema.

Julia13

Código (cpp) [Seleccionar]

#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
int n, k, factorial;
float w,x,y,z,resultado;
cout << "¿Cuantos terminos?:\t";
cin >> k;
if (k > 0 && k < 15);
else {
cout << "¿Cual es el valor de k?:\t";
cin >> k;
}
cout << "¿Cual es el valor de x?:\t";
cin >> x;
if (x > -2 && x < 2);
else {
cout << "¿Cual es el valor de x?:\t";
cin >> x;
}
for (int i = 1; i <=k; i++)
{
y = pow(-1, k);
z = pow(x, 4 * k);
factorial = factorial * i;
w = w + factorial;
resultado = y * w * z;
}
cout << "La suma de los términos es:\t" << resultado;
}

tiene que salirme una sumatoria:
ese es la ecuacion donde tengo que poner los valores((-1)^k*(1/(2k)!)*(x^4k))
Ejemplo
¿Cuantos términos?: 10
¿Cuál es el valor de x?: 1.5
La suma de los términos es: -0.62817

¿Que esta mal ahi??


MOD: El código debe estar entre etiquetas de Código GeSHi

fzp

Aparte de que funcione o no hay cosas que están mal ahí. ¿Por qué para el dato k en un primer momento lo limitas a unos valores pero luego le quitas la limitación y dejas que se pueda entrar un nº cualquiera?

En una condición if indicas que debe estar entre  0 y 15, en cuyo caso no se hace nada, pero si no se cumple en el else subsuguiente lo vuelves a introducir como dato sin ninguna limitación, con lo cual podría introducirse se un nº que no esté en el rango 0 - 15. Además no sé si corresponde al mismo dato o deben de ser dos datos distintos, ya que para la primera vez que introduces k el mensaje es "cuántos términos", pero en el else se pregunta "cual es el valor de k?". En todo caso el nº introducido si es el caso del else te machacará el primer nº introducido.

Lo mismo ocurre con la introducción de x. Primero se pretende que esté limitado al rango -2 - 2, pero si no se cumple se deja que se vuelva a meter un valor cualquiera, que podría estar fuera de ese rango. ¿Por qué?

Tampoco entiendo por qué incluyes la biblioteca conio. No he mirado más del comportamiento del programa.

K-YreX

Como ya te ha comentado @fzp, esa no es la manera correcta de hacer un filtro. La forma estándar es:
Código (cpp) [Seleccionar]

const int MIN_NUM_TERMINOS = 0; // Constante para el numero minimo de terminos permitido
const int MAX_NUM_TERMINOS = 15; // Constante para el numero maximo de terminos permitido

int main() {
  int terminos;
  do {
    cout << "Introduce el numero de terminos [" << MIN_NUM_TERMINOS << " - " << MAX_NUM_TERMINOS << "]: ";
    cin >> terminos;
  } while(terminos < MIN_NUM_TERMINOS || terminos > MAX_NUM_TERMINOS);

  // Cuando llegues a esta linea ya tendras un valor dentro del rango permitido
}



Breve paréntesis: No es buena práctica crear un if() vacío para incluir código en la parte del else.
Código (cpp) [Seleccionar]

// Esto:
if(numero > 0 && numero < 15);
else {
  ...
}
// Se puede sustituir por esto:
if(numero <= 0 || numero >= 15) {
  ...
}

Fin del paréntesis.


Además tienes otro problema importante y es que tienes variables sin inicializar. Estas variables dependiendo del ámbito en el que estén (local/global) tendrán un valor nulo (0 en caso de números) o basura (cualquier número). Siempre tienes que controlar que no pase esto en tus programas.

Teniendo en cuenta la sumatoria que quieres calcular:

[latex]$\displaystyle \sum_{k=1}^n (-1)^k \times \frac{1}{(2k)!} \times {x^{4k}}$[/latex]

deberías entender lo que estás haciendo y no copiar la fórmula lo más parecida posible...

El primer elemento de la serie sería: [latex]$\displaystyle e_1 = (-1)^1 \times \frac{1}{(2\times1)!} \times {x^{(4\times1)}} = -1 \times \frac{1}{2!} \times {x^4}$[/latex]

El segundo elemento de la serie sería: [latex]$\displaystyle e_2 = (-1)^2 \times \frac{1}{(2\times2)!} \times {x^{(4\times2)}} = 1 \times \frac{1}{4!} \times {x^8}$[/latex]

Viendo los primeros elementos de la serie puedes ver la relación que sigue. Por ejemplo:
  • La primera parte únicamente cambia el signo del elemento. Cuando k es par, el signo es positivo y cuando k es impar el signo es negativo.
  • La segunda parte tiene un factorial que puede resultar costoso de calcular. Sin embargo, si en la primera iteración tienes calculado 2!, basta multiplicar por 3 y por 4 para tener 4! y así sucesivamente sin tener que repetir cálculos.
  • La tercera parte tiene x^4 en el primer elemento y x^8 en el segundo. En el tercero sería x^12, o lo que es lo mismo en cada iteración se multiplica por x^4. x^4 * x^4 = x^(4+4) = x^8 (propiedades de las potencias)

    Sabiendo todo esto:
    Código (cpp) [Seleccionar]

    int main() {
      // Inicializamos el resultado a 0 para poder acumular correctamente
      double resultado = 0;

      // Las variables n y x no hace falta inicializarlas porque se van a pedir por teclado
      int n;
      double x;

      // Inicializamos las variables para k = 1
      int signo = -1; // (-1)^1 = -1
      double factorial = 2; // (2 * 1)! = 2! = 2
      double elemento3 = pow(x, 4); // x^(4 * 1) = x^4. AVISO: Primero hay que pedir x

      for(int i = 1; i <= n; ++i) {
        // Sumamos el elemento i
        resultado += signo * 1/factorial * elemento3;
        // Actualizamos cada uno de los elementos
        signo *= -1; // Asi cambiamos de signo en cada iteracion
        factorial = ...;
        elemento3 = ...;
      }
    }
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;