IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> динам. списки. Стандартные операции, Неккоректная процедура удаления эл-та.
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


идея задачи в том: что бы произвести со списком различные действия. Проблема в удалении элемента списка по имени. Пробовал различные условия и составление процедуры/ процедур, но что бы полноценно из любого места удалял эл-т не выходит. Как пр: "если ввожу 3 эл-та и удаляю последний - все хорошо. но если следом удаляю 2 то он впринцепи прогоняет и выводит ответ: но вмете с тем и вылетает." . Косяк, я предполагаю, в неккоректных условиях, т.е. выходит за пределы списка.
опишите подробней пожалуйста мои ошибки.

P.S.
остальные условия работают хорошо, но если заметите недочеты , укажите их, пожалуйста.


Прикрепленные файлы
Прикрепленный файл  _______________________.rar ( 33.18 килобайт ) Кол-во скачиваний: 228
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
если я хочу попросить "что лежит под 3 номером, и он вывести должен имя и телефон данного служащего" .
А с какой, собственно, стати ты должен об этом спрашивать? Что такое "3 номер" вообще? Список - это не массив, в него ведь информация может добавляться произвольно, в любое место. То что сейчас было №3 через секунду может стать уже №4, а в третьем элементе может оказаться то, что раньше было во втором, или чего раньше вообще не было (я уж не говорю о сортировке, которая так перекроит тебе всю нумерацию, что ты потом будешь месяц разбираться, что где, если еще и поле "порядковый номер" сделаешь). Нельзя делать доступ к элементам списка по порядковому номеру. Только по ключу (уникальному ключевому полю). А ключ у тебя - это фамилия. Вот и делай поиск по фамилии. Никакого счетчика.

Цитата
указатель на элемент списка?
Да. Я имел в виду вот это:
function search(const L : PPerson; s : Tname) : PPerson; // Возвращается что? Указатель...
var p : PPerson;
begin
s := LowerCase(s); // переводим введенное имя в нижний регистр
s := AnsiLowerCase(s);

search := nil; // на случай, если ничего не найдется...
p := L;
while p^.mNext <> nil do
begin
if p^.mNext^.mName = s then
begin
search := p; exit;
end
else p := p^.mNext;
end;
end;
, а теперь, вместо того, чтобы "растворять" поиск в программе и размазывать его по нескольким местам, просто...

1) delete_person:
   case n of
1:
begin
writeln('введите имя');
readln(dName);
p := search (L, dName); // <--- !!!
if Assigned (p) then
begin
Q := p^.mNext;
p^.mNext := Q^.mNext;
dispose(Q);
writeln;
writeln('информация о ',dName ,' удалена');
end
else
begin
writeln ('данный служащий не найден в списке');
delete_person(L); // Вот этого бы я не делал. Рекурсии здесь на фиг не надо.
end;
end;


2) found_phone
   writeln('напишите имя нужного вам человека');
readln(fName);
p := search (L, fName);
if Assigned (p) then
begin
// действия при нахождении фамилии в списке
end
else // действия, когда фамилия не найдена

Структура программы упростится.

Хотя, ты делаешь ошибку многих. Я устал говорить об этом: не перемешивай интерфейс и логику программы. Функция delete_person - это функция, которая должна получить на вход список, где будет производиться поиск, и фамилию искомого клиента. И вернуть результат: True, если данные из списка удалены, и False - если произошло что-то внештатное (именно поэтому я обычно возвращаю Integer. Если 0 - то все нормально, другое значение сигнализирует о том, какая именно ошибка произошла). Все остальное, вся вот эта беседа с пользователем, здесь - явно лишнее. Она должна происходить в другом месте программы, перед вызовом delete_person пользователя надо попросить, чтоб он ввел фамилию для удаления, чтоб ввел номер действия (я бы это делал в модуле Interface_1, у него ж и название правильное, это ИМЕННО интерфейс с пользователем, вот тут:

  case n of
1: begin
writeln; // <--- Вот именно тут должна вводиться фамилия для удаления
delete_person(a);
// А тут - должен обрабатываться результат.
// Сама delete_person НИЧЕГО не должна печатать и запрашивать у пользователя
end;

), а не там, где происходит собственно удаление.

То же самое относится и к сортировке: какое отношение имеет
writeln ('воздух сортировать что ли ?')
к сортировке списка? bubble_sort получила несортированный список, после ее выполнения список стал упорядоченным. Всё! Никакой самодеятельности больше. Все остальное к логике не относится. Это - интерфейс пользователя. Хочется похохмить - верни из bubble_sort единицу при пустом списке и 2-ку при списке, состоящем из одного элемента, и сделай:

case bubble_sort(L) of
1 : writeln ('воздух сортировать что ли ?');
2 : writeln ('не будем мусолить одного служащего');
end;
там же, в Interface_1.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 14.09.2025 19:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name