Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Описание массив из комплексных чисел


Автор: SegPro 31.5.2014, 08:29
Здравствуйте, нужна помощь. Мне нужно написать программу для решения системы с комплексными числами методом Гаусса. Сам алгоритм решения я написал. но как описать комплексные числа. Я понял что нужно описать класс Complex. В интернете даже готовый есть. Но я не понимаю как описать массив типа Complex. В Java только разбираться начал, поэтому не очень сращиваю. Вот код реализации метода Гаусса.

Код

public class Gauss{
    static int i,j,n,k,h,c;
    double m,s;
    static boolean f;
    static double[][] buf;
    static double[][] matrix;
    static double[] b,x;
    static void Prisvoi(int n){
        buf = new double[n][n];
        matrix = new double[n][n];
        b = new double[n];    
        x = new double[n];
        k=0; c=0; f=false;
    }
    void MetodGaussa(){
        //Прямой ход
        for(h=1;h<n;h++){
            if(matrix[k][k]==0){
                for(i=1+k;i<n;i++){if(matrix[i][k]!=0){c=i;}
                if(c!=0){
                    for(j=0;j<n;j++){
                        buf[0][j]=matrix[k][j];
                        matrix[k][j]=matrix[c][j];
                        matrix[c][j]=buf[0][j];
                        if(j==n-1){
                         buf[0][j+1]=b[k];
                            b[k]=b[c];
                            b[k]=buf[0][j+1];
                        }
                    }
                    //buf=nill;
                    for(i=1+k;i<n;i++){
                        for(j=0+k;j<n;j++){
                            if(j==0+k){m=matrix[i][k]/matrix[k][k];}
                            matrix[i][j]=matrix[i][j]-matrix[k][j]*m;
                            if(j==n-1){b[i]=b[i]-b[k]*m;}
                        }
                        f=true;
                    }
                }
                else{
                    System.out.println("Нет максимума в системе уравнений");
                    f=false;
                }
                }
            }
            else{
                for(i=1+k;i<n;i++){
                    for(j=0+k;j<n;j++){
                        if(j==0+k){m=matrix[i][k]/matrix[k][k];}
                        matrix[i][j]=matrix[i][j]-matrix[k][j]*m;
                        if(j==n-1){b[i]=b[i]-b[k]*m;}
                    }
                } 
                f=true;
            }
        }
        //Расчёт корней
        if(f==true){
            if(matrix[n-1][n-1]==0){
                x[n-1]=b[n-1]/matrix[n-1][n-1];
                for(i=n-2;i>-1;i--){
                    s= 0;
                    for(j=i+1;j<n;j++){s=s-matrix[i][j]*x[j];}
                    x[i]=(b[i]+s)/matrix[i][i];
                }
            }
            else{
                if(b[n-1]==0){System.out.println("Система уравнений не имеет решения");}
                else System.out.println("Система уравений имеет бесконечное множество решений");
            }
        }
    }

Автор: _Y_ 31.5.2014, 21:41
Массив как примитивов, так и объектов любого класса описывается одинаково:
Код

Complex[] myComplexArray;

Можно его и инициализировать сразу. При этом будет создана не только переменная, указывающая на массив, но и отведена память под массив нужного размера (например для 2 объектов класса Complex):
Код

Complex[] myComplexArray = new Complex[20]; 

Можно сразу и инициализировать (создать) каждый объект:
Код

Complex[] myComplexArray = {new Complex(1,1), new Complex(1,2)};

Не уверен, что объекты класса Complex имеют такой конструктор - это я сам придумал.

Кстати, Ваш код класс Complex не использует. 

Да и сама архитектура кода несколько "странная". Не то, чтобы так совсем уж нельзя было, но, похоже, Вы сумели пойти наперекор всем добрым советам по написанию Java кода smile 


Автор: SegPro 1.6.2014, 07:29
Цитата(_Y_ @ 31.5.2014,  21:41)
Массив как примитивов, так и объектов любого класса описывается одинаково:
Код

Complex[] myComplexArray;

Можно его и инициализировать сразу. При этом будет создана не только переменная, указывающая на массив, но и отведена память под массив нужного размера (например для 2 объектов класса Complex):
Код

Complex[] myComplexArray = new Complex[20]; 

Можно сразу и инициализировать (создать) каждый объект:
Код

Complex[] myComplexArray = {new Complex(1,1), new Complex(1,2)};

Не уверен, что объекты класса Complex имеют такой конструктор - это я сам придумал.

Кстати, Ваш код класс Complex не использует. 

Да и сама архитектура кода несколько "странная". Не то, чтобы так совсем уж нельзя было, но, похоже, Вы сумели пойти наперекор всем добрым советам по написанию Java кода smile

Алгоритм Гаусса вообще писался на Пскале...а это я его просто прикрутить пытаюсь...кстате спасибо за совет...получается нужно просто создать каждый объект для каждого комплексного числа...и уже работать с полями этих объектов

Автор: _Y_ 1.6.2014, 08:42
Цитата(SegPro @  1.6.2014,  07:29 Найти цитируемый пост)
.и уже работать с полями этих объектов 

Если строго придерживаться идеологии написания кода, то работать надо не с полями, а с методами Get и Set (ну или как они назваются у класса Complex), сами же поля должны быть недоступны для внешнего кода (инкапсулированы).

Но это, естественно, вопрос Ваших собственных взглядов: кто-то старается написать код побыстрее, кто-то поидеальнее, большинство пишет что-то промежуточное.

Автор: SegPro 2.6.2014, 09:29
Спасибо уже разобрался с вопросом

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)