Problema con errorC2296 en C++

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

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

amchacon

No recomiendo para nada usar pow aquí, es muy mala práctica ya que pow es una función relativamente costosa y aquí no la necesitas.

La solución que propone yoel_alejrando soluciona el problema. Aunque yo opto por esta otra, más corta, más concisa, sin comparaciones y sin copypastear líneas:

Código (cpp) [Seleccionar]
int signo[2] = {1,-1};
for(i=1; i<=n; i++)
  pi = pi - signo[i%2]/(2*i+1);
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

leosansan

#11
Cita de: amchacon en 22 Marzo 2014, 19:08 PM
No recomiendo para nada usar pow aquí, es muy mala práctica ya que pow es una función relativamente costosa y aquí no la necesitas.
....................................

Totalmente de acuerdo.

Antes que nada, le sobraban dos librerías,  <fstream>, <string> y le habría faltado tal como lo tenía  <cstdlib> para el system. Ahora con getchar faltaría <cstdio> y sin pow sobraría <cmath>.

Me apunto al no uso de pow y, como simple variante al método de amchacon, ya que creo que "*" es menos costosa como operación que "%":


Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdio>

using namespace std;

int main () {
  double pi,serie=0.0;
  int n,i,mas_menos=1 ;
  cout << "Entre el numero de terminos a tomar: ";
  cin >> n;
  for(i=0; i< n; i++){
     serie+=(1./(2*i+1))*mas_menos;
     mas_menos*=-1;
  }
  pi=4*serie;
  cout << pi<< endl;
  getchar();
  return 0;
}


Yen mi código es" i<", no" i<=" ya que en dicho caso tomaría un sumando de más.

Observar el 1. en 1./(2*i+1) ya que de poner sólo 1/(2*i+1) la operación sería entre enteros y no daría el resultado esperado de double.

Y Feynmann para cuando cuelgues  código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Feynmann


Me ha molado mucho ver esas dos ultimas formas de hacerlo, sobre todo la que propone leosansan, deduzco que
Código (cpp) [Seleccionar]
variable = variable + algo. /* Es lo mismo que*/ variable += algo
Lo de las librerias tengo que tener cuidado por lo que veo.


Gracias 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!

leosansan

Cita de: Feynmann en 23 Marzo 2014, 15:56 PM
Me ha molado mucho ver esas dos ultimas formas de hacerlo, sobre todo la que propone leosansan, deduzco que
Código (cpp) [Seleccionar]
variable = variable + algo. /* Es lo mismo que*/ variable += algo
Lo de las librerias tengo que tener cuidado por lo que veo.


Gracias un saludo!!
 

Gracias, gracias, me alegra que te haya gustado el "mas_menos".  ;)

Y sí, son formas equivalentes y más usuales:


Código (cpp) [Seleccionar]
variable = variable + algo. /* Es lo mismo que*/ variable += algo

Código (cpp) [Seleccionar]
variable = variable * algo. /* Es lo mismo que*/ variable *= algo

Código (cpp) [Seleccionar]
variable = variable - algo. /* Es lo mismo que*/ variable -= algo

Código (cpp) [Seleccionar]
variable = variable / algo. /* Es lo mismo que*/ variable /= algo

Y alguna más.

Y lo de las librerías no estaba mal en si, sólo que sobraban y es un "cante" para si te corrige algún profesor darse cuenta de tus lagunas, que tenerlas las tendrás, como todos, pero una máxima del estudiante es que al menos no se noten.

¡¡¡¡ Saluditos! ..... !!!!






Feynmann

Gracias de nuevo por el aporte!

Que va, estoy aprendiendo por mi cuenta para poder implementarlo a cosillas del curro que necesito... ya me gustaria estar estudiando! jajaja
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!

Yoel Alejandro

Me perdí de un rato en el foro, pero bueno .....

Respecto a getchar() y system("PAUSE"), aunque operan similarmente, la primera es estándar y funcionará en cualquier sistema. La segunda, se puede garantizar siempre que estés en un sistema Windows.

Lo que ocurre es que system(str) pasa la cadena str al procesador de comandos del sistema operativo. Hacer system(str) es lo mismo que abrir el Símbolo de Sistema de Windows y escribir el contenido de la cadena str en él. Y como es de suponer, la cadena será interpretada en el contexto del sistema operativo de que se trate.

Por esta razón, recomendamos usar getchar() que tiene un comportamiento predecible. Lo que hace

c = getchar();

es esperar la pulsación de una tecla, seguida de ENTER (o de la secuencia EOF) y depositar el código ASCII de esta tecla en c. Si pulsas 'A' y luego ENTER asignará en c el valor 97 que es el código ASCII de la letra 'a'.
Si pulsas sólo ENTER entonces retornará al programa inmediatamente. Por eso la invocación de getchar() es para los programadores de C un equivalente a "Pulse ENTER para continuar", jejeje.

=====================================
De todas las soluciones publicadas creo que la mejor (más eficiente computacionalmente) sería la de leosansan porque no requiere siquiera calcular el módulo i%2. Yo la reduciría "un pelín" con:

int signo = -1;

for (i = 1;  i<= n; i++, signo *= -1)
   pi = pi + signo * 1.0/(2*i+1);


y buena la observación del "1." en lugar de "1".
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)