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?
#include <iostream>
#include <string>
#include <conio>
#include <stdlib>
using namespace std;
long int fact(long int x)
{
int z = 1;
for (x; x >=1; x--)
{
z = z*x;
}
return z;
}
int main()
{
long int r, n, p, num , y ,n1, n2, resu1, resu2, resul;
char a,b;
char t1, t2, p1;
char op;
do {
ret:
clrscr();
cout<<"\n ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»";
cout<<"\n º :: Suma de Binomios :: º";
cout<<"\n ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ";
cout<<"\n Escriba el Exponente de la Ecuaci\242n: ";
cin>> p1;
if ((p1>48) && (p1<58))
goto sig; else goto ret;
sig:
cout <<"\n Escribir el T\202rmino numerico: ";
cin >> t1 ;
if ((t1>48) && (t1<58))
goto sig2; else goto sig;
sig2:
cout <<"\n Escribir el Primer T\202rmino: ";
cin >> a ;
if ((a>64) && (a<91) || (a>96) && (a<123))
goto sig3; else goto sig2;
sig3:
cout <<"\n Escribir el T\202rmino numerico: ";
cin >> t2 ;
if ((t2>48) && (t2<58))
goto sig4; else goto sig3;
sig4:
cout <<"\n Escribir el Segundo T\202rmino: ";
cin >> b ;
if ((b>64) && (b<91) || (b>96) && (b<123))
goto sig5; else goto sig4;
sig5:
cout<<endl;
cout<<" El Producto Notable de ("<<t1<<a<<"+"<<t2<<b<<")^"<<p1<<" es...";
cout<<endl<<endl;
n = p1 - 48;
for (p=0; p<=n; p++)
{
n1 = t1 - 48;
n2 = t2 - 48;
resu2 = ( pow(n2,p)) ;
y = n - p;
resu1 = ( pow(n1,y)) ;
num = fact(n) / (fact(p) * fact(y));
resul= resu1*num*resu2;
if (p==0)
cout<< resul <<" " << a << "^ " << n<< " + " ;
else if ( p==n)
cout << resul <<" "<< b <<"^ " << p ;
else {
cout << resul <<" " << a << "^ " << y << " * " << b <<"^ " << p <<" + " ;
}
}
cout<<endl<<endl;
cout<<"Ingresar la posicion que deseas averiguar:";
cin >> r ;
p = r-1;
y = n - p;
num = fact(n) / (fact(p) * fact(y));
resul= resu1*num*resu2;
cout<<"la posicion es :";
cout<< resul<<" " << a << "^ " << y << " * " << b <<"^ " << p ;
cout<<endl<<endl;
}while (op != 50);
}
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:
escriba el exponente de la ecuacion = 4
escribir el primer coeficiente (numero)= 2
escribir el segundo coeficiente (numero)= 3
escribir el primer coeficiente (letra en minuscula)= a
escribir el segundo coeficiente (letra en minuscula)= b
+16 a^ 4-96 a^ 3 * b^ 1+216 a^ 2 * b^ 2-216 a^ 1 * b^ 3+81 b^ 4
Presione una tecla para continuar . . .
Mejor escrito:
16 a^4 - 96 a^3 b + 216 a^2 b^2 - 216 a b^3 + 81 b^4
con signos, coeficientes numéricos y coeficientes "letrados" ;)
Ta´bien, te paso el código: :)
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
float comb(int n,int p)
{
int i;
if (n < 0 || p < 0 || p > n) return 0;
float c = 1;
if (p>n/2)
p=n-p;
for ( p; p>=1; p--,n--)
c*= n/p;
return c;
}
int main()
{
long int n,c,d,p, num ,y, y1=0,expon;
char coef_1,coef_2,signo,a,b;
cout << "escriba el exponente de la ecuacion = ";
cin >> expon;
do{
cout << "escribir el primer coeficiente (numero)= ";
cin >>coef_1 ;
}while (coef_1<48 || coef_1>58);
do{
cout << "escribir el segundo coeficiente (numero)= ";
cin >>coef_2 ;
}while (coef_2<48 || coef_2>58);
do{
cout << "escribir el primer coeficiente (letra en minuscula)= ";
cin >>a ;
}while (a>64 && a<96);
do{
cout << "escribir el segundo coeficiente (letra en minuscula)= ";
cin >>b ;
}while (b>64 && b<96);
n=expon;
c=coef_1-48;
d=coef_2-48;
for (p=0; p<=n; p++,y1++)
{
num = comb(n,p);
y=n-p;
if ( p%2==0)
signo='+';
else
signo='-';
if (p==0 )
cout<<signo<< pow(c,n) <<" " << a <<"^ " << n;
else if ( p==n)
cout <<signo<< pow(d,n) <<" "<< b <<"^ " << p ;
else {
cout <<signo<< num*pow(c,n-y1)*pow(d,y1) <<" "<<a<< "^ " << y << " * " << b<<"^ " << p ;
}
}
cout <<endl;
system("pause") ;
return 0;
}
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: