Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Cómo hago que el usuario elija el tipo de función?

Estas en el tema de Cómo hago que el usuario elija el tipo de función? en el foro de C/C++ en Foros del Web. Hola, buenas. Tengo un código que se basa en el algoritmo de bisección el cual encuentra una raíz de una función dada, en mi caso ...
  #1 (permalink)  
Antiguo 17/02/2016, 00:44
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 10 meses
Puntos: 0
Cómo hago que el usuario elija el tipo de función?

Hola, buenas. Tengo un código que se basa en el algoritmo de bisección el cual encuentra una raíz de una función dada, en mi caso usé "x^3 + 2x^2 + x - 2"
pero quisiera saber cómo puedo hacer que el usuario elija qué tipo de función usar para la aproximación?, osea, que sean 4 las opciones:
Polinomial: f(x) = a0 + a1 x + a2 x2 + ... + an xn
Exponencial: f(x) = a e (k x + c) + b
Logaritmica: f(x) = a Ω(k x + c) + b Ω = log, ln
Trigonométrica: f(x) = a Ω(k x + c) + b Ω = sen, cos, etc

mi código es el siguiente, sencillo pero útil:

Código:
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <iomanip>
//******************************************************************************
using namespace std;
void bisetzion(long double,long double,int);
long double f(long double);
void impresion(long double,long double,long double,long double,int);
long double Abs(long double);
//******************************************************************************
int main(){
   long double an,bn,pn,tol;
   int n;
   char resp;
   do{
      system("cls");
      
      cout<<"Programa que utiliza el proceso de bisecci\xA2n para aproximar la funci\xA2n \nx^3 + 2x^2 + x - 2\n\n";
      
      do{
         cout<<"introduzca la an: ";
         cin>>an;
         cout<<"introduzca la bn: ";
         cin>>bn;
      }while(f(an)*f(bn)>0);
      if(f(an) != 0 && f(bn) != 0){
         do{
            cout<<"Tolerancia(10^-n) n: ";
            cin>>n;
         }while(n<=0);
         bisetzion(an,bn,n);
      }else cout<<"La ra\xA1z es uno de los extremos"<<endl;
      cout<<"\xA8 \bDesea calcular de nuevo(s/n)\x3F";
      cin>>resp;
   }while(resp == 's' || resp == 'S');
   system("pause");
   return 0;
}
//******************************************************************************
void bisetzion(long double an,long double bn,int n){//función que realiza la bisección
   long double pn=0,anterior,error=1000;
   cout<<"n"<<"  "<<"an"<<"          "<<"bn"<<"          "<<"pn"<<"           "<<"f(an)"<<"        "<<"f(pn)"<<"         "<<"error"<<endl;
   for(int i=0;error>pow(10.0,-n);++i){
      anterior = pn;
      pn = (an+bn)/2;
      error = Abs((pn - anterior)/pn);
      impresion(an,bn,pn,anterior,i);
      f(an)*f(pn)<0 ?  : an = pn;
      f(bn)*f(pn)<0 ?  : bn = pn;
   }
}
//******************************************************************************
long double f(long double x){//función a aproximar
   long double Fx;
   Fx = pow(x,3) + 2*pow(x,2) + x -2;
   return Fx;
}
//******************************************************************************
void impresion(long double an,long double bn,long double pn,long double anterior,int i){//función para imprimir los valores
   long double error = Abs((pn - anterior)/pn);
   cout<<setiosflags(ios::left)<<setw(3)<<i+1<<setprecision(7)<<setw(12)<<an<<setw(12)<<bn<<setw(12)<<pn<<setprecision(6)<<setw(14)<<f(an)<<setw(14)<<f(pn);
   i == 0 ? cout<<" -"<<endl : cout<<error<<endl;
}
//******************************************************************************
long double Abs(long double numero){//función para valor absoluto
   if(numero < 0) return -numero;   
   else return numero;  
}
//******************************************************************************
Alguna sugerencia?, gracias de antemano.
  #2 (permalink)  
Antiguo 17/02/2016, 01:47
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Cómo hago que el usuario elija el tipo de función?

Le pides al usuario que elija una función (a cada función le asignas un número) y luego con una cadena de if-else o un switch asignas a cada número una función.

Hay otras alternativas, pero creo que esa es la más sencilla de implementar para ir aprendiendo.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 17/02/2016, 11:28
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Cómo hago que el usuario elija el tipo de función?

Si, claro, se hacer eso, de hecho lo haré con case pero no encuentro la forma de definir las funciones en código D:
  #4 (permalink)  
Antiguo 17/02/2016, 16:11
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Cómo hago que el usuario elija el tipo de función?

Cita:
Iniciado por Jose_A Ver Mensaje
Si, claro, se hacer eso, de hecho lo haré con case pero no encuentro la forma de definir las funciones en código D:
No sé si te refieres a este tipo de flujo. (te pongo un código sencillo de ejemplo):

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. void decirHola()
  6. {
  7.     cout<<"Hola"<<endl;
  8. }
  9.  
  10. void decirAdios()
  11. {
  12.     cout<<"Adios"<<endl;
  13. }
  14.  
  15. int main()
  16. {
  17.     char respuesta;
  18.     cout<<"0 para salir, 1 para decir 'Hola', 2 para decir 'Adios'"<<endl;
  19.     cin>>respuesta;
  20.     while (respuesta!='0')
  21.     {
  22.     switch (respuesta)
  23.     {
  24.     case '1':
  25.         decirHola();
  26.         break;
  27.     case '2':
  28.         decirAdios();
  29.         break;
  30.     default:
  31.         cout<<"Opcion incorrecta"<<endl;
  32.         break;
  33.     }
  34.     cin>>respuesta;
  35.     }
  36.     return 0;
  37. }
__________________
Mi calculadora en Qt
  #5 (permalink)  
Antiguo 17/02/2016, 19:55
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Cómo hago que el usuario elija el tipo de función?

Sí, comprendo eso pero creo que no me he dado a entender. Me refiero a que cómo voy a declarar las funciones con símbolos y demás?, cuál es la forma de hacerlo?
  #6 (permalink)  
Antiguo 18/02/2016, 01:52
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Cómo hago que el usuario elija el tipo de función?

Hay varias opciones... un pequeño ejemplo:

Código C++:
Ver original
  1. int Suma(int a, int b)
  2. { return a + b; }
  3.  
  4. int Resta(int a, int b)
  5. { return a - b; }
  6.  
  7. int main()
  8. {
  9.   int num1, num2, opcion;
  10.   int opcion;
  11.   std::cout << "Introduce dos números: ";
  12.   std::cin >> num1 >> num2;
  13.   std::cout << "Introduce una opción:\n"
  14.                        " 1. Suma\n"
  15.                        " 2. Resta" << std::endl;
  16.   std::cin >> opcion;
  17.  
  18.   int resultado = 0;
  19.   switch( opcion )
  20.   {
  21.     case 1: resultado = Suma(num1,num2); break;
  22.     case 2: resultado = Resta(num1,num2); break;
  23.   }
  24.  
  25.   std::cout << "El resultado es " << resultado << std::endl;
  26. }
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #7 (permalink)  
Antiguo 20/02/2016, 21:54
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 180
Antigüedad: 8 años, 10 meses
Puntos: 0
Respuesta: Cómo hago que el usuario elija el tipo de función?

Perfecto, ya lo tengo :3
Gracias :D

Etiquetas: char, int, numero, tipo, usuario
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:24.