Ayuda en C++, programación modular

En la universidad hemos estado todo el cuatrimestre programando en pascal... Y ahora para deberes, como no tenemos suficiente con los examenes finales, nos han mandado programar algunos de los primeros programas que hicimos en pascal en C++ para que aprendamos...

Llevo hechos 5 perfectamente, ahora ha llegado la hora de usar funciones o procedimientos y en C++ no me aclaro. Que es eso de los prototypes? como lo tengo que poner? Donde? como llamo al subprograma?

Tengo que hacer un programa que calcule e^x. Este es 1 + x + (x^2/2!) + (x^3/3!) + ..... El subprograma tiene que calcular e^x de la manera más exacta posible (es decir, hasta e^n máximo), recibiendo la X. El programa lo que tiene que hacer es pedir la X, mandarla al subprograma y escribir el resultado.

Tengo hecho lo siguiente:

int _tmain(int argc, _TCHAR* argv[])
{

   int exponencial (int x);
   int exponencial (int x)
   {
      float potencia,factorial,resultat,suma;
      int i;
      factorial=1;
      suma=1;
      while (i<=170) {
      potencia=pow( x, i) ;
      factorial= factorial*i    ;
      resultat=potencia/factorial;
      suma=suma+resultat;
     i=i+1;
      }
    return suma;
   }

  float resultat;
  int n,x;

  cout <<"Yo calculo e^x. Dame la x: ";
  cin >> x;
  resultat= exponencial(n,x);
  cout <<"El resultado es: " <<resultat;

    system("PAUSE > nul");
   return 0;
}



Como lo veis? Me falta solo este programa. Las principales dudas las tengo en como escribir correctamente la funcion, como llamarla, etc. Sé que no es muy complicado, pero es que busco por internet y no me queda nada claro...

Gracias por leerme!
Hm...

Calculas e^x de la forma 1+x+x^2/2!+x^3/3!... hasta un numero N de factores, cierto?

Lo que haces esta bien (la idea) pero...

1. No inicializas las variables, nunca (presupones que i valdra 0, pero eso no es verdad, por ejemplo).
2. Declaras y defines la funcion exponencial dentro del main. No lo habia visto nunca, la verdad, y resulta que si puedes declarar la funcion dentro del main, pero en ningun caso definirla. Asi que yo pondria:

float exponencial(parametros); <-- esto es el prototipo de la funcion que decias
int main(parametros);
{
codigo
}

float exponencial(parametros)
{
codigo
}

3. Tienes una N para definir el nivel de precision (supongo) pero no la usas en ningun sitio, podrias editar a exponencial y pasarsela por parametro definiendo N como constante al valor que tu quieras.

4. El valor de retorno de exponencial deberia ser float o double

Asi a ojo es lo que veo primero, miratelo a ver si con eso te funciona

Un saludo
Muchas gracias darix por tu respuesta:

A ver:

1 - Lo de la i es fallo mio, queria hacer un desde i=1 hasta n hacer tal pero he visto que así seria más facil, almenos a primera vista. Después no me he acordado de definirla.

2 - Esto es porque no sabia como funcionaba... Ahora veo que primero declaras el prototipo (lo más basico), después haces el algoritmo principal y luego ya escribes la funcion. No es que no lo hayas visto nunca [fumando] , es que no tengo ni idea.

3- La n al principio queria que se la pidiera y luego la utilizara, pero mejor la dejo como constante y así no hay problema.

4 - Lo de el valor de retorno tienes razon. Que diferencia hay entre float o double? float debe ser un numero real, pero double? También? Hice un pequeño programa con float y después me decia que se perdian datos, que mejor usara dobule.

5- Ahora el VS me dice que hay un problema con pow, más de una instancia de funcion sobrecargada coincide con la lista de argumentos. Que es eso? Avia usado pow antes y no me decia nada....

Aquí está el código:
#include "stdafx.h"
#include "iostream"
using namespace std;
#define n 170


float exponencial (int x);

int _tmain(int argc, _TCHAR* argv[])
{

  float resultat;
  int x;

  cout <<"Et trobare e^X. Diga'm la x: ";
  cin >> x;
  resultat= exponencial(x);
  cout <<"El resultat es: " <<resultat;

    system("PAUSE > nul");
   return 0;
}
float exponencial (int x)
   {
      float potencia,factorial,resultat,suma;
      int i;
      factorial=1;
      suma=1;
      i=1;
      while (i<=n) {
      potencia=  pow(x,i) ;
      factorial= factorial*i    ;
      resultat=potencia/factorial;
      suma=suma+resultat;
     i=i+1;
      }
    return suma;
   }

Buenas,

4. La diferencia entre float y double es el rango de representacion. Un float si no recuerdo mal son 32bits y un double 64 bits.

5. El problema con el pow es lo que te dice el visual studio. Tu estas llamando a pow(int,int), pero eso no existe. Hay pow(float,int), pow(double,int) y pow(long double,int). El caso es que el visual studio no sabe a que quieres que convierta el int (a float, double o long double).

A partir de aqui tenemos dos "problemas". Primero, si ponemos una N muy grande y usamos floats, el programa no devolvera ningun valor (tendremos numeros muy grandes que no entraran en un float), asi que tendremos que usar doubles o una N mas pequeña. Segundo, tendremos que hacer un cast (decirle al compilador que convierta el primer parametro x de pow(x,i) a lo que tu quieras o bien en lugar de tener la x como entero, ponerla como float o doble.

Resumiendo, o cambias la funcion a float/double exponencial(float/double x) o bien cambiar el pow a pow(static_cast<float/double>(x),i) segun la precision que quieras.

Espero que se entienda mas o menos xD
Y la modularidad dónde está? xD

Sería mejor crear una clase a parte, con su .h y .cpp y en el main del proyecto llamarla. Más que nada para que quede código limpio con las cosas definidas donde mejor pueden estar. Veo estás aprendiendo así que te recomiendo mirar eso ahora, que a poco que leas y un ejemplo simple que veas verás cómo va el tema.
4 respuestas