| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Динам.память, списки, массивы, файлы... |
| Автор: KasMP 15.3.2009, 16:25 | ||||
| Есть граф. В файле сначала записано число его вершин, потом - его матрица смежности (через пробел, предположительно). Из этой матрицы смежности нужно получить представление графа в виде массива списков (каждый список смежности - динамического линейного списка, адреса первых элементов – в массиве указателей). Потом вывести этот массив списков в выходной файл (сначала - число вершин графа, затем все списки смежности по возрастанию номеров вершин в списках и номеров вершин, которым списки принадлежат; в конце каждого списка - "0"). При этом надо создать тип, описывающий каждое представление и функцию, переводящую один тип в другой (а не читать напрямую из входного файла и сразу выводить в выходной). Посмотрите, пожалуйста, что можно усовершенствовать Пример входного файла:
|
| Автор: mes 15.3.2009, 17:16 |
| 1. NewCreateMatrix является копипастом содержимого NewMatrix и CreateМатрих a также открывает файл который открыт в main 2. есть ListEl и ArrayofLists, но не нету List. 3. Размерность передается в функцию не параметром, а посредством значения размерности структуры. 4. Чтение с файла внутри функций не предназначенных для этого 4а. При этом файл чтения не передан как аргумент. 5. использование фиктивного эллемента 6.. Ну для начала хватит |
| Автор: mes 15.3.2009, 19:42 | ||||||
как раз наоборот. размерность нужно передавать параметром, а не внутри структуры, так как то поле внутри структуры несет по смыслу текущий размер матрицы, а не требуемый.
из за нехватки этой структуры тебе приходится вводить фиктивный элемент.
Так вызывай в функции NewCreateMatrix функции NewMatrix и CreateMatrix.. хотя функция по загрузке с файла звучала бы лучше как LoadMatrix.. |
| Автор: mes 15.3.2009, 19:58 |
| и еще у тебя все функции между собой перемешаны.. старайся описывать функции относящиеся к одной группе вместе. т.е к примеру все что касается матриц вместе, при этом функция удаления сразу за функцией создания.. В общем соблюдай симметрию и тогда не будешь волноваться о том, правильно ли все удалилось. |
| Автор: KasMP 15.3.2009, 20:03 | ||||||||
Когда я это делала, я думала так: ф-ии, начинающиеся с "New", изначально предназначены для конструирования, и поэтому в них можно передавать не до конца определенные структуры; во все другие ф-ии надо передавать уже полноценные, правильно заполненные структуры, где все поля соответствуют именно текущему состоянию друг друга. Неужели так мыслить - плохо :( ?
Я не введу его другим способом Имхо вводить структуру из одного указателя ради фиктивного элемента (его отсутствия, точнее
И тогда рациональный вариант (где за 1 цикл делается все) исчезнет совсем Добавлено через 3 минуты и 24 секунды Они идут по порядку и разделены на группы для: создания (выделения памяти) заполнения перевода вывода удаления
так тоже можно разбить |
| Автор: mes 15.3.2009, 20:11 | ||||||
плохо это : одно и то же поле несет двойную логику в зависимости от функции.
Обратная логика : структуру списка нужно ввести не для устранения фиктивного элемента, а для того чтоб спокойно работать со списком. А вот фиктивный элемент появился в следствии отсутствия списка и является загромаждением.
А рациональность то в чем ? в том что он пару тактов процессора съэкономит ? Это как при покупке мерса торговаться за цент Добавлено через 3 минуты и 35 секунд
В таком порядке у тебя нет наглядности. |
| Автор: KasMP 15.3.2009, 20:37 | ||||
Ну да, дискомфортно... Получается, чтобы выбрать логику, надо найти название ф-ии, выделить начало и вспомнить, какое свойство этому началу приписывал автор Допишем в New* и Create* второй параметр
Сейчас я сделаю без фик.эл-та и без структуры
А если в графе много-много вершин? Добавлено через 55 секунд Это большая правда. Спасибо за советы Добавлено через 5 минут и 14 секунд А может некоторые переменные как-то по-другому назвать, чтобы читалось легче? Или нормально |
| Автор: mes 15.3.2009, 20:43 |
Ну и в чем выйгрыш вместо вызова двух функций все описывать в одной ? |
| Автор: KasMP 15.3.2009, 20:51 | ||||
Да... Получается какая-то сложная, совсем ненаглядная штука (которая еще и вылетает в некоторых случаях в ф-х вывода по понятным причинам).
Добавлено через 4 минуты и 27 секунд
NewCreate - внешний цикл до t-1, в нем внутренний цикл до t-1. New - цикл до t-1. Create - в плане циклов то же, что NewCreate. Если сложить New и Create, то получается на 1 цикл больше... Или это не так важно? |
| Автор: mes 15.3.2009, 20:59 | ||
Разница в один цикл получается вследствии того, что у тебя в одной из функций идет обнуление. Так вынеси обнуление как отдельную функцию Clear () Добавлено через 3 минуты и 51 секунду Попробуй ответить, эта функция по конвертированию матрицы в список или по добавлению списка в массив ? |
| Автор: KasMP 15.3.2009, 21:14 | ||||
AddOneList добавляет в массив один список (соответствующий одной вершине, т.е. одной строке матрицы). Interpretation переводит матрицу в список, используя AddOneList. Добавлено через 2 минуты и 43 секунды Вот, теперь у меня хотя бы файлы не открываются дважды Добавлено через 4 минуты и 32 секунды А фиктивный элемент я оставлю... На нем слишком много всего завязано. (да и неоднократно из уст преподавателя вылетала фраза: "в списках всегда нужно создавать фиктивный элемент... в них всегда проблема с 1-м элементом - необходимо создавать фиктивный") Добавлено через 6 минут и 15 секунд
1. + 2. + 3. + 4(а). + 5. |
| Автор: mes 15.3.2009, 21:27 | ||
Без комментариев (из уважения к почетному званию Учитель) Ну хоть бы выложила, чтоб можно было сравнить ну ка еще раз посмотрим на объявление: чудеса |
| Автор: KasMP 15.3.2009, 21:36 | ||
Да, я тоже думаю, что есть способ лучше, чем фикт.элемент. (вроде когда-то я писала отдельные процедуры для добавления первого элемента) "Добавлением одного списка" я называю непосредственно добавление и перевод одной строки из м-ы в этот список. short i - ну, номер строки, которую сейчас добавляем-переводим (нам нужно знать, к какой строке м-ы обращаться) ListEl *pp - ук-ль на начало списка, соответствующего строке (вершине) i... AdjacencyMatrix *p_matrix - Пожалуйста
Добавлено @ 21:37 Я еще порядок хотела поменять. Сейчас! |
| Автор: mes 16.3.2009, 00:38 | ||||||||||
лови подарок // базовые функции работы с матрицей смежности
// базовые функции работы со списком и его массивом
// потоковые функции :
ну и само выполнения задания на основе вышеприведенных функций
Ну a дальше тестируй и ровняй под свои нужды.. P.S. и никаких фиктивных элементов при работе со списком |
| Автор: mes 16.3.2009, 11:57 | ||
так как список у нас однонаправленный, то удобно добавлять/убирать с одной стороны, поэтому думаю пригодится также иметь функцию инверсии (переворачивания с головы на хвост) списка:
|
| Автор: KasMP 17.3.2009, 16:04 |
Спасибо большое Интересная мысль Пока не буду смотреть, хочется подумать самой P.S.. А ты не хочешь приблизить программирование к своей работе (или тогда весь кайф пропадет |