простая задача на списки, fp |
простая задача на списки, fp |
compiler |
25.01.2008 22:26
Сообщение
#1
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Добрый день!
Надо довести до совершенство решение задачи, тема который для меня тёмный лес: Написать программу, содержащую процедуру, которая меняет местами первый и второй элементы не пустого списка. Если элементы не найдены, то выдать на экран соответствующие сообщение. задача уже решалась на форуме, однако хотелось бы увидеть оптимальное решение, учитывая возможности FP моё решение {$mode objfpc}заранее благодарен. -------------------- Спасибо!
Удачи! |
volvo |
25.01.2008 22:52
Сообщение
#2
|
Гость |
Цитата учитывая возможности FP Можно предложить тебе список в виде Generic-объекта, чтобы ты не завязывался на определенном типе данных, а мог работать с любыми типами. Вот только надо ли оно тебе? |
compiler |
25.01.2008 23:16
Сообщение
#3
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Можно предложить тебе список в виде Generic-объекта, чтобы ты не завязывался на определенном типе данных, а мог работать с любыми типами. Вот только надо ли оно тебе? -------------------- Спасибо!
Удачи! |
volvo |
26.01.2008 2:02
Сообщение
#4
|
Гость |
В таком случае (для "разобраться") - чем не устраивает текущая реализация?
Хотя я бы ее изменил немного: {$mode objfpc} Сообщение отредактировано: volvo - 26.01.2008 13:29 |
compiler |
26.01.2008 13:13
Сообщение
#5
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
В таком случае (для "разобраться") - чем не устраивает текущая реализация? мне надо решить целый цикл таких задач и хотелось бы научится писать правильно...спасибо за твой код, но не мог бы ты добавить комментарии к init() и когда стоит передавать список через var, а когда просто так? -------------------- Спасибо!
Удачи! |
volvo |
26.01.2008 13:37
Сообщение
#6
|
Гость |
Комментарии добавлены...
А насчет Цитата когда стоит передавать список через var, а когда просто так? Если тебе надо получить из процедуры/функции измененное значение параметра - то через Var, иначе (если ты не хочешь знать, что происходит со значением параметра внутри подпрограммы, а хочешь сохранить в основной программе старое значение параметра) - без Var. Ну, это ты наверное знаешь... Я так понимаю, вопрос возник, потому что я добавил Var в процедуру Free? Просто я считаю, что если ты удаляешь что-то то логично указатель на это что-то обнулить, чтобы потом не было казусов. Ты же здесь: free(sp); удалял все содержимое списка, но вот сам указатель на начало списка у тебя не обнулялся. А что если дальше в программе тебе еще раз захочется распечатать список? Ну, вызовешь ты print(sp). В моем варианте sp = nil, процедура закончится сразу же. А в твоем? Что будет печататься? AV/SF давно не видел? |
compiler |
26.01.2008 14:00
Сообщение
#7
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Комментарии добавлены... теперь, вроде, разобрался, но как её изменить чтоб при вводе первым числом 0 не возникала дальнейшая не корректная работа при печати(run time error 216) Я так понимаю, вопрос возник, потому что я добавил Var в процедуру Free? да, спасибо.. теперь ясно...А в твоем? Что будет печататься? мусор какой-то:)Сообщение отредактировано: compiler - 26.01.2008 14:00 -------------------- Спасибо!
Удачи! |
volvo |
26.01.2008 14:05
Сообщение
#8
|
Гость |
Менять надо не ее, а функцию Ch:
// сначала проверяем, не нулевой ли p, и только если есть - обращаемся к p^.next |
compiler |
26.01.2008 15:10
Сообщение
#9
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
-------------------- Спасибо!
Удачи! |
compiler |
26.01.2008 23:31
Сообщение
#10
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
я тут ещё одну процедурку пытаюсь реализовать(меняет местами первый и пятый элемент) но то ли вечер, то ли ещё что-то, но не получается... да и текст кривой идёт...
{остальной текст программы в посте volvo...}но в результате числа после пяти теряются:( -------------------- Спасибо!
Удачи! |
volvo |
26.01.2008 23:57
Сообщение
#11
|
Гость |
compiler, давай переменным "говорящие" имена. Иначе ты сам себя путаешь. Смотри, насколько все проще:
function replace1a5(var p:data):boolean;Чертишь на листочке бумаги список, связи между элементами, и смотришь, что с чем надо поменять чтобы новый порядок элементов в списке был таким, какой тебе нужен... |
compiler |
27.01.2008 0:13
Сообщение
#12
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
compiler, давай переменным "говорящие" имена. Иначе ты сам себя путаешь. Смотри, насколько все проще... да... твой код читается как повесть:)Чертишь на листочке бумаги список, связи между элементами, и смотришь, что с чем надо поменять чтобы новый порядок элементов в списке был таким, какой тебе нужен... весь стол уже закидан черновиками(из них два листика со списками))Спасибо! -------------------- Спасибо!
Удачи! |
compiler |
29.01.2008 21:29
Сообщение
#13
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
А вот ищё одна задача....
6. Написать программу, содержащую процедуру, которая вставляет новый элемент перед каждым вхождением заданного элемента. Если элементы не найдены, то выдать на экран соответствующие сообщение. моё решение.. function pastbef(var p_b:data; const i_p, i_s:integer):boolean;но уж больно оно мне не нравится, может, можно решить лучше? -------------------- Спасибо!
Удачи! |
volvo |
29.01.2008 22:03
Сообщение
#14
|
Гость |
Цитата но уж больно оно мне не нравится Чем, можно узнать?Смотри, тут уже такое дело: сама-то по себе реализация рабочая, значит, правильная. И, вроде бы, ничего не убавить, НО... (опять это но ) У тебя же есть процедура Init, в которой повторяется бОльшая часть твоей новой функции, так? Выделяем повторяющуюся часть (добавление элемента) в отдельную функцию, и имеем: function create_item(link: data;, заодно и процедура Init сокращается в 2 раза, и дальнейшая поддержка программы/добавление функциональности упростится... То есть, если смотреть на ВСЮ программу, то можно изменить, если же речь только о новой функции - то я бы оставил как есть (ну, за исключением имен переменных, я бы назвал по-другому)... Сообщение отредактировано: volvo - 29.01.2008 23:02 |
Yevgeny |
29.01.2008 22:14
Сообщение
#15
|
The matrix has me!!! Группа: Пользователи Сообщений: 74 Пол: Мужской Реальное имя: Евгений Репутация: 0 |
Извините, а можно поинтересоваться зачем нужно в начале текста программы писать:
{$mode objfpc}??? Я так понял, это только для FreePascal'я нужно, вернее используется только в нём, и связано как то с объектами, да? -------------------- "Брать производную можно научить даже обезьяну" - мой препод по матану! :-)
|
compiler |
29.01.2008 22:19
Сообщение
#16
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
Чем, можно узнать? ну, за исключением имен переменных, я бы назвал по-другому а можно поинтересоваться, как бы назвал их ты?зы прокомментируй, пожалуйста, последнии две строчки в create_item.. 2Yevgeny в _этом_ коде практически нет разнице какой режим использовать. Просто я использую этот режим, volvo, насколько я знаю, предпочитает mode Delphi. А по умолчанию, используется отдельный диалект паскаля, где нельзя использовать result(!), надо обращаться по имени функции.. Сообщение отредактировано: compiler - 29.01.2008 22:32 -------------------- Спасибо!
Удачи! |
volvo |
29.01.2008 23:06
Сообщение
#17
|
Гость |
Цитата А по умолчанию, используется отдельный диалект паскаля Это с чего вдруг? По умолчанию как раз используется {$mode objfpc}, посмотри в файле fp.cfg, который лежит в папке \bin (я его не использую, у меня CFG-файл хранится в рабочей папке, так что в \bin хранятся именно установки по умолчанию), там есть ключ -Mfpc...P.S. Комментарии добавлены... |
compiler |
29.01.2008 23:30
Сообщение
#18
|
Человек Группа: Пользователи Сообщений: 1 050 Пол: Мужской Реальное имя: Станислав Репутация: 3 |
...там есть ключ -Mfpc... хм.. действительно есть... но если я компилирую через консоль(без каких либо ключей) то получаю диалект(и в настройках IDE, как стоял диалект, так и стоит..) почему все так...P.S. Комментарии добавлены... спасибо, как я сразу не понял...upd по умолчанию используется все таки диалект выдержка из результатов $fpc Код -M<x> set language mode to <x> -Mfpc free pascal dialect (default) -Mobjfpc switch some Delphi 2 extensions on -Mdelphi tries to be Delphi compatible -Mtp tries to be TP/BP 7.0 compatible Сообщение отредактировано: compiler - 30.01.2008 22:46 -------------------- Спасибо!
Удачи! |
Текстовая версия | 27.04.2024 18:06 |