Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Black Lotus en 23 Mayo 2013, 01:06 am



Título: Teorema del Binomio
Publicado por: Black Lotus en 23 Mayo 2013, 01:06 am
Se trata de crear un programa para que resuelva ejercicios del teorema del binomio, sin embargo se tiene el problema de que solo realiza ejercicios con signo positivo tales como (http://www.eplc.umich.mx/salvadorgs/matematicas1/contenido/CapIII/3_5_5_teo_bin_archivos/image062.gif) hasta el exponente 12, sin embargo no se puede realizar ejercicios que contentan signo negativos tales como: (http://www.eplc.umich.mx/salvadorgs/matematicas1/contenido/CapIII/3_5_5_teo_bin_archivos/image070.gif).... Entonces me ayudarian a darme la idea o arreglar el codigo a modo que se pueda hacer operaciones con signo negativo?

Código
  1. #include <iostream>
  2. #include <string>
  3. #include <conio>
  4. #include <stdlib>
  5.  
  6. using namespace std;
  7.  
  8. long int fact(long int x)
  9. {
  10.    int z = 1;
  11.    for (x; x >=1; x--)
  12.    {
  13.        z = z*x;
  14.    }
  15.    return z;
  16. }
  17.  
  18. int main()
  19. {
  20.    long int r, n, p, num , y ,n1, n2, resu1, resu2, resul;
  21.    char a,b;
  22.    char t1, t2, p1;
  23.    char op;
  24. do {
  25. ret:
  26. clrscr();
  27. cout<<"\n         ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";
  28. cout<<"\n         º                   :: Suma de Binomios ::                  º";
  29. cout<<"\n         ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";
  30. cout<<"\n          Escriba el Exponente de la Ecuaci\242n:  ";
  31. cin>> p1;
  32. if ((p1>48) && (p1<58))
  33. goto sig; else goto ret;
  34. sig:
  35. cout <<"\n          Escribir el T\202rmino numerico:  ";
  36. cin >> t1 ;
  37. if ((t1>48) && (t1<58))
  38. goto sig2; else goto sig;
  39. sig2:
  40. cout <<"\n          Escribir el Primer T\202rmino:  ";
  41. cin >> a ;
  42. if ((a>64) && (a<91) || (a>96) && (a<123))
  43. goto sig3; else goto sig2;
  44. sig3:
  45. cout <<"\n          Escribir el T\202rmino numerico:  ";
  46. cin >> t2 ;
  47. if ((t2>48) && (t2<58))
  48. goto sig4; else goto sig3;
  49. sig4:
  50. cout <<"\n          Escribir el Segundo T\202rmino:  ";
  51. cin >> b ;
  52. if ((b>64) && (b<91) || (b>96) && (b<123))
  53. goto sig5; else goto sig4;
  54. sig5:
  55. cout<<endl;
  56. cout<<"          El Producto Notable de ("<<t1<<a<<"+"<<t2<<b<<")^"<<p1<<" es...";
  57. cout<<endl<<endl;
  58. n  = p1 - 48;
  59.  
  60.  
  61.    for (p=0; p<=n; p++)
  62.    {
  63.        n1 = t1 - 48;
  64.        n2 = t2 - 48;
  65.        resu2 = ( pow(n2,p)) ;
  66.        y = n - p;
  67.        resu1 = ( pow(n1,y)) ;
  68.  
  69.        num = fact(n) / (fact(p) * fact(y));
  70.        resul= resu1*num*resu2;
  71.        if (p==0)
  72.            cout<< resul <<" " << a << "^ " << n<< " + " ;
  73.        else if ( p==n)
  74.            cout << resul <<" "<< b <<"^ " << p ;
  75.       else {
  76.  
  77.        cout << resul <<" " << a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
  78.       }
  79.  
  80.    }
  81.  
  82.    cout<<endl<<endl;
  83.    cout<<"Ingresar la posicion que deseas averiguar:";
  84.    cin >> r ;
  85.        p = r-1;
  86.        y = n - p;
  87.        num = fact(n) / (fact(p) * fact(y));
  88.        resul= resu1*num*resu2;
  89.     cout<<"la posicion es :";
  90.     cout<< resul<<" " << a << "^ " << y << " * " << b <<"^ " << p ;
  91.    cout<<endl<<endl;
  92.  
  93. }while (op != 50);
  94.  
  95. }


Título: Re: Teorema del Binomio
Publicado por: leosansan en 23 Mayo 2013, 16:06 pm

Creo que te has hecho la p*cha un lío. No me explico como no metes la gamba entre tanto paréntesis y goto, con lo fáciles que son los do-while a la hora de revisar el código. Pero en fin, tú mismo.

Creo que andabas buscando una salida como esta:


Código
  1. escriba el exponente de la ecuacion = 4
  2. escribir el primer coeficiente (numero)= 2
  3. escribir el segundo coeficiente (numero)= 3
  4. escribir el primer coeficiente (letra en minuscula)= a
  5. escribir el segundo coeficiente (letra en minuscula)= b
  6. +16 a^ 4-96 a^ 3 * b^ 1+216 a^ 2 * b^ 2-216 a^ 1 * b^ 3+81 b^ 4
  7. Presione una tecla para continuar . . .
  8.  
  9. Mejor escrito:
  10.  
  11. 16 a^4 - 96 a^3 b + 216 a^2 b^2 - 216 a b^3 + 81 b^4
  12.  
  13.  

con signos, coeficientes numéricos y coeficientes "letrados"  ;)

Ta´bien, te paso el código:
:)

Código
  1.  
  2. #include <iostream>
  3. #include <cmath>    
  4. #include <cstdlib>  
  5. using namespace std;
  6.  
  7. float comb(int n,int p)
  8. {
  9.    int i;
  10.    if (n < 0 || p < 0 || p > n) return 0;
  11.    float c = 1;
  12.    if (p>n/2)
  13.        p=n-p;
  14.    for ( p; p>=1; p--,n--)
  15.    c*= n/p;
  16.    return c;
  17. }
  18. int main()
  19. {
  20.    long int n,c,d,p, num ,y, y1=0,expon;
  21.    char coef_1,coef_2,signo,a,b;
  22.    cout << "escriba el exponente de la ecuacion = ";
  23.    cin >> expon;
  24.  
  25.    do{
  26.        cout << "escribir el primer coeficiente (numero)= ";
  27.        cin >>coef_1 ;
  28.    }while (coef_1<48 || coef_1>58);
  29.    do{
  30.    cout << "escribir el segundo coeficiente (numero)= ";
  31.    cin >>coef_2 ;
  32.    }while (coef_2<48 || coef_2>58);
  33.    do{
  34.        cout << "escribir el primer coeficiente (letra en minuscula)= ";
  35.        cin >>a ;
  36.    }while (a>64 && a<96);
  37.    do{
  38.    cout << "escribir el segundo coeficiente (letra en minuscula)= ";
  39.    cin >>b ;
  40.    }while (b>64 && b<96);
  41.    n=expon;
  42.    c=coef_1-48;
  43.    d=coef_2-48;
  44.    for (p=0; p<=n; p++,y1++)
  45.    {
  46.        num = comb(n,p);
  47.        y=n-p;
  48.        if ( p%2==0)
  49.            signo='+';
  50.        else
  51.            signo='-';
  52.        if (p==0 )
  53.            cout<<signo<< pow(c,n) <<" " << a <<"^ " << n;
  54.        else if ( p==n)
  55.            cout <<signo<< pow(d,n) <<" "<< b <<"^ " << p ;
  56.       else {
  57.  
  58.        cout <<signo<< num*pow(c,n-y1)*pow(d,y1) <<" "<<a<< "^ " << y << " * " << b<<"^ " << p  ;
  59.       }
  60.     }
  61.    cout <<endl;
  62.    system("pause") ;
  63.    return 0;
  64. }
  65.  


Espero te sirva de referencia al menos.

Por cierto lo del número combinatorio es para obtener potencias superiores a 12, que si no salen más es porque C/C++ "no pueden" con números tan grandes como los que originan los factoriales al calcular los números combinatorios y de esta manera pueden ser de 20 y más, dependiendo de los coeficientes .Si son uno no hay problema pero cuando los subes, la combinación entre el tamaño de los combinatorios y las potecias de los mencionados numeros hacen que el exponente no pueda ser muy grande. Son las miserias cel C/C++ con números grrandes como ya te indiqué. Habría que usar una librería de números grandes, como GMP, para poder hacer cálculos sin esas limitaciones del C/C++.Una explicación más amplia en: Teorema Binomial (http://foro.elhacker.net/buscador2-t388312.0.html;msg1846605#msg1846605l)

Saluditos!. .... ..


(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)

P.D:A mí personalmente no me acaba se satisfacer el código ya que limitas la entrada de coeficientes a números entre 0 y 9, cuando declarándolos directamente como int en lugar de char no tendrías esa limitación. O bien los declaras como char pero como array para pillar todas las cifras y luego hacer una conversión de cadena a entero, que para eso existen las funciones apropiadas. Pero bueno, tal como lo tenías he procurado no "menartelo" mucho.
:laugh: