![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
KasMP |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Есть граф.
В файле сначала записано число его вершин, потом - его матрица смежности (через пробел, предположительно). Из этой матрицы смежности нужно получить представление графа в виде массива списков (каждый список смежности - динамического линейного списка, адреса первых элементов – в массиве указателей). Потом вывести этот массив списков в выходной файл (сначала - число вершин графа, затем все списки смежности по возрастанию номеров вершин в списках и номеров вершин, которым списки принадлежат; в конце каждого списка - "0"). При этом надо создать тип, описывающий каждое представление и функцию, переводящую один тип в другой (а не читать напрямую из входного файла и сразу выводить в выходной). Посмотрите, пожалуйста, что можно усовершенствовать ![]() Пример входного файла:
|
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
1. NewCreateMatrix является копипастом содержимого NewMatrix и CreateМатрих a также открывает файл который открыт в main
2. есть ListEl и ArrayofLists, но не нету List. 3. Размерность передается в функцию не параметром, а посредством значения размерности структуры. 4. Чтение с файла внутри функций не предназначенных для этого 4а. При этом файл чтения не передан как аргумент. 5. использование фиктивного эллемента 6.. Ну для начала хватит ![]() |
|||
|
||||
KasMP |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Ну, здесь я немного поленилась... Переделаю ![]() А вообще это считается большим серьезным минусом? Из файла я читаю только тогда, когда заполняю матрицу. Эта функция (CreateMatrix или NewCreateMatrix) как раз и предназначена для того, чтобы читать из файла в память. Или что ты предлагаешь ![]() Да!! Это плохо ![]()
Долго думала, что могла значить эта фраза... Разные варианты продумала... Ты имел в виду, что не надо передавать в ф-ю 2 параметра - размерность и указатель на структуру, что достаточно только указателя (т.к. структура содержит размерность)? У меня вроде бы так и сделано ![]() Интересная мысль ![]() С одной стороны, в логической цепочке [элемент списка] -> [список] -> [массив списков] действительно не должно быть пробелов... Но с другой, что такое список? Правильнее всего представлять его указателем на первый элемент... Не создавать же структуру, состоящую из одного указателя!
Я понимаю ![]() Просто с одной стороны хочется рациональности (NewCreateMatrix - за один цикл м-а и создается, и заполняется), с другой - наглядности (NewMatrix+CreateMatrix - четко видно и понятно, кто что делает и зачем...). Я еще не выбрала, какой вариант лучше ![]() Ну, если передавать ссылку на файл, то, конечно, я не буду открывать его снова... Добавлено через 1 минуту и 44 секунды А удаляющие ф-ии у меня правильные? Все чистят? Я проверяла на несколько раз, но чувства Уверенности все равно нет... |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
как раз наоборот. размерность нужно передавать параметром, а не внутри структуры, так как то поле внутри структуры несет по смыслу текущий размер матрицы, а не требуемый.
из за нехватки этой структуры тебе приходится вводить фиктивный элемент. ![]()
Так вызывай в функции NewCreateMatrix функции NewMatrix и CreateMatrix.. хотя функция по загрузке с файла звучала бы лучше как LoadMatrix.. Это сообщение отредактировал(а) mes - 15.3.2009, 19:42 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
и еще у тебя все функции между собой перемешаны.. старайся описывать функции относящиеся к одной группе вместе.
т.е к примеру все что касается матриц вместе, при этом функция удаления сразу за функцией создания.. В общем соблюдай симметрию и тогда не будешь волноваться о том, правильно ли все удалилось. Это сообщение отредактировал(а) mes - 15.3.2009, 20:01 |
|||
|
||||
KasMP |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Когда я это делала, я думала так: ф-ии, начинающиеся с "New", изначально предназначены для конструирования, и поэтому в них можно передавать не до конца определенные структуры; во все другие ф-ии надо передавать уже полноценные, правильно заполненные структуры, где все поля соответствуют именно текущему состоянию друг друга. Неужели так мыслить - плохо :( ?
Я не введу его другим способом ![]() Имхо вводить структуру из одного указателя ради фиктивного элемента (его отсутствия, точнее ![]()
И тогда рациональный вариант (где за 1 цикл делается все) исчезнет совсем ![]() Добавлено через 3 минуты и 24 секунды Они идут по порядку и разделены на группы для: создания (выделения памяти) заполнения перевода вывода удаления
так тоже можно разбить ![]() |
||||||
|
|||||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
плохо это : одно и то же поле несет двойную логику в зависимости от функции.
Обратная логика : структуру списка нужно ввести не для устранения фиктивного элемента, а для того чтоб спокойно работать со списком. А вот фиктивный элемент появился в следствии отсутствия списка и является загромаждением.
А рациональность то в чем ? в том что он пару тактов процессора съэкономит ? Это как при покупке мерса торговаться за цент ![]() Добавлено через 3 минуты и 35 секунд
В таком порядке у тебя нет наглядности. |
||||||
|
|||||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Ну да, дискомфортно... Получается, чтобы выбрать логику, надо найти название ф-ии, выделить начало и вспомнить, какое свойство этому началу приписывал автор ![]() Допишем в New* и Create* второй параметр ![]() Сейчас я сделаю без фик.эл-та и без структуры ![]()
А если в графе много-много вершин? Добавлено через 55 секунд Это большая правда. Спасибо за советы ![]() Добавлено через 5 минут и 14 секунд А может некоторые переменные как-то по-другому назвать, чтобы читалось легче? Или нормально ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Ну и в чем выйгрыш вместо вызова двух функций все описывать в одной ? Это сообщение отредактировал(а) mes - 15.3.2009, 20:45 |
|||
|
||||
KasMP |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
![]() ![]() Да... Получается какая-то сложная, совсем ненаглядная штука (которая еще и вылетает в некоторых случаях в ф-х вывода по понятным причинам).
![]() ![]() ![]() Добавлено через 4 минуты и 27 секунд
NewCreate - внешний цикл до t-1, в нем внутренний цикл до t-1. New - цикл до t-1. Create - в плане циклов то же, что NewCreate. Если сложить New и Create, то получается на 1 цикл больше... Или это не так важно? |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Разница в один цикл получается вследствии того, что у тебя в одной из функций идет обнуление. Так вынеси обнуление как отдельную функцию Clear () ![]() Добавлено через 3 минуты и 51 секунду Попробуй ответить, эта функция по конвертированию матрицы в список или по добавлению списка в массив ? |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
AddOneList добавляет в массив один список (соответствующий одной вершине, т.е. одной строке матрицы). Interpretation переводит матрицу в список, используя AddOneList. Добавлено через 2 минуты и 43 секунды Вот, теперь у меня хотя бы файлы не открываются дважды ![]() ![]() ![]() ![]() Добавлено через 4 минуты и 32 секунды А фиктивный элемент я оставлю... На нем слишком много всего завязано. (да и неоднократно из уст преподавателя вылетала фраза: "в списках всегда нужно создавать фиктивный элемент... в них всегда проблема с 1-м элементом - необходимо создавать фиктивный") Добавлено через 6 минут и 15 секунд 1. + 2. + 3. + 4(а). + 5. ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Без комментариев (из уважения к почетному званию Учитель) Ну хоть бы выложила, чтоб можно было сравнить ![]() ну ка еще раз посмотрим на объявление: чудеса ![]() ![]() Это сообщение отредактировал(а) mes - 15.3.2009, 21:27 |
|||
|
||||
KasMP |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 586 Регистрация: 8.8.2006 Репутация: нет Всего: 30 |
Да, я тоже думаю, что есть способ лучше, чем фикт.элемент. (вроде когда-то я писала отдельные процедуры для добавления первого элемента) "Добавлением одного списка" я называю непосредственно добавление и перевод одной строки из м-ы в этот список. short i - ну, номер строки, которую сейчас добавляем-переводим (нам нужно знать, к какой строке м-ы обращаться) ListEl *pp - ук-ль на начало списка, соответствующего строке (вершине) i... AdjacencyMatrix *p_matrix - ![]() Пожалуйста ![]()
Добавлено @ 21:37 Я еще порядок хотела поменять. Сейчас! Это сообщение отредактировал(а) KasMP - 15.3.2009, 21:41 |
|||
|
||||
mes |
|
||||||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
лови подарок ![]() // базовые функции работы с матрицей смежности
// базовые функции работы со списком и его массивом
// потоковые функции :
ну и само выполнения задания на основе вышеприведенных функций
Ну a дальше тестируй и ровняй под свои нужды.. P.S. и никаких фиктивных элементов при работе со списком ![]() Это сообщение отредактировал(а) mes - 16.3.2009, 00:49 |
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |