elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Un favor este es mi codigo quisiera saber porque no me sale el reusltado
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Un favor este es mi codigo quisiera saber porque no me sale el reusltado  (Leído 3,406 veces)
Julia13

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Un favor este es mi codigo quisiera saber porque no me sale el reusltado
« en: 13 Mayo 2021, 16:03 pm »

Código
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <math.h>
  4. using namespace std;
  5. int main()
  6. {
  7. int n, k, factorial;
  8. float w,x,y,z,resultado;
  9. cout << "¿Cuantos terminos?:\t";
  10. cin >> k;
  11. if (k > 0 && k < 15);
  12. else {
  13. cout << "¿Cual es el valor de k?:\t";
  14. cin >> k;
  15. }
  16. cout << "¿Cual es el valor de x?:\t";
  17. cin >> x;
  18. if (x > -2 && x < 2);
  19. else {
  20. cout << "¿Cual es el valor de x?:\t";
  21. cin >> x;
  22. }
  23. for (int i = 1; i <=k; i++)
  24. {
  25. y = pow(-1, k);
  26. z = pow(x, 4 * k);
  27. factorial = factorial * i;
  28. w = w + factorial;
  29. resultado = y * w * z;
  30. }
  31. cout << "La suma de los términos es:\t" << resultado;
  32. }
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


« Última modificación: 14 Mayo 2021, 20:17 pm por K-YreX » En línea

fzp

Desconectado Desconectado

Mensajes: 130


Ver Perfil
Re: Un favor este es mi codigo quisiera saber porque no me sale el reusltado
« Respuesta #1 en: 14 Mayo 2021, 08:26 am »

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.


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Un favor este es mi codigo quisiera saber porque no me sale el reusltado
« Respuesta #2 en: 14 Mayo 2021, 22:09 pm »

Como ya te ha comentado @fzp, esa no es la manera correcta de hacer un filtro. La forma estándar es:
Código
  1. const int MIN_NUM_TERMINOS = 0; // Constante para el numero minimo de terminos permitido
  2. const int MAX_NUM_TERMINOS = 15; // Constante para el numero maximo de terminos permitido
  3.  
  4. int main() {
  5.  int terminos;
  6.  do {
  7.    cout << "Introduce el numero de terminos [" << MIN_NUM_TERMINOS << " - " << MAX_NUM_TERMINOS << "]: ";
  8.    cin >> terminos;
  9.  } while(terminos < MIN_NUM_TERMINOS || terminos > MAX_NUM_TERMINOS);
  10.  
  11.  // Cuando llegues a esta linea ya tendras un valor dentro del rango permitido
  12. }

Breve paréntesis: No es buena práctica crear un if() vacío para incluir código en la parte del else.
Código
  1. // Esto:
  2. if(numero > 0 && numero < 15);
  3. else {
  4.  ...
  5. }
  6. // Se puede sustituir por esto:
  7. if(numero <= 0 || numero >= 15) {
  8.  ...
  9. }
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:

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

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: $\displaystyle e_1 = (-1)^1 \times \frac{1}{(2\times1)!} \times {x^{(4\times1)}} = -1 \times \frac{1}{2!} \times {x^4}$

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

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
  1. int main() {
  2.  // Inicializamos el resultado a 0 para poder acumular correctamente
  3.  double resultado = 0;
  4.  
  5.  // Las variables n y x no hace falta inicializarlas porque se van a pedir por teclado
  6.  int n;
  7.  double x;
  8.  
  9.  // Inicializamos las variables para k = 1
  10.  int signo = -1; // (-1)^1 = -1
  11.  double factorial = 2; // (2 * 1)! = 2! = 2
  12.  double elemento3 = pow(x, 4); // x^(4 * 1) = x^4. AVISO: Primero hay que pedir x
  13.  
  14.  for(int i = 1; i <= n; ++i) {
  15.    // Sumamos el elemento i
  16.    resultado += signo * 1/factorial * elemento3;
  17.    // Actualizamos cada uno de los elementos
  18.    signo *= -1; // Asi cambiamos de signo en cada iteracion
  19.    factorial = ...;
  20.    elemento3 = ...;
  21.  }
  22. }
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines