![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
KerK |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вектор А=(А1,А2,…,Аn) считается лексикографически большим вектора В=(В1,В2,…,Вn), если существует k>=0 такое что Аi=Вi(i<=k),Ak+1>Bk+1. Составить программу лексикографической сортировки числовых векторов. При составлении программы сортировки использовать минимальную необходимую память и эффективные структуры данных.
Давал пост в разделе задачи Лексикографическая сортировка числовых векторов., мне помогли с заданием но реализация была на паскале... вот попробовал перевести в сишку... возникли вопросы.... в сишке ни разу не пробовал процедуры... правильно ли я написал? и нет под рукой книги или хелпа, хотелось бы узнать что дает в паскале команда inc, и как она должна выглядеть в С. Потом не совсем понял какая структура должна быть у программы на С. НАпример на паскале ... ... procedure main(); end; Begin End. а как на си? И посмотрите пожалуйста мой код.... где какие ошибки? и как продолжить главный модуль программы?
|
Michael_Rybak |
![]()
Сообщение
#2
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Если тебе на сях надо было, ты б так и говорил, я б на сях и пример приводил.
Ну че, давай по порядку. main() - это стандартное для си название главной функции программы. Такая функция всегда есть, и всегда одна. Например: На паскале program a_plus_b; На си:
Очень внимательно изучи это код на предмет оформления и вызова процедур, да и общей структуры программы. Теперь, что касается перевода. 1. Перенеси объявление массивов vv и sorted наверх, иначе из тела функции их не будет видно 2. Строку main() убери, и объяви функцию main отдельно, как я показал в примере выше. 3. Во всех проверках "=" записывается в си как "==". Здесь: if (sort_by=len+1) exit; и здесь: vv[sorted[j+1]][sort_by]=vv[sorted[j]][sort_by] 4. exit, означающий преждевременный выход из процедуры, в си записывается как return; 5. Вот такой цикл for i := 1 to up_bound - low_bound + 1 do Записывается так for (i=1;i<=up_bound-low_bound+1;i++) У тебя все правильно, но стоит "=" вместо "<=". 6. То же самое: for j := low_bound to up_bound - 1 do Записывается так: for (j=low_bound;j<=up_bound-1;j++) Тоже было "=", надо "<=". 7. Вот здесь: while (j < up_bound) and (vv[sorted[j + 1], sort_by] = vv[sorted[j], sort_by]) do Ты заменил случайно j на i. Верни ![]() 8. Inc(j); - это просто j++. 9. Вот здесь: i := j + 1; Ты тоже случайно заменил j на i. Верни. Давай, заменяй и приходи обратно. Какой у тебя си? Может си++? И ты уверен, что ты должен осилить именно "минимальную необходимую память и эффективные структуры данных"? Намучаешься немеряно, обещаю ;) Может давай для начала напишем такую простую сортировку пузырьком? Вот тебе шаблон, попробуй дописать: #include <stdio.h> Не заметил в названии темы ВС++. Тогда вообще хорошо, можно std::sort юзать. Там ведь есть stl (последний раз, когда я видел BC++, я не знал, что такое stl ![]() |
KerK |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Что-то вот такое вышло ... но не рабочее ))) Щас вот разбираться буду в чем дело... не сортирует помоему ничего... А чем отличается лексикографическая сортировка от просто сортировки? Я думал лексикографическая, касается сортировок алфавита (вобщем от слова лексико) ... Я тут еще подправил.... помоему незачем писать лишний код...
твой был такой
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Я тут еще подправил.... помоему незачем писать лишний код... А по-моему, ты ошибаешься.. Это совершенно не эквивалентные коды...int LexSmaller(int x, int y) Что произойдет, если vv[x][0] = vv[y][0]? Безо всяких сомнений функция вернет тебе 0, т.к. else относится только к результату сравнения if (vv[x][i]<vv[y][i])... Элементы равны, следовательно условие НЕ выполнилось, возвращен 0... Всё. Результат неверный... До второй итерации дело вообще не дойдет, хотя по идее если vv[x][0] = vv[y][0], но vv[x][1] < vv[y][1] функция должна вернуть 1... Тебе, кстати, компилятор должен давать Warning... Ты почему его игнорируешь? |
KerK |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Код Вектор А=(А1,А2,…,Аn) считается лексикографически большим вектора В=(В1,В2,…,Вn), если существует k>=0 такое что Аi=Вi(i<=k),Ak+1>Bk+1. Составить программу лексикографической сортировки числовых векторов. При составлении программы сортировки использовать минимальную необходимую память и эффективные структуры данных. Перечитал задание... i - это порядковый номер элемента, k - это элемент? т.е. например A) 1 2 3 B) 4 2 1 у А2 k=2, оно больше 0... и такое что A2=B2 и порядковый номер =2 (i<=k), а А3>B3... следовательно Вектор А считается лексиграфически большим вектора B.... так? Т.е. цель задачи в том чтобы отсортировать вектор, так, чтобы он подходил к вышесказанному условию? |
Michael_Rybak |
![]()
Сообщение
#6
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Представь себе, что векторы - это слова, а элементы в векторах - буквы в словах. Твоя задача - отсортировать слова по алфавиту.
|
KerK |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Представь себе, что векторы - это слова, а элементы в векторах - буквы в словах. Твоя задача - отсортировать слова по алфавиту. все врубился... сортировка идет по первым элементам вектора, если они равны, то по второму элементу... Только остается вопрос: Код При составлении программы сортировки использовать минимальную необходимую память и эффективные структуры данных. Каким макаром добиться этого условия? |
Michael_Rybak |
![]()
Сообщение
#8
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата сортировка идет по первым элементам вектора, если они равны, то по второму элементу... ![]() Цитата Код При составлении программы сортировки использовать минимальную необходимую память и эффективные структуры данных. Каким макаром добиться этого условия? Честно говоря, я тебе уже ответил на этот вопрос в самом начале. Но давай ты все-таки сделаешь, чтоб работало, а потом уж возмешься за оптимизацию. Доделай мой шаблон, убедись, что всё "сходится", и вектора действительно сортируются, выложи результат сюда, и потом попробуй разобраться в том, что я тебе ответил в той теме. Там - и память минимальная, и время. |
KerK |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
![]() Честно говоря, я тебе уже ответил на этот вопрос в самом начале. Но давай ты все-таки сделаешь, чтоб работало, а потом уж возмешься за оптимизацию. Доделай мой шаблон, убедись, что всё "сходится", и вектора действительно сортируются, выложи результат сюда, и потом попробуй разобраться в том, что я тебе ответил в той теме. Там - и память минимальная, и время.
Например 9 5 1 1 2 3 9 1 6 5 результат: 1 1 2 3 6 5 9 1 9 5 |
Michael_Rybak |
![]()
Сообщение
#10
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Молодец.
Цитата и потом попробуй разобраться в том, что я тебе ответил в той теме Жду вопросов ;) На всякий случай, на пальцах тот алгоритм. Переходим к аналогии сортировки слов. Что я делаю. Сначала сортирую слова по первой букве. Потом *отдельно* сортирую все слова, начинающиеся на А. Потом - на Б, на В и т.д. Как я *отдельно* сортирую все слова, начинающиеса на А? Я их сортирую по второй букве. Потом *отдельно* сортирую все слова, начинающиеся на АА, АБ, АВ и т.д. рекурсивно. |
KerK |
![]()
Сообщение
#11
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Молодец. Жду вопросов ;) На всякий случай, на пальцах тот алгоритм. Переходим к аналогии сортировки слов. Что я делаю. Сначала сортирую слова по первой букве. Потом *отдельно* сортирую все слова, начинающиеся на А. Потом - на Б, на В и т.д. Как я *отдельно* сортирую все слова, начинающиеса на А? Я их сортирую по второй букве. Потом *отдельно* сортирую все слова, начинающиеся на АА, АБ, АВ и т.д. рекурсивно.
Проблема.... бесконечная процедура получается, потому что ретурн не срабатывает if (sort_by==len+1) return...когда выполняется это условие... он не может выйти с процедуры... Может ретурн с каким-то параметром должен быть указан? Сообщение отредактировано: KerK - 19.11.2006 23:59 |
Michael_Rybak |
![]()
Сообщение
#12
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Цитата бесконечная процедура получается, потому что ретурн не срабатывает if (sort_by==len+1) В паскале нумерация была с нуля, поэтому я написал "if sort_by = len + 1 then". В си нумерация с 0, поэтому замени на "if (sort_by==len)". Кроме этого, посмотри на процедуру PrintResult. В ней ты выводишь вектора в том порядке, в котором они записаны в vv. А мы их в vv то не меняли местами, мы индексы перемещали в sorted[]. Поэтому теперь надо переделать PrintResult так, чтобы она выводила не сверху вниз, а по порядку, записанному в sorted. Давай. Вроде будет работать нормально. Не забудь еще, что у нас внутри пузырек, который надо заменить быстрой сортировкой, так что возвращайся ;) |
KerK |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
В паскале нумерация была с нуля, поэтому я написал "if sort_by = len + 1 then". В си нумерация с 0, поэтому замени на "if (sort_by==len)". Кроме этого, посмотри на процедуру PrintResult. В ней ты выводишь вектора в том порядке, в котором они записаны в vv. А мы их в vv то не меняли местами, мы индексы перемещали в sorted[]. Поэтому теперь надо переделать PrintResult так, чтобы она выводила не сверху вниз, а по порядку, записанному в sorted. Давай. Вроде будет работать нормально. Не забудь еще, что у нас внутри пузырек, который надо заменить быстрой сортировкой, так что возвращайся ;) Все заработало как надо, Принтрезульт исправил. Чем заменить пузырек? Вставкой? |
Michael_Rybak |
![]()
Сообщение
#14
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
|
KerK |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 28 Пол: Мужской Репутация: ![]() ![]() ![]() |
Лучше std::sort'ом просто. Надо объявить компаратор, и передать его третьим параметром. Сможешь? неа ))) Первый раз слышу про компаратор )) ... да и помоему лучше не использовать STL... В задаче ничего не сказано... да и препод ничего такого не давал на лекциях... |
Michael_Rybak |
![]()
Сообщение
#16
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
А помоему лучше использовать
![]() Показать как? |
Гость |
![]()
Сообщение
#17
|
Гость ![]() |
|
Michael_Rybak |
![]()
Сообщение
#18
|
Michael_Rybak ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 1 046 Пол: Мужской Реальное имя: Michael_Rybak Репутация: ![]() ![]() ![]() |
Сверху (перед функцией) объявляешь такой класс
struct CVectorComparator Это класс-компаратор. Его единственный оператор () возвращает true, когда сортируемые объекты находятся в правильном порядке (т.е. когда i меньше j в нашем понимании). В нашей ситуации сортируемые объекты - это значения массива sorted, а условие, по которому мы определяем, в правильном ли порядке расположены два таких значения, получается точно таким же, как было в пузырьке: сравнение vv[i] и vv[j] по элементу sort_by. Теперь вместо for (i=0;i<=up_bound-low_bound+1;i++) Напиши std::sort(sorted + low_bound, sorted + up_bound + 1, CVectorComparator(sort_by)); sorted - массив, и одновременно sorted - это указатель на первый элемент массива. Поэтому sorted + low_bound - указатель на начало нашего отрезка, а sorted + up_bound + 1 - на следующий за концом (правый конец в stl обычно "не включительно", поэтому добавляем единицу). Если третьим параметром ничего не передать, sort отсортирует указанный кусок массива просто по возрастанию (используя обычный оператор <). А когда мы указываем ему компаратор, он выполняет сравнения не оператором <, а оператором () этого компаратора, т.е. делает то, что нам нужно. Проверил, вроде работает. |
Гость |
![]()
Сообщение
#19
|
Гость ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 7:28 |