![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
neic |
![]()
Сообщение
#1
|
Студент 3-к группы (ИГТК) ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Народ подскажите процедуру поворота списка, а то я скоро уже с ума сойду.
Например вводим с клавиатуры (признаком окончания ввода является цифра 0): 1 2 3 4 5 ... 0 Нужно получить: 0 ... 5 4 3 2 1 Заранее благодарен! -------------------- Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
|
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
А вот тут, кстати, функция init как раз и создает сразу "перевернутый" список: список
|
neic |
![]()
Сообщение
#3
|
Студент 3-к группы (ИГТК) ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Так там меняются местами первый и второй элемент, а мне нужно неограниченное число повернуть... или я что не догнал... просто голова уже не соображает
![]() Список создаётся в момент ввода чисел с клавиатуры, а уже полученный список перевернуть. Плюс ругается на строчку (в примере который ты дал): r^.Next:=init; Ошибка 88 говорит что не хватает какой-то скобки. Добавлено через 8 мин. Вот я тут на калякал. Ссылается на procedure ps и говорит что куча переполнена, что я не так сделал? uses crt; Сообщение отредактировано: neic - 30.11.2007 22:04 -------------------- Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата Список создаётся в момент ввода чисел с клавиатуры Ну, и КАКОЙ список создается, ты не обратил внимания? Ввожу я "1 2 3 4 0", что мне print() напечатает? Чтоб печаталось ТО ЖЕ САМОЕ, что вводишь, надо по-другому организовывать заполнение списка:uses crt;Теперь ясно? |
neic |
![]()
Сообщение
#5
|
Студент 3-к группы (ИГТК) ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Единственное что я не понял, что такое tail и заче он нужен?
Сообщение отредактировано: neic - 3.12.2007 11:51 -------------------- Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата что такое tail и заче он нужен? Tail - это "хвост" списка. А нужен он как раз для того, чтобы новый элемент добавлялся к "хвосту" - следовательно, в конец списка; тогда элементы будут располагаться в списке точно в том же порядку, в котором они вводились пользователем, а не в инверсном. |
neic |
![]()
Сообщение
#7
|
Студент 3-к группы (ИГТК) ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
ОК. Понял. Спасибо за помощь. Ставлю +.
-------------------- Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
|
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата Ставлю + ![]() |
neic |
![]()
Сообщение
#9
|
Студент 3-к группы (ИГТК) ![]() Группа: Пользователи Сообщений: 32 Пол: Мужской Реальное имя: Артём Репутация: ![]() ![]() ![]() |
Ещё один вопрос. А как работает процедура: reverse?
-------------------- Жизнь - это лестница. Когда одна ступень проваливается, 2-ая нога находиться на второй ступеньке, а значит есть и второй шанс... ©
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Рекурсивная процедура - сначала "разбирает" список, последовательно проходя по нему, соответственно в стеке будут храниться указатели на все элементы списка. А потом, когда список закончится, начнется "раскручивание" рекурсивных вызовов, при этом те значения, которые были ближе к концу списка, будут фигурировать как параметр P раньше, чем те, которые были в начале списка. Собираем изо всех значений, на которые указывают параметры P, новый список, и он выходит перевернутым относительно исходного.
Вот тебе простейший пример, чтоб было понятно, как это работает... Допустим, исходный список = <1, 2> Вызываем Reverse(<1, 2>), P указывает на (1). Проверяем условие: параметр - нулевой указатель? Нет, вызываем Reverse(<2>), P указывает на 2... Опять проверка условия - и опять P - не nil, вызываем Reverse(<>), P - нулевой указатель, потому как 2 - это последний элемент списка. Вот теперь после проверки условия (оно не выполнено) - выходим из рекурсии по Exit... Но вышли-то мы только из последнего рекурсивного вызова, а в стеке висят еще два предыдущих уровня рекурсии... После выхода из последнего уровня возвращаемся в тот уровень (причем возвращаемся уже в точку ПОСЛЕ проверки условия, именно на строку с Vkln), где P указывал на 2... Кстати, почему указывал? Он же и сейчас все еще указывает, добавляем эту двойку в новый список. Он теперь равен <2>... Выполнили этот уровень - выходим еще на один выше: тот, с которого начали, но ведь там P указывает на единицу... Добавили единицу - <2, 1>... А вот теперь окончательно выходим из рекурсии и возвращаемся в вызывающую программу... Что получилось в результате? Был список <1, 2> стал - <2, 1>... Перевернули, правда? Я понимаю, что если ты никогда не имел дела с рекурсией, то выглядит то, что я написал сейчас просто устрашающе... Нужно пройтись по процедуре Reverse в пошаговом режиме, и посмотреть на окна Call Stack и Watches - тогда поймешь, что там творится... Как пользоваться отладчиком - можешь посмотреть здесь: Отладка программ , я там написал самое основное... |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 18:33 |