Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перегрузка true и false в классе, true если строки массива отсортированы 
V
    Опции темы
14SatanA88
Дата 13.7.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



Доброго времени суток, уважаемые программеры.

Прошу Вашей помощи. Пишу лабы по решеткам, столкнулся с проблемой.

Есть класс
Код

    class Array2D
    {
        public double [][] DoubleArray; // array of double
        public int n, m; // size

        // constructor
        public Array2D(int n, int m)
        {
            DoubleArray = new double[n][];
            for (int i = 0; i < n; i++) DoubleArray[i] = new double[m];
            this.n = n;
            this.m = m;
        }

        // method 1. input array
        public double[][] Input()
        {
            //Array2D arr = new Array2D(n, m);
            for (int i = 0; i < n; i++)
            {
                Console.WriteLine("Line {0}: ",i);
                for (int j = 0; j < m; j++) 
                {
                    Console.Write("Element [{0}][{1}]: ",i,j);
                    DoubleArray[i][j]=double.Parse(Console.ReadLine());
                }
            }
            return DoubleArray;
        }

        // method 2. output array
        public void Show()
        {
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++) Console.Write("{0:F2} ", DoubleArray[i][j]);
                Console.WriteLine();
            }
        }

        // method 3. sort every line
        public void Sort()
        {
            for (int i = 0; i < n; i++)
            {
                Array.Sort(DoubleArray[i]);
                Array.Reverse(DoubleArray[i]);
            }
        }

        // read-only property, show length
        public int LengthArray
        {
            get { return n*m; }
        }

        // read-only property, show length (n)
        public int LengthN 
        {
            get { return n; }
        }

        // read-only property, show length (m)
        public int LengthM 
        {
            get { return m; }
        }

        // write-only property, increase every element on scalar
        public double Mul
        {
            set
            {
                double s = value;
                for (int i = 0; i < n; i++)
                    for (int j = 0; j < m; j++) DoubleArray[i][j] += s;
            }
        }

        // indexator
        public double this[int i, int j]
        {
            get
            {
                return DoubleArray[i][j];
            }
            set
            {
                DoubleArray[i][j] = value;
            }
        }

        // overload ++, increase every element
        public static Array2D operator ++(Array2D arr)
        {
            for (int i = 0; i < arr.LengthN; i++)
                for (int j = 0; j < arr.LengthM; j++) arr[i, j]++;
            return arr;
        }

        // overload --, decrease every element
        public static Array2D operator --(Array2D arr)
        {
            for (int i = 0; i < arr.LengthN; i++)
                for (int j = 0; j < arr.LengthM; j++) arr[i, j]--;
            return arr;
        }

        // overload true, array is sorted
        public static bool operator true(Array2D arr)
        {
            int k = 0;
            for (int i = 0; i < arr.LengthN; i++)
            {
                double[] tmp = arr.DoubleArray[i];
                Array.Sort(arr.DoubleArray[i]);
                if (tmp != arr.DoubleArray[i]) k++;
            }
            if (k == 0) return true; else return false;
        }

        // overload false, array is not sorted
        public static bool operator false(Array2D arr)
        {
            int k = 0;
            for (int i = 0; i < arr.LengthN; i++)
            {
                double[] tmp = arr.DoubleArray[i];
                Array.Sort(arr.DoubleArray[i]);
                if (tmp == arr.DoubleArray[i]) k++;
            }
            if (k == arr.LengthN) return true; else return false;
        }

        // overload *, multiply two arrays
        public static Array2D operator *(Array2D a1, Array2D a2)
        {
            if ((a1.LengthN == a2.LengthN) && (a1.LengthM == a2.LengthM))
            {
                Array2D temp = new Array2D(a1.LengthN, a1.LengthM);
                for (int i = 0; i < a1.LengthN; i++)
                    for (int j = 0; j < a1.LengthM; j++) temp[i,j] = a1[i,j] * a2[i,j];
                return temp;
            }
            else throw new Exception("Размеры массивов не совпадают!"); 
        }

    }


По заданию лабы нужно сделать перегрузку констант true и false (обращение к экземпляру класса дает значение true, если
каждая строка массива упорядочена по возрастанию, иначе false).

В общем смысле я понимаю, как это делается. Делаю так:
Код

        // overload true, array is sorted
        public static bool operator true(Array2D arr)
        {
            int k = 0;
            for (int i = 0; i < arr.LengthN; i++)
            {
                double[] tmp = arr.DoubleArray[i];
                Array.Sort(arr.DoubleArray[i]);
                if (tmp != arr.DoubleArray[i]) k++;
            }
            if (k == 0) return true; else return false;
        }

        // overload false, array is not sorted
        public static bool operator false(Array2D arr)
        {
            int k = 0;
            for (int i = 0; i < arr.LengthN; i++)
            {
                double[] tmp = arr.DoubleArray[i];
                Array.Sort(arr.DoubleArray[i]);
                if (tmp == arr.DoubleArray[i]) k++;
            }
            if (k == arr.LengthN) return true; else return false;
        }


Кода много лишнего, сам понимаю, но это просто результат моих экспериментов.
В решетках понимаю очень слабо, так что очень рассчитываю на вашу помощь.

Дело в том, что (смотрел дебаггером) когда я сортирую временный одномерный массив (double[] tmp), то почему-то сортируется и массив arr.DoubleArray[i]. Исходя из этого, обращение к экземпляру класса постоянно дает мне true.

Как правильно описать перегрузку true и false, чтобы они работали?
(обращение к экземпляру класса дает значение true, если каждая строка массива упорядочена по возрастанию, иначе false)

Заранее благодарю.

Это сообщение отредактировал(а) 14SatanA88 - 13.7.2011, 16:25
PM MAIL ICQ   Вверх
14SatanA88
Дата 13.7.2011, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 13.5.2010

Репутация: нет
Всего: 5



сделал поэлементную проверку, вопрос исчерпан

Код

        // overload true, array is sorted
        public static bool operator true(Array2D arr)
        {
            for (int i = 0; i < arr.LengthN; i++)
                for (int j = 0; j < arr.LengthM-1; j++)
                    if (arr.DoubleArray[i][j] > arr.DoubleArray[i][j + 1]) return false;
            return true;
        }

        // overload false, array is not sorted
        public static bool operator false(Array2D arr)
        {
            for (int i = 0; i < arr.LengthN; i++)
                for (int j = 0; j < arr.LengthM - 1; j++)
                    if (arr.DoubleArray[i][j] < arr.DoubleArray[i][j + 1]) return true;
            return false;
        }

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.