注册 登录
编程论坛 C++教室

初学者做的求解方程组,有奇怪的问题

观星 发布于 2010-03-21 19:38, 938 次点击
#include<iostream>
using namespace std;
class fangcheng
{
       public:int default_x=0;
//这句为什么不对啊,放在开头用 define就好使呢

        double xishu[default_x][default_x+1];
    fangcheng()
    {
        cin>>default_x;
        for(int i=0;i<default_x;i++)
        {
            cout<<"请输入第 "<<(i+1)<<" 个方程的系数:"<<endl;
            for(int j=0;j<default_x+1;j++)
                cin>>xishu[i][j];
        }
    }
    void jiaohuan(int x,int y)
    {
        double r;
        for(int i=0;i<default_x+1;i++)
        {
            r=xishu[x][i];
            xishu[x][i]=xishu[y][i];
            xishu[y][i]=r;
        }
    }
    void output()
    {
         int i;
         cout<<endl<<"方程组:"<<endl;
        for(i=0;i<default_x;i++)
        {
            cout<<endl<<"第 "<<(i+1)<<" 个方程:";
            for(int j=0;j<default_x+1;j++)
                cout<<xishu[i][j]<<" ";
        }
        cout<<endl;
    }
    bool bianhuaxia(int x)
    {
        int r,i;
    //    cout<<"变化 第"<<x<<" 列"<<endl;
        if(x<=default_x)
        {
            for(i=x-1;i<default_x;i++)
            {
     //                         cout<<"i="<<i<<endl;
                if(!(xishu[i][x-1]>-1e-6&&xishu[i][x-1]<1e-6))
                {
     //               cout<<"xishu["<<i<<"]["<<(x-1)<<"] = "<<xishu[i][x-1]<<endl;
                    if((i>x-1)&&(i<default_x))
                    {
     //                   cout<<"交换 "<<x-1<<","<<i<<endl;
                        jiaohuan(x-1,i);
                    }
                    return true;
                }
            }
            return false;
        }
        else
        {
            cout<<"\nError: bianhuaxia :x-->"<<x<<endl;
            return false;
        }
    }
    void add(int x1,double n,int x2)
    {
        for(int i=0;i<default_x+1;i++)
        {
            xishu[x2][i]+=xishu[x1][i]*n;
        }
    }
    void mul(int x,double n)
    {
        for(int i=0;i<default_x+1;i++)
        {
            xishu[x][i]*=n;
        }
    }
    bool movexia()
    {
        for(int i=0;i<default_x;i++)
        {
            if(bianhuaxia(i+1))
            {
                for(int j=i+1;j<default_x;j++)
                {
                        add(i,(-1)*xishu[j][i]/xishu[i][i],j);
                }
            }
            else
            {
                cout<<"无解"<<endl;
                return false;
            }
        }
        return true;
    }
    void moveshang()
    {
        if(movexia())
        {
            for(int i=default_x-1;i>=0;i--)
            {
                if(xishu[i][i]!=1)
                    mul(i,1/xishu[i][i]);
                for(int j=i-1;j>=0;j--)
                {
                    add(i,(-1)*xishu[j][i]/xishu[i][i],j);
                }
            }
        }
    }
};
int main()
{
    cout<<"请输入方程组阶数:"<<endl;
    int x;
    cin>>x;
    if(x>0)
    {
    fangcheng a;
    a.output();
    a.moveshang();
    a.output();
    }
    else
    {
        cout<<"方程组个数少于一个"<<endl;
    }
    cout<<endl<<endl<<"输入BYE关闭程序"<<endl;
    string s;
    cin>>s;
    while(s!="BYE")
    {
         cin>>s;
    }
         return 1;
}
8 回复
#2
qlc002010-03-21 20:13
因为在类里面不能对变量进行初始化!

[ 本帖最后由 qlc00 于 2010-3-21 20:50 编辑 ]
#3
apull2010-03-22 00:40
在构造里初始化。
#4
月光3212010-03-22 17:10
在构造中不能初始化
#5
观星2010-03-24 08:00
可是去掉了初始化还是不好使啊?这是为什么呢?
以下是引用qlc00在2010-3-21 20:13:52的发言:

因为在类里面不能对变量进行初始化!
#6
观星2010-03-26 14:49
这样就是好使的

#include<iostream>
using namespace std;
#define default_x 3
class fangcheng
{
  //    public:int default_x;
//这句为什么不对啊,放在开头用 define就好使呢
    private:
        double xishu[default_x][default_x+1];
    public: fangcheng()
    {
    }
    void setxishu()
    {
        for(int i=0;i<default_x;i++)
        {
            cout<<"请输入第 "<<(i+1)<<" 个方程的系数:"<<endl;
            for(int j=0;j<default_x+1;j++)
                cin>>xishu[i][j];
        }
    }
    void jiaohuan(int x,int y)
    {
        double r;
        for(int i=0;i<default_x+1;i++)
        {
            r=xishu[x][i];
            xishu[x][i]=xishu[y][i];
            xishu[y][i]=r;
        }
    }
    void output()
    {
         int i;
         cout<<endl<<"方程组:"<<endl;
        for(i=0;i<default_x;i++)
        {
            cout<<endl<<"第 "<<(i+1)<<" 个方程:";
            for(int j=0;j<default_x+1;j++)
                cout<<xishu[i][j]<<" ";
        }
        cout<<endl;
    }
    bool bianhuaxia(int x)
    {
        int i;
    //    cout<<"变化 第"<<x<<" 列"<<endl;
        if(x<=default_x)
        {
            for(i=x-1;i<default_x;i++)
            {
     //                         cout<<"i="<<i<<endl;
                if(!(xishu[i][x-1]>-1e-6&&xishu[i][x-1]<1e-6))
                {
     //               cout<<"xishu["<<i<<"]["<<(x-1)<<"] = "<<xishu[i][x-1]<<endl;
                    if((i>x-1)&&(i<default_x))
                    {
     //                   cout<<"交换 "<<x-1<<","<<i<<endl;
                        jiaohuan(x-1,i);
                    }
                    return true;
                }
            }
            return false;
        }
        else
        {
            cout<<"\nError: bianhuaxia :x-->"<<x<<endl;
            return false;
        }
    }
    void add(int x1,double n,int x2)
    {
        for(int i=0;i<default_x+1;i++)
        {
            xishu[x2][i]+=xishu[x1][i]*n;
        }
    }
    void mul(int x,double n)
    {
        for(int i=0;i<default_x+1;i++)
        {
            xishu[x][i]*=n;
        }
    }
    bool movexia()
    {
        for(int i=0;i<default_x;i++)
        {
            if(bianhuaxia(i+1))
            {
                for(int j=i+1;j<default_x;j++)
                {
                        add(i,(-1)*xishu[j][i]/xishu[i][i],j);
                }
            }
            else
            {
                cout<<"无解"<<endl;
                return false;
            }
        }
        return true;
    }
    void moveshang()
    {
        if(movexia())
        {
            for(int i=default_x-1;i>=0;i--)
            {
                if(xishu[i][i]!=1)
                    mul(i,1/xishu[i][i]);
                for(int j=i-1;j>=0;j--)
                {
                    add(i,(-1)*xishu[j][i]/xishu[i][i],j);
                }
            }
        }
    }
};
int main()
{
    cout<<"10元1次方程组:"<<endl;
    cout<<"a b c d e f g h i j = k"<<endl;
    string s;
    fangcheng a;
    do
    {
    a.setxishu();
    a.output();
    a.moveshang();
    a.output();
    cout<<endl<<endl<<"输入BYE关闭程序"<<endl;
    cin>>s;
    }while(s!="BYE");
    return 0;
}

怎么改default_x成 变量的形式呢?
#7
james2309322010-03-26 15:48
你定义的是变量吧。。又不是外部接口。能放在public里面初始化么?放在private吧。然后在构造函数里初始化试试..
#8
asdjc2010-03-27 20:06
是这样的,你应该把你的程序中出现问题的地方和问题种类写出来。不要把一大堆代码给人看,
方便别人就是方便自己嘛!
#9
观星2010-03-29 08:42
问题的地方我表明了,就是红色的那句,把 default_x 变量 改成 #define 定义的常量就好使,这个我也不知道怎么分类?
1