Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2010, 17:42   #1
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
Радость оцените класс(ооп)

Доброго времени суток! Месяц назад делал курсовую. програма была для проведения тестирования.. короче говоря и не углубляясь в саму програму.. скажу использовал там множества.. и мне не очень то хватало set of byte, ибо надо было делать тесты на больше чем 256 вопросов. (ах да!.. забыл скзать что мне надо было множества только для работы с числами)... ну вобщем преподаватель к этому строго не относился.. говоря мол "и то хорошо")))

ну вобщем седня мне стукнула идея в голову - создать чтото свое, что работало бы как множества.. вобщем за 10-15 минут придумал и реализировал через ооп.. вобщем привожу полный листинг модуля

Вобщем хотелось бы услышать ваше мнение на счет мого класса.. возможно пропозиции какие нить или пожелания
Код:
unit IntSet;
interface
  uses SysUtils;

  type
  TIntSet = class        // даный класс является неким аналогом множества
    private
      set_arr: array of longint; // масив-множество в котором содержатся числа
      position: Word;              // текущая позиция, иными словами сколько чисел в даный момент в множестве
    public
      constructor Create(Length: Word = 0); //Length - длина множества
      function GetLength: Word;                  // получить текущую длину 
      procedure NewLength(value: Word);     // установить длину
      function IsInSet(value: LongInt): boolean; // проверить есть ли даный элемент в множестве
      procedure PushToSet(value: LongInt);      // добавить элемент в множество
  end;

implementation

  constructor TIntSet.Create(Length: Word = 0);
  begin
    setLength(set_arr,Length); // задаем длину
    position := 0; // устанавливаем позицию в начало
  end;

  function TIntSet.GetLength: Word;
  begin
    result := length(set_arr); // возвращаем длину множества
  end;

  procedure TIntSet.NewLength(value: word);
  var L: Word; 
  begin
    L := GetLength;          // запоминаес длину дабы не вызывать функцию еще раз
    if value < L then         // если новая длина меньше текущей
      position := value - 1  // устанавливаем позицию на последний елемент
    setLength(set_arr,value);// устанавливаем новую длину
  end;

  function TIntSet.IsInSet(value: LongInt): Boolean;
  var i: word;
  begin
    result := false; // устанавливаем флаг на ложь, то есть элемента еще нету в множестве
    if GetLength > 0 then // если длина > 0
      for i := 0 to position do        // сначала и до последнего елемента (последнего добавленого)
        if set_arr[i] = value then begin // сравниваем елементы, если елемент соответствует запросу
          result := true; // ставим флаг - истина, что значит что елемент есть в множестве
          break;           // заканчиваем работу цыкла
        end else          // иначе 
          continue;      // продолжаем
  end;

  procedure TIntSet.PushToSet(value: LongInt);
  begin
    if GetLength > position + 1 then // позиция в предпоследней ячейке или еще раньше..
                                               // иными словами если есть хотябы одно свободное место
      if not IsInSet(value) then begin // тогда если новый елемент еще не внесен в множество
        position := position + 1;         // меняем позицию
        set_arr[position] := value;      // добавляем елемент 
      end;
  end;

end.

Последний раз редактировалось lowercase; 22.12.2010 в 18:35. Причина: добавление коментариев
lowercase вне форума Ответить с цитированием
Старый 22.12.2010, 22:25   #2
WhiteSpirit
Пользователь
 
Регистрация: 28.05.2010
Сообщений: 82
По умолчанию

Если стоит задача выбрать какое-то количество вопросов без повторений, то совсем не обязательно использовать множества. Есть такой вариант - массив с номерами вопросов перемешать и выбрать из него первые N.
А так вроде ничего, только как для этого класса сделать операции пересечения, объединения, разности? В Delphi множества, насколько я помню, сделаны как битовые массивы, и всё это делается простыми битовыми операциями
WhiteSpirit вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помощь с лабой: «Перегрузка операций» (ООП, класс-АТД, на с++) Nastja Помощь студентам 15 02.07.2010 14:09
ООП BogdanOne Помощь студентам 2 17.06.2010 00:38
ООП AlekDruzh Паскаль, Turbo Pascal, PascalABC.NET 0 09.09.2009 20:32
Паскаль ООП. Примеры программ с использованием ООП SeЯgey Помощь студентам 5 13.05.2009 21:55