发新话题
打印

小菜求助: 麻烦各位达仁,看看这问题怎么解决。

小菜求助: 麻烦各位达仁,看看这问题怎么解决。

以下用////////////////////////////////// 标明的地方与Rational 对象数组有关,编译可以通过, 但运行时候出现错误:Exception in thread "main" java.lang.NullPointerException  实在不知道为什么出这样的错,借各位达仁”慧眼“用用哦,先谢谢啦。
class Rational{
/**Rational类*/
    private int m,d;
       
        Rational(){
                m=0;d=1;
        }
        Rational(int m_){
                m=m_;d=1;
        }
        Rational(int m_,int d_){
                if(d_==0){
                         System.out.println("\ndenomination is zero");
                         System.exit(0);
                }
                m=m_;d=d_;
        }
       

    private int GCD(){
                int r,t1,t2;
                t1=Math.abs(m);
                t2=Math.abs(d);
                if(t1<t2){
                        r=t1;t1=t2;t2=r;
                }
                r=t1%t2;
                while(r!=0){
                        t1=t2;
                        t2=r;
                        r=t1%t2;
                }
                return t2;
        }
       
        private void lowest(){
                int g;
                if(m!=0){
                        g=this.GCD();
                        m/=g;
                        d/=g;
                }
            if(m<0&&d<0) {
                    m*=(-1);d*=(-1);
            }
        }
       
    public void rationalSet(int m_,int d_){
                m=m_;d=d_;
        }
       
       
        public Rational operate(Rational r2,char op){
                Rational r=new Rational();
                this.lowest();
                r2.lowest();
                switch(op){
                        case '+':r.m=this.m*r2.d+r2.m*this.d;r.d=this.d*r2.d;break;
                        case '-':r.m=this.m*r2.d-r2.m*this.d;r.d=this.d*r2.d;break;
                        case '*':r.m=this.m*r2.m;r.d=this.d*r2.d;break;
                        case '/':r.m=this.m*r2.d;r.d=this.d*r2.m;break;
                }
                r.lowest();
                return r;
        }
       
        public boolean lessThan(Rational r){
                Rational R;
                R=this.operate(r,'-');
                if((R.m^R.d)<0) return true;
                return false;  
        }
       
        public boolean greaterThan(Rational r){
            Rational R;
                R=this.operate(r,'-');
                if((R.m^R.d)>0) return true;
                return false;         
        }
       
        public boolean equal(Rational r){
                Rational R;
                R=this.operate(r,'-');
                if((R.m^R.d)==0) return true;
                return false;
        }
       
        public boolean lessThanOrEqual(Rational r){
                if(!this.greaterThan(r)) return true;
                return false;               
        }
       
        public boolean greaterThanOrEqual(Rational r){

                if(!this.lessThan(r)) return true;
                return false;
        }
       
    static Rational max(Rational r1, Rational r2){
            if(r1.greaterThan(r2)) return r1;
            return r2;
    }
   
    public String toString(){
            return ("("+this.m+","+this.d+")");
    }

}

public class Matrix{
/**在Rational 类上建立Matrix类。*/
        private int r,c;
        private Rational[] R;/////////////////////////////////
       
        Matrix(){
                r=1;c=1;
                R=new Rational[r*c];
        }
       
        Matrix(int i,int j){
                r=i;c=j;
                R=new Rational[r*c];

        }

        private void matrixShow(){
                for(int i=0;i<r;i++){
                        for(int j=0;j<c;j++)
                           System.out.print(R[i*c+j].toString()+" ");////////////////
                        System.out.print("\n");
                }
        }
       
        private Matrix matrixAdd(Matrix m){
            if(this.r!=m.r||this.c!=m.c){
                    System.out.println("Error:Size is not Match");
                    System.exit(0);
            }
            Matrix M=new Matrix(this.r,this.c);
                for(int i=0;i<this.r;i++){
                   for(int j=0;j<this.c;j++)
                             M.R[i*M.c+j]=this.R[i*this.c+j].operate(m.R[i*m.c+j],'+');////////////
            }
                return M;
        }
       
    private Matrix matrixMul(Matrix m){
            if(this.c!=m.r){
                    System.out.println("Error:Size is not Match");
                    System.exit(0);
            }
            Matrix M=new Matrix(this.r,m.c);
            for(int i=0;i<this.r;i++)
               for(int j=0;j<m.c;j++){
                 for(int k=0;k<this.c;k++)
                 M.R[i*M.c+j]=M.R[i*M.c+j].operate(this.R[i*this.c+k].operate(m.R[k*m.c+j],'*'),'+');/////////////
            }
            return M;
    }
   
    private void matrixRan(){//随机产生一个Matrix,但此处出错。原因未明。
            for(int i=0;i<r;i++)
              for(int j=0;j<c;j++)
            R[i*c+j].rationalSet((int)(Math.random()*10),1);//////////////////////////
    }
       
    public static void main(String[] args){
                Matrix obj1=new Matrix(2,2);
                Matrix obj2=new Matrix(2,2);
                Matrix obj;
               
                obj1.matrixRan();
            obj2.matrixRan();
            obj1.matrixShow();
            System.out.println("\n");
            obj2.matrixShow();
            System.out.println("\n");
        obj=obj1.matrixAdd(obj2);
        obj.matrixShow();
        System.out.println("\n");
        obj=obj1.matrixMul(obj2);
        obj.matrixShow();
        }
}      

TOP

呵呵,偶想了一天终于想通啦。。。。。呵呵,有点像自问自答,有点意思。      

TOP

发新话题