| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Избавьте от зацикливания! |
| Автор: Garcian 21.5.2011, 20:02 | ||||
| Здравствуйте, Уважаемые программисты! Совсем недавно я вступил в ООП. И пока не понимаю его преимущества. Но об этом потом. В общем, пишу программу на основе нахождения кратчайшей сети Крускала (вкратце - суть в том, чтобы найти минимальные паросочетания взвешанного двудольного графа). Для примера здесь используется матрица весов C. Моя проблема состоит в следующем: я, как мне кажется, с программировал этот алгоритм правильно, но я совсем застрял на том моменте, где я рекурсивно вызываю функцию Krasckal! Признаюсь, опыта в программировании у меня немного, и может я не знаю каких-либо элементарных вещей. Подскажите, пожалуйста, как избавится от зацикливания! Собственно, здесь у меня происходит проверка (строка 47):
которая проверяет, принадлежат ли минимальные элементы в разных строках одному столбцу. И, если таковых нет, метод Krasckal должен прекращать свою работу. С этим у меня и возникла проблема. Теперь, что касается ООП. Я знаю, что три основных принципа, это инкапсуляция, полиморфизм и наследование. Но я не представляю как можно улучшить работу программы используя этот подход. Если у Вас есть идеи и Вас не затруднит, объясните, пожалуйста. И, наконец, сроки сдачи работы у меня поджимают. А программу требуется выполнить в Windows Forms. Реально ли разобраться в этом за пару суток, или мне стоит искать помощь в реализации этого на стороне?
|
| Автор: Garcian 22.5.2011, 08:11 | ||
Все окончательно исправил
Если не сложно, ответьте на два последующих вопроса |
| Автор: -Mikle- 22.5.2011, 23:12 | ||||
Как минимум, можно выделить сходу уже два небольших класса. По большому счету обертки над массивом, но с дополнительной небольшой функциональностью. Твой алгоритм мне абсолютно не знаком, поэтому переделывал "наугад" и тебе стоит проверить правильность (может быть что-то еще нужно переделать или подправить), но идея в любом случае отражена:
Выводд матрицы лучше не засовывать в класс матрицы, так как сам вывод зависит от приложения. Другими словами, каждый класс отвечает только за свою логику и за свою задачу, которая касается только его. |
| Автор: Garcian 23.5.2011, 16:48 | ||||
| Разбирал как китайскую грамоту, через дебагер Да уж, совсем другое представление) Как я понял List<KrusckalMatrixRow> _rows - список, в который мы добавляем строки. Для каждой строки у нас есть ее длина, 2 минимальных эл-та, их разность и индекс минимального элемента. Рассматривая матрицу приведенную ниже выявил кое-какие ошибки.
Исправил метод CalcCore (убрал лишние break и добавил flag). Программа все равно зациклится, нужно каждый раз при запуске CalcCore обнулять MinValueIndex. Осуществить я это не сумел. Все таки для меня этот код тяжел для понимания, т.к. я не то что не могу добавить метод Check (мой второй пост), но и даже саму матрицу вывести не в состоянии.
|
| Автор: -Mikle- 23.5.2011, 17:57 | ||||
Я сделал так, что MinValueIndex пересчитывается автоматически, каждый раз как только меняется любое значение в строке. Происхожит это здесь:
((Кстати в методе ошибка есть, надо в самое самое начало метода CalcMinValueIndex добавить строку MinValueIndex = 0, возможно из-за этого ошибка. Попробуй сначала исправить и проверить, если все равно не будет работать как надо, то тогда пробуй дальше.)) То есть каждый раз когда задается значение любой колонке вызывается метод пересчета свойства MinValueIndex. Если тебе не требуется автоматика, то убери вызов из сетера и измени модификатор метода CalcMinValueIndex с private на public (это позволит тебе вызывать этот метод снаружи, там где основной алгоритм). Если тебе потребуется вдруг снаружи класса устанавливать значение свойства MinValueIndex, то надо в классе KrusckalMatrixRow изменить строку public int MinValueIndex { get; private set; } на public int MinValueIndex { get; set; } (убрать модификатор private с сетера свойства). Ну и если что пиши, раз я уже взялся, то доведем как-нить твой алгоритм (если не до ума, то хотя бы до рабочего состояния PS: а вот вывод матрицы по тому же принципу как у тебя в первом посте (намеренно ничего не менял, чтоб все похоже было):
|
| Автор: Garcian 23.5.2011, 23:04 | ||||||||
угу) она и есть) все работает) все правильно) Добавил метод Check:
Результат работы такой же как и во втором моем посте)
Правда меня тут не совсем устраивает инициализация массива Cch, но я по другому просто не умею)
Уф, а теперь самое сложное, сделать ко всему этому форму... Смотрю видео лекции на английском и понимаю, что все очень печально |
| Автор: Garcian 24.5.2011, 22:28 | ||||
| Да, тут спорный момент. Все таки задание звучало "по содержимому таблицы найдите..." + контрольный пример. Т. е. и матрица весов вроде как задана, и ее размер тоже... и тогда программа носит чисто демонстративный характер, но смысла в ней тогда мало. Поэтому я решил оставить размер матрицы 7x6. А вот значения в ней могут варьироваться (пользователем). Форма будет включать в себя таблицу, которая и будет представлять матрицу весов. Значения по умолчанию в таблице будут стоять, допустим, единички. Эти значения можно менять от 1 до 99. Соответственно, можно добавить кнопку запуска обработки таблицы методом Крускала. Для большей наглядности после обработки таблицы, можно залить ее ячейки с минимальными элементами (которые получились в конце), каким-либо цветом. Также дополнительно куда-нибудь вывести сообщение о невостребованном объекте (номер столбца Y) и минимальную сумму затрат (сумма минимальных элементов). Ну и напоследок сделать кнопочку "сброса" всех значений таблички обратно в состояние "по умолчанию". Преподаватель требует выполнения работы в 2010 студии) Ничего против не имею, но большую часть учебных курсов, которые я искал, для 2008 студии, а там все таки есть различия (смотрел курс видео лекций Total Training - MS Visual Studio 2008 Essentials Featuring Windows Forms). Чет я не догадался на MSDN сразу зайти... В общем, постараюсь разобраться.
Представил)
обязательно |
| Автор: Garcian 27.5.2011, 16:03 |
| Много всего просмотрел, в том числе на MSDNе. К сожалению нигде не нашел нормального практического руководства. Конечно, я оттуда кое что вынес, но этого явно недостаточно. Тем не менее я создал, как мне кажется, вразумительную форму (файл я вложил в сообщение) на основе того, что я узнал. Но я не представляю, как связать мой консольный вариант с этой формой. Времени разобраться уже совсем не осталось, а получать удовл за работающую программу совсем не хочется. Где должен располагаться основной текст программы? Как его вызвать на выполнение? В общем, у меня в голове белый лист. |
| Автор: Garcian 1.6.2011, 12:38 | ||
| Подскажите, пожалуйста, какой командой можно вывести информацию в ListView! Надеюсь на скорейший ответ, очень надо! ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RichTextBox для этого оказался удобнее) Но можно ли в него передать 2 параметра каким-либо образом. Например, есть строчка:
И как это можно реализовать в боксе? AppendText больше 1 параметра не поддерживает( |
| Автор: wester 1.6.2011, 13:55 |
| Garcian, использовать String.Format() ? |
| Автор: Garcian 1.6.2011, 14:11 |
| Можно пример? |
| Автор: wester 1.6.2011, 14:18 |
| string example = string.Format("Просканировано файлов {0}, Подходящих {1}", 190, 2); http://msdn.microsoft.com/en-us/library/b1csw23d.aspx тоже есть пример |
| Автор: Garcian 1.6.2011, 14:33 |
| wester, спасибо большое! |
| Автор: Garcian 1.6.2011, 15:34 | ||
| Всем спасибо) Сделал форму, вроде даже как рабочую) Единственное, что не смог осуществить - перекрашивание ячеек TextBox, в которых содержаться минимальные элементы (не смог связать ядро программы с графической интерпретацией), а так все что намеревался сделать - сделал. http://s1.ipicture.ru/Gallery/Viewfull/4634696.html Реализовал может не совсем рационально, но главное работает
|