![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Garcian |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Здравствуйте, Уважаемые программисты!
Совсем недавно я вступил в ООП. И пока не понимаю его преимущества. Но об этом потом. В общем, пишу программу на основе нахождения кратчайшей сети Крускала (вкратце - суть в том, чтобы найти минимальные паросочетания взвешанного двудольного графа). Для примера здесь используется матрица весов C. Моя проблема состоит в следующем: я, как мне кажется, с программировал этот алгоритм правильно, но я совсем застрял на том моменте, где я рекурсивно вызываю функцию Krasckal! Признаюсь, опыта в программировании у меня немного, и может я не знаю каких-либо элементарных вещей. Подскажите, пожалуйста, как избавится от зацикливания! Собственно, здесь у меня происходит проверка (строка 47):
которая проверяет, принадлежат ли минимальные элементы в разных строках одному столбцу. И, если таковых нет, метод Krasckal должен прекращать свою работу. С этим у меня и возникла проблема. Теперь, что касается ООП. Я знаю, что три основных принципа, это инкапсуляция, полиморфизм и наследование. Но я не представляю как можно улучшить работу программы используя этот подход. Если у Вас есть идеи и Вас не затруднит, объясните, пожалуйста. И, наконец, сроки сдачи работы у меня поджимают. А программу требуется выполнить в Windows Forms. Реально ли разобраться в этом за пару суток, или мне стоит искать помощь в реализации этого на стороне?
--------------------
Неродивый студент |
||||
|
|||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Все окончательно исправил
Если не сложно, ответьте на два последующих вопроса Это сообщение отредактировал(а) Garcian - 22.5.2011, 22:23 --------------------
Неродивый студент |
|||
|
||||
| -Mikle- |
|
||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 4 Всего: 59 |
Как минимум, можно выделить сходу уже два небольших класса. По большому счету обертки над массивом, но с дополнительной небольшой функциональностью. Твой алгоритм мне абсолютно не знаком, поэтому переделывал "наугад" и тебе стоит проверить правильность (может быть что-то еще нужно переделать или подправить), но идея в любом случае отражена:
Выводд матрицы лучше не засовывать в класс матрицы, так как сам вывод зависит от приложения. Другими словами, каждый класс отвечает только за свою логику и за свою задачу, которая касается только его. -------------------- Если тебе плюют в спину, значит ты впереди... |
||||
|
|||||
| Garcian |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Разбирал как китайскую грамоту, через дебагер
Да уж, совсем другое представление) Как я понял List<KrusckalMatrixRow> _rows - список, в который мы добавляем строки. Для каждой строки у нас есть ее длина, 2 минимальных эл-та, их разность и индекс минимального элемента. Рассматривая матрицу приведенную ниже выявил кое-какие ошибки.
Исправил метод CalcCore (убрал лишние break и добавил flag). Программа все равно зациклится, нужно каждый раз при запуске CalcCore обнулять MinValueIndex. Осуществить я это не сумел. Все таки для меня этот код тяжел для понимания, т.к. я не то что не могу добавить метод Check (мой второй пост), но и даже саму матрицу вывести не в состоянии.
Это сообщение отредактировал(а) Garcian - 23.5.2011, 16:50 --------------------
Неродивый студент |
||||
|
|||||
| -Mikle- |
|
||||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 4 Всего: 59 |
Я сделал так, что MinValueIndex пересчитывается автоматически, каждый раз как только меняется любое значение в строке. Происхожит это здесь:
((Кстати в методе ошибка есть, надо в самое самое начало метода CalcMinValueIndex добавить строку MinValueIndex = 0, возможно из-за этого ошибка. Попробуй сначала исправить и проверить, если все равно не будет работать как надо, то тогда пробуй дальше.)) То есть каждый раз когда задается значение любой колонке вызывается метод пересчета свойства MinValueIndex. Если тебе не требуется автоматика, то убери вызов из сетера и измени модификатор метода CalcMinValueIndex с private на public (это позволит тебе вызывать этот метод снаружи, там где основной алгоритм). Если тебе потребуется вдруг снаружи класса устанавливать значение свойства MinValueIndex, то надо в классе KrusckalMatrixRow изменить строку public int MinValueIndex { get; private set; } на public int MinValueIndex { get; set; } (убрать модификатор private с сетера свойства). Ну и если что пиши, раз я уже взялся, то доведем как-нить твой алгоритм (если не до ума, то хотя бы до рабочего состояния PS: а вот вывод матрицы по тому же принципу как у тебя в первом посте (намеренно ничего не менял, чтоб все похоже было):
-------------------- Если тебе плюют в спину, значит ты впереди... |
||||
|
|||||
| Garcian |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
угу) она и есть) все работает) все правильно) Добавил метод Check:
Результат работы такой же как и во втором моем посте)
Правда меня тут не совсем устраивает инициализация массива Cch, но я по другому просто не умею)
Уф, а теперь самое сложное, сделать ко всему этому форму... Смотрю видео лекции на английском и понимаю, что все очень печально Это сообщение отредактировал(а) Garcian - 23.5.2011, 23:09 --------------------
Неродивый студент |
||||||||
|
|||||||||
| -Mikle- |
|
|||
![]() Невидимка Vingrad'а ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1672 Регистрация: 22.6.2003 Где: Казахстан, Астана Репутация: 4 Всего: 59 |
С этим разберешься потом сам, как домашнее задание тебе. Пока курсовую не сдал не трогай это, пусть останется так как есть (если работает). По поводу форм, как только появятся наработки и проблемы, пиши. Как минимум, тебе сначала надо хорошо представить, как будет выглядеть форма. -------------------- Если тебе плюют в спину, значит ты впереди... |
|||
|
||||
| Garcian |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Да, тут спорный момент. Все таки задание звучало "по содержимому таблицы найдите..." + контрольный пример. Т. е. и матрица весов вроде как задана, и ее размер тоже... и тогда программа носит чисто демонстративный характер, но смысла в ней тогда мало. Поэтому я решил оставить размер матрицы 7x6. А вот значения в ней могут варьироваться (пользователем).
Форма будет включать в себя таблицу, которая и будет представлять матрицу весов. Значения по умолчанию в таблице будут стоять, допустим, единички. Эти значения можно менять от 1 до 99. Соответственно, можно добавить кнопку запуска обработки таблицы методом Крускала. Для большей наглядности после обработки таблицы, можно залить ее ячейки с минимальными элементами (которые получились в конце), каким-либо цветом. Также дополнительно куда-нибудь вывести сообщение о невостребованном объекте (номер столбца Y) и минимальную сумму затрат (сумма минимальных элементов). Ну и напоследок сделать кнопочку "сброса" всех значений таблички обратно в состояние "по умолчанию". Преподаватель требует выполнения работы в 2010 студии) Ничего против не имею, но большую часть учебных курсов, которые я искал, для 2008 студии, а там все таки есть различия (смотрел курс видео лекций Total Training - MS Visual Studio 2008 Essentials Featuring Windows Forms). Чет я не догадался на MSDN сразу зайти... В общем, постараюсь разобраться.
Представил)
обязательно Это сообщение отредактировал(а) Garcian - 24.5.2011, 22:48 --------------------
Неродивый студент |
||||
|
|||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Много всего просмотрел, в том числе на MSDNе. К сожалению нигде не нашел нормального практического руководства. Конечно, я оттуда кое что вынес, но этого явно недостаточно.
Тем не менее я создал, как мне кажется, вразумительную форму (файл я вложил в сообщение) на основе того, что я узнал. Но я не представляю, как связать мой консольный вариант с этой формой. Времени разобраться уже совсем не осталось, а получать удовл за работающую программу совсем не хочется. Где должен располагаться основной текст программы? Как его вызвать на выполнение? В общем, у меня в голове белый лист. Это сообщение отредактировал(а) Garcian - 27.5.2011, 16:04 Присоединённый файл ( Кол-во скачиваний: 10 )
Krusckal.rar 132,96 Kb--------------------
Неродивый студент |
|||
|
||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Подскажите, пожалуйста, какой командой можно вывести информацию в ListView! Надеюсь на скорейший ответ, очень надо!
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RichTextBox для этого оказался удобнее) Но можно ли в него передать 2 параметра каким-либо образом. Например, есть строчка:
И как это можно реализовать в боксе? AppendText больше 1 параметра не поддерживает( Это сообщение отредактировал(а) Garcian - 1.6.2011, 13:28 --------------------
Неродивый студент |
|||
|
||||
| wester |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 27.2.2009 Репутация: 3 Всего: 13 |
Garcian,
использовать String.Format() ? |
|||
|
||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Можно пример?
--------------------
Неродивый студент |
|||
|
||||
| wester |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 27.2.2009 Репутация: 3 Всего: 13 |
string example = string.Format("Просканировано файлов {0}, Подходящих {1}", 190, 2);
здесь тоже есть пример |
|||
|
||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
wester, спасибо большое!
--------------------
Неродивый студент |
|||
|
||||
| Garcian |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 125 Регистрация: 5.11.2008 Репутация: нет Всего: нет |
Всем спасибо) Сделал форму, вроде даже как рабочую) Единственное, что не смог осуществить - перекрашивание ячеек TextBox, в которых содержаться минимальные элементы (не смог связать ядро программы с графической интерпретацией), а так все что намеревался сделать - сделал.
Реализовал может не совсем рационально, но главное работает
--------------------
Неродивый студент |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |