Problema con errorC2296 en C++

Iniciado por Feynmann, 21 Marzo 2014, 12:54 PM

0 Miembros y 2 Visitantes están viendo este tema.

Feynmann

Buenos dias,

Tengo el siguiente programa:


#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

using namespace std;

int main ()
{
   double pi=1.0;
   int n,i,r ;
   cin >> n;
   for(i=1; i==n; i++){
      pi=pi + (-1)^i/(2*i+1) ;
   }
   cout << pi;
   system("PAUSE");
   return 0;
}


error C2296: '^' : no es válido; el operando izquierdo es de tipo 'double'   


¿como puedo resolver este error, y por que se da?


Muchas Gracias de antemano.
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

amchacon

No existe el operador ^ en C.

Para las potencias hay que usar la función pow (base,exponente)

Aunque en este caso no la necesitas, va a dar 1 si i es par y -1 si es impar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Yoel Alejandro

De acuerdo con amchacón, es más fácil:
Código (cpp) [Seleccionar]

for(i=1; i<=n; i++){
    if ( i % 2 )       /* i impar */
        pi = pi - 1/(2*i+1);
    else               /* i par */
        pi = pi + 1/(2*i+1);
   }

donde por cierto debe ser "i <= n", no "i == n". Esta solución es preferible por cuanto se debe procurar el código que implique menos esfuerzo de cálculo: con esa sentencia evitas invocar la operación de potenciación. Además hay que tener cuidado con la exponenciación de números de base negativa, recuerda que si los parámetros no son adecuados pudiera resultar en un número con una parte imaginaria.

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

Feynmann

Ostras,
Estoy acostumbrado a usar programas de lenguaje simbolico como mathematica y de ahi el ^.
Por otro lado tiene bastante logica todo lo que comentas yoel. Muchas gracias a los dos.

Ultima pregunta: Para aprender me estoy haciendo los ejercicios de problemas resueltos de C++, y ojeandome poco a poco mis dudas por internet. No voy a la universidad y no puedo pagarme clases y no sé si es el mejor metodo para aprender, me aconsejais alguna otra cosa?


Un saludo.
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

dato000

No entendi muy lo que quieres hacer pero aquí va algo:

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>

using namespace std;

int main ()
{
   double pi=1.0;
   int n,i,r ;
   cout << "Digite n:"; cin >> n;
   for(i=0; i<n; i++){ // lo mejor es inicializar el indice en cero
      //pi=pi + (-1)^i/(2*i+1) ;

      pi += pi +( pow(-1, i+1)/(2*i+1));
   }
   cout << pi;
   getchar();
   return 0;
}




Feynmann

Dato000, es un pequeño programa para calcular por aproximación el número pi.

Veo que al final del programa has usado

getchar();


He buscado , pero no acabo de entender para que sirve, por que lo pones?
"La función getchar retorna el carácter siguiente desde el stream de entrada apuntado por stream. Si el stream está en el final de fichero, el indicador del final de fichero para el stream es activado y getchar retorna EOF. Si ocurre un error de lectura, el indicador de error para el stream es activado y getchar retorna EOF."
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

dato000

No claro claro, entiendo lo del uso del pi, lo que no se es que tipo de operación necesitas ejecutar para el cálculo. Es obtener PI pero no se como es la ecuación.

getchar es como un System("PAUSE") sin el System("PAUSE"), ejecuta una sentencia en la que espera que el usuario digite una tecla para avanzar con el programa. El problema de usar un llamado al sistema es bueno, por costumbre o tradición no deberia hacerse eso, es como una mala practica, las razones y demás, pues te dirán que es por memoria o saturación y eso, pero para este tipo de ejercicios, es simplemente adquirir buenas bases, y usar sentencias que llaman al sistema directamente es bueno, algo incorrecto.



Feynmann

Me ha quedado clarísimo lo del getchar();, Genial.

Respecto a tu pregunta, la expresion que te da el numero Pi por aproximación es la siguiente:

Pi/4= 1-(1/3)+(1/5)-(1/7)+(1/9)- ... = Sumatorio (de 0 a n)[(-1)^n/(2n+1)]

Gracias dato000 ;)

Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!

dato000

En ese caso seria algo así, no se si son correctos los valores, pero viendo la función mátematica sería algo así:

Código (cpp) [Seleccionar]
for(i=0; i<=n; i++)  // lo mejor es inicializar el indice en cero
{
      //pi=pi + (-1)^i/(2*i+1) ;

      pi = pi + ( pow(-1, i) / ( 2*(i+1) ) );
      //tambien funciona con pi += ( pow(-1, i) / ( 2*(i+1) ) );
}



Feynmann

Perfecto, todo entendido.
Muchas gracias!  :D
Novato curioso, me gustaria aprender a programar bien en C/C++ por eso estoy aqui. Pero puedo echar una mano a cualquiera que me lo pida en temas de electronica!