Как выделить void сортировки с формы в отдельный класс?

Язык C#: программирование на C#, портирование кода C# на VB и VB на C#.

Модератор: Ramzes

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Как выделить void сортировки с формы в отдельный класс?

Сообщение Thomas » 29.01.2006 (Вс) 20:14

Приветствую всех.
Учусь программировать на .NET.
Сейчас учим в школе сортировку (Bubblesort, Shellsort, Quicksort)
на форме две кнопки и два listbox. Одна кнопка создает массив со случайными числами, вторая выполняет сортировку.

Задача - написать класс в котором будут функции сортировки.

Трудность в следующем. В функции сортировки нужно обращаться к значению массива для сравнения или что бы поменять местами.
На форме где декларирую а потом инициализирую массив проблем нет.
А как задать массив в классе. Ведь такое вроде не возможно. Или как обойти эту проблему.

Код: Выделить всё

// обьявляю массив
      int[]Tabel;

      //создаю массив в 500 элементов со случайными числами
      private void Form1_Load(object sender, System.EventArgs e)
      {
         Tabel=new int[500];
         Random gen = new Random();
         int getal, i;
         for(i=0;i< 500; i++)
         {
            getal=gen.Next(1,501);
            Tabel[i]=getal;
         }
      }
      // отображаю числа из массива в листбоксе
      private void btnMaak_Click(object sender, System.EventArgs e)
      {
         for(int i=0;i<500;i++)
         {
            listBox1.Items.Add(Tabel[i]);
         }
      }
      // нажатик кнопки вызывает заданную функцию сортироки.
      private void btnSorteer_Click(object sender, System.EventArgs e)
      {
         // shellsort();
         Quicksort(0, 499); // здесь вызываю ту или иную функцию сортировки.
         tonen();
      }
      
      private void shellsort()
      {
         int _As = 500;
         bool verwisseld=false;
         while(_As>1)
         {
            _As=_As/2;
            do
            {
               verwisseld=false;
               int i=0; int j=_As + i;
            while(j<500)
            {
               if(Tabel[i]>Tabel[j])
               {
                  verwissel(i,j);
                  verwisseld=true;            
               }
               i++; j=_As + i;
            }
            }while(verwisseld);
         }
      }
      
      private void Quicksort(int Li, int Re) // Li левая Re  правая граница массива
      {
         int Hli=Li; int Hre=Re;   // H означает вспомогательная
         int mid=Tabel[(Hli+Hre)/2];
         while(Hli<=Hre)
         {
            while(Tabel[Hli]<mid)
            {
               Hli++;
            }
            while(Tabel[Hre]>mid)
            {
               Hre--;
            }
            if(Hli<=Hre)
            {
               verwissel(Hli,Hre);
               Hli++; Hre--;
            }
         }
         if(Li<Hre)
         {
            Quicksort(Li,Hre);
         }
         if(Hli<Re)
         {
            Quicksort(Hli, Re);
         }

      }
      //меняем местами значения в массиве
      private void verwissel(int ind1, int ind2)
      {
         int hulp=Tabel[ind1];
         Tabel[ind1]=Tabel[ind2];
         Tabel[ind2]=hulp;
      }
      // отображаю отсортированный массив во втором листбоксе.
      private void tonen()
      {
         for(int i=0;i<500;i++)
         {
            listBox2.Items.Add(Tabel[i]);
         }
      }
   


Подскажите как решить проблему. Хочеться вывести shelsort и quicksort в отдельный класс.

Заранее спасибо за помощь.

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Re: Как выделить void сортировки с формы в отдельный класс?

Сообщение mdx » 29.01.2006 (Вс) 20:23

Thomas писал(а):Учусь программировать на .NET. Сейчас учим в школе

Дотнет в школе? Во везёт... Скажи хоть в какой школе...

А насчёт проблемы...
Передавай функции сортировки массив, и возвращать она должна отсортированный массив.
This posting is provided "AS IS" with no warranties, and confers no rights.

Изображение

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 29.01.2006 (Вс) 21:26

mdx

Да я в вечерней вышке учусь. К тому же за бугром. Там по тексту кода Фламанские словечки мелькают в названиях.

Так я и передаю функции сортировки массив и она его с успехом сортирует.

Проблема как эти функции в классе прописать, а из формы обращаться к классу.
У меня не получается в классе создать массив. И возможно ли это вообще?
Ведь в функции сортировки нужно постоянно обращаться к элементам массива.

while(Tabel[Hli]<mid) или if(Tabel[i]>Tabel[j])

и если в классе не прописан массив Tabel то C# ругаться начинает.

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 30.01.2006 (Пн) 9:32

mdx
Передавай функции сортировки массив, и возвращать она должна отсортированный массив.


Я подумал и понял что ты имел в виду.
Я хочу создать класс с функциями сортировки, который можно будет использовать для различных форм. В каждом конкретном случае массивы будут разные. Т.е. массив должен создаваться в коде формы и передаваться классу для сортировки, а класс должен возвращать в форму уже отсортированный массив. Правильно?

Как обьвить и создать массив в форме я знаю. А как передать этот массив классу и потом получить результат обратно?
Как это правильно написать - синтаксис?

В классе мы имеем : конструктор, методы, свойства и атрибуты, да еще можно события прописать. Функцию сортировки в классе пишем как метод. Размер массива определяем как атрибут и прописываем в свойствах (get и set). А как туда(в класс) передать массив и получить обратно, это вопрос.

Прошу помощи. Заранее спасибо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 9:59

class Sorter
{
public static void ShellSort(int[] Tabel)
{
//код без изменений
}
}
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

mdx
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 169
Зарегистрирован: 06.01.2006 (Пт) 18:13
Откуда: I'm from Russia!

Сообщение mdx » 30.01.2006 (Пн) 11:26

Ну, а из формы Tabel = ShellSort(Tabel);

Размер передавать вообще не надо, его можно определить с помощью Array.GetUpperBound (Array - твой массив)
This posting is provided "AS IS" with no warranties, and confers no rights.

Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 11:33

mdx
Нет.
Из формы - Sorter.ShellSort(Tabel);
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 30.01.2006 (Пн) 18:05

GSerg, mdx

Спасибо за помощь.
Вот написал код формы (там в текстбоксе можно задать размер массива)
и класс.
Но C# ругается на меня вот так:
"Cannot implicitly convert type 'void' to 'int[]'

Вот код.
Форма.
Код: Выделить всё

static void Main()
      {
         Application.Run(new Form1());
      }

      Sort sort1; // обьявил экземпляр класса
      int[] Tabel;
      
      private void btnMaak_Click(object sender, System.EventArgs e)
      {
         sort1=new Sort(int.Parse(txtAantal.Text)); // создал экземпляр класса
         Tabel=new int[sort1.Aantal]; //создал таблицу заданного размера
         Random gen = new Random();
         int getal, i;
         for(i=0;i< sort1.Aantal; i++)
         {
            getal=gen.Next(1,(sort1.Aantal+1));
            Tabel[i]=getal;
         }
         for(int j=0;j<sort1.Aantal;j++)
         {
            listBox1.Items.Add(Tabel[j]);
         }
      }

      private void btnSorteer_Click(object sender, System.EventArgs e)
      {
         sorteren();
         tonen();
      }
      private void sorteren()
      {
         Tabel=sort1.shellsort(Tabel); // РУГАЕТСЯ ЗДЕСЬ !!!!
      }
      private void tonen()
      {
         for(int i=0;i<sort1.Aantal;i++)
         {
            listBox2.Items.Add(Tabel[i]);
         }
      }

Класс
Код: Выделить всё

using System;

namespace Oef6_classSort_
{
   /// <summary>
   /// Summary description for Sort.
   /// </summary>
   public class Sort
   {
      // constructor
      public Sort(int _aantal)
      {
         aantal=_aantal;
      }
      //property

      public int Aantal
      {
         get{return aantal;}
         set{aantal=value;}
      }


      //method

      public void shellsort(int[]Tabel)
      {
         int _As = aantal;
         bool verwisseld=false;
         while(_As>1)
         {
            _As=_As/2;
            do
            {
               verwisseld=false;
               int i=0; int j=_As + i;
            while(j<500)
            {
               if(Tabel[i]>Tabel[j])
               {
                  swap(Tabel,i,j);
                  verwisseld=true;            
               }
               i++; j=_As + i;
            }
            }while(verwisseld);
         }
      }
      
      private void swap(int[]Tabel, int ind1, int ind2)
      {
         int hulp=Tabel[ind1];
         Tabel[ind1]=Tabel[ind2];
         Tabel[ind2]=hulp;
      }

      //atributten van velden

      public int aantal;
   }
}


В чем ошибка?

Еще раз спасибо, что учите неразумного. :D
Последний раз редактировалось Thomas 30.01.2006 (Пн) 18:17, всего редактировалось 2 раз(а).

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 18:14

Ошибка в том, что надо было прочитать http://bbs.vbstreets.ru/viewtopic.php?p=6582184#6582184, а не http://bbs.vbstreets.ru/viewtopic.php?p=6582180#6582180.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 30.01.2006 (Пн) 18:24

GSerg

Спасибо.
Исправил, заработало.

А можешь обьяснить почему это происходит. В чем причина.

Закончу все упражнение выложу решение.
Хочу сделать наглядную картинку по сортировке.
Задаем размер массива, выбираем тип сортировки и засекаем время.


Еще раз спасибо за помощь.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 30.01.2006 (Пн) 18:34

:shock:

В чём причина того, что void не возвращает значение? :shock:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 30.01.2006 (Пн) 19:14

GSerg
ну да почему он ругается если пасать как предложил mdx?

Вообще почему void не возвращает значение я вроде знаю. Это не функция. Только функции возвращают значение. Там еще есть зарезервированное слово return

А тут вроде как логично массив равен обработанному массиву.
Или я совсем ламер?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 31.01.2006 (Вт) 5:31

Видимо да :roll:

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

Thomas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 246
Зарегистрирован: 12.11.2005 (Сб) 0:17
Откуда: "Сказочное королевство"

Сообщение Thomas » 31.01.2006 (Вт) 14:33

Приветствую всех.
Вот при помощи GSerg и mdx сделал упражнение по созданию Класса для сортировки массива чисел тремя методами.
Bubblesort, Shellsort и Quicksort.

Из формы классу передается заполненный массив чисел, там сортируется и возвращается. Это работает.

Попробовал замерить время выполнения сортировки. Вроде работает. Но я не уверен в правильности второго и третьего замера.

Прошу общественность посмотреть и высказать свои замечания.
Я учусь и мне очень нужно знать что я сделал неправильно и почему?.

Всем наилучшие пожелания. Заранее спасибо за отзывы.
У вас нет доступа для просмотра вложений в этом сообщении.


Вернуться в C#

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList