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

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

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

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


Новичок
*

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

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


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

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


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


a.k.a. volvo877
*****

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

Репутация: -  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

 



- Текстовая версия 21.07.2025 20:59
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"