| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Сортировка методом пузырька |
| Автор: marina12 28.4.2013, 22:12 | ||
| Здравствуйте! Есть код программы,которая сортирует строки методом пузырька Код C
Помогите пожалуйста изменить код:строки должны браться из файла Input, размер файла заранее неизвестен,память под него выделять динамически(с помощью malloc)(только без использования вектора и структур). С открытием файла все понятно, а вот дальше я начала путаться в указателях... Модератор: Не забываем пользоваться кнопочкой "код" |
| Автор: fish9370 29.4.2013, 09:56 |
| покажи код с открытием файла, и покажи, что не получается с указателями, опиши общую идею как собираешься делать.. если ты не халявщица тебе помогут |
| Автор: marina12 29.4.2013, 14:30 |
| Открытие файла: fin=fopen("Input.txt","r"); if(fin==NULL) fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n"); А насчёт указателей думала создать массивы строк и указателей,присвоить адрес строки нужному указателю и в функции сортировки работать уже с указателями. В массиве строк я и запуталась..массив строк это массив из массивов,получается здесь используем указатель на указатель? |
| Автор: Guinness 29.4.2013, 14:42 |
| А чтение, где? И может уже более полный код выложим? По кускам не очень понятно, как Вы собираетесь решать Вашу задачу. |
| Автор: math64 29.4.2013, 15:41 | ||
Поскольку длина файла неизвестна, можете запоминать строки в структуре:
После считывания число строк будет известно, и список можно будет преобразовать в массив, а можно сортировать "на лету", добавляя новую запись не в конец списка, в нужное место в списке. |
| Автор: feodorv 29.4.2013, 17:37 | ||||
Какая-то структура просто напрашивается, но... По-моему, самое тупое решение - 2 раза прочитать файл. Первый - чтобы выяснить число строк (и аллокировать массив строк соответствующего размера), второй - чтобы непосредственно загружать строки из файла в массив строк. Конечно, при этом нужна осторожность (например, файл между первым чтением и вторым может измениться). Такое тупое решение не будет оптимальным, и будет корректно работать только с "настоящими" файлами. Но зато оно позволит существенно упростить код:
ЗЫ Посмотрите внимательно:
|
| Автор: fish9370 29.4.2013, 17:56 |
тогда можно проще и надежнее: 1) выяснить размер файла, 2) выделить память под весь файл + 1 3) произвести над ним split, получив масив строк 4) вызвать функцию сортировки |
| Автор: feodorv 29.4.2013, 18:05 | ||
Вот под это всё так и тянет структуру завести Но, честно, не думаю, что выйдет проще... |
| Автор: fish9370 29.4.2013, 18:15 | ||
можно без структур обойтись в упрощенном варианте, тут вся загвоздка в разделении, но такую функцию я как раз тут и приводил.. |
| Автор: marina12 29.4.2013, 21:39 | ||
| Всем большое спасибо! Посмотрите пожалуйста теперь, в правильном ли месте выделена память под массивы, а то компилятор на это жалуется, но сортирует вроде бы правильно...
|
| Автор: fish9370 29.4.2013, 22:52 |
| какой страшный код |
| Автор: Guinness 30.4.2013, 08:34 | ||||||||||||||||
| Это, конечно, круто. Я даже вскрылся пару раз. Сразу хочу сказать, не хочу обидеть, все мы поначалу ошибались, просто пытаюсь дать советы как лучше исправить, чтобы код был читабельным. Дайте переменным нормальные имена, не однобуквенные.
Здесь видимо нужно использовать fin. Плюс, зачем этот цикл, когда есть чудесные функции fseek и ftell http://www.cplusplus.com/reference/cstdio/ftell/
Во-первых, если сравниваете char, то лучше пишите, что это за символ, а не код из таблицы ascii. Во-вторых, зачем это сравнение? Просто добавьте к размеру файла единицу для '\0'. Все остальное должно считаться.
Вот не нужно так писать. Зачем? Что Вы хотели этим сэкономить? Вроде понятно, что делает этот код, но читабельность падает. И не бойтесь ставить фигурные скобки.
Зачем Вам такой блок инициализации? Вам нужно было только последний символ установить как '\0', остальное должно считываться из файла. Опять же j++ лучше вынести в объявление цикла(не помню как по умному называется). Допустим здесь мы подсчитали количство строк в буфере - это у нас число k. Тогда, что Вы хотели сказать этой строчкой:
Здесь Вы выделили k байт, v указывает - честно говоря, затрудняюсь даже сказать куда. Вы же хотите в выделенной памяти хранить указатели на начало строк в буфере, так? А где Вы будете хранить размер каждой строки? Надеюсь здесь меня поправят более опытные форумчане. Я же просто перестал понимать как у Вас это работает без ошибок. Если не ошибаюсь размер указателя равен int. И тут вроде бы нужно сделать как-то так:
Если не прав, надеюсь поправят.
Откуда взято число 5? j-5 смотрится очень стремно, j < 5 - это конечно мейнстрим, а мы не ищем легких путей, но лучше все же писать именно так. |
| Автор: fish9370 30.4.2013, 11:54 | ||||||||
| спасибо Guinness, надеюсь твои слова будут услышаны я тут набросал свое видение решения данной задачи, модификация приветствуется:
сборка
файл array.txt
тестирование
PS прошу прощения за копирайт, но возможно это кому-то будет полезно |