![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
marina12 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.2.2013 Репутация: нет Всего: нет |
Здравствуйте!
Есть код программы,которая сортирует строки методом пузырька Код C
Помогите пожалуйста изменить код:строки должны браться из файла Input, размер файла заранее неизвестен,память под него выделять динамически(с помощью malloc)(только без использования вектора и структур). С открытием файла все понятно, а вот дальше я начала путаться в указателях... Модератор: Не забываем пользоваться кнопочкой "код" Это сообщение отредактировал(а) bsa - 1.5.2013, 15:11 |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
покажи код с открытием файла, и покажи, что не получается с указателями, опиши общую идею как собираешься делать..
если ты не халявщица тебе помогут -------------------- undefined |
|||
|
||||
marina12 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.2.2013 Репутация: нет Всего: нет |
Открытие файла:
fin=fopen("Input.txt","r"); if(fin==NULL) fprintf(stderr,"oshibka otkrutiya faila dlya chteniya\n"); А насчёт указателей думала создать массивы строк и указателей,присвоить адрес строки нужному указателю и в функции сортировки работать уже с указателями. В массиве строк я и запуталась..массив строк это массив из массивов,получается здесь используем указатель на указатель? |
|||
|
||||
Guinness |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
А чтение, где? И может уже более полный код выложим? По кускам не очень понятно, как Вы собираетесь решать Вашу задачу.
|
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Поскольку длина файла неизвестна, можете запоминать строки в структуре:
После считывания число строк будет известно, и список можно будет преобразовать в массив, а можно сортировать "на лету", добавляя новую запись не в конец списка, в нужное место в списке. |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
идея правильная, но прежде чем приступать к реализации необходимо прояснить несколько вопросов: 1) формат файла (что будет являться разделителем, перенос строки или запятая, возможно запятая и перенос строки: предлагаю перенос строки, для упрощения) 2) хранение данных (где данные будут храниться, самое простое - считать весь файл в строковую переменную, и произвести разделение строки на элементы (split)) -------------------- undefined |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Какая-то структура просто напрашивается, но... По-моему, самое тупое решение - 2 раза прочитать файл. Первый - чтобы выяснить число строк (и аллокировать массив строк соответствующего размера), второй - чтобы непосредственно загружать строки из файла в массив строк. Конечно, при этом нужна осторожность (например, файл между первым чтением и вторым может измениться). Такое тупое решение не будет оптимальным, и будет корректно работать только с "настоящими" файлами. Но зато оно позволит существенно упростить код:
ЗЫ Посмотрите внимательно: Это сообщение отредактировал(а) feodorv - 29.4.2013, 17:41 -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
тогда можно проще и надежнее: 1) выяснить размер файла, 2) выделить память под весь файл + 1 3) произвести над ним split, получив масив строк 4) вызвать функцию сортировки -------------------- undefined |
|||
|
||||
feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Вот под это всё так и тянет структуру завести ![]() Но, честно, не думаю, что выйдет проще... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
можно без структур обойтись в упрощенном варианте, тут вся загвоздка в разделении, но такую функцию я как раз тут и приводил.. -------------------- undefined |
|||
|
||||
marina12 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 15.2.2013 Репутация: нет Всего: нет |
Всем большое спасибо!
Посмотрите пожалуйста теперь, в правильном ли месте выделена память под массивы, а то компилятор на это жалуется, но сортирует вроде бы правильно...
Это сообщение отредактировал(а) marina12 - 29.4.2013, 21:40 |
|||
|
||||
fish9370 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
какой страшный код
-------------------- undefined |
|||
|
||||
Guinness |
|
||||||||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 21.6.2009 Где: Зеленоград Репутация: 2 Всего: 10 |
Это, конечно, круто. Я даже вскрылся пару раз.
Сразу хочу сказать, не хочу обидеть, все мы поначалу ошибались, просто пытаюсь дать советы как лучше исправить, чтобы код был читабельным. Дайте переменным нормальные имена, не однобуквенные.
Здесь видимо нужно использовать fin. Плюс, зачем этот цикл, когда есть чудесные функции fseek и ftell http://www.cplusplus.com/reference/cstdio/ftell/
Во-первых, если сравниваете char, то лучше пишите, что это за символ, а не код из таблицы ascii. Во-вторых, зачем это сравнение? Просто добавьте к размеру файла единицу для '\0'. Все остальное должно считаться.
Вот не нужно так писать. Зачем? Что Вы хотели этим сэкономить? Вроде понятно, что делает этот код, но читабельность падает. И не бойтесь ставить фигурные скобки.
Зачем Вам такой блок инициализации? Вам нужно было только последний символ установить как '\0', остальное должно считываться из файла. Опять же j++ лучше вынести в объявление цикла(не помню как по умному называется). Допустим здесь мы подсчитали количство строк в буфере - это у нас число k. Тогда, что Вы хотели сказать этой строчкой:
Здесь Вы выделили k байт, v указывает - честно говоря, затрудняюсь даже сказать куда. Вы же хотите в выделенной памяти хранить указатели на начало строк в буфере, так? А где Вы будете хранить размер каждой строки? Надеюсь здесь меня поправят более опытные форумчане. Я же просто перестал понимать как у Вас это работает без ошибок. Если не ошибаюсь размер указателя равен int. И тут вроде бы нужно сделать как-то так:
Если не прав, надеюсь поправят.
Откуда взято число 5? j-5 смотрится очень стремно, j < 5 - это конечно мейнстрим, а мы не ищем легких путей, но лучше все же писать именно так. Это сообщение отредактировал(а) Guinness - 30.4.2013, 08:35 |
||||||||||||||||
|
|||||||||||||||||
fish9370 |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 15.4.2007 Где: Москва Репутация: 1 Всего: 1 |
спасибо Guinness, надеюсь твои слова будут услышаны
я тут набросал свое видение решения данной задачи, модификация приветствуется:
сборка
файл array.txt
тестирование
PS прошу прощения за копирайт, но возможно это кому-то будет полезно Это сообщение отредактировал(а) fish9370 - 30.4.2013, 12:34 -------------------- undefined |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "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. |