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

Evaluar en otra función

Estas en el tema de Evaluar en otra función en el foro de C/C++ en Foros del Web. Hola, quisiera saber si hay manera de evaluar en este programa: Código: #include <iostream> #include <cstdlib> #include <math.h> #include <iomanip> #define nmax 35 using namespace ...
  #1 (permalink)  
Antiguo 14/12/2016, 22:29
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 93
Antigüedad: 1 año, 10 meses
Puntos: 0
Evaluar en otra función

Hola, quisiera saber si hay manera de evaluar en este programa:
Código:
#include <iostream>
#include <cstdlib>
#include <math.h>
#include <iomanip>

#define nmax 35

using namespace std;
//----------------------------------------------------------------------------//
float FuncionF(int, float);
float FuncionG(int, float);
float Absoluto(float);

int Menu();
//----------------------------------------------------------------------------//
enum{SALIR=0, PRIMERA, SEGUNDA, TERCERA, CONTINUAR=1};
//----------------------------------------------------------------------------//
int main()
{
    float a, b, pn_anterior, pn, fpn;
    int eleccion, seguir=CONTINUAR, tol;
    double error;
    bool NoCumple;
    
    
    cout << "\n\tPrograma que aproxima la ra" << (char) 161 << "z de una funci" << (char) 162 << "n dada por el m" << (char) 130 << "todo \n\tde punto fijo." << endl;
    
    do{
        cout << endl;
        eleccion = Menu();
        
        if(eleccion == SALIR) break;
        
        //Se da y valida el intervalo.
        do{
            cout << "Indique el intervalo [a,b]" << endl;
            
            cout << "\n\ta: ";
            cin >> a;
            
            do{
                cout << "\n\tb: ";
                cin >> b;
                
                if(b<=a) cout << "\aERROR: Valor invalido (el fin del intervalo debe ser mayor al inicio)." << endl; 
                
            }while(b<=a);
            
            system("cls");
            
            NoCumple=false;
            
            if( eleccion==PRIMERA && a<=-4 ) NoCumple=true;
            if( eleccion==TERCERA && a<=-24 ) NoCumple=true;
            
            if(FuncionF(eleccion,a)*FuncionF(eleccion,b)>0){
                NoCumple=true;
            }
            
            if(NoCumple){
                do{
                    cout << "\a\a ERROR: La funci" << (char) 162 << "n evaluada en los extremos del intervalo no presenta \n los requisitos minimos para utilizar el algoritmo de \n punto fijo. Elija que hacer a continuaci" << (char) 162 << "n:" << endl << endl;
                    cout << "( " << SALIR << " ) Volver a elegir funci" << (char) 162 << "n." << endl;
                    cout << "( " << CONTINUAR << " ) Introducir otro intervalo." << endl;
                    cin >> seguir;
                    
                    system("cls");
                    if(seguir<SALIR || seguir>CONTINUAR) cout << "\aERROR: Valor invalido." << endl; 
                    
                }while(seguir<SALIR || seguir>CONTINUAR);
                
                
            }
            
        }while(NoCumple && seguir!=SALIR);
        
        system("cls");        
        
        if(seguir == SALIR) continue;  
        
        //Se indica la tolerancia para la aproximación.
        do{
            cout << "Indique las cifras de tolerancia[0,10]: ";
            cin >> tol;
            
            system("cls");
            if(tol<0 || tol>10) cout << "\aERROR: Valor invalido." << endl; 
            
        }while(tol<0 || tol>10);        
        
        //Se tabula todo.
        cout << setw(5) << "n" << setw(20) << "pn" << setw(20) << "f(pn)" << setw(20) << "error" << endl;
        
        pn = (a+b)/2;
        error=1;
        for(int i=1 ; i<=nmax ; ++i){
            
            
            
            
            switch(eleccion){
                    case PRIMERA: 
                        fpn = FuncionG(PRIMERA,pn);
                        break;
                        
                    case SEGUNDA:
                        fpn = FuncionG(SEGUNDA,pn);

                        break;
                        
                    case TERCERA:
                        fpn = FuncionG(TERCERA,pn);

                        break;
            }            
            
            if(i>=2 && fpn!=0) error = Absoluto(( pn - pn_anterior) / pn);
            
            cout << setw(5) << i;
            cout << setw(20) << pn;
            cout << setw(20) << fpn;
            if(i==1) cout << setw(20) << "---" << endl;
            else if(fpn==0) cout << setw(20) << "0" << endl;
            else cout << setw(20) << error << endl;
            
            pn_anterior = pn;
            
            pn = fpn;
            
            if(error<(0.5*pow(10,-tol))) break;                      
            
        }
        cout << "\nValor aproximado:  " << pn << endl << endl;
        
    system("pause");
    system("cls");
    
    }while(true);

    return 0;
}
  #2 (permalink)  
Antiguo 14/12/2016, 22:31
Avatar de Jose_A  
Fecha de Ingreso: mayo-2015
Ubicación: México, Sonora.
Mensajes: 93
Antigüedad: 1 año, 10 meses
Puntos: 0
Respuesta: Evaluar en otra función

Código:
//----------------------------------------------------------------------------//
int Menu()
{
    int opc;   
     do{
            
           cout << "Seleccione la funci" << (char) 162 << "n a utilizar:" << endl;       
           cout << "(" << PRIMERA << ") X^3+4^2-10" << endl;
           cout << "(" << SEGUNDA << ") ( cos(x)/4 )-x+5" << endl;
           cout << "(" << TERCERA << ") x^2-x-24" << endl;
           cout << "(" << SALIR << ") Salir." << endl;  
           
           cin >> opc;
           
           system("cls");
           
           if( opc<SALIR || opc>TERCERA )
               cout << "\aERROR: Acci" << (char) 162 << "n no definida." << endl;
               
     }while( opc<SALIR || opc>TERCERA);
     
     system("cls");
     
     return opc;       
}

//Funciones

float FuncionF(int funcion, float punto)
{
    switch(funcion){
            case PRIMERA:
                return pow(punto,4)+(2*pow(punto,2))-punto-3;
                
            case SEGUNDA:
                return (cos(punto)/4)-punto+5;

            case TERCERA:
                return pow(punto,2)-punto-24;

    }
}

float FuncionG(int funcion, float punto)
{
    switch(funcion){
            case PRIMERA:
                return sqrt((punto+3)/(pow(punto,2)+2));
                
            case SEGUNDA:
                return (cos(punto)/4)+5;

            case TERCERA:
                return sqrt(24+punto);

    }
}

float Absoluto(float num)
{
    if(num>0) return num;
    if(num<0) return -num;
    return 0;   
}
Una función distinta, por ejemplo en lugar de X^3+4^2-10 usar 5x^3 -2 ??

Intenté remplazar pero no me da el resultado que debería ser...
  #3 (permalink)  
Antiguo 15/12/2016, 04:16
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 2 años, 5 meses
Puntos: 204
Respuesta: Evaluar en otra función

¿Has escrito tu ese programa?

Lo comento porque si eres el autor del código no deberías tener problemas a la hora de modificarlo para cambiar una ecuación por otra... o para añadir una nueva.
__________________
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.

Última edición por eferion; 15/12/2016 a las 07:20



La zona horaria es GMT -6. Ahora son las 00:16.